OmniAICreator/Qiita-1.07M huggingface dataset:
Vim初心者のための基本的な操作方法のまとめ

<table>
<tr><th>コマンド名</th><th>内容</th></tr>
<tr><td>vim [ファイル名]</td><td>起動する（ファイルを指定して、起動する）</td></tr>
<tr><td>:q</td><td>終了する</td></tr>
<tr><td>:w [ファイル名]</td><td>上書きする（名前をつけて保存する）</td></tr>
<tr><td>:q!</td><td>保存せずに終了する</td></tr>
<tr><td>h</td><td>左に移動する</td></tr>
<tr><td>j</td><td>下に移動する</td></tr>
<tr><td>k</td><td>上に移動する</td></tr>
<tr><td>l</td><td>右に移動する</td></tr>
<tr><td>w</td><td>前方に単語１つ分移動する</td></tr>
<tr><td>b</td><td>後方に単語１つ分移動する</td></tr>
<tr><td>W</td><td>スペース区切りで前方に単語１つぶん移動する</td></tr>
<tr><td>B</td><td>スペース区切りで後方に単語１つぶん移動する</td></tr>
<tr><td>O</td><td>行頭に移動する</td></tr>
<tr><td>$</td><td>行末に移動する</td></tr>
<tr><td>gg</td><td>１行目に移動する</td></tr>
<tr><td>G</td><td>最後の行に移動する</td></tr>
<tr><td>d &lt;カーソル移動コマンド&gt;</td><td>デリート（切り取りをする）</td></tr>
<tr><td>dd</td><td>行をデリート</td></tr>
<tr><td>y &lt;カーソル移動コマンド&gt;</td><td>ヤンク（コピーをする）</td></tr>
<tr><td>dd</td><td>行をヤンク</td></tr>
<tr><td>p</td><td>ペースト（貼り付ける）</td></tr>
<tr><td>i</td><td>カーソル位置の左に文字を入力する<br>※インサートモードに切り替える</td></tr>
<tr><td>a</td><td>カーソル位置の右に文字を入力する<br>※インサートモードに切り替える</td></tr>
<tr><td>Esc</td><td>ノーマルモードに切り替える</td></tr>
<tr><td>x</td><td>カーソル位置の文字を削除する</td></tr>
<tr><td>J</td><td>行を連結する</td></tr>
<tr><td>u</td><td>アンドゥ（元に戻す）</td></tr>
<tr><td>Ctrl + r</td><td>リドゥ（やり直す）</td></tr>
<tr><td>/ &lt;文字列&gt;</td><td>下方向に検索する</td></tr>
<tr><td>? &lt;文字列&gt;</td><td>上方向に検索する</td></tr>
<tr><td>n</td><td>次の検索結果に移動する</td></tr>
<tr><td>N</td><td>前の検索結果に移動する</td></tr>
<tr><td>:%s/&lt;置換元文字列&gt;/&lt;置換後文字列&gt;/g</td><td>置換する</td></tr>
<tr><td>vimtutor</td><td>チュートリアル</td></tr>
<tr><td>:help</td><td>ヘルプ</td></tr>
</table>
複数のdeviseモデルについてログイン後のページを設定する方法

# 複数のdeviseモデルがあってそれぞれのログイン後のリダイレクト先を設定したい

### 前提
- deviseモデルとして、AdminモデルとUserモデルがあるとする
- Adminのログイン後のリダイレクト先はadmins_home_pathにしたい
- Userのログイン後のリダイレクト先はusers_home_pathにしたい

### 実装
after_sign_in_path_forをオーバーライド

```
def after_sign_in_path_for(resource)
  case resource
  when Admin
    admins_home_path
  when User
    users_home_path
  end
end
```

### 参考にしたページ
http://qiita.com/HamaTech/items/a1149c87387f554d8554
Proxy内でRustをビルドする

最近な言語は、コンパイルで必要なライブラリをGithub等から直接更新するようなものが多い。
そこで必ずハマるのが、社内等のproxyに邪魔されて、ライブラリが取得できないようなこと。

```
error: failed to load source for a dependency on `rand`
Caused by:
  Unable to update registry https://github.com/rust-lang/crates.io-index
Caused by:
  failed to fetch `https://github.com/rust-lang/crates.io-index`
