OmniAICreator/Qiita-1.07M huggingface dataset:
FizBuz OOP way

Sandi Metzのレクチャーを参照しながらFizBuz


```ruby:
# 3 - fiz, 5 - buz, 15 - fizbuz
# 2 - Hadoken, 7 - sonicboom, 14 - kaioh-ken.....
# you can add&delete whatever any kind of things message, methods, class....
 
require 'pry'
 
class DoFizBuz
 
  attr_reader :int
  attr_accessor :divisible_by_which
 
  DEVIDER = [3, 5, 15, 2, 7, 14, 100, 28].sort.reverse
 
  def initialize(int)
    @int = int
    @divisible_num = divisible_num
  end
  
  def divisible_num
    DEVIDER.find{|num| int%num == 0}
  end
 
  def factory
    if divisible_num == nil 
      p int
    else
      Object.const_get("Message#{divisible_num}").new.message
    end
  end
 
end
 
class Message3
  def message
   p "Fiz"
  end
end
 
class Message5
  def message
    p "Buz"
  end
end
 
class Message15
  def message
   p "FizBuz"
  end
end
 
class Message2
  def message
   p "Ha doh ken"
  end
end
 
class Message7
  def message
   p "Show Ryu Ken"
  end
end
 
class Message14
  def message
   p "Shin-ku Ha doh ken!!"
  end
end
 
class Message28
  def message
  p "Time is - #{Time.now} - now "
  end
end
 
 
class Message100
  def message
   p "Kah- Mae- Ha- Mae- Ha---!!!!"
  end
end
 
 
(1..100).to_a.each{|num| DoFizBuz.new(num).factory}
 ```
ProductFlavorを使って環境ごとに変数を切り替えてapkを生成する

AndroidアプリでサーバーサイドAPIとの通信を実装する場合、通信するサーバーサイドのエンドポイントをdevelopment/productionと切り替えることがあるかと思います。
今までは定数ファイルとかにフラグを作成して、ハードコードで切り替えていたのですが、最近gradleのproductFlavorsを使えば、うまく切り替えることができることを知ったので備忘録です。

## 設定方法

以下のように、build.gradleにproductFlavorsを追記します。

```build.gradle

android {

    // ~~~

    buildTypes {
        release {
            // proguard設定
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            zipAlignEnabled true
        }
        debug {}

    productFlavors {
        development {
            setApplicationId("my.app.dev")
            manifestPlaceholders = [appName:"開発MyApp"]
            buildConfigField "boolean", "DEVELOPMENT_MODE", "true"
        }
        preproduction {
            setApplicationId("my.app.pre")
            manifestPlaceholders = [appName:"プレMyApp"]
            buildConfigField "boolean", "DEVELOPMENT_MODE", "true"
        }
        production {
            setApplicationId("my.app")
            manifestPlaceholders = [appName:"MyApp"]
            buildConfigField "boolean", "DEVELOPMENT_MODE", "false"
        }
    }
}

```
ビルド時にBuildConfig.javaが自動生成されるので、上記の**buildConfigField**で設定した定数をアプリから呼び出せるようになります。
呼び出し方は下記のような感じ。

```java

if (BuildConfig.DEVELOPMENT_MODE) {
    return "https://development-api.example.com/";
}

return "https://production-api.example.com/";
```


## コマンドラインから各ProductFlavorを使用してのビルド方法

ProductFlavorのキーとBuildTypeを組み合わせた文字列をgradlewに渡してあげると、ビルドが始まりapkファイルを生成することができます。

#### コマンド例

```bash:BuildTypeがdebug、ProductFlavorがdevelopmentの場合
./gradlew assembleDevelopmentDebug
```

```bash:BuildTypeがdebug、ProductFlavorがpreproductionの場合
./gradlew assemblePreproductionDebug
```

※ デフォルトの設定だと、apkファイルは/app/build/outputs/apk/以下に生成される。

上記のようにgradlewでビルドするためのコマンドは、以下のコマンドで確認できます。

```bash
./gradlew tasks
```
Chromeでmailto:クリックをGmailに設定する

