OmniAICreator/Qiita-1.07M huggingface dataset:
Mac | find の結果がダブルスラッシュ付きで返ってくる


# 例

ななんじゃこりゃー。

```bash
$ find /tmp/       

/tmp/
/tmp//com.apple.launchd.JcwgNYoZcP
/tmp//com.apple.launchd.JcwgNYoZcP/Listeners
/tmp//com.apple.launchd.Silp26jtOD
/tmp//com.apple.launchd.Silp26jtOD/Render
/tmp//progress.log
```

# 回避

ワイルドカードを使うとダブルスラッシュは消えた。

```bash
$ find /tmp/*

/tmp/com.apple.launchd.JcwgNYoZcP
/tmp/com.apple.launchd.JcwgNYoZcP/Listeners
/tmp/com.apple.launchd.Silp26jtOD
/tmp/com.apple.launchd.Silp26jtOD/Render
/tmp/progress.log
```

# まとめ

Linux ではそんなことはない。
Macだけの現象かもしれない。

# 参考

- https://discussions.apple.com/thread/3565773?tstart=0

>And there should be nothing to fix. 
>/a/b/c and /a//b//c are equally legal and both specify c. 


# 環境

- Mac OSX El Capitan 10.11.5








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ReactNativeのサンプルをiOSで動かしてみたメモ

ReactNativeを使ってみようと思いたったので、まずサンプルを動かしてみた時に色々面倒だったのでメモ。
※投稿時は、ReactNative 0.30を使用

##ReactNativeのインストール
まずは環境をインストール
※ググると色々出てきますが、私は本家を参考にインストールしました。
http://facebook.github.io/react-native/docs/getting-started.html
上記では簡単なサンプル「AwesomeProject」が使えます。

##サンプルをダウンロード
ここでは、サンプル集を動かすまでのメモなので
https://github.com/facebook/react-native
こちらをcloneまたはDownloadして使用しました。
※ダウンロード先は任意です。
サンプルは、Examplesフォルダの中にある「UIExplorer」を使用します。

