OmniAICreator/Qiita-1.07M huggingface dataset:
UniRx 書き方サンプルメモ

# ReactiveStringの変化購読
```C#
ReactiveString.Where(value => value == Co.MODE_STOP).Subscribe( value => {
//stringが変更された時の処理
});
```
# ReactiveCollectionの初期化

```C#
ReactiveCollection<bool> reactiveCollection = new ReactiveCollection<bool>(){true,false,false,false};
```

# ReactiveCollectionのネスト
```C#:宣言
private ReactiveCollection<bool> collection;
public ReactiveCollection<ReactiveCollection<bool>> collections;
```

```C#:初期化
collection = new ReactiveCollection<bool>(){true,false,false,false,true,false,false,false,true,false,false,false,true,false,false,true};
collections = new ReactiveCollection<ReactiveCollection<bool>>(){Sequence};
```

# KeyEventのReactive化

```C#:Stream
IObservable<bool>  keydownStream = this.UpdateAsObservable().ObserveEveryValueChanged(_ => Input.GetKeyDown(keycode)).Where(x => x);
```

```C#:Subscribe
keydownStream.Subscribe(_ => Debug.Log("KeyDown"));
```

# 購読の停止
.Subscribe の戻り値がIDisposable .Dispose();で購読停止可能。

# ReactiveEnum を自分で定義して State 管理

```C#:State
public class StateManager : MonoBehaviour
{
    public StateReactiveProperty appState = new StateReactiveProperty(APP_STATE.WAITING);

    public enum APP_STATE
    {
        WAITING = 0,
        PLAY,
        COUNT_DOWN,
        FINISH
    }

    // Start is called before the first frame update
    void Start()
    {
       appState.Subscribe(value =>
       {
           Debug.Log("APP_STATE:" + value);
       });
    }
}

[System.Serializable]
public class StateReactiveProperty : ReactiveProperty<StateManager.APP_STATE>
{
    public StateReactiveProperty() { }
    public StateReactiveProperty(StateManager.APP_STATE initialValue) : base(initialValue) { }
}
```

追記していきます。
kintone 翻訳アプリ

kintone アプリで、手軽に翻訳が出来るようにしてみました。
英語が苦手で、英訳するときは、翻訳サイトで英訳⇒和訳の検証をしますので、同じように日本語入力すると英訳⇒和訳を一回で出来るようにしています。
また、英文入力で和訳するため、いくつか英文パターンを試すことができます。

- 日本語入力後、タブキーで英訳⇒和訳
- 英文入力後、タブキーで和訳
- テキスト文字数をカウントして、ラベル欄に表示


