OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-Cでのエラー処理

## 目的

どうやればいいか疑問だったため、まとめるのも兼ねて

## 基本

エラーに用いるオブジェクトは２つ

- NSError
- NSException

それぞれ詳しく見てみると

#### NSError

一般的なエラーはこれで扱う
プロパティは3つで

- domain
- code
- userInfo

domain -> com.example.applicationのような識別子
code -> そのままエラーのコード
userInfo -> NSDictionaryを想定していて、NSLocalizedDescriptionKeyにエラーメッセージを設定する

使い方としては`[NSError errorWithDomain:code:userInfo]`を使って生成、
関数の返り値として用いるのが普通

#### NSException

プログラマのせいで起こるエラー
代表的なのは、不正なインデックスでNSArrayにアクセスした時のNSRangeExceptionなど

正常なApplicationの遷移の中で使用することは推奨されておらず、
リリース版では基本的にExceptionが生成されないようにしなければならない

このために`@try @catch @finally`構文も存在する

ライブラリ開発するときには、不正な操作に対して飛ばす感じになる？


## 実際のアプリケーション開発の中でのエラー処理

結論としては、NSErrorの生成、場合分けをラップして使うのがベストな気がするところ

多分こんな感じ

```objc:superClass

// Domain
static const NSString ERROR_DOMAIN = @"com.example.app";

@interface MyError
@property(strong, nonatmic)NSError *error;
-(instancetype)initWithCode:(NSInteger)code reason:(NSString *)reason;
-(void)showAlert;
@end

@implementation MyError

-(instancetype)initWithCode:(NSInteger)code reason:(NSString *)reason {
    self = [super init];
    if(!self) return nil;
    NSDictionary *info = @{@"NSLocalizedDescriptionKey": reason};
    _error = [NSError errorWithDomain:ERROR_DOMAIN code:code userInfo:info];
    return self;
}

@end
```

```objc:childClass
@implementation MyNetworkError

+(instancetype)init {
  self = [super initWithCode:100 reason:@"cant reach to server"];
  if(!self) return nil;
  return self;
};

/** 
 * こんなのあると便利かもしれない 
 * 他にもエラー関連の仕事などはこのクラスに実装してしまう
 **/
-(PMKPromise *)showAlert {
  // メッセージ等適当に設定してアラート出す
  // Promiseで押されたインデックス等の情報を返す
}

// こういうのとかも
-(void)log {
  NSLog(@"%@", _error);
}

@end
```

エラーコードとかベタ書きする実装もなくはないが、
- 際限なし膨らむ （ので見通し悪い
- エラーオブジェクトに仕事させられない
- 判断のifがひたすら増える

等あるのでやはりクラスに局所化しときたいところ
ちなみにこんなやつ

```objc
static const NSString *NETWORK_ERROR_DESCRIPTION = @"cant reach server";
// etc...

static const NSString *NETWORK_ERROR_CODE = 100;
// etc...

// を、1ファイルにずらずら書いて、使う際に毎回
// if(error.code == NETWORK_ERROR_CODE) {
//   //ダイアログ出したり
// } else if (error.code == DB_ERROR_CODE) {
//   //無視したり
// }
// を書かないといけないようなそんなような
```

何かツッコミ等や改善点あれば教えていただけると助かります


## 最後に

書いてて思ったのは、アプリごとにこれいちいち書くのはめんどくさいので、ライブラリ作っちゃえばいいじゃん！
と思ったが、時代はSwiftなので、Swiftのエラーハンドリングも調べなければという感じ
というかすでにあるかも？という点は要調査

## 参考

