OmniAICreator/Qiita-1.07M huggingface dataset:
Google Cast for iOS ドキュメントまとめ

# Google Cast
https://developers.google.com/cast/

2016/07/28にv3ローンチ
2016/09/25現在の最新はv3.2

### Release Notes 
https://developers.google.com/cast/docs/release-notes

### v3変更点所感
- APIが大幅に変更
- 提供されるAPI, UI部品がけっこう増えた
   - Cast端末scan
   - Cast接続選択ダイアログ
   - Overlayチュートリアル
   - Castのボタン
   - 再生周りの部品  
   など
- 全体的に高レイヤーのAPIが追加されて、デフォルト部品を使った開発は簡単になった印象

##### Deprecated API
https://developers.google.com/cast/docs/reference/ios/deprecated

## 最低見ておくべき資料
### Google Cast iOS API reference
https://developers.google.com/cast/docs/reference/ios/

### Design Check List
https://developers.google.com/cast/docs/design_checklist/

### UX Guidelines
https://developers.google.com/cast/docs/ux_guidelines

#### Test
https://developers.google.com/cast/docs/testing

TestCase
https://docs.google.com/spreadsheets/d/1TctpFEnhsaqaUmq-JLFSzcWTZQytYtKdR05UQ8E-nRg/edit#gid=782917264
対応すべきpriorityとかも定義してある

## その他参考
### GitHub
https://github.com/googlecast/CastVideos-ios

### StackOverFlow
http://stackoverflow.com/questions/tagged/Google-Cast
Power-Shell 


# intro

```shell-session

Get-Help Get-ChildItem -detail

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

Get-ExecutionPolicy

```

$_  special variable

```shell-session

ls *.exe | ForEach-Object {$_.Name}
    
```

convert time format 

```shell-session

 ls *.exe | ForEach-Object {$_.CreationTime | Get-Date -Format 'yyyymmdd'}
 ```

# conditional branch instruction

```


```


## debug


There are several ways:

Write-Host: Write directly to the console, not included in function/cmdlet output. Allows foreground and background colour to be set.

Write-Debug: Write directly to the console, if $DebugPreference set to Continue or Stop.

Write-Verbose: Write directly to the console, if $VerbosePreference set to Continue or Stop.
C言語の引数に多次元配列を渡す

C言語では、関数の引数で「配列そのもの」を受け取ることができない。配列の先頭のアドレスを受け渡すことになる。

だから、配列の要素数は別途引数を用意して受け渡さなければならない。そうでないと関数内で配列の要素数を知るすべがなく、困ってしまう。

```c
int sum_all(int length, int arr[]) {
/* int sum_all(int length, int *arr) でも同じ意味になる */
  int i, result = 0;
  for (i = 0, i < length; ++i) {
    result += arr[i];
  }
  return result;
}
```

ところで、二次元配列の事を考えてみる。多次元配列の場合、要素数の省略は最初の[]にしかできないから、普通にやるとこんな感じになってしまう。

```c
/* 2次元のint配列を受け取って、全部足して返す */
int sum_all2(int xlength, int arr[][3]) {
  int i, j, result = 0;
  for (i = 0; i < xlength; ++i) {
    for (j = 0; j < 3; ++j) {
      result += arr[i][j];
    }
  }
  return result;
}
```

＼突然現れるマジックナンバー3！／

これだと、要素数が片側固定になってしまうので関数の使い心地が悪い。一次元配列のintポインタにキャストしてarrを渡すという技もあるけど、素直じゃないし、書き方がポインタ演算になってしまうのでわかりにくくなっちゃう。

とか悩んでたら、C99だとこんな書き方ができるんだそうな。

```c
int sum_all2(int size1, int size2, int arr[size1][size2]) {
  int i, j, result = 0;
  for (i = 0; i < size1, ++i) {
    for (j = 0; j < size2, ++j) {
      result += arr[i][j];
    }
  }
  return result;
}

int main(void) {
  int arr[][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
  printf("%d", sum_all2(3, 3, arr));
  return EXIT_SUCCESS;
}
```

仮引数って引数宣言の中で使えるようになるんですね。。
これなら、配列サイズに依存せずに使えるし、書き方もそんなに気持ち悪くないし、便利。
UbuntuでWi-Fi LEDが点滅しないようにする

Ubuntuをアップグレードする度にこの問題に遭遇している人がいるようです[[1]][link-1][[2]][link-2][[3]][link-3].
ここではIntel Wireless WiFi Link 4965AGNを使っている場合の解決法を書いておきます.

# 手順
1. `/etc/modprobe.d/wlan.conf`に次を追加する.

    ```
    options iwlegacy led_mode=1
    ```

2. 再起動.

[[2]][link-2][[3]][link-3]では`modeprobe -r`, `modeprobe`としていますが, 筆者の環境ではネットが使えなくなってしまったので手順に入れていません.

他の環境でも`iwlegacy`の部分を適切なモジュール名に書き換えればいけるのではないでしょうか. `modprobe -r iw` + [TAB]とすると手っ取り早く稼働しているモジュールを知ることができます.

