OmniAICreator/Qiita-1.07M huggingface dataset:
SQLのテストをDockerでやるとすごく便利だった話

DBのダンプを取得して、少し加工して別DBサーバーに持っていく作業が必要でSQLのテストを行う際にDockerでDBサーバーを使ってみたらとても便利だったのでメモ

# 結論

+ DBサーバーの起動、破棄が高速でとても便利
+ PostgreSQLやMySQLの公式リポジトリがあるのでわざわざDockerfileを作らなくても良い。タグによって複数のバージョンもあるので試験環境も合わせやすい
+ docker commitコマンドによって任意のタイミングの状態のDBサーバーをイメージ化する事もできる(DDL定義後など)
+ DBが関係するようなテストでもDocker使うととても便利そう

# 参考

+ [DockerHub postgres](https://hub.docker.com/_/postgres/)
+ [MySQL, PostgreSQL ちょっとお試し用 Docker コンテナの起動と廃棄](http://qiita.com/knaka/items/5c1d6662fff3dea3ea35)
+ [psqlでパスワード入力を省略する](http://qiita.com/ozash/items/48b7701724f189c48814)

# やってみる

Dockerは既にインストール済みの想定

```bash
# PostgreSQLのイメージを取得。バージョン9.3.10のものを取得
$docker pull postgres:9.3.10

# psql時のパスワード省略するためにファイルを配置
$echo "*:5432:*:*:mysecretpassword" >> ~/.pgpass

# DBサーバー起動
$docker run --name test-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres:9.3.10

# SQLをテスト
$psql -h $(docker inspect --format "{{ .NetworkSettings.IPAddress }}" test-postgres) -U postgres -f abc_dump.sql

# psqlコマンドで登録内容を確認
$psql -h $(docker inspect --format "{{ .NetworkSettings.IPAddress }}" test-postgres) -U postgres

# 停止、破棄
$docker stop test-postgres
$docker rm test-postgres
```

以降、テストする際も同じ流れ(docker pullと.pgpassの配置以外）で簡単にテストができる。

`docker commit`コマンドを使えば任意のタイミングの状態のイメージが作成できるので、DDLのみ流した状態のイメージ作るのとかも簡単。
Cent OSへのNginxインストールと設定

# 検証環境

* さくらVPS（CentOS release 6.7）

# Nginxのインストール

こちらの記事を参照。
[CentOSにnginx最新をyumでインストール](http://qiita.com/youforce/items/4c1e8e998cf52a4cd7fa)

# Nginxの起動と自動起動設定

[Nginxインストールメモ > インストール](http://qiita.com/nenokido2000/items/3cbb76dac2b9940f339e#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

# Nginxの設定変更

Nginxの設定ファイルは下記ディレクトリに存在する。
`/etc/nginx/`
このディレクトリに`*.conf`ファイルを配置すると、各サーバの設定が可能である。

```example.conf
server {
        listen 8080;
        server_name dev.example.com;
        location / {
                root    /home/example/dev;
                index   index.html index.htm index.php;
        }
}
```
Raspberry Pi開発中で便利なツール（更新中）

# Check IP address of RaspberryPi

 Using the following command:

         arp-scan --interface スキャンを行うネットワークアダプタ(eth0など) -l

 Using ifconfig to specify network_adapter

```
$ sudo arp-scan --interface en6 -l
Interface: en6, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
xxx.xxx.xxx.xxx	xx:xx:xx:xx:xx:xx	Raspberry Pi Foundation
```

# Raspberry接続 by SSH command

       ssh pi@xxx.xxx.xxx.xxx

# Copy file from MAC to Raspberry

        scp /destination/filename pi@19X.XXX.XXX.XXX:destination/path 

(substituting raspberrypi.local for your device’s IP address)

# Internet接続設定(WIFI)

        sudo wpa_passphrase "NETWORK_NAME" "PASSWORD" | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf

# その他

* 再起動

        sudo reboot

* shutdownをする時はこちらのコマンドはいいですね！

        sudo shutdown -H now
Rails 4.0 enumerize最新版だとcan't write unknown attributeエラーになる

### Rails 4.0にバージョンアップ。bundle updateをしenumerizeも0.5から1.0にバージョンアップ
- Rails起動して動作させると以下エラー

```
can't write unknown attribute `role'
2015/11/09 14:21:08 [INFO] ::
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activerecord-4.0.13/lib/active_record/attribute_methods/write.rb:47:in `write_attribute'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activerecord-4.0.13/lib/active_record/attribute_methods/dirty.rb:70:in `write_attribute'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/enumerize-1.0.0/lib/enumerize/activerecord.rb:27:in `write_attribute'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/enumerize-1.0.0/lib/enumerize/attribute.rb:105:in `user_role='
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/enumerize-1.0.0/lib/enumerize/base.rb:109:in `public_send'
        /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/enumerize-1.0.0/lib/enumerize/base.rb:109:in `block in _set_default_value_for_enumerized_attributes'
```

### 実コードはこんな感じ。特に悪くなさそう

```.rb
enumerize :role, in: [:user, :admin], :predicates => true

```

### Gemfileを変更してgem enumerizeバージョンダウンする

```
gem 'enumerize', '0.7.0'

bundle update enumerize

```

- エラー解消。試してみたところバージョン[0.8.0](https://github.com/brainspec/enumerize/tree/v0.8.0)から動かなくなる。何が変わったの[かしら](https://github.com/brainspec/enumerize/blob/6e44e636a16f04111a4b10d630e169481f159a46/CHANGELOG.md)
capistrano3でデプロイ時に「connection closed by remote host」エラーが発生する場合の対処法

# Problem

デプロイ対象のhost数が多い場合、capistranoでデプロイした時に以下のエラーが発生します

```
$ bundle exec cap production deploy
...
SSHKit::Runner::ExecuteError: Exception while executing on host xxx.xxx.xxx: connection closed by remote host
```

# Solution

段階的にデプロイを実行するように、deploy.rbに以下のコードを追記します

```rb
# deploy.rb

module SSHKit
  class Coordinator
    private
      def default_options
        { in: :groups, limit: 5 }
      end
  end
end

...
```


# 参考

- [capistrano3 で並列数を制御する。](http://blog.livedoor.jp/sonots/archives/39007111.html)
- [How to specify global sshkit limit in capistrano deploy.rb file](http://stackoverflow.com/questions/21153519/how-to-specify-global-sshkit-limit-in-capistrano-deploy-rb-file)
JRubyからScalaの関数をつかう → はやい

# 乗るしかないこのビッグウェーブに

- [RubyからGoの関数をつかう → はやい](http://qiita.com/grj_achm/items/679b3f3af2cf377f0f02)
- [Crystalで書く → はやい](http://qiita.com/etmnk/items/2801cd09c6ec4439c8fd)
- [RubyからRustの関数をつかう → はやい](http://qiita.com/rejasupotaro/items/2aa57a67f4a97101950c)
- [RubyからGoの関数をつかわなくても再帰をやめる → はやい](http://mattn.kaoriya.net/software/20151106194958.htm)
- [Ruby で書く→速い](http://qiita.com/akaneko3/items/b909d51826597b9ec604)
- [Common Lispで書く→はやい](http://qiita.com/bori_so1/items/16b5e0e2d61e6b897fca)
- [Node.jsをつかう → はやい](http://qiita.com/ukiuni@github/items/3a5e8681edf2cdf1b54c)
- [Perl6からGoの関数をつかう → はやい?](http://qiita.com/B73W56H84/items/20a67b74bb646d140f7d)

なぜScalaがないのか。

# Scalaでのフィボナッチ数列

```scala:FibApp.scala
object FibApp extends App {
  def fib(n: Int): Int = {
    n match {
      case n if (n <= 1) => n
      case n => fib(n - 1) + fib(n - 2)
    }
  }

  println(fib(40))
}
```

```
$ scala -version
Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL

$ scalac FibApp
$ time scala FibApp
102334155
      0.74 real         0.73 user         0.06 sys
```

まずまずのパフォーマンスですね。(Rust、Crystalより遅いけどGoより速い?)

# JRubyから呼んでみる

皆さんもうJRubyの存在を忘れているのかもしれませんが、JRubyがあれば `require "ffi"` して Moduleでゴニョゴニョとかしなくても.classを簡単に呼ぶことができます!!


```scala:Fib.scala
object Fib {
  def fib(n: Int): Int = {
    n match {
      case n if (n <= 1) => n
      case n => fib(n - 1) + fib(n - 2)
    }
  }
}
```

```ruby:scala-fib.rb
require 'java'

java_import 'Fib'

puts Fib.fib(40)
```

```
$ ruby -v
jruby 9.0.0.0 (2.2.2) 2015-07-21 e10ec96 Java HotSpot(TM) 64-Bit Server VM 25.60-b23 on 1.8.0_60-b27 +jit [darwin-x86_64]

$ scalac Fib
$ time ruby scala-fib.rb
102334155
        2.34 real         4.95 user         0.40 sys
```

うっ、恐らくJVMの起動がネックに...


# Nailgunを使う

Nailgunを使えば、バックグランドでJVMを起動させておくことができ、JVM起動のオーバーヘッドを解消できます。
1回目はオーバーヘッドがあるので以下は2回目の実行。

```
$ jruby --ng-server
NGServer 0.9.1 started on all interfaces, port 2113.

$ time jruby --ng scala-fib.rb
        0.83 real         0.01 user         0.02 sys
```

素のScalaとほぼ同等になりましたね。

# ちなみに

素のJRubyでもCRubyよりは速いですね。

```
$ time jruby --ng fib.rb
        7.72 real         0.01 user         0.02 sys
```

# さいごに

元記事通り、それぞれの得意分野でよろしくやっていくのが平和だと思います。
Swift2.0 POST送信とBasic認証

こちらを[参考](https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/13-http/postwo-song-xinsuru)にSwift2.0に書き換えました。
Basic認証も追加しています。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController{
    
    var myConfig:NSURLSessionConfiguration!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let str = "data=送信完了"
        let strData = str.dataUsingEncoding(NSUTF8StringEncoding)
        
        let url = NSURL(string:"http://hogehoge.com/post.php")
        let request = NSMutableURLRequest(URL: url!)

        // Basic認証の設定
        let username = "ユーザ名"
        let password = "パスワード"
        let authStr = "\(username):\(password)"
        let data = authStr.dataUsingEncoding(NSUTF8StringEncoding)
        let authData = data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions())
        let authValue = "Basic \(authData)"
        request.setValue(authValue, forHTTPHeaderField: "Authorization")
        
        
        request.HTTPMethod = "POST"
        request.HTTPBody = strData
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 10.0
        
        var response: NSURLResponse?

        do {
            let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response)
            let myData:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!
            print(myData)
            
        } catch (let e) {
            print(e)
        }
    }
}

```

任意（hogehoge.com/post.php）のサイトにPHPを設置

```php:post.php
<?php
    echo $_POST['data']; 
?>
```
ローカル開発環境からブラウザでphpを表示できない（解決済み）

もともとunixコマンドの勉強をしようと[ドットインストール](http://dotinstall.com/lessons/basic_unix/5401)を見ていたのだけれども「ローカル開発環境？え？なにそれ？それやってる前提で始めるの？」ってことで[ローカル開発環境の構築 [MacOS X編]](http://dotinstall.com/lessons/basic_localdev_mac)っていうのを見てたのだが、"Hello from Vagrant!"と書かれたphpファイルをローカル開発環境で表示させようとすると、

```lang:index.php
<?php
echo "hello from Vagrant!";
```
とそのまま表示されてしまう。
どういうことなのかと色々と調べた結果、[ローカル開発環境からブラウザでphpファイルを確認できない](https://teratail.com/questions/16035)という名前のforumを発見。同志よ。と思い色々と試した結果、未だに動きません。ちなみに`PHP 5.5.29 CentOS 6.7 apache2.2.15`です。`sudo vi /etc/httpd/conf.d/php.conf`で調べてみると

```
PHP is an HTML-embedded scripting language which attempts to make it
easy for developers to write dynamically generated webpages.

<IfModule prefork.c>
LoadModule php5_module modules/libphp5.so
</IfModule>

<IfModule !prefork.c>
LoadModule php5_module modules/libphp5-zts.so
</IfModule>


The following lines prevent .user.ini files from being viewed by Web clients.

<Files ".user.ini">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
            Order allow,deny
            Deny from all
            Satisfy All
        </IfModule>
    </Files>

    Allow php to handle Multiviews
 
    AddType text/html .php


    Add index.php to the list of files that will be served as directory indexes.

    DirectoryIndex index.php

     mod_php options
    <IfModule  mod_php5.c>
    
     Cause the PHP interpreter to handle files with a .php extension.
    
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
    
     Uncomment the following lines to allow PHP to pretty-print .phps
     files as PHP source code:
    
    <FilesMatch \.phps$>
        SetHandler application/x-httpd-php-source
    </FilesMatch>

    
     Apache specific PHP configuration options
     those can be override in each configured vhost
    
    php_value session.save_handler "files"
    php_value session.save_path    "/var/lib/php/session"
    php_value soap.wsdl_cache_dir  "/var/lib/php/wsdlcache"
</IfModule>
```

ということで未だに沼の中。。。
c++ builder > POP before SMTP > 別ソース化(C++実装)時のひっかかり

http://qiita.com/7of9/items/e818ad48aa4f6ee4f984
http://qiita.com/7of9/items/5d0117a0802cca97f5f9
上記の処理を別cppソースに分離していて引っかかった点について。


## ひっかかった点

>  msg->OnInitializeISO = IdMessage1InitializeISO;

上記の`IdMessage1InitializeISO`は以下のように定義していた。

```
void __fastcall TForm1::IdMessage1InitializeISO(System::WideChar &VHeaderEncoding,
          UnicodeString &VCharSet)
{
    VHeaderEncoding = L'B';
    VCharSet = "ISO-2022-JP";
}
```

IdMessage1InitializeISO()やメール送信部分の関数を以下のどちらで実装するかでビルドの成否が異なる。

- C++実装
  - インスタンスメソッド : ビルドできた
  - 静的メソッド : ビルド失敗
  
静的メソッドの場合は`E2034 'void(wchar_t &, UnicodeString &)'型は'TIdInitializeIsoEvent'型に変換できない`というエラーがでてビルドできなかった。
RailsでApp Access TokenとGraph API v2 を使ってシェア数を取得する

Graph API v2 を使うのに [User Access Token](https://developers.facebook.com/docs/facebook-login/access-tokens/#usertokens) を使った情報をよく見かけるのですが、[App Access Token](https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens) を使った情報をあまり見かけないので実装してみました。

ページのシェア数は [URLオブジェクト](https://developers.facebook.com/docs/graph-api/reference/v2.5/url) から取得できます。

---

APP_ID と APP_SECRET から App Access Token を得るのに [fb_graph2](https://github.com/nov/fb_graph2) を、Graph APIを叩くのに [koala](https://github.com/arsduo/koala) を利用しました。

```ruby:Gemfile
gem 'fb_graph2'
gem 'koala'
```

適当にクラスを作って

```ruby:app/services/facebook.rb
class Facebook
  def initialize(app_id, app_secret)
    @app_id = app_id
    @app_secret = app_secret
    @access_token = nil
  end

  def access_token!
    @access_token ||= FbGraph2::Auth.new(@app_id, @app_secret).access_token!
    @access_token.to_s
  end

  def url(url)
    graph = Koala::Facebook::API.new(access_token!)
    graph.get_object('', { id: url }, api_version: 'v2.5')
  end
end
```

こんな感じに使う。

```ruby
facebook = Facebook.new(ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET'])
url = facebook.url('http://peraichi.com')
# => {
#    "og_object" => {
#                  "id" => "793236810740460",
#         "description" => "ペライチは専門知識不要で、誰でもカンタンに1枚のWebページを作れるサービスです。ブランディングや商品紹介を、チラシをつくるイメージで作成できます。ブラウザからの操作だけで1枚の売れる商品紹介ページをすぐに作れます。基本無料。もちろんコーディング不要です！",
#               "title" => "ペライチ",
#                "type" => "website",
#        "updated_time" => "2015-11-07T00:36:46+0000",
#                 "url" => "https://peraichi.com/"
#    },
#        "share" => {
#        "comment_count" => 0,
#          "share_count" => 3627
#    },
#           "id" => "http://peraichi.com"
#}
```
Rにおける代表的な一般化線形モデル（GLM）の実装ライブラリまとめ

一般化線形モデル（GLM）は統計解析のフレームワークとしてとにかく便利。
Rでもビルトインの関数から拡張までさまざまなライブラリから提供されている機能だが、
さまざまなライブラリがありすぎてどれを使えばいいのかわかりにくいのと、
さらに一般化線形モデル（GLM）自体にもいろいろな亜種があるため、
どの手法をどのライブラリの関数で実装すればいいかわからなくなる。

そこでRに実装されている代表的なGLM系の関数と特徴についてまとめてみた。

続きを読む
[Rにおける代表的な一般化線形モデル（GLM）の実装ライブラリまとめ](https://www.marketechlabo.com/r-glm-libraries/)
fluentd regex test 

fluentdのformatに使う正規表現のテスト

## project作成
```
mkdir accessParseTest
cd accessParseTest
bundle init
```

## gemfile作成

``` ruby:Gemfile
source "http://rubygems.org"

gem 'fluentd', '~> 0.12.16'
gem "fluent-plugin-parser"
```

## bundle install

```
bundle install
```




## app

``` ruby:debug.rb
require 'fluent/config'
require 'fluent/parser'
require 'fluent/engine'

#log_sample
log ='12.345.67.89 -   -   [07/Mar/2015:06:59:59 +0900]    "GET /test/test HTTP/1.1"   200 58215   "-  ->  /test/test/"    "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"  "-" "SESSIONID=123456; Path=/"  "123456"    text/html'

#log_format
regexp = /^(?<host>.+?)\t(?<logname>.+?)\t(?<user>.+?)\t(?<time_stamp>.+?)\t(?<request>.+?)\t(?<http_status>.+?)\t(?<content_length>.+?)\t(?<http_refere>.+?)\t(?<allow>.+?)\t(?<path_info>.+?)\t(?<user_agent>.+?)\t(?<cookie>.+?)\t(?<set_cookie>.+?)\t(?<custom>.+?)\t(?<content_type>.+?)$/

#parser
parser = Fluent::TextParser::RegexpParser.new(regexp)
parser.call(log)


p parser.call(log)
```

## 実行

```
bundle exec ruby debug.rb
```


## 結果

```
[1447051688, {"host"=>"12.345.67.89", "logname"=>"-", "user"=>"-", "time_stamp"=>"[07/Mar/2015:06:59:59 +0900]", "request"=>"\"GET /test/test HTTP/1.1\"", "http_status"=>"200", "content_length"=>"58215", "http_refere"=>"\"-", "allow"=>"->", "path_info"=>"/test/test/\"", "user_agent"=>"\"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\"", "cookie"=>"\"-\"", "set_cookie"=>"\"SESSIONID=123456; Path=/\"", "custom"=>"\"123456\"", "content_type"=>"text/html"}]
```
ReduxでlocalStorageにstateのスナップショットを保存する


localStorageにstateのスナップショットを保存するRedux middlewareを作りました。

https://www.npmjs.com/package/redux-save-state

## インストール

```
$ npm install --save redux-save-state
```

## 使い方

第1引数に保存先キー名を指定して、applyMiddlewareに渡す。

```js
import {createStore, applyMiddleware} from "redux";
import saveState from "redux-save-state/localStorage";
// combineReducersされたreducer達
import reducers from "./reducers";

// 保存先キー名
const key = "app-state-snapshot";

const store = applyMiddleware(saveState(key))(createStore)(reducers);

// React Componentでdispatchが呼ばれるたびに保存
store.dispatch(action);

// stateをJSON.stringifyした文字列が保存される
console.log(localStorage[key]);
```

### オプション

#### `filter`

stateの一部を保存したい時や、stateがImmutableのMap等の場合に、そのままJSON.stringifyに渡せないことがあると思う。
そういう場合は、filterに関数を指定するとその関数の返り値をJSON.stringifyした文字列がlocalStorageに保存される。

```js
// 特定のキーだけ保存する
const filter = state => {
  return { someKey: state.someKey };
};
const store = applyMiddleware(saveState(key, { filter }))(createStore)(reducers);
```

#### `debounce`

何も指定がない場合、dispatchされるたびにlocalStorageに保存される。
パフォーマンス的に気になる場合は、debounceオプションを指定し、
dispatch実行時から遅延してlocalStorageへの保存を実行することができる。

```js
// 300msの間にdispatchされなかったら保存
const debounce = 300;
const store = applyMiddleware(saveState(key, { debounce }))(createStore)(reducers);

store.dispatch(action); // 保存されない
store.dispatch(action); // 保存されない
store.dispatch(action); // 保存されない

// 300msの間にdispatchが発生しなかった場合に
// 3度目のdispatch時のstateが保存される
```

バグや要望とはGithubのIssueでお願いしますー

https://github.com/pirosikick/redux-save-state/issues
sinatraで認証のため warden を使おうとした時、secret keyを設定してないためハマった

## 確認version

+ sinatra (1.4.6)
+ warden (1.2.3)

## 現象

sinatraベースのアプリで認証処理を warden を使おうと思ったが、
ログイン成功後に session にログイン情報が設定されていない状況で困った。

http://www.twopipe.com/2014/01/10/sinatra-session.html
から、
shotgun を使用していたため、secret keyが毎回変わっていたのか？と推測する。

```
class PublicApp < Sinatra::Base

  enable :sessions
  set :sessions, 
    secret: 'xxxx'
```

と設定すべきだった。
UnixTimeを日付型に変換する方法


## 出来事
ミリ秒で保存されているカラムに対して日付型に変換して同じく日付型のデータと比較を行ないたい

## やったこと

```sql:date.sql
select * 
from table
where 
	TO_DATE(CONVERT_TIMEZONE('JST', TIMESTAMP 'epoch'+(table.column/1000)*INTERVAL), 'MM-DD') = TO_DATE('2015-11-09', 'MM-DD');
```

※TIMEZONEが要らない場合は `CONVERT_TIMEZONE` はいらないかも。

## ちなみに

MySQLで同じことしようとするとUnixtimeが0未満の場合、 `Null` が返ってくる

```sql:date.sql
mysql> select from_unixtime(0);
+---------------------+
| from_unixtime(0)    |
+---------------------+
| 1970-01-01 09:00:00 |
+---------------------+
1 row in set (0.00 sec)

mysql> select from_unixtime(-10000);
+-----------------------+
| from_unixtime(-10000) |
+-----------------------+
| NULL                  |
+-----------------------+
1 row in set (0.00 sec)

```

この組み合わせで知見を得たので次からは上手くやるでしょう
sublime text >  Monokai > 色分けの実例 >「Tag attribute」とは何なのだろうか?

http://qiita.com/nightyknite/items/fde389e261b1709e6a10
にMonokai選択時の色分け表が紹介されている。

自分のコードと比べてみると以下のような色付けがされている。

```txt:環境
Sublime Text 2
- cppのソースファイル
- .hファイル
```

- Tag name : if / static / include / pragma / new / try / catch / const / delete / return ...
- Function argument : 関数定義文の関数名
- Tag attribute : なし
- Storage type : 関数呼び出し処理の関数名 / bool / void / int
- User-defined constant : [k+大文字]で始まる文字列 / 数値の定数 (995) / true / false / NULL
- String : "test"
- Comment : // で始まるコメントや/* */のコメント
- Background : 背景色


「Tag attribute」は１つもない。
cppでTag attributeとは何なのだろうか?
Linux 同一名のファイルを一括削除


# findコマンドでファイルの削除
```
$ find . -name .DS_Store -delete
```
これで、現在のディレクトリのファイルを一括削除出来ます。(この場合、.DS_Storeという名前のファイルの一括削除です)

```
$ find . -name .DS_Store
```
これで、現在のディレクトリのファイルを検索出来ます。deleteオプションで削除が出来るということです。
ゲームの多対多プレイヤーデータに関する考察

カード系ソーシャルゲームのDB設計をする際の雑多な考察です。

## ユーザーの所持キャラクターテーブルの設計

今回はゲームで獲得できるキャラクターデータを格納するテーブルの設計について考えてみます。

Charaテーブル

| カラム名 | 
|:-----------|
| ID (プライマリーキー) |
| ユーザーID |
| マスターデータID |
レベルやHP等のパラメータについては今回は省略。
ユーザーの全所持キャラ取得はよくやりそうなのでユーザーID辺りにインデックスを貼っておきましょう。

次に、例えばこのゲームではキャラクターが武器を装備できるシステムなら、

Equipテーブル

| カラム名 | 
|:-----------|
| ID (プライマリーキー) |
| ユーザーID |
| マスターデータID |
こちらも個別のパラメータを省略すればキャラクターと構成は変わりません。

さて2つのテーブルができたところで話は変わりますが、
かの名作RPGシリーズでの最初の村における村人Aさんはとても大事なこんなことを教えてくれます。
「武器や防具は持っているだけじゃ意味がないぞ。ちゃんと装備しないとな」
はい、では装備しましょう。今回は設計パターンを4つ用意しました。

###１. キャラクターが自分が装備しているか認識する

Charaテーブル

| カラム名 | 
|:-----------|
| ID (プライマリーキー) |
| ユーザーID |
| マスターデータID |
| Equip.ID ←NEW |

キャラクターテーブルに装備IDカラムを追加すればOKです。
ForeignKeyにするかどうかはお好みですが、経験上しない方がいいことが多いです。

このデータ構造はキャラクターが装備を持っているので感覚的にわかりやすいのがメリットです。
装備変更も装備データIDを差し替えればいいだけで、ユニーク制約を付ければ1つの武器を
複数キャラが装備してしまうこともないでしょう。
デメリットは所持武器一覧を取得した時に各武器を誰が装備しているかが若干取りづらいことでしょうか。

###２. 武器が自分が誰に装備されているか認識する

Equipテーブル

| カラム名 | 
|:-----------|
| ID (プライマリーキー) |
| ユーザーID |
| マスターデータID |
| Chara.ID ←NEW |

こちらは1の逆で武器テーブルにキャラクターIDカラムを追加します。
こちらのメリット/デメリットはそのまま逆になります。所持武器一覧ではいいけどキャラクター一覧で若干面倒になります。また、武器が自分の所有者を認識しているので感覚的に違和感を覚えるかもしれません。

###３. それぞれ装備と所有者を認識する

1と2の合わせ技でそれぞれのテーブルにそれぞれのIDのカラムを追加します。
データ取得に関しての煩雑さは軽減されるでしょう。実際に開発時にこのデータ構造になることは多いです。

デメリットはもちろん二重管理です。変更時は1トランザクション内でしっかり整合性を取らなければなりません。開発時と保守時のメンバーが違う場合に一方の更新漏れによる事故が怖いのでドキュメントやコメントでちゃんとフォローしましょう。

###４. 間に関係テーブルを挟む

キャラクター・装備のそれぞれのテーブルは変更せず、2者間の関係テーブルを作成します。
CharaToEquipテーブル

| カラム名 | 
|:-----------|
| ID (プライマリーキー) |
| ユーザーID |
| Chara.ID |
| Equip.ID |

装備変更時はこのテーブルのみが変更されます。メリットとして、
・実装時にChara、Equipモデルのお互いへの依存性を小さくできる。
・Chara.ID、Equip.IDのそれぞれをForeignKeyにした場合、親IDが削除されれば自動的にレコード削除されて更新漏れが防げるor必要なくなる(DBエンジンによるかも)
・正規化されるのでデータ構造として奇麗

また、デメリットは
・テーブルが増えたことにより取得時のクエリ結合またはクエリ数自体が増える。
となります。今回のようなキャラクターデータは参照頻度が高く、アクティブユーザー数によってはDBサーバーのレスポンスがボトルネックになることも割とよくあります。
負荷試験はリリース前にやっておいた方がよいでしょう。これはどのデータ構造でも一緒ですが。

## まとめ
結局どの構造がいいの？については、まあ好みでいいんじゃない？って感じです。
ゲームではなく業務用アプリならER図を奇麗に引けそうな4を選ぶことが多そうですが、ゲームならパフォーマンスとか考えて3を選びそうな気がします。1,2は実装を進めていくと結局は面倒になって大体3に落ち着きます。

もちろんこれらだけが設計パターンの全てではないのでもっといいデータ構造があればぜひ教えて頂ければ幸いです。
Rails アプリケーションを検索されなくする

# robots.txt

サイトをクローリングされないようにするためには、robots.txtを編集すればよい。

```rb:public/robots.txt
# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
User-agent: *
Disallow: /
```

上記のように

```rb
User-agent: *
Disallow: /
```

のコメントアウトをはずす。

## 参考
http://www.robotstxt.org/robotstxt.html
Rails ip制限をかける

# はじめに
セキュリティ的に特定ipからしかアクセスを受け付けたくなかったので、その対応メモ。

# ip制限

```rb:application_controller.rb
before_action :restrict_remote_ip

  PERMIT_ADDRESSES = ['127.0.0.1', '::1', '000.000.00.00'].freeze

  def restrict_remote_ip
    unless PERMIT_ADDRESSES.include?(request.remote_ip)
      render text: 'Service Unavailable', status: 503
    end
  end
```

remote_ip()
http://api.rubyonrails.org/
NMF (非負値行列因子分解)のC言語実装

『集合知プログラミング』という本に紹介されていた機械学習手法。

だいぶ昔だけどC言語で実装した。
https://github.com/0xfffffff7/NMF/blob/master/nmf.cpp

こちらのページのサンプル数値をそのまま打ち込んでいる。
http://d.hatena.ne.jp/dir2/20080825/1219673931
gulp導入メモ


## node.jsをインストールする

http://nodejs.org

環境に合ったものを。

## gulpでタスクを走らせるディレクトリに移動

```
$ mkdir /path/to/target/dir
$ cd /path/to/target/dir
```

なければ作る。

## npmの初期設定をする

```
$ npm init
```

ウィザード形式でいろいろ聞かれるので答える。
それを反映した`package.json`がカレントディレクトリ以下に作成される。

```json:package.json
{
    "name": "hoge",
    "version": "1.0.0",
    "description": "piyo",
    "main": "index.js",
    "directories": {
        "doc": "docs"
    },
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
    },
    "author": "fuga",
    "license": "MIT"
}
```

## gulpをインストールする

### グローバルインストール

```
$ npm install gulp --global
```

node.js配下のディレクトリにパッケージが展開される。
同時にパスが通り、gulpをコマンドで呼び出せるようになる。

### 開発環境（ローカル）にインストール

```
$ npm install gulp --save-dev
```

globalオプションがない`npm install`は、パッケージが
カレントディレクトリ下のnode_modulesディレクトリに展開される。
save-devオプションをつけることで、インストールしたパッケージを
devDependenciesとして自動的に`package.json`に反映させる。

```json:package.json
{
    ...,
    "devDependencies": {
        "gulp": "^3.9.0"
    },
    ...
}
```

## gulpを設定する

### gulpfile.jsの作成

`package.json`と同じディレクトリに`gulpfile.js`を作成する。

```js:gulpfile.js
var gulp = require('gulp');
```

## 処理を追加する

例として、sassのコンパイルを行うパッケージ`gulp-sass`の導入手順を記載する。

### パッケージのインストール

```
$ npm install gulp-sass --save-dev
```

ローカルのnode_modulesディレクトリにgulp-sassパッケージを展開。
`package.json`は以下のように自動的に修正される。

```json:package.json
{
    ...,
    "devDependencies": {
        "gulp": "^3.9.0",
        "gulp-sass": "^2.1.0"
    },
    ...
}
```

### タスクの追加

パッケージの機能を利用するためには、
`gulpfile.js`内でパッケージをタスクとして追加する必要がある。
以下は、gulp-sassパッケージを"sass"という名前のタスクとして追加した例。

```js:gulpfile.js
var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function(){
    gulp.src('sass/**/*scss')
        .pipe(sass())
        .pipe(gulp.dest("./css")
});
```

タスクの書式はパッケージによって様々なので、よく調べること。

#### MiniMatchパターン

gulp.src()で指定するパスの書き方。
`gulpfile.js`のあるディレクトリからの相対パスを指定する。

* `*`はパスセパレータを含まない任意の文字列
* `**`はパスセパレータを**含む**任意の文字列

他にもいろいろある。

## タスクを実行する

```
$ gulp sass
```

gulpコマンドのあとにタスク名を入力して実行することで、
タスク単体を任意に実行することができる。
またタスク名を省略した場合は、"default"という名前で追加されたタスクの内容を実行する。

## おまけ：既存のパッケージ設定を他のディレクトリに反映する

`package.json`を別のディレクトリにコピーして`npm install`すると、
元のディレクトリで使われたnpmパッケージがそのまま展開される。
妙なことをしていなければ`gulpfile.js`もコピーしてくればそのまま動く。
JAVA instanceof演算子の疑問(個人的なメモ)


■Main23.java______________________________________________

```java
public class Main23 {
	public static void main(String[] args) {

		Character mmm = new Dancer("ダンサー5");
		Dancer ppp = (Dancer) mmm;


		if (mmm instanceof Dancer) {

			Dancer fff = (Dancer) mmm;
			fff.read(m2);
		}

		★mmm.read(m2);

	}
}
```
 _____________________________________________________________

 ■Character.java________________________________________________

```java
 public abstract class Character {
	String name;
	int hp;

	public Character(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}

	Character() {
		// this("ダミー");
		System.out.println("Hero2のコンストラクタが動作");
	}

	public String getName() {
		return this.name;
	}

	public int getHp() {
		return this.hp;
	}

	public void run() {
		System.out.println(this.name + "は逃げ出した");
	}

	public abstract void attack(Matango2 m1);

}
``` 
_______________________________________________________________

 ■Dancer.java____________________________________________________

```java
public class Dancer extends Character {

	private String name;

	Dancer(String name) {
		this.name = name;
	}

	public String getName() {
		return this.name;
	}

	public void dance() {
		System.out.println(this.name + "は情熱的に踊った");
	}

	public void attack(Matango2 m1) {
		System.out.println(this.name + "の攻撃");
		System.out.println("敵に3ポイントのダメージ");
		m1.hp -= 3;
	}

	public void read(Matango2 m1) {
		System.out.println(this.name + "は読んだ");
		m1.hp += 2;
	}

}
```
  __________________________________________________________________

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
Character jjj = new Dancer("ダンサー5");
 Dancer ppp = (Dancer) jjj; //ダウンキャストでエラー

if (jjj instanceof Dancer) {

 Dancer fff = (Dancer) jjj;
 fff.read(m2);
 }

 ppp.read(m2);
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿


＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

```java
Character jjj = new Dancer("ダンサー5");
Dancer ppp = (Dancer) jjj; //ダウンキャストでエラー

if (jjj instanceof Dancer) {

	Dancer fff = (Dancer) jjj;
	fff.read(m2);
}

ppp.read(m2);
```
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

■疑問
このppp.read(m2);の部分をjjj.read(m2);にするとエラーになってしまいます。

なぜでしょうか。

■回答(先生からの)
変数jjjがCharacterクラスのインスタンスだから。

このエラーってコンパイル時のエラーでしょ？
コンパイルってのは、書いたコードがJavaの文法とかルールに則って書かれているかどうかだけをチェックする。

Character jjj = new Dancer("ダンサー5");
という書き方だと、Character型の変数jjjに、Dancerクラスのインスタンスを代入している。
コンパイラから見たらjjjはCharacterクラスのインスタンスだから、jjjに対して呼び出せるのはCharacterクラスが持つメソッドに限られる。
それなのに、
jjj.read(m2);
でCharacterクラスのreadメソッドを呼びだそうとしているから、コンパイルエラーになる。


それから、こんな書き方↓を続けていたら実行時エラーに見舞われる。

```java
Character jjj = new Dancer("ダンサー5");
Dancer ppp = (Dancer) jjj;
if (jjj instanceof Dancer) {
	Dancer fff = (Dancer) jjj;
	fff.read(m2);
}
ppp.read(m2);
```

以下の様にinstanceofをきちんと使うように心がけた方が良い。

```java
if (jjj instanceof Dancer) {
	Dancer fff = (Dancer) jjj;
	fff.read(m2);
	Dancer ppp = (Dancer) jjj;
	ppp.read(m2);
}
```
emacsでJSONをフォーマット

## はじめに
仕事柄よくJSON文字列を見てるのだけど、いちいちコピペしてバッファから取り出してjqかけるのが面倒になってきたのでemacsで一発で変換できたらいいじゃんと思ってやり方を調べてみました。
どんな分野にも先人はいてくださるようで、この方の記事を参考に書きました。

[Emacs で JSON Reformat](http://syohex.hatenablog.com/entry/20120208/1328682072)

## emacsでJSONをフォーマット
先ほどの参考記事とは別に今回は `jq` を使いたいので一部変更して下記の定義をemacsの設定ファイルに追加します。

```elisp
;; for json format
(defun jq-format (beg end)
  (interactive "r")
  (shell-command-on-region beg end "jq ." nil t))
```

これで選択範囲を指定して `jq-format` を呼び出せばいい感じにフォーマットしてくれます。
今回はそこまで複雑なことはするつもりがなかったので特に細かい `jq` のオプションまでは実行したいと思わなかったのでこんなもんでもいいかな、と。

## おわりに
`jq` 便利ですね、今後もしばらくJSONを使う機会は多そう。
KEY=VALUE が並んだファイルを読みこんで環境変数にexportしたい

元ネタ：http://stackoverflow.com/questions/32761478/export-all-variables-from-key-value-file-to-shell

こんなファイルがあったとき

```properties:.env
AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=yyy
```
単純に`source`しても何も起きないので

```shell-session
uraura@rosemary$ source .env
```
`set -a`してからやると良いよっていう話でした．

```shell-session
uraura@rosemary$ set -a
uraura@rosemary$ source .env
uraura@rosemary$ set +a
```

`-a`は http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230881/ によると

> 新規に作成した変数や関数，値を変更した変数や関数を，以後，自動的にエクスポートする

とのことなので，使用後はちゃんと戻しておきましょう．
webViewDidFinishLoadが何度も呼ばれてしまう

webviewのアクセス先にiframeが含まれると、その完了の度に`webViewDidFinishLoad`が呼ばれるらしい。

以下のように`webView.loading`で判定すると、アクセスしたサイト自体のloading完了をキャッチできる。
例えば、アクセスしたページタイトルをアプリ側に表示させるとすると

```swift
    func webViewDidFinishLoad(webView: UIWebView) {
        if !webView.loading {
            self.navigationItem.title = webView.stringByEvaluatingJavaScriptFromString("document.title")
        }
    }

```

のようにすると良い。
dockerでrailsの開発環境をつくる

とりあえず、今自分のパソコンでdockerコマンドが使える状態になっているとする。

まずなんとなく作業用のディレクトリを作って中に入ろう。

```bash
mkdir ~/apps
cd apps
```

んで、コマンド一発！

```bash
docker run -it --rm --user "root:staff" -v "$PWD":/usr/src/app -w /usr/src/app rails rails new --skip-bundle webapp
```

root:staff の部分はなんていうか、ホスト側のバーチャルマシンのユーザー名とグループ名ですな。

こうすると自分のmacの直下のwebapp内にrailsっぽいものが出来ている。
ただしGemfile.lockが存在しない。

さらにコマンド一発！

```bash
docker run --rm -v "$PWD":/usr/src/app -w /usr/src/app ruby:2.1 bundle install
```

こうすると Gemfile.lock が生成される。

で、Gemfileと同じ階層にDockerfileを作り、中に

```ruby:Dockerfile
FROM rails:onbuild
```

と書く。そして、コマンド一発！

```bash
docker build -t my-rails-app .
```

dockerのイメージが出来るので走らせる。

```bash
docker run --name rails01 -p 8080:3000 -d my-rails-app
```

ブラウザから http://なんちゃら:8080/ を確認すれば動いているのが分かる。

が、このままでは何もできない。このコンテナにbashで入ってもviすら入っていない。
そもそもこの、Ctrl+lの効かない不自由なシェルもどうしたものか。。

まあしかしコマンド4発でrailsが動いてるんだからよしとするか。

で、この作られたコンテナ、Debianなんすな。

```bash
$ cat /etc/os-release    
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
```

日本語化されていないのでこのままだとvimを入れても日本語の表示も入力もできない。
ということで、まずコンテナにbashで入って、

```bash
docker exec -it rails01 bash
```

まずは、

```bash
apt-get update
```

続いて、

```bash
apt-get install uim uim-anthy
```

なんかすごい長いインストールが走って、これが終わるとcatとかで日本語が表示されるようになる。

vim入れる。

```bash
apt-get install -y vim
```

設定ファイルを作る。

```bash
vim  /etc/vim/vimrc.local
```

```vim:/etc/vim/vimrc.local
set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,ucs2le,ucs-2,cp932,euc-jp,latin1
```

neoだと動かなかったので、vundle入れる。

```bash
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
```

.vimrc作って、vundleの設定入れる。

```bash
vim ~/.vimrc
```

```vim:~/.vimrc
set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

Plugin 'tpope/vim-fugitive'
Plugin 'Shougo/unite.vim'

call vundle#end()            " required
filetype plugin indent on    " required
```

vim起動してから以下コマンドでインストール

```vim
:PluginInstall
```

あとは自分好みの.vimrcを書きこめば終わり。

日本語の設定のあたりがわずらわしいよね、まとめてやっちゃう方法はないものか。

まあしかし、問題なのは debian なんて使わねーよと言われたら終わりというところか。
"Unity"+"leap motion" [練習一つ]: VRGUI Project

<h2>VRGUI Project： 「スワイプジェスチャー」</h2>
<h3>Goal: 空間に浮かぶGUIを作る</h3><ul>
<li><font color=red>Step 1: UnityでLeap Motionを使ってGesture Motion認識ができる。</font></li>
<li><font>Step 2: uGUIでメニューを作って空間に浮かべる</font> </li>
<li>Step 3:メニュー選択。任意のGameObjectからRaycastを飛ばしてメニューを選択できる。選択状態で色を変える。できたら音も。</li>
<li>Step 4:メニューで選択した項目を実行。メニューに任意のアクションを割り当てられるように実行する。</li>
</ul>
<hr/>
step1.
<h3>スワイプジェスチャー</h3>
<ul><li>c# code</li>
<img width="1020" alt="Screen Shot 2015-11-09 at 16.36.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/ef29ca00-ee6a-8521-fc8f-fe062aebadec.png">
<br/>
<li>説明</li>
"MinLength": 感知の前に最小移動ながさ（mm）
"MinVelocity": 感知の前に最小移動速度（mm/s）
"SwipeDirection.x/y/z":　手の移動の方の基準

<li>結果</li>
down
<img width="1162" alt="Screen Shot 2015-11-09 at 16.49.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/5fccce37-b74f-11b5-b26d-3ace14f5a109.png">

up
<img width="1146" alt="Screen Shot 2015-11-09 at 16.56.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/03f9f0f8-ae66-3d1d-de78-66907c80e476.png">
とりあえず文字化けを直す.vimrc

vi(m)の良いところは、unixの系譜につらなるOSならばまず間違いなくインストールされているところ。

東に読みたいファイルがあればすかさずvi。
西に開きたいファイルがあっても慌てず騒がずvi。
常識です。

しかし結構日本語が文字化けしたりするんですよね。
これはマルチバイト圏に住むvi使いにとって宿命だと思われます。

そんな時はそっと.vimrcに以下の2行を追加してreopen。


```vim
set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,cp932,sjis
```

これでほぼ文字化けは直ります。
ぜひお試しください。
VCCWでホスト名を変更するとき

provisionの中にある**default.yml**


```default.yml
#
# Network Settings
#
 hostname: vccw.dev
ip: 192.168.33.10　　←ココを変更する
sync_folder: 'www/wordpress'

デフォルトで使うと怒られるんでね(。-ω-)
Yahoo! ID連携 Java SDKを利用したトークン発行でのエラー

Yahoo! ID連携 Java SDKでTokenエンドポイントにリクエストしてアクセストークンを取得する際、下記のエクセプションが発生してしまうのですが、設定含めて注意点などあればご教示いただけないでしょうか。

java.net.ConnectException: Connection timed out: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:656)
        at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:524)
        at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:403)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
        at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
        at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
        at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
        at jp.co.yahoo.yconnect.core.http.YHttpClient.requestPost(YHttpClient.java:228)
        at jp.co.yahoo.yconnect.core.oauth2.TokenClient.fetch(TokenClient.java:58)
        at jp.co.yahoo.yconnect.YConnectExplicit.requestToken(YConnectExplicit.java:167)

当方、Play Framework 2.4.xで実装しております。
また、この前段でのコールバックURLでの認可コードの抽出はYConnectExplicit.getAuthorizationCode()より取得できております。
http://developer.yahoo.co.jp/yconnect/server_app/java/sample.html
に従い、必要なライブラリーはlib配下に配置しbuild.sbtにも記載しました。

Play自体さわり始めたばかりにつき、的を得ない質問はご容赦下さい。
どうぞ宜しくお願い致します。
gitbucketにpushするときにエラーが発生する

# Environment

- gitbucket version: 3.6
- local git version: 2.4.3

# Problem

gitbucketにpushするときに以下のエラーが発生した

```bash
$ git push
Counting objects: 42, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (41/41), done.
Writing objects: 100% (42/42), 28.99 KiB | 0 bytes/s, done.
Total 42 (delta 24), reused 0 (delta 0)
remote: error: Internal server error
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'http://xxx.git'
```

gitbucketのログには以下のようなエラーが表示されていた

```bash
# /var/log/upstart/gitbucket.log

2015-11-09 15:57:38.451:WARN:/:Internal error during receive-pack
org.eclipse.jgit.errors.PackProtocolException: error: invalid protocol: wanted 'old new ref'
	at org.eclipse.jgit.transport.BaseReceivePack.recvCommands(BaseReceivePack.java:935)
	at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:184)
	at org.eclipse.jgit.transport.ReceivePack.receive(ReceivePack.java:160)
	at org.eclipse.jgit.http.server.ReceivePackServlet.doPost(ReceivePackServlet.java:187)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
```

# Solution

参考: http://stackoverflow.com/questions/21557004/protocol-error-expected-old-new-ref-got-shallow-deeb

unshallowした後にpushすると成功した

```bash
$ git fetch --unshallow
$ git push
```
Swift2.0 JSONパース

#Swift2.0のソースコード
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    
    private var json:NSDictionary!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getJson()
    }
    
    func getJson() {
        
        let URL:NSURL = NSURL(string: "http://express.heartrails.com/api/json?method=getStations&name=%E6%96%B0%E5%AE%BF")!
        let jsonData :NSData = NSData(contentsOfURL: URL)!
        
        do {
            json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) as! NSDictionary
        } catch  {
            // エラー処理
        }
        
        let response:NSDictionary = json.objectForKey("response") as! NSDictionary
        let station:NSArray = response.objectForKey("station") as! NSArray
        
        
        for var i=0 ; i < station.count ; i++ {
            print(station[i].objectForKey("prefecture") as! NSString)
        }
    }
}
```

#iOS9での非SSL/TLS通信ができない問題の対応
![swift.png](https://qiita-image-store.s3.amazonaws.com/0/54553/de311c35-1cd3-69a7-9118-0f3b77db1d23.png)

赤枠の部分をinfo.plistに追加する。
(2015-11-09) Sourcetree > リリースノートへのリンク / コミットとキャンセルボタンの左右入替


- Windows版のSourceTreeのリリースノートへのリンク
  - https://www.sourcetreeapp.com/update/WindowsReleaseNotes.html

- Mac版
  - https://www.sourcetreeapp.com/update/ReleaseNotes.html

Windows版で[コミット][キャンセル]ボタンの位置が入れ替わっていて、これまでと同じ使用をしていてコミットをするつもりが「キャンセル」をしてしまうというのを12、3回繰り返した。

違和感の理由を考えてボタンをみたら左右入れ替わっていた。

上記のリリースノートには明示されていないようだが、UIの変更時には注意が必要だと思う。

よく使いそうなUI部分は後で変更するとユーザの誤操作を誘発しそう、と考えさせられた。
AndroidでCyberlink4JavaでControl Pointするときのメモ

壁にぶつかりながら都度Updateしていきます。

# Control Pointのインスタンスは一つに

例えば、Androidのネットワーキングはmainthreadでは出来ないので、非同期でControlPointを定義しようとします。

```java

protected Object doInBackground(Object[] objects) {
   ControlPoint c = new ControlPoint()
   c.start();
   c.search("upnp:rootdevice");
}

```

これだと二回目の非同期処理でクラッシュします。startのところです。どうもログをみているとControlPointの処理は継続しているようだったので、ControlPointはstaticにしてみたところ、クラッシュはなくなってsearchが何度でもできるようになった。

```java

static ControlPoint mC = null;
protected Object doInBackground(Object[] objects) {
    if( mC == null ){
        mC = new ControlPoint()
    }
    mC.start();
    mC.search("upnp:rootdevice");
}

```

これでも動きますが、singletonにしてあげたほうがよいですね。
lambdaる(Not AWS)

##0.内容
lambdaを使いたかったけど、使いどころがわからず悶々としていたが、ちょっとした監視を追加するときに利用してみた。
lambdaは監視のような処理に向いているが、まあとはいえ別にメソッドを作るなり他にやりようは幾らでもある。
ユニークな監視をちょこっとする時に、動かすスクリプト。
cronやデーモン化するなり、動かし方はその時々。

##1.前提

監視対象と監視項目は "yaml"ファイルで管理
*監視項目はSNMPで取得

#例(監視対象=mib.yml)
```
MYSQL:
   error:
     aborted_connects: 1.3.6.1.4.1.2021.8.1.101.1
     aborted_clients: 1.3.6.1.4.1.2021.8.1.101.2
   down:
     uptime: 1.3.6.1.4.1.2021.8.1.101.3
   iodrive:
     InfoStatus1: 1.3.6.1.4.1.30018.1.2.1.1.1.12.12
     InfoStatus2: 1.3.6.1.4.1.30018.1.2.1.1.1.12.17
```
#例(監視項目=host.yml)
```
DB:
   db001: 192.168.1.10
   db002: 192.168.1.11
   db003: 192.168.1.12
```

#データストア

閾値を越えた値と復旧した現在値を比較できるように"障害時の値"を保持
そのため別にRDBを使用せずともKey/Valueストアで十分
⇒今回はMemcacheを利用

##2.コード

```rb

#!/usr/bin/ruby
# coding: utf-8
require 'snmp'
require 'yaml'
require_relative 'tool'

### current directory yaml file load
### Target Host
common_list = YAML.load_file('host.yml')
list_db = common_list["DB"]

### Target Parameter
common_oid = YAML.load_file('mib.yml')
oid_mysql_ab = common_oid["MYSQL"]["error"]

### Backup Info

bkserver = "db002"
bkstart = '03:30'
bkend = '03:35'

### aborted_clients
### aborted_connectss
lwmark2 = 500

### Check LogFile
error_files = "general_mysql.log"

### common procedure

cking_ab = lambda  do  | targetlist, targetoid ,logs|

  targetlist.each do  |target|

    begin

      SNMP::Manager.open(:host => target[1], :Community => 'public', :timeout => 1) do |manager|

        targetoid.each do |mib|
          response = manager.get([mib[1]])
          response.each_varbind do |vb|
            if  ( vb.value.to_i - MemGet.instance.mem_get(target[0],mib[0]).to_i ) >= lwmark2
              ### send alert mail
              Tool.new( target[0].to_s + "\s MySQL abort status problem ?\s" + mib[0],"../mail_bady/body_mysql_abort.txt").alert_mail
              MemSet.instance.mem_set(target[0],mib[0],vb.value.to_i)
            else
              ### checking log
              time = Time.new
              file = File.open(logs, "a")
              file.write("#{time}\t#{target[0]}\t#{mib[0]}\tMySQL abort status No problem!\n")
              MemSet.instance.mem_set(target[0],mib[0],vb.value.to_i)
            end
          end
        end
      end

    rescue => ex
      ### send alert mail
      ToolKit.new( target[0].to_s + "\s#{ex}","../mail_bady/body_connect.txt").alert_mail
      next
    end
  end
end

## Checkin MySQL connection
checking_ab.call(list_db, oid_mysql_ab, error_files)

```

メールを送る所とMemcacheで利用するSet/Getの所は、"tool"に定義してあるメソッドを使用。


```rb

class MemGet

  include Singleton
    attr_accessor :x, :y

    def initialize
      @x = x
      @y = y
    end

    def mem_get(x,y)
       cache = MemCache.new('127.0.0.1:11211')
       cache.get(x+y)
    end

end

class  MemSet

  include Singleton
    attr_accessor :x, :y, :z

    def initialize
      @x = x
      @y = y
      @z = z
    end

    def mem_set(x,y,z)
      cache = MemCache.new('127.0.0.1:11211')
      cache[x+y] = z
    end

end
```

メール本文は別に用意。
他の処理も似たように書く。
guardとwhereの組み合わせ方

# guard whereの使い方

検索してもあまり出てこない気がするのでメモ
Swift2で新たに導入されたguardステートメントですが、`where`で条件をつけることができます

こんな感じのコードが

```swift
guard let itemCount = self.manager?.itemCount else { return }
if itemCount == 0 {
    return
}
```

こうなります

```swift
guard let itemCount = self.manager?.itemCount where itemCount > 0 else { return }
```

アンラップした直後に更に`where`文で判定し、`false`の場合`else`へ渡ります
アンラップ後に別の行で更に判定するという手間が省け、ちょっとだけ綺麗になりました

以上です

---

[2017/02/08] 追記

Swift3では以下のようになります

```swift
guard let itemCount = self.manager?.itemCount, itemCount > 0 else { return }
```
Realmのデータ取得時にNSDateの条件を指定する方法


## 結論
`NSPredicate`を使う。

```objc
NSPredicate *pred = [NSPredicate predicateWithFormat:@"createdAt < %@", date];
RLMResults *results = [RealmModel objectsWithPredicate:pred];
```

## objectsWhereだとうまくいかない

```objc
NSString *query = [NSString stringWithFormat:@"createdAt < %@", date];
RLMResults *results = [RealmModel objectsWhere:query];
```
↑でやると↓が出て落ちる。

```
Terminating app due to uncaught exception 'Invalid value', reason: 'Expected object of type date for property 'createdAt' on object of type 'RealmModel', but received: 2015-11-01 00:00:00 +0000'
```
Python で S3 に保存されているファイルの種類を調べる方法

S3 へのアクセスは boto3 というライブラリを使う。
ファイルの種類は libmagic を使って mime-type 形式で取得する。

まずは、ライブラリ群のインストール:

    $ brew install libmagic
    $ pip install python-magic
    $ pip install boto3

次にスクリプト:

```py3
# 対象ファイルのパスのプレフィックス
key_prefix = 'uploads/'

# 対象ファイル名のパターン
key_pattern = 'uploads/\d+/images/.*'

# ダウンロード用の一時ファイル名
temporary_filename = '/tmp/downloaded_file'

for s3_object in bucket.objects.filter(Prefix=key_prefix):
    if not re.match(key_pattern, s3_object.key):
      continue
    s3_object.Object().download_file(temporary_filename)
    mime_type = magic.from_file(temporary_filename, mime=True)
    print("{}: {}".format(s3_object.key, mime_type)
```
Pythonスクレイピングメモ

Pythonでスクレイピングをする時に使えるツールなどのメモです。

# requests - Webからデータを取得する

PythonでWebへのアクセスをする時に最も手軽な方法は `requests` を使う方法です。pipでインストールできます。
GETとPOSTはrequests.getとrequests.postを使えば大体事足ります。

インストール

```
$ pip install requests
```



詳しくはこちらを参照してください。
http://requests-docs-ja.readthedocs.org/en/latest/

# BeautifulSoup4 - HTMLを解析する

HTMLを解析するにはBeautifulSoup4を使うと良いでしょう。

```py
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<div><h1 id="test">TEST</h1></div>', 'html')
>>> soup.select_one('div h1#test').text
'TEST'
```

タグ内の文字は`soup.text`で、属性には`soup['id']` (idのところは属性名)でアクセスできます。

BeautifulSoup objectのよく使うmethod

- BeautifulSoup.find() -> タグを検索して最初にhitしたタグを返す
- BeautifulSoup.find_all() -> タグを検索してhitしたタグのリストを返す  
- BeautifulSoup.find_previous() -> 一つ前のタグを返す
- BeautifulSoup.find_next() -> 一つ後ろのタグを返す
- BeautifulSoup.find_parent() -> 親タグを返す
- BeautifulSoup.select() -> css selectorでタグのリストを返す
- BeautifulSoup.select_one() -> css selectorで検索して最初にhitしたタグを返す


詳しくはこちらを参照してください。
http://kondou.com/BS4/

# データの永続化

## CSV形式

CSVはカンマで区切られた形式のファイルです。csvモジュールが使えます。
csv モジュールのさらに詳しい内容についてはこちらを参照してください。
http://docs.python.jp/3.4/library/csv.html

### 書き込み

```py
import csv
with open('some.csv', 'wb') as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)
```

### 読み取り

```py
import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
```

## JSON形式

JSON形式もよく使われる形式です。標準モジュールの `json` モジュールを使用します。

```py
>>> import json
>>> json.dumps([1, 2, 3, 4])
'[1, 2, 3, 4]'
>>> json.loads('[1, 2, 3, 4]')
[1, 2, 3, 4]
>>> json.dumps({'aho': 1, 'ajo': 2})
'{"aho": 1, "aro": 2}'
>>> json.loads('{"aho": 1, "ajo": 2}')
{u'aho': 1, u'aro': 2}
```

- json.dumps() -> オブジェクトをJSON文字列にする
- json.loads() -> JSON文字列をオブジェクトにする
- json.dump() -> オブジェクトをJSON文字列にしてそれをファイルに書き込む
- json.load() -> ファイル内のJSON文字列を読み込んでオブジェクトにする

詳しい内容についてはこちらを参照してください。
http://docs.python.jp/3.4/library/json.html

# サンプル

スクレイピングのサンプルとしていくつか準備しています。参考にしてください。ただし一般のサイトもあるのでリクエストをバンバン投げることはやめてください。
間違ってもループをそのまま回したらダメですよ。

- PyConJPからチュートリアルの情報を抜き取る https://github.com/TakesxiSximada/happy-scraping/tree/master/pycon.jp
- PyPIから新着パッケージの情報を抜き取る  https://github.com/TakesxiSximada/happy-scraping/tree/master/pypi.python.org
- DjangoのAdminサイトの認証を突破する https://github.com/TakesxiSximada/happy-scraping/tree/master/djangoadmin
- User-Agent詐称 https://github.com/TakesxiSximada/happy-scraping/tree/master/fake-useragent
- Javascriptで動的に生成されるデータを抜き取る https://github.com/TakesxiSximada/happy-scraping/tree/master/dynamic-page
# データ取ってみたら面白そうなサイト

- https://teratail.com/ トップページのエントリとか刈り取ってみるとよいかも
- http://isitchristmas.com/ クリスマス判定 (時期的に)
- https://data.nasa.gov/developer NASAのデータが利用できるので調べてみると面白いものがあるかもしれない 

他にも良さそうなサイトはいっぱいありそう...
Elixir: Faker を使って Ecto にテストデータを作成する

# 概要

Elixir の [```Faker```](https://github.com/igas/faker) を使って、データベースにテスト用のダミーデータを作成します。


# Faker

Faker はダミーのデータを作成するツールです。

構造的には多言語構造をしていますが、現在はほとんど英語のダミーデータが生成されます（一部、ロシア語で生成できます）。
日本語に対応した同様なモジュールとしては [KazuCocoa/elixir-gimei](https://github.com/KazuCocoa/elixir-gimei) があります。

生成できるデータには 名前、住所、URL、e-mail アドレスなどがあります。詳細は、[Hex doc](http://hexdocs.pm/faker/extra-api-reference.html#content) を参照してください。

# 準備

データベースを使用する適当なプロジェクトを用意します。今回は[こちらのサンプルコード](https://github.com/yasuhiro-okada-aktsk/sample_elixir_ecto_select/tree/ecto)を使います。

```deps``` に ```faker``` を追加します。

```ex:mix.exs
  defp deps do
    [ {:ecto, "~> 1.0"},
      {:mariaex, ">= 0.0.0"},
      {:faker, "~> 0.5", only: [:test, :dev]}
    ]
  end
```

```application``` の ```applications``` にも追加します。

```ex:mix.exs
  def application do
    [applications: apps]
  end

  defp apps() do
    apps = [:mariaex, :ecto, :logger]
    if Mix.env in [:test, :dev] do
      apps = apps ++ [:faker]
    end

    apps
  end
```

# ダミーデータの作成

適当な ```.exs``` ファイルにデータ作成のコードを書きます。
下記は RSS の Feed データのダミーデータ作成の例です。

```ex:priv/repo/make_fake.exs
SampleElixirEctoSelect.Repo.start_link

alias SampleElixirEctoSelect.RssFeed

Enum.map 0..99,
  fn _ ->
    params = %{
      feed_url: Faker.Internet.url,
      title: Faker.Commerce.product_name,
      subtitle: Faker.Company.bs,
      summary: Faker.Lorem.Shakespeare.romeo_and_juliet,
      link: Faker.Internet.url,
      author: Faker.Name.name,
      image: Faker.Internet.image_url,
    }

    feed = %RssFeed{}
    changeset = RssFeed.changeset(feed, params)

    try do
      SampleElixirEctoSelect.Repo.insert!(changeset)
    rescue
      # ignore error
      _ -> {}
    end
  end
```

次の作成したスクリプトを実行します。

```bash
mix run priv/repo/make_fake.exs
```

完成後のコードは[こちら](https://github.com/yasuhiro-okada-aktsk/sample_elixir_ecto_select/tree/faker)です。

# 参考

* [igas/faker](https://github.com/igas/faker)
* [API Reference – Faker v0.6.0](http://hexdocs.pm/faker/extra-api-reference.html)
* [KazuCocoa/elixir-gimei](https://github.com/KazuCocoa/elixir-gimei)