OmniAICreator/Qiita-1.07M huggingface dataset:
Atom:キーバインドの変更


`git-control`, `advanced-open-file`, `symbols-tree-view` パッケージを入れたところ `ctrl-alt-o` のキーバインドが重複してしまったので、これを何とかしたい。

まず、現在のキーバインドを確認するには `File > Settings` から `Keybindings` を選びます。
`ctrl-alt-o` で検索をかけると、キーバインドの一覧が表示されます。

![2016-06-17-atom-keybindings.png](https://qiita-image-store.s3.amazonaws.com/0/133092/2ecce004-6a11-fed1-ecc2-9fbff7175fe0.png)

また、Keybinding Resolver を使うと詳しい情報がわかります。`ctrl-.` を押して Keybinding Resolver を有効にし `ctrl-alt-o` を押すと最終的にどのコマンドが実行されたかがわかります。

![2016-06-17-atom-keybindings-resolver.png](https://qiita-image-store.s3.amazonaws.com/0/133092/10f25fe2-a4ec-101e-ef30-dd2d29287211.png)

どうやら下から順番に上書きされているようです。この場合ですと `advanced-open-file:toggle` が実行されます。
`ctrl-alt-o` では `git-control:toggle` を実行してほしいのでカスタマイズします。
カスタマイズは `keymap.cson` ファイルを編集します。このファイルは keybindings にある `your keymap file` をクリックすると開くことができます。
記述の仕方は keymap.cson ファイルにあるコメントで記載されています。

実行するコマンドを変更する場合は、現在実行されているコマンドのセレクタに対して設定します。
Keybindings Resolver で実行されているコマンドを確認し、Keybindings の一覧から対象のコマンドを見つけたら、`Keystroke` の左側にあるアイコンを押すとクリップボードにコピーされます。
それを keymap.cson ファイルの最後に貼りつけます。

	'.platform-win32 atom-workspace, .platform-linux atom-workspace':
	  'ctrl-alt-o': 'advanced-open-file:toggle'

そして、`advanced-open-file:toggle` を `git-control:toggle` に変更します。
Keybindings Resolver で正しく設定されていることを確認してみます。

![2016-06-17-atom-keybindings-resolved.png](https://qiita-image-store.s3.amazonaws.com/0/133092/66fa47fa-2c73-b025-e9c3-0b13affdd887.png)

keymap.cson によって変更されていることがわかります。

あとは `advanced-open-file:toggle` を `ctrl-o` に、`symbols-tree-view:toggle` を `ctrl-^` に変更します。

	'atom-workspace':
		'ctrl-o': 'advanced-open-file:toggle'
		'ctrl-^': 'symbols-tree-view:toggle'

Keybindings Resolver で押したキーのキーストロークがわかります。
Gmailに添付ファイルをつけて、メールを送信する


仕事の合間に、勉強がてらに、PythonでGmialからメール送信。

http://d.hatena.ne.jp/kenpy/20101123/1290499799
参考にしたのはこちら。というかほぼ写経です。

```Python
#!/Usr/bin/env python                                                                                  
# -*- coding: utf-8 -*-  

import os.path
import datetime
import smtplib

from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

def create_message(from_addr, to_addr, subject, body, mine, attach_file):
	"""
	Mailのメッセージを構築する
	"""
	msg = MIMEMultipart()
	msg["Subject"] = subject
	msg["From"] = from_addr
	msg["To"] = to_addr

	
	body = MIMEText(body)
	msg.attach(body)
	
	#添付ファイルのMIMEタイプを指定する
	attachment = MIMEBase(mine['type'],mine['subtype'])
	
	file = open(attach_file['path'])
	attachment.set_payload(file.read())
	file.close()
	Encoders.encode_base64(attachment)
	msg.attach(attachment)
	attachment.add_header("Content-Dispositon","attachment",filename=attach_file['name'])
	
	return msg
	
def sendGmail(from_addr, to_addr, msg):
	"""
	mailを送信する
	"""
	smtp = smtplib.SMTP_SSL(host, port)
	smtp.ehlo()
	smtp.login(username, password)
	smtp.sendmail(from_addr, to_addr, msg.as_string())
	smtp.quit()
	
	
if __name__ == '__main__':
	
	#gmail用に追加
	host, port = 'smtp.gmail.com', XXX
	username, password = 'hogehoge@gmail.com', 'hogehoge'
	
#実際に使用されているアドレスだと困るので、コメントアウトしてます。
	
	from_addr = #"hogehoge@gmail.com”
	to_addr = #"hogehoge@gmail.com"
	subject = "ファイル添付"
	body = "test body"
	mine={'type':'text','subtype':'comma-separated-values'}
	
	attach_file={'name':'test.csv','path':'/tmp/test.csv'}
	msg = create_message(from_addr, to_addr, subject, body, mine, attach_file)
	sendGmail(from_addr, to_addr, msg)
```
Jekyll：アーカイブページを作る


GitHub Pages でアーカイブページを作成するコードです。

## 年月日

全記事から年月日を参照して、列挙します。
記事の列挙は次のようになります。

	{% for post in site.posts %}
	  {{ post.title }}
	{% endfor %}

記事の日付は `post.date` です。
年月ごとに列挙する場合は次のようになります。

	{% for post in site.posts %}
	  {% unless post.next %}
	    {% capture year %}{{ post.date | date: '%Y' }}{% endcapture %}
	    {% capture month %}{{ post.date | date: '%m' }}{% endcapture %}
	    <h2 id="{{year}}{{nmonth}}">{{ month }}/{{ year }}</h2>
	    <ul class="posts">
	      <li>
	        <span class="post-date">{{ post.date | date_to_string }} &raquo;</span>
	        <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
	      </li>
	  {% else %}
	    {% capture month %}{{ post.date | date: '%m' }}{% endcapture %}
	    {% capture nmonth %}{{ post.next.date | date: '%m' }}{% endcapture %}
	    {% capture year %}{{ post.date | date: '%Y' }}{% endcapture %}
	    {% if month != nmonth %}
	      </ul>
	      <h2 id="{{year}}{{nmonth}}">{{ month }}/{{ year }}</h2>
	      <ul class="posts">
	    {% else %}
	      {% capture nyear %}{{ post.next.date | date: '%Y' }}{% endcapture %}
	      {% if year != nyear %}
	        </ul>
	        <h2 id="{{year}}{{nmonth}}">{{ month }}/{{ year }}</h2>
	        <ul class="posts">
	      {% endif %}
	    {% endif %}
	    <li>
	      <span class="post-date">{{ post.date | date_to_string }} &raquo;</span>
	      <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
	    </li>
	  {% endunless %}
	{% endfor %}
	</ul>

`post.date` はそのまま出力すると `2016-06-18 00:00:00 +0900` となってしまいます。
`{{ post.date | date_to_string }}` とすると `18 Jun 2016` というように変換されます。
date_to_string 以外にも細かく指定するオプションがあります。ここでは詳しく解説しません。

`post.next` は次の記事ですが、最後の記事の場合 nil になります。そのため `unless` を使って処理を分岐しています。

`{% capture year %}` は `{% capture year %}` と `{% endcapture %}` で囲んだ内容を year に代入します。


## カテゴリ

カテゴリの列挙は次のようになります。

	{% for category in site.categories %}
	  {% capture name %}{{ category[0] }}{% endcapture %}
	  <h2>{{ name }} ({{ site.categories[name] | size }})</h2>
	  <ul class="posts">
	  {% for post in site.categories[name] %}
	    <li>
	      <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
	      <span class="post-date">{{ post.date | date_to_string }}</span>
	    </li>
	  {% endfor %}
	  </ul>
	{% endfor %}

例えば `hoge` というカテゴリ名の場合 `site.categories.hoge` で記事を列挙できます。
変数を使って参照する場合は `site.categories[variable]` というようになります。

`site.categories.hoge | size` を指定すると記事数を取得できます。

## タグ

カテゴリとやり方は同じです。タグの場合、`site.tags` になります。

	{% for tag in site.tags %}
	  {% capture name %}{{ tag[0] }}{% endcapture %}
	  <h2>{{ name }} ({{ site.tags[name] | size }})</h2>
	  <ul class="posts">
	  {% for post in site.tags[name] %}
	    <li>
	      <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
	      <span class="post-date">{{ post.date | date_to_string }}</span>
	    </li>
	  {% endfor %}
	  </ul>
	{% endfor %}

これで、カテゴリ一覧やタグ一覧などが作れます。あとは好きなようにレイアウトしてあげればいいです。
Railsでのマスターデータ用モデルの管理


外部キーをかけられるなどで、マスターデータをDBに置いておくことも多いですが、モデルとしてハンドリングする際には注意したいことがあります。

…何もしなければ、ふつうのActiveRecordメソッドで、マスターデータの**変更ができてしまいます**。

# 権限の不在
本来、アプリケーションから使うデータベースアカウントと、データベースの構築に使うアカウントは分けて、必要な権限だけを与えるべきものでしょうが、RailsやWordPressなど「データベースの構築まで自動で行うような環境」下では、それは理想論に近い扱いとなってしまいます[^1]。ということで、「DBレベルでマスター系の書き換えを抑止する」という手段は、いったん置いておくことにします。

# リードオンリーにはできる、けど
実は、ActiveRecord標準で、リードオンリーとする方法があります。

```rb
class Something < ActiveRecord::Base
  def readonly?
    true
  end
end
```

`readonly?`はレコード単位で設定できますが、常に`true`を返すようにしてしまえば、あとは書き込みのできないActiveRecordとなります。

これで一件落着と思いきや、もう1つ問題があって、このままだとRails内から初期データを入れられなくなってしまいます。

# 切り替え可能なreadonly
ということで、初期データのロード時にはreadonlyを外したくなります。そういう用途にぴったりなgemとして、[garysweaver/activerecord-be_readonly](https://github.com/garysweaver/activerecord-be_readonly)がありました。

まず、マスターにするレコード側では、宣言的なメソッドの`be_readonly`が用意してあって、これでモデルのリードオンリーがかかります。そして、初期データのロード時にはどうするのかというと、`BeReadonly.enabled = false`とすれば、それだけですべての`be_readonly`が無効となります。自分自身はseed_fuを使っていたので、`db/fixtures/00_initialize.rb`のように、ASCII順で先頭へ来るファイルを作っておいて、そこで`BeReadonly.enabled = false`とすることで、seed_fu中には`be_readonly`も支障しなくなります。

[^1]: Railsの場合、[環境変数で接続を切り替える](http://jldbasa.github.io/blog/2014/02/14/mysql-user-minimum-required-privileges-for-rails/)なんて手もあるようですが、あまり普及しているとは言いづらいです。
Bashのショートカットキー


|キー|意味(vi)|
|:---:|:--:|
|Ctrl + b|h|
|Ctrl + f|l|
|Esc + b|b|
|Esc + f|w|
|Ctrl + a|^|
|Ctrl + e|$|
|Ctrl + w|db|


[bashのキー操作一覧まとめ](http://d.hatena.ne.jp/rx7/20091012/p1)を参考にしました．
The application could not be started. Ensure that the application has been installed to the target device and has a launchable activity (MainLauncher = true).

VisualStudioでUSBデバッグを行い配置した直後に下記のメッセージが出た場合、
手動でアプリをアンインストールしましょう。

Android application is debugging.
The application could not be started. Ensure that the application has been installed to the target device and has a launchable activity (MainLauncher = true).

Additionally, check Build->Configuration Manager to ensure this project is set to Deploy for this configuration.

スマートフォンをシェアして使っている場合などに発生すると思います。
自分のVSでUSBデバッグしてインストールした場合は問題ないのですが、
別口でインストール済みの場合は、手動で消してから出ないとUSBデバッグできません。
ZYBO / Pmod | XADC > Pmod JAからの4chAD取込み > AD14 | AD7 | AD15 | AD6

```txt:動作環境
DIGILENT ZYBO
```

http://qiita.com/7of9/items/bb85bc78c3cb6c8e6811
にて実施したXADC取込み。

Pmod JAコネクタのN16とN15だけ使っていたが、それをvauxn14に設定していたのが不明だった。

DIGILENTから入手できる ZYBO_Master.xdcを見ると

```ZYBO_Master.xdc
##Pmod Header JA (XADC)
##IO_L21N_T3_DQS_AD14N_35
#set_property PACKAGE_PIN N16 [get_ports {ja_n[0]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_n[0]}]

##IO_L21P_T3_DQS_AD14P_35
#set_property PACKAGE_PIN N15 [get_ports {ja_p[0]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_p[0]}]

##IO_L22N_T3_AD7N_35
#set_property PACKAGE_PIN L15 [get_ports {ja_n[1]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_n[1]}]

##IO_L22P_T3_AD7P_35
#set_property PACKAGE_PIN L14 [get_ports {ja_p[1]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_p[1]}]

##IO_L24N_T3_AD15N_35
#set_property PACKAGE_PIN J16 [get_ports {ja_n[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_n[2]}]

##IO_L24P_T3_AD15P_35
#set_property PACKAGE_PIN K16 [get_ports {ja_p[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_p[2]}]

##IO_L20N_T3_AD6N_35
#set_property PACKAGE_PIN J14 [get_ports {ja_n[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_n[3]}]

##IO_L20P_T3_AD6P_35
#set_property PACKAGE_PIN K14 [get_ports {ja_p[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {ja_p[3]}]
```

上記を見ると、どうやら以下のものが使えるようだ

- N16 / N15 : AD14として
- L15 / L14 : AD7として
- J16 / K16 : AD15として
- J14 / K14 : AD6として

4chでAD取込みできそうだ。
Xamarin.Forms 用の地図ライブラリつくった

# Xamarin.Forms アプリでも地図を使いたいですよね？

----

# [Xamarin.Forms.Maps](https://developer.xamarin.com/guides/xamarin-forms/user-interface/map/) があります

![](https://developer.xamarin.com/guides/xamarin-forms/user-interface/map/Images/maps-zoom.png)

----

# BUT

----

# 機能が少ない（というか無い）

|機能 |X.F.Map|
|---|---|
|地図の表示  |○  |
|マーカーの表示  |○  |
|線の表示 |×  |
|ポリゴンの表示 |×  |
|円の表示 |×  |

----

# なので作りました

----

# Xamarin.Forms.GoogleMaps

----

# 機能を補完

|機能 |X.F.Map|**X.F.GoogleMap**|
|---|---|---|
|地図の表示  |○  |○  |
|マーカーの表示  |○  |○  |
|線の表示 |×  |○  |
|ポリゴンの表示 |×  |○  |
|円の表示 |×  |○  |○  |

----

# iOS は MapKit を捨て Google Maps に

![](https://raw.githubusercontent.com/amay077/Xamarin.Forms.GoogleMaps/develop/screenshot01.png)

----

# Windows(UWP) は Bing Map SDK がクソだから無視

----

# Available on [NUGET]((一応うごくことはうごく))

----

# [Github](https://github.com/amay077/Xamarin.Forms.GoogleMaps) に STAR もらえるとよろこびます

----
# Powerd by ["Open sourced"](https://blog.xamarin.com/live-from-evolve-open-source-xamarin-ready-for-you/) Xamarin!

----
# SEE ALSO

* [Xamarin.Forms 向けの地図ライブラリ「Xamarin.Forms.GoogleMaps」をリリースしました](http://qiita.com/amay077/items/48aa90676b5e63ba179b)
* [Github - amay077/Xamarin.Forms.GoogleMaps](https://github.com/amay077/Xamarin.Forms.GoogleMaps)

----

# Thanks!

----
Salesforce開発環境の構築例 (2016年版)

『Eclipse × Force.com IDE』、『SublimeText × MavensMate』とこれだけあればSalesforceの開発環境を用意することができました。ですが『Gitを使ったバージョン管理』、『ビルド環境を整えてモダンなJavaScriptアプリケーションの開発』というように、Salesforceの開発で必要なツールや環境が増えていると思います。


それでは実際にどのように環境を用意すればいいのか...という問題にハマっていたので、いろいろ調べてみてブログにまとめてみました。


- [SFDC：Salesforce Development 2016 - Part 1](http://tyoshikawa1106.hatenablog.com/entry/2016/07/03/162802)
- [SFDC：Salesforce Development 2016 - Part 2](http://tyoshikawa1106.hatenablog.com/entry/2016/07/03/221638)
- [SFDC：Salesforce Development 2016 - Part 3](http://tyoshikawa1106.hatenablog.com/entry/2016/07/05/220000)
- [SFDC：Salesforce Development 2016 - Part 4](http://tyoshikawa1106.hatenablog.com/entry/2016/07/06/025333)
- [SFDC：Salesforce Development 2016 - Part 5](http://tyoshikawa1106.hatenablog.com/entry/2016/07/08/215026)

#各記事の概要
##SFDC：Salesforce Development 2016 - Part 1
Part1の記事では、SublimeTextとMavensMateをつかってSalesforceプロジェクトを用意した後、Gitリポジトリにプッシュするまでの流れについて紹介しています。

また、gulpやbowerをつかった開発環境の構築方法やgulp-jsforce-deployをつかって静的リソースにJSファイルをデプロイする方法についてまとめてみました。

今までForce.com IDEやMavensMate以外の方法でSalesforceにデプロイするにはMatedataAPIを理解して自分で環境を用意する必要がありました。[gulp-jsforce-deploy](https://github.com/jsforce/gulp-jsforce-deploy)によってその仕組みづくりに苦労しなくてよくなったと思います。

##SFDC：Salesforce Development 2016 - Part 2
Part2の記事では実際にAngularJSをつかったVisualforceページの開発について紹介しています。Part1で環境構築、Part2でその使用例を紹介する感じでまとめてあります。

ビルドの実行は出てきませんが、実際に動くサンプルコードも用意してみました。

##SFDC：Salesforce Development 2016 - Part 3
Part3の記事ではReactをつかったVisualforceページ開発の始め方について紹介しています。React開発ではビルド作業が必須となります。Salesforce開発でもnpm installやBabel、Webpackなどが利用できることについてまとめてみました。

##SFDC：Salesforce Development 2016 - Part 4
Part4の記事ではForce.com CLIをつかったSalesforceのメタデータを取得する方法について紹介しています。SalesforceではVisualforceページやApexクラスなど開発して用意したファイルはもちろん、ページレイアウトやカスタム表示ラベル、オブジェクト情報などのカスタマイズ情報もメタデータとして管理できます。

使いどころが難しいメタデータですが、Force.com CLIを利用することで短時間でダウンロードできるのでそのことについてまとめてみました。

##SFDC：Salesforce Development 2016 - Part 5
Part5の記事ではBitbucketをつかったSalesforceのプロジェクト管理について紹介しています。Gitをつかった管理についてはPart1で紹介していますが、プロジェクト管理がやりやすくなるBitbucketの便利機能やSourceTreeをつかった開発の進め方についてまとめてみました。

#環境構築時に意識していること
基本的には従来のMavensMateで開発するときと同じ流れで開発できるように考えています。今後、Lightning Experienceへの移行が本格化され、モダンなJavaScriptアプリケーション開発が必要になりますが、まだしばらくはapexタグをつかった画面開発も行われると思います。そのため、ページやクラス、トリガはMavensMateの機能をつかって開発を進められるように考えてみました。
<img width="819" alt="スクリーンショット 2016-07-09 16.38.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/ad656f8a-8eaf-eda5-a73d-58bcb4b9bb8c.png">


npmやBower、Gulp、Webpackなどを利用するための環境はすべてappフォルダ内にまとめてあります。(静的リソースへデプロイするための環境もappフォルダ内です。)
<img width="820" alt="スクリーンショット 2016-07-09 16.45.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/8407/9e5f0a91-3f92-6a0b-06eb-9e3546e01cb1.png">


普通にVisualforceページやApexクラス、トリガの開発をするときはappフォルダを気にする必要はないので、環境を大きく変更せずに導入できると思います。

#サンプルコード
ブログ記事内にもリンクはありますが、サンプルコードをGitHubで公開しています。

- [tyoshikawa1106/salesforce-development-2016](https://github.com/tyoshikawa1106/salesforce-development-2016)

#まとめ
ひとまずこれでモダンなJavaScriptアプリケーションを開発するための環境をSalesforce開発に取り込めると思います。ですが今回のサンプルにはまだ改善点があります。静的リソースへのデプロイ周りはGulpやWebpackをもっと作りこんで自動化できると思いますし、他にもこうした方が良いというのがでてくるかなと思います。今回のは何から手を付ければという人向けに構築例の１つとして紹介します。
Docker HubでDockerfileを公開する(AUTOMATED BUILD)

Docker Hubへimageではなく、Dockerfileを公開する。

## 必要な環境
GitHub / BitBucket 
※以下ではGitHubを利用しています。

## 手順
1. GitHubへdockerfileをpush
2. DockerHubでGitHubとリンク
3. Build triggerキック

※1、2の順序は逆でも可
※リンク後のDockerfileのcommitは、自動的にフックされて、DockerHubでビルドが走る（手順3は不要）

# 1. GitHubへdockerfileをpush

[sample dockerfile](https://github.com/Thirosue/docker-tomcat7/blob/master/Dockerfile "")

local環境でdockerfileをbuildし、問題ないことを確認

```bash
docker build -t tomcat7 .
```

GitHubへpush

# 2. DockerHubでGitHubとリンク

DockerHub → ヘッダメニュー → Create → Create AutoMated Build　
GitHubレポジトリとリンクしていない場合は、リンクする。

[公式URL](https://docs.docker.com/docker-hub/builds/ "")

# 3. Build triggerキック
defalutでは、GitHub push triggerとなっているため、明示的にBuild Triggerをキックし、現状のdockerfileをビルドし、imageを公開する。

以下を参考にし、curlなどでHTTP POSTし、Build Triggerをキックする。
DockerHub → 2.でリンクしたレポジトリに移動 → Build Settings → Build Triggerエリア → show examples.

```bash
curl -H "Content-Type: application/json" --data '{"build": true}' -X POST https://registry.hub.docker.com/u/mirrored1976/docker-tomcat7/trigger/5f2bdd77-68c4-4613-934a-0dfaa0fcb53f/
```

build requestリンクを見るとbuild結果が確認できます。
[サンプル画面](https://hub.docker.com/r/mirrored1976/docker-tomcat7/builds/b4p4bo7azsff7nbvinw4clg/ "")

## Docker Hubのサンプル
https://hub.docker.com/r/mirrored1976/docker-tomcat7/

##　終わりに
GitHubへのpush済の場合、Build Triggerを明示的にキックしないと、build結果が確認できません。
私は、一瞬待ってしまいました。。。

Dockerfileがないと、ベースイメージ等々確認できず不便な為、今後はautomated buildを利用していきたいです。
Spring-Session@1.2.1の簡単な検証


前回の[Spring-Sessionを使ってみた](http://qiita.com/uich/items/cd5d63c12f1d342fc65c)の投稿から1年以上経過したので、現状どのくらい変わったのか自分が使いたい範囲だけ検証してみた。

まずは[前回記事のTODO](http://qiita.com/uich/items/cd5d63c12f1d342fc65c#todo-20150414%E8%BF%BD%E8%A8%98)の内容から。

## 前回記事のTODO

### `@EnableRedisHttpSession.maxInactiveIntervalInSeconds()`の値がCookieのExpireに反映されない

いや、これそもそも *Inactiveな状態が何秒続いたらセッション破棄する* という内容であってCookieの生存期間の話じゃなかった。

バージョン`1.x.RELEASE`系ではCookieにmaxAgeを設定しようとすると`CookieHttpSessionStrategy`を独自拡張して・・・
って`final`だから拡張クラスも作れない。。

ということで諦めて`CookieHttpSessionStrategy`をコピペしてmaxAgeを設定する他なかった。

### SessionAttributeで保存したデータ構造が変わった時の対応方法

これはどちらかというとJavaのシリアライズ/デシリアライズの話。

Redisにそのまま`JdkSerializationRedisSerializer`を使用してシリアライズ/デシリアライズすると型の構造が変わった時にデシリアライズエラーになる。
避け方は色々あると思うのでここでの言及は割愛する。

---

## `1.2.1.RELEASE`

ここから`1.2.1.RELEASE`の話。

### CookieのMaxAgeの設定

[Issue](https://github.com/spring-projects/spring-session/issues/106)を見てみると`CookieHttpSessionStrategy`にCookieの設定内容どんどん増えていくのが見える。
そこでCookieのシリアライズ設定だけ切り出したようだ。

* [CookieSerializer](https://github.com/spring-projects/spring-session/blob/1.2.1.RELEASE/spring-session/src/main/java/org/springframework/session/web/http/CookieSerializer.java)

これでセッションIDに関するCookieの細かな設定が可能となった。

```java
@Bean
public CookieSerializer cookieSerializer() {
  DefaultCookieSerializer serializer = new DefaultCookieSerializer();
  serializer.setCookieName("JSESSIONID");
  serializer.setCookieMaxAge(365 * 24 * 60 * 60); // 365 days.
  return serializer;
}
```

### Sessionの張り替え

[前回記事でも検証](http://qiita.com/uich/items/cd5d63c12f1d342fc65c#session%E3%81%AE%E5%BC%B5%E3%82%8A%E6%9B%BF%E3%81%88)したので、今回も検証してみる。

できた！

```java:request1
User user = (User) session.getAttribute("user");
user.getName(); // Taro
session.invalidate();
request.getSession(true).setSessionAttribute("user", user);
```
って同じリクエスト内で実行すると生成されたJSESSIONIDがCookieに設定されたので、次回以降のリクエストで

```java:request2
((User)session.getAttribute("user")).getName(); // Taro
```

### SessionAttributeの書き換え

これは[前回の記事](http://qiita.com/uich/items/cd5d63c12f1d342fc65c#sessionattribute%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)から動作は変わらなかった。

## まとめ

あんまりガッツリ動作を確認したわけではないから中身が薄い記事になってしまったけど、自分用のメモとしては良いかなと。
`1.0`、`1.1`系のspring-session使ってる方は`1.2`系に上げてみても良いかもしれません。
スマホでGoogleMapがあるとめちゃめちゃスクロールしづらい

![rage-face_2385836.jpg](https://qiita-image-store.s3.amazonaws.com/0/47327/9b828fd2-ca91-e601-c452-3cc3f5e919cf.jpeg)

```javascript
draggable: false,
```
を有効にすると良いみたいです。

パソコン用に `scrollwheel: false`も設定しておくとマウススクロールが無効化されるのでそちらはお好みで。

```js
jQuery(document).ready(function() {
	var lat = 0;
	var lng = 0
	var latlng = new google.maps.LatLng(lat, lng);
	var myOptions = {
		zoom: 20,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP, /*表示タイプの指定*/
		draggable: false, /** ここを設定するとスマホで拡大しない **/
	};
	var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
	var marker = new google.maps.Marker({
	position: latlng,
	map: map
	});
});

```
jQueryセレクタについてまとめてみた  


##jQueryセレクタとは  
HTMLドキュメントから特定の要素を取得するために用いる記法であり、  
`$("セレクター")`のように記述する。


##セレクタの種類
いくつか実際のセレクターを紹介してきます。  

###基本系
    $('*');        // 全ての要素を選択する。 
    $('#id');      // 指定されたidを持つ要素を選択する。  
    $('element');  // 指定されたタグ名の要素を選択する。
    $('.class');   // 指定されたクラスを持つ要素を選択する。
  
  
###階層関係指定系

#####親子関係
	$("#father > .child");  // 親(#parent)を持つ子(.child)を選択する  
  
#####先祖子孫関係
    $("#grandFather .grandChild");   // 先祖(#grandFather)を先祖に持つ(.grandChild)を選択する
    
  
#####兄弟関係
    $('prev + next');      // liで考えてprev(li)のnext(次のli)  
	$('prev ~ siblings');  // liで考えてprev(li)のsiblings(以降のli)  
  
###フィルタ
フィルタとはその名の通り、取得した要素を要素の順序や属性の値などによって絞り込むものです。
`$('element:filter')`のように記述します。

#####フィルタ(基本)
	$('ul li:first');       // 先頭の要素を選択する。
	$('ul li:last');        // 末尾の要素を選択する。
	$('ul li:even');        // 偶数番の要素を選択する。
	$('ul li:odd');         // 奇数番の要素を選択する。  
	$('ul li:eq(index)');   // インデックス指定した要素を選択する。一番目の要素は0となるので注意
	$('ul li:gt(index)');   // 指定したインデックスより後の要素を選択する。
	$('ul li:lt(index)');   // 指定したインデックスより前の要素を選択する。  
  
#####フィルタ(コンテンツ)
	$('ul li:contains(text)');  // 指定した文字列を含む要素を選択する。
	$('ul li:empty');           // 空要素を選択する。
	$('p:has(a)');              // 指定したセレクター要素(a)を子孫に持つ要素(p)を選択する。  
  
#####フィルタ(属性)
	$('a[target = "value"]');   // 属性がvalueに等しい要素を取得  
	$('a[target != "value"]');  // 属性がvalueに等しくない要素を取得  
	$('a[target ^= "value"]');  // 属性がvalueで始まる要素を取得  
	$('a[target $= "value"]');  // 属性がvalueで終わる要素を取得  
	$('a[target *= "value"]');  // 属性がvalueを含む要素を取得  
	
#####フィルタ(フォーム)  
	$('#form :input');　　　// type="input"のinput要素を取得
	$('#form :button');    // type="button"のinput要素を取得
	$('#form :checkbox');  // type="checkbox"のinput要素を取得
	$('#form :radio');　　　// type="radio"のinput要素を取得
	$('#form :password');  // type="password"のinput要素を取得  

	// ===== 状態
	$('#form :enabled');        // フォーム要素が利用可能状態にある要素を取得
	$('#form :disabled');	    // フォーム要素が利用不可状態にある要素を取得
	$('#form :hidden');	        // 非表示状態にある要素を取得
	$('#form :visible');	    // 表示状態にある要素を取得
	$('#form :animeted');	    // アニメーション中状態にある要素を取得
	$('#form :checked');	    // radioやcheckboxのチェック状態にある要素を取得
	$('#form option:selected'); // 選択boxの選択状態にある要素を取得   
	
##最後に
jQueryに初めて触れたので、復習も兼ねて機能の一部をまとめてみました、間違っている箇所があったらゴメンなさい。　　
「簡単なコードでJavascriptを実行できる」という記事をよく見かけますが、本当に覚えやすく書きやすいコードだと実感しました。
処理速度を意識したセレクタの記法などもあるようなので、次回の記事はその辺をまとめてみたいと思います。
修正や更新は随時行っていきたいと思います。
VyOSでIPv6 リンクローカルアドレスをGWに設定する

さくらのクラウドでルーターを作成し、IPv6を有効にしてVyOSから接続しようとした時の話です。

# NG1

さくらのクラウドでは、IPv6でのゲートウェイが常に `fe80::1` になっている様子です。なので、このように設定したくなります。

```bash
vyos@vyos# set protocols static route6 ::0/0 next-hop fe80::1
```

ただ、こうやっても通信できるわけがなく、時間だけが失われていきます。


# OK

```bash
vyos@vyos# set protocols static route6 ::0/0 next-hop fe80::1 interface 'eth0'
```


# NG2

最初こういうことやってたけど、アホなやり方だったみたいです


`fe80::1` これはローカルリンクアドレスです。ですので、インタフェースが特定できなければパケットを配信することが出来ません。ただ、VyOSの設定上ではルーティングにインタフェースを指定することが出来ないので(探した限り)、以下のファイルを編集します。

```bash
vyos@vyos# cat /opt/vyatta/etc/config/scripts/vyatta-postconfig-bootup.script  
#!/bin/sh
# This script is called from /etc/rc.local on boot after the Vyatta
# configuration is fully applied. Any modifications done to work around
# unfixed bugs and implement enhancements which are not complete in the Vyatta
# system can be placed here.

ip -6 route add default via fe80::1 dev eth0
```
Firebaseでリアルタイム位置情報共有サービス

# Where are you?

[Google IO](https://events.google.com/io2016/)で、Firebaseの大幅な機能拡張が発表されて、Firebaseのほとんどの機能が無制限で無料になこともあって、

> Firebase はアプリ構築という手間のかかる作業をサポートする Backend as a Service（BaaS）です。
Realtime Database、User Authentication、Hosting という既存の機能によってアプリ開発ははるかに簡単になりますが、Firebase にはそれ以上の可能性が秘められています。

それでスマホ用に、伝助ライクに部屋を作れて、友人と位置情報共有しつつチャットできる[位置情報共有サービス](https://bruwbird.com/)作ってみた。

![Where_are_you--logo (1).png](https://qiita-image-store.s3.amazonaws.com/0/51350/aa746ab4-aa2e-da6f-92e1-b395983caf30.png)

実際につかってみても、友達と位置共有って、単純に面白い。
多分もっと追求できるのは、リアルタイムな位置情報共有で生まれる価値。既にいくつかサービス（[LINE HERE](http://here.line.me/ja)、[google+](https://support.google.com/plus/answer/2998354?hl=ja)、[友達を探す](https://support.apple.com/ja-jp/HT201493)等）はあるものの、ほとんどのアプリは知人の位置の把握そのものが目的となっている。リアルタイムな位置情報で、C to Cでお互いに付加価値を提供しあえないかを考えている。pullするほどでもない情報が、自然に入り込んでくることでなにか生まれないか。

[github](https://github.com/DaichiMiyajima/candy_guide_web)でソースコードあげてます。
Python openpyxlでExcelを操作


# PythonでExcelファイルを作成、書き込みなどをする。
様々なパッケージがあるが、openpyxlがいまのところ一番使いやすかった。
[official document (http://openpyxl.readthedocs.io/en/default/)](http://openpyxl.readthedocs.io/en/default/)
## インポート

```
import openpyxl as px
```
## 作成・保存
新規作成

```
wb = px.Workbook()
```
既存のファイル読み込み

```
wb = px.load_workbook('FILEPATH')
```
保存

```
wb.save('FILEPATH')
```
## シート操作
アクティブシート

```
ws = wb.active
```
新規シート作成

```
ws = wb.create_sheet()  # 右端に作成
ws = wb.create_sheet(0)  # 左端に作成
ws = wb.create_sheet(title='SHEETNAME')  # シート名を指定
```
シート名から選択

```
ws = wb.get_sheet_by_name('SHEETNAME')
```
ワークシート名一覧（リスト）

```
sheetnames = wb.get_sheet_names()
```
シート名変更

```
ws.title = 'New Title'
```
## セル基本操作
セル書き込み

```
ws['A1'].value = 'Hello World'
from datetime import datetime as dt
ws.cell(row=2, column=1).value = dt.now()
```
セル複数書き込み

```
i = 1234.5678
for row in ws.iter_rows('C1:E3'):
    for cell in row:
        cell.value = i
        i = i * 2
```
セル選択（イテレータ）

```
ws.rows
ws.columns
```
行または列の選択

```
ws.column_dimensions['A']
ws.row_dimensions[1]
```
## セル設定変更
表示形式

```
ws['A2'].number_format = 'yyyy-mm-dd hh:mm:ss'
ws['C1'].number_format = u'#,##0.00;[Red]-#,##0.00'
ws['D1'].number_format = u'_ ¥* #,##0_ ;[Red]_ ¥* -#,##0_ '
```
セル結合

```
ws.merge_cells('A5:B5')
ws.unmerge_cells('A5:B5')
ws.merge_cells(start_row=5,start_column=1,end_row=5,end_column=6)
ws.unmerge_cells(start_row=5,start_column=1,end_row=5,end_column=6)
```
コメント

```
from openpyxl.comments import Comment
ws['C1'].comment = Comment(
    'This is the comment text',
    'Comment Author'
)

ws['C1'].comment.text  # コメント内容
ws['C1'].comment.author  # コメント作成者
```


フォント

```
from openpyxl.styles import Font
ws['A1'].font = Font(
    name='Calibri',
    size=12,
    bold=True,
    italic=False,
    color='FF000000'
)
```
セルパターン

```
from openpyxl.styles import PatternFill
ws['A1'].fill = PatternFill(
    fill_type=None,
    start_color='FFFFFFFF',
    end_color='FF000000'
)
```
セル罫線

```
from openpyxl.styles import Border, Side

#囲み
ws['B10'].border = Border(
    outline=True,
    left=Side(style='thin', color='FF000000'),
    right=Side(style='thick', color='FF000000'),
    top=Side(style='mediam, color='FF000000'),
    bottom=Side(style=None, color='FF000000')
)

# 斜め
ws['B12'].border = Border(
    outline=True,
    diagonalUp=True,
    diagonalDown=True,
    diagonal=Side(style=None, color='FF000000')
)

style = [
    'dashDot', 'dashDotDot', 'dashed', 'dotted',
    'double', 'hair',
    'medium', 'mediumDashDot', 'mediumDashDotDot', 'mediumDashed',
    'slantDashDot',
    'thick', 'thin'
]
```


セル文字表示方法

```
from openpyxl.styles import Alignment
ws['A1'].alignment = Alignment(
    wrap_text=False,  # 折り返し改行
    horizontal='general',  # 水平位置
    vertical='bottom'  # 上下位置
)
```
Raspberry Pi 3 (Raspbian Jessie)の無線LANに固定IPアドレスを設定する


## はじめに
Raspberry Pi 3にはWiFiモジュールが内蔵されています。

この記事では、Raspbian Jessieのバージョン(2016年7月時最新)における無線LAN設定と、その固定IPアドレス設定方法を記します。

## Debianのバージョンを確認

```
$ cat /etc/debian_version
```

`8.0`のように、Debianのバージョンが8.0以上(Jessie)であるかを確認。

## 無線LAN設定
以下を参考にしました
[Raspberry Pi 3を買ってMacを使ってWiFi接続とSSHの接続するまで](http://qiita.com/toshihirock/items/8e7f0887b565defe7989#wifi%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B)

無線LAN設定は初期インストール時や、GUI等でも設定可能ですが、無線LANの生パスワードを残さない方法として紹介します。

### `wpa_supplicant.conf`に無線LAN情報を追記
以下を実行

```
$ sudo sh -c 'wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

`SSID`と`PASSPHRASE`を自身の無線ルータ等の設定にしてください。

### 生パスワードを削除
`/etc/wpa_supplicant/wpa_supplicant.conf`ファイル内では、生パスワードがコメントアウトで記載されているので、確認してから削除しましょう。

```/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB

network={
	    ssid="SSID"
	    #psk="PASSPHRASE" #消しておきましょう
	    psk=xxxxxxxxxxx....xxx
}
```

## 固定IPアドレス設定
以下を参考にしました
[Raspberry Pi 2 (Raspbian: jessie) でIPアドレスを固定する](http://qiita.com/ykog/items/a6dbba1c09e870f8f702)

### `dhcpcd.conf`にネットワーク情報を追記
Raspbian Wheezyでは、固定IPアドレス設定には、`/etc/network/interface`のファイルを修正しましたが、Jessieからは代わりに`/etc/dhcpcd.conf`ファイルへ設定内容を追記します。

```/etc/dhcpcd.conf
# 追記
interface wlan0
static ip_address=192.168.11.40/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
```

上記の設定はBuffalo無線ルータの場合の設定です。
`routers`というのは`gateway`に当たります。

## 設定確認
シャットダウンしてLANケーブルが繋がっているならば抜き、再起動後、指定したIPアドレスで無線LANが設定されているかを確認します。

```
$ ip addr
(略)
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:82:1b:df brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.40/24 brd 192.168.11.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::dcdd:d297:5e54:2b4d/64 scope link
       valid_lft forever preferred_lft forever
```


これで無線LANを通じてSSH接続等ができるようになりました!
WordPressのアクションフックで無名関数に引数を渡す

# はじめに
WordPressのアクションフックに引数を渡したい、という場面がありました。

```php
add_action('wp_footer', function() use ($arg) {
 echo $arg;
});
```

> 無名関数 | PHP.net
> http://php.net/manual/ja/functions.anonymous.php

# どこで欲しかったの？
JavaScriptの操作周りだったのでフッターで出力する必要があり、アクションフック登録時に引数を渡したいと思いました。

カスタム投稿タイプの出力周りをsingle-cpt.phpで簡潔させることができました。

# 例
店舗というカスタム投稿タイプについて、フッターで地図情報をカスタムフィールドから取得して出力させたかった。
JavaScriptのグローバル変数でHTML中に記述してもよかったんだけれど、フッター付近に集めたかったです。

```php
public function theMap() {
	$geo = get_field('geo');
	add_action('wp_footer', function() use ($geo) {
		?>
		<script>
			jQuery(document).ready(function() {
				var latlng = new google.maps.LatLng(<?php echo $geo['lat']; ?>, <?php echo $geo['lng']; ?>);
				var myOptions = {
					zoom: 20, /*拡大比率*/
					center: latlng, /*表示枠内の中心点*/
					mapTypeId: google.maps.MapTypeId.ROADMAP, /*表示タイプの指定*/
					draggable: false,
					scrollwheel: false
				};
				var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
				var marker = new google.maps.Marker({
					position: latlng,
					map: map
				});
				});
		</script>
		<?php
	});
}
```
クロマキー抽出で人の肌色を抽出するシェーダ

オノッチ https://twitter.com/onotchi_ さんのこちら http://onoty3d.hatenablog.com/entry/2016/02/06/141002 の記事を元にして、クロマキー合成（クロマキー透過）ではなくクロマキー抽出で肌の色を取り出すシェーダを作ってみた

```ChromaKeyOverlay.shader

Shader "Custom/ChromaKeyOverlay" {
	Properties{
		_KeyColor("Key Color", Color) = (0,1,0)
		_HueNear("Hue Near", Range(0, 0.5)) = 0.1
		_SatNear("Saturation Near", Range(0, 0.5)) = 0.1
		_MainTex("Base (RGB) Trans (A)", 2D) = "white" {}
	}

		SubShader{
		Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }

		CGPROGRAM
#pragma surface surf Lambert alpha

		sampler2D _MainTex;
	fixed3 _KeyColor;
	fixed _HueNear;
	fixed _SatNear;

	struct Input {
		float2 uv_MainTex;
	};

	fixed GetHue(fixed3 rgb) {
		fixed hue = 0;
		fixed minValue = min(rgb.r, min(rgb.g, rgb.b));
		fixed maxValue = max(rgb.r, max(rgb.g, rgb.b));
		fixed delta = maxValue - minValue;
		if (delta != 0) {
			if (maxValue == rgb.r) {
				hue = (rgb.g - rgb.b) / delta;
			}
			else if (maxValue == rgb.g) {
				hue = 2.0 + (rgb.b - rgb.r) / delta;
			}
			else {
				hue = 4.0 + (rgb.r - rgb.g) / delta;
			}

			hue /= 6.0;

			if (hue < 0) {
				hue += 1.0;
			}
		}
		return hue;
	}

	fixed GetSaturation(fixed3 rgb) {
		fixed sat = 0;
		fixed minValue = min(rgb.r, min(rgb.g, rgb.b));
		fixed maxValue = max(rgb.r, max(rgb.g, rgb.b));
		sat = (maxValue - minValue) / maxValue;

		return sat;
	}

	void surf(Input IN, inout SurfaceOutput o) {
		fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
		fixed distance = GetHue(c.rgb) - GetHue(_KeyColor);
		fixed distance2 = GetSaturation(_KeyColor)- GetSaturation(c.rgb);
		fixed alpha = 0.0;
		if (distance > 0.5) {
			distance = 1.0 - distance;
		}
		else if (distance < -0.5) {
			distance = 1.0 + distance;
		}
		else {
			distance = abs(distance);
		}

		clip(_HueNear - distance);
		clip(_SatNear - distance2);
		alpha = ((_HueNear - distance)/ _HueNear +(_SatNear - distance2)/ _SatNear)*1.0;
		o.Albedo = c.rgb;
		o.Alpha = alpha;
	}

	ENDCG
	}

		Fallback "Transparent/Diffuse"
}

```

Webカメラ画像をリアルタイム表示するRenderTextureにこのシェーダーを適用したマテリアルを割り当てると、手など肌の色だけが取り出されて他の部分は透過になる
Turbolinks 5.0.0 に対応したい

# コレは何

Turbolinks 5.0.0 へのアップデートの記録です。

# 課題

さらっと `bundle update` でイケるかと思いきや、いくつか対応が必要な箇所がありました。

- ページ内リンクでイベント発火してしまう件
- jquery-turbolinks 対応
- nprogress-rails 不要

# 対応

## ページ内リンクでイベント発火してしまう件

```html
<a href="#hoge">アンカー</a>
```

など、ページ内リンクをクリックするとイベントが発火し、リロードが走ってしまうようです。
↓ で暫定対応としました。

```coffeescript:app/assets/javascripts/turbolinks-compatibility.coffee
# HACK: ページ内リンクで発火してしまう問題への対応
# Turbolinks should follow same-page anchor links without reloading the page
# https://github.com/turbolinks/turbolinks/issues/75
Turbolinks.Controller.prototype.nodeIsVisitableOld = Turbolinks.Controller.prototype.nodeIsVisitable
Turbolinks.Controller.prototype.nodeIsVisitable = (node) ->
  node.getAttribute('href') && node.getAttribute('href')[0] != '#' && Turbolinks.Controller.prototype.nodeIsVisitableOld(node)
```

## jquery-turbolinks 対応

イベント名が変わっているため、jquery-turbolinks に依存している場合には読み替えが必要です。

```coffeescript:app/assets/javascripts/turbolinks-compatibility.coffee
# HACK: jquery-turbolinks 対応
# https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee
{defer, dispatch} = Turbolinks

handleEvent = (eventName, handler) ->
  document.addEventListener(eventName, handler, false)

translateEvent = ({from, to}) ->
  handler = (event) ->
    event = dispatch(to, target: event.target, cancelable: event.cancelable, data: event.data)
    event.preventDefault() if event.defaultPrevented
  handleEvent(from, handler)

translateEvent from: "turbolinks:click", to: "page:before-change"
translateEvent from: "turbolinks:request-start", to: "page:fetch"
translateEvent from: "turbolinks:request-end", to: "page:receive"
translateEvent from: "turbolinks:before-cache", to: "page:before-unload"
translateEvent from: "turbolinks:render", to: "page:update"
translateEvent from: "turbolinks:load", to: "page:change"
translateEvent from: "turbolinks:load", to: "page:update"

loaded = false
handleEvent "DOMContentLoaded", ->
  defer ->
    loaded = true
handleEvent "turbolinks:load", ->
  if loaded
    dispatch("page:load")

jQuery?(document).on "ajaxSuccess", (event, xhr, settings) ->
  if jQuery.trim(xhr.responseText).length > 0
    dispatch("page:update")
```


## nprogress-rails 不要

Turbolinks の標準機能でプログレスバーを表示してくれるようになっていました。
これまでお世話になった `nprogress-rails` とはお別れです :pray: 。

スタイルは `.turbolinks-progress-bar` でカスタマイズ可能 :lipstick: です。

```scss:app/assets/stylesheets/turbolinks_progressbar.scss
.turbolinks-progress-bar {
  background-color: orange;
}
```

# 参考

- [How to Upgrade to Turbolinks 5 - GoRails](https://gorails.com/episodes/upgrade-to-turbolinks-5?autoplay=1)
- [Turbolinks should follow same-page anchor links without reloading the page · Issue #75 · turbolinks/turbolinks](https://github.com/turbolinks/turbolinks/issues/75)
Serverlessのお約束(1)

公式ドキュメントにきちんと書かれていない or 扱いが小さいが、よく使われそうなケースやハマリどころ等について書いてみたいと思います。
まずはパッケージ(外部ライブラリ)について。※(2)を書くとは言っていない

## 前提

この記事は以下の環境について記述しています。

* Serverless Framework 0.5.x
* Node.js 4.x

## package.json

Node.jsにおけるパッケージ管理ツールと言えばnpm。Serverlessで作成したプロジェクトにはルートディレクトリ直下にpackage.jsonがあります。
しかし、だからといってルートディレクトリで`npm install`してはいけません。その状態から`sls function deploy`をするとnode_modulesを含まない状態でパッケージング、デプロイされます。

`sls function deploy`でデプロイしたファンクションに含まれるファイル
※ package.jsonもnode_modulesも含まれていないことに注目

* _serverless_handler.js
* event.json
* handler.js
* s-function.json

よって、パッケージを利用するファンクション内にnode_modulesが出来るよう、そこにpackage.jsonファイルを用意する必要があります。

```
project-name you$ cd function_name
function_name you$ npm init
function_name you$ npm install (パッケージ名) --save
```

## 発生するエラー

aws-sdkのようにLambdaがデフォルトで用意しているモジュールであれば問題ありませんが、それ以外のパッケージを`require`している場合(かつnode_modulesをデプロイに含めていない場合)、下記のエラーがCloudWatchのログに出力されます。

```
Unable to import module '_serverless_handler': Error at Function.Module._resolveFilename (module.js:325:15) at Function.Module._load (module.js:276:25) at Module.require (module.js:353:17) at require (internal/module.js:12:17) at Object.<anonymous> (/var/task/handler.js:4:12) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Module.require (module.js:353:17)
```

一見'_serverless_handler'がないと怒られているように見えるので、あるはずだけどな？と戸惑います。
しかし、Lambdaの管理画面から「Test」をすると本当の原因(足りないモジュールの名前等)を確認することができます。

```
"errorMessage": "Cannot find module 'node-uuid'",
```

Lambdaにデフォルトで用意されているモジュールは以下のドキュメントでご確認ください。
[Lambda 実行環境と利用できるライブラリ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html)

公式の情報ではありませんが、他にもいくつか使えるモジュールがあるようです。
[AWS Lambdaで標準で利用できるモジュール一覧#インストールされているもの](http://qiita.com/yoshidasts/items/2d7117ef0f31754a06ab#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%82%82%E3%81%AE)
finatra 七歩目

# https通信

これでいける

```scala
    val req = Request.apply(Version.Http11, Method.Get, "/finagle/docs/index.html#com.twitter.finagle.Http$")
    val http = com.twitter.finagle.Http
    http.client.withTls("twitter.github.io").newService("twitter.github.io:443").apply(req)
```
DockerをUbuntu 16.04にインストールする


# Ubuntu 16.04の準備

Vagrant使ってUbuntu 16.04を雑に立てる。


```sh:vagrantによるUbuntu16.04インストール
vagrant box add xenial64 https://atlas.hashicorp.com/ubuntu/boxes/xenial64/versions/20160521.0.0/providers/virtualbox.box #Boxの取得
vagrant init xenial64
vagrant up

```

```sh:Ubuntu16.04のパッケージ最新化
vagrant ssh
sudo apt-get update
sudo apt-get upgrade
```

# dockerのインストール

```sh:dockerのインストール
vagrant ssh
curl -fsSL https://get.docker.com/ | sh
```

sudoパスワードを聞かれたらタイプすればインストールできる...はず。

```sh:dockerのバージョンチェック
docker --version
Docker version 1.11.2, build b9f10c9
```


# 補遺
rootユーザ以外でdockerを使うのであれば、
任意のユーザを dockerグループに所属させればいいらしい。

```sh:dockerグループへのユーザの追加
sudo usermod -aG docker ユーザ名
```
Realmのクエリの表記で誤った場合のエラー　その１

# Xcodeエラー "Property 'AAA' not found in object of type 'ObjectType'"

このエラーが出る原因は他にもあるかもしれないけど、自分の場合について
記載。
自分の場合はRealmのクエリの設定方法が間違っていました。

```swift:誤
    let value = "AAA"
    realm.objects(ObjectType).filter("cond = \(value)")
```
```swift:正
    let value = "AAA"
    realm.objects(ObjectType).filter("cond = '\(value)'")
```

細かいところですが`\(value)`を`''`(シングルクォーテーション)で
囲う必要があります。忘れがちなので注意します。
ES6のgulpfile.babel.jsがrollupのpresetとconflictしたときの対処法


ES6でgulpfileを書くことにしました。

#ES6記法で書く
・参考
[webpack + babel-loaderでES6デビューしつつ、gulpもES6で書く - Qiita](http://qiita.com/inureo/items/6ac74fb19e12f395e4c1#es6%E6%A7%8B%E6%96%87%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)

##rename
gulpfile.jsをgulp.babel.jsにrename。

##モジュール読み込みをES6記法で修正 :pencil: 
requireではなくimportで書いてみた。

##エラー
```
import gulp from 'gulp';
^^^^^^
SyntaxError: Unexpected token import
```

しかしimport記法が認識されませんでした。 :weary: 

#修正前

##babelrc
```.babelrc
{
  "presets": [ "es2015-rollup" ]
}
```

#修正後 :sparkles: 

##babelrc
```babelrc
{
  "presets": [ "es2015" ]
}
```
.babelrcのpresetをes2015に修正します。

##gulp.babel.js
```gulp.babel.js
{
  entry: './hoge.js',
  plugins: [
    babel({
      babelrc: false, //追加
      presets: ["es2015-rollup"], //追加
      runtimeHelpers: true 
    })
  ]
};
```
babelrcのpresetではなく、ここで指定したpresetを読むように定義します。

・参考
[ES6 gulpfile.babel.js preset conflict with rollup · Issue #35 · rollup/rollup-plugin-babel](https://github.com/rollup/rollup-plugin-babel/issues/35)
お腹すいたし、FizzBuzzでもしようか。


```FizzBuzz.hsp
repeat 10000,1
if cnt\15=0:mes "FizzBuzz":else:if cnt\5=0:mes "Buzz":else:if cnt\3=0:mes "Fizz":else:mes ""+cnt
loop
```

#出力
![wents.PNG](https://qiita-image-store.s3.amazonaws.com/0/125607/a164065e-3028-8e68-2d98-da0144d92de7.png)
スクロールバーがないから全部見れんかった
Chainer + anaconda2で実行時にfatalエラー

# 環境
 - windows10 64bit
 - anaconda2(python2.7.11)
 - chainer 1.10.0

# やったこと
 - githubからchainerのリリースverをダウンロード
 - python setup.py installでchainerをインストール
 - 例としてmnistを実行したら以下のエラーが発生（pythonが屍になった）
![error.jpg](https://qiita-image-store.s3.amazonaws.com/0/124388/5313a225-0096-1cda-37d6-c94d5311aaa3.jpeg)

# お願い
同じような現象が発生した方、もし可能でしたら対処方法について共有いただけると助かります。。
ISO/IEC 29119のpros&cons

昨日TEF(Test Engineer Forum)さんからISO/IEC29119 SWテスト標準関連セミナ関連お知らせメールを受けました。昨年はTPI-Nextが日本でおすすめられる雰囲気でしたが今年は多分日本情報処理学会を中心で29119を注目しそうです。
[関連リンク](http://www.ipsj.or.jp/event/s-seminar/2016/ITSCJ-SWtest/)

昨年29119のパーツ4までがpublishされ、様々な賛否が出ました。以前に私が見た反対はの代表はJames ChristieさんとJames Bachさんでした。

[James Chriestieさんの反対](http://www.a1qa.com/blog/a-novel-long-standard-intervew-with-james-christie/)

[James Bachさんの反対](http://www.satisfice.com/blog/archives/1464)

要約するとChristieさんの話は標準がとても膨大なので現場で適用されられないくらいのです。Bachさんの話はSWテストのほんの一部を定めているcontext driven testing(Explanatory Testingなど)が29119で欠けていて足りない標準じゃないのです。

昨日29119整理をメインでやっているDr Stuart Reidさんを会うことになって上のイシューをこっそり聞いてみました。

Reidさんの話をまとめると

* 29119の整理はとっても難しいです。SW自体が様々も産業全般にかけていて多い理解関係者がコメントをします。これらを全部反映してちょっと規模が大きくなりました。ちなみにSW業界が早くトレンドが変わり、これの反映も考えなきゃなりません。今年8月でパーツ５がリリーズ予定しAgileなどのトレンドがパーツ６、７で反映する予定です。何か整理が必要と思います。
* 主な反対する方たちは自分が興味ある部分だけを見て反対しています。Bachさんが語っているContext Driven関連内容は29119パーツ1で含めています（僕に確認させてくれました）。最初がパーツ２（プロセス）とかパーツ４（テスト手法）で含めさせるかと思いましたいが、概念的なのが強いのでパーツ１で決めました。一部のみ見て反対する方が多いので一個一個対応してないです。

もう一つReidさんが語るのは標準が目指すのは「Best Practice」ではなく「Good Practice」のです。言い換えば標準ちゃんと従うと「Best」はならないの意味です。

確かに我々は標準から「ベスト」を期待しているんじゃないでしょうか。

標準はベストではないけれど自分の組織でメリットがあればちゃんと導入するべきです。
git for windows 2回目のadd,commit

#commitしたファイルを変更してaddしてみよう

**現状の確認**

```
$ git status
On branch master
nothing to commit, working directory clean
```
現状のワークスペースは空っぽです。


**ファイルを変更する**

```
$ vi read.me
$ cat read.me
#Git-tutorial
```
エディタは何でもいいので、read.meファイルを変更してみる。

**変更したファイルを登録（今回は2回目）**

```
$ git add read.me
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   read.me
```
git addコマンドでステージ領域（コミットをする前の一時領域）へ登録。

**差分を見てみる（リポジトリとワークスペース）**

```
$ git diff
diff --git a/read.me b/read.me
index e69de29..70aeaef 100644
--- a/read.me
+++ b/read.me
@@ -0,0 +1 @@
+#Git-tutorial
```


#commitしてみよう（2回目）

**現状はどうなっている**

```
$ git diff

$ git diff HEAD
diff --git a/read.me b/read.me
index e69de29..dd50ef7 100644
--- a/read.me
+++ b/read.me
@@ -0,0 +1 @@
+#Git-tutorial
```
git diffコマンドはワークスペースと最新のリポジトリの比較です。
現状はワークスペースにありませんので、何もでてきません。

リポジトリ内のdiffを見る場合はgit diff HEADとすれば見れます。
git commitする前にリポジトリがどうなっているのか確認したほうがよいですね。


**commitしてみる（2回目）**

```
$ git commit -m "my second commit"
[master 261a8f8] my second commit
 1 file changed, 2 insertions(+)
```


**logを見てみる**

```
$ git log
commit 261a8f8b88b61ed304a0797c637d6a590fedccce
Author: firstname lastname <your_email@example.com>
Date:   Sat Jul 9 14:54:58 2016 +0900

    my second commit

commit 4833fd1ad12c674fb6d4583afb59a11193e759b4
Author: firstname lastname <your_email@example.com>
Date:   Sat Jul 9 12:25:18 2016 +0900

    my  first commit
```
今日 (2016/07/09)時点でのPHPフレームワークの人気度

今日 (2016/07/09)時点でなにげに思いついたPHP FWの Google Trendの結果を画像で貼っておこう。

![スクリーンショット 2016-07-09 14.22.36.png](https://qiita-image-store.s3.amazonaws.com/0/19343/9fc3c65a-c67b-c3b0-35a4-6830fdd79143.png)

ZF2とかSymfony2とかいろいろあるみたいだけど、あんまり変わらんからいいや

え、CodeIgniter意外と人気あるのね・・・ていうか1位？ へーよかったｗ
みたいな。 (自分が気に入ってるだけなのですがね)
iOSで近接センサーをいじってみる

#iOSで近接センサーをいじってみる
iPhoneに搭載されている近接センサーを使って、手をかざしたことを検知したいと思って調べたことをまとめました。

#対応機種について
近接センサーはiPhoneについているセンサーでiPad やiPod touchにはついていないようです。

#とりあえず、使ってみる
UIDevice でproximitySensorを有効にします。
その後、NSNotificationCenterにObserverを追加します。

```swift:ViewController.swift
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
        UIDevice.currentDevice().proximityMonitoringEnabled = true
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.proxitySensorStateChanged), name: UIDeviceProximityStateDidChangeNotification, object: nil)
    }
```

近接センサーが反応したとき、下記のメソッドが呼ばれるようにしました。
storyboard上のラベルの色が変化するだけです。

```swift:ViewController.swift
func proxitySensorStateChanged(){
        if (UIDevice.currentDevice().proximityState == true)
        {
            self.proximitySensor.backgroundColor = UIColor.greenColor()
        }
        else
        {
            self.proximitySensor.backgroundColor = UIColor.redColor()
        }
}
```

とりあえずこれだけで近接センサーは使えるようになりました。


<img width="200
" alt="IMG_0382.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/126467/786f272c-d64d-9b6d-5e67-9310003dae7d.png"><img width="200" alt="IMG_0381.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/126467/e5baef8c-1b6c-ae1c-ea7a-cc3ff49bb47f.png">
左が手をかざした時、右が手を離した時。


#画面がブラックアウトする
手をかざしてから1秒ほどすると、画面がブラックアウトしました。
通話時の誤操作を避けるための機能みたいで、今のところ公開されてるAPIでどうにもできなさそう。
Stack Overflow : [Keep display on when the proximity sensor is covered](http://http://stackoverflow.com/questions/27147847/keep-display-on-when-the-proximity-sensor-is-covered)

ちなみに、試しに画面がブラックアウトしてる状態でNSTimerを使ってみたら動いていたので、画面が消えているだけみたい。

#メソッドは値が変わった時しか呼ばれない
当たり前かもしれないですが、近接センサーはBool値で制御される（距離は計れない）ため通知センターからは値が変わった時しかメソッドが呼ばれません。
手をかざしている時間などを知りたい場合は、タイマーなどを併用する必要がありそうです。

#まとめ
近接センサーの使い方がわかりました。
今後、アプリに活かしたいと思います。
DNSサーバ構築ソフト　BINDの設定ファイル記述メモ

#  BIND設定ファイルのステートメント

　BINDはDNSサーバを構築するためのソフトウェア。
そのBINDの設定ファイルである`/etc/named.conf`の
ステートメントについて纏める。備忘の意味も含めて

## aclステートメント

　ACL(Access Control List)を定義してDNSサーバに
アクセスするIPアドレスなどを設定する。

##### 記述例
    // internals はACL名
    acl internals {
      // アドレスリスト記述部
      192.168.1.1
      192.168.12.0/24
    };


## includeステートメント
ファイルパスを記述して外部ファイルを取り込む

##### 記述例
    include "/etc/file.key";

## optionsステートメント
下記オプションを設定してnamedの動作を設定する。

|オプション|説明|
|:--|:--|
|directory|ゾーンファイルが格納されているディレクトリ|
|datasize|データセグメントサイズ上限値|
|coresize|コアファイルサイズ上限値|
|max-cache-size|最大キャッシュサイズ（バイト）|
|recursion|再帰的問合わせ設定（yes/no）|
|recursive-clients|再帰的問い合わせをするクライアントの最大同時接続数|
|allow-recursion|再帰的問い合わせを受け付けるホスト|
|allow-transfer|ゾーン転送を許可するホスト|
|allow-update|ゾーン情報の動的アップデートを受け付けるホスト|
|blackhole|問い合わせを受け付けないホスト|
|forwarders|問い合わせの回送先DNSサーバ（IPアドレス）|
|forward|forwardersの回送方法|
|notify|ゾーンデータの更新をスレーブサーバに通知するか否か|
|version|バージョン表示|

## controlsステートメント
DNSサーバを操作できるホストやIPアドレス、ポート番号を設定する

##### 記述例
    contorols {
      inet 127.0.0.1 allow { localhost; };
    }

## zoneステートメント
ゾーンファイルの名前、場所、タイプを設定する

|タイプ|意味|
|:--|:--|
|hint|ルートDNSサーバを指定|
|master|指定したゾーンに対してマスターDNSサーバ|
|slave|指定したゾーンに対してスレーブDNSサーバ|

##### 記述例1
    zone "sample1.net" {
      type master; // タイプ
      file "sample1.net.zone"; // ゾーンファイル
    }

##### 記述例2
    zone "sample2.net" {
      type slave; // タイプ
      file "sample2.net.zone"; // ゾーンファイル
      master { 192.168.11.20; };
    }

#### 参考文献
  中島能和 『LINUX教科書 LPICレベル2 Version4.0対応』 第二版 2014
,とCSSだけでHello,World

半分遊び。

#本題

```html:html.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sample</title>
<link rel="stylesheet" href="css.css">
</head>
<body>
<span>,</span>
</body>
</html>
```
```css:css.css
span:before {
             content: "Hello"
}
span:after {
            content: "World"
}
```

#実行例
Hello,World
Rで判別分析いろいろ（11種類+ Deep Learning）

# Background
Rで使えるDeep Learningのパッケージ H2O の使い方を覚えたので、前回やった[「Rで判別分析いろいろ（11種類）」](http://qiita.com/nrhk/items/63731920bfeb2c879075)と比較してみた。

# Summary

### 使用したデータ（前回と同じ）
- 4601通のメールをspamとnon-spamに分類してあるデータ（57次元）
- 460通をテストデータ、残りを学習データに使った。

### 比較結果（前回11種類＋Deep Learning）
|手法|package|関数|正解率|チューニング|
|-----------|---|---|:--------:|---|
|Deep Learning|H2O|h2o.deeplearning|0.941|activation="RectifierWithDropout",<br>epochs=100,hidden=c(64,64,64,64),<br>rate=0.01,rate_annealing = 1e-7,<br>input_dropout_ratio = 0.1|
|線形判別分析|MASS|lda|0.896||
|非線形判別分析(2次式)|MASS|qda|0.837||
|k-Nearest Neighbor|class|knn|0.820|k=1|
|ナイーブベイズ|e1071|naiveBayes|0.720||
|Decision tree|rpart|rpart|0.889||
|Nural Network 3層|nnet|nnet|0.959|size=7, decay=0.3|
|Nural Network LVQ1|class|lvq1|0.763|k=5, alpha=0.23|
|SVM|e1071|svm|0.952|gamma=0.001381068, cost=512|
|Bagging|adabag|bagging|0.909||
|Boosting|adabag|boosting|0.959||
|Randam Forest|randomForest|randomForest|0.952|mtry=14|

### 結論

同一の問題にたいして、判別分析の手法をいろいろ試してみた
Deep Learningの結果は、0.941。一位集団（3層ニューラルネット、SVM、Boosting、Random Forest）よりちょっと悪い。

### 感想

けっこうパタメータのチューニングしたが、
やり方があまりよくなかったのかもしれない。
チューニングの途中では、0.950が出ていたんだけど、
実際に試してみるといまいち正解率が上がらない。
もっと経験を積めば解決するのかもしれない。

### References...１つだけ読むなら

http://www.slideshare.net/takashijozaki1/japan-r2014-tjo

やり始めたら、ほぼ同じ内容でほぼ同じデータセットのものを発見。
こちらでもDLあんまりな結果でした。
http://qiita.com/HirofumiYashima/items/68d56cfbab2834c1febb


# Details

````
#
# Deep leaning (H2O)
#

# dataset
library(kernlab)
data(spam)
dim(spam)
data<-spam
num<-10*(1:(nrow(data)/10))
data.test<-data[num,]
data.train<-data[-num,]


library(h2o)
h2o.init(nthreads=-1)
data.train.hex <- as.h2o(data.train)
data.test.hex <- as.h2o(data.test)

# model
M<-h2o.deeplearning(1:57,58,
                    data.train.hex,
                    activation="RectifierWithDropout",
                    epochs=100,
                    hidden=c(64,64,64,64),
                    rate=0.01,
                    rate_annealing = 1e-7,
                    input_dropout_ratio = 0.1
)

# prediction
P<-h2o.predict(M,data.test.hex)

# result
t<-table(data.test[,58],as.vector(P$predict))
a<-(t[1,1] + t[2,2]) / (t[1,1] + t[2,2] + t[1,2] + t[2,1])
A.dpl<-a
A.dpl
````

# References
1. http://qiita.com/nrhk/items/63731920bfeb2c879075
2. http://www.slideshare.net/takashijozaki1/japan-r2014-tjo
3. http://tjo.hatenablog.com/entry/2014/10/23/230847
4. http://qiita.com/HirofumiYashima/items/68d56cfbab2834c1febb