OmniAICreator/Qiita-1.07M huggingface dataset:
github初心者-備忘録

# 久しぶりにgithubを触ろうとしたら色んなエラーが出てssh接続できなくなったので、コマンドプロンプトをやめて、GitBashで鍵生成からやり直した

※今までgithubでの多人数開発経験はほんのちょっとだけ。
小型案件を実装自分ひとりでこなすことが多かったので、backlogのgitホスティングサービスを利用していた。
その際はsourcetreeを利用していたのでCUIはまだ不慣れ。
コマンドに早く慣れたい。

## エラー
`could not open a connection to your authentication agent.`
とか
`warning:Permanently added the RSA host key for IP address '{IP address}'to the list of known hosts.
Permission denied(publickkey).`

## やったこと
- ~/.ssh/known_hosts の履歴を消す
- 他アカウントで同じ鍵を登録していたのでそちらを削除（うっかりど忘れ）


色んなブログや書籍を見ても解決できなく、結局オフィシャルの案内に合わせてGitBashで鍵を作り直すことにした。
【Git help】
Generating a new SSH key and adding it to the ssh-agent
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/
DockerfileでSSH鍵認証ができるイメージを作る

下記のDockerfileでイメージを作ると、コンテナを作る時にSSH公開鍵を変数として渡すことができます。

```
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server openssh-client && \
    apt-get clean && mkdir /var/run/sshd

RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh && \
    echo "echo \$AUTHORIZED_KEYS > /root/.ssh/authorized_keys" > /run.sh && \
    echo "chmod 600 /root/.ssh/authorized_keys" >> /run.sh && \
    echo "/usr/sbin/sshd -D" >> /run.sh

EXPOSE 22
CMD ["/bin/bash", "/run.sh"]

```

まずはこのDockerfileで、例えば`ubuntu1604ssh`という名前のイメージをビルドします:

```bash
$ docker build -t ubuntu1604ssh .
```

このイメージに対して`-e AUTHORIZED_KEYS="$(cat ~/.ssh/id_rsa.pub)"`というオプションをつけて公開鍵を指定すると、SSH鍵認証が可能になります。コマンドは下記のようになります:

```bash
$ docker run -p 2233:22 --name=cn01 -e AUTHORIZED_KEYS="$(cat ~/.ssh/id_rsa.pub)" -dt ubuntu1604ssh
```

sshのコマンドはこんな感じです:

```
$ ssh -p 2233 -l root localhost
```

何度か繰り返す際にStrictHostKeyCheckingでエラーになってしまう場合は、下記のようにStrictHostKeyCheckingを無効にするという手もあります。（* セキュリティー・リスクがありますので自己責任で。）

```
$ ssh -o StrictHostKeyChecking=no -o LogLevel=FATAL -p 2233 -l root localhost
```

Dockerfile内で重要なのは下記の部分です。この部分を理解してしまえばどのディストリビューションにも適用できます。

```
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh && \
    echo "echo \$AUTHORIZED_KEYS > /root/.ssh/authorized_keys" > /run.sh && \
    echo "chmod 600 /root/.ssh/authorized_keys" >> /run.sh && \
    echo "/usr/sbin/sshd -D" >> /run.sh
```

一応、主要なディストリビューションは一通り作ってしまったので他のディストリビューションでこの方法を試したい方は下記のレポジトリを覗いてみてください。

- [kjtanaka/dockerfile-ssh-key-auth](https://github.com/kjtanaka/dockerfile-ssh-key-auth)


## 参考になったリンク
- [tutumcloud/tutum-centos](https://github.com/tutumcloud/tutum-centos.git)
TwitterのGemを使ってFollowした人の一覧を取ろうとしたらちょっとハマった件

RubyのTwitter Gemで、TwitterのFollowした人一覧を表示しようとして少しハマったのでメモ。
使ったのはこれ。

https://github.com/sferik/twitter

息が長くメンテされているGemですね

## 普通にeachで回すとRate Limit Exceeded

```
twitter = Twitter::REST::Client.new do |config|
  config.consumer_key = ENV["CONSUMER_KEY"]
  config.consumer_secret = ENV["CONSUMER_SECRET"]
  config.access_token = ENV["ACCESS_TOKEN"]
  config.access_token_secret = ENV["ACCESS_TOKEN_SECRET"]
end

@friends = twitter.friends
```

こんな感じでフォローした人一覧を取得して、View側で

```
- @friends.each do |user|
  p = user.screen_name
```
のようなことをやると、いきなりRate Limit Exceededエラーを喰らいました。

これは、フォローしている人を取得するAPIの呼べる制限が15分に15回と定まっていて、1000人ぐらいフォローしている私のアカウントでやると
1000 / 20 = 50回、一瞬でコールしてしまうからですね。

https://dev.twitter.com/rest/reference/get/friends/list

## 20件に絞ってページングで随時取りたい

そもそも一回の取得で全件取りたいわけではなく、順次続きを読み込んでいくものを実装したかったのでそれのやり方を調べました。

```
twitter.friends.attrs
```

とやると、取得した20件のハッシュの配列が返ってきます。
この状態であれば、to_aしたりeachで回したりしても20件に絞られているのでAPIリクエストが発生しないのでエラーが出ずに表示できます。

しかし、アクセス方法が `user.screen_name`ではなく`user[:screen_name]`のようになってしまうのがつらいです。

## 20件に絞ってhashではなくclassのインスタンスとしてアクセスしたい

```
twitter.friends.take(20)
```

のようにやると、20件返ってきて、Twitter::Userクラスのインスタンスなので`user.screen_name`のようにアクセス可能です。

## 次の20件を取りたい

`twitter.friends.attrs`で返ってくるhashに、:next_cursorというものが含まれています。
これを使うと次の20件を取得することができます。具体的には、

```
twitter.friends(cursor: {next_cursorの値})
```
のように呼び出します。

ついでに、countという引数で取得件数を20〜200件の間で調整できるので、基本的に全friendsを舐めるようなサービスを作るのであれば200件取得した方がリクエスト数を減らすことができてAPI Rate Limitに達しにくくなります。

まとめると、最初のアクセス時は直近20件を取得し、「次へ」ボタンを押した時にその次の20件を取得する、の実装例としては以下のようになります。

* controller

```
def TwitterFriendsController < ApplicationController
  FRIENDS_COUNT = 200.freeze

  def index
    response = twitter.friends(cursor: params[:cursor], count: FRIENDS_COUNT)
    @next = response.attrs[:next_cursor]
    @friends = response.take(FRIENDS_COUNT)
  end

  private

    def twitter
      @twitter ||= Twitter::REST::Client.new do |config|
        config.consumer_key = ENV["CONSUMER_KEY"]
        config.consumer_secret = ENV["CONSUMER_SECRET"]
        config.access_token = ENV["ACCESS_TOKEN"]
        config.access_token_secret = ENV["ACCESS_TOKEN_SECRET"]
      end
    end
end
```

* view

```
/ @friendsをeachで回して表示するとかする
/ 
/ 次の200件を取得するボタン
= link_to "Next", twitter_friends_path(cursor: @next)
```
GitHub環境構築 MacOSX編

# 1. 必要なもの
[・Git](https://git-scm.com/)
[・GitHubのアカウント登録](https://github.com/)

# 2. Gitのインストール

## 2-1. Gitのダウンロード

Git公式サイトより、Gitの最新版
(2016年4月26日時点では**2.8.1**)
をダウンロードします。
https://git-scm.com/
「Downloads for Mac」(下記画像の赤枠部分)をクリックすると、ダウンロードページに移動します。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/00a42b80-3716-0107-63a8-94c386b42046.jpeg)

しばらく待つと、ダウンロードが自動的に開始されます。もしダウンロードが自動的に開始されない場合、「click here to download manually」をクリックしてください。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/4166bce1-4086-f0d5-2f45-b93222ddcbe8.jpeg)

## ダウンロードしたGitのインストール

ダウンロードしたdmgファイルを開きます。「git-2.8.1-intel-universal-mavericks.pkg」を右クリックし、「開く」をクリックしてください。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/fa753b8d-63c2-f476-d9a8-a600e0236c27.jpeg)

すると下記の警告が表示されますが、「開く」をクリックしてください。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/48f3839b-6807-c494-f7a0-1edad9b73801.jpeg)

「続ける」をクリックしてください。

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/b208f1ce-e764-69a1-809b-1404c2f5438e.jpeg)

そのまま「インストール」をクリックし、インストールを開始してください。

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/c24181fd-0df9-5072-3b36-4fb4b76c8a5d.jpeg)

下記の画面が表示されたらインストール完了です。「閉じる」をクリックしてください。

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/e5e76f15-6d26-a1e7-6255-e2fa0ea23d90.jpeg)

# 3. GitHubのアカウント登録

