OmniAICreator/Qiita-1.07M huggingface dataset:
計算・作図環境インストール（Linux Mint 編）

# apt−get でよく使うソフトをインストール

利用するソフト類のインストール．まずは which で使いそうなソフトの所在を確認してみる．

Linux Mint 17.3 Cinnamon-64bit版には，**gedit**, **gcc (4.8.4)**, **awk**, **gawk**, **python3 (3.4.3)** はデフォルトで入っている模様．

ここで，パッケージ管理コマンド apt−get の出番となる．
初めに実行する apt−get コマンド
パッケージリストを入手し、インストールされているパッケージをアップデートする．

```
sudo apt-get update
sudo apt-get upgrade
```

その後，欲しいソフトをインストール．とりあえず以下を実行．

```
sudo apt-get install gfortran
sudo apt-get install python3-tk
sudo apt-get install python3-numpy
sudo apt-get install python3-scipy
sudo apt-get install python3-matplotlib
sudo apt-get install imagemagick
sudo apt-get install gnuplot-x11
sudo apt-get install geany
sudo apt-get install nkf
```

ここで，python3 は既に入っているので tkinter も付属していると思ったら，そうではなかった．
上に示すように別途インストールする必要があることに注意．

Google Chrome (ブラウザ) と Remarkable (Markdownエディタ) は，本家サイトより以下のファイルをダウンロードし，インストール． ダブルクリックするとインストールしてくれます．

```
google-chrome-stable_current_amd64.deb
remarkable_1.62_all.deb
```

Geany はインストールしたままでは黒背景の選択ができないため，Geanyの本家から以下のファイルをダウンロード．

```
geany-themes-master.zip
```

これを展開したものを，以下のディレクトリにコピーすることにより，View - Editor - Colour Schemes から背景色を変更できるようになる

```
~/.config/geany/colorschemes/
```

## Linux MintにGMT5をインストール
```/home/kk(user)``` の下に ```GMT_inst``` というディレクトリを作成し，
```GMT_inst``` に以下のファイルをダウンロードして保存

```
gmt-5.2.1-src.tar.gz
dcw-gmt-1.1.2.tar.gz
gshhg-gmt-2.3.4.tar.gz
```

GMT インストールのためのスクリプトは以下のとおり．Ghostscript など関連プログラムも同時にインストールしておく

```
sudo apt-get install ghostscript build-essential cmake libnetcdf-dev libgdal1-dev libfftw3-dev libpcre3-dev

sudo mkdir /usr/share/gmt
cd /usr/share/gmt
sudo cp /home/kk/GMT_inst/gshhg-gmt-2.3.4.tar.gz gshhg-gmt-2.3.4.tar.gz
sudo tar zxvf gshhg-gmt-2.3.4.tar.gz
sudo mv gshhg-gmt-2.3.4 gshhg
sudo cp /home/kk/GMT_inst/dcw-gmt-1.1.2.tar.gz dcw-gmt-1.1.2.tar.gz
sudo tar zxvf dcw-gmt-1.1.2.tar.gz
sudo mv dcw-gmt-1.1.2 dcw
sudo rm gshhg-gmt-2.3.4.tar.gz
sudo rm dcw-gmt-1.1.2.tar.gz

cd ~/GMT_inst
tar zxvf gmt-5.2.1-src.tar.gz
cd gmt-5.2.1
cat << EOT > cmake/ConfigUser.cmake 
set (CMAKE_INSTALL_PREFIX /usr/local)
set (GSHHG_ROOT /usr/share/gmt/gshhg)
set (DCW_ROOT /usr/share/gmt/dcw)
set (FLOCK TRUE)
EOT

cd gmt-5.2.1
mkdir build
cd build
cmake ..
make
sudo make install
```

以上
Emacsでお手軽にEPUBとかMarkdownの文書を読めるやつ

Emacsにはバージョン24から`eww`と呼ばれるWebブラウザ機能が同梱されるようになった。これを利用して、EPUBのような電子書籍フォーマットやdocx(Microsoft Word)のようなリッチテキスト、Markdownやorg-mode、Textile、などの軽量マークアップ言語などのいろんなアレをEmacsで読めるようにする。

