OmniAICreator/Qiita-1.07M huggingface dataset:
Crowi-plusのユーザページに表示されるメールアドレスを消す

最近[Crowi-plus](https://github.com/weseek/crowi-plus)を導入しました。
都合によりユーザーページにメールアドレスを表示したくないときの方法。

![スクリーンショット 2017-07-24 13.42.05.jpg](https://qiita-image-store.s3.amazonaws.com/0/95987/e4ea6384-e9e6-4f8d-2289-41a8e2fe2fa2.jpeg)

## カスタムCSSでメールアドレスの要素を消す
対処法は簡単で，「管理画面」→「カスタマイズ」→「カスタムCSS」に以下のCSSを入力します。
CSSの要素を表示しないように上書きしただけです。これでユーザーページにメールアドレスが表示されなくなります。表示されないだけでソースには残ってます。

```css
.user-page-email{
  display:none;
}
```
Cognos AnalyticsでDISK容量見積もりに注意が必要な新機能

##概要
Cognos Analyticsになって、セルフサービスBIの機能が新機能として使用可能になっていますが、これらの機能をエンドユーザーが自由に使用する事になった場合に、どこかにデータがどんどんたまって、大量にディスク容量を使用する事が無いのだろうか、というのを、Cognos Analyticsの設計を行う際に心配だったので、自分で検証してみました。

新機能とは、具体的には、以下の2つの機能になります。

**ファイルのアップロード**
ExcelやCSVファイルなどを、エンドユーザーがCognos Analyticsに自由にUploadして、ダッシュボードなどに使用する機能です。
アップロードしたファイルは、どこに保管されるのでしょうか？
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/fba16b22-72f0-8442-b86b-55edf1568333.png)

**データ・セットの作成機能**
Framework Managerで作成したパッケージの中から、パッケージの一部分をデータごと保管しておいて、ダッシュボードなどに使用する機能です。
こちらもどこに保管されるのでしょう？
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/aa2affb3-9c53-70bf-0fb4-4a3a9ec8f882.png)

ちなみに、新機能には以下のような機能もありますが、今回検証してみた結果、これらの機能は特に目立ったDISK容量の使用は見られなかったので、結果からは割愛します。

**データ・サーバーの機能**
FMパッケージを通さなくても、エンドユーザーが直接データベース上のテーブルのデータにアクセスできます。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/efb5ca49-b00d-46fe-9cfc-db3a79ccdce8.png)

**データ・モジュールの機能**
エンドユーザーが、簡単なデータモデリングを行える機能です。
Framework Managerを非常に簡易化して、ブラウザで動くようにしたイメージです。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3c9fb6b7-912d-5bce-09c2-3bdc48def7c1.png)


##結果
Cognos Analytics 11.0.6での検証結果です。データソースやContent Storeは、DB2 10.5です。
データは以下のようなイメージのデータを自作し、検証に使用しました。
下は100万件で30MB程度の容量で、ExcelファイルやDB2テーブルに挿入して検証しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/2d87e7cd-9429-e502-888b-bda4897008b0.png)

**ファイルのアップロードの検証結果**
・100万件(30MB)アップロード

自分の環境では、アップロードに45秒程度でした。
この間の30秒間くらい、2コアのCPUで50%～100%使用しました。

ファイルシステム増加は、
/opt/ibm/cognos/analytics/temp/cm配下に、約6MBのCM_\*.tmpファイルが生成されました。
/opt/ibm/cognos/analytics/data/datafiles/datasetCache/の下のディレクトリに、約6MBの\*.dataファイルが生成されました。

ContentStore表スペース増加は、約8MB増加しました。

・300万件(96MB)アップロード
アップロード時間は、70秒程度でした。
リニアに増加するわけでは無いようです。

ファイルシステム増加は、
/opt/ibm/cognos/analytics/temp/cm配下に、約13MBのCM_\*.tmpファイルが生成されました。
/opt/ibm/cognos/analytics/data/datafiles/datasetCache/の下のディレクトリに、約19MBの\*.dataファイルが生成されました。

Content Store表スペース増加は、約40MB増加しました。

・300万件ファイルを、上書きでアップロードした場合
アップロード時間は、100秒程度。
/opt/ibm/cognos/analytics/data/datafiles/datasetCache/の下のディレクトリに、約19MBの\*.dataファイルが更新アップロードのたびに生成されました。

Content Store表スペースは、増加しませんでした。


・結論
/opt/ibm/cognos/analytics/temp/と/opt/ibm/cognos/analytics/data/のファイルシステムの容量見積もりは注意です。
特に、/opt/ibm/cognos/analytics/data/は、更新アップロードでの上書きでも増加の一途を辿るので、日々の最新データをアップロードするような環境では、非常に見積もりに注意する必要があります。
Content Storeの容量も大きく増加しますが、圧縮はされているようで、96MBデータが40MB表スペース領域に収まりました。

データのアップロード機能が要件にある場合は、是非見積もり時に参考にして見て下さい。


**データ・セットの作成機能**

・1000万件(300MB)のデータ・セットを作成した場合
100万件の検証では動きが良くわからなかったので、1000万件で検証しました。

データ・セットの作成を行うと、10秒程度で完了メッセージが返ってきますが、実際にCognosサーバーの動きを見ていると、バックグラウンドでその後10分くらいかけてデータ・セットを生成している動作になりました。
10分間の間、CPUが1コア独占されました。

ファイルシステム増加に関しては、非常に特徴的な動きになり、
tempやdataフォルダにはほとんど変化無しでしたが、完了メッセージが返った時点でDBパス配下が1.2GB増加し、それから10分程度かけて徐々に低下し、最終的に128MBの増加まで低減しました。

ContentStore表スペース増加は、128MB増加なので、300MBデータが最終的にはここに収まったようですが、一時的にDBパスを大量に使用するようで、300MBの処理に1.2GBの領域を必要としました。

・結論
作成されるデータセットが保管されるContent Storeの表スペース領域だけでなく、作成処理中に使用される一時的な容量を、最大データセット容量から少なくとも4倍以上を確保しておいた方が良さそうです。


検証してみると、色々と発見しますね。
Cognos Analyticsで、これらのセルフサービス系の新機能を使用する時には、是非参考にして、DISK容量の見積もりを慎重に行って頂ければと思います。
VBAが遅くなる想定外な理由

# 概要

新しい部署でのプログラム経験者という事で、ちょっとしたデータをゴニョゴニョするためのマクロを作ることを命じられました。
これ見よがしに１日で完成させてマニュアルまで別シートに丁寧に準備したところ、何故かoffsetとかrangeでvalueやtextを設定するロジックが片っ端から遅くなりました。

原因は、VBAとは全く関係ないと思っていたマニュアルのシートにありました、、、

# 環境

## PC

Windows 7 64bit
Microsoft Office Home and Business 2013
(Excel)

## サンプルエクセル

例えば下記のような「マニュアル」と「ツール」の２つのシートを持つエクセルファイル
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/7f462912-ff15-5094-6a29-6cfd105d28b0.png)

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/046483d8-a69a-5ddd-2d4c-e0c3c5590f30.png)


# 原因

リンクでの図の貼り付けが、offsetやvalue等のcellの操作系関数の実行速度に影響がでます！

## サンプルエクセル

シート「ツール」のB2:O7のセルをコピーして、別シート「マニュアル」に「リンク貼り付け」を行うと、今回のようなことになります。

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/b107548c-bdc8-03d1-9f3d-5eb82d82cbea.png)

![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/d053ea7e-99af-b459-a079-c9bd34dbbbc2.png)

## 対策

リンクが駄目です。
下記のようなVBAならではの更新停止も効きません。

```vbnet
Application.ScreenUpdating = False
```

図での貼付けにするか、マニュアルは別シートにして下さい！
how to get traits of lambda on c++

# would get return, arguments types from lambda.
ok, look at the following code.<3
### code
```cpp:lambda_traits.hpp
#pragma once
#include <tuple>
#include <type_traits>

namespace stx
{

    namespace lambda_detail
    {
        template<class Ret, class Cls, class IsMutable, class... Args>
        struct types
        {
            using is_mutable = IsMutable;

            enum { arity = sizeof...(Args) };

            using return_type = Ret;

            template<size_t i>
            struct arg
            {
                typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
            };
        };
    }

    template<class Ld>
    struct lambda_type
        : lambda_type<decltype(&Ld::operator())>
    {};

    template<class Ret, class Cls, class... Args>
    struct lambda_type<Ret(Cls::*)(Args...)>
        : lambda_detail::types<Ret,Cls,std::true_type,Args...>
    {};

    template<class Ret, class Cls, class... Args>
    struct lambda_type<Ret(Cls::*)(Args...) const>
        : lambda_detail::types<Ret,Cls,std::false_type,Args...>
    {};

};
```

