OmniAICreator/Qiita-1.07M huggingface dataset:
微分フィルタで画像のエッジ抽出

画像中の明るさが急に変化する部分を抽出するのがエッジ抽出。
連続した値の場合であれば、微分によって抽出したい部分の接線を求めてその傾きから変化の具合を読み取ることができる。画像の場合は連続値ではないため、画素値間の差をとることで微分の近似として扱う。

## 1次微分フィルタ
エッジを抽出する微分フィルタの基本は以下のようなもの

```math

\left(
\begin{matrix}
0 & 0 & 0 \\
0 & -1& 1 \\
0 & 0 & 0
\end{matrix}
\right)
,  
\left(
\begin{matrix}
0 & 0 & 0 \\
-1 & 1& 0 \\
0 & 0 & 0
\end{matrix}
\right)
```

注目画素とその左隣との左隣との差を取るか、右隣との差を取るかでちょっと変わってくる。また、左右両方の平均値をとってそれを微分の値とするという流派もあるみたい。こっちのほうが左右の画素値の変化の傾きをとっているというのが分かりやすいかもしれない。計算しやすさを求めて -1/2の要素を-1に、1/2の要素を1にとるものもある。ただしその時に出てきた微分の値は2倍になる。

```math
\left(
\begin{matrix}
0 & 0 & 0 \\
-1/2 & 0& 1/2 \\
0 & 0 & 0
\end{matrix}
\right)
```

これらのフィルタは左右の画素値から微分値を求めていたので、横方向の微分値だけが出てくる。画素値をプロットしてエッジを見えるようにすると、エッジは縦方向のもののみがでてくることになる。横方向のエッジを抽出したいのであれば、縦方向の微分値が必要になるため、縦方向の微分を求められる以下のようなフィルタを使うことになる。

```math

\left(
\begin{matrix}
0 & 0 & 0 \\
0 & -1& 0 \\
0 & 1 & 0
\end{matrix}
\right)
,  
\left(
\begin{matrix}
0 & -1 & 0 \\
0 & 1& 0 \\
0 & 0 & 0
\end{matrix}
\right)
,  
\left(
\begin{matrix}
0 & -1/2 & 0 \\
0 & 0& 0 \\
0 & 1/2 & 0
\end{matrix}
\right)
```

## Prewittフィルタ

じゃあこの行列を使えばオールオッケーかと言うとそうでもない。上の微分フィルタだと、画像に含まれるノイズもそのまま明るさの急な変化として抽出されてしまう。なので、ノイズを低減しながらエッジを抽出するといううまい方法がないといけない。そのために作られたのがPrewittフィルタ。
横方向の微分値を求めれば、縦方向のエッジが抽出できる。なので縦方向に平滑化を施してノイズを低減してその後に微分をする。

```math

\left(
\begin{matrix}
1 \\
1 \\
1
\end{matrix}
\right) 
\left(
\begin{matrix}
-1 & 0 & 1
\end{matrix}
\right)
 =  
\left(
\begin{matrix}
-1 & 0 & 1 \\
-1 & 0 & 1 \\
-1 & 0 & 1
\end{matrix}
\right)
```

https://en.wikipedia.org/wiki/Prewitt_operator

縦方向の場合はこれらの値を転置したものを使う。
ぼかしを微分を1つの行列に詰め込んでやる必要はあるのか？確かに1つの行列に詰め込んだほうが簡単で良さそうだけど、別々にしたって良いんじゃないのか？という疑問もあるけどそこら辺はこちらを参照。
http://nodamushi.hatenablog.com/entry/20140102/1388669333

## Sobelフィルタ
Prewittフィルタに中央に重みをつけた上での平均化を行ったのがSobelフィルタ

```math

\left(
\begin{matrix}
1 \\
2 \\
1
\end{matrix}
\right) 
\left(
\begin{matrix}
-1 & 0 & 1
\end{matrix}
\right)
 =  
\left(
\begin{matrix}
-1 & 0 & 1 \\
-2 & 0 & 2 \\
-1 & 0 & 1
\end{matrix}
\right)
```

重み付けをしているあたりはSobelフィルタのほうがPrewittフィルタよりも精度が高そうな感じがする。OpenCVにもSobelフィルタの関数しかないあたり実際そうなんだろうけど、それが果たしてどれくらいなのかは不明。

## ラプラシアンフィルタ
微分の微分をとれば2次微分になってさらに詳しい変化の情報が得られる。PrewittフィルタやSobelフィルタは左右の画素値の差分をとっていたので1次微分になるわけなので、微分の微分をとるなら差分の差分をとることで近似できることになる。

一番最初に出てきた微分フィルタ同士の差を取れば差分の差分をとることになって2次微分フィルタが出来上がる。

```math
\left(
\begin{matrix}
0 & 0 & 0 \\
1 & -1 & 0 \\
0 & 0& 0
\end{matrix}
\right)
- 
\left(
\begin{matrix}
0 & 0 & 0 \\
0 & 1 & -1 \\
0 & 0 & 0
\end{matrix}
\right) 

\equiv
\left(
\begin{matrix}
0 & 0 & 0 \\
1 & -2 & 1 \\
0 & 0 & 0
\end{matrix}
\right)
```

さらにラプラシアンを考えれば、ラプラシアンは

```math
  \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}
```
で表せるので、x方向の2次微分とy方向の2次微分を足し合わせればいいことになる。なので上の2次微分のフィルタをあわせて以下のようになる。ラプラシアンはよく分かってないけどなんかこうなるらしい…

```math
\left(
\begin{matrix}
0 & 1 & 0 \\
1 & -4 & 1 \\
0 & 1 & 0
\end{matrix}
\right)
```

参考：ラプラシアンフィルタとSobelフィルタ（とその他のフィルタ）の違い。
https://www.researchgate.net/post/What_are_the_differences_in_first_order_derivative_edge_detection_algorithms_and_second_order_edge_detection_algorithms
Bluemix：「SecureGateway」と「Liftで使うSlingshot」をLinuxへインストール

Bluemix Liftを使うときは、オンプレとクラウドの間の踏み台になる環境が必要です。
一番最初に試したとき（以下記事を書いた時）はMacを使いましたが、本格的に使うならLinuxサーバですよねってことで試したときのメモ。
ちなみにrhel6.5です。

http://qiita.com/azzeten/items/c58ab2b1f0fa2b5ea877

## LinuxへSecureGateway

