OmniAICreator/Qiita-1.07M huggingface dataset:
Proxy環境下における早見表

##はじめに
　毎回毎回ぐぐって使い方を調べるプロキシ設定まとめ
　ほかに思いついたら即追加

##環境
　Redhat,CentOSメインになります。

##設定

### yum
vi /etc/yum.conf

```bash
proxy=http://proxyserver:port
```

###wget
vi /etc/wgetrc

```bash
http_proxy=http://proxyserver:port/
https_proxy=http://proxyserver:port/
ftp_proxy=http://proxyserver:port/
```

###curl

```bash
curl -x proxyserver:port -L https://www.google.com
```

###git

```bash
git config --global http.proxy http://proxyserver:port
git config --global https.proxy http://proxyserver:port
```

###pip

```bash
pip install モジュール --proxy=http://proxyserver:port
```
matplotlib:histgram normedの挙動

#matplotlibでhistgram
matplotlibでヒストグラムを作る際にハマったことのメモ

#normedの落とし穴
matplotlibでヒストグラムをつくるときに使う matplotlib.axes.Axes.hist() もしくは matplotlib.pyplot.hist() には恐ろしい落とし穴が存在するのでメモしておく。ヒストグラムを作るときに頻度を正規化するためにnormed=1というオプションをつけることが多々ある。しかし、このoptionをつけたのにも関わらず、以下のようなヒストグラムになることがある。

```py
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
plt.hist(nor,normed=1,range=(-3,3),bins=300)
plt.savefig("test.pdf")
```

