OmniAICreator/Qiita-1.07M huggingface dataset:
Provisioning Profileによってコンパイル対象を差し替える

外部サービスなどと連携する際に使用するライブラリで本番環境とステージング環境で別々の設定値を用意し、都度切り替える事はよくあるかと思います。

しかし、ライブラリの中には~~気が利かない~~環境による設定値の変更がしづらいものがごくたまにあります。
例えば、ライブラリのファイル群の中に特定のファイル名でjsonファイルが用意され、その中の設定値をライブラリが参照している場合など。
ランタイム時に動的に切り替えるようなことができない為、なかなか辛いですが、
コンパイル前に対象のファイルを差し替えることで対応ができました。

## 各環境用設定ファイルを作成
例えば、ライブラリの構成が以下の通りになっているとします。

```
/SampleLibrary
├ SampleLibrary.a
└ SampleConfig.json
```
これを

```
/SampleLibrary
├ SampleLibrary.a
├ SampleConfig.json
├ prod
│ └ SampleConfig.json
└ dev
  └ SampleConfig.json
```
とします。本番環境用開発環境用の設定ファイルを用意しておきます。

## add Run Script
XcodeのBuild Phaseの左上の**"+"**ボタンより**New Run Script Phase**を選択し、Scriptを追加します。
<img width="1129" alt="スクリーンショット 2016-11-10 11.12.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/33817/d682ddbb-8f02-67b4-ea73-1e8155df7b3d.png">

追加されたBuild Phaseの「Type a script or drag a script〜」の部分にスクリプトを追加します。
<img width="906" alt="スクリーンショット 2016-11-10 11.16.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/33817/b34ab699-7f53-65aa-3272-5657ceae2c94.png">

## Build Phaseの実行順を変更

重要なのは作ったBuild PhaseをD&Dして、**Compile Sources(xxx items)** Phaseより前に実行させる事です。
コンパイルされる前にファイルを差し替える必要があります。

## Provisioning Profileを見てConfigファイルを差し替える
今回は本番環境、及び開発環境の判定をProvisioning Profileを参照して判定します。
以下のスクリプトを追加したBuild Phaseに書きます。パスなどは適宜差し替えて下さい。

```bash
cd "${SRCROOT}"/Sample/SampleLibrary

# 設定ファイルをProvisioning Profileに応じて変更する
if [ ${PROVISIONING_PROFILE} = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ]; then
cp -f ./prod/SampleConfig.json ./
else
cp -f ./dev/SampleConfig.json ./
fi
```
上記`"xxxxxxxx-xxxx〜`の部分をリリースに使用するDistribution Provisioning Profileのファイル名を指定します。
こちらはXcodeのPreferenceから
`Accounts > Apple IDを選択　> Teamを選択 > View Details... > Provisioning Profileを右クリック > Show Finder`から取得可能です。

## 終わり
後はRunするなりArchiveするなりすればProvisioning Profileによって切り替えされると思います！
切り替え対象のファイルが都度差分になるので、gitignoreなどでコミット対象から外してしまうのがいいかと思います。
Provisioning Profileの更新によって都度書き換えなければならないのでベストプラクティスではないのですが、こういうこともできるよ・・という話でした。
Cognos BI とLTPAトークンでのSSO

久しぶりにCognos BIにLTPAでSSO認証する実装を質問されましたので、少しまとめました。
基本は、この文章が情報になると思います。

【Enabling Single-Sign-On between IBM Cognos 8 BI and IBM WebSphere Portal】
http://public.dhe.ibm.com/software/dw/dm/cognos/security/general/enabling_sso_between_cognos8_and_websphere_portal.pdf


実は実際には自分自身でLTPAとCognos BIのSSOを実装した事が無いので、経験のある方がいらっしゃれば情報頂けると大変助かるのですが、上記の文書より、以下の実装になるようです。


・当然ながらCognos BIはTomcatではなく、WebSphere上に実装する必要がある。※"Secured"アプリケーションとして実装。
・Gatewayはcgi,isapi,mod2などではなく、Servlet Gatewayで実装する必要がある。
・SSOに関わるServlet GatewayのWebSphere、DispatcherのWebSphere、他のSSO対象のアプリのWebSphereは全て同一ドメインである必要がある。
・CognosからもLDAP等の認証ソースに接続する必要がある。認証済みのLTPAトークンを受け取れば認証完了ではなく、LTPAトークンをServlet Gatewayが受け取ると、HTTP HeaderのREMOTE_USERやUSER_PRINCIPAL変数に入れてくれるようなので、これらの変数を外部IDマッピングで受け取る実装をCognos上で行う。

また、Cognos 10に関しては、以下の情報がありました。
この手順も実装しないと、SSOにならないようです。

【WAS Servlet Gateway SSO not working with IBM Cognos BI server 10.】
http://www-01.ibm.com/support/docview.wss?uid=swg21653269
kintone プラグイン開発 on Windows Subsystem for Linux

#Windows におけるプラグイン開発環境

Windows 環境で、kintone プラグインを開発する場合、通常 cygwin を使います。