To learn more, run the command again with --verbose.
```

Rustもそんな言語のひとつであるが、Windows環境での設定方法を記載。
実際には`Rust`の設定ではなく`cargo`の設定であるが。

Windowsの場合、`Rust`をインストールすると、ホームディレクトリに、.cargo というフォルダが存在する。
その中に、下記のファイルを作成し記述する。

C:\Users\myname\\.cargo\config

```
[http]
proxy = "http://user:password@host:port"
```

設定がOKであれば、レジストリから更新されコンパイルされ実行される。

```
C:\Rust\main>cargo run
    Updating registry `https://github.com/rust-lang/crates.io-index`
   Compiling main v0.1.0 (file:///C:/Rust/main)
    Finished debug [unoptimized + debuginfo] target(s) in 0.42 secs
     Running `target\debug\main.exe`
```


なかなか楽しい。
Djangoで二重サブミット抑止

# 二重サブミット・二重送信とは？
二重サブミットとは同じリクエストが複数送られてしまうことです。
POSTリクエストを受け付けた際に行う処理が複数回実行されることによって、想定していない処理が行われる恐れがあります。
ブラウザの再読込ボタン等によっても発生しうるため、何らかの対策をするのが望ましいです。
## 参考
[さいきょうの二重サブミット対策](http://qiita.com/syobochim/items/120109315f671918f28d)

# Djangoに二重サブミット対策の機能はある？
根気よく探しましたがなさそうだったので、簡単に自分で作りました。
ボタンの非活性化等クライアントサイドではなく、サーバーサイドでの二重サブミット判定です。

``` python
def set_submit_token(request):
    submit_token = str(uuid.uuid4())
    request.session['submit_token'] = submit_token
    return submit_token

def exists_submit_token(request):
    token_in_request = request.POST.get('submit_token')
    token_in_session = request.session.POP('submit_token', '')

    if not token_in_request:
        return False
    if not token_in_session:
        return False

    return token_in_request == token_in_session
```

## 使い方
サンプルでは、以下の流れとなっています。
1. (サーバ -> クライアント) index画面アクセス時にsubmit_tokenをセッション内に保持し、同時にクライアント渡す
2. (クライアント -> サーバ) index画面でのsubmitボタン押下時に、リクエストにsubmit_tokenを含ませる
3. (サーバ) submit_tokenがセッションの中にあるか確認する

exists_submit_token()では一度使ったsubmit_tokenはpopによりセッションから破棄するため、同じリクエストが複数回送られた場合は、error.htmlを返却する処理を行います。

```python:views.py
def index(request):
    submit_token = set_submit_token(request)
    return render(request, 'todo/index.html', {"submit_token": submit_token})

def post(request):
    if not exists_submit_token(request):
        return render(request, 'todo/error.html', {})
    else:
        return render(request, 'todo/complete.html', {})
```

``` HTML:index.html
<form action="{% url 'todo:post' %}" method="post">
{% csrf_token %}
{{ submit_token }}
<input type="hidden" name="submit_token" value="{{ submit_token }}" />
<input type="submit" value="Submit" />
</form>
```

# 最後に
もっとシンプルでわかりやすい方法があればそれを使いたいのですが、上記の実装で一旦妥協してしまいました。
また、Struts2におけるSessionTokenのように、同じリクエストの二回目以降も、処理はしないけど全く同じ画面を返却すると言うのも出来るようにしたいですね…。
良さげなライブラリや、もっとこうしたほうが良いとか、自分はこうやったがあれば、ぜひコメントでご教示ください。
【対処法】コンソール画面からインストール画面がはみ出して、操作できない（Hyper-V）

# 手順
1.下記画面で[esc]キーを押下
<img width="413" alt="スクリーンショット 2017-03-16 23.05.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/72f01a1a-6d4c-7d39-1eba-675527769ea8.png">

2.ブートオプションに移行後、下記コマンドを実行する

```
boot: linux resolution = [解像度]
例
boot: linux resolution = 1024x760
```

指定した解像度でインストールが始まります！
【初心者投稿-2】初めてのProgate

#昨日までのおさらい
初めてQiitaに投稿してみたが、どうやらTwitterと同じように投稿すると初心者っぽい。
マークダウンというものがあるらしい…

今日は初めて勉強してみたので書いてみます。

#Progate面白い
社会人2年目、人生初のプログラミング。勉強。
Progateで始めてみたが、ハマるハマる、面白い！

あっという間にLevel9まで来ました！
ただ、次から次へと覚えなきゃいけなくてパンク状態です。

#学習記録
+ Progate1日目
+ 今日の勉強時間：2時間10分
+ 今日学んだこと：htmlとcssの基礎
+ 今日の感想：英語勉強しててよかった。headingとかね
[Laravel 5.2] migrate時にエラーメッセージが表示されていなくても、エラーになる場合

laravel 初心者の備忘録です。

`php artisan migrate` してみたら、migrateは走って

```
migrated xxxxxxxx
migrated xxxxxxxx
```

って表示されて特にエラーは表示されていないのに、エラーになることがありました。

とりあえずログ表示を増やそうと思ったので、コマンドを確かめました。

```
php artisan migrate --help

Usage:
  migrate [options]

Options:
      --database[=DATABASE]  The database connection to use.
      --force                Force the operation to run when in production.
      --path[=PATH]          The path of migrations files to be executed.
      --pretend              Dump the SQL queries that would be run.
      --seed                 Indicates if the seed task should be re-run.
      --step                 Force the migrations to be run so they can be rolled back individually.
  -h, --help                 Display this help message
  -q, --quiet                Do not output any message
  -V, --version              Display this application version
      --ansi                 Force ANSI output
      --no-ansi              Disable ANSI output
  -n, --no-interaction       Do not ask any interactive question
      --env[=ENV]            The environment the command should run under.
  -v|vv|vvv, --verbose       Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
 Run the database migrations
```

`-vvv` ってやれば一番詳しく出るんですね。
というわけで👇で詳しくログをだしてみることができました。

`php artisan migrate -vvv`
Xcode8で実機テストしようとしたらFailed to create provisioning profile. The app ID "jp.co.shoeisha.swiftbook.プロジェクト名" cannot be registered to your development team. Change your bundle identifier to a unique string to try again.

ブログに移行しました。
https://off.tokyo/blog/xcode8-failed-to-create-provisioning-profile/
Bitbucket Server リストア手順

#前提
- Bitbucket Server 4.14.2
- Bitbucket Server Backup Client 3.3.1
- 別サーバへのリストア

#バックアップ手順
http://qiita.com/hmiura/items/ca37570dda6762d6039e

#リストア手順

作業中は `-Dbitbucket.home` は空のディレクトリである必要があるように思いました。
しかし、その後旧データと入れ替えてるので上書きなどもっといい方法があるのかもしれません。

##前準備
```
yum install java-1.8.0-openjdk
mkdir /var/atlassian/application-data/bitbucket/restore
unzip bitbucket-backup-distribution-3.3.1.zip
```
##リストア部分
```
service atlbitbucket stop
cd bitbucket-backup-client-3.3.1/
java -Dbitbucket.home="/var/atlassian/application-data/bitbucket/restore/" -jar bitbucket-restore-client.jar /home/xxx/bitbucket-xxxxxxxx-xxxxxx-xxx.tar
```

## 旧データと入れ替え
```
cd /var/atlassian/application-data/bitbucket/
mv bin _bin
mv lib _lib
mv log _log
mv shared/ _shared/
mv restore/* ./
chown atlbitbucket * -R
```
一旦サービス起動

```
service atlbitbucket start
```

## サーバ設定変更

別サーバーにリストアしたことと、https を使用していたのでサーバ設定がバックアップ元の状態になっていてサーバ設定の変更が必要でした。

7990 ポートで接続し、サーバ設定から基本 URL などをバックアップ先の https 設定に変更。メールサーバの設定も変更しました。

server.xmlも少し修正が必要でした。バックアップ元の設定になるようです。
新旧サーバで設定を一部流用していたので環境によってはパスワードなども変更する必要があると思います。

```:/var/atlassian/application-data/bitbucket/shared/server.xml
keystoreFile="xxx"
keystorePass="xxx"
```

サービス再起動

```
service atlbitbucket restart
```
483名のBrainfuckerを救ったAtomのシンタックスハイライト「language-brainfuck」でBrainfuckの可読性を上げる

難読プログラミング言語と呼ばれるBrainfuck。
せめてシンタックスハイライトで可読性があがれば・・・・
と考えた全国 15万の Brainfuckerの皆様、おまたせいたしました。
Atom の Package として Brainfuck のシンタックスハイライトが提供されています。

## <i class='fa fa-download'></i> language-brainfuck のインストール
Atom のコマンドパレットからPackageのインストール画面を開き、
language-brainfuck をインストールします。

![install.png](https://qiita-image-store.s3.amazonaws.com/0/43480/21212722-aada-8136-64e7-68822bb8ae98.png)

※483ダウンロードと483名は違うだろ！というツッコミは厳禁です

## <i class='fa fa-code'></i> サンプルコード
Brainfuck と出力する Brainfuck のコードです。

```
++++++++++[>++++++<-]>
++++++.+++++++++++++++
++++++++++++++++++++++
+++++++++++.----------
-------.++++++++.+++++
.--------.++++++++++++
+++.------------------
.++++++++.
コメントだよ。コメント
```

* 実行結果

```
Brainfuck
```

http://ideone.com/vTK8De

## <i class='fa fa-flask'></i> サンプル
### <i class='fa fa-frown-o'></i> ハイライト設定前
![before.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a99543e5-c504-2ab3-9feb-5004e28c3e5c.png)

### <i class='fa fa-smile-o'></i> ハイライト設定後
![after.png](https://qiita-image-store.s3.amazonaws.com/0/43480/998a7220-18d6-e7ac-c380-cf0d6cff83ec.png)

## <i class='fa fa-graduation-cap'></i> まとめ
え？代わり映えがしない？
そんな訳はありませんよね。
これで皆様のBrainfuckコーディングの生産性が256倍程度上がったものと思います。

次はWhitespaceのシンタックスハイライトを・・
と冗談のつもりで言ったら本当にあるから世の中怖い。

[veniversum/language-whitespace - GitHub](https://github.com/veniversum/language-whitespace)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [EvanHahn/atom-language-brainfuck - GitHub](https://github.com/EvanHahn/atom-language-brainfuck)
* [language-brainfuck - atom.io](https://atom.io/packages/language-brainfuck)
【備忘録】強制的にNASのマウントを解除する方法

#１．概要
社内でオンプレからAWS移行するにあたり、オンプレ側のNASが削除された。
事前にマウントを解除する必要があったが、作業漏れがあり、マウントが解除されていなかった。
NASが落ちていた場合、umountコマンドが返却されないので、強制的に解除する方法を明記する。

#２．コマンド
```
umount -l　※デバイスがビジー状態でないときと同じ動作をする。
```

#３．補足事項
事前にumountすること忘れないようにしましょう。
「/etc/fstab」の設定も削除し忘れないようにしましょう。

#４．参考URL
[ktomoyaの日記：強制的にファイルシステムをアンマウントする](http://d.hatena.ne.jp/ktomoya/20080901/1220286943)
CardIOのunofficial release buildをした時の手順メモ

CardIOを改造して使いたくて、ソースを自分でビルドする必要があったので、その時の手順やハマったポイントをまとめました。

# これをビルドしたい
https://github.com/card-io/card.io-iOS-source


# 環境
MacOS 10.11.6

# 必要なツールなど
https://github.com/card-io/card.io-iOS-source/
ここのREADMEのとおりですが。

* python v2.6>=：プリインでpython2.7.10があったのでこれを使用。
* pipも、プリインのものを使用。pip 6.0.8
* fabric：これをインストールするのに少しハマったので以下に。

## fabricのインストール
まずは何も考えずに以下を実行するが、うまく行かず

```:bash
$ pip install fabric
```

### ハマり１
```エラー１
error: command 'cc' failed with exit status 1
```
といったエラーが出たので、以下を実行。

```:bash
$ xcode-select --install
```

### ハマり２
`Uninstalling setuptools-1.1.6:` のところで、 

```エラー２
Operation not permitted
```

が出たので、以下オプションを付けて実行（解決せず）。

参照↓
http://stackoverflow.com/questions/33234665/upgrading-setuptools-on-osx-el-capitan


↑では解決せず、El CapitanのSIPを外してみる。
参照↓
http://berukann.hatenablog.jp/entry/2015/12/30/123020

SIP解除でこのエラーは抜けた。

### ハマり３
```エラー３
TypeError: __call__() takes exactly 2 arguments (1 given)
```
今度はこのエラー。再びstackoverflowを見る。

http://stackoverflow.com/questions/42029545/pip-is-error-typeerror-call-takes-exactly-2-arguments-1-given

pipにバグが有るようだ、、、アップデート

```
sudo python -m pip install --upgrade pip
```

これでようやく、fabricインストール成功！

```
# sudo pip install fabric // 成功！
```

# CardIOビルド
これでようやくCardIOをビルドできます。
virtualenvとか入れてないけど、まいっか。。
プロジェクトルートで以下を実行して、

```
fab build:outdir=~/outputdir/
```

晴れて、~/outputdir/に成果物が出来ました。


# その後
valerもインストールしてみたのだが、その際もまたエラーが出たのでメモ

```エラー３と同じ
$ sudo pip install baler
...
TypeError: __call__() takes exactly 2 arguments (1 given)
```

前回と同じようなエラーが。前回のstackoverflowの記事を引いてくる。

```
pip install setuptools==33.1.1
```

```エラー４
      File "/Library/Python/2.7/site-packages/pkg_resources/__init__.py", line 854, in resolve
        raise VersionConflict(dist, req).with_context(dependent_req)
    pkg_resources.VersionConflict: (six 1.4.1 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python), Requirement.parse('six>=1.6.0'))

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/tmp/pip-build-1pXHUT/baler/
```

sixのupgradeする必要がありそう

```
$ sudo pip install six --upgrade
```

これでdone

はれてcardioのライブラリをビルドできたわけですが、アプリで動かすにはまだimportしなければなりません。そこについてはまた次回書きます。
zshのプロンプトを256色表示にする＋好きなフォーマットで時刻表示

先日、今まで頑なにBashを使い続けていたもののついにZshに乗り換えました。
世の中には様々な理由でBashしか使えない環境も多いということでずっとBashにこだわってきましたが、[zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)の存在ででついに落ちました。

この話はまた今度にして今回はプロンプトのカスタマイズについて書いていきます。
特に256色表示と時刻表示でハマったのでその話をメモとして残しておこうと思います。


# 環境
| 名称   | version等                |
|:-------|:-------------------------|
| OS     | OS X El Capitan 10.11.6  |
| zsh    | 5.3.1                    |
| ターミナルエミュレータ | iTerm2 3.0.14  |

zshとiTerm2はhomebrewでインストールしています。
また、VMですがCentOS 7.1などでもちゃんと反映できました。

# プロンプトをカラフルに
単にプロンプトの色を変更すること自体は`.zshrc`でcolorsを呼び出して、`PROMPT`に文字の色なら`$fg[hoge]`、背景色なら`$bg[hoge]`を指定してあげるだけです。

```zsh:例：~/.zshrc
autoload -Uz colors
colors

PROMPT="%{$fg[green]}%}[%n@%m]%{${reset_color}%}"
```
なんとまあ、お手軽簡単。しかしこの方法では8色しか指定できません。
元々、僕はデザイナー出身で色にうるさいエンジニアなので、CUIでも色に拘りたいのです。
なので早速プロンプトを256色表示でカラフルにしてあげようと思い調べました。

## 256色表示

256色表示する方法は複数あります。
例はいずれも緑（082）背景の赤（001）文字です。
### ANSI利用
```zsh:例1
PROMPT="%{^[[30;48;5;082m%}%{^[[38;5;001m%}[%n@%m]%{^[[0m%}"
```
一つ目はANSIカラーコードの256色モードを利用したもの。
`^[`で表されているのは制御文字でVimの場合はCtrl+v入力後にCtrl+[ or ESCで入力できます。
`[30;48;5;色番号m`で背景色、`[38;5;色番号m`で文字色を指定できます。最後に`[0m`で色リセット。

余談ですが、`^[`は`\033`や`\e`でも代用できるはずなんですが、僕の環境では何故か正常に反映されませんでした。何か分かる人は教えてください。

**(2017/3/20 追記)**
コメントより

```zsh:例1’
PROMPT=$'%{\e[30;48;5;082m%}%{\e[38;5;001m%}[%n@%m]%{\e[0m%}'
```
`\`が使われたエスケープはプロンプトでの解釈には含まれず、`$'~'`やzsh組み込みのechoの引数で解釈されるそうです。
なので、`PROMPT`の指定で`\`を使うならば、上の例のように代入時に`$'~'`を使って`\`が解釈されるようにすると良いようです。ちなみに例では`\e`ですが、`\033`でも大丈夫です。
### Zshパラメータ利用
```zsh:例2
PROMPT="%K{082}%F{001}[%n@%m]%f%k"
```
もう一つは`man zshmisc`で見れるZshのパラメータを利用した方法。
`%K{色番号}`で背景色、`%F{色番号}`で文字色を指定、`%k`で背景色リセット、`%f`で文字色リセット出来ます。
こちらのほうがスッキリしていて見やすいので僕はこちらで指定しています。

ちなみに、指定できる色は以下のワンライナー実行で確認できます。

```zsh
for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo
```

# 好きなフォーマットで時刻表示
Bash時代のプロンプトには僕は`[曜日 月/日 時:分:秒]`なフォーマットで時刻を表示していたのですが、Zshで標準で提供されているパラメータではこのようなフォーマットは存在しません。
しかし、Zshではstrftime関数を用いて自由に時刻フォーマットできる`%D{string}`が用意されています。

```zsh:例
PROMPT="[%D{%a %m/%d %T}]"
```
上記のフォーマットはこのようになります。
詳しいフォーマットについては`man strftime`か[このサイト](http://kazmax.zpp.jp/cmd/s/strftime.3.html)で。
# 参考

 - [zshのプロンプトカラーを設定を変更してみた - HAM MEDIA MEMO](https://h2ham.net/zsh-prompt-color)
 - [zshのプロンプトを256色にする方法 - 余白の書きなぐり](http://auewe.hatenablog.com/entry/2015/09/19/051918)
 - [colors - 256 colour prompt in Zsh - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/25319/256-colour-prompt-in-zsh)
 - [zsh_ 13 Prompt Expansion](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html)
 - [zsh で全 256 色を試しに表示みたい - Qiita](http://qiita.com/k_ui/items/b02b93e3af13023c0bfd)
 - [strftime - ライブラリコールの説明 - Linux コマンド集 一覧表](http://kazmax.zpp.jp/cmd/s/strftime.3.html)

# あとがき

manコマンドはさいつよ。
あと、Sublime textで`^[`入力できないのなんか悔しい。
TypeScriptでの対角線の求め方

# 対角線の求め方

TypeScript

```ts
const varticalLine = 100;
const horizontalLine = 100;

const length = Math.sqrt(varticalLine ** 2 + horizontalLine ** 2);
```

アスタリスクでべき乗が扱えるのは便利ですね！！

## 参考記事

ES2016で追加された新機能Exponentiation Operatorとは一体何か？ - Qiita http://qiita.com/tonkotsuboy_com/items/12436de8c6f3a289d3af
Vim初級者が最短で中級者になるための手順


## 概要
Vimを仕事で使い始めて約6ヶ月が経ちました。

最初はVimに悩まされ、悪戦苦闘がありましたが、ようやく手に馴染んできたような気がします。

同じようにVimを使い始めた初心者の方がどうしたら中級者のように使いこなせるようになるのか、自分の経験からその手順をシェアしたいと思います。

## ポイント
Vimを使いこなすためには、大きく2つのことを習得することが重要です。

#### (1) カスタマイズ
#### (2) コマンド

カスタマイズは、色々な便利機能を追加していくことで、自分に合った設定にすることができます。

コマンドは、コーディングスピードを速めるために覚えるべきものです。

以上の2つのポイントを頭に入れながら、以下の手順で習得していきましょう。

## 手順
### 1. 最新のVimをインストール
まずVimを使い始めて悩まさせるのがコピペがなかなかうまくできないことです。

Macにデフォルトで入っているVimはクリップボード連携が使えません。

なので、最初に最新のVimをインストールしてクリップボード連携を出来るようにすると、後々で楽になります。

以下の記事を参考にしてください。

- 参考:[初心者向け　Vimでクリップボード連携(コピー&ペースト)する方法](http://qiita.com/iwaseasahi/items/a45b99a484966662adbe)

### 2. Vimのカーソル移動速度を変更
次にやることがカーソルの移動速度を速くすることです。

デフォルトの設定は少し遅めなので作業効率が悪くなります。

ちょっとした設定変更だけなので、すぐに出来ます。

- 参考:[初心者向け Vimでカーソルの移動速度を速くする方法](http://qiita.com/iwaseasahi/items/fbcd1cc13efee92c6354)

### 3. Vimをカスタマイズ
そして、3番目にやるべきことがVimのカスタマイズです。

デフォルトのVimではあまりにも不便なことが多くてビックリします。(笑)

なので、使いやすいようにvimrcでカスタマイズします。

- 参考:[初心者向け vimrcの設定方法](http://qiita.com/iwaseasahi/items/0b2da68269397906c14c)

### 4. プラグイン管理ツールを導入
4番目はVimのプラグイン管理ツールを導入することです。

Vimにはプラグインという拡張機能が多数用意されています。

このプラグインをインストールすることでさらにオリジナルかつ使いやすい設定へとカスタマイズできます。

そのプラグインを管理するツールを導入します。

- 参考:[初心者向け　Vimにプラグイン管理(NeoBundle.vim)を導入する方法](http://qiita.com/iwaseasahi/items/93db781ef08bcdb15004)

### 5. Vimのコマンドを習得
最後にやるべきことはコマンドの習得です。

どんなに設定を便利にしてもコマンドを使いこなせなかったら、Vimは力を発揮しません。

便利なコマンドを駆使することで、ようやく他のテキストエディタより速くコーディングをすることが可能になります。

ある程度カスタマイズできたら、後は1日1個のコマンドを覚える気持ちで習得していきましょう。

- 参考:[Vimコマンド : 便利一覧](http://qiita.com/iwaseasahi/items/f536bb3772d2fad5e03c)


もし全くのVim初心者であれば、`vimtutor` から始めることをオススメします。

- 参考:[Vim初心者向け：Vimの使い方が分かるコマンド](http://qiita.com/y-temp4/items/3032d22cb5cc6ae3117a)

## 総括
以上がVimを使いこなすための簡単な手順になります。

実際のところ、この手順は私自身が通って来た道のりです。

まず最初はVimの不便さに驚き、色々と調べながらカスタマイズしました。

そして、カスタマイズが終わったら、コマンドを一つ一つ覚えていったのです。

カスタマイズとコマンドという2つを出来るようになることがVimを使いこなすための手順になります。

簡単ではありましたが、自分の経験を踏まえてVimを使いこなすための手順を紹介しました。
ネストしたオブジェクト/配列をImmutableに更新するためのJSのライブラリを書いた

[Immutable Update Patterns](http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html)

ここあるようにReactなどでオブジェクトや配列がネストしたstateを更新するのがひたすらめんどくさい。

```javascript
function updateVeryNestedField(state, action) {
    return {
        ....state,
        first : {
            ...state.first,
            second : {
                ...state.first.second,
                [action.someId] : {
                    ...state.first.second[action.someId],
                    fourth : action.someValue
                }
            }
        }
    }
}
```

正気の沙汰ではない。

Immutable.jsみたいなものを使うのも一つの方法だろうけど、個人的にはオーバースペック。単純にネストした値を更新したいだけなんだ。いくつかそれっぽいライブラリがあったので見たけどイマイチいい感じのものがなかった。

- [dot\-prop\-immutable](https://www.npmjs.com/package/dot-prop-immutable)
- [updeep](https://www.npmjs.com/package/updeep)
- [immutability\-helper](https://www.npmjs.com/package/immutability-helper)

ので自分で書いた。

[hokaccha/immup](https://github.com/hokaccha/immup)

ざっくりこんな感じのことができる。

```javascript
import immup from 'immup';

let state = {
  todos: [
    { id: 1, title: 'foo', completed: true },
    { id: 2, title: 'bar', completed: false },
    { id: 3, title: 'baz', completed: false },
  ]
};

immup.set(state, 'todos.2.title', 'new title');
// =>
// {
//   todos: [
//     { id: 1, title: 'foo', completed: true },
//     { id: 2, title: 'bar', completed: false },
//     { id: 3, title: 'new title', completed: false },
//   ]
// }
```

その他のAPIは[ドキュメント](https://github.com/hokaccha/immup#immup)を参照のこと。

[Bdash](https://github.com/bdash-app/bdash/tree/master/app)というアプリに組み込んでいい感じに使えている。

```javascript
class QueryStore extends Store {
  reduce(type, payload) {
    switch (type) {
      case 'selectQuery': {
        let idx = this.findQueryIndex(payload.id);
        return this
          .set('selectedQueryId', payload.id)
          .set('editor.line', null)
          .merge(`queries.${idx}`, payload.query);
      }
      //...
    }
  }
}
```

[Source](https://github.com/bdash-app/bdash/blob/a9b7e7ffb9b4c86017d422ea873712aba28fe6ee/app/renderer/pages/Query/QueryStore.js#L28-L34)
ある範囲における数値を別な範囲における数値に変換する

$ x_{min} $ 以上 $ x_{max} $ 以下の範囲に存在する数値 $ x_i $ を、0 以上 1 以下の範囲に存在する数値 $ n_i $ に変換する、つまり正規化するためには 

```math
\begin{equation}
n_i = \frac{x_i - x_{min}}{x_{max} - x_{min}}
\end{equation}
```

という式で計算します。逆に、正規化した数値 $ n_i $ を $ y_{min} $ 以上 $ y_{max} $ 以下の範囲に存在する数値 $ y_i $ 変換する、つまり非正規化するには、上記の式を変形した

```math
\begin{equation}
y_i = n_i(y_{max} - y_{min}) + y_{min}
\end{equation}
```

という式で計算します。

```rb
module NumericExtensions
  refine Numeric do
    def normalize(min = 0, max = 1)
      (self - min).fdiv(max - min)
    end

    def denormalize(min = 0, max = 1)
      self * (max - min) + min
    end
  end
end

using NumericExtensions

# (例 1) 1..3 の範囲における 2 を 0..1 における数値に変換する。
2.normalize(1, 3) #=> 0.5

# (例 2) (例 1) の結果を元に戻す。
2.normalize(1, 3).denormalize(1, 3) #=> 2.0

# (例 3) 1..3 の範囲における 2 を 1..5 における数値に変換する。
2.normalize(1, 3).denormalize(1, 5) #=> 3.0

# (例 4) 1..5 の範囲における 3 を 1..3 における数値に変換する。
3.normalize(1, 5).denormalize(1, 3) #=> 2.0
```
reduxでimmutablejsつかうならicepickがあるよ

# npmのページ
https://www.npmjs.com/package/icepick

# これはなに？
immutablejsでできることを、ただの関数にしたもの。
underscoreやlodashと同じような気分で使える。

# 例
サイトままですが。

```js
import i from 'icepick'

const coll = {
  a: 'foo',
  b: [1, 2, 3],
  c: { d: 'bar' }
}
 
const newColl = i.assocIn(coll, ['c', 'd'], 'baz')
 
assert(newColl.c.d === 'baz')
assert(newColl.b === coll.b)
 
const coll = {}
const newColl = i.assocIn(coll, ['a', 'b', 'c'], 1)
assert(newColl.a.b.c === 1)
```
AndroidエミュレータとVirtualBox、Docker for Macを同時に実行できない問題の対処法

# AndroidエミュレータとVirtualBox、Docker for Macを同時に実行できない問題

Docker for Macなどを起動中にAndroidエミュレータが起動できない状況がずっと続いていました。こういったメッセージが表示されるやつです。

> Unfortunately, VirtualBox 4.3.30+ does not allow multiple hypervisors to co-exist.In order for VirtualBox and the Android Emulator to co-exist, VirtualBox must change back to shared use.Please ask VirtualBox to consider this change here: https://www.virtualbox.org/ticket/14294

こんな[コメント](https://www.virtualbox.org/ticket/14294#comment:20)もあるように直したくても直せなかった模様。

> Unfortunately the source code of HAXM is not freely available (in contrast to the source code of VirtualBox) so it's hard to debug this problem.

こちら、ずーっと悩まされ続けてたんですがやっと解決しました ＼(^o^)／

# 対処法

Intel® Hardware Accelerated Execution Manager(Intel® HAXM)の`6.1.1`で修正されたようです。こちらから6.1.1を落としてインストールすることで解決します！

https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager

Android Studioでもそのうち配布されるようになると思いますよー。
(2017/03/16時点では6.0.5が配布されていますね)

# 補足

[Installation Guide and System Requirements – macOS](https://software.intel.com/en-us/android/articles/installation-instructions-for-intel-hardware-accelerated-execution-manager-mac-os-x)の一番下部にあるChangelogにもしっかりと下記の記載がありました。

> Fixed coexistence with VirtualBox and Docker on macOS. (b.android.com/197915)

全然関係ないですがHAXMの過去のChangelogはどこで見れるんでしょうか...w
Laravelでミドルウェア(middleware)からコントローラ(controller)に値を受け渡す

# 背景
ミドルウェアでユーザー情報を取得&セットして、コントローラ側でそのユーザー情報を取り出したかった。

# ハマりポイント
ミドルウェア側でインジェクションされる request とコントローラ側でインジェクションされる request の
取得元のパラメータが異なるため、単純に request に値をセットしてもコントローラ側で
値を取れない。そこに気づくまでハマった。

# 方法

```php:middleware.php
    public function handle($request, Closure $next)
    {
      // コントローラ内からアクセスできるように値をセット
      $request->merge([
        'key' => 'value'
      ]);

      return $next($request);
    }
```

```php:controller.php
class SampleController extends BaseController
{

    /**
     * サンプルアクション
     * @param  Request $req [description]
     * @return [type]       [description]
     */
    public function sample(Request $req){
      // ミドルウェアでセットした値を取得
      $code = $req->key;

```
opalでbotkitを使った最小限slack bot

# 下準備

* botkit

```
> npm init
> npm install botkit --save
```

* opal

```
> gem install opal
```

# ソース

* app.rb

```ruby
require 'opal'
require 'native'

`const Botkit = require('botkit');`

token="[APIトークン]"

controller = Native(`Botkit.slackbot()`)

controller.spawn({ "token" => token }).startRTM do |err|
    if err
        exit
    end
end

controller.hears('hi', ['direct_message', 'direct_mention', 'mention'], Proc.new do |bot, msg|
    Native(`bot`).reply(msg, 'hi')
end)

~
```

# 実行

```
> opal -c app.rb > app.js
> node app.js
```
EXCEL 情報を削除するマクロ

###まず定数について確認
***xlRDIComments 1 文書情報からコメントを削除します。***
xlRDIRemovePersonalInformation 4 文書情報から個人情報を削除します。
xlRDIEmailHeader 5 文書情報からメール ヘッダーを削除します。
xlRDIRoutingSlip 6 文書情報から回覧先を削除します。
xlRDISendForReview 7 文書情報から [校閲者へ送信] 情報を削除します。
xlRDIDocumentProperties 8 文書情報から文書プロパティを削除します。
xlRDIDocumentWorkspace 10 文書情報からワークスペース データを削除します。
xlRDIInkAnnotations 11 文書情報からインク注釈を削除します。
xlRDIScenarioComments 12 文書情報からシナリオのコメントを削除します。
xlRDIPublishInfo 13 文書情報から発行情報データを削除します。
xlRDIDocumentServerProperties 14 文書情報からサーバー プロパティを削除します。
xlRDIDocumentManagementPolicy 15 文書情報から文書管理ポリシー データを削除します。
xlRDIContentType 16 文書情報からコンテンツ タイプのデータを削除します。
xlRDIDefinedNameComments 18 文書情報から定義済みの名前のコメントを削除します。
xlRDIInactiveDataConnections 19 文書情報から無効なデータ接続を削除します。
xlRDIPrinterPath 20 文書情報からプリンターのパスを削除します。
xlRDIInlineWebExtensions 21 文書情報からインライン Web 拡張機能を削除します。
xlRDITaskpaneWebExtensions 22 文書情報から作業ウィンドウの Web 拡張機能を削除します
xlRDIExcelDataModel 23 文書情報からデータ モデル データを削除します。
xlRDIAll 99 文書情報をすべて削除します。

##という定数を踏まえて
99以外を適用するマクロです。
必ずいったん保存し、できれば別名で保存してください。
特に1のコメントって配布する場合にも必要なので、全部削除するというのはいかがなものかという面があります。
このため、1は要らないというケースが多いと思います。

```ActivWBRmInfo.BAS
Sub ActivWBRmInfo()
'Office 2013 Later Recommend
'!! Danger VBA Danger VBA !! !! Danger VBA Danger VBA !! !! Danger VBA Danger VBA !!
'This VBA Macro Del File Infomation!!!!
If MsgBox("This Macro VBA Delete Various Infomation.Please Save File Other Name.", vbCritical + vbOKCancel + vbDefaultButton2, "Danger!") = vbCancel Then Exit Sub

Dim arRmInfoEnum:arRmInfoEnum = Split("1,4,5,6,7,8,10,11,12,13,14,15,16,18,19,20,21,22,23", ",")
Dim I as long
For i = LBound(arRmInfoEnum) To UBound(arRmInfoEnum)
On Error Resume Next
ActiveWorkbook.RemoveDocumentInformation (CLng(arRmInfoEnum (i)))
On Error GoTo 0
If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description, "i", i, " arRmInfoEnum(i)", arRmInfoEnum(i)
Next
End Sub
```
prometheus監視設定（Azure編）

# 環境
Prometheus Server： Azure 仮想マシン上に立てたDockerコンテナ
監視対象のサーバ：Azure 仮想マシン上＆および仮想マシン上のコンテナ


# 前書き
prometheusの検証を実施する中で設定ファイルとなるprometheus.yml の記載についてちょっと疑問が沸いたので備忘録です。
コンテナやAutoScaleに対応している監視ツール。それがPrometheusという認識から検証を開始したものの、どうやって設定ファイル記載するんだろう？？



# 調査１：そもそも
「Prometheus オートスケール」でGoogle先生のお告げを聞くと、[長生村本郷Engineers'Blog](http://kenzo0107.hatenablog.com/entry/2017/01/25/154144) にAWS用の記載があることが判明。

```
 - job_name: 'node'
    ec2_sd_configs:
      - region: ap-northeast-1
        access_key: ********************
        secret_key: ****************************************
        port: 9100
```

これは、もしや「azure_sd_configs」もあるのか？とGoogle先生のお告げを確認・・・・あった！
[Prometheus.Configuration](https://prometheus.io/docs/operating/configuration/#<azure_sd_config)

```
# The information to access the Azure API.
# The subscription ID.
subscription_id: <string>
# The tenant ID.
tenant_id: <string>
# The client ID.
client_id: <string>
# The client secret.
client_secret: <string>

# Refresh interval to re-read the instance list.
[ refresh_interval: <duration> | default = 300s ]

# The port to scrape metrics from. If using the public IP address, this must
# instead be specified in the relabeling rule.
[ port: <int> | default = 80 ]
```

これはそれぞれ<string>の部分に何を記載すれば、いいのかな・・・。

# azure_sd_config の記載内容
[Tower of Engineers](https://toe.bbtower.co.jp/20160818/860/)にもう少し詳しく記載がありました。


Azureポータルから**Azure Active Directory**を選択して、**「アプリの登録」**が必要そうです。
最低限必要な記載は、次の4つ。

・subscription_id   → (言わずと知れた)サブスクリプションID
・tenant_id   →   テナントID（サブスクリプション ID に紐付くID）       ※ 確認方法は、下記参照
・client_id   →   Azure Active Directoryのアプリ登録時に生成される AppId の値
・client_secret   → Azure Active Directoryのアプリ登録時に生成される キーの値

```
~注意~
   client_secretは、キー作成時のみ表示されるのでしっかりとコピーしてください。
   万一忘れた場合には、キーの再作成です。
```

# テナントID確認方法
テナントIDは、AzureCLI（PowerShell)から確認できます。

```
<PowerShell起動>
> Login-AzureRmAccount
Environment           : ***********
Account               : ******@*****.**
TenantId              : ********-****-****-****-************
SubscriptionId        : ********-****-****-****-************
SubscriptionName      : *********
CurrentStorageAccount :

> Get-AzureRmSubscription

SubscriptionName      : **************
SubscriptionId        : ********-****-****-****-************
TenantId              : ********-****-****-****-************
State                 : Disabled

SubscriptionName      : **************
SubscriptionId        : ********-****-****-****-************
TenantId              : ********-****-****-****-************
State                 : Enabled

```

# 参考サイト
[長生村本郷Engineers'Blog](http://kenzo0107.hatenablog.com/entry/2017/01/25/154144)
[Prometheus.Configuration](https://prometheus.io/docs/operating/configuration/#<azure_sd_config)
[Tower of Engineers](https://toe.bbtower.co.jp/20160818/860/)
Windows で サクッと curl

Windows で curl が手軽に使用できることを知らなかったので、メモ。

[curl-download](https://curl.haxx.se/download.html)
ここから、自身の環境にあったファイルをダウンロード→解凍

私の場合、win7-32bit を使用しているため
> Win32 - Generic
Win32 zip	7.52.1	binary	SSL	SSH	Dirk Paehl

を選択。

解凍したものを適当なディレクトリに設置。
環境変数で PATH さえ追加すれば、どこでもイイ。
適当に`C:\curl`とかを使用。

上記で使用したディレクトリに、CA証明書ファイルを追加。
・"curl-ca-bundle.crt"という名前の新規ファイルを作成。
・中身は、[CA Extract](https://curl.haxx.se/ca/cacert.pem) を utf-8 で保存したモノ

これで、curl をコマンドラインから使用することができるようになります。メッチャ便利。
db:migrateの管理からridgepoleに移行する

# ridgepoleとは

[winebarrel/ridgepole](https://github.com/winebarrel/ridgepole)
DBスキーマを管理するgem。
これを使ってdb:migrateから卒業します！

# 導入手順

## gemインストール
Gemfileに以下を追加して、`bundle install`します。

```ruby:Gemfile
gem 'ridgepole'
```

## 現状のSchemaを吐き出す
今回は、すでにDBがあるので、現状のSchemaをファイルに吐き出します。
また、テーブルごとに別ファイルに切り出してほしかったので`--split`オプションを指定しています。

```zsh
$ bundle exec ridgepole -c config/database.yml -E development --split --export -o db/schemas/Schemafile
Export Schema
...
```

試しにさっき吐き出されたスキーマファイルでapplyしてみる。

```zsh
$ bundle exec ridgepole -c config/database.yml -E development --apply -f db/schemas/Schemafile
Apply `db/schemas/Schemafile`
No change
```

No Change！まあ当たり前ですね。

あと、`db/migrate`にあるファイルは不要なので一括削除しておきます。

使い方などの詳細は以下をご覧ください :)
https://github.com/winebarrel/ridgepole#usage

# capistranoでデプロイ時に実行する

## gemインストール
執筆時点でver0.0.4ですが、自作するのも面倒なのでgemで対応します。（やってることはすごくシンプル）

```ruby:Gemfile
gem 'capistrano3-ridgepole'
```

## Capfileに記述
必要のないmigrationタスクもついでに削除しておきます。

```diff:Capfile
 require 'capistrano/bundler'
 require 'capistrano/rails/assets'
+require 'capistrano3/ridgepole'
-require 'capistrano/rails/migrations'
 require 'capistrano3/unicorn'
```

## deployタスクを追加

```capistrano3-ridgepole/lib/capistrano3/tasks/ridgepole.rake
...
  task :defaults do
    set :ridgepole_roles, -> { :db }
    set :ridgepole_schema_file, -> { File.join(current_path, "Schemafile") }
    set :ridgepole_config_file, -> { File.join(current_path, "config", "database.yml") }
    set :ridgepole_env, -> { fetch(:rails_env) || "development" }
    set :ridgepole_options, -> { "" }
    set :overwrite_migration_tasks, -> { false }
  end
...
```
初期値が上記のようになっているので、よしなに上書きしていきます。

```config/deploy.rb
set :ridgepole_schema_file, File.join(current_path, 'db/schemas', 'Schemafile')
after 'deploy:publishing', 'ridgepole:apply'
```

タスクは`within current_path`で実行されるので、applyのタイミングはcurrent_path上書き後の`after 'depoy:publishing'`にします。

これで、`capisrano deploy`したときに一緒にapplyされます。

※ちなみに`db:migrate`タスクは`after 'deploy:updated'`のタイミングに`within release_path`で実行されます。
参考：[capistrano/tasks/migrations](https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/migrations.rake)

# 導入後の流れ
1. ローカルで`db/schemas`にあるスキーマファイルを変更する
2. `ridgepole apply`で変更内容をDBに適用する
3. スキーマファイルをcommit, push, deployしてリモートに反映する

以上！

# 参考
- [winebarrel/ridgepole](https://github.com/winebarrel/ridgepole)
- [クックパッドにおける最近のActiveRecord運用事情 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2014/08/28/194147)
- [NowDeveloping: さらば「rails migrate」、よろしく「ridgepole」](https://nowdeveloping.blogspot.jp/2016/10/rails-migrateridgepole.html)
- [timakin/capistrano3-ridgepole: Capistrano3 plugin for ridgepole tasks](https://github.com/timakin/capistrano3-ridgepole/)
Rails runner <filename.rb> → Syntax error ナンデ！？

ファイルパスを指定しているのにコードとして実行されてしまい（当然ファイルパスをRubyコードとして実行してもSyntaxがおかしいので）**```Syntax error```** になってしまう問題に暫く頭を悩ませてしまっていた。

結論から言うと、***ファイルパスが不正(ファイルが存在しない)*** 場合にこのようなエラーになる。
それが何故このようなエラーになるかと言うと、 `railties/commands/runner.rb` の実装が次のようになっているからだ。(※現時点`master`での実装)

```rb
if File.exist?(code_or_file)
  $0 = code_or_file
  ARGV.replace(file_argv)
  Kernel.load code_or_file
else
  begin
    eval(code_or_file, binding, __FILE__, __LINE__)
  rescue SyntaxError, NameError => error
    $stderr.puts "Please specify a valid ruby command or the path of a script to run."
    $stderr.puts "Run '#{self.class.executable} -h' for help."
    $stderr.puts
    $stderr.puts error
    exit 1
  end
end
```

ファイルとして存在する場合は、それを読み込み実行する。そうでない場合は文字列を `eval` する。

https://github.com/rails/rails/blob/54ee15a/railties/lib/rails/commands/runner/runner_command.rb#L30

てっきり正規表現で `/.*\.rb/` にマッチングでもさせているのかと思ったらそうではなかった。コマンドヘルプにも、

```
$ rails r -h
Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
```

とだけ書かれているので、てっきり文字列でマッチングしているのかと思っていた。

---

困ったときは(オープンソースなのだから)元の実装を見てみるに限る。

そして別に `.rb` でマッチさせている訳ではないので、ファイルとして存在していれば `.rb` 以外の拡張子でも `rails runner` で呼び出せることが分かった。(勉強になった)
MovableTypeのグローバル・モディファイアでいろいろ解決する時のやつ

すぐ忘れるからまとめる:relaxed:

# 出力内容を変数にするやつ

* 値を出力せずに変数に入れる
* 使いすぎたりちりばめたりすると、パッと見で「出力」なのか「変数化」なのか判断ミスって事故る:innocent:

```movabletype:modifiers
setvar="_hoge"
```

例:

```movabletype:template
<mt:BlogName setvar="_thisBlogName">
<mt:Var name="_thisBlogName">
```

```html:output
Blog Name
```

# 出力内容をルート相対にするやつ

* ドメイン部を/に置換する
* テスト環境とか、本番サーバとCMSサーバでドメインが違う時とかに使う

```movabletype:modifiers
regex_replace="/^https?:\/\/[^\/]+\//","/"
```

例:

```movabletype:template
<a href="<mt:EntryLink regex_replace="/^https?:\/\/[^\/]+\//","/">"><mt:EntryTitle></a>
```

```html:output
<a href="/hoge/basename.html">Entry Eitle</a>
```

## 応用

* ドメイン部を置換する
* テスト環境とか、本番サーバとCMSサーバでドメインが違う時とか、どこかのフォルダ下で展開されるコンテンツとかに使う

```movabletype:modifiers
regex_replace="/^https?:\/\/[^\/]+\//","$_OpenPath"
```

例:

```movabletype:template
<mt:SetVar name="_OpenPath" value="http://www.hoge.jp/">
<a href="<mt:EntryLink regex_replace="/^https?:\/\/[^\/]+\//","$_OpenPath">"><mt:EntryTitle></a>
```

```html:output
<a href="http://www.hoge.jp/hoge/basename.html">Entry Eitle</a>
```

# 出力時に空白改行を出力しないようにするやつ

* 出力内容から空白改行を置換して消す
* 出力する前にいろいろ変数設定とかで行数使っている場合にソースがスッカスカになって:no_good:って気分になるから使う
* この正規表現は調べてるといろんなパターンがある
* Forで囲わないで出力のVarに書いても良い

```movabletype:template
<mt:For regex_replace="/^[\ \t\r\n]+/mg","">
    <mt:Ignore>
        ここに処理を書く
    </mt:Ignore>
</mt:For>
```

# 0埋めするやつ

* 0埋めしてケタ数を揃える
* 書くほどの内容じゃないんだけど「あ、アレ！あれだよ！桁揃えるやつ！」となるからメモ:v:

```movabletype:modifiers
zero_pad="4"
```

例:

```movabletype:template
<mt:EntryID zero_pad="10">
```

```html:output
0000000142
```

# X文字で省略するやつ

* X文字超えたら...に切る
* これを求める場合はほぼデザイン上の都合なので、CSSでやって、どうぞ:raised_hand:

```movabletype:template
<mt:EntryTitle count_characters="1" setvar="_titleCount">
<mt:If name="_titleCount" gt="30">
    <mt:EntryTitle trim_to="30">...
<mt:Else>
    <mt:EntryTitle>
</mt:If>  
```
Swift3 - RealmSwiftでprimaryKeyで書く方法

```swift

import RealmSwift

class Diary: Object {
    // 管理用プライマリーキー
    dynamic var id = 0
   


    /**
     id をプライマリーキーとして設定
     */
    override static func primaryKey() -> String? {
        return "id"
    }
}

```
ElasticBeansTalk(tomcat)でROOT以外にwarをdeployするときは2つ以上のwarをdeployする必要がある

ドキュメントの裏付けは取れていないのだけど、warをROOT以外のPATHにdeployしようとしたところうまく行かなかった。
単純に何の意味もないwarを抱き合わせてdeployしてみたところうまく動いたのでメモ

#### 失敗パターン zip 構成
```
deploy.zip
├ .ebextensions
│　└ httpd
│　　└ conf.d
│　　　└ ex_httpd.conf
└ hoge.war
```

#### 成功パターン zip構成
```
deploy.zip
├ .ebextensions
│　└ httpd
│　　└ conf.d
│　　　└ ex_httpd.conf
├ fuga.war //中身はフレーム + index.htmlくらいで良い
└ hoge.war
```
[GitLab][PostgreSQL] GitLabのPostgreSQLのshared_buffersの設定値について

GitLabの動作が遅いとの報告を受けたため、パフォーマンスに関連する項目の調査を行った際のメモ
PostgreSQLの `shared_buffers` の値がパフォーマンスに影響するらしい

GitLabは8.15からPostgreSQLのバージョンが `9.2.18` から `9.6.x` に上がっています。

[GitLab 8.15 Released with Auto Deploy and Web Terminal | GitLab](https://about.gitlab.com/2016/12/22/gitlab-8-15-released/#postgresql-version-upgrade)

その際に `shared_buffers` デフォルト値が変更になっています。

# PostgreSQL

| PostgreSQLバージョン | shared_buffersのデフォルト値 |
|:-:|:-:|
| 9.2  | 32MB  |
| 9.3  | 128MB  |
| 9.6  | 128MB  |

+ https://www.postgresql.jp/document/9.2/html/runtime-config-resource.html
+ https://www.postgresql.jp/document/9.3/html/runtime-config-resource.html
+ https://www.postgresql.jp/document/9.6/html/runtime-config-resource.html

PostgreSQLのドキュメントでは、システムメモリの25%の割り当てが推奨されています。

[19.4. 資源の消費](https://www.postgresql.jp/document/9.6/html/runtime-config-resource.html)

# GitLabでのデフォルト値について
GitLab-CEのソースを検索する限りでは、明示的に設定している箇所は見当たらなかったため、設定値を指定していない場合はデフォルト値で動作しているのではないかという認識です。

omnibus-gitlabでインストールしている場合は、デフォルト値はChefで設定されていて、自動で4分の１程度が割り当てられるようです。

```rb:gitlab-cookbooks/gitlab/attributes/default.rb#L370
if (node['memory']['total'].to_i / 4) > ((node['gitlab']['postgresql']['shmmax'].to_i / 1024) - 2097152)
  # guard against setting shared_buffers > shmmax on hosts with installed RAM > 64GB
  # use 2GB less than shmmax as the default for these large memory machines
  default['gitlab']['postgresql']['shared_buffers'] = "14336MB"
else
  default['gitlab']['postgresql']['shared_buffers'] = "#{(node['memory']['total'].to_i / 4) / (1024)}MB"
end
```

[files/gitlab-cookbooks/gitlab/attributes/default.rb · 9-0-stable · GitLab.org / omnibus-gitlab · GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/9-0-stable/files/gitlab-cookbooks/gitlab/attributes/default.rb#L371)


# 関連
[[Linux] 共有メモリの最大値設定の確認方法 - Qiita](http://qiita.com/koara-local/items/52064bc2517041c66039)

# 参考
[GitLabがメモリ不足で遅いときの対処法 - Qiita](http://qiita.com/lanevok/items/33a694150c8473d9ab48)
[Stray Penguin - Linux Memo (PostgreSQL-5)](http://www.asahi-net.or.jp/~aa4t-nngk/pgsql5.html)
[gitlab 6.6.4 CE のゆるふわセットアップ](http://mojavy.com/blog/2014/03/11/latest-gitlab-setup/)
Rails マイグレーション チートシート

## Migrations methods:
* add_column
* add_index
* change_column
* change_table
* create_table
* drop_table
* remove_column
* remove_index
* rename_column

Basic format
YYYYMMDDHHMMSS_create_products.rb

## Supported types

* :binary
* :boolean
* :date
* :datetime
* :decimal
* :float
* :integer
* :primary_key
* :string
* :text
* :time
* :timestamp
especial type:
* :references

## create_table

### Commands to create migrations

``` 
$ rails generate model Product name:string description:text
$ rails generate migration AddPartNumberToProducts part_number:string
$ rails generate migration RemovePartNumberFromProducts part_number:string
$ rails generate migration AddDetailsToProducts part_number:string price:decimal
```

## change_table
* add_column
* add_index
* add_timestamps
* create_table
* remove_timestamps
* rename_column
* rename_index
* rename_table

## Running Migrations
```
$ rake db:migrate VERSION=20080906120000
$ rake db:rollback
$ rake db:rollback STEP=3
$ rake db:migrate:redo STEP=3
$ rake db:reset  #drop database and recreate it
$ rake db:migrate:up VERSION=20080906120000
```

## Migrations commands
```
rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false).
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n).
rake db:test:prepare    # Rebuild it from scratch according to the specs defined in the development database
```

## more Database commands (rake -T db)
```
rake db:create          # Create the database from config/database.yml for the current Rails.env (use db:create:all to create all dbs in t...
rake db:drop            # Drops the database for the current Rails.env (use db:drop:all to drop all databases)
rake db:fixtures:load   # Load fixtures into the current environment's database.
rake db:schema:dump     # Create a db/schema.rb file that can be portably used against any DB supported by AR
rake db:schema:load     # Load a schema.rb file into the database
rake db:seed            # Load the seed data from db/seeds.rb
rake db:setup           # Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)
rake db:structure:dump  # Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql
rake db:version         # Retrieves the current schema version number
```
postgrsqlで実行されたSQLの実行時間や回数などを記録する

#postgrsqlで実行されたSQLの実行時間や回数などを記録する
スロークエリの記録はpostgresqlにも機能として備わっていますが、流れているSQLの実行時間や回数などを記録できるようcontrib拡張モジュールをインストールしてみます。

##インストール
```lang:
(linux)yum install postgresql-contrib.x86_64
(freebsd)pkg install postgresql-contrib
```
上記のようにyumやpkg使ったりソースからビルドしたりしてインストールしてください。

##postgresql.confの編集

```lang:postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 2000
pg_stat_statements.track = top
pg_stat_statements.save = on
```

|設定値|説明|
|:--|:--|
|pg_stat_statements.max|モジュールで収集する SQL の最大数を指定するパラメータです。 SQL の数がこのパラメータの値を越えた場合には、実行回数の少ない SQL から順番に統計情報が削除されます。
|pg_stat_statements.track|pg_stat_statements モジュールで収集する SQL の種類を指定するパラメータです。 パラメータの値に「top」と指定するとクライアントから直接実行された SQL のみ、「all」を指定すると関数内から間接的に実行された SQL も含めて収集されます。 pg_stat_statements モジュールを無効にするには、このパラメータの値に「none」と指定します。|
|pg_stat_statements.save|pg_stat_statements モジュールが収集した統計情報をデータベースサーバの停止時に保存するかを指定するパラメータです|
|track_activity_query_size |こちらはpg_stat専用ではないですが、記録するSQLの長さを設定します。以上になると...で表現されます。デフォルトは1024byteです。|

##再起動
postgresql.confを編集したので再起動します。

##モジュール有効化
モジュールが使用可能かどうかを確認します。下記のように表示されれば使用可能です。

```lang:psql
$ psql -d hoge -c "select * from pg_available_extensions where name = 'pg_stat_statements'"
        name        | default_version | installed_version |                          comment
