OmniAICreator/Qiita-1.07M huggingface dataset:
「warning: already initialized constant APP_PATH」というエラーが出た


WEBrickを立ち上げようとしたらエラーが出た。

```bash:shell
$ bin/rails s
bin/rails:6: warning: already initialized constant APP_PATH
bin/rails:6: warning: previous definition of APP_PATH was here
Usage: rails COMMAND [ARGS]

The most common rails commands are:
 generate    Generate new code (short-cut alias: "g")
 console     Start the Rails console (short-cut alias: "c")
 server      Start the Rails server (short-cut alias: "s")
 dbconsole   Start a console for the database specified in config/database.yml
             (short-cut alias: "db")
 new         Create a new Rails application. "rails new my_app" creates a
             new application called MyApp in "./my_app"

In addition to those, there are:
 application  Generate the Rails application code
 destroy      Undo code generated with "generate" (short-cut alias: "d")
 plugin new   Generates skeleton for developing a Rails plugin
 runner       Run a piece of code in the application environment (short-cut alias: "r")

All commands can be run with -h (or --help) for more information.
```

このエラーメッセージだけでは検討つかなかったが、
MySQLの`libmysqlclient`が読み込めていなかったのが原因だった。

以下のコマンドでシンボリックリンクを貼ったら、
正常にサーバが起動するようになった。

```bash:shell
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
```


# 参考

rails server bin/rails:6: warning: already initialized constant APP_PATH error
http://stackoverflow.com/questions/23402820/rails-server-bin-rails6-warning-already-initialized-constant-app-path-error
JodaTimeをAndroidで使うときの注意点

# JodaTimeとは

JavaのCalendarクラスは死ぬほど扱いが面倒くさいわけですが，それを直感的に扱えるようにしてくれたラッパーライブラリです．

使い方はこの辺の記事にお任せします
http://qiita.com/bukowski1920/items/81de2408099ce38a8721
http://www.mwsoft.jp/programming/java/joda_time_sample.html

## 初回の new DateTime() がスゴく遅い

スゴく便利なJodaTimeですが，初回の `new DateTime()` で日付周りを扱うためのリソースを読み込むため，めちゃくちゃ遅いです．
そのため，UIスレッドで `new DateTime()` する前に，アプリ起動時にバックグラウンドで new DateTime() してリソースをロードしておく等の工夫をする必要があります．

実際に計測してみると

```java
long start = System.currentTimeMillis();
new DateTime();
Log.d(TAG, "DateTime1: " + (System.currentTimeMillis() - start));

start = System.currentTimeMillis();
new DateTime();
Log.d(TAG, "DateTime2: " + (System.currentTimeMillis() - start));

start = System.currentTimeMillis();
new DateTime();
Log.d(TAG, "DateTime3: " + (System.currentTimeMillis() - start));
```

```text
DateTime1: 993
DateTime2: 0
DateTime3: 0
```

と，約1秒もの時間が掛かっていることが分かります．
(RK3066 1.6GHzx2（？） 1GB RAMの実機で確認)

うかつにUIスレッドでぶち当たるとANRに繋がったりUXを著しく低下させることに繋がるため，注意が必要です．

## その他

コードを詳しく追っているわけでは無いので，何か回避策があるのかもしれません．
（デフォルトロケールを指定すればそのリソースだけを読み込むから早くなる等）

アプリケーションやActivityのライフサイクルで，どのタイミングで読み込んだリソースが破棄されるのかも把握していません．
おそらくプロセスが死ぬまでは生きていると思いますが，プロセスが死んだ後の復元処理などでも `new DateTime()` で時間が掛かる可能性があることを考慮する必要があります．
Swift+CocoaControls(CocoaPods)でスマートなUIを作る

#はじめに
CocoaCotrolsではiOSで使えるUIを検索&Downloadすることができるサービスです。
FacebookアプリのあのUIとか、LINEアプリのあのUIとか、
馴染みのある素敵なUIを簡単に利用することができるので、開発者はロジックの実装に専念できます。
今回は「MailBox」に実装されているリストを左右にスワイプさせることができるSwipeCellを簡単に実装してみたいと思います。
CocoaPodsはObj-C用の管理ツールですが、
Bridging-Header経由でimportすることでSwiftからも利用することができます!

>CocoaControls
>https://www.cocoacontrols.com/

