OmniAICreator/Qiita-1.07M huggingface dataset:
Golangで静的ファイルをバイナリに含めるライブラリを書いてみた

# 概要
Go言語の大きな魅力の一つが「シングルバイナリ」だと思います。実行ファイルが他のファイルに依存せずに単体で完結するので、デプロイがファイルのコピーで済み、非常に楽です。

しかしWebアプリケーションの場合、そうはいかないというのが個人的に大きな誤算でした。静的ファイルが実行ファイルに含まれるものと思っていたらそんなことはなく、実行時にも静的ファイルを置いておく必要があります。

有名なライブラリにgo-bindataというものがありまして、それを使えば実行ファイルに静的ファイルを含めることはできます。ですが、go-bindataは静的ファイルをgo言語のソースコードに翻訳するもので、バージョン管理システム上の管理が難しく、個人的に好みではありませんでした。

それを解決するために[zgok](https://github.com/srtkkou/zgok)というライブラリを書いてみました。

Windows/Linuxの実行ファイルは、ファイルのヘッダで実行ファイルそのもののサイズの情報を持っています。なので実行ファイルの末尾に何かデータを付けても、実行ファイルの実行には支障ありません。なので、静的ファイルをZIP化したものと、それらのサイズを記述したフッター(シグネチャ)を追記しています。[参考](http://edn.embarcadero.com/article/27979)
※同じようなアイデアのライブラリはありましたが、Windows上でzipのインストールが必要だったりするのがいまいちなので自作しました。

# インストール手順
インストールは下記のコマンドを実行してください。

`go get github.com/srtkkou/zgok/...`

$GOPATH/binに実行ファイルzgokが作成されます。

# 使用方法
zgok形式のファイルを作成するには、下記のコマンドを実行します。

`$GOPATH/bin/zgok build -e 実行ファイル名 -z ZIPしたいパス1 -z ZIPしたいパス2 -o 出力ファイル名`

静的ファイルはいくつでも指定することができます。実行ファイルの内容にZIP化した静的ファイルの内容が追記されます。

実行ファイル内でファイルを読み取るには、下記のようにします。

```go:main.go
package main

import (
	"fmt"
	"github.com/srtkkou/zgok"
	"io/ioutil"
	"os"
)

func main() {
	var content []byte
	path := "test.txt"
	zfs, _ := zgok.RestoreFileSystem(os.Args[0])
	if zfs != nil {
		// 本番環境
		content, _ = zfs.ReadFile(path)
	} else {
		// 開発環境
		content, _ = ioutil.ReadFile(path)
	}
	fmt.Println(string(content))
}
```

zfsが展開できたかどうかで分岐しておくと、開発環境では実ファイル、本番環境ではZgokファイルが使えて便利です。

そもそもの目的であるWebアプリの静的ファイルの取得のために、さらにnet/httpのFileServerの機能を取り込んでみました。例えば./web/public配下に静的ファイルがあるとします。(./web/public/css/sample.cssなど。)

サーバのソースは下記のようにしておきます。

```go:web.go
package main

import (
    "net/http"
    "github.com/srtkkou/zgok"
    "os"
)

func main() {
    zfs, err := zgok.RestoreFileSystem(os.Args[0])
    if err != nil {
        panic(err)
    }
    assetServer := zfs.FileServer("web/public")
    http.Handle("/assets/", http.StripPrefix("/assets/", assetServer))
    http.ListenAndServe(":8080", nil)
}
```

さらに下記コマンドでビルドします。

`go build -o web web.go`
`$GOPATH/bin/zgok build -e web -z web/public -o web_all`

これでweb_allを実行し、ブラウザから静的ファイルのURLにアクセスすると、その内容が読み取れます。(http://localhost:8080/assets/css/sample.css)

この実行ファイル単体で、静的ファイルにもアクセスできました！

ZIPの内容をメモリに展開するのであまり大きなファイルには向きませんが、小さなファイルを実行ファイルに含めたい場合には便利に使えると思います。
Scala のテストフレームワーク関連のメモ

ここにある CategorySpec がそのままでは動かなくて、いろいろあさっても、動くサンプルがほとんどみつけられなかったので、User Guide を参照しながら適当に直してみた。

(https://github.com/scalajp/introduction-to-category-theory-in-scala-jp/wiki)

# Intellij IDEA での実行

- [Run] - [Edit Configuration] を選ぶ
- '+' を押して，で Add New Configuration から SBT Task を選択
- task の欄に 'test' を入れて保存

# specs2 + ScalaCheck

sbt の設定で関連しそうなところ

```scala
scalaVersion := "2.11.7"

libraryDependencies += "org.specs2" %% "specs2-core" % "3.6.6" % "test"

libraryDependencies += "org.specs2" %% "specs2-mock" % "3.6.6" % "test"

libraryDependencies += "org.specs2" %% "specs2-scalacheck" % "3.6.6" % "test"


```

```scala:CategorySpec
import org.specs2.mutable.Specification
import org.specs2.ScalaCheck

class CategorySpec extends Specification with ScalaCheck {
  import Category._
  "A Category" should {
    val f = (i: Int) => i.toString
    val g = (s: String) => s.length
    val h = (i: Int) => i * i

    "satisfy associativity" in {
      prop { (i: Int, j: Int) =>
        compose(h, compose(g, f))(i + j) == compose(compose(h, g), f)(i + j)
      }
    }

    "satisfy identity" in {
      prop { (i: Int) =>
        compose(f, id[Int])(i) mustEqual compose(id[String], f)(i)
      }
    }
  }
}
```

# ScalaTest 向けに書き換え

```scala:CategoryAltSpec
import org.scalatest._
import org.scalatest.prop._

class CategoryAltSpec extends FlatSpec with Matchers with GeneratorDrivenPropertyChecks {
  import Category._

  val f = (i: Int) => i.toString
  val g = (s: String) => s.length
  val h = (i: Int) => i * i

  "A Category" should "satisfy associativity" in forAll { (n: Int) =>
    compose(h, compose(g, f))(n) should equal (compose(compose(h, g), f)(n))
  }

   it should "satisfy identity" in forAll { (n: Int) =>
    compose(f, id[Int])(n) should equal (compose(id[String], f)(n))
  }
}
```

# HelloWorldSpec.scala 

```diff
 diff -crN src\test\scala\HelloWorldSpec.scala.orig src\test\scala\HelloWorldSpec.scala
*** src\test\scala\HelloWorldSpec.scala.orig    Wed Dec  9 15:00:39 2015
--- src\test\scala\HelloWorldSpec.scala Wed Dec  9 15:00:53 2015
***************
*** 5,11 ****
  // import org.scalacheck.Prop.forAll
  // import org.scalacheck.Properties

! class HelloWorldSpec extends Specification with ScalaCheck { def is = s2"""

   This is a specification to check the 'Hello world' string

--- 5,11 ----
  // import org.scalacheck.Prop.forAll
  // import org.scalacheck.Properties

! class HelloWorldSpec extends Specification with ScalaCheck { override def is = s2"""

   This is a specification to check the 'Hello world' string
```
Gladiatorのinstall方法(Rails)

ROMAのGUI management toolであるGladiatorのinstall方法です
![gladiator_link.png](https://qiita-image-store.s3.amazonaws.com/0/103558/882e38cf-0aed-2461-c634-13efd110a6bc.png)

# 条件
ruby version : v2.1
ROMA version : v1.2.0
Rails version : v4.2.5
Gladiator version : v1.2.0

# 準備
ROMAのconfigでGUI用のプラグインを指定

```rb:config.rb
$ grep -r 'PLUGIN' config.rb
    PLUGIN_FILES = ["plugin_storage.rb", "plugin_gui.rb"]
```

  - 指定していない場合は以下のどちらかで設定してください  
[直接編集] or [mkconfigで再作成]
 
```
$ mkconfig
.
.
Please select which plugin will you use.(plugin_storage.rb is essential unless you make alternative plugin.)
[1] plugin_storage.rb
[2] plugin_mapcount.rb
[3] plugin_gui.rb
[4] plugin_cmd_aliases.rb
[5] plugin_test.rb
[6] plugin_map.rb
[7] plugin_alist.rb
[8] plugin_debug.rb
[9] Select all plugins
> 3を選択する
.
.
``` 
(※config編集後はROMAを再起動してください)

# Gladiatorインストール手順
## 1. download Gladiator

```bash
$ git clone https://github.com/roma/gladiator.git
or
$ wget https://github.com/roma/gladiator/archive/v1.2.0.tar.gz
$ tar xvfz v1.2.0.tar.gz 
```

## 2. install library

```bash
$ cd gladiator
$ sudo bundle install
```

## 2. Configuration Setting
### ROMA情報設定
```bash
$ bin/set_roma_info
 Please input roma host info(ip or hostname)
 > localhost # => input your ROMA's ip address or hostname.

 Pleasese input ROMA's 1 port No.
 > 10001 # => input your ROMA's port No.
```
- アクセスするROMAインスタンスの情報を設定します
  - どれか1instance設定すればOKです(他のinstance情報はGladiatorが自動で取得します)

### ユーザ情報設定
```bash
$ bin/add_user
 Please input user name
 > hogehoge # =>input your username for login

 Pleasese input password
 > fugafuga # =>input your password

 [Optional]
 Please input Gravatar email address.
 (If you don't need this process, please push enter with brank.)
 > # =>input your gravatar address(if you have)

 Which mode do you want to add this user?
 (some functions are restricted to root user only)
 [1] root user
 [2] normal user
 > 1 # =>select [1] or [2]
```
- Gladiatorにアクセスする際のユーザ設定を行います
  - ユーザ名を入力します
  - パスワードを入力します
  - Glavatarのアドレスを入力します(不要な場合はブランクのままでok)
  - permissionを選択します(normal userの場合使えない機能があります)

## 3. boot Gladiator
起動方法は通常のrailsアプリを起動する方法で構いません。
今回は確認なのでweblickで起動します

```bash
$ rails server
```

# 確認
## アクセス
[http://localhost:3000/](http://localhost:3000/)にアクセスするとログインPageが表示されます
(VM等を利用している場合はlocalhostを各サーバのipに変えてください)
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/c27a1a81-c39d-6ae8-98d5-1e7823d44180.png)

### ログイン
先ほど設定したユーザ情報(user: hogehoge, pass: fugafuga)を入力してログインします
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/59c24d5e-9fe1-f238-f047-752454d296b4.png)

以上で構築完了です

# 参照URL
ROMA Gladiator : http://roma-kvs.org/gladiator.html
Ruby - pry導入編


kotaziです。
- [kotazi.com](http://kotazi.com)

Railsのデバッグについて調べていた。  
pryを知った。便利そうだったことメモ書き。

<hr>

## Pryとは

![pry](http://kotazi.com/blog/media/pry_logo.png)

[Pry](http://pryrepl.org/)はRuby標準的なIRBシェルの強力な代替手段です。
シンタックスハイライトや、フレキシブルなプラグインアーキテクチャ、実行時の呼び出しやドキュメントの閲覧を備えています。

## インストール

```
$ gem install pry pry-doc
$ pry
```

`.ls`, `.pwd`などでShellコマンドを呼び出せる。

## Railsプロジェクトに組み込む

RailsプロジェクトにPryを入れて、ブレークポイントやステップ実行が行えるようにした。

Gemfileを編集(参考:[Railsの開発効率をあげる - Pryを使ってRailsのコンソールをパワーアップ & デバッグをする](http://ruby-rails.hatenadiary.com/entry/20141024/1414081224))

```
group :development, :test do
  gem 'pry-rails', '~> 0.3.4'  # rails console(もしくは、rails c)でirbの代わりにpryを使われる
  gem 'pry-doc', '~> 0.8.0'    # methodを表示
  gem 'pry-byebug', '~> 3.3.0' # デバッグを実施(Ruby 2.0以降で動作する)
  gem 'pry-stack_explorer', '~> 0.4.9.2' # スタックをたどれる
end
```

### ■ モデル確認

```
[12] pry(main)> show-models
Administrator
  id: integer
  email: string
  email_for_index: string
  hashed_password: string
  suspended: boolean
  created_at: datetime
  updated_at: datetime
StaffMember
  id: integer
  email: string
  email_for_index: string
  family_name: string
  given_name: string
  family_name_kana: string
  given_name_kana: string
  hashed_password: string
  start_date: date
  end_date: date
  suspended: boolean
  created_at: datetime
  updated_at: datetime
```

### ■ ルート確認

```
[13] pry(main)> show-routes
       Prefix Verb   URI Pattern              Controller#Action
   staff_root GET    /staff(.:format)         staff/top#index
  staff_login GET    /staff/login(.:format)   staff/sessions#new
staff_session POST   /staff/session(.:format) staff/sessions#create
              DELETE /staff/session(.:format) staff/sessions#destroy
   admin_root GET    /admin(.:format)         admin/top#index
  admin_login GET    /admin/login(.:format)   admin/sessions#new
admin_session POST   /admin/session(.:format) admin/sessions#create
              DELETE /admin/session(.:format) admin/sessions#destroy
customer_root GET    /customer(.:format)      customer/top#index
         root GET    /                        errors#routing_error
              GET    /*anything(.:format)     errors#routing_error
```

## デバッグ

- `binding.pry`を打ち込むとブレークポイントになる。
- `show-stack`でスタックトレースを表示

## 参考URL

- [Rubyistよ、irbを捨ててPryを使おう](http://labs.timedia.co.jp/2011/12/rubyist-should-use-pry.html)
- [Ruby 2.x.x 入門 -そう、pry ならね。-](http://blog.tokoyax.com/entry/ruby/how-to-use-pry)
- [Railsの開発効率をあげる - Pryを使ってRailsのコンソールをパワーアップ & デバッグをする](http://ruby-rails.hatenadiary.com/entry/20141024/1414081224)
- [Railsのコンソールをより便利にするpry-rails gem](http://qiita.com/yaotti/items/c6e850010f36acedb0e1)
- [今更聞けないpryの使い方と便利プラグイン集](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)

<hr>

ものすごく便利だった。
External Node Classifiers について その2

6日目で紹介した [External Node Classifiers](http://qiita.com/udzura/items/63b22de6a97ce563f4e6) ですが、実例交えてどんなことが出来るか見てみます。

### environmentの自動判定

`environment:` という属性を作れば、それがPuppet実行時に `--environment` として渡されます。

```rb:enc1.rb
require 'yaml'

certname = ARGV[0]
hostname = certname.split('.').first

role = case hostname
       when /^([-_a-z]+)$/, /^([-_a-z]+)\d{3}$/
         $1
       else
         raise("Invalid hostname %s" % hostname)
       end

environment = nil
if hostname =~ /^staging/
  role.sub!(/^staging(-)?/, '')
  environment =  "staging"
else
  environment =  "production"
end

puts YAML.dump({
  'classes' => ['base', role],
  'environment' => environment,
})
exit 0
```

#### 実行結果

```console
$ ruby enc.rb staging-web001.udzura.jp
---
classes:
- base
- web
environment: staging
$ ruby enc.rb web001.udzura.jp 
---
classes:
- base
- web
environment: production
```

`staging-` ついてたらステージング、それ以外本番で、ということをやれます。 `puppet agent` コマンドにいちいち `--environment` を渡すのはミスりやすいので、便利かもです。

### ロールに満たないサブロールみたいな変化をつける

`parameters:` に任意の変数を渡せます。

```rb:enc.rb
require 'yaml'

certname = ARGV[0]
hostname = certname.split('.').first

role = case hostname
       when /^([-_a-z]+)$/, /^([-_a-z]+)\d{3}$/
         $1
       else
         raise("Invalid hostname %s" % hostname)
       end

sub_role = nil
if role =~ /^log/
  case role
  when /log-master/
    sub_role = 'master'
  when /log-slave/
    sub_role = 'slave'
  else
    sub_role = 'unknown'
  end
  role = 'log'
end

puts YAML.dump({
  'classes' => ['base', role],
  'parameters' => {'sub_role' => sub_role},
})
exit 0
```

こんな感じにすると、マニフェスト内で `$::sub_role` に値が入るので、あとはそれを見て分岐すればOKです。

ぼくはよくHieraと組み合わせて:

```puppet
$ssl_certname = hiera("fluentd::certname::${::sub_role}")
```

なんてやったりします。

[Classに直接パラメータを渡す](https://docs.puppetlabs.com/guides/external_nodes.html#classes) こともできますが、クラスまとめて指定するのは配列の方が楽（というかパラメータ無しの時に、RubyのYAMLライブラリで面倒と思われる）なのでぼくはparameters派です。

----

なお、ENCをやっていくにあたって必要なのは、「いい感じの規約」です。
あまりに変な規約になる時は、ENCとかより、カスタムファクターやファンクションで頑張る方がいいかと思います。

そんな感じで、次のPuppetカレンダーの更新は......誰だろう......
PHP5.3.3 + Symfony0.6 + Propel で PHPUnit

symfony0.6 も protel も creole も もうドキュメントがない
でもバグ出したくないし「たぶん大丈夫です」とか言いたくないからテストしたい

##PHPUnit
まず、PHPUnit は 4.8 (old) を使う 4.8 はぎりぎり PHP 5.3.3 以上で動く
https://phpunit.de/manual/4.8/ja/installation.html
phar を wget してくるのがとても簡単だけど、4.8 は old なので、 phpunit-old.phar なのできをつける

##autoload
ほんでautoloadとかそのへんをやってもらう
project/web/app/index.php がエントリポイント
そっから project/apps/app/config/config.php でいろいろめんどくさいことをやっている
とりあえずこれでだいたいなんとかなる

##Protel
よっしゃよっしゃ、actionもテストしやすいように機能分割したし、インスタンスつくって
Protel::getConnection() やで〜〜
とおもったらめっちゃエラーがでる
ここで詰みすぎてもう死ぬしかないと思ったけど救世主現れた
http://www.ecoop.net/memo/archives/2007-09-05-1.html
このサンプルはたぶん symfony1 だと思うのね、symfony0.6 には sfCore とかないから
適当に動くようになんとかする

```PHP
<?php

define('SF_ROOT_DIR'   , '/path/to/project');
define('SF_APP'        , 'app');
define('SF_ENVIRONMENT', 'prod');
define('SF_DEBUG'      , false);

require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');

if (sfConfig::get('cookie_secure')) {
    ini_set('session.cookie_secure', '1');
}

set_include_path($sf_symfony_lib_dir . '/vendor' . PATH_SEPARATOR . SF_ROOT_DIR . PATH_SEPARATOR . get_include_path());

define('SF_ENVIRONMENT', 'test');
define('SF_DEBUG', true);

sfContext::getInstance();
Propel::setConfiguration(sfPropelDatabase::getConfiguration());
Propel::initialize();

require_once('/path/to/action.class.php');

class hogeTest extends PHPUnit_Framework_TestCase
{
    public function testHoge()
    {
        $this->assertEquals(1, 1);
    }
}
```
[JAWS-UG CLI] IAM:#33 ログインプロファイルの作成


AWS CLIを利用して、IAMユーザのログインプロファイルを作成してマネジメントコンソールからログインできるようにしてみます。


前提条件
========


IAMへの権限
-----------

* IAMに対してフル権限があること。


AWS CLIのバージョン
-------------------

* 以下のバージョンで動作確認済

  * AWS CLI 1.10.0
  * AWS CLI 1.9.11

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.10.0 Python/2.7.5 Darwin/13.4.0 botocore/1.3.22
```


0. 準備
=======


変数の確認
---------------

プロファイルとリージョンが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       iamFull-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


1. 事前作業
===========

1.1. 対象IAMユーザの指定
------------------------

マネジメントコンソールからのログインを許可するIAMユーザを指定します。

```bash:変数の指定:
IAM_USER_NAME=<USER_NAME>
```

1.2. ログインプロファイルの確認
-------------------------------

対象となるIAMユーザのログインプロファイルが存在しないことを確認します
。

```bash:コマンド:
aws iam get-login-profile \
        --user-name ${IAM_USER_NAME}
```

```text:結果(例):
      A client error (NoSuchEntity) occurred when calling the GetLoginProfile operation: Cannot find Login Profile for User TestUser
```

1.3. 初期パスワードの指定
-------------------------

対象となるIAMユーザに提供する初期パスワードを指定します。

```bash:コマンド:
IAM_PASSWORD_NEW='#userPass123'
```


2. 設定
=======

```bash:変数の確認:
cat << ETX

      IAM_USER_NAME:    ${IAM_USER_NAME}
      IAM_PASSWORD_NEW: ${IAM_PASSWORD_NEW}

ETX
```

対象となるIAMユーザのログインプロファイルを作成します。

```bash:コマンド:
aws iam create-login-profile \
        --user-name ${IAM_USER_NAME} \
        --password "${IAM_PASSWORD_NEW}"
```

```json:結果(例):
      {
        "LoginProfile": {
          "UserName": "TestUser",
          "CreateDate": "2015-10-19T01:36:48.507Z",
          "PasswordResetRequired": false
        }
      }
```


3. 事後作業
===========

対象となるIAMユーザのログインプロファイルが存在することを確認します。

```bash:コマンド:
aws iam get-login-profile \
        --user-name ${IAM_USER_NAME}
```

```json:結果(例):
      {
        "LoginProfile": {
          "UserName": "TestUser",
          "CreateDate": "2015-10-19T01:36:48Z",
          "PasswordResetRequired": false
        }
      }
```


そのIAMユーザでマネジメントコンソールからログインできるようになっているはずです。


# 完了
GeoDjango: ルート上に位置補正(案)


- 現在地がずれて報告されたときに、定られた経路上に補正したい
- 経路からの距離をもとめて、報告位置からの円をつくる
- 円と交わった線分の中心地を補正位置とする
- 円の半径は得られた距離より広めにとって交わるようにする

## Station: 次の駅までの経路情報を持たせる

~~~py
class Station(models.Model):
    name = models.CharField(max_length=100)
    location = models.PointField()
    '''駅の場所'''
    route = models.MultiLineStringField(
        null=True, blank=True, default=None,)
    '''次の駅までのルート'''
~~~

- 位置情報

~~~py
class Place(models.Model):
    name = models.CharField(max_length=50)
    location = models.PointField()
~~~

- 渋谷駅の次駅(原宿駅)までの経路

~~~py
from maps.models import *
shibuya = Station.objects.get(id=4)
print shibuya.route.json

'{"type": "MultiLineString", "coordinates":
[
[
[139.70290249127422, 35.65853244841824],
[139.70220578977614, 35.660106185584475],
[139.70233453581062, 35.666122196250748],
[139.70220578977614, 35.661849580175264],
[139.70083249876564, 35.6624248920371],
[139.70087541410746, 35.663017633256636],
[139.701240194531, 3566122196250748],
[139.702.663505769779796],
[139.7013903982364, 35.664499467052565],
[139.69892276594632, 35.66474353115777],
[139.70023168394405, 35.66606843756664],
[139.70102561781286,596],
[139.70364, 35.4996 35.66666115173598],
[139.70184100935262, 35.666783180577326],
[139.70205558607074, 35.66917142178526],
[139.70287097761047, 35.66953749623893],
[139.702828062268 01841009352677326], 020565, 35.67018248047786]]]}'
~~~

![](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/django/geodjango/geodjango.route.correction.route.png)

- 神南小学校

~~~py
jinsho = Place.objects.get(id=8)
print jinsho.location.json
{"type": "Point", "coordinates": [139.6980199665418, 35.66322098512026]}
~~~

![](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/django/geodjango/geodjango.route.correction.location.png)


## 経路中に補正する

- 距離

~~~py
d = shibuya.route.distance(jinsho.location)     
~~~

- 少し広めの円

~~~py
circle = jinsho.location.buffer(d + 0.00001)
print type(circle)
<class 'django.contrib.gis.geos.polygon.Polygon'>
~~~

- 交わる線

~~~py
line = circle.intersection(shibuya.route)
print type(line)
<class 'django.contrib.gis.geos.linestring.LineString'>
~~~

- その中心が大体補正された場所

~~~py
print line.centroid.json
{"type": "Point", "coordinates": [139.69893397721165, 35.6647436800696]}
~~~

![](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/django/geodjango/geodjango.route.correction.corrected.png)
SECCON2015 Reverse-Engineering Android APK 1


## 処理をみる
http://www.decompileandroid.com/
ここでapkをソーソコードに直す事ができる

source->src->com->example->seccon2015->rock_paper_scissors


```MainActivity.java(59~)
 if (1000 == cnt)
   {
                textview.setText((new StringBuilder()).append("SECCON{").append(String.valueOf((cnt + calc()) * 107)).append("}").toString());
   }

```
ここがフラグを出力する処理であると分かる。

```MainActivity.java(73~)
 public MainActivity()
   {
        cnt = 0;
   }
```

cntの初期値が0である事が分かる。


## 方向性
フラグ表示条件はcntが1000
よって、この変数の初期値を999にして1回かてばフラグが出るようにする。

## apkの書き換え

apktoolを使う

http://ibotpeaches.github.io/Apktool/

```sh
$ apktool rps.apk
$ vim rps/smail//com/example/seccon2015/rock_paper_scissors
```

14行目に `.field cnt:I`とある。
53行目に
`iput v0, p0, Lcom/example/seccon2015/rock_paper_scissors/MainActivity;->cnt:I`

とあるため、ここで定義されている変数を999にすればよい。 

```
.line 15
const/4 v0, 0x00
iput v0, p0, Lcom/example/seccon2015/rock_paper_scissors/MainActivity;->cnt:I

これを下記のように書き換える。

.line 15
const v5, 0x3E8
iput v5, p0, Lcom/example/seccon2015/rock_paper_scissors/MainActivity;->cnt:I
```

smailの文法はここを見れば分かる。
http://stpr18.blogspot.jp/

```
$ apktool b rps
$ ls rps/dist/rps.apk
```
これがあたらしくできたapkファイルとなる。


## 署名
これを実際に動かそうとすると、署名がないとかインストールできなかったりする。
ここを参考に署名をする。
[Android 作成したアプリに署名を行う](http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=Android+%BA%EE%C0%AE%A4%B7%A4%BF%A5%A2%A5%D7%A5%EA%A4%CB%BD%F0%CC%BE%A4%F2%B9%D4%A4%A6)

```sh
$ keytool -genkey
...
... #aliasを聞かれるから覚えておく
$ keytool -list #鍵があるか確認する
$ jarsigner rps.apk "さっきのalias"
キーストアのパスワードを入力してください:
jarは署名されました。
keytool rps/dist/rps.apk hoge
```

これで署名終了

あとはこれを実機なりgenymotionで起動して、1回勝てばフラグが出る
C# Syntax Highlighterのテスト

`pygments.lexers.dotnet.CSharpLexer`という実装らしい。

やっぱり、型名のハイライトは難しいよね……（下の例で言うと、`Program`には色がついてるけど、`Func<T>`とか`Task<T>`、`StreamReader`には色がつかない）

```csharp
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Func<Task<string>> f = async () =>
        {
            var sr = new StreamReader("somefile.txt");
            var t = await sr.ReadToEndAsync();
            return t.ToLower();
        };
    }
}
```
ownCloudのクラウド連携IDとは

ownCloud8.1.0から個人画面にも表示されるようになったクラウド連携（Federated Cloud）。

SNSのアイコンとともにクラウド連携IDって表示されているけれど、
どんな機能なのか分からない・・・って思っている方もたくさんいらっしゃるんじゃないでしょうか？？

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/103945/f01581b1-638f-2b09-1dc5-6254f19b648f.png)
↑の画像はまだ8.1.0の時の画像ですね。
8.2.0以降は日本語翻訳も進んでいます。


クラウド連携IDを簡単にまとめると、
サーバーが異なるownCloud間でも簡単にファイルの連携を行うことができるようownCloudが用意してくれたアドレスみたいなものです。

いままでは違うサーバに構築されたownCloudに直接ファイルを共有することができなかったのですが、
このクラウド連携IDを使えば、同じサーバにあるownCloudのようにフォルダを共有することができちゃうんですね。

共有したいファイルやフォルダのうえで、先ほどのクラウド連携IDを入力することで共有がかけられます。

共有をかける際には連携IDの後ろに（リモート）という文字が表示されるので、とってもわかりやすい。

もちろん通常の共有機能と同様に、
アップロード制限や削除制限もかけることが可能です！


すっごい便利な機能ですね～～

部署や支店、社外職員など異なるサーバでownCloudを使っている人とファイル共有をするのに、役立ちそうです :heart_eyes: :heart_eyes:
文字列を任意の文字列で分割する方法

例えば、  
*2015.12.11 14:34:50* を *2015.12.11* と *14:34:50* のように、間の半角空白で分割する。

## 環境
- Xcode 7.1.1
- Swift 2.1

## 方法
componentsSeparatedByString(separator: String) -> [String]を使用する。  
- 分割に指定する文字列は削除される
- 分割後は配列が返される
- 最初または最後に分割指定文字列が含まれていた場合、該当インデックスの値は空""になる

```swift
let title = "2015.12.11 14:34:50"
let titleArray = title.componentsSeparatedByString(" ")
print(titleArray[0])  // 2015.12.11
print(titleArray[1])  // 14:34:50
```
KonashiさんHelloWorld

[dots girls Advent Calendar 2015](http://qiita.com/advent-calendar/2015/dots_girls)7日目の記事です( ´ー｀)

# ごあいさつ
こんにちは。[dots.女子部](https://www.facebook.com/dotsgirls/)の矢野です。
dots.女子部のアドベントカレンダーが始まって一週間になりまして、すでにマイコンっぽい話が2つもあがってますが今回もそれ系です笑
Konashiという、マイコンボード？をいただいたのでHelloWorldしてみました。
最近[ラズパイにもHelloWorld](http://qiita.com/little_85/items/6a55c05cc2ac328ffbfc)したし、会社の部活で[ArduinoにもHelloWorld](https://twitter.com/little_85/status/669177237380272128)したし、工学女子になしつつあります。(全然触れてないけど！)

# Konashiとは
ではでは、KonashiにHello Worldする前にKonashiについて。
[necomimi](http://www.ux-xu.com/product/necomimi)で話題になった[ユカイ工学](http://www.ux-xu.com)さんから出ているiPhone/iPadのための、フィジカル・コンピューティングツールキットだそうです。
## ふぃ・・フィジカル・コンピューティング？
ggったら
>《コンピュータをもっと身体的なもの＝人の行動や生活に寄り添ったものにすることで、コンピュータと人間の意思疎通の方法に広がりが生まれるのではないか》
>
>という考えに基づいたモノづくりを指す。

って書いてありました。ほう。
ふむ(・∀・)

たぶんArduinoとかと同じ感じ何だと思う。たぶん。

#Hello Worldしてみよう
ではでは、KonashiでHalloWorldしてみます。
[公式に載っている手順](http://konashi.ux-xu.com/getting_started/)を踏んで内蔵LEDをピカっとさせてみるよ。

1. 最新版のライブラリを取得
2. Xcodeで新規プロジェクトを作成
3. Core Bluetooth Frameworkをプロジェクトに追加
4. konashiライブラリをプロジェクトに追加
5. 「konashiと接続する」ボタンを追加
6. ViewControllerのコードを書く  
7. iOSデバイスのBluetoothを有効にする  
「？！(´・ω・｀)」  
(おい、iOS Developer Program・・登録してないと実機でテストできないんじゃないのかよ。
登録したくないよ・・とりあえず、ここは飛ばそう。)  
このへんから雲行きが怪しい
8. konashi をiOSデバイスから動かす  
よーし、iOSシュミレータでテストだぞー！

えいっ！
<p><img src="https://qiita-image-store.s3.amazonaws.com/0/77113/64e47a10-7913-d301-8e8f-c4e3df413348.png" width=200px/></p>

***シーン・・・***

「？！(´＾ω＾｀)」
なん・・だ・・と・・・
MacのBluetoothはonになっとるぞ。
えーーーーーん｡･ﾟ･(＾ω＾)･ﾟ･｡

って泣きながら色々調べてみると下記のことがわかりました。

* シュミレータでBluetoothのテストを行うにはBluetooth USBアダプタが必要らしい
* っていうかそもそもXode7から無料で実機テストできるらしい

(・・・てへぺろ)

というわけで、実機をつないで無事テストでけました
<p><img src="https://qiita-image-store.s3.amazonaws.com/0/77113/33246ed4-3774-35f1-540b-27aa95f2548a.png" width=200px/></p>

Konashiほにゃほにゃが私のKonashiちゃん。　　
ぽちっと選択すると

おおおおおおお
<p><img src="https://qiita-image-store.s3.amazonaws.com/0/77113/b20ad4b2-33ac-bee1-39ce-46ed6b2cb244.jpeg" width=200px/></p>

ついた、LED。
いえーい **HelloWorld** いえーい

## そういえば6で書いたコードってなんしてたんだっけ

付け足したコードは

```ViewController.m
#import "Konashi.h"
    
    //~~~~

- (void)viewDidLoad
{

    //~~~~
    
    // Register event handler
    [[Konashi shared] setReadyHandler:^{
        // Set pin mode to output
        [Konashi pinMode:KonashiLED2 mode:KonashiPinModeOutput];
        // Make LED2 glow
        [Konashi digitalWrite:KonashiLED2 value:KonashiLevelHigh];
    }];
}
   // ~~~~
-(IBAction)find:(id)sender {
    [Konashi find];
}
```

Konashi.hをimportしてKonashiの関数を使うわけですね。 
Konashi sharedでsetReadyHandlerってインスタンスを取得?
で、[Konashi pinMode](http://konashi.ux-xu.com/documents/#pio-pinMode)でLED2に出力設定して、[Konashi digitalWrite](http://konashi.ux-xu.com/documents/#pio-digitalWrite)でLED2を光らせ(出力し)たまえ。と。
で、最後にいれたのはfindってボタン押したらKonashi探してきてねってやつ。が、[Konashi find](http://konashi.ux-xu.com/documents/#base-find)

正直ObjectiveCよくわからんよ。
って言う方(私のことです)、朗報です。
みんな大好きJavaScriptでもかけるらしいです。やったね！
後でjsでも書いてみよーっと。

#おわり
今回は書いてあるものをそのままやりましたが、あらとっても簡単。(xcodeにやられたけど)
そして、Konashiはボタン電池で電源とってくれて、Bluetooth使えるすぐれものだからけっこうコンパクトで素敵。
でもこういうマイコン触ってみつつも結局いつも実用的に使えてないので、何か使いみち考えたいなー。
なにかないものか。
Fluentd上でCronを回す


Productionで[toyama0919/fluent-plugin-exec_cron](https://github.com/toyama0919/fluent-plugin-exec_cron)というプラグイン作って動かしています。

Fluentdのoutput pluginにはTimeslicedOutputとBufferedOutputとがあって、TimeslicedOutputで「ある程度の時刻指定」によるflushが可能です。

ただinput pluginについてはintervalを指定したflushはできますが、時刻指定は出来ません。
Inputの処理が実行される時刻は、再起動した時刻に依存します。

そこでCronによる時刻指定が可能なInput pluginを作ってみました。

似たような話だと、AWSのLambdaもCronによる時刻指定がサポートされました。([(レポート) CMP407: Cron としての Lambda: AWS Lambda での呼び出しのスケジュール #reinvent ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/reinvent-cmp407/))

## 使い方

```
<source>
  type exec_cron
  tag exec_cron.example
  command echo '{"a":"a"}'
  format json
  cron * * * * *
  #cron */5 * * * * 5分おき
  #cron 0 * * * * 1時間おき
</source>

<match exec_cron.example>
  type stdout
</match>
```

実行結果はこんな感じ

```
2015-05-27 13:07:00 +0900 exec_cron.example: {"a":"a"}
2015-05-27 13:08:00 +0900 exec_cron.example: {"a":"a"}
2015-05-27 13:09:00 +0900 exec_cron.example: {"a":"a"}
2015-05-27 13:10:00 +0900 exec_cron.example: {"a":"a"}
2015-05-27 13:11:00 +0900 exec_cron.example: {"a":"a"}
2015-05-27 13:12:00 +0900 exec_cron.example: {"a":"a"}
```

時刻がピッタリ分刻みで出力されています。

もちろん、再起動しても時間はずれません。

## 実装的には
* in_execと処理は大体同じです。
  * in_execには現在、次の処理が終わるまでshutdownを待ってしまう[問題](https://github.com/fluent/fluentd/pull/526)があるようです。
* intervalによる待ち時間をcron syntaxから動的に計算しています。

## 自分で作りたい場合
[siebertm/parse-cron](https://github.com/siebertm/parse-cron)を使うと簡単に出来ます。

```ruby:in_exec_cron.rb
  def initialize
    ...
    require 'parse-cron'
    ...
  end

  def configure(conf)
    ...
    @cron_parser = CronParser.new(@cron)
    ...
  end

  def start
    @finished = false
    @thread = Thread.new(&method(:run_periodic))
  end

  def run_periodic
    until @finished
      begin
        secs = @cron_parser.next(Time.now) - Time.now
        sleep secs
        # 処理
      rescue
        log.error "exec failed to run or shutdown child process", :error => $!.to_s, :error_class => $!.class.to_s
        log.warn_backtrace $!.backtrace
      end
    end
  end
```

## まとめ
* ある程度時刻を決め打ちたい場合にいかがでしょうか
* FluentdのInput Pluginに過ぎないので、Fluentdが動いていなければ当然処理は動きません^^
* また、bufferが詰まって[Inputに戻ってこれない場合](https://gist.github.com/sonots/c54882f73e3e747f4b20#大事な補足)も同様です。

## 参考
* [toyama0919/fluent-plugin-exec_cron](https://github.com/toyama0919/fluent-plugin-exec_cron)
* [siebertm/parse-cron](https://github.com/siebertm/parse-cron)
* [時間を守る日本人｜過去記事 | ひらがなタイムズ](http://www.hiraganatimes.com/ja/past-articles/society/1876/)
Treasure Data Update 2015 - Hadoop


#Treasure DataのHadoop
Treasure Dataでは長年Hadoop1(CDH4)を使用してきましたが、太田の[投稿](http://kzk9.tumblr.com/post/134393039394/treasure-data-update-2015)にもあるように今年、徐々にHadoop2(HDP2)に移行してきました。Hadoop1でのユーザも残り数社となり、いよいよHadoop1とのお別れも近いこととなりました。そこでどんなことをやったかを振り返りで書いてみようと思います。

#いろいろな問題発生
## Plazma
Treasure Dataでは既にいろんなところに既に出てはいますが、HDFSを使用せず(正確には中間処理には使用している)ストレージはPlazmaというカラムナDBを使用しています。この部分ではHiveの仕様が変わったせいもありIndex Push Downが上手く機能しないなんていう問題も起こりました。

## Deadlock and Livelock
Treasure Dataはマルチテナントで運営しているため、通常のHadoopの使用方法よりもかなりハードな使い方をしているはずです。これにより、やたらとDeadlockやLivelock系のバグを引き当てました。。。当初はHadoop2.2.0系を使用していたのですが、Fairschedulerのバグが多くどうしようもなかったのでHadoop 2.4.0が出るまで待ちました。それでも、やはり違うところでバグを引き当てるのですが。こうなってくるといつまでたっても移行ができないので、パッチのバックポートや、ないところは作って投げる等の作業がすさまじく増えてきました。まぁYARN自体が枯れた技術じゃないので仕方ないのですが。
YARNだけにかぎらずHiveでも同様の現象が起きたりした箇所もパッチを当てたりしています。

## 運用
また、Hadoop1のころにはあってHadoop2(YARN)になってから無くなった機能で運用しづらいものや(例えば、コンソールから、Appのkillが出来ない等[[YARN-3249](https://issues.apache.org/jira/browse/YARN-3249)])、YARNになってこれはあったほうが良いだろうというものはパッチを作って適用しました。これらは全てApache本体にも取り込まれています。

Hiveに関してもいくつかパッチを投げているのですが、まだ一つも取り込まれていません。やはり、チケットが作成される量(毎日すさまじい勢いでチケットが作られてます)とコミッター割合があってないんじゃないかなぁと。。。

## パフォーマンス
実際問題、Hadoop1からHadoop2(Hiveのバージョンも上がってる)になってからパフォーマンスが出ないなんてことも起こりました。この問題はスタックトレースを取ってみてボトルネックになりそうな箇所を特定したりなんかもしました。Hiveなんかは汎用的に使えるようにみたいな機能も入ってたりしているのですが、実はこの機能自体がボトルネックになっていてパフォーマンスが出ないなんてこともわかり、Treasure Dataでは一切使わない機能なので、このパッチ自体をあえてリバートした結果10%ほど改善した等の例もあります。。。

一つ具体例を上げるとするとこの機能です[[HIVE-5795](https://issues.apache.org/jira/browse/HIVE-5795)]。簡単に言うとヘッダーやフッターを扱えるようにしようぜって機能です。パッチを見てもらえればわかりますが、あまり効率の良いものではないです。。。

この辺りのHive(0.13辺り)は個人的には鬼門だと思っていて、機能変更されたものが最新版ではやはり元に戻されたりなんかも目にしましたし、最新版ではバグが他の機能に吸収されて直ってたり(パッチは存在せず他の機能として修正されている。これは結構ツラい)しています。やはり、新たな機能を入れられたりしたバージョンはバグが結構な数潜んいるだなぁと実感しました。

#今後
現在、Treasure Data内部ではPTD(Patch set Treasure Data)というものに取り組んでいます。これは上記にあるように、今まではディストリビューションを使ってきているのですが、あまりにもパッチを適用する回数が多すぎる、パッチによっては過去に遡って複数のパッチを当てていかなければならない、Treasure Data独自(Plazmaに関連するような)パッチも適用している。こうなってくるともう、Apacheのコミュニティ版をベースに独自(*1)にやっても作業量は対して変わらないんじゃないか、という結論から至ったしだいです。

また、HadoopやHive本体だけに限らず内部のしくみも大幅に変更されるようとしています。

[Treasure Data Update 2015 - Presto](http://qiita.com/xerial/items/a9093b60062f2c613fda)にもありましたが、Hiveのこの機能を早く使いたいという要望はやはり頂きますので、Hadoop系も最新を追従できていけたらいいなぁと思っています。

--
*1 誤解されそうとあったので追記: ちなみにもちろん開発は全てアップストリームですよ。内部でバージョンを上げるためにパッチの管理なんてしたくありませんし... 独自仕様なのはPlazmaに絡むとこだけです。パッチの適用しやすさを考えた結果がコミュニティ版ベースのPTDです。
PayPalを使った決済機能の異常系テスト

決済機能の開発で難しい部分はテストだと思います。

正常系、いわゆるクレジット経由で売り上げが立ところまでは、テスト用のクレジットカード情報が公開されているので比較的簡単にできますが、異常系、つまり決済がなにかしらの理由で処理されない場合のテストは、その現象を発生させるのが難しく頭を悩ませる部分かと思います。

PayPalには、いくつか異常系のテスト機能があるので、それを紹介したいと思います。

##クレジットカードが拒絶される（与信エラー）ケースのテスト
[こちら](http://qiita.com/benzookapi/items/ffa129e7896c27e74bb0)の方法で実現できます。

買い手が買おうとした時に、登録している、もしくはしようとしているクレジットカードに与信上の問題がある（残高オーバー、その他与信的な問題）場合のテストでおそらく最も発生する率が高いケースかと思います。

##APIのエラーコードに対応したテストをする
PayPalのデベロッパーサイトでSandboxアカウントを作る際に、AccountDetail > Settingsの「Negative Testing」をOnにすると、各APIの特定のフィールド（ほとんどがAMTなどの決済額のフィールド）にエラーコードと同じ数値を小数点として指定することで、そのエラーコードに対応したエラーをAPIが返すようになります。

>例：DoExpressCheckoutPayment APIでエラーコード10539を発生させたい場合、AMTに105.39を指定します。

通貨がJPYの場合はAMTに小数点は指定できないので、通貨はデフォルトのUSDを使います。

詳細は以下に載っています。
https://developer.paypal.com/docs/classic/lifecycle/sb_error-conditions/?mark=nrgativer%20testing

##支払いが保留などになるケースをテストする
PayPalは様々な不正検知の仕組みを持っているため、支払いがたまに即座に完了されず保留などになるケースがあります。
この状況をテストするには、上記同様SandboxのSettingsで「Payment review」をonにすると、すべての取引が完了せず、「保留」などのレビュー待ちになります。


詳細は以下に載っています。
https://developer.paypal.com/docs/classic/lifecycle/sb_payment-review/?mark=payment%20review%20test

上記３ポイントをテストしておけば、決済に絡むテストはかなりカバーできるのではと思います。
（もちろん通信障害やタイムアウトなどのシステム一般的なテストは別途必要ですが）
Let's Encryptから証明書を取得してAWS ELBに組み込む


Let's EncryptがPublicBetaになりましたので、さっそく組み込み。
https://letsencrypt.org/2015/12/03/entering-public-beta.html

まずは個人環境で実装してます。
商用に組み込むのはお勧めしません。

# Let's Encrypt
無償で信頼された証明書を取得し使用できるサービス
https://letsencrypt.org/about/


# AmazonLinuxで証明書を取得

例えばwww.hogehoge.com の証明書を取得する場合
サーバ上で認証する必要があるため、
証明書取得用のサーバを用意する方法が環境を汚さないので良いと思います。

www.hogehoge.com のDNSのを作成したインスタンスのEIPに向けます。
インスタンスのセキュリティグループは80/443をフル解放しておきます。

## パッケージ
```
sudo yum install git libffi-devel puppet libffi-devel puppet httpd24
```

# 証明書取得

```
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --server https://acme-v01.api.letsencrypt.org/directory auth
```

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.hogehoge.com/fullchain.pem. Your
   cert will expire on 2016-03-06. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

```

## 中間証明書

AWSのELBに組み込む際に、中間証明書が上手く認証できなかった。
記載する順番も変えたか駄目だったので、直接キーを探して組み込んだら上手く行きました。

https://letsencrypt.org/certificates/
https://www.identrust.com/certificates/trustid/root-download-x3.html

自己証明書使うぐらいなら、これでよいかと思いました。
MacVimをアップデートしたら~/.vimrcが読み込まれなくなった

MacVimをアップデートしたら`~/.vimrc`が読み込まれなくなりました。

原因はMacVimにビルドインされた`vimrc`の方が読み込まれていることです。
`~/.vimrc`を読みこませるためには、これらを削除すればよいです。

```bash
rm /Applications/MacVim.app/Contents/Resources/vim/vimrc
rm /Applications/MacVim.app/Contents/Resources/vim/gvimrc
```
Rails | モデルの validate 文が効かない？

validate (単数形) ではなく validates (複数形) で書くこと。

```rb:models/example.rb
class Example < ActiveRecord::Base
-  validate :user_id, presence: true
+  validates :user_id, presence: true
end
```

この場合 :user_id がたまたまアクセサとして存在すると、validate (単数形) で書いても何のエラーも起こらないようなので注意。（コメント参照）

# 環境

- Rails 4.0.13



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
11/19 各Userに紐づいたShipping_addressをviewに表示させたい。


11/16にUserとShipping_addressのリレーションをhas many/belong_toで作成したので、今度はそれをViewに反映させていきたい。

UserとShipping_addressが紐づいているときはURLはusers/1/shipping_addresses/3みたいな形になるので、まずrouteをネストさせる。

![スクリーンショット 2015-11-20 0.10.53.png](https://qiita-image-store.s3.amazonaws.com/0/99892/3761a55d-3b4a-4512-fb9d-ef03e6519bd6.png "スクリーンショット 2015-11-20 0.10.53.png")

単体でshipping_addressを編集するときも考慮し、ネストしないshipping_addressも記述。

まずはindexアクションに飛ばすためにpathを決める。

add_to_cart.html.erb
![スクリーンショット 2015-11-20 0.13.19.png](https://qiita-image-store.s3.amazonaws.com/0/99892/4bf093ef-3cb9-dd8c-737f-7d57a2e3147b.png "スクリーンショット 2015-11-20 0.13.19.png")

※showやedit actionにアクセスする為のパス(member_pathやedit_member_path)のような、個別のリソースを扱うアクションへのパスは引数にモデルオブジェクトを渡す。

これでIndexアクションへのパスが通った。

今度はshipping_address.controllerのindex actionをいじっていく。

Indexアクションでやりたいことは、
1.どのユーザーでログインしているのか？
2.Shipping_addressオブジェクトを丸ごと取り出す。

1.下記のように記載したらエラー発生。
![スクリーンショット 2015-11-20 0.23.22.png](https://qiita-image-store.s3.amazonaws.com/0/99892/cdc4e0cd-838c-fc1b-12b5-ee6c0d8b074d.png "スクリーンショット 2015-11-20 0.23.22.png")
![スクリーンショット 2015-11-20 0.24.23.png](https://qiita-image-store.s3.amazonaws.com/0/99892/33ff7893-3e09-b26b-5fce-666d3f9807d6.png "スクリーンショット 2015-11-20 0.24.23.png")

どうも.findメソッドがダメらしい....?

下記記事をもとに@user = User.find_by_id(params[:user_id])と記載したらuser_idを取得してくれた。

参照：https://railsforum.com/topic/4070-cannot-find-user-without-id/

そして次はshipping_addressesメソッドって何やねん！っていうエラー
![スクリーンショット 2015-11-20 0.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/99892/35359bd2-f3b2-0687-cb17-7a588b986873.png "スクリーンショット 2015-11-20 0.27.45.png")


Question1:パスに渡す引数はどんなものがある？引数の役割は？
Question2:.findと.find_by_idの違いって何？

Question2の答え：違いはRecordが見つからなかった場合の挙動。
.find=>例外を発生させる。 find_by_id=>nilを返す。
参照：http://higelog.brassworks.jp/?p=71

ResourcesとResourceの違いを理解する。

current_userみたいにUserが誰かわかっている場合はresouce (ex:3000/user/shipping_addresses)

ただ他のuserのshipping_addressを見たい場合はuser/user_id/shipping_address/shipping_address_idみたいになる。
(adminから特定のユーザーのshipping_addressを見たい場合なんかはそう.from who's perspectiveかを基準にsettingする)
11/15 User_idとshipping_addressのカラム間でリレーションを作る。


やりたいこと：1人のユーザーが複数の住所を登録する場合に備えて、UserとShippingAddressのリレーションを作る。

参照：http://ruby-rails.hatenadiary.com/entry/20141203/1417601540

User.rbとShipping_address.rbにそれぞれリレーションを加えていく。

User.rb
![スクリーンショット 2015-11-15 19.25.43.png](https://qiita-image-store.s3.amazonaws.com/0/99892/957e283f-8c8c-fd6a-d80f-4e8dad0f63e1.png "スクリーンショット 2015-11-15 19.25.43.png")

Shipping_address.rb
![スクリーンショット 2015-11-15 19.25.38.png](https://qiita-image-store.s3.amazonaws.com/0/99892/11ce29c1-8066-9ec1-8896-c1b9fb13e5bf.png "スクリーンショット 2015-11-15 19.25.38.png")

Shipping_address.controllerで保存の際にUser_idのリレーションを作る。

![スクリーンショット 2015-11-15 19.30.25.png](https://qiita-image-store.s3.amazonaws.com/0/99892/a32117ac-9272-9f33-d9e6-c8070d0b4100.png "スクリーンショット 2015-11-15 19.30.25.png")

これで登録すると、紐づいた。
![スクリーンショット 2015-11-15 19.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/99892/c40183e8-7004-8fcb-b086-bebffb8bf594.png "スクリーンショット 2015-11-15 19.30.56.png")

Qeustion:@shipping_address.user = current_user
の.user = はactiverecordのメソッド。

activerecordのメソッドは下記を参照：
http://www.atmarkit.co.jp/ait/articles/1405/30/news036_3.html
http://qiita.com/Yama-to/items/4696e9d43ebec6012129
アプリの環境設定値を .env で管理する

この記事は [- スピカ Advent Calendar 2015 -](http://qiita.com/advent-calendar/2015/spika) 7日目の記事です。

弊社の [アプリ](https://itunes.apple.com/jp/app/id994869271) では開発／本番時にどのように環境設定値を切り替えているかを話したいと思います。


# はじめに

以前のプロジェクトでは環境変数を `pbxproj` に定義していたのですが、以下の点で苦労していました。

+ スキーマと変数定義が密接な関係のため、複数の開発環境向けにビルドするなどが大変
+ `pbxproj` はファイル管理も含んでいるため、一時的に変更したローカルな定義値を間違えて一緒にコミットすることがあった
    + 差分もたくさん出るので、レビュー側も大変になる
+ 秘密鍵などの情報もコミットしていた


そこで今回以下のような構成を採用しました。
まずフローを図示すると以下のような構成になります。

![名称未設定ダイアグラム-4.png](https://qiita-image-store.s3.amazonaws.com/0/8508/2f2f7358-4d55-f0d7-fed8-1f438c683b23.png)



# dotenv

環境によって変わる変数は `.env` で管理しています。
中身はキーバリューで記述します。
※ 本来 `.env` は環境毎にユニークなことが理想ですが、アプリでは同じ環境でデバッグ／リリースビルドを行うため、 `.env` 内で両方定義してあります。

```zsh:.env

SOME_SECRET_KEY_RELEASE = "hoge"
SOME_SECRET_KEY_DEBUG = "fugue"

FACEBOOK_APP_ID_RELEASE = "123456"
FACEBOOK_APP_ID_DEBUG = "654321"

```

※ `.env` ファイル自体は秘密鍵などの情報があるため、今のところバージョン管理していません。ただどこにも管理されていないのは困るので `Qiita:Team` の記事上で管理をしています。


# ERB テンプレート

`.env` は値の羅列のリストになり、どういった使われ方なのかわかりづらいため、必要な箇所で参照するためのテンプレートを用意しています。
ERB テンプレートはバージョン管理し、`pbxproj` から分離されたので、変更がある際もレビューしやすくなりました。
あわせてテンプレートから実際のファイルを生成する処理を Xcode の Build Phase スクリプトに設定し、常に最新の環境設定になるようにしています。

## xcconfig

[xcconfig](https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/BasingBuildConfigurationsonConfigurationFiles.html) は YAML ベースでテンプレートを用意しています。
 YAML の場合、継承関係の表現が可能なため、 xcconfig の定義に適しています。


```rb:xcconfig.yaml.erb
Release: &Release
  INFOPLIST_PREPROCESSOR_DEFINITIONS:
  INFOPLIST_PREPROCESS: "YES"
  FACEBOOK_APP_ID: "<%= ENV['FACEBOOK_API_KEY_RELEASE'] %>"

Debug: &Debug
  <<: *Release
  FACEBOOK_APP_ID: "<%= ENV['FACEBOOK_API_KEY_DEBUG'] %>"

  OTHER_SWIFT_FLAGS: -DDEBUG
```

+ xcconfig の設置場所はプロジェクト設定にあります。

  ![salonbook-ios-app_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/8508/aae9d1ce-c55d-6636-b977-a903b0a43c0f.png)



## Env.swift

Swift の場合マクロ経由の値参照できないため、 `Env.swift.erb` から必要な環境変数を参照します。

```swift:Env.swift.erb

import Foundation

public struct _Env_Release {
    /// Facebook APIキー
    public static let FACEBOOK_API_KEY = "<%= ENV['FACEBOOK_API_KEY_RELEASE'] %>"
}

public struct _Env_Debug {
    /// Facebook APIキー
    public static let FACEBOOK_API_KEY = "<%= ENV['FACEBOOK_API_KEY_DEBUG'] %>"
}

#if DEBUG
public typealias Env = _Env_Debug
#else
public typealias Env = _Env_Release
#endif

```

# おわりに

`.env` を利用することで環境設定値とスキーマを分けて利用することが可能になりました。
※ Jenkins 環境ではジョブごとにそれぞれの環境を向いた `.env` を注入して、ビルドをしてたりしています。

よろしければ、みなさんはどうしているか等コメント頂ければ幸いです。

# 付録

## 変換処理例

```rb:Rakefile
def load_xcconfig_yaml()
  erb = File.open("./config/xcconfig.yaml.erb") { |f| ERB.new(f.read) }
  yaml = YAML.load(erb.result(binding))
  yaml.each{ |scheme, map|
    File.open("./config/#{scheme}.xcconfig", "w") do |f|
      if map
        map.delete("<<") if map.key?("<<")
        map.each { |k, v|
          f.puts "#{k} = #{v}"
        }
      end
    end
  }
end

```
Manjaro Linux 15.09インストール

この記事はArch Linux Advent Calender 2015の5日目です。

* 2015/12/7に[Manjaro Linux 15.12-rc1](https://manjaro.github.io/)が出ました。

## 参考

* [arch - Linux ディストリビューション Manjaro Linux の使い方 vol.1 - Qiita](http://qiita.com/syui/items/318ea249b23894bee69c)
* [archLinux - Manjaro Linux 0.8.10使ってみた - Qiita](http://qiita.com/tukiyo3/items/f846b6200718db4a98c1)

## 嬉しい点

* xfce4-terminalがカスタマイズされている
    * 新しいウィンドウを開いた時に、最後の作業フォルダが引き継がれる。
    * 半透明
* 最初からyaourtがインストールされている


## 日本のミラーサイト登録

```bash:
sudo -s
echo 'Server = http://ftp.tsukuba.wide.ad.jp/Linux/manjaro/stable/$repo/$arch' > /etc/pacman.d/mirrorlist
```

## 日本語入力

```bash:
pacman -Sy \
  fcitx-mozc fcitx-configtool
```

```bash:~/.xprofile
export XMODIFIERS="@im=fcitx"
```

* ログインしなおし、日本語入力できることを確認。

## sudoers修正方法

```diff:/etc/sudoers.d/10-installer
-user1 ALL=(ALL) ALL
+user1 ALL=(ALL) NOPASSWD: ALL
```

## 夏時間を無効化

![時刻と日付.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dc3e725a-5e05-1a62-93d9-704032e2452c.png)

## アンチエイリアス設定

![アンチエイリアス.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ea703074-7e7c-baf9-3d39-1202a4006509.png)

## キーボードの設定

![スクリーンショット_2015-12-07_15-08-08.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fe36716e-d11d-b748-a944-e47026d3f728.png)

![スクリーンショット_2015-12-07_15-09-50.png](https://qiita-image-store.s3.amazonaws.com/0/25728/db7664db-e4cc-4283-727e-9df74e3ffc41.png)


## ターミナルの文字色修正

![スクリーンショット_2015-12-07_14-41-46.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8e0b01d5-cd8b-b519-c3fa-c1af1c33d21c.png)

## seleniumインストール

```bash:
pacman -Sy python2-selenium
# 使い方
python2 hoge.py
```

## kernel 4.4をインストールしてみる

```bash:
pacman -Sy linux44
```

* 再起動し、kernel 4.4になったことを確認。

## Virtualboxのインストール

```bash:
pacman -Sy \
  virtualbox linux44-virtualbox-host-modules \
  virtualbox-guest-iso virtualbox-ext-vnc virtualbox-host-dkms \
  linux44-virtualbox-guest-modules
```

```bash:/etc/modules-load.d/virtualbox.conf
vboxdrv
vboxnetadp
vboxnetflt
vboxpci
```

```bash:vboxusersグループに追加
usermod -aG vboxusers ユーザ名
```

* OS再起動

## YouTube HTML5 動画プレイヤーのリクエスト

* [YouTube HTML5 動画プレーヤー](https://www.youtube.com/html5)

## 自分用パッケージ追加

```bash:
pacman -Sy \
  pinta autossh ranger \
  rdesktop tigervnc \
  gvim \
  ttf-ubuntu-font-family \
  bash-completion
```

```bash:
systemctl enable sshd
```

### slackインストール

* 優先度を一番下げてビルド。`ps l`で`NI`の値を確認できる。

```bash:
alias yaourt="nice -n 19 yaourt"
```

```bash:slack-desktop
yaourt slack-desktop
```

```bash:tor-browser-en
gpg --keyserver keys.gnupg.net --recv-keys 2E1AC68ED40814E0
yaourt tor-browser-en
```

```bash:そのた
yaourt mcomix
```

## IP固定

```bash:
sed 's/eth0/enp0s25/' /etc/netctl/examples/ethernet-static > /etc/netctl/enp0s25
netctl enable enp0s25
```

# まとめ

* Manjaro Linux使いやすい
Arch Linux インストールCDリマスター

この記事はArch Linux Advent Calender 2015の3日目です。

* 今回はVirtualboxインストール済みのISO(i686)を作成します。
* 作業はArch Linux上で行う必要があります。

## 参考

* [Remastering Arch Linux Live System](http://imcarl.blogspot.jp/2013/02/remastering-arch-linux.html)
* [archLinux - Arch Linux インストール (非EFI) 2015-12-07 - Qiita](http://qiita.com/tukiyo3/items/745b08f11a2e8c0ccd69)

# cdの中身をコピー

```bash:
mkdir /mnt/archiso
mount /dev/cdrom /mnt/archiso
cp -a /mnt/archiso ~
umount /mnt/archiso && rmdir /mnt/archiso
cd
```

# 必要なツールをインストール

```bash:
pacman -Sy squashfs-tools arch-install-scripts cdrkit
```

# airootfs.sfsを展開

```bash:
export ROOTDIR=~/squashfs-root
unsquashfs -d $ROOTDIR archiso/arch/i686/airootfs.sfs
rm -f archiso/arch/i686/airootfs.sfs
```

# pacman-key --init用にバックでプログラムを動かしておく

```bash:
haveged -w 1024
arch-chroot $ROOTDIR pacman-key --init
pkill haveged
```

```bash:
# keyの更新
arch-chroot $ROOTDIR pacman-key --populate archlinux
# システムの更新
arch-chroot $ROOTDIR pacman -Syu
# パッケージ追加
arch-chroot $ROOTDIR pacman -Sy \
  grub-bios openssh btrfs-progs
# パッケージ追加(virtualbox用)
arch-chroot $ROOTDIR pacman -Sy \
  mesa qt4 xorg-xauth sudo otf-ipafont \
  virtualbox virtualbox-guest-utils \
  virtualbox-ext-vnc virtualbox-guest-iso
# キャッシュのクリア
arch-chroot $ROOTDIR pacman -Scc
```

```bash:
arch-chroot $ROOTDIR /bin/bash

# ユーザの作成
useradd -m vagrant
passwd vagrant
usermod -aG wheel vagrant 
usermod -aG vboxusers vagrant

# locale
sed -i -e 's/#ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf

# X転送許可
sed -i -e 's/#X11Forwarding no/X11Forwarding yes/' /etc/ssh/sshd_config

# サービス起動設定
systemctl enable sshd
systemctl enable vboxservice

exit
```

```bash:
mksquashfs $ROOTDIR archiso/arch/i686/airootfs.sfs -comp xz
```

```bash:
cd archiso
```

```bash:iso作成
genisoimage -l -r -J -V "ARCH_201512" \
 -b isolinux/isolinux.bin \
 -no-emul-boot \
 -boot-load-size 4 \
 -boot-info-table \
 -c isolinux/boot.cat \
 -o ../arch-custom.iso .
```

# 起動確認

* arch-custom.iso からブートし、i686を選択し起動するとvirtualboxが起動できることを確認。

# まとめ

* archLinuxのISOリマスターは簡単で良いですね。
日付から年度の開始日終了日を求める

# 始まり
基準の日からの年度での開始・終了日を取得したかった
４月での年度区切りとして知りたかったので… 

# 考え方
開始　：　年（基準の日　-３ヶ月）＋　”04/01”　
終了　：　年（基準の日　-３ヶ月　+ １２ヶ月）＋　”03/31”　

とりあえず次の年の場合も減算して前の年にして年度を求めるのが
基本のロジックで作りました
それで終了は逆に１年プラスする形にして算出
（「-３ヶ月　+ １２ヶ月」でなくても「＋９ヶ月」でもいいと思うけど…後で見た時にわけがわからなくなりそうなので…）

# SQL文

```SQL:SQL_SERVER

--* DataTitle 年度(SQL SERVER)
select 
     now_yyyymmdd as 現在日付
	,CAST(CAST(YEAR(DATEADD(month, -3, A.now_yyyymmdd)) AS varchar )   + '/04/01' AS DATE) as 開始年度
	,CAST(CAST(YEAR(DATEADD(month, -3 + 12, A.now_yyyymmdd)) AS varchar)   + '/03/31' AS DATE) as 終了年度
from (select  CAST('2015/05/01' AS DATE)  as now_yyyymmdd) A
;

```


```SQL:ORACLE
--* DataTitle 年度(ORACLE)
SELECT
     now_yyyymmdd as 現在日付
	,CAST(TO_CHAR(add_months(now_yyyymmdd, -3),'yyyy') || '/04/01' AS DATE)  as 年度開始
	,CAST(TO_CHAR(add_months(now_yyyymmdd, -3 + 12),'yyyy') || '/03/31' AS DATE)  as 年度終了
FROM (SELECT  CAST('2015/05/01' AS DATE)  as now_yyyymmdd from dual )
;
```

#結果

**'2015/05/01'の場合**

|現在日付| 年度開始 | 年度終了 | 
|:-----------:|:-----------:|:------------:|
|2015/05/01| 2015/04/01|2016/03/31 |


**'2015/03/01'の場合**

|現在日付| 年度開始 | 年度終了 | 
|:-----------:|:-----------:|:------------:|
| 2015/03/01| 2014/04/01|2015/03/31 |
slidebars.jsを使った時にheaderをfixedにしたいとき困ったこと

# 困ったこと

スマホのときに横からシュッとナビをだしたい
↓
slidebars.jsを使うことにした
[http://plugins.adchsm.me/slidebars/](http://plugins.adchsm.me/slidebars/)

今回のサイトは<header>部分を固定にしたい
↓
container部分が表示されない

slidebars.jsを修正

```lang:js
106:// Inline CSS
		function css() {
			// Site container height.
			// $site.css( 'minHeight', '' );
			// var siteHeight = parseInt( $site.css( 'height' ), 10 ),
			// htmlHeight = parseInt( $( 'html' ).css( 'height' ), 10 );
			// if ( siteHeight < htmlHeight ) $site.css( 'minHeight', $( 'html' ).css( 'height' ) ); // Test height for vh support..

```
上記部分をまるっとコメントアウト
さくらVPS(CentOS6.7)でSoftEtherをソースコードからコンパイルする

```
# yum -y update
# yum -y install readline-devel ncurses-devel openssl-devel
# cd /usr/local/src/
# git clone https://github.com/SoftEtherVPN/SoftEtherVPN.git
# cd SoftEtherVPN/
# ./configure
# make
# make install
```
[iOS]RealmのモデルクラスのプロパティにCGFloatを指定してはいけない

[この投稿は Sansan Advent Calendar 2015 の 7 日目の記事です。](http://qiita.com/advent-calendar/2015/sansan)
# 突然のクラッシュ
とあるバージョンをリリース後に、突如下記の様なクラッシュがクラッシュレポートに出現。さらに<b>リリースから数日後</b>、このクラッシュが怒涛の如く増加した。

```
Fatal Exception: RLMException
Migration is required for object type 'XXXXX' due to the following errors: - Property types for 'XXXXX' property do not match. Old type 'float', new type 'double'. - Property types for 'XXXXX' property do not match. Old type 'float', new type 'double'.
```

# どういう例外なのか？
`Realm`では`realmWithConfiguration`でrealmオブジェクトを取得する際に、RLMRealmConfigurationで指定したpathに保存されているRealmファイルのスキーマと、現在のモデルクラスから生成したスキーマを比較し、もしもマイグレーションが必要だった場合はRLMExceptionを発生させます。

つまり、もしもモデルクラスのプロパティを`float`から`double`に変更したにもかかわらずマイグレーションを実施していなかったならば、上記の例外が発生するのは自然なことです。

# しかしモデルクラスの型は変えていなかった
とういうか、上記の例外でマイグレーションせよと言われてるプロパティは、`flaot`でも`double`でもなく、`CGFloat`で保存していました。何も変更してないのになぜマイグレーションが必要なのか、、、？

# CGFloatは端末によって型が違う
これは有名な話ですが、CGFloatの実体はCPUのアーキテクチャにより違う型となります。

[本当は怖いCGFloat](http://qiita.com/keroxp/items/b9f2c0f22ccf3415f6cc)

>CGFloatの定義をみると、こんな感じになっています。
64bitアーキテクチャではdouble, それ以外（32bit）ではfloatとして定義されています。

しかし、CPUアーキテクチャによって型が違うとはいえ、同じ型で保存されている限りは上記の様な例外は発生しないはずです。モデルクラスに修正は加えていないのに、どこで型が変わってしまったのでしょうか？

# 機種変更というトラップ
そう、同じ端末である限りはCGFloatの型が変わることはありません。しかし、<b>機種変更</b>と<b>バックアップからデータを復元</b>という合わせ技を行うと事情が変わります。

より具体的にいうと、32bitアーキテクチャな端末(iPhone5など)から64bitアーキテクチャな端末に機種変更をし、バックアップからデータを復元した場合です。

この場合、端末のバックアップに保存されているRealmファイルの型は<b>float</b>だが、最新のモデルクラスから生成したスキーマの型は<b>double</b>という事態が起こります。最初に書いたエラーはこれが原因でした。

また、ちなみにリリースから数日後に突如エラーが頻発するようになった原因はその数日後というのが<b>9月のiPhone6Sがちょうど発売するタイミング</b>だったことでした。。。

# 上記の例外が発生した場合の対応方法
バージョンアップ時にプロパティの型をCGFloatではなく`float`か`double`、いずれかに指定してマイグレーションを実施することでエラーは収束しました。

# というわけで
RealmのモデルクラスのプロパティにCGFloatを指定すると、上記の様な理由でクラッシュする危険性があるというお話でした。現在、[Realmの最新のドキュメント](https://realm.io/jp/docs/objc/latest/)にも

>CGFloat型はプラットフォーム（CPUアーキテクチャ）によって実際の定義が変わるため、使用しないようにしてください。

と記述されており、基本的にはRealmにCGFloatを格納するのは止めておくべきでしょう。