OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Remote APIでECRのプライベートイメージを使ったSwarm Serviceを立ち上げる


## ECRを作る
![スクリーンショット 2016-08-19 13.13.20.png](https://qiita-image-store.s3.amazonaws.com/0/23936/36503451-3ccc-2c20-cbc5-525d8595ff35.png "スクリーンショット 2016-08-19 13.13.20.png")
Amazon ECSからRepositoriesを選択。

![スクリーンショット_2016-08-19_13_14_02.png](https://qiita-image-store.s3.amazonaws.com/0/23936/eddb361d-f932-74c8-fe46-23cec85a3e4f.png "スクリーンショット_2016-08-19_13_14_02.png")

リポジトリ名を決める。
![Amazon_EC2_Container_Service.png](https://qiita-image-store.s3.amazonaws.com/0/23936/b2f5a04a-b4ac-24dc-37bf-7dc398cfbb04.png "Amazon_EC2_Container_Service.png")

この後入れるコマンドの指示がくる。

## 接続情報などを手にいれる

初めのコマンドを打つとdockerコマンドが返ってくる。

```
$ aws ecr get-login --region us-east-1
docker login -u AWS -p XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<中略>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -e none https://XXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com
```

docker loginしたらbuildとかpushしてイメージを登録すればOK。

## Docker Remote APIのAUthentication
参考：https://docs.docker.com/engine/reference/api/docker_remote_api/#/authentication
"X-Registry-Auth"ヘッダーで以下のJSONをbase64エンコードしたものを送ればOK。

```
{
	"username": "string",
	"password": "string",
	"email": "string",
	"serveraddress" : "string",
	"auth": ""
}
```

先ほどのdockerコマンドと対応させるとこうなる。

```
{
	"username": "AWS",
	"password": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<中略>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
	"email": "none",
	"serveraddress" : "https://XXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com"
}
```
authは省略する。

で、base64エンコードする。

```
echo '{
	"username": "AWS",
	"password": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<中略>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
	"email": "none",
	"serveraddress" : "https://XXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com"
}' | base64
ZZZZZZZZZZZZZZZZZZZZZZZ<中略>ZZZZZZZZZZZZZZZZZZZZZZZZZ
```


##Serviceを作成する時のリクエスト
さっきのbase64した結果を`X-Registry-Auth`ヘッダーにつけてPOST投げればOK。

```
POST /services/create -d '{
  "Name": "example001",
  "TaskTemplate": {
    "ContainerSpec": {
      "Image": "XXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/IMAGE_NAME:latest",
      "Mounts": [{
        "Type": "volume",
        "Target": "/mnt/userdata",
        "Source": "fs-XXXXXX/example001",
        "VolumeOptions": {
          "DriverConfig": {
            "Name": "efs"
          }
        }
      }]
    }
  },
  "EndpointSpec": {
    "Ports": [
      {
        "Protocol": "tcp",
        "PublishedPort": 30001,
        "TargetPort": 8080
      }
    ]
  }
}' -H "X-Registry-Auth:ZZZZZZZZZZZZZZZZZZZZZZZ<中略>ZZZZZZZZZZZZZZZZZZZZZZZZZ"
{ "ID": "XXXXXXXXXXXXXXXXXXXXX"}
```
IDが含まれたJSONがきたら立ち上がってる。

確認したい場合はそのIDでGETして値が返ってくればOK。

```
GET /services/XXXXXXXXXXXXXXXXXXXXX
```
magitざっくりチートシート


# magitの画面を開く

```
M-x magit status
```

以下、magit-statusした画面を開いた状態からの動作です。

# ファイルのdiffを見る

* tabを押す
* トグルで指定したファイルのdiffが開いたり閉じたりする


# add

* 該当ファイルにカーソルを合わせてsを押す


# commit

## commit

* cを押す
* cを押す（通常のcommit）
* コミットメッセージを書いて C-c C-c


## commit --amend

* cを押す
* aを押す（commit --amendになる）
* コミットメッセージを書いて C-c C-c

# log

* lを押す
* lを押す
* RET を押すと各コミットの詳細が見れる
* 閉じる場合は `C-x k` でkill bufferすればいいと思うの


# push

## push

* `P` (Shift p)
* `P` (今のブランチをpushする）
* `origin/brancname` のようにpush先を入力

# checkout

## checkout

* `b`
* `b` (Checkout)
* チェックアウトするブランチ名を入力
* 開いているファイルは自動的に再読み込みされる

## checkout -b

* `b`
* `B` (Create & checkout)
* createする元となるブランチを指定
* createするブランチの名前を入力

# stash

## stash

* `z`
* `z`
* stash message を書く

## stash pop

* `z`
* `p`
* popするstashを選ぶ

## stash drop

* statusのstash一覧で消したいstashに合わせて `k`

# pull

## pull

* 目的のブランチにcheckoutしておく
* magit-statusの画面で `F`
* `F`
* この時、stashするべき変更がある場合はエラーがでてpullされないので、そのような場合はstashしておくのが吉
* 開いているファイルは自動的に再読み込みが走る


# git reset HEAD^ --soft

* `C-x magit-reset-soft`
* `HEAD^`
EMR+Lambdaでバッチ処理を自動化する（Lambdaの準備編）


現在作っているEMRでのバッチ処理が月次で行えば良いものなので、毎回EMRをマネジメントコンソールから立ち上げるのもめんどくさいですし、定期実行させるためのサーバを立てるのもめんどくさいですし、定期実行するLambdaで連携してみます。


Lambda Functionの作成
---

1. とりあえずLambdaを開いて

	![スクリーンショット 2016-08-19 11.34.35.png](https://qiita-image-store.s3.amazonaws.com/0/18331/6ec4879d-a5ed-6ac6-5f32-1e2578b16d1f.png "スクリーンショット 2016-08-19 11.34.35.png")
	

2. blueprint, triggerは特に設定せずにSkip

	


	![スクリーンショット 2016-08-19 11.39.06.png](https://qiita-image-store.s3.amazonaws.com/0/18331/64ebbed8-9322-8f28-1b61-240b5eefac6a.png "スクリーンショット 2016-08-19 11.39.06.png")
	
	![スクリーンショット 2016-08-19 11.39.13.png](https://qiita-image-store.s3.amazonaws.com/0/18331/3435e872-80ad-ae9d-7953-d4a9160c0b23.png "スクリーンショット 2016-08-19 11.39.13.png")

	
	定期実行するLambdaの設定に関しては、こちらから（http://qiita.com/RyujiKawazoe@github/items/64e8a65ab3e4909678fc）
	
3. Lambdaの設定を行う

	![スクリーンショット 2016-08-19 11.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/18331/dc3d2dfa-263a-a2e2-47a6-10cdf36d9c59.png "スクリーンショット 2016-08-19 11.40.48.png")

	私の場合は、JavaでLambdaの実行コードを記述しています。
	jarを直接アップロードorS3から読み込ませる２択になるのですが、
	
	 ~~~
	 For files larger than 10 MB, consider uploading via S3.
	 ~~~ 
	 
	 のように、jarサイズが10MBを超える場合はS3にまずjarをアップロードし、jarのURLを"S3 Link URL"に入れてください。（jarのURLをpublishにする必要はありません）
	 
	 ![スクリーンショット 2016-08-19 11.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/18331/f5e44949-23a5-db62-d162-a1b56d6be0dd.png "スクリーンショット 2016-08-19 11.41.01.png")

	Handlerには、Lambdaが実行するクラス、メソッド名を指定してください
	
	~~~
	パッケージ.クラス::メソッド
	~~~
	
	Roleについては後述します。
	
4. あとはReviewしてOK押せば、作成完了です。


Lambdaに設定するIAM Roleについて
---

私が作成したLambdaアプリケーションは、以下の振る舞いをするものです。

1. S3のオブジェクトチェック
2. 1でチェックしたオブジェクトがなければEMR起動

なのでLambdaに設定するRoleは

* S3にアクセスできるもの
* EMRにアクセスできるもの
* LambdaがLogを作成できるもの（これは最初S3のテンプレートを選んだためデフォルトで付いてました）-> "S3 read-only permissions"

となります。


ただ、"S3 read-only permissions"だけ選んで、S3オブジェクト存在チェックを行うと（コードは以下）

~~~
final AmazonS3 s3Client = new AmazonS3Client();
final String s3ObjectPath = "aaa/bbb/ccc/ddd.txt"
s3Client.doesObjectExist(BUCKET_NAME, s3ObjectPath);
~~~

のように

~~~
s3Client.doesObjectExist
~~~
	
メソッドを読んだら、403エラーが起きたので

Lambdaに設定するIAM Roleは以下のようにしています。

![スクリーンショット 2016-08-19 13.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/18331/f06b1080-8e85-923d-90f5-934aee55d982.png "スクリーンショット 2016-08-19 13.14.34.png")

（正直絞り込んだ方がいいと思うのですが、めんどくさいのでとりあえず）
gemコマンドのサブコマンド一覧を見るワンライナー

gem help だと全部のサブコマンドが出せない！のでワンライナーメモ。ただこれだと標準組み込みのコマンドのみなので注意。

```
 ruby -rrubygems/command_manager -e 'puts Gem::CommandManager::BUILTIN_COMMANDS.join("\n")'
```

```
build
cert
check
cleanup
contents
dependency
environment
fetch
generate_index
help
install
list
lock
mirror
open
outdated
owner
pristine
push
query
rdoc
search
server
sources
specification
stale
uninstall
unpack
update
which
yank
```
Gitで管理されているWordPressテーマを自動でプルさせる

# はじめに
ある案件でコーダーさんから「これgitでプッシュしたら自動でpullさせらんないッスか?」といわれて「そんなんcron使えば簡単っすわー」って言ったのですが色々とはまったりしたのでメモ。
環境はさくらのレンタルです。

# gitのリポジトリにアクセスできるようにする
あらかじめホスティング先でgitにアクセスできるようにしておきます。

# コードを置く

作成中のWordPressテーマの下にファイルを置いてください。
その後、ファイルの先頭部分にある箇所を書き換えます。
書き換える項目はリポジトリのパス、ログファイルの書き出し場所です。

```php:deploy.php
<?php

$repodir = ''; // path to repository
$branch = 'master'; // branch to deploy ex. 'master', 'develop', ...
$logfile = ''; // path to logfile
$git = '/usr/local/bin/git'; // git command path ex. '/usr/bin/git', '/usr/local/bin/git'
$key = 'this-is-secret'; // secret

/**
 * Thanks @link http://qiita.com/abeyuya/items/773c26384297efe1f9a1
 *
 * Class GitDeploy
 */
class GitDeploy {

	private static function is_valid_key() {
		global $key;
		if ( isset($_POST['key']) && $key === $_POST['key'] ) {
			return true;
		} else {
			return false;
		}
	}

	public static function deploy() {
		global $repodir, $logfile, $branch, $git;
		if ( 'POST' !== $_SERVER["REQUEST_METHOD"] ||
		     !self::is_valid_key()
		) { // invalid access
			echo "Invalid access. Only POST method with correct 'key' is allowd.";
		} else { //echo 'good access';

			$cmd = '';
			$cmd .= 'cd ' . $repodir . ';'; // cdしないとなぜか失敗する
			$cmd .= "{$git} --git-dir={$repodir}/.git reset --hard;";
			$cmd .= "{$git} --git-dir={$repodir}/.git pull origin {$branch}; ";
			$cmd .= "{$git} --git-dir={$repodir}/.git reset --hard; ";
			$retstr = system( $cmd, $res );
			$fp     = fopen( $logfile, "a" );
			fwrite( $fp, date( 'c' ) . "\n" );
			if ( 0 !== $res ) { // error
				fwrite( $fp, "cmd false\n{$retstr}" );
			} else { // success
				fwrite( $fp, $res . "\n" . $cmd );
			}
			fclose( $fp );
		}
	}
}

GitDeploy::deploy();
```

# テスト用のワンライナー
なんだかんだでテストが大変でした。ワンライナーをバラしたものをメモしておきます。

1. 手元で乱数をファイルに保存
2. 手元でコミット
3. 自動デプロイスクリプトの呼び出し
4. デプロイ先で表示できるかチェック

となっています。

```sh
# do test commit, raise deploy.php, then check it.
echo $RANDOM > hoge.txt;
git add --all;
git commit -m 'test commit';
git push origin master;
cat hoge.txt;
curl -X POST -d 'key=this-is-secret' http://example.com/deploy.php;
curl http://example.com/path/to/deployed/hoge.txt
```

# その他
deploy.phpのコードを置く場所については悩みますが、ひとまずテーマとしました。
変数部分とかもありますし、プラグイン化したら楽そうですね。

ハマリポイントとして、スクリプトからでは`git`コマンドの`--git-dir`がうまく動きませんでした。ここでめちゃめちゃハマリました。
上記のコードにも一応付いていますが`cd`させています。
`svn`,`tar`,`gzip`とかで遭遇することが多かったりしますが、cwd周りで困ることが多い気がします。

さくらのレンタルはOSがFreeBSDです。gitへのパスが`/usr/local/bin/git`でした。

gitのリポジトリディレクトリについては、手元で落としてFTPでアップする、というのもありかなと思いました。ターミナルが苦手な方多いですし。
とはいえそうなるとsshの鍵設定は大変ですね。うーん。

# 参考

> bitbucketからの自動デプロイ 
> http://qiita.com/abeyuya/items/773c26384297efe1f9a1

> work tree の外から git pull する
> http://this.aereal.org/entry/2014/05/19/192043

> Bitbucket や GitHub で自動デプロイするためのサンプル PHP スクリプトを拾って改造してみた
> http://ja.katzueno.com/2015/01/3390/


> Bitbucket とさくらレンタルサーバーを使って更新ファイルを自動アップする。
> http://ishida-design.com/blog/bitbucket-sync_sakura
直線位置調整 > 回路図 > NチャネルMOSFETでのS-12駆動

関連 http://qiita.com/7of9/items/1ed403244bf072faeb17

> 2SK4017を使っているモーター駆動例も見つかった。
http://kohacraft.com/archives/1048634380.html

上記のリンクのブレッドボード実装を回路図にしてみた。
<font color=red>(間違っているかもしれない)。</font>
https://upverter.com/7of9/12f16f7f40fac9b0/160819_MOSFET_motorDrive/

- S-12のICパーツはないので抵抗で図示した
- LEDの制限抵抗は図で省略されているかもしれない
- ~~Ni-HN BATTは4本直列に見えるが、正しいか未消化~~

http://kaden.watch.impress.co.jp/docs/column/fujilabo/515456.html
> ニッケル水素電池は1.2Vと、少し電圧が低めだ。

~~1.2V x 4 で4.8Vを作っているのだろうか。~~
記事に書かれていた。

> 電池4本をモーター用の電源にして、マイコンと別にしました(3V用のモーターでしたら電池2本でいいです。すぐ電池がなくなるので充電電池がおすすめです)。

さらに、コメント欄への質問にも回答いただきました。
Bluemix：簡易ETLサービスDataConnect（日本語データへの対応）

**サービスの名前が変わったようなので、タイトルだけ名前変えてます**
**旧：DataWorks 
新：DataConnect**

先日、2つの異種間データベースでのデータコピーを試しましたが、日本語データはできるのかな？というわけでやってみました。

## 詳細な手順等は前回書いたこちらをご参照。
http://qiita.com/azzeten/items/a0b604c67d993387ff5e

## 対象にした日本語データはこちら。
表の名前も日本語、データの中身も日本語です。
![スクリーンショット 2016-08-19 12.36.11.png](https://qiita-image-store.s3.amazonaws.com/0/119378/02dd5eca-48c0-a844-b718-4d574fa1583e.png)


## いざ、Dataworksでコピー
![スクリーンショット 2016-08-19 10.49.34.png](https://qiita-image-store.s3.amazonaws.com/0/119378/19849978-b5c1-f608-64fb-200d67891d8c.png)


##できました
いろんな操作やドキュメントを読んだりするのは英語で頑張る必要がありましたが、データ自体は日本語が使えるようです。めでたしめでたし。
![スクリーンショット 2016-08-19 12.38.46.png](https://qiita-image-store.s3.amazonaws.com/0/119378/4f3d7fe5-333e-da46-6e4f-407187ae267a.png)
Xcode 正式版で iOS beta 版をビルドする方法


## はじめに
Xcode の beta 版でビルドするといろいろ困ることがある。
今回は Xcode 7 で iOS 10 の端末をビルドしてみたので
忘却を防ぐためにメモする。

> 開発環境が壊れる場合があります。
> 自己責任でお願いいたします。

## 準備
* Xcode.app (正式版)
* Xcode-beta.app (Xcode 8 beta 版)

各種 Xcode をインストールしておく。
Xcode を複数バージョンで管理している方が多いと思うので
リネームする。例えば下記ディレクトリ構成，ネームとする。

```
/Applications/Xcode7_3_1.app
/Applications/Xcode8-beta-6.app
```

ルートディレクトリ直下の Applications に突っ込む。


## iOS 10 用の SDK を Xcode 正式版に導入(シンボリックリンクorコピー)

コピーしてもいいけど容量が無駄だったりするので，(Xcode自体ガー)
Xcode beta版はどんどん消していくスタイルの方はコピー，
Xcode beta版でも残していくスタイルの方はシンボリックリンクでいいかな。

例えば，下記コマンドを打つ(リンク版)。要：管理者権限

```bash
$ sudo ln -s /Applications/Xcode8-beta-6.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.0\ \(14A5339a\)/  /Applications/Xcode7_3_1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.0_14A5339a
```

コピー派の方は ```ln -s``` を ```cp -r``` に変えればOK。
**14A5339a** とか Xcode.app のネームを変えると汎用的になります。
シェルとか書いとくと楽なのかなー
Apple Watch とかも同様でいいはず。

ディレクトリ名に ```()``` 使うとかありえへん・・・

いないとは思いますが，CUI 苦手な方は Finder でも出来るので同じことをすればいいです。
Xcode8-beta-6.app を選択して **パッケージの内容を表示** を押して
上記のディレクトリたどっていってください。iOS 10 のディレクトリをコピペするだけです。

あとは Xcode 7.3.1 で iOS 10 の端末で無事にビルドできれば OK。

## おわりに
Xcode 正式版で iOS beta 版をビルドする方法について備忘録書きました。
私はこうしてるよー等ありましたらご教示いただきたいです。

ご覧いただきありがとうございました！！
指定の色で塗り替えた UIImage を作る

UIImageView には Tint Color の仕組みがあるので、Template Image にしておけばその画像は Tint Color で塗りつぶした見た目になる。が、UIImageView を使わずに描画したい場合がでてきたので以下のエクステンションで対応した。

```swift
import UIKit

extension UIImage {
	
	func coloredImage(color: UIColor) -> UIImage {
		UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
		
		let bounds = CGRectMake(0, 0, size.width, size.height)
		let context = UIGraphicsGetCurrentContext()
		
		drawInRect(bounds)
		CGContextSetFillColorWithColor(context, color.CGColor)
		CGContextSetBlendMode(context, .SourceAtop) // SourceAtop にすることで画像の透過を考慮してくれる
		CGContextFillRect(context, bounds)
		
		let image = UIGraphicsGetImageFromCurrentImageContext()
		
		UIGraphicsEndImageContext()
		
		return image
	}
	
}
```

なお、macOS の Cocoa には自由に設定できる Tint Color の仕組みが見つからなかったため、NSImage でも同様のエクステンションを実装した。
[NSImage に Tint Color を適用する機能を拡張する](http://qiita.com/usagimaru/items/3a6ffa431e52817f15da)
仮想ディスプレイでchromeをseleniumで動かす環境

http://qiita.com/arc279/items/154de06d367ae0d9b53a

これの環境用意する版。

ubuntu じゃないとchrome動かないらしい。
centos はたぶん茨の道。

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

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
  end

  config.vm.provision :shell, :path => "provision.sh"
end
```

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

set -ue

# chrome
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
apt-get update
apt-get install -y google-chrome-stable

# 日本語環境
# これやっとかないとchromeで日本語表示するとトーフに化ける
wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | $ sudo apt-key add -
wget https://www.ubuntulinux.jp/sources.list.d/quantal.list -O /etc/apt/sources.list.d/ubuntu-ja.list
apt-get update
apt-get install -y ubuntu-defaults-ja

# 仮想ディスプレイ
apt-get install -y xvfb

# chrome webdriver
apt-get install -y unzip
cd /tmp
wget http://chromedriver.storage.googleapis.com/2.9/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
chmod +x chromedriver
cp chromedriver /usr/local/bin/

# imagemagick
apt-get install -y libmagickwand-dev

# ruby, gem
apt-get install -y ruby-dev
gem install selenium-webdriver
gem install rmagick
```

## 参考

http://qiita.com/yacchin1205/items/e742519e2df32c006679
Elasticsearch を restart したらIndexが消えてしまった


正直焦った

## あらすじ
ある日、 Elasticsearch を restart した時のこと

```
systemctl restart elasticsearch
```

無事に restart が終わり、indexを確認したところ

... 何も無い。 (キャプチャ画像も無い
(正確には、 kibana も使っているので .kibana のインデックスしか無い

おかしいと思い、インデックスが格納されているディレクトリを確認
(node.name には hoge_es を設定

```
cd /var/lib/elasticsearch/hoge_es/nodes
ls
 0 1
```

😂

見知らぬ 1 というディレクトリが作成されている...。
0 には 今まで使っていたindex達が格納されている。


## 解決
0 のディレクトリの node.lock を削除すれば良かった。

```
## ESを止めます
systemctl stop elasticsearch

## 1 の削除と node.lock を削除
cd /var/lib/elasticsearch/hoge_es/nodes

## 1　の削除 ( / (スラッシュ) ではないです
rm -rf 1

## node.lock の削除
rm 0/node.lock

## ESを起動
systemctl start elasticsearch
```

治りました。 😎

ではでは
carthage update したら 2段階認証で怒られた

Carthage を使ってみようとセットアップして、いざ 
```
carthage update --platform iOS
```
を実行した時に 
"Must specify two-factor authentication OTP code."
に遭遇してしまった時の話

## 環境
OS X El Capitan 10.11.6
git は homebrew で入れた
GitHubの二段階認証は途中から有効にした

## 発生
とりあえず Alamofire と ObjectMapper を入れようとした

```
carthage update --platform iOS

*** Fetching ObjectMapper
*** Fetching Alamofire
*** Skipped downloading Alamofire.framework binary due to the error:
  "Must specify two-factor authentication OTP code."
*** Checking out "Alamofire" at "3.4.1"
*** Skipped downloading ObjectMapper.framework binary due to the error:
  "Must specify two-factor authentication OTP code."
```

## 原因
MacのキーチェーンアクセスにGitHubへのインターネットパスワードが保存されていたのが問題だった。
そのため、キーチェーンアクセスで github.com で検索して出てきた github.com の設定を削除した。

## 動いた
```
*** Fetching ObjectMapper
*** Fetching Alamofire
*** Checking out "Alamofire" at "3.4.1"
*** Checking out "ObjectMapper" at "1.4.0"
*** xcodebuild output can be found in /var/folders/40/k7w36q_s24xcznlm5fvl8lvm0000gn/T/carthage-xcodebuild.jmP7V6.log
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace
*** Building scheme "ObjectMapper-iOS" in ObjectMapper.xcworkspace
```

ではでは
Chrome webdriver でフルサイズのスクリーンショット撮るやつ

http://qiita.com/myhr/items/dff7cee30182ab56f737
これのruby版。

ImageMagickが要る。

```rb
require "selenium-webdriver"
require 'rmagick'

module ChromeScreenShot
  def take_fullscreenshot(fname = "out.png")
    innerH = self.execute_script("return window.innerHeight")
    innerW = self.execute_script("return window.innerWidth")
    pageH  = self.execute_script("return document.documentElement.scrollHeight")
    pageW  = self.execute_script("return document.documentElement.scrollWidth")
    #p [innerW, innerH, pageW, pageH]

    img = Magick::Image.new(pageW, pageH)

    posY = 0
    while posY < pageH
      posX = 0
      while posX < pageW
        if posX > 0 and posX+innerW > pageW
          posX -= posX+innerW - pageW
        end
        if posY > 0 and posY+innerH > pageH
          posY -= posY+innerH - pageH
        end

        self.execute_script("window.scrollTo(%d, %d)" % [posX, posY])
        # NOTE: save_screenshot しないと scrollTo が反映されてないことがあった
        self.save_screenshot("/tmp/%s.%d_%d.png" % [fname, posX, posY])
        partial = Magick::Image.from_blob( self.screenshot_as(:png) )

        img.composite!(partial.first, posX, posY, Magick::OverCompositeOp)
        #p [posX, posY]

        posX += innerW
      end
      posY += innerH
    end

    img.write(fname)
  end
end

url = "http://qiita.com/myhr/items/dff7cee30182ab56f737"

wd = Selenium::WebDriver.for :chrome
wd.extend ChromeScreenShot
wd.navigate.to url
wd.take_fullscreenshot
wd.quit
```

## ちなみに

`position:fixed` な要素があるとうまくいかないんだけど何か良さげな解決案ないですかね。
jQuery 勉強メモ

jQuery勉強メモ

①
書き方は、 $(document).ready(function(){
このdocumentが読み込まれたら、次の処理をしない、の意味
となるが、もっと簡単に書くことが出来、
$(document).ready(function(){は、もっと短く書く事が出来、$(function()と記述することも出来る

② JQueryの勉強方法は、セレクターとメゾッドを覚えること。
  //セレクター：処理対象となるDOM要素を指定すること
    // メソッド：処理

③
メソッドは、続けて書くことができる
    $('p').css('color', 'red').hide('slow');
と書くと、カラーを赤字にして、ゆっくり消す　といった処理ができる様になる。
※メソッドを続けて書くことを、「メソッドチェーン」と言う

③
　・セレクターは、$('ｘｘｘ')と記述する
  ・html要素を指定する場合は、そのまま p とか、h1とかulとか記述すればok
  ・id要素へ指定する場合は、css同様に、 #をつけて記述する。例： #main , #sab　等
 　・class要素の場合は、. ドットをつけてあげる。　例： .item

④
   ・item クラスがついているものだけを赤くしたい場合
　　　$(".item").css('color', 'red');
　　・subのid要素を赤くしたい場合
　　　$("#sub").css('color', 'red');
    

⑤　セレクターとメゾットはいろいろな記号を使って便利に処理が出来る
　　例えば、、
    「 > 」は、直下の子要素
    「 　」（空白）は、それ以下の要素
    「 , 」は、複数の要素
    「 + 」は、隣接する要素

⑥
 ・例えば、メインidの直下のclass のitem 要素だけをピンク色にしたい場合。
  $("#main > .item").css('color', 'pink');

 ・例えば、メインidの以下のclass のitem 要素だけをピンク色にしたい場合。
    $("#main  .item").css('color', 'pink');
  ※　空白にすれば、それ以下の要素がピンク色になる。

⑦
  ・例えば、ｐ要素とitem 要素だけを青色にしたい場合。
    $("p, .item").css('color', 'blue');
と記述する

⑧
 　・例えば、item 要素に隣接するitem要素だけを青色にしたい場合。
    $(".item + .item").css('color', 'blue');
    とする。

 ⑨　セレクターで使えるフィルターの基本

基本の種類
 
:eq() カッコの中の添字（最初が０番目、からカウント）数字の部分だけ処理したい場合
:gt()　カッコの中より大きい
    greater thanの意味
:lt()　カッコの中より小さい
    less thanの意味
:even 　偶数（指定不要なのでカッコは無し）
:odd()  　奇数（上記同様、カッコ無し）
：contains()カッコの中の数字等がある中身を指定出来る
：first　最初　
：last　　一番最後
といった用語がある

・例えば、subの直下のliの要素に対して、選ぶ場合、
　$("#sub > li").css('color', 'yellow');
と記載する。

・例えば、eq番目だけの色を黄色に変えたい場合、
$("#sub > li:eq(2)").css('color', 'yellow');
と記載する。

・例えば、gtを使うと、1番目以降の色を黄色に変えたい場合、
    $("#sub > li:gt(1)").css('color', 'yellow');
    と記載する。

・例えば、奇数番目の色を黄色に変えたい場合、
  $("#sub > li:odd").css('color', 'yellow');
と記載する。

・例えば、中の文字などに4が記載されている所だけ黄色に変えたい場合、
 $("#sub > li:contains('4')").css('color', 'yellow');
   と記載する。

・例えば、最初の箇所だけ黄色に変えたい場合、
 $("#sub > li:first").css('color', 'yellow');
  と記載する。

⑩　
メゾッドを使ったDOM要素の指定を勉強
　parent()ある要素の親要素を指定したい時
　children()ある要素の子要素を指定したい時
　next()次の要素を指定したい時
　prev()前要素を指定したい時
　siblings() 兄弟要素 指定された要素の同列の要素を指定したい時
といった内容がある。

・例えば、subの親要素全体を指定したい時、    $("#sub").parent().css('color', 'red');
 });
と記述する

・例えば、subの子要素全体を指定したい時、
$("#sub").children().css('color', 'red');
 });
と記述する

・例えば、subのliの要素の上から２番目（0,1,2番目）の次（next)の要素を指定したい時、
$("#sub > li:eq(2)").next().css('color', 'red');
 });
と記述する

・例えば、subのliの要素の上から２番目（0,1,2番目）の要素と同列の要素を指定したい時、
$("#sub > li:eq(2)").siblings().css('color', 'red');
 });
と記述する
结合 Docker compose 来玩 rails


首先既然是基于 docker 的, 那就需要从` Dockerfile` 开始说起. 我们需要定义一个 `Dockerfile` 来说明本项目到底要干什么,有什么依赖. 

```Dokcerfile
FROM ruby:2.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

上面的定义说了些什么做了些什么, 之前有说到过, 具体就是说, 我们先搞一个基于 `ruby2.2.0`的  ubuntu 的 镜像, 然后安装开发基本包, 还有 nodejs 环境.  然后

1. 创建一个`/ myapp` 目录, 然后设置它为工作目录
2. 然后添加 Gemfile 和 Gemfile.lock 文件, 他们就是在准备一个基础的 Rails 工程
3. 然后 bundle 当前这个工程

#构建项目

通过` docker-compose run` 来构建

```

$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
```

>假如你已经是从一个已有的 rails 项目目录开的,就不需要再执行这些


基本上` compose` 也是基于` Dockerfile`的定义来一步步完成构建的, 上面的命令其实它是先通过` rails new`来创建了一个空的 rails 项目. 然后将这个项目添加到 docker 的工作目录.

这里我们是要使用 postgre, 那就修改` config/database.yml` 文件

```
development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test
```



接下来就是构建镜像

```
docker-compse build
```

如果没有问题, 我们试着启动这个服务:

```
docker-compose up
```

拿到当前 container 的 ip 还有默认的端口试着访问下. 估计会报错.
你需要

```
docker-compose run web  bin/rails db:migrate RAILS_ENV=development
```

然后再次

```
docker-compose up
```
就没有问题了
WebRTCでビデオチャット

# テーマ
WebRTC

### 取り組んだ理由
知り合いに勧められたから

---

# WebRTCとは
>WebRTC (Web Real-Time Communication)とはWorld Wide Web Consortium (W3C)が提唱するリアルタイムコミュニケーション用のAPIの定義で、プラグイン無しでウェブブラウザ間のボイスチャット、ビデオチャット、ファイル共有ができる。
 [wikipedia](https://ja.wikipedia.org/wiki/WebRTC)より

---
WebRTCのおかげで非常に**簡単に**ビデオチャットなどを実現できる

P2P通信であり、ブラウザ同士がデータのやり取りをする
ただその通信を確立するための、**シグナリングサーバは必要**

---
# 実践
偉大な先人を多数確認
~~パクる~~全面的に参考にする方針に決定

[WebRTC入門2016](https://html5experts.jp/series/webrtc2016/)

---
## 結果
ブラウザからwebカメラにアクセスするのは非常に簡単
WebRTCでのデータやり取りも非常に簡単

シグナリングサーバは少し難しい・・・頑張りどころだ！

---
## もう少し調査
あっ・・・
[【PeerJS】HTMLファイルだけでリアルタイムなビデオチャットを作る | KRAY ...](http://kray.jp/blog/peer-js/)
~~パクる~~全面的に参考にする方針続行

---
## 結局シグナリングサーバはどうしたか
[Sky Way](https://nttcom.github.io/skyway/index.html)というサービスを利用

ドキュメントもわかりやすいし、**無料**だし、いい時代です。

---

# 成果
[ビデオチャット](https://nagamoto.github.io/video_chat)

![スクリーンショット 2016-08-19 12.49.32.png](https://qiita-image-store.s3.amazonaws.com/0/112173/fafbaf0e-8404-039c-a83b-67d932d4b704.png)

---

### 使い方
1. 通話相手のIDを聞くor自身のIDを教える
1. IDを入力し、コールボタンを押すorコールされるのを待つ

### 動作確認ブラウザ
Chrome, Firefox

---
# まとめ
WebRTCは非常に簡単
とりあえず実装するだけなら、通信の知識もさほど必要ではない

先人達は偉大

---
## 副産物
WEBカメラからの映像を扱うのがとても簡単で驚いた勢いで作りました

[万華鏡](https://nagamoto.github.io/kaleidoscope)
※個人差はありますが、衝撃的な映像が流れることがあります

---
参考URLに詳しく記載されているので、このページでコードには触れていません
わかりやすく非常にありがたかったですm(__)m

一応[こちら](https://github.com/nagamoto/nagamoto.github.io/blob/master/video_chat.html)からソースコード確認できます
Lambdaを定期実行するためにCloudWatchを設定する


Lambdaの実行を、Schedule実行できるようになったのは大分前の話になりますが、最近使う機会ができたのでやってみます。



![スクリーンショット 2016-08-19 10.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/18331/dea4f8f0-7e52-5e97-a86f-9c806dafc1e3.png "スクリーンショット 2016-08-19 10.47.24.png")

### さーて、ここから定期実行できるTriggerを設定するか〜と思ったら、操作性が悪すぎたのでCloudWatchからSchedule Eventを作成します。


CloudWatchの設定
---

1. "Rule"から"Create Rule"を選択

	![スクリーンショット 2016-08-19 10.09.58.png](https://qiita-image-store.s3.amazonaws.com/0/18331/9401141f-eec9-1e37-5e75-3da46a1cf542.png "スクリーンショット 2016-08-19 10.09.58.png")


2. Scheduleの内容を記入
	
	cronの記入に関しては、馴染み深いと思いますので説明不要ですね。
	### 時間帯に関してはUTCなので注意
	Functionに関しては、起動させたいLambdaのFunction名を入れてください。
	
	"Configure Input"の指定が最初Matched eventでやっていたらうまくいかなかったので（なぜだ）、LambdaのTest時に私の場合は空Jsonを渡して起動させていたため同じように、渡したら動きました。ただし、これはLambdaを動かすコードが悪いかも。

	![スクリーンショット 2016-08-19 10.41.13.png](https://qiita-image-store.s3.amazonaws.com/0/18331/d62e88f0-93d1-7e50-9060-2a8ec0c92cdb.png "スクリーンショット 2016-08-19 10.41.13.png")

3. あとは次の画面で名前を入れて完成です。

作成が終わると、Functionで指定したLambdaのTriggersタブに追加されていると思います。
iPhone iPad LaunchImageのサイズ一覧(2016/08/19)

iPhone iPad LaunchImageのサイズ一覧(2016/08/19)

| device                                      | height | width |
|---------------------------------------------|-------:|------:|
|iPhone Portrait iOS8 Retina HD 5.5           | 1242   | 2208  |
|iPhone Portrait iOS8 Retina HD 4.7           | 750    | 1334  |
|iPhone Landscape iOS8 Retina HD 5.5          | 2208   | 1242  |
|iPhone Portrait iOS7,8 2x                    | 640    | 960   |
|iPhone Portrait iOS7,8 Retina 4              | 640    | 1136  |
|iPad Portrait iOS7,8 1x                      | 768    | 1024  |
|iPad Portrait iOS7,8 2x                      | 1536   | 2048  |
|iPad Landscape iOS7,8 1x                     | 1024   | 768   |
|iPad Landscape iOS7,8 2x                     | 2048   | 1536  |
|iPhone Portrait iOS5,6 1x                    | 320    | 480   |
|iPhone Portrait iOS5,6 2x                    | 640    | 960   |
|iPhone Portrait iOS5,6 Retina 4              | 640    | 1136  |
|iPad Portrait Without Status Bar iOS5,6 1x   | 768    | 1004  |
|iPad Portrait Without Status Bar iOS5,6 2x   | 1536   | 2008  |
|iPad Portrait iOS5,6 1x                      | 768    | 1024  |
|iPad Portrait iOS5,6 2x                      | 1536   | 2048  |
|iPad Landscape Without Status Bar iOS5,6 1x  | 1204   | 748   |
|iPad Landscape Without Status Bar iOS5,6 2x  | 2408   | 1496  |
|iPad Landscape iOS5,6 1x                     | 1024   | 768   |
|iPad Landscape iOS5,6 2x                     | 2048   | 1536  |
CircleCIでUbuntu 14.04がデフォルトのイメージになりました

前からビルドに使うイメージをUbutnu 14.04に変更可能でしたが今回それがデフォルトになりました。

詳細: https://discuss.circleci.com/t/ubuntu-14-04-trusty-is-the-default-os-for-new-projects/5784
Mac OS X 10.6 Snow Leopardでmruby

PowerPCなアプリをメンテしている関係で、開発環境を10.6から移行できず、この環境でmrubyを使えるようしてみました。

まず10.6に元々入っているrubyは1.8でmrubyがビルドできないのでrubyをビルドします。2.3系が現時点では最新のようなので、ruby-2.3.1をダウンロードします。

Mac OS X 10.6でruby-2.3.1のconfigureを実行するとclangが無いって怒られます。

```
% ./configure 
checking for ruby... /usr/bin/ruby
downloader.rb:180: private method `class_variable_set' called for Downloader:Cla
ss (NoMethodError)
checking build system type... x86_64-apple-darwin10.8.0
checking host system type... x86_64-apple-darwin10.8.0
checking target system type... x86_64-apple-darwin10.8.0
checking for clang... clang
<stdin>:2:3: error: #error premature clang
        #error premature clang
         ^
1 error generated.
configure: error: clang version 3.0 or later is required
```

10.6で使えるXcode 3.2.xはclangではなくgccだったので以下のようにします。

```
% ./configure --with-gcc
```

これでmakeするとrubyが出来上がるので、sudo make installします。Cocoaなアプリも開発しているので、Mac OS Xでは依存で他の環境で動作しないなどの問題が起きるので、できる限り/usr/localにはインストールしないようにしているのですが、これはしかたがありません。

mruby-1.2.0のディレクトリに入って、以下を実行します。

```
% /usr/local/bin/ruby ./minirake
```

これでbuild/host/binの下にmrubyが出来上がります。

ついでにPowerPC版のmrubyもクロスビルドしてみました。10.4のSDKでビルドしたかったんですが、うまくいかず10.5のSDKでビルドしてみました。build_config.rbに追加した内容は以下のようになります。

```
MRuby::CrossBuild.new('ppc') do |conf|
   toolchain :gcc
   conf.cc.command = '/Developer/usr/bin/gcc-4.0'
   conf.cc.flags << "-arch ppc -isysroot /Developer/SDKs/MacOSX10.5.sdk"
   conf.linker.flags << "-arch ppc -Wl,-syslibroot,/Developer/SDKs/MacOSX10.5.sdk"
   conf.gembox 'default'
end
```

出来上がったバイナリはちゃんとMac OS X 10.5/PowerPC G4で動きました。我が家ではPowerPC G4もまだまだ現役です。

余談ですが、ビット・トレード・ワンさんの赤外線リモコンをコントロールするmrbgemを作ってみたのですが、PowerPC/10.5,Intel/10.6でちゃんと動きました。HIDの処理コードはKLabさんの方が作った物をそのままなんですが。

https://github.com/yamori813/mruby-remocon
关于如何删除 centos linux 系统的内核镜像


每次在你升级了 centos 的 linux 内核版本之后,默认系统并不会删除旧的镜像, 而是叠加到内核启动 list 的最上面. 当然这个并不会引发任何的问题, 你也并不需要做额外的动作来处理这些没用的旧的镜像.

不过有时候财力有限买到的磁盘没用那么大,经常要担心不够用, 所以就要去看看`/ boot` 这个目录了,

```
$ df -h /boot/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       331M  198M  112M  64% /boot
```

或者你可以去编辑一下启动文件`/etc/grub.conf`, 下面的命令会帮助你移除那些不需要的 centos linux 镜像. 我们先罗列下有那些镜像:

假如是这样的结果:

```
# rpm -q kernel
kernel-3.10.0-229.4.2.el7.x86_64
kernel-3.10.0-229.el7.x86_64
kernel-3.10.0-229.20.1.el7.x86_64
kernel-3.10.0-229.11.1.el7.x86_64
kernel-3.10.0-327.3.1.el7.x86_64
```

假如你当前加载到的就是最新的内核镜像, 如`kernel-3.10.0-327.3.1.el7.x86_64`,通过` uname -r` 就可以获得:

```
$ uname -r
3.10.0-327.3.1.el7.x86_64
```

接下来, 我们需要这样一个工具包` package-cleanup` 来协助移除除当前使用的最新的其他的所有不需要的内核.

``` 
yum install yum-utils
```

到这里我们就可以用` package-cleanup` 这个命令来移除旧内核了. 这个`-- oldkernels` 选项就是告诉命令我们想要移除旧的内核. 而这个`--count=1`就是说别把所有的都给删了,留一个. 这样以备不时之需啊. 我们来执行这个命令:

```
# package-cleanup --oldkernels --count=1
```

来确认下:

```
# rpm -q kernel
kernel-3.10.0-229.20.1.el7.x86_64
kernel-3.10.0-327.3.1.el7.x86_64
```


ref

1. http://serverfault.com/questions/439090/how-to-free-up-space-on-rhel6-boot-safely
2. https://linuxconfig.org/how-to-remove-unused-kernel-images-from-centos-linux-system
Swift GCDをゆるふわに触ってみる


## はじめに

GCDとはGrand Central Dispatchの略

iPhone5以上の端末は、プロセッサを2つ搭載しているので、重い処理は並列処理を使うと良い。

## ディスパッチキューの準備

### メインディスパッチ

- 始めから存在しているため呼び出すのみ
- 1つのみ存在する
- 直列処理が可能

```swift
let mainQueue = dispatch_get_main_queue()
```

### グローバルディスパッチ

- 始めから存在しているため呼び出すのみ
- 5つ存在する
- 並列処理が可能
- 使用用途を指定して呼び出す

```swift
let globalQueue = dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)
```

`qos_class_t` は以下の種類が選択可能

| 用途 | qos_class_t |
| :-: | :-: |
| User Interactive | QOS_CLASS_USER_INTERACTIVE |
| User Initiated | QOS_CLASS_USER_INITIATED |
| Default | QOS_CLASS_DEFAULT |
| Utitlity | QOS_CLASS_UTILITY |
| Background | QOS_CLASS_BACKGROUND |

### プライベートディスパッチ

- 始めから用意されているディスパッチキューだと不都合がある場合に作成する
- 規則と使用用途を指定して作成する
- 使用後はディスパッチキューの開放をする

```swift
let queueAttribute = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INTERACTIVE, 0)
let queue = dispatch_queue_create("キュー", queueAttribute)
```

`0` と指定したところが優先度になる `-1` などにするとUser Interactiveから少し優先度が落ちる
また、優先度を指定しない作成は以下のようになる

```swift
let queue = dispatch_queue_create("キュー"m DISPATCH_QUEUE_CONCURRENT)
```

## タスクの追加

ここでは例でメインディスパッチキューを使用する

### 同期

タスクをキューに追加したあと処理が完了するまで次の行の処理を行わない。

```swift
let queue = dispatch_get_main_queue()
dispatch_sync(queue, {
    print("同期処理")
});
```

### 非同期

タスクをキューに追加したあとこのタスクの完了を待たずに次の行の処理を行う。

```swift
let queue = dispatch_get_main_queue()
dispatch_async(queue, {
    print("非同期処理")
})
```
Trinity が Perl の Thread support のせいで動かない時。

## Trinityで見慣れない警告

RNA-Seqを用いたトランスクリプトーム解析用のソフトウェア Trinity 。これをインストールし、実行したら以下の様な警告が出た。

```
$ ./Trinity -version
This Perl not built to support threads
Compilation failed in require at ./Trinity line 5.
BEGIN failed--compilation aborted at ./Trinity line 5.
```

ちなみに使用はcentos6で、perlのバージョンの問題かと思ってplenvでバージョンを上げたが効果なし。

## plenvで解決

その後よく調べると（というか警告にも書いてあるのだが）perlがインタプリタスレッド対応してない事が原因のよう。そこでplenvを用いてインタプリタスレッド対応のPerlをインストールし直したら解決した。

```
$ plenv install 5.18.2 -Dusethreads
$ plenv global 5.18.2
```

plenvの導入などは省略する。

## 参照元

http://qiita.com/TaMaMhyu/items/0d0597ab31559b82938d
https://github.com/trinityrnaseq/trinityrnaseq/wiki
AdMobメディエーションでFAN(facebook audience network)を出す方法

## 環境
xcode 7.3.1
OSX ElCaptian 10.11.6
swift2.x

admobのメディエーション（いろんなネットワークNendやFANなど、単価や地域等を最適化して広告出す場合に使ったり）

## 理解が早い人向け手順

1. FANのSDKを入れる
 https://developers.facebook.com/docs/audience-network/
2. FANのメディエーション用adapterを入れる https://firebase.google.com/docs/admob/ios/mediation-networks
3. admob管理画面で、FANの情報(Placement ID)を設定し紐付け完了。
4. admobを通常どおりに導入し、AD表示。(FANを紐付けしているapiキーを使う）
5. 配信比率をコントロールし表示できるか確認。

ほとんど通常のadmob導入とかわらず、びっくり！
ただ反映されているか確認するのが、わかりずらかった。汗
あと、メディエーションの説明がほとんどなかったですが汗


## すこし細かく導入方法!

## admobの設定(admobの設定

### 1. admobの管理画面で、広告ユニットを作る

### 2. 作った広告ユニットにメディエーション列に広告ソースというリンクがあるので、そこから連携したネットワークを選ぶ（今回はFAN)
 1. facebook audience networkを選択し、
 2. Placement IDを入力（まだ用意していない場合は、facebook audience netwrokの枠を作ってから

<img width="1011" alt="スクリーンショット 2016-08-19 8.59.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/78504821-d28f-779e-cdb1-cce01b2d097e.png">


### 3. admobSDKをインストールする
 1. SDKのダウンロード：https://firebase.google.com/docs/admob/ios/download?hl=ja
 2. SDKの導入方法：https://firebase.google.com/docs/admob/ios/quick-start?hl=ja
 (Podを使うと楽）

### 4. admobの単体の広告表示を確認する。

## FANの設定

### 5. Facebook Audience Network SDKのインストール 
　SDKのダウンロード: https://developers.facebook.com/docs/audience-network/
　podなら

```:Podfile
pod 'FBAudienceNetwork' 
```
```
# pod install
```

### 6. admobメディエーション用のadapterを入れる
 1. アダプターのダウンロード:https://firebase.google.com/docs/admob/ios/mediation-networks
 2. xcodeのプロジェクトに放り込んだらOK


## 表示を確認

### 7. 反映を確認
 ここでadmobの管理画面で調整して、反映されているかなど確認する必要がかるかも汗


#### facebook メディエーション用adaptorはここから
> https://firebase.google.com/docs/admob/ios/mediation-networks

#### facebook audience networkのメディエーションの説明、これだけ。。汗
> https://developers.facebook.com/docs/audience-network/faq#a11

### 完!!（少しでも参考になれば幸いです汗
mac 写真アプリの画像抽出

# やりたい事
Google Photoにmacの写真アプリ内のデータをすべてアップしたい。
## 困ったこと
ブラウザから写真のマスタ
Pictures/写真\ Library.photoslibrary/Masters
を指定して、全アップしたかったが、ファイル単位でしか指定できないみたい
## 画像の抽出をしてみる
外部ストレージ /Volumes/DETA/googlePhoto/ に、Mastersの全ファイルをコピーする。
```find Masters/ -type f -print0 | xargs -0 -J % cp -p % /Volumes/DETA/googlePhoto/```
ファイル名に空白が含まれているものがあったので-print0、xargs -0を記述
・元サイズ：159GB
・コピー後のサイズ：110GB
あれれ、ずいぶん小さくなったもんだ。。。
マスターの方の中身を見てみると、同じファイル名がいっぱい。デジカメなどで、SDカードをフォーマットしたら、同じ番号出てきちゃうよね。。そうだよね。。。
改めて、
```find Masters/ -type f -print0 | xargs -0 -J % cp -p --backup=numbered % /Volumes/DETA/googlePhoto/```
--beckupオプションが使えないと怒られる。。
Mac(BSD 系) とGNU Linux の間では実装が異なるコマンドがあるみたい。そこでGNU coreutilsの導入。
以下を参考にさせていただきました
http://qiita.com/eumesy/items/3bb39fc783c8d4863c5f

brew updateでつまずく。。
またまた以下を参考にさせて頂きました（インターネット依存症）
http://qiita.com/takezoux2@github/items/aa2a5f0bef19cd0d8508
無事、以下のコマンドでいけた
```find Masters/ -type f -print0 | xargs -0 -J % gcp -p --backup=numbered  % /Volumes/DETA/googlePhoto/```
## 画像のアップロードしようとしてみる
翌日さあアップロードするぞというとき、googleフォトのアップローダーがありますよとお知らせされる。
https://photos.google.com/apps?hl=ja
それ使ってみる。ディレクトリで指定できる。
二日間、勉強になりました。
Bashで~${user}を展開する

## やりたい事と問題
bashでは、~hogeで、指定したユーザーのホームディレクトリのパスに展開することとが可能だが、ユーザー名の部分を変数にすると動作しない。チルダ展開が行われないみたい。

```bash
$ user=hoge
$ ls -l ~${user}
ls: '~hoge' にアクセスできません: そのようなファイルやディレクトリはありません
```

## 解決策

bashに展開させることで、対応は可能。ただ、見た目も悪く長いので、他に良い方法があるといいなぁ。変数や特殊文字を展開コマンドがあればできそうだけど、わからなかった。

```bash
$ udir=$(bash -c "echo ~${user}")
$ ls -l ${udir}
```

なお、zshでは、変数を含むチルダ展開（~${user}）も使用可能である様子。
ITサービスマネージャー H26午後２－１

#始めに
ＩＴサービスマネージャーの午後２の論文についてあれこれ書いてみようと思います
対象のシステムは[生命保険会社のシステム](http://qiita.com/triple4649/items/56d2b450f2b8b68bdfe5)をベースにしています

#問題文の解析
![ITサービスマネージャー H26午後2-1.png](https://qiita-image-store.s3.amazonaws.com/0/136860/34b92c30-b89b-c3de-fc46-20f37d40c696.png)

#論文の骨子
##設問ア
###１－１携わったサービスの概要
(例)
a Ａ社は生命保険会社を営んでいる。定期リリースの際、イメージ検索機能を強化したバージョンを本番環境に展開することにした
b 私はＡ社の情報分門に所属している
C 私はA社のＩＴサービスマネージャーとしてA社新システムの移行に携わることになった。

###１－２移行計画を策定するにあたって考慮した点
以下の順番で論述する

- 前ふり
- 問題文の引用
- 移行時期、移行の背景
- 特に重要と考えた点

##2考慮するべき点についての対応策、理由、および工夫

###(前ふり)
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/91cc4e09-5679-d36f-f0fa-3dfe39ee4307.png)

###2-1対応策と理由
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/98a66712-84eb-2ca8-36ed-d3d0bdffb29f.png)

##2-2特に工夫した点
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/1537e166-ba89-a45e-54c4-aed6cb4031f0.png)

##3 ITサービスの移行実施後のレビューとその活用
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/72b24219-e1fe-e7d1-1a97-868e1eb0b69d.png)


#変更履歴
2016年9月1日
・論文の骨子を更新
2016年8月20日
・論文の骨子について設問アの骨子を追加
2016年8月19日
・問題文の解析の加増を更新
iPhoneのSafariでQiitaの自分の投稿を表示する方法

なかなか気づかなかったのでメモ。
iPhoneの画面の下の真ん中のシェアボタンをタップして、「デスクトップ用サイトを表示」アイコンをタップする。
これで自分の投稿ボタンが表示される。
Puppet 4.6 リリースノート ピックアップ

Puppet4.6.0(2016/8/10リリース)の、リリースノートで個人的に気になる変更をピックアップしてみました。動作確認とかはしてないので、間違っている部分があればご指摘ください。

# Puppet 4.6.0

## New features

### Identify manual change corrected by Puppet

> This release adds a new report event field called corrective_change that is designed to detect manual change that has been corrected by a Puppet run.
> 
> This feature should help users to detect when an unexpected change occurred outside of Puppet, allowing better auditing and understanding around changes.
> 
> This feature achieves this by storing the last best known value for each property that is applied by Puppet, and comparing that against the values in the next Puppet run.

**Puppet以外（手作業）で変更された部分がわかる、corrective_changeレポートイベントが追加されたようです。**従来だと、Puppetの定義更新分の差分なのか、誰かが手で変えた差分なのか、見分けがつかず苦労したことがあったのですが、そのあたりが改良されているかもしれないです。

※ちょっと試してみました。
[構成管理対象なサーバーが、ツール以外で変更されたのを確認する(Puppet corrective_change)](http://qiita.com/kijibato/items/0203641ddd8df3e274f4)

### Specify multiple masters with server_list option

> This change adds master failover functionality to the puppet agent. Using the new server_list option to specify multiple masters, an agent will now attempt to fall back to a functional master should a failure to download a catalog occur. The server_list setting can be either provided on the command line or configured in puppet.conf, and has the format server_list = master1_hostname:port,master2_hostname:port,master3_hostname:port.
> 
> The old server option can still be used to specify a single master, in which case failover will not be attempted and Puppet will behave as it always has. Specifying a single server with the server_list option has the same effect.

**マスターを複数指定できるserver_listオプションが増えました。**マスターが故障した際に、別のマスターを利用するための設定のようです。シングルマスターの場合、従来のserverオプションも使えますが、server_listでもよいそうです。（複数マスターの場合、cert情報の共有とか必要な気がしますが、リリースノートだけだとちょっとわからないです。）

## Enhancements

> PUP-6378: This adds a field to the report indicating which master was contacted during the run.

マスターを複数指定できるようになったのにあわせてか、puppet実行時にどのマスターを使っているかわかるようになったみたいです。

## Misc bug fixes

> PUP-6125: Running puppet agent --verbose used to generate log output to both console and syslog (or eventlog on Windows). When adding --logdest syslog option, log output was still sent to both the console and syslog (eventlog). Now adding --logdest syslog causes logging to be delivered only to syslog (eventlog) and not to the console.

--verboseオプションを使った場合にコンソールログとsyslogの両方にログが出ていたのが、--logdest syslogで、syslogだけにログを出すよう指定できるように修正されたようです。

# 参考

Puppet 4.6 Release Notes
https://docs.puppet.com/puppet/4.6/reference/release_notes.html
tensorflow.session内の特定のvariableを保存する

TensorflowのVariableをファイルに保存するにはtensorflow.train.Saverを使う．Tutorialにあるような方法だとSession内のすべてのVariableが保存される．特定のVariableのみを保存・復元するにはtensorflow.train.Saverの初期化関数に対象としたいVariableの一覧を辞書型で与えれば良い．

これによって複数のファイルからVariableを個別に読み込むことができるようになる．

```python:save.py
import tensorflow as tf

def get_particular_variables(name):
    return {v.name: v for v in tf.all_variables() if v.name.find(name) >= 0}

def define_variables(var0_value, var1_value, var2_value):
    var0 = tf.Variable([var0_value])
    with tf.variable_scope('foo'):
        var1 = tf.Variable([var1_value])
    with tf.variable_scope('bar'):
        var2 = tf.Variable([var2_value])

    return var0, var1, var2


sess = tf.InteractiveSession()

# defines variables
var0, var1, var2 = define_variables(0.0, 0.0, 0.0)

# saving only variables whose name includes foo
saver = tf.train.Saver(get_particular_variables('foo'))

# initializing all of variables
sess.run(tf.initialize_all_variables())

print var0.eval(), var1.eval(), var2.eval()

# saving into file
saver.save(sess, './bar_val')
```

```python:restore.py
import tensorflow as tf

def get_particular_variables(name):
    return {v.name: v for v in tf.all_variables() if v.name.find(name) >= 0}

def define_variables(var0_value, var1_value, var2_value):
    var0 = tf.Variable([var0_value])
    with tf.variable_scope('foo'):
        var1 = tf.Variable([var1_value])
    with tf.variable_scope('bar'):
        var2 = tf.Variable([var2_value])

    return var0, var1, var2

sess = tf.InteractiveSession()

# defines variables
var0, var1, var2 = define_variables(1.0, 1.0, 1.0)

# restoring only variables whole name includes foo
saver = tf.train.Saver(get_particular_variables('foo'))

# initializing all of variables
sess.run(tf.initialize_all_variables())
print 'before restoring: ', var0.eval(), var1.eval(), var2.eval()

# restoring variable from file
saver.restore(sess, './bar_val')
print 'after restoring only var in foo: ', var0.eval(), var1.eval(), var2.eval()
```

だたしこの方法では長い名前や，名前空間の階層に注意する必要がある．例えば， 

| variable | name-of-variable |
|:-:|:-:|
| var0 | Variable:0  |
|  var1 | foo/Variable:0  |
|  var2 | foo/bar/Variable:0  |
|  var3 | foobar/Variable:0  |

のような場合，上記のget_particular_variables('foo')を実行するとvar1, var2, var3の３つが返される．このように検索条件によっては余計なvariableが保存されていて復元時に思わぬバグを生む可能性がある．
直線位置調整 > スイッチ用IC > NチャネルMOSFET > BST76A > 出力電流が足りずに電圧ドロップ / 2SK4017の買い直し

関連 http://qiita.com/7of9/items/11a82187dddf38265a4c

S-12(1.5V 1A)駆動用NチャネルMOSFETであるBST76Aをブレッドボードで試した。
http://aitendo3.sakura.ne.jp/aitendo_data/product_img/transisitor/BST76A/BST76A_philips.pdf

### 回路

[きむ茶工房ガレージハウス](http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/FET.htm)さんの「N型FETの接続回路」を真似した。

R1, R2の抵抗は1.1kとした。
Vccの値を1.5V(単三電池, LR6)とした。

### 電圧降下

BST76Aのゲートに3.3Vの電圧を与えた時、1.41Vの電圧が立つことを確認した。
しかしながら、その電圧をS-12の電池用端子に接続したところ、電圧が150mV程度にドロップした。

このような電圧低下は過去の経験では出力電流が足りていない時に見られた。

http://aitendo3.sakura.ne.jp/aitendo_data/product_img/transisitor/BST76A/BST76A_philips.pdf
を再度見直したところ、Id (drain current(DC))は300mAしかない。出力電流が足りないMOSFETを買ってしまった。

一緒に購入した2SK2541はどうか。
http://www.e-ele.net/DataSheet/2SK2541.pdf
ID(DC)が±0.1Aとこちらも足りない。


### 次の候補品

1A出力できそうなNチャネルMOSFETを再度見直していくと、PチャネルMOSFET 2SJ681に対応すると思われるNチャネルMOSFET 2SK4017というのを見つけた。ID(DC):5A。
http://akizukidenshi.com/catalog/g/gI-07597/
こちらを買いなおすことになりそう。

2SK4017を使っているモーター駆動例も見つかった。
http://kohacraft.com/archives/1048634380.html

2SK4017でいいのだろうか。What's the catch?
ターミナルの用語　CLI シェル プロンプト

#CLI
コマンドラインインタフェース (Command line interface)。キャラクターユーザインターフェース (CUI) と同義。⇄GUI（グラフィカルユーザインタフェース）
・ざっくり言うと、黒い画面で何かすること。

#シェル
=OSシェル。他のプログラムを起動したり、ディレクトリの中身を見たり色々出来る。
シェルはUNIX(MAC環境）の呼び方で、より一般的にはコマンドインタプリタと呼ぶ。
・ざっくり言うと、黒い画面(CUI)と黒くなくてぱっと見で使いやすい画面 (GUI)を合わせた呼び方。

#プロンプト
=コマンドプロンプト。コマンド入力待ち状態であることを表す記号。
・例  $ とか > とか
技術英語 > Standardizing prefixes for common meanings provides a [terse] but consistent and readable approach to naming data.

@ Code Complete (No. 9467 / 36077)

> Standardizing prefixes for common meanings provides a <font color=red>terse</font> but consistent and readable approach to naming data.

http://eow.alc.co.jp/search?q=terse&ref=sa
> 簡単明瞭な、簡潔な、簡明な、〔文体・表現が〕キビキビした

> send a terse e-mail
素っ気ない［ぶっきらぼうな］メールを送る

<hr>

http://www.mnemonicdictionary.com/word/terse
> terse...sounds like TERESA.

[クレイモア](http://jumpsq.shueisha.co.jp/rensai/claymore/)に出てくる「微笑のTeresa」。
クレアと知り合った当初はクレアとの会話には簡潔な(素っ気無い)回答をしている。攻撃時にはキビキビとした動きをしている。
久々にunityを触るとついつい忘れがちな基本書き方をまとめたい

# 目的
　仕事の合間合間で少しずつunityやってると、
　仕事の都合で１ヶ月とか空いてしまうことがよくあります。

　そうなると、あれ？これどうやんだっけ？と
　なんども同じことをググることが多発。

　そんなら、よく使う事項をちゃんとまとめて置いておこう。
　
　そんな発想。

# 現在の進捗
　作成中
　随時、できた分を更新します。

# 見てくれた方へお願い
　いきなり言い訳がましいことですが。
　片手間でやっているので、本当はそうやるべきではない！
　というようなご法度手段を使っている可能性があります。

　優しく教えてくれると嬉しいです。

---------------------------------------------------

# やろうと思う内容リスト（作成予定リスト）
 - objectの移動、回転、拡大するには？
  -  [objectの移動(PositionとlocalPosition) ](http://qiita.com/_Nanagin/items/1eeb2afd5d5ecdfd7551)
 - objectの生成と消滅するには？
 - objectどうしの当たり判定を取得するには？
 - 画面遷移するには？
 - 重力場の設定
tensorflowのscalar_summaryのログを展開する

Tensorflow.SummaryWriterで書き出されるログファイルはtensorboardで開くことで中身を確認できる．しかし自分のプログラム内で自由に使いたい場合はログファイルを自前で扱えるような形で展開する必要がある．tensorboardではtensorflow.python.summary.event_accumulator.EventAccumulatorという関数を使っているようなので，これを流用すれば比較的簡単に取り出すことが可能．

```python:parse_scalar.py
from tensorflow.python.summary.event_accumulator import EventAccumulator
import numpy as np

def scalar2arrays(scalarEvents):
    """
    converts scalarEvent to set of numpy.array
    """
    wall_times = []
    steps = []
    values = []

    for event in scalarEvents:
        wall_times.append(event.wall_time)
        steps.append(event.step)
        values.append(event.value)

    return np.array(wall_times), np.array(steps), np.array(values)

accumulator = EventAccumulator('filename-of-event-file')
accumulator.Reload() # load event files

wall_times, steps, values = scalar2arrays(accumulator.Scalars('name-of-summary'))
```

lossをmatplotlibでプロットし直すことができるようなった．
pythonの簡易FPS計測

Pythonプログラムのループ処理の速度を知りたい．プロファイラを使うのが確実な方法だが，手抜きをして簡易にFPS(frame per second）を表示したい．

```python:fps.py
import time, sys
import Queue
import numpy as np

class fpsCalculator(object):
    def __init__(self, length=5):
        self.times = Queue.LifoQueue()
        self.length = length
        self.fpsHist = []

    def tick_tack(self):
        if self.times.qsize() < self.length:
            self.times.put(time.time())

        elif self.times.qsize() == self.length:
            begin = self.times.get()
            end = time.time()
            self.times.put(end)
            fps = self.length / (end - begin)
            sys.stdout.write("\r FPS: %2.2f " % fps)
            sys.stdout.flush()

            self.fpsHist.append(fps)

    def getFPS(self):
        return np.average(np.array(self.fpsHist[1:]))

fps = fpsCalculator()

while True:
    try:
        fps.tick_tack()
        time.sleep(0.1)
    except KeyboardInterrupt:
        break

print 'average of fps = ', fps.getFPS()
```

しかしこれはfps=60にはならない．
ImageMagickで数百枚の画像ファイルを一気にPDFにまとめようとするとキャッシュを食いまくる問題への対処

###  背景
ImageMagick、便利なんだけども `$ convert input-*.jpg output.pdf` みたいに "input-" から始まるファイル名のJPEGファイルを一つのPDFファイルにまとめようとすると**100GB以上もの(!!!)超大量のキャッシュ**を生成してしまう。（僕の環境だけ？）
ノートPCでの作業でこれだけのディスクスペースを要求されるのは超つらい。ので、なんとか回避法がないか探してみた。

###  結論
**ImageMagickだけを使うのではなく、他のツールと連携させればキャッシュを生成させずに複数のJPEGファイルをPDFファイルへとまとめられる**

具体的にはPDFtk (<https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/>) というツールと組み合わせる。このツールはPDFファイルに対する編集操作が得意みたいなので、戦略としてはImageMagickでJPEGファイルを1ページずつのPDFファイルへと変換した後、複数のPDFファイルをPDFtkで一つのファイルへとまとめるという流れとなる。

####  ツールのインストール
MacでHomebrewを使っているなら、各ツールは以下の手順でインストールできる

*  ImageMagick
    -  `$ brew install imagemagick`
*  PDFtk
    -  `$ brew tap spl/pdftk`
    -  `$ brew install pdftk`

####  変換処理
例えば、input-0000.jpg、input-0001.jpg、 ... input-0600.jpg　を output.pdf という一つのPDFファイルへとまとめる処理は以下のようなシェルスクリプトを作成することで行える。

```bash
#!/bin/sh

jpgs="input-*.jpg"
for jpgpath in $jpgs; do
  number=$jpgpath
  number=${number#img-}
  number=${number%%.*}
  echo "Generating output-${number}.pdf..."
  convert -verbose $jpgpath output-${number}.pdf
done

echo "Generating output.pdf..."
pdftk output-*.pdf cat output output.pdf

echo "Removing tmp files..."
rm ./output-*.pdf
```

この方法だと一時的に1枚ずつのPDFファイルが一時ファイルとして生じてしまうが、ImageMagick単体での変換作業に比べれば圧倒的に少ないディスクスペースで変換が行えるようになった。

めでたしめでたし。
CPI ACE01でsshに接続出来ない時の確認事項

コントロールパネルで公開鍵が登録してあるか？
自分のPCの .ssh/ の中に id_rsa.pub とかあるはず。
なければつくる。

ユーザー名はウェブコントロールユーザーID（aaではじまるやつ）
SFTPのアカウント名などではない。

ポート番号はウェブコントロールパネルから確認出来る。
tensorflowのvariableに特定の値を入力する

tensorflowのVariableを初期化した後に特定の値を代入するにはassign()を使う．例えばcheckpointからvariableの値を読み込んだ後に，一部のみをnumpy.arrayで書き換えることができるようになる．

```python:assign_test.py
import tensorflow as tf
import numpy as np

x = tf.Variable(tf.zeros([5]))
y = tf.Variable(tf.ones([5]))

sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())

print 'x original = ', x.eval()

input_placeholder = tf.placeholder(tf.float32, shape=[5])

assign_op = x.assign(input_placeholder)
sess.run(assign_op, feed_dict={input_placeholder: np.ones(5).astype(np.float32)})

print 'x <- numpy array ...', x.eval()

assign_op = x.assign(y)
sess.run(assign_op)

print 'x <- another variable ...', x.eval()
```