OmniAICreator/Qiita-1.07M huggingface dataset:
Mac(OS X 10.10.2)にbrewを使ってMevenをインストールする。

Mac(OS X 10.10.2)にbrewを使ってMevenをインストールする。

３分で終わります。

[参考サイト](http://qiita.com/chosan211/items/1472198165442e93047e)

１.mevenインストール
***
```
brew install maven
```

インストール完了

```
mvn --version
```

確認完了

インストール完了
【MAMP】WordPressのマルチサイトが404

httpd-vhosts.confの記述に問題がありました。

#修正前のhttpd-vhosts.conf
```
/* /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf */

<VirtualHost *:80>
	ServerName test #どんなドメインでアクセスするか
	DocumentRoot "/test/" #どこにファイルをおくか
</VirtualHost>
```

#修正後のhttpd-vhosts.conf
```
/* /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf */

<VirtualHost *:80>
	ServerName test #どんなドメインでアクセスするか
	DocumentRoot "/test/" #どこにファイルをおくか
</VirtualHost>
<Directory "/test/">
	Options FollowSymLinks Includes
	AllowOverride All
	Order deny,allow
	Allow from all
</Directory>
```

参考：[MAMP を使ってローカル WordPress（マルチサイト） 環境を構築 | Web Design Leaves](http://www.webdesignleaves.com/wp/wordpress/474/)
つべこべ言わずComposerでシンプルにautoloaderを使用したいとき

#概要
ってことでシンプルに行きます。

今の時代メモリの節約や実行速度なんかより、見通しがよくて可読性、保守性の高いコードのほうが好まれるので、できるだけコード全体もシンプルにあるほうがいいと思います。

#クラスファイルのインクルード
```HogeController.php
<?php

require_once '../application/models/Model_A.php';  //３つともクラスファイル
require_once '../application/models/Model_B.php';
require_once '../application/models/Model_C.php';

class HogeController{


}
```

個人的にはあまりこういう書き方はしたくないです。
なので**composer.json**に以下のように記述します。

```composer.json
"autoload": {
    "classmap": ["./application/models/Model_A.php",
                 "./application/models/Model_B.php",
                 "./application/models/Model_C.php",
    ]
}
```

そして、ターミナルでそのjsonファイルまで移動して以下を実行。

```composer dumpautoload```

これでautoloadのみが更新されます。

更新に成功すればcomposerの**autoload_classmap.php**の戻り値の配列の中にそれに対応した行が追加されてるはずです。

>例: 'Model_A' => $baseDir . '/application/models/Model_A.php',

#それ以外のファイルのインクルード
クラスファイルじゃなくて、単に関数定義とかしてるだけのファイルをオートロードしたいときはこんな感じ。

```composer.json
"autoload": {
    "files": ["./application/funcs/functions_A.php"]
}
```

ってことで以上です。
KVMゲストOSを削除する

ゲストOS を削除するときのクイックリファレンスです。

# ゲストOS を削除する 
## スナップショットの削除 
スナップショットがあれば、スナップショットをすべて削除する。

```text:書式
$ virsh snapshot-delete <KVMドメイン名> <スナップショット名>
```



```text:コマンド例
$ virsh snapshot-delete kvm_centos7 snap02_kvm_centos7
```


External snapshot については`--metadata` オプションをつけて削除する。

```text:書式
$ virsh snapshot-delete <KVMドメイン名> <スナップショット名> --metadata
```



```text:コマンド例
$ virsh snapshot-delete kvm_centos7 snap01_kvm_centos7 --metadata
```



## 削除 
autostart の設定があれば解除する。

```text:書式
$ sudo virsh autostart --disable <KVMドメイン名>
```



```text:コマンド例
$ sudo virsh autostart --disable kvm_centos7
```


virsh 管理対象から外す。

```text:書式
$ sudo virsh undefine <KVMドメイン名>
```



```text:コマンド例
$ sudo virsh undefine kvm_centos7
```


pool 名を確認します

```text:コマンド例
$ sudo virsh pool-list --all
 Name                 State      Autostart 
-------------------------------------------
kvm_centos7_pool      active     yes       
```


pool に紐づくデバイスを確認します。

```text:書式
$ sudo virsh vol-list <プール名>
```



```text:コマンド例
$ sudo virsh vol-list kvm_centos7_pool
 Name                 Path                                    
------------------------------------------------------------------------------
 disk.img             /path/to/volume
```


pool に紐づくデバイスを削除します。

```text:書式
$ sudo virsh vol-delete --pool <pool名> <デバイス名>
```



```text:コマンド例
$ sudo virsh vol-delete --pool kvm_centos7_pool disk.img
```


プール定義を削除します。

```text:コマンド例
$ sudo virsh pool-destroy kvm_centos7_pool
Pool kvm_centos7_pool destroyed
$ sudo virsh pool-delete kvm_centos7_pool
Pool kvm_centos7_pool deleted
```


## 削除されたことの確認 

```text:コマンド例
$ sudo virsh vol-list default
```
ifを使う場合とwhileを使う場合


---

*コメントを頂いたので、ソースを見なおしてみたら、
whileの方に余計な処理が入り込んでいて遅くなっていただけだった。実質的には、ほぼ変わらず、whileの方がコンマ遅れで終了する程度のズレだった。*

---

```.py
b = time.clock()
execute() # 処理
a = time.clock() - b
```

修正後のソース

```.py

import time

def hoge_while(h):
    while h % 15 == 0: return "KinokoTakenoko"
    while h % 3 == 0: return "Kinoko"
    while h % 5 == 0: return "Takenoko"
    return ""

def hoge_if(h):
    result = ""
    if h % 3 == 0: result += "Kinoko"
    if h % 5 == 0: result += "Takenoko"
    return result

def loop(hoge_list):
    i = 1
    while i <= 10000000:
        i, hoge_list[i-1]
        i += 1

before = time.clock()
loop([hoge_if(i) for i in range(1, 10000001)])
print time.clock() -before
before = time.clock()
loop([hoge_while(i) for i in range(1, 10000001)])
print time.clock() -before
```
akkaのActorから返ってくるFutureの中身には型推論が効かない？

## 症状
akkaのActorを使ってこういう感じのものを作っている時Actorから返って来るFutureの中身に型推論が効かない？

fooの後ろの整数を返すActor、それ以外はメッセージを返す。

```scala
import akka.actor._
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.{ Future, Await }
import scala.concurrent.duration._

case class findNumWithFoo(input: String)

class NumberSearcherActor extends Actor {
  def fooNum(input: String): Either[String, Int] = {
      input.matches("""foo\d""") match {
        case false => Left("This input is not fooNum")
        case true => Right(input.last.toInt)
      }
  }

  def receive: Receive = {
    case findNumWithFoo(input) => sender ! fooNum(input)
  }
}

object NumberSearch {
  implicit val timeout = Timeout(60.seconds)
  implicit val system = ActorSystem("mysystem")
  val numberSearcher = system.actorOf(Props[NumberSearcherActor])
  val input = "foo7"

  Await.result(numberSearcher ? findNumWithFoo(input), timeout.duration) match {
    case Left(message) => println(message.length) // messageがStringとして推論されずcompile error
    case Right(number) => println(number * 10) // numberがIntとして推論されずcompile error
  }
}

```

StringとIntではなく両方Anyとして認識されてしまうようでその後の処理がスムーズに書けず困りました。
これは果たして僕のコードがいけないのかScalaの型推論が弱いのか...

## 対策
AnyをStringとIntにキャストすると良いです。

```scala
import akka.actor._
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.{ Future, Await }
import scala.concurrent.duration._

case class findNumWithFoo(input: String)

class NumberSearcherActor extends Actor {
  def fooNum(input: String): Either[String, Int] = {
      input.matches("""foo\d""") match {
        case false => Left("This input is not fooNum")
        case true => Right(input.last.toInt)
      }
  }

  def receive: Receive = {
    case findNumWithFoo(input) => sender ! fooNum(input)
  }
}

object NumberSearch {
  implicit val timeout = Timeout(60.seconds)
  implicit val system = ActorSystem("mysystem")
  val numberSearcher = system.actorOf(Props[NumberSearcherActor])
  val input = "foo7"

  Await.result(numberSearcher ? findNumWithFoo(input), timeout.duration) match {
    case Left(message) => println(message.asInstanceOf[String].length)
    case Right(number) => println(number.asInstanceOf[Int] * 10)
  }
}

```

こうすると処理はできるようになりますが、個人的にすっきりしないし二度手間感があります。
何かもっと良い方法を知っている方いましたら教えてください。
Sensuプラグイン開発用のGo言語パッケージを作った


Sensuでは[sensu/sensu-community-plugins](https://github.com/sensu/sensu-community-plugins)としてプラグイン集が公開されています．
(今年に入ってから[sensu-plugins](https://github.com/sensu-plugins)に整理されているようです．)
Community pluginsは9割近くがRubyで開発されています．
これは，Rubyだとプラグイン開発用のライブラリが提供されていることが要因と思われます．

しかし，Rubyは比較的動作が重い言語なため，監視にかかる負荷も高めとなっています．
そこで，動作が軽くパッケージも豊富なGo言語でプラグインを開発してみました．

  - [hico-horiuchi/sensu-plugins-go](https://github.com/hico-horiuchi/sensu-plugins-go)

## sensu-plugins-go

Check，Metrics，Handler毎の処理をまとめたパッケージを作成しました．
ここでは，サンプルを使ってパッケージの使い方を紹介していきます．

### Check

  - [github.com/hico-horiuchi/sensu-plugins-go/lib/check](https://github.com/hico-horiuchi/sensu-plugins-go/blob/master/lib/check/check.go)

```go
func main() {
	var crit  int

	c := check.New("Check")
	c.Option.IntVarP(&crit, "crit", "c", 90, "CRIT")
	c.Init()

	usage := Usage()

	switch {
	case usage >= crit:
		c.Critical(strconv.Itoa(usage)+"%")
		//=> Check CRITICAL: 100%
	}
}
```

`New()`で名前を指定，`Option`でオプション(フラグ)を追加します．
これは[github.com/spf13/pflag]("https://github.com/spf13/pflag")を流用しており，`Init()`でフラグをパースします．
`Ok()`・`Warning()`・`Critical()`に`string`を渡すと，結果の出力と`os.Exit()`が実行されます．

### Metrics

  - [github.com/hico-horiuchi/sensu-plugins-go/lib/metrics](https://github.com/hico-horiuchi/sensu-plugins-go/blob/master/lib/metrics/metrics.go)

```go
func main() {
	m := metrics.New("usage")
	usage := Usage()
	m.Print(usage)
	//=> host.usage 100.0 1434983749
}
```

`New()`でスキーマを指定，Checkと同様にオプションも利用できます．
`Print()`に`float64`を渡すと，`ホスト名.スキーマ 値 UNIX時間`の形式で出力します．
ホスト名は`Hostname()`，スキーマは`Scheme()`で任意の`string`に変更できます．

### Handler

  - [github.com/hico-horiuchi/sensu-plugins-go/lib/handler](https://github.com/hico-horiuchi/sensu-plugins-go/blob/master/lib/handler/handler.go)

```go
func main() {
	h := handler.New("/etc/sensu/conf.d/handler.json")
	fmt.Printf("%s\n", h.Config.GetPath("handler", "name").MustString())
	fmt.Printf("%+v\n", h.Event)
}
```

`New()`で設定ファイルのパスを指定します．
設定は[github.com/bitly/go-simplejson](https://github.com/bitly/go-simplejson)で読み込まれ，`Config`に格納されます．
`GetPath()`でJSONの階層を指定し，`MustString()`などで型を指定して取り出せます．
パイプで渡ってきたEventはパースされ，構造体に格納します．

## IOT研究会での発表

この内容はCommunity pluginsとの性能比較などを含めて，7月3日のIOT研究会で発表します．

  - [平成27年度第2回 (IOT通算30回) 研究会 プログラム - IPSJ SIG-IOT Homepage](http://www.iot.ipsj.or.jp/news/iot30-program)

> 「実験用仮想サーバに適したSensuプラグインの開発」
> Sensuとは，Ruby製の監視フレームワークである．
> 監視対象の自動登録，構成管理を前提とした設定など，クラウドに適したアーキテクチャとなっている．
> 我々の研究室では，分散Webシステムの研究のため数十台の仮想サーバを運用している．
> 本稿では，Go言語を用いてプラグインを開発することで監視のオーバーヘッドを抑える手法や，サーバ停止時に自動的に監視対象から除外する手法など，実験環境特有の要件について述べる．

## 参考文献

  - [sensu プラグインを作って学ぶ Go | cloudpack技術情報サイト](http://blog.cloudpack.jp/2014/12/31/learn-go-by-making-sensu-plugin/)
  - [Sensu with golang - SlideShare](http://www.slideshare.net/hico_horiuchi/sensu-with-golang)
MacにJenkinsを入れてみる

OS X 10.10にJenkinsをインストールしてみました。

[参考サイト](http://qiita.com/makoto_kw/items/cbe93d4ebbc35f3b43fd)
はい。全く同じ記事があったので参考サイトを見ながらインストール開始。

1.Homebrewのインストール
***
上記リンクを見ながらインストールしようとしたらコマンドが認識されませんでした。
そもそもJenkinsの前にいろいろ足りないみたいです。
[Homebrewが必要みたいだけど。。](http://brew.sh/index_ja.html)
以下コマンドを実行するだけ見たい。。

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

インストール待ち。。。。。。。。。。。。。。10分後。。。
インストール終わりました。


２.Jenkinsのインストール
***
ターミナルからコマンド実行

```
brew install jenkins
```

これでインストールは完了。

３.Jenkinsのポート変更
***
ポートが8080なので8081に変更する。

homebrew.mxcl.jenkins.plist編集

```terminal:/Users/XXXXX/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
<string>--httpPort=8081</string>
```

homebrew.mxcl.jenkins.plistを編集したら再起動。

```
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
launchctl stop homebrew.mxcl.jenkins
launchctl start homebrew.mxcl.jenkins
```

これでhttp://localhost:8081で起動します。

Mac初心者でJenkins初インストールでも簡単にできました。
おしまい。
Rails 4 + test-unit + guard で --use-color が出る


ファイルを編集したら自動でテストをしたいと思いまして下記の構成で Guard を導入しました。

```
Ruby 2.2.2
Rails 4.2.1
test-unit 3.1.2
guard 2.0.6
```

が、なにか不正なオプションであるエラーがでて困りました。

```
$ bundle exec guard
22:50:19 - INFO - Guard::Test 2.0.6 is running, with Test::Unit 3.1.2!
22:50:19 - INFO - Running all tests

invalid option: --use-color

minitest options:
    -h, --help                       Display this help.
    -s, --seed SEED                  Sets random seed. Also via env. Eg: SEED=n rake
    -v, --verbose                    Verbose. Show progress processing files.
    -n, --name PATTERN               Filter run on /regexp/ or string.

Known extensions: pride
    -p, --pride                      Pride. Show your testing pride!
22:50:23 - INFO - Guard is now watching at '/home/ec2-user/repos/tripnote-api'
[1] guard(main)>
```

## 解決策

Guardfile を次のように変更します。

```変更前
guard :test do
```

```変更後
guard :test, spring: true do
```

Rails 4.1 から spring が標準で組み込まれているようで、このような指定が必要っぽいです。
このオプションが指定されると具体的にどう挙動が変わるまでは追っていないので教えて偉い人！
例外処理の落とし穴

言語側で実装されていれば、なかば強制的に使うことになりますし、そして正常系の処理と異常時の処理をスッキリ分離できるので便利な例外処理ですが、開発の過程では逆に厄介な現象を招くこともあります。

# 例外処理の基本
C++やJavaScriptなどでは、例外としてどんなものでも投げることができますが、RubyやJavaでは、特定の基底クラスから継承したものしか例外として投げることはできません。

そして、例外クラスはたいていの場合、継承ツリーを通じていくつかに区分されています。Javaであれば「処理系自体の異常（`Error`）」、「チェック例外（`Exception`）」、「非チェック例外（`RuntimeException`）」、Rubyでは「通常実行時に起きる例外（`StandardError`）」、「それ以外の例外（`Exception`）」となっています。そして、Javaでは検査例外がありますが、Rubyでは何も明示しなければ`StandardError`だけを拾う、ということになっています。

# ハマったパターン
Rubyでプログラムを書いていて、ちょうどRailsの`save`と`save!`のように、例外を返すバージョンと返さないバージョンの関数を作り分けていました。

```rb:get-get!
def get!(*args)
  # 異常時には例外を起こす
  raise ArgumentError unless hoge
  # 各種の処理
  piyo
end

def get(*args)
  get!(*args) rescue nil
end
```

このようにして書き進めていたところ、`get`の返り値が（`args`を考えれば何かしら返すはずなのに）`nil`になってしまう、ということが起きました。原因を追いかけてみると、`get!`の内部でハッシュの添字に指定する値を間違えたために取得した値が`nil`になっていて、それにメソッドを呼び出した結果が`NoMethodError`となっていました。で、`NoMethodError`は`StandardError`のサブクラスなので、`get`内で**`rescue`されて**いて、外にも例外が見えなくなってしまっていたのでした。

結局、`get!`内のバグを修正したのはもちろんですが、`rescue`も内部で意図的に生成している`ArgumentError`だけ拾うようにして、今後似たような問題が起きるのを予防することにしました。

Rubyでは、呼び出した先にメソッドがない`NoMethodError`や、ローカル変数がないときの`NameError`といった例外も`StandardError`のサブクラスなので、何も書かない`rescue`でキャッチされてしまいます。

# 教訓
起きる例外がわかっている場面では、必要最小限の例外だけキャッチしましょう。Rubyでは、プログラムミスで起きる例外でも`rescue`されてしまうことがあります。

また、メモリ不足や処理系内部のエラーなどは、自分で対処する方法がないのであればキャッチしてはいけませんし、シンタックスエラーやファイルロードの失敗といった、基本的にプログラムミスでしか起きないようなものは、`irb`や`pry`のような、ユーザー入力をプログラムにするようなものを作っているのでなければ、キャッチするよりプログラム側、gem導入など処理系側の修正が必要な場面でしょう。
CSSとJavaScriptで円周上に等間隔に要素を配置する

要素の数に合わせて円周上に等間隔に要素を配置します。

![スクリーンショット 2015-06-22 22.44.08.png](https://qiita-image-store.s3.amazonaws.com/0/27500/f372ad33-5027-f24c-ef1d-c77fcf49f211.png)

```html:HTML
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script type='text/javascript' src='http://code.jquery.com/jquery-1.11.3.min.js'></script>
</head>
<body>
<section class="main-contents">
	<section class="circle-box">
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
		<div class="item"></div>
	</section>
</section>
</body>
</html>
```
```css:CSS
.main-contents {
	position: relative;
	width: 100%;
}
.circle-box {
	position: relative;
	margin: 0 auto;
}
div.item {
	position: absolute;
	width: 40px;
	height: 40px;
	-webkit-border-radius: 20px;
	-moz-border-radius: 20px;
	border-radius: 20px;
	background-color: #999;
}
```
```js:JS
$(function(){
	var item_num = $('div.item').length;
	var deg = 360.0/item_num;
	var red = (deg*Math.PI/180.0);
	var circle_r = $("div.item").width() * 2.5;
	$('div.item').each(function(i, elem) {
		var x = Math.cos(red * i) * circle_r + circle_r;
		var y = Math.sin(red * i) * circle_r + circle_r;
		$(elem).css('left', x);
		$(elem).css('top', y);
	});
});
```

もっと良い書き方がありそう。
RailsのPJをherokuにデプロイする場合のハマりどころ

引き続き、Rails初心者の私がはまったところのメモ。
ある程度ローカル環境で動くようになったのでherokuにデプロイしてみる

```
$ heroku login
$ git init
$ heroku git:remote -a {Project Name}
$ git add .
$ git commit -m "message"
$ git push heroku master
```

でやってみると


> ###### WARNING:
       You have not declared a Ruby version in your Gemfile.
       To set your Ruby version add this line to your Gemfile:
       ruby '2.0.0'
       # See https://devcenter.heroku.com/articles/ruby-versions for more information.
###### WARNING:
       No Procfile detected, using the default web server (webrick)
       https://devcenter.heroku.com/articles/ruby-default-web-server


Gemfileにrubyのバージョンを書いてなかった・・・
[https://devcenter.heroku.com/articles/ruby-versions](https://devcenter.heroku.com/articles/ruby-versions)

Gemfileを修正して再度デプロイすると、エラーなく完了したので、ページにアクセスしてみると、

>The page you were looking for doesn't exist.

今度はなに・・・

Herokuへのpushする場合に、productionならルートページを設定しないといけないらしい。
とりあえず、細かくは後で直すとして下記のようにroute.rbを修正して再度push。

```
root :to => 'some_controller#index'
```

some_controllerの部分は表示したいページのController、#以降はそのControllerのindex名。

ちなみに、
ローカルブランチの最新版をherokuにpushしようとするときに、

```
$ git push heroku master
Everything up-to-date
```

と怒られてしまって一向にpushできない場合は
開発ブランチ名を指定するといけるらしい。

例：開発ブランチ名が'dev'だった場合、

```
$ git push heroku dev:master
```
root以外のユーザーでupstartを実行する

あるスクリプトをroot以外のユーザーでずっと実行させたい、そしてもしプロセスが死んでも再起動して欲しいという事で初めて **upstart** を使ってみたのでその時のメモ
今回は無限ループするシェルスクリプトをupstartとして登録して挙動を確認する

# 参考

+ [Upstartの動きを理解する](http://www.usupi.org/sysad/188.html)
+ [Upstartを使ってお手軽deamon化](http://heartbeats.jp/hbblog/2013/02/upstart-daemon.html)

# 動作環境

+ Amazon Linux AMI release 2015.03

# Upstartのバージョン確認

```
$ initctl --version
initctl (upstart 0.6.5)
Copyright (C) 2010 Canonical Ltd.

This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

# サンプルシェルスクリプトを作成する

以下のような無限ループするシェルスクリプトを作成してみて確認する

```lang:createDateFile.sh
#!/bin/bash

while :
do
  date |xargs echo >> /home/ec2-user/time.txt
  sleep 5
done
```

試しに実行してみる。

```
$chmod 755 createDateFile.sh
$./createDateFile.sh
```

実行すると/home/ec2-user/配下に5秒毎にtime.txtというファイルに時間が追記されるのが確認できます。無限ループなのでCtrl+Cで途中で停止させること

# upstartに登録する

upstartにスクリプトの設定は **/etc/init/** 配下に配置する。今回は以下のファイルを作成

```
$sudo vi /etc/init/create-date-file.conf
```

```lang:create-date-file.conf
description "create date file"

start on runlevel [2345]
start on runlevel [!2345]

respawn

exec /home/ec2-user/createDateFile.sh
```

設定を反映します。

```
$sudo initctl reload-configuration
$sudo initctl list |grep create
create-date-file stop/waiting
```

上記の状態ではスクリプトは実行されていないので実行させます。

```
$sudo initctl start create-date-file
create-date-file start/running, process 2385
$sudo initctl list |grep create
create-date-file start/running, process 2385
```

起動後は **start/running** となっているのが確認できます。

またプロセスが起動していることも確認できます。

```
$ps aux |grep createDate
root      2385  0.0  0.1  11520  1344 ?        Ss   06:23   0:00 /bin/bash /home/ec2-user/createDateFile.sh
ec2-user  2704  0.0  0.0 110404   860 pts/0    S+   06:29   0:00 grep createDate
```

試しに上記のプロセスをkillしてみます。

```
$sudo kill -KILL 2385
```

その後、プロセスを再確認すると別のプロセスIDで起動している事が確認できます。

```
$ ps aux |grep createDate
root      2767  0.0  0.1  11520  1332 ?        Ss   06:31   0:00 /bin/bash /home/ec2-user/createDateFile.sh
ec2-user  2773  0.0  0.0 110404   860 pts/0    S+   06:31   0:00 grep createDate
```

# rootユーザー以外で実行する

上記だと実行ユーザーが **root** となってしまいます。上記より、任意のユーザーで実行できるように設定を変更します。今回はec2-userで実行するようにします。

以下のようにファイルを変更します。

```lang:create-date-file.conf
description "create date file"

start on runlevel [2345]
start on runlevel [!2345]

respawn

exec `su ec2-user -c "/home/ec2-user/createDateFile.sh"`
```

また、先ほどのファイルを削除後、再設定して起動させます。

```
$sudo initctl stop create-date-file
create-date-file stop/waiting
$sudo rm ~/time.txt
$sudo initctl reload-configuration
$sudo initctl start create-date-file
```

上記実行後、プロセスを確認すると期待したとおりec2-userでプロセスが実行され、/home/ec2-user/time.txtもec2-userの権限となっていることが確認できます。
PowerPointで横スクロールさせるマクロ

PowerPoint2013では、なぜかマウスのチルト機能(横スクロール)が効かなかったので、マクロを作成。
これをチルトボタンに割り当てれば問題ないですね。

```vbnet:sample
'横スクロール マクロ
Public Sub ScrollToRight()
    ActiveWindow.SmallScroll toRight:=3
End Sub

Public Sub ScrollToLeft()
    ActiveWindow.SmallScroll toLeft:=3
End Sub
```
aliasにbash関数を使おう：レンタルサーバ借り直した時の.bashrcを晒してみる

#とりあえずちまちまやってる
まあ、色々とちまちまやってます。とは言え、何となくヒコーキに乗る用事とかが入ってきて、変な空き時間が増えているものの、なかなかコーディング遊びには使いづらい隙間だったりする。

それはそうと、ちょっと前、借りてたVPSがなんかの踏み台にされたらしく、レンタルサーバ会社から停止の通告を受けたので、目に見えぬ輩との無用な戦いを避けて、解約＆同じ会社で借り換えした。

で、新たに環境構築してみると、なんてゆーか、まあ、断捨離ができるわけだ。余計なパッケージはめんどいので入れなくなるし、凝りすぎた設定も削るようになる。vimのモジュールなんかもね。遊びのサーバはたまに借り換えるのが良いかも、とも思ったものだ。

そんな断捨離を経た.bashrcはこんな感じ。cdwkだけは、その都度、今一番弄ってるスクリプト等のディレクトリを直に書き込んでる。ホームディレクトリにシンボリックリンク張るのも良いけど、なんだかんだ言ってタイプ数が多いのだ。ログインして即cdwkって打ちたい、それだけのためなのだ。どうせそんなに書き換えないし、自動処理してなにかあると嫌なので、手作業の方が良いのだ。

```
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
# フォルダ作ってすぐ入る
# 　引数はフォルダ名
function mkcd() {
    mkdir $1;
    cd $1;
}
alias mkcd=mkcd
# ダウンロードして解凍して、そん中入って、build掘って更に入る
# 　引数はURL
function dl() {
    wget $1;
    fname=${1##*/};
    bigbody=${fname%.*};
    ext2=${fname##*.};
    ext1=${bigbody##*.};
    body=${bigbody%.*};
    ext=$ext1"."$ext2;
    if test $ext = "tar.gz"; then
        tar xvzf $fname;
    elif test $ext = "tar.bz2"; then
        tar xvjf $fname;
    else
        echo 'error !';
        echo 'body = '$body;
        echo 'ext = '$ext;
        return;
    fi
    cd $body;
    mkdir build;
    cd build;
}
alias dl=dl
# 更新全部登録してコミットしてステータス確認
# 　引数はコミットメッセージ（スペースで区切って大丈夫）
function gits() {
    git add -A;
    git commit -m "$*";
    git status;
}
alias gits=gits
# 在処が全然わかんないファイルを力尽くで探す
# 　引数はファイルグロブ
function fa() {
    sudo find / -name "$1" -ls;
}
alias fa=fa
# 心当たりのあるファイルをpwd以下で探す
# 　引数はファイルグロブ
function ff() {
    find . -name "$1" -ls;
}
alias ff=ff
# 最近の作業場所を登録しておく
alias cdwk='cd /path/to/current/working/project'
# 実行中プロセス一覧表示
# 　引数は含まれる文字列
function psg() {
    ps aux|grep $1
}
alias psg=psg
alias ps='ps aux'
# ファイル一覧
alias ll='ls -l'
alias la='ls -a'
# ディスク残量
alias df='df -h'
# エディタ
alias vi='vim'
# sudoの際、環境変数やエイリアスを引き継ぐため
alias sudo='sudo -E '
```

sudoだけ、ちょっとあぶなめかも。よい子はよく考えましょう。faもちょっとあぶなめだね。
RailsでIE9以下のCSSセレクタの上限値4096対策


IE9以下にはCSSファイルのセレクタ数に制限があって、制限値を超えた時にレイアウトが崩れてしまう。

#### セレクタ数のチェック

以下のスクリプトでセレクタ数をチェックできるが、厳密に4096を越えてなくても崩れるときがあった。

```
function countCSSRules() {
  var total_count = 0;
  var results = '', log = '';
  if (!document.styleSheets) {
    return;
  }
  for (var i = 0; i < document.styleSheets.length; i++) {
    countSheet(document.styleSheets[i]);
  }
  function countSheet(sheet) {
    var count = 0;
    if (sheet && sheet.cssRules) {
      for (var j = 0, l = sheet.cssRules.length; j < l; j++) {
        if( !sheet.cssRules[j].selectorText ) {
          continue;
        }
        count += sheet.cssRules[j].selectorText.split(',').length;
      }

      log += '\nFile: ' + (sheet.href ? sheet.href : 'inline <style> tag');
      log += '\nRules: ' + sheet.cssRules.length;
      log += '\nSelectors: ' + count;
      log += '\n--------------------------';
      total_count += count;
      if (count >= 4096) {
        results += '\n********************************\nWARNING:\n There are ' + count + ' CSS rules in the stylesheet ' + sheet.href + ' - IE will ignore the last ' + (count - 4096) + ' rules!\n';
      }
    }
  }
  console.log(log);
  console.log(results);
  console.log('CSS Selectors: ' + total_count);
}
```

#### Railsの場合gemで分割する

- [zweilove/css_splitter](https://github.com/zweilove/css_splitter)
- [Railsでcssのセレクタ数が4096を超えた場合の対処方法](http://qiita.com/patorash/items/5184983c97391d57df01)

私の場合は、以下のようにしたら上手くいった。`@import`記法だと分割したファイルが空で作成されて上手くいかない。

```
/*
 *= require 'application'
 */

```

##### テストでチェックしたらCSSの肥大化防止を意識できる。けれど超えちゃう前提なら不要。

- [Internet Explorer 9以下に存在する「1つのCSSファイルで認識されるセレクタは4,096個まで」という制限に突然引っかからないようにするための方策。](http://journal.sooey.com/213)


#### しかし不明なエラーがあります

場合によっては、以下の様なエラーがでるかもしれません。

`Sass::SyntaxError: @charset may only be used at the root of a document.`

この[issue](https://github.com/zweilove/css_splitter/issues/52)に書いてますが、
以下の条件でエラーが出るようです。

- コメントにマルチバイト文字
- CSSファイル内にコンパイル対象がある場合

これでCSSセレクタの数を気にせずに開発ができるようになりました。
新しいMacbook買ったのでひさびさにプログラマに戻ろうと思う。

#何を買ったか

新しいMacbookの安い方です。スペックは下記の通り。

- 12インチMacBook 256GB
- 1.1GHzデュアルコアIntel Core M（Turbo Boost使用時最大2.4GHz）
- Intel HD Graphics 5300
- 8GB 1,600MHz LPDDR3 SDRAM
- 256GB PCIeベースオンボードフラッシュストレージ
- バックライトキーボード (US) 

非力ですが、持ち運び便利なので、空き時間にちょこちょこ開発でもしようかなと思って備忘録がてらに、Qiitaにログを残していきます。もうかれこれ8年くらい技術的なことから離れていたので、けっこう浦島太郎状態。しかも、開発環境はDebianだったので、Mac OS Xは開発環境としては初心者。apt-getが懐かしいけど、地道にやっていこうとおもう。


#買ってインストールしたもの

まずは、AppStoreで必要なものをインストール。

- 1Password
- Witch
- BetterSnapTool
- LINE
- Xcode
- Evernote
- Tree2

Xcodeはダウンロードしかされないので、起動してインストール。

AppStoreにないものは個別にインストール。

- Google Drive
- Kindle
- Microsoft Office 2015

CPUが大したことないし、PhotoshopとかIllustratorは必要になったら入れる。

# Homebrewをインストール

続いて、Homebrewで必要なものをインストール。

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

Homebrew Caskを入れて、必要なアプリを入れておく。

```
$ brew tap phinze/homebrew-cask
$ brew install brew-cask
$ brew install atom
```

エディタは、昔はEmacsを使ってたけど、せっかくだしAtom使ってみる。
Unityのフェードのサンプルがわりと間違っている

いわゆる単色でのフェードインアウトをUnityで実装するにあたって、ググって見つかるよくある例が OnGUI() 関数で GUI.DrawTexture する、というのが多い。

ここを筆頭に。
http://answers.unity3d.com/questions/341350/how-to-fade-out-a-scene.html

間違いの例

```csharp:bad
private Texture2D    _fadeTex;
private float        _alpha;

void Start()
{
    _fadeTex = new Texture2D(1,1,TextureFormat.RGBA32,false);
}
void OnGUI()
{
    _alpha = fadeDir * fadeSpeed * Time.deltaTime;  
    GUI.color.a = _alpha;
    Graphics.DrawTexture( screenRect, _fadeTex );
}
```
上記ソースはいろいろ端折っちゃったのですが、何が間違いかというと「OnGUIとTime.deltaTimeに因果関係が無いのでOnGUI内でTime.deltaTimeを使った計算をしてはいけない」ということです。
OnGUIはUpdateと同じ回数コールされるわけではありません。Updateが１回コールされるあいだに、２回３回とOnGUIが実行されることがあります。
ですので、１秒でフェードアウトするようなソースを書いたとしてもほぼ１秒未満、下手すると0.3秒などでフェードが終了してしまうでしょう。
なので 

```csharp:good
void Update()
{
    _alpha = fadeDir * fadeSpeed * Time.deltaTime;  
}
void OnGUI()
{
    GUI.color.a = _alpha;
    Graphics.DrawTexture( screenRect, _fadeTex );
}
```

と、Updateの中でフェードの度合いは更新してあげる必要があります。
または、こんなのでもいいのかもしれません。

```csharp
void OnGUI()
{
    if (Event.current.type == EventType.Repaint)
    {
        _alpha = fadeDir * fadeSpeed * Time.deltaTime;  
        GUI.color.a = _alpha;
        Graphics.DrawTexture( screenRect, _fadeTex );
    }
}
```
EventType.RepaintとしてOnGUIがコールされる間隔がTime.deltaTimeと一致するのか、マニュアルを読んでもいまいち確信が持てないのであんまりお勧めしないです．．．（というか自信が無い。調べてもいなくて恐縮です。）
http://docs.unity3d.com/ScriptReference/EventType.Repaint.html

本家のチュートリアルはそのあたりを正しく押さえたソースになっています。
https://unity3d.com/learn/tutorials/projects/stealth/screen-fader
しかし、「Unity fade」でググると間違ってるフェードのソースが上位を占めているようなのでこの項を書いてみました。
Eclipseでログがどーしても出ない時の意外な落とし穴

![スクリーンショット 2015-06-22 21.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/57193/b5f082e8-be04-ff66-98c4-3751fd2527b6.png)


超シンプルですが、
**ログのテキストフィールドから検索フィルターをかけているとご覧のようにフォーカスしていない時は見えません。w　（Mac）**

###ここでテキストフィールドをクリックしてみます

![スクリーンショット 2015-06-22 21.22.35.png](https://qiita-image-store.s3.amazonaws.com/0/57193/ab22f0a9-f1ab-48e2-eca9-b02ef58640c7.png)


隠れたフィルターが出てきたら消しましょう。
Gradle から Gatling 発射（バグ回避策付き）

`$ gradle loadTest` で [Gatling](http://gatling.io/#/) による負荷テストが走るようにする。ググると古い情報に当たることが多かったのでメモ。

これを実現した簡単なプロジェクト:

* [kui/gatling-gradle-example](https://github.com/kui/gatling-gradle-example)


やりかた
--------------

`build.gradle` に Gatling パッケージと、上述したようなタスクを書く。こんな感じ:

~~~~~~~~~~~~~~~~~~~~~~~~~groovy:build.gradle
dependencies {
    // ...
    testCompile "io.gatling.highcharts:gatling-charts-highcharts:2.1.6"
}

// ...

task loadTest(type: JavaExec) {
    dependsOn testClasses
    description = "load test with Gatling"
    group = "Load Test"
    classpath = sourceSets.test.runtimeClasspath
    jvmArgs = [
        // バグ回避策: https://github.com/gatling/gatling/issues/2689
        // Gatling 2.1.7 になれば不要になるはず
        "-Dgatling.core.directory.binaries=${sourceSets.test.output.classesDir.toString()}",
    ]
    main = "io.gatling.app.Gatling"
    args = [
        "--simulation", "gatring.simulations.FooSimulation",
        "--results-folder", "${buildDir}/gatling-results",
        "--binaries-folder", sourceSets.test.output.classesDir.toString(), // 上述のバグで無視される
        "--bodies-folder", sourceSets.test.resources.srcDirs.toList().first().toString() + "/gatling/bodies",
    ]
}
~~~~~~~~~~~~~~~~~~~~~~~~~

* `gatring.simulations.FooSimulation` にはシナリオが記述されている
* `FooSimulation.scala` は `src/test/scala` 以下に置く
* `${buildDir}/gatling-results` はレポートの置き場


ただし
-------

Java でアプリケーション作り、Gatling のシナリオを scala で書くと、1つのプロジェクトに Java, Groovy, Scala のコードが存在することになるので少し頭抱える。

シナリオを Groovy or Java で書けるかな？


余談
-------

gradle で scala コードコンパイル時の scala バージョンって指定できないんでしょうか？
QBImagePickerControllerで取得した画像をALAssetで持ちまわる


QBImagePickerControllerを使用した時に遭遇したエラーの対処法。

### 問題
下記のdelegateメソッド内で取得したassetsをそのままメンバ変数に入れて、表示に使おうとしたらエラー発生。


### コード
```objectivec:問題のコード
- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didSelectAssets:(NSArray *)assets
{
	// 下記のようにコピーしただけだと途中で破棄されてしまう
	imageAssets = [assets copy];

	[_collectionView reloadData];
}
```

```text:エラー
invalid attempt to access ... past the lifetime of its owning ALAssetsLibrary
```

### 対応
どうやら、ALAssetを持ち回っている間に破棄された模様。下記のようにコードを変更して対応

```objectivec
- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didSelectAssets:(NSArray *)assets
{
	// assetURLsはNSMutableArrayとしてメンバ変数に定義してあります
	for (ALAsset *asset in assets) {
		NSString *assetURL = [[asset valueForProperty:ALAssetPropertyURLs] objectForKey:[[asset defaultRepresentation] UTI]];
        [assetURLs addObject:assetURL];
    }
    [_collectionView reloadData];
}

// セルに取得した画像のサムネイルをセット
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    [assetsLibrary assetForURL:[assetURLs objectAtIndex:indexPath.row]
                   resultBlock:^(ALAsset *asset) {
                       cell.thumbnail.image = [UIImage imageWithCGImage:[asset thumbnail]];
                   } failureBlock:^(NSError *error) {
                       NSLog(@"%@", error);
                   }];
    
    return  cell;
}
```

### おわりに
iOS8以降をサポートしている場合は、PhotoKitが使えるのでそちらを使いましょう。
役に立たないどころか知ってるとサボってると思われる知識

#謎メソッド　forty_two()

Find the forty-second record. Also known as accessing “the reddit”. If no order is defined it will order by primary key.

42番目のレコードいわゆる"reddit"にアクセスする｡
特に指定がなければなければ出力はprimary keyで並ぶ

```
Person.forty_two 
=> returns the forty-second object fetched by SELECT * FROM people
Person.offset(3).forty_two 
=> returns the forty-second object from OFFSET 3 (which is OFFSET 44)
Person.where(["user_name = :u", { u: user_name }]).forty_two
```

こうやって使うのかな???

```
if params[:question] ==　"life, universe and everything"
 Answers.forty_two
end
```
**「宇宙とか人生とか地球とかそんなんもろもろ全部に対する答えって出せないの?」**

とクライアントに言われた時に役に立ちそうですね｡(ねーよ)

*追記*
[Quora: forty_twoってなんでThe Redditメソッドなんて言われてるの?](http://www.quora.com/Why-is-Array-forty_two-called-the-reddit-in-Ruby-on-Rails)
制作者がRedditのスレ民の需要に応えたとか何とか書いてあります｡

#ネタはいいから・・・　as_json(options = nil) 
Returns a hash representing the model. Some configuration can be passed through options.

モデルに対して使うとハッシュが帰ってくるみたいです｡

```
user = User.find(1)
user.as_json
```
とすると

```
# => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
#     "created_at" => "2006/08/01", "awesome" => true}
```
ふつーに便利そうですね｡

あれ･･･?

```
# => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
```
ん?

**"name" => "Konata Izumi"**

どうでもいいですがこなたって変わった名前ですね｡
えー　こなた　えー　えー

**[Konata Izumi](https://www.google.co.jp/search?q=Konata+Izumi&num=100&es_sm=122&source=lnms&tbm=isch&sa=X&ei=6vGHVdS7AsHQmAW8i4G4Dw&ved=0CAcQ_AUoAQ&biw=1280&bih=715)**


**(;´Д`)　ｵｳﾌ・・・・・・・・・**
Swift のクロージャについてのメモ


検証環境: `1.2`, `2.0 (Xcode7.0 beta)`

とあるコードを読んでてとっさに理解できなかったのでメモ。

### 初期化が期待されるプロパティを持つ struct の初期化

```swift
struct A {
    let str: String
}

var a = A("a") // error: missing argument label 'str:' in call var a = A("a")
```
プロパティを暗黙のイニシャライザで初期化しようとすると、当然ラベルがいる。

### 関数による初期化が期待されるプロパティを持つ struct の初期化

```swift
struct B {
    let someFunc: String -> String
}

var b = B { x in "result" }
b.str("b") // "result"
```
ラベルがいらないんだなあ。

## Trailing closures はラベルを省略できる

[ドキュメント](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID97) に普通に書いてあった。
いきなり Struct の初期化時に使われて一瞬何やってるか分からなかったという話でした。
Slackにincoming webhook経由でpythonからメッセージをPOSTする

# Slack + WebHook による投稿について

SlackではWebHook用URLを取得することで、簡単にPythonスクリプトからメッセージを投稿することができます。

Slackには、比較的単純なメッセージに使用する`message`と複雑なメッセージの形式を表現できる`attachments`が存在します。
Pythonを使用し上記両方のフォーマットでslackに投稿する仕組みについて説明します。

# Incoming WebHookの設定

Slackの[Incoming WebHookの設定ページ](https://my.slack.com/services/new/incoming-webhook/)で投稿用URLを発行します。

チャンネルを選択して、`Add Incoming WebHooks Integration`ボタンをクリックします。
  ![スクリーンショット 2015-06-22 18.47.17.png](https://qiita-image-store.s3.amazonaws.com/0/43202/876ac261-fbe1-baae-6deb-ce4f257af1a7.png)


表示されるWebhook URLをコピーしておきます
  ![スクリーンショット 2015-06-22 18.48.30.png](https://qiita-image-store.s3.amazonaws.com/0/43202/0f05882e-0ba8-a324-b15b-7a4abc24cae7.png)

(オプショナル)必要な場合はデフォルトの投稿設定を変更できます。

|項目|説明|
|:----|:----|
|Customize Name|投稿時のデフォルトユーザ名|
|Customize Icon|投稿時のデフォルトアイコン|

修正した場合は、`Save Settings`で修正を保存しておきます。

  ![スクリーンショット 2015-06-22 18.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/43202/54d28a1f-f6aa-fd62-4702-c8a0633e6334.png)


# PythonからSlackへ投稿

## slackwebをインストール

WebHookで簡単に投稿を行うことが可能な[slackweb](https://github.com/satoshi03/slack-python-webhook)をpip経由でインストールします。

<pre>
sudo pip install slackweb
</pre>

## 単純なメッセージの送信

slackwebを使用することで以下のようにメッセージを送信できます。
ここで省略されたフィールドはデフォルトのものが使用されます。

```.python
> import slackweb
> slack = slackweb.Slack(url="<コピーしたURL>")
> slack.notify(text="This is a test.")
```

![スクリーンショット 2015-06-22 19.31.17.png](https://qiita-image-store.s3.amazonaws.com/0/43202/8e39c229-4418-0130-3ea3-3e809949109c.png)


notifyメソッドの引数を修正することで、部屋やアイコン、ユーザ名を修正したり、簡易的なマークダウン記法を使用することができます。（詳細について知りたい方は[Message Formatting](https://api.slack.com/docs/formatting)を参照してください。）

```.python
> slack.notify(text="This is a *test*.", channel="#coffee", username="coffee-bot", icon_emoji=":coffee", mrkdwn=True)
```

![スクリーンショット 2015-06-22 19.33.46.png](https://qiita-image-store.s3.amazonaws.com/0/43202/49981407-0a6f-1641-4e08-57528d99c883.png)

## 複雑なメッセージの送信

`attachments`の形式を使用することで複雑なメッセージを送ることもできます。

```.python
> attachments = []
> attachment = {"title": "Sushi",
                "pretext": "Sushi _includes_ gunkanmaki",
                "text": "Eating *right now!*",
                "mrkdwn_in": ["text", "pretext"]}
> attachments.append(attachment)
> slack.notify(attachments=attachments)
```

![スクリーンショット 2015-06-22 19.38.57.png](https://qiita-image-store.s3.amazonaws.com/0/43202/be506ab1-bf91-cf0c-5fcf-f3018c500846.png)

詳細については、[Attachments](https://api.slack.com/docs/attachments)を参照してください。

# 参考にしたサイト
[slack - incoming-webhooks](https://api.slack.com/incoming-webhooks)
iOS safari の戻る/進むボタンと bfcache について

## bfcacheとは

bfcache とは、ざっくり言うとブラウザの戻るボタンや進むボタンを押して画面遷移した時に、onload イベントが発火せず、JavaScript の状態が保存されたキャッシュが呼ばれて表示されることです。
発生条件は色々あるようなので、戻る/進むボタンを使うと必ず起こる現象でもないようです。
bfcache に関して詳しくは下記あたりに目を通したうえで検索してください。

[Using Firefox 1.5 caching](https://developer.mozilla.org/ja/docs/Using_Firefox_1.5_caching)
[Working with BFCache](https://developer.mozilla.org/ja/docs/Working_with_BFCache)
[bfcache について覚えて帰ってもらいます。（転載）](http://oogatta.hatenadiary.jp/entry/20121228/1356696182)


## bfcache を無効にする

bfcache を無効にする方法を検索すると、下記のように onunload イベントにフックするだけで回避できるという記述が出てきます。

```
window.onunload = function() {};
```

が、**iOS safari ではこの方法で回避できません。**

iOS safari では下記のように pageshow イベントと、初回ロード時に false がセットされる persisted という真偽値プロパティを使用して、bfcache が使用された場合にリロードなどの処理を入れて回避することになります。

```
window.onpageshow = function(event) {
  if (event.persisted) {
    window.location.reload();
  }
};
```

ただこの方法だと、bfcache が使用された場合に必ずリロードされてしまうので、実際には

* リロード以外の処理でなんとかする
* 必要な時だけリロードさせる

などにしたほうが bfcache による体感速度の向上も保ったまま対策ができるので良いかと思います。


### 参考

[javascript - Mobile Safari back button - Stack Overflow](http://stackoverflow.com/questions/11979156/mobile-safari-back-button])
ruby - attr_accessorで定義した属性とその値をto_sとかinspectで全部出したい

属性名の配列をクラス変数に持って、それを使って属性と値を出力してるんだけど
クラス毎に同じようなことを毎回書くのもイヤな感じだし
なにかうまい方法はないかなあ


```rb
class Employee
  @@attrs = :id, :name, :birthday
  
  attr_accessor *@@attrs
  
  def inspect
    attrs = @@attrs.map{ |a| "#{a}=#{send(a)}" }.join(',')
    "#<#{self.class.name}:#{attrs}>"
  end
end
```

```rb
require 'date'

e = Employee.new
e.id = 123
e.name = 'hoge'
e.birthday = Date.new(1960, 12, 31)

p e # => #<Employee:id=123,name=hoge,birthday=1960-12-31>
```
ウィンドウをリサイズしたり、違う端末からアタッチして tmux の表示が狂ったとき

# 状況
こんなとき…
![Screen Shot 2015-06-22 at 18.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/14941/c34e639e-d3e8-7032-0894-80c202628fd3.png)

# 直しかた
以下を入力して、ほかの端末をデタッチすれば直ります。
![Screen Shot 2015-06-22 at 18.37.24.png](https://qiita-image-store.s3.amazonaws.com/0/14941/8073b6c3-2c4a-ed98-cc5c-598a3ee253a4.png)


その場で `C-b` `:a -d ` です。(C-b は prefix キー、 ctrl 押しながら b 押下)


tmux 1.9a で確認済。


# 参考

[linux - Maximize window in tmux - Super User](http://superuser.com/questions/300251/maximize-window-in-tmux)
<sub>上で`:attach -d` と紹介されていますが、 `:a -d` でも効くことを発見したので書いてみました。</sub>
Rails tutorial 第３章

#### rails generateしたときに、```undefined method Application' for Rails:Module (NoMethodError)```とエラーが出る件。

Windows版だとrails installerを使ってインストールするので、rails newする時に毎回バージョン指定が必要。
参考
-http://qiita.com/gakuo/items/4a38765f62385af442e9

#### サーバーにアクセスすると"ExecJS::ProgramError TypeError"と表示される。
これもWindows特有のエラーらしい。
coffee-script-sourceのモジュールバージョンを落とす。
参考
-http://www.oiax.jp/books/rails3book/coffee-script-type-error.html

### RailsをIDEで開発
Apatana Studioが推奨らしい。

Aptana Studio本体のインストールではRubyの開発環境が入ってないので、以下を参照して追加インストール。
- http://www.rubylife.jp/aptana/ruby/index4.html
CTRL+SHIFT+Tとか使えなくて余りIDEにする利便性を感じない・・・・

### IDE上からRun Serverしようとするとコケる。
IDEは./script/railsというコマンドがあることを想定しているが、実際は./bin/railsにコマンドがあるため。
IDEの設定が変更できないため、scriptフォルダを作成して、binフォルダの内容を丸コピするしかない。
-http://stackoverflow.com/questions/19704541/rails-4-0-project-not-starting-through-aptana-studio-3

### Aptana Studioでデバッグ
-http://doruby.kbmj.com/nakahira_on_rails/20080313/aptana_rails_
を参考にするも、```gem install ruby-debug-base```でコケる。
調べると、依存モジュールのうち、linecacheというモジュールがRuby1.9以上をサポートしていないらしい。。

-http://stackoverflow.com/questions/24347956/cant-handle-1-9-x-error-when-trying-to-install-linecache-with-ruby-2-1-1

Rubyの複数バージョンの共存はWindowsでは面倒くさそうなのでとりあえずスキップする。

### 余談
全般的にRailsやRuby開発者はIDEをほとんど使わない印象。
メンテナンスされてない上に機能がしょぼい。
コーディングルールについて


#目的と目次
複数で案件を制作する場合品質を揃えるため、また会社内で引き継ぎを行う場合、ルールを決めていると作業時に混乱が少なくなります。
現在の作成時のルールを交えながらこんなルールで行っているよ。
こんなルールでやるといいかもという記事をまとめます。

・ディレクトリ構成
・HTMLとCSSの書き分け
・クラス名、ID名の指定


##ディレクトリ構成
フォルダ内のファイルの収納箇所を統一しておくことで引き継ぎを行ったあとでも亜る程度のフォルダ内になにが収納されているかが予想できて作業の速度をファイルを探すことで落とすことがなくなります。
現在、制作を行う中での基本的なディレクトリ構成は下図のような感じです。
* * *
![スクリーンショット 2015-06-22 17.47.47.png](https://qiita-image-store.s3.amazonaws.com/0/82963/83476f7c-dbd6-3b7c-44c9-121377354b32.png)
* * *
html以外は[assets]フォルダに収納するようにしています。
ちなみに
初めてHP制作の会社で働いていた時は下図のような感じでした。
* * *
![スクリーンショット 2015-06-22 17.59.09.png](https://qiita-image-store.s3.amazonaws.com/0/82963/7204e331-6e50-1c25-b1f1-510a0497c5cc.png)
* * *
そのほかには下図のような感じ、
* * *
![スクリーンショット 2015-06-22 21.00.44.png](https://qiita-image-store.s3.amazonaws.com/0/82963/2decc038-2611-6400-7707-68e9a8369d35.png)
* * *
commmon[共通]ではない場合はどうしようという疑問もありましたがこういうディレクトリ構成の時もありました。

[assets]フォルダってなんだろう？
Googleで検索するとAndroidのアプリ開発の記事が引っかかりました。

[[android] rawとassetsの使い分け](http://www.uni-labo.com/blog/2011/08/12/android-raw%E3%81%A8assets%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/)
[鈍足ランナーのＩＴ日記](http://www.uni-labo.com/blog/2011/08/12/android-raw%E3%81%A8assets%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/)
↑[assets 意味]で検索した時に鈍足ライナーさんの記事が上位に来ました。皆さん気になっているみたいですね。

まだまだ調べたりないとは思いますが現在のディレクトリ構成になったのは、アプリ・システム開発も行なっているからだろうと思います。


##HTMLとCSSの書き分け
HTMLにCSSを直書きできるけどHTMLとCSSを分けて書く目的ってなんですか？
引き継ぎや人に教えている時によく聞かれた質問です。

【HTMLにCSSを直書きすることでのメリット】
・CSSファイルを作成せずにhtmlのレイアウトができる
・ページ数が少ない時にはほかページと共通で利用する必要がないので直書きしてもあまり問題ない。
・比較的早く制作ができる？（これはすこし疑問、、）

【HTMLにCSSを直書きすることでのデメリット】
・ソース量が増える。
・複数のページ数があるサイトを作成する時メンテナンスが困難
・見栄えが悪い

そのほか参考サイト
[CSS直書きのメリット・デメリット](https://teratail.com/questions/4394)
[CSSの使い方の区分けについて教えてください](http://q.hatena.ne.jp/1227539167)

ほか記事では
[具体的な内容（Contents）と文書の構造（Structure）はHTMLに、見せ方（Presentation）はCSSに、振る舞い（Behavir）はJavascriptに、それぞれ別ファイルとして分離する。](http://www.d-spica.com/document/coding-regulation.html)
といった基本方針を持ったところもあります。
この言葉一番わかりやすく説明できる一文だなと思って文章にリンクを貼りました。

現在の私の制作現場でもHTMLへCSSの直書きは引き継ぎを行う上で不効率のため極力しないよう努めています。

##クラス名、ID名の指定

昔のクラス名の指定の書き方は特に意識をしていなかったので

```lang:HTML
<div class="ma-10">
  <p class="p-01">これはテストです。</p>
  <p class="p02">これはテスト２です。</p>
</div>
```
といった具合に書いていました。

他人がこれを見た時、pダグのクラスにはどんな指定が書かれているのかパッとみわかりません。
クラスの指定にはある程度の目的がわかる名前をつけると自分でも制作をする上で整理できたりします。

目的がわかるクラス名って何？と思うかもしれません。
私にもわかりません。とりあえず`class="p-01"`といったクラス名はやめましょう。

html/cssの命名規則（BEM）というのがあります。
一回記事を読むとなんとなくわかります。
[少し細かいBEMい話](http://qiita.com/hiloki@github/items/4fa99b8755a22878449e)

それ以外にも大手企業の規約をリンクしておきます。

[「Google HTML/CSS Style Guide」を適当に和訳してみた](http://re-dzine.net/2012/05/google-htmlcss-style-guide/)
Fedora21 に Apache2.4+PHP5.5 をyumでInstallする


はじめに
=========

なんて、初歩的なエントリーだろう、と思いつつ、これをやるのに2日近くかかったという罠・・・
Dockerで Fedora21 + Apache2.4 + PHP5.5 を入れたメモです。

メモ
========

```Dockerfile
FROM fedora:21

...

# Install PHP5.5 and Apache2.4
RUN curl https://copr.fedoraproject.org/coprs/rhscl/php55/repo/epel-7/rhscl-php55-epel-7.repo > /etc/yum.repos.d/rhscl-php55-epel-7.repo
RUN curl https://copr.fedoraproject.org/coprs/rhscl/httpd24/repo/epel-7/rhscl-httpd24-epel-7.repo > /etc/yum.repos.d/rhscl-httpd24-epel-7.repo
RUN yum install -y php55 php55-php php55-php-devel
```

以上、たった3行。。。

`/opt/rh/{php55,httpd24}` 以下に色々Installされます。

CentOSでも似たような感じでできるような気がする。
floatについて

fioat:ボックスの回り込み位置を指定する。

{float:回り込み位置;}
＜回り込み位置＞
none　回り込みを指定しない
left　　ボックスを左寄せにする、その後に続く要素は右側に回りこむ
right　 ボックスを右寄せにする、その後に続く要素は左側に回りこむ

http://www.htmq.com/style/float.shtml

今回、HPのサンプル作成の為に以下の様に配置しました。
↓一部

```lang:html
<div class="main1">
			<div class="main2">
				<img src="img/top_m1.jpg" alt=ビル style="border:solid 3px #ebebeb">
				<div class="box2">
					<p>自然との調和を目指す企業です</p>
					<p>ホームページサンプル株式会社では最新技術と自然との調和を目指します。革新的な技術で世の中を動かす企業を目指します。</p>
					<div class="box2-1">
						<p>詳細を確認する</p>
					</div>
				</div>
			</div>
			<div class="main3">
				<img src="img/top_m2.jpg" alt=PC style="border:solid 3px #ebebeb">
				<div class="box3">
					<p>自然との調和を目指す企業です</p>
					<p>ホームページサンプル株式会社では最新技術と自然との調和を目指します。革新的な技術で世の中を動かす企業を目指します。</p>
					<div class="box3-1">
						<p>詳細を確認する</p>
					</div>
				</div>
			</div>
			<div class="main4">
				<img src="img/top_m3.jpg" alt=PC2 style="border:solid 3px #ebebeb">
				<div class="box4">
					<p>自然との調和を目指す企業です</p>
					<p>ホームページサンプル株式会社では最新技術と自然との調和を目指します。革新的な技術で世の中を動かす企業を目指します。</p>
					<div class="box4-1">
						<p>詳細を確認する</p>
					</div>
				</div>
			</div>
		</div>
```
```lang:CSS
.main2 {
	float:left;
	border: solid #ebebeb 1px;
	width:280px;
	height:230px;
	padding:10px 0px 0px 10px;
	margin:5px 0px 30px 300px;
}
.box2{
	width:270px;
	margin:10px 0px 0px 7px;
	font-size:12px;
	line-height:100%;
}
.box2-1{
	margin:5px 8px 0px 170px;
	color:#83c61a;
}
.main3 {
	float:left;
	border: solid #ebebeb 1px;
	width:280px;
	height:230px;
	padding:10px 0px 0px 10px;
	margin:5px 0px 30px 25px;
}
.box3{
	width:270px;
	margin:10px 0px 0px 7px;
	font-size:12px;
	line-height:100%;
}
.box3-1{
	margin:5px 8px 0px 170px;
	color:#83c61a;
}
.main4{
	float:left;
	border: solid #ebebeb 1px;
	width:280px;
	height:230px;
	padding:10px 0px 0px 10px;
	margin:5px 0px 30px 25px;
}
.box4{
	width:270px;
	margin:10px 0px 0px 7px;
	font-size:12px;
	line-height:100%;
}
.box4-1{
	margin:5px 8px 0px 170px;
	color:#83c61a;
}
UbuntuにGO言語(golang)の最新をapt経由でインストール

Ubuntu(15.04)に最新のGO言語をインストールした際のメモ。

基本的にaptでパッケージ管理したかったので、aptからインストールできるか調べてみた。

```lang:console
$ apt show golfing
#=> 1.3.1
```

なにやら古いバージョンが入っているため、最新のGO言語を非公式に公開しているサイトからリポジトリ追加。

https://launchpad.net/%7Eevarlast/+archive/ubuntu/golang1.4

```lang:console
$ sudo add-apt-repository ppa:evarlast/golang1.4
$ sudo apt-get update
```

あとはインストール。

```lang:console
$ sudo apt-get install golang
```

バージョンの確認

```lang:console
$ go version
#=> go version go1.4.2 linux/amd64
```

入ったっぽい。
Rubyことはじめ

# Rubyことはじめ

## 最初に

- なんとなく読めるけど書けません
- もっといい方法があれば教えてください
- 制御構造はとりあえず後回し
- 追記していきます

## 今、疑問に思っていること

- rubyのシンボルとかってどういう分け方なんだろう

## TODO

- 書いたことに対するコード/スニペット

## Class/Namespace

- classはインスタンスを生成する

```rb
class foo
  :
end
```

- moduleはインスタンスを生成しない
 - staticなメソッドが格納されるスペース？

```rb
module foo
  :
end
```

- module/classはいずれもネームスペース(というよりもスコープ？)を提供する
 - Perlでいうシンボルテーブルの様なもの？
 - 一つずつ定義していかないと上位の階層がないよと怒られる
 - ディレクトリを切る過程でネームスペースを作るのが行儀がいい？
 - => 常に基底クラス(の様なもの)を用意するとか？

```rb
module ModuleA;end
module ModuleA::ModuleB;end
module ModuleA::ModuleB::ModuleC
  class ClassA
    # ...
  end
end
```

- loadとrequireの違い/指定方法
    - あとでかく

## Method

- メソッドの宣言は`def foo`
 - publicとprivateと書けば後続のdef以降がその修飾子のメソッドになる

```rb
def foo
  :
end

public
def bar
  :
end

private
def baz
  :
end
```

- 引数をとる場合は括弧を続けて書く

```rb
def foo(bar)
  :
end
```

- イコール付き引数リストををとる場合は呼び出し方法が違う
    - attr_accessorは下記のシンタクスシュガー

```rb
class Foo
  def bar
    @bar
  end

  def bar=(baz)
    @bar = baz
  end
end

ins = Foo.new
ins.bar = 'abc'
p ins.bar
```

- initilizeはコンストラクタ
    - スコープはprivateなので任意に呼び出すことはできない
- 引数をとらなければ括弧は省略可能

## Vars

- @fooはインスタンス変数
    - インスタンスのクラススコープ内に閉じられた変数(自身と子クラスから以外のアクセス不可)
    - Perlでいうところのレキシカル変数に近い？
- @@fooはクラス変数(ややこしい)
    - クラスから生成された全てのインスタンスで共有される。いわゆるstatic変数
    - Perlでいうところのパッケージ変数に近い？

```rb
    1| #!/usr/bin/env ruby
    2| # coding: utf-8
    3|
    4| class Foo
    5|   def initialize(str)
    6|     @str = str
    7|   end
    8|
    9|   public
   10|   def greet
   11|     hello
   12|   end
   13|
   14|   def setStr2(str)
   15|     @@str2 = str
   16|   end
   17|
   18|   def greet2
   19|     p @@str2
   20|   end
   21|
   22|   private
   23|   def hello
   24|     p "Hello #{@str}!!"
   25|   end
   26| end
   27|
   28| ins1 = Foo.new('Ruby')
   29| ins1.greet
   30| ins1.setStr2('ずっ友だょ')
   31| ins1.greet2
   32|
   33| ins2 = Foo.new('World')
   34| ins2.greet
   35| ins2.greet2
```

### 実行結果

```
$ ruby -x ~/test.rb
"Hello Ruby!!"
"ずっ友だょ"
"Hello World!!"
"ずっ友だょ"
```

- アクセサ/ミューテータを使いたい場合は下記の修飾子で
    - attr_accessor
    - attr_reader
    - attr_writer
- 大文字で始まる変数(シンボル？)は定数

```rb
ABC = 'abc'
p ABC
ABC = '123'
```

### 実行結果

```
$ ruby -x ~/test.rb
"abc"
/path/to/test3.rb:6: warning: already initialized constant ABC
/path/to/test3.rb:4: warning: previous definition of ABC was here
```

## Operator

- あとでかく

## Control Structure

- あとでかく

## Others

- 文字列の結合は `+`
 - 変数展開は `#{expr} `

## Testing

- あとでかく

----

## Memo

```rb
    1| #!/usr/bin/env ruby
    2|
    3| module ModuleA
    4|   module ModuleB
    5|     module ModuleC
    6|       class ClassA
    7|         @str
    8|
    9|         def initialize(str)
   10|           @str = str
   11|         end
   12|
   13|         public
   14|         def greet
   15|           hello
   16|         end
   17|
   18|         private
   19|         def hello
   20|           'Hello ' + @str + '!!'
   21|         end
   22|       end
   23|     end
   24|   end
   25| end
   26|
   27| puts ModuleA::ModuleB::ModuleC::ClassA.new('Ruby').greet
```
MercurialでGit stashと同様の機能(Shelve)を使う


## はじめに
Gitのstashって一時的に変更を退避できてめっちゃ便利ですよね。
しかし大人の都合でGit以外を使わなきゃいけないシーンに直面したりしますよね。ワガママ言ってられないもんです。

というわけで表題にもあるようにstashをMercurial(hg)でも使えるようにします。

## 以前は

Version 2.7までは標準機能ではなかったので以下のExtentionをインストールして使う必要がありました。

https://mercurial.selenic.com/wiki/ThirdPartyShelveExtension

## 現在は

Version 2.8からは本体に取り込まれたので`.hgrc`に記述してあげるだけで利用できるようになりました。


## セットアップ
`.hgrc`の`[extensions]`に設定を追加してあげます。

``` ~/.hgrc
[extensions]
shelve=
```

## 利用方法
### hg shelve

変更を加えたファイルを一時的に退避できます。
`git stash`と同じですね。

```
➜ hg status
M app/controllers/users/sessions_controller.rb

➜ hg shelv
shelved as stg
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

➜ hg status
```

### hg unshelve

shelveしたファイルを戻します。
`git stash pop`と同じですね。 

```
➜ hg status

➜ hg unshelve
unshelving change 'stg'

➜ hg status
M app/controllers/users/sessions_controller.rb

```

## その他
`git stash`と同様に複数のshelveできたり名前付きshelveを作成したりできます。詳しくは本家のドキュメントをご覧くださいな。

https://www.selenic.com/mercurial/hg.1.html#shelve
大量のデータを扱う案件での技術選定。現状のスキルからの考察。

Go
---

メリット
- 超高速。並列処理ができる。今後の武器になる。

デメリット
- 環境構築が大変。開発が大変。学習コストが大きくかかる。
- - -

plalcon
---

メリット
- 高速。PHPで書ける。

デメリット
- 環境構築が多少面倒。学習コストがかかる。

- - -

nodejs
---

メリット
- Fuelphpよりも高速。書くのが楽しい。ライブラリの管理が楽。フロントと言語を統一できる。

デメリット
- 安定性に不安。Mysqlでのバグがないか不安。

- - -

Fuelphp
---

メリット
- まあまあの速度。慣れている。機能的には完成できる。早く作れる。

デメリット
- 他に比べると遅い。今後、使わなくなる可能性が高い。