OmniAICreator/Qiita-1.07M huggingface dataset:
carrierwaveの使い方


## 1. CarrierWaveのインストール

```gemfile
gem "carrierwave"
```

```bash:ターミナル
$ bundle install
```

## 2. アップローダーの生成

```bash:ターミナル
$ rails g uploader Image
create  app/uploaders/image_uploader.rb
```

image_uploader.rbでは、ファイルの保存方法（デフォルトはファイル）、保存パス、ファイルのサイズ、拡張子やファイル名の変換などが変更できる

##(ActiveRecordを使って、アップロードしたファイルの情報を保存する方法)
###例：productモデルにファイル情報を持つ場合
###public/uploads/products配下に保存

Modelにimageフィールド(アップローダーで付けた名前と同じにしなければならない)を追加

```bash:ターミナル
$ rails g migration add_image_to_product image:string
$ rake db:migrate
```

モデルファイルを開き、アップローダーへのマウントする記述を追加

```ruby:app/models/product.rb
class Product < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end
```

新規/編集フォームに画像アップロードの入力フィールドを追加

hidden属性でimage_cacheは、画像を指定したけれども、バリデーションエラーなどにより保存が失敗した場合の画面再表示時などに、画像情報をキャッシュしておくための領域

```:app/views/products/_form.html.erb
<%= form_for(@product) do |f| %>
  <% if @product.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>

      <ul>
      <% @product.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :price %><br>
    <%= f.number_field :price %>
  </div>
  <!-- 追加箇所 開始 -->
  <div class="field">
    <% if @product.image? %>
      <div class="thumbnail">
        <%= image_tag @product.image.url %>
      </div>
    <% end %><br>
    <%= f.label :image %><br>
    <%= f.file_field :image %>
    <%= f.hidden_field :image_cache %>
  </div>
  <div class="field">
    <!-- 既存レコード(DBに保存されている)かつ、画像が存在する場合 -->
    <% if @product.persisted? && @product.image? %>
      <label>
        <%= f.check_box :remove_image %>
        画像を削除
      </label>
    <% end %>
  </div>
  <!-- 追加箇所 終了 -->
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
```

ファイルの属性を更新できるようにするために、StrongParametersに:image, :image_cache, :remove_imageを追加

```ruby:app/controllers/products_controller.rb
def product_params
	params.require(:product).permit(:name, :price, :image, :image_cache, :remove_image)
end
```

詳細画面で表示できるようにする

```app/views/products/show.html.erb
<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @product.name %>
</p>

<p>
  <strong>Price:</strong>
  <%= @product.price %>
</p>

<!-- 追加箇所 開始 -->
<p>
  <strong>Image:</strong>
  <% if @product.image? %>
    <div class="thumbnail">
      <%= image_tag @product.image.url %>
    </div>
  <% end %>
</p>
<!-- 追加箇所 終了 -->

<%= link_to 'Edit', edit_product_path(@product) %> |
<%= link_to 'Back', products_path %>
```

##参照
http://ruby-rails.hatenadiary.com/entry/20141015/1413300088

カスタマイズ
http://ruby-rails.hatenadiary.com/entry/20141022/1413907332
Spock実行後に結果を表示するGradle Taskを作った

※まだMacでしか試せていないです。。。
# やりたいこと
* spock実行後にテスト結果を確認したい
* 勝手にブラウザで開くようにしたい

# ビルドスクリプト

```groovy:build.gradle
task spock(type:Exec, dependsOn:"test") {
    executable 'open'
    args 'build/reports/tests/index.html'
}
```

※「open」のところを、ブラウザのパスにすればOS関係なくなると思います。

# 実行

```shell-session
gradle spock
```
## 処理の流れ
* test実行
* 結果表示(ブラウザで開く)

# 参考
Gradleからのコマンド実行方法
http://sakebook.hatenablog.com/entry/2014/09/03/084456

タスクの依存関係 (6.5節)
http://gradle.monochromeroad.com/docs/userguide/tutorial_using_tasks.html
conoHaのVM、CentOS7にdnvmを設置、helloworldまで。

以下のコマンドで10分強(Mem 1G)

```console

# install dnvm
sudo yum install libunwind unzip node npm
curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
source ~/.dnx/dnvm/dnvm.sh

# installing mono
# do not install original 'sudo yum install mono-devl' on centos install by epel
sudo rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
sudo yum-config-manager --add-repo http://download.mono-project.com/repo/centos/
sudo yum -y install mono-complete

# dnvm upgrade
dnvm upgrade

# installing yoeman and  generator-aspnet
sudo npm install -g yo
sudo npm install -g generator-aspnet

# make project, build project, run project
mkdir tmp
cd tmp
yo
dnu restore
dnu build
dnx run
```

