OmniAICreator/Qiita-1.07M huggingface dataset:
iPhoneの画面サイズ (iOS8以降)

| デバイス        | ディスプレイ      | 解像度 (px)  | 相対サイズ  | 画面スケール |
|:---------------|:---------------:|:------------|:---------:|:----------:|
| iPhone 4s      | 3.5 inch Retina | 640 x 960   | 320 x 480 | @2x         |
| iPhone 5s・5c・5| 4.0 inch Retina | 640 x 1136  | 320 x 568 | @2x         |
| iPhone 6       | 4.7 inch Retina | 750 x 1334  | 375 x 667 | @2x         |
| iPhone 6 Plus  | 5.5 inch Retina | 1242 x 2208 | 414 x 736 | @3x         |
アプリ内でキャンペーンを開催したらリジェクトされた話と対処法

![icon.jpg](https://qiita-image-store.s3.amazonaws.com/0/10532/6295add5-0ba8-2644-f610-9dea2189eb22.jpeg "icon.jpg")

CafeSnapという、こだわりのカフェが探せるアプリを昨年9月にリリースして、久しぶりに審査でリジェクトされてしまったのでその対処法を書いておきます。

## 背景
CafeSnap内では写真投稿ができるのですが、1月からCafeSnap内で投稿して下さった写真の中から優秀なものを選定して、プレゼントをするキャンペーンを行いました。キャンペーンを開始してからしばらくして、アップデートの審査に提出したところリジェクトを喰らってしまった。。

## 指摘されたポイント
1. Developers are responsible for assigning appropriate ratings to their Apps. Inappropriate ratings may be changed/deleted by Apple  
(適切なレーティングを設定すること)
- Official rules for sweepstakes and contests must be presented in the App and make it clear that Apple is not a sponsor or involved in the activity in any manne  
(利用規約にキャンペーンに関する記述を入れること、Appleがスポンサーでないことやキャンペーンに関与していないことを明確にすること。)

## 対応したこと
I. レーティングを「4+」→「17+」に変更 
(ストアに出せない国がいくつかあります)

II. キャンペーンのページにアップルが関与していないことを記載、アプリの利用規約にもキャンペーンに関する記述を追加。

```お知らせページ,利用規約に追加した文言
本アプリにおけるキャンペーンはCafeSnapが独自に行うもので、米Appleとは一切関係がありません。
```
III. 対応した旨を問題解決センターでスクリーンショットを添付して送付し、再申請。今回はビルドの再提出は必要ありませんでした。

## まとめ
キャンペーンを開始してから、何回か審査は通っていたものの
Appleの審査は厳しい時もあれば甘い時もあるため、
今回のように変えていない機能でリジェクトを喰らうことがあります。
特にレーティングなどが変更になる場合は要注意ですので、気をつけて申請しましょう。

## リンク
[CafeSnap(iOS版)](https://itunes.apple.com/jp/app/cafesnap/id910848942)
[CafeSnap(Android版)](https://play.google.com/store/apps/details?id=jp.co.allabout.cafesnap)
ItemsControlの行を別な色で塗る方法

#着色するアイテムの背景の色数を設定する
ItemsControlのAlternationCountプロパティへ背景色に使う色数を指定します。交互に色を変えたい場合には、2を指定します。3色の繰り返しなら3を指定すれば良いです。デフォルトは、1色なので1が指定されているということですね。

```xaml:Test.xaml
<ItemsControl AlternationCount="2"/>
```

#テンプレートでアイテムの背景色を塗る
機能の肝は、ItemsControl.AlternationIndexプロパティが、1行レンダリングする毎に、更新されるという所です。
Triggerタグを使って、(2色の場合)奇数なのか偶数なのかを見て、アイテムの背景色を別な色で塗ります。

```xaml:Test.xaml
<ItemsControl AlternationCount="2">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <!-- 背景となる -->
      <Border x:Name="background"/>
      <DataTemplate.Triggers>
        <!-- 偶数行 -->
        <Trigger Property="ItemsControl.AlternationIndex" Value="0">
          <Setter TargetName="background" Property="Background" Value="#FFEFEFEF" />
        </Trigger>
        <!-- 奇数行 -->        
        <Trigger Property="ItemsControl.AlternationIndex" Value="1">
          <Setter TargetName="background" Property="Background" Value="#FFE0E0E0" />
        </Trigger>
      </DataTemplate.Triggers>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>
```
Ansibleでやってみる/複数サーバのservice(tomcat/postgresql)をまとめてstart/stopするだけのplaybook

あんまりこういう例見かけなかったので。

インベントリの `hosts` ファイルを用意。

```env1.hosts
[tomcat]
198.168.2.11:122
198.168.2.21:222
198.168.2.41:422 ansible_ssh_user=root ansible_ssh_pass=R00TP455W0RD
198.168.2.51:522 ansible_ssh_user=root ansible_ssh_pass=R00TP455W0RD
198.168.2.71:722
198.168.2.81:822

[postgresql]
198.168.2.31:322
198.168.2.61:622
198.168.2.91:922

[all:vars]
ansible_ssh_user=user
ansible_ssh_pass=P455W0RD
ansible_sudo_pass=P455W0RD
```

SSHポートを変更してあるときは `ip:port` で。
他のインスタンスと異なるuser/passを使うときには `ansible_ssh_user` 、 `ansible_ssh_pass` を個別に指定。
`sudo` が必要なときは `ansible_sudo_pass` も書いておく。
今回は `tomcat` グループも `postgresql` グループも共通のユーザで入るので、そのへんの指定は `all:vars` で。

参考：

- http://docs.ansible.com/intro_inventory.html

Playbookを用意。

```tomcat-start.yml
- hosts: tomcat
  tasks:
  - name: start tomcat
    service: name=tomcat state=started
    sudo: yes
```

```tomcat-stop.yml
- hosts: tomcat
  tasks:
  - name: stop tomcat
    service: name=tomcat state=stopped
    sudo: yes
```

`service` 使えば簡単ですね。 `sudo: yes` しとくと `ansible_sudo_pass` を使って `sudo service tomcat start` してくれるイメージ。
重要なのは `hosts` と `service` のところ。 `hosts` にはインベントリのグループを、 `service` には登録されているサービス名 `name` とステータス `state` を指定する。
サービス名は自分の環境に合わせて `tomcat8` とか `postgresql-9.4` とかやること。

参考：

- http://docs.ansible.com/service_module.html
- http://docs.ansible.com/playbooks_intro.html

叩くとき

```shell-session
$ ansible-playbook tomcat-start.yml -i env1.hosts
$ ansible-playbook tomcat-stop.yml -i env1.hosts
```

`postgresql` でもやり方は同じ。

```postgresql-start.yml
- hosts: postgresql
  tasks:
  - name: start postgresql
    service: name=postgresql state=started
    sudo: yes
```

```postgresql-stop.yml
- hosts: postgresql
  tasks:
  - name: stop postgresql
    service: name=postgresql state=stopped
    sudo: yes
```

```shell-session
$ ansible-playbook postgresql-start.yml -i env1.hosts
$ ansible-playbook postgresql-stop.yml -i env1.hosts
```

良くわかってない人にとりあえず使ってもらうには、冪等性！冪等性！って言うよりもこのくらいの例の方が食いついて来たりするんですよね。
別の環境に使うときには、別のインベントリファイルを用意して貰おう。

こちらも参考にどうぞ：

- [Ansibleのインベントリファイルでステージを切り替える](http://qiita.com/NewGyu/items/5de31d76d2488ab27ed6)
- [Ansible オレオレベストプラクティス](http://qiita.com/yteraoka/items/5ed2bddefff32e1b9faf)
【デザインパターン】 Builderパターン

##概要
同じ作成過程で異なる表現形式の結果を得るためのパターン。

以下の4クラスからなる
1. Builderクラス(Productオブジェクトの構成要素を生成するためのインターフェイスを定義)
2. Concrete Builderクラス(1.のインターフェイスを実装)
3. Directorクラス(1.のインターフェイスを使ってオブジェクトを生成する)
4. Productクラス(作成中の多くの構成要素からなる複合オブジェクトを表す)

##具体例
家の建築を例にすると、

上記1~4はそれぞれ

1. 建物作成クラス
2. 一戸建て作成クラス、高層ビル作成クラス
3. 建築家クラス
4. 建物クラス

が対応する。
コードの詳細は以下

```rb:builder.rb
class Builder
  def initialize
    @building = Building.new
  end

  def build_rooms
    @building.set_rooms
  end

  def build_floors
    @building.set_floors
  end

  def build_roofs
    @building.set_roofs
  end

  def get_result
    return @building
  end
end
```

```rb:detached_house_builder.rb
class DetachedHouseBuilder < Builder
  def build_rooms
    # 一戸建て用の部屋を作成
  end

  def build_floors
    # 一戸建ての各フロアを作成
  end

  def build_roofs
    # 一戸建て用の屋根を作成
  end
end
```

```rb:tower_building_builder.rb
class TowerBuildingBuilder < Builder
  def build_rooms
    # 高層ビル用の部屋を作成
  end

  def build_floors
    # 高層ビルの各フロアを作成
  end

  def build_roofs
    # 高層ビル用の屋根を作成
  end
end
```

```rb:director.rb
class Director
  def initialize(builder)
   @builder = builder
  end

  def build
    @builder.build_rooms
    @builder.build_floors
    @builder.build_roofs
    @builder.get_result
  end
end
```

```rb:Building.rb
class Building
  def initialize
  end

  def set_rooms
  end

  def set_floors
  end

  def set_roofs
  end
end
```

##メリット
* DirectorはBuilderのインターフェイスだけを知っていればいいので、ConcreteBuilderが追加されてもDirectorは影響を受けない

##まとめ
複合オブジェクトを段階的に生成する際に便利なパターン
Electric Impのimp Moduleとimp Cloud

[Cylon.js](http://cylonjs.com/)の[Platforms](http://cylonjs.com/documentation/platforms/)ページを見ていると[Electric Imp](https://electricimp.com/)用の[モジュール](http://cylonjs.com/documentation/platforms/imp/)が気になりました。[Spark Cloud](https://www.spark.io/features)と似たコンセプトですが、Node.jsで書いて[imp Cloud](https://electricimp.com/product/cloud/)にデプロイするAgentが特徴的です。

## imp Module

[imp Module](https://electricimp.com/product/hardware/)はimp001 Card、imp002 Module、imp003、imp004の4種類があります。[データシート](http://electricimp.com/docs/hardware/imp/datasheets/)を読むのがわかりやすいです。imp001 Cardが[開発用](https://electricimp.com/docs/gettingstarted/)モジュールで、imp002以降が本番用モジュールみたいです。Spark Coreと同様にWi-Fiモジュールを組み込んでいるimp Cloudを通してアプリのデプロイやデバイスの管理ができます。imp Moduleとつなぐことで他のいろいろなデバイスをコネクテッドデバイスにすることができます。SparkFunでは[Android用のシールド](https://www.sparkfun.com/products/12887)も販売しています。

[Buy a Dev Kit](https://electricimp.com/docs/gettingstarted/devkits/)にはリンクがありませんが、セットで安かったので[Seeed Studio](http://www.seeedstudio.com)から購入しました。[Maker Shed](http://www.makershed.com/products/electric-imp#)のセット方が$35.98でちょっと安いです。

## imp Cloud

WebIDEの[imp IDE](https://electricimp.com/product/ide/)を使いAgentとDeviceのコードを2種類書く必要があります。Deviceの方は[Firmata](http://arduino.cc/en/reference/firmata)ファームウェアと違ってNode.jsで書けるので、digitalWriteやanalogWrite などSparkの[Tinker API](http://docs.spark.io/tinker/#tinkering-with-tinker-the-tinker-api)くらいのAPIを用意しておけば、とりあえずLチカから始められそうです。

[imp Cloud](https://electricimp.com/product/cloud/)にAgentをデプロイするとリモートからimpデバイスをコントロールすることができます。Spark Cloudにもpub/subのようなコードをデプロイできますが、imp Cloudのagentの方がより柔軟に書けそうです。クラウド上にエージェントやゲートウェイとしてデバイスを操作するプログラムが自由に書けると、いろいろなことができそうで楽しみです。

## Seeed Studioでお買い物

[Seeed Studio](http://www.seeedstudio.com)は日本からでも50ドル以上の買い物は[送料無料](http://www.seeedstudio.com/depot/shippinginfo.html)になります。[imp cardと imp April Breakout Boardのセット](http://www.makershed.com/products/electric-imp)で$38.00ですが、送料無料に足りないので他にもいくつか購入しました。[Grove Starter Kit](http://www.seeedstudio.com/depot/Electric-Imp-a-WiFi-enabled-Development-Platform-p-1971.html)とか[Espruino](http://www.seeedstudio.com/depot/Espruino-Board-v14-p-2200.html)とか目移りしてしまいます。
Ruby 2.2.1で解決されたSymbol GC のメモリリーク問題について

2015/3/3にリリースされたRuby 2.2.1ですが、このバージョンでSymbol GCのメモリリーク問題が修正されています。
このバグは以下のコードを実行することで確認できます

```rb
require 'objspace'
require 'pp'

def sym_num; Symbol.all_symbols.size; end
x = 0
loop {
  (x += 1).to_s.to_sym
  if (x % 1000_000) == 0
    pp ObjectSpace.count_objects
  end
}
```

このコードから得られるパラメータの内、:T_SYMBOLの推移を2.2.0と2.2.1で比較してみました。
結果は以下のとおりです。

|シンボル数|2.2.0|2.2.1|
|-----------|------------|------------|
|	1000000	|	172647	|	8722	|
|	2000000	|	288421	|	9826	|
|	3000000	|	282266	|	9969	|
|	4000000	|	295309	|	8535	|
|	5000000	|	294361	|	11162	|
|	6000000	|	157329	|	3843	|
|	7000000	|	302397	|	12555	|
|	8000000	|	345924	|	4906	|
|	9000000	|	257370	|	12841	|
|	10000000	|	163197	|	6667	|

グラフにするとこのような形になります。

![t_symbol_chart.png](https://qiita-image-store.s3.amazonaws.com/0/7630/ca82592a-aa97-4dc2-d983-88c3ca7af147.png)

シンボルのカウントが断然違うことがわかります。
バグを迅速に対応してくれるコミッターの方々には大変感謝いたします。

# 参考

https://www.ruby-lang.org/ja/news/2015/03/03/ruby-2-2-1-released/
https://bugs.ruby-lang.org/issues/10686
http://docs.ruby-lang.org/ja/2.1.0/method/ObjectSpace/m/count_objects.html
1ヶ月でエンジニアになる物語


##基礎
* アジャイルソフトウェアの奥義　for OOP（１ヶ月繰り返し）
*  リーダブルコード（何度も繰り返し）
* 人月の神話（0.5日)
* 闘うプログラマー（1日）


##１週目
* PHP　ドットインストール　２周
* Git AtlassianのGitチュートリアル

##２週目
* DB B-treeインデックスとデータ型
* 実践ハオパフォーマンスMySQLとDatabase Management System
* MVC Symfonyのチュートリアル（２日）

##３週目・４週目
サービス開発などの実践（スキップ）
モデル削除時にFileFieldに登録されたファイルを削除する


モデルのインスタンスを削除しても、インスタンスに保存されているファイルは消えない。ウッカリファイルの削除処理を書き忘れると、しばらく運用してからゴミファイルが残っているようなことになる。

ファイルの削除は`post_delete`シグナルで登録しておくのが便利（モデル操作時に明示処理すると、書き忘れとかあるので）。

```python
from django.db import models
from django.db.models.signals import post_delete
from django.dispatch import receiver


class ModelClass(models.Model):
    file_field = models.FileField()
    

# モデル削除後に`file_field`を削除する。
@receiver(post_delete, sender=ModelClass)
def delete_file(sender, instance, **kwargs):
    instance.file_field.delete(False)
```


モデルクラスに定義した`FileField`は`StorageClass`を使用してファイルアクセスするので、単純に`os.path.exists()`しただけではテストできない。`get_storage_class`から`StorageClass`を呼び出してテストするのが良さそう。

```
def ModelTestCase(TestCase):
    def test_file_existing(self):
        from django.core.files.storage import get_storage_class
    
        storage = get_storage_class()()

        obj = ModelClass.objects.create(file_field=...)
        self.assertTrue(storage.exists(obj.file_field.name))
        
        obj.delete()
        self.assertFalse(storage.exists(obj.file_field.name))
```
AngularJS のサンプルをコピペするときの注意

AngularJS 1.3.x が出てから時間が経ってますが、ネット上に出回っているサンプルは、1.3 でなく 1.2 のものが多いようです。

英語のウェブ系教育サイトで有名な [S3Schools](http://www.w3schools.com/) のサンプルも 1.2 のままです。

1.3 は 1.2 の上位コンパチではないようで、そのままコピペしても動かないことが多いようです。サンプルをコピペする場合は、1.2 なのか 1.3 なのか確認して使わないと思いがけないエラーに遭遇する可能性があります。

###1.2 から 1.3 へのマイグレーションガイド

[Migrating from 1.2 to 1.3](https://docs.angularjs.org/guide/migration#migrating-from-1-2-to-1-3)

1.4 はベータ版が出てますが、正式版が出るとさらに混乱しそうですね。
JMeterでグローバル変数的にスレッドグループ間でのデータの引き継ぎをしたいとき

テスト計画は「各スレッドグループを別々に実行」にしておく。

データを渡す側はBeanShellアサーションの中で

```
${__setProperty(COMMON_DATA, ${COMMON_DATA})};
```

とかやっておく。データを使う側はHTTPリクエストパラメータの値で

```
${__property(COMMON_DATA)}
```

とか書いてやる。

今回はループ回数1のスレッドグループを順に実行すれば良かったから考慮してないけど、ループ回数に応じて連番を振ったりすると良いんだろうな。
ssh-keygenコマンドで認証用のキーペア（秘密鍵と公開鍵）を生成する






## 基本的な生成方法

RSA鍵を生成する。

```
$ ssh-keygen -t rsa
```

このコマンドを実行すればホームディレクトリ下の.sshディレクトリに秘密鍵（id_rsa）と公開鍵（id_rsa.pub）の2つの鍵ファイルが生成される。



#### （ちなみに）RSAとDSAの違い

SSHでの安全な通信を確保する手段として「ユーザー認証」と「通信の暗号化」がある。

RSAとDSAはどちらも公開暗号方式だが、DSAは「ユーザー認証」のみなのに対し、RSAは上記２つをカバーしている。またRSAの方が暗号強度が高い。したがって現在はRSAを使うのが主流である。



## id_rsa以外の名前変えて生成する

-f 鍵のファイル名を指定するオプションを使用。


```
$ ssh-keygen -f test -t rsa
```
こちらのコマンドでtest(秘密鍵)とtest.pub(公開鍵)が生成される。
Atomパッケージメモ

#Atom パッケージ メモ.md

#テーマ
monokai

#コーディング機能強化
##自動
###Vim
vim-mode
esc 押下で英数になる処理大事.

###日本語処理サポート
japanese-wrap

##ブロックコメントの自動生成 /*
docblockr

##補完機能強化、自動候補表示
autocomplete-plus

##ミニマップ表示強化
minimap
minimap-color-hightlight
minimap-find-and-replace
minimap-hightlight-selected


##手動、コマンド入力
###複数行選択
[multi-cursor](https://atom.io/packages/multi-cursor)
cmd + opt + shift + Arrow で選択

###矩形選択
sublime-Style-Column-Selection
option + ドラッグ で選択。


#エディタ機能強化
##自動
###アイコン表示強化
file-icons

###前回終了時に開いていたプロジェクトやファイルの自動再開
save-session

##手動、コマンド入力
###プロジェクト管理
projectmanager




#未整理
highlight-line
higlight-selected

atom-beautify
atom-color-higghtlight
atom-html-preview
atom-alignment

autocomplete-css
autocomplete-html
autocomplete-paths
autocomplete-snippets

color-picker

syntax-settings

git-history
git-log
git-plus

linter
linter-jshint
linter-php

marked
minifiler

recent-files
resize-panes
script
UIWebViewにCustomUserAgentを設定する

アプリ版だけCSSの表示を変えたいとか、これを出したくないとかいう場面はあると思います。
そこで、UserAgentを使って振り分ける方法を試してみました。

WebViewのUAを取るとブラウザ(Safari)と判別は出来そうですが、
今回はカスタムのUAを新たに設定する方法を試します。
(Twitter、FacebookもカスタムUAを設定しているらしいので)
[ブラウザかWebViewか、どちらで開かれたのかを判別するには - console.lealog();](http://lealog.hateblo.jp/entry/2014/10/09/130344)

### iOS

UIWebViewのインスタンス生成後にUAの設定をしようとしても反映されないので、
実際に使うWebViewを生成する前に設定処理を書きます。(初回起動時に設定する)

```swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    setupCustomUserAgent()
    return true
}

private func setupCustomUserAgent() {
    // サイズ0のUIWebViewのインスタンスを生成
    let webView = UIWebView(frame: CGRectZero)

    // デフォルトのUAから、mapを使い新たな文字列をappendしたカスタムUAを得る
    if let customUserAgent = webView.stringByEvaluatingJavaScriptFromString("navigator.userAgent").map({ "\($0) webview" }) {
        // UAの再設定
        NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent": customUserAgent])
    }  
} 
```

### JavaScript

UAを判定する

```js
var Utils = (function () {
    function Utils() {}

    var ua = navigator.userAgent.toLowerCase();

    Utils.isIOS = function () {
        return /ip(hone|od|ad)/.test(ua);
    };
    Utils.isAndroid = function () {
        return /android/.test(ua);
    };
    Utils.isWebView = function () { 
        return /webview/.test(ua); 
    };
    Utils.isPC = function () {
        return this.isIOS() === false && this.isAndroid() === false;
    };
    Utils.isSP = function () {
        return this.isPC() === false;
    };    
    return Utils;
})();        

if (Utils.isWebView()) {
    console.log("webView.")
} else if (Utils.isIOS) {
    console.log("iOS.")    
} else {
    console.log("other.")
}
```
TransmitでVagrant仮想環境にアクセスする方法

# 1. 概要
**Mac OS X** 用のファイル転送ツールである、
**Transmit** で **Vagrant仮想環境**にアクセスする方法を書きます。

**Transmit**
[http://panic.com/jp/transmit/](http://panic.com/jp/transmit/)

# 2. 接続設定
![スクリーンショット 2015-03-04 12.28.32 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/68751/5157f490-0d3d-cd74-02db-903b05c3fb22.png)

**プロトコル**
SFTP を選択

**サーバ**
192.168.33.10

※Vagrantfileの以下で設定されているIPアドレスを指定
`config.vm.network "private_network", ip: "192.168.33.10"`

**ユーザ名**
vagrant

**パスワード**
vagrant

上記設定で、仮想環境における **/home/vagrant** にアクセスできます。
[Ubuntu] nginx/apache が共に入ってるサーバで apache が起動しない件

まぁ当たり前と言えば当たり前の事なんですが。
apache/nginx が共存しているサーバで、 apache を(再)起動しようとしてもエラーになって立ち上がらない事があります。

```
$ sudo service apache2 restart
 * Restarting web server apache2
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
Action 'start' failed.
The Apache error log may have more information.
   ...fail!
```

エラーに書いてある通り、socket が既に使用されていて使えない、という状態ですね。

```
$ sudo netstat -tanp | grep LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      849/nginx #使用中！
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      693/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      693/sshd
```

これの解決方法としては

+ (nginx が不要なら) nginx を停止して apache を起動
+ (nginx/apache 共に必要なら) nginx と apache で LISTEN するポート番号を変更する（どちらかを80番に残して、もう片方はウェルノウンポート以外で起動）

主にこの２パターンだと思います。
後者は追記するとして前者に関して。

## nginx を停止して apache を起動

単純に nginx を停止して、apache すれば良いのですが、それだとサーバを再起動した時に再び同じ状況が発生します。
apache よりも nginx の方が先に起動されるから、ですね。

```
$ /sbin/runlevel #現在の run level の確認
N 2
$ ll /etc/rc2.d/ #/etc/rcN.d/ の中身を確認
total 12
drwxr-xr-x  2 root root 4096 Sep 25 17:36 ./
drwxr-xr-x 99 root root 4096 Mar  3 22:36 ../
-rw-r--r--  1 root root  677 Jul 27  2012 README
lrwxrwxrwx  1 root root   15 Mar 23  2014 S20nginx -> ../init.d/nginx*
..（中略）..
lrwxrwxrwx  1 root root   17 Jul  3  2014 S91apache2 -> ../init.d/apache2*
..（後略）..
```

読み方としては、

| 頭文字 | 意味 | 説明 |
| :-- | :-- | :-- |
| `S` | Start | (該当ランレベルで起動時に)プログラム開始 | 
| `K` | Kill | (該当ランレベルで起動時に)プログラム停止 |

Sの後に続く数字は$実行の順番$なので、 `S20` の nginx の方が `S91` の apache2 よりも先に実行されます。

変更方法としては、該当のsymlink を rename/remove すればOK。

```
$ sudo ln -snf /etc/init.d/nginx /etc/rc2.d/.S20nginx
or
$ sudo rm /etc/rc2.d/S20nginx
```

以上。

## 参考

+ http://linux.kororo.jp/cont/intro/init.php
BEM 時の &.hoge がホゲえええな話 主にstylus

#はじめに

フロントエンドの皆さんならば

sass なら `at-root` stylus なら `&__`

とかでBEM のコーディングをうきうきやっていることでしょう。

#ここで問題

こういう書き方は static な状態に限ってはいいんだけど
例えば

```
 .root
   &__element
     hoge

   &.status_active
    え、.root__element に対して書きたい。。。。ほげええええ
  
```

みたいな状況に諸処陥る。
いい解決策が欲しいところ、書き方の構造自体が間違っているとしたら、意見をもらいたいですね。

#Stylus における打開策

### selector() をつかう

stylus においては selector()という関数が結構いかしている。
これは現状の selector を 文字列で返すというもの
つまりこういう解決ができる。

```
.root
   self = selector()

   &__element
     hoge

   &.status_active
    {self}__element
      hogehoge
```

どや顔なんてできない不器用な解決方だが、とりあえず問題は解決できた。
いかがでしょうか？
もっとスマートなやり方がある方は是非シェアして欲しい。
SH-04Fで標準ブラウザと標準カメラアプリでブラウザが落ちる

# 検証コード
```lang:index.html
<!doctype html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>SH-04F Camera Test</title>
</head>
<body>
	<input type="file">
</body>
</html>
```

# 対処法
0. 「SHカメラ」を利用するようお願いする。
1. 「Google Chrome」を利用するようお願いする。
2. docomoさんかシャープさんが直してくれるのを流れ星にお願いする。
[メモ] CakePHP で WebAPI っぽいルーティングしたい

[[メモ] CakePHP で WebAPI の実装をプラグイン上に作る](http://qiita.com/kandayasu/items/9913131b380c8a06c5c5) からの続きみたいな。この時はプラグインとして書くことでそれっぽい URL にしてみたけど、プラグインの機能の使い方を悪用している気がしたので、別の方法を考えてみた。

やりたいこと
---------------

* Model
    * HogeModel
* Controller
    * HogesController
    * HogesApiController

こんな感じで、API 用のコントローラと、Webブラウザからのアクセスに応じて、ユーザーの見る画面を提供するコントローラを分けておいて、ブラウザからの `/hoges` へのアクセスは `HogesController::index()` へ流して、`/api/hoges` へのアクセスは `HogesApiController::index()` に流したいという状態。

[ここ](http://book.cakephp.org/2.0/ja/development/rest.html) とか見てとりあえず `Router::mapResources()` を使ってみたんだけど、これだと `/hoges` とかが API へのアクセスとして `HogesController::index()` に吸われていくので思った通りではない。


結局どうしちゃったのか
---------------

結局こんな感じで `routes.php` に書いてやった。なんかゴリ押し感が半端なくて辛い。もっと良い方法ありそうだけど、一応思った通りのことは出来ているのでメモとして残しておく。

```/app/Config/routes.php
Router::parseExtensions();
function connectForAPI ($c) {
  Router::connect(
    "/api/${c}",
    ['[method]' => 'GET', 'controller' => "${c}_api", 'action' => 'index'],
    []
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'GET', 'controller' => "${c}_api", 'action' => 'view'],
    ["id" => "[0-9]+"]
  );
  Router::connect(
    "/api/${c}",
    ['[method]' => 'POST', 'controller' => "${c}_api", 'action' => 'add'],
    []
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'PUT', 'controller' => "${c}_api", 'action' => 'edit'],
    ["id" => "[0-9]+"]
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'DELETE', 'controller' => "${c}_api", 'action' => 'delete'],
    ["id" => "[0-9]+"]
  );
  Router::connect(
    "/api/${c}/:id",
    ['[method]' => 'POST', 'controller' => "${c}_api", 'action' => 'edit'],
    ["id" => "[0-9]+"]
  );
}
connectForAPI('hoges');
```
nginxとphp-fpmの設定


## 準備
### 最新のphpなどをインストールするためにレポジトリの追加を行う

#### epel
[http://dl.fedoraproject.org/pub/epel/6/](http://dl.fedoraproject.org/pub/epel/6/)
epel-release-xxx.noarch.rpm

例）`sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm`

#### remi

[http://rpms.famillecollet.com/enterprise/6/remi/](http://rpms.famillecollet.com/enterprise/6/remi/)
remi-release-xxx.xxx.remi.noarch.rpm

例）`sudo rpm -ivh http://rpms.famillecollet.com/enterprise/6/remi/i386/remi-release-6.5-1.el6.remi.noarch.rpm`

レポジトリの追加
`sudo rpm -ivh URL`

# PHPのインストール
`sudo yum -y install --enablerepo=remi --enablerepo=remi-php55 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug`

### /etc/php.iniの編集

```bash
; デフォルトの文字コード
default_charset = "UTF-8"

; タイムゾーンの設定
date.timezone = "Asia/Tokyo"

[mbstring]
; デフォルト言語の設定
mbstring.language = Japanese
```

# MySQLのインストール

`sudo yum -y --enablerepo=remi install mysql-server`

### /etc/my.cofの編集

```bash
[mysqld]
character-set-server = utf8
skip-character-set-client-handshake

[mysql]
default-character-set = utf8
```

### Mysqlの起動とサービス化

起動
`sudo service mysqld start`

サービス化
`sudo chkconfig mysqld on`

### rootのパスワードを設定

`mysqladmin -u root password パスワード`

## nginxのインストール

`sudo yum -y install nginx`

### /etc/nginx/conf.d/xxx.confの編集

```bash
server {
  listen 80;
  server_name xxx.com;
  root /path/to/xxx;
  index index.php index.html;

  location / {
    if (!-e $request_filename) {
      rewrite ^/(.+)#  /index.php?q=$1 last;
      break;
    }
  }
  
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME /path/to/xxx$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    include fastcgi_params;
  }
}

```
### nginxの起動とサービス化

起動
`sudo service nginx start`

サービス化
`sudo chkconfig nginx on`

## php-fpmのインストール

`sudo yum -y --enablerepo=remi-php55,remi install php-fpm`

### /etc/php-fpm.d/www.confの編集

apacheになっているところをnginxに変更

```
user = nginx
group = nginx
```

### php-fpmの起動をサービス化

起動
`sudo service php-fpm start`

サービス化
`sudo chkconfig php-fpm on`

## phpmyadminのインストールと設定

### インストール

`sudo yum --enablerepo=remi,remi-php55 install -y phpMyAdmin php-mysql php-mcrypt`

### インストールされたディレクトリのリネーム

`sudo mv /usr/share/phpMyAdmin /usr/share/phpmyadmin`

### /etc/nginx/conf.d/default.confに追記
```bash
    location /phpmyadmin {
        root /usr/share;
        index index.php;

        location ~ ^/phpmyadmin.+\.php$ {
             # fastcgi_pass unix:/var/run/php5-fpm.sock;
             fastcgi_pass   127.0.0.1:9000;
             fastcgi_index index.php;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include fastcgi_params;
        }

    }
```

### /etc/php.iniの編集

`session.save_path = "/var/lib/php/session"`
を追記

### アクセス権を付与


`sudo chmod 777 /var/lib/php/session`
注意）フルアクセスなので危険です。
embulk-input-jdbc を自作プラグインで利用する

自作プラグインで`embulk-input-jdbc`の`JdbcInputPlugin`を継承したりなんだりしてみようとして試行錯誤した

`embulk-input-jdbc`が`gem`で配付されているので中の jar ファイルを使うのが面倒だった

正しい方法ではなさそうな気がするけど、`build.gladle`を以下のようにして解決した

```groovy
dependencies {
    compile  "org.embulk:embulk-core:0.5.0"
    provided "org.embulk:embulk-core:0.5.0"
    // compile "YOUR_JAR_DEPENDENCY_GROUP:YOUR_JAR_DEPENDENCY_MODULE:YOUR_JAR_DEPENDENCY_VERSION"
    gems "rubygems:embulk-input-jdbc:0.3.0"
    testCompile "junit:junit:4.+"
}
 
task loadJdbcInputPlugin(type: Copy, dependsOn: ["jrubyPrepareGems"]) {
    from(fileTree("${project.buildDir}/vendor/gems/embulk-input-jdbc-0.3.0/src/main/java/org/embulk/input/"))
    into "${project.rootDir}/src/main/java/org/embulk/input/"
}
compileJava.dependsOn << "loadJdbcInputPlugin"
```

`dependencies`に`gem`ファイルを含めるには`gems "rubygems:embulk-input-jdbc:0.3.0"`のようにする
`compile "rubygems:embulk-input-jdbc:0.3.0"`でもコンパイルは通るけど、どこにファイルが配置されるのかイマイチ不明だった
`jrubyPrepareGems`タスクの実行時、`build/vendor/`以下にソースファイル等が展開されるようなので、必要なものを`src/main/java`以下へ、`compileJava`時にコピーするようにした

いろいろ教えて下さった @hiroysato さん、ありがとうございました。
rainbow-delimiters.el の括弧の色を強調する方法 (たぶん) 決定版

## 概要
rainbow-delimiters.el といえば、対応するカッコに自動的に色をつけてわかりやすくしてくれる便利な emacs 拡張です。しかし、デフォルトではなぜか色が淡くて違いがよくわかりません。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/66421/0de4de5f-f792-d0c1-92eb-879fa8c9e064.png)

そこで、括弧の色をより強調する設定が考案され、公開されています。

* [rainbow-delimiters.elの括弧色付けをデフォルトより強調する方法 - 会者定離で以降](http://d.hatena.ne.jp/murase_syuka/20140815/1408061850)
* [Small rainbow-delimiters tutorial - Yoo Box](https://yoo2080.wordpress.com/2013/12/21/small-rainbow-delimiters-tutorial/#sec-5-1)

ところが、環境によってなぜかちゃんと色が付かないことがあったので、ちゃんと色が付くように修正してみました。

## 参考サイト
* [SICP を読むために Emacs で Scheme 環境を構築 - Futurismo](http://futurismo.biz/archives/2888)

## 設定
以下を `.emacs` 等に追記。

```elisp
;; rainbow-delimiters を使うための設定
(require 'rainbow-delimiters)
(add-hook 'prog-mode-hook 'rainbow-delimiters-mode)

;; 括弧の色を強調する設定
(require 'cl-lib)
(require 'color)
(defun rainbow-delimiters-using-stronger-colors ()
  (interactive)
  (cl-loop
   for index from 1 to rainbow-delimiters-max-face-count
   do
   (let ((face (intern (format "rainbow-delimiters-depth-%d-face" index))))
    (cl-callf color-saturate-name (face-foreground face) 30))))
(add-hook 'emacs-startup-hook 'rainbow-delimiters-using-stronger-colors)
```

どうも色設定を行うタイミングがよろしくないようだったので、 emacs が一通り起動したあとに色の強調処理を行うようにしました。

## 結果
解決！

![2.png](https://qiita-image-store.s3.amazonaws.com/0/66421/22ea1781-84d0-c6b9-2b3c-bd1705579178.png)

## 不具合の出た環境
参考までに。

* Cent OS 6.4（Vagrant で起動した仮想マシン）
* Teraterm 4.83 でログイン
* emacs 24.3.1
puttyのコマンド画面でコピーする方法

普通のエンジニアなら知ってると思うけど、、、
俺と同じく黒いコマンド画面が苦手な人もいると思うので、何かの手助けになれば！

![コマンドライン.png](https://qiita-image-store.s3.amazonaws.com/0/70195/39836417-f75c-5d13-0b8b-796a27a377fc.png)
こんな感じでエラーが発生したときに、ネットで検索したいなーってなったとします。

そこでブラウザに戻って一生懸命打つのもいいのですが、黒い画面上でコピーして貼り付けできるんです

その方法とは・・・

なんと・・・


まさかの・・・



コピーしたい部分をマウスでなぞるだけ！！！

右クリックとか、Ctrl+Cとかしなくてい～んです。


つい最近知りました。。。

今までなぞったあとに右クリックしなきゃいけないと思っていたから、
そのままコピーした部分が実行されちゃったりして大変でした。。。
rails4.2でrails sしたら動かなくなった

今まで何も考えずに

```
rails s
```

って書いて動かしてたんだけど、rails4.2にしたら急に動かなくなった・・・
いや、正確には動いてる。
![rails_s.png](https://qiita-image-store.s3.amazonaws.com/0/70195/bdd76fa6-73ed-f530-b91d-62893c828085.png)

ただこんなエラーになっちゃう
![rails_s.png](https://qiita-image-store.s3.amazonaws.com/0/70195/bf75206f-e193-2065-47f2-0c61c6058421.png)
正常に接続できませんでした。。。

意味わかんねーって思ってたけど、何かの違和感

そう、rails s したときに表示されてるURLがlocalhost:3000になってる

これって4.1.6のときは違ったよなと思い確認してみると
![rails_s.png](https://qiita-image-store.s3.amazonaws.com/0/70195/c20da5bd-8467-fe0d-8ce0-f8bf85677448.png)
やっぱり、0.0.0.0:3000だ

ってことで

```
rails s -b 0.0.0.0
```
って書くと、ちゃんと動くようになりました。
MacやWinでLibreOfficeをコマンド一発インストール

## コマンド一発でインストールしたい！
みんな大好きLibreOffice。
新しいバージョンにすぐに飛びつく人柱さんです。
新しいバージョンをインストールするのが非常に面倒です。
ダウンロードしてインストーラーを叩いて…。
本当に面倒くさい。

- apt-get
- yum

のようにコマンド一発でインストールできるものは無いのでしょうか？

一般社員のお仕事PCは基本的にWindows、
ナウでヤングなWeb系プログラマーな皆様はMacOSなんて使っているんじゃないでしょうか？
なので下記の2つのOSでapt-getのようなPackage Mangerを探す旅に出ることにしましょう。

- MacOS
- Windows

## WindowsはChocolatey
Powershell大好き人間です。
like apt-get for windowsと言っているように、
Chocolateyを使えばコマンド一発でLibreOfficeをインストールできます。

動作環境

- WindowsXP/Server 2008
- Powershell v2.0

### Window7/8.1/2008R2/2012の場合
chocolateyをPowershellのPackageManagement Cmdlet経由で使う方が使いやすいです。
下記のを参考にしてください。

[Windows7でもPackageManagement(OneGet)](http://qiita.com/arachan@github/items/399da4a19ac3a20205a7)

### Chocolateyを導入
1. Powershellを管理者権限で立ち上げる
2. 下記のコマンドをコピペして実行

```ps1
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```

これだけです。
後は、LibreOfficeをインストールしてみます。

### LibreOfficeをインストール
1. 管理者権限でPowershellを起動
2. LibreOfficeを探す
下記のようにコマンドを入力してみましょう。
5つも見つかりましたね。

```ps1
PS > choco search libreoffice
Chocolatey v0.9.9.1
hunspell.portable 1.3.2.300
libreoffice 4.4.1
libreoffice-oldstable 4.2.8
libreoffice-help 4.4.0
zotero-standalone 4.0.26.1
5 packages found.
```

次にLibreOfficeをインストールします。

```ps1
PS > choco install libreoffice
```

簡単ですね。

まだきっちり試していませんが、
uninstallもできるようです。

```ps1
PS > choco uninstall libreoffice

```

## MacはHomebrew cask
MacOSXの場合だと、homebrew caskを使います。
homebrewを導入していることが前提です。
homebrewの導入方法は下記サイトを参考にして下さい。
[パッケージ管理システム Homebrew](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc)

動作環境

- MacOSX
- homebrew version 0.9.5 以上


### homebrew caskをインストール

MacのTerminal上で下記のコマンドを実行

```bash
$ brew install caskroom/cask/brew-cask
```

### LibreOfficeをインストール
2. Libreofficeがあるか確認
下記のサイトでlibreofficeを検索してみましょう。
見つかります。
http://caskroom.io/search

```bash
$ brew cask search libreoffice

```

```bash
==> Exact match
libreoffice
```



3. 以前のバージョンのLibreOfficeをアンインストール

ApplicationにあるLibreOfficeをゴミ箱にポイしましょう。
「ありがとう、古いLibreOffice。君のことは忘れないよ。」

3. LibreOfficeをインストール

```bash
$ brew cask install libreoffice
```
簡単ですね。


## 参考文献
Chocolatey
[Windowsでもパッケージ管理！ Chocolateyの紹介](http://iti.hatenablog.jp/entry/2014/11/06/122553)
[Chocolatey](https://chocolatey.org/)

Homebrew
[パッケージ管理システム Homebrew](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc)
[みんなhomebrew-caskって知ってるか？](http://qiita.com/ryurock/items/1432578d364985f6cb06)
draperでdecorates_associationしたmodelは、object無しで呼ぶ

数時間詰まったので、ここで共有します。

#注意点
`decorate_association`か`decorate_accosiations`で`decorate`した`model`は`object.`無しで呼ばないと、`decorater`で定義したmethodを呼べません。

##例

````app/models/inquiry.rb
class Inquiry < ActiveRecord::Base
  has_many :messages, dependent: :destroy
end
````

````app/models/message.rb
class Message < ActiveRecord::Base
  belongs_to :inquiry
end
````

````app/decorator/inquiry_decorator.rb
InquiryDecorator < Draper::Decorator
  delegate_all
  decorate_associations :messages#, with: MesssageDecorator

  def deco_last_message_created_at
    #object.messages.last.deco_created_at # undefined error
    messages.last.deco_created_at # object. が不要
  end
end
````

````app/decorator/message_decorator.rb
MessageDecorator < Draper::Decorator
  delegate_all

  def deco_created_at
    object.created_at.localtime.strftime("%Y/%m/%d %H:%M")
  end
end
````

以上です。
誰かのお役に立てれば幸いです。

#参考
https://github.com/drapergem/draper
http://www.rubydoc.info/github/drapergem/draper/Draper/Decorator
FluentdをDockerで運用する場合はファイルバッファーは永続化しておいた方がいい

FluentdはプロセスにシグナルSIGUSR1を送るとバッファーを強制的にフラッシュしてくれます。
そのため、Fluentdのコンテナを差し替えたい場合に、もしFluentdのファイルバッファを永続化しない運用をしていたとしても、
FluentdにSIGUSR1を送ってフラッシュしてからコンテナを停止し、別コンテナを起動すれば問題ないように思えます。(*1)

しかし、現在のところバグによりtime_slice_waitを指定している場合はSIGUSR1を送ってもフラッシュしないようです。
https://github.com/fluent/fluentd/pull/533

この問題の修正は2015/01/15にマージされており、fluentd 0.10.59から反映されています。
td-agentを使っている場合、まだこのバージョンに対応したパッケージが提供されていないため、

- ファイルバッファをデータボリュームなどに永続化する
- ログの送信元をシャットダウンしたうえで、time_slice_waitに達してフラッシュされるまで待つ

といった運用をしなければなりません。

(*1) コンテナの停止中にログの取得漏れがないようにFluentd自体は冗長化されている前提です。

##追記 2015/03/22
docker cpとdocker execを使うことでホスト-コンテナ間を自由にファイル移動できることを知りました。
Fluentdのバッファーがひとつのディレクトリにまとまっていれば比較的簡単にバッファーファイルを移動できます。
データ用コンテナを使うのが一番よいのでしょうが、ファイルコピーもひとつの方法になります。

###バッファファイルのコンテナからコンテナへの移し方
/var/log/td-agent/buffer にバッファファイルがまとまっているものとします。

コンテナからホストにバッファをコピー

```rb:
docker exec -i <コンテナ名> tar -cv -C /var/log/td-agent buffer > buffer.tar
```

ホストからコンテナにコピー

```bash:
 #tarをコンテナにコピー
docker exec -i <コンテナ名> /bin/bash -c 'cat > /var/log/td-agent/buffer.tar' < buffer.tar
 #コンテナのtarを展開
docker exec -i <コンテナ名> /bin/bash -c 'cd /var/log/td-agent; tar xf buffer.tar'
```
Rails3.2からRails4系に上げる際にin?でハマるよ

ActiveSupportについてるObject#in?メソッド
Object#include?の逆をやってくれる便利なメソッドなんだが, Railsを4にあげて実行するとエラーになるから書き換えなきゃいけない

※Rails4.2に付随するActiveSupportでチェックしている、Rails4.0ではチェックしていない

```rb
#includeの例
[1, 2, 3].include?(2) => true

# Rails3.2まではこちら通る
2.in?(1, 2, 3) => true 

#Rails4以降はこちら, Rails3.2でもこのコードで通る
2.in?([1, 2, 3]) => true 

```


## in?の使用箇所のソースコード
active supportのin?メソッドの引数が、*を使った引数の数を指定しない形から, 配列に変更になった

### 変更前
https://github.com/rails/rails/blob/3-2-stable/activesupport/lib/active_support/core_ext/object/inclusion.rb

```rb
 def in?(*args)
    if args.length > 1
      args.include? self
    else
      another_object = args.first
      if another_object.respond_to? :include?
        another_object.include? self
      else
        raise ArgumentError.new("The single parameter passed to #in? must respond to #include?")
      end
    end
  end

```
### 変更後
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/inclusion.rb

```rb
  def in?(another_object)
    another_object.include?(self)
  rescue NoMethodError
    raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
  end
```
has_oneとhas_manyの違いは多重度だけという思い込み

のせいで、
親モデルと同時に子モデルを`save`する時
子モデルが`invalid`だったら、親モデルも保存しない。

これが`has_one`では素直にできませんでした。

```rb
class Parent < ActiveRecord::Base
  has_one :first_child

  validates :name, presence: true
end

class FirstChild < ActiveRecord::Base
  validates :name, presence: true
end
```

```rb
parent = Parent.new(name: 'Oya')
parent.first_child = FirstChild.new
parent.save
# => true

parent.valid? # => true
parent.persisted? # => true

parent.first_child.valid? # => false
parent.first_child.persisted? # => false
```

`has_many`と同じ挙動を期待していますが、
`FirstChild`が`invalid`なのに、`Parent`が保存されてしまいます。

`Parent`が保存されないようにするには、このようにします。

```rb
class Parent < ActiveRecord::Base
  has_one :first_child, validate: true

  validates :name, presence: true
end

class FirstChild < ActiveRecord::Base
  validates :name, presence: true
end
```

```rb
parent = Parent.new(name: 'Oya')
parent.first_child = FirstChild.new
parent.save
# => false

parent.valid? # => false
parent.persisted? # => false

parent.first_child.valid? # => false
parent.first_child.persisted? # => false
```

`has_one`を宣言する時に、`validate`オプションを`true`にすると
期待通りになります。

ちなみに`has_many`は、このオプションはデフォルトで`true`です。

### 参考
- Ruby on Rails API
 - [has_one](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one)
 - [has_many](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many)
【バッチ】乱数を取得する【備忘録】

乱数を生成するバッチファイル

####ソース

```bat:rand.bat
@echo off

if "%1" == "" (set /a DMINIMUM = 1) else set /a DMINIMUM=%1
if "%2" == "" (set /a DMAXIMUM = 6) else set /a DMAXIMUM=%2
set /a ROLL=(%RANDOM%*(%DMAXIMUM%))/32768+%DMINIMUM%

```

####使用法

```bat:
rem  3 から 5の範囲で乱数を生成する
rand.bat 3 5

rem 1 から 6の範囲で乱数を生成する
rand.bat

rem 値の取り出し
echo %ROLL%

```
a*x + b*y = gcd(a,b) を解く、のヒント

[a*x + b*y = gcd(a,b) を解く](http://qiita.com/kuh96/items/9f0c3562db6d9e6cd410)　のヒント。

例として $28x + 13y = gcd(28,13)$ で考えてみる。

* もちろん他のやり方もあると思う
* 以下では説明上、未知数を $x_{1}, x_{0}$ とする
 
## ヒント１
元の式を「ある規則」で変形していくだけ。何か気づかない？

$28x_{1} + 13x_{0}$
$= ....$
$= ....$

* なおよく覚えていないが、わたしは 5分ほどかかってやっとひらめいた

「ある規則」とは、もちろん「最大公約数」を求たときの有名なアルゴリズム。

* というより、この問題のほうがそのアルゴリズムがよく分かる

## ヒント２
少しやってみよう。

$28x_{1} + 13x_{0}$
$= (2\times13+2)x_{1} + 13x_{0}$
$= 13(2x_{1}+x_{0}) + 2x_{1}$
$= 13x_{2} + 2x_{1}$ 

* ここで　$(2x_{1}+x_{0})=x_{2}$ と置いた　(この関係は忘れてかまわない）
* 不思議なことに（もちろん当たり前なんだけど）、係数が小さくなっちゃた！
* これを続けていくと‥‥

## ヒント３

$28x_{1} + 13x_{0}$
$= 13x_{2} + 2x_{1}$ 
$= 2x_{3} + x_{2}$
$= 1x_{4} + 0x_{3}$
$= gcd(28,13) $ ～　元の式の右辺

右の係数が 0  になったときの左の係数が、元の係数の最大公約数なので、
$gcd(28,13) =1$ が求まったことになる。

* 従って $x_{4}=1$、$x_{3}$ は何でもよいので例えば $x_{3}=0$　とする
* すると3行目 $2x_{3} + x_{2}=1$ から $x_{2}$ が分かり、2行目から $x_{1}$、
  1行目から $x_{0}$ が求まる
* 要するに $gcd$ が求まったら、今度は下から上へバックトラックしていけばよい
* なお　$x_{3}$ の値を変えると別の解が得られる

## プログラム作成

では実際にプログラムを作ってみてください。
以下の３通りでやってみるとよい練習になるかも？

* 表計算　～　Excel, Google spreadsheet など
* 再帰呼び出しを使う ～ 普通に書いて8ステップ、ワンライナーも可能
* 再帰呼び出しを使わない

## 蛇足

これは算数の問題。
$28 \times \bigcirc - 13 \times \bigtriangleup = 1$ なら小学生でも分かる。（3/10 負の数を使わなくても解けるようにマイナスにした）
ガウス少年なら一瞬で解いたであろうが、日本の小・中学生にも解ける子がいるはず。

## 参考

* [Extended Euclidean algorithm](http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm)

* [自家製 JavaScript版](http://hooktail.org/wiki/index.php?plugin=attach&refer=kuhcrow%2F%BE%AE%A5%CD%A5%BF%2Fa%2Ax%2Bb%2Ay%3Dg&openfile=bezout.html)

```javascript:bezout.js
// returns [x,y,g]
function bezout(a,b,yn, depth) {
    var res;
    if(b == 0) {
        res = [1, yn, a];
    } else {
        var rres = bezout(b, a%b, yn, depth+1);
        var y = (rres[2] - a * rres[1])/b;
        res = [rres[1], y, rres[2]];
    }
    return res;
}

// 実行は a, b と yn に整数を与えて depth=0 で呼び出すだけ
// yn は複数解のうちから１つだけ選択するため。とりあえず 0 でよい
var res = bezout(a,b,yn, 0);
```
JavaScript Garden

http://bonsaiden.github.io/JavaScript-Garden/
> **JavaScript Garden** is a growing collection of documentation about the most quirky parts of the JavaScript programming language. It gives advice to avoid common mistakes and subtle bugs, as well as performance issues and bad practices, that non-expert JavaScript programmers may encounter on their endeavours into the depths of the language.
>
> JavaScript Garden does **not** aim to teach you JavaScript. Former knowledge of the language is strongly recommended in order to understand the topics covered in this guide. In order to learn the basics of the language, please head over to the excellent guide on the Mozilla Developer Network.

http://bonsaiden.github.io/JavaScript-Garden/ja/
> **JavaScript Garden** はJavaScriptというプログラム言語の一番奇妙な部分についてのドキュメント集です。 このドキュメントはJavaScriptという言語に慣れていないプログラマーがこの言語について深く知ろうとする際に遭遇する、良くある間違い・小さなバグ・パフォーマンスの問題・悪い習慣などを避ける為のアドバイスを与えます。
>
> JavaScript GardenはJavaScriptを教える事を**目的にしていません**。このガイドの項目を理解する為には、この言語に対する前提知識がある事を推奨します。この言語の基礎部分についてはMozilla Developer Networkのガイド がオススメです。
WordPress を OSX で local で動かす


こんな基本的なこといる？けどまぁ一応・・・。

# 1. Download

[http://ja.wordpress.org](http://ja.wordpress.org) へ行き、右側のリンクからダウンロード。今回は4.1.1だった。

# 2. readme

unzip して open readme.html そこに沿って進めるが・・・「wp-admin/install.php をブラウザーで開きます。」って、もちろんファイルシステム上のを開いてもソースコードが表示されるだけなので、apache経由にする

# 3. apache

WPを展開したディレクトリ`/Users/pharaohkj/gitwork/local_wordpress`として

``` shell-session
$ sudo vim /etc/apache2/extra/httpd-vhosts.conf
```

以下を追記。Optionsはお好みで。どうせたぶんAllowOverrideでいろいろやられる。

``` httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/Users/pharaohkj/gitwork/local_wordpress/"
    ServerName localhost.wordpress
    ErrorLog "/private/var/log/apache2/localhost.wordpress.err.log"
    CustomLog "/private/var/log/apache2/localhost.wordpress.access.log" common
</VirtualHost>
<Directory "/Users/pharaohkj/gitwork/local_wordpress">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order deny,allow
    Deny from All
    Allow from localhost 127.0.0.1
</Directory>
```

# 4. hosts

`localhost.wordpress`という名前で自分を引けるようにする。

``` shell-session
$ sudo vim /private/etc/hosts
```

以下を追記

``` hosts
127.0.0.1       localhost.wordpress
```

apacheのconfigを確認して再起動

``` shell-session
$ sudo apachectl configtest
Syntax OK
$ sudo apachectl restart
```

# 5.  開いてみる

``` shell-session
$ open http://localhost.wordpress/wp-admin/setup-config.php
```

ok

![スクリーンショット 2015-03-04 09.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/50220/514970d1-27f8-1ada-7e8d-d0bf93e313c2.png "スクリーンショット 2015-03-04 09.33.28.png")

# 6. DB

どうせlocalなので、ホスト名 `localhost`、テーブル接頭辞 `wp_`、それ以外全部 `wordpress` で。
データベース接続確立エラー、になる。そりゃそーだ。何も用意してねーし。

MySQLでやる。

``` shell-session
$ mysql.server start
Starting MySQL
.. SUCCESS!
```

## DBとユーザ作成

``` shell-session
$ mysql -uroot
```

で入って

``` create.sql
CREATE DATABASE wordpress;
ALTER DATABASE wordpress charset=utf8
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';
```

で、再度実行でOK。

# 7. permission

wp-config.phpがかけねーぞと怒られる。そりゃそうで、apache実行しているのは **_www:_www** であり、今回展開したのは **pharaohkj:staff** だからである。とりあえず手で作る。


``` shell-session
$ vim wp-config.php
```

そしてコピペして保存。次へ。

# 8. site name

サイト名とユーザー名とパスワードを決めよというので、全部 wordpress で、これで完了のようだ。

# 9. 積み残し

うーん。これだと wp のメニューからインストールしたり、コンテンツアップロードしたりするところは、書けないのでエラーになるはずだが？

いったんここまで。あとで追記する。パーミッションについてはこうせよ、というのがあるようだ。

[WordPress手動インストール時のファイルパーミッション変更](http://rensrv.com/free/xdomain/phpmysql-server/wp-hand-install/wordpress-permission/)
[ファイルパーミッションの変更](http://wpdocs.sourceforge.jp/ファイルパーミッションの変更)
[郵便番号検索] FileMakerでJSONデータを取り扱う

---
ファイルメーカーのバージョン16で追加された関数を利用版をアップしました
[[郵便番号API] FileMaker16でJSONデータを取り扱う](http://qiita.com/hajisan/items/40a5ffaf93aca7a95272)

---

郵便番号検索のサンプルですが、JSONデータをファイルメーカーで扱うサンプルにもなっています。

ファイルメーカーでソリューションを作成している際に郵便番号で検索して住所を補完したいケースは多々あると思います。
その時の方法としてWebサービスとして公開されている郵便番号検索を利用するサンプルです。

今回利用させていただいたサイトはこちらです。
[郵便番号-住所検索API](http://zipaddress.net)


GETリクエストで郵便番号を渡すと、JSON形式で住所データを返して来てくれます。

ファイルメーカーでJSONデータを扱うために、海外サイトで公開されている以下のモジュールを利用しました。
[FileMaker用JSONモジュール](http://www.modularfilemaker.org/module/json/)

サンプルファイルをダウンロード後、解凍して実行すると以下のような画面が表示されますので、郵便番号を入力して検索ボタンを押すと住所が補完されます。

![FM_JSON.png](https://qiita-image-store.s3.amazonaws.com/0/68589/035c7876-622d-ccae-7339-9b7b1a097381.png)


郵便番号はハイフン有りでも無しでも検索可能です。
モジュールのカスタム関数とスクリプト以外で作成した処理は検索ボタンを押した時用のスクリプトのみです。

```lang:FileMaker_郵便番号検索スクリプトステップ
1 URL から挿入 [選択; ダイアログなし; 郵便番号検索JSON::gJSON_RES; "http://api.zipaddress.net/?zipcode=" & 郵便番号検索JSON::郵便番号]
2 スクリプト実行 [「JSON-FM ( jsonEncodedText )」; 引数: 郵便番号検索JSON::gJSON_RES]
3 変数を設定 [$json; 値:Get ( スクリプトの結果 )]
4 #検索のエラー判定。エラー時はメッセージ表示
5 If [#Get ( $json; "code" )  ≠ "200"]
6 	フィールド設定 [郵便番号検索JSON::都道府県; ""]
7 	フィールド設定 [郵便番号検索JSON::住所1; ""]
8 	カスタムダイアログを表示 ["郵便番号検索失敗"; "郵便番号の検索に失敗しました。¶[" & #Get($json; "message") & "]"]
9 Else
10	フィールド設定 [郵便番号検索JSON::都道府県; #Get (#Get ( $json; "data" ); "pref")]
11 	フィールド設定 [郵便番号検索JSON::住所1; #Get (#Get ( $json; "data" ); "address")]
12 End If

```
ご興味がありましたら参考にしてみてください。

[サンプルファイル](http://it-komons.jp/filemaker/samples/ZIPSEARCH_JSON.zip)
herokuでPostgre使いバックアップ運用している時、そのdumpファイルを取得する方法

##### 1. ログインする

```
heroku login
```

##### 2. データベースのバックアップ一覧を見る

```
heroku pgbackups --app "アプリ名"
```
で過去のバックアップ一覧が出てくる
(カラム：ID, Backup Time, Status, Size, Database)

##### 3. backuptimeのうち取りたい日にちの欄のIDをmemoして
```
heroku pgbackups:url --app "アプリ名" "上記でmemoしたID"
```
と入力すると

```
"https://***************"
```

とURLが出てくるので、そこにアクセスするとダウンロードされる

#### import
* pgql restoreで入れる（違う名前のデータベース名になっている可能性がある）


#### 
poql tab

http://d.hatena.ne.jp/gosshujin/20091215/1260869783
AutoScalingGroup 配下の EC2インスタンスを stop する方法

# AutoScalingGroup 配下の EC2インスタンスを stop する方法

インスタンスのリタイア時に、インスタンスの Stop, Start（Reboot じゃダメ） を求められます。  
AutoScalingGroup 配下のインスタンスを Stop すると Terminate されます。  
Terminate されたくない！そんな時に便利。

```
# AutoScaling の停止
[root@ip-**-**-**-** ~]# aws autoscaling suspend-processes --auto-scaling-group-name <AutoScalingグループ名>

# ここでインスタンスの停止、起動処理
# CLI からでも AMC からでも OK

# インスタンスのステータスを Healthy に変更
[root@ip-**-**-**-** ~]# aws autoscaling set-instance-health --instance-id <インスタンスID> --health-status Healthy

# AutoScaling の開始（再開）
[root@ip-**-**-**-** ~]# aws autoscaling resume-processes --auto-scaling-group-name <AutoScalingグループ名>
```

ELB配下のインスタンスの場合このままじゃ復帰しないので、1回 Remove してから追加すること
ジェネリックの型パラメータの制約


```cs:制約なし
class Test<T> {
	public T obj;
	
	public Test() {
		obj = default(T);
	}
}
```

```cs:基本クラス制約
class Test<T> where T : 基本クラス名 {
}

// 2つの型パラメーターの関係を確立する制約
// VはTと同一かTから継承しなければならない.
class Test<T, V> where V : T {
}
```

```cs:参照型制約
class Test<T> where T : class {
	T obj;
	
	public Test() {
		obj = null;
	}
}
```

```cs:値型制約
class Test<T> where T : struct {
}
```

```cs:インターフェイス制約
class Test<T> where T : インターフェイス名 {
}
```

```cs:コンストラクター制約
class Test<T> where T : new() {
	T obj;
	
	public Test() {
		obj = new T();
	}
}
```

```cs:複数の制約を使用する
// 制約を指定する順番は下記の通りです。
// (基本クラス or class or struct), インターフェイス, new()
class Test<T> where T : MyClass, IMyInterface, new() {
}

// 複数のwhere句がある場合は、スペースで区切ります。
class Test2<T, V> where T : class where V : struct {
}
```
gsonのnextName(), !!!コピーミスだ!!!

## 背景
* Androidアプリを開発していて、サーバーとhttpで通信するために、gsonで、json文字列を分析する
* 7年間に、rubyで開発しているけど、去年6月から、Androidアプリ開発が始まった
* gsonの初心者

## こんなミス!!!

```java
public String read(JsonReader reader) throws IOException {
    String result;

    JsonToken token = reader.peek();
    while( !reader.peek().equals(JsonToken.END_OBJECT)) {
        if (reader.peek().equals(JsonToken.NAME)) {
            if (reader.nextName().equals("a")) {
                result = reader.nextString();
            } esle if (reader.nextName().equals("b")) {
                result = reader.nextString();
            } else {
                result = "none";
            }
        }
    }

    return result;
}
```

[com.google.gson.stream.JsonReaderの例を参照して、正解：](http://google-gson.googlecode.com/svn-history/trunk/gson/docs/javadocs/com/google/gson/stream/JsonReader.html)

```java
public String read(JsonReader reader) throws IOException {
    String result;

    JsonToken token = reader.peek();
    while( !reader.peek().equals(JsonToken.END_OBJECT)) {
        if (reader.peek().equals(JsonToken.NAME)) {
            String name = reader.nextName();
            if (name.equals("a")) {
                result = reader.nextString();
            } esle if (name.equals("b")) {
                result = reader.nextString();
            } else {
                result = "none";
            }
        }
    }

    return result;
}
```

## 何で、こんなミスが発生したか？
* コピーミスだ
* reader.nextName().equals("a")をコピーして、aをbに変更する
* しかし、reader.nextName()で、次のnameを呼んだ

## 教訓
* コピーで、コード実装が便利けど、効率は高くないかな
 * ミスが発生したら、出力されたエラーより、調査時間がたくさんかかった
* テスト重要
 * 以上のコードは、テストしなければ、ミスを発見できない
Github への接続アカウントを変更する方法

# Github への接続アカウントを変更する方法

## 何がしたい？

(Github へ)  
`hoge`アカウントで接続していたものを  
`fuga`アカウントからの接続に変更したい。

## 実食

### Github での作業

これがおそらく1番楽な方法。  
前提条件として、Github に登録している公開鍵（*.pub）の内容がわかっていること。

1. `hoge`アカウントで Github にログイン
2. 右上の歯車アイコン＞SSH keys
3. `hoge`アカウントで接続する際に使用しているSSH keyを削除（Delete）  
![SSH Keys.png](https://qiita-image-store.s3.amazonaws.com/0/18487/9bec4c77-fdfb-209f-d437-01116a34b711.png)
4. `fuga`アカウントでログインし、3で削除したSSH Keyを登録（Add SSH key）  
![SSH Keys_1.png](https://qiita-image-store.s3.amazonaws.com/0/18487/917ec8d4-36c5-7990-645a-cc03e41d67a4.png)  
Title は Github で管理するときわかりやすいものに  
Key は公開鍵（*.pub）を

### 接続するサーバでの作業

ユーザ情報を変更する。

```
localhost@root:~ $ git config --global user.name fuga
localhost@root:~ $ git config --global user.email fuga@domain.com
```

サーバ全体じゃなくて、サーバ内の特定のリポジトリ下で変更したい場合は、  
--global を --local に

## おまけ

公開鍵をわすちゃったー(･ω<)ﾃﾍﾍﾟﾛって人は、

```
localhost@root:~ $ ssh-keygen -t rsa -N ""                                                         
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/fuga
```

↑のコマンドとかで鍵作って新規に登録して下さい。  
`/root/.ssh/id_rsa`を変更しないとユーザのデフォルトの鍵が書き換わっちゃうので注意。
コードのハイライト表示 JS ライブラリ ３種

#はじめに

ウェブページでソースプログラムを紹介したりするときよく使われるのが、「コード・ハイライト表示用 JavaScript ライブラリ」です。これらの中でもポピュラーな３種について比較してみました。

#google-code-prettify

ダウンロード先

[google-code-prettify](https://github.com/google/code-prettify)

*    設置は比較的簡単。
*    対象言語は自動判別。
*    ハイライト表示の正確度は HTML や JavaScript ではかなり正確だが、マイナー言語ではあまりよくない。
*    スタイル(テーマ)はそれほど多くない。

![google-code-prettify.png](https://qiita-image-store.s3.amazonaws.com/0/62802/e8adb5fb-b1b6-1bfa-38fe-c187c4a5b741.png)


[詳しくはこちら](https://qiita.com/tadnakam/items/229807a57ee69d89ff24)

#syntaxhighlighter

ダウンロード先

[syntaxhighlighter](https://github.com/syntaxhighlighter/syntaxhighlighter)

*    設置は google-code-prettify や highlight よりやや面倒。
*    バージョン 4 になってからは特に面倒 (node.js が必要だとか)
*    対象言語は設置のときに手動で指定。
*    そのため、ハイライト表示の正確度は比較的高い。
*    スタイル(テーマ)はそれほど多くない。
*    対象言語の数もあまり多くない。

![syntaxhighlighter.png](https://qiita-image-store.s3.amazonaws.com/0/62802/6a85b312-69b2-2ac3-88cd-f52d1fd22422.png)



#highlight.js

ダウンロード先

[highlight.js](https://highlightjs.org/)

*    設置は比較的簡単。
*    対象言語は自動判別 (code タグの class 属性で言語の指定可能)。
*    正確さはまあまあ。
*    速度は速い。
*    対象言語やスタイルが豊富。176 languages and 79 styles が謳い文句 (Nov.2017)。

![highlight.js.png](https://qiita-image-store.s3.amazonaws.com/0/62802/9379d22f-eda5-68c7-631a-6ded8f13eded.png)

[さらに詳しく・・](https://qiita.com/tadnakam/items/99088d78512a20e75ff3)


#感想

見栄えや機能は syntaxhighlighter が一番ですが、version 4 は設置が面倒なので簡単な version 3 を使ったほうが良いです。syntaxhighlighter は、長いソースや多くのソースがページに含まれる場合は、高機能な分遅くなるかもしれません。google-code-prettify や highlight.js は軽さが売りです。マイナー言語の場合は、highlight.js が対象言語が 多いのでベストかもしれません。
UniRxを用いて作成したゲームのソース公開しました

[Unity Chan's Road](https://github.com/yaegaki/Unity-Chan-s-Road)
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/42193/23cf7847-3312-6670-8912-7d5548fd9d64.png)

UniRxを使用していろいろしているので参考になる部分があると思います。
ライセンスは[ユニティちゃんライセンス](http://unity-chan.com/contents/license_jp/)です。
UnityChan2Dのアセット内のデモをベースに作成しています。
UniRxを主に使用した部分は[Drag.cs](https://github.com/yaegaki/Unity-Chan-s-Road/blob/master/Assets/Scripts/Drag.cs)で、マウスとタッチのドラッグ処理を行う部分です。