--------------------+-----------------+-------------------+-----------------------------------------------------------
 pg_stat_statements | 1.1             |                   | track execution statistics of all SQL statements executed
(1 row)
```

下記コマンドでインストールします。
CREATE EXTENSIONと表示されればOKです。

```lang:psql
$ psql -d hoge
hoge=# CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION
```

インストールできたか確認します。
installed_versionに表示されればOKです。

```lang:psql
$ psql -d hoge -c "select * from pg_available_extensions where name = 'pg_stat_statements'"
        name        | default_version | installed_version |                          comment
--------------------+-----------------+-------------------+-----------------------------------------------------------
 pg_stat_statements | 1.1             | 1.1               | track execution statistics of all SQL statements executed
(1 row)
```

##使用方法
実際に使ってみましょう。幾つかのSQLを実行した後、下記のようにpg_stat_statementsに対してクエリを投げれば実行されたSQLが色々な情報と共に取得できます。
queryやcalls、total_time、rowsあたりをみながら、またはblksなども必要に応じて取得してチューニングすれば良いと思います。

各カラムの意味は
https://www.postgresql.jp/document/9.4/html/pgstatstatements.html

私は下記で遅いSQLを特定して、必要に応じて他のblksなどの情報も表示させます。

```lang:sql
SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
               nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
          FROM pg_stat_statements ORDER BY total_time DESC LIMIT 100;