GitHub公式サイトより、「Sign up for GitHub」をクリックしてアカウント登録を行ってください。

![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/93963/1f6f1b17-d558-bc06-854d-0e7479ece6af.jpeg)
【ぴよぴよ会】資料まとめ

ハンズラボ ぴよぴよ会で使用した資料をまとめています
イベントはDoorkeeperにて募集中　https://handslab.doorkeeper.jp/
(資料はすべて __Piyo2__ タグをつけています)

__主催者の趣味で現状基本的にAWSです。__


###【ぴよぴよ会#1】Lambdaで遊ぼう（2016/04/26）
https://handslab.doorkeeper.jp/events/42327

- [【ぴよぴよ会#1】Lambdaで遊ぼう：Twitterアカウントの取得](http://qiita.com/Yuki_BB3/items/b33af2ba0e3828ac12d7)
- [【ぴよぴよ会#1】Lambdaで遊ぼう：Twitterアカウントの準備](http://qiita.com/Yuki_BB3/items/3a3bea915346bf239aec)
- [【ぴよぴよ会#1】Lambdaで遊ぼう：Twitter Developer登録](http://qiita.com/Yuki_BB3/items/f3aaf62d8a1b1859a6ca)
- [【ぴよぴよ会#1】Lambdaで遊ぼう：Pythonスクリプトの作成](http://qiita.com/Yuki_BB3/items/dde93e438bdd454d51d7)
- [【ぴよぴよ会#1】Lambdaで遊ぼう：Lambdaファンクションの作成](http://qiita.com/Yuki_BB3/items/2c80843795083357107e)

---
【ぴよぴよ会#1】Lambdaで遊ぼう：Lambdaファンクションの作成

ハンズラボ ぴよぴよ会#1の https://handslab.doorkeeper.jp/events/42327 資料です。

###前提条件
- AWSのアカウントを持っている
- 当該のアカウントでLambdaを操作する権限を持っている
- TwitterのAPIキーとアクセストークンを持っている
- Lambdaにアップロードするもの一式をZIP化してクライアントに持っている

###Lambdaコンソールにログインする

__注意__
東京リージョンになっているか確認して下さい

青色の "Get Started Now" を選択する

![Lambda_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a978b682-e5dd-25c3-35fc-80a7efc96d29.jpeg)

__初めて起動する人は以下の画面__

![Lambda_Management_Console2.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/1085064f-4f70-5b40-1978-0d60971eb6e8.jpeg)

###Lambdaファンクションの設定

まず最初にLambdaのファンクションサンプルを選択する画面に遷移します
サンプルを使用してスクリプトを書きたい場合、やりたいことにマッチするものを選択して下さい。
__今回はスキップして自分で設定します。__

![Lambda_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/7ae25315-e82d-3663-9ee0-925b1a5a2c95.jpeg)

__下記項目を設定__
- Name:sample
- Description:piyopiyo２
- Runtime：Python2.7
- Code entry type:Upload a .ZIP file

![Lambda_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/2f5fb079-2998-3e2d-c5d2-75da23e776a5.jpeg)

つづき

![Lambda_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/2fc3763d-e723-7a53-6aba-851f35b53854.jpeg)

###IAM Roleの作成

ロールのプルダウンから下記を選択することで作成画面にジャンプします
![Lambda_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/30da601f-dd50-2070-0316-ab40c5c4c5dd.jpeg)

![IAM_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/b474ccec-57fe-e4bd-2db6-374cbb710b1f.jpeg)

これでIAM Roleが作成され、設定値に書き込みが反映されます

__【注意】__
__今回はログの書き出し位しか使用しないので、上記設定を使用しています。__
__AWSの別サービスと連携する際はロールに適切な権限付与して下さい__

![Lambda_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/98adbfa4-74b3-401c-7822-f3d42aeecf06.jpeg)

確認画面が出力されるので "Create function"を押してファンクションを作成します。

ファンクションの作成は以上です。
テスト用のトリガーを用意してテストしてみます。
【ぴよぴよ会#1】Lambdaで遊ぼう：Pythonスクリプトの作成

ハンズラボ ぴよぴよ会#1の https://handslab.doorkeeper.jp/events/42327 資料です。

###前提条件
- AWSのアカウントを持っている
- 当該のアカウントでAWS Lambdaを操作する権限を持っている
- TwitterのAPIキーとアクセストークンを持っている
- ターミナルにてpipコマンドが使用できる

###スクリプトの作成
__テキストエディタを用いて、クライアントで作業します。__

- Pythonスクリプト"lambda_function.py"を作成します。
- 使用するモジュールを作業ディレクトリに準備します
- 作業ディレクトリをZIP化します

###作業ディレクトリの準備
ユーザーディレクトリ配下に作業用ディレクトリを準備します。
ターミナルで下記コマンドを実行して下さい

```bash:コマンド
cd ~
mkdir piyopiyo2
```

```bash:確認
ls | grep piyopiyo2
```

```:結果
piyopiyo2
```

作業ディレクトリに移動して作業します。

```bash:コマンド
cd piyopiyo2
```

```:確認
pwd
```

```:結果
/Users/****/piyopiyo2
```

###外部モジュールのインストール
使用する外部モジュールを作業ディレクトリにインストールします。
今回はモジュールとしてtweepyを使用します
参考：[リファレンス](http://tweepy.readthedocs.org/en/v3.5.0/api.html)

```bash:コマンド
pip install tweepy -t ./
```

```bash:確認
ls
```


```:結果
examples				requests_oauthlib-0.6.1.dist-info
oauthlib				six-1.10.0.dist-info
oauthlib-1.0.3-py2.7.egg-info		six.py
requests				six.pyc
requests-2.9.1.dist-info		tweepy
requests_oauthlib			tweepy-3.5.0.dist-info
```
'xxxxxxxxxxxxxxxxxxxx' になっている''の間に取得したキーで置換してください

###lamba_function.pyの作成

Pythoスクリプトを作成します。
現在のディレクトリ（pipでモジュールをインストールしたディレクトリ）に lamba_function.py の名前でスクリプトを作成してください。

Pythonの基本的な部分をざっとまとめました
参考：[AWS Lambdaを使うためにPythonを勉強したまとめ](http://qiita.com/Yuki_BB3/items/bf713a5141ea59b741dc)



```python:lamba_function.py
import json
import tweepy

CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxxxxxxxxx'



def lambda_handler(event, context):
    
    client = tweepy_client()
    post_message = 'Hands-Lab piyopiyo kai'
    post_twitter(client, post_message)
    
    
    
    
def post_twitter(client, message):
    API = client
    text = message
    req = API.update_status(text)
    
    return req
    
    
    
    
def tweepy_client():
    
    consumer_key = CONSUMER_KEY
    consumer_secret = CONSUMER_SECRET
    access_token = ACCESS_TOKEN
    access_token_secret = ACCESS_TOKEN_SECRET
    
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)
    
    return api
    
```

###zip化する
作業ディレクトリにて下記コマンドを実行します

```bash:コマンド
zip -r myfunc ./
```

以上で完了です
【ぴよぴよ会#1】Lambdaで遊ぼう：Twitter Developer登録

ハンズラボ ぴよぴよ会#1の https://handslab.doorkeeper.jp/events/42327 資料です。

###前提条件
- Twitterのアカウントを持っている
- Twitterのアカウントに電話番号登録が済んでいる

###Developer登録

https://dev.twitter.com/ からTwitterのDeveloperサイトにアクセスします。

サイト下段の Manage Your Apps を選択
__注意__
本日、操作対象のアカウントでログインしているか確認してください。
違うアカウントでログインしている等の場合は対象のアカウントでログインしなおしてください

![Twitter画面１.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a8ed5ef0-66aa-cd9d-fe54-a0189575d1c9.jpeg "Twitter画面１.jpg")

![Twitter_Developers２.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a55cd0c2-5950-8f31-1532-10013cfe61a0.jpeg "Twitter_Developers２.jpg")

![Twitter_Application_Management.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/89fb7ed8-dd7f-65f1-06af-b3cc310c5909.jpeg "Twitter_Application_Management.jpg")

アプリケーションの設定を行います。

- Name: piyo2_sample_app
- Description: 20160426_piyopiyo
- Website： <なんでも良いので何か入力>

![Create_an_application___Twitter_Application_Management.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/d84e87b1-6780-f1fa-bf75-9342b3a1469e.jpeg "Create_an_application___Twitter_Application_Management.jpg")

確認と同意をチェックして、確定します。

###Access Tokensの取得

- Keys and Access Tokensを選択
- Access Levelが　”Read and write” になっているか確認する

![sample2yukiyoshid___Twitter_Application_Management.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/2de36269-6b51-0a5c-19a2-1cacb357b72d.jpeg "sample2yukiyoshid___Twitter_Application_Management.jpg")

__Consumer Key (API Key)__
__Consumer Secret (API Secret)__
を使用します。メモしておいてください。

Token Actions でトークンを作成します

![００３.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/faf4e63c-9445-47d8-2ee8-82a45a0ea455.jpeg "００３.jpg")

![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/ee594d2b-0c8e-27ff-c143-0861621208f9.jpeg "004.jpg")

__Access Token__
__Access Token Secret__
を使用します。メモしておいてください。

###確認
上記手順で

- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Token
- Access Token Secret

が取得できていれば完了です。
【ぴよぴよ会#1】Lambdaで遊ぼう：Twitterアカウントの準備

ハンズラボ ぴよぴよ会#1の https://handslab.doorkeeper.jp/events/42327 資料です。

使用するアカウントをでdeveloper登録するための準備をします。

###前提条件
- Twitterアカウントの取得が完了していること
- SNS受信可能な電話番号を持っていること（携帯電話）

###アカウントの電話番号登録

Twitterにログインし、右上のアイコンから設定を選択します

![Twitter_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/d28d1418-ad56-cbff-7f0d-d2c470c48faa.jpeg)

右側から"モバイル"を選択し、認証用の電話番号を入力します

__注意__
電話番号は先頭の0を抜いてください

```:例
+81 8012345678
```

![Twitter___設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/306465ac-e205-0c0b-da7f-d9aba39565f1.jpeg)

送信された認証用のコードを入力ます

![Twitter___設定2.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/aaaf8fa8-c365-b4ba-5d80-76b58ed92adb.jpeg)


携帯電話を認証するを押して完了です
【ぴよぴよ会#1】Lambdaで遊ぼう：Twitterアカウントの取得

ハンズラボ ぴよぴよ会#1の https://handslab.doorkeeper.jp/events/42327 資料です。

本日の作業に必要なTwitterのアカウントを取得します。
Twitterアカウントを持っている方は自身のアカウントを使用しても問題ありません。

###アカウントの取得

https://twitter.com/ へアクセスし、右上のアカウント作成を選択します。

![Twitter.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/49e54cde-2d4a-9e49-dd9f-05c5b548a1de.jpeg)

必要事項を入力します
ここで言うアカウント名は＠ユーザー名では無い方の名前です

![Twitterに登録する.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/b571f117-13a1-dff4-1f46-a8e0987441b6.jpeg)

電話番号による認証
一旦スキップします（この後の手順で登録するため）

![電話番号を入力してください.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/04806312-284d-09a1-38e0-abb98c2e1679.jpeg)


![ユーザー名を選択してください.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/1eabfc94-d14b-871b-77b3-23960198856f.jpeg)

@ユーザー名で使用する方の名前です

---

作成ボタンを押したら、アンケートが幾つか始まるので適当に入力して完了です。

【補足】
- ユーザーのインポート等がありますが、スキップして問題ありません。
- アイコンの登録がありますが、スキップして後で登録して問題ありません。

###アカウントの作成が完了したら本日の作業を開始します。
チューニング用に Three.js の WebGLRenderer 情報を監視できるようにする

#はじめに

Three.js で FPS を監視するのに [stats.js](https://github.com/mrdoob/stats.js/) がよく使われているけど、
それだけではチューニングする際、情報が不足しているように思う。

実は Three.js の WebGLRenderer には .info という
ドローコール、頂点数、面数といったもうちょっと細かい情報が格納されているオブジェクトがある。

- memory
  - geometries
  - textures 
- render
  - calls
  - vertices
  - faces
  - points
- programs

これらの情報を stats.js のように画面上に表示できる
threex.rendererstats.js というものがある。


#手順

Bower でインストールする。

```sh
bower install -s threex.rendererstats=https://github.com/jeromeetienne/threex.rendererstats/archive/master.zip
```

threex.rendererstats.js を読み込む。

```html
<script src="bower_components/threex.rendererstats/threex.rendererstats.js"></script>
```

stats.js と同様に作成して右下に表示させる。

```js
var rendererStats = new THREEx.RendererStats()
rendererStats.domElement.style.position = 'absolute'
rendererStats.domElement.style.left = '0px'
rendererStats.domElement.style.bottom   = '0px'
document.body.appendChild(rendererStats.domElement)
```

更新したい場所で更新処理を記述する。

```js
rendererStats.update(renderer);
```


#確認

以下のように左下に赤い stats.js のような UI が表示される。

![スクリーンショット 2016-04-26 11.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/56504/2e24b557-b41d-0460-1753-1cb1dcb3bd8f.png)

左上 : stats.js 
左下 : threex.rendererstats.js
右上 : Chrome の FPS meter
Swift get set で検索してもなかなか出てこない機能

Objective-C の property って Swift ではどうやって実装すればいいの？
特に set した後にいろいろやりたい！
と思って検索しても

```swift
var _hoge: String? = nil
var hoge: String? {
    get {
      return self._hoge
    }
    set {
      self._hoge = newValue
    }
}
```

こんな感じのナンセンスなコードしか出てこないのでメモ
他の変数を利用する場合（税抜き・税込み価格 等）は上の方法で問題ないが
個人的にやりたいことは **set した後にいろいろやりたい！** である 


~~このあと滅茶苦茶 set した~~


まぁ、プロパティ監視がしたいだけなんだよね
なので、以下が求めるものとなる

```swift
var hoge: String? {
  willSet {
    println("willSet:\(hoge) -> \(newValue)")
  }
  didSet {
    println("didSet :\(oldValue) -> \(hoge)")
  }
}
```

`willSet` と `didSet` で前者は値が格納される前、後者は値が格納された後に通過する
それぞれ、 `newValue` と `oldValue` という隠れた値が存在する
これは名称の変更が可能

```swift
didSet(fuga) {
   println("didSet :\(fuga) -> \(hoge)")
}
```

とりあえずこのくらいのメモで大丈夫かな？

# 参考
- [Swiftのプロパティ監視(willSet/didSet)の挙動について調べてみた - Qiita](http://qiita.com/takabosoft/items/b3af8b30a8c5111f4fce)
- [【Swift】セッター(Setter)、ゲッター(Getter)の処理を書く - Qiita](http://qiita.com/yuinchirn/items/c1bc87494cb758a6b0ca)
Microsoft EdgeにおけるRTCサポート最新動向 ーSharpening the Edge – extended Q&A with Microsoft for RTC devsより

# はじめに

2016/4/21 webrtchacksに掲載された[Sharpening the Edge – extended Q&A with Microsoft for RTC devs](https://webrtchacks.com/working-to-make-edge-dull-extended-qa-for-rtc-devs/)より、Microsoft EdgeのRTCサポートに関する動向をピックアップする。

尚、元記事はBernard Aboba氏へのインタビュー形式の記事であり、Microsoft社として内容を保証するものではない。

# Feature support

凡例：開発優先度

- Low : 技術評価中、開発着手前
- Medium : リリースに向けて開発に着手する可能性が高い
- High : すぐにでも開発に着手する

|機能分類|項目|対応状況|開発優先度|
|:--:|:--:|:--|:--:|
|Stream & Port handling| Multiple Streams & Unified Plan |ORTCはsingle dtlsTransport上でmultiple streamsをサポー卜している。<BR>開発中のWebRTC1.0はunified plan方式のmultiple streamsには対応していない。||
|| Multiplexing |Audio/Videoのmultiplexing、RTP/RTCPのmultiplexingに対応している。||
|| DataChannel |未サポート|Low|
|| Media Recorder |未サポート|Low|
| Security & Encryption | No HTTPS requirement|HTTP/HTTPS両方で動作する。今後、変更を加える可能性がある。||
||“IP Leakage” prevention|ローカルIPアドレスの候補を収集しないようにするオプションを提供する。エンタープライズ用途ではグループポリシーを使って一括設定可能。||
|| Screen sharing security |未対応<BR>理想としては、Addonなどを使わずにユーザが機能を有効化出来るようにしたい。（Windowsプラットフォーム側で権限設定可能にする）|Medium|
|| ECDSA Support |DTLS1.2とECDSA（楕円曲線暗号スイート）は開発中。開発完了後もディフォルトはRSA証明書を生成する。||
|| Device Fingerprinting |まだ、Media Capture Devices用に永続的なuser Permissionをサポートしていない。Webページでは、ユーザが許可を与えないかぎり、キャプチャデバイスのリストに表示されることはない。||
| Codec & Video Support | ORTC & 1.0 Parity | H.264/AVC,VP8,G.711,G.722,Opus,Comfort Noise,DTMFがWebRTC1.0でも利用可能になる。||
| Audio |Opus|Opusは現在サポートしている。「Opus Audio Playback」は現在開発中。||
||FEC| Opus internal FEC はサポートしていない。||
||RED|サポート済み。相互運用性はテストしていない。||
||G.729|未サポート||
|Video|VP8|RTC用のVP8は検討中。H.264/AVCの実装が完了次第開発を始める予定。|High|
||VP9|VP9の動画再生は可能だが、RTC用のコーデックとしては利用できない。||
|| SVC & Simulcast |Edge ORTCではH.264UC video codecの中でSVC＆Simulcastによるencodingとdecodingをサポートしている。<BR>H.264/AVCとVP8におけるSVC＆Simulcastは、現在対応項目として含まれていない。ただし、VP8はtemporal scalabilityのデコードが利用可能になる予定。||
||FEC、ULPFEC、RED| retransmission, RED + ulpfecは対応を検討中。 flexible FECのサポートは現在検討していない。 |？|
||PLI、NACK|PLIは現在開発中。Generic NACKは対応を検討中。| high |
|| Video Interop |H.264/AVC、VP8のビデオコーデックサポートに加えて、FBメッセージ (RTP/SAVPF)、輻輳制御、ロバストネスの追加についても検討中。 |||
|ICE＆TURN| Trickle-ICE Support |未サポート|Medium|
|| TURN Variations |Edge TH2(Build 10586)では、TURN (RFC 5766), TURN IPv6 (RFC 6156), ICE TCP (RFC 6544)をサポートしている。<BR>Allocation of TCP candidates（RFC 6062）はサポートしていない。<BR> TURN over TCP/TLS は検討中。 |Medium|

#　Other Tips

## FeedBack and Bug reporting

- [Microsoft Edge Platform UserVoice](https://wpdev.uservoice.com/forums/257854-microsoft-edge-developer&sa=D&ust=1461233332370000&usg=AFQjCNHyPnWV3iZRORPRqqMRcJbhE48lBQ)

- [Microsoft Edge Platform Issues](https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/)

## Browser-Debug

- EdgeはStatistics APIに加えて、より広範囲なSession summary statisticsを含んだ、msStats APIをサポートしている。

- 専用の開発者ツールはまだ存在しない。

---
最後に、修正点したほうが良い点や誤りなどがあれば、コメントを頂けると幸いです。
Rails4アップデート時に参考にしたサイト

### Rails4アップデート時に参考にしたサイト

* [gem依存関係調べるサイト](https://docs.rubygems.org/)
* [Rails アップグレードガイド](http://railsguides.jp/upgrading_ruby_on_rails.html)
* [Rails 4 へのアップグレード時に遭遇した問題](http://techlife.cookpad.com/entry/2014/09/30/172628)
* [Is a gem ready for Rails 4 or 5?](http://www.ready4rails.net/)
* [Railsセキュリティ情報](https://groups.google.com/forum/#!forum/rubyonrails-security)
* [Rails 4 へ移行してあらためて大切だと思ったこと + 役に立ったリンクを全力まとめ](http://blog.inouetakuya.info/entry/20130923/1379930345)
* [Ruby on Rails の大掃除！ 3.2 → 4.1 にバージョンアップするの巻](http://d.hatena.ne.jp/komiyak/20141212/1418362163)
* [Ruby のバージョンアップ作業](http://magazine.rubyist.net/?0042-MigratingARailsApplicationToRuby200#l3)
* ["gem install" するその前にチェックしておきたい項目](http://www.glamenv-septzen.net/view/1265)
* [Step by Step Ruby on Rails](http://rails.honobono-life.info/Bundler-usage-example)
* [Rails4.2でmysql2を認識しない mysql2 is not loaded?](http://qiita.com/oshin/items/f5ff336f63366c364909)
* [RSpecの最新の動向・RSpec 3へのアップグレードガイド](http://qiita.com/yujinakayama/items/a1d31b2caa35642e8e69)
* [オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル](http://miyamae.github.io/rubydoc-ja/2.2.0/#!/doc/index.html)
* [Rails と Ruby のアップデート作業手順](http://easyramble.com/ruby-rails-version-update.html)
* [Rails 3.2.12を4.0.0にアップグレードした](http://akasata.com/articles/303)
* [Ruby on Rails チュートリアル](http://railstutorial.jp/chapters/supplement?version=3.2)
* [Rails 3.2 から Rails 4.0 へのアップグレード](http://minamirb.github.io/rails_beginners_lesson/upgrading-from3.2-to4.0/)
* [Rails 4 パート1：Rails 4の最新情報 (翻訳版)](http://www.engineyard.co.jp/blog/2013/rails-4-changes/)
* [versioneye](https://www.versioneye.com/ruby/)
* [Synvert Tools](http://synvert-tools.herokuapp.com/)
* [Rails4.2beta1をインストールして最初にはまったこと](http://www.techscore.com/blog/2014/09/12/rails4-2beta1%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E6%9C%80%E5%88%9D%E3%81%AB%E3%81%AF%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8/)
* [Ruby on Rails v3.2.17](http://api.rubyonrails.org/v3.2.17/)
Android開発のマイベストプラクティス [2016年時点] 

2016年5月現在の自分のベストプラクティス。今後変わる可能性があります。

## 全体設計
- [android-best-practices](https://github.com/futurice/android-best-practices/blob/master/translations/Japanese/README.ja.md)

## コーディング規約
- [Google Java Style](https://google.github.io/styleguide/javaguide.html)
- [Cookpad](https://github.com/cookpad/styleguide/blob/master/java.ja.md)

## 開発効率化

- [AndroidAnnotations ](https://github.com/excilys/androidannotations)

## UI

###  マテリアルデザイン
- [rey5137/material](https://github.com/rey5137/material) -LoliPop以前のバージョンでマテリアルデザインを使うためのライブラリ
 - (注意)compileSdkVersionを23にしないとビルドが失敗する。

## Rest

- [OkHTTP](https://github.com/square/okhttp)
- [Retrofit2](https://github.com/square/retrofit) - v1からv2への移行期なので気をつける
- [RxAndroid](https://github.com/ReactiveX/RxAndroid)

### 参考
- [Retrofit2 + OkHttp + RxAndroid + Jackson + Realm で開発環境構築](http://qiita.com/jr_qrank/items/3e591b7908c76cd8d0fa)

## ORM

- [gfx/Android-Orma](https://github.com/gfx/Android-Orma) - migration機能/ドキュメントが一番しっかりしている。

## color定義

- [colors.xmlマイベストプラクティス](http://qiita.com/konifar/items/68f196dc7acacfcf40cf) - colors.xmlの設計方針。
- [google Color palette](http://www.google.com/design/spec/style/color.html#) - 色はここに載っているものを使う。
- [Material Palette](http://www.materialpalette.com/) - アプリのテーマカラーを決定する。

## アイコン作成

- [Sketch3でAndroid用の画像を切り出す](http://qiita.com/k-yamada@github/items/61473811357fe261eb89)
$(window).innerHeight()とwindow.screen.heightで挙動が違う件について|n'ω'｀|

## こんにちは！今日も元気にお仕事しています！|n'ω'｀|

```lang:test.js
        $(window).on('load resize',function() {
          var $h = $(window).innerHeight(), // <---
              h = window.screen.height; // <---
          // spの時のみ読み込み
          if ($w < 960) {
            iphoneCheck($h);
          }
        });
        function iphoneCheck(h) {
          var ua = navigator.userAgent.toLowerCase(),
              $t = $('.js_test_img').find('img'),
              $tw = $t.attr('width'),
              mini = function() { $t.attr('width', '90%'); },
              normal = function() { $t.attr('width', '100%'); };
          if(ua.indexOf('iphone') != -1) {
            // iphone 4 or iphone 5
            if ( h == 480 || h == 568 ) {
              mini();
            // クリア
            } else {
              normal();
            }
          } else {
            // 基本的にここ走ることはないですが、デバックツールで閲覧された時用にクリア
            if ($tw !== '100%') {
              normal();
            }
            return;
          }
        }
```

今回はこのコードを書いていく上で「ファ。。！！！？」となったことをメモします。
やりたかったことは、
・特定の画像の表示倍率をiphone4とiphone5で変える
・それ以外では戻す。
です。|n'ω'｀|(定数で数字をいれているのは、ごめんなさい。


本題ですが、window.screen.height;でとった時にデバックツールで意図したサイズが返ってこなかった時がありました。
resizeイベントを走らせるたびに再取得しているので、デバイスをロテートさせたときにも走りますよね、と思っていたら、
走るは走るけど、
```
$(window).on('resize',function(){
var $h = $(window).innerHeight();
var h = window.screen.height;
console.log($h,h)
})
```
の返り値は、
 773 773
 1024 1024
 773 773
 **839 1024**
 773 773
 667 667
 773 773
 **375 667**
 773 773
 320 320
 773 773
 375 375
 773 773
 320 320
 773 773
 **568 320**
 773 773
 320 320
 773 773
 568 568
 773 773
 **375 568**
 773 773
 568 375
 773 773
 320 320
 773 773
 568 568
 773 773
 375 375
 773 773
 568 568
 773 773
 **375 568**
と太字のところに誤差が。。
innerHeightの方がロテートしたときも、しっかりとれているようにみえる。
そんなころころとデバイスを変えて、ロテートしてってのは、実際のユーザさんのデバイスではあんまり考えにくい挙動なのではあるけれど、デバックツールで閲覧されたときに「こ、こいつはロテートしてもかわんねえじゃないですかーー(^Д^)9m」っていうのが万が一にもあった場合に、「そこも考えましたし！」と伝えるための自己満足のための対策なのですが、、、、

###原因(自分なりに出した
$(window).innerHeight();
表示領域の高さを取得します。
つまり、どれくらい表示できるサイズなのか、の取得
私たちが表示領域として使うことのできる範囲の特定ができる、ぽい。

window.screen.height;
参考：https://developer.mozilla.org/ja/docs/Web/API/Screen/height
参考：http://q.hatena.ne.jp/1165816475
「画面の高さを取得」
この、画面っていうのが、実にふわっとしているのですが、、、
スクリーンってついているから、あくまでそのデバイスの大きさ？をかえしてくれてるのかな、とおもったりしました。
ロテートしたときにうまく反映されないのは、そのせいかもしれないです。

いやー、、もやっとしてますね、、、|n'ω'｀|

もし、原因をすぱっとわかる方がいらっしゃいましたらご教授いただけますと幸いです、、


[追記]
resize後に、値を取得するタイミングが違う疑惑が浮上。。。。！
window.screenオブジェクトの取得タイミングが、原因みたいな説が他のエンジニアの方と検証していて発覚しました。
zsh rbenv gemset

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install --list
rbenv install 2.2.3
rbenv local 2.2.3

cd .rbenv/plugins/
git clone https://github.com/jamis/rbenv-gemset.git
rbenv gemset
rbenv gemset create 2.2.3 version_up
echo version_up > .rbenv-gemsets
rbenv gemset active
rbenv gemset list

gem install bundler --version="1.2.1"

# デフォルト以外すべて削除
gem uninstall -axI `gem list --no-versions | egrep -v 'test-unit|rdoc|psych|minitest|io-console|rake|bigdecimal|json'`
```
iText2.1.7 でPDFにパスワードを付けたい時

# 注意点
iText2.1.7 の話なので、最新バージョンでは使うライブラリのバージョン等違う可能性があります。
使っているライブラリがiText2.1.7だった案件でPDFにパスワードを追加したい、と新規で話が出てはまった人向け。

# 現象

コードとしてはこう書けばいいみたいだけど…

```java
PdfReader reader = new PdfReader(元のPDFファイル名);
PdfEncryptor.encrypt(reader,
        new FileOutputStream(パスワードを付与するPDFファイル名),
        "aaa".getBytes(), // ユーザーパスワード
        "bbb".getBytes(), // マスターパスワード
        PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING, // パーミッション、コピー可＆印刷可能
        true); //暗号キーは128bitか40bitか。trueなら128bit
```

動かしたら 

```java

Caused by: java.lang.ClassNotFoundException: org.bouncycastle.asn1.DEREncodable
```

で落ちる。
調べたところ、bcprov-jdk-xxx.jarとbcpkix-jdk-xxx.jarをライブラリに入れる必要があるらしい。

# ライブラリに追加して実行してみる
https://www.bouncycastle.org/latest_releases.html から最新版 bcpxxx-jdk15on-154.jar をダウンロードしてくるも解決しない。
Jarの中身を見てみると、org.bouncycastle.asn1.DEREncodableVector しかない…。

# 結論
http://repo2.maven.org/maven2/org/bouncycastle/ から過去のリリースバージョンをダウンロードしてこないとダメ。

- bcpkix-jdk15on-1.47.jar
- bcprov-jdk15on-1.46.jar

bcprov-jdk15on-1.47.jar から org.bouncycastle.asn1.DEREncodable が消えているので注意が必要。
apache2.x で任意のURL配下のみIPアドレス制限をかける

## やり方
- Locationタグで設定する  
- Locationタグは.htaccessでは使用できないので、confファイルに記載する

## 作業順
1. confファイルのバックアップ
2. 制限を与えたいディレクトリの情報を以下のように記載
3. apachectl configtestで設定を確認
4. httpd reloadで設定を読み込み
5. IP制限あり、無しの環境からアクセスを行い制限が働いているか＋他影響でていないかを確認（だいたいはWiFiを切ったスマホからアクセスすれば制限ありを確認できるはず）

＊設定全体は管理者権限で行う

## 設定例
```
<Location "/hoge">
 order deny,allow
 deny from all
 allow from 1.1.1.1
 allow from 2.2.2.2
</Location>
```
＊許可IPアドレスが複数ある場合、allow fromは複数行記載。
いちばんやさしいグロースハックの教本を要約した！~ Retension編 ~


こちらの記事は、[いちばんやさしいグロースハックの教本](http://www.amazon.co.jp/gp/product/4844339923/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4844339923&linkCode=as2&tag=hellokenta102-22)という本がとてもグロースハックの基礎を学ぶ上で良い本だったので、まとめて紹介する記事です。


こちらの本では、[AARRRモデル](http://growthhackjapan.com/2014-01-06-how-growthhackers-track-conversions-with-aarrr/)を拡張した、 __ARRRAモデル__というものを使用して、グロースハックを実行しています。

前回の、
[いちばんやさしいグロースハックの教本を要約した！~ Activation編 ~](http://qiita.com/KEN-chan/items/5b6fb510185b9d698e34)に引き続き、

次は **Retension（ユーザに継続的に利用してもらうこと）**

について書いていきたいと思います。

# Retension

- どれだけユーザを獲得しても一度きりの利用になってしまっては、永遠に成長できない。何度も継続利用してもらうことが大事。
- **Retension**が上がると[LTV（顧客生涯価値）](https://kotobank.jp/word/LTV(%E9%A1%A7%E5%AE%A2%E7%94%9F%E6%B6%AF%E4%BE%A1%E5%80%A4)-809844)も上がる。
- Retensionの計測には[コホート分析](http://ascii.jp/elem/000/000/992/992442/)を利用する。

## フックモデルの4つのステップでサービス利用を習慣化させる

![IMG_0009.PNG](https://qiita-image-store.s3.amazonaws.com/0/54826/97020c21-e5dc-f377-3a55-2b3eae95c16b.png "IMG_0009.PNG")

### 1.トリガー（きっかけ）
ユーザの行動を促す最初のきっかけの事を **「トリガー」**と言う。
大きく2つ

- ユーザに行動したくなるような情報を届け行動を促す **外的トリガー**
- ユーザの記憶から次にとるべき行動を連想させる **内的トリガー**

の2種類がある。

#### 外的トリガー

外的トリガーには以下の4種類がある

- **有償トリガー**：有償の広告などをきっかけにサービスを利用すること
- **名声トリガー**：アプリストアで特集されたり、メディアに露出したりすることでサービスを使いはじめること。
- **クチコミトリガー**：誰がが言及しているのを耳にすることでサービスを使いはじめること
- **自己トリガー**：ユーザのまわりにすでに存在しているもの。例えば、スマホの通知にサービス利用のきっかけとなる情報を得て利用すること。SEOやASOなどもこのトリガーに含まれる。

#### 内的トリガー

- ユーザの記憶を利用して、次の行動を起こさせる事
- 例えば、今日の献立に迷ったときにレシピサイトを見る、など。
- ユーザーインタビューによって、内的トリガーがわかることも多い

### 2.アクション（行動）

- ユーザの行動を促す最初のきっかけがつくれたら、次はユーザに具体的に行動してもらう。
- ユーザにサービスを利用してもらうためには、
 **「B = M + A + T」**
 という公式に当てはめると考えやすい。
-  意味は、 **「行動（Behaviour） = モチベーション + 能力(Ability)  + きっかけ」**である。
- 例えば、 **雨の日のランニングという行動（B）**は、 **雨の日でもランニングしたいというモチベーション（M）**と、 **ランニングできる能力（A）**、 **ランニングしたいというきっかけ（T）**を合わせて十分だった時にランニングに行くということ。
- 能力（A）が一番ハックしやすい

#### iQONの例
- iQONでは、能力（A）は
    1. センスの良いアイテムを選ぶ能力
    2. コーデのレイアウトを決める能力
 
の2つから成り立っている。iQONユーザはファッションセンスが良いので①は十分だったが、デザイン的素養が必要な②の能力は十分でないケースが多かった。そこで、②について必要な能力が最小になるような機能改善を行ったら投稿数が2倍になった。

### 3.リワード（報酬）

- ユーザに行動を起こさせたら、その結果として得られるユーザメリット、報酬がなければユーザはサービスを利用してくれない
- 報酬を **「予測不可能なもの」**として考える
- 例えば、FBでの報酬は投稿につけられる「いいね！」だが、この「いいね！」が仮にどんな投稿にも一定数付くという予測可能なものであれば報酬としては機能しない。予測不可能だからこそ、楽しみになるもの。

### 4.インベストメント（投資）

- ユーザにちょっとした作業をしてもらうこと
- それが価値として蓄積されて、次のトリガーを呼ぶ。
- 例えば、LIKEボタンのタップ。LIKEをすればするほどLIKEページは自分がほしいもののリストになり、それを見返したい気持ちが内的トリガーを発火させる。
- ユーザが使えば使うほど投資になるような構造を意識する。

こちらの内容は、[
いちばんやさしいグロースハックの教本](http://www.amazon.co.jp/gp/product/4844339923/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4844339923&linkCode=as2&tag=hellokenta102-22)の要約です。気になる方は読んでみてください。

次回は、 **Retension**の次の、 **Referral**を書こうと思います。
【Elixir】forやEnum.eachの外で作ったList変数に中で要素追加できなくてハマる

forやEnum.eachの中で要素追加してもダメだよって話です。

こんな感じの処理。javaとかphpとかよくやります。

```ex:test.ex
lst = [0, 1, 2]
hoge = []

for data <- lst do
  hoge = [data] ++ hoge
end

IO.puts List.first(hoge) <> "***"
IO.puts List.last(hoge) <> "***"
```

これを実行すると、

```bash
$ elixir test.ex

test.ex:5: warning: variable hoge is unused
```

こんな感じで、hogeのfirstもlastも何も返してきません。

ず〜っと、「なんでだ、、、」ってなってたんですが、elixirでは以下が正しいみたいですね。

```test.ex
lst = [0, 1, 2]

hoge = for data <- lst do
  data
end

IO.puts List.first(hoge)
IO.puts List.last(hoge)
```

これだと

```bash
$ elixir test.ex
0
2
```

ちゃんと表示されました。

---

これに半日近く悩み続けたのでメモしておきました(｀･ω･´)ゞ
ビルドエラー「COMPILETODALVIK : error : Could not create the Java Virtual Machine.」が出た件

<font color="red">2018/04/05 追記</font>
**最大ヒープサイズXmxオプション設定の補足**
指定する値によって動作したりしなかったりします。
利用しているPCのメモリサイズや同時に立ち上げているVisualStudioの数によっても変わるようです。
指定値が多すぎるとメモリが確保できないのではないかと推測します。

## 状況
タイトルのビルドエラーが出てビルドが出来なくなりましたが、
解決したので試した方法などを記録しておきます。

## 環境
IDE：VisualStudio Enterprise 2015
OS：Windows7 Professional
プロジェクトの種類はXamarin.Forms PCLです。

## 発生原因・状況
恐らくVisualStudioの追加コンポーネントのインストールを行ったことが原因
特定のプロジェクトだけでこの例外が発生し、その他のXamarin.Forms PCLプロジェクト（新規作成）では発生しませんでした

## 解決方法
最終的に解決したのは下記の方法です。
 
- **VisualStudioの修復**

プログラムと機能からVisualStudioを選択して「変更」を選択
起動したVSツールの「修復」を行いました
修復には1時間以上の時間がかかりました
※寝る前にやったので正確な時間はわかりませんが、そこそこかかります

## その他試した事など
- 最新Javaのインストール
- Xamarin for Visual Studio Updatesで最新化  
※VisualStudiのオプション→Xamarin→Other→CheckNowで更新できます
![image](https://qiita-image-store.s3.amazonaws.com/0/97222/3ee5ee05-9007-a4c0-3abc-bc1d15c06996.png)
- Javaの各種パスの確認
![image](https://qiita-image-store.s3.amazonaws.com/0/97222/f4ee7115-e1f7-ec86-c5b6-5796c839f98d.png)
- 最大ヒープサイズXmxオプション設定  
こちらは問題発生前から設定済みでしたが、調べたら良く出てきた解決方法なので設定方法を記載しておきます  
Xamarin.Androidプロジェクトのプロパティから「Android Options」を選択します
![image](https://qiita-image-store.s3.amazonaws.com/0/97222/842ec59d-72bb-376f-7688-b0ca283a69bb.png)

## その他試していないけどやったほうがよさそうなこと
- VisualStudioの各種更新の適用  
VSの右上にある旗をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/97222/ec3cc886-575c-322b-612d-54e2ef0d597a.png)
- 古いJavaのアンインストール

以上
AWS Lambdaに環境変数を与えてみる？

本番環境とテスト環境を別リージョンに作っているのですが、AWS外にアクセスする時など、ちょいちょい環境によって異なる動作をさせたいケースが出てきます。
基本的にAPI Gatewayを使っているので

```

      x-amazon-apigateway-integration:
        type: HTTP
        uri: https://example.com
        httpMethod: GET
        requestParameters:
          integration.request.header.hoge: "'some value'"

```

みたいな感じで、yamlをリージョンごとに分けることで対応しているのですが、似たようなyamlがリポジトリに二重管理されててどうもスマートではなく。。
AWS Lambdaに環境変数持たせられたらハッピーなのに、と考えていたら、勉強会で非推奨の裏技を教わりました。

```

print(context.function_name)

```

~~ファンクション名にパラメータ書いて渡す、、だと、、、？~~

~~教わった時は「descriptionにJSON書けるよ！」って聞いて、それなら許容範囲かなーと調べたんだけどdescriptionの取得方法が見つからなかった。
ファンクション名に独自パーサでパラメータ書くとか死亡フラグすぎるので素直にAWS Lambdaのバージョンアップ待とう、、~~

ちゃんとgetFunctionConfigurationでありました！

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/API_GetFunctionConfiguration.html
http://boto3.readthedocs.org/en/latest/reference/services/lambda.html#Lambda.Client.get_function_configuration

contextオブジェクトが持ってるものと勘違いしてました。これで幅が広がるなぁ＾＾

```
import boto3

def lambda_handler(event, context):
    client = boto3.client('lambda')
    response = client.get_function_configuration(
        FunctionName=context.function_name
    )
    print(response['Description'])
```
MonacaでIonicを使う

※2016/05/04 追記
最近になってMonacaがIonicをサポートしたようです。

IonicがやっとAngularJS 1.5に対応しました（2.x系の話じゃなくてすみません）。
> Ionic公式ブログ
> http://blog.ionic.io/announcing-ionic-1-3/

早速アプリを作ってみましょう。

# Monacaのテンプレートを利用する場合
ダッシュボードから「新規プロジェクトの作成」をクリックし、Ionicのテンプレートを選択して「作成」を押しましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/106886/8d6683b5-408d-70e2-b4ab-17cfbbcb70f4.png" width="500px">

これだけ！

# 自力でIonicライブラリを組み込む場合
※Node.js Ver.4インストール済みとします。

## Cordovaのインストール
Cordovaがない場合はNPMコマンドでインストールしましょう。

```bash
$ npm install -g cordova
```

## Ionicのインストール
NPMコマンドでIonic CLIをインストールします。

```bash
$ npm install -g ionic
```

## サンプルアプリの作成
Ionicのサンプルを作成します。

```bash
$ ionic start myApp tabs
```

サンプルは
- blank
- tabs
- sidemenu

の3つから選ぶことができます。

## Monacaに追加
`/myApp/www/`以下をMonacaの`/www/`にアップロードします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/106886/61a8afeb-1ea1-8de9-3f3c-8aa0b3eed0e4.png" width="640px"/>

プレビューが表示されれば完了です。

↓上記の作業が面倒なときはMonacaのテンプレートを使うか下記のサンプルをインポートしてください。
https://github.com/puku0x/monaca-ionic/blob/master/monaca-ionic.zip

# 所感
思った以上に簡単に導入できました。

MonacaはOnsenUIを推奨していますが、物足りなくなった場合はIonicを使ってみるのも良いと思います。
Ruby Bundler gemを読み込みたい

いつもrailsに頼っているので、
素のrubyコードで、
bundlerで導入したgemをどうやって読み込むのかわからなかった。

```
# bundler経由でインストールしたgemを有効にするには下記のようにする
require 'bundler/setup'
Bundler.require
```

以上。
dbr: simple orm for golang



memo


```go
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
	"github.com/gocraft/dbr"
)

const (
	mysqlDSN = "interop:interop@tcp(localhost:3306)/interop2016"
)

type DoorMeta struct {
	Id        int64        `db:"id"`
	Name      string       `db:"name"`
	Value     string       `db: "value"`
	CreatedAt dbr.NullTime `db: "created_at"`
}

func main() {
	var result sql.Result
	var err error

	// Open connection
	conn, _ := dbr.Open("mysql", mysqlDSN, nil)
	// Create session
	sess := conn.NewSession(nil)

	// Insert
	result, err = sess.InsertInto("door_meta").
		Columns("name", "value").
		Values("foo2", "bar").
		Exec()

	if err != nil {
		log.Fatal(err)
	} else {
		count, _ := result.RowsAffected()
		fmt.Println(count)
	}

	// Insert with struct
	meta := &DoorMeta{Name: "foofoo", Value: "barbar"}
	sess.InsertInto("door_meta").
		Columns("name", "value").
		Record(meta). // Watch out! this is not Values
		Exec()

	// Select
	var m []DoorMeta
	sess.Select("*").From("door_meta").Load(&m)

	fmt.Println(m)

	// Update
	result, err = sess.Update("door_meta").
		Set("name", "giwa").
		Where("name = ?", "foo").
		Exec()

	if err != nil {
		log.Fatal(err)
	} else {
		count, _ := result.RowsAffected()
		fmt.Println(count)
	}

	fmt.Println(m[0].CreatedAt.Time)
}

```
ADBコマンドを使って一発で端末のアプリ領域からファイルを取得する

端末のデータ領域（/data/data/パッケージ名）に保存されている
ファイルを取得する場合、アクセス権限の関係で`adb pull`が利用できない。
その場合の取得方法を度々忘れてしまうので改めてメモ。

## Android 4.4以下の端末の場合  
Android 4.4(APIレベル19)以下の端末では問題なく取得できる。

```
adb shell run-as com.example.miso cat databases/miso.db > miso.db
```

## Android 5.0以上の端末の場合
問題は5.0以上の端末で、上記のコマンドを実行するとファイルサイズが0となってしまい、
正しくファイルが表示されない。

原因は[こちらのサイト](http://mathematik.hatenablog.com/entry/2015/03/29/135954
)で説明されている通り、
Android5.0以上ではcatコマンドの仕様が変わったらしい。

環境のせいかもしれませんが、紹介されているperlの置換がこのままではうまく動作しなかったため、
以下のように少し変更したら無事ファイルを取得できました！

```
adb shell run-as com.example.miso cat databases/miso.db | perl -pe 's/\r\n/\n/' > miso.db
```

ただし上記コマンドが動作したのはOSXのみで、
WindowsではPerlコマンドの仕様が違うのか正しく取得できず。
もしWindowsでの取得方法を知っている人は教えてほしいです！

## Android 8.0以上の端末の場合 2018/10/22追記
Oreo以上では上記の方法では取得できなくなっているため`shell`の部分を`exec-out`に変更する必要がある。

```
adb exec-out run-as com.example.miso cat databases/miso.db > miso.db
```
html 見出しの大きさ

```ruby:qiita.rb
見出しの大きさは、<h1></h1> ＞＞＞ <h7></h7> である。(デフォルトの場合。cssの設定を変えればh2がh１よりも大きくすることもできる！）
<h1>hello,world1!</h1>
<h2>hello,world2!</h2>
<h3>hello,world3!</h3>
<h4>hello,world4!</h4>
<h5>hello,world5!</h5>
<h6>hello,world6!</h6>

```
(result)
<h1>hello,world1!</h1>
<h2>hello,world2!</h2>
<h3>hello,world3!</h3>
<h4>hello,world4!</h4>
<h5>hello,world5!</h5>
<h6>hello,world6!</h6>
PMBOK-プロジェクトマネジメント計画書作成

# 計画プロセス群のプロジェクトマネジメント計画書作成

PMBOKの計画プロセス郡は、作業全体のスコープを確定し、目標の定義と洗練を行います。

|インプット|ツールと技法|アウトプット|
|:---|:---|:---|
|プロジェクト憲章<br/>他のプロセスからのアウトプット<br/>組織体の環境要因<br/>組織のプロセス資産|専門家の判断<br/>ファシリテーション技法|プロジェクトマネジメント計画書|

他のプロセスのアウトプットとは、

* 要求事項文書
* スコープ・ベースライン
* スケジュール・ベースライン
* コスト・ベースライン
* スコープ・マネジメント計画書
* スケジュール・マネジメント計画書
* コスト・マネジメント計画書
* 品質マネジメント計画書
* コミュニケーション・マネジメント計画書
* リスク・マネジメント計画書
* 調達マネジメント計画書
* ステークホルダー・マネジメント計画書

# で、何を作るの？？

なんだか何を作るのか分かりにくい感じですが、プロジェクトマネジメント計画書は「プロジェクトのマネジメントのやり方を記述した包括的な内容」を記述します。
プロジェクト憲章や他のプロセスからのアウトプットを統合し、調整するために必要な行動を文書化しましょうというものです。プロジェクトの実行、監視とコントロール、終結の方法を規定します。
このプロセスはプロジェクトの終結まで継続して行います。継続していく中で、他のプロセスからフィードバックを受けて計画書の内容を更新していくことになります。最初は他のプロセスからのアウトプットはありませんので、アウトプットがある度に段階的詳細化していくことになります。

プロジェクトマネジメント計画書には以下の様なことを記載します。

* プロジェクト・ライフサイクル
* テーラリングにより個々のプロセスの決定
* 成果物作成への取組み方（開発の方法論）
* プロジェクトに使用する特別なツールと技法の記述
* 主要なプロジェクトのインターフェース（他のプロジェクトや組織との間）
* スコープ、スケジュール、コスト、品質等の差異の限界値
* スコープ、スケジュール、コスト、品質等のベースラインをマネジメントする取り組み方
* プロジェクト・レビューを行う回数、タイミング、項目
* 変更管理プロセス
* コンフィギュレーション・マネジメント・プロセス

# フェース単位で作るんだよ

PMBOKのそれぞれのプロセスはフェーズ単位で行うものです。
なのでプロジェクトマネジメント計画書もフェース単位で作成します。

家を建てる例があります。

* 土地を購入するための家の大きさ、庭やガレージの配置をなんとなく決めています。
* 次に建築設計者と協議しながら間取りを決めて図面を描いていきます。全体像が決まってきますが、細かな点は残っています。
* 次に建築業者にお願いし、壁の色とか建材を決めていきます。
* 実勢に建築するときには木材やタイルの数といった建材の部品表まで決まっています。

最初から細かな事まで決められる分けではないですが、家を建てるというスコープは変わっていません。フィーズ単位で必要な計画を立てています。これが段階的詳細化を行っているということです。
React における State と Props の違い

State と Props の違いと、使い分けについて。ほぼ[こちら](
https://preact.gitbooks.io/react-book/content/jsx/index.html)の日本語訳です。

## State と Props

React コンポーネントがデータを受け取ったり、ハンドリングしたり、表示したりするための主要な方法として、State と Props があります。
この二つの概念の違いを知ることは、React を効率的に利用するために役立ちます。

- State: そのコンポーネントが持っている状態
- Props: 親コンポーネントから渡されたプロパティ

### State (状態)

- mutable data (可変のデータ)
- maintained by component (コンポーネントによって保持)
- can change it (変更可)
- should be considered private (プライベートであるべき)

State は可変のデータです。State の変更は、仮想DOMとの差分をとり、実際のDOMを更新し、コンポーネントを再描画するための基本的な方法となっています。

State はコンポーネント自体によって保持され、コンポーネントからコンポーネントへは渡されません。
State は、UI に関連した状態(ドロップダウンが開いているか閉じているかなど)、または、外部のデータに関連する状態(現在ログインしているユーザの名前など)のいずれかになりえます。(この辺日本語訳あやしい...)

State の値は、`this.setState()`をコンポーネント内で呼び出すことによって更新されます。これが呼び出されると、既存の State を新しい State で置き換えられ、そしてコンポーネントの`render()`メソッドが実行されます。

### Props (プロパティ)

- immutable data (不変のデータ)
- passed in from parent (親から渡される)
- can't change it (変更不可)
- can be defaulted & validated (デフォルト値の設定と検証が可能)

Props は、一般的に、親コンポーネントから子コンポーネントに渡される値です。
次の JSX のコードでは、`text` と `onClick` が Button コンポーネントに渡される Props です。

```
<Button text="click me" onClick={ this.clickHandler } />
```

Props は不変のデータとして扱われ、`getDefaultProps` で定義されたデフォルト値か、親コンポーネントから渡された値のどちらかを持つことになります。

## State と Props の使い分け

コンポーネントは必要に応じて内部の State を自由に使用できますが、良い UI 体験のために、直接外部の State に接続する場合には Props で受け取るべきです。
"これだけ"でdockerを用いたLinux環境構築

# docker インストール
```command
	yum -y install docker-io
	service docker start
```

# ベースとなるイメージを取得する
何も無いことを確認

```command
	docker images
```


```command
    # 最新リビジョン
	docker pull centos
    # リビジョン指定(cent 6.6)
	docker pull centos:centos6.6
```
	
使用できるイメージが増えたことを確認

```command
	docker images
```

# コンテナを起動する

``` command
	docker run -i -t centos /bin/bash
	抜けるには ctrl +p -> ctrl +q
```	


# 起動中のコンテナを止める
プロセス確認
	
``` command
	docker ps
```

``` 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                  NAMES
d3ff91e86e32        user/http         "/usr/sbin/httpd -D    3 minutes ago       Up 3 minutes        0.0.0.0:8080->80/tcp   naughty_thompson
859dc8abee25        centos              "free -s 3"            51 minutes ago      Up 44 minutes                              goofy_brown
``` 


# 起動   

``` command
	docker run --name test01 -i -t centos:centos6.6  /bin/bash
``` 


# dockerプロセス確認

``` command
[root@0ef925819c81 /]# sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0ef925819c81        centos:centos6.6    "/bin/bash"         21 seconds ago      Up 20 seconds                           test01
[vagrant@localhost ~]$

```

# dockerプロセス停止

``` command
[vagrant@localhost ~]$ sudo docker stop 0ef925819c81
```

# dockerhubへpush

``` command
	docker login
	docker push user/http
```

# dockerfile作成

``` command
vi Dockerfile
---
From centos
MAINTAINER hogehoge <hogehoge@st.jp>
# RUN: build
RUN echo "now building...."
# CMD: run
# CMD echo "now running..."
CMD ["echo","now running..."]
#
#
RUN yum install -y httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
---
```

``` command
	sudo docker build -t user/http .
```

	sudo docker images

	sudo docker run -p 8080:80 -d user/http
	sudo docker ps
	sudo docker attach 4f1

	sudo docker push user/http

dockerfile内の似たようなコマンド

| 種類 | 内容 |
|:--|:--|
| RUN | Dockerイメージをbuildするために実際にコンテナでコマンドを実行 |
|shell from | /bin/sh -cで実行されるため、shell fromで書かれたコマンドはPIDの"サブ"プロセスとなる |
|exec from | PID 1で実行される |

shell from, exec fromで困ることの一つが、
例えばDockerの外からkillコマンドを実施しようとする際、shell fromだと"サブ"プロセス扱いになってしまうので届かなくなってしまう。


# multi stage機能
Docker version 17.05移行に追加された機能
1つのDockerfile内に複数のFromで指定したDockerイメージのbuildを可能にする
ビルド環境と実行環境とで異なる構成で済むDockerイメージの軽量化などを実現する事が可能になる
corosync + DRBDでStandby機がMaster機の足を引っ張った

2台構成で `/var/lib/mysql/` をDRBDで同期していたとする。
通常時: Master機からStandby機にDRBDのデータを送信する

## 現象

Standby機のDISKが書き込み速度が追いつかないような状況になった場合、
Master機のDISK書き込み速度が抑えられた。(通常の半分以下？)

確認

* `show query` : mysqlに重たいクエリがない
* mysqlのエラーログ確認するもdead lockがかかっているようではない。
* `top` : 暴走しているようなプロセスもない
* `sar -q` : LoadAverageは通常の倍。
* `vmstat 1` : r, bの値異常なし
* `dmesg` : OSの異常なログ無し
* `cat /proc/drbd` : 異常を発見できず。

実機を確認すると、Standby機のDISKがずっと書き込み中LEDがほぼ点灯しっぱなし。
(通常そこまでではない。)

## `Standby機`をOfflineにしてreboot

```bash:状態を確認
crm_mon -A
```

```bash:Standby側
/usr/sbin/crm node standby サーバー名
service corosync stop
```

* Master側の負荷が正常に戻ったことを確認。
* Standby機をOS再起動実施。

## Standby機をOnlineに戻す

```bash:状態を確認
crm_mon -A
```

```
service corosync start
/usr/sbin/crm node online
```

## 回避方法?

* [drbd.conf](https://blog.3ware.co.jp/drbd-users-guide-8.3/re-drbdconf.html)

> デフォルトでは、TCP送信キューが一杯になると、DRBDは書き込みをブロックする。このことはDRBDがTCPで送信できるデータ量を越えてディスクに書きこもうとするアプリケーションの処理速度が低下することを意味する。


これの設定を変更すればFill_threshold値分は解決したかも。


=> protocol C なのが問題。protocol Aにするとよかったかも。でも障害に気が付きづらくなる。
pimplなんてクソクラエ

もともとpimplイディオムは個人的に「インターフェイスと中身の拘束が言語ではなくコードに依る(=誤りの元)」や「無駄にメモリ確保が必要」などという理由で嫌っていたが、C++では以下のようにすることでpimplイディオムは完全に不要になる。

```cpp:hoge.h
class Hoge{
  ...
  static Hoge* New();
  virtual void Huga();
  ...
};
```

```cpp:hoge.cc
#include "hoge.h"
class Muga : pulic Hoge{
  void Huga() final{
    ...
  };
};

Hoge* Hoge::New(){
  return new Muga;
}
```

多態する必要があったりファクトリが必要だったりするのが面倒なのと、実装をさらに継承するにはソースの修正が必要なのが難点だが、ともかくファクトリ中で実装を選択するようにすると多態の実装をまるごと隠蔽できる。
技術英語 > We've finally [narrowed it down to] some kind of a problem in EPS Conduit 141. / identify the problem

@ Star Trek Voyager > MELD

機関室においてトレスがホーガンとワープドライブの故障原因の話をしている。

ホーガン
> The manifold just won't fire up.
We've finally <font color=red>narrowed it down to</font> some kind of a problem in EPS Conduit 141.

http://eow.alc.co.jp/search?q=narrow+down

<hr>
関連して思い出したのは

> identify the problem

http://eow.alc.co.jp/search?q=identify+the+problem
bootstrap_form vs simple_form

Formをシンプルに書きたいので、両者を比較するメモ

## 結論
- `bootstrap`を使っている場合は、`bootstrap_form`のほうが使いやすい
- そうではない場合は、`simple_form`を使うとシンプルにかけるかも知れません、それほど役に立てないかも知れません

## 前提
- rails 4.2.6
- bootstrap 3 を使う
- `rails g model post title body:text draft:boolean published_at:datetime`

## 比較ポイント
- 縦レウアウトのフォーム
  - 日付フィールドのほうは`bootstrap_form`が楽勝
  - simple_form
    ```
      = simple_form_for @post, url: simple_forms_path do |f|
        = f.input :title
        = f.input :body
        = f.input :draft
        = f.input :published_at
        = f.button :submit
    ```

  - bootstrap_form
    ```
      = bootstrap_form_for @post, url: bootstrap_forms_path do |f|
        = f.text_field :title
        = f.text_area :body
        = f.check_box :draft
        = f.datetime_select :published_at
        = f.submit
    ```

- 横レイアウトのフォーム
  - simple_form
    ```
      = simple_form_for @post, url: simple_forms_path, wrapper: :horizontal_form, html: { class: 'form-horizontal' } do |f|
        = f.input :title
        = f.input :body
        .form-group
          .col-md-9.col-md-offset-3
            = f.input :draft
        = f.input :published_at
        .form-group
          .col-md-9.col-md-offset-3
            = f.button :submit
    ```
  - bootstrap_form
    ```
      = bootstrap_form_for @post, layout: :horizontal, label_col: 'col-md-2', control_col: 'col-md-10', url: bootstrap_forms_path do |f|
        = f.text_field :title
        = f.text_area :body
        = f.form_group do
          = f.check_box :draft
        = f.datetime_select :published_at
        = f.form_group do
          = f.submit
    ```

- `require`、`maxlength`などの自動設定
  - `require`両方とも`validates :title, presence: true`によって自動的に`required`のCSSクラスが付与される
    - simple_form
      - CSSの表現もデフォルトで付いている
    - bootstrap_form
      - デフォルトはCSSのクラス付与だけ、どう表現するかは自分でCSSを書く必要がある
        ```
        label.required:before
          content: " *"
        ```
  - `maxlength`, `size`は両方とも生成されない

- エラー情報の表示
  - 両方ともフィールドの下に表示してくれる
- I18n
  - 両方ともデフォルトでモデルのI18n設定を読み取ってくれる
- 入力フィールドの種類
  - [simple_form Available input types and defaults for each column type](https://github.com/plataformatec/simple_form#available-input-types-and-defaults-for-each-column-type)
  - [bootstrap_form form-helpers](https://github.com/bootstrap-ruby/rails-bootstrap-forms#form-helpers)

## 画面
|simple_form|bootstrap_form|
|-----------|--------------|
|![simple_form.png](https://qiita-image-store.s3.amazonaws.com/0/4777/eb7fc8c9-a86c-aa3e-76e5-738b58303512.png)|![bootstrap_form.png](https://qiita-image-store.s3.amazonaws.com/0/4777/37bbc32e-7400-6ff2-3a1a-86c9fb1d16a0.png)|