##UExplorerをiOS Simulatorで動かす
UIExplorer.xcodeprojをXcodeでオープン
このままSimulatorを選択して実行
赤い画面でログが表示されたんですが、色からして正常ではないですよねー
![IMG_0042.PNG](https://qiita-image-store.s3.amazonaws.com/0/28608/a168f865-5d0d-f964-d404-05f4fa71fb97.png)

なぜだ (ﾟｰﾟ*?)

ググって調べてみた結果、以下をちょっと変更する必要があるようでした。

```AppDelegate.m
NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"Examples/UIExplorer/js/UIExplorerApp.ios" fallbackResource:nil];
```

まずは、こちらに変更

```AppDelegate.m
NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"http://localhost:8081/Examples/UIExplorer/js/UIExplorerApp.ios" fallbackResource:nil];
```

これだけでもダメでした。
何が足りないのか。。。赤い画面のエラーログを見ながら色々試した結果
以下のことを行ったら私の環境では動きました。

>最初にclone or ダウンロードした中にある「node_modules」フォルダを
>UIExplorer配下にある「js」フォルダにコピー

（違っていたらスミマセン）
これでSimulatorを選択して実行
動きました！ (*ﾟ∀ﾟ)ﾉ
いやーこれだけで時間かかってしまいました。。。

続いて、実機で動かすことに

##UExplorerをiOS実機で動かす

今回は``iPhone6s``で試しました。
``localhost:8081``ここは怪しいと思いつつ
まずは実機に向けて実行してみました。
が、やっぱり動きませんでしたー
予想通りだったけど、なぜだ (ﾟｰﾟ*?)

こちらもググってみたら
ここを変更する必要があったみたい。
※参考にさせてもらいました。
http://qiita.com/osamu1203/items/6b5852603186ba7e6f05

```AppDelegate.m
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
```

``main.jsbundle``を作成し、xcodeprojに含める必要があります。
上記の記事を参考に作成した``main.jsbundle``を任意のフォルダに置き、
xcodeprojに含めてビルド

さぁこれで再実行！

![f2ec62d0-450b-11e6-9b6c-3f9692c265d0.png](https://qiita-image-store.s3.amazonaws.com/0/28608/87ff3b80-2f7a-b51f-75d1-b53aeea57090.png)

また赤画面が、、、今度はなんだろう
ググってみてstackoverflowなど色々あった試したが解決せず、、、

試しに``main.jsbundle``を作成する際のパラメータを一部変更

```
$ curl 'http://localhost:8081/index.ios.bundle?dev=true&minify=true' -o iOS/main.jsbundle
```

これで作成した``main.jsbundle``を含めてリビルド
実機で実行してみたら

**動きました！** (*ﾟ∀ﾟ)ﾉ :tada: 

本当にこれで合っているのか、、、
まぁ動いたんで、一旦動きを見たりする分にはいいのかなぁと。




と思ってたんですが、、、
Debug実行でしか動かない
リストにある項目で動かないことが多い
などの問題が出てくるので、まだまだ道のりは長そうです。。。
Cloud9上でjQueryが動かなかった

新規サイトでD&Dでの並び替えを使いたくて[自記事](http://qiita.com/ao_love/items/4f74bdcd345e9e8ff810)をコピペして楽勝("´∀｀)bｸﾞｯ!とか思ったのに動かない。

なんでーーー?!と思ったけどF12でみたら以下のエラー。

`Mixed Content: The page at 'https://~~' was loaded over HTTPS, but requested an insecure script 'http://code.jquery.com/jquery-1.8.3.min.js'. This request has been blocked; the content must be served over HTTPS.`

要するにhttpsからhttpにリクエスト飛ばすとか危ないからブロックしといたぜ！( ｰ`дｰ´)ｷﾘｯ
みたいなことらしい。

`jQuery`さんが`https`対応してないことなんてないよね♪
ってことで単純に`https`に書き換えたらあっさり解決しましたｗ
RailsでGoogle Analyticsを使いつつ環境変数でトラッキングIDを指定する

## はじめに

* [google-analytics-rails.gem](https://rubygems.org/gems/google-analytics-rails)を使用する
* production環境だけで使用したい
* トラッキングIDは環境変数で指定したい

## やりかた

```ruby:Gemfile
gem 'google-analytics-rails'
```

```config/environments/production.rb
  GA.tracker = ENV['GOOGLE_TRACKING_ID']
```

```app/views/layouts/application.html.erb
<%= analytics_init if GoogleAnalytics.valid_tracker? %>
```

## 環境変数によるトラッキングIDの指定

### Herokuの場合

SettingsのConfig Variablesに指定する。

| Config Key | Config Value |
|-----|-----|
| GOOGLE_TRACKING_ID | UA-UA-xxxxxx-x |

### Rails Serverの場合

```bash
$ GOOGLE_TRACKING_ID=UA-UA-xxxxxx-x bundle exec rails server
```

### Foremanの場合

```bash
$ GOOGLE_TRACKING_ID=UA-UA-xxxxxx-x bundle exec foreman start
```

または `.env` に記述する。

```config:.env
GOOGLE_TRACKING_ID=UA-UA-xxxxxx-x
```

```bash
$ bundle exec foreman start
```
AWS EC2にLet's Encryptを導入してみた

開発用EC2インスタンスはhttpで使用していたのですが、セキュリティ対策を入れたりでステージング環境に近くなってきたので簡易的にSSLを導入しようとLet's Encryptを使用してみました。
思ったより簡単に導入できたので参考になれば幸いです。

# Let's Encryptとは？

簡単に言うと無料でオープンな証明書を発行できるサービスです。手続きも不要で、サーバーとドメインさえ持っていれば即時発行可能です。(Chromeでも緑の鍵マークになるので安心です)
※私もどこかのタイミングで寄付します！

# 導入手順

さっそく導入してみましょう。
環境は AmazonLinux + CentOS6 + Apache2.4 です。(バージョン違いは適宜読み替えてください)
前提として上記は導入済みとします。まだの方はAWSのページなどを参考にインストールまで済ませてください。

### 1. AWSのセキュリティグループを設定する

セキュリティグループのインバウンドのHTTP(80)、HTTPS(443)を許可(0.0.0.0/0)にします。
これをやらないと後ほど証明書を自動取得する際にエラーになります。
→(2017/08/29追記)自分の環境では「urn:acme:error:connection」というエラーになりました


### 2. certbotインストール
対象のインスタンスにSSHでログインし、以下を実行します。(rootじゃなければsudoつける)
権限も変更しておきましょう。

```
# curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
# chmod 700 /usr/bin/certbot-auto
```

### 3. 証明書の発行
cerbotのインストールが成功したら以下のコマンドで自動生成します。

```
# certbot-auto certonly --webroot -w /var/www/html -d test.example.com --email hoge@example.com
```

| オプション            | 説明            |
|:---------------------------|:------------------|
| certonly | 証明書の作成 |
| --webroot | ウェブサーバーモードを指定 |
| -w /var/www/html | ドキュメントルートのパス(自環境に合わせてください) |
| -d test.example.com | 認証対象のドメイン名(ここでは例として左記) |
| --email hoge@example.com          | 連絡用のメールアドレス(ここも例として左記) |
| ~~--debug~~ | ~~Amazon Linuxはまだ実験的だそうでこのオプションつけないと実行できませんのでご注意。~~ 　→2017年現在は不要(むしろエラーになりました)|

###4. 利用規約
青い画面で利用規約の同意を求められるのでAgreeする


###5. 成功確認
以下のメッセージが出れば成功です。

```
IMPORTANT NOTES:
 - Congratulations! ...
```

###6. 生成された証明書の確認
しばらくすると以下のディレクトリに証明書が生成されます。

```
/etc/letsencrypt/live/test.example.com/
	cert.pem
	privkey.pem
	chain.pem
```

###7. mod_sslインストール
Apacheにmod_sslを未インストールならインストールします。

```
# yum install -y mod24_ssl
```
[参考元](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-an-instance.html)


###8. ssl.confに証明書パス設定
/etc/httpd/conf.d/ssl.confに先ほど取得した証明書のパスを設定します。

```
...
SSLCertificateFile /etc/letsencrypt/live/test.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/test.example.com/chain.pem
...
```

###9. Apache再起動
Apacheを再起動すれば反映完了です！ブラウザでhttps://~ で確認してみてください！



###10. その他
上記の後に、http→httpsの強制リダイレクトや、証明書の自動更新設定などやっておいたほうがよい操作がありますが、ここでは導入までとします。


今まで証明書と言えば高いお金を払い、電話などで確認必須なのでとても時間がかかるイメージでしたが
非常に簡単にSSL化出来たのでとてもテンション上がりました！ぜひみなさんもお試しください！
Djangoの管理画面で一度の入力で同じデータを複数登録する方法


## やりたいこと

追加画面に独自フォームを作成して、入力した数だけほぼ同じものを登録できるようにしたい。
追加画面と変更画面でフォームを分けたい

## やり方
今回の例では、連番が同じで枝番が違うものを一度の追加で複数登録できるようにする。

### Model

```py:models.py
from django.db import models

class Job(models.Model):
	serial_number	=	models.IntegerField("連番")
	branch_number	=	models.IntegerField("枝番")
	deadline		=	models.DateField("締切日")
```

### Admin

```py:admin.py
from django.contrib import admin
from django import forms
from .models import Job

#追加時のフォーム
class JobAdminAddForm(forms.ModelForm):
	#独自フォーム
	number_of_jobs	=	forms.IntegerField(lable="作業数")
	
	class Meta:
		model = Job
		fields = ('serial_number', 'deadline')

#変更時のフォーム		
class JobAdminChangeForm(forms.ModelForm):
	class Meta:
		model = Job
		fields = ('serial_number', 'branch_number', 'deadline')
		

class JobAdmin(admin.ModelAdmin):
	list_display = ('id', 'serial_number', 'branch_number', 'deadline')
	
	#フォームの切り替え
	def get_form(self, request, obj=None, **kwargs):
		if obj:#変更時のフォームにJobAdminChangeFormを指定
			self.form = JobAdminChangeForm
		else:#追加時のフォームにJobAdminAddFormを指定
			self.form = JobAdminAddForm
		return super().get_form(request, obj, **kwargs)
	
	def save_model(self, request, obj, form, change):
		#変更時はそのまま保存
		if change:
			obj.save()
		else:
			for i in range(form.cleaned_data['number_of_jobs']):
				obj.pk	=	None
				obj.branch_number = i + 1
				obj.save()
				
admin.site.register(Job, JobAdmin)
```

get_formをオーバーライドして追加時と変更時でフォームを切り替えします。
save_modelをオーバーライドすることで保存時の処理を書き換え可能です。
変更時はそのまま保存するだけで、追加時は独自フォームの値でfor文を回して枝番に値を追加して保存しています。
obj.pkにNoneを代入することでそれぞれ別のデータとして保存できます。

save_modelを工夫すれば色々できそうです。
何かあればご指摘ください。
Jenkins 上流から下流へパラメーター渡して受け取る

■Jenkinsの管理→プラグインの管理→「Parameterized Trigger plugin」をインストール

■上流ジョブを開いて「ビルドのパラメータ化」にチェックをいれて引数を設定する。

![Jenkins下流ジョブのビルドのパラメーター化.png](https://qiita-image-store.s3.amazonaws.com/0/17904/bc41657a-da07-2c1e-cf24-6e17d618bcc4.png)



■上流ジョブのビルド後の処理に追加で「Trigger parameterized build on other projects」を選択
　下流ジョブ名をProject to build に入力して、「Add parameters」から「Current build parameters」を追加


![Jenkinsビルド後の処理.png](https://qiita-image-store.s3.amazonaws.com/0/17904/220c7fad-83ac-05bd-32a2-f04557539a28.png)

　

■下流ジョブ側でも同じように「ビルドのパラメータ化」にチェックをいれて引数を設定する。
　こうしないと引数を受け取れないみたい。

![Jenkins下流ジョブのビルドのパラメーター化.png](https://qiita-image-store.s3.amazonaws.com/0/17904/ec89a69a-b1cb-2607-1b4e-0c0e312d5e9e.png)


　

■ビルドにシェルスクリプトを追加して、
　シェルの実行の中に echo $Output 等を書いてパラメータが渡っている事を確認
Windows 7 update 2016年8月9日 > 更新プログラムを確認しています、から進まない > 進んだ

```txt:動作環境
Windows 7 pro 32bit クリーンインストール後
```

自分が11月から書いてきた記事
http://qiita.com/7of9/items/8f44a76899d6e922f4f0

2016年8月現在、効果がなくなっており、Windonws Updateがスムーズにいかない。

[2016年7月あたりからupdateがかかりにくいという情報もあり](http://freesoft.tvbok.com/cat97/2016/update_not_proceed_2016_07.html)、色々探している中で見つけたのが以下の情報。
http://suu-net.net/archives/440

やってみた。

- Windows 7 pro 32bit インストール
- IE11をインストール
- KB3050265インストール
- KB3168965インストール
- KB3170106インストール
- KB3138612インストール
- KB3172605: 適用できなかった (対象環境でないとのこと)

KB適用時はダウンロードを先にして、ネットワークから切断した状態ですると失敗しにくい。1つのKB適用後、再起動する。

上記適用後「更新プログラムの確認」を実行したが、30分経過しても確認が終わらない。

上記とは別に「更新プログラムを自動的にインストールする(推奨)」を選択し数時間放置した。この時は更新プログラムがダウンロードできたが、150個インストール時に143個目からインストールが進まなくなった。

続けて以下を行った。

- KB3020369インストール
  - KB3172605が適用可能になった
- KB3172605インストール
  - これでWindows Update Clientが更新されるはず

上記にて「更新プログラムを確認」を実行。
開始3分後に、右下に水色のアイコンが表示された。
開始4分後に更新プログラムが取得できた。

この方法がいつまで効果的なのか。。。

取得できたリストについては20個ずつ適用する。一気に適用するとまた失敗するかもしれない。

(追記 2016/09/20) 上記で5分でupdateできるようになった（まだ有効のようだ)。
(追記 2017/02/16) まだ有効
(追記 2018/03/13) 64ビット版の場合、上記のすべてのKBが「適用できません」となった。代わりに「更新プログラムの確認」で1分以内に更新プログラムを取得できた。
(追記 2018/10/02) まだ有効
Android のデータ保存方法


|手段 | 内容 |
|:-----------|:------------|
|Preference|プリファレンスは、Android 端末の内部の記憶媒体に Key-Value 形式(キーと値のペア)でデータ を記憶する。記憶できるデータの形式やデータ量に制限があるので、主にアプリの設定値など少量 のデータ保存に使う|
|ファイル|文章などの長い文字列はテキストファイルとして保存する。それから、カメラで撮影した画像や録 音した音声などのバイナリデータもファイルとして保存する|
|SQLite データベース|SQLite データベースは、データの保存に単一のファイルを利用する軽量なリレーショナルデータ ベース。リレーショナルデータベース用の問い合わせ言語である SQL が利用できる。|
|ビッグデータとして クラウドに保存|mBaaS(mobile Backend as a Service)というスマホやタブレットのバックエンドとしてサー バー機能を担うサービスが普及しつつある。多くの mBaaS では、Key-Value 形式の組み合わせで 大量のデータをクラウドに保存することができる|

![スクリーンショット 2016-08-09 14.50.10.png](https://qiita-image-store.s3.amazonaws.com/0/39073/06614f46-d00d-6906-9383-db947a62d872.png "スクリーンショット 2016-08-09 14.50.10.png")
Enumerable じゃないものを無理やり Enumerable にする

具体的には `Resque::Failure::Base` とかがそうなんですが、`each` メソッドを実装しているけど `Enumerable` じゃないから `map` とか `select` とかが呼べなくて面倒、みたいなやつをなんとかするやつです。

もちろん Ruby なので実行時に `Enumerable` を `include`、とかでもいいけどモンキーパッチだと変な副作用があると面倒、という時のためにより安全なやり方。

`Enumerator` でラップすれば良い。

```rb
fetch_failures = -> { Enumerator.new{|y| Resque::Failure.each{|id, job| y.yield job } } }

fetch_failures.call.select{|j| j['payload']['class'] == 'AwesomeWorker' }.map{|j| j['failed_at'] }
```
[Linux][shell] 時間がかかる処理の進捗(プログレスバー)を表示する

# TL;DR

時間がかかる処理の進捗を表示する方法のまとめ。
だいたい `pv` コマンド使えばよいです。

# 実行例
## tar
### tarの展開
```console:tar.gz
$ pv test.tar.gz | tar zxf -
```
```console:tar.bz2
$ pv test.tar.bz2 | tar jxf -
```

### tarの圧縮
```console
$ tar cf - ./test | pv | gzip -1 > test.tgz
```

## dd
※ddのoutput先(下では/dev/sdXXX)はあくまでも例なのでコピペしないこと！

```console
$ pv bigfile | sudo dd bs=4M of=/dev/sdXXX
```
```console:実行例
$ pv XXX.image | sudo dd bs=4M of=/dev/sdXXX
 1.2GiB 0:04:33 [3.81MiB/s] [=======================>                                   ] 16% ETA 0:22:59
```


## md5sum

```
$ pv bigfile | md5sum
```

## MySQL
MySQLのリカバリの表示にもいけるらしい

[mysqldumpリカバリの進捗を表示する - Qiita](http://qiita.com/shouta-dev/items/af9bebecaeabff5fb62f)

# 参考
[command line - How to check the progress of md5sum on many huge files? - Ask Ubuntu](http://askubuntu.com/questions/463321/how-to-check-the-progress-of-md5sum-on-many-huge-files)
[Linux - pv コマンドで処理進捗状況表示！ - mk-mode BLOG](http://www.mk-mode.com/octopress/2015/07/09/linux-display-progress-of-process-by-pv/)
[Linuxでファイルコピー時に進捗状況を確認する6つの方法 | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2015/07/linux%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B3%E3%83%94%E3%83%BC%E6%99%82%E3%81%AB%E9%80%B2%E6%8D%97%E7%8A%B6%E6%B3%81%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B6%E3%81%A4%E3%81%AE/)
[さらに仕事がダラけてしまったのでpvコマンドでプログレスバー - harry’s memorandum](http://dharry.hatenablog.com/entry/20110210/1297268423)
vue-router を利用している component をテストしたい

# 普通の component のとき

vue-router を使っていない component のテストは、[vue-templates/webpack]() が参考になります。

```js
import Vue from 'vue'
import Hello from 'src/components/Hello'

describe('Hello.vue', () => {
  it('should render correct contents', () => {
    const vm = new Vue({
      template: '<div><hello></hello></div>',
      components: { Hello }
    }).$mount()
    expect(vm.$el.querySelector('.hello h1').textContent).to.contain('Hello World!')
  })
})
```

# vue-rotuer を使っているとき

上の例では vue-router を利用していないため、component の中で `v-link` 等を使っていると、うまく動作しません。

そこで、上の例を参考に、vue-router を利用できるようにしてみました。

```js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Hello from 'src/components/Hello'

Vue.use(VueRouter)

describe('Hello.vue', () => {
  it('should render correct contents', () => {
    const App = Vue.extend({
      template: '<div><router-view></router-view></div>',
    })
    const router = VueRouter({ abstract: true })
    router.map({ '/': { component: Hello } })
    router.start(App, document.createElement('div'))
    counst vm = router.app
    
    expect(vm.$el.querySelector('.hello h1').textContent).to.contain('Hello World!')
  })
})
```
【曲芸】社内向けツールをGemで、Gem Serverなし・バージョンつきで配布する方法

実用性はともかく曲芸として個人的に面白かったので共有しておきます。

社内向けのツール、その名も`tools`を下記のような要件で配布したくなりました。

- CLI
- gemとして配布
- gem server無し
- バージョンを表示できる

まず、

> - gemとして配布
> - gem server無し

これは https://github.com/rdp/specific_install を使うとできる。

```
$ gem install specific_install
$ gem install git@github.com:your-company/tools.git
```

次に

> - バージョンを表示できる

これを実現するにはいくつか課題がある。

- `Tools::VERSION`を更新する
  - どうせ頻繁に更新されるんだし、いちいちインクリメントするのが面倒くさい。絶対忘れる。
- Gitのcommit hashを出力する
  - 当然コミット毎に一意に定まるので頻繁に更新されるツールのバージョニングとしては悪くない。
  - `$ tools --sha` で `$ git log --pretty="%h" -1`の結果を出せばいいのでは？
  - gemは`tools.pkg`にファイルをまとめた形で配布される。これはGitリポジトリではないので、`git`コマンドは使えない。
 
ということで、試行錯誤の末、`gemspec`の中で`Tools::VERSION`にcommit hashを文字列リテラルとして更新するコードを生成するという方法で実現しました。`gemspec`はRubyのDSLとして実行されるので、その途中でファイルを書くことは可能なのです。
さらに、`specific_install`は一時ディレクトリで`git clone` して`rake install`しているので、`git`コマンドが使える。

下記、具体的な手順です。

元となるファイルはこんな感じでコミットしておく。

`lib/tools/sha.rb`

```ruby
module Tools
  SHA = "undefined"
end
```

`tools.gemspec`

```rb
Gem::Specification.new do |spec|

  # Update sha.rb
  sha = `git log --pretty="%h" -1`.chomp

  sha_rb = <<SHA
module Tools
  SHA = "#{sha}"
end
SHA
  File.open(File.expand_path('./lib/tools/sha.rb'), 'w') { |f| f << sha_rb }

# 以下略
```

これで`$ gem build tools.gemspec`すると

```ruby
module Tools
  SHA = "cd570fa"
end
```

というふうに最新のcommit hashを代入するコードが生成され、それがGemとしてパッケージングされる。

バージョンを表示するには、この`Tools::SHA` を適宜出力すればよい。

以上です。もうちょっとまともな方法がある気がするので、妙案があれば是非教えてください。
Java Generics FAQs - Under The Hood Of The Compiler 

Java Generics FAQs - Under The Hood Of The Compiler
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html

> This is a collection of answers to frequently asked questions (FAQs) about Java Generics, a new language feature added to the Java programming language in version 5.0 of the Java Standard Edition (J2SE 5.0).
LocalDateTimeのフォーマットがうまくいかない件とその対処法

昔上司が作った、csvから時刻を抜き出してごにょごにょする、みたいな簡易プログラムがあるのだが、
それをSimpleDateFormat→LocalDateTimeに改修することになった。

とはいっても、使い方はほとんど同じで、

- DateTimeFormatterで日付形式を定義する
- Stringで時刻を取り出してLocalDateTimeに変換する
- ごにょごにょする

何ら変わらん。と思って、意気揚々とコードを組むわたし。

```java

DateTimeFormatter csvFormat = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String filename = "hoge.csv";

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filename), "SJIS"));

    try {
　　　　
　　　　 //CSVを読み込む
        while ((line = br.readLine()) != null) {
            
            //切り出す
            String[] csvarr = line.split(",");
            String time1 = csvarr[0];
            String time2 = csvarr[1];

            try {

                //LocalDateTimeに変換する
                LocalDateTime ldt1 = LocalDateTime.parse(time1, csvFormat);
                LocalDateTime ldt2 = LocalDateTime.parse(time2, csvFormat);

                //ごにょごにょする(略)

            } catch(DateTimeParseException ex) {
                ex.printStackTrace();
            }

    } catch(IOException ex) {
        ex.printStackTrace();
    }

} catch (UnsupportedEncodingException | FileNotFoundException ex) {
    ex.printStackTrace();
}

```

try~catchばっかりで見苦しいわ、という感じで申し訳ないのですが、
要はCSVから取ってきてLocalDateTimeに変換しているだけです。

ところが。

```java

java.time.format.DateTimeParseException: Text '2016/08/02 4:30:23' could not be parsed at index 11
	at java.time.format.DateTimeFormatter.parseResolved0
	at java.time.format.DateTimeFormatter.parse
	at java.time.LocalDateTime.parse

```

フォーマッタに突っ込むところでコケた。
いやいや、SimpleDateTimeはこれでうまくいってたのに、どういうことと思って調べてみたら、
どうやらLocalDateTime（というかDateTimeFormatter）はフォーマットの形式判定が厳格になっているらしく、今回のようにHHと定義すると、時間が2桁でないとダメということのようです。だからcould not be persed at index 11なのね・・・

```java
DateTimeFormatter csvFormat = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

String time1 = "2016/08/02 4:30:23" //×
String time2 = "2016/08/02 04:30:23" //○

```

一桁は0埋めしないとダメみたいです。
しかし、じゃあ``H:mm:ss``としてあげればいいのかというと、そうすると12時とか午後の時間とかは問答無用でアウトになってしまう。
1桁2桁どちらでも対応できるようには、以下のようにしてあげればいい。基本1桁だけど、2桁来るときもあるよ、みたいな感じですかね。

```Java
DateTimeFormatter csvFormat = DateTimeFormatter.ofPattern("yyyy/MM/dd []H:mm:ss");

String time1 = "2016/08/02 4:30:23" //○
String time2 = "2016/08/02 04:30:23" //○
```

勿論、時だけではなく、分や秒でも使えます。
Drupalのpath.incでよく使うやつ

#地味に便利:open_mouth: 

```php
$GLOBALS['base_url'] => http://example.com/drupal
base_path() => /drupal/
request_uri() => /drupal/documentation?page=1
request_path() => documentation
current_path() => node/26419
```

#参考
・[function current_path](https://api.drupal.org/api/drupal/includes%21path.inc/function/current_path/7.x)
・[Drupal API path.inc](https://api.drupal.org/api/drupal/includes%21path.inc/7.x)
Jenkins　Gitのタイムアウト時間を増やす

Git Cloneは正常に走るけど、
JenkinsのGit Pluginでは
クローンのタイムアウトが
デフォルトで１０分になってる。
・・・・めっちゃ困った。

下記URLを見つけました。
http://stackoverflow.com/questions/22013217/on-building-jenkins-project-timeout-after-10-minute-error-happens

■Git Plugin が入っていることが必須

１．ソースコード管理の**Additional Behaviours**から**Advanced clone behaviours**を選択
２．下図のような表示がされるのでTimeoutに必要な数字を入れる。
![Jenkinsタイムアウト変更.png](https://qiita-image-store.s3.amazonaws.com/0/17904/00064fb3-e39a-cc77-b525-d839f2f28fe1.png)
2つのファイルが一致するかどうかだけを表示する

## `fc`を使う

`fc`コマンドを使うと、2つのファイルの差異を表示することができます。
これを利用して、2つのファイルが一致するかどうかを確認し、その結果**だけ**を表示するコマンドです。

```bat:一致するかどうかだけ表示
REM カレントディレクトリに下記3ファイルが存在する、という前提です。
REM    * fileA.bin
REM    * fileA2.bin （fileA.binと一致）
REM    * fileB.bin  （fileA.binとは異なる）

REM 【異なるファイルの比較】
fc fileA.bin fileB.bin  >NUL && echo 一致(%ERRORLEVEL%) || echo 異なるorエラー(%ERRORLEVEL%)
REM 結果：
REM 異なるorエラー(0)

REM 【一致するファイルの比較】
fc fileA.bin fileA2.bin >NUL && echo 一致(%ERRORLEVEL%) || echo 異なるorエラー(%ERRORLEVEL%)
REM 結果：
REM 一致(1)

REM 【指定されたファイル（1つ目）が存在しない】
fc fileC.bin fileB.bin  >NUL && echo 一致(%ERRORLEVEL%) || echo 異なるorエラー(%ERRORLEVEL%)
REM 結果：
REM FC: FILEC.BIN を開けません。このファイルまたはフォルダーは存在しません
REM 
REM 異なるorエラー(0)

REM 【指定されたファイル（2つ目）が存在しない】
fc fileA.bin fileC.bin  >NUL && echo 一致(%ERRORLEVEL%) || echo 異なるorエラー(%ERRORLEVEL%)
REM 結果：
REM FC: FILEC.BIN を開けません。このファイルまたはフォルダーは存在しません
REM 
REM 異なるorエラー(2)

REM 【指定されたファイル（両方）が存在しない】
fc fileC.bin fileD.bin  >NUL && echo 一致(%ERRORLEVEL%) || echo 異なるorエラー(%ERRORLEVEL%)
REM 結果：
REM FC: FILEC.BIN を開けません。このファイルまたはフォルダーは存在しません
REM 
REM 異なるorエラー(2)
```

## 疑問

なんで【指定されたファイル（1つ目）が存在しない】のときは`%ERRORLEVEL%`が`0`なんだろう？ 2つ目と両方は`2`なのに。
AWS上でバッチ実行するときのパターンについて考えてみた


## マネージド

### DataPipeline

- 人間には難しい
- [dataduct](https://github.com/coursera/dataduct) を使うといいのかも

##lambda

- 300秒の壁を乗り越えられればお安い＆イベントドリブンで楽
- スケジューラがUTCなのがたまに使いづらい

## EC2を使うパターン

### cron

お手軽だけどバッチのためにインスタンス起こしておくのはお高い

### Rundeck/Jenkins

- お高い。
- バッチ実行前にサービスのセットアップしなくちゃいけない。
- バッチ数が多いならセットアップのコストに見合う

### lambdaでec2起動 + EC2 userdataでコマンド実行

- [EC2 userdata](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html)
- お安くて300秒の壁もないが、ロギング、リカバリ、セットアップがつらそう
 
### lambdaでecs起動

- クラスタの起動が時間かかる(?) 
- イメージ作ればどこでもすぐ実行できるのは良い. 
- ロギングとリカバリに一工夫いるのはec2と同じ

### lambdaでeb docker起動

- クラスタのプロビジョニングが不要なのでこちらの方が向いているかも。
- worker tierで使えるのかがわからない。。。


### 考察

- Docker使って実行環境をこしらえるのがよい気がする
- 次の問題は考えたい
  - バッチのログをどうやって集約するの問題(オブジェクトストレージ or SaaS)
  - べき等に実装できないバッチのリカバリを簡単にやりたいよ問題
Symbolic link not allowed or link target not accessible


error:

- Create directory (image files) based on Symbolic link
- Access the above image files, the server responded 403 Forbidden 
- error log: Symbolic link not allowed or link target not accessible

Check

- Check Options +FollowSymLinks in http.conf
- Check the owner of directory (image files)
- Check whether Apache has no permission of directory (image files)

Resolutions

- $ chown -R apache. ./image
- $  find ./image -type d -exec chmod 750 {} \;
Storyboardで遷移先画面で処理を終えて元の画面に戻る際に値を受け取る

# 概要
今までprotocolとdelegateを使っていましたが、closureで書けることが抜けていたので自分メモ（標記はSwift 3です）。

## 遷移元のコントローラ
```swift:ListViewController.swift
class ListViewController: UIViewController {
  
  // Storyboardで遷移時に呼ばれる
  override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
    // 遷移先のコントローラを取得
    let controller = segue.destinationViewController as! EditViewController 
    
    // 遷移先で処理を終えた後の処理をここで書く
    controller.resultHandler = { data_ in
      print(data_) // テスト
    }
  }

}
```

## 遷移先のコントローラ
```swift:EditViewController.swift
class EditViewController: UIViewController {
  var resultHandler: ((String) -> Void)?
  
