OmniAICreator/Qiita-1.07M huggingface dataset:
RedHat6.2延命策　CentOSのyumを使う

#概要
サブスクリプションが切れたRedhat6.2をCentOSのYumを使ってアップデートしたい。

OS:RedHat workstation 6.2(Santiago)

##手順
rhelのリポジトリを見に行かないように
enable=1を
enable=0にする
```
% sudo vi /etc/yum.repos.d/rhel-source.repo
enable=0
```


CentOS-Base.repoを作成する

```
% sudo vi /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-$releasever

[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-$releasever

[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-$releasever
```

$releaseverが無いので作成する。理研FTP等で6.2を見てみるとReadmeで6.2の場合は6を参照するようにと書かれている。

```
% sudo vi /etc/yum/vars/releasever
6
```

あとはおなじみのコマンドを入れる。

```
% sudo yum update
```

###事の発端
該当サーバーを構築した業者がむやみにアップデートしたら動かなくなるので止めてくれとかいう酷い業者だった、そんな状態なのでサブスクリプションの更新は当然していない。（晒したい・・・）
また退職した前任者はインフラエンジニアとしての知識が足りない人だったため業者の言い分に素直に従っていた様子。
職場のFirewallの内側にある計算サーバーだったのでクリティカルなセキュリティアップデートでも放置されていた状態だった。

