OmniAICreator/Qiita-1.07M huggingface dataset:
Rails4 でフォントの precompile に関する問題の解決策


Rails4 で twitter bootstrap を使うときなどに、prooduction 環境だと絵文字が"トウフ"なのだわーウフフという悲しみ、あります。

主に以下の2つが問題のようでした。

* `vendor` 以下のフォントファイルが `rake assets:precompile` で `public/assets` にコピーされない
* `rake assets:precompile` でコピーされたフォントファイル名に digest が付与されてしまい、CSS から読み込めていない

解決策
-----

assets:precompile でなんとかする場合は以下の手順でOKでした。
（自前でフォントを `public/assets` にコピーという対応方法もある）

### 1. フォントを precompile 対象に含める

まずは次のどちらかの方法でフォントファイルを precompile 対象にしてやる。

* フォントファイルを `app/assets/fonts` に配置
* フォントファイルを `vendor/assets/fonts` に配置 & precompile 対象に含める設定を追加

``` config/initializers/assets.rb
# 以下を追加
Rails.application.config.assets.precompile += %w( *.svg *.eot *.woff *.ttf )
```

### 2. フォントファイル名に付与される digest をなんとかする

次のどちらかの方法で digest をなんとかする。

* CSS側でなんとかする: sass/scss に変更して `url(...)` を `font-url(...)` に変更
  * sass にした時点でインデントとかもろもろ修正しないといけない、つらい。。。
  * css.erb にして `url(<%= asset_path("...") %>)` の方が楽？
* フォントファイル名をなんとかする: non-stupid-digest-assets を利用する
  * non-stupid-digest-assets
     * https://github.com/alexspeller/non-stupid-digest-assets
     * `rake assets:precompile` で digest 付きファイル作成時に digest なしのファイルも作成してくれる gem
  * `Gemfile` に追加、`bundle install` 後、以下の様に設定

``` config/initializers/non_digest_assets.rb
NonStupidDigestAssets.whitelist = [/glyphicons-halflings-regular\.(eot|svg|woff|ttf)/]
```

なんか不足あれば教えてくださいませ。。。
あと、map ファイルとかも同様の方法で参照を解決してやると多少幸せになれるかも。

原因
-----

1. Rails4 で `vendor` 下が js/css 以外の precompile 対象外になったらしい
（ https://github.com/rails/rails/pull/7968 ）
* Rails4 では precompile したファイル名に必ず digest が付与されてしまう

Rails4 というか正確には sprockets-rails なのかな。
2については Issue が大変なありさまに。。。

* https://github.com/rails/sprockets-rails/issues/49
* https://github.com/rails/rails/issues/10810

sprockets-rails では自前 rake task でなんとかしろ、って言ってるんだけど、、、どうなのそれ。。。

参考
------

* http://stackoverflow.com/questions/10905905/using-fonts-with-rails-asset-pipeline/17367264#17367264
* http://stackoverflow.com/questions/19347990/font-asset-without-digest-in-ruby-on-rails-4
* http://blog.monochromegane.com/blog/2013/09/07/rails4-only-compile-under-app-assets/
* https://github.com/rails/rails/pull/7968
local上でMAMPからlocalhostにとべない


wordpressをlocal上で使うために、MAMPを起動
ルートを設定して
localhost


The requested URL / was not found on this server.

ルートも通ってるし、ファイルもある

解決方法

以前facebookのAPIを取得したさいに、
apacheのバーチャルの設定をしていた

MAMPをすべて停止して、
再びコメントアウトしてlocalで動くようにした

とおった
メールサーバ構築のテスト


## 前提条件

* メール受信は行わない(POPサーバなし)
* localhostからはいずれのメールも転送できる
* 指定のIPアドレスからはいずれにメールも転送できる
* その他のアクセスでは、SMTPAuthを用いた認証を行う
* SMTPAuthは、port587を使う
* 指定IPアドレス以外からの port25への接続不可

## 設定方法

後で書く。

## テスト条件

### リレーサーバの確認
http://www.rbl.jp/svcheck.php

### 転送テスト
送信先は、@gmail 宛 / メールサーバのサブドメインなしへのメール mail.MY_DOMAIN の場合、 @MY_DOMAIN 宛

#### localhost 25 からのメール転送テスト

* telnetを用いる

#### 指定IPアドレスから port 25 で転送テスト

* telnetを用いる
* メールクライアント(Windows Live)

#### 指定IPアドレスから port 25 で転送できないテスト
そもそもport25が閉じているはず
#### 指定IPアドレスからSMTPAuth経由で転送テスト

* メールクライアント(Windows Live)

#### 指定IPアドレス外からSMTPAuth経由で転送テスト

* メールクライアント(Windows Live)
食べられるキノコを見分ける

# CodeIQ の問題を解く (2)