  // 何らかの処理をするメソッド
  func hogeMethod() {
    let data = "テスト"
    
    // handlerに関数がセットされているか確認
    if let handler = self.resultHandler {
      handler(data)
    }
    
    // ListViewControllerに戻る
    self.dismiss(animated: true)
  }
}
```
try..catch via shell


# set -e & trap

```bash:
#!/bin/bash
set -e
trap "echo err" ERR

fuga()
{
  echo "fuga"
  return 1
}

hoge()
{
  fuga
  echo "hoge"
  return 1
}

hoge
echo "after hoge"

### output ###
fuga
```

# set -eE & trap

```bash:
#!/bin/bash
set -eE
trap "echo err" ERR

fuga()
{
  echo "fuga"
  return 1
}

hoge()
{
  fuga
  echo "hoge"
  return 1
}

hoge
echo "after hoge"

### output ###
fuga
err
```

# trap ... `un`trap ... trap

```bash:
#!/bin/bash
set -e
trap "echo err" ERR

echo "ok-state"

set +e
trap ERR
find /not_found_file
echo "returned non 0 , but continued"
trap "echo err" ERR
set -e

find /not_found_file

echo "guess un-reachable!"

### output ###
ok-state
find: /not_found_file: No such file or directory
returned non 0 , but continued
find: /not_found_file: No such file or directory
err
```
host名でアクセスを設定する

ssh でほかのPCにログインするとき、

```bash
ssh user@192.168.1.245
```

と毎回するのは不便なので、ローカルマシン上のみでこの問題を解決する。

ssh の他、NFSやsambaなど色々とIPアドレスを指定する場面で活用可能

## 1. windows の場合

まず、メモ帳を管理者権限で開く
そして、メモ帳の開くから

```
C:¥Windows¥System32¥drivers¥etc¥hosts
```

を開き、以下のように追記

```
# 自分の環境に合わせて変更
# [リモートのIPアドレス]　[指定したい名前]
192.168.1.245 remote1
```

## 2. Linux の場合

windows と同じように hostsファイルを編集します
Linux の場合は

```
/etc/hosts
```

にあるので、管理者権限でエディタを開いて以下のように追記

```
# 自分の環境に合わせて変更
# [リモートのIPアドレス]　[指定したい名前]
192.168.1.245 remote1
```


## 3. 動作確認

この状態で以下のように、ssh します

```bash
ssh user@remote1
```

恐らく1度接続したことがあっても、再度メッセージ出るけどOK
これで、ssh が接続できれば完了です。
dockerのcacheをクリーンする方法

```
# .bash_profile or .bashrc
alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)'
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)'
```
```
# terminal
docker kill $(docker ps -q)
docker_clean_ps
docker rmi $(docker images -a -q)
```
node.jsでAES256のCBCブロックモード暗号化を行う

		var cryptor = require('crypto');
		var crypto_key = 'password';
		var m = cryptor.createHash('sha256');
		m.update(crypto_key);
		crypto_key = m.digest('binary');
		var crypto_iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f';
		var ciper_mode = 'aes-256-cbc';

		var text = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';

		// 暗号化
		var cipher = cryptor.createCipheriv(ciper_mode, crypto_key, crypto_iv);
		var enc_text = cipher.update(text, 'utf-8', 'base64');
		enc_text += cipher.final('base64');

		// 復号化
		var decipher = cryptor.createDecipheriv(ciper_mode, crypto_key, crypto_iv);
		var dec = decipher.update(enc_text, 'base64', 'utf8');
		dec += decipher.final('utf8');

		console.log(text);


ポイントは、鍵長が256でなければならないのでキーをSHA256ハッシュ化していることと、ivという初期化ベクターを与える必要があるということ。

情報間違っていたので一部修正しました。
cipher.update()にインプットのエンコードとアウトプットのエンコードを渡せるので、インプットとして文字列(UTF-8)を指定し、アウトプットはBASE64にしました。
decipher.update()はその逆です。

インプットやアウトプットをバイナリにしたい場合は「'binary'」を指定します。
SparkleFormationとkumogata比較

CloudFormationのテンプレートをrubyで記述できるツールとして[kumogata(kumogata2)](https://github.com/winebarrel/kumogata2)と[SparkleFormation](https://github.com/sparkleformation/sparkle_formation)を触ってみた。
自分なりに比較してみて結果をメモしておく。

とりあえずは過去の資産がないのでSparkleFormation使ってみるかなあ。

# テンプレート記述の機能比較

基本的にテンプレート記述に関する機能に関してはそこまで差はない感じ。
ただし、SparkleFormationはjsonからの変換ができないのでそのままでは過去の資産が利用できない印象。

|機能| SparkleFormation | kumogata2 |
|:--|:-----------------|:----------|
|ruby => json変換 | ○ | ○ |
|json => ruby変換 | × | ○ |
|テンプレート分割   | ○ | ○ |

# テンプレートの記述

一般的なテンプレートの記述としてはそこまで違いがない。
(SparkleFormationの方が多少rubyチックに書ける)

* kumogata2

```rb
template do
  AWSTemplateFormatVersion "2010-09-09"
  
  Resources do
    Vpc do
      Type "AWS::EC2::VPC"
      CidrBlock "10.0.0.0/16"
      Tags [ {"Key" => "Name", "Value" => "test"} ]
    end
  end