![2017-05-04_13h13_24.png](https://qiita-image-store.s3.amazonaws.com/0/100572/b4d42e46-58f5-7a2e-6889-ed68dab17131.png)


# Microsoft Translator API
今回翻訳に使用したのは、[Microsoft Translator API](https://www.microsoft.com/ja-jp/translator)です。
月200万文字まで無料の設定であれば、ちょっと翻訳したい程度なら十分です。
月200万文字を超過するとエラーになるだけで、翌月になるとまた使えます。
突然、請求が来てびっくりということが無いので安心です。

500文字の日本語を英訳・和訳を20日間で平均して使うとすると、100回/日使えます。

2,000,000文字 / 1000文字 / 20日 = 100回/日


# 翻訳結果

主語が無いと、やはり変ですね。

>電子回路シミュレータのライブラリSimcirJSを使った kintone アプリです。
>>It is with electronic circuit simulator library SimcirJS kintone app.
>>>電子回路シミュレータ ライブラリ SimcirJS kintone アプリです。

むりやり「これ」を付けてみると、

>電子回路シミュレータのライブラリSimcirJSを使った kintone アプリは**これ**です。
>>This is the kintone app using electronic circuits Simulator library SimcirJS.
>>>これは、電子回路シミュレータ ライブラリ SimcirJS を使用して kintone のアプリです。

以上を参考にして、英文を入力して和訳
和訳はそれなりですが、英文としてはどうなのか？英語は苦手!。

>This is the kintone app that uses library SimcirJS of electronic circuit simulator.
>>これは、電子回路シミュレータの SimcirJS ライブラリを使用する kintone のアプリです。



# 処理手順

- トークンを取得
- トークンと日本語文字列をAPI に渡して、英語翻訳結果を取得
- トークンと英語文字列をAPI に渡して、日本語翻訳結果を取得

API 呼び出しは、kintone.proxy を使います。


## 参考にしたサイト
- [Microsoft Translator APIを使ってみる](http://qiita.com/kemayako/items/21fe36005e6e729aff77)
- [Translator Language Codes](https://msdn.microsoft.com/en-us/library/hh456380.aspx) ※2017/5/4 時点で、53 言語が使えます。
- [外部APIの実行](https://cybozudev.zendesk.com/hc/ja/articles/202166320-%E5%A4%96%E9%83%A8API%E3%81%AE%E5%AE%9F%E8%A1%8C) kintone.proxy で、API を呼び出します。
- [kintone.proxy()のエラー処理について](https://www.joyzo.co.jp/blog/2388) 


# その他の翻訳API

出来れば、各種翻訳APIの結果を並べてみたいです。

- [kintone Webhook × Zapierでレコード内文章を簡単に翻訳＆表示してみよう！](https://cybozudev.zendesk.com/hc/ja/articles/115001618243-kintone-Webhook-Zapier%E3%81%A7%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E5%86%85%E6%96%87%E7%AB%A0%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E7%BF%BB%E8%A8%B3-%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-)
- [GOOGLE 翻訳 API](https://cloud.google.com/translate/?hl=ja)
自宅サーバー設計(ソフトウェア編)

ハードウェア編で、MacBookProをDockerホストの構成を説明しました。Dockerコンテナがどのように動作しているかを整理します。

# 前提

- サービスを楽に構築するため、Dockerコンテナで(ほぼ)全てを構成したい。
- ユーザー数が少ない(自分しか使わない)ので、DBMSはSQLiteでとりあえずいいや。
- 定期ジョブは、Jenkinsおじさんにやってもらう。
- ファイル管理は、(可能な限り)minioコンテナに集約したい。最悪、minioコンテナのファイルから環境を復元したい。
    - ジョブのログ、再発行可能な証明書など消えても良いファイルは、各コンテナのボリュームで扱う。

# 構成図

![component](http://www.plantuml.com/plantuml/png/ZPBD3e8m3CVlFiLUeBkOUF3WYn0FOonaCbeo88XFRn5O1WxZgN_Q7_rSXgN59pIUdkFzb3dJjGQr7viEeWXegXk5bf0PRuhQec6LEohPq83QKL-mV1YiBBPJZAYgbQzOelBKW_PgSCRllw78sSK9BR7LnXE2GkN65rTWDcfF08Y_Ejpy9AK8BOkhMAJiBvMiJOBz3CNWP8-fC3EJgpwcrxKmlCXZTbu5a-tvHvFhTgT65nteK2qUVUUEphFn9suJuW0tyNNCRNIzuzQxk-ekHoBlN3Y5fHzA77i3)

# 構成の説明

## nginx-proxyとletsencrypt-nginx-proxy-companion

nginx-proxyコンテナが外部からのHTTP(S)接続を受け入れ、ホスト名に応じて各コンテナに振り分けます。しばしば`jwilder/nginx-proxy`が使用されますが、1コンテナに複数のドメイン名をマッピングしたかったので、`dbendelman/nginx-proxy`を使用しています。

letsencrypt-nginx-proxy-companionコンテナは、Let's Encryptを使用してドメイン名に対して自動的にサーバー証明書を発行してくれます。

nginx-proxyコンテナとletsencrypt-nginx-proxy-companionコンテナの組み合わせは、Dockerコンテナにおける複数サービス提供の鉄板構成だと思っていて、サービスが増減しても動的に管理してくれるので、すごく便利です。

## redmine

redmineコンテナで、自分用のRedmineを運用しています。プラグイン、テーマなどをビルド時に追加しています。

コンテナ実行時に`VIRTUAL_HOST`環境変数を設定することで、`redmine.u6k.me`でアクセスできるようにしています。

Redmineは趣味開発や仕事だけではなく私生活のタスクも管理しているため、頻繁にバックアップを取り、長期旅行では一時的にDigitalOceanで運用するなどしています。

## owncloud

owncloudコンテナで、自分用のownCloudを運用しています。スマホの写真や動画、PC内ファイルの管理などで使っています。

コンテナ実行時に`VIRTUAL_HOST`環境変数を設定することで、`owncloud.u6k.me`でアクセスできるようにしています。

ownCloudにはS3と連携するプラグインがあるため、minioコンテナにファイル管理を集約できるはずですが、エラーになってしまい、今のところ実現できていません。

## blog

blogコンテナで、blogを公開しています。以前はBloggerを使っていましたが、Markdownの扱いが不便だったため、jekyllに乗り換えました。なので、記事を書いたらCircleCIでDockerイメージをビルドして、blogコンテナを再起動することで記事を更新しています。

コンテナ実行時に`VIRTUAL_HOST`環境変数を設定することで、`blog.u6k.me`でアクセスできるようにしています。

## bookmark

自作のブックマーク管理サービスを運用しています。一般的なブックマーク管理サービスのようにタグ管理や検索ができる他、REST APIでアクセスでき、ブックマークすることでWebページをキャッシュすることができます。

とはいえまだ開発中で、ドッグフーディングしているところです。

コンテナ実行時に`VIRTUAL_HOST`環境変数を設定することで、`bookmark.u6k.me`でアクセスできるようにしています。

## jenkins

jenkinsコンテナで自分用のJenkinsを運用しています。ただ、ビルドのためではなく、なんちゃってジョブ管理システムとして使っています。具体的には、以下のようなことをしています。

- コンテナのバックアップ
    - redmineのSQLite
    - bookmarkのhsqldb
    - narou-crawler-dbのダンプ
    - 上記を取得して、minioコンテナにアップロード。
- MyDNSにIPアドレスを通知。
- ceron-analyzeのAPIを定期呼び出し。
- narou-crawlerのAPIの定期呼び出し。
- minio、owncloudが管理するファイルをAmazonCloudDriveへバックアップ。

コンテナ実行時に`VIRTUAL_HOST`環境変数を設定することで、`jenkins.u6k.me`でアクセスできるようにしています。

## minio

コンテナのファイル管理を一手に引き受ける、S3互換ストレージであるMinioを運用しています。全てのファイルはここに集約されるため、minioコンテナが管理するファイルをバックアップすれば、万が一システムが壊れてもリストアできる…はず。

コンテナ実行時に`VIRTUAL_HOST`環境変数を設定することで、`s3.u6k.me`でアクセスできるようにしています。

# コンテナの起動、再起動、更新

swarmやshipyardなどで管理するべきかなとは思いますが、サービスごとにシェルで管理しています。このシェルは、コンテナ停止→イメージ更新→コンテナ起動、を行います。

どこかの記事で「サーバー管理は、sshして作業しなければならない時点で負け」とあって、できればそこを目指したいですが、目標ということで。

CIビルド後のコンテナ自動再起動を仕込もうと考えたことはありますが、ビルドと再起動が必ずしも同時ではないと考えて、仕込んでいません。実際、仕組みを大きく変えるためにコンテナ再起動前後で手作業が発生することがあります。

# おわりに

若干煩雑ではありますが、今のところこのように運用しています。リソースに余裕があれば、CoreOS起動→全コンテナが最新化されて起動、とかやってみたいです。
MacPorts + CMakeで_iconvなどのシンボルが見つからない場合の対処

# 結論

cmakeのオプションに-DCMAKE_PREFIX_PATH=/opt/localを指定して、MacPorts内のヘッダファイル、ライブラリを検索するように指定する

# 背景

[ZXing C++ Library](https://github.com/glassechidna/zxing-cpp) をMacPorts上のCMakeでビルドすると、下記のメッセージが出てビルドが失敗してしまいました。_iconv, _iconv_close, _iconv_openというシンボルが見つからないというエラーです。

```
Undefined symbols for architecture x86_64:
  "_iconv", referenced from:
      (anonymous namespace)::add(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in libzxing.a(Decoder.cpp.o)
      zxing::qrcode::DecodedBitStreamParser::append(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char const*, unsigned long, char const*) in libzxing.a(DecodedBitStreamParser.cpp.o)
  "_iconv_close", referenced from:
      (anonymous namespace)::add(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in libzxing.a(Decoder.cpp.o)
      zxing::qrcode::DecodedBitStreamParser::append(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char const*, unsigned long, char const*) in libzxing.a(DecodedBitStreamParser.cpp.o)
  "_iconv_open", referenced from:
      (anonymous namespace)::add(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in libzxing.a(Decoder.cpp.o)
      zxing::qrcode::DecodedBitStreamParser::append(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char const*, unsigned long, char const*) in libzxing.a(DecodedBitStreamParser.cpp.o)
ld: symbol(s) not found for architecture x86_64
```

cmake実行時の下記のログから、iconvは見つかっているようでした。

```
-- Found Iconv: /opt/local/lib/libiconv.dylib
```

# 原因

ライブラリは/opt/local配下のものが見つかっていましたが、インクルードファイルは/usr配下のものが見つかっていたのが原因でした。/usr配下のiconvと/opt/local配下のiconvには違いがあるため、上記のエラーが出ていました。

# 解決方法

cmake実行時のオプションに、-DCMAKE_PREFIX_PATH=/opt/localを指定することで、/opt/local配下のファイルを優先的に検索させることができます。このオプションをつけることで、問題が解決し、ビルドに成功しました。
sequel proでmysqlのデータベースを簡単に操作しよう

vagrant環境でmysqlを使用する際にいちいちコマンド打つの面倒だなって時に教えてもらったことメモ。
macアプリのSequel Proを使うとGUIでデータベースの操作が簡単にできます。テーブル作りたいとか要素追加したいとか名前変えたいとかsql文の実行ももちろんできます。


[ダウンロードはこちら]https://www.sequelpro.com/

設定はこんな感じ。

<img width="446" alt="スクリーンショット 2017-05-04 13.17.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/149698/b07edc1e-c2ee-4417-f965-95840a5bfe20.png">

名前は適当なものを。
ローカル環境なのでmysqlホストは127.0.0.1。
mysqlで使用するユーザ名とパスワードを入力。
使用するデータベースを選択。（データベースは作っておくといいかも）
SSHホストとユーザはvagrant sshした際に

```
[vagrant@localhost ~]$ 
```

こんな感じになると思うので、該当項目を入力。
SSH鍵ですが、vagrantfileがあるディレクトリで

```
vagrant ssh-config
```

を打ち、IdentityFileの項目にパスが書いてあるのでそれを参照。
SSHポート番号もこのコマンドで出てきます。

以上で完了。

接続する前にお気に入りに追加しておくことをお勧めします。
自宅サーバー設計(ハードウェア編)

自分用のRedmineやownCloudを運用するために、さくらVPSやDigitalOceanやOpenShiftなどをうろうろしていましたが、落ち着いてきたので現状を整理したいと思います。まずは、ハードウェア構成を整理します。

# 前提

- 昔使っていたMacBookがあるので、これをDockerホストにしたい。
- HDDが数台あるけど、1個のボリュームにして扱いやすくしたい。
- ドメイン名でアクセスできるようにしたい。
- バックアップは、自宅とは別サイトにしたい。

# 構成図

紆余曲折あり、現在は以下のような構成になっています。

![component](http://www.plantuml.com/plantuml/png/oymhIIrAIqnELL0AytDMuif4y8E3FL3u7Y4X0Hh1cafSN7dvAK2-RsAoKtv-Ta1Hlf92DPS244Jd9YRx1yU2sSdvkGNvUQbv9K23CujAIXDpdF8hO0h1YftpYr9XgckvQc76UhYu6EeOwHZ33VK9yrL8hIWnKT0m2t7IZ0MfZ7xSlE1nynuOsVcuUU7ZfYMFcpV7AjZOF5qoxMNpYiTDMy5oanytxRIpuuhshNJn2yOjxPYRM9MVvvoJNvhYKfHPbefJ9HVKamgwfGMw2j70G8lbWdb5GLVN3jEz25cm3c2mOeX1WpOMdyTqWUeWde1x1YG43N9qMy5oc9woKdZSFE5nS_FZflMFcnQ16CtJ0G00)

# 構成の説明

## CoreOS on VirtualBox on macOS

Docker for macも使っていましたが、以下のような不安定さがあり、結局、CoreOSに戻しました。

- `qcow2`ファイルが肥大化して、ストレージを圧迫してしまう。
- ネットワーク通信が頻発すると、接続確立できなくなる？

## 外部からアクセスする場合は、sshまたはVNC

普段はCoreOSで作業を行うため、sshで接続します。CoreOSの調子がおかしい、macOSをアップデートする、などの場合はVNCでアクセスします。

## "u6k.me"でアクセスできるように、ムームードメインで契約

ムームードメインで年間契約して、MyDNSでドメイン名とIPアドレスを管理しています。IPアドレスが変わっても良いように、Jenkinsコンテナで定期的にIPアドレスを通知しています。

## HDDはLVMでボリュームを統合

ボリュームを1個に統合して、ext4ストレージとして使っています。これは今でもちょっと迷っていて、個別ボリュームで扱った方が良いかな？故障したときどこまで被害が広がるかな？と悩んでいます。

## バックアップはAmazonCloudDrive

まだ全部をバックアップはできていなくて、少しずつ進めています。

## MacBookPro

排熱の観点から、風通しの良い場所において、まな板立てに立て掛けています。温度を監視していますが、変な高温になることは今のところありません。

# おわりに

ストレージさえ解決すれば、全てAWSかDigitalOceanに持っていきたいのですけど、今のところ自宅で運用しています。また、旅行などで長期間自宅を離れる場合は、Redmineなど必須サービスのみをDigitalOceanで一時的運用するようにしています。

CoreOSの中でどのようなDockerコンテナが動作しているかは、ソフトウェア編で説明します。
Python+seleniumでGWに大量のメルアドげっと

#はじめに
さてみなさまGWいかがお過ごしでしょうか
私は割と時間を持て余しているので初めての投稿をさせていただきます。
初めての投稿ですので何卒至らない部分などあるかとございますが、よろしくお願いいたします。

この記事は © メルアドぽいぽいの許可を得ずに執筆しています。問題がありましたら、連絡お願いいたしますすぐに削除させていただきます。


##今回の目的
突然ですが
以下のサイトをご存知でしょうか？
https://m.kuku.lu/

メールアドレスを無限個生成してくれるサービスです。とても便利なのですがいちいちメールアドレスをクリックして生成するのが面倒いので自動化してしまおう、というのが今回の目的です。大量にメールアドレスが欲しい時、ありますよね(^_^;)


##下準備
下準備します
pythonとseleniumの環境を整えなくてはなりません

seleniumとはwebページをテストすることの出来るツールです。
pythonはプログラミング言語で今回のウェブページ操作のスクリプトをこちらで書くことになります。

###pythonのインストール
以下の記事を参考にしてください。無断でリンクさせていただきます。失礼いたします

・windows（taipon_rock様の記事）
http://qiita.com/taipon_rock/items/f574dd2cddf8851fb02c　　　
http://qiita.com/socket1016/items/fdcc454e4ffe70a07507

・mac(ramma様の記事) ←pyenvを使い3.5.1のインストールまで完了させてください
http://qiita.com/ramma/items/5c3cb3bb371e6a6286f1

・linux(uryyyyyyy様の記事)
http://qiita.com/uryyyyyyy/items/268f8dc0d6ec3d7da7e3
正直ubuntu環境で構築したほうがはるかに早いと思います
windowsだと結構だるそう

当方の環境がubuntu 16.04 LTS なので以降はこちらで解説させていただきます。
###seleniumのインストール
seleniumは端末に以下のコードで入ります。

```shell-session
pip install selenium

```
###chrome web driverのインストール
次にchromeを操作するドライバーが必要です。
https://sites.google.com/a/chromium.org/chromedriver/downloads
こちらからダウンロードし中身の「chromedriver」ファイルを実行するプログラムと同じ場所に置いてください。

これで環境が整いました。

###スクリプトを書く
今回はメルアドぽいぽいからメールアドレスを自動的に取得して
テキスト書き出すプログラムを作りました。以下がソースコードです。


```py


import os
import time
from selenium import webdriver

# ブラウザの起動させます
browser = webdriver.Chrome('./chromedriver')
# ページ移動
browser.get('https://m.kuku.lu/')
time.sleep(1)
# xpathでIDとPWを取得
browser.find_element_by_xpath('//*[@id="link_logindata"]').click()
ID=browser.find_element_by_xpath('//*[@id="area_numberview"]')
PW=browser.find_element_by_xpath('//*[@id="area_passwordview"]')
f=open('poipoiIDPWmaillist.txt','w')
f.write('IDとPWがわからなくなるとメールが受信できなくなります\nくれぐれも無くさないように注意してください。\n\n')
f.write('ID='+ID.text+'\n')
f.write('PW='+PW.text+'\n\n')
f.write('以下メイルアドレス\n\n')

for num in range(1,1900):
	browser.find_element_by_xpath('//*[@id="link_addMailAddrByAuto"]').click()
	time.sleep(2)
	mailadresu=browser.find_element_by_xpath('//*[@id="area-newaddress-view-data"]/div/div[1]/u')       
	f.write(mailadresu.text+'\n')
	time.sleep(2)
	browser.find_element_by_xpath('//*[@id="link_newaddr_close"]').click()
	time.sleep(1)   






```


基本的にはページ上で操作したい場所のxpathを取得してソースコードに記載します
chromeでのxpathの取得方法は標準の開発者モードにて該当箇所を右クリック→コピー→xpathで出来ます
詳しくは以下のページをどうぞ
http://ptech.g.hatena.ne.jp/noromanba/20120528/1338307299

```py
browser.get('ココに行きたいウェブページのアドレス')
browser.find_element_by_xpath('ココに取得したxpath').click() #←こいつでクリック
time.sleep(遅延させたい秒数) #←こいつは待ち時間、ページの操作を待っている時間のことです。
```

seleniumについての詳しい解説は公式日本語ドキュメントをご覧ください
http://selenium-python.a-zumi.net/installation.html#introduction

以下のソースコードを「適当な名前.py」で保存しコマンドラインより

```
python3 適当な名前.py
```
でchromeブラウザが自動的に起動し、メルアドの取得がされます。



とりあえずはこちらのコードでメルアドぽいぽいよりメールアドレスの取得が可能になります。
テキストデータは同じフォルダに「poipoiIDPWmaillist.txt」として存在しています。
IDとPWが控えてありますのでそちらからご利用ください。



####実行した環境
ubuntu 16.04 LTS
python 3.5.1
selenium 3.4.1
Vagrant box ubuntu/xenial64 の ubuntuユーザ の passwordについて

# 背景

Ubuntu descktop が使いたいと思い、Vagrant の 公式box ubuntu/xenial64 を使用して環境を作っています。
Vagrantのconfig `vb.gui = true`にし起動させ、いざ！ログイン！
と意気揚々と`ubuntu:ubuntu`で試して見たら、ログインができない。
色々試してみても、ログインができない。
どういうこちゃ  \_(:3 」∠ )_ 
user: ubuntuのパスワードが全くわからないんですけど（ ;  ; ）

ということがあり、ubuntuパスワードの発掘作業をしたことの備忘録になります。

# 結論

## ubuntu ユーザのパスワードの表記場所

```
~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/20170501.0.0/virtualbox/Vagrantfile
```

の中に記載されている

```
config.ssh.username = "ubuntu"
config.ssh.password = "79eee261f17ac64e2481039d"
```

こいつの`79eee261f17ac64e2481039d`がパスワードになります。

注意) 
パスワードは、PCなどによっても変わるようです。
ここに書いてあるpasswardを使ってもログインできないってなるので、ちゃんんと自分の.vagrant.d/ を確認してください。


# Vagrantfile で passwordを上書きできないかの試み

## Vagrantfileの設定を書き換えてみる

Vagrantfileのconfigに、`config.ssh.password = 'ubuntu'`を直接していすることで、パスワードを強制的に`ubuntu`にできないか試してみます。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.ssh.username = 'ubuntu'
  config.ssh.password = 'ubuntu'

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
  end
end
```

と、Vagrantfileを編集し、試してみました。

### 結果

はい。だめでした。

```
$ cat ~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/20170501.0.0/virtualbox/Vagrantfile

# Front load the includes
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
load include_vagrantfile if File.exist?(include_vagrantfile)

Vagrant.configure("2") do |config|
  config.vm.base_mac = "02C9FD7CBFCE"
  config.ssh.username = "ubuntu"
  config.ssh.password = "79eee261f17ac64e2481039d"

  config.vm.provider "virtualbox" do |vb|
     vb.customize [ "modifyvm", :id, "--uart1", "0x3F8", "4" ]
     vb.customize [ "modifyvm", :id, "--uartmode1", "file", File.join(Dir.pwd, "ubuntu-xenial-16.04-cloudimg-console.log") ]
  end
end
```

と、書き換わってません。
うーむ。これは、どうにかして、書き換えれるものなのだろうか？？？

`~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/20170501.0.0/virtualbox/Vagrantfile`
の `config.ssh.password`を直接書き換えてもだめでしたorz

# 感想

当面は、`~/.vagrant.d/`配下から、パスワードを漁る方法で良しとします。
ただ、デフォルトで作成されているubuntuユーザを使用するのではなく、Provisioningで、新規ユーザを作成した方が良いかもしれないと思いました。
この辺、いい方法ないだろうか。。。

# 追記

Provisioning で、userを追加できるように、shellを作成したので追記しておきます。

```bash:useradd.sh
#!/bin/bash
set -Ceu

USER="ocome"
# password "vagrant" を SHA-512 でハッシュ化
COMMAND='print crypt('"${USER}"', "\$6\$");'
PASSWORD=$(perl -e "${COMMAND}")

create_user(){

  echo "Create a user named ${USER}."
  # Create User
  sudo useradd -p ${PASSWORD} -m ${USER}
  # grant authrity
  sudo usermod -G sudo ${USER}
  exit 0
}

trap "create_user" ERR
# check exist user
getent passwd ${USER}

echo "${USER} is already created."
```
Arduboy購入後に読んだドキュメント

ドキュメントやフォーラムの構造が把握できていないので読んだページを順番にメモっておく。

## 日本語の記事

- [日本語フォーラム(公式)](https://community.arduboy.com/c/ja)
    - 日本語で情報交換が出来てとても便利。
    - おすすめゲームやフォントについてなどの情報あり。

## 英語のドキュメント

- [Quick Start Guide](https://community.arduboy.com/t/quick-start-guide/2790)
    - IDEのインストール、ボードの設定、最初のビルドから転送までの流れ。
- [Make Your Own Arduboy Game: Part 1 - Setting Up Your Computer](https://community.arduboy.com/t/make-your-own-arduboy-game-part-1-setting-up-your-computer/2336)
    - こちらもセットアップの流れの解説。 
- [Make Your Own Arduboy Game: Part 2 - Printing Text](https://community.arduboy.com/t/make-your-own-arduboy-game-part-2-printing-text/2337)
    - テキストの表示までを行う。
- [Make Your Own Arduboy Game: Part 3 - Storing Data & Loops](https://community.arduboy.com/t/make-your-own-arduboy-game-part-3-storing-data-loops/2338)
    - 変数、ループ、カーソル
- [Make Your Own Arduboy Game: Part 4 - Questions & Button Input](https://community.arduboy.com/t/make-your-own-arduboy-game-part-4-questions-button-input/2376)
    - 条件分岐とボタン入力
- [Make Your Own Arduboy Game: Part 5 - Your First Game!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-5-your-first-game/2396)
    - 数字当てゲームの作成
- [Make Your Own Arduboy Game: Part 6 - Graphics!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-6-graphics/2440)
    - 画像ファイルのバイト変換、表示
- [Make Your Own Arduboy Game: Part 7 - Make Pong From Scratch!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-7-make-pong-from-scratch/2615)
    - パドルゲームの作成
なでしこでリンクラベルもどき(GUI部品)を作る

日本語プログラム言語「なでしこ」にはリンクラベルが用意されていません。
ですのでそれっぽいものを実装してみます。

#完成イメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112850/1c11082c-0217-eba2-c191-179a83050dc0.png)

#ソースコード
ラベル部品の文字色を変え、マウスカーソルが移動するとカーソルの形が変わるようにしています。

```
リンクラベルとはラベル
これについて
　W=100
　文字書体は「Meiryo||下線」
　文字色は$66cc
　テキストは「 Googleを開く 」
　マウス移動した時は～
　　(0の32649のカーソルアイコン取得)にマウスカーソル設定。
　マウス押した時は～
　　(0の32649のカーソルアイコン取得)にマウスカーソル設定
　クリックした時は～
　　「google.com」を起動

//マウスカーソルを変更するため Win32API
●カーソルアイコン取得(ファイルの種類の) = DLL("user32.dll","DWORD LoadCursorA(BOOL,DWORD)")
●マウスカーソル設定(Iに) = DLL("user32.dll","DWORD SetCursor(DWORD)")
```

#参考サイト
これの再利用性を高めたものが下記サイトにあります。
[なでしこライブラリ～ \- ■リンクラベル](https://www26.atwiki.jp/isoroku_be/pages/26.html)
Swift3 で 'CGContextDrawImage' is unavailable: Use draw(_:in:)

SwiftでCGContextDrawImageを使おうとした時、現在のSwift3の構文コードではいくつかの問題が発生していたので備忘録として書き残しておきます。

# 問題のコード

```swift
CGContextDrawImage(context, CGRect(x: -self.size.width/2, y:-self.size.height/2, width:self.size.width, height:self.size.height), self.cgImage)
```


# 解決コード

```swift
context.draw(context as! CGImage, in: CGRect(x: -self.size.width/2, y:-self.size.height/2, width:self.size.width, height:self.size.height), byTiling: (self.cgImage != nil))
```

# 参考

[CGContext](https://translate.googleusercontent.com/translate_c?depth=1&hl=ja&prev=search&rurl=translate.google.co.jp&sl=en&sp=nmt4&u=https://developer.apple.com/reference/coregraphics/cgcontext&usg=ALkJrhjtW_txqmOM898xXnrMBvjvsk5AhA)

[Swift 3とCGContextDrawImage](https://translate.googleusercontent.com/translate_c?depth=1&hl=ja&prev=search&rurl=translate.google.co.jp&sl=en&sp=nmt4&u=http://stackoverflow.com/questions/39513979/swift-3-and-cgcontextdrawimage&usg=ALkJrhiLZtE9hRtKFJUUB0wCeRj34PLzYw)



[Swift3 で ‘CGContextDrawImage’ is unavailable: Use draw(_:in:)](http://off.tokyo/blog/2017/05/04/swift3-%E3%81%A7-cgcontextdrawimage-is-unavailable-use-draw_in/)
Pandasで現在時刻よりn分前の1分間のデータを得る

### こうしたい

現在時刻より3分前の1分間のデータを取得したい

現在時刻:2017-05-05 15:29:29

ほしい時刻:2017-05-05 15:26:00 ~ 2017-05-05 15:26:59

### こうした

```py3
import pandas as pd
from datetime import datetime
import pandas.tseries.offsets as offsets

now = pd.to_datetime(datetime.now()) #現在時刻を取得

begin = now.replace(second=0,microsecond=0)-offsets.Minute(3) #3分前の0秒
end   = now.replace(second=59,microsecond=0)-offsets.Minute(3) #3分前の59秒
```

あとは

```py3
df[(df['created_at'] > begin) & (df['created_at'] < end)]
```

これで任意の時刻の1分間のデータが得られる
[Mac]VirtualBoxをアンインストール


#流れ
1.dmgファイルをダウンロード
2.ダウンロードしたdmgファイルを開いて、アンインストールを実行

##1.dmgファイルをダウンロード
[こちら](https://www.virtualbox.org/wiki/Downloads)からOS X hostsのdmgファイルをダウンロードします。

##2.ダウンロードしたdmgファイルを開いて、アンインストールを実行
![VirtualBox_Uninstall.toolを実行します](https://qiita-image-store.s3.amazonaws.com/0/81546/64c1b8ed-c67c-a896-9a0f-d85ebc633161.png "1.png")

VirtualBox_Uninstall.toolを実行します。
![ターミナルが起動します](https://qiita-image-store.s3.amazonaws.com/0/81546/8044b169-7377-7cb4-6861-8e11c0f3b7da.png "スクリーンショット 2017-05-04 12.26.18.png")
VirtualBox_Uninstall.toolを実行するとターミナルが起動します。「Do you wish to uninstall VirtualBox (Yes/No)?」と聞かれますので「yes」とタイプします。
次にパスワードが聞かれますのでパスワードを入力してエンターを押します。

**以上で終了です！**
JavaでEclipseでGitHubでHerokuでハッピーになりたい時に最初にすること

#結論三行
結論からいうとここの手順どおりでいけました。英語。
（https://devcenter.heroku.com/articles/deploying-java-applications-to-heroku-from-eclipse-or-intellij-idea）

#いきさつ
せっかくのGWなので、趣味と勉強を兼ねて
なにか簡単なWEBサービスでも作ってみようかと思い立ちました。

言語やIDEは職場で慣れているJavaとEclipse。

アーキテクチャやインフラの知識はほとんど無いので
なんかイケてるとの噂のHerokuにおまかせしちゃおう、
HerokuならGitHub使うのがいいだろうな、

とそこまでは安易に決めてしまいました。

が、

けっこう躓いてしまったので注意点とか手順とか自分用にメモ。

#躓いたポイント

##Gitわからんと何もわからん！

`
リモートをローカルにプルして修正したあと
ステージにaddしてコミットしてからプッシュする
`
とかルー語にしか見えませんでした。
仕事で使ってるバージョン管理とぜんぜん違う。

頑張っていろはの「い」だけ覚えました。
ブランチとマージは後からゆっくり覚えます。。。

##mavenの知識も最低限要求される。

まず、mavenって何？ってところからでした・・・
mavenの基本を解説してくれてるサイト：
（http://www.techscore.com/tech/Java/ApacheJakarta/Maven/index/）


##順番が大事

最初は自分がわかっている順から疎通を試みましたが
これが大失敗でした。

まずEclipseでハローワールド作って
それをGitHubで作っておいたリポジトリに登録しようとしました。

とやったところで早速エラー。
Gitの知識がぜんぜんなく、なぜ怒られているか理解するのに
時間がかかりましたが、どうやら

##歴史が違う

ようです。

GitHub新規リポジトリ作成→ローカルにクローン→ローカルにEclipseでハロワ書き足す→そこからコミット・リモートへプッシュする

という手順か、

ローカルリポジトリをローカルで新規作成する→Eclipseで書き足す→GitHubで新規リポジトリをローカルから作成する

というような手順じゃないと、履歴の整合性が合わないのですね。
（うう、日本語にするとややこしい・・・・）

無事GitHubの連携までできたところで、
こんどはHerokuに、

```
No default language could be detected for this app. 
```

みたいな怒られ方しました。

HerokuはHerokuで必要なファイルをいろいろ持っていて、
それらが入っているリポジトリじゃないとPushできないんですね。

#最終的に

と、いうことで最初からやりなおし。最終的にはここの手順どおりでいけました。
（https://devcenter.heroku.com/articles/deploying-java-applications-to-heroku-from-eclipse-or-intellij-idea）

前提として

- maven,
- Heroku CommandLineTools,
- git,
- Eclipse Pleiades

が導入済みであること。

- まず、HerokuからJava、Eclipse用にまとまっているリポジトリをローカルにクローンする
- heroku createする
- Eclipseにインポートする
- mavenビルドする（失敗する場合は、pom.xmlにappNameを書き足す）
- GitHub新規リポジトリを作り、git push -u origin masterする。
- 最後にHeroku側でGitHub連携、Auto　Deployを有効にする

・・・

開発環境を整えるだけで３日かかってしまった・・・orz
Unity5.6 + GoogleVR1.4でDaydream Demoを動かすまで

# 概要
Daydreamの実機を貸してもらえたので、Demoを動かすまでの手順を残しておく

# 詳細
## 環境
- [Unity 5.6.0f3](https://unity3d.com/jp/unity/whats-new/unity-5.6.0)
- [Google VR SDK for Unity v1.4](https://github.com/googlevr/gvr-unity-sdk)

## 手順
GoogleVRのドキュメントやライブラリが充実してきたので、基本的に従うだけで大丈夫
https://developers.google.com/vr/unity/get-started

概要だけ軽く

- Unity開く、Project作成
- ダウンロードしてきたGoogleVRForUnity.unitypackageをimport
- GoogleVR/Demos/Scenesから[好きなDemo](https://developers.google.com/vr/unity/demos)選択
- BuildSettingsでVirtualRealityにチェック、Daydreamを選択、minSDKVerを7.0にする
![スクリーンショット 2017-05-04 11.53.31.png](https://qiita-image-store.s3.amazonaws.com/0/146318/f830b59a-4640-20a1-0a27-9bb49b975fbd.png)

- GvrControllerMainのEmulator Connection ModeをWIFIにする、これをしないとDaydreamのコンントローラーが認識されなかった（デフォルトはUSB）
![スクリーンショット 2017-05-04 11.54.38.png](https://qiita-image-store.s3.amazonaws.com/0/146318/78e8ceea-38b3-2cb2-dd32-06f3daa7a222.png)

- あとはDaydreamスマホ繋いで実行すればコントローラーも使えるし、VR的なこともできる

# まとめ
Unity 5.6以前を考えると非常に進化し、まとまってきた印象
開発が現実的になってきた
あとはDaydream端末とDaydreamViewが発売すれば全てオッケーだな！！！！

## 気になったこと
- 当たり前だがUnityのゲームViewではDaydream Controllerを使った操作ができない・・・できたら嬉しい
- Daydream Viewに入れたまま充電とかapk入れること可能で最高である<br>
しかし、DaydreamモードのままUSBさしてほっとくと凄まじい発熱をしていることがよくあるので注意

## 実際に開発する上で参考になるサイトなど
https://developers.google.com/vr/unity/guide
公式ドキュメント充実してきて頼りになる

https://github.com/googlevr/gvr-unity-sdk
ドキュメントがおかしかったらソースを読むのだ

https://plus.google.com/+googlevr
ソースを読んで理解できなかったらフォーラムに投げるのだ

https://github.com/oreilly-japan/unity-virtual-reality-projects-ja
貴重な日本語サイト、Unity Daydream Previewのころから、ずっと更新をされているので毎回お世話になっている

https://www.youtube.com/user/NurFACEGAMES
GoogleVRの新しいバージョンが出るたびに試してくれている人たち
mac（winも追加）のanaconda環境でpython2系、３系を両立して切り替えるメモ


python初心者なので、色々なライブラリが試したい。
ただ、何か変なことをしてしまって、環境の再構築に時間をかけるのもいやだ。
よって、色々やってもOS全体に影響を及ぼさない環境が欲しくて、色々探している。
※追記　Windowsも使うことになったので末尾に追記。

#セットアップ

##conda環境の構築
切り替え環境にはcondaを使う。
dockerは今度試す。
今回は同時にtensorflow環境も導入する。

macの環境を崩したくないので、
まず、anacondaの公式を以下からダウンロードし、インストール。
https://www.continuum.io/downloads

もちろん、
`$ bash Anaconda2-4.3.1-MacOSX-x86_64.sh`
でもいいし、minicondaなどの最小環境でも良いらしい。



##個別環境構築

さて、condaが入ったら、

`$ conda create -n py2tf python=2.7 anaconda`
`$ source activate py2tf`
上記のsource activateで環境に入ることができる。
環境に入ると(py2tf)等の文字が先頭に追加されて、判別ができる。

`(py2tf)$ conda install -c conda-forge tensorflow`
`(py2tf)$ source deactivate`

上記例では2.7環境に追加でtensorflowもインストールしている。
tensorflow以外にもcondaインストールに対応しているもの多数。
対応していなくてもpip等で追加インストール可能らしい（巻末リンク参照）
conda内でインストールしたものは、他の環境に影響しない。
（という認識）

続いて3.5系の構築
`$ conda create -n py3tf python=3.5 anaconda
$ source activate py3tf
(py3tf)$ conda install -c conda-forge tensorflow
(py3tf)$ source deactivate`

#使い方

環境に入る
`$ source activate py3tf`

環境から出る
`(py3tf)$ source deactivate`

作った環境の一覧
`$ conda info -e`

condaにある環境の検索
`$ conda search tenorflow`

condaのアップデート
`$ conda update conda`

環境内に導入済みパッケージの参照
`$ conda list`
環境内で実行すれば、その環境のパッケージ一覧。
環境外で実行すれば、mac自体に入ってるパッケージ一覧。
または、環境指定で実行
`$ conda list -n py3tf`

環境を削除
`conda remove -n py3tf --all`

condaでインストールしたライブラリを書き出し
そして、上記ファイルから環境を構築
`conda list --export > conda_requirements.txt
conda create -n my_new_env --file conda_requirements.txt`
以下の環境出力方式の方が主流？

環境の出力、出力したファイルから環境を構築
`conda env export > environment.yml
conda env create -f environment.yml`


以下の記事等を参考にさせていただきました。
https://gist.github.com/aphlysia/d5fcee79ff81b8272faf
http://qiita.com/icoxfog417/items/02a80b93b5f1e95f2795
http://qiita.com/yubessy/items/2dd43551aa8308dc7eca

---

**Windows10の場合**

AnacondaをWebサイトからダウンロードしインストールする。（実行ファイル形式）

pythonとcondaにPATHを通す。
ディフォルトだと以下のあたりにインストールされているはず。
'C:\Users\"user name"\Anaconda3'
'C:\Users\"user name"\Anaconda3\Scripts'

あとはMACの場合と同じ。
Flaskで Basic認証、Digest認証

Flask拡張である[Flask-HTTPAuth](https://flask-httpauth.readthedocs.io/en/latest/)を使うと、とても簡単に実現できます。

インストール

```bash
$ pip install flask-httpauth
```

## Basic認証

1. `from flask_httpauth import HTTPBasicAuth` する
2. `auth = HTTPBasicAuth()`で`auth`インスタンスをつくる
3. パスワードを確認する関数をつくる： `@auth.get_password`でデコレートする
4. 認証したい URLを `@auth.login_required`でデコレートする

```python:app.py
from flask import Flask
from flask_httpauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

users = {
    "john": "hello",
    "susan": "bye"
}

@auth.get_password
def get_pw(username):
    if username in users:
        return users.get(username)
    return None

@app.route('/')
@auth.login_required
def index():
    return "Hello, %s!" % auth.username()

if __name__ == '__main__':
    app.run()
```

## Digest認証

ユーザー名とパスワードを MD5でハッシュ化してからサーバーに送る。Basic認証で防げなかった盗聴や改竄への対策。

`HTTPBasicAuth` を `HTTPDigestAuth`に変えるだけ。

```python:app.py
from flask import Flask
from flask_httpauth import HTTPDigestAuth

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret key here'
auth = HTTPDigestAuth()

users = {
    "john": "hello",
    "susan": "bye"
}

@auth.get_password
def get_pw(username):
    if username in users:
        return users.get(username)
    return None

@app.route('/')
@auth.login_required
def index():
    return "Hello, %s!" % auth.username()

if __name__ == '__main__':
    app.run()
```

> ToDo: `pathlib`, `itsdangerous`について調べる
Railstutorial 4版　覚書 第６章

第３版をやった時も理解しづらかったので、ちょっと整理しました。

# メールアドレスの一意性

大文字と小文字が区別がない => **大文字小文字関係なく文字の順番が同じ**

```
"user@example.com" == "User@example.com" => true
                   == "user@example.Com" => true
                     ......
```
 =>　すべてを満たすには、下の表記で十分
```
"user@example.com" == "USER@EXAMPLE.COM" => true
```

そして、

モデルのバリデーションを大文字小文字の区別なしにする

```app/models/user.rb
uniqueness: { case_sensitive: false } # 大文字小文字の区別なし
```

---
# メールアドレスの一意性（データベース）

２度押しで同じデータがデータベースに保存されてしまうことがある。
=>データベースに同じデータを保存しないようにするには？

- emailの一意性の確保とバリデーション

```
self.email = email.downcase => true
```

「**バリデーションでの一意性の確保**」と「**検索に使いたいのでインデックス化ににする=>一意性**」を区別したらわかりやすかった。

- emailを検索するようになるためのインデックス化 =>一意性

emailをインデックス化したい
=>rails generate migration add_index_to_users_emailする

```db/migrate/[timestamp]_add_index_to_users_email.rb
    add_index :users, :email, unique: true #index化する
```

# migration addの種類

- インデックス化

```
rails generate migration add_index_to_users_email
```

```db/migrate/[timestamp]_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
  def change
    add_index :users, :email, unique: true
  end
end
```

- コラムの追加

```
rails generate migration add_password_digest_to_users password_digest:string
```

```db/migrate/[timestamp]_add_password_digest_to_users.rb
 class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :password_digest, :string
  end
end
```

# なぜかテストが失敗する

半角スペース６個でfaultになるはずなのだがなぜ？
取り敢えず先に進んで後で調べる。

```test/models/user_test.rb
test "password should be present (nonblank)" do
   @user.password = @user.password_confirmation = " " * 6
   assert_not @user.valid?
end
```


# 第3版をみたら理解できた


- 違うパスワードだと、false

```
user.authenticate("foobaz") # =>false
```

- 同じパスワードだと、オブジェクトを返す

```
user.authenticate("foobar")
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 20:36:46", updated_at: "2016-05-23 20:36:46",
password_digest: "$2a$10$xxucoRlMp06RLJSfWpZ8hO8Dt9AZXlGRi3usP3njQg3...">
```

> Userオブジェクトはnilでもfalseでもないので、いい感じに仕事をしてくれています。


なるほど、論理判定で使用するので

```
!!user.authenticate("foobar") #=> true
```
とするとよい。


## 演習6.3.4.2-3

```
password_digest以外のカラムの内容を変更する時は
```
user=User.find(1)
user.update_attribute(:name, "Yamada")

のようにする。
web開発をsafariでしてつまずいたことメモ

webアプリ開発をしているとchromeで動くのにsafariで動かない！なんてことがありましたのでそのメモ。

##remove関数には気をつける
ページ内で動的に記入欄を増やすボタンと減らすボタンを作った時につまずいた。

```hoge.html
<!DOCTYPE html> 
<html lang="ja"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript">
　　　　　　　　　　　　　　　　//記入欄を増やす
        function add()
        {
            var div_element = document.createElement("div");
            div_element.innerHTML = '<input type="text" name="text[]" size="50" value=""><br>';
            var parent_object = document.getElementById("hoge");
            parent_object.appendChild(div_element);
        }
        //記入欄を減らす
        function remove()
        {
            var parent_object = document.getElementById("hoge");
            parent_object.removeChild(parent_object.lastChild);
        }
        </script>
</head>
<body>
　　　　　　　　　　　　//ここにボタンを追加していく
      <div id="hoge">
      </div>
      <div>
      <button type="button" onclick="add();">テキスト追加！</button>
      <button type="button" onclick="remove();">テキスト削除！</button>
      </div>
</body>
</html>
```

##Date()関数にも気をつける

例えば、

```js

var date = new Date(yy+'-'+mm+'-'+dd);
```

で
yy=2017, mm=5, dd=2
とするとdateはNANでした。そこで
yy=2017, mm=05, dd=02
とすると正常に動作しました。ということで

```js

var targetDate = new Date(yy+'-'+("0"+mm).slice(-2)+'-'+("0"+dd).slice(-2));
```

とすることで解決。sliceメソッドは指定した範囲を切り出します。引数を負の値にすると文字列の最後からその数分数え、文字列の終わりまで切り出します。

##追記
別のPCで上記の修正なしでsafariで実行すると正常に動作しちゃいました。なんだったのか。
shellでTTL付きのキャッシュをしたい

# こんな感じ

`sleep 3 ; echo`の結果を最大5秒間キャッシュしている様子。

![cache-ttl-on-sh.gif](https://qiita-image-store.s3.amazonaws.com/0/280/48a2a249-cc43-3a5b-ab5a-511e6df326da.gif)

# キャッシュの実装

実装は[このあたり](https://github.com/petitviolet/dotfiles/blob/71e0102270dfb424f4204a4cedb36b3020ac81ee/_zshrc.alias#L327-L369)に置いてある。

TTL付きのキャッシュを実装するにあたり、シェルで実現するならファイルに保存しておいて、作成日時はそのファイルのメタ情報を利用すれば楽。  
また、やろうと思えば更新日時と作成日時がどちらも取れるので、細かいTTLの実装も可能。

`stat -c %Y`コマンドで指定したファイルの最終更新日時のepoch秒を取得できる。
それと現在時刻を比べて指定した時間より経過していたら...という処理を書くことでTTLを実装する。

`stat`を使ってファイルの有効期限判定するには以下のようにする。

```sh
$ touch -d '1day ago' hoge.txt
$ [ $(( $(date +%s) - $(stat -c %Y hoge.txt) )) -gt $((60 * 60 * 25)) ] && echo 'true' || echo 'false'
false
$ [ $(( $(date +%s) - $(stat -c %Y hoge.txt) )) -gt $((60 * 60 * 23)) ] && echo 'true' || echo 'false'
true
```

キャッシュを保存するファイルのパスとTTL、実行するコマンドを渡せるようにするとこんな感じになった。

```sh
# TTL的に無効かどうか
function is_too_old() {
  local file=$1
  local ttl=$2 # seconds
  if [ -f $file ]; then
    [ $(( $(date +%s) - $(stat -c %Y "$1") )) -gt $ttl ]
  else
    false
  fi
}

# TTLを考慮して読み出す
function read_from_cache() {
  local cache=$1
  local ttl=$2  # seconds
  local command=$3
  if $(is_too_old $cache $ttl);then
    local result=$(sh -c "$command")
    if [ -z $result ]; then
      return
    else
      echo $result > $cache
    fi
  fi
  cat $cache
}
```

ちなみにMacだとgnubinを入れる必要がある。
[テキスト処理のための標準的なコマンド群の OS X への導入手順 - Qiita](http://qiita.com/eumesy/items/3bb39fc783c8d4863c5f)

コードを読めばわかるが、例えば`gcloud projects list`の結果を1日キャッシュするには、

```sh
read_from_cache ./cache.txt $((60 * 60 * 24)) "gcloud projects list"
```

みたいにやれば良い。

# "読み込み中"の表示

昔書いた記事に大体ある。
[Zshで長い処理をしている間に読込中を表示する - Qiita](http://qiita.com/petitviolet/items/5cc1916eb3fdb8d54823)

loadingコマンドは[github](https://github.com/petitviolet/shell_commands/blob/dc6bbeaba0492a8dea44721972fa45211033ba1e/loading.sh)においてある。

読み込み中を表示するあたりの実装はこうなる。

```sh
# job制御を無効化してバックグラウンド実行しているプロセスのIDが表示されるのを防ぐ
set +m
# loadingをバックグラウンド実行して表示
loading 1000 &
local loading_pid=$!

# 何か重い処理をする
local result=$(sh -c "$command")

# loadingを消す
kill -INT $loading_pid &>/dev/null
# loadingがkillされるのを待つ
sleep 0.1
# job制御を有効に戻す
set -m
```

ジョブ制御を無効にしてプロセスIDが表示されてしまうのを防ぐのがポイント。

```sh
$ sleep 10000 &  # IDが表示される
[1] 89535
$ kill $!  # IDが表示される
[1]  + terminated  sleep 10000
$ set +m
$ sleep 10000 &  # IDが表示されない
$ kill $!  # IDが表示されない
$ set -m
```
Bashでfizzbuzz

# はじめに
Fizzbuzzくらい簡単に書けるだろうと思って始めたら無茶苦茶はまった。自分用メモ。

# 書いたもの

```bash:fizzbuzz
#!/bin/sh

# fizzbuzz problem
for ((i = 1; i <= 100; i++)) {
  if [ $(($i%15)) -eq 0 ]
  then
    echo 'fizzbuzz'
  elif [ $(($i%3)) -eq 0 ]
  then
    echo 'fizz'
  elif [ $(($i%5)) -eq 0 ]
  then
    echo 'buzz'
  else
    echo $i
  fi
}
```

# 覚えたこと
条件式は以下のように書く。
if [ 条件 ]
then
~~~
elif [ 条件 ]
then
~~~
else
~~~
fi

数式の評価は以下のように書く。
$((数式))

技術評論者のシェルスクリプト基本リファレンスには「移植性を考えてexprを使うこと」と記述があったが、どうもexprより$(())のほうが処理が早いらしいので。
Python print の内容が docker logs に見えない件について

下記のように `Dockerfile` があります

```Dockerfile
CMD ["python", "/app.py"]
```

`app.py` にこんな処理があります：

```python
print 'some log'
```

`docker run` で起動します：

```
docker run -d xxx
```

Logをみます：

```
docke logs -f yyy
```

なかなか期待の Log が出てきません。

調べたところ、Python による標準出力のバッファーのが原因だそうです。

バッファーをしなくて直ちに Log を見たい場合、 `python -u` でアプリを起動すればいいことです。

下記のように修正したら、 `docker logs` も無事に Log を見ることができました。

```Dockerfile
CMD ["python", "-u", "/app.py"]
```
python3標準のargparseとpython-fireを比較してみました

コマンドライン引数の管理モジュールのargparseとpython-fireをコード数と処理時間で比較してみました

#argparse
argparseをインポートする直前に現在時刻を取得して処理時間を計測します、`if __name__ == '__main__':`内のコードの量が多く、`say`を3回も繰り返して記述してありスマートではありません。

```
import time
start = time.time()
import argparse

def say():
    print(f"開始から{time.time()-start}秒経過")

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--say",action="store_true")
    args = parser.parse_args()
    if args.say:
        say()
```
これを実行以下のコマンドで実行します
`$python3 argparse_test.py --say`
出力は
`開始から0.01373600959777832秒経過`
処理速度は速いです

#python-fire
argparseに比べて`if __name__ == '__main__':`内のコード量はたったの一行です

```
import time
start = time.time()
import fire

def say():
    print(f"開始から{time.time()-start}秒経過")

if __name__ == '__main__':
    fire.Fire()
```
以下のコマンドで実行します
`python3 fire_test.py say`
出力は
`開始から0.7563726902008057秒経過`
python-fireの読み込みに0.7秒ぐらいかかっていますがシンプルです
create-elm-app

##create-elm-app

前、elm-webpack-starterを使っていると言う記事を書いたのだけど、最近は変わって今はcreate-elm-appを使っている、このツールとても良い。

[halfzebra/create-elm-app: Create Elm apps with zero configuration](https://github.com/halfzebra/create-elm-app)

create-elm-appは設定的なものを一つも書かずとも、Elm用プロジェクトを作ってくれるツール。（元ネタは[create-react-app](https://github.com/facebookincubator/create-react-app))

ElmやらJSやらHTMLやらwebpackやらホットリロードの設定を書くのは面倒くさい、ワンコマンドですべてやってくれないか。というツール。
中で使っている設定を出してもくれる。


###インストール。

```
npm install create-elm-app -g
```

###クイックスタート
create-elm-appでプロジェクトを作って移動して、elm-app startを行う。
ブラウザにアプリケーションが表示される。

```
npm install create-elm-app -g
create-elm-app my-app
cd my-app/
elm-app start
```

###create-elm-appで作られるプロジェクト

```
my-app/
  .gitignore
  README.md
  elm-package.json
  src/
    App.elm
    favicon.ico
    index.html
    index.js
    main.css
  tests/
    elm-package.json
    Main.elm
    Tests.elm
```

webpackを使っていたら何となく分かる構成。

作られるREADME.mdファイルに使い方が載っている。[create-elm-app/README.md](https://github.com/halfzebra/create-elm-app/blob/master/template/README.md)

プロジェクト内でnpmも使える。

```
npm init -y # Add package.json
npm install --save-dev pouchdb-browser # Install library from npm

// Use in your JS code
var PouchDB = require('pouchdb-browser');
var db = new PouchDB('mydb');
```

###使えるようになるコマンド

```
create-elm-app
elm-app build
elm-app start
elm-app test
elm-app eject
elm-app <elm-platform-comand>
```

elm-app startでブラウザでアプリケーションが立ち上がる。webpackのホットリロード。



##elm-app ejectで脱create-elm-app。設定が手に入る

elm-app ejectコマンドで、脱create-elm-appが出来る。

コマンドを実行すると、create-elm-app内部で使っているnpmやwebpackの設定などが書き出される。
プロジェクトにwebpackの設定をまとめたconfig、scriptsフォルダが作られる。elm-app startはnpm startに設定される。

なので、create-elm-app内で使っているwebpackの設定を変えたい、足したいと思ったら、ejectしてやっていくということが出来る。

##まとめ


Elm、JS、webpackのプロジェクトをワンコマンドで作れる。webpackの初期設定だけもらうというのも可能。ホットリロードは高速でとても良いです。
windowsでTensorFlow その10

#概要
windowsのTensorFlowの環境で、OpenAiやってみた。
新しい環境、作って見た。

写真
![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/e2090703-3182-f156-f363-e861c1d2d4b1.jpeg)


環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5
OpenAi Gym 0.5

#サンプルコード
落ちてくる果物を籠で受け取る。
フルーツバスケット

```
class FBEnvironment(core.Env):
	metadata = {
		'render.modes': ['human', 'rgb_array'],
		'video.frames_per_second' : 1
	}
	def __init__(self):
		self.viewer = None
		self.state = None
		self.action_space = spaces.Discrete(3)
		high = np.array([1.0, 1.0])
		self.observation_space = gym.spaces.Box(low = -high, high = high)
		self._seed()
		self.x = 0
		self.y = 0
		self.z = 2
	def _get_ob(self):
		ban = np.zeros((10, 10))
		ban[self.x, self.y] = 1
		ban[9, self.z - 1] = 1
		ban[9, self.z] = 1
		ban[9, self.z + 1] = 1
		return np.reshape(ban, (-1, 100))
	def _seed(self, seed = None):
		self.np_random, seed = seeding.np_random(seed)
		return [seed]
	def _terminal(self):
		a = False
		if (self.y == 9):
			if (abs(self.x - self.z) <= 1):
				a = False
			else:
				a = True
		return a
	def _reset(self):
		self.x = random.randrange(0, 9)
		self.y = 0
		self.z = 4
		return self._get_ob()
	def _step(self, action):
		assert self.action_space.contains(action), "%r (%s) invalid" % (action, type(action))
		if (action == 1):
			acton = -1
		elif (action == 2):
			acton = 1
		else:
			acton = 0
		self.z = min(max(1, self.z + acton), 8)
		self.y += 1
		terminal = self._terminal()
		reward = 0.0
		if (self.y == 9):
			if (abs(self.x - self.z) <= 1):
				reward = 1.0
				self.x = random.randrange(0, 9)
				self.y = 0
			else:
				reward = -1.0
		return (self._get_ob(), reward, terminal, {})
	def _render(self, mode = 'human', close = False):
		time.sleep(0.2)
		if close:
			if self.viewer is not None:
				self.viewer.close()
				self.viewer = None
			return
		from gym.envs.classic_control import rendering
		if self.viewer is None:
			self.viewer = rendering.Viewer(500, 500)
			self.viewer.set_bounds(-2.5, 2.5, -2.5, 2.5)
		x = -1.8 + self.x * 0.4
		y = 2.0 - self.y * 0.4
		z = -1.8 + self.z * 0.4
		transform0 = rendering.Transform(translation = (x, y))
		transform1 = rendering.Transform(translation = (z, -1.8))
		self.viewer.draw_circle(0.2, 20, color = (1, 1, 0)).add_attr(transform0)
		self.viewer.draw_line((-2.0, 2.0), (2.0, 2.0), color = (0, 0, 0))
		self.viewer.draw_line((-2.0, 2.0), (-2.0, -2.0), color = (0, 0, 0))
		self.viewer.draw_line((2.0, 2.0), (2.0, -2.0), color = (0, 0, 0))
		self.viewer.draw_line((-2.0, -2.0), (2.0, -2.0), color = (0, 0, 0))
		self.viewer.draw_polygon([(-0.6, -0.2), (0.6, -0.2), (0.6, 0.2), (-0.6, 0.2)], color = (0, 1, 0)).add_attr(transform1)
		return self.viewer.render(return_rgb_array = mode == 'rgb_array')
```
2ch.sc 公式 p2 の動作を Chrome 拡張で改造する (3)


## 概要

- p2 で不要なスレをスレ一覧から非表示にする機能を実装します。

### 前回

- [2ch.sc 公式 p2 の動作を Chrome 拡張で改造する (2) - Qiita](http://qiita.com/yousorojp/items/f8fe01827d5bd0cb7f69)

## スレッド一覧の改造

前回、ゴミ箱ボタンの押下時の動作を追加しました。ただ、押下した情報を保存していないので、ページのリロードするとまだ全てのスレが表示されてしまいました。

今回、押下したスレの情報を Chrome 拡張で扱えるストレージに保存し、ページロード時に読み込みたいと思います。

### Chrome 拡張でのストレージについて

以下のページを参考にさせて頂きました。

ざっくりとは key/value で保存し、処理方法としては local/sync があるとのことです。

- [Chromeエクステンションを作ろう：ストレージ編 - Qiita](http://qiita.com/dhun/items/cf18e43cb0376fcff302)
- [chrome.storage を利用したchromeへのデータ保存 - Qiita](http://qiita.com/shimuta/items/e8835d6ce794ef6c73cf)

### storage パーミッションの追加

manifest.json を編集して、permissions 配列に "storage"  を追加します。

```
  ...
  
  "permissions": [
    "tabs",
    "http://*/*",
    "https://*/*",
    "storage"
  ],
  
  ...
```

### スレッド非表示ボタンクリック時のスレ情報の保存

storage というハッシュを用意し、key にスレッドID、value にスレのタイトルを設定したいと思います。

```
      $('#' + threadId).click(function() {
        storage[threadId] = title;
        
        chrome.storage.local.set(storage, function() {
          var tr = $(this).parent().parent(); // span > td > tr
          tr.hide();
        });
      });
```

### ページロード時のストレージの読み込み・スレ非表示

ページロード時にストレージを読み込み、key としてスレッドID が含まれていれば、そのスレは非表示にします。以下のようなイメージ。

```
  chrome.storage.local.get(function(storage) {
    ...
    
    if (threadId in storage) {
      tr.hide();
    }
    
    ...
  });
```

### 最終的なコード

上記の点以外にも、tr の値の持ち方などを多少変更しています。

```
'use strict';

$(function() {
  chrome.storage.local.get(function(storage) {
    $('tr:not(.tableheader)').each(function() {
      var tr    = $(this);
      var url   = tr.find('.tl>a:last, .tl2>a:last').attr('href');
      var title = tr.find('.tl>a:last, .tl2>a:last').text();

      if (typeof url !== 'undefined') {
        var result   = url.match(/&key=([^&]+)&/);
        var threadId = result[1];

        // ゴミ箱の表示追加
        tr.append('<td class="t"><span id=\'' + threadId + '\'>🗑</span></td>');

        if (threadId in storage) {
          tr.hide();

        } else {
          // ゴミ箱クリック時ハンドラ
          $('#' + threadId).click(function() {
            storage[threadId] = title;
            chrome.storage.local.set(storage, function() {
              tr.hide();
            });
          });
        }
      }
    });
  });
});

```

## まとめ

ということで、今回までの Chrome 拡張の実装で、以下を行いました。

- スレッド非表示ボタンの表示
- ボタン押下でその行のスレを非表示
- ボタン押下したスレ情報をストレージに保存
- ページロード時にストレージを読み込み、すでに非表示ボタンが押されているスレは非表示

今後、さらに Chrome 拡張の勉強として実装を追加するなら、設定ページから非表示済みスレを解除できるように、等が考えられますが、多分やらない。

これで読みたいスレを探すのがかなり快適になるはず。
2017-05-04 Python3 > Python3をremoveしたらUbuntuの機能もremoveされた

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

Python3.4をPython3.6にあげようとしていた。
そのままではupdateがうまく行かず、「とりあえずPython 3.4をremoveしてから3.6をインストールしよう」と考えてしまった。

`sudo apt-get remove python3`を実行したところ、依存関係でUbuntuのGUI関連も一緒にremoveされていく様子が見られた。

時すでに遅し (That ship has sailed)。

Ubuntuを再起動したところ、メニュー表示がない状態になった。Ctrl+Alt+Tでターミナルも起動しない。

Python3をremoveしたら依存するパッケージも消えるとの記載は以下で見つけた。
https://askubuntu.com/questions/390440/i-want-to-uninstall-python3-and-just-use-2-7

Ubuntu 16.04 + TensorFlow 1.0に移るかどうか。

<hr>
(追記 2017/05/07)
ストックした記事を整理していたら、以下を見つけました。 
良い子はPythonをremoveしないように。

[CentOS で yum remove pythonをしたら詰みました。](http://qiita.com/pugiemonn/items/6b20b2e4b15ca34e8c3e)
Python3 > pipのインストール / numpyのインストール

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

http://stackoverflow.com/questions/17443354/install-numpy-on-python3-3-install-pip-for-python3
> python3.4 -m pip install numpy

上記を試そうとしたが、python3用のpipはインストールされていないとなった。

以下でPython 3用のpipをインストールできた。

```
$ sudo apt-get install python3-pip
```

以下でPython 3用のnumpyをインストールできた。

```
$ python3 -m pip install numpy
```
技術英語 > Your way of keeping track of time [is flawed]

http://stackoverflow.com/questions/15687523/dispatchertimer-for-displaying-seconds

> Your way of keeping track of time **is flawed**. 

https://www.merriam-webster.com/dictionary/flaw
>  to become defective

意訳「あなたの時間の追跡方法には不備がある。」

flawはVoyagerにて7of9が時々使っていた。

> You're incrementing a counter each time the timer ticks, but there's no guarantee your timer will execute every 100 ms. And even if it did, you'd have to take into account the execution time of your code. Therefore, no matter what you do, your counter will drift.

意訳「100msecごとに実行する保証はない。100msecごとに実行されたとしても、コード実行時間を検討する必要がある。そのため、何をしようと、カウンタはドリフトするだろう。」
JSのコードの自動整形に Prettier が便利だったので、eslint とAtomから使えるように設定した

https://github.com/prettier/prettier

vjeux先生謹製のコード整形ツール。Reactでも使われてる。
gofmt やあのへんを目指してるっぽい。

## eslint で使う

この辺

```
yarn add eslint babel-eslint prettier eslint-plugin-prettier eslint-config-prettier -D
```

自分はStandard派だったので、シングルクオート、ノーセミコロンにした。opinionated なフォーマッタにオプション付けるのはどうなの？という気持ちはありつつ、セミコロンを見たくないという気持ちが勝った。

```yaml:.eslintrc.yml
parser: babel-eslint
plugins:
  - prettier
extends:
  - prettier
  - prettier/flowtype
  - prettier/react
rules:
  prettier/prettier:
    - 2
    -
      trailingComma: none
      singleQuote: true
      semi: false
```

`yarn eslint -- src --fix` などして既存のコードに適用した。

## atom

```
apm install atom-prettier
```

ここでもシングルクオート、セミコロンを消す設定をしつつ、プラグインの設定画面からローカルのeslintを見るようにした。ファイル保存時に自動で走るようにした。


自分の設定全体はこちら

https://github.com/mizchi/eslint-config-mizchi/blob/master/.eslintrc.yml
Proxyサーバ Squid3 を Webmin から管理する


# 目的
* ProxyサーバのSquid3の設定フィアル /etc/squid/squid.conf は設定項目が多いので、設定項目把握と設定ミス防止のためにGUIで設定したい
* このため Webmin をインストールし、Squid3を設定できるようにする

# 環境
* Ubuntu 16.04

# 参考
* [Webmin インストール](https://www.server-world.info/query?os=Ubuntu_16.04&p=webmin)
* [Configure a Squid proxy server through Webmin](http://www.techrepublic.com/blog/smb-technologist/configure-a-squid-proxy-server-through-webmin/)

# 作業
## 1. Squid3 をインストール
```bash:squid3-installer.sh
#!/bin/bash
set -e
sudo apt-get update

# squid3 のインストール
sudo apt-get install -y squid3
# キャッシュディレクトリを有効化
sudo sed -i -e "s/^#cache_dir\ ufs/cache_dir\ ufs/g" /etc/squid/squid.conf
# 再起動して設定を反映 
sudo /etc/init.d/squid restart
```

```bash
$ ./squid3-installer.sh
```

## 2. Webmin のインストール
```bash:webmin-installer.sh
#!/bin/bash
set -e
sudo apt-get update

# 依存パッケージのインストール
sudo apt-get -y install python apt-show-versions \
	libapt-pkg-perl libauthen-pam-perl libio-pty-perl libnet-ssleay-perl

# webminのdebパッケージ取得
URL="http://www.webmin.com/download/deb/webmin-current.deb"
curl -L -O "$URL" 

# webminインストール
deb_file=`basename "$URL"`
sudo dpkg -i "$deb_file"

rm -f "$deb_file"

# 他のホストからのアクセスを許可
#network="10.0.2.0/24"
#sudo bash -c "echo \"allow=$network\" >> /etc/webmin/miniserv.conf"
#sudo /etc/init.d/webmin restart
```

```bash
$ ./webmin-installer.sh
```

## 3. Webminの設定

* https://localhost:10000 にアクセス
* sudoのできるユーザでログイン
* 「Un-used Modules」→「Squid Proxy Server」にアクセス
* 「The Squid config file /etc/squid3/squid.conf does not exist. … 」のようなエラーが表示されるが、これはパスが　squid3 ではなく squid だから
    * 「module configuration」→「Full path to squid config file」項目を修正→「Save」
* 「Servers」→「Squid Proxy Server」にアクセス