```

##reset
蓄積された情報を一旦リセットしたい場合は下記でリセットできます。

```lang:
SELECT pg_stat_statements_reset();
```

##アンインストール

アンインストールは下記で行います。

```lang:
DROP EXTENSION pg_stat_statements;
```


参考：http://pgsqldeepdive.blogspot.jp/2012/12/contrib.html
NUCLEO-F401RE で TOPPERS/HRP2(RTOS)を動かす

# はじめに
Windows上でEclipseベースの[TrueSTUDIO](http://timor.atollic.com/truestudio/)を用いて．メモリ保護機能付きのRTOSである[TOPPERS/HRP2カーネル](http://www.toppers.jp/hrp2-kernel.html)(以下，HRP2カーネル)を[NUCLEO-F401RE](http://www.st-japan.co.jp/web/jp/catalog/tools/FM116/SC959/SS1532/LN1847/PF260000)で動作させる方法について説明します．

基本的にはこちらの[記事](http://qiita.com/exshonda/items/bf691541526975b8f78c)のHRP2版です．

HRP2はTOPPERS/EV3RTのRTOSとしても使われています．

# 用意するハードウェア
- [NUCLEO-F401RE](http://www.st-japan.co.jp/web/jp/catalog/tools/FM116/SC959/SS1532/LN1847/PF260000)
 - 秋月電子やスイッチサイエンス等から2000円程度で購入可能です．amazonでポチるのが最も簡単な入手方法です．
 - 様々な種類がリリースされていますが，現状はF401REのみをサポートしています．STM32F4シリーズを搭載しているNUCLEOなら簡単にポーティング可能です．ポーティング方法は別途記載します．
 
- USB(miniB)ケーブル
 - ボードには付属していないので用意して下さい．

- Windows PC
 - Windows7とWindows10で動作を確認しています．

 
#ソフトウェア
- [TrueSTUDIO](http://timor.atollic.com/truestudio/)
 - v7.1.1 で動作確認しています．これより古いバージョンは問題が発生する可能性があります．
 - Atollicの[サイト](http://timor.atollic.com/truestudio/)にアクセスすると**DOWNLOAD NOW!**というボタンがあるので押すとダウンロードが始まります．サイズが1G程度あるので注意して下さい．
 - ダウンロード後インストールして下さい．

- [TOPPERS/HRP2カーネル](http://www.toppers.jp/hrp2-download.html)
 - 上記リンクからhrp2_nucleo_f401re_gcc-20170315.zipをダウンロードして展開して下さい． 

# ビルド&実行の手順

## 1.TrueSTUDIOを実行
TOPPERS/HRP2カーネルに含まれているTrueSTUDIOのプロジェクトファイルをエクスプローラからダブルクリックしてTrueSTUDIOを起動します．

```hrp2_2.2.1\target\nucleo_f401re_gcc\truestudio\asp\.cproject
```

TrueSTUDIOが起動するとワークスペースの指定画面が表示されるため適当なワークスペースを指定する．.cprojectのフォルダの一つ上のフォルダを指定すると管理が楽です．.cprojectと同じフォルダは指定しないで下さい．

![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/3f3a9761-2396-a62a-4f28-2b2ef268d116.jpeg)

3秒ほど宣伝画面が出るので"ウィンドウを閉じて下さい"のボタンが有効になるまで待って，有効になったらボタンを押して下さい．

左上のInformation Centerの右の×ボタンを押すとプロジェクトが表示されます．

左のペインのプロジェクトビューからsample1を選択し，ツリーを展開するとサンプルプログラムを見ることができます．

![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/8a122313-1826-e191-643d-b4dd60a23c0d.jpeg)


## 2.ビルド
ビルドボタンを押すとビルドが開始されます．
![truestudio3jpg.jpg](https://qiita-image-store.s3.amazonaws.com/0/106870/20e4e37a-a051-2826-5566-ed77c38843c1.jpeg)

## 3.ボードの接続
NUCLEO-F401REをUSBケーブルでwindowsPCに接続して下さい．ドライバのインストールが開始され，COMポートが１つ追加されます．

## 4.ダウンロード&実行
ボードの接続後，プロジェクトにあるhrp2_debug.launchを右クリックしてデバッグ->hrp2_debugを選択するとダウンロードが開始されます．

![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/c6d78e88-dcdd-e194-db3b-1f9dcdec173c.jpeg)


1回目はSTLINKのファームウェアのアップデートが発生する場合があります．その場合は，画面に従ってファームウェアをアップデートしてから，USBケーブルを一旦外してから，Teratermの再接続を行い，デバッグボタンを押して下さい．

次に上記で追加されたポートに対して，ターミナルを開きます．メニューのビューからターミナルを選択します．左下ペインにターミナルが追加されるので，接続ボタンを押して，接続タイプをシリアルとして，115200bps, 8bit, Parity none, Stop 1bit, フロー制御なしとてしてOKを押します．


![hrp2.jpg](https://qiita-image-store.s3.amazonaws.com/0/106870/2de1726e-fde1-a41c-5a63-a9c9d1aec20b.jpeg)

ダウンロード後停止した状態なので，メニューから"再開"ボタンを押すとカーネルが起動して，main_taskの先頭で停止します．この状態で"再開"ボタンを押すと実行が再開されます．

ターミナルにはログが出力されます．入力も可能です．

![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/2c0bcbd5-0b0a-61cf-f3dd-db67df268652.jpeg)


# おわりに
TrueSTUDIOを使用すると簡単にHRP2カーネルをビルド&実行させることが出来ますので，メモリ保護RTOSに興味がある方は試して下さい．