OmniAICreator/Qiita-1.07M huggingface dataset:
Android Emulator 26.0.3 の IPv6対応

# サマリ

ほどほどに動くけど、いろいろ惜しい。

- Android Emulator 25.3 からIPv6をサポート。Google配布の仮想デバイス　(AVD: Android Virtual Device)　イメージでは、IPv6はデフォルトON
- http://test-ipv6.jp/ へのアクセスで 10/10 点が出る程度には動く。
- エミュレータのホストOSがIPv6接続があれば、仮想デバイスから設定なしでIPv6接続ができた。
- AVDにサイトローカルIPv6アドレス (fec0::ほげほげ/64) が割り当てられる。
- AVDにグローバルスコープのIPv6アドレスがないのでIPv4優先で接続する。
- 外部接続はサイトローカルIPv6アドレスをNAPT66する仮想ルータを通じで出ていく。

# はじめに

2017年2月の Android Emulator 25.3 からIPv6がサポートされた。[リリースノート](https://sites.google.com/a/android.com/tools/recent/androidemulatorrevision2530feb2017)によると

> Initial IPV6 support.

と、まだ微妙な表現ではあるが、サポートしたと書いてある。実際に動かした例を見たことがなかったので

# やってみた

## 環境

- Android Studio 2.3.3
  - Android Emulator 26.0.3
  
Android Studio の 設定 (Preference -> Appearance & Behavior -> System Settings -> Android SDK -> SDK Tools) から執筆時点で最新のAndroid Emulatr 26.0.3 を入れた。

## AVD (Android Virtual Device) に付与されたIPv6アドレスの確認

AVD設定

- Nexus 6P (x86)+ Android 7.1.1 (Google APIs)
- root設定が簡単にできる、非Google Play版のイメージを選んだ

起動してみると、IPv6アドレスはサイトローカルアドレスがついていた。

```
host# adb root
host# adb shell
generic_x86:/ # ifconfig
eth0      Link encap:UNSPEC
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe12:3456/64 Scope: Link
          inet6 addr: fec0::5054:ff:fe12:3456/64 Scope: Site
```

## ブラウザで外部アクセス

Chrome および WebView Browser Test を立ち上げて、http://test-ipv6.jp/ へアクセスすると、AVDにサイトローカルアドレスがついていることに対する警告は出るが、一応10/10点。IPv6インターネットアクセスにはQEMUが提供する仮想ルータがNAT変換を行っており、Webサーバから見ると、ホストOSのIPv6アドレスが見える。

![Screenshot_1496195450.png](https://qiita-image-store.s3.amazonaws.com/0/154037/6e5bd8fc-83ca-37bf-f5c3-4b2805dc5e1a.png)



次に、IPv6 only の https://ipv6.google.com/ へもサイトローカルアドレス＋NAPT66でアクセスOK

![Screenshot_1496195762.png](https://qiita-image-store.s3.amazonaws.com/0/154037/b6a1a7f9-f0ca-f5bd-bd63-18e3e712c585.png)


しかし、宛先がデュアルスタックだとIPv4優先になってしまう。これはグローバルスコープのアドレスがないため。http://test-ipv6.com/ でIPv6/IPv4どちらが優先かテストの結果。

![Screenshot_1496197178.png](https://qiita-image-store.s3.amazonaws.com/0/154037/8841f028-d34c-db9e-08b0-4d0cd8443d6f.png)




# Android Emulatorが利用するQEMUの実装状況

Android EmulatorはQEMUを使っており、AVDを収容する仮想ネットワークはユーザモードネットワークと呼ばれるQEMUのソフトウェア機能で実現されている。QEMU自体は、IPv6にも対応しているが、現時点での実装では仮想ネットワークに割り当てるIPv6アドレスのデフォルトがfec0::/64、外部接続はNAPTとなっている。下図は[QEMUのドキュメント](http://wiki.qemu.org/Documentation/Networking)にIPv6設定を加筆したもの(赤字部分)。

![Slirp_concept.png](https://qiita-image-store.s3.amazonaws.com/0/154037/956e48c4-f812-d548-c2ce-8f18a53f41b5.png)

# まとめ

- グローバルアドレス再配布の仕組みはなく、またULAではなくサイトローカルアドレスを使っている
- NPTv6でなくてNAPTを使っている。

など、QEMU実装由来のおかしなところはあるが、新たにIPv6アドレスを取得したり、特別な設定をすることなくIPv6接続が使えるのは開発者によっては手軽で、ローカルアドレスとNATのメリットかも知れない。
俺流プログラミング言語の学び方

この記事は[cloudpackあら便利カレンダー](https://cloudpack.github.io/benri2017/)の14日目の記事です。
折り返しすぎてますね。続くと思ってなかった。

ところで、みなさんは新しいプログラミング言語って習得してますか？
恥ずかしい話ですが僕は17歳でC言語、19歳から27歳まではPHPとJavaScriptで生きてきました。

今はちょいちょい他の言語も業務で使うようになってきたので、僕のやってきた学び方を伝授したいと思います。


## 学ぶ順序
プログラムの基本的な書き方は、ぐぐったらちょろいので割愛します。
ここでは `文化` をどう学んでいくかにフォーカスしたいと思います。

- 公式docを漁る
- GitHubで調べる
- Twitterで著名人をフォローする
- SlackでUGを探す

振り返るとだいたい上記の順序に当てはまっていました。
逆に学習商材や書籍から学ぼうってことはあまりありません。

もうちょっと掘り下げます。


### 公式docを漁る

超基本ですね。
PHPだったらhttp://www.php.net/
Pythonだったらhttps://docs.python.jp/3/tutorial/
公式って公式だけあってかなーーり細かいところまで記載があったりして、その言語に携っている限り一生付き合っていくなーって感じてます。


### GitHubで調べる

周辺のエコシステムをGitHub軸に展開していることが多いため、GitHubの[Advanced search](https://github.com/search/advanced)から言語を絞って眺めてます。
ここからnpmやpackagist, PyPIなどにたどり着くこともあってパッケージ管理システムについての情報もなんとなくわかったりします。
また、Starの多いリポジトリの中に潜ることで書き方や言語仕様も学ぶことができます。

![Advanced_Code_Search.png](https://qiita-image-store.s3.amazonaws.com/0/73113/f3106c89-5bdf-e2d4-a495-b12392f29b66.png)


### Twitterで著名人をフォローする

これは半分趣味です。
今の僕じゃ全然想像もつかないバグを踏んでいたり、便利なライブラリが紹介されていたり、はたまたプルリク出してたり...。
次元の違う人が超カジュアルに情報を開示しているので、超刺激になります。
刺激がないとどうしようもない僕は、「やべえわこの人...」って半ば絶望しながら背中を追いかけていることが多いです。
探すときは書籍の執筆者の名前でググったりしてます。


### SlackでUGを探す

最近じゃどの言語もSlack teamあんじゃねーの？ってくらい `${言語名} slack チャンネル` でググるとすぐに出てきます。
英語ができない僕は本家チームっぽいとこで疎外感に苛まれてしまうので、 `チャンネル` を日本語で検索してます。
精神衛生上超おすすめ。
しょっちゅうAPIやライブラリの説明が出てくるので注意。

SlackはTwitterと違って誰宛ってわけでもなく「どうなってるのかな〜(ﾁﾗｯﾁﾗｯ」って投げかけるとジェントルメンが答えてくれることも多々あって優しい世界を体験できます。
とはいえ、他力本願で行くと感じ悪いので注意してくださいね。

_phpの場合_
![スクリーンショット 2017-06-19 16.49.28.png](https://qiita-image-store.s3.amazonaws.com/0/73113/fd875a88-91f8-93b6-c96b-a231676a9629.png)

_pythonの場合_
![スクリーンショット 2017-06-19 16.50.34.png](https://qiita-image-store.s3.amazonaws.com/0/73113/5a91387a-efba-1a6f-6958-9aeeb3d6b661.png)


## やらないこと

やらないようにしていることについても説明いれておきます。

### 学習商材に手を出す

漠然と動画サイトで写経したりっていうのは、僕はほぼしません。
特に理由があるわけではないんですが、単純に僕があわないだけだと思います。

### 書籍を買う

形から入るタイプだったので、よく書籍を買ってﾆﾏﾆﾏしてましたが、最近じゃほぼ書籍は買ってません。
買っても逆引きくらいでオライリーなんてほんとにピンポイントでしか買ってません。
実践導入しちゃって習うより慣れろ！情報はアンテナはっとけ！って感じのスタンスになってきてるんだな、って自分で思います。

最近減ったってだけで、基礎を学ぶときは超買って超お世話になってました。

## まとめ

- アンテナをはる
- 先人から学ぶ
- 自分にあった学習スタイルを使う

あったりまえのことですが初学者があら便利と思ってくれたら幸いです。
Visual Studio > Windows Forms Application > Error: CS0246 型または名前空間の名前 'Form1' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。	 > namespaceの問題

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

とあるライブラリを使うWindows Formsアプリケーションのサンプルプログラムがあった。

それを参考に新プロジェクトを作ってビルドしようとした。

以下を新規プロジェクトに上書きした。

- ライブラリのcs
- Form1.cs
- Form1.Designer.cs

ビルドでProgram.csファイルにおいて以下のエラーが出た。

> エラー	CS0246	型または名前空間の名前 'Form1' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。	

よく見ると上記でコピーしたファイルのnamespaceと新規プロジェクトのnamespaceが異なっていた。それにより、「'Form1' が見つかりませんでした」になっていたようだ。
API Harmony で API 検索


## API harmony を Bluemix から選択

<img width="588" alt="API harmony 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/25f7e8ed-f46f-ffed-ce24-580245dbd967.png">

## API harmony が起動

<img width="717" alt="API harmony 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/307d815e-2e48-778d-2185-4cd9e4e3811d.png">

## API harmony から " account " API を検索

<img width="481" alt="API harmony 3.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/e6e43ad7-481c-6eb7-5022-9ca66fe76ee3.png">

## API harmony から　OpenAPI Swagger 出力

API Reference,Swagger,関係性もそのまま出力 

<img width="939" alt="API harmony 4.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/360ca9c2-059d-e077-bdff-0b325b307e95.png">
後輩にレビューで突っ込みを入れた話　JavaScript編[3]

#はじめに
だーれもしらないしられちゃいけーないー　ばぐをつくったのだーれなのーかー
サービス開始前に戻って運営に文句を言ってやりたいことってありますよね（ご挨拶）
運用を引き継いだアリスちゃん激おこ。

ここは後輩に指導？助言？したコードレビューをつらつらと書いていたりしてます。
今回はjavaScript編と言いつつ殆ど一般論。つーか最近フロントばっかりいじってるなぁ。

##名前考えようよ編
若い子にありがちなんだけど、似たような処理を連番にしちゃうやつ。

###しょにょ５
```5_before.js
// 処理履歴無しの人用
function check_type1(){
	// なんか処理する
}
// 処理履歴持ちの人用
function check_type2(){
	// なんか処理する
}
```
久々に生function定義を見た気がしますが、そこは置いておいて名前に激おこ。
そんなコメントを残すくらいならちゃんと名前考えればいいじゃない！

```5_after.js
function check_without_history(){
	// なんか処理する
}
function check_with_history(){
	// なんか処理する
}
```
コメント消えるし、呼び出し場所で「どっちが１でどっちが２だっけ？」みたいなことがなくなる方がみんな幸せだよね的な。こういう時ちゃんとjavadoc的なの書いてるところは羨ましいなぁと思います。

##で、なんで後輩はそう書いたの？
っていうのをいつも書いてるんですが…実はこれ今回初めて僕のレビューが入った後輩の担当区域ではあったけど、既存のこれまでアンタッチャブルだった領域だったので、このしでかしをしたのは後輩じゃなくて後輩に引き渡して（僕が入るより前に）逃亡した奴なのよね。なんてもの納品してくれたんや…

理由だけ推測するとたぶん冒頭に書いた通り「似たような処理だからとりあえず連番」って思考停止だと思います。一応聞いたけど、後輩もそういう風に考えて自然な名前だと思っていたそうです。うーん。

げきおこ。

#番外編
ついでなんでそのころから脈々と受け継がれてしまっていたやつを中心にタイポ集とか。そこ、ネタ不足とか言わない。
自然すぎて気づかなかった奴から、なんでコードレビューするまで誰も直さなかったの的な奴まで各種。

##英語ミスった？（orタイポ）
thumnail→thumbnail
読まない文字抜かすのってありがちだよね しかしサムアップ忘れるとかどんだけ余裕なかったのb

fail→file
隣にカタカナで「ファイル」ってあったからかろうじて理解したけど、お願いだからその間違いほんとやめて…

fotter→footer
ローマ字と混ざったんじゃありませんか？お疲れの時はちゃんと帰った方がいいですよ…

bule→blue
見つけたこっちがブルーになったやつ…これ、犯人は自分でした。ヤスじゃない…

##規約どうなってるの編
insertData
deleteData
dataEdit
メソッド三つ続いてるのにどうして仲間はずれが一人いるの？馬鹿なの？死ぬの？（規約は動詞が前でした）

##わかるけどそれやめて編
flgとかflagとか
まだこの名前を付ける人がいるのか…と頭を抱える。
例えばisFailureとかisDropとかisErrorみたいにしてくれないかしら。

pointer
マウスのカーソルを変えるところに使ってた、ならばせめてmouse--pointerとかにしてほしい
検索するともちろん悲しい位別の場所が引っ掛かってくれて涙目。手作業で置換するのホント悲しみだった。

indx
そもそもindexだという話は横に置いておくとしても、何のindexなのかちゃんと明示しようよ
（ちなみにメソッドとしてhoge.index(indx)してるので、混ざらないように配慮した疑惑）

background_background_img
背景のさらにバックとか二度言わんでもいいから！いくら"z-index:-999;"だからと言ってもいいすぎや！

#つづくの？
多分もうネタは枯れたと信じている。少なくとも笑いながらかけるネタは…
いや、面白おかしく書くのが芸人でしょって？いや芸人じゃないですから！

もうええわ！ありがとうございましたー
Bitbucketでの新規リポジトリ作成メモ

久しぶりにやったら忘れてたのでメモ。
特にssh周り覚えてなかった＼(^o^)／

#下準備
※Bitbucketのアカウントはあるものとする(そりゃそうだ)

##①Bitbucket上でリポジトリを作る
作る。

##②鍵ファイルを作る
```
cd ~/.ssh
ssh-keygen -t rsa -C [メアド的なもの]
```
##③公開鍵をBitbucketにコピー
`cat`コマンド等で`id_rsa.pub`を表示してコピー。
それをBitbucketのアカウントの方に鍵を追加する。
※リポジトリごとに設定するのは間違い→[http://personal.loudandproud.me/bitbucket-ssh-read-only/](http://personal.loudandproud.me/bitbucket-ssh-read-only/)

##④パーミッションを600にする
```
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa 
```


#Gitの設定
Gitの設定を行う。

##リポジトリの設定
```
cd [管理したいディレクトリ]
git init
git remote add origin [リポジトリURL]
```

※Bitbucket見ながらでも設定できるはず

##好きな設定
好きな設定を施す。
Gitのカラーリングはglobalでやってるので今回はしない…。

```
git config --global user.name [名前]
git config --global user.email [email]
git config --local core.quotepath false
```

##pushする
```
git add .
git commit -m "first commt"
git push origin master
```

で完了。
日本語環境TeXにおいてcryptocodeパッケージを使ってプロトコルを記述する場合

日本語環境TeX（例えばpTeX）でcryptocodeパッケージを使ってプロトコルを記述したい場合があると思う（特に暗号研究者の方）。

その場合は

```
\documentclass[11pt,a4paper,dvipdfmx]{jarticle}
```

のようにdvipdfmxのオプションをグローバルに加えれば解決する。

参考:
https://tex.stackexchange.com/questions/116642/how-to-use-tikzmark-with-platex
第16回つぶやき勉強会  ~ Rails の小さくてシンプルなメソッドの生態系 count, size, length ~ 

# Company has many users とします。

```rb
class Company < ApplicationRecord
  has_many :users
end

class User < ApplicationRecord
  belongs_to :company
end
```

----


# 会社をひとつつくる

```rb
Company.create(name: 'kinop')
=> #<Company:0x00000005e599d0
 id: 1,
 name: "kinop",
 created_at: Mon, 19 Jun 2017 05:44:02 UTC +00:00,
 updated_at: Mon, 19 Jun 2017 05:44:02 UTC +00:00>

Company.count => 1
```

----

# ユーザを3人つくる

```rb
1.upto(3) do |i|
  User.create(name: "name#{i}", company_id: 1)
end

User.count => 3
```

----

# 問題1

```rb
company = Company.first
company.users.count # => ?
```

----

# 問題2

```rb
company = Company.first
company.users.size # => ?
```

----

# 問題3

```rb
company = Company.first
company.users.length # => ?
```

----

# 問題4

```rb
company = Company.first
company.users.length # => 3
User.create(name: "name4", company_id:1)
puts "#{company.users.length} #{company.users.size} #{company.users.count}"
```

----

# 解答

問題1 => 3
問題2 => 3
問題3 => 3
問題4 => 3 3 4
Ubuntuでvirt-managerからゲストOS導入したい。

OS:Ubuntu 16.04 LTS
CPU:Intel Xeon

KVMを利用してCent OSを導入しようとしていると
virt-managerを利用しているとこんなことを言われる。

```
KVM を利用できません。これは KVM パッケージがインストールされていない。また
は、KVM のカーネルモジュール (kvm.ko) が読み込まれていないことを意味します。
QEMU が使われるので動作が遅くなるでしょう。

warning: KVM is not available. This may mean the KVM package is not installed, or the KVM kernel modules are not loaded. Your virtual machines my perform poorly
```

調べてみるとカーネルモジュールが読み込まれていないということが書いてあった。
[KVMのカーネルモジュールが読み込まれない](http://qiita.com/fetaro/items/65fa1d136406251ce898#kvm%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%8C%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%81%AA%E3%81%84)

この通りに下記を実行してみると
`modprobe: ERROR: could not insert 'kvm_intel': Operation not supported`
またしてもエラー。。。

このサイトが解消してくれました。どうやら初期状態ではBIOSでkvmが無効化されている。。と
[KVM と /proc/cpuinfo の微妙な関係](http://momijiame.tumblr.com/post/92845673876/kvm-%E3%81%A8-proccpuinfo-%E3%81%AE%E5%BE%AE%E5%A6%99%E3%81%AA%E9%96%A2%E4%BF%82)

BIOSでIntel VTを有効化することで無事解決されてメッセージがなくなった。
（メッセージが出てる画像を撮り忘れた・・・）
![Screenshot from 2017-06-19 16-12-52.png](https://qiita-image-store.s3.amazonaws.com/0/108367/93d39147-cb1e-2dba-2bbd-b6195e477381.png)

と、いうことでCent OSを導入してみる。ローカルにイメージを配置しているのでそのまま進行し
配置場所を参照から指定する。
![Screenshot from 2017-06-19 16-16-22.png](https://qiita-image-store.s3.amazonaws.com/0/108367/691c6e10-d2cd-b91b-da67-221e4d5351a4.png)

メモリ、CPUはお好きなように
![Screenshot from 2017-06-19 16-17-11.png](https://qiita-image-store.s3.amazonaws.com/0/108367/8e8a12e6-5204-c32c-daee-309d07bbc2c2.png)

仮想ディスクは別の場所に作りたいので場所を変更する
![Screenshot from 2017-06-19 16-20-29.png](https://qiita-image-store.s3.amazonaws.com/0/108367/f4733913-5273-5809-5c78-c4227dea266d.png)

あとは完了を押せば仮想マシンが立ち上がりインストールが開始される
![Screenshot from 2017-06-19 16-21-14.png](https://qiita-image-store.s3.amazonaws.com/0/108367/7d4f5b34-3412-f523-e28f-94cc20305027.png)

Cent OSインストールはいろんな投稿があるので省略
![Screenshot from 2017-06-19 16-22-00.png](https://qiita-image-store.s3.amazonaws.com/0/108367/ac9a85d6-98a3-8b46-fbd2-8da90413c270.png)
Oracle プラガブルデータベースのsqlplusでの切替方法

# はじめに

Oracle 12c 以降ではマルチテナント・アーキテクチャが追加となっています。[参考](http://www.oracle.com/technetwork/jp/database/articles/jissenn12c/jissen12c-01-2052300-ja.html)
11g以前とはsqlplusによる接続の仕方が異なり、少し困ったのでその方法を書いていきます。

ちなみに、具体的に困った事としては、スキーマ作成しようとしたら、
「ORA-65096: 共通ユーザーまたはロール名が無効です」
が発生してしまいました。
sqlplusでのデフォルト接続先がCDB（コンテナデータベース）だったからです。
PDB（プラガブルデータベース）へ切り替えなければいけませんでした。

# 結論

```sql
sqlplus ユーザ/パスワード as sysdba
SQL> alter session set container = orclpdb;
```

# 手順

### 前置き

※ 今回のsqlplus上での作業は基本的にsysdba権限が必要ですので、以下のように接続している事を前提とします。

```sql
sqlplus ユーザ/パスワード as sysdba
```

以降、先頭行が「SQL> 」となっている箇所はsqlplusに接続している事を示します。

### 0. PDBの名前確認

作成したPDBの名前が分かっている場合は飛ばしていいです。
名前を忘れた場合（←私がそうでした）や、そもそもPDBを作成したのか不明な場合についてです。
（Oracleインストール時のデフォルト名は「orclpdb」の模様です）

```sql:PDB名前確認
SQL> select name, open_mode from v$pdbs;
```
![2017-06-19_14h40_53.png](https://qiita-image-store.s3.amazonaws.com/0/105894/4f375876-59d5-5ce4-aa70-43fd9a9d5eeb.png)
このように、「$SEED」ではないほうのNAMEがPDBの名前です。複数ある場合は適宜選んでください。

### 1. PDBの起動

PDBを起動します。仮に起動済みであっても「ORA-6511: プラガブル・データベースPDB名はすでにオープンしています」が発生するだけなので特に問題はありません。
また、[0. PDBの名前確認](#0-pdbの名前確認)でOPEN_MODEが「READ WRITE」となっていた場合はPDBが起動されていますので飛ばしてよいです。

```sql:PDBオープン
SQL> alter pluggable database ＰＤＢ名 open;
```
（参考：起動済みの場合）
![2017-06-19_14h53_21.png](https://qiita-image-store.s3.amazonaws.com/0/105894/f8eb0163-92e5-5a6d-d7d6-f6d88b514e92.png)

### 2. PDBへ切り替え

PDBへ切り替えます。これで目的は達成です。

```sql:PDB切替
alter session set container = ＰＤＢ名;
```

### 3. 接続確認

「show con_name」でPDB名が表示されれば成功です。
![2017-06-19_16h14_38.png](https://qiita-image-store.s3.amazonaws.com/0/105894/3f595f89-db54-b4f2-0384-1e5942dc4530.png)

また、sqlplusでPDBにワンライナーで接続するには、以下のように「@ホスト名:ポート名/（PDBの）サービス名」を指定します。

```sql:接続例
sqlplus system/password@localhost:1521/orclpdb
```
インデントを「スペース」にするか「タブ」にするかを考える

# スペース派
## メリット
- スペースなので、入力が楽。
- Gitなどでずれることがなくに表示される

# タブ派
## メリット
- 1回打つだけでインデントが揃う。
- オリジナルなキャラクターセットのため、スペースと被らない

# 世界的な潮流
Gitにプッシュされたコードを見ていると、スペース派がほとんどらしいです。
数年前はタブが主流でしたが、スペースが変わってきましたね。

# スペースなら何個が良いか
スペースも4個派と2個派があります。
4個の方が縦で目線を流せるので、個別のオブジェクトを見やすくなります。
2個の方が横に目線を流せるので、オブジェクトの内容について確認しやすくなります。
そのため、htmlやphp、jadeを書いている場合、4個の方が見やすいです。
sassなどの場合は2個の方が見やすいです。

# 結論
インデントはスペースで、htmlやphpはスペース4個、sassは2個が良さそう。
（好き嫌いもあるから、プロジェクトで統一されていればOKかな）
サイトで使うパスについて考える

# パスについて
サイトを作る時のリンクを設定する際にあるのが

- 相対パス
- 絶対パス
- ルートパス

があります。
特徴と使いかたをまとめました。

## 絶対パス
```html
https://hoge.com/hgoge/hoge.html
```
urlを直接指定します。

## 相対パス
```html
hgoge/hoge.html
```
そのものの相対的なパスを指定します。
書く量が少なくなります。

## ルートパス
```html
/hgoge/hoge.html
```
/から初めてドメインの指定なしにルートからの構造で指定できます。

# 結論
今は、ステージング環境、本番環境と作ることが多いので、サイトルート相対パスで作ることが多いです。
【ObjectiveC】 setValueについて

#　setValueについての理解を深めよう

そのままパラメータにぶっこむことができるsetValue


~~~ObjectiveC:ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic,strong) NSString *testValue;

@end
~~~

~~~ObjectiveC:ViewController.m
@interface ViewController () {
    NSString *_testValue;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
// インスタンス変数 "_testValue" の値を読み込む
    NSString *testValue = [self valueForKey:@"testValue"];
    _testValue = @"テスト";
    NSLog(@"testValue : %@",testValue);
    NSLog(@"_testValue : %@",_testValue);
    NSLog(@"self.testValue : %@\n",self.testValue);
    self.testValue = @"self.テスト";
    NSLog(@"testValue : %@",testValue);
    NSLog(@"_testValue : %@",_testValue);
    NSLog(@"self.testValue : %@\n",self.testValue);
    // インスタンス変数 "_testValue" に値 @"testValue" を書き込む
    // self.testValue にも値 @"testValue" が書き込まれる
    [self setValue:@"testValue" forKey:@"testValue"];
    NSLog(@"testValue : %@",testValue);
    NSLog(@"_testValue : %@",_testValue);
    NSLog(@"self.testValue : %@\n",self.testValue);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

~~~

使い道は徐々に紹介していきます

ログ

~~~LOG:LOG
testValue : (null)
_testValue : テスト
self.testValue : テスト

testValue : (null)
_testValue : self.テスト
self.testValue : self.テスト

testValue : (null)
_testValue : testValue
self.testValue : testValue
~~~

---

## 関連記事
- Objective-C

---

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
js恐怖症がTypeScriptを触ってみた

今更感はありますが、やっとTSを触ったのでまとめておきます。
※ 尚、本文には個人的感情が多く含まれております


# jsが怖い件

仕事でjavascriptを触るようになってから１年たちます
経験の浅いプログラマーですが、今まではActionScript,C#,Swiftなどを触っていました
オブジェクト指向から入り、静的型のある言語ばかりを触ってきました

## jsのこわいとこ

- 静的型がない
- クラスがない
- コード補完が全然効かない
- 文字列頼みのコードが多くなる
- 適当に書いても動いちゃうw (※ 動的型のためエラーが出にくい)

恐ろしいと感じてしまった為、私の中でjsのハードルは他の言語より高かったです
そしてこの辺は、TypeScriptで解決できる部分でもあります

# TypeScriptを触ってみた

## 嬉しい特徴
「これからjsを始めます」って人はすんなり入れるのではないかと思います
純粋なjsよりも理解しやすいのではないかなー
逆にjsしか触ったことのない人は抵抗を感じるんですかね？

- 静的型づけ
- class
 - 宣言することでクラスが書ける
- extends
 - クラスの継承
- interface
 - クラスの多重継承
- module
 - 名前空間の定義
- enum
 - 列挙型
- arrow関数
 - this変更がないから使いやすい
- public, private, protected
 - いわずもがな
- ES6の機能が入ってる
 - importとかとか。アプデしやすくていいね

## 学習コストを高めてる部分
好きなのですが、わかりやすいのですが、
導入しはじめにはハードルが高くなる部分？
使いどころが難しかったり、あまり他の言語で見られない特徴まわりです
 
- interfaceやnamespaceなどの定義
 - ルールが多くて面倒臭い
 - それぞれを理解するのにちょっと勉強が必要
- 引数プロパティ
 - コンストラクタの引数にpublicまたはprivateの修飾子を付ける
 - あまり多用してほしくないかも
- ?: optional null可能変数
 - 便利だが怖い機能。慣れるまでに時間かかるかも？)
- 中途半端なタプル型
 - 使いどころが微妙で混乱しそう

# まとめ

- TS独特の文化が強いのかな？と思って入ったけれど、他の言語からとった特徴が多くあり、割とすんなり入れた
- ES6にアプデしやすいらしいってことが好印象
- 意外としばりの強いルールみたいのはなくて、使いやすい
- ASに特に似てる
- そんなにモダンじゃないから入りやすそう
- クラスや型がないJSよりもハードルは低い(JS始める時はハードル高かった)

## 結論
- JSしか触ったことのない人は勉強コスト高そう
- JS以外の言語経験者はすんなりいけそう

個人的にはとてもメリットの強い言語だと思いましたよ！

# 参考ページ
参考に見させていただきました。
ありがとうございますm(_ _)m

一部の機能のまとめです。とても読みやすいので最初に読んでもいいかも
[【 TypeScript入門】特徴と機能の一部をまとめました | 株式会社LIG](https://liginc.co.jp/190026)

詳しく載っているのでこれを読めば入門としては完了するかも
[TypeScript早わかりチートシート【1.5.3対応】 - Build Insider](http://www.buildinsider.net/language/quicktypescript/01)

英語ですが、ES6向けで参考になります
[Exploring ES6](http://exploringjs.com/es6/)
ATTiny841で少しハマった

##ArduinoIDEで ATTiny841への書込み

ArduinoIDE 1.8.2 , Arduino as ISP で　ATTIny841へスケッチ書込みをやろうとして少しハマりました。

![ファイル 2017-06-19 14 53 17 (800x800).jpg](https://qiita-image-store.s3.amazonaws.com/0/158760/8ba5e33c-2cc2-6822-371a-768960844c3d.jpeg)

ATTiny841用のボードライブラリには ATTiny841 OptiBoot と　non Bootloaderの２種類があるのですが、

- Optibootを選ぶとブートローダの書込みはできるが以降スケッチ書き込みができない

- non boot loaderを選ぶと同じくブートローダの書込みはできるが、スケッチ書込み時 「ATTiny841なぞ知らん!」と言われて書込みできない

![menu.png](https://qiita-image-store.s3.amazonaws.com/0/158760/27871324-9731-d41f-22b2-bc7e1e1da267.png)

しばらくわけ分からなかったのですが、エラーメッセージを良く見てみるとブートローダの有無で avrdude.conf の読込み場所が異なっているのでした。Optibootは この辺りの？　ATTiny841開発ボードを対象としているみたいな感じです。。。https://github.com/watterott/wattuino

- Opti Bootloader
  System wide configuration file is "C:\Users\goto\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.1.2/avrdude.conf"


- Non Bootloader
System wide configuration file is "C:\Users\goto\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino9/etc/avrdude.conf"

non bootloader時は元のavrdudue.confを使うので、こちらはオリジナルconfのためにATTiny841の記述がそっくり抜けています。
素のATTinyを使いたいので、avr\1.1.2/avrdude.conf の方にあるATTIny841の記述部分をコピーして　avrdude\6.3.0-arduino9/etc/avrdude.conf　へ貼り付ける事で　non bootloaderで素のATTiny841へスケッチの書込が出来る様になりました。
ただ、この位置のファイルはIDEをアップデートすると上書きされてまた初期化されてしまうので注意が必要です。
ChromeでGoogle Mapの地図画像が表示されない場合の対応


## 現象
* ChromeでGoogle Mapへアクセスした際、「この地域の詳細画像は表示できません」というメッセージが表示され、全ての地図画像が表示されない。

![Kobito.F2AF5q.png](https://qiita-image-store.s3.amazonaws.com/0/92630/3bf9764f-1390-1d95-df41-c7f16bada7a5.png "Kobito.F2AF5q.png")


## 対応方法
* Chromeの拡張機能を無効にする。

![Kobito.lFMWU3.png](https://qiita-image-store.s3.amazonaws.com/0/92630/ab7126fa-db93-62aa-8ac2-e76a52760354.png "Kobito.lFMWU3.png")

* 今回はこの機能が影響していた。

![Kobito.NMEtzS.png](https://qiita-image-store.s3.amazonaws.com/0/92630/abd4f19a-d419-6ef3-0108-978fa724819f.png "Kobito.NMEtzS.png")


* その後Mapをリロードすることで地図画像が表示されるようになる。
* 今回は対象のプラグインを再度有効にしてもその後現象は再発しなかった。
ブラウザがサポートしているHTMLタグかどうかをコード上で判定する方法

```js
function isUnknownElement(tag){
  var el = document.createElement(tag);
  if (tag.indexOf('-') > -1) {
    return (
      el.constructor === window.HTMLUnknownElement ||
      el.constructor === window.HTMLElement
    );
  } else {
    return /HTMLUnknownElement/.test(el.toString());
  }
}
```

# 解説
HTML5から導入された[HTMLUnknownElement](https://www.w3.org/TR/html51/dom.html#htmlunknownelement-htmlunknownelement)を利用してJavaScript上で判定しています。
ハイフンがある場合は[カスタムエレメント](https://developer.mozilla.org/ja/docs/Web/API/Document/registerElement)の関係上、処理を多少変える必要があります。

# 雑記
普段の開発で使うことがあまりないためか、調べても見つからなかったので投稿しておきます。
自分は、picture要素が含まれるVue.jsを利用したページに対して、picture要素をサポートしていないブラウザでアクセスした場合に、[エラー](https://github.com/vuejs/vue/blob/47334085a14eb1ed9525598d592038bb57e84db7/src/core/vdom/patch.js#L130)になってしまうのを回避するために用いました。
エラーの内容から、そもそもVue.js側で判定を行っているはずなので、[その実装](https://github.com/vuejs/vue/blob/da1fc3ddc97fb78621f518d03c549ebecc9b1108/src/platforms/web/util/element.js#L52)を大いに参考にしました。

（ちなみにVue.js側のバグは既に解決済みですが、まだ反映待ちです。
[https://github.com/vuejs/vue/pull/5675](https://github.com/vuejs/vue/pull/5675)）
Rails で gem sitemap_generator を使ってサイトマップを作る



## はじめに
SEO 対策で Rails でサイトマップを作りたかったので、`gem sitemap_generator` を使ってサイトマップを作成しました。

## 導入
### bundle install
まずは `Gemfile` に 'sitemap_generator' を追加して `bundle install`。


```Gemfile
gem 'sitemap_generator'
```


### サイトマップの作成
その後 `rake sitemap:install` を叩くと `config/sitemap.rb` が作成され、このファイルがサイトマップの設定ファイルです。

続いて `rake sitemap:refresh` とたたくと `public/` 配下に `sitemap.xml.gz` が作成されます。

設定ファイルをデフォルトで作成されるファイル以外に変更したい場合は、サイトマップを作成する際に以下のオプションをつけます(下記は config/hogehoge.rb に変更)。

```
mv config/sitemap.rb config/hogehoge.rb

rake sitemap:refresh CONFIG_FILE='config/initializers/sitemap.rb' 
```

以上でサイトマップ自体は作成されます。次は実際に設定ファイルを書いていきます。
ちなみに public/sitemap.xml.gz は git 管理したくないので、忘れないうちにここで .gitignore しておきましょう。

```.gitignore
# Ignore sitemap file
public/sitemap.xml.gz
```



## 設定
### サイトマップの設定
基本的には先程作成された設定ファイルにパスを書いていけばいいだけです。

```config/sitemap.rb
SitemapGenerator::Sitemap.default_host = "http://www.example.com"

SitemapGenerator::Sitemap.create do

  # '/articles' を追加する
  add articles_path, :priority => 0.7, :changefreq => 'daily'

  # '/articles/:id' を追加する
  Article.find_each do |article|
    add article_path(article), :lastmod => article.updated_at
  end
  
end
```

上記でしれっと書いているがいくつかのオプションが使えます。詳しくは <a href='https://github.com/kjvarga/sitemap_generator' target='_blank'>github</a> を参照していただければと。

この状態で再度 `rake sitemap:refresh` を叩くと設定ファイルの通りにサイトマップが作られます。

残りは

* サイトマップが自動生成されるようにする
* クローラーにサイトマップの場所を教える

の２つの作業が必要になります。


### 自動生成処理
自動生成は私は、`whenever` を使ってバッチ処理を組みました。
<a href='http://qiita.com/hirotakasasaki/items/3b31966294a809b99c4c' target='_blank'>whenever に関してはこの辺参照</a>

実際に書いたコードは下記

```config/schedule.rb
every 1.day, at: '5:00 am' do
  rake '-s sitemap:refresh'
end
```


### クローラーにサイトマップの場所を教える
これには `gem 'roboto'` を使っているので下記コードを追加します。

```config/robots/production.rb
Sitemap: http://example.com/sitemap.xml.gz
```


## まとめ
以上でサイトマップを作成できるようになります。

### 参考
* <a href='https://github.com/kjvarga/sitemap_generator' target='_blank'>github</a>
倒せウンコード in PHP: MySQLから取ったレコード結果をそのまま使うやつ

RDBでHas Manyな関係のレコードを取得するときはクエリ分割したいよねって話だったんだけど、
なんかキャッチーっぽい感じに直した。

## 前提

- 次のテーブル構造での話
    - `Subjects --(1:n)-+ Subjects_Tags +-(n:1)-- Tags`
    - ![capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/42032/eb3e5464-6c99-8d38-a775-1f21ca228088.png)

- PHPにてSelect結果は(連想)配列で得られるものとする。

## 対象

```sql
SELECT
  S.id,
  S.name,
  T.name AS tag_name,
  T.id   AS tag_id
FROM        Subjects_Tags AS S_T
  LEFT JOIN Subjects      AS S   ON S_T.subject_id = S.id
  LEFT JOIN Tags          AS T   ON S_T.tag_id     = T.id
WHERE
  S_T.subject_id IN ( /* id埋め込み */ )
ORDER BY
  S.id, T.id
;
```

```php
$records = $db->query(/* 省略 */);
```

```php
<?php $lastSubjectId = null; ?>
<div>
<?php foreach($records as $record): ?>
    <?php if ($lastSubjectId === null): ?>
    <h3>name:<?php echo $record['name'] ?></h3>
    <h4>Tags</h4>
    <ul>
    <?php elseif ($lastSubjectId !== $record['id']): ?>
    </ul>
</div>
<div>
    <h3>name:<?php echo $record['name'] ?></h3>
    <h4>Tags</h4>
    <ul>
    <?php endif; ?>
    <li><?php echo $record['tag_name'] ?></li>
<?php endforeach; ?>
<?php if ($lastSubjectId !== null): ?>
    </ul>
<?php endif; ?>
</div>
```

## 倒す

### Query結果のデータ構造を整理する

foreachの中でタグが完結していない。if elseも相まって読みにくい。適切なデータ構造になっていないせいだ。

```php
$records = $db->query(/* 省略 */);
// [id => record] の構造に変換
$subjects = [];
foreach($records as $record){
    if(isset($subjects[$record['id']])){
        continue;
    }
    $record['tags'] = [];
    unset($record['tag_id']);
    unset($record['tag_name']);
    $subjects[$record['id']] = $record;
}

foreach($records as $record) {
    $subject_id = $record['id'];
    $record['id'] = $record['tag_id'];
    $record['name'] = $record['tag_name'];
    unset($record['tag_id']);
    unset($record['tag_name']);
    $subjects[$subject_id]['tags'][] = $record;
}
```

```php
<?php foreach($subjects as $subject): ?>
<div>
    <h3>name:<?php echo $subject['name'] ?></h3>
    <h4>Tags</h4>
    <ul>
    <?php foreach($subject['tags'] as $tag): ?>
        <li><?php echo $tag['name'] ?></li>
    <?php endforeach; ?>
    </ul>
</div>
<?php endforeach; ?>
```

### Queryを分割する

都度わざわざ本来の名前に戻したり、側面に合わせて`unset`しなくてはならない。レコードがSubjectの側面とTagの側面を同時に持っているせいだ。

```sql
SELECT *
FROM Subjects
WHERE id IN ( /* id埋め込み */ )
;

SELECT S_T.subject_id, Tags.*
FROM Subjects_Tags as S_T
  LEFT JOIN Tags ON S_T.tag_id = Tags.id
WHERE S_T.subject_id IN ( /* id埋め込み */ )
;
```

```php
$s_records = $db->query(/* 省略 */);
// [id => record] の構造に変換
$subjects = [];
foreach($s_records as $record){
    $record['tags'] = [];
    $subjects[$record['id']] = $record;
}

$t_records =  $db->query(/* 省略 */);
foreach($t_records as $record) {
    if (empty($subjects[$record['subject_id']])) {
        // Updateが挟まれなければ滅多にcontinueされない
        continue;
    }
    $subjects[$record['subject_id']]['tags'][] = $record;
}
```


### 成果

- 構造化データを利用することで、テンプレート部分の可読性が向上した。
- SQLからカラムの別名を排除した。

### リスク

- クエリ分割によって、ひとかたまりのデータ塊ではなくなった。分割前とくらべてデータが不安定になる。
- クエリ分割した分のオーバーヘッドが発生する。
コードを一行も書かずにHello Worldする方法

1. Xcodeを起動。
2. Fileメニューから「New」-「Project…」を選択。
3. 「Single View Application」を選択して「Next」。
4. Product Nameに「HelloWorld」、LanguageにSwiftを選択して「Next」。
5. 保存場所を指定して「Create」。
6. HelloWorldプロジェクトが開かれる。
7. 最上部左の再生アイコン（▶️）を選択するか、Productメニューから「Run」を選択。
8. シミュレータが起動され、しばらく待つと真っ白い画面のアプリが実行される。
9. 初めてのiOSアプリ開発を体験した喜びと興奮に身を震わせ、最後に大きな声で「Hello World!」と叫ぶ。
【AWS】S3のBucket-ACLとObject-ACLとバケットポリシーどれが強いのか？

##はじめに

S3のアクセス制御に「アクセスコントロールリスト(ACL)」と「バケットポリシー」がありますが
違いがさっぱり分からなかったので整理してみました。
※AWS初心者のため、信憑性に欠けている部分があるかもしれません

##ACL
AWSアカウントに対して、バケットとオブジェクトのそれぞれに「読み取り/書き込み」の「許可/拒否」を設定することができる。
※バケットにつけるACLをBucket-ACL、オブジェクトにつけるACLをObject-ACLと呼ぶ

##バケットポリシー
バケットごとに、IAMユーザやグループに対してアクセス許可を設定することができる。
条件付きアクセス許可やアクセス拒否の設定もできる。(ACLではできない)

##Bucket-ACLとObject-ACLとバケットポリシーの強さ
Bucket-ACLとObject-ACLとバケットポリシーの3つの強さランキングは以下になる。
1. バケットポリシー
2. Object-ACL
3. Bucket-ACL

|No|Bucket-ACL |Objcet-ACL|バケットポリシー|結果|
|:--|:----------|:---------|:---------------|:---|
|1|許可	    |許可	   |拒否	        |失敗|
|2|許可	    |未設定	   |拒否	        |失敗|
|3|許可	    |許可	   |許可	        |成功|
|4|許可	    |未設定	   |許可	        |成功|
|5|許可	    |許可	   |未設定	        |成功|
|**6**|**許可**	    |**未設定**	   |**未設定**	        |**失敗**|
|7|未設定	    |許可	   |拒否	        |失敗|
|8|未設定	    |未設定	   |拒否	        |失敗|
|9|未設定	    |許可	   |許可	        |成功|
|10|未設定	    |未設定	   |許可	        |成功|
|**11**|**未設定**	    |**許可**	   |**未設定**	        |**成功**|
|12|未設定	    |未設定	   |未設定	        |失敗|
※参考にしたサイトはこちら
http://dev.classmethod.jp/cloud/aws/s3-acl-wakewakame/

表の結果を見ると、バケットポリシーの設定によって成功か失敗か決まるのが分かる。
また、バケットポリシーが未設定の場合、ACLの設定によって成功か失敗か決まる。

ここで疑問に思ったのは**No6**と**No11**の結果の違いについて。
Bucket-ACLとObjcet-ACLの設定の違いによって結果が違っている。

この理由についてははっきりわかっていないので、後日追記します。
ASP.NET Core - SSLを有効化する

# 開発環境
- .NETCoreApp 1.1
- Windows10 Pro
- Visual Studio Community 2017
- IIS Express

# Linuxの場合
http://qiita.com/upopo21/items/f2ffd9f26c94b11e538b

# セットアップ
まず，認証機能を有効にしたMVCテンプレートを作製します．
(参考: http://qiita.com/musubi05/items/a90954d08aff5ea5369c)

# SSLの有効化
Properties/launchSettings.jsonを開き，SSLのポートを開きます．
"sslPort"の項目を，44300から44399中の好きなポート番号に変更します．

```json:launchSettings.json
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:49455/",
      "sslPort": 44385
    }
  },
  "profiles": {
    ~~略~~
  }
}
```

これで，https://localhost:44385/ にアクセスできるようになります．

# HTTPSへ自動リダイレクトする
Startup.csのConfigureServicesメソッド内に記載されている，```services.AddMvc();```を次のように記載します．
すると，httpポートでのアクセスが，すべてhttpsにリダイレクトされるようになります．

```C#:Startup.cs
using Microsoft.AspNetCore.Mvc; // RequireHttpsAttributeを参照するために必要

public void ConfigureServices(IServiceCollection services)
{
    // 中略
    services.AddMvc(options =>
    {
        options.SslPort = 44385;
        options.Filters.Add(new RequireHttpsAttribute ());
    });
    // 中略
}

```

# 参考
- https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
Gitの考え方と使い方

Git勉強したての頃のメモ書きを修正して、残しておこうっと。
間違っていたら都度更新します。

## Gitって？
ざっくり、ローカルにおいてある作業フォルダの変更履歴を覚えさせておく仕組みのこと。
gitを使う（有効にする）には、2ステップ必要。

1. gitツールをダウンロード　
   - https://git-scm.com/download
2. このフォルダはgitで管理するよ！と宣言する
   - 対象のディレクトリ内で、`$ git init`を実行。

## Githubって？
Gitで管理するリポジトリの履歴をネットワーク上にも持たせておくことができるサービスのこと。
2方向の使い方がある。

1. すでにGithubに置いてあるアプリケーションを、自分のローカルで動かしたい。  
 -> リモートリポジトリをローカルにコピーする。
2. 自分がローカルで作ったアプリケーションをGithubに置く。  
 -> ローカルリポジトリを、リモートリポジトリに反映させる。

## 4つのステージ
ローカル＆リモートどちらもで同時にGit管理するなら、4つの段階があることを意識する必要がある。

1. 作業ディレクトリ（ワーキングツリー）<br>
⬇︎ `git add　　　　　　　　//コミットの対象のファイルをステージングエリアへ移動`
2. ステージングエリア(indexエリア）<br>
⬇︎ `git commit　　//ローカルリポジトリへコミット `
3. ローカルリポジトリ<br>
⬇︎ `git push　　　　　 //ローカルリポジトリのコミット内容をリモートへ反映 `
4. リモートリポジトリ

## 用語集
### ブランチをきる  
```
git branch {ブランチ名}
```

今いるブランチから、新たに派生するブランチを作ること。
ブランチは、マージがすでにされていれば削除可能。
どのブランチの最新でもないコミットをチェックアウトすると、HEADタグが現れる。

**注意** 
- HEADタグに対してはコミットを行わない！！以降の変更がすべて破棄される！
ただし、誤ってHEADタグにコミットしても、ブランチとしてつなぎなおせば以降の変更も大丈夫。
- ブランチだけ作って、他のユーザと共有したい時、ブランチだけpushする必要がある。  

```
git push origin {ブランチ名}
```

### リベースとマージの違い
#### リベース
- 概要：すでに作成してコミット履歴のある作業ブランチの派生元ブランチの分岐ポイントを一旦切り離して、元ブランチの最新コミットに付け替えること。
- メリット：ブランチの履歴を汚さずに、派生元ブランチの履歴を自分の作業ブランチに取り込むことができる。
- デメリット：歴史を変えてしまうので、注意！　リベースするブランチには自分以外に触っている人がいないことが前提！

#### マージ
- 概要：すでに作成してコミット履歴のあるブランチを、派生元ブランチの最新コミットへ結合すること。
- メリット：ブランチの履歴を変えずに、派生元ブランチの履歴を作業ブランチに取り込める
- デメリット：ブランチの履歴に矢印がいっぱいできてしまって見た目が良くない。

#### 共通点
派生ポイントのコミットと最新コミットとの間では他の開発者による作業が反映されている可能性があるため、競合が発生する可能性が高い点に注意すること。


## Command集
[Sourcetree](https://www.sourcetreeapp.com/https://www.sourcetreeapp.com/)(視覚的でおすすめ！)を使っているのであんまりコマンド使うことないけれど、リカバリの時とか、リベースしたい時なんかはコマンドの方がわかりやすいので覚書。

### `git diff`
変更内容を見る


### `git commit -am "コメント内容”`
ADDとCOMMITを同時に行う。

### `git pull origin master / push `
それからconflictをfixする。

### `git push origin master`
masterをoriginにPUSHする

### `git rebase　{派生元ブランチ} {派生ブランチ}`
派生ブランチを最新の派生元ブランチに付け替える

## Option tips
ローカルリポジトリは1つで、リモートリポジトリを2つ認識させて、コミット・プッシュを2つに対して同時に行いたい場合どうするか？
-> `.git/config`の`origin:　git@github.com:{user名}/{repo名}.git`をもう1行追加するだけ。
scrollviewの画像をドラックしたら、はみ出る

scrollviewの中に定義した画像にPan Gesture Recognizerを付けて画像をドラックしてたのですが、scrollviewの外に出たら画像をViewの下に消えていきます。それを制御するための機能があったので備忘録として書いておきます

# 消える


![no.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/807759a6-fa1f-b2b2-0b64-43f83c5263be.gif)

```swift

 override func viewDidLoad() {
        super.viewDidLoad()

ScrollView.clipsToBounds = true

}

```

# 消えない


![yes.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/811416e4-b067-6bcf-37c2-80ad608d8f49.gif)


```swift

 override func viewDidLoad() {
        super.viewDidLoad()

ScrollView.clipsToBounds = false

}

```
Ubuntu 16.04でgcc-4のエラー

Ubuntu16.04はデフォルトでgcc-5系を使っているはずなのに、
以下のリンクのような、gcc-4系のせいで落ちるエラーが発生。
https://github.com/BVLC/caffe/issues/5128

使っていそうなgccはgcc-5のリンクになっている。
`$ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 14  6月  7 09:31 /usr/bin/gcc -> /usr/bin/gcc-5`

apt-getで入れなおしても直らない。
`sudo apt-get install libgcc-5-dev`

`whcich gcc`
で確認すると、[anaconda](https://www.continuum.io/downloads)内のgccを参照するようになっていた。
anacondaをインストールすると、gccの参照先が自動で変わってしまうらしい。

condaでgccを入れなおすと解決した。
`conda install -c salford_systems libgcc-5=5.4.0`
https://anaconda.org/salford_systems/libgcc-5
iOS定期購読課金 クロスグレード

2016/9より定期購読課金にてクロスグレード、アップグレード、ダウングレードの機能が提供されました。
この機能が提供される前は定期購読を解除しその購読の期限が切れたのちに別のアイテムを登録しなければいけませんでした。
スムーズにアイテムを乗り換えることができてよいですね。
アップグレード、ダウングレードについてはまたの機会にまとめます。

# クロスグレードとは

iTunes Connectにて登録する課金アイテムのうち、**同グループかつ同レベル** にて適用されるもの。
ある定期購読アイテムから別のアイテムに変更する場合にスムーズに行えるためのものです。
同じサービス提供の場合に使うイメージかと思うので、購読期間が同じ場合はあまり使う用途はないかもしれないですね。

## 仕様
以下は課金アイテムが同グループ内であることを前提としています。
### アイテムの購読期間が同じ場合
|レベル       |アイテム      |期間　　　　　　|
|:-----------|------------:|:------------:|
|1           |アイテムA     |1ヶ月 　　　　　|
|1           |アイテムB     |1ヶ月 　　　　　|

アイテムA→B、もしくはB→Aにクロスグレードする場合
即日課金され、乗り換え前の課金は登録日から乗り換え日までの金額をApple側で計算されて返金されます。

:warning: こちらは実際に試していないためレシート検証結果は予想となりますが、AもBも有効期限内のレシートとなると思われます。

### アイテムの購読期間が異なる場合
|レベル       |アイテム      |期間　　　　　　|
|:-----------|------------:|:------------:|
|1           |アイテムA     |1ヶ月 　　　　　|
|1           |アイテムB     |12ヶ月 　　　 　|

アイテムA→B、もしくはB→Aにクロスグレードする場合
乗り換え前の課金(Aとする)の有効期限まではAが有効、Bはまだ有効ではない。
有効期限のタイミングでApple側で課金の乗り換えが発生し、Aは有効期限切れとなりBが新たに登録される。

乗り換え時にレシートを検証しても乗り換え前のレシートのみが有効という情報しかとれず、クロスグレードしたかどうかはわかりません。
バッチ処理等で乗り換え前のレシートの有効期限時にレシートを再取得すると、乗り換え前のアイテムは更新されず、乗り換えしたアイテムのレシートが新たに追加されています。

## まとめ

ユーザからすると乗り換えがスムーズで便利な機能だと思います。また2重課金を防ぐことができる点もよいですね。
検証する側としてはアイテムのグループやレベルによってレシート管理が少し複雑と感じました。
YOLOv2(TensorFlow)を使ってリアルタイムオブジェクト認識をしてみる

#はじめに
これまで、オブジェクト検出としてBING、Selective Search、Faster-RCNNといった手法を試してきました。
今回は現在(2017/6月)のところ最速であろうYOLO(v2)を試したみたいと思います。
オリジナルはC言語で書かれています。 https://pjreddie.com/darknet/yolo/
・過去の記事はこちら
[CNNの前処理としてOpenCVでBINGを使ってみた](http://qiita.com/Almond/items/ad56ce29112d6397a704)
[R-CNNとしてSelective search を使ってみた](http://qiita.com/Almond/items/7850cf81903fbe2a2c6c)
[Faster R-CNNを使ってリアルタイムオブジェクト検出をしてみよう](http://qiita.com/Almond/items/a85b77fb98df11aa9cbe)

#実行環境
OS: Ubuntu16.04LTS
GPU:GTX-1050
Python:3.5
CUDA8.0
cuDNN5.1

#準備
大変ありがたいことに、TensorFlowを使用したバージョンを公開されてますので今回は[こちら](https://github.com/thtrieu/darkflow)を使います。
（C++でラッパークラスを作ったりもしましたがPythonを使いたいので）
インストールはReadmeに書かれている内容通りなのでつまずくことはないと思います。
（※TensorFlowとOpenCVをインストールしていない場合は、事前にインストールしてください）

GitHubからクローンして、フォルダに入ります。
`git clone https://github.com/thtrieu/darkflow.git`
`cd darkflow`
YOLOのホームページからweightファイルをダウンロードしておきます。
`wget https://pjreddie.com/media/files/yolo.weights`

インストール方法は下記の３通りあります。自分の環境に合わせてインストールしましょう。
■方法１（：この方法でインストールする場合は、グローバルにインストールされていないため、フローの代わりに複製されたダークフローディレクトリで./flowを使用する必要があります。）
`python3 setup.py build_ext --inplace`
■方法２（pipを使ってグローバルにインストールします。グローバルアクセス可能だが、この場合コードへの変更はただちに有効になる）
`pip install -e . `
■方法3（pipを使ってグローバルにインストールします）
`pip install .`

#サンプルコード
難しいところは特に無いですね。
`bin/yolo.weights`には先程ダウンロードしたweightファイルのパスが入ります。
結果`result`にはJSON形式で結果が格納されます。あとはこれをパースして描画などをします。
※`gpu:1.0`はGPUの使用率です。私の環境では、1.0にするとOut Of Memoryのエラーが出たので0.6に設定してます。


```
from darkflow.net.build import TFNet
import cv2

options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1, "gpu": 1.0}

tfnet = TFNet(options)

imgcv = cv2.imread("./sample_img/dog.jpg")
result = tfnet.return_predict(imgcv)
print(result)
```

#結果
![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/99765/2eb2182b-b1eb-c9cb-66c7-ff5e9baba592.png)

#まとめ
今回、TensorFlowを使用しましたが、
他にもKeras,Chainer等のバージョンが GitHubにアップされているので
自分の好きなフレームワークを使用してYOLO(v2)を試してみてください。
[Kerasバージョン](https://github.com/allanzelener/YAD2K)
[Chianerバージョン](https://github.com/leetenki/YOLOv2)
しかし、最新の手法が色々なフレームワークで簡単に試せるのは非常にありがたいですね。
私も、人々の役に立つソースを提供したいと思う今日このごろです。
sudoとタイムスタンプファイル

sudoコマンドを使っていると、一度パスワードを入力すると二回目以降しばらくの間パスワードを入力する必要がないという現象に遭遇するかと思います。

これはチケッティング (ticketing) と呼ばれる機能で、sudoコマンドの内部でタイムスタンプファイルを作成・管理することで実現しています。タイムスタンプファイルは、Ubuntu16.04LTSの場合は``/var/run/sudo/ts/``、CentOS7の場合は``/var/db/sudo/``の下に作成されます。

このタイムスタンプファイルが何らかの理由で邪魔な場合、以下のコマンドを実行すると、タイムスタンプファイルが削除されます。

```shell-session
$ sudo -K
```

これで、次回sudo実行時にはパスワード入力が必要になります。

以上、なぜかmanに載っていないsudoの仕様でした。

#リファレンス

sudo公式サイト
https://www.sudo.ws/
Vue.js 算出プロパティ(computed)でクラスを作るテクニック

# はじめに

vue.jsの算出プロパティ（computed）を利用して、内部クラスっぽいものを作るという
裏技的な利用例を紹介します

## 例

以下の例は、身長・体重の値から、BMIと血液量を算出し、表示するプログラムです。
算出プロパティは一般的に値やプレーンオブジェクトを返り値としますが
ここでは health の返り値を **関数を含んだオブジェクト** にしています。

```html
<body>
	<div id="app">
		<ul>
			<li>身長 : {{height}} cm</li>
			<li>体重 : {{weight}} kg</li>
			<li>BMI : {{health.getBmi()}}</li>
			<li>血液量 : {{health.getBloodVolume()}} kg</li>
		</ul>
	</div>
	<script>
		var vueOption = {
			el : '#app',
			data : {
				height : 165, // 身長（cm）
				weight : 63   // 体重（kg）
			},
			computed : {
				// 詳細情報算出クラス
				health : function(){
					var _this = this;
					return {
						// BMIを算出
						getBmi : function(){
							var h = _this.height / 100;
							return _this.weight / ( h * h );
						},
						// 血液量を算出
						getBloodVolume : function(){
							return _this.weight / 13;
						}
					}
				}
			},
		};
		var app = new Vue(vueOption);
	</script>
</body>
```

## 実行結果

テンプレート上で `{{health.getBmi()}}` `{{health.getBloodVolume()}}` と記載した部分に
計算結果が出力される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/151078/0d1e17ad-ddf6-a345-9eec-a10124309588.png)

## 使い道あるの？
現時点では思いつかないです

- 複数のメソッドをある名前空間(health)の元に記載したい
- 一部の関数をあるオブジェクト(health)の元にネストさせたい
- vueオブジェクト内でメソッドチェーンを作りたい
- （コンポーネントシステムを使わない場合）肥大化しがちなメソッドを分割して管理したい

（ちなみに、methods はこのような使い方はできないです）

## おわりに
もし有用な使い方を見つけたら教えてください

「いいね」していただけると嬉しいです！
Python3: OpenCV で顔認識

次のページを参考にしました。

[OpenCVで顔認識をしてみた](http://qiita.com/K_M95/items/f1a3e7c47800adb94095)

入力ファイル
![family-557100_1280.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/fa571ab7-f920-155d-439b-3c9f35b1841b.jpeg)

出力ファイル
![family_after.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/37cf8322-3839-9b0c-c2f0-844cc81a590e.jpeg)

```py3:front_face.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#						May/16/2021
# ------------------------------------------------------------------
import cv2
import sys

sys.stderr.write("*** start ***\n")

image_file = sys.argv[1]
image_after = sys.argv[2]

folder="/usr/share/opencv4/haarcascades/" 
#cascade_file = folder + "haarcascade_frontalface_alt.xml"
#cascade_file = folder + "haarcascade_frontalface_alt2.xml"
#cascade_file = folder + "haarcascade_frontalface_alt_tree.xml"
cascade_file = folder + "haarcascade_frontalface_default.xml"

img = cv2.imread(image_file)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cascade = cv2.CascadeClassifier(cascade_file)
width=100
face_list = cascade.detectMultiScale(img_gray, minSize=(width, width))

if len(face_list) == 0:
	sys.stderr.write ("Fail recognise\n")
	quit()

for (x, y, w, h) in face_list:
	print("顔の座標 =", x, y, w, h)
	color = (0, 0, 225)
	pen_w = 8
	cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness = pen_w)

cv2.imwrite(image_after, img)

sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./front_face.py family-557100_1280.jpg family_after.jpg
```

次の環境で動作を確認

```text
Arch Linux (5.4.13-arch1-1)
Python 3.8.1
```

Arch Linux で　カスケードのファイルを探す方法

```bash
pacman -Ql opencv | grep haarcascade
```
スパムを防ぐメールアドレスのマークアップ

##メールアドレスのマークアップで悩んだのでメモ


~~解決方法~~
~~メールアドレスをHTMLエンティティ化して、マークアップ。~~
~~HTMLエンティティ表記とは，"&"と";"の間に文字コードを記述して文字を表示方法。~~


＊2017年6月19日追記
コメント欄で指摘いただいているように、スパム対策にはなりません。
別の方法を推奨します。



HTMLエンティティ変換サイト↓
http://hp.vector.co.jp/authors/VA022023/javascript/make_html_entity-ja.htm

参考にしたサイト
http://www.icts.nagoya-u.ac.jp/ja/security/address-open.html#entity


※ただ、お問い合わせフォームを設置するのが一般的です。
【メモ】量指定子を変えると正規表現の実行速度が桁で変わる（仮）

```python
In [1]: import re

In [2]: %timeit re.match(r'\d*', '1'*1000000)
12.5 ms ± 112 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [3]: %timeit re.match(r'\d{0,}', '1'*1000000)
49.9 µs ± 200 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [4]: %timeit re.match(r'\d+', '1'*1000000)
12.5 ms ± 103 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [5]: %timeit re.match(r'\d{1,}', '1'*1000000)
49.7 µs ± 1.29 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [6]: %timeit re.match(r'\d?', '1'*1000000)
50.3 µs ± 1.75 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [7]: %timeit re.match(r'\d{0,1}', '1'*1000000)
49.8 µs ± 417 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

```

　すべて`*`、`+`、`?`記法よりも`{n,m}`記法の方が速い。

---

以下、Regular Expression はもっと Expression を Regular にすべきという方向で話を進めていく予定です。
SourceTree v2.1.2.5 > 利用可能になったが、すでにいくつかのバグ報告がある > ローカルファイルの削除バグ? | 起動しなくなるバグ

```txt:動作環境
Windows 7 Pro (32bit)
SourceTree v2.1.2.4
```

ローカルリポジトリのソースファイルがごっそり消えた。
v2.1.2.4のバグだろうか。
リモートから取り直したが、再発すると問題だ。

v2.1.2.5が利用可能になっているが、すでにいくつかのバグ報告がある。

[Broken Windows SourceTree 2.1.2.5 with Embedded Git 2.12.2 + git-lfs v2.0.2](https://community.atlassian.com/t5/SourceTree-discussions/Broken-Windows-SourceTree-2-1-2-5-with-Embedded-Git-2-12-2-git/td-p/597821)

[SourceTree 2.1.2.5 Windows. Track Remote Branch, Options Disabled](https://community.atlassian.com/t5/SourceTree-questions/SourceTree-2-1-2-5-Windows-Track-Remote-Branch-Options-Disabled/qaq-p/597628)

[Update 2.1.2.5 shows deleted branches](https://community.atlassian.com/t5/SourceTree-questions/Update-2-1-2-5-shows-deleted-branches/qaq-p/597863)

v2.1.2.4で様子を見るほうが良さそう。

最近のSourceTreeはきちんとバグを取り切らずにリリースしている印象がある。


https://www.sourcetreeapp.com/update/windows/ga/ReleaseNotes_2.1.2.5.html

### 症状の再現
(追記 2017/07/04)

バージョンは未記載だが、ローカルリポジトリのファイルが消えた報告があがっている。
[Souretree delete my all project contents in local! ](https://community.atlassian.com/t5/SourceTree-questions/Souretree-delete-my-all-project-contents-in-local/qaq-p/604268)

(追記 2017/07/18)
自分の例を含めて3件の発生が確認されている。


### 起動しなくなるバグ
(追記 2017/07/11)

[SourceTree 2.1.2.5 will not launch on windows 7](https://community.atlassian.com/t5/SourceTree-questions/SourceTree-2-1-2-5-will-not-launch-on-windows-7/qaq-p/606822)

v2.1.2.5を使用していく中で、ある時からSourceTreeが起動しなくなったという症状。
v2.1.2.4使用では今のところ発生していないが、v2.1.2.5の特有のバグなのかは不明。

.NET Framework関連の初期化エラーのような感じではある。

どのバージョンが安定してセキュリティ上の問題も少ないか、微妙なソフトになっている。
関数テンプレートの呼び出しに優先順位をつける

[ブログ記事](http://secret-garden.hatenablog.com/entry/2016/12/27/043841)からの転載です。

[初心者C++er Advent Calendar 2016](http://www.adventar.org/calendars/1691) 20日目の記事です。  
クリスマスが終わって『もはや Advent Calendar とは…』となってるんですが、まあ埋まってないより埋まってるほうがいいかなーと。  
今回は初心者向けかどうか怪しい内容ですが、ちょっとしたハックでも。  
なお、この記事は SFINAE を知ってる事が前提の記事になります。  

## [コード]

さて、次のように SFINAE を利用して『`a + a`ができる型(値)のみ』受け付けたい関数テンプレートを定義したいことがあると思います。  

```cpp
template<typename T>
auto
twice(T a)
// decltype() 内で式を記述することで a + a を要求する
->decltype(a + a){
	return a + a;
}

// 42 + 42 は有効なので OK
twice(42);         // 84

// 3.14f + 3.14f も有効なので OK
twice(3.14f);      // 6.28

// "homu" + "homu" は無効なので NG
twice("homu");
```

まあここまではよくあるコードだと思います。  

## [問題]

このような関数テンプレートを定義した場合に『それ以外にマッチする関数』も定義したいことがあると思います。
  
```cpp
// a + a が有効でない引数の場合に呼び出す関数を定義
template<typename T>
auto
twice(T t){
	return t;
}

twice("homu");        // "homu"
```

これでよかったよかった…とはならずに、次のように『`a + a`ができる型(値)』を渡した場合にエラーになります。  

```cpp
// Error: call of overloaded 'twice(int)' is ambiguous
twice(42);
```

http://melpon.org/wandbox/permlink/GqFem4RxFct7gvqF

これは `twice(int)` 時に『両方の関数に該当するため』呼び出しが解決できないためです。  

## [解決]

解決策はいくつかあるんですが、次のようにして『オーバーロードを解決するため引数』を追加することで比較的簡単に回避することが出来ます。  

```cpp
// 引数に int を追加する
template<typename T>
auto
twice(int, T a)
->decltype(a + a){
	return a + a;
}

// 引数に bool を追加する
template<typename T>
auto
twice(bool, T t){
	return t;
}

// int 型の値を関数に渡すことで最初に定義した関数の方を優先して呼び出されるようになる
twice(0, 42);        // 84
twice(0, 3.14f);     // 6.28
twice(0, "homu");    // "homu"
```

http://melpon.org/wandbox/permlink/WeEUFMV8MGEZRkyb

これは `twice(0, 42)` の場合は `twice(bool, T)` よりも `twice(int, T)` にマッチし、`twice(0, "homu")` の場合は SFINAE によって `twice(int, T)` がオーバーロードの候補から外れ、`0` が `bool` 型に暗黙の型変換されるので `twice(bool, T)` にマッチするためです。  
まあ、要するに

```cpp
void func(int);
void func(bool);

// func(int) を呼び出す
func(0);
```

ということを利用しているだけですね。  

## [ちょっと改良]

上記のままだと毎回 `0` を渡す必要があるのでラッパ関数を用意すると使い勝手がよくなります。  

```cpp
template<typename T>
auto
twice_impl(int, T a)
->decltype(a + a){
	return a + a;
}

template<typename T>
auto
twice_impl(bool, T t){
	return t;
}

template<typename T>
auto
twice(T t){
	// ラッパ関数を用意して、その中で twice の実装を呼び出す
	return twice_impl(0, t);
}

twice(42);        // 84
twice(3.14f);     // 6.28
twice("homu");    // "homu"
```

http://melpon.org/wandbox/permlink/lwTkvXx39ptEP6TN

これでユーザコードからこのハックを隠蔽する事が出来ました。  

## [まとめ]

と、言う感じで簡単なハックを紹介してみました。  
SFINAE を使った関数を定義しているとこういう『オーバーロードが解決できない関数』が結構出てくるんで地味に重宝します。  
もうちょっと汎用的にしたコードが下記の記事に載ってるので気になる方は読んでみるとよいです。  

## [参照]

* [オーバーロードに優先順位を付ける  - とくにあぶなくないRiSKのブログ](http://sscrisk.hatenablog.com/entry/20110916/1316182355)
* [複数条件での enable_if その2 - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20110917/1316234864)
AWS LambdaからEC2上のPythonを実行(Run Command)する際の注意点

http://qiita.com/tf_qiita/items/90b4ec315d179b5d9b9c

上記の問題を解決したのでメモ。

#手順1：実行バージョンの指定
LambdaからEC2 Run Commandを利用するとき、Run Commandは対象のEC2インスタンスで有効となっているPythonの実行ファイル**ではなく**、そのインスタンスの初期状態で設定されているバージョンを実行します。(Amazon Linux系ならば今日現在は2.7.12)

そのため、標準と異なるバージョンのPythonを実行する場合は、下記のようにLambdaに記述するRun Commandで実行ファイルをフルパスで指定します。
下記の例ではpyenvに構築した環境を指定しています。
Lambdaはroot実行となるため、pyenvをrootで構築していますが、直接指定して実行するのであれば実行用のユーザを構築するで良いと思います。

```py:lambda.py
ssm.send_command(
    InstanceIds = instances,
    DocumentName = "AWS-RunShellScript",
    Parameters = {
        "commands": [
            "/root/.pyenv/versions/anaconda3-4.4.0/bin/python /work/hoge.py", 
        ],
        "executionTimeout": ["3600"]
    },
)
```

#手順2：ライブラリパスの追加
手順1では環境変数に実行するPythonのパスを追加せずに所要のバージョン(環境)を実行するため、そのままではライブラリのimportができません。
そのため、Lambdaから呼ばれるEC2側のスクリプトの先頭で`site-packages`のパスを追加することで、ライブラリを読み込むことができるようになります。
下記の例では手順1で指定した環境配下の`site-packages`を指定しています。

```py:ec2.py
import sys
sys.path.append("/root/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/")
```

#感想
当初からパス周りの問題と想定はしていましたが、Lambda側とEC2側で原因の切り分けに手間取ってしまいました。
また、バージョンが指定が機能として提供されているのか調査することに無駄な労力を使ってしまうといった、マネージドサービスならでは？の失敗がありました。
今後も同様な低レイヤでのつまづきが予見されますが、その際はこの経験を思い出して基本に立ち返って考えたいです。
コマンドラインでyoutube再生する

[mpv-player/mpv](https://github.com/mpv-player/mpv)


## インストール

Macでやりました
https://mpv.io/installation/

brewで入る
```
$ brew install python3 mpv mplayer
```

## 使い方

#### 再生

```

# 動画再生
$ mpv [URL]
$ mpv --playlist=./playlist.list

# 音声のみ、シャッフル、ループ再生
$ mpv --no-audio --shuffle --loop-playlist --playlist=./playlist.list

# オプション表示
$ mpv --list-options
```

#### ショートカットキー

他の機能は以下で
https://mpv.io/manual/master/#keyboard-control

```none
    F7        前の動画へ
    Enter/F9  次の動画へ
    M/F10     ミュート
    p/F9      Pause
    q         Quit
    [         再生スピード -0.10
    ]         再生スピード +0.10
    9/F11     Volume -2%
    0/F12     Volume +2%
```