>[kintone プラグイン開発の準備](https://cybozudev.zendesk.com/hc/ja/articles/203283794#step2)
>Windows環境の場合、cygwinなどの開発ツールをご準備ください。

ただ cygwin は、結構動作が重く、プラグインをパッケージするだけなのに少し待たされます。

Windows 10 で Windows Subsystem for Linux が使えるようになったので、プラグイン開発を試してみました。


#Windows Subsystem for Linux

Windows 10 で導入された、Ubuntu互換の実行環境「Windows Subsystem for Linux（WSL）」です。

導入方法は、検索するといくつも見つかりますので、kintone プラグイン開発に必要なポイントだけメモします。

##Windows Subsystem for Linux導入手順
- 64bit版のWindows 10 Anniversary Update（Windows 10を最新版）
- 開発者モードの有効化（いろいろとセキュリティに気を付ける必要があります）
- 「Windows 機能の有効化または無効化」から「Windows Subsystem for Linux（Beta）」を追加

##Windows Subsystem for Linux（WSL）の設定
kintone プラグインのパッケージ処理で zip が必要なので追加しておきます。

- bash 起動
- ユニックスユーザアカウント作成
- /etc/hosts にPC名を追加 (sudo 対応)
- sudo apt-get update (apt-get のパッケージリスト更新)
- sudo apt-get install zip (zip パッケージ追加)

##Windows Subsystem for Linux の起動
- スタートメニューから「Bash on Ubuntu on Windows」を起動

bash 起動後は、通常のコマンド入力となります。

#プラグインの開発環境
プラグインのパッケージ処理だけ、Windows Subsystem for Linux を使います。
エディタは普段使っているものが使えます。

- kintone plugin-sdk の準備
- Windows のディレクトリは、/mnt から参照できますので、プラグインのソース一式は任意の場所が使えます。
- bash のホームディレクトリは、「/home/ユニックスユーザ」

#kintone プラグインのパッケージ処理時間

圧倒的に、Windows Subsystem for Linux が早いですね。
待たされるストレスなしでパッケージ処理が出来ます。

- cygwin: 6.5秒
- Windows Subsystem for Linux: 0.5秒
docker composeでgitlab一瞬で立ち上がる

一瞬でgitlabが利用できるようになってビックリしました。
こちら立ち上げ方法紹介します。
##前提として
dockerの知識が必要です。

## インストール
1. ターミナルで下記の命令を叩きます。
```docker pull sameersbn/gitlab:8.13.3```
これでgitlabのdockerイメージがローカルにダウンロードされます。

2. ターミナルでフォルダーを作って下記の命令叩きます。
```wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml```
これでdocker-composeの設定ファイルをダウンロードします。

3. 下記の命令を叩きます。
```docker-compose up```
gitlabのコンテイナーが立ち上がります。

これが終わったらKitematicから3つのコンテイナーが走ってるのを見れます。
<img width="592" alt="スクリーンショット 2016-11-10 11.20.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/11728/04561451-abfa-030f-ad1b-bc638534fd88.png">

これで下記のurlからgitlabメインページが見れます。
http://**192.168.99.100**:10080/

ここで**192.168.99.100**はdocker-machineのローカルIPです。

ログイン時のUserIdはrootでパスワードが設定できます。

以上
numpyでカラムごとに異なる桁数でcsv出力する

機械学習で計算した予測結果を出力するときには、

- 二値分類なら0/1で出力したい
- 確率値なら[0,1]でだいたい小数点以下5桁くらいで出力したい
- 回帰なら取りうる値のレンジに合わせて適当に指数表記で出したい
 
といったように出力する値の桁数を調整したいことがあります。

numpyでは`numpy.savetxt()`にてcsvやtsvを出力できますが、このときに`fmt`パラメータを指定することで桁数を調整することが可能です。

```py
In [1]: import numpy as np

In [2]: np.savetxt("output.csv", [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])

In [3]: cat output.csv
1.000000000000000056e-01 2.000000000000000111e-01 2.999999999999999889e-01
4.000000000000000222e-01 5.000000000000000000e-01 5.999999999999999778e-01

In [4]: np.savetxt("output.csv", [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], fmt="%.5f")

In [5]: cat output.csv
0.10000 0.20000 0.30000
0.40000 0.50000 0.60000
```

実はこのパラメータはリスト形式で複数指定することができます。`fmt=["%.0f", "%.1f", "%.5f"]`のようにパラメータを設定した場合、各カラム(各列)ごと指定した桁数で出力されます。

```py
In [6]: np.savetxt("output.csv", [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], fmt=["%.0f", "%.1f", "%.5f"])

In [7]: cat output.csv
0 0.2 0.30000
0 0.5 0.60000

In [8]: np.savetxt("output.csv", [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], fmt=["%.0e", "%.1e", "%.5e"])

In [9]: cat output1.csv
1e-01 2.0e-01 3.00000e-01
4e-01 5.0e-01 6.00000e-01
```

ただし、各カラム指定する場合にはすべてのカラムで指定する必要があり、列数が一致しない場合にはエラーとなります。

```py
In [10]: np.savetxt("output.csv", [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], fmt=["%.0e", "%.1e"])
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-6d7d74124420> in <module>()
----> 1 np.savetxt("output.csv", [[0.1, 0.2, 0.3] ,[0.4, 0.5, 0.6]], fmt=["%.0e", "%.1e"])

[...]

AttributeError: fmt has wrong shape.  ['%.0e', '%.1e']
```

1カラム目にIDが入っている場合や、説明変数はfloatだけど目的変数はintといった型が違う場合に便利です。

### 参考

- [numpy.savetxt — NumPy v1.11 Manual](https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html)
Unityシーンセレクターウィンドウ

Unityのメニューバーから"File->Open Scene..."を選んでシーンを変更すると、毎回ファイル選択ダイアログがAssetsフォルダに戻ってしまって面倒…。画面下のProjectウィンドウでシーンをダブルクリックで選択する方が楽ですが、それだと選択していたオブジェクトが解除されてしまって面倒…。

ということで、シーンセレクターウィンドウを作ってみました。このスクリプトはEditor専用APIを使っていますので、SceneSelector.csを任意の"Editor"フォルダに入れてください。そして、UnityEditorのメニューバーの"Window"から"Scene Selector"を選択、出てきたウィンドウのボタンを押すとシーンが変わります。編集中のオブジェクトがあった場合はセーブウィンドウが出て確認を求められます。

![SceneSelector.png](https://qiita-image-store.s3.amazonaws.com/0/141731/0d77ecaf-cc9b-3da6-6394-7234e859669b.png)

おっとその前に、スクリプト内の文字列配列sceneDirsにシーンファイルのあるフォルダを皆さんの環境に合わせて設定してください(複数フォルダの指定も可)。スクリプト的にはプロジェクト内を全探索する方が楽なんですが、プロジェクトの規模によっては使い物にならないくらい遅くなるので、このような形にしてみました。なお、実機やPlayerでは動きません。

制作用と実行用のシーンを分けていて、それらの行ったり来たりを繰り返す方には便利なのではないかと思います。実際、私にとってはすごく便利です！！(笑)

```SceneSelector.cs
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
using System.Collections.Generic;

public class SceneSelector : EditorWindow
{
    [MenuItem("Window/Scene Selector", false, 1000)]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<SceneSelector>("Scene Selector");
    }

    void OnGUI()
    {
        m_scroll_pos = EditorGUILayout.BeginScrollView(m_scroll_pos);
        string[] sceneDirs = { "Assets/Test/Scenes", "Assets/UnityChan/Scenes" };
        string[] sceneGUIDs = AssetDatabase.FindAssets("t:Scene", sceneDirs);
        foreach (var sceneGUID in sceneGUIDs)
        {
            string scenePath = AssetDatabase.GUIDToAssetPath(sceneGUID);
            string[] sceneName = scenePath.Split(new char[] { '/' });
            if (GUILayout.Button(sceneName[sceneName.Length - 1].Replace(".unity", "")))
            {
                if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
                    EditorSceneManager.OpenScene(scenePath);
            }
        }
        EditorGUILayout.EndScrollView();
    }

    Vector2 m_scroll_pos = Vector2.zero;
}
```

※以前のは正しく動作しないものだったので上げ直しました…。 2016/11/10
pandasでダミー変数を作成する(get_dummies)

###pandas でダミー変数を作成する
```
この記事ではpandas 0.18.1を利用しています。
```

Rを使っていた人が Python(scikit-learn)で同じことをやろうとした場合、カテゴリカルな変数の扱いに困るケースがあると思います。
カテゴリカルなデータは sklearn(numpy.ndarray をインプットとする場合)ではそのままでは扱えないので、ダミー変数に変換します。

データは以下のようなデータ。
sexは男性が1、女性が2、ageは各年代に対応する値が1～3で入っているとします。

```
df1
```
```
	id	sex	age
0	1001	1	3
1	1002	2	2
2	1003	1	3
3	1004	2	1
4	1005	2	1
```

```
df1 = df1.reset_index(drop=True)    # 後からインデックスでマージするので、念のため初期化しておく

dummy_df = pd.get_dummies(df1[['sex', 'age']], drop_first = True)   
print dummy_df
```
```
	sex_2	age_2	age_3
0	0.0	0.0	1.0
1	1.0	1.0	0.0
2	0.0	0.0	1.0
3	1.0	0.0	0.0
4	1.0	0.0	0.0

```
うまくダミー変数にできています。
各変数についてダミー変数を設けたのち、drop_firstで最初の変数を除いています。
（残しておくと変数が従属関係になり都合が悪いので、ここでは除く処置を取っています）
なお、drop_firstはpandas 0.18.0 以降の対応なのでご注意ください。

```

df2 = pd.merge(df1, dummy_df, left_index=True, right_index=True)
print df2
```

```
    id sex age  sex_2  age_2  age_3
0  1001   1   3    0.0    0.0    1.0
1  1002   2   2    1.0    1.0    0.0
2  1003   1   3    0.0    0.0    1.0
3  1004   2   1    1.0    0.0    0.0
4  1005   2   1    1.0    0.0    0.0
```

マージすると、ちゃんとダミー変数にできていることが確認できます。
Shinyapps.io にUTF8の文字列(日本語)を利用したアプリをデプロイする

※2016/11/14修正、options(encoding)を使った方法を追記

##問題
Shinyapps.io はShinyが使う関数にマルチバイト文字が入っているとデプロイの際にワーニングが出て、ライブラリがインストールされずに使えないケースが発生する、という問題があります。ワーニングは無視すればいいのですが、ライブラリがインストールされないとアプリが動かないので致命的です。

##原因
デプロイの際に走るlint()がマルチバイトを受け付けず、それがライブラリのインストールを止めてしまいます。

##対策（回避策1）
deployApp()を発行する瞬間だけエンコーディングをUTF-8に変更します。
```
tmp.enc <- options()$encoding #標準コーディングを記録（native.encであることが多いです）
options(encoding = "UTF-8") #エンコーディングをUTF-8に変更
deployApp()
options(encoding = tmp.enc) #エンコーディングをもとに戻す
```
基本的にRは関数・ライブラリによってエンコーディングの取り扱い方がまちまちなので、エンコーディングをUTF-8のままにしておくと思わぬトラブルが発生するかもしれないので、戻しておくことをお勧めします。

##対策（回避策2）
global.R にrequire()もしくはlibrary()を記載します。このファイルにShinyが使う関数を記載する必要があってもマルチバイト文字を使用しない。これでserver.R/ui.Rでワーニングが出ても何とかライブラリはインストールされるようになります。
global.R の役割に関しては以下をご覧ください。
[Scoping rules for Shiny apps](http://shiny.rstudio.com/articles/scoping.html)

一応RStudio側でrsconnect::lintを見直してくれる的なコメントをgit_hub上でいただきました。
Maya | ワールド座標系の設定を調べる

Mayaのメニュー[ウインドウ]-[設定/プリファレンス]-[プリファレンス]の、カテゴリ「設定」のワールド座標系がどっちに設定されているかを調べる。

![image](https://qiita-image-store.s3.amazonaws.com/0/52118/406213e7-7a97-f23d-697e-b8c2f9ed18c8.png)

```py
import maya.cmds as cmds

if cmds.upAxis(query=True, axis=True) == "y":
    print "Y UP"
else:
    print "Z UP" 
```
Swiftのenumのドキュメントコメントの書き方

以下のように、caseの上にコメントを書くこと(右ではダメ)

```swift
enum Fruit {
    /// 林檎
    case apple
    /// バナナ
    case banana
}
```

すると、Xcode上でoption + クリックした時に、ドキュメントが表示される


<img width="539" alt="スクリーンショット 2016-11-10 10.53.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/9875/f9c5b660-bf4d-148b-1405-c5cdc7636b88.png">
linux / mail > コマンドラインからメールを送る > echo "test" | mail -s "subject" user@software.com | ファイル添付メールの送信

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
```

6CPUで合計2000分程度かかる処理をしている。
その処理が終わったかどうかはターミナルを見れば確認できるが、メール連絡できると便利ではないかと思った。

### コマンド

参考 http://www.simplehelp.net/2008/12/01/how-to-send-email-from-the-linux-command-line/

上記を参考に以下のようなコマンドを実行してみた。
(`user@software.com`の部分は自分のメールアドレスにする)。

`echo "test" | mail -s "subject" user@software.com`

> send-mail: fatal: parameter inet_interfaces: no local interface found for ::1

### fatal parameterエラーの対処

上記のエラーの対処は以下に見つけた。
情報感謝です。
http://okisanjp.hatenablog.jp/entry/2016/06/22/162922

### メール送信してみた

エラーの対処をしてから再度以下のようなコマンドを自分のメールアドレス(gmail)宛に送った。

`echo "test" | mail -s "subject" user@software.com`

1回目のメールは「迷惑メール」に認識された。
迷惑メールでないという設定にした以降は「受信トレイ」に配信されるようになった。

### 使いどころ

以下のようにコマンドを連結して使う。

`
$ mpirun -np 6 ./wrf.exe && echo "fin" | mail -s "WRF finished" user@software.com
`

処理が終わった段階でメールが来る（はず）。

メールが届いた。思ったよりも処理が速かった。

### ファイル内容をメール内容にする

`rsl.out.0000`というテキストファイルが作成されると仮定。

`
$ mpirun -np 6 ./wrf.exe && cat rsl.out.0000 | mail -s "WRF finished" user@software.com
`

これで到着するメールの内容がrsl.out.0000になる。

### 添付ファイルを付ける

参考 [stackoverflow](http://stackoverflow.com/questions/902591/how-to-attach-a-file-using-mail-command-on-linux)

`rsl.out.0000`というテキストファイルが作成されると仮定。

`
$ mpirun -np 6 ./wrf.exe && echo "fin" | mail -a rsl.out.0000 -s "WRF finished" user@software.com
`

これで`rsl.out.0000`という名前の添付ファイルが付いたメールが到着するようになる。

メールの受け手で処理の内容が分かるようになり便利かもしれない。


### 注意点 > 処理失敗時にはメールも届かない

`
$ mpirun -np 6 ./wrf.exe && echo "fin" | mail -a rsl.out.0000 -s "WRF finished" user@software.com
`

上記のようにした場合、./wrf.exeの処理が途中でエラーとなった場合、終了メールは(当然)到着しない。
Mattermostでrubybot

# Mattermost
![mattermost](https://www.mattermost.org/wp-content/uploads/2015/09/20160315_v210.png)

Slackライクなチャット。
[このあたりの記事を参考。](http://qiita.com/terukizm/items/4a4016d8ec5a21856e4f)
バージョンは **3.4** を利用。
サクっとbotを実現する。

# Incoming Webhook
https://docs.mattermost.com/developer/webhooks-incoming.html

追加したフックのURLに対して何かポストするとメッセージが表示される。

## コード
このままやるとできる
http://qiita.com/tbpgr/items/b7529021c384c3f3bd89

```rb
require 'net/http'
require 'uri'
require 'json'

# send
class SlackWraper
  def self.post(text)
   # ポスト
   #data = { "text" => text }
   # チャンネル
   #data = { "channel" => "off-topic" , "text" => text }
   # ユーザー
   #data = { "username" => "Hoge", "text" => text }
   request_url = 'http://IPアドレス:8065/hooks/キー' # Incoming Webhookを追加した後確認できるURL
   uri = URI.parse(request_url)
   Net::HTTP.post_form(uri, {"payload" => data.to_json})  
 end
end
SlackWraper.post("=Message=")


```

data = { "text" => "あいうえお" }
data = { "channel" => "off-topic", "text" => "あいうえお" }
data = { "username" => "Hoge", "text" => "あいうえお" }

{ "payload" => data.to_json } をおくれば反応してくれる。

# Outcoming Webhook

簡単にやるなら以下の通り
http://sbkro.hatenablog.jp/entry/20120114/1326553671

```rb
require 'webrick'

# サンプルサーブレット
class ServletAction < WEBrick::HTTPServlet::AbstractServlet

    def do_POST (req, res)
        # このあたりに処理が来るのでやりたいようにやる
        res.body = req.body
        print(req.body)
    end
end

# サーバ起動処理
srv = WEBrick::HTTPServer.new({
    :DocumentRoot => '.',
    :BindAddress => 'IPアドレス',
    :Port => 9999})

srv.mount('/param', ServletAction)

trap("INT"){ srv.shutdown }
srv.start
```

## ポストされる内容(Mattermostから送られてくる内容)
| 名前         | 値               |
|:------------:|:---------------:|
| channel_id   | ハッシュ         |
| channel_name | town-square     |
| post_id      | ハッシュ         |
| team_domain  | チーム名         |
| team_id      | ハッシュ         |
| text         | %E3T81%82 ※(あ) |
| timestamp    | 1476320873       |
| token        | ハッシュ          |
| trigger_word | %E3%81%82 ※(あ) |
| user_id      | ハッシュ          |
| user_name    | ???              |

Contesnt-Typeをapplication/jsonにすると以下のような感じでPOSTされてくる

```json
{
    "channel_id":"ハッシュ",
    "channel_name":"town-square",
    "post_id":"ハッシュ",
    "team_domain":"チーム名",
    "team_id":"ハッシュ",
    "text":"%E3%81%82",
    "timestamp":"1476320873",
    "token":"ハッシュ",
    "trigger_word":"%E3%81%82",
    "user_id":"ハッシュ",
    "user_name":"????",
}
```
VMware playerを用いて共有フォルダ設定方法（Windows7⇔Ubuntu16.04）

**※Windows環境でVMware playerを利用して設置したLinuxと共有フォルダを設定するためには、vmware-toolsとvmware-tools-patchesの最新バージョンが必要。**

 - 環境：Windows7, VMware player6.0.7, Ubuntu16.04
 - 前提：VMware playerの中に、既にUbuntuは設置されていること。

###1. VMware playerのオプションから共有フォルダを指定
**・必ず、仮想マシンはシャットダウンされている状態**
> 1. フォルダ共有を「常に有効」選択
> 2. フォルダを指定
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/99686/c79b3bde-017e-f0e3-05f5-270bd99ecccc.png)

###2. vmware-tools設置
>1. 仮想マシーンを起動
>2. vmware toolsをインストールする
>>・Player(P) → 管理(M) → WMware toolsの再インストール(T)...

>3. Terminalを開く
>4. 以下のコマンドを実行
>> 1）```$ sudo mkdir /mnt/cdrom```
>> 2）```$ sudo mount /dev/cdrom /mnt/cdrom```
>> 3）```$ cp /mnt/cdrom/VMwareTools-version.tar.gz /tmp/```
>> 4）```$ ls /mnt/cdrom```
>> 5）```$ cd /tmp```
>> 6）```$ tar -zxvf VMwareTools-version.tar.gz```
>> 7）```$ cd vmware-tools-distrib```
>> 8）```$ ./vmware-install.pl```

###3. vmware-tools-patches設置
**・ubuntuにgitパッケージが既にインストールされている状況**
 
- もし、gitパッケージが設置されていないの場合は、以下のコマンドをTerminalに実行
   - ```$ sudo apt install git```

>1. ```$ git clone https://github.com/rasa/vmware-tools-patches.git```
>2. ```$ cd vmware-tools-paches```
>3. ```$ ./download-tools.sh```
>4. ```$ ./untar-and-patch.sh```
>5. ```$ ./compile.sh```

###4. Ubuntuを再インストールする。
###5. 以下のパスに共有フォルダが設定されることを確認
> ・/mnt/hgfs/共有フォルダの名
wip:ためになりそうな記事一覧

GitHubのコード検索
http://postd.cc/github-code-advances-search-programmers-goldmine/

UXチートシート
http://dev.ariel-networks.com/column/tech/ux/view

Golang Cafe #21.1 まとめ 続「Twelve Go Best Practices」を読む（要約編）
http://d.hatena.ne.jp/taknb2nch/20140317/1395035347

GoのパフォーマンスTipsメモ
http://golang.rdy.jp/2016/07/27/performance-tips/
veriloggenでデコーダの記述（case文のサンプル記述）


Pythonを使ってHDL(Hardware Description Language)記述を組み立てることができるveriloggenというツールを使っているのですが，デコーダのようにcase文をどのように書くのか分からなくて苦労したため，メモとして残しておきます．

```python:decoder.py
from __future__ import absolute_import
from __future__ import print_function
import sys
import os
from veriloggen import *

def mkDecoder():

    m = Module('decoder')
    indata = m.Input('in', 3)
    out = m.OutputReg('out',8)

    decCond = []
    decCond.append( When(0)(out(0b00000001)) )
    decCond.append( When(1)(out(0b00000010)) )
    decCond.append( When(2)(out(0b00000100)) )
    decCond.append( When(3)(out(0b00001000)) )
    decCond.append( When(4)(out(0b00010000)) )
    decCond.append( When(5)(out(0b00100000)) )
    decCond.append( When(6)(out(0b01000000)) )
    decCond.append( When(7)(out(0b10000000)) )
    #decCond.append( When()(out(0b10000000)) )

    m.Always() (
        Case(indata)(
            *decCond
            )
        )

    return m

if __name__ == '__main__':
    dut = mkDecoder()
    verilog = dut.to_verilog(filename='dut.v')
    print(verilog)

    sim = simulation.Simulator(dut)
    rslt = sim.run()
    print(rslt)

```

'When(0)out(0b000000001)'で，「値が0の場合，outという変数（信号）に２進数で00000001を割り当てる」という意味になります．そのような値と代入式の組み合わせをリストdecCondに登録します．今回はコメントアウトしていますが，このリストの最後にのみWhen()とすることで，default文が追加できます．そのあとで，always文の中のCase文で，入力として用いる変数名を指定しています．
自分のdotfilesを紹介します


## .vimrc

エディタは普段からvimを使っています。
お気に入りの設定は以下のとおりです。

```sh:.vimrc
" pasteモード(,iでもペーストモードへ. ノーマルに戻るとインサートに戻す)
nnoremap ,i :<C-u>set paste<Return>i
autocmd InsertLeave * set nopaste

" マウス操作可能にする
set mouse=a

" マウスでドラッグ動作も可能にする
set ttymouse=xterm2
" クリップボード許可
" => http://qiita.com/Kumamon/items/3ca4ab80fc465d8eed7e
" => http://qiita.com/shoma2da/items/92ea8badcd4655b6106c
set clipboard=unnamed,autoselect

" 常にタブラインを表示
set showtabline=2
```
 
自分が使いやすくて、効率良く開発できることが1番というモットーなので、マウス動作は可能にしています笑
また、画面切り替えはタブとtmux駆使してます。
ライブラリも結構入れてます。
いくつか紹介します。

### caw.vim
コメントイン・アウトを切り替えできるプラグインです。
かなり重宝してます。
自分は```\+c```を切り替えのキーとして割り当てています。

https://github.com/tyru/caw.vim

### unite.vim
起点ディレクトリからの検索や最近開いたファイルを検索するのに使っています。

https://github.com/Shougo/unite.vim

### unite-rails.vim
Railsを書くことが多いので入れています。
controllerやmodelやgemfileなどに飛べます。

https://github.com/basyura/unite-rails

### vim-rails
こちらもRails系のプラグインです。
コマンドモードで```:AT```とかするとそのファイルと関連するテストコードがタブで開かれます。結構使ってます。

https://github.com/tpope/vim-rails

### nerdtree+vim-nerdtree-tabs
ツリー表示してくれるプラグインです。
タブをまたいで同期してくれるvim-nerdtree-tabsはとっても便利です。

https://github.com/scrooloose/nerdtree
https://github.com/jistr/vim-nerdtree-tabs

### vim-trailing-whitespace
行末に半角スペースがあると色付きで表示してくれます。
スペースとかタブを把握できてないのかっこ悪いです。

https://github.com/bronson/vim-trailing-whitespace

### vim-multiple-cursors
マルチカーソル使えるようになります。
```C+n```で複数選択して同時編集とか、複数行末を同時編集とか簡単にできます。

https://github.com/terryma/vim-multiple-cursors

### vim-startify
vimのスタート画面をいい感じにしてくれます。
でももう使ってないです。はい。

https://github.com/mhinz/vim-startify

## .tmux.conf

特に色とか表示の設定しかしてないです。
あと、tmuxもマウス可能にしてます笑

## .zshrc

oh-my-zsh入れてます。(早く脱却したい...)
```.zshrc```ではoh-my-zshやpecoの設定と少しだけalias書いてます。

## .gitconfig

user設定とかcoreで使用するエディタの設定とかalias設定してます。
gitで使用するのは素のvimにしてます。
素のvim使う場面も多いので、ある程度使うようにしてます。
aliasは```git log```をきれいに表示するようにしたり、```git diff```を単語ごとに差分がでるようにしたりしてます。
**※既存のコマンドに割り当てることはできないので注意が必要です**

## .gitignore

.DS_Storeとかvendorを除外してます。

## private.xml

dotfileではないのですが、 **karabiner**で使用するカスタムxmlも管理してます。
escを押すと半角英数字に戻るようにしています。

## setup.sh

これらを設置するsetup.shを作ってあります。


# さいごに
自分のdotfileを紹介しました。
以下に晒しておきます。
おすすめのものとかおすすめの設定とかあったら教えてほしいです。

https://github.com/yaginuuu/.dotfiles
活性化関数ReLUについてとReLU一族【追記あり】

## (追記)活性化関数が学習に及ぼす影響
下記記事にて実験&解説を実施。興味があれば是非。

[【ReLU, PReLU, シグモイド etc...】ニューラルネットでよく使う活性化関数の効果をKerasで調べてみた](http://www.procrasist.com/entry/2017/01/12/200000)


## ReLUの良さ
- $\max(0,x)$は単純ゆえに早い
- 0を作る→スパース性につながる
- $x>0$の部分では微分値が常に1であるため勾配消失の心配はない


## ReLUが活性化関数になれる理由
### 折れ線のようなグラフで近似ができる
wikipediaの最後に，$y=x^2$の近似が載ってる

[wikipedia 活性化関数] (https://ja.wikipedia.org/wiki/活性化関数)

```math
\phi=\max(0,x)
```
```math
y\simeq$2\phi(-x - 2) + 2\phi(-x - 1) + \phi(-x) + \phi(x) + 2\phi(x - 1) + 2\phi(x - 2)
```

### google play groundで見ると面白い [Link](http://playground.tensorflow.org/#activation=linear&batchSize=10&dataset=circle&regDataset=reg-gauss&learningRate=0.1&regularizationRate=0&noise=0&networkShape=5&seed=0.21293&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false)


中間層からの振る舞いを見ると面白い

確かにReLUは折れ線を組み合わせている感じ．

多分各層の数の積の多角形が作れる


- Linear
![スクリーンショット 2016-11-10 1.42.54.png](https://qiita-image-store.s3.amazonaws.com/0/146563/5c148ac4-7163-6f37-8944-a2ef7810c93c.png "スクリーンショット 2016-11-10 1.42.54.png")


- ReLU
![スクリーンショット 2016-11-10 1.43.14.png](https://qiita-image-store.s3.amazonaws.com/0/146563/a1c3d260-63ec-a6e3-96a0-e82938267b58.png "スクリーンショット 2016-11-10 1.43.14.png")


- sigmoid
![スクリーンショット 2016-11-10 1.43.36.png](https://qiita-image-store.s3.amazonaws.com/0/146563/093c6969-9aba-27f6-f677-77ab1777326b.png "スクリーンショット 2016-11-10 1.43.36.png")

## ReLU一族
### ReLU  

$$f = \max(0,x)$$
- 参考(PFN得居さんの資料) : [最適化から見たディープラーニングの考え方](http://www.orsj.or.jp/archive2/or60-4/or60_4_191.pdf)
### 近似関数
$$f = log(1+e^x)$$

### Leaky ReLU  
最近よく使われている(wikipedia曰く無意味らしいが...)  
>(wikipedia)
2013年に max(0.01x, x) が LReL (leaky rectified linear) と命名された。ただし、命名者はこの活性化関数を使う意味はなかったと報告している。


```math
f = \begin{cases}
    x & (x>0) 
    \\
    0.01x  & (x<=0)
  \end{cases}
```
### Parametric ReLU
ReLUの傾きをparametricにした

```math
f = \begin{cases}
    x & (x>0) 
    \\
    ax  & (x<=0)
  \end{cases}
```
- 参考(原著) : [Delving Deep into Rectifiers:Surpassing Human-Level Performance on ImageNet Classification](https://arxiv.org/pdf/1502.01852.pdf)


### Exponential Linear Units

```math
f = \begin{cases}
    x & (x>0) 
    \\
    e^x -1  & (x<=0)
  \end{cases}
```
 
 - 参考(原著) : [Fast and Accurate Deep Network Learning by Exponential Linear Units ](https://arxiv.org/pdf/1511.07289v5.pdf)

## 図示
ReLU一族図示

0付近が微妙に異なる模様


![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/146563/fb5b42a0-dc85-a60d-ccd7-56e24b8987bc.png "Unknown.png")
Qiitaでtexを書く方法

## 方法
1. `$`で囲む
文章内に埋め込むことができる
`$\alpha$` -> $\alpha$

2. `$$`で囲む
段落を分けて埋め込むことができる
`Euler $$　f = e^{i\pi}$$`
↓
Euler $$　f = e^{i\pi}$$

3. コードブロック指定
複数行でもOK

<img width="175" alt="スクリーンショット 2016-11-10 8.25.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/146563/77852de8-a599-3ded-e9ed-f3d87e44183f.png">
↓

```math
f = \begin{cases}
    x & (x>0) 
    \\
    0.01x  & (x<=0)
  \end{cases}
```

##　kobitoを使うとき(2016.11.10, v2.3.8現在)

- 1. 2.は利用可能
- 3. は利用できなかった
Qiita > UI > 章の表示


Qiitaの記事で章立てになっている記事を読んでいた。

ふと右側の章のリストを見ると、現在読んでいる章がハイライトされるようになっていた。
いつからそういうUIになっているのか知らないが、良いと思った。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bd7f6811-c2c2-d88d-a220-eadf73a2e95b.png)

「自分が今どこにいるか」ということが分かるUIはいいと思う。
Deep Learning > Metrics - Ep. 23 (Deep Learning SIMPLIFIED) > Confusion Matrix / Recall / Precision

Deep Learning > Metrics - Ep. 23 (Deep Learning SIMPLIFIED)
https://www.youtube.com/watch?v=iIjtgrjgAug

metricsについて。

2:08頃
Confusion Matrix 

2:40頃
Recall

3:01頃
Precision

4:20頃
High precision, low recall

4:50頃
Low precision, high recall
phpをソースから入れたが /etc/php.ini と /etc/php.d を読まない時に確認する点

CentOS 6.8 の php 5.3.29 にて確認。
`./configure --prefix=/usr/local/php` でビルドしたとする。

## 現状

* `php --ini` や `php -m`、`php -i | grep --color configure` で確認

* 赤色 : 目標
* 緑色 : 現在

```diff
 Configuration File (php.ini) Path =>
- /etc/
+ /usr/local/php/lib/

 Loaded Configuration File => 
- /etc/php.ini
+ (none)

 Scan for additional .ini files in: 
- /etc/php.d
+ (none)

 extension_dir => 
- /usr/lib64/php/modules
+ /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626
```

## ./configure 修正

```diff:php.iniのpath修正
+ --with-config-file-path=/etc/
```

```diff:php.dをスキャンするよう修正
+ --with-config-file-scan-dir=/etc/php.d
```

## php.ini 修正

```diff:/etc/php.ini
+ extension_dir = /usr/lib64/php/modules
```

解決した
[baserCMS]少し古いバージョンで、管理側プラグイン一覧が表示されない場合


少し古いbaserCMSで、管理側のプラグイン一覧画面が表示されない、
または、プラグイン一覧画面内にある baserマーケット タブを開いた場合にプラグイン一覧が表示されない、
という場面に遭遇したので、その内容と対処策をメモしておきます。


## 対象バージョン
- baserCMSのバージョンが、3.0.8（3.0.8-dev）以下を利用している場合


## 発生状況
1. baserCMSにログインして、管理側のプラグイン一覧画面にアクセスすると、404Error が発生する
2. デバッグモード1以上では、XMLクラスのbuild()で失敗しているエラーメッセージが表示される

または、
1. 管理側プラグイン一覧画面内にある baserマーケット タブを開いた際に、マーケットで公開中のプラグイン一覧が表示されない


## 原因
baserマーケットで配信しているFeedのURLが、古いURLとなっているため。


## 対処
Config に記載のあるURLを書き換える。

- /lib/Baser/Config/setting.php

■ 変更前

```php
'marketThemeRss' => 'http://barket.jp/themes.rss',
'marketPluginRss' => 'http://barket.jp/plugins.rss',
```

■ 変更後

```php
'marketThemeRss' => 'https://market.basercms.net/themes.rss',
'marketPluginRss' => 'https://market.basercms.net/plugins.rss',
```
技術英語 > dangling-pointer problem.

@ Code Complete (No. 17496 / 36077)

英語というより用語。

> dangling-pointer problem.

http://stackoverflow.com/questions/17997228/what-is-a-dangling-pointer
> A dangling pointer is a pointer that points to invalid data or to data which is not valid anymore, for example:

が分かりやすい。
SwiftのFloat系の演算で余り演算子(%)が廃止、それに変わるメソッドはだるま落としと最寄駅

SwiftのFloat系の演算で、いつのまにか余り演算子の%が使えなくなりました。使おうとすると次のエラーが出ます。

```
'%' is unavailable: For floating point numbers use truncatingRemainder instead
'%' は使えません。小数はtruncatingRemainderを代わりに使います。
```

ということで、%の代わりのメソッドを使います。エラーメッセージにはひとつしか書いてませんが、代わりのメソッドは次の2つあります。

- truncatingRemainder メソッド
- remainder メソッド

そのまとめです。

# truncatingRemainder メソッド
```swift
public func truncatingRemainder(dividingBy other: Self) -> Self
```
従来の%に変わるものです。どんどん削っていって最後に残ったものと解釈できます。だるま落とし方式です。
![Darumaotoshi.png](https://qiita-image-store.s3.amazonaws.com/0/46631/e28ea341-424f-f4fe-31f2-3d551c5bfc48.png)
Aの例 : 18.0を5.0で割った余りは3.0
Bの例 : 18.0を-5.0で割った余りは3.0
Cの例 : -18.0を5.0で割った余りは-3.0
Dの例 : -18.0を-5.0で割った余りは-3.0

実装と実行結果はこのようになります。

```swift
18.0.truncatingRemainder(dividingBy: 5.0)	//3.0
18.0.truncatingRemainder(dividingBy: -5.0)	//3.0
-18.0.truncatingRemainder(dividingBy: 5.0)	//-3.0
-18.0.truncatingRemainder(dividingBy: -5.0)	//-3.0
```
【語句】truncate …の頭部[尾部]を切る

---
# remainder メソッド
```swift
public func remainder(dividingBy rhs: Self) -> Self
```
もうひとつのメソッドが、remainderです。数直線上に、割る数の間隔で印をつけて、割られる数に一番近い印を見つける。その印から見た割る数の位置が余りになります。
最寄駅方式です。一番近い駅から目的地までの向きと距離、と解釈できます。
![Moyorieki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46631/7018968a-4f36-ee91-b4fc-672afb44caff.png)
赤丸が割られる数です。
Aの例 : 13.0を5.0で割った余りは-2.0
Bの例 : 12.0を5.0で割った余りは2.0
Cの例 : -13.0を5.0で割った余りは2.0
Dの例 : -12.0を5.0で割った余りは-2.0

実装と実行結果はこのようになります。

```swift
13.0.remainder(dividingBy: 5.0)		//-2.0
12.0.remainder(dividingBy: 5.0)		//2.0
-13.0.remainder(dividingBy: 5.0)	//2.0
-12.0.remainder(dividingBy: 5.0)	//-2.0
```
割る数の正負が反対になっても最寄駅は変わりません。結果も同じです。

```swift
13.0.remainder(dividingBy: -5.0)	//-2.0
12.0.remainder(dividingBy: -5.0)	//2.0
-13.0.remainder(dividingBy: -5.0)	//2.0
-12.0.remainder(dividingBy: -5.0)	//-2.0
```
django-admin.py --version ができない

# 問題点
Python3の中のdjango-admin.pyを指定して--versionやってもImportError: No module named jango.coreとか返される。
# 解決
django-admin.pyの中の

```
#!/usr/bin/env Python
```

を

```
#!/usr/local/bin/python3
```

に変えたら通った。
path指定しなくちゃいけなかったのか。
もとのコードのpythonはなんのバージョンだったのか
CentOS6.7にDjangoをインストール

# 概要
今日から備忘録としてQiitaで作業記録を作成していくことにする。ほとんど初心者のようなものだがほんの少しだけweb制作をやったことはある。何とかなるだろうか……。あとMarkdownの練習もかねて。
今回はCentOS6.8にDjangoをインストールしてみることにする。
# 環境
早速Djangoをインストールしていくことにする。今回参考にしたサイトはこちら。大変参考になりました。
[``Python3.4 + Djangoで作るWebアプリケーション(Part.1 環境構築編)``](http://qiita.com/taijijiji/items/8da746e150d1e0947107)
## 環境
今回Djangoをインストールした環境はこちら

- 物理マシン

 - Windows10

- 仮想環境

 - VMware Workstation 12 Player

  - Vertion 12.5.1 build-4542065

- 仮想マシン

 - CentOS_6.8_64bit

 - メモリ 2GB

 - プロセッサ 4

 - HDD 20GB 

- Python 3.4.3
 
- MySQL 14.14
# Python Install
__上のサイトに載ってるよ！！！__ ~~書くのがめんどくさい~~

# Django Install
## Python3
Python3がインストールされている確認

```
[...]# python3
Pytho 3.4.3 ...
...
...
>>
```

ちなみにctrl+dで抜けることができる。

## MySQL
入ってるか確認

```
# mysql --version
mysql Ver 14.14 Distrib 5.1.73, for ...
```

## Django
### Djangoをインストール
Python3に標準で入ってるpipちゃんを使ってインスト

```
# pip install django
......
```

なお、/usr/local/src/Python/lib/python3.4/site-packagesに入っていた模様
オンラインプログラミング学習

- 機械学習
    - https://www.coursera.org/learn/machine-learning
- 言語自体
    - https://www.codecademy.com/
    - https://www.codeschool.com/
    - https://www.hackerrank.com/ (コンテスト系)
- エディタ
    - https://jsfiddle.net/
    - http://codepen.io/
    - http://ideone.com/
    - go: https://play.golang.org/
    - rust: https://play.rust-lang.org/
Mac OS Xでerror 8060が出てきたので対処した件

#はじめに
なぜerror 8060がでてきたのかというと、ウイルスファイルが入りその影響でTrashの中身を「空にする」ということができなくなっていたから。

自分の場合は恐らくウイルスファイルがMac自体のファイルに悪影響を起こしたために起きた現象。(明確ではありませんすいません m(__)m)

#対処した方法
error 8060や8003などのエラーの対処法は調べるとかなり書いてあったので、その方法と下にURLをはっておきます。

1. ターミナルからの直接的に削除する方法。
2. Mac OS X自体の再インストール  <--  _今回この方法で行いました。_



1番目の方法: 
[ゴミ箱を空にする時に発生する「エラーコード8003」の対処法](http://www.webantena.net/mac/solution-of-errorcode-8003/)
↑は__error 8060の場合でも対処可能__です。

2番目の方法: 
[Mac データ 回復] (http://jp.macfixz.com/mac-error-code-8060-%E5%A3%8A%E3%82%8C%E3%82%8B-%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%9F-mac%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%BE%A9%E6%97%A7%E3%81%95)

2番目の方法ではMac OS の再インストールの方法自体は書いてないのでApple本家サイトの説明を貼っておきます。

[Mac OSの再インストール] (https://support.apple.com/ja-jp/HT204904)

この方法で正常にTrashから「空にする」でerrorなしにゴミ箱の中身を削除することができました。正直かなり焦りました。
それではこれで
vagrant up shared foldersエラー

vagrant centosでのエラー対応として、自分の備忘録になります。

# エラー内容
```
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-573.el6.x86_64

Building the main Guest Additions module[FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions[  OK  ]

Restarting VM to apply changes...
==> default: Attempting graceful shutdown of VM...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default:
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/isuzuki/dev/vagrant-ansible-back
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o dmode=777,fmode=666,uid=500,gid=500 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

## 対処法
```
The missing package can be probably installed with
yum install kernel-devel-2.6.32-573.el6.x86_64
```
- エラー内容のkernel-develを手動インストール後に、vagrantを再起動する
- 対処法コマンドは以下

```
$ vagrant ssh

vagrant内で
$ sudo yum install http://vault.centos.org/6.7/updates/x86_64/Packages/kernel-2.6.32-573.26.1.el6.x86_64.rpm
$ sudo yum install http://vault.centos.org/6.7/updates/x86_64/Packages/kernel-devel-2.6.32-573.26.1.el6.x86_64.rpm
```
- これで正常にvagrantが起動するようになりました
TLS「extended master secret」拡張 (RFC7627)

Q. TLSのmaster secretがデフォルトの48バイトより長くなるの？96バイトぐらい？
A. 違います。

#前提

この話が通じるのはTLS1.0～TLS1.2です。TLS1.3は含まれません。

#本文

master_secretの算出方式が変わります。

普通のmaster_secretはClientHello.Random, ServerHello.Random, pre_master_secretの3値から算出しますが（拙稿 [SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する](https://qiita.com/n-i-e/items/41673fd16d7bd1189a29) をご参照ください）、extended master secret拡張が有効なときは、ハンドシェイクのClientHelloからClientKeyExchangeまでの平文パート全体をハッシュし、それとpre_master_secretを元にmaster_secretを算出します。

「平文パート全体」の範囲には、ClientHello.RandomとServerHello.Randomも含まれますので、要はmaster_secretの算出元データとして使われるパラメータの種類が増えるということです。

master_secretが算出されれば、その後のアルゴリズムは普通のTLSと変わりません。

#この拡張は必要か？

これはTriple Handshake攻撃の脅威をどう評価するかの問題です。

Triple Handshake攻撃には複数のバリエーションがありますが、[公式サイト](https://mitls.org/pages/attacks/3SHAKE)で述べられている典型的な攻撃例は3段階から成り立っており、その最終段階 (step 3) をよく見ると、実は一部のTLS製品に当時存在していた不具合を突く形で行われているのです。不具合さえなければ、step 2までしか進めませんので、それならTriple Handshake攻撃は大きな脅威ではないと考えることもできます。

しかし将来的に、これを改良した応用的な攻撃法が発見されるかも知れないと考えるなら、やはり[RFC7627](https://tools.ietf.org/html/rfc7627) ([Google翻訳](https://rfcs.web.fc2.com/rfc7627.html)) が必要とも考えられます。

そんなわけで、世の中RFC7627対応は意外と遅く、未対応のクライアントやサーバがまだまだ残っているようです。

#この拡張はTriple Handshake対策になるのか？

かつてのCVE-2009-3555脆弱性を受けて、TLS再ネゴシエーションの補強策として登場した[RFC5746](https://tools.ietf.org/html/rfc5746) ([Google翻訳](https://rfcs.web.fc2.com/rfc5746.html)) が、Triple Handshake攻撃にはさっぱり無力だったわけで、ではRFC7627は本当に大丈夫なのか気になるところですよね。

RFC7627は[公式サイト](https://mitls.org/pages/attacks/3SHAKE)の3段階のうち最初 (step 1) に作用し、別のセッションだがmaster_secretは同じ、という状態を作らせないというものです。ClientHello.Random, ServerHello.Random, pre_master_secretに加えてサーバ証明書もmaster_secret算出の元データに使われますので、攻撃サーバAが被害クライアントCに送るサーバ証明書と、被害サーバSが攻撃クライアントAに送るサーバ証明書が一致しなければ、master_secretは同じにならないと、まあそういった理屈です。

。。。どう思います？なんというか、Triple Handshake論文の攻撃シナリオには有効でも、誰かが何か別の応用を思いついたら、あっさり迂回されてしまうんじゃないかという予感がしなくもありませんが、まあ、その時はその時でまた何か考えればいいのでしょう。

#リファレンス

E. Rescorla, et al. (2010)
Transport Layer Security (TLS) Renegotiation Indication Extension
https://tools.ietf.org/html/rfc5746 ([Google翻訳](https://rfcs.web.fc2.com/rfc5746.html))

K. Bhargavan, et al. (2015)
Transport Layer Security (TLS) Session Hash and Extended Master Secret Extension
https://tools.ietf.org/html/rfc7627 ([Google翻訳](https://rfcs.web.fc2.com/rfc7627.html))

Triple Handshakes Considered Harmful: Breaking and Fixing Authentication over TLS
https://mitls.org/pages/attacks/3SHAKE ([Google翻訳](https://translate.google.com/translate?sl=en&tl=ja&u=https%3A%2F%2Fmitls.org%2Fpages%2Fattacks%2F3SHAKE))

SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する
https://qiita.com/n-i-e/items/41673fd16d7bd1189a29
起動できなくしてしまったDocker ディスクイメージ内からファイル取得

## 概要
Docker にて、Webサーバ環境を作成し、いろいろ設定ファイルなどを編集していたら、記載もれがあり、Apacheが起動しなくなった。かつ、Dockerコンテナ起動時のコマンドで起動してたため、コンテナ自体の起動もできなくなった。結果、コンテナ内にも接続できなくなり、途方に暮れてしまったので、対処法をメモ。

## `docker cp` を使って、コンテナ-ホスト間ファイルコピー
### Dockerイメージ → ホスト環境
- `docker cp <コンテナID>:/etc/aaa.conf aaa.conf`

### ホスト環境 → Dockerイメージ(Docker1.8からサポート)
- `docker cp aaa.conf <コンテナID>:/etc/aaa.conf`


上記コマンドを使用して、ホスト環境に対象設定ファイルをコピーしてきた。
問題の箇所を修正した上で、Dockerイメージの方に戻し、コンテナ再起動して対処した。
コンテナ起動時の、コマンド内容を変更する方法を探してしまって、時間の浪費。

## 参考
https://docs.docker.com/engine/reference/commandline/cp/
CentOS 6 + Python3.5.2 + Django 1.10 本番デプロイ

# CentOS 6.8 で Django1.10の本番デプロイ環境構築

# はじめに
今回、さくらのVPSを借りる機会があり、PythonとDjangoの開発環境・本番デプロイ環境が作りを行なったので、備忘録代わりに記事にしました。ほとんど、解説なしですが、参考にしてもらえればと思います。

# 目指す環境
    - Cent OS 6.8
    - python 3.5.2
    - django 1.10
    - Apache　2.2.15
    - mod_wsgi 4.5.2

# 確認
    1. OSの確認 : cat /etc/centos-release
    2. Pythonの確認 : python -V
    3. Django の確認 : django-admin.py --version
    条件が１個でも違う方は試してみる価値ありです。
　　iptablesでブロックされていない前提、ホントはきっちりしとこう。

# yum update , yum upgrade : もはやお作法

# 開発用のツール群をインストール
    1. yum -y install wget gcc zlib-devel gdbm-devel readline-devel httpd-devel httpd
    2. yum -y install sqlite-devel openssl-devel tk-devel bzip2-devel

# Python3.5.2のインストール
    1. mkdir tmp
    2. cd tmp
    3. wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
    4. tar -xzf Python-3.5.2.tgz
    5. cd Python-3.5.2
    Pythonをコンパイル＆インストール
    6. ./configure --enable-shared
    7. make && make altinstall
    実際に利用できるよう、パスの設定を行う
    8. echo "/usr/local/lib/python3.5" > /etc/ld.so.conf.d/python33.conf
    9. echo "/usr/local/lib" >> /etc/ld.so.conf.d/python33.conf
    10. ldconfig
    
# mod_wsgiのインストール
    1. cd ../ <= tmpへ戻れれば、なんでもいいです。
    mod_wsgiダウンロード
    2. wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.2.tar.gz
    3. tar -xzf 4.5.2.tar.gz
    4. cd mod_wsgi-4.5.2/
    mod_wsgi インストール
    5. ./configure --with-python=/usr/local/bin/python3.5
    6. make && make install
   
#Djangoのインストール
    pip3.5のアップグレード、djangoのインストール
    1. /usr/local/bin/pip3.5 install --upgrade pip
    2. /usr/local/bin/pip3.5 install django

# mod_wsgi、Djangoのプロジェクト設定（実は一番めんどい）
    http://rady-time.com/post-222/ （参考文献3）
    上記参照。ディレクトリの設定などを同じにするとなお分かりやすいです。

# その後
    Djangoのプロジェクトが置いてあるディレクトリを再帰的にパーミッション変更
    1. chmod 777 -R /path/to/Django'sProject
    SELinuxというセキュリティの機構を解除
    2. sudo setenforce 0

# その他
    1. Django上のALLOWED_HOSTS設定に気をつけよう
    2. 分からなかったらApacheのエラーログを見ること（参考文献4）

# 参考文献
    1. http://hermesian.hatenablog.com/entry/2016/05/03/223729
    2. http://nobuta05.hatenablog.com/entry/2015/09/28/172606
    3. http://rady-time.com/post-222/
    4. http://d.hatena.ne.jp/midori_kasugano/20091203/1259832929
Securityの勉強を始めるなら一度は試したい簡単な脆弱なWebアプリケーションの構築

Webアプリケーションの脆弱性を、簡単に試すのにいい方法ないかなと思う人向け
===
脆弱なWebアプリケーションのテストをするためにOwaspbwaなどといった仮想環境を構築する方法もありますが、もっと簡単にテストできる環境をぱっと作ります。テストするとよりかは大きな脆弱性10個について確認できるだけのアプリケーションですが...

#OWASP Top10とは
OWASP（Open Web Application Security Project）は、Webアプリケーションのセキュリティに関するオープンソースのコミュニティで、OWASP Top10は、最も重要なWebアプリケーションの脆弱性について解説したドキュメントです。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/bk3WivFFgGtCUu" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/OpenDNS/security-ninjas-opensource" title="Security Ninjas: An Open Source Application Security Training Program" target="_blank">Security Ninjas: An Open Source Application Security Training Program</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/OpenDNS">OpenDNS</a></strong> </div>

その10個の脆弱性について簡単に試すことができるWebアプリケーションを自分のローカル環境に構築します。([Security_Ninjas_AppSec_Training](https://github.com/opendns/Security_Ninjas_AppSec_Training))

#手順
`php.ini` がローカル環境のどこにあるのか `php -info | grep php.ini` で確認しておきます。Macではデフォルトで、 `php.ini` ではなく `php.ini.default` が `/etc/` にあるので以下のようにしています。他の場所に`php.ini` がある場合は、適宜パスを変えて `sudo cp /etc/php.ini /etc/php.ini.orig` などとバックアップをしておいてください。

    mkdir ~/owasp && cd ~/owasp
    git clone https://github.com/opendns/Security_Ninjas_AppSec_Training.git
    cd Security_Ninjas_AppSec_Training
    sudo cp php.ini /etc/    
    sudo mkdir /Library/WebServer/Documents/test/
    sudo cp -R src/Final/* /Library/WebServer/Documents/test/
    sudo chmod 777 /Library/WebServer/Documents/test/*.txt    
    sudo apachectl start

この後、ブラウザでlocalhost/test/を開くと以下のようになります。XSSの確認を行うにはGoogle ChromeはデフォルトでXSS Auditorをオンにしているので、それをオフに切り替えるか、Firefoxで開くと良いでしょう。

<img width="1281" alt="Screen Shot 2016-11-09 at 23.47.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/122365/c3e36fb3-c10d-ef22-78ef-20a4154b1d10.png">

10個のタブが出てきてそれぞれが異なる脆弱性を持つので自分で脆弱性についてテストすることができます。
<img width="1434" alt="Screen Shot 2016-11-10 at 0.09.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/122365/8df8e2a0-38a8-0f49-be70-2c5553e00514.png">

HintとSolutionがあるのでそれを見るとOWASP Top10の脆弱性がイメージできると思います。


#テストが終わったら

    sudo apachectl stop
    sudo rm /etc/php.ini
    #もしphp.iniがもとからあってバックアップをしたならそれをphp.iniに戻します.
    rm -rf /Library/WebServer/Documents/test/

サーバーを止めてディレクトリごと消しておきます。
AWS SDK for PHP 3.xでCloudSearchに接続する

## 概要

- 用意されたものしか使ったことなかったが、めでたくタスクが振られた
- いい機会なので接続からちゃんとコードを読んでみたが不要なことしてるぽい
- いったん、接続だけ欲しいけどV2の情報ばっかりで接続だけしたいのにエラー
- とりあえず、V3で手っ取り早くつなげたい
- 接続できたけど、仕事では急いでやったからちゃんと理解できてないしもう一回手順踏む
- 接続するために最低限必要なものはわかっているので、ミニマムに始める

## 事前準備

- 適当にディレクトリ切る。本当に適当

```bash
$ cd
$ cd gitrepos
$ mkdir cloudsearch-test
$ cd cloudsearch-test
```

- 続けて、`aws-sdk`を使うのでこれも適量で`composer.json`を用意

```json
{
  "require":  {
    "aws/aws-sdk-php":  "3.*"
  }
}
```

- おもむろにComposer叩く

```bash
$ composer install
```

- aws-cliが入ってなかったら入れる(今回はMac上で実行できればいいのでhomebrew)
- ローカルから叩ければいいので、credentialsがなければ用意しておく

```bash
$ brew install awscli
$ aws configure
(aws_access_key_idとかaws_secret_access_keyとか入れる)
```

## だいたい、準備できたので実装

- 接続方法を調べたいだけなので、F/Wとか使わずにapp/test.phpとか作る
- 必要なファイルをrequire/useする

```php
require '../vendor/autoload.php';
use Aws\CloudSearchDomain\CloudSearchDomainClient;
```

## CloudSearchDomainClient を取得する

```php
$cloudSearchDomainClient = CloudSearchDomainClient::factory([
    'endpoint' => $yourEndPoint,
    'version' => 'latest',
]);
```

## インデックスも何も設定してなくても検索はできる

```php
var_dump($cloudSearchDomainClient->search([
    'query' => '*:*',
    'queryParser' => 'lucene',
]));
```

- 実際に仕事でやった際は既存のコードを参考にしてたので余計な処理書いてたので後日消す
- まだCloudSearch触れそうなので復習だけでなく予習も兼ねて色々と書いていきたいと思う
ScalaでSlack連携 その１

# <i class="fa fa-cubes" style="font-size:1em;"></i> Incoming WebHooks URL を取得する

`https://<Your Team Name>.slack.com/apps/build` にアクセスし

- Make a Custom Integration を選択
![2016-11-10_00h02_26.png](https://qiita-image-store.s3.amazonaws.com/0/39243/1f2a96a4-d2dc-194f-b3aa-cc532afe76f4.png)

- Incoming WebHooks を選択
![2016-11-10_00h03_00.png](https://qiita-image-store.s3.amazonaws.com/0/39243/fe49afef-94d8-7f33-0ebd-f944ac74677e.png)

- でいろいろしてWebHooks URLを取得


# <i class="fa fa-code" aria-hidden="true"></i> Scala で post してみる

postするのに play-ws を利用する。
※ scalaVersionは2.11.7
それ以上のversionにすると`java.lang.NoClassDefFoundError: scala/Product$class`
Compile Dependenciesをちゃんと見ろということですね。すいません。

```scala:build.scala
name := "slack-incoming"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "com.typesafe.play" % "play-ws_2.11" % "2.5.9"
)
```

```scala:Main.scala
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import play.api.libs.ws._
import play.api.libs.ws.ahc.AhcWSClient

import scala.concurrent.Future

object Main {
  import scala.concurrent.ExecutionContext.Implicits._
  def main(args: Array[String]): Unit = {

    implicit val system = ActorSystem()
    implicit val materializer = ActorMaterializer()
    val wsClient = AhcWSClient()

    call(wsClient)
      .andThen { case _ => wsClient.close() }
      .andThen { case _ => system.terminate() }
  }

  def call(wsClient: WSClient) = {
    val postJson = """{"text": "This is a line of text in a channel.\nAnd this is another line of text."}"""
    val contentType = ("Content-Type" -> "application/json")

    wsClient.url("<Web Hooks URL>")
      .withHeaders(contentType)
      .post(postJson)
  }
}
```

# <i class="fa fa-slack" aria-hidden="true"></i> Slackで確認

![2016-11-10_00h07_30.png](https://qiita-image-store.s3.amazonaws.com/0/39243/9f134022-399f-a631-4bfb-60a7a8bd953c.png)

すごく・・・かんたんです・・・

その２があるかは未定
本格的にプログラミング初めて2か月でRubysilver合格!

本格的にプログラミング初めて2か月でRuby Association Certified Ruby Programmer Silver version 2.1合格しました。
その経緯についてまとめてみました。誰かの参考になれば幸いです。

Ruby Association Certified Ruby Programmer Silver version 2.1
とはなんぞや？って人はhttp://www.ruby.or.jp/ja/certification/examination/
を参考に見てください。

自身の今までの経歴を簡単に説明すると、
本格的にプログラミングを始めたのは今年９月からそれまでプログラミング経験は学校の授業で軽く触れた程度（学科は機械工のため1コマ分のC言語の授業のみ）
１日の平均勉強時間は一時間程度+通学等隙間時間

具体的に行ったこと
・Ruby試験対策教本のsilver試験範囲部分を読み込む、わからないところは実際にコードを打って確認
・上記の本はプログラミング初心者向けに書かれてはいない（基本的な用語の解説が不十分だったり誤植が多い）ため、たのしいRubyという本を利用してわからない単語付近を読み込む（結局一周は読むことになった）

上記のループを一ヶ月間行った（自身が忙しかったのもあり二周できたかな？くらいだった）
その後は
・Ruby試験対策教本の巻末部分にある演習問題(silver範囲)をひたすら解いて解説を読み込む
・解説を読んでわからない部分は教本に対応している部分を読むかたのしいRubyを読み込んだりドットインストールを見たりして理解した。
・わからなかったところは必ずノートに書き込む
・巻末問題の解答が暗記できるくらいになったらRuby試験の主催会社（Ruby Association）のホームページにある演習問題も解く
・あとは同じ要領で繰り返す

上記のことを行い試験に向かいました。

試験を受けた感想は、演習問題とほぼ同じ問題は出たが、演習問題には載ってない基本的なことを知らないと解けないような問題がほとんどだった。中には知らなかったものやきわどい文法問題とか出てきますが計算上演習問題と同等の問題と基本的な問題がちゃんと解ければ80点は確実に超えると思います。

結果無事一発(76点とギリギリ笑)で合格しました。勘で解いた問題が見事全部外れましたが結果オーライでした。

この経験が誰かの役に立てれば幸いです。
EditTextをタップした時に、ソフトキーボードを表示しない

EditText をタップしたときにソフトキーボードを表示しないようにしたいのです。

具体的には、計算機アプリで、式の表示画面をEditTextで作成し、そのEditTextには、自分で作ったボタン以外の文字は一切入力できないようにします。

また、好きな位置に数字などを入力できるようにするために、Text ViewではなくEditTextを使いたいです。 
ですので、EditTextをタップすることで文字のタップ位置にカーソル位置は変わりつつ（フォーカスはあたったままで）、ソフトキーボードを表示しないようにしたいと考えています。

実際に、ZenUIの電卓アプリや、万能計算機というアプリでは、そのような仕様がなされています。

試したこと

インターネットで色々調べたのですが、Activity起動時にソフトキーボードを非表示にする方法はいくつか見つけましたが、Activity起動後にEditTextをタップした時にソフトキーボードは表示されてしまいます。 
具体的には、 
http://qiita.com/hishida/items/8bf1aa28ef62ef22a7f9 
に載っていることを試しました。

また、EditTextのfocusableをfalseにするなど、編集不可の状態にしてしまうとカーソルが表示されません。
EditTextのeditableをfalseにしても編集不可の状態になってcursorが表示されません。

また、EditTextにオンタッチリスナーを設定し、MOTION＿DOWNやMOTION＿UPなどでソフトキーボードを非表示にするコードを書き、return false 
にしても、オンタッチリスナーのあとにソフトキーボードが表示されるので、ソフトキーボードが閉じた後にまたソフトキーボードが立ち上がります。

また、オンタッチリスナーでreturn true にすると、EditTextのメソッド自体が呼ばれないのだと思いますが、ソフトキーボードは表示されないのですが、カーソルは最初の位置にとどまったままで、タップした位置にカーソルは移動しません。
Google Public DNS の様々な活用方法

# 概要
Googleが提供している公開DNS（8.8.8.8）をご存じの方は多いと思います。

このGoogle Public DNSには、通常のDNSサーバ接続先として指定する以外にも、複数の利用方法があります。

# ブラウザで名前解決
https://dns.google.com にアクセスすることで、ブラウザ上でDNSレコードを参照できます。

![dns01.png](https://qiita-image-store.s3.amazonaws.com/0/144905/3a435845-a354-5f18-ecff-dffe28a7a9d1.png)

![dns02.png](https://qiita-image-store.s3.amazonaws.com/0/144905/7ec66eec-13c2-4d11-fccc-4f86cad117b6.png)



# DNS-over-HTTPS
[DNS-over-HTTPS](https://developers.google.com/speed/public-dns/docs/dns-over-https) と呼ばれる仕組みが用意されており、HTTPS経由でDNSレコードを取得できます。実際の情報はJSON形式で提供されます。

次のURLにアクセスすることで利用可能です。
`https://dns.google.com/resolve?name=<ドメイン名>`

例として、`qiita.com`を指定すると、以下のようなJSONが取得できます。

```json:json
{
    "Status": 0,
    "TC": false,
    "RD": true,
    "RA": true,
    "AD": false,
    "CD": false,
    "Question": [
        {
            "name": "qiita.com.",
            "type": 1
        }
    ],
    "Answer": [
        {
            "name": "qiita.com.",
            "type": 1,
            "TTL": 55,
            "data": "175.41.239.133"
        }
    ]
}
```

パラメータ `type=` を付け加えることにより、DNSレコードタイプを指定できます。
`https://dns.google.com/resolve?name=google.com&type=AAAA`

```json:json
{
    "Status": 0,
    "TC": false,
    "RD": true,
    "RA": true,
    "AD": false,
    "CD": false,
    "Question": [
        {
            "name": "google.com.",
            "type": 28
        }
    ],
    "Answer": [
        {
            "name": "google.com.",
            "type": 28,
            "TTL": 299,
            "data": "2404:6800:4004:807::200e"
        }
    ],
    "Comment": "Response from 216.239.32.10"
}
```

#参考情報
詳細仕様や、DNS-over-HTTPSのオプションについては、Google公式ページが参考になります。

[Google Public DNS](https://developers.google.com/speed/public-dns/)

[Google Public DNS (DNS-over-HTTPS)](https://developers.google.com/speed/public-dns/docs/dns-over-https)