OmniAICreator/Qiita-1.07M huggingface dataset:
Wayland


今流行りの Wayland について、基本的な事が分かってなかったので調べてみた。

特徴
----

Wayland とは、X11 の置き換えになるプロジェクト。各アプリケーションからの画面表示依頼を合成して一つの画面にまとめる。[Wayland Architecture](https://wayland.freedesktop.org/architecture.html) によると、特徴はこんな感じ。

* X11 では Compositor (Window Manager の事?) に実際の合成を移譲していたが、Wayland 自身が Compositor 相当の機能も担当する。
* X11 ではクライアントが描画コマンドを X サーバに投げて X サーバが描画していたが、Wayland ではクライアントが描画を行う。
* Weston とは、Wayland を使った単純な Window Manager。

疑問

* Wayland が X11 の置き換えというよりは、X11 そもそも無くなってしまって Gnome や Enlightenment 等の各 Window Manager が Wayland ライブラリを使って画面の制御を行うという事なのかな?
* 普通のアプリ開発者は Gtk 等のツールキットを使うので、あまり意識しなくても良い?

Ubuntu 16 で試す
---------------

インストール

    $ apt install weston

使い方

* 既存の Unity (X11) の上に新しい Weston の画面を開く
    
        $ weston
    
* Weston を全画面で使う 1
    * 一旦 Unity からログアウトする。
    * ログイン画面で Unity アイコンを押すと Select desktop environment メニューが出るので Weston を選択。
    * 抜ける時は alt + ctrl + Delete
* Weston を全画面で使う 2
    * alt+ctrl+F1 でバーチャルコンソール
        $ weston-launch
    * 抜ける時は alt + ctrl + Delete

XWayland で X のアプリを Wayland 上で動かす
----------------------------------------

https://wiki.archlinuxjp.org/index.php/Wayland#XWayland によると .config/weston.ini の編集で動くらしいが動かなかった。

また、バーチャルコンソールから `weston-launch -- --modules=xwayland.so` はエラーになった。


参考
----

* Waylandプログラミング入門: http://d.hatena.ne.jp/devm33/20140422/1398182440
* Wayland の Client と Compositor の概念を理解する: http://qiita.com/naohikowatanabe/items/06a8b988b89b4b1ec899
AWS CLIとAWS Tools for Windows PowerShellで既定のプロファイルを共有する

確認したVersion: AWS Tools for Windows PowerShell Version 3.3.86.0

---
- Initialize-AWSDefaultsを使わない
- *%USERPROFILE%\AppData\Local\AWSToolkit\RegisteredAccounts.json*があったら削除する
- *%USERPROFILE%\.aws\credentials*に`[default]`のプロファイルを書く

## .aws\credentials
```ini
[default]
role_arn=arn:aws:iam::000000:role/aws-cross-account-role
source_profile=base
region=ap-northeast-1

[base]
aws_access_key=AAAAAA
aws_secret_access_key=AAAAAA
region=ap-northeast-1
```

## AWS Tools for Windows PowerShell
毎回のセッションごとに読み込みが必要。
`Set-AWSCredentials`では`ProfileName`は指定しないとcredentialsファイルを読んでくれない。
*%USERPROFILE%\AppData\Local\AWSToolkit\RegisteredAccounts.json*があると*.aws\credentials*は指定しないと読み込まなくなる。`Initialize-AWSDefaults`を実行すると*RegisteredAccounts.json*が作られてしまう。

```ps1
Set-DefaultAWSRegion
Set-AWSCredentials -ProfileName default

$StoredAWSRegion
$StoredAWSCredentials
```

## AWS CLI
*%USERPROFILE%\.aws\credentials*の`[default]`を自動で読み込む。
AWS CLIのリファレンスにはregionは`.aws\config`ファイルに書けとあるけど、`credentials`ファイルに書いてあれば読み込まれる。
Amazon Elasticsearch Service へ Embulk を使ってデータロード

# はじめに
AWS ElasticSearch Serviceはフルマネージドで運用要らず、今のところ(2017/5/18)他の追随を許さ無い魅力があります(筆者はElastic社のElastic Cloudは使った事がありません)
Azureの場合、MarketPlaceから[Elastic-Stack](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/elastic.elasticsearch?tab=Overview)が提供されて完全占有クラスターが自動構築可能です。GCPも[blog](https://cloud-ja.googleblog.com/2015/02/gcp-elasticsearch-click-to-deploy.html)にある通り、Azureとほぼ同じ。完全占有クラスターのメリット？がありそうな反面、ElasticClusterの運用/管理がtrade-offとしてつきまといます。

当初はAzureで個別クラスターを使っていましたがトラブルが続き、運用などはしたく無いのでAWSに浮気してみましたのでその記録とTipsをまとめます

## 環境
* 既存の物を使い回しでAzureのVMにembulkインストール、データロード等の制御に使います
* データは Azure Blobに保存
* **AWS ElasticSearch Service (ver5.1が選択できたのでこれ)**
* 図解
![Load](https://raw.githubusercontent.com/fabregas4you/embulk_AWS_ElasticSearch/master/qiita_awses.png)

## セットアップ
* AzureVMへembulkのセットアップはこのあたりを[参考](http://qiita.com/y-ken/items/31890f4f188321cb88a7)に
* AWS ElasticSearch Serviceは本家の[資料](http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html)を参考に
 * APIを使って投げ込む事を想定している為、embulkが稼働するNodeからの[アクセス制御](http://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-createupdatedomains.html)を掛けておきます 
* embulk plugins
 * [embulk-input-azure_blob_storag](https://github.com/embulk/embulk-input-azure_blob_storage)
 * [embulk-output-elasticsearch_using_url](https://github.com/ymurata/embulk-output-elasticsearch_using_url)
 * こちらの[記事](http://qiita.com/hiroysato/items/ee1f7f334a322f5a6a13)にある通り、Tresure Data mugaさん謹製の[plugin](https://github.com/muga/embulk-output-elasticsearch)ではAWS ElasticSearch Serviceをサポートしていないので、embulk-output-elasticsearch_using_url を使います
 
## 実行
以下の手順で実施

 * BlobにElasticSearchに投入したいログをUploadしておく
 * embulkから吸い出し、ElasticSearch Serviceへ投げ込み用のconfig.yml作成

```
in:
  type: azure_blob_storage
  account_name: <BLOB NAME>
  account_key: <BLOB KEY>
  container: <CONTAINER NAME>
  path_prefix: <PREFIX as you like>
  decoders:
    - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: jsonl
    schema:

out:
  type: elasticsearch_using_url
  mode: normal
  nodes:
    - url: "<YOUR ElasticSearch Domain>.us-east-2.es.amazonaws.com:80"
  index: "sample"
  index_type: "sample"
```
 * 実行
 
```
$ embulk preview config.yml
$ embulk run config.yml -l warn -r resume_state_aws.yml &>> embulk_awses.log
```
## 確認
* AWS consoleで確認
![Load OK](https://raw.githubusercontent.com/fabregas4you/embulk_AWS_ElasticSearch/master/aws_es_dashboard_2.png)

## まとめ
- ElasticSearchへの大量のデータロードにはembulkは最適な手段
- AWS ElasticSearch Serviceでは 9200 portが使えない為、embulk pluginの選択に注意、http経由で実施するのがおすすめ

## 余談
- およその費用比較

| | AWS | Azure | GCP |
|:-----------|:-----------|:------------|:------------:|
|費用|    \$250 - $300 程度   | \$530    |     未確認 |

 - VirtulMachineのサイズ、データ量は1TB程度
   - AWS
     - EC2: t2.midium x3 , \$150
     - EBS: 1TB, \$100
     - データ通信料
   - Azure
     - VM: D2v2 , \$84.82 x6 =　$505.44
       - Elastic-Stack構築時、VMサイズを選択可能だが、D1v2(default)では使い物にならなかった 
     - Blob: 1TB , \$24
     - データ通信料
   - GCP
     - 未検証
androidでTensorFlow その3

#概要
androidでtensorflowやってみた。
api17でtensorflowアプリ作って見た。
101から128までの偶数、奇数を学習して、1から99を推定する。
学習は、windowsで。

#写真
![device-2017-05-19-101721.png](https://qiita-image-store.s3.amazonaws.com/0/18104/3da8d2d6-509f-c6f1-4e89-6896f98c72b4.png)





#環境
windows 7
ADT v22.6
android 4.2.2 api17

#ダウンロード
libtensorflow_inference.so
tensorflow java
githubから、以上を落とす。

#プロジェクトに配置
libtensorflow_inference.so
libsに置く
tensorflow java
srcに置く

#tensorflowで学習する。(windowsで実行)
inputは、{0,0,0,0,0,1,1}の形で101から128。
分類は、{0,1}と{1,0}
inputに、inputとnameつける。
predictに、outputとnameつける。
20回も、学習したらロス1.0になった。
```
0 0.518518518519
10 0.518518518519
20 1.0
```
tf.train.write_graphでモデルデータを保存する。
odd.pd（たった1kb）

#tensorflowで確認する。(windowsで実行)
tf.import_graph_defでモデルデータ読み込む。
inputに、1から99まで、食わせて、outputをoddとevenで表示。

```
['  1:odd ' '  2:even' '  3:odd ' '  4:even' '  5:odd ' '  6:even'
 '  7:odd ' '  8:even' '  9:odd ' ' 10:even' ' 11:odd ' ' 12:even'
 ' 13:odd ' ' 14:even' ' 15:odd ' ' 16:even' ' 17:odd ' ' 18:even'
 ' 19:odd ' ' 20:even' ' 21:odd ' ' 22:even' ' 23:odd ' ' 24:even'
 ' 25:odd ' ' 26:even' ' 27:odd ' ' 28:even' ' 29:odd ' ' 30:even'
 ' 31:odd ' ' 32:even' ' 33:odd ' ' 34:even' ' 35:odd ' ' 36:even'
 ' 37:odd ' ' 38:even' ' 39:odd ' ' 40:even' ' 41:odd ' ' 42:even'
 ' 43:odd ' ' 44:even' ' 45:odd ' ' 46:even' ' 47:odd ' ' 48:even'
 ' 49:odd ' ' 50:even' ' 51:odd ' ' 52:even' ' 53:odd ' ' 54:even'
 ' 55:odd ' ' 56:even' ' 57:odd ' ' 58:even' ' 59:odd ' ' 60:even'
 ' 61:odd ' ' 62:even' ' 63:odd ' ' 64:even' ' 65:odd ' ' 66:even'
 ' 67:odd ' ' 68:even' ' 69:odd ' ' 70:even' ' 71:odd ' ' 72:even'
 ' 73:odd ' ' 74:even' ' 75:odd ' ' 76:even' ' 77:odd ' ' 78:even'
 ' 79:odd ' ' 80:even' ' 81:odd ' ' 82:even' ' 83:odd ' ' 84:even'
 ' 85:odd ' ' 86:even' ' 87:odd ' ' 88:even' ' 89:odd ' ' 90:even'
 ' 91:odd ' ' 92:even' ' 93:odd ' ' 94:even' ' 95:odd ' ' 96:even'
 ' 97:odd ' ' 98:even' ' 99:odd ' '100:even']
```

#androidで実行。
assetsに、odd.pdを置く。
odd.pdをtensorflowに読み込む。
input:0に、1から99まで、食わせて、output:0をoddとevenで表示。
output:0が、INT64とでたので、byte[]で読み込んで解釈した。

inputの部分

```
public static float[] toary(int x) {
    float [] a = {0, 0, 0, 0, 0, 0, 0};
    int i;
    for (i = 0; i < 7; i++)
    {
        if (x % 2 == 1)
        {
            a[i] = 1;
        }
        x = x >> 1;
    }
    return a;
}
```


以上
RailsでOrder狙いの複合インデックスを貼る

表題の通り。

ググっても日本語の情報は出てこなかったので、メモとして残しておく。

ちなみに普通にドキュメントに載ってた。

```ruby
add_index(:accounts, [:branch_id, :party_id, :surname], order: {branch_id: :desc, party_id: :asc})
```

## 参考URL
https://apidock.com/rails/v4.2.7/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index



## あとがき
MySQLで使いたかったのに、MySQLで使えないらしい。

>Note: MySQL doesn’t yet support index order (it accepts the syntax but ignores it).
CentOS7 備忘録 yum updateがミラーを探していますで進まない

自分の勉強のため
VirtualBox環境下でCentOS7いじってる際の
困ったことをメモしていく。

https://teratail.com/questions/44380

こちらの参考サイトに
プロキシ設定がある場合のyumの操作に関する記述があり
助かった。

```
env http_proxy=http://プロキシのアドレス：ポート　yum -y update
```

yumってそんな指定もできるのね。
html/templateで自作の関数を利用する

#はじめに

html/template で日付を表示してみた。

```html
<div>{{.Date.Month}}月{{.Date.Day}}日</div>
```

ブラウザで見てみると

```
May月18日
```
メイ！！！！

goのコードならば `int(Date.Month())` としてあげれば数字に変換されるのだけど、テンプレートでキャストする方法がわからなかったので自作の関数をテンプレートで使えるようにしてみました。そしたら結構ハマりました。

# 自作の関数を利用する方法

まず正解を書いてしまいます。こんなコードで自作した `month2int()` をテンプレートから呼び出せます。

```go:hoge.go
func month2int(m time.Month) int {
	return int(m)
}

func handler(w http.ResponseWriter, r *http.Request) {
	type Param struct {
		Date	time.Time
	}
	param := Param{Date:time.Now()}

	files := []string{"template/index.html"}
	tname := filepath.Base(files[0])
	f := template.FuncMap{
		"month2int": month2int,
	}
	tpl, _ := template.New(tname).Funcs(f).ParseFiles(files...)
	if err := tpl.Execute(w, param); err != nil {
		log.Println(err)
	}
}
```

```html:index.html
<div class="date">{{.Date.Month | month2int}}月{{.Date.Day}}日</div>
```
`template.ParseFiles()` でテンプレートファイルを読み込むと思いますが、関数を登録するには `template.New()` を使う必要があります。かつ `New()` の引数には最初のファイルパスのファイル名だけを与える必要があります。それをしないと、、、

```
template: "" is an incomplete or empty template
```

というエラーが出てしまいます。

おしまい。

#参考にした記事

[template Funcs and ParseFiles](https://groups.google.com/d/msg/golang-nuts/DVTASq_-ngY/ss1HHExXe6sJ)
PythonのWebスクレイピングでProxy設定のため応答がなかったときの対処

# Pythonでスクレイピングで必要なWeb情報を自動抽出するプログラムを作成しようとしたときにエラーではまってしまったときの対処を備忘録として残しておきます。
PythonのurllibとBeautifulsoupによりWebスクレイピングプログラムを作ろうとしていました。
しかし、最初のurllib.request.urlopen(...)による応答が得られないエラー(以下のようなメッセージが表示される)が発生しました。
*「一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。」*

調べているとProxyサーバーの存在により、通信が確立されていないようです。
ProxyはInternet Explorerで以下のようになっていました。

- [ツール]->[インターネットオプション]->[接続]->[LANの設定]

- [x] 自動構成スクリプトを使用する

自動構成スクリプトは、 http://proxy.-----.co.jp/proxy.pacとなっていました。
　(-----は実際のものでなく、伏字にしています。)

urlopenする前に、urllib.requestに対して、ProxyHandlerを用意して、build_openerに設定し、build_openerをインストールするという手順を入れると解決しました。

サンプルコードは以下になります。

```python:scrapetest.py
import urllib.request
proxies ={'http':'http://proxy.-----.co.jp/proxy.pac'}
proxy_handler = urllib.request.ProxyHandler(proxies)
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
html = urllib.request.urelopen("http://wwww.pythonscraping.com/pages/page1.html")
print(html.read())
```
開発環境は、WindowsでAnacondaによるPython3.5.2です。

Webスクレイピングのプログラミングについては、下の本で学習します。
　[PythonによるWebスクレイピング(オライリー社)](https://www.oreilly.co.jp/books/9784873117614/)
【Salesforce:Trailhead】 複数形の表示ラベルの設定が表示されないときの対処法

現在、Salesforceの勉強をしており、[Trailhead](https://trailhead.salesforce.com/ja)という学習サイトを利用しています。

![ 2017-05-19 9.59.40.png](https://qiita-image-store.s3.amazonaws.com/0/155802/213304c0-4713-f906-ea36-ebecfd7da4bb.png)


そこで、ハマったところを下記サイトにてまとめております。


http://dev.classmethod.jp/?p=258780&preview=true
Ruby の Method#=== が定義されていないのでつらい問題

[ブログ記事](http://secret-garden.hatenablog.com/entry/2017/05/17/144924)からの転載です。
`Method#===` が定義されていなくてつらい問題です。

## `Proc#===`

`Proc` オブジェクトでは `#call` で評価することが出来ますが、そのエイリアスとして `#===` が存在します。

```ruby
upcase = proc { |a| a.upcase }
upcase.call "homu"
# => "HOMU"
upcase === "mami"
# => "MAMI"
```

これは次のように `when` で使用出来るようにするためです。

```ruby
def sign n
	case n
	when proc { |n| 0 < n }
		1
	when proc { |n| 0 > n }
		-1
	else
		0
	end
end

sign -4  # => -1
sign 0   # => 0
sign 7   # => 1
```

ここで、Ruby に精通してる人なら気づくと思いますが、`#method` を使って `proc { |n| 0 < n }` を `0.method(:<)` と書き直したくなります。

```ruby
def sign n
	case n
	# #method はレシーバのメソッドをブロックオブジェクトとして返す
	when 0.method(:<)
		1
	when 0.method(:>)
		-1
	else
		0
	end
end
```

しかし、これは上手く動作しません。  
なぜなら `#method` が返す `Method` クラスでは `#===` が定義されていないからです。

## `Method#===` を定義する gem をつくった

と、いうことで `Method#===` を使うことが出来る gem をつくりました。

```
$ gem install procedureable_method
```

で、インストールすることが出来ます。


## 使い方

使い方は

```ruby
require "procedureable_method"
using ProcedureableMethod
```

という風に refinements として使用するか

```ruby
require "procedureable_method/core_ext"
```

として直接モンキーパッチを適用されるかします。  
これで `Method#===` を使用する事が出来ます。

```ruby
require "procedureable_method"

using ProcedureableMethod

def sign n
	case n
	when 0.method(:<)
		1
	when 0.method(:>)
		-1
	else
		0
	end
end

sign -4  # => -1
sign 0   # => 0
sign 7   # => 1
```

これで無事に `when` に `Method` を渡して評価する事が出来ました。  
関係ないですが `when` の場合はちゃんと refinements で定義したメソッドが呼ばれるんですね。  
本体にも `Method#===` が追加されてほしい。
iOS Storekit SandBox 覚え書き


## ■SandBoxテスターのAppleIDについて
１．別のアカウントでSandboxテスターに設定されているAppleIDは
　別のiTunesConnectのSandboxテスターとしては使えない

参考URL：http://tworks.hatenablog.jp/entry/2014/01/03/000000
<img width="320" alt="IMG_0879.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17904/3ba334be-4049-42f7-0f7e-6f9f7813af39.png">

２．１度SandBoxテスターから削除したAppleIDは２度と同じiTunesConnect内では登録できない（ハマった）
`月初　And 月末`


```
Model.where("created_at between ? and ?",
DateTime.now.prev_month.beginning_of_month,DateTime.now.prev_month.end_of_month).count
```

Railsでの日付操作でよく使うものまとめ
## 対象バージョン

- ruby 2.1.2
- Rails 4.2.1

## 現在日時の取得

```ruby
now = Time.current 
```

## N日前・N日後

```ruby
now = Time.current 

# 昨日
now.yesterday

# 翌日
now.tomorrow

# N日前,N日後
now.ago(3.days)
now.since(3.days)
```

## Nヶ月前・Nヶ月後

```ruby
now = Time.current 

# 前月
now.prev_month

# 翌月
now.next_month

# Nヶ月前,Nヶ月後
now.ago(3.month)
now.since(3.month)
```

## N年前・N年後

```ruby
now = Time.current 

# 前年
now.prev_year

# 翌年
now.next_year

# N年前,N年後
now.ago(3.years)
now.since(3.years)
```

## その他

```ruby
now = Time.current 

# 月初
now.beginning_of_month

# 月末
now.end_of_month

# 今週の最初
now.beginning_of_week

# 今週の末
now.end_of_week

# 先週の月曜日
now.prev_week(:monday)

# 翌週の月曜日
now.next_week(:monday)

```
[Android/Kotlin] もうすぐ来る Android Studio 3.0で Kotlin。

おとといAndroid Studio 3.0がダウンロード(Dev channel)できるようになりました。使ってみるとエミュレーターがもっと早くになり、色々改善かなったことを感じています。:angel:

今はLinkだけ、後で公式の一般チャンネルで公開になったら、設定する方法書きます。


[Android Studio 3.0 Canary 1](https://android-developers.googleblog.com/2017/05/android-studio-3-0-canary1.html)

[Android Announces Support for Kotlin](https://android-developers.googleblog.com/2017/05/android-announces-support-for-kotlin.html)

[Getting Started with Kotlin](https://www.youtube.com/watch?v=czKo-jPVweg)

[What's New in Android Development Tools (Google I/O '17)](https://www.youtube.com/watch?v=Hx_rwS1NTiI)
windowsでTensorFlow その19

#概要
windowsでTensorFlowやってみた。
inception/5hでdeep dreamアプリ作って見た。

#写真
![dd_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ae3ec964-5b97-fac6-858f-a9fdd8ae2273.jpeg)


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5

#ダウンロード
githubから、inception5h.zipを落とす。
tensorflow_inception_graph.pb
を、取り出す。

#参考
http://docs.fabo.io/tensorflow/model_mnist/tensorflow_deep_dream.html
MariaDB で、UDF (User-Defined Function) を使う

```c:msec.c
// ----------------------------------------------------------------------
//
//	msec.c
//
//						May/19/2017
// ----------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <mysql.h>

// ----------------------------------------------------------------------
my_bool msec_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
    return 0;
}

// ----------------------------------------------------------------------
void msec_deinit(UDF_INIT *initid __attribute__((unused)))
{
}

// ----------------------------------------------------------------------
char *msec(UDF_INIT *initid __attribute__((unused)),
    UDF_ARGS *args, char *result, unsigned long *length,
    char *is_null, char *error __attribute__((unused)))
{
    struct timeval tv;
    struct tm *tmptr = NULL;

    is_null = 0;

    gettimeofday(&tv, NULL);
    tmptr = localtime(&tv.tv_sec);

    if(args->arg_count > 0 && ! strcmp( args->args[0], "epoch")){
        sprintf(result, "Msec: %ld.%03ld",
            tv.tv_sec,
            tv.tv_usec / 1000);
    }
    else{
        sprintf(result, "Msec: %04d/%02d/%02d %02d:%02d:%02d:%03ld",
            tmptr->tm_year + 1900, tmptr->tm_mon + 1,
            tmptr->tm_mday, tmptr->tm_hour,
            tmptr->tm_min, tmptr->tm_sec,
            tv.tv_usec / 1000);
    }

    *length = strlen(result);

    return result;
}

// ----------------------------------------------------------------------
```
コンパイル

```bash
gcc -Wall -I/usr/include/mysql -shared -o msec.so -fPIC msec.c
```

MariaDB の再起動

```bash
sudo systemctl restart mysqld
```

使い方

```text
$ mysql -uroot
MariaDB [(none)]> create function msec returns string soname 'msec.so';
MariaDB [(none)]> select msec ();
+-------------------------------+
| msec ()                       |
+-------------------------------+
| Msec: 2017/05/19 07:42:50:744 |
+-------------------------------+
1 row in set (0.00 sec)
```
Mac | asciinemaでターミナルの操作動画を記録・再生・シェアする (コピペも出来る)

今日、 [Docker チュートリアル](https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional)をやっていたら気付いた。


この動画内の文字。。。ブラウザのテキスト検索に引っかかるぞ。

コピペも出来る！

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/611b8de2-cb09-6055-6dd9-11a0a5050a9b.png)

# シェルの入力を動画としてシェアできるサービスがあった

https://asciinema.org/

## 発音

アスキーネマ。

>How is it pronounced?
>[as-kee-nuh-muh].

[FAQ - asciinema](https://asciinema.org/docs/faq)

## インストール

`$ brew install asciinema`


## 録画開始

`$ asciinema rec`

(色々入力)

( exit か　`Ctrl-D` で終了 )

終わると自動的にURLが生成される。

`https://asciinema.org/a/c041ctmf8zaab5mq2c5ocx2lw`


## ファイルに記録する場合

`$ asciinema rec demo.json`

## ファイルから再生

`$ asciinema play demo.json`

- ちなみにあくまで再生だけで、実際に操作がおこなわれるわけではないっぽい
- たとえばデモの中でファイル作成処理があっても、ファイルは作成されない

## ファイルをアップロード

`$ asciinema upload demo.json`

## URLから再生

`$ asciinema play https://asciinema.org/a/b5gai4rnflh7r0kie01fx6lip.json`

グローバルなURLからでも、手元で再生できる。

上記はDockerチュートリアルのもの。
適当にHTMLソースから抜き出してきて .js 拡張子を取り除いた奴。

ドキュメントを上下にスクロールしながらやるより、かなり分りやすい感じがした。
(それに、コマンドの履歴からいつでも再生できる)

## アカウント登録

アカウントを登録すると、こんな風に録画したものをストックしていける。

**ログインしながら録画をアップロードすると、自動的に public になるっぽいので注意。**

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b387cba8-e04b-8d07-6ea1-29ea4116888e.png)

## 削除　

ログインしてWebから可能。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/ac89aa68-2d04-c5c2-c42c-49f70c46208f.png)


# ヒント

## 途中で入力に手間取ったら録画し直し？

録画時・再生時のどちらでも `-w` オプションで最大間隔秒数を指定できる。

2秒、3秒と何も出力されていない空白時間も、1秒に切り詰めてくれる。

なので特に気にしなくても良さそう。

## パスワードもレコーディングされるの？

されない。

- asciinemaは「目に見えるもの」しかレコーディングしない。
- キー入力をレコーディングしているわけではない。

> ### Does it record the passwords I type during recording?
>asciinema records only terminal output - everything that you can actually see in a terminal window. It doesn’t record input (keys pressed). Some applications turn off “echo mode” when asking for a password, and because the passwords are not visible they are not recorded. Some applications display star characters instead of real characters and asciinema records only “**”. However, some applications don’t have any precautions and the actual password is visible to the user, and thus recorded by asciinema.

### 試してみる

手元でパスワード入力操作を録画してみると、確かにjson にはこのように「表示された文字」と「表示間隔の秒数」だけが記録されているようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/2120cd91-4242-d48f-60a6-a2f66e35449a.png)



# 環境

- zsh 5.3.1 (x86_64-apple-darwin15.6.0)
- asciinema 1.4.0
- Mac OS 10.12.4










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Raspberry Piにdocker-composeを入れる

正直はまりました。

ただネットの海は素晴らしく、ひたすら泳いでたら素晴らしい先人がいらっしゃいました。

https://www.berthon.eu/2017/getting-docker-compose-on-raspberry-pi-arm-the-easy-way/

>(始まりの文) I really like docker-compose

素晴らしいですね。

## 導入

では上記サイトを参考にDocker Composeを入れていきます。
といっても特別に調整などは不要なので、ほとんどそのまま打てば問題ありません。  

まずはdocker-composeをcloneしてローカルへファイルを準備します。

```
$ git clone https://github.com/docker/compose.git
```

続いてARMへ対応するようにDockerfileの内容を置換していきます。  

```
$ cd compose
$ cp -i Dockerfile Dockerfile.armhf
$ sed -i -e 's/^FROM debian\:/FROM armhf\/debian:/' Dockerfile.armhf
$ sed -i -e 's/x86_64/armel/g' Dockerfile.armhf
```

ビルドして走らせます。
結構時間がかかります。  

```
$ docker build -t docker-compose:armhf -f Dockerfile.armhf .
$ docker run --rm --entrypoint="script/build/linux-entrypoint" -v $(pwd)/dist:/code/dist -v $(pwd)/.git:/code/.git "docker-compose:armhf"
```

dist以下ファイルをbinへ移動させ、コマンドで起動できるようにします。

```
$ ls -l dist/
$ sudo cp dist/docker-compose-Linux-armv7l /usr/local/bin/docker-compose
$ sudo chown root:root /usr/local/bin/docker-compose
$ sudo chmod 0755 /usr/local/bin/docker-compose
```

終了後、以下のようになれば成功です。

```
$ docker-compose version
docker-compose version 1.13.0dev, build ae2cc6b
docker-py version: 2.2.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
```
Vue.js + Wordpress REST API

WordpressのRESTからJSONを読み込んでリストを出力するまでが割とサクッとかけたので丸ごと貼り付け。
ajaxはaxios利用。

# html/css/js丸ごとコード

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Vue + WP-Rest</title>
  <style>
  .fade-enter-active, .fade-leave-active {
    transition: opacity .5s;
  }
  .fade-enter, .fade-leave-to{
    opacity: 0;
  }
  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.16.1/axios.js"></script>
  <script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <posts></posts>
  </div>
  <script>
    Vue.component('posts', {
      data: function(){
        return {
          page: null,
          posts: [],  // placeholder、リアクティブにするために必須とのこと。
        }
      },

      // watchだけで済ませてるのでマウント後でpage変更している。
      mounted: function(){
        this.page = 1;
      },

      // 非同期など複雑になってくる場合computedよりwatchの方が向いてるケースがあるとのこと。
      watch: {
        page: function(newpage){
          var _component = this;  // スマートじゃないやつ
          // axios利用
          axios.get(
            'http://exsample.com/wp-json/wp/v2/posts?page=' + _component.page,
            {sending: false}
          )
          .then(function(response){
            // 普通に$setすると追加せず全記事が置き換わる。
            _component.posts = _component.posts.concat(response.data);
            return this;
          });
        }
      },
      methods: {
        // リンククリックの処理
        onclick: function(e){
          console.log(e.title.rendered)
        },

        // 追加ローディングボタンクリック時の処理、page数を増やすだけ。
        // 全てロード仕切った場合はpageは増えるがpostsが増えないので
        // watchが動かず特にエラーもなく何も起きないがdisabled処理など別途必要。
        loadMore: function(){
          this.page++;
        }
      },
      // 追加時フェードさせるためにtransition-groupとcss用意
      template: [
        '<div>',
          '<transition-group name="fade" tag="ul">',
            '<li v-for="post in posts" v-bind:key="post.title.rendered">',
              '<a :href="post.slug" @click.prevent="onclick(post)">{{post.title.rendered}}</a>',
            '</li>',
          '</transition-group>',
          '<button @click="loadMore">load more</button>',
        '</div>'
      ].join('\n')
    });

    var vm = new Vue({
      el: '#app',
    })
  </script>
</body>
</html>
```

という具合にシンプルになりました。

# 表示結果

![スクリーンショット 2017-05-19 4.06.03.png](https://qiita-image-store.s3.amazonaws.com/0/45247/59c889e2-2cf0-5bee-e0c1-c324d4fe4765.png)
charでは0x0がNULL扱いされるのでunsigned charを使う

* 表題のコード

``` 
char str[] = {0x61, 0x62, 0x0 ,0x0 ,0x0 ,0x0 ,0x0 ,0x7a};
std::string s2(str);
cout << s2 << endl;

unsigned char u8[] = {0x61, 0x62, 0x0 ,0x0 ,0x0 ,0x0 ,0x0 ,0x7a};
std::string txt(u8,u8+8);
cout << txt << endl;
```

* 出力

```
ab
abz
```

## 評価コード全体
```
#include <iostream>
#include <sstream>
#include <bitset>
#include <string>
#include <climits>
using namespace std;


const char* hex_char_to_bin(char c)
{
    // TODO handle default / error
    switch(toupper(c))
    {
        case '0': return "0000";
        case '1': return "0001";
        case '2': return "0010";
        case '3': return "0011";
        case '4': return "0100";
        case '5': return "0101";
        case '6': return "0110";
        case '7': return "0111";
        case '8': return "1000";
        case '9': return "1001";
        case 'A': return "1010";
        case 'B': return "1011";
        case 'C': return "1100";
        case 'D': return "1101";
        case 'E': return "1110";
        case 'F': return "1111";
    }
}

std::string hex_str_to_bin_str(const std::string& hex)
{
    // TODO use a loop from <algorithm> or smth
    std::string bin;
    for(size_t i = 0; i != hex.length(); ++i)
       bin += hex_char_to_bin(hex[i]);
    return bin;
}

int main() {
    char c = 123;
    cout << hex << int(c) << endl;

    string s = "0x7b";
    stringstream ss;
    ss << hex << s;
    unsigned n;
    ss >> n;
    bitset<8> b(n);
    cout <<b.to_string() << endl;

    cout << hex_str_to_bin_str("7b") << endl;
    

    for(char c = 'a'; c <= 'z'; c++){
        std::bitset<sizeof(char) * CHAR_BIT> binary(c); //sizeof() returns bytes, not bits!
        std::cout << "Letter: " << c << "\t";
        std::cout << "Hex: " << std::hex << (int)c << "\t";
        std::cout << "Binary: " << binary << std::endl;
    }

    int x = 123;
     
    const char * xx = reinterpret_cast<const char*>(&x);
    cout << xx << endl;

    char str[] = {0x61, 0x62, 0x0 ,0x0 ,0x0 ,0x0 ,0x0 ,0x7a};
    std::string s2(str);
    cout << s2 << endl;

    unsigned char u8[] = {0x61, 0x62, 0x0 ,0x0 ,0x0 ,0x0 ,0x0 ,0x7a};
    std::string txt(u8,u8+8);
    cout << txt << endl;

    return 0;
}

```

## 評価コード出力
```
7b
01111011
01111011
Letter: a	Hex: 61	Binary: 01100001
Letter: b	Hex: 62	Binary: 01100010
Letter: c	Hex: 63	Binary: 01100011
Letter: d	Hex: 64	Binary: 01100100
Letter: e	Hex: 65	Binary: 01100101
Letter: f	Hex: 66	Binary: 01100110
Letter: g	Hex: 67	Binary: 01100111
Letter: h	Hex: 68	Binary: 01101000
Letter: i	Hex: 69	Binary: 01101001
Letter: j	Hex: 6a	Binary: 01101010
Letter: k	Hex: 6b	Binary: 01101011
Letter: l	Hex: 6c	Binary: 01101100
Letter: m	Hex: 6d	Binary: 01101101
Letter: n	Hex: 6e	Binary: 01101110
Letter: o	Hex: 6f	Binary: 01101111
Letter: p	Hex: 70	Binary: 01110000
Letter: q	Hex: 71	Binary: 01110001
Letter: r	Hex: 72	Binary: 01110010
Letter: s	Hex: 73	Binary: 01110011
Letter: t	Hex: 74	Binary: 01110100
Letter: u	Hex: 75	Binary: 01110101
Letter: v	Hex: 76	Binary: 01110110
Letter: w	Hex: 77	Binary: 01110111
Letter: x	Hex: 78	Binary: 01111000
Letter: y	Hex: 79	Binary: 01111001
Letter: z	Hex: 7a	Binary: 01111010
{
ab
abz
```
Using Machine Learning to Explore Neural Network Architecture

参考
https://research.googleblog.com/2017/05/using-machine-learning-to-explore.html?m=1

ニューラルネットモデル設計自動化に向けての論文が今年も出るのかな？

従来進化的アルゴリズムと強化学習アルゴリズムでモデルを生成してた

ハイパラの調整であればhyperoptやKerasに特化したhyperasなどで調整を多少自動化できる。
https://github.com/hyperopt/hyperopt
https://github.com/maxpumperla/hyperas

今回の手法はAutoMLと呼ぶらしい。
コントローラニューラルネットは、特定のタスクの品質について訓練され評価される「子」モデルアーキテクチャを提案。
そのフィードバックは、次のラウンドのために提案を改善する方法をコントローラに通知するために使用。
このプロセスを何千回も繰り返すことで、新しいアーキテクチャーの生成、テスト、そのフィードバックをコントローラに与えて学習。

<img width="678" alt="スクリーンショット 2017-05-19 2.38.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/fc77a41e-a20e-2f6f-9eb6-075937849e1a.png">

画像データセットと言語データセットのどちらでもうまくいったそうな。

<img width="689" alt="スクリーンショット 2017-05-19 2.41.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/5007f88c-f3b7-03ae-b713-0584a57073b4.png">

従来手法のneatで作られたモデルでも似たように一見どう言う意味があるのかわからない計算グラフになっていた。

モデルの調整も大変な作業ではあるけども、個人的には前処理用の自動化モデルを研究して欲しい。


#参考
https://arxiv.org/abs/1703.01041
https://arxiv.org/abs/1611.01578
ASP.NETのカレンダーコントロールで日付未選択の状態を判定

ASP.NETのカレンダーコントロールで日付が未選択かを判定するときは、NULLで判定すればよいと思いますが、NULL判定だと上手くいきません。

## 判定方法
未選択の場合はDateTimeの初期値が設定されているので、以下のように判定。
```if (Calendar1.SelectedDate.Date == DateTime.MinValue) {}
```

## 参考
[Calendar コントロール-msdn](https://msdn.microsoft.com/ja-jp/library/cc295478.aspx)
[Calendar.SelectedDate - Is selected?-ASP.NET Forums](https://forums.asp.net/t/1093698.aspx?Calendar+SelectedDate+Is+selected+)
Muticool パッケージのインスト-ルの際にでたエラーの対処

Stackoverflowのサイトを参照に(http://stackoverflow.com/questions/41975192/r-compilation-of-multicool-fails)

Makevarsのファイルを~/.R/　に作り、
CXXFLAGS = -diag-disable 308
を書き込み、Rを立ち上げ、install.packages("multitool")を実行した。


同様に、ksパッケージのインストールもMakevarsを作成し、
CXXFLAGS = -diag-disable 308

することによって、インストールが成功した。
rails consoleが動かなかった問題

手元のrailsプロジェクトでrails consoleが動作しなかったので、その対応メモ

# 問題

```bash
$ cd MyProj
$ bundle exec rails console
# ...反応しない
```

おかしい :thinking: 

# 調査と対応
プロセスコマンドでrails consoleを使っていない状態で何か別のプロセスが走っていないか調査

```bash
$ ps aux | grep rails

# 該当プロセスなし
```

ちょっと考えこんで、この状態で色々調べてみるとspringというプロセスがrails consoleを走らせた時に走っているらしい。

ってことで springのプロセスが走っているか確認

```bash
# railsのプロジェクトに移動して
$ bin/spring status

XXXXX spring server | MyProj | started 9 hours ago
```

何もしていないのにsprig のプロセスが起動しっぱなしだった。
原因を調べてみると、この MyProj に当たるプロジェクトを同名で、これより前に何度か作っては壊し、作っては壊しを続けていた。
そのため、rails consoleが動かないと気づいたプロジェクトの前のプロジェクト時にrails console走らせたプロセスがそのまま残ってしまっていたらしい... :sweat_smile: 

とりあえずこのプロセスをkillして改めて rails console したらうまくいきました。

同じ名前でプロジェクトを作ったり壊したりするときは気をつけよう。
NGNの経路情報再び

久々にNGNの経路情報を見ようとしたら、更新があった模様。

# 更新に気づいた理由
HGWのログに「経路情報取得ログ」というのがあり、

```
2017/05/17 23:41:49		OK		取得成功		2017/02/10 13:47:39
```

などと書かれていた。ん? 2月に更新あったの?
自動化しろですね…すいません。

# telnetで経路情報取得
[自分で前に書いた記事](http://qiita.com/air-gh/items/e9d68d593f00661c0a65)を見ながらやってみた。

```shell-session
$ telnet 2404:1a8:c020:3::10 49881
Trying 2404:1a8:c020:3::10...
```

反応無し。もしや?

# 経路情報サーバーのDNS

```shell-session
$ dig @2404:1a8:7f01:b::3 route-info.flets-east.jp aaaa
:
;; ANSWER SECTION:
route-info.flets-east.jp. 49263	IN	AAAA	2404:1a8:c023:3201::15
:
```

なんと、アドレスが変わっている。

# 再びtelnet

```shell-session
$ telnet 2404:1a8:c023:3201::15 49881
Trying 2404:1a8:c023:3201::15...
Connected to 2404:1a8:c023:3201::15.
Escape character is '^]'.
GET /v6/route-info HTTP/1.1
Host: route-info.flets-east.jp:49881
Accept: */*
Connection: close

HTTP/1.1 200 OK
Date: Thu, 18 May 2017 14:44:42 GMT
Content-Type: text/plain;charset=EUC-JP
Content-Length: 516
Connection: close

0000,2017/02/10 13:47:39
1111,2404:01a8:7e00:0000:0000:0000:0000:0000/40
1211,2404:01a8:0000:0000:0000:0000:0000:0000/32
1212,2001:0c90:0000:0000:0000:0000:0000:0000/33
1311,2408:0210:0000:0000:0000:0000:0000:0000/30
1411,2400:2410:0000:0000:0000:0000:0000:0000/30
1412,2409:0010:0000:0000:0000:0000:0000:0000/30
1413,240b:0010:0000:0000:0000:0000:0000:0000/30
1414,2404:7a80:0000:0000:0000:0000:0000:0000/30
1415,2405:6580:0000:0000:0000:0000:0000:0000/30
1416,2400:4050:0000:0000:0000:0000:0000:0000/30
Connection closed by foreign host.
```

`2014/01/17 16:24:31`から比べて、下の3つが追加になったっぽい。

# 蛇足
## NAT
今居る拠点のLAN内部では、NGNが配るprefixと別の、NGN内に到達できないprefixを使うため、NGN内のホストに到達するには、[MA-100](http://web116.jp/shop/netki/ma100/ma100_00.html)のようなNATが必要となる。
NATは、[SEIL/x86](https://www.seil.jp/product/seil-x86.html)で行っている。SEILの`nat6`コマンドには、`type ngn`と`type transparent`の[2種類](http://www.seil.jp/doc/index.html#fn/nat6/cmd/nat6.html)がある。
`type transparent`は、説明書には「SEILシリーズ独自方式」と書かれているが、挙動を見ると、prefixだけを付け替えているように見える。
`type ngn`の変換方式を調査しようと思って設定を`type ngn`に変更したら、自分の設定/バージョンにおいては、SEIL/x86がリセットを繰り返すようになってしまった。`type transparent`に戻したら、直ったっぽい。
[こちらの記事](http://ar.nyx.link/ipv6/ipv6.html)では、MA-100の変換後のprefixでない部分は、WAN側のインターフェースのアドレスとのこと。
当初、`type ngn`でないとNGN内のホストに到達しないのかと思ったが、そうではないようなので、とりあえず`type transparent`でいいかな。

## IPoE
~~ISPのIPoEを有効にしてVNEのprefixを使うようになったら、NGN内通信の遅延が3msくらい増えた気がする。~~
気のせい。遅延は今まで通り。増加は無線LANによる遅延だった模様。

# 参考文献
- [IIJのpdf資料](http://www.iij.ad.jp/company/development/tech/techweek/pdf/tw2011_08_ipv6_1.pdf)
- [非常に詳しく、一次資料へのリンクが豊富](http://lab.mitty.jp/trac/lab/wiki/TipAndDoc/network/ipv6/NGN)
- [経路情報自動取得ネタ](http://www.himmelst.mydns.jp/archives/682)
- [IPv6の現状](http://ar.nyx.link/ipv6/ipv6.html)
Android Studio 3.0でのプロジェクト作成時の変更点

# 概要

Google I/O 2017でKotlinがfirst-class languageとなる発表がありました。
そこで、Android Studio 3.0 Canary 1でプロジェクトを作成する際の以前との変化をまとめます。

# ロゴ

![スクリーンショット 2017-05-19 0.24.05.png](https://qiita-image-store.s3.amazonaws.com/0/110221/98677dfc-55f6-882e-33b2-a27398061b9c.png)

スプラッシュなどで表示されるロゴが新しくなってます。

# 新規プロジェクト作成ウィザード

![スクリーンショット 2017-05-18 23.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/110221/b3ec22b4-99a1-640c-c7b6-fa48a57c6dc5.png)

`Include Kotlin support`のチェックボックスが追加されています。

# IDE

![スクリーンショット 2017-05-19 0.26.29.png](https://qiita-image-store.s3.amazonaws.com/0/110221/a0a9e459-8859-2ab6-3dc5-a264aa56acb6.png)

~~IntelliJのベースがおそらく変わってますが、何かわからず・・~~
https://developer.android.com/studio/preview/features/index.html#core_ide_changes
`2017.1`ベースのようです。

# プロジェクトテンプレート

## `build.gradle`

<img width="771" alt="スクリーンショット 2017-05-19 0.33.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/110221/bd2aabcd-79d9-63ff-e6e0-2d46a551cb07.png">

[Google's Maven repository](https://developer.android.com/studio/build/dependencies.html#google-maven)が追加されています。
これは既存プロジェクトにも反映させたほうがいいでしょう。
`mavenCentral()`は不要なのでは・・

## `app/build.gradle`

<img width="771" alt="スクリーンショット 2017-05-19 0.33.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/110221/ab678f42-1679-59a3-60bf-efae21dfeb56.png">

Kotlin以外特に変化なし。
- `org.jetbrains.kotlin:kotlin-stdlib-jre7`になっているけど、~~`AutoClosable`~~`AutoCloseable`と`Throwable.addSuppressed`を使わなければ、API Level19未満でも問題ないのだろうか？
- `minSdkVersion 18`でも`org.jetbrains.kotlin:kotlin-stdlib-jre7`でした。
- [ソース](https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jre7/src/kotlin/AutoCloseable.kt#L33)見ると`inline`なので、`use`不用意に使うのはまずいのでは・・あとで検証
  - 検証したところやはり19未満では`AutoCloseable.use`で落ちます。
  - `minSdkVersion < 19`では`org.jetbrains.kotlin:kotlin-stdlib`にすべきです。

## `gradle/wrapper/gradle-wrapper.properties`

Android Gradle PluginがGradle 4.0に引き上げられたので`gradle-4.0-milestone-1`になっています。
[Migrate to the New Plugin](https://developer.android.com/studio/preview/features/new-android-plugin-migration.html)も公開されています。結構影響ありそうです。

## その他ソースなど

<img width="371" alt="スクリーンショット 2017-05-19 1.35.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/110221/b6bdcb12-c1cf-e566-e7fa-ceacdd80a421.png">

JavaのテンプレートをKotlin変換しただけのコードのようで、特に変化はなさそうです。
強いて言うならAndroi Oで追加される[Round Icon Resources](https://developer.android.com/about/versions/nougat/android-7.1.html#circular-icons)がデフォルトで追加されているくらいでした。

`src/main/java`じゃなくて`src/main/kotlin`にしてほしかったですが、Androidでは`kotlin`ディレクトリを作ってもソースディレクトリ認識されません。（Kotlinモジュールでは認識されます）
ちなみに、以下の記述で認識させることができます。これもデフォルトになってほしい。

```groovy:app/build.gradle
android {
    ...
    sourceSets.all {
        java.srcDirs += "src/${name}/kotlin"
    }
}
```



# その他変更点

https://android-developers.googleblog.com/2017/05/android-studio-3-0-canary1.html
エミュレーターやDebugまわりの新機能が多いです。
Stethoは不要になるかもしれません。

余裕があったらほかの新機能も書いてみます。
AVQueuePlayerをリピート再生させるときに詰まった話

# AVQueuePlayerとは

AVFoundationのAVPlayerを継承している。複数のAVPlayerItemを連続再生できるクラスです。


複数の動画を連続再生するときはAVQueuePlayerというクラスを使うといいらしい

```swift
let items = [AVPlayerItem(), AVPlayerItem(), AVPlayerItem()]
let queuePlayer = AVQueuePlayer(items: items)
queuePlayer.play()
```
ってやると配列の順番通りに動画が再生される

# AVQueuePlayerでリピート再生を実現させる（間違ってる例）

僕は最後のAVPlayerItemが再生し終わったらseekを0にしてまた再生しとけばいいと思ってた

``` swift:普通に
func setupObserver() {

  NotificationCenter.default.addObserver(self, selector: #selector(self.endPlaying), name: .AVPlayerItemDidPlayToEndTime, object: items.last)
}
    
func endPlaying() {
  queuePlayer.seek(to: kCMTimeZero)
  queuePlayer.play()
}

```
```swift:RxSwift使用
NotificationCenter.default.rx.notification(.AVPlayerItemDidPlayToEndTime, object: items.last).subscribe(onNext: { [weak self] _ in
  guard let `self` = self else { return }
  self.queuePlayer.seek(to: kCMTimeZero)
  self.queuePlayer.play()
}).disposed(by: disposeBag)
```

けどできませんでした、、、

できない理由はよくわからないんで知ってる人がいたら教えて欲しいです。


# AVQueuePlayerでリピート再生を実現させる（できた）

正しいリピート再生のアプローチは

「１つめのAVPlayerItemが再生し終わる」
　　　　↓
「１つめのAVPlayerItemのseekを0にする」
　　　　↓
「次のAVPlayerItemを再生する」
　　　　↓
「１つめのAVPlayerItemをAVQueuePlayerのitemsの後ろにinsertする」
　　　　↓
「2つめのAVPlayerItemが再生し終わる」
　　　　↓
「2つめのAVPlayerItemのseekを0にする」
　　　　↓
以下同様
って方法だとリピートを実現することができた！

``` swift:普通に
func setupObserver() {
  for item in items {
    NotificationCenter.default.addObserver(self, selector: #selector(self.endPlaying), name: .AVPlayerItemDidPlayToEndTime, object: item)
  }
}

func endPlaying(_ notification: Notification) {
  let item = notification.userInfo?["object"] as! AVPlayerItem
  // 再生し終わったらseekを0にして
  item.seek(to: kCMTimeZero)
  // 次を再生して
  queuePlayer.advanceToNextItem()
  // 後ろにinsert
  queuePlayer.insert(item, after: nil)
}

```
```swift:RxSwift使用
for item in items {
  NotificationCenter.default.rx.notification(.AVPlayerItemDidPlayToEndTime, object: item).subscribe(onNext: { [weak self] _ in
    guard let `self` = self else { return }
    // 再生し終わったらseekを0にして
    item.seek(to: kCMTimeZero)
    // 次を再生して
    self.player.advanceToNextItem()
    // 後ろにinsert
    self.player.insert(item, after: nil)
  }).disposed(by: disposeBag)
}
```

# 最後に

やー、はまりまくった。

RxSwiftじゃない方は文法間違いあっても知りません
ファイル名,ディレクトリー名をテキストファイルに書き出す

#やり方は人それぞれですが、新しいものを使いたい

　あるフォルダーにあるファイルをテキストファイルに書き出す場合、これまでは`HANDLE`、`WIN32_FIND_DATA`しか使ったことがありません。他にも方法はたくさんあるのですが、できれば新しいものを使いたいです。

　そこで、マイクロソフトのMSDNから最新の方法を習ってみました。

#ファイル走査と書き出す方法

　使用するのは`<filesystem>`です。まず、これをインクルードしておきます。次に名前空間として`std::tr2::sys;`を追加します。この名前空間に`path`を追加して、フォルダーパスを明示します。

　便利なのは、まず以下のMSDNの引用にあるようにstringやwstringに自動変換可能なところでしょうか。

>(XP 以降の) Windows のパスは、ネイティブで Unicode で格納されます。path クラスは、自動的にすべての必要な文字列の変換を実行します。 それはワイド文字とナロー文字の両方の配列の引数を受け入れ、UTF8 や UTF16 として書式設定された std::string や std::wstring 型も受け入れます。path クラスは、パスの区切り記号も自動的に正規化します。 コンストラクターの引数のディレクトリの区切り記号として単一のスラッシュを使用することができます。 これにより、Windows と UNIX の両方の環境でのパスの格納に、同じ文字列を使用することができます。

　フォルダー内部のファイル走査方法として`directory_iterator`を使用し、ディレクトリ、ファイル、シンボリック リンク、ソケット ファイルなどが検知可能です。

　また、`directory_iterator` は、項目を `directory_entry` オブジェクトとして返し、さらに拡張子やファイル名、相対パス、ルートが`path()`のメンバー関数、例えば`path().extension()`(この場合、拡張子）で自動的に取得できます。

　`filesystem`の作業としてはMSDNでは以下の項目を想定しているようです。


- **指定のパスの下のファイルとディレクトリを反復処理**
- **ファイルの作成時、サイズ、拡張子、およびルート ディレクトリなどに関するファイルの情報を取得**
- **パスの構成、分解、および比較**
- **ディレクトリの作成、コピー、および削除**
- **ファイルのコピーと削除**

#例のコード

```c++:filename_out.cpp

#include <iostream>
#include <filesystem>
#include <io.h>
#include <fstream>

using namespace std;
namespace nameS = std::tr2::sys;

int main()
{
	nameS::path fPath("C:/folderName/dataFolder"); // folder path

	std::ofstream textFile; // or wofstream. then put "L" before filepath.
	textFile.open("./test.txt", std::ofstream::out | std::ofstream::trunc); // select open mode.out is write,in is read.

	if ((_access("./test.txt",00)) == -1) { // check the file exists or not.00 is return mode.include <io.h>
		cout << "We cannot open the file by error code " << errno << endl; // read error code. 
        system("pause");
        break;
	}

	nameS::directory_iterator itr(fPath), end;
	std::vector<wstring> fileList;
	std::error_code err;

	for (itr; itr != end; itr.increment(err)) {
		if (err != std::errc::operation_not_permitted) {
			auto entry = *itr; // auto = std::experimental::filesystem::v1::path
						
			fileList.push_back(entry.path()); // add to the vector.
			cout << "file path is " << entry.path() << endl; // output file paths.
			textFile << entry.path().filename() << endl; // put file name in the text file.
		}
		else {
			break;
		}
	}

	textFile.close();

	system("pause");
	return 0;
}
```
オブジェクトの属性の追加・削除などの設定変更が多い場合に任意の属性をキーにして並び替える方法



**完全に自分向けのメモ(と戒め)**

**5/20 shiracamusさんからのコメントを受けて内容を修正しました。**

# 目的
様々な属性を持つPythonのオブジェクトを
任意の属性を使って並び替えを行う方法を整理します。


# 想定される使いどころ

ソート対象となるクラスの属性のうち、どの属性をキーとして
ソートするかが不明な場合に利用すると良さそうです。

e.g. 
webアプリ上で検索等を行う際に任意のキーを使ってソート順を指定できる場合など

また、クラスの属性の追加が頻繁に行われている場合など
にも活用が可能です。
　　　

# 概要

1. hasattrで対象となるソートのキーに用いる属性が存在するかを確認
2. ソートのキーとなる属性が存在する場合はソートを行う


# サンプルコードと解説

## サンプルコード

```python:サンプルコード

class SampleClass(object):
    """
    ソート対象となるサンプルクラス
    """
    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

    def __str__(self):
        return str(self.value1) + "," + str(self.value2)


def sort(objs, sort_rule=("value1", "asc")):
    """
    ソート用の関数
    """
    key, order = sort_rule

    is_reverse = (order.lower() != "asc")
    if hasattr(objs[0], key):
        return sorted(objs, key=lambda obj: getattr(obj, key), reverse=is_reverse)

    return objs


targets = [
    SampleClass(value1="test003", value2="sample003"),
    SampleClass(value1="test002", value2="sample001"),
    SampleClass(value1="test001", value2="sample002")
]

# value1をキーにして並び替え
sorted_targets = sort(objs=targets)

for obj in sorted_targets:
    print(obj)

print("========")

# value2をキーにして、降順で並び替え
# dscを指定しているけれども、実際にはasc以外ならなんでも良い
sorted_targets = sort(objs=targets, sort_rule=("value2", "dsc"))

for obj in sorted_targets:
    print(obj)

```

```bash:実行結果
test001,sample002
test002,sample001
test003,sample003
========
test003,sample003
test001,sample002
test002,sample001
```

## 解説


```python:ソートのメソッド
def sort(objs, sort_rule=("value1", "asc")):
    """
    ソート用の関数
    """
    key, order = sort_rule

    is_reverse = (order.lower() != "asc")
    if hasattr(objs[0], key):
        return sorted(objs, key=lambda obj: getattr(obj, key), reverse=is_reverse)

    return objs
```

objsは、並び替えの対象となるリストを含みます。

sort_ruleにはtupleで対象となるキーと昇順(asc)、
または降順(dsc、コード上は任意文字列も可)を指定します。

## 注意点

hasattrで対象とする属性の有無を判断していますが、
配列に含まれるオブジェクト全てが同じ属性を持っている前提となっているので
その点は注意が必要です。

また、hasattrを使った判定の際にfalseとなった場合には、
ロガーを使ってソート処理を実施していない旨などを、
明示した方が良いかもしれません。
必要な時にのみxdebugをオン

Xdebugはパフォーマンスにインパクトを与えます。[^impact] 本来、Xdebugが必要なのはテストカバレッジやプロファイル取得、トレースなどを行うデバック実行の時のみです。この記事では必要な時にのみXdebugをオンにして、普段はオフにする方法を紹介します。Composer と単体テストを含むコマンドラインスクリプトをはるかに高速に実行できます。

[^impact]: この記事を最初に執筆したXdebug2では顕著でした。現在のバージョンではかつてのインパクトはなくなりました。

# Xdebugをオフ

普段はオフにします。`php --ini`でphp.ini（またはxdebug.ini)の場所を調べコメントアウト。

```php.ini
;zend_extension = "xdebug.so"
```

# コンソールで実行

```
php -dzend_extension=xdebug.so
```

xdebug付きで実行するときはこのようにxdebugでを読み込んで実行します。しかし実際にはテストカバレッジで後述するようにcomposerコマンドにすると実行も便利です、プロジェクトで必要なコマンドとして記録できます。


## テストカバレッジ

カバレッジの計測はXdebugよりPhpdbgが、Phpdbgよりpcovが高速です。

 * https://dev.to/swashata/setup-php-pcov-for-5-times-faster-phpunit-code-coverage-3d9c
 * https://y-ahiru.hatenadiary.jp/entry/2019/08/07/020039

### pcov

pcovインストール

```
pecl install pcov
```

詳しくは[pcov install](https://github.com/krakjoe/pcov/blob/develop/INSTALL.md)を参照。
 
テストカバレッジを取るときのcomposerコマンドを`composer.json`に追記。pcovとxdebugでの実行を併記することで異なる環境でカバレッジ取得方法が選べます。

### scriptsに記述

```json
{
    "scripts" :{
        "pcov": ["php -d pcov.enabled=1 ./vendor/bin/phpunit --coverage-text --coverage-html=build/coverage --coverage-clover=coverage.xml"],
        "coverage": ["php -dzend_extension=xdebug.so ./vendor/bin/phpunit --coverage-text --coverage-html=build/coverage --coverage-clover=coverage.xml"],
    }
}
```

実行はcomposerコマンドで行います。

pcovの場合

```
composer pcov
```

xdebugの場合

```
composer coverage
```

## PhpStorm

PhpStormのオンデマンドモードを有効にするための設定を行います。このモードでは、グローバルPHPインストールの Xdebug を無効にし、コマンドラインスクリプトをデバッグしているとき、またはコードカバレッジレポートが必要な場合にのみ、オンデマンドで自動的にXDebugを有効にします。

PhpStormでデバッガーを使ってブレイクやステップトレースにするためにxdebug.soを読み込む設定にします。

Language & Frameworks > ... > PHP > CLI Interpreter > "..." でCLI Interpreter画面を表示してDebugger extensionに xdebug.so （必要ならフルパスで）を入力します。
 
![スクリーンショット 2020-09-05 11.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940/80905f21-c8a8-ae89-4e04-2379bc3dc83a.png)

Debuggerにバージョン番号が出れば認識されています。 

* [オンデマンドモードで使用するための Xdebug の構成
](https://pleiades.io/help/phpstorm/configuring-xdebug.html#on_demand_mode)
Rails単一継承(STI)とサブdir構成を実現する方法

## Rails単一継承(STI)とサブdir構成を実現する方法

### 方法1

```
app/models/parent.rb
app/models/parent/mother.rb
app/models/parent/father.rb

class Parent < ApplicationRecord; end
class Parent::Mother < Parent; end
class Parent::Father < Parent; end

# rails consoleで検索するには
Parent::Mother.all
Parent.where(type: 'Parent::Mother')

```

### 方法2

```
# add this to config/application.rb
config.autoload_paths += Dir[Rails.root.join('app', 'models', 'parent')]

app/models/parent.rb
app/models/parent/mother.rb
app/models/parent/father.rb

class Parent < ApplicationRecord; end
class Mother < Parent; end
class Father < Parent; end

# rails consoleで検索するには
Mother.all
Mother.where()

```
【書評】経験ゼロでもできるプログラミング現場の単体テスト

　以前からテスト関連の本を読んでみたいなぁ〜と思ってた所、本屋でたまたま本書を見つけたので購入。現場で単体テストを行う機会は多いものの、深く学んだこともなかったので、いい機会だと思って読んでみました。

http://www.shoeisha.co.jp/book/detail/9784798118918

# 【構成と内容】 
本書は３部構成。それぞれの部には、細かく章が存在しています。各部（章）の簡単な説明と、その中で私が感じた感想・読後メモを書いていきます。

###**＜第1部 単体テストは侮れない＞**
- 1章：超多忙な現場になぜ単体テストを勧めるのか
- 2章：Webアプリケーションの単体テストをよく知ろう

・第1部は、”単体テストは侮れない”というテーマのもと、単体テストの概要を説明しています。
　
　1章で、システム開発で行うテストの種類と目的を確認。単体テスト以外にも、結合テストやシステムテスト・負荷テスト、セキュリティテスト等、多くのテストがあることを確認した上で、最初に行う単体テストの品質が重要であることを説いています。

 また、単体テストの実施方法としては、「テストクラスを作成して、自動で実施/確認」する方法を推奨。（テストクラスを作成する単体テストの方法を以後の部（章）で説明していく形で本書が続いていきます。）

↑↑本書ではJUnitを使用して、Javaプログラムの単体テストを行う方法が説明されています。

　2章は、Webアプリケーションの単体テスト時の注意すべき点や、単体テストの主な手法が紹介されています。筆者は、”全部作った後にテストする=時間がかかる”のでテストを小分けにすることを推奨しているのですが、MVCで作成されたWebアプリケーションに関しては、以下のようにテストする範囲を小さくしてテストするように提言しています。（①→②）

 ① 最初にModelをテスト 
 ② Webコンテナ上でWebアプリケーション（View・Model・Controller）をテスト

　単体テスト手法に関しては、ホワイトボックステスト・ブラックボックステストが簡単に紹介されていますが、細かいテストケースの作り方は載っていないので、本書以外の書籍を参考にした方がよろしいかと思います。第1部では、具体的な単体テストの方法よりも、システム開発におけるテスト観点のおさらいがメインとなっています。個人的には、**MVC全部を作ってから単体テストをするものだ**と思っていたので、**小分けにしてテストが出来る**、という視点は新しい発見でした。

###**＜第2部 行う価値の高い単体テスト＞**
- 3章：EclipseとJUnitで作るテストクラス
- 4章：DBアクセスの単体テスト
- 5章：DBアクセスのテストケースを減らす方法
- 6章：ビジネスロジックと外部リソースアクセスのテスト
- 7章：外部システム連携と画面側のテスト

・第2部のテーマは”行う価値の高い単体テスト”。実際にJavaプログラムの単体テストをサンプルを使って説明しています。（Eclipse + JUnit + DbUnit環境）
　
　3章は、サンプルコードを使ってテストクラスの作成と実行をしてみようという内容。JUnit4のアノテーションの使い方・テスト結果を判定するメソッド（assertXXX/fail等）を紹介しています。サンプルを使って、実際にソースを動かすことが出来るので、実践的にテストクラスについて学べました。テストクラスを作成するのに必要なアノテーション・メソッドが一通り載っているので、JUnitを組む際の教科書としても参考になる章だと思います。

　4章・5章はDBアクセスに関するテストについて。私、この本で初めてDBUnit知りました。テストのフレームワークもあるなんてすごい便利だなと感心。DBUnitの使い方やアノテーション等、実践で使える情報もたくさん載っています。実際にまだ現場等で使ったことないので、これを機に是非使っていきたいと思うフレームワーム。JUnit環境下で使うということもあり、馴染めそうな感じ。DBUnitはテスト前の状態をバックアップ(@Before）したり、テスト終わったらバックアップのデータをDBに戻したり（@After）出来て、非常に便利。（効率的にテストが進められる！）こちらの章にもサンプルがついているので、実際に手を動かしながら手法が確認できます。

　6章。Mockオブジェクトについて。これまた使ったことなかった。（勉強不足を痛感…）Mockオブジェクトを作成するには、振る舞いを真似るため仕様を理解する必要があるということが記してあります。（かたや、Mockクラスを作るなら、実クラスを作成してからテストした方が効率的ではないかとも書いてあります。）今後使うかも知れない手法として一読の価値ありかと思います。※ Mock = 疑似。

　7章では、画面のカバレッジの取り方が紹介されています。EMMAというツールを使ってカバレッジを取得する手順が学べます。EMMAは現場で使ったことがあったので、再確認に丁度良い内容でした。

　第２部では、Javaの現場でテストをする際に抑えておかないといけないポイントが一通り紹介されていました。テストの方法というと、なかなか勉強する機会がないので、このような本があるとすごいありがたいです。

###**＜第3部 継続的にテストをするために＞**
- 8章：実装前にテストを意識する
- 9章：テストを意識した開発のポイント
- 10章：さらにテストを省力化するポイント
- 11章：ビルド&テストを自動化する環境の構築
  
・第３部では、テストをより効率的に行う為に、製造の段階からテストを意識して作りましょうという点をテーマとしています。また、ビルドサーバー等を用意し、継続的にテストをする環境の構築の方法を紹介しています。

　8章の冒頭では、「品質は工程で作りこまれる」という言葉を紹介。ソフトウェアアーキテクチャを考慮する段階からテストを考慮し、プロジェクト内で共通意識を持っていくことがよいテストの条件という点を強調しています。9章でも、開発を進める中で、無駄なテストを減らす設計をしていくことが大事という内容が記されています。引数の型に意味を持たせることや、システム日付を扱うメソッドのテストの方法等。また、バグ発見のツールとしてCheckStyleやFindBugsといった静的ツールの使い方も紹介しています。10章以降はテストの効率化・自動化を図る環境作りのお話です。

【感想】
・普段、Javaのエンジニアをしているのですが、この本を読むまで知らなかったツールもたくさんあったので、とても参考になりました。これまでただ漠然とテストをしていましたが、より品質を高める為に効果的なテストを実践していきたいと思います。初学者でも読みやすい本書ですので、テストに苦手意識のある方は是非読んでほしいと思います。