OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos の丸めのデフォルト「五捨五入」の動作「四捨五入」にする

#Cognos丸めの「五捨五入」を「四捨五入」に
Cognos Analytics や BI では、データ・フォーマットでのデフォルトの丸めの動作は「五捨五入」です。
「五捨五入」とは、有効数字の最終けたの端数がちょうど半分（5）になる場合、
　　・最終けたの数字が偶数であればその5は切り捨て
　　・最終けたの数字が奇数であればその5は切り上げ
という動作です。

実際のレポートで見てみましょう。
赤枠の「レンジャービジョン」と「ヴェニュー」というアイテムの数量に注目下さい。
最終桁が「5」ですが、その上の桁が「6」偶数と、「3」奇数、という違いがありますね。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e8f4633a-822f-b96e-25c7-8363795bf722.jpeg)

レポートの中で、数量のデータ形式を、以下の様に形式を「数値」、小数点以下の桁数「0」、スケール「-1」に変更します。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/76e9e245-a4b7-b631-63e1-271581cad017.jpeg)

再度レポート実行すると、先ほどの二つのアイテムの数量が丸められていますが、レンジャービジョン「上の桁が偶数」のものは切り捨て、ヴェニュー「上の桁が奇数」のものは切り上げられているのがわかります。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/050d7b32-96ca-b11d-50ce-7fe7ada4f739.jpeg)

これがCognosのデフォルトの動きで、これはこれで意味があるのですが、一般には四捨五入が普通の動きとして求められる事が多いかと思います。

この様な時、Cognos BI 10.2以降 & Cognos Analyticsでは、丸めの動作を変更できます。

変更は以下のように、Cognos Administrationで「ReportService」or「BatchReportService」のプロパティの設定タブの「詳細設定」から、以下のパラメーターと値を指定します。
パラメーター：RSVP.RENDER.ROUNDING
値：halfUp
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/407487c1-2b05-a522-53ce-b29af2dff1d4.jpeg)

詳細手順は以下ご参照下さい。Cognosの再起動は不要です。
**How to set Server rounding rules for data formatting?**
http://www-01.ibm.com/support/docview.wss?uid=swg21643228

さて、もう一度レポートを実行すると、先ほどの二つのアイテムはどちらも切り上げされていて、「四捨五入」になっている事がわかります。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/97e6b383-19e4-f4e3-091f-62a60342c20f.jpeg)

デフォルトの動作が「五捨五入」な事と変更可能な事を覚えておいて頂ければと。
Watson利用メモ(Natural Language Classifier)

WatsonNLC(Natural Language Classifier)を利用する際の個人的メモです。（2018年6月時点の情報）トレーニングと分類器作成の手順に特化しており、事前の環境構築等については割愛しております。マニュアルを熟読できていないので、誤っている部分があるかもしれません。

## IBM Watsonについて

Watsonは、IBMが開発した質問応答システム・意思決定支援システムである。『人工知能』と紹介されることもあるが、IBMはワトソンを、自然言語を理解・学習し人間の意思決定を支援する『コグニティブ・コンピューティング・システム（Cognitive Computing System）』と定義している。(by wikipedia)<br/>

## 試行した環境について
* 種類：Bluemix Public
* ライセンス：サブスクリプション
* サポートレベル：基本

## Natural Language Classifierサービスの利用イメージ
WebAPI経由で利用可能ですが、以下の図のとおりWebページからの利用の方が容易です。利用の流れとしては<br/>　①CSVデータのアップロード<br/>　②分類器作成<br/>　③作成した分類器による文書の分類<br/>の３ステップです。新しい分類器(BやC)を作りたい場合、トレーニングデータの入れ替えが必要となります。（既存トレーニングデータへの追加ができない。一旦すべて削除してアップロードし直す。）

<img src="https://qiita-image-store.s3.amazonaws.com/0/237065/6d85f873-0409-4bd9-b538-d92d6cc6c35c.png" width=80%>

## 分かったこと・注意点・備忘
### CSVインポートの際の注意点
* フォーマットは「トレーニングデータ文字列（文章）, 種別（分類）」の２列、必ず対にする
* 文字エンコーディングはUTF-8（よって改行コードも念のためLFで。）
* トレーニングデータ文字列内にカンマ、タブ、改行コードがある場合は削除or代替文字に置換する
* トレーニングデータ文字列は1024文字以内に
* 学習データは5行～15,000に

### 処理時間
* トレーニングデータの削除：1000件で1時間ほど
* 分類器の作成：1000件で40分ほど<br/>※終わった時間が明確に分からないので概算です。処理中か否かが分かり辛く、使っているとたまに不安になります。

### トレーニングデータの位置付け
* 利用イメージの図に記載しているとおり、トレーニングデータの領域は一つしかないため、新しい分類器を作成する際は、トレーニングデータを削除する必要があります。既存データに新しいトレーニングデータを追加したい場合は、トレーニングデータを一旦Exportしてデータを追加の上、再度アップロードします。<br/><br/>

### Web上のツール画面にアクセスできない(Bluemixサインインの失敗)事象について
* 複数のNLC(Cloud Foundry)サービスを切り替えて使っていたせいか、Web上のツール画面を起動し、以下のBluemixサインイン画面でエラーとなり、ツールに触れない期間が(少なくとも丸１日)ありました。<br/><img src="https://qiita-image-store.s3.amazonaws.com/0/237065/a6bc6035-9166-4c9c-ac79-d5d089986efc.png" width=60%><br/><br/>ログインしても…<br/><img src="https://qiita-image-store.s3.amazonaws.com/0/237065/b181f2ec-7192-e3ab-80d0-c81dc381b119.png"><br/><br/>1～2分するとこんなエラーが出てしまう。<br/>結果的に1週間くらい放置したら使えるようになりましたが、サポートからの回答は以下のとおりでした。（訳に自信がないため原文ママ）<br/><br/>please try to 1) clear your cache or 2)open a private browser window and after, try to sign in and Launch the Tooling again.<br/><br/>次に同じようなエラーが出た際は試してみようと思います。<br/>最初はチャットで問い合わせましたが、解決できなかったためIBM Cloud Service Portalと呼ばれるシステム上でチケットが起票され、続いて然るべき担当者へディスパッチ…という流れでご対応頂きました。システム上でのやり取りは質問に対して大体1～2営業日かかっていた印象です。<br/><br/><br/>


弊社ではエンジニアを募集中です。以下のサイトも見て頂けると嬉しいです。<br/>https://www.nittsu-infosys.com/recruit/2019/index.html<br/>WatsonについてはNLCの他にもAssistant(旧Conversation)やVisual Recognitionにも取り組んでいます。
2018年6月現在でのPHP5.6+Laravel5.4の環境の作り方

そろそろPHP7への移行をしなきゃですが・・
取り急ぎPHP5.6+Laravel5.4の環境を作りたい場合は以下でできるっぽいです

```
php -r "readfile('https://getcomposer.org/installer');" | php

mv composer.phar composer

./composer require "laravel/installer"

composer create-project --prefer-dist laravel/laravel プロジェクト名 5.4
```


そろそろPHP7への移行をしなきゃ・・

参考
https://stackoverflow.com/questions/41838979/how-to-install-laravel-5-4
Watson Discovery API経由での日本語データコレクション作成 アップデート

#Watson Discoveryの認証方式が変わった。
5月時点でシドニーだけのようですが、IBM CloudでWatson Discoveryのインスタンス(サービス)を新規に有効化するとWatson Discoveryに接続する際の認証の方法が、従来のWatson Discoveryのユーザー名とパスワードではなく、API Keyを用いる方式に変更されています。IBMのドキュメントが追い付いていないため、APIリファレンスを読みながら確認しました。

