OmniAICreator/Qiita-1.07M huggingface dataset:
RLS(Rust Language Server)をVimで使う

## 前提
MacOSX or Linux環境でのみ動作確認しました。
RustはNightly(1.17)前提です。

```console
$ rustup default nightly
```

## RLSのビルドとセットアップ

```console
$ cd $HOME
$ git clone https://github.com/rust-lang-nursery/rls.git
$ cd rls
$ cargo build --release
```

`.bash_profile` あたりに環境変数を設定しておきます。

```
export LD_LIBRARY_PATH=$HOME/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib
export RLS_ROOT=/PATH/TO/rls
```

標準ライブラリのメタデータをダウンロードしておきます。

```console
$ rustup component add rust-analysis
```

動かしてみます

```console
$ cargo run --release --manifest-path=$HOME/rls/Cargo.toml
    Finished release [optimized] target(s) in 0.1 secs
     Running `codereading/rls/target/release/rls`
Content-Length: 60

{"jsonrpc": "2.0", "id": 1, "method": "exit", "params": {}}
$
```

動きました。デフォルトだと標準入力からコマンドを受け付けているようです。

## Vimの設定
Language Serverとのやりとりには [prabirshrestha/vim-lsp](https://github.com/prabirshrestha/vim-lsp) を使います。

```vim:.vimrc
call plug#begin('~/.vim/plugged')
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
call plug#end()
```

Vimを起動してプラグインをインストールします。

```
:PlugInstall
```

RLS用にftpluginを追加します。
https://raw.githubusercontent.com/prabirshrestha/vim-lsp/master/example.vim
これを編集して、 `$HOME/.vim/ftplugin/rust/rls.vim` あたりに保存します。

以下を追加。パスは適当に修正してください。

```vim:.vim/ftplugin/rust/rls.vim
function! s:get_root_uri_for_rust()
    return s:path_to_uri(expand('~/rls'))  " cloneしたrlsのディレクトリ
endfunction

function! s:get_lsp_server_cmd_for_rust()
    return ['rustup', 'run', 'nightly', 'cargo', 'run', '--release', '--manifest-path=/home/vagrant/rls/Cargo.toml']
endfunction
```

## VimでRustのファイルを開いたときにRLSが動いてるか確認

```console
$ ps aux | grep cargo
vagrant  14348  0.0  0.4  28876  8920 ?        Ss   15:11   0:00 rustup run nightly cargo run --release --manifest-path=/home/vagrant/rls/Cargo.toml
```

OK

## 使ってみる

適当なワードにカーソルを合わせて以下を入力すると定義位置にジャンプできます。

```
:GoToDefinition
```

`$HOME/.vim/ftplugin/rust/rls.vim` をもう少し改造してさらに使いやすくできるのではないでしょうか。

以上です。
MySQLでSELECTした結果をUPDATEしたい

データ移行作業がありMySQLでSELECT UPDATE的なことができるかを調査したところ、
以下のSQLでできたので備忘録として残しておきます。

```sql
UPDATE
    tableA t1,
    tableB t2
SET 
    t1.column_01 = t2.column_01
WHERE
    t1.id = t2.id
```

t2の内容をt1に更新するSQLとなります。

今回の移行はdate → timestampの型変換もあったので、
一緒に残しておきます。

```sql
SET
    t1.timestamp = from_unixtime(t2.date) 
```
C++ Builder / TCanvas > Chordを描いて中の色を塗る 

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

関連 http://qiita.com/7of9/items/a5c05ddddd268d8e82e7

塗りつぶしを試す。

[TCanvas.FloodFill Method](http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Graphics_TCanvas_FloodFill.html)

```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)
{
	TRect R = GetClientRect();
	//            X1      Y1     X2       Y2        X3       Y3     X4      Y4
	Canvas->Chord(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);

	Canvas->Brush->Color = clBlue;

	long hormid = (R.Left + R.Right) / 2;
	Canvas->FloodFill(hormid, R.top - 100, clBlack, fsBorder);

}
//---------------------------------------------------------------------------
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8ba3f826-d2fc-9f90-72a9-4f0e4f34f30b.png)

- ボタンを2回押さないと中の色を塗らない
- 他のウィンドウで隠された後、描画されない


参考 http://stackoverflow.com/questions/24931706/how-to-repaint-canvas-just-in-time

描画をきちんとするにはFormPaint()で実装するようだ。

```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::FormPaint(TObject *Sender)
{
	TRect R = GetClientRect();
	//            X1      Y1     X2       Y2        X3       Y3     X4      Y4
	Canvas->Chord(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);

	Canvas->Brush->Color = clBlue;

	long hormid = (R.Left + R.Right) / 2;
	Canvas->FloodFill(hormid, R.Top + 50, clBlack, fsBorder);
}
//---------------------------------------------------------------------------
```

こちらでは、他のウィンドウで隠してから表示してもきちんと描画される。
C++ Builder XE4, 10.2 Tokyo > TCanvas > Arcを描く

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

Arcを描きたくなった。

[TCanvas.Arc Method](http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Graphics_TCanvas_Arc.html)

> Use Arc to draw an elliptically curved line with the current Pen. The arc traverses the perimeter of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The arc is drawn following the perimeter of the ellipse, counterclockwise, from the starting point to the ending point. The starting point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X3,Y3). The ending point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X4, Y4).

何を言っているのかさっぱり。
文章で書くよりは図の１つでも掲載すれば、閲覧者の理解は早まると思う。

```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)
{
	TRect R = GetClientRect();
	//          X1      Y1     X2       Y2        X3       Y3     X4      Y4
	this->Canvas->Arc(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);
}
//---------------------------------------------------------------------------
```

とりあえず図示した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b9883c6c-e0b3-f906-48e0-10384982d529.png)

- Arcのサイズは1,2の点で指定
- 開始位置は3で指定
- そこから反時計回りに
- 終了位置4まで弧を描く
- 弧が切れるのは、楕円(もしくは円)の中心(c)と3の点の交差点
  - 終了点も同様 (cと4の交差点)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b09b14cd-20ba-e247-f2a5-44ce447bdbb6.png)

これを少し変更すれば、[Pie Chart](https://en.wikipedia.org/wiki/Pie_chart)のoverlapping機能付きグラフが完成するだろう。
CentOS-6.7でphp-gdが入らない

・CentOS-6.7
・php-5.6

入れたいものは`php56-php-gd.x86_64`

```
$ yum list | grep php-gd
php-gd.x86_64                             5.6.30-1.el6.remi            @remi-php56
php54-php-gd.x86_64                       5.4.45-13.el6.remi           @remi
php56-php-gd.x86_64                       5.6.30-1.el6.remi            @remi-safe
php55-php-gd.x86_64                       5.5.38-7.el6.remi            remi-safe
php70-php-gd.x86_64                       7.0.17-1.el6.remi            remi-safe
php71-php-gd.x86_64                       7.1.3-1.el6.remi             remi-safe
```
自分の扱ってるPHPのバージョンを確認して下さい

手順を書いていきます

下記の様に単純に入れるとこけるので

```
$ sudo yum --enablerepo=remi,remi-php56 install php-gd
```

gdを先に入れる

```
$ sudo yum --enablerepo=remi,remi-php56 install php-last
```


tlibを入れる

```
$ sudo yum --enablerepo=remi,remi-php56 install t1lib
```

CentOS-6.7でphp-gd を入れたい場合、
先にgd-lastとt1libを入れてから、php-gd を入れる必要があるらしい
App Storeレビュー返信機能を試して見る

# App Storeのレビュー返信機能を早速試してみた

待望のストアレビューの返信機能が！
早速試してみたました。

## 公式ドキュメント
[Monitoring Reviews on the App Store](https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/ImprovingCustomersExperience.html#//apple_ref/doc/uid/TP40011225-CH27-SW1)
[Ratings, Reviews, and Responses](https://developer.apple.com/app-store/ratings-and-reviews/)

## 返信
1. iTunes Connectにログインして、マイアップ > アプリを選択 > アクティビティ > 評価とレビューを選択
2. 各レビューに「返信」が！
![replay.png](https://qiita-image-store.s3.amazonaws.com/0/63158/f2bf5991-ad47-c5ef-d5b9-eaa39a580fba.png)
3. 「返信」をポチッ
<img width="736" alt="スクリーンショット 2017-03-28 9.03.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/63158/cb09c399-d495-33d9-ac79-2d1c3ecad9c6.png">
5970文字まで書けるみたいです。


4. 返信を書いたら「送信」ボタンをポチッ
5. 保留中になりました。どれぐらいで、どのような感じでストアに表示されるかはまだ不明です。
<img width="1162" alt="スクリーンショット 2017-03-28 9.03.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/63158/72912918-0a16-5763-d62e-8a6b30973109.png">

6. 約6時間後にStore上でも確認できました。
![rep.png](https://qiita-image-store.s3.amazonaws.com/0/63158/8a0901d2-e6de-eb9c-8e0d-0871c2c472ea.png)


## 問題報告
各レビューに対して問題報告もできるようです。

レビューの下に「問題を報告する」
![mondai.png](https://qiita-image-store.s3.amazonaws.com/0/63158/24c9737b-bf7e-8399-d26d-790211bd856c.png)

ここをポチるとこんな感じ。
<img width="722" alt="スクリーンショット 2017-03-28 9.03.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/63158/b2c54c30-dcbc-7b3e-c082-d70736de2360.png">


問題点の選択肢はこんな感じ。
<img width="713" alt="スクリーンショット 2017-03-28 9.03.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/63158/1df4258a-0421-a729-f33e-1ed9a5ac2962.png">

## その他
- レビューに返信すると、ユーザに通知が飛ぶそうです。

```
When you reply to a review, the customer will be notified of your response and will have the option to update their review. 
```

以上です！
MySQLの初期パスワードが期限切れの場合のパスワード変更方法

初期パスワードがわからない場合は、ログからインストール時に設定されているパスワードを調べる
```# grep password /var/log/mysqld.log```