# 参考リンク
[1][http://askubuntu.com/questions/12069/how-to-stop-constantly-blinking-wifi-led][link-1]
[2][http://blog.al4.co.nz/2012/05/intel-wifi-led-blinking-again-on-ubuntu-12-04/][link-2]
[3][http://askubuntu.com/questions/451178/wifi-led-continuously-blinking-ubuntu-14-04-and-slowed-connection?rq=1][link-3]
[4]http://wireless.kernel.org/en/users/Drivers/iwlwifi
[5]http://wireless.kernel.org/en/users/Drivers/iwlegacy


[link-1]:http://askubuntu.com/questions/12069/how-to-stop-constantly-blinking-wifi-led
[link-2]:http://blog.al4.co.nz/2012/05/intel-wifi-led-blinking-again-on-ubuntu-12-04/
[link-3]:http://askubuntu.com/questions/451178/wifi-led-continuously-blinking-ubuntu-14-04-and-slowed-connection?rq=1
【Rails】Deviseでのstrong parameters指定はdevise_parameter_sanitizer.forではなくdevise_parameter_sanitizer.permitを使うようになったらしい

Railsの認証を簡単にするプラグイン[devise](https://github.com/plataformatec/devise)で、strong parametersをいじろうとした。

適当に日本語サイトなどを調べて`devise_parameter_sanitizer.for`をApplicationControllerに追加したが、上手くいかない。ということでGithubのREADMEを読んでみると、どうやら変更があったようだ

https://github.com/plataformatec/devise#strong-parameters

こんな感じで書くといいらしい。

```
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end
```

ちなみに`permit`の第一引数は、`:sign_in`, `:sign_up`, `:account_update`のいずれか。
[Visual Studio 2015 C#] Invokeを複数回呼ぶと、Formの表示がもたつきますので避けましょう

なんか、表示処理がもたつくな～というときは、もしかすると、Invokeを複数回呼んでいるかもしれません。

```csharp:sample.cs
async void SetTextTest()
{
    var start = DateTime.Now;

    //await Task.Run(() => 10000.Loop(i => Invoke((MethodInvoker)(() => textBox1.Text = i.ToString()))));
    //await Task.Run(() => Invoke((MethodInvoker)(() => 10000.Loop(i => textBox1.Text = i.ToString()))));

    MessageBox.Show("finish, " + (DateTime.Now - start).TotalMilliseconds.ToString());

}
//10000.Loopは1万回ループしていると思ってください
```

パフォーマンスは以下の通り（場合によってはもっと遅くなることも…）

前者
![image](https://qiita-image-store.s3.amazonaws.com/0/114606/2aa4b217-11d5-8b13-780c-c43f901b817b.png)
後者
![image](https://qiita-image-store.s3.amazonaws.com/0/114606/dd21208d-f73f-cf2d-1536-335e22c0757c.png)


遅いな～と思ったら、細かくInvokeを読んでいる可能性があるので、少し大きめにInvokeを使ってあげてください。
（あまり大きくとる（Invokeの中の処理時間が長い）と画面が固まりますが…、その時はそもそもの設計を見直してみてください）


余談ですが、通常、Invokeするときは [InvokeRequired](https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=JA-JP&k=k(System.Windows.Forms.Control.InvokeRequired);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true) を使って必要以上に呼ばないようにすることも大切です。

```csharp:FormExtension.cs
public static void InvokeEx(this Form form, Action inv)
{
    if (form.InvokeRequired == true)
    {
        form.Invoke(inv);

    }
    else
    {
        inv();

    }

}
```
素人の言語処理100本ノック:13


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第2章: UNIXコマンドの基礎
>hightemp.txtは，日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである．以下の処理を行うプログラムを作成し，hightemp.txtを入力ファイルとして実行せよ．さらに，同様の処理をUNIXコマンドでも実行し，プログラムの実行結果を確認せよ．

###13.col1.txtとcol2.txtをマージ
>12で作ったcol1.txtとcol2.txtを結合し，元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ．確認にはpasteコマンドを用いよ．


出来上がったコード：

```python:main.py
# coding: utf-8

with open('col1.txt') as col1_file, \
		open('col2.txt') as col2_file, \
		open('merge.txt', mode='w') as out_file:

	for col1_line, col2_line in zip(col1_file, col2_file):
		out_file.write(col1_line.rstrip() + '\t' + col2_line.rstrip() + '\n')
```

実行結果：

```text:merge.txt
高知県	江川崎
埼玉県	熊谷
岐阜県	多治見
山形県	山形
山梨県	甲府
和歌山県	かつらぎ
静岡県	天竜
山梨県	勝沼
埼玉県	越谷
群馬県	館林
群馬県	上里見
愛知県	愛西
千葉県	牛久
静岡県	佐久間
愛媛県	宇和島
山形県	酒田
岐阜県	美濃
群馬県	前橋
千葉県	茂原
埼玉県	鳩山
大阪府	豊中
山梨県	大月
山形県	鶴岡
愛知県	名古屋
```


UNIXコマンドの確認は、シェルスクリプトで行いました。

```bash:test.sh
#!/bin/sh

# マージ
paste col1.txt col2.txt > merge_test.txt

# 比較
diff --report-identical-files merge.txt merge_test.txt
```

実行結果：

```console:端末
ファイル merge.txt と merge_test.txt は同一です
```

無事、同じ結果になりました。

### Pythonのドキュメントにおける「空白文字」とは

今回ちょっとつまづいたのは改行の除去方法です。
`col1_line`や`col2_line`は行末の改行コード付きなので、これを取り除いてからタブ区切りで連結する必要があります。[`str.rstrip()`](http://docs.python.jp/3/library/stdtypes.html#str.rstrip)で引数を省略すると空白文字が除去されるという説明なのですが、この「空白文字」の定義がわかりませんでした。

Pythonのドキュメントにおける「空白文字」の原文は「whitespace」であることから、「whitespace」でちょっと調べてみました。その結果、[`string.whitespace`](http://docs.python.jp/3/library/string.html#string.whitespace)の説明や[`bytearray.isspace()`](http://docs.python.jp/3/library/stdtypes.html#bytearray.isspace)の説明から、次のものが該当すると考えて良さそうです。


| 空白文字 | コード（16進数） | 文字列リテラル |
|:--------:|:--------:|:-:|
| スペース | 20 | ' ' |
| タブ（HT） | 09 | '\t' |
| 改行（LF） | 0a | '\n' |
| 復帰（CR） | 0d | '\r' |
| 改頁（FF） | 0c | '\f' |
| 垂直タブ（VT） | 0b | '\v' |

　
14本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
peco で man を絞り込み検索する

ぐぐってみたところ同じことをやっている人が見当たらなかったので自分で書いてみました．

`man` のコマンドライン引数は補完できますが，項目がうろ覚えの場合に検索するのにはちょっと不便です．なので，`peco` で man を複数キーワードでインタラクティブに絞りこめるようにしてみました．

![tmp.gif](https://qiita-image-store.s3.amazonaws.com/0/625/2d30e960-91bb-c945-9c04-9576ad0a5b0f.gif)

`~/.zshrc` に下記のように設定しておきます．

```sh
function peco-man-list-all() {
    local parent dir file
    local paths=("${(s/:/)$(man -aw)}")
    for parent in $paths; do
        for dir in $(/bin/ls -1 $parent); do
            local p="${parent}/${dir}"
            if [ -d "$p" ]; then
                IFS=$'\n' local lines=($(/bin/ls -1 "$p"))
                for file in $lines; do
                    echo "${p}/${file}"
                done
            fi
        done
    done
}

function peco-man() {
    local selected=$(peco-man-list-all | peco --prompt 'man >')
    if [[ "$selected" != "" ]]; then
        man "$selected"
    fi
}
zle -N peco-man
bindkey -M viins '^ m' peco-man
```

Ctrl+Space → M に割り当てていますが，`peco-man` コマンドでそのまま使うこともできます．また， `peco-man-list-all` はすべての man ファイルを列挙するので，他のフィルターコマンドでもこれを使えば同じような事ができるはずです．
続・GooglePlayMusicのNow PlayingをTweetするだけのBookmarklet


ジャケット画像をツイートに入れたかった．後悔はしてない．

# あらすじ
[前回](http://qiita.com/atri-konami/items/e61662257b93f703c15c)はとりあえず簡単なスクレイピングをしてtwitterのintent機能を使ってツイートすることに成功しました．しかしこのintent，画像が添付できないのでジャケット画像がつけられません．いや別によくね？と思う方もいるでしょうが，私は納得いきませんでした．o(｀ω´*)oﾌﾟﾝｽｶﾌﾟﾝｽｶ!!

# じゃあサーバー立ててアプリ使おう
画像付けてツイートするぐらいなら余裕余裕…とrubyとsinatraでさくっとアプリケーションを作りました．
[gpm-sinatra](https://github.com/atri-konami/gpm-sinatra)
普段仕事でWebアプリケーション触るときはPHPなのですが，今回は趣味なのでrubyで．sinatraはこういうさくっと小さいwebアプリケーション書きたい時に便利ですね．

# サーバー環境はnginx+unicornで
流石にwebrickではダサいので色々探してると，sinatraアプリケーションはnginxとunicornを使って運用するのがベストプラクティスらしい．この辺は調べてさくっと環境作成．
流れとしては，nginxで80番ポートへの通信をUNIXソケットに通して，unicornでそのソケットをListenする形らしい．
簡素な設定なので，練習がてらDockerで構築できるようにしてもいいかもしれない．

# nginxはいいぞ
Webサーバは普段はApacheをずっと使ってて，nginxは小耳に挟む程度だったのですが，いざ使ってみるとかなりいい感じ．特に設定ファイルの書式はjsonっぽくて好感が持てます．(ApacheのXMLっぽいconfigファイルは割ともう見飽きた)

```nginx.confの一部
  server { # simple load balancing
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;

    location / {
      proxy_pass      http://big_server_com;
    }
  }
```

# まとめ
![スクショ](http://i.imgur.com/MfTUPH2.png)
なかなかそれっぽくできました．アトリエはいいぞ．

# 追記

~~ちなみに成果物は先ほどのリポジトリのbookmarklet.jsを実行すればいつでも使えます．お試しあれ．~~

# 2017/10/02 追記
~~現在インスタンスを停止してしまっているので，bookmarklet.jsの実行だけでは使えなくなっています．もし使いたい場合は自分のサーバーで使ってみてください~~

# 2018/04/12 追記
サーバ立て直しました．[ここ](https://atri-konami.github.io/product/gpm-sinatra)でブックマークレットを配布してます．

# 2018/04/17 追記
[Chrome拡張ができました](https://github.com/atri-konami/gpm-sinatra/releases)
MeteorのReactiveLocalStorage使うときにつまづく

#結論
Atmosphereに書かれてるReactiveLocalStorage()ではなく
GitHubに書かれてるRLocalStorage.getItem .setItem .removeItemを使う｡

##これ使わなくてもLocal Collection機能ついてた
```
ServerAndClient = new Mongo.Collection('hoge');
ClientOnly = new Mongo.Collection(null);
```
nullにするだけ
https://guide.meteor.com/collections.html#local-collections

#Meteorとは
Node.jsのフルスタックウェブフレームワーク｡リアクティブなのが得意｡
RailsよりGithubでスター多い

#Reactiveとは
ブラウザでの変数書き換えたら自動でビューにも反映されるようなの

#Meteorが標準対応しているReactive変数
|  |  |保存場所|ページリロードで|スコープ|
|:-:|:-:|:-:|:-:|:-:|
|  Session | key-value型 |クライアント|初期化|グローバル|
|  ReactiveVar | ローカルスコープ版  |クライアント|初期化|ローカル|
| ReactiveDic  | Sessionのローカルスコープ版,ReactiveVarと統合予定|クライアント|初期化|ローカル|
|Collection|サーバーはmongoDB,クライアントはminiMongoに保存する｡Meteorのウリ機能|主にサーバー|保持|グローバル|
|LocalCollection|引数nullにするだけでクライアントのみになる|クライアント|保持|グローバル|

~~ブラウザに保存して,ページリロードで消えず,リアクティブなのがない~~
あった｡

#変数管理系パッケージメモ
- GroundDB 標準Collectionより高機能っぽい?
    - https://atmospherejs.com/ground/db

- ReactiveLocalStorage(スコープはグローバル,単純) 
    - https://atmospherejs.com/simply/reactive-local-storage

- SessionStore
    - https://atmospherejs.com/smeevil/session-store
負荷計測用にXNAのTimeRuluerっぽいのを移植してみた

## ドーモ、Javascript サン。　レガシーXNA野郎　デス

JavaScript（Three.JSやWebGL)でいざ本格的なコードを書いてガチガチに書きまくると、当たり前ながら処理が遅くなってきます。
その遅くなってきた原因の調査に、過去に開発していたXNAでは「[TimeRuler](https://blogs.msdn.microsoft.com/ito/2008/12/29/1023/)」という非常に役に立つものがありました。
・・・Javascriptには無いの？

なかったようなので、作りました。

##　何をするやつなの？どういうときに使うの？

まずは、こちらをご覧ください。
↓そこそこ重い、パーティクルのサンプル↓
[こちらのサイト](http://www001.upp.so-net.ne.jp/adrs2002/particleEfeTest.html)で、左中断あたりで伸びている緑とか青のバーが、今回作ったものになります。

何をしているかというと、
「計測開始と計測終了の間にかかった時間（ミリ秒）を、メーターで表示している」だけです。
このメーターをいくつでも増やせるので、
「なんとなーく、ココが重そう」という場所に片っ端から仕込んでおき、メーターの伸び縮みを見て、実際に重い・負荷がかかっている処理を探すことが目的です。

## 組み入れ方

[いちばん簡単なサンプル（ソース）がGitHubにあります](https://github.com/adrs2002/JfTimeRuler)

１：[こちらのGitHub](https://github.com/adrs2002/JfTimeRuler)から、JfTimeRuler.js　を落としてきます。
２：インポートして、こんな感じで宣言します。
```
<script src="js/JfTimeRuler.js"></script>
<script>
 var ruler = new JfTimeRuler();
・・・
```

３：DOMツリーに追加します（ここで、Three.jsとそうでない場合で違いがある）
Three.jsを使わない場合
```
document.body.appendChild(ruler.dom);
```
Three.jsを使う場合
stats.js を追加する方法を参考にしてください（人によって組み方が違うと思うので‥）。
```
container.appendChild(ruler.dom);
```

４：計測したい場所に、仕込みます。
```
ruler.add("ラベル名");
```


５：updateで、実際に画面に描画します。
```
ruler.update();
```


という感じです。


##もうちょっと詳しく

中にあるメソッドをもうちょっと解説

初期化時引数(_x,_y)：そのまんま、スクリーン上での位置を指定できます

setTargetFrameRate(_f)：目標としているフレームレートを変更できます。標準は60(秒間60回更新）です

add(ラベル名、色）：addはラベル名が最低限必要ですが、バーの色を直接指定することもできます。
chainer v1.16.0がマルチスレッド環境で動かない

　僕はよくbatchsizeを分割して逆伝搬をマルチスレッドで行い、勾配を足し合わせてから重み更新をしています。chainer1.16.0にするとここでエラーが出るようになりました。

```py3
AttributeError: '_thread._local' object has no attribute 'default_backprop'
```

　逆伝播のときだけではなく、場合によってはforwardでもエラーが出ます。

```py3
import chainer

import numpy
import concurrent.futures


def calc_sigmoid(i):
    value = numpy.array(i, dtype=numpy.float32)
    return chainer.functions.sigmoid(value)

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    values = list(executor.map(calc_sigmoid, range(4)))

print(values)

# AttributeError: '_thread._local' object has no attribute 'default_backprop'
```

　エラー内容的に1.16で追加された`backprop_mode`に関係がありそうでした。

> no_backprop_mode and force_backprop_mode are added. In no_backprop_mode context, Variables with volatile=’auto’ behave like non-volatile variables. And, in force_backprop_mode context, they behave like volatile variables. (#1521)

　中で`threading.local()`が使われていたので[この部分を`global`にすると](https://github.com/pfnet/chainer/pull/1705/commits/532f99d72e4b76425ea51e6e75cffd442757eaf6)思ったように動作しました。

```py3
print(values)
# [<variable at 0x1123329e8>, <variable at 0x112332c88>, <variable at 0x112332ef0>, <variable at 0x11234f160>]
```

　`backprop_mode`は`Variable`の`auto`をon/offどちらにするか強制するもの（だと思う）ですが、別にスレッドセーフにする必要はない（というかこのままだと別スレッドで動かない）ので[global変数を用いるようなPR](https://github.com/pfnet/chainer/pull/1705)を作成しました。（追記）その後、初期値を与える方針に変更しました。

　たぶん学習済みモデルを複数プロセスで並列に計算して結果を返すようなwebサービスは軒並み動作不良になっているはず（要出典）で、何より自分のコードが動かないので何とかしたいなぁと思いつつ、PRレビュー待ちです。

（追記）masterにマージされました:tada: chainer1.17で修正されるはずなのでとりあえず一件落着、日曜日にも関わらず返信頂きありがとうございました。
ubuntu16.04でvim8.0をビルドするだけのDockerfile

次いでに lua, python, python3, rubyを有効にした。

```
FROM ubuntu:16.04
WORKDIR /root
RUN apt-get update
RUN apt-get -f install
RUN apt-get install -y git build-essential ncurses-dev lua5.2 lua5.2-dev luajit python-dev python3-dev ruby-dev
RUN git clone https://github.com/vim/vim
WORKDIR /root/vim
RUN git checkout -b v8.0.0008
RUN ./configure --with-features=huge --enable-multibyte --enable-luainterp=dynamic --enable-gpm --enable-cscope --enable-fontset --enable-fail-if-missing --prefix=/usr/local --enable-pythoninterp=dynamic --enable-python3interp=dynamic --enable-rubyinterp=dynamic
RUN make && make install
```
macから簡単にパスワード付きのssh接続を行う

macから簡単にsshログインさせたいなぁ
なんか公開鍵認証の設定とかめんどくさそうだなぁと思いつつ作ったログインシェルです。


ssh接続先：192.168.0.10
user名：pi
password：raspberry

```bash:auto_login.sh
#!/bin/sh

host=192.168.0.10
id=pi
password=raspberry

echo
echo -------------------------------------------------------
echo

expect -c "
set timeout -1
spawn ssh -l $id $host
expect \"Are you sure you want to continue connecting (yes/no)?\" {
    send \"yes\n\"
    expect \"$id@$host's password:\"
    send \"$password\n\"
} \"$id@$host's password:\" {
    send \"$password\n\"
} \"Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\" {
    exit
}
interact
"

```

# 2016/9/27:追記
  - sshpassを導入した場合

```
brew install http://git.io/sshpass.rb
```

```bash:auto_login.sh
#!/bin/sh

host=192.168.0.10
id=pi
password=raspberry

echo
echo -------------------------------------------------------
echo

sshpass -p $password ssh -o StrictHostKeyChecking=no $id@$host

```
ターミナル操作をウェブで配信する


[ttyrec](http://0xcc.net/ttyrec/) と [ttycast](https://github.com/dtinth/ttycast)  というソフトを使うと、ターミナルの操作をウェブで配信することができます。
勉強会のデモでターミナルを共有するのに便利そうなので、使い方を簡単にまとめます。

## ttyrec とは

ttyrec はターミナルを録画するソフトです。開発自体は2006年以降止まっているようですが、npm のパッケージもあるので、非常に簡単に導入することができます。

## ttycast とは

ttycast は ttyrec で録画したターミナルをウェブで配信するソフトです。node で書かれていて、こちらも npm でインストール可能です。

## インストール

npm でインストールするだけです。npm 自体は brew や apt、yum で入れることができます。

```bash
$ npm install -g ttycast ttyrec
```

## ターミナル操作を録画する

ファイルを指定して ttyrec を実行することで、ターミナルの録画を開始することができます。 録画を終了するには、 ```Ctrl+D``` で EOF を入力します。

```bash
$ ttyrec <録画ファイルの保存先>
$ <録画したい操作>
...
# <Ctrl+D> で録画終了
```

## 録画内容を確認する

ttyrec と共にインストールされる ttyplay というコマンドで、再生することができます。

```bash
$ ttyplay <録画ファイル>
```

```-s``` オプションで、再生スピードを調整することもできます。

```bash
$ ttyplay -s <再生速度> <録画ファイル>
```

## 録画内容をウェブで配信する

録画内容をウェブで配信するには、 ttyplay と ttycast を組み合わせます。
ttycast のオプションで、 画面サイズを指定することができるので、録画時のサイズに合わせておくと無難です。

```bash
$ ttyplay <録画ファイル> | PORT=<ポート> ttycast -s <横>x<縦> # http://0.0.0.0:<ポート> で内容を確認できる
```

ただし、この方法だと、 ttycast と立ち上げると同時に再生が始まってしまいます。
デモなどで使う場合は、再生タイミングを調整したいことがあるのですが、その場合は fifo を作って ttycast を起動しておきます。


```bash
$ mkfifo <fifoフィアル>
$ ttyplay <fifoファイル> | PORT=<ポート> ttycast # サーバーを起動しておく
```

再生したいタイミングで、上記とは別のターミナルで録画ファイルを fifo に流し込めば OK です。

```
$ tail -f -n+1 <録画ファイル> > <fifoファイル>
```


## ターミナル操作をリアルタイム配信する

操作を録画しておくのではなく、リアルタイムに配信することもできます。
一番簡単な方法は、ターミナルの記録と配信を同時に行ってくれるラッパを使うことです

```bash
$ ttyreccast <録画ファイル>
```

ttyreccast は、```/tmp/ttycast``` をつくって、それを見つつ <録画ファイル> にも保存してくれるように ttycast を起動して待機してくれるので、別のターミナルを立ち上げ、

```bash
$ reset && ttyrec /tmp/ttycast
$ <配信したい操作>
...
# <Ctrl+D> で終了
```

とすれば、ターミナルの操作をリアルタイムに配信することができます。

## 参考情報

ttygif という、ttyrec の結果をGIFに変換するツールもあります。

- [ターミナル操作の記録(ttyrec)からGIFアニメを生成するツールを作った - すぎゃーんメモ](http://d.hatena.ne.jp/sugyan/20140719/1405729672)
- [github](https://github.com/sugyan/ttygif)
- [ttygifでターミナル操作ログのgifアニメ化](http://qiita.com/marujiruo/items/515da775552fc82ce662)



## まとめ

ttyrec/ttycast、単純だけど面白い。
windowsのGUIからpython呼び出す時のエラー通知方法というかwinsound.Beep

# やったこと
windowsのpythonで例外が上がった時だけ音を鳴らすようにしてみた。

``` python:test_alert.py

import winsound

def hoge():
    # 何か例外が起きる

if __name__ == '__main__':
    try:
        hoge()
    except:
        winsound.Beep(400, 200)

```

仕組みとしては、[35.4. winsound — Windows 用の音声再生インタフェース](http://docs.python.jp/2/library/winsound.html)から、例外が発生した時に400Hzで200msの音を鳴らしてるだけ。
(追加pip installとかもいらなかったので便利)

# 経緯
windowsでエクスプローラーなどGUIから、.batよろしくpythonのスクリプトファイルを単発で起動することがある。
その時、実行時だけはシェルウインドウが開いて標準出力が表示され、処理が終わったら閉じたりする。

問題として、スクリプトが異常終了した時もシェルウィンドウは閉じてしまい、標準エラー出力などが見れない。
(エラーは表示されるけど即シェルウィンドウは閉じてしまう)
すると、正常終了なのか、異常終了なのかがわからない。

私は以下な感じでTablacus Exporerからpythonスクリプトを直に呼び出してたりするので、この問題に出くわした。
[Tablacus Explorerで選択したアイテムをJScriptからpythonに渡して一括リネーム - Qiita](http://qiita.com/noexpect/items/53a270a8cfb949df9d9f)

# 何がいいのか? というかやりたかったこと
そもそもは、

- シェルウインドウはpythonスクリプト実行したら閉じて欲しい(毎度閉じるのがめんどうなので、)
- が、異常終了時はシェルウィンドウが閉じずにエラー出力を表示したままにして欲しい(前述のように異常終了がわからないので)

ただ、あれこれ調べて実装が1番簡単なのがよかったけど、

* カッコいい例外処理書いてCUIからGUI操作したくないし、(そこまでちゃんとしてる必要もないものだった)
* logファイルも吐きたくないし、(ローテートめんどいし、そもそもほとんど見ないし)
* .batをいじいじするのもやだし、(追加でもう一枚スクリプトかますのはちょっと...)

で、この仕組に辿りついた。

これだと音がなったらなんか問題あるな?とわかるので、あとはIDEなり開いて好きにデバックすればいいなと。

# (おまけ) もしcmd.exe経由でスクリプトを実行してたら

``` sh
$ python hoge.py || rundll32 user32.dll,MessageBeep

```

windowsもlinuxよろしく、実行結果でパイプできるんだなと。

参考:[Pythonでビープ音を鳴らす(Windowsのみ) - 数値計算とかの備忘録（仮）](http://d.hatena.ne.jp/aldente39/20110402/1301725962)


あるいは、/kつけてシェル窓起動して、.batで実行結果受け取って分岐してもできそう?

``` test.bat
call test.bat
if %errorlevel% == 1 (
    echo test.batを実行した結果、戻り値として1が返った
)

```

参考:[Cmd - DOS コマンド一覧 - Programming Field](http://pf-j.sakura.ne.jp/program/dos/doscmd/cmd.htm)
参考:[【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ - Qiita](http://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a)

以上。
Quantum Chemistry - Wavefunction Collapse

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Wavefunction Collapse
https://www.youtube.com/watch?v=frIyVxcuVHo&index=39&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- 重ね合わせの原理を用いたWavefunction Collapse
- 緑の式 (プサイ)
  - n=1とn=4のwavefunctionの合成
  - 係数はnormalizationによりプサイの二乗計算時に1になるようになっている
  - 係数sqrt(2/3)とsqrt(1/3)はそれぞれのnの状態の測定される確率
     - E1は2/3
     - E4は1/3の確率で測定される
- Measure Eという記載の図   
  - それぞれの確率(2/3, 1/3)でE1, E4が測定される
  - 再度測定時には最初の確率(2/3, 1/3)は無効になり
  - 確率1(100%)で測定される
  - この状態を「Wavefunction Collapse」と呼ぶ
     - 初期状態ではプサイはプサイ1とプサイ4の重ね合わせであった
     - その後の測定では選択された方のnの状態を測定することになる
- オレンジ
  - 測定の後はプサイはeigenfunction プサイnとなる
- 紫
  - 量子力学において「Copenhagen Interpretation」と呼ばれる
  - https://en.wikipedia.org/wiki/Copenhagen_interpretation
Quantum Chemistry - Time Dependence Animation

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Time Dependence Animation
https://www.youtube.com/watch?v=ogMwnS-uQSM&index=38&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- [前回](http://qiita.com/7of9/items/f57851df1324b75a95da)のアニメーション
- https://www.desmos.com/calculator/ogqsx8uipx
- Time dependence of the particle in a box wavefunction probability density
- 青線
   - wavefunction
- R()とI()
  - real partとimaginary part
  - imaginary part(赤線)は最初すべてのxに対して0になっている
- D()
  - probability density
  - 紫の線
  - プサイ* とプサイの積
      - プサイ*はプサイの複素共役
- [前回](http://qiita.com/7of9/items/26a546064ad19d8184a2)のアニメーションとの違い
  - time dependenceの項が追加されている
    - R(x,t)
    - I(x,t)
- P()の下のR()とI()
  - real partとimaginary part
  - オイラーの公式 $e^{i\theta} = cos\theta + isin\theta$ から
     - real partはcos()
     - imaginary partはsin()の関数
- D()
  - probability density
  - 絶対値なので[実部^2 + 虚部^2]
- E()
  - Energy levels
- グラフ左軸にある緑の横バー
  - 各Energy level
- c_1
  - wavefunctionは係数c_nがかかったプサイnの総和として得られる
  - c_1 = [1, 0] ではc_1のみを選択
  - c_1でのアニメーション
      - 赤線 (imaginary part)
      - Energyは一定
      - 紫は一定 (stationary state)
      - real and imaginary partsが変動 
          - cos()とsin()
- c_1 = [0, 1, 0]
  - プサイ2でのアニメーション
- c_1 = [0, 0, 1, 0]
  - プサイ3でのアニメーション
- c_1 = [1, 1]
  - combination
  - 紫の線も変動する 
  - time dependenceの影響を見れる
  - c_1 = [3,1] 
     - プサイ1の効果をプサイ2よりも強くする
- Lの変更
  - 周波数が変化
  - Energyが変化
- m の変更
  - mass of the particles
  - heavier particleの影響など
CakePHP2系でService層を作るよ

#プロローグ
「おいおい、お前さんまだCakePHP2の世界にとどまってんのか？
CakePHP3はイイ〜世界だぜ、CakePHPの殻を被ったほぼ別物となってやがる。サービス層に該当する[Modelless Form](http://php-tips.com/2016/06/23/cakephp3-modelless-form-fukuoka-php-vol-17/)もあるんだ。2系はどうだい？ん？」
「ち、違う。おれは・・ただ・・CakePHP2で頑張りたいだけなんだ・・！
こいつがどこまでやれるかおれは見てみたいんだ！Service層の機構が無いなら、おれはそれを作り出してみせる・・！」


#本題
はい、というわけでCakePHP2系でService層を作ります(唐突)
ぶっちゃけレイヤーを作るのはそんな難しいことではありません。
以下の様に実装すればさっくり出来ます。

##Step1.ディレクトリ作成
まずディレクトリ構成について。
Serviceディレクトリをapp直下のControllerやModelと同階層に作成します。

```
app
├── Controller
├── Model
├── Service ← 追加
├── webroot
└── ***
```

##Step2.bootstrap修正
bootstrap.phpでServiceを認識させてあげる為、以下設定を追加。

```app/Config/bootstrap.php
App::build(array(
    'Service' => array('%s' . 'Service' . DS)
), App::REGISTER);
```

##Step3.Serviceクラスを作る
Serviceディレクトリ内にServiceクラスを作ってみましょう

```app/Service/PostService.php
<?php
App::uses('Post', 'Model');

class PostService extends Object
{
    function get($id)
    {
        $Post = ClassRegistry::init("Post");
        return $Post->findById($id);
    }
}

```

##Step4.ControllerからServiceを呼ぶ
ここまで来たら後はServiceクラスを参照するだけです。

```app/Controller/PostsController.php
<?php
App::import('Service', 'PostService');

class PostsController extends AppController
{
    function sample($id)
    {
        $PostService = ClassRegistry::init("PostService");
        $post = $PostService->get($id);
    }
}
```

###Serviceのロード(App::import)
ちなみにServiceのロードでApp::usesを使うと怒られます

```
Fatal Error (1): Class 'PostService' not found
```
これはロードする対象がオートロードの規約に従ってないからだと考えられます。
なのでApp::importを使用します。

#まとめ
アプリケーションが小規模であればまだ良いですが、規模が大きくなればなるほどControllerやModelの肥大化問題が発生します。
Modelを扱うService層を導入し、ビジネスロジックを集中させることで、Controllerは窓口の役割に徹することができ、Modelも紐づくテーブルのみを操作するシンプルなものとなります。
もし同じ問題に悩んでいる方の助けになれれば幸いです。

#エピローグ
「CakePHP2系から3系にアップデートするのか、別の道を歩むのか、それが最大の問題だ。」
PHP基本文法チートシート

# 概要
復習がてらPHPの文法を羅列していきます。
あれこれ思い出し次第追加していきます。

# 出力系の関数
## echo、print
```php
echo 'ここが出力されます';
print('ここが出力されます');
```
## print_r
```php
print_r([1,2,3]);
```
### 出力結果

```php
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
```
## var_dump
```php
var_dump([1,2,3]);
```
### 出力結果

```php
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
```

# コメント
```php
// ここがコメントです。

/*
* 複数行のコメントも可能です。
*/
```

# 変数
## 数字
```php
$a = 1;
```
## 文字
```php
$a = 'シングル';
$b = "ダブル";
```
文字を囲うものはシングルクォーテーションでもダブルクォーテーションでもどちらでも可です。
ただし、この囲む文字によって明確に違いがあるので注意です。

## 定数
```php
define('CONSTANT', '定数です');
echo CONSTANT; // 定数です
```
定義した定数はそのまま変数のように扱えます。ただし、中身を変更することはできません。

## 配列

```php
$arr11 = array();
$arr21 = array(1, 2, 3);

// PHP 5.4以降は下記の宣言も可能です。
$arr21 = [];
$arr22 = [1, 2, 3];
```

配列の中身は変数として格納できる値であればなんでもOKです。
それぞれが要素と呼ばれるもので、カンマ区切りでそれぞれ定義されます。最後の要素にカンマが入っていても新たに要素は追加されず、カンマが入っていないときと同様の宣言になるので注意です。

```php
$arr = [1, "に", array(3)];
```

配列の中身はそれぞれ、キーと値のペアになっています。
"キー" => "値"の形で定義することができます。

```php
$arr = [
    "キー1" => "値1",
    "キー2" => "値2",
    1,
];

var_dump($arr);
```
## 出力結果

```php
array(3) {
  ["キー1"]=>
  string(4) "値1"
  ["キー2"]=>
  string(4) "値2"
  [0]=>
  int(1)
}
```
キーを設定していない値に関しては0から順番にキーが割り振られます。

# クラス、メソッド
## 宣言
```php
class TestClass
{
}
````

## パブリックメソッド
```php
class TestClass
{
    public function publicMethod()
    {
        echo "パブリックメソッドです";
    }
}
````

```php
$tc = new TestClass();
$tc->publicMethod(); // パブリックメソッドです
```

### プライベートメソッド
```php
class TestClass
{
    private function privateMethod()
    {
        echo "プライベートメソッドです";
    }

    public function runPrivateMethod()
    {
        $this->privateMethod();
    }
}
````

```php
$tc = new TestClass();
$tc->runPrivateMethod(); // プライベートメソッドです
$tc->privateMethod(); // プライベートメソッドはインスタンスから呼び出せないのでエラー
```
vagrantで自作のcentos7のboxを作りました

# 環境
Windows 10 Home Ver.1511 build:10586.589
Vagrant 1.8.4
VirtualBox 5.0.22r108108

#参考
Ansible実行環境をWindows上に作る
http://qiita.com/CozyCorner/items/a6b368097e64b2922f26
＞Vagrantbox.es または Vagrant Cloud から、有志が作成したVagrant Boxをダウンロードできますが、えんぷら的にまずいので自作します。

なるほど！

#コメント&トラブルシューティングなどなど
※コマンドプロンプトのシャープが見出しになってしまうため、手動でroot$に書き換えました。褒めてください。
（スペースとか入れれば大丈夫でしたorz）
仮想マシンの名前はcentos7min64とする

ネットワークのコマンドが色々変わっていて
http://te2u.hatenablog.jp/entry/2015/05/11/012225
natのeh0の有効化だけで困る

http://qiita.com/yokomotod/items/e69d3cc69a1e16704089
伏字で困る

ここでhidekuroさんがお勧めしてたboxを安易にとってまねることにしようと思う
http://qiita.com/yokomotod/items/e69d3cc69a1e16704089

$ vagrant box add https://atlas.hashicorp.com/puppetlabs/boxes/centos-7.2-64-nocm
$ vagrant init
  # config.vm.box = "base"
↓変更
  config.vm.box = "puppetlabs/centos-7.2-64-nocm"

$ vagrant up
成功

vagrant sshでユーザーが勝手にvagrantになるのはどの設定なのだろう。
ifconfigもipも動くけどnatどれなんやろう。
loはlocalhostっぽいから
多分enp0s3なんだろうなー。
VirtualBoxの設定だとnatのアダプタしかないし。

しかし問題はsshログインできるかどうかだろう。
ということでmntui
　全部Automaticやん。。
　/etc/sysconfig/network-scripts/
　のファイルで設定してるっぽい。
　コピーするか(笑)
私は情弱の外道ですよおおおおおお
$ cp /etc/sysconfig/network-scripts/ifcfg-* /vagrant/
中身見たけど分かんねえや

$ vagrant up
を他に２つ追加したからなおさら不利になっている感がある。

eh0の代わりに存在感を放っている
/etc/sysconfig/network-scripts/ifcfg-enp0s3
が存在していたので
ON_BOOT=yesに変更

$ ssh localhost -p 2222 -l root
成功。YES!

よく分からないけど書いてる通りにRPMFORGEを追加。
el7にはする。迷惑にならないといいなあ。
0.5.3-1ってなんなんやろ。

yum installでパッケージが利用できないと言われる。
ほーう。

el6でもダメ。
ググったサイトで下記もダメっぽい
root$ rpm -ivh http://apt.sw.be/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

うん。飛ばそう。

■2016年9月25日
http://te2u.hatenablog.jp/entry/2015/05/11/012225
sshの設定
からレジューム作業

gitは
root$ yum list git
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
インストール済みパッケージ
git.x86_64                      1.8.3.1-6.el7_2.1                       @updates

root$ yum update git
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
No packages marked for update

ということでいいや。

iptable関連で動いてるサービスが見当たらない。
のでスルー。
root$ systemctl list-unit-files | grep tables
root$ systemctl list-unit-files | grep ip
iprdump.service                             disabled
iprinit.service                             disabled
iprupdate.service                           disabled
iprutils.target                             disabled

Guest Additions CD imageの取り出しも分からなかったのでスルー

udevのルールの削除もそれっぽいファイルが無さそうなのでスルー

後は問題なくできました。
先人に感謝m(_ _)m

# クラウドストレージにアップしたかった。
けど何でかgithubは無理でした。
wi-fiの通信量が制限に達したとかしょぼい理由か仕様か何かだと思います。
PHPで定数定義するときはdefine()よりもconstを使うべき

PHPで定数を定義する場合、`define`関数と`const`キーワードの2種類の方法がある。

```php
<?php
define('HOGE', 'hoge');
const FUGA = 'fuga';
```

見て分かる通り、defineは関数であるのに対しconstは関数ではないのでconstの方が高速に処理される。
大量に定数定義したいならconstを使う方が望ましい。

その昔「定数定義を高速に行う」というためだけの関数がいくつか存在していたが、いずれも拡張モジュールのメンテナンスが止まっているようなので、今やるならconst書き換えが現実的なチューニング法なんじゃないかな。
http://php.net/manual/ja/function.apc-define-constants.php
https://pecl.php.net/package/hidef

## defineでしかできないこと

defineは関数なので、引数には式であれば何でも書くことができる。関数の実行結果を書いてもOK。

```php
<?php
define('APP_PATH', dirname(__DIR__, 2));
```

こういうdefineはconstに書き換えることはできない。
ちなみに名前空間つきの定数もdefineで定義することができる。

```php
<?php
define('Foo\Moo\APP_PATH', dirname(__DIR__, 2));
echo Foo\Moo\APP_PATH;
```

## constでしかできないこと

クラス定数はconstでしか定義できない。ちなみに通常の定数をdefineでなくconstで定義できるようになったのは、PHP5.3から。

```php
<?php
class A
{
    const HOGE = 'hoge';
}
```

### constの右辺に書けるもの

任意の式が書けないのでconstでは書けないものが存在するが、定数であれば書くことができる。なので別の定数も書くことができる。

```php
<?php
const DIR = __DIR__;
const HOGE = FooClass::HOGE;
```



## 配列定数について

割と最近のPHPの機能として配列定数がある。

PHP5.6からconstでなら配列定数を定義できるようになり、PHP7からdefineでも配列定数を定義できるようになった。
LINE BOT APIではまったこと

LINE BOT API ( https://developers.line.me/bot-api/overview )で遊んでみようと思い，オウム返しするだけの Sinatra アプリ( https://github.com/yuya-takeyama/line-echo ) を Heroku にデプロイしてみたが，LINE developers で作ったLINEアカウントに対してメッセージを送っても何も返ってこない。

色々調べてみると Heroku の Fixie add-on ( https://elements.heroku.com/addons/fixie )で取得した固定IPをLINE developers の Serve IP WhiteList に登録するとき，xxx.xxx.xxx.xxx/32 と入力できないので，しかたなくxxx.xxx.xxx.xxx/30 とサブネットマスクを入力してたが，これが原因だったらしい。

![line-bot-ip-whitelist.png](https://qiita-image-store.s3.amazonaws.com/0/122952/2b9666f0-8f7d-53ab-6974-23aa10935e7d.png)

xxx.xxx.xxx.xxx というようにサブネットマスクなしで固定IPアドレスだけ入力したらBOTがちゃんと返信をするようになった。
(よくよく見たらoptionalって書いてあった)
Excel 2013 > カーソル移動が遅い場合の対応

```txt:動作環境
Excel2013 on Windows 8.1 pro(64bit)
```

Excel上で作業していて、あきらかにカーソル移動が遅いと感じた。

以下の設定変更をした。

1.  [ ハードウェア グラフィック アクセラレータを無効にする ] にチェックを入れる。
 - http://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_windows8/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%EF%BC%92/a890e0aa-c114-40dc-83f6-783e7eecabde

2. アニメーション非表示
 - http://www.office365room.com/office365/office2013-animation-off/
[ PHPUnit ] ボーリングから考えるテスト駆動開発 2テスト目

これからはじめるTDD テスト駆動開発入門 ThinkIT Books より

# ボーリングの点数計算プログラムを作る

## 全投球がガーターだった場合の処理

BowlingGameTestに以下の機能を実装。

- 倒したピンの本数を記録するrecordshot(pins)
- スコアを計算するcalculateScore()


### テストを書く

```php
<?php
use PHPUnit\Framework\TestCase;
use App\BowlingGame;

class BowlingGameTest extends TestCase
{

    public $BowlingGame;

    public function setUp()
    {
        $this->BowlingGame = new BowlingGame();
    }

    public function tearDown()
    {
        unset($this->BowlingGame);
    }

    /**
     * 全投球がガーター
     */
    public function testAllGarter()
    {
        $this->BowlingGame = new BowlingGame();

        for ($i = 0; $i < 20; $i++) {
            $this->BowlingGame->recordShot(0);
        }

        $this->assertTrue(0 === $this->BowlingGame->calculateScore());
    }
}
```

### 実行して怒られる

```bash
$ vendor/bin/phpunit tests/BowlingGameTest.php 
PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 15 ms, Memory: 4.00MB

There was 1 error:

1) BowlingGameTest::testAllGarter
Error: Call to undefined method App\BowlingGame::recordShot()

/var/www/html/test/UnitTest/tests/BowlingGameTest.php:28

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.
```

### テストが通るように処理を書く(__最小の構成で__)

① まずはメソッドを定義する

```php
<?php

namespace App;

class BowlingGame
{
    /**
     * @param  int    $pin [description]
     * @return [type]      [description]
     */
    public function recordShot(int $pin)
    {
    }

    /**
     * @return [type] [description]
     */
    public function calculateScore()
    {
    }
}
```

② 実行して怒られる

```bash
$ vendor/bin/phpunit tests/BowlingGameTest.php 
PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 31 ms, Memory: 4.00MB

There was 1 failure:

1) BowlingGameTest::testAllGarter
Failed asserting that false is true.

/var/www/html/test/UnitTest/tests/BowlingGameTest.php:31

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
```

③ 最小構成で通る処理を書く

```php
<?php

namespace App;

class BowlingGame
{
    /**
     * @param  int    $pin [description]
     * @return [type]      [description]
     */
    public function recordShot(int $pin)
    {
    }

    /**
     * @return int [description]
     */
    public function calculateScore()
    {
        return 0;
    }
}
```

④実行する

```bash
$ vendor/bin/phpunit tests/BowlingGameTest.php 
PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 20 ms, Memory: 4.00MB

OK (1 test, 1 assertion)
```

通った！！

## これでいいの？

設計に対して、正しい挙動が保証されているから大丈夫ぽい。
下記の設計要素を満たしいるため。
ただこれからどう変化していくのか。。。

## プログラミングの設計要素
本書より

大きく分けて2つ

### 責任の設計(静的設計)

- 問題を最も単純化できるクラスやメソッド構成
- 責任の内容を最も簡単に表現

### 仕事の正しさの設計(動的設計)

- どんな手順でクラスやメソッドを使うか
- 前提条件に対する正しい結果を定める
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

```
sudo mysql.server start
```

してみる

. ERROR! The server quit without updating PID file (/usr/local/var/mysql/PC.pid).

エラー食らう


/usr/local/var/mysql 以下のエラーログ見る

2016-09-25T02:55:15.283687Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

```
sudo chown -R _mysql /usr/local/var/mysql
```

いけた
３ヶ月でMVPを作る - Week 4

#進歩
![sc01.png](https://qiita-image-store.s3.amazonaws.com/0/104858/cca65ed6-898c-a3b9-eed2-b74f66a1564b.png)
初めてサービスをAWSに上げることができた！
（ただS3を設定してないからか、画像が読み込まれていない。）

![sc02.png](https://qiita-image-store.s3.amazonaws.com/0/104858/e9e81502-93e1-15dd-da1a-07871a5def59.png)
IPアドレスからだとサイトが読み込まれるのに、ドメイン名からだとうまくいかない。

![sc03.png](https://qiita-image-store.s3.amazonaws.com/0/104858/67ae2b3c-afc7-06a7-0734-b0f3eaf0dfec.png)
httpsでドメイン名を入れるとタイムアウトしてしまう。


#やったこと
-EC2インスタンスの作成と設定
（VPC、サブネット、ゲートウェイ、ルートテーブル、セキュリティグループ、EIP）
-EC2インスタンスにGithub上のアプリをクローン
-EC2インスタンス上でのMySQLの設定
-Unicorn、Nginxの設定（まだよく理解できてない。。）
-AWS Certificate ManagerでSSL証明書作成
- (Classic) Elastic Load Balancerの設定
-Google Apps for Workのverification


#学び
-世界で一番分かりやすいAWSの設定の仕方
http://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce
-AWSでドメイン、SSL証明書の取得、設定
http://qiita.com/masch/items/a5ef84998fb7784f9115
-分かりやすい（旧）ELBの設定の仕方
http://recipe.kc-cloud.jp/archives/35
-Google AppsのTXTレコードの設定
https://support.google.com/a/answer/2716800?hl=ja
-Google AppsのMXレコードの設定
https://support.google.com/a/answer/140034?hl=ja&ref_topic=2705493
-Linuxコマンドの一覧
https://hydrocul.github.io/wiki/commands/

（全ての学びはここに👇）
https://plus.google.com/u/1/107221871269602934448


#これから
-ドメイン名とIPアドレスの結びつける
-httpsからでも画面を表示できるようにする
-RDSを作成して、EC2上のMySQLの情報を移行する
-S3を作成して、写真のデータを入れる
-facebookでのログイン機能を追加する
-その時にFBの顔写真もとってくる機能を実装


#感想
今週やったことを書き出してみると、これまでやったことに自分でも驚いている。そういうのも２ヶ月半前まではAWSについては聞いたことはあったけど、「EC2、RDS、S3って何それ？」の状態だった。完全に横澤エンジニア塾で今まで全く知らなかったAWSの使い方からいろいろなサービスの運用の仕方を教えてもらったり、株式会社イタンジのエンジニアの方々からMySQLやEC2の設定について手伝ってもらえなければ、ここまでたどり着くことはできなかったと思う。そして世界一丁寧なAWS解説の記事と、Google Appの設定についてサポートのOmarにもとても助けられた。最初のスケジュールより遅れているので、そろそろ巻いていこう！
３ヶ月でMVPを作る - Week 3

#進歩
![IMG_20160925_112253.jpg](https://qiita-image-store.s3.amazonaws.com/0/104858/a43b9adc-0cdd-8ba3-cdaa-3b96586bdc21.jpeg)


#やったこと
-名刺の作成
-ドメイン名（triplor.co）の取得
-Google Apps for Workのメール取得


#感想
名刺に裏にメールアドレスとホームページのドメイン名を載せてしまうと、もうサービスを完成させる以外の選択肢がなくなってしまう（笑）そんなことを繰り返しながら自分にモチベーションを与えている。
複数枚の画像を毎日自動的に変更する方法

こんにちは。
今、私の学校の学園祭のHPをwordpressを使って運営しているのですが、

日替わりで毎日６枚ずつの画像を自動的に
・スライダー
または
・リロードで画像が変わる

ようにしたいのですが、参考になる記事等がなくて困っています。
このままだと、毎日12:00amに私が手動で画像の入れ替えをしなければならなく、QOLを著しく下げてしまいます笑。

参考になる記事orこの機能の実装の仕方を教えていただきたいです。
宜しくお願いします。
入門git 忘備録

もう何度目の再入門か分からないgit。
実際のところ、普段はGUIクライアントから使っていて、それほど困ってはないのですが、やっぱりちゃんと理解した上でコマンドラインからも使えるようになりたい。

というわけで、いい加減忘れないように忘備録をまとめながら学習。

参考にしたのはTravis Swicegood著 でびあんぐる監訳 「入門Git」。
読みやすいので文字通り入門には最適だと思います。あとはGoogle先生も。

リベースとか、触れてないトピックもあるけど、それはおいおい。

# Gitの設定

`git config --global user.name "[自分の名前]"`
`git config --global user.email "[自分のメールアドレス]"`
コミットしたときに表示される自分の名前とメールアドレスを設定。
「このプログラムを作ったのは誰だあっ」

# リポジトリの作成など

`git init`
リポジトリを作成する。

管理対象にしたくないファイルを.gitignoreに書く。
[gibo](https://github.com/simonwhitaker/gibo)というツールを使って生成するのがいいようだ。

`brew install gibo`
`gibo java > .gitignore`
giboをインストールして、Javaプロジェクト向けの.gitignoreを生成。

`gibo -l`
何を指定可能かはこれで確認。

# コミットするまで

編集したファイルを「ステージ」し、「コミット」する。という流れ。
二度手間っちゃそうだけど、「ステージングエリアのおかげで本当に作りたいコミットを練り上げる事ができる」とのこと。

`git add [ファイルパス]`
指定したファイルをステージ。

`git add -i`
対話モードでのステージング操作。
ファイルを一覧から選んでステージしたり、ステージから外したり。

対話モードから呼べる「パッチモード」を利用すると、ハンク（ファイル内の変更箇所）毎にステージするかどうかを選べる。

`git add -p`
パッチモードを直接起動するならこう。

`git commit`
ステージされた変更内容をコミット。

-m オプションでメッセージを指定。指定しなければエディタが起動。
使うエディタの指定は`git config --global core.editor`で。

メッセージは１行目に要約。それ以降に詳細を書くべし。
コミットの一覧を参照するとき、１行目の内容が見出しとして表示されるので。

`git commit -a`
追跡中のファイルに変更があれば自動でステージしてコミット。
追跡してないファイルはあらかじめaddしておく必要がある。

`git commit [ファイルパス]`
ファイルを指定してコミット。

`git commit --amend`
直前のコミットをやり直し。
「あ、インデント揃ってねえ。直すのは簡単だけど独立したコミットにするのはカッコ悪いなあ。。。」というとき。

# 現在の状態を確認

`git status`
現在の作業ツリーの状態を確認。
変更されてるファイルはどれで、ステージされてるファイルはどれで。。。という情報。

`git diff`
ステージしていない変更の差分を確認。
ステージングエリアと作業ツリーの差分。

`git diff --cached`
リポジトリとステージングエリアの差分を確認。

`git diff HEAD`
リポジトリと作業ツリーの差分を確認。
現在作業しているブランチに対する直近のコミット。

# ファイル削除、ファイル名変更・移動

`git rm [ファイルパス]`
リポジトリからファイルを削除。作業ツリーからも削除される。

`-r`オプションをつけるとディレクトリごと削除。
`--cached`をつけると、作業ツリーにファイルを残す。

`git mv [現ファイルパス] [新ファイルパス]`
ファイル名変更。ファイル移動もこれ。
古いファイルのgit rmと、新しいファイルのgit addを行ってくれる。

# 履歴を確認

`git log`
履歴を確認。

`git log -10`
最近10個。

`git log --since="5 hours"`
最近５時間。

`git log --pretty=oneline`
各コミットを１行で表示。

ほかにもいろいろ。詳しくはマニュアルページで。

# ブランチ関係

`git branch [ブランチ名]`
新しいブランチを作る。

`git branch -d [ブランチ名]`
ブランチを削除。

`git banch -m [現ブランチ名] [新ブランチ名]`
ブランチ名を変更。

`git branch`
ブランチを一覧表示。

`git checkout [ブランチ名]`
作業するブランチを切り替え。

`git checkout [ブランチ名] -b`
ブランチを作って今すぐ切り替え。

`git merge [ブランチ名]`
指定したブランチを、現在のブランチへとマージ。

`git merge --squash [ブランチ名]`
指定したブランチからすべてのコミットを取ってきて１つのコミットに圧縮し、現在のブランチへマージ。

`git mergetool`
競合を解決するためのツールを起動。

# 変更を元に戻す

`git checkout [ファイルパス]`
指定したファイルの、作業ツリーでの変更をなかったことに。

`git checkout .`
すべてのファイルの、作業ツリーでの変更をなかったことに。

`git revert -n [コミット]`
指定したコミットを取り消す新しいコミットを作る。
`-n`をつけないと、すぐにコミットまで行われる。

`git reset --soft [コミット]`
指定したコミットで施された変更をステージングエリアに戻して、コミットされてない状態に戻す。
`--soft`ではなく`--hard`を指定すると、作業ツリーからも変更内容が失われる。

# リモートリポジトリ

`ssh-keygen -t rsa`
Gitそのものの話題からは外れるけど。。。あらかじめ、SSH鍵を生成しておく。
ホームディレクトリの.ssh/id_rsa.pubに公開鍵が作られるので。GitHubであれば「Personal Settings」「SSH and GPG keys」に登録。

'git clone [リモートリポジトリURL]'
リモートリポジトリのクローンを作る。
すでに進行しているプロジェクトがあるなら、この方法。

`git remote add origin [リモートリポジトリURL]`
デフォルトのリモートリポジトリ(origin)を設定。
新しいプロジェクトを始めるならこっち。

`git branch -r`
リモートブランチの一覧を表示。

`git push -u origin master`
デフォルトのリモートリポジトリに、ローカルでのコミットを送信。
`-u origin master`で、ローカルブランチをリモートブランチへ関連づける。初回のみ必要。

`git push`
２度目以降のプッシュはこれでOK。

`git pull`
デフォルトのリモートリポジトリからコミットを取得し、ローカルリポジトリにマージ。
リンクをクリックしたらクリップボードにコピーする

# やりたいこと
ダウンローダーへリンクを渡すためにコピーすることが多い（面倒くさい！）
リンクをクリックするだけでコピーしたい

# 確認環境
Chrome 54b + Tampermonkey
[Document.execCommand - MDN](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand)見る限り、最新ブラウザなら動きそう

# ソース
```js:userscript.js
(function() {
    'use strict';
    
    // リンクを抽出
    var links = document.querySelectorAll('a[title="ダウンロード"]');
    links.forEach(function(link) {
        // リンククリックしたらコピー
        link.addEventListener('click', function(e) {
            e.preventDefault();
            // コピーしたいテキストを渡す
            copyText( link.getAttribute('href') );
        });
    });
})();

// リンクをコピー
function copyText(txt) {
    // ダミーのテキスト要素を作成
    var span = document.createElement('span');
    span.textContent = txt;
    
　　// ボディタグにテキスト要素を追加
    var b = document.getElementsByTagName('body')[0];
    b.appendChild(span);

    // 選択済みテキストを解除    
    var s = window.getSelection();
    if (s.rangeCount > 0) s.removeAllRanges();
    
    // 選択範囲にリンクを追加
    var r = document.createRange();
    r.selectNode(span);
    s.addRange(r);
    
    // クリップボードにコピー
    document.execCommand('copy');

    // ダミー要素の削除
    span.remove();
}

```

# 参考
[Chrome 43からcutおよびcopyコマンドが使えます - Qiita](http://qiita.com/yoichiro6642/items/43ee75196bf643cde093)
[addRange - MDN](https://developer.mozilla.org/ja/docs/Web/API/Selection/addRange)
do-while Javaの問題をTypeScriptにしてみる 5-2

コンソールに0〜4までの数字を順に表示したい。プログラムの①と②に入るコードとして、正しい組み合わせを選びなさい。

```java:java.java
public class Sample {
 public static void main(String[] args){
  int a = 0;
  【①】{
   System.out.println(a++);
  }【②】
 }
}
```

A.①do(a<5) ②while;
B.①do(5<a) ②while;
C.①do ②while(a<5);
D.①do ②while(5<a);

答えはCになります。
do-whileは処理をした後で繰り返しの判定を行う処理で、条件にかかわらず必ず１回は処理が実行されるのが特徴です。
これをTypeScriptで書くと

```ts:TypeScript.ts
a:number = 0;
do{
 console.log(a++);
}while(a<5);
```
このようになります。do-whileについては他言語と差はありません。
RubocopをRakeタスクとして実行する

小ネタですが、知って便利だと思ったのでまとめておきます。

# Rake化のメリット
すでにRakeでビルドプロセスを管理する環境の場合、Rubocopもその一員に加えられれば、別途管理する必要がなくなって便利です。

# やり方
もともとRubocop側でRakeタスクを用意してあるので、それを取り入れるだけです。

```rb:Rakefile
require 'rubocop/rake_task'

RuboCop::RakeTask.new
```

このたった2行で、「rubocop」というRakeタスクが出現します。あとは、`task default: [:rubocop, :spec]`とすれば、Rubocop＋Rspecがデフォルトになるなど、使い方は自由自在です。

# バージョン情報
* Rubocop 0.43.0
* Rake 10.5.0
* Ruby 2.2.4
Travis CIのデフォルトMac OS X環境が古すぎてHomebrewにも見捨てられている件

Travis CIで設定ファイルに下記のように書くとCI環境としてMac OS X環境が使えるようになります。


```yaml:.travis.yml
os:
  - osx
```

ところでTravis CIデフォルトのMac OS X環境は10.9 (Mavericks) + XCode 6.1なんですが、この環境だとHomebrewが「お前のOS古すぎるからサポートしないよ？」って言うようになりました。

```
$ brew install mysql
Warning: You are using macOS 10.9.
We (and Apple) do not provide support for this old version.
You may encounter build failures or other breakages.
Please create pull-requests instead of filing issues.
(snip)
```

また、過去に作られたMavericks用のバイナリパッケージはまだ生きているようですが、今後はMavericks向けのバイナリパッケージが作れられないようです。つまり、今後は`brew install`するたびに自前ビルドするパッケージが増えていき、CIに必要な時間も延びていくことになるでしょう。

# 対策

これは新しい環境を明示的に指定すれば問題にはなりません。

```yaml:.travis.yml
osx_image: xcode8
```

設定ファイルのトップレベルに上のように書けばOS X 10.11 (El Capitan) + Xcode 8環境が使われます。（参照： https://docs.travis-ci.com/user/reference/osx/#OS-X-Version )

もしくは、

iOSプロジェクトだと「何を今さら」的な話題かもしれませんが、UnixツールのCIをMac OS Xでも回しておこう、くらいのプロジェクトだとデフォルト環境のまま使っているところも多そうな気がします。

# 余談

これキー名や値に「osx」が使われてるわけですけど、Sierraからosxじゃなくなっちゃうんですよね…。どうでもいいけど少し悲しいですね。
RailsでJavascriptをURLに紐付ける [CoffeeScript]

## 概要
URLごとに発火するJSを１対１にする方法を紹介します！
いまのところ、これが一番シンプルかつ堅牢で、キャッチアップが楽かなと感じています＾＾

## コード
３つのステップで実現します

1. DOMにdata-controller data-actionを追加
2. JSが読み込まれたら、DOMからコントローラ名、アクション名を取得
3. コントローラとアクションに対応する、クラスのメソッドを実行

下記のコードのProjectNameのところは、ネームスペースとして機能します、
これによって、ActiveAdmin等プラグインのJSと衝突することを回避できます
プロジェクトごとに、適切なネームスペース名に置き換えます

views/layouts/application.html.erb

```slim
html
  head
    title ProjectName
  / 1. DOMにdata-controller data-actionを追加
  body data-controller=controller.controller_name.camelize data-action=controller.action_name
    ...
```

assets/javascripts/application.coffee

```coffeescript
$( ->
  # 2. JSが読み込まれたら、DOMからコントローラ名、アクション名を取得
  controller = $('body').data('controller')
  action = $('body').data('action')
  if controller && window.ProjectName[controller]
    obj = new window.ProjectName[controller]
    if action && obj[action]
      # 3. コントローラとアクションに対応する、クラスのメソッドを実行      
      obj[action]()
)
```

JSファイルはコントローラごとにつくり、
下記のようにクラス名とメソッド名を、コントローラ、アクション名にします

assets/javascripts/user.coffee

```coffeescript
(@ProjectName or= {}).Users = class
  index: ->
    $ ->
      alert 'ここはProjectNameアプリケーションのUsersコントローラのindexアクション'
  new: ->
    $ ->
      alert 'ここはProjectNameアプリケーションのUsersコントローラのnewアクション'
```

## グローバルに使うJSファイルがあるとき
**assets/javascripts/shared/**
などを作り、いつもどおりJSを書いていく

## 参考
[JavaScript Namespacing with the Rails Asset Pipeline](http://blog.endpoint.com/2014/03/javascript-namespacing-with-rails-asset.html)
[Write maintainable JavaScript/CoffeeScript in Rails](http://cookieshq.co.uk/posts/write-maintainable-javascript-in-rails/)
[ORACLE SQL]ORACLE MASTER Bronze DBA 12cの勉強環境の準備（私用）

#ORACLE MASTER Bronze DBA 12cの準備方法
白本と呼ばれるOracle Master Bronze DBA 12cの勉強をしていて、本を読んでいるだけでは勉強にならないと思い、学習環境を整えることにした。

最初はVagrantの[oracle12c-vagrant](https://github.com/steveswinsburg/oracle12c-vagrant)を使って学習しようとしたが、日本語に対応させようとしたが文字化けが解決できず時間をかなり浪費したのでしばらくあきらめることにした。

代わりに[Oracle Live SQL](https://livesql.oracle.com/apex/livesql/file/index.html)というオンラインでOracle DBA 12cを使える環境があることが分かったので、こちらを利用することにした。

##Oracle Live SQL
1. 使い始めるには[Start Coding Now]もしくは画面右上の[Sign In]をクリック。
![スクリーンショット 2016-09-25 7.35.05.png](https://qiita-image-store.s3.amazonaws.com/0/78003/3db3a9a3-96b5-f24d-ab10-c76d5bbdbfdc.png)
Oracleのプロファイルを登録していない人は[プロファイルの作成]からサインアップアカウントを作成してください。![スクリーンショット 2016-09-25 7.39.34.png](https://qiita-image-store.s3.amazonaws.com/0/78003/d054271e-4c83-968b-34d5-cf6a0a8d2f44.png)
アカウントをお持ちの方は[ユーザ名]と[パスワード]を入力して[サインアップ]をクリック。


2. もうこれで、パソコンとインターネットさえあればどこでもORACLE SQLの勉強が出来ます。
![スクリーンショット_2016-09-25_7_43_58.png](https://qiita-image-store.s3.amazonaws.com/0/78003/b20ead5b-5d00-515a-1178-1de28c7d7176.png)

3. SQL文を使い始めるには[SQL Worksheet]もしくは[Code SQL]をクリック![スクリーンショット_2016-09-25_7_43_58.png](https://qiita-image-store.s3.amazonaws.com/0/78003/9ccd80d1-9a44-3102-3479-c3db89f055c3.png)

4.これでSQLを打ち込んで画面右上の[Run]をクリックすればSQLが実行されます![スクリーンショット 2016-09-25 7.50.54.png](https://qiita-image-store.s3.amazonaws.com/0/78003/51497d3b-8ac0-b329-3677-2bcc90e861e4.png)

以上、これでOracle SQL 12cの勉強が捗ります！

###白本の最初の方で入力しておくと便利なSQL文(勉強用に入力するのがめんどくさい人用)

```sql
CREATE TABLE EMPLOYEES (
EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(255),
YOMI VARCHAR2(255),
JOB VARCHAR2(255),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7),
COMM NUMBER(7),
DEPTNO NUMBER(2),
PRIMARY KEY(EMPNO)
);
```

でもヘルプによると
>・Can I run any SQL command?
No, in general you can run commands that create and manipulate objects in a single schema. Some functionality is disabled for security reasons. For example, you can create tables but you cannot create a tablespace.

要するに、ひとつのスキーマにオブジェクトを作製したり操作したりはできるけど、セキュリティ的な理由である機能は使えなくしています。例えば、テーブルは作成できるけど、テーブルスペースは作れないよ！とのこと。

後々、勉強していて学習環境として魅力的でなくなるかも・・・。

Vagrantの学習環境が整ったらまた別途メモのような記事を作成します。
pycoin（Python Cryptocoin Utili）を使ってビットコインネットワークに接続する

# pycoinとは

* ビットコインネットワークとやり取りをするためのPythonライブラリ
* KU,TXといった鍵やトランザクションを操作する便利なコマンドラインツールが含まれている

参照：https://github.com/richardkiss/pycoin

# インストール

pipで簡単にインストールできます。

````bash:
$ pip install pycoin
Collecting pycoin
  Downloading pycoin-0.70.tar.gz (98kB)
　：
　：
Successfully built pycoin
Installing collected packages: pycoin
Successfully installed pycoin-0.70
````

# サンプルコード

いくつかサンプルを用意しようと思ったんですが、以下にあるサンプルコードがわかりやすいです。
pycoinのテスト用コードを見てもいいかもしれません。

https://github.com/bitcoinbook/bitcoinbook/blob/first_edition/code/pycoin_example.py

# コマンドラインツール

pycoinには鍵を操作したり、トランザクションの操作や可視化をする便利なコマンドラインツールが含まれています。

* KU:鍵操作用ツール
* TX:トランザクション操作用ツール

以下の場所にサンプルが載ってます。

参照：https://github.com/richardkiss/pycoin/blob/master/COMMAND-LINE-TOOLS.md