OmniAICreator/Qiita-1.07M huggingface dataset:
BOM付きUTF-8のCSVを作成する（Excel文字化け対策）


Excel 用の CSV を Rails で吐く必要があったのですが、BOM 無し UTF-8 だと文字化けしてしまうため、BOM を付けてやる必要がありました。

# CSV 作成に使用したメソッド
CSV を作る方法は色々あると思いますが、今回は`CSV.generate`を利用して CSV ファイルを作成しています。

* [RailsでMVCを意識してシンプルにCSV出力](http://qiita.com/necojackarc/items/39e0f0c438363f7084db)

Rails で CSV を出力する方法について調べたら、[見覚えのあるピンクアイコン](http://qiita.com/necojackarc)の記事が出てきたので、その方法をそのまま採用しました。

# 実装
`CSV.generate`は文字列をラップして CSV のオブジェクトとしてブロックに渡すメソッドらしいので、BOM を引数に渡せば BOM 付きになります。

```ruby:foo.csv.ruby
require "csv"

bom = %w(EF BB BF).map { |e| e.hex.chr }.join
CSV.generate(bom) do |csv|
  :
end
```

以上！

# 参考
- [Character encoding issue exporting rails data to CSV](http://stackoverflow.com/questions/9639153/character-encoding-issue-exporting-rails-data-to-csv)
treeコマンドで正規表現を使って表示不要なファイルを非表示にする

pythonを書いていると、```env/```や```hoge.pyc```、```__pychache__```等、treeコマンドで表示されたくないものが多いのでメモ

```shell-session
$ tree -I 'env|*.pyc|__*
```
devise ログイン後のリダイレクトについて（GET編）

Rails の Devise でログイン後はログインする直前のページにリダイレクトさせます。

##Deviseのデフォルト動き

before_action :authenticate_user!を通して、ログイン画面に遷移する場合、ログイン後、ログイン直前の画面に戻します。

下記のようなredirect_toを利用して、ログイン画面に遷移する場合、ログイン後、元の画面に戻らなくて、root_pathに遷移します。

```
unless user_signed_in?
   redirect_to  new_user_session_path
```

##対策

ログイン直前のリクエストをセッションに保存しておいて、
ログイン成功後のafter_sign_in_path_forメソッドをオーバーライドして、戻る先をセッションから取得して設定します。
**注意**：ログイン関連のリクエストをセッションに入れないこと。

##ログイン直前のリクエストをセッションに保存


```lang:applictaion_controller.rb
class ApplicationController < ActionController::Base
  after_action  :store_location
  def store_location
    if (request.fullpath != "/users/sign_in" &&
        request.fullpath != "/users/sign_up" &&
        request.fullpath !~ Regexp.new("\\A/users/password.*\\z") &&
        !request.xhr?) # don't store ajax calls
      session[:previous_url] = request.fullpath 
    end
end
```

##deviseのリダイレクをカスタマイズ

devise標準のafter_sign_in_path_forをオーバーライドして、ログイン後のリダイレクト先はカスタマイズします。
SessionsControllerをカスタマイズしなければ、applictaion_controller.rbに追加します。
SessionsControllerをカスタマイズすれば、カスタマイズしたコントローラ中に追加します。

```
class UsersSessionsController < Devise::SessionsController
  ・・・
  def after_sign_in_path_for(resource)
    if (session[:previous_url] == root_path)
      super
    else
      session[:previous_url] || root_path
    end
  end
end
```

参照
https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update
http://easyramble.com/friendly-forwarding-redirect-on-devise.html
メソッド名に「send」が存在するクラスのプライベートメソッドテストではまったこと

## はまったこと

以下のクラスに対して、

```rb:test.rb
class Test

  def send
    'public method'
  end

  private

  def _private_method(param)
    "param is '#{param}'"
  end
end
```

プライベートメソッド「_private_method」のテストコードを書き、

```rb:test_spec.rb
require_relative 'test'

describe Test do
  let(:instance) { described_class.new }

  describe '#_private_method' do
    subject { instance.send(:_private_method, param) }
    let(:param) { 'aaa' }

    it 'プライベートメソッドが呼ばれること' do
      expect(subject).to eq "param is 'aaa'"
    end
  end
end
```

テストを実行。
すると、、、テストNGとなる。

```
$ bundle exec rspec test_spec.rb
F

Failures:

  1) Test#_private_method プライベートメソッドが呼ばれること
     Failure/Error: subject { instance.send(:_private_method, param) }

     ArgumentError:
       wrong number of arguments (2 for 0)
     # ./test.rb:3:in `send'
     # ./test_spec.rb:7:in `block (3 levels) in <top (required)>'
     # ./test_spec.rb:11:in `block (3 levels) in <top (required)>'

Finished in 0.00066 seconds (files took 0.0703 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./test_spec.rb:10 # Test#_private_method プライベートメソッドが呼ばれること
```

## 原因

プライベートメソッド「_private_method」をコールしようとしている箇所

```rb:test_spec.rb
subject { instance.send(:_private_method, param) }
```
が、実際にはパブリックメソッド「send」がコールされてしまっている。
その結果「send」には引数が存在しないため、

```
ArgumentError:
       wrong number of arguments (2 for 0)
```

のエラーが発生してしまっている。

## 解決方法

×`Object#send`
↓
○`Object#__send__`
にすることで正しくコールされた
~~正しい解決法なのだろうか。。。~~
[参考URL](http://docs.ruby-lang.org/ja/2.3.0/method/Object/i/__send__.html)


```rb:test_spec.rb
require_relative 'test'

describe Test do
  let(:instance) { described_class.new }

  describe '#_private_method' do
    # subject { instance.send(:_private_method, param) }
    subject { instance.__send__(:_private_method, param) }
    let(:param) { 'aaa' }

    it 'プライベートメソッドが呼ばれること' do
      expect(subject).to eq "param is 'aaa'"
    end
  end
end
```
devise ログイン後のリダイレクトについて（POST編）

Rails の Devise でログイン後に、ログインする直前のPOSTリクエストにリダイレクトさせる方法を共有します。

## 目標
deviseログイン後、GETリクエストにリダイレクトできますが、POSTリクエストにリダイレクトできないです。
下記の場合、お気に入り登録が出来ないし、お気に入り一覧にリダイレクトできないです。
**未ログイン⇒商品詳細⇒お気に入り登録（POST）⇒ログイン画面⇒ログインする⇒お気に入り一覧**
目標は認証成功後、ログイン直前のお気に入り登録（POST）にリダイレクトできることです。

## 対策
POSTリクエストなので、直接遷移が出来なくて、after_login_to_postを作成して、
ページの自動サブミットを通して、POSTリクエストにリダイレクトを実現します。

## 動き
未ログイン⇒商品詳細⇒お気に入り登録（POST）⇒ログイン画面⇒ログインする⇒after_login_to_post⇒真っ白ページ（自動サブミット）⇒お気に入り一覧

## セッションに POST リクエストのパラメータを保存
POSTリクエスト中で、POSTリクエストのパラメータ、コントローラ、アクションをセッションに保存します。

```
class CustomersFavoritesController < ApplicationController
  def create
    if current_customer.signed_in?
      current_customer.favorites.create(product_id: params[:id]) unless current_customer.favorites.find_by(product_id: params[:id])
      redirect_to action: :index
    else
      #セッションに POST リクエストのパラメータを保存
      session[:after_login_to_post] = {
        controller_name: controller_name,
        action_name: action_name,
        params: { id: params[:id] }
      }
      redirect_to ログインパス
    end
  end
end
```

## ログイン後のリダイレクトをカスタマイズ
ログイン後、セッションにPOST情報があれば、after_login_to_post_pathにリダイレクトさせます。

```
class CustomersSessionsController < Devise::SessionsController
  # ログイン後、リダイレクト先メッソドafter_sign_in_path_forをオーバーライドする。
  def after_sign_in_path_for(resource)
  　#お気に入り登録（POST）の場合、after_login_to_post_pathに遷移します。
    if session[:after_login_to_post]
      after_login_to_post_path
    else
      super
    end
  end
end
```

## ログイン後にセッション情報からログイン直前のページ情報を復元
セッション情報から、POSTリクエストの情報を取得し、設定します。

```lang:after_login_to_post_action
class TopController < ApplicationController
  def after_login_to_post
  　#セッションにafter_login_to_postがあれば、
    if session[:after_login_to_post]
      @back_controller = session[:after_login_to_post]['controller_name']
      @back_action = session[:after_login_to_post]['action_name']
      @params = session[:after_login_to_post]['params']
　　 #セッションをクリア
      session[:after_login_to_post] = nil
      render :after_login_to_post, layout: false
    else
      #直接アクセスが来たら、TOPに遷移する。
      redirect_to top_path
    end
  end
end
```

## 真っ白VIEW
after_login_to_postのVIEWは自動サブミットします。
一瞬だけ真っ白なページが表示されますが、
自動サブミットによって、POST送信が出来ます。

```lang:after_login_to_post.slim
doctype transitional
html[xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr"]
  head
    meta[http-equiv="Content-Type" content="text/html; charset=UTF-8"]
    title = '戻る'
  body onLoad="document.forms[0].submit()"
    - if @back_controller && @back_action && @params
      = form_tag( { controller: @back_controller, action: @back_action }, { method: 'post' } ) do
        = hidden_field_tag 'id', @params['id']
```

## routes

```
  ### ログイン後、POSTアクションに戻る ###
  get 'after_login_to_post', to: 'top#after_login_to_post'
```

参照
http://easyramble.com/cannot-post-redirect-on-rails.html
package-info.javaを書こう

下記のように、javadocのoverviewで、パッケージの概要（description）のコメントを表示させるには、各パッケージにpackage-info.javaを追加して、それにjavadocコメントをつければよいです。（画像はjoda-timeのものです。）

![overview.png](https://qiita-image-store.s3.amazonaws.com/0/9880/d0ac185b-ce11-c80c-1705-27fedab8c6c8.png)


```package-info.java
/*
 * パッケージの説明.
 */
package org.hoge.xxx;
```

Eclipseなら、パッケージを新規作成すると、一緒にこのファイルも作成[^1]してくれたりします。（昔はうぜぇとかいって、削除していた自分が恥ずかしい...）

ある程度パッケージ構成が固まってきたら、これにjavadocコメントをつけると、自分にも他の人にもパッケージの役割を明示することになるので、良いと思います。

## 参考サイト

http://www.ne.jp/asahi/hishidama/home/tech/java/javadoc.html

http://qiita.com/boss_ape/items/bc2100d60a17ad7c396a

http://cagesada.at.webry.info/201010/article_20.html

[^1]: 設定方法はこちらを参照：http://blogs.yahoo.co.jp/dk521123/32258969.html
【Swift】ジェネリクス（Generics）の書き方

# ジェネリクス（Generics）の書き方

## Genericsってそもそも何？
抽象化されたデータ型

と言われてもよくわかりませんよね・・・

## 例題
あるデータ(Int, String, Double)を指定数だけ配列化して戻すメソッドを作りなさい。

このような、お題、あなたならどうやって作りますか？

``` non_generics.swift
    func getIntArray(num: Int, count: Int) -> [Int] {
        var result = [Int]()
        for _ in 0..<count {
            result.append(num)
        }
        return result
    }

    func getStringArray(num: String, count: Int) -> [String] {
        var result = [String]()
        for _ in 0..<count {
            result.append(num)
        }
        return result
    }
```

こんな冗長なメソッドを作ってませんか！？
私もそうしてました・・・
でもGenericsなら引数と戻り値を抽象化して簡単に１メソッドで定義できます。

``` generices.swift
    func getArray<T>(num: T, count: Int) -> [T] {
        var result = [T]()
        for _ in 0..<count {
            result.append(num)
        }
        return result
    }
```

Javaとかでよく見かけますが、今まで抽象化するより型を縛るイメージでした。
他にも色々な使い方があるかもしれません。
ちなみに```<T>```はtypeという意味で慣例的に使われてますが、別になんでも良い(```<A>,<B>,<C>```)そうです。
今後はバンバンGenerics活用して行きます！
systemdについて調べたメモ


## systemd とは

systemdは従来 /etc/rc.d/init.d とかでサービスに対する起動/停止/再起動などの制御手順をシェルスクリプトとして記述していたものをもっと簡単な記述で実現できるようにしたもの。

## 設定ファイルの場所

systemd は起動したとき /etc/systemd/system/default.target を読み、それに依存するUnitを全て読み込み処理する仕組みになっている。

システムが提供する設定ファイルの本体は /usr/lib/systemd/system 配下に格納されていて、/etc/systemd/system 配下にシンボリックリンクが作成されている。

サーバ固有の設定等を行う場合は /usr/lib/sytemd/system から /etc/systemd/system ファイルをコピーして変更するか、/etc/systemd/system 配下にファイルを作成するのが流儀っぽい。

## 設定ファイルの中身

nginx.service の例

参考: [NGINX systemd service file | NGINX](https://www.nginx.com/resources/wiki/start/topics/examples/systemd/)

```
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

User=hoge
Group=fuga

[Install]
WantedBy=multi-user.target
```

## 現在稼働しているUnitを確認

例)稼働中のserviceの一覧

```
# systemctl list-units --type=service
```

## 全てのUnitを確認(現在稼働していないものも含む)

例)全serviceの一覧

```
# systemctl list-units --type=service
```

## システム起動時の自動起動のOn/Off

自動起動On

```
# systemctl enable nginx
```

自動起動Off

```
# systemctl disable nginx
```

## Unitの起動

```
# systemctl start nginx
```

## Unitの停止

```
# sytemctl stop nginx
```

## Unitの再起動

```
# sytemctl restart nginx
```

# 参考

* [はじめてのsystemdサービス管理ガイド ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/service-control-use-systemd/)
* [Systemd入門(1) - Unitの概念を理解する - めもめも](http://enakai00.hatenablog.com/entry/20130914/1379146157)
* [Systemd入門(2) - Serviceの操作方法 - めもめも](http://enakai00.hatenablog.com/entry/20130915/1379212787)
* [Systemd入門(3) - cgroupsと動的生成Unitに関する小ネタ - めもめも](http://enakai00.hatenablog.com/entry/20130916/1379295816)
* [Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも](http://enakai00.hatenablog.com/entry/20130917/1379374797)
* [Systemd入門(5) - PrivateTmpの実装を見る - めもめも](http://enakai00.hatenablog.com/entry/20130923/1379927579)
* [systemdの.serviceファイルで、実行ユーザーを指定する - Qiita](http://qiita.com/todanano/items/f66f1a3ad76f76de0772)
* [systemdでユーザーの環境変数を読み込むようにする | bacchi.me](https://bacchi.me/linux/systemd-tips/)
*
MySQLでの日付型の加算と減算

普通に `update_at < 数字`
の形式もいいけど、N日先や、Nヶ月先ってが調べられる

```
select count(*) from user where updated_at < DATE_SUB( now(), interval '31' DAY ) ;
```


```
例:現在から三ヶ月先
DATE_ADD(CURRENT_DATE(),INTERVAL 3 MONTH)

例:現在から一ヶ月前
DATE_SUB(CURRENT_DATE(),INTERVAL 1 MONTH)

加算にはDATE_ADD()関数、減算にはDATE_SUB()関数です。
```
docker-machineで特定のバージョンのdocker-engineをVirtualboxで使う

# 概要

docker-machineを使ってvirutalbox上に特定のバージョンのdocker-engine環境を用意したい。

# 結論

docker-machine create するときに、

--virtualbox-boot2docker-url に boot2docker.iso のイメージを指定する

```
docker-machine create --virtualbox-boot2docker-url "https://github.com/boot2docker/boot2docker/releases/download/v1.9.1/boot2docker.iso" -d virtualbox docker1.9.1
```

# 動機

docker-machine upgrade するとそとのときの最先端にはなるが、
特定の問題を引き起こすバージョンをみつけたかったので、特定のバージョンを指定したかった

## やったこと

なんとかオプションを特定できたので、つぎは、urlに指定するものが何かをしりたかった。

以前作ったイメージが何かマウントしているのかをvirtualboxで調べたら、boot2docker.isoをマウントしているようだったので、boot2docker iso で検索し、以下のサイトを見つける。

* [Releases · boot2docker/boot2docker](https://github.com/boot2docker/boot2docker/releases)

ここのisoのURLを指定して、上記のコマンドでマシンを作成した。

以前docker-machineで作った1.9.1がマウントしているイメージと、新しく作ったマシンを指定したイメージで、同じmd5だったので、この方法でよいのかなと考えている。
docker: dinghyでmysqlを立ててSequelProでつなぐ方法


[OSXでdockerを使いたいだけならVagrantを捨てdinghyを使ってみるといいかもしれない]で紹介した[dinghy]で、MySQLコンテナを起動し、そのDBにSequelProからアクセスする方法です。


## docker-composeの設定

```yml:docker-compose.yml
mysql:
  image: mysql:5.7
  ports:
    - "3333:3306"
  environment:
    MYSQL_ROOT_PASSWORD: mypass
    MYSQL_DATABASE: app
```

## SequelProの設定

<img width="858" alt="Sequel_Pro.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/bf96ddd4-82cc-453b-33cb-b76a394a178c.png">


ちなみに、ログを出すには[Docker: MySQLのクエリーログを確認できるようにしたい - Qiita](http://qiita.com/suin/items/95f15649a3ac39c8e9fb#comment-6ce6278e76eead57f297)を参照

[OSXでdockerを使いたいだけならVagrantを捨てdinghyを使ってみるといいかもしれない]: http://qiita.com/suin/items/c2ef8ff06b844be656cc
[dinghy]: https://github.com/codekitchen/dinghy
rails 4 升级笔记

rails 3
```
[1] pry(Ceshi::Application)> config.paths["config/locales"]
=> ["config/locales"]
[2] pry(Ceshi::Application)> config.paths["config/locales"].class
=> Rails::Paths::Path
[3] pry(Ceshi::Application)> config.paths["config/locales"].reverse
=> ["config/locales"]
[4] pry(Ceshi::Application)> config.paths["config/locales"].reverse.class
=> Array
[5] pry(Ceshi::Application)> config.paths["config/locales"].class.class                                                                                                                  
=> Class
[6] pry(Ceshi::Application)> config.paths["config/locales"].class.superclass
=> Array
[7] pry(Ceshi::Application)> config.paths["config/locales"].reverse == config.paths["config/locales"]
=> true
```

rails 4
```
[3] pry(Lala::Application)> config.paths["config/locales"].class
=> Rails::Paths::Path
[4] pry(Lala::Application)> config.paths["config/locales"].class.superclass
=> Object
```



config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly:

  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test environment)
  * production - set it to true


https://github.com/metaskills/less-rails/issues/111


gemfile 一定要指定版本

https://ruby-china.org/topics/1142
WPFのツールチップ

#ツールチップに日付を表示したり表示しなかったりする

```xml:
<Label ToolTipService.IsEnabled="{Binding Path=IsDisplayToolTip}">
    <ToolTipService.ToolTip>
        <TextBlock Text="{Binding Path=DataDate,StringFormat=データ日付:yyyy/M/d}" />
    </ToolTipService.ToolTip>
</Label>
```

参考：[（XAML#12）「データバインディングと書式指定」](http://blogs.itmedia.co.jp/mohno/2013/12/xaml12-2376.html)
MacOSXのメニューバーに定期実行したスクリプトの標準出力を出せるBitBarが地味に便利

# 概要
最近[Rebuild](https://rebuild.fm/)を聴いていて、
MacOSXのメニューバーに定期実行したスクリプトの標準出力を出すことの出来る[BitBar](https://github.com/matryer/bitbar)というツールを紹介していたので、
試しに使ってみたところ、地味に便利だったので紹介します。

※BitBarの推奨環境は以下です
requires Mac OS X Snow Leopard or newer (>= 10.6)

# インストール方法

BitBarのGitHubの[リリースページ](https://github.com/matryer/bitbar/releases)からダウンロードします。
※2016年3月現在だと、「BitBar-v1.8.0.zip」が最新でしたのでこちらをダウンロードします。
Download後、Bitbarのファイルを/Applicationsフォルダに移します。

# スクリプト格納先の指定

アプリケーションの起動すると、BitBarで定期実行したいスクリプトの格納先を指定するページが出てくるので、適当に作成したディレクトリを指定します。
問題なく設定できていればメニューバーにBitBarの表示が出てくるはずです。

![スクリーンショット 2016-03-18 午後1.27.28.png](https://qiita-image-store.s3.amazonaws.com/0/50185/f1041595-b01e-3700-9c39-5732bb17f29f.png)

# とりあえずテスト用のスクリプトを実行

とりあえず、以下のテストスクリプト「bitbar-test.10s.sh」を先ほど作ったフォルダに格納します。
※chmodでファイルに実行権限をつけるのを忘れないでください。`chmod +x bitbar-test.10s.sh`

```bash:bitbar-test.10s.sh
#!/bin/bash
echo "text | color=red" #色指定できる
echo ":speech_balloon:" #絵文字も使用可能
echo "---" # これより下はメニューバーには表示されない(メニューアイテムとして表示されます)
echo "qiita | href=http://qiita.com/LOUIS_rui" # linkも貼付けられる
date
```

上記が完了したら、BitBarのメニューアイテムのRefresh allを実行します。
![スクリーンショット 2016-03-18 午後1.39.29.png](https://qiita-image-store.s3.amazonaws.com/0/50185/1c0a5151-b8d6-a3bb-0762-58b297568d6c.png)

すると、メニューバーに「text」か「:speech_balloon:」が10秒おきに出てきます。
また、そこをクリックするとqiitaへのリンクや`date`コマンドの実行結果も出てきます。

![スクリーンショット 2016-03-18 午後1.41.22.png](https://qiita-image-store.s3.amazonaws.com/0/50185/5c7bbc82-d92f-71ae-abf4-eeaa3de2f8db.png)

# 使い方
スクリプトのファイル名は以下のように設定します。
{ファイル名}.{実行間隔}.{拡張子}

実行時間は秒、分、時、日で指定する事ができます。

10s 10秒おき
1m 1分おき
2h 2時間おき
1d 1日おき

なお、今回僕が作成したファイル名は「bitbar-test.10s.sh」ですので、
10秒おきにスクリプトを実行する事ができます。

新しくスクリプトを置いたら、Refresh allを行いBitBarに反映します。

# プラグインもあります

自作スクリプトのみならず、プラグインも実行可能です。
先ほど作ったフォルダ（BitBarPluginsとします）に以下のプラグインのレポジトリをcloneしてsymlinkを張ればオッケーです。

```
cd BitBarPlugins
git clone https://github.com/matryer/bitbar-plugins
# Rebuildで紹介していたHackerNewsを取ってくるスクリプトを有効にしてみました
ln -s ../bitbar-plugins/Web/HackerNews/hacker_news.rb hacker_news.1m.rb
```
※反映にはRefresh allを行います。

# 最後に

BitBarが地味に便利と冒頭言いましたが、僕の地味に便利なBitBarの使い方を最後に紹介します。

会社の部屋移動等でwifiが切れるとVPNを再接続しに行かなければならなかったのですが、
VPNが切れていた場合stokenを使って再接続するようなスクリプトをBitBarに置いて、
これを定期実行させる事で幸せな毎日が送れるようになりました。

ありがとう、BitBar！

参考：https://github.com/matryer/bitbar
Insert文一つでもデッドロックが発生する？

※この記事は推定が含まれます。
確実な裏付けをとっているわけではないことに注意してください。

間違っている点があればドンドン指摘してくださると嬉しいです。

## 発生していた問題
単純なinsert文でデッドロックが発生していた。
トランザクション内では問題が起きているinsert文しか実行していない。
ありがちな「複数のテーブルを更新する場合の更新順序のズレでのデッドロック」ではない。

正直目を疑ったけれど、これが現実なのよね……


## DBテーブルの状態

### DB
SQL Server

### トランザクション分離レベル
デフォルトの "READ COMMITTED"


### トリガー
```sql
after insert
as
	update hogehoge set insdate=getdate() where id in (select id from inserted)
```

```sql
after update
as
	update hogehoge set upddate=getdate() where id in (select id from inserted)

```

### インデックス

|インデックス種類|対象カラム|
|:--|:--|
|クラスタ化インデックス|id|
|非クラスタ化インデックス1|insdate|
|非クラスタ化インデックス2|upddate|


## 発生原因の推定
おそらくだけれど、トリガーが原因ではないだろうかと推定。
以下の流れでデッドロックが発生していると思われる。

1. ２つの画面（接続1と接続2）からほぼ同時に追加処理が呼び出される
2. 接続1でinsert実行
3. 接続2でinsert実行
4. 接続1でトリガ実行。しかし、接続2でレコードが追加されているため接続2の開放待ち※1
5. 接続2でトリガ実行。上と同様の理由で接続1の開放待ち
6. デッドロック＼（^o^）／

※1
実行されるupdate文でwhereで更新対象を指定している。
他の接続で追加されたレコードが対象に含まれるかもしれないため、他の接続の開放待ちとなる。



## 対策
トリガを辞めます。
今回問題が発生しているSQLを含め、hogehogeテーブルに追加更新しているSQLそれぞれで明示的にinsdate、upddateの値を設定するようにします。

……他の対策があればいいのだけど、見つからないのだよ

トリガをやめてみたところ、デッドロックは発生しなくなりました。
これで原因があっていたのだろう。

## 未調査、未確認の内容
### その他の対策として
今思えば、トランザクション分離レベルを "READ_COMMITTED_SNAPSHOT" にすれば良いだけのような気もします。

### その他の原因
また、SQLserverではクラスタインデックス、非クラスタインデックス間でのデッドロックが発生することがあるらしい。
[SQL SERVERにおけるデッドロック（内部仕様）〜クラスタ化インデックスと非クラスタ化インデックス間のデッドロック〜](http://bxdxmx.hatenablog.com/entry/20090820/1250746566)
今回もこれが発生した可能性も無きにしもあらず？
（でも、上記の対応でデッドロックが起きなくなったので、これは関係ないように見える）
如何调试rails migration

http://stackoverflow.com/questions/753919/run-a-single-migration-file

http://stackoverflow.com/questions/7287250/run-migrations-from-rails-console


```rb
require 'pry'

class AddExternalSystemId < ActiveRecord::Migration

  def up
  	Rails.application.paths["app/models"].each do |model_path|
  	  Dir["#{Rails.root}/#{model_path}/*/*.rb"].each { |file| require file }
  	end
  	models = ActiveRecord::Base.send(:subclasses)
  	binding.pry
  	tables = models.delete_if {|a| a.to_s =~ /Cmi::MdmRelations|Irm::GlobalSetting|Delayed::Backend::ActiveRecord::Job|ActiveRecord::SessionStore::Session/i }.delete_if {|a| a.column_names.include?("external_system_id") }.map {|a| a.table_name }
  	binding.pry
  	tables.each do |table_name|
  		begin
		  	add_column table_name, :external_system_id, :string, :limit => 32
		  rescue Mysql2::Error
		    binding.pry
		    puts table_name
		    next
		  end
  	end
  end

  def down
  	tables = ActiveRecord::Base.connection.tables.map {|a| a.to_sym }
  	binding.pry
  	tables.each do |table_name|
  		begin
	  		remove_column table_name, :external_system_id
	  	rescue ActiveRecord::StatementInvalid
	  		next
	  	end
  	end
  end

end

```
Book Release: Docker High Performance

Originally posted in http://espinosa.io/blog/2016-03-17-release-docker-high-performance.html

My book project with Packt Publishing has been released last January. The book
is composed of various tricks on using Docker I've collected under my sleeve.
In addition, I have also written how I think Docker relates to classic thoughts
in Web Operations like continuous delivery, capacity planning, etc.

The following are some links where it is available both in print and online:

* [Amazon](http://amzn.com/1785886800)
* [Packt Publishing](https://www.packtpub.com/networking-and-servers/docker-high-performance)

For questions and comments regarding the Code samples in the book, you can file
them as GitHub Issues in
[dockerhp/code-samples/issues](https://github.com/dockerhp/code-samples/issues).

Here is the complete bibliographical information when citing the book in IEEE
format:

> A. Espinosa, *Docker High Performance.* Birmingham, UK: Packt Publishing, 2016.


![Book Cover](https://www.packtpub.com/sites/default/files/6805OS_4961_Docker%20High%20Performance.jpg)
OSXでdockerを使いたいだけならVagrantを捨てdinghyを使ってみるといいかもしれない

OSXでdockerを使った開発環境を組もうとすると、docker入りのVagrant boxを自作しないとならなかったり、docker-machineのファイル共有をセットアップする必要があったりと、開発を始めるまでの手間が多い。

[dinghy]は上記のような手間を省略し、OSXとdocker環境をシームレスにしてくれるプロダクトで、次の特徴がある。

* ホストマシン(OSX)側のファイルをコンテナにマウントできる
* マウントだけでなくファイルシステムのイベントもサポートする。つまり、webpackなどのファイル更新を検出してタスクを走らせるツールと相性がいい。
* DNSを内包しているので、Macの/etc/hostsを書き換えたり等、自前で名前解決が不要。
* HTTPプロキシを内包しているので、1つのVMに複数のウェブアプリを簡単に起動できるようになっている。
* docker-compose.ymlがそのまま使える。つまりdinghy用に大きなカスタムは不要。

## 導入方法

Docker三種の神器を入れておく。

```bash:💻ホストマシン
brew install docker docker-compose docker-machine
```

dinghyも入れる。

```bash:💻ホストマシン
brew tap codekitchen/dinghy
brew install dinghy
```

あと、Virtualboxも入ってなければ入れておく。

## dinghyの仮想マシンを作る

仮想マシンを作る:

```bash:💻ホストマシン
dinghy create --provider=virtualbox
```

しばらくすると仮想マシンが起動するので、docker用の環境変数をdinghyで調べてセットする。

```bash:💻ホストマシン
dinghy shellinit
    export DOCKER_HOST=tcp://192.168.99.100:2376
    export DOCKER_CERT_PATH=/Users/suin/.docker/machine/machines/dinghy
    export DOCKER_TLS_VERIFY=1
    export DOCKER_MACHINE_NAME=dinghy
```

環境変数のセット:

```bash:💻ホストマシン
eval $(dinghy shellinit)
```

ホストマシンで`docker ps`を実行してみる。今回は、証明書がinvalidになっていたので、証明書を再作成して解決。

```console:💻ホストマシン
% docker ps 
An error occurred trying to connect: Get https://192.168.99.100:2376/v1.22/containers/json: x509: certificate is valid for 192.168.99.101, not 192.168.99.100
```

証明書の再作成:

```bash:💻ホストマシン
docker-machine regenerate-certs dinghy
```

参考: [x509 certificate error on switching networks · Issue #136 · codekitchen/dinghy](https://github.com/codekitchen/dinghy/issues/136)


`docker images`で調べると、既にdinghyのリバースプロキシが入っている。

```console:💻ホストマシン
% docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
codekitchen/dinghy-http-proxy   2.0.3               1ad9531485c1        2 weeks ago         248.5 MB
```

## docker-composeでファイル共有をやってみる

ホストマシン上のファイルをdockerコンテナに共有するためのdocker-composeの書き方を試してみる。今回はPHPのコンテナを起動してみる[^なぜPHP]。

[^なぜPHP]: ファイル共有を試すだけならnginxでもよかったが、公式のnginxイメージはサーバ名がlocalhost固定で、dinghyが発行するサーバ名に対応するのが面倒だったのでPHPのビルトインサーバを使うことにした。

ホストマシン側に共有するコードを作っておく。

```bash:💻ホストマシン
mkdir src
echo '<?php phpinfo();' > src/index.php
```

docker-composeの設定を書く。ポイントは、`volumes`のホストマシン側のパスは相対パスにしておくこと。ちなみに、`expose`のポート番号と`environment`の`VIRTUAL_HOST`をセットしておくことで、dinghyがDNSにそのホスト名を登録してくれるので、ホストマシンからはそのホスト名でアプリにアクセスできるようになる。

```yaml:docker-compose.yml
web:
  image: php
  command: php -S 0.0.0.0:8080
  expose:
    - "8080"
  environment:
    - VIRTUAL_HOST=php.docker
  working_dir: /code
  volumes:
    - ./src:/code
```


```bash:💻ホストマシン
docker-compose up -d
```

http://php.docker/ にアクセスするとPHPの情報が表示される。

ファイルを追加してみる:

```bash:💻ホストマシン
echo '<?php var_dump($_SERVER);' > src/server.php
```

http://php.docker/server.php にアクセスすると追加したプログラムの実行結果が表示される。


## おわり

dinghyを使うことでVagrantをメンテしなくて良くなる。Vagrantまわりで苦労している場合は、dinghyを試してみてはいかがだろうか。

## 参考

* [OSXでDockerを超高速化するdinghy - Qiita](http://qiita.com/masuidrive/items/d71ee1881fffb6ad098f)
* [dinghyでPHP-FPM環境をDocker上に構築してみた](https://suin.io/533)


[dinghy]: https://github.com/codekitchen/dinghy
HTTPのGETパラメータ(Query String)の解釈の話

Query String って言ったり GETパラメータ って言ったりするけど、例のアレのことね。URL中の ? の後ろのヤツ。

Node.jsのquerystringモジュールに以下のようにデータを食わせてみた。

```js
var qs = require('querystring');
var ab = {
  a: [1, 'ei'],
  b: [2, 'bee'],
};
console.log(qs.stringify(ab));
// a=1&a=ei&b=2&b=bee
```

＼a=1&a=ei&b=2&b=bee／　Σ(゜ω゜)

あれ、おかしくね？と思うわけですよ。「a[0]=1&a[1]=ei&b[0]=2&b[1]=bee」じゃねーの？と。

まぁ、普段PHPも触ってるんでね。
PHPの$_GETの解釈だと「a[0]=1&a[1]=ei&b[0]=2&b[1]=bee」と「{a: [1, 'ei'], b: [2, 'bee']}」で等価なんです。
厳密には違うかもだけどほぼほぼ等価。コーディング時に困らない程度に等価。

で、件の「a=1&a=ei&b=2&b=bee」を$_GETに解釈させるとどうなったか・・・

```php
echo json_encode($_GET);
// {"a":"ei","b":"bee"}
```

＼{"a":"ei","b":"bee"}／　・・・(＝ω＝)

知ってた知ってた。後ろの値で上書きね。そうだよね。


さて、どうしようかな・・・(´・ω・｀)

【追記】
[qs](https://github.com/ljharb/qs)　モジュール使ったら大体思った通りになった。

```js
var qs = require('qs');
var ab = {
  a: [1, 'ei'],
  b: [2, 'bee'],
};
console.log(qs.stringify(ab));
// a%5B0%5D=1&a%5B1%5D=ei&b%5B0%5D=2&b%5B1%5D=bee
console.log(decodeURIComponent(qs.stringify(ab)));
// a[0]=1&a[1]=ei&b[0]=2&b[1]=bee
```
俺的PostgreSQL9系postgresql.confチューニング

PostgreSQL9系の設定要所について自分が思う所をまとめてみました

1.チェックポイント周り設定

```
checkpoint_completion_target　0.8
checkpoint_segments　　　　　　6    ※ 但し9.4まで。9.5からこのパラメータは廃止。
checkpoint_timeout　　　　　　 30min
```

※更新メインなら「checkpoint_completion_target」は1に限り無く近くても可能(但しサーバ負荷は増大)

2.接続設定系

```
listen_addresses　　　　　'*'
port　　　　　　　　　　　 {デフォルト以外のポート指定}
```

3.ログ周り設定

```
log_destination　　　　 　　　　　 stderr
log_directory　　　　　　 　　　　 /var/log/pg_log/
log_filename　　　　　　　　　　　　postgresql-%d.log
log_line_prefix　　　  　　　　　  [%m][%p][%u][%d][%h][%e]
log_rotation_age　   　　　　　　  1d
log_truncate_on_rotation　　　　　 on
```
※ログを「/var/log/pg_log/」に切り出す場合mkdirとchownは適切に設定して下さい。

4.SSD用設定
→物理サーバ上での設定の場合以下のパラメータで性能が上る可能性があります。

`random_page_cost　　　　　4.0`


5.メモリ周り設定

```
effective_cache_size				メモリ総量の1/4
maintenance_work_mem				メモリ総量の1/256
shared_buffers						メモリ総量の1/4
temp_buffers						メモリ総量の1/128
wal_buffers							メモリ総量の1/512
work_mem							メモリ総量の1/2048
```

但し、メモリ領域の確保する総量に関しては同一サーバ内にApache等が構成されている場合、領域を食い尽くす事によるSWAP発生も考慮しましょう。

以上、ご参考まで。
yasnippetを使いこなすための第一歩

具体的にはバンドルスニペットを使いこなすための情報を記載する。自作スニペットについては述べない。

## 本記事を読む価値のある人

* yasnippetが何をしてくれるツールであるかは知っている
    * https://github.com/capitaomorte/yasnippet
* 自分でM-xコマンドを打つ程度にEmacs操作に慣れている
* 自分のマシンで使える各メジャーモードのスニペットは把握できていない

## 現在のメジャーモードのスニペットを把握する

スニペットは各メジャーモードごとに有効/無効になっている。現在のメジャーモードで有効なスニペットを確認するのは以下のコマンド。

<pre>
M-x yas-describe-tables
</pre>

これでYASnippet tablesバッファに現在のメジャーモードで有効なスニペット一覧が確認できる。
このコマンドで現在使えるスニペットを知るだけでもだいぶ捗るはず。

helmを使っている人であれば`helm-c-yasnippet`を使えばスニペットのインクリメンタルサーチができるのでこれで身につけていくのもありかもしれない。


## 公式バンドルスニペット集を把握する

以下のGithubレポジトリに色々なメジャーモードのofficialスニペットが公開されている。
https://github.com/AndreaCrotti/yasnippet-snippets

これらのメジャーモードのスニペットはyasnippetをインストールした際にバンドルされているはず。公式スニペットがあるにもかかわらず，自分の環境で`M-x yas-describe-tables`でスニペットを確認できないようであれば`yas-snippet-dirs`にスニペットを読み込ませる設定を追加ことをお勧めする。
（内容を理解せずにWeb上の設定をコピペしただけの場合，デフォルトの`yas-snippet-dirs`を上書きしてしまっていることもある）

## メジャーモード間の親子関係を理解する

各メジャーモード間には親子関係を設定することができ，子は親のメジャーモードのスニペットも使える仕様になっている。

バンドルされている各言語のメジャーモードでバンドルスニペットが設定されていたりするが，自分でインストールした3rdパーティーのメジャーモードにはスニペットが登録されていなかったりする。その場合に上記の仕様が役に立つ。

例えば， js2-modeでjavascript-modeのバンドルスニペットを使いたい場合，js2-modeの親をjavascript-modeに設定すれば良い。設定の仕方としては js2-modeのyasnippetディレクトリ内に.yas-parentsファイルを作成し，そこでjavascript-modeと記載する。実装例は[こちら](https://github.com/takuma510/conffiles/commit/19b2d4a37f531b83e25e9958cc8e651769340c3f)。

ref. https://capitaomorte.github.io/yasnippet/snippet-organization.html

## より詳細に

本記事で紹介したコマンド含めた，Major Commandは[コード](https://github.com/capitaomorte/yasnippet/blob/master/yasnippet.el)のドキュメント（Commentary）に記載されている。

## おわりに

上記の情報で，日常的にyasnippetを使う習慣が作れるのではないだろうか。

まずバンドルされているスニペットを使う習慣がついてきた後にオレオレスニペットを登録するというさらに高度な技を身につけていく方が個人的には良い気がしている。
kintone と Airtable のAPI連携

#Kintone からの Airtable API 呼び出し

Airtable 側は、呼び出されるAPI しかありませんので連携は、kintone 側からの API 呼び出しになります。
試しに、kinotne カスタム一覧で、Airtable の BASE 「kintone プラグイン一覧」のレコードを取得します。

#Airtable のBASE データ

取得する Airtable の BASE (データベース)です。

![airtable21.png](https://qiita-image-store.s3.amazonaws.com/0/100572/b04ef7c5-ec4d-ba97-af3e-51e557603b32.png)

#Airtable API ドキュメント

BASE の HELP メニューから、API docs をクリックすると、curl による API の呼び出し方が表示されます。

![airtable22.png](https://qiita-image-store.s3.amazonaws.com/0/100572/4b0c873c-cf33-783f-0969-63e9f71df65c.png)

#kintone JavaScript からの Airtable API 呼び出し

カスタム一覧画面から、Airtable API の呼び出しを行います。

```
jQuery.noConflict();
(function($) {
    "use strict";
    kintone.events.on("app.record.index.show", function(event) {
        if (event.viewId != 5263639) {
            return;
        }
        
        // Airtable GET Records
        var strUrl = "https://api.airtable.com/v0/appodFvpeKE2xc4tX/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3?";
        strUrl += "view=kintone%20%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%B8%80%E8%A6%A7";
        strUrl += "&maxRecords=10";
        var headers = { "Authorization" : "Bearer YOUR_API_KEY" };
        kintone.proxy(strUrl, 'GET', headers, {}).then(function(args) {
            /*  args[0] -> body(文字列)
             *  args[1] -> status(数値)
             *  args[2] -> headers(オブジェクト)
             */
            console.log(args[1], JSON.parse(args[0]), args[2]);
        }, function(error) {
            console.log(error);  //proxy APIのレスポンスボディ(文字列)を表示
        });
 
    });
})(jQuery);
```

#API 実行結果

簡単なコードで、Airtable API の実行が出来ました。
kintone に比べると、応答されるレコード情報の構造がシンプルです。

![airtable20.png](https://qiita-image-store.s3.amazonaws.com/0/100572/1725ccd4-94fb-0f15-22f6-a9ebbf6a5199.png)
(c++11)chronoを用いた時間計測(タイムスタンプのとり方)

(c++11)How to use "chrono(c++11)" for timestamp.

#Abstract
 chronoとは, c++11で追加された精度に優れた時間ライブラリであり, gccやclangだけではなくvisual studioでも用いることができる.
しかし, 一方でchronoの扱いづらさの指摘もある.

>[本の虫: C++11の時間ライブラリ: chrono](http://cpplover.blogspot.jp/2012/05/c11_24.html)
>>問題は、これらのコンセプトを学ぶのに、労力がかかるという事だ。私は規格を読めるし、Boostや標準化委員会での議論の経緯も知っているからいいものの、通常のユーザーがプログラミング言語をただ使うためだけに、規格や規格制定時の議論や背景の理解を必要とするべきではない。 

また,"gettimeofday"はLinuxのような処理系で用いられてきた.しかし, gettimeofdayで用いられるtimezone構造体はobsolete(すたれた, 時代遅れの, もはや用いられない)であり( http://man7.org/linux/man-pages/man2/gettimeofday.2.html ), かつOSを制限する.

そこで, chronoを用いた時間計測の簡単化に取り組む.

#Chrono
chronoを用いた処理時間の計測の一般的な使い方は以下である.
>引用:[C++でフリープラットフォームな時間計測](http://qiita.com/yukiB/items/01f8e276d906bf443356)

```cpp:
#include <iostream>
#include <chrono>

int main(){
 std::chrono::system_clock::time_point  start, end; // 型は auto で可
 start = std::chrono::system_clock::now(); // 計測開始時間
// 処理
 end = std::chrono::system_clock::now();  // 計測終了時間
 double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count(); //処理に要した時間をミリ秒に変換

}
```
型はautoでいいとしても, 関数を覚えたりTemplateを理解していないと使いにくい.
そこで, 以下のようなコードを書きたい.

```cpp:
int main(){
 double start,end;
 start = get_time_sec();
 // 処理
 end = get_time_sec();
 double elapsed=end-start;
}
```
そのためのget_time_sec()関数は以下のように設計した.

```cpp:
#include <chrono>
using namespace std::chrono;
inline double get_time_sec(void){
	return static_cast<double>(duration_cast<nanoseconds>(steady_clock::now().time_since_epoch()).count())/1000000000;
}
```

無理やりstatic_cast<double>でキャストしたけどもっといい実装あるかな...
終了
Check! Bluemix OpenWhisk ファーストタッチ 〜 ちょっと困ったこと対処メモ

こんばんは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
[OpenWhisk](https://new-console.ng.bluemix.net/openwhisk/ "OpenWhisk - IBM Bluemix") をドキュメントに従いながら動作確認していて、気づいたことをメモしていきます。基本的なことは、[ドキュメント](https://new-console.ng.bluemix.net/docs/openwhisk/index.html "Getting started with OpenWhisk") をご参照くださいませ。

困ったことと、その対処
====
パッケージを削除を削除するには？
----
先にアクションを削除しないと、パッケージを削除できないようです。

```bash
# パッケージを消そうとすると、空でないですよとエラーになります
wsk package delete mypackage
error: Package not empty (contains 1 entity) (code 130604)

# まずアクションを消します
wsk action delete mypackage/myaction
ok: deleted mypackage/myaction

# アクションをすべて削除した後、パッケージを削除できます
wsk package delete mypackage
ok: deleted mypackage
```

Bluemix の「組織」「スペース」と OpenWhisk の namespace について
----
### 「組織名」「スペース名」を変えると認証が通らなくなる
OpenWhisk の `namespace` は、Bluemix の「組織」「スペース」が割り当てられます。

そこで、Bluemix のコンソールから「組織」を変更してから `wsk` コマンドを使ってみたところ、以下のように認証が通らなくなりました。

```bash
# できるはずの操作ができない
wsk package delete mypackage
wsk error: The supplied authentication is not authorized to access this resource (code 130271)
```

こんなときは、一度元の組織と同名の組織を用意（組織名を変更 or 別途作成）すると操作できるようになりました。

### 「組織名」「スペース名」を変更したら、 property の設定を変更する
```bash
# 設定されているプロパティを取得する
wsk property get
whisk auth              xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
whisk API host          openwhisk.ng.bluemix.net
whisk API version       v1
whisk namespace         myOrg_mySpace
whisk CLI version       2016-03-03T09:55:47-06:00
whisk API build         2016-03-14T11:58:03-05:00

# namespace を新しいものにする
wsk property set --namespace "myNewOrg_myNewSpace"
ok: namespace set to myNewOrg_myNewSpace
```

この後、無事にコマンドが使えるようになりました。

### 備考: Bluemix 組織の削除について

Webのコンソールからは、組織の追加はできますが、削除はできません。ドキュメント [Administering](https://console.ng.bluemix.net/docs/admin/adminpublic.html#administer "Administering") には、サポートに連絡するよう記載がありました。

> Deleting an existing organization
> 
> Contact Bluemix registration and ID support to delete your organization.
> 
> Note: Deleting operations cannot be reversed. You lose all your applications and services that are associated with the organization.

なお、[BMXUG slack](http://bit.ly/1QzOgiC "BMXUG Slack 申し込みページ") でも質問してみたところ、CLI からなら組織を削除できるかもしれないとのことですが、確認すると [Bluemix Local](http://www.ibm.com/cloud-computing/bluemix/hybrid/local/ "IBM Bluemix Local - The power of cloud behind the firewall") または [Bluemix Dedicated](http://www.ibm.com/cloud-computing/bluemix/dedicated/ "IBM Bluemix Dedicated - The backbone of your enterprise cloud") での利用を想定しているようですので、ご利用の際はご確認くださいませ。

参考: [Bluemix admin CLI](https://console.ng.bluemix.net/docs/cli/plugins/bluemix_admin/index.html "Bluemix admin CLI")

```bash
cf ba delete-organization <organization>
```


OpenWhisk のダッシュボード
----
残念な点なのですが、 [Microsoft Edge](https://www.microsoft.com/ja-jp/windows/microsoft-edge "Microsoft Edge - マイクロソフト") だと、実行結果がプルダウンで表示されるところが表示されません…(;´Д｀) Google Chrome では表示されるようです。改善を期待します！

![20160316_openwhisk_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/849a60de-792e-44b9-d6f2-d2dce7c0408c.png)

Epilogue - おわりに
====
ちょこちょこ触って理解できて来たので、トリガーやパッケージを連結していろいろ試してみようと思います！
【MAXScript】3dsMaxの操作をMaya風に

#これはなに？

3dsMaxの操作をMAXScriptを使ってMaya風に切り替えたり戻したりします。


#Max → Maya


```lua:
(
	IInteractionMode.CurrentMode = #MayaMode
	MouseConfigManager.UserMode = #Maya
	print "Maya Mode"
)
```

IInteractionModeでビューポート操作を切り替えて
MouseConfigManager.MayaSelectionModeで選択モードをMaya風にするかどうか設定します。

InteractionMode
じゃなくて
『I』InteractionMode
なのが噛めば噛むほど味が出てくる感じ

#Maya → Max

```lua:
(
	IInteractionMode.CurrentMode = #3dsMaxMode
	MouseConfigManager.UserMode = #Max
	print "Max Mode"
)
```

#まとめ

ビューポートの操作とか選択のさせ方とかは
各ツールそれぞれに主義主張があってそれはまあいいんですが、
せめて一社で複数開発してるところはお手軽に可換にしてくれるとうれしい気がします

#参考

>IInteractionMode
http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_99E9991F_E246_41C8_A76F_AF5F341A1A52_htm


>MouseConfigManager
http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_724B14D0_06DC_424A_A6FE_8C494579ECA3_htm

特に**MouseConfigManager**については、さまざまなマウス操作について個別に設定をON/OFFできるようです。

たとえば、「とりあえず選択モードだけ」みたいな。

```lua:
MouseConfigManager.MayaSelectionMode = true  --maya

MouseConfigManager.MayaSelectionMode = false  --max
```
pusherを触ってみる

# pusherとは
 * プッシャーは、簡単かつ安全にウェブやモバイルアプリ、または他の任意のインターネット接続デバイスにWebSocketを介して、リアルタイムの双方向機能を統合し、迅速にするためのシンプルなホストされているAPIです。
 * www.pusher.com


# ログインから、サンプルデモまで

## アカウント登録
* http://pusher.com
* create a free accountボタンをクリックする
* 以下の登録画面が出る

![register.png](https://qiita-image-store.s3.amazonaws.com/0/13451/164324ed-06ce-312f-15c7-e70ddc5c77ad.png)

* 登録方法
    * Email/Password
    * Github
    * google

* 登録後に、メールでアカウントのアクティブティもやらないといけない
* 登録後のdashboard画面

![dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/13451/66d3525a-4d0a-3ea7-0bb7-511fb5cd110a.png)


## アプリを作成

* dashboard画面に、create an appボタンをクリックする
* 以下のアプリ作成画面が出る

![create_new_app.png](https://qiita-image-store.s3.amazonaws.com/0/13451/1886fbfc-e928-827b-751c-3537884ea064.png)

説明

* アプリ名
    * 「create apps for multiple environments」をチェックすると、同時に、development, staging, production三つのアプリを作れる
* cluster
    * デフォルトは、us-east-1が、「Want to request a different region?」をチェックすると、Tokyo regionも選択できる
* front-end techとback-end tech
    * 何でもOK
* share your app
    * 共同操作者を招待できるかもしれないが、今後は試してみる

* サンプルデモ用アプリを作ってみた

![created_app.png](https://qiita-image-store.s3.amazonaws.com/0/13451/8be74408-356e-c310-7226-166127486acd.png)




## サンプルコード実装

### クライアント側(JS)

```
<!DOCTYPE html>
<head>
  <title>Pusher Test</title>
  <script src="https://js.pusher.com/3.0/pusher.min.js"></script>
  <script>
    // Enable pusher logging - don't include this in production
    Pusher.log = function(message) {
      if (window.console && window.console.log) {
        window.console.log(message);
      }
    };

    var pusher = new Pusher('XXXXXXXXXX', {
      encrypted: true
    });

    var channel = pusher.subscribe('test_channel');
    channel.bind('my_event', function(data) {
      alert(data.message);
    });
  </script>
</head>
```


### サーバー側(php)

```
<?php
  require('vendor/pusher/pusher-php-server/lib/Pusher.php');

  $options = array(
    'encrypted' => true
  );
  $pusher = new Pusher(
    'XXXXXXX',
    'XXXXXXX',
    'XXX',
    $options
  );

  $data['message'] = 'hello pusher';
  $pusher->trigger('test_channel', 'my_event', $data);
?>
```

### 実行と結果

* サーバー側

```
php hello-pusher.php
```

* クライアント側

![hello_pusher.png](https://qiita-image-store.s3.amazonaws.com/0/13451/8ded8cbb-95eb-c95e-8234-3d4df593b92a.png)


# 課題

* クライアント側のJSコードを見て、何か変なことを発見してないか？
* 答え： 不安全か？
* そうだね。セキュリティですよね。
    * 'XXXXXXXX'のapp secretが、誰は見えて、コピーすると、サーバーと接続できてしまうな
   
```
    var pusher = new Pusher('XXXXXXXXXX', {
      encrypted: true
    });
```

* 次回は、クライアント側のJSコードのセキュリティ問題を検討しよう

## 参照

* Pusher API libraries
    * https://pusher.com/docs/libraries
* price
    * https://pusher.com/pricing
* Authenticating users
    * https://pusher.com/docs/authenticating_users
* JavaScript Quick Start Guide
    * https://pusher.com/docs/javascript_quick_start
El Capitan で　brew update したらコケた時に僕が対処した手順

##/usr/localのオーナーを変更
El Capitanから導入されたセキュリティにともなって(？)/usr/localのオーナーがroot:wheelとなったそうです。
このため、brew updateすると「書き込み権限ないぞー」って言うエラーが発生しました。
そこで、以下の2つのコマンドを実行しました。(${USER}には自分のユーザー名を入れてください)

```command
sudo chown -R ${USER} /usr/local
sudo chgrp staff /usr/local
```

下のでも良かったかも…

```command
sudo chown -R ${USER}:staff /usr/local
```

##/usr/localをgit pullする
コマンドは以下の通りです。

```
cd /usr/local && git checkout .
git fetch origin
git reset --hard origin/master
```

##brew updateする
上記の対応後「brew update」すると出来ました。

※僕の環境での話なので参考程度にしてもらえればと思います。
PrerenderでUserAgentがモバイルの場合にスマホ用のページをレンダリングさせる


2016年を迎えてもなお、GooglebotがバッチリJavaScriptを実行してくれているのかどうか微妙なご時世です。
こういった状況ではAngularJSなどを使ってSEOの対策が必要なフロントエンド開発をしていると（止むに止まれぬ事情もあるのです…）、どうしてもそれなりの対応をせざるを得ません。

下記記事のように[Prerender](https://github.com/prerender/prerender)(Node.JS + PhantomJS）を使った対策を行う場合、記事中で触れられているようにスマホ用のページを用意している場合にはそれ用のレンダリングをさせてやる必要があります。

- [Ameba OwndのSEOを支える技術 for AngularJS](http://ameblo.jp/principia-ca/entry-12038035812.html)

> ...GoogleはPCサイトのインデックスとスマホ向けのインデックスが分かれているため、PC/スマホで返すHTMLを分けなくてはいけません。...スマホ版のGooglebotにもPC向けのHTMLを返すようになってしまっていて、危うくスマホの検索結果からインデックスが消えてしまいそうになりました。

### Prerenderがユーザーエージェント無視する問題

しかし、モバイルのユーザーエージェントからPrerenderにリクエストをした場合でもPhantomJSから目的のページにリクエストする際には元々のユーザーエージェントは無視され、`PhantomJS/x.x.x ...`みたいなユーザーエージェントでリクエストされてしまいます。

そのため、Ameba Owndさんのようにユーザーエージェントを書き換えてやる必要がありますが、そんなこと忙しくてできないよ、という人のためにソレ用のモジュールをつくりまました。

## prerender-mobile-useragent

[obiyuta/prerender-mobile-useragent](https://github.com/obiyuta/prerender-mobile-useragent)

使い方は簡単で、npmでインストールしてPrerenderのserver.jsに1行書き加えてやるだけです。

```インストール
$ npm install prerender-mobile-useragent --save
```

```server.js
...
# この1行を追加
server.use(require('prerender-mobile-useragent'));
...
server.start();
```

これで元々のリクエストがモバイルからだった場合に、PhantomJSから対象のページへのリクエストもモバイルとしてリクエストされるようになります。

```
PhantomJS/x.x.x ... iPhone
```

※UAの判定には[express-useragent](https://github.com/biggora/express-useragent)を使用しています

### モバイルのユーザーエージェントを変更したい場合

デフォルトでは`iPhone`がモバイル用のエージェントとして追加されるようになっていますが、これでは都合が悪いという場合は任意のユーザーエージェント名を指定することができるようになっています。（複数指定したい場合などにも）

```
export MOBILE_USER_AGENT=Androidbrowser
```

いまさら感のあふれるトピックになってしまいましたが（書いたのも結構前だし…）、誰かのお役にたてれば嬉しいです。
OMakeでズンドコキヨシ

OMakeは高級すぎて面白くないなぁ。

```javascript:kiyoshi.om
kiyoshi(kc) =
  cur = $(eq $(mod $(random), 2), 0)
  if $(cur)
    print($"ズン")
    kiyoshi($(if $(eq $(kc), 4), 4, $(add $(kc), 1)))
  else
    print($"ドコ")
    if $(eq $(kc), 4)
      print($"キ・ヨ・シ！")
    else
      kiyoshi(0)

kiyoshi(0)
```

実行方法は、

```console
$ osh kiyoshi.om
```

です。
MacにHomebrewを使ってJenkinsをインストールする方法

MacにJenkins入れるのにHomebrew使うと簡単ということで。

以下の手順でHomebrewのインストールが完了した状態からスタート。
[MacにHomebrewをインストールする手順とWarningの解決方法 - Qiita](http://qiita.com/unsoluble_sugar/items/6ac1848ba1933ac05c76)
#環境
MacBook Pro (Retina, 13-inch、Early 2015)
OS X Yosemite バージョン10.10.5
#Jenkinsのインストール
ターミナルから以下コマンドを実行してインストール開始。

```
$ brew install jenkins
```

インストールにはちょっと時間がかかるよ。
<img width="1172" alt="スクリーンショット 2016-03-17 20.19.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/b9fc0d4a-f73c-4794-f132-fcb7e441643e.png">
しばらく待つと終わる。

#Jenkinsを起動する
以下コマンドでJenkinsを起動。

```
$ java -jar /usr/local/opt/jenkins/libexec/jenkins.war
```

初回起動はちょっと時間がかかるよ。
<img width="1200" alt="スクリーンショット 2016-03-17 20.23.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/b5f67d25-362a-fc00-d412-33b7de7cbd02.png">
デフォルトのポートは8080使うので、環境によっては変えたほうが良いかも。
##起動確認
ブラウザで http://localhost:8080 にアクセスしてみる。
<img width="1148" alt="スクリーンショット 2016-03-17 20.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/b55e5986-c4a4-40a7-432d-233a29389ec5.png">
Jenkinsおじさんが表示されればおｋ。

#Jenkinsを停止する
停止するときはターミナルで「control + C」叩いて終了。
これでいいのかしら。

#起動＆停止コマンドがちょっとよくわからなかった
Homebrewでインストールした場合、起動するときは毎回warファイル叩かないといけないっぽい？
とりあえず起動コマンドをIMEに単語登録した（適当

起動と停止は他に良い方法あれば教えてほしいです。
ORACLEのテーブル定義を確認する

Oracleではテーブル定義が```user_tab_columns```に保存されています。
ただし、格納されているのは型名や主キー,indexといった情報で制約に関しては取得することは出来ません。
なので制約定が必要な場合は```user_constraints```とJOINすれば制約ごと参照することが可能になります。


```sql
SELECT DISTINCT
    main.column_name AS カラム名,
    main.data_type AS データ型,
    main.data_length AS カラム長,
    CASE main.nullable
        WHEN  'N' THEN '×'
        WHEN  'Y' THEN '○'
    END AS NULL許可,
    sub.constraint_type AS 主キー,
    sub.last_change AS 最終更新日,
    sub.index_name AS インデックス名
    
FROM 
    user_tab_columns main
LEFT JOIN
    
       (SELECT
        col.column_name AS column_name, 
            con.constraint_type AS constraint_type,
            con.last_change AS last_change,
            con.index_name AS index_name,
            con.table_name AS table_name
        FROM 
            user_constraints con
        JOIN
            user_cons_columns col 
            ON
            con.constraint_name = col.constraint_name 
            AND
            con.table_name = col.table_name 
        WHERE
            con.constraint_type = 'P'  
        ORDER BY 
           con.table_name) sub
      
    ON 
    sub.column_name = main.column_name
    AND
    sub.table_name = main.table_name
WHERE 
    main.table_name = :table_name;

```
Twitter Streaming API の401エラーでハマったお話

個人で運営してるTwitter Streaming APIを使ったサービスで、突然401エラーが出るようになった。

原因がわからず結構ハマってしまったので、共有のために書いておく。

#### エラー内容
```
$ curl --request 'POST' 'https://stream.twitter.com/1.1/statuses/filter.json' --data 'track=twitter' --header 'Authorization: OAuth oauth_consumer_key="XXXXXXXXX", oauth_nonce="XXXXXXXXX", oauth_signature="XXXXXXXXX", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1458266283", oauth_token="XXXXXXXXX", oauth_version="1.0"' --verbose
* About to connect() to stream.twitter.com port 443 (#0)
*   Trying 199.59.148.138... connected
* Connected to stream.twitter.com (199.59.148.138) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_RSA_WITH_AES_128_CBC_SHA
* Server certificate:
* 	subject: CN=stream.twitter.com,OU=Twitter Security,O="Twitter, Inc.",L=San Francisco,ST=California,C=US
* 	start date:  4月 09 00:00:00 2014 GMT
* 	expire date: 12月 30 23:59:59 2016 GMT
* 	common name: stream.twitter.com
* 	issuer: CN=VeriSign Class 3 Secure Server CA - G3,OU=Terms of use at https://www.verisign.com/rpa (c)10,OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
> POST /1.1/statuses/filter.json HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: stream.twitter.com
> Accept: */*
> Authorization: OAuth oauth_consumer_key="XXXXXXXXX", oauth_nonce="XXXXXXXXX", oauth_signature="XXXXXXXXX", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1458266283", oauth_token="XXXXXXXXX", oauth_version="1.0"
> Content-Length: 13
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 401 Authorization Required
< cache-control: must-revalidate,no-cache,no-store
< connection: close
< content-length: 266
< content-type: text/html
< date: Fri, 18 Mar 2016 03:46:08 GMT
< server: tsa
< www-authenticate: OAuth realm="Firehose"
< x-connection-hash: 0bd058f2a8d6f55b19b3db5285ac134e
< 
<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n<title>Error 401 Unauthorized</title>
</head>
<body>
<h2>HTTP ERROR: 401</h2>
<p>Problem accessing '/1.1/statuses/filter.json'. Reason:
<pre>    Unauthorized</pre>
</body>
</html>
* Closing connection #0
```

### 状況
・アカウントが有効かどうかをチェックする https://api.twitter.com/1.1/account/verify_credentials のAPIは成功するので認証自体が失敗してるわけではない。

・REST APIは成功する。

・しかし、Streaming APIに関してはfilter.jsonもsample.jsonも401エラーで失敗する。

・ローカル環境では、filter.jsonもsample.jsonも成功する。

・サーバーのOpenSSL更新したのでそれが原因かと思って使用してるライブラリのCA用証明書を更新するも意味なし

### 原因

http://stackoverflow.com/questions/20594173/twitter-streaming-api-401-unauthorized

> If you're on Linux, sync your time with an NTP server

サーバーのNTPサーバーが止まってた。。

さくらVPSのハードウェア入れ替えでNTPサーバーが停止する可能性があるってメール着てたのに完全に忘れてた。。

認証に使う時間がおかしなことになってたから401エラーがきてたっぽい

### 解決

```
 # /sbin/service ntpd restart
```
PostgreSQL エラーメッセージが文字化け


自分用備忘録

PostgreSQLのエラーメッセージで以下のように文字化けで出力される

    ERROR: ??????"mst_table"???????

PostgreSQLの設定ファイルで以下のように変更することで英語で表示され、エラー内容がわかるようになる。

C:\Program Files\PostgreSQL\9.4\data\postgresql.conf

```text:postgresql.conf
＜変更前＞
lc_messages = 'Japanese_Japan.932'			# locale for system error message
```

```text:postgresql.conf
＜変更後＞
#lc_messages = 'Japanese_Japan.932'			# locale for system error message
lc_messages = 'en_US'
```

上記の変更後、PostgreSQLを再起動。
再度実行した結果以下のように英語で出力されます。

```
ERROR: relation "mst_table" does not exist
```
年と週番号から、その週の最初の日付文字列を得る

　年と週番号から日付を得る関数ってあるんだろうか。ない。ということでISO 8601準拠で書いた。

<pre>
public function week_start_date($year, $week_number=1) {
    $time = strtotime("{$year}-01-01");
    $week = date("w", $time);
    if($week>4 || $week==0) {
        $time = strtotime("next Monday", $time);
    } elseif ($week != 1) {
        $time = strtotime("last Monday", $time);
    }
    $week_number--;
    return date("Y/m/d", strtotime("+{$week_number} Week", $time));
}
</pre>

　エラー処理はしていません。関数名も気が利いてないし、ここから週の範囲も得られるようなオプションなど手を加えていこうかな、というところです。
Raspberry Pi > GPIO > Interrupts > Level-sensitive / Rising/falling edge / Asynchronous rising/falling edge

https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md

Several interrupt generation sources are configurable:

- Level-sensitive (high/low)
- Rising/falling edge
- Asynchronous rising/falling edge

レベルで検知。エッジで検知。まではわかる。

非同期のエッジ検知というのは初めて出くわした。

> At the system clock frequency, the pin is sampled with the criteria for generation of an interrupt being a stable transition within a 3-cycle window, i.e. a record of "1 0 0" or "0 1 1". Asynchronous detection bypasses this synchronisation to enable the detection of very narrow events.

3 cycleでなく`1 0`や`0 1`だけで検知ということだろうか。