OmniAICreator/Qiita-1.07M huggingface dataset:
iOS Storyboardで枠色つき角丸ボタン

角丸で枠に色がついたボタンが好きです。
AppStoreの「入手」みたいなやつ。

今まで、StoryboardでUIButtonをおいてからコードでlayerを設定してあげれば作れるけど、なんかもう少しStoryboardでなんとかなんないのかと思っていたら、"User Defined Runtime Attributes"という設定でできることを知りました。

![スクリーンショット 2015-01-21 23.58.50.png](https://qiita-image-store.s3.amazonaws.com/0/30418/8633cbb0-bedb-e84a-4610-74d75a148192.png)

これで実行

![スクリーンショット 2015-01-22 0.06.14.png](https://qiita-image-store.s3.amazonaws.com/0/30418/d90ccaa6-fb14-1a38-a069-1d50f263e76e.png)

ぐは。。
そうか、layer.borderColorはCGColorか。。

無理かーと思っていたらナイスな方法が見つかりました。

CALayerのExtension(カテゴリ)でUIColorを引数にもつメソッドを作成してKeyPathに設定します。

```lang:CALayer+RuntimeAttribute.swift
import UIKit

extension CALayer {
    
    func setBorderIBColor(color: UIColor!) -> Void{
        self.borderColor = color.CGColor
    }    
}
```
SwiftでExtensionのファイル名をどうしようかと思いましたが、とりあえずObjective-Cと同じく、クラス名+拡張名でいこうかと思います。

で、このメソッドをKyePathに指定して実行

![スクリーンショット 2015-01-21 23.58.50.png](https://qiita-image-store.s3.amazonaws.com/0/30418/d91aca82-d235-8179-a90c-d025eb1e97d8.png)


![スクリーンショット 2015-01-22 0.13.13.png](https://qiita-image-store.s3.amazonaws.com/0/30418/d763853e-4130-5735-3551-db0f2469d24f.png)

よしできた。

追記

UIControlState.Highlightedの設定をしなければいけないので、結局コードで書くことにしました。
[mruby] mrb_value を C言語のデータ型に変換する方法

# 共通コード
```c
#include <stdio.h>
#include <mruby.h>
#include <mruby/compile.h>
#include <mruby/string.h>
#include <mruby/array.h>
#include <mruby/hash.h>

int main( void ){
    mrb_state* mrb = mrb_open();
    if ( NULL != mrb ){
        mrbc_context* cxt = mrbc_context_new( mrb );
        mrb_value value;
        
        mrb_load_string_cxt( mrb, "def debug( var ); p var; end", cxt );
        
        // TODO
        
        mrbc_context_free( mrb, cxt );
        cxt = NULL;
        mrb_close( mrb );
        mrb = NULL;
    }
    return 0;
}
```

# mruby -> C言語
## mrb_value -> bool
```c
value = mrb_load_string_cxt( mrb, "false", cxt );
printf( "value=%d\n", mrb_bool( value ) ); // value=0

value = mrb_load_string_cxt( mrb, "true", cxt );
printf( "value=%d\n", mrb_bool( value ) ); // value=1
```

## mrb_value -> int
```c
value = mrb_load_string_cxt( mrb, "111", cxt );
if ( mrb_fixnum_p( value ) ){
    printf( "value=%d\n", mrb_fixnum( value ) ); // value=111
}
```

## mrb_value -> float
```c
value = mrb_load_string_cxt( mrb, "1.5", cxt );
if ( mrb_float_p( value ) ){
    printf( "value=%f\n", mrb_float( value ) ); // value=1.500000
}
```

## mrb_value -> string
```c
value = mrb_load_string_cxt( mrb, "string", cxt );
if ( mrb_string_p( value ) ){
    printf( "value=%s\n", RSTRING_PTR( value ) ); // value=string
}
```

## mrb_value -> array
```c
value = mrb_load_string_cxt( mrb, "[1,2]", cxt );
if ( mrb_array_p( value ) ){
    int len = RARRAY_LEN( value );
    printf( "array_len=%d\n", len ); // array_len=2
    for ( int i = 0; i < len; ++i ){
        printf( "array[%d]=%d\n", i, mrb_fixnum( mrb_ary_ref( mrb, value, i ) ) );
    }
    // array[0]=1
    // array[1]=2
}
```

## mrb_value -> hash
```c
value = mrb_load_string_cxt( mrb, "{ 'a' => 'A', 'b' => 'B', 'c' => 'C' }", cxt );
if ( mrb_hash_p( value ) ){
    mrb_value keys = mrb_hash_keys( mrb, value );
    int len = RARRAY_LEN( keys );
    printf( "hash_keys_len=%d\n", len ); // hash_keys_len=3
    for ( int i = 0; i < len; ++i ){
        mrb_value key = mrb_ary_ref( mrb, keys, i );
        printf( "hash[%s]=%s\n", RSTRING_PTR( key ), RSTRING_PTR( mrb_hash_get( mrb, value, key ) ) );
    }
    // hash[a]=A
    // hash[b]=B
    // hash[c]=C
}
```

# C言語 -> mruby
## bool -> mrb_value
```c
mrb_funcall( mrb, mrb_top_self( mrb ), "debug", 1, mrb_false_value() ); // false
mrb_funcall( mrb, mrb_top_self( mrb ), "debug", 1, mrb_bool_value( false ) ); // false

mrb_funcall( mrb, mrb_top_self( mrb ), "debug", 1, mrb_true_value() ); // true
mrb_funcall( mrb, mrb_top_self( mrb ), "debug", 1, mrb_bool_value( true ) ); // true
```

## int -> mrb_value
```c
mrb_funcall( mrb, mrb_top_self( mrb ), "debug", 1, mrb_fixnum_value( 111 ) ); // 111
```

## float -> mrb_value
```c
mrb_funcall( mrb, mrb_top_self( mrb ), "debug", 1, mrb_float_value( mrb, 1.5 ) ); // 1.5
```

## string -> mrb_value
```c
mrb_funcall( mrb, mrb_top_self( mrb ), "debug", 1, mrb_str_new_cstr( mrb, "string" ) ); // "string"
```

# 参考サイト
[mrb_valueについて調べてみた](http://naoty.hatenablog.com/entry/2013/05/04/204949)
[c から mrubyのメソッドをコールする](http://blogchof.blogspot.jp/2012/06/c-ruby.html)
UTF-8 の4バイト文字を3バイト文字のペアに変換する

MySQL の utf8mb3 は基本多言語面外の文字 (U+10000 - U+10FFFF) をそのまま保存することができませんが、RFC 3629 では禁止されているサロゲートの範囲 (U+D800 - U+DFFF) の文字の利用が認められています。このような UTF-8 によく似たエンコーディングは CESU-8 と呼ばれ、[UTR#26](http://www.unicode.org/reports/tr26/) で定義されます。たとえば、コードポイントの列である `<U+004D, U+0061, U+F0000>` はバイト列で `<4D 61 ED AE 80 ED B0 80>` とあらわされます。

CESU-8 を扱う場合の課題は標準関数やメソッド、主要なライブラリで対応していないため、不正なバイト列として削除されたり、代替文字 (U+FFFD) に置き換えられてしまう可能性が高いことです。実際のアプリケーションでは HTML 数値文字参照に変換する[方法](http://qiita.com/masakielastic/items/ec483b00ff6337a02878)を採用したほうが安全でしょう。

ビット演算によるコードポイントと文字の相互変換については「[コードポイントから UTF-8 の文字を生成する](http://qiita.com/masakielastic/items/68f81e1b7d153ee5cc81)」および「[UTF-8 の文字からコードポイントを求める](http://qiita.com/masakielastic/items/5696cf90738c1438f10d)」の記事 (「ビット演算の計算過程」) をご参照ください。

## PHP

```php
$input = "?野家";
$output = "\xED\xA1\x82"."\xED\xBE\xB7"."野家";

var_dump(
  $output === UConverter::transcode($input, 'CESU-8', 'UTF-8'),
  $input === UConverter::transcode($output, 'UTF-8', 'CESU-8'),
  $output === utf8_to_cesu8($input),
  $input === cesu8_to_utf8($output)
);

function utf8_to_cesu8($str)
{
    $re = '/[^\x{0}-\x{FFFF}]/u';
    return preg_replace_callback($re, function($m) {
        $char = $m[0];
        $x = ord($char[0]);
        $y = ord($char[1]);
        $z = ord($char[2]);
        $w = ord($char[3]);
        $cp = (($x & 0x7) << 18) | (($y & 0x3F) << 12) | (($z & 0x3F) << 6) | ($w & 0x3F);
        // http://unicode.org/faq/utf_bom.html#utf16-4
        $lead = 0xD800 - (0x10000 >> 10) + ($cp >> 10);
        $trail = 0xDC00 + ($cp & 0x3FF);

        return chr(0xE0 | $lead >> 12).chr(0x80 | $lead >> 6 & 0x3F).chr(0x80 | $lead & 0x3F).
        chr(0xE0 | $trail >> 12).chr(0x80 | $trail >> 6 & 0x3F).chr(0x80 | $trail & 0x3F);
    }, $str);
}

function cesu8_to_utf8($str)
{
    $re = '/(\xED[\x80-\xBF]{2})(\xED[\x80-\xBF]{2})/xs';
    return preg_replace_callback($re, function($m) {
        $lead = ((ord($m[1][0]) & 0xF) << 12) | ((ord($m[1][1]) & 0x3F) << 6) | (ord($m[1][2]) & 0x3F);
        $trail = ((ord($m[2][0]) & 0xF) << 12) | ((ord($m[2][1]) & 0x3F) << 6) | (ord($m[2][2]) & 0x3F);

        if (0xD800 > $lead | $lead > 0xDBFF
           | 0xDC00 > $trail | $lead > 0xDFFF) {
            return $m[0];
        }

        // http://unicode.org/faq/utf_bom.html#utf16-4
        $cp =  ($lead << 10) + $trail + 0x10000 - (0xD800 << 10) - 0xDC00;

        return chr(0xF0 | $cp >> 18).chr(0x80 | $cp >> 12 & 0x3F)
          .chr(0x80 | $cp >> 6 & 0x3F).chr(0x80 | $cp & 0x3F);
    }, $str);
}
```
CanCanCanで複雑な条件を設定する

cancancan、とても便利ですね。

しかし、所有者なら変更できるなどの簡単な条件なら日本語のブログなどが多くありますが、複雑な条件を設定する方法について書かれた日本語の記事はあまり多くありません。

もちろん、wikiに記述があるので、英語に抵抗がない方はそちらを読んだほうが良いと思います。

# 単純な条件

ともあれ、まずは単純な条件での権限の設定の方法を確認しておきましょう。

ブログの著者は、任意の操作が可能。それ以外の人は読み取りのみ可能であるようなブログを考えます。

```app/models/ability.rb
can :manage, Blog, author: user
can :read
```

このように、簡単な条件だけであれば、ハッシュで指定することが可能です。

# やや複雑な条件

さて、次は少しだけ複雑な条件を考えます。

ユーザーは1つのグループに属しており、著者と同じグループのユーザーは任意の操作が可能であるとしましょう。

この程度であれば、まだハッシュで指定することが可能です。

```ruby
can :manage, Blog, author: { group: {id: user.group.id } }
```

また、ハッシュで指定する際、次のようにhoge_idsというメソッドが使用できます

```ruby
can :manage, Blog, group: { id: user.group_ids }
```

この場合は、ブログが属するグループにユーザーが属していると、任意の操作が可能になります（ブログとグループは多対一、ユーザーとグループは多対多です）。

# もっと複雑な条件

もし、設定したい権限をハッシュで表現できない場合は、ブロックを使用することができます。

公開日時が未来に設定された物以外を読み取り可能にするには、次のように設定することができます。

```ruby
can :read, Blog { |b| b.published_at <= Time.now }
```

さらに、スコープを使用することもできます。

```ruby
can :read, Blog, Blog.where(private: false) { |b| b.published_at <= Time.now }
```

# まとめ

cancancanを使うと、簡単な条件はもちろん、複雑な条件もブロックを使用することで表現できるようになります。

私の拙い英語力では読み取りミスをしている可能性が否定できないので、この記事を読んで概要を把握したら、公式のドキュメントを読みましょう！

# 参考

- [Defining Abilities · CanCanCommunity/cancancan Wiki](https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities)

- [Defining Abilities with Blocks · CanCanCommunity/cancancan Wiki](https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities-with-Blocks)
Raspberry Piで温度計を作る、あとブラウザで見れるようにする　第1回



#仕様

 + 二時間に一回DBに登録する。
 + DBの保管先はherokuを使う。
 + DBはその他に月間平均のテーブルを保有する。
 + 月間平均は次の月の１日に作成する。
 + 日毎の情報三ヶ月分保管する。
 + 月毎の情報は１０年保管する。
 + データの削除は0:00に行う
 + 画面仕様はその場で考える
 + 管理者画面とユーザ画面を作る
 + Herokuはrails
 + piはcgiアプリ 
 + DBの追加は管理者のみでユーザーで閲覧

![IMG_1319.jpg](https://qiita-image-store.s3.amazonaws.com/0/51009/d306f738-e2bf-67b0-b01c-47a18686e265.jpeg "IMG_1319.jpg")
こんなイメージ

#他
 + Herokuを媒介するのは多分処理が重いから。
 + まずは見づらくてもブラウザで出す

#買い物
 + BUFFALO WLI-UC-GNM(無線LAN)
 + Transcend microSDHCカード 32GB Class10 
 + Raspberry Pi Model B+ (Plus) 
 + デジタル温度湿度センサー DHT11

だいたい全部で８０００円程度

#後に必要になったもの
 + HDMIケーブル
 + MicroUSBケーブル
 + USB電源（PCを使用）
 + USBマウス
 + USBキーボード
MagnificPopupでクリックせずにモーダルを表示させる方法


MagnificPopupはこちら
http://dimsemenov.com/plugins/magnific-popup/

# やりたいこと

ページを開いた瞬間に以下のようなモーダルが表示される機能を作る。

![スクリーンショット 2015-02-10 23.23.47.png](https://qiita-image-store.s3.amazonaws.com/0/18614/78eff19a-6d1b-061f-eab9-f9023fe7e64f.png "スクリーンショット 2015-02-10 23.23.47.png")

# やり方

## headで読み込むファイル

jQueryと、MagnificPopupのJSファイルとCSSファイル。

```html:index.html
	<link rel="stylesheet" href="/css/magnific-popup.css"> 
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
	<script src="/js/jquery.magnific-popup.js"></script>	
```


## 表示するモーダル部分

id="popup"がポイント。

```html:index.html
	<div id="popup" class="white-popup">
		Dynamically created popup
	</div>
```

## モーダル部分のCSS

```css:index.html
	.white-popup {
		position: relative;
		background: #FFF;
		padding: 20px;
		width: auto;
		max-width: 500px;
		margin: 20px auto;
	}

```

## JavaScript部分

bodyの下の方にかく。src: '#popup'の部分でid="popup"の要素を探して表示する。

```javascript:index.html
	<script type="text/javascript">
	$(window).load(function(){
		$.magnificPopup.open({
			items: {src: '#popup'},
			type: 'inline', 
			modal: true,
		}, 0);
	});
	</script>  
```



## 全体

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>modal</title>
	<style type="text/css">
		.white-popup {
		  position: relative;
		  background: #FFF;
		  padding: 20px;
		  width: auto;
		  max-width: 500px;
		  margin: 20px auto;
		}
	</style>
	<link rel="stylesheet" href="/css/magnific-popup.css"> 
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
	<script src="/js/jquery.magnific-popup.js"></script>	
</head>
<body>
	<div id="popup" class="white-popup">
		Dynamically created popup
	</div>

	<script type="text/javascript">
	$(window).load(function(){
		$.magnificPopup.open({
			items: {src: '#popup'},
			type: 'inline', 
			modal: true,
		}, 0);
	});
	</script>    
</body>
</html>
```

以上。
jdk1.5以上ならjoda-time使えます

何かといい感じに日付周りを扱えるjoda-timeですが、最新版でもjdk1.5以上なら使えるようです。
http://www.joda.org/joda-time/upgradeto270.html

一通りの使い方はここあたりが参考になるかと。
http://shinsuke789.hatenablog.jp/entry/2013/08/05/120042

scalikejdbcを使ったときにjoda-timeを知って、java6縛りの別案件でも使えないかなと調べたら、全然OKでラッキー、だけのお話。
bashの関数を削除するシェルスクリプトをVimで無理やり書いた→普通にsedで書けた

## 動機
bashのエイリアスや関数を簡単に削除したい。

あるいは[ShellScript - bashの各種コマンドを編集するシェルスクリプト - Qiita](http://qiita.com/catfist/items/d77067983e68c18496f1)の拡張。

## 複数行の削除がめどい
以下のようなエイリアス定義ファイルがあるとします。

```alias-init.bash
unalias -a # すべてのエイリアスを削除
alias mi='open -a mi'
alias ft='open -a FoldingText'
alias marked='open -a "Marked 2"'
alias st='open -a "Sublime Text"'
# 以下略
```

あるエイリアスを削除するスクリプトは、以下のように簡単に書けます。

```bash
# Mac
# bash_alias=~/.bash/conf/alias-init.bash

# Macビルトインのsed(BSD版)
deletealias1 () {
  sed -i ''  "/^alias $1=/d" "$bash_alias"
}
# GNU-sed
deletealias2 () {
  gsed -i "/^alias $1=/d" "$bash_alias"
}
```

しかし、以下のような関数定義ファイルから特定の関数を削除するのは、複数行に渡ることから大変厄介です。吐きそうになります。

```function-init.bash
for f in $(declare -F | cut -d' ' -f3); do unset -f "$f"; done # すべての関数を削除
afunc () {
  pwd
}
bfunc () {
  echo "hoge"
}
```

## Vimで複数行を削除する
しかし、Vimでやるなら簡単です。`V`でVisual lineに入ってから`/^}`すれば、ひとつの関数を簡単に選択できます。

そこで、以下のような関数にしてみました。

```bash
# bash_function=~/.bash/conf/function-init.bash
# 与えられた関数名を検索し、}で始まる行までを選択して削除、保存して終了
deletefunction () {
  vim +"/^$1 () {" +"normal V" +"/^}" +"normal d" +"wq" "$bash_function"
}
```

一瞬Vimの画面が開くのが気持ち悪いですが、選択したところで止めたりすると確認できてむしろ良いかも。

## 削除の反映
普通.bashrcなどの初期化ファイルの更新を反映させる際には、`source ~/.bashrc`などとします。エイリアスや関数を*追加*した場合は`source "$bash_function"`で問題ないのですが、*削除（あるいは関数名変更）*した場合はこれだと反映されません。

そもそも`source`コマンドの仕組みは、引数に与えられたファイル内のスクリプトを実行しているにすぎません。関数定義コマンドを再度実行しても、カレントシェルで定義された関数が削除されることはないわけです。

カレントシェルの関数（または変数）定義を削除するには、`unset`コマンドを利用します。同様に、エイリアスの削除には`unalias`コマンドを利用します。

```
$ alias hoge=pwd
$ hoge
/Users/catfist/Documents
$ unalias hoge
$ hoge
bash: hoge: command not found

$ cd ~/Documents
$ fpwd () { pwd; }
$ func
/Users/catfist/Documents
$ unset func
$ func
bash: func: command not found

# 関数の一覧を出力
$ declare -F
declare -f afunc
declare -f bfunc
# 以下略
```

これを定義ファイルの先頭に加えることで、定義ファイルから削除された関数等が、`source`した際にカレントシェルからも削除されます。（コメント参照）

あるいは、時間がかかりますが、いっそ`exec /bin/bash`で新規シェルを起動してしまう方法もあります。この場合、変更された定義ファイルを元に、エイリアスや関数を初期化することができます。

## bashのエイリアス/関数/プログラムを編集するシェル関数
現時点では以下の通り。長いのでリンクにします。

<https://gist.github.com/e1c020a4e12ed5dce71d>

## sedでも書けた
大したことなかった。

```bash
# Mac(BSD sed)
deletefunction () {
  sed -i '' "/^$1 () {/,/^}/d" "$bash_function"
}
```

* ""内の/~/がパターン指定
* `^$1 () {`から`^}`までを読み込み（開始と終了を`,`区切り）
* `d`で読み込んだ部分を除外
* `-i`で上書き。バックアップファイルの拡張子を`''`(空)にしてバックアップしない

## 関連
* [ShellScript - bashの各種コマンドを編集するシェルスクリプト - Qiita](http://qiita.com/catfist/items/d77067983e68c18496f1)
* [Vimの起動オプションでファイルにテンプレートを追記して挿入モードに移行する - Qiita](http://qiita.com/catfist/items/11dd92300f57b261b6b3)
* [sed reference by hata](http://www001.upp.so-net.ne.jp/hata/sed_reference.html#example1)
Riot.jsのtagを非ブラウザ環境で動かす

## Riot.jsについて

[Riot.js 2.0 情報まとめ](http://qiita.com/cognitom/items/54ae38c9a50dbbe28367)を見るととてもよく分かると思う。

## ブラウザ以外でもtagを動かしたい

ガイド見る限りブラウザ上で`riot.mount`を実行することが前提のように書かれていて、tag単位のユニットテストが辛い。ユニットテストやるとして、Node.jsの上で動かしたい。

しかし、ブラウザ上で動いているもの相当の`require('riot/riot')`を単純にNode.js上で実行しても、DOMが存在しない環境なのでブロックされ`riot.mount`や`riot.tag`が生えない。

ということはつまり、Node.js上でもDOM実装さえ適切に与えれば、`riot.mount`が実行可能になる。Node.jsでDOM操作といえば、[jsdom](https://github.com/tmpvar/jsdom)である。jsdomは外部からJavaScript片を注入できるので、以下のような記述が動く。

```coffeescript
jsdom = require('jsdom')
fs = require('fs')
riot = fs.readFileSync(require.resolve('riot/riot'), 'utf-8')

jsdom.env
  html: '<div><foo /></div>'
  src: [riot]
  done: (errors, window) ->
    console.log(window.riot.mount)  # => Function
```

tagファイルはコンパイルすると`riot.tag`を実行するjsファイルに化けるので、このまま続けて注入できる。

## tagをテストする

例えばこんなtagがあるとして、

```html
<foo>
  <h3>{ opts.bar }</h3>
  <p>{ baz }</p>
</foo>
```

jsdomを使えばこんな感じでテストもできる。今回はtapeを使ったがmochaでも何でも問題ないはず。

```coffeescript
jsdom = require('jsdom')
fs = require('fs')
riot = fs.readFileSync(require.resolve('riot/riot'), 'utf-8')
compiler = require('riot')
tag = compiler.compile(fs.readFileSync('./foo.tag', 'utf-8'))
test = require('tape')

test (t) ->
  t.plan(3)

  jsdom.env
    html: '<div><foo /></div>'
    src: [riot, tag]
    done: (errors, window) ->
      [foo] = window.riot.mount('foo', bar: 'baz')

      document = window.document
      t.equal(document.querySelector('h3').innerHTML, 'baz')
      t.equal(document.querySelector('p').innerHTML, '')

      foo.update(baz: 'qux')
      t.equal(document.querySelector('p').innerHTML, 'qux')
```

これで表示と変更はテストできた。

```bash
$ coffee test/foo.tag.test.coffee
TAP version 13
# (anonymous)
ok 1 should be equal
ok 2 should be equal
ok 3 should be equal

1..3
# tests 3
# pass  3

# ok
```
nodebrewでio.jsでnode-gypを使うには


# node-gypとは

io.jsでネイティブコードを含むモジュールをインストールする際に
使われる。Cで言うところのmakeコマンド。

# nodebrew環境で動かす

バイナリーでインストールするとうまくいかない模様。

```
nodebrew install io@v1.1.0
nodebrew use io@v1.1.0
```

```
cd ~/.nodebrew/current/lib/node_modules/npm/node_modules/node-gyp/
npm link
```

これで、node-gypがグローバルに使えるようになります。

# Link

- [ node-gyp rebuild not working #433 ](https://github.com/iojs/io.js/issues/433)
Rubyで配列や文字列での末尾のインデックス指定




配列や文字列の最後の文字を取得したいときは負のインデックス値を使用する．

```ruby
  > a = [1 2 3 4 5]
  > s = "string"
  > a[-1] # => 5
  > s[-1] # => g
 
```

なんども忘れてるので覚え書き
RubyのNet::IMAPで各種のメールを取得するための設定

## 背景
管理しているメールアドレスが複数あり、それらが端末ごとに分散しているため一括管理をするためにNet::IMAPを使って処理を行うための設定方法をまとめた（ただし、自分が使っているアカウントのみ）。

## Net::IMAPの簡易コード
各アカウントにログインし、メール数をカウントするスクリプト
hostname,port,ssl,username,passwordが各種アカウントに応じて変わる。

``` ruby
imap = Net::IMAP.new(hostname,port,ssl)
imap.login(username,password)
imap.select('INBOX')
puts imap.responses['EXISTS'].last
imap.disconnect
```

## 各アカウントの設定情報

|アカウント|hostname|port|host|username|備考|
|:-:|:-:|:-:|:-:|:-:|:-:|
|さくらのレンタルサーバー|サーバー名|143|false|メールアドレス||
|icloud|imap.mail.me.com|993|true|ユーザー名のみ（@以降は不要）||
|gmail|imap.gmail.com|993|true|メールアドレス|gmailの設定で「IMAPを有効」及び「安全性の低いアプリからのアクセスの許可」の設定が必要|
|softbank|imap.softbank.jp|993|true|ユーザー名のみ（@以降は不要）|i.softbank.jpアドレスはIMAP対応（ただし、推奨されてはいない模様）|

## その他
- パスワードは各自が設定したものを使用
- softbankアカウント
 - 接続の継続時間が他のアカウントと比較して短い模様。
 - Net::IMAP#authenticateはサポートされておらず、Net::IMAP#loginでログインする必要がある。
AnsibleでMySQL導入 (CentOS 7)

Ansible には MySQLのユーザーを追加削除できる `mysql_user` がある．
しかし，使うためには少し準備が必要．具体的には，下図のようになる．

![ansible_mysql_user](https://qiita-image-store.s3.amazonaws.com/0/10713/28729039-5cba-c93a-a25b-7d2b57f73142.png)


## （例）ユーザー `wordpress` と データベース `wordpress` を生成する
変数として
- `mysql_root_password`
- `mysql_db_password`
が必要

```yaml
---
- name: MariaDB のクライアント＆サーバーをインストール
  yum:
    name: "{{ item }}"
    state: present
    enablerepo: remi
  with_items:
    - mariadb
    - mariadb-server
    - MySQL-python
  sudo: yes

- name: MariaDB を常時起動にする (サービスを有効化)
  service:
    name: mariadb
    state: started
    enabled: yes
  sudo: yes

- name: root アカウントのパスワードを設定
  mysql_user:
    name: root
    host: localhost
    password: "{{ mysql_root_password }}"

- name: ~/.my.cnf を配置
  template:
    src: my.cnf.j2
    dest: "{{ lookup('env', 'HOME') }}/.my.cnf"
    mode: 0600

- name: データベース wordpress を作成
  mysql_db:
    name: wordpress
    state: present

- name: MySQLユーザー wordpress を作成し，wordpress.* にすべての権限を与える
  mysql_user:
    name: wordpress
    password: "{{ mysql_db_password }}"
    priv: "wordpress.*:ALL"
    host: localhost
    state: present
```
【Xcode】Xcode6におけるシミュレータ内アプリ内を閲覧できるMac向けアプリを作りました。またその時の調査内容まとめ。

アプリ自体はこちら
http://blog.oneworld-inc.com/entry/2015/01/25/235914


Xcode6において、シミュレータにインストールしたアプリのDocumentsフォルダなどを
確認したい場合、なかなか手間だったりしまして。

それがめんどくさかったので、Mac上で動作するアプリとして
それらが閲覧できるアプリを作成しました。

またそれを作るにあたり調査した内容などをまとめておこうと思います。

>
~/Library/Developer/CoreSimulator/Devices/
>

まず前提として、このあたりにシミュレータのアプリ関連の情報が格納されていますが、
その直下に、
.default_created.plist
というファイルが存在します。

そのファイル内には、Devices内に含まれているディレクトリとバージョンまたデバイスとの
関連性が記述されています。

そして、そのディレクトリの中においては

>
/data/Containers/Data/Application/
>

と続いていくわけですが、
その中に各アプリケーションのディレクトリが存在しますが、
それらは乱英数字になっているため、どれがどのアプリのディレクトリか
わからない状態ですが、
各ディレクトリ内に


>
.com.apple.mobile_container_manager.metadata.plist
>

というファイルがあり、その中に、BundleIDが含まれているので、
どのアプリなのか特定ができます。
joomlaのcontactのフォームのテンプレートを選択できるようにする方法

これでいいかわからないけど、とりあえず、やってみた。

1.templates/テンプレート名/html/com_contact/contact/にcomponents/com_contact/view/contact/tmpl/default.phpをコピー
2.`<?php  echo $this->loadTemplate('form');  ?>`の上に以下を追加
`<?php
$layout_name=$this->params->get("contact_layout");
$layout_name_split=explode(":",$layout_name);
$this->setLayout($layout_name_split[1]); 
?>`
3.templates/テンプレート名/html/com_contact/contact/にdefault.phpをファイル名を変更（例えば、contact.php）
4.components/com_contact/view/contact/tmpl/default_form.phpをtemplates/テンプレート名/html/com_contact/contact/に変更。ファイル名を変更（例えば、contact_form.php）
5.管理画面のコンタクト管理のコンタクトの表示の代替レイアウトで3で選択したものを選択


もっといい方法があるかもしれないけど。

参考：[テンプレートの上書き方法](https://docs.joomla.org/How_to_override_the_output_from_the_Joomla!_core)
cocos2d-x v3で、VectorのConstructorのstatic_assertにかかった時に確認すること

今日２回も引っかかったのでメモ。

#問題

コンパイル時にCCVector.hのstatic_assertに引っかかった。

```cpp:CCVector.h
static_assert(std::is_convertible<T, Ref*>::value, "Invalid Type for cocos2d::Vector<T>!");
```

`grep Vector`してみたが、とあるヘッダファイルの

```cpp:piyo.h
cocos2d::Vector<MySprite*> mySprites; // MySpriteはcocos2d::Spriteを継承 
```

しか引っかからない。
はて、なんだろう。

#答え

`piyo.h`で`class MySprite`を前方宣言していたのでした。

`piyo.h`では`class MySprite`の使用はポインタだけだったのでC++的にはOKだけど、
cocos2d::Vector的にはRefのポインタかどうか分かんねーよ、って事だったのね。
納得。

#余談

今回は単純に`#include "MySprite.h"`で済んだけど、相互参照してたらどうするんだべ。
実装パターンを変えるしかないのかな。
Rustの文字列操作


Rustにおいて、文字列関係の型は３種類ある。

#### 文字を表す`char`

`char`はユニコードのコードポイントと一対一に対応する

```rust
let ch: char = 'a';
assert_eq!(ch as u32, 0x61);  // 32bit整数にキャスト出来る
```

#### 文字列リテラルは`&str`

文字列版のスライス
なので、変更可能ではない
    
```rust
let s: &str = "文字列";
```

#### 通常の変更可能な文字列クラスはString

```rust
let string: String = String::new();
```

`&str`と`String`は、C/C++における`const char *`なリテラルと文字列クラス`std::string`みたいなもの

`String`と`&str`は`as_slice()`と`to_string()`で交互に変換できる。
ただし、`to_string()`は新しく`String`を作り、文字列をコピーする。`as_slice()`は参照するだけなのでコストは小さい
 
```rust
"abc".to_string().as_slice();
```

Rustの文字列はutf-8の文字列でなければならない
もし変なバイトが含まれているとエラーになる

```rust
String::from_utf8(b"\xbb".to_vec()).unwrap();  // Error!
```

### 文字列操作で気をつける点

#### ２つの&strを簡単にくっつける方法は無い

リテラルなら`concat!`マクロを使うとコンパイル時にまとめてくれる

```rust
println!("{}", concat!("abc", "def", 0, 1.2));
```

リテラル以外の場合は`format!()`が簡単でおすすめ

```rust
println!("{}", format!("{}{}", "abc", "def"));
```

左側が`String`で、かつ過去を振り返らないなら"+"演算子が使える

```rust
let (a, b) = ("abc".to_string(), "def");
println!("{}", a + b);  // 今後aを参照するとコンパイルエラー
```

結論としては、`concat!`か`format!`を使うのが良い。+演算子は使える条件が厳しいので使わないほうが良い。
例外として、mutableな`String`に文字列を追加する時に使ったり出来るが、同じ意味の`push_str()`を使うほうがいいと思う

```rust
let mut c = "a".to_string();
c = c + "b";
c.push_str("c");  // push()は一文字足す、push_str(&str)は文字列を足す
```

#### 文字列のスライス操作はなるべく避け、使うときは特徴を把握する

文字列はUTF-8で格納されているので、`slice_chars(i, j)`は`O(j)`のコストがかかる。

```rust
assert_eq!("い", "あいう".slice_chars(1, 2));
```

`s[i]`のように気軽にインデックスアクセス出来ない。先頭と末尾は次のようにすると楽。
    
```rust
assert_eq!('あ', "あいう".char_at(0));
assert_eq!('う', "あいう".char_at_reverse("あいう".len()));
```

もし頻繁にインデックスアクセスを行いたい場合には、chars()で文字配列を作れば良い

```rust
"あいう".chars().collect::<Vec<char>>();
```

中のバイト列が欲しい時にはbytes()やas_bytes()を使う

```rust
println!("s[0](byte)={}", s.as_bytes()[0]);
```

#### 文字列のフォーマットはformat!()マクロで。println!()と同じsyntaxで使える

```rust
assert_eq!("0.123", format!("{:.3}", 0.123456));
```

#### 正規表現は組み込みじゃない

stdには含まれないので、ライブラリを使う事。

https://github.com/rust-lang/regex


### よく使われる文字列操作からピックアップ

#### 文字数

そのうち`char_len()`が使えるようになるかも

```rust
assert_eq!(3, "あいう".chars().count());
```


#### 文字列の結合(join)

```rust
assert_eq!("Hello World", ["Hello", "World"].connect(" "));
```

こちらは単に結合するだけ。一般のVec<T>に対するflatternメソッドとして使える

```rust
let d: String = ["Hello", "World"].concat();
assert_eq!("HelloWorld", d);
```

#### 文字列の分割

```rust
"a.b.c".split('.');  // => iterator of ["a", "b", "c"]
"a..b..c".split_str(".");  // => iterator of ["a", "b", "c"]
```

#### 置換

```rust
assert_eq!("adeade", "abcabc".replace("bc", "de"));  // replaceはin-place演算ではない。新しい文字列を作って返す
```

#### 部分文字列が含まれているか調べる

```rust
assert!("abc".starts_with("ab"));
assert!(!"abc".starts_with("cb"));
assert!("abcd".contains("bc"));
assert_eq!(Some(2), "abcde".find_str("cd"));
```

#### 部分文字列を得る

```rust
assert_eq!("b", "abc".slice_chars(1, 2));
```

#### 部分文字列の出現回数をカウントする

対応するメソッドがないのでmatch_indicesを介する

```rust
assert_eq!(2, "xabxxabxxbc".match_indices("ab").count());
```

#### trim/strip
    
```rust
assert_eq!("abc1def", "11abc1def11".trim_matches('1'));
assert_eq!("a", " 　a".trim_left());
```
【AppleScript】最初からMacのフルスクリーンモードでアプリを起動する

MacBook Air 11インチで解像度が小さいので、 ```AppleScript``` を使って、Macのアプリを最初からフルスクリーンで起動させるアプリケーションを作りました。

### Code

```Calender.app``` をフルスクリーンで起動するスクリプト

```applescript:AppleScript

tell application "Calendar"
	activate
	tell application "System Events"
		tell process "Calendar"
			click menu item "Enter Full Screen" of menu 1 of menu bar item "View" of menu bar 1
		end tell
	end tell
end tell
```

中の ```Calendar``` のところを適宜起動したいアプリケーション名にすると、そのアプリ用のスクリプトに書き換えることができます。
なお初起動の際アクセシビリティの設定が必要になります。
PowerShellを使用してChromiumを最新版に更新する

# 概要

ChromiumはChromeと違って自動更新が出来ないので、最新版に更新するバッチを組みました。

取得元はこちらです。(外部サイト)： [Download Chromium - The easiest way to download Chromium](https://download-chromium.appspot.com)

サイトを作成された方が[Googleの方](https://plus.google.com/+FrancoisBeaufort)なので、取得元として安心できるかと思います。
中身については言うまでも無いでしょう。

## 免責

掲載しているコードには、**プロセスの終了**や**ファイル、フォルダの削除**、**ネットワークからのファイルの取得**を行う命令が含まれています。使用する場合は、処理の流れ、意味や性質を良く理解した上で、自己責任で使用して下さい。当方は一切の責任を負いません。

## 構成

作成したバッチが想定するフォルダ構成は次の通りです。
今回のファイルは ```Chrome-Update.ps1``` という名前で作りました。

```directory:フォルダ構成

【どこか】
　┣【Application】 // 元の名前: chrome-win32
　┃　┣chrome.exe
　┃　┗　・・・
　┗Chrome-Update.ps1 // ここに置く

```

## 内容

ZipFile クラスを使用していますので、.NET 4.5 以上のみ実行可能です。

```ps1:Chrome-Update.ps1

Stop-Process -Name chrome -Confirm
Remove-Item -Path Application -Recurse -Force
Remove-Item -Path chrome-win32 -Recurse -Force
Remove-Item -Path chrome-win32.zip -Force
$web = New-Object System.Net.WebClient
Try { $web.DownloadFile( "https://download-chromium.appspot.com/dl/Win", "chrome-win32.zip" ) }
Finally { $web.Dispose( ) }
[System.Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" );
[System.IO.Compression.ZipFile]::ExtractToDirectory( "chrome-win32.zip", "." );
Remove-Item -Path chrome-win32.zip -Force
Move-Item -Path chrome-win32 Application -Force

```
[CDP候補]Multi-software : ソフトウェア実装の冗長化


ミドルウェア、ライブラリ、OSなどのソフトウェア実装の冗長化

##解決したい課題
glibcの脆弱性「GHOST」、OpenSSLの脆弱性「Heartbleed」、bashの脆弱性「ShellShock」といったソフトウェアの抱えるバグや不具合に起因する問題が発生した場合、単純なインスタンス冗長化では即座に問題を解決することができない。

もしシステムを停止させない場合は、脆弱性が解決されるまで問題のあるソフトウェアを稼働させることになる。またクラウドサービス事業者が提供するマネージドDBやロードバランサの詳細な内部実装についてはユーザ側からは確認することができないことが多いため、クラウドサービス事業者側の対応が完了するまで問題のあるソフトウェアを稼働させることになる。

##クラウドでの解決/パターンの説明
異なったミドルウェアや異なったOSを組み合わせて本番系システムと同様の機能を提供するシステムをあらかじめ構築しておく。これによって、一方のソフトウェア実装に問題があった場合にも即座に異なったソフトウェアで構成されたシステム上でサービスを再開させることが可能である。

この手法を実現する際にクラウドを活用することで、たとえば通常時はLinux環境で動作するシステムに相当するシステムをWindows環境上で構築しAMI化しておき、必要になった際にのみ起動することができる。

##実装
* 現行のシステム構成を確認し、それと異なるミドルウェアやOSなどのソフトウェアを組み合わせて現行のシステムと同機能のシステムを構築しAMI化する。
* 現行システムが使用するソフトウェアに問題が発見された際に、即座に待機していた同機能AMIを立ち上げる。
* たとえばWebサーバへの対応策としては、新しくアクセスを振り分ける先としてこの異なる実装のAMIから作成したインスタンスを指定する方法も考えられる。

##構造
![multisoft.png](https://qiita-image-store.s3.amazonaws.com/0/49894/5ac9c91b-7e2a-e7ca-3d8d-8f37e84e8624.png)



##利点 
* 現行システムが利用するソフトウェア上で問題が発見されても、早期にサービスを再開できる。

##注意点
* 同じミドルウェアを利用する場合でも、別OS上で動作させる場合は設定や仕様が異なる可能性があることに注意する。
* システムの保守にN倍近くのコスト(同機能システムを増やした分のコスト)がかかる。
Drawableインスタンスの参照

画面のスクロールに合わせてToolbarの背景アルファを動的に変更していて気づいたこと。

「内容が同じDrawableはいろんなところで同一インスタンスを参照している」

Androidガッツリやってる人からすると常識的なことかも知れませんが、普段あんまり意識してませんでした。

```java
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.getBackgroundDrawable().setAlpha(0.1f);
```

みたいな感じで（実際はもうちょっときちんと書いてますが）処理を書くと、Toolbarの背景と同じ背景色を指定しているViewが軒並み透過してしまいました。確認できたのはNexus5（Lollipop）なので、バージョン依存でしょうか。同じActivityだけじゃなく、別Activityでも同一のThemeを設定している場合は上記の影響がそのまま残ってしまう模様。
Toolbarの背景なんてだいたいcolorPrimary指定してるから、影響でかくてちょっと焦ってしまいました。

今回は以下のように書いて回避。もうちょいいい方法ないかな？

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    // いろいろ初期化
    
    
    // 明示的にDrawableをnewしてToolbarの背景に設定する。
    Drawable drawable = new ColorDrawable(getResources().getColor(R.color.toolbar_bg));
    mToolbar.setBackground(drawable);
}
```

ViewTreeObserverとか使わないとダメかもと思いましたが、ひとまずこれで動いてるので、まあよし。


2015/02/13 追記
コメント欄で指摘していただきましたが、Drawable.mutate()で変更を他の箇所に影響させない、ということができるようでした。
インスタンスを複製するわけじゃなく、Constant stateに変更を通知させないって理解でいいのかな。

```java
mToolbar.getBackground().mutate().setAlpha(0.1f);
```
みたいな。コードすっきりした！
2015/2/10勉強したこと(RUBY編)

■やりたいこと
RUBYでwebサービス(SNS系)を完成させたい。

■勉強予定
未定。やれる時にやる。

■教材
ドットインストールプレミアムvar
→文字起こし　ソース確認ができてとても便利。月額880円(?)はとても安い。


〜勉強流れ〜
■ターミナル編

ターミナル(unix)が理解できていないのでそこから勉強。
→普通の人はターミナルなんて使用しない。


・ディレクトリ移動

(例)
ディレクトリをdesktopへ移動
cd /Users/○○○/desktop

・現在のディレクトリ確認
pwd


・ruby実効方法
ruby ファイル名.ruby

#ruby最新verへupdate

##現在のver確認
ruby --version

・update方法

参考サイトより
http://qiita.com/ryam/items/73ae65fc430c2e99cb83

##Xcodeのインストール
AppStoreからXcodeをインストールする。インストール後、Xcodeを一度起動して、利用規約の同意等をすませておく。

→これをターミナル側からxcodeの同意をしようとしていたらわけが分からず、時間がたった。
早くすべき。

##homebrewのインストール

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

##rbenv等のインストール

brew install rbenv
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.profile
brew install ruby-build
brew install rbenv-gemset


##readlineのインストール

brew install readline


###ターミナルを再起動。


##Ruby 2.2.0のインストール

rbenv install 2.2.0


##現在のver確認
ruby --version
vimで特定の文字列を含む行内の文字列を置換する

## 概要

文字列'hoge'が含まれる行において '123' を '456' に置換したい



## 実行例

```bash
$ cat hoge.txt
aaaaaaaa123
bbhogebb123
cccccccc123
ddhogedd123
eeeeeeee123
```
こんなファイル:`hoge.txt`があったとして`vim`でひらく。

```bash
$ vim hoge.txt
```
以下を実行。

```vim
:g/hoge/s/123/456/g
:wq!
```

`cat`でひらく。

```bash
$ cat hoge.txt
aaaaaaaa123
bbhogebb456    ←
cccccccc123
ddhogedd456    ←
eeeeeeee123
```

のように__`hoge`が含まれる行の`123`が`456`に変わって__いる。

もちろん正規表現も使えるので__`hoge`が含まれる行の先頭に文字列`foo`を入れたい__という場合は

```vim
:g/hoge/s/^/foo/
```

といった具合でOK。


## 所感
結構使うのにすぐ忘れるのでメモ。特に行先頭へのコメントアウトを一括で行う時は便利。
Rundeckのコマンド実行結果でマルチバイト文字が化ける

コマンド出力が UTF-8 なマルチバイトの文字を含むと、そこが ? に置換されてしまう。

これは、既知の問題らしく、https://github.com/rundeck/rundeck/issues/222 で議論されており、2015-01-30 にリリースされたv2.4.1 で修正済み。

ただし、Rundeck のロケールが UTF-8 な charset でないとだめ。

/etc/default/localeなどでシステムのロケールが

``` 
LANG="en_US.UTF-8"
```

のようになっていてもだめなら、/etc/rundeck/profile に

```
LANG=en_US.UTF-8
export LANG
```

あるいは 

```
LANG=ja_JP.UTF-8
export LANG
```

を追加して起動する。
[zsh]動画のフォーマットを一括変換する短いワンライナー

以下のワンライナーは、カレントディレクトリ以下のflvをmp4に一括変換します。
コードを短くするためにzshの機能を使っています。

# `for f (*.flv) ffmpeg -i $f:r{*,.mp4}`

一般化した表現は以下のようになります。

```zsh
CODEC_FROM=flv
CODEC_TO=mp4

for f (*.$CODEC_FROM) ffmpeg -i $f:r{*,.$CODEC_TO}
```

### なぜ動くのか

- for文とffmpegの組み合わせ
- `for name ... ( word ... ) sublist`はzshの短縮for文
- `$val:r`のように変数に__:r__を付加すると`filename($val)`と同じ意味になる
- グループ識別子の`{}`を使って部分的に異なる引数を記述している。通常なら`ffmpeg -i video.flv video.mp4`と書くべきところを`ffmpeg -i video.{flv,mp4}`と書くことが出来る。
- 今回は最初にファイルを絞込んでおり、インプットする動画の拡張子は指定する必要が無いので、ワイルドカードを指定して記述を省略している。

### 変化形

#### カレントディレクトリに動画しか無い状況で、すべての動画のフォーマットを統一する

```zsh
CODEC_TO=mp4
for f (*) ffmpeg -i $f:r{*,.$CODEC_TO}
```
AndroidからOAuth2を使ってGoogle SpreadSheetへアクセスする方法

SpreadSheetなどのGoogle Docsへのアクセスの情報は、新旧入り乱れてカオスになってます。
現時点では以下の流れが一番シンプルにできますた。

```java:MainActivity.java
        //※ここにユーザーアカウント選択画面があると素敵だと思います。

        //oauth tokenの取得
        String token;
        try {
            token = GoogleAuthUtil.getToken(this, "shikajiro@gmail.com", "oauth2:https://spreadsheets.google.com/feeds");
            Log.i("TAG", token);
        } catch (UserRecoverableAuthException e) {
            //最初のアクセスの場合かならずここに来る。
            //ユーザーに承認を求める画面が表示される。
            startActivityForResult(e.getIntent(), USER_RECOVERABLE_AUTH);
            return;
        }catch (IOException | GoogleAuthException e) {
            Log.e("TAG", "", e);
            return;
        }

        //Spreadsheetへアクセスするサービス
        SpreadsheetService service = new SpreadsheetService("applicationName");
        service.setProtocolVersion(SpreadsheetService.Versions.V3);
        service.setAuthSubToken(token);//tokenを設定

        //プライベート権限のシート全てにアクセスして、とりあえずタイトル表示する。
        try {
            URL url = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
            SpreadsheetFeed spreadsheetFeed = service.getFeed(url, SpreadsheetFeed.class);
            Log.i("TAG", spreadsheetFeed.getTitle().getPlainText());
            for (SpreadsheetEntry entry : spreadsheetFeed.getEntries()) {
                Log.i("TAG", entry.getTitle().getPlainText());
            }
        } catch (IOException | ServiceException e) {
            Log.e("TAG", "", e);
        }

    }

    @OnActivityResult(USER_RECOVERABLE_AUTH)
    void onResult(){
        callOauthToken();
    }
```

AndroidAnnotationを利用して書いています。雰囲気で読んでください。

https://console.developers.google.com/project
で以下みたいなクライアントIDも作っておく必要があるかもしれない。ないかもしれない。
![Screen_Shot_2015-02-10_at_19_21_28.png](https://qiita-image-store.s3.amazonaws.com/0/16532/e6116da3-5eb2-699d-b9ca-6aa3c957b5a5.png)
sublime text3で使ってるパッケージと設定

つい先日sublime text2の記事書いた気がしますが早くも3にしました。
F12の宣言元ジャンプがしたかったんですよ。。
私はこれのおかげでCTagsを使わなくなりました。

# 文字コード

* ConvertToUTF8

UTF8に変換・再読み込みできるようになる。

# ローカライズ

* Japanize

メニューのFileとかをファイルに変えてくれる。
全部ではないよう。

# 入力

* IMESupport

sublime textはデフォルトだと日本語入力中はミニウィンドウが画面の端っことかに表示されて、そこに入力中の文章が表示される。
そんなことにならないためのパッケージ。
IME以外でも使えます。

# バージョン管理

* SVN

有料だけど無期限で試用できる。
たまに「買う？」ってダイアログが出るが、もう少し様子を見たいのでキャンセル。

# 設定

```
{
  // ミニマップを常に表示
  "always_show_minimap_viewport": true,

  // ミニマップの枠を表示
  "draw_minimap_border": true,

  // スペース、タブを見やすくする
  "draw_white_space": "all",

  // フォントサイズ
  "font_size": 10,

  // 編集中の行をハイライト表示
  "highlight_line": true,

  // 編集した行をハイライト
  "highlight_modified_tabs": true,

  // いつのまにか居た...
  "ignored_packages":
  [
    "Vintage"
  ],

  // 行番号から編集部分までのマージン
  "margin": 0,

  // タブをスペースに置き換え
  "translate_tabs_to_spaces": true,

  // 折り返し表示
  "word_wrap": false
}
```
管理者権限でメモ帳を開いてhostsを編集するコマンド

Windowsでhostsを修正するのにいつも手間取ります。
メモ帳を管理者権限で開いて、[ファイル]->[開く]からhostsまで辿って・・・ってやってました。

Qiitaさんで調べたところ、管理者権限でメモ帳を開く方法は以下が参考になります。

- [手っ取り早く管理者権限のメモ帳などを起動する](http://qiita.com/fernet/items/cda95fe586a3613e30cf) (fernet様)
- [hostsを管理権限で編集するショートカットを作成する](http://qiita.com/goosys/items/75d6d2f3f8f437725707) (goosys様)

いいですね！

さらに、コマンドで管理者権限で起動する方法を教えていただきましたので

- [WindowsのPowerShellを管理者権限で起動する方法](http://qiita.com/syui/items/7d42d7e691010ee212fb) (syui様)

それを参考にさせてもらって、管理者権限のメモ帳でhostsを開くコマンドがこちらになります。

```
powershell -NoProfile -ExecutionPolicy unrestricted -Command "start notepad C:\Windows\System32\drivers\etc\hosts -verb runas"
```

Win + r で「ファイル名を指定して実行」に上記コマンドを入れればメモ帳が開きます。
好きなところ嫌いなところ（Java界隈編）

# 好きなところ嫌いなところ（Java界隈編）

個人の見解です。

## Java

基本的には言語仕様とOracleJavaをターゲット

### 好きなところ

* 静的型付けなのでスキルセットのよくわからないメンバーで大量生産する際にコーディングをコントロールしやすい。
* フレームワークの成熟度が高いモノがおおい。
* 実行環境がシンプルで、運用が楽。
* 歴史がある＝ノウハウ、ライブラリ、プラクティス、ナレッジ、ツール、開発者がいっぱい


### 嫌いなところ

* やたらInterfaceつくる、つくりたがる
* setter、getter
* JavaEEは仕様が重すぎる
* コード記述が冗長になりがち（最近はそうでもなくなってきつつあるが）
* オブジェクト指向言語にあと一歩な感じ（プリミティブ、NULLの許容）
* クラス数が多くなりがち→コンパイル、ビルドがおそい。
* GCがらみのパフォーマンス問題。地道に調べるしかないけど。大体実装が悪いことがおおいけど
* 手軽さがイマイチ。スクリプト言語ぐらいの勢いでささっと使えることもできれば。groovy使えばいいんだろうけど
* DIいるかな？


## Spring Framework

### 好きなところ

* 設定要素が（だいぶ）減ってきた。Config Less、XML Less
* 大きな組織が面倒見てる
* 一応まだ開発が活発


### 嫌いなところ

* サブプロジェクトが多すぎる。Mavenの依存関係がたまにわからなくなる
* ロガーがjava.utilの実装。替えられるけど、一手間必要。
* JavaEEの仕様と独自の仕様がまぜこぜ
* （Webアプリケーションに対して）フルスペックじゃない（ORM、MVC2などIoC以外は弱いかサードパティーになっちゃう）。

## Tomcat

### 好きなところ

* シェアおおい
* （僕の感覚で）ミニマム。
* コンテナをjarファイルに埋め込みできる

### 嫌いなところ

* Cookieが使えない場合、JSESSIONIDをURLにつけるとこ（Tomcatだけが悪いんじゃないけど）
* セキュリティバグ多い（他のが少ないというわけではない）
* コンソールログがcatalina.outへ垂れ流しなところ

## JBoss

### 好きなところ

* 起動がだいぶ早くなった
* EEの仕様を満たしているので、EEのFullProfileのサービスが使える（あんまり使うことはないけど）。


### 嫌いなところ

* WebコンテナのServletの実装がいけてない。リクエストパラメータのKEYがなければ、エラーになっちゃう
* 設定めんどくさい。特にmoduleあたり。デプロイモジュールにないjarが優先されるケースがある
* IDEとの統合ツールが重厚
統計学の代表的な手法を実践する (4) 〜 因子分析

[前回](http://qiita.com/ynakayama/items/26880de6676bb3bf685d)までロジスティック回帰の話でしたが今日は因子分析の話です。

最初に掲げた[一般化線形モデル](http://qiita.com/ynakayama/items/bd0b65716279ae2df957)の表を参照してください。

因子分析とは、複数の変数があったとき、その背後にそれらに影響する構成概念があるものと仮定し、少数の潜在的変数で複数の変数間の関係を説明しようというものです。

このように少数の変数へと変換することを縮約、またこの構成概念を説明する潜在的変数を因子と言います。因子分析は背後に共通した因子が想定できる変数を縮約し、新しい量的な変数を作ります。

このような伝統的な統計手法はすでに解説しているサイトがたくさんあります。たとえば次のページなども参考にしてください。

株式会社NTTデータ数理システム S+rescue Chap6 因子分析
http://www.msi.co.jp/splus/learning/rescue/factor.html

## 因子分析をやってみる

昨今では Python が機械学習やデータマイニングなどの分野で台頭していますが、古典的な統計分析手法に関してはやはり R 言語が豊富なライブラリ資産を抱えており充実しています。無理に Python を使わずここは R でやってみたいと思います。

今回はサンプルデータとして総務省統計局の[世界の統計 2014](http://www.stat.go.jp/data/sekai/0116.htm) から 3-5 国内総生産の実質成長率を利用しました。最近ではこのように統計のサンプルとしてちょっとした加工ですぐに利用できるデータがあちこちに公開されていますので何かと便利ですね。

データのイメージは以下の通りです。各国の 2012 年の GDP 成長率を抽出してあります。なお加工後のデータは[こちら](https://github.com/ynakayama/sandbox/blob/master/r/stats/sample_data.csv)です。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/e962f9aa-aa07-5281-0130-5ee821152262.png)

因子分析ではあらかじめ因子数を与える必要があります。結果を 2 次元のバイプロットで表示したいので因子数は 2 としましょう。これは A と B という 2 つの何らかの独立した隠れた変数によって決まると仮説を立てたことになります。もちろん因子分析では 3 でも 4 でも好きなように因子数を与えることができます。

ソースコードは以下の通りです。なお[こちら](https://github.com/ynakayama/sandbox/blob/master/r/stats/fa.R)にソースコードを公開しています。

```r
# CSV ファイルを読み込む
df = read.csv("sample_data.csv")

# 1 列目を列名にする
row.names(df) = df[,1]

# 2 〜 8 列目をデータフレームにする
df = df[,2:8]

par(xpd=TRUE)
# prcomp してバイプロットして可視化する
biplot(prcomp(df, scale=TRUE))

# factanal で因子数 2 で因子分析する
factanal(x = df, factors = 2)
```

まずはバイプロットの結果を見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/1759579f-0726-242a-f273-81cc4073a02f.png)

PC1 (第一主成分) と PC2 (第二主成分) という二変数に分解できました。

また R での出力は次のようになります。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/9d2fd019-6ffb-c9a5-98eb-9ed0f1748423.png)

|出力|意味|説明|
|:--|:--|:--|
|Uniquenesses|独自性|各変数の潜在因子で説明できない部分|
|Loadings|因子負荷|観測変数に対して共通因子がどれくらいの強さで影響を与えているか|
|SS loadings|因子寄与|因子負荷の平方和|
|Proportion Var|因子寄与率 (分散説明率)|その因子がデータをどれだけ説明できているか|
|Cumulative Var|累積因子寄与率|因子分析した諸項目に対する因子の影響力|

また各変数と因子空間との相関を共通性、各変数と各因子の相関を因子負荷量と言います。

出力の一番下は適合性の検定をおこなっています。これは 2 因子モデルが元のデータにあてはまっているかどうかということを指しています。

この場合ですとカイ二乗値は 13.82 、自由度は 8 、 p 値は 0.0867 となります。

また共通性を求めるには因子分析の独自性を 1 から引けば求まります。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/38501/7f661053-f29f-bfff-df9a-ecebc18a4c44.png)

共通性が高いということは、因子で説明できる部分が大きいということを意味しています。

## 主成分分析と因子分析の違い

**主成分分析 (Principal Compotent Analysis)** と **因子分析 (Factor Analysis)** の差異はしばしば話題になります。

上に紹介したサイトでも少し触れられていますが、

主成分分析のモデルは

```math
PC_i = l_{i1}X_1 + l_{i2}X_2 + ... + l_{in}X_n
```

であり観測変数を原因系として、合成変数として作られた主成分が結果系です。

これに対し因子分析のモデルは

Xi = 変数
λin = 因子負荷量
Fn = 因子
μi = 誤差 (独自因子)

とすると

```math
X_i = \lambda_{i1}F_1 + \lambda_{i2}F_2 + ... + \lambda_{in}F_n + \mu_i
```

であり、主成分が結果変数である主成分分析と比較すると、因子が原因変数である因子分析は因果関係を異にすると言えます。

## まとめ

今回は因子分析の話をしました。次回に続きます。
CircleCIでDockerコンテナ上でテストするときに環境変数を渡す


CircleCIでDockerのイメージをつくって、つくったイメージをつかってテストを実行している。
しかし、CIで使えるサービス類の一部が使えなかったりすることがおきていてつらい。
環境変数をコンテナに引き継ぎして、渡してやればなんとかなるものもいくつかある。

しかし、テストを実行するコマンドが長くなって、保守はしにくいしつらい。
そこでスクリプトをかいた。

```bin/ci_test
#!/bin/sh

IMAGE="eiel/hoge"
CMD="bin/rake"
OPTIONS="-it --link my-db:db"
ENVS="CODECLIMATE_REPO_TOKEN"

DEFAULT_ENVS="CIRCLE_ARTIFACTS CIRCLE_BRANCH CIRCLE_BUILD_NUM CIRCLE_COMPARE_URL CIRCLE_NODE_INDEX CIRCLE_NODE_TOTAL CIRCLE_PREVIOUS_BUILD_NUM CIRCLE_PROJECT_REPONAME CIRCLE_PROJECT_USERNAME CIRCLE_SHA1 CIRCLE_TEST_REPORTS CIRCLE_USERNAME CIRCLECI CI"

ENVS="$ENVS $DEFAULT_ENVS"

env_options=""
for env in $ENVS
do
  ENV_OPTIONS="${ENV_OPTIONS} -e ${env}=`printenv $env`"
done

docker run $OPTIONS $ENV_OPTIONS $IMAGE $CMD
```

`docker run -e HOGE=$HOGE -e GORO=$GORO -e MOGU=$MOGU ....` となってつらいのでそれをなんとかするためにやっている。
もっと良い方法があれば教えて欲しい。

### もっと詳しく

```
Coveralls git error:
undefined method `gsub' for nil:NilClass
/usr/local/bundle/gems/coveralls-0.7.1/lib/coveralls/configuration.rb:72: warning: File.exists? is a deprecated name, use File.exist? instead
```

とかでていてつらかった。git関連のデータはコンテナの中にはないからだ。

ソースコードをみていたら環境変数を引き継ぎしておくとある程度は対処できそうだった。

* https://github.com/lemurheavy/coveralls-ruby/blob/master/lib/coveralls/configuration.rb

とりあえず、CircleCIでstart containerに表示されていた変数を引き継いでいる。

あとはCIとCIRCLECIを追加している。
CoreDataによる並列処理


## CoreDataによる並列処理

### 注意点

基本的に以下の２点に注意する必要がある。

- `NSManagedObjectContext`はスレッドセーフではない	
- `NSManagedObject`はスレッドセーフではない

### ベストプラクティス

- `NSManagedObjectContext`はスレッド(キュー)を指定して生成する。

``` objc
// メインスレッド用のNSManagedObjectContext
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

// バッググラウンドスレッド用のNSManagedObjectContext
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
```

- `NSManagedObjectContext`及び`NSManagedObject`の利用は`performBlock:`又は`performBlockAndWait:`のブロック内部で行う。

``` objc
// 非同期で処理を行う
[moc performBlock:^{
    // 非同期処理
    [moc save:nil];
}];

// 同期で処理を行う
[moc performBlockAndWait:^{
    // 同期処理
    [moc save:nil];
}];
```

- `NSManagedObjectContext`を親子関係で利用する。

> [Multi-Context CoreData](http://www.cocoanetics.com/2012/07/multi-context-coredata/)

＊公式ドキュメントである[Core Dataプログラミングガイド - Apple Developer](https://developer.apple.com/jp/documentation/CoreData.pdf)の`Core Dataによる並列処理`を確認すると先頭に以下のように書いてあって参考にならない。

> Important: Core Dataによる並列処理のべストフラクティスは、この資料を執筆した当時から大き く変わりました。現在てはこの章の内容を推奨していませんので注意してくたさい。

# デバッグ（←これが重要）

Xcodeの起動時引数に`-com.apple.CoreData.ConcurrencyDebug 1`を指定して起動すると並列処理違反時に例外が発生して教えてくれる。

![coredata_debug.png](https://qiita-image-store.s3.amazonaws.com/0/25832/ca4e72fa-7e9d-da49-4a23-a59945e497b4.png "coredata_debug.png")


詳細は[Core Data Concurrency Debugging](http://oleb.net/blog/2014/06/core-data-concurrency-debugging/)
Railsでnested_attributes_forとlengthに関するvalidationを共存させる

数日に渡る調査と試行錯誤の末、自分が期待する動作の実装方法がようやく分かったので、ここで共有します。

#課題

- `user`の`equipment`を5個に制限したい。
- `equipment`を既に5個持っている`user`に対して、「`equipment`を1個削除」と「`equipment`を1個追加」を同時に行いたい。


```app/models/equipment.rb
class Equipment < ActiveRecord::Base
  belongs_to :user
end
```

```app/models/user.rb
class User < ActiveRecord::Base
  has_many :equipments
  accepts_nested_attributes_for :equipments, allow_destroy: true
  validates :equipments, length: { maximum: 5 }
end
```

`validates`の`length`を使うとシンプルに書けるのですが、これだと課題に上げた処理をした場合に`validation error`が出ます。

#実現方法
対象となる`association`の`length`を呼ぶ前に
`.reject(&:marked_for_destruction?)`
で削除対象となる`instance`を除外します。

##具体例1: `length`を再定義する

```app/models/user.rb
class User < ActiveRecord::Base
  has_many :equipments do
    def length
      reject(&:marked_for_destruction?).length
    end
  end
  accepts_nested_attributes_for :equipments, allow_destroy: true
  validates :equipments, length: { maximum: 5 }
end
```

##具体例2: `validation`したい内容を`method`として定義する

```app/models/user.rb
class User < ActiveRecord::Base
  has_many :equipments
  accepts_nested_attributes_for :equipments, allow_destroy: true
  EQUIPMENTS_MAX_LENGTH = 5
  validate legth_of_equipments

  def length_of_equipments
    equipments_length = 0
    if equipments.present?
      # ↓ここのrejectが肝でした。
      equipments_length = equipments.reject(&:marked_for_destruction?).length
    end
    errors.add(:equipments, 'too many') if equipments_length > EQUIPMENTS_MAX_LENGTH
  end
end
```

以上です。
誰かのお役に立てれば幸いです。
もっとスマートな方法がありましたら、教えて頂けると嬉しいです。

#参考
http://homeonrails.com/2012/10/validating-nested-associations-in-rails/
Android Studioにて GitHubとの連携を試す。

Android Studioについては、GitHubというメニューがあるくらいなので
VCS → Checkout from Version Control → GitHub
VCS → Import into Version Control → Share Project on GitHub

試してみます。

今回は
Share Project on GitHub
を。

まずはログインを求められ、その次に、
新しいリボジトジ名を入力を求めれれます。
(プロジェクトを開いている場合でしたら、そのプロジェクト名が初期でセットされています)

![スクリーンショット 2015-02-10 18.14.32.png](https://qiita-image-store.s3.amazonaws.com/0/35343/d3f302e0-0ebb-3a0f-96df-290760df9914.png)

shareのボタンを押すと、
初回コミット対象のファイルの選択画面が表示されます。

![スクリーンショット_2015-02-10_18_15_22.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/38b8effd-398d-4a83-6151-fa785edd8054.jpeg)

不要と思われるものについてはチェックを外していいかと思います。

で、OKを押すと、pushが行われるようです。
(成功したら、通知がきます)

これでひとまず最低限の連携を終わったわけですが
この後、例えばファイルの編集を行うと、

![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/e29cc117-b202-17b0-cd0a-cc2b2be9e6f6.jpeg)

変更行にマークがついたり、メニューを表示させて、ロールバックができたりします。

さらに、Android Studioには、terminalがあるので、

![スクリーンショット_2015-02-10_18_35_14.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/3a8d51fb-878f-6b18-6447-0a4344cb1d89.jpeg)


そこから、当たり前ですが、
add
commit
push
も可能です


でさらに、、

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/35343/74433d0b-42e7-c78a-17dd-1a6f42743040.png)



Show Diffenceで差分も見れます。



![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/35343/c94ab155-504b-46b1-7f40-86fd14d65cd0.png)

便利ですね。
好きなところ嫌いなところ（SCM編）

# 好きなところ嫌いなところ（SCM編）

個人の見解です。

## 私のステータス

* SCM は CVS から使い出した。
* 楽観的排他処理、悲観的排他処理（Microsoft Visual SourceSafe）も使ったことある。
* Subversion は早10年ぐらい使っている。
* git は個人的に github をちょっと使っている。
* やっと git を 1 年ぐらい運用してみた。

## Subversion

### 好きなところ

* 集中管理なので、マネジメントしやすい。一括置換とかやりやすい。
* GUIのツールでデファクトがある。Windowsならファイルシステムと統合されたツールがある（操作のハードルが低い→言い方悪いけどアホでも使える）。
* （集中管理なので）Gitに比べたら概念・思想とか操作がわかり易いから導入ハードルが低い。説明もしやすい
* （好きなところというわけではないけど）利用期間が長いから運用ノウハウが溜まってる。

### 嫌いなところ

* ローカルコミットできない。ローカルコミットできる様にするのにサードパーティのツールが必要。
* MacではGUIツールのデファクトがない（Versionsもイマイチだし）。ファイルシステムと統合できていない。
* Apache わざわざ入れて運用しないといけない（別にsvnプロトコルでもいいんだけど）。しかもWebDAV。
* 下火なのでインターネットでの情報量がへってる
* デファクトのワークフローがない。

## Git

* [Gitワークフロー](https://www.atlassian.com/ja/git/workflows#!workflow-overview)
 
### 好きなところ

* ローカルコミットできる。
* 分散管理なので、利用者個人にマネジメントを委譲できる。
* GUIのツールでデファクト（今だとSourceTreeかな）がある。
* GitHubというデファクトのサービスがある。リポジトリ運用のプラクティスとか有用なツールとかがが転がってる。
* オープンソースの開発スタイルにはベストマッチなところ
* コミットされたブランチが不安定になるのを避けることが可能（運用次第。可能性が低くなるのはその通り）。ただし、ブランチが不安定になることがそれほど致命的でない（少人数・活動時間に差がない）場合は、gitである必要性が薄くなる（結局トレードオフの問題）。
* ワークフローにデファクトプラクティス（git-flow）がある。ただし、git-flow コマンドでブラックボックスになるので、なんか違うことやりたかった場合に git コマンドを駆使して戻す必要がある。



### 嫌いなところ

* Webインタフェース（gitbucket、gitlabなど）ないとなかなか使いづらい。Gitがスゴイのではなく、GitHubがスゴイと思う。
* マージめんどくさいことがおおい（マスタからの乖離度合いが大きくなりがち）。
* PCのファイルシステムと統合できるツールがまだあまりいいのがない
* リビジョン番号が番号じゃないからポインティングを口頭でできない
* リポジトリ肥大する
* Redmineのリポジトリで使うのにめんどくさい
* リポジトリがUnicodeじゃない（Subversionもだけど）。
MacのChromeで  ⌘Q (Command+Q) で誤って強制終了してしまうのを防ぐ方法


まちがってやってしまうこと、よくありますよね。

私は `⌘W` (Command+W)でタブを閉じようとしたときに間違ってChromeを終了してしまう事がよくありました。

そんなときは、Chromeの設定で `⌘Q` を押したときに、警告が出るようにできます。

以下の画像のようにできます。


![スクリーンショット 2015-02-10 18.20.20.png](https://qiita-image-store.s3.amazonaws.com/0/30588/741e6570-8fb1-89c6-61b6-7ba3d89f182b.png "スクリーンショット 2015-02-10 18.20.20.png")


これで、少し安心して作業できますね！
Apacehユーザを含むグループを編集したらApacheの再起動が必要

Redmine と subversion を連携する際にハマったので備忘録的なメモ。

環境は以下。

CentOS  6.6
Apache  2.2.15
Redmine 2.6.1

Redmine と subversion は同一のサーバにインストールした。

## Redmine と subversion の連携のために実施したこと。

・リポジトリは、/var/repos に作成する。

```
ex)
 # svnadmin create /var/repos/test-repo
```

・リポジトリ毎にグループを作成し、リポジトリのグループを作成したものに変更する。

```
ex)
 # cd /var/repos/
 # groupadd testgroup
 # chown -R root:testgroup test-repo
```

・作成したグループには、操作が必要なユーザを参加させる。
　Redmineでもリポジトリを参照できるようにする為、apacheユーザも含める。

```
ex)
 # gpasswd -a user1 testgroup
 # gpasswd -a apache testgroupz
 # id apache
   uid=48(apache) gid=48(apache) groups=48(apache),XXX(testgroup)
```

・Redmine からは、file:/// で参照するようにする。

## Redmine で表示できない・・・。

Redmineのプロジェクトページからリポジトリを参照するも、NotFoundが出てしまった。
また、apacheのerror_logに以下が出力されていた。

```
App 7338 stderr: svn: Unable to open repository 'file:///var/repos/test-repo'
App 7338 stderr: svn: Can't open file '/var/repos/test-repo/format': Permission denied
```
Permission denied と言われているが、testgroupには apache ユーザは追加されている。
ここで、いろいろいじくり回してみたが解決しない。

## apache の再起動が必要だった。

ふと思いつき、apache の再起動を行ったところ、Redmineからもリポジトリが参照できるようになった。
どうも、グループなどの変更は再起動しないと読み込み直してくれないらしい。
もしかしたら当たり前のことかもしれないけど・・・。
sshでダウンロード・アップロード

###【sshダウンロード】

```
scp -r [ユーザー]@[IP]:[ディレクトリ] [ダウンロードするとこのパス]
```

>例：scp -r corpme@333.333.33.33:httpdocs/wp-content/themes/corpme Desktop/corpme



###【sshアップロード】

```
scp -r [アップロードするファイルのパス] [ユーザー]@[IP]:[ディレクトリ]
```

>例：scp -r Desktop/corpme corpme@333.333.33.33:httpdocs/wp-content/themes/
構成管理（SCM）を選択する際の判断軸

# SCM を選択する際の判断軸

2019年4月時点では、記載の要件を Git がほぼほぼ満たせるようになったので、これから SCM を選択する際に、 [Subversion](https://subversion.apache.org/) を理由なしに選択することはないと思います。
特に [GitHub](https://github.com/)、[GitLab](https://gitlab.com/) などの統合型のツールや GUI 、関連（連携）する機能の整備も十分されてきているため、ほぼデファクト・スタンダード化しているかと。

そうなると、天の邪鬼的になにか違うのが使いたくなる。。。

バイナリファイルを悲観的排他処理で管理できるオープンソースの SCM がほしい。

## 前提

* スキルレベルが一様でない組織で利用。
* 管理物をインターネット上に載せられないれないものもある。

## SCMの選択肢

利用するSCMは以下のいずれか。

* [Git](https://git-scm.com/)
* [Subversion](https://subversion.apache.org/)

### 選択肢に上げなかったSCM達

* [Mercurial](https://www.mercurial-scm.org/)
  * あんまり日本（身近で）で流行ってない。あんまり見たことないぐらいの雰囲気。
* [Bazaar](http://bazaar.canonical.com/en/)
  * Bazzar: 日本語使えるけど、GUIのクライアントがいけてない。
* CVS: 古い。トランザクション管理できない。

## 要件

* 中央管理がしたい。ソースコードを一括置換とかをする場合がある。
* リビジョンのポインティングを（簡易に）行いたい。
* コードレビューをしたモノだけがリポジトリに登録されなければいけない
* スキルセットが似たり寄ったりの開発者数名で開発する
* どんなスキルセットもってるかわからない開発者が数名〜数十名で開発する
* Reddmineと統合する
* Jenkinsと統合する
* 全てのコードに対してコードレビューが不要。コードレビューが不要なスキルレベルのメンバーがいる。
* 開発ラインが多数発生する

## git の目指すべきところ

* コミットされたブランチが不安定になるのを避ける