OmniAICreator/Qiita-1.07M huggingface dataset:
Python3でTkinterを使う方法

Python3 で GUI を構築する標準ライブラリの Tkinterの簡単な使い方メモです。

# 簡単な使い方メモ

## ライブラリのimport

```import_test.py
import tkinter
# あるいは
from tkinter import *
```

# ボタンを作成する

```window_test.py
from tkinter import *
win = Tk()
btn = Button(win, text="hoge")
btn.pack() # ウィンドウにボタンを配置
```

## 作成後にプロパティを変更する

オブジェクト生成後、オプション名を辞書インデックスのように指定します。

```change_property.py
from tkinter import *
win = Tk()
btn = Button(win, text="hoge")
btn.pack() # ウィンドウにボタンを配置
# プロパティの変更
btn["text"] = "foo"
```
あるいは、config()メソッドを使って複数の属性を更新可能です。

```
btn.config(text="foo")
```

## プロパティの一覧を見る

REPLで、``(obj).configure()``` とやると、プロパティの一覧を見ることができます。

```
>>> from tkinter import *
>>> win = Tk()
>>> win.configure()
{'bd': ('bd', '-borderwidth'),  ...
```

## クリックイベント

イベントは、bind()を使い、btn.bind(イベントパターン, コールバック)で指定します。

```click.py
from tkinter import *
win = Tk()
btn = Button(win, text="hoge")
btn.pack() # ウィンドウにボタンを配置
# イベントを設定
btn.bind('<1>', lambda e: print(e))
```

代表的なイベントの種類は、次の通り

| イベント | 説明 |
|:----|:----|
| \<Button-1> または、<1> | マウス左ボタンクリック |
| \<KeyPress-H> | Hキーの押下 |
| \<Control-Shift-KeyPress-H> | Ctrl + Shift + Hの押下 |

- [参考-Event sequences](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/event-sequences.html)

# 参考になるページへのリンク

参考になるページへのリンク。

- [公式](https://docs.python.jp/3/library/tkinter.html)
- [Tkinter 8.5 reference(英語)](https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html)

日本語のページで、役立つ情報は、それほど多くありません。以下、分かりやすく紹介しています。

- [python tkinter sqlite3で家計簿を作る](http://memopy.hatenadiary.jp/archive/category/%E5%AE%B6%E8%A8%88%E7%B0%BF)
IEでmain要素が認識されないことがある

main要素にbackgroundやらmarginやら設定していて、なぜかIEで表示されなかった。
なんでや！HTML5勧告やぞ！とパニクったので忘備録として残しておきます。

#IEでmain要素が認識していなかったコード
確認環境：InternetExplorer11.0.43

```HTML:index.html
<body>
  <header>
    ヘッダー要素
  </header>
  <main> <!-- メイン要素ここから -->
    <section>コンテンツ</seciton>
    <section>コンテンツ</seciton>
    <section>コンテンツ</seciton>
  </main> <!-- メイン要素ここまで -->
</body>
```

```CSS:style.css
main {
  background: url(img/bg.jpg);
  width: 1024px;
  height: 720px;
  margin: auto;
}
```

IEで背景が表示されないのはwidthやheight指定がされていないのが原因～というのもありましたが、どうもそうでもない様子。
それどころかmargin:autoが利いていなかったので、そもそもCSSが問題ではないのでは？と辿り着く。

するとこんな記事を見つけました。

>HTML5 から追加された要素 main ですが、レイアウトに導入するには注意が必要です。 
>**IE9 ~ IE11(開発者ツール上は Edge 表記)では、main 要素の display プロパティの規定値は inline** です。
>したがって、ページ全体の構成を main 要素で指定する場合には、**main 要素に display:block を指定する必要があります。**
>Chrome や FireFox などは、main 要素の display プロパティの規定値は block ですから、重複する指定になりますが、IE のために回避できません。
>[カラクリ.jp より引用](http://xn--lcki7of.jp/786/)


![どうしてIE.png](https://qiita-image-store.s3.amazonaws.com/0/176912/b0a099d4-74e4-90b6-8609-3b4db704872d.png)


なぜIE以外はdisplay:blockなのに……しぶしぶdisplayを指定してやる。

#解決したコード

```HTML:index.html
<body>
  <header>
    ヘッダー要素
  </header>
  <main> <!-- メイン要素ここから -->
    <section>コンテンツ</seciton>
    <section>コンテンツ</seciton>
    <section>コンテンツ</seciton>
  </main> <!-- メイン要素ここまで -->
</body>
```

```CSS:style.css
main {
  background: url(img/bg.jpg);
  width: 1024px;
  height: 720px;
  margin: auto;
  display:block; /* IE対策に追加 */
}
```

これで問題なくbackgroundもmarginも利きました。やったぜ！
headerやfooterも利くのにmainだけ認識されていなかったため戸惑いましたが、これからは気を付けてあげよう……。
ターミナルにドラッグするだけでパスが入るって知ってましたか？

#ドラッグ＆ドロップできたんだ...
ターミナルをたちあげて、cd (半角スペース)と打ち込んで
開きたいフォルダをファインダからターミナルにD&Dすると

```shell-session
$ cd /User/XXXX/Desktop/aaa/
```

のようにパスが自動で入ります。
これ知らずにいままで打ち込んでましたよ...
Docker for Mac でリセットせずにディスク容量を開放する

Docker-for-Mac を使っているとよく遭遇するのが、開発マシンのディスク容量が圧迫される問題ですね。
なぜか `docker rmi` しても全然開放されないので、今までは設定画面から `Reset to factory defaults` していました。
ただ、 `Reset to factory defaults` って割り当てた CPU とかメモリの設定もリセットされて面倒だったですよね。

# 発見

今日もいつものようにディスク容量が圧迫してきたのでリセットしようとしたんですが、見たこと無いボタンが増えてました。

<img width="492" alt="スクリーンショット 2017-07-05 15.07.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/36620/64b6a07d-9169-1b73-b6f1-f1d93fec7803.png">

`Remove all data` というこのボタンを押したところ、他の設定はリセットされずにディスク容量が開放されました :tada: 
なお、Docker for Mac のバージョンは `Version 17.06.0-ce-mac18` です。
いつから生えてたんですかね〜。

# 所感

早くこの辺の問題も解決されるといいですね〜
[Docker\.qcow2 never shrinks \- disk space usage leak in docker for mac · Issue \#371 · docker/for\-mac](https://github.com/docker/for-mac/issues/371)
DHCPエラー　1010　解決メモ

お世話になっております。
WinServ2012R2を使用しております。

イベントビューアー＞カスタムビュー＞ServerRoles＞DHCP　で
```
ユーザー データベースの整理中に、DHCP サービスは次のエラーを検出しました: 
DHCP データベースにアクセス中に、エラーが発生しました。このエラーの詳細については DHCP サーバーのイベント ログを参照してください。
```
と表示されているのを発見しました。

DHCPサーバーのイベントログで
C:\Windows\System32\dhcp
の
DhcpSrvLog-Mon.log
```
31,07/03/17,08:50:04,DNS の更新に失敗しました,10.66.77.192,WS-FUGA15.dm_hoge.local,,,0,6,,,,,,,,,9017
30,07/03/17,08:50:51,DNS の更新要求,10.66.77.69,dm16l004.dm_hoge.local,,,0,6,,,,,,,,,0
```
とDNS更新がうまく動作していなくエラーをはいているようでした。

DHCPからDNSへアクセスするのはどうやって設定するのでしょうか？

というのを調査するためメモ失礼します。

ご存じな方はご助力頂けますようよろしくお願い申し上げます。
RTVS で .Rhistoryをgit管理下から外す

# RTVSでgit管理
特にRTVSだけの話ではありませんが、Visual Studioでのプロジェクトファイルをgit管理できます。
多数の記事があり、ここで書くまでもないので、こちらにオフィシャルなガイダンスを挙げておきます(こちらの例はTFSのgitリポジトリですが。)：
[Get Started with Git and Team Services](https://www.visualstudio.com/en-us/docs/git/gitquickstart-vs2017)

本家gitのサイトにもVSからgitを使うことに関するエントリがあります（2013で止まっている！）
[A1.2 Appendix A: その他の環境でのGit - Visual StudioでGitを使う](https://git-scm.com/book/ja/v2/Appendix-A%3A-%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AEGit-Visual-Studio%E3%81%A7Git%E3%82%92%E4%BD%BF%E3%81%86)

基本的には以下のオフィシャルのExtensionを入れることになります。
[GitHub Extension for Visual Studio](https://visualstudio.github.com/)

最初の頃のバージョンは、最低限の機能しかありませんでしたが、最近のバージョンではほとんどのgit操作がGUI経由でできるようになっているようです。

# RTVSでの.gitignore

RTVSでgitを使うのは非常に簡単で、通常のプロジェクトと同じように使えます。Rの場合は*.rソース以外にほとんど設定ファイル、中間ファイルを必要としないので、あまり拘ることはありません。

ですが、どうもRTVSを使い始めて、気になるのが、.Rhistoryなどのgitignoreがデフォルトではなされていないようなのです。Visual Studioの.historyはプロジェクトフォルダに展開されませんが、同じプロジェクトをRstudioで開いたりすると、.historyファイルが作られます。

gitignoreについて、推奨のリストがRTVSでも提供されていますが、デフォルトでは適用されないようです。
[RTVS/.gitignore](https://github.com/Microsoft/RTVS/blob/master/.gitignore)
こちらに、MS公式ドキュメントとして推奨されています：
[RTVS documents](https://docs.microsoft.com/ja-jp/visualstudio/rtvs/)
> Q.RTVS プロジェクトで推奨される .gitignore の設定はどのようなものですか?
> A: Github に、.gitignore の推奨ファイルのマスター リポジトリが用意されています。 R .gitignore をご覧ください。

以下のようにgithubにイシューが上がっているにも関わらず、VS2017用の正式リリースに至っても、まだ対応されていないように見えます：
[Consider adding R-specific .gitignore file #1153](https://github.com/Microsoft/RTVS/issues/1153)

ちょっとガッカリ対応ですが、まあしばらく手動で対応し、気長に待ちましょう。

# すでに登録されてしまった、.Rhistoryを外す

.gitignoreを設定した後、ソリューションエクスプローラから.Rhistoryを選択し、削除します。これでgit管理からの削除も行われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/01505b73-90f0-88ed-cc4b-db8addaa6c14.png)

変更ビュー（またはコミットの詳細）からは、以下のように対象ファイルがリポジトリから削除される事が認識されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/a6b6031e-c26c-4540-9814-140dc2c96cdd.png)

その後再び.Rhitoryファイルが作成されても、以下のようにgit管理からは外れていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/15e056df-1851-f2b3-85bc-8abd47b4363f.png)

基本的には上記の操作で以下のコマンドが発行されているようです。参考：[Visual Studio で git のファイルを消す-kazuakix の日記](http://blog.kazuakix.jp/entry/2014/12/11/001245)

```
git rm filename
```

また、上記の場合は、ローカルのファイルも削除されてしまうので、git管理下から外したいだけの時は、以下のようにオプションを付けます。（もっとも.Rhistoryを残したいというシーンはあまりないと思いますが）

```
git rm --cached filename
```

とすると、ソリューションエクスプローラ上では以下のようにファイルは存在するが、次回のコミットでリポジトリからは削除される旨のxマークがつくので、所望の動きであることが確認できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/edb0b06f-0786-77fd-5492-7ba245750ac2.png)

これをコミットすると以下のように無視されているというマークがつきます。きめ細かいですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/f8aabc53-3724-2bde-4285-f3dfe6f65d0c.png)

あとは、心おきなく、REPLやデバッガで実験しまくっても、不要なコミットをしなくてよくなりますね。
Gitリベースでコンフリクトしたときの解決方法

[参考](https://off.tokyo/blog/%e3%83%aa%e3%83%99%e3%83%bc%e3%82%b9%e3%81%a7%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%95%e3%83%aa%e3%82%af%e3%83%88%e3%82%92%e7%9b%b4%e3%81%9d%e3%81%86-git/)
ATOMを使いたい

# 前置き
ベターベストを書いているわけではありません。
常に更新します。

# インストール
## Atomのインストール
https://atom.io/

## PHPもインストールしておいたほうがいい
Windowsの場合xampでphpだけいればおｋ。
パス通す。

# 気になっちゃう設定
## メニューバーとかの日本語化
「File」→「Settings」→「Install」 
「japanese-menu」パッケージを検索
→インストール

## 文字エンコード
「ファイル」→「環境設定」→「コア設定」→「ファイルエンコーディング」

## 不可視文字(タブとかスペースとか)
「ファイル」→「環境設定」→「エディタ設定」→「不可視文字を表示」

# パッケージ
パッケージインストール
「File」→「Settings」→「Install」 
→パッケージを検索→インストール

## ツリー系
### プロジェクト管理(project-manager)
**プロジェクトの登録**
[1]ツリーにプロジェクトを追加
「ファイル」→「プロジェクトフォルダを追加」

[2]登録
「パッケージ」→「Project Manager」→「Save Project」

**プロジェクトの呼び出し**
「パッケージ」→「Project Manager」→「List Project」

### ファイルの横にわかりやすいアイコンを(file-icons)

### ファイル探索方法を追加(advanced-open-file)
ツリーが使いづらいので、
cdっぽく、ファイルを探しにいけるやつを追加。

ctrl + alt + o

## エディタ
### ダブルクリックで同じ文字列を強調(highlight-selected)

### タブ多段表示(multiline-tab)

## ミニマップ(minimap)
このままでも大きいスクロールバーとして使いやすい。

### ミニマップで文字列のハイライト(minimap-highlight-selected)

### ブックマークをminimapでもハイライト(minimap-bookmarks)

## PHP
### 自動補完強化(atom-autocomplete-php)
[1]composerいれておかないとエラーがうるさい
↓Windowsの場合
https://getcomposer.org/Composer-Setup.exe

たぶん↓この辺に入る
C:\ProgramData\ComposerSetup\bin\composer.phar
ので
atom-autocomplete-phpのSettings→「Command to use composer」
にcomposer.pharを指定

[2]PHPのパス設定
atom-autocomplete-phpのSettings→「Command php」にPHPを指定

### PHPの構文チェック(linter-php)
[1]PHPのインストールが必要

[2]パス通す
linter-phpのSettings→「PHP Executable Path」にPHPを指定

### フォーマッター(atom-beautify)
[1]PHPのインストールが必要
WindowsならXAMPでphpだけいれればおｋ

[2]php-cs-fixer.pharをダウンロード
http://get.sensiolabs.org/php-cs-fixer.phar

[3]パス通す
atom-beautifyのSettings→「Executables」→「PHP-CS-Fixer」
「Binary/Script Path」にphp-cs-fixer.pharを指定

atom-beautifyのSettings→「Executables」→「PHP」
「Binary/Script Path」にPHPを指定

[4]設定
atom-beautifyのSettings→「Executables」→「PHP」
「Default Beautifier」を「PHP-CS-Fixer」

[5]実行
右クリック→「Beautfy editor contents」

### Docコメント補助(docblockr)

### クラス、関数の定義元にジャンプ(goto-definition)
ctrl + alt + Enter

### クラス、関数、変数の一覧(symbols-tree-view)
右クリック→Toggles Symbols-Tree-View

# よく使うショートカット
## 文字列検索
(ファイル内)ctrl + f
(PJ内)ctrl + shift + f

## 選択文字列の次の出現位置に飛ぶ
(次)ctrl + d
(前)ctrl + u

## ファイル検索
ctrl + p

## ツリーを出したり隠したり
ctrl + \

## ブックマーク
(選択行をブックマーク／解除)Ctrl + Alt + F2
(ブックマーク先へ)F2
(解除)Ctrl + Shift + F2

# ショートカットの割り当て変更
「ファイル」→「環境設定」→「キーバインド」→「キーマップファイル」

**個人的な設定**

|SC|割り当て|理由|
|:--|:--|:--|
|F3|goto-definition|Eclipseになれてしまったから|

```lang:keymap.cson
'.platform-win32 atom-text-editor':
  'f3': 'goto-definition:go'
```
Railsでよく使うフォルダ

`$ rails new`をするとアプリケーションフォルダ内に大量のサブフォルダが自動的に吐き出される。
このそれぞれに意味があってそれぞれがもちろん重要なのだが、実際にはほとんど触らないものも多い。
初めてRailsアプリ開発に取り組もうとして、このフォルダの多さに面食らって挫折してしまった人も多いと思う(私もそうだ)。そこで、簡単なアプリ開発でよく使う（触る）フォルダをまとめてみる。

## app/assets

JavaScriptやcssなどのファイルをRailsではassets(アセット)と呼ぶ。これらのファイルが置かれているフォルダがここ。
JavaScriptやcssを触る際には、基本的にはこのフォルダを触ることになる。

### app/assets/javascripts/aplication.js

JavaScriptをインクルードしたりするときは、ここに記述する。

### app/assets/javascripts/stylesheet.js

CSSをインクルードしたりするときは、ここに記述する。

## app/controllers

いわずと知れたMVCのCにあたるControllerはすべてここに入っている。
しかし、Railsは基本がしっかりしているのでここに書かれるのは面白みがないコードであることがほとんどである。逆に、こみいった処理がここに書かれている場合、アプリの設計を見直すべきかも知れない。

## app/models

MVCのMにあたるModelが入っている。Railsの場合、`rails generate model Hoge name:string ...`で作成すると、自動的にモデルファイル(Hoge.rb)も生成される。何も書かなくともアプリは動作するが、バリデーションやエラーメッセージを定義するときにはここにコードを書く。ただ、ここに書くのはRubyとは名ばかりの謎言語なので、ちゃんと勉強してからでないと心が折れる。

## app/view

MVCのVにあたるViewが入っている。個人的にはこのフォルダに書き込んでいる時間が一番長い。ユーザーインターフェースを記述する。

## config/routes.rb

ルーティング、どんなURLに対しどのページを表示するかを定義する。基本的にはModelをresourcesとして読み込むことで、そのモデルに標準で備わっているコントローラーに対応するページが自動的にに定義される。個別に定義したい場合、`model#method'の形式でリソースを定義する。設計がちゃんとしていればこのファイルを触る機会は中盤以降なくなっていく。アプリ開発の途中で変更するとリンクがだめになったりするので要注意。

## config/locales/ja.yml

アプリで使用するメッセージの日本語版をここに格納する。gem i18n-railsが必要。メッセージを修正する場合はModel/View/Controllerを直接書き換えるのではなくこのファイルを修正する。Model/View/Controlerには、メッセージに対応するシンボルを記述する。

## Gemfile

bundlerがgemを読み込むときに参照するファイル。gemを追加する際は、直接`gem hogehage install`とするのではなく、Gemfileに`gem hogehage`と記述してから`bundle install`をする。
クラウドサーバでTensorFlow

#概要
クラウドサーバでTensorFlowやってみた。

#写真
![dd.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/db5ff83b-2a17-826e-d25b-fcd8d8ef6663.jpeg)



#方針
クラウドは、IDCF
linuxは、debian
sshは、使わない。
ftpは、使わない。
apacheは、使う。
gui、使う。
ブラウザ、使う。
apt-getは、使わない。
anacondaは、使わない。
pyenvは、使わない。
jupyterは、使わない。
gpuは、使わない。

#サーバーをセットアップ
マシンタイプ　light/s1
LINUX　debian-8.11.1-amd64-DVD-1.iso
ボリューム　12GB
SSHKEY なし
440円/月（税別）
#パッケージでインストール

```
apache2
chromium
```

#aptitudeでインストール

```
python3-pip
python3-scipy
python3-pillow
python3-matplotlib
```

#pip3でインストール

```
tensorflow-1.2.1-cp34-cp34m-linux-x86-64.whl
pandas
```
Quantopianチュートリアル LESSON 7

[前回](http://qiita.com/driller/items/28d7a258f19a69269a93) の続きです。

# LESSON 7 Scheduling Functions

## Trading Calendars
飛ばします、先物が出てきたら解説します。

## Scheduling Functions
これまではアルゴリズムを実行するタイミングとして `handle_data()` を用いてきました。これは毎分実行されますが、毎分トレードしていたら手数料で簡単に破産しそうです。

当然の流れとして、日次や月次で処理したい場合があります。`schedule_function()` 関数は指定した頻度でアルゴリズムをスケジュールできます。

位置|キーワード引数|値
---|---|---
1|func|実行する関数名
2|date_rules|日単位のルール
3|time_rules|時間単位のルール

下記のコードは `rebalance()` 関数を毎日、取引開始から1時間後[^1]に実行しています。

```python
schedule_function(func=rebalance,
                  date_rules=date_rules.every_day(),
                  time_rules=time_rules.market_open(hours=1))
```

またしても、`date_rules` や `time_rules` というインスタンスがなにも定義していないのにいきなり出てきましたね・・・これもQuantopianの独自ルールのようです。

`date_rules` と `time_rules` オブジェクトは下記のメソットが用意されています。

date_rules
* date_rules.every_day()
* date_rules.week_start(days_offset=0)
* date_rules.week_end(days_offset=0)
* date_rules.month_start(days_offset=0)
* date_rules.month_end(days_offset=0)

time_rules
* time_rules.market_open(hours=0, minutes=1)
* time_rules.market_close(hours=0, minutes=1)

下記のコードは `weekly_trades()` 関数を毎週末の取引終了30分前に実行しています。

```python
schedule_function(weekly_trades, date_rules.week_end(), time_rules.market_close(minutes=30))
```

下記のコードは週の始めにSPYをポートフォリオの10%分ロングし、週末の取引終了30分前にポジションを閉じています。
コードは [こちら](https://www.quantopian.com/tutorials/getting-started#lesson7) からクローンできます。

```python
def initialize(context):
    context.spy = sid(8554)

    schedule_function(open_positions, date_rules.week_start(), time_rules.market_open())
    schedule_function(close_positions, date_rules.week_end(), time_rules.market_close(minutes=30))

def open_positions(context, data):
    order_target_percent(context.spy, 0.10)

def close_positions(context, data):
    order_target_percent(context.spy, 0)
```

`schedule_function()` は市場がクローズしている場合はスキップします。また、半日取引の場合は `half_days=False` を設定することでスキップすることもできます。

金融データを扱う場合には休日の扱いが大変面倒なので、この辺はありがたいですね。

[LESSON 6](http://qiita.com/driller/items/28d7a258f19a69269a93) <--> [LESSON 8](http://qiita.com/driller/items/0af8b83b282d62715e4c)

---
[^1]: `time_rules.market_open()` は通常9:30(ET:東部標準時)を返します。
[Java][Maven] 3rdパーティのjarファイルをローカルレポジトリへ登録するpom.xmlの雛形

Mavenレポジトリにない野良(?)jarファイルを、ローカルのレポジトリに登録するときに使うpom.xmlファイルの雛形です。


```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId><!-- TODO:適当に --></groupId>
    <artifactId><!-- TODO:適当に --></artifactId>
    <version><!-- TODO:適当に --></version>
    <packaging>pom</packaging>
    <properties>
        <groupId><!-- TODO:登録したいgroupIdに置き換え -->p</groupId>
        <artifactId><!-- TODO:登録したいartifactIdに置き換え --></artifactId>
        <version><!-- TODO:登録したいversionに置き換え --></version>
        <packaging>jar</packaging>
        <file><!-- TODO:jarファイルの名前に置き換え --></file>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
                <executions>
                    <execution>
                        <id>default-install</id>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
```

まいどまいどmvnコマンドの`install:install-file`ターゲットの使い方をぐぐるのは面倒

グループメンバーにコマンド教えるのも面倒

そんなときに使ってください。
PHPのクラスとオブジェクト


「関数型」言語というものもあるが、phpは「オブジェクト指向型」。
統計などには「関数型」、データを取り出して表示するようなものでは「オブジェクト指向型」が強いらしい。

##オブジェクト指向型

インスタンスを作っていくやつ。
PersonクラスのインスタンスとしてBobとかMaryができる。

#クラスをつくる

```
<?php

namespace App;

class TaskService {

	//プロパティ
	public $hoge;

	//メソッド
	public function hoge(){
	}

}
```

##クラスを利用する

phpでプロパティ、メソッドの呼び出しは `->` を使う。

```
Route::get('/', function(){
	$hhoge = new TaskService();
	
	$hoge->hoge;
	$hoge->hoge();
	
	return "hogehoge";
});
```

##デフォルト値付き

```
<?php

namespace App;

class TaskService {

	public $hoge;

	public function hoge($arg1, $arg2=null){
	}

}
```

ただしデフォルト値を割り当てる場合は、後ろ側に置くこと。

##protected、public、private / static

###protected

クラス内もしくは継承クラスでのみ呼び出し可能。

###public

他の場所からも `->` で呼び出せる。

###private

クラス内でのみ呼び出し可能。

###staticはちょっと別ジャンル

- `new Person`
- `Person::`

どちらで呼び出すのかを決める。

##型をつける

```
<?php

namespace App;

class TaskService {

	public $hoge;

	public function hoge(bool $arg1,array $arg2=null): array
	{
	}

}
```

返ってくる型 `:array` はリターンタイプヒンティングという。
返り値がない場合は `:void` が使える。

#クラスの役割

- 処理
- データ

のどちらを行うクラスなのかははっきりさせておきましょう。

##データを取り扱うクラス：Entity

配列だったデータを

```
<?php


namespace App;

class TaskInfo
{
	public $name;
	public $important;
	
```

とすることで、 `->name` のように取得できるようになる。

```
<?php

namespace App;

class TaskService {

	public $hoge;

	public function hoge(TaskInfo $arg1,array $arg2=null): array
	{
		$name = $arg1->name;
	}

}
```

##コンストラクタ

```
<?php


namespace App;
use App\TaskInfo;

class TaskService
{
	public $name;
	public $important;
	
	public function __construct(
		TaskInfo $task
	){
		$this->task = $task;
	}
	
```

##foreach

```
	$props = ["name", "title"];
	
	foreach($props as $propName){
		$this->{$propName};
	}
	$methodName = "piyo";
	
	$this->$methodName();
	
```

#クラスの継承

`extends` を使う。
何も書かなければ親のメソッドと同じメソッドを作った場合、親の内容は実行されない。
以下のように `parent` で呼び出した場合は、親のメソッドに追加でいろいろ記述できるような感じになる。

```
<?php


namespace App;

class TaskInfo extends Model
{

	public function save(array $options = []){
		parent::save($options);
		//do something...
		return [];
	}
}
```

#PHPのオーバーロード

PHPのオーバーロードは一般的なものとは全然違う、らしい。

##オブジェクトが文字列として扱える

```

public function __toString(){
	return "this is task Service";
}
```

##関数として

```
public function __invoke(){
	return "hogehoge";
}
```

##そのほかにも

- `__get`
- `__call`
[PHP] CakePHP - HABTM(HasAndBelongsToMay)と中間テーブルの罠

# 前提 - 罠にはまるひと

CakePHPで、こんなことをしているひとは罠にはまります。

- モデル間アソシエーションとしてHABTM(HasAndBelongsToMany)を使っている
- HABTMの中間テーブルをモデルとして使っている

図にすると以下のような感じです。
ModelAとModelBが多対多の関係にあります。
CakePHPで多対多を実現するときは、中間テーブルを使います。

本来であれば、中間テーブルにはModelAとModelBの主キーだけを格納しておくべきなのですが、普通にモデルとして使ってしまう場合です。

```
+--------+ n   n +--------+
+ ModelA +---+---+ ModelB |
+--------+   |   +--------+
             |
       +-----+-----+
       | Assoccor  |
       +-----------+       
```


# 罠の内容

CakePHP 1.3時代からあるネタのようです。

HABTMを持つモデルのfind等を呼び出すと、中間テーブルに対するモデルが`AppModel`のインスタンスとして生成されてしまい、自前で用意した中間テーブルに対するモデルが使われない。

何を言っているかわからｎ(ry

上の例で説明しますと、

`ModelA#find`や`ModelB#find`を呼び出すと、`Assoccor`クラスのインスタンスではなく、`AppModel`のインスタンスが、内部的なレジストリに登録されてしまいます。

ここで`Assoccor`クラスを使おうとすると、`AppModel`のインスタンスがやってきます。

コードで書くと、このような感じです。

```php:SomeController.php
class SomeController {
    var $uses = array('ModelA', 'Assoccor');

    public function doSomething() {
        // ...
        $result = $this->ModelA->findAll();
        // ↑ ここで中間テーブルに対するモデルのインスタンスも生成されている

        // ...
        $this->Assoccor->someSpecialMethod(); 
        // ↑ AppModelのインスタンスになっているので、
        //   メソッドが見つからないというエラーになる
    }
}

```


# 解決策

アソシエーションを定義するとき、`with`パラメータで中間テーブルに対するクラス名も渡してあげます。

```php:
array('className' => 'ModelB',
      'joinTable' => 'model_a_model_b',
      'with'      => 'Assoccor'
      );
```



# 参考リンク

- [あの日見たHABTMの中間テーブルの使い方を僕たちはまだ知らない ](https://norm-nois.com/blog/archives/1358)
CentOS7にdocker-engineインストール＆Proxy環境での設定

##はじめに
CentOSにdockerをインストールしたときに普通に`sudo yum install docker`
とやると`systemctl start`したときにデーモンが立ち上がらなかったので
yumリポジトリを作ってインストール先を変えてyum installした。

##dockerのアンインストール
`yum list installed | grep docker`
これでインストールしているdocker関連のものを検索
`sudo yum -y remove パッケージ名`
でとりあえずすべてアンインストール

##既存のyumパッケージの更新
`sudo yum update`

## yumリポジトリの追加
` sudo vi /etc/yum.repos.d/docker.repo`を実行してyumリポジトリを作成
そして以下の内容を記述

```
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```
baseurlはリポジトリのパスを指定している。
enabledはリポジトリを有効にしている。
gbgcheackは１で有効にしている。
gbgkeyはgbgを確認するためのカギの場所を指定している。
gbgチェックとは、リポジトリの信用性をチェックする物である。

## yum install
ここで`sudo yum install docker-engine`を実行。
ここはすんなり。

## proxy設定
`/etc/systemd/system/docker.service.d/http-proxy.conf`を新規作成して
以下の内容を記述。

```
[Service]
Environment="HTTP_PROXY=http://プロキシ名:ポート番号/"
```

これでsystemctlを実行するこのファイルを参照してくれ、proxyの設定ができます。
その後デーモンのリロード` sytemctl daemon-reload`を実行
## systemctl start docker
`sudo systemctl start docker`を実行
`sudo docker run hello-world`を実行して

```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```
と出力があればOK！！！
そしたら`sudo systemctl enable docker`
`sudo systemctl restart docker`をして完了

## おわりに
デフォルトのyum install dockerでうまく起動できない人はこの方法でやってみて下さい。
僕もエラーで半日くらい時間をとられました。
Let's docker run !!

## 参考文献

- [CentOS &mdash; Docker-docs-ja 1.13.RC ドキュメント](http://docs.docker.jp/engine/installation/linux/centos.html)
- 先輩のリファレンス
API keyを.plistにStringで保存して隠す(例: Google Maps Api)

API keyを毎回消してgithubに乗せるのは面倒なので、調べて書きました。
簡単に言うと、
1. apikey.plistを新しく作成, 
2. apikeyをStringとして保存, 
3. 使う場所で読み込む
4. apikey.plistを呼ぶヘルパークラスを作成
5. apikeyを返すメソッドを呼ぶ

## 1. apikey.plistファイルを作成
 
![Screen Shot 2017-07-04 at 9.02.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/dc3f24f1-ccab-297b-6a28-9845a7d10bac.png)

## 2. apiKeyをStringとして保存

新しく作成した.plistにapikeyを追加

![Screen Shot 2017-07-04 at 9.06.46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/a5061ca6-7a33-2056-d4c1-c753c83b89d2.png)

## 3. .gitignoreファイルを作成して無視するファイルを書く
なんでもいいので、テキストエディタを開いて、.gitignoreファイルを新規作成して、
以下を入力してセーブ

```
CollectionView3/APIKey.plist
.gitignore
```

こうすると、APIKey.plistと.gitignoreのファイルが、githubに無視され、中身が変更されても認識されません。ただし一回プッシュした場合は消えないので、gitにすでに上がっていた場合は消してください。

何を無視するかはチームや自分次第だとは思いますが、
あまり変更がないファイル、なくてもプロジェクトが理解できるファイルとエラーログなどは無視してもいいのでは？

 ```
Pods/
Podfile.lock
***.xcworkspace
```

![Screen Shot 2017-07-04 at 9.27.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/2e8fec34-9384-64c3-9da9-4fc2346ee128.png)

## 4.　apikey.plistを呼ぶヘルパークラスを作成
友達がすごく便利なヘルパークラスを作ったのでご紹介
https://github.com/Nismit


```KeyManager.swift

struct KeyManager {
    
    private let keyFilePath = Bundle.main.path(forResource: "apiKey", ofType: "plist")
    
    func getKeys() -> NSDictionary? {
        guard let keyFilePath = keyFilePath else {
            return nil
        }
        return NSDictionary(contentsOfFile: keyFilePath)
    }
    
    func getValue(key: String) -> AnyObject? {
        guard let keys = getKeys() else {
            return nil
        }
        return keys[key]! as AnyObject
    }
}

``` 
apikeyが複数あるとすれば、その中からkeyを指定してValueを返してくれる。

## 5. apikeyを返すメソッドを呼ぶ

やり方はいくつかあると思うのですが、google.maps.apiを使った時は
appdelegateファイルの, 最初のapplicationメソッドの中に指定しました

```AppDelegate.swift
//~

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // Google Maps API Key
        if let APIKEY = KeyManager().getValue(key: "apiKey") as? String {
            GMSServices.provideAPIKey(APIKEY)
            GMSPlacesClient.provideAPIKey(APIKEY)
        }

        return true
    }
//~

```
Debian StretchでCUDA8のコンパイルが失敗する場合

Debian Jessie(Debian 8)からStretch(Debian 9)にアップグレードした場合に起こる障害として、少し前に「[Debian StretchでDovecotへのpop3sアクセスが出来なくなる問題](http://qiita.com/cnloni/items/95bdcf4470ee547f22e3)」という記事を投稿した。大きな障害はそれだけだったと思っていたのだが、CUDA8のコンパイルが失敗するという障害が出現したので、ここに対処法を紹介する。ただし、CUDA9がリリースされた場合には、（おそらく）このような処置は必要なくなるだろう。

前提条件として、CUDA8は、Debianのパッケージではなく独自にインストールしている。CUDAは正式にはDebianをサポートしていないのだが、Ubuntu用のrunfile（cuda_8.0.61_375.26_linux-run）をCUDAサイトからダウンロードしてインストールした。この環境でも、Jessieにおいては何の障害も起きなかった。

コンパイルエラーの一例を以下に示す。

```bash
$ /usr/local/cuda/bin/nvcc \
  -I"/home/oni/git/cuda/cuda3/src" \
  -I"/home/oni/git/plsa/plsa-cpp/src" \
  -I/usr/local/cuda-8.0/samples/common/inc \
  -I/usr/include \
  -I/usr/include/x86_64-linux-gnu \
  -O3 \
  -Xcompiler \
  -D__CORRECT_ISO_CPP11_MATH_H_PROTO \
  -std=c++11 \
  --compile \
  --relocatable-device-code=false \
  -gencode arch=compute_30,code=compute_30 \
  -gencode arch=compute_30,code=sm_30 \
  -m64 \
  -x cu \
  -o  "src/PlsaCuda.o" \
  "../src/PlsaCuda.cu"

/usr/local/cuda/bin/..//include/math_functions.h(8897): error: cannot overload functions distinguished by return type alone

/usr/local/cuda/bin/..//include/math_functions.h(8901): error: cannot overload functions distinguished by return type alone

2 errors detected in the compilation of "/tmp/tmpxft_00000b55_00000000-7_PlsaCuda.cpp1.ii".

```

この原因は、CUDA8において、gccの5.3を超えるバージョンをサポートしていないことにある。CUDA9では、このような束縛がなくなっていることを望みたい。

ひとつの解決策としては、環境変数を

```bash
export EXTRA_NVCCFLAGS="-Xcompiler -std=c++98"
```

のように設定すれば良いとされているが、上記の例のようにc++11を使っている場合には、このやり方は適用できない。

そこで、以下のように、/usr/local/cuda-8.0/binにシンポリックリンクを作成することで、解決することができた。

```bash
$ cd /usr/local/cuda-8.0/bin
$ ln -s gcc /usr/bin/gcc-4.9
$ ln -s g++ /usr/bin/g++-4.9
```

おそらく、NVCCコンパイラがgccとg++を呼び出すときのサーチパスで、/usr/local/cuda-8.0/binが上位に置かれているからであろう。


### Stretchを新規にインストールした場合
なお、上記の解決策が成立するためには、gcc-4.9とg++-4.9のパッケージがインストールされていることが前提条件である。ところが、Debian9では、gcc-4.9やgcc-5.3を一切サポートしないという意固地な姿勢を貫いているので、アップグレードではなく新規にStretchをインストールした場合には、これらのパッケージが存在しない。

この場合は、以下のように対処すれば良い。

+ 一時的に、/etc/apt/sources.listをJessieに振り向ける
+ sudo apt-get update
+ sudo apt-get install gcc-4.9 g++-4.9
+ /etc/apt/sources.listをStretchに戻す

gcc-4.9やg++-4.9は、libc6等の旧バージョンに依存していないので、上記の対処法が有効なのである。


### 参照
+ [cuda-8.0rc supporting gcc6?](https://devtalk.nvidia.com/default/topic/949770/cuda-8-0rc-supporting-gcc6-/)
Quantopianチュートリアル LESSON 6

[前回](http://qiita.com/driller/items/9816429105afba6972aa) の続きです。

# LESSON 6 The history() Function

`data.history()` メソッド[^1]はヒストリカルデータを取得します。
渡す引数は下記のとおりです。

位置|キーワード|値
---|---|---
1||銘柄のインスタンス
2|fields|'price', 'open', 'high', 'low', 'close'
3|bar_count|データの個数
4|frequency|頻度

戻り値はpandasのDataFrame型になります。
下記の例ではAAPLの10日分の価格を取得し、平均を算出しています。

```python
# Get the 10-day trailing price history of AAPL in the form of a Series.
hist = data.history(sid(24), 'price', 10, '1d')

# Mean price over the last 10 days.
mean_price = hist.mean()
```

第四引数に '1d' を指定することで1日毎の頻度でデータを取得しています。'1m' を指定すると毎分のデータを取得します。

'1d' を指定した場合、当日の価格も含まれます。移動平均を目安にするようなトレードでは前日までの平均を使うことがよくあると思います。前日までの10日間の平均を算出する場合は下記のように記載します。

```python
data.history(sid(8554), 'volume', 11, '1d')[:-1].mean()
```
LESSON 5で紹介した `data.current()` と同様に、複数銘柄を指定した場合にはpandasのDataFrame型が返ります。

```python
# Get the last 5 minutes of volume data for each security in our list.
hist = data.history([sid(24), sid(8554), sid(5061)], 'volume', 5, '1m')

# Calculate the mean volume for each security in our DataFrame.
mean_volumes = hist.mean(axis=0)
```

複数銘柄でかつ複数のフィールドを指定した場合にはpandasのPanel型[^2]が返ります。

```python
# Low and high minute bar history for each of our securities.
hist = data.history([sid(24), sid(8554), sid(5061)], ['low', 'high'], 5, '1m')

# Calculate the mean low and high over the last 5 minutes
means = hist.mean()
mean_lows = means['low']
mean_highs = means['high']
```

下記のコードではAAPL、MSFT、SPYの10分間の出来高の平均を出力しています。

```python
def initialize(context):
    # AAPL, MSFT, SPY
    context.security_list = [sid(24), sid(8554), sid(5061)]

def handle_data(context, data):
    hist = data.history(context.security_list, 'volume', 10, '1m').mean()
    print hist.mean()
```

[LESSON 5](http://qiita.com/driller/items/9816429105afba6972aa) <--> [LESSON 7](http://qiita.com/driller/items/c4b0c50f2d7913ec56fa)

---
[^1]: 前回と同様にメソッドと表記します。
[^2]: Panelはxrayに統合されるという話をきいたことがあります。詳細をご存知の方がいらっしゃいましたら教えてください。
いまさら聞けないフロントエンド技術用語集

Webのフロント技術を勉強していると、"この単語知らないなんて言えない・・・！"
という単語がちらほら現れます。
そんなWeb業界初心者の私がこそっとググっていた用語集（ザックリ）。
この辺がピンときていれば、あとは未知に遭遇しても
"次にどのへんを調べたらいいか"、がわかるような気がします。

## DOM  
Documentdomt Object Modelの略。xmlやhtmlドキュメントをツリー構造として表現したもの。
各要素を”ノード”という。

## DOMツリー
これのこと。HTMLは階層的に表現される。
![2FA2F7B9-39BA-4557-A440-120CA33E4709.jpg](https://qiita-image-store.s3.amazonaws.com/0/148170/7a49a541-b482-0c7f-29c5-9ffcb1050f4a.jpeg)

## DOMイベント
ブラウザが用意している、ユーザがDOMに対して行うことのできるイベントのこと。
クリックしたら、とか、マウスがホバーしたら、とかのこと。
好きに実装していいDOMイベント一覧は、[DOMイベントリファレンス](https://developer.mozilla.org/ja/docs/Web2/Reference/Events)を参照。
フロントエンド開発では、たいていの場合、イベントとアクションが対になる。

## JSON（JavaScript Object Notation）
テキストベースのデータフォーマットのこと。
実は、JSのオブジェクトを記述するための書式。
`eval()`関数で評価することで、JSオブジェクトに変換できちゃう。
JSONは、key-valueがセットになった形をしており、データ区切りはカンマ。
連想配列の場合、`変数名.key`でvalueを扱う。
全体がツリー構造で表現できるので書く方も読む方もラク。

エンタープライズ系ゴリゴリバックエンド出身の私はCSVくらいしか知らず。
XML,CSVと並んで説明されることが多いが、得手不得手が当然ある。
台頭してきた順番としては　 CSV->XML（Extensible Markup Language）->JSON の順。
### CSVと比べる
CSVはヘッダ行がないとデータの中身がわからないのに対し、
JSONはkey-valueのセットでデータの中身が一発でわかることと、軽量なのがウリ。
CSVはデータの形も項目も一回決めれば固定なものや、
バッチ処理のタイミングが決まっているものなどに適している。
つまりリクエストごとにデータのやりとりが発生するWebシステムにはXML,JSONが向いている。
### XMLと比べる
マークアップなので書くの面倒、読みづらさ、が有名のようす。
属性とテキストノードがごっちゃになったり、ファイルが大きく複雑になりがち。
なので、用途はあまりJSONと変わらないが、JSONの方が入力する文字の量が半端なく少ないし、
パッと見人間フレンドリーなので、敬遠されつつあるみたい。

### Tips
フォーマッタ・バリデータが一緒になったサイト。
https://jsonformatter.curiousconcept.com/

## API(Application Program Interface)
もともと存在するプログラムを呼び出して、
その機能を組み込んだソフトウェアを開発することができる、というもの。
有名なところで行くと、Google、LINE、楽天、Twitterなどが、独自のAPIを開発。
それを、ユーザが利用することで、各サービスのデータをユーザのサイトで利用できるようになる。

### 例えば・・・
* ぐるなびに乗っているGoogleMapのページ(Google Maps API)
* 自分のサイトに、Twitterつぶやき投稿ができるように埋め込む(Twitter API)
* まとめサイトの下の方に表示されてる、Amazon、楽天のアフェリエイト
・・・などなど！

### APIの処理順序
1. クライアントからhttpでサーバへリクエストする
2. サーバ処理してレスポンスが返ってくる

### マッシュアップサービス
WebAPIを組み合わせてできたサービス。


### HTTPリクエスト/レスポンス
送受信されるデータの形式：XML,HTML,JSON,画像ファイル形式が一般的。
ajax形式で利用されることが多い。

## Ajax
Asynchronous JS + XML の略。jsを使って非同期にDOM操作、データ取得ができる。
WebAPIを用いたCGI版のアプリケーションと同様の機能を持つ。

### クロスドメイン制約
JSでAjaxを用いて外部のリソースを取得する場合、その外部リソースは同じドメインでないといけない。
* 回避する方法 -> iframe, JSONP 
*  外部のAPI使うときは、Proxyが必要になる。 

### XSS（クロスサイトスクリプティング）
これを防止するには、ユーザ入力した文字列の画面出力時にはHTMLをエスケープする。

## CGI（Common Gateway Interface ）
Webサーバが外部のアプリケーションとやりとりするためのインターフェースプログラム（サーバ側のプログラムなので言語は問わない）。各リクエストが別々のプロセスを開始しないといけないので、サーバに負荷がかかる

* C,C++ -> ハンドラ
* Java -> サーブレット　と呼ばれる
* PHP使うなら、MAMPで開発する

## FQDN
絶対ドメイン名。FQDNとは、DNS（Domain Name System）などのホスト名、ドメイン名（サブドメイン名）などすべてを省略せずに指定した記述形式のこと。 例えば、「www.atmarkit.co.jp.」 はホスト名「www」とドメイン名「atmarkit.co.jp」をすべて揃えたFQDNである。

## Webサーバ
apache -> UNIX,LINUXで使われる
IIS　 -> Windowsで使われる

## 非同期と同期
- 非同期：並列で実行されることもある
- 同期：直列的に実行する。新しい依頼は待ち行列で処理される。
Pythonでmatplotlibをimportするとエラーが出る場合の対処策（Mac）

エラー内容：

> from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.


バックエンドの問題が発生しているようなので書き換えに行きます。

```shell-session
$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
```

/anaconda/envs/py3.5/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc

みたいに場所が特定できますのでFinderで移動。

matplotlibrc　というファイルがあるのでテキストエディタで開き、

```
backend : macosx
```

と記述してある箇所を特定できたら以下のように書き換えて完了。

```
backend : Tkagg
```
AlfredでPythonのエネルギー影響がえげつない時

# やけにMacがぶおんぶおん言う
確認すると、Alfred内のPythonスクリプトがバックグラウンドで回り続けて、エネルギーを食べ続けていたよう。
![スクリーンショット 2017-07-05 3.38.25.png](https://qiita-image-store.s3.amazonaws.com/0/180836/18b2ace9-e61a-f02d-d32f-1cdcf1e7ea14.png)

CPUも確認すると、Pythonが100%近くいってました。

調べると同じ症状の人いました。
> [Alfred-Workflow library bug - Python 100% CPU Usage.](https://www.reddit.com/r/Alfred/comments/62v3xz/alfredworkflow_library_bug_python_100_cpu_usage/)

どうやら、MacSierraとAlfred-Workflow間のバグらしいです。  
Alfred-WorkflowのPythonスクリプトをバックグラウンドで回すライブラリが古いと、バグが発生するよう。
ので、ワークフロー内のライブラリのアップデートを行う必要があります。
ぶっちゃけよくわかっていません。


# 解決方法
以下のワークフローをインストールします。
これは、インストール済みのワークフローを解析して、古いAlfred-Workflowのライブラリ?が使用されていたら更新してくれるものらしいです。

> [alfred-fixum](https://github.com/deanishe/alfred-fixum)

インストールが完了したら、**```fixum Fix Workflows```** をAlfredで実行。
```updated　1 workflow``` みたいな通知がきたら成功です。
サーバへのSSHログイン契機でメール通知

# 目的
複数のIPからSSHアクセスされるサーバーで信頼していないIPから接続されたら通知する。

## 参考
[SSHでログインしたらメールで通知する](https://bacchi.me/linux/ssh-login-alert/)

# バージョン情報
- CentOS Linux release 7.3.1611 (Core)

## 設定内容
参考にした内容ではシェルを作成していましたが、不要なので/etc/ssh/sshrcに纏めました。
また、1IPのみの信頼となっていたので複数IPを評価するようにしました。

```bash:/etc/ssh/sshrc
SOURCE_IP=${SSH_CLIENT%% *}
# 信頼するIPを指定
TRUST_IP_LIST="192.168.0.100 192.168.0.101"

# リストと比較して信頼していないIPからならメール送付
for HOST in $TRUST_IP_LIST
do
    if [ $HOST == $SOURCE_IP ]; then
      exit 0
    fi
done
echo "\"$USER\" has logged in from $SSH_CLIENT at `date +"%Y/%m/%d %p %I:%M:%S"` to $HOSTNAME " | mail -s "$HOSTNAME sshd login alert" -r root@your.domain root
```

## おわりに
下記のようなメールが来ます。

```
タイトル：[ホスト名] sshd login alert
本文：
"[ユーザ名]" has logged in from 192.168.200.1 37857 22 at 2017/07/05 PM 12:33:56 to [ホスト名]
```
C++11のconstexprでコンパイル時に文字列のMurMur3ハッシュを計算する

文字列の比較は、その文字数によって計算時間が変化する。
例えば、以下の様な長い文字列の比較では、整数の比較に比べると時間がかかる。

```cpp:example1.cpp
#include <string.h>
#include <iostream>

int main() {
    std::cout << strcmp("abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz");
}
```

特に、何度も同じ文字列を比較する様な場合は、比較に要する計算時間を短縮するべきである。
そこで、文字列の比較では、文字列から所定の計算方法によって一意に得られた整数を比較する事がある。
この計算方法をハッシュ関数、得られた整数をハッシュ値という。殆どの場合、ハッシュ値から元の文字列を得る事は出来ない。

一般的に利用されているハッシュ関数にMurMur3というアルゴリズムがある。MurMur3は異なる文字列から同じハッシュ値が算出される事（シノニム）が少なく、計算時間も短いという特徴がある。なおMurMurはムァームァーと発音する。

注意すべき点として、ハッシュ値同士の比較は完全ではない。シノニムが発生すると異なる文字列を同じ文字列であると誤解してしまうからである。しかし、プログラムの実行中に変化しない文字列であれば、シノニムが判明した時点で別の文字列に変更する事でシノニムを回避する事ができる。**例えば、そう、コンパイル時に判明している文字列ならね。**

というわけで、C++11のユーザー文字列リテラルとconstexprを利用してコンパイル時に文字列からMurMur3ハッシュ値を算出するコードを書いた。C++14のconstexprであれば簡単に記述できるにも拘らず、敢えてC++11で記述したのである。理由は推して知るべし。

```cpp:exmaple.cpp
#include <iostream>

namespace murmur3
{

constexpr uint32_t seed = 0;

constexpr uint32_t to_uint32(char const* key, size_t i = sizeof(uint32_t), uint32_t u32 = 0) { return i ? to_uint32(key, i - 1, (u32 << 8) | key[i - 1]) : u32; }

constexpr uint32_t murmur3a_5(uint32_t h) { return (h * 5) + 0xe6546b64; }
constexpr uint32_t murmur3a_4(uint32_t h) { return murmur3a_5((h << 13) | (h >> 19)); }
constexpr uint32_t murmur3a_3(uint32_t k, uint32_t h) { return murmur3a_4(h ^ k); }
constexpr uint32_t murmur3a_2(uint32_t k, uint32_t h) { return murmur3a_3(k * 0x1b873593, h); }
constexpr uint32_t murmur3a_1(uint32_t k, uint32_t h) { return murmur3a_2((k << 15) | (k >> 17), h); }
constexpr uint32_t murmur3a_0(uint32_t k, uint32_t h) { return murmur3a_1(k * 0xcc9e2d51, h); }
constexpr uint32_t murmur3a(char const* key, size_t i, uint32_t h = seed) { return i ? murmur3a(key + sizeof(uint32_t), i - 1, murmur3a_0(to_uint32(key), h)) : h; }

constexpr uint32_t murmur3b_3(uint32_t k, uint32_t h) { return h ^ k; }
constexpr uint32_t murmur3b_2(uint32_t k, uint32_t h) { return murmur3b_3(k * 0x1b873593, h); }
constexpr uint32_t murmur3b_1(uint32_t k, uint32_t h) { return murmur3b_2((k << 15) | (k >> 17), h); }
constexpr uint32_t murmur3b_0(uint32_t k, uint32_t h) { return murmur3b_1(k * 0xcc9e2d51, h); }
constexpr uint32_t murmur3b(char const* key, size_t i, uint32_t h) { return i ? murmur3b_0(to_uint32(key, i), h) : h; }

constexpr uint32_t murmur3c_4(uint32_t h) { return h ^ (h >> 16); }
constexpr uint32_t murmur3c_3(uint32_t h) { return murmur3c_4(h * 0xc2b2ae35); }
constexpr uint32_t murmur3c_2(uint32_t h) { return murmur3c_3(h ^ (h >> 13)); }
constexpr uint32_t murmur3c_1(uint32_t h) { return murmur3c_2(h * 0x85ebca6b); }
constexpr uint32_t murmur3c_0(uint32_t h) { return murmur3c_1(h ^ (h >> 16)); }
constexpr uint32_t murmur3c(uint32_t h, size_t len) { return murmur3c_0(h ^ len); }

constexpr uint32_t operator "" _murmur3(char const* str, size_t len) { return murmur3c(murmur3b(str + ((len >> 2) * sizeof(uint32_t)), len & 3, murmur3a(str, len >> 2)), len); }

}

int main() {
    using namespace murmur3;
    constexpr auto hash = "qwertyuio"_murmur3;
    std::cout << hash; // 64226981
}
```

以上
Androidのサウンド入力

Androidでサウンド録音用のアプリを作っているのですが、アプリが起動したときに内蔵のマイクか、4ピンオーディオジャックでつながれたヘッドセットのマイクのどちらかを判定する方法を調べてみました。

ターゲットはAndroid 2.3のNexus Oneです。

結論を先に書くとありません。

AudioManagerのisWiredHeadsetOn()は3ピンのコネクタであっても4ピンのコネクタであっても接続されていればtrueが返ってきます。

isWiredHeadsetOn()はAPI14以降は非推奨になています。

[Googleのマニュアル](https://developer.android.com/reference/android/media/AudioManager.html)にはIntent.ACTION_HEADSET_PLUGはAPI21以降になっているのですがNexus Oneでも登録すると飛んできます。

onReceive()のstateはisWiredHeadsetOn()と同じ値のようです。マイク付きの場合2が返ってくるというページもありますが、Nexus Oneでは返ってきませんし、Googleのマニュアルでも0か1になっています。

でNexus Oneは3ピンと4ピンを認識してないかというと、そうではないです。onReceive()のmicrophoneとして返ってきます。3ピンが接続された場合は0で、4ピンが接続された場合は1です。

しかし起動時にこの値をとる事はできません。。。

いろいろ試していたら、isWiredHeadsetOn()もonReceive()も動かなくなった。壊しちゃったのかな。幻見てたのかな。。。

Androidのアプリでサウンド録音用のアプリの評価はみんな3以下と低いようなのだが、これはアプリの問題ではなくてAndroid自体の問題な気がする。

どうも接触抵抗とかが影響していて、ピンを拭いたりすると認識したりする。マイクやヘッドセットの認識詳しい資料探したが見つからなかった。ご存知の方教えてください。

岐阜の丸紅食品の水まんじゅうのケースで集音マイク作ってみました。

![写真（2018-08-06 12.57）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/6a9e769e-10ac-74c8-d6ca-2ae5614bef8a.jpeg)
git add -A と git add . の違い（Git 2.x）


# 結論

両者の違いは下記のとおりです。
`git add -A` : ツリー全体を対象とする
`git add .` &nbsp;  : カレントディレクトリ以下のツリーを対象とする

Git 1.x では対象に削除されたファイルを含むかが違いでしたが、Git 2.0からはその違いはありません。


# 検証

まずは作業用のフォルダを作り、gitを初期化します。

```bash
mkdir git-training
cd git-training
git init
```

次に動作を確認するための準備として、ファイルの作成と編集をします。（`git add -A` を使っていますが、準備なので今は気にしないでください。）

```bash
echo 'Change me.' > change-me.txt
echo 'Delete me.' > delete-me.txt
git add -A
git commit -m 'ファイルを追加'
```

ここからが実際に add する対象の操作となります。

```bash
echo 'New file.' > new-file.txt
mkdir dir
mkdir dir/subdir
echo 'File in dir.' > dir/file.txt
echo 'File in subdir.' > dir/subdir/file.txt
echo ' Changed.' >> change-me.txt
rm delete-me.txt
```

```bash
git status
```

```bash
git add -A
git reset
git add .
git reset
```

両者に違いがないことがわかります。

```bash
cd dir
git add -A
git reset
git add .
git reset
```

`git add -A` ではツリー全体が対象となっているのに対し、`git add .` ではカレントディレクトリとそのサブディレクトリのファイルのみが対象となっていることがわかります。

# 参考

* [とうとう Git 2.0 が現実のものに。便利な機能満載](http://japan.blogs.atlassian.com/2014/06/happened-git-2-0-full-goodies/)
* [Difference between “git add -A” and “git add .”](https://stackoverflow.com/questions/572549/difference-between-git-add-a-and-git-add)
    *  Charles さんが 旧バージョンについて、DeveloperさんがGit2.0以降の動作について説明している
webエンジニアに役立つ小技集 vimmerならなお良い


随時追加する所存。

## Vagrant

### どこでもコマンド打てる
vagrantコマンドの後にidを指定すれば作業ディレクトリに関係なくVMを操作できる

Ex: `vagrant halt 9999999`

VMのidは `global-status` コマンドで表示できる

```bash
$ vagrant global-status
id       name    provider   state    directory
-------------------------------------------------------------------------------------
6038658  default virtualbox poweroff /Users/hoge/Workspace/tano-c
99b12cf  default virtualbox running  /Users/hoge/Workspace/running-project
$
$ vagrant halt 99b12cf
==> default: Attempting graceful shutdown of VM...
```

## vim

### ファイル開いて文字化けした時にエンコーディングに対応する

`:e ++enc=euc_jp`

## git

### `--dry-run` 的なことをしたい

「マージするけどコミットしない → キャンセル」という手法をとる

```bash
$ git merge --no-commit --no-ff branch  # マージするけどコミットしない
$ git status                            # 差分を確認 実際にテキストエディタでも見れる
$ git merge --abort                     # マージをキャンセル
```


## CSS

### メニューとかの罫線を `border-top` で引くとき

PIYOのリンクの塊だけに

```html
<div class="menu">
  <div class="group">
  	<a href="/hoge1">HOGE1</a>
  	<a href="/hoge2">HOGE2</a>
  </div>
  
  <div class="group">
  	<a href="/piyo">PIYO</a>
  	<a href="/piyo">PIYO</a>
  </div>

    <div class="group">
  	<a href="/piyo">PIYO</a>
  	<a href="/piyo">PIYO</a>
  </div>
</div>
```

```scss
.menu {
  .group {
    &:nth-child(n+2) {
      border-top: solid 1px gray;
    }
  }
}
```

前はこうしてた

```scss
.menu {
  .group {
    border-top: solid 1px gray;
    &:first-child {
      border-top: none;
    }
  }
}
```

### Rails5 でカスタムウェブフォント
Rails5 の assets pipeline に乗せてカスタムウェブフォントを配信する

フォントを置くディレクトリを作成 `app/assets/fonts/`
フォントファイルをおく `app/assets/fonts/hoge.woff2`

assets pipeline の管理を設定

```ruby:app/config/initilizers/assets.rb
Rails.application.config.assets.paths << Rails.root.join('app', 'assets', 'fonts')
```

font-face 設定
フォントファイルの指定で `url` の代わりに `font-url` を使う

```scss
@font-face {
  font-family: 'Hoge';
  src:         font-url('hoge.woff2') format('woff2');
  font-weight: normal;
  font-style: normal;
}
```

### shell

#### お手軽デプロイスクリプト

テスト環境などにデプロイするときのお手軽スクリプト
deployer とか capistrano とか導入するまでもない時に使えるかな

リモートサーバの情報は `__example_com` で `.ssh/config` 登録済みとします

ローカルに以下内容でファイルを保存

```bash:deploy.sh
cd /var/www/vhosts/example.com/
git fetch --all --progress -v
git reset --hard origin/develop
yarn install                      # この辺は適宜書き換える bundle exec install とか
gulp                              # bin/rails db:migrate とか
node_modules/.bin/webpack --config config/webpack.config.js.stg --progress  # bin/rails assets:precompile とか
```

ローカルで打つ

`ssh __example_com ‘sh ’ < ./deploy.sh`
Quantopianチュートリアル LESSON 5

[前回](http://qiita.com/driller/items/d2aa7178773cfcafadbd)の続きです。

# LESSON 5 The data Object

`data` オブジェクトは株価の情報を取得するさまざまなメソッド[^1]が用意されています。
直近または過去の株価や出来高の情報を取得できます。
`data` オブジェクトは下記の関数で使用できます。

* handle_data()
* before_trading_start()
* schedule_function() [^2]

## data.current()

`current()` メソッドでは直近の情報を取得できます。
下記のコードではAPPLの直近の株価を取得しています。

```python
data.current(sid(24), 'price')
```
引数は 'price' の他に下記の指定ができます。

引数|説明
---|---
price|現在値
open|始値
high|高値
low|安値
close|終値
volume|出来高

下記のように複数銘柄を指定することもできます。
この場合、戻り値はpandasのSeries型が返ります。

```python
data.current([sid(24), sid(8554)], 'price')
```

下記のように複数銘柄に対して複数の戻り値がある場合はpandasのDataFrame型が返ります。

```python
data.current([sid(24), sid(8554)], ['low', 'high'])
```

## data.can_trade()
`can_trade()` メソッドは対象の銘柄が取引所で取引可能であるかを返します。取引可能であれば `True` を返します。自分でこの機能を実装しようとすると結構大変なので、地味だけど便利な機能ですね。

## data.history()
[LESSON 6](http://qiita.com/driller/items/28d7a258f19a69269a93) で解説します。

[LESSON 4](http://qiita.com/driller/items/d2aa7178773cfcafadbd) <--> [LESSON 6](http://qiita.com/driller/items/28d7a258f19a69269a93)

---
[^1]: 原文では 'functions' と記載されていますが、Pythonユーザにとってわかりやすい表現にしています。
[^2]: : LESSON 7で解説します。
Python開発環境のためのemacs設定

Pythonで100本ノックをやってみて、いろいろ書くのに時間がかかったので、emacsに以下の内容を設定し、開発環境を改善した。

~/emacs.d/init.el
に以下の内容を追記

```lisp
;; init.el --- Emacs configuration

;; INSTALL PACKAGES
;; --------------------------------------

(require 'package)

(add-to-list 'package-archives
	     '("melpa" . "http://melpa.org/packages/") t)

(package-initialize)
(when (not package-archive-contents)
  (package-refresh-contents))

(defvar myPackages
  '(better-defaults
    material-theme))

(mapc #'(lambda (package)
	  (unless (package-installed-p package)
	  (package-install package)))
      myPackages)

;; BASIC CUSTOMIZATION
;; --------------------------------------

(setq inhibit-startup-message t)
(load-theme 'material t) 
(global-linum-mode t) ;; enable line number globally

;;rectangular selection
(cua-mode t)
(setq cua-enable-cua-keys nil)

;;disable making back-up file
(setq make-backup-files nil)

;;active save history mode and keep 500 history records
(savehist-mode 1)
(setq history-length 500)

;; SETUP PYTHONMODE
;;---------------------------------------

(defvar myPackages
	'(better-defaults
	elpy ;;add elpy package
	material-theme))

;; active auto-complete by jedi
(elpy-enable)
(elpy-use-ipython)
(setq elpy-rpc-backend "jedi")

;; active flycheck instead of flymake
(when (require 'flycheck nil t)
	(remove-hook 'elpy-modules 'elpy-module-flymake)
	(add-hook 'elpy-mode-hook 'flycheck-mode))

(defvar myPackages
	'(better-defaults
	smartrep ;;add smartrep package
	material-theme))

(define-key elpy-mode-map (kbd "C-c C-v") 'helm-flycheck)
(require 'smartrep)
(smartrep-define-key elpy-mode-map "C-c"
	'(("C-n" . flycheck-next-error)
	("C-p" . flycheck-previous-error)))

;; setup indent hiright
(set-face-background 'highlight-indentation-face "#313131")
(set-face-background 'highlight-indentation-current-column-face "#777777")
(add-hook 'elpy-mode-hook 'highlight-indentation-current-column-mode)

;;(setq twittering-curl-program "/usr/bin/curl")

;; init.el ends here
```

参考資料
MacとEmacsのPython開発環境について調べてみた
http://umi-uyura.hatenablog.com/entry/2016/05/09/000613

個人的な Python 用の Emacs の設定
http://org-technology.com/posts/emacs-elpy.html

Emacs - the Best Python Editor?
https://realpython.com/blog/python/emacs-the-best-python-editor/

うわっ...私のEmacs、使いにくすぎ？だったら...ｶｽﾀﾏｲｽﾞｼﾔｯｾｰ!!ﾀﾞｧﾀﾞｧｼｴﾘｲｪｯｽｯｼｪｰｼｮｰﾍｲﾍｲ!!!
http://d.hatena.ne.jp/sandai/20120304/p2
Ectoのinserted_at/updated_atが自動設定される仕組み


deps/ecto/lib/ecto/schema.ex

```
@doc """
Generates `:inserted_at` and `:updated_at` timestamp fields.

The fields generated by this macro will automatically be set to
the current time when inserting and updating values in a repository.

## Options

  * `:type` - the timestamps type, defaults to `:naive_datetime`.
  * `:usec` - sets whether microseconds are used in timestamps.
    Microseconds will be 0 if false. Defaults to true.
  * `:inserted_at` - the name of the column for insertion times or `false`
  * `:updated_at` - the name of the column for update times or `false`
  * `:autogenerate` - a module-function-args tuple used for generating
    both `inserted_at` and `updated_at` timestamps

All options can be pre-configured by setting `@timestamps_opts`.
"""
defmacro timestamps(opts \\ []) do
  quote bind_quoted: binding() do
    timestamps =
      [inserted_at: :inserted_at, updated_at: :updated_at,
       type: :naive_datetime, usec: true]
      |> Keyword.merge(@timestamps_opts)
      |> Keyword.merge(opts)

    type      = Keyword.fetch!(timestamps, :type)
    precision = if Keyword.fetch!(timestamps, :usec), do: :microseconds, else: :seconds
    autogen   = timestamps[:autogenerate] || {Ecto.Schema, :__timestamps__, [type, precision]}

    if inserted_at = Keyword.fetch!(timestamps, :inserted_at) do
      Ecto.Schema.field(inserted_at, type, [])
      Module.put_attribute(__MODULE__, :ecto_autogenerate, {inserted_at, autogen})
    end

    if updated_at = Keyword.fetch!(timestamps, :updated_at) do
      Ecto.Schema.field(updated_at, type, [])
      Module.put_attribute(__MODULE__, :ecto_autogenerate, {updated_at, autogen})
      Module.put_attribute(__MODULE__, :ecto_autoupdate, {updated_at, autogen})
    end
  end
end
```

```
defmodule MyApp.MyModel do
  use MyApp.Web, :model

  schema "my_model" do
    ...
    timestamps
    ...
```

■ デフォルトのタイムスタンプ生成

```
  => Ecto.Schema.__timestamps__(:naive_datetime, :microseconds)
```

■ type,usecを指定した場合

```
  timestamps(type: Ecto.DateTime, usec: false)
  => Ecto.Schema.__timestamps__(DateTime, :seconds)
```

■ func指定

```
  timestamps(type: Ecto.DateTime, autogenerate: {Ecto.DateTime, :from_erl, [{{2000, 1, 1}, {0, 0, 0}}]})
  => Ecto.DateTime.from_erl({{2000, 1, 1}, {0, 0, 0}})
```
interfaceをsliceで渡す抽象化方法


構造体を抽象化して処理させたい場合で、かつsliceで処理させる場合。

``` go
package main

import "fmt"

type PersonInterface interface {
	Greet() string
}

type SalesPerson struct {
	Name string
}

type Operator struct {
	Name string
}

func (s *SalesPerson) Greet() string{
	return "こんにちは、私は" + s.Name + "です"
}

func (o *Operator) Greet() string{
	return "こんにちは、私は" + o.Name + "です"
}

func main(){
	people := []PersonInterface{}

	people = append(people, &SalesPerson{Name: "山田"})
	people = append(people, &Operator{Name: "鈴木"})
	Update(people)
}

func Update(people []PersonInterface){
	for _, v := range people {
		fmt.Println(v.Greet())
	}
}
```

結果：

```
こんにちは、私は山田です
こんにちは、私は鈴木です
```