下記のイメージをClickするとyoutube動画に行きます。
レコードツールは、Windows10の「Winキー+G」でやった。
[![youtube video](http://img.youtube.com/vi/kc2ChRzR8Gs/0.jpg)](http://www.youtube.com/watch?v=kc2ChRzR8Gs)

作成された helloworld directoryを、丸ごとWindowsにコピーして、VisualStudioで編集、BuildもOKだった。
PrestoでMySQLのtimestampのような出力が欲しかった

~~一度Qiitaに投稿してみたかった~~
Treasure Data から Presto の結果を MySQL に格納する際に、now() だと 

```
select now()
+-----------------------------+                                                                                                                      
| _col0                       |
+-----------------------------+
| 2016-01-20 06:12:55.359 UTC |
+-----------------------------+
```

みたいな出力になるが、

```
2016-01-20 06:12:55
```

っていう出力が欲しかった(しかもJSTで)ので、ドキュメントとか見てあれこれして

```
date_format(date_add('hour', 9, now()), '%Y-%m-%d %H:%i:%s')
```

こんな感じに落ち着いた
MySQLからリアルタイムで補完のやつ


ありがちなやつです。
備忘録というよりかは作ってみたのでメモ的なやつです。

jQueryの.autocomplete()を使いました。
Googleの検索みたいな感じのを目指しましたが、そんないいものではないです。

名前の検索でひらがな打ったら感じが出てくる的なものを作りたかったが、
とりあえずは、漢字で検索して漢字が出てくる的な感じです。(笑)

入力の手間を省くというだけです。
また補強して載せたいと思います。


```html:index.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome!</title>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
</head>
<body>

<h1>Search Autocomplete</h1>
<form id="searchform" method="post">
<div>
	<label for="search_term">Search name</label>
  	<input type="text" name="search_term" id="search_term" />
    </div>
</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script><script type='text/javascript'>

$(document).ready(function(){
  $("#search_term").keyup(function(e){
    e.preventDefault();
    var search_val = $("#search_term").val();
    $.post("autocomplete.php", {search_term : search_val}, function(data){
      if(data.length>0){
        $("#search_term").autocomplete({
          source: data
        });
      }
    })
  });
});
</script>
</body>
</html>

```



```php:autocomplete.php
<?php
define(HOST, "xxx");
define(USER, "xxx");
define(PW, "xxx");
define(DB, "xxx");

$connect = mysqli_connect(HOST,USER,PW) or die('Could not connect to mysql server.' );
mysqli_select_db($connect,DB) or die('Could not select database.');
mysqli_set_charset($connect, "utf8");

$term = strip_tags(substr($_POST['search_term'],0, 100));
$term = mysqli_real_escape_string($connect,$term);

$sql = "SELECT member_name FROM members where member_name like '%$term%' order by member_name asc";
$result = mysqli_query($connect,$sql);

if(mysqli_num_rows($result) > 0){
  while($row = mysqli_fetch_assoc($result)){
    $string[] = $row['member_name'];
  }
}

$words = array();
foreach($string as $word){
  if(mb_stripos($word, $term) !== FALSE){
    $words[] = $word;
  }
}

header("Content-Type: application/json; charset=utf-8");
echo json_encode($words);

```
【ruby】汉字数字排序


在制作地址系统时，遇到需要将地址的丁目大小从小到大排序显示的问题。由于数据库地址中的丁目信息是按照汉字数字的形式进行储存，而系统并非根据汉字数字所代表的数字大小来进行排序，因此只能通过简单的手动排序来进行处理。

```ruby
  def sort_by_number(array)
    number_char = {
      "零" => 0, "一" => 1, "二" => 2,
      "三" => 3, "四" => 4, "五" => 5,
      "六" => 6, "七" => 7, "八" => 8,
      "九" => 9, "十" => 10
    }
    
    array.sort do |a, b|
      number_char[a[0]] <=> number_char[b[0]]
    end
  end
  
  array = %w(一丁目 四丁目 三丁目 二丁目)
  # => ["一丁目", "四丁目", "三丁目", "二丁目"]
  
  array.sort{ |a, b| a[0] <=> b[0] }
  # => ["一丁目", "三丁目", "二丁目", "四丁目"]
  
  sort_by_number array
  # => ["一丁目", "二丁目", "三丁目", "四丁目"]
```

- TODO: 该算法不支持大小为十以上的汉字数字的排序，等有时间再进行改进。


### UPDATE: 使用Gem ZenTol将汉字转化为数字后进行排序

https://github.com/yoshitsugu/zen_to_i


```Gemfile
gem 'zen_to_i'
```

对上述代码进行简化

```ruby
require 'zen_to_i'

def sort_by_number(array)
  array.sort_by do |str|
    str.zen_to_i.to_i
  end
end

array = %w(一丁目 四丁目 十丁目 十三丁目 二丁目)
#=> ["一丁目", "四丁目", "十丁目", "十三丁目", "二丁目"]
sort_by_number array
#=> ["一丁目", "二丁目", "四丁目", "十丁目", "十三丁目"]
```
Silent Notificationはユーザーの許可を取らなくても送ることが可能である

## 概要

WWDC2015の以下のビデオを見ていて初めて知りました。
https://developer.apple.com/videos/play/wwdc2015-215/

Push通知の仕様のひとつであるSilentNotificationは、

- デフォルトでenable
- ユーザーの許可は必要ない

という仕様であることを知りました。

## 検証

確かに、「設定」Appでアプリの通知全般を完全にOffにしていても

- DeviceTokenの登録は可能
- その状況でPush通知のPayloadから`alert`のkeyを空で送信したらアプリ側では

`UIApplication`の`application:didReceiveRemoteNotification`が反応している
という状況を確認できました。

## 用途

なので、例えばチャットのような仕組みでSilentNotificationを送ってリアルタイムに画面を更新していく、とかの用途でわざわざユーザーに許可画面を出さなくても良いので便利!!!!!
Happy Hacking Keyboard(PD-KB02)をEl Capitanで使用する

愛用してやまないHHKB(初代)のコマンドキーがEl Capitanで使用できなくなってしまったのでメモ。

#経緯
El Capitanの前OSであるYosemiteまではHHKPS2USBDriverという有志が作って頂いたドライバを使って
Mac本体とHHKBをPS2→USBで接続し使用していたが、El Capitanになってからおそらくkernel extensionの問題で
ドライバがうまく動いてくれなくなってしまった。
半ば諦めてYosemiteにバージョンを下げ使用していたが、ある閃きが功を奏して結果コマンドキーが
再び動いてくれるようになったため、全国の初代HHKB信者にご報告したい。

#環境
PC:Mac mini late 2012(El Capitan)
キーボード:Happy Hacking Keyboard(PD-KB02)
接続方法:PS2→USB

#設定
1.KarabinerをMacにインストールする。
　インストール方法は他のサイトに様々な形で記載されているため割愛する。
　ちなみにKarabinerはキーリマップのアプリケーションで任意のキーを別なキーとして
　認識させることができるアプリケーションである。

2.SeilをMacにインストールする。
　インストール方法はこれもまた他のサイトに様々な形で記載されているため割愛する。

3.Seilの設定を以下のスクショの通り設定を行う。
　![Seil.png](https://qiita-image-store.s3.amazonaws.com/0/68442/d15b7c7a-85f6-a9b2-c663-91c138c8031d.png)
 　Enable NFER Key on PC keyboardは「無変換」キーを有効にする設定である。
　Enable XFER Key on PC keyboardは「変換」キーを有効にする設定である。
　おそらく勘の良い人は後はどうすべきなのかわかるはず。。。

4.Karabinerの設定を以下のスクショの通り設定を行う。
　![Karabiner.png](https://qiita-image-store.s3.amazonaws.com/0/68442/95f0d8b6-31f0-0dff-787b-baae7e99e336.png)
　![Karabiner_と__System_Library_CoreServices_Finder_app_Contents_Resources_MyLibraries_myDocuments_cannedSearch_と__System_Library_CoreServices_Finder_app_Contents_Resources_MyLibraries_myDocuments_cannedSearch.png](https://qiita-image-store.s3.amazonaws.com/0/68442/efe87579-0863-d97d-5fcd-6f69b8b1b23b.png)

5.PD-KB02のModeを「3」に設定する。

以上で今まで何の反応も示さなかった左右のコマンドキーがIMEの切り替え等ができるようになる。

#考察
PD-KB02にはPS2で接続した場合、元からコマンドキーとして認識されていないことがキーボードビューワを
見ながら叩いてみて感じていた。「反応していないってことはキーを割り当てれば...」とふと思い
WindowsのJISキーボードを眺めてたらいきなりひらめいた。要は無反応からとりあえず反応させて無理やり
コマンドキーに割り当てるっていう荒業での設定になったが、以前のようにコマンドキーが復活したから
良しとする。

#最後に
全国の初代HHKBユーザの皆様、まだまだPD-KB02は使えますよ！！！

#後日談
先に記載した通り私のMacはMac mini late 2012のため若干起動にもたつきがある(SSDを後付けしたエセFusion Driveだが)
デスクトップ画面が現れた瞬間にコマンドキーを押下してみたが、Karabinerがまだ立ち上がっていなかったために
キーが反応してくれなかった。
おそらくアプリケーションが立ち上がるまでは何の変哲もないただのキーに成り下がった状態のためOSを
再インストールする時やTime Machineからのバックアップをするために「command + R」などの
キーは反応しないと思われる。
対処方法はPD-KB02の場合無いため、代替のキーボードを別途用意する必要がある。
その点、ご留意頂きたい。
DynamoDB CLI の Scan での --page-size とは何か

表題の件が Document( http://docs.aws.amazon.com/cli/latest/reference/dynamodb/scan.html ) に

```
--page-size (integer)
  The size of each page.
```

としか書いておらず。単位が書いていない。

Default 1MB ということなので、下記で試した所、同じような Consumed Capacity になったので、おそらく KiloByte なのだろう。

```
aws dynamodb scan --table-name TABLENAME --page-size 1024 --return-consumed-capacity TOTAL --filter-expression "created_at >= :created_at" --expression-attribute-values '{":created_at":{"N":"1452356100"}}'
```
TCPdumpでサーバー間の通信を見る方法


このサーバーに通信を送ってくるport番号は3306
このサーバーに通信を送ってくるサーバーは172.27.88.12

待ち受け先サーバー

```bash
tcpdump dst port 3306 and src host 172.27.88.12 -i eth1
```


送り先のサーバー(172.27.88.12)

```bash
telnet telnet 172.27.111.212 3306
```

VRRPのパケットの確認方法

```bash
tcpdump -i eth1 vrrp
```
Macでvagrant+VirtualBox+CentOS/Atomic-host+docker+ubuntu環境メモ

タイトルの環境を作る時の手順メモです。

## vagrantを入れる

公式サイトからvagrantを落としてきてインストール

https://www.vagrantup.com


## VirtualBoxを入れる

同じく公式サイトからVirtualBoxを落としてきてインストール

https://www.virtualbox.org


## vagrant initする

以下コマンドでvagrant上でatomic-host起動

```bash
vagrant init centos/atomic-host && vagrant up --provider virtual box
```

## ssh接続してdockerにubuntuのコンテナを作る

vagrat sshして、

```bash
$ vagrant ssh
```

これでatomic-hostにつながるので、
docker pullする。

```bash
[vagrant@localhost ~]$ sudo docker pull ubuntu:latest
```

そしてdockerコンテナ起動する。

```bash
[vagrant@localhost ~]$ sudo docker run -i -t ubuntu:latest /bin/bash
```

あとは必要に応じてVirtualBoxのポートフォワード設定すればいい感じ！
golangのtime.Timeの当日00:00:00を取得する方法とベンチマーク

その日の00:00:00を取得したい場合、ありますよね。

例：2015-10-20 12:12:34 --> 2015-10-20 00:00:00

こんな変換です。

# 各プログラム

使用しているコードを[ushios/benchmark-go-zerodate](https://github.com/ushios/benchmark-go-zerodate)に公開しました。

## 文字列にいちど変換する奴(BenchmarkZeroHourUsingFmt)

http://play.golang.org/p/Rgh2t9wtAh

```go
now := time.Now()
st := fmt.Sprintf("%s 00:00:00 %s", now.Format("2006-01-02"), now.Format("-0700"))
day, _ := time.Parse("2006-01-02 15:04:05 -0700", st)

fmt.Println(day)
```


## ちゃんと計算する奴(BenchmarkZeroHourUsingFormat)

http://play.golang.org/p/rmQJ949RFK

```go
now := time.Now()
nanosecond := time.Duration(now.Nanosecond())
second := time.Duration(now.Second())
minute := time.Duration(now.Minute())
hour := time.Duration(now.Hour())
dur := -1 * (nanosecond + second*time.Second + minute*time.Minute + hour*time.Hour)
day := now.Add(dur)

fmt.Println(day)
```

## @heliac2000 さんのコメントから(BenchmarkZeroHourUsingAdd)

他の処理と合わせるために、time.Time型に変換処理を追加しています。

http://play.golang.org/p/MY1iGNKTcz

```go
now := time.Now()
st := time.Now().Format("2006-01-02 00:00:00 -0700 MST")
day, _ := time.Parse("2006-01-02 15:04:05 -0700 MST", st)

fmt.Println(day)
```


## @spiegel-im-spiegel さんのコメントから(BenchmarkZerHourUnixTime)

> コメントをいただきまして、こちらの方法だと、タイムゾーンの問題でズレが発生するそうで、https://qiita.com/go_sagawa/items/836398020100df486184 の記事をご覧いただけたほうが良さそうです。

http://play.golang.org/p/nBkuBjtjoH

```go
now := time.Now()
ut := now.Unix()
_, offset := now.Zone()
day := time.Unix((ut/86400)*86400-int64(offset), 0)

fmt.Println(day)
```

# ベンチマーク結果

```
BenchmarkZeroHourUsingFmt-8   	 1000000	      1410 ns/op
BenchmarkZeroHourUsingFormat-8	 1000000	      1093 ns/op
BenchmarkZeroHourUsingAdd-8   	10000000	       169 ns/op
BenchmarkZerHourUnixTime-8    	10000000	       120 ns/op
```

@spiegel-im-spiegel さんのUNIXタイムで計算する方法が早そうです。
Slim で一部をまるごとコメントアウトする方法

[Slim](http://slim-lang.com/) は HTML，XML 向けの Ruby 製テンプレートエンジンです。インデントで階層を表すのが特徴です。

Slim で書いたテンプレートの一部分をまるごとコメントアウトしたいとします。

たとえば，以下のような部分があったとして，これを一時的にまるごと無かったことにしたい。

```slim
#members
  ul.list
    - @items.each do |item|
      li = link_to item.name, item.url
```

やり方は超簡単です。`#members` の前に `/` を付けるだけ：

```slim
/#members
  ul.list
    - @items.each do |item|
      li = link_to item.name, item.url
```

「それがどうした？」と言われそうな簡単な話ですが，これに気づくまでは


```slim
/#members
/  ul.list
/    - @items.each do |item|
/      li = link_to item.name, item.url
```

みたいな無駄なことをしていました。

ついでに，上の例はコメントアウトしたい部分が一つの要素にまとまっていましたが，そうでない場合はどうでしょう。

例えば，

```slim
div なんとか
div かんとか
```

の二要素をコメントアウトしたい。これは例えば

```slim
/
  div なんとか
  div かんとか
```

でできます。
プログラマーの使うテキストエディターは，複数行にわたってインデントを増やしたり減らしたりするのが楽にできるでしょうから，こういうやり方が有効だと思います。
Bashでssh接続時、接続先によってプロンプトの文字色/背景色を変える

#何をしたいのか？
ssh接続先が複数あるとき、
マシンAだと思っていたらマシンBに接続していて、間違ってコマンド実行してしまった！
などのエラーをふせぐために、プロンプトの見た目を変えたい。

#結論
下記のようにシェルスクリプトを作成し、

```bash:ssh-change-prompt.sh
#!/bin/bash

if [[ "$@" == foo ]]; then
  ssh foo -t "export PS1='\[\e[32;40m\]\u@\h \W$\[\e[m\] '; bash --login"
elif [[ "$@" == bar ]]; then
  ssh bar -t "export PS1='\[\e[30;42m\]\u@\h \W$\[\e[m\] '; bash --login"
else
  ssh $@
fi
```

エイリアスを作成したシェルスクリプトに設定する。

```bash
alias ssh=/hoge/fuga/ssh-change-prompt.sh
```

設定後、シェルスクリプト内に設定した接続先へssh接続を行うと、
プロンプトの文字色や背景色が変更されている。


#詳細
##1,プロンプトとは
<img width="370" alt="prompt.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/a46e2da4-3211-bd7b-8788-d3544feaf5bc.png">
これ

ここで表示している内容は、PS1という環境変数で定義されている。
`echo $PS1`
で、内容を確認することができる。
<img width="412" alt="prompt2.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/bf6f0627-559d-73f3-438f-6e048e28fa26.png">

ここで、

| 特殊文字 |　意味 |
|:-----------|------------:|
| \u      | 現在のユーザのユーザ名 |
| \h     |  ホスト名のうち最初の `.' までの部分 |
| \W     |  現在の作業ディレクトリのベース名 |
を意味している。
詳細は
https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbCE
こちらを参考にした。

この環境変数PS1を書き換えることにより、
プロンプトを変更することができる。
##2,ローカルでプロンプトを変える
環境変数PS1を書き換えることで、プロンプトを変更することができる。
ここでは、プロンプトの内容は変えず、文字色や背景色だけを変更する。

```bash
export PS1='\[\e[30;42m\]\u@\h \W$\[\e[m\]' 
```
上記のコマンドで、プロンプトの文字色、背景色を変えることができる。
<img width="639" alt="prompt3.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/eda2e38b-baf1-850b-bfa3-68b7622497aa.png">

色指定時の構文などの詳細については、
http://www.m-bsys.com/linux/echo-color-1
こちらを参考にした。

##3,ssh接続時、リモートマシンにコマンドを渡す
```bash
ssh foo -t "hogecommand'; bash --login"
```
hogecommandを実行した結果をログインシェルとして使い、それを
仮想端末で利用できるようにする。

##4, ssh接続時、接続先によってプロンプトの文字色/背景色を変える
2,3 を組み合わせてシェルスクリプトを作る。

```bash:ssh-change-prompt.sh
#!/bin/bash

if [[ "$@" == foo ]]; then
  ssh foo -t "export PS1='\[\e[32;40m\]\u@\h \W$\[\e[m\] '; bash --login"
elif [[ "$@" == bar ]]; then
  ssh bar -t "export PS1='\[\e[30;42m\]\u@\h \W$\[\e[m\] '; bash --login"
else
  ssh $@
fi
```

接続先fooでは、文字色がGreenで背景がBlack
接続先barでは、文字色がBlackで背景がGreen
となるように設定する。

このシェルスクリプトへエイリアスを設定し、ssh接続先に実行することで、
接続先によってプロンプトの文字色/背景色を変えることができた。


#補足
・リモートマシンの.bash_profileなどにPS1の設定を書いておけば、ローカルでシェルスクリプトを作成したり、エイリアスを設定しなくてもよい。今回この方法で行ったのは、リモートマシンの.bash_profileを変更したくなかったため。
Rails + bootstrap-sass navbar-brand の画像を上下中央に

Rails に bootstrap-sass を導入して、

* ナビゲーションバーの高さを設定
* navbar-brand の画像（高さ32px）を上下中央に設定

下記でいちおううまくいったので、シェアします。

```scss
// assets/stylesheets/application.scss
$navbar-height: 60px;

@import "bootstrap-sprockets";
@import "bootstrap";

// assets/stylesheets/custom.scss
.navbar-brand {
  $brand-height: 32px;
  padding-top: ($navbar-height - $brand-height) / 2;
  padding-bottom: ($navbar-height - $brand-height) / 2;
}
```

```rb
# views/layouts/_header.html.erb
<header class="navbar navbar-default navbar-fixed-top">
    <div class="container">
        <nav>
           <div class="navbar-header">
              <a class="navbar-brand" href="#">
                <%= image_tag "main-logo.png" %>
              </a>
            </div>
```

参考：[http://stackoverflow.com/questions/20435612/overriding-bootstrap-variables-in-rails-with-bootstrap-sass-gem](http://stackoverflow.com/questions/20435612/overriding-bootstrap-variables-in-rails-with-bootstrap-sass-gem)
GitHub で一旦 merge された Pull Request が revert されたあと一連の commits を適用し直す

Big Sky :: 意外と知られていない github 技
http://mattn.kaoriya.net/software/git/20121225171742.htm

↑に書いてある通りだが、

- Pull Request の内容を patch ファイル形式でダウンロードする（URL の末尾に `.patch` をつければ ok）
- `git am FILE` でコミットを適用しなおす

で ok。

ダウンロードできる patch ファイルはちゃんと各コミットが独立するようになっているのでそのまま適用して ok（PR の diff が丸ごと一コミットにはならない）

```
$ curl -sL https://patch-diff.githubusercontent.com/raw/kyanny/ghn/pull/36.patch | git am -
```
【htaccess】複数のファイルにBasic認証（htaccess）を設定する

複数のファイルにBasic認証を設定する方法です。
.htaccessファイルと.htpasswdの2つのファイルを用意します。
ローカル上でおそらく上記の名称に設定はできないと思いますので、
ローカル上ではhtaccess.txtなどテキスト形式にしておき、アップロードした後にリネームします。
.htaccessファイルは下記のように記述します。

```text:.htaccess
<Files xxx.html>
AuthUserFile /home/xxxx/.htpasswd
AuthType Basic
AuthName "Web access"
Require valid-user
</Files>

<Files xxx.html>
AuthUserFile /home/xxxx/.htpasswd
AuthType Basic
AuthName "Web access"
Require valid-user
</Files>
```

`<Files xxx.html>`の`xxx.html`はBasic認証を設定したいファイルに適宜変更。
.htaccessを設置するディレクトリからのパスを記述してください。

`AuthUserFile /home/xxxx/.htpasswd`に関しても適宜変更してください。
こちらは、.htpasswdのパスを記述してください。
上記の場合は2つのファイルに対して認証を設定しています。
同じhtpasswdを参照しているので、同じIDとパスワードになります。
ファイルごとに別々のIDとパスワードに設定したい場合は、
`.htpasswd2`など別のファイルを作成してそちらのパスを指定してください。


.htpasswdには下記ように認証画面で入力するIDとパスワードを記入します。
パスワードに関しては、暗号化して記述します。
「[htpasswd用パス作成ツール](http://phpspot.net/php/pghtpasswd%E7%94%A8%E3%83%91%E3%82%B9%E4%BD%9C%E6%88%90%E3%83%84%E3%83%BC%E3%83%AB.html)」のサイトで暗号化できます。
下記はIDを`test`にパスワードを`1234`に設定し暗号化したときの記述例です。

```text:.htpasswd
test:3f6CcU7JTBNt2
```
GoogleMapで複数ポイントを出し方

GoogleMapで複数ポイントを出しクリックするとWindowがでるやり方。

GoogleDeveloperサイトより、修正しました。
単品のサンプルしかなかったので、複数試してみました。（どっかあるのかな・・・）
できるか確認なので、本来はループ等使用して使うん感じかなと思う。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Info windows</title>
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #map {
        height: 100%;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>

// This example displays a marker at the center of Australia.
// When the user clicks the marker, an info window opens.

function initMap() {
  var uluru = {lat: -25.363, lng: 131.044};
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 4,
    center: uluru
  });

  var contentString = '<div id="content">'+
      '<div id="siteNotice">'+
      '</div>'+
      '<h1 id="firstHeading" class="firstHeading">Uluru</h1>'+
      '<div id="bodyContent">'+
      '<p><b>Uluru</b>, also referred to as <b>Ayers Rock</b>, is a large ' +
      'sandstone rock formation in the southern part of the '+
      'Northern Territory, central Australia. It lies 335&#160;km (208&#160;mi) '+
      'south west of the nearest large town, Alice Springs; 450&#160;km '+
      '(280&#160;mi) by road. Kata Tjuta and Uluru are the two major '+
      'features of the Uluru - Kata Tjuta National Park. Uluru is '+
      'sacred to the Pitjantjatjara and Yankunytjatjara, the '+
      'Aboriginal people of the area. It has many springs, waterholes, '+
      'rock caves and ancient paintings. Uluru is listed as a World '+
      'Heritage Site.</p>'+
      '<p>Attribution: Uluru, <a href="https://en.wikipedia.org/w/index.php?title=Uluru&oldid=297882194">'+
      'https://en.wikipedia.org/w/index.php?title=Uluru</a> '+
      '(last visited June 22, 2009).</p>'+
      '</div>'+
      '</div>';

  var infowindow = new google.maps.InfoWindow({
    content: contentString
  });

  var marker = new google.maps.Marker({
    position: uluru,
    map: map,
    title: 'Uluru (Ayers Rock)'
  });
  marker.addListener('click', function() {
    infowindow.open(map, marker);
  });

  var marker2 = new google.maps.Marker({
    position: {lat: -25.300, lng: 131.044},
    map: map,
    title: 'Uluru (Ayers Rock)'
  });
  marker2.addListener('click', function() {
    infowindow.open(map, marker2);
  });

}

    </script>
    <script async defer
        src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY&signed_in=true&callback=initMap"></script>
  </body>
</html>


```
Bitvectorの使用: x10編

大規模なデータを高速かつ低メモリ使用量で扱うために、bitvectorがよく使われている。
今回は、自分のコードを修正するにあたって、初めて使って見たので、ポスティングする。

bitvectorの実現方法って色々あるらしいが、今回は [kw bits](https://en.wikipedia.org/wiki/Bit_array)というものを実装した。


#概念
まず、bitvectorが何かを説明すると、これはbitarrayとも呼ばれ、通常integer、booleanなどprimitive typeで
表していたものを、bit単位でインパクとに格納するデータ構造である。
(ps: この概念はあくまでは自分でまとめたものでどれまであっているかは自身がない ^_^)

例えば、ある購買サイトの顧客(顧客数: n)がプレミアム会員か否かの情報を扱うとする。この時、普段はbooleanやintegerのarrayで表すことだが、bitvectorはこれらの情報bit単位で表そうとする。つまり、あるinteger(x10の場合32bits)の変数において、32人の情報を扱うことができ、i番目のbit値が 0 か 1 によってi番目のプレミアム会員か否かが表せる。

なので、x10のinteger型で有無を表す時、**n*32 bits**ほどのメモリが必要だったのが、bitvectorを使うことで、
**(n / 32 + 1 )*32 bits**ぐらいのメモリで上の情報を表すことができる。 

(ps: 実際にはこんな場面で使わないだろうし、[応用面](https://en.wikipedia.org/wiki/Bit_array)として、Linuxのpriority queueや memory page locationなどで使われているらいが、今回は分かりやすくするため、こんないいかけんな例を挙げる。)

#実装
bitvectorを使う場合、主な操作はあるか否かの判定操作と値の設定操作になる。

上の例で、顧客数が130人で、integer型を使って情報を扱うとする。すると、**サイズ*5*のinteger型 array**で扱うことができる**(130/32+1=5)**。

`val A = new Array[int](5, 0);`

この場合、i番目の人の情報は、**`index=i/32, bitpos=i%32`**により、A[index]のbitpos番目の位置に格納されているのが明らかになる。なので、結局判定と設定操作は以下の２つのbit演算で計算できる。

1.判定 
`V = A[index] & (1 << (bitpos-1))` 
   - V = 0  (bitpos目の値 0)
   - V > 0  (bitpos目の値 1)
2.設定
`V = A[index] | (1 << (bitpos-1))`
    - bitpos目の値を1にする

#ソースコード

```X10:bit_sample.x10
import x10.util.*;
public class bit_sample {
	public static def main(args: Array[String]) {   
		val n = 130;
		val rnd = new Random();
		val info = new Array[int](n/32+1, (i:int)=>rnd.nextInt());

		//operate the 10th value
		val i = 10; 
		val index  = i / 32;
		val bitpos = i % 32 - 1;

		//Check value
		Console.OUT.println("Bit value(10) = " + (info(index)&(1<<bitpos)));
		//Set value
		if ((info(index)&(1<<bitpos))==0) {
			if ((info(index)|(1<<bitpos)) != info(index)) 
				Console.OUT.println("Bit value be setted! ");
			else 
				Console.OUT.println("Bit value not be setted! ");
		}
	}
}
```
VM上のUbuntu14.04でUSBヘッドセットの優先順位を上げる

VM上のUbuntuにてJuliusを使うときには，標準では0番目のサウンドデバイスのマイクを利用する設定になっている．
大抵は，USB接続のヘッドセットマイクをPCに接続して音声認識をさせるが，このUSBヘッドセットを優先順位トップ（0番）にする設定がなかなかハマり込むので，ここにまとめる．

# 1. VMへのUSBオーディオの接続
まず，VM自体にUSBヘッドセットが接続されている必要がある．
（PCにUSBヘッドセットを接続し，なおかつ，ホストOSではなくVMに認識させる必要がある）

図01にあるように，MVPlayerのメニューから，「取り外し可能デバイス」をたどり，目的のUSBヘッドセットにチェックが付いているか確認する．チェックがついていなければ，その中の「接続（ホストから切断）」を選ぶ．

![VM1.PNG](https://qiita-image-store.s3.amazonaws.com/0/79509/8e3852e1-b80b-1a98-57c4-a49160da295f.png)
図01：サウンドデバイス選択

**※新たに接続設定にした場合には，VM上のOSを再起動させておくこと．**


# 2. サウンドデバイスの名前と順序の確認
以下のコマンドでサウンドデバイスの名前と順序を確認する．
`$ cat /proc/asound/modules`

![modules.PNG](https://qiita-image-store.s3.amazonaws.com/0/79509/9a14a458-a907-606f-3240-2d47236bedac.png)
図02：サウンドデバイスの順序確認

上記のように表示される．
図02の例では，既にUSBオーディオがトップ（0番目）に来ている．

ここで表示される名前を，次の項目の設定に使う．


# 3. サウンドデバイス順序の変更設定
alsa-base.confに設定を**追記**する．
`$ sudo nano /etc/modprobe.d/alsa-base.conf`
(エディタにnanoを用いているが，geditでも，emacsでも，vimでも，viでもOK)

ファイルの末尾に，以下の設定を追記．

```
options snd slots=snd_usb_audio,snd_ens1371 # (上記で表示させたデバイスを列挙する)
options snd_usb_audio index=0
options snd_ens1371 index=1
```

保存(nanoなら，C-x Y)して，VM上のOSを再起動させる．
`$ sudo reboot`

# 4. 確認
再起動後，サウンドデバイスを表示させて確認する．
`$ cat /proc/asound/modules`

![modules.PNG](https://qiita-image-store.s3.amazonaws.com/0/79509/be2fd30d-5b26-939d-8986-425d894938e1.png)
図03：サウンドデバイス確認

# 5. 注意事項
VM起動時にUSBオーディオが**VMに接続**されていないといけません．新たにVMを起動する際には注意してください．
Pygame on Windows 64 bit

pygame を Windows8.1 64bit 版にセットアップした時のメモ。
結論から書くと、Python 32bit 版をインストールする必要があるのがミソ。

# Python のインストール
pygame は、32bit 版の python でないとうまく動作しないらしいので、32bit 版をダウンロード。バージョン 3.4.4 でうまく動作することを確認した。
[Windows x86 MSI installer](https://www.python.org/downloads/windows/ "download")

環境変数 Path に、以下を追加する。
~~~
C:\Python34;C:\Python34\Scripts
~~~


# pygame のダウンロード
[pygame-1.9.2a0-cp34-none-win32.whl](http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame "download")


# pygame のインストール
~~~
> pip install pygame-1.9.2a0-cp34-none-win32.whl
~~~
sqlplus の SET AUTOTRACE TRACEONLY は トレースオンリーじゃなくてトランザクションが実行されてしまう。

表題の通り、sqlplus の SET AUTOTRACE TRACEONLY はトレースオンリーじゃなくてトランザクションが実行されていまいます。

```sql:autotrace.sql
SQL> CREATE TABLE TBL_A(C1 NUMBER);

Table created.

SQL> SELECT COUNT(*) FROM TBL_A;

  COUNT(*)
----------
         0

SQL> SET AUTOTRACE TRACEONLY; ★SET AUTOTRACE TRACEONLYを設定

SQL> INSERT INTO TBL_A SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 100; ★INSERT ～ SELECT文を実行

100 rows created.


Execution Plan
----------------------------------------------------------
Plan hash value: 1236776825

-------------------------------------------------------------------------------
| Id  | Operation                     | Name  | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | INSERT STATEMENT              |       |     1 |     2   (0)| 00:00:01 |
|   1 |  LOAD TABLE CONVENTIONAL      | TBL_A |       |            |          |
|*  2 |   CONNECT BY WITHOUT FILTERING|       |       |            |          |
|   3 |    FAST DUAL                  |       |     1 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(LEVEL<=100)


Statistics
----------------------------------------------------------
          4  recursive calls
         29  db block gets
          9  consistent gets
          0  physical reads
       2908  redo size
        833  bytes sent via SQL*Net to client
        816  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          3  sorts (memory)
          0  sorts (disk)
        100  rows processed

SQL> COMMIT;

Commit complete.

SQL> SET AUTOTRACE OFF;
SQL> SELECT COUNT(*) FROM TBL_A;

  COUNT(*)
----------
       100 ★テーブルにレコードが挿入されている。

SQL>
```

「SET AUTOTRACE TRACEONLY」はあくまで SQL*Plus の表示上の問題で、
実行する SQL文の意味合いが変わる訳ではないんやで 彡(ﾟ)(ﾟ)

SQL*Plus の マニュアルもどうぞ。
> SQL*Plus ユーザーズ・ガイドおよびリファレンス
> リリース11.2 B56314-03
> SET AUTOTRACE
> http://docs.oracle.com/cd/E16338_01/server.112/b56314/ch_twelve040.htm#i2698680
Swift2のnil判定系まとめ


```swift:nil判定
if hogekana != nil {
 do(hogekana!)
}
```

```swift:iflet
if let hoge = hogekana {
 do(hoge)
}
```

```swift:変数宣言無しiflet
if let _ = hogekana {
 do(hogekana!)
}
```

```swift:guard
guard let hoge = hogekana else {return}
do(hoge)
```

```swift:変数宣言無しguard
guard let _ = hogekana else {return}
do(hogekana!)
```

```swift:引数の時点でnilを制限
func action(hoge:String){
 do(hoge)
}
```

```swift:nilだった場合に他の値を代入
do(hogekana ?? hogedayo)
```

```swift:３項演算子でnilだった場合に他の値を代入
do(hogekana != nil ? hogekana! : hogedayo)
```

他にもあるかな
laravelのartisan コマンドで 引数・オプションの新記法まとめ


https://laravel.com/docs/5.1/artisan

## artisanコマンドの新記法

Laravel 5.1くらいから Command クラスに `signature`というプロパティが追加されました。

従来getArgumentsや getOptionsで指定していた複雑な引数、オプションの管理をシンプルに表記できる **独自記法** です。

独自記法ということで若干使用を避けていたのですが、覚えてみると非常に楽だったので、備忘ついでに記載しておきます。

## 引数の記述

````
protected $signature = 'email:send {user}';
````

基本の記述はこちら。従来`name`に指定していたコマンドの名前に加えて、`{}`で引数のプレイすホルダを追加すると引数の設定になります。

### オプション引数

`?`をつけると必須でないオプションの引数になります。デフォルト値をセットする際には`=`を利用します。

````
protected $signature = 'email:send {user?}';
````


````
protected $signature = 'email:send {user=foo}';
````

## オプションの記述

オプションは`{--}`で記述します。デフォルトではオプションはフラグ(true or false)として解釈されます。

````
protected $signature = 'email:send {--queue}';
````

### 値を取る引数

値を取る引数は、末尾に`=`をつけて記述します。デフォルト値を続けることも可能です。

````
protected $signature = 'email:send {--queue=}';
````

````
protected $signature = 'email:send {--queue=default}';
````

### long option / short option

`|`記号を用いることで、オプションに省略名を用いる事が出来ます。

````
protected $signature = 'email:send {--Q|queue}';
````

## Description 

ヘルプメッセージ向けの説明メッセージは`:`記号に続けて記述することが出来ます。

````
protected $signature = 'email:send
                        {user : The ID of the user}
                        {--queue= : Whether the job should be queued}';
````
[Mac]MacにおけるCPUの型番を確認

Windowsとかだとシステムのところから見られるCPUの型番ですが、Macだとざっくりとしか書いてません。
てことで調べてみたところ、以下のとおりにすればOK。

```
kotori-no-MacBook-Pro:~ kotori$ sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Intel(R) Core(TM) i7-3635QM CPU @ 2.40GHz
```

こんな感じです。
ウィルスバスター使用時にiCoreServiceのCPU使用率が高まる時の対策

## 概要
* やたらファンの音がすると思ってアクティビティモニタでプロセスを見ると、iCoreServiceなるウィルスバスターforMac(トレンドマイクロ）のプロセスが100%越えてた。（1コアで最大100%、2コアで最大200%）

* ググっても結局はサポートに連絡してね。という記載がおおいので経緯とか対策を書く。

## 詳細
1. サポートに連絡（チャットなど）
2. 1日〜2日営業日位でメールで具体的な対応が届く
3. それに従い現状のウィルスバスターを削除、appをインストール
4. 経過観察。（修正されたか確認→だいたいダメなので「5.」へ）
5. 「2.」で届いた指示に従い、以下URLの対応をする
http://esupport.trendmicro.com/support/vb/solution/ja-jp/1112867.aspx

6. 経過観察。（だいたい治るみたい）

## 最後に。

AdobeのCCXProcessとCCLibraryのとき程ひどいCPU使用率ではないけど、フルスキャンしてるわけでないときに、この使用率はしんどい。

あと「5.」を実施するとHotFixインストーラがでてきてちょっとクスりとくる
<img width="772" alt="スクリーンショット 2016-01-20 12.04.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/93918/f6d5c90a-58d2-d898-08d9-61d802a5bfeb.png">
Mi-Light (limitless led) をRubyから制御する

ここ最近HueやMi-Lightなどの無線LAN経由で制御できるLEDランプが増えてきた。
とりわけMi-Lightが価格面でお手頃感があるので遊んだメモ。

# Mi-Lightについて
> 未来のライト～Milightシリーズ
> http://item.rakuten.co.jp/illumica/c/0000000205/

楽天ですぐに買えます、Amazonにも有りますが転売だったりして値段が高いです。
フルカラー対応モデルと、白色光源2色タイプ（白～アイボリー）がありそれぞれ対応するリモコンが異なります。
今回はRubyからたたいて遊ぶだけなので、下記の組み合わせで購入

- IT_M001 調光・調色 LED電球フルカラー
- IT_M005 無線LANコントローラ

無線LANコントローラは必須です。また802.11(bgn)環境でしか使えないので注意が必要。
そしてこの製品、中身は LimitlessLED という製品そのものです（おそらくOEM）。
> LED Light Bulbs | LimitlessLED Color WiFi Bulbs For iPhone And Android
> http://www.limitlessled.com/

基本的な機能は以下のとおり。

- LEDのON/OFF
- 明るさの制御（26段階）
- 色の変更（256段階フルカラー）
- プレセットの再生（全8種） 

純正のiPhone APPがありますので、まず動作確認はこれで行うと良いでしょう。
> LimitlessLED
> https://itunes.apple.com/us/app/limitlessled/id594759938?mt=8
> (Mi-light純正のものも有りますが、無線LANコントローラのIPアドレスが見れないためこちらを使う）

コミュニティが活発で各言語向けのライブラリーなども作られてます。
最近はNode.jsからも制御できるようになったので使い幅があって◎。

# 基本的な使い方
Mi-LightはLED単体では使えません。専用のリモコンか無線LANコントローラとペアリングして使います。
プログラムやiPhone APPから制御する場合は、無線LANコントローラに命令を送ると実行される仕組みです。
> [ Script / iPhone APP ]  >>> Wifi経由 / UDP >>> [ 無線LANコントローラ ]  >>> 何かしらのプロトコル >>> LEDランプ

# 制御の基本
ScriptからMi-Lightを制御するには、無線LANコントローラの UDP/8899 に3バイトの命令を投げれば良いです。
命令については下記をよく見ること。
> LED Light Bulbs | LimitlessLED Color WiFi Bulbs For iPhone And Android
> http://www.limitlessled.com/dev/
> 色の扱いに若干癖がありますが慣れればOK

Ruby向けには [gem/limitless-led](https://rubygems.org/gems/limitless-led/versions/0.2.1) があるので、これを使えばすぐに制御可能。

```ruby:led-test.rb
require 'limitless_led'

# 基本操作
bridge = LimitlessLed::Bridge.new(host: '無線LANコントローラのIPアドレス', port: 8899)
bridge.all_on   # ペアリングされたすべてのLEDを点灯
bridge.all_off  # ペアリングされたすべてのLEDを消灯
bridge.color(Color::RGB::Red)  # 色情報は Color::RGB オブジェクトで渡す
bridge.brightness(2)   # 明るさ最小
bridge.brightness(27)  # 明るさ最大

# 直接制御も可能
bridge.send_packet "\x40\xB0\x55"   # LEDがREDに

# グループの個別制御も可能
group = bridge.group(1) 
group.color(Color::RGB::Blue)
group.brightness(2)

# 16進色コードからの変換
# LEDの都合、色相256段階でのみ制御となるため注意が必要、くすんだ色などは指定できませ
# 一度RGBからHSLに変換し、その後戻してあげればOK
color_rgb = Color::RGB.from_html(FF0000)  # RED
color_hsl = color_rgb.to_hsl
color_hsl.s = 0.5  # 彩度
color_hsl.l = 0.5  # 輝度は共にニュートラルに
bridge.color(color_hsl.to_rgb)
```

あとは煮るなり焼くなり。

# 色の扱いについて
色相256段階となっているので、普通の256色とは異なります。
対応は下記の通り

> 0x00 (0xFF) Violet
> 0x10 Royal_Blue
> 0x20 Baby_Blue
> 0x30 Aqua
> 0x40 Mint
> 0x50 Seafoam_Green
> 0x60 Green
> 0x70 Lime_Green
> 0x80 Yellow
> 0x90 Yellow_Orange
> 0xA0 Orange
> 0xB0 Red
> 0xC0 Pink
> 0xD0 Fusia
> 0xE0 Lilac
> 0xF0 Lavendar
> http://www.limitlessled.com/dev/

0x00と0xFFが紫となる色相環です。
上記コードのように一度HSLにしたColorオブジェクトを投げればよしなに変換されます。
`get_tagged_response': Unknown command xxxxx (Net::IMAP::BadResponseError)

```
/home/foo/.rbenv/versions/2.2.3/lib/ruby/2.2.0/net/imap.rb:1173:in `get_tagged_response': Unknown command 140mb299362299iou (Net::IMAP::BadResponseError)
```

gmail gemを使ってXOAUTHでgmailにアクセスしてる時にアクセストークンが期限切れだとこのエラーになる
Terraform で AWS の Billing Alert（請求アラート） を設定する


AWS にアカウントを作った時は Billing Alert を設定したいですが、下記のような３段階で設定しているので結構めんどくさいです。

1. 月はじめに必ず通知される程度の金額（1 USD）
2. 予想する請求額
3. ↑の3倍ぐらいの金額

ので、Terraform で一撃で Billing Alert を設定するようにしました。

```js
provider "aws" {
    alias = "us-east-1"
    region = "us-east-1"
}

variable "billing_name" {
    default = "ore no billing"
}

variable "billing_threshold" {
    default = [
        1,
        10,
        100,
    ]
}

resource "aws_sns_topic" "billing" {
    provider = "aws.us-east-1"
    name = "BillingAlarm"
}

resource "aws_cloudwatch_metric_alarm" "billing" {
    provider = "aws.us-east-1"
    alarm_name = "${var.billing_name} lv.${count.index + 1} (${var.billing_threshold[count.index]} USD)"
    namespace = "AWS/Billing"
    metric_name = "EstimatedCharges"
    statistic = "Maximum"
    evaluation_periods = "1"
    comparison_operator = "GreaterThanOrEqualToThreshold"
    period = "21600"
    threshold = "${var.billing_threshold[count.index]}"
    dimensions { "Currency" = "USD" }
    alarm_description= "Total Charge ${var.billing_threshold[count.index]} USD"
    alarm_actions = [ "${aws_sns_topic.billing.arn}" ]
    count = "${length(var.billing_threshold)}"
}
```

- `provider` で `region` に `us-east-1` を指定する
    - Billing Alert は `us-east-1` リージョンじゃないとだめ
    - 他のリソースは `ap-northeast-1` なので `us-east-1` でエイリアス
- `billing_name` でアラームの名前を指定する
    - メールの件名に含まれたりするのでわかりやすい名前をつける
- `billing_threshold` は通知する金額のしきい値（USD）
    - リストで複数指定する

アラームは `BillingAlarm` という SNS トピックに通知されます。

このトピックからメールで通知しているようにしているのですが、トピックへのメールアドレスのサブスクライブは手作業で行っています。Terraform では SNS トピックへのメールアドレスのサブスクライブはできないためです。

- [AWS: sns_topic_subscription - Terraform by HashiCorp](https://www.terraform.io/docs/providers/aws/r/sns_topic_subscription.html)

Lambda 経由で Slack とかにした方が良いかも。
Composer でメッセージ

Composer実行しててエラーが出始めた。

```
Warning: This development build of composer is over 30 days old. It is recommended to update it by running "/usr/local/bin/composer self-update" to get the latest version.
```

まぁ更新してないよー系っぽいので言われた通り以下実行して解決。

```
/usr/local/bin/composer self-update
```
リーンキャンバスを理解して使えるようになる

リーンキャンバスはアイデアはあるけど、実際に需要があるのかわからない。。なんて漠然としか想いがある人向けの企画ツール

こちらのスライドが一番わかりやすくまとめられているので文字起こしして理解を深めてみました。
リーンキャンバスとは http://www.slideshare.net/studytech/ss-23454300


## 具体的な流れ
アイデアを以下の9種類の要素で整理する
* 顧客
* 課題
* UNIQUE VALUE PROPOSTION(UVP)
* 解決策
* 顧客流入元
* 収益の流れ
* 費用構造
* 主要指標
* 競合優位性

どこからでも書けばよいということではなく、上から順番に考えていく。

### 顧客
* ターゲットとなる顧客やユーザーを書く
	* 顧客とはお金を払ってくれる人
	* ユーザーはサービスを使ってくれる人

* アーリーアダプター
	* 自分の考える理想的な顧客の特徴
		* 多くの場合、問題を抱えている
		* 代替手段をもっている

### 課題
* 顧客が抱えている優先度の高い課題を3つ書く
	* 3つ以上書いてはいけない
* 代替手段
	* 上記の課題を解決するために顧客が使用している代替手段を記載する

### UNIQUE VALUE PROPOSTION(UVP)
* 顧客に対する明確な説得力のあるメッセージ
* 顧客が望む結果+明確な期限+それが達成されなかった時の代替案

### HIGH-LEVEL CONCEPT
* 顧客に自分のサービスを最もわかりやすく伝えるためのフレーズ
* 顧客が知っている何かに例える
* 理想的な例: YouTubeはFlickerのvideo版です

### 解決策
* 各課題を解決できる解決策を記載
* 解決策は機能とはかぎらない
* 課題と同じく3つ以上書いてはいけない

### 顧客流入元
* 顧客に提供する際のチャンネルを記載する
* AppStoreやGoogle Play、口コミ、検索エンジンなど

### 収益の流れ
* 収益源を記載する

### 費用構造
* このサービスを提供する上でかかるコスト(固定費と変動費)を記載する

### 主要指標
* このサービスを継続していく上で成長を計測するために注目すべき指標を書く

### 競合優位性
* 他社より優れている要素

## キャンバスは検証が必要
* キャンバスの内容は本当に正しい？
* 趣味ならUVP、課題、解決策、チャンネルを軽く確認
* 仕事なら全てを検証して成功確率を出来るだけ上げる

## 本気で検証したいなら
Running Leanを読もう。
Switchの文字列比較を自作 Objective-C

この記事はXcode7.2を使ってます。

## Objective-Cのswitch構文には文字列の比較ができない。。
例えばこんな感じ

```objc
NSString *test = @"aiueo";
    switch (test) {
        case @"aiueo":
            NSLog(@"ok?");
            break;
            
        default:
            break;
    }
```
2行目のswitch (test)でStatement requires expression of integer type.
とエラー

## プリプロセッサディレクティブを使ってSwitchを自作する

```objc
#define CASE(str) if ([__c__ isEqualToString:(str)])
#define SWITCH(c) for (NSString *__c__=(c);__c__;__c__ = nil)
#define DEFAULT
```
実態はSWITCHという名のfor構文でループさせ、CASEという名のif構文で文字列の比較を
行う。
実際コードを書いてみると

```objc
#define CASE(str) if ([__c__ isEqualToString:(str)])
#define SWITCH(c) for (NSString *__c__=(c);__c__;__c__ = nil)
#define DEFAULT

NSString *str = @"JK";
SWITCH (str) {
    CASE (@"ABCD") {
            NSLog(@"TEST_1");
        break;
    }
    CASE (@"EFJH") {
            NSLog(@"TEST_2");
        break;
    }
    CASE (@"JK") {
            NSLog(@"TEST_3");
        break;
    }
    DEFAULT {
        break;
    }
 }
```
"TEST_3"が出力される。
エラーにならずにうまくできた!

Xcodeのスニペット登録するといいかも
gormでupdated_at（or created_at）な時刻を偽装する

とりあえず２つ。

# タイムスタンプ更新のコールバック関数を変更する

```go
var stubNow time.Time
db.Callback().Update().Register("gorm:update_time_stamp_when_update", func(scope *gorm.Scope) {
	if _, ok := scope.Get("gorm:update_column"); !ok {
		scope.SetColumn("UpdatedAt", func() time.Time {
			return stubNow
		})
	}
})
```

`gorm:update_time_stamp_when_update`を

# UpdatedAtに値を代入する

コールバック関数は参照渡しの時のみ実行されるので、`Sava(&model)`を使用しない。

```go
model = ModelA{
	ID:   100,
	name: "mary",
}
model.UpdatedAt = time.Now().AddDate(0, 0, 1) // Now + 1日にする.

db.Save(&model) // これはUpdatedAtはtime.Now()になってしまう。
db.Model(ModelA{}).Where("id = ?", model.ID).Update(model) // こっちで+1日になる。
```

実際の実行ではないので、コードが動かないと思いますが、こんな感じで実装すれば良いかと思います。
ConsistentHashingGroupによるAkka分散並列処理メモ 

やりたいこと

- keyにより分散並列処理をakkaを使って実現
- 同じkeyに紐づくデータは同じnode, workerで処理させる
 - keyに対するon memory集計処理的なものをしている。
- 集計結果はdb(cassandraに各node, worker上でinsert処理をする。）
- 現在のところ、driver上でfile読み込みして、1 threadで整形して、各node, workerに送っているが、これをmap reduce typeの処理にする。
 - original版のgearpump. plaggerの流れをくむ？tiny map reduce system  

```application.conf
akka {
  actor {
    provider = "akka.cluster.ClusterActorRefProvider"

    deployment {
      /router {
        router = consistent-hashing-group
        //router = round-robin-pool
        routees.paths = [
          "akka.tcp://system@1号:2550/user/workers/w1",
          "akka.tcp://system@1号:2550/user/workers/w2",
          "akka.tcp://system@2号:2550/user/workers/w3",
          "akka.tcp://system@2号:2550/user/workers/w4",
          "akka.tcp://system@3号:2550/user/workers/w5",
          "akka.tcp://system@3号:2550/user/workers/w6",
        ]
        nr-of-instances = 1
      }
      target.nodes = [
        "akka.tcp://system@1号:2550",
        "akka.tcp://system@2号:2550",
        "akka.tcp://system@3号:2550",
      ]
    }
  }

```

```Workers.scala
class Workers extends Actor {
  context.actorOf(Props[Worker], "w1")
  context.actorOf(Props[Worker], "w2")
  context.actorOf(Props[Worker], "w3")
  context.actorOf(Props[Worker], "w4")
  context.actorOf(Props[Worker], "w5")
  context.actorOf(Props[Worker], "w6")

  def receive = {
    case message => {
      println(message)
    }
  }
}

```

```Node.scala
object Node {

  def main(args: Array[String]): Unit = {
    val host = args(0)
    val port = args(1)

    System.setProperty("akka.remote.netty.tcp.hostname", host)
    System.setProperty("akka.remote.netty.tcp.port", port)

    // akka system
    val system = ActorSystem("system")
    system.actorOf(Props[Workers], name="workers")
  }
}
```


```Master.scala
// akka system
    val system = ActorSystem("system")
    val master = system.actorOf(Props[Master], name = "master")

    Cluster(system).subscribe(master, classOf[ClusterDomainEvent])

    // generate routees
    system.actorOf(Props[Workers], name="workers")

    val router = system.actorOf(FromConfig.props(Props[Aggregation]), "router")


.
.
.
.

router.tell(ConsistentHashableEnvelope(Request(data), key), master)

```


# memo

- pathに対応するactorを作るには、くらすをネストするしかない？
 - /user/mappers/m1を作るには、Mappers actorを作ってその中でMapper actorをname=m1で作る必要がある？こんな面倒なことする必要があるか？ for group routerの場合
 -  poolの場合は自動で作ってくれるが、この階層構造も上のような感じ
- workerで落ちても、driverを再起動させれば再度全workerで処理を実施できる。
 - error handling等はかなり先 


https://github.com/rikima/akka_mr
mysqldump 簡易まとめ

# DBまるごとダンプする

```
mysqldump -uuser -ppass db_name > dump.sql
```

# 指定したテーブルをダンプする
データベース名の後ろにテーブルを羅列すれば，それらのテーブルのダンプがとれる

```
mysqldump -uuser -ppass db_name table1 table2 ... > dump.sql
```

# レコードのみダンプする
通常の `mysqldump` を使用すると， `drop table + create table` 文が付いてくる．
それらを除きたい場合は，『`-t`』オプションを付ければいい．

```
mysqldump -uuser -ppass -t db_name table1 > dump.sql
```

# テーブルの構成情報，スキーマだけダンプする
逆に，テーブル生成のSQL文だけ欲しい場合，『`--no-data`』オプションを付ける．
『`-d`』オプションでも可．
意味が分かりやすい『`--no-data`』を使う方がいいだろう．

```
mysqldump -uuser -ppass --no-data db_name table1 > dump.sql
```

# whereで指定したレコードだけダンプする
『`--where(-w)`』オプションを指定すると使える．
テーブルが複数ある場合，すべてのテーブルに対して`where`が適応される．

```
mysqldump -uuser -ppass db_name table1 --where="flag_id = 2" > dump.sql
```
iOSアプリのApp Preview作成手順

とりいそぎ、自分用メモ。

環境：
・Mac 
　OSX Yosemite (10.10.5)
　QuickTime Player 10.4 
　iMovie 10.1
　ffmpeg 2.7.2

・iPhone5S 
　iOS 9.2

App Previewのプロパティ：
・15秒から30秒の間
・サイズ
4インチ用：1136*640 or 640*1136 or 1920*1080 or 1080*1920
5.5インチ用：1920*1080 or 1080*1920
4.7インチ用：1334*750 or 750*1334
　Portrait（縦長）ならこの３種類：1080*1920 と 750*1334 と 640*1136

・ファイルサイズ　500MBまで
・ファイルタイプ　H.264の場合 mov, m4v, mp4
・Bit Rate　H.264の場合 10-12Mbps
・最大Frame Rate　30fps


手順：
0. 録画する内容の台本(?)を書く ３０秒に収まるように

1. MacにiPhoneを接続し、QuickTime Playerを起動
2. 「新規ムービー収録」でiPhoneを操作しているところを表示
3. 赤い丸の隣の小さい三角で 品質：最高を選択　赤い丸の隣の音量設定は最大に
赤い丸を押して収録（台本の通りに）
4. 「ファイル」「書き出す」「1080p」ファイル名指定（ ここでは aaa.mov ) -> 「保存」

5. iMovieを起動
6. 「ファイル」「新規アプリケーションプレビュー」
7. 「ファイル」「メディアを読み込む」->さきほど加工したムービーを選択して読み込む
8. 必要に応じて編集を行う（３０秒以内に収める、サウンドを入れるなど）
9. 「ファイル」「共有」「iTunes」　30秒以内、500MB以内であることを確認して「共有」

10. iTunesを起動
11. 「表示」「ムービー」ホームビデオを選択
12. 対象のムービーを右クリック->「Finderで表示」（ここでは　preview.m4v  とします)

13. ターミナルを起動
14. ffmpegコマンドを実行し preview.m4vを ３種類のResolutionに加工する
ffmpeg -i preview.m4v  -filter:v scale=1080:1920 -c:a copy res_1080_1920.mov
ffmpeg -i preview.m4v  -filter:v scale=750:1334 -c:a copy res_750_1334.mov
ffmpeg -i preview.m4v  -filter:v scale=640:1136 -c:a copy res_640_1136.mov
(ffmpegがなければインストールする。たとえば brew install ffmpeg）

15. Safariを起動して
iTunes connectのアプリ申請ページのScreenShotの欄に　作成したmovファイル群をドラッグする
インストール済みのフォントを利用してシンプルなテキストロゴを作成できるWEBサービス

#非デザイナーのエンジニアにとってWEBサイトのアイコンを作るのって…

インストール済みのフォントでgimpやペイントでガチャガチャ画像作るの面倒くさいですよね。

フリーのフォーマット流用するときとか、透過pngの作り方どうするんだっけー

と毎回ぐぐるのが果てしなく面倒くさいです。

#毎度毎度面倒だったので機能化しました。

[Simple Logo Text](http://logo.take2webservice.pw)

できたてホヤホヤっす。

bg-transmission にチェックを入れると背景透過にできたり、個人的には気に入っています。

よかったら使ってみてください！

そして、「ええやないか！」となったら、適当にシェアしてもらえると嬉しいです！
乱数と√を組み合わせるとどうなるか？

# √：ルート
僕はあまり友達ではないですがルートまたの名を平方根というやつです。学生時代に数学で出てきましたね。

# 乱数と√を組み合わせるとどうなるか？
生成される乱数(0以上1未満)をルートの中に入れると〜

```js
Math.sqrt(Math.random())
```

こういう結果になります。
![sqrt_2.png](https://qiita-image-store.s3.amazonaws.com/0/55103/7f70ffbf-3177-5beb-c5ef-999c857a4c12.png)


乱数で得られる値が大きいときはなめらかに、小さくなると激しくなります。
大きい値の確率が上がり、小さい値の確率が下がる。

「ランダム値ほしいけど、大きい値の確率上げたいな」

というときに使えます。

# どちらかというと演出向け？
どちらかとパーティクルを生成するときなどの演出向けかなと思います。
大体は遠くにいてほしいけどたまに近くにグッと来てほしいなどなど。
【phpMyadmin】セッション時間の設定

デフォルトでは1440秒でセッションが切れてしまうので伸ばしたい場合。
config.inc.phpに以下を追加。単位は秒なので3600は60*60で一時間。

```
$cfg['LoginCookieValidity'] = 3600;
```

config.inc.phpがない場合は、コピーして作る。
phpMyadminのルート下にconfig.sample.inc.phpがあるのでコピーして作る。

```
cp -p config.sample.inc.php config.inc.php
chmod 705 config.inc.php ←下の参照では600になっていたがエラーになり他の記事を参考に705で動いた。
```
[Javaの小枝] DedupMapの実装

# はじめに
少し特殊かもしれないが、かつて Map\<K, V\> にデータを収める際、V の方に「同一性はないが同値性があるものが多数存在する」という状況に遭遇したことがある。その際、重複排除(dedup)を行ないながら格納することによりメモリの節約を行なうというマップの実装を行なったので、メモがてら以下にコードを示す。

# 実装
```Java:DedupMap.java
	public static class DedupMap<K, V> implements Map<K, V> {

        private Map<V, K> reverse = new HashMap<V, K>();
        private Map<K, V> map = new HashMap<K, V>();

        @Override public void clear() {reverse.clear(); map.clear();}
        @Override public boolean containsKey(Object arg0) {return map.containsKey(arg0);}
        @Override public boolean containsValue(Object arg0) {return map.containsValue(arg0);}
        @Override public Set<Entry<K, V>> entrySet() {return map.entrySet();}
        @Override public V get(Object arg0) {return map.get(arg0);}
        @Override public boolean isEmpty() {return map.isEmpty();}
        @Override public Set<K> keySet() {return map.keySet();}
        @Override public int size() {return map.size();}
        @Override public Collection<V> values() {return map.values();}

        private static class NoKeyFoundException extends Exception {}
        private static final NoKeyFoundException noKeyFound = new NoKeyFoundException();
        // 逆引きが失敗する度に stack trace を生成するのは遅いため、あらかじめシングルトンの生成を行なう

        private K reverseLookup(V v) throws NoKeyFoundException {
            for (Entry<K, V> entry : map.entrySet()) if (entry.getValue() == v) return entry.getKey();
            throw noKeyFound; // シングルトンをスロー
        }

        @Override public V remove(Object k_) {
            V v = map.remove(k_);
            try {
                    reverse.put(v, reverseLookup(v));
            } catch (NoKeyFoundError e) {
                    reverse.remove(v);
            }
            return v;
        }

        private V dedupScan(V value) {
            if (! reverse.containsKey(value)) return value;
            return map.get(reverse.get(value));
        }

        @Override public V put(K arg0, V arg1) {
            V value = dedupScan(arg1);
            reverse.put(value, arg0);
            return map.put(arg0, value);
        }

        @Override public void putAll(Map<? extends K, ? extends V> m) {
            for (Entry<? extends K, ? extends V> entry : m.entrySet()) put(entry.getKey(), entry.getValue());
        }
    }
```

# 課題
remove( ) がマップの全件検索が入ってしまうので遅いはず。実際のアプリでは remove を全く使用しなかったので詳細は不明だが今後の検討が必要と思われる。
dockerをインストールしたのに動かない時

# 症状

dockerを公式サイトからインストール。

```bash:
$ wget -qO- https://get.docker.com/ | sh
```

sudoの為にパスワードを訊かれるが、すんなり通ってインストールが完了したとする。

```bash:
$ sudo usermod -aG docker `whoami`
```

こんな感じでdockerグループにユーザを追加することで、dockerコマンドをsudoなしで使えるようにできる。
しかしそれでは動かないという症状に見舞われる事がある。

```bash:
$ docker ps         
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
$ sudo !! ←こう打つ事で直前のコマンドをsudo付きで再実行できる。
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

dockerデーモンが立ち上がっているか？と訊かれる。sudoであっても結果は一緒。
デーモンの死活はUbuntuなら `service` コマンドで確認できる。

```bash:
$ sudo service docker status
docker start/running, process 4499
```

が、このようにデーモンが生きていても上記のエラーメッセージが出ることがある。

# 解決策

Ubuntuを再起動せよ。
（具体的にどのモジュールが再起動すれば問題が解決するのかわからないが、現行の最新である1.8であってもドンピシャな解決策は提示されていなかった。）

# 結果

以下のように表示されれば上記の症状は解決したと見られる。

```bash:
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
Linuxのpeekfdコマンドが面白い（全ファイル入出力を盗聴）

psmiscパッケージに入っているpeekfdコマンドを使うと、任意のプロセスの全ファイルディスクリプタへの読み書きを監視（内容を盗聴）することができる。

実行例：
あるシェルからこれを実行

```
$ echo $$; while true; do echo hoge; sleep 1;done
3457
hoge
hoge
hoge
```

このシェルのPIDは3457と分かったので、別のシェルからrootでpeekfdを実行する：

```
# peekfd 3457

writing fd 1:
hoge
hoge
hoge
```

echo hogeによる標準出力への書き込みを盗聴できている。
3457のシェルでwhileループを止めてキー入力すれば、キー入力も盗聴できる。

/proc/{PID}/fdの中を見ればfd何番がどのファイルか分かる。