OmniAICreator/Qiita-1.07M huggingface dataset:
GitLab 7.xからGitLab 8.0にアップデートする方法 (GitLab CIあり編)

GitLab 8.0でGitLab本体に取り込まれたCI機能を活用するため、GitLab CEのアップデートを行なう手順をまとめました。

## 前提
- GitLab 7.xを利用している
    - 試験したのは7.14.3
- GitLab CI 7.xを利用している
- GitLab CIがインテグレートされたGitLab 8.0を利用したい
- omnibus-gitlabパッケージを利用している
- RedHat系(Red Hat Enterprise Linux, CentOS etc.)またはDebian系(Debian, Ubuntu etc.)のLinux OSを利用している
    - 試験したのはCentOS 7.1 (1503)

## 手順
[Migrate GitLab CI to GitLab CE or EE - GitLab Documentation](http://doc.gitlab.com/ce/migrate_ci_to_ce/README.html)を読んで、素直にやっていけばよいが、インストール方法がomnibus-gitlabとsourceのものが混在していたりするので、

### 通常どおりの手順
通常どおりのアップデート手順

```shell-session
$ sudo yum update gitlab-ce
```

### GitLab CI 8.0をGitLab CE 8.0のCIへマイグレートする手順
[タイトルが何を言ってるか分からない](https://gitlab.com/gitlab-org/gitlab-ce/issues/2737)という意見もある通りだが、GitLab 8.0の段階でデータの移行が発生するので、以下の作業を行なう。

#### 1. GitLab CIを一時的に無効化する
`https://[gitlab-server]/admin/application_settings`にアクセスして、[Continuous Integration]セクションの「When unchecked CI is disabled until rake ci:migrate is run (8.0 only)」のチェックを外す。ちなみに、以降の作業を実施すると、再び、チェックが入ります。

#### 2. GitLab CIからCEへデータ移行し、GitLab CIを再度有効化する
CI関連のプロセスを停止。

```shell-session
$ sudo gitlab-ctl stop ci-unicorn
$ sudo gitlab-ctl stop ci-sidekiq
```
シークレットトークンを取得して、 `/etc/gitlab/gitlab.rb` に転記。

```shell-session
$ sudo gitlab-ci-rake backup:show_secrets
```

GitLab CEパッケージアップデート直後なら、不要かもしれないが、バックアップを取る。

```shell-session
$ sudo gitlab-ci-rake backup:create
```

バックアップファイルを適切な位置に移動（上記を省略してもこの手順は必要）。

```shell-session
$ sudo mv /var/opt/gitlab/ci-backups/*_gitlab_ci_backup.tar /var/opt/gitlab/backups/
```
リカバリするバックアップファイルを設置。

```shell-session
$ sudo gitlab-rake ci:migrate
```
を実行すると、以下の通り、確認されるので、問題ないことを確認して `yes` を入力。

```
This will remove all CI related data and restore it from the provided backup.
Do you want to continue (yes/no)? yes
```

時間がかかるので、待つ。ログ（抜粋）は末尾に記載。

完了したら、以下の通り、プロセスを再起動して、完了。

```shell-session
$ sudo gitlab-ctl hup unicorn
$ sudo gitlab-ctl restart sidekiq
```

## 感想
UIデザインのリニューアルも合わさって、GitLab CIはさらに使いやすくなってきたように思います。今回のGitLab CEへのCI機能取り込みはomnibus-gitlabパッケージの台頭と同じくらい「フルスタック」感を感じさせてくれました。資金調達も進んでおり、GitLabプロジェクトはよい方向に進んでいるため、ローコストで心地よく安心して使えています。


----

## 参考

### `gitlab-rake ci:migrate`実行時に標準出力に出てくるログ
（抜粋）

```
Unpacking backup ... done
Restoring database ...
Restoring PostgreSQL database gitlabhq_production ...
SET
SET
DROP INDEX
DROP INDEX
SET
CREATE TABLE
CREATE SEQUENCE
ALTER SEQUENCE
ALTER TABLE
CREATE INDEX
done
Restoring builds ...
done
Migrating tags ...
Inserting tags...
Deleting old taggings...
Inserting taggings...
Resetting counters...
done
Migrating services ...
done
Deleting tmp directories ... done
done
done
```
非同期処理で早く処理が終わっても最低でも◯秒は待たせる

- *2016/03/10* コードを修正

非同期で処理を行うときに、◯秒未満で処理が終わってしまうときは◯秒待つまで待たせてメインスレッドに処理を戻すようにして、
◯秒以上かかるときは通常通り処理が終わり次第メインスレッドに処理を戻すようにしたい場面があったので、関数化して使えるようにしました。

## コード[^1]

```swift
func wait_atleast(time : NSTimeInterval, @noescape _ block: () -> Void) {
    let start = CFAbsoluteTimeGetCurrent()
    block()
    let end = CFAbsoluteTimeGetCurrent()
    let wait = max(0.0, time - (end - start))
    if wait > 0.0 {
        NSThread.sleepForTimeInterval(wait)
    }
}
```

処理にかかった時間と、最低でも◯秒待って欲しいと指定した時間の差を取って、残り待ち時間があればsleepをかけて、
がなければそのまま、といった感じです。
待ち時間を最低5秒と設定した場合、

- 処理が3秒しかかからなかった→2秒待つ
- 処理が6秒かかった→待ち時間を超えているのでsleepはかけない

となります。

### 循環参照について
引数で渡すClosureに対して`@noescape`を指定しているため、この処理に関してはselfをキャプチャする必要はありません。

```swift:△-キャプチャは不要
wait_atleast(1.0) { [weak self] in
    self?.hoge = ""
}
```

※ただ、`dispatch_async`とセットで用いる事になると思うので、`dispatch_async`でのClosureに対しては *weak/unowned* でのキャプチャが必要です。

```swift
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { [weak self] in
    self?.hoge = "hoge"
    wait_atleast(1.0) { // ここで [weak self] in は不要
        self?.hoge = "fuga" // @noescapeではあるが、`dispatch_async`の範囲内なので、`self?.`は必要
    }
}
```

## 使用例

例えば非同期で何か処理を行うときに、すぐ終わる時もあれば、数秒かかる時もあるような場合で、
HUD(例だとSVProgressHUD)を表示して処理を行うが、すぐ終わるときにHUDがすぐに消えてしまって
ユーザーにHUDで表示した文字を認識してもらえない場合もあったりします。。
(表示がでてすぐ消えちゃうと、なんだなんだ？ってなるので)
そんなときにもしすぐ処理が終わっても、1秒は待たせるときは、以下のように記述します。

```swift:example
    SVProgressHUD.showWithStatus("保存中です...")
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { [weak self] in
        wait_atleast(1.0) {
            self?.saveImage()
        }
        dispatch_async(dispatch_get_main_queue()) {
            SVProgressHUD.showSuccessWithStatus("保存しました")
        }
    }
```

端末の処理速度、処理の時の条件によっては早かったり遅かったりする時間を最低◯秒は非同期処理しているように見せることができるので、
場合によってはアリなのかなって思います(ごまかしたりできるので)。

[^1]: NSDate()から、CFAbsoluteTimeGetCurrent()に変更しました。
joind.in の使い方メモ

# ■joind.in
https://legacy.joind.in/

# ■joind.in の投稿ページを日本語化するChrome拡張
https://chrome.google.com/webstore/detail/joindin-%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96/nkklgeklbaokjpbhmlihdopfmbegkkpl

# ■ユーザ登録する

## ◆『Register』か 『Register now!』 をクリック 

![joind.in.reg.reg.png](https://qiita-image-store.s3.amazonaws.com/0/29899/24dae6ee-ac55-8f2b-aba9-e32b9b28aa61.png)

## ◆ユーザ情報を入力

![image](https://qiita-image-store.s3.amazonaws.com/0/29899/d2daca7f-43d5-f04e-1236-466af7b8c9db.png)


- `Username`、`Password` はログインするユーザ名・パスワードです。

- `Spambot check` の `nine minus three` の部分は毎回変化します。これは英語の数式で計算結果を求められています。

```
one    1
two    2
three  3
four   4
five   5
six    6
seven  7
eight  8
nine   9
ten    10
plus   +
minus  -
```

入力したら『Register』(登録) ボタンを押してください。


# ■トークを評価する

![image](https://qiita-image-store.s3.amazonaws.com/0/29899/7c202a3e-0b9a-5970-b917-026b1517d2bb.png)

- `Comment as xxxxxxxxx` は 『`xxxxxxxxx` としてコメントします』 という意味です。
- `Mark as private?` は無視してください。使わなくてよいでしょう。 『プライベートにしますか？』という意味で、おそらく投稿者と登壇者のみが見えるのではと思いますが詳細は不明です。
- `Post anonymously?` は 『匿名で投稿しますか？』 という意味で、チェックを入れると名前を伏せた投稿になります。
- `Rating` はマウスのドラッグで評価を５段階で行ってください。（５段階目が一番良い。）
- 評価を記入、選択したら 『Submit Comment』(コメント投稿) を押してください。

- ログインをしていないと下記の警告がでるかもしれません。『注意してください： ログインしていないため匿名で投稿されますよ！』 という意味です。

![image](https://qiita-image-store.s3.amazonaws.com/0/29899/6c2c2ad2-881f-fb38-7d77-f8dbaf28f7c2.png)
AndroidStudioでコードスニペット(LiveTemplates)を利用する

####検証環境
* MacOS 10.9.5
* AndroidStudio1.3

AndroidStudioでコードスニペットを利用する方法です。
編集・新規作成するには、以下を開きます。

> Android > Preference > Editor > Live Templates 

![1.png](https://qiita-image-store.s3.amazonaws.com/0/71946/c0242158-6ccd-883e-2216-e5e2151dcc90.png)

デフォルトでも複数のスニペットが登録してあるので、自分が使いやすいようにカスタマイズも可能です。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/71946/11010b89-216e-ba2c-4265-4fc303749641.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/71946/b6c0606a-c150-6752-3a0f-667258f44469.png)

例えばAndroidの下に「newInstance」などが既に登録してあります
編集する場合はTemplate text内のコードをいじればOK。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/71946/79d196f0-247e-b9ee-b94a-f4aa61d0a2c8.png)

新規の場合は右のツールからプラスボタンを押下し、LiveTemplateを選択します。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/71946/c51385c4-ca76-a7cd-d94a-8873e206b802.png)

例として、「click」という名前でスニペットを作成してみます。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/71946/60b12c23-d7a7-857f-7269-6ab5df9d1a13.png)

エディターでclickと入力すると、先ほど登録したスニペットが呼び出すことができます。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/71946/02ac2d69-cd81-35ed-3876-0f3e25bc0336.png)

![9.png](https://qiita-image-store.s3.amazonaws.com/0/71946/678c7540-b43e-91b0-4fa9-99e67e88587f.png)
WebViewがきちんと動かない？ときに見直すmanifestの設定

Android4.4(19)からChromiumをベースにしたWebViewが追加されている。
ここで注意しないといけないのは、manifestにtargetSdkVersionの設定を明示的に記述してやらなければならない。
この設定を忘れていると、WebViewで期待した挙動がをしない場合がある。

https://developer.android.com/intl/ja/guide/webapps/migrating.html
distcpする際にhdfsプロトコル使用して、HA構成のnamenodeをホスト名なしで書きたいとき

distcpでhdfsプロトコル使う際ホスト名をURLに書くが、HA構成でアクティブスタンバイが切り替わった時に、URLが使えなくなってします。

そんなときはnameservice1を使いましょう

ホスト名指定の書き方

`hdfs://hogehoge101.jp.local/path/to/file`

HA対応な書き方
`hdfs://nameservice1/path/to/file`
MACへJenkinsをインストール(JENKINS_HOME編)

# Jenkinsのジョブが無くなった（見れなくなった）時

MACのOSをバージョンアップしてJenkins立ち上げ直したら、Jenkinsさんが(Web上が)クリーンな状態になっていた・・・。

「新しいジョブを追加してください」

え！？MAC上にジョブのフォルダはあるのに、なんでそんな清々しい顔でキレイさっぱりジョブなんてありませんよと言い放つのだろうか(顔は変わってない)。

というわけでいろいろ調べていたら、JENKINS_HOMEが変わっていました。。。
（というか自分が変えてたのがデフォに戻った？）

MACの環境変数（JENKINS_HOME）を変更

``` 
# JENKINS_HOMEのPathを確認
echo $JENKINS_HOME

# 自分の意図しているJenkinsのホームディレクトリを設定
export JENKINS_HOME=/Users/Shared/Jenkins/Home 

# JENKINS_HOMEのPathを再確認（ちゃんと変更されてるかどうか）
echo $JENKINS_HOME
```

これでJenkins再起動をしたら、無事ジョブがWebの一覧に表示されました。
[Unity] オブジェクトの重心をずらす

通常、Rigidbodyを追加したオブジェクトの重心はそのオブジェクトの中心にあります。この重心をずらすことで、例えば**起き上がりこぼし**のような動作をさせることができるようになります。

##事前準備
1. Sphereを新規作成してRigidbodyを追加します。可能であればMaterialを追加して少し半透明にしておくと、後々重心の位置が見やすくなります。面倒な場合はやらなくて大丈夫です。
2. Cubeを新規作成してRigidbodyを追加、Use GravityをOFFに、is KinematicをONにします。これは重心がずれていることを確認するための床として使用しますので、ちょっと斜めにしておいてください。
3. Sphereの下にCubeを配置し、普通に転がることを確認します。

##スクリプト
事前準備で作成したSphereに以下のスクリプトを追加します。

```csharp:centerOfMass.cs
using UnityEngine;
using System.Collections;

public class centerOfMass : MonoBehaviour {

	public Vector3 center = new Vector3(0f, -0.2f, 0f);

	private Rigidbody rb;
	
	void Start () {
		rb = GetComponent<Rigidbody> ();
		rb.centerOfMass = center;
	}
	
	void Update () {
		Debug.DrawLine (transform.position , transform.position + transform.rotation * center);
	}

	void OnDrawGizmos(){
		Gizmos.color = Color.red;
		Gizmos.DrawSphere (transform.position + transform.rotation * center, 0.1f);
	}

}
```

##使い方
重心はcenterの値を調整することで変更できます。Scene画面上ではSphereの中心から重心までの線と、重心に赤い丸が表示されていると思います。表示されていない場合はGizmosの設定を確認してください。
![Scene.png](https://qiita-image-store.s3.amazonaws.com/0/94654/7316ba85-cc5c-d6cb-7f84-27ead57c1e8f.png)
ビットマスクを使ってBooleanの配列のサイズを1/32にする


JavaScriptである大きな配列の要素について、それぞれtrueかfalseで表現したいことがあります（？）

例えば、ある640x640の画像データ（ImageData）のピクセルごとの二値化のマスクを保持したい時、普通に考えたら以下の様なコードを書いてしまいます。

```js:js

var mask = new Array(640*640);
for (var i = 0; i < mask.length; i=i+1|0) {
   mask[i] = false;
}

```


JavaScriptの配列の実装は処理系によって違いますが、型を持たないjsの配列に関して初期化時のサイズの設定はメモリアロケーション上あまり意味を持ちません。

ちょっとjsに詳しい人ならこう書くかもしれません。

```js:js

var mask = new Uint8ClampedArray(640*640);
for (var i = 0; i < mask.length; i=i+1|0) {
   mask[i] = false;
}

```

真偽値の配列というものはjsでは定義できないので、整数の配列でメモリを節約しようという考えですね。
この場合、TypedArrayを使うことでメモリの確保をコントロールでき、メモリフレンドリになります。
しかし、そもそもUint8は8ビット=1byte, Cでいうchar型です。
真偽値を表したいのだから、そんなに大きなサイズはいりません。

そこで、ビットマスクを使って長さを1/8にしてみます。

```js:BinraryArray.js

var BinaryArray = function(size) {
	this.size = size;
	this.mArray = new Uint32Array(Math.ceil(size));
}
BinaryArray.prototype.get = function(i) {
	return mArray[0|i/32] >>> i%32 & 1 === 1;
}
BinaryArray.prototype.set = function(i,flag) {
	return mArray[0|i/32] |= flag ? 1 : 0 << i%32;
}

```

アイデアは単純で、32bit整数ならば32個の真偽値を保持できるので、実際の長さの1/32の配列で済むのです。あとはアクセッサでビット演算してやればOK。

jsのTypedArrayは最初に設定したsize以上の値へのアクセスは常にundefined, 書き込みは評価値は帰ってくるものの実際の書き込みは無効となるのでこの実装で問題ないはずです。

なぜUint8ClampedArrayではなくUint32Arrayを使っているかというと...配列の長さが短い(8/32=1/4）のでメモリアロケーションがこっちのほうが速い（？）と思ったからですが実際は分かりません。

タイトルですが、ちょっと釣りかも？
長さは1/32になっていますが、たぶんメモリのサイズで言うと1/8だと思います。
そんな細かいこと気にしててJSerやってられんの？っていうツッコミはなしでお願いします。ちなみに私はHaxerです。
Go言語でBigQueryのクエリを実行してみる

## 概要

Go言語からBigQueryのクエリを実行してみたので、そのメモ。

## import

Google提供のBigQueryのライブラリと、認証周りで使うライブラリをimport。

```go
"google.golang.org/api/bigquery/v2"
"golang.org/x/net/context"
"golang.org/x/oauth2/jwt"
```

## 接続

GCPプロジェクトの権限を持つアカウント名と秘密鍵を使ってアクセスします。

```go
cfg := jwt.Config{
	Email:      account,
	PrivateKey: pem,
	Scopes:     []string{bigquery.BigqueryScope},
	TokenURL:   "https://accounts.google.com/o/oauth2/token",
}
ctx := context.Background()
client := cfg.Client(ctx)
conn, err := bigquery.New(client)
```

## クエリ

プロジェクトIDとクエリを指定して、実行する。

```go
result, err := conn.Jobs.Query(projectId, &bigquery.QueryRequest{
	Query: "SELECT * FROM ....",
}).Do()
```

なおデータセットIDはクエリ内のテーブル名に含まれる。

## 結果

Rowsに結果が入っている。

```go
for _, row := range result.Rows {
	for _, cell := range row.F {
		fmt.Print(cell.V)
		fmt.Print(",")
	}
	fmt.Print("\n")
}
```
Backlog WebhookをAmazon API Gateway+AWS LambdaでSlackに通知する

昨今のサーバレス、マイクロサーバという流行りに乗っかってやってみました

## システム構成
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/22567/b7a2d2cd-f075-5a45-56d5-e3953db41009.png)
すごく単純ですが、上記のような構成です。
API GatewayでBacklog Webhook通知先URL Resource(POST)を作成、Integration TypeにAWS Lambda Functionをして、Node.jsでSlackへBacklogからのjsonデータを整形してPOSTしています。

こんな感じでSlackに通知が来ます↓
![slack_comment.png](https://qiita-image-store.s3.amazonaws.com/0/22567/35406182-6395-a062-d518-bc8777fc6902.png)

一応、複数Backlog/複数Slackチャンネルを設定できるように、以下の様な設定ファイルをS3に持たせることで汎用的にしています。  
また、どのBacklogプロジェクトの通知かはBacklog WebhookのPUSHデータ内にある `project.id` を上記設定ファイルのS3オブジェクトキー（ファイル名）にすることで判定しています。  
（project.id=100の例）
s3://{bucket-name}/100.conf 
```
{
    "space_name": "xxxxx",
    "channel_name": "yyyyy"
}
```
SlackへのPOSTは（`#general`など消されないであろう）特定チャンネルにIntegration(Incomming webhooks)を登録し、そのWebhook URL宛にチャンネル指定でPOSTしています。
※ただし、Slack Integration(Incomming Webhooks URL)はAWS Lambdaにハードコーディングしています。（でも書きながら今気づいたのですが、これもS3に設定情報を置けばいいですね。。）

## それぞれのハマりどころなど
少しググるとたくさん情報が出てくるので細かい設定例などはそちらにお任せするとして、Tips的なことを簡単にまとめます。

### Backlog Webhook
http://www.backlog.jp/help/adminsguide/webhook-setting/userguide2493.html
http://developer.nulab-inc.com/ja/docs/backlog/api/2/get-activities
上記2つを見ればおおよそ問題ないかと思います。
ただし、ハマりどころとしては以下ですね。

- 2015/09/15までBacklog Webhookの通知をAmazon API Gatewayで受けることができませんでした。
  - これは他の方も記事にされてましたが、自分もBacklogチームにお問い合わせを投げたところ、すごく早いタイミングで改善いただきました！
- Backlogの各種パラメータが0始まりだったり、1始まりだったりする
- Webhook登録画面でのテスト実行は `保存` しなくてもフォームの設定値が反映される
- スペース名を特定できる情報が飛んでこない
  - 前述したように `project.id` をS3オブジェクトキーに含めた
  - ただし、この`project.id`がすべてのBacklogプロジェクトでユニークなのかは不明。
- Webhook登録画面でのテスト実行した場合、`project.id=100` に固定で、設定をしているBacklogプロジェクトのそれとは異なる。
  - 今回S3からの設定ファイル読み込みの際にこのBacklog`project.id`を利用していたので、実質このテスト実行はデバッグに使えませんでした。。

### Amazon API Gateway
これもググればたくさん情報が出てきますね。
http://dev.classmethod.jp/cloud/aws/api-gateway/
http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-2015-amazon-api-gateway
とりあえず困ったらクラスメソッドさんのDevelopers.IOに頼ってます。
あと2個めのAWS Black BeltではREST APIの基本から学べてすごく勉強になりました。

ハマりどころとしては以下でした。

- Amazon API Gatewayと同一のリージョンにAWS Lambda Functionを作成しないと、Functionが発火しない
  - LambdaはすでにTokyo Regionにありますが、API Gatewayはまだありません。これに2時間ほど費やしてしまいました。。。
- デバッグがしづらいのでまずはシンプルなAWS Lambda Function（eventをconsole.logするだけ、など）でうまくResource設定ができているか確認したほうがいい
  - うまくいかない時はだいたいIAMを疑うといいかもしれません。

### AWS Lambda
これは去年2014年のre:Inventで衝撃的な発表があって、すでに1年くらい経ってるので更に情報やサンプルがたくさんあるのであまり困りませんね。

でも未だに困るとしたらこの辺りでしょうか。

- とにかくデバッグがしづらい。。
  - もうこれはこまめに `console.log` を仕込むしかないですかね。誰か教えてください。
- CloudWatchにログが出ない。
  - これはIAMを疑ってください。log系のパーミッションがないといけません。
  - とりあえず最初は自動生成されるIAMに任せるのが無難かもしれません。
- AWS Lambdaへのデプロイがめんどくさい。
  - これは他にもツールがあるみたいですが、自分はzipアーカイブして、aws cliでLambda Functionをアップデートする簡単なshellscriptを書いて使っています。
PowerShellのprofile.ps1自分用設定

# はじめに
下記の設定がかわいかったので、プロファイルの設定を作成したお話(*'-')
[かわいい PowerShell プロンプト](http://qiita.com/cd01/items/40ae04b8643a84c9dc08)


# 参考
[PowerShellのプロンプト文字列をカスタマイズする](http://www.atmarkit.co.jp/fwin2k/win2ktips/983psprompt/psprompt.html)
[Windows PowerShell プロファイル](https://technet.microsoft.com/ja-jp/scriptcenter/powershell_owner06.aspx)
[Windows PowerShell コンソールをカスタマイズする](https://technet.microsoft.com/ja-jp/scriptcenter/powershell_owner02.aspx)


# プロファイルを見つける＆作成する

- プロファイル確認 
```Test-Path $profile```

- 無い場合 
```New-Item -path $profile -type file -force```

- ある場合 
```notepad $profile```  
PowerShellでは「みつかりません」PowerShell ISEだと「新しく作成しますか？」でした（私の環境では(windows7))。
プロファイルについての詳細（ユーザ毎等)は下記サイトで詳しく説明されています。
[PowerShell で Profile を利用して スクリプトの自動読み込みをしてみよう](http://tech.guitarrapc.com/entry/2013/09/23/164357)


# かわいくしていく＋α

profile.ps1を編集していきます！

## タイトルを変更する

```profile.ps1
$a = (Get-Host).UI.RawUI 
$a.WindowTitle = "三( `・ω・)＼＼|| Powershell//／／(・ω・´ )三"
```

## 開始ディレクトリの指定

```profile.ps1
Set-Location 開始したい場所の絶対パス
```

## 実行ポリシー表示

```profile.ps1
Write-Host "実行ポリシーは" (Get-ExecutionPolicy) "だよ！" -ForegroundColor "Yellow"
```

## かわいい設定
現在のディレクトリがわからないと不便だったので追加しています。

```profile.ps1
function Prompt {
    if ($?) {
        Write-Host "["(Split-Path (Get-Location) -Leaf)"](*'-')"  -NoNewLine -ForegroundColor "Green"
        return "> "
    } else {
        Write-Host "["(Split-Path (Get-Location) -Leaf)"](*;-;)"  -NoNewLine -ForegroundColor "Red"
        return "> "
    }
}
```

## まとめ

profile.ps1を起動時に読みこめるよう、実行ポリシーをRemoteSigned以上に変更しておきましょう。
[Powershellを楽に実行してもらうには](http://qiita.com/tomoko523/items/df8e384d32a377381ef9)


```profile.ps1
#タイトルを変更する
$a = (Get-Host).UI.RawUI 
$a.WindowTitle = "三( `・ω・)＼＼|| Powershell//／／(・ω・´ )三"

#開始ディレクトリの指定
Set-Location 開始したい場所の絶対パス

#実行ポリシー確認
Write-Host "実行ポリシーは" (Get-ExecutionPolicy) "だよ！" -ForegroundColor "Yellow"

#かわいい設定
function Prompt {
    if ($?) {
        Write-Host "["(Split-Path (Get-Location) -Leaf)"](*'-')"  -NoNewLine -ForegroundColor "Green"
        return "> "
    } else {
        Write-Host "["(Split-Path (Get-Location) -Leaf)"](*;-;)"  -NoNewLine -ForegroundColor "Red"
        return "> "
    }
}
```

# その他
$aの要素（(Get-Host).UI.RawUI )の設定をいろいろいじれば、背景色・画面サイズなどなど設定できます。
SqliteをCLIから操作


すぐ忘れるので。。。
adbパスが通っていることが前提です。


#### shellを起動し、databaseまで移動

```
 $adb shell
 $cd data/data/<pacage name>/databases
```

#### databaseを選択

```
$sqlite3 xxxxxxx.db;

```

#### table一覧表示

```
$sqlite3.tables;
```

#### テーブルスキーマ確認

そのテーブルのCREATE文を確認する

```
$select * from sqlite_master where type='table' and name='テーブル名'; 
```

#### sqliteコマンド終了

```
$.exit
```
nginx-buildでnginScriptのビルドを自動化する

前回の「[nginScriptで遊んでみた](http://qiita.com/cubicdaiya/items/669d517be5067606c506)」では手動でnginScriptをnginxに組み込んでビルドしてたけど、[nginx-build](https://github.com/cubicdaiya/nginx-build)でビルドできるようにしてみた。(`v0.6.0`から可能)

## nginx-buildのインストール

[nginx-build](https://github.com/cubicdaiya/nginx-build)のインストールは`go get`でできる。

```
go get -u github.com/cubicdaiya/nginx-build
```

あるいは[ここ](https://github.com/cubicdaiya/nginx-build/releases)からビルド済みバイナリをダウンロードする。

## nginx-buildでnginScriptを組み込む

まず以下のiniファイルを用意する。

```ini:modules3rd.ini
[njs/nginx]
form=hg
url=http://hg.nginx.org/njs
shprov=./configure && make
shprovdir=..
```
 
あとは`nginx-build`を叩くだけ。
 
```
$ nginx-build -d work -m modules3rd.ini
nginx-build: 0.6.0
Compiler: gc go1.5.1
2015/10/01 08:02:13 Download njs/nginx.....
2015/10/01 08:02:13 Download nginx-1.9.5.....
2015/10/01 08:02:15 Extract nginx-1.9.5.tar.gz.....
2015/10/01 08:02:19 Generate configure script for nginx-1.9.5.....
2015/10/01 08:02:19 Configure nginx-1.9.5.....
2015/10/01 08:02:26 Build nginx-1.9.5.....
2015/10/01 08:02:29 Complete building nginx!
 
nginx version: nginx/1.9.5
built by clang 7.0.0 (clang-700.0.72)
configure arguments: --with-cc-opt=-Wno-deprecated-declarations --add-module=../njs/nginx
 
2015/10/01 08:02:29 Enter the following command for install nginx.
 
   $ cd work/nginx/1.9.5/nginx-1.9.5
   $ sudo make install
```
 
というわけで[nginx-build](https://github.com/cubicdaiya/nginx-build)でnginScriptを組み込んでビルドできるようになりました。
Mac上でgulpコマンドが走らない!?そんな時に確認してみること


gulpコマンドを実行してもエラーが続き、ファイルが作成されなかったりしてハマったのでメモです。

出てきたエラーはこれ

```
[Error: EMFILE, open 'app/node_modules/react-validation-mixin/node_modules/lodash.union/package.json']
  errno: 20,
  code: 'EMFILE',
  path: 'app/node_modules/react-validation-mixin/node_modules/lodash.union/package.json'
```

特にreact関連でしかもnode_modulesの中で発生するEMFILEエラーはgulpで実行できるファイル数に制限を与えられていることによって起こることがあるみたいです

```
$ulimit -n
#=>256
```

例えばCentOS上だと

```
$ulimit -n
#=>1024
```

なので、Mac側でulimit -n 1024と指定してあげると解決できました。

nオプションは
ファイル・ディスクリプタの数を最大N個に制限する
という意味だそうです。

開けるファイル数制限されてるなんて、知らなかったのでとてもはまりました...
技術英語 > 無冠詞のcaptain > 特定性を示す > I am Captain Kathryn Janeway of the Federation Starship Voyager.

引用: 冠詞マスター教本 by 石井隆之さん

> (10) a. He has been a captain for 10 years. (彼は10年間指導的立場にいる)
> b. He has been captain for 10 years. (彼は10年間主将を務めている)
> ...
> 無冠詞のcaptainはグループ内で一人しかしないことがはっきりと分かる役職、すなわち「船長、艦長、機長、（クラブの）主将、（クラスの）級長」等を表します。無冠詞の表現の方が、一人を強調するという点で、特定性を示していると言えますね。

Star trek Voyagerにて艦長のJanewayがよく言うフレーズが以下。(Captainと記載しているがcaptainかもしれない。)
> I am Captain Kathryn Janeway of the Federation Starship Voyager.

あまり意識してなかったが、確かに上記のフレーズでは Captain が無冠詞になっている。

theはつけるかどうかについては
引用: 冠詞マスター教本 by 石井隆之さん

> (11) a. The woman over there is the president of the company.
b. The woman over there is president of a company.
...定冠詞をつけた場合は、会社の社長について何らかの話題がこの文の発話の前にあった場合に自然な言い回しとなります。
[sbt]使っているライブラリのバグをさらっと直して開発し続ける方法

# 想定するケース

利用している外部ライブラリ(maven centralなどから引っ張ってくる奴)に軽度のバグを見つけた。
fork, コード修正してpull requestを本体プロジェクトに出したがいつmerge, releaseされるかわからない。
しかし自分のプロジェクトではいますぐに修正後のライブラリがほしい。

## 対応策一覧

### 1. sbtのsub-projectとして扱う

[sbtは複数のプロジェクトをまとめて扱うことができる](http://www.scala-sbt.org/0.13/tutorial/ja/Multi-Project.html)ので、もし対象のプロジェクトがmavenではなくsbtプロジェクトとして書かれていれば以下の方法でsub-projectとして取り込むことができる。

 * submoduleとしてコードごと取り込む
 * コードをまるごとコピペ

※ コードとしてライブラリを取り込んだ場合、ライセンスの問題が発生するケースがあるので注意

### 2. sbtのgitリポジトリ指定でのsub-project取り込みを利用する

[Github 上のライブラリや sbt plugin を使う (sbt 0.13 以降用) - Qiita](http://qiita.com/kawachi/items/71af20a102ecca41561d)
ここで紹介されているように、実はsbtは外部のgitリポジトリを指定してsub-projectとして取り込むことができる。
自分がforkして修正したコミットが公開されているならばこれが利用できる。
欠点としては、sbtコードがネストされていると(rootディレクトリにbuild.sbtやproject/Build.scalaが配置されていないと)サブディレクトリを参照する方法が提供されていないのでこの方法は利用できない。

### 3. 管理外ライブラリとして取り込む

ライブラリ自体はそれ単独でビルドし、できたJarファイルをsbtのアンマネージ依存性として取り込む。
通常```/lib```ディレクトリへ突っ込めばいい。
欠点は、ここに置かれると依存性解決が自動で走らないためこのライブラリが依存するライブラリが自動でダウンロードされないことである。
そのためライブラリのpom.xmlなどから依存するライブラリ一覧を抜き出してきて、libraryDependenciesへ追加してやる作業が必要となる。

### 4. forkしたライブラリのID(organization IDなど)を変えて別のところへpublishする

いわゆるfork版としてrepositoryへpublishする
今回想定するケースでは本体プロジェクトへ修正が反映され次第そちらへ向き先を変えたいので、修正後のライブラリがrepository上へ残ってしまうこれは後始末が面倒。

### 5. Local Repositoryへpublishする

```sbt publishLocal```したのちLocal Repositoryのライブラリを参照する方法。
可視範囲がLocalにとどまるためあくまで手元でのデバッグにしか使えず、他人と共有したりデプロイしたりする場合はPrivateないしGlobalのRepositoryへpublishする必要がある。
※ IDが完全に一緒の場合、Local Repository側のライブラリを優先させる方法があるのかどうかは未調査。

# まとめ

そもそもライブラリのバグなのか、一旦ライブラリを置き換えて調査したい場合はLocal Repositoryの利用が便利。
修正したコードを自分のプロジェクトへ反映させたい場合はライセンスの問題がなければsub-projectとして取り込むのがベター。
その際rootディレクトリにbuild.sbtが配置されているようであればgitリポジトリとして取り込むのが最も簡単である。
ただ、なるべく自分のプロジェクトの構造を大きく変えたくない場合やPrivate Repositoryが完備されている場合、Global Repositoryへのpublish手段が確立出来ている場合はfork版をpublishする方法もあり(その際は本体プロジェクトで修正後のコードがreleaseされ次第fork版は削除したいところ)。
Emacs 設定

```el:examle.el
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives
             '("marmalade" . "https://marmalade-repo.org/packages/"))
(package-initialize)
(package-refresh-contents)

(defvar my/initial-packages
  '(
    use-package
    quelpa
    quelpa-use-package
    init-loader
    ))

(dolist (package my/initial-packages)
  (unless (package-installed-p package)
    (package-install package)))

(when (not (package-installed-p 'use-package))
  (package-refresh-contents)
  (package-install 'use-package))

(unless (require 'use-package nil t)
  (defmacro use-package (&rest args)))

;; (require 'use-package)

(when (not (package-installed-p 'use-package))

;; Emacs での Proxy 設定
;; http_proxy 環境変数
　(setq url-proxy-services '(("http" . "127.0.0.1:8338")))

(setq url-proxy-services
	'(("http" . "proxyhostname:port")
	  ("https" . "proxyhostname:port")))

(base64-encode-string "username:password")

    (setq url-http-proxy-basic-auth-storage
    	'(("proxyhostname:port" ("Proxy" . "base64string"))))
```
JavaScriptのCSV読込メモ

# お題
Excelで編集したCSVファイルをJavaScript(UTF-8)で定義ファイルとして読込みたい。
# ShiftJISでの対応
Papa ParseというjQueryライブラリがあるので、それを使ってみる。
http://papaparse.com/
http://plugins.jquery.com/parse/

あとmimetypeを上書き。
**jQueryでShiftJISエンコードされたCSVを処理する**
http://qiita.com/svartalfheim/items/36100328a37c8221d0dd

```html:csv.html
<!DOCTYPE html>
<html lang="ja">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="js/papaparse.min.js"></script>
<script>
var alldata={};
$(function(){
	var init_data = function(){
    var _def = $.Deferred(), 
    _defs=[], 
    _keys=["user", "group","shop"],
    _func = function(key) {
		var _def2 = $.Deferred();
		$.ajax({
			type:"GET",
			url:"data/" + key + ".csv",
			// ShiftJISをUTF-8で読み込む。
			beforeSend:function(xhr){
				xhr.overrideMimeType("text/plain; charset=shift_jis");
			},
			dataType:'text',
			cache: false
		}).then(
			function(res) {
				Papa.parse(res,{
		             delimiter: ",", // 区切り文字
		             header: true, // 実データ一行目を項目名とするか
		             comments: "#", // "#"始まりはコメント行
		             skipEmptyLines: true, // 空行を飛ばす 
		             // 完了時
		             complete:function(res){
		            	 alldata[key] = res.data;
		            	 _def2.resolve();
		             },
		             // エラー時
		             error:function(err) {
		            	 _def2.reject(err);
		             }
				});
			},
			function(err) {
				_def2.reject(err);
			}
		);
		return _def2.promise();
	};

	$.each(_keys, function(){
		_defs.push(_func(this));
	});

	// 配列を渡したいので、applyで。
	$.when.apply($, _defs).then(
		function(){
			_def.resolve();
		},
		function(err){
			_def.reject(err);
		}
	);
	return _def.promise();
};

init_data().then(function(){console.log(alldata);});

});
</script>
<body>
</body>
</html>
```
# UTF-8での対応
**BOM付きUTF-8**であれば、Excelで直接開いて編集可能。
Windowsのメモ帳の場合、UTF-8保存で常にBOM付きになる。
vimの場合、**:set bomb** でBOM付き、**:set nobomb** で削除。BOM付きかどうかは **vi -b hoge.csv** で確認。

**vimでBOM**
http://saihoooooooo.hatenablog.com/entry/2012/09/06/000535

$.ajax を経由した文字コード変換が不要になるので、以下のようなリモートファイルの直接読込が利用できそう。

```JavaScript
Papa.parse(url, {
	download: true,
	// rest of config ...
})
```
まとめ: Entity Framework Code First が生成するデータベース名

# まとめ: Entity Framework Code First が生成するデータベース名

毎度、msdn の記事を読み直さないといけないのでまとめる。
[msdn - 接続とモデル](http://msdn.microsoft.com/ja-jp/data/jj592674)

Entity Framework Code First が生成するデータベース名は次の要素で決まる。

- 構成ファイル Web.config/App.config の「接続文字列名」
- DbContext の「クラス名」
- DbContext コンストラクタに渡す「文字列型の引数」

次の組み合わせが考えられる。
\#5 は Database/Model First による接続で、かつ既設のデータベースへの接続になるが参考までに。

|#|接続文字列名|DbContext クラス名|コンストラクタ引数|生成するデータベース名|
|---:|:---|:---|:---|:---|
|1|なし|任意の名前|なし|クラスの完全修飾名 _*a_|
|2|なし|任意の名前|任意の名前|コンストラクタ引数名|
|3|あり|接続文字列名と同じ|なし|接続文字列に定義された名前|
|4|あり|接続文字列名と異なる|接続文字列名と同じ|接続文字列に定義された名前 _*b_|
|5|あり _*c_|任意の名前|接続文字列名と同じ|- _*d_|

_\*a:_ 　SQL Server Express か LocalDb が使われ、Express 優先とあるが、VS 2015 + SQL Server 2014 環境で試すと LocalDb として作成された。

_\*b:_ 　引数を `name=接続文字列名` 形式で指定した場合、構成ファイルに等しい接続文字列名がないと例外がスローされる。

_\*c:_ 　EDMX ファイル内の情報の検出方法が含まれる特殊な接続文字列を指定する

_\*d:_ 　接続文字列名に定義された既設のデータベースに接続する。Code First として機能するのではない。

### その他

- `DbModelBuilder` でも Code First モデルを構築できる、未調査。
- DbContext の文字列引数には、データベース名、接続文字列名以外にも接続文字列自体を渡すことができる。
- 作成済みの DbConnection を DbContext のコンストラクタに渡して、そのコネクションを使用できる。
- 同様に作成済みの ObjectContext を DbContext のコンストラクタに渡して使用できる。


#### 確認した環境
- Visual Studio Community 2015
- ASP.NET MVC 5.2.3
- Entity Framework 6.1.3
- SQL Server Express LoalDb 12.0.2000.8
お前らのSSH Keysの作り方は間違っている


* GitHubのHelpに記述されているSSH Keysの作成方法が僕の知っている作成方法と
微妙に異なっていたので、書いてみました。


以下の参考にしています。
[Generating SSH keys - User Documentation](https://help.github.com/articles/connecting-to-github-with-ssh/)


## SSH Keysの確認

* 既存のSSH Keysの確認をする必要があるので、以下を実行

```bash
ls -al ~/.ssh
```

デフォルトでのSSH Keysの名前は以下のうちのどれか

* id_dsa.pub
* id_ecdsa.pub
* id_ed25519.pub
* id_rsa.pub

## 現在使用している鍵の暗号強度の確認

* 以下のコマンドにて鍵長が2048以上かつ暗号化方式がRSA、或いはECDSAやEd25519であればOK

```bash
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
4096 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com (RSA)
``` 

※~~[ssh-rsa，非推奨のお知らせ](https://orumin.blogspot.com/2020/05/ssh-rsa.html)にてSHA1を用いたRSA鍵が将来的にはdeprecateとなり，デフォルトでSHA1を用いたRSA鍵を利用する機能自体が無効化されることが改めて告知されました。よって、SHA1のRSA鍵を使用している方は新しく鍵を作り直すことをオススメします。~~ 「廃止対象となっているのは署名方式の方だけです。なのでOpenSSH 7.2以降を入れれば、鍵自体は古いOpenSSHで生成した物がそのまま使えます。」とのことですので、鍵自体を作り直す必要はないようです


## 新しいSSH Keyの作成

1. `-C`のコメント部分を入れ替えて、以下のコマンドを実行

※GitHubに登録しているEmailアドレスを使うのが一般的のようです。

```bash
ssh-keygen -t ed25519 -C "your_email@example.com"
```


2. SSH Keysの保存先を聞かれているので、特に気にしなければそのまま`Enter`を入力

```bash
Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
```



3. パスフレーズの入力を求められるので、入力

```bash
Enter passphrase (empty for no passphrase): [Type a passphrase]
# Enter same passphrase again: [Type passphrase again]
```
※ GitHubは安全なパスフレーズを入力しろって言ってる。
[Working with SSH key passphrases - User Documentation](https://help.github.com/articles/working-with-ssh-key-passphrases/)

SSH Keysの作成完了

## GitHubアカウントにSSH Keyの登録

* `~/.ssh/id_rsa.pub`の内容をクリップボードにコピー

```bash
pbcopy < ~/.ssh/id_rsa.pub
```
* SSH Keyの登録

1. GitHubにログインし、右上のプロフィールをクリック -> Settingsにて設定画面に遷移
2. 左のメニューから`SSH keys`をクリック
3. `Add SSH Key`をクリック
4. `Title`に識別できる文字列を入力
5. `Body`に先ほどクリップボードに入れた値をペースト
6. `Add Key`をクリック

## 確認

* ターミナル上で以下を入力

```bash
ssh -T git@github.com
```

* こんな感じで聞かれるので、[GitHub's SSH key fingerprints](https://help.github.com/articles/github-s-ssh-key-fingerprints/)
に記述されているfingerprintsと一致するのを確認してから`yes`を入力

```
The authenticity of host 'github.com (207.97.227.239)' can't be established.
# RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
# Are you sure you want to continue connecting (yes/no)?
```

下記のような文字列が出力されれば確認OK

```
Hi username! You've successfully authenticated, but GitHub does not
# provide shell access.
```

お疲れ様でした。
これでGitHubに`git@`でアクセスできるようになります。

※ 尚、リポジトリで使用する場合、Gitのリモートリポジトリをhttpsに切り替えている場合はリモートリポジトリの
URLを切り替える必要があるので注意

## 最後に
* 使っていない認証鍵は削除するとかRSAの1024bitsの鍵を使っている人とか居るみたいなので、
そういった方、わからない方はこの機会に作り直しましょう。
* 鍵の削除を行う際には公開鍵、秘密鍵の両方削除を行いましょう。また、GitHubに登録している公開鍵なども削除を行いましょう。

なぜ危険なのか参考URLは以下にのせておきます。

[GitHubユーザーのSSH鍵6万個を調べてみた - hnwの日記](http://d.hatena.ne.jp/hnw/20140705)
Ruby on Rails+Passenger+Apacheのマルチドメイン環境にSSL証明書（ワイルドカード）をインストール

はっきり言って以下の通りですが、それなりにハマったので備忘として残します。

ComodoのSSL証明書をApache+mod_sslにインストール
http://qiita.com/gumob@github/items/af08fd5f53cccc7ad6ab

##構成
Apache 2.3
mod_ssl
OpenSSL
Ruby on Rails
Passenger 
マルチドメイン

##用意するもの
domain.com.crt
domain.com.key
domain.com.ca-bandle.crt

* 作成方法は上記のURLを参照ください

##手順

証明書の権限とオーナーを変更します。

```shell:shell
# cd /hogehoge
# ls
domain.com.crt domain.com.key domain.com.ca-bandle.crt
#
# chmod 400 *
# chown apache:apache *
```

Apacheのconfファイルを変更します。

```shell:shell
# cd /etc/httpd/conf.d/
```

（環境によりけりですが）ssl.conf ファイルがあると思うので、その適当な箇所に、以下を追加します。

```shell:ssl.conf
NameVirtualHost *:443
```

マルチドメイン用に用意している(と思われる) Virtualhostの設定ファイル（80ポート用）の hogehoge.conf をコピーし、ssl用の設定ファイルとして適当な名前（ hogehoge_ssl.conf など）に変更します。

そして、ssl用の設定ファイルの中身を ・・・

```shell:hogehoge_ssl.conf
<VirtualHost *:80>
   ServerName www.domain.com
   DocumentRoot /somewhere/public
</VirtualHost>

<VirtualHost *:80>
   ServerName hoge.domain.com
   DocumentRoot /somewhere/public
</VirtualHost>
```

次のように変更します。

```shell:hogehoge_ssl.conf
<VirtualHost *:443>
  # ssl
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCertificateFile      /somewhere/crt/domain.com.crt
  SSLCertificateKeyFile   /somewhere/crt/domain.com.key
  SSLCertificateChainFile /somewhere/crt/domain.com.ca-bandle.crt

  ServerName www.domain.com
  DocumentRoot /somewhere/public
</VirtualHost>

<VirtualHost *:443>
  # ssl
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCertificateFile      /somewhere/crt/domain.com.crt
  SSLCertificateKeyFile   /somewhere/crt/domain.com.key
  SSLCertificateChainFile /somewhere/crt/domain.com.ca-bandle.crt

  ServerName hoge.domain.com
  DocumentRoot /somewhere/public
</VirtualHost>
```

以上です。
リファクタリング中に識別子の名前をなおすべきか

　以下の記事は、テストが自動化されていない環境、バージョン管理にgitよりも古いツールを使っていたとき、リファクタリングしやすい統合環境を使っていなかった時代に書いたものです。
　ですから、リファクタリングが日常化している開発チームの状況では、この文章はまったく無用のものです。

----
　ソースコードのメンテナンスしていると、識別子の名前を直したいことは多々ある。スペリングが間違っている、用語の不統一、「まずい名前」などさまざまな理由がある。「テスト駆動開発による組み込みプログラミング」（オライリー）によれば、名前の変更がリファクタリングの要素にあげられている。
　しかし、今、私は本当に識別子を直すべきか迷っている。不完全なテストの状況において識別子を直さないほうが良いのではないかと。

####**直すべきでない理由１：違いは少ないほどよい**
　ファイルを比較するとき変更点は、違いが少ないほどよい。違いの数が多いほど、反映させていい違いなのか、無視してよい違いなのかがわからなくなりやすい。たくさんの変更を行うと間違いをしでかす可能性が増える。ブレースと改行のコーディングスタイルなどを気にしなくてもよい違いをdiffで表示させてしまうことは避けたい。

####**直すべきでない理由２：変更漏れと変更のしすぎ**
　変数名、データメンバー名を変更するときには、間違えて、一部だけ置き換えてしまったり、論理的には別の変数まで名前を変更してしまったりする。いつの間にか、論理構造を壊してしまってしまう。なんかおかしいなと思って、昔の版をSVNから取り出して、間違った改変をしていたことに気づく。クラスを用いていて、データメンバーは同一の名前を複数のクラスで使っていることが多い。だから、そのような間違いもしでかしやすい。
　スペリングミスであっても、つじつまがあっている限り、当面はそのままにしておくことがお勧めだと思っている。

####**直すべきでない理由３：名前がソースをたどるヒントでありつづける**
　マクロ定数ではなく、enum型になった場合でも、識別子の名前は変えないままにしておくのが、当面望ましいと私は考える。グローバル変数から、クラスのデータメンバーに変わった場合でも、検索してたどりやすいというただ一点の理由のために、名前を変えないままにしておくのが、当面望ましいと私は考えている。
　以下の記事は、テストが自動化されていない環境、バージョン管理にgitよりも古いツールを使っていたとき、リファクタリングしやすい統合環境を使っていなかった時代に書いたものです。
　ですから、リファクタリングが日常化している開発チームの状況では、この文章はまったく無用のものです。


####**直すべきでない理由４：単体テストするまで待て**
　プログラムは正しいままに保つことが大切であり、正しい状況にあることをテストして確認する。しかしながら、引継いだばかりのソースコードには、単体テストしやすい枠組みになっていないことが多い。テストしやすい界面を作り出すために、関数を抽出したりすることが多い。ただでさえそのような改変は、プログラムにバグを埋め込みやすい。
　引き継いで開発にかかわったソースは、意図を理解していない部分が多い。それもバグを埋め込みやすい原因の一つだ。テストが十分にできていない段階では、識別子の名前を変えるためだけの改変はすべきではないと考える。

####**直すべきでない理由５：単体テストしてあれば安心して名前を変えられる**
　ロジックの妥当性を単体テストの枠組みに入れ込んでしまうまで、なるべく名前を変えないままにしておきたい。そして一群の改変が単体テストで妥当であることを検証しきるまで、そのままにしておきたいと思う。
　そして妥当性を単体テストで検証しきってからは、その識別子の名前を自信をもって改変できる。

####**直すべきでない理由６：追加のソースコードの出現**
　メンテナンスすべきコードが、当初思っていた範囲よりも広範囲になものであったことが判明すると、この変数や関数の前の名前はなんだったのだろうということになる。

回避策：古い名称の関数は、廃止予定の関数として残しておいた方がよいのかもしれない。
　また、新しい枠組みになっても、一連の改変以前に使われていたインタフェースを持つ関数を、新しい枠組みに基づいて実装しておいた方がよいかもしれない。

　引数のデータ構造や戻り値が変更になって、関数の仕様が著しく変わったときは、従来の関数名に類似の関数名で別の仕様の関数として実装したほうがいいかもしれない。そうすれば、関数の仕様が変わった別物であることがわかるし、従来のインタフェースを廃止予定の仕様として残しておくことも可能になる。


注意：ここで述べているのは小規模の人数による開発です。開発プロジェクトの性格や方針によっては、ここに書いている内容はまったく役に立たないでしょう。



####**その後：改変済みコードの検索ツール(自作)**
　関数を改変して古い関数が新しい版では別の関数名になっていて、しかも古い版の関数を使っているコードを読まなければならなくなったとき、次のようなスクリプトを用いて、対応する今の関数を見つけることにしている。
{古い関数名：新しい関数名, }
からなる辞書(=map)を用意しておいて、
ソースコード中に、古い関数名があるかどうかを検索するツールを自作した。
　移植済みの関数を再度移植してしまうことは防げるだろう。


####**直すべき理由**
　識別子の名前から期待する内容と、その識別子の実際の内容とがかけ離れていれば、そのかけ離れていることが何度も「ああそうなんだっけ」という思いをするならば、ソースコードを共有していると相談して、識別子の内容を変更すべきだろう。何度も何度も、「本当はこういう意味なんだ」という思いを繰り返すことは、誤解に基づくコードを書きやすくしてしまう。また、Doxygenのcalltreeで表示させるのも関数名（識別子のひとつ）であり、誤解を発生させないためにも直すべきだと考える。


####**識別子の名前を変えるときには**
　バージョン管理しているときには、識別子の名前の変更はそれだけでコミットしよう。識別子の変更とロジックの変更を同時にしてしまうと、何か問題を生じたときにどの変更が問題を生じたのかをたどりにくくする。だから、識別子の名前の変更はそれだけでコミットしている。
　変更の影響が少ないのは、ローカル変数の名前、関数定義の引数の名前の変更、関数名の変更の順であるから、変更の影響が大きい改変には少しばかり慎重になる。リファクタリングが落ちついてきて、関数の動作にも自信が持てるようになってきたら、普通にリファクタリングの本が勧めているようにわかりやすい、誤解をまねきにくい名前に変更しよう。
Linux(systemd)を入れたノートPCを、閉じてもサスペンドさせないようにする

完全に自分用備忘録です。
毎度毎度忘れるんですよねえ。

早速本題へ入ります。
使うのはみんな大好きCentOS7.1
設定変更するファイルは `/etc/systemd/logind.conf` になります。

中身はこんな感じですね。

```bash:/etc/systemd/logind.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# See logind.conf(5) for details

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min
```

全部コメントアウトされていますね。
この中にある `HandleLidSwitch` の設定を変更します。
元々コメントアウトしているので新たに追記してしまっても構いません。

私はファイルを弄るのが面倒なので、一旦コピーを取ってからリダイレクトで新たに追記してしまいます。
「追記はしたくない！」って方は直接ファイル弄るなりsedを使うなりしてください。

```bash
$ cp -ip /etc/systemd/logind.confs{,.orig}
$ echo -e "\n###added 2015/10/01\nHandleLidSwitch=ignore\n###" >> /etc/systemd/logind.conf
```

diffで差分を取るとこんな感じになります。
末尾に数行追記されているだけです。

```bash
$ diff -c /etc/systemd/logind.conf{.orig,}
*** /etc/systemd/logind.conf.orig       2015-10-01 00:45:23.156545333 +0900
--- /etc/systemd/logind.conf    2015-10-01 00:42:58.362242628 +0900
***************
*** 24,26 ****
--- 24,30 ----
  #LidSwitchIgnoreInhibited=yes
  #IdleAction=ignore
  #IdleActionSec=30min
+
+ ###added 2015/10/01
+ HandleLidSwitch=ignore
+ ###
```

設定を即座に反映させたいので、 `system-logind` サービスの再起動を実施します。
これがなんとなく不安ならリブートしてみても良いですね。

```bash
$ systemctl restart systemd-logind
```

これでノートPCを閉じてもサスペンドされなくなりました。
めでたしめでたし。

<br />

**参考URL：**
[ArchLinuxの電源管理](https://wiki.archlinuxjp.org/index.php/電源管理)
tvOSはネイティブでも実装できるようだけどどうなっているの？

# 推奨されているのはServer-Client形式

公式のドキュメントを見ていると「サンプル作ったらStoryboard消せ！」ってかいてある。ワイルドだ。
https://developer.apple.com/library/prerelease/tvos/documentation/General/Conceptual/AppleTV_PG/YourFirstAppleTVApp.html

# でもネイティブでも作れる

そう、作れる。
その証拠に以下のドキュメントを見てみよう。

UITableViewにはtvOSから追加されたprotocolがある。
https://developer.apple.com/library/prerelease/tvos/documentation/UIKit/Reference/UITableViewDelegate_Protocol/index.html

## なんで？

tvOSではタッチディスプレイではない。
リモコンがあって常にUIのどれかにフォーカスが当たっている状態にある。
なので既存のDelegateメソッドだけじゃ足りず、追加されている。
注意: 3D Touch対応デバイスのみで現れるジェスチャーの挙動


3D Touch搭載デバイスの登場によって、公開中のアプリに不具合が発生し修正が必要となったので共有します。

`UIGestureRecognizer`のサブクラスを作って簡単に比較します。


## `UIGestureRecognizer`のSubclass

### MyGestureRecognizer.h

```objc
#import <UIKit/UIKit.h>

@interface MyGestureRecognizer : UIGestureRecognizer

@end
```

### MyGestureRecognizer.m

```objc
#import "MyGestureRecognizer.h"

@implementation MyGestureRecognizer

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"%s::", __PRETTY_FUNCTION__);
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"%s::", __PRETTY_FUNCTION__);
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"%s::", __PRETTY_FUNCTION__);
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"%s::", __PRETTY_FUNCTION__);
}

@end

```

## ログの結果

0.2sほどの一瞬のシングルタップで比較します。

### 非3D Touch搭載デバイスのログ
```
-[MyGestureRecognizer touchesBegan:withEvent:]::
-[MyGestureRecognizer touchesEnded:withEvent:]::
```


### 3D Touch搭載デバイスのログ
```
-[MyGestureRecognizer touchesBegan:withEvent:]::
-[MyGestureRecognizer touchesMoved:withEvent:]::
-[MyGestureRecognizer touchesMoved:withEvent:]::
-[MyGestureRecognizer touchesMoved:withEvent:]::
-[MyGestureRecognizer touchesEnded:withEvent:]::
```


## 結論
非3D Touch搭載デバイスでは間に生じなかった`touchesMoved:withEvent:`が、素早いシングルタップであっても3D Touch搭載デバイスでは複数回呼ばれるので注意。

`touchesMoved:withEvent:`の発生でジェスチャをキャンセルするような使い方をしていると全く動作しません。
UIButtonにsetImageしたときもAspectFitできる。

UIButtonにsetImageしたときも、UIImageViewと同様にAspectをコードで変更できます。

//Button作成
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0,0,44,44);

//UIImageの作成
UIImage *image = [UIImage imageNamed:@"ABCimage.png"];

//Buttonにimage貼り付け
[button setImage:image forState:UIControlStateNormal];

//Aspect変更
button.imageView.contentMode = UIViewContentModeScaleAspectFit;


以上です。
TypeScript/ES7で継承不可なクラス

ガチガチに固めた、静的な言語のようなクラスをJavaScript(TypeScript+ES6+ES7)で作ってみるシリーズ。

# 継承不可なクラス

「継承しないといけないクラス」は抽象クラスとしてTypeScript1.6から使えるようになった。が、逆の「継承してはいけないクラス」を定義することができない。

継承されるとまずいクラスがある場合、運用でカバーするしかないが、人間やるなと言われるとやりたくなるもので、運用でなんとかする方法論はだいたいうまくいかない。

```javascript:フリじゃ無いと言われてもさぁ
/**
* いいか？おまえら。絶対継承するなよ？継承するなよ？
*/
class DontInherit{}

/**
* 「絶対○○するな」＝「やれ」ということだな！
*/
class Oyakusoku extends DontInherit{}

/**
 * やるなっていっただろー！？
 */
var ostrich = new Oyakusoku();
console.log(ostrich instanceof DontInherit);	//true
```

## `@final` decorator

Javaのfinal classやC#のsealed classはそのような継承不可なクラスを定義するものだ。そこで`@final`というデコレータをつくってみた。このデコレータを使うとクラスを継承しようとするとランタイムエラーが発生する。

```javascript:継承できない
@final class DontInherit{}
class Oyakusoku extends DontInherit{}

var ostrich = new Oyakusoku();	//runtime error! : A class "Oyakusoku" cannot inherit from @final class "DontInherit".
```

## 仕組み

仕組みは簡単で、コンストラクタ内の処理で基底クラス(のコンストラクタ関数)名と`this`オブジェクトのクラス(のコンストラクタ関数)名を比較して違っていたらエラーにするだけ。

```javascript:@finalの仕組み
const base = target;	//targetは基底クラスのコンストラクタ

//中略

//thisのprototype経由でコンストラクタ名を取得
const thisname = Object.getPrototypeOf(this).constructor.name;

//名前が違っていたらエラーをthrow
if(thisname!==base.name){
	throw Error(`A class "${thisname}" cannot inherit from @final class "${base.name}".`);
}
```

ES6(ES2015)から導入されたクラスだが、<del>直接クラス名を取得する方法は無い</del><ins>`.name`プロパティで仕様では取得できるが、[多くの環境で非対応](https://kangax.github.io/compat-table/es6/#test-function_name_property_class_statements)</ins>。ただし、ES6のクラスはシンタックスシュガーでしかないので、コンストラクタの関数名`prototype.constructor.name`を取得することでクラス名を得る事ができる。

## 制限

名前で比較するので基底クラスに名前が無いと機能しない。もっとも、匿名クラスにデコレータはつけられない様子。

```
@final	//error!: Decorators are not valid here
var AnonymousClass = class {}
```

なお、残念ながらbabelでは今回のコードは動かない。

# コード


githubに今回作った`@final`デコレータを[公開している](https://github.com/ConquestArrow/deco/blob/master/src/final.ts)。
今流行り(?)のGearVRのNDK開発を試みる【作成中】

## なぜGear VRなのか？
GearVRのパススルーモードを用いると、Android端末を通して、目の前の風景が見ることができるわけですが、それをARと組み合わせたら何か面白いのではないか。拡張現実かっこいい、などと考え、安易に手をつけてしまった。とりあえずNDK開発でGearVR用アプリのNDK開発環境作ってみよう…とりあえずなどどと甘い考えであることに気づいた今日この頃。。少し開発環境構築に進捗が見られたので、此処にまとめ始める。SE2年目の秋。

## gearVRを簡単に紹介

SamSungのGalaxyS6と組み合わせて利用するVRヘッドマウントディスプレイです。
近々、セットできる端末数をいくつか増やした新しいものが発売されるらしい。

![gearVR.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/824d174a-d5d9-998a-ec14-b8d53c8413cf.png)

参考：https://www.oculus.com/en-us/gear-vr/

## はじめにGearVRの公式ページへ
[GearVR公式HP](https://www.oculus.com/ja/gear-vr/)にて、Top > 開発者 > MOBILE SDK (v.0.6.2.0)と進むとGearVR開発用のOculus Mobile SDKを入手できます。少し重いので、FireFox専用アプリ[DownThemAll!](https://addons.mozilla.org/ja/firefox/addon/downthemall/)とか使うとサクっとダウンロードできるかと。

## 取り扱い説明書を入手する
ダウンロードしたovr_sdk_mobile_<v>ファイルの中を見ているとDocファイルなるものがあります。その中にreadme.txtがあり、[このURL](https://developer.oculus.com/documentation/mobilesdk/latest/)にドキュメントあるよと書いてあります。
（1個前のバージョンではここにpdfが入ってたのに。夏頃だったか・・時間の流れを感じますね）
大体のことはここに書いてあります。
読み解いていきます。

## 用意したもの
- GearVR本体
- Galaxy S6, Galaxy S6Edge
- PC(windows, 64bit, 16GB)

## ざっくり環境構築
1. Android端末の設定
    - USBデバッグ可能になっているか
        - 初めてUSBデバッグを試みる人は、設定 > 端末情報 のビルド番号の部分を7回タップすると開発者向けオプションが設定のどこかに出現します
        - 開発者向けオプションでUSBデバックにチェックをします
    - PCにUSB接続できるかどうかのチェックは下のコマンドで確認できます。上手く接続できていれば、端末の情報が表示されます。

    ```
    $ adb devices
    ```  
    - Samsungの端末は専用のUSBドライバを入れなければならない場合もあるので、うまくいかない人は入れてみてください
        - [Kies](http://www.samsung.com/jp/support/usefulsoftware/KIES/) 


2. 開発環境構築に必要なもの
    - Java Development Kit (JDK)
    - Android Development Tools (ADT) Bundle
    - Android Native Development Kit (NDK)
    - Apache Ant

3. GearVRのサンプルコードの実行に必要なもの
    - Oculus Mobile SDK
    - [ココ](https://developer.oculus.com/osig/)で端末認証用のキーを作成
        - GearVR用のアカウントの作成

＊サンプルコードのビルドと起動ができるまで、今後設定など詳しく書き足していきます

To Be Continue...
UIButtonの角丸とか枠線とかをInterfaceBuilderで設定＆確認できるようにする。


UIButtonに角丸とか枠線とか付けたいことがちょくちょくある。
でもIBで普通にボタンを置いても設定できない。
コード上で設定はできるけど、見た目の問題なのでIBでやりたい。

## @IBDesignable / @IBInspectable
@IBDesignableと@IBInspectableを使えば実現できる！

* @IBDesignable
 * クラスに付ける（UIViewのサブクラス）
 * IBでリアルタイムでプロパティが反映されるようになる
* @IBInspectable
 * プロパティに付ける
 * IBで設定できるようになる

以下サンプルコード

```CustomClass.swift
@IBDesignable class CustomButton: UIButton {

    // 角丸の半径(0で四角形)
    @IBInspectable var cornerRadius: CGFloat = 0.0
    
    // 枠
    @IBInspectable var borderColor: UIColor = UIColor.clearColor()
    @IBInspectable var borderWidth: CGFloat = 0.0
    
    override func drawRect(rect: CGRect) {
        // 角丸
        self.layer.cornerRadius = cornerRadius
        self.clipsToBounds = (cornerRadius > 0)
        
        // 枠線
        self.layer.borderColor = borderColor.CGColor
        self.layer.borderWidth = borderWidth
        
        super.drawRect(rect)
    }
}
```

## 使ってみる
ボタンを置く。
![スクリーンショット 2015-09-30 18.13.31.png](https://qiita-image-store.s3.amazonaws.com/0/39565/8942b3b5-1b98-d6ff-630d-a5608e476507.png "スクリーンショット 2015-09-30 18.13.31.png")

作ったクラスを設定する
`Designables`の項目が "Up to date" になればOK
![スクリーンショット 2015-09-30 18.11.56.png](https://qiita-image-store.s3.amazonaws.com/0/39565/4d8c1cdd-71e9-ab4b-68cb-7c56b974594f.png "スクリーンショット 2015-09-30 18.11.56.png")

@IBInspectableをつけたプロパティが設定できるようになっている！
![スクリーンショット 2015-09-30 18.12.07.png](https://qiita-image-store.s3.amazonaws.com/0/39565/a8f35298-54ab-697d-434c-09b6cc80d522.png "スクリーンショット 2015-09-30 18.12.07.png")

なので設定してみる
![スクリーンショット 2015-09-30 18.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/39565/e247f839-589b-efa0-8e34-a98c91c1eb21.png "スクリーンショット 2015-09-30 18.14.16.png")

するとボタンの見た目が変わる！
![スクリーンショット 2015-09-30 18.14.02.png](https://qiita-image-store.s3.amazonaws.com/0/39565/e99fda13-063b-ea6f-d1ca-06c54515e657.png "スクリーンショット 2015-09-30 18.14.02.png")

## まとめ
これでデザインのためのプログラム書かなくていいし、いちいち実行して確認しなくてよくなる！
もちろんボタンに限らず、例えばラベルのインデントを設定できるようにするなど、
いろいろ便利になるはずなので是非お試しあれ。
プログラミング未経験者がRuby on Railsチュートリアル（英語Ver.）1周目を完了したので内容をまとめてみる。


## 1周目を進めていく上で方針としたこと
- 3周やることを前提に、わからない部分はメモだけ残してあまり深入りしない
- コードはコピペせず全てタイプする（※HTMLやCSS等も含めて全部）
- 1周目はテストを書かない（※2周目、3周目からは書いていきます）

## 前提知識（チュートリアルに取り組む前にやったこと）
- HTML/CSS/JavaScriptの基礎インプット（※Treehouseという学習サイトを利用）
- Git/Unixの基礎インプット（※Treehouseという学習サイトを利用）
- 簡単なRailsを用いたTo-doアプリ作成（※Treehouseという学習サイトを利用）
- Rubyの基礎インプット（※Progateという学習サイトを利用）
- 書籍「基礎Ruby on Rails」全体を軽く1周
- 書籍「Ruby on Rails4 アプリケーションプログラミング」 1章〜3章

## 合計所要時間
40時間

## 第1章
- 所要時間：3時間
- 難易度：易しい
- 主要トピック：
  - Railsセットアップ
  - Hello, world!アプリ作成
  - Git/Bitbucketセットアップ
  - Herokuセットアップ/初めてのデプロイ

## 第2章
- 所要時間：1時間
- 難易度：易しい
- 主要トピック：
  - scaffold機能を用いた簡単なアプリ作成
  - MVCモデルの説明
  - RESTに基づくルーティング設計

## 第3章
- 所要時間：2時間
- 難易度：易しい
- 主要トピック：
  - Railsアプリ環境設定おさらい（※今後チュートリアルで作成していくTwitterクローンアプリのセットアップ）
  - 静的ページ作成（ERBの導入/テンプレート操作）

## 第4章
- 所要時間：3時間
- 難易度：普通
- 主要トピック：
  - Rubyの概要説明（メソッド/データの型/クラス 等）

## 第5章
- 所要時間：3時間
- 難易度：易しい
- 主要トピック：
  - 静的ページ作成続き（レイアウト作成）
  - Bootstrapの導入/CSS編集
  - 部分テンプレートの導入
  - アセットパイプライン/Sassの説明

## 第6章
- 所要時間：3時間
- 難易度：普通
- 主要トピック：
  - ユーザーモデル開発
  - ActiveRecordを用いた簡単なデータベース操作
  - フォームのバリデーション設定
  - パスワードの暗号化

## 第7章
- 所要時間：3時間
- 難易度：普通
- 主要トピック：
  - サインアップフォームの実装
  - RESTに基づくルーティング設計（リソース設定）
  - Gravatarを用いたプロフィール画像設定
  - ストロングパラメータ設定
  - SSL設定

## 第8章
- 所要時間：6時間
- 難易度：難しい
- 主要トピック：
  - ログイン・ログアウト機能の実装
  - セッション、クッキー、トークンを利用したユーザ状態の管理
  - ドロップダウンメニューの実装
  - 自動ログイン機能の実装

## 第9章
- 所要時間：3時間
- 難易度：普通
- 主要トピック：
  - ユーザー情報の編集機能（フォーム）実装
  - 編集権限の付与
  - ユーザーの一覧表示
  - シードデータの設定
  - ページネーションの実装
  - 管理者権限の付与
  - ユーザー削除機能の実装

## 第10章
- 所要時間：4時間
- 難易度：難しい
- 主要トピック：
  - メール認証によるアカウントアクティベーション
  - ActionMailerを利用したメール送信設定
  - パスワードリセット機能の実装
  - 認証用のカスタムURL生成

## 第11章
- 所要時間：5時間
- 難易度：普通
- 主要トピック：
  - Micropost（Tweet）モデルの開発
  - モデル間の関連付け（1対Nの関係性）
  - Micropost（Tweet）表示画面の実装
  - Micropost（Tweet）の作成と削除
  - 画像投稿機能の実装
  - Amazon S3の設定

## 第12章
- 所要時間：4時間
- 難易度：かなり難しい
- 主要トピック：
  - Follow/Follower機能の実装
  - ホームフィード画面の実装
  - モデル間の関連付け（多対多の関係性）
  - Follow一覧/Follower一覧ページの実装
  - Unfollow機能の実装

## 完成アウトプットイメージ
![live_status_feed.png](https://qiita-image-store.s3.amazonaws.com/0/94206/cbeeb53f-29c5-e4a6-7855-b0c7e720ec0e.png)

## 所感
- ただ動くものを作るというだけではなく、コードのリファクタリングや、セキュリティ面への配慮など、かなり実践的な内容であると感じた。知人のエンジニアからは `Railsチュートリアルの内容が全般的に習得できていれば、開発現場で即戦力になれる` と言われた。
- Ruby on Railsに関わる部分だけではなく、Bootstrapを利用したデザイン、Git/Bitbucketを用いたバージョン管理、Herokuを利用した本番環境へのデプロイ、アップロードされた画像をAmazon S3で保管するなども含まれているので、Webアプリケーションを開発していく上での全体像がすごくつかみやすい。
- とはいえプログラミング初心者が取り組む上にあたって、特に後半部分の難易度はかなり高いので、最低3回は繰り返すという前提で、わからない部分はどんどん飛ばしながら進めるのが良いと思われる。理解が難しい部分であまりにも深入りしてしまうと挫折する可能性が出てしまいそう。
- これが無料で公開されているというのは本当に感謝でしかない。
はじめまして「共通開発環境の準備」

#共通開発環境の準備#
- [Slack](https://slack.com/is)：対話
- [Trello](https://trello.com/)：目標管理
- [Sublime Text3](http://www.sublimetext.com/3)：エディタ
- [Node.js](https://nodejs.org/)：フレームワーク
- [Ionic Framework](http://ionicframework.com/)：フレームワーク
- [GitHub](https://github.com/)：ソースコード管理
- [Qitta](http://qiita.com)：Tip共有
- [Google Drive](https://www.google.com/intl/ja_jp/drive/):資料共有

***
## 対話
## 目標管理
## エディタ
 - SublimeText3

## フレームワーク
 - Node.js()
  - download : node-v4.2.1-x64.msi
  - install : next next finish
 - Ionic Framework
  - execute : Node.js command prompt

```Batchfile:cmd
  $ cd c:\
  $ mkdir game
  $ cd game
```
```Batchfile:cmd
  $ npm install -g ionic
  $ ionic start myApp tabs
```
* Run App

```Batchfile:cmd
  $ ionic serve [option]
```
* ionic View (in AppStore :inbox_tray:)

```Batchfile:cmd
  $ ionic upload
```

- ソースコード管理
- Tip共有
 - MarkDown(.md)

***