end
```

* SparkleFormation

```rb
SparkleFormation.new(:test, provider: :aws) do
  AWSTemplateFormatVersion '2010-09-09'

  resources do
    vpc do
      properties do
        cidr_block "10.0.0.0/16"
        tags!("Name" => "test")
      end
    end  
  end  
end
```

複雑なテンプレートを書こうとすると関数が用意されているSparkleFormationの方が書きやすい。

* kumogata2（ちょっと書き方を間違えるとエラーとなって辛い)

```rb
  Conditions do
    ["Parameter1", "Parameter2"].each do |param|
      _("#{param}Exist") do
        Fn__Not do |*|
          Fn__Equals [ _{ Ref param }, "" ]
       end
     end
  end
```

* SparkleFormation

```rb
  conditions do
    ["Parameter1", "Parameter2"].each do |param|
      set!("#{param}Exist", not!(equals!(ref!(param), "")))
    end
  end
```

# テンプレート実行ツール

どちらもrubyのテンプレートをそのままCloudFormationのスタックとして実行できるツールを持っている。
rubyからJSONへの変換はどちらも行えるので自分で実行ツールを実装することも可能。

kumogataはcloudformationの基本的な機能をラップしただけのような印象。

SparkleFormationはPolicyをテンプレート内に記述したりコンパイルパラメータが指定できたりと+αの機能を有している。
ただし、実装不足やバグ？で十分に動作しない機能やドキュメント不足でコードを読まなければいけない場合がある。

* sfn createコマンドに--compile-parametersオプションがあるが効かない。コードを読んでも使われてる感じがしない？
* [Sparkleformationでstack policyを設定する - Qiita](http://qiita.com/mechamogera/items/70959222696947fdd375)参照

# ドキュメント充実度

* kumogataは日本人の利用ユーザが多く日本語ドキュメントが充実している。
* SparkleFormationは公式ドキュメントが充実している。
 * 日本語のドキュメントは[CloudFormationのtemplateをRubyで作成 – 「SparkleFormation」を触ってみた。 ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/introduce-of-sparkleformation/)くらいしか見当たらなかった。
GalaxyProject の Galaxy の開発環境を整える（予定）

# 概要

GalaxyProject の Galaxy の開発環境を整えたい
* [galaxyproject/galaxy: Data intensive science for everyone.](https://github.com/galaxyproject/galaxy)

# 調べたこと

## tox

tox を使っているようだ

* [galaxy/CONTRIBUTING.md at dev · galaxyproject/galaxy](https://github.com/galaxyproject/galaxy/blob/dev/CONTRIBUTING.md)


## docker

docker base でもあるみたい。

* [galaxy/README.md at dev · galaxyproject/galaxy](https://github.com/galaxyproject/galaxy/blob/dev/test/docker/README.md)

## Travis

* [galaxy/.travis.yml at dev · galaxyproject/galaxy](https://github.com/galaxyproject/galaxy/blob/dev/.travis.yml)
git のあるコミットが、特定のブランチに属するか調べる方法 (のメモ)

# Git コマンド

```bash
$ git branch --contains <commit_id>
```
を使う。そのコミットが属するブランチを表示してくれます。

たとえば Bash で git コマンドを使って if 分岐をするのであれば

```bash
  if [ "$(git branch --contains $commit_id | sed -e 's|[\* ]*||' | grep -E ^$branch_name$)" = "" ]; then
    echo "$branch_name 上のコミットじゃないです"
  fi
