OmniAICreator/Qiita-1.07M huggingface dataset:
[JAWS-UG CLI] OSX El Capitan(v10.11)上でAWS CLI環境を整備する

AWS CLIハンズオンのための環境構築手順(OSX El Capitan版)です。
適宜更新していきます。


# 前提条件

* [JAWS-UG CLI] 総合案内: http://qiita.com/tcsh/items/14c3278f69ab073afe0f を確認して、必要な手順を終えていること。



# 0. PIPのインストール

```bash:コマンド:
curl https://bootstrap.pypa.io/get-pip.py > get-pip.py
```

```bash:コマンド:
sudo -H python get-pip.py
```

```bash:コマンド:
which pip
```

```text:結果(例)
/usr/local/bin/pip
```

# 1. AWS CLIのインストール

## 1.1. インストール

```bash:コマンド:
sudo -H pip install awscli --ignore-installed six
```

```bash:コマンド:
which aws
```

```text:結果
/usr/local/bin/aws
```



参考: http://aws.amazon.com/jp/cli/


## 1.2. バージョン確認

```bash:コマンド:
aws --version
```


```text:結果:
aws-cli/1.8.3 Python/2.7.5 Darwin/13.4.0
```


## 1.3. 自動補完の設定

```bash:.bashrcに追記:
echo "complete -C '/usr/local/bin/aws_completer' aws" >> ~/.bashrc
```

```bash:コマンド:
source ~/.bashrc
```



## 参考: AWS CLIのアップグレード

AWS CLIはバージョンアップが頻繁に行なわれるので、更新方法は覚えておきましょう。

```bash:コマンド:
sudo pip install -U awscli --ignore-installed six
```



## 参考: AWS CLIのデグレード

1.3.16に戻す例:

```bash:コマンド:
AWS_CLI_VERSION=1.3.16
sudo pip install awscli==${AWS_CLI_VERSION}
```


# 2. jsonlint

## 2.1. インストール


### a. nodebrewを使う場合

```bash:コマンド:
curl -L git.io/nodebrew | perl - setup
```

```text:結果:
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

~/.bashrcにPATHを追記します。

```bash:.bashrcに追記:
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
```

```bash:コマンド:
which nodebrew
```

```text:結果(例):
/Users/taro/.nodebrew/current/bin/nodebrew
```

nodeをバイナリでインストールします。(v6.10.0の例)

```bash:コマンド:
nodebrew install-binary v6.10.0
```

```bash:コマンド:
nodebrew use v6.10.0
node -v
```

```text:結果(例):
v6.10.0
```

自動的にnpmもインストールされているはずです。

```bash:コマンド:
which npm
```

```text:結果(例):
/Users/taro/.nodebrew/current/bin/npm
```

```bash:コマンド:
npm -v
```

```text:結果(例):
3.10.10
```

jsonlintをインストールします。

```bash:コマンド:
npm install jsonlint -g
```

-gを付けないとインストールに失敗するようです。

```bash:コマンド:
which jsonlint
```

```text:結果(例):
/Users/taro/.nodebrew/current/bin/jsonlint
```


### b. macportsの場合

```bash:コマンド(MacPortsの場合):
sudo /opt/local/bin/port selfup
sudo /opt/local/bin/port install npm2
```

JSONフォーマットが壊れていないかどうか確認できます。JAWS-UG CLI必須のツール。

http://qiita.com/tt2004d/items/2ea1af8bfd324585dd07

```bash:コマンド
sudo npm install -g jsonlint
```

gオプションは、システム全体共有のディレクトリにインストールすることを指示します。(デフォルトはカレントプロジェクトのディレクトリ)

```text:結果:
/opt/local/bin/jsonlint -> /opt/local/lib/node_modules/jsonlint/lib/cli.js
jsonlint@1.6.2 /opt/local/lib/node_modules/jsonlint
├── JSV@4.0.2
```

## 2.2. jsonlintコマンドのテスト

### 正常サンプル

```bash:コマンド:
echo '{"key":"value"}' | jsonlint 
```

```text:結果:
{
  "key": "value"
}
```

### 異常サンプル

```bash:コマンド:
echo '{"key"}' | jsonlint 
```

```text:結果:
[Error: Parse error on line 1:
{"key"}
------^
Expecting ':', got '}']
```

# 3. yamllint

CloudFormationでYAMLを利用するときに必要となります。

## 3.1. インストール

```bash:コマンド:
sudo pip install yamllint
```

もしくは

```bash:コマンド:
sudo pip install yamllint --ignore-installed six
```

# 完了
Matplotlibのグラフデザインいろいろ紹介

matplotlibには、グラフのデザインを決めるオプションがあります。
オプションを指定するには、このようにします。

```python
import matplotlib
import matplotlib.pyplot as plt

plt.style.use('seaborn-bright')
font = {'family' : 'meiryo'}
matplotlib.rc('font', **font)
```

環境に付属しているテーマ一覧の確認には、

```
print(plt.style.available)
```

で行います。


テーマのサンプル
-----


* classic
![classic.png](https://qiita-image-store.s3.amazonaws.com/0/47047/6baae3db-2ba3-4f24-db04-34a22c2269ea.png)

* ggplot
![ggplot.png](https://qiita-image-store.s3.amazonaws.com/0/47047/907c6796-d9ae-b108-7745-fd4b422b3b6b.png)


* seaborn-dark
![seaborn-dark.png](https://qiita-image-store.s3.amazonaws.com/0/47047/cf281fbf-38a2-0b5d-da9b-77d08c24f3c8.png)


* seaborn-talk
![seaborn-talk.png](https://qiita-image-store.s3.amazonaws.com/0/47047/537c02da-f95f-d902-fb4d-932cea480e68.png)


* seaborn-colorblind
![seaborn-colorblind.png](https://qiita-image-store.s3.amazonaws.com/0/47047/28ae5af2-f186-461c-d46b-ed179c4ad506.png)


* seaborn-pastel
![seaborn-pastel.png](https://qiita-image-store.s3.amazonaws.com/0/47047/b37a4bba-f0ff-b0c7-7bcc-06e7befdd057.png)


* seaborn-ticks
![seaborn-ticks.png](https://qiita-image-store.s3.amazonaws.com/0/47047/657c955e-53ce-a378-9a1c-a30266a4b7df.png)


* grayscale
![grayscale.png](https://qiita-image-store.s3.amazonaws.com/0/47047/bcd1f1a9-a992-844e-5918-445a4c9e9821.png)


* seaborn-poster
![seaborn-poster.png](https://qiita-image-store.s3.amazonaws.com/0/47047/44993f5b-ca7d-b350-6d50-68a577d34ef9.png)


* dark_background
![dark_background.png](https://qiita-image-store.s3.amazonaws.com/0/47047/61d232cc-f61f-c867-b4e7-7d41675dfb8f.png)


* seaborn-bright
![seaborn-bright.png](https://qiita-image-store.s3.amazonaws.com/0/47047/e408a99d-6c04-759f-96a5-29d79c9f3a68.png)


* seaborn-notebook
![seaborn-notebook.png](https://qiita-image-store.s3.amazonaws.com/0/47047/7df747e8-b3fa-f9d1-59b8-3f41a38a00c2.png)


* seaborn-muted
![seaborn-muted.png](https://qiita-image-store.s3.amazonaws.com/0/47047/d8d06b39-8386-4095-f9d6-86b3bdf0df81.png)


* seaborn-white
![seaborn-white.png](https://qiita-image-store.s3.amazonaws.com/0/47047/882ed2ca-6149-302c-f53e-dabc47c8e1d2.png)


* seaborn-deep
![seaborn-deep.png](https://qiita-image-store.s3.amazonaws.com/0/47047/caede2f3-e2bd-3fad-6f27-c0a0affc3717.png)


* bmh
![bmh.png](https://qiita-image-store.s3.amazonaws.com/0/47047/7aae1ba7-0d20-d21e-3a76-679b07607e21.png)


* seaborn-whitegrid
![seaborn-whitegrid.png](https://qiita-image-store.s3.amazonaws.com/0/47047/179cde70-efc8-b40e-b950-81a724251bad.png)


* seaborn-paper
![seaborn-paper.png](https://qiita-image-store.s3.amazonaws.com/0/47047/e9475010-405e-2903-9175-4d3d851ee59f.png)


* seaborn-dark-palette
![seaborn-dark-palette.png](https://qiita-image-store.s3.amazonaws.com/0/47047/ca207381-68b5-5ad5-0c73-2b88eeacdedf.png)


* seaborn-darkgrid
![seaborn-darkgrid.png](https://qiita-image-store.s3.amazonaws.com/0/47047/cc043516-c201-8ffa-b693-ee5acd0e6b8b.png)


* fivethirtyeight
![fivethirtyeight.png](https://qiita-image-store.s3.amazonaws.com/0/47047/699dfefc-4f07-7406-220b-2155d1dffdcc.png)
tumblrで複数のタグの擬似アーカイブページを作成する

# 概要

tumblrで「A」と「B」両方のタグを持つpostを表示するあまりにも簡単な方法

# 実装方法
## 試してみたこと
- タグページで実装する
    - タグはひとつしか指定できない。ちくしょうめ。
- 専用アーカイブページを作成する
    - 抽出対象が増える度にそんなことやってられるか。ちくしょうめ。

## 本題
「アーカイブする」と考えるから苦労するのであって、「抽出する」と考えれば標準検索機能を使えばいいと気づく。
`https://***.tumblr.com/search/`
「A」と「B」両方のタグを持つpostを抽出するには上記URLに以下のようにパラメータを追加すればよい。
`https://***.tumblr.com/search/%23A+%23B`