[昨日](http://qiita.com/ynakayama/items/33231bf23d40d1c1f344)に引き続き CodeIQ に掲載された問題を解いてみます。

「機械学習基礎」簡単な問題を解いて理解しよう！前篇
http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002315

今日は第 2 問を解きます。

## クラスタリング

### 問題

```
海賊船で催されたPRML読書会は楽しかった。
機械学習の事も少しはわかった気がするし、金貨も沢山貰えた。偽金貨もずいぶん混ざっていたが。
本物とわかった金貨を何枚か貴金属店で売って小金ができた。
貴金属店の店主は海賊船での読書会の話もそこで金貨を貰った事も信じていないようだったが、
そのうち何枚かは百年前に北大西洋で沈没した豪華客船に積まれていた幻の金貨だそうで、店主もほくほくしていた。
これでカーネル多変量解析の本でも買おうかと思っていたN君に、海賊船の船長からメールが届いた。
「太平洋のある島にたどり着いた。島は家から道路から何もかも金でできている。」
もしかしてあの「ジパング」ですか？
「しかし、この島には誰も住んでおらず、あるものといえば金ばかりで食料が全くない。
　食用になりそうなのは道端に生えているキノコぐらいだ」
「この島のキノコは見たところ3種類あるようだ。そのうち2種類は毒キノコらしい。
　誤って食べた隊員が3日3晩笑い転げたり泣き叫んだりしている。
　3種類とも金色なので色では区別がつかない。」
とりあえず死人は出ていないらしい。
「採ってきたキノコと、隊員が食べたキノコのデータを送るから、
　食べても大丈夫なキノコを教えてほしい」
キノコの傘の大きさと柄の長さが記されたデータが送られてきた。
このデータをもとに採ってきたキノコをクラスタリングして、隊員が食べた毒キノコの含まれないグループのキノコを船長に教えてあげよう。
```

### データの読み込み

昨日はサポートベクトルマシンを利用しましたが、今日はクラスタリングをします。

○ と × だと扱いづらいので 1 と 0 にあらかじめ変換しておきます。

```py3
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 採ってきたキノコ
data = np.genfromtxt('CodeIQ_data.txt', delimiter=' ')
# 隊員が食べたキノコ
eaten = np.genfromtxt('CodeIQ_eaten.txt', delimiter=' ')
```

### データ可視化

まずはデータをプロッティングしてみます。

```py3
# 散布図にプロットのための関数
def plot(data, eaten):
    # キャンバスを描く
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)

    # 採ってきたキノコを青で描画する
    x1, y1 = np.array([[x[0], x[1]] for x in data]).T
    ax.scatter(x1, y1, color='b')

    # 食べても大丈夫なキノコを赤で描画する
    x2, y2 = np.array([[x[0], x[1]] for x in eaten if x[2] == 1]).T
    ax.scatter(x2, y2, color='r')

    # 食べてはいけないキノコを緑で描画する
    x3, y3 = np.array([[x[0], x[1]] for x in eaten if x[2] == 0]).T
    ax.scatter(x3, y3, color='g')
    plt.legend(loc='best')
    plt.show()
    plt.savefig("image.png")

plot(data, eaten)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/be67185a-b6d7-db28-0a1c-db8b032eed01.png)

元記事と同じようにプロットができました。

上の図で赤い点が属しているクラスタが食べられるキノコです。

K-Means クラスタリングは k 個のクラスタにデータをわけるアルゴリズムです。今回は 3 つのクラスタに分けますから k=3 となります。

### 解法

```py3
def kmeans(features):
    # k=3, ランダマイズを 10 回実施する
    kmeans_model = KMeans(n_clusters=3, random_state=10).fit(features)
    # ラベルを取り出す
    labels = kmeans_model.labels_
    return labels

# K-Means クラスタリングをする
labels = kmeans(data)
```

これで labels に 0,1,2 の 3 つのラベルが帰るわけです。

あとは内容を調べて赤に所属するクラスタを表示すれば OK です。

```py3
for label, feature in zip(labels, data):
    if label == 0:
        print(label, feature)
```

### 結果

```
0 [ 13.54  16.63]
0 [ 15.15  16.65]
0 [ 16.87  13.99]
0 [ 11.11  13.27]
0 [ 16.62  16.67]
0 [ 18.84  16.5 ]
0 [ 15.21  14.97]
0 [ 14.39  13.58]
0 [ 13.88  12.54]
0 [ 13.16  11.24]
0 [ 14.45  14.39]
0 [ 12.15  13.39]
0 [ 13.3  12.8]
0 [ 15.55  12.07]
0 [ 12.1    9.86]
0 [ 14.9   17.23]
0 [ 16.5   14.32]
0 [ 13.88  11.71]
0 [ 15.73  15.06]
0 [ 12.17  13.49]
0 [ 10.45  11.46]
0 [ 11.51  14.53]
0 [ 15.51  17.25]
0 [ 15.85  16.9 ]
0 [ 14.64  14.53]
0 [ 13.12  12.88]
0 [ 11.66  10.9 ]
0 [ 15.57  12.67]
0 [ 16.35  15.72]
0 [ 12.14  10.71]
```

30 個のキノコをきれいに取り出すことができました。
Passbookのダウンロードに失敗した時に確認する事

備忘録

SafariやwebviewからPassbookを取得しようとして、

`ダウンロードに失敗しました
このファイルはダウンロードできません`

とアラートが表示された場合、
サーバにMIMEタイプが登録されていませんので、
下記を追記する必要があります。

```.htaccess
AddType application/vnd.apple.pkpass pkpass
```
Xcode6のIBでautoresizingを設定する方法


MacOSX向けアプリでWindowをリサイズした時に、
中身のViewも自動でリサイズして欲しい時、
Xcode5ではViewを選んでSize Inspectorから
Autoresizingで設定することが多かったんですが、
Xcode6で新しくプロジェクトを作るとデフォルトでは項目が無くなっています。

*※Xcode6-β2で確認。*

## どこにあるの？
File Inspector > Interface Builder Document > Use Auto Layoutをオフ

・・・出ました！
![xcode6beta.png](https://qiita-image-store.s3.amazonaws.com/0/45742/3b5998df-d428-1388-7944-fd835911ea22.png "xcode6beta.png")
でも、デフォルトでは使えなくなっているので「別の方法を使ってね」というAppleの意思を感じます。

## Auto Layoutを使ってみる
iOS6で導入されてMacOSXにも導入されたAuto Layerを使いましょう。

File Inspector > Interface Builder Document > Use Auto Layoutをオン(※デフォルト設定)

設定はココからできます。iOS開発者は見覚えがあるはず。
![xcode6beta.png](https://qiita-image-store.s3.amazonaws.com/0/45742/0fdaec14-79d4-fb71-8683-bed8f05db389.png "xcode6beta.png")

Autoresizingと同等以上の設定ができるので、
MacOSX appでも今後はコチラを使うようにすると良いかも。
aws-sdk-rubyでバックエンドに非同期リクエストする

勉強中ですがメモ。そのうち試す。

v2な[aws-sdk-core-ruby](https://github.com/aws/aws-sdk-core-ruby)は未確認。
v1の[aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby)の調査結果です。

----

## HttpHandlerの実装
非同期リクエストするには、まずデフォルトのHttpHandlerを差し替える必要がある。
デフォルトのHttpHandlerである[AWS::Core::Http::NetHttpHandler](https://github.com/aws/aws-sdk-ruby/blob/master/lib/aws/core/http/net_http_handler.rb)はnet/httpベースのクライアントであり、非同期実装は無い。

定義するべきメソッドは３つ。
雛形を書くと、以下のようになる(initializeは略)。

```hoge_http_handler.rb
module AWS
  module Core
    module Http
      class HogeHttpHandler

        def handle(request, http_response, &read_block)
        end

        def handle_async(request, http_response, handle)
        end

        def sleep_with_callback(seconds, &block)
        end

      end
    end
  end
end
```

リクエストオプションに{async: true}が含まれると、handle_async()がcallされる。
sleep_with_callback()は、リトライ時にcallされる。

## HttpHandlerの登録
configurationとして登録する。

```rb
AWS.config(http_handler: handler)
```
各AWSリソースのinitializeオプションとして渡してやってもOK。

## EventMachine(EM)を使ったクライアント

調べてみると[EmAws](https://github.com/JoshMcKin/em_aws) が既にあった。
触ってみよう ←今ココ
pecoをインストールして、zshのhistoryを軽快に検索


## Goのインストール
何も考えずに、homebrewからインストール

```zsh
% brew install go
```

.zshenvにでも、GOPATHとPATHを設定しておく。

```.zshenv
# go path
export GOPATH=~/go
export PATH=$PATH:$GOPATH/bin
```

~/goとか突然出てきて何者？って思うかも知れないですが、次のpecoのインストール時に必要になりますので、おまじないだと思って書いておいて下さい。
変更内容を読み込んでおいて下さい。

```zsh
% source .zshenv
```

## pecoのインストール

```zsh
% go get github.com/lestrrat/peco/cmd/peco/
```

これで、pecoのインストールは完了

## pecoでhistory検索してくれるように

以下の様に、.zshrcに追加

```.zshrc
function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(\history -n 1 | \
        eval $tac | \
        peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```

読込直す

```zsh
% source .zshrc
```

## historyの検索

Ctrl+rで検索出来る様になってる！

![sample](http://gifzo.net/BKyBIwWcO3M.gif)
何時何分何秒にコマンド打ったか記録しておこうぜいー（プロンプトに時間を表示させる）


# 背景

http://qiita.com/imura81gt/items/1ffaaff3cc1e9613925f
に引き続き、OPSな話。

ガチガチ手順書作る必要のあるSI系OPSだと
「コマンド実行前にdateコマンド打とう」とか
「date ; hogehoge ; date」とか
「time hogehoge」とか
決まった運用、手順書、チェックシートも多かったけど
　# 打ってないと詰められることもしばしば(吐血
web系のOPSなら、設定変更するのも
あまり申請が必要とかの制約無いので
自動で時間が出るようにしておこう、という話。

または

OPSなら、いままでの作業時間をもとに
次の作業終了時間の予想はするよね！という話。


# 設定方法

## bashの場合

詳しくは `strfttime` とかで検索。

デフォルトのプロンプトを念の為確認

```bash:
echo $PS1
```

.bash_profileに以下を追記

```bash:.bash_profile
export PS1='\h:\W \t \$ '
```

\hがホスト名
\tが時間。

```bash:プロンプト
PC001:~ 15:20:43 $
```

こんな感じ。
毎度 `date` コマンド + `Enter`キーの 5回入力するより
コマンド入力前には１回 `Enter`キー 押す方が楽ですよね。

少なくとも、長い処理の終了時間は自動で拾えて便利。


```bash:こんな感じ
PC001:~ 15:27:15 $ for ((i=1; i < 10; i++)) ; do date; sleep 10; done
2014年 7月 2日 水曜日 15時27分21秒 JST
2014年 7月 2日 水曜日 15時27分31秒 JST
2014年 7月 2日 水曜日 15時27分41秒 JST
2014年 7月 2日 水曜日 15時27分51秒 JST
2014年 7月 2日 水曜日 15時28分01秒 JST
2014年 7月 2日 水曜日 15時28分11秒 JST
2014年 7月 2日 水曜日 15時28分21秒 JST
2014年 7月 2日 水曜日 15時28分31秒 JST
2014年 7月 2日 水曜日 15時28分41秒 JST
PC001:~ 15:28:51 $
```

# iTermの場合

`command` + `shift` + `E`
か
Menu bar > view > show timestamp
で見れる。

![iterm-time.gif](https://qiita-image-store.s3.amazonaws.com/0/17518/99604b57-d972-888e-c1e5-b34dfa1af8f9.gif)
即売会サービスを作ろう１３


##アクセスカウンタ
サークルさんにとってすごく嫌なことというのは「だれもこない」という状態ですが
来てくれているという感覚を出すためにアクセスカウンタをつけました。
仕組みは簡単で、頒布アイテムの詳細画面を出したら増えます。
(1990年代の個人HPによくあったアレですね)

ここのロジックは単純に１ずつ増やしているだけなので
複数のユーザーが同時にアクセスしたときに正しく増えないことがあるのですが
最初のうちはそこまでトラフィックがないのでこれでゴーです。

この問題をどうしても解決したい場合は 
Sharding counters という方法があります

https://developers.google.com/appengine/articles/sharding_counters?hl=ja

いろいろ書いてありますけど、複数のエンティティに分散して値を書き込んでいく方法ですね。
GAEなので１アクセスがあるたびにDataStoreに１レコードを追加するようにして count() で数えればいいじゃんと思う人もいそうですが
count処理はレコード数に比例して時間がかかるので、いつか破綻してしまう設計になってしまいます。注意。




## 横リストビュー

Androidには標準で横リストビューがないので
別途 Horizontal ListView というのを使ってみました

http://www.dev-smart.com/archives/34

標準のと同じように使えて便利ですね！


##DevelopersConsole
![スクリーンショット 2014-07-02 15.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/2029/edadab20-98f7-5e9f-7eaa-2904ca32b712.png "スクリーンショット 2014-07-02 15.09.02.png")

先日の Google I/O 以降、DevelopersConsoleにいろいろ機能が追加されてて
gitリポジトリにpushするとAppEngineにデプロイされる機能が増えたようです。

次回はこのあたりを調べてみます。
Dockerの入門資料を作成する時に出会ったコマンド達

勉強会用に「[昨日Dockerをはじめました](http://www.slideshare.net/ionis111/docker-36133921)」という資料を作りました。
『dockerがどういうものなのか？』に関しては少し前からネット上で記事を読んでいたりはしたのですが、実際に使ってみたのは、文字通り「勉強会前日から」でした。
その時に出会ったコマンド達です。
皆様もdockerを始めると出会う事になると思います。
なお、mac上で作業していたので、boot2dockerを利用しています。

# コマンド一覧

```bash
boot2docker init
  docker vm イメージ作成
boot2docker start
  docker vm 起動
boot2docker ssh
  docker vm 接続

docker images
　イメージ一覧確認
docker pull centos
　公式のリポジトリからcentosのイメージを取得
docker inspect [image id]
　イメージの情報を確認
docker rmi [image id]
　イメージの削除
　dockeer rmi REPOSITORY:TAG　という指定でもOK

docker run centos uname -a
　コンテナの作成
　　上記では、centosの最新のイメージを使ってuname -aを実行する
docker run -i -t centos /bin/bash
　-i コンテナをインタラクティブ起動
　　これでコマンドの実行が終わってもすぐにデタッチされません
　-t ttyオプション
docker ps -a
　稼働中のコンテナ一覧の確認
　-aを付けると停止中のコンテナも一覧に出る
docker rm [container id]
　コンテナの削除
docker start [container id]
　コンテナの起動
docker attach [container id]
　コンテナのアタッチ
docker start -a [container id]
　コンテナを起動してアタッチ

docker logs [containter id]
　コマンドの実行履歴
docker top [container id]
　コンテナ内のプロセス
docker cp [container id]:[path] [local path]
　コンテナ内のファイルをローカルにコピー
docker commit -m "めっせーじ" [conatiner id] タグ名
　コンテナからイメージを作成
　タグ名は <ユーザー名>/<イメージ名>

sudo docker build --no-cace --rm --tag タグ名 [local path]
　Dockerfileを元にイメージを作成する
　local pathはDocumentfileが存在しているディレクトリパス　（カレントにある場合は、./）
　--rmがないと、Dockerfileの1行毎にコンテナを作ってしまうので、ほぼ必須
```

とりあえず、これだけあれば基本的な作業は困らないと思います！
CircleCIとかで support-v4ではまった場合の対処法

いろいろ報告がありますが、原因は Android SDK 22.6.4のバグなんでしょうか。
ローカルでは [Android SDK toolsを 23.0にあげる](https://code.google.com/p/android/issues/detail?id=72550) ことで回避できるようですが、 CircleCIとかのサービスを使っているとそうも行きません。

ということで簡単な Workaroundを一つ。[こんなかんじ](https://circleci.com/docs/android)にしこしこ m2-repositoryとかをインストールしてると思うんですが、その先頭に次の行をくわえるだけ:

```
echo y | android update sdk --no-ui --all --filter 'platform-tools,tools'
```

これで最新の toolsに上がるので m2-repositoryもちゃんとみつかるようになるはずです。

まあ、各CIがちゃんと対応してくれて、こんな workaroundが要らなくなるのが望ましいのですが。
wineでKeyのゲームソフトを起動する

Clannadを起動しようとしたとき普通に./◯◯で実行しても起動できなかった。
rlvmを使えば起動できる。


%sudo apt-get install rlvm
ゲームが入ってるディレクトリに移動して、
%rlvm .

無事起動できました。
知恵袋カテゴリーリストの取得、先週金曜日以降？？

iOSクライアントにて、カテゴリートップのリストを取得するのですが、先週金曜日前後までは、問題なく17項目のリストが返って来ていました。しかしながら、同一プログラムで、土曜以降は、エラーではありませんが、ゼロ個のリストが返ってくるようになりました

`<?xml version="1.0" encoding="UTF-8"?>
<ResultSet xmlns="urn:yahoo:jp:chiebukuro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:chiebukuro:categorytree http://chiebukuro.yahooapis.jp/Chiebukuro/V1/categoryTreeResponse.xsd" totalResultsReturned="0" totalResultsAvailable="0">
    <Status>
                        <StatusCode>0</StatusCode> 
        <Error></Error>
            </Status>
    <Result>
            </Result>
</ResultSet>`

 それで、お聞きしたいのは、この前後で、なにか変えたのでしょうか？
　ゼロ個のリストを返すのは、どういう場合なのでしょうか？
SharedPrefarenceで好きな型の値を保存する



## はじめに
値を簡単に保存できるsharedprefarencesというのがあります。けれどこいつは元々存在する特定の型の値しか保存できないので不便です。
今回はどんな型でも保存できる方法をメモします。

##方法
基本的にはGsonを使って保存したいオブジェクトをJSONに変換して、それをString型のものとしてsharedprefarencesで保存するだけ

使ったライブラリ
[Gson](https://code.google.com/p/google-gson/)


```java:読み込み
SharedPreferences preferences = getActivity().getSharedPreferences("key", Activity.MODE_PRIVATE);
Gson gson = new Gson();
ArrayList<MyData> mydata = gson.fromJson(preferences.getString("topic",""), new TypeToken<List<MyData>>(){}.getType());
```

```java:書き込み
SharedPreferences preferences = getActivity().getSharedPreferences("key", Activity.MODE_PRIVATE);
Gson gson = new Gson();
preferences.edit().putString("topic", gson.toJson(mydata)).commit();

```

[参考サイト](http://tech.aainc.co.jp/archives/7117)
Chef-Server(chef-server-webui)の発行するCookieでdomain属性を無しにする

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

`chef-server-webui`はrails3で、セッションの管理は`cookie_store`を使用しています。
このCookieを発行する際にDomain属性を付けるようになっていますが、デフォルトはRails用の`:all`がセットされます。

インストール用Cookbookのテンプレートはこんな感じ。

```ruby:cookbooks/chef-server/templates/default/session_store.erb 
# Be sure to restart your server when you modify this file.

ChefServerWebui::Application.config.session_store :cookie_store, :key => '<%= @session_key %>', :domain => <%= @cookie_domain == "all" ? ':all' : "'#{@cookie_domain}'" %>
```

## Domainの値で困る例

この`:all`のデフォルト挙動がちょっとアレで、例えばEC2に立てたインスタンス、`ec2-xx-xx-xx-xxx.ap-northeast-1.compute.amazonaws.com`のようなドメインで来ると、次のようなCookieを発行します。

```
_sandbox_session=SESSION_KEY; domain=.amazonaws.com; path=/; HttpOnly
```

`domain=.amazonaws.com`はちょっとレベル高すぎだろう。
最近の主要なブラウザでは、ホスト名を使ったアクセス(IPならOK)ではログインできない事態になります。

> ※: Rails側の`config.action_dispatch.tld_length`で深さの変更も一応可能。


Domainに何をセットしておけばいいのかはこの辺を参考に、[CookieのDomain属性は *指定しない* が一番安全 | 徳丸浩の日記](http://blog.tokumaru.org/2011/10/cookiedomain.html "CookieのDomain属性は *指定しない* が一番安全 | 徳丸浩の日記")

## Domainを送らない設定

じゃあ、指定しないようにしましょう。そのための設定はこちら。


```ruby:chef-server.rb
chef_server_webui['cookie_domain'] = ''
```

テンプレートの関係で、`:domain => hogehoge`が省略出来ないので空文字で。
これでreconfigureすれば、ホスト名でアクセスした際もDomain属性が発行されません。

```
_sandbox_session=SESSION_KEY; path=/; HttpOnly
```



> ### ログにはこんなの出ます
> ホスト名アクセスでログインできない時はログにこんな文言。
> `Filter chain halted as :require_login rendered or redirected`
> このとき、(多分)Domain属性のレベルのせいで、ブラウザによってはsessionがカラっぽなのでトップに戻されます。
>
> 同様事例の報告があったけど、その時はイマイチ対策ができなかった模様
> http://community.opscode.com/chat/chef/2014-05-29
Vagrant における Ansible によるプロビジョニング (WIP)


メモ中。

# インベントリの扱い

Ansible ではインベントリファイルに記載されたホストに対してのみ、プロビジョニングを行う。

インベントリファイルは一見、`hosts` ファイルっぽい記法だが、拡張性が高く複雑な記述をしていくと `hosts` ファイルとは全然違ってくる。

* [Inventory — Ansible Documentation](http://docs.ansible.com/intro_inventory.html)

インベントリファイルは `ansible.cfg` の設定されたパスのファイル (デフォルトでは `/etc/ansible/hosts`) から読み込まれる。

> ansible.cfg はコマンド実行のカレントディレクトリ、環境変数の ANSIBLE_CONFIG 、~/ansible.cfg 、/etc/ansible/ansible.cfg の順に検索されます。

* [Inventory File · yteraoka/ansible-tutorial Wiki](https://github.com/yteraoka/ansible-tutorial/wiki/Inventory-File)
* [The Ansible Configuration File — Ansible Documentation](http://docs.ansible.com/intro_configuration.html)

## Vagrant での扱い

Vagrant においては、インベントリファイルは自動生成され、Vagrant ローカルパスの `.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory` に設定され、これが読み込まれる。

インベントリの設定を変更したい場合は、`Vagrantfile` に設定を記述する。

* [Ansible - Provisioning - Vagrant Documentation](https://docs.vagrantup.com/v2/provisioning/ansible.html)

# tty の問題

Amazon Linux や CentOS では `/etc/sudoers` の `requiretty` が有効な為、Ansible の `sudo` コマンド実行で;

```
sorry, you must have a tty to run sudo
```

上記エラーとなり、実行できない。

* [Can't execute sudo commands on machine that requires tty to run sudo · Issue #1482 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/1482)

解決策は `Vagrantfile` で次のオプションを有効にする:

```ruby
config.ssh.pty = true
```

# 標準的な LAMP 環境を構築

CentOS 6.5 に対して Apache, MySQL, PHP をインストールし設定する場合、次のような Playbook を記述する:

```yaml
---
- hosts: default
  sudo: true
  user: user

  tasks:

    - name: Install Apache, MySQL, PHP
      yum: pkg={{ item }} state=installed
      with_items:
        - httpd
        - mysql
        - mysql-server
        - php
        - php-common
        - php-gd
        - php-mysql
        - php-pear
        - php-xml
        - MySQL-python
      notify:
        - httpd restarted
        - mysqld restarted

    - name: Update Apache configuration
      copy: src=roles/common/files/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=0644

    - name: Add Apache upstart script
      copy: src=roles/common/files/etc/init/httpd.upstart.conf dest=/etc/init/httpd.upstart.conf owner=root group=root mode=0644

    - name: Create MySQL database
      mysql_db: name=mydb encoding=utf8 state=present

    - name: Create MySQL user
      mysql_user: name=user password=password priv=mydb.*:ALL state=present

  handlers:

    - name: httpd restarted
      service: name=httpd enabled=yes state=restarted

    - name: mysqld restarted
      service: name=mysqld enabled=yes state=restarted
```
JavaScriptでOpenSSLをアップデートする。 - Pacifista バンザイ -

[Pacifista](http://pacifista.ukiuni.org)をご存じですか？JavaScriptでLinuxの環境を構築できるツールです。リモートのサーバをJavaScriptで操作できるので、サーバの構築、定期メンテなどに利用することができます。

本稿では、Pacifistaを使って複数サーバのOpenSSLを一括アップデートする方法をご紹介します。heartbreed騒動や、その後のバグFixからは時間が立ち、ちょっと波に乗り遅れた感がありますが、まだやってない方や、同じような作業をする予定のある方はメモっておくと楽ができると思います。たくさんのサーバに同じコマンドを発行していくなんて、うんざりしますからね。

# Pacifistaのセットアップ
セットアップの方法は2通りあります。zipもしくはtarを展開するか、gitコマンドを実行します。

## やり方１ zipもしくはtarを展開
ホームページに書いてあるやり方です。Javaをインストールするとともに、[ダウンロードページ](http://pacifista.ukiuni.org/downloads)から最新版をダウンロードして展開します。以上。

## やり方2 githubから取得します。
```
git clone https://github.com/ukiuni/pacifista.git
``` 
で取得します。Javaのインストールも必要です。

# JavaScriptを書く。
JavaScriptでOpenSSLのアップデートと、使ってるモジュールの再起動を書きます。
内容はサンプルなので、適切に書き換えて下さい。

```js:OpensslUpdate.js
var hosts = [
{name:"host1", userName: "ec2-user", domainName:"host1.example.com",keyFilePath:"/key/mykey.pem"},
{name:"host2", userName: "ec2-user", domainName:"host2.example.com",keyFilePath:"/key/mykey.pem"}
//and other server
);

hosts.forEach(function(host){
	console.log("target server // " + host.name + "/////////////////");
	var remote = Remote.create();
	remote.connectWithAuthFile(host.domainName, 22, userName, host.keyFilePath);
	remote.call("sudo openssl version");
	remote.call("sudo yum clean all");
	remote.call("sudo yum update -y openssl");
	remote.call("sudo /etc/init.d/crond restart");
	remote.call("sudo /etc/init.d/sshd restart");
	//その他、httpdへの反映等。
	remote.call("sudo openssl version");
});
console.log("!!!!!COMPLETE!!!!!");
```
Remoteオブジェクトを生成して接続したら、コマンドを発行するだけです。
あとは、JavaScriptなので、ループで思いのままです。
簡単ですね。
実行した後は、ログを確認して、きちんとアップデートできたかどうか確認して下さい。yumの設定や、容量不足などでアップデートできていないこともあります。

# プログラムのちからをあなたの力にしましょう！
コマンドを複数サーバに打つのは大変ですよね。一つ一つは小さな作業だとしても、10台、20台のサーバにコマンドを打っていくのは大変です。
少しプログラミングするだけで、一気に作業ができて、ログも残ります。同じような作業であれば、以降はとても楽に作業を追えることができます。その空いた時間にもっと価値のあることをしましょう！
Herokuに手っ取り早く静的サイトをデプロイする(node版)

index.htmlをデプロイするだけなら 'touch index.php;', 'echo 'php_flag engine off' > .htaccess'  が最速なんだけど、ルートディレクトリに静的アセットを起きたくないという理由でなんか嫌だった。

Rubyの人ならrack upするアプリ書くんだろうけど、nodeでビルドツール使いまくったリポジトリなので、nodeでやる。

npmとrubyとheroku toolbelt が入ってるのを前提。

## 環境構築

npmからexpressだけ入れとく。

```
npm init # package.jsonがないなら
npm install express --save
```

package.jsonに追記

```
  "engines": {
    "node": "0.10.x"
  },
```

node v0.10系を使えという指定


server.js

```javascript
var express = require('express')
  , http = require('http')
  , app = express()
  ;
app.use(express.static(__dirname + '/public'));
var port = process.env.PORT || 5000;
var server = http.createServer(app).listen(port);
```

buildのところがホストしたいindex.htmlを含むディレクトリ


Procfile 

```
web: node server.js
```


Foreman 入れて動作確認する

```
gem install foreman
foreman start
```

localhost:5000で動いれてればおｋ

ディレクトリはたぶんこうなってる

```
- .git
- .gitignore
- package.json
- server.js
- public/ # index.html等、ホストするファイルを含むディレクトリ
- Procfile
```

node_modulesとかは適宜.gitignore してください

## デプロイ

```
git init; git add .; git commit -m"init" # もしやってないなら
heroku create 
git push heroku master
heroku ps:scale web=1 # dynoの数を1 に
heroku open # ブラウザで開く
```

動いた
ArrayListの並べ替え


## はじめに
独自クラスを使用したArrayListの並べ替えを使ったのでメモ。
　　
まずは今回使ったデータクラス

```java:MydDta
public class MyData{
	String url;
	String title;
	String contents;
	String type;
	java.util.Date date;

	public MyData(String url, String title, String contents, String type, java.util.Date date){
		this.url = url;
		this.title = title;
		this.contents = contents;
		this.type = type;
		this.date = date;
	}
	
	public String getUrl() {
		return url;
	}
	
	public String getTitle(){
		return title;
	}
	public String getContents(){
		return contents;
	}
	public String getType(){
		return type;
	}
	public java.util.Date getDate(){
		return date;
	}
}

```

今回はこのMydataクラスを用いた```ArrayList<MyData> mydata``` をDataの順に並べ替えていく。
ArrayListの並べ替え方法について調べたら「Collectionsを使用すると並べ替えをすることができる」との記述があったので試してみた。


```java:SortFunction
private static ArrayList<MyData> SortMyData(ArrayList<MyData> mydata){
		Collections.sort(mydata/*並べ替えするオブジェクト*/, new Comparator<MyData/*使用する独自クラス*/>() {
			public int compare(MyData o1, MyData o2) {
				if (o1.getDate() == null || o2.getDate() == null)
					return 0;
				return o1.getDate().compareTo(o2.getDate())/*二つのデータオブジェクトの比較*/;
			}
		});
		return mydata;
}

```
このようにするとarraylistの並べ替えができる。

Collctionsに関してのドキュメントは以下参照

[Android 公式ドキュメント](http://developer.android.com/reference/java/util/Collections.html)



## 追記
前述の方法ではDateオブジェクトの値が小さい順に並べ替えされる。
逆順にしたい場合などは以下のように値を返し値を自分でいじれば良い

```
	private static ArrayList<MyData> SortMyData(ArrayList<MyData> mydata){
		Collections.sort(mydata, new Comparator<MyData>() {
			public int compare(MyData o1, MyData o2) {
				if (o1.getDate() == null || o2.getDate() == null)
					return 0;
				if(o1.getDate().getTime() > o2.getDate().getTime())
					return -1;
				if(o1.getDate().getTime() < o2.getDate().getTime())
					return 1;
				return o1.getDate().compareTo(o2.getDate());
			}
		});
		return mydata;
	}
```

参考サイト [オープンソースポータル](http://www.syboos.jp/java/doc/sort-list-with-asc-or-desc.html)
peep-diredを使ってみた

[peep-dired](https://github.com/asok/peep-dired)はemacsのdiredでファイルにカーソル合わせると中身が見えるというminor modeです。
FDやFLのようなファイラーには必須の機能でしたね。（伝われ）
MIFESにもこんな機能あった気がします。Vz派でしたが。

## インストール
melpaからもできるようですが、１ファイルなので普通にcloneしてload-pathに置いてbyte-compileしました。


## 設定
```elisp:.emacs.el
;; 先にdiredが必要
(require 'dired)
;; キーバインドは適当
(require 'peep-dired)
(define-key dired-mode-map "\C-xx" 'peep-dired)
(define-key peep-dired-mode-map "\C-xx" 'peep-dired)
```

## 使い方
diredに入ったところでM-x peep-diredすると、カーソルの当たったファイルの中身がチラ見できます。
スペースで下に、バックスペースで上にスクロールします。
そのままの状態だとチラ見したバッファが全部残っていますが、もう一度M-x peep-diredでモードを終了すればチラ見バッファは削除されます。
上記のキーバインドだと、dired中にC-xxでpeep-diredモードになり、同じキーストロークで通常のdiredに戻ります。
Rubyのハッシュ形式で記述された設定ファイルを読み込む


# 概要

設定ファイルをRubyのハッシュ形式で記述し、読み込んで使う方法。

# 方法

以下のような設定ファイルがあるとする。

```ruby:config.rb
{
  :username => 'hogehoge',
  :password => 'hugahuga',
}
```

これを読み込むには以下のようなコードを記述する。

```ruby:sample.rb
config = eval File.read 'config.rb'
p config
```


# 参考

[Ruby] ユーザの設定ファイルの読み込み(ハッシュ編)
http://d.hatena.ne.jp/kitokitoki/20110601/p1
MackerelでResqueのキュー数を可視化する

[Resque](https://github.com/resque/resque)のキューがどんな感じになっているのか可視化したくなったから、[Mackerel](https://mackerel.io/)を使ってみた。

MackerelにResqueサービスとDBロールとRedisが動いているホストを追加して、下記のようなスクリプト書いた。`REDIS_HOST` `PORT` `MACKEREL_API_KEY` `HOST_ID`はよしなに設定する。

```bash
#!/bin/bash
redis='redis-cli -h REDIS_HOST -p PORT'
timestamp=`date +%s`
apikey=MACKERL_API_KEY
hostid=HOST_ID
json=''
sum=0

for name in `$redis SMEMBERS resque:queues` ; do
    depth=`$redis LLEN resque:queue:${name}`
    sum=`expr $sum + $depth`
    json="$json,{\"hostId\":\"$hostid\",\"name\":\"${name}_queue_depth\",\"time\":$timestamp,\"value\":$depth}"
done

json="[{\"hostId\":\"$hostid\",\"name\":\"queue_depth\",\"time\":$timestamp,\"value\":$sum}$json]"

curl https://mackerel.io/api/v0/tsdb \
    -H "X-Api-Key: $apikey" \
    -H "Content-Type: application/json" \
    -d "$json"
```

Resqueは `resque:queues` というSetの中にキューの名前が入っていて、それぞれに対して `resque:queue:NAME` というListがあり、それの一つ一つの要素がタスクの内容になっているので、Listの大きさがその瞬間のタスク数ということになる。

あとはこれをcronで毎分動かすようにしたらあとはMackerelがいい感じにグラフ化してくれた。

> ![Screen Shot 2014-07-02 at 12.58.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/222229bd-5b94-6ade-efea-42e4f22b82c2.png)
> こんな感じ

### Mackerelについて

APIがシンプルで使いやすかった。
pecoを使って、コマンド履歴をインクリメンタルに絞り込んでコマンド再実行


![oWtmj9P7Ki.gif](http://recordit.co/oWtmj9P7Ki.gif)

`Ctrl - r`ですぐに見つけられないときに便利
- 追記：末尾により理想的な解決へのリンク追加


##pecoのインストール

```
# homebrew

brew install peco

# or 

go get github.com/peco/peco/cmd/peco
```

- [peco/peco](https://github.com/peco/peco)


##実行方法

```bash
# 下記をコピペしてenter

eval $(history | cut -c 8-|peco)
```

##aliasに登録

```bash
# テキトーにcrとした

alias  cr='eval $(history | cut -c 8-|peco)'

```

##`Ctr-r`のように過去コマンドを編集して実行したいとき

そのままズバリのやり方を見つけた

- [oh-my-zsh の環境で、peco-select-history が動かない - Qiita](http://qiita.com/uchiko/items/f6b1528d7362c9310da0)
 - 自分も `peco-select-history` + `oh-my-zsh`が動かなくて断念してたので助かる
Shape drawableをxmlではなくJavaコードで動的に生成する

```xml:background_shape.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <stroke android:width="3dp" android:color="#FF0000FF" />
  <corners android:radius="3dp" />
  <solid android:color="#660000FF" />
</shape>
```

これと同等なものを動的に生成しようとしてはまる

```java
float[] outerR = new float[] { 3, 3, 3, 3, 3, 3, 3, 3 }; // dp -> px の処理はひとまず置いておく
ShapeDrawable drawable = new ShapeDrawable(new RoundRectShape(outerR, null, null));
drawable.getPaint().setColor(Color.parseColor("#FF0000FF"));
drawable.setSolidColor(Color.parseColor("#660000FF")); // こんなメソッドは無い!!
```

http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

ドキュメントを読むと、```shape```で記述されたxmlは```ShapeDrawable```ではなく```GradientDrawable```へのresource pointerだと書いてあるので、以下が正しい。

```java
GradientDrawable drawable = new GradientDrawable();
drawable.setStroke(3, Color.parseColor("#FF0000FF"));
drawable.setCornerRadius(3);
drawable.setColor(Color.parseColor("#660000FF"));
```
Vert.xでWebSocketのサーバを作る

WebSocketを使って簡単に文字列のやり取りができるアプリケーションが必要だったので、Vert.xを使って書いてみた。

Groovyを使っているのは、Groovyが好きなのと、ラクに書きたかったのと、これを発展させた先でJavaのAPIを呼ぶ必要があったから。

## Groovyで書くWebSocketサーバー側
```groovy
def wsMap = [:] as java.util.concurrent.ConcurrentHashMap

// ws://localhost:8080/user_id にアクセスしてもらう前提
vertx.createHttpServer().websocketHandler { ws ->
  // URLからユーザーIDを取得
  def userId = ws.path.replaceAll(/^\//, "") /// このコメントはQiitaでの解釈がおかしくなるのを防ぐため…
  // ユーザーIDとアクセスしてきたオブジェクトの組み合わせを保持
  wsMap.put(userId, ws)

  // クライアントから送信されてきた時のHandler
  ws.dataHandler { data ->
    // "送信先ユーザーID:メッセージ" が送られてくる想定
    def (toId, msg) = data.toString().split(':')

    if (wsMap.containsKey(toId)) {
      // 送り先が存在すればメッセージを送る
      vertx.eventBus.send(wsMap[toId].textHandlerID, msg)
    } else {
      // 送り先が存在しなければ送り主に返す
      ws.writeTextFrame("sender don't find")
    }
  }

  // クライアントから切断された時のHanlder
  ws.closeHandler {
    wsMap.remove(ws.textHandlerID)
    println "close : ${ws.textHandlerID}"
  }
}.listen(8080, "0.0.0.0")  // アドレスをlocalhostにすると外から繋がらなくなる
```

## HTML + JavaScriptで書くクライアント側
```html
<!DOCTYPE html>
<html>
<head>
	<title>WebSocket trial</title>
	<meta charset="UTF-8">
	<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
</head>
<body>
	<input type="text" id="user_id">
	<button id="openButton">接続</button>
	<input type="text" id="send_id">
	<input type="text" id="message">
	<button id="sendButton">送信</button>
	<button id="closeButton">切断</button>
	<div id="out_message"></div>
</body>
<script>
  var socket;

  $("#openButton").on('click', function() {
    socket = new WebSocket("ws://localhost:8080/" + $("#user_id").val());

    socket.onopen = function(event) {
      console.log("Web Socket opened");
    };

    socket.onmessage = function(event) {
      console.log("Received data from websocket: " + event.data);
      $("#out_message").html("Received data from websocket: " + event.data);
    }

    socket.onclose = function(event) {
      console.log("Web Socket closed");
    };
  });

  $("#sendButton").on("click", function(event) {
    var user_id = $("#send_id").val();
    var message = $("#message").val();
    socket.send(user_id + ":" + message);
  });

  $("#closeButton").on("click", function(event){
    console.log("close button click");
    socket.close(1000, "Close button clicked.");
  });
</script>
</html>
```

## 参考URL
[Vert.x Groovy manual](http://vertx.io/core_manual_groovy.html#websockets)
[Vert.x で WebSocket - なんとなくな Developer のメモ](http://fits.hatenablog.com/entry/20130114/1358132572)
letter-spacingがnormalか0じゃないと、Firefoxでリガチャが表示されない

[Ligature Symbols](http://kudakurage.com/ligature_symbols/)が好きでプライベートでよく使うんだけど、letter-spacingがnormalか0以外だとリガチャが表示されない。
参照：http://www.mozilla.gr.jp/bugzilla/show_bug.cgi?id=5647
<del>※Safariではそもそも表示されないっぽい。</del>

デモ：http://jsrun.it/Ituki/uOPp
共有しているプロファイルからマシンに依存する部分を独立させる

`$PROFILE`を複数のマシンでGitなどを利用して共有していると、プロファイルに書いておきたいけどマシンに依存するから書くと問題になりそうな部分というのが出てきたりします。

そこで、例えば`c:\misc\%ホスト名%.ps1`というスクリプトファイルを作成します。
`%ホスト名%.ps1`の中にマシンに依存するスクリプトを追い出せばプロファイルがすっきりしそうです。

`$PROFILE`には`%ホスト名%.ps1`を読み込む下記の内容を追加しておけばOk。

```ps1
#マシン依存スクリプトの読み込み
$scriptthatdependsonthismachine = "C:\misc\$env:UserDomain.ps1"
if ( Test-Path $scriptthatdependsonthismachine ) {
   . $scriptthatdependsonthismachine
}
```

これでPowerShell起動時に`%ホスト名%.ps1`が読み込まれてマシンに依存する部分を独立させることができます。

変数名が長いので使う時は適当に短くしてくだし。
Script that depends on this machine.
ノウハウ募集：複数ソースツリーからなる製品をGitリポジトリにどうまとめる？

ひとつの製品もしくはサービスが

* Javaで書かれたサーバ
* C++で書かれたクライアント

のように複数のソースプロジェクトに分かれていることはよくある構成かと思います。
クロスプラットフォーム開発環境を使っていなければ、クライアントがさらにWin, Mac, iOS, Androidとたくさんのプロジェクトに分かれているかもしれません。

さてそれをGitで版管理する場合、何本のリポジトリにしますかというのに迷います。

1ソースプロジェクト＝1リポジトリ
==
冒頭の2プロジェクトならリポジトリは2本作る方法。
（1リポジトリ内に共通祖先を持たない2ブランチ作る、というのもコミットツリーの姿は同じなのでこれに含まれるでしょう）

利点：

* 各モジュールの開発メンバーにとって関心領域外のソースを触らずに済む
* herokuのような、リポジトリルート＝ソースルートを前提としたシステムと相性が良い
* 各モジュールがビルドに別々のマシン環境を要求する場合（MFCアプリもiOSアプリもあるとか）、Jenkinsを別々に立ててそれぞれのリポジトリを監視させれば良く、単純

1製品＝1リポジトリ
==
Server, Clientというディレクトリ内にサーバ、クライアントそれぞれのソースを置くことにし、全体を一本のリポジトリで管理する方法。

利点：

* リリースタグを全モジュールまとめて打てる
* プロトコル仕様変更のようなモジュールにまたがった変更を1コミットにまとめられる
* さらにDocumentsディレクトリも作って仕様書類の変更もその1コミットに含めてしまったり
* いざとなれば【1ソースプロジェクト＝1リポジトリ】形式への変換もコマンド一発でできる

各ソースプロジェクトリポジトリも、全部まとめた製品リポジトリも作ってサブツリーマージ戦略
==
上記二つのいいとこ取り？
たぶん運用手順としては、ソースプロジェクトのトピックブランチを製品リポジトリの側でmasterにマージしてから、製品masterをソースプロジェクトmasterへプッシュ、などという流れになるんでしょうか。

欠点：

* ややこしい

ノウハウお聞かせください
==
いつもこうやっている、ああやったら後悔した、ああやるのが標準的なんじゃないか、などコメントお待ちしております。
一日一回自動でbrew updateをするスクリプト


作りました．
煩雑ですよね，`brew update` 
少なくても僕は煩雑です．偶に忘れるから余計．
基本的にパッケージは最新にしておいて，必要なら古いのを`check out`すればいいわけで．

というわけで，Rubyで書いた奴です．

https://github.com/HaiTo/AutoBrewUpdate
AutoBrewUpdate

使い方はReadmeにある通りです．
まず`git clone`してきて，そのディレクトリに移動し，
`bundle update`して`bin`に移動して`./autoupdate`とするだけです．
以上です．
毎日朝10時にupdateしてくれます．通知とかはありません．
`log`フォルダが自動的に生成され，そこにLogは書き出されますがそれだけです．

Growlで通知する様にはローカルでしてますが気が向いたら通知するバージョンの実行ファイルも作ります．

ちなみにスリープから復帰でもForeverは動き続けます(当たり前)
再起動したら死にます　:sunglasses:
既存のGitローカルレポジトリをGoogle Cloud RepositoriesにPushする。


Google Cloud RepositoriesはGoogle Cloud Plaftorm用のGitリモートレポジトリで、
ここにコードプッシュすることでappengineに自動リリースすることができたり、
Cloud Console内にあるWebIDE上で編集して即時反映、デバッグなどを行うことができます。

https://developers.google.com/cloud/devtools/repo/cloud-repositories

細かい話は上記資料を見ていただいたり、Developer Console内の「Source Code」メニューを見ていただければわかると思います。

で十分に便利なのですが、既存のプロジェクトをプッシュする方法がどこ見ても見つからなかったので、ちょっとメモを残します。

# 前提

Google Cloud SDKがインストールされていること。
環境はMac OSX 10.9.3です。

# やり方

## 1. Developer Console上でレポジトリ作る

ココ最近作成したCloud Projectの場合は、最初から以下のレポジトリが作成されているようです。

    https://source.developers.google.com/p/{project ID}

古いプロジェクトの場合は以下の手順で作ります。

1. [Developer Console](https://console.developers.google.com/project/)にアクセス
2. プロジェクトを表示
3. 左メニューから「ソースコード」→「リリース」を選択
4. 「新しいレポジトリを作成」をクリック

上記で作成されます。

## 2. Google Cloud SDKの認証を通しておく

自分の端末上で以下を叩きます。

    $ gcloud auth login

## 3. ローカルレポジトリにリモートレポジトリの追加 & 認証設定を行う

念の為に書いておくと、通常まだローカルレポジトリを作成していない場合は以下のコマンドを叩きます。  
※公式に書かれたやり方

    $ gcloud init <project ID>

そうするとローカルレポジトリを作ってるれるのですが、今回は既に作成済みのプロジェクトの設定を行います。
作成済みのローカルレポジトリ上で以下を叩きます。

     $ git remote add google https://source.developers.google.com/p/{project ID}
     $ git config --local credential.helper gcloud.sh

## 4. pushしてみる

してみてください。
多分Developer Console上で見えるようになります。

# まとめ

コードをDeveloper Console上で修正できたり、自動リリースが使えたりと、
Cloud Repositoriesは結構便利です。
プライベートなコードをとりあえずどっかにおいておきたいという目的でも使えるので素敵ですね。

なおどーでも良い話ですが、
レポジトリよりリポジトリ派だったので辛かった（多分レの方があってる？）
reveal.jsでスライド作る準備してみた。

```bash:セットアップ
npm install -g bower grunt-cli yo
npm install -g generator-reveal
git clone https://github.com/hakimel/reveal.js.git
mkdir test
cd test
yo reveal
grunt server
yo reveal:slide "slide title" --markdown
vim slides/slide-title.md
```

# 使い方

## webサーバを何か立ち上げておく。

```bash:
$ php -S 0.0.0.0:8000
```

http://localhost:8000/ にアクセス。

`index.html`と`./md/*.md` を編集することでスライドができる。

自分用に使いやすくしておいた。
https://github.com/tukiyo/reveal.js
PryでNyan Cat


[Pry](https://github.com/pry/pry)は言わずとしれたRubyのREPL環境である。
NyanCatが何なのかはよく分かっていないが、分からなくてもいいかなって思っているので、気になる人はググってみて欲しい。

Macでpry中にNyanCatを流す術を書き記す。
あまりやる意味は無い。

# mpg123 をインストール

MP3を再生するので、あらかじめmpg123をインストールしておく。
このためだけに。

```
brew install mpg123
```

# Pry をインストール

```
gem install pry
```

# nyan-catコマンドをインストール

pry中に `nyan-cat` コマンドを実行するには `install-command nyan-cat` しろと言われる。
別に `gem install nyancat` してもいい。それだけのこと。

```pry
$ pry
[1] pry(main)> nyan-cat

The command 'nyan-cat' is unavailable because it requires the following gems to be installed: nyancat
-
Type `install-command nyan-cat` to install the required gems and activate this command.
```

```pry
[2] pry(main)> install-command nyan-cat
Attempting to install `nyan-cat` command...
Installing `nyancat` gem...
Fetching: nyancat-0.2.0.gem (100%)
Installation of `nyan-cat` successful! Type `help nyan-cat` for information
```

# nyan-catコマンドを実行する

無事インストールが終わると `nyan-cat` コマンドが使えるようになっているはず。
あとはボリュームを最大にしてコマンドを打つのみ。

```pry
[3] pry(main)> nyan-cat
```

# おまけ

gemをインストールしただけなので、当然Pry上でなくても `nyancat` コマンドが使えるようになっている。
`-l` オプションを付けることで、Nyanサーバ(telnet)が起動しリモートからもニャンニャンできるようになるのだ！

```
$ sudo nyancat -l
Password:
[Tue Jul  1 16:27:52 2014] NyanCat::NyanServer :::23 start
```

```
$ telnet localhost 23
```

また、Pryには他にもしょうもないイースターエッグがある。
詳細はこちら↓。

https://github.com/pry/pry/blob/master/lib/pry/commands/easter_eggs.rb
SwiftでGCD(Grand Central Dispatch)を呼びやすくしてみる


SwiftでもObjective-Cと同様に、普通に`dispatch_async`関数などが用意されており、GCDが利用できるようなのですが、

**「大体バックグランドスレッドとメインスレッドを非同期で呼ぶぐらいしかやらないっしょ？？」**

...という事で、ちょっとした関数を書いてみました。

### 用意するもの

```Swift:
func dispatch_async_main(block: () -> ()) {
    dispatch_async(dispatch_get_main_queue(), block)
}

func dispatch_async_global(block: () -> ()) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
}
```

### 使い方

```Swift:
    func onTest(sender: AnyObject) {
        
        // HUDとか出す
        // showHUD()
        
        dispatch_async_global { // ここからバックグラウンドスレッド
            // なんか重い処理
            var res = 0
            for i in 1...10000 {
                res += i
            }
            
            dispatch_async_main { // ここからメインスレッド
                // HUD消したり
                // hideHUD()
                
                // 結果をUIへ表示したり
                self.label.text = "res=\(res)"
            }
        }
    }
```

ちょっとだけキーを打つ回数が減るだけなので、あまり恩恵は無いかもしれませんが、今まで`#define`を駆使してGCDを利用されていた方なんかはこんなやり方がしっくり来るのではないかと思います。
（保守する人が読みやすくなるかは怪しいですが。）

### 関連

* [Swiftのautoreleasepool等で注意する点](http://qiita.com/takabosoft/items/02628c1e188b0d6c5775)
Macでgo言語開発環境を作る


##インストール
brewで入れます。

```
$ brew install go
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/go-1.2.2.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.2.2.mavericks.bottle.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  http://golang.org/doc/code.html#GOPATH

`go vet` and `go doc` are now part of the go.tools sub repo:
  http://golang.org/doc/go1.2#go_tools_godoc

To get `go vet` and `go doc` run:
  go get code.google.com/p/go.tools/cmd/godoc
  go get code.google.com/p/go.tools/cmd/vet

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
?  /usr/local/Cellar/go/1.2.2: 3981 files, 115M
```

はいった。確認。

```
$ go version
go version go1.2.2 darwin/amd64
$
$
$
$go help
Go is a tool for managing Go source code.

Usage:

	go command [arguments]

The commands are:

    build       compile packages and dependencies
    clean       remove object files
    env         print Go environment information
    fix         run go tool fix on packages
    fmt         run gofmt on package sources
    get         download and install packages and dependencies
    install     compile and install packages and dependencies
    list        list packages
    run         compile and run Go program
    test        test packages
    tool        run specified go tool
    version     print Go version
    vet         run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

    c           calling between Go and C
    gopath      GOPATH environment variable
    importpath  import path syntax
    packages    description of package lists
    testflag    description of testing flags
    testfunc    description of testing functions

Use "go help [topic]" for more information about that topic.
```

はいってるぽい。


##HelloWorldしてみる。

まず、Hello.goファイルを作成して、以下のように書く。

```go,hello.go
  1 package main
  2
  3 import "fmt"
  4
  5
  6 func main() {
  7     SayHello()
  8 }
  9
 10 func SayHello() {
 11     fmt.Println("Hello World for go lang")
 12 }
```

ビルドする。

`go build hello.go`

すると、helloという実行ファイルができる。
ということで、実行してみる。


```
$ ./hello
Hello World for go lang
```

やっぽい。

##パスの設定

go getなどで、goのモジュールをどんどんインストールできるようなんだけど、
$GOPATHが設定されていないとおこられるよう。
どこでもいいので、今は、以下のように`.zshrc`に設定した。

```
18 if [ -x "`which go`" ]; then
19       export GOROOT=`go env GOROOT`
20       export GOPATH=$HOME/code/go-local
21       export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
22 fi
```

##最後に

net/httpモジュールがかなり便利らしく、簡単にwebサーバを立てられるみたい。
高速が売りなので、バックエンド側のPHPソースを入れ替えたい。

あと、revelなどのweb frameworkなどが使いやすいのか使ってみる予定。

以上。
Google Maps APIで2 地点間の方向を計算する

from(latlng)から、to(latlng)への方角を計算する。

```:js
var from = new google.maps.LatLng(34.86354508748316, 135.29815443984376); 
var to = new google.maps.LatLng(35.713768, 139.77725399999997); 

var heading = google.maps.geometry.spherical.computeHeading(from, to);

```

参考
[Google Maps JavaScript API v3 ジオメトリ ライブラリ](https://developers.google.com/maps/documentation/javascript/geometry?hl=ja)
メモリ使用率チェックスクリプト


```sh
$ cat totalmem_check.sh 
#!/bin/sh

# メモリ使用率が引数を上回っていたら偽(1)を返す
total=$(free | awk '/Mem/{print $2;}')
free=$(free | awk '/buffers\/cache/{print $4;}')
result=$((100 - 100 * ${free} / ${total}))
test ${result} -le $1

$ ./totalmem_check.sh 70
$ echo $?
0
$ ./totalmem_check.sh 60
$ echo $?
1
```
PowerShell に Git と Mercurial のブランチ名を表示する

[bashでgitとmercurialを使いやすくする - YAMAGUCHI::weblog](http://ymotongpoo.hatenablog.com/entry/20110115/1295082759) と [bashにgitとmercurialのブランチ名を表示する - アジャイルSEを目指すブログ](http://d.hatena.ne.jp/sinsoku/20110926/1316968305) を読んで、「お、PowerShell でもブランチ名表示できたら嬉しいな」って思ったので(スゴイ今さら感は否めませんが)書いてみました。

# 環境

* PowerShell 3.0
* Mercurial 2.9
* Git 1.9.0

# Git、Mercurial ブランチ名の取得

ブランチ名が欲しいだけなので、手でごりごりっと書いてしまいます。

```powershell
# Git 管理ディレクトリ
function git_branch {
    git branch 2>$null |
    where { -not [System.String]::IsNullOrEmpty($_.Split()[0]) } |
    % { $bn = $_.Split()[1]
        Write-Output "(git:$bn)" }
}

# Mercurial 管理ディレクトリ
function hg_branch {
    hg branch 2>$null | % { Write-Output "(hg:$_)" }
}
```

この結果、それぞれのブランチ名を表示するための文字列が取得できるようになります。

```text
$ git_branch
(git:master)

$ hg_branch
(hg:default)
```

# プロンプトをイケてる感じにする

何が言いたいかというと、山口さんの記事みたいに時刻とか出して、さらに色も付けたいんですよね。

それを実現しようとしたコードがこちら。

```powershell
# プロンプト表示を変更する
function prompt {
   # カレントディレクトリをウィンドウタイトルにする
   (Get-Host).UI.RawUI.WindowTitle = "Windows PowerShell " + $pwd

   # GitBashっぽく表示
   # カレントディレクトリを取得
   $idx = $pwd.ProviderPath.LastIndexof("\") + 1
   $cdn = $pwd.ProviderPath.Remove(0, $idx)
 
   # 現在時刻を取得
   $t = (Get-Date).ToLongTimeString()

   # ブランチ名を取得
   $gitBranch = git_branch
   $hgBranch = hg_branch

   # プロンプトをセット
   Write-Host "[" -NoNewline -ForegroundColor White
   Write-Host "$t " -NoNewline -ForegroundColor Green
   Write-Host $env:USERNAME -NoNewline -ForegroundColor Cyan
   Write-Host "@$env:USERDOMAIN $gitBranch$hgBranch" -NoNewline -ForegroundColor White
   Write-Host $pwd -NoNewline -ForegroundColor Green
   Write-Host "]
$" -NoNewline -ForegroundColor White
   return " "
}
```

profile に書いたり、この関数を直接実行することで、PowerShell のプロンプトがイケてる感じになります。

# 編集履歴

- 2014/08/17: `git_branch` に不要なブランチ名を除去するための条件を追加。

# see also

[カレントディレクトリをウィンドウタイトルに表示してプロンプトを短くする - Qiita](http://qiita.com/kmr_hryk/items/424bb80e14f04e762578)

[シェルでechoの文字に色をつける方法 - webネタ](http://d.hatena.ne.jp/R-H/20110119/1295452747)

[ConsoleColor 列挙体 - MSDN Library](http://msdn.microsoft.com/ja-jp/library/system.consolecolor.aspx)
Material Design まとめ


# Material Design とは

イノベーション・テクノロジーや科学の可能性と伝統的な Good Design と呼ばれる原則を融合したデザイン(視覚言語)。
 [Material Design](http://www.google.com/design/spec/material-design/introduction.html)


# Material Design の目的

さまざまなプラットフォームやデバイス・画面サイズにおいて、同様の体験ができるシステムを構築すること。

# Material Design の原則

## Metaphor

Material Metaphor (物質を例えたもの）はユーザーのシステム・アプリケーションの使い方の理解を手助けします。
例：
・フロッピーディスクのアイコンが"ファイル保存"を表す
・電子書籍ビューアがページめくりをする際に紙をめくるようなアニメーションをする

システム・アプリケーション上のオブジェクト（UI部品）がどのような見た目か（光り方や表面の色、動き）というのは、そのオブジェクトがどのように動き、振る舞い、他のオブジェクトとどのように関連するかを連想させることに大いに影響します。

## Bold, graphic, intentional

テキストがメインのデザインでは、グリッド・スペース・テキストサイズ・テキストカラーの使用方法がデザインに大きく影響します。これらの要素は全体で階層構造をつくり、意味を持ちます。使用するテキストカラー・サイズ、意図的にとったスペースはユーザー体験に影響します。

## Motion

UI上のオブジェクトの動き(Motion)はユーザーを注目させます。主なユーザー操作はオブジェクトの変更が発生する場所で行われます。UI 上のオブジェクトはユーザー体験が連続するよう振る舞わなければなりません。

ユーザーの注意をひき、連続性を維持するためにオブジェクトの動きには意味のあるもので適切なものであるべきです。ユーザー操作のフィードバックは些細なもの（でもはっきり分かるもの）であり、画面遷移やオブジェクトの変形などは効果的でかつ筋の通ったものであるべきです。

# アニメーション

## 信頼できるアニメーション

ユーザーが「UI 上のオブジェクトが"タッチ/ドラッグできる"と思える」と思えることは、アプリケーションの使い方を理解する上でとても重要です。オブジェクトの動きからユーザーは、「重たい・軽い」「変更できそう・できなさそう」などを感じ取ります。Material Design における Motion は美しいだけでなく、その動きからオブジェクト間の関連や機能・システム側の意図をユーザーに伝えます。

### Mass and Weight 

現実世界の物体を動かすためには、それを動かすだけの力が必要です。従って、すぐに動かし始めたり、すぐに止めることはできません。アニメーションもその原理に従わない（急に動いたり、急に止まったりすると）とユーザーにとって、意図しない・不快なものになります。

Material Design に Motion にとって最も重要な事は美しさ、単純さを犠牲にすることなく現実世界の法則を維持することです。下記のリンク先に例となるアニメーションが載っています。

 [Authentic Motion](http://www.google.com/design/spec/animation/authentic-motion.html#authentic-motion-mass-weight "Authentic Motion")

UI 上のオブジェクトが画面外から入ってくる場合、その速度も意識する必要があります。ユーザーは画面外からオブジェクトが入ってくる時は画面の境界に注目していません。そのため、オブジェクトが画面外から入ってくる時は、速 → 遅 と速度を変え、オブジェクトが画面外へ出て行く際は 遅 → 速 と速度を変えることで物理法則に合わせつつ、ユーザーの注意をひきます。

ただ、これは UI 上のすべてのオブジェクトにいえることではありません。より軽い・小さなオブジェクトをアニメーションさせる場合にはより速く加速させる必要があるかもしれません。 UI  上のさまざまなオブジェクトにどのようなアニメーションをさせるのが適当か検討する必要があります。

## Responsive Intraction - レスポンシブ インタラクション

レスポンシブ インタラクションを用いることでユーザーは自身の操作が正しく行われていると感じることができます。オブジェクトが美しく、論理的なレスポンスを返せばユーザーは満足し、場合によってはその操作をするのが好きになります。オブジェクトのレスポンスは意味のあるものでなければなりません。ランダムであったりしてはなりません。適切なレスポンスを行うことで、ユーザーは「こっちを触るとどうなる？こっちは？」とアプリをより深く知りたくなるでしょう。

Material Design ではアプリはユーザー操作に対してレスポンシブです。

・タッチ操作
・音声
・マウス/キーボード

レスポンシブインタラクションはアプリとユーザーとのコミュニケーションをより自然な方法で実現します。

レスポンシブインタラクションの例が下記リンク先に載っています。

 [Responsive Interacion](http://www.google.com/design/spec/animation/responsive-interaction.html# "Responsive Interacion")






# 参考
[Emacs] カーソルが乗っているシンボルをすべてハイライトする （auto-highlight-symbol 不要、higlight-symbolのみ）

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

`auto-highlight-symbol` という拡張が少し前に存在していて、
バッファ中にある、カーソルが乗っているシンボル（関数や変数など）と同じ名前のシンボルをすべてハイライトしてくれていたようです。

ググったところ、以下のページで`auto-highlight-symbol`が紹介されてました。

* http://qiita.com/akisute3@github/items/4348839edcf510bdf71d
* http://shibayu36.hatenablog.com/entry/2013/10/29/221427
* http://blog.tkr.jp/entry/2013/07/20/142425

さて、導入しようとしたところ、 github.comのページがリンク切れとなっており、導入できません。

代替を探したところ、任意のシンボルをハイライトする`highlight-symbol`にその機能が入っていたので、導入しました

スクリーンショット
----------------
![Screenshot - 2014年07月02日 - 06時41分23秒.png](https://qiita-image-store.s3.amazonaws.com/0/37442/435ed5e0-efb5-ab67-e0d6-948aaaf78819.png)

`highlight-symbol`の導入
======================

[[Emacs] 特定のシンボルをハイライトする (highlight-symbol)](http://qiita.com/aKenjiKato/items/8928fe57ab1fb06b36ca) を参考に導入・設定してください。

`auto-highlight-symbol`と同等機能の実現
=====================================

以下を実行することで、カーソルが乗っているシンボルを自動的にハイライトしてくれます。

```
M-x highlight-symbol-mode
```

また、特定のモードでのみ有効にする場合、以下を`.emacs.d/init.el`などに記述すると良いでしょう。

```el:emacs-lisp-modeの場合
(add-hook 'emacs-lisp-mode-hook 'highlight-symbol-mode)
```

マイナーモードですので、各モードごとに設定していく必要がありそうです。


参考
====

* https://github.com/nschum/highlight-symbol.el/blob/master/highlight-symbol.el
* https://code.google.com/p/dea/source/browse/trunk/my-lisps/highlight-symbol-settings.el
[Emacs] 特定のシンボルをハイライトする (highlight-symbol)

`highlight-symbol` ってどんなのですか
===================================

こんな感じに、同じ名前のシンボルをいっぺんにハイライトしてくれます。

![Screenshot - 2014年07月02日 - 06時29分14秒.png](https://qiita-image-store.s3.amazonaws.com/0/37442/b077c37b-89d6-1f73-3e89-0407c07b939f.png)

また、ハイライトされたシンボルを`query-replace`する機能もあります。

導入方法
=======

インストール
-----------

### `package-install`からの場合

以下でインストールする。

```
M-x package-install RET highlight-symbol
```

### `Cask`の場合

以下をファイル`Cask`に追加して、コマンド`cask`を実行する

```el:Cask
(depends-on "highlight-symbol")
```

設定
----

[作者のGithub](https://github.com/nschum/highlight-symbol.el)を参考に、`.emacs.d/init.el`へ記述を追加する

```el:作者によるデフォルト設定
;; (require 'highlight-symbol) ;; Cask や package-install からの場合はauto-loads cookie があるから不要
(global-set-key [(control f3)] 'highlight-symbol-at-point)
(global-set-key [f3] 'highlight-symbol-next)
(global-set-key [(shift f3)] 'highlight-symbol-prev)
(global-set-key [(meta f3)] 'highlight-symbol-query-replace)
```

### キーバインド解説

* `Ctrl-F3`
    * カーソルが乗っているシンボルをハイライトする
    * ハイライトされたシンボルの上では、ハイライトを解除する

以下は、ハイライトしているシンボルのいずれかの上でのみ有効である

* `F3` 次のハイライトしているシンボルへ移動する
* `Shift-F3` 前のハイライトしているシンボルへ移動する

* `Alt-F3` ハイライトしているシンボルを置換する

参考
====

* [Emacsでのテキストハイライトの話 - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2013/10/29/221427)
    * ここを見て`highlight-symbol`を知りました

蛇足
====

Xubuntu 14.04 では`Alt-F3`がランチャに取られるので困ってます。