```
こんな感じで判定できます。

上記では、 sed で整形してから、完全一致するものがあるかを grep で調べています。


#️ Github API
方法わかったら書こうと思います (できるんですかね...?
PHPでCloudFrontのオリジンアクセスアイデンティティIDを確認する

- 前提条件
    - AWS SDK for PHPがインストールされていること


```
<?php
require './vendor/autoload.php';

$client = new Aws\CloudFront\CloudFrontClient([
        'version' => 'latest',
        'region' => 'ap-northeast-1'
]);
$result = $client->listCloudFrontOriginAccessIdentities();
var_dump($result);
```
Dockerコンテナ上でVSCodeを動かしてMacで表示する

## 参考
- [Docker for Mac and GUI applications](https://fredrikaverpil.github.io/2016/07/31/docker-for-mac-and-gui-applications/)
- [jess/visualstudio](https://hub.docker.com/r/jess/visualstudio/builds/bnb2d45q2uz2mtgzeokt8od/)
- [Visual Studio Code in Docker](https://grigio.org/visual_studio_code_docker/)

## 環境
- OS X EI Capitan 10.11.6
- Docker for Mac 1.12.0-beta21
- XQuartz 2.7.10 beta 2

## 1. 環境構築
### 1.1 XQuartzのインストール
普通は以下のようにインストールする。

```
$ brew cask install xquartz
```

しかし、これでインストールされるXQuartz2.7.9にはバグがあって上手くいかない。
そのため、[XQuartz](https://www.google.co.jp/advanced_search)から2.7.10 beta 2をインストールする。   
次に、以下のコマンドでXQuartzを起動する。

```
$ open -a XQuartz
```

起動後、XQuartzの設定画面(X11 Preference)から、
Securityタブを選択し、  
- Authenticate connections
- Allow connections from network clients

にチェックを入れる。
ここまでで設定を反映させるため、ログアウトして、入り直す。

### 1.2 Docker for Macのインストール
[Docker for Mac](https://docs.docker.com/docker-for-mac/)からインストールする。
## 2. Dockerイメージの作成
### 2.1 準備
linux 64bitのVSCodeの公式Zip Archiveを[ダウンロード](https://code.visualstudio.com/download)する。
公式のものには、libnotify.so.4が入っていないため、[他のアーカイブ](https://jesss.s3.amazonaws.com/binaries/VSCode-linux-x64.zip)をダウンロードする。
他のアーカイブを解凍すると、libnotify.so.4がある。
公式アーカイブとlibnotify.so.4をDockerfileと同じディレクトリにおくようにする。
### 2.2 Dockerfile
今回はubuntuで動かします。やっていることは、

- VSCodeを起動するための色々のインストール
- zipのインストール
- ユーザーの追加(VSCodeはrootでは動かない)
- コンテナにVSCode公式アーカイブとlibnotify.so.4を入れる
- 公式アーカイブの解凍とlibnotify.so.4の移動
- コンテナを動かし続けるための呪文

```
# Dockerfile
From ubuntu:14.04