#設定方法
Gmailのタブを開いて、
![76d74ae2.png](https://qiita-image-store.s3.amazonaws.com/0/40154/03bf7622-dd73-1d5f-37e6-5fe0b4e8660c.png)

このマークを押して、リンクを許可を押す。
(ScreenHeroのアイコンと思いきや違うので注意)

#設定解除方法

Chrome設定 -> 一番下の詳細設定 -> プライバシーのコンテンツの設定 -> ハンドラ -> ハンドラの管理 -> mailtoの項目で、「このサイトを削除」をクリックする。
iOS開発で繰り返しググっちゃうこと(objective-c編)


iOS開発をしていて、よく忘れて調べることを追加していきます。
## UIパーツ系
### labelなどの角を丸くする
```objectivec:角丸にするコード
// cornerRadiusは数字を大きくするほど角が丸くなる。
[[self.textLabel layer] setCornerRadius:6.0];
[self.textLabel setClipsToBounds:YES];
```
### UIColorに透過率を指定する
```objectivec:UIColorにalphaを指定するコード
UIColor *grayColor = [UIColor lightGrayColor];
_textLabel.backgroundColor = [grayColor colorWithAlphaComponent:0.2];
```

### viewを前背面に移動
```objectivec:UIViewを前背面に移動するコード
[self.view bringSubviewToFront:hogeView];	// hogeView を最前面に移動
[self.view sendSubviewToBack:hogeView]	// hogeView を最背面に移動
```

### UILabelなどのフォントサイズを調整したい
```objectivec:UILabelのフォントサイズ調整
// システムフォントでサイズのみ指定する場合
[label setFont:[UIFont systemFontOfSize:15]];
// システムフォントでサイズと太さを指定する場合
[label setFont:[UIFont systemFontOfSize:15 weight:UIFontWeightBold]];
// フォントファミリーとサイズを指定する場合
[label setFont:[UIFont fontWithName:@"AppleGothic" size:15]];
```

### UIFontのweightの種類
```objectivec:下に行くほど太くなる
UIFontWeightUltraLight
UIFontWeightThin
UIFontWeightLight
UIFontWeightRegular
UIFontWeightMedium
UIFontWeightSemibold
UIFontWeightBold
UIFontWeightHeavy
UIFontWeightBlack
```

### 用語の意味
#### contentOffset
スクロール位置(CGPointで指定)




## デバイスの情報を取得したい
### 画面サイズ
```objectivec:画面サイズ取得
[UIScreen mainScreen].bounds.size.height;
[UIScreen mainScreen].bounds.size.width;
```

### iOSのバージョン
```objectivec:画面サイズ取得
[[[UIDevice currentDevice] systemVersion] floatValue]
```

## その他
### block構文の書き方
メソッドの引数として渡すことが多い気がします。

```objectivec
// 定義
- (void)registerHoge:(NSString *)hoge
		   completion:(void(^)(NSDictionary *result))successBlock;

// 呼び出し
[boke registerHoge:hoge
		 completion:^(NSDictionary *result) {
			 // 処理
		 }
];
```

### Delegateメソッドの書き方
```objectivec:hoge.h
// Delegateメソッドを定義
@protocol HogeDelegate <NSObject>
// ここに@optional/requiredを指定することもできる
- (void)finishedDownload:(NSDictionary *)result;
@end
// delegateプロパティを定義
@property (nonatomic, assign) id<HogeDelegate> delegate;
```
```objectivec:Boke.h/m
@interface Boke:UIViewController<HogeDelegate>
...
Hoge *hoge = [[hoge alloc] init];
hoge.delegate = self;

- (void)finishedDownload:(NSDictionary *)result
{
	// 処理
}
```

### UIScrollViewでキーボードを閉じる方法
iOS7移行であれば、自前で実装しなくてもXibなどからKeyboardオプションで指定できます。 

* UIScrollViewKeyboardDismissModeOnDrag
* UIScrollViewKeyboardDismissModeInteractive
* UIScrollViewKeyboardDismissModeNone

詳しくは[こちら](http://dev.classmethod.jp/references/ios-keyboarddismissmode/)

### tableViewにheaderViewを設定する
```objectivec
tableVlew.tableHeaderView = hogeView;
```

## Xcode関連
### シミュレータのカメラロールにhostのPC上の画像を追加する
1. シミュレータでカメラロールを開く
2. Finderなどからシミュレータへドラッグ&ドロップ

### 他の(古い)iOSバージョンのシミュレータが使いたい
1. Xcode → Preferencesを選択
2. Downloadのタブを開く
3. Componentsの中にある必要なSimulatorをダウンロードする

### 既にArchiveした一覧が見たい
Window → Organizer → Archivesのタブ
SNMP v3の設定方法

暗号化に対応したv3での設定方法です。情報が少なかったのでメモ。

# インストール
```
# yum -y install net-snmp
# yum -y install net-snmp-utils
```

インストール完了したら、一度snmpdを起動・停止します (/net-snmp/snmpd.confが生成される)。

# SNMPの設定
```text:/etc/snmp/snmpd.conf
rwuser user_name
```

初期状態ではいろいろ書いてありますが、実際はこれだけ書いてあればOK。

```text:/var/lib/net-snmp/snmpd.conf 
createUser user_name SHA sha_pass AES aes_pass
```

ファイルの中央辺り (コメントアウトされていない場所の何処か)に書き込む。
ここでsnmpdを再度起動すると、上記のcreateUser文が暗号化されます。

```
# snmpvacm -v 3 -u user_name -l authPriv -a SHA -A sha_pass -x AES -X aes_pass localhost createView all .1 80
View successfully created.

# snmpvacm -v 3 -u user_name -l authPriv -a SHA -A sha_pass -x AES -X aes_pass localhost createAccess access_name 3 3 1 all none none
Access successfully created.

```

上記コマンドを実行することで、SNMPで取得できる情報の範囲などを定義します。

```
# snmpwalk -v 3 -u user_name -l authPriv -a SHA -A sha_pass -x AES -X aes_pass localhost
```
いろいろ流れたらOK。

# 161/udpを開ける
開いてなければあける。162/udpも開けたほうがいいかも ([TCP/IP - SNMP](http://www.infraexpert.com/study/tcpip21.html))。

```text:/etc/sysconfig/iptables
-A INPUT -p udp -m udp --dport 161 -j ACCEPT_COUNTRY
-A INPUT -p udp -m udp --dport 162 -j ACCEPT_COUNTRY

```

# hosts.allowの設定
監視サーバーのIPアドレスを追加。

```text:/etc/hosts.allow
snmpd: xx.xx.xx.xx
```
Twitter streaming APIでサクサク日本語だけ拾う

```streamer.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
import tweepy
import json
import sys
import codecs

consumer_key = ""
consumer_secret = ""
access_token = ""
access_token_secret = ""

class StdOutListener(tweepy.StreamListener):
    def on_data(self, data):
        tweet = json.loads(data)
        U_img = (tweet["user"]["profile_image_url"])
        Created_at = (tweet["created_at"])
        User = (tweet["user"]["screen_name"].encode("utf-8"))
        Name = (tweet["user"]["name"].encode("utf-8"))
        Text = (tweet["text"].encode("utf-8"))

        if tweet["user"]["lang"] == "ja":
            print Text, User, Name, Created_at

        return True

    def on_error(self, status):
        print status


l = StdOutListener()
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = tweepy.Stream(auth, l)
stream.filter(track=['#'])
```

ところがbottleとかに組み込むと動かないんだよねぇ。
いや、動くんだけど表示しない。
fullPage.jsで画面遷移をコントロールするためのメモ

#fullPage.jsとは。
縦長1ページのサイトで、フルスクリーン表示のスライドをスクロールで切り替えるように表示できるjQueryプラグイン。
[公式サンプルサイト](http://www.alvarotrigo.com/fullPage/)
[GitHub](https://github.com/alvarotrigo/fullPage.js/)

スクロールでスライドがいい感じに切り替わるが、画面内の要素（[次のスライドへ]ボタンなど）を使って遷移させたい場面もあるので、その場合のメモ。

#アンカーリンクを使って画面遷移。
アンカーリンクを使って、ページ内遷移っぽい動きをさせる方法。
「戻る」ボタンを押した場合に、画面遷移のヒストリーを追って、1つ前のスライドに戻れる。

* まずはfullPage.jsのオプションを使って、各スライドにアンカーを設定

```sample.html
<script type="text/javascript">
 $(document).ready(function() {
  $('#fullpage').fullpage({
   anchors: ['1stPage', '2ndPage', '3rdPage', 'lastPage'],
  });
 });
</script>
```
→これで、スクロールで遷移した場合も「URL/#2ndPage」のようにページ内遷移する。（スクロールで遷移した場合も、「戻る」ボタンで前のスライドに遷移する。）

* あとは`<a>`タグを使ってアンカーへのリンクを貼れば、画面がスルスルとスクロール遷移。

```sample.html
<a href="#2ndPage">リンク</a>
```

これで問題なさそうだけど、「戻る」ボタンで前のスライドに戻る動きが「ウザい」と感じる場面もある。
特にfullPage.jsを使うような縦長1ページのサイトは、何かのランディングページとして使うことも多く、2〜3ページならまだしも、5ページ以上のページで1ページづつ戻られるとちょっとめんどくさいと思われるかも。。

そういうときには以下の方法。
#アンカーを使わずに画面遷移

まず`anchors: ['1stPage', '2ndPage', '3rdPage', 'lastPage']`のようなアンカー設定は削除。
→この設定が残っていると、スクロールした時点でurlにアンカー名が付与されてしまう。（戻るボタンで戻るとヒストリーを辿ってしまう。）
設定を消すことで、スクロールで遷移した場合もURLは変わらずに遷移する。

続いて、ページ内のリンクボタンとして機能させたい場所にidを付与。

```sample.html
<div id="button">リンク</div>
```

あとはリンクのクリック時に、fullPage.jsのイベントを叩く以下の処理。

```sample.html
<script type="text/javascript">
 $(document).ready(function() {
  $("#button").click(function () {
   $.fn.fullpage.moveTo(2);
  });
 });
</script>
```

`$.fn.fullpage.moveTo(2)`は、2ページ目への遷移を意味する。
スライド内に、横スクロールのサブスライドを入れ込んでいる場合は、`$.fn.fullpage.moveTo(2, 2)`のように指定すると、任意のサブスライドへ遷移させることもできる。
***
以上、fullPage.jsを使った場合の画面遷移のコントロール方法でした。
「画面をスクロールさせる」という動きをユーザーに促すのは意外と大変で、あまりリテラシーが高くないユーザーを対象とするページには、「次のページへ」のボタンがある方が親切。
その時、「戻る」ボタンでどう動いて欲しいかによって使い分けると良さそう。
Homebrew で入れた Jenkins の起動/停止


## launchctl 使う場合

起動

```
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```

停止

```
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```


## launchctl 使わない場合

```
$ jenkins
```

停止は `ctrl` + `c`
【Ruby】自分を呼び出した元のファイルパスを取得する

バックトレースを利用する。

コメントいただきました！

```rb
caller[0][/^([^:]+):\d+:in `[^']*'$/, 1]
```

Helperクラスを作っていて、それを使用したモジュール基準でディレクトリ作ったりしたかったため。

最初書いていたもの。

```rb
caller[0][/^(.+?):\d+?:in.*/, 1]
```

# 参考
* [module function Kernel.#caller](http://docs.ruby-lang.org/ja/1.9.3/method/Kernel/m/caller.html) ← 行数やメソッド名の取得サンプルもあり
* [Rubyでメソッドの呼び出し元を取得する](http://www.xmisao.com/2014/03/29/how-to-get-the-name-of-calling-method-in-ruby.html)
BitBucket の機能が素晴らしい件

Redmineとgitを連携させて案件管理しようと思ってたんですが、
どちらもできる[BitBucket](https://bitbucket.org/) というサービスを発見しました。

> 【特徴】
> ・基本的に無料
> ・git でソース管理
> ・プライベートなリポジトリを作り放題
> ・リポジトリには５人までメンバーをアサインすることが可能
> 　（それ以降は有料のようです）
> ・リポジトリ単位でWikiやissue（課題）の作成が可能

個人でやっていくには十分すぎる機能です。
また、Redmineとの連携もできるようですので、
規模が大きくなってきて工数管理などもしたい場合は
Redmineに紐づけることで利便性の向上も可能でしょう。

基本的にgitなので、管理はSourceTreeで問題ありません。
（もちろんコマンド上での管理も可能です。）

Web上での管理画面も非常に見やすく、便利です。
スマホで専用ブラウザアプリがあったりするので
個人で利用する分には本当に重宝しそうです。



githubだとプライベートリポジトリが有料だし、
かといってサーバ立ててgitサーバ作るのもコストがかかるな…
と思っていた矢先の発見だったので助かりました！
Elasticsearch を Vagrant + CentOS にインストールする

Elasticsearch を CentOS にインストールする方法は、以下のようにいくつかあります。
* 公式サイトで配布されている Zip や Tar を解凍・配置
* 公式サイトで配布されている RPM でインストール
* yum でインストールする（[他記事参照](http://qiita.com/kakipo/items/5ccaab8581a3158dfcff)）

この記事では、最初の「公式サイトで配布されている Zip や Tar を解凍・配置」をやります。

### 環境
* Vagrant 1.7.2
* CentOS 6.5

### インストール手順

まず、Elasticsearch を[公式サイト](https://www.elastic.co/downloads/elasticsearch)からダウンロードし、展開・配置します（ここでは vagrantユーザーのために権限も変更しています）。

```shell-session
root# cd /usr/local/src
root# wget https://download.elastic.co/elasticsearch/elasticsearch
/elasticsearch-1.6.0.tar.gz
root# cd /usr/local
root# tar zxf src/elasticsearch-1.6.0.tar.gz
root# chown -R vagrant elasticsearch-1.6.0
root# ln -s elasticsearch-1.6.0 elasticsearch
```

Elasticsearch のパスを登録します。

```shell-session
vagrant$ vi ~/.zshrc
  PATH=$PATH:/usr/local/elasticsearch/bin
```

シェルの設定ファイルを再度読み込み、elasticsearch を起動します。

```shell-session
vagrant$ source ~/.zshrc
vagrant$ elasticsearch
```

### Kuromojiプラグインを入れる場合
[Github の Kuromoji のリポジトリ](https://github.com/elastic/elasticsearch-analysis-kuromoji)で、インストールした Elastic のバージョンに合う Kuromoji のバージョンを調べてから、以下のようにインストールします。

```shell-session
root# /usr/local/elasticsearch/bin/plugin --install elasticsearch/elasticsearch-analysis-kuromoji/2.6.0
```

### ブラウザから Elasticsearch の状態を確認する

[Github の elasticsearch-head のリポジトリ](https://github.com/mobz/elasticsearch-head)の手順に従ってプラグインをインストールします。

```shell-session
root# /usr/local/elasticsearch/bin/plugin -install mobz/elasticsearch-head
```

その後、`http://localhost:9200/_plugin/head/` を開きます（Elasticsearch を 9200番で動かしている場合）。

### 参考
* [Download Elasticsearch Free • Get Started Now | Elastic](https://www.elastic.co/downloads/elasticsearch)
* [Elasticsearch Reference [1.6] » Getting Started » Installation | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/1.6/_installation.html)
* [CentOS 6.5 に Elasticsearch をインストールする | はったりエンジニアの備忘録](http://blog.manabusakai.com/2014/02/centos-elasticsearch-install/)
* [ElasticSearch を yum でインストールする | Qiita](http://qiita.com/kakipo/items/5ccaab8581a3158dfcff)
都道府県マスターでJpPrefectureを利用したモデルに複数の都道府県コードが含まれてる場合の県名表示をどうするか

## はじめに

都道府県の情報を持ちたい場合に、都道府県のマスターで[JpPrefecture](https://github.com/chocoby/jp_prefecture)のようなgemを使うかと思います。

単純に都道府県のコードが1つだけというモデルの場合には公式のREADMEを読めばすぐにわかると思います。

出発地と到着地みたいな情報を管理する機能を実装する時に都道府県のコードが2つになる場合にどのようにJpPrefectureを利用すればいいのかすぐにわからなかったので自分のメモとして書いておきます

## やり方

公式のREADMEに

> 生成されるメソッド名は method_name というオプションで指定することができます:

という記述があったので、試しに以下のように出発地の都道府県のID（from_prefecture_id）と到着地の都道府県のID（to_prefecture_id）に対してそれぞれmethod_nameを定義します


```rb
# == Schema Information
#
# Table name: tours
#
#  id                 :integer          not null, primary key
#  from_prefecture_id :integer
#  to_prefecture_id   :integer
#  created_at         :datetime         not null
#  updated_at         :datetime         not null
#

class Tour < ActiveRecord::Base

  include JpPrefecture
  jp_prefecture :from_prefecture_id, method_name: :from_prefecture
  jp_prefecture :to_prefecture_id, method_name: :to_prefecture

end
```

こうすることで

```shell-session

tour = Tour.first
tour.from_prefecture
=> #<JpPrefecture::Prefecture:0x007fc444e86b28
 @area="北海道",
 @code=1,
 @name="北海道",
 @name_e="Hokkaido",
 @name_h="ほっかいどう",
 @name_k="ホッカイドウ",
 @zips=[10000..70895, 400000..996509]>
tour.to_prefecture
=> #<JpPrefecture::Prefecture:0x007fc4443a58a8
 @area="東北",
 @code=2,
 @name="青森県",
 @name_e="Aomori",
 @name_h="あおもりけん",
 @name_k="アオモリケン",
 @zips=[185501..185501, 300111..395346]>
```

みたいなことが実現できました。
onlineTool > c# Online Snippet Compiler | C# Pad | .NET Fiddle | paiza.io | ideone

#C# Online Snippet Compiler

C#をブラウザで実行できるサイト
http://www.volatileread.com/UtilityLibrary/SnippetCompiler


以下の特徴があるようだ
- Linqが使える
- 軽い（気がする)
- ~~日本語は文字化けする~~ (2015/08/28) 日本語も正常に表示されるように実装された
- ~~メソッド名入力補完機能はない~~ (2015/08/28) メソッド名入力補完機能が実装された
- Permanent Link出力機能がある。

(added 2016 Aug. 30)
How to use DLLs other than default ones (in Japanese).
http://qiita.com/7of9/items/2a07cd63fa81c25bac07

<hr>
試しに [C# 文字列から制御文字を取り除く](http://qiita.com/issetwo/items/b98fb994258636973452)を実装してみた。

http://volatileread.com/utilitylibrary/snippetcompiler?id=22737

<hr>
# C# Pad

(追記)
@deyu_noteさんに紹介いただいた以下のサイトでは入力補完機能が使える。
http://csharppad.com/

こちらをエディタとして使い、書き上げたコードを C# Online Snippet Compilerにペーストしてから実行しつつ編集を続けるのもいいかもしれない。

<hr>
# .NET Fiddle (オススメ)

(追記 2015/07/19)
algさんに以下を教えていただいた。
https://dotnetfiddle.net/

- Linqが使える
- コード生成時、自動的にRunしてくれる
- メソッド入力補完機能あり
- 日本語が文字化けしない
- Permanent Link出力機能がある (例: https://dotnetfiddle.net/O9xpNQ)

~~しかしながら、以下のIEnumerable<int>あたりで「The type of name 'IEnumerable' could not be found」というエラーがでる。~~
~~https://dotnetfiddle.net/JqcF7G~~

~~同じコードはC# Online Snippet Compilerではエラー無しで実行できる。この違いについてはC#勉強中なのでよく分からない。~~

<hr>
# paiza.io

(追記 2015/08/19)
さらにalgさんに教えていただいた。
https://paiza.io/

- 軽量
- ブログへの張り込み
- フォント選択
- テーマ選択
など

<hr>
# ideone
https://ideone.com/

自分がCやC++でよく使っているideoneでもC#を試せることにさきほど気づいた。

- 軽量
- コードの一般公開が可能 (限定公開設定も可能)
- syntax highlightが可能
- forkができる

ただし、メソッド入力補完機能はない。
FileMaker - ExecuteSQLの結果をVirtual Listとして利用する

以前よりファイルメーカーのテクニックとして、Virtual Listというものがあります。
これは汎用的なテーブルを用意しておき、必要に応じてデータを動的に設定して表示するというものです。

このテクニックはExecuteSQL関数がファイルメーカーに追加されたことで、今まで以上に利用しやすくなったと思います。今回は簡単な例を元にこの実装方法を説明してみます。

#概要
ExecuteSQLの結果リストの形式を以下ようにします。
- レコードの区切りは改行
- 各フィールドの区切りは任意の文字列（今回は"|"）とした結果リストを返す

この結果リストをグローバルフィールドに保存し、Virtual List用のテーブルで各レコードのデータとして分解表示するようにテーブル定義すると完了です。

# Virtual List用のテーブル定義
最初にテーブルを定義しておきます。
Virtualテーブルの項目定義は以下のように定義します。
※()内はサンプルファイルでのフィールド名
1. ExecuteSQL関数の結果を保持するグローバルフィールド(gALLData)
2. レコード番号のフィールド(ID)
3. SQLの結果リストからレコード番号に一致する行データを切り出したデータの保持フィールド(RowData)
3. 2のデータから各項目に分解したデータ用のフィールドを複数個(F1〜F10)
4. 3が数値の場合に利用するフィールドを3と同数(num_F1〜num_F10)

![サンプルファイルでの定義内容](https://qiita-image-store.s3.amazonaws.com/0/68589/692eb6f1-48ad-2e52-ba9d-5e06457fe193.png "VListTable.png")

# Virtual List用レコードの作成
定義したら、必要数分のレコードを生成しておきます。
サンプルでは100レコード用意しました。
各レコードのIDフィールドに連番が正しく設定されている事を確認します。

ここで定義のテストとして、gALLDataフィールドにフィールド区切り文字を使用して作成したデータを入力してみて各レコードのフィールドに正しく表示されるかを確認しておくと良いかもしれません。


# 検索用スクリプト
次にExecuteSQLにて取得する検索用スクリプトを作成します。
サンプルでは、ダミーの顧客テーブルを用意し都道府県で検索しています。
実際に作成する場合はエラー処理などを追加しますが、今回は要点だけを説明するために省略しています。
あと、VirtualListテーブルのレコード数以上の結果を受け取っても無駄なので、必要レコード数分だけ受け取るようにしています。

```FMScript:スクリプト名「顧客情報抽出(都道府県)」
1 If [#Assign ( Get(スクリプト引数) )]
2 	フィールド設定 [VirtualTable::gALLData; 
     Let ( [   ~query	= 
     "SELECT \"名前\", \"都道府県\", 
       \"アドレス\", \"年齢\", \"誕生日\", \"電話番号\"  
       FROM \"@顧客\"  
       WHERE \"都道府県\" = ?  
       FETCH FIRST 100 ROWS ONLY  " ] ;
       ExecuteSQL ( ~query ; "|" ; "" ; $都道府県)  
     )]
3 	レコード/検索条件/ページへ移動 [最初の]
4 End If
```

# 検索用スクリプトの呼び出し用ボタン
最後に都道府県を指定してスクリプトを実行するボタンを作成して完成です。
クリック時の定義を以下のようにします。

![検索の呼び出し](https://qiita-image-store.s3.amazonaws.com/0/68589/46f1c6c7-a4ed-83f9-e7f3-fc545dfcff5e.png "call_seachPref.png")


説明は以上です。
少しでも参考になれば幸いです。

今回のサンプルは以下の場所に置きましたので、詳しくはファイルを参照して下さい。
[サンプルファイル](http://it-komons.jp/filemaker/samples/SQLVList.zip)
VirtualBoxで起動エラーが出たらMacTypeを疑う

ことにした。

```
 has terminated unexpectedly during startup with exit code -1073741819 (0xc0000005).
終了コード : E_FAIL (0x80004005)
コンポーネント: Machine
```

こんな感じのエラー。かなり悩んだが、VirtualBoxをMacTypeから除外すると治るという記事をみつけて解決。
http://kendik.hatenablog.com/entry/2015/04/07/000819

除外する時は”MacType 用户向导”を起動し、画面の右下にあるプロセスマネージャを使うと楽。
除外したいプロセスを右クリックして「このプロセスを除外」を選ぶ。
Githubのissueテンプレートをプレビューしながら作る


ツールを作った
サーバサイドを必要としないのでGithub Pagesで公開しててJavaScriptのみ構成されている。
[Github Pages](http://bonegollira.github.io/issue-template-preview/)
[Github](https://github.com/bonegollira/issue-template-preview)
__Chromeでしか動作みてません__

![bonegollira.github.io issue template preview .png](https://qiita-image-store.s3.amazonaws.com/0/47431/97e3f10c-0e27-e858-fa12-2979bf4baaa6.png "bonegollira.github.io issue template preview .png")

Githubのissueテンプレートというのは
http://qiita.com/yoshimikeisui/items/3e1873e3bf1bbafe8733
で紹介してくださっていて、とても便利だなと。
それでツールを作ってみようというモチベーションです。

#### 使い方
リポジトリの指定は`@repository(リポジトリ名)`と`@user(ユーザ名)`でします。（`@organization(オーガないぜーション)`でもおk）
また、タイトルも`@title(タイトル)`です。
これらを書いた行はissueテンプレートには消します。

```
@repository(issue-template-preview)
@user(bonegolllira)
@title(うほうほ)
// 上3行はテンプレートでは消される
## 不具合報告
バグです
```


## つかってるやつ

- [React](https://facebook.github.io/react/)
- [marked](https://github.com/chjj/marked)
- [github-markdown.css](https://github.com/sindresorhus/github-markdown-css)
- [gulp-gh-pages](https://www.npmjs.com/package/gulp-gh-pages)

だけ。ほぼ[React](https://facebook.github.io/react/)だけで作れる。

Reactで`textarea`のmarkdown入力をキャッチして（リポジトリの指定とかをちょろっと解析し）markedでHTMLへ変換しgithub-markdown.cssでスタイルをつけている。

```app.react.js
  onKeyUp (e) {
    this.setState({markdown: this.parseMarkdown(e.target.value)});
  },

  render () {
    return (
      <div className="app">
        <Bar
          ...
		   />
        <Textarea
		   ...
          onKeyUp={this.onKeyUp} />
        <Preview
          markdown={this.state.markdown} />
```

github-markdown.cssは`markdown-body`をつけた要素をGithubのmarkdown風のスタイルにしてくれる。この要素に`dangerouslySetInnerHTML`でmarkedで作ったHTMLを突っ込んでいる。
（安全な方法ではないと思うのでより良い方法があれば教えて下さい）

```preview.react.js
  innerHTML () {
    return {
      // markedで変換
      __html: marked(this.props.markdown)
    };
  },

  render () { 
    return (
      <section className="Preview">
        <h1 className="Preview--title">Preview</h1>
        <article
          className="Preview--body markdown-body"
          dangerouslySetInnerHTML={this.innerHTML()}>
        </article>
      </section>
    );
  }
```

Github Pagesへのプッシュはgulp-gh-pagesで

```
// buildはjsの圧縮とかして.appへ吐き出す
gulp.task('deploy', ['build'], () => {
  let pkg = require('./package.json');
  let ghPagesConfig = {
    remoteUrl: pkg.repository.url
  };

  return gulp.src('.app/**/*')
    .pipe($.ghPages(ghPagesConfig));
});
```

みたいにしておけば、`.app`（ビルドしたあとは`.app`に吐き出している）毎`gh-pages`ブランチへプッシュしてくれるのでコマンドで`gulp deploy`でおk。

## 以上

メンバーではGithub Pagesのことはギッペって呼んでますが皆さんなんてよでますか？
おわり。
Vectorworks 2013 Viewer > Office 2013インストール後に起動しなくなる

http://www.aanda.co.jp/Support/faq-vwtrouble.html

>Windows7環境にて、Microsoft Office 2013がインストールされた環境で、Vectorworksが起動できなくなる現象が確認されております。
本現象はVectorworks2008以上のバージョンで発生する可能性があります。
詳しくはこちらをご参照ください。

「こちら」のリンク先
http://www.aanda.co.jp/Support/tips/win7_office2013.html

Vectorworksの「互換性モード」を「WindowsXP(ServicePack3)」などに設定すると起動するようになる。

---

Office 2013...
bytea型カラムに入った画像をコマンドラインのみで取り出す

DBに画像を保存したはいいけど表示するコードをまだ書いてない。開発中だからお手軽にちゃんと画像が入っているのか確認したい。表示機能のあるクライアントなど使ったら楽だけど、使えない事情がある／またはめんどい場合。

# Copyとxxdコマンドの合わせ技

```
$ psql -h {HOST} -U {USER} {DB} -c "\COPY (select image from some_image_table where id = 1) TO STDOUT" | xxd -r -p > image.png
```

# 解説

postgresqlのCopyはテーブルの内容をファイルに落とすコマンド。副問い合わせで画像のカラム１個のみにして、１カラムの内容を標準出力に出してます。ファイルは16進数形式のテキストで出力されます。

[COPY](https://www.postgresql.jp/document/7.2/reference/sql-copy.html)

xxdは16進数でファイルをダンプしたり元に戻したりするコマンド。これで元のバイナリに戻してやります。

[xxd - manned.org](http://manned.org/xxd/c27ae9e6)

おわり。
cocoapodsのuse_framework!を使いつつobj-c製ライブラリを使うときにハマったこと

これまでは、`Bridging-Header.h` でimportしてたんですが、開発中のアプリがiOS7のサポートを切るということで、喜び勇んでcocoapodsの`use_frameworks!`を使いswift製のライブラリをインストールしてみました。

すると、これまで使えていたobj-c製ライブラリをうまくimportできなくなってしまいました。

## use_frameworks!を使うとBriding-Headerは使えない
代わりに、swiftのコードからimportします。こっちのほうが普通ですね。

```swift:Hoge.swift
import SDWebImage

class Hoge {
}
```

`#import "SDWebImage/UIImageView+WebCache.h"`みたいにimportしてた場合は、`import SDWebImage.UIImageView_WebCache`となります。

## たまにimportできないライブラリがある
importのところで`could not build objective-c module`というエラーが出る場合があります。

自分はFMDBをimportしようとして↑のエラーが出ました。ちゃんと原因は理解できてないのですが、ぐぐったら [Unable to use FMDB in a Swift framework · Issue #309 · ccgus/fmdb](https://github.com/ccgus/fmdb/issues/309) が出てきて、forkして修正されてるものを使ったら解決しました。

他のライブラリ６個使ってますが、それらは大丈夫でした。
Ansibleを使って管理サーバの状態をサクッと確認してみよう

## はじめに
最近こんなん多いでしょ・・・
![kobito.1437097118.116827.png](https://qiita-image-store.s3.amazonaws.com/2164/60057/eb3842b7-2e77-7e26-007f-8dccbdbd0aaf.png "kobito.1437097118.116827.png")

管理するサーバが複数多いと単純作業だけど面倒ですよね。
これをAnsibleを使って対象のサーバがどんな状態であるか確認し、場合によっては更新までしちゃうことが
コマンド一発で完了します。それが1台でも10台でも100台でも。

## 事前準備
- MacにAnsibleインストール

[参考記事：Ansible を Homebrew で Mac OS X にインストールする手順](http://weblabo.oscasierra.net/ansible-homebrew-install-1/)

## セッティング
作業用ディレクトリ作成し移動します

```
mkdir /usr/local/ansible
cd /usr/local/ansible
```

カレントディレクトリに"hosts"作成

```
vi hosts
```
```
[bastion]
bastion ansible_connection=ssh

[dev]
dev ansible_connection=ssh

[stg]
stg-web-01 ansible_connection=ssh
stg-web-02 ansible_connection=ssh
```

※大事なポイントは~/.ssh/configを参照していること！

```
vi ~/.ssh/config
```
```
Host bastion
 Hostname 192.168.1.100
 IdentityFile ~/.ssh/id_rsa
 User monlab
 TCPKeepAlive yes
 IdentitiesOnly yes
 ServerAliveInterval 60

Host dev
 Hostname 10.0.0.10
 IdentityFile ~/.ssh/id_rsa
 User monlab
 ProxyCommand ssh bastion -W %h:%p
 
Host stg-web-01
 Hostname 10.0.0.20
 IdentityFile ~/.ssh/id_rsa
 User monlab
 ProxyCommand ssh bastion -W %h:%p

Host stg-web-02
 Hostname 10.0.0.30
 IdentityFile ~/.ssh/id_rsa
 User monlab
 ProxyCommand ssh bastion -W %h:%p
```

## まずはpingしてみる
### すべてのサーバに対して実行
```
ansible -i hosts all -m ping
```
### devにのみ実行
```
ansible -i hosts dev -m ping
```

## opensslのバージョンを確認してみる
### すべてのサーバに対して実行
```
ansible -i hosts all -m command -a "yum list openssl"
```
### stgにのみ実行
```
ansible -i hosts stg -m command -a "yum list openssl"
```

## さいごに
とても簡単ですね。もっと色んなパターンを試してみて、まとまったらまたQiitaに書きます。
とりあえずはこんな感じから始めます。

## 参考リンク
[Ansible にて、ssh の接続情報を記述する方法](http://blog.k11i.biz/2014/04/ansible-ssh.html)
Sublime の Lighning 開発環境を構築していみました

## 目的
SublimeにLightning開発環境を構築すること

## 手順
### 前提条件
* Sublime 3がインストールされていること
* ForceCLIがインストールされていること

下記のマニュアルを読むと簡単にインストールできました
https://packagecontrol.io/installation

※ 保存時に「Not available for deploy for this API versio」と表示されるがSalesforceには正常に保存されている
出なくするための対応は時間があるときに調べます

## 感想
以前、Lightning環境を作ったときはInstallPackageからだったような・・
手順としては簡単でした
layout_gravity や gravity を動的に設定する

どっちがどっちかという話。

```java:MyActivity.java
TextView tv = new TextView(this);
tv.setGravity(Gravity.CENTER);      // android:gravity="center" 相当
lp = new LinearLayout.LayoutParams( // 親 View の LayoutParams を指定
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.LEFT;          // android:layout_gravity="left" 相当
tv.setLayoutParams(lp);
```

…のはず。

参考
----
http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html#attr_android:layout_gravity
http://developer.android.com/reference/android/widget/TextView.html#setGravity(int)
「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（C#/LINQ）

[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure](http://qiita.com/esehara@github/items/c57cafa57aa92dc1e3c2)
[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム](http://elephnote.com/blog/archives/936)
[「進捗・どう・です・か」をHaskellで書いてみた](http://qiita.com/lotz/items/b47913cb27052cf9e127)
[golang の進捗どうですか](http://qiita.com/mattn/items/4b4ce89396d660a155a9)
[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（C#で挑戦）](http://qiita.com/moto_pipedo/items/e7f924585c762b0da4a7)

ランダム生成を`.OrderBy(x => Guid.NewGuid())`で手抜きでやってみた。

```csharp:Program.cs
using System;
using System.Linq;

namespace ShinchokuDoudesuka
{
    class Program
    {
        static void Main()
        {
            string[] words = { "進捗", "どう", "です", "か" };
            var count = 0;
            var tmp = "";
            while ((tmp = string.Join("", words.OrderBy(x => Guid.NewGuid())))
                != string.Join("", words))
            {
                Console.Write(tmp + " ");
                count++;
            }

            Console.WriteLine("");
            Console.WriteLine(@"
 ＿人人人人人人人＿
 ＞進捗どうですか＜
 ￣Y^Y^Y^Y^Y^Y^Y￣");
            Console.WriteLine(count + "回で煽られました");
        }
    }
}
```

---

解釈を間違えていたようなので修正

```csharp:Program.cs
using System;
using System.Linq;

namespace ShinchokuDoudesuka
{
    class Program
    {
        static void Main()
        {
            string[] words = { "進捗", "どう", "です", "か" };
            var tmp = "";
            var result = "";
            while (!result.EndsWith(string.Join("", words)))
            {
                Console.Write((tmp = words.OrderBy(x => Guid.NewGuid()).First()));
                result += tmp;
            }

            Console.WriteLine(@"

 ＿人人人人人人人＿
 ＞進捗どうですか＜
 ￣Y^Y^Y^Y^Y^Y^Y￣");
            Console.WriteLine(result.Length + "文字で煽られました");
        }
    }
}
```
NEXT勉強会: React + Flux architecture

## Flux architecture using [Reflux](https://github.com/spoike/refluxjs) library

* React is only the view layer, Flux architecture is used to manage data and actions.
*  "top-to-down" approach: data only changes at the top level


### 1. React "FluxContainer" component

* Component connected to flux stores and actions.
* Listens to the store and the actions and update pass down data store and action using props.
* This is the only component that has a state.

``` lang:javascript
var CybozuBackupFluxContainer = React.createClass({
  componentDidMount: function() {
    //Listen to any change from the store (@trigger() in the store)
    actions.getData();
    this.listenTo(store, this.onChangeStore);

  },
  onChangeStore: function(storeData) {
    //Store has changed => update the view.
    this.setState(storeData);
  },
  render: function() {
    return (
      <CybozuBackup
        storeData={ this.state }
        onToggleBackup={ actions.toggleBackup }
        onChangeGenerationNumber={ actions.changeGenerationNumber }
        onChangeRestoreDate={ actions.changeRestoreDate }
        onSubmitRestore={ actions.submitRestore }
        onStartTour={ actions.startTour }
      />
    );
  }

});
```

### 2. React state-less components

React components without state, only render `props` that come from the parent component.
(they receive everything using props)

```
var CybozuBackup = React.createClass({

  render: function() {
    return (
      <div id="content">

        <Logo />

        <h1>バックアップ / リストア</h1>

        { this.props.storeData && (
          <div>

            <BackupSettings {...this.props} />

            <Restore {...this.props} />

          </div>
        ) }
      </div>
    );
  }

});
```

### 3. Flux actions

First step: define the actions.
2 kind of action: synchronous and asynchronous (ajax)

```
actions = Reflux.createActions
  "getData":
    asyncResult: true

  "toggleBackup": {}
  "changeGenerationNumber": {}
  "showModalBackup": {}
  "submitBackup": {}

  "changeRestoreDate": {}
  "showModalRestore": {}
  "submitRestore": {}

  "startTour": {}
```

Launch an action:

```
actions.toggleBackup(data)
```

Listen to action:

```
actions.getData.listen () ->
  api.actions.request('cybozuBackupGetData', null, this)
```

### 4. Flux stores

Store can listen to action and trigger callbacks.
For example `.onToggleBackup()` method is automatically called when `toggleBackup` action is called.

```
store = Reflux.createStore
  listenables: [actions]

  onToggleBackup: (enabled) ->
    console.log 'toggleBackup action listener', enabled
    @enabled = enabled

    #Reset backup size to its initial value
    if !enabled
      @generationNumber = @initialSettings.generationNumber

    @hasChanged = true
    @trigger @getState()
```
iOS ブラウザバック時にリロードさせる (javascript)


iPhoneだとブラウザバックしても状態が保持されてしまうので、バックされた場合はリロードする下記コードを入れとくといい

```js
window.onpageshow = function(evt) {
    if (evt.persisted) {
      location.reload();
    }
};
```
VLCでネットワークストリームのオープン履歴を消す方法

Windowsの場合（環境は8.1）、以下のファイルの...

%APPDATA%\vlc\vlc-qt-interface.ini
実体は、
C:\Users\xxx\AppData\Roaming\vlc\vlc-qt-interface.ini 

`[OpenDialog]` セクションの `netMRL` の内容を削除すればよい。

VLCが終了した状態で編集しないと、VLC終了時に起動中の内容が書き出されれて上書きされるので注意する。

Google で以下のキーワードで検索した。

`vlc "open network stream" history delete`
Atomで拡張子ごとのハイライトを追加/変更する

※この記事はv1.0.xでの対応を書いたもので現在のatomのバージョンでは対応不要です。

# file-typesをインストールする。
[https://atom.io/packages/file-types](https://atom.io/packages/file-types)

# config.csonに追加
例えばtx拡張子のファイルのハイライトをHTMLにする場合

```
"*":
  "file-types":
    tx: "text.html.basic"
```

※　"*"のスコープの中に書くようする。

リロード後ハイライトが対応されるようになるはず。
OpenCVで乱数生成する (cv::RNG)

#OpenCVで乱数を生成する (cv::RNG)
乱数の生成はstdやboostでも行うことはできるが，OpenCVでも可能．
一様乱数，正規分布の2つであれば，cv::RNGを用いることで簡単に生成ができる．詳しくは[公式ドキュメント](http://docs.opencv.org/modules/core/doc/operations_on_arrays.html)を参照．

```cpp

cv::RNG rng(GetTickCount());//乱数生成器を初期化．引数はSeed(ここでは時刻を与えるGetTickCount()[要windows.h]を用いる)．
for(auto i=0; i<100; i++)
{
    double rand_uni = rng.uniform(double(0), double(1));//値の範囲を指定．
    double rand_gau = rng.gaussian(1.0); //標準偏差を指定．

    std::cout << "Uniform: " << rand_uni << std::endl 
              << "Gaussian: " << rand_gau << std::endl; 
}
```
MySQLなどのSQLが書かれたファイルを編集する

`*.sql`のようなファイル名のファイルを開いたとき、特に設定などしてなければ `SQL[ansi]` モードになる。

現実にはSQLにはOracle, PostgreSQL, SQLite、MySQLなど複数の実装があり、ansiのままではそれぞれ固有のデータ型や句などが適切に色付け表示されない。

そんなときには`M-x sql-set-product`でSQL製品(実装)を指定できる。

デフォルトのSQL製品をMySQLにしたければ、`init.el`に次のように書いておく。

```init.el
(custom-set-variables
 '(sql-product 'mysql))
```

本稿執筆時のsql.el 3.5で指定可能なSQL製品は以下の通り。

 * ansi
 * db2
 * informix
 * ingres
 * interbase
 * linter
 * ms
 * mysql
 * oracle
 * postgres
 * solid
 * sqlite
 * sybase
 * vertica

最新版の状態が知りたいときは https://github.com/emacs-mirror/emacs/blob/master/lisp/progmodes/sql.el などで各自チェックしてくだされ。

## 追記

上記リンクは環境によっては結構重いので、最新のではなく利用中のEmacsに付属する`sql.el`で良ければ`M-x find-variable sql-product-alist`で探すと良いですよ。

## 追記その2

余分なコメントを含めることに支障がなければ、ファイル末尾に次のようなコメントを書くことでEmacsにSQL製品を指示することもできます。

```sql
-- Local Variables:
-- sql-product: ms
-- End:
```

この仕組みに関しては [GNU Emacs Manual: Specifying File Variables](http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables.html#Specifying-File-Variables) を参照してください。
WordPress + PHPUnitで$GETの値を使った条件分岐のテスト


簡単だと思ってたらすごくはまってしまった。。。

WordPressで独自のRSSフィードを生成する必要があって、クライアントの要望で以下のようにデフォルトのフィードのURLに`type`というパラメータを渡してそれに基づいてカスタムフィードを発火させる必要があった。

```
http://example.com/feed/?type=hoge
```


こんな場合、以下のような感じでいろいろなフックで条件分岐を入れるわけですが、`phpunit`と叩いても期待通りに発火してくれない。。。

```
add_filter( 'the_excerpt_rss', function( $excerpt ){
	if ( is_feed() && isset( $_GET['type'] ) && 'hoge' === $_GET['type'] ) {
		return do_something();
	} else {
		return $excerpt;
	}
} );
```

こんな時は、テスト側で以下のように`set_query_var()`を使えばオッケー。


```
class YahooFeed_Test extends WP_UnitTestCase
{
    /**
     * @test
     */
    public function is_custom_feed()
    {
        $this->go_to( '/feed/' );
        set_query_var( 'type', 'hoge' );
        $this->assertTrue( do_something_else() );
    }
}
```

さらにプラグイン側は`$_GET`を直接使わずに以下のように`get_query_var()`を使う。

```
add_filter( 'query_vars', function( $vars ){
	$vars[] = 'type';
	return $vars;
} );

add_filter( 'the_excerpt_rss', function( $excerpt ){
	if ( is_feed() && get_query_var( 'type' ) ) {
		return do_something();
	} else {
		return $excerpt;
	}
} );
```
悪いステータスカラムを作ってしまわないために気をつけたいこと

Webアプリの開発では、あるテーブルにステータスカラムを持たせるということはよくあります。
ここでは、実際に業務で遭遇した悪いステータスカラム設計を教材として、正しいステータスカラムの設計とは何かを考えていきたいと思います。 

## ステータスを区別しなければいけない理由

ステータスとは文字通り、何らかのリソースが持つ状態のことです。

開発では、リソース(ユーザーやサブスクリプションなど)のある状態に、名前をつけたり値を割り振ったりします。
例えば、扱うオブジェクトが記事であれば、「公開中」や「下書き」といったステータスで分けたりします。

ステータスをそのように定義しなければならない理由は、**当該ステータスにおいてのみ実行させたい処理、もしくは実行させたくない処理があるため**です。

ステータスを定義するときにはこの点に注意しないと、以下のような悪いステータス設計ができあがってしまうことがあります。

## アンチパターンその1. ステータスを抽出する粒度がおかしい

仮にYahoo!ニュースのようなニュースを配信するメディアがあったとします。
このメディアでは、記者が書いた記事を運営事務局が検閲し、内容に問題がなければ掲載を開始するという業務フローになっています。 

![bad-status-column-activity.jpg](https://qiita-image-store.s3.amazonaws.com/0/6475/ee29f486-7e99-b3d4-8065-01a5858fac21.jpeg)

**当該ステータスにおいてのみ実行させたい処理、もしくは実行させたくない処理があるかどうかを区別する**という注意事項を鑑みると、ここでは下記の2点がその実行させたい処理・させたくない処理に該当します。

* 記事の検閲を行うため、記事が作成されたら通知する
* 記事の検閲が終わるまで記事を非公開にする

それでは、もしこのケースで以下のようなデータ設計がされていたらどうでしょうか？ 

![bad-status-column-class.jpg](https://qiita-image-store.s3.amazonaws.com/0/6475/34708a39-ea6b-a910-2138-177bb8ad3aa2.jpeg)

 ※ステータスにフィーチャーするため、ユーザIDなどの外部キーや記事本文など他のカラムについては記載していません。 

まず、edit_statusというカラムについてです。
抽出されているステータスとして「申請中・再申請中」というものがありますが、これらは区別する必要はありません。

なぜなら、「申請中」「再申請中」というステータスはいずれも"記事の検閲を行うため、記事が作成されたら通知する"という処理に必要ですが、それが初回であろうが2回目の申請であろうが事務局が行う検閲という業務フローには影響がありません。
したがって、「申請中」という一つの括りにしてしまったほうがいいです。

ステータスは抽出しようと思えば、いくらでも作れてしまいます。
例えば、人間のステータスに変えて考えてみると「新婚・風邪・食あたり・食事中・休憩中」などなど。

こうなってしまうと際限がなくなってしまいますので、粒度が細かいものはまとめなければなりません。
例えば勤怠管理のシステムにおいて欠勤理由などを保存する場合「風邪・食あたり」では細かすぎます。「体調不良」というより大きな粒度にまとめてしまうといいでしょう。
また、「新婚」というステータスは現実世界では考慮すべき事柄かもしれませんが、勤怠システムで「新婚の場合は特別休暇を付与する」などといった業務要件がない場合は、実装上定義する実益はありません。

このように特定の処理と紐付かないステータスがあると、混乱を招くことになります。
実装上利用しないステータスは無駄なのでどんどん省きましょう。

## アンチパターンその2. ステータスカラムが重複している

その1はステータスの値の重複でしたが、次はもっと悪い複数のステータスカラムを跨いでステータスが重複しているケースです。

上記データ設計にはもう1点悪い箇所があります。それはステータスを保存するカラムが2つあることです。

まずこの実装でステータスを定義する目的は 「記事の検閲を行うため、記事が作成されたら通知する」処理と、「 記事の検閲が終わるまで記事を非公開にする」処理を特定のステータスで行いたいからでした。

2つに分けられたカラムにおいてそれぞれ定義されたステータスを比較したときに、これらを制御し得る値が完全に重複してしまっています。
表にしてみると一目瞭然です。 

![スクリーンショット 2015-07-16 18.08.12.png](https://qiita-image-store.s3.amazonaws.com/0/6475/e55ffd46-ed34-c679-cf77-16afa0feb456.png)

具体的に重複している箇所は以下の通りです。

*「下書き中」「未公開」はどちらかひとつあれば、記事を編集中であるかどうかは判断可能
*「完了」「公開中」はどちらかひとつあれば、記事を公開できる状態かどうかは判断可能
※「申請中」・「再申請」に関しては前述した通り

このケースだと、statusカラムは1つにまとめちゃって、値は「編集中・申請中・公開中」の3つにしてしまえばずっとシンプルになります。

## あとがき

以上、ステータスカラムの設計についてでした。
angularjsをhtml5モードで動かす場合のnginxの設定

angularjsをhtml5モードで動かす場合のnginxのconf設定

```php:xxx.conf
location / {
  try_files $uri$args $uri$args/ /index.html;
}
```

ただしこの場合、angularjs側でbase設定する必要があるらしい。

雑感
urlをrewriteして#を入れるとか思考錯誤した結果、rewriteする必要すらなかったとか。。

参考サイト
http://andredublin.github.io/blog/2014/08/18/nginx-and-angularjs-url-routing/
https://docs.angularjs.org/guide/$location
http://hail2u.net/blog/webdesign/terror-of-hashbangs.html
http://taka-yag.hatenablog.com/entry/2013/12/28/041727
https://siguniang.wordpress.com/2014/02/16/nginx-url-rewriting-difference-between-break-and-last/
PHPのparse_strで文字列のパラメータを変数に代入しました。

PHPでパラメータが文字列で来た時にどうやって変数に持つのかな−とおもったのですが、`parse_str()`というものがあると教えてもらいました。

以下のように`"hoge=aaaaaaaa&piyo=3333"`という文字列が来たとして

```php:文字列を変数で受け取る
$hoge = "huga=aaaaaaaa&piyo=3333";
parse_str($hoge);

var_dump($huga);
var_dump($piyo);
```

```bash:出力結果
string(8) "aaaaaaaa"
string(4) "3333"
```
変数から出力できましたすごい(☝ ՞ਊ ՞)

# 参考
http://php.net/manual/ja/function.parse-str.php
Unixでディレクトリをブックマークしておく方法（シンボリックリンク＋CDPATH方式）

個人的に使っている方法。

- `~/bm`というディレクトリを作っておく
- ブックマークしたいファイル・ディレクトリへのシンボリックリンクを`~/bm`の下に作る
- `~/.bashrc`に`CDPATH=.:$HOME/bm`と書いておく

するとどこにいても`cd リンク名`でcdできるようになる。

リンク先の実体のファイルサイズ・更新日時を見るには`ls -lL`
文字列の比較

文字列が等しいか調べるときは"=="ではなく"equals"

×　if(a == "日の出") {
○　if(a.equals("日の出")) {


javaでは、条件式の中でString型の変数や文字列を比較するには、特別な書き方をする。

javaのルールでは文字列の比較は「==」ではできない。
文字列の比較を行う差にはa.equals()を使う。


文字列型の変数　.equals(比較相手の文字列)


※==を使ってもコンパイルエラーにはならず。
実行した際にたまに変な動きをする厄介な不具合になる。
ls > sourceCode > 2パス > 出力のためにいったんdisplay関数で情報を集め、その情報を使ってprintfcnで出力を行います。このとき、データはdisplayとprintfcnの2カ所で処理されます。この２回実行される点が重要です。

引用: プログラミングテクニック UNIXコマンドのソースコードにみる実践プログラミング手法 by 多治見寿和さん

> 出力のためにいったんdisplay関数で情報を集め、その情報を使ってprintfcnで出力を行います。このとき、データはdisplayとprintfcnの2カ所で処理されます。この２回実行される点が重要です。これは２パスというテクニックです。

「unix ２パス / unix two path」で検索しざっと見たが、該当の情報は見つからなかった。
ls > sourceCode > sortfcn = revnamecmp ...

引用: プログラミングテクニック UNIXコマンドのソースコードにみる実践プログラミング手法 by 多治見寿和さん

```
/* 並べ替え用の関数を選択 */
if (f_reversesort) {
    if (!f_timesort)
        sortfcn = revnamecmp;
    else if (f_accesstime)
        sortfcn = revacccmp;
    else if (f_statustime)
        sortfcn = revstatcmp;
    else /* 修正時刻を利用 */
        sortfcn = revmodcmp;
} else {
    if (!f_timesort)
        sortfcn = namecmp;
    else if (f_accesstime)
        sortfcn = acccmp;
    else if (f_statustime)
        sortfcn = statcmp;
    else /* 修正時刻を利用 */
        sortfcn = modcmp;
}    
```

sortfcnの「fcn」が何の略なのかわからない。 function?
ls > sourceCode > ls.c > main / transverse / display / mastercmp

引用: プログラミングテクニック UNIXコマンドのソースコードにみる実践プログラミング手法 by 多治見寿和さん

> このファイル（ls.c)では、次のような関数が定義されています。
> main : プログラムのメイン関数
> traverse : 指定されたファイルを拾い上げるための関数
> display : 出力準備のために情報を集める関数
> mastercmp : 出力の順番を制御する関数
ls > sourceCode > /usr/src/bin/lsに格納されている

引用: プログラミングテクニック UNIXコマンドのソースコードにみる実践プログラミング手法 by 多治見寿和さん

> ソースプログラムは5つのソースファイルと2つのヘッダファイルから構成されています。
java > 委譲 > 使いたい実装を持っているクラスのオブジェクトを作って、必要に応じてそのオブジェクトに処理を頼む

引用: コーディングを支える技術 by 西尾泰和さん

```java
public class TestDelegate {
    public static void main(String[] args){
        new UseInheritance().useHello();
        new UseDelegate().useHello();
    }
}

class Hello {
    public void hello(){
        System.out.println("hello!");
    }
}
class UseInheritance extends Hello {
    public void useHello(){
        hello();
    }
}

class UseDelegate {
    Hello h = new Hello();
    public void useHello(){
        h.hello();
    }
}
```
技術英語 > It's not quite that simple. / It's not as simple as that.

@ Q-SQUARED (STAR TREK: THE NEXT GENERATION)
> I'm afraid that it's not quite that simple.

<hr>
出典は忘れたが、以下の言い方をしている例もある。

> It's not as simple as that. (そんなに簡単ではないんだ)

<hr>
関連して思い出したのは

That's not a(the) question easy to answer. (それは簡単に答えられる質問ではない）

2000年くらいにCNN English Expressと言う雑誌のCDで初めて聞いた記憶がある。
進捗どうですかブーム???にShellScriptで挑むフリしてExpectに逃げる

[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure](http://qiita.com/esehara@github/items/c57cafa57aa92dc1e3c2)
[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム](http://elephnote.com/blog/archives/936)
[「進捗・どう・です・か」をHaskellで書いてみた](http://qiita.com/lotz/items/b47913cb27052cf9e127)
[進捗どうですかブーム?にrubyでのっかってみる](http://qiita.com/kataware/items/edc8d0f02a16a21c47dc)
[進捗どうですかブーム??にPythonでのりかかってみる](http://qiita.com/hisatoshi/items/0ccca55168d58a940661)
[1145148101919ブームにShellScriptで普通に挑む](http://qiita.com/844196/items/51b5c2cf5449310909f1) 

え？ちょっとぐらい外部コマンド使っていいでしょ？

```bash:bash用
list=(進捗 どう です か)
while rand=$(od -vAn -N1 -tu1 /dev/urandom | tr -d ' '); do
    echo -n ${list[(($rand % ${#list[*]}))]}
done | expect -c 'expect '$(IFS=;echo "${list[*]}")' {
    set mes $expect_out(buffer)$expect_out(0,string)???
    puts $mes
    puts [string length $mes]文字で煽られました
}'
```

```zsh:zsh用
list=(進捗 どう です か)
while rand=$(od -vAn -N1 -tu1 /dev/urandom | tr -d ' '); do
    echo -n ${list[(($rand % ${#list[*]} + 1))]}
done | expect -c 'expect '$(IFS=;echo "${list[*]}")' {
    set mes $expect_out(buffer)$expect_out(0,string)???
    puts $mes
    puts [string length $mes]文字で煽られました
}'
```

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">進捗どうですかブーム???にShellScriptで挑むフリしてExpectに逃げる by <a href="https://twitter.com/mpyw">@mpyw</a> on <a href="https://twitter.com/Qiita">@Qiita</a> <a href="http://t.co/P5gIL7cm7q">http://t.co/P5gIL7cm7q</a>&#10;結局ターミナル開くの抑えられてないじゃん</p>&mdash; かたわれ (@_ktwr) <a href="https://twitter.com/_ktwr/status/621867638747062272">2015, 7月 17</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

**追記:**

C++とRubyのコードを読んでおきながら動きを全く理解してなかったけどさっき1145148101919とにらめっこしててようやく理解出来た…非常に短いコードであるにも関わらず「人が書いたコードが全く読めない」状況に陥ったので焦った…

せっかくなのでこいつも書きなおしてみる。

```bash:bash用
list=(進捗 どう です か)
while 
    rand=$(($(od -vAn -N1 -tu1 /dev/urandom | tr -d ' ') % ${#list[@]}))
    str=${list[$rand]}
    echo -n $str
    size=$((${size:-0} + ${#str}))
    count=$(($rand > ${last:-${#list[@]}} ? $count + 1 : 0))
    last=$rand
(($count != ${#list[@]} - 1)); do :; done
echo -e "???\n$((${size} + 3))文字で煽られました"
```

```zsh:zsh用
list=(進捗 どう です か)
while 
    rand=$(($(od -vAn -N1 -tu1 /dev/urandom | tr -d ' ') % ${#list[@]}))
    str=${list[$(($rand + 1))]}
    echo -n $str
    size=$((${size:-0} + ${#str}))
    count=$(($rand > ${last:-${#list[@]}} ? $count + 1 : 0))
    last=$rand
(($count != ${#list[@]} - 1)); do :; done
echo -e "???\n$((${size} + 3))文字で煽られました"
```
http.client.Doでretryをするとき

これでいけるかな？と思ってたけど

```go
client := &http.Client{}
req, _ := http.NewRequest("POST", "http://localhost", bytes.NewBuffer([]byte(`test`))) 

resp, err := client.Do(req)
if err != nil {
  resp, err = client.Do(req)
}
```

けど

```go
client := &http.Client{}
req, _ := http.NewRequest("POST", "http://localhost", bytes.NewBuffer([]byte(`test`))) 

resp, err := client.Do(req)
if err != nil {
  req, _ := http.NewRequest("POST", "http://localhost", bytes.NewBuffer([]byte(`test`))) 
  req.Header.Set("Content-Type", "application/json") 
  resp, err = client.Do(req)
}
```

requestを作りなおさないと行けないみたい
もし再利用する方法があれば教えてください
Realm Office Hour 質問録 (7/16(木)14:00 ~ 開催分)


**※これは iOS/Android モバイルデータベース Realm についての記事です。詳しくは以下をご参照ください。** 
Webサイト: [realm.io](https://realm.io/)、Facebookグループ: [Realm Japan User Group](https://www.facebook.com/groups/realmjp/)、質問: [Slack Channel](http://slack.realm.io/) 

--

☆ 7/16(木)14:00~ に行われた Realm オフィスアワーの質問 & 回答一覧です。
この時点での Realm のバージョンは、それぞれ realm-cocoa 0.93.2 と realm-java 0.81.1 です。ご注意ください。

## Realm で RealmDictionary のようなものはあるか?
RealmDictionary のようなデータ構造をサポートするのは、タスクにはあるがまだ存在していない。
似たようなことを Realm でやる場合は、下記のようなものを自作する必要がある。

```swift
class RealmDictionary: Object {
   dynamic var key: String = ""
   dynamic var value: String = ""
}
```

状況として、JSON をRealmに保存したい場合で、ただしキーと値の組み合わせが動的に変わるので、保存するときに Dictionary のような仕組みが欲しいというものだった。中身が可変のものをどうするかは難しいが、キーが可変でも構造が一定であれば上記のような辞書のようなものを作れば、なんとかなる。

## TableView をスクロールするとアプリが落ちる
`'RLMException', reason: 'Index is out of bounds.'` という例外が出ている。

結果の更新と表示しているところの整合性が取れなくなっている可能性がある。つまり、Realm に保存されているモデルの件数と表示されているテーブルビューの件数が合わなくなっている。
おそらく、別のスレッドで更新を行っているところに問題があると思われる。

基本的に、Realm のインスタンスをそれぞれのスレッドで作っていれば、同じファイルにアクセスするのは問題はないが、更新は即座に Realm インスタンスおよび Result にも反映されるため、あるスレッドで更新処理が行われたが、TableView が認識している件数が以前のままである可能性が考えられる。

Realm は、[MVCC(MultiVersion Concurrency Control)](https://ja.wikipedia.org/wiki/MultiVersion_Concurrency_Control) という方法で更新を管理しており、書き込み処理が行われてるときでも読み込み処理が行えるという大きな特徴がある。

よって、トランザクションの最中は古いデータが返り、書き込みが終了したあとに読み込むと新しいデータが読み込まれるがそこで、不整合が生じているかもしれない。

## 暗号化された Realm を Realm Browser で開くことはできるか?
Realm Browser は暗号化された Realm ファイルを開くことはできない。
開発中であれば、リリースビルドだけ暗号化して、デバッグビルドは暗号化しないというのが簡単な解決方法である。暗号化のユースケースとして、実際に暗号化されたユーザーデータは開発元でも見れないのが普通なので、トラブルシューティングが必要になる場合は、そもそも暗号化する範囲を分けるなど、工夫するのがオススメ。
暗号化された Realm を Realm Browser で見るのはサポート予定である。

## 一つの iOS アプリに割り当てられるメモリサイズはどれくらい?
[ここのドキュメント](https://realm.io/jp/docs/objc/latest/#section-29)にある「一つの iOS アプリに割り当てられるメモリサイズ」についてもう少し詳しく教えてほしい。

> Realm ファイルのサイズは、一つの iOS アプリに割り当てられるメモリサイズを超えてはいけません。割り当てられるメモリサイズは、デバイス毎に違い、また、どのくらいメモリのフラグメンテーションが進んでるかにも依存します。(ここについては、Open Radar の rdar://17119975 をご覧ください) これ以上のデータを保存される場合は、Realm ファイルを複数に分けご使用ください。

デバイスや、他のプロセスがどれくらい使ってるのかにもよりますが、Realm ファイルサイズが500〜700MB あたりを超えると、メモリ不足によりファイルのオープンに失敗する可能性が高い。メモリ不足の状態だとファイルのオープンに失敗する。
Realm のファイル読み書きには Memory mapped file を使ってるので、`mmap` に失敗すると使うことができない。OSX だと数GBの Realm ファイルでも難なく扱える。
モデル１つのデータが多い場合は注意で、たとえば、青空文庫のテキストや辞書のテキストを全部扱いたい場合などは、目次と本文を別のファイルに分けるなど工夫が必要である。

## ファイルオープンに失敗したとき、どのようにしてそれを取得できるのか?
メモリ不足により `mmap()` に失敗するとコアのレイヤーから例外が発生する。ただ、キャッシュのデータなどで Realm 使っている場合、それを消してリカバリ可能にできる方法が提供できないか realm-cocoa チームと相談してみる。

## iOS7 + Swift で RealmSwift が使えるか?
RealmSwift のコードには Framework 内で使うことを前提にしたコードがあるので、iOS8以上でしか使えない。具体的には[このあたり](https://github.com/realm/realm-cocoa/blob/af7ca66444d58b4fb928367bda7de5404c6df677/Realm/RLMObjectStore.mm#L203)。
iOS7 の Swift コードからRealm を使いたい場合は、Objective-C 版の Realm と SwiftSupport.swift を使うようにしてください。Objective-C 版の方にも Generics のサポートや Nullable annotation を付いたり改善はされていので、以前よりも Swift から扱いやすくはなっている。Generics のコードはまだマージされていないが、すぐにマージされる予定。(7/16現在)
[Nullablity のコード](https://github.com/realm/realm-cocoa/pull/2128)はマージされているので、次のリリースで入る。

--
  
デベロッパーの Realm オフィスアワーは月に一度、Slack で開催していますが、オフィスアワー関係なくいつでもご質問ください。
Realm Slack Channel → http://slack.realm.io/