[Dealing with Errors 公式](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ErrorHandling/ErrorHandling.html)
[NSError Class Reference 公式](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/index.html)
[Objective-C事始め – NSErrorの3つのプロパティ](http://www.inazumatv.com/contents/archives/9078)
mysqldumpでバックアップ＆復元

# バックアップ
SQLベースのバックアップが可能です。存在するデータをすべてSQLにしてテキスト形式に保存できます。

```
mysqldump -u root -x --all-databases > hoge.sql
```
これですべてのデータベースのバックアップが可能です。

特定のデータベースのみのバックアップの場合は、

```
mysqldump -u root データベース名 > hoge.sql
```
とします

# 復元
mysqldumpのすべてのデータベースのバックアップを復元するには

```
mysql -u root -p < hoge.sql
```
のように、mysqlクライアントにファイルの内容をリダイレクトしてあげるだけです。

特定データベースのみの復元は

```
mysql -u root データベース名 < hoge.sql
```
とします
PostgreSqlで全文検索が一発でできるVagrantfileを作ってみた


## 使い方
* リポジトリをクローンしてmecab_posgresqlディレクトリで`vagrant up`するだけ
* リポジトリ: https://github.com/roana0229/vagrant-files.git

## できるようになること
* postgresqlでmecabを使った日本語全文検索

## ソース
* Vagrantfile
* build.sh（このスクリプトで環境を作る）
* config（コマンドラインからファイルの特定の部分を編集してもいいかもしれませんが、面倒だったので最低限必要なファイルを置いてます）

## Vagrantfileの内容
* centos6.5 64bit  
(http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140504.box)
* public_network 192.168.0.11 bridge: en0: Wi-Fi (AirPort)
* private_network 192.168.56.11

 ※必要に応じて編集してください

## build.shの内容をざっくりと
* postgresql9.3,java,rubyをインストール
* config内のファイルを使ってiptableとpostgresqlの設定
* postgresqlのユーザ,DBを作成  
user: testuser, pass:testuser, スーパーユーザー,ロール作成、ログイン,DB作成権限  
db: testdb, オーナー:testuser, 文字コード:UTF8
* 環境変数にpostgresqlを追加
* mecab-0.996, 辞書, textsearch-jaをインストール（ここで結構詰まりました、下に詰まった部分をメモっています）
* 全文検索のテストコマンド実行

## postgresql, mecabの環境構築で詰まったことメモ
* language "C" does not exist

 postgresql9.1?辺りから、pg_languageテーブルにあるCのlannameが C > c に変わっているみたいです。
なので、sql文の該当する部分を全置換してます。
 `sed -i "s/'C'/'c'/g" /usr/local/postgresql-9.3.5/contrib/textsearch_ja-9.0.0/textsearch_ja.sql`


* checking for mecab-config... no

 mecabのインストールが成功して、ssh接続してから同じコマンドを実行すると成功するのですが、build.sh内に記述すると怒られる。。
 なのでオプションで対応しました。
 `--with-mecab-config=/usr/local/bin/mecab-config`

* libmecab.so.2: cannot open shared object file

 共有ライブラリがシステムに認識されていないので、追記してリロード
 `echo '/usr/local/lib' >> /etc/ld.so.conf #追記` 
 `ldconfig #リロード`



##参考にしたページ
* [POSTGRESQL８．３以降で使える全文検索を「日本語」で試す](http://www.piece-lover.com/p/memo/postgres_freewordsearch.jsp)
* [PostgreSQL procedural language “C” not found](http://stackoverflow.com/questions/12514664/postgresql-procedural-language-c-not-found)
* [Mac OS X 10.4 で　Mecabをインストールしようとしているのですが](http://q.hatena.ne.jp/1160809334)
* [MeCabのインストール方法](http://tatsuyaoiw.hatenablog.com/entry/20120414/1334397985)
Homebrew で maven と gradle をインストール

## machine version
```
➜  ~  sw_vers
ProductName:	Mac OS X
ProductVersion:	10.10.1
BuildVersion:	14B25

➜  ~  brew -v
Homebrew 0.9.5
```

## maven
http://maven.apache.org/
  
### brew search
```
➜  ~  brew search maven
maven	     maven-shell
homebrew/versions/maven2		homebrew/versions/maven30		homebrew/versions/maven31		homebrew/completions/maven-completion
```

### brew install
```
➜  ~  brew install homebrew/versions/maven31
Cloning into '/usr/local/Library/Taps/homebrew/homebrew-versions'...
remote: Counting objects: 2770, done.
remote: Total 2770 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (2770/2770), 909.49 KiB | 141.00 KiB/s, done.
Resolving deltas: 100% (1621/1621), done.
Checking connectivity... done.
Tapped 171 formulae
==> Installing maven31 from homebrew/homebrew-versions
==> Downloading http://www.apache.org/dyn/closer.cgi?path=maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz
==> Best Mirror http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz
######################################################################## 100.0%
==> Caveats
WARNING: This older version will conflict with Maven if installed at the
same time.
==> Summary
?  /usr/local/Cellar/maven31/3.1.1: 61 files, 6.3M, built in 13 seconds

➜  ~  mvn -v
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-18 00:22:22+0900)
Maven home: /usr/local/Cellar/maven31/3.1.1/libexec
Java version: 1.8.0_25, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: US-ASCII
OS name: "mac os x", version: "10.10.1", arch: "x86_64", family: "mac"
```

## gradle
https://www.gradle.org/

### brew search
2015-01-24 時点では、最新バーションの 2.2.1 は formula がない。

```
➜  ~  brew search gradle
gradle	   gradle110  gradle112	 gradle16   gradle18   gradle20	  gradle21
```

### brew install
```
➜  ~  brew install gradle21       
==> Installing gradle21 from homebrew/homebrew-versions
==> Downloading http://services.gradle.org/distributions/gradle-2.1-bin.zip
######################################################################## 100.0%
?  /usr/local/Cellar/gradle21/2.1: 149 files, 44M, built in 23 seconds

➜  ~  gradle -v

------------------------------------------------------------
Gradle 2.1
------------------------------------------------------------

Build time:   2014-09-08 10:40:39 UTC
Build number: none
Revision:     e6cf70745ac11fa943e19294d19a2c527a669a53

Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_25 (Oracle Corporation 25.25-b02)
OS:           Mac OS X 10.10.1 x86_64
```
Chromeをvimのように操作

数も増えていくブックマークを毎回探すのも面倒で、コマンドからブラウザブックマークを検索したいと思い、Chromeの[キーボードショートカット](https://support.google.com/chrome/answer/157179?hl=ja)を眺めていたのだけど、それらしいコマンドが見つからず。

何かプラグインないかなと見ていたら、[Hometype](http://tkengo.github.io/hometype/index.html)というのを見つけた。

vimのキーバインドで同様の操作ができ、もちろんブックマーク検索できる。
これだと思って使って見たところ、普段vim使っているのもあって自分にとてもフィットした。

### スクロール操作
| キーバインド  | 効果  |
|---|---|
| j and C-e  | scrollDown  |
| C-d  | scrollDownHalf  |
| C-f | scrollDownPage  |
| k  | scrollUp  |
| C-u  | scrollUpHalf  |
| C-b  | scrollUpPage  |
| gg  | scrollToTop  |
| G  | scrollToBottom  |

### タブ操作
| キーバインド  | 効果  |
|---|---|
| x  | closeTab  |
| C-p  | moveLeftTab  |
| C-n  | moveRightTab  |
| u  | restoreTab  |
| m  | selectTab  |

### 検索
| キーバインド  | 効果  |
|---|---|
| C-n  | selectNextCandidate  |
| C-p  | selectPrevCandidate  |
| U  | searchClosedTabs  |
| b or B  | searchBookmarks  |
| C-h  | searchHistories  |
| o  | searchApplications  |


その他、コマンドのリファレンスは[こちら](http://tkengo.github.io/hometype/reference.html)。

普段vimでコード書いてて、chrome使っている人にはおすすめ。
spinoza所感

[spinoza](http://qiita.com/kenokabe/items/98f4efac4029f0b2b419)がやりたいことは、自分の知っている限りでは[Kitten](http://kittenlang.org/)みたいな、[concatenativeな言語](http://oss.infoscience.co.jp/factor/concatenative.org/wiki/view/Concatenative%20language/index.html)が近いんじゃないかなって思いました。

Kittenについては以前紹介しました。

[Kittenでスタックと戯れる](http://qiita.com/mandel59/items/523988d1b852925c7fe3)

> 【値】はすべてspinozaの中で「配列」として処理されます。
> _[圏論の考え方でつくられた、JavaScriptで動作する純粋関数型プログラミング言語 spinoza (スピノザ)](http://qiita.com/kenokabe/items/98f4efac4029f0b2b419)_

> A stack-based language is one where most operations are done on a stack of values. Functions take their inputs from the stack, do some computation, and return their results on the same stack.
> _[Kitten Programming Language](http://kittenlang.org/)_

Kittenで遊んでみる際、昔紹介した当時とは構文が変わっているということに注意してください。具体的には、中置演算子を使って`1 + 2 * 3`みたいに書けるようになっています。中置演算子を関数として扱いたいときは`1 2 3 (*) (+)`のように、括弧でくくって書いて下さい。
Bginfo の設定項目

## Bginfo とは
Windowsの画面上にホストの情報（ホスト名、IPアドレス、リソース情報など）を載せることができるツール。
複数台のサーバを管理する場合は対象サーバに誤って設定してしまうなどが問題となるが、本ツールにより視覚的に抑止が可能になる。

## 設定項目
初期状態では設定可能な項目が一通り記載されているが、最低限あればよさそうな項目を主観で選んだ。

```
Host Name:	<Host Name>
--------------------------------------------------
User Name:	<User Name>
OS Version:	<OS Version>
Service Pack:	<Service Pack>
Boot Time:	<Boot Time>
--------------------------------------------------
CPU:	<CPU>
Memory:	<Memory>
Volumes:	<Volumes>
Free Space:	<Free Space>
Network Speed:	<Network Speed>
--------------------------------------------------
IP Address:	<IP Address>
Subnet Mask:	<Subnet Mask>
Default Gateway:	<Default Gateway>
DHCP Server:	<DHCP Server>
DNS Server:	<DNS Server>
```

https://technet.microsoft.com/ja-jp/sysinternals/bb897557.aspx
Install ndjbdns on CentOS


# Goal

* DNSソフトとしてdjbdnsが評判いいのでCentOSにインストールする
* 最終的には、DNSネームサーバとDNSキャッシュサーバを使えるようにする
* djbdnsのインストールを簡潔にしたn-djbdnsというプロジェクトがあるので、それを使ってinstallする

# n-djbdnsとdjbdnsの違い

以下のように書いてある. 機能のコアは変わらない.
> * Make djbdns as much concise & independent as possible.
> * Simplify installation & configuration using GNU auto tools.
> * Drop the various *-conf programs.
> * Follow FHS conventions for all kinds of configuration, data and log files.
> * Write good user manuals and documentation.
> * While doing all of this and more, not to loose track of security and apply all the patches available so far.

# Download

```
sudo su -
cd /usr/local/src

## 
## 以下公式サイトからダウンロード先のリンクを取得
## http://pjp.dgplug.org/ndjbdns/index.html
## 
wget "http://pjp.dgplug.org/ndjbdns/ndjbdns-1.06.tar.gz"
tar zxvf ndjbdns-1.06.tar.gz
ls -l ndjbdns-1.06
cd ndjbdns-1.06
```

# Install

```
# sudo su -
# cd /usr/local/src/ndjbdns-1.06

./configure --prefix=/usr/local
  # /usr/local/以下にインストールする
make
make install

which dnscache
which tinydns
  # dnscache, tinydnsコマンドへのパスが通ること確認

## 起動スクリプト設定
## （パッケージをダウンロードした/usr/local/src/ndjbdns-1.06以下からコピーしていることに注意!!）
cp -i ./etc/init.d/dnscache /etc/init.d/ 
chmod u+x /etc/init.d/dnscache
  # -rwxr--r-- 1 root root 2036 Jan 24 10:45 /etc/init.d/dnscache

cp -i ./etc/init.d/tinydns /etc/init.d/ 
chmod u+x /etc/init.d/tinydns
  # -rwxr--r-- 1 root root 2036 Jan 24 10:45 /etc/init.d/tinydns

## 
## install directoryを/usr/localに指定すると、
## /usr/local/etc/ndjbdns以下に設定ファイルが保存される.
## だが、起動スクリプトはこれを反映できてないので、手で修正する.
## 

vi /etc/init.d/dnscache
  # configのパスを以下に変更
  # config=/usr/local/etc/ndjbdns/dnscache.conf
vi /etc/init.d/tinydns
  # configのパスを以下に変更
  # config=/usr/local/etc/ndjbdns/tinydns.conf
```

# djbdns Setting

djbdnsはBINDと違って、DNSネームサーバ（権威サーバ）とキャッシュサーバ（再帰検索サーバ）が別デーモンとして分離していて、ネームサーバ=tinydns、キャッシュサーバ=dnscacheとなっている.
DNSの仕様では権威サーバへの問い合わせも再帰検索もポート53を使うため、別のデーモンを同じポートで稼働させるためにそれぞれ別のIPアドレスをバインドして起動させる必要がある.

installディレクトリを/usr/local/にした場合、tinydnsとdnscacheの設定ファイルはそれぞれ以下のファイルとなる.

* /usr/local/etc/ndjbdns/tinydns.conf
* /usr/local/etc/ndjbdns/dnscache.conf

それぞれ、127.0.0.1、192.168.2.12にセットする場合は、IP=の部分を以下のように変更する.

```/usr/local/etc/ndjbdns/tinydns.conf
IP=127.0.0.1
```

```/usr/local/etc/ndjbdns/dnscache.conf
IP=192.168.2.12
```

# 起動

```
service dnscache start
service tinydns start

## 
## dnscacheはtcp,udp:53で起動するが、tinydnsはudp:53のみで起動する.
## 想定のIPアドレスがバインドされていることを確認
## 
lsof -i:53
  # COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  # tinydns  23402 daemon    4u  IPv4 373980      0t0  UDP localhost:domain
  # dnscache 28041 daemon    3u  IPv4 406795      0t0  UDP 192.168.2.12:domain
  # dnscache 28041 daemon    4u  IPv4 406796      0t0  TCP 192.168.2.12:domain (LISTEN)

netstat -an | grep :53
  # tcp        0      0 192.168.2.12:53             0.0.0.0:*                   LISTEN
  # udp        0      0 192.168.2.12:53             0.0.0.0:*
  # udp        0      0 127.0.0.1:53                0.0.0.0:*
```

# Environment

```
uname -a
  # Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

cat /etc/issue
  # CentOS release 6.5 (Final)
  # Kernel \r on an \m
```
Excel VBAを使ったバブルチャート作成

「すべてExcelでできる！ 経営力・診療力を高めるDPCデータ活用術」を読んでバブルチャートを作成するのに手間がかかるのでマクロを作成した。
方法として下記のデータを作成してから、バブルチャートにしたいデータを選択してからマクロを実行するとバブルチャートが作成されるというもの。

![vba1.png](https://qiita-image-store.s3.amazonaws.com/0/63970/b22ac671-1c56-e37f-95e4-28b1c0ed2230.png)
![vba2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/63970/9c4d1f7b-8876-c0c0-bb27-7ece79017965.jpeg)

```vba
Sub バブルチャート作成()
    Dim chartObj As ChartObject
    Dim ns As Series
    Dim r As String
    Dim s As String
    Dim sr As Range
    Dim wkAdr As String
    Dim nameAdr As String
    Dim xAdr As String
    Dim yAdr As String
    Dim bAdr As String
    Dim leng As Integer
    Dim line As Integer
    Dim cnt As Integer
    Dim i As Integer
    
    r = Selection.Address
    s = ActiveSheet.Name
    Set sr = Worksheets(s).Range(r)
    
    wkAdr = sr.Cells(1, 1).Address
    leng = InStr(2, wkAdr, "$")
    line = Int(Mid(wkAdr, leng + 1))
    nameAdr = "=" & s + "!" + Left(wkAdr, leng)
    wkAdr = sr.Cells(1, 2).Address
    leng = InStr(2, wkAdr, "$")
    xAdr = "=" & s + "!" + Left(wkAdr, leng)
    wkAdr = sr.Cells(1, 3).Address
    leng = InStr(2, wkAdr, "$")
    yAdr = "=" & s + "!" + Left(wkAdr, leng)
    wkAdr = sr.Cells(1, 4).Address
    leng = InStr(2, wkAdr, "$")
    bAdr = "=" & s + "!" + Left(wkAdr, leng)
    
    cnt = sr.Rows.Count
    
    Set chartObj = ActiveSheet.ChartObjects.Add(100, 80, 500, 300)
    chartObj.Chart.ChartType = xlBubble3DEffect
    chartObj.Chart.Legend.Delete
    
    For i = line To line + cnt - 1
        Set ns = chartObj.Chart.SeriesCollection.NewSeries
        ns.ChartType = xlBubble3DEffect
        ns.Name = nameAdr & i
        ns.XValues = xAdr & i
        ns.Values = yAdr & i
        ns.BubbleSizes = bAdr & i
        ns.ApplyDataLabels
        ns.DataLabels.ShowSeriesName = True
        ns.DataLabels.ShowValue = False
    Next
    
End Sub

```
chef の ruby_block 内でリソースを実行する

ruby コードを Compile フェーズではなく、Convergence フェーズで実行したい場合は、ruby_block リソースを利用することができる。cf. [Chefのレシピは上から下に実行されるという誤解](http://www.engineyard.co.jp/blog/2013/chef-recipe-lifecycle/)

さて、ruby_block リソース中で ruby の実行結果を元に他のリソースを実行したい場合にどのように書けば良いか。

# やり方

以下のように書けばできる。

```rb:recipes/default.rb
recipe = self

ruby_block "foo" do
  block do
    contents = File.read("/tmp/foo")
    recipe.log "foo" do
      message contents
    end
  end
end
```

`block` ブロックの中では、`log` などのリソースメソッドが生えていない(スコープが違う)ので、リソースメソッドを持っているレシピオブジェクトを ローカル変数(ここでは recipe)に格納しておいて呼び出している。

# 何に使うか

例えば、

1. remote_directory で指定ディレクトリ以下のサブディレクトリを全て転送
2. remote_directory で転送したサブディレクトリ全てに対して(この情報の取得が Compile フェーズではできない)、/service 以下にシンボリックリンクを貼る

みたいな daemontools でサービス管理している場合にうれしそうな処理ができる。こんな感じ。

```rb:recipes/default.rb
recipe = self

remote_directory "/home/sonots/service" do
  source "service"
  mode "0755"
end

ruby_block "link for daemontools" do
  block do
    dirs = Dir::glob("/home/sonots/service/*")
    dirs.each do |dir|
      recipe.link "/service/#{File.basename(dir)}" do
        to dir
      end
    end
  end
end
```

# 他のやり方

今回のサンプルコードの要件であれば、逆に remote_directory リソースを Compile フェーズで実行させて満たすこともできる。`run_action` を使えば Compile フェーズで実行させることができるので、次のように書くこともできそう。でも、自分はやはり Convergence フェーズで実行させたいなぁ。

```ruby:recipes/default.rb
remote_directory "/home/sonots/service" do
  source "service"
  mode "0755"
end.run_action(:create)

dirs = Dir::glob("/home/sonots/service/*")
dirs.each do |dir|
  link "/service/#{File.basename(dir)}" do
   to dir
  end
end
```

# おわりに

読みにくくなるので良い子は真似しない方がよいと思う。
辞書順でn番目にあたる順列を求める

#やること
配列["A", "B", "C"]が与えられたとする。その全ての順列を辞書順に並べると
["A", "B", "C"]
["A", "C", "B"]
["B", "A", "C"]
["B", "C", "A"]
["C", "A", "B"]
["C", "B", "A"]
となる。["A", "B", "C"]が1番目、["C", "B", "A"]が6番目というように番号をふることにする。
n番目の順列を返す関数を求める。

#考え方
nを階乗進法になおすと簡単に求まることが知られている。省略。後で書く・・・はず

#コード
```jl

function factoradic(num::Int)
    ret_vec = Int[]
    i = 1
    my_div = 1
    while my_div != 0
        my_div, my_rem = divrem(num, i)
        push!(ret_vec, my_rem)
        num = my_div
        i+=1
    end
    ret_vec
end

function my_rearrange{T}(my_vec::Array{T}, idx_vec::Array{Int})
    ret_vec = T[]
    for i=1:length(my_vec)
        push!(ret_vec, splice!(my_vec, idx_vec[i]))
    end
    return ret_vec
end

function nth_perm(my_vec, n)
    a = factoradic(n-1)
    a = [a, zeros(Int, length(my_vec) - length(a))]
    a.+=1
    return my_rearrange(my_vec, reverse(a))
end

nth_perm(["A", "B", "C", "D", "E", "F", "G"], 5040)

```
AWS + GlassFish 4.1を構築メモ

# これは何？
* awsのamazon linuxの上にglassfish4.1を構築した際の手順メモ

# Javaの環境を整える

標準ではOpenJDKなのでOracle公式からJDK1.8.XX（最新）をインストールする。

1. ```sudo rpm -ivh jdk-8u31-linux-x64.rpm```
2. ```sudo alternatives --install /usr/bin/java java /usr/java/default/bin/java 180031``` ※　Javaの実行の優先をOracleJDKに変える
3. ```java -version``` ※ OracleのJDKが入った事を確認

# GlassFish4.1のダウンロード/インストール

1. [glassfishのダウンロード先](https://glassfish.java.net/download.html)を確認。
2. ```cd /opt/```
3. ```sudo wget http://dlc.sun.com.edgesuite.net/glassfish/4.1/release/glassfish-4.1.zip```
4. ```sudo unzip glassfish-4.1.zip```
5. ```sudo useradd -s /usr/sbin/nologin -d /opt/glassfish4 glassfish``` ※ユーザ追加
6. ```sudo chown -R glassfish: /opt/glassfish4```　※ユーザ追加
6. ```cd /opt/glassfish4```
7. ```sudo bin/asadmin start-domain```　
8. ```sudo bin/asadmin change-admin-password```
9. ```sudo bin/asadmin enable-secure-admin```
10. ```sudo bin/asadmin restart-domain```

# その他
* ドメインの状態を確認する。 ```sudo bin/asadmin list-domains```
ダイソーの100円Lightningでは開発中アプリをインストールできない！

充電しかできません。

ituneの同期を始め、開発中アプリをインストールしたりはできません。
XCodeはあなたの端末を認識しません。

よく見るとケーブルには「Charge Only」と書かれているのですが、
じゃあ何が出来ないかといえば考えが及びにくいものです。

ニュースサイトにもよく読むと書かれているのですが
「ダイソーの商品は充電専用（通信には使えない）で・・・」
http://blog.livedoor.jp/itsoku/archives/42608580.html

喜び勇んだ私は見逃してしまいました。
人は記事を読みたいようにしか読まないものですね。

ご注意！
UIView上の任意のコントロールをメソッドで取得

# はじめに
UIViewが保持しているコントロールから任意の物を取り出します。

UITableViewCellに貼り付けたUILabelやUIButtonを取得するのによく使っています。

propertyとして切り出していない画面要素を取得する際に便利です。

# こんなメソッドを作りました

```lang:取得メソッド
+ (UIView *)retrieveControl:(NSArray *)subviews class:(Class)class tag:(int)tag
{
    for (UIView *view in subviews) {

        if (![view isKindOfClass:class]) {
            continue;
        }
        
        if (tag > -1) {
            if (tag != view.tag) {
                continue;
            }
        }
        
        return view;
    }
    
    return nil;
}
```

例えば cell.contentView に UILabel を addsubview し tag = 1 を設定していた場合、以下のようにして使用しコントロールを取得します。

```lang:使用箇所

    UILabel *xxxLbl = (UILabel *)[Util retrieveControl:cell.contentView.subviews class:[UILabel class] tag:1];

    xxxLbl.text = @"xxx";

    ...
```

tagは0だと想定外のコントロールが取得されるので、1以上を設定しておいた方が良いです。

# おわりに
何かの場面で役に立ったら幸いです。
Sublime Text 3の便利なショートカット

基本全てMACでのショートかと

### その行をコメントする

言語などに応じて変わってくくれる。
複数行していると複数行一気にコメントしてくれるので、超便利。

```
Cmd + /
```

### マルチカーソル

以下のいずれかの方法。

好きな範囲を指定する事ができる。

```
Cmd + マウスカーソル
```

単語を選んで次々に選択して行く

```
Cmd + d（選択） / Cmd + u（解除）
```

ファイル内の単語を一気に選択

```
Cmd + Ctrl + g
```

### コマンドパレット

メニューにあるコマンドの一覧を調べたい時に便利

```
Cmd + Shift + p
```

### Goto Anything

フォルダのロードなどをした時に該当のファイルを調べる方法。
開発関連で非常に役に立つ。

呼び出しは以下で実施。

```
Cmd + p
```

例えば、file.phpの18行目を表示したい時は以下を入力

```
file.php:18
```

シンボルを見たい時には以下を入力。
例えば、functionを調べたい時など。

```
function@
```
Exコマンドの出力をバッファに出力する方法

`:`から始まるあれです。`:version`など。

これの出力をバッファに出すにはどうしたらいいのか。

どうやら`read`などを使って簡単にやる方法は無いようです。

調べてみたら、`:redir`というものが。

``` :vim
:redi @a
:version
:redi END
"ap
```

`@a`はレジスタ名なので、もちろん`@"`とすれば無名レジスタにも出力できます。

詳細は`:h :redi`参照。
Redmineのユーザー情報をEXCEL(VBA)で取得してみた


## 前提条件
Redmine側でAPIの利用設定が有効になっている必要があります。[管理]→[設定]→[認証]にある[RESTによるWebサービスを有効にする]のチェックボックスをONにするだけです。

## 認証方法
普通はログイン画面にユーザー名とパスワードを入力して認証を行いますが,APIを利用する場合はAPIアクセスキーを使います。ご自身のAPIアクセスキーは,Redmineの[個人設定]画面で確認することができます。(おそらく[RESTによるWebサービスを有効にする]がONになっていないと表示されません)

## コード
今後メンテするかは微妙ですが,最新版はGitHubに置いておきます。
[slangRedmine.cls](https://github.com/slangsoft/SlangBox "slangRedmine.cls")

## 使い方
1. 適当なExcelファイルに[slangRedmine.cls]をインポートする。
2. 参照設定で[Microsoft XML, v6.0]のチェックボックスをONにする。
3. 標準モジュールを新規追加し,その中に下記の様なサブルーチンを用意する。

下記サンプルでは,Redmineに登録されている全ユーザーのフルネーム(FirstNameとLastNameを連結したもの)をイミディエイトウィンドウに表示します。

~~~VBA
Option Explicit

Public Sub main()

    Dim myRedmine As New slangRedmine
    Dim userData As Object
    Dim numUsers As Integer
    Dim i As Integer
    
    myRedmine.setBaseUri ("https://hoge.com/redmine/") '(1/4)BaseUri設定
    myRedmine.setApiKey ("XXXXXXXXXX")                 '(2/4)APIアクセスキー設定
    myRedmine.setTmpFilePath ("c:\")                   '(3/4)一時ファイル作成用ディレクトリ設定
    Set userData = myRedmine.getUserData()             '(4/4)getUserDataをコール

    numUsers = userData.Length
    For i = 0 To numUsers - 1
        Debug.Print userData.Item(i).childNodes.Item(3).nodeTypedValue & " " _
        & userData.Item(i).childNodes.Item(2).nodeTypedValue
    Next

End Sub
~~~

(1/4) BaseUri設定
`https://hogehoge.com/redmine/`の部分はご自身が利用しているRedmineのURLに変更してください。[MyRedmine](http://hosting.redmine.jp/ "MyRedmine")のサービスを利用している場合だと`https://my.redmine.jp/[AccountName]/`みたいな感じになると思います。

(2/4) APIアクセスキー設定
`XXXXXXXXXX`部分をご自身のAPIアクセスキーに書き換えます。実際は40文字くらいの長さです。

(3/4) 一時ファイル作成用ディレクトリ設定
`c:¥`部分を必要に応じて変更してください。一応,一時ファイルは正常終了後に削除される作りにしています。

(4/4) getUserDataをコール

## 参考サイト
以下のサイト様を参考にさせて頂きました。

* [Rest api - Redmine](http://www.redmine.org/projects/redmine/wiki/Rest_api "Rest api - Redmine")
* [ExcelからRedmineの情報を取得する方法](http://d.hatena.ne.jp/chiheisen/20130421/1366543773 "ExcelからRedmineの情報を取得する方法")

## あとがき
クラスのコードを読んだ人の中には「なんでわざわざXMLファイルを保存してんの？」と思われた方も多いと思います。もちろん理由があって,直接サーバ上のXMLファイルをLoadしようとすると「システムでは利用できないエンコーディングだから解析できませんよ」的なエラーがでます。

色々とネット上を徘徊しながら解決策を模索したのですが,結局このエラーは解決できませんでした。ただ,なぜか一旦ローカルに保存してからLoadすれば正常に処理されます。ということで,わざわざ一旦ローカルにファイルとして保存し,それを読み込んで処理するという作りになっています。いわゆる「その場しのぎ」ってやつですね。(^^;
複数のファイルを連結して読み込むには io.MultiReader() が便利

UNIX コマンドの中には、コマンドライン引数を複数渡すことで、それらのすべてに対してフィルタ処理なりなんなりを行うような仕組みのものが多いと思います。
`cat` も `grep` も `sed` も `awk` もそうですね。
Go でそういったツールを組むときに、複数のファイルを、それと意識せずに読み込めると便利だな、と思って調べててみたところ、標準で用意されていました。

# io.MultiReader()

おなじみの `io` パッケージに `io.MultiReader()` という関数が用意されており、以下のようなインターフェイスになっています。

```go
func MultiReader(readers ...Reader) Reader
```

この関数が返すのは `io.multiReader` 構造体で、これは `io.Reader` インターフェイスを実装しているので、`bufio` を組み合わせて使うこともできます。

# 使ってみる

`cat` のようなコマンドを実装してみます。
まず、第一引数と第二引数のファイルをすべて出力するのであればこんな感じです。
(エラーチェックしてません)

```go
package main

import (
        "io"
        "io/ioutil"
        "os"
)

func main() {
        file1, _ := os.Open(os.Args[1])
        file2, _ := os.Open(os.Args[2])
        reader := io.MultiReader(file1, file2)

        b, _ := ioutil.ReadAll(reader)
        os.Stdout.Write(b)
}
```

ただ、これだと引数を常に 2 つにする必要があるので使いづらいでしょう。
引数に指定したファイルすべてを連結して出力するようにしましょう。

```go
package main

import (
        "io"
        "io/ioutil"
        "os"
)

func main() {
        filenames := os.Args[1:]
        files := make([]io.Reader, len(filenames))

        for i, filename := range filenames {
                files[i], _ = os.Open(filename)
        }

        reader := io.MultiReader(files...)
        b, _ := ioutil.ReadAll(reader)
        os.Stdout.Write(b)
}
```

`*os.File` のスライスを作って、それを `io.MultiReader(files...)` とすることで、スライス中のファイルすべてを連結ファイルのようなものができました。

# その他の ***Reader

`io` パッケージにはこの他にも `io.LimitReader()` や `io.TeeReader()` といった関数があり、いずれも `io.Reader` インターフェイスの構造体を返します。

このように、`io.Reader` をラップして別の `io.Reader` を返すアプローチは、小さなフィルタプログラムを組み合わせて問題を解決する、UNIX 的なやり方だと言えるでしょう。

# 応用編: ARGF

Ruby には、`ARGF` というオブジェクトがあり、これは引数にファイルが指定されていればそれらすべてを連結ファイルのようなもの、そうでなければ標準入力を返すものです。
同じようなものが Go にも欲しかったので `io.MultiReader()` を使って実装してみました。

https://github.com/yuya-takeyama/argf

以下のように使うことができます。

```go
import (
    "flag"
    "github.com/yuya-takeyama/argf"
)

func main() {
    var displayHelp = flag.Bool("h", false, "display help")
    flag.Parse()

    reader, err := argf.From(flag.Args())
}
```

Enjoy it!
VagrantとChefでMongoDB環境構築


# 事前準備

VirtualBoxインストール
https://www.virtualbox.org/wiki/Downloads

Vagrantインストール
https://www.vagrantup.com/downloads.html

Vagrantプラグインのインストール

```sh:
vagrant plugin install omnibus
```

chefのインストール
https://downloads.getchef.com/chef-dk/

kinfe-soloのインストール

```shell:
chef gem install knife-solo
```

# VM作成と起動

```bash:
mkdir centos-mongodb
cd centos-mongodb
vagrant init chef/centos-6.5
vargrant up
```

# Chefリポジトリの作成

```shell:
knife solo init .
```

# コミュニティークックブックを使用してMongoDBをインストールする場合

## レシピのダウンロード

このクックブックを使用する。
https://supermarket.chef.io/cookbooks/mongodb

Berksfileを編集してダウンロードしたいクックブック名を指定した後、`berks vendor`コマンドでダウンロードする。

```rb:Berksfile
source "https://api.berkshelf.com"
cookbook "mongodb"
```

```bash:
berks vendor ./cookbooks
```

## VargrantからChefを呼び出す

Vagrantfileを編集してプロビジョニングでmongodbレシピを呼び出すようにする。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "chef/centos-6.5"

  config.omnibus.chef_version = :latest

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
    chef.add_recipe "mongodb"
  end
end
```

```shell:
vagrant reload --provision
```

# 自分でクックブックを作成してMongoDBをインストールする場合

## レシピのダウンロード

```rb:Berksfile
source "https://api.berkshelf.com"
cookbook "yum"
```

```shell:
berks vendor ./cookbooks
```

## クックブックの作成

`knife cookbook create`コマンドを実行するとクックブックのテンプレートが生成される。

```shell::
knife cookbook create my-cookbook -o ./site-cookbooks
```

[MongoDBのインストール手順](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/#configure-the-package-management-system-yum)を参考にyumリポジトリの追加とパッケージをインストールするレシピを書く。

```rb:./site-cookbooks/my-cookbook/recipes/default.rb
yum_repository "mongodb" do
  url "http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/"
  gpgcheck false
  enabled true
  action :add
end
package "mongodb-org" do
  action :install
end
```

## VargrantからChefを呼び出す

Vagrantfileを編集して先ほど作成したレシピを呼び出すようにする。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "chef/centos-6.5"

  config.omnibus.chef_version = :latest

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
    chef.add_recipe "yum"
    chef.add_recipe "my-cookbook"
  end
end
```

```shell:
vagrant reload --provision
```
Genymotionでro.product.modelを変更する方法

Genymotionのro.product.modelは以下のコードで指定されている。

```
# Load VM name as serial no for Android Device Chooser display
prop_genymotion_vm_name=$(/system/bin/androVM-prop get genymotion_vm_name)
if [ "$prop_genymotion_vm_name" ]; then
  setprop ro.product.model "$prop_genymotion_vm_name"
else
  setprop ro.product.model "Genymotion Virtual Device"
fi
```

よって、virtual box managerにて、VMの名前を変更すればよい。

ro.product.modelはHTTPヘッダのUser Agentでも使用されているので、アプリのHTTPヘッダのモデルを変更したい場合に使える。
【CakePHP】作成者･更新者を自動的に保存する

作成日･更新日と同じように作成者･更新者も自動的に保存されると便利だと思う。
※insert時には作成者･更新者。update時には更新者のみ。

※今までsaveごとに作成者･更新者を設定していたが、beforeSaveにまとめれば楽なのではと考えた。
※他の方はどのようにしているか良かったら教えてほしい。


前提として、Authコンポーネントを使い作成者･更新者にはUserテーブルのidが入る構成になっている。

1.ログインIDを取得して、logined_user_idへ格納。

```php:AppController
public function beforeFilter($options=[]) {
  Configure::write('logged_user_id', $this->Auth->user('id'));
}
```

2.beforeSave()で保存前にinsertなら作成者へ、updateなら更新者へログインIDを設定している。

```
public function beforeSave() {
  if(empty($this->id)){
      $this->data[$this->alias]['created_user'] = Configure::read('logged_user_id');
  }
  $this->data[$this->alias]['modified_user'] = Configure::read('logged_user_id');
  
  return true;
}
```

参考：[beforeSaveを使おう](http://techracho.bpsinc.jp/baba/2010_05_10/1508)
Genericsを使ってUI設定を楽にする


#目的:
　UIButtonやUILabel等の見た目を統一するための設定共通化をGenericsでする
#環境:
　Xcode6.1.1
#概要:
　UILabel等の見た目を統一する方法です。例えば角を同じように丸くする等の記述を対象とします。UILabel等は基本的にUIViewのsubclassなのでこの点をうまく使いたいです。そこでGenericsを用いて変更内容を統一してそれぞれのobjectを引数として与え、同じinterfaceで変更する実装をします。

>func viewSetup<T:UIView>(view:T){...}

というのを実装しています。

#ソースコードと詳細説明:
　UIコンポーネントが多くなってくると、角を丸く処理とか面倒になってきます。サブクラス等を作成するのも良いですがUIコンポーネントの種類が増えてくると管理が大変になります。そこで私は以下のようなものを定義して一括処理しています。

```swift:sample.swift
func viewSetup<T:UIView>(view:T){
        view.contentMode = .ScaleAspectFill
        view.layer.cornerRadius = 5
        view.layer.masksToBounds = true
}
...
```

定義したviewSetup関数にUILabelなどのインスタンスを放り込めばOKです。私はUILabelとUIImageViewで使っています。
Mac版のChromeで使えるショートカットキー

#はじめに
Chromeで使えるショートカットキーの一覧は[Chromeのヘルプ](https://support.google.com/chrome/answer/157179?hl=ja)内で紹介されています。今回はその中からよく使うであろうとkってに思ったショートカットキーを紹介します。
(ただし、`⌘-C`のようにほとんどの人が知っているショートカットキーも入ってます。並び順は[Chromeのヘルプ](https://support.google.com/chrome/answer/157179?hl=ja)で紹介されている順です。)

最後におまけ追加(ただしChromeには関係なく、Macユーザー用です)。

#ショートカットキー

|ショートカットキー|内容| 
|:-----------|:------------|
|⌘-N|新しいウィンドウを開く |
|⌘-T|新しいタブを開く|
|⌘-Shift-N|新しいウィンドウをシークレット モードで開く|
|⌘-Shift-T|最近閉じたタブをもう一度開く。最後に閉じた 10 個までのタブが記憶される。|
|⌘-option-右矢印キー【→】|次のタブに切り替える|
|⌘-option-左矢印キー【←】|前のタブに切り替える|
|⌘-W|現在のタブまたはポップアップを閉じる|
|⌘-Shift-W|現在のウィンドウを閉じる|
|delete または ⌘-[|そのタブの閲覧履歴の前のページを表示|
|shift-delete または ⌘-]|そのタブの閲覧履歴の次のページを表示|
|⌘-M|ウインドウを最小化|
|⌘-Q|Google Chrome を終了|
|⌘-Shift-M|複数のユーザーを切り替える|
|URL を入力してから ⌘-Enter を押す|バックグラウンドの新しいタブで URL を開く|
|⌘-L|URL をハイライト表示|
|アドレスバーを選択後option-左矢印キー【←】|アドレスバー内の前の単語にカーソルを移動|
|アドレスバーを選択後option-右矢印キー【→】|アドレスバー内の次の単語にカーソルを移動|
|アドレスバーを選択後shift-option-左矢印キー【←】|アドレスバー内の前の単語をハイライト表示|
|アドレスバーを選択後shift-option-右矢印キー【→】|アドレスバー内の次の単語をハイライト表示|
|アドレスバーを選択後⌘-Delete|アドレスバー内のカーソルの前にある単語を削除|
|⌘-P|現在のページを印刷|
|⌘-Shift-P|[ページ設定] ダイアログを開く|
|⌘-Shift-I|現在のページをメールで送信|
|⌘-R|現在のページを再読み込み|
|Esc|現在のページの読み込みを停止|
|option を押しながらリンクをクリックする|リンク先をダウンロード|
|⌘-D|現在のウェブページをブックマークとして保存|
|⌘-Shift-D|開いているすべてのタブを新しい 1 つのフォルダにブックマークとして保存|
|⌘-Shift-F|ページを全画面モードで開く。もう一度 ⌘-shift-F を押すと全画面モードを終了|
|⌘-+|ページ全体を拡大表示|
|⌘と-を同時に押す|ページ全体を縮小表示|
|⌘-Option-F|アドレスバーに移動|
|⌘-C|ハイライト表示されたコンテンツをクリップボードにコピー|
|⌘-Option-C|現在表示しているページの URL をクリップボードにコピー|
|⌘-V|クリップボードからコンテンツを貼り付ける|
|⌘-Z|最後の操作を取り消す|
|⌘-Shift-Z|最後の操作を繰り返す|
|⌘-X|ハイライト表示されたコンテンツを削除して、クリップボードにコピーする|
|⌘-A|現在のページのテキストをすべて選択する|

#ショートカットキーでウィンドウの切り替え
[Senebier(セネビエ)](http://www.bicoid.com/app/senebier/index.html)というMac OSXにおけるウインドウ操作を補助するシステム拡張ユーティリティのソフトをMacに入れることで`Option-Tab`で次の画面のように使えるようになります。

![Senebierの使用中の画面](http://news.mynavi.jp/articles/2012/08/14/tips/images/008.jpg)

このソフトの使い方は開発者の方がPDFであげているので、そちらで確認してください。
[http://www.bicoid.com/app/senebier/archive/manual.pdf](http://www.bicoid.com/app/senebier/archive/manual.pdf)

参考記事：[Macのちょい効き!ワザ - WindowsのAlt＋Tabのようなウィンドウ切り替えをMacで行なうには | マイナビニュース](http://news.mynavi.jp/articles/2012/08/14/tips/)
Rails4以上で使える `find_or_create_by`   `find_or_initialize_by` が便利

たまたまAPIリファレンス見ていたら気づいた！

`find_or_create_by` と `find_or_initialize_by`
http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by

メソッド名その名の通りの挙動になると想像できると思うが、引数に渡した条件により、フィルタリングされ、ブロックにより必要な値をセットすることで `create` や `initialize` する時の初期値が設定できる。

```rb:サンプル
# first_nameが abc のデータがあれば find される
# first_nameが abc のデータが無ければ、first_name: 'abc'、last_name: "123" が入ったユーザがcreateされる。
User.find_or_create_by(first_name: 'abc') do |user|
  user.last_name = '123'
end

# メソッドの引数に複数を設定するとfind_by時の条件が AND での複数条件検索となる。
User.find_or_create_by(first_name: 'abc', group_id: 3) do |user|
  user.last_name = '123'
end
```


## ユースケース

### oauthで認証時にユーザ新規登録なのか、既存ユーザなのか判定する処理とかでうまく使えそう

oauth認証で帰ってくるコールバックのコントローラから以下の `find_or_create_with_oauth` メソッドを呼び出す。

```rb:oauthのサンプル
# 動作するか未保証
class User < ActiveRecord::Base
  def self.find_or_create_with_oauth(oauth)
    User.find_or_create_by(uid: oauth['uid']) do |user|
      user.name = oauth['name']
      user.provider = oauth['provider']
      user.uid = oauth['uid']
    end
  end
end
```

以上。
has_manyなリレーションで外部キーを作り忘れるとNoMethodErrorが発生する

```ruby:
class Blog < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
end
```
で、
```
irb(main):001:0>  Blog.find(1).posts.build
NoMethodError: undefined method `val' for #<Arel::Nodes::BindParam:0x0000080fdff388>
```
となる。

Postのほうにblog_idを作り忘れているとこうなる。

親切なエラーメッセージが出るような変更がcommitされてるようなのでそのうち治るでしょう。
FACTORYGIRL ASSOCIATIONS


#### 背景
FactoryGrirlで、 下記の特徴のモデルに対して、データを生成したいです。

- belongs_to関係がある
- belongs_toの対象モデルが別名で定義している

#### 例
モデル： `User` and `Message` の関係

```rb
class Message < ActiveRecord::Base
  # 送信者userを別名senderにする
  belongs_to :sender, class_name: "User", foreign_key: :from_user_id
  # 受信者userを別名recipientにする  
  belongs_to :recipient, class_name: "User", foreign_key: :to_user_id
end

class User < ActiveRecord::Base
  has_many :sent_messages, class_name: "Message", foreign_key: :from_user_id
  has_many :received_messages, class_name: "Message", foreign_key: :to_user_id
end
```

FactoryGirlで下記のように記述したいです:

```rb
FactoryGirl.create(:message, sender: @user1, recipient: @user2)
```

#### 解決方法

```rb
factory :message do
  content "A message for you, Rudy!"
  association :sender
  association :recipient
end
```

#### その他
`message` データを生成たびに、ユーザを新規作成したいなら

```rb
FactoryGirl.create(:message)
```

```rb
factory :message do
  content "A message for you, Rudy!"
  association :sender, factory: :user
  association :recipient, factory: :user
end
```
TwitterやAppStore風のSegement Control付きUITableViewを実装する


Twitter公式アプリのプロフィール画面やAppStoreアプリの各アプリの画面のように、UITableViewでSectionのヘッダにSegment Controlを置いてテーブルの表示内容を切り替えるUIを実装したい場合があると思います。

- AppStoreアプリ:

	![1.png](https://qiita-image-store.s3.amazonaws.com/0/15414/9dcd2a1a-4513-927c-38a7-8b1cb4e95044.png "1.png")

- Twitter公式iOSアプリ:

	![2.png](https://qiita-image-store.s3.amazonaws.com/0/15414/5e2d46ef-87a7-1036-1bb5-6a8aadb4650e.png "2.png")


`UITableViewHeaderFooterView`を使って実装してみます。

## 実装

2番目のSectionの上部にSegment Controlを配置する例です。

1. `UITableView`とTopBarの間にUIViewをD&DしてSegment Controlを配置します。

	![header.png](https://qiita-image-store.s3.amazonaws.com/0/15414/4845117e-1754-336a-31a8-0431c337b8e6.png "header.png")

2. `UIView`の`@IBOutlet`を作成します。
	
	![code.png](https://qiita-image-store.s3.amazonaws.com/0/15414/7fa10ea9-c420-733a-632a-21b2a196c005.png "code.png")

	以下、UIViewの変数名をheaderViewとします。

3. 2番目のsectionに`UIView`を配置します。

	```Swift
    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?{
        switch section {
        case 1:
            let sectionHeaderView = UITableViewHeaderFooterView()
            sectionHeaderView.contentView.addSubview(self.headerView)
            return sectionHeaderView
        default:
            return nil
        }
    }
	```

4. 2番目のsectionの高さを設定します。

	```wift
    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat{
        switch section {
        case 1:
            return self.headerView.frame.height
        default:
            return 0
        }
    }
	```

5. ビルドして起動します。

	![twitter.png](https://qiita-image-store.s3.amazonaws.com/0/15414/5d12e949-5396-9fd3-21f7-3997941ecfb2.png "twitter.png")

	背景を変えたい場合はUITableViewHeaderFooterViewのbackgroundViewを設定するなどします。


## 注意

Sectionのヘッダの`UITableViewCell`に置くと次のような問題が発生します。

1. Segment ControlでSegmentボタンをクリックする
2. ネットワーク経由でデータを取得する
3. reloadSectionやreloadDataでUITableViewCellを更新する
4. Segment Controleの表示が初期状態に戻ってしまう←問題

`UITableViewHeaderFooterView`を使えばこのような問題は発生しません。
【CakePHP】バーチャルフィールド

CakePHPが発行するSQLのselectカラムを自作することができる。

##使い方

モデルのフィールドへ「カラム名=>select句の式」で設定する。

```php:モデルへバーチャルフィールドを定義
class User extends AppModel{
  $virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];

```

もちろん、動的に設定することもできる。

```php
$this->モデル->virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];
```

findするときに、virtualFieldsで設定したカラム名を指定する。

```php
$this->find('all',[
  'fields'=>['name']
]);
```

##便利な使い方

fieldsにSQL関数を書いた場合、モデル名の下にSQL関数の結果が入らない。

```php:通常
$res = $this->find('all',[
  'fields'=>['id','concat(User.first_name, " ", User.last_name) as name']
]);

var_dump($res);
/*
[0] => Array
  (
    [User] => Array
      (
        [id] => 12
      )
    [0] => Array
      (
        [name] => suzuki taro
       )
   )
*/
```

バーチャルフィールド使えば、モデルの下に結果が入りデータを扱いやすくなる。

```php:便利な使い方
$this->virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];

$res = $this->find('all',[
  'fields'=>['id','name']
]);
var_dump($res);
/*
[0] => Array
  (
    [User] => Array
      (
        [id] => 12
        [name] => suzuki tarou
      )

*/
```

※ちなみに、userテーブルのように名字と名前を別のカラムで管理している場合、virtualFieldsを使ってconcatで名字と名前の結合すると便利。

##動的なバーチャルフィールドの設定

###動的に設定

```php:動的に設定
$this->モデル->virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];
```

###動的に解除

```php:動的に解除
$this->モデル->virtualFields = null;
```
Go言語では高階関数よりforループを使え(by Rob Pike氏)

Rob Pike氏による高階関数ライブラリ

imple apply/filter/reduce package.
https://github.com/robpike/filter

> I wanted to see how hard it was to implement this sort of thing in Go, with as nice an API as I could manage. It wasn't hard.
> 
> Having written it a couple of years ago, I haven't had occasion to use it once. Instead, I just use "for" loops.
>
> You shouldn't use it either.
JUnitのTemporaryFolderで一時ディレクトリを使う

ファイルを生成／更新するクラスをテストする際には、次回の実行時や他のテストの実行に影響がでないように、後処理で作業ディレクトリを元の状態に戻しておかなければならない。

こういう時は`org.junit.rules.TemporaryFolder`を使うと、テストメソッドを実行する度に一時ディレクトリを作成して終了時には自動的に削除してくれるようになる。

# 使い方

テストクラスにTemporaryFolder型のpublicフィールドを作成して`@Rule`アノテーションを付けておけば、テストメソッドが実行される度に一時ディレクトリを生成してくれる。

```java:
    @Rule
    public TemporaryFolder tempFolder = new TemporaryFolder();
```

生成された一時ディレクトリのパスは`getRoot()`で取得できる。

```java:
    tempFolder.getRoot();
```

一時ディレクトリ内にファイルやサブディレクトリを作成するには`createFile()`と`createFolder()`を使用する。
引数がないほうを使うとランダムな名前を付けて作成してくれる。

```java:
    tempFolder.createFile(filename);
    tempFolder.createFolder(foldername);
    tempFolder.createFile();
    tempFolder.createFolder()
```

テスト用ファイルを用意してある場合には、一時ディレクトリにファイルをコピーしてから使用すれば、ファイルを更新／削除するようなテストでも次回実行時に影響しない。

```java:
        FileUtils.copyDirectory(new File("src/test/data/test1/"), tempFolder.getRoot());
```

# サンプル

初期処理でfoo/barの2ファイルを生成し、各テストメソッドで別々のファイルを削除してみるテスト。
一時ディレクトリはテストメソッド毎に生成されるので、他のテストメソッドの影響を受けていないことが確認できる。

```java:TemporaryFolderExampleTest.java
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;

import java.io.File;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class TemporaryFolderExampleTest {

    @Rule
    public TemporaryFolder tempFolder = new TemporaryFolder();

    @Before
    public void before() throws Exception {
        tempFolder.newFile("foo");
        tempFolder.newFile("bar");
    }

    @Test
    public void testDeleteFoo() throws Exception {
        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(true));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(true));
        
        new File(tempFolder.getRoot(), "foo").delete();
        
        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(false));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(true));
    }
    
    @Test
    public void testDeleteBar() throws Exception {
        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(true));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(true));
        
        new File(tempFolder.getRoot(), "bar").delete();
        
        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(true));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(false));
    }
}
```
Haskellメモ

個人的なメモ帳です。嘘書いてたらごめんなさい。

### List

- 結合

```bash
Prelude> [1,2,3] ++ [4]
[1,2,3,4]
```

下記はコンパイルエラー

```bash
Prelude> [1,2,3] ++ 4
```

- 頭に結合

```bash
Prelude> 0 : [1,2,3]
[0,1,2,3]
```

##### fibonacci

```hs
fibonacci :: [Int]
fibonacci = 1 : 2 : zipWith (+) fibonacci (tail fibonacci)
```

これがfibonacci数列になるらしい。謎い。
私の中では多分こんな流れなんだろうということで自己解決。


```
   [1,2,...      <- fibonacci
+) [2,...        <- (tail fibonacci)
--------------
   [3,...        <- zipWith (+) fibonacci (tail fibonacci)

=>
   [1,2,3,..
+) [2,3,..
--------------
   [3,5,..

=>
   [1,2,3,5,..
+) [2,3,5,..
--------------
   [3,5,8,..
```

こんなの思いつく気がしない

追記)
上記のfibonacci数列の生成はとても遅いみたいです。
http://d.hatena.ne.jp/nishiohirokazu/20100622/1277208908


### 内包記法いろいろ実験

- 1~10までの奇数のList

```bash
Prelude> [x | x <- [1..10], mod x 2 == 1]
[1,3,5,7,9]
```

↓でもOK（こっちのほうが見やすいかも）

```bash
Prelude> [x | x <- [1..10], x `mod` 2 == 1]
[1,3,5,7,9]
```

- 2乗の和が100~400までの隣り合った数のList

```bash
Prelude> [(x, x + 1) | x <- [1..400],
  let sum = x^2 + (x + 1)^2, 100 <= sum && sum <= 400 ]
[(7,8),(8,9),(9,10),(10,11),(11,12),(12,13),(13,14)]
```

### 関数いろいろ実験

関数は上から評価される

- func-test.hs

```haskell
isSeven :: Int -> String
isSeven 7 = "This is seven"
isSeven x = "This is not seven"
```

```bash
Prelude> :l ./func-test.hs
[1 of 1] Compiling Main             ( func-test.hs, interpreted )
Ok, modules loaded: Main.
*Main> isSeven 7
"This is seven"
*Main> isSeven 8
"This is not seven"
```

 - reverse

```haskell
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]
```

```
*Main> reverse' "abcdefg"
"gfedcba"
*Main> reverse' [1,2,3]
[3,2,1]
```

### ラムダ式でguard

```hs
map (\x -> case () of
  _ | x == 2 -> "two"
    | x == 4 -> "four"
  otherwise  -> show x) [1,2,3,4]
```

```
["1","two","3","four"]
```

### 参考

- [すごいHaskellたのしく学ぼう! ](http://amzn.to/1cLXNl7)
- [関数プログラミング実践入門] (http://amzn.to/1xOiQIU)
- [Haskell実践パターン〜Project Eulerを題材に〜](https://sites.google.com/site/nextliteracy/haskell/projecteuler)
- [Haskellの「fib = 1:1:zipWith (+) fib (tail fib)」はとても遅い](http://d.hatena.ne.jp/nishiohirokazu/20100622/1277208908)
<メモ>Windowsマシンリプレースに伴う環境移行手順


ワークグループ環境のWindows8マシンをリプレースするにあたり、今後のことも考えて手順をメモ。
初版UP時点では現在進行中のため、結果次第では編集するかも。

## 移行先の準備
1. リプレース先マシンを準備(仮想マシン)
	* 詳細は 付録参照
2. OSセットアップ
	* ローカルアカウントでセットアップ
	* MSに情報を送っちゃう系は、ALL OFF
3. 環境設定
	* VMwareToolsインストール(要再起動)
	* 電源設定を高パフォーマンスに変更(WindowsUpdate中にSleepに移行させないため)
4. 移行先OSのWindowsUpdateを最新とする。(重要な物のみでOK)

## 移行メニュー
1. vSphere Clientのインストール
2. リモートデスクトップ有効化
3. 移行元マシンのDドライブをマウント(実際はデータストアの移動・リネーム等を行っておく必要アリ)
4. ウィルス対策ソフトの移行(Norton先生とかだとライセンス移行可)
5. 環境変数の移行(特に手動追加したPATH)
6. Office等の必要なソフトウェアの導入・移行
7. タスクバーのサイズ・位置・スタートメニュー(タイルスタイル)はお好みでコツコツと。(簡単な移行手順があれば教えて、エロイ人!)

## 余談
* vSphere Clientのショートカットに引数を渡せば、ESXへの自動ログイン可

```text:記述内容
	"vSphere Clientのフルパス" -u ログインID -p パスワード -s 接続先ESXiホスト(FQDN|IP)
```

* システムドライブのデータ移行は、Windows転送ツールを使えば簡単に移行可

## 付録
* 仮想マシンを作る時のメモ。どうせ記憶ベースにやっちゃうけど一応。

|No |項目|選択・入力内容|備考|
|:-:|:--|:--|:--|
|1  |構成|カスタム||
|2  |名前|任意の名前||
|3  |リソースプール|任意のリソースプール||
|4  |ターゲットストレージ|任意のストレージ||
|5  |仮想マシンのバージョン|8||
|6  |ゲストOS|Windows 8 64bit||
|7  |CPU|ソケット数・コア数を必要数選択|必要リソースを割り当てればOK|
|8  |メモリ|4GB|必要リソースを割り当てればOK|
|9 |ネットワーク接続|任意のNICを必要数選択|必要リソースを割り当てればOK|
|10 |SCSIコントローラ|デフォルト|OS種により推奨パラメータが自動選択される|
|11 |ディスク|新規ディスク||
|12 |容量|80GB|システムディスク用<BR>WindowsUpdateとかで肥大化しやすいので多めに確保|
|13 |プロビジョニング|Eager Zeroed|稼働時のパフォーマンス重視ならこれ(SSDならLazy Zeroedでも良いかも)|
|14 |場所|デフォルト||
|15 |仮想デバイスノード|デフォルト||
|16 |モード|デフォルト(選択なし)||
|17 |仮想マシンの編集|ON||
|18 |FDD|削除|仮想イメージ利用があるなら削除不要|
|19 |ビデオメモリ|自動検出|コンソールのWindowサイズにゲストを合わせられる筈|
|20 |構成パラメータ(追加)|isolation.tools.paste.disable:False<BR>isolation.tools.paste.disable:False|コピペ対策|
|21 |パワーオン時起動遅延|5,000|BIOS画面に入りたい時に、キー入力が間に合わないことが多々ある為|
|22 |強制的にBIOSセットアップ|ON|OSメディアマウントと起動デバイス順変更の為|
|23 |[BIOS]起動デバイス順変更|CD-ROMを2番に変更|このタイミングでOSメディアマウント|
|24 |[BIOS]設定を保存|YES→再起動||
.natvisを使ってVisual Studioのデバッグを見やすくする


自作コンテナなどを作った時にデバッガに表示される値が見づらくなってしまう。表示される時の書式のメモ
Visual Studio2012移行が対応している。

# 解説

下の自作構コンテナモドキを見やすくしてみる。
C++のコードは適当。

```cpp:MyArray.h

struct MyArray
{
	int*	m_data;
	int		m_size;
};

```

```cpp:main.cpp

int main()
{
	MyArray array( 10 );
	return 0;
}

```

上のコードを何もしないままブレークポイントを置くと最初の要素しか見ることが出来ません。

![first.PNG](https://qiita-image-store.s3.amazonaws.com/0/66029/cac83495-5993-90ba-b6e8-e38d2b34a658.png)

そこで、ユーザー定義の.natvisファイルを使う事で見やすくすることが出来ます。
マイドキュメント/Visual Studio 2013/Visualizers/に自作した.natvisファイルを置いてください。



```xml:MyArray.natvis

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="MyArray">
    <DisplayString>{{[size] = {m_size}}}</DisplayString>
    <Expand>
      <Item Name="size">m_size</Item>
      <ArrayItems>
        <Size>m_size</Size>
        <ValuePointer>m_data</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>

```

上記のファイルが適応されると下のように配列として認識されて表示されます。
見やすくなりました。
![second.PNG](https://qiita-image-store.s3.amazonaws.com/0/66029/ba2bfd68-183b-d022-7a5c-9e48c797b30e.png)

項目についての詳細です。

```xml:
<DisplayString>{{[size] = {m_size}}}</DisplayString>
```
この部分は変数の値として表示される物です。

```xml:
<Expand></Expand>
```
このタグの間の物がタブを開いた際に表示されるデータの一覧になります

```xml:
<Item Name="size">m_size</Item>
```
アイテム一つを表示するのみ使われるタグです。
Nameに表示名をタグの中にメンバ変数を入れれば中身を表示出来ます

```xml:
<ArrayItems>
        <Size>m_size</Size>
        <ValuePointer>m_data</ValuePointer>
</ArrayItems>
```
配列を扱うタグです。
Sizeタグに要素数を入れます。
ValuePointerに先頭のポインタを入れます

# 追記
テンプレートや条件式なども書けるようなので色々試してみてください
SwiftでMethod Swizzling


と言っても、NSObjectを継承したクラスである必要があります。なので、Viewに関しての部品では用途は多いと思います。DictionaryやArrayなどNSObjectを継承していないクラスでは、使えません。

## Method Swizzlingとは

MethodAとMethodBを入れ替えることができます。Appleのフレームワークで定義されたメソッドも変更できるので強力ですが、副作用（別の場所で既存メソッドを利用しようと思ったのに、書き換えられたメソッドが実行されてしまう）にも注意する必要があります。

## コードで説明

今回は、NSDictionaryを利用したケースで説明します。今回は、`description`を実行する際に、ログを表示する例です。まず、Extensionで実行したいメソッドを書きます。返り値は自由ですが、今回は元のメソッドの返り値を返そうと思いました。

```swift:NSDictionary.swift
extension NSDictionary {
    func myDescription() -> String {
        println("MY DESCRIPTION!!")
        return myDescription()
    }
}
```

そして、Extensionで拡張されたNSDictionaryを生成し、メソッドを入れ替えて、`description`を出力してみます。

```swift:Anyfile.swift
func swizzle() {
    var dict = ["This is Key.": "This is value."] as NSDictionary
    var method: Method = class_getInstanceMethod(object_getClass(dict), "description")
    var swizzledMethod: Method = class_getInstanceMethod(object_getClass(dict), "myDescription")
    method_exchangeImplementations(method, swizzledMethod)
    
    println(dict.description)
}
```

下記のようなログが出ました！

```swift:console
MY DESCRIPTION!!
{
    "This is Key." = "This is value.";
}
```

dictの`description`メソッドはprintln実行時には既に`myDescription()`に切り替わっているので、このように出来たのでした。ちょっとややこしいのですが、`myDescription()`のブロックで実行している、`myDescription()`は既に`description`と入れ替わっているので、`myDescription()`を`myDescription()`内部で実行すると、`description`の結果が出力されます。

## 参考

- [Swift function swizzling / runtime - Stack Overflow](http://stackoverflow.com/questions/24019683/swift-function-swizzling-runtime)
SHA-1ハッシュアルゴリズムの危殆化対応（SSL証明書）

SHA-1ハッシュアルゴリズムの危殆化対応（SSL証明書）

## 背景

 * SHA-1ハッシュアルゴリズムの危殆化
 →マイクロソフト社とグーグル社がSHA-1の廃止プランの発表
  参考:
  https://www.jp.websecurity.symantec.com/sid-partner/products/pdf/chrome_sha1deprecation_201409_1.pdf

 * HTTP/2のベースとなったSSL/SPDY
 →WEBサイトのhttps化が加速

## sha-2への移行


#### 既存証明書の署名アルコリズムの確認


 * online check
 Check your certificate installation

 https://ssltools.websecurity.symantec.com/checker/views/certCheck.jsp

 Poodle, Heartbleed脆弱性診断、証明書情報、Certificate chain様々なチェックが可能

 * ブラウザ画面から確認
 Certificate Signature Algorithm:

  * SHA1withRSA：対応必要
  * SHA256withRSA：OK


#### 新規SSL証明書CSR作成時の注意事項

opensslでCSR作成する場合、「-sha256」 オプショオンをつけること！
一部の証明書発行機関は無償でsha1証明書からsha2へアップデートのサービスが提供されるが、
無駄な対応工数がかかるので、最初sha2で申請したほうがよい



## 参考
http://ja.wikipedia.org/wiki/SHA-2
https://jp.globalsign.com/sha256/knowledge/
http://ja.wikipedia.org/wiki/HTTP/2