```cpp:main.cpp
#include <iostream>
#include <typeinfo>
#include "lambda_traits"

int main(void){
    std::cout << "[is mutable lambda]" << std::endl;
    {
        auto test = [](int a) mutable->long{return static_cast<long>(a); };
        std::cout << "ret type : " << std::is_same<stx::lambda_type<decltype(test)>::return_type,long>::value << std::endl;
        std::cout << "arg size : " << stx::lambda_type<decltype(test)>::arity << std::endl;
        std::cout << "arg 0 type : " << std::is_same<stx::lambda_type<decltype(test)>::arg<0>::type,int>::value << std::endl;
        std::cout << "is mutable : " << std::is_same<stx::lambda_type<decltype(test)>::is_mutable,std::true_type>::value << std::endl;
    }
    std::cout << "[is normal lambda]" << std::endl;
    {
        auto test = [](int a, int b)->long{return static_cast<long>(a); };
        std::cout << "ret type : " << std::is_same<stx::lambda_type<decltype(test)>::return_type,long>::value << std::endl;
        std::cout << "arg size : " << stx::lambda_type<decltype(test)>::arity << std::endl;
        std::cout << "arg 0 type : " << std::is_same<stx::lambda_type<decltype(test)>::arg<0>::type,int>::value << std::endl;
        std::cout << "is mutable : " << std::is_same<stx::lambda_type<decltype(test)>::is_mutable,std::true_type>::value << std::endl;
    }
}
```

