OmniAICreator/Qiita-1.07M huggingface dataset:
memoryのECC errorがどうやって検出されているか調べる

仕事で、memoryでECC errorが起きたときにどのように検出されるか調べる必要が出てきた。IntelのXeon想定。
なお、CPU周りについてもLinux kernelについてもどどどどど素人なので、一朝一夕のスキルしかない。
あと、単なる自分用のメモなので殴り書きです。

EDACというものでmemoryのECC errorを検出できるようだ。
https://ccmp.jp/engineerblog/81-linuxedacecc.html
EDACはドライバになっていて、これをloadすると有効になるっぽい。
drivers\edac\sb_edac.cとかdrivers\edac\skx_edac.cがXeon向けかな？？？
とりあえずsb_edac.cを調べる。あとkernel versionは4.14.3。

たぶん、errorの検出自体はMachine Check Exception(MCE)でやるっぽい。
EDACをloadしてECCをenabledにすると、MCEで上がってくるerrorも変わるのだろうか。。。
EDAC load前でmemory errorが起きるとMCi_STATUSのuncorrected errorが立つんだけど、EDAC load後には立たない、みたいな。
MCEについてはIntel SDMのchapter 15を見る。
https://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.html

上のEDACのlink先で出ているmessageがどこで出されているのか調べる。
> EDAC MC0: CE page 0x3e9, offset 0x380, grain 128, syndrome 0x91, row 0, channel 0, label "": i3000 CE

たぶん、

1. sbridge_mce_check_error()
2. sbridge_mce_output_error()
3. edac_mc_handle_error()
4. edac_raw_mc_handle_error()

の流れ。

sbridge_mce_check_error()は、sbridge_init()でsbridge_mce_decとして登録されているみたい。sb_edacがloadされると、

1. sbridge_init()
2. mce_register_decode_chain()
3. blocking_notifier_chain_register()

を通ってx86_mce_decoder_chainにsbridge_mce_dec(sbridge_mce_check_error, priority = MCE_PRIO_EDAC)が、登録されるようだ。
mcheck_init()では同様に、

- first_nb
- mce_srao_nb
- mce_default_nb

が登録されている。これらのinitの後に、sb_edacがloadされると追加される感じではないだろうか。
Notification Chainsの勉強が必要な気がする。
https://www.safaribooksonline.com/library/view/understanding-linux-network/0596002556/ch04.html

実際にx86_mce_decoder_chainがcallされるのはどこだろう。
x86_mce_decoder_chainはmce_gen_pool_process()からcallされているように見える。そこからnotifier_call_chain()でchainをぐるぐる回っているのだと思われる。戻り値にNOTIFY_STOP_MASKが立っていたら終わりのようだ。

do_machine_check()がMCEのhandlerだと思うのだけど、sbridge_mce_check_error()との関係性が分からない。

1. do_machine_check()
2. mce_log()
3. irq_work_queue()

でmce_irq_workを登録しているのだろうか。irq_workの仕組みがまだよく分かっていない。
mcheck_init()で

- init_irq_work(&mce_irq_work, mce_irq_work_cb);

している。また、

1. mce_irq_work_cb()
2. mce_schedule_work()
3. schedule_work()

でmce_workをschedule_workしている。workqueueの仕組みもよく分かっていない。
さらにmcheck_init()で、

- INIT_WORK(&mce_work, mce_gen_pool_process);

している。

sbridge_mce_check_error()は本家のMCEの処理が終わった後のlog吐き出しくらいの機能かもしれない。。。

ひとつ気になるのがHPの以下のドキュメント。
EDACを使わずに自前の方法でerrorを検出するらしい。もしかして「いまどきの一般のserverはEDACなんて使ってない」だったりしないよね？
https://h20628.www2.hp.com/km-ext/content-webapp/document?docId=emr_na-c03520590
DataLake をちょっとだけ触ってみた