RUN apt-get update && apt-get install -y libgtk2.0-0 libgconf2-4 \
    libnss3 libasound2 libxtst6 libcanberra-gtk-module libgl1-mesa-glx \
    zip

RUN useradd -ms /bin/bash me

ADD ./VSCode-linux-x64-stable.zip /home/me
ADD ./libnotify.so.4 /home/me

WORKDIR /home/me
RUN unzip VSCode-linux-x64-stable.zip
RUN mv libnotify.so.4 VSCode-linux-x64


CMD ["/bin/bash"]
```

### 2.3 イメージの作成
Dockerfileと公式アーカイブ、libnotify.so.4があるディレクトリで以下を実行。

```
$ docker build -t (イメージ名) .
#例 docker build -t vsc .
```

以下のコマンドでイメージができているか確認可能

```
$ docker images
```

## 3. 実行
xquartzを起動する。

```
$ open -a XQuartz
```

MacのターミナルでIPアドレスを調べて、以下のコマンドを打つ。

```
$ xhost + ip
#例 xhost + 10.8.0.111
```

先ほどのイメージを使ってコンテナを立ち上げる

```
$ docker run -ti -e DISPLAY=ip:0 (イメージ名)
#例 docker run -ti -e DISPLAY=10.8.0.111:0 vsc
```

コンテナの中で、ユーザーをmeに切り替え、VSCodeを実行する。

```
$ su me
$ cd ~/VSCode-linux-x64/bin
$ ./code
```

## その他
以下のコマンドはログアウトor再起動したらやり直す必要がある?

```
$ xhost + ip
```
.ssh/configファイルでSSH接続を管理する

複数のサーバーを管理していると、毎回めんどくさい作業がSSH接続。
下記のように毎回、sshコマンドを入力しなければならない。

```
# ポート名を指定するケース
ssh ユーザー名@ホスト名 -p ポート番号

# 公開鍵認証のケース
ssh ユーザー名@ホスト名 -i ~/.ssh/鍵のパス

# ポート名、公開鍵認証のケース
ssh ユーザー名@ホスト名 -i ~/.ssh/鍵のパス -p ポート番号
```
| オプション | 内容 |
|:-:|:-:|
| -i | 秘密鍵を指定 |
| -p |  ポート番号を指定 |
| -l |  ログインユーザー名を指定 |

## .ssh/configとは
SSHクライアントの設定ファイル。(リモートサーバーに接続する際に必要な設定ファイル)
SSH接続時の情報を定義しておくことで、sshコマンドのオプションを省略でき、コマンドオプションでは指定できない情報も設定できる。

## .ssh/configの作成
ファイルがない場合は作成する。
.sshディレクトリのパーミッションを変更。

```shell:terminal
$ mkdir ~/.ssh
$ chmod 700 .ssh
$ touch ~/.ssh/config
```

## .ssh/configに記載

```config:.ssh/config

# gehoAサーバー
Host gehoA
    HostName gehogeho.com
    User gehogeho
    IdentityFile ~/.ssh/test/gehogeho_a.key
    Port 20022
    TCPKeepAlive yes
    IdentitiesOnly yes

# gehoBサーバー
Host gehoB
    HostName gehogeho.com
    User gehogeho
    IdentityFile ~/.ssh/test/gehogeho_b.key
    Port 22
    TCPKeepAlive yes
    IdentitiesOnly yes

# gehoCサーバー
Host gehoC
    HostName gehogeho.com
    User gehogeho
    IdentityFile ~/.ssh/test/gehogeho_c.key
    Port 10022
    TCPKeepAlive yes
    IdentitiesOnly yes
```
| キーワード | 内容 |
|:--|:--|
| Host | ホスト名 |
| HostName | ホストのアドレスかIPアドレス |
| User | ログインユーザ名 |
| IdentityFile | ログインするための秘密鍵のパス |
| Port | ポート番号(デフォルトは22) |
| TCPKeepAlive | 接続状態を継続したい場合：yes　継続しない場合：no |
| IdentitiesOnly | IdentityFileが必要な場合：yes　必要ない場合：no |
| ServerAliveInterval | 一定期間サーバからデータが送られてこないときに、タイムアウトする秒数。(例) 120 |

## サーバーに接続する

AサーバーにSSH接続する場合

```shell:terminal
$ ssh gehoA
```

BサーバーにSSH接続する場合

```shell:terminal
$ ssh gehoB
```

CサーバーにSSH接続する場合

```shell:terminal
$ ssh gehoC
```
認証Proxy配下のMacにNode.js環境を構築

# 認証Proxy配下のMacにNode.js環境を構築

OS:10.11.6にインストール

## Nodeバージョン管理ソフトをインストールする

bash環境で利用するので、bash環境に認証Proxy情報を設定する

.bashrcに認証proxy情報を追加```
export http_proxy="http://認証IDjp:認証パスワード@proxy_url:proxyポート"
export https_proxy="http://認証IDjp:認証パスワード@proxy_url:proxyポート"
(メールアドレスがIDの場合は、メールアドレス内部の@を%40に置換すること)
```

インストールを実行```
$ curl -L git.io/nodebrew | perl - setup
```

nodebrewのパスを追加しておく(.bashrcを編集)```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

## Node.jsをインストール
インストールが可能なバージョン一覧を取得する

```
$ nodebrew ls-remote

v5.0.0    v5.1.0    v5.1.1    v5.2.0    v5.3.0    v5.4.0    v5.4.1    v5.5.0
v5.6.0    v5.7.0    v5.7.1    v5.8.0    v5.9.0    v5.9.1    v5.10.0   v5.10.1
v5.11.0   v5.11.1   v5.12.0

v6.0.0    v6.1.0    v6.2.0    v6.2.1    v6.2.2    v6.3.0    v6.3.1
```

指定バージョンをインストールする```
$ nodebrew install-binary v6.3.1
```

インストールが終わっているnode.jsを確認する```
$ nodebrew ls
```

バージョンを指定してnode.jsの利用を開始する```
$ nodebrew use v6.3.1
```

これで nodeコマンドが利用可能になる```
$ node -v
v6.3.1
```
直線位置調整 > リレーの選定 > 1.5V 1A > HY1-1.5V

関連 http://qiita.com/7of9/items/0256996d9cf94fd2abc8

S-12のDCモーター 1.5V 1A程度のON/OFFをするためのリレーの選定。

HY1-1.5V (AHY100)
http://eleshop.jp/shop/g/gD32123/

- コイル定格電圧: DC 1.5V
- 定格制御容量: 1A 30V DC(抵抗負荷)
- 接点最大通過電流: 2A
- 接点最大開閉電流(抵抗負荷): 1A (30V DC)
- 324円

秋月で扱っているリレーは3V以上のものばかり。
http://akizukidenshi.com/catalog/c/crelay

<hr>
(追記 2016/08/10)
データシートの見方を間違っているかもしれない。

- コイル定格電圧
- 接点電圧

1.5Vリレーというのはコイル定格電圧が1.5Vのもの。リレーをON/OFFするための印加電圧のようだ。

探しているのは接点電圧が1.5Vで、ESP8266のGPIOを使うからコイル定格電圧は3V、ということになるだろうか。
replace 中の embulk の動きを途中で止めると、tmp テーブルが残る

久々の投稿です :)
最近、embulk でいくつかハマったので、メモ的なものを残していこうと思います。


# 環境

[embulk-output-oracle](https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-oracle)を使いました。


# tmp テーブルが残る

そのまんまなのですけど、

```
...
out:
  type: oracle
  mode: replace
  ...
```

で、途中で処理をキャンセルすると、xxxxx_tmp みたいなテーブルが残ってしまいます。


## replace は何が起こってるのか

mode: replace は、テーブルのデータをまるごと入れ替えたい時に使います。
公式には、下記の説明があります。

> Behavior: This mode writes rows to an intermediate table first. If all those tasks run correctly, drops the target table and alters the name of the intermediate table into the target table name.

中間テーブルを作って、データを入れ終わったら、古いテーブルを drop し、中間テーブルの名前を対象のテーブル名に書き換えるとのこと。
なので、途中でやめてしまうと、中間テーブルである tmp テーブルが残ってしまいます。
なるほど。


## どうするか

今のところ、地道に drop していくしかなさそうです・・。


# おまけ

処理が全て終わると、過去のデータがテーブルごと削除されるわけですが、oracle の場合、データそのものはゴミ箱に残り続けるので、定期的に purge してあげる必要がありそうです。

```
PURGE RECYCLEBIN ;
```