```text:output
[is mutable lambda]
ret type : 1
arg size : 1
arg 0 type : 1
is mutable : 1
[is normal lambda]
ret type : 1
arg size : 2
arg 0 type : 1
is mutable : 0
```
### test
[paiza.io](https://paiza.io/projects/yOebQ02IYbL5ziuJvkQD-A)
### gist
* [how to get lambda return type](https://gist.github.com/Angeart/ae347c4bdd5ed8b02385c411a723f9d0#file-lamda_traits-hpp)
Node.jsの標準モジュール(https)でAPIを叩く(GETのみ)

Node.jsを始めたばかりでAPIの叩き方が分からなかったのでメモ。
一般的にはrequestモジュールを使用するようですが、モジュール無しでサクッと書きたいことがあったので。

APIを叩くテストとして「[RANDOM USER GENERATOR](https://randomuser.me)」を使用。
（このサービスはアプリケーションのテスト用に、適当なダミーユーザを作成するものらしいです。）

#基本型
以下のようにhttps.requestの引数に直接URIを渡すと、自動的にhttpメソッドは'GET'になる。responseデータはres.onイベントで受け取る。最後にreq.end()を呼ばないと動かないので注意。

```js
const https = require('https');
const req = https.request('URI', (res) => {
    res.on('data', (chunk) => {

    ...

    });

    ....

})
req.end();
```
##実装例
URI: https://randomuser.me/api/?inc=gender,name,nat&format=PrettyJSON
httpメソッド: 'GET'
query: inc=gender,name,nat&format=PrettyJSON

```js:https_request.js
const https = require('https');

const req = https.request('https://randomuser.me/api/?inc=gender,name,nat&format=PrettyJSON', (res) => {
    res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
        console.log('No more data in response.');
    });
})

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

req.end();
```

##結果
queryで指定した「gender」、「name」、「nat」プロパティだけを取得出来ている。

```
BODY: {
  "results": [
    {
      "gender": "female",
      "name": {
        "title": "miss",
        "first": "shivanie",
        "last": "van kekem"
      },
      "nat": "NL"
    }
  ],
  "info": {
    "seed": "cdac8f9044c4fe04",
    "results": 1,
    "page": 1,
    "version": "1.1"
  }
}
No more data in response.
```
#Optionsを使って書く
先程のようにURIを直接指定するのではなく、optionsに各要素を書くことも出来る。queryはpathに書く。
optionsの書き方は公式リファレンスに書いてある。(httpモジュールのリファレンスですが、多分httpsでもだいたい同じだと思う。。。）
https://nodejs.org/api/http.html#http_http_request_options_callback

```js
const https = require('https');

const options = {
  protocol: 'PROTOCOL',
  host: 'HOST',
  path: 'PATH'+'QUERY',
  method: 'METHOD',
  headers: {
    'Content-Type': 'CONTENT-TYPE'
  }
};

const req = https.request(options, (res) => {
    res.on('data', (chunk) => {

    ...

    });

    ....

})
req.end();
```

##実装例
URI: https://randomuser.me/api/?inc=gender,name,nat&format=PrettyJSON
httpメソッド: 'GET'
query: inc=gender,name,nat&format=PrettyJSON

```js:https_request.js
const https = require('https');

const options = {
  protocol: 'https:',
  host: 'www.randomuser.me',
  path: '/api'+'?inc=gender,name,nat&format=PrettyJSON',
  method: 'GET',
};

const req = https.request(options, (res) => {
    res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
        console.log('No more data in response.');
    });
})

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

req.end();
```
##結果

```
BODY: {
  "results": [
    {
      "gender": "female",
      "name": {
        "title": "ms",
        "first": "patricia",
        "last": "evans"
      },
      "nat": "GB"
    }
  ],
  "info": {
    "seed": "795d48206f63ba29",
    "results": 1,
    "page": 1,
    "version": "1.1"
  }
}
No more data in response.
```
Debian 9(stretch)へのアップグレードとCUDA周りの注意点

# 概要

自分はこれまでDebian 8(jessie)に非パッケージのCUDAインストーラでCUDA環境を作っていたのですが、9にアップグレードするにあたりいくつかハマりポイントがあったので、どんな問題が起きたかのかとその解決について示します。

## CUDAとDebianの関係

基本的にCUDAは特定のLinux distro向けパッケージしか提供していません。Ubuntuは対応していますが、Debianは未対応です。
そのため自分はjessieの頃に"cuda_8.0.61_375.26_linux-run"というインストーラを使っていたのですが、このスクリプトは実行環境がstretchになるとパッケージの利用を促して、起動してくれません。

Debian NVIDIA Maintainersがnon-freeセクションでCUDAのパッケージ化を行っているので、そちらを使えというのがstretchからの作法となったようです。

## CUDAのアンインストール

基本的にはnvidia関連のパッケージをインストールする時にnvidia-uninstallを実行してくれるのですが、私が試した時はスクリプトが無反応になってしまい、強制終了させてアンインストールが不十分な状況になってしまいました。
パッケージのスクリプトでは、非インタラクティブモードでuninstallスクリプトを実行するので、それが良くなかったのかもしれません。このような失敗をしないために、事前に手動でスクリプトを起動し、CUDAを削除するほうが良いと思われます。

## アンインストールが不十分だと何が起きるか

非パッケージインストーラでCUDAをインストールすると、/usr/lib/x86_64以下に各種ファイルが直接配置されます。
一方で、Debian non-freeパッケージの方ではファイルの実体を/usr/lib/x86_64/nvidia/currentに置きつつ、必要なシンボリックリンクをupdate-alternative経由で作成します。非パッケージインストーラにより配置されたファイルがあるとシンボリックリンクリンクの作成をあきらめてしまうので、各種パッケージが参照するファイルは非パッケージインストーラによる古いバージョンのライブラリになってしまいます。

しかしながらデバイスドライバはdkms経由で最新のものが入るため、結果としてユーザーランドアプリケーションとデバイスドライバとのバージョンの不整合が発生します。この状態で何かしらのCUDAを利用するコマンドを実行すると、dmesgで以下のような出力がなされます。

```
[ 4037.658285] NVRM: API mismatch: the client has the version 375.26, but
[ 4037.658285] NVRM: this kernel module has the version 375.66.  Please
[ 4037.658285] NVRM: make sure that this kernel module and all NVIDIA driver
```

dmesgの出力はまだわかりやすいのですが、直接コンソールなどに出力されるわけではありません。この状態でcupyを使うプログラムを起動するとのようなエラーになってしまいます。

```
cupy.cuda.cudnn.CuDNNError: CUDNN_STATUS_EXECUTION_FAILED: CUDNN_STATUS_EXECUTION_FAILED
```

内部的にはCUDAのユーザーランドとドライバのバージョンミスマッチを返すエラーコードが出ているのですが、cupyは成功以外の値についてチェックをしていないので、このようなエラーしか得られません。
CUDA付属のサンプル"deviceQuery"を実行するともう少し詳細なメッセージが得られるので、そちらを試す方がよりわかりやすいと思われます。

## どう対処したか

自分はfindで"nvidia" "cuda"を含むファイル名を/usr/lib以下からひたすらチェックし、パッケージに所属していないものすべてを消してからnvidia-driver, nvidia-cuda-toolkitをインストールすることで解決しました。

こんなハマり方をする人はそう多くはないでしょうが、cupyでCUDA周りのエラーが出る時ケースの一つとして「ライブラリとデバイスドライバのバージョン不整合」があるということをここに残しておきます。

## 参考

* [NvidiaGraphicsDrivers - Debian Wiki](https://wiki.debian.org/NvidiaGraphicsDrivers)
Paper > CUDA > CELES: CUDA-accelerated simulation of electromagnetic scattering by large ensembles of spheres by Egel, A. et al. 2017

[CELES: CUDA-accelerated simulation of electromagnetic scattering by large ensembles of spheres](http://www.sciencedirect.com/science/article/pii/S0022407317301772)
Egel, A., Pattelli, L., Mazzamuto, G., Wiersma, D.S., Lemmer, U.
Journal of Quantitative Spectroscopy & Radiative Transfer
volume 199, issue , year 2017, pp. 103 - 110 

自分の2009年の共著論文が引用されているという連絡を受けて見たところ、CUDAで計算速度を改善している論文だった。
購入した(35ドル)。

> Hihglights
• A new, freely available MATLAB software for light scattering by large ensembles of spheres is introduced.
• It uses block-diagonal preconditioning, a lookup-table approach for the evaluation of costly functions and parallel execution on the GPU via NVIDIA’s CUDA platform.
• The validity of the results is demonstrated by comparison to established software.
• The convergence behavior for scattering by large aggregates is discussed.
• An accurate simulation of scattering by 100,000 wavelength-scale spheres is demonstrated.

**block-diagonal preconditioning**は気になるキーワード。

凝集体の構成粒子が波長サイズと小さく?はあるが、10万粒子数というのはすごい。
DDAと違い、厳密的な解法でこの数は多い。

## コード

https://github.com/disordered-photonics/celes

(2018/06/16追加)
https://disordered-photonics.github.io/celes/

## 内容

3つの手法でspeedupを図っている。

- a block-diagonal preconditioner
- a lookup table for the spherical Hankel function
- GPU acceleration

### iterative solution

以下の2通りが使用可能

- BiCGSTAB (biconjugate gradient stabilized method)
- GMRES (the generalized minimal residual method)

### a block-diagonal preconditioner

凝集体の場合、相互作用が強いのは近傍粒子によるものと仮定している。この仮定のもと、凝集体をsubgroupに分割してsubgroupの光散乱を厳密に解く。
それらsubgroupの結果をまとめて、最終結果を得る。

### a lookup table for the spherical Hankel function

spherical Hankel functionはradial distance coordinate dにのみ依存する。そのため、前計算をしてtableに保持しておく。
spatial resolution delta rのlookup tableに格納する。

### GPU acceleration

GPUの計算の詳細は読み切れていない。

以下が関係しそうか (ネストが深い)。
https://github.com/disordered-photonics/celes/blob/master/sources/scattering/coupling_matrix_multiply_CUDA.cu

Maxwell NVIDIA GTX Titan X (3072 CUDA cores)での計算をした。
別途、Maxwell GeForce GTX 980 Ti (2816 CUDA cores)でも似たような計算になったとのこと。

### 結果

Fig.4においてvolume fraction 10%でのblock-diagonal preconditioner使用が最も少ないiteration数で収束している。

GPU使用(CELES)と12スレッド使用(MSTMコード使用)との比較もしていて、だいたい2倍の速度になっている。

劇的に速くなったというイメージではない。

(私見) CUDAの場合、単純な計算を並列で処理することで高速化を図るという概念をYoutubeの動画で見たことがある。上記のGPU使用では、少し高機能な計算を割り当ててしまっているのか、思ったよりも速度の改善は良くない。
ExoPlayerのタイムライン・ウィンドウ・ピリオドを理解する

※[Timelineクラスのドキュメント](https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Timeline.html)の和訳です。

タイムラインとは、現在再生可能なメディアを表します。
タイムラインインスタンスは不変です。メディアが動的に変わる場合(ライブストリームなど)はタイムラインは現在利用可能なメディアのスナップショットを提供します。

タイムラインは`Timeline.Periods`(ピリオド)と`Timeline.Windows`(ウィンドウ)で構成されます。ピリオドは単一の論理的なメディアの断片を表します。たとえばメディアファイルなど。ウィンドウは一つか複数のピリオドにまたがり、シークが可能か等の追加の情報と共にピリオドの中の現在再生可能な領域を定義します。それぞれのウィンドウはデフォルト位置を定義します。これはプレイヤーがウィンドウの再生を開始する時の位置です。次に様々なユースケースのタイムラインを図示します。

## 単一のメディアファイルかオンデマンドストリーム

![単一のメディアファイルの例](https://qiita-image-store.s3.amazonaws.com/0/56668/34d6fc19-edba-2fb3-3d16-cb2c2ed94053.png)

単一のメディアファイルかオンデマンドストリームのタイムラインは、単一のピリオドと単一のウィンドウで構成されます。ウィンドウはピリオド全体にまたがっていて、メディアの全ての部分が再生可能です。ウィンドウのデフォルト位置は通常ピリオドの先頭です(上図の黒い点)。


## 複数ファイルのプレイリストかオンデマンドストリーム

![複数ファイルのプレイリストのタイムラインの例](https://qiita-image-store.s3.amazonaws.com/0/56668/c5eb35e5-363c-74e4-6453-a5b718da4893.png)

複数のメディアファイルかオンデマンドストリームのプレイリストのタイムラインは、複数のピリオドで構成されていて、それぞれがウィンドウを持っています。それぞれのウィンドウは対応するピリオド全体にまたがっていて、通常はピリオドの先頭にデフォルト位置を持っています。ピリオドとウィンドウのプロパティ(それぞれの長さやシーク可能かどうか等)はしばしば対応するファイルかストリームをバッファリングし始める時に知ることができるようになります。


## 限定的に利用可能なライブストリーム

![限定的に利用可能なライブストリームの例](https://qiita-image-store.s3.amazonaws.com/0/56668/c6ff8ecb-dc4e-5d92-7776-78665de9f065.png)

ライブストリームのタイムラインは長さが不明のピリオドで構成されます。コンテンツが配信されるほど長くなっていきます。コンテンツが限定的な時間だけ利用可能である場合は、ウィンドウは0でない位置から始まり、まだ再生可能である領域を定義します。ウィンドウがライブストリームである場合、`Timeline.Window.isDynamic`はtrueになります。デフォルト位置は通常ライブエッジの近くになります(上図の黒い点)。


## 無限に利用可能なライブストリーム

![無限に利用可能なライブストリームの例](https://qiita-image-store.s3.amazonaws.com/0/56668/8f2a8acf-cd1b-ed74-e4ce-01e64b1408a1.png)

無限に利用可能なライブストリームのタイムラインは、限定的に利用可能なライブストリームの場合と似ています。ウィンドウがピリオドの最初から始まっていて、全ての過去の配信コンテンツが再生可能であることだけが異なります。


## 複数ピリオドのライブストリーム

![複数ピリオドのライブストリームの例](https://qiita-image-store.s3.amazonaws.com/0/56668/228ae2bc-562b-1bdd-e8ef-63760d35b550.png)

この場合はライブストリームが明示的に複数のピリオドに分かれている場合に発生します。たとえばコンテンツと広告など。限定的に利用可能なライブストリームの場合と似ていますが、ウィンドウが複数のピリオドにまたがる場合があるというところだけが異なります。無限に利用可能なライブストリームの場合でも複数のピリオドにすることが可能です。


## オンデマンドのプリロールに続くライブストリーム

![オンデマンドのプリロールに続くライブストリームの例](https://qiita-image-store.s3.amazonaws.com/0/56668/58447b47-66ca-2c53-6493-ff8b76d1301f.png)

これは単一メディアファイルかオンデマンドストリームと複数ピリオドのライブストリームを結合した場合です。プリロールの再生が終わった後、ライブストリームの再生がライブエッジ付近のデフォルト位置から開始します。
SmartGit > 検索 > 変更内容での検索 > File Content (very expensive)

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

[git > キーワードを含む変更を探す > $ git log -S "searching_string"](http://qiita.com/7of9/items/1eac3112f6baa7ad64f5)
をSmartGitのGUIで行うにはどうするのか。

Filterの項目に`File Content (very expensive)`があるので、これを有効にすればよいようだ。

![2017-07-24_12h01_06.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1df7f242-8423-90e4-e9ae-0f26deb72a39.png)

過去のコミットを探してみたところ、変数名のrenameをしたのだが、コメント自体が更新されずに迷子になっていたということだった。
git > キーワードを含む変更を探す > $ git log -S "searching_string"

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

あるキーワードのコメントがある。
そのキーワードで検索しても他のソースに見つからない。

どういう変更でこういう風になったのか。

キーワードを含む変更を探す方法を探してみた。
https://stackoverflow.com/questions/1337320/how-to-grep-git-commit-diffs-or-contents-for-a-certain-word

```
$ git log --patch | less +/searching_string
```

上記の方法で関連キーワードが追加されたログの変更詳細情報に移動できた。
一方で、その変更があったコミットの番号がすぐに見つからない。

```
$ git log -S "searching_string"
```

こちらの場合、コミットの番号やDateが見つかった。
tbl_df を使ってラップしたdata.frameをbnlearnに食わすとエラー

# bnlearnでのエラー

bnlearnを使っていて、妙なエラーが出ました。

```R
"... variable hoge must have at least two levels.”
```

bnlearnの構造学習を行う関数に入れる際にすべてのフィーチャーをfactor化する必要があったのですが、前後の処理をいろいろ変えていくうちに、このエラーが出始めました。

factor化は以下のように一括でやっています。

```R
dataset[] <- lapply(dataset, as.factor)
```

変換後のデータを見ても、特にlevelが２を下回っているものはありません。
Stackoverflowのこのエントリを見て、levelが１のものを削除するのはできますが、そもそもそんな列はない！
[Remove variables with factor level 1 - stackoverflow](https://stackoverflow.com/questions/17995195/remove-variables-with-factor-level-1)

```R
x[, sapply(x, nlevels) > 1]
```

もう少し調べるとbnlearnで同じことで困っている人がいましたが、最初見たときは、回答に再現しないよ、と書いてあって、空振りと思いました。

[Error in bnlearn: variable has 5 levels but I get the error “ variable arb_review must have at least two levels.”](https://stackoverflow.com/questions/43062086/error-in-bnlearn-variable-has-5-levels-but-i-get-the-error-variable-arb-revie)

# 結局

でも最後にぼそっと、tibbleになったdata.frameを使うな！と書いていました。
これでした。ラッパーを外して、data.frameに戻したらうまく動きました！

# 追記

どうも同じような不具合がdealパッケージでも起こることがわかりました。基本tbl_dfなどは使わないほうがよさそうですね。。。
SerialPortクラスが遅い・・・？

C# でSerialPortクラスを使った処理を書いていたんですが、どうも処理速度が上がらないことがありました。
非同期処理の書き方が悪いのか、慣れないMVVMで無作法をしてしまったのか、などと色々やってみましたが、かえっておかしなことになるばかり。

で、"C# serialport latency" でググりました。見つけたのが[これ](https://stackoverflow.com/questions/15752272/serial-communication-with-minimal-delay])。
「C#関係ないんじゃん」と思いつつデバイスマネージャを確認しましたところ・・・
![vcom.png](https://qiita-image-store.s3.amazonaws.com/0/26286/99e86708-58e9-085b-c21b-bbd4783416bc.png)
あ・・・
![vcom2.png](https://qiita-image-store.s3.amazonaws.com/0/26286/d9e175dd-e828-2b13-aaa4-774f0b73828b.png)
あった・・・！

これを1msecに変更したら、処理速度の問題はスッキリ解決しました。ﾁｬﾝﾁｬﾝ｡

高次のレイヤーで(慣れない)作業をしている時に問題に直面しても、もっと低ーいレイヤーに原因があるかも知れない、っていう教訓ってことで。
クライアントともめないためにやるべき4つの事

## １．自己紹介
新卒で4年間のSIer勤務を経て転職。
転職先で3人月の業務支援アプリ構築プロジェクトを1人で担当。

今回、確定させた仕様に対して追加要望やリリース後の質問が多かったので
今後そうならないための反省をメモします。

## ２．読んでほしい人
　- 新米Webディレクター、上流担当のSE
　- システム構築を初めて外部に委託する方
　- **要件定義ではOKだったのにリリース直前・リリース後の追加要望で困っている方**

## ３．やるべき4つの事
　- 工程、スケジュール表を作成し、まずは顧客レビューで承認してもらう
　- 各工程の成果物を決める　例）要件定義ならばシステム要件、画面一覧
　- 必ず工程毎に成果物レビューを実施し、クライアント承認結果を残す
　- **期限超過後の依頼は変更管理（追加見積）とするルールをクライアントに示す**
　   例）仕様案に関する質問で返答期限を超過したものは仕様書に落とし込む。
　　　　仕様書のレビュー打診し、仕様確定のエビデンスとする

## ４．これだけは伝えたい
「やるべき4つの事」ではルールを盾にするような印象を与えたかと思います。
しかし要望通りのシステムが出来上がらないのに、クライアントに対して「ルールなので」と
**一蹴するディレクションをすることは目的ではありません。（今後の仕事が無くなるので）**

クライアントの要望とシステムにギャップが無いようにレビューを実施し、
クライアントが意欲的にプロジェクトへ協力できるような関係作りのために、
事前にルールを伝え、**お互いに不幸にならないようにプロジェクトを進めましょう。**
（ルールを盾にするのは最後の手段です）

## NGシナリオ（序盤編）
#### ①「あれもこれもやりたい」状態
　⇒ヒアリングに問題あり。要望を聞き出せていないか、こちらの認識が間違っている。
　　要件定義、設計の期限延長を考慮すべき
#### ②何を説明しても「わかりました。」状態（目安は9割以上
　⇒そもそも理解していない。システムの仕様について確認テストをすべき。
　　クライアント承認を受けても後でもめる危険性大
　　（あと、仕様書の書き方見直そうね）

## NGシナリオ（中盤）
#### ③レビュー依頼出したが興味なし。「ま、いいんじゃない？」状態
　⇒当初のルールをもう一度説明しよう。+興味を持ってもらえるようにアプローチ
　　仕様が合っていなくても承認してしまうと以降の修正は変更管理扱いですよ？と
#### ④レビュー依頼出してるのに無視
　⇒上に同じ。

## NGシナリオ（終盤編）
#### ⑤緊急、いいから早くやれ状態
　⇒リリース後に多い。炎上案件に認定。
　　ここまで来たら当初のルールやドキュメントを盾にするしかなくなる。
　　（今後の取引を考えて、顧客満足度を下げないために泣く泣く無償で対応する判断も。）
AWS 認定試験 URL 一覧

# 内容
- AWS認定試験の申し込むURLがすごくわかりづらい・・・個人的メモ代わりの記事

# URL

## AWS training TOP

- https://www.aws.training/

## 認定資格管理画面

- https://www.certmetrics.com/amazon/

## 試験管理画面 TOP

- https://www.webassessor.com/home.do?page=CANDIDATE&tabs=1&branding=AWS_JP

## 試験申し込み画面(模擬試験&試験)

- https://www.webassessor.com/wa.do?page=enterCatalog&branding=AWS_JP&tabs=11

## AWS 認定ソリューションアーキテクト アソシエイト

- TOP
	- https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
- 試験ガイド
    - http://media.amazonwebservices.com/jp/training/AWS_certified_solutions_architect_associate_blueprint_11_16_2015_FINAL_JP.pdf
- サンプル問題
	- http://media.amazonwebservices.com/jp/certification/AWS_certified_SolutionArchitect_associate_examSample.pdf
	
## AWS 認定デベロッパー アソシエイト
- TOP
	- https://aws.amazon.com/jp/certification/certified-developer-associate/
- 試験ガイド
	- http://media.amazonwebservices.com/jp/certification/AWS_certified_developer_associate_blueprint.pdf
- サンプル問題
	- http://media.amazonwebservices.com/jp/training/AWS_certified_Developer_associate_examsample.pdf
 
## AWS 認定 SysOps アドミニストレーター
- TOP
	- https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/
- 試験ガイド
	- http://media.amazonwebservices.com/jp/certification/AWS_certified_sysops_associate_blueprint.pdf
- サンプル問題
	- http://media.amazonwebservices.com/jp/training/AWS_certified_Sysops_associate_examsample_v1_JP.pdf
 

## AWS 認定ソリューションアーキテクト プロフェッショナル
- TOP
	- https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/
- 試験ガイド
	- http://media.amazonwebservices.com/jp/certification/AWS_certified_solutions_architect_professional_blueprint_final.pdf
- サンプル問題
	- http://media.amazonwebservices.com/jp/certification/AWS_certified_solutions_architect_professional_examsample0701_08_final.pdf
	
## AWS 認定 DevOps エンジニア – プロフェッショナル
- TOP
	- https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/
- 試験ガイド
	- http://media.amazonwebservices.com/jp/certification/AWS_certified_devops_engineer_professional_blueprint.pdf
- サンプル問題
	- http://media.amazonwebservices.com/jp/certification/AWS_certified_DevOps_Engineer_Professional_SampleExam.pdf
AWSCLIでdescribe-instancesする時は--output textを指定するといいです

`awscli`のデフォルトの出力形式はJSONなので、そのままだと`jq`などのJSONパーサを使わないと他コマンドでの転用が厳しいですが、`--output text`を使うといい感じに整形してくれます。

例えば

```
aws ec2 describe-instances --filter "Name=tag:Name,Values=YourInstanceName" --query "Reservations[].Instances[].InstanceId"
```

のようにすると、`[["YourInstanceId"]]`のように、JSON形式で返ってきてしまうので

```
aws ec2 describe-instances --filter "Name=tag:Name,Values=YourInstanceName" --query "Reservations[].Instances[].InstanceId" --output text
```

のように、`--output text`を付け加えると、`YourInstanceId`のようにブラケットやダブルクォーテーションが外れた状態で戻ってきます。

それだけです。
背景画像を複数設定する

ビジュアルデザインでよく対角線上に要素を配置して枠っぽくする表現があるわけだけど、CSSの画像でそれをやろうとする場合の実現方法。

```css
.foo {
        background-image: url(images/XXX.png), url(images/YYY.jpg);
        background-position: left top, right bottom;
        background-repeat: no-repeat, no-repeat;
        background-size: 100px 50px, 20%;
}
```

ぶっちゃけ、各backgroundプロパティー内でカンマで区切って設定すればOK。
backgroundプロパティーによる一括で設定は不可。

因みに上下だと先に記述した方が上になる。

【追記】
用語のご指摘ありがとうございます
SwiftのArrayは値型でCoWなことの確認方法

自分で確認しないと納得しない人向け

##確かめる結論
**① SwiftのArrayは値型**
**② 配列自体を他の変数に代入した時には配列の内容のコピーが走らない**
**③ 配列の内容が変更された時に配列の内容がコピーされる**

※②、③はいわゆるCopy-on-Write(CoW)のこと

##確認方法
### ① SwiftのArrayは値型
var a = [1,2,3]
var b = a
b[1] = 0
とすると、bは[1,0,3]となるが、aは[1,2,3]のままなので値型である。
（もしも、参照型であればaも[1,0,3]となるので）

```swift:

  1> var a = [1,2,3]
a: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  2> var b = a
b: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  3> b[1] = 0
  4> a
$R0: [Int] = 3 values {
  [0] = 1
  [1] = 2   // 元のaはそのまま
  [2] = 3
}
  5> b
$R1: [Int] = 3 values {
  [0] = 1
  [1] = 0   // bだけ変わった
  [2] = 3
} 
```

### ② 配列自体を他の変数に代入した時には配列の内容のコピーが走らない
配列を代入した段階ではa,b共に同じ値が格納されているので、実体が一つで十分であるから。
var a = [1,2,3]
var b = a
とすると、a,bともに0x00000001001004f0と同じメモリ番地を指しているため内容自体はコピーされていない。

```swift:
  1> var a = [1,2,3]
a: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  2> Unmanaged.passUnretained(a as AnyObject).toOpaque()
$R0: UnsafeMutableRawPointer = {
  _rawValue = 0x00000001001004f0
}
  3> var b = a 
b: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  4> Unmanaged.passUnretained(a as AnyObject).toOpaque()
$R1: UnsafeMutableRawPointer = {
  _rawValue = 0x00000001004000f0    // aと同じメモリの番地
}
```

### ③ 配列の内容が変更された時に配列の内容がコピーされる
上記②の続きで、
b[1] = 1
とした瞬間にコピーされる。
コピーされたことは変数bのアドレスが変更されていることによりわかる。

```swift:
  5> b[1] = 8
  6> a
$R2: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  7> b
$R3: [Int] = 3 values {
  [0] = 1
  [1] = 8
  [2] = 3
}
  8> Unmanaged.passUnretained(a as AnyObject).toOpaque()
$R4: UnsafeMutableRawPointer = {
  _rawValue = 0x00000001001004f0
}
  9> Unmanaged.passUnretained(b as AnyObject).toOpaque() 
$R6: UnsafeMutableRawPointer = {
  _rawValue = 0x0000000100301400 // 違うメモリの番地を指している
}
```

##　補足
* 定数となるletは他の変数に代入してもそもそも内容をコピーする必要がなく例として面白くないのでvarのみを考えてる。
* コンパイラはApple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
AWS CodePipeline を CloudFormation で構築するときのメモ


## ソースステージ

### `Source` ステージで S3 を利用する

``` yaml
   - Name: 'Source'
     Actions:
       - Name: 'App'
         ActionTypeId:
           Category: 'Source'
           Owner: 'AWS'
           Version: '1'
           Provider: 'S3'
         Configuration:
           S3Bucket:
             Ref: 'SourceBucket'
           S3ObjectKey: 'source.zip'
         OutputArtifacts:
           - Name: 'App'
         RunOrder: '1'
```
利用する S3 バケットはバージョニングが `Enabled` になっていることと、 CodePipeline で利用する Role に該当バケットへのアクセス権が付与されている必要がある。


## 承認ステージ

### `Approval` ステージで AWS SNS 経由で通知を送る

``` yaml
 - Name: 'Approval'
   Actions:
     - Name: 'Approval'
       ActionTypeId:
         Category: 'Approval'
         Owner: 'AWS'
         Version: '1'
         Provider: 'Manual'
       Configuration:
         NotificationArn:
           Ref: 'CodepipelineTopic'
         ExternalEntityLink: !Sub 'https://${App}.example.com/'
         CustomData: 'Please review the latest change and approve or reject.'
       RunOrder: '1'
```
`NotificationArn` で通知を送る SNS Topic を指定する。もちろん該当の SNS Topic に対するアクセス権が付与されている必要がある。
`CustoumData` でメッセージや `ExternalEntityLink` でレビュー用のリンクを付加することもできる。
PyMysqlでLOAD DATAする


下記のようにpymysqlでLOAD DATAを実行しようとしたところ、

```python:
def load_data(file_path):
    with conn.cursor() as cursor:
        sql = """
LOAD DATA LOCAL INFILE '{}' 
INTO TABLE Sample 
CHARACTER SET utf8 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
        """.format(file_path)
        cursor.execute(sql)
```

以下のエラーが出て取り込めませんでした。

```
pymysql.err.InternalError: (1148, 'The used command is not allowed with this MySQL version')
```


connect時に `local_infile=True` を指定することで、解消しました。

```python:
pymysql.connect(
    :
    local_infile=True
)
```
既に存在するHiveのテーブルからDDLを作成する方法

## はじめに
軽く調べましたが、HiveにおいてテーブルからDDLを生成する方法が
日本語で纏められているサイトが見つからなかったため、纏めました。
※MySQL等は纏められていました。
コマンド自体はMySQLと一緒(show create table)ですので、細かいところを
フォローできればと思います。

## 前提
DB名は「SampleDB」とする。
テーブル名は「SampleTable」とする。

## DDLを作成してみる
コマンドは至って単純である。

```hive -e "use SampleDB; show create table SampleTable;"```

上記コマンドでDDLを表示できる。
リダイレクトすればDDLファイルの作成が可能である。

```hive -e "use SampleDB; show create table SampleTable;" >SampleTable.DDL```


## 注意点
制約なのか、Hue(GUI)においてはDB名指定コマンドで動作しない場合がありました。
動作しない場合は

```
OK
FAILED:SemanticException [Error 10001]: Table not found SampleTable
```

と出力されました。
動作する・動作しないのパターンは下記の通り。

【動作するパターン】
Hueでテーブルの存在するDBをデータベース選択し、下記コマンドを実行した場合。
```use SampleDB; show create table SampleTable;```
または
```show create table SampleTable;```

【動作しないパターン】
Hueでテーブルの存在するDB以外をデータベース選択し、下記コマンドを実行した場合。
```use SampleDB; show create table SampleTable;```

## 作成したDDLについて
作成したDDLファイルをそのまま使用することもできますが、
DB名の指定が存在しないため、お勧めしません。
DDLファイルの読み込みはhive -fコマンドで行えます。
```hive -f SampleTable.DDL```
DB名の指定が無い状態でテーブルを作成した場合は「default」というDBに
テーブルが作成されます。

作成したDDLファイルは以下のように記載されている。
※一例。作成するときに参照するTABLEによっては一部項目は出力されない。
　また、項目の細部が異なる可能性があります。

```
CREATE TABLE SampleTable(
  A_column string,
  B_column string,
  C_column string)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
  LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://mycluster/user/woadachi/sample'
TBLPROPERTIES (
  'last_modified_by'='woadachi'
  'last_modified_time'='XXXXXXXXXX'
  'transient_lastDdlTime'='XXXXXXXXXX')
```

別に削らなくてもいいですが、この中で
「STORED AS INPUTFORMAT」と「OUTPUTFORMAT」と「TBLPROPERTIES」は
削っても問題ないと思います。

なお、DDLファイルの先頭行にDB名を追加すれば、指定のDBに
テーブルを作成することができます。
後、個人的には最終行の行末に「;」が欲しいです。無いと落ち着かない……

```
use SampleDB;

CREATE TABLE SampleTable(
  A_column string,
  B_column string,
  C_column string)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
  LINES TERMINATED BY '\n'
LOCATION
  'hdfs://mycluster/user/woadachi/sample'
;
```
## 活用
既存のテーブルのDDLを作成し、管理するためだけでなく、
既存のテーブルをDDL出力して流用することで業務効率化が図れると思います。
また、ここまで紹介した内容をLinuxコマンドと組み合わせてシェル化することで、
任意のDBの任意のテーブルに対して自動でDDLを作成するシェルを作成することも
可能だと思います。
CreateJS クリックした位置の座標値の補正 event.stageX, event.stageY stage.mouseX, stage.mouseY

■ バージョン
createjs-2015.11.26.min.js

■ 症状
Android、iPhone、macで、クリックした位置の座標値が、約2倍または約3倍の値になってしまう。

■ 解決方法
globalToLocalを使用して補正する


// stage.mouseX, stage.mouseYの場合
var p = exportRoot.globalToLocal(stage.mouseX, stage.mouseY);


// event.stageX, event.stageY の場合
function onClick(evt){
 var p = exportRoot.globalToLocal(evt.stageX, evt.stageY);
}

exportRootの部分は、stageにaddChildしているcratejs.Containerオブジェクトでも可。
Shibboleth を Debian 系で設定

# 予備知識

IdP Identity Provider 認証を実行
SP Service Provider 

# 設定


「技術ガイド」の「shibboleth2.xml ファイル」を見ながら設定。
https://meatwiki.nii.ac.jp/confluence/pages/viewpage.action?pageId=12158266


/etc/shibboleth/shibboleth2.xml 中、


```

       <!-- Example of remotely supplied batch of signed metadata. -->
        <!-- --> ←コメントアウト解除
        <MetadataProvider type="XML" validate="true"
            uri="https://metadata.gakunin.nii.ac.jp/gakunin-metadata.xml"
                                         ↑参照先のURLを設定
            backingFilePath="federation-metadata.xml" reloadInterval="7200">
            <MetadataFilter type="RequireValidUntil" maxValidityInterval="1296000"/>
                                                                             ↑validUntilの検証設定
            <MetadataFilter type="Signature" certificate="/etc/shibboleth/cert/gakunin-signer-2010.cer"/>
                                                                                         ↑自動更新メタデータの検証用証明書設定
            <DiscoveryFilter type="Blacklist" matcher="EntityAttributes" trimTags="true"
             attributeName="http://macedir.org/entity-category"
             attributeNameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
             attributeValue="http://refeds.org/category/hide-from-discovery" />
            <TransportOption provider="CURL" option="64">1</TransportOption>
            <TransportOption provider="CURL" option="81">2</TransportOption>
            <TransportOption provider="CURL" option="10065">/etc/pki/tls/certs/ca-bundle.crt</TransportOption>
```


とある、この最後の

```

            <TransportOption provider="CURL" option="10065">/etc/pki/tls/certs/ca-bundle.crt</TransportOption>


```

は多分証明書を置くローカルの場所ということでしょう。

しかしながらこのディレクトリ位置はRedHat系となります。

この位置の

ca-bundle.crt

に追記するそうです。

僕はDebian系の人なのですがDebian系は以下にすればいいかな・・・

```

/etc/ssl/certs/ca-certificates.crt
```
Gitシリーズ - ②コミットコメントにフォーマットバリデーションを追加してみた

# はじめに

- [前回](http://qiita.com/neriai/items/d502b8b653eda84734b8)に続いて、今回もhook scriptを使ってみました。

# フォーマットの作成

今回は、コミット時にコミットメッセージが "[コミット種別] #チケット番号 コミットメッセージ" のフォーマットになっているか確認します。

## フォーマット

```
[fix|hotfix|add|modify|change|clean|remove|upgrade|revert]　#（数字を１文字以上） （コメントを１文字以上）
```

# バリデーションの設定

```
$ vi .git/hooks/commit-msg
```

```sh:commit-msg
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message.  The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit.  The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".

# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" 

# This example catches duplicate Signed-off-by lines.

# default
#
# test "" = "$(grep '^Signed-off-by: ' "$1" |
#        sort | uniq -c | sed -e '/^[   ]*1[    ]/d')" || {
#       echo >&2 Duplicate Signed-off-by lines.
#       exit 1
# }

# コミットコメントのチェック
#   コミットメッセージが以下のフォーマットでない場合、コミットさせない
#   [fix|hotfix|add|modify|change|clean|remove|upgrade|revert] #(数字を一文字以上) メッセージを一文字以上
if grep "\[\(fix\|hotfix\|add\|modify\|change\|clean\|remove\|upgrade\|revert\)\] \#\([0-9]\+\) \(.\+\)" $1 > /dev/null; then
  exit 0
else
  echo "コミットコメントが不正です!!" 
  echo "コミットコメントは \"[{コミット種別}] #{チケット番号} メッセージ\" のフォーマットで入力してください。" 
  echo "{コミット種別} : fix, hotfix, add, modify, change, clean, remove, upgrade, revert のいずれかを格納" 
  echo "{チケット番号} : 数値を格納" 

  exit 1
fi
```

# シリーズページリンク
- [Gitシリーズ - ①コミット時にGitユーザをAuthorに設定してみた](http://qiita.com/neriai/items/d502b8b653eda84734b8)
- [Gitシリーズ - ②コミットコメントにフォーマットバリデーションを追加してみた](http://qiita.com/neriai/items/d950ba007b1baec5718b)
Gitシリーズ - ①コミット時にGitユーザをAuthorに設定してみた

# はじめに

- ２週間の長い夏休みをいただきました。リハビリ開始します。
- さて、Gitが約1年半くらい前に弊社で導入されるまでは、Subversionを使ってました。
- Subversionは導入当時は画期的な管理ツールで、その中でも便利だったのはソースコードに記載する際のauthorをコミットユーザに置換してくれる機能です。
- 今回は、これとGitに導入してみたいとおもいます。

# ユーザの設定

## ユーザ設定の追加

```
$ cd path/to/clone or path/to/git_init
$ vi .git/config
```

※SourceTreeの場合
Sourcetreeアプリケーション右上に表示されている 設定 -> 設定ファイルを編集 を押します。

※TortoiseGitの場合
gitの設定ファイル.gitconfigに下記設定を追加します。

```git
[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
    autoCRLF = false
[user]
    name = {ユーザ名}
    email = {メールアドレス}
[http]
    sslVerify = false
```

# hook scriptの設定

- git では commit や push などリポジトリの操作を行う前後でscriptを実行できます。

[参考](https://gist.github.com/tuki0918/8438364#コミットに関するフック処理)

## コミット時に@authorを自動更新する

### pre-commitを編集する

```
$ vi .git/hooks/pre-commit
```

```sh:pre-commit
#!/bin/sh
# git commit前処理
# 置換でコメントを追加する

# 更新チェックの比較対象を取得
git rev-parse --verify HEAD >/dev/null 2>&1

if [ $? -eq 0 ]; then
    against='HEAD'
else
    # 最初はHEADがないので初期値を使用
    against='4b825dc642cb6eb9a060e54bf8d69288fbee4904'
fi

# git 設定から名前、メールアドレスを取得
user_name=`git config user.name`
user_email=`git config user.email`

# 各更新ファイルのキーワード置換
for file in `git diff --name-only $against`; do
    # ファイル形式がtextの場合のみ置換
    if [ 0 -lt `file "$file" | grep -c 'PHP script text'` ]; then
        # @authorを置換
        sed -i -e "s/@author \(.*\) <\(.*\)>/@author ${user_name} <${user_email}>/g" "$file" 

        git add -f "$file" 
    fi
done
```

### post-commitを編集する

```
$ vi .git/hooks/post-commit 
```

```sh:post-commit
#!/bin/sh
# git commit後処理

# コマンドの説明
# git log -p -1 --pretty=oneline --name-only
#  直前のコミット情報をファイル名のみ取得する
# grep -v "^[0-9a-fA-F]\{40\} \(.*\)$" 
#  gitハッシュ値の行を非表示にする

# コミットしたファイルの最新ものを取得する
#   個別にファイル指定してコミットした時にファイルの差分が出てしまうため、>最新のものを取得する
for file in `git log -p -1 --pretty=oneline --name-only | grep -v "^[0-9a-fA-F]\{40\} \(.*\)$"`; do
    git checkout HEAD "$file" 
done
```

# 結果イメージ

## コメット前

```php
/**
 * コメント
 *
 * @package Sample
 * @author before <before@example.co.jp>
 */
```

## コミット後

```php
/**
 * コメント
 *
 * @package Sample
 * @author after <after@example.co.jp>
 */
```

# まとめ

- hook scriptを使えば、他にもコミットコメントなどの情報を取得してファイルに差し込んだり、勝手にファイルを作成／削除などhack的なことができると思います。
- 次回も引き続きhook script使ってみたいとおもいます。

# シリーズページリンク
- [Gitシリーズ - ①コミット時にGitユーザをAuthorに設定してみた](http://qiita.com/neriai/items/d502b8b653eda84734b8)
- [Gitシリーズ - ②コミットコメントにフォーマットバリデーションを追加してみた](http://qiita.com/neriai/items/d950ba007b1baec5718b)
MySQL - データベースのテーブル数・テーブル内のカラム数を知りたい

## テーブル数を調べたい場合
information_schemaテーブルに検索をかける

```
mysql> select count(*) from `information_schema`.`tables` where `table_schema` = 'table';                         
+----------+
| count(*) |
+----------+
|      100 |
+----------+
1 row in set (0.01 sec)
```

## テーブル内のカラム数が知りたい場合
同上

```
mysql> select count(*) from information_schema.columns where table_name = '#{テーブル名}';                            
+----------+
| count(*) |
+----------+
|      158 |
+----------+
1 row in set (0.01 sec)
```

以上、備忘録でした。
SmartGit > Mergeの種類 > Fast-Forward | Create Merge-Commit | Merge to Working Tree

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

関連: [SmartGit > master (Local branches) への他branchからのmerge | merge解除](http://qiita.com/7of9/items/9ff02b2af7b3856dc0da)

feature branchなどのmergeに関して、以下の選択肢がある。

![2017-07-24_10h01_01.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f209af68-9daa-8d4b-ca42-98b3018db59d.png)

`Create Merge-Commit`はおそらくno fast-forwardなのだろう。

`Merge to Working Tree`とは何か?
以下を見つけた。
https://stackoverflow.com/questions/24684410/fast-forward-merge-commit-or-merge-to-working-tree-which-is-the-right-option-t

> One of your other options, **Merge to Working Tree**, I think, would perform the merge, but leave the result uncommitted. If this is what it does, if you then do a git commit, you'd end up at exactly the same point as Create Merge Commit; the former option just gives you an opportunity to edit the commit.
サイトURL生成（インフラ）

サーバー上にフォルダ毎にプロジェクトを分けた場合に、フォルダ毎にサイトURLを付ける作業。

##１．サーバー上（htdocs以下）に新規に作りたいサイトをフォルダ分け

```
例：
・htdocs/
　・site-A/
　・site-B/
　・site-C/ ← New
*EC-CUBEならフォルダ毎入れる
```

##２．Apacheのhttpd.confを修正
ここ /etc/httpd/conf/httpd.conf

###①付与したいポートをListen追加する
`Listen 8989`

###②どこかにVirtualHostの記述があるのでそこに下記記述を追加

```httpd.conf
<virtualhost *:8989> #←数字は任意
  DocumentRoot "/var/www/html/htdocs/site-C" #対象フォルダのroot
</virtualhost>
```

##３．Apacheの再起動

```
# /etc/init.d/httpd restart
もしくは
# service httpd restart
```
SharePoint PowerShell コマンド備忘録

自分の備忘録です。SharePointで使えるPowerShellのコマンドをまとめていきます。
実際に使ったものしか記載しないので、これから徐々に増やしていくつもりです。

■テナントのゴミ箱に入っているサイトコレクションを削除する
対象：SharePoint Online

Connect-SPOService -Url (管理センターのURL)
Remove-SPODeletedSite (削除したいサイトコレクションのURL)
phpmyadmin にアクセスできない時 & WPのログイン画面にアクセスできない時の対処法（MAMP）

#環境
- WordPressでMAMPをインストールして、ブログを作成
- Mac用のMAMP

#問題になっていること
- ブックマークしておいたphpmyadminのURLにアクセスできない
- WPのログインページにアクセスできない

#現象1： phpmyadmin のURLにアクセスできない
このURLでアクセスすると解決するという記事もどこかで見たのだけれど、今回の場合は効果なし。
`http://localhost:8888/phpMyAdmin/`

調べた結果、MAMPを開くと`Open WebStart Page`が押せないことになっているのを発見。
![Screen Shot 2017-07-24 at 2.14.50.png](https://qiita-image-store.s3.amazonaws.com/0/178773/943ea79f-57e5-6975-bd69-18a66ba1d495.png)



**解決策手順**

- 上記MAMP画像左端の`Preference`をクリック
- 以下画像のように設定

![Screen Shot 2017-07-24 at 2.24.33.png](https://qiita-image-store.s3.amazonaws.com/0/178773/077b208d-0d6e-01d5-53b2-10ab99137415.png)
- 上記MAMP画像右端の`Start Servers`をクリック
- 以下のWebページにダイレクトされるので、画像左の`MySQL`の項目にある`MySQL can be administered with phpMyAdmin.`の`phpMyAdmin`をクリック

![Screen Shot 2017-07-24 at 2.18.43.png](https://qiita-image-store.s3.amazonaws.com/0/178773/6e9b11d9-7d3b-2ae6-001e-508a83f579b5.png)

これでphpMyAdminが見れるようになりました。MAMPの画面も以下の画像のようになっているはずです。
![Screen Shot 2017-07-24 at 1.57.46.png](https://qiita-image-store.s3.amazonaws.com/0/178773/bef957bd-f876-3bb9-0460-509141c39d1e.png)

#現象２：WPのログイン画面URLがアクセスできない
現象１を上記の方法で解決してしまえば、この問題も解決しています。ブックマークしておいたWPのログインURLにもう一度アクセスしてみてください。エラー画面ではなく、ちゃんとログイン画面が表示されているはずです。

> 初歩的なつまずきかもしれませんが、よくログインできなくなるという記事を見かける & 実際に経験したので、忘れないためにもメモで書いています。
ご指摘ありましたらよろしくお願いします。
>> 参考記事：https://stackoverflow.com/questions/8656139/i-cant-access-phpmyadmin-with-mamp
How to install pycrypto on Windows

# How to install pycrypto on Windows

The file include\pyport.h in Python installation directory does not have #include < stdint.h > anymore. This leaves intmax_t undefined.

A workaround for Microsoft VC compiler is to force include stdint.h via OS environment variable CL:


```
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>vcvarsall
```

```
set CL=-FI"%VCINSTALLDIR%\INCLUDE\stdint.h"
```

```
pip install pycrypto
```

```
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>pip install pycrypto
Collecting pycrypto
  Using cached pycrypto-2.6.1.tar.gz
Installing collected packages: pycrypto
  Running setup.py install for pycrypto ... done
Successfully installed pycrypto-2.6.1
```
WPFパフォーマンスチューニング①：DependencyPropertyのアクセスが遅い件

#はじめに
WPFは遅いです。それはとてもとても。
ちょっとしたサンプルレベルで動作させてるうちは問題なくても、データ量が増えた場合等は、かなりパフォーマンスを意識した作りをしないとアプリケーションとして破綻してしまうことがあります。

というわけで、WPFのパフォーマンスで気を付けた方が良い点とかを気づいたレベルで、覚書しておきます。

## DependencyPropertyへのアクセス
通常DependencyPropertyは、下記のように定義されます。（VisualStudio上で**propdp**とタイプしてTab2回で展開されたものです。Resharperを利用されている方は**dependencyproperty**のキーワードでほぼ同じsnippetが用意されています。）

```csharp
public int MyProperty
{
    get { return (int)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));
```
で、コードからはCLR PropertyとしてラップされたDependency Propertyにアクセスするのですが、これが通常のCLR Propertyと比べると格段にアクセスが遅いです。興味のある方は、[ReferenceSource](https://referencesource.microsoft.com/)で[GetValue](https://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyObject.cs,0e1012f338283c7a,references)の内部を見てもらうとして、Snippetとして見えてる範囲でもアクセスのたびにUnboxingが発生して、嫌な感じですよね。
*CompositeTarget.Rendering*イベントや*Control.MouseMove*イベント内など、頻繁に呼び出される箇所で複数のDependencyPropertyを参照しているのであれば、一度フィールドにキャッシュしたうえでアクセスを検討することをお勧めします。

##対策
というわけ、Snippetを以下のように変更してみました。

```csharp
private int _myProperty;

public int MyProperty
{
    get { return _myProperty; }
    set { SetValue(MyPropertyProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass),
        new PropertyMetadata(0, (s, e) => ((ownerclass)s)._myProperty = (int)e.NewValue));
```
対応はgetterのみです。秒間何回もSetterが呼び出されることはほぼないと思われるので、これで十分でしょう。
もちろん、DependencyPropertyとして値を保持しているのと、ローカルフィールドとして保持するのの2重管理になるので、メモリ使用量が増えるとかはありますが、影響は限定的だと思います。

##おわりに
ところで②はあるのか？
fishのfunctionをpecoで選択

`functions`の出力が,区切りで見にくいじゃん？
,を\nに置換して改行表示にするじゃん？
でも調べてから使うにはコピペするか先頭文字打って補完するじゃん？
じゃあpecoでざっつに検索してそのままコマンドラインに出したいじゃん？

とfunctionsを知って数分、勢いで書く。

```sh
function penctions
   commandline (functions | tr ',' '\n' | peco)
end
```



```sh
function fish_user_key_bindings
    bind \cq penctions
end
```


commandlineは2.6.0からの書き方。
[fishshell 2.6.0 の変更点ピックアップ - Qiita]


引数とか考慮しない手抜きなので、_始まりのfunctionだしたいなら -a をデフォルトでつけるか引数対応に

![penctions.gif](https://qiita-image-store.s3.amazonaws.com/0/62354/4df1440c-c6eb-9741-0e07-5011aa4a0117.gif)

functionを自作したはいいが、ちょっと使わないとかなり忘れるので、ましになるかも。

[fishshell 2.6.0 の変更点ピックアップ - Qiita]:http://qiita.com/ryotako/items/69b7e18e508c112a42a0
Arch LinuxにGoglandをインストールして"Hello World"（2017年7月）

※まだGoglandはプレビュー版（？）なので、変更があるかもしれません

## Goglandとは
IntelliJ IDEAなどでおなじみJetBrains社が作ったGo言語用のIDEです。

https://blog.jetbrains.com/jp/2016/12/15/726

IDEAにGo言語用プラグインを入れるのが少し前までの定番だったと思いますが、独立したIDEができていました。

冒頭にも書きましたが、まだ正式リリース版ではないので、バグなどあるかもしれません。ただし、まだ軽く触った程度ですが、問題なく使用できる印象を受けました。

プレリリース版の公開から半年以上は経ってますしね。

## 環境
 * Arch Linux(デスクトップ環境はxfce4)

## インストール方法

他のIntelliJのIDEと同じかと思います。

 * 公式サイトからアーカイブ（tarボール）を取得、展開
 * binの下にあるシェルスクリプトを実行

## 設定

まず、Goの処理系は自分でインストールしておく必要があります。

http://golang-jp.org/doc/install

こだわりがなければ、ドキュメントどおりに/usr/local/goにインストールを行い、/usr/local/go/binにパスを通します。

Goのインストールとパスが通れば、Goglandから自動で認識されます。

※カスタムの場所にインストールをして、GOROOTとGOPATHを独自に設定した場合にどうなるかは試していません。もしかしたらGoglandの設定でもGOROOTとGOPATHの設定がいるかも

## 注意：パスの通し方

XでGUIを起動している場合は、~/.bash_proficleなどは読まれないので、~/.profileというファイルを自分で作る必要がある

## Hello Worldを実行する

Gogland上で新しいファイルをつくり、下記から"hello.go"をコピペして実行しましょう。
http://golang-jp.org/doc/install
Python 3.5 > math > isclose() > 0.0に近い値との比較での落とし穴

[消えた「細かすぎて伝わりにくい、Pythonの本当の落とし穴10選」# Extra Stage! (2017-06-16)](http://qiita.com/amedama/items/a03d4ae97af9aecd5966#extra-stage-2017-06-16)
で紹介されているisclose()が便利そう。

> Python 3.5から mathモジュールに isclose() という関数が入ったので、気になる折には使用を検討しよう。

関連して以下を見つけた。
[Using math.isclose function with values close to 0 @ stackoverflow](https://stackoverflow.com/questions/35324893/using-math-isclose-function-with-values-close-to-0)

0に近い値を比較する場合にはabs_tolを設定するように、とのこと。
試してみた。

http://ideone.com/Df44WC

```py
import math
 
res = math.isclose(0.2 + 0.4, 0.6)
print(res)
 
res = math.isclose(0.2 + 0.4 - 0.6, 0.0)
print(res)
 
res = math.isclose(0.2 + 0.4 - 0.6, 0.0, abs_tol=1e-9)
print(res)
```

```txt:run
True
False
True
```

### 検索用キーワード
(追記 2018/01/13)

- sys.float_info.epsilon
GCE無料枠でShiny Serverを構築するメモ

RでWebアプリケーションを作るフレームワークであるShinyを動かす環境をGCE上に作ったメモです。
といっても複雑な手順ではないので、ちょっとつまずいたところのメモです。

# 用語？
## Shiny Serverとは

- [Shiny Server - RStudio](https://www.rstudio.com/products/shiny/download-server/)
- [Shiny Server - GitHub](https://github.com/rstudio/shiny-server)

R言語のWebアプリケーション作成パッケージであるShinyを使って作ったWebアプリをサーバー上で動かせるようにするもの。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83530/d34eb5a9-66ca-6c9c-b9a3-e0496e91deb1.png)
Shinyは図のような、入力値を反映してグラフ作ったり計算させたりするWebアプリがサクッと作れます。
ちょっとしたグラフ化や集計に便利な反面、配布が難しい（相手のPCにもRとShinyを入れないといけない）デメリットがありました。でもサーバーで動くようにしておくと、手軽に見てもらえるのでそういった情報共有に便利！・・・たぶん。

## GCE無料で使えるよ

Googleのクラウドサービスの一つであるGoogle Compute Engineは、最小構成のf1-microインスタンスを無料で使えるようです。
XXヶ月無料ではなく、ずっと無料なので使わない手はないですね。
ただし、0.2vCPU/メモリ0.6Gなので本当にお試し用の位置づけです。
無料のインスタンスのセットアップ方法はこちらの記事が大変わかりやすかったです。

- [いつでも無料！Google Compute Engine 常時無料枠の使い方](https://blog.apar.jp/web/6966/)

以下の構築手順は、OSはCentOS7を選択し、Google Cloud Shell上で操作したものです。

# 構築手順

基本的には手順に沿って・・・。

```R
# Rのインストール
sudo yum install R

# shinyのインストール
sudo su - \
-c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""

# R Markdownのインストール
sudo su - -c "R -e \"install.packages(‘markdown’, repos='http://cran.rstudio.com/')\""

# shiny serverのインストーラーダウンロード
wget https://download3.rstudio.org/centos5.9/x86_64/shiny-server-1.5.3.838-rh5-x86_64.rpm

# shiny serverのインストール
sudo yum install --nogpgcheck shiny-server-1.5.3.838-rh5-x86_64.rpm

# 起動
sudo systemctl start shiny-server
# 停止：stop 再起動：restart
```

以下、この手順ですんなりインストールできなかった時に確認したこと。

## スワップ領域確保

RのインストールやShiny Serverのインストール途中でエラーが起きる場合、メモリー不足が原因のことがあります。というかGCEの無料枠だとガンガン失敗してました。
ということでスワップ領域を作ってメモリ不足を回避します。

```
sudo dd if=/dev/zero of=/swapfile bs=1024K count=1024
sudo mkswap /swapfile
sudo /sbin/swapon /swapfile

# /etc/fstab に以下を記述して、再起動時に設定されるようにしておく
/swapfile swap swap defaults 0 0
```

これで無事インストールができるようになりました。

## Shiny/RMarkdownの導入

図のようになった場合は、Shiny Serverは動いているものの、ShinyパッケージやR Markdownパッケージがうまく動いていないです。

![ShinyServerErr.png](https://qiita-image-store.s3.amazonaws.com/0/83530/5aa3dfa3-4fa0-fdf0-15aa-f5be035f366d.png)

「すでにShiny導入済みだから飛ばした」「メモリー不足でインストールできてなかった」等の理由でShinyとR Markdownがうまくインストールできていない場合があります。
また、過去にインストールしていても権限的にShiny Serverから参照できていない場合もあるので

```R
> sudo R
install.packages(c("shiny","rmarkdown"))
q("n")
```
権限に注意しつつインストールできているか確認しましょう。