#API Keyによる日本語データコレクション作成の手順
従来の作成手順は[こちら](https://qiita.com/kolinz/items/b3be17c33694c9745697)をご覧ください。
1.Watson Discoveryのサービスを作成し、最初に表示される管理画面に表示されている「apikey」と「url」をメモします。「apikey」を表示するには、「表示」をクリックします。
![watson-discovery-1.png](https://qiita-image-store.s3.amazonaws.com/0/41414/97d2ddad-f641-70ab-c0e9-abbee87856d8.png)

2.Linux上でターミナルエミュレータ(端末アプリ)を起動します。

3.environment_idを取得するコマンドを実行
コマンド実行

```
$ curl -u "apikey":"ここにapikeyを記述" "確認したurlを記述/v1/environments?version=2018-03-05"
```
実行例

```
$ curl -u "apikey":"xxxxxxxxxxxx" "https://gateway-syd.watsonplatform.net/discovery/api/v1/environments?version=2018-03-05"
```
environment_idが出力されます。environment_idは2つ出力されますが、下記のような形式で出力されている方を使用します。
例 "environment_id" : "xxxxx-yyyyy-1111-aaaaa-2222"

4.configuration_idを発行するコマンドを実行
コマンド実行

```
$ curl -u "apikey":"ここにapikeyを記述" "確認したurlを記述/v1/environments/取得したenvironment_idを記述/configurations?version=2018-03-05"
```

実行例

```
$ curl -u "apikey":"xxxxxxxxxxxx" "https://gateway-syd.watsonplatform.net/discovery/api/v1/environments/xxxxx-yyyyy-1111-aaaaa-2222/configurations?version=2018-03-05"
```

configuration_id が出力されます。
例 "configuration_id": "xy11yy-a22bbcc-vvv78xxxxx-mmm3444nnnn"

「configuration_id」は、次のコマンド実行によるデータコレクション作成の際に使用します。データコレクション作成時に「configuration_id」を省略する場合は、「environment_id」に関連付けられた最初の「configuration_id」がデフォルトとして使用されます。

5.日本語対応のデータコレクションを作成します。
コマンド実行

```
$ curl -X POST -u "apikey":"ここにapikeyを記述" -H "Content-Type: application/json" -d '{  "name": "jp_data",   "description": "My data collection",  "language": "ja" }' "確認したurlを記述/v1/environments/取得したenvironment_idを記述/collections?version=2018-03-05"
```

実行例

```
$ curl -X POST -u "apikey":"xxxxxxxxxxxx" -H "Content-Type: application/json" -d '{  "name": "jp_data",   "description": "My data collection",  "language": "ja" }' "http://gateway-syd.watsonplatform.net/discovery/api/v1/environments/xxxxx-yyyyy-1111-aaaaa-2222/collections?version=2018-03-05"
```

出力結果が下記のようになっていれば、API経由での日本語対応のデータコレクション作成は成功です。

```
{
  "name" : "jp_data",
  "collection_id" : "8xxxx6xxxxx-22f0x-8xxx-10yyy-10aa9aaaaaa",
  "description" : "My data collection",
  "created" : "2018-06-22T02:04:42.077Z",
  "updated" : "2018-06-22T02:04:42.077Z",
  "configuration_id" : "xy11yy-a22bbcc-vvv78xxxxx-mmm3444nnnn",
  "language" : "ja",
  "status" : "active"
}
```

Webブラウザで、有効化したWatson Discoveryサービスで「ツールを起動」を実行しますと、コマンド実行で作成したデータコレクションが表示されていることが確認できます。

#参考資料
Watson Discoveryリリースノート (英語版のみ表示されます。)
https://console.bluemix.net/docs/services/discovery/release-notes.html#17May2018
APIリファレンス
https://www.ibm.com/watson/developercloud/discovery/api/v1/curl.html?curl

シドニーでWatson Assistantを新規に有効化すると、Watson AssistantもAPI Keyによる認証方式に変わっていました....(-。-;
おそらく統一されていくと思いますが、しばらくは混乱が起きそうです。
Visual Studio Codeのプラグイン「Insert Date String」で挿入される日付のフォーマットを変更する

挿入される日時から時間を取り去り日付だけにしたかったが地味に手間取ったのでメモ

1. Insert Date Stringのソースが格納されたフォルダに移動し、「package.json」を編集する。  
※私の場合、`C:\Users\${ユーザID}\.vscode\extensions\jsynowiec.vscode-insertdatestring-2.2.2`に格納されていました。  
1. `configuration` > `insertDateString.format` > `default`を、`YYYY-MM-DD hh:mm:ss`から`YYY-MM-DD`に修正する。
   
``` package.json
		"configuration": {
			"title": "Insert Date String Configuration",
			"properties": {
				"insertDateString.format": {
					"type": "string",
					"default": "YYYY-MM-DD",
					"description": "Date time format to be used."
				},
				"insertDateString.formatDate": {
					"type": "string",
					"default": "YYYY-MM-DD",
					"description": "Date format to be used."
				},
				"insertDateString.formatTime": {
					"type": "string",
					"default": "hh:mm:ss",
					"description": "Time format to be used."
				}
			}
		},
```
   
再起動して設定が反映されていることを確認

※できれば`YYYY-MM-DD (DDD)`という形で`DDD`に日本語の曜日を入れたかったのですがどこに手を入れたらよいかわからず断念しました。どなたかご教授ください…
クエリストリング付きのURLパラメータをグローバルに登録するtips

### 内容
* パラメータ付きでアクセスした場合
    * パラメータをlocalStorageへ登録
    * パラメータをwindowへ登録
    * 登録した後URLを綺麗にするために?以降を削除
* 2度目以降にパラメータ無しでアクセスした場合
    * localStorageから直近のパラメータを取得しwindowへ登録

localStorageの保持期限などが必要な場合は別途対応が必要です.

es6から書きはじめた人間なのでIE11を主に非ES6環境で色々ハマりました。
というのもpolifillを使えないという縛りがあったため。

* Array.prototype.includes => ES6
* `[a, b] = [1,2]` => ES6の分割代入だった

など気づかないうちに使ってしまってあとでブラウザチェックして直すことになるんですよね。
そういうのをテストできるnpmもありそうなのですがまだ探せてない感じです。

以下実装と実行結果です。

```javascript
  var setGlobalVars = function() {
    // ?以降を切り取りたいため最初の文字は無視
    var params = window.location.search.slice(1).split('&');
    var keys = ["key1", "key2", "key3"]

    // QueryStringをLocalstorageに格納
    params.forEach(function (param) {
      var param = param.split("=").map(function (encoded) {
        return decodeURIComponent(encoded)
      }),
      key = param[0],
      decoded = param[1]
      if (keys.indexOf(key) >= 0) {
        window.localStorage.setItem(key, decoded)
      }
    });

    // QueryStringをURLから削除
    window.history.replaceState({}, "", window.location.pathname)

    // Localstorageからグローバルパラメータを設定
    keys.forEach(function (key) {
      window[camerize(key)] = window.localStorage.getItem(key)
    })
  }

  var camerize = function(text) {
    var words = text.split("_")
    var lower = words[0]
    var upper = words.slice(1).map(function (word) {
      return word.slice(0, 1).toUpperCase() + word.slice(1).toLowerCase()
    }).join('')
    return lower+upper
  }
```

### 実行結果
```javascript
window.location.href = "https://qiita.com/trend?key1=hoge&key2=fuga&key3=piyo"

setGlobalVars()

window.key1 // => "hoge"
window.key2 // => "fuga"
window.key3 // => "piyo"

localStorage.getItem("key1") // => "hoge"
localStorage.getItem("key2") // => "fuga"
localStorage.getItem("key3") // => "piyo"

window.location.href // => "https://qiita.com/trend"
```
list 元の順番で重複を排除


リストの作成

```
>>> list = ['a', 'b', 'c', 'a']
['a', 'b', 'c', 'a']
```

通常の重複排除

```
>>> set(list)
{'b', 'a', 'c'}
```


元の順番を保持した重複排除

```
>>> sorted(set(list), key=list.index)
['a', 'b', 'c']
```
コンパイルエラー対応：Implicit instantiation of undefined template 

clang++でのエラー
Implicit instantiation of undefined template

エラー「Implicit instantiation of undefined template」の原因
http://marycore.jp/prog/xcode/implicit-instantiation-of-undefined-template/

#includeしていないと起きるらしい。

Effective C++ Third version, sample code compile list(8) Prevent exceptions from leaving your destructors
https://qiita.com/kaizen_nagoya/items/df38e3be377eed659376

#include <vector>
が入っていないと起きた。
追記したらエラーが取れた。
# 文書履歴(document history)
ver. 0.01 初稿 20180622
ver. 0.04 URL追記　20230308
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Laravel に X-Frame-Options を追加するだけのパッケージを公開しました（クリックジャッキング対策）

# 背景

Laravelは標準でX-Frame-Optionsを付与しないためOWAAP ZAPをかけると大抵の場合警告を受けます
apacheやnginxで付与してもいいですが、パスによって振り分ける時にアプリケーション側で設定できると便利だと思ったのでパッケージを作りました。

内容はすごく簡単で幼稚なものです。（その割にテスト書いたり公開作業が大変でした）
しかし今まで作ったアプリケーションに全て対応させるのは大変だと思うのでcomposerで一発で入るパッケージにしてみました。


# 成果物
https://github.com/tecpresso/laravel-x-frame-options

パッケージをインストール後、全てのページを`X-Frame-Options:DENY`の状態にします。
部分的に許可したい、またはSAMEORIGINをかけたい場合は `php artisan vendor:publish` で
設定ファイルを生成し、パスを設定していくことで対応が出来ます。
(*パス表現はVerifyCsrfTokenを丸ぱくりしました)

気に入りましたらスターをお願いします。


## P.S.

このパッケージ開発は業務時間中に行いました。
業務時間中にOSSの開発が可能な社風に興味がある人は「て」のマークをクリック！
IBM Cloudのデモサイトで遊ぼう

# このページについて
このページは個人の活動として掲載しているので、[IBM ソーシャル・コンピューティング・ガイドライン](https://www.ibm.com/blogs/think/jp-ja/social-computing-guideline/)に則っています。

すなわち、このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。

# はじめに
IBM CloudとはIBM社が提供するクラウドサービスです。

クラウドとは・・・と紙で理解するよりは、実際に使って理解したほうが早いです。
そのため、ここではIT開発のビギナー向けにお手軽に機能を体験していただくために、デモサイトの触り方をお伝えします。

## デモサイトで遊ぼう
IBM Cloudのいくつかの機能はデモサイトが提供されており、開発する前に「この機能は何か？」を体感して学ぶことができます。

詳細はこちらのリンクを参照ください。

- [Watson機能一覧](https://www.ibm.com/watson/jp-ja/developercloud/services-catalog.html)

### デモサイトの画面の移動の仕方
下記のような機能のリンクをクリックすると、機能の詳細説明とデモサイトに移動できます。
![スクリーンショット 2018-06-22 8.22.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/3168/16502d35-7428-7c88-30be-01038eace6fe.jpeg)

「デモを試す」をクリックすると、デモサイトの説明文書に移動します。
![スクリーンショット 2018-06-22 8.24.33.jpg](https://qiita-image-store.s3.amazonaws.com/0/3168/46b057c8-0a3f-ace9-ec81-5d01942b0bf3.jpeg)

下記の「Watson Assistant」の画面の例のように、下記のように２つのリンクがありますが、どちらかを選択することで、デモサイトに遷移できます。
![スクリーンショット 2018-06-22 8.26.00.jpg](https://qiita-image-store.s3.amazonaws.com/0/3168/8d41b843-5764-a228-243e-bd3860b22afa.jpeg)

それでは！
gnuplot参考サイトまとめ

gnuplotを使う際に参考にしているサイトをまとめた。

[gnuplot](http://www.gnuplot.info/)　gnuplot公式サイト。
[gnuplotの初歩](http://graph.pc-physics.com/)　基本的な使い方が一通り書いてある。
[GNUPLOT](http://folk.uio.no/inf3330/scripting/doc/gnuplot/Kawano/index.html)　非常に内容が充実している。
[GNUPLOT](http://lowrank.net/gnuplot/index.html)　上のサイトと同じ？
 [gnuplotスクリプトの解説](http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/index.html)　大学の先生が書かれている。
[gnuplotコマンド集](http://www.gnuplot-cmd.com/index.html)　コマンド集。
[wanntarou272’s diary](http://wanntarou272.hatenablog.com/entry/2017/05/21/031504)　最小二乗フィッティングの使い方。
[ブログ（NARUMI, Takayuki; 鳴海 孝之）](http://www.kyusan-u.ac.jp/J/narumi/wp/post-90/)　値に応じた色分けの方法。
AWS EC2インスタンス上でmatplotloibでimport Error

## エラー
```python
    import matplotlib.pyplot as plt
  File "/home/ec2-user/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/home/ec2-user/anaconda3/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "/home/ec2-user/anaconda3/lib/python3.6/site-packages/matplotlib/backends/backend_qt5agg.py", line 15, in <module>
    from .backend_qt5 import (
  File "/home/ec2-user/anaconda3/lib/python3.6/site-packages/matplotlib/backends/backend_qt5.py", line 19, in <module>
    import matplotlib.backends.qt_editor.figureoptions as figureoptions
  File "/home/ec2-user/anaconda3/lib/python3.6/site-packages/matplotlib/backends/qt_editor/figureoptions.py", line 20, in <module>
    import matplotlib.backends.qt_editor.formlayout as formlayout
  File "/home/ec2-user/anaconda3/lib/python3.6/site-packages/matplotlib/backends/qt_editor/formlayout.py", line 54, in <module>
    from matplotlib.backends.qt_compat import QtGui, QtWidgets, QtCore
  File "/home/ec2-user/anaconda3/lib/python3.6/site-packages/matplotlib/backends/qt_compat.py", line 140, in <module>
    from PyQt5 import QtCore, QtGui, QtWidgets
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
```

## 解決策
matplotlib.pyplotインポート前に以下を宣言

```python
import matplotlib
matplotlib.use("tkagg")
import matplotlib.pyplot as plt
```
勉強し始める言語のまとめ

######これから学び始める５つの言語についてまとめました。よろしくお願いします。:bow:




#HTML

######Hyper Text Markup Language（ハイパーテキスト・マークアップ・ランゲージ）の略

Webページを作成するためのMarkup（マークアップ）言語
＜役割＞コンピュータに画像やテキスト、ロゴなどを認識させる


#CSS

######Cascading Style Sheets（カスケーディング・スタイル・シート）の略

ホームページなどの見た目・スタイルを定義するための言語
	＜役割＞HTMLで作ったものを装飾、デザインして見やすくする（テキストに下線を引いたり、枠で囲ったり、 
              文字の大きさを変えたり）


#Ruby

######ルビー
オブジェクト指向スクリプト言語（記述や実行を比較的簡易に行うことができる言語）
＜特徴＞日本人考案の言語ということもあり、読みやすく書きやすい
WEBサービスは勿論、スマホアプリやゲーム、業務系アプリ等も得意としていて汎用性も高い
 オブジェクト指向（「モノ」を組み立てるように表現して、コンピュータに動作をさせること）が学びやすい



#Ruby on rails
######ルビーオンレイルズ

Rubyで作られたフレームワーク
（※フレームワーク…Webアプリケーションを作成するための枠組み）
これをベースに早く・簡単にアプリケーションを開発することができる


#Javascript 
######ジャバスクリプト
プロトタイプベースのオブジェクト指向スクリプト言語
＜役割＞HTMLに動きをつける
ユーザー側のWebブラウザと、Webサイトまたはウェブサービスの相互間のやりとりを、円滑にする
<特徴＞JavaScript単体だけでスマホアプリを作れたり、サーバサイドのデータ管理の部分も作れる
クライアントサイド（ブラウザ上で動作すること）、サーバーサイド（サーバーで処理を行うこと）のどちらでも利用可能
特にクロスプラットフォーム（仕様が全く異なる機械上で同じ仕様のものを動かすことができるプログラム）の環境が充実
	



※「サーバーサイド」の開発言語で主な言語は「Java」「PHP」「Ruby」
「クライアントサイド」の開発言語で主な言語は「HTML」「CSS」「javascript(jQuery)」が挙げられる
csvをエクセルで開くとタブ区切り　なので　開いてカンマ区切りにしたい。

件名の通りなのですが
hoge.csvをエクセルで【普通に】ダブルクリックで開くと
タブ区切りになってしまうのでどうにか
普通に開いてもカンマ区切りになるように設定する方法を教えて頂けないでしょうか？

毎回
http://manual.ec-doc.net/operation/operation-tips/other-tips/ad003/
のように変更するのは難儀なので……


まぁ後で解決方法を見つけてメモる予定っ
树莓派无显示器串口控制操作初始设定

[TOC]
## 05-树莓派无显示器串口控制操作初始设定
### 0.目录
1.2准备工作
1.3USB-TTL连接树莓派串口
1.4修改系统配置，启用串口登录树莓派
1.5启动树莓，用Putty连接并登录。
2.参考来源
### 准备工作
1.首先，初始设定必须通过实体介质（网线or串口线）才能够完成，不通过任何介质是无法操作树莓派的。
网线连接方案请看：https://qiita.com/Spike_Han/items/d1ad4e53373935701b1a
2.初始设定完成后，可以通过连接无线网的方式用SSH远程登录树莓派实现远程操作。
3.也可以继续使用串口通信登录树莓，缺点是无法让树莓使用其它串口设备以及蓝牙。
4.所需外设：
 读卡器，SD卡，USB-TTL转换模块（USB转串口模块）
**5.关于USB-TTL转换模块：**
**目前这种产品有很多种类型，有转换线样子的，也有类似于板子的模块，选择自己中意的即可。**
**不再单独做说明，因为每种都不一样，需要注意的是，请一定要阅读对应的说明书和安装驱动**
**不要忘记安装对应的驱动。**
**不要忘记安装对应的驱动。**（重要的事情说三遍）
**有些模块需要自己根据不同需求去焊接不同的焊点，以实现更加丰富的功能，请仔细阅读说明书。**
**如果担心不会用，就直接去淘宝买一个树莓专用的USB-TTL转换模块or线。**
### USB-TTL连接树莓派串口
**1.请仔细阅读说明书连接对应串口**
将对应针脚连接到树莓的TXD和RXD上（GPIO14和15），如图所示：
来源：https://pinout.xyz/pinout/uart 
![](https://syjsxxjy.github.io/myblog/assets/1/20180622-99f4c5a5.png)
然後根据说明书，将Ground和电源接好。
### 修改系统配置，启用串口登录树莓派
1.打开SD卡根目录的"config.txt"文件，将以下内容添加在最后并且保存。（文件所在位置请参考网线方案那篇文章）
```
dtoverlay=pi3-miniuart-bt
```
这样就停止了蓝牙，解除了对串口的占用。
2.然后再修改根目录的"cmdline.txt"，将里面的内容全部替换成以下内容，以防万一，请先备份好这个文件的原内容。
```
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
```
配置修改完成。
### 启动树莓，用Putty连接并登录。
1.准备好上面的步骤之后，将SD卡插入树莓，接上电源启动。
2.右键我的的电脑（以win7为例，其它大同小异）->管理->设备管理器->端口（COM和LPT）
![](https://syjsxxjy.github.io/myblog/assets/1/20180622-de1210fe.png)
P.S：COM在Win系统里就是指的串口的端口。
**如果没有这个，说明你的转换模块没有在运作，请检查对应驱动是否正确安装。**
3.记下这里的端口号（这里是COM4）。
4.用Putty或者其它远控软件新建一个连接，速度设置为115200，端口选择刚才的端口，如下图所示：
![](https://syjsxxjy.github.io/myblog/assets/1/20180622-7a1ad5e4.png)
5.点击连接，等待终端出现文字，直到树莓派发出登录请求，到此成功。
![](https://syjsxxjy.github.io/myblog/assets/1/20180622-eae0afca.png)
## 参考来源：
http://akkagi.info/20161004_web/
Angular > テンプレート内で、テンプレートを参照する。(ng-containerでng-templateを参照)

わざわざ新しいコンポーネントを定義するほどではないけど、同じテンプレートの中で一定の記述を使い回したい時があります。
うまく記事が見つけられなかったので一応メモ。

[こちらが参考になります](https://blog.angular-university.io/angular-ng-template-ng-container-ngtemplateoutlet/)

```html
<!-- 使いまわしたい記述を ng-template で宣言 -->
<ng-template #template let-text="text">
 <p> {{ text }} </p>
</ng-template>

<!-- テンプレートを ng-container から利用する -->
<ng-container *ngTemplateOutlet="template; context:{ text: 'hoge' }"></ng-container>
<ng-container *ngTemplateOutlet="template; context:{ text: 'huga' }"></ng-container>
```

こちらを実行すると以下のDOMが生成されます。

```html
<p> hoge </p>
<p> huga </p>
```

ng-contenerでは ```*ngTemplateOutlet```  によって、テンプレートと、context を指定します。
context はテンプレートで使用する変数になります。

ng-templateは context から受け取る変数を ```let-{context内のプロパティ}={変数名}``` で宣言し、
内部で利用できます。
apache2 -Mのエラー(Invalid Mutex directory in argument file:${APACHE_LOCK_DIR})

apache2 の モジュール一覧を出すときにエラーができた

```
$ apache2 -M
[Fri Jun 22 06:01:40.083534 2018] [core:warn] [pid 29273] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
[Fri Jun 22 06:01:40.083697 2018] [core:warn] [pid 29273] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Fri Jun 22 06:01:40.083749 2018] [core:warn] [pid 29273] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Fri Jun 22 06:01:40.094040 2018] [core:warn] [pid 29273] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Fri Jun 22 06:01:40.094497 2018] [proxy_html:notice] [pid 29273] AH01425: I18n support in mod_proxy_html requires mod_xml2enc. Without it, non-ASCII characters in proxied pages are likely to display incorrectly.
AH00526: Syntax error on line 74 of /etc/apache2/apache2.conf:
Invalid Mutex directory in argument file:${APACHE_LOCK_DIR}
```
#解決策

```
source /etc/apache2/envvars 
apache2 -V
sudo service apache2 restart
```
確率論 ~ベイズの定理~


$B_1,\;B_2,\;...$ が以下の条件を満たすとき

```math
"互いに排反" \; かつ \; \bigcup _{n=1}^{\infty} B_n = Ω \\
(この\;\{B_n\}\;を\;Ω\;の分割という)
```

任意の事象 $A$ に対して、

```math
A=A\capΩ\\
\begin{align}
=A\cap\bigl(\bigcup_{n=1}^{\infty} B_n\bigr)\\
=\bigcup_{n=1}^{\infty}\;(\;A\cap B_n\,)
\end{align}
```

このことから

```math
P(A) = P\bigl(\bigcup_{n=1}^{\infty}\;(\;A\cap B_n\,)\bigr) \\
=\sum_{n=1}^{\infty}P(\;A\cap B_n\,) \\
=\sum_{n=1}^{\infty}P(B_n)\,P(\,A\,|\,B_n\,)
```

> ベイズの定理

$A \in F$ を $P(A)\neq 0$ なる事象、{ $B_n$ } を $Ω$ の分割とする

```math
P(\,B_i\,|\,A\,) = \frac{P(\;A\cap B_i\,)}{P(A)}\\
=\frac{P(\,A\,|\,B_i\,)\,P(B_i)}{\sum_{n=1}^{\infty}P(\,A\,|\,B_n\,)\,P(B_n)}
```
[FuelPHP]Query BuilderでBinaryオプション付けてデータ取りたい

###発端
Webアプリケーション開発中、ログインIDとパスワードを要求する管理画面を作成していましたが、テストで"ログインIDが大文字でも通ってしまう"というバグが有ったので、その対処をした時の記録。

###そもそも何でそんなガバガバになってんの？
DBにMySQL使っていたんですが、文字コードがutf8mb4で、collationがutf8mb4_general_ciだったので、ログインする時IDとパスワード一致するものをレコードから引っ張ってくる時にDB::select()とかでやってると、ログインIDが大文字だろうと小文字だろうと関係なくログイン通ってしまいます。ました。（ちなみにSQLiteとかだとデフォで区別してくれるらしい。話の分かるやつだ。）

###修正
当然`where ('login_id', '=', 'BINARY '.'hogehoge')`としても、`select column from table_name where login_id = 'BINARY hogehoge'`となってしまうので意味がない。 ので、こうじゃ。`where('login_id', '= BINARY', $username)`。
まぁ`DB::expr()`で書き直しゃいーじゃんって話なんですが、アローで繋いでるSQL全部書き直すの面倒だったのでこうしました。

###そもそも
どちらかと言えばDB作る時に大文字小文字区別したいカラムにBINARYくっつけたり、collation適切に設定する方が正着だと思います。:blush:
MACで利用するターミナルソフト（ハイパーhyper）の背景を半透明にする

MACbookpro(HighSierra)でターミナルを利用しているのですが、MAC既存のターミナルは味気ないので、ハイパー（hyper）のターミナルを利用しています。

Hyperのダウンロードはこちらから
[hyper](https://hyper.is/)

既存のターミナルは標準で背景を半透明にしたりできますが、hyperはpluginが必要になるのでこちらを紹介したいと思います。

#1.pluginの追加
以下のpluginをhyperに追加します。

```
module.exports = {
  plugins: [
    'hyperterm-material',
    'hyper-transparent-bg',
  ],
};
``` 
ユーザーのカレントディレクトリにある.hyper.jsというファイルのpluginの所に追記します。
以下plugin部を抜粋

```
// a list of plugins to fetch and install from npm
// format: [@org/]project[#version]
// examples:
//   `hyperpower`
//   `@company/project`
//   `project#1.0.1`
  plugins: [
    'hyperterm-material',
    'hyper-transparent-bg',
    ],
```
ファイルを保存すると自動でpluginが適応されます。
ソースはこちらです。
[hyper-transparent-bg](https://www.npmjs.com/package/hyper-transparent-bg)

#2.透過度、ぼかしの設定

デフォルト設定だと透明度が高く、けっこう透けてしまっていたので設定を変更しました。
pluginインストール後には以下のファイルが作成されているので、こちらを編集します。

.hyper_plugins/node_modules/hyper-transparent-bg/index.js

##2.1デフォルト設定
* Default: { WebkitFilter: 'blur(5px)', opacity: '0.3' }
 - blur=ぼかし度
 - opacity=透過度(0が透過無し）

##2.2自分の設定
```
// Default background effects
let transparentBgConfig = {
  WebkitFilter: 'blur(7px)',
  opacity: '0.25',
};
```
数値はお好みで設定してもらえたらと思います。
UbuntuをRAID組んでインストール

##### やりたいこと
開発環境用に社内サーバを立てるぞ、みたいな話になり、Ubuntu 17.10 ServerをRAID組んでインストールしたのでその時の作業メモ。よく分かってないのでツッコミ歓迎です。（社内に教えてくれる人が居な…げふんげふん）（あと、Ubuntuが17.10なのは丁度社内にインストールdiscがあったのでそれを使っています。今だったら18入れれば良いと思います。）

##### ハードウェア構成
CPU Xeonの何か（忘れました）
マザボ ASUS PRIME Z370-A
メモリ 32GB（8GB * 4）
HDD 1TB * 2枚

今回は、上記ストレージにmdadmでRAID 1を構成しました。

##### やったこと
1. 参考記事を読んで構成を考える。
2. 光学ドライブからインストーラをBootする時に"UEFI"と書いてある方を選択しなければならない。また、Secure Bootの無効、SATA設定をAHCIにするなどのマザボの設定を行う。推定になるが最近のマザボならデフォルトで設定してあると思う。今回も確認したが、特に変更する点は無かった。
3. UEFIかつレガシーBIOSで起動できないマザボの場合、必要となるパーティションはEfi System Partitionと、ext4でフォーマットしたrootマウント用のパーティションのみ？boot領域は参考記事でも作ったり作らなかったりまちまちなので、よく分かってない。今回はインストーラがディスク全体を"ガイドに従ってパーティショニング"すると作成されるパーティションテーブルを参考にした。ESPが540MB位の容量を食っていたので、それに従った。

##### 構成
```
MDデバイス RAID0 48GB SWAP
MDデバイス RAID1 975GB ext4 /
1TB HDD1 物理パーティション1 540MB ESP
         物理パーティション2 24GB RAID
         物理パーティション3 975GB RAID
1TB HDD2 物理パーティション1 540MB ESP
         物理パーティション2 24GB RAID
         物理パーティション3 975GB RAID
```

SWAP領域はRAID1で冗長化する意味がないのでRAID0（そもそもRAID組む意味も無かったっぽいので注意）で。走らせるアプリケーションが多いという想定の下、32GB * 1.5で48GB取っている。とは言え過剰かも知れない。ESPがHDD毎に存在するのは、片方のHDDが故障した時でもBootができるようにするための冗長化（ESPはRAIDできないらしいので）。これでインストールをすることで無事終了、起動が確認できました。（性能は未計測）

##### 感想
かなりハマりました。Linuxのインストールがいくら簡単になったとは言え、初心者が手を出すのはちょっとハードルが高かったという印象です。

##### その後
`do-release-upgrade`で18にアップグレード。
また、日本語でインストールしてしまっていたので.bashrcに
```
case $TERM in
    linux) LANG=C ;;
    *) LANG=ja_JP.UTF-8 ;;
esac
```
を記述。めでたし。

##### 参考
https://www.linuxmania.jp/raid_md_grub.html
http://pman0214.github.io/blog/debian-efi-raid.html
http://archlinux-blogger.blogspot.jp/2018/02/uefiubuntuubuntu-1604-lts.html
https://forums.ubuntulinux.jp/viewtopic.php?id=14565
https://qiita.com/ihyomo/items/a66660f11cfa9f9668b4
ZabbixからAmazon SNSを使って通知を飛ばす

## はじめに

Amazon Simple Notification Service(以下、SNSと記述します)は、とても柔軟で便利です。
Topicを設定し、サブスクリプション登録することで、Email通知、SMS通知、URLを叩いたり、SQSに投げたりと、柔軟に通知処理が構築できます。
今回は、ZabbixからSNSを呼べるように設定します。
なお、AWS側の詳しい手順は記載していませんので、ご了承ください。

## Zabbix設定

ZabbixのWeb画面にて設定

* 管理 > メディアタイプ　>　メディアタイプの作成

|項目名|設定値|
|:--|:--|
|名前|SNS-Alert|
|タイプ|スクリプト|
|スクリプト名|sns_send.sh|
|スクリプトパラメータ|{ALERT.SENDTO}<br/>{ALERT.SUBJECT}<br/>{ALERT.MESSAGE}|


* 設定 > ユーザー　　> (ユーザを選択) > メディア　>　追加

|項目名|設定値|
|:--|:--|
|タイプ|SNS-Alert|
|送信先|arn:aws:sns:ap-northeast-1:xxxxxxx:myTopic|
|有効な時間帯|お好みで|
|指定した深刻度のときに使用|お好みで|

ここで指定した送信先は、`{ALERT.SENDTO}`に渡るようです。


## シェルスクリプトの配置

zabbixユーザーで、awsコマンドを使えるようにしておきます。
インストール手順は、AWSのサイトを参考にしてください。
IAMは、SNS publish権限が必要です。

以下のシェルは、後述するサイトを参考にさせていただきました。

```sh:/usr/lib/zabbix/alertscripts/sns_send.sh
#!/bin/sh

TOPIC_ARN=$1
SUBJECT=$2
MESSAGE=$3

echo "`date` $TOPIC_ARN $SUBJECT" >> /tmp/zabbix-sns.log

if [ "$SUBJECT" = "" -o "$TOPIC_ARN" = "" ]; then
  echo "usage: $0 {ARN SUBJECT MESSAGE}"
  exit 1
fi

if [ "$MESSAGE" = "" ]; then
  MESSAGE=$SUBJECT
fi

aws sns publish --topic-arn $TOPIC_ARN --subject "$SUBJECT" --message "$MESSAGE"
```

シェルを作成したら、シェルの実行権限付与をお忘れなく。
AWS側の手順は割愛しますが、AWS側でサブスクリプション登録をしてから、試しにシェルを実行してみます。

```
./sns_send.sh arn:aws:sns:ap-northeast-1:xxxxxxx:myTopic test-subject test-message
{
    "MessageId": "xxxxxxx-xxxx-xxx-xxx-xxxxxxxxxxxxx"
}
```

これで通知が飛べばOKです。
快適な通知ライフを！

## 注意事項

実際に設定してみたのですが、うまく動かず調べました。
いくつか注意点を載せておきますので、参考にしてください。

### スクリプトの配置場所について

zabbix_server.confで設定している`AlertScriptsPath`のパスに、シェルを配置しているかどうか確認してください。
Zabbixのスクリプト名に、`sns_send.sh`と設定していますが、絶対パスではNGのようです。

```conf:/usr/local/etc/zabbix_server.conf
User=zabbix
SSLKeyLocation=/usr/local/share/zabbix/ssl/keys
SSLCertLocation=/usr/local/share/zabbix/ssl/certs
PidFile=/tmp/zabbix_server.pid
LogType=console
LoadModulePath=/usr/lib/zabbix/modules
ExternalScripts=/usr/local/share/zabbix/externalscripts
DBUser=zabbix
DBPort=3306
DBPassword=my_password
DBName=zabbix
DBHost=zabbix.db
AlertScriptsPath=/usr/local/share/zabbix/alertscripts
```

上記の場合は、
誤)　`/usr/lib/zabbix/alertscripts/sns_send.sh`
正)　`/usr/local/share/zabbix/alertscripts/sns_send.sh`
となります。

### awsコマンドが失敗する

プロキシ配下で動かす場合や、認証情報がうまく取れていない場合、シェルに工夫が必要です。

```
# 必要な変数の設定
export HTTP_PROXY=http://xxx.xxx.xxx.xx:yyyy
export HTTPS_PROXY=http://xxx.xxx.xxx.xx:yyyy
export AWS_SHARED_CREDENTIALS_FILE=/home/zabbix/.aws/credentials
export AWS_CONFIG_FILE=/home/zabbix/.aws/config

# 認証情報のチェック
/home/zabbix/.local/bin/aws configure list >> /tmp/zabbix-sns.log

# sns publish
/home/zabbix/.local/bin/aws sns publish --topic-arn $TOPIC_ARN --subject "$SUBJECT" --message "$MESSAGE"

# exit status
echo "`echo $?`" >> /tmp/zabbix-sns.log
```

## 参考記事

zabbixのメディアタイプをスクリプトにしてAWSのSNSを使う
https://hacknote.jp/archives/6587/
Laravel 5.5+ でRFC違反のメールを送信できるようにするパッチを作成しました

#背景

ガラケー全盛期、日本ではRFCに準拠しないメールアドレスを配布していました。
例えば次のようなメールアドレスです

- `example.-.@example.com`
  - @の前に.を置いてはならない
- `.example@example.com`
  - .から開始してはならない
- `ex..ample@example.com`
  - .が連続してはいけない

これからメールアドレスを作る場合、上記のようなメールアドレスは作れなくなったようですが
昔からRFC違反のメールアドレスを使っているユーザーはそのままです。

このRFC違反メールアドレスにLaravelからメールを送信しようとすると　`Swift_RfcComplianceException` という例外が発生します。
つまり、LaravelからRFC違反メールアドレスにはメールが送れないという事です。
しかし、それではリプレース案件や、中高年向けサービスで登録できないユーザーが一定数存在してしまう事になり、受託案件ではクレーム物です。


# 本題

Swiftmailerのコンテナに独自のバリデータを読み込ませる事ができたので紹介します。


```php
\Swift::init(
  function () {
      \Swift_DependencyContainer::getInstance()
        ->register('email.validator')
        ->asSharedInstanceOf('クラスパス');
  }
);

```

これでバリデータを変更出来るようでしたので、Laravelの場合、 AppServiceProvidorのbootメソッドら辺に登録するとなんとかなります。
なお、バリデータは `Egulias\EmailValidator\EmailValidator` を継承している必要があります。
 
都度、これを書くのがめんどくさく感じたのでパッケージ化しましたので、めんどくさいと感じる人はお使いください。


https://github.com/tecpresso/laravel-allow-non-rfc-compliant-email-patch


## 仕様

- とりあえず@が入っていればメールが送れる
- Laravel 5.5 で動作確認済み(sendmail)
- 実際に送れるかどうかはMTAによる。


## アプデしました

1年以上たち @ucan-lab さんに記事をいただいたにも関わらずノーメンテ状態でしたので
Laravel6に入るまで対応しました。（まだ6触ってないんですけど・・・）
更新内容はpackage.jsonの調整と.travis.ymlの調整だけですみました。
MyBatisでauto_incrementされたPRIMAY KEYのidを取得する方法

# やりたいこと
insertしたデータのauto_incrementされたPKの値を使いたい。

# 結論
MyBatisGeneratorで自動生成されたMapperをちょっといじればOK。
ただし再度generateしたらリセットされてしまうので要注意。

# 例

こんなテーブル(MySQL)があったとする。

```user.sql
CREATE TABLE user (
  user_id int(10) NOT NULL AUTO_INCREMENT,
  name varchar(30) NOT NULL,
  created_at datetime NOT NULL,
  updated_at datetime NOT NULL,
  PRIMARY KEY (user_id)
);
```

## xmlを編集する
UserMapper.xmlの`insert id="insert"`の部分を丸っとコピーしてauto_incrementされた値を返す`insert id="insertReturnId"`を追加する。

```UserMapper.xml
<!-- もともとある -->
<insert id="insert" parameterType="mypackage.dao.entity.User">
    insert into user (user_id, name, created_at, updated_at)
    values (#{userId,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
    #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP})
</insert>
<!-- これを追加する -->
<insert id="insertReturnId" parameterType="mypackage.dao.entity.User">
    insert into user (user_id, name, created_at, updated_at)
    values (#{userId,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
    #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP})
  <selectKey resultType="int" keyProperty="userId" order="AFTER">
      select @@IDENTITY
  </selectKey>
</insert>
```

ちなみにorderをBEFOREにするとinsert前の値、AFTERにするとinsert後の値が取れる。

もちろんもともとあるinsertのところに下記を追記しても良いが、あまりおすすめしません。

```xml
<selectKey resultType="int" keyProperty="userId" order="AFTER">
    select @@IDENTITY
</selectKey>
```

なぜならもともとある方のinsertもintの値(insertした件数)が返ってくるので、万が一編集したことを忘れてgenerateした場合、気付かない可能性があるから。
ちなみに`insert id="insertReturnId"`を追加する方法なら、万が一忘れてgenerateした場合でもjava側で「メソッドがねぇ！」ってエラーになって気付くことができる。

## Mapperクラスを編集する
UserMapper.xmlで指定した`insert id="insertReturnId"`を追加する。

```UserMapper.java
int insertReturnId(User record);
```

## Java(SpringBoot)で使う

### Serviceクラス

```UserService.java
@Service
public class UserService {

    @Autowired
    UserMapper userMapper;

    public int createUser(String name) {
	User user = new User();
	user.setName(name);
	user.setCreatedAt(new Date());
	user.setUpdatedAt(new Date());

	// userのuserIdに　auto_incrementされた値が入る
	userMapper.insertReturnId(user);
	
	return user.getUserId();
    }
}
```

### Controllerクラス

```UserController.java
@Controller
public class AuthController {

    @Autowired
    UserService userService;

    @RequestMapping(value = "/mypage")
    public String mypage(Model model) throws Exception {

        // auto_incrementされたuserIdが返ってくる
        int userId = userService.createUser("my name");

        model.addAttribute("userId", userId);

        return "mypage";
    }
}
```
IntelliJ CE + Spring Boot + Gradle + Kotlinで Hot Deploy(Hot Swapping)

少しハマったので

### 参考
https://medium.com/@bojanbelic/spring-boot-hot-swapping-a-gradle-project-in-intellij-with-kotlin-support-3559996dfafd

# 前提条件
IntelliJのバージョンが古いと対応していない場合があるので、最新にアップデートしておく
→これにハマりました



# 手順
ほとんど [参考URL](https://medium.com/@bojanbelic/spring-boot-hot-swapping-a-gradle-project-in-intellij-with-kotlin-support-3559996dfafd) の通りです。

１. IntelliJで対象プロジェクトを開く。

２. COMMAND + SHIFT + A(多分、windowsだと、CTRL + SHIFT + A)キー入力後、「build project automatically」と入力して、[build project automatically]を選択。

３. [preference] -> [build project automatically]にチェックを入れて、OKする
![スクリーンショット 2018-06-22 12.37.29.png](https://qiita-image-store.s3.amazonaws.com/0/37373/8a4ec489-35e9-d393-d138-32a495be51e7.png)
<br>

４. COMMAND + SHIFT + A(多分、windowsだと、CTRL + SHIFT + A)キー入力後、「Registry」と入力して、[Registry...]を選択。

５. [compiler.automake.allow.when.app.running]にチェックを入れる。
<img width="1025" alt="スクリーンショット 2018-06-22 12.42.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/37373/4a0e7086-76db-bd19-a9fe-5a7beedc31b7.png">

６. build.gradle に下記を追加。

```build.gradle
apply plugin: 'idea'


dependencies {
    compile('org.springframework.boot:spring-boot-devtools')
}


idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/kotlin/main")
    }
}
```

７. [bootRun]でデバッグ実行。設定がうまく適用されていると、実行後にktファイルを変更して保存すると、spring bootが自動で再実行されるようになります。

# うまくいかないときは

* メインメニュー[File] -> [Invalidate Caches / Restart...] 選択 -> [Invalidate and Restart]を選択(キャッシュを消して、IntelliJ再起動)でうまくいくことがあるらしいです（わたしはやらなくても大丈夫でした）。

<img width="274" alt="スクリーンショット 2018-06-22 11.57.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/37373/d524b69b-4f30-d448-82c5-79624e0e9e29.png">
<img width="615" alt="スクリーンショット 2018-06-22 11.57.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/37373/d782d851-7039-5a4c-541a-2f129d8dd8bb.png">
GCE instance groupをさわりました

Templateを作成

```shell
$ gcloud compute instance-templates create test \
    --machine-type n1-standard-1 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --boot-disk-size 10GB
```

Templateを利用しInstanceGroupを作成

```shell
$ gcloud compute instance-groups managed create test-group \
  --base-instance-name test \
  --size 2 \
  --zone us-central1-b \
  --template test
```

作成したInstanceGroupのInstanceを表示

```shell

$ gcloud compute instance-groups managed list-instances test-group --zone us-central1-b

NAME       ZONE           STATUS   ACTION  LAST_ERROR
test-ds57  us-central1-b  RUNNING  NONE
test-xt32  us-central1-b  RUNNING  NONE
```

サーバ台数を1にする

```shell

$ gcloud compute instance-groups managed resize test-group \
    --size 1 \
    --zone us-central1-b

```

作成したInstanceGroupのInstanceを表示し、１台になったことを確認

```shell

$ gcloud compute instance-groups managed list-instances test-group --zone us-central1-b
NAME       ZONE           STATUS   ACTION  LAST_ERROR
test-xt32  us-central1-b  RUNNING  NONE

```


ふたたびに２台にする

```shell

$ gcloud compute instance-groups managed resize test-group \
    --size 2 \
    --zone us-central1-b
```


２台であることを確認

```shell

$ gcloud compute instance-groups managed list-instances test-group --zone us-central1-b
NAME       ZONE           STATUS   ACTION  LAST_ERROR
test-64sp  us-central1-b  RUNNING  NONE
test-xt32  us-central1-b  RUNNING  NONE

```

いらないリソースを削除

```shell
$ gcloud compute instance-groups managed delete test-group --zone us-central1-b

```
pythonでROSとの競合を避けてOpenCVをimportする

ROSを入れた後にpythonで

```python
import cv2
```

とすると

```
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
```

というエラーが出る。
対処方法だけを説明すると


```python

import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
import cv2
```

とすることでOpenCVを読み込ませることができる。




# 原因調査

これはROSをインストールした際に .bashrcに書いた

```
source /opt/ros/kinetic/setup.bash
```

が問題を引き起こす原因となっている。

この行をコメントアウトすることで一時的に解決できるが、ROSを使う度にコメントアウトを外すのは非常に面倒である。

そのため、bashrcをいじる以外の方法を探した。


まず追加されたパスの確認のためにpythonで

```python
import sys
print(sys.path)
```

を実行すると

```
['', '/home/nvidia/catkin_ws/devel/lib/python2.7/dist-packages', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-aarch64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages', '/usr/local/lib/python3.5/dist-packages/IPython/extensions', '/home/nvidia/.ipython', '../']
```

のように追加されているパスが出力される。
よく見ると、その中に

```
'/opt/ros/kinetic/lib/python2.7/dist-packages'
```

が含まれていることが分かる


こいつが邪魔をしてOpenCVをimportできなくしているので、消してやれば良い
具体的には

```python
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
```

でpythonのプログラム中に追加してやれば良い。
GitLab Community Edition (CE) 用ローカル YUM リポジトリー作成手順

## 参考文献

- [gitlab/gitlab-ce - Mirroring · packages.gitlab.com](https://packages.gitlab.com/gitlab/gitlab-ce/mirror/)
- [Installation methods for GitLab | GitLab](https://about.gitlab.com/installation/)

## 手順

- `BASE_TARGET_DIR` は個別に設定すること。
- 事前に `` mkdir -p gitlab/gitlab-ce/el/7/`uname -m` `` などでダウンロード用のディレクトリーを作成しておくこと。

1. リポジトリー情報をインストールする。
   - `curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash`
1. (任意) インストール後, `/etc/yum.repos.d/gitlab_gitlab-ce.repo` の `enabled` の値を 0 にする。
1. 以下のスクリプトを作成し, crontab に登録する。

    ```sh
    #!/bin/sh
    BASE_TARGET_DIR=/var/www/html

    cd ${BASE_TARGET_DIR}/gitlab/gitlab-ce/el/7/`uname -m`
    reposync --repoid=gitlab_gitlab-ce --delete --norepopath --newest-only
    createrepo -o `pwd` -v --update .
    ```

どっとはらい。
MAC環境にAnsible導入後、AWSサービス構築までの道〜②awsモジュール実行までの設定〜

第2回目としてMacのvagrant上でAnsibleのaws moduleを使用とした際に発生したエラーをメモとして残す。
timezoneの設定したのですが、時刻がずれる問題が発生したため追加対応を実施（6/27追記）

## やったこと
cloudfront_distributionを使用して、新規distributionを構築する
ただ正常に動作するまでにいくつかエラーが発生したため、解消させる

## timezone設定
■事象
cloudfront_distributionを実行した際に、「Signature expired」エラーがは発生していた。
実行環境の時刻が遅れていると発生するエラー

■解決策
timezoneをJSTにする。

```sh
$ sudo timedatectl
      Local time: Fri 2018-06-22 03:17:04 UTC ← 「UTC」になっている
  Universal time: Fri 2018-06-22 03:17:04 UTC
        RTC time: Wed 2018-06-20 23:58:35
       Time zone: UTC (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

$ sudo timedatectl set-timezone Asia/Tokyo ← 「Asia/Tokyo」を指定

$ sudo timedatectl
      Local time: Fri 2018-06-22 12:17:33 JST ← 「JST」に変更されていること
  Universal time: Fri 2018-06-22 03:17:33 UTC
        RTC time: Wed 2018-06-20 23:59:03
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

（6/27追記）
$ localectl
System Locale: LANG=en_US.UTF-8
VC Keymap: us
X11 Layout: us

ロケールを日本語に設定
$ sudo localectl set-locale LANG=ja_JP.utf8

$ localectl
System Locale: LANG=ja_JP.utf8
VC Keymap: us
X11 Layout: us
```

CentOSの時間を同期するという件で検索すると、ntpの記事が多く見つかりますが、BOSSに相談したところtimezoneを修正した方がよいということでしたので、こちらを採用しました。

## boto&pipインストール
■事象
cloudfront_distributionを実行した際に、「Python modules」をインストールしてとメッセージが出た。

```sh
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Python modules \"botocore\" or \"boto3\" are missing, please install both"}
```
■解決策
「boto」「boto3」をインストールする。

```sh
$ sudo pip install boto boto3
-bash: pip: command not found
$ which pip
/usr/bin/which: no pip in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin)
```

pipコマンドがない。。。
インストールする。

```sh
$ sudo yum install python-pip
```

再度「boto」「boto3」をインストールする。

```
$ sudo pip install boto boto3
```

pipをupgradeしろとメッセージが出るが、問題なくインストールされている模様

```sh
You are using pip version 8.1.2, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

## 終了
これでようやくcloudfront_distributionを実行してもエラーが出なくなりました！
次回は実際にcloudfront_distributionを流した際のメモを書いていきます！
サクっとWebスクレイピング

私個人としてはスクレイピングしたい場面なんてほとんどありませんが、周囲の非エンジニアな人が手作業でコツコツと1,000件近いURLにアクセスして中身を抜き出すということをやってるのを目撃してしまいました。
エンジニアとして見過ごすわけにはいきませんね。

突っ込みますよ！私は！首を！

使い捨てのスクリプトなので細かいことにはこだわりません。
シンプルに時間をかけないことが目標です。

#言語選定
使う言語については、vba、vbs、rubyあたり調べてみましたがどうもパっとせず。。。
事前準備的なのが面倒くさいんですよ。
こっちは10分で終わらせたいんです。
却下です。

PHPにとても便利そうなライブラリを発見しましたので採用！
https://sourceforge.net/projects/simplehtmldom/files/
普段jQueryとかで慣れてる人はセレクタに近い感覚でDOM操作ができそうです。
※詳しい使い方はググってください

これで行くことに決めました。

#実装

```php

<?php
require 'simple_html_dom.php';
main();

function main() {
	$hoges = file_get_contents('./hogedata.txt');
	$hoges = explode("\r\n",$hoges);
	$base_url = 'https://example.com';
	$path = '/';
	// URLのリストを作ってループしたいだけなので、適宜カスタマイズしてください
	foreach($hoges as $hoge) {
		if( empty($hoge) ) {continue;}
		$url = $base_url . $path . $hoge;
		$scraped_content = scraping($url);
		saveTxt($scraped_content, $hoge);
	}
}

/**
 * URLのソースを取得して必要な部分だけ抜き出す
 */
function scraping($url) {
	$dom = file_get_html($url);

	// 不要な部分は削除
	$dom->find('#abc',0)->outertext = '';
	$dom->find('#xyz',0)->outertext = '';
	// 抽出
	$div_content = $dom->find('#hoge',0)->outertext;

	$dom->clear();
	return $div_content;
}

/**
 * テキストファイルに保存
 */
function saveTxt($txt, $filename) {
	$dir = './src/';
	file_put_contents($dir.$filename.".txt", $txt);
}
```

うぇーい。

今回は自社サーバへの接続でしたので考慮してませんが、サーバ負荷とか考える必要があったらsleep処理的なのを入れましょう。
Cognos クロス集計のセルにテキストを表示する

#概要
Cognos Analytics & BIで、クロス集計の交点にテキストを表示する手順です。
普通にクロス集計を使用する時は、交点はこのように数値データを配置して使用すると思いますが、ここに文字を表示したいという要件がある場合の対応です。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/9c3114c2-ba79-62a7-f833-c96ef4e22452.jpeg)

#手順
テストのために、Db2データソースに以下のようなデータを作成しています。
COL3をクロス集計の交点に置く予定ですが、COL3は文字データになります。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d21448d2-f1c5-0220-c54c-8d9cfc14549f.jpeg)

とりあえず、そのままFramework Managerに取り込んで、パッケージを発行してやってみます。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/c4f0c93d-0aca-35fc-3378-ab0eb73d72e4.jpeg)

行にCOL1、列にCOL2、交点にCOL3を置いて、レポート実行してみると、このように交点はブランクになります。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/70856359-0c3c-9e9b-4c97-c33c7d48bda6.jpeg)

もう一度、Framework Managerに戻って、COL3のプロパティから、使用方法を「ファクト」に変更して、パッケージを再発行します。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/0f0f0830-5c3d-0d6d-1252-396cdae816c5.jpeg)

再度クロス集計のレポートを作成し、実行します。
この通り、クロス集計でも文字データを交点に出力する事が可能です。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/40b1865f-e53e-fa1f-d5a9-d791293f4ca4.jpeg)

ご活用ください。
LibreOffice の Calc で Excel ファイルを開いたら、LOOKUP 関数でエラーになったので SUMPRODUCT 関数に修正する

LibreOffice の Calc で Excel ファイルを開いたら、
以下の様な LOOKUP 関数でエラーになった。

`=LOOKUP(1,0/(B47+ROW($1:$6)-1=B47:B52),B47:B52)`

ググっても、なかなか情報が出てこず結構困ったけど、
なんとか解決出来たので、シェア。

~~`=SUMPRODUCT((B47+ROW($1:$6)-1=B47:B52),(B47:B52))`~~
`=SUMPRODUCT((B47+ROW($1:$6)-1=B47:B52)*(B47:B52))`

とりあえず、
以下は同じ動作するみたいです。たぶん…。

`=LOOKUP(1,0/([配列]),[配列])`
~~`=SUMPRODUCT(([配列]),[配列])`~~
`=SUMPRODUCT(([配列])*([配列]))`

以上。

***

【2018/06/27追記】

すみません。
色々わかっていなかったみたいです…。

LOOKUP の関数は振替休日を算出する関数だったんですが、以下のページで詳しい説明がありました。

* [エクセルで予定表を作っていて、カレンダーの振り替え休日の式\.\.\. \- Yahoo\!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1125477511)

この LOOKUP 関数は、GW などの連なった祝日のどれかが日曜と重なった場合、最後の祝日の翌日を次の日を振替休日として、算出している様です。

`=LOOKUP(1,0/(B5+ROW($1:$6)-1=B5:B10),B5:B10)+1`

で、微妙に違うところもありますが、
これとほぼ同じ動きを SUMPRODUCT で行うと、

`=SUMPRODUCT((B5+ROW($1:$6)=B5:B10+1)*(B5:B10+1=B6:B11))+B5+1`

でいけるのではと思います。

LOOKUP 関数では、連なった祝日の最後の祝日を算出してますが、
SUMPRODUCT 関数では、連なった祝日の残りの祝日の数を算出しています。

例えば、05/03 が日曜だった場合、

LOOKUP 関数では、05/05 を算出し、それに +1 で 05/06、
SUMPRODUCT 関数では、05/03 の後の残りの祝日数を算出(2)し、それを 05/03 に足して、さらに +1 して、05/06 としています。

ただ、
(現実的には無いけど…)これでも微妙に違いが出るパターンが有ると思いますので、ご注意下さい。

適当な投稿で非常に申し訳ありませんでした…。

以上。
React-Native + MobXを動かす最小のサンプル

ReactNativeとMobXを併存して動かすサンプルはそう多くなくあるが、ストアの注入とかのコードが理解しづらかったのと、react向けの記事では動かない部分もあったりするので最小限のコードでMobXを動かしてみるという方法をメモしておく。

# MobXとはなにか
これは初心者の雑な理解。
ReactではUIパーツをコンポーネントという単位で開発する。コンポーネントはステートを持つことも可能だけれども、一般的な話だがステートを持つとテストしにくいとか、ステートの場所が散らばって管理が大変とかいう問題がある。
そこでその状態をもつ箇所を一箇所に集めてインターフェイスを統一する機構としてReduxという実装を用いるのがReactでは一般的になっている。

[結局FluxやらReduxやらって何なのか個人的なまとめ](https://qiita.com/syossan27/items/7e1b2e07ac68b96bdaa7)

しかし、Reduxで実装するために書かなければならないコードが多く煩雑なため見通しもあまり良くなかったり、ボイラープレート的なものを書く必要が多かったりして覚えるのが大変だし使うのも面倒という点で初心者にはツラいと言われている気がする。

そこでもっと記述量を減らした便利なステート管理をするツールとしてMobXというのが使われる。しかし日本ではあまりMobXの採用事例がないっぽく、解説記事が英語の記事ばかりでそれはそれで初心者にはツラいなあみたいな状況がある気がする。

# 環境
react-native-cli: 2.0.1
react-native: 0.55.4
node 8.11.1

https://facebook.github.io/react-native/docs/getting-started.html
ここを参考に環境構築する。本筋ではないが、`Building Projects with Native Code`の方で作成している(Quick Startだとネイティブ実装が必要でも書くことができないため)
以下、 `react-native init ${プロジェクト名}`で作成したscaffold上での作業として記載している。

# 必要なパッケージをインストール
```
yarn add mobx # mobx本体
yarn add mobx-react # mobxをreact上で使うのを楽にしてくれるなにか
yarn add babel-preset-react-native-stage-0 # mobxのコードを書くときデコレーター(Javaでいうアノテーション的ななにか)を使用しているためこれを解釈するために必要
```

# babelの設定を追加
```:.babelrc
{
  "presets": ["react-native", "react-native-stage-0/decorator-support"]
}
```
特に何もしなければ `presets`の中はreact-nativeしかないが、これにインストールした `react-native-stage-0/decorator-support`を追加してデコレーターを使用可能にする。

# Storeを作成する
```javascript:MyStore.js
import {
  observable,
  action
} from 'mobx'

class MyStore {
  @observable num = 0;

  @action.bound async incrementAsync() {
    await new Promise((resolve) => {
      setTimeout(() => {
        this.num += 1;
        resolve();
      }, 1000)
    });
  }
}

const mofu = new MyStore()
export default mofu;
```

`@observable`を付与した値はこの値が変更されたときに、これをobserveしているコンポーネントに変更が通知され、当該コンポーネントが再描画されるようになっている。

`@action.bound`を使用するとobservableな値を加工する関数を書くことができる。今回はsetTimeoutとPromiseを使用した疑似非同期メソッドを作成したが、axiosなどで非同期にインターネット経由で値を書き込むといった使い方がユースケースとして想定される。

# コンポーネント側で読み取る
```jsx:App.js
import React, { Component } from 'react';
import {
  Button,
  Text,
  View
} from 'react-native';
import { observer } from 'mobx-react/native'
import MyStore from './MyStore'

type Props = {};

@observer
export default class App extends Component<Props> {
  render() {
    return (
      <View>
        <Text>{MyStore.num.toString()}</Text>
        <Button onPress={MyStore.incrementAsync} title="countUp"/>
      </View>
    );
  }
}
```
`@observer` はコンポーネント内で使用するストアに属するobservableな値の変更を検知したい場合に付与する。こうすると値が変更されたときに、ストアの値を使用しているコンポーネントがプロパティを置き換えて再描画される。

# 動作イメージ
![Jun-22-2018 12-56-43.gif](https://qiita-image-store.s3.amazonaws.com/0/89807/2431d968-3b79-3a10-c3cc-682d83a1dc35.gif)
初期状態で、Textはストアの値（num=０）を表示している。ボタンを押すとStoreのincrementAsyncメソッドが呼び出され、1秒後にnumの値が1増えた状態に書き換えられる。その変更がTextに通知され、Textの中の値が書き換わった状態で再描画されている。
AWS  EC2オートスケーリングで新しいインスタンスの準備ができるまでアタッチを待機させるには

## 結論

ライフサイクルフックを設定する。

## 概要

オートスケーリングによってALBにWebアプリサーバのEC2インスタンスが追加された時、一時的に一部のリクエストが502 Bad Gatewayなどを返す現象が発生する場合があります。

おそらく新しいインスタンスのソフトウェアの起動などの準備ができる前にALBにアタッチされてしまうのが原因だろうな。ということで、インスタンスが起動してからALBにアタッチするまでに待ち時間を入れる方法がないか調べてみました。

## Auto Scalingグループの待機時間設定

それっぽい設定として、Auto Scalingグループの「デフォルトのクールダウン」と「ヘルスチェックの猶予期間」というのがありますが、これらは目的のものとは違いました。まずはこの2つの設定の意味について。

#### デフォルトのクールダウン

インスタンスを起動、追加している最中に、さらにインスタンスが追加されてしまうことがないようにするための待ち時間。デフォルトは5分。

#### ヘルスチェックの猶予期間

インスタンスを起動、追加している最中に、Unhealthyと判定されて起動したばかりのインスタンスが削除されしまうことがなようにすための待ち時間。デフォルトは5分。


ということで期待したものと違いましたね。正解としては「ライフサイクルフック」を追加することで、インスタンス起動後に一定時間待機させることができました。

## ライフサイクルフックでALBへのアタッチを待機

コンソールのAuto Scalingグループの「ライフサイクルフック」タブを開き、「ライフサイクルフックの作成」をクリックします。次のような設定で作成します。

![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/9148/db48291d-d548-7eda-b5d1-cef4239c58ed.png)

<dl>
<dt>ライフサイクルフックタイプ</dt>
<dd>インスタンスの作成</dd>
<dt>ハートビートのタイムアウト</dt>
<dd>120（待機時間秒数）</dd>
<dt>デフォルトの結果</dt>
<dd>CONTINUE</dd>
</dl>

この設定を入れると、スケールアウトで新しいEC2インスタンスが起動した後、2分間待機してからALBにアタッチされるようになります。
エクスプローラーのアドレスバー

## <i class="fa fa-paw fa-fw"></i>知らなかった:grimacing:
よくよく考えてみたら当たり前のことかもしれないのですが，以前からエクスプローラーのアドレスバーに `cmd` と入力して，現在のフォルダの場所をコマンドプロンプトで開いていたのですが，`notepad`などのアプリケーションも開くことが出来るのですね．

ちなみに，私は，[この記事](https://qiita.com/ignorant/items/1faca49b0b8a6d3377a9)の`wslemacsclient.bat` を `PATH` の通った場所において，アドレスバーから `wslemacsclient フォイル名` で `WSL` 上の `Emacs` でファイルを編集しています．

`cmd` しか動作しないかと思ったのは，おっさんになったからかもしれません．まぁ，おっさんになる前(?)からアドレスバーに `cmd` と入力して，コマンドプロンプトを開いていましたが…:frowning2:
date-fnsでSSRした時の「Text content did not match」

# エラー

SSRをする場合、サーバーとクライアントでのレンダリング結果が一致していないとエラーが出る。

[date-fns](https://date-fns.org/)を使って、日付のフォーマットをした時に以下のような現象に遭遇した。

```js
const dateFormat = (date: string) => {
  return format(new Date(date), 'YYYY/MM/DD HH:mm:ss')
}
```

```
Warning: Text content did not match.
Server: "2018/06/20 05:01:02" Client: "2018/06/20 14:01:02"
```

[Dateオブジェクトにはタイムゾーンのデータが格納されていない](https://stackoverflow.com/questions/15141762/how-to-initialize-javascript-date-to-a-particular-timezone/15171030#15171030)とのことで、そのままformat関数に渡すだけだとレンダリング結果にズレが出ているのがわかる。

これはサーバーとクライアントとで、コードを実行している現地時間を返しているためらしい。（※[Moment.jsはタイムゾーンもライブラリで扱える](https://momentjs.com/timezone/))

# 解決法

Dateオブジェクトにタイムゾーン情報を明示してから関数に渡す。

```js
format(
  new Date(date).toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' }),
  'YYYY/MM/DD HH:mm:ss'
)
```
確率論 ~分布関数と確率(密度)関数~

# 分布関数

$(\;Ω,\;F,\;P\;)$ 上の確率変数 $X$ について、

```math
F_X(x)=P(X\!\leq\!x)
```

を満たすような $F$ を $X$ の分布関数という。

分布関数 $F$ は次の条件を満たす。

```math
1. \quad x\leq y \; \Rightarrow \; F(x)\leq F(y) \quad (単調性) \\
```

```math
2. \quad F(x) = \lim_{\epsilon \to +0} F(x \! + \! \epsilon ) \quad (右連続) \\
```

```math
3. \quad \lim_{x \to -\infty} F(x) = 0, \quad \lim_{x \to +\infty} F(x) = 1
```

# 確率関数と確率密度関数

## 離散型

$F(x)$ が有限または可算個の点でのみ増加するとき、**離散型**という。
増加点を $x_0,\;x_1,\;...$ としたとき、

```math
p(x_i) = \; F(x_i) - F(x_{i-1}) \quad (i=0,\;1,\;...) \\
ただし、\; F(x_{-1})=0\;とする
```

を満たすような $p$ を確率関数という。

確率関数 $p$ は次の条件を満たす。

```math
1. \quad p(x_i) \geq 0 \quad (i=0,\;1,\;...)
```

```math
2. \quad \sum_{i=0}^{\infty} \; p(x_i) = 1
```

このとき、

```math
F(x) = \sum_{x_i \leq x} \; p(x_i)
```

とおくと、$F$ は分布関数となる。

## 連続型

$F(x)$ が全ての $x$ で微分可能のとき、**連続型**という。

```math
f(x) = F'(x)
```

を満たすような $f$ を確率密度関数という。

確率密度関数 $f$ は次の条件を満たす。

```math
1. \quad f(x) \geq 0
```

```math
2. \quad \int_{-\infty}^{\infty} \; f(x)\;dx = \; 1
```

このとき、

```math
F(x) = \int_{-\infty}^{x} \; f(t)\;dt
```

とおくと、$F$ は分布関数となる。