次のコマンドでmysqlに接続。
```mysql -p  --connect-expired-password```
パスワード入力を求められるので、初期パスワードを入力する。```--connect-expired-password```つけるのがポイント。

次のコマンドでパスワードを変更(xxxxxxxxxxxが設定するパスワード）
```mysql> alter user 'root'@'localhost' identified by 'xxxxxxxxxxx';```
フィーチャートグル機能を提供するJavaライブラリFF4Jへ加えた最近の修正

※2017/03/28 v1.6.3時点のコト

ここ2週間、夜な夜なフィーチャートグル(フィーチャーフラグ)機能を提供するJavaライブラリFF4Jで遊んでみたので、v1.6.4-SNAPSHOTで見つけた不具合修正と、PRコメントの流れで日本語化対応をした。

ちなみに、フィーチャートグルでは、LaunchDarklyというSaaSが有名。
https://launchdarkly.com/
<img width="1129" alt="launchdarkly" src="https://qiita-image-store.s3.amazonaws.com/0/1137/92728b88-25e1-d804-2982-8471539d97ba.png">


フィーチャートグルが初めての人は、こことリンクを読むと良い。
- [https://ja.wikipedia.org/wiki/フィーチャートグル](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88%E3%82%B0%E3%83%AB)
- [Pete HodgsonさんのFeature-togglesが面白かったので翻訳してみた](http://qiita.com/TsuyoshiUshio@github/items/51c6662cd45bded95389)

FF4J
- https://github.com/clun/ff4j
- http://ff4j.org/

```
FF4j is an implementation of Feature Toggle pattern : Enable and disable features or your applications at runtime thanks to dedicated web console, REST API, JMX or even CLI.
```

<img width="996" alt="FF4J" src="https://qiita-image-store.s3.amazonaws.com/0/1137/efe4f958-b634-8191-6ded-ab9923cd0f6a.png">

日本だと、WEB+DB PRESS Vol.88のJavaの鉱脈で紹介されたくらい？
http://gihyo.jp/magazine/wdpress/archive/2015/vol88

同じくJava用で `Togglz` というのもあるけど、サイトと管理コンソールのデザインが好みではなかった。ContributorやStar、Forkはこちらの方が多い。
- https://www.togglz.org/

<img width="961" alt="togglz" src="https://qiita-image-store.s3.amazonaws.com/0/1137/4b695c22-e94e-cea1-6353-4712f0edb94c.png">


## v1.6.4に取り込んでもらえそうなPR
### 機能追加
- 日本語表示を選択できるようにラベル追加＆言語選択追加 [#209](https://github.com/clun/ff4j/pull/209)
    - イケてない部分に気付いたら、どなたか修正して欲しい

### バグ修正(管理コンソール)
- フィーチャーの初期パラメーターが複数指定されてる場合に1つしか表示されない
 [#212](https://github.com/clun/ff4j/pull/212)
- プロパティ編集モーダルを表示するとフィーチャー編集モーダルの説明がクリアされちゃう  [#208](https://github.com/clun/ff4j/pull/208)
- マルチバイト文字列を入力すると表示が化けちゃう。海外あるある [#206](https://github.com/clun/ff4j/pull/206)
- XML出力時に裏でエラー出ちゃってる [#203](https://github.com/clun/ff4j/pull/203)
- XML入力時に上手くページ表示できない [#200](https://github.com/clun/ff4j/pull/200)
- HTMLコメントに不正文字列が含まれてて一部ページ表示できない [#201](https://github.com/clun/ff4j/pull/202)
- フォーラムへのリンク先がフランス語なので英語に変更 [#205](https://github.com/clun/ff4j/pull/205)
- 英語ラベルにフランス語混じってる [#210](https://github.com/clun/ff4j/pull/210)
- JavaDocコメントの修正 [#202](https://github.com/clun/ff4j/pull/202)

### バグ修正(core)
- Auditが有効な状態でフィーチャー編集からプロパティ追加するとロック待ちでタイムアウトしちゃう [#211](https://github.com/clun/ff4j/pull/211)

### バグ修正(その他)
- README.mdのSyntaxエラー [#207](https://github.com/clun/ff4j/pull/207)


まだまだ改善ポイントはあるので、PRやIssueを作って応援したい。
donateしようとしたら、PayPal.Meが日本からだと使えなくて断念...。
SQL Serverで正規表現

SQL Serverでは標準機能で正規表現を実装していない。
どうやらOSSで正規表現関数がある模様。

DevNambi/sql-server-regex: Run regular expressions in SQL Server
https://github.com/DevNambi/sql-server-regex

ただ比較的新しく、ほかにもないか調査中。
試したら、後で詳しく書く。
Python > None / True / False > if src is None: / Syntax: a is b / Function: is_(a, b) > is: オブジェクトが同一か / id(a) / ==: 同値かどうか / Flyweightパターン / 数値 比較には==を使う

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2484 / 12833)

> To distinguish None from a boolean False value, use Python's is operator:

実装してみた。

http://ideone.com/488p91

```py
def is_none(src):
	if src is None:
		print('None')
	elif src:
		print('True')
	else:
		print('False')

is_none(None)
is_none(0)
is_none([])
is_none({})
is_none(True)
print
is_none(1)
is_none([3.14, 2.718])
is_none({'pi', 3.14})
```

```txt:結果
Success	time: 0.01 memory: 23304 signal:0
None
False
False
False
True

True
True
True
```

http://monmon.hateblo.jp/entry/20110214/1297710749
上記のリンクに記載の以下も参考になる。
http://jaredgrubb.blogspot.jp/2009/04/python-is-none-vs-none.html

https://docs.python.org/3.6/library/operator.html#operator.is_
> operator.is_(a, b)
Return a is b. Tests object identity.

https://docs.python.org/3.6/library/operator.html#mapping-operators-to-functions
Syntaxが`a is b`で、Functionが`is_(a, b)`


<hr>
@shiracamus さんの[コメント](http://qiita.com/7of9/items/51ed254530dffb5a0815/#comment-e687d65ea5710da8821b)にて以下の事項を教えていただきました。
情報感謝です。

- isはオブジェクトが同一か比較
- オブジェクトid
   - id(a)
- `==`は同値か比較
- Flyweightパターン
   - 関連: http://qiita.com/u_kan/items/bdef41767fc526e1da0f
   - 関連: http://docs.python.jp/3/c-api/long.html
   - > 現在の実装では、-5 から 256 までの全ての整数に対する整数オブジェクトの配列を保持するようにしており、...
- 数値比較には is ではなく == を使いましょう
Xubuntu：消えたマウスポインタの復活

Xbuntuで、一度supend状態になって再ログインすると、マウスポインタが消えていた。

調べると、多くの人が経験しているようだ。
https://bugs.launchpad.net/ubuntu/+bug/1573454

「Ctrl+Alt+F1」からコンソール上でログインして、「Ctrl+Alt+F7」で戻ってくると、マウスポインタが戻ってくる、という有力な情報を得た。
https://bugs.launchpad.net/ubuntu/+bug/1573454/comments/9

当座はこれで凌げそうである。
App Storeのユーザーレビューに返信できるようになったよ

本日（2017.3.28）からApp Storeのユーザーレビューに、開発者が返信できるようになりました。

以下は[アップルの公式ドキュメント](http://developer.apple.com/)を日本語に要約したものです。

# 概要

返信内容は全体に公開されます。開発者がユーザーレビューに返信すると、レビューを書いたユーザーに通知（メール）が届きます。また、それを受けてユーザーがレビューコメントを編集した場合は開発者に通知（メール）が届きます。

開発者による返信コメントは開発者自信が削除しない限りずっと残り続けます。

開発者への通知設定はiTunes Connectの「ユーザと役割」から管理できます（デフォルトでは届かない設定になっています）。

返信したコメントが反映されるまでに最大で24時間かかります。

# 誰が返信できるの？

iTunes Connect上で次の権限を持つアカウントが返信できます。

* Legal
* Admin
* App Manager
* Marketer

# 返信したコメントはどこから見られるの？

次の環境で閲覧できます。

* iOS 10.3 以上がインストールされた iPhone および iPad の App Store
* OS X 10.6.6 以上がインストールされた Mac の App Store


# ユーザーレビューに返信する方法


1. [iTunes Connect](https://itunesconnect.apple.com/)にログインし、「マイApp」を選択
2. 画面上部のツールバーから「アクティビティ」を選択
3. 左のカラムから「評価とレビュー」を選択
4. レビューの右側にある「Reply」をクリック
5. 表示される画面からユーザーレビューに返信する

<img width="680" alt="app_activity_view_reviews_and_responses_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/8292/acc886c0-b262-acb2-de31-961010f45489.png">（[公式ドキュメント](http://developer.apple.com/)の画像を引用）

同じ画面から返信コメントの「編集」「削除」ができます。

<img width="680" alt="app_activity_edit_responses_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/8292/a74a012f-afc6-ed0a-7189-2f2197457ae5.png">（[公式ドキュメント](http://developer.apple.com/)の画像を引用）

# リンク

* [Monitoring Reviews on the App Store](http://developer.apple.com/)
Python / numpy > list(numpy array)のファイル保存・読込

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowの学習後のinput batch, output batch, predictionの値をファイルに保存し、それを別のPython scriptから利用しようとしている。

numpyでバイナリ書き出しすることでできそうだ。

関連 [numpy > ファイル読み書き > np.save() / np.load() / np.savetxt() / np.loadtxt() > バイナリ読み書き / csv読み書き](http://qiita.com/7of9/items/c730990479687ec2e959)

以下のコードを実装してみた。

```test_python_170324a.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np

# on Python 2.7.6

# 1. save
inpbt1 = np.array([[3, 1], [4, 1], [5, 9]], dtype='f')
inpbt2 = np.array([[2, 7], [1, 8], [2, 7]], dtype='f')
inpbt3 = np.array([[6, 0], [2, 2], [10, 23]], dtype='f')
alist = list([inpbt1, inpbt2, inpbt3])
print(alist)

FILENMAE = 'test_res_170328a.npy'
np.save(FILENMAE, alist)

# 2. load
rddat = np.load(FILENMAE)
for idx, elem in enumerate(rddat):
    print('%d:%s' % (idx, elem))
```

```txt:結果
$ python test_python_170324a.py 
[array([[ 3.,  1.],
       [ 4.,  1.],
       [ 5.,  9.]], dtype=float32), array([[ 2.,  7.],
       [ 1.,  8.],
       [ 2.,  7.]], dtype=float32), array([[  6.,   0.],
       [  2.,   2.],
       [ 10.,  23.]], dtype=float32)]
0:[[ 3.  1.]
 [ 4.  1.]
 [ 5.  9.]]
1:[[ 2.  7.]
 [ 1.  8.]
 [ 2.  7.]]
2:[[  6.   0.]
 [  2.   2.]
 [ 10.  23.]]
```

上の結果はTensorFlowで学習後にprint()した時と同じデータ形式。batch_size=3, 3回iterationした例。
下の結果は保存したファイルから読み込んで出力。

https://hydrocul.github.io/wiki/numpy/ndarray-io.html
> np.save と np.load はファイルにndarrayを出力したり、ファイルから入力したりできる。ファイルのフォーマットはバイナリで、ファイル名の拡張子にはよく.npyを使う。 1ファイルにndarrayを1つ保存できる。

input batch, output batch, predictionをそれぞれ別のファイルに保存しようかと検討中。

しかしながら、predictionを取得していくと、その間も学習が進んでしまいそうで、weightとbiasを保存してネットワークを再構成する方がいいかもしれない。
http://qiita.com/7of9/items/ce58e66b040a0795b2ae
技術英語 > I know my car's days are numbered,...

@ 電話 

「お使いになっているinfobar 2は3G回線の終了にともない使用できなくなります」

2008年10月13日から使っていたお気に入りだったが、回線終了に備えて変更を検討しないといけない。

残り日数という言いまわしは「days are numbered」として挙げられる。

http://idioms.thefreedictionary.com/days+are+numbered

> I know my car's days are numbered,...

上記の例の場合、「適当に」翻訳すると(間違っている可能性あり)

「Your infobar2's days are numbered subject to the end of the 3G network service in the near future.」

喧嘩を売っているような文面になった。。。
Android アプリに内蔵 PDF ビュワーを実装させるな

前提
====

やれるパワーがある人はやって下さい。潤沢な開発リソースがある上で、内蔵 PDF ビュワーを実装することが「他のアプリには無い価値を提供する」為の主な目的である場合はこの記事では対象としません。

この記事の趣旨は、これから実装する上で方針を悩んでる場合や客観的な視点で顧客を説得する必要がある場合の為の参考です。

現状
====

まず **iOS とは異なり** WebView は PDF の描画に対応しておらず、Intent が飛ぶかダウンロードが始まります。PDF.js を利用して無茶して読ませることは可能なようですが、快適では無いでしょう。

プラットフォームの API は Android 5.0 以降のみ存在します。これでひとつのドキュメントを全ページ表示する場合、

- ファイルオブジェクトを作成し
- PdfRenderer オブジェクトとして初期化し
- オブジェクトからページ数を取得
- openPage() で取得した Page オブジェクトを ImageView に対し描画、close() 、を全ページに対して実施
- PdfRender のクローズ

という実装を行う必要があります。

https://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html

ImageView に描画、ということは埋め込みリンク等には対応しません。ピンチイン/アウトやズーム等も独自に対応する必要があります（ImageView に対して操作を提供するライブラリは使用出来るでしょう）。

サードパーティのライブラリは基本的に有償ライセンスのものが多く、無償の場合は実装が古く Deprecated となっているか大抵 GPL 互換のライセンスであり、商用利用の場合は注意が必要だったりします。現状 Apache 2.0 ライセンスのもと利用可能かつアクティブなライブラリとしては [barteksc/AndroidPdfViewer](https://github.com/barteksc/AndroidPdfViewer) がありました。16MB 程の各アーキテクチャに向けたネイティブ実装を持つライブラリに依存する為、APK のサイズは肥大化するようです。

何故こんなことになっているのか
===========================

そもそも Android は Intent という仕組みにおいて、各ファイルや URL 等をうまく処理出来るアプリがあればそちらに処理を委ねてよきに図らうというプラットフォーム自体の方針があります。Android ユーザーはその操作体系に慣れているので、Intent を利用することによるユーザー体験を損ねることは少ない筈です。Intent を発行し、対応出来るアプリが無ければ Adobe Reader アプリ等のストアへの案内を行うというのが妥当な実装ではないでしょうか。

勿論 Intent を飛ばすか内部ビュワーで表示するか選択出来るのが尚親切だというのはあるでしょう。しかしその為に、

1. スタンドアロンなビュワーアプリ作成を想定されているような API を使用し、PDF の細かい仕様に対応しながら実装、メンテナンスを続けていくか
2. PDF.js を使用して WebView の中に無理矢理重くて操作感の厳しい PDF をレンダリングするか
3. 有償のライブラリの試用版を片っ端から比較し（メールアドレスの登録が必要だったりと別の手間も発生する場合がある）選定、各アプリ毎にライセンス料を支払い利用するか
4. APK サイズの肥大化を許容した上でネイティブ実装を持つライブラリを利用するか

のトレードオフが許せるか、というのはよく検討が必要です。1/2/3 の方法を選択する場合はその部分だけでかるくひとつのアプリを作成するくらいの工数を見積りたいところです。

[barteksc/AndroidPdfViewer](https://github.com/barteksc/AndroidPdfViewer) については正直この記事を書いている途中に発見したのですが、軽く見た感じ提供されている API がいい感じであり要件を満たすならば有力な選択肢になるかもしれません。

結論
====

ディレクションする上で Android を使用したことのない iOS ユーザーが自分の価値観だけでエンジニアにアプリのユーザー体験を説教するのをやめろ
SRM 622 DIV2 FibonacciDiv2

topcoder 問題をちょっと解いてみようかな。SRM 622 DIV2 FibonacciDiv2

public class FibonacciDiv2 {

	public int find(int N) {
		if (N == 1) {
			return 0;
		}
		int a1 = 1, a2 = 1, a3= 1;
		int min = Integer.MAX_VALUE;
		while (true) {
			a3 = a1 + a2;
			a1 = a2;
			a2 = a3;
			min = Math.min(min, Math.abs(a3 - N));
			if (a3 > N) {
				break;
			}
		}
		return min;
	}

}
JavaScript でテキストエリア内のカーソルのある位置に文字列を挿入する方法

# :warning: 注意
この記事の方法では、undo (`command + z`) や redo (`command + shift + z`) が効きません。undo や redo を有効にした状態で同じことを実現するための記事を追加で書きましたので、よろしければそちらをご覧ください。

[JavaScript でテキストエリア内の文字列を書き換えた際に undo や redo が効くようにする](https://ja.developers.noraworld.blog/text-insertion-with-undo-redo)

# 実現したいこと
テキストエリア内に下記のような文章があったとします。

```markdown:markdown
# 家族旅行
今日は家族で旅行に行ってきました

とても楽しかったです
```

「今日は家族で旅行に行ってきました」と「とても楽しかったです」の間にカーソルがあったとして、このカーソルの位置に JavaScript で文字列を挿入したいときの実現方法を紹介します。

たとえば文章の途中で画像をアップロードしたくなったときに、ユーザが画像をアップロードして、その処理が終わったあとに JavaScript で以下のようなマークダウンをカーソルの位置に自動挿入する、などの機能を実現したいときを想定しています。

```markdown:markdown
![travel](/images/travel.png)
```

# 実現方法
以下の JavaScript で実現できます。

```javascript
var textarea = document.querySelector('textarea');

var sentence = textarea.value;
var len      = sentence.length;
var pos      = textarea.selectionStart;

var before   = sentence.substr(0, pos);
var word     = '挿入したい文字列';
var after    = sentence.substr(pos, len);

sentence = before + word + after;

textarea.value = sentence;
```

カーソルの位置を取得するには `selectionStart` を使用します。`selectionStart` は、テキストの一部の範囲が選択状態になっているときの、選択開始の位置を取得します。選択終了の位置を取得するものとして `selectionEnd` も用意されています。

これらはテキストが選択状態になっていなくても使うことができます。選択状態になっていない場合は、カーソルの位置を取得することができます。選択状態でない場合は `selectionStart` と `selectionEnd` は同じ値を返すので、どちらを使用しても良いです。今回は `selectionStart` を使用しています。

各変数の内容を下にまとめます。

|変数|意味|
|---|---|
|sentence|テキストエリア内の文章|
|len|文章の文字数|
|pos|カーソルの位置|
|before|カーソルより前にある文章|
|word|挿入したい文字列|
|after|カーソルより後にある文章|

先ほど説明した `selectionStart` を使用してカーソルの位置を `pos` に代入しています。

`before` と `after` には `substr()` を使用し、それぞれカーソル前後の文章を代入しています。`substr()` は第一引数に取得する文字列を開始する位置、第二引数に文字数を指定して「第一引数の位置から第二引数の文字数分だけ文字列を抽出する」関数です。

これで文章をカーソル前後で分けることができたので、`before + word + after` でカーソルの位置に文字列が挿入された文章が完成します。これをテキストエリアに代入することでカーソルの位置に文字列を挿入することができます。
iOS でページ全体はスクロールを無効にし、個別の要素（textarea など）では有効にする方法

# iOS 以外での実現方法
PC や Android など、iOS 以外のデバイスで、ページ全体をスクロール無効にし、それ以外の要素は有効にしたい場合は、以下の CSS を追加すれば良いです。

```css
html, body {
  overflow: hidden;
}
```

実に簡単です。

しかし、iOS では、この方法だとうまくいきません。

# iOS でページ全体のスクロールを無効にする方法
ググってみるとたくさん記事が出てきます。一番シンプルでオーソドックスな方法は、以下の JavaScript を使用する方法です。

```javascript
window.addEventListener('touchmove', function(event) {
    event.preventDefault();
});
```

`touchmove` イベントハンドラを設置し、タップした状態から指を動かしたときに、`preventDefault()` を呼ぶことでイベントをキャンセルします。

これならたしかにスクロールを無効にすることができます。しかし、これだと、たとえばテキストエリアがあった場合にはそのテキストエリア内のスクロールもできなくなってしまいます。

ページ全体（body）はスクロール無効にしたいけど、それ以外のテキストエリアなどの要素に対してはスクロールを有効にしたい、そういうときの実現方法を紹介します。

[特定のエリアのみスクロールを無効にする方法](http://qiita.com/mimoe/items/f5f668cebb697d073553#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%A8%E3%83%AA%E3%82%A2%E3%81%AE%E3%81%BF%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)についての記事はありますが、今回実現したいのは、これの逆です。

# 実現方法
以下の JavaScript で実現することができます。例としてテキストエリア内をスクロール有効にしています。

```javascript
var textarea = document.querySelector('textarea');
textarea.scrollTop = 1;

window.addEventListener('touchmove', function(event) {
  if (event.target === textarea && textarea.scrollTop !== 0 && textarea.scrollTop + textarea.clientHeight !== textarea.scrollHeight) {
    event.stopPropagation();
  }
  else {
    event.preventDefault();
  }
});

textarea.addEventListener('scroll', function(event) {
  if (textarea.scrollTop === 0) {
    textarea.scrollTop = 1;
  }
  else if (textarea.scrollTop + textarea.clientHeight === textarea.scrollHeight) {
    textarea.scrollTop = textarea.scrollTop - 1;
  }
});
```

`touchmove` イベントが発火したときに、コールバック関数は引数 `event` を受け取ることができます。そしてこのイベントがどの要素で発火したのかを `event.target` で取得することができます。これがテキストエリアだった場合は、イベントの伝搬を中止する、というのがざっくりとして処理です。

ところがちょっと厄介なこととして、テキストエリア内で、一番上にスクロールされた状態でさらに上にスクロールしようとすると、body（ページ全体）がスクロールされてしまいます。一番下でスクロールした場合も同じです。

これだと完全にページ全体のスクロールを無効化したとは言い難いので、もう少し工夫します。テキストエリア内はスクロールできるけど、一番上（下）にスクロールされた状態では、イベントキャンセルの適用外、つまりスクロールができないようにします。

しかし、これには問題があり、ページがロードされた段階ではテキストエリアは一番上にスクロールされた状態なので、テキストエリア内でスクロールができなくなってしまいます。そのため `textarea.scrollTop = 1;` を最初に実行することで回避します。

まだ問題があって、一度でも一番上や下までスクロールしてしまうと、そこからスクロールできなくなってしまいます。なので、`scroll` イベントハンドラを設置し、一番上（下）までスクロールしたら、その位置から+1（-1）だけ位置を移動させて、ほんの僅かな量だけ一番上（下）までスクロールできないようにします。こうすることで、常に一番上（下）にはスクロールされた状態にはならないので、テキストエリア内のスクロールを通してページ全体がスクロールされてしまうことを防ぐことができます。

# まとめ
少し回りくどい実装方法ではありますが、iOS でも body に `overflow: hidden;` をかけたのとほぼ同等の挙動になりました。

テキストエリアではなくほかの要素に対して同じことをしたい場合は1行目を書き換えてください。また複数スクロール可能にしたい場合は要素と処理を追加してください。

ちなみに最初は、イベントの伝搬をバブリングからキャプチャリングに変更し、body までイベントが伝搬したタイミングでイベントの伝搬を止める、という処理をしようとしてましたが、body まで伝搬したタイミングで止める方法が思いつかなかった（わからなかった）のであきらめました x(
Zabbix(3.x)からSlackにグラフ付きの通知を送る

いろんな実装があるけど気に入ったものがなかったので作ってみた。

#特徴
- グラフ画像をGyazoに送って表示するので、Slackから直接繋がらないZabbixサーバのグラフでも表示できる
 - 運用如何ではホスト名が外部に漏れるなど起き得るので、そこは要注意

#インストール方法
- Python3.xが入っているマシンで、pipあたりでrequestsをインストール。
- [slack.py](https://gist.github.com/walkure/c1280ed03695d3be6031c640f0cf4526)を AlertScriptPath以下(`/usr/lib/zabbix/alertscripts/`など)へ放り込んでchmod +x
 - zabbixのホスト・ユーザ・パスワードを設定。このユーザでログインして通知時にグラフを取ってきます 
- [Gyazo API](https://gyazo.com/oauth/applications)でトークンを取ってくる
 - Applicationを登録したあと、アプリ詳細画面でYour access tokenに書いてあるのがトークン
- Gyazoのトークンをslack.pyのgyazo_tokenに設定

#設定方法
### メディアにスクリプトを追加
![メディアタイプ追加](https://qiita-image-store.s3.amazonaws.com/0/117513/0b792287-cc65-87e1-0ed3-0d0d7354ffc6.png)

スクリプト引数は「メッセージ」「Incoming-hook URL」「チャンネル名」「ユーザ名」「アイコンemoji」の５つで、メッセージとIncoming-hook URLは必須です。メッセージは{ALERT.MESSAGE}で、Incoming-hook URLはSlackの設定からコピペしてください。チャンネル名は固定文字列(#zabbixとか)とか、{ALERT.SENDTO}[^1]を入れるなど任意です。

メディアを追加した後、ユーザ設定で当該ユーザに追加したメディアでの通知を許可しないとアクション実行時に通知不能でエラー[^2]になります

###アクションの設定
![アクション設定](https://qiita-image-store.s3.amazonaws.com/0/117513/58613dc5-41b5-12f9-338a-3381476c55ad.png)

メッセージ内容に以下のような設定をします。トリガ条件に使われていて、通知時に表示したい値がある場合はITEM_なんとか系をインクリメントして追加してください。

```
HOST: {HOST.NAME}
TRIGGER_NAME: {TRIGGER.NAME}
TRIGGER_STATUS: {TRIGGER.STATUS}
TRIGGER_SEVERITY: {TRIGGER.SEVERITY}

ITEM_ID1: {ITEM.ID1}
ITEM_NAME1: {ITEM.NAME1}
ITEM_VALUE1: {ITEM.VALUE1}

ITEM_ID2: {ITEM.ID2}
ITEM_NAME2: {ITEM.NAME2}
ITEM_VALUE2: {ITEM.VALUE2}

ITEM_ID3: {ITEM.ID3}
ITEM_NAME3: {ITEM.NAME3}
ITEM_VALUE3: {ITEM.VALUE3}

ITEM_ID4: {ITEM.ID4}
ITEM_NAME4: {ITEM.NAME4}
ITEM_VALUE4: {ITEM.VALUE4}

MESSAGE_PREFIX: @walkure
```

MESSAGE_PREFIXを設定すると、通知の先頭に付け加えます。＠channelなどお好みで。

実行内容は、さっき追加したメディアへの通知を選択します
![通知設定](https://qiita-image-store.s3.amazonaws.com/0/117513/0c5834cd-9536-eb89-2739-90361f9fbaca.png)

#通知例
![通知例](https://qiita-image-store.s3.amazonaws.com/0/117513/61367aa2-0885-2935-9274-d02b3c6795ea.png)

[^1]: 「管理」→「ユーザー」→「メディア」の「送信先」に入ってるものが反映される様子。
[^2]: 実行してみるまで気付かなくてハマった
RDSのMySQLダンプファイルの作り方

## :rocket:リモートのRDS上で以下を実行し、ダンプファイルを生成

```
コマンド例) mysqldump -h [RDSのホスト名] -u [DBのusername] -p [DB名] > ~/[ファイル名].sql
$ mysqldump -h diarydb.chdxgocrefefee6nik.ap-northeast-1.rds.amazonaws.com -u root -p testdb > ~/dump.sql
```

## :earth_asia:バックアップを復元したいサーバーやローカルにダンプファイルを持っきておく

```
ダンプファイルを持ってきたら、ダンプ元のDBをまず作成。
$ mysql -u root -p
Enter password:
mysql> CREATE DATABASE `testdb`;
Query OK, 1 row affected
mysql> exit
Bye

ダンプファイルをDBに復元する。 これでデーターが入った!!
$ mysql -u root -p testdb < dump.sql
```
Djangoのモデルで、自動で増えるフィールドを作る

# 概要
　Djangoで、主キー以外にも自動で増えるフィールドを作りたい時の為のメモ。


このやり方はスマートだけれど初回はエラーになったり
色々融通が利かないところが有る。
　https://torina.top/detail/230/

こちらのやり方を使って初期値の定義や上昇幅を外部で定義してやればいけそう
　http://techstream.org/Web-Development/Custom-Auto-Increment-Field-Django
摂動展開


1 $x=1+\varepsilon x^{5}$
  

1 $\varepsilon\ll1$であるならば、$x\thickapprox1$である。

2 摂動項は第一項より十分小さいので、第一項を$x$として摂動項の$x$に代入できる。よって$x	=	1+\varepsilon$
 

3 更に精度の高い近似解を得るためには、1次近似解をもとの式の摂動項$\varepsilon x^{5}$
 に代入すればよい。

 ```math
x	=	1+\varepsilon x^{5}\\
f\left(x\right)	=	1+\varepsilon x^{5}\\
	=	1+5\varepsilon^{4}x+10\varepsilon\\
f'\left(x\right)	=	5\varepsilon x^{4}\\
f''\left(x\right)	=	20\varepsilon x^{3}\\
	\thickapprox	1+\varepsilon\left(1+\varepsilon\right)^{5}
```

4 このプロセスを体系的に行うために、代数方程式の解を微小パラメータのべき級数

```math
x	=	1+\varepsilon x_{1}+\varepsilon^{2}x_{2}+\varepsilon^{3}x_{3}+\cdots
```

 に展開し、その展開係数$x_{1},x_{2},x_{3}\cdots$
 を求めることにする。上式を下の代数方程式に代入すると$1+\varepsilon x_{1}+\varepsilon^{2}x_{2}+\varepsilon^{3}x_{3}+\cdots	=	1+\varepsilon\left(1+\varepsilon x_{1}+\varepsilon^{2}x_{2}+\varepsilon^{3}x_{3}+\cdots\right)^{5}$
 を得る。式を微小パラメータ$\varepsilon$のベキの等しい項毎に整理すると$1+\varepsilon x_{1}+\varepsilon^{2}x_{2}+\varepsilon^{3}x_{3}+\cdots	=	1+\varepsilon+5\varepsilon^{2}x_{1}+\varepsilon^{3}\left(10x_{1}^{2}+5x_{2}\right)+\cdots$
 すなわち、

```math
\varepsilon\left(x_{1}-1\right)+\varepsilon^{2}\left(x_{2}-5\varepsilon^{2}x_{1}\right)+\varepsilon^{3}\left(x_{3}-10x_{1}^{2}+5x_{2}\right)	+\cdots=	0
```

 となる。パラメータ$\varepsilon$の恒等式であるから、$\varepsilon$の全ての次数のベキの係数が$\varepsilon$でなければならない。したがって、

```math
x_{1}-1	=	0\\
x_{2}-5x_{1}	=	0\\
x_{3}-10x_{1}^{2}-5x_{2}	=	0\\
```

  と漸化式を得る。これから

```math
x_{1}	=	1\\
x_{2}	=	5x_{1}=5\\
x_{3}	=	10x_{1}^{2}-5x_{2}=35
```

 よって$x	=	1+\varepsilon+5\varepsilon^{2}+35\varepsilon^{3}+\cdots$
semverを数値に変換する

モバイルアプリで利用するWeb APIで、アプリのバージョンに応じて処理を分岐したい場合があるが、
私の場合モバイルアプリで[Semantic Versioning 2.0.0](http://semver.org/)を採用することが多いため、
semverで規定される`1.0.0`のような形式のバージョン表記は通常文字列で扱うため、そのままでは数値として大小の比較をすることができない。
そこで、これを数値に変換し、数値としての大きさで比較できるようにする。

Rubyで書くとこんな感じだろうか。
~~`'1.2.3'.split('.').map.with_index {|n, i| n.to_i * (1000 ** (2 - i)) }.inject(:+) # => 1002003`~~
`'1.2.3'.gsub(/\.(\d+)/){ "%03d" % $1 }.to_i #=> 1002003`

このコードの場合MAJOR, MINOR, PATCHそれぞれが3桁以内で正しく動作するが、`1000`の部分を書き換えればもっと大きな桁にも対応できる。
Typescript学習メモ①(ExportとImport、require("xxx")とmodule.exports)

TypeScriptのモジュール解決はExportとImportを使うことが多いと思いますが、意外とこのあたりは迷いやすいので、整理してみたいと思います。

##Export
宣言をExportするコード例：

```ExportExample.ts
//インターフェース
export interface IHello{
  greeting (name :string) :string
}

//変数
export const name = "hoge";

//クラス
export class Hello implements IHello{
   greeting (name :string){
     return "Hello"+name;
   }
}
```

以下の書き方もできます。リネームすることが可能です。

```ExportExample2.ts
class Hello implements IHello{
   greeting (name :string){
     return "Hello"+name;
   }
}

export {Hello};

export {Hello as myHello}
```

複数のモジュールを一斉にexportしたときの書き方。

```
export * from "./SayHello";
```

##Import

単一のモジュールをimportする場合

```
import { Hello } from "./SayHello";
let myHello = new Hello();
```
importするときにリネームしたい場合

```
import { Hello as MyHello } from "./SayHello";
let myHello = new MyHello();
```

一度すべてのモジュールをimportしたい場合

```
import * as hello from "./SayHello";
let myhello = new hello.Hello();
```

##Default Export

```SayHello.ts
export default class Hello implements IHello {
   greeting (name :string){
     return "Hello"+name;
   }
}
```
import時に波括弧でくぐる必要はない

```
import hello from "./SayHello";
```

functionをdefault exportすることもできます。

```
export default function (name: string) {
   return "Hello"+name;
}
```

```
import greeting from "./SayHello";
alert(greeting("hoge"));
```

##「module.exports」と「require("xxx")」文

一方const moduleXXX = require("moduleXXX")の書き方もたまに見かけますよね、その違いを理解しないままで書いていくと混乱の元になりかねません。

ExportとImportのペアは厳密にいうとEcmaScript2015（ES6）の企画によって定義されています、これに対して、require("moduleXXX")はNode.jsモジュールローディングシステムである。

上の例で説明すると
const moduleXXX = require("moduleXXX")
と参照する場合、参照される側以下のようにエクスポートを定義する。

```SayHello.ts
class Hello implements IHello{
   greeting (name :string){
     return "Hello"+name;
   }
}

module.exports = Hello;
```

これはNode.jsのモジュールシステムにはmoduleという特別なオブジェクトが存在し、そこのexportsプロパティに代入しているわけです。ちなみにさらに紛らわしいことにmodule.exportsはexportsオブジェクトからでも参照できる、クラスのコンストラクターを公開する場合module.exportsを使い、単純な関数（オブジェクト指向世界でのstaticメソッドのようなもの）はexportsを使ったほうがいいとされているが、exportsを使う場面と遭遇したことはまだありません。ImportとExportに一本でも特に困ることはないので、requireに関していまごろこれぐらい抑えておいて問題ないかと思います。
イオン飽和電流と電子圧力の関係

イオン飽和電流と電子圧力は以下の式

```math
I_{s}	=	qn_{e}\exp\left(-\frac{1}{2}\right)\sqrt{\frac{kT_{e}}{m_{i}}}S
P_{e}	=	n_{e}T_{e}
```

で与えられる。また$I_{1}>I_{2}$である$I_{1},I_{2}$が存在すると仮定する。

```math
I_{s1}	>	I_{s2}\\
n_{e1}\sqrt{T_{e1}}	>	n_{e2}\sqrt{T_{e2}}\\
n_{e1}T_{e1}=P_{e1}	>	n_{e2}\sqrt{T_{e1}T_{e2}}\\
P_{e1}	>	n_{e2}T_{e2}\sqrt{\frac{T_{e1}}{T_{e2}}}\\
P_{e1}	>	P_{e2}\sqrt{\frac{T_{e1}}{T_{e2}}}
```

 ここで、 $T_{e1}\leq T_{e2}$
 が満たされていると仮定すると、$P_{e1}	>	P_{e2}$となる。したがって、同じ電荷量を持つ2つのイオン飽和電流を比較するとき、片方に対してイオン飽和電流が大きくかつ電子温度が小さい方は、電子圧力が大きいことが主張できる。
【初心者投稿-11】祝 「HTML&CSS 学習コース 中級編」完了

#昨日までのおさらい
いつものようにまずは形から入るため**Sublime Text**をダウンロード！
重すぎてまだカスタマイズの余地がありそうですな…

あと、PHPを並行で勉強し始めることに決めました。

どうやら今自分が勉強しているのは「フロントエンド」であり、PHPは「サーバーサイド」らしい。
かっこよ！

#祝祝 「HTML&CSS 学習コース 初級編」完了！
これは嬉しい。
言われた通りに進めただけでイマドキのサイトのトップページが作れちゃうなんて…！
初級と中級の力を合わせれば簡単なページなら作れちゃいそうな気がする。

一番安心したのはwidthとかが%で設定できること。
「親要素のwidthがいくつとか覚えるの無理じゃね？」って最初思ってたけど、
こんな便利な設定が出来るとは笑

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/170536/842481b3-f698-68c7-94ff-f1da012d6960.png)

#学習の記録
* Progate9日目
* 今日の勉強時間：40分
* 総学習時間：10時間
* 今日嬉しかったこと：中級制覇！明日からは中級の復習とついにPHPに入ります！
[めも]howler.jsのplaying()が現在の状態を反映しない場合がある？[訂正]というのは、気のせいでした。

検証用コードにバグがあったため、本記事は削除し・・ようと思いましたが、
同じパターンではまる人がいるかもしれないので、残しておきます。
(メソッドを外に出す時などに'()'を消し忘れると、こうなります)

コード例(with-bug.js)
バグありなので流用しないように！

```with-bug.js
function fn() {
}

new Howl(...)
.on('end', fn()) // `()`が付いていた
```

発生する現象(旧):
(設定は、`loop: false`)
・onendイベントで呼ばれるはずのメソッド(コード例の`fn()`)が、再生中に呼ばれる
※この時点で、`playing()`はfalse
・コード例の`fn()内で、`しばらく`playing()`を観察し続けると、途中からtrueになる
※変化するのは、約50ミリ秒後
・実際に曲の再生が終了した時点での`playing()`はtrueになっている
・この場合に、onendイベントの後、再度play()を呼ぶと、音が重なる


蛇足
ロード中にアンロードするとおかしくなるバグはあるらしい。(ブラウザ依存？)
[Sounds keep overlapping #686](https://github.com/goldfire/howler.js/issues/686)
Tensorflowで任意の数値をSummaryに加える

tensorboardは協力な学習監視・可視化ツールですが、基本的には計算グラフ内 (`sess.run(...)` で実行される範囲) のデータをまとめるためのツールで、任意の数値を記録する方法はドキュメントされていません(たぶん)。
複数バッチの合計lossをもとめたり (e.g. developmentセットの評価のため） するので本来なら結構多用すると思いますので、まとめます。

```python
with tf.variable_scope('MyScope'):
    ...
    tf.summary.scalar('my_value', value_to_record)
```

に相当するSummaryは:


```python
summary_writer = tf.summary.FileWriter('directory_to_write', sess.graph)

global_step = 12
value_to_record = 1.0
summary_writer.add_summary(tf.Summary(value=[
    tf.Summary.Value(tag="MyScope/my_value", simple_value=value_to_record)
]), global_step)
```

通常の`tf.summary.scalar(name, value)`などではscopeが加味されるのに対して、上記の方法だとスコープ名を`tag`に直接記載する必要があることに注意してください。

`tf.summary.hisogram`などの相当コードについては[ここ](https://gist.github.com/gyglim/1f8dfb1b5c82627ae3efcfbbadb9f514)に記載があります。
ポート転送

ポート転送について、Linuxではiptablesで対応できるがWindowsで行う必要が出てきました。
具体的にはサーバのリプレイスを行うのに、とあるサービスのクライアントが送信先アドレスとポートを変えられないという…
なので旧サーバを中継にだけ使用し、サービスの処理は新サーバで行うという対応になりました。
その際に設定したポート転送の方法です。
##設定方法
- netshコマンドを使用
- Windows8.1を使用(他のOSでも大丈夫だと思います)

1.ポート転送コマンド

```
>netsh interface portproxy add v4tov4 listenport=<1> listenaddr=<2> connectport=<3> connectaddress=<4>
```

<1>は中継PCの受信ポート番号
<2>は中継PCのIPアドレス
<3>は転送先ポート番号
<4>は転送先IPアドレス

2.確認コマンド

```
>netsh interface portproxy show all
```

3.削除コマンド

```
>netsh interface portproxy delete v4tov4 listenport=<1> listenaddr=<2>
```
MPLAB X IDEでConfiguration bit設定する

#背景
PICの開発ツール、MPLAB X IDEはそこそこよくできたIDEですが、残念ながらググると旧バージョンの全然役に立たない情報がヒットして辛いです。自分用メモを残します。

#PICのConfiguration bit
PICでは、 CPUが起動する前に設定しておくべき情報をEEPROMに設定でき、これをConfiguration bitと呼びます。例えば、接続されているシステムクロックの種類とかウォッチドグタイマを使うかとか、そういう話です。
基本的にはコンパイラのプラグマなどで設定できるのですが、PICの種類によって様々な設定がある上に、IDEのバージョンによって記法が変わっていたりして、なかなかカオスな状況です。
そこで、最新のIDEでは便利なGUIツールがあります。

Windowメニューから、PIC Memory Views → Configuration bits
と降りて行くと、GUIで設定した内容がコードに貼り付けられる形で出力されて便利です。
OrbitControls.jsのクリックイベント制御

#OrbitControls
OrbitControlsはthree.jsの便利なクラスであり、OrbitControls.jsをscriptタグで読むことで使えます。

```js
// カメラを生成した変数を渡してインスタンスを生成
var controls = new THREE.OrbitControls(camera);

//（中略）

controls.update(); // 必ずrenderer.render()の前にupdateメソッドを呼ぶ
renderer.render(scene, camera);
```

とすることで
・左クリック+ドラッグで物体の回転
・ホイール（または中クリック+ドラッグ）で物体の拡大縮小
・右クリック+ドラックで物体の移動

の３つがブラウザ上で自由に行えるようになります。さらに、

```js
controls.autoRotate = true;
```
とすれば、物体が自動で回転するようになります。このようにOrbitControlsは非常に便利です。

#問題
クリックイベントが全てOrbitControlsに紐づき、同一画面上でその他のクリック操作が行えない。
具体的には、テキストボックスをThree.jsを動かすcanvasの外に置いたが、OrbitControlsが反応するばかりで、テキストボックスにカーソルが当たらなかった。

#解決
当初、three.jsで描画を行っているcanvasの`mouseout`, `mouseover`イベントで無理やり解決していました（今考えるとアホとしか思えません。）が、masato_makino さんのコメントの通り、

```js
// var canvas = document.getElementById('canvas');
var controls = new THREE.OrbitControls(camera, canvas);
```

とdomElement(今回であれば、canvas)を第二引数として渡してあげればよいだけでした。
第二引数を省略すると`document`を渡したことと同じになります。

#結論
もっとドキュメントを読むべき。
Tensorflowのメモリ確保をChainerっぽくする

Tensorflow (v0.12時点) はデフォルトではCUDAから見えている全GPUのメモリを専有してしまいます。また、GPUを使い学習したモデルをCPUで使うことができません。これを、Chainerと同じように、

* `with device: ...`のような形で簡単にGPU/CPUを切り替え
* メモリ使用にあわせて自動的にGPUメモリを増減

することを考えます。

そのような設定にするためには、`tf.Session`を下記のように作ります。

```python:
config = tf.ConfigProto(allow_soft_placement=True)
config.gpu_options.allow_growth = True

with tf.Session(config=config) as sess:
    with tf.device(my_device_option):
        model = MyGreatModel()
    sess.run(tf.global_variables_initializer())
    ...
```

`tf.ConfigProto`には他にもオプションがありますが、それは[他](http://qiita.com/kikusumk3/items/907565559739376076b9)に詳しいです。
CloudFormation で API GatewayのURLクエリ文字列パラメータを設定する【cloudpack大阪ブログ】


cloudpack大阪の佐々木です。

CloudFormationでAPI Gatewayをつくったときにハマったのでメモしときます。

### 問題
API Gateway でパスの文字列をバックエンドに渡すとき、`統合リクエスト`の`URL クエリ文字列パラメータ` `method.request.path.xxxx`を使います。

こんなやつ
![Kobito.jw0DCe.png](https://qiita-image-store.s3.amazonaws.com/0/3246/1795e25f-516a-3de2-69b1-c242ff0e0eba.png "Kobito.jw0DCe.png")


これをCloudFormationでつくるとき、Integration → RequestParameters に記述します。

```yaml:
    TestMethod: 
      Type: "AWS::ApiGateway::Method"
      Properties: 
        Integration: 
          RequestParameters:
            "integration.request.querystring.Subject": "method.request.path.name" 
```

http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-requestparameters

が、これだけだとエラーになります。
あとからマネージメントコンソールで足そうとしても、

```
Invalid mapping expression specified: Validation Result: warnings : [], errors : [Invalid mapping expression parameter specified: method.request.path.name]
```
というエラーになって設定できません。

### 解決策
Properties直下の`RequestParameters`に使用するpathの情報を設定する必要があるみたいです。

```yaml:
    TestMethod: 
      Type: "AWS::ApiGateway::Method"
      Properties: 
        RequestParameters:
          "method.request.path.name": true
        Integration: 
          Type: AWS
          IntegrationHttpMethod: POST
          RequestParameters:
            "integration.request.querystring.Subject": "method.request.path.name" 
```
http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-requestparameters

これ、マネージメントコンソールで作ったら問題なく設定できて、CFnでつくったら設定できない状態になりました。マネージメントコンソールを見比べても、この設定は箇所はないようで、ハマりどころかと思います。
CORS関連、これだけ知っとけばまぁ大丈夫

# はじめに
APIを作っているとほぼほぼCORSに関する実装を行うことになるが、登場してくるリクエストヘッダやレスポンスヘッダの名前が少々紛らわしくて覚えづらい。
そこでCORSとは何か？から始まって一連のやりとり、及び必要なリクエストヘッダ・レスポンスヘッダの名前や設定値についてメモを取ることとする。

# CORS
XHRでは、異なるドメインに対してアクセスを行い、レスポンスデータを読み込むことができない（同一生成元ポリシー）。生成元はURI中のスキーム・ホスト・ポート番号の組み合わせで判断される。

> http://example.com と http://example.com:8080 は異なる生成元となる。

`JSONP`という手法もあるが、これはある種ハックでありセキュリティ上の問題も多い。
そこで異なる生成元にアクセスするための手法としてクロスオリジンリソース共有（CORS）という[仕様が策定](https://www.w3.org/TR/cors/)された（2014/1 正式にW3C勧告）。

以下、CORSの基本的なやりとりを記載する。

# クライアントから `Origin`リクエストヘッダを送る

```http
Origin: http://www.example.com
```

# `Access-Control-Allow-Origin`レスポンスヘッダ

`Access-Control-Allow-Origin`に`Origin`ヘッダと同じ生成元を入れてレスポンスすると、ブラウザはそのレスポンスを受け入れることになる。この値に`*`を指定すると、どこからでも読み込めることを明示できる。

ブラウザがレスポンスを受け入れることができるということは、XHRの結果を読み込んで何らかの処理をするJavascriptのコードを書くことができるということ。

# プリフライトリクエスト

生成元をまたいだリクエストを行う前に、そのリクエストが受け入れられるかどうかを事前にチェックする。以下の場合に必要になる。

* 利用するHTTPメソッドがSimple Method（HEAD/GET/POST)以外である
* 以下に示すヘッダ以外を送信しようとしている
 * Accept
 * Accept-Language
 * Content-Language
 * Content-Type
 
 以下に示す以外のメディアタイプを`Content-Type`に指定している。
 
 * application/x-www-form-urlencoded
 * multipart/form-data
 * text/plain
 
 OPTIONメソッドを使って送信される
 
# プリフライトリクエストのレスポンス

|ヘッダ|意味|
|---|---|
|Access-Control-Allow-Method|許可されるメソッドの一覧|
|Access-Control-Allow-Headers|許可されるヘッダの一覧|
|Access-Control-Max-Age|プリフライト情報のキャッシュを保持して良い時間|

# CORSとユーザ認証情報
CORSではユーザ認証情報(Credential）を送信する際には、サーバサイドは追加のHTTPレスポンスヘッダを発行する必要がある。
`Cookie`や`Authentication`ヘッダを使ってユーザ認証情報をクライアントが送ってきた場合、サーバは

```http
Access-Control-Allow-Credentials: true
```

として、「認証情報を認識しています」ということをクライアントに返信する必要がある。これがなかった場合、ブラウザは受け取ったレスポンスを拒否してしまう。
また各ブラウザのXHRはクッキーなどの認証情報を送る際には`withCredentials`プロパティを`true`にセットしなくてはならない。

# 参考文献

[Web API The Good Parts](https://www.oreilly.co.jp/books/9784873116860/)
gradle 2.3にするとaptが動かなかったので修正した

Android Studio 2.3にすると、Gradleを2.3にするように勧められました。

なのでアップデートすると、DataBinding系のクラスが見つからないと言われ始めました。

↓こんな感じ。

```
:app:compileDebugJavaWithJavac
/Users/ishikuranoboru/.ghq/github.com/noboru-i/SlideViewer/app/src/main/java/hm/orz/chaos114/android/slideviewer/ui/AboutActivity.java:13: エラー: パッケージhm.orz.chaos114.android.slideviewer.databindingは存在しません
import hm.orz.chaos114.android.slideviewer.databinding.ActivityAboutBinding;
                                                      ^
/Users/ishikuranoboru/.ghq/github.com/noboru-i/SlideViewer/app/src/main/java/hm/orz/chaos114/android/slideviewer/ui/AboutActivity.java:18: エラー: シンボルを見つけられません
    private ActivityAboutBinding binding;
            ^
  シンボル:   クラス ActivityAboutBinding
  場所: クラス AboutActivity
/Users/ishikuranoboru/.ghq/github.com/noboru-i/SlideViewer/app/src/main/java/hm/orz/chaos114/android/slideviewer/ui/LicenseActivity.java:11: エラー: パッケージhm.orz.chaos114.android.slideviewer.databindingは存在しません
import hm.orz.chaos114.android.slideviewer.databinding.ActivityLicenseBinding;
                                                      ^
```

また、Android StudioのMessagesを見ると、下記のようなものも出てました。

```
Warning:Using incompatible plugins for the annotation processing: android-apt. This may result in an unexpected behavior.
```

調べてみると、
http://qiita.com/teradonburi/items/a2185723b1bf883cf755
というのがあったので、aptを削ってみた。

ただ、[KVS Schema](https://github.com/rejasupotaro/kvs-schema)がaptを使ってたので、 https://bitbucket.org/hvisser/android-apt/wiki/Migration を参考に、 `apt` -> `annotationProcessor` に置き換えてみました。

https://github.com/noboru-i/SlideViewer/pull/52/files こんな感じ。

無事、ビルド通りました。
PyCharmをupdateしたら2016.3.2から2017.1に変わった。

(参考)What’s New in PyCharm 2017.1
https://www.jetbrains.com/pycharm/whatsnew/
Windows7でupdateしたら、
PyCharm Community Edition 2016.3.2から
PyCharm Community Edition 2017.1に変わった。


「
Python Versions Compatibility
Your source contains _future_ 
imports.
Would you like to enable Code compatibility
inspection?
Yes No
」が、画面右下にでています。

Windows7の受信の規則になっていた。
PyCharm Community Edition 2016.3.2
matplotlibで帯グラフ

Excelなら一発なのでmatplotlibにも帯グラフの関数あるのかなと調べてみたけどない模様。
積み上げグラフ (stacked bar chart) の合計値が1になるように正規化して表示する。


```py
import numpy as np
import matplotlib.pyplot as plt

N, K = 4, 3
data = np.random.rand(N, K)
tick_labels = ["a", "b", "c", "d"]
labels = ["x", "y", "z"]

normalized = data / data.sum(axis=1, keepdims=True)
cumulative = np.zeros(N)
tick = np.arange(N)

for k in range(K):
    color = plt.cm.viridis(float(k) / K, 1)
    plt.barh(tick, normalized[:, k], left=cumulative, color=color, label=labels[k])
#   plt.bar(tick, normalized[:, k], bottom=cumulative, color=color, label=labels[k])
    cumulative += normalized[:, k]

plt.xlim((0, 1))
# plt.ylim((0, 1))
plt.yticks(tick, tick_labels)
# plt.xticks(tick, tick_labels)
plt.legend()
plt.show()
```

<img width="500px" alt="Bar chart" src="https://qiita-image-store.s3.amazonaws.com/0/139809/41b1d35f-06e3-1c62-07c4-0f8713e80b6f.png">

参考：https://de.dariah.eu/tatom/topic_model_visualization.html
ウェブサイトを丸ごと保存するHTTrack


# 動機
Ansibleのモジュールごとのドキュメントが欲しい。けどダウンロードできる形では見当たらないようだ。
→　ではサイトごとローカルに取ってくれば良いじゃないか。
→　過去にはIrvineなどがあった（十五年以上前！！）が今はもっと良いのがあるはず
→　それでみつけたのが、HTTrack
# HTTrackとはなにか
サイトごとまるごとダウンロードして、ローカルで参照できます。オンラインにしか無いリファレンスなどをネットのないところでも見られるわけです。
# ダウンロード＆インストール
こちらから自分の目的にかなったものをダウンロード。→[ダウンロードサイト](https://www.httrack.com/page/2/en/index.html)
Windows（インストーラー、ポータブル）、Linux、MacOSと取り揃ってます。きっとQiitaを見るような人は簡単にDL／インストールできるはず。
# 使い方
勘でだいたいなんとかなるのですが、
## 初回起動設定
1. 初回起動時には言語選択させられます。英語／日本語を選択してすすめてください。日本語を選ぶと化けてしまうけど、再起動すると直ります。

## 新規ダウンロード
1. 起動する。スタート画面が開く。
　![2017-03-27 21_35_05-WinHTTrack Website Copier - [Ansible Doc.whtt].png](https://qiita-image-store.s3.amazonaws.com/0/152216/0ca9af12-3ef8-8f85-2253-b7688c047979.png)
2. 「次へ」を選択。以下のプロジェクト設定画面が開く。
　![2017-03-27 21_33_52-WinHTTrack Website Copier - [Ansible Doc.whtt].png](https://qiita-image-store.s3.amazonaws.com/0/152216/da38ee99-e61c-5318-a9cc-fdffb8cd6307.png)
3. ここからさき「Ansible Doc」をダウンロードする想定で進める。
4. プロジェクト名に「Ansible Doc」を入れます。ダウンロードしたときのディレクトリ名になるので使えない文字は入れないこと。
5. Project categoryは空っぽでも良いけど、なにか入れても良い。「Tech Reference」としました。
6. 基準パスは「C:\apps\documents」とした。
7. 「次へ」をクリック。以下画面が開く。
　![2017-03-27 21_35_48-WinHTTrack Website Copier - [Ansible Doc2.whtt].png](https://qiita-image-store.s3.amazonaws.com/0/152216/fadb063b-7b1f-ccf4-8fb2-d7f0ddd0e14e.png)
8. アクションは「ウェブサイトの自動ダウンロード」を選ぶ。
9. Webアドレスは「http://docs.ansible.com/ansible/index.html 」を入れる。
10. 「次へ」をクリック。以下画面が開く。
　![2017-03-27 21_36_22-WinHTTrack Website Copier - [Ansible Doc2.whtt].png](https://qiita-image-store.s3.amazonaws.com/0/152216/7d89edeb-2481-627c-c629-0353241ffb36.png)
11. が、とくにセットすることはないので、無視して「次へ」。
12. ダウンロードが始まる。
　![2017-03-27 21_37_05-サイトのコピー（ミラー）進行中 [2_41 (+39), 3304913 bytes] - [Ansible Doc2.whtt].png](https://qiita-image-store.s3.amazonaws.com/0/152216/b814816a-be81-cfe9-1f21-3cf1983fc531.png)
13. しばらくするとダウンロードが終わる。
14. 大体エラーがでる（下図）。でも404とか403なので気にしないで大丈夫。
　![2017-03-27 23_18_54-ログファイル情報.png](https://qiita-image-store.s3.amazonaws.com/0/152216/aa56f3d2-4f7b-2e92-41bc-79005c4453f4.png)

## 変更分のダウンロード
1. HTTrackを開く。
2. メニューから「ファイル」ー「開く」で以前のダウンロードプロジェクトを開く。
3. 以下のアクション選択画面で「既存のダウンロードの更新」を選択。
4. 「次へ」「次へ」でダウンロードが始まる。

# まとめ
かんたんでとっても便利。以上です。
# 他に試したもの
WeBoxしか試していませんが、これはAnsible Docの一階層目しかとってこれません。最近のJSもDLできません。国産ツール頑張れ！
１５年ぶりの Verilog

<はてブロから移設しました。本記事はテスト投稿を兼ねています。>

# セミナーに参加

2017/3/24 に都内某所にセミナー参加してきた。
ソフト屋がハードウェアセミナーに参加するのはやや不安ではあるが。

# Verilog ソースコードを目の当たりにする

そこで目にしたのは PCI シーケンサを自作して以来の Verilog ソースコードだった。

# Verilog の書き方によってパフォーマンスが変わる

HDL によって統一的に回路を記述できるようになったが、チップが持っているリソースを想定しながら HDL を記述しなければならないという事情は変わっていないらしい。

例えば積和演算をしたい場合、最近の FPGA には DSP が内蔵されているが、HDL に細かな指示子をつけないと FF などに展開したとんでもない回路を生成してしまう。
（DSP資源は貴重だから温存しようとするのか？）
例えば Xilinx 系では

```Verilog:Code Snippet
(* USE_DSP48 = "yes" *) wire c = a * x1 + b * x2;
```
としないと DSP が使用されないそうだ。

HSL など高位合成ツールから論理合成を行った場合、この仕様はパフォーマンスが上がらない原因となりそうだ。

# 結論: ソフトから合成したい人は SDSoC を使え？？？

SDSoC はソフトウェア資源をトップダウンにハードウェア化するというかなり野心的なツールだが、そこそこの品質のハードウェアを作成してくれるなら画期的なツールと言える。
残念ながらボタン一発で H/W の Block Diagram と最適化された（人間が見て満足の行く）ネットリストを作成してくれるまでにはなっていないようだ。

しかし、今後多数のボードが機械学習されて、分類が進んでくると結構いいネットリストを作ってくる可能性があるんじゃないだろうか。

将来の記述に希望がもてるセミナーだった。
nginxでベーシック認証

タイトル通りです。  
普段Apacheはあまり使わないのですが、BASIC認証（でいいや）をかける必要が出てきたのでついでに書いておきます。
※ 本記事は私が過去に[ブログに書いた記事](http://sweep3092.hatenablog.com/entry/2015/10/06/174018)からの転載です 


# 環境
* Ubuntu 14.04
* nginxがインストール済み

# 手順

## 1. htpasswdコマンドを使えるようにする
### Debian系（Ubuntuとか）

```
sudo apt-get install apache2-utils
```

### RHEL系（CentOSとか）

```
sudo yum install htpasswd
```

## 2. `.htpasswd`ファイルを作成  
`.htpasswd`ファイルを作成します。  
内容は`ユーザー名:パスワード`のペアになりますが、パスワードは暗号化できます。（認証が暗号化されるわけではない）  
今回はSHA-1で暗号化します。

```
htpasswd -nbs ユーザー名 パスワード > .htpasswd
```

## 3. nginx.confを書き換え
こんな感じ

```
location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm index.php;

    auth_basic  "basic auth";  # 認証の時に表示されるメッセージ
    auth_basic_user_file  ".htpasswd" # 先ほど作成した.htpasswdファイルのパス
}
```

## 4. nginxを再起動

```
sudo service nginx restart
```