OmniAICreator/Qiita-1.07M huggingface dataset:
コーディングスタイル

自分好みのコーディングスタイルについての記事を集める。

* [そのelse文、本当に必要？ | 今日から始めるリファクタリング](http://refactoring-brique.info/logic/else/ "そのelse文、本当に必要？ | 今日から始めるリファクタリング")
* [リファクタリングのエッセンス | GuildWorks Blog](http://blog.guildworks.jp/2014/09/09/%e3%82%b3%e3%83%bc%e3%83%89%e3%81%ae%e8%a8%ad%e8%a8%88%e6%94%b9%e5%96%84%e3%81%ae%e3%82%a8%e3%83%83%e3%82%bb%e3%83%b3%e3%82%b9/ "リファクタリングのエッセンス | GuildWorks Blog")
* [「場合分け」の書き方あれこれ | GuildWorks Blog](http://blog.guildworks.jp/2014/10/14/%e3%80%8c%e5%a0%b4%e5%90%88%e5%88%86%e3%81%91%e3%80%8d%e3%81%ae%e6%9b%b8%e3%81%8d%e6%96%b9%e3%81%82%e3%82%8c%e3%81%93%e3%82%8c/ "「場合分け」の書き方あれこれ | GuildWorks Blog")
* [ブール値を返すメンバー関数の命名規則](http://www.aerith.net/design/bool-j.html "ブール値を返すメンバー関数の命名規則")
OSXでtumblr_clientのgemが動かないとき

RubyからTumblrを触りたくて、[tumblr_client](https://github.com/tumblr/tumblr_client)というgemを使ってみた。
CentOSでは機嫌よく動いていたのに、Macでは下記のエラーで動かず。

```
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/simple_oauth-0.3.0/lib/simple_oauth/header.rb:88:in `attributes': SimpleOAuth: Found extra option keys not matching ATTRIBUTE_KEYS: (RuntimeError)
  [:api_host, :consumer_secret, :token_secret]
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/simple_oauth-0.3.0/lib/simple_oauth/header.rb:74:in `signed_attributes'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/simple_oauth-0.3.0/lib/simple_oauth/header.rb:80:in `normalized_attributes'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/simple_oauth-0.3.0/lib/simple_oauth/header.rb:62:in `to_s'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/faraday_middleware-0.9.1/lib/faraday_middleware/request/oauth.rb:41:in `call'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/faraday-0.9.0/lib/faraday/rack_builder.rb:139:in `build_response'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/faraday-0.9.0/lib/faraday/connection.rb:377:in `run_request'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/faraday-0.9.0/lib/faraday/connection.rb:140:in `get'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/tumblr_client-0.8.4/lib/tumblr/request.rb:8:in `get_response'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/tumblr_client-0.8.4/lib/tumblr/request.rb:26:in `get'
	from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/tumblr_client-0.8.4/lib/tumblr/blog.rb:40:in `posts'
	from tumblr.rb:25:in `initialize'
	from tumblr.rb:53:in `new'
	from tumblr.rb:53:in `<main>'
```

### 直し方

[ruby SimpleOAuth error](http://stackoverflow.com/questions/26295611/ruby-simpleoauth-error)
stackoverflowにドンピシャの質問があった。
けど、回答が「エラー出てるライブラリを直接書き換えて直せ」とか「ライブラリにこのファイルを上書きしろ」みたいな内容でドン引き。いいのそれ？

ひとつだけ「simple_oauthの0.2.0を使え」ってのがあったので、試してみた。

```rb
require 'rubygems'
gem 'simple_oauth', '=0.2.0'
require 'simple_oauth'
```
自分の書いてたコードの頭に追加。
**→動いた！**
requestsを使ってWebAPIをたたく 例題：Flickr


Pythonのrequestsを使うとWebAPIが簡単にたたける。今回は例としてFlickrでの検索を行う

##Install
PyPiに登録されているのでpipまたはeasy_installを使ってインストール

```bash
$ pip install requests
```
or

```bash
$ easy_install -U requests
```
##API Keyの取得
Flickrのアカウントを持っていない場合は必要に応じて取得する。

下記のアドレスにアクセスしアプリケーションの登録を行いAPI KeyとSECRETを入手する。非商用ならNon-Commercialで登録する。
https://www.flickr.com/services/apps/create/apply/



##Flickrで検索
###サンプルコード
API keyとSecretが取得できたら下記のようにいくつかのパラメータを設定しrequestsでGETすることでJSON形式でデータを取得することができる。

```python
# -*- coding: utf-8 -*-

import json
import requests

url = 'https://api.flickr.com/services/rest/'
API_KEY = 'YOUR_API_KEY'
SECRET_KEY = 'YOUR_SECRET_KEY'


query = {
        'method': 'flickr.photos.search',
        'api_key': API_KEY,
        'text': 'sky',  #検索ワード
        'per_page': '5',  #1ページ辺りのデータ数
        'format': 'json',
        'nojsoncallback': '1'
        }

r = requests.get(url, params=query)

print r
print json.dumps(r.json(), sort_keys=True, indent=2)
```
`flickr.photos.search` の設定可能なパラメータは下記を参照
[flickr.photos.search](https://www.flickr.com/services/api/flickr.photos.search.html)

###レスポンス
上記プログラムのレスポンスは下記のようになる
（レスポンスのデータはFlickrの状況に依存するため必ずしも一致しない）

```Response
<Response [200]>
{
  "photos": {
    "page": 1,
    "pages": 13568371,
    "perpage": 2,
    "photo": [
      {
        "farm": 6,
        "id": "14914864943",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "124218704@N03",
        "secret": "593dc8728a",
        "server": "5606",
        "title": "P1010144"
      },
      {
        "farm": 6,
        "id": "15349495280",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "24213796@N02",
        "secret": "ef0aa50b3f",
        "server": "5603",
        "title": "Hot Air Balloon"
      }
    ],
    "total": "27136741"
  },
  "stat": "ok"
}
```

##画像の取得
実際の画像は下記のレスポンスで得られたパラメータを下記のフォーマットURLを作成することで取得できる。

`http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}.jpg`

##参考
[PythonでFlickr APIを使って写真を検索する](http://bty.sakura.ne.jp/wp/archives/1196)
MariaDB 10.1 速攻インストール手順

掲載するまでもないのですが、コピペでインストールから起動までいけますのでお試しあれ

## CENTOS 6.5 64BIT 版

```bash
rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

cat << '_EOT_' > /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.0/centos6-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1
_EOT_

yum install MariaDB-devel MariaDB-client MariaDB-server MariaDB-common MariaDB-connect-engine MariaDB-shared MariaDB-cassandra-engine.x86_64

/etc/init.d/mysql start

```

## CENTOS 6.5 32BIT 版

```bash
rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

cat << '_EOT_' > /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.0/centos6-x86/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1
_EOT_

yum install MariaDB-devel MariaDB-client MariaDB-server MariaDB-common MariaDB-connect-engine MariaDB-shared MariaDB-cassandra-engine.x86_64

/etc/init.d/mysql start

```
Windows de Vagrant + ChefDK

# 前提条件
* Windows7 Service Pack 1
* Virtualbox 4.3.16
* Vagrant 1.6.5
* ChefDK 0.3.0

# インストール
* 下記のGEMをインストールする。
<pre>
c:\opscode\chefdk\bin\chef gem install knife-solo
</pre>

# Vagrantfile作成
* Vagrantfileを新規作成し、編集する。
* Boxファイルはvagrant cloudのchef/centos-6.5を使用する。
<pre>
vagrant login
vagrant init chef/centos-6.5
</pre>

```rb:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provision "chef_solo" do |chef|
  chef.cookbooks_path = ["./chef-repo/site-cookbooks", "./chef-repo/cookbooks"]
  chef.roles_path = "./chef-repo/roles"
  chef.add_role "local"
  end
```

# Vagrant起動
<pre>
vagrant up
</pre>

# GuestOSへSSH
<pre>
Host:127.0.0.1
Port:2222
User:vagrant
Key:~/.vagrant.d\insecure_private_key
</pre>

# GuestOSにCHefDKインストール
<pre>
$ sudo rpm -ivh https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.3.0-1.x86_64.rpm
</pre>

# Chefリポジトリ作成
<pre>
c:\opscode\chefdk\bin\knife solo init chef-repo
</pre>

# Chef Cookbook作成
<pre>
cd chef-repo
c:\opscode\chefdk\bin\knife solo create httpd -o sitecookbooks
</pre>

```rb:roles/local.json
{
  "name": "local",
  "default_attributes": { },
  "override_attributes": { },
  "json_class": "Chef::Role",
  "description": "local",
  "chef_type": "role",
  "run_list": [
    "recipe[httpd]"
  ]
}
```

# Apache Recipe作成
```rb:site-cookbooks\httpd\recipes
package "httpd" do
  action :install
end

service "httpd" do
  supports :status => true,:restart => true,:reload => true
  action [:enable,:start]
end
```

# プロビジョニング
<pre>
vagrant provision
</pre>
無停止リリース参考

## 参考サイト

参考ページを加えていく。

* [データセンター移行に伴い、 MySQLをカジュアルにアップグレードしたお話](http://www.slideshare.net/n0ts/mysql-12601627?qid=fca97b83-f565-4bc5-af88-156edc0f7729&amp;v=qf1&amp;b=&amp;from_search=3 "データセンター移行に伴い、 MySQLをカジュアルにアップグレードしたお話")
* [クックパッドでのVPC移行について](http://www.slideshare.net/winebarrel/vpc-14281906?qid=fca97b83-f565-4bc5-af88-156edc0f7729&amp;v=qf1&amp;b=&amp;from_search=1 "クックパッドでのVPC移行について")
* [Server Migration with Zero Downtime | Sisyphian Tales](http://www.sisyphiantales.com/server-migration-with-zero-downtime/ "Server Migration with Zero Downtime | Sisyphian Tales")
* [Upgrading GitHub to Rails 3 with Zero Downtime – Shay Frendt](http://shayfrendt.com/posts/upgrading-github-to-rails-3-with-zero-downtime/ "Upgrading GitHub to Rails 3 with Zero Downtime – Shay Frendt")
* [AWS, chef, Cinnamon等を使った無停止デプロイ(PrePAN carton 1.0化の裏側) - $shibayu36-&gt;blog;](http://shibayu36.hatenablog.com/entry/2013/09/14/192829 "AWS, chef, Cinnamon等を使った無停止デプロイ(PrePAN carton 1.0化の裏側) - $shibayu36-&gt;blog;")
* [開発メモ#2 : AWS でのホスト / クラウドネイティブなデプロイ - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20130128/1359369101 "開発メモ#2 : AWS でのホスト / クラウドネイティブなデプロイ - naoyaのはてなダイアリー")
* [Tomcat7 でゼロダウンタイムデプロイ - mallowlabsの備忘録](http://d.hatena.ne.jp/mallowlabs/20130315/tomcat7_zerodowntime_deploy "Tomcat7 でゼロダウンタイムデプロイ - mallowlabsの備忘録")

## キーワード

用語が統一されていないので、検索する際のキーワード候補。

* ゼロダウンタイムリリース
* 無停止リリース
* 無停止デプロイ
* ゼロダウンタイム
* Zero Downtime
AWS-SDK for Ruby V2 をつかって Spot Instance の価格履歴を取れるだけ取ってみる

[aws-sdk-core](https://github.com/aws/aws-sdk-core-ruby)を利用してSpot Instanceの価格履歴を取れるだけ取ってみる。

とれるだけといいつつ、AWSコンソール上でSpot Instanceの価格履歴を見る場合3ヶ月前までしかみれないので、その程度までなら取れるかなと予想しつつ…

とりあえずコード（詳細はコメント）
SDKで利用してるのは[スポットインスタンスの履歴取得](http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html#describe_spot_price_history-instance_method)の部分だけ

```rb:spot.rb
#! /usr/bin/env ruby
require 'aws-sdk-core'
require 'date'

# リージョンを東京に指定
Aws.config[:region] = 'ap-northeast-1'
EC2 = Aws::EC2::Client.new

historys = []
token = ''
# Linux/UNIXのVPCだけを対象
products  = ['Linux/UNIX (Amazon VPC)']



while true do
  # Spot Instanceの課金履歴を取得して結果を格納
  response = EC2.describe_spot_price_history(
                 max_results:1000,  # 最大1000件まで取得
                 instance_types:["m1.medium"], # |(パイプ)でつないだりすると取得する対象が増える
                 filters:[{name:'product-description',values:products}], # LinuxやらWindowsやらSuseやら指定
                 next_token:token 
                  # 1000件で取りきれなかった場合トークンが返ってくる。
                  # トークンを一緒につけてリクエストし直すと続きから返ってくる。
                  # すべて返しきったらトークンがなくなる。
               )
  # 取得した履歴を格納
  historys.concat(response[:spot_price_history])
  # トークンを格納
  token = response[:next_token]
  
  break if token == '' # トークンが空の場合終了
end

# タイムスタンプでソート
historys = historys.sort_by{|val| val[:timestamp]}

# 履歴の件数と、最新の履歴と最古の履歴の出力
puts historys.size
puts historys[0][:timestamp]
puts historys[-1][:timestamp]

```

とりあえず実行してみた

```bash
$ ruby spot.rb
1409
2014-08-14 23:11:42 UTC
2014-10-14 11:24:23 UTC
```
約1400件の履歴を取得、最低でも2回はループが回ったはず、
しかし2ヶ月分しか取れてない。
今度は取得期間を指定してみる。

追加分

```rb
require 'date'
# Startに今から5ヶ月前の日時を、Endに今の日時を格納
Now = DateTime.now
Start = Now << 5
End = Now
```

変更分

```rb

  response = EC2.describe_spot_price_history(
                 start_time:Start,  # 5ヶ月前の日時を指定
                 end_time:End,      # 今の日時を指定
                 max_results:1000,  # 最大1000件まで取得可能？
                 instance_types:["m1.medium"], # |(パイプ)でつないだりすると取得する対象が
                 filters:[{name:'product-description',values:products}], # LinuxやらWindowsやらSuseやら指定
                 next_token:token 
                  # 1000件で取りきれなかった場合トークンが返ってくる。
                  # トークンを一緒につけてリクエストし直すと続きから返ってくる。
                  # すべて返しきったらトークンがなくなる。
               )
```

再度実行してみる。

```bash
$ ruby spot.rb
1499
2014-07-15 22:38:53 UTC
2014-10-14 11:24:23 UTC
```
再度実行した所取得件数は増えました。
しかし5ヶ月前から取得するようにしていたが、3ヶ月分しか取得できなかった。
なので、当初の予想どおりっちゃ予想通り。

とりあえずこれでSpot Instanceの履歴を取れるだけ撮れるようになったのかなと思います。
あとはフィルターの値を変更すれば応用は利くかと…
また、出力をうまいことして、Rなどで整形すればSpot Instanceの価格変動の様子とか結果的に一番お得なインスタンスとかみれるかもしれませんかね？
その辺りはまたやっていこうかと…

以上！
Itamae | vagrant-itamae plugin で Vagrantにトイレを設置 #devops #itamae

# Itamae | vagrant-itamae plugin で Vagrantにトイレを設置 #devops #itamae

## 概要
プロビジョニングツール Itamae

vagrant-itamae plugin で プロビジョニングを行います。
[vagrant-itamae GitHub](https://github.com/chiastolite/vagrant-itamae)
toilet コマンドのインストールします。

※toilet コマンドについては下記リンク参照
http://www.tecmint.com/20-funny-commands-of-linux-or-linux-is-fun-in-terminal/

## インストール

~~~
$ vagrant plugin install vagrant-itamae
~~~

## 試行
### 前提
動作確認に使用した Vagrantfile

~~~
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "itamae-target" do |web|
    web.vm.provider :virtualbox do |vb|
      vb.name = "itamae_target"
    end
    web.vm.hostname = "itamae-target"
    web.vm.box = "precise64"
    web.vm.network :private_network, ip: "192.168.33.99"

    config.vm.provision :itamae do |config|
      config.sudo = true
      config.recipes = ['./recipe.rb']
    end
  end
end
~~~

### 仕様
* toilet をインストールするだけのレシピを利用。

~~~
execute 'apt-get-upgrade' do
  command 'apt-get upgrade -y'
end

execute 'apt-get update' do
  command 'apt-get update -y'
end

package "toilet" do
  action :install
end
~~~

* Vagrant の VM名は itamae_target
* user は vagrant

### 実行

~~~
# プロビジョニング実行
$ vagrant up
$ vagrant ssh
$ which toilet
/usr/bin/toilet
$ toilet -v
TOIlet Copyright 2006 Sam Hocevar
Internet: <sam@hocevar.net> Version: 0.2, date:

TOIlet, along with the various TOIlet fonts and documentation, may be
freely copied and distributed.

If you use TOIlet, please send an e-mail message to <sam@hocevar.net>.

The latest version of TOIlet is available from the web site,
        http://libcaca.zoy.org/toilet.html

Usage: toilet [ -hkostvSW ] [ -d fontdirectory ]
              [ -f fontfile ] [ -F filter ] [ -w outputwidth ]
              [ -I infocode ] [ -E format ] [ message ]

$ toilet "Itamae" -F gay

 mmmmm    m
   #    mm#mm   mmm   mmmmm   mmm    mmm
   #      #    "   #  # # #  "   #  #"  #
   #      #    m"""#  # # #  m"""#  #""""
 mm#mm    "mm  "mm"#  # # #  "mm"#  "#mm"
~~~

![itamae_toilet_gay.png](https://qiita-image-store.s3.amazonaws.com/0/43480/df6bba5e-c0ff-3b0f-a6e0-8cb8d0745112.png)

## 参照
* [Itamae GitHub](https://github.com/ryotarai/itamae)
* [vagrant-itamae GitHub](https://github.com/chiastolite/vagrant-itamae)
* [軽量・高速版 Chef 「Itamae」。 プロビジョニングツールの学習コスト低下。Berkshelfからの解放。Chef Solo から Chef Zero への移行からの解放 #devops #itamae](http://qiita.com/tbpgr/items/3b6796c1cfc3c3e5521f)
* [Itamae | vagrant オプションで Vagrantにトイレを設置 #devops #itamae](http://qiita.com/tbpgr/items/491dafe00643d3331b82)
（Mac）pryで日本語がどうしても文字化けする

rbenvで入っていたrubyをアンインストール、
readlineやopen-ssl等を入れて、
readlineオプション等をつけて、
インストールしてrehashしてみたけど、

日本語文字化けが解消しない！

ログインしなおしたりgemアンインストールしてみたりしたけど、解消しない！
`which pry`したら`/Users/xxx/.rbenv/shims/pry`ってちゃんと出るのに、PATHもちゃんとここに通ってるのに、解消しない！

# 解決
1. gemのpryをアンインストール（`gem uninstall pry`）
2. `which pry`で`/usr/bin/pry`が出てきた！誰キミ。
3. →　`rm /usr/bin/pry`  
  ちなみに、中身はライブラリをロードしているようだった。
4. もう一度gemでインストール（`gem install pry`）
5. シンボリックリンクを貼る（`sudo ln -s /Users/xxx/.rbenv/shims/pry /usr/bin/pry`）


なおった！
腑に落ちなかったけど、まぁいいか。
CentOSでGeoIPを利用してHTTPアクセスを制御する

#GeoIP

maxmindが提供する、IPアドレスから地理情報を確認することができるサービス(GeoIP)。

無償版と有償版が用意されている。

https://www.maxmind.com/

#料金体系

GeoIP2 Databases

| Database | Lite | 国 | 都市 |
|:-----------|------------:|:------------:|:------------:|
|精度の高い情報|-|◎|◎|
|頻繁な更新|-|◎|◎|
|月額|free|$12|$90|
|大陸|◎|◎|◎|
|国|◎|◎|◎|
|都市|-|-|◎|
|郵便コード|-|-|◎|
|緯度経度|-|-|◎|

###詳しい料金体系
https://www.maxmind.com/ja/geoip2-databases

###Databaseの精度の確認
こちらに国名を入力して確認できる。
https://www.maxmind.com/ja/geoip2-city-accuracy?country=&resolution=postal

#GeoIP2 Liteを使用しApacheのアクセスを国別に制限する

OSはCentOS6.5を使用する。

パッケージインストール

```sh
yum install mod_geoip GeoIP GeoIP-devel GeoIP-data zlib-devel
```

データベース取得

```sh
cd /usr/share/GeoIP/
mv GeoIP.dat GeoIP.dat_org
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
gunzip GeoIP.dat.gz
```

Apacheモジュール設定

```apache:/etc/httpd/conf.d/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPScanProxyHeaders On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat MemoryCache
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat CheckCache
</IfModule>

#ログ出力したい用
LogFormat "%a [%h] %u %t %D \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"   GeoIP_Address=\"%{GEOIP_ADDR}e\" Country_Code=\"%{GEOIP_COUNTRY_CODE}e\" Country_Name=\"%{GEOIP_COUNTRY_NAME}e\"" combined
```

国別制限

```apache:/etc/httpd/conf.d/vhost.conf
<Location "/">
  Order Deny,Allow
  SetEnvIf GEOIP_COUNTRY_CODE JP BlockCountry
  #以下どちらか設定
  Allow from env=BlockCountry #日本のみのアクセス許可
  Deny from env=BlockCountry #日本からのアクセス拒否
</Location>

```

データベース更新仕込み

```sh
#!/bin/sh

GEOIP_MIRROR="http://geolite.maxmind.com/download/geoip/database"
GEOIPDIR=/usr/share/GeoIP
TMPDIR=

DATABASES="GeoLiteCity GeoLiteCountry/GeoIP asnum/GeoIPASNum GeoIPv6"

if [ -d "${GEOIPDIR}" ]; then
        cd $GEOIPDIR
        if [ -n "${DATABASES}" ]; then
                TMPDIR=$(mktemp -d geoipupdate.XXXXXXXXXX)

                echo "Updating GeoIP databases..."

                for db in $DATABASES; do
                        fname=$(basename $db)

                        wget --no-verbose -t 3 -T 60 "${GEOIP_MIRROR}/${db}.dat.gz" -O "${TMPDIR}/${fname}.dat.gz"
                        gunzip -fdc "${TMPDIR}/${fname}.dat.gz" > "${TMPDIR}/${fname}.dat"
                        mv "${TMPDIR}/${fname}.dat" "${GEOIPDIR}/${fname}.dat"
                        chmod 0644 "${GEOIPDIR}/${fname}.dat"
                done
                [ -d "${TMPDIR}" ] && rm -rf $TMPDIR
        fi
fi
```

##GeoIPテスト

IPアドレスを入力することで、情報を確認することができます。
https://www.maxmind.com/ja/geoip-demo

アクセスすることで自端末の情報が確認できます。
http://dev.maxmind.com/geoip/geoip2/javascript/


#参考サイト

IPアドレスから地理的位置情報のまとめ
http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/ip-geolocation-restful-apis/

その他サービス
http://www.ipligence.com/free-ip-database?download_form

インストール参考
http://www.tecmint.com/install-mod_geoip-for-apache-in-rhelcentos-6-35-8/
http://www.tabimoba.net/entry/2013/11/20/112905#.VD0mtNTkdoE
Elixir Comprehensions(内包表記) Bitstring generators

# Elixir Comprehensions(内包表記) Bitstring generators

## 概要
Elixir の Comprehensions(内包表記) Bitstring generators について。

## サンプル
8bit × 4 の IP を扱います。

### サンプルコード

~~~
ips=<<255,255,255,0,192,168,1,1,172,16,1,1>>
for <<first_octet::8, second_octet::8, third_octed::8, forth_octed::8 <- ips>>, do: IO.inspect {first_octet, second_octet, third_octed, forth_octed}
for <<first_octet::4, second_octet::4, third_octed::4, forth_octed::4 <- ips>>, do: IO.inspect {first_octet, second_octet, third_octed, forth_octed}
~~~

* 出力

~~~
# 8bit単位
{255, 255, 255, 0}
{192, 168, 1, 1}
{172, 16, 1, 1}

# 4bit単位にした場合
{15, 15, 15, 15}
{15, 15, 0, 0}
{12, 0, 10, 8}
{0, 1, 0, 1}
{10, 12, 1, 0}
{0, 1, 0, 1}
~~~

## 参照
http://elixir-lang.org/getting_started/18.html#18.2-bitstring-generators
俺得Android Studio Tips


##keymap

この辺をよく使います。
自分なりにカスタマイズしたいなら`Preference -> Keymap`で。

機能|key(HHKB)
---|---
Find Usage|`alt + ⌘ + F7`
Go to line(行移動)|` ⌘ + L`
Find(クラス検索)|`Shift + Shift`
ReIndent + Refractor|`alt + ⌘ + L`
Find in Path(キーワード検索)|`shift + ⌘ + f`
Bookmarks|F3で作成、showBookmarksで確認
Quick Documentation|F1(↑でクラスリファレンス)
Code complete|`control + space`
オーバーロードメソッドの引数確認|`⌘ + p`
元のクラスや変数を参照|`⌘ + click`
タブ移動(左/右)|`shift + ⌘ + @ / [`
Go to Related files | `⌘ + control + ↑`
Unindent Selection|`shift + tab`

## Android Studioの.gitignore

```
.DS_Store
*.iml
*.log
*/gen/
*/build/
/.idea/
/local.properties
/gradle/
/gradlew
/gradlew.bat
```

## プラグイン

* .gitignore support
* Markdown
* Genymotion

## Tool button

* Changes

![スクリーンショット 2014-10-14 21.24.46.png](https://qiita-image-store.s3.amazonaws.com/0/26883/cdfc5e1c-cb18-a0f1-d42c-1efc67232322.png)

Source Treeは不要になる。特に、特定のfileのhistoryを見るのに使ってます。
こいつのすごいところはここからで、gitで管理したプロジェクトであれば手動マージの手助けもしてくれます。mergeコマンドを使ってコンフリクトしたファイルを右クリック。

`Git -> Resolve conflict -> merge`

を開くと、merge画面になってクリック操作でコンフリクトを解消できます。

* Scroll from Source

![スクリーンショット 2014-10-14 21.24.13.png](https://qiita-image-store.s3.amazonaws.com/0/26883/4b18613d-60ea-6208-3165-96b2aea1422f.png)

すごいわかりづらいところにあるんだけど、Project Stractureのbarにあります。

![スクリーンショット 2014-10-14 21.31.48.png](https://qiita-image-store.s3.amazonaws.com/0/26883/8bc417f4-fdf1-9c6d-32e5-103ac1329f4c.png)

こいつを使うと今編集中のソースのファイルにジャンプしてくれます。重宝します。

* Structure

![スクリーンショット 2014-10-14 21.24.35.png](https://qiita-image-store.s3.amazonaws.com/0/26883/5f2f03c0-a770-d49c-def1-128bff04559b.png)

一つのJavaファイルのメソッドとかを確認できる。特に珍しくもないけど重宝。フィールド変数だけとかも設定で出せる。

* スクショ

![スクリーンショット 2014-10-14 21.53.33.png](https://qiita-image-store.s3.amazonaws.com/0/26883/49603726-2d9f-bf5a-977a-6d8a9d289f0d.png)

早いし、ピクセル単位で追えるので重宝。

## xml

似たようなxmlを何度も書かないためには

* まとめたいlayoutやwidgetの上で右クリック
* `Refactor -> style`
* style名の指定
* Launch ‘Use Style Where Possible’ refactoring after the style is extractedをチェック

書いている内容が同じものは全て一つになってstyles.xmlにまとまる。

## リファクタリング

Refactor機能は便利すぎて死にます。

* Filedに移す

ローカル変数をグローバルにしたいときに以下の要領で可能。

Filedに移したい変数で右クリック
![スクリーンショット 2014-11-05 10.54.40.png](https://qiita-image-store.s3.amazonaws.com/0/26883/87b9d70d-8bc2-c6b6-4a8f-7b0fb9180c75.png)

`Refactor->Extract->File…`を選択

![スクリーンショット 2014-11-05 10.55.26.png](https://qiita-image-store.s3.amazonaws.com/0/26883/d54d05af-c5d6-1110-4ddc-08ac27fa0160.png)

赤く四角で囲まれるので、変更後のFiled名をタイプすると全て置き換わる。
イニシャライズの場所も指定可能。

![スクリーンショット 2014-11-05 10.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/26883/5c2634a0-3ad2-2c6e-ba65-4bfbf0b8f414.png)
ファイルを保存したときにテストを自動で実行する

# はじめに
GO言語を使ったTDDに慣れて来て、毎回、```go test```を手動で実行するのも面倒だなぁと思い始めた矢先。
先日の「[TDDBC Sendai 4th](http://devtesting.jp/tddbc/)」でRubyチームがテストを自動実行していたのを見て、自分のGO環境も同じように構築したときのメモ。

## 今回構築するとできあがる環境
- ファイルを保存する度に自動でテストを実行

## 使用するツール
- Sublime Text 3:テキストエディタ
- GoSublime:Sublime Text 3 のプラグイン
- gospel:Rspec風のテスティングフレームワーク
- bundler：Rubyのgemパッケージ管理ツール
- guard-go:ファイル監視ツール

## 前提条件
既に下記のツールや実行環境がインストール済みであることを前提とします。

1. [Sublime Text 3](http://www.sublimetext.com/3)
2. [GoSublime](https://github.com/DisposaBoy/GoSublime)
3. [gospel](http://r7kamura.hatenablog.com/entry/2013/10/06/231236)
4. [Ruby](https://www.ruby-lang.org/ja/)

# 自動テスト環境セットアップ
ファイルが保存される度に自動でテストを実行する環境を構築します。セットアップするツールは下記の２つです。

1. bundler
2. guard-go

## bundler
```
$ gem install bundler
```

### 初期化
```
$ cd /your/project/dir
$ bundle init
```

### Gemfile修正

```Gemfile
gem 'guard-go'
```


## guard-go
### インストール
```
$ bundle install
```


### Guardfile 生成
コマンドを使って、Guardfileを生成します。

```
$ bundle exec guard init go
```

### 設定
ファイルが保存されたら、自動でテストが実行されるように設定を変更します。
Guardfileに ***:test => true*** を追加

```Guardfile
guard 'go', :server => 'app.go', :test => true do
  watch(%r{\.go$})
end
```

追加した「:test」以外に「:build_only」や、「:args」、「cmd」があります。詳しくは[本家](https://github.com/victorcoder/guard-go)を参照してください。

## Guard実行
:serverに設定したファイルを作成したあと、guardを起動します。

```
$ touch app.go 
$ bundle exec guard
```

### :serverに指定したファイルがないと…
こんなエラーが発生します。

```
21:43:48 - ERROR - Invalid Guardfile, original error is:
> [#] Server file not found. Check your :server option in your Guarfile.
```

# サンプルコード
[GitHub](https://github.com/135yshr/helloworld_go)にサンプルコードを用意しました。
Dropwizard with jdbiでのトランザクション


Dropwizardでjdbiを使う場合、以下を気にする必要があります。

* トランザクション境界をどうするか
* dao一つ一つが別のトランザクション


# Resourceにトランザクション境界を作る

まずは、トランザクション境界をResourceクラスにします。

daoで  ```org.skife.jdbi.v2.sqlobject.mixins.Transactional``` 　を継承します。

```PersonJdbiRepository.java
public interface PersonJdbiRepository extends Transactional<PersonJdbiRepository> {

    @SqlBatch("insert into people (fullName, jobTitle) values (:fullName, :jobTitle)")
    void createMany(@BindBean Iterator<Person> iterator);
・・・
```

次にResourceクラスで、```inTransaction```　メソッドを利用します。＠org.skife.jdbi.v2.sqlobject.Transactionを利用しても駄目です。
引数の ```Transaction``` 実装内で例外が起きるとrollbackされるようになります。

```PeopleJdbiResource.java

    private final PersonJdbiRepository repository;

    @POST
    public List<Person> createBatch() {
        repository.inTransaction(new Transaction<Void, PersonJdbiRepository>() {
            @Override
            public Void inTransaction(PersonJdbiRepository transactional, TransactionStatus status) throws Exception {
                List<Person> people = new ArrayList<Person>();
                people.add(new Person("ko2ic", "batch1"));
                people.add(new Person("ko2ic", "batch2"));
                repository.createMany(people.iterator());
                return null;
            }
        });
        return listPeople();
    }
```

# 複数Dao対応

次は、二つのDao間で一つのトランザクションにしたい場合の対処です。

これは特殊な（微妙な）処理をしなければなりません。
一方のDaoにもう一つのDaoを取得するメソッドを追加し、そのメソッドに　```@CreateSqlObject``` アノテーションを付けます。
そして、両方を呼び出すメソッドを作ります。
文章にしてもよくわからないと思うのでコードを見て下さい。


```PersonJdbiRepository.java
public abstract class PersonJdbiRepository implements Transactional<PersonJdbiRepository> {

    @SqlBatch("insert into people (fullName, jobTitle) values (:fullName, :jobTitle)")
    public abstract void createMany(@BindBean Iterator<Person> iterator);

    @CreateSqlObject
    public abstract TempJdbiRepository createTempJdbiRepository();

    public int createWithTemp(Iterator<Person> iterator) {
        createMany(iterator);
        TempJdbiRepository repository = createTempJdbiRepository();
        repository.create();
        // throw new IllegalArgumentException();
        return repository.count();
    }
}
```

```createWithTemp()``` メソッドの実装が必要なので、abstract classにしています。java8のdefault実装ではできませんでした。
```createWithTemp()``` メソッドに ```@org.skife.jdbi.v2.sqlobject.Transaction``` を書くとこのメソッドがトランザクション境界になります。
Resourceクラスをトランザクション境界にしたい場合は、上記「Resourceにトランザクション境界を作る」と同様です。

下の実装は、上記内で呼ばれているもう一方のDaoです。

```TempJdbiRepository.java
public interface TempJdbiRepository {

    @SqlQuery("select count(id) from temp")
    int count();

    @SqlUpdate("insert into temp (fullName) values ('fullName')")
    void create();
}
```
[Grails]自動JSONマーシャリングを使う。


# はじめに
今年はGrailsのことを何か書くと宣言していたのに、何もせずにいたのですがようやく書き始めます。Qiitaも初体験なので、不備や改善点があれば教えていただけると幸いです。

今回は、GrailsでJSONを返す方法の一つについて書きます。Grailsのバージョンは2.4.3で試しています。

#自動JSONマーシャリング

GrailsでJSONを返す方法はいくつかありますが、今回は個人的に一番楽チンな自動マーシャリングを使います。なお、マーシャリング（Marshalling）っていうのは、```異なるコンピューターシステムやプログラミング言語の間で、データをやり取りできるようにするための処理```だそうです（[参考](http://dictionary.goo.ne.jp/leaf/jn2/206616/m0u/)）。
そうすると、自動でないマーシャリングもあるのかという話になるわけですが、あります。それはまた別エントリーで。

さて、[日本語ドキュメント](http://grails.jp/doc/2.3.x/guide/theWebLayer.html#xmlAndJSON)の該当部分をみてみると。


```
自動JSONマーシャリング

GrailsではXMLと同じ仕組みで、JSONの自動マーシャリングもサポートしています。単純に先のXMLをJSONにするだけです
```
と記載があり、サンプルとして

```
render Book.list() as JSON
```
と記載されていました。要するに ```as JSON```を呼べばいいわけです。簡単。

## 試してみる

というわけで、例えば

```groovy:Book.groovy 
package jsonsample

class Book {

    String title
    String author

    static constraints = {
    }
}

```
```groovy:BookController.groovy
package jsonsample

import grails.converters.JSON

class BookController {

    def index() {
        render Book.list() as JSON
    }
}
```

とドメインとコントローラーを作りまして、デモ用のデータをBootStrapで作成します。


```groovy:BootStrap.groovy
import jsonsample.Book

class BootStrap {

    def init = { servletContext ->

        new Book(title: "Groovyイン・アクション", author: "Dierk Konig").save()
        new Book(title: "The Definitive Guide to Grails", author: "Graeme Rocher").save()

    }
}
```

その上で、コントローラーをたたくと、(このサンプルの場合は ```http://localhost:8080/JsonSample/book/index```)以下のようなJSONが返ります。

```
[
	{
		"class": "jsonsample.Book",
		"id": 1,
		"author": "Dierk Konig",
		"title": "Groovyイン・アクション"
	},
	{
		"class": "jsonsample.Book",
		"id": 2,
		"author": "Graeme Rocher",
		"title": "The Definitive Guide to Grails"
	}
]
```

単純なドメインであれば、結構簡単に作成できますね。

# 最後に
本当はもう少しディープな内容を書きたかったのですが、前段で力つきたので別エントリー書きます。

## 参考URL

- [Grails日本語ドキュメント](http://grails.jp/doc/2.3.x/guide/theWebLayer.html#xmlAndJSON)
- [英語版のGrailsドキュメント](http://grails.org/doc/latest/guide/theWebLayer.html#xmlAndJSON)
- [その他本家のドキュメントの関連しそうな部分](http://grails.org/doc/2.4.3/ref/Controllers/render.html)
- [Grails: JSONでレスポンスを返す方法＜２つ＞](http://www.matsuaz.com/matsumotojs/2011/03/04/1299246771014.html)
rubyでselfを省略できる時、できない時

# selfを省略できる時

rubyではメソッドの中で、そのメソッドが属しているインスタンスを`self`で参照できます。 そしてこの**selfは省略可能**、というより、メソッド中でレシーバを省略してメソッド呼び出しを行った場合は、暗黙的に`self`がレシーバになります。

```rb
class User
  attr_accessor :name

  def display_name
    puts name # puts self.name と同じ
  end
end

user = User.new
user.name = 'yamada'

user.display_name # 'yamada' と表示する
```

rubyで上記のようにレシーバを省略出来るときは、省略するのが一般的。

**ただし**一点だけ、`self`を省略出来ない場合があります。

# selfを省略できない時

**セッターメソッドを呼ぶ時はselfを省略出来ません**。以下`set_default_name`メソッドの様な例ですね。

```rb
class User
  attr_accessor :name

  def set_default_name
    name = 'unknown' # nameというローカル変数が作られるだけ
    # self.name = 'unknown' # こう書くべき
  end
end

user = User.new
user.set_default_name

user.name # => nil
```

上記の場合だと、最後に`user.name`を呼び出しても`nil`が返ってくるだけです。rubyってとにかくレシーバは省略するんだよね〜、ととりあえず的に覚えてたらちょっと引っかかりやすい。
zshで相対パスをさくっと絶対パスに変換する方法

例えばこんな状況で

```
$ pwd
/private/tmp/hoge/fuga/piyo
$ ls ../test.txt
../test.txt
```

test.txtの絶対パスがさくっと欲しいよー＞＜ という場合、相対パスの後ろに`(:a)`をつけると絶対パスが取れる

```
$ ls ../test.txt(:a)
/private/tmp/hoge/fuga/test.txt
```

タブで補完もしてくれる

```
$ ls ../test.txt(:a)
###　↑この状態でtab押すとこうなる↓
$ ls /private/tmp/hoge/fuga/test.txt
```

くそ便利。

詳細はこちら

- http://qiita.com/mollifier/items/7dd72d6a255ce7273d2a
SELinuxの設定変更をし再起動した場合にカーネルパニックになる、という事象の原因・よくある設定ミスについて。

### 概要
「SELinuxの無効化を設定して、再起動したらカーネルパニックが起きた」という事例を見かけた。
「SELinux　カーネルパニック」などとググると「SELinuxを編集したらgrub.confも編集する必要がある」という記事が多数現れるが、おそらく問題の原因を見誤っている。
（私も昔やらかした）ありがちなミスとリカバリ方法を記述する。

### SELinuxの無効化でのありがちなミス
SELinux無効化の恒久設定では以下のファイルを設定するが、<b>以下のファイルにはパラメータが2つあるので注意が必要。SELINUX（7行目）前後に空行がなくコメントアウトが多いので見落としやすい。<b>

・SELINUX（7行目）
・SELINUXTYPE（11行目）

```file:/etc/selinux/config

[root@ldap01 ~]# less -N /etc/selinux/config

      1
      2 # This file controls the state of SELinux on the system.
      3 # SELINUX= can take one of these three values:
      4 #     enforcing - SELinux security policy is enforced.
      5 #     permissive - SELinux prints warnings instead of enforcing.
      6 #     disabled - No SELinux policy is loaded.
      7 SELINUX=enforcing
      8 # SELINUXTYPE= can take one of these two values:
      9 #     targeted - Targeted processes are protected,
     10 #     mls - Multi Level Security protection.
     11 SELINUXTYPE=targeted
     12
     13

```

SELINUX（7行目）をdisabledにするつもりが、SELINUXTYPE（11行目）をdisabledにしてしまい、rebootをかけると

```

Kernel panic - not syncing: Attempted to kill init!

```

などとカーネルパニックを引き起こす。

### 復旧方法
一応、記載。（「SELINUX カーネルパニック」でググると画像つきのblog記事が多数出てきます）

1. デフォルトOS起動のカウントダウン画面で何かキーを押下
2. GRUBメニューで起動OSを上下で選び、「e」キーを押下
3. 「kernel」行を上下で選び、「e」キーを押下
4. 末尾に「 enforcing=0」を追加（enforgincの前に空白を1つ入れる、イコールの入力は「^」キーを押せば入る）
5. エンターキーで「kernel」を選んだ画面に戻る
6. 「b」キーを押下し、OSを起動する。
7. 起動後、/etc/selinux/configを確認・修正
自作検索エンジン序盤　Google Closure Library のTrie木を使ってみる

自作検索エンジンを作成して何かに利用しようと思っています。

データを格納する一つの手段としてTrie木（トライ木）があるのですが、
どのライブラリを使おうかなと考えてたところ、
closureにもあったので使ってみました。

トライ木はメモリを節約しつつ高速に文字列検索できる構造になっています。
ググれば画像もたくさん引っかかります。

サンプルはこちらに掲載しています。
http://azumaxlife.smile-systems.com/archives/1059

形態素解析エンジンサーバーも建てた( http://azumaxlife.smile-systems.com/archives/1055)
ので、これを利用してTokenizeしてみました。
Vue.jsでTransitionする


# 最初に

下記の公式ページを基にしていますので、そちらを参考にするのが最も良いです。
デモもあるので先に確認した方がイメージが掴みやすいです。

Adding Transition Effects
http://vuejs.org/guide/transitions.html

# サンプルコード

公式ページの方のサンプルコードが断片的だったので、動作確認を兼ねてフルな形で書いてみました。

```html:index.html
<!DOCTYPE html>
<head>
  <title>Vue Transition</title>
  <meta charset="utf-8">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/0.10.6/vue.js"></script>
  <script src="app.js" defer="defer"></script>
  <link rel="stylesheet" href="app.css">
</head>
<body>
  <div id="v-app">
    <h1>Vue Transition</h1>
    <p class="msg" v-if="show" v-transition>Hello!</p>
    <button v-on="click: toggleShow">Toggle</button>
  </div>
</body>
</html>
```

```js:app.js
var app = new Vue({
  el: "#v-app",
  data: {
    show: true
  },
  methods: {
    toggleShow: function(e) {
      this.show = !this.show;
    }
  }
});

```

```css:app.css
.msg {
    transition: all .3s ease;
    height: 30px;
    padding: 10px;
    background-color: #eee;
    overflow: hidden;
}
.msg.v-enter, .msg.v-leave {
    height: 0;
    padding: 0 10px;
    opacity: 0;
}

```

# 解説

メッセージの表示を切り替えるための`show`は、buttonに`toggleShow `メソッドを紐付けることで、ON/OFFを切り替えています。
メッセージのpタグに`v-transition`ディレクティブを指定することで、`v-if`に合わせてトランジション開始時に`v-enter`、終了時に`v-leave`が付与されるので、それに合わせてCSSでtransitionを指定しています。(enter/leaveの名称は`Vue.config()`で変更できます。)
rbenv-gemset


1. gemset create
2. gemset init [hoge]

で 作業ディレクトリの下に .rbenv-gemsets ができあがる。

```bash:
$ rbenv gemset create 2.1.1 sample
$ rbenv gemset list
2.1.1:
  sample
$ rbenv gemset active
no active gemsets
$ rbenv gemset init sample
created sample for 2.1.1
created and initialized the following gemset for use with 2.1.1
=====
sample
=====
$ rbenv gemset file
/home/hoge/.rbenv-gemsets
$ rbenv gemset active
sample global
```

active になっているディレクトリで bundle install すると、次のディレクトリにgemsetsができあがる。

```bash:
$ vim Gemfile
$ bundle install
```

/home/hoge/.rbenv/versions/2.1.1/gemsets/sample/....

の下に、gemsがインストールされ、実行時も参照される。
PMDを使ってObjectiveCの重複コードを検出する


はじめに
======
[僕にそのコピペを直せというのか](http://qiita.com/mima_ita/items/fe1b3443a363e5d90a21) というエントリでPMD-CPDの紹介がされています。

このPMD対応言語が以下のように広いのですが、

* Java
* JSP
* C++
* Ruby
* Fortran
* PHP
* C#
* PLSQL
* Ecmascript

**ObjectiveCがない！** 

ただ、[JenkinsでObjective-Cのコード重複を採れるようにする](http://safx-dev.blogspot.jp/2012/10/jenkinsobjective-c.html) にあるように別途Jarを含ませることで可能になります。

**ただし！** このJarは PMD 4系じゃないと動かないようで、最近の5.1系などではどうも動きません。
**だがしかし!** https://github.com/AndreasGorges/Objective-C-CPD-Language でどうやら 5.1系に対応しているようだ！
**ところが！** このリポジトリにはビルド済みのJarファイルが無い！しかもBuild方法が書かれていない！ 

というわけで、Javaには疎い私ですが、四苦八苦しながらビルドできたので、ビルドする方法とその使い方を説明します。

環境/必要なもの/試したVersion
=====

* MacOS 10.9.5
* brew
* javac 1.7.0_51
* pmd 5.1.3

Setup
======

PMDをInstallする
----

```
% brew install pmd
```


Objective-C-CPD-LanguageをBuildする
-----------

### Mavenが必要っぽいのでInstall

```
% brew install maven
```

### GithubからprojectをClone

```
git clone https://github.com/AndreasGorges/Objective-C-CPD-Language
cd Objective-C-CPD-Language
```

### JarファイルをBuild&Install
※ zshです
※ pmd 5.1.3 のVersion部分は適宜読み替えて下さい

```zsh:build.zsh
mvn javacc:javacc
mkdir build
cp -r src/main/java/net build 
cp -r target/generated-sources/javacc/com build  
cd build
javac -cp .:/usr/local/Cellar/pmd/5.1.3/libexec/lib/pmd-5.1.3.jar -Xlint:unchecked **/*.java  # 警告がいっぱい出るが無視
jar cf ObjCLanguage-0.0.8-SNAPSHOT.jar **/*.class 
cp ObjCLanguage-0.0.8-SNAPSHOT.jar /usr/local/Cellar/pmd/5.1.3/libexec/lib/
```

PMD の ObjectiveC版を使ってみる
=========

こんな感じで使えます。

```
pmd cpd --language ObjectiveC --minimum-tokens 100 --files /path/to/source_code_root_dir
```

詳しい使い方やJenkins連携の方法などは「はじめに」で紹介しているリンク先を参考にしてください。

さいごに
=====

面倒なので build済みのJarファイルをCommitしてしまいました。
以下からDLできます。

https://github.com/mokemokechicken/Objective-C-CPD-Language/raw/master/releases/ObjCLanguage-0.0.8-SNAPSHOT.jar
node.jsのsocket.ioの歴史的経緯にはまったのでまとめとく

# 概要

node.jsのsocket.ioにはまったのでまとめておきます

# socket.ioの歴史的経緯を知る

[socket.io/History.md](https://github.com/Automattic/socket.io/blob/master/History.md)を参考

古くは2010年06月に0.7.0がリリース、2012年02月に0.9.0がリリースとなり、
その後2年の月日を経て2014年05月28日に1.0.0がリリースとなっている。
この経緯の為、WEB上にあるサンプルは **大概動かない**。
最近発売された雑誌でもない限り説明が古いことがある。
あと、0.9系は0.9.16までメモリリーク問題があったので要注意。0.9.17から解消してるそうです。
1.0系はバイナリ送信が利用出来るのでProtocolBuffersとか使えそうですね。
0.9系でのバイナリ送信はBase64で送信する必要があるので効率はいまひとつかなと。

# socket.ioのサンプル

[socket.io/examples/chat/](
https://github.com/Automattic/socket.io/tree/master/examples/chat)を使うのがおすすめです。

各部屋に向けた送信は下記のように調整すればよさそうです

```
io.sockets.on('connection', function (socket) {
  socket.join('[部屋名]');
  socket.broadcast.to('[部屋名]').emit('[メッセージ]');
});
```

# 各プラットフォームの対応状況
各プラットフォームの対応状況は下記を見るとよさそうです。
コードの更新状況見て、最近更新がない場合は0.9に対応かと。
[For up to date information, please head to](https://github.com/Automattic/socket.io/wiki)
Gentooでのネットワークプリンタの設定

# 概要
ネットワーク上からプリンタ［EPSON LP-M6000］をGentooで使う設定方法を記載する

手元にあるもの
* ネットワーク上につながったEPSON LP-M6000
* GUI環境のはいった無線LANの使えるThinkPad(Gentoo/Linux)

## 手順

cupsを入れる

```
# emrege -av cups
```

通常印刷や管理をするユーザを設定する
管理者グループ用の名前を確認して、登録する

```
# less /etc/cups/cups
```

```
# groupadd lpadmin
# gpasswd -a username lpadmin
# gpasswd -a username lp
```

デーモンのスタートと登録

```
# /etc/init.d/cupsd start
# rc-update add cupsd 
```

この後はブラウザで作業するブラウザで以下のURLでアクセス

> http://localhost:631

以下な画面がでるので設定を行う

![無題 1.png](https://qiita-image-store.s3.amazonaws.com/0/56437/a204eff1-6229-b46d-f529-e5fdeca1b55f.png)
ここから設定をしていく
管理者権限を求められた場合には先程lpadminに追加したユーザでログインする
Rootでのログインも可能

1. その他のネットワークプリンタ
https,AppleSocketHP,ipps,http,LPD/LPR,ipp
のうちからLPD/LPRを選択

2. 接続
> lpd://192.168.39.39/
適切に接続先を設定

3. 名前の設定
> EPSON M6000 とかなんたら
適切に名前を設定

4. ドライバの設定
** PPDファイルを持ってきて入れる **
うんたらファイル(ppdv130/Drv/EPSON_LP-うんたら/うんたら.ppd)
5. 登録完了

## 動作テスト
印刷してみよう！

***できた***

***

### 引用元
EPSON LP-M6000の仕様概要 (※使用できるプロトコルを確認)
> http://www.epson.jp/products/back/hyou/printer/lpm6000.htm

CUPS - archwiki.org (※権限設定について)
> https://wiki.archlinux.org/index.php/CUPS

Printing - wiki.Gentoo.org (※CUPSの利用できるUSEフラグについて)
> http://wiki.gentoo.org/wiki/Printing
Eclipse Android SDK Content Loader hangs at 0% 対応のbat作ってみた

Eclipse Android SDK Content Loader hangs at 0% の対応
http://qiita.com/aratakokubun/items/1d47a7dfc646a8e703e4
の続きでbatファイルを作ってみた．

bat自体作るのほぼ初めてだったので，簡単なんだけど以外と時間かかった・・・

やることは非常に単純で以下の通り

1. %USERPROFILE%.androidに移動
2. ddms.cfgを削除
3. cacheの中身を削除

実際の処理は以下の通りです．ファイルチェック，出力を多少しているのでちょっと長いです．間違いがあるかもしれないので，使う際は自己責任でお願いします．また間違いに気づいた方は指摘もお願いします．
別ドライブから実行する場合は"cd /d ~"かな？

```bat
@echo off

rem This bat file works to resolve Eclipse Android SDK Content Loader hanging problem.

rem Change directory to userprofile.android
cd %USERPROFILE%\.android%
echo %CD%

rem search and delete file "ddms.cfg"
set DEL_FILE="ddms.cfg"
IF EXIST %DEL_FILE% (
	del %DEL_FILE%
	echo Delete file ddms.cfg
) ELSE (
	echo !!CAUTION!!
	echo file does not exist. Please Delete Manually
	GOTO END
)

rem search and delete files in cache
set CACHE_DIR="cache"
IF EXIST %CACHE_DIR% (
	del %CACHE_DIR%\%
	echo Delete files in cache
) ELSE (
	echo !!CAUTION!!
	echo file does not exist. Please Delete Manually
	GOTO END
)

rem finish process
:END
pause
exit
```
Hubotでusing deprecated documentation syntax


ping.coffeeをping.jsへ書き換えようとしたときに生じたエラー(?


##もとのping.coffee

```
# Description:
#   Utility commands surrounding Hubot uptime.
#
# Commands:
#   hubot ping - Reply with pong
#   hubot echo <text> - Reply back with <text>
#   hubot time - Reply with current time
#   hubot die - End hubot process

module.exports = (robot) ->
  robot.respond /PING$/i, (msg) ->
    msg.send "PONG!"

  robot.respond /ADAPTER$/i, (msg) ->
    msg.send robot.adapterName

  robot.respond /ECHO (.*)$/i, (msg) ->
    msg.send msg.match[1]

  robot.respond /TIME$/i, (msg) ->
    msg.send "Server time is: #{new Date()}"

  robot.respond /DIE$/i, (msg) ->
    msg.send "Goodbye, cruel world."
    process.exit 0

```

ここから単純なコマンドでここだけ抜き出そうとしたら、

```
module.exports = (robot) ->
  robot.respond /PING$/i, (msg) ->
    msg.send "PONG!"
```

実行するとこんなメッセージが

```
[Tue Oct 14 2014 18:50:59 GMT+0900 (JST)] INFO /Users/ryousuke/Sites/offside/hubot/scripts/bbpull.js is using deprecated documentation syntax
```

##descriptionを入れる必要があるみたい

たぶんドキュメントに書いてるんだろうけど..

```
# Description:
#   Utility commands surrounding Hubot uptime.
#
# Commands:
#   hubot ping - Reply with pong
#   hubot echo <text> - Reply back with <text>
#   hubot time - Reply with current time
#   hubot die - End hubot process

module.exports = (robot) ->
  robot.respond /PING$/i, (msg) ->
    msg.send "PONG!"
```

###js変換するとこんな感じです。 commandsは無くても問題ないかも。

```
// Description:
//   Messing around with the today API.
// Commands:
//   hubot today  - Return today at random.

module.exports = function(robot) {
  return robot.respond(/BBB$/i, function(msg) {
    return msg.send("PONGbbb!");
  });
};

```

##まとめ
hubotはコメントアウトのメッセージまで読み込んでたんですね。
next_link_post(もしくはprevious_link_post)で表示されるリンクを子カテゴリにする


# やりたいこと

カテゴリの配置が

```
 - 親カテゴリ
	- 子カテゴリ1
		- 記事A
		- 記事B
		- 記事C
	- 子カテゴリ2
		- 記事D
		- 記事E
		- 記事F

	- 子カテゴリ3
		- 記事G
		- 記事H
		- 記事I
```

であるときに、```next_link_post```や```previous_link_post```を使用したとき([同じカテゴリ内で探すことを有効](http://codex.wordpress.org/Function_Reference/next_post_link#Text_As_Link.2C_Without_Post_Title.2C_Within_Same_Category)にした場合）、

記事Cのときには、記事Bだけが表示されて欲しいが、記事Bと記事Dが表示されてしまう。

これを子カテゴリ内だけ（記事Bを表示したら、記事Aと記事Cが出て欲しいよう）にしたい。

# やったこと

[特定のカテゴリを除く処理がある](http://codex.wordpress.org/Function_Reference/next_post_link#Within_Same_Category.2C_Excluding_One)のでそれを使って、同じ親カテゴリを持っている子カテゴリを取得して、現在の記事の子カテゴリではないカテゴリを取り除くようにした。

## コード
これを```function.php```に置いて必要な場合は適宜呼び出している。

```php:function.php

function exclude_different_child_category_posts() {
  $same_parent_category_ids = array();
  $current_categories = get_the_category();
  foreach($current_categories as $category){
    $args = array('parent'  => $category->term_id);
    $cate_children = get_categories($args);
    foreach($cate_children as $cate_child){
      array_push($same_parent_category_ids, $cate_child->term_id);
    }
  }

  //重複を避ける
  $same_parent_category_ids = array_unique($same_parent_category_ids);

  $current_category_ids = array_map(function($v){ return $v->term_id; }, $current_categories);

  $excluded_category_ids = array_diff($same_parent_category_ids, $current_category_ids);

  return $excluded_category_ids;
}
```

使うときは呼び出す。

```php:

<?php

$exclude_category_ids = exclude_different_child_category_posts();

?>


<?php previous_post_link('%link', '&laquo; %title', true, $excluded_category_ids) ?>


```


# 参考
- [PHP: array_diff - Manual](http://php.net/manual/ja/function.array-diff.php)

- [Function Reference/next post link « WordPress Codex](http://codex.wordpress.org/Function_Reference/next_post_link#Within_Same_Category.2C_Excluding_One)

-
MiddlemanのSlimでmixin的なことをやる

MiddlemanでSlimつかってるんですけど、jadeでいうところのmixinがないっぽいので、すごいつらい思いをしてました。

が、解決策を見つけたのでシェアさせていただきますね！


# partialしつつ、localsで変数を渡してやる

呼び出し側

```親.slim
h1 私が親です
div#hogehoge
  == partial "layouts/_child", locals: { hoge: 'この変数をpartialにお渡ししたいんです' }
```

呼ばれ側

```child.slim
/ partialの _test.slim側
p = hoge
```

↓

```out.html
<h1>私が親です</h1>
<div id='hogehoge'>
  <p>この変数をpartialにお渡ししたいんです</p>
</div>
```


## ちなみにpartialは入れ子もできる

child側でさらにpartialしてもちゃんと動く。
calc()って便利だね〜


# めも

[CSSで計算式を可能にするcalc()ファンクション](https://w3g.jp/blog/tools/css3_calc_function)から抜粋

```css:sample.css
.sample{
   width : 98% ; /* IE8以下とAndroid4.3以下用フォールバック */
   width : -webkit-calc(100% - 20px) ;
   width : -moz-calc(100% - 20px) ;
   width : calc(100% - 20px) ;
}
```

便利ですね〜！
SQLiteだけで数値3桁カンマを付与する

table名「table_name」のカラム「xxx」に3桁ずつカンマをつけて出力したい方法です。具体的には、tracでSQliteのみでなんとかしなきゃいけない場合に対応した方法です。日本円価格の数値への3桁対応のため、9ケタまで有効、小数点がある場合には非対応です。

使用前：123456789 →　使用後：123,456,789

```sqlite3
select
 case
  when  length(xxx) > 6
     then substr(xxx,1,length(xxx)-6) || ',' || substr(xxx,length(xxx)-5,3) || ',' || substr(xxx,length(xxx)-2,3)
  when  length(xxx) > 3
     then substr(xxx,1,length(xxx)-3) || ',' || substr(xxx,length(xxx)-2,3)
  else  xxx
 end AS 'price'
from table_name
```
変更すべき変数：
* xxx：元の数値
* table_name：テーブル名
Mac でディスプレイのスリープ状態をプログラムから解除する方法

* ディスプレイがスリープした状態をプログラムから解除する方法がないか調べていたら、OSX のツール [caffeinate(8)](https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/caffeinate.8.html) を見つけた。
* ```caffeinate -u``` とほぼ同様のことを実現するには、以下のように記述すればよいみたい。
* ディスプレイだけでなくシステムもスリープしている場合に、ただしく動くかどうかは分からない。

```c
#include <IOKit/pwr_mgt/IOPMLib.h>

#ifndef kIOPMAssertionUserIsActive
/* この文字列定数は IOMPLib.h には定義されていないが (他の定数 kIOPMAssertion* は定義されているのに)、
   caffeinate(8) はこの値で IOPMAssertionCreateWithDescription 関数を呼び出しているようだ。*/
#define kIOPMAssertionUserIsActive CFSTR("UserIsActive")
#endif

void AwakeFromDisplaySleep()
{
    CFTimeInterval timeout = 5; /* magic number: caffeinate(8) は -u オプションが渡された場合この値を使うようだ */
    IOPMAssertionID id = 0;
    IOPMAssertionCreateWithDescription(
        kIOPMAssertionUserIsActive,
        CFSTR("TODO: name"),                  /* 適当に設定する */
        CFSTR("TODO: details"),               /* 適当に設定する */
        CFSTR("TODO: human readable reason"), /* 適当に設定する */
        CFSTR("/System/Library/CoreServices/powerd.bundle"),
        timeout,
        kIOPMAssertionTimeoutActionRelease,
        &id);
}
```
## 編集履歴
* macOS Sierra でも動いたので記事のタイトルを変更した。
エクセルでファイル共有を設定する (Excel 2013)

## 手順
**[ファイル] - [オプション] - [共有] から行けるやつはいわゆるファイル共有ではないため注意**

1. リボンの［校閲］－［変更］－［ブックの共有］をクリック
2. ［複数のユーザーによる同時編集と、ブックの結合を許可する］にチェックを入れる
3. （任意）詳細設定タブで保存する期間やタイミングを変更する。

履歴の保存期間がデフォルトでは30日になっているため、メタ情報の肥大化が気になる人は5日とか短めに設定する。

## 参考
http://www.atmarkit.co.jp/ait/articles/1110/14/news152.html
iOS8でCGAffineTransformの挙動がおかしな件


# はじめに

自作のアプリにで、ViewのアニメーションをCGAffineTransformを使用している箇所があるのですが、iOS8からアニメーションが効かなくなったので、調査してみました。

## 該当箇所

```objectivec:
//self.touchLayerViewはView独自のUIViewプロパティ

[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
    self.touchLayerView.transform = CGAffineTransformMakeScale(0.0, 0.0);
} completion:^(BOOL finished) {
}];
```

元々、UIViewの`+ animateWithDuration:delay:options:animations:completion:`を使用して、
特定ViewのtransformのZoomScaleを0にする実装をしていました。
iOS7以前ではこのコードで動作していましたが、iOS8から動作しなくなりました。
(Auto Layout,Interface Builderなどは使用せず、Viewを直接実装しています)

いろいろと調べた結果、これといった情報は得られませんでした。
関係があるかどうかは定かではありませんが、iOS8のバグであると指摘する人もいました。

* [Animation of CGAffineTransform in iOS8 looks different than in iOS7 - stack overflow](http://stackoverflow.com/questions/25286022/animation-of-cgaffinetransform-in-ios8-looks-different-than-in-ios7)

直接的な原因としては、`CGAffineTransformMakeScale`のサイズに0を指定する事でアニメーションが上手く動作しなくなってしまう様でしたので、暫定的ですが下記の対応で期待する動作は得られました。

```objectivec:
//self.touchLayerViewはView独自のUIViewプロパティ

[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
    self.touchLayerView.transform = CGAffineTransformMakeScale(0.01, 0.01);
} completion:^(BOOL finished) {
    self.touchLayerView.transform = CGAffineTransformMakeScale(0.0, 0.0);
}];
```

限りなく0に近い値を入れておき、最終的に0にするという方法で逃げています。

# おわりに

stack overflowでもあるように、CALayerのアニメーションを使ってやった方が実装的にはあるべき姿な気がします。
UIViewのアニメーションは便利なんですが、こういうときに予期しない動作をしたり、CALayerで作り直そうとしたときに使い回せなかったりするので、実装時に今後の拡張性含めて検討する必要がありそうです。

# 参考資料
* [UIView Class Reference - Apple Developer](https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UIView_Class/index.html)
Insetを使って、ActionBarのアイコン簡単にサイズダウンの方法

最近アプリを開発時、ActionBarのホームとメニューのアイコンのサイズを小さくなりたいです。
ImageViewのような、paddingパラメーターを使うと同じ簡単の方法を探してった。
それは Inset Drawableです。

# First Step
## アイコンをサイズダウン
res/drawableフォルダの中でInset Drawableファイルを作る。
例えばres/drawable/icon_new.xml
<pre><code>&lt;inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_action_new"
    android:insetLeft="5dp"
    android:insetTop="5dp"
    android:insetRight="5dp"
    android:insetBottom="5dp"/>
</code></pre>
このコード中のinsetLeft...insetBottomは、ImageViewのpaddingと同じです。

# Second Step
## 変更後のアイコンを設定
<pre><code>&lt;menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    &lt;item
        android:id="@+id/action_new"
        android:title="New"
        android:icon="@drawable/icon_new"
        android:showAsAction="always"/>
&lt;/menu>
</code></pre>

以上です
ActionBarのアイコン少しだけ小さくなったら、アプリ画面全体的に清潔になりました。

画像アップロードできなかった、興味を持っている方はimgurの方で。
http://i.imgur.com/U6D4Vqp.png
VirtualBox:CENTOS6.5のゲストOSがカーネルパニックになる件

## SELinuxの設定をいじったら、

```
Kernel panic – not syncing: Attempted to kill init!
```
と出て起動しなくなってしまった。。

結果的には、[バーチャルボックス：カーネルパニックからのデータ復旧](http://www.s-quad.com/wordpress/?p=177) にてデータをサルベージして復旧をかけましたが、どうも、SELinuxをいじった場合は、grub.confもいじらないといけないらしい。

というメモです
起動オプションに、enforcing=0を追加するみたい。

### grub.conf
```
+++ /etc/grub.conf      2014-10-14 07:59:35.000000000 +0900
@@ -13,9 +13,9 @@
 hiddenmenu
 title CentOS (2.6.32-431.29.2.el6.x86_64)
        root (hd0,0)
-       kernel /vmlinuz-2.6.32-431.29.2.el6.x86_64 ro root=/dev/mapper/vg_gate02-lv_root rd_NO_LUKS rd_NO_MD crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=jp106 rd_LVM_LV=vg_gate02/lv_root rd_LVM_LV=vg_gate02/lv_swap LANG=ja_JP.UTF-8 rd_NO_DM rhgb quiet
+       kernel /vmlinuz-2.6.32-431.29.2.el6.x86_64 ro root=/dev/mapper/vg_gate02-lv_root rd_NO_LUKS rd_NO_MD crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=jp106 rd_LVM_LV=vg_gate02/lv_root rd_LVM_LV=vg_gate02/lv_swap LANG=ja_JP.UTF-8 rd_NO_DM rhgb quiet enforcing=0
        initrd /initramfs-2.6.32-431.29.2.el6.x86_64.img
 title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
-       kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_gate02-lv_root rd_NO_LUKS rd_NO_MD crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=jp106 rd_LVM_LV=vg_gate02/lv_root rd_LVM_LV=vg_gate02/lv_swap LANG=ja_JP.UTF-8 rd_NO_DM rhgb quiet
+       kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_gate02-lv_root rd_NO_LUKS rd_NO_MD crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=jp106 rd_LVM_LV=vg_gate02/lv_root rd_LVM_LV=vg_gate02/lv_swap LANG=ja_JP.UTF-8 rd_NO_DM rhgb quiet enforcing=0
        initrd /initramfs-2.6.32-431.el6.x86_64.img
```

## 追記

[SELinuxの設定変更をし再起動した場合にカーネルパニックになる、という事象の原因・よくある設定ミスについて](http://qiita.com/MurabitoK/items/d44fc01b9e1ac2fdcfab)でアドバイスを頂きました。ありがとうございました！！