#0.MailBox
![スクリーンショット 2014-10-14 16.56.34.png](https://qiita-image-store.s3.amazonaws.com/0/43766/b509a78c-dc05-7605-b83f-d5535c67b094.png)

#1.プロジェクトの作成
「SwiftMCSwipeViewDemo」という名前でプロジェクトを生成する

#2.Podfileの設定とモジュールのインストール
>$ cd /Users/workspace/SwiftMCSwipeViewDemo
>$ ls 
>ディレクトリの階層は下記になります。

	|-SwiftMCSwipeViewDemo
	|-SwiftMCSwipeViewDemo.xcodeproj
	|-SwiftMCSwipeViewDemoTests

>$ vim Podfile
>下記のように設定を記述する

	--------------------------
	platform :ios, '8.0'
	pod "MCSwipeTableViewCell", "~> 2.1.0"
	--------------------------

>$ pod install
>	Installing MCSwipeTableViewCell (2.1.2)
>$ ls 
>ディレクトリの階層は下記になります。

	|-Podfile
	|-Podfile.lock
	|-Pods
	|-SwiftMCSwipeViewDemo
	|-SwiftMCSwipeViewDemo.xcodeproj
	|-SwiftMCSwipeViewDemo.xcworkspace
	|-SwiftMCSwipeViewDemoTests


#3.SwiftMCSwipeViewDemo.xcworkspaceをXcodeから開く
これまで仕様していた.xcodeproj拡張子のファイルをそのまま使用すると
ld: library not found for -lPods
というエラーに悩まされます...。必ずCocoaPods利用プロジェクトは.xcworkspace拡張子のファイルを開き直すようにしましょう。



#4.Bridging-Headerを作る
New Fileメニュー>Cocoa Touch Classを選び、言語を　「Objective-C」にしてクラスを生成するとbridging header?と聞かれるので、Yesを押下するとSwiftMCSwipeViewDemo-Bridging-Header.hが作成される。

![スクリーンショット 2014-10-14 16.32.09.png](https://qiita-image-store.s3.amazonaws.com/0/43766/c1c3ca6d-f91d-28e5-f8b9-9024bd351a3c.png)

![スクリーンショット 2014-10-14 16.32.42.png](https://qiita-image-store.s3.amazonaws.com/0/43766/58936287-38e1-5bd3-ed03-4156593ed9ca.png)

![スクリーンショット 2014-10-14 16.32.55.png](https://qiita-image-store.s3.amazonaws.com/0/43766/f3713201-3686-a2e3-946a-b13094edf49c.png)

#5.Headerにimportを記述する
SwiftMCSwipeViewDemo-Bridging-Header.h
にimportを記述する

![スクリーンショット 2014-10-14 16.33.24.png](https://qiita-image-store.s3.amazonaws.com/0/43766/61466259-08cf-4043-9199-2d0b7f471d97.png)

#6.storyboardにtableViewを配置->ViewControllerのOutlets(dataSource)に登録する
![tableView.png](https://qiita-image-store.s3.amazonaws.com/0/43766/185c150a-a15c-5a40-fbd0-1ce809c15351.png)


#7.ViewController.swiftに「func tableView」を設定する
>Githubのソースを参考
>https://github.com/oggata/SwiftMCSwipeViewDemo/blob/master/SwiftMCSwipeViewDemo/ViewController.swift

#8.iOS Simulatorで実行する
![スクリーンショット 2014-10-14 16.57.52.png](https://qiita-image-store.s3.amazonaws.com/0/43766/4635443b-3359-0d64-7074-1b92b75cc4fe.png)

#9.おしまい
CocoaCotrolsには数多くのUIが登録されています。
使い方はMCSwipeTableViewCellと同じようにして、podインストールして、Bridging-Headerからimportをおこなうことで、簡単に使用することができます！！
CSSを用いて1/3 の均等なグリッドを配置する。

# CSS

```css
.grid3 {
    float: none;
    clear: both;
}

.grid3 > div {
    width: calc((100% * 1/3) );
    float: left;
}
```

# HTML

```html
<div class="grid3">
    <div>area1</div>
    <div>area2</div>
    <div>area3</div>
</div>
```
AngularJSを1.2系から1.3.0にあげたらrequireした親のコントローラを使っているdirectiveでエラーが出た。


コードはこんな

```error.coffee
"use strict"

#parent
#controller

angular.module("myApp")
.controller("ParentItemCtrl", ($scope,Child) ->
   #.......  coffeeなので自動で波括弧をつけてくれるが明示的につけておいた ............
  {
    removeChildItem: (childId, index)->
      Child.destroy({childId: childId}, ->
        $scope.parent.children.splice(index, 1)
      )
  }
)

#directive

angular.module("myApp")
.directive("parentItem", ->
  restrict: "EA"
  templateUrl: "templates/parent_item.html"
  controller: "ParentItemCtrl"
  scope:
    parent: "=item"
)

#child directive

angular.module("myApp")
.directive("childItem", ($modal)->
  restrict: "EA"
  templateUrl: "templates/child_item.html"
  require: "^parentItem"
  scope:
    child: "=item"
  link: (scope, element, attrs, parentItemCtrl) ->
    scope.open = ()->
      modalInstance = $modal.open({
        templateUrl: "/remplates/modal_confirm.html"
      })

      modalInstance.result.then(->
        parentItemCtrl.removeChildItem(scope.child.id, scope.$index) 
　　　　　# ↑ ここでremoveChildItemがないとエラー
      )
)

```

controllerの関数で公開したいものだけ(この場合はremoveChildItem)をモジュールパターンを使って返していて、1.2系では動いていたけど、1.3では動かなくなった。
chromeのDeveloper Toolsで確認すると、parentItemCtrlは、1.2系では期待どおりオブジェクトがわたってきていたが、1.3では$get.Constructorとなっていた。

↓1.2
![1.2.png](https://qiita-image-store.s3.amazonaws.com/0/42024/1d880e91-78c5-d9d9-1ddb-e5cf0df244f6.png "1.2.png")

↓1.3
![1.3.png](https://qiita-image-store.s3.amazonaws.com/0/42024/eb6ea05a-1db0-e081-2d88-ea8a025fc48e.png "1.3.png")

ので、コントローラを以下のように変更した。

```parent_item.coffee
angular.module("myApp")
.controller("ParentItemCtrl", ($scope, Child) ->
  #.......
  @removeChildItem = (childId, index)->
    Child.destroy({childId: childId}, ->
      $scope.parent.cildren.splice(index, 1)
    )
)
```
CSSを用いて画面のサイズを最低１画面にし、ヘッダーフッターを最上部・最下部に配置する

`min-height: calc(100vh);` => １画面を最小とする
`height    : 100%;`        => スクロールありで表示領域を最大とする。
`margin    : 0 auto;`      => 画面のセンターに配置する。

```html

<!DOCTYPE html>
<html>
	<head>
	<style>
		* {
			margin: 0;
			padding: 0;
		}
		.header {
			top: 0px;
			position: absolute;
			background-color: #000;
			color: #FFF;
			height: 60px;
			width: 100%;
		}
		.footer {
			bottom: 0px;
			position: static;
			background-color: #000;
			color: #FFF;
			height: 60px;
			width: 100%;
		}
		.wall {
			width: 100%;
			min-height: calc(100vh);
			height: calc(100%);
		}
		.container {
			padding-top: 65px;
			padding-bottom: 5px;
			min-height: calc(100vh - 130px);
			height: calc(100%);
			max-width: 1000px;
			min-width: 600px;
			margin: 0 auto;
		}
	</style>
	</head>
	<body>
		<div class="wall">
			<div class="header">
				<h1>Title</h1>
			</div>
			<div class="container">
				<h3>CONTENTS<h3>;
			</div>
			<div class="footer">
				<h3>Footer</h3>;
			</div>
		</div>
	</body>
</html>
```
forループ


```
void setup() {
    size(400, 400);  
    background(255); 
    smooth();
    noStroke();
    frameRate(30);
}

void draw() {
    background(255);

    for(int i=0; i<20; i++){

        for (int j = 0; j < 20; ++j) {
            fill(random(255), random(255), random(255));
             ellipse(i*20+10, j*20 + 10, 10, 10);
        }
    }
}


```
CocoaPodsでpod repo addしたライブラリがUnable to findするとき

方法はふたつ
(1) Specs.gitを削除する

```
source 'https://github.com/CocoaPods/Specs.git' # ←これを消す
```

(2) Specs.gitに加えて、repo addしたリポジトリもsource指定する

```
# pod repo add hogehoge https://github.com/hogehoge..
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/hogehoge..' # ←追加する
```
Scalaでretryしたい


```scala
// Returning T, throwing the exception on failure
@annotation.tailrec
def retry[T](n: Int)(fn: => T): T = {
  util.Try { fn } match {
    case util.Success(x) => x
    case _ if n > 1 => retry(n - 1)(fn)
    case util.Failure(e) => throw e
  }
}

// Returning a Try[T] wrapper
@annotation.tailrec
def retry[T](n: Int)(fn: => T): util.Try[T] = {
  util.Try { fn } match {
    case x: util.Success[T] => x
    case _ if n > 1 => retry(n - 1)(fn)
    case f => f
  }
}
```

http://stackoverflow.com/questions/7930814/whats-the-scala-way-to-implement-a-retry-able-call-like-this-one
はじめてGitHub APIつかってみた

はじめてGitHubAPIをつかってみたのでメモ投稿。
2段階認証しているユーザでは以下のコマンドではjsonが取得できません。

**APIトークンを取得する**

`curl -u 'ユーザ名' -d '{"scopes":["repo"],"note":"Help example"}' https://api.github.com/authorizations`

**所属チームを取得する**

`curl -u 'ユーザ名' https://api.github.com/user/teams`
コンソールでAA文字

#banner(sysvbanner)
```
$ banner Qiita
 #####
#     #     #       #     #####    ##
#     #     #       #       #     #  #
#     #     #       #       #    #    #
#   # #     #       #       #    ######
#    #      #       #       #    #    #
 #### #     #       #       #    #    #
```

#figlet

```
$ figlet Qiita
  ___  _ _ _        
 / _ \(_|_) |_ __ _ 
| | | | | | __/ _` |
| |_| | | | || (_| |
 \__\_\_|_|\__\__,_|
                    
```

#toilet

```
$ toilet Qiita
                                   
  mmmm    "      "      m          
 m"  "m mmm    mmm    mm#mm   mmm  
 #    #   #      #      #    "   # 
 #    #   #      #      #    m"""# 
  #mm#" mm#mm  mm#mm    "mm  "mm"# 
     #                             
```                                   

# cowsay

```
$ cowsay Qiita
 _______
< Qiita >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

```
$ cowthink Qiita
 _______
( Qiita )
 -------
        o   ^__^
         o  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```
Gitlabのロゴを差し替える

#やること
Gitlabは性能的には申し分ないのですが、会社で使う時に少々困るというか、恥ずかしいのが、ロゴのデザインです。日本人の感覚からすると可愛くないキツネのような顔のロゴについて、同僚から聞かれて困ったことがあります。
やはり、同じような思いをした人が居るようで、ネットで検索すると画像を差し替えた人の記事がヒットします。
##画像の種類
画像は、ログイン画面用のブランドロゴとヘッダ用の画像2種です。ヘッダ用画像は、ヘッダの背景色に合わせて2種類用意されています。それぞれサイズが違い透過PNGとなっています。
###brand_logo.png(720px X 464px)
![brand_logo.png](https://qiita-image-store.s3.amazonaws.com/0/7839/eb129f7c-8745-b33e-acee-f6c7a5bcac30.png)
###logo-black.png(72px X 65px)
![logo-black.png](https://qiita-image-store.s3.amazonaws.com/0/7839/3e07ffab-6d00-1bb1-3f5a-faa8150b15d3.png)
###logo-white.png(84px X 79px)
![logo-white.png](https://qiita-image-store.s3.amazonaws.com/0/7839/c8e7d4e9-7bde-ba04-0047-3af572ff1d38.png)

##画像の場所(1)
この場所を変更しても表示は変化しませんが、この場所が元画像の置き場となるようです。アップデートなどを行うと、このフォルダの画像に差し替わるようです。
/opt/gitlab/embedded/service/gitlab-rails/app/assets/images
brand_logo.png
logo-black.png
logo-white.png

##画像の場所(2)
この場所の画像を上書きすると表示が切り替わります。ファイル名の後半がハッシュ値のような文字列が付加されていることに注意してください。このフォルダの画像だけを書き換えるとアップデート処理などで画像が元に戻ってしまうようです。
/opt/gitlab/embedded/service/gitlab-rails/public/assets
logo-black-＊.png
logo-white-＊.png
brand_logo-＊.png

##画像の差し替え
デザイン崩れが起きないように、同じサイズの画像を用意してファイルの上書きを行います。
会社で使用するのであれば、会社のブランドロゴにすると雰囲気が出て良いと思います。

画像へのパスは、dpkg(パッケージマネージャー)でインストールした場合のフォルダ構成です。
bitnamiのインストーラーやDebian系でないディストリビューションを使っている場合には、違う構成になっているかもしれません。

#追記
Gitlabをコマメにアップデートされている人は、ご存知だと思いますが、Logoが変更になっています。
日本人の感覚では～、と思っていたのですが、海外でも良く思われていなかったようです。
Twitterとかで、投票が呼びかけられて新しいロゴが決定したみたいです。
[A new GitLab Logo](https://about.gitlab.com/2015/05/18/a-new-gitlab-logo/)

こちらが、新しいロゴです。
![msapplication-tile.png](https://qiita-image-store.s3.amazonaws.com/0/7839/f6666cc1-84f7-a7cf-2250-7d5ecf34d072.png)
調べてみると画像の置かれているパス（ファイル名）も変更されているようです。
/opt/gitlab/embedded/service/gitlab-rails/app/assets/images
msapplication-tile.png
touch-icon-ipad.png
touch-icon-ipad-retina.png
touch-icon-iphone.png
touch-icon-iphone-retina.png
名前から推測するに、Appleのデバイスは、見分けて画像を切り替えているみたいですね。
新しいロゴなら「絶対変えたい！」という方は少ない気もしますが、会社のロゴに変更したいという要望もあるかと思いますので、参考にして頂ければと思います。
getElementsByClassNameが使えないブラウザで利用する方法


**getElementsByClassNameが使えないブラウザで利用する場合のコード**

すぐ忘れるのでメモ

```js:javascript
if(typeof(document.getElementsByClassName) == "undefined"){
  document.getElementsByClassName = function(t){
    var elems = new Array();
    if (document.all){
      var allelem = document.all;
    } else {
      var allelem = document.getElementsByTagName("*");
    }
    for (var i = j = 0, l = allelem.length; i < l; i++) {
      var names = allelem[i].className.split(/\s/);
      for (var k = names.length - 1; k >= 0; k--) {
        if (names[k] === t) {
          elems[j] = allelem[i];
          j++;
          break;
        }
      }
    }
    return elems;
  };
}
```
visudoでsudo権限の設定をする際のメモ（sudoersの'ers'って何の略なんですかね？）

# sudoersファイル

Linuxでは

* /etc/sudoers

FreeBSDでは

* /usr/local/etc/sudoers

に存在する設定ファイル。
この設定ファイルを変更して、sudoできるユーザや特定のコマンドを設定できる。

sudoersに文法ミスなどで誤った設定を記述した場合、sudoできなくなる可能性がある。
このファイルは直接編集すると危険なのでvisudoコマンドを通して編集する。

```bash
$ visudo
```
visudoではviが起動されてsudoersを編集するが、
コマンドの終了時にファイルの文法をチェックして問題があれば警告を出して
再度の変更を促し、誤った変更を破棄する。


# sudoersの書式


基本的に下記のような形で設定する。


```bash
# who     where     = (as_whom)      what 
user1 ALL = (root) /sbin/service httpd start
```
この記述で
ユーザwhoが、ホストwhereで、権限as_whomで、コマンドwhatを実行できる。

## who

ユーザ名またはグループ名を記述する。
カンマを使ってユーザ名のリストにすることもできるが、１行に１つのユーザを追記する人が多い気がする。
グループ名を指定する場合は、グループ名の前に'%'をつける。

```bash
%wheel ALL = (ALL) ALL
```

## where

ホスト名またはIP アドレス、またはネットワークアドレス、またはネットグループ名をコンマ区切りにしたリスト。
sudoersを複数のマシンで簡単に共有して使いたい場合は、'ALL'を記述する。

```bash
user01 work1,work2 = (ALL) ALL
%admin ALL = (root) ALL
```

## as_whom

誰の権限で実行が可能かを記述する。
ALLで全員の権限での実行を可能にする。
指定がない場合はデフォルトで'root'が指定されたことになる。

例えば

```bash
user01 ALL = (postgres) psql
```

と記述した場合、user01はpostgresの権限でpsqlコマンドを実行できる。

```bash
user01$ sudo -u postgres psql
```

## what
絶対パスで指定したコマンドを、カンマ区切りのリスト形式で記述する。
引数を指定した場合、指定された引数以外の引数でコマンドを実行することは出来なくなり、
引数を指定しない場合、任意の引数で実行できる。

```bash
## /sbin/service/httpd stop は実行できない
user01 ALL = (ALL) /sbin/service httpd start
```

```bash
## /sbin/service/httpd start
## /sbin/service/httpd stop
## 両方とも実行できる
user01 ALL = (ALL) /sbin/service httpd
```

# 参考資料
より詳細を調べたい場合は適宜man sudoersで。

Man page of SUDOERS
http://linuxjm.sourceforge.jp/html/sudo/man5/sudoers.5.html
KVMでvirshコマンドを打つとPermission deniedで怒られる


普通にKVMをインストールしたあと、`virsh`コマンドを打ったら`Permission denied`で怒られました。
私の場合はグループへの追加が必要だったという簡単な話だったのですが、調べたら設定がおかしいんじゃないかとか色々書いてあったので一応メモしておきます。

#環境
- ホストOS
 - Ubuntu 14.04
- KVM
 - virsh 1.2.2

#状況
おもむろにKVMをインストールします。

```console
$ sudo apt-get install kvm libvirt-bin bridge-utils virt-manager -y
```

そのあと、`virsh`コマンドを打ちます。

```console
$ virsh list --all
error: failed to connect to the hypervisor
error: no valid connection
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
```

ただインストールしただけなのにいきなり`Permission denied`と怒られて萎えます。
権限を見てみると、`libvirtd`グループであれば使えるようです。

```console
$ ls -al /var/run/libvirt/
total 0
drwxr-xr-x  5 root root     140 Oct 14 05:22 .
drwxr-xr-x 24 root root     860 Oct 14 05:22 ..
srwxrwx---  1 root libvirtd   0 Oct 14 05:22 libvirt-sock
srwxrwxrwx  1 root libvirtd   0 Oct 14 05:22 libvirt-sock-ro
drwx------  2 root root      80 Oct 14 05:22 network
drwxr-xr-x  2 root root      40 Oct 14 05:22 qemu
drwxr-xr-x  2 root root      40 Oct 14 05:22 uml-guest
```

もちろん`root`ユーザなら使えますが、きちんと権限管理のために一般ユーザで起動できるように設定しておきます。

#解決策
##再ログインする
ユーザが`libvirtd`に追加されたあと、設定が反映されていない可能性があります。
インストール直後に

```console
$ sudo adduser $USER libvirtd
The user 'hoge' is already a member of `libvirtd'.
```

のように既に追加されていたら再ログインを試してみてください。

##グループlibvirtdへ追加する
まず１つ目としては、自分が使っているユーザがグループlibvirtdに所属していない可能性があります。

```console
$ sudo adduser $USER libvirtd
Adding user `hoge' to group `libvirtd' ...
Adding user hoge to group libvirtd
Done.
```

どうやら追加されていなかったようです。
設定を反映させるために再ログインします。
そのあと再度`virsh`コマンドを実行します。

```console
$ virsh list --all
 Id    Name                           State
----------------------------------------------------
```

無事に出来ました。
ただ、`apt-get`した時を見ていると

```console
$ sudo apt-get install kvm libvirt-bin bridge-utils virt-manager -y
（中略）
Adding group `libvirtd' (GID 116) ...
Done.
libvirt-bin start/running, process 8250
Setting up libvirt-bin dnsmasq configuration.
```
などと出ていたので自動で追加されていたものかと思ったのですが、何故かされていませんでした。
誰か分かる人教えてください。

##libvirtd.confの設定を見直す
公式ページなどでは、`/etc/libvirt/libvirtd.conf`の設定を見なおせ、と書いてあります。
もし以下の行がコメントアウトされていたらコメントアウトを外して下さい。

```console
$ sudo vim /etc/libvirt/libvirtd.conf
unix_sock_group = "libvirtd"
unix_sock_ro_perms = "0770"
unix_sock_rw_perms = "0770"
```

同じグループなら使えるような設定です。
このようにしたあと、

```console
$ sudo servie libvirt-bin restart
libvirt-bin stop/waiting
libvirt-bin start/running, process 8754
```

すれば良いです。
iOS アプリから Wi-Fi 認証画面を制御する

認証が必要なアクセスポイントに接続した際に表示される画面を抑制する方法のメモ。

## 実装
setter しか無いので制御を変更する場合は毎度値を設定する必要がある。

### 抑制する
```objectivec:example.m
#import <SystemConfiguration/CaptiveNetwork.h>

- (void)enable {
    NSMutableArray *supportedSSIDs = [NSMutableArray new];
    [supportedSSIDs addObject:@"target_ssid"];
    CFArrayRef supportedSSIDsRef = (__bridge CFArrayRef)supportedSSIDs;
    
    if(CNSetSupportedSSIDs(supportedSSIDsRef)) {
        NSLog(@"Successfully registered supported network SSIDs: %@", supportedSSIDs);
    }
    else {
        NSLog(@"Error: Failed to register supported network SSIDs: %@", supportedSSIDs);
    }

}
```



### 抑制を解除する
```objectivec:example.m
#import <SystemConfiguration/CaptiveNetwork.h>

- (void)disable {
    CFArrayRef supportedSSIDsRef = (__bridge CFArrayRef)@[];
    
    if(CNSetSupportedSSIDs(supportedSSIDsRef)) {
        NSLog(@"Successfully unregistered supported network SSIDs");
    }
    else {
        NSLog(@"Error: Failed to unregister supported network SSIDs");
    }
    
}
```

## その他挙動
### 他アプリで同一の SSID が制御された場合
Bundle ID 毎に管理されている模様。
そのため、他アプリで制御されても設定値が影響することはないし影響されることもない。

### アプリを削除した場合
アプリを削除しても SSID の抑制状態は元の状態に戻らない。

### ネットワーク設定の初期化を行なった場合
抑制状態が解除され、初期状態に戻る。
JUnitで標準入力をつっこんで流す

mainメソッドに直接書いちゃった時のテスト用

####引用元
http://d.hatena.ne.jp/kencoba/20120831/1346398388

っていうかこちらのサイトにわかりやすく書いてあるので皆さんこっちを参照してください。以下は私のメモ書きです。



####テストしたいクラス
```java:Main.java
import java.io.BufferedReader;
import java.io.InputStreamReader;

	public class Main {
	    public static void main(String[] args) throws Exception {
	        BufferedReader br = 
	        		new BufferedReader(new InputStreamReader(System.in));
	        String line = br.readLine();
	        System.out.println(line);
	        line = br.readLine();
	        System.out.println(line);
	    }
	}

```

###JUnitクラス
```java:uniTest.java
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class uniTest{

	private StandardInputSnatcher in = new StandardInputSnatcher();

	@Before
	public void before() {
		System.setIn(in);
	}

	@After
	public void after() {
		System.setIn(null);
	}

	@Test
	public void test() {
        in.inputln("Hello World");
        in.inputln("Hello Orange Sunshine");

		try {
			Main.main(null);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}
```

###InputStreamをオーバーライドしちゃうクラス

```java:uniTest.java
import java.io.IOException;
import java.io.InputStream;

public class StandardInputSnatcher extends InputStream {

    private StringBuilder buffer = new StringBuilder();
    private static String crlf = System.getProperty("line.separator");

    public void inputln(String str) {
        buffer.append(str).append(crlf);
    }

    @Override
    public int read() throws IOException {
        if (buffer.length() == 0) {
            return -1;
        }
        int result = buffer.charAt(0);
        buffer.deleteCharAt(0);
        return result;
    }
}
Rubyでgit cloneなり新規作成なりしたプロジェクトをセットアップする手順とそのための環境構築

##Rubyプロジェクトディレクトリの準備手順
rbenvで始めるRubyプロジェクト。

###Rubyの用意
rbenvを入れておくこと。「前提」>「rbenvを入れておく」参照。

	# rbenv versions # インストール済みRuby一覧
	# rbenv install -l # インストール可能なRuby一覧
	# rbenv install 2.0.0-p481 # インストール
	rbenv local 2.0.0-p481 # ディレクトリで利用するRubyの指定

###gemの用意
gem をインストール

	bundle install # 
	# 次のコマンドと同じ挙動とする。「前提」の設定がまだの場合は次のコマンドで
	# bundle install  --path=vendor/bundle --binstubs=vendor/bin 

####gemfileの作り方
1からプロジェクトを作成する場合にGemfileを生成するには

    bundle init

---
以上でRubyプロジェクトを動かす（着手する）準備は完了。

以下は上記手順でいろいろうまく動かせるようにするための事前準備手順。

##前提
###rbenvを入れておく
    brew install readline ruby-build rbenv
    echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    . ~/.bash_profile #環境再読み込み
    rbenv global system #標準で使うRubyはシステムデフォルトのものに

###bundlerを入れておく
インストールしたRubyを有効にしたディレクトリで実行。インストール済みの場合不要。インストール自動化は「やっておくと便利」>「Bundlerのインストールを自動化」参照。

    gem install bundler

###bundlerの設定でGemがディレクトリローカルにインストールされるようにしておく

gemがグローバルにインストールされて他の環境を汚したりしないよう、いつも無意識にbundle installするだけでディレクトリローカルにインストールされるようにしておく。

    bundle config --global path 'vendor/bundle' #gemをローカルインストール
    bundle config --global bin 'vendor/bin' # binを作りbundle execを省略可に

    #個別に設定したい場合は場合はbundlerをオプション付きで実行。
    bundle install --path=vendor/bundle --binstubs=vendor/bin 

##やっておくと便利
###Bundlerのインストールを自動化
Rubyインストールと同時にbundlerをインストールさせることが出来る。
[rbenv install したときに 一緒に bundler をインストールする - そんなこと覚えてない](http://blog.eiel.info/blog/2013/04/12/rbenv-install-after-install-bundler/)
[（http://blog.eiel.info/blog/2013/04/12/rbenv-install-after-install-bundler/）](http://blog.eiel.info/blog/2013/04/12/rbenv-install-after-install-bundler/)

###rbenv-binstubsプラグイン
rbenvのプラグイン。無くても動くが、`bundle install`したgemを実行させる時に `bundle exec [command]` を直接`[command]`と入力できるようになる。

    $ git clone git://github.com/ianheggie/rbenv-binstubs.git ~/.rbenv/plugins/rbenv-binstubs

### rbenv-gem-rehashプラグイン
rbenvのプラグイン。無くても動くが、`gem install` / `bundle install`するたびに必要になる`rbenv rehash`が自動化される。

    $ git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
AngularとRailsを分離し、セキュアに繋ぐ方法


## Angular + Railsの理想的な関係
- Railsはバックエンドとして完全にAPIを提供するのみで、フロントサイド(AngularJS)と完全に分離

### AngularとRailsの間をどうセキュアに繋ぐか？
- RailsがOAuth2 Providerとなって、APIの許可を行う
	- OAuth2 Provider用のgem doorkeeperを用いるとよい
	- APIの提供は、grapeを用いるとよい

[理想的な Rails, AngularJS 環境の構築 - ボクココ](http://bokukoko.hatenablog.com/entry/20130825/1377415299)

[AngularJS x Railsで ユーザ認証を実現するためのアプリ設計 - ボクココ](http://bokukoko.hatenablog.com/entry/2013/12/07/AngularJS_x_Rails%E3%81%A7_%E3%83%A6%E3%83%BC%E3%82%B6%E8%AA%8D%E8%A8%BC%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E8%A8%AD%E8%A8%88)

## Grape+DoorkeeperによるOAuth2 ProviderとAPIの提供
- 構成は以下のとおり
	- Resource Owner (User) - Devise
	- Authorization Server (OAuth 2 Provider) - Doorkeeper
	- Resource Server (API) - Grape
- ただし、Authorizationリクエストヘッダフィールドに詰めたBearer Tokenを受け取るための実装が別途必要
	- DoorkeeperとGrapeのつなぎ、つまり、Doorkeeperでtokenを認証し、Grapeでさばくための実装が必要
- Bearer Tokenを渡す方法については、以下を参照

[The OAuth 2.0 Authorization Framework: Bearer Token Usage（日本語）](http://openid-foundation-japan.github.io/rfc6750.ja.html)

### Authorizationリクエストヘッダフィールドに詰めたBearer Tokenを受け取るための実装例

#### grape-doorkeeperを用いた例
- Implicit Grant Flowを採用
- Consumer(Resource Server)とService Provider(Authorization Server)を1サーバーに同居させている
- AngularとRailsをセキュアに繋ぐならこの例が一番参考になった(サンプルコードもあります)

[CODETUNES · OAuth Implicit Grant with Grape, Doorkeeper and AngularJS](http://codetunes.com/2014/oauth-implicit-grant-with-grape-doorkeeper-and-angularjs/)

[fuCtor/grape-doorkeeper](https://github.com/fuCtor/grape-doorkeeper)

#### rack-oauth2を用いた例
- Authorization Code Grant Flowを採用
- この例は、Angular関係ないですが、Bearer Tokenを受け取るところの実装の参考として

[OAuth 2.0 Tutorial: Protect Grape API with Doorkeeper « 鴨七・chitsaou](http://blog.yorkxin.org/posts/2013/11/05/oauth2-tutorial-grape-api-doorkeeper-en)

[nov/rack-oauth2](https://github.com/nov/rack-oauth2)
Linux 環境下でAndroid Studioのメモリ設定を変更する

#### Linux 環境下で、Android Studio の使用メモリの量を変更する方法

昔いじったファイルといつの間にかファイル名とかが変更されてたのでメモ（v0.8.12にて確認）

Android Studio の展開ディレクトリ以下の下記のファイルを編集する

> android-studio/bin/studio.vmoptions
> android-studio/bin/studio64.vmoptions

どっちをいじるかは環境次第で。

メモリを16GBを詰んだ64bit Ubuntuだと、これぐらいがちょうどよかった。

```xml:android-studio/bin/studio64.vmoptions
-Xms512m
-Xmx3000m
-XX:MaxPermSize=1024m
-XX:ReservedCodeCacheSize=1024m
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false
-XX:+UseCodeCacheFlushing
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:+HeapDumpOnOutOfMemoryError
-Dawt.useSystemAAFontSettings=lcd
-XX:+UseCompressedOops

```
SXFファイルの論理縮尺と表示縮尺を比較する

SXF ファイルを作成する際、 SXF ファイル内に記録される座標系の尺度は自動的に計算されるのでこれが意図した縮尺になっていないことはまずない。
一方、縮尺を人間の目に見える形で記録している部分については、図面の初期作成の際に自動で計算されるものの、作図中に縮尺を変えるなどした場合に表記を修正し忘れるなどして計算上の縮尺と表記上の縮尺が異なる場合がある。

SXF ファイル内で表記上の縮尺を格納しているフィーチャと、座標系の縮尺を格納しているフィーチャを比較することでその差異を発見し、ミスを減らすことができる。

座標系の縮尺については`sfig_locate_feature`に記録されている。

```
/*SXF
#%フィーチャナンバー% = sfig_locate_feature('%レイヤ%',\'%図形名%\','%配置位置X座標%','配置位置Y座標','回転角','X方向尺度','Y方向尺度')
SXF*/
```

なんらかの処理系でファイルを読み込み、`sfig_locate_feature`が記録されている行を発見した後、必要な`図形名`を持つフィーチャを発見できれば、その6番目と7番目の値から尺度=縮尺を読み取ることができる。
縮尺の表記は通常分数が使用されるが、フィーチャに記録されているのは分数を小数にした値であるため、値の逆数を取ると縮尺の分母を取り出すことができる。

縮尺の表記については場合にもよるが分子の`1`、`スラッシュ`、分母の`数値`で記録されていたり、`S=1:数値`で記録されているので、`text_string_feature`を持つフィーチャの中から作図した位置の座標を持つフィーチャを探し、4番目の値を取り出して適宜の処理を行う(`S=1:`を取り除くなど)ことで縮尺の分母部分を取り出せる。

取り出した二つの値を比較すれば論理縮尺と表示縮尺に齟齬がないかどうかを確認することができる。

比較するための PowerShell スクリプトを書いて Github に置いてあります → [Chk-Scale](https://github.com/kmr-hryk/Chk-Scale)
Ubuntu 14.04 のinstall用USBメモリーをMacで作成する

### 公式ページからisoをDLする
略

### convertする

```
hdiutil convert ubuntu-14.04.1-server-amd64.iso -format UDRW -o ubuntu-14.04.1-server-amd64.img
```

### deviceの一覧からインストールしたいUSBメモリーを見つける

```
diskutil list
```

### アンマウントする

自分の場合、/dev/disk2がUSBメモリーだった

```
diskutil unmountDisk /dev/disk2
```

###書き込む

```
sudo dd if=ubuntu-14.04.1-server-amd64.img.dmg of=/dev/rdisk2 bs=4m

```

あとはマシンにUSBメモリーを挿してブートするだけ
Preztoの設定ファイルをカスタマイズする


## zshの設定を管理するフレームワーク

zshの設定を見直していたところ、zshの設定を「プラグイン」「テーマ」という形で管理するフレームワークがあるということを知った。

https://github.com/robbyrussell/oh-my-zsh
https://github.com/sorin-ionescu/prezto


あまり設定をゴリゴリカスタマイズする気が起きないが、さりとて便利な機能はちょっと使ってみたいという面倒な自分の性質にもあってそうなので導入してみることに。
軽く調べたところ、oh-my-zshの方が多機能かつ重い、preztoの方が軽量かつ小機能、という印象。
これは(多分)作りがどうこう、という話ではなくoh-my-zshの方がデフォルトでインストールされているプラグイン/テーマが多い、ということだと思われる。

一部のテーマ/プラグイン(今のところ、zsh-completionsぐらい?)が利用できればひとまずは良いので、preztoをチョイスする。

## preztoのインストール

Githubに記載してあるとおり、preztoをclone後、runcomsディレクトリ以下にある設定ファイルのシンボリックリンクを貼る。
(ref.) https://github.com/sorin-ionescu/prezto/tree/master/runcoms

```zsh:
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

# 以下はzshで実行する必要がある
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

## 設定ファイルに既存の設定を追加する

ただし、この手順だと既にzshの設定がある場合に少し面倒になる。
シンボリックリンクを貼る前に既存の設定を退避、貼った後に退避した設定を手動で追加する必要があるからだ。

そのためpreztoのリポジトリをフォークして自分のカスタム設定を加えておくこととした。
https://github.com/FGtatsuro/prezto

これならば既存の設定を手動で加えることなくGithub上で管理できる。

```zsh:
# clone元の変更のみ
$ git clone --recursive git@github.com:FGtatsuro/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

とりあえずしばらく使ってみて物足りなければ、プラグインを追加していけば良いか。
こちらはまだ試していないが、antigenを使うことになりそう。

(ref.) http://blog.glidenote.com/blog/2012/10/25/antigen/


## その他参考記事

http://qiita.com/kei_q/items/814ec412b3c28f580927
http://dev.classmethod.jp/tool/zsh-prezto/
Macのコマンドプロンプトにgit branch名を表示



http://app2641.hatenablog.com/entry/2013/05/30/103529
を参考に以下で設定

```bash:スクリプトのインストール
mkdir -p /usr/local/git/contrib/completion/
cd /usr/local/git/contrib/completion/
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
chmod 755 git-*
```

```bash:~/.bashrc
source /usr/local/git/contrib/completion/git-prompt.sh
source /usr/local/git/contrib/completion/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[1;32m\]\u@\h\[\033[00m\]:\[\033[1;34m\]\w\[\033[1;31m\]$(__git_ps1)\[\033[00m\]\$ '
```
○○.shを./○○.shで実行できるようにする

シェルスクリプトを書いて実行するとき
sh hello.sh
にようにコマンドを打てば実行ができる

chmod +x hello.sh
でファイルに実行権限を与えてあげると
./hello.sh
のように一つのコマンドで実行することができる。

【参考】
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231019/
array_mapでクラスメソッドを指定する方法

クラス内でarray_mapを使ってクラスメソッドをコールバック関数にしたかった

```php
$hoge = array_map('クラスメソッド', $array);
```

みたいに使ってみたら

```
array_map() [function.array-map]: The first argument, 'クラスメソッド', should be either NULL or a valid callback	
```

って言われてしまった
どうやらPHPでクラスメソッドをコールバック関数に指定するときは、arrayを使ってどのクラスのメソッドなのかも明示する必要があるらしい

```php
$hoge = array_map(array($this, 'クラスメソッド'), $array);
```

これでいけた
No RebootでAMIを作成したらファイルが消えたりした

No RebootでAMIを作成したらファイルが消えたりしたので原因を調査した。
[AWS公式](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html)では以下のように言われているのだけど、なぜ整合性を保証できないのかがわかった。
> [No reboot] を選択した場合、Amazon では作成されたイメージのファイルシステムの整合性を保証できません。

# 発生した現象

端的に言えばNo RebootでのAMI作成直前に配置していたファイルがAMIに含まれない、もしくはファイルサイズ0であるという現象が発生した。

## 環境
* Amazon Linux AMI 2014.09 (PV) 

## 現象1

* capistranoでEC2にリリースする
* すぐにNo RebootでAMI作成
* 作成されたAMIからEC2作成
* **EC2で配置されたファイルの大部分が0バイト**

## 現象2

* 以下のようなスクリプトを実施

```bash
#!/bin/sh

TARGET_DIR=`date '+/home/ec2-user/hoge%Y%m%d%H%M%S'`
mkdir $TARGET_DIR

cd [git clone --mirrorした適当なリポジトリのパス] && git archive master | tar -x -C $TARGET_DIR
aws ec2 create-image --region `curl --silent "http://169.254.169.254/latest/meta-data/placement/availability-zone" | sed 's/.$//'` --instance-id `curl http://169.254.169.254/latest/meta-data/instance-id --silent` --name `date '+test-%Y%m%d-%H%M%S'` --no-reboot
```
* 作成されたAMIからEC2作成
* **EC2で作成されたはずのディレクトリが存在しない**

# 調査したこと

## cloud-initは無罪だった

[Amazon EC2(Linux)システム管理で知らないとハマる5つの環境設定 ｜ Developers.IO](http://dev.classmethod.jp/cloud/five-confs-of-ec2-linux-sysops/)
にあるように、EC2インスタンスをコピーすると意図しない環境設定に変わってしまうという問題があるので最初はこれを疑った。
この中でファイルに関わりそうなのがパッケージアップデート。
でも、パッケージアップデートしないようにしてみても現象変わらずでcloud-initは関係ないみたいだった。

### Amazon Linuxのファイルシステムを調べてみた

Amazon Linuxの現在のファイルシステムはext4。
ext4では遅延アロケーション機能というものがあるらしい。

[Linuxのファイルシステムext4の特徴｜もと東大生もと社長の自由奔放ブログ Just do it now!](http://ameblo.jp/rb26/entry-11447975145.html)
によると遅延アロケーションとは、以下のような機能らしい。
> 遅延アロケーションは、通常のファイルシステムでは、書き込みの命令の時点で
> ディスクの確保を行いますが、これを実際に書き込まれるギリギリまで遅らせるというもの。

[ext3からext4への更新概要](http://www.slideshare.net/moriwaka/ext4-30787023)なんかもわかりやすい。

[EXT4のゼロレングス問題(zero-length problem)に対処したマウントを行う - ktomoyaの日記](http://d.hatena.ne.jp/ktomoya/20100731/1280545627)
のようにファイルサイズが0になってしまう問題もあるようである。

[002f5e43_linux_io_subsystem_v1_2.pdf](http://www-06.ibm.com/jp/linux/tech/doc/attachments/002f5e43_linux_io_subsystem_v1_2.pdf)
によると以下のようにあり、デフォルトではディスクに書き出されるまで最大35secくらいかかる場合があるらしい。
> 従って、デフォルトでは、書き込まれてから30sec以上経過したキャッシュページは、5sec以内に物理デバイスに書き出されることになります。
> （ただし、書き出すページが多く、kw_kupdateによる書き出し処理に時間がかかる場合は、れよりも遅くなることはあります。）

### 実際に遅延アロケーションを確認してみる

以下のようにディスクに書き出されていないDirtyページのサイズを監視しておく(一応スワップデバイスに書き出し中のページも見ている)。

```bash
$ watch -n 1 sudo grep -E "Dirty\|Writeback" /proc/meminfo
```

別端末で以下を実行しbo(ブロックデバイスへの書き込み量)の値に注目しておく。

```bash
$ vmstat -1
```

さらに別端末で以下を実行すると、書き出されるファイル全体のサイズあたりの数値がDirtyとして表示される。
さらにしばらくするとDirtyページがなくなる(Writebackの値は書き込みが一瞬なせいか変わらない)。
同時にvmstatでboの値が一気に増える。

```bash
cd [git clone --mirrorした適当なリポジトリのパス] && git archive master | tar -x -C [適当なディレクトリ]
```


# まとめ

## 原因

ext4に限らずファイルシステムでは高速化などのため書き込みの際にディスクへの書き出しまでタイムラグがある可能性がある。
ディスクの書き出しまでにスナップショットがとられてしまうとファイルシステムの整合性が保たれない。

## 対策

以下のようなことで対策できそう。

* ディスクに書き出される時間まで十分まってからNo RebootでAMIをとる
 * 確実性はないがクリティカルな変更がディスクに反映されるまで待つ。
* XFSなどの書き込みを一次停止出来るファイルシステムを利用する
 * [8.6. XFS ファイルシステムの一時停止](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/xfsfreeze.html)のように停止できるらしい。
* No Rebootを利用しない。
 * Rebootして確実にディスクに書き出されるようにする。
Controllerを作らずにViewを表示したい


Railsアプリケーション開発においてデザイナの方とかと並行して開発していると、
htmlは既にできてて、モデルとかコントローラとかまだちゃんと設計できてないけど、アプリケーション上で表示したい、ってことがあります。

public以下に配置してもいいんですが、application.html.erbのテンプレートの恩恵はちゃんと受けたいし、後でController実装するときに移動するの面倒だなとか、

**ありますよね？？**


## 要件

こんなかんじです。

#### デザイナ側

* Railsアプリケーション中にhtmlを配置するだけで、表示できるようにしたい
* 黒い画面は触りたくない
* routes.rbも触りたくない

#### プログラマ側

* layouts以下のapplication.html.erbは反映させたい
* その他、グローバルに存在する変数とかセッションとかは残したい
* 後でControllerを実装するときに移動させたくない



## 解決策
Viewを表示するにはRoutingとControllerが必須ですよね。
ということで、routingはViews以下のディレクトリに存在するファイルを読んで追加するようにし、
コントローラは共通のものを作って、パラメータで表示するViewを指定するようにしてみました。


## コード

```ruby:config/routes.rb
NoControllerApp::Application.routes.draw do
  exclude_dir = ["layouts"]
  anonymous_dir = []
  Dir::glob(File.join(Rails.root.to_s, "/app/views/*/")).map{|f| anonymous_dir << f.split("/").last }

  (anonymous_dir - exclude_dir).each do |dir|
    get "#{dir}" => "anonymous#index", :defaults => {:directory => "#{dir}"}
  end
end
```


app/views/以下に置かれたlayouts以外のディレクトリを対象とし、Routingに追加します。
これだと、Layoutとか通常の手段で追加されたディレクトリとかも対象になってしまうので、それらはexclude_dirに追加して対象外とします。

viewのみ存在するhtmlを表示するためのコントローラとして"AnonymousController"という共通で呼ばれるコントローラを作成し、そこで描画するViewを制御します。


```ruby:app/controllers/anonymous_controller.rb
class AnonymousController < ApplicationController
  def index
    render "#{params[:directory]}/index"
  end
end
```

動作確認用のファイルを作ります。

```shell
mkdir app/views/foo
touch app/views/foo/index.html.erb 

mkdir app/views/bar
touch app/views/bar/index.html.erb 
```



この状態でrake routesすると以下のようになります。

```shell
$ rake routes
Prefix Verb URI Pattern    Controller#Action
   bar GET  /bar(.:format) anonymous#index {:directory=>"bar"}
   foo GET  /foo(.:format) anonymous#index {:directory=>"foo"}
```


## 


あとは、localhost:3000/foo/にアクセスすれば表示されます。


## その他

まぁあくまで開発中に使う機能ですね。

Routingの設定がハードコードじみてるので、まだまだ改良の余地はありそうですが、
とりあえず要件は満たせたかなーと思っています。

もっと良いやり方があれば是非教えて下さい！
rubyでSSL証明書の期限を確認する

StartSSLで取得してサイトに設定していたSSL証明書の有効期限を切らしてしまったので、期限を監視してIRCに通知するようにしてみる。

証明書の取得と期限の確認は以下のような感じでいけそう。
(proxy内にいる環境なのでproxyで許可されているhttpsで確認することにした)

```rb
require 'net/https'
require 'http_proxy_from_env' # proxy使わない場合は不要

https = Net::HTTP.new('example.com', 443)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
cert = https.start do
  https.peer_cert
end
p cert.not_after
```
個人的によく使うXcodeのショートカット



## 全般

`⌘N` -> 新規作成
`⌘B` -> Buildの実行
`⌘R` -> Run（アプリの実行）
`⌘⇧K` -> Cleanの実行
シミュレータ内のリソースはキャッシュされるので、リソース更新のタイミングでCleanすると良さげ
（image, xib, storyboardなどなど）
`⌘⇧Y` -> 画面下部のコンソール欄の表示／非表示
画面右下のアイコンを押すとコンソール欄の左側／右側の表示が切替可能

`⌘T` -> 新規タブ
`⌘{` or `⌘⇧[` -> 左のタブ
`⌘}` or `⌘⇧]` -> 右のタブ

`⌘0` -> 左ペインの表示／非表示
`⌘⌥0` -> 右ペインの表示／非表示

`⌘⇧O` -> ファイル or クラス検索
（CamelCase補完を使って検索できるので便利）

`⌘⇧J` -> 開いているファイルを左ペインから探し出す

`左ペインのファイル選択時に⌥押しながらクリック`
-> 選択ファイルを2ペインで開く（元々開いていたファイルが左側、選択ファイルが右側で開かれる）
`⌘Enter` -> 2ペイン以上で開いていた画面を1ペインで開く
`⌘J` -> 他ペインor他タブにフォーカスを移す

`2本指で右スワイプ` -> 1つ前に開いていたファイルに戻る
`2本指で左スワイプ` -> 1つ先に開いていたファイルに進む
（ブラウザの戻る／進むみたいな機能）


## エディタ周り

`⌃⌘E` -> 選択している変数を一括変更（スコープ内のみ）

`⌘[` -> インデントを左にずらす
`⌘]` -> インデントを右にずらす

`⌥⌘[` -> 選択行を一行上にずらす
`⌥⌘]` -> 選択行を一行下にずらす

`⌘/` -> 選択行をコメントアウト

`Tab` or `⌃/` -> 次のPlaceholderを選択する
`⇧Tab` or `⌃?` -> 前のPlaceholderを選択する

`⌃⌘↑` or `⌃⌘↓` -> 対応する `.h` or `.m` を開く（Objective-Cのみ）

`⌘押しながらクラス名クリック` -> 定義元へジャンプ
`⌘⇧J` -> 定義元へジャンプ

`⌘F` -> ファイル内検索
`⌘G` -> ファイル内検索の次のヒット（直前の検索ワードが使用される）
`⌘⇧G` -> ファイル内検索の前のヒット（直前の検索ワードが使用される）
`⌘⇧F` -> プロジェクト内検索


##小ネタ

###メソッドのOverride

```Swift

class ViewController: UIViewController {
	
	// ここでoverrideしたいメソッド名を入力する
	
	// ↓

	// viewWill... -> 入力中にメソッド候補が表示されるので選択してEnter

	// ↓

	// 以下のように展開される
	override func viewWillAppear(animated: Bool) {
		// ここにキャレット
	}
}
```


##便利ツール

###Skala Color

MacのColor Picker拡張
Hexでの色指定ができるようになる
http://bjango.com/mac/skalacolor/


###Alcatraz

Xcode PluginのPackage Manager
http://alcatraz.io/

FuzzyAutoComplete　←　オススメ
`⌘⇧O`で使用されてるCamelCase補完をコーディングでも使えるようにするプラグイン
2014/10/14(Tue) Morning Huddle - Cloud Servicesの定義方法

## これは何？
自分とチームがAzureに慣れるまで、Morning Huddleで昨日読んだAzureのドキュメントを共有するよ。


## テーマ
・Cloud Servicesのセットアップってどうやるの？
 
## 3行で説明
・Cloud Servicesは
・Azure サービスの定義スキーマ (.csdef ファイル) でWeb/Workerロールを定義し、
　(ex. Webロール TypeAはこれ、TypeBはあれ)
・サービス構成ファイル (.cscfg ファイル) でサービス全体の構成を定義するよ
　(ex.サービスの本番環境にはWebロール TypeAが5インスタンス、TypeBが3インスタンス)
 
## 感想
　・Azure サービスの定義スキーマ
　・サービス構成ファイル
共にXMLで定義する。
VisualStudio以外の対応エディタ募集中。

## 参考リンク
・[Azure のクラウド サービスのセットアップ](http://msdn.microsoft.com/ja-jp/library/azure/hh124108.aspx)
リストからハッシュ表を作成

# はじめに

最近Common Lispの勉強をやっています。
思いついたもので簡単なものでも、とりあえず自分で書いてみようと思いました。
標準で用意されているかもしれませんが、今回はリストからハッシュ表を作成する関数を書いてみました。

# ソースコード

```cl:create_hash_table.lisp
(defun list->hash (list)
  (let ((hash-table (make-hash-table)))
	(labels ((create-hash-table (list)
			   (if (null list)
				   nil
				   (progn
					 (setf (gethash (first list) hash-table) (second list))
					 (create-hash-table (cddr list))))))
	  (create-hash-table list))
	hash-table))
;=> LIST->HASH

(defparameter *hash-table* (list->hash '(a 1 b 2)))
;=> *HASH-TABLE*
(gethash 'a *hash-table*)
;=> 1, T
(gethash 'b *hash-table*)
;=> 2, T
```

# おわりに

まだ基本的なことしか理解出来ていないのですが、少しずつ上達していきたいと思っています。

# 追記

公開した後に気に入らないところが色々あったので何度も更新しています。
git-flowを試した

なんでもかんでもmasterにcommitしまくるのを阻止できる。

# 参考

* [「Gitブランチを使いこなすgit-flow／GitHub Flow入門」最新記事一覧 - ITmedia Keywords](http://www.atmarkit.co.jp/ait/kw/gitflow_nyuumon.html)
  * [Gitブランチを使いこなすgit-flow／GitHub Flow入門（2）：git-flowのインストールとブランチ運用前のリポジトリ準備 (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1311/28/news042.html)

# 準備

```bash:brewを使う場合
brew install git-flow
```

```bash:手動で行う場合
git clone http://github.com/nvie/gitflow.git
cd gitflow
git submodule init
git submodule update
export PATH=$PATH:`pwd`
```

PATHを追加することで`git flow`コマンドが使えるようになる。
また、`./git-flow`を使ってもよい。


# 既存のリポジトリにgit-flowを使いはじめるとき

```bash:
git clone ../hoge.git/
git flow init
git feature start toppage
```

* `git flow init`してから使い始めれば良い。
  * リリース用のブランチを指定(master)
  * プレリリース用のブランチを指定(develop)

# git flowを使う場合

```bash:
git flow init
git flow feature start toppage

touch index.html
git add -A
git commit -m "トップページ"

touch header.html
git add -A
git commit -m "ヘッダ"

git flow feature finish toppage
# developブランチにマージされる。

git flow release start 20141014
git flow release finish 20141014
# masterブランチにマージされる。
```

コミットし忘れている場合に`git flow init`をしようとすると以下エラーが出るので安心。

```bash:
fatal: Working tree contains unstaged changes. Aborting.
```

# git flowを使わない場合

```bash:
## develブランチで作業

git checkout -b devel

## いろいろ編集しコミットする。そのあと以下

git checkout メインのブランチ名
git merge devel
git branch -d devel

## push

git push origin メインのブランチ名
```
AppExtetentionキーボードで一瞬キーボードが消えるのをなるべく防ぐ

AppExtentionKeyboardを実装していると、キーボード切替時にキーボードが消えてしまうことがあります。
これはinputViewControllerのviewDidload:でキーボードのビューをaddSubViewしていることが原因です。
キーボードはボタンも多く、viewDidload:で大量のボタンインスタンスを生成すると全て生成するまでキーボードが出てきません。

そのためviewDidload:では比較的軽量なダミーのUIViewを生成しaddSubView:し、キーボードのビューはviewDidApper:でaddSubViewするのが良いかと思います。

追記：
と思ったけどキーボードが表示されない時間が短くなっただけでキーボードが消えていました。(´・ω・｀)
オンラインストレージのBOXをubuntuにマウント

# 参考
[Box（オンラインストレージ）をUbuntuにWebDavマウント（ビミョー）](http://brokendish.org/ubuntu/2996/)

上の記事の手順で、fstabのURLがwww.box.comではなくて、dav.box.comだったのでメモ

# fstab

```
https://dav.box.com/dav /home/hoge/box davfs user,noauto 0 0
```

# マウント
mount /home/hoge/box
インフラにおける電源管理

# 前提

* 障害は起こるもの
  * 自分が起こすものではなく素人が勝手にやったことが起因して起こると考える。
* 確認は一人でせずに二人でやったほうがいい。

# 確認項目

## 電源系統

* 電源は系統というものがある。
  * 例えばブレーカーのスイッチを一つOFFしたとき、フロア内全部が電源OFFになるのではなく
  * 電源がOFFになる島があることがわかるでしょう。

* 電源が落ちた時に被害を最小限に食い止めることを念頭に置く。

## 消費電力

* 設置スペースにゆとりがあっても電力にゆとりがなければ増設が出来ません。
* 15Aの増設をした場合、10万円/月くらいかかる。

## サーバ識別

* サーバ撤去時に各種ケーブルも撤去するが、その時に電源ケーブルがどのサーバのものであるかを識別できるように、
* 電源ケーブルの両端とサーバ背面にラベルを貼っておく。

## UPS

* 掃除機などによる急な電圧降下の影響を防ぐことが出来ます。
* UPSは重要なストレージにつなげていると思います。
  * 書き込みの最中に電源を急に落とすとデータが保存完了する前に不完全なままのデータになるおそれがある、また作業中に誤って引っこ抜いたことに対する問題抑止。
* UPSのバッテリー劣化するため、3年周期などで交換を推奨されています。
  * バッテリーは結構高いので、導入時に交換にかかる費用も調べておくこと。

## ケーブルの抜けかかりがないこと

* 電源ケーブルは回転ロック付きのものは必須です。抜けかかりによるサーバリブートとか困る。

## リモートで電源OFF/ONできるものの確認

* APC社製タップはLANの差込口もあり、ブラウザから電源OFF/ONができる。誤って電源OFFしないようにどこにどれがつながっているかを要確認。
  * しかしいくら事前に確認しているとはいえ、本番環境のものをOFF/ONするのは怖い・・・

# タコ足配線

* [ドライヤーなど大電流を使う機器を使うと、家全体の電圧が大きく下がる - その他（家電製品） - 教えて！goo](http://oshiete.goo.ne.jp/qa/4355359.html)
* [電気の勉強をしています。交流の電圧は１００Ｖで１０１±６Ｖ ２００Ｖ... - Yahoo!知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1181579256)

電圧が100Vから94Vなどにさがることにより、機器の電源OFF/ONが起きたりします。
機器が想定されている電圧は101±6Vです。

USB-HDDをノートパソコンに接続した時にたまに接続が外れるのは電圧が足りないことが原因だったります。
Xamarin.Mac: Full Screenで開始



~~~csharp

	public partial class MainWindow : MonoMac.AppKit.NSWindow
	{
		#region Constructors

		// Called when created from unmanaged code
		public MainWindow (IntPtr handle) : base (handle)
		{
			Initialize ();
		}
		
		// Called when created directly from a XIB file
		[Export ("initWithCoder:")]
		public MainWindow (NSCoder coder) : base (coder)
		{
			Initialize ();
		}
		
		// Shared initialization code
		void Initialize ()
		{
		    // この２行
			this.CollectionBehavior |= NSWindowCollectionBehavior.FullScreenPrimary;
			this.ToggleFullScreen (this);
		}

		#endregion

	}
~~~
Ruby v2.1.2でURLエスケープを行う


今回自分が行いたかったのはURLパラメータの区切り文字に使われる&(アンパーサント)や = もエンコードしてほしかったのだが、Google先生に「ruby url encode」とかでググると
URIモジュールのurl_encodeを使ったケースが上位に出てくるので、なかなかこちらの要望を満たすような結果が得られなかった。

Rubyの公式リファレンスを追って行くとようやく見つかったのがERBというモジュール

適当なrubyファイルを作って以下のように記述

```ruby:url_encode
$ vim url_encode.rb

require 'erb'
include ERB::Util

p url_encde('key1=val1&key2=val2')

```

```shell:実行結果
$ ruby url_encode.rb
"key1%3Dval1%26key2%3Dval2"
```

きちんと = がエスケープされている。

ちなみにURL全てを引数に渡してしまうと://の部分もエスケープされてしまうので、
パラメータの部分だけをエスケープするのが無難かもしれません。
Xamarin.Mac: ファイルオープンダイアログ = NSOpenPanel


- [NSOpenPanel members](http://macapi.xamarin.com/?link=T%3aMonoMac.AppKit.NSOpenPanel%2f*)

~~~csharp

NSOpenPanel openDlg= new NSOpenPanel{ CanChooseFiles =true };

if ((NSPanelButtonType)openDlg.RunModal()== NSPanelButtonType.Ok)
{
    // 何かする
    player.AddVideo( openDlg.Filename);
}
~~~
コマンドプロンプト/PowerShell でスクリプト自身のパスを扱う

タスクスケジューラからスクリプトをキック → スクリプトから相対パスで別スクリプトを指定してキック… 等のシチュで必要になるアレです。


# コマンドプロンプト
```bat:スクリプト自身のパス.bat
@echo off

@rem 実行時に指定された絶対/相対パスそのまま
echo %0

@rem スクリプトのフルパス
echo %~f0
echo %~dpnx0

@rem スクリプトのディレクトリ
echo %~dp0
```

## 実行確認(例)
`C:\Users\heignamerican\testroom\cmd>hoge.bat`
> hoge.bat
> C:\Users\heignamerican\testroom\cmd\hoge.bat
> C:\Users\heignamerican\testroom\cmd\hoge.bat
> C:\Users\heignamerican\testroom\cmd\


`C:\Users\heignamerican\testroom\cmd>.\hoge.bat`
> .\hoge.bat
> C:\Users\heignamerican\testroom\cmd\hoge.bat
> C:\Users\heignamerican\testroom\cmd\hoge.bat
> C:\Users\heignamerican\testroom\cmd\


`C:\Users\heignamerican\testroom\cmd>cd ..`
`C:\Users\heignamerican>cmd\hoge.bat`
> cmd\hoge.bat
> C:\Users\heignamerican\testroom\cmd\hoge.bat
> C:\Users\heignamerican\testroom\cmd\hoge.bat
> C:\Users\heignamerican\testroom\cmd\


# PowerShell
```ps1:スクリプト自身のパス.ps1
$scriptPath = $MyInvocation.MyCommand.Path

echo $scriptPath
Split-Path -Parent $scriptPath
```

## 実行確認(例)
### 普通に実行する場合
`C:\Users\heignamerican\testroom\ps> .\hoge.ps1`
> C:\Users\heignamerican\testroom\ps\hoge.ps1
> C:\Users\heignamerican\testroom\ps

`C:\Users\heignamerican\testroom\ps> cd ..`
`C:\Users\heignamerican\testroom> .\ps\hoge.ps1`
> C:\Users\heignamerican\testroom\ps\hoge.ps1
> C:\Users\heignamerican\testroom\ps

### ドットソース形式での読み込み
`C:\Users\heignamerican\testroom\ps> . .\hoge.ps1`
> C:\Users\heignamerican\testroom\ps\hoge.ps1
> C:\Users\heignamerican\testroom\ps

`C:\Users\heignamerican\testroom> . .\ps\hoge.ps1`
> C:\Users\heignamerican\testroom\ps\hoge.ps1
> C:\Users\heignamerican\testroom\ps

## PowerShell 補足
* `> hoge.ps1` と指定してはダメ。<br />`> .\hoge.ps1` とカレントディレクトリの相対パスを明記する<br />別ディレクトリであれば `> ps\hoge.ps1` は通る
* `.` コマンドによる [ドットソース形式での読み込み](http://technet.microsoft.com/ja-jp/scriptcenter/powershell_owner05.aspx#ECAA) を考慮


# 所感という名の愚痴
いつも思うんですが、コマンドプロンプトの方は自明な命名ではないですが
その分ワンライナー的な扱いは簡単ですね。
PowerShell はスクリプトゴリゴリ書く場合はいいけど、コマンドラインからワンライナーを駆使した作業とかに向かない…
alias を頑張って設定するとかでちょっとは便利になるのだろうか。
MacにMariaDBをHomebrewでインストール

ここに書いてあるとおりにやればよい。
Building MariaDB on Mac OS X using Homebrew
https://mariadb.com/kb/en/mariadb/documentation/getting-started/compiling-mariadb-from-source/building-mariadb-on-mac-os-x-using-homebrew/

MariaDBの10が入ります。

## brewでインストールしたあと、rootユーザのパスワード設定までします。
開発ユーザにて。

```bash
brew update # brew updateはうかつにやるとインストール済のライブラリに影響が出ることがあるので注意
brew install mariadb
unset TMPDIR
mysql_install_db

mysql.server start # 起動させないとmysql_secure_installationがエラーになる
mysql_secure_installation # ここの中で対話的にパスワード設定。それは別途。

mysql -uroot -p # ログインしてみる
```

## mysql_secure_installationでの対話
ログ。

```
xxx@Mac:~/dev (develop)$ mysql_secure_installation
/usr/local/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): # ←ENTER
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y # ← Yを入力してENTER
New password: # ← rootユーザにセットしたいパスワードを入力してENTER
Re-enter new password: # ← もう一度入力してENTER
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y # ← Yを入力してENTER
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y # ← Yを入力してENTER
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y # ← Yを入力してENTER
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y # ← Yを入力してENTER
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
xxx@Mac:~/dev (develop)$
```
Thanks for Flying Vim

cygwin等のターミナルでvimを終了した後，「Vimを使ってくれてありがとう」(「Thanks for Flying Vim」)が消えない問題に関して．

調べると大体vimrcに

```vim
set notitle
```

と記述すればokと書いてあるが，それでも何故か消えなかった．別の対処法としては，

```vim
let &titleold=getcwd()
```

の様に，titleoldを別の文字で置き換えればok．ただ，自分の場合はかなり特殊な例な気もするので，何か別の原因がある可能性は高い．ちなみにこの場合は開いているディレクトリの場所がタイトルバーに表示される．
変数テンプレート(C++14)だけで階乗を計算する

C++14で導入された変数テンプレートは再帰的に使えます

```cpp
#include <iostream>

template <std::size_t N> constexpr std::size_t fact = fact<N - 1> *N;
template <> constexpr std::size_t fact<1> = 1;

int main(int argc, char const *argv[]) {
  std::cout << fact<10> << std::endl;
  return 0;
}
```
つまりこれだけでコンパイル時に階乗が計算できます。

clang3.5で動いた
[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ:](http://melpon.org/wandbox/permlink/ZFSzedms1iXYy5Xa)