[参考：テーブル削除と削除の取り消し](http://www.shift-the-oracle.com/sql/drop-table-flashback-table.html)


# 余談

リソースを見てて気づいたんですけど、oracle に書き込み中の embulk を途中で止めると、TCP Error が大量に発生します。
セッションを強制終了してるから？
雑に不要なローカルブランチを削除するコマンドライン

## はじめに

ローカルブランチを削除するには`git branch -d local-branch-name`みたいなコマンドラインを実行します。

不要なローカルブランチが100件ある場合、100回もこのコマンドラインを実行することになります。

これは骨が折れます。

今回は雑に不要なローカルブランチを削除するコマンドラインを紹介します。

動作確認したOSはOSX10.11.6です。

他のOSでも似たことはできるはずです。

## 雑に不要なローカルブランチを削除するコマンドライン

以下のコマンドラインで不要なローカルブランチを削除できます。

``` sh
% git branch | xargs git branch -d
```

マージされていないローカルブランチは削除されずに残ります。

これなら、うっかり、作業中のローカルブランチを削除することはありません :+1:
Googleマップの埋め込み


カスタマイズもいろいろできるらしいですが、まずは基本のやつだけ。

#手順

1. 埋め込みたい場所をGoogle map上で右クリックする
2. 「この場所について」を選択
3. 画面下の方に住所等が出るのでクリック
4. 共有、をクリック
5. アドレスを埋め込む

```html:index.html
<div class="map__img">
    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d6561.444493809385!2d135.52110612671345!3d34.68695892175206!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x6000e0cd516e58f9%3A0xc9488d12f48fd2d7!2z44CSNTQwLTAwMDIg5aSn6Ziq5bqc5aSn6Ziq5biC5Lit5aSu5Yy65aSn6Ziq5Z-O77yS!5e0!3m2!1sja!2sjp!4v1470710796077" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>
```

##補足

- `width` `height` でサイズ調整可能（%もOK）
- 3.の住所等の情報のところにある座標はプラグインとかで利用できるらしい

#埋め込んだ地図の下に隙間ができる

`vertical-align: bottom`で解決。

#「GoogleMapで開く」とき

「手順」の「4. 共有」で「リンクを共有」選択。
同じ名前の rake task を定義すると上書きされずに共存する

```rb
# Rakefile

desc 'foo'
task :conflicted_name do
  puts 'foo'
end

desc 'bar'
task :conflicted_name do
  puts 'bar'
end
```

```
$ rake -T
rake conflicted_name  # foo / bar

$ rake conflicted_name
foo
bar
```

どっちも実行される！

「なんか二重に実行されているのでは…？」ってときは、名前の衝突を疑ってみるといいかもです。
Android Studioで実装したいインタフェースのメソッド自動生成

Android Studioでインタフェースを実装しようとすると次のようにメソッドを実装するように求められます．
![impError.PNG](https://qiita-image-store.s3.amazonaws.com/0/131996/c743f910-1b62-37e4-8c08-6e21ae539dd8.png)
しかし，大量にメソッドがあった場合，手で書くのは大変です．なので，Android Studioでは実装すべきメソッドを自動で追加してくれる機能があります.  

1. 実装したいインタフェースを右クリックする
2. 「Generate」をクリックする  
![imp2.PNG](https://qiita-image-store.s3.amazonaws.com/0/131996/094c9889-a5c3-c5b7-7d82-6f17bac4d086.png)  
3. 「Implement Methods...」をクリックする  
![imp3.PNG](https://qiita-image-store.s3.amazonaws.com/0/131996/51adea7d-07db-5bda-af43-42df60b7509b.png)  
4. 実装したいメソッドを選択して「OK」を押す
DockerのgatewayのIPアドレスを変更

## 環境

* Ubuntu 16.04 LTS
* Docker version 1.11.1

## 手順

#### Docker起動ファイルを編集

```
sudo su -
systemctl stop docker
vim /lib/systemd/system/docker.service
```

#### ExecStartに`--bip=192.168.100.1/24`を加える

```
[Service]
ExecStart=/usr/bin/docker daemon -H fd:// --bip=192.168.100.1/24
```

#### docker0を削除してからスタート

```
systemctl daemon-reload
ip link set dev docker0 down
systemctl start docker
# 確認
ip r
```


#### 追伸

もっといい方法があれば教えていただきたいっす。


## macの場合

`Dockerアイコン > Preferences > Daemon > Advanced` に以下のようにjson形式で記載

```
{
  "bip": "192.168.100.1/24"
}
```
Rails 5の機能でチャットが作成できるというので作ってみた（その1）

#ということでチャットをつくっています


どうもエンジニアペーペーの
fuzin_raizinです。

これからの時代はクリエイターもエンジニアの領域の
知識は必要なのではないか？という強迫観念（笑）のもと
ゆるくたわごとを吐きながらやっていこうかと思っています。


http://qiita.com/jnchito/items/aec75fab42804287d71b
初心者にとってこのような記事は非常にありがたいです。

**［　作成環境　］**

```
OS       |  Windows8.1
----------------------
Git Bash |  Windows
----------------------
rails    |  5.0.0
----------------------
ruby     |  2.2.4p230
----------------------
reids    |  3.0.0
----------------------
```
上記環境で作成しました。

作成完了まで躓いた点などを
何回かに分けて
まとめながら上げていこうと思います。
 
 

 



#【トラブル】TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。

![2016-08-09_11h06_19.png](https://qiita-image-store.s3.amazonaws.com/0/136585/2574e94e-af39-5f60-9cf2-fa77fa9c6125.png)

偉大なるQittaの投稿者の方の助力によりすぐに解決したのですが
1.8.0 coffeescript問題は現状もあるようです。
gemfileに1.8.0の記述を追加することによって
解消しました。

gemのパッケージをインストールをする際に
coffeescriptを避けてインストールすれば
そもそもそんな問題は起きないのかな？（笑）
（※やり方がわからない・・・）


引き続き投稿していきたいと思います。
よろしくお願いいたします。
runrでRからRuby, Python等他言語のコードを実行する

# 概要
Rでは[knitr](https://github.com/yihui/knitr)というパッケージを用いてRの実行結果をドキュメントとして作成し、[RPubs](https://rpubs.com/)等で共有することができます。この時にRだけではなく他の言語の実行結果も出力できるようにするためのパッケージが[runr](https://github.com/yihui/runr)です。これは、knitr専用ということではなくて通常通り一つのパッケージとして使い、他言語のコードの実行結果をR側で得ることができます。現在対応しているのは

- Bash
- Julia
- Python
- Ruby

のみです。言語間ブリッジというほど高度なものではなくて、RubyならRuby側でTCPサーバを立ててRとソケット通信をし実行結果をR側に返すというだけのものです。

# runrのインストール
`install.packages`経由ではインストールできないため、[Githubのリポジトリ](https://github.com/yihui/runr)からdevtoolsでインストールします。

```r
install.packages("devtools") # devtools未インストールの場合

library(devtools)
install_github("yihui/runr")
```

# 使用例
試しにRubyのコードを実行してみます。

```r
$ R
> library(runr)
> rb = proc_ruby()
> rb$start() # ruby側でTCPサーバ立ち上げ
> rb$exec("1 + 1") # Rubyのコード実行(標準出力に何も出てない場合は実行したコードだけが表示される)
1 + 1
> rb$exec("a = 1..8", "a") # 複数の文もok
a = 1..8
a
> rb$exec("print a.inject(:+)") # print等で標準出力に出力すると結果が返ってくる
print a.inject(:+)
# 36
> rb$stop() # サーバを閉じる
```
`# 36` がコメントアウトされてるみたいになってますが、実際に36という値が返ってきています。 

実際にknitrと使う例に関しては以下のRPubsの例を参考にすると良いでしょう。

- [Julia](http://rpubs.com/yihui/julia-knitr)
- [Bash](http://rpubs.com/yihui/bash-knitr)
- [Python](http://rpubs.com/badbye/python-knitr)
- [Ruby](http://rpubs.com/y4ashida/ruby-knitr)
StackViewを使ってて、UISV-hidingやUISV-spacingといった制約が衝突するときの対処法

StackViewを入れ子にしていて、子のStackViewをhiddenにすると次のようなログが出る。

```
	Probably at least one of the constraints in the following list is one you don't want. 
	Try this: 
		(1) look at each constraint and try to figure out which you don't expect; 
		(2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x150ab6c10 'UISV-canvas-connection' UIStackView:0x150b9c8e0.top == UIView:0x150b9ca90.top>",
    "<NSLayoutConstraint:0x150ab33c0 'UISV-canvas-connection' V:[UIView:0x150b9cd80]-(0)-|   (Names: '|':UIStackView:0x150b9c8e0 )>",
    "<NSLayoutConstraint:0x150abb760 'UISV-hiding' V:[UIStackView:0x150b9c8e0(0)]>",
    "<NSLayoutConstraint:0x150ab2c40 'UISV-spacing' V:[UIView:0x150b9ca90]-(>=4)-[UIView:0x150b9cd80]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x150ab2c40 'UISV-spacing' V:[UIView:0x150b9ca90]-(>=4)-[UIView:0x150b9cd80]>
```

## 原因と対処法
子のStackViewをhiddenにして高さ0になったけど、中の要素が消えてないためspacingと衝突しているっぽい。**中の要素をすべてhiddenにするとspacingがなくなって、なおる**。
pryでセッション開始前に変数をプリセットしておく（rails console対応）

# やりたいこと

`rails c`でREPLを使いつつコーディングするとき、毎回DBの同じレコードを使っている、つまり毎回

```
u = User.find(1)
u.some_method   # some_methodの動作確認
```

のようなことをしている。この`u = User.find(1)`を入力するのが面倒なので、`rails c`を開始したとき変数`u`をプリセットおきたい。


# やり方

※以前はpryのフックを使う方法を書いていましたが、それだとpryの1コマンドごとに呼ばれてしまうので変更しました。


`.pryrc`に以下を記述。

```
@u = nil
def u
  if @u.nil?
    @u = User.find(1)
  end
  return @u
end
def u=(u)
  @u = u
end
```

これで`u`が使えるようになった。

```
[1] pry(main)> u
```


# 解説

pryにはフックの仕組みがあり、
`:when_started` `:before_session` `:after_read` `:before_eval` `:after_eval` `:after_session`
が用意されている。
https://github.com/pry/pry/wiki/Hooks#Hooks_index_of_built_in_events
Command of SQLite3 on Rails

基本

```
$ sqlite3 -version   # バージョンを表示
$ sqlite3 database.sqlite3   # データベースに接続する（同名ファイルがなければ作成して接続する）

sqlite> .help   -- ヘルプを表示する
sqlite> .show   -- 設定情報を表示する
sqlite> .exit   -- 終了する

sqlite> .tables   -- テーブルの一覧を表示する
sqlite> .schema [table]   -- テーブルのスキーマを表示する

-- CREATE
sqlite> CREATE TABLE table (column_a [type], column_b [type]);  -- テーブルを作成する。型の指定は任意。
sqlite> CREATE INDEX index on table (column);   -- インデックスを追加する

-- ALTER
sqlite> ALTER TABLE table_old RENAME TO table_new;   -- テーブル名を変更する
sqlite> ALTER TABLE table ADD COLUMN column;   -- カラムを追加する

-- Drop
sqlite> DROP TABLE table   -- テーブルを削除する

-- INSERT
sqlite> INSERT INTO table (column_a, column_b) VALUES (value_a, value_b);   -- レコードを挿入する

-- UPDATE
sqlite> UPDATE table SET column_a = value_a WHERE column_b = value_b;   -- レコードを更新する

-- DELETE
sqlite> DELETE FROM table WHERE column = value;   -- レコードを削除する

-- SELECT
sqlite> .header on   -- カラム名も出力するよう設定する
sqlite> SELECT * FROM table;   -- 全てのレコードを取得する
sqlite> SELECT (TYPEOF)column FROM table;   -- 全てのレコードから特定のカラムのみ（型情報を含めて）取得する

-- 特殊な変数
sqlite> SELECT current_time;   -- 12:57:55
sqlite> SELECT current_date;   -- 2016-01-28
sqlite> SELECT current_timestamp;   -- 2016-01-28 13:00:47
sqlite> SELECT ROWID, * FROM table   -- ROWIDは内部的にレコードに付与される連番

-- CSVを取り込む
sqlite> .separator ,   -- 区切り文字を変更する
sqlite> .import file table   -- 指定したファイルのデータをテーブルに挿入する

-- バックアップを取る
sqlite> .output backup.dump   -- 出力先を任意のファイルに指定する
sqlite> .dump [table]  -- テーブルのデータを出力する

-- 復元する
sqlite> .read backup.dump   -- バックアップを元に復元する（同じ名前のテーブルが存在する場合はエラーが発生する）
```

console

```
rails c
exit
@tasks = Task.all
@task = Task.find(1)
new_task = Task.new
new_task.content = 'NewTask registered!!'
@tasks = Task.all
```
iTunesConnectでのアプリスクリーンショットの簡易提出が可能になりました🎉

本日から、iTunesConnectでのアプリスクリーンショットの簡易提出が可能になりました🎉
[Simplified Screenshot Submission Process - News and Updates - Apple Developer](https://developer.apple.com/news/?id=08082016a)

![Screen Shot 2016-08-09 at 9.48.30 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/c1adafff-64c5-2c59-0dec-ee7d8ac7dd44.png)

説明動画はこちらです:
[What's New in iTunes Connect - WWDC 2016 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2016/305/?time=1700/)

http://qiita.com/nerd0geek1/items/a0e67e794670d8c79492#screenshot-simplification でも紹介されていますが、要点は、

- iPhone・iPadそれぞれの最大サイズのスクリーンショットをアップロードするだけで、自動で小さいサイズ用にリサイズ表示してくれる
- `Other Sizes`から、他のサイズのスクリーンショットを個別に指定することも可能(オプション)
    - 以前はこれも必須だったのがオプションに変わった

スクリーンショットのサイズなど詳細は、[Screenshot Properties](https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Appendices/Properties.html#//apple_ref/doc/writerid/itc_screenshot_properties)に記載されています(これまでと同じ)。


というわけで、iPhone専用アプリだと、以下を満たす画像を1-5種類提出するだけで良くなりました。

- ファイルフォーマット: JPEG or PNG
  - 72 dpi・非透過
- サイズ: 1242 x 2208 ピクセル(ポートレイトの場合)
  - ランドスケープの場合は、2208 x 1242 ピクセル


そこまで凝らない場合はこれで充分そうですね(　´･‿･｀)
Windowsと、VM(Linux) on Windowsでpgbench測定

## はじめに
先日、pgAdmin4を試すために久々にWindows版PostgreSQL 9.6 beta3をWindows 8.1上にインストールしてみました。
そこで発生した問題は別途整理しようと思っているのですが、それとは別に、なんとなくWindows版PostgreSQL 9.6 beta3と、Windows上のVM環境(CentOS7)にインストールしている、PostgreSQL 9.6 beta3をpgbenchで比較してみようかなと思った。

## 測定環境/測定内容
* マシン：Let's note CF-SX4 SSDモデル
* メモリ8GB(VMには5GB割当）
* PostgreSQL 9.6 beta3
  * pgbenchは同梱のものをそれぞれ使用
* PostgreSQLパラメータは(面倒だったので)デフォルト
* pgbench初期設定
  * スケールファクタは10
  * テーブルは通常(UNLOGGEDでないもの)
  * fillfactorは90
* pgbench実行設定
  * 同時実行数は1,2,4の3パターン
  * 参照のみモード、デフォルトトランザクションの2パターン
  * 実行時間は60秒
  * 3回測定して平均値をプロット

## 結果
ちょっと意外な結果？

### 参照のみ
![read-only.png](https://qiita-image-store.s3.amazonaws.com/0/32626/9f0995a7-3011-cd72-1b6b-a2b4b065f008.png)

* 同時実行数が小さいときはVM on Linuxのほうがtpsが高いが、同時実行数4になるとほぼ同値。
  * VM Linux上だとCPU数(=2)を超えるとほぼ横ばいに。
  * CPUの使われ方が違うのかしらん。

### デフォルトトランザクション
![read-write.png](https://qiita-image-store.s3.amazonaws.com/0/32626/cde8effb-3f89-3080-0500-a5bf1107703f.png)

* 更新ありの場合だと、Windows版のほうがどの同時実行数でもtpsが高い結果になっている。
* VM Linux上だとCPU数(=2)を超えるとほぼ横ばいになるのは、参照のみと同じ傾向。
* 更新ありの場合でもWindows版は同時実行数が2を超えても上昇傾向にあり。

## おわりに
今回は、何も考えずとりあえず測定してみたけど、ちょっと意外な結果が出たので、きちんと分析したほうが良いのかな？
Windows版ってとにかく遅いというイメージがあったのだけど、実はそうでもないのか。
あるいは、測定環境がSSD環境だからというのがあるのか。
yumの通信速度を50kilobytes/secに制限する

帯域が狭い場合用。CentOS5でも有効なことを確認

## 参考

* [Josef's Fedora (GNU/Linux) Workbook: Limit yum download speed](http://fedoraworkbook.blogspot.jp/2010/11/limit-yum-download-speed.html)
* [yum.conf(5): config file for yum - Linux man page](http://linux.die.net/man/5/yum.conf)

> throttle
> Enable bandwidth throttling for downloads. This option can be expressed as a absolute data rate in bytes/sec. An SI prefix (k, M or G) may be appended to the bandwidth value (eg. '5.5k' is 5.5 kilobytes/sec, '2M' is 2 Megabytes/sec). 

## 設定

```diff:/etc/yum.conf
 [main]
 ..(略)
+ throttle=50k
```

`yum update`などで通信速度が`50k`に絞られていることを確認。

----

## yumでインストールしたrpmを消さずに残したい場合

```diff:/etc/yum.conf
+ keepcache=1
```

* /var/cache/yum/updates/packages/*.rpm