![c0e82554-a3d9-11f4-b7c0-58dd5fe0b006.png](https://qiita-image-store.s3.amazonaws.com/0/167957/ea4452c3-e13a-fcea-3c54-8044f8d69463.png)


え、y軸の目盛りの値が1より大きい。。

当初、これをバグだと思っていた筆者は無理やりbarplotを用いてヒストグラムを書こうとした。しかし、面倒過ぎる。seabornのdistplotならと思ってみたが、同じ問題を抱えていてダメ。謎だなぁと思っていたら、あることに気づいた。

```py
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
plt.hist(nor,normed=1,range=(-3,3),bins=6)
plt.savefig("test.pdf")
```

![5170b571-cc4a-88b6-b414-dec61b28d729.png](https://qiita-image-store.s3.amazonaws.com/0/167957/e7e7fc98-9fe8-b05f-b48a-e9f02ed610dd.png)


__binの幅が1なら正常に動くじゃん。__   __まさか__、、
なんと、__binの面積の合計が1になるように正規化されている__。 実際に、numpyのhistogram関数(matplotlibのhistと挙動は一緒)をつかってデータの詳細をみてみると
    
```py
import numpy as np
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
hist,pos = np.histogram(nor,normed=1,range=(-3,3),bins=300)
print(np.sum(hist))
#50.0
print(np.sum(hist)*6.0/300)
#1.0
```

となる。よって、以下のようにコードを書きかえて上げればいい。

```py
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
binnum = 300
fig = plt.figure()
ax = plt.subplot(111)
ax.hist(nor,normed=1,range=(-3,3),bins=binnum)
ax_yticklocs = ax.yaxis.get_ticklocs()#目盛りの情報を取得
ax_yticklocs = list(map(lambda x: x * len(range(-3,3))*1.0/binnum, ax_yticklocs))#元の目盛りの値にbinの幅を掛ける
ax.yaxis.set_ticklabels(list(map(lambda x: "%0.2f" % x, ax_yticklocs)))直した目盛りを表示
plt.savefig("test.pdf")
```

![iTerm2.xULA2R.test copy.png](https://qiita-image-store.s3.amazonaws.com/0/167957/ba69267b-a347-c550-6818-10b3e16bf102.png)

これで、多分望みどおりの目盛りができてるはず。しかし、この実装はわかりにくい、、、。
blobデータをsqliteからMySQLへ移行する際に気をつけること


備忘録かつ雑です。

## sqliteはバイナリをダンプできない
SQLiteにはダンプのコマンド `.dump` がありますが、こいつがバイナリを吐いてくれない。

なので適宜移行スクリプトをちょろっと書きましょう。


## blobにデータを入れようと思うとエラーになる
適当に作った移行スクリプトを動かすと `MySQL server has gone away` と言われて途中で死ぬ。

原因は簡単で、設定で特定のサイズ以上のSQLは実行できないようになっている。

設定するキーは `max_allowed_packet` なので設定ファイルを修正、またはRDSのパラメータグループを修正する。
今回のアプリケーションでは画像を扱っていて5Mが上限なので`5 * 1024 * 1024`を設定。 

http://qiita.com/RyutaKojima/items/3772d695db5e2342ab47#mysql-server-has-gone-away


## MySQLのblob型は小さい
SQLiteのDDLを移行して`BLOB`のままテーブルを作成した後、画像データを投入して表示してみると画像データが壊れている。

原因はMySQLのblob型は最大`65535`バイトだから。

MEDIUMBLOBが`16777216`、LONGBLOB が`4294967295`なので環境に合わせて適宜DDLを変更してテーブルを再作成。

http://www.dbonline.jp/mysql/type/index6.html


## 移行スクリプトを実行中にプロセスが死ぬ
いきなり強制終了とか画面に表示されていきなり死ぬ。OOM killerの仕業です。
（多分t2.nanoを使ってるせいもあると思う）



http://blog.wnotes.net/blog/article/ffmpeg-on-ec2-killed-process
Gitでやらかした時のための基本操作（Sourcetree編）


同じ内容のエントリはたくさんありますが、CLIを使うものが多いので、
社内向けにSourcetreeでの基本commandの操作方法をまとめました。


## 前提
共有しているリモートリポジトリに既にPushしたCommitを変更するとおかしなことになるのでPush前に！というのが大原則になります。

### プッシュする前
直前のCommitだけを修正する場合： **amend**
Commitを消したい場合： **reset**
古いCommitを修正する場合： **rebase**

### プッシュした後
Commitをなかったことにしたい： **revert**
**Push後にはamend/reset/rebaseしちゃダメ！**


## （amend）コミットメッセージを書き直したい時
直前のコミットは、コミットした後に再度コミットボタンを押し、下記のように「最新のコミットを修正」を選択する。
![スクリーンショット_2017-02-28_21_14_43_1.png](https://qiita-image-store.s3.amazonaws.com/0/77729/db95e6f6-4fdc-f12d-a667-e6d5e6736aa5.png "スクリーンショット_2017-02-28_21_14_43_1.png")


## （rebase）古いコミットを書き直したい場合
直したいコミットの親コミットの上で、「xxxの子を対話形式でリベース」を選択
![スクリーンショット 2017-02-28 21.47.07 1.png](https://qiita-image-store.s3.amazonaws.com/0/77729/e94532b3-7c57-d146-80f8-dc3ecab5df5c.png "スクリーンショット 2017-02-28 21.47.07 1.png")
「メッセージを編集」でコミットメッセージを編集、
またはドラッグ＆ドロップでコミットの順番を入れ替える
![スクリーンショット_2017_02_28_21_52.png](https://qiita-image-store.s3.amazonaws.com/0/77729/46799ed9-f450-f53c-7460-da51ed1527e3.png "スクリーンショット_2017_02_28_21_52.png")



## （rebase）直前のCommitから任意のCommitまでまとめたい
こんな状況
![naoko__Git_.png](https://qiita-image-store.s3.amazonaws.com/0/77729/0252ac24-713b-02ba-34a9-bbf97648230a.png "naoko__Git_.png")



まとめたいコミットの上で「このコミットまでmasterを元に戻す」を選択。Using modeでSoftを選択してOK
その後、新しくCommitすることでCommitをまとめることができます。
![スクリーンショット 2017-02-28 21.26.34.png](https://qiita-image-store.s3.amazonaws.com/0/77729/a2cc3ddf-1fda-c555-a796-66350e2cc484.png "スクリーンショット 2017-02-28 21.26.34.png")


## （revert）プッシュ後だけどコミットをなかったことにしたい
「コミット適用前に戻す」を選択します。
OKを押すと、「Revert コミット名」という名前の新しいコミットができます。
![スクリーンショット_2017-02-28_22_15_35.png](https://qiita-image-store.s3.amazonaws.com/0/77729/95843e8e-dffa-8bd8-79b1-b283956636b8.png "スクリーンショット_2017-02-28_22_15_35.png")



## （reset）コミット内容をなかったことにしたい
戻したいコミットの上で「このコミットまでブランチ名を元に戻す」を選択。modeはSoftを選択してOK
![スクリーンショット 2017-02-28 21.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/77729/3ce64726-7ca7-fcef-b587-7c95d0da907d.png "スクリーンショット 2017-02-28 21.58.09.png")

##さらにもっとやらかした場合は？
[ Gitでやらかした時に使える19個の奥義 ]
http://qiita.com/muran001/items/dea2bbbaea1260098051
OS の bit数 を 判定する

OSが64bit版か32bit版か判定する方法です。
プリンタドライバを PowerShell でインストールする際に、
使うべきドライバを判別するのに使用しています。

<pre>
$os = Get-WmiObject -Class Win32_OperatingSystem
Write-Host $os.OSarchitecture

if ( $os.OSarchitecture -eq "64 ビット" )
  {
  Write-Host "64bit版OSです"
  }
else
  {
  Write-Host "32bit版OSです"
  }
# end
</pre>
【初心者用】Active Recordを使ったデータベース(テーブル)の作成手順

　ActiveRecordは元々Rails用に作られたものだから当然といえば当然なのだけれど、Rails以外の環境でActiveRecordを使ってテーブルを作成する流れをざっと見やすくわかりやすくまとめた情報は少ないので、SinatraとSQLite3を使った作成手順を個人的Tips付きで復習用にまとめてみる。

#実行環境
- Ruby (2.1.3)
- Sinatra (1.2.0)
- ActiveRecord
- SQLite3

# ActiveRecordとは
　PHPやSQLの知識がなくてもRuby+αの知識でデータベースを構築できる便利なツール(超訳)

#作成手順
## コードを書く前に
### 0. 必要な情報を整理する
　そのデータベースやテーブルにはどんなデータが必要で、そのデータは文字列`.string`なのか、真偽値`.boolean`なのか、はたまた日時`.datetime`なのかなど、どんな形のデータにあたるのかをまとめて、データベース全体や各テーブルについて設計する。

## ActiveRecordを使う準備をする
### 1. Gemfileに必要なことを書き加えてgemを追加
```
souce "https://rubygems.org"
gem 'sinatra'
gem 'sinatra-contrib'
gem 'sinatra-activerecord'
gem 'sqlite3'
gem 'rake'
```
　Gemfileにこれらを書き加えて、``bundle``。ターミナルで操作する前に**絶対に保存する**。*いつまで経っても`bundle`のタイプミスしがち。*
### 2. Rakefileを作成し、Rakefikeに必要なことを書く、保存

## 実際に作っていく

### 3. models.rbを作成、書く、保存
　models.rbはSQLiteと接続して、データベース全体の設計をするところ。
### 4. rake db:create_migration NAME=テーブル名(複数形)
### 5. migrationファイルを書く
　個々のテーブルの設計を落とし込んでいく。
### 6. rake db:migrate
　実際にデータベースを構築するSQLiteへ変更を送信(超訳)。

## 作成したテーブルを確かめる

### 7. schema.rbで確認
　データベースの最新状況がここにまとめて表示される。自動生成されるこのファイルは閲覧専用につき注意。
### 8. 修正したいとき
#### 1. 新規migration fileで`remove_colmn`や`add_colmn`をする
　そのまま`def change`のときと`def up`/ `def down`を使うときがあるぞ！
#### 2. rake db:rollback STEP=n
　SQLiteのデータベースへmigration fileを追加する前の状態へ時間を巻き戻せる呪文。`rollback`するときは、`rollback`前に該当ファイルをいじってはいけない。

#まとめ
- 慣れたらそんなに難しくない。はず。
- Gitの更新みたいにちゃんと手順を踏んで作っていく。
- 事前にちゃんと情報を整理して、設計しておくのと、実行前に見直しをしっかりする！

いくらお手軽データベース作成ツールとはいえ通常のコードの修正と比べると修正するのに手間がかかって面倒だから、はじめのうちは慎重につくるように心掛けたほうがいい気がする。

# 参考文献
- [【Rails　Guides】Active Record の基礎](https://railsguides.jp/active_record_basics.html)
git revert でやらかした話

先日git revertでやらかしてしまったのでご紹介しておきます。
自分がアホだっただけかもしれませんが、
同じ失敗をする方がいませんように共有させていただきます・・・

#何をやらかしたのか
結論から言うと、
知らない間に他の人のコミットを消してリリースしてしまった（ﾋｬー！！:ghost:

#なぜそんなことに
devブランチにmaserをmergeしてきたのをrevertしました
意図は正直覚えていないのですが（汗
mergeを一旦なかったことにしたかったのだと思います。

図にするとこんな感じ

```
*       fffffff Merge develpoment into master (master)
|\
| *     eeeeeee Revert 'ddddddd' (HEAD -> development)
| *     ddddddd Merge master into develpoment
|/|
* |     ccccccc 他の人の開発
| *     bbbbbbb developmentブランチを切ってcommit
|/  
*       aaaaaaa first commit (master)
```


#その結果
masterにmergeしたら（当然ですが）取り消したcommitが取り込まれ、
master上でも他のコミットを打ち消してしまったが、
それに気づかずreleaseブランチまでmergeしてしまいました。

#どうすればよかったのか
今回はただmergeする前に戻りたかっただけなので（多分）
"reset"で良かったなーと思います。
また、revertは「開発ブランチでは原則行わないように」という運用になりました。

#まとめ
revertはcommitする前に戻してくれるコマンドではない！！
commitを打ち消すcommitで上書きしてるだけなんだ！！
ということを肝に銘じておきます。
DBに保存する値を検証する

#DBに保存する値を検証する
```ruby:app/models/entry.rb
class Entry < ActiveRecord::Base
# contentが空でないことを検証する、と宣言する
validates_presense_of :content
end
entry_with_content = Entry.new(:contet => "a message for you")
#contentがからでないため、検証結果は真となる
entry_with_content.save #=> true
#バリデーションにパスしているため保存される
entry_with_content.new_record? #=> false
entry_without_content = Entry.new
#contentが空であるため、検証結果は偽となる
entry_eithout_content.save #=> false
#検証結果が偽であるため保存はされない
entry_eithout_content.new_record? #=> true
```
##保存せずにバリデーションを行う

```ruby:
entry_with_content = Entry.new(:content => "a message for you")
#contentがからでないため、検証結果は真となる
entry_with_content.valid? #=> true
#バリデーションにパスしていても保存はされていない
entry_with_content.new_record? #=> true


```
####バリデーションを行わず保存する




```ruby:
entry_eithout_content = Entry.new
#contentが空であるため、検証結果は偽となる
entry_without_content.valid? #=> false
#当然ながら保存はされていない
entry_without_content.new_record? #=> true

```

##バリデーションのエラーメッセージを取得する



```ruby:
entry_without_content = Entry.new
entry_without_content.valid? #=> false
entry_eithout_content.errors
#=> #<Activemodel::Errors:Ox103d3d89188
		@messages=#<0rdredHash {:content=>["can't be blank"]}...>
		
entry_without_content.errors.each do |attribute, error|
puts "#{attribute} have errors '#{error.to_s}'."
#=> "content have errors 'can't be blank'."
end

entry_without_content.errors.fll-messages
#=> ["Content cat't be blank"]

entry = Entry.new
entry.save
#=> false :バリデーションに失敗しているため保存できない
entry.save :validate => false
#=> true :バリデーションをせずに保存する
```
memcachedのvalueのデフォルトサイズは1M


表題の通りです。

webappでsession内に画像データを保存するとかよくあることかと思いますが、何故か保存先をmemcachedにした時に、storeされた画像データがfetchできないことがあったのでなんでかなとしばらく悩んでいたのですが理由はシンプルだった。

起動時の引数に `-I サイズ` を加えて最大サイズを大きくしましょう。

```bash
/usr/bin/memcached -I 10M
```

つか `memcached -h` にちゃんと書いてあった。versionは `1.4.34`。

```bash
-I            Override the size of each slab page. Adjusts max item size
              (default: 1mb, min: 1k, max: 128m)
```
auのiPhoneで「メール」アプリを使う設定が失敗する

# 起きたこと

先日AndroidからiPhone7に機種変更しました。店頭でもらったパンフに従い初期設定を済ませたところ、auのキャリアメール(@ezweb.ne.jp)を「メール」アプリではなく「メッセージ」アプリで受信する設定になってしまいました。
「メッセージ」アプリでは件名が表示できない(と思っていた[^1])こと、ホーム画面でSMSの未読数は見たいけどメールの未読数は見たくないこと等から「メール」アプリで受信する設定に変更することに。
順調に画面を進めていき、プロファイルインストール用のURLを開いたところで問題が発生。以下のようなエラーメッセージが表示されました。

> お客さまがアクセスされたURLは利用不可となっております。
> URL有効時間(SMS送信から30分)、iPhoneのクッキー設定がオンになっていること、プライベートブラウズの設定がオフになっていることをご確認の上、お手数ですが、最初の設定手順からやり直してください。
> 
> (C)KDDI

エラーメッセージに書いてあることの他、Wi-Fiがoffになっていることを確認したり、SafariのCookieを全削除したり、端末の再起動も試してみたものの効果がなく、困っていました。

# 解決法

**「サービスTOP」からではなくSafariから設定を始める**

通常通りに設定した方々には何を言っているか良く分からないかもしれないですが、[auお客様サポート](https://www.au.com/support/)のページには「サービスTOP」アプリからでもアクセス可能なのです[^2]。なまじ同じ画面が表示されるため、こちらからでも設定可能なのかと勘違いしてしまいました。

# 解説

これだけだとただの暮らしのTipsになってしまうので、Qiitaらしく今回の問題が発生した技術的背景を解説します。
まず、設定の手順をおさらいしましょう。

1. auお客様サポートにアクセス
2. 「メールアプリ（Eメール）利用設定」をタップする
3. 受信したSMSのURLにアクセス
4. プロファイルをインストール

エラーメッセージでCookieの設定に言及していることから分かるように、1.から2.の段階で保存したCookieを3.で確認しているようです。ここで、Appleの[Developer Guide](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/CookiesandCustomProtocols/CookiesandCustomProtocols.html#//apple_ref/doc/uid/10000165i-CH10-SW1)を参照すると、

> iOS Note: Cookies are not shared between apps in iOS.

と書いてあります。すなわち、「サービスTOP」アプリ内で2.の処理を行った場合Cookieが保存されるのは「サービスTOP」専用の領域であり、SafariからはそのCookieを確認できないため3.の段階でエラーが発生するのです。

## Safari View Controller

「サービスTOP」アプリ内でwebページを表示していると、画面右下に四角形から上向き矢印が出ているアイコン(共有アイコン)が表示されます。これをタップすると幾つか項目が現れるのですが、その中に「Safariで開く」というのがあります。これをタップすると開くのがSafari View Controllerです。これはアプリ内で動くSafariで、単体のSafariの機能を利用できる他、Cookieを共有することもできます。では「サービスTOP」でauお客様サポートを開き、「Safariで開く」をタップして前述の手順を進めると正しく設定できるのかというと、そうでもありません。なぜなら_**共有されるCookieと共有されないCookieがある**_からです。共有される・されないの違いについて述べた公式ドキュメントは残念ながら発見できませんでしたが、[とあるフォーラム](https://forums.developer.apple.com/message/105133#105133)によると`session cookie`(ブラウザを閉じると消去されるCookie)と`persisted cookie`(有効期限まで消去されないCookie)があり、前者は共有されないとのこと。ややこしい。
なお、Safari View Controller右下に表示されるSafariのロゴをタップすると単体のSafariが起動し、こちらで手順を進めるとうまくいきました。

# あとがき

普通の人は「サービスTOP」からauお客様サポートにアクセスしたりしないと思うので、私のように新しいデバイスを手に入れたらとりあえず隅から隅まで設定をいじってみる人種ほど引っかかりやすい罠だと思います。

[^1]: できます。[http://faq.mb.softbank.jp/detail.aspx?cid=75652&id=75652&a=102](http://faq.mb.softbank.jp/detail.aspx?cid=75652&id=75652&a=102)
[^2]: 「サービスTOP」を開く -> 画面右下「メニュー」 -> 「各種サービス入会・退会」 -> ページ下部「その他のオプションの設定・確認はこちら」
Gitでbranchを動かさずに他のbranchのrevisionを変更する

gitで現在のbranchから移動せずに他のbranchのrevisionする方法を調べました。

例えば、現在のブランチでテスト等を動かしていて、他のbranchにチェックアウト
したくはないけど、mergeしたいbranchがあるので、その更新の準備をしておきたい。
というときに使う機会があるかもしれません。

例えば以下のようなコミットツリーがあったとします。

````
*       888cfeb dd511805   change readme   (HEAD -> my_branch)
| *     e07568b Foo fixed:feature  (origin/master, origin/HEAD)
| *     669b7ae Foo add feature (master)
|/  
*       e96f285 dd511805   first commit 
````

この状態でmasterのbranchのrevisionを変更する場合には、以下の手順が良く行われると思います。

````
$ git checkout master
$ git rebase origin/master master
````

しかし、この手順で作業を行うと作業後のbranchがmasterに変更されてしまいます(checkoutしているので当然ですね)。

````
$ git branch
  my_branch
* master
````

branchを変更せずに他のbranchを変更する場合は以下のコマンドを実行します。

````
git branch -f <対象となるbranch名> <revisionハッシュ>

````

今回の例では以下の処理になります。

````
git branch -f master e07568b

````


````
*       888cfeb dd511805   change readme   (HEAD -> my_branch)
| *     e07568b Foo fixed:feature  (HEAD -> master, origin/master, origin/HEAD)
| *     669b7ae Foo add feature
|/  
*       e96f285 dd511805   first commit
````

また以下の方法でも変更することが出来ます。

````
git update-ref -m "reset: Reset master to e07568b" refs/heads/master e07568b 

````

どちらでも結果としては変わりませんが、.git/logs/refs/heads/masterに表示される
メッセージは任意のものになるか、自動で記入されるかの違いは存在します。

````
$ tail .git/logs/refs/heads/master
669b7ae7b522da6795f74405bb0a5b25e25ccf66 e07568b9e9a90c748d042b946bf36464b7a40439 dd511805 <dd511805@example.com> 1488286020 +0900 branch: Reset to e07568b
669b7ae7b522da6795f74405bb0a5b25e25ccf66 e07568b9e9a90c748d042b946bf36464b7a40439 dd511805 <dd511805@example.com> 1488286092 +0900 reset: Reset master to e07568b
````
RTX1200にMacでシリアルコンソール接続

## ケーブル類を用意する

### USBシリアル変換

* iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)0.5m ブラックスケルトン BSUSRC0605BS
 * https://www.amazon.co.jp/gp/product/B007SI18YO/

### シリアルケーブル

* エレコム RS-232Cシリアルリバース D-Sub9ピンメス - D-Sub9ピンメス 1.5m C232R-915
 * https://www.amazon.co.jp/gp/product/B0000A41GX/


## USBシリアル変換のドライバをインストール

Mac OS 10.9以降はもともとFTDI（今回買ったUSBシリアル変換のチップメーカー）のドライバが入っているらしい

## シリアルコンソールで接続
Homebrewでminicomを入れて設定した。

```
$ minicom -s

            +-----[configuration]------+
            | Filenames and paths      |
            | File transfer protocols  |
            | Serial port setup        |
            | Modem and dialing        |
            | Screen and keyboard      |
            | Save setup as dfl        |
            | Save setup as..          |
            | Exit                     |
            | Exit from Minicom        |
            +--------------------------+
```

"Serial port setup"を設定する。
tty以下はusbserialの機種によって変わりそう。

```
    +-----------------------------------------------------------------------+
    | A -    Serial Device      : /dev/tty.usbserial-FT0VS73O               |
    | B - Lockfile Location     : /usr/local/Cellar/minicom/2.7/var         |
    | C -   Callin Program      :                                           |
    | D -  Callout Program      :                                           |
    | E -    Bps/Par/Bits       : 9600 8N1                                  |
    | F - Hardware Flow Control : Yes                                       |
    | G - Software Flow Control : No                                        |
    |                                                                       |
    |    Change which setting?                                              |
    +-----------------------------------------------------------------------+
```
モデルオブジェクトをDBに保存する　save

#モデルオブジェクトをDBに保存する　save

```ruby:
save 行う　falseを返す
save!　行う　例外ActiveRecord::RecordInvalidが発生
save(:validate => false)　行わない　falseを返す
save(:validate => false)　行わない　何かシステム上の例外が発生


```
##DBに保存できたかどううかによって処理を分岐させる

```ruby:
if @entry.saveredirect_to entries_path
else
render :acton => "new"
end

```
##トランザクションの中で複数の項目を保存する

```ruby:
begin
Entry.transaction do
@many_entries.each {|entry| entry.save}
end
redirect_to entries_path
resucue ActiveRecord::RecordInValid,ActiveRecord::RecordNOtSaved
render :action => "input_multi_entries"
end
```
##モデルオブジェクトを生成し、すぐにDBに保存する

```ruby:
#新しいEntryを生成する
entry = Entry.new(:content => "新しい記事の本文", :blog_id => 1)
entry.new_record? #=> true
#新しいEntryを生成し、すぐに保存する
entry = Entry.create(:content => "新しい記事の本文", :blog_id => 1)
entry.new_record? #=> false
#新しいEntryを生成し、すぐに保存する。保存失敗時には例外を発生させる
entry = Entry.create!(:blog_id => 1)
#=> ActiveRecord::RecordInvalid
```
navigator.geolocationでの位置情報の利用

地図サービス等で位置情報を利用したい。
そんなときは **navigator.geolocation** を利用することで現在位置の緯度・経度の取得が可能です。
## 使い方
```sample.js
successCallback= function(position)
{
  alert('緯度：' + position.coords.latitude);
  alert('経度：' + position.coords.longitude);
}
errorCallback = function(error) {}

if (navigator.geolocation) {
  /* Geolocation APIを利用できる環境向けの処理 */
  navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
} else {
  /* Geolocation APIを利用できない環境向けの処理 */
}
```
上記サンプルのような形で現在位置の緯度や経度の取得ができます。

## 注意点
1) このAPIはSSL環境下でしか位置情報を取得できません。
httpや不正なSSL証明書では使えないのでご注意を！

2) 位置情報の制度は使用したデバイスのGPS制度や通信環境に依存します。

3) デバイス・ブラウザによっては取得時にGPSへのアクセス許可を求めるダイヤログが表示され、許可しないと使用できません。
CentOS7でcronを使ってmydnsのDynamicDNSを更新する

# はじめに
自宅サーバーを外部に公開する場合、外部のDNSサーバーに自宅サーバーのIPアドレスを登録しておく必要がありますが、固定IPを取得していない場合、DynamicDNSを利用します。
今回は、国内では比較的メジャーな[mydns](http://www.mydns.jp/)(無償)を利用して、DynamicDNSを設定してみましょう。

# ミッション
1. CentOSのcronにmydnsのIPアドレス更新シェルを登録する
2. 動作確認する

# 条件
- (独自ドメインが必要であれば)お名前.com等で独自ドメインを取得済みであること
- mydnsのアカウントを取得済みであること
- mydnsにAレコードを設定済みであること

※独自ドメインの取得方法、mydnsの登録方法は割愛します。

# やってみた
## CentOSのcronにmydnsのIPアドレス更新シェルを登録する

まずは、mydnsのIPアドレス更新シェルを作成します。
登録方法はいろいろ(POP3,FTP,HTTP-BASIC等)あるようですが、ここではHTTP-BASICを利用したいと思います。

```bash:mydns.cron
#!/bin/bash

wget --http-user=mydnsXXXXXXXX --http-passwd=password http://ipv4.mydns.jp/login.html -O /dev/null
```

*ってかHTTPSでないのはなんでだぜ・・・*

wgetコマンドがインストールされていない場合は、yumコマンドでインストールしましょう。

```
# yum -y install wget
```

次に、cronに設定します。
crontabに登録するのでも良いのですが、ここは便利なcron.dailyディレクトリを使ってみます。

といっても、/etc/cron.dailyにシェルを置くだけですが。。。

```
# ll /etc/cron.daily/mydns.cron

-rwxr-xr-x  1 root root 114 11月 12 21:07 mydns.cron
```

*rootに実行権限を付与するのを忘れずに*

## 動作確認する

cron.dailyが実行されるのを待つか、直接mydns.cronを実行してみます。
登録に成功すれば、mydnsの管理画面にIPアドレスが設定されている事が確認できると思います。
または、nslookupコマンドでIPアドレスを確認する事もできます。

何かサーバーソフトウェアが起動していれば、スマホなどグローバルネットワーク経由でドメイン名を指定してアクセスできれば成功ですね！
プレミアムフライデーを求めるメソッドを作ろうと思ったらJava8の標準APIに既にあった

元ネタ
[プレミアムフライデーを求めるメソッドを作った - Qiita](http://qiita.com/neko_the_shadow/items/4ebf94a8a6d9282e7207)
[プレミアムフライデーを求めるメソッドを作った（Java8版） - Qiita](http://qiita.com/deaf_tadashi/items/963a62072338f09f12a5#_reference-80273bd61658e380252d)
[プレミアムフライデーを求めるメソッドをワンライナーで作った - Qiita](http://qiita.com/Takmiy/items/86242718633a0cb58add#_reference-2b73a4333c3a9b80deee)

Java 8 なら `TemporalAdjuster` 作った方が Date and Time API 使ってる感出ると思って作ろうとしたら既にあった。

```java
package premium.friday;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String[] args) {
        int[] years = {2017, 2018, 2019};
        for (int year : years) {
            for (int month = 1; month < 13; month++) {
                if (year == 2017 && month == 1) {
                    continue;
                }
                YearMonth yearMonth = YearMonth.of(year, month);
                LocalDate premiumFriday = yearMonth.atDay(1).with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY));
                System.out.println(premiumFriday.format(DateTimeFormatter.ofPattern("yyyy/MM/dd(E)")));
            }
        }
    }
}
```

`TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)`
そのままずばり月の最終金曜日が取れる。

```text:実行結果
2017/02/24(金)
2017/03/31(金)
2017/04/28(金)
2017/05/26(金)
2017/06/30(金)
2017/07/28(金)
2017/08/25(金)
2017/09/29(金)
2017/10/27(金)
2017/11/24(金)
2017/12/29(金)
2018/01/26(金)
2018/02/23(金)
2018/03/30(金)
2018/04/27(金)
2018/05/25(金)
2018/06/29(金)
2018/07/27(金)
2018/08/31(金)
2018/09/28(金)
2018/10/26(金)
2018/11/30(金)
2018/12/28(金)
2019/01/25(金)
2019/02/22(金)
2019/03/29(金)
2019/04/26(金)
2019/05/31(金)
2019/06/28(金)
2019/07/26(金)
2019/08/30(金)
2019/09/27(金)
2019/10/25(金)
2019/11/29(金)
2019/12/27(金)
```
コールバック :バリデーション時、保存時に自動的に特定の処理を実行

##メソッドとしてオーバーライドする
```ruby:app/models/user.rb
class User < ActiveRecord::Base
#メソッドとしてbefore_createコールバックを指定する
def before_create
self.encrypted_password = encrypt(self.password)
end
private
def encrypt(password)
...
end
end

```

##シンボルで指定する
```ruby:app/models/user.rb
class User < ActiveRecord::Base
before_create :encrypt_password
private
def encrypt_passwordself.encrypted_password = encrypt(self.password)
end
def encrypt(password)
...
end
end
```

##文字列で指定する

```ruby:app/models/user.rb
class User < ActiveRecord::Base
before_create "self.encrypted_password = encrpt(self.password)"
private
def encrypt(password)
...
end
end
```

##ブロックで指定する

```ruby:app/models/user.rb
class User < ActiveRecord::Base
before_create do |record|
record.encrypted_password = encrypt(record.password)
end
private
def encrypt(password)
...
end
end
```

##コールバック用オブジェクトで指定する

```ruby:app/models/user.rb
class User < ActiveRecord::Base
#before_createコールバックとして、コールバック用オブジェクトである
#PasswordEncryptorのインスタンスを指定する
before_create PasswordEncryptor.new("password")
end
class PasswordEncryptordef initialize(attr)
@attr_for_callback = attr
end
#before_createコールバック時に呼び出される
#引数には対象となっているモデルオブジェクトが渡される
def before_create(record)
record.encrypted_password =
encrypt(record.send(@attr_for_callback))
end
private
df encrypt(password)
...
end
end
```
##バリデーション時、保存時に自動的に特定の処理を実行　コールバック

###モデルオブジェクト create コールバック
```ruby:
save
valid?
before_validation
validate
after_validation
before_save
before_create
create
after_create
after_save


```
###モデルオブジェクト update コールバック

```ruby:
save
valid?
before_validation
validate
after_validation
before_save
before_update
update
after_update
after_save


```
RemoteTestKitのAndroid端末で開いているページをPCでデバッグする

タイトルが無駄に長い。最初だからと言い訳しながらメモ的に書く。

##したいこと
RemoteTestKitでレンタルしたAndroid端末のChromeで見ているページをPCのChromeでデバッグしたい

##事前準備
PCでadbコマンドを使えるようにしておく必要がある。AndroidStudioとか入れてればだいたい入ってる。

もし面倒であれば以下のURLからadbが使えるようになる拡張機能をChromeにいれるのもありだと思う
https://chrome.google.com/webstore/detail/adb/dpngiggdglpdnjdoaefidgiigpemgage

##手順
1. RemoteTestKitでAndroid端末をレンタルする
2. レンタルした端末のChrome for Androidでデバッグしたいページを開く
3. Chrome for PCで `chrome://inspect/#devices` にアクセスして、「Inspect with Chrome Developer Tools」を開く
4. レンタルした端末の右にあるボタンの中から「ADT/DDMS/adb有効化」というボタンを押す（下画像の「ADB」って文字が書いてあるボタン）
  
<img width="298" alt="スクリーンショット 2017-02-28 21.15.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/124854/6671bb15-ba1e-b9a3-2fb6-49f0ec69dc11.png">
5. Android端末のChromeで開いているタブの一覧がChrome for PCの「Inspect with Chrome Developer Tools」上に表示されるので、デバッグしたいタブを選び`inspect`を押す
![スクリーンショット 2017-02-28 21.21.48.png](https://qiita-image-store.s3.amazonaws.com/0/124854/bfe4bab6-41f7-dda4-4d71-6b6a6eec5113.png)


##注意点
レンタルしたAndroid端末に入ってるChrome for Androidが古いとできないことがある。
どれくらいバージョンが新しければInspectできるのかは調べてない。

##まとめ
端末検証に使っていくとべんり。

##参考文献
Android の Chrome で開発者ツールを使う方法
http://qiita.com/hojishi/items/12b726f8b02ef3d713e4
Android SDKをインストールして、ADBコマンドが使えるようにする方法
http://butsuyoku-gadget.com/android_sdk_install/
SDK不要Android端末のリモートデバッグChrome拡張機能「ADB」
http://iti.hatenablog.jp/entry/2013/11/05/182133
Macのbash(ターミナル)を鮮やかにする

家ではMacBook(Sierra)を使っている。MacはUbuntuと違ってbash(ターミナル)の表示がデフォルト味気ない。そこで、見やすくなるようにターミナルの設定を少し変更した。その際メモを残しておく。背景色は環境設定で初期設定の白から黒へ変更している。

##$前に表示される情報の変更
現在の"$"前の表示形式は以下で確認できる。

```bash
$ echo $PS1
```

```text:実行結果
\h:\W \u\$
```

これは、"ホスト名:現在のディレクトリ ユーザ名$"を意味する。
実際の表示は以下のようになっている。
![bash_b.png](https://qiita-image-store.s3.amazonaws.com/0/165994/904b32e9-7736-b2d7-1bd0-143c5c0a379d.png)


これを、"ユーザ名@ホスト名:現在のディレクトリ(フルパス)$"と自分好みの形式へ変更する。ついでに色も付ける。

ホームディレクトリに".bashrc"がなかったので新規に作成した。ちなみにバックスラッシュ(\\)は「optionキー + ¥キー」で入力できる。

```bash
$ emacs ~/.bashrc  
```

```text:.bashrc
if [ $UID -eq 0 ]; then
    PS1="\[\033[31m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
else
    PS1="\[\033[36m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
fi
```

root権限の時は注意を促す意味で赤色に、それ以外はシアンにしている。末尾の"\\$"はroot権限時は"#"と表示される。反映は以下のコマンドで。

```bash
$ source ~/.bashrc
```

結果、以下のように変わった。
![bash_a_user.png](https://qiita-image-store.s3.amazonaws.com/0/165994/2a10a63e-bca3-b73c-a791-9dd2b6545d89.png)
また

```bash
$ sudo bash
```

でroot権限になると以下のようになる。
![bash_a_root.png](https://qiita-image-store.s3.amazonaws.com/0/165994/399684ab-643f-77ea-9714-0d11283b5e34.png)

##lsコマンドのエイリアスの設定
デフォルトだとlsしたとき、どれがディレクトリなのかが分かりづらいので色を付ける。加えてディレクトリ名の後ろに"/"も表示させる。

"-F"オプジョンでディレクトリに"/"を表示し、"-G"オプションでディレクトリを色表示する。

```bash:.bashrc
alias ls='ls -FG'
alias ll='ls -alFG'
```

変更前
![ls_b.png](https://qiita-image-store.s3.amazonaws.com/0/165994/cab0d65a-c29d-8b67-e8e9-b45b156f9ced.png)

変更後
![ls_a.png](https://qiita-image-store.s3.amazonaws.com/0/165994/0fffa8e0-48b3-9a1e-6bf4-5037af5961ae.png)

##設定の反映を自動化する

```bash
$ source ~/.bashrc
```
を毎回実行するのは面倒なので自動化する。

```bash
$ emacs ~/.bash_profile
```

```text:.bash_profile
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
```

ホームディレクトリに".bash_profile"もなかったため新規に作成した。


これで作業効率が幾分upする、気がする。
[Google Analytics][iOS]行動フローで特定のスクリーンの遷移元の割合を調べる方法❗

GoogleAnalyticsの行動 - 行動フローで特定のスクリーンへの遷移元の割合を調べる方法をメモ

1. 行動 - 行動フローをクリック。<br>
<img width="180" alt="スクリーンショット 2017-02-28 12.48.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/592a99cb-b1d1-b122-afa6-1540e754c434.png">
2. 行動フローの中から目的のスクリーンをクリックする
3. 表示されるメニューの「ここを深く見る」をクリックする

##フローの中に目的のスクリーンがない場合
目的のスクリーンをフローに表示させる為にセグメントを設定する。

1. 「セグメントを追加」をクリック
2. 「新しいセグメント」（赤いボタン）をクリック
3. 詳細の「条件」をクリック
4. 条件を指定。フィルタは行動の「スクリーン名」。<br>
<img width="700" alt="スクリーンショット 2017-02-28 12.52.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/ad25da27-ea81-9a0c-fd95-3bb6d905a591.png">
5. セグメント名を設定して保存する
6. 行動フロー画面でセグメントを追加をクリックする
7. セグメントの一覧画面で先程保存したセグメントを選択して、「適用」ボタンをクリックする
8. 追加したセグメントをクリックして選択状態にする。
[Nginx] Nginx + ngx_mruby で BASIC 認証の On/Off を即座に切り替える

Nginx でメンテナンスページの On/Off をファイルの有無によって切り替える方法としては、以下の URL で紹介されているような方法などがあります。
[Nginxでメンテナンスページに編集なしで即時切り替える方法](http://qiita.com/kotaroito/items/8b7d4b8ad6935edcdba8)

ただ、上記の方法だと IP 制限でしか制限できないため確認者の IP アドレスが制限できない場合にちと困ります。
IP 制限の所を BASIC 認証に置き換えたくて、if の中に ```if ($maintenance = true) { auth_basic ... }``` というように ```auth_basic``` ディレクティブを書くと、無情にも ```nginx: [emerg] "auth_basic" directive is not allowed here``` とかって怒られてしまいます。

そんな時のために僕らには ngx_mruby があるのですよ。

以下のように ```satisfy any``` と組み合わせることで ```/etc/nginx/.htpasswd``` ってファイルがある時は、BASIC 認証を有効にし、ファイルが無い時は BASIC 認証を無効にすることが可能です。

```text
    satisfy any;
    mruby_access_handler_code '
        if ( !File.exist?("/etc/nginx/.htpasswd") ) then
            Nginx.return Nginx::OK
        else
            Nginx.return Nginx::HTTP_FORBIDDEN
        end';
    auth_basic "basic authentication";
    auth_basic_user_file /etc/nginx/.htpasswd;
```

もちろん ```mruby_access_handlert_code``` ディレクティブの中で File.exist で存在確認するファイルを ```.htpasswd``` ではなく、```/var/tmp/do_maintenace``` とかのファイルにしてもいいでしょう。


[PR]
AMIMOTO だと、簡単に ngx_mruby モジュールを追加できますよ。
[AMIMOTO AMI の nginx がダイナミックモジュール版 ngx_mruby に対応しました | 超高速 WordPress AMI AMIMOTO](https://ja.amimoto-ami.com/2016/06/08/amimoto-ami-supported-ngx_mruby/)
PHPer が acmesmith を使ってサーバー証明書を取得する際にハマったこと

Let's Encrypt でサーバー証明書を取得するために、
https://github.com/sorah/acmesmith　を使わせて頂きました。
ありがとうございました。

また、作業をするにあたって
https://blog.1q77.com/2016/02/acmesmith-1/
を参考にさせて頂きました。

ありがとうございました。

基本的に、上記ブログ及び README を見ると、
使用できました。

しかし、いくつかハマリポイントがあったので、
全体の流れを書きつつまとめていきます。

## 前提条件

https://github.com/sorah/acmesmith/blob/master/README.md#3rd-party-plugins
でも言及されていますが、AWS の Route53 を使用していることが前提になっています。

Google Cloud DNS 等をお使いの方は、適宜 サードパーティープラグインを使用する必要があります。

今回は、Route53を使う想定で書いていきます。

使用した環境

```
CentOS7のdockerコンテナ上で作業を行いました。
/etc/hoge というディレクトリを HOST OS上で作成し、 docker にマウントしました。
これにより、生成した証明書はHOST OS から参照できます。

バージョン情報は、それぞれ下記の通りです。
rbenv 1.1.0-2-g4f8925a
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
Bundler version 1.14.5

また、サーバー証明書をS3 にあげることもできるらしいですが、
簡単のため、今回はサーバー証明書をローカルに置くことにしました。
```



なお、ruby環境を構築するにあたっては、
http://qiita.com/Fendo181/items/d14ebfb148223c8e5ecb
を参考にさせていただきました。

## やったこと
###1. Gemfile の生成
任意のディレクトリで、
`bundle init`
というコマンドを実行し、`Gemfile` というファイルを生成しました。

### 2. Gemfile の編集
できたGemfile の中は、

```
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
```
と書かれていました。

これに、
`gem 'acmesmith'` を追記し、

```
# frozen_string_literal: true
source "https://rubygems.org"
gem 'acmesmith'
# gem "rails"
```

としました。

その後、

```
bundle install --path vendor/bundle
```
を実行しました。


### 3. IAM の取得

Route53 にアクセスするために、 IAM の設定を行う必要があります。
今回は新しいユーザーを作成し、IAM の設定を行いました。
なお、権限は、 `AmazonRoute53FullAccess` が必要でした。

### 4. acmesmith.yml の作成

`acmesmith.yml`というファイルを作成する必要がありました。
その中に、

```
endpoint: https://acme-v01.api.letsencrypt.org/

storage:
  type: filesystem
  path: /etc/hoge # <- ファイルを置くパス

challenge_responders:
  - route53:
      aws_access_key:
        access_key_id: アクセスキー # <- 前述のIAM を作成した時にもらえるのaccess_key_idを置く
        secret_access_key: 秘密キー # <- 前述のIAM を作成した時にもらえるsecret_access_keyを置く
        session_token:      # 空のままにした
      hosted_zone_map:
        "ドメイン名": "AWS Route 53 の Hosted Zone ID" # ダブルクォーテーションをつけて書く

account_key_passphrase: # 空のままにした
certificate_key_passphrase: # 空のままにした
```
を記載しました。

この設定を間違えてて結構はまりました。。。

### 5. .pem ファイルの作成

```
bundle exec acmesmith register mailto:xxx@example.org
```
を実行すると、
`/etc/hoge ` に`account.pem`ファイルが作成されました。

ちなみに、ここでは`mailto` をつけるのを忘れてハマりました。。


### 6. 証明書を発行

ここまでの設定が全てうまくいっていたら、
`bundle exec acmesmith authorize ドメイン名`  というコマンドを打つことにより、ドメイン認証が行われます。
結果の画像を撮り忘れたので、
上述の https://blog.1q77.com/2016/02/acmesmith-1/ を見ていただけると良いと思います。


### 7. 証明書を保存

ここまですべてうまく行ったら、
`bundle exec acmesmith request 上と一緒のドメイン名` と打つことにより、
`/etc/hoge` に証明書が保存されます。

### 8. 以上

以上で完了です。
ruby を使ったことがない初心者でも、2時間ぐらいで(かかりすぎｗ)人の手を借りつつ証明書を取得できました！
この記事読めば、30分ぐらいでできるようになるはずです。

ちなみに、Let's Encrypt の証明書は90日で期限が切れるそうですが、
自動で更新する方法もあるようです。

僕はまだ設定していませんが、
調べてみるといいと思います。
cloud_sql_proxyをansibleで設定する

## 背景
GCE -> CloudSQLへの接続にcloud_sql_proxyを使って苦労したのでメモ。

https://cloud.google.com/sql/docs/mysql-connect-proxy?hl=ja

## サンプル

```
## mysqlの設定(必要ないならスキップ)
- name: add repo
  command: rpm -ih http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm creates=/etc/yum.repos.d/mysql-community.repo

- name: install mysql-devel
  yum: name=mysql-community-devel.x86_64 state=installed

## ここからcloud_sql_proxyの設定
- name: get cloud_sql_proxy file
  stat: path=cloud_sql_proxy
  register: proxy_file

- name: download cloud_sql_proxy
  when: proxy_file.stat.exists == false
  get_url:
    url: https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
    dest: ./

- name: mv gcs
  when: proxy_file.stat.exists == false
  command: mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy

- name: permission of gcs
  when: proxy_file.stat.exists == false
  file:
    path: cloud_sql_proxy
    owner: deployer
    group: deployer
    mode: 0775

- name: run gcs
  when: proxy_file.stat.exists == false
  shell: ./cloud_sql_proxy -instances={{ cloud_sql_connect }}=tcp:3306  >& /var/log/cloud_sql_proxy.log &
  args:
    chdir: /home/deployer
  async: 5
  poll: 0
```
## MEMO
### 変数
- `cloud_sql_connect`: cloud_sqlの接続情報(`project_id:asia-norteast-1:instance_name`みたいなやつ)
- `login_user`: sshログインユーザー

### はまったとこ
  - chdirにlogin_userのホームを指定しないと実行できなかった
    - `become: true` で実行してたのでrootのホームにいたっぽい
  - 起動スクリプトに `>& /log/output` がないとprocessは起動するけど、接続時にプロセス落ちる
iPhoneのsafariでcolorboxが動作しない場合

#iPhoneのsafariでcolorboxが動作しない場合
[こちら](http://www.jacklmoore.com/colorbox/)のjQueryプラグインでyoutubeをモーダル表示しようとしたところ、iPhone実機のsafariだと動作しませんでした。
##原因
私のiPhoneでコンテンツブロッカーを使用していたからでした。
広告を無視するやつです。
コンテンツブロッカーをoffにすると、動作しました。

##なぜ動作しなかったのか？
正直わかりません。。。
時間がないので、深く調べれていません。。。
webインスペクタで調べてみたところ、アラートは表示されていましたので、コンテンツブロッカーが広告だと認識したのは間違いないです。
ただ、どの部分を広告と認識したのかまではわかりませんでした。

##youtubeをモーダル表示するには？
youtubeAPIを使用してモーダルを自作したサイトがあったのですが、そのサイトではしっかり表示することができていました。そんなに難しくないので、自作がいいかもです。
Linuxでファイル名が壊れた時の修復方法メモ

文字コードが変わってしまったり、特殊文字がファイル名に含まれちゃっててまともにアクセスできなくなったときの対処法。inumオプションよく忘れるのでメモ。

``` ls -il ```
で、先頭にinode番号が表示されます。


``` find -inum inode番号 ```
で、ファイル名取得ができます。

\`\`(バッククオート)で囲めばコマンドの結果を使うことができるので、
```mv "`find -inum inode番号`" 変更するファイル名```
または
```mv $(find -inum inode番号) 変更するファイル名```　　(こっちのほうがいいかな？)
とすれば、どんなファイル名でも変更できます。
Github API  から team_id を取得するワンライナー(jq 利用)

たまに、organization に属しているチームの team_id を取得したいんだけど、いつも調べるのに手間がかかるから書いておきます。

[jq](https://stedolan.github.io/jq/) が必要です。

## コマンド

`GITHUB_TOKEN`： Githubのトークン
`ORG_NAME`： Organization名
`TEAM_NAME`: チーム名

をそれぞれを入れる必要あり。

```bash
curl -s -H "Authorization: token GITHUB_TOKEN" "https://api.github.com/orgs/ORG_NAME/teams?per_page=100" | jq '.[] | select(.slug == "TEAM_NAME") | .id'
```


上記で `team_id` だけ取れる。
crossorigin属性について

CDN上にホストされたエラーをwindow.onerrorで取得しようとした時に全てのエラーが `Script Error`になってしまうことが良くあります。

この問題は [Cross-origin Resource Sharring](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control)によるもので、対策自体は以下の記事のようにネットにたくさんあるのですがイマイチ何をするのか釈然としなかったので調査しました。

http://qiita.com/sue71/items/885caeedb02ae6dc48c4

## まず、解決法
いろんなところに書いてありますが一応自分も解決法を書いておきます。以下の2つをする必要があります。

* CDNにAccess-Control-Allow-Originの設定をする
* CDNに置いてあるアセットを読み込むscriptタグにcrossorigin属性を追加

crossorigin属性の追加は以下のような感じです
`<script type="text/javascript" src="https://cdn-host.com/application.js" crossorigin></script>`

これだけでちゃんとエラーの詳細を得られるようになります

## crossorigin属性
crossorigin属性とは、mozillaの[scriptタグ](https://developer.mozilla.org/ja/docs/Web/HTML/Element/script)のドキュメントによるとwindow.onerrorでエラー詳細を取得するためのものと書いています。つまりwindow.onerror専用のタグです。(まだ標準化前らしいです)

デフォルトの値は `anonymous`で、他に `use-credentials`も設定できます。

### anonymousとuse-credentialsの違い
anonymousとuse-credentialsの説明を[こちら](https://developer.mozilla.org/ja/docs/Web/HTML/CORS_settings_attributes)から引用すると

anonymous: 	この要素からの CORS リクエストに認証情報フラグをセットしない。
use-credentials: この要素からの CORS リクエストに認証情報フラグをセットする。リクエストには認証情報が提供される。

とのことです。よくわかりません。ですので実際に `crossorigin`属性に2つの値をセットして試してみたところ、**use-credentialsを指定した時はリクエストヘッダーにセッション情報のCookieが付き、anonymousの場合は付かない**という違いがありました。

### anonymousで安全なのか？
そもそも `crossorigin`属性の前提がAccess-Control-Allow-Originの設定がされていることなのでこのヘッダーが適切に設定されていればセキュリティリスクにはなりえないはずです。よって、そうする必要がない限り `Access-Control-Allow-Origin: *`のようにはすべきではないということです。

anonymousという名前もちょっと微妙な気はします。

## 参考
imgタグのcrossoriginの説明が分かりやすいように思いました。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/img#attr-crossorigin

https://blog.sentry.io/2016/05/17/what-is-script-error
nfcpy で Apple Pay のエクスプレスカードを扱う

nfcpy を利用して Apple Pay の エクスプレスカード設定された Suica （以後エクスプレスカード）を扱おうとしたところ思いっきり躓いたので、ポイントを記事にしておきます。
導入方法や実際のデータの読み書きについてはわかりやすいまとめがあると思いますのでここでは記載しません。（参考リンクなどを参照してください）


# 環境
- Raspberry Pi 3 Model B (Rasbian jessie 8.0)
- Python 2.7.9
- nfcpy 0.11.0
- PaSoRi RC-S380


# connect を使用した際の挙動
nfcpy を使用してデータの読み書きを行う際には nfc.ContactlessFrontend の connect メソッドを使用すると簡単に実装出来るようになっているのですが、これはエクスプレスカードでは正常に動作しません。

たとえば以下のようなコードの場合。

```python:nfc_connect.py
import nfc


def on_startup(targets):
  for target in targets:
    # 0003(Suica)
    target.sensf_req = bytearray.fromhex("0000030000")
  return targets


def on_connect(tag):
  print tag


def main():
  clf = nfc.ContactlessFrontend('usb')
  # 212F(FeliCa)
  clf.connect(rdwr={'targets': ['212F'], 'on-startup': on_startup, 'on-connect': on_connect})
  clf.close()


if __name__ == '__main__':
  main()
```

スリープ状態の iPhone をリーダーにかざすと、iPhone 側の画面では Suica と読み取り完了のチェックマークが表示されますが、プログラム側ではほぼ常に何も起きません。（ごくたまに on_connect が呼び出されることがあります）
connect で on-discover （対象が見つかった時に呼び出される）を指定しても同様となります。
この事象はエクスプレスカードの場合でのみ発生するようで、Wallet アプリを起動してカード指定してかざした場合には発生しません。


# sense を使用する
nfcpy では connect 以外にも検出に使用するメソッドが提供されています。
これらを使用することでエクスプレスカードでも正常に検出ができます。


```python:nfc_sense.py
import binascii
import nfc


def main():
  clf = nfc.ContactlessFrontend('usb')
  # 212F(FeliCa)
  target_req = nfc.clf.RemoteTarget("212F")
  # 0003(Suica)
  target_req.sensf_req = bytearray.fromhex("0000030000")
  while True:
    target_res = clf.sense(target_req, iterations=10, interval=0.01)
    if target_res != None:
      print binascii.hexlify(target_res.sensf_res)
      tag = nfc.tag.tt3.Type3Tag(clf, target_res)
      tag.sys = 3
      print tag
      break
  clf.close()


if __name__ == '__main__':
    main()

```


sense は指定された対象を interval 間隔で iterations 回検索し、結果を返します。
見つかった場合は対象の RemoteTarget、見つからなかった場合は None を返しますので、None であれば再度検索をします。
RemoteTarget オブジェクトの sensf_res には見つかった対象の IDM/PMM/SYS がまとめて格納されていますので、これらのみが必要な場合はこれ以降は必要ありません。

ここからデータの読み書きをできるようにするには Tag オブジェクトが必要です。
この Tag オブジェクトは nfc.tag.tt3.Type3Tag(clf, target) として定義されているので clf と RemoteTarget から生成してあげればよい事になります。
ただしここで生成した Tag には SYS の情報が入っていないので、改めて Suica の 0x0003 を代入してあげます。

これで connect を使用した場合に on-connect の引数として渡される Tag と同等の処理が可能になります。


## 参考リンク
<dl>
  <dt>・nfcpy で複数の System Code を持つ NFC タグを扱う方法</dt>
  <dd><a href="http://uchan.hateblo.jp/entry/2016/11/18/190237">http://uchan.hateblo.jp/entry/2016/11/18/190237</a></dd>
  <dt>・FeliCaのPollingによるApplePayのWalletの動作</dt>
  <dd><a href="http://qiita.com/bellx2/items/fb081c4bdd822c8d36fd">http://qiita.com/bellx2/items/fb081c4bdd822c8d36fd</a></dd>
</dl>
Rancherもくもく勉強会 #3

Rancher もくもく勉強会 #3 - connpass
https://rancherjp.connpass.com/event/49891/


開催ログです。

会場：Sophos セミナールーム
東京都 港区 六本木1-6-1(泉ガーデンタワー 7F Sophosセミナールーム)

開催枠は、2種類用意しました。

・講習参加枠
・もくもく参加枠

【参加の様子】
![FB_IMG_1488278342920.jpg](https://qiita-image-store.s3.amazonaws.com/0/15176/ce0b153a-0408-a926-c488-8c03789ba285.jpeg)

![DSC_0444.JPG](https://qiita-image-store.s3.amazonaws.com/0/15176/fa937273-3fe4-bfc5-c9c2-fcde6adc69af.jpeg)

@cyberblack28 さんが講師で
Docker pull commit push Dockerfile WordPress環境をつくる - Qiita
http://qiita.com/cyberblack28/items/e3fb956f584094341c62
を参加者の皆さんには実施いただきました。

【FAQ】
[Question]
・Kubernetes,Mesos,Swarmの位置づけがよく分かりません。
[Answer]
Dockerを単体ホストで動かす分には不要ですが、複数のDockerホストが動くと

【ソフォス様】
ソフォス株式会社 小野様

![DSC_0446.JPG](https://qiita-image-store.s3.amazonaws.com/0/15176/bd8eabb1-6d80-2c07-634d-38cbe15128ce.jpeg)

・Sophos AWSのSophos Centralのご紹介
・Sophos UTMのご紹介
プレミアムフライデーを求めるメソッドをワンライナーで作った

可読性は最悪
2017年のとき1月が入ってしまうのは勘弁してください。

```java

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.YearMonth;
import java.util.Arrays;
import java.util.stream.IntStream;

public class PremiumFriday {
    public static void main(String[] args) {
        String year = "2017";
        Arrays.stream(Month.values()).map(m ->IntStream.range(1,YearMonth.of(Integer.parseInt(year), m).atEndOfMonth().lengthOfMonth()+1).mapToObj(d -> LocalDate.of(Integer.parseInt(year), m, d)).filter(d -> DayOfWeek.FRIDAY.equals(d.getDayOfWeek())).max(LocalDate::compareTo)).forEach(o -> System.out.println(o.get()));
    }
}
```

元ネタ
[プレミアムフライデーを求めるメソッドを作った](http://qiita.com/neko_the_shadow/items/4ebf94a8a6d9282e7207)
[プレミアムフライデーを求めるメソッドを作った（Java8版）](http://qiita.com/deaf_tadashi/items/963a62072338f09f12a5#_reference-80273bd61658e380252d)


※※※
yearをStringにしたのは「argsから取ろうかなー？でも渡すのめんどくさいなー」とか考えてたなごりでした。あとJavaで入力値ってなんとなくStringな気がして。Intかjava.time.Yearが自然ですね。
jlising 使い方


##jlistingを使うための準備

1.jlisiting.styファイルをダウンロードしてくる．
2.ダウンロードしたstyファイルをtexファイルと同じディレクトリに置く．

3.texファイルに以下を追加

```*.tex
\usepackage{listings,jlisting} % ソースコード埋め込み
% jlisting
\renewcommand{\lstlistingname}{リスト}
\lstset{language=c,
  basicstyle=\ttfamily\scriptsize,
  commentstyle=\textit,
  classoffset=1,
  keywordstyle=\bfseries,
  frame=tRBl,
  framesep=5pt,
  showstringspaces=false,
  numbers=left,
  stepnumber=1,
  numberstyle=\tiny,
  tabsize=2
}
```

language等の設定は，適宜変更する．


##使い方


以下のように記述する．

```*.tex
\begin{figure}[t]
    \begin{lstlisting}[caption=ハローワ―るど,label=ハロー]
    #include <stdio.h>
    int main(){
    	printf("hello world\n");
    }
    \end{lstlisting}
\end{figure}

```

２段組ではなく１段組にしたいときは
以下のように記述する

```*.tex
\begin{figure*}[t]
    \begin{lstlisting}[caption=ハローワ―るど,label=ハロー]
    #include <stdio.h>
    int main(){
    	printf("hello world\n");
    }
    \end{lstlisting}
\end{figure*}

```

リストを参照したいときは，
リスト\ref{ハロー}とする．
【Unity拡張】ヒエラルキー上で使用されている全スクリプトを表示するEditorWindowを作ってみた

# はじめに
「ヒエラルキー上で何のスクリプトが使われているかを確認したいなぁ」と思ったので、スクリプトを一覧表示するエディター拡張を作ってみました。

# 環境
Unity 5.5.0f3 
Windows 10

# 作ったものについて
ヒエラルキー上でオブジェクトにアタッチされている全てのスクリプトの一覧を表示するウィンドウを作ってみました。
![hierarchy_script.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/ba9bab33-d938-aadb-b28b-102855282e87.gif)

# ソースコード
以下のスクリプトをプロジェクト内のEditorフォルダ以下へ入れるとEditorWindowが使えるようになります。

```HierarchyScriptViewerWindow.cs
namespace HierarchyScriptViewer
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEditor;
    using UnityEngine;

    /// <summary>
    /// シーン内でアタッチされているすべてのスクリプトを表示するEditorWindow
    /// </summary>
    public class HierarchyScriptViewerWindow : EditorWindow
    {
        Vector2 scrollPosition = Vector2.zero;
        Type[] componentTypes = new Type[0];
        MonoScript[] scripts = new MonoScript[0];

        [MenuItem("Tools/Hierarchy Script Viewer")]
        static void Open()
        {
            GetWindow<HierarchyScriptViewerWindow>();
        }

        void OnGUI()
        {
            GUILayout.Label("ヒエラルキー上で使用されている全スクリプトを表示します");
            GUILayout.Space(2f);

            // ボタン表示
            if (GUILayout.Button("スクリプト一覧 表示"))
            {
                this.scripts = this.GetScripts().ToArray();
            }

            // スクリプト一覧表示
            this.scrollPosition = EditorGUILayout.BeginScrollView(this.scrollPosition);
            foreach (var script in this.scripts)
            {
                if (script == null) { continue; } // nullチェック
                EditorGUILayout.ObjectField(script, typeof(MonoScript), false);
            }
            EditorGUILayout.EndScrollView();
        }

        /// <summary>
        /// シーン内でアタッチされているすべての自作スクリプトを取得する
        /// </summary>
        private IEnumerable<MonoScript> GetScripts()
        {
            var gameObjects = (GameObject[])UnityEngine.Object.FindObjectsOfType(typeof(GameObject)); // シーン内の全てのGameObject
            var monoScripts = Resources.FindObjectsOfTypeAll<MonoScript>(); // プロジェクト内の全てのスクリプト

            foreach (var monoScript in monoScripts)
            {
                var classType = monoScript.GetClass();
                if (classType == null) { continue; }
                if (classType.Module.Name != "Assembly-CSharp.dll") { continue; } // 自作クラスかどうか
                if (!classType.IsSubclassOf(typeof(MonoBehaviour))) { continue; } // MonoBehaviour継承クラスかどうか
                if (gameObjects.Any(go => go.GetComponent(classType) != null)) // アタッチされているGameObjectが存在するか
                {
                    yield return monoScript;
                }
            }
        }
    }
}
```

# 使う
メニュー上部から"Tools/Hierarchy Script Viewer"を選択するとウィンドウが開きます 
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/ba22b2d9-57a4-b1c5-0788-457a8bfcfd84.png)


ボタンをクリックするとヒエラルキー上で使用されているスクリプトの一覧が表示されます(完)
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/3453460d-3054-a72e-08e5-ad9ede7a522a.png)
soxコマンド覚書

#概要
* soxで
    * ファイル情報取得
    * ファイル形式変換

#環境
* linux 14.04 LST
* [sox](http://sox.sourceforge.net/)

# 音声ファイルの長さなどの情報を得る方法
* バージョン14.10の場合   
```
$ sox sample.wav -n stat
```

# wavファイルをraw形式にする
* 出力ファイルの拡張子がrawの場合、rawデータとして処理される。    
```
$ sox input.wav output.raw
```
* ファイルの拡張子がraw以外の場合はコマンド`-t`を利用  
```
$ sox input.wav -t raw output.xxx
```
* [エンディアン](https://www.uquest.co.jp/embedded/learning/lecture05.html)形式を変換する場合(リトルエンディアン)　　
```sox input.wav -t raw -L output.xxx
``` 

    * その他コマンドはこんなかんじ。
        * -L, --endian little
        * -B, --endian big
        * -x, --endian swap

# ビット変換
* 16ビットへと変換する場合。    
```$sox input.wav -b 16 output.wav
```

# 参考文献
* [音声ファイルの長さなどの情報を得る方法](音声ファイルの長さなどの情報を得る方法)
* [Raw形式をWav形式にする・Wav形式をRaw形式にする](http://www.xucker.jpn.org/pc/sox_raw.html)
* [SoXのインストール（CentOS6.6）](http://anoyamanomukouni.blog130.fc2.com/blog-entry-303.html)
* [Sox(Description)](http://sox.sourceforge.net/sox.html)
Drupal7 修正箇所を探し出せ!

## 初めに
この記事は、第2回 Drupal 勉強会@DC のLTとして発表した内容です。
https://dgcircus.connpass.com/event/51182/
定期開催です。興味があったらぜひ！

----
## 始めてjoinしたプロジェクト
-----
## でも、開発担当が自分しかいない!
---
## 簡単だから！と明日までに修正してほしいと言われたら
---
## まずはポイントを押さえて、修正箇所を探してみよう！
---
## まずパパッと切り分け
* ページを通してだいたい共通表示
    * おそらくブロック
* サイト特定ページ
    * URLベースで探す
* ノード・タクソノミーページ
    * 実装方法がいっぱいあってやっかい

----

## 参考例
あるHP
http://www.dgcircus.com/drupal/cms

---

##　サイト特定ページ
* URLベースで探す
    *  Page manager / Panles
    *  Views
    *  モジュールのhook_menu
    *  URL エイリアスも見てみる
    *  必殺DBを覗く (menu_routerテーブル)

---

##　ノード・タクソノミーページ
* Page manager / Panles
* View mode(表示設定)
* themeのテンプレート
* モジュールのhook_form_alter, hook_form_FORM_ID_alter
* hook_preprocess_HOOK, template_preprocess
* もしかしたらコンテンツの本文ってことも

---

## どうしても見つからない・・・
* 改めてブロックを探す
* html要素(id,クラス)などで、ソースGrep
    * id=edit-field-full-name → field_full_name
* jsで動的表示 → Theme, module内Grep
* Configurationページを眺めて、怪しい設定がないか探ってみる
* いざとなったらDBのダンプをGrep
    * ブロック、PHP filterが多用されているサイトは有効

----
## ありがとうございました！
Firebase Cloud Messaging (FCM)でのSender IDとAPI Keyの確認方法

Google I/O 2016で、新しくAndroid用のプッシュ通知サービスとしてFCM(Firebase Cloud Messaging)が発表されました。

もちろん現在でもGCM(Google Cloud Messaging)は使用可能ですが、Google Play Developer Consoleには今後実装する場合にはGCMではなくFCMをしようするように案内がされています。

AWS MobileHubでAndroidアプリ向けにPush通知の設定を行う際に、FCMのSender IDとAPI Keyの場所が分からなかったので、備忘録的に残します。

### まずはFireBaseのConsoleにアクセス

[Firebase Console](https://console.firebase.google.com/) を開いてください。

### 対象のプロジェクトを開く

Firebase Consoleで対象のプロジェクトをクリックし開いてください。

対象プロジェクトが未作成の場合は、「新規プロジェクトを作成」をクリックして、プロジェクトを作成するところから始めてください。

### プロジェクトの設定画面を開く

プロジェクト画面の左側メニューの歯車アイコンをクリックして、設定画面を開いてください。

### クラウドメッセージングの設定を確認

「クラウドメッセージング」タブをクリックしてください。

サーバーキー、送信者 IDをメモしてください。

### AWS MobileHubのPush Notificationsの設定

AWS MobileHubの管理画面のPush Notificationsの「＋」ボタンをクリックし、「Enable Push」をクリックしてください。

Androidの「＋」ボタンをクリックし、
**API Keyにサーバーキー**を、**Sender IDに送信者ID**を
セットして、「Save Changes」をクリックしてください。

　
 　
以上で設定完了です。
Dockerのubuntuによるpython3.6のためのDockerfile

# はじめに
[Python3.6 から追加された文法機能](http://qiita.com/shirakiya/items/2767b30fd4f9c05d930b)の記事を見かけ、
使ってみようと思った時、とりあえずちょろっと使うだけだからDocker(Ubuntu)で試そうとしました。

しかし、`apt-get`でpython3.6を入れるには、
- Ubuntu 14.04/16.04: repositoryを追加しなければなない。
- Ubuntu 16.10: repositoryを追加しなくても入れられるが、versionが`3.6.0-b2-1`
- pipは別途入れなければならない
など微妙に痒いところがあったので、ソースから`make`してinstallする最低限のDockerfileをメモとして書いておきたいと思います。

※追記(2017/03/10): マルチバイト文字を使うとエラーを吐いたので`ENV PYTHONIOENCODING`を追加しました。

# Dockerfile
```
FROM ubuntu:16.10
MAINTAINER kekedadamama

RUN apt-get update -y && apt-get install -yq wget build-essential gcc zlib1g-dev

WORKDIR /root/
RUN wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz \
        && tar zxf Python-3.6.0.tgz \
        && cd Python-3.6.0 \
        && ./configure \
        && make altinstall
ENV PYTHONIOENCODING "utf-8"

WORKDIR /
```

ここでは`ubuntu:16.10`としていますが、`ubuntu:16.04`でも普通に使えることは確認できました。

※追記(2017/03/10): `ENV PYTHONIOENCODING`を設定していない状態でマルチバイト文字を使用すると、以下のようなエラーを吐きます。

```
>>>
  File "<stdin>", line 0

    ^
SyntaxError: 'ascii' codec can't decode byte 0xe3 in position 7: ordinal not in range(128)
```

# 使ってみる
上記Dockerfileを実行したコンテナでpythonの`3.6.0`が入っていることを確認しておきます。

```
root@7787ab554c9f:/# python3.6 -V
Python 3.6.0
```

```
root@7787ab554c9f:/# python3.6
Python 3.6.0 (default, Feb 28 2017, 08:21:29)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> greet : str = "Hello"
>>> f"{greet}, guest"
'Hello, guest'
```

3.6で導入された`書式化済み文字列リテラル`や`変数のタイプヒンティングシンタックス`も問題なく使えていそうです。

もちろんpipも一緒に入ります。

# おわりに
`apt-get`でpython3.6が普通にinstallできるようになるまでの命なこのDockerfileですが、
初めてソースから入れたにしてはすんなり入ってくれていい子ですね。