## 擬似アーカイブページへのリンク
以下は無料テーマ[Observer](https://www.tumblr.com/theme/36900)を使用した例である。

### ソース
```html
<ul>
	<li>Kancolle</li>
	<li><a href="/search/%23日報+%23艦これ">Daily Reports</a></li>
	<li><a href="/search/%23攻略+%23艦これ">Tactics</a></li>
</ul>
```

### スクショ
![searchtags.png](https://qiita-image-store.s3.amazonaws.com/0/95607/a26d396f-c625-1e96-2334-308b9c0a1b30.png)
SublimeText3のPackageControlをローカルバックアップからインストールする方法。

Macの動作がもたついたり、OSのアップデートでシステム領域が膨らんだりしたので、Sierra環境でOSの再インストールを行った。
そのあと、SublimeText3を整えようとしたらPackageControlのインストール自体ができなかった。

後から分かったことだけど、その時　<https://packagecontrol.io/>　がダウンしていて、アップデート用のファイルをダウンロードできていなかったらしい。
１日経った今はサイトは復活しているし、今後使わないかもしれないけれど、その時苦労したのでメモしておく。

## バックアップは大切
ローカルバックアップがなければそもそもこの方法は使えなかった。たとえ自前でバックアップをしたとしても、大きな環境変更の前にはTimeMachineでバックアップすることを強くおすすめする。

* SublimeText3の設定ファイルの場所（MacOS Sierra環境）

```
/Users/(ユーザー)/Library/Application Support/Sublime Text 3
```

## 復旧方法
1. バックアップしたフォルダの、Installed Packages/Package Control.sublime-package を同じ場所にコピペ。
2. SublimeText3を立ち上げて、command + Shift + p で確認すると、PackageControlが使えるようになっていた。

## 所感
* バックアップは大切。SublimeText3の他のパッケージも、公開が終了してもこの方法なら再使用可能ので、取っておいて損はない。
* 正直、<https://packagecontrol.io/>がダウンしているのにチビリそうになった。仕事にSublimeTextを使っているから、今後どうしようって。ただよく考えてみると、便利なテキストエディタとしてしか使っていないから、どうにでもなるなと思い直した。どちらにしても、そうなったときの代替え案は用意しておくに越したことはない。
* 特殊な状況だったため検索しても対応策が見つからなかったのでそれも焦った。StackOverflowでエラー報告が数件あった程度。英語ちゃんと勉強しよう・・・。
Android Studioでよく使うショートカット

**この記事は今後も適宜更新していきます。**
Windows版 Android Studioでよく使うショートカットをまとめます。
個人的には、単にショートカットを覚えるのではなく、メニューのどこにショートカットがあるかを覚えておいた方がいいと思っているので下表のようにまとめました。

#### ターゲット: Android Studio Dolphin (Windows版)

| ショートカット | メニュー | 説明 |
|:-----|:-----|:--------|
|Alt+F7|Edit⇒Find Usages⇒<br>Find Usages|カーソル位置のワードの利用箇所を検索します。これもよく使います。ワード上の右クリックメニューからも実行できます。|
|Ctrl+W|Edit⇒Extend Selection|カーソル位置のワードを選択する。キーを押すたびに選択範囲が拡張されます。これ、地味に便利です。|
|Ctrl+P|View⇒Parameter Info|カーソル位置にあるメソッドのパラメータ情報を表示する。|
|Ctrl+B|Navigate⇒Declaration or Usages|カーソル位置のワードの定義箇所に移動します。とても便利で多用しています。これがないと実装やデバッグの作業効率がガタ落ちでしょうね。|
|F11|Navigate⇒Bookmarks⇒<br>Toggle Bookmark|カレント行をブックマークON/OFFします。今となっては？地味な機能ですが私はよく使います。|
|Shift+F11|Navigate⇒Bookmarks⇒<br>Show Bookmarks|ブックマーク一覧を表示します。その行に移動したり削除することができます。|
|Alt+↓|Navigate⇒Navigate in File⇒<br>Next Method|次のメソッドに移動する。ここも一部日本語「下」ってw|
|Alt+↑|Navigate⇒Navigate in File⇒<br>Previous Method|前のメソッドに移動する。「上」ってなってる。どうぜなら全部日本語化してほしいわw|
|Ctrl+Space|Code⇒Code Completion⇒Basic|コード補完。基本中の基本ですね。でもなんで「スペース」ってカタカナなんだろw|
|Ctrl+/|Code⇒<br>Comment with Line Comment |カレント行または選択行をコメント化、コメント解除します。XMLのコメントも楽に記述できます。|
|Ctrl+Shift+/|Code⇒<br>Comment with Block Comment |選択した行をブロックコメント化、またはコメント解除します。これも便利です。|
|Ctrl+Alt+T|Code⇒<br>Surround with⇒<br>Surround with RowまたはColumn|選択行をRowまたはColumnで囲む。これも覚えておくと便利です。|
|Ctrl+Alt+L|Code⇒Reformat Code|コードを整形します。使わないなんてあり得ない？です。|
|Shift+F6|Refactor⇒Rename|カーソル位置のワードのリネーム。クラス名やメソッド、変数名を一気に変更したい場合にとても便利です。ファイル名の変更にも使えます。|
|F7|Run⇒Step Into|１ステップ詳細実行。なんて訳していいやら（苦笑）。F8よりも細かな単位で実行します。|
|F8|Run⇒Step Over|１ステップ実行。ブレークポイントで止まったらF8を押していき詳細を確認。私はこのパターンが基本です。|
|F9|Run⇒Resume Program|実行再開。次のブレークポイントまで停止しません。|
技術英語 > Think of this approach as [triangulating the defect]. / cloaking device

@ Code Complete (No. 17604 / 36077)

> Think of this approach as <font color=red>triangulating the defect</font>.

https://en.wikipedia.org/wiki/Triangulation
> In trigonometry and geometry, triangulation is the process of determining the location of a point by forming triangles to it from known points.

「三角測量にて位置を割り出す」から転じて「defect(の場所)を見つけ出す」という意訳ができそう。

Star Trek VoyagerなどのSFでも時々出てくる用語。

http://memory-alpha.wikia.com/wiki/Battle_in_the_Bassen_Rift

> On the Enterprise bridge, ship's counselor Deanna Troi offered a means of tracking the Scimitar through its cloaking device – by telepathically contacting the Reman Viceroy (who had previously contacted Troi in the same way), <font color=red>triangulating his position</font> and disabling the starship's cloaking device.

意訳「Enterpriseのブリッジにおいて、船のカウンセラー Deanna Troiがcloaking device(*1)を通りこしてScimiltarを追跡する手段を提案した。その手段というのはテレパシーによってReman人Viceroyにコンタクトし、<font color=red>彼の位置を割り出し</font>、船のcloaking deviceを無効にするという方法だ (テレパシーによるコンタクトはViceroyが以前Troiに対して同じ方法で行った）。」

(*1) cloaking device: 船全体を見えなくするStar Trekで登場する装置。

http://ejje.weblio.jp/content/cloak
> (ゆったりとした)そでなしの外套(がいとう)、マント、<font color=red>おおい隠すもの</font>、仮面、口実
仲間内限定のWEBサービスのログイン認証を強化

古いWEBサービスのログインページをユーザーにあまり負担なく強化したい。

* ID + Pass + 鍵的な何か で認証を考えた。
* 自己署名型証明書の鍵配布は、利用者側のセットアップが大変なので避けたい。
* Twitterなどの認証を追加したらもっとスマートだがアカウントがない人もいる。


localhost:8888 でListenする実行ファイルを配布し、ログインに用いるものとする。
(この実行ファイルは`php -S 127.0.0.1:8888`的なもの。)

## 回避したい問題

* 従来のログインには影響を与えたくない。
* ログインページを発見した第三者にログインさせたくない。(仲間によるファイルの流出は考えないものとする)
 

## 方法

1. 通常のログイン画面に以下追加

```diff:
+ <script type="text/javascript" src="http://localhost:8888/key.js"></script>
```

key.js 内で読み込み元のログインフォームを書き換える。

```js:key.js
var authkey = document.getElementById("authkey");

var login_form = document.forms[0];
var org = "login";
var to = org + "new";
// 1.ログイン認証先を変更。ようわからんアドレスにしてもよいかも
login_form.action = login_form.action.replace(org, to);
// わかりやすいように背景色変更
document.body.style.backgroundColor = "green";

// 2. 推測されそうにない巨大なパスワード的な何かを準備
var pw = ""; 
pw += "Oihiush0 quit5aFo ohngohF6 oeCah8Sh aepee4Ah cur2Aema zec3Ue3E IechahC7";
pw += "iGeewo0x Vo3Mah2a chie2ooM MuiPh5sh aD3eicoi BeoSh6uh dosh5ahY kuJ4irei";
pw += (略);
pw += (略);
pw += (略);
pw += (略);
pw += (略);
pw += (略);
pw += (略);
pw += (略);
pw += (略);
pw += (略);


// 3.推測されそうにない巨大なパスワード的な何かをつっこみ合わせてPOSTしてもらう
authkey.value = pw;
```

サーバー側で $_POST["authkey"] 値をチェック。

あとは通常通りID/Passを入力してもらえばよい。

## さらなる強化の案

* 今回はローカルに実行ファイルを用意する例のため、実行ファイルから端末内部の固有情報（MACアドレスなど）を吸い上げ追加させても良いと思います。（認証サーバー側に追加は必要。）
* UserAgentで絞っても良いかもしれません。
python実行ファイル変換ライブラリ比較（py2exe, cx_freeze, pyinstaller）

# はじめに
pythonで実行形式に変換するライブラリがいくつかありますが、結局どれを使えば良いのかわからなかったので、まとめて試してみました

今回使ったコードは
https://github.com/nabehide/tryFreezing
にあります

比較するライブラリは下記の３つです。

* [py2exe](https://pypi.python.org/pypi/py2exe)
* [cx_Freeze](https://pypi.python.org/pypi/cx_Freeze/4.3.4)
* [PyInstaller](http://www.pyinstaller.org/)
* （[py2app](https://pythonhosted.org/py2app/)はWindows未対応のため、今回は使いません。）

# 環境
* Windows7 32bit professional
* CPU : Core-i5-4310U 2.00GHz
* RAM : 4GB

# Python環境
* Python 2.7
* numpy : 1.11.2
* matplotlib : 1.5.1
* PyQt : 4.11.4

# 検証コード
下記のようなサンプルコード（main.py）を実行形式に変換したいとします。

* PyQt4を使ったGUI
* matplotlibで描画ができる

```main.py
import sys
from PyQt4 import QtGui  # , QtCore
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class UI(QtGui.QWidget):

    def __init__(self):
        super(UI, self).__init__()
        self.initUI()
        self.drawFigure()

    def initUI(self):
        # window setting
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle('Window title')

        # figure setting
        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.axes = self.fig.add_subplot(111)
        layoutFigure = QtGui.QGridLayout()
        layoutFigure.addWidget(self.canvas, 0, 0)

        self.setLayout(layoutFigure)

    def drawFigure(self):
        x = range(100)
        y = range(100)
        self.axes.plot(x, y)
        self.canvas.draw()


def main():
    app = QtGui.QApplication(sys.argv)
    ui = UI()
    ui.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
```

# 結果
PyInstallerは3.2だと実行できなかったので
https://github.com/pyinstaller/pyinstaller/issues/2086
を参照して3.3を入れました

```
$ pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
```


個人的に重視する指標として、下記を比較しました。

* ファイルサイズ
* 実行形式への変換に必要な時間(execution time)
（測定には「[cmdで簡単な処理時間計測](http://qiita.com/kazufusa/items/40caaf192e7f719bc1bd)」を参考にさせていただきました）
* 実行形式のプログラムの立ち上がりに必要な時間（start up time）

||py2exe|PyInstaller|cx_Freeze|
|:-:|:-:|:-:|:-:|
|version|0.6.9|3.3.dev0+483c819|4.3.4|
|file size[MB]|43.5|81.5|44.7|
|execution time[sec]|15|49|8|
|startup time[sec]|1|5|1|

Pyinstaller(3.3)はサイズも大きく時間もかかりますが、安定している印象があります。
どのライブラリも、実行形式変換時に色々設定できるので、改善の余地はありそうです。

（[Python環境を変えてサイズの小ささ・速さに挑戦した記事](http://qiita.com/nabehide/items/c23b412bf3a410375636)もあります）

# 対処したエラー
### cx_Freeze
```
cx_Freeze.freezer.ConfigError: no file named sys (for module collections.sys)
```
[collections.sys error](https://bitbucket.org/anthony_tuininga/cx_freeze/issues/127/collectionssys-error)にあるように、excludesのオプションに"collection.abc"を追加しました
サンプルスクリプトは[こちら](https://github.com/nabehide/tryFreezing/blob/master/PyQt4/setup_cx_Freeze.py)


# その他検証したいこと
* numpyを1.9にしてMKLのdllを除く
* python3系で試す
* upxの有無
GAE/Go 自分用メモ

# 忘れてしまうのでメモ(やる気があれば追記する)
- バージョン確認

```shell-session:command-line
goapp version
```
- ローカルで起動

app.xamlの存在するディレクトリに移動。

```shell-session:command-line
goapp serve
```
- デプロイ

app.xamlの存在するディレクトリに移動。

```shell-session:command-line
goapp deploy
```
vagrant box add が出来ない

環境
---
macOS Sierra 10.12.1
vagrant 1.8.7
VirtualBox 5.1.8

現象
---
以下のコマンドが実行できない

```shell-session
vagrant box add ubuntu14 package.box
```

エラーメッセージ

```text
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again
```

原因,対応
---
vagrant 1.8.7 にある curl は壊れている
削除か移動しておく

```sh
sudo mv /opt/vagrant/embedded/bin/curl /opt/vagrant/embedded/bin/curl.bak
```
JAXBで一要素に属性と値を設定する方法

JAXBで一要素に属性と値を設定する際のメモです。
例題として、下記GracenoteのAPIページ「楽曲の詳細属性を検索」欄のTEXT要素を表現するを取り上げます。

[Web API | Gracenote](https://developer.gracenote.com/ja/web-api)

設定方法は、該当要素のオブジェクトで値を設定するgetterに「@XmlValue」のアノテーションを付与します。

```java:MusicQueryBean.java
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

/*
*QUERY配下の要素を設定するオブジェクト
*/
public class MusicQueryBean{
    
    public MusicQueryBean() {}

    private String cmd;
    private String mode;
    private List<TextParamBean> textParamList;
    private List<OptionParamBean> optionParamList;
    
    @XmlAttribute(name="CMD")
    public String getCmd() {
    	return this.cmd;
    }

    public void setCmd(String cmd) {
    	this.cmd = cmd;
    }
    
    @XmlElement(name="MODE")
    public String getMode() {
    	return this.mode;
    }

    public void setMode(String mode) {
    	this.mode = mode;
    }
 
    // 該当の要素を設定するリスト
    @XmlElement(name="TEXT")
    public List<TextParamBean> getTextParamList() {
    	return this.textParamList;
    }

    public void setTextParamList(List<TextParamBean> textParamList) {
    	this.textParamList = textParamList;
    }

    @XmlElement(name="OPTION")
    public List<OptionParamBean> getOptionParamList() {
    	return this.optionParamList;
    }

    public void setOptionParamList(List<OptionParamBean> optionParamList) {
    	this.optionParamList = optionParamList;
    }
   
}
```

```java:TextParamBean.java
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;

/*
*TEXT要素を設定するオブジェクト
*/
public class TextParamBean{
    
    public TextParamBean() {}

    private String text;
    private String type;

    @XmlAttribute(name="TYPE")
    public String getType() {
    	return this.type;
    }

    public void setType(String type) {
    	this.type = type;
    }
    
    @XmlValue
    public String getText() {
    	return this.text;
    }

    public void setText(String text) {
    	this.text = text;
    }
}
```

## 参考
[java - XML element with attribute and content using JAXB - Stack Overflow](http://stackoverflow.com/questions/5514752/xml-element-with-attribute-and-content-using-jaxb)
[Java - JAXB使い方メモ - Qiita](http://qiita.com/opengl-8080/items/f7112240c72d61d4cdf4)
SSL使用時にApacheの再起動時で必要なパスワードの入力を省略

# 今回やること

SSL証明書を使用する場合、Apacheの再起動時に秘密鍵のパスワードの入力を求められます。
開発段階だと、VirtualHostの設定を変更する度に再起動したりすることが多く、一台に複数のアプリケーションを保持している場合は、それぞれのパスワードの入力が必要になります。
これが結構手間で割と安全に省くことができるので紹介します。

# 現状の確認

* CentOS 6.8
* Apache 2.2.15

```bash:Apacheの再起動
$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: Apache/2.2.15 mod_ssl/2.2.15 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server exapmple.com:443 (RSA)
Enter pass phrase:  # ← ここに毎回入力が必要
```

このパスワードを無しで再起動出来るようにしていきます。

# SSL証明書がひとつの場合

## パスワード自動応答スクリプトを作成

パスワードを出力するシェルスクリプトを作成しておき、それを読み出すだけで出来ます。


```bash:シェルスクリプトの作成
$ sudo vim /etc/ssl/certs/pass_ssl.sh
```

```bash:/etc/ssl/certs/pass_ssl.sh
#!/bin/sh
echo 'tVKJDtQf4euzCPss'
```

rootのみ読み書きできるようにしておきます。

```bash:権限の変更
$ sudo chmod 500 /etc/ssl/certs/pass_ssl.sh
```

## Apache の設定

Apacheの設定ファイルを変更します。
例）```/etc/httpd/conf.d/vhost.conf```

```bash:/etc/httpd/conf.d/vhost.conf
# SSLPassPhraseDialog  builtin  # ← コメントアウト
SSLPassPhraseDialog exec:/etc/ssl/certs/pass_ssl.sh
```

これでApacheを再起動した場合にもパスワードの入力を省略出来ます。


# SSL証明書を複数管理している場合

```SSLPassPhraseDialog``` は `VirtualHost` 内に入れることができないため、`/etc/ssl/certs/pass_ssl.sh` に多少工夫が必要です。

## パスワード自動応答スクリプトを作成

例えば、`example1.com` と `example2.com` のふたつのドメインがあると仮定します。

```
$ sudo vim /etc/ssl/certs/pass_ssl.sh
```

```bash:/etc/ssl/certs/pass_ssl.sh
#!/bin/sh
case $1 in
    example1.com:443)
        echo 'W4g0B1OAxKCGoaZm';;
    example2.jp:443)
        echo '2Ly8t0qOFVkdaRew';;
esac
exit 0
```

この場合も、rootのみ読み書きできるようにしておきます。

```bash:権限の変更
$ sudo chmod 500 /etc/ssl/certs/pass_ssl.sh
```

## Apacheの設定

Apacheの設定ファイルを変更します。
例）```/etc/httpd/conf.d/vhost.conf```

```bash:/etc/httpd/conf.d/vhost.conf
# SSLPassPhraseDialog  builtin  # ← コメントアウト
SSLPassPhraseDialog exec:/etc/ssl/certs/pass_ssl.sh
```

これでApacheを再起動をすると、パスワードの入力を省略できます。


# まとめ
案外面倒だったので、結構便利です。
この方法以外にも、秘密鍵のパスフレーズを削除する方法もあるそうです。
参考：[apacheで複数のバーチャルホストでSSLキーのパスフレーズが異なる場合のSSLPassPhraseDialogの書き方](http://d.hatena.ne.jp/learn/20110125/p1)

# おまけ

フォローお待ちしています！

* Qiita: [Carat 吉崎](http://qiita.com/carat_yoshizaki)
* twitter：[@carat_yoshizaki](https://twitter.com/carat_yoshizaki)
* はてなブログ：[Carat COOのブログ](http://carat-tech.hatenablog.com/)
* ホームページ：[Carat](http://caratinc.jp)

サービス紹介
「数学→プログラミング→Webアプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「[キカガク](https://kikagaku.net)」に興味のある方はお気軽にご連絡ください。
[AWS] Python2.7環境にawscliとboto3をインストールするときの問題回避メモ

# はじめに
AWS LambdaのPythonのバージョンは、Python 2.7。
Windows Anaconda環境, Python 2.7環境にawscliとboto3をインストールするときの問題回避メモです。
回避する問題は下記の２点。

1. win-64用のawscli, boto3パッケージが見つからない（Windows Anaconda環境で発生）
    
    ```
    > conda install awscli
    PackageNotFoundError: Package not found: '' Package missing in current win-64 channels:
      - awscli
    
    > conda install boto3
    PackageNotFoundError: Package not found: '' Package missing in current win-64 channels:
      - boto3
    ```
    　
2. Unicode Warning（Python 2.7環境で発生）
    コマンド例
    
    ```
    > aws s3 ls s3://<bucket_name>
    ```
    Anaconda2環境で発生するUnicodeWarning
    
    ```
    Anaconda2\lib\site-packages\dateutil\parser.py:605: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
      elif res.tzname and res.tzname in time.tzname:
    ```
    AWSCLIをmsiインストールした環境で発生するUnicodeWarning
    
    ```
    C:\Program Files\Amazon\AWSCLI\.\dateutil\parser.py:601: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
    ```
    
    
# awscliのインストール
Windows環境の場合は、conda-forgeを指定します。

```
> conda install -c conda-forge awscli
```

# boto3のインストール
Windows環境の場合は、conda-forgeを指定します。

```
> conda install -c conda-forge boto3
```

# インストール状況の確認

+ Anaconda3
    
    ```
    > aws --version
    aws-cli/1.10.44 Python/3.5.2 Windows/10 botocore/1.4.34
    ```
    
+ Anaconda2
    
    ```
    > aws --version
    aws-cli/1.10.44 Python/2.7.12 Windows/10 botocore/1.4.34
    ```
    
※ awsコマンドは、AnacondaのScriptsフォルダにパスが通っている必要があります。

# Python 2.7環境で発生するUnicode Warningの暫定対策
暫定対策ですが、`UnicodeWarning`を抑制します。

+ awsコマンド
    Anaconda2\Scripts\aws.cmd  19行目に`-W ignore::UnicodeWarning`を指定します。
    
    ```変更前.py
    %PythonExe% -x %PythonExeFlags% "%~f0" %*
    ```
    
    ```変更後.py
    %PythonExe% -W ignore::UnicodeWarning -x %PythonExeFlags% "%~f0" %*
    ```
    ※ AWSCLI64.msiをインストールしている場合はAWSCLI64.msiをアンインストールします。
    　
+ pythonコマンド
    `-W ignore::UnicodeWarning`を指定します。
    Botoのサンプルを実行する場合の例
    
    ```
    > python -W ignore::UnicodeWarning .\s3_sample.py
    ```

+ IPython
    IPython起動時にUnicodeWarning抑制スクリプトを実行します。
    `~/.ipython/profile_default_startup` or `<user_home>\.ipython\profile_default\startup`
    
    ```00-ignore-UnicodeWarning.py
    import warnings
    warnings.filterwarnings('ignore', category=UnicodeWarning)
    ```
The box 'vccw-team/xenial64' could not be found

# The box 'vccw-team/xenial64' could not be found
MacでVCCWのバージョンをV3に上げるときにハマった。


## TL;DR
Vagrant 1.8.7の同梱のcurlが悪さしてるらしい。
ので、そいつをrmったら解決。

```
sudo rm /opt/vagrant/embedded/bin/curl
```

ちなみにこのcurlをrmってもVagrantはOSのcurlを使うみたいなので問題なし。

## エラーの全文

```
The box 'vccw-team/xenial64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/vccw-team/xenial64"]
Error:
```

## VCCW V3
ちょっと目を話したすき（?）にVCCWのV3が出ていてアップデートのときにハマった。

[VCCWの公式サイト](http://vccw.cc/)によると
必要なVagrantとVirtualBoxのバージョンが大幅に上がってる・・・。

* Vagrant 1.8.6 or later
* VirtualBox 5.1.6 or later

個人的にVagrantをアップデートすると結構な頻度でハマるので
Vagrantのアップデートがプチ恐怖体験になってる感がある。

## 参考URL

* [VCCW](http://vccw.cc/)
* [Vagrant box could not be found or could not be accessed in the remote catalog - incompatible curl version](http://stackoverflow.com/questions/40473943/vagrant-box-could-not-be-found-or-could-not-be-accessed-in-the-remote-catalog)
* [embedded libcurl provides out-of-date version #7970](https://github.com/mitchellh/vagrant/issues/7970)
GitHub Pagesを Create React App で作る[1]

#はじめに

Github Pagesでポートフォリオのようなページを作成しようと思い、create-react-appでさくっと作りました。**特に技術的に目新しいことはありません**が、迷った点について他の人ならどう解決するのかなと、あわよくばフィードバックを得ようと思い記事にしておきました。

#GitHub Pagesリポジトリを作成
まずはindex.htmlを作成して表示されるところまで進めましたが、既存の記事にある以上のことはしていないのでリンクの掲載に留めます。

[公式](https://pages.github.com/)

またはQiitaで記事を書かれている方がいるので
[GitHub Pagesの作り方](http://qiita.com/k_kentaro123/items/aad2fd3eb57aa33d8224)
を参考にしてください。

`/path/to/github/`
がcloneしたリポジトリとすると

`/path/to/github/index.html`

がトップページになります。

# create-react-app

セットアップについてもリンクの掲載で済ませます。

[公式@github](https://github.com/facebookincubator/create-react-app)

[Facebook公式のcreate-react-appコマンドを使ってReact.jsアプリを爆速で作成する](http://qiita.com/chibicode/items/8533dd72f1ebaeb4b614)


` npum run build` して本場用用のファイルをビルドした後のディレクトリの構成が以下になります。

```
root
├  .gitignore
├  README.md
├  build ・・・本番用
├  node_modules
├  package.json
├  public
└  src

```

実は、Github Pagesの設定を変更してbuildをドキュメントルートにし、create-react-app全体をpushしようとしたのですが良い方法が見当たりませんでした。

せっかくリポジトリを公開するならsrcも一緒にしたかったのですが。。。

結局、buildディレクトリが初期設定では .gitignoreの対象となっていることもあり
Github Pagesのリポジトリを buildディレクトリでCloneしました。

そのため、ビルド前のコードを公開するなら（履歴としたはこっちの方が有用）別リポジトリを作る形になります。

# 開発・運用の流れ

1. `src`のコードを修正
2. `npm run build`で書き出し
3. buildディレクトリに移動し git add/commit/push

# 最後に

他に以下の構成も考えました。
- docsディレクトリを作成してドキュメントルートを変更 && create-react-appのbuild先を変更
- npm scriptを使って、buildコマンドにファイルのドキュメントルートへのコピーやgit add/commit/pushも追加

結局 build = デプロイではない場合もあり取りやめました。



次回、機会があれば動的コンテンツの扱い方について考えたいと思います。

今考えているのは

1. ajaxでgithub外のサーバーのAPIから情報を取得する
2. 動的コンテンツを登録するたびにgithubにjsonをpushし、それをajaxで取得する。

など考えています。
html・cssにおけるclass命名規則について

# はじめに

この記事には多分に個人的な考えが含まれており、メジャーなBEMやSMACCSなどを知っている方が重要だと思います。
自分なりにclassについて考え、複数人で開発を行ってもわかりやすい方法をまとめているにすぎないので、すべてを鵜呑みにすることは避けてください。
また、イレギュラーなケースや、案件によって命名規則は変化・応用すべきであることも忘れないでください。

# class命名規則において重要なポイント

classの命名規則では以下を重要なポイントだと考えます。

- その要素がどんなものなのかわかる
- そのスタイルの影響範囲がわかる
- そのスタイルの独立性がわかる
- そのスタイルの特異性がわかる

以上を踏まえて、識別子を用いて命名規則を考えます。

# class命名規則一覧

## レイアウト

レイアウトスタイルのためのclassです。
このclassでは配置についてのみ定義します。

識別子：「l-」
例：「.l-header」「.l-menu」など

## グローバル

全ページ共通の要素にスタイルを付与します。
**子要素においては一部要素以外、範囲外に出た時のスタイルを保証しません。**

識別子：「global-」
例：「.global-header」「.global-footer」「.global-menu」など

## ページ

ページ特有コンテンツを収める範囲にスタイルを付与します。
**子要素においては一部要素以外、範囲外に出た時のスタイルを保証しません。**

識別子：「page-」
例：「.page-index」「.page-products-detail」など

## モジュール

複数のページで任意の位置に記述を行う共通要素に対して付与します。

識別子：「m-」
例：「.m-breadcrumbs」「.m-pager」「.m-item-list」など

## パーツ

単体でスタイルが維持される要素に対して付与します。
**このスタイルはどの位置に記述されても、そのパーツ固有のスタイルを維持することを保証するものです。**

識別子：「p-」
例：「.p-heading」「.p-btn」「.p-label」など

## ステート (状態)

要素の状態について追加スタイルを付与します。
**このクラスは要素のスタイルに依存します。**

識別子：「is-」
例：「.p-btn.is-current」「.p-btn.is-disabled」など

## デコレーション (装飾)

要素の装飾を定義します。
**このクラスは要素のスタイルに依存します。**

識別子：「d-」or「-」
例：「.p-heading.d-page-name」「.p-btn.-positive」など

## モディフィケーション (修飾)

特定条件下において、どうしてもスタイリングを上書きしなくてはならない場合に使用します。
**このクラスは特定条件下以外使用してはいけません。**

識別子：「md-」
例：「.md-hidden」など

# まとめ

上記はすべてのスタイルに対する種別の定義ではないことを頭に入れておいてください。
識別子が意味するところで重要なのは、冒頭でも列挙しましたが、

- その要素がどんなものなのかわかる
- そのスタイルの影響範囲がわかる
- そのスタイルの独立性がわかる
- そのスタイルの特異性がわかる

です。

例を出すと、あるモジュール内の子要素はそのモジュールに依存しているということになります。しかし、その子要素がパーツの識別子を持っている場合その限りではないということです。

「.m-foo .name」はモジュール「.m-foo」で中のみのスタイルが適用され、「.m-foo .p-name」だった場合「.p-name」は「.m-foo」外に出た時にも同じスタイリングが当てられるべきです。つまるところcssで「.m-foo .name」セレクターに対するスタイルの付与は許可されますが、「.m-foo .p-name」セレクターに対するスタイルの付与は許可されません。そうしたい場合は「.p-name.d-foo」のようにデコレーション(装飾)を使ってスタイリングすべきです。


また、モディフィケーション(「md-」)を用いることで、その要素本来のスタイルを得たい場合は「md-」を削除することで実現できることがわかります。

このように命名規則をまとめ共有しておくことで、他の作業者が見たときに影響範囲やその要素の種別を容易に判別できることが重要だと考えています。
ペアプログラミング導入までの流れと効果

## 経緯
たまにチームで開発していて、相手の席に行ったり来たり、
わからない所教えたり、教え合ったりとペアプロチックなことを少し経験していて、
効果あるんじゃなかろうかとKPTなどで話していた。

## 導入するにあたっての懸念
- 2人で開発するのってコスト高い（ホントにそれに見合うのか）
    - 週に1回30分とかでTRYしてみるのはどうか

## 初期の導入ルール
- 週1回火曜の朝30分
- ペアはランダム
- 取り組む内容はなんでもいい
    - ただしコーディングが含まれるようになるべくすること
    - やることが思いつかなかったら、バグトラッキングシステムから1つ選択してTDDで片付ける。
- 時間は30分以内で必ず終わること
    - 内容が中途半端でもPullRequest作って次回に持越す

## 導入してみての効用
- 週1の30分なら仕事に支障はない
- 以下の効果が感じられた
    - 使っているツールなど便利なものを教え合ったりできる。
        - エディター、シェルの便利なプラグインを教える
    - 非効率なことをやっていたら注意できる
        - Railsでspringを使っていなかったり
    - チームの技術力の底上げ
        - ベテランと新人ペア
            - 新人のスキルの底上げ
            - ベテランの教育能力の底上げ
        - ベテランとベテランペア
            - お互いの強い部分が混ざり、素早くタスクをこなせる
            - 弱い所を補完し合える
        - 新人と新人ペア
            - 互いの刺激になる
            - わからないなりに調べあったりなど、当事者意識、積極性の向上
    - 30分でこなすためにどういうアプローチが効率がいいのかが磨かれていく
    - バグトラッキングシステムが片付いていく

## まとめ

予想以上に効果があり、長期的に取り組むことでチーム全体にいい効果がみこめそう。
取り組んでいて良かったアプローチなどはKPTでさらに共有などしていて、
運用方法等のPDCAを回していきたい。

30分を15分や、全員でなく全体の何％の人を対象にするなどして、
導入効果の検証は低コストでできると思うのでぜひ試してもらいたい。
GitHubのproxy設定

# GitHubのproxy設定を行う
## ハードウェア
- MacBook Pro (Retina, 13-inch, Mid 2014)
- OS X Yosemite 10.10.5
- iTerm2
- zsh

## 設定方法
### **git configにproxyを設定する**
　iTerm2で以下のコマンドを入力します。

```
git config --global http.proxy http://{proxy_name}:{port_number}
git config --global https.proxy http://{proxy_name}:{port_number}
git config --global url."https://".insteadOf git://
```

　実際には、**{proxy_name}**と**{port_number}**の部分を**各自のproxyの情報**を入力してください。

### **git configを確認する**
　iTerm2で以下のコマンドを入力します。

```
git config --list
```

### **git configのproxy設定をリセットする**
　iTerm2で以下のコマンドを入力します。

```
git config --global --unset http.proxy
git config --global --unset https.proxy
```
Windows 10のbashでOpenAI Gym環境を作る

# pyenvのインストール
## 参考にしたもの
* [PyenvによるPython3.x環境構築(CentOS, Ubuntu) - Qiita](http://qiita.com/akito1986/items/be5dcd1a502aaf22010b#step1-%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB "http://qiita.com/akito1986/items/be5dcd1a502aaf22010b#step1-必要なパッケージのインストール")
* [Bash on Ubuntu on WindowsでTensorFlowを使うためのメモ - Qiita](http://qiita.com/toyolab/items/bccd03d4cb7795112ab6 "http://qiita.com/toyolab/items/bccd03d4cb7795112ab6")


## 事前準備
```
sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
```

## pyenvダウンロード
```
cd ~
git clone git://github.com/yyuu/pyenv.git .pyenv
cd .pyenv
mkdir versions shims
```

## 環境変数・初期化の設定
```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="${PYENV_ROOT}/bin:${PATH}"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```
```
source ~/.bashrc
```
あるいは、一度`exit`して`bash`に入り直す

# pythonのインストール
```
pyenv install -v 3.4.5
```

## デフォルトバージョンの変更
```
pyenv global 3.4.5
pyenv versions
# 3.4.5に * がついていればOK
```

# OpenAI Gymのインストール
```
pip install gym
```
# その他
## openglインストール
```
sudo apt-get install python-opengl
```

## g++インストール
atari環境のインストール（`pip install 'gym[atari]'`）で
> CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found.   Please set CMAKE_CXX_COMPILER to a valid compiler path or name.

と言われた場合。

```
sudo apt install g++
```
vagrant 1.8.7 でboxを追加しようとするとエラーになる時の対処法

# 環境

OSX 10.11.6
Vagrant 1.8.7

# エラー内容

boxにbento/centos-7.2を追加しようとするとエラー

```
$ vagrant box add bento/centos-7.2
The box 'bento/centos-7.2' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/bento/centos-7.2"]
Error: 
```

# 対処法

vagrant内のcurlに問題があるようなので、それを削除する。
curlが元から入っていればそっちを使うようになる。

```
sudo rm -rf /opt/vagrant/embedded/bin/curl
```

# 結果

途中まで動いたけれど、SSLRead()でエラー発生

```
$ vagrant box add bento/centos-7.2
==> box: Loading metadata for box 'bento/centos-7.2'
    box: URL: https://atlas.hashicorp.com/bento/centos-7.2
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2
==> box: Adding box 'bento/centos-7.2' (v2.3.0) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/bento/boxes/centos-7.2/versions/2.3.0/providers/virtualbox.box
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

SSLRead() return error -9806
```

tmpファイル内のbox...ディレクトリを削除して、

```
$ rm -rf ~/.vagrant.d/tmp/box*
```

再実行したらダウンロードできた。

```
$ vagrant box add bento/centos-7.2
==> box: Loading metadata for box 'bento/centos-7.2'
    box: URL: https://atlas.hashicorp.com/bento/centos-7.2
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2
==> box: Adding box 'bento/centos-7.2' (v2.3.0) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/bento/boxes/centos-7.2/versions/2.3.0/providers/virtualbox.box
==> box: Successfully added box 'bento/centos-7.2' (v2.3.0) for 'virtualbox'!
```

# 参考

[Vagrant1.8.7でbox addがエラーになる](https://mediaash.com/2016/11/08/vagrant1-8-7でbox-addがエラーになる/)
[vagrantのboxのダウンロードに失敗する](http://qiita.com/circled9/items/0bef6c6b5855ae189a49)
個人的な Common Lisp プログラミングのパターンメモ帳

# 概要
こんな感じでプログラミングしてます的なやつ。
個人的なメモ用で、別にベストプラクティスというわけではないです。

## メソッド名は返り値を想定できるようにする

いろんな種類のリクエストを送るライブラリを書いていると想定する。

以下だと、```(request client req)``` のような呼び出しで何が返ってくるかはreqの宣言を遡らないとわからない。なので可読性の低いコードを作ってしまいそう。

```cl
// A案 (△)
(defgeneric request (client request))

(defmethod request ((client client) (request http-request) ...)
(defmethod request ((client client) (request ftp-request) ...)
```

以下だと、```(http-request client req)```はHTTPのレスポンスが返ってくるということが分かる。なぜなら、このインターフェイスではrequestの実装の違いを吸収してhttp-requestを実行し、HTTPのレスポンスを返却しているから。

```cl
// B案 (〇)
(defgeneric http-request (client request))
(defmethod http-request ((client client) (request request) ...)

(defgeneric ftp-request (client request))
(defmethod ftp-request ((client client) (request request) ...)
```

たいていの場合、メソッド名で返り値の型を想定できるようにすればよさそう。

A案の場合でも、http-requestとftp-requestというリクエストの違いを吸収し何か共通の処理をして、処理をした結果得られる値が同じ型になるなら、たぶん問題はないと思う。でも、今回の場合は単純にそれぞれリクエスト処理をするコードを実装するということだったので、A案のようなインターフェイス設計はたぶんNG。

また、そもそも返り値がないなら別に何してもいいかなとは思う。


## Common Lisp以外の処理をする場所はメソッドに切り出す

IO等、Common Lisp以外のものとやり取りしてデータを取得するようなところはメソッドに切り出したほうがよさそう。なぜなら、取得したデータを処理するロジックがテスト可能になるから。

```cl
// A案 (△)
(defun http-request (client request) ...)

// B案 (〇)
(defgeneric http-request (client request))
(defmethod http-request ((client client) request) ...)
```
以上のようにしておけば、http-requestを使うロジックがテスト可能になる。

```cl
(defclass fake-client ()
  ((responses
    :initarg :responses
    :accessor fake-client-responses)))

(defmethod http-request ((client fake-client) request)
  (pop (fake-client-responses client)))

(test test-abstract-logic-using-http-request
  (let ((client (make-instance 'fake-client :responses <responses>)))
    (is (equal (some-abstract-logic client) ...)))
```
Visual Studio 2015でElectron 1.4.6の開発する時のメモ

Electron 1.4.6をVisualStudio2015で始めたときのメモ。

Visual Studio 2015の設定等については、下記を参考にすればOK。
http://qiita.com/mt08/items/319a73f34d2b95c9dab8

ただし、ソースコードは、そのまま使えないので下記のソースを使う。
http://qiita.com/Quramy/items/a4be32769366cfe55778

以上で問題なく作業が始められる。
毎回必ず忘れて調べてしまうAngularJS1.x系のHttpInterceptor（TypeScript）の定義方法を自分のためだけにここに記す。


## 1.Interceptor作る

```httpInterceptor.ts
export default class HttpInterceptor implements ng.IHttpInterceptor {
	static factory($q: ng.IQService,
					$log: ng.ILogService): HttpInterceptor {
		return new HttpInterceptor($q, $log)
	}

	constructor(
		private q: ng.IQService,
		private log: ng.ILogService) {
	}

	request = (config: ng.IRequestConfig): ng.IRequestConfig => {
		// 必要なヘッダ情報詰め込む
		config.headers['Hoge'] = 'Hoge'
		this.log.debug('Request:', config)
		return config
	}

	requestError = (rejection: any)=> {
		// ステータスによって処理を分岐
		if (rejection.status == 404) {

		}
		return this.q.reject(rejection)
	}


	response = <T>(response: ng.IHttpPromiseCallbackArg<T>): ng.IPromise<T> => {
		this.log.debug('Response:', response)
		return this.q.when(response)
	}

	responseError = (rejection: any)=> {
		// ステータスによって処理を分岐
		if (rejection.status == 404) {

		}
		return this.q.reject(rejection)
	}
}
```

## 2.Interceptor登録する
```app.ts
import angular = require('angular')
import HttpInterceptor from './interceptors/http-interceptor'

let app = angular.module('App', [
	// 必要なmodule入れてください
]);

app.config(['$routeProvider', '$httpProvider', '$logProvider',
	($routeProvider: ng.route.IRouteProvider,
	 $httpProvider: ng.IHttpProvider,
	 $logProvider: ng.ILogProvider)=>{

	// 開発中はデバッグメッセージを表示に
	$logProvider.debugEnabled(true);

	$routeProvider
		.when('/', {
			template: require('../views/login.html'),
			controller: 'LoginCtrl',
			controllerAs: '$ctrl'
		})
		.otherwise({
			redirectTo: '/'
		});

	// interceptor登録
	$httpProvider.interceptors.push(HttpInterceptor.factory)
}])
```
【iOS】開発環境構築＆無料ライセンスで実機デバッグ

# もくじ
1. 背景(無料で開発ができる...だと...)
2. 環境
3. iOSプロジェクト作成まで
4. 実機デバッグまで
5. CocoaPod
6. Github

# 背景(無料で開発ができる...だと...)

Xcode7から、無料ライセンスでも実機デバッグができるようになったんですね(今更)。

iPhoneアプリを開発したい！
でも作るためにライセンス代が約１万かかるのはちょっと...
というジレンマから解放されたのです。わーい！

というわけで、手順をまとめたいと思います。

# 環境
```
Ruby: 2.1.7
rbenv: 1.0.0
device: iPhone5c
iOS: 10.1.1
MacOS: 10.12.1
Xcode: 8.1
```
※ Xcode, rbenvのインストールについては省略

# iOSプロジェクト作成まで

初めに参考文献をば。
[Xcode8を始めてみよう！](http://grandbig.github.io/blog/2016/09/19/start-xcode8/)

上記サイトの手順１〜４を実行。
ひとまずプロジェクトが完成します。

手順２で選ぶファイルに悩んだら、
`iOS > SingleViewApplication`

を選択しましょう。

# 実機デバッグまで

まずは参考文献：
- [[Xcode][iOS] 有料ライセンスなしでの実機インストール 全工程解説！](https://goo.gl/tXs4K0)

この時点で実機デバッグを試みても、以下のようなエラーが出るかと思います。
`Signing for "project_name" requires a development team.
Select a development team in the project editor`

チームの登録をしましょう。

`navigationのXcode > Preferenceを選択し、
Accounts > 左下の+ボタン > Add Apple IDを選択`

**AppleIDがある方**は、リンクの手順６〜７を、
**AppleIDがない方**は、リンクの手順４〜７をそれぞれ実行.

最後に、
`project_name > General > Signing > Team > 登録したApple IDを選択`

これで実機でバッグができるはず。

# CocoaPod
Gemfileを作ります。

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

gem 'cocoapods'
```
その後以下を実行。

```
 $ rbenv local 2.1.7
 $ rbenv exec gem install bundler
 $ rbenv rehash
 $ rbenv exec  bundle install -—path vendor/bundle
 $ bundle exec pod setup
 $ bundle exec pod init 
```

# Github

参考文献：
[ローカルのディレクトリをGitHubに登録してみる](http://d.hatena.ne.jp/yk5656/20140810/1408102125)

ともあれ、[Github](https://github.com/)のアカウントを作りましょう。
無料です。

文献通り、Github上にリポジトリを作成。
その後はプロジェクトのディレクトリに移動して以下を実行。

```
 $ git init
 $ git add directory_name
 $ git commit -m ‘write comment’
 $ git remote add origin git_path
 $ git push -u origin master

※ Github上でリポジトリを作る時にREADMEを追加すると、pullが必要です。

※ GithubのID,passを聞かれたら入力してください。
```

※ git -u オプションについて
[git push -u` オプションの意味](http://qiita.com/ironsand/items/6c301fef730d53f35bc3)


以上でできあがり！

# 参考文献・展望
- [Xcode8時代のプロジェクト新規作成方法まとめ](http://qiita.com/ko2ic/items/4c3e303dcd1e0ee6ff21)
※ fastlaneやswiftLintも今後試したい。

- [SwiftLintを試してみた](http://qiita.com/ushisantoasobu/items/b494c9cf7d78a968b373)
GLSLでifを使わずに条件分岐


前提：モデルが複数の頂点座標を持ち、時間に応じて頂点座標を切り替える


```glsl:main()から抜粋
// 速度
float speed = time * 2.0;

/* ======================================
 * ※1 アニメーション係数
 * ====================================== */ 

// mod : 除算の剰余
// 余りの計算なので割る数以上にはならない
// mod(x, 2.0) = 0.0 ~ 1.99999...
// animation = 0.0 ~ 0.99999...
float animation = max(mod(speed, 2.0) - 1.0, 0.0);

/* ======================================
 * ※2 条件分岐
 * ====================================== */ 

// ステップ数
float steps = 3.0;
// 現在のアクティブなインデックスを計算
float index = floor(mod(speed, 2.0 * steps) / 2.0);
// floor(0.0 ~ 2.99999...)
// 小数点以下を切り捨てると、index = 0 or 1 or 2

// step(閾値, x)
// 閾値 <= x のときは 1.0 , 閾値 > x のときは 0.0
// 1つ目の座標：index = 0.0 のときだけ first = 1.0
float first  = 1.0 - step(1.0, index); 
// 2つ目の座標：index = 1.0 のときだけ second = 1.0
float second = step(1.0, index) * (1.0 - step(2.0, index));
// 3つ目の座標：index = 2.0 のときだけ third = 1.0
float third  = step(2.0, index);

/* ======================================
 * 頂点座標の算出
 * ====================================== */

// mix : 線形補間
// mix(1.0, 6.0, 0.5) === 3.5 (1.0と6.0の50%の地点)
vec3 pos = vec3(0.0);
pos  = mix(positionZero, positionOne,  animation) * first;
pos += mix(positionOne,  positionTwo,  animation) * second;
pos += mix(positionTwo,  positionZero, animation) * third;
// first, second, thirdが 0.0 or 1.0 の状態なので、これでオンオフ（条件分岐）をしている
// mix(x,y,z)の値がなんであろうと、0.0をかけてしまえばゼロ！

// あとはこの座標を gl_Position に渡してあげればよい
```

> 引用
[GLSLスクール サンプル018](https://drive.google.com/drive/u/1/folders/0BwC3bGkHQzfwWHlqa0hqUzZVRU0) より


## アニメーション係数

`mod(speed, 1.0) = 0.0 ~ 0.99999...`を取得できるけれど、
0.0の状態を（静止状態）を一定時間維持したいので、
以下のようなノコギリ型の数値を得るために`mod(speed, 2.0) - 1.0`という式で-1.0~1.0を取得し、`max(x, 0.0)`で0.0以下は0.0として扱っている。

```
1.0    /|   /|   /|
0.0 __/ |__/ |__/ |
```

> 【イージングする場合の参考】
[見本](http://stack.gl/glsl-easings/) / [コードはこちらをコピペ](https://github.com/stackgl/glsl-easings)
[smoothstepについて](http://www.fundza.com/rman_shaders/smoothstep/index.html)

## 条件分岐

secondの計算が肝

```
float second = step(1.0, index) * (1.0 - step(2.0, index));
```

second(index=1.0) より前のindexのとき、`step(1.0, index)`で 全体に0.0をかけることで、second = 0.0 にしている
second(index=1.0) より後のindexのとき、`1.0 - step(2.0, index)`で 全体に0.0をかけることで、second = 0.0 にしている

```glsl:条件分岐を増やす場合
float second = step(1.0, index) * (1.0 - step(2.0, index));
float third = step(2.0, index) * (1.0 - step(3.0, index));
float fourth = step(3.0, index) * (1.0 - step(4.0, index));
```


> 参考
[プログラマブルシェーダとGPUについて](http://hiyoko1986.wiki.fc2.com/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%81%A8GPU%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
Windowsでcursesを使う

# はじめに
cursesやncursesはUnix向けなので，Windowsでは使えません。なので代わりにPDCursesというものがあるのでこれを使います。

# 環境
- Windows 10
- Visual Studio 2015

# PDCursesのダウンロード
[こちらのGitHubページ](https://github.com/wmcbrine/PDCurses)からPDCursesのソースをダウンロードし，適当な場所に解凍しておきます。

# PDCursesのビルド
**1.** `C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat`を実行します。これは後で`nmake`コマンドを使う前準備です。

**2.** コマンドプロンプトで以下のコマンドを実行して，PDCursesのソースがある場所を指定します。

```
set PDCURSES_SRCDIR=<PDCursesの解凍先>\PDCurses-master
```

**3.** コマンドプロンプトでPDCursesの`win32`フォルダに移動して以下のコマンドを実行します。`nmake`は`C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin`にあります。

```
nmake -f vcwin32.mak
```

**4.** `win32`フォルダに`pdcurses.lib`ができていることを確認します。

# Visual Studioの設定
Visual Studioで空のC++プロジェクトを作って，以下の設定を行います。

- C/C++ > Additional Include Directoriesに`<PDCursesの解凍先>\PDCurses-master`を追加
- Linker > General > Additional Library Directoriesに`<PDCursesの解凍先>\PDCurses-master\win32`を追加
- Linker > Input > Additional Dependenciesに`pdcurses.lib`を追加

# 使ってみる
早速PDCursesを使ってみましょう。`curses.h`をインクルードするとPDCursesの関数を使えるようになります。

以下のプログラムを実行すると`Hello curses`という文字列が斜め下に移動しながら表示されます。

```cpp
#include <curses.h>

int main(int argc, char *argv[])
{
	// 初期化
	if (initscr() == NULL) {
		return 1;
	}

	int i = 0;

	while (true) {
		// 画面をクリア
		erase();

		// 文字列を描く
		mvaddstr(i, i, "Hello curses");
		i++;

		// 画面を更新
		refresh();

		// 1秒待機
		napms(1000);
	}

	return 0;
}
```

# 参考リンク
[ぽんこつ研究所 - PDCursesを使ってみたい](http://pokotsun.mydns.jp/?p=2343)
Ubuntu 16.04 LTSでのadminer導入メモ

# 導入

```
$ sudo apt install adminer
```

# localhostからしかアクセスできないように設定

`/etc/adminer/apache.conf` を以下のような感じに編集

```
diff --git a/adminer/apache.conf b/adminer/apache.conf
index 9e56fe3..88ab7e4 100644
--- a/adminer/apache.conf
+++ b/adminer/apache.conf
@@ -5,6 +5,9 @@ Alias /adminer /usr/share/adminer/adminer
 <Directory /usr/share/adminer/adminer>
        Options FollowSymLinks
        DirectoryIndex index.php
+       Order Deny,Allow
+       Deny from all
+       Allow from 127.0.0.1
 
        <IfModule mod_php5.c>
                AddType application/x-httpd-php .php
```

# apacheを再起動して設定反映

```
$ sudo service apache2 reload
```

# 動作確認

localhostではアクセスできて，

```
$ w3m -dump localhost/adminer
ログイン

データベース種類 [MySQL     ]
     サーバ      [                    ]
    ユーザ名     [                    ]
   パスワード    [                    ]

[ログイン] [ ]永続的にログイン
言語: [日本語      ] [使用]
Adminer 3.3.3  
```

remoteからはアクセスできる

```
$ ssh remote w3m -dump 192.168.1.102/adminer
Forbidden

You don't have permission to access /adminer on this server.

```

利用時は`ssh user@sqlserver -L 8080:localhost:80`とかする想定


```
remote$ ssh user@sqlserver -L 8080:localhost:80
remote$ w3m -dump http://localhost:8080/adminer
ログイン

データベース種類 [MySQL     ]
     サーバ      [                    ]
    ユーザ名     [                    ]
   パスワード    [                    ]

[ログイン] [ ]永続的にログイン
言語: [日本語      ] [使用]
Adminer 3.3.3  

```
各Webサービスにおける共有リンクまとめ

##目的
拙いながらも、独学で[Wordpressテーマ](https://github.com/wkwkrnht/2016-by-wkwkrnht)を作成しているのですが、その作成過程で調べたことをまとめたいと思います。フォーカスするのは、[前回](http://qiita.com/wkwkrnht/items/547dde620c6462db7970)に続いてシェアボタンです。
##以下URL
というわけで、羅列していきたいと思います。{}は中身に沿って代入していただければと思います。
###Twitter
https://twitter.com/share?url={URL}&text={TITLE}&via={TwitterAccount}
###facebook
http://www.facebook.com/share.php?u={URL}
###LINE
http://line.me/R/msg/text/?{TITLE}%0D%0A{URL}
###Google+
https://plus.google.com/share?url={URL}
###yammer
https://www.yammer.com/messages/new?login=true&trk_event=yammer_share&message={message}
※これは未検証かつこれを検証しているドキュメントが見つかっていません。ですので、動くかどうかは断言できません。一度、ご自身で動作検証していただくことを勧めるとともに、一連の動作については、こちらで責任を持つことは出来かねます。
###Linkedin
https://www.linkedin.com/shareArticle?mini=true&url={URL}&title={TITLE}
###buffer
https://bufferapp.com/add?url{URL}
###reddit
https://www.reddit.com/submit?url={URL}
###vk
http://vkontakte.ru/share.php?url={URL}
###stumbleupon
http://www.stumbleupon.com/submit?url={URL}&title={TITLE}
###楽天 Social News
https://socialnews.rakuten.co.jp/submit?url={URL}
###Sphinn japan
http://www.sphinn.jp/submit.php?url={URL}
###フロッグ
http://www.flog.jp/post.php?url_uri={URL}
###はてブ
http://b.hatena.ne.jp/add?mode=confirm&url={URL}&title={TITLE}
###pocket
http://getpocket.com/edit?url={URL}&title={TITLE}
###pinterest
http://pinterest.com/pin/create/button/?url={URL}&media={ImageURL}
###Instapaper
http://www.instapaper.com/text?u={URL}
###tumblr
https://www.tumblr.com/widgets/share/tool?canonicalUrl={URL}
###AT&T SMS
https://lprod.code-api-att.com/attshare/textButton/auth_send?client_id={API_}&source=tryitnow&page={URL}
###PSN
https://my.playstation.com/profile/{ID}
これはプロフィールページですが、後のためのメモです。
git log 頻出オプション

git logは編集履歴を見るためだけで、ざっくり使っていたので
まとめて見ました。ProGitの焼き増し的な内容です。
# git log --oneline
履歴をSHA-1の短縮表記とコミットコメントのみを表示します。
短縮表記は4桁より大きく、一意であることがわかればgit diffなどの引数に使えるのが便利です。
```
 (master)$ git log --oneline menu.txt
c59f742 チキンカレーを追加
6a045a6 オムライスを追加
cb471ec 烏龍茶を追加
c340204 オレンジジュースを追加
```
# git log --graph
履歴を樹形図で表示します。
樹形図で見るときは詳細情報までは不要なので
--onelineとの併用がおすすめです。
```
 (master)$ git log --oneline --graph menu.txt
*   6965b23 merge dessert
|\
| * 8219893 チョコレートケーキを追加
| * 5f7da4c バニラアイスを追加
* | eab4f1b チーズカレーを追加
|/
* c59f742 チキンカレーを追加
* 6a045a6 オムライスを追加
* cb471ec 烏龍茶を追加
* c340204 オレンジジュースを追加
* ec4ebbd init
```
# ダブルドット
２つのブランチ間でどのコミットがマージされてないか確認する時に便利です。以下の例ではdessertには存在するが、masterには存在しないコミットを表示します。
```
 (master)$ git log master..dessert --oneline menu.txt
8219893 チョコレートケーキを追加
5f7da4c バニラアイスを追加
```

# ^
3ブランチ間以上の差分コミットを探すことができます。
以下の例ではsalad か dessertには存在するが、masterには存在しないコミットを表示しています。--notでも同様のことができます。

```
 (master)$ git log salad dessert ^master --oneline  menu.txt
6fb5f0b シーザーサラダを追加

 (master)$ git log salad dessert --not master --oneline menu.txt
6fb5f0b シーザーサラダを追加

```

# トリプルドット
トリプルドットは2ブランチ間の共通するコミットは除いて表示してくれます。
--left-rightとの併用がおすすめです。
このオプションが示す右と左はコマンドの記述順序によって入れ替わります。

以下の例では
\> が master
\< が saladに所属するコミットです。

```
 (master)$ git log salad...master --oneline --left-right  menu.txt
> 16f5231 チキンナゲットを追加 (右
< 6fb5f0b シーザーサラダを追加 (左
```