### ダウンロード
一番したのRHELのものをダウンロード
この自体はSecureGatewayの管理画面からいけます。
![スクリーンショット 2016-11-19 21.23.28.png](https://qiita-image-store.s3.amazonaws.com/0/119378/93078552-b5ee-d014-b663-4ae63f8d3a9e.png)


### インストール
インストーラを実行してyesとかで進め続ければいけます。
/opt/ibm/securegatewayにインストールしました。

```console
# rpm -ivfh ibm-securegateway-client-1.6.0+client_x86_64.rpm
準備中...（あとは自動で任せる）
```

###実行

起動するときにSecuregatewayのIDとtokenを引数に入れてあげる必要があります！
あとコマンドも違うし、実行するディレクトリもMacとは違うので注意です。
以下サンプルです。

```console:
# pwd
/opt/ibm/securegateway/client

# su - secgwadmin

# node lib/secgwclient.js bA9hogehoge(securegatewayのID) --t eyJhhogehogeho（ここにtoken)
IBM Bluemix Secure Gateway Client Version 1.6.0
（中略）
<press enter for the command line>
```


## Linux へ Slingshot

### ダウンロード
ピンクのアイコンからダウンロード。その下に書いてあるtokenもお忘れなく・・・
![スクリーンショット 2016-11-19 21.25.46.png](https://qiita-image-store.s3.amazonaws.com/0/119378/87509ad4-2b65-d419-92ec-6bdf1c4e8ff7.png)


### インストール

```console
# ./bluemix-lift-slingshot-setup-linux.bin
```

あとはウィザードに従って頑張る（CLIにひたすら色々出てきます）
/opt/IBMBluemixLiftSlingshot　にインストールしました。

### 実行

起動は引数にstart、停止はstop、再起動はrestart（これはMacと一緒です）

```console
# pwd
/opt/IBMBluemixLiftSlingshot/bin

# ./slingshot.sh start
```

ログは、/opt/IBMBluemixLiftSlingshot/extract/liftLog　に出力されます。

## 参考
https://developer.ibm.com/clouddataservices/docs/lift/get-started/set-up-secure-gateway/
PhoneGapアプリのパフォーマンスを改善する10のポイント

いちおうやってるつもりだけど、いつか改めて見たときに何か違う事を感じるかもしれないので、メモ
http://news.mynavi.jp/articles/2013/05/20/am2013pg/


こっちの方がへーと思った
http://blog.asial.co.jp/1142
Visual Studio Team Servicesを使い始める

# 本記事について
Visual Studio Team Servicesで、開発をラクに進める為の準備をメモったー

## ゴール
Microsoftアカウントを使って、Visual Studio Team Servicesにサインインできる

# 準備
1. Microsoft アカウントを登録する
  * 説明 : Visual Studio Team Servicesを利用する為には、Microsoftアカウントを作成、登録する必要があります。Microsoftアカウントには、次の2種類のメールアドレスが使える。詳細な手順は、参考情報を確認してください
     * 普段使用している電子メール アドレス
     * 新しく作成したメール アドレス
  * 参考情報 : [Microsoft アカウント登録手続き｜Microsoft アカウント](https://www.microsoft.com/ja-jp/msaccount/signup/default.aspx)
1. https://my.visualstudio.com/ を開き、1で登録したMicrosoftアカウントをVisual Studio Team Servicesに関連付ける。詳細な手順は、参考情報にある画像を見ながら、ポチポチと
  * 参考情報 : [Sign up for Visual Studio Team Services | Visual Studio Team Services](https://www.visualstudio.com/en-us/docs/setup-admin/team-services/sign-up-for-visual-studio-team-services)

# 普段使う時は
https://{作成したVisual Studio Team Servicesのアカウント}.visualstudio.com/ から自分のVisual Studio Team Serviceのプロジェクトを開きましょう
mkisofsでブート可能なWindowsインストールISOを再作成する

dism等でWindowsインストールイメージにパッチ当てする場合は、一度ISOをファイルシステム上に展開する必要がありますが、
そこから再度ISOファイルを構築する手順は割と面倒で、ブートパラメータ等の資料も乏しいため備忘録的に作成。
なお、本稿は仮想マシンへのインストール、またはあえてDVDからインストールしたい猛者向けです。
実機インストールなら、USBメモリ上に展開しパッチを当てそれから直接ブートしたほうが手っ取り早いです多分。

#準備
Windows上で構築するなら、Windows用にビルドされたmkisofs.exe(と必須ライブラリ)が必要です。
mkisofsのバージョンが古いと
`mkisofs: Implementation botch: FS should end at 4294295164 but ends at XXXXX.`
とかいう謎のエラーでiso作成に失敗するかもしれません。
今回はこちらのツールに含まれるmkisofs.exeを使わせて頂きました。
http://cdrtfe.sourceforge.net/cdrtfe/index_en.html

mkisofs.exeを入手したら、適度に%PATH%を通すか、直接実行ファイルを指定してください。
ちなみにブートイメージはWindowsディスクに含まれてるのでCD-ROMから抜き取ったりする必要はないようです。
以前は知らずにImgBurnを使って抜き取っていました:frowning2:
#コマンド
Windows ISO を展開したフォルダから実行することを想定してます。他の場所で実行する場合は適度に変更してください。
末尾の"."はカレントフォルダという意味ですので忘れないでください。
###BIOSブートのみ対応
```
mkisofs -iso-level 4 -udf -R -D -U -b boot/etfsboot.com -no-emul-boot -boot-load-size 8 -boot-load-seg 1984 -o <output.iso> .
```
###BIOS/UEFIブート両対応
```
mkisofs -iso-level 4 -udf -R -D -U -b boot/etfsboot.com -no-emul-boot -boot-load-size 8 -boot-load-seg 1984 -eltorito-alt-boot -b efi/microsoft/boot/efisys.bin -no-emul-boot -o <output.iso> .
```
#パラメーター解説
**-b** ブートイメージファイルの指定。Windows環境で作成する場合でも、パス区切りは\ではなく/を使わないとエラーか警告になると思われます。
**-no-emul-boot** 非エミュレーションイメージを指定。イメージ毎に決まってるようですのでこれを指定。
**-boot-load-size** ブートイメージのサイズ。ファイルサイズをセクタサイズ512で割った値（要はセクタを占める数）を指定するようです。無くても動くっぽい。
**-boot-load-seg** ブートイメージのロードセグメントアドレスを指定。イメージ毎に決まってるようですのでこれを指定。無くても動くっぽい。
**-eltorito-alt-boot** 2番目以降のブートイメージを指定する。

boot/etfsboot.comは、BIOSブート用のブートイメージ、同様にefi/microsoft/boot/efisys.binはUEFIブートイメージで、両方共Windowsインストールディスクに含まれています。
なおWindows 7のx64版DVD-ROMには何故かUEFIイメージが含まれていません。wimなどから抽出して統合すると使えるようですが…

その他のパラメータは[man mkisofs](http://www.ioss.jp/sohodiy/mkisofs8v2.php)を参考にしてください。:sweat:

#バッチファイル
次のバッチファイルを作り、引数にWindows ISOを展開したフォルダを指定して実行すれば一発生成できると思われます。
ISOファイルは展開フォルダが有る場所に.iso拡張子を付加したものが生成されます。
UEFIイメージが無い32bit版でも対応できるよう、ブートイメージの有無で生成されるISOの仕様が変わるようにしてあります。

```bat:makewiniso.bat
@echo on

set IMGSRC=%~f1

if not exist "%IMGSRC%\setup.exe" ECHO usage:%~n0 [imagedir] & pause & goto :eof

set BIOSIMG=boot/etfsboot.com
set EFIIMG=efi/microsoft/boot/efisys.bin

if not exist "%IMGSRC%/%BIOSIMG%" echo Not found bootimage & goto :eof
set BOOTOPT=-b "%BIOSIMG%" -no-emul-boot -boot-load-size 8 -boot-load-seg 1984
if exist "%IMGSRC%/%EFIIMG%" set BOOTOPT=%BOOTOPT% -eltorito-alt-boot -b "%EFIIMG%" -no-emul-boot

mkisofs -iso-level 4 -udf -R -D -U -V "%~n0" %BOOTOPT% -o "%IMGSRC%.iso" "%IMGSRC%"
```
#参考サイト
http://hrn25.sakura.ne.jp/win/mkiso/mkiso.html
http://www.ioss.jp/sohodiy/mkisofs8v2.php
ubuntu16でNVIDIAのドライバインストールでハマった時

## 問題現象
Ubuntu16.04でnvidiaのグラボのドライバをインストールしても認識されない。

## 原因の候補とその対処

* Ubuntu16で採用されてる新しいlinuxカーネル（正確にいうと4.4.0-20以降）では、コンピュータのBIOS/UEFIのレベルでセキュアブートが有効になっているとそのポリシーをカーネルが引き継いで署名なしのドライバをロードしないようになってしまったので、
  * カーネルのほうで、署名なしドライバを読み込めるように設定を変える。 → （＊）[こちら](http://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules)  （UEFIからローダ画面に移る際にモードを選択する画面が出るようになる）
  * BIOS/UEFIでセキュアブートを無効化する → これだとWinとのデュアルブート構成のような場合にWinのほうもロードできなくなったりするらしいので筆者は非推奨。やりかたはファームウェア（マザボ）ごとに違うのでググってください。

* UbuntuはNVIDIAとは別にnouveauというX.orgが開発したドライバが使われてたりするので、それを無効化したりする → [参考](http://qiita.com/daikumatan/items/26039fc23edabf76a9c4#2-nvidia-ドライバーのインストール)


## 筆者の場合は

色々やって、上記の（＊）で一発解決しました。それでもダメならセキュアブートの無効化やnouveauの無効化を試して見るべきかもしれません。

ドライバ関連でハマると時間を浪費してストレスも溜まりますよね。本質的な問題に集中したいものです。

## （追記）unity+lightdmでログイン画面がループするとき

* unity-tweak-tool --reset-unity でunityの設定をリセットする → [参考](https://cpplover.blogspot.jp/2014/07/ubuntu-1404unity.html)
* さらにツールバーとかが消えてしまってたら dconf reset -f /org/compiz/ → [参考](https://m12i.hatenablog.com/entry/2014/05/24/100539)
GitHub PagesのUser Pagesでドキュメントルートを変更するにはmasterを殺す

# TL;DR

GitHub PagesのUser Pages(`#{username}.github.io`とかになるやつ)はリポジトリ直下がドキュメントルートになる。

サブディレクトリ(`/docs`とか)をドキュメントルートにするには…

- `master`から別のブランチ(例:`source`)を作ってリモートにpushしておく
    - `git push origin source`
- リポジトリの`Settings`->`Branches`->`Default Branches`を`source`に変更する
<img width="655" alt="Branches.png" src="https://qiita-image-store.s3.amazonaws.com/0/1994/8728437f-4547-68ac-21b4-d3f6753b0b21.png">
- `master`ブランチをリモートから削除する
    - `git push -f --delete origin master`
- ドキュメントルートにしたいディレクトリ(例 : `/docs`）をsubtreeとして`master`という名前でpushする
    - `git subtree push --prefix docs/ origin master`

これで`http(s)://#{username}.github.io`にアクセスすると`/docs/index.html`が表示される。

# 参考資料

- https://help.github.com/articles/user-organization-and-project-pages/

GitHub PagesにはUser & Organization PagesとProject Pagesの2種類がある。Project Pagesは`gh-pages`というブランチか`/docs`以下をドキュメントルートにする「Source」という設定ができたのだが、User & Organization Pagesでは`master`のルート直下しか選べない。

- http://qiita.com/mizchi/items/17e2eb04c34b18aff921

「Source」が設定できるようになる前は`gh-pages`というブランチを用意するしかなかったのだが、これもルート直下がドキュメントルートになってしまう。`master`の`/docs`をsubtreeとしてpushする、というテクニックが以前から使われていたので、それを`master`として使ってみたというわけ。
webサーバーに対する負荷分散　DNSラウンドロビンとロードバランサ

#webサーバーに対する負荷分散とは
webサーバーが複数ある場合、1つのサーバーに負荷が集中しないように分散させる仕組みのことである。
(負荷分散や故障などに備えてwebサイトでは複数のwebサーバーを使用していることが多い。)

また、負荷を分散させることをロードバランスやロードバランシングと呼ぶことが多い。

#DNSラウンドロビン
1つのドメインに対して複数のIPアドレスを割り当てることにより、各IPアドレスに対して順番に処理していく負荷分散技術。
(ラウンドロビンとは「何かの役割・出番をたくさんの物事・人員で交替しあう」という意味である。)

##処理方法
例えばwebサーバーがA,B,Cの3台あるとすると、ドメインに対するアクセスをA⇨B⇨C⇨A⇨B⇨Cのように順番に処理をしていく。

##メリット
- 手軽さ<br>
DNSサーバのゾーンファイルで設定することができるためコストが低い。

###ゾーンファイルとは
DNSの設定ファイルの一つであり、ネームサーバの管理する範囲をゾーンと呼ぶ。
ゾーンファイルの管理情報を変更することでDNSラウンドロビンの設定を行うことができる。

##デメリット
- 効率性<br>
Aサーバーの負荷が高く、Bサーバーの負荷が低い場合でも同じようにA⇨B⇨Cと順番に処理を行っていくことになるため、必ずしも効率が良いとは言えない。
- 障害への対応<br>
Cサーバーが故障していたとしてもそれを検知することはできず、A⇨B⇨Cと順番に処理を行ってしまう。
- 継続性<br>
同じクライアントからの接続を同じサーバーに継続したいと思ってもやはりA⇨B⇨Cと処理を行うため、継続して同じサーバーを使用させるということができない。

#ロードバランサ
ロードバランスをするための装置であり、負荷分散装置などと呼ばれる。
DNSラウンドロビンは**負荷分散技術**であるが、ロードバランサは**負荷分散装置**。
概要としては同じようにシステムにかかる負荷を複数のサーバーに分散させることにより、処理のバランスをとることができることである。

##メリット
DNSラウンドロビンのデメリットがロードバランサーだとできるところ。
A⇨B⇨Cと順番に処理をするのではなく、サーバーの中で一番負荷の少ないサーバーへ処理をしてくれる。
また、Webサーバが正常に稼働しているか否かを常にチェックしているため、障害のあるサーバーへ処理を割り振ることもない。

##デメリット
- コストが高い<br>
「ロードバランサー　価格」で検索し、最初に出てくるページを見てみると、安いもので70万円・高いもので何百万円・・・
32bitOSから64bitOSに切り替えたときにバグが発現したお話

オンプレミスからクラウドに移行したときにOSのビット数が変わったことによって（元々よろしくない実装をしていたものの）バグが発現したお話です。
そういう移行作業をする予定がない、PHPの``array_merge``の挙動に自信がある人、配列のキー（添字）の挙動に自信のある人は本記事を読む必要はないと思います。

# PHPにおけるarray_mergeの仕様
[PHP: array_merge - Manual](http://php.net/manual/ja/function.array-merge.php)
> 入力配列の中にある数値添字要素の添字の数値は、 結果の配列ではゼロから始まる連続した数値に置き換えられます。


```php:挙動確認用コード
<?php
$data1 = array(100 => 'hoge', 300 => 'fuga');
$data2 = array(200 => 'bar', 400 => 'piyo');
var_dump(array_merge($data1, $data2));
# array(4) {
#   [0]=>
#   string(4) "hoge"
#   [1]=>
#   string(4) "fuga"
#   [2]=>
#   string(3) "bar"
#   [3]=>
#   string(4) "piyo"
# }
# キーが数値だったので0から振り直されている
```

# 配列のキーの仕様
[PHP: 配列 - Manual](http://php.net/manual/ja/language.types.array.php)
> ``key`` は、整数 または 文字列です。

> integer として妥当な形式の文字列は integer 型にキャストされます。

```php:挙動確認用コード
<?php
$data = ['50' => 'hoge'];
var_dump(gettype(array_keys($data)[0]));
# string(7) "integer"
# '50'はintegerにキャストできるのでintegerになっています
```

# バグの再現
勘の良い人はもう気付いたかもしれませんね。
キャスト、ビット数、array_merge…

以下のコードは**PHP4系でも動くように**しています。

```php:sample.php(問題のあったコードの再現例)
<?php
# データを一意に特定するためのIDを配列で保持
$requestTargetIds = array('12345678901234', '98765432109876');

# 上記の配列を引数に、異なる2つのデータリソースから配列を取得した
# その配列のキーがID、というデータ形式だった
$data1 = getData1($requestTargetIds); # array('98765432109876' => 'data1');
$data2 = getData2($requestTargetIds); # array('12345678901234' => 'data2');

# merge
$result = array_merge($data1, $data2);

# 元のデータの順に並び替えたかったのか、foreachでソートしようとしてた
$sortedResult = array();
foreach ($requestTargetIds as $id) {
	if (isset($result[$id])) {
	    $sortedResult[] = $result[$id];
	}
}
var_dump($sortedResult);
```
※再現例なので変なところもあるかもしれませんが目をつぶってください。

実行結果です。

```shell-session:result@32bit
$ uname -m
i686
$ php sample.php
array(2) {
  [0]=>
  string(5) "data2"
  [1]=>
  string(5) "data1"
}
```

```shell-session:result@64bit
$ uname -m
x86_64
$ php sample.php
array(0) {
}
```

**はい、つらい**:joy:

# まとめ
[PHP: 整数 - Manual](http://php.net/manual/ja/language.types.integer.php)
> 整数のサイズはプラットフォームに依存しますが、 約 20 億 (32 ビット符号付) が一般的な値です。 64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。 

キーが32bitだとintegerの範囲内に収まらないため、キャストされず文字列として扱われるためarray_mergeしても問題がありませんでした。
しかし64bit環境になったことでintegerの範囲内に収まってしまい、キャストされてarray_mergeをしたときにキーが振り直され、foreach内の処理に引っかからなくなった…
というものです。

薄々お気づきかもしれませんが、元々の実装がPHP4時代に記述されたかなりレガシーなコードで、かつ危険な実装をしていました。
それを諸々の事情でオンプレミスからクラウドに移行したタイミングでビット数が変わり発現した形になったのです。

まだ32bitで動いているサーバをお持ちの方は、こんな危険な実装をしていないか、一度ご確認いただければと思います:innocent:
WebLogicの管理サーバーにカスタム証明書を導入したら、ノードマネージャに接続できなくなった時の対処方法

WebLogicの管理サーバーに署名済み証明書を導入する際、キーストアを、`デモ・アイデンティティとデモ信頼`から、`カスタム・アイデンティティとカスタム信頼`に変更すると思います。

![custom.png](https://qiita-image-store.s3.amazonaws.com/0/10290/b7ebc18b-c2b0-1f21-3ec4-41a50f5edf7b.png)

この設定をアクティブ化した後、ノードマネージャを使ってWebLogicサーバーを起動しようとすると、`サーバーXXXでは、マシンXXXに関連付けられているノード・マネージャにアクセスできません。`というエラーが表示され、起動できません。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/10290/422bf139-6c3b-d458-77bb-c28d61fbfb50.png)

ここでノードマネージャの接続タイプを`プレーン`に設定して回避している例をネットで見かけますが、せっかく署名済み証明書を導入したのですから、それを使ってSSLで通信させるようにしてみましょう。

まず、管理サーバーの構成画面で設定したキーストア／秘密鍵は、管理コンソールへのアクセスだけに使われるのではありません。管理サーバーとノードマネージャの間の通信にも使われます。

管理コンソールでWebLogicサーバーの起動操作をすると、管理サーバーは、起動対象サーバーを受け持つノードマネージャに起動指示を出します。下の図のように、SSLを利用している場合(「マシン」設定でタイプにSSLを指定している場合)、管理サーバーは、管理サーバーの構成画面で設定したキーストア／秘密鍵を使用して、ノードマネージャとSSLで通信しようとします。

![mosikizu.png](https://qiita-image-store.s3.amazonaws.com/0/10290/1f6013d5-312f-c32e-9dc5-eff04360e9b0.png)

一方、ノードマネージャは、デフォルトでWebLogicのデモ証明書を使用してSSL通信します。管理サーバーがデモ証明書であった頃は、両方ともデモ証明書でしたから、問題なく通信できていました。しかし、管理サーバーがカスタム証明書を使用するようになった今、デモ証明書のままでは、証明書が異なることになり、接続できません。このため、`サーバーXXXでは、マシンXXXに関連付けられているノードマネージャにアクセスできません。`というエラーになります。

この現象を回避するには、管理サーバーで使用する証明書と同じものを、ノードマネージャでも使用させる必要があります。ノードマネージャのキーストア／秘密鍵は、どこで設定するのでしょうか？`nodemanager.properties`です。最低でも、5つの行を追加する必要があります。

```properties:nodemanager.properties
KeyStores=CustomIdentityAndCustomTrust
CustomIdentityKeyStoreFileName=カスタム・アイデンティティ・キーストアのフルパス
CustomIdentityKeyStorePassPhrase=カスタム・アイデンティティ・キーストアのパスフレーズ
CustomIdentityAlias=秘密鍵の別名
CustomIdentityPrivateKeyPassPhrase=秘密鍵のパスフレーズ
```

編集が終わったら、ノードマネージャを再起動しましょう。管理対象サーバーが起動できるようになるはずです。

ちなみに、管理対象サーバーのほうにはSSLを指定しなくても起動できてしまいます。なぜでしょうか？ノードマネージャは、基本的に、管理対象サーバーのプロセスを作成するだけです。一旦管理対象サーバーが起動すれば、あとは管理サーバーと管理対象サーバーが直接連携します。この連携で使用する通信は、SSLではなく、平文です。

サーバー間の通信もSSLにするには、ドメインの構成画面で管理ポートを有効化する必要があります。サーバー間のSSL通信は、それぞれのサーバーの構成画面で設定したキーストア／秘密鍵を使って行われます。ドメインに含まれる全てのサーバーでSSLが有効化されていないと、管理ポートの有効化ができないのは、このような背景があります。

![kanriport.png](https://qiita-image-store.s3.amazonaws.com/0/10290/6db18688-40f0-53e3-91bb-348f32ea0a12.png)

マニュアルなどを読んでも分かりづらかったので、書いてみました。お役に立てば幸いです。
Ruby の <=> 演算子が返す値を覚える方法

Ruby の `<=>` 演算子（宇宙船演算子）が返す値を覚える方法をメモっとく。Comparable を実装するときに悩むよね。

# メソッドとして考えてみる

`<=>` 演算子といってもメソッドなので左辺のオブジェクトがレシーバーになる。メソッドが実装されているレシーバー側を主体として考えるとわかりやすい。レシーバー側が大きければ正数、レシーバー側が小さければ負数である。レシーバー側と等しければ `0`、レシーバー側と比較できなければ `nil` である。

```rb
10 <=> 20   #  -1
20 <=> 10   #   1
20 <=> 20   #   0
20 <=> '20' # nil
```

<=> 演算子を実装するレシーバー側として、自分が大きかったらプラスを返して、自分が小さかったらマイナスを返すっていう感覚は覚えやすいんではないかと。

# `-` 演算子として考えてみる

@takumiabe さんのコメントより。

変数 `a` と変数 `b` を数値と考えると `a <=> b` の計算結果の符号は `a - b` の計算結果の符号と一致する。なお、等しい場合はどちらも `0` になる。

```rb
10 <=> 20   #  -1
10  -  20   # -10
20 <=> 10   #   1
20  -  10   #  10
20 <=> 20   #   0
20  -  20   #   0
20 <=> '20' # nil
20  -  '20' # TypeError: String can't be coerced into Fixnum
```

# 数直線として考えてみる

@taram さんのコメントより。

`<=>` 演算子を構成する3文字 `<`、`=`、`>` を数直線に配置する。与えられた左辺と右辺について成立する `<`、`=`、`>` いずれかの演算子に対応する数値が `<=>` 演算子の結果になる。

```text
   -1    0    1
----|----|----|----
    <    =    >
```

# 参考文献

https://docs.ruby-lang.org/ja/latest/class/Comparable.html
Reactで子コンポーネントから親コンポーネントのメソッドを呼び出す。

最近reactを始めて、コンポーネント間でのメソッドの共有だったりが
ようやくできるようになってきましたので、備忘録的に。
※本当の本当に初歩的な内容になります。

##子から親コンポーネントのメソッドを呼び出す。
便宜上一枚のjsファイルですが、実際は分かれてます。

```js:index.js
class Parent extends Component {

 shoutParent(){
   console.log('親だよ！！！');
 }

 render() {
  return (
    <Child parentMethod={this.shoutParent} />
  );
 }
}

class Child extends Component {

 render() {
  return (
    <button onClick={this.props.parentMethod}>
      押しまっせ
    </button>
  );
 }
}
```

constructorなどは省略して最低限にしてます。

###①子コンポーネントにpropsとしてmethodを渡す。
Reactでは、
`<コンポーネント名 />`
といった形で、コンポーネントをレンダリングします。
レンダリングとは、ざっくりといえばviewに表示することです。

一つのコンポーネントはそれぞれstate（状態）を持っており、
`setState()` 関数によって更新されると、その度に再レンダリングされます。
（この辺は別の記事で書きたいと思います。）

このようにレンダリングすると、二つのコンポーネントに親子関係ができます。
この例だと、
”Parent”というコンポーネントの中で、
"Child"というコンポーネントをレンダリングしているので、

 - Parentコンポーネントが親
 - Childコンポーネントが子
 
ということになります。

そして親コンポーネントは子コンポーネントにpropsとして関数や値を渡すことができます。
ちなみにpropsは一度レンダリングされると変更できません。
参考:[facecook公式document](https://facebook.github.io/react/docs/components-and-props.html#props-are-read-only)

今回は、propsの中にparentMethodというキーをセットし、
値を this.shoutParent としました。

####thisとは
このthisはコンテキストと呼ばれ、reactとは関係ないのですが、
理解すると非常に便利でjavascript中級者になれます。
（初心者の内容だとメンターに言われました。笑）
なので別の記事で詳しく書きたいと思います。
更新予定です(2016/11/26)

ここで簡単に説明すると、thisとはParentコンポーネントのことです。

つまりこれでchildコンポーネントのpropsの中に
`props = {
  parentMethod: Parent.shoutParent
}`
という値がセットされました。

###②子コンポーネントからpropsに入っているmethodを呼び出す
あとは簡単で、なんらかのイベントで
this.props.parentMethod
を呼び出すだけです。

今回はonClickで呼び出しました。

注意点としてはこのthisは**Childコンポーネント**のことですので注意してください。
その名前の通りコンテキスト（文脈）によってとる値が変わるのがthisです。

###③注意点
本来はChildコンポーネントとParentコンポーネントは別ファイルですので、
Childコンポーネントの方でimportを使ってParentを取り込まなければなりません。
書き方はこのような感じです。

```js:child.js
import {Parent} from 'ここにpathを書く';
```

これをページ上部に追加しましょう。


##疑問
###①逆に親のメソッド呼び出したい場合はどうしたらいいの？
すこしトリッキーな挙動になりますがこちらの記事を参照ください。
###②thisってなんなの？よくわからない！
更新予定です(2016/11/26)
コマンドラインでJSONデータを扱う

# jqコマンドのインストール
MacOSX環境の場合、HomeBrew経由で簡単にインストールすることができます。

```zsh
% brew install jq
```

# JSONデータの整形
echoコマンドを使って簡易的なJSONを出力し、jqコマンドに渡してみます。

```zsh
% echo '{"key":"value"}' | jq .
{
  "key": "value"
}
```

正常にパースされ、整形された状態で出力されました。
続いて、壊れたJSONデータを渡してみます。

```zsh
% echo '{"key":value}' | jq .
parse error: Invalid numeric literal at line 1, column 13
```
パースエラーが表示されました。

# 特定ノードの抽出
下記サイトからJSONのサンプルデータを拝借することにします。
http://json.org/example.html

```json:example.json
{
    "glossary": {
        "title": "example glossary",
		"GlossDiv": {
            "title": "S",
			"GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
					"SortAs": "SGML",
					"GlossTerm": "Standard Generalized Markup Language",
					"Acronym": "SGML",
					"Abbrev": "ISO 8879:1986",
					"GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
						"GlossSeeAlso": ["GML", "XML"]
                    },
					"GlossSee": "markup"
                }
            }
        }
    }
}
```

### titleノードの値を抽出

"."がルートノードを表し、続けてノード名を指定することができます。

```zsh
% cat example.json | jq .glossary.title
"example glossary"
```

指定したノードの値が取り出せました。"-r"オプションを指定することでダブルクオートを除去することができます。

```zsh
% cat example.json | jq -r .glossary.title
example glossary
```

### 配列から値を検索
サンプルデータの"GlossSeeAlso"ノードは配列になっています。ここから"XML"の値だけ取り出してみることにします。

```zsh
% cat example.json | jq '.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[] | select(. == "XML")'
"XML"
```

jqコマンドにはいくつかの組み込みフィルタが内蔵しており、"select"のように条件で絞り込むことや演算をおこなうこともできます。

# 参考
[jq Manual (development version)](https://stedolan.github.io/jq/manual/)
[jq コマンドを使う日常のご紹介](http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)
Dagger2の@Bindsの使い方

Daggerを使う時、以下のようなコードをよく書くかと思います。

```java
public interface IRepository {
    Item fetch();
}
```

```java
public class RepositoryImpl implements IRepository {
    @Override
    public Item fetch() {
        // 何らかの実装
    }
}
```

```java
@Module 
class Module {
    @Provides
    IRepository provideRepository(RepositoryImpl repository) {
        return repository;
    }
}
```

`@Binds`を利用することで、上記と等価なコードを以下のように書くことができます。

```java
@Modlule
abstract class Module {
    @Binds
    abstract IRepository provideRepository(RepositoryImpl repository);
}
```

前者と後者の違いをまとめると以下になります。

- `@Provides`の代わりに`@Binds`を利用していること
- クラスとプロバイダメソッドが`abstract`であること

記述量が減るため、プロバイダメソッドを書くのが楽になります。
しかし、同一Module内に`@Provides`を利用したプロバイダメソッドを定義することはできないので、そこだけ注意が必要です。
JIRA 7.2.x でダッシュボードが文字化けする件

## 何が起こったのか

JIRA 7.2.x からダッシュボードの日本語が文字化けするようになった。全てが？マークになってしまい、ガジェットの追加のメニューすらわからない状態。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133045/14b5bb64-df76-7276-d246-38b73ef488d9.png)


## 現状

Atlassian に不具合報告はされているが、優先度が低く期待できない。
https://jira.atlassian.com/browse/JRA-62659
https://jira.atlassian.com/browse/JRA-63024

## 原因

システムエンコードが `ANSI_X3.4-1968` として認識されてしまっている。
OS としては `UTF-8` になっているのに。

## Workaround

java の起動オプション（JIRA の `setenv.sh`）に以下を加え、明示的に `UTF-8` を指定してあげる。

```
-Dfile.encoding=UTF-8
```
【備忘録】RailsTutorialの6.2.5でハマったのでメモ

## 順番にやっていったのになぜかdb:migrateでコケる
チュートリアルの[6.2.5](http://railstutorial.jp/chapters/modeling_users?version=4.2#code-email_uniqueness_index)を実施していたときの出来事。

###環境
 - mac OS X Yosemite(10.10.5)
 - ruby 2.3.1p112
 - rails 1.5.0.0.1

###どうコケたのか
```
rails generate migration add_index_to_users_email
```
これを実行して出来上がったファイルに

```
class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end
```
サンプルの通り上記を入力して、`bundle exec rake db:migrate`を実行したら

```
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: users.email: CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email")
```
このエラー。
レコードがユニークじゃないよと。

###どう解決したのか
なんでやとおもい`rails console`で確認。

```
irb(main):004:0> User.all
  User Load (0.1ms)  SELECT "users".* FROM "users"
=> #<ActiveRecord::Relation [#<User id: 298486374, name: "MyString", email: "MyString", created_at: "2016-11-28 13:29:24", updated_at: "2016-11-28 13:29:24">, #<User id: 980190962, name: "MyString", email: "MyString", created_at: "2016-11-28 13:29:24", updated_at: "2016-11-28 13:29:24">]>
```
いつの間にやらusersにレコードが出来上がっててちゃっかりemailは重複していたので全削除。
その後db:migrateしたら無事にmigrate出来ましたとさ。
Ubuntu 18.04 LTSにKyTeaをインストールする方法

Ubuntu 18.04 LTSにKyTeaをインストールする方法についてまとめてみます。

#必要なパッケージのインストール
2. [checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法 - Qiitaの必要なパッケージのインストール](http://qiita.com/SUZUKI_Masaya/items/bd03f39e20a1a8f7f4f6#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従って、必要なパッケージのインストールを行います。

#Kyteaのインストール
1. [KyTea (京都テキスト解析ツールキット)](http://www.phontron.com/kytea/index-ja.html#download)をダウンロードします。
1. 適当なディレクトリに解凍します。
2. [checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法 - Qiitaのソフトウェアのインストール](http://qiita.com/SUZUKI_Masaya/items/bd03f39e20a1a8f7f4f6#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従ってインストールを行います。

#動作確認
`echo "麻生太郎はコーヒーを買って飲んだ。" | kytea`を実行し、次のように出力されれば、インストール成功です。

```
麻生/名詞/あそう 太郎/名詞/たろう は/助詞/は コーヒー/名詞/こーひー を/助詞/を 買/動詞/か っ/語尾/っ て/助詞/て 飲/動詞/の ん/語尾/ん だ/助動詞/だ 。/補助記号/。
```

#共通ライブラリが見つからないというエラーが出た場合
KyTeaを実行すると以下のようなエラーが表示されることがあります。

```
kyTea: error while loading shared libraries: libkytea.so.0: cannot open shared object file: No such file or directory
```

こういった場合には以下のコマンドを実行します。

```bash
$ sudo ldconfig
```

#関連記事
* [KyTeaまとめ - Qiita](http://qiita.com/SUZUKI_Masaya/items/dd8b28122eb53b0ba90a)
* [Ubuntu 18.04 LTSにKNP, JUMAN, CRF++をインストールする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/248a9260301435d42d5a)
* [Ubuntu 18.04 LTSにJUMAN++をインストールする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/29c81d037cdf7d37b900)

#参考文献
* [UbuntuでMeCabやKyTeaを入れてlibなんちゃらがないと言われた時 : mwSoft blog](http://blog.mwsoft.jp/article/57078793.html)
緯度経度から都道府県（市区町村）名を取得するembulk-filter_reverse_geocodingプラグインを作りました。


業務で使いたいシチュエーションがあったので週末を利用してembulkのfilterプラグインを作りました。
gemに登録して公開しましたのでせっかくだから紹介します。



##embulk-filter_reverse_geocoding
URL: https://github.com/oqrusk/embulk-filter-reverse_geocoding

緯度経度（度分秒/世界測地系）から都道府県名、市区町村名、ジオハッシュ（5桁）を生成するフィルタープラグインです。

元となる緯度経度から5桁のジオハッシュを生成して住所データとマッチングしています。
住所データは[@masuidrive](http://qiita.com/masuidrive)さんの[こちら](http://qiita.com/items/21a282c7bf54fd6a4985
)の記事で紹介されていたものをお借りしました。
https://github.com/FrogAppsDev/jpcities


##モチベーション

今回このプラグインを作ろうと思ったのはTableauで色塗りマップを使いたかったからです。


Tableauは都道府県名称や郵便番号の上3桁の文字列から[色塗りマップ](http://dev.classmethod.jp/business/business-analytics/tableau10-new-features-desktop-custom-territories/)を作ることが出来ます。

ただし、緯度経度をそのまま与えると点になってしまい色塗りマップにならないので緯度経度からリバースジオコーディングするプラグインを作りました。


##使い方

```csv:input.csv
spot,lat,lon
六本木グランドタワー,35.6641222,139.729426
```

```csv:output.csv
spot,lat,lon,pref,city,hash
六本木グランドタワー,35.6641222,139.729426,東京都,東京都港区,xn76g
```

```ruby:config.yml
filters:
  - type: reverse_geocoding
    target_lon: lon
    target_lat: lat
    output_columns:
      - {name: pref, type: string, out: pref}
      - {name: city, type: string, out: city}
      - {name: hash, type: string, out: hash}
```

target_lat/target_lonというオプションに緯度/経度それぞれのカラムを指定するとoutput_columnsの値を出力することができます。

今のところ生成出来る値は下記の3パターンです。

+ pref : 都道府県   
ex) 東京都
+ city : 都道府県 + 地区町村名  
 ex) 東京都港区 
+ hash : ジオハッシュ(5桁)  
 ex) xn76g


緯度経度は世界測地系（WGS84)の度分秒形式のみ対応しています。
ミリ秒や測地系の変換はまた別のプラグインを作成中です。

##最後に

開発にあたってたくさんの記事を参考にさせて頂きました。
ありがとうざいます。


・IntelliJIDEAでデバッグする方法
http://qiita.com/sonots/items/676a2903082fa8528ee5

・UnitTest(JUnit)の書き方
http://qiita.com/Civitaspo/items/c092620577983c9e84cc

・参考にさせていただいたコード
 特にoutput schemaやテストコード
https://github.com/sonots/embulk-filter-column

 特にPageOutput周り
https://github.com/kamatama41/embulk-filter-hash
javascriptによるnotEmpty関数


```javascript
function notEmpty(value) {
    var result;
    switch (typeof value) {
    case 'string':
        // 文字の0を除く
        result = (value && value != 0);
        break;
    case 'object':
        // 配列の中身の数チェック
        result = (value && Object.keys(value).length);
        break;
    default:
        result = value;
    }
    return Boolean(result);
}
```

引用
http://qiita.com/sibusuke/items/d95275c89a623b805441
勉強になる海外の動画サイトまとめ

勉強になる海外の動画サイトをまとめました。
他にもこんなのあるよという方はお教えください！


Lynda.com
------------------------------
[Lynda.com](https://www.lynda.com/)
ビジネスから趣味まで幅広～く、教材ビデオを取り揃えているサイトです。
ソフトウェアエンジニア関連もかなりの種類が揃っており、大体のツールのチュートリアルはあるんじゃないでしょうか。

日本語版も動画の数は少なくなってしまうようですがあるみたいです。

Treehouse
------------------------------
簡単なWebアプリやネイティブアプリを作成するためのコースを取り揃えたサイトです。
イメージ的にはドットインストールの海外版のようなものかもしれません。

Clean coders
------------------------------
[Clean Coders](https://cleancoders.com/)
"Clean Coder"及び"Clean Code"の著者Robert Martinが提供する動画サービスです。
私はClean Coderを読んで感化されてしまった人間なので、思わずいくつか動画を購入しまいました。
1本あたり$14と結構お高いですがそれに見合う価値はあると感じました。

内容としては、本の内容をよりディープに解説したものといった感じです。(ふわふわした表現で申し訳ございません…)

Frontend Masters
------------------------------
[Frontend Masters](https://frontendmasters.com/courses/)
結構うさんくさん雰囲気が漂っていますが、内容はかなり凝っていて、フロントエンドに携わる方には強くお勧めできるサイトです。

その名の通りフロントエンドに特化したサイトで、フロントエンドに関することは何でも教えています。
一つ一つのコースの内容が濃く、例えばReactのコースではReactの思想から、簡単なチュートリアル、開発環境の整え方、果てはユニットテストの仕方や、サーバーサイドレダリングの方法まで解説してくれます。
(このコースは全長10時間もありました…。半端ないです。)

また定期的に購読者に何を学びたいかのアンケートを取って、最新且つ注目の技術のコースも取りそろえるようにしているみたいです。

Khan Academy
------------------------------
[Khan Academy](https://www.khanacademy.org/)
非営利の教育サイトで、高校から大学で学べることを幅広くカバーしています。

Coursera
------------------------------
[Coursera](https://www.coursera.org/)
スタンフォード大学の教授が作ったオンライン教育サービスだそうです。
最近はやりのMachine Learningについてなど体系的に学べる教材が揃ってそうです。

Stanford Online
------------------------------
[http://online.stanford.edu/courses/topic/4](http://online.stanford.edu/courses/topic/4)
スタンフォード大学が提供している無料のオンラインビデオです。


MIT OpenCourseWare
------------------------------
[https://ocw.mit.edu/courses/#electrical-engineering-and-computer-science](https://ocw.mit.edu/courses/#electrical-engineering-and-computer-science)
MITが提供している無料のオンラインビデオです。
RealmのObjectを継承したモデルにイニシャライザを追加する


# TL;DR

convenience initializerを使う

# まずサポートされてない

とても単純ですが

RealmのObjectはObject.init()のoverrideはサポートされていません。
参考：[Support overriding Object.init() #1849](https://github.com/realm/realm-cocoa/issues/1849)

実際、

```swift
import RealmSwift

class Dog: Object {
    var name: String!
    init(name: String) {
        
    }
}
```

みたいなことをすると、designated initializerもかけ〜、みたいに怒られて、どんどん追加して、結局エラーみたいなことになります。

```swift
・・・
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
・・・
```

ので、そういうときは、convenience initializerを使います。

# サンプル

```swift
import RealmSwift

class Dog: Object {
    var name: String!
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}
```

overrideのときと違って、 親クラスのではなく、自分のイニシャライザを呼びます。

こちらの記事が詳しいです：[[Swift] クラスのイニシャライザ３： Designated Initializer と Convenience Initializer](http://qiita.com/cotrpepe/items/3052d91468f1b852582a)

# とはいえ

自分はいつも基本的にRealmに書き込むと思うので、

```swift
class func create(name: String) throws -> Dog {
    let realm = try Realm()
    let d = Dog()
    d.name = name
    try realm.write {
        realm.add(d)
    }
    return d
}
```

みたいにすることのほうが多いです。参考まで。
不要輕易生成陣列 - 演算法筆記

不要輕易生成陣列，包含

- Slicing an array
- Duplicating an array

... 等，會產生另外一個 array instance 的行為

源頭是，在練習做程式的題目的時候，解法雖然寫出來了，
但是因為題目平台給了一個超巨大的陣列，
一有切割、複製陣列等行為，
直接就被判定運算超時。

當碰到巨大資料量的時候，複製陣列或切割陣列等行為，就會對記憶體產生衝擊


## 對應做法

- 善用指標標示目前處理範圍或是位置

相對來說，生成型態是 Integer 的指標變數是便宜很多的，
換成指標之後，運算超時的問題也就解決了

修改過後的時間複雜度也有改善。
iOSのインターフェイスコアのレイアウトやプレゼンテーションTangramKit

![](http://upload-images.jianshu.io/upload_images/1432482-dcc38746f56a89ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

 ***[TangramKit](https://github.com/youngsoft/TangramKit)***書かスウィフト、サードパーティ製のインターフェイスレイアウトフレームワークiOSのシステム。彼は、フロートにiOSの自動レイアウトし、5コンテナのレイアウトシステムSizeClassとAndroidとHTML / CSSを統合し、フレックスボックスのレイアウト機能やアイデア、iOSの開発者のために、強力で柔軟かつマルチスクリーンの適応を機能のセットを提供することを目的とUIレイアウトのソリューションを使用して簡単にできます。タングラムタングラムは、すなわち中国の意味は、名前の意味は、このレイアウトライブラリは、複雑なインターフェイスのレイアウトの問題に非常にスマートでシンプルなソリューションであることができることを示しています。彼の同胞のフレームワーク： ***[MyLayout](https://github.com/youngsoft/MyLinearLayout)***は Objective-Cのインターフェイスのレイアウトの実装とフレームワークです。どちらも同じ主題を考えて、それはUIViewのプロパティを拡張するだけでなく、オーバーロードによって原理であるlayoutSubviewsインターフェイスのレイアウトを完了するための方法が、文法やプロパティ設定の一部で、いくつかのわずかな違い。TangramKitがアップグレードされたバージョンMyLayoutレイアウトライブラリであると言うことができます。あなたは、最新バージョンをダウンロードするには、次のgithubのサイトを訪問することができます：

* スウィフトバージョンTangramKit： https://github.com/youngsoft/TangramKit
* OC版MyLayout： https://github.com/youngsoft/MyLinearLayout

![TangramKit演示效果图](http://upload-images.jianshu.io/upload_images/1432482-3bfd0855a51b6d8e.gif?imageMogr2/auto-orient/strip)
LEGOをスマホでいごかすよ　今日はスマホアプリまでね

SRA関西事業部のちっちゃいおっさんです。

じぶん、スマホもってる？
iphoneちゃうほう、android

アプリ作ったことは？
ないの？

おっさんはあるで。かんたんやったで。
Java？そんなん知らんでもできるで。
eclipse？そんなんつかわへんよ。
ブラウザあったらいけるで。

Googleのアカウント持ってる？
無かったらつくってきて。
それはいるねん。

あ、そや。
これどこで見てるん？
自分のうち？
無線ＬＡＮで繋がってる？

ほな、バッチリやわ。
これクリックしてみて。
http://ai2.appinventor.mit.edu/

英語やけど、なんとなくわかるやろ？
ほなさっそくアプリつくってみよか。
最初やし、ボタン押したら電話かけるアプリでええやろ。

画面左上のメニューにProjectsあるやろ？そこからStart new project選んでみ。
名前つけよか。phoneとかでええよ。

あ、androidにアプリ入れなあかんわ。
変なアプリちゃうから入れたってや。
スマホからMIT AI2 Companionで検索してみて。

インストールできた？アプリ起動しといてな。

ＰＣの画面に戻ってメニューのConnectからAI Companionやで。
QRコード出てきたやろ？
それ、スマホのアプリでscan QR codeタップしてＰＣのQRコード写してみて。

ほんならもう繋がってるんとちゃう？
ＰＣの画面でボタン置いてみよか。
左側にButtonってあるやん？
それ、screen1にびゅーっともってきてみ。
ほんでスマホの画面見てみ。
ボタンできたやろ？
これすごない？
ボタンの名前は右側のプロパティから変えれるで。
電話とかにしてみ。
ほんでスマホ見てみ。
変わってるやろ？

電話をかけるためにボタン以外に部品いっこ置かなあかんわ。
左のタブにsocialってあるからそれクリックして。
PhoneCallってあるからそれをびゅーっとscreen1に置いてな。
ほんならプロパティにPhoneNumber入れれるから、かけても大丈夫な電話番号入力してみて。

デザインはここまでな。
次はロジックや。

画面右上のBlocksクリックしてみて。
画面変わったやろ？
左のBlocksからButton1クリックしたら、ほんまにブロックみたいなん出てきたやろ？
when button1.clickって書いてあるブロックをクリックしてみて。一番上にあるやろ？
Viewerに置かれたやろ？
次は左のBlocksからPhoneCall1クリックしてみて。
こんどは４番目にcall PhoneCall1.MakePhoneCallって書いてあるブロックな。
ほっそいやつ。
それをさっきのButton1のブロックにはめてみて。
カチッゆうてはまったやろ？

ロジックもこんで終わり。

スマホの画面のボタンをタップしてみ。
電話かかるから。

な、できたやろ？かんたんやったやろ？

つくったアプリを誰かにつかってもらいたいよな？
そんときはメニューのbuildからsave .apk選んだらＰＣにapkファイルをダウンロードできるで。
そのファイルを公開したらええねんけど、androidの設定で提供元不明のアプリの実行をonにする必要はあるで。

あかん、結構いっぱい書いてもうたわ。
ここまではAppInventor2とかで検索したら出てくるサイトにも書いてる内容と大差ないわ。

せっかくちっちゃいおっさんが書いとるんやから
LEGOいごかすやつ書いとかんとね。

もう別の日にしよかな。
別の日にするわ。

ほなまたねー

ちっちゃいおっさんは今日４７さいになったよ。
![image1 (3).JPG](https://qiita-image-store.s3.amazonaws.com/0/151562/152b362d-9ec0-f56c-a2cd-8a89e8ba4b00.jpeg)
ローカル環境を汚さずにRuby on Railsの環境構築をする

# はじめに
Ruby on Railsで開発していると，他のプロジェクトの都合でGemをバージョンアップしてしまった結果，動かなくなるということがある．
このような過ちを何度も繰り返すのはさすがにアホらしいので，当たり前の話ではあるがGemのバージョンをプロジェクト毎にbundlerで管理することで他の環境を汚さずにGemの管理を行いたい．

# Bundlerのインストール
```
$ gem install bundler
```
これだけ．
今後一切， `$ gem install` は使わないようにする．

# Railsのインストール
## 作りたいアプリに移動する
```
$ mkdir ~/my_app
$ cd ~/my_app
```
公式等の説明だと

```
$ rails new my_app
```
なんかでアプリを新規作成するが，ここでは先にアプリのディレクトリを作成しておく．(そもそもRailsまだ入ってないしね．)

## Railsをインストール
```
$ bundle init
```
こうすると，`Gemfile`というものが作られるので，その内容をコメントアウトして以下のようにする．

```:Gemfile
source "https://rubygems.org"

gem "rails"
```

これで下のコマンドを叩けばRailsをインストールできる．


```
$ bundle install --path vendor/bundle
```

# アプリを作成
railsのインストールは完了したので，あとは

```
$ bundle exec rails new .
```

で完了である．

# おわりに
これで複数のRailsプロジェクトでもストレスを感じることなく開発できる．これは個人的にだが，グローバルのgem環境は常に綺麗にしていきたい．
【MySQL5.6以上】Webエンジニア向け！メンテなしで500万件レコード入りのテーブルにINDEXを張る実行時間の目安

レコード数が増えていくと、INDEXを張りたくなりますよね。
INDEXのあり/なしでレスポンスが大きく変わります。
でも、「**サービスを止めたくない！**」
そんなWebエンジニアの方のために、メンテなしでテーブルにINDEXを張る方法を・・・。


# 答えは簡単。
データベースを「MySQL5.6以上」にすることです。
MySQL5.6から**オンラインでのDDL**が可能となりました。
つまり、「オンラインでINDEXを張ること」ができます！！

意外と知られていない・・・？！

* 参考： `CREATE INDEX、ADD INDEX`項目
  * [MySQL 5.6 リファレンスマニュアル 14.11.1 オンライン DDL の概要](https://dev.mysql.com/doc/refman/5.6/ja/innodb-create-index-overview.htm)


# 検証環境
### DBサーバのスペック

* CPU: 2
* Memory: 15GB

### 対象のテーブルのレコード数
* `4,793,440` 件

### テーブル構成

**hoge**テーブル

| カラム名       |       データ型 | 制約 |
|:-----------------|:------------------|:---|
| id               |  BIGINT(20) | AUTO_INCREMENT |
| foo_number       |  VARCHAR(255) | - |
| bar_id           |  BIGINT(20) | NOT NULL |
| bar_status       |  INT(11)    | NOT NULL, DEFAULT '1' |
| name             |  VARCHAR(255) |  NOT NULL |
| created_at       |  DATETIME | NOT NULL |
| updated_at       |  DATETIME | NOT NULL |



# DDLの準備

実行環境に依存するので、各自の環境に合わせてお使いください。
今回は、migrationファイルを使い、複合INDEXを作成します。

* SQLを発行する（`ALTER TABLE`を使う）
* migrationファイルを使う（Railsの `ActiveRecord`を利用する）


SQLの場合

```sql
ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);
```

migrationファイルを使う場合

```rb:migrationファイル例
class AddIndexToHoge < ActiveRecord::Migration
  def change
    # テーブル：hoge
    # カラム: foo_id, bar_id, bar_status

    # 単体のINDEX
    # add_index :hoge, :bar_status

    # 複合INDEXを作成
    add_index :hoge, [:foo_number, :bar_id, :bar_status]
  end
end
```

# 開発環境でDDLを実行
## 事前準備
* テーブルに本番と同等のレコードを挿入する

（SQLを1件、1件作成していたら、大変なので・・・できる限り一括でデータを入れます）
開発環境に、1件くらいデータ作ってありますよね・・・？
下記のSQLを使えば、実行回数の2乗で件数が増えます。

```sql
/** 自動採番のプライマリーキーは、NULLにしましょう（エラーで怒られなくて済みます） **/

INSERT INTO テーブル名
  SELECT NULL（プライマリキー）,カラム名1,...,カラムn FROM テーブル名;
```

## DDLを実行
* 本番でのおおよその実行時間を予測するために、開発環境でDDLを実行します。

（RDSを搭載したサーバのスペックにも依存しますが・・・）


テスト用のデータが作成できたら、開発環境で実行してみましょう。

今回はmigrationファイルなので、railsのコマンドを使います。

* SQLの場合は、Mysqlサーバに入ってSQLを実行してください。

```
$ bundle exec rake db:migrate RAILS_ENV=development
```


# 本番環境でDDLを実行

さて、いよいよ本番環境で・・・。

```
$ bundle exec rake db:migrate RAILS_ENV=production

==================================================
== 20161128017930 AddIndexToHoge: migrating
-- add_index(:companies, [:foo_number, :bar_id, :bar_status], {:name=>"index_hoge_on_foo_number_and_bar_id_and_bar_status"})
   -> 52.6168s
== 20161128017930 AddIndexToHoge: migrated (52.6169s)
==================================================
```

実行には、1分かからない程度で終わりました。
多めに見積もっても実行時間は、`50秒`〜`1分半`をみとけば良いでしょう。

# まとめ
約500万のレコードがあるテーブルに、オンラインでINDEXを張りました。
INDEXを張るために、「サービスを止めなきゃ！」と思っているWebエンジニアの方に参考になれば・・・と思います。

本番で実行する前に、開発環境で実行するのを忘れずに！✨
Ubuntu上でtexをコンパイルしてpdfとして保存する

Ubuntu 14.04および16.04上でtexファイルを作成し、pdfとして保存できるような環境を構築したので、備忘録として記します。

# texliveのインストール
まずはtexliveをインストールします。
texファイルのコンパイルに必要なライブラリが大体揃います。また、必要なフォントもダウンロードしておきます。

```
sudo apt-get install texlive-lang-japanese
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install texlive-lang-cjk
sudo apt-get install texlive-fonts-recommended
sudo apt-get install texlive-fonts-extra
```

# texの閲覧
texファイルの変換や埋め込む画像の閲覧に必要なソフトをインストールします。

```
sudo apt-get install xdvik-ja
sudo apt-get install dvipsk-ja
sudo apt-get install gv
```

# texファイルのコンパイルとpdf化
実際にtexファイルを作成し、コンパイルする方法です。作成したtexファイル名を`hoge.tex`とすると、以下のコマンドでコンパイルが可能です。

```
uplatex hoge.tex
```

コンパイル時にエラーがなければ、以下のコマンドでpdfとして保存できます。

```
dvipdfmx hoge
```

以上で、
ubuntu上でtexをコンパイルしpdfとして保存できる環境の構築は終了です。

#【追記】 PDFにフォントを埋め込む

上記の方法で作成したPDFには，フォント（主に漢字フォント）が完全には埋め込まれないようです。
そこで、デフォルトのフォントを予め指定しておきます。（ここでは，IPAexフォントを指定します。）

```
kanji-config-updmap-sys ipaex
```

このコマンドを、PDF作成前に一度だけ実行しておくことでPDFにフォントを埋め込むことができました。

# 参考
[Ubuntu14.04でTeX環境構築](http://qiita.com/hoshitocat/items/dd9d59de21c40b77e7c0)
[(u)pLaTeXのデフォルトの日本語フォントを好きなやつに変える方法]
(https://qiita.com/zr_tex8r/items/15ec2848371ec19d45ed)
ToDoのバックエンド・エンジン

ToDoのバックエンドとして、ChatWorkのTaskを使おうと考えていたのだ。それで、ChatWorkのTaskを使うために、編集ソフトまで作りかけて、だいぶ作ったところでじっさいに試してみて、そうしたらChatWorkのタスクには、API経由での更新と削除の機能がないことがわかった。それはとても残念で、更新と削除ができないのでは、ぜんぜん使い物にならないじゃないか、ということになった。
しかたがないので、UI部分は使うとして、エンジンはTracまたはEvernoteにでもするつもり。または独自で実装することを検討する。
Ubuntu上のtex文書にjlistingパッケージを使ってソースコードを掲載する

Ubuntu14.04および16.04にtexliveを導入しtex文書を作成しています。そんな時、文書にソースコードを載せる必要出てきたので、jlistingパッケージを導入しました。

#jlistingパッケージを用いる

デフォルトで入っているlistingパッケージを使うことで、（日本語を含まない）ソースコードをtex上で綺麗に表示することができます。
一方で、日本語を含むソースコードをtex上で綺麗に表示するには、jlistingパッケージを自ら導入する必要があります。

#jlistingパッケージのダウンロード

まず、以下のサイトから圧縮ファイル`jlisting.sty.bz2`をダウンロードします。

https://osdn.net/projects/mytexpert/downloads/26068/jlisting.sty.bz2/

そして、ファイラー等で解凍して`jlisting.sty`を用意します。（ここでは、`~/`に解凍したとします。）

#jlistingパッケージの導入

次に、上で用意した`jlisting.sty`を適切なディレクトリに移動します。（環境により異なるかもしれません。私の場合は`/usr/share/texlive/texmf-dist/tex/latex/listings`でした。周りにstyファイルがたくさんあるディレクトリです。）

```
cd /usr/share/texlive/texmf-dist/tex/latex/listings/
mv ~/jlisting.sty ./
```

権限を周りのstyファイルに合わせ、一覧を更新します。

```
chmod 644 jlisting.sty
sudo mktexlsr
```

これで`jlisting`パッケージを導入することができました。

```tex:document.tex
\usepackage{listings,jlisting}
\begin{document}
    \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,frame=single]
        %ここにソースコードを書く
    \end{lstlisting}
\end{document}
```

#【追記】
styファイルは、コンパイルするtexファイルと同じディレクトリに置いても認識されます。急いでいる場合や、１つのtexファイルしか作る予定がない場合にはこちらの方法をどうぞ。

```
cd [texファイルがあるディレクトリ]
mv ~/jlisting.sty ./
chmod 644 jlisting.sty
sudo mktexlsr
```
MBP2016(TouchBarモデル)で即座に画面をロックする


MBP2016(TouchBarモデル)になって画面ロックのショートカット `Control+Shift+Eject/Power` が使えなくなって困っていたところ、TouchBarの設定で画面ロックボタンを追加できることに気づきました。

```
システム環境設定 > キーボード > コントロールストリップをカスタマイズ
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">便利 <a href="https://t.co/jdJTpu4Rvf">pic.twitter.com/jdJTpu4Rvf</a></p>&mdash; clngn (@clngn) <a href="https://twitter.com/clngn/status/803200729972293633">2016年11月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

TouchBar、使い始めてみると思っていたよりだいぶ便利です。

## 参考リンク
- [MacBook Pro で Touch Bar を使う \- Apple サポート](https://support.apple.com/ja-jp/HT207055)
Python3版OpenCVのKeyPointをファイルに書き出す

Pickleモジュールを使いKeyPointをファイルに書き出そうとしたところエラーが出たので
その時の対応策のメモです。
検索すれば割とすぐ出てきたのであまり需要はないかもしれませんが一応。

## 環境
- Python 3.5.2
- OpenCV 3.1.0

## 参考URL
http://stackoverflow.com/questions/26501193/opencv-python-find-a-code-for-writing-keypoins-to-a-file
ここでの回答とほぼ同じです

## 失敗例
```python:out_kp_and_des.py
import cv2
import pickle


img = cv2.imread('XXXX.jpg')
detector = cv2.AKAZE_create()
# keypointsとdescriptors
kp, des = detector.detectAndCompute(img, None)

with open('XXXX.pickle', mode='wb') as f:
    pickle.dump((kp, des), f)
```
KeyPointをそのままPickle化しようとすると```PicklingError: Can't pickle <class 'cv2.KeyPoint'>: it's not the same object as cv2.KeyPoint```のようなエラーが出ます。

## 解決策
```python:out_kp_and_des.py
import cv2
import pickle


img = cv2.imread('XXXX.jpg')
detector = cv2.AKAZE_create()
kp, des = detector.detectAndCompute(img, None)

index = []
for p in kp:
    temp = (p.pt, p.size, p.angle, p.response, p.octave, p.class_id)
    index.append(temp)
with open('XXXX.pickle', mode='wb') as f:
    pickle.dump((index, des), f)
```
KeyPointのアトリビュートを取り出してそれをリストに入れてPickle化って感じになります。
ファイル読み込みは以下のような感じです。

```python:load_kp_and_des.py
import cv2
import pickle


with open('XXXX.pickle', mode='rb') as f:
    index, des = pickle.load(f)
kp = []
for p in index:
    temp = cv2.KeyPoint(x=p[0][0], y=p[0][1], _size=p[1], _angle=p[2],
                        _response=p[3], _octave=p[4], _class_id=p[5])
    kp.append(temp)
```
Laravel5.3でユーザ登録時にメール送信

##新サービスをLaravel5.3で立ち上げる事にしたので備忘録
勉強する時間も無いのだけど…とにかくググって実装！
まずは標準のAuthを使えるようにする。

```php:laravel/
php artisan migrate
php artisan make:auth
```

本題の登録時にメール送信は、5.1とかのやり方とか見つけれたのですが、どうも動かない…
自分なりに読み解いて下記対応で完成とすることにした。

###Config確認

```php:config/app.php
'aliases' => [
        'Mail' => Illuminate\Support\Facades\Mail::class,
```

##方法1
###Controller

```php:RegisterController.php
use Mail;  //aliasesが設定されているとそのまま宣言できる。

~~

// functionなり作って実行
Mail::send(
    'emails.done', // テンプレートファイル呼び出せる
    ['user' => $user],
    function($message) use ($user) {
        $message->to($user->email)->bcc('bcc@example.com')->subject('登録完了のお知らせ');
    }
);
```
###View
```php:emails/done.blade.php
<p>ようこそ、{{ $user['name'] }} さん</p>
```

##方法2
```php:laravel/
php artisan make:mail DoneMail
```
```php:DoneMail.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class DoneMail extends Mailable
{
    use Queueable, SerializesModels;
    
    public $options;
    public $data;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($options, $data)
    {
        $this->options = $options;
        $this->data = $data;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from($this->options['from'], $this->options['from_jp'])
            ->bcc($this->options['bcc'])
            ->subject($this->options['subject'])
            ->view($this->options['template']);
    }
}
```
###Controller

```php:RegisterController.php
use App\Mail\DoneMail;
use Mail;  //aliasesが設定されているとそのまま宣言できる。

~~

// functionなり作って実行
$options = [
    'from' => 'from@example.com,
    'from_jp' => '【○○より】',
            'to' => $mail_to,
            'subject' => '登録完了のお知らせ',
            'template' => 'emails.done'
        ];

        $data = [
            'mail_to' => $mail_to,
        ];
        Mail::to($mail_to)->send(new DoneMail($options, $data));
```
###View
```php:emails/done.blade.php
<p>ようこそ、{{ $user['name'] }} さん</p>
```

…
Facades…
Contracts…
う～ん…
アプリ経由でのWebサイトアクセスを識別するためにユーザエージェントを加工する【Swift3.0】

#### GoogleAnalyticsなどで、アプリ経由でのWebサイトアクセスを識別するためにユーザエージェントを加工する

###### 「デフォルトのユーザエージェント」 + 「"AppName/"{アプリバージョン}」 

```swift

    // swift 3.0

    func setAppUserAgent() {
        
        // ダミーのwebviewからデフォルトユーザエージェントを取得
        let webViewDummy = UIWebView(frame:CGRect.zero)
        let useragent:String = webViewDummy.stringByEvaluatingJavaScript(from: "navigator.userAgent")!
        
        // デフォルトのユーザエージェントにアプリ名＋バージョン情報を付加
        let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
        let wkStr = " AppName/" + version
        let addedUserAgent = useragent + wkStr
        let agentDict = ["UserAgent":addedUserAgent]

        UserDefaults.standard.register(defaults: agentDict)
    }

    // ex.
    // Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A345 AppName/1.0
```
###### 起動時にコール

```swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        setAppUserAgent() 
        
        return true
    }
```
Spring の非同期リクエストで嵌った

Spring MVC で Callable 使って非同期リクエストを処理する時に嵌りました。とりえあず、これが対策後のコントローラ。

```
@Controller
public class SampleController {
    @ModelAttribute("sample")
    public String sample(HttpServletRequest request) {
        if (WebAsyncUtils.getAsyncManager(request).hasConcurrentResult()) {
            return null;
        }
        return "sample";
    }

    @GetMapping("/sample")
    @ResponseBody
    public Callable<String> get() {
        return () -> "sample";
    }
}
```

ModelAttribute の中で hasConcurrentResult を検証しているのですが、モデルの初期化がリクエストの処理前だけでなく、Callable の中身の処理が終わった後に再度実行されてしまうため、hasConcurrentResult で判定しています。

普通にモデルを作るだけならこの処理は不要だと思うのですが、リソースがない場合に例外を出すような処理をしていて、削除処理を Callable で実装すると、削除リクエスト内で例外が発生してしまいます。

どうしてこうなるか WebAsyncManager#startCallableProcessing と RequestMappingHandlerAdapter#invokeHandlerMethod を追ったのですが、他に対策が思いつかなかったので一時的な対策になってしまいました。
コマンドプロンプトで起動したVimでウインドウサイズを変える

コマンドプロンプトはウインドウサイズが変えられない。
Windows10やWindows8（たしか）変えられるけど、
開発の現場ではまだまだWindows7が現役。

でもコマンドプロンプトから起動したVimではウインドウサイズを変えられるらしい。

:set columns=[表示したい横幅（文字数）]
:set lines=[表示したい行数]

しらなかった。。。
rbenvで新し目のRubyバージョンがない場合の対処方法

※自分用メモなんで、雑です

# 環境
* OS: CentOS7

# rbenvでインストール可能なrubyバージョンを調べる

```shell-session
rbenv install -l
```

※新し目のRubyバージョンがない場合、以降の手順を実行する

# rbenvを最新にする
```shell-session
cd ~/.rbenv/
git pull
```

# ruby-buildを最新にする
```shell-session
cd ~/.rbenv/plugins/ruby-build
git pull
```