OmniAICreator/Qiita-1.07M huggingface dataset:
pharを使ってみる

[pharを使ってみる](http://qiita.com/rana_kualu/items/d868604a1f54c2f93a7c) / [pharアーカイブを作成](http://qiita.com/rana_kualu/items/4b2ef7bfff83939d7ef5) / [pharでWebアプリを作ってみた](http://qiita.com/rana_kualu/items/e437fff6f558c053cc41)

pharの使用法の記事は、わざとわかりにくく書いてるんじゃないかって疑いたくなるほど何言ってるのかわかりません。
http://php.net/manual/ja/phar.using.intro.php

あとpharでググってもマニュアルのコピペサイトと「PHP5.3ではpharという機能が使えるぜ！」みたいな記事ばっかりで、実際に使ってみたという話が全然出てきません。
どういうことなんですかね。
仕方ないのでここで実際に使ってみます。

pharとは、要するに単に複数のファイルをひとつにまとめられるというだけのことみたいです。
概念としては、zipみたいに複数のファイルをひとつに固めておいて、使うときに特定のファイルだけ取り出すというイメージでしょうか。
というか実際にpharとzipの変換とかもできたりします。

とりあえず使ってみましょう。
[こちら](http://file.yuubiseiharukana.blog.shinobi.jp/20110722-TestClasses.phar.zip)に簡単なpharファイルを用意しました。
中には5つのファイルがありますが、4つはこんな中身のないクラスです。

```php
<?php
	public static function getClassName(){
		function getClassName(){
			return __CLASS__;
		}
	}
```

もうひとつは画像ファイルです。
ではこれを読み込んでみます。

```php
<?php
	require_once('phar://TestClasses.phar/TestClass1.php');
	require_once('phar://TestClasses.phar/TestClass2.php');
	print(TestClass1::getClassName());//"TestClass1"
	print(TestClass2::getClassName());//"TestClass2"
```

非常に簡単です。
`phar://`はpharストリームラッパーで、これからpharファイルを指定することを示しています。
次の`TestClasses.phar`がpharファイル名、最後の`TestClass1.php`がpharアーカイブ中の具体的にインクルードしたいファイル名となります。
このように、pharアーカイブは一見ひとつのファイルですが実質的に複数のファイルとして取り扱うことができ、ファイルをまとめて配布したいときなどに便利です。

ちなみにメモ帳に突っ込めばわかりますが基本的に単なるテキストなので、プログラムの隠蔽には使えません。

ところでpharってなんて読むんですかね。ぴゃー？



※2011/07/22に[自ブログ](http://yuubiseiharukana.blog.shinobi.jp/Entry/550/)で書いた内容です。
当時は実際ほとんど使ってるところがなかったのですが、最近はcomposer.pharをはじめ使われている例もわりとあるようです。
Ruby 2.0.0-p247 + Rails 4.0.0 + Heroku

## アプリ名

```
my_app
```

## バージョン

* Rubyバージョン

```
ruby -v
----------
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
----------
```

* Railsバージョン

```
rails -v
----------
Rails 4.0.0
----------
```

----

## App Setup

### 作業ディレクトリ移動

```
cd ~/labo
```

### Railsアプリ作成

* 設定

```
cat ~/.railsrc
----------
--skip-bundle
--skip-test-unit
----------
```

* アプリ作成

```
rails new my_app
```

```
cd my_app
```

### Gemfile／Gemインストール

Gemfile

```rb
ruby '2.0.0'

gem 'haml-rails'
gem 'minimum-omniauth-scaffold'
gem 'action_args'
gem 'html5_validators'
gem 'puma'
gem 'kaminari'
gem 'rails_config'
gem 'tapp'
gem 'awesome_print'
gem "exception_notification", "~> 4.0.0.rc1"
gem 'i18n_generators'

group :development do
  gem 'pry-rails'
  gem "rails-erd"
  gem 'binding_of_caller'
  gem "erb2haml"
  gem 'quiet_assets'
end

group :development, :test do
  gem "sqlite3"
  gem 'rspec-rails'
end

group :production do
  gem 'rails_12factor'
  gem 'pg'
  gem 'newrelic_rpm'
end

# Use sqlite3 as the database for Active Record
#gem 'sqlite3'
```

```
bundle install --without production
```

### OmniAuth用スキャフォールド作成

```
rails g minimum:omniauth:scaffold
```

### マイグレーション

```
rake db:migrate
```

### Railsサーバ起動

```
rails s puma
----------
=> Booting Puma
=> Rails 4.0.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Puma 2.3.2 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:3000
----------
```

### ローカルサイト確認

[http://0.0.0.0:3000/](http://0.0.0.0:3000/)

----

## GitHub

### GitHubリポジトリ作成

[https://github.com/repositories/new](https://github.com/repositories/new)

```
Repository name
[ my_app ]
    
Description (optional)
[ (description.) ]
    
※チェック無し：Initialize this repository with a README
Add .gitignore: None
```

```
git init && git add . && git commit -m "First commit"
```

### GitHubリポジトリアドレス

```
HTTP => SSH
```

### GitHubリポジトリプッシュ

```
git remote add origin git@github.com:MY_NAME/my_app.git
git push -u origin master
```

## Heroku

### Herokuアプリ作成

```
heroku create my-app
```

### Herokuプッシュ

```
git push heroku master
```

### Herokuタイムゾーン設定

```
heroku config:add TZ=Asia/Tokyo
```

### Herokuマイグレーション

```
heroku run rake db:migrate
----------
Running `rake db:migrate` attached to terminal... up, run.9640
WARNING: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.7.6
==  CreateUsers: migrating ====================================================
-- create_table(:users)
   -> 0.0922s
==  CreateUsers: migrated (0.0935s) ===========================================
----------
```

### Herokuページオープン

```
heroku open
```

### Heroku公開サイト

https://my-app.herokuapp.com/
web-mode のコメントアウトのためのキーバインドを `C-;` から `C-c C-;` に変更

web-modeが便利そうなので入れてみたけど デフォルトでは `C-;` にカーソルがある行のコメントアウト機能が割り振られてて、`C-;`には M-x をバインドさせてる自分には都合が悪かったので `C-c C-;` に変更した。

関数名調べたり、アルファベット以外のキーバインドの方法とかEmacs熟練者には常識でも自分のレベルだと色々とわからなかったのでここに残しておきます。

```~/.emacs.d/inits/30-web.el
(require 'web-mode)
(define-key web-mode-map  (kbd "C-;") nil)
(define-key web-mode-map  (kbd "C-c C-;") 'web-mode-comment-or-uncomment)
```

でOK。
部分テンプレートにlocals:を使って変数を渡す時は partial:もつけないとエラー

部分テンプレートに変数を渡そうとして少しハマったので記録

まず初めはこんな感じ

```erb
<%= render "list_footer", username: @username %>
```
もう一つ変数を増やしたかったので @listnameを追加

```erb
<%= render "list_footer", locals: {username: @username, listname: @listname} %>
```

→「listname or username なんて変数ねーよ」と怒られる

## 解決策

`locals`などのキーを指定するなら全て指定、指定しないなら一つも指定してはいけないらしい。引数の解釈の問題かな？

つまり

```erb
<%= render "list_footer", {username: @username, listname: @listname} %>
```

か

```erb
<%= render partial: "list_footer", locals: {username: @username, listname: @listname} %>
```

のどちらかにしましょう。
なぜ192.168.x.xなのか。

プライベートIPアドレスは大体192.168で始まりますよね。
IPアドレスの勉強をしていたときは特に何も考えずに「192.168はプライベートIPアドレス」と考えてましたが、
そういやなんで192.168を使うんだろうと。

プライベートIPアドレスは閉じた世界のアドレス（いわゆる社内用のアドレスとか）なので、他の会社さんの閉じたアドレスとかぶってもなんら問題ないんです。

ということは別に192.168からはじまらなくても閉じた世界なら何でもいいんじゃないのかなと。

と思ったら
他のグローバルIPアドレスとかぶったらどっちに通信してよいかわからないから、ダメなんですね。

ちなみに調べたらプライベートIPアドレスは何を使ってよいか決まっていて
10.
172.16
192.168
の3種類に決まってるようです。
そういや10から始まるやつは見たことありました。。。

でもまぁそれは人間が決めたルールなだけなので、
割り振られていないグローバルIPアドレスを割り振った場合、
問題なく通信できるのかなと予想されますが、
そこまで潤沢な資機材がないので、あきらめます。
もしやったことがある人がいたら実現可能なのか教えていただければ幸いです。
tmuxで色んなホストにsshする時に便利な.ssh/config

```:ssh-config
Host aaa xxx
  PermitLocalCommand  yes
  LocalCommand tmux rename-window %n
```

ホスト側の `.ssh/config` に書いておくことで ssh した時に tmux のウィンドウの名前が変わる

名前を手で変える場合は `prefix ,` で変える

追記（2013/10/5）：
`Host *` にしてしまうと git で push するときなどにも動いてしまうのでやめた方がいいと思います
IE6でjQueryUi1.9を使うとアイコンが黒塗りになる

[jQuery UI 1.10 Upgrade Guide](http://jqueryui.com/upgrade-guide/1.10/#removed-support-for-ie6) では、 IE6 のサポートは jQuery UI 1.9 までと書いてある。

> IE6 usage has dropped to a low enough point that jQuery UI no longer finds it necessary to support. As of 1.10.0, some portions of jQuery UI may not work properly in IE6. __If you need to continue to support IE6, use the latest jQuery UI 1.9 release.__

でも、実際に IE6 で jQuery UI 1.9 を使うと、アイコンが全て黒塗りになってしまう。

__jQuery UI 1.9__
![ie6_jqueryui1.9.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/e3e43ca1-ac44-249b-1ee6-4abf7d9c14ca.jpeg)
 
jQuery UI 1.8 なら問題無くアイコンも表示される。

__jQuery UI 1.8__
![ie6_jqueryui1.8.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/9809a2b6-9c46-da2c-8cbf-378663798511.jpeg)

1.8 は [ここ](http://blog.jqueryui.com/2012/09/jquery-ui-1-8-24/) からダウンロード可能。
Rubyのファイルを開くと `# -*- coding: undecided -*-` になってしまう時の対処法

コメントに日本語入れると `unknown encoding name: undecided`ってエラーが出たので確認してみると一行目が `# -*- coding: undecided -*-` になってる。何でや。

とりあえず `# -*- coding: utf-8 -*-`に書き直して保存してみたら驚いたことに勝手に `# -*- coding: undecided -*-` に修正される。なにこれこわい。

多分 rcodetool あたりの挙動だと思うけど、どうやら自動的に現在開いてるバッファのエンコードに合わして修正されるらしい。

## 対策

`M-x set-buffer-file-coding-system` (もしくは `C-x RET f`)で utf-8を指定すれば保存すれだけで勝手に `# -*- coding: utf-8 -*-` に直ってくれる。なるほど便利。

Emacsでファイルを作成する時にデフォルトでutf8を使うようにしてたはずだけど何でasciiでファイルが作られてるんだろう？ Railsの自動生成だったらそうなるのかな？

## 参考

Emacsの文字コード指定
http://www.rsch.tuis.ac.jp/~ohmi/literacy/emacs/emacs-jcode.html
svn diff を色つきで見る

`svn diff` をした時に色がついていないのでやる気がなくなります

なので色をつけましょう

[Ubuntu - colordiff で diff をもっと快適に - Qiita [キータ]](http://qiita.com/catatsuy/items/8bafef2a60762a1c9f0f)

を参考に colordiff を入れておきます

そこで `.subversion/config` に以下の記述を入れます

    diff-cmd = colordiff

これで `svn diff | less` とすれば `git diff` と同じ感じで使えます
ローカルのgit repositoryをclone


ローカルマシンにjenkinsとsonarを立ててcheckstyle的なことをしたりするように設定したのですが、その際に今開発中のソースを対象にしたいので以下のようにしました。

```
 git clone --no-hardlinks /path/to/repository
```

これでjenkins jobの下のワークスペースにコピーします。
PHPのcURL関数のプロキシオプションについて調べる



* [PHP: cURL - Manual](http://www.php.net/manual/ja/book.curl.php "PHP: cURL - Manual")

だからなんだって事はないけど、ライブラリを改造する必要があったのでまとめただけ。

| オプション | value への設定値 | 注記 |
|-----------|------------|------------|
| CURLOPT_HTTPPROXYTUNNEL       |TRUE にすると、指定された HTTP プロキシを介してトンネルします。 |          |
| CURLOPT_PROXYAUTH     | プロキシ接続に使用する HTTP 認証の方法。 CURLOPT_HTTPAUTH で説明したのと同じオプションを 指定可能です。プロキシ認証でサポートされているのは、今のところ CURLAUTH_BASIC および CURLAUTH_NTLM のみです。 |    cURL 7.10.7 で追加されました。    |
| CURLOPT_PROXYPORT | プロキシ接続のポート番号。このポート番号は、 CURLOPT_PROXY で指定することも可能です。 | |
| CURLOPT_PROXYTYPE | CURLPROXY_HTTP（デフォルト）あるいは CURLPROXY_SOCKS5。 | cURL 7.10 で追加されました。|
| CURLOPT_PROXY| リクエストを経由させる HTTP プロキシ。| |
| CURLOPT_PROXYUSERPWD|プロキシに接続するためのユーザー名とパスワード。 "[username]:[password]" 形式で指定します。||



こんな感じで設定

```php
// 初期化
$ch = curl_init();

// 設定
curl_setopt($ch, CURLOPT_URL, 'https://api.facebook.com/');
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
curl_setopt($ch, CURLOPT_PROXYPORT, '8080');
curl_setopt($ch, CURLOPT_PROXY, 'http://xxx.xxx.xxx.xxx');

// 実行
$reply = curl_exec($ch);
```
参考にさせていただきました。
[phpのcurlが動かない。 | In Mars](http://cave.under.jp/mars/?p=55 "phpのcurlが動かない。 | In Mars")
Widget先やRequire先のUIにstyleやeventを簡単に適用する方法


これだけだとtssの内容やonClickイベントがhogeに適用されない

```xml:index.xml
<Require id="button" src="button" onClick="click" />
```
```javascript:index.tss
"#button": {
	title: L('button')
}
```
```xml:button.xml
<Button id="hoge"></Button>
```

なので、button.coffeeに以下を追加するとそれっぽく適用される

```javascript:button.coffee(button.js)
args = arguments[0] or {}

delete args.id
delete args.__parentSymbol
$.hoge.applyProperties args

exports.on = $.hoge.addEventListener
exports.off = $.hoge.removeEventListener
exports.trigger = $.hoge.fireEvent
```
NOT IN (NULL) に苦しめられる昼下がり

Railsでアプリケーション開発していて、

```ruby:some_batch.rb
@jobs = Job.where(company_id: user.companies.map(&:company_id))
```

とやりたくなることが多々あると思う。
ところがこいつ、危険である。この時はMySQLでやっていたのだが、

```ruby
irb(main):201:0> jobs = Job.where(company_id: user.companies.map(&:company_id))
  Job Load (0.4ms)  SELECT `jobs`.* FROM `jobs` WHERE `jobs`.`company_id` IN (NULL)
=> []
irb(main):202:0> jobs = Job.where.not(company_id: user.companies.map(&:company_id))
  Job Load (0.4ms)  SELECT `jobs`.* FROM `jobs` WHERE (`jobs`.`company_id` NOT IN (NULL))
=> []
```

…えっ？

**INの時もNOT INの時も空っぽになったよ！？**

## なぜなのか

注目すべきは、

```sql
SELECT `jobs`.* FROM `jobs` WHERE `jobs`.`company_id` IN (NULL)
```

と、

```sql
SELECT `jobs`.* FROM `jobs` WHERE (`jobs`.`company_id` NOT IN (NULL))
```

の2つのSQL。
`IN (NULL)`だろうが`NOT IN (NULL)`だろうが、どうやら結果は`false`になるらしいのだ。

解決方法としては`EXISTS`を使うという手がある。

```sql
SELECT `jobs`.* FROM `jobs` WHERE EXISTS ( SELECT * FROM ……
```

が、Rails…というかActiveRecordにはEXISTSを扱うためのAPIは存在せず、`where`の中にベタ書きしなければならない。

どっかの記事で誰かが「 **ActiveRecordのキモは生SQLとARelをいかに上手く組み合わせるか** 」的なことを書いていたけど、まぁ時間がない俺はもっと簡単な手を使うことにした。

## どっちにしてもサブクエリの出番だ

```ruby
jobs = Job.where(company_id: user.companies.select(:company_id))
jobs = Job.where.not(company_id: user.companies.select(:company_id))
```

はい。

こうすることで、

```sql
SELECT `jobs`.* FROM `jobs` WHERE `jobs`.`company_id` IN (SELECT company_id FROM `companies` INNER JOIN `company_users` ON `companies`.`id` = `company_users`.`company_id` WHERE `company_users`.`user_id` = 1)
```

こんなような感じのSQLを組み立てることが出来る。
ガチンコサブクエリなので、ループの中などでやろうとするとN+1問題が発生してサーバー負荷の高まりを感じるが、そうでなかったりするならむしろこっちで実装しておいて、時間ができたらリファクタリングする、という道をたどってもいいのではないか。
スゲい簡単なPerl入門 9th Day  PerlとかRubyとかコマンドで UUID を作るときのそれっぽい方法

UUIDを作るとき、色んな方法があるとは思いますが、備忘録です。

# UUIDとは

* Universally Unique Identifier
* 汎用一意識別子

> 一意に特定可能な識別子。
> 16バイトの数値で表される。
> 例: a7c4eab7-1540-47bd-9302-7fda5df5c54e

# UNIXコマンド

```cl:uuidgen
$ uuidgen -r
$ uuidgen -t
```

> -r (デフォルト)
> 乱数を使って UUID を生成
> -t
> 現在時刻とMACアドレスを元に生成

# プログラム

Perlだとこんな感じ。

```cl:InstallLibrary
$ sudo perl -MCAPN -e 'install Data::UUID'
```

```pl:UUID
use Data::UUID;
my $gen_uuid = Data::UUID->new()->create_str();
```

とか

```pl:namespace
use Data::UUID qw(NameSpace_URL);
my $gen_uuid =  Data::UUID->new->create_from_name_str(NameSpace_URL, "hoge.hoge.jp")
```

とか。

ちなみにRubyだとこうらしい。

```rb:uuidtools
require 'uuidtools'
p UUIDTools::UUID.ramdom_create.to_s
```

で、中身はと言うと、だいたいこんな感じかな？

*現在の時間を取得*
             *↓*
*すごい難しい乱数作成*
で、sha1と現在時刻を使うらしいのでこんな感じかなぁって書いてみた。

```pl:SHA1&Time
use Digest::SHA1 qw(sha1_hex);
use Time::HiRes qw(gettimeofday);

sub _tsuskuruzo {
   略
  my $uuid = substr( sha1_hex( gettimeofday . $hoge ), 0, $byte_num);
}
```
情弱のためのRedshiftまとめ

# 情弱のためのRedshiftまとめ
先日、Redshift童貞を卒業しました情弱です。卒業するにあたり困り事がいくつかあったので、そのあたりまとめを作りたいと思います。

## そもそもこれなに？
情弱な私はここからのスタートです。データウェアハウス（DWH）でテラバイトクラスでも分析出来るらしいということはわかっていましたが、そこから先がよくわかりません。

これ、つまるところでいうと **集計がめちゃくちゃ速いPostgres** です。なので、これを使えばおばあちゃんの病気が治るとかそういった素敵なものではなく、create tableしてデータ入れて、group byしてcount()やsum()するだけです。ただ、DWH用途に特化しているだけあって、通常のPostgresにはない特徴がいくつかあります。

## ふつうのPostgresとの違い
私がぱっと気付いたものなので、もっとたくさんあるはずですが、多分主なヤツ。

- サポートしてるデータ型が少ない　※text型はエラーにならないけどvarchar(256)にされるとか
- ユニークキー等の制約は基本効かない
- データ投入の基本はS3のCSVかDynamoから。しかも並列インポート出来る
- クラスタノードを増やすことで、だいたいリニアに性能上がる
- sortkey, distkeyといった普通に無いヤツがいる
- 列指向なので`select *`は基本ダメ。必要なカラムだけ採る
- alter table基本NG　※再インポート前提と思っておくと気楽

## つかいどころ
私が使ったのはログ解析です。とはいえ、いわゆるRDBベースなのでテーブルを作らないといけないですし、高速に検索する場合はある程度情報を切り出して別カラムに入れる等の準備が必要です。というわけで、そこでやったことのまとめ。

### ログ情報のタグ付けとCSV化
採りたい情報はある程度限られていたので、生ログをスクリプトに放り込んで、必要な情報を別カラムに書き出しました。また、その際にDateTimeのフォーマットをPostgresが解釈可能なように直したり、テキストを256文字以下に納める等の整形処理をしています。

### ログファイルの分割
S3からの並列インポートが出来るので、一定量で分割してあげます。こんな感じ。これをS3に上げます。

```bash:ls_result
-rw-rw-r-- 1 ec2-user ec2-user   6182167 Oct  2 07:02 access_log-130901.csv.1.gz
-rw-rw-r-- 1 ec2-user ec2-user   5422438 Oct  2 07:05 access_log-130901.csv.2.gz
-rw-rw-r-- 1 ec2-user ec2-user   6343272 Oct  2 07:09 access_log-130901.csv.3.gz
-rw-rw-r-- 1 ec2-user ec2-user   6250919 Oct  2 07:13 access_log-130901.csv.4.gz
-rw-rw-r-- 1 ec2-user ec2-user   7215392 Oct  2 07:16 access_log-130901.csv.5.gz
-rw-rw-r-- 1 ec2-user ec2-user   6502100 Oct  2 07:20 access_log-130901.csv.6.gz
-rw-rw-r-- 1 ec2-user ec2-user   6172786 Oct  2 07:23 access_log-130901.csv.7.gz
-rw-rw-r-- 1 ec2-user ec2-user   5950203 Oct  2 07:27 access_log-130901.csv.8.gz
-rw-rw-r-- 1 ec2-user ec2-user   5311772 Oct  2 07:30 access_log-130901.csv.9.gz
```

### Redshiftへのインポート
普通にpostgresクライアントで接続し、普通のpostgresっぽく操作します。こんな感じ

```sql:sql_result
CREATE TABLE access_logs (
  date timestamp sortkey,
  message varchar(256),
  user_name varchar(256),
  ipaddr varchar(15),
  error_type varchar(256)
);

copy access_logs from 's3://bucket/data.csv' gzip credentials 'aws_access_key_id=aaaaaaaaaaaa;aws_secret_access_key=aaaaaaaaaaaaaaaaaaaa' delimiter '|';

```

ここでのポイントはS3のパラメータ部分で、この例だと`data.csv`というファイル名になっていますがこれ、分割していてもそれを追っかけてくれるのと、なおかつそれがgzip圧縮されていても追っかけてくれます。なので、実体は以下のような状態で大丈夫です。

```bash:filelist
s3://bucket/data.csv.1.gz
s3://bucket/data.csv.2.gz
s3://bucket/data.csv.3.gz
s3://bucket/data.csv.4.gz
```

### ふつうにselect
Postgres対応のBIツールとかも使えますが、詳しくないのでそこは割愛。普通にselect文を発行していろいろやってください。

## さいごに
Redshiftは何を入れても何でも出来るものではなくて、「できることが限定的な反面、かなり速い処理が出来るもの」だと思ってます。なので、いろいろ考えるのであればHadoop系の方がやれるでしょうし、お手軽さで言えばスキーマレスなもの（JSONベースとか）の方が強いと思います。使いどころはちょっと難しいですが、数百億件を普通に処理できる時間貸しはRedshiftだけだと思うので、うまく付き合っていきたいところですね。
tmuxの新ウインドウ作成しつつ名前変えつつのSSH


```
tmux new-window -n localhost 'ssh localhost'
```

ウィンドウタイトルってzshとかになるけど、ホスト名とかにしないと知らない内に本番環境でデータ吹っ飛ばしたりするから注意な。

[Manpage of TMUX](https://bytebucket.org/ns9tks/tmux-ja/wiki/tmux-ja.html)
コマンドを知ればtmux起動時にいろいろできていい男になれる。
CiscoとHP H3Cのスイッチのコマンドを打ち間違えないために

CiscoスイッチとHP H3Cスイッチのコマンドを打ち間違えないために。

## コマンド対応表

毎回間違えるしそろそろ作っておこうと思った。補完が効くから良いんだけど、結構1文字目違うのよね……

打ち間違えるたびに更新していく予定。

| Cisco | H3C |  |
|:-----------|:-----------|:------------|
| no     | undo    | 設定取り消し           |
| show | display | 各種情報を表示する |
| enable | system-view | 特権モードに入る | 
| configure | - | 設定に入る(H3Cはsystem-viewでそのまま変更できる) |
| exit | quit | モードを抜ける |
| write | save | 設定を書き込む |
| show running-config | display current-configuration | 稼働中の設定を表示 | 

## インターフェース関連 

| Cisco | H3C |  |
|:-----------|:-----------|:------------|
| switchport access vlan `VLAN No.` | port access vlan `VLAN No.` | VLANに割り当てる |

## ルーティング関連

| Cisco | H3C |  |
|:-----------|:-----------|:------------|
| ip route `network` `netmask` `address` | ip route-static `network`  `netmask` `address` | スタティックルートを設定する |
## 

用語対応表も欲しい。
最近YAMAHAスイッチも触る機会があるので、これも対応表が欲しいけど、こっちはコマンドの構造が結構違うから難しいかも。
もともと組み込まれているjQueryのバージョンとバッティングしないためのサムシング

```html:jquery_noconflict.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="ja" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js" type="text/javascript" charset="UTF-8"></script>
<script type="text/javascript">
<!--

var jqOld = jQuery.noConflict();


document.write(jqOld().jquery);



-->
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript" charset="UTF-8"></script>
<script type="text/javascript">
<!--

var jqnew = jQuery.noConflict();
$ = jqOld;

document.write($().jquery);



-->
</script>
</head>
<body>
</body>
</html>

```
github の pull req ブランチを手元に持ってくる方法

Pull Request すると github 上では `pull/xxx/head` と `pull/xxx/merge` というブランチが作られる。

`pull/xxx/head` は Pull Request を送ったブランチの head (最新状態)、`pull/xxx/merge` はマージ対象のブランチとマージした結果の状態を持つブランチである。

それを手元に持ってきて操作することができる。

```
$ git fetch origin '+refs/pull/*:refs/remotes/pr/*'
 * [new ref]         refs/pull/1/head -> pull/1/head
 * [new ref]         refs/pull/1/merge -> pull/1/merge
 * [new ref]         refs/pull/10/head -> pull/10/head
 ... (abbrev)
```

チェックアウトするにはその後

```
$ git checkout -b foobar pull/10/head
```

とすればよい。手元に持ってきて動作確認する際に、pull request を送った人のレポジトリを git remote add しなくて良いので便利。

See also [git current-branch, git fetch-pulls, git pull-dry-run など git alias ネタ](http://qiita.com/sonots/items/fbbcfdba6d7d016fbadb)

## FYI: pull/xxx/merge の状態について

初期状態として pull/xxx/merge は Conflict が起きると作られない。
また、PullRequestをDraftで作った場合でもpull/xxx/merge は作成されない。

一度 pull/xxx/merge が作られた後に、Conflict がおきる commit を push すると、 Conflict しない場合は `pull/xxx/merge` が更新され、Conflict した場合は `pull/xxx/merge` が更新されない、という挙動をする。
ディレクトリのXCOPY

```
XCOPY /E /O /I C:¥FROM¥DIR TO¥DIR
```

コピー先のディレクトリは、既に存在している場合以外はコピー元のディレクトリ名を指定してやる必要がある。

FROM¥DIR TO
としてしまうと、FROM¥DIR¥* が TO¥* にコピーされる。
特に複数のディレクトリをコピーしようとした時に注意。
CentOSにPHP5.5をインストール


remi(Les RPM de Remi - Repository)のrpmパッケージを使います。
http://rpms.famillecollet.com/

remiはrpmの依存関係の問題が少ない印象であり、個人的にオススメなリポジトリです。

まずepelのリポジトリを追加します。次は64ビット用のパスです。32ビット版はx86_64をi386に変更してください。

```
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.x9joay: ヘッダ V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
準備中...                ########################################### [100%]
   1:epel-release           ########################################### [100%]
```

次にremiのリポジトリを追加します。

```
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
http://rpms.famillecollet.com/enterprise/remi-release-6.rpm を取得中
警告: /var/tmp/rpm-tmp.hGZNcG: ヘッダ V3 DSA/SHA1 Signature, key ID 00f97f56: NOKEY
準備中...                ########################################### [100%]
   1:remi-release           ########################################### [100%]
```

/etc/yum.repos.d/remi.repoを確認します。
remi-php55がPHP5.5用に追加されたリポジトリです。

```
$ /etc/yum.repos.d/remi.repo

[remi]
name=Les RPM de remi pour Enterprise Linux 6 - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/6/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[remi-php55]
name=Les RPM de remi de PHP 5.5 pour Enterprise Linux 6 - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/6/php55/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/6/php55/mirror
# WARNING: If you enable this repository, you must also enable "remi"
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
（省略）
```

yum listで提供されているパッケージを確認できます。
php以外にインストールしたいパッケージがあれば選別します。

```
$ yum list --enablerepo=remi --enablerepo=remi-php55 | grep php
 * remi-php55: mirror.smartmedia.net.id
apc-panel.noarch                         3.1.15-0.3.svn329913.el6.remi.1 remi-php55
apcu-panel.noarch                        4.0.2-2.el6.remi.1              remi-php55
cups-php.x86_64                          1:1.4.2-50.el6_4.5              updates
eclipse-phpeclipse.noarch                1.2.1-6.el6                     epel   
fedora-review-php-phpci.noarch           0.5.0-1.el6                     epel   
graphviz-php.x86_64                      2.26.0-10.el6                   base   
nntpgrab-php.x86_64                      0.7.2-1.el6                     epel   
php.x86_64                               5.5.4-1.el6.remi                remi-php55
```

ではPHP5.5をインストールします。
ここでは複数のパッケージをインストールしていますが、とりあえず確認するだけならphpのみで構いません。
**変更2014/05/15** php-mysqlをphp-mysqlndに変更、php-opcacheを追加。

```
$ sudo yum install --enablerepo=remi --enablerepo=remi-php55 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug
（多いので省略）
```

phpコマンドのバージョン確認。

```
$ php --version
PHP 5.5.4 (cli) (built: Sep 19 2013 14:42:22) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
```
kvmで仮想マシンを削除出来ない時の対処

https://bugzilla.redhat.com/show_bug.cgi?id=735457

snapshotが原因で削除出来ない場合。
`virt-manager`から削除できないため`virsh`を使う。

```bash:
$ virsh -c qemu:///system
virsh> virsh undefine demo
error: Requested operation is not valid: cannot delete inactive domain with 1 snapshots

virsh> undefine --snapshots-metadata demo

virsh> virsh undefine demo
```
Cocoa Applicationでboostをやる。

環境
OSX 10.6.8
Xcode 4.2
boost 1.54
##1. Cocoa Applicationを作成する。
##2. boostをインストールする。
sudo port install boost
##3.boost.hとboost.cppを書く。
```c++:boost.h
//
//  boost.h
//  boost
//
//  Created by  on 13/10/04.
//  Copyright (c) 2013 __MyCompanyName__. All rights reserved.
//
#ifndef boost_boost_h
#define boost_boost_h
void test();
#endif
```
```c++:boost.cpp
//
//  boost.cpp
//  boost
//
//  Created by  on 13/10/04.
//  Copyright (c) 2013 __MyCompanyName__. All rights reserved.
//
#include <iostream>
#include <string>
#include <iterator>
#include <functional>
#include <algorithm>
#include <boost/format.hpp> 
using namespace std;
	
void test()
{
    std::cout << boost::format("%s\n") % "Hello, World"; 
}

```
##4.boostAppDelegate.mをboostAppDelegate.mmに変更する。
```objc:boostAppDelegate.mm
//
//  boostAppDelegate.mm
//  boost
//
//  Created by  on 13/10/04.
//  Copyright (c) 2013 __MyCompanyName__. All rights reserved.
//
#import "boostAppDelegate.h"
#include "boost.h"

@implementation boostAppDelegate
@synthesize window = _window;
- (void)dealloc
{
    [super dealloc];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    test();
}

@end
```
##5.Build Settings
  Other C++ Flags  に-I/opt/local/includeを入力。
##6. run
Cocoa Application でwxWidgetsをやる。

環境
OSX 10.6.8
Xcode 4.2
wxWidgets 2.8.8
##1. Cocoa Applicationを作成する。
##2. MainManu.xibを削除する。
  wxtestAppDelegate.h削除
  wxtestAppDelegate.m削除
  main.m削除
##3. main.cpp
```c++:main.cpp
//
//  main.cpp
//  wxtest
//
//  Created by  on 13/10/04.
//  Copyright (c) 2013 __MyCompanyName__. All rights reserved.
//
#include "wx/wx.h"

class MyApp: public wxApp
{
    virtual bool OnInit();
    wxFrame * frame;
};

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    frame = new wxFrame(NULL, -1, wxT("Hello wxWidgets"), wxPoint(50, 50), wxSize(800, 600));	
    frame->Show();
    return true;
}

```
##4.Build Settings
  Architectures を32bitにする。
  Other Linker Flags  にwx-config --libsの結果をコピペする。
  Other C++ Flags にwx-config --cxxflagsの結果をコピペする。
##5. run
Muninにおける Apacheを監視する場合の方法

MuninによるApacheのアクセスログなどの監視の設定方法。

まず、 Muninに以下のプラグインを追加する。

```shell-session
$ sudo ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
$ sudo ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
$ sudo ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
```

次に Apacheの httpd.confに次の2つを追加する。

```shell-session
LoadModule status_module modules/mod_status.so
ExtendedStatus On
```

この後 一度 
munin-runを実行し apache_accessesなどが正常に動作しているかを確認する。
またこの時に

```shell-session
LWP::UserAgent not found at /etc/munin/plugins/apache_accesses line 86.
```

というエラーが発生した場合 perl-libwwwが入っていない場合があるので 導入する。

その後 apacheとmunin-nodeを再起動する。

```shell-session
$ sudo /etc/init.d/apache2 restart
$ sudo /usr/sbin/munin-node restat
```
これにより 正常に グラフを生成してくれるはず。

覚書と 初投稿のテストも兼ねて出してみました。

参考サイト
http://kencom.biz/archives/2009/0427161537.php
http://d.hatena.ne.jp/gamme/20090811/1249997519
Webフォント「M+ FONTS」と「自家製 Rounded M+」を使ってみたのですが…


[自分のブログ](http://amay077.github.io/) を Flat なデザインにしたいなーと思って、キレイなフォントを探していたらこの２つが有名っぽいので使ってみました。

* [M+ FONTS](http://mplus-fonts.sourceforge.jp/)
* [自家製 Rounded M+](https://sites.google.com/site/roundedmplus/)

M+ FONTS というのが元で、Rounded M+ というのはその派生(の派生)のようですね。ともあれ自由に使える日本語フォントを提供していただける事に感謝します。

で、さっそく Web Font として使ってみました。以前作った Markdown のデモがあったのでそれを使いました。

* [Marked.js で Markdown をクライアント側でパースして表示する - Experiments Never Fail](http://amay077.github.io/blog/2013/08/06/parse-markdown-using-markedjs/)

### M+ FONTS (mplus-1p-light)

上から反時計回りに Chrome, Safari, IE11(Win8.1) です。

![img1](http://blog.amay077.net/assets/images/posts/using_web_font_m_plus_and_rounded_m_plus_01.png)

### 自家製 Rounded M+ (rounded-l-mplus-1c-light)

![img1](http://blog.amay077.net/assets/images/posts/using_web_font_m_plus_and_rounded_m_plus_02.png)

## あれ？

おや？ 自家製 Rounded M+ は Chrome だけ、なんだか期待した表示になってくれないみたいです。

Chrome だけで、Web Font の CSS を ON/OFF させてみると、下のように微妙に表示が変わるので、適用されてはいるみたいです。

![img](http://blog.amay077.net/assets/images/posts/using_web_font_m_plus_and_rounded_m_plus_03.png)

## 追記 2013.10.4 オリジナルの Rounded M+ は正しく表示されました

「自家製」じゃなくてオリジナル? の [Rounded M+ のサイト](http://d.hatena.ne.jp/itouhiro/20120226) のフォントを使わせてもらったところ、それっぽく表示されているようです。

![img1](http://blog.amay077.net/assets/images/posts/using_web_font_m_plus_and_rounded_m_plus_04.png)


Web も Font も詳しくないのでよくわかりませんが、今回は M+ FONTS を使うことにします。

ちなみに、デモページは [こちら](http://blog.amay077.net/assets/images/posts/md_renderer/md_renderer.html) です。
MacにHomebrewでPHP5.5をインストールした時のメモ


参考にしたサイト
http://diary.renallery.net/post/60366723637

```bash
# リポジトリを追加
brew tap homebrew/dupes
brew tap josegonzalez/php

# インストールオプションや依存するパッケージを確認
brew info php55

# インストール 
# ※依存するパッケージも同時にインストールされる
# ※IDEでのPHPの実行環境として使いたいだけなので、
# 　とりあえずオプションを指定せずにインストールする
brew install php55

# 
# インストール完了
#

# バージョンを確認
php -v
--
PHP 5.3.15 with Suhosin-Patch (cli) (built: Aug 24 2012 17:45:44) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
--

# あれ！？

# PHPのパスを確認
which php
--
/usr/bin/php
--

# ↑ MacにデフォルトでインストールされているPHPのパスを指しているので
# 今回入れたPHP5.5を指すようにPATHを追加
echo 'export PATH=$(brew --prefix)/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# パスを確認 ->OK
which php
--
/usr/local/bin/php
--

# 実際はシンボリックリンクになってる
# ls -l /usr/local/bin/php
# --
# /usr/local/bin/php -> ../Cellar/php55/5.5.4/bin/php
# --

# バージョンを確認 ->OK
php -v
--
PHP 5.5.4 (cli) (built: Oct  2 2013 00:47:14) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
--
```

無事インストールできました(∩´∀｀)∩

MacデフォルトのPHPのアンインストール方法も調べたい。。。
GLSLのデバッグを行う方法 in Unity


GLSLのデバッグ方法について、以下の記事があったので理解した部分についてメモ。

[GLSL Programming/Unity/Debugging of Shaders](http://en.wikibooks.org/wiki/GLSL_Programming/Unity/Debugging_of_Shaders)

コンパイルエラーが出た場合はUnityのInspectorに表示されるので問題ありませんが、Unityから渡される準備されている変数にどんな値が入っているかは出力できません。

そこで、上記記事では適当なGameObjectにシェーダを適用させ、色として出力することでどんな値が入っているのかを見る、というのがデバッグ方法として書かれています。

![cap.jpg](https://qiita-image-store.s3.amazonaws.com/0/5616/ad5a9ad9-2430-6ce0-2613-a037dcd12124.jpeg "cap.jpg")

上記のGameObjectに適用しているシェーダは以下です。

```GLSL
#ifdef VERTEX

void main()
{
    color = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

#endif

#ifdef FRAGMENT

void main()
{
    gl_FragColor = color;
}

#endif
```


おそらく上記はポリゴンの向きなどによる問題だと思いますが、色を見てみるとそれぞれ図のような値になっているようです。
つまりこれがデバッグ方法です。
確認したい変数をそのまま色として扱い、実際に表示してみてどんな色になるかを確認する、という手順です。

これは、GLSLが基本的にすべて-1.0〜1.0（あるいは0.0〜1.0）の範囲に収まっているからできるものだと思います。

余談ですが、どうやらCubeのプリミティブの`gl_Vertex`の範囲は-0.5〜0.5のようです。
なのでこういうものの場合は色として表示できるように補正しないとなりません。（これの場合はそれぞれの0.5を加算すれば0.0〜1.0に補正されます）
サイボウズLiveのウザい通知を自動解除するGreasemoneyスクリプト


##「この更新を通知する」のチェックを自動的に外す

サイボウズLive…便利は便利なのですが、楽天のメルマガ登録と同じようなものがあります。
いらないのにデフォルトでチェックが入っててスパムのごとくメールが来ます。

![イベントの登録_-_漫画全巻海外転売_-_サイボウズLive.png](https://qiita-image-store.s3.amazonaws.com/0/12542/4bc0e326-c2fb-96e6-d308-1dc817a1acd5.png "イベントの登録_-_漫画全巻海外転売_-_サイボウズLive.png")

せめてこの設定をデフォルトでオフにできれば・・・と思って調べたのですが、
そのような項目が見当たりません。

仕方ないので楽天のメルマガ登録を自動解除するGresemonkeyスクリプトを参考にして作ってみました。

- [Greasemonkey 用スクリプト - Deny Rakuten News](http://espion.just-size.jp/archives/06/047231647.html)

<br />

```DenyCybozuLiveUpdate.user.js
// ==UserScript==
// @name Deny CybozuLive Update
// @namespace http://qiita.com/mathlow
// @description Deny CybozuLive Update
// @include https://cybozulive.com/*
// ==/UserScript==
 
(
function() {
  var nodes = document.evaluate(
    "//input[@type='checkbox'] [ \
      contains(@id, 'cba_gwScheduleDoNotify') or \
      contains(@id, 'cba_gwTaskDoNotify') or \
      contains(@id, 'cba_gwBoardDoNotify') or \
      contains(@id, 'cba_gwCabinetDoNotify') \
    ]",
    document.documentElement,
    null,
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
    null
  );
 
  for (var i = 0; i < nodes.snapshotLength; i++) {
    var z = nodes.snapshotItem(i);
    z.checked = false;
  }
}
 
)();
```

- [サイボウズLiveの「この更新を通知する」のチェックを自動解除するGreaseonkeyスクリプト](https://gist.github.com/mathlow/6809420)

<br />

インストールはこちらからどうぞ。

- [インストール](https://gist.github.com/mathlow/6809420/raw/11d590f02ef18c9fcae7ad816b1708d018b94f20/DenyCybozuLiveUpdate.user.js)

<br />

##あとは・・・

これをどうチーム内で共有していくか…。むむむ…。
Rubyで配列のランダムソート

最近はビルトインでできるらしい

```rb
[1,2,3,4].shuffle #=> [2, 1, 3, 4]
[1,2,3,4].shuffle #=> [1, 3, 2, 4]
```

素敵！

## 参考

How to randomly sort (scramble) an array in Ruby? - Stack Overflow
http://stackoverflow.com/questions/1816378/how-to-randomly-sort-scramble-an-array-in-ruby
Apache + CentOS 6.4 でリバースプロキシする chef レシピを書いた時のメモ


## Apache の設定

https://github.com/opscode-cookbooks/apache2 を使って設定

* 設定ファイルは `/etc/httpd/` 以下に配置するように設定される
* ログファイルは `/var/log/httpd/` 以下に配置するように設定される
* 拡張的な設定は `sites-availavle` に入れて `site-enables` へシンボリックリンクを貼ることで設定
* mod 系は `run_list` に `recipe[apache2::mod_xxx]` を放り込んで設定する
* 更にその設定は `mods-available` に入れて `mods-enables` へシンボリックリンクを貼ることで設定
* リバースプロキシするには `mod_proxy` だけじゃなくて `mod_proxy_http` も入れる
* `apache2` のレシピにある `mod_proxy` が生成する `proxy.conf` はデフォルトで `Deny from all` なので、自分で `Allow from all` 等するレシピを書く必要がある
* アクセスログを吐かせるには別に設定しないといけないぽい？ ->  `apache2::mod_log_config` と `apache2::mod_logio` を入れて以下のような設定ファイルを配置する

```conf:access_log.conf
 <IfModule log_config_module>
   LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
   LogFormat "%h %l %u %t \"%r\" %>s %b" common

   <IfModule logio_module>
     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
   </IfModule>

   CustomLog "logs/access.log" common
 </IfModule>
```

## その他
* CentOS 6.4 はデフォルトで iptables が起動して http のアクセスをシャットアウトしてるので https://github.com/dcrosta/cookbook-simple-iptables のレシピを使って iptables の設定をした
ec2ssh update 時に自動で ssh option を入れる。もしくは GitHub からブランチを指定して gem install する方法。


ec2ssh という素晴らしい gem があります。https://github.com/mirakui/ec2ssh 
とても便利なのですが、`ec2ssh update` 後に、毎回 User とか IdentityFile を編集するのが若干面倒だったり…

これを自動で入れてくれるようにするプルリクが出ているのですが、5ヶ月前から放置されているという悲しい状態です… ( https://github.com/mirakui/ec2ssh/pull/11 )

ということで、対処療法的に GitHub から直接 gem をインストールして、この便利オプションを使えるようにしたというお話。

**※上記 Pull Request が [merge された](https://github.com/mirakui/ec2ssh/pull/11)ので、以下の specific_install は必要なくなりました**


## GitHub から直接 gem install できるようにする

gem 自体には、URL を指定して gem install する方法がないようなので、 https://github.com/rdp/specific_install この gem を導入します。

```
$ gem i specific_install
```

その後、ssh_options が有効になったバージョンの ec2ssh をインストールします。

```
$ gem uninstall ec2ssh # 既存のは消しておく
$ gem specific_install https://github.com/frsyuki/ec2ssh.git ssh_options
```

`specific_install` の細かいオプションは GitHub を見て下さい。

## ec2ssh update 時に ssh option が入るようにする

上記と同じようにインストールした場合、`~/.ec2ssh` を以下のように編集します。

```yml:~/.ec2ssh
---
path: "/path/to/ssh/config"
aws_keys:
  default:
    access_key_id: foo
    secret_access_key: bar
regions:
- ap-northeast-1
ssh_options:
  - "IdentityFile /path/to/identity/file"
  - "User ec2-user"

```

これで `ec2ssh update` するとこんな感じになります。

```
### EC2SSH BEGIN ###
# Generated by ec2ssh http://github.com/mirakui/ec2ssh
# DO NOT edit this block!
# Updated 2013-10-03T20:33:42+09:00

# section: default
Host hoge
  HostName fuga
  IdentityFile /path/to/identity/file
  User ec2-user


### EC2SSH END ###
```

便利！
GASのScriptEditorオレオレチートシート


Google Apps ScriptのIDE、ScriptEditorのチートシートがなかったので書いてみます。

足りなかったら編集リクエストか、コメントよろです。


## ショートカット

macです。確かwinはcommandをctrlにしたはず。


### 何かのダイアログを表示

| キー | 動き |
|:--------------------|-------------------------------------------------|
| command + f | 検索窓を表示|
| command + shift + option(alt) + g | 編集履歴を表示 |
| command + enter | ログウィンドウを表示 |
| command + o | Google Driveを表示する |

### 編集系

| キー | 動き |
|:--------------------|-------------------------------------------------|
| command + s  | 現在開いているタブのファイルを保存 |
| command + shift + s | 現在開いているすべてのタブのファイルを保存|
| option(alt) + / | 単語補完（現在開いているファイル内にある単語を補完）|
| ctrl + space | 補完 |
|  ctrl + / | コメントをトグル  |
| option(alt) + ↑↓ | 行を移動（現在カーソルがある行を上下に移動） |
| option(alt) + ←→ | カーソルを単語単位に移動 |
| command + ←→ | 行頭、行末に移動 |
| tab | 現在行（または選択している行）を整形（コードフォーマット） | 

あとは普通にcommand + zとかcommand + y とかの普通にEditorでできる事を大体やれます。

なお補完は関数とかの引数だときかない場合があったりします。
例えば1ファイル内に以下の様な関数のみあった場合`page`に変数は補完ができません。

```javascript:getPageName.gs
//この関数しかないファイル
function getPageName(page) {
  return page.getTitle(); 
  //pageがSitesApp.getActivePage()から取得したとしても、同じファイル内でpage変数に代入していない場合は補完ができないです。
}
```

こういった場合はコメントで`page`変数に補完対象のオブジェクトを代入してあげると補完が効くようになります。

```javascript:getPageName.gs
//この関数しかないファイル
function getPageName(page) {
  //var page = SitesApp.getActivePage();
  return page.getTitle(); 
  //コメントで代入しておくと、補完が効くようになります。
}
```

なおこれはオブジェクト内のプロパティでも同じで、
`//var this.page = SitesApp.getActivePage()`とかしておくと、
`this.page.`まで書けば、補完が効くようになります。





### その他

| キー | 動き |
|:--------------------|-------------------------------------------------|
| command + r  | 現在メニュー内の関数選択SelectBoxで選択している関数を起動 |
| command + shift + f | コンパクト表示の切替（うえのほうが縮みます） |

`command + r `は確かどこにも書いてないですが、非常に有用なので、覚えておくといいと思います。

力尽きたので今日は終了
その内追記します。
Tkinterの色指定で使用可能な値

Tkinterで色指定する場面がけっこうある。

```python
frame = Tkinter.Frame(bg='red')
```

この例では、 `bg` でフレームの背景色を `red` という文字列リテラルで指定している
が、使用可能な値に何があるのか、気になったので調べてみた。


# 確認に使った環境

  *  Windows XP Professional 32bit (SP3)
  *  Python 2.7.3

環境依存もあるんじゃないのという気はしてるので、参考程度で。


# 数値による指定

4ビット/8ビット/12ビットの数値形式の文字列で指定可能。

```python
Tkinter.Frame(bg='#fff') # white
Tkinter.Frame(bg='#000000') # black
Tkinter.Frame(bg='#000fff000') # green
```


# 名前による指定

`red` や `yellow` といった名前で指定可能。ここで使える値に何があるかについては、
Tkinterのラッパー元(?) になってるTcl/Tkのサイトにドキュメントがあった。

http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm

ここに書かれている752種類の色指定用の文字列は、すべて使用可能であった。

大文字・小文字の違いは問題ないらしい。

```python
class TkinterColorsTestCase(unittest.TestCase):

    def test_(self):

        def _assert_color(color):
            try:
                for _color in [
                        # 元の値
                        color, 
                        # 大文字
                        color.upper(), 
                        # 小文字
                        color.lower(),
                        ]:
                    Frame(bg=_color)
            except TclError as e:
                self.assertTrue(False, msg=color)

        map(_assert_color, Colors)

if __name__ == '__main__':
    unittest.main()
```

色の名称で標準化されてるのかな。ちょっと見つけられてないけど。
Facebook SDK for iOS v3.8 の導入手順

iOS 7 で Social.framework や Accounts.framework は **[ほとんど機能追加されなかった](https://developer.apple.com/library/ios/releasenotes/General/iOS70APIDiffs/index.html#//apple_ref/doc/uid/TP40013203)** ので、Facebook連携をしっかりやろうとすると、結局 Facebook SDK for iOS を使うことになりそうです。

で、日本語で丁寧に書かれたオフィシャルのスタートガイドがあるのですが、

> [Getting Started 日本語版](https://developers.facebook.com/docs/ios/getting-started/jp/) （英語版は[こちら](https://developers.facebook.com/docs/ios/getting-started/)）

微妙に古い部分があったりして、[Change Log](https://developers.facebook.com/docs/ios/change-log-3.x/) や Upgrading Guide にしか書いてないこととかもあったりします。

とくに、Upgrading Guideの方は、[公式ドキュメントの iOS トップ](https://developers.facebook.com/docs/ios/) からは最新版の一つ前 → 最新版への移行ガイドにしかリンクされておらず（※）、ちょっと前の大きい変更の [3.2 to 3.5 の移行ガイド](https://developers.facebook.com/docs/ios/upgrading-from-3.2-to-3.5/) にけっこう重要な情報が書かれてたりします。

（※ Upgrading Guideのページにいくと、サイドバーに過去のUpgrading Guideへのリンクが現れる。難易度高い。。）


##v3.8の導入手順

そんなこんなで、 以下、10/3現在の最新版、v3.8のざっくり導入手順です。

1. **FacebookSDK.framework をプロジェクトに追加する**

  v3.8現在、FacebookSDKResources.bundleを別途追加する必要はなくなっています。

2. **依存フレームワークをプロジェクトに追加する**

3. **Facebook App ID と URL scheme と FacebookDisplayName を Info.plist に追記する**

  FacebookDisplayName はダッシュボードの Display Name に合わせる。

4. **`application:openURL:sourceApplication:annotation:` で `handleOpenURL:sourceApplication:` を呼ぶ**

  Share Dialogを使う場合など、Facebookアプリに飛んでURL schemeで戻ってくる際に、エラー等をハンドルするのに必要。

````
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {

    BOOL wasHandled = [FBAppCall handleOpenURL:url
                             sourceApplication:sourceApplication];

    // add app-specific handling code here
    return wasHandled;
}
````

##参考ページ

- [iOS7のAPI diffs](https://developer.apple.com/library/ios/releasenotes/General/iOS70APIDiffs/index.html#//apple_ref/doc/uid/TP40013203)
- [Documentation › iOS › Getting Started](https://developers.facebook.com/docs/ios/getting-started/)
- [iOS向けFacebook SDKスタートガイド](https://developers.facebook.com/docs/ios/getting-started/jp/)
- [Change Log](https://developers.facebook.com/docs/ios/change-log-3.x/)
- [3.2 to 3.5 の移行ガイド](https://developers.facebook.com/docs/ios/upgrading-from-3.2-to-3.5/)
Wii Uのインターネットブラウザーに実装されたWebSocketについてほんのすこし調べてみた

Wii U は押入れにしまっていたため、ここ最近の動向をほとんどキャッチアップしていませんでした。
Wii UのインターネットブラウザーがWebSocketに対応したというのはツイートを見て知り、
今回のアップデートで対応したのかそれともその前にすでに対応していたのかもわかりません。
とりあえず、ほんのすこし調べてみました。  

###ハンドシェイク
ハンドシェイクはシンプルで最低限必要なものだけでした。Sec-WebSocket-Versionは13です。

```:Handshake
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 192.168.0.4:8181
Origin: http://www.gtk2k.net
Sec-WebSocket-Key: poVU2lHi3ImaEE3b/7vMDQ==
Sec-WebSocket-Version: 13
```

###テキストメッセージ
これは当然ながら出来ました。

###バイナリーメッセージ
バイナリーメッセージは一部対応してました。
####send(Blob)
```
FileReader is not available. Could not send a Blob as WebSocket binary message.
```
という、エラーメッセージが表示されてダメでした。FileReaderが実装されていないっぽく、
実際デベロッパーツールで見てみるとFileReaderが実装されていませんでした。
####send(ArrayBufferView)
そもそも実装されていないらしく '[object Uint8Array]' がテキストメッセージで送信されました。
####send(ArrayBuffer)
唯一、これでバイナリーメッセージとして送信することが出来ました。

###あとがき
send(blob)ができないのとFileReaderが実装されていないのが痛いですね。これがないとinput type='file'などで選択したファイルなどをWebSocketで送信したり、ファイルをJSでいじったりすることができません。

以上
AmazonLinuxにhttp_loadをインストールする

# http_loadをEC2（AmazonLinux）にインストールする
自サーバーへの負荷テストで便利なhttp_loadですが、Localのマシンやネットワークが貧弱だと、サーバーより先にそこがボトルネックになって正確に測定出来無い場合があります。よね。

そこでEC2を活用すると便利っす。
今回はAmazonLinuxへのインストール方法です。きっとCentOSも同じような感じだと思う（未検証）

### ソースを取ってくる
"""
wget http://www.acme.com/software/http_load/http_load-12mar2006.tar.gz
tar xvfz  http_load-12mar2006.tar.gz
cd http_load-12mar2006
"""

### Makefileの18行目付近のMANDIRを書き換え
"""
MANDIR =        /usr/share/man/man1
"""

### sslを有効にしたい場合Makefileの13,14行目当たりを以下のように書き換え
"""
SSL_INC =       -I/usr/include/openssl
SSL_LIBS =      -L/usr/lib -lssl -lcrypto
"""

### インストール
cd http_load-12mar2006
make
sudo make install
複数のScrollViewを表示しつつStatusBarのTapで移動


##問題
FacebookライクなメニューUIを利用したりして
ScrollViewやTableViewを複数表示すると
StatusBarのTapで一番上に移動する動作が行えなくなってしまう

対象となるUIはTableView、ScrollView、WebView、TextAreaの４つ

##解決方法
scrollsToTopプロパティで制御する
defaultはtrueになっていて、trueのUIが２つ以上あるとダメみたい
どれか一つだけtrueになるようにしておけばStatusBarのTapが動作する

FacebookライクなメニューUIのときは、メニューの開閉に応じて
メニュー側のscrollsToTopをfalseにして
メイン画面のscrollsToTopをtrueにする感じ

いちいち全部falseにするのも面倒なのでapp.tssでdefaultでfalseにしておき
必要に応じてtrueにすると楽

##app.tss

```
"TableView": {
	scrollsToTop: false
},

"TextArea": {
	scrollsToTop: false
},

"WebView": {
	scrollsToTop: false
},

"ScrollView": {
	scrollsToTop: false
}
```
Google ChromeのFailed to load resourceエラー問題発生要因と解決策


## 事象

* 突然JavaScriptが読み込まれなくなる

> CSSや画像ファイルなどでも起こるみたいです


* その該当JavaScriptコードを編集した事がなくても、突然やってくる

> jQueryとかのライブラリでも起こります


## 原因予想

恐らくは、

* その該当JavaScriptファイル名を変更した
* その該当ファイルを移動した
* IDEの自動リファクタリングが失敗し、該当ファイルが影響した


...などが考えられる。



## 解決策

該当ファイルを削除して、新規に同ファイルを設置する事で解決する...と思われる。


## 具体的な手順

```
1. Chromeのキャッシュクリア後にChrome終了
2. 削除前にプロジェクトとは無関係のディレクトリに該当ファイルをコピペ
3. 該当ファイルの削除
4. IDEを終了させる
5. コピーした該当ファイルを元のプロジェクト配下に戻す
6. Chrome起動で正常動作を確認
7. IDE起動
```

\* IDEを使用していない場合は4.と7.は不要。



## 解決に至らなかった、試行した内容

* Chromeのキャッシュクリア
* Chromeの履歴削除
* Chrome再起動
* PC再起動
* Chromeアプリ再インストール
VagrantのかんたんProxy設定

VagrantのかんたんProxy設定
===

この記事は
---
Vagrantで作成するゲストOS側にProxy設定をする手順です。
vagrant-omnibusでChef-solo入れるにもProxy設定されてなくて入らなくて調べました。

プラグインを使う
---
[vagrant-proxyconf](https://github.com/tmatilai/vagrant-proxyconf)というプラグインが公開されています。これ使えば解決です。

インストール
---
普通に入れてください。

```
>vagrant plugin install vagrant-proxyconf
Installing the 'vagrant-proxyconf' plugin. This can take a few minutes...
Installed the plugin 'vagrant-proxyconf (0.5.3)'!
```

設定ファイル
---
プロキシ情報を書きます。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.proxy.http     = "http://192.168.0.2:3128/"
  config.proxy.https    = "http://192.168.0.2:3128/"
  config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"
  # ... other stuff
end
```

実行
---
vagrant upすると下記のメッセージでて設定できてます。

```
>vagrant up
(snip)
[default] Configuring proxy for Apt...
[default] Configuring proxy for Chef provisioners...
[default] Configuring proxy environment variables...
(snip)
```

設定内容
---
今のところaptとchefと環境変数のプロキシ設定してくれるみたいです。

[たぶんこの辺](https://github.com/tmatilai/vagrant-proxyconf/tree/master/lib/vagrant-proxyconf/action)にクラス追加すれば設定対象増やせそうです。

他に各プログラム固有のProxy設定とかサポートしたい場合はforkして自分で実装してpull request出したら世界中のプロキシ野郎が喜ぶしれませんね。

うまくいかない時
---
ソースを見るとオプションで連携できる他のプラグインが[3つ定義](https://github.com/tmatilai/vagrant-proxyconf/blob/master/lib/vagrant-proxyconf/plugin.rb#L14)されているのですが、どうもこれを入れないとうまくProxy設定してくれない場合もあるようです。うまくいかないときは下記をインストールすると動くかもしれません。

```
>vagrant plugin install vagrant-aws
>vagrant plugin install vagrant-omnibus
>vagrant plugin install vagrant-vbguest
```

終わりに
---
よかったよかった。
rubyでハッシュの配列を指定したキーでマージするメソッドがあると便利

DB分割等でjoinできない時など、ruby側でDBのデータをマージしないといけない時によく使います

```rb:array.rb
class Array
    def merge_by_index(other,index1='id',index2=nil)
        index2 = index1 if index2.nil?
        merge_hash = {}
        self.map {|data| merge_hash[data[index1]] = data}
        other.each do |data|
            key = data[index2]
            data[index1] = key if index1 != index2
            data.delete(index2) if index1 != index2
            merge_hash[key] = (merge_hash[key] == nil) ? data : merge_hash[key].merge(data) 
        end
        return merge_hash.values 
    end 
end
```

# indexをキーに配列をマージする
```
a = [
    {'id' => 1,'val' => 1},
    {'id' => 2,'val' => 1}
]

b = [
    {'id' => 2,'val' => 2},
    {'id' => 3,'val' => 2}
]

p a.merge_by_index(b)
#=> [{"id"=>1, "val"=>1}, {"id"=>2, "val"=>2}, {"id"=>3, "val"=>2}]
```

# joinする
```
a = [
    {'id' => 1,'val' => 1}
]
b = [
    {'id' => 1,'name' => 'hoge'}
]

p a.merge_by_index(b)
#=> [{"id"=>1, "val"=>1, "name"=>"hoge"}]
```

# indexを指定する(デフォルトは'id')
```
a = [
    {'user_id' => 1,'val' => 1}
]
b = [
    {'user_id' => 1,'score' => 100}
]

p a.merge_by_index(b,'user_id')
#=> [{"user_id"=>1, "val"=>1, "score"=>100}]
```

# キーの名前が違う配列同士でマージする
```
a = [
    {'id' => 1,'val' => 1}
]
b = [
    {'user_id' => 1,'score' => 100}
]

p a.merge_by_index(b,'id','user_id')
#=> [{"id"=>1, "val"=>1, "score"=>100}]
```
ListViewで子要素(View)の取得。getChildAtがnullで困るなら…

AndroidプログラミングでListViewを使用したとき、選択した項目のViewを取得したい時があると思います。
getChildAtでさっさと取得しようと思ってもスクロールに対応できずにnullが返ってくる。

ならカスタムアダプターでどうにかしてしまおう。

```java
	Map<Integer, View> positionView = new HashMap<Integer, View>();
	/*もしくは
	SparseArray<View> positionView = new SparseArray<View>();*/
		
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
				
		View view = convertView;
		ViewHolder holder;
		SampleRow sr = (SampleRow)getItem(position);
				
		if(view == null){
			view = inflater.inflate(R.layout.sample_row, parent, false);
						
			holder = new ViewHolder();
			holder.nameView = (TextView)view.findViewById(R.id.sample_row_name);
						
			view.setTag(holder);
		}else{
			holder = (ViewHolder)view.getTag();
		}
				
		holder.nameView.setText(sr.getName());
				
		/*キーの重複不可を利用してgetViewで生成されるViewを格納*/
		positionView.put(position, view);
				
			return view;
		}
		
		public View getPositionView(int targetPosition){
			View targetView = positionView.get(targetPosition);
			return targetView;
		}
```


こうすればListViewを表示するActivity内onItemClickでpositionを取得して


`getPositionView(position);`


これで取得できます。

ただ、スクロールするたびカスタムアダプター側でコレクションにViewの格納をするので効率がいいかは…
Volleyの起動・停止・キャンセル

Volleyを使う際は、こんな風にしておくと便利かも？
アプリが終了する際などに、stop()とcancel()を呼べばOK
<br>


````java:
	// シングルトンのキュー
	private static RequestQueue mQueue;

	// addするrequestを生成
	start(context);
	mQueue.add(request);

	// キュー処理をスタート
	public static final void start(Context context){
		if(mQueue == null) mQueue = Volley.newRequestQueue(context);
		mQueue.start();
	}
	// キュー処理をストップ
	public static final void stop(){
		if(mQueue != null) mQueue.stop();
	}

	// リクエストをキャンセル
	public static final void cancel(){
		if(mQueue != null){
			mQueue.cancelAll(new RequestFilter() {
				@Override
				public boolean apply(Request<?> request) { return true; }
			});
		}
	}
```
Androidのネットワークの接続がされているかのチェック方法

まずは、AndroidManifest.xmlに以下の追加をする

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission>
```
<br>
そしてstaticメソッドとして、共通処理や処理の部品化が行われている箇所に以下のメソッドを追加

```java:Util.java
// ネットワーク接続確認
public static boolean netWorkCheck(Context context){
  ConnectivityManager cm =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
  NetworkInfo info = cm.getActiveNetworkInfo();
  if( info != null ){
    return info.isConnected();
  } else {
   return false;
 }
}
```
<br>
あとは、contextを渡して、返り値がtrueなら接続可能、falseなら接続不可能

```java:JsonGet.java
//通信処理がある前にif文などで
if ( Util.netWorkCheck(this.getApplicationContext() ){
  // 非同期通信などの処理をかく
} else {
  // 繋がらなかったよ…
}
```
といった感じに使うとGood！