今回問題になったのはFTPを使う際、Out of Memofyエラーが出るとのこと。
[Redhatのナレッジベース](https://access.redhat.com/ja/node/1406103)
見事に対策前のパッケージだったため、業務に支障が出た。
アップデートの必要がありサブスクリプションが切れた状態でせめてFTPだけでもと思いCentoOSのリポジトリを使う方法を検索した結果こうなった。
この際、全部アップデートしたいがそうすると動かなくなるらしいのでなー（本当に酷い業者）
EntityFrameworkでMigration時の照合順序を日本語にする

EntityFramework6でMigrationを設定してDefault実行すると照合順序がSQL_latin1になる問題について以下で対応。

```
        protected override void Seed(Entities context)
        {
                context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,
                              string.Format("ALTER DATABASE [{0}] COLLATE Japanese_90_CI_AS_KS_WS_SC", context.Database.Connection.Database));
        }
```

これだとSQLSERVERしか対応できません。
もっといい方法を知っている人は教えてください。configのDBConnectionとかにかけないのか。
Herokuでアプリケーションをデプロイするまでの流れ rails編


### heroku - ログイン
1. `heroku login`
2. 会員email入力
3. 会員passward入力

### heroku - アプリケーションの作成
`heroku create [アプリケーション名]`
アプリケーション名は任意で、指定しない場合ランダムに命名が行われる

なお、アプリケーションのURLは`https:/[アプリケーション名.herokuapp.com/`となる

### heroku - 環境設定の確認
`heroku config`

### rails - 本番環境でassetsのプリコンパイルを自動化する
```config/enviroments/production.rb
config.assets.compile = true
```

### rails - プリコンパイル
`rake assets:precomple RAILS_ENV=production`

### rails - マイグレーション
`rake db:migrate RAILS_ENV=production`

### rails - production環境の確認
`rails s -e production`

### database.yml内の各種情報をherokuの環境変数に登録・変更
heroku側 - `heroku config:add PASSWORD=piyo`
rails側 - `<%= ENV['PASSWORD'] %>`

なお、heroku configで表示されたDATABASE_URLの文字列は`postgres://username:password@host:port/database`のような構成になっている

### heroku - bundleコマンドのSECRET_KEYも環境変数に登録
`heroku config:add SECRET_KEY_BASE="$(bundle exec rake secret)"`

### heroku - 本番環境のマイグレーション
`heroku run bundle exec rake RAILS_ENV=production db:migrate`

### heroku - デプロイ
`git push heroku master`でOK
(詳細はherokuの該当プロジェクトに記載してあるので、それを読む)
Twitter Bootstrap3の使い方 on Rails4


gemの`bootstrap-sass`を導入する流れについてメモ

- Bootstrapインストール

```Gemfile
gem 'therubyracer', platforms: :ruby
gem 'bootstrap-sass', '~> 3.2.0'
gem 'autoprefixer-rails'
```
`$ bundle install`

- application.cssのリネーム
`application.css -> application.css.scss`

- application.css.scssの書き換え
application.css.scss内の記述を全て削除して、下記にする

```application.css.scss
@import "bootstrap-sprockets";
@import "bootstrap";
@import "scaffolds";
@import "他コントローラ名.scss";
```

- application.jsに追記

```application.js最下行
//= require bootstrap-sprockets
```

- bootstrapの読み込み

```applocation.css.scss内、stylesheet_link_tag直後
<%= stylesheet_link_tag "bootstrap", media: "all", "data-turbolinks-track" => true %>
```
Rspec、Capybara、Ramblanceの導入


## Rspec、Capybara編

* gemを入れる

```Gemfile
gem "rspec-rails"
gem "capybara"
```

`$ bundle install`

* rspecの初期設定

`$ rails g rspec:install`

* テストファイル作成

`$ rails g integration_test テスト名`

* テスト編集

```spec/requests/about_spec.rb
require 'rails_helper'

RSpec.describe "Abouts", type: :request do
  describe "company_overview page" do
    it "should have the content '会社概要'" do
      visit '/about'
      expect(page).to have_content("会社概要")
    end
  end
end
```

* capybara用の設定を追記

```spec/rails_helper.rbの最下行
config.include Capybara::DSL
```

* テスト実行

`$ bundle exec rspec spec/reqests/about_spec.rb`

## Rambulance編

* gemを入れる

```Gemfile
gem 'rambulance'
```

`$ bundle install`

* Rambulanceの初期設定

`$ rails g rambulance:install`

* エラーとviewの紐付け

下記のコメントを外す

```initializer/rambulance
  config.rescue_responses = {
    "ActiveRecord::RecordNotUnique" => :unprocessable_entity,
    "CanCan::AccessDenied"          => :forbidden,
    "Pundit::NotAuthorizedError"    => :forbidden,
    "YourCustomException"           => :not_found
  }
```

* 開発環境でもエラー情報を表示させないようにする(Rambulanceで生成した画面を表示)

下記を書き換える

```config/environments/development.rb
config.consider_all_requests_local = false
```
DBの正規化メモ


### 第一正規化
目的はレーブル内データの重複を無くす事である。
データに重複が存在しなくなるまでテーブルを分割する。
完了した状態を **第一正規形** と呼ぶ。

### 第二正規化
目的はテーブル内の主キー列以外の列の値が、必ず主キーによって決まるようにすることである。
主キー以外の項目に従属して変化するような項目は、別のテーブルに分割する。
> ex. ブログのカテゴリを別テーブルに切り出してつくる

完了した状態を **第二正規形** と呼ぶ。

### 第三正規化
目的はテーブル内の主キー列以外の列の値が、 **主キーのみ** によって決まるようにすることである。
> ex. 郵便番号と住所を別テーブルに分ける（住所は郵便番号に従属している）

完了した状態を **第三正規形** と呼ぶ。
Railsで利用できるデバッグツール一覧

なお、4.x系でのみ確認

* gemの追加

 ```Gemfile
group :development, :test do
  gem 'awesome_print'
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'database_rewinder'
  gem 'factory_girl_rails'
  gem 'hirb-unicode'
  gem 'hirb'
  gem 'pry-byebug'
  gem 'pry-doc'
  gem 'pry-rails'
  gem 'pry-stack_explorer'
  gem 'quiet_assets'
  gem 'tapp'
  gem 'timecop'
  gem "annotate", github: "ctran/annotate_models"
  gem "colorize_unpermitted_parameters"
  gem "faker"
  gem "guard-rspec", require: false
  gem "rack-mini-profiler"
  gem "spring-commands-rspec"
  gem "xray-rails"
end
```

 `$ bundle install`

* awesome_print
コンソールにおいて、ActiveRecordからの出力結果を整列表示する

* better_errors
例外捕捉時に、詳細情報を表示してくれる(特に変数周り)

 下記を追記
 
 ```config/environments/development.rb
 BetterErrors::Middleware.allow_ip! '該当環境のIPアドレス(エラー画面のToggle env dumpで確認可能)'
 ```

 ```任意のコントローラ
 def index 
 	raise
 end
 ```
 
* binding_of_caller
better-errorsのエラー画面でirbを利用することができる

* database_rewinder
テスト毎にデータをクリアすることに対応することができる

* factory_girl_rails
データの生成をフィクスチャからファクトリーに変更することができる。

* hirb-unicode
hirbを日本語などマルチバイト文字の出力時の出力結果のずれに対応するためのもの
ActiveRecordの出力を表形式で表示してくれる。

 `Hirb.enable`
[参考記事](https://blog.dakatsuka.jp/2011/05/14/hirb-rails-console.html)

* pry-byebug
処理を止めてくれる
エラーが発生した箇所やその原因を分析しやすくなる

 ```任意のコントローラ
def index
	binding.pry
end
```

 ```webrickコンソール
step - 次の処理へ
continue - 処理を抜ける
```

* pry-doc
C言語で書かれたRuby言語のソースコードを表示することができるようになる

* pry-rails
コンソールからモデルのデータ構造が確認できる

 ```
show-model モデル名 - 特定モデル 
show-models - 全てのモデル
```

* pry-stack_explorer
binding.pry起動時に、下記コマンドで処理の流れの統計を確認できる
 `show-stack`

* quiet_assets
ログから`assets/...`を消せる

* tapp
任意のカラム値を最初に表示できる
`User.first.tapp(&:name)`

* timecop
好きな時刻に移動(Timecop.travel)させたり、時刻を止めたり(Timecop.freeze)といったことができ、日付/時間に関するテストをやるときに必須

```
Timecop.travel(10.days.ago) 
puts Time.zone.now 
```

* colorize_unpermitted_parameters
Strong Parameters で弾かれると Unpermitted parameters: xxx みたいなログが流れる
これを黄色に色をつけて判別できるようにしてくれる

* annotate
各schemaの情報をファイルの先頭もしくは末尾にコメントをつけてくれる
schema、routingなどを直接ファイルを開くことで確認することができるようになる

 `$ bundle exec annotate --routes`


* faker
Rubyで簡単にダミーデータを作成することができる

* guard-rspec
Guardfileの定義情報をもとに、ファイル更新の都度、テスト処理を実行させることができる

* rack-mini-profiler
Viewのレンダリングやデータベースへのクエリにかかった時間を計測し、その結果をすべてのページ上に表示してくれる

* rspec-rails
Railsアプリケーションのテスト処理を行うためのフレームワーク

* rspec
「プログラムの振舞 (behaviour)」を記述するためのドメイン特化言語 (DomainSpecific Language:DSL) を提供するフレームワーク」

* spring-commands-rspec
springでrpsecを使用することができる

* xray-rails
RailsのView構造をわかりやすく表示してくれる
[設定](http://morizyun.github.io/blog/xray-rails-view-checker-ui-bone/)
 `cmd + shift + x`で起動できる
 ※めっちゃ便利
postgresqlメモ


## コマンド
### psql起動前
- ログイン
`psql データベース名`
- DB作成（消去したときなど）
`createdb -U postgres archive2_development -O posgres`

### psql起動後
- 権限の変更  
`aleter role ユーザ名 権限名(superuserなど)`
- ユーザーの確認  
`\du`
- データベースの確認  
`\l`
- テーブルの確認  
`\d`
- 個別テーブルの確認  
`\d テーブル名`
- データベース作成  
`create database database_name`
- データベース変更  
`alter database 現在のデータベース名 rename to 変更後のデータベース名`
- テーブル作成  

```postgresql
CREATE TABLE テーブル名 (
id int primary key,
name varchar,
address varchar
);
```
- レコード参照  
`SELECT * FROM テーブル名`
- レコードの参照 - 抽出するレコードを指定  
`SELECT * FROM テーブル名 where id = 2`
- レコードの参照 - 抽出するカラムを指定  
`SELECT カラム名 FROM テーブル名`
- レコードの参照 - 抽出するレコード、カラムを指定  
`SELECT カラム名 FROM テーブル名 where id = 2`
- カラム追加  
`ALTER TABLE テーブル名 ADD カラム名 型`
- レコード挿入  
`INSERT INTO テーブル名 VALUE (1,'hoge','piyo')`
- レコードの編集  
`UPDATE テーブル名 SET カラム名 = '変更する値' WHERE id = '変更対象のレコード(idじゃなくてもok)'`
- レコード削除  
`DELETE FROM テーブル名 WHERE id = 1`





### エラー
- othre user ~ と出たときは動いてそうなプロセスを殺す

http://qiita.com/yh2020/items/8be3087004d100fe752b
インフラ勉強会メモ


勉強会メモが眠っていたので公開します。
雑多なメモですが、主にAWSについての勉強会でした。

## 基本的なインフラ構成の概要とそれに関連する部分

### サービスの規模によって選択するインフラを選択
- さくらVPS メモリ2G - 1700円
- 同上 メモリ4G - 3000円
- ドメイン - 1000円/年
- SSL証明書 - 4300円

友人や個人商店などのHP作成の場合は、firebaseやGithubPagesで十分かも。
（firebaseは一定まで、GithubPagesは完全無料で使える）

※スケールアウトする、画像をたくさん使うサービスはAWSを利用した方が良い。(S3だけ利用するのも良い)

### 動かすやつ
- Rails(webサーバ - unicorn)
- MySQL(DBサーバ)
- LB(webサーバの負荷分散)

### AWSの構成
- DNS - Route53
- ロードバランサ - ELB(elastic loadbarancer)
- Webサーバ - EC2 t2.small 2G
- DBサーバ - RDS t2.small 2G
- ユーザリソース(画像)ストレージ - S3 落ちにくい  
S3に移しておかないとスケール合うとし難い
- キャッシュストア - ElasticCache(Memcache,Radis)  
DBに持たせたくない、頻繁にアクセスがある単純なデータ(かつ消えてもいい)
- メールアドレス - SES  
ドメインの信頼性を担保する
- 踏み台サーバ - microとかでインスタンスを作る
特定IPからしかSSH接続は受け付けないようにする

上記全部で、1万円前後位で用意できる。
(ユーザ1万人のサービスでもギリ耐えられる)


### ポートについて(一般的なポート番号、sshの番号はセキュリティのために変更したりする)
22 ssh
80 http
443 https

SecurityGroupという単位で上記を管理する。
（EC2インスタンス単位でsecuretygroupeを設定、RDSに対しては、共通SecurityGroupのEC2からのリクエストしか受け付けない設定など）

### ミドルウェアの構成
- webサーバ - Nginx × Unicorn
- デプロイ - Capistrano

**リバースプロキシとは**
裏で別ドメインにリクエストしたりする

### AWS用語
- IAM - コンソールログイン(1アカウントに複数のユーザを作成できる)
- EC2 - 仮想サーバ
 - ストレージ 30GB(テキストメインの場合)
- SecurityGroup - セキュリティルール
 - キーペアはchmod 400にする（自分専用）
- AMI - EC2のイメージから複製可能
 - EC2の設定を保存してくれる
- ELB - ロードバランサ
 - ヘルスチェックの設定が主
- ElasticIP - 固定IP(デフォルトでは動的にIPが変わってしまう)
- Route53 - DNS
 - Aレコード（ベース）：kasuga.com - IPアドレス
 - CNAMEレコード（エイリアス）：sub.kasuga.com=nakao.com - 別ドメイン※ハテブなどのサービスのドメインなど
 - お名前どっとcomなど、外部レジストラーサービスで作成したドメインをRoute53でhostedzoneを作成して、紐付けだけ行うのが一般的（AWSでドメイン作るのが若干高いため）

基本的に、root権限ではログインしない。
IAMでアクセス用のユーザを作成するのが基本

**ヘルスチェック**
定期的に正常なレスポンスを返すかインスタンスにアクセスを行い、正常でない場合はインスタンスを切り離す
（タイムアウト、チェック間隔、閾値の設定はELBインスタンス作成時に行う）

## インスタンスの作成・複製
インスタンスを作成・複製した際には、下記の手順を必ず実行して、サーバを起動する必要がある。
（インスタンスを複製するのは、ロードバランシングするとき）

#### nginxインストール
1. ec2インスタンスにssh接続する  
`ssh -i "セキュリティキー名.pem" アドレス`
2. `sudo su -` (root権限)
3. `yum update`
4. `yum install nginx`
5. `service nginx start`
6. securitygroupのインバウンドにHTTPを追加
7. ブラウザから、パブリックIPに接続する

#### nginxの自動起動
* SSH接続した状態で下記コマンドを実行

```
# chkconfig | grep nginx
# chkconfig nginx on
```
herokuコマンドメモ


## herokuコマンド
### herokuに作成されたアプリケーションを確認
`heroku apps`

### addon追加
`heroku addons:add sendgrid:starter`

### マイグレーション
`heroku run rake db:migrate RAILS_ENV=production`

### rails console
`heroku run rails console`

### 再起動  
`heroku restart`

### 環境設定の確認
`heroku config`

### 環境変数の登録
`heroku config:add HOGE='hoge'`

## heroku設定
### deviseの本番環境用設定
```config/enviroments/production.rb
config.action_mailer.default_url_options = { host: '登録済App名.herokuapp.com' }
```
Linuxコマンド


勉強会でちょろっと聞いたものをメモ
~~Web開発者は下記を使えたら十分らしい(まさかり怖い)~~

随時更新していきます。

## 基本コマンド一覧

|コマンド|意味|オプション|備考|
|---|---|---|---|
|cd||||
|pwd||||
|mkdir||-p hoge/fuga/piyo 一度に多階層のディレクトリをを作成||
|rm|||かの有名な滅びの呪文 rm -rf /|
|vi||||
|cat||||
|mv|cp 移動元 移動先||リネームにも利用できる cp 変更前 変更後|
|cp|cp コピー元 コピー先|||
|touch|||既存ファイルに対して実行すると更新日付を更新|
|ls||-l ファイル詳細も表示||
|echo|echo "hoge" >> hoge.txt||ファイル作成は>、追記は>>|
|grep|grep "hoge" *.txt|||
|sudo|指定したユーザでコマンドを実行 sudo -u apple||デフォルトはルートユーザ|
|su|ユーザの切り替え||su -apple|
|head|head -3 hoge.txt ファイルの頭から指定行を出力|||
|tail||||
|more|more hoge.txt 1行づつ下にずらしていく|||
|less|less hoge.txt 1行づつ上下にずらす|||
|top|モニタリングコマンド|||
|df|ハードディスクの状況表示||使用率100%になるとサーバが止まるらしい|
|free|空き容量|||
|ps|プロセス表示||ps -ef \| grep 'postgres'|
|chmod|権限を変更する|||
|chown||||
|history|番号一覧から!1234で呼び出せる|||
|tar||||
|pdcopy|cat hoge.txt \| pdcopy||クリップボードにコピー(Mac限定)|
|which|which npm||システムワイドにインストールされてるか調べる時便利|

## 詳細
- chmod
[参考記事](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230728/)
- grep
[参考記事](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230786/) 
- ps  
postgresqlの操作するとき、別なプロセスで走ってないかなど調べたい時に使ってます

## まめ知識
* `\`でコマンドを改行できる

## viエディタ
linuxコマンドじゃないですが、コマンドライン関連という事で当記事に追記します。

[参考記事](http://uguisu.skr.jp/Windows/vi.html)

|コマンド|意味|
|---|---|
|vi ファイル名|エディタ起動|
|i|挿入モード（文字を編集出来る）|
|esc|コマンド入力モード（挿入モードを抜ける）|
|:q|viエディタ終了（内容を保存しない）|
|:q!|viエディタ終了（警告も無視する）|
|:wq|viエディタ終了（内容を保存）|
|hjkl|←↑↓→に移動（矢印カーソルも同様）|
|shift + g (G)|最下行に移動 (n + Gでn行に移動)|
|shift + 1 + g (1G)|先頭行に移動|
|0|行頭に移動|
|$|行末に移動|
|dd|行の削除|
|yy|行のコピー（x行の場合はxyy）|
|p|カーソルの次の行にコピー張付（shift + pでカーソルの行）|
|/<文字列>|文字列を準方向に検索|
|u|直前の操作を戻す|
|ctrl + shift + r|直前の操作を戻すのを戻す（操作を進める）|
npm でプロキシを設定／解除する


# プロキシを設定

- proxy, https-proxy の設定をしてもエラーになる場合、registry を設定します。
- npm -g config set で global に proxy, https-proxy, registry を設定します。
- Windows環境で bat ファイル化する場合、npmコマンドがbatファイルなので「npm …」としてしまうと bat ファイルが終了してしまいます。npm の前に call を付けて「call npm …」としてください。コマンドプトからコマンドを叩くなら call は無くても良いです。

### Linux

```bash:npm-set-proxy.sh
npm -g config set proxy "http://<server>:<port>/"
npm -g config set https-proxy "https://<server>:<port>/"
npm -g config set registry "http://registry.npmjs.org/"
```

### Windows
```bat:npm-set-proxy.bat
call npm -g config set proxy "http://<server>:<port>/"
call npm -g config set https-proxy "https://<server>:<port>/"
call npm -g config set registry "http://registry.npmjs.org/"
```

# プロキシを解除

- npm -g config deleteで global の proxy, https-proxy, registry を削除します。
- Windows 環境で bat ファイル化する場合は、npm の前に call を付けてください。コマンドプロンプトからコマンドを叩くなら call は無くても良いです。

### Linux

```bash:npm-delete-proxy.sh
npm -g config delete proxy
npm -g config delete https-proxy
npm -g config delete registry
```

### Windows

```bat:npm-delete-proxy.bat
call npm -g config delete proxy
call npm -g config delete https-proxy
call npm -g config delete registry
```


# 現在の設定を確認

- 現在の設定を確認するには、npm -g config list します。

```bash
npm -g config list
```
jupyterでyarn-clientのsparkを使う設定


- sparkを使うにはtoreeを使う
- defaultで --master local[2]になっているのをyarn-clientに変える
- toreeの設定fileは/usr/local/share/jupyter/kernels/toree/kernel.jsonにある。
 - これでsparkのspark-submitのオプション指定をしている。
 - masterをyarn-clientに変えるには下記のように変更する。
  
```/usr/local/share/jupyter/kernels/toree/kernel.json

{
  "env": {
    "SPARK_HOME": "/usr/local/spark",
    "SPARK_OPTS": "--master=yarn-client --driver-java-options=-Xms1024M --driver-java-options=-Xmx8096M --driver-java-options=-Dlog4j.logLevel=info",
    "CAPTURE_STANDARD_ERR": "true",
    "SEND_EMPTY_OUTPUT": "false",
    "PYTHONPATH": "/usr/local/spark/python:/usr/local/spark/python/lib/py4j-0.8.2.1-src.zip",
    "MAX_INTERPRETER_THREADS": "16",
    "CAPTURE_STANDARD_OUT": "true"
  },
  "argv": [
    "/usr/local/share/jupyter/kernels/toree/bin/run.sh",
    "--profile",
    "{connection_file}"
  ],
  "language_info": {
    "name": "scala"
  },
  "display_name": "Toree",
  "codemirror_mode": "scala"
}
```
[JS] Javascript (+jQuery)で要素をソートする

やんごとなき事情によりJavascriptでのソートが必要になったらこうする。
Javascriptネイティブ関数のsortを使う。

```js
// 降順にソートするサンプル
$(function(){
    var $items_wrapper = $('ul');
    var $items = $('ul li');
    $items.sort(function(a, b){
        return parseInt($(a).text()) < parseInt($(b).text()); 
    });
    $items_wrapper.html("");
    $items.each(function(){
        $items_wrapper.append($(this));
    })
});
```

サンプル
http://jsrun.it/jsmz/CFix
sshのconfigからpeco/fzfでssh login(n番煎じ)

すでにいくつもある`~/.ssh/config`からHostを抽出して、`fzf`か`peco`で選択しての`ssh`ログインするスクリプト。

色々参考にしつつ、一応自前で作成したもの。

改良点としては、

* ワイルドカード(?、*)無視
* 1つのHostにある、複数項目も選択肢に出る
* 引数でfizzy query+1だけなら即接続させる

になるようになってること。

```bash:ssh-select.sh
#!/bin/sh
host=""
# need backslash escape? ... currently not use backslash
if which fzf >/dev/null 2>&1; then
  host=$(grep -iEh "^host[[:space:]]" ~/.ssh/config ~/.ssh/conf.d/*.conf | sed -e 's/host[[:space:]]\(.*\)/\1/i' | tr ' ' '\n' |  grep -v -e '[*?]' -e '^[[:space:]]*$' | fzf  --prompt="Host\\> " --query="${*}" --select-1 | xargs -n 1)
  # use OPT env --ansi --reverse
elif which peco >/dev/null 2>&1; then
  host=$(grep -iEh "^host[[:space:]]" ~/.ssh/config ~/.ssh/conf.d/*.conf | sed -e 's/host[[:space:]]\(.*\)/\1/i' | tr ' ' '\n' |  grep -v -e '[*?]' -e '^[[:space:]]*$' | peco --prompt="Host\\> " --query="${*}" --select-1 | xargs -n 1)
else
  echo "selector not found"
fi

if [ ! -z "$host" ]; then
  echo "Connect " "$host"
  ssh "$host"
fi

# EOF
```

なお、Windows上では、以下のラッパー経由で呼び出す(同じ所に置く)

```bat:ssh-select.bat
@echo off
sh %~dp0ssh-select.sh %*
```

バッチ上で同じ動作を実現するのが、すごい面倒だったので、単に`sh`に食わすだけ。
CentOS 7 + GNOME 3 + Google Chrome で特定のサイトを開くと OS ごと固まっていたので固まらないようにした

# 結論

`/etc/X11/xorg.conf.d/20-intel.conf` を下記の中身にしました。`AccelMethod` に `uxa` を指定してあります。
OS ごと固まることはなくなりました。

```
Section "Device"
    Identifier  "Intel Graphics"
    Driver      "intel"
    Option      "AccelMethod"  "uxa"
EndSection
```

# 当初起きていた問題

## 環境

* カーネル 3.10.0-327.13.1.el7.x86_64
* CentOS 7.2.1511
* GNOME Shell 3.14.4
* Google Chrome 最近のやつ（50で問題がおきていたことは確認。それ以前の最近のものでも起きていましたが具体的なバージョンは記録していなかったので不明です）
* GPU Core i7-4790(Haswell)のオンボード

## 現象
* 特定のサイトを Google Chrome で使用すると OS ごと固まることがある
	* 固まるサイトは Google Keep など。他にも何かあったけど忘れました
	* 電源ボタンを押して電源断するしかなくなる
* `journalctl` で確認すると `Apr 18 08:56:08 localhost.localdomain kernel: [drm:intel_set_cpu_fifo_underrun_reporting [i915]] *ERROR* uncleared fifo underrun on pipe B` というエラーが発生していた

## 再現手順

* あるサイトはページをひらいて1分くらいで勝手に固まっていた（再現率100%）
* Google Keep は文字を入力しようとすると固まっていた
	* Google Keep は再現率 50% くらい
	* Google Keep は2分くらい待っていると元通り（？）使えるようになることがあった

# 解決策

`journalctl` のエラーメッセージで色々ググった結果、 Xorg の　GPU 関連の設定が怪しいのではないかという予想になりました。
それで上述の「結論」の設定にしました。
`AccelMethod` がキモで、デフォルトの `sna` （2012年から存在する比較的新し目で高速なもの）から `uxa`（以前からある安定したもの）に変更しました。

* `20-intel.conf` については [Archi Linux の wiki が詳しいです](https://wiki.archlinuxjp.org/index.php/Intel_Graphics)。
* もしくは `man intel` でも小さいを見ることができます。

# 結果
* OS ごと固まることはなくなった
	* しかし起動時にはなぜか同様のエラーメッセージが出ている模様
* 起動が遅くなった
    * 計測はしていないのではっきりしたことはいえませんが、`sna` のときと比較して、ログイン画面が出るまでが1分ほど遅くなった気がします。
godefをvendoringにとりあえず対応させる

## 追記 (6/6)
別のプルリクですが、無事[マージ](https://github.com/rogpeppe/godef/pull/33)されてました :tada: めでたしめでたし。

## 本文
Go1.6からvendoringがデフォルトで有効になっているんだけど、godefが対応していなくてやってられないので何とかする。

既に[pull request](https://github.com/rogpeppe/godef/pull/25)が出ててそれなりに動いているっぽいので、このブランチをビルドして使うと良い。ただ、goはimportにディレクトリ名まで含まれていてfork先のリポジトリをcloneしてきてgo buildしても動かないので、rogpeppe/godefにremoteを追加してcheckoutする。(githubのユーザー名にまで依存するの流石にどうなんですかね:innocent:)

```sh
$ go get -v github.com/rogpeppe/godef
$ cd $GOPATH/src/github.com/rogpeppe/godef
$ git remote add grncdr git@github.com:grncdr/godef.git
$ git fetch grncdr
$ git checkout grncdr/vendor-support
$ go build
$ cp godef $GOPATH/bin
```

importの部分からパッケージディレクトリにjumpする部分がうまく動いていない気がするけど、関数とか構造体からjumpする部分はうまく動いているので本体に組み込まれるまではこれで凌げそう。 (**追記:** go1.6以上でないとvendor以外のライブラリにうまくjump出来ないっぽいです)

なんかレビューもあんまり進んでないし不穏な空気なんだけど、基本的にほぼすべてのエディタのモードが依存してるしgo toolsに組み込んで公式にサポートしてくれないかなー。 :eyes:
Rails と bourbon と neat と bitters

Rails に bourbon,neat,bitters のインストール手順を書きます。

bootstrap などを使うとあまりにもブートストラップになってしまうことに困ることもあるとおもいます。
参考: http://megane84.com/blog/2013/12/25/post-2682/

`<div class="col-xs-12 col-sm-6 col-md-4">` こういうタグを書くのがつらいときがあります。
bourbon,neat,bitters のデフォルトは控え目で、自分で css を育てていく感じなので良いと思います。

http://bourbon.io  **Bourbon** scss の mixin 集
http://neat.bourbon.io **Neat** Grid システム
http://bitters.bourbon.io **Bitters** Bourbon,Neat を利用したサンプルのようなもの

## Rails に導入する場合

### 1. Gemfile に追加して `bundle install` する

``` ruby
gem 'bourbon'
gem 'neat'
```

### 2. bitters をインストールする

bitters は scss のサンプル的なファイルがいくつかインストールされるだけなので、Gemfile には書かない。

``` ruby
gem install neat
cd app/assets/stylesheets
bitters install
```


### 2. application.css をいれかえ

/app/assets/stylesheets/application.css を削除して、
以下の内容で application.scss を追加

``` css
@import "bourbon";
@import "neat";
@import "base/base";
```

## 以下のようになります

``` shell
/app/assets/stylesheets (master)$ tree
.
├── application.scss
├── base
│   ├── _base.scss
│   ├── _buttons.scss
│   ├── _forms.scss
│   ├── _layout.scss
│   ├── _lists.scss
│   ├── _media.scss
│   ├── _tables.scss
│   ├── _typography.scss
│   └── _variables.scss
└── scaffolds.scss
```

以上です。
bitters のインストール方法をいつも忘れるので書いておきました。


#バグ
2016/04/18 09:41:28 の時点では、`Undefined variable: "$font-stack-system".
` というエラーになったので、とりあえず

``` css
/* $base-font-family: $font-stack-system; */
$base-font-family: $lucida-grande;
```

のようにして回避した。
AbemaTVを見るためのプライバシー設定

# <i class="fa fa-cubes"></i> 概要

[AbemaTV]でアニメを見放題にするために。
自宅の潔癖症Firefoxで一週間ほど見れなかった悶々を解決する。

# <i class="fa fa-cogs"></i> 動作検証環境

* Windows7 64bit
* Firefox 45.0.2

# <i class="fa fa-user-md" aria-hidden="true"></i> 症状

FirefoxとIE10で[AbemaTV]を開くと真っ白になる。
コンソロールにはそれぞれ別々のエラーが出力されていた。
(IEは忘れた)
WindowsUpdateとFirefoxの更新を行ったところ、
IE10では非対応の表示がでるようになった。[^1]
Firefoxでは変わらず以下のエラーがでる。[^2]

`SecurityError: The operation is insecure. main.js:25:0`

ググってもクロスドメイン関係のエラーらしいが詳細は不明。
コードも難読化されていて不明。
イースター・エッグが腹ただしい。

アドオン関係かとセーフモードの起動も変わらず。

別のFirefoxでは視聴できる。

# <i class="fa fa-check-circle-o"></i> 解決

## Cookieの受け入れ

潔癖症からCookieを原則拒否しているので、
うまく表示されない場合の原因は8割Cookie受け入れで治る。
ただし、今回はエラーメッセージが出ており、一見Cookieとは別問題に見えたのでエラーメッセージの調査に時間を取られた。
また、複数のCookieの受け入れが必要である。

```sh:必要なCookieドメイン
https://abema.tv
https://apis.google.com
```

片方だけでもダメで、両方が必要だった。
今までは大抵URLのドメイン受け入れだけで解決していたが、
`https://apis.google.com`も必要。
調査方法はコンソールのネットワークから通信を選択してCookieタブを選択。
Cookieがあればそれを許可していって最小の組み合わせを調査。
許可する場合は`http`では多分駄目。[^3]

これでChromeの推奨は出るものの、[AbemaTV]トップ画面は表示される。

## アドオンの無効化

トップ画面が表示されても番組が視聴できない。
ページは表示されるが動画が始まらない。
こういう場合の原因の8割は[Flashblock]が原因なので、
オフにしたりホワイトリストを設定して見たりしても変わらず。

セーフモードで起動してみると動画が見れて、やはりアドオン関係か、となった。
結果的にはやはり[Flashblock]が原因だったのだが

**アドオンが有効状態で[Flashblock]をオフにしても見られず**
**[Flashblock]アドオン自体を無効化しなければならない**

原理はわからない。よく広告ブロックアドオンの警告などでアドオン判定がなされている感じはするが、
それも一時的に機能をオフにすれば解決すると聞く。

こちらはアドオンまるごと無効化しなければならず、他のブラウズにも影響してしまう。

Cookieによるエラーと合わせて謎を調べて行きたい。

### 追記

オフでも駄目な問題はアドオンのアップデートで解消。1.5.18.1では駄目だった模様。

***

では良きアニメライフを。
番組表はアニメチャンネルを一画面にまとめてほしいです。

[AbemaTV]:https://abema.tv/
[Flashblock]:https://addons.mozilla.org/ja/firefox/addon/flashblock/

[^1]: 対応はIE11から
[^2]: 関係ないですが更新によるアドオンの署名関係で泣きを見た
[^3]: 再現のため拒否する場合に駄目だった。
Routesの対応表をブラウザで表示する

リクエストのURLとメソッドに応じて処理を行う先のコントローラとアクションを決めるRoutesの対応表をブラウザで表示します。

rails serverを起動させて、以下のURLへブラウザでアクセスすると、Routesの対応表が表示されます。

http://localhost:3000/rails/info/routes
iTunes Connectの売上とトレンドを自動取得する

# !!!注意!!!

この記事で紹介したAutoingestion Toolは2016年11月一杯で使えなくなるとAppleより通知がありました。今後はReportというツールを使用してください。

Reportの使い方については、別途記事を書きましたので、参考にしていただければと思います。
[iTunes Connectの売上とトレンドを自動取得する（Report編） \- Qiita](http://qiita.com/yosan/items/801bcb1eaaa1876f5623)

↓↓↓↓↓↓↓↓ここから元の文です↓↓↓↓↓↓↓↓

iTunes Connectの売り上げとトレンドを取得するAppleのツールがあります。これをcronで実行することで、自動的にデータを取得できるようになります。今回そのツールについて調査してみました。

# Autoingestion Tool

Apple純正のiTunes Connectの売上レポート取得ツールです。
下記のドキュメントのDownloadボタンからツールを入手可能です。
http://www.apple.com/itunesnews/docs/AppStoreReportingInstructions.pdf
（2016/04時点のリンク http://apple.com/itunesnews/docs/Autoingestion.class.zip）  

# 使い方

## 1. 使用するアカウントに「Reports」権限があるか確認する

閲覧には「Reports」権限が必要です。権限が足りないと、ツールを実行しても「You do not have access to reports.」と言われてエラーが出ます。権限の変更が反映されるには数分程度時間がかかるので注意が必要です。（参考: http://nsdev.jp/ios/8813.html）

## 2. Vendor IDの特定する

ツールを使うには、自分の組織のVendor IDを特定する必要があります。iTunes Connect上で組織にひもづくIDと思われます。

**確認方法**
1. iTunes Connectの「売上とトレンド」画面を開きます。
2. 画面左上の「トップコンテンツ」のドロップダウンリストから「レポート」を選択します。
3. 組織名の右にある8から始まる数字がVendor IDです。
（ここクリックしてもOK。https://reportingitc2.apple.com/reports.html）


## 3. ツールを実行する

基本的な使い方はドキュメントを参照してください。
http://www.apple.com/itunesnews/docs/AppStoreReportingInstructions.pdf

**コマンド例**

```bash:
java Autoingestion autoingestion.properties <Vendor ID> Sales Daily Summary 20160405
```

**注意点**

* dateでWeeklyを使う場合は「weekend date」（日曜日）の日付を入力します。
* report_subtypeは「Summary」しか受け付けてくれませんでした。「Detailed」や「Opt-In」を実行しても「Auto ingestion is not available for this selection.」と言われます。
* ID/Passwordを直書きするので、共用サーバで回したりする場合は注意が必要です。

# データの見方

tsv形式で取得可能です。

表の見方についてはドキュメントを参照してください。ハマった点を補足します。

* Product Type Identifier: 新規、アップデートなどの種類が記号で示されています。
 * Appendix Eにタイプが記載されています。iOSなら1から始まるのが新規、7から始まるのがアップデートを意味しているようです。
 * 記載のないパラメータについてはここで質問されていました（https://forums.developer.apple.com/thread/24203）。下記の通りです。

| Product Type Identifier | Type |
|:--:|:--|
| 3 | Redownload of iPhone-only, or iOS and tvOS app (excluding iPad-only) |
| F3 | Redownload of Mac app |
| 3T | Redownload of iPad-only app |
| 3F | Redownload of Universal app (excluding tvOS) |

* iTunes Connectの「タイムゾーン」で、デフォルトの「UTC」ではなく「現地標準時」を選択すると、このUnitと数値が一致する模様です。

# その他

動作未確認ですが、調査中にnpmも見つけました。Hubotに収集させるときに使えそうです。
https://www.npmjs.com/package/apple-autoingestion
技術英語 > this simple example has shown how we could use it for [prognostics] / prognostics of a coming storm

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]

No. 795 / 2129

> The XADC can be a very powerful tool in both the system and FPGA designers tools box, this simple example has shown how we could use it for <font color=red>prognostics</font>, …

http://ejje.weblio.jp/content/prognostics
> 予知する、 前兆となる、 (…を)予知して

> <font color=red>prognostics of a coming storm</font>

<hr>
Emacs Magit2 Rebaseチュートリアル


## 1. Magitの画面を開きます。
`M-x magit-status`

## 2. Log一覧を表示します。
`M-x magit-log-popup` (`l l`)


## 3. rebase範囲を指定
例えば`my commit 5`を`fixup`(前のコミットへ含める)するとします。

![mg2.png](https://qiita-image-store.s3.amazonaws.com/0/8920/6b6ca9c8-5017-1080-3b6b-2ae7850e51d5.png)

`my commit 5`のひとつ前`my commit 4`の位置にカーソルを移動し
`M-x magit-rebase-interactive` (`r i`)

![mg3.png](https://qiita-image-store.s3.amazonaws.com/0/8920/1c2a82c9-0a7e-9289-4716-918bb8c1286f.png)

この画面では`C-c C-k`でrebaseのキャンセルが可能です。

## 4. rebase内容を指定

![mg4.png](https://qiita-image-store.s3.amazonaws.com/0/8920/3ec2bc81-9026-a566-70cf-dba33d792901.png)

`my commit 5`の位置で `f` を押してfixupマークを付けます。

|keybind    |mark         |description   |
|:---------:|:------------|:-------------|
|c| pick   |何もしない|
|e| edit   |編集|
|s| squash |ひとつ前のコミットに含める|
|f| fixup  |squashと同じだがメッセージの編集はしない|
|r| reword |メッセージの編集|

`C-c C-c`でマークした内容を確定させます。

今回はfixupのみため、`my commit 5`がログから消え、
`my commit 5`の変更内容は `my commit 4` に結合されます。

editマークを付けて編集中に混乱した場合は`M-x magit-rebase-abort` (`r a`)で破棄できます。

## rebase前の状態に戻したい
`M-x magit-reflog-head`

![mg5.png](https://qiita-image-store.s3.amazonaws.com/0/8920/5c797db7-a197-f15b-7d42-77f846e73488.png)

rebaseを完了する直前の`my commit 8`にカーソルを置き、`M-x magit-reset` (`x`)で戻します。
forコマンド

あるフォルダ中のwavファイルをffmpegで変換したいと思った。しかし一個一個コマンドを打つのは面倒だ。
そのようなとき`for`コマンドを使うと便利だ。

```
for %v in (*.wav) do ffmpeg -i %v -acodec pcm_u8 -ar 8000 .\out\%v
```

上のコマンドラインはあるフォルダのwavファイル名を１つずつ%vにセットし、do以下のコマンドを呼び出す。
Azure CLI を試してみた

[ブログからの転載](http://1bed.allright.life/?p=1990)

## 1. Azure CLI とは

公式より引用

> Azure コマンド ライン インターフェイス (Azure CLI) を簡単にインストールすると、コマンド ライン シェルからオープン ソースのコマンドを使って Microsoft Azure 上のリソースを作成したり管理したりすることができます。いくつかの方法があります。提供されているいずれかのインストーラー パッケージを使用してオペレーティング システムに Azure CLI をインストールするか、Node.js と npm を使って CLI をインストールするか、Docker ホストのコンテナーとして Azure CLI をインストールします。その他のオプションとバックグラウンドについては、GitHub のプロジェクト リポジトリを参照してください。

## 2. セットアップ

パターンは 3 つ

* インストーラーパッケージを利用する
* node.js と npm を使ってインストール
* Microsoft が用意してくれている Docker image を利用する

普段使っているコンテナが CentOS 7 なので、そちらにインストールした

### 2-1. 前準備

node.js と npm 入れておく

### 2-2. Azure CLI インストール

インストールは簡単(用意されている Docker image 使ったほうが速いはずだけど)

```bash
$ sudo npm install azure-cli -g
```
 
確認してみる

```bash
$ azure -v
0.9.19
```

## 3. Azure CLI を使ってみる

ブラウザも使うので注意する(恐らくコマンドラインだけでは完結しない？)

### 3-1. Azure にログインする

```bash
$ azure login
info:    Executing command login
/info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin. Enter the code XXXXXXXXX to authenticate.
/
```

ここでコンソールが止まるので、上記の通りに従って、[https://aka.ms/devicelogin](https://aka.ms/devicelogin)をクライアントのブラウザで開く

![](http://1bed.saloon.jp/wp-content/uploads/2016/04/1_login.png)

コンソールで「Enter the code XXXXXXXXX」と記載されていたコードを入力する

![](http://1bed.saloon.jp/wp-content/uploads/2016/04/2_login-1.png)

Microsoft Account でログインする

![](http://1bed.saloon.jp/wp-content/uploads/2016/04/3_login-1.png)

完了したらブラウザを閉じる

![](http://1bed.saloon.jp/wp-content/uploads/2016/04/4_login.png)

そうすると、先ほど止まっていたコンソールが動き出し、ログインした Microsoft Account に紐付いている Subscription が表示される

```bash
$ azure login
info:    Executing command login
/info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin. Enter the code G7ZZNGDD9 to authenticate.
/
info:    Added subscription aaaaaaaaaa
info:    Added subscription bbbbbbbbbb
info:    Added subscription cccccccccc
info:    Added subscription dddddddddd
info:    Setting subscription "aaaaaaaaaa" as default
+
info:    login command OK
```

### 3-2. アカウントリストの確認

```bash
$ azure account list
info:    Executing command account list
data:    Name                       Id                                    Current  State  
data:    -------------------------  ------------------------------------  -------  -------
data:    aaaaaaaaaa                 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxa  true     Enabled
data:    bbbbbbbbbb                 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb  false    Enabled
data:    cccccccccc                 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxc  false    Enabled
data:    dddddddddd                 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxd  false    Enabled
info:    account list command OK
```

### 3-3. カレントアカウントのセット

Name でも ID でもセット可能

```bash
$ azure account set xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb
```

### 3-4. Virtual Matchine の情報を取得する

V1 の情報取得、表示例は取り忘れたので割愛

```bash
$ azure config mode asm
asm
$ azure vm list
```

V2 の情報取得、表示例は取り忘れたので割愛

```bash
$ azure config mode arm
asm
$ azure vm list
```

これ、別で取るしかないのかな...

## 4. 参考

* [Azure CLI のインストール](https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-install/)
CIするためだけに一時的なブランチ名でgit pushする

Travis CIやCircleCIのテストを全部パスしてから`git push`したいけど、`git push`しないとCIが動かない、どうしたらいいんだ？とお悩みの方はいらっしゃいませんか？実は、履歴を汚さずにCIする方法があるんです。手元のcommitを本来のブランチではなく一時的な別ブランチにpushすればいいんです。

Travis CIやCircleCIでは特に設定しない限り全ブランチのpushに対してCIが走るので、別ブランチへのpushでもテスト結果を確認することができます。無事にテストをパスしたら改めて本来のブランチにpushすれば良いでしょう。

以下に例を示します。たとえばmasterブランチにcommitしたけどまだpushしていない状況としましょう。ここで次のようにすればローカルのmasterブランチをリモートの新たなブランチにpushすることができます。

```
$ git push origin master:implement-foobar-20160418
```

ブランチ名指定の部分は次のような記法になっています。

```
<ローカルブランチ名>[:<リモートブランチ名>]
```

普段はローカルブランチ名とリモートブランチ名が同じなので、`:`以下を省略して記述していたというわけです。

無事にテストに成功したら、この一時的なブランチは削除してしまいましょう。次のようにローカルブランチ名に空文字を与えてpushするとリモートブランチが削除できます。

```
$ git push origin :implement-foobar-20160418
```

これで歴史を汚さずに実験し放題というわけです。やったね！

## 他の利用シーン

たとえばMarkdownファイルをコミットするような場合でも、GitHub Flavored Markdownの見栄えってpushしてみないとわからなかったりするので、別ブランチを使うのはアリかなと思います。

## 特定の名前のブランチに対してCIしない設定

ブランチ名によってCIするかどうかを切り替える方法も示します。１リポジトリで複数のCIサービスを使っているような場合は特に有用でしょう。

### Travis CIの場合

```yaml:.travis.yml
branches:
  except:
    - gh-pages
    - /^circleci-.*$/
    - /^wercker-.*$/
```

`only:`でホワイトリスト設定もできます。（参考：[Whitelisting or blacklisting branches](https://docs.travis-ci.com/user/customizing-the-build/#Whitelisting-or-blacklisting-branches)）

### CircleCIの場合

```yaml:circle.yml
general:
  branches:
    ignore:
      - gh-pages
      - /^travisci-.*$/
      - /^wercker-.*$/
```

`only:`でホワイトリスト設定もできます。（参考：[Specifying branches to build](https://circleci.com/docs/configuration/#branches)）

### Werckerの場合

設定ファイルに書く方法は無さそうです。Webコンソールの「Settings」「Options」「Ignored branches」からブランチ名のブラックリスト設定ができます。
PhoenixでRedisを使わないPubSubでスケール その2


[その1](http://qiita.com/tamai/items/7ea68aeaed1f44746cc1)

前回に続き、今回はPhoenixアプリを使ってPG2でのPubSubを試します。

## アプリを用意

自分で用意するのも面倒なので、公式のexampleを使います。

```
git clone https://github.com/chrismccord/phoenix_chat_example
cd phoenix_chat_example
mix deps.get
npm install
```

今回は、vagrant上で実行しているので、check_originの設定をfalseにします。

```config/config.ex
config :chat, Chat.Endpoint,
  url: [host: "localhost"],
  root: Path.expand("..", __DIR__),
  secret_key_base: "/RjKJmMO6raXPRTq63qTqid1x6lVKTOP+FTxZHfX6Ogd+1xYmH6eZZFhBu1CIwtg",
  debug_errors: false,
  pubsub: [name: Chat.PubSub,
           adapter: Phoenix.PubSub.PG2],
  check_origin: false # ここを追加
```

phoenixを起動します。

```
mix phoenix.server
```

![Hello_Phoenix_.png](https://qiita-image-store.s3.amazonaws.com/0/54939/cff0afa5-35aa-a690-8f6e-058e0894a403.png "Hello_Phoenix_.png")

起動するとこんな感じでチャットが出来るようになっています。

## PubSubを試す

別ターミナルでアプリをコピーしてポート違いでPhoenixを起動します。

```
vagrant-ubuntu-precise-32% mix phoenix.server
[info] Running Chat.Endpoint with Cowboy using http on port 4000

vagrant-ubuntu-precise-32% mix phoenix.server
[info] Running Chat.Endpoint with Cowboy using http on port 4001
```

この状態では、ただ2つのアプリを立ち上げただけなのでチャットの状態は共有されていません。

その1と同様に`sys.config`を設定します。
その状態で以下をそれぞれ実行

```
iex --name foo@127.0.0.1 --erl "-config sys.config" -S mix phoenix.server
iex --name bar@127.0.0.1 --erl "-config sys.config" -S mix phoenix.server
```

ちょっとわかりにくいですが・・・、
port違いのアプリケーションで a のメッセージが共有されています。

![Hello_Phoenix_.png](https://qiita-image-store.s3.amazonaws.com/0/54939/0513e490-c4c8-b13b-cae7-8ca6449b9d06.png "Hello_Phoenix_.png")

![Hello_Phoenix_.png](https://qiita-image-store.s3.amazonaws.com/0/54939/a985bd38-e48b-a216-93a2-75a55fddb9f2.png "Hello_Phoenix_.png")

これで、PG2でPubSubが出来ました。

## PG2でPubSubってどうなの？

http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections

web server1台で200万コネクションまでいけてるっぽいです。
更にスケールも、今回試したようにserverを増やせばPG2の性能的にある程度まではスケールするでしょう。

PG2の性能ですが、以下で調べている方がいました。
[分散Erlang周りの性能測定メモ](http://qiita.com/sile/items/1852425f0f70e790ebea)

Nodeが増えるごとに性能に劣化が見られるので、
許容できるレベルの劣化を超えるようであれば別にPubSubを用意したほうがいいでしょう。
RedisのPubSubがどのくらいスケールするのか正直わかっていませんが、
Redisをスケールさせるのはかなり難しいので、別の方法を考えたほうがいいと思ってます。

以上です。

PG2のPubSubの仕組み解説をその3でやるかもしれません。
Starling2.0(β)上でDragonBonesを動かす

DragonBonesの旧バージョンがStarling2.0に対応してくれないので、無理やり動かしてみました。誰得な記事です。なお、Starling2.0は未だベータなので、今後挙動が変わる可能性もあります。

![cover.png](https://qiita-image-store.s3.amazonaws.com/0/8302/1e5a5292-c8b1-8498-3bae-027d0110a6f7.png)

# 利用した各バージョン
* Adobe Animate CC 15.1.1.13
* DragonBones Design Panel V2.4.1
* DragonBonesAS 3.0.1
* Starling 2.0

DragonBonesの最新バージョンは4系なのですが、なぜ3系を使うかというと、4系は(SPINEくりそつな)スタンドアローンのアニメーションエディタ(AIR製ぽい)を使う前提だからです。FlashCCのエクステンションで動くDragonBones Design Panelで書き出したデータを扱えるのは、 2系か3系となります。そしてAnimateCCでもDesign Panelは動きます。SPINEそのまんまなツール使うならSPINE使えばいいと思うんだよね。(DragonBonesツールは、無料でメッシュまで対応してるというアドバンテージはありますが）。

# 具体的な作業

ビルドするとエラーになるので、DragonBones側のコードで以下の部分を書き換えます。

* Starling2.0ではhandleLostContext設定ができなくなったので(自動で取り扱われる)

```lang:dragonBones.factorys.StarlingFactory.as
// l112くらい
if (Starling.handleLostContext)
↓
if (true)
```

* プロパティ名が変わったので

```lang:dragonBones.factorysStarlingFactory.as
// l153くらい
image.smoothing = displaySmoothing;
↓
image.textureSmoothing = displaySmoothing;
```

* transformationMatrixの扱いが変わったので

```lang:dragonBones.display.StarlingSlot.as
// l121くらい updateTransform関数の中 ずらっとコメントアウトして書き換える。
//if(pivotX || pivotY)
//{
//	displayMatrix.tx = _globalTransformMatrix.tx - (displayMatrix.a * pivotX + displayMatrix.c * pivotY);
//	displayMatrix.ty = _globalTransformMatrix.ty - (displayMatrix.b * pivotX + displayMatrix.d * pivotY);
//}
//else
//{
//	displayMatrix.tx = _globalTransformMatrix.tx;
//	displayMatrix.ty = _globalTransformMatrix.ty;
//}

displayMatrix.tx = _globalTransformMatrix.tx;
displayMatrix.ty = _globalTransformMatrix.ty;
_starlingDisplay.transformationMatrix = displayMatrix;
_starlingDisplay.pivotX = pivotX;
_starlingDisplay.pivotY = pivotY;

```

Starling2.0のtransformationMatrixでは参照側を書き換えても、設定がアップデートされないようですね。改めて代入すると動くようになるのですが、その際にpivot設定が消えてしまうのようなので、こちらも再設定してやります。

# Enjoy!
以上です。意外と少ない変更で動きますが、最後の部分、Starling2.0側をちゃんと理解していないので怪しいです。あと、カラー効果とかレイヤー合成とか動作確認してませんので悪しからず。


# おまけ
最近AIR開発のエディタも本格的にFlashBuilderからIntelliJ IDEAに乗り換えました。全く問題ないです。他の言語(業務)とおなじ高機能なエディタで開発できるのはとても効率がいいですね。

SPINEのActionScript3ランタイム(使ったことないけど)もStraling2対応してほしいな。自分でやるか。
jQueryの$.ajaxSetupを使ってAJAX通信時のデフォルト値を設定する

AJAXのデフォルト値を設定できる
https://api.jquery.com/jquery.ajaxsetup/

```js
$.ajaxSetup({
  url: "ping.php"
});
```

railsだとデフォルト(jquery-ujs)でcsrf-tokenなどヘッダ付けてくれるが、そうではないフレームワークなどで使うことがありそうなのでメモ。

```
$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
});
```
Swiftでメタプロっぽい事をする

[GetWild退勤的なセンサーアプリを簡単に作れるフレームワークを作ったのでiPhoneに歯痛を心配されたり色々する](http://qiita.com/oubakiou/items/218b6ed08a6faaf5ee8b)

で得た知見シリーズ

# 文字列のクラス名からインスタンスを生成する

```swift
public func NSClassFromString(aClassName: String) -> AnyClass?
```

を使う。

```swift
@objc(Hoge)
class Hoge: NSObject, FugaProtocol {
}
```

```swift
let className = "Hoge"
let cls = NSClassFromString(className) as! NSObject.Type
instance = (cls.init() as! FugaProtocol)
```

生成対象にするクラスはNSObjectを継承していて、かつ@objcを付けていないといけない。

# 動的にpropertyを追加する

```swift
public func objc_setAssociatedObject(object: AnyObject!, _ key: UnsafePointer<Void>, _ value: AnyObject!, _ policy: objc_AssociationPolicy)
```
と

```swift
public func objc_getAssociatedObject(object: AnyObject!, _ key: UnsafePointer<Void>) -> AnyObject!
```

を使う

```swift
import Foundation

protocol dynamicStoredPropertyProtocol {
    func setDynamicStoredProperty(propertyName: String, propertyValue: AnyObject)
    func getDynamicStoredProperty(propertyName: String) -> AnyObject?
}

extension dynamicStoredPropertyProtocol where Self: NSObject {
    func setDynamicStoredProperty(propertyName: String, propertyValue: AnyObject) {
        if !hasDynamicStoredPropertyContainer() {
            initDynamicStoredPropertyContainer()
        }
        
        var container = getDynamicStoredPropertyContainer()
        container![propertyName] = propertyValue
        setDynamicStoredPropertyContainer(container!)
    }
    
    func getDynamicStoredProperty(propertyName: String) -> AnyObject? {
        guard var container = getDynamicStoredPropertyContainer() else {
            return nil
        }
        return container[propertyName]
    }
    
    func initDynamicStoredPropertyContainer() {
        setDynamicStoredPropertyContainer([:])
    }
    
    func setDynamicStoredPropertyContainer(container: Dictionary<String, AnyObject>) {
        objc_setAssociatedObject(self, &containerPointer, container, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
    
    func getDynamicStoredPropertyContainer() -> Dictionary<String, AnyObject>? {
        return objc_getAssociatedObject(self, &containerPointer) as? Dictionary<String, AnyObject>
    }
    
    func hasDynamicStoredPropertyContainer() -> Bool {
        guard (getDynamicStoredPropertyContainer() != nil) else {
            return false
        }
        return true
    }    
}

private var containerPointer:UInt8 = 0

```

元気とランタイムAPIがあれば何でもできる。

ここまで書いておいてあれだけれど、コンパイル時に分からず実行してみないと分からない事が増えたり、計測してないけどランタイムAPIを使うとパフォーマンスどうなんだろうという懸念があったりするので、普通のアプリケーションでは使わない方が良いと思う。

# 参考にしたもの
+ [objective c - swiftでクラス名からインスタンスを生成する方法 - スタック・オーバーフロー] (http://ja.stackoverflow.com/questions/6549/swift%E3%81%A7%E3%82%AF%E3%83%A9%E3%82%B9%E5%90%8D%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
+ [Swiftのextensionでstored Propertyを追加する？（黒魔術は閉じ込める）](http://www.tokoro.me/2015/11/08/has-associated-objects/)
+ [ios - Swift - Extension stored properties alternative - Stack Overflow](http://stackoverflow.com/questions/25426780/swift-extension-stored-properties-alternative)
slack-api でチャンネル名から ID を取得する


概要
----
Slack 用 bot を Ruby で作成するのに、[slack-api](https://github.com/aki017/slack-ruby-gem) を利用し、下記のようなコードで、各チャンネルでの発言を取得している。

```ruby
require 'slack'
Slack.configure {|config| config.token = TOKEN }
client = Slack.realtime

client.on :message do |data|
  # 投稿内容でいろいろ処理する
end
```

投稿内容でいろいろ処理するなかで、特定の部屋での発言にのみ反応させたくなったので、if でチャンネル名を条件に加えようとしたが、`data['channel']` で取得できるものはチャンネル ID となっているので、正しく判定できない。

その問題を解決するために雑に考えてみた結果である。


対処
----
API を利用し、チャンネルリストを取得することができる。チャンネルリストは下記のようになっている。

```
{
  "ok" => true,
  "channels" : [
    {
      "id" => "A1B2", # チャンネル ID
      "name" => "hoge", # チャンネル名
      # 作成者や参加者、トピックなどもある
    },
	{
		# これの繰り返し
    }
  ]
}
```

そのため、取得可能なチャンネルをすべて取得し、その中から指定したチャンネル名と一致するものの ID を返すというメソッドを作成した（とりあえず一致するものがなければ空としている）。


```ruby
def get_channel_id(channel_name)
  channel_id = ''
  c_list = Slack.channels_list
  if c_list['ok']
    c_list['channels'].each do |channel|
      channel_id = channel['id']  if channel['name'] == channel_name 
    end
  end
  
  channel_id
end
```

問題点
----
* チャンネル数が多くなると時間がかかるようになってしまう
	* なのでもうちょっと考えたほうがいい
* Private なチャンネルは取得できない
	* そもそも API で取得できない模様
Swagger についての覚書

Swagger で覚えたこと、ハマったことをメモしていく

## Swagger と JSON schema の位置づけ

- Swagger は API を定義するためのもの
- JSON schema は JSON のデータ構造を定義するためのもの
- JSON Hyper-Schema も API を定義するためのもの

対比するとしたら Swagger <-> JSON Hyper-Schema
Swagger <-> JSON schema ではない

現に Swagger の型定義は JSON schema が使われてる

## Swagger と JSON Hyper-Schema の比較

### Swagger

#### Pros

- swagger-ui かっこいい
- codegen に言語いっぱい

#### Cons

- JSON Schema 準拠とはなんだったのか
- JSON Schema の抽出してくれるやつがない
- committee がない
    - ドキュメントの通りに実装されていることを保証しようとする何かがないように見える

### JSON Hyper-Schema

#### Pros

- committee がつかえる
- prmd がつかえる

#### Cons

- generator が heroics くらいしかないのでは
- ref 意味あるのかな...

## type を複数指定すると generate client できない

JSON schema と違って type は複数指定できない。
JSON schema を一部採用しているだけで、別に全部取り込んでるわけじゃない。

https://github.com/swagger-api/swagger-editor/issues/868#issuecomment-210019159

## committee つかいたい

Swagger から型定義ひっこ抜けば理屈上はできるはずだけど、そんなもんなかった。
Swagger から Hyper-Schema に変換するのが楽かと思って適当にスクリプト書いた。

https://github.com/mtsmfm/swagger2hyperschema

## CLI でバリデーションしたい

ないんじゃない?
最初はちょっと変更したら常に確認したい気もしていたけれど、だいたい把握できたらそんなに気にしなくなった。
困ったときに editor に貼ってみる感じ。
http://editor.swagger.io/#/

一方、editor 上で validation 通ってもいい感じのクライアントが生成できるとは限らない。
クライアントの出来は言語ごとにかなりまちまちっぽい?

## Angular2 のクライアント生成したい

issue ならあるが本体には入ってない。

https://github.com/swagger-api/swagger-codegen/issues/1809

issue にコメントされてるやつがいいかも。

https://github.com/sapienstech/typescript-angular2-swagger-codegen/

動かなかったりしたので直したりした。

## プロパティが snake_case でも CamelCase にされるんだけど?

-c をつけて json でなんか設定できるっぽい。

`docker run -v $PWD:/tmp swagger-codegen-ng2 generate -i /tmp/swagger.yml -l typescript-angular2 -o /tmp/frontend/app/client -c /tmp/swagger-config.json`

```json
{
  "modelPropertyNaming": "original"
}
```
CentOS6でArtifactoryを構築するshell

iptablesはoff前提。
実行後、http://hogehoge:8081/ でアクセス。

* 設定される環境変数は下記URL参照
https://www.jfrog.com/confluence/display/RTF/Installing+on+Linux+Solaris+or+Mac+OS#InstallingonLinuxSolarisorMacOS-RPMorDebianInstallation

```bash
#!/bin/bash -ex

ARTIFACTORY_VERSION=4.7.2
# PROXY_HOST=
# PROXY_PORT=
# NO_PROXY=

# export http_proxy="http://${PROXY_HOST}:${PROXY_PORT}"
# export https_proxy="http://${PROXY_HOST}:${PROXY_PORT}"
# export no_proxy="${NO_PROXY}"

yum -y install java-1.8.0-openjdk-devel
rpm -ivh https://dl.bintray.com/jfrog/artifactory-rpms/jfrog-artifactory-oss-${ARTIFACTORY_VERSION}.rpm
service artifactory start

```
Heroku Postgres を使ってみる

# 手順
### 1. [Heroku](https://dashboard.heroku.com/) のアカウントを用意

### 2. [Heroku Postgres](https://postgres.heroku.com/databases) で `Create Database` をクリックし、表示されたモーダル内の `Dev Plan(Free)` を選択 
![HerokuPostgres.png](C:\Users\k.ito\Downloads\tmp\HerokuPostgres.png)

**※ 10,000 行までは無料で使用することができる **

### 3. psql で接続
1. psql -h _hostname_ -U _username_ -d _databasename_
2. パスワード入力

### 4. テーブルを作成し、データを挿入
```sql
-- テーブルを作成
CREATE TABLE sample
(
  crttimestamp timestamp with time zone,
  crtuser character varying(20),
  udttimestamp timestamp with time zone,
  udtuser character varying(20),
  id character varying(10) NOT NULL,
  name character varying(100) NOT NULL,
  CONSTRAINT sample_id_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
```

```sql
-- データを挿入
INSERT INTO sample(crttimestamp, crtuser, udttimestamp, udtuser, id, name) VALUES (current_timestamp, 'test', current_timestamp, 'test', '0000000001', 'test001');
INSERT INTO sample(crttimestamp, crtuser, udttimestamp, udtuser, id, name) VALUES (current_timestamp, 'test', current_timestamp, 'test', '0000000002', 'test002');
INSERT INTO sample(crttimestamp, crtuser, udttimestamp, udtuser, id, name) VALUES (current_timestamp, 'test', current_timestamp, 'test', '0000000003', 'test003');
```

```sql
select * from sample;
```

# 困ったこと
ssl で接続しないと下記のエラーが発生した。
heroku postgres の pg_hba.conf は編集できないので、SSLモードで接続するようにする。

> FATAL: no pg_hba.conf entry for host "[host ip address]", user "[user name]", database "[database name]", SSL off
Cloudformation UserData生成スクリプト

xxxxxxxx.shは任意のファイルパスに修正すること。
実行すると、xxxxxxxx_escape.shファイルが生成される。

```rb:escape.rb
file_path = 'xxxxxxxx.sh'
file_buff = []
File.open(file_path) do |f|
  f.each_line do |line|
    str = line.encode('UTF-8', 'UTF-8').strip.gsub(/"/, '\"')
    file_buff << ((str == '') ? '"\n"' : '"' + str + '", "\n"')
  end
end
template = <<"EOS"
"UserData": {
  "Fn::Base64": {
    "Fn::Join": [ "", [
      #{file_buff.join(",\n      ")}
    ]]
  }
}
EOS
File.write(file_path.split('.', 2).join('_escape.'), template)

```
DynamoDB x Python / Decimal を登録する

## JSON と Python のマッピング

JSON と Python の dict は以下のようにマッピングされている。

|JSON|Python|
|:--:|:--:|
|object|dict|
|array|list|
|string|unicode|
|number (int)|int, long|
|number(real)|float|
|true|True|
|false|False|
|null|None|

そのため、JSON を `json.loads()` でパースして、そのまま `dynamo.put_item()` で登録すると前述の型で登録される。この際に float 型があると下記のように怒られる。

```
Float types are not supported. Use Decimal types instead.
```

Python の float はそのままでは DynamoDB に登録できないのである。
代わりに Decimal で登録する必要がある。

## Float ではなく Decimal として登録するには？

Float を Decimal にマッピングさせる必要がある。
例えば以下の様なデータを登録するとする。

```json:json_data
{"Timestamp": "20160323T203501.000+0900", "x": -0.279938, "y": -0.754028, "z": -0.607758 }
```

JSON をパースする際に下記のように `parse_float=decimal.Decimal` をつければよい。

```py
import json
import boto3
import decimal
#...省略
item = json.loads(json_data, parse_float=decimal.Decimal)
dynamo = boto3.resource('dynamodb').Table('ThisIsJustTest')
dynamo.put_item(Item = item)
```

## 補足

Python 公式にも記載されていたが、ぐぐってもすぐに情報が出なかったので記事にした。

https://docs.python.org/2/library/json.html#encoders-and-decoders

> parse_float, if specified, will be called with the string of every JSON float to be decoded. By default, this is equivalent to float(num_str). This can be used to use another datatype or parser for JSON floats (e.g. decimal.Decimal).

```
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
```

AWS のドキュメントにもサラッとのっていた。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.02.html

### Decimal から戻すとき

以下のようなやり方紹介されている。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.03.html
http://stackoverflow.com/questions/1960516/python-json-serialize-a-decimal-object