つまり、「おめーREADMEファイルを[reStructuredText](https://ja.wikipedia.org/wiki/ReStructuredText)とか<del datetime="2016-06-29T00:39:03+09:00">[AsciiDoc](http://www.methods.co.nz/asciidoc/)とか</del><ins datetime="2016-06-29T00:39:03+09:00">[Textile](http://redcloth.org/textile)とか</ins>よくわかんねーフォーマットで書いてんじゃねーよ読めねーだろ」ってときにも安心ですね☆

<ins datetime="2016-06-29T00:39:03+09:00">
<h3>追記</h3>
<p>@10sr さんの指摘通り、AsciiDocはinputには利用できませんでした。残念…</p>
</ins>

## 用意するもの

- Emacs 24.4+ (libxml必須)
- [Pandoc](http://pandoc.org/) (Windowsでも動くらしい)
    - http://pandoc.org/installing.html を読んでね

## EWWとは何か

[EWW(Emacs Web Wowser)](https://www.gnu.org/software/emacs/manual/html_node/eww/index.html#Top)は2014年にリリースされたEmacs 24.4から標準搭載されたテキストブラウザ。

概要や簡単な操作については @suzuki さんの[Emacs 24.4 の新機能・内蔵ブラウザ eww.el を調べてみた - 雑文発散(2014-08-07)](http://suzuki.tdiary.net/20140807.html)を参照。

## どうやってインストールするの。

[package.el - Emacs JP](http://emacs-jp.github.io/packages/package-management/package-el.html)とか参考にして、MELPAパッケージを有効な状態にして、`pandoc`パッケージをインストールする。パッケージ管理に馴れてない型は[zonuexe/pandoc.el](https://github.com/zonuexe/pandoc.el)から直接ダウンロードしたり、`init.el`にコピペしても特に問題はない。

## どうやって開くの

`M-x pandoc-open-eww`で開ける。

あと、`init.el`に一行`(pandoc-turn-on-advice-eww)`って書いておくと、`M-x eww-open-file`したときに拡張子を自動判定して勝手に開くようになる。

## 実際どうなの

![emacs-eww-pandoc-epub.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/7a34d68c-7f41-672b-3461-6a4f0c20a654.gif)

どの程度実用になると評価するかは、正直言ってひとによるだろう。が、すくなくともEmacsから離れずに本文を確認するプレビュー用途としては十分かと存じ上げる。

ただし、縦書きの文藝作品のEPUB、特にルビが振られた作品などは少々つらいので、満足のいく読書体験を得たければきちんとしたEPUBビューアーでレンダリングした方が良いかと思ふ。

## おまけ

[Antiword](http://www.winfield.demon.nl/)を入れたら自動的に拡張子`.doc`の古い形式のWordファイルを開くよ。Emacsから離れずに旧形式のWordファイルも読めるよ。(新形式の`.docx`ファイルはPandocがサポート)
計算・作図環境インストール（Windows 7: 64bit編）

# はじめに
会社のデスクトップ機に，計算・作図用環境をインストールした時の記録です．


# エディタ，コンパイラ，作図関係ソフト
エディタ，コンパイラ，作図関係ソフトはスムースに導入できる．私がインストールしたのは，以下のものたち．いずれもパスを通すのを忘れないように．

<table>
<tr><td>エディタ</td><td>Geany</td><td>	geany-1.26_setup.exe (Full Install including GTK 2.24)</td></tr>
<tr><td>エディタ</td><td>gPad</td><td>	gPad_2.2.0c-setup.exe</td></tr>
<tr><td>コンパイラ	</td><td>MinGW gcc, gfortran</td><td>mingw-get-setup.exe</td></tr>
<tr><td>作図</td><td>GMT5</td><td>gmt-5.2.1-win64.exe</td></tr>
<tr><td>作図</td><td>gnuplot</td><td>	gp50rc2-win64-mingw.exe</td></tr>
<tr><td>作図補助</td><td>Ghostscript</td><td>gs918w64full-gpl.exe</td></tr>
<tr><td>作図補助</td><td>GSview	</td><td>gsv50w64.exe</td></tr>
<tr><td>画像処理</td><td>ImageMagick</td><td>ImageMagick-6.9.3.2-Q16-x64-dll.exe</td></tr>
</table>

# Python3 64bit 版
Mac にも Linux にも比較的容易にインストールできたのですが．．．
Windows へのインストールは少し面倒です．

## まず、Python本体をインストール
```
Python python-3.4.4.amd64.msi
```

## numpy/scipy/matplotlibのインストール

+ Python3.4 インストール後、c:\Python34\Scripts内のpip3.4.exe を用いて以下をインストール
+ .whlファイルは[ここ(http://www.lfd.uci.edu/~gohlke/pythonlibs/)](http://www.lfd.uci.edu/~gohlke/pythonlibs/)から取ってくる
+ インストールするファイルは、pip3.4.exe が格納されている\Scripts にコピーしておくと作業しやすい

## まずnumpyとscipyをインストール
```
pip3.4 install numpy-1.10.4+mkl-cp34-none-win_amd64.whl
pip3.4 install scipy-0.17.0-cp34-none-win_amd64.whl
```

## matplotlibインストール前に以下をインストールしておく
six をいれないと dateutil, cycler がインストールできないことに注意

```
pip3.4 install six-1.10.0-py2.py3-none-any.whl
pip3.4 install python_dateutil-2.4.2-py2.py3-none-any.whl
pip3.4 install cycler-0.9.0-py2.py3-none-any.whl
pip3.4 install pyparsing-2.0.7-py2.py3-none-any.whl
pip3.4 install pytz-2015.7-py2.py3-none-any.whl
pip3.4 install setuptools-19.2-py2.py3-none-any.whl
```

## 最後にmatplotlib本体をインストール
```
pip3.4 install matplotlib-1.5.1-cp34-none-win_amd64.whl
```

## gawk Windows 64bit版
Windows7 64bit．GMT5 で，gawk を含むスクリプトを実行したら，gawk が無いと言われました． そこで gawk をインストールしようとしましたが，意外に 64bit 版が見つからない． 色々探して，やっと見つけてインストール． 手順は以下のとおりです．

+ [ここ(http://www.klabaster.com/freeware.htm)](http://www.klabaster.com/freeware.htm)から，gawk4.zip をダウンロード．
+ ページの表の下の方に，「Free download of the version 4.1.3 (May 2015) of Gawk 4.1.3 (gawk4.zip)(Version 4.1.3)Win32/Win64 executable」というところがあります．
+ 展開してできたファイルを好きなフォルダを作ってコピー．私は，「c:\gawk」というフォルダを作り，そこに gawk.exe 他をいれました．
+ パスを通して再起動すれば使えるようになります．

以上
コマンドプロンプトでSQL Serverを使う 

SQLServerを少しだけ触る機会があったため、基本なコマンドをまとめます。
sqlcmdユーティリティが必要になります。
<>内はご自身の環境に合わせて置き換えてください。


# SQLServer認証でログイン
```
sqlcmd -S <host> -U <user> -P <password>
```

接続できると`1>`と表示される。

ポートを指定したい場合は、host,port とする。

```lang:ex
sqlcmd -S hostname,1433 -U user -P password
```

データベースの指定も含むと以下のようになる。

```
sqlcmd -S <host> -U <user> -P <password> -d <database>
```

# データベース一覧を表示する
```
select name from sys.databases;
go
```

命令文のあとに`go`が必要になる。
`go`がないと実行されない。


# テーブルの一覧を表示する
```
select name from sysobjects where xtype = 'U';
go
```

# パスワードの変更
```
sqlcmd -S <host> -U <user> -P <current-password> -Z <new-password>
```
# データベースの作成
```
create database <database-name>;
go
```

# データベースの削除
```
drop database <database-name>;
go
```

# データベースの指定
```
use <database-name>;
go
```
Xamarin.Forms 向けの地図ライブラリ「Xamarin.Forms.GoogleMaps」をリリースしました


Xamarin.Forms で使える地図ライブラリは、公式が出している

* [Xamarin.Forms.Maps](https://www.nuget.org/packages/Xamarin.Forms.Maps/) - Maps models and renderers for Xamarin.Forms

があるのですが、非常に機能が少ないです（ピンがおけるだけで、図形の描画すらできません）。

なので、別な選択肢としての「Xamarin.Forms向け地図ライブラリ」を開発し始めました。

それがこちら

* [Xamarin.Forms.GoogleMaps](https://www.nuget.org/packages/Xamarin.Forms.GoogleMaps/) - Yet another Maps library for Xamarin.Forms that optimized for Google maps.

です。

iOS では MapKit に代わり [Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios-sdk/?hl=ja) を使用し、 Android/iOS 共に Google Maps に特化することで、API の共通化を容易にし、恐らくAPI共通化の足枷になっているであろう UWP(Bing maps) のサポートは最小限に留めています。

![screenshot1](http://blog.amay077.net/assets/images/posts/xamarin_forms_googlemaps_intro_01.png)


## 現在の機能

現在のバージョンは 1.1.0 。
公式の Xamarin.Forms.Maps に比べて、ライン・ポリゴン・円を追加できるようになりました。

![screenshot2](http://blog.amay077.net/assets/images/posts/xamarin_forms_googlemaps_intro_02.png)

詳しい比較は

* [Xamarin.Forms.Maps との比較 - Xamarin.Forms.GoogleMaps Wiki](https://github.com/amay077/Xamarin.Forms.GoogleMaps/wiki/Xamarin.Forms.Maps-%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83)

にあります。

## サンプルプログラム

* [Xamarin.Forms.GoogleMaps/XFGoogleMapSample - github](https://github.com/amay077/Xamarin.Forms.GoogleMaps/tree/master/XFGoogleMapSample)

にあります。

Google Maps の APIキーを Android / iOS それぞれで取得する必要があります。

* Android -  [Xamarin.Androidで地図を表示するには？（Google Maps使用） - Build Insider](http://www.buildinsider.net/mobile/xamarintips/0020)
* iOS - [Google Maps SDK for iOS  |  Google Developers](https://developers.google.com/maps/documentation/ios-sdk/?hl=ja) の「クイック スタート ステップ」
をそれぞれ参照してください。

## オープンソース

[Xamarin Open Source SDK](http://open.xamarin.com/) により、 Xamarin.Forms のソースコードもオープンソースになったので、 [Xamarin.Forms/Xamarin.Forms.Maps - github](https://github.com/xamarin/Xamarin.Forms/tree/master/Xamarin.Forms.Maps) などを Fork して作りました。

このライブラリ自体もオープンソースであり、

* [Xamarin.Forms.GoogleMaps: Map library for Xamarin.Forms using Google maps API](https://github.com/amay077/Xamarin.Forms.GoogleMaps)

で開発しています。（スターを付けてもらえると作者がよろこびます）

[要望、コメントなど](https://github.com/amay077/Xamarin.Forms.GoogleMaps/issues)もらえると嬉しいです。よろしくおねがいします。
計算・作図環境インストール（Mac編）

# はじめに
2015年７月に OS X を再インストールした時の記録です．
2015年１０月以降は，El Capitan で問題なく動いています．

先般，作図ツールの記事を掲載したので，ツール他のインストール方法もアップしておこうと思い立ちました．

------

Mac では，OS X のインストールが終わった段階で，少なくとも以下のプログラムは既に入っていました．

+ /usr/bin/gcc	(Apple LLVM version 6.1.0, clang-602.0.53)
+ /usr/bin/python	(version 2.7.6)
+ /usr/bin/ruby	(ruby 2.0.0p481)
+ /usr/bin/perl	(perl v5.18.2)
+ /usr/bin/awk	(version 20070501)

その後自分で使うプログラム類を Mac 本体にインストール．Xcode はインストールしていない状態でスタート．


# Homebrew

```
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew doctor
brew install caskroom/casc/brew-cask
```

+ １行目：Xcode をインストールせずにこれを打ち込むと「command line developer toolsが必要」と言われダイアログが立ち上がるので，これに従いインストール
+ ２行目：Homebrew のサイトからインストール用スクリプトをコピペ
+ ３行目：brew doctor で Your system is ready to brew を確認
+ ４行目：brew cask を使えるようにする

## 参考サイト

+ [http://qiita.com/_daisuke/items/d3b2477d15ed2611a058](http://qiita.com/_daisuke/items/d3b2477d15ed2611a058)
+ [http://millkeyweb.com/installing-homebrew/](http://millkeyweb.com/installing-homebrew/)
+ [http://brew.sh/index_ja.html](http://brew.sh/index_ja.html)



# コンパイラ (gcc)

```
brew install gcc
```

gfortran 単独は受け付けず gcc をインストールするよう言われます．



# ImageMagick, GMT, gnuplot

```
brew install Caskroom/cask/xquartz    # x11
brew install imagemagick --with-x11   # ImageMagick
brew install homebrew/science/gmt     # GMT5
brew install gnuplot --with-x11       # gnuplot
brew install ghostscript              # Ghostscript 9.16
```

xquarts は ImageMagick，gnuplot を扱うために，ghostscript は TeX を扱うために忘れずにインストールしておく．

## 参考サイト

+ [http://hiho-developer.hatenablog.com/entry/20131221/1387564021](http://hiho-developer.hatenablog.com/entry/20131221/1387564021)



# Python3, numpy, scipy, matplotlib
Pythonは，本日（２０１６年６月２７日），3.4.3 から 3.5.1 に入れ替えました．

```
brew install pyenv

#.bash_profileに以下を追加
export PATH="＄HOME/.pyenv/shims:＄PATH"

source .bash_profile
#.bash_profile を再読み込みする。その後は機械的に以下を実行。

pyenv install 3.5.1
pyenv global 3.5.1
pip3 install numpy
pip3 install scipy
pip3 install matplotlib
pip3 install Pillow
```
画像処理ライブラリ Pillow のインストールを忘れないこと！



# BasicTeX

[こちら(https://www.aruneko.net/archives/1423)](https://www.aruneko.net/archives/1423) に従ってインストール．

```
brew cask install basictex

sudo tlmgr update --self --all
sudo tlmgr install collection-langjapanese latexmk

cd /usr/local/texlive/2015basic/texmf-dist/scripts/cjk-gs-integrate
sudo perl cjk-gs-integrate.pl --link-texmf
sudo mktexlsr

sudo updmap-sys --setoption kanjiEmbed hiragino-elcapitan-pron

sudo tlmgr install symbol
sudo mktexlsr
```

以上
THETA SのAPI v2でストリーミング中に露出補正を変更するには


## 参照記事

- それが可能なことはMIROさんの記事で知ってました。　http://blog.mobilehackerz.jp/2015/12/theta-s.html　の最後の方にあります。
- どのパラメータがどの露出モードで使えるかはgtk2kさんの記事にあります。　http://qiita.com/gtk2k/items/dfbdc9a290c90f1f4426

この記事では、とにかくどうすればできるのか、だけをシンプルに書きます。APIについて詳しい記事は他に沢山ありますので、そちらをご覧ください。

## 手順

1. THETA Sのwifiに接続する
2. セッションIDを取得
3. 露出プログラムをAUTOにする
4. 露出補正の設定を変更する（設定可能な値は https://developers.theta360.com/en/docs/v2/api_reference/options/exposure_compensation.html によれば　-2.0, -1.7, -1.3, -1.0, -0.7, -0.3, 0.0, 0.3, 0.7, 1.0, 1.3, 1.7, 2.0 でデフォルトは0.0）

### curlで叩くとこんな感じ

※ THETAのIPアドレスは`192.168.1.1`とします
※ セッションIDは最初のコマンドに対して`SID_0001` が得られたとします

```bash
# セッションIDを取得
$ curl -X POST http://192.168.1.1/name\": \"camera.startSession\", \"parameters\": {}}"

# 露出プログラムをAUTO (== 2)に設定
$ curl -X POST http://192.168.1.1/osc/commands/execute -d "{ \"name\": \"camera.setOptions\", \"parameters\": {\"sessionId\": \"SID_0001\", \"options\": { \"exposureProgram\": 2 }}}"

# 露出補正の値を指定
$ curl -X POST http://192.168.1.1/osc/commands/execute -d "{ \"name\": \"camera.setOptions\", \"parameters\": {\"sessionId\": \"SID_0001\", \"options\": { \"exposureCompensation\": 2.0 }}}"
```

gtk2kさんの記事にもありますが、露出プログラムモードを露出優先やシャッター優先にすることもできますが。自分としてはストリーミングモードでは露出補正だけできればいいので、この記事でもそれしか書いてません。

ここまでできれば、ストリーミングのモードもon/offできたらいいんですけどね。。。
MonoDevelopのTheme(テーマ)を自分好みにカスタマイズする方法


##はじめに
MonoDevelopのテーマを他所からインストールして設定する方法が分からなかったのでその時のメモです。

##設定方法
順を追って説明します。

MonoDevelopを立ち上げて、MonoDevelop-Unity -> preferencesからpreferencesウィンドウを開きます。

![sc1.png](https://qiita-image-store.s3.amazonaws.com/0/122157/ed1c3bdb-4dcd-6a96-f3d3-4d49cdea6008.png "sc1.png")

<Br>

Text EditorのSyntax Highlightingを選択すると以下のような表示になります。

![sc2.png](https://qiita-image-store.s3.amazonaws.com/0/122157/f2c554ff-626c-6b27-4dba-340357d82cd8.png "sc2.png")


ここで変更したいテーマをクリックし、OKを押せばテーマを変えることができるのですが、
デフォルトで用意されているテーマではなく自分で用意した(他所からインストールした)テーマを使用したいという場合が多いかと思います。

どんな形式のファイルをAddすれば良いのかが分からず無駄に時間を費やしてしまいました。。。
Addというボタンを押すと以下のような表示が確認できるかと思います。はい、これで全て解決ですね！
**.vssettings**のファイル形式に対応しているのでそれを加えてあげればOKです！

![sc4.png](https://qiita-image-store.s3.amazonaws.com/0/122157/25e1f49e-9a6f-65ad-4d73-75d47b3f6957.png "sc4.png")


<Br>

私は[ここのサイト](http://studiostyl.es/)より好みのテーマをDLしました。
好きなテーマを選択すると以下の画面が表示されますので、
"Download this scheme"ボタンを押すとダウンロードされます。

![sc3.png](https://qiita-image-store.s3.amazonaws.com/0/122157/4ce68c3b-396e-0b7a-4eaa-fd29d5e95c4a.png "sc3.png")


<Br>

あとは、今ダウンロードしたテーマをAddボタンから追加してあげれば無事テーマが変更されます！！


![sc5.png](https://qiita-image-store.s3.amazonaws.com/0/122157/e0ba8331-7011-1800-7bf7-3e13ca0be65b.png "sc5.png")
sudoでroot権限は渡さずに別ユーザにパスワード無しでスイッチすることを許可する

# やりたいこと
別ユーザ(例：foo)にスイッチする場合、`su - foo`か`sudo su - foo`のどちらかを使うだろう。
fooのパスワードを開示することなくスイッチさせるためには後者の`sudo`を使わざるを得ないが、root権限は渡したくない場合がある。(rootへのスイッチは拒否したい場合など)
そのため、

* fooのパスワードを教えること無く
* fooへのみパスワード無しでスイッチでき
* ただしrootへはスイッチはさせない

ようにする必要がある。

# やりかた1
例：ユーザhogeに対してパスワード無しでユーザfooへスイッチを許可する場合
`/etc/sudoers`に以下を記述する。(`visudo`コマンドで編集しましょう)

```
hoge	ALL=(ALL)	NOPASSWD:	/bin/su - foo, /bin/su foo
```

この場合、ユーザhogeは自身がログインした後、以下のようにすればユーザfooへスイッチすることができる。

```bash
[hoge@localhost ~]$ sudo su - foo
[foo@localhost ~]$ 
```

もちろん、rootや別ユーザにスイッチすることは出来ないし、sudo権限で別コマンドを実行することもできない

```bash
[hoge@localhost ~]$ sudo su - root
ユーザー hoge は'/bin/su - root' を root として localhost.localdomain 上で実行することは許可されていません。すみません。
[hoge@localhost ~]$ sudo date
ユーザー hoge は'/bin/date' を root として localhost.localdomain 上で実行することは許可されていません。すみません。
```

# やりかた2
やりかた1の場合、ユーザごとにエントリを記述する必要があるため手間である。
そのため、特定のグループへ権限を付与することもできる。
例：fooadminsグループに属しているユーザはパスワード無しでユーザfooへスイッチを許可する場合

1.fooadminsグループに必要な人を所属させる。

```
# groupadd fooadmins
# usermod -G fooadmins -a hoge
```

2.`/etc/sudoers`に以下を記述する。(`visudo`コマンドで編集しましょう)

```
%fooadmins	ALL=(ALL)	NOPASSWD:	/bin/su - foo, /bin/su foo
```

これでやり方1と同様に、fooadminsへ所属しているユーザのみがfooへスイッチすることができる。
【WordPress】同じタグを持つ記事を関連記事として表示する方法

#【WordPress】同じタグを持つ記事を関連記事として表示する方法

***関連記事を表示する方法としてタグを使用して実現するやり方をメモ***

・記事本文の下部に関連記事を表示してみる。
以下は実装前の状態。
![before記事_.png](https://qiita-image-store.s3.amazonaws.com/0/97158/bf60dbd6-0a7f-7327-4b50-1051e95db879.png)


・まず、こんな感じでタグを作成。

![tag画面.png](https://qiita-image-store.s3.amazonaws.com/0/97158/0464dc15-9c99-4ab8-b07f-3f76c4ba4323.png)

・次に、こんな感じでタグをつけた記事を作成。
![記事タグ.png](https://qiita-image-store.s3.amazonaws.com/0/97158/f625d651-4f39-aaf3-5034-99edc0c2c58b.png)

・個別ページ記事を表示するテンプレートに以下のように関連記事を抽出するロジックを実装・

```lang:single.php
〜〜本文を出力している箇所〜〜

	$current_tags = get_the_tags();
	//この記事がタグを持っているかどうか判別
	if ( $current_tags ) :
		foreach ( $current_tags as $tag ) {
			$current_tag_list[] = $tag->term_id;
		}
	
		$args = array(
			'tag__in'        => $current_tag_list,
			'post__not_in'   => array( $post->ID ),
			'posts_per_page' => 5,
		);
		$related_posts = new WP_Query( $args );
		 //関連する記事があるかどうか判別
		if( $related_posts->have_posts() ) :
			?>
			<h3>関連記事</h3>
			<ul id="related-test">
				<?php
				//関連する記事を表示
				while ( $related_posts->have_posts() ) :
					$related_posts->the_post();
					?>
					<li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
					<?php
				endwhile;
				?>
			</ul>
			<?php
		else :
			//関連記事がなければ以下を表示
		?>
		<p>関連記事はありません</p>
		<?php
	    endif;
	    wp_reset_postdata();
endif;

〜〜コメント出力箇所〜〜
```

・記事を表示すると、同じタグを持った記事が関連記事として表示されるようになりました！
![記事1_.png](https://qiita-image-store.s3.amazonaws.com/0/97158/0b174b3f-540f-fe41-af00-4f3936e2c262.png)

![記事2−2_.png](https://qiita-image-store.s3.amazonaws.com/0/97158/9515c9db-2759-a13a-be70-218d462d8817.png)
Docker for mac が sudoつけないと動かなくなってハマった時のメモ


勢いで入れたDocker for macが`docker ps`しても`Cannot connect to the Docker daemon`とか言われてしまい、`sudo docker ps`としないと動かなくて`boot2docker`も消したのにおかしいなーとなってハマった。


### 解決

下記に`boot2docker`と`Docker for mac`の関係性についての記事があると教えてもらった

https://docs.docker.com/docker-for-mac/docker-toolbox/

`DOCKER_*`のenv設定があると、どうもboot2dockerを動かしてしまいDocker for mac見てくれないらしい。

```
unset DOCKER_TLS_VERIFY
unset DOCKER_CERT_PATH
unset DOCKER_MACHINE_NAME
unset DOCKER_HOST
```

`.zshrc`などにも上記設定に関する項目が入っている時はそっちも削除する

### 教訓

ドキュメントちゃんと読もう
UX DAYS TOKYOに参加してきたので、今更ながらレポートを

#UX DAYS TOKYOとは

UX DAYS TOKYO とは「UXを考え、未来を創る」をテーマにUXのスペシャリストがカンファレンス及びワークショップのスピーカーとして登壇するイベントです。
詳しくは以下のサイトを参考に
http://2016.uxdaystokyo.com

私はDaniel Burka氏のワークショップとKevin Cheng氏のワークショップに参加しました。

#Daniel Burka氏のワークショップ
Daniel Burka氏のワークショップはDesign Sprintという5日間でプロトタイプ（試作品）を開発するという手法を解説したものでした。

##ワークショップに先立ち。。。なぜDesign Sprintを使うのか
###スタートアップ企業の問題点

- 様々なアイディアが出すぎること。
- アイディアの中で売り上げになるもの、ならないものの判別が難しい。
- 最初は何がいいアイディアかわからない。
- プロトタイプは作るのに以外と時間がかかる
- データ分析する時にわかりにくいことが多い
- 結局プロトタイプを作ることに効果があるかわからない。

####以下のサイクルを繰り返していいものにしていくはず。なのだが
![スクリーンショット 2016-04-24 17.06.02.png](https://qiita-image-store.s3.amazonaws.com/0/1553/aa01c29b-c6a8-cdd6-98d5-61c86551f1ae.png)

現実には
アイディアを出してみる→意外と開発に時間がかかる→リリース後の効果測定はよくわからず→で、どうなったんだっけ？となる。
![スクリーンショット 2016-04-24 17.23.55.png](https://qiita-image-store.s3.amazonaws.com/0/1553/af2a403b-53c8-ea82-177a-4d3f56591dd6.png)


そこで、Design Sprintではアイディア出しと効果測定にターゲットを絞る。
そうすることで、期間の圧縮をする。

![スクリーンショット 2016-04-24 20.49.59.png](https://qiita-image-store.s3.amazonaws.com/0/1553/1c30ed62-37e3-13ef-043e-209d5ff25026.png)

####Design Sprintでは通常5日間かけてプロトタイプを作る。

- 月曜日：Understand （課題を明らかにして、何にフォーカスするかを決める）
- 火曜日：Sketch（課題の解決方法を複数、紙にかきおこす）
- 水曜日：Decide（開発するものを決める）
- 木曜日：Prototype（開発）
- 金曜日：Research（効果測定）

####このワークショップでは1日に圧縮するので、以下のようなプロセスを踏む
- 月曜日：Understand
- 火曜日：Sketch
- 水曜日：Decide

####ルール
- PC・スマホを使わない（集中するため）
- 時間を区切る（ダラダラやらない）

##ワークショップ本題
####ワークショップの課題　東京で賃貸アパートを借りる良い方法を実現しよう

###月曜日 Understand
顧客の背景を集める。ビジネスゴールをメンバーで共有する
How Might We（HMW) .... を集める（フォーカスすべき課題）
HMWは広すぎて曖昧すぎても、意味が狭すぎてもダメ。
NG例：家の改装、青い箱を探す（具体的すぎる）
個人的な好みでもなく、あまりにも概念的なものではなく、あくまで具体的な解決方法を書いていく。

###方法
CustomerSupportチームへ、顧客がどのような問題を抱えているかをヒアリングしたり、既存のサービスで同じジャンルのものがあればパターンを見つけ出す。
その上でHMWをまとめる。

該当しそうなユーザにインタビューを行い、作るものに対する理解を深める。
ワークショップでは、過去一年以内に引越しをした人と不動産関連の仕事をしている人へのインタビューを行っていました。不動産関連の仕事をしている人へは、「どうやって自分の不動産を販売しているか」「ユーザはどのような情報を見ているか」などを質問し、過去一年以内に引越しをした人へは「引っ越した理由」「物件を見に行くためにはどうしたか」「不動産屋さんと話して役に立ったか」などを質問していました。


課題ではこのようなHMWが出されました。
- 夫婦間で探した物件の情報を共有する
- 家具を置いた時のシミュレーションができるようにする

この後、作成されたHMWをチームで集め、カテゴリー分けした上で、良いと思ったものを投票していく。
最初に小さいシールを貼っていき（こちらは枚数に制限なし）、その上で特にいいと思ったHMWには大きいシール（ひとり３枚）を貼っていく。


![capture.png](https://qiita-image-store.s3.amazonaws.com/0/1553/acdbd16b-8e23-9b92-0015-f817496e66b2.png)


####HMW(How Might We)とは
「How Might We」とは「どうしたら〜できるか」ということで、ある特定の理想状況を意図的に想定することで、思考の枠組みを大胆に組み替え、想像力を刺激しながらアイデアを出す方法として知られている。

####UserMapを作成する
ユーザーがとる行動をMapにまとめ、該当するHMW（多く投票されたもの）をMapに貼り付けていく。

課題では「物件を探して契約する」ためにとるアクションをまとめました。

![capture2.png](https://qiita-image-store.s3.amazonaws.com/0/1553/fbc9f965-0a3f-3eb4-8034-931e17bcd87b.png)

####ターゲットを決定する
UserMapの中で、どこ

###ポイント
インタビューは録音、録画しておき、メモ(HMW)の作成を行う。
ユーザはビジネス的な観点で選ぶ
リサーチで重要なのはスピード！

###火曜日 Sketch
月曜に作成したメモ(HMW)をもとにUserMap（物語）を作っていく。
1.ノートをとる
2.MindMapを作る
3.Crazy 8s
4.Story Concept

####1.ノートをとる

課題では、「物件を絞り込む作業を簡単にする」ということについて、ノートをとりました。

- 駅からの移動の負担
- 前に住んでいた人の意見
- 日中/夜間、平日/休日の様子

####2.MindMapを作る
「1.ノートをとる」でまとめたノートをもとにMindMapを作る作業を行います。
課題では、「1.ノートをとる」でまとめたノートを実現するためのマインドマップを作っていきます。


![スクリーンショット 2016-05-17 7.25.41.png](https://qiita-image-store.s3.amazonaws.com/0/1553/73f33919-3b46-fcb6-aa5a-bfe7632f1158.png)
営業マンが誰よりも MongoDB（最終回）

DataSpider & MongoDB 最終回です。
せっかくなので、もうちょっと遊んでみます。
***
###MongoDB にデータを追加
MongoDB(ドキュメント指向DB)の良さを思い出してみましょう。
「スキーマ定義をしなくても良い」という点ですね！

前回は2つのデータを入れましたが、いずれも同じスキーマでしたので、
ちょっと違うスキーマを持つデータを入れてみます。

>\> use sample
switched to db sample
>\> db.books.insert({id:3,title:"初めての PIMSYNC",price:80,author:"連携 太郎"})})
WriteResult({ "nInserted" : 1 })

今度は author というスキーマと一緒にデータを入れてみます。
こんな時でも DataSpider を使っていると連携は簡単です。
設定済みのアイコンを開いて、右下の「スキーマ定義の更新」ボタンを押すと先ほど定義したスキーマが追加されます。
<img width="345" alt="author.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/6ef167b3-58da-b472-f98d-cfc3176a4bed.jpeg">

###スキーマ定義がバラバラだった場合
ドキュメント指向DBの良さでもありますが、MongoDB はスキーマがいくらでも追加できてしまいます。
これは素人の想像ですが、似たようなスキーマを定義してしまう人がいるのではないでしょうか。例えばこんな感じに・・・
>\> use sample
switched to db sample
>\> db.books.insert({id:4,title:"DataSpider 問題集",kakaku:800})
WriteResult({ "nInserted" : 1 })

既に price というスキーマがあるのに kakaku というスキーマを作ってしまったとします。
当然、別々のスキーマのデータとして扱われますが、実際には kakaku も prise も同等に扱って欲しいデータのはずです。

ここで、DataSpider の「文字列連結」の機能を使います。
<img width="481" alt="文字列結合.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/ec5f955b-486d-1ecd-50a3-ecfa86194e40.jpeg">

この機能を使うと、kakaku のデータと price のデータを結合して出力してくれるため、どちらかのスキーマにデータが入っていれば、出力時には1つのカラムに出力してくれます。

例えば、
>id:2,title:"Thunderbus ガイドブック",price:300
>id:4,title:"DataSpider 問題集",kakaku:800

のデータがあった場合、文字列連結をせずにCSVで出力した場合には
>2,Thunderbus ガイドブック,300,
>4,DataSpider 問題集,,800

というように、空白のカラムを含んで出力されますが「文字列連結」を行った後に出力すると

>2,Thunderbus ガイドブック,300
>4,DataSpider 問題集,800

といったイメージで、無駄なカラムの出力が無くなります。素晴らしい！
***
###まとめ
DataSpider を使うとこのようにデータの加工もアイコンベースで設定できてしまうので、MongoDB のようにスキーマ定義が不規則な環境でもデータ連携が超簡単です！

ということで、私の Qiita デビュー作は以上で終了です。

DataSpider & MongoDB の組み合わせが気になった方は是非[アプレッソ](https://www.appresso.com/)まで。
MacでUnityアプリをAdreno GPU Profilerで見るまでの環境設定

結論：Windows版をオススメします

Adrenoインストールまで

http://qiita.com/mrhdms/items/9b8604764ff5049a7dc5

AndroidManifestに追記したいが、土台のAndroidManifestとして、ビルドしたら作られるTemp/StagingArea/以下のものをAssets/Plugins/Android/にコピー。ビルドが通ることを確認して、書きパーミッションを追記。

```
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.qti.permission.PROFILER" />
```

Adrenoを起動する。ADBが見つからないと表示されるので

http://qiita.com/furusin_oriver/items/f956848788c7a63922bd

私の場合はrun_profiler_macをSublimeText2で開いて、

```
#!/bin/sh
MONO_2105="/Library/Frameworks/Mono.framework/Versions/2.10.5/bin/mono"
if [ -e "$MONO_2105" ]
then
APP_PATH=`echo $0 | awk '{split($0,patharr,"/"); idx=1; while(patharr[idx+3] != "") { if (patharr[idx] != "/") {printf("%s/", patharr[idx]); idx++ }} }'`
cd "$APP_PATH/Contents/Resources"
if [ ! -d "./bin" ]; then mkdir bin ; fi
if [ -f "./bin/AdrenoProfiler_Mac" ]; then rm -f "./bin/AdrenoProfiler_Mac" ; fi
ln -s $MONO_2105 "./bin/AdrenoProfiler_Mac"

export PATH=$PATH:/Applications/adt-bundle-mac-x86_64-20140702/sdk/platform-tools

export MONO_MWF_MAC_FORCE_X11="1"
export GPU_DRIVER_PATH="/System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries/libGL.dylib"
export DYLD_FALLBACK_LIBRARY_PATH="/System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries:$DYLD_FALLBACK_LIBRARY_PATH:/usr/lib"
"./bin/AdrenoProfiler_Mac" AdrenoProfiler.exe&
else
/usr/bin/osascript <<-EOF
tell application "System Events"
display alert "Adreno Profiler for Mac requires mono runtime version 2.10.5." as warning
end tell
EOF
fi

```

パスを追加する。Terminalではもともとパスが通っているのでrun_profiler_mac内に書いた。
再度Connectしてみると、Found a deviceと表示されたのでadbのパスはクリア。しかし
but no adreno profiler-enabled appと表示されている。
AndroidManifestに

```
<uses-permission android:name="android.permission.INTERNET" />
```

が含まれているのにおかしい。WWWを明示的に使用してネット接続を有効にする。サンプルコードは

```csharp
using UnityEngine;
using System.Collections;

public class WWWDummy : MonoBehaviour {

	public string url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";

	void Start () {
		WWW www = new WWW (url);
	}
}
```

これでAdrenoに端末が認識され、Connectが成功する。Scrubber GLを押す。しかし
The OpenGL version supported by your graphics card is too low to profile GLES 3.0
と表示される。NVIDIA GeForce GT 750Mなので古くないし、MacのUpdateもしたのでGPUのドライバも最新のはず。
Windowsで試してみると、Adrenoを入れるだけで動いた。AdrenoでCapture Frameを押すと数秒後に解析結果が表示される。Windowsの場合だと端末の画面が表示されるが、Macだと端末の画面が表示されない。ただ、他の値は同じように表示されているようだ。例えばCommentsタブを見ると「圧縮されていないテクスチャがあるからパフォーマンスが悪い」などが書いてある。
MacでAdrenoが、ほぼ動いた状態です。
その後、各値を見ようと操作するとほぼ落ちます。Windowsでリトライしてみると、端末画面が表示され、測定ができました。

# 使い方

* Adreno Profiler起動
* Connectで端末と接続
* Scrubber GLを押す
* 測定したいフレームでCapture Frameを押す。右下にプログレスバーが表示されるので待つ
* Texture Browserにテクスチャ一覧が表示されるのでFormatを確認したり、全テクスチャをbmpで一括保存したりできる
* 他にも、全glDrawElementsの呼ばれた回数もパフォーマンス指標になるでしょう
Github | ユーザーのコメント内容から PR を検索する

# 問題

「あれ、あのコメントついてたの、どのPRだっけ」と探しまわったことはないだろうか。
実は Gitnub ではユーザーのコメント内容からも検索出来る。

# 解決

PRやissueのフィルタ欄に `[KEYWORD]　in:comments` と打てばOK。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/bd0f3170-f165-4ff6-65f1-d330fc76b348.png)

「コード内のコメント」ではなく「Github 上でのコメントのやり取り」から検索して、PRや issue を表示してくれる。

# 参考

- https://help.github.com/articles/searching-issues/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Mac OS X El Capitan (10.11.5)に python3.x 系をインストールする

タイトルの通り、MacOS Xにpython3.x系をインストールしようとしたが、
他の方がQiita内に書いてる方法でいきなりエラーで躓いたのでエラー内容と対策をまとめます。

# 環境
- MacOS X 10.11.5
- Homebrewインストール済

# 失敗からはじまる

http://qiita.com/spyc/items/73d1295f8b3dde3b49ca
を参考にしたが、最初のpyenvのインストールでエラーが発生。


`brew install pyenv`
→　`Error: undefined method `<' for nil:NilClass`

# こちらの手順に従うことに
https://oku.edu.mie-u.ac.jp/~okumura/python3/install.html
AWS Lambda上でサーバ時刻がよくわからないことになって困った話

↓の記事を元にElasticSearchにRDSのスロークエリログを取り込もうとしていた時に困ったこと。
http://dev.classmethod.jp/cloud/aws/rds-mysql-slowquerylog-to-es/


RDSのログは仕様上1時間毎にローテーションされ、
slowquery/mysql-slowquery.log.xx
の形で保存されます。
xxの部分は、UTCの時刻でxx時までのログ、という形。
つまるところ、UTCの時刻で0000〜0059までのログだったらxxは1
0100〜0159だったらxxは２、という感じ。
あくまでもUTCの時刻なので、JSTの時刻からは-９時間してやる必要があります。

該当の記事では、サーバ時刻を使用して、その１時間前のログを対象にする、
といった処理にしているのですが、これをそのまま使用したところハマってしまいました。
あれれー、スロークエリ発生させてみたはずなのに入ってたり入ってなかったりするぞー。

# 何度も同じログを参照している

若干ソースをいじってどのスロークエリログを対象にしているかCloudWatch Logsに吐き出させてみたのですが、なんと何時間か同じログを参照していました。
Scheduled Eventで１時間毎に動かしていたのですが、３時間ぐらいずつ、同じログを見ていた模様。

ソース上では下記のように、pythonのプログラムでサーバ時刻を取得して動的に対象ファイル名を変化させています。
以下は抜粋です。

```py:ソース抜粋
import boto3
import re
import os
import json
from datetime import datetime
from dateutil import tz, zoneinfo
from botocore.awsrequest import AWSRequest
from botocore.auth import SigV4Auth
from botocore.endpoint import PreserveAuthSession
from botocore.credentials import Credentials

R = re.compile(TIME_REGEX)
NOW = datetime.now()
INDEX = INDEX_PREFIX + "-" + datetime.strftime(NOW, "%Y%m%d")
TYPE = RDS_ID
SLOWQUERYLOG_PREFIX = "slowquery/mysql-slowquery.log."

def lambda_handler(event, context):
    client = boto3.client("rds")
    db_files = client.describe_db_log_files(DBInstanceIdentifier=RDS_ID)

    log_filename = SLOWQUERYLOG_PREFIX + str(NOW.hour)
```

でも、対象ファイルが同じということは、サーバ時刻の取得のところが何かおかしいのかなと思い、
今度はNOWの時刻をCloudWatch Logsに吐き出させてみました。

# サーバ時刻が３時間ぐらい変わっていない！

確認したところ、１時間毎に動かしている処理が、３回ずつぐらい全く同じ時刻を出していました。
それも寸分違わず。（すいませんがログはここには貼れません…。）
そりゃ同じログ参照しちゃいますね…。
軽く探してみたものの同現象に遭遇している人はすぐ見つからず。
同じようなことになった方いらっしゃいませんかね？

# Lambda上でサーバ時刻を取得してはいけない？

上記のような問題があるために、サーバ時刻を取得して利用しようと思うと想定と違った挙動になってしまいます。
Lambdaはサーバ管理のあたりがブラックボックスなのでこのあたりどうなってるのかよくわかりませんね

## とりあえず、ntpサーバから時刻取得
現在時刻を取得して何かに利用する処理を入れたいときは、
ntpサーバから時刻を取得したほうがよさそうです。
そうすると今度はntpサーバからの時刻取得に失敗した際どうするのか、
というのを考慮しなければいけませんが…。

# 解消方法
（2016/07/14追記）
コメントにてご教示いただいた内容を追記。

どうやらlambda_handlerの中で現在時刻を取得すれば問題なく動きそうです。  
それを元に修正するとこんな感じでしょうか。

```py:修正したもの
import boto3
import re
import os
import json
from datetime import datetime
from dateutil import tz, zoneinfo
from botocore.awsrequest import AWSRequest
from botocore.auth import SigV4Auth
from botocore.endpoint import PreserveAuthSession
from botocore.credentials import Credentials

R = re.compile(TIME_REGEX)
INDEX = INDEX_PREFIX + "-" + datetime.strftime(NOW, "%Y%m%d")
TYPE = RDS_ID
SLOWQUERYLOG_PREFIX = "slowquery/mysql-slowquery.log."

def lambda_handler(event, context):
    client = boto3.client("rds")
    db_files = client.describe_db_log_files(DBInstanceIdentifier=RDS_ID)
    NOW = datetime.now()
    log_filename = SLOWQUERYLOG_PREFIX + str(NOW.hour)
```

試してみて、ntpサーバからの時刻とほぼ同時刻であることを確認しました。
多重共線性

#多重共線性とは

多重共線性 multicollinearity  　　(Weblio辞書）
　説明変数間に非常に強い相関があったり，一次従属な変数関係がある場合には，解析が不可能（「逆行列が求まりません」というエラーメッセージが出力される）であったり，たとえ結果が求まったとしてもその信頼性は低い。このような場合に多重共線性があると言われる。

　簡単にまとめると、行列は1次独立でない状態（1次従属）なら、多重共線性を持つ。

#1次独立と1次従属
ベクトル$$x_1,x_2,\cdots$$

式①$$\sum_{k=1}^n a_k x_k\=0$$

$a_1\=0,a_2\=0,\cdots,a_n\=0$ がこの式の唯一の解であれば、1次独立となる。
$a_1\=0,a_2\=0,\cdots,a_n\=0$ 以外に他の解が存在すれば、1次従属となる。

#1次従属の性質と判断基準
$X\=[x_1,x_2,\cdots,x_n]$ の情報行列 $t(X)*X$ の行列式は0である。

##多重共線性①
式①の解が $A\=[1,−\alpha,0,\cdots,0]$ となるとき、
$$x_1\={\alpha}x_2$$
このパターンはよく知られている。以下の性質を持つ。
Ⅰ．$X$の情報行列 $t(X)*X$ の行列式は0である。

Ⅱ．説明ベクトル $x_1,x_2$ の相関係数の絶対値は1となる。
$$\left|cor(x_1,x_2)\right|\=1$$

Ⅲ．$x_1,x_2$ が他の説明ベクトル $x_k,k\neq1,2$ との相関係数の比の絶対値は1となる。（$x_1,x_2$ と $x_k$ 独立でない場合）
$$\frac{\left|cor(x_1,x_k)\right|}{\left|cor(x_2,x_k)\right|}\=1$$
または、その相関係数は0である。（$x_1,x_2$ と $x_k$ が独立である場合）
$$cor(x_1,x_k)\=cor(x_2,x_k)\=0$$

##多重共線性②
式①の解が $A\=[1,-\alpha_1,-\alpha_2,0,\cdots,0]$ となるとき、
$$x_1\={\alpha_1}x_2+{\alpha_2}x_3$$
説明ベクトル $x_1$ が他の2つ以上の説明ベクトルで説明できる場合、性質Ⅰだけが満たされる。性質ⅡとⅢは満たされない。
Ⅰ．$X$の情報行列 $t(X)*X$ の行列式は0である。 

Ⅱ．説明ベクトル $x_1,x_2$ の相関係数の絶対値は常に1ではない。
$$\left|cor(x_1,x_2)\right| \= \left|\frac{cov(x_1,x_2)}{ \sqrt{var(x_1)var(x_2)} }\right| \= \frac{1}{\left|\sqrt{1+\frac{{\alpha_2}^2var(x_3)}{{\alpha_1}^2 var(x_2)}}\right|} \<{1}$$
明らかに、性質Ⅱが満たされない。ただし、${\alpha_2}^2var(x_3)$ が ${\alpha_1}^2var(x_2)$ に対し、無視できるなら、
$$\frac{{\alpha_2}^2var(x_3)}{{\alpha_1}^2var(x_2)}\simeq0$$
説明ベクトル $x_1,x_2$ の相関係数の絶対値はほぼ1となる。
$$\left|cor(x_1,x_2)\right|\simeq1$$
Ⅲ．性質Ⅱと同じ条件で成り立つ。

#シミュレーション
完全に独立な2列ベクトル $x_2,x_3$ を作る。多重共線性①と②の性質Ⅰ〜Ⅲをチェックする。
ケース1：
多重共線性①　$x_1\=0.5*x_2$ で $x_1$ を作る
ケース2：
多重共線性②　$x_1\=0.5*x_2+0.5*x_3$ で $x_1$ を作る（$x_3$の分散が無視できない）
ケース3：
多重共線性②　$x_1\=0.5*x_2+0.5*x_4$ で $x_1$ を作る（$x_4$の分散が無視できる）
ケース4：
多重共線性を持たない　$x_1\=0.5*x_2+0.5*x_3$ で $x_1$ を作る ($x_3$を行列から外す)

||ケース1|ケース2|ケース3|ケース4|
|:--:|--:|--:|--:|--:|
|行列式|0|8.6805e-06|-7.2958e-06|4664419|
|$x_2$との相関|1|0.6331|0.999988|0.6331|
|$x_3$との相関|0.0094|0.7799|0.0095|-|
|$x_4$との相関|0.0047|0.0283|-0.0203|-0.0195|
|$x_1,x_2$と$x_3$との相関比|1|-|1.0207|-|
|$x_1,x_2$と$x_4$との相関比|1|1.2669|-|0.3522|

#結論
性質Ⅰ
ケース1,2,3の行列式はほぼ0であるので、多重共線性を持つ。ケース4が多重共線性を持たない。
性質Ⅱ
ケース1とケース3は、$x_2$との相関係数が1に近い。
ケース2は多重共線性を持っているが、$x_2$との相関係数は1ではない。しかも、$x_3$との相関係数も1ではない。
ケース4は多重共線性を持たないが、$x_2$との相関係数はケース2と同じだ。
性質Ⅲ
ケース1とケース3は、他の説明変数列との相関係数比が1に近い。

結論は、
1．性質Ⅰが満たされる場合、多重共線性を必ず持つ。
2．多重共線性を持つ場合、性質Ⅱと性質Ⅲが必ずしも満たされない。

#コード

```r
n <- 4  #　説明変数の数
t <- 1000  #  データの数
X <- matrix(0, t, n )
X[,2] <- rep(c(1,3,6,7,1,2,3,4,5),length=t)  
X[,3] <- rep(c(3,4,6,9,2),length=t)
X[,4] <- rnorm(t,0,0.01)
X[,1] <- 0.5*X[,2]+0.5*X[,4]　#  ケース1～4の条件による。
In <- t(X) %*% X  #  情報行列
det(In)  #  行列式
cor(X)  #  相関係数
cor(X)[,1]/cor(X)[,2] #  相関係数の比
```
SoftLayer Object Storageの課金について

#SoftLayerに聞いてみる前に
Object Storageの課金について、チケットで聞いてみました。
Object Storage APIとの通信方法に以下の2種類があります。

- Private API Endpoint
    - プライベートネットワーク経由のファイルのアップロード/ダウンロードは、**完全無料**です。もちろんオブジェクトスペースの保管料はかかります。（$0.04/GB/月、DCにより異なる単価が設定されています。）
- Public API Endpoint
    - パブリックネットワーク経由のファイルのアップロード/ダウンロードには、下図のような通信課金になっています。
    - 預けるのは無料ですが、引き出すのには手数料がかかる。銀行方式です。（[柔らか層本、P58](https://www.ibm.com/developerworks/community/files/form/anonymous/api/library/b1409dc8-fbc4-4d02-b799-b70334c67b92/document/91df8465-51c6-4ec2-a338-b32982fec202/media/%E6%8A%80%E8%A1%93%E3%82%88%E3%82%8A%E3%81%AA%E4%BA%BA%E3%81%8C%E6%9C%80%E5%88%9D%E3%81%AB%E8%AA%AD%E3%82%80%EF%BC%9A%E6%9F%94%E3%82%89%E3%81%8B%E5%B1%A4%E6%9C%AC.1.8.pdf)）<img width="586" alt="スクリーンショット 2016-06-27 17.56.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/3502be6f-2367-af26-8bc1-15e773f163c2.png">
    - データ通信（出力）のことをアウトバウンドと呼んでいますが、アウトバウンドには課金が発生し、**$0.09/GB**かかります。（1GBあたり10円ですね。DCにより異なる単価が設定されています。）（http://www.softlayer.com/jp/object-storage）

#SoftLayerに聞いてみた
##質問
Public API Endpointに対して、GETとかPUTをした場合のレスポンスは、アウトバウンド課金に含まれますか？
たとえば

- PUT --upload-fileをすると返ってくるResponse(ErrorとかOKとか)
- GET container(URL)をすると返ってくるオブジェクトリスト

APIでファイルリストを見るだけでアウトバウンド課金されてしまっては困ると思い、聞いてみました。

##回答
>Object Storage pricing model is based on exact capacity you consumed.
That is, you are **only charged by the amount of objects occupying the container and when you download them through public network.** 

>Uploading and using private network are not metered and free of charge.
Likewise, those queries you made are not billed as it seems simply getting the status and has not to do with downloading actual files/images.

>Sales Engineer, SoftLayer

要するに課金対象となるのは、以下の2つだけということでした。

- オブジェクトストレージ保管料
- パブリックネットワーク経由のオブジェクトファイルダウンロード

これでみなさん安心してオブジェクトストレージを使えますね。
Rails:PaperclipにURLで画像を入れたらcontent_typeが違うと怒られた

# 経緯
PaperclipにURLで画像を登録したら、一部の画像がContent typeのvalidationで弾かれた。

Railsは4.2.6、Paperclipは4.3.6でした。

# エラーメッセージ
```sh
[paperclip] Content Type Spoof: Filename 1467013624.jpg 
(application/octet-stream from Headers, ["image/jpeg"] from Extension), 
content type discovered from file command: image/jpeg. 
See documentation to allow this combination.
```

レスポンスヘッダはapplication/octet-streamだけど拡張子から推測するにimage/jpegだよね？変でしょ？直して！ってことらしい。

# issueになってた
https://github.com/thoughtbot/paperclip/issues/1429

Content Type Spoofのエラーを出さない方法は、
config/initializer/paperclip.rbに

```rb
require 'paperclip/media_type_spoof_detector'
module Paperclip
  class MediaTypeSpoofDetector
    def spoofed?
      false
    end
  end
end
```
こう書くらしい。
確かにエラーは出なくなった。
でもまだvalidationで弾かれる。

# 原因
こんなふうに書いてた

```rb
data = Paperclip.io_adapters.for(url)
data.original_filename = url
Image.new(image: data)
```
ここで

```rb
puts data.content_type
```
すると、

```shell-session
application/octet-stream
```
って返ってくる。
image/*じゃないからダメだったらしい。

じゃあこのエラーメッセージはどうやってimage/*のcontent typeをゲットしてるんだろうとエラー元を見てみた。
そしたらファイル名からcontent typeを教えてくれるのを見つけた。
https://github.com/thoughtbot/paperclip/blob/e60f00027704298455c039e111d96bcf46e12822/lib/paperclip/media_type_spoof_detector.rb#L57

というわけで

```rb
data = Paperclip.io_adapters.for(url)
data.original_filename = url
data.content_type = MIME::Types.type_for(url).first.content_type
return Image.new(image: data)
```
こうなった。
MIME::Types.type_for(url)はArrayで返ってくるみたいだから最初を取り出した。

めでたし。
fluent-logger-phpを使わずPHPのcURLだけでログを送信したときのメモ

# fluent-logger-phpを使わずPHPのcURLだけでログを送信したときのメモ

Composerで入れた fluent-logger-php を使って TreasureData にログを送信したときは `port: 24224` に送信していたけど
直接curlコマンドやPHPのcURLを使うときは `port: 8888` に送信するらしい。

## cURL を使った時

```php
/**
 * TDデータ送信
 */
$td_logs_array = array();
$td_logs_array['uid'] = $_COOKIE['uid'];
$td_logs_array['hoge'] = $_GET['hoge'];
$td_logs_array['ip'] = $_SERVER['REMOTE_ADDR'];
$td_logs_array['ua'] = $_SERVER['HTTP_USER_AGENT'];

$json_data = json_encode($td_logs_array);

$ch = curl_init('http://td-agent-server:8888/td.hoge_logs.fuga_log');
$defaults = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => array("json" => $json_data)
);

curl_setopt_array($ch, $defaults);
curl_exec($ch);
curl_close($ch);
```

## file_get_contents を使った時

```php
$td_logs_array = array();
$td_logs_array['uid'] = $_COOKIE['uid'];
$td_logs_array['hoge'] = $_GET['hoge'];
$td_logs_array['ip'] = $_SERVER['REMOTE_ADDR'];
$td_logs_array['ua'] = $_SERVER['HTTP_USER_AGENT'];

//POSTデータ
$data = array(
    "json" => json_encode($td_logs_array)
);
$data = http_build_query($data, "", "&");

//header
$header = array(
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: ".strlen($data)
);

$context = array(
    "http" => array(
        "method"  => "POST",
        "header"  => implode("\r\n", $header),
        "content" => $data
    )
);

$url = "http://td-agent-server:8888/td.hoge_logs.fuga_log";
echo file_get_contents($url, false, stream_context_create($context));
```

[覇王色を求めて file_get_contentsでPOSTデータ送信](http://d.hatena.ne.jp/ryster/20070907/1189148449)を参考にしました。
Linux — 既に存在するディレクトリを mkdir しようとしたときのエラーを無視する ( $ mkdir -p )

```bash
mkdir -p some_dir
```

と書けば、何度やっても怒られない。

実際にはエラーを無視するのではなく「既にディレクトリが存在する場合は何もしない」という動作らしい。


## Help

```
$ man mkdir | cat

MKDIR(1)                  BSD General Commands Manual                 MKDIR(1)

NAME
     mkdir -- make directories

SYNOPSIS
     mkdir [-pv] [-m mode] directory_name ...

...

     -p      Create intermediate directories as required.  If this option is
             not specified, the full path prefix of each operand must already
             exist.  On the other hand, with this option specified, no error
             will be reported if a directory given as an operand already
             exists.  Intermediate directories are created with permission
             bits of rwxrwxrwx (0777) as modified by the current umask, plus
             write and search permission for the owner.
```

# 参考

- http://stackoverflow.com/questions/793858/how-to-mkdir-only-if-a-dir-does-not-already-exist








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
scala-sshを使ってリモート先でsudoコマンドを実行する方法

scala-sshを使ってリモートサーバにアクセスして、sudoコマンドを使おうと思ったら詰まったのでメモ。

sudo使ってlsコマンドを叩きたかったわけではないけど、手軽だったため今回はlsでサンプルを用意した。

```
val command = "ls -l"
SSH("<リモートサーバーのホスト名>") { client =>
  val li = client.exec(command).right.map { res => res.stdOutAsString()
  println(li)
}

---
Right(total 0
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:13 1.txt
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:14 2.txt
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:14 3.txt
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:14 4.txt
)
```

sudoで実行しようとしても

```
val command = "sudo ls -l"
SSH("<リモートサーバーのホスト名>") { client =>
  val li = client.exec(command).right.map { res => res.stdOutAsString()
  println(li)
}

---
Right()
```

何も帰ってこなくなる。エラーとか警告すらでない。

```
val command = "sudo ls -l"
SSH("<リモートサーバーのホスト名>") { client =>
  val li = client.execPTY(command).right.map { res => res.stdOutAsString()
  println(li)
}

---
Right(total 0
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:13 1.txt
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:14 2.txt
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:14 3.txt
-rw-rw-r-- 1 fuppi fuppi 0 Jun 27 17:14 4.txt
)
```

exec -> execPTYに変えたら実行できた。
エラーも警告もないというのが辛かった・・・
C++からRubyを呼び出す


環境
-----

```
$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

$ pkg-config --version
0.29.1

$ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]
```

```main.cpp
#include <ruby.h>

int main() {
  // Rubyインタプリタの初期化
  ruby_init();

  // スクリプトの実行
  rb_eval_string("print 'Hello World!'");

  // Rubyインタプリタのクリーンアップ
  ruby_cleanup(0);
}
```

Build
-----

```
$ g++ `pkg-config --cflags ruby-2.3` -lopencv_core -lopencv_highgui -lopencv_imgproc main.cpp `pkg-config --libs ruby-2.3`
```

Usage
-----

```
$ ./a.out
Hello World!%
```

参考資料
-----

* https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h
* http://funktor.org/programming/cpp/embedding-ruby.ja.html
JXAで日本語入力のエミュレーション

```js:virtualTyping.scpt
ObjC.import('Foundation')
ObjC.import('Carbon')

function virtualTyping(source) {
  if (!source) {
    throw new Error('Missing source')
  }
  if (typeof source !== 'string' || source.trim().length === 0) {
    throw new Error('Invalid source')
  }
  const str = $.NSString.alloc.initWithString(source)
  for (var i=0; i < str.length; i++) {
    const event = $.CGEventCreateKeyboardEvent($(), 0, true)
    const oneChar = Ref('unsigned short')
    oneChar[0] = str.characterAtIndex(i)
    $.CGEventKeyboardSetUnicodeString(event, 1, oneChar)
    $.CGEventPost($.kCGSessionEventTap, event)
  }
}

const source = `
祇園精舎の鐘の声、諸行無常の響きあり、沙羅双樹の花の色、盛者必衰の理をあらはす。驕れる者久しからず、ただ春の夜の夢の如し。猛き人もつひには滅びぬ、ひとへに風の前の塵に同じ。 

遠く異朝をとぶらふに、秦の趙高、漢の王莽、梁の朱い、唐の禄山、これらは皆旧主先皇の政にも従はず、楽しみを極め、諌めをも思ひ入れず、天下の乱れん事をも悟らずして、民間の憂ふる所を知らざりしかば、久しからずして亡じにし者どもなり。 

近く本朝を窺ふに、承平の将門、天慶の純友、康和の義親、平治の信頼、これらは驕れる事も猛き心も、皆とりどりなりしかども、間近くは、六波羅の入道前の太政大臣平の朝臣清盛公と申しし人の有様、伝へ承るこそ、心も言も及ばれぬ。その先祖を尋ぬれば、桓武天皇第五の皇子、一品式部卿葛原の親王九代の後胤、讃岐守正盛が孫、刑部卿忠盛の朝臣の嫡男なり。 

かの親王の御子、高視の王無官無位にして失せ給ひぬ。その御子高望の王の時、初めて平の姓を賜はつて、上総介になり給ひしよりこのかた、忽ちに王氏を出でて人臣に連なる。その子鎮守府の将軍良望、後には国香と改む。国香より正盛に至るまで六代は、諸国の受領たりしかども、殿上の仙籍をば未だ許されず。
`

virtualTyping( source.trim() )
```

プレゼンやUIテスト等で利用すると便利かもしれません。
Androidで OpenCV

# この文書について
Androidで OpenCVを使った画像処理を行う実験をしたときのメモ。

あとでもうちょっと親切に書くかもしれないけど、とりあえず howmに書き溜めた箇条書きをちょっと整形しただけ。

# 手順

## OpenCV Android SDKを入手
https://sourceforge.net/projects/opencvlibrary/files/opencv-android/

今回落としたのは 3.1.0。適当なところに展開しておく

## OpenCV Managerをインストール
どちらかやりやすい方で

 * SDKの中に入っている apkを adb install
 * google playからインストール

※ OpenCVのライブラリは大きいので、 OpenCV Managerがライブラリを管理してアプリケーションはそれを参照する、という形にしているらしい。商用のアプリケーションだと一つのパッケージに収まっている方が好ましいだろうが、今回は実験なのでその方法は見送り。

## プロジェクト作成
OpsnCVStudyとか。 Minimum API Levelは 8とかでも大丈夫っぽい。

### OpenCVライブラリ 310をインポート

 * File → New → Import Module
 * SDKのディレクトリ下にある sdk/javaを選択
 * モジュール openCVLibrary310をインポート
 * インポート直後のビルドでエラーが出るが気にしない

### manifest
manifestに以下を追加。プロジェクトの API levelが低い時に出るエラーを抑制する

```
    <uses-sdk tools:overrideLibrary="org.opencv"/>
```

### build.gradle(app)
openCVLibrary310への依存関係を追加

```
    dependencies {
        ...
        compile project(':openCVLibrary310')
        ...
    }
```

### build.gradle(openCVLibrary310)
compileSdkVersion, targetSdkVersionを最新のものにする。これでインポート時に出ていたエラーが消える


### アクティビティ実装
Launch Activityの onResumeでライブラリをロードする。 mLoaderCallbackはコードアシストが適当に生成してくれる

```java
    @Override
    protected void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            boolean ret = OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
            if (!ret) {
              // OpenCV Manager does not exist
            }
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }
```
CentOS6系でAnsible1.9系をインストールする手順

# CentOS6系でAnsible1.9系をインストールする手順

Ansibleの2.1系がまだ不安定そうなので、1.9系のインストール手順をあらためてまとめてみました。

## EPELからインストールする場合

EPELのansibleパッケージが2.1系になって1.9系のパッケージはリネームされてしまったみたいで以前とパッケージ名が変わっています。

```
# yum -y install epel-release
# yum -y install ansible1.9
```

※ CentOS7系も上記の手順でできそうです。

## pipからインストールする場合

pipでの手順は以下を参考にしました。

- [pythonのsetuptoolsをインストールする](https://blog.cloudpack.jp/2015/11/16/install-setuptools-of-python/)
- [CentOS 6.5 の python-setuptools で pip が動かなくなった件 | CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/72664567612/centos-65-%E3%81%AE-python-setuptools-%E3%81%A7-pip-%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E4%BB%B6)
- [pip で Ansible がインストール出来ない。 - Qiita](http://qiita.com/takeshi_ok_desu/items/1e55942b05983b341981)
- [AttributeError: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC' - 鯖缶](http://centos.sabakan.red/entry/2015/03/11/103732)

```
# yum -y remove python-setuptools python-crypto
# yum -y install wget python-devel libffi-devel openssl-devel gcc
# wget https://bootstrap.pypa.io/ez_setup.py -O - | python
# easy_install pip
# pip install ansible==1.9.6
```

※ CentOS7系は下記の手順でできそうです。

```
# yum -y install python-setuptools python-devel libffi-devel openssl-devel gcc
# easy_install pip
# pip install ansible==1.9.6
```
誰も遭遇しないかもしれないFireFoxのform.elementsのバグ

発見したのは半年くらい前ですが、現在の最新バージョンFireFox 47.0 でも発生します。

HTMLFormElement.elementsはフォーム配下のコントロールにname属性、id属性のどちらからでもアクセスできるコレクションです。
しかし、id属性とname属性が同じ値だった場合に限り、id属性を削除するとname属性でのアクセスも出来なくなってしまいます。

```html
<!DOCTYPE html>
<html>
<head>
  <script>
    var elem = document.getElementById("text1");
    elem.removeAttribute("id");
    elem = document.forms[0].elements["text1"];
    alert(elem); // undefined (IE、chromeでは取得出来る)
  </script>
</head>
<body>
  <form>
    <input type='text' name='text1' id='text1' />
  </form>
</body>
</html>
```

ちなみに以下の手順を踏むとidを削除してもelementsからnameで取得出来るようになりました。

1. id属性を別の値に変更する。
*  name属性を別の値に変更した後元に戻す。
*  id属性を削除する。
パスワード暗号化＆保存方法について調べてみた

# パスワード保存時の暗号化の基本

```
ハッシュ（パスワード文字列をハッシュ化　shaとか色々ある）
ソルト（付加文字）
ストレッチ（複数回、暗号化を繰り返す）
```

# パスワードアルゴリズムの変更に対応するために

```
$1$hogehoge
```

ハッシュ値の保存時に、パスワードの保存方式を示すマークを
付けたりするようです。上記だと、「**\\$1\\$**」の部分。

# 実践的な方法（[参考記事](http://tech-blog.tsukaby.com/archives/704)）

## アルゴリズムは実行時間の長いBCryptとかが良い
shaアルゴリズムだと、計算スピードが速いので、億の回数試すとか簡単に出来てしまうらしい。

## ソルトとかストレッチ

引用
> 生成したソルト = \\$2a\\$10\\$SvWYQgx/AKizANy.tp6zDu
> ハッシュ化したパスワード = \\$2a\\$10\\$SvWYQgx/AKizANy.tp6zDulPku8eglSnopMcyi5cIRQY1Efa6cIUW
> hogePassword1234の検証結果 = true
> hogePassword12345678の検証結果 = false
> 
> \\$2a\\$10\\$という部分の2aがバージョン（特に意味無し）で、
> 10という部分がストレッチングの回数(累乗ですので、2^10 = 1024)です。

ソルトとストレッチ回数をパスワードに含めると、アルゴリズムの変更
にも耐えられます。

また、上記を見ただけでは「どこからがソルトで、どこからがhashか？」
書いてなければ、分からない状態になっています。

## 基本的な考え方
[参考記事](http://blog.f-secure.jp/archives/50564743.html)

引用
> 攻撃者が各反復で全アカウントに対して試せるようにするのではなく、
> 各アカウントに個別にフォーカスさせるよう
> 各ユーザに対してユニークなsalt値と反復カウントを用意することだ。

なるほど。

## まとめ
参考記事にも書いてありますが、将来まで絶対安全な方法は無いというのを
踏まえて、まとめると

* 暗号化方式を変えられるようにすること
* 全アカウント異なるソルト・反復カウントを使うこと
* ある程度実行に時間が掛かるアルゴリズムを使うこと

という感じでしょうか。

他に、「もっとこういうのもあるよ」的なのがあれば、
気軽にコメントおねがいしますm(_ _)m
devise でアカウントのステータスに応じてログイン不可にする


例えば User モデルを使用している場合、以下のように active_for_authentication? メソッドをオーバーライドする

```app/models/user.rb
  def active_for_authentication?
    super && status_enable?
  end
```

あと、メッセージを変更したい場合は以下のように inactive_message メソッドをオーバーライドする

```app/models/user.rb
  def inactive_message
    status_enable? ? super : :status_disabled
  end
```

メッセージの文言は config/locale/devise.ja.yml に登録する（上記シンボルの部分に直接メッセージを書いても良い）