Azure DataLake を触ってみたので、忘れないようにメモ。
Data Lake は、[Data Lake Store](https://azure.microsoft.com/ja-jp/services/data-lake-store/)という非構造・半構造化データ構造化データをMax ペタバイト、数十億個まで格納できる[データレイク](https://martinfowler.com/bliki/DataLake.html)です。そして、、[Data Lake Analytics](https://azure.microsoft.com/ja-jp/services/data-lake-analytics/) はその分析基盤です。Data Lake Analytics を使わず、Hadoop や Spark と組み合わせることもできそうです。Data Lake Analytics では、U-SQL という言語を使います。これはほぼSQL なので、すぐにに理解できそうです。

<img width="724" alt="08.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/4d78d1bb-037c-318b-6840-86ed9bb13bc6.png">


# 使い道

大量の非構造・半構造データ (csv, tsv など）をがっつり、データレークにほりこんでおいて、超並列で処理させるとかが可能です。いくつかの言語は使えますが、王道は、Visual Studio を使って U-SQL を書くというのがよさげです。ちなみに、CSharpScript というコードビハインドが U-SQL についている様子なのでいろいろごにょごにょ出来そうです。

では、ざっくり触ってみた感じをシェアします。

# サンプルデータのアップロード

サーバー側に、Data Lake Store と、 Data Lake Analytics を作ります。Data Lake Store にサンプルデータを入れておきます。`Data Explorer` というボタンがトップページにあるのでクリックすると、Blob Storage のようなイメージでデータが格納できるようになっています。

<img width="621" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/b71841d8-cdb5-1fe9-6be5-503d599466b4.png">

[SearchLog.tsv](https://raw.githubusercontent.com/Azure/usql/master/Examples/Samples/Data/SearchLog.tsv)に公式のサンプルデータがあるので、アップロードしてみましょう。簡単に終了


<img width="629" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/caa4007b-028e-22ad-ea6f-e24a9f3d6862.png">

# U-SQL を Visual Studio で作成する


Visual Studio 2017で、Data Lake のテンプレートがあるので、それを使ってプロジェクトを作ります。Azure の DataLake とも接続できます。Data Lake エクスプローラがあるので、そこで、データをロカールにダウンロードしておきましょう。

## データのダウンロード

<img width="950" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/2385cb76-47ca-58ab-c387-90f2daadf237.png">


<img width="466" alt="04.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/d9a02f5e-c09a-8168-0d35-afc52f3b88a6.png">

## データから、U-SQL テンプレートの生成 


<img width="950" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/a4817f37-b054-ab95-db65-10ba2126b2e1.png">

<img width="931" alt="06.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/1afcd296-0acf-ec3b-273b-e9225c9eddf1.png">

先ほどアップロードしたデータが、Visual Studio からも見れるようになっています。`Preview` データを見ることができます。`Create EXTRACT Script` で、この場合は、tsv のデータ構造から、スクリプトのテンプレートを生成してくれます。これはラクですね。


## U-SQLの記述

U-SQL は、これらのデータに対してSQLを書いてデータの整形・分析が可能です。まるでRDBみたい。Hive を思い出します。
大体コードをみれば、想像がつくのではないでしょうか？ Join なども書くことができます。

<img width="931" alt="07.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/d2a32426-9fdd-b72a-c90f-597330c44ba4.png">


# 決定的なガイド

Data Lake はちょっ教えてもらっただけですが、csv, tsv みたいなデータをストアして、分析するには本当に楽な仕組みのようです。大量・大容量のデータも扱えます。じゃあ、このツールのハック力をあげようとしたらやはり、U-SQL を如何にうまく書けるか？になるでしょう。その場合、とってもいいページがあります。

* [U-SQL Tutorial ](https://saveenr.gitbooks.io/usql-tutorial/content/getting-started/intro.html)

これをやれば完璧らしいです。ガチで触るようになったら触ってみよう
Hello, Rust!

## はじめに
なんとなくはじめたアドベントカレンダーに付き合ってくれた皆、ありがとう。アドベントカレンダーて思ったより大変。
今日Rustを少し勉強してみたので、アドベントカレンダー27日目の記事では`Rust`で`hello world`をしたいと思う。

## 環境構築
### Rustupのインストール
Rustupはrustのインストールをするためのもの。nodejsでいうnodebrew的な立ち位置。

```
$ curl https://sh.rustup.rs -sSf | sh
$ source $HOME/.cargo/env
```

- 参考: https://www.rustup.rs/

### Rustのインストール
Rustには`nightly`, `beta`, `stable`がある。今回はRLSを使いたいので、本記事を書いた時に`rls-preview`がある`beta`版をインストール。`nightly`には`rls-preview`が無い時と有る時があるため、そのときは`beta`を使ってみたりするのがよい。

```
$ rustup install beta
$ rustup default beta
```

### RLS
Rust Language Serverとは、開発手助けツールみたいなもので、補完とか構文解析をしてくれる。

```
$ rustup component add --toolchain=beta rls-preview
$ rustup component add --toolchain=beta rust-src
$ rustup component add --toolchain=beta rust-analysis
```

- 参考: https://blog.rust-lang.org/2014/10/30/Stability.html
- 参考: https://qiita.com/skitoy4321/items/0bf6826f948720bed821

### VSCode
vscodeでRLS用の拡張を入れる。二種類あるが、次の拡張を推奨。

- https://marketplace.visualstudio.com/items?itemName=rust-lang.rust

vscodeでRLS拡張を使う時に注意する点で`settings.json`について。

- RLSで使うrustのchannelを使用しているchannelに設定すること。例えば、`beta`を使っているならば以下のように設定すること。

```settings.js
{
  "rust-client.channel": "beta"
}
```

## プロジェクトを作成
nodejsでいう`npm init`的な感じのフロー。`Cargo.toml`, `.gitignore`など基本セットを生成してくれる。

```
$ cargo new --bin hello-rust
$ cd hello-rust
$ code .
```

`src`以下に`main.rs`が作成されているので、このファイルを次のように編集。

```rust:src/main.rs
fn main() {
    println!("Hello, Rust!");
}
```

## Hello, Rust!
```
$ cargo run
```

```output.                                                                                                                                                                                   
Compiling hello-rust v0.1.0
 Finished dev [unoptimized + debuginfo] target(s) in 0.76 secs
   Running `target/debug/hello-rust`
Hello, Rust!
```

## Tutorial
- https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/learn-rust.html
PowerShellのみでpretty JSON

PowerShellのみでJSONの Pretty Print を実現してみました。

## モチベーション

- PowerShell標準の `ConvertTo-Json` のフォーマットが横に長いのが気に入らない。
- 外部のライブラリなしにスクリプトだけポンと置いて手軽に使いたい。
    - .NETなので Newtonsoft とか読み込んでも良いけどライブラリ握るのもちょっとヤなので。


## 内容

ソースコードは [gist][latest] にアップしたので全文はそちらを参照。

**2018/01/04 追記**
よくよく考えればインデント位置に合わせるよりカッコ数えた方が楽なことに気づいたのでロジック修正。
初版のソースは [こちら][init] 。


```PowerShell:元のオブジェクト
$person = @{
    name = 'kitamin'
    age = '3x'
    hobbies = @(
        'game'
        'programming'
    )
}
```

```PowerShell:PowerShell標準のJSON変換
# 前のカッコの位置から次のインデントが始まるので、プロパティ名が長いほどインデントが大きくなる _(:3」∠)_
PS> ConvertTo-Json $person
{
    "name":  "kitamin",
    "age":  "3x",
    "hobbies":  [
                    "game",
                    "programming"
                ]
}
```

```PowerShell:実装した関数、デフォルトはスペース4つでインデント
PS> ConvertTo-PrettyJson $person
{
    "name":  "kitamin",
    "age":  "3x",
    "hobbies":  [
        "game",
        "programming"
    ]
}
```

```PowerShell:インデント幅も変えられる
PS> ConvertTo-PrettyJson $person -IndentWidth 2
{
  "name":  "kitamin",
  "age":  "3x",
  "hobbies":  [
    "game",
    "programming"
  ]
}
```

```PowerShell:既存のJSON文字列も再整形できる
PS> ConvertTo-PrettyJson -Json @'
{
    "name":  "kitamin",
    "age":  "3x",
    "hobbies":  [
                    "game",
                    "programming"
                ]
}
'@

{
    "name":  "kitamin",
    "age":  "3x",
    "hobbies":  [
        "game",
        "programming"
    ]
}
```


## 仕組み

`ConvertTo-Json` で整形されたJSON文字列をベースに ~~インデントの位置を力技で整形してます。~~
以下のルールでインデントを制御しています (**2018/01/04 修正**)。

- 開きカッコ（`[`, `{`）が見つかったら **次の行** からインデントを一つ下げる
- 閉じカッコ（`]`, `}`）が見つかったら **今の行** からインデントを一つ上げる

```PowerShell:ConvertTo-PrettyJson(該当箇所)
if ($line -match '^\s*[\}\]]') {
    # カッコが閉じた
    $indentCount--
}

# 出力行の整形
$output = ($indent * $indentCount) + $line.Trim()
Write-Output $output

if ($line -match '[\{\[]\s*$') {
    # カッコが開いた
    $indentCount++
}
```

JSON文字列を渡した場合は書式を整えるために内部で `ConvertFrom-Json` -> `ConvertTo-Json` とやっているのでかなり効率は悪いけど、
今のところ細かいオブジェクトを表示用整形する時に使いたかっただけなのであまり問題にはなってないです。

----

## おまけ

そのうち内部処理をクラス化するかも。
PowerShellのクラスパフォーマンスとか実地取ってみたいのでそのサンプルとして。

**2018/01/04**
[内部処理のクラス化][class] をしてみた。
パフォーマンスとかは別の記事で書くかもです。

----

[latest]:https://gist.github.com/meian/e798451c7992c36c6fc411cec81b4f10/721424f735211ac5e678b4024b60beaffbdab3c8
[init]: https://gist.github.com/meian/e798451c7992c36c6fc411cec81b4f10/6d9e6dcd7ecadb493f95cd1cef415deac37b3397
[class]:https://gist.github.com/meian/e798451c7992c36c6fc411cec81b4f10#file-convertto-prettyjsonclass-ps1
Illustratorで味のある線のイラストを描こう

#はじめに
Illustratorでブラシを使わず味のある線のイラストの書き方をご紹介させていただければと思います。
何かの参考になりましたら幸いです。

#ベースを描く
ベースに猫のコックさんを描きました。
※こちらの描き方は省略させていただきます。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/202257/70dec6fa-002f-169f-f3d8-8a157b8fdba7.png)


#線を変形させる
今回面ではなく線で縁をとっております。
こちらの縁を変形させていきます。
変形には今回はオブジェクトに対してランダムなギザギザをつけてくれる「ラフ」という機能を使います。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/202257/416952de-1e96-29db-ffc3-b8669346d62b.png)
縁（わかりやすく黄色に変えた箇所）を選択します。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/202257/9ce0f3fa-77b6-590f-02fd-365cfbede3f9.png)
効果→パスの変形→ラフを押します。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/202257/aae86c5f-1bc8-3b2c-6165-fab87a96f06c.png)

プレビューにチェックを入れ画像をみながら各値を調整します。

![スクリーンショット 2017-12-27 10.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/202257/c4c51bb0-3ce2-d694-ab67-731302fbe049.png)

各項目で下記が設定できます。

- サイズ
    - ラフの深さになります。大きくなるほど変形が深くなります。
- 詳細
    - 変形させるポイントの間隔になります。大きいほど近く小さいほど遠くなります。
- ポイント
    - 変形させる線を丸くするかギザギザさせるかになります。

今回はマジックなどで描いたように少しガクガクした感じに仕上げたいので、サイズの値を小さく詳細を大きく、下記のように設定いたしました。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/202257/c07c18eb-3a77-d565-93f5-0709e07c66b6.png)

こんな感じになります。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/202257/0aa8950f-03bf-f376-b178-7192ebc7d197.png)

面にもかけられるので、スカーフにも同じ手順でかけて完成になります。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/202257/66bfaa6c-75e8-0d76-95a0-8a61d4e8eecb.png)

#最後に
効果でかけているため、あとからアピアランスで値の変更などもできるので、とても便利です。

![08.png](https://qiita-image-store.s3.amazonaws.com/0/202257/97795c43-a97e-cefd-65f6-2ab8bf7917ad.png)

また線のままアウトライン化もしていないためこのまま複製してポーズを変えたいなどの際にもそのままの線のニュアンスでポーズ違いを描けます。

![09.png](https://qiita-image-store.s3.amazonaws.com/0/202257/25e69acf-818c-9524-f913-ff8d16ae7fef.png)

おすすめの機能ですので、機会がありましたら使ってみてください。
ターミナルでsudoでも実行できなかった際の対処法

homebrewでphpのバージョンを7にあげようとしたら、Error: The /usr/local directory is not writable.が出てできなかった。
理由はmacのセキュリティ上の設定のせいだったらしい。

参考：
https://qiita.com/bohebohechan/items/720cc0f830f3222bf99d

上記を参考に、早速homebrewをアップデート。

```
brew update
Error: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.

You should probably change the ownership and permissions of /usr/local
back to your user account.
  sudo chown -R $(whoami):admin /usr/local
```

ここでsudo chown -R $(whoami):admin /usr/localを実行しても拒否されたので、ググって対応。

参考：
http://berukann.hatenablog.jp/entry/2015/12/30/123020

これで問題なくupdateができた。
CloudFrontの月間転送量をAWS CLIで取得する

CloudFrontの月間転送量をAWS CLIで取得するコマンドです。
そんなに難しくないだろうと思っていましたが、恥ずかしながらハマってしまったので、メモとして残しておきます。

AWSコンソールのCloudWatchでは期間を30日にしても、開始日と終了日がずれてしまい、正確な数値が取得できません。AWS CLIで開始日と終了日を指定することで、1ヶ月分の転送量やリクエスト数を取得することができます。

CloudFrontのメトリクスは、リージョンをus-east-1と指定する。ここまではよかったが....、下記のコマンドではデータが取得できない。

```
$ aws cloudwatch get-metric-statistics \
   --namespace "AWS/CloudFront" \
   --dimensions Name=DistributionId,Value=XXXXXXXXXXX \
   --metric-name "BytesDownloaded" \
   --statistics Sum \
   --start-time "2017-10-01T00:00:00+09:00" \
   --end-time "2017-11-01T00:00:00+09:00" \
   --period 2678400 \
   --region us-east-1
{
    "Datapoints": [], 
    "Label": "BytesDownloaded"
}
```


AWSのドキュメントによると、CloudFrontのメトリクスは、下記のディメンションを2つ指定する必要ありました。

| ディメンション | 説明 |
|:-----------|:------------|
| DistributionID | メトリクスを表示するディストリビューションの CloudFront ID。 |
| Region | メトリクスを表示するリージョン。この値は、Global である必要があります。Region ディメンションは、CloudFront のメトリクスが保存されているリージョン (米国東部（バージニア北部）) とは異なります。 |


```
$ aws cloudwatch get-metric-statistics \
    --namespace "AWS/CloudFront" \
    --dimensions Name=DistributionId,Value=XXXXXXXXXXX Name=Region,Value=Global \
    --metric-name "BytesDownloaded" \
    --statistics Sum \
    --start-time "2017-10-01T00:00:00+09:00" \ 
    --end-time "2017-11-01T00:00:00+09:00" \
    --period 2678400 \
    --region us-east-1 \
{
    "Datapoints": [
        {
            "Timestamp": "2017-09-30T15:00:00Z", 
            "Sum": XXXX.0, 
            "Unit": "None"
        }
    ], 
    "Label": "BytesDownloaded"
}
```


##参考サイト
AWS の名前空間
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/aws-namespaces.html

Amazon CloudFront のメトリクスおよびディメンション
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cf-metricscollected.html
nginxが再起動しないなんて、たった1文字で事足りる。

# それはSSL対応させようとしていたときのことでした。
1.nginxを再起動しようとする。

```service nginx restart```

その時、
<img width="634" alt="スクリーンショット 2017-12-27 18.41.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/5ef949e2-10b1-1ab7-15a8-ecd571d6e236.png">
**Job for nginx.service failed?????**

し〜っぱいしちゃった〜よ〜〜（『日常』風に）
<img width="200" alt="スクリーンショット 2017-12-27 18.44.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/c05b4012-939b-dae1-4251-e7847d5b5bcf.png">



# とりあえずログを見たい。
お告げの通りに確認してみる。

```
systemctl status nginx.servce
```
<img width="400" alt="スクリーンショット 2017-12-27 18.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/a53525fe-1bdb-dc44-44e8-3b6edefef680.png">

なんかHTTPとかプロキシサーバあたりを言っている？
↓
SSL対応中のことだけどこれだと今の自分では何も推測できない。

### もう１つのお告げの方で確認してみる。

```
journalctl -xe
```

<img width="500" alt="スクリーンショット 2017-12-27 18.56.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/fc37f357-32da-3baa-bd41-2a7bc1c2e7b7.png">

**あ、なんか言ってる。**

BIO_new_file???
そんなところいじった覚え無いぞ。。
というか、/etc/kusanagi.de/..って、そんなディレクトリは見当たらんぞ？

#### と、ここで答えが出ているにも関わらず、更に数時間悩みます。

そして...

<img width="331" alt="スクリーンショット 2017-12-27 19.02.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/42d5df11-7e16-fe25-4560-4428376a8ebe.png">

あった。

## 結局
nginx/conf.d配下にsslのコンフィグファイルがあったのですが、そこのcrtファイルのパスを設定していた時に1文字無駄に入っていたということでした。

この後、nginxは再起動ができたとさ。ﾁｬﾝﾁｬﾝ

## 教訓：エラーログの見方はもっと理解しておくべし。

nginxさん親切なログ、ありがとうございました。
Cognos TM1 の自己学習教材

##Cognos TM1 の自己学習用教材を公開します

Cognos TM1やPlanning Analyticsでも、自分で学んでみようという方向けに自己学習ができるように作成してあります。
インフラのスキルも、アプリのスキルもカバーしています。

是非Cognos TM1のスキルアップにご活用下さい。

**インストール**
https://www.slideshare.net/ShinsukeYamamoto/01-tm1-install

**TM1パラメーター**
https://www.slideshare.net/ShinsukeYamamoto/02-tm1-parameter

**ログ出力管理**
https://www.slideshare.net/ShinsukeYamamoto/03-tm1-housekeeping

**バックアップ・リストア**
https://www.slideshare.net/ShinsukeYamamoto/04-tm1-backuprestore

**バッチの実行**
https://www.slideshare.net/ShinsukeYamamoto/05-tm1-batch

**ユーザー・権限管理**
https://www.slideshare.net/ShinsukeYamamoto/06-tm1-user

**監査**
https://www.slideshare.net/ShinsukeYamamoto/07-tm1-audit

**TM1サーバー追加**
https://www.slideshare.net/ShinsukeYamamoto/08-tm1-addserver

**環境移行**
https://www.slideshare.net/ShinsukeYamamoto/09-tm1-migration

**データ複製・同期**
https://www.slideshare.net/ShinsukeYamamoto/10-tm1-replication

**パフォーマンスモニター**
https://www.slideshare.net/ShinsukeYamamoto/11-tm1-performancemonitor

**OperationsConsole**
https://www.slideshare.net/ShinsukeYamamoto/12-operations-console

**オブジェクト操作**
https://www.slideshare.net/ShinsukeYamamoto/13-tm1-object-85074685

**TurboIntegrator**
https://www.slideshare.net/ShinsukeYamamoto/14-tm1-turbointegrator

**Rule**
https://www.slideshare.net/ShinsukeYamamoto/15-tm1-rule

**ドリルスルー**
https://www.slideshare.net/ShinsukeYamamoto/16-tm1-drillthrough

**SandBox**
https://www.slideshare.net/ShinsukeYamamoto/17-tm1-sandbox

**ExcelAddin**
https://www.slideshare.net/ShinsukeYamamoto/18-tm1-exceladdin

**ActiveForm**
https://www.slideshare.net/ShinsukeYamamoto/19-tm1-activeform

**TM1Web**
https://www.slideshare.net/ShinsukeYamamoto/20-tm1-web

**WebConfig**
https://www.slideshare.net/ShinsukeYamamoto/21-tm1-webconfig

**Webシート**
https://www.slideshare.net/ShinsukeYamamoto/22-tm1-websheet

**PerformanceModeler**
https://www.slideshare.net/ShinsukeYamamoto/23-tm1-performancemodeler

**WorkflowApplication**
https://www.slideshare.net/ShinsukeYamamoto/24-tm1-workflowapplication
ctagsの設定ファイルの配置場所が変更された

おもむろに最新のctagsを使いたくなりソースからbuildしてみたら、独自の設定が効かなくなり、タグが生成されなくなった。

[universal-ctags/ctags](https://github.com/universal-ctags/ctags)

原因は以下のコミットで、今まで`~/.ctags`に置いておけば読み込まれた設定ファイルが読み込まれなくなったためだった。

[universal-ctags/ctags/commit/ce0617a7](https://github.com/universal-ctags/ctags/commit/ce0617a7)

新しい置き場は以下

- `$HOME/.ctags.d/*.ctags`  ※ `$HOME`が定義されていた場合
- `$HOMEDRIVE$HOMEPATH/ctags.d/*.ctags`  ※ `$HOMEDRIVE`と`$HOMEPATH`の両方が定義されていた場合
- `.ctags.d/*.ctags`
- `ctags.d/*.ctags`

ひとまず最新のmasterブランチの`ctags`では、`~/.ctags.d/config.ctags`というパスにファイルを置くことで設定が読み込まれたので一件落着。
QiitaのCSS構成2017

この投稿は [Increments Advent Calendar 2017](https://qiita.com/advent-calendar/2017/increments) の18日の記事です。去年に続き、2017年の Qiita の CSS 構成について述べます。

2016年版はこちら: [QiitaのCSS構成2016](https://qiita.com/morishitter/items/c8773b6ca69b3576626a)

## プリプロセッサー

2016年は CSS のビルドフローで一貫して PostCSS を使っていましたが、2017年では プリプロセッサーとして Sass (node-sass) を使っています。

プリプロセッサーとして PostCSS を使わなくなった最大の理由は [@apply ルールが仕様から落ちた](https://www.xanthir.com/b4o00) ことです。`@apply` は Sass でいう引数なしの mixin みたいなもので、Chrome の Canary では実装されていた時期がありましたが、消えてしまいました。

おそらく [CSS Nesting Module](http://tabatkins.github.io/specs/css-nesting/) や [CSS Extend Rule](http://tabatkins.github.io/specs/css-extend-rule/) も落ちると思われるので、今後標準化されている CSS の構文では冗長でない記述ができないと判断しました。PostCSS のプリプロセッサー用のプラグインの導入の基準は、「今後 CSS の仕様として入る可能性が（少しでも）あるかどうか」だったので [postcss-mixins](https://github.com/postcss/postcss-mixins) などは使わず、潔く Sass に切り替えました。

Sass はよくできていて便利だし、コミュニティも発達していてなくなる気配を感じません。不満を感じることもありますが、Sass はこういうものだと割り切って書いています。PostCSS の独自プラグインを書いて拡張していたときと比べ、コードの手離れも良くなったと思います。

## 最適化

PostCSS を完全に捨てたわけではなく、コードの最適化をする際に利用しています。利用しているプラグインは以下の3つです。

- [autoprefixer](https://github.com/postcss/autoprefixer)
- [postcss-flexbugs-fixes](https://github.com/luisrudge/postcss-flexbugs-fixes)
- [csswring](https://github.com/hail2u/node-csswring)

最適化のプロセスは去年から変わっていません。近い将来 autoprefixer と postcss-flexbugs-fixes が不要になるのを待ち望んでいます。

## コードリント、フォーマット

2016年は CSS のリンターとして [Stylelint](https://github.com/stylelint/stylelint) を使っていましたが、今は使っていません。CSS における機械的なリントというものが何なのかが自分の中で定まらなくなり、デザインの意図通りの記述ができているのかをレビューしています。つまり僕が CSS リンターです。

フォーマッターについては [Stylefmt](https://github.com/morishitter/stylefmt) は捨て、[Prettier](https://github.com/prettier/prettier) に従うようにしました。

## アーキテクチャー

Qiita 開発チームはデータドリブンなので、[デザインリニューアル](http://blog.qiita.com/post/168173551204/qiita-design-update)の際も一部のユーザーの皆様にベータ版を使っていただき、そのログやフィードバックから UI を調整しています。

その際、実装した UI を捨てやすくするために、[ECSS](http://ecss.io/) という設計手法を参考にしています。[^1]

### ディレクトリ構成

`/stylesheets` 以下のディレクトリ構成は以下の用になっています。

```
$ tree -L 1
.
├── base
├── index.scss
├── mixins
├── namespaces
├── pages
├── settings
├── styleguide.scss
└── utilities
```


index.scss がアプリケーション用の、styleguide.scss がスタイルガイド用のエントリーファイルです。

settings ではカラーパレットや設定などを Sass のグローバル変数で定義しています。mixins は Sass の mixin を定義しています。ECSS に習ってルールセットはあまり再利用しようとせず捨てやすくしていますが、mixin としてデザインの意図にあった宣言に名前を付けています。

namespaces 以下のディレクトリ構成は次のようになっています。

```
$ tree -L 1
.
├── Item
├── Ranking
├── Structure
├── TagFeed
├── Timeline
├── Trend
...
```

大きな機能ごとに namespace を切り、その下にコンポーネントを定義しています。その各コンポーネントをスタイルガイドで一覧できるようにしています。pages ではその各コンポーネントをレイアウトしています。そして utilities は汎用クラス。

---

2017年の Qiita は上記のような構成で CSS を書いてきました。実装についても [Qiita の新記事ページのレイアウト実装](https://qiita.com/morishitter/items/c4aa500929f2de441bfd) に書いたような比較的チャレンジングなことをしているので、合わせて読んでみて下さい。

また、JavaScript ではもっとチャレンジングなことをしているので、こちらもおすすめ :) 

[新QiitaでReactをやめてhyperapp採用した背景 - Qiita](https://qiita.com/yuku_t/items/2839e57a1933507f36b4)

[^1]: ECSS については次の連載記事がおすすめです。[抽象化を避けるCSS設計方法論「Enduring CSS」 | HTML5Experts.jp](https://html5experts.jp/series/ecss/)
C++ Builder 10.2 Tokyo > IDE > Bug > カーソル位置の変数の詳細表示は最初の一回しか実行されない | 回避策

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
RAD Studio 10.2 Tokyo Update 3
```

RAD Studioではブレークポイントで止めたとき、コードの各場所にカーソルを置くと、その地点の変数や関数の内容が表示される機能がある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b8cb2cfc-dc95-4e83-12ac-1c7e8dc3daf9.png)

10.2 Tokyoにおいて、上記が表示されない状況が見つかった。

再現手順

1. procDate1上にカーソルを置く
    - procDate1の内容が表示される (正常)
2. procDate2上にカーソルを置く
    - procDate2の内容が表示されない (不具合)
    - procDate1に再度カーソルを合わせても表示されない

手順2において、StrToDate()や他の関数上にカーソルを置いた場合は関数の詳細情報は表示される (正常)。
変数に対する処理が失敗しているのかもしれない。

XE4では手順2においてもきちんと表示されていた。

デバッグ作業の効率が下がる。

### code 

```Uni1t.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <stdint.h>

#include <memory>
#include <DateUtils.hpp>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TDate procDate1 = StrToDate(L"2016/07/07");
	TDate procDate2 = StrToDateTime(L"2016/07/07 12:30:45");
}
```

### 備考
(追記 2018/01/09)

上記の不具合が発生するのはTDateTime型の変数を表示してからかもしれない。

いったん表示されなくなると、「監視式」に変数を表示させようとしても「????」になる。

### とりあえずの回避策
(追記 2018/01/09)

**変数の詳細表示がされないのはデバッグ時の作業効率を大きく低減する。**

回避策としては以下を行う。

1. 変数をダブルクリック
2. ドラッグして「監視式」ペインにドロップ
3. 次の変数に対して手順１から繰り返す

詳細表示後にバグるため、詳細表示でなく監視式を使う。
アジャイル開発とは

#アジャイル開発とは
https://qiita.com/sinaku-developer/items/bd74bde161b640b75b70
http://tracpath.com/works/devops/agile-vs-waterfall/

#SAPでアジャイル開発
https://www.infoq.com/jp/news/2011/11/21
https://www.infoq.com/jp/articles/limits-of-agile

基幹系でアジャイル開発
https://mendix.buildsystem.jp/mx-blog-5-reasons-why-agile-fails-and-how-to-fix-it/

#日本にはなじまない？
https://japan.zdnet.com/article/35003408/
C++ Builder 10.2 Tokyo > 正規表現 > XE4で出ていたエラーは解消 > `toupper`が....System.RegularExpressionsAPIから参照されています | (XE4から10.2Tokyoへの移行)

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

XE4では正規表現の処理を使用時、「プロジェクトオプション > パッケージ > 実行時パッケージ > 実行時パッケージを使ってリンク をfalse」にするとエラーが出ていた。
[c++ builder XE4 > 正規表現 > `toupper`が....System.RegularExpressionsAPIから参照されています > IDE環境を変更しない対応方法](https://qiita.com/7of9/items/61955e00d0138e272a1a)

10.2 Tokyoにおいては、このエラーは発生しなくなっている。

XE4のコードから10.2 Tokyo対応する場合は、「IDE環境自体を変更する必要がない方法」に加えた余分なコードを削除していいだろう。
フローデザイナーの見た目をかっこよくしてみる

#はじめに
ASTERIA WARPのフローデザイナーの見た目をかっこよくしたい！
ということで、まずはフォントにアンチエイリアスをかけてみます。

*注意
設定ファイルをいじるので、バックアップをとってください。

#手順
フローデザイナーのインストールフォルダーにFlow Designer.laxというファイルがあるので、テキストエディタで開きます。
次の行の末尾に、
`lax.nl.java.option.additional=-Xmx1024m -Djava.endorsed.dirs=lib\\endorsed -Dasteria.library.path=native
`
スペースを空けて次のパラメーターを追加して
`-Dawt.useSystemAAFontSettings=on
`

フローデザイナーを再起動します。

#結果
![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/151881/081ba3f8-a0c7-d14b-8e28-5a06b81965ce.png)
wildflly10 java8 でERROR [org.jboss.jca.core.tx.jbossts.XAResourceRecoveryImpl] (Periodic Recovery) IJ000906　エラーが出た場合の対処法

standalone.xmlの、以下の記述が使用できないときなど発生するみたいです。

```
<xa-datasource-property name="Encoding">
　　UTF8
</xa-datasource-property>
```

xa-datasource-propertyで指定できないものを指定していた場合
に発生するエラーのようです。
僕の場合DB接続まわりでEncodingを指定していた事で発生していました。
この要素、:before :after、付けれる、付けれない、どっち？？

HTMLの各要素に擬似要素 ":before"":after"がつけれるかどうか、ぱっと見わかるドキュメントがなかったので（探しもれ？読み込み不足。。。？）作ってみました。

結果は→[CODEPEN:https://codepen.io/nieve/pen/JMEpPJ](https://codepen.io/nieve/pen/JMEpPJ)
（※ざっくり作りすぎで見づらくてごめんね。 ※2017/12/28 作り直しました！）

各要素に

```css:
:before{
   content: "<"attr(data-tag)">before";
}
:after{
   content: "<"attr(data-tag)">after";
}
```
を設定してます。

###要約

↓が付かないようです。（他、見落としてるかも。）

```
<html> <title> <link> <meta> <script> <noscript> <style> <body> 
<br> <wbr>
<audio> <video> <embed> <noembed> <param> <canvas>
<table>以外のtable要素関係（<tr>とか<caption>とか）
<input> <textarea> <select> <datalist>
<dialog>
<image> <iframe> <svg> <svg>  
```
(※2017/12/28 ↑中身修正しました)

意外と、普通にsvg関連にも付くんだね。
CacooでGCPの構成図を書こうと思ったらアイコンに文字がなくて辛かった（文字付きアイコン公開）

# 経緯
仕事ではAWSばかり使っているのですが、個人的に少しGCPを使っています。
それぞれ設計哲学が違うので、使用していると色々見えてくるものがあります。

仕事でAWSの構成図を書く際は[Cacoo](https://cacoo.com/)で書くことが多いです。
GCPのステンシルも公開されているということで、確認したところステンシルにアイコンのみが表示されていて、**どれがどのサービスだか分かりません**。（一応マウスオーバーするとサービス名は出る）

![Untitled_Untitled_-_Cacoo.png](https://qiita-image-store.s3.amazonaws.com/0/226913/1092927d-9f35-4346-b2c0-43754d272c2f.png)

**同じアイコン多いよ！！！**

# 解決
## サービス名をアイコンに付けた
私のような難民が生まれないように各サービス名を付与しました。
併せて、一部古いアイコンは新しいものにしています。

![GCPアイコン一覧（文字つき）.png](https://qiita-image-store.s3.amazonaws.com/0/226913/6093cbe6-d4cb-4030-1a8b-d22388ec5416.png)

## 公開
ステンシルとして共有できればいいのですが、ストア無くなっちゃったので出来ません…
URLを公開しますので、使いたい人は自分のところにコピーしてよしなに使って下さい。

https://cacoo.com/diagrams/w2kyhFxPN9GsxkrZ

「図の操作」から「コピー」でいけます。
<img width="247" alt="Cacoo_-_GCPアイコン一覧.png" src="https://qiita-image-store.s3.amazonaws.com/0/226913/38aa5033-a273-d2df-a16f-a091daa6cf4a.png">

おかしな所があったら教えてください。
Sparkでコサイン類似度を求める


たまに、レコードが持つ変数間でコサイン類似度を計算したい時があるので、備忘として書いておく

なお、以下の例で扱うデータは、適当なIDと紐づけられたベクトルをもつデータフレームとする。

```python:データ例

from pyspark.mllib.linalg import Vectors

data = sc.parallelize([
    ("a", Vectors.dense([0, 1, 2])),
    ("b", Vectors.dense([3, 4, 5])),
    ("c", Vectors.dense([6, 7, 8])) 
]).toDF(["id", "features"])

```


## 1対1で計算する

ベクトル型の関数を定義して、コサイン距離を計算する。
指定の組み合わせで計算する場合はこちらが楽。

```python:1対1のコサイン類似度計算

# 適当に交差結合で組み合わせデータ
_data = data.select(col("id").alias("_id"), col("features").alias("_features"))
tgt_data = data.crossJoin(_data)

# コサイン類似度を計算
dist_data = tgt_data.rdd.map(
    lambda r: (r.id, r._id, r.features.dot(r._features) / (r.features.norm(2) * r._features.norm(2)) )
).toDF(["id", "_id", "similarity"])

```

※UDFを定義して計算する方法もあるが、ここでは使用していない。

## 全対全で計算する

1対1の指定の組み合わせで計算する場合の手順を拡張してもいいが、
RowMatrixのColumnSimilaritiesを使うと簡単。

DIMSUMを利用しているこちらの方が加工の手間を差し引いても(多分)計算量が少なくなる。

20180510 追記：
要素に欠損値があると、0として扱われて計算されるらしく、コサイン類似度で得たい結果を得ることができない。

```python:全対全のコサイン類似度計算

from pyspark.mllib.linalg.distributed import CoordinateMatrix, MatrixEntry

# RowMatrixに変換
mat = RowMatrix(data.select("features").rdd.map(lambda r: r.features))

# RowMatrixを転置
mat_t = \
CoordinateMatrix(
    mat.rows.zipWithIndex().flatMap(
        lambda x: [MatrixEntry(x[1], j, v) for j, v in enumerate(x[0])])
).transpose()
 
# コサイン距離を全パターンで計算し、DF化
dist_mat = \
mat_t.toRowMatrix().columnSimilarities() \
.entries.map(lambda r: (r.i, r.j, r.value)).toDF(["i", "j", "similarity"])

```

## 関連
 - [spark の DIMSUMで類似度計算](https://qiita.com/khkblue/items/87372b6c59a0c735268f)
テスト自動化ツール「selenium webdriver」最初の一歩

Web開発を行っていると避けては通れないブラウザでのテスト。
Seleniumというツールを使って自動化したいと思います。

今回私はrubyのバージョンを変更したくない等の諸事情により仮想環境を新たに準備してそちらで行うようにしました。

- ホストOS：Windows7
- ゲストOS：ubuntu14.04
- ruby2.1
- selenium-webdriver 3.8.0

#vagrantでubuntu環境を構築
偉大なる諸先輩方の記事を参考にさせていただきます。

- https://qiita.com/ra_armz/items/1ca31edf40767ba0d719
- https://qiita.com/mhagita/items/8f339106c3b48eb098ca

最新バージョンとか調べずにやってしまったのでubuntu14を入れてしまいました。
最終的にseleniumさえ動けばいいので特に気にせず進めます。笑

#rubyインストール
ruby2.1をインストール

- https://www.oiax.jp/rails/zakkan/apt-get-install-ruby2-1.html

ruby-devがないとgem installでエラーになるので入れる

```
$ sudo apt-get install ruby2.1-dev
```

#selenium-webdriverインストール

```
$ sudo gem install selenium-webdriver
```

```
$ gem list|grep selenium
selenium-webdriver (3.8.0)
```

#さっそくサンプルを実行してみる
```
$ vi sample.rb
$ cat sample.rb 
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
#driver.quit
```

```
$ ruby sample.rb 
/var/lib/gems/2.1.0/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/common/service.rb:57:in `binary_path':  Unable to find Mozilla geckodriver. 
Please download the server from https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH. 
More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver. 
(Selenium::WebDriver::Error::WebDriverError)
```

はい、怒られました。
指示に従いまして、、、

```
$ wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux32.tar.gz
$ tar -zxvf geckodriver-v0.19.1-linux32.tar.gz
$ sudo cp ./geckodriver /usr/local/bin
```

再チャレンジ

```
$ ruby sample.rb 
```

Firefoxが無事起動！＼(^o^)／



#【おまけ】
デフォルト設定のままだとプロンプトが長すぎるので変更する

```
$ cd
$ vi .bashrc

追記
export PS1="\u@ubuntu14 \W\$ "

設定変更を反映
$ source .bashrc
```
react-native-snap-carouselの基本

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

react-native-snap-carouselはreact-nativeにおけるcarouselの決定版だ（今のところ）
自作した方が柔軟性は高いが、、、
基本的な使い方は以下のような感じ

```react
import React, { PureComponent } from "react";
import { Dimensions, StyleSheet, View } from "react-native";

import Carousel from "react-native-snap-carousel";

export default class ExampleCarousel extends PureComponent {
  state = {
    data: [{}, {}, {}, {}, {}, {}]
  };

  renderItem = () => <View style={styles.tile} />;

  render() {
    return (
      <View style={styles.container}>
        <Carousel
          data={this.state.data}
          renderItem={this.renderItem}
          itemWidth={Dimensions.get("window").width * 0.85}
          sliderWidth={Dimensions.get("window").width}
          containerCustomStyle={styles.carousel}
          slideStyle={{ flex: 1 }}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    height: 300
  },
  carousel: {
    flex: 1,
    backgroundColor: "red"
  },
  tile: {
    flex: 1,
    width: Dimensions.get("window").width * 0.85,
    backgroundColor: "yellow"
  }
});
```
こんな感じでスワイプできる写真が簡単に出来る
![スクリーンショット 2017-12-27 17.38.44.png](https://qiita-image-store.s3.amazonaws.com/0/183835/8a497f08-4d20-9149-057d-2f692c625605.png)

TouchableOcacityを絡めたい時は、

```react
renderItem = () => <View style={styles.tile} />;
```

を

```react
  _onPressCarousel = () => {
    // here handle carousel press
  };
  renderItem = () => (
    <TouchableOpacity onPress={this._onPressCarousel} style={styles.tile}>
      <Image style={styles.button} source={require("../img/Sample.jpg")} />
    </TouchableOpacity>
  );
```
上の様にに書き換えればok
いいね欲しいです

loopでループさせることが出来、
autoplayで、自動再生出来る。
enableMomentumで指を離した時、ゆっくりスライドを元の位置に戻すようになる。
これは横移動に時間がかかるのでおすすめしない。

```react
      <Carousel
        data={this.state.data}
        renderItem={this.renderItem}
        itemWidth={width * 0.85}
        sliderWidth={width}
        containerCustomStyle={styles.carousel}
        slideStyle={{ flex: 1 }}
        keyExtractor={this._keyExtractor}
        loop
        autoplay
      />
```
parallaxImageを使うと、立体的に見せてくれるそうですが、
まだ使い方が分からないw
Nginx で http2 を使う

https が使える状態のサーバーで、http2 が使えるようにしました。

nginx.conf の
server listen を次のように変更します。
http2 を加えるだけです。

```text
    server {
listen  443 ssl http2;
```

変更後、nginx を再起動します。

```bash
sudo systemctl restart nginx
```

変更前のヘッダー

```text
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Wed, 27 Dec 2017 08:40:56 GMT
Content-Type: text/html
Content-Length: 1958
Last-Modified: Tue, 14 Nov 2017 21:11:54 GMT
Connection: keep-alive
ETag: "5a0b5c1a-7a6"
Accept-Ranges: bytes
```

変更後のヘッダー

```text
HTTP/2 200 
server: nginx/1.10.2
date: Wed, 27 Dec 2017 08:42:57 GMT
content-type: text/html
content-length: 1958
last-modified: Tue, 14 Nov 2017 21:11:54 GMT
etag: "5a0b5c1a-7a6"
accept-ranges: bytes
```

ヘッダーを確認するスクリプト

```bash
curl -I https://example.com
```

Ubuntu の場合は、/etc/nginx/sites-available/default
を編集します。
Go言語で学ぶコンピュータサイエンス (データ構造とアルゴリズム編①)

## データ構造とアルゴリズム
ソートアルゴリズムやグラフ、連結リストなどがこの分野の中でよく扱われます。
今回はこの分野の中の、木構造の代表例である、**バイナリツリー**を扱います。

## バイナリツリーとは
バイナリツリーとは、一つのノードが最大で2つのノードを持ち、それらが連鎖的に組み合わさってできるデータ構造です。
実際にコードを使いながら説明していきます。今回は、`node`型と`tree`型を定義します。

```binary_tree.go
type node struct{
    value int
    left_node *node
    right_node *node
}
```
一つのノードは、ノード本体の値と、保有しているノードのポインタを持つという構造です。

```binary_tree.go
type tree struct{
    top_node *node
}

```
treeは、一番上のノードのみを持つ構造です。このtreeに、最大値を求める関数や、値を挿入する関数をインターフェースとして実装していきます。

## 実装
#### 挿入
```binary_tree.go
func (t *tree) _insert(current_node *node, num int) (*node){
    if current_node == nil {
        n := &node{num, nil, nil}
        return n
    }

    if current_node.value < num {
        current_node.right_node = t._insert(current_node.right_node, num)
    }
    if current_node.value > num {
        current_node.left_node = t._insert(current_node.left_node, num)
    }
    return current_node
}

func (t *tree) insert(num int) (){
    t._insert(t.top_node, num)
}

```
今回は、バイナリサーチツリーという、探索を容易にするためのデータ構造を実装します。
ルールとしては、ある値をいれたいときに、既存のノードより大きい場合は右側に、小さい場合は左側に挿入するというものです。
データを挿入するためには、再帰呼び出しを使って効率よく挿入先を探索し、そこに`&`を使って挿入します。

### 最大値
```binary_tree.go
func(t *tree) _max(current_node *node) (int) {
    if (current_node.right_node == nil){
        return current_node.value
    }
    t_max := t._max(current_node.right_node)
    return t_max;
}
func(t *tree) max() (int){
    return t._max(t.top_node)
}
```
こちらも再帰呼び出しを使って探索をします。挿入の時点で、探索を容易にするように実装しているので、簡単に最大値を呼び出すことができます。

## 実験
```binary_tree.go
func main(){
    top_node := &node{10, nil, nil}
    t := &tree{top_node}
    t.insert(11)
    t.insert(9)
    t.insert(13)
    t.insert(8)
    t_max := t.max()
    fmt.Println(t_max)
}
```

実際に呼び出してみると、ちゃんと最大値が出力されていることがわかります。
全てのコードは[こちら](https://github.com/yamad07/computer_science_by_go/blob/master/algorithm_and_data_structure/binary_tree.go)に上がっているので、ご参照ください。

### まとめ
今回は、バイナリツリーを実装し、木構造の概念についての理解を深めました。
時間があるときに、もっといろんな種類のデータ構造を実装してみようと思います。
【React Native】react-native-navigation導入 for iOS

## 1.インストール
"react-native link"を行うと、ネイティブに関わる修正を自動行う
しかし、一部手動で設定する必要がある。
自動で設定される手順:＊自動＊
手動で設定する手順　:＊手動＊
＊自動で設定される手順もバージョンによってされない可能性があるので、
設定されているか確認する必要がある。

```
npm i -save react-native-navigation@latest
react-native link
```

## 2.ライブラリの追加＊自動＊
下記のライブラリファイルをドラック&ドロップでxcodeに追加
ライブラリファイル：ReactNativeNavigation.xcodeproj
ファイルパス　　　：./node_modules/react-native-navigation/ios/ReactNativeNavigation.xcodeproj

## 3.ライブラリをリンクする(表現が適切か不明)＊自動＊
手順2.で追加したライブラリをxCode上の下記の追加先項目にドラック&ドロップで追加
ファイル　：libReactNativeNavigation.aを下記の項目に追加
追加先項目：Libraries > Add files to [project name] > Build Phases tab (タブの右のほう). > In the Link Binary With Libraries

## 4.下記のパスを追加＊手動＊
パス：$(SRCROOT)/../node_modules/react-native-navigation/ios


## 5."AppDelegate.m"の編集＊手動＊
この設定を行うと、起動時に読み込まれるファイルが、
'index.js'から'index.ios.js'に変わる
編集するファイル：ios/reactNativeApp/AppDelegate.m
下記のソースをで上書く

```
#import "AppDelegate.h"
#import <React/RCTBundleURLProvider.h>

// **********************************************
// *** DON'T MISS: THE NEXT LINE IS IMPORTANT ***
// **********************************************
#import "RCCManager.h"

// IMPORTANT: if you're getting an Xcode error that RCCManager.h isn't found, you've probably ran "npm install"
// with npm ver 2. You'll need to "npm install" with npm 3 (see https://github.com/wix/react-native-navigation/issues/1)

#import <React/RCTRootView.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSURL *jsCodeLocation;
#ifdef DEBUG
//  jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
#else
   jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif


  // **********************************************
  // *** DON'T MISS: THIS IS HOW WE BOOTSTRAP *****
  // **********************************************
  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  self.window.backgroundColor = [UIColor whiteColor];
  [[RCCManager sharedInstance] initBridgeWithBundleURL:jsCodeLocation launchOptions:launchOptions];

  /*
  // original RN bootstrap - remove this part
  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"example"
                                               initialProperties:nil
                                                   launchOptions:launchOptions];
  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];
  */
  

  return YES;
}

@end
```

## 6.初期読み込みファイル追加
index.ios.jsを追加

## 参考
###### ドキュメント 
https://wix.github.io/react-native-navigation/#/installation-ios
###### スクリーンショット
https://facebook.github.io/react-native/docs/linking-libraries-ios.html
fabric では、use_ssh_config を使うか(自分用のメモ)

use_ssh_config を使うと、get(x,y,use_sudo=True) のように、use_sudo の指定があると、パスワードを要求されるが、パスワードをいれても、sudo できず、エラーになることがあるみたい。そこで、use_ssh_config は、False にしてつかうのがいいらしいです。

詳細には検証していないので、間違いかもしれません。
Cognosレポートの多言語対応(その4)

前回の続きでCognosのレポートを多言語対応化する方法その4です。

ひとつ前の記事
[Cognosレポートの多言語対応(その3)](https://qiita.com/hayakumi/items/81c563f427752a2a52f6)

#第4回 レポート名の表示切替

レポート名が日本語のままだと英語圏のユーザーが読めないのでレポート名も変更しておきます。	
	
レポート名のプロパティを選択
![20171227_002519_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/549ee736-af03-0955-3d14-088032955827.png)

全般 -> 言語 -> 設定
![20171227_002520_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/97a8fbaa-e368-4902-d016-f287ca1e6510.png)

「言語」を切り替えながら、各コンテンツ言語で表示するレポート名を設定します。
![20171227_002521.png](https://qiita-image-store.s3.amazonaws.com/0/147248/91ded124-4207-f86e-7b5e-7bb3a3efbb76.png)

![20171227_002522.png](https://qiita-image-store.s3.amazonaws.com/0/147248/67b0e76d-f039-acb9-a3dc-0e207b354966.png)

##実行結果
	
日本語ロケールのユーザーがログインしたとき
![20171227_002523_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/5efcef46-56de-c5b8-4034-a2b7a340362a.png)

英語ロケールのユーザーがログインしたとき
![20171227_002524_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/190ca77c-5dae-190c-41d0-de6b0880839c.png)

以上、4回にわたってCognosレポートの多言語対応方法をご紹介しました。
ご参考になりましたら幸いです。
Cognosレポートの多言語対応(その3)

前回の続きでCognosのレポートを多言語対応化する方法その3です。

ひとつ前の記事
[Cognosレポートの多言語対応(その2)](https://qiita.com/hayakumi/items/02b40c6fa04a2af40dfc)

#第3回 レポートのテキスト表示変更

Cognosレポート内にあるテキスト部分の表示を、コンテンツ言語によって切り替える手順です。レポート編集画面から操作します。

##1.言語変数の作成

変数 -> 言語変数を新規作成を選択
![20171128_002435_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/6dfc7297-559c-c05d-416e-7df0e2e5d9fe.png)


任意の変数名を入力し、英語と日本語にチェックを入れてOK
![20171128_002436.png](https://qiita-image-store.s3.amazonaws.com/0/147248/f7ac70c0-37e7-3762-380d-520942c9afe1.png)

##2.テキスト部分の表示変更

テキストアイテムや列タイトルのテキスト部分を選択し、プロパティから「テキストソースの変数」を選択
![20171128_002438.png](https://qiita-image-store.s3.amazonaws.com/0/147248/22b96bce-bd9e-e42b-16fa-76b4e79deb97.png)
	
	

作成しておいた言語切り替え用の変数を選択してOK
![20171128_002439.png](https://qiita-image-store.s3.amazonaws.com/0/147248/94af900f-86d1-4c24-7865-88bfe648ccd4.png)


変数で「日本語」を選択し、テキストのプロパティをクリックまたはテキスト部分をダブルクリックして、日本語ロケールのときに表示する文字列を設定します。
![20171128_002445_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/414b98b6-676e-2877-729a-95f8fbe975ca.png)

![20171128_002444_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/be9a16c8-9d17-43eb-6bec-302cde903057.png)

変数で「英語」を選択し、英語ロケールのときに表示する文字列を設定します。
![20171227_002529.png](https://qiita-image-store.s3.amazonaws.com/0/147248/76bf314b-57c0-c7c7-4a58-fbfab9fe97d4.png)

	
変数で「その他」を選択し、「日本語」「英語」ロケール以外のときに表示する文字列を設定します。
![20171128_002448_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/1039aaa2-072a-c25b-b758-3ceae58663f6.png)
	
同様の手順で、コンテンツ言語に応じて変更したいテキストを変更します。
・テキスト部分を選択。
・プロパティで「テキスト・ソースの変数」を設定。
・変数を「英語」「日本語」「その他」と切り替えながら文字列を設定。

下の例ではリストの列タイトル部分のテキストを変更しています。

・日本語環境用
![20171128_002450.png](https://qiita-image-store.s3.amazonaws.com/0/147248/52fa4507-09d3-7c1b-f47b-b72e1234c68b.png)

・英語環境用
![20171128_002449.png](https://qiita-image-store.s3.amazonaws.com/0/147248/5859fa63-e1f5-cef6-e052-c7520786212d.png)

##実行結果

日本語ロケールのユーザーが実行したとき
![20171227_002525.png](https://qiita-image-store.s3.amazonaws.com/0/147248/694b61da-a82b-80a0-a22d-e4b3dcbe529e.png)

英語ロケールのユーザーが実行したとき
![20171227_002526.png](https://qiita-image-store.s3.amazonaws.com/0/147248/7b921819-e80f-b695-57e7-89cee6200b46.png)


第4回に続きます。
Cognosレポートの多言語対応(その2)

前回の続きでCognosのレポートを多言語対応化する方法その2です。

ひとつ前の記事
[Cognosレポートの多言語対応(その1)](https://qiita.com/hayakumi/items/08a3614a547843c213b6)

#第2回 モデルの変更

下の２つのパターンについて変更方法を説明します。どちらもFramework Managerを使ってモデルを変更します。
・コンテンツ言語に応じて参照する列を変えるパターン
・参照する行をフィルタリングするパターン

##コンテンツ言語に応じて参照する列を変えるパターン	

1. Framework Managerでモデルを開きます。
2. パラメータ・マップを作成します。
 パラメータ・マップ- > 作成 -> パラメータ・マップを選択	
![20171227_002512_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/0c273bc3-c63f-f4d9-4d57-6c058e0dc350.png)

3. キーと値のペアを定義します。
キーの部分は日本語の場合はja、英語の場合はenとなります。
値の部分は参照する列を識別するためのものです。
![20171227_002513.png](https://qiita-image-store.s3.amazonaws.com/0/147248/f98d2b20-4cd4-ca35-a2bd-f498e2f27763.png)

4. クエリー･サブジェクトを作成します。
下の例では、PRODUCT_LINEのデータアイテムに式を使い、コンテンツ言語に応じて参照するカラムを変えています。
![20171227_002515.png](https://qiita-image-store.s3.amazonaws.com/0/147248/06416b89-1578-cae2-4b97-6f67ef812dd9.png)

```
#'[gosales].[PRODUCT_LINE].[PRODUCT_LINE_'+ $CA_LanguageMap{$runLocale}+ '] '#
```

このようなクエリーサブジェクトを作成しておくことで、 PRODUCT_LINEデータアイテムを参照したときに、コンテンツ言語が日本語のときは PRODUCT_LINE_JA というカラムが、
コンテンツ言語が英語のときは PRODUCT_LINE_EN というカラムが参照されるようになります。


##コンテンツ言語に応じて参照する行をフィルタリングするパターン		
特定の列に言語を識別する値が入っている場合は、コンテンツ言語に応じて参照する行を絞り込むことができます。

1. パラメータ・マップを作成します。
下の例ではPRODUCT_LANGUAGEというカラムにJAやENといった値が入っているテーブルを参照しているため、上のパターンで作成したパラメータ・マップをそのまま流用しています。
<br>

2. クエリーサブジェクトを作成します。
フィルタータブで、コンテンツ言語に応じた行に絞り込むための式を定義します。![20171227_002517.png](https://qiita-image-store.s3.amazonaws.com/0/147248/3b4ac9ff-d307-76ff-e882-cfef93fa6a04.png)

```
[CALangModel].[PRODUCT_NAME_TABLE].[(ja) PRODUCT_LANGUAGE]  = #sq($CA_LanguageMap{$runLocale})#
```

このようなクエリーサブジェクトを作成しておくことで、
コンテンツ言語が日本語のときは PRODUCT_LANGUAGE に JA という値が入った行が抽出され、コンテンツ言語が英語のときは PRODUCT_LANGUAGE に EN という値が入った行が抽出されるようになります。

第3回に続きます。
Cognosレポートの多言語対応(その1)

#概要
Cognosのレポートを多言語対応化する方法を4回に分けて紹介します。

第1回 言語環境の変更
第2回 モデルの変更
第3回 レポートのテキスト表示変更
第4回 レポート名の表示切替

#第1回 言語環境の変更

今回は、ユーザーによって日本語と英語で表示言語を切り替える例を紹介します。

ログイン後、ユーザーごとの個人用設定で言語の設定を行ないます。
・個人用設定 -> 全般
　「ユーザー・インターフェースの言語」
　「コンテンツ言語」

![20171227_002509_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/d380a070-688c-29a4-f3e2-dc128feb6efd.png)

![20171227_002510_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/d4ab7a88-87d8-2e72-666c-b750c1f7d29c.png)


ナビゲーションバーやアプリケーションバーなどの表示言語を変更する場合は、「ユーザー・インターフェースの言語」を変更します。
レポート名やレポートの中身の表示言語を変更する場合は、「コンテンツ言語」を変更します。

![20171227_002511_e.png](https://qiita-image-store.s3.amazonaws.com/0/147248/dfe999b3-3883-6626-3129-9758b7fc7c14.png)

##実行結果

「ユーザー・インターフェースの言語」「コンテンツ言語」を"日本語"に設定したユーザーの画面です。
![20171227_002527.png](https://qiita-image-store.s3.amazonaws.com/0/147248/2826138f-b30d-342d-5cd4-b0a585f86648.png)


「ユーザー・インターフェースの言語」「コンテンツ言語」を"英語"に設定したユーザーの画面です。
![20171227_002528.png](https://qiita-image-store.s3.amazonaws.com/0/147248/1fc64d70-55f7-98ff-58dc-d9ab98c2528c.png)


第2回に続きます。
ビジュアルリグレッションテストのBackstopJSを使った時引っかかったポイント

ビジュアルリグレッションテストを試験的に使ってみたときに、
デザイナーのわたしがつまづいたところをまとめておきます🙃
今回利用したのは`BackstopJS`です。

# キャプチャを上手く読み込んでくれないとき

BackstopJSは、Chrome headlessモードを利用する、[Chromy](https://github.com/OnetapInc/chromy)を使ってキャプチャを取っています。
そのとき、マシンのメモリを結構ゴリゴリつかいながらキャプチャを取っているので、上手くいくかいかないかはマシン自体に左右される傾向にあります。
なので、言い切ってしまうと、ある程度ちゃんとしたマシンが必要！

テストをするSessionが増えれば増えるほど負荷がかかりますが、とはいえある程度の数のSessionをテストしないとリグレッションテストの導入のメリットがないので
マシン性能以外に以下でなんとかすると成功率があがります。

## 同時にキャプチャする枚数とそれに利用するメモリの量を設定する
マシンスペックが少ない人は、`asyncCaptureLimit`と`asyncCompareLimit`のあたりを上手く調整するといいかもしれません。
Timeoutエラーの時等、これで解決した人もいるようです。
`backstop.json`で設定できます。

### asyncCaptureLimitを調整する
asyncCaptureLimitは、一度に何枚キャプチャーを取るかという設定項目です。

### asyncCompareLimitを調整する
この項目はテスト中に使用するメモリの設定項目です。
BackstopJSでは、100MBほどのRAMと、画像比較に５MBずつ必要とし、だいたい600MBくらい必要なようです。

# `Error: Failed to launch a browser.`や`Chromy error: Error. See scenario ...`と言われた場合

Chrome-Headlessは多くのメモリを必要とします。
それによりchrome processが開いたままになってしまい、エラーが発生することがあります。
その場合以下でプロセスを消します。

`pkill -f "(chrome)?(--headless)"`

# 全体的になんかうまくいかないとき

## `backstop init`をしてやり直す

`backstop init`をすると、 `backstop.json`や`cookie.json`など、すべて新しく上書きされます。
変更すでにしてある箇所はバックアップを取ってから`backstop init`をしましょう。
なんでかわかりませんが、やり直しするとうまくいくことがある

## 自分のマシンのメモリを解放する

再起動なりなんなり…。色々調べたりして時間がかかる前に一度見直してみましょう。


上記でだいたいうまくいくようになりました。


# それら以外の問題がおきた時

ドキュメントをちゃんとよむ！
[garris/BackstopJS: Catch CSS curve balls.](https://github.com/garris/BackstopJS)

issueにわりと同じ症状の人が結構いるのでそこから発見する！
https://github.com/garris/BackstopJS/issues

英語で書いてあるのでうへぇって思いますが、やみくもに検索かけるより全然問題点が見つかります。
C++ Builder 10.2 Tokyo > datetime > FileAge() > W8111 非推奨のエンティティ '_fastcall FileAge(const UnicodeString)'  にアクセスしている

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

関連: [c++ builder XE4 / datetime > ファイルの日時を取得する > FileAge()+FileDateToDateTime() / TFile::GetLastWriteTime()](https://qiita.com/7of9/items/57d7fe40df3de5f3ff67)

http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.SysUtils.FileAge
> メモ： FileAge の最初のオーバーロードは、廃止予定です。 代わりに FileAge の 2 つ目のオーバーロードを使用してください。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String filepath = L"test.txt";

	// 1つ目のオーバーロード
	int fileAge = FileAge(filepath);
	TDateTime filedt1 = FileDateToDateTime(fileAge);

	// 2つ目のオーバーロード
	TDateTime filedt2;
	bool res = FileAge(filepath, filedt2, /*FollowLink=*/true);
}
//---------------------------------------------------------------------------
```

1つ目のオーバーロードは廃止予定なので、2つ目を使う方がいいとのこと。

実際に実行したところ、２つの取得により秒の値に違いはある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d9728eff-3874-27a8-d777-045bd24b5a35.png)
【JavaScript】フォーム等の送信ボタンに対する二重送信防止対応策

フォーム等の送信ボタンを二度押しされた場合、二重にリクエストが飛ぶので、
JSで一度ボタンを押されたら二度目を押せないように**disabled属性を付与させる**という対応をしました。

**以下Javascriptソース（要jQuery）**

```html
<script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
    $("form").submit(function() {
        $('[name="submitButton"]').attr("disabled", true).css({
            'cursor':'wait',   // お好みに変更する
            'color' :'#DCDCDC' // お好みに変更する
        });
    });
});
</script>
```

PHP側で二重リクエストの処理をどうするか、調べてみましたがあまりよくわからなく、
ほとんどJSで制御しているみたいでしたので一旦この処理を入れておけばいいかな～と思ってます。

もしPHP側で対応するいい方法があれば教えていただきたいです・・・
Cookieはどこにどのように保存されているのか

# Cookieはどこに保存されているのか
普段何気なく使っているcookieがどこに保存されているのか知りたくなったため備忘録がてら記録しておく。

## OSX Chromeの場合
`~/Library/Application\ Support/Google/Chrome/Default`
の中にCookiesファイルという名前のsqliteファイルが存在する。

`sqlite3 Cookies`で中身を見ることができる。あとは `.schema　cookies`　を使えばどのようなテーブル構造なのか見れるので`select * from cookies`すれば見れる！.. 
<img width="1138" alt="スクリーンショット 2017-12-27 17.09.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/33696/15f127fa-8d56-a504-45f8-a4ab5eef9549.png">

と思っていたがこれらの中身は暗号化されていた(encrypted_valueカラムの中に BLOB形式で含まれていると思われる)...　

というのもこのSqliteファイルが悪意のあるユーザに盗まれても大丈夫なようにchromeの方で暗号化しているらしい。

このあとは誰かがpushしてくれたらいつか調べる。