OmniAICreator/Qiita-1.07M huggingface dataset:
SQL Server Management Studio で Poor Man's T-SQL Formatter が動かない場合の対処

## 問題

SQL Server 2014 Management Studio に Poor Man's T-SQL Formatter をインストールしたが、メニュー [ツール] にコマンドが現れなくて困ったので対処を記録する。
Poor Man's T-SQL Formatter は、SQL を整形するアドオン。

> 2016-08-24 追記
SQL Server 2016 Management Studio で動作しなかったのでメモを追加した。対処とは言いにくいが。
[SQL Server 2016 Management Studio で Poor Man's T-SQL Formatter が動かない場合](http://qiita.com/monta31538/items/30c45f0274c3e6f7439f)


## 情報元

- [Stack Overlow - Does the Poor Mans T-SQL formatting add-in for Management Studio 2012 work in Management Studio 2014?](http://stackoverflow.com/questions/23303026/does-the-poor-mans-t-sql-formatting-add-in-for-management-studio-2012-work-in-ma)


## 確認した環境

- Windows 8.1 Update
- SQL Server 2014 Management Studio
- Poor Man's T-SQL Formatter 2013-10-23, version 1.5.3 (SSMS / Visual Studio Add-In only)


## 参照先

[Architect Shack](http://architectshack.com/PoorMansTSqlFormatter.ashx)


## 手順

1. 参照先からファイル `SqlFormatterSSMSAddIn.Setup.1.5.3.msi` をダウンロードする。
- SQL Studio Management Studio が開始している場合は終了する。
- Poor Man's T-SQL Formatter をインストールする。
- 次のファイルを先フォルダにコピーする。コピー先のフォルダが存在しない場合は作成する。
    - コピーするファイル  
`C:\ProgramData\Microsoft\SQL Server Management Studio\11.0\Addins\PoorMansTSqlFormatterSSMSAddIn.AddIn`
    - コピー先のフォルダ  
`C:\ProgramData\Microsoft\SQL Server Management Studio\12.0\Addins`

- SQL Studio Management Studio を開始する。
簡易Wget

# wget や ブラウザが使用できない際に、rubyで簡易的にページを取得

### レスポンスヘッダ等の情報が知りたい場合に使用

```rb:http_get.rb
#!/bin/env ruby
require 'net/http'

if ARGV.size == 0
  puts "usage: httpget.rb <url>"
  exit 1
end

url=ARGV[0]
schema, tmp=url.split("://")
pos=tmp.index("/")
if pos.nil?
  host = tmp
else
  host = tmp[0, pos]
  path = tmp[pos..-1]
end

path = "/" if path.nil?

http = Net::HTTP.new(host, 80);

request_header = {}
request_header["User-Agent"] = "hogehoge"
request_header["Connection"] = "Keep-Alive"

response = http.get(path, request_header)

puts "STATUS CODE: #{response.code}"
  response.each { |k,v|
  puts "#{k} : #{v}"
}

puts "outputing res_body.dat"
File.open("res_body.dat", "w") { |file|
  file.write response.body
}
```
```bash
[user@hoge script]$ ruby ./http_get.rb http://www.google.co.jp
STATUS CODE: 200
server : gws
vary : Accept-Encoding
expires : -1
accept-ranges : none
set-cookie : PREF=ID=1111111111111111:FF=0:TM=1444185579:LM=1444185579:V=1:S=1Ld2B6b7S-uc3Oym; expires=Thu, 31-Dec-2015 16:02:17 GMT; path=/; domain=.google.co.jp, NID=72=mOgQBVn1blEgYNHYcNUahz-1hm1zaUxBXLvvBgzrEKY7YuZ98J08Ik0iPzN9Y3NtamsaR5lxybhboylr8GH4osO_Mh8T0AL4WTVyAeFmUUuE65Vd4goG9f1r0SqCwRqdvL_ZdQ; expires=Thu, 07-Apr-2016 02:39:39 GMT; path=/; domain=.google.co.jp; HttpOnly
p3p : CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
x-frame-options : SAMEORIGIN
transfer-encoding : chunked
date : Wed, 07 Oct 2015 02:39:39 GMT
cache-control : private, max-age=0
content-type : text/html; charset=Shift_JIS
x-xss-protection : 1; mode=block
outputing res_body.dat
```
簡単にPostgreSQLのpsqlで実行したクエリの結果をcsvやtxt形式などで取得する

#はじめに
データベースのレコードをcsvなどのファイルに出力する方法は色々ありますが、今回は**postgresql**の**psql**上での動作になります。

**条件で絞り込んだり、必要なカラムのみで抽出したデータがほしい時**などに使えると思います！



#psqlで実行したクエリの結果をcsvやtxt形式などで取得してみる

##①psqlを立ち上げる
```
$ psql hogehoge
```
適宜psqlを立ち上げてください。


##②csvを取得する
psql上で任意のクエリの結果をcsvで取得する。

```sql
book_system=# ¥a
book_system=# ¥f ,
book_system=# ¥o FILENAME.csv
book_system=# SELECT * FROM hogehoge;
```

これで、指定したディレクトリにfilename.csvというファイル名で、実行したクエリの結果が取得できます。

### ーコマンド解説ー
+ **¥a**：通常psqlでクエリを実行すると、結果が見やすいように均等にスペースなどを使って表示してくれますが、**¥a**を実行すると**均等にならない**でスペースがなくなります。
+ **¥f ,**：通常psqlでクエリを実行すると、結果が見やすいように各カラムを **|** で区切ってくれますが、csv形式でファイルを読み込む際は **,(カンマ)** 区切りの方が読み込みが楽なので**区切り文字を変更**します。
+ **¥o filename.csv**：実行するクエリを全て**filename.csv**に出力します。**ファイル形式をcsvからtxt、tcvなどに変更**することができます。

こんな感じで、psql上で実行したクエリの結果をcsvやtxtなどで取得が可能になります！


#おわりに
sshで接続したサーバからローカルにデータを持ってきたい！
なんて場合には、**scp**コマンドを使ってあげるといいですねー。

ということで、以上『postgresqlのpsqlで実行したクエリの結果をcsvやtxt形式などで取得する』でした！
otto v0.1.2のVagrantfile生成機能が便利そう


[otto](https://ottoproject.io/)の話です。

# 前置き

- `otto deploy` 以降のコマンドの話はしません。
- [v0.1.2dev](https://github.com/hashicorp/otto)を使いました。現時点の公式安定版はv0.1.1です。

# 最初に結論

Vagrantfile生成機能が便利です。

# Easy Vagrantとしてのotto

`otto dev`コマンドだけを見れば、ottoは既存のプロジェクトを解析してVagrantfileを作ってくれる便利ツールです。

実質的に

- `otto compile`コマンド: `.otto/compiled/app/dev/Vagrantfile`を作成
- `otto dev`コマンド: `vagurant up`

です。

# うれしいシチュエーション	
Railsアプリケーションを簡単に動かせるのが便利です。
（おそらく他の言語のアプリケーションでも使えますがRailsで試しました。）
たとえば

- 社内の他チームが開発中のアプリケーションを試しに動かす
- 既存のRuby on Railsアプリケーションの改修の見積もり依頼

厳密な環境ではなくとも、手早く起動したいときに便利です。


# 解決する問題

私は日頃はRuby on Railsを扱っていません。
たまに必要があって環境構築をしようとすると、なぜか毎回苦労します。

- rubyはnativeで入れるのか、rvmやrbenvを使うのか？ :anguished: 
- nokogiriのインストールするに毎回違う理由で失敗する :anger: 
- Gemの依存しているライブラリーを調べるのが辛い（myslq2はlibmysqld-devに依存しているのか？libmysqlclient-devに依存しているのか？）:astonished: 

これを勝手に解決してくれます！:100: 

# 手順

## 仮想環境の構築

適当なアプリケーションを`git clone`します。
（publicな適当なアプリケーションが思いつかないので、省略します）
アプリケーションのディレクトリ内で

```
otto compile
otto dev
```

これだけで、VagrantとViratualBoxを使った仮想環境が作れます。
実行には10分ぐらい掛かります。

## アプリケーションの初期設定

`otto dev ssh`でsshログインして、config/database.ymlを用意します。
[Ruby - Otto dev sshしてからhostのMysqlへの接続 - Qiita](http://qiita.com/kyanagimoto/items/20f367fa49c492d07d98) を参考にして、hostを設定するとホストOS上のMySQLに接続できます。

```
netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10
```

は仮想環境上実行します。

```
vagrant@precise64:/vagrant$ netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10
10.0.2.2
10.0.2.2
```


DBを構築して、アプリケーションを起動します。

```
rake db:migrate:reset
rake db:seed
rackup --host 0.0.0.0
```

`otto dev address` で仮想環境のIPアドレスがわかります。

（例えば）

```
~ otto dev address
172.16.1.229
```

http://172.16.1.229:9292 に接続すれば該当アプリケーションが動きます。


# まとめ 0.12（次バージョン）で追加されたらうれしい機能

- Gemfile（とGemfile.lock）から依存ライブラリーを解析
- `otto dev`でbundle実行

githubのmasterブランチに追加されている機能です。
公式のロードマップは確認していません。
npm install mongodb kerberos error

```
ake: Entering directory `/home/wangzhu/godtrans/app/node_modules/mongoose-paginate/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/kerberos/build'
  CXX(target) Release/obj.target/kerberos/lib/kerberos.o
In file included from ../lib/kerberos.cc:1:0:
../lib/kerberos.h:5:27: fatal error: gssapi/gssapi.h: No such file or directory
compilation terminated.
make: *** [Release/obj.target/kerberos/lib/kerberos.o] Error 1
make: Leaving directory `/home/wangzhu/godtrans/app/node_modules/mongoose-paginate/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/kerberos/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:820:12)
gyp ERR! System Linux 2.6.32-042stab092.2
gyp ERR! command "node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/wangzhu/godtrans/app/node_modules/mongoose-paginate/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/kerberos
gyp ERR! node -v v0.10.37
gyp ERR! node-gyp -v v1.0.1
gyp ERR! not ok
```
>>>
```
sudo apt-get install libkrb5-dev
```
CircleCI で MeCab (mecab-ruby) を使う

[CircleCI](https://circleci.com/) で、[mecab-ruby](http://taku910.github.io/mecab/) を使う方法のメモです。
mecab-ruby をソースから入れるとうまくいかなかったのですが、[mecab gem](https://github.com/markburns/mecab) を使えば大丈夫でした。

---

```ruby:.ruby-version
2.2.3
```

```ruby:Gemfile
gem 'mecab'
```

```yaml:circle.yml
dependencies:
  pre:
    - sh circle/install_mecab.sh
  cache_directories:
    - vendor/mecab
```

```sh:circle/install_mecab.sh
# Thanks to: http://qiita.com/saicologic/items/933e2f27b3e32c199248

set -x
set -e

BASE_DIR="$PWD/vendor/mecab"

sudo apt-get remove mecab

if [ ! -d "$BASE_DIR" ]
then
    mkdir $BASE_DIR
fi

if [ ! -f "$BASE_DIR/mecab-0.996.tar.gz" ]
then
    cd $BASE_DIR
    wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" -O mecab-0.996.tar.gz
    tar zxvf mecab-0.996.tar.gz
    cd mecab-0.996
    ./configure
    make
fi
cd $BASE_DIR/mecab-0.996
sudo make install
sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf"
sudo ldconfig

if [ ! -f "$BASE_DIR/mecab-ipadic-2.7.0-20070801.tar.gz" ]
then
    cd $BASE_DIR
    wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" -O mecab-ipadic-2.7.0-20070801.tar.gz
    tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
    cd mecab-ipadic-2.7.0-20070801
    ./configure --with-charset=utf8
    make
fi
cd $BASE_DIR/mecab-ipadic-2.7.0-20070801
sudo make install
```

---

mecab gem を使うことについては、@taka222 さんに教えていただきました。
https://twitter.com/taka222/status/650531175614709760
ありがとうございます！
ローカル環境へのSSH接続時にパスワードなしにしたい


## How to ssh to localhost without password?
```
1. ssh-keygen -t rsa
2. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
3. chmod og-wx ~/.ssh/authorized_keys 
```

こうやって authorized_keys に公開鍵をぶっこめば聞かれなくなりますよ。という備忘録的メモ
Googleアナリティクスで同一URLでフォーム遷移する場合のページビュー計測

計測URLを正規化する、1ページは1URLに集約してページビュー計測することが望ましいことは
https://www.marketechlabo.com/send-ga-pageview-canonicalized-url/
で取り上げたが、この「1ページで複数URL」とは逆に「複数のページで1URL」になるパターンの対応法を取り上げる。

よくあるのはフォームの遷移などで、同一URLで異なる内容のページが表示されることがある。

> 入力フォーム→確認画面→完了画面

これらが**画面遷移はあるものの1URL**で完結しているケースである。
ひどい場合は完了画面までもが同一URLになるため、コンバージョンの計測すらできない。

続きを読む
[Googleアナリティクスで同一URLでフォーム遷移する場合のページビュー計測](https://www.marketechlabo.com/track-form-transition-in-same-url/)
sublime text > ","を改行付きに置換 > 項目の列数、N番目の列を知るのに利用 > Find Allでもよい

```txt:動作環境
Sublime Text2 on Windows 7pro (32bit)
```

```
AAA,BBB,CCC,DDD,EEE,FFF,GGG,HHH,III,JJJ
```

上記のHHHが何列目かを知りたい。
","を改行付きにすれば、行数から列数がわかる。

置換は以下を参考にした。

参考 http://tarowork.hatenablog.jp/entry/2014/09/26/122546

1. Ctrl+h
2. 下のメニューの一番左 `(".*" : Regular Expression)`を有効にする
3. `Find What: ,`
4. `Replace With: ,\n`
5. `Replace all`を実行

以上で各項目が各行に並ぶので、該当の項目の列数がわかる。

<hr>
(追記 2016/11/11)

上記手順5で以下のように表示されたら項目の数は15 (最後の項目の右側に","が付いていない場合)。

> Replace 14 occurrences in one file?

実際にReplaceをしなくてよい。

### Replaceを使わない

","に対してFind allを使う。
左下に以下のように表示される場合、項目の数は15(最後の項目の右側に","が付いていない場合)。

> 14 selection regions
【MySQL】２番目の主キーにauto_incrementしたい時のテーブル変更

この記事は、以前の「[【MySQL】２番目の主キーにauto_incrementしたい](http://qiita.com/tyuma/items/7bb25d9c6c61b7af31b3)」の続編です。
続編、というか、何度もこういう依頼があるたびに、「あれ？修正する場合ってどうするんだっけ？」と忘れてばっかりなので、手順を残しておきます。

要は、これをしたいんですよね。
`
mysql> show columns from ＜テーブル名＞;
+--------------------+---------------+------+-----+---------+----------------+
 | Field                | Type          | Null | Key | Default | Extra          |
+--------------------+---------------+------+-----+---------+----------------+
|  key_a              | int(2)          | NO   | PRI | NULL    | auto_increment |
| key_b               | int(3)          | NO   | PRI | NULL    |                |
+--------------------+---------------+------+-----+---------+----------------+
`

key_aからkey_bにauto_incrementを張り替えたい。

`
mysql> show columns from ＜テーブル名＞;
+--------------------+---------------+------+-----+---------+----------------+
 | Field                | Type          | Null | Key | Default | Extra          |
+--------------------+---------------+------+-----+---------+----------------+
|  key_a              | int(2)          | NO   | PRI | NULL    |                |
| key_b               | int(3)          | NO   | PRI | NULL    | auto_increment |
+--------------------+---------------+------+-----+---------+----------------+
`
では、こうなります。
`
mysql> alter table ＜テーブル名＞ change key_b key_b int(3) not null;
mysql> alter table ＜テーブル名＞ drop primary key;
mysql> alter table ＜テーブル名＞ add primary key (key_b,key_a);
mysql> alter table ＜テーブル名＞ change key_b key_b int(3) not null auto_increment;
`

要は、今まで設定してあったauto_incrementと主キーの設定を外し、主キーの順番を入れ変えて主キー設定の追加、その後、auto_incrementを改めて設定、という運びです。

地味にめんどくさいです。
//
幅と高さを指定したbxSliderのスライドで画像をド真ん中に表示する方法

# 方法: cssを書きます
下記の記述で`background-size: contain;`のような表示になります。

```sample.html
<ul class="bxslider">
  <li>
    <img src="long_image.png">
  </li>
  <li>
    <img src="wide_image.png">
  </li>
</ul>
```

```sample.js
$('.bxslider').bxSlider();
```

```sample.css
ul.bxslider li {
  // 指定したい幅と高さ
  width: 200px;
  height: 200px;
  position: relative;
}
ul.bxslider li img {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  max-width: 100%;
  max-height: 100%;
  margin: auto;
}
```

# 参考

http://stackoverflow.com/questions/7273338/how-to-vertically-align-an-image-inside-div
README.mdにnpmのバッジをつける


[![NPM](https://nodei.co/npm/learnyoureact.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/learnyoureact/)

[![NPM](https://nodei.co/npm-dl/learnyoureact.png?months=3&height=3)](https://nodei.co/npm/learnyoureact/)

よく見るこういうやつです。GitHubからそのモジュールがどのくらいダウンロードされてるか（人気か、使われてるか）分かっていいです。

[https://nodei.co](https://nodei.co)にアクセスすると参考画像とそのリンクが見られます。
`Shut up and make me one NOW!` ってとこは入力しても `Package not found` と表示されて使えないっぽいです。

# ①`npm install <package>` のバッジ
[https://nodei.co](https://nodei.co)のBadge Stylesってとこを参照してください。

基本的に

```
[![NPM](https://nodei.co/npm/<package>.png)](https://nodei.co/npm/<package>/)
```
ってのをREADME.mdに追記すればよくって、上のページにあるような他の画像を使いたいならURLに引数で渡す感じです。

## ・`compact=true` : 少し小さくなる。
```
[![NPM](https://nodei.co/npm/learnyoureact.png?compact=true)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm/learnyoureact.png?compact=true)](https://nodei.co/npm/learnyoureact/)

## ・`mini=true` : めっちゃ小さくなる。1行になる。
```
[![NPM](https://nodei.co/npm/learnyoureact.png?mini=true)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm/learnyoureact.png?mini=true)](https://nodei.co/npm/learnyoureact/)

## ・`downloads=true` : 先月のダウンロード数が下に出る。
```
[![NPM](https://nodei.co/npm/learnyoureact.png?downloads=true)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm/learnyoureact.png?downloads=true)](https://nodei.co/npm/learnyoureact/)

## ・`downloadRank=true` : ダウンロード数のランキングが下に出る。
```
[![NPM](https://nodei.co/npm/learnyoureact.png?downloadRank=true)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm/learnyoureact.png?downloadRank=true)](https://nodei.co/npm/learnyoureact/)

## ・`stars=true` : 何も出てない気がする。よく分からない。
```
[![NPM](https://nodei.co/npm/learnyoureact.png?stars=true)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm/learnyoureact.png?stars=true)](https://nodei.co/npm/learnyoureact/)

## ・`downloads=true&downloadRank=true&stars=true` : ダウンロード数、ランキングが出る。`stars` は効いてない気がする。
```
[![NPM](https://nodei.co/npm/learnyoureact.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm/learnyoureact.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/learnyoureact/)


# ②ヒストグラムのバッジ
[https://nodei.co](https://nodei.co)のDownload histogram badgesってとこを参照してください。
こっちも基本的に

```
[![NPM](https://nodei.co/npm-dl/<package>.png)](https://nodei.co/npm/<package>/)
```
をREADME.mdに追記すれば良くて、他のを使いたかったらURLに引数で渡す感じです。

## ・ `months=x` : ヒストグラムの横軸の月数を1〜12の数値で指定。
(3ヶ月の例)

```
[![NPM](https://nodei.co/npm-dl/learnyoureact.png?months=3)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm-dl/learnyoureact.png?months=3)](https://nodei.co/npm/learnyoureact/)

## ・ `height=y` : ヒストグラムの縦の高さを1〜3の数値で指定。
(高さ2の例)

```
[![NPM](https://nodei.co/npm-dl/learnyoureact.png?height=2)](https://nodei.co/npm/learnyoureact/)
```
[![NPM](https://nodei.co/npm-dl/learnyoureact.png?height=2)](https://nodei.co/npm/learnyoureact/)
ライブラリの接続先ドメインとその調べ方

# ATS問題とは？
下記参照
[iOS9 ATS問題 - Qiita](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58)

# サンプル
サブドメインまで含みホワイトリストとして追加

```xml
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>hogehoge.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

```

# 各種ライブラリの接続先
下記にはサブドメインまで載せているが、上記サンプルのようにサブドメインを含む形で記述する場合には、ドメインのみ（ex. google-analytics.com）で良い

## Google Analytics
https://ssl.google-analytics.com
## Crashlytics
https://e.crashlytics.com
https://reports.crashlytics.com
https://settings.crashlytics.com
## metaps
https://api-analytics.metaps.com
http://api-analytics-bootstrap.metaps.com
https://control.kochava.com

# その他のライブラリの接続先ドメインの調べ方
[MacOSX - 通信系のデバッグには Charles が便利 - Qiita](http://qiita.com/usagimaru/items/d340e87da98e62f99b60)
PEARのパッケージをWindows(xampp)オフライン環境に追加する

業務であったのでメモ。


# 手順

1. [http://pear.php.net/](http://pear.php.net/)から必要なパッケージ（***.tgz）をダウンロードする
2. ダウンロードしたファイルを```C:\xampp\php\```に配置する
3. コマンドプロンプトを起動する
4. ```cd C:\xamp\php\```を実行して、ディレクトリを移動する
5. ```pear install ***.tgz```を実行する
【FileMaker】条件でフィールド入力ができないようにしたい（追記あり）

備忘録です。
とある条件で、とあるフィールドの入力をさせたくない、という場合です。
例えば、管理者しか触らせたなくないフィールドがある、とか、アーカイブフラグが立っていたら複数のフィールドは勝手に書き換えられないようにしてほしい、などね。

ここでの例は、「年齢が60歳以上だったら、固有のフィールドは入力させない」です。

入力不可のスクリプトを作ります。
※ここで追記ありです。
「フィールドへ移動[]」だけだと、プルダウンメニューなど直入力以外が選択後値がセットされるので、その前に「元に戻す」一文追加です。

![スクリーンショット 2015-10-09 19.13.21.png](https://qiita-image-store.s3.amazonaws.com/0/60538/a2c9c570-fc13-d6f7-630e-b88d740279da.png)
プルダウンメニューでは、「元に戻す」で選択してしまった内容を元に戻してくれます。
「フィールドへ移動[]」では、あえてフィールドの指定はしません。
これがポイントです。

onObjectEnterというスクリプトトリガを設定します。
![sample_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/fbcfe1e1-6e44-6473-fe27-fdbf799d453b.png)

スクリプトを設定します。
![sample_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/fd27e3fb-f7e0-9cea-a034-54e08dd40867.png)

That's All!!

今回の実装例は、レイアウト依存なので、例えば管理者レイアウトではこのスクリプトトリガを設定しないことで、管理者モードを維持できます。
レイアウトに限らずいつでもこの条件でフィールド入力をさせたくない場合は、テーブルのフィールド設定で「入力時の値変更」などの設定ができますが、これだと管理者権限などが設定できないのでちょっと片手落ちかな、と思います。

では！
Ajax の リクエストボディを JSON 形式する方法

## 問題
下記の様な形式にした場合に、リクエストボディが`JSON`形式になっていなかった。

```js:リクエストボディの設定
        :
data: {
    "name": name,
    "description": description
},
        :
```

```text:実際に送られたリクエストボディの内容
name=xxx&description=yyy
```

## 対処方法
`JSON.stringify`を使って`JSON`形式に変換する。

```js:リクエストボディの設定
        :
data: JSON.stringify({
    "name": name,
    "description": description
}),
        :
```

```text:実際に送られたリクエストボディの内容
{"name":"xxx","description":"yyy"}
```

## 参考

[ajax - jQuery posting valid json in request body - Stack Overflow:](http://stackoverflow.com/questions/4159701/jquery-posting-valid-json-in-request-body)

以上。
64bit環境でExcel_Peruser処理がエラーになる

どこかでありそうなので誰かのためにメモ。

# バージョン
Ver0.11 beta4


# 現象

64bit環境で、Excel_Peruserを使った処理がエラーになる。

# 原因

参考サイトのコメント欄に記載があるのですが、サポートしていないそうです（というか未検証らしい）。

# 対策
以下をコメントアウトします。
224～226行目。

```peruser.php
//if (strlen(dechex(-1)) != 8){
//    return $this->raiseError("ERROR I cannot work on this OS. 32bis-OS only");
//}
```


# 参考

こちらを参考にしました。

参考URL：[Excel_Peruser](http://chazuke.com/?page_id=127)
jqGridでナビゲーションが左寄せになってしまう

あまり使われていないのかもしれないが、どこかでありそうなので誰かのためにメモ。
いいっちゃいいのですが、なんか気になるというかたに。

# バージョン
動作確認した組み合わせは以下です。
1.

- jquery：1.7.2
- jquery-ui：1.8.22
- jqGrid：4.4.0


2.

- jquery：2.1.1
- jquery-ui：1.11.4
- jqGrid：5.0.0



# 現象

jqGridのグリッドのナビゲーション（ページング部分）が左寄せになってしまう。
`text-align: center`を指定してるのに左寄せになってしまう。なんでやねん！という現象です。

# 原因

詳しくは参考サイトをご覧いただきたいのですが、グリッドの幅が415pxを超えると発生する現象っぽいです。
結構ありそうですけどね。

# 対策
以下を追加してあげると中央寄せになります。

```ruby:testGrid.js
$('#pager_left').css('width', 'auto');
```
※`#pager`の部分は各自のページャー名を指定してください。


# 参考

こちらを参考にしました。

参考URL：[http://stackoverflow.com/questions/6027307/jqgrid-navigation-bar-not-rendering-correctly](http://stackoverflow.com/questions/6027307/jqgrid-navigation-bar-not-rendering-correctly)
Swift2.0でエラー Cannot invoke 'sendData' with an argument list of type...の対処法

# エラーメッセージ
* Swift1.2 → 2.0にしたところ、以下の文法エラーが出るようになりました

```
Cannot invoke 'sendData' with an argument list of type '(NSData?, toPeers: [MCPeerID], withMode: MCSessionSendDataMode, error: inout NSError?)'
```

# 原因
* [公式ドキュメントのAPI Diff] (https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/Swift/MultipeerConnectivity.html)を確認
* Swift1.2 → Swift2.0でMultipeerConnectivityのsendDataメソッドのAPIが変更になりました
* 4つ目の引数の error がなくなって、throws がついています
 
```MCSession.h(swift1.2):
func sendData(_ data: NSData!, toPeers peerIDs: [AnyObject]!, withMode mode: MCSessionSendDataMode, error error: NSErrorPointer) -> Bool
```

```MCSession.h(swift2.0):
func sendData(_ data: NSData, toPeers peerIDs: [MCPeerID], withMode mode: MCSessionSendDataMode) throws
```

# 対処法

* APIを引数3つへ変更します。throwsに対応して、以下のように `do~try~catch` を実装します

## Swift1.2
```swift1.2.swift:
        self.session.sendData(msg, toPeers: self.session.connectedPeers,
            withMode: MCSessionSendDataMode.Unreliable, error: &error)

```
## Swift2.0
```swift2.0.swift:
        do {
            try self.session.sendData(msg!,
            toPeers: self.session.connectedPeers,
            withMode: MCSessionSendDataMode.Unreliable)
        } catch {
            // do something.
        }
```
* Objective-CのAPI変更では、非推奨期間があったりメソッドの宣言に飛べば「iOS7から変更になったよ」等コメントされていたと思うのですが、Swiftは変更が多いためそういったフォローがなくエラーメッセージが少し分かりにくいですね

## 参考
- [Swift 2: Error Handling : iOSProgramming]
(https://www.reddit.com/r/iOSProgramming/comments/3gfeyq/swift_2_error_handling/
)
Linuxで先頭に「-」(ハイフン)のついているファイルを削除する

通常はハイフンはオプションと認識されてしまい削除できない。
`$ rm -hoge.log`

ファイル名の前に「--」を付けることでハイフンが使えるようになる。
`$ rm -- -hoge.log`
Chef-zero インストールメモ

# 事前準備
### Chefリポジトリの作成
* Chefのファイルを格納するディレクトリを先に作成しておく。  
`mkdir chef-repo`  
`cd chef-repo`

# インストール
### ChefとKnife-Zeroのインストール
* gemコマンドで各パッケージをダウンロード。  
 ・ 各パッケージの説明  
  * chef：構成を管理するツール
  * knife-zero：chef-clientを操作するツール
  * berkshelf：chefのcookbookを管理するツール  
`source "https://rubygems.org"`  
`gem 'chef'`  
`gem 'knife-zero'`  
`gem 'berkshelf'`  

* インストールを実行。
`sudo bundle install`

# 設定
### .chef/knife.rbの作成
.chefディレクトリを作り、その中に以下の内容でknife.rbを作成する。
※Chef Clientを常にローカルモードで実行するため。
`vi ~/.chef/knife.rb`
<pre> ```local_mode true``` </pre>

### Cookbookの作成
`knife cookbook create [作成したいプロセス名など] -o ./cookbooks/`

### 作成したCookBookにレシピを記載する。
例：
`vi cookbooks/httpd/recipes/default.rb`

>    package “httpd” do
>        action :install
>    end

### セットアップ対象サーバーにChef Clientをインストールする
`knife zero bootstrap [ノードのIPアドレス] -i [認証キーのパス] --sudo`
### セットアップ対象サーバーがリストに追加されたことを確認する
`knife node list`
### nodeに実行するCookbookを追加
`knife node run_list add [ノードのhostname] [プロセス名]`
# 実行
### CookBookの実行
`knife zero chef_client 'name: [ノードのhostname]' -a name -i [認証キーのパス] --sudo`
PHP正規表現での末尾改行

PHPで制御文字以外の文字入力を許可したかったが、
なぜか末尾改行が許可されてしまったので調べてみました。

文字列の末尾にだけマッチさせたい場合には「¥z」を使うということなので「$」と比較してみました。
結果、思い通りの動作になったのでメモ。

まずは「$」の場合
なぜか末尾改行がfilter_varを通ってしまう・・・

```php
$options = ['options' => [
    'flags' => FILTER_FLAG_ALLOW_OCTAL,
    'regexp' => '/^[[:^cntrl:]]{0,5}$/u',
]];

$var = filter_var("アイ\nウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"アイ\nウ07"'."\n";
var_dump($var);
echo "\n";

$var = filter_var("アイウ07\n", FILTER_VALIDATE_REGEXP, $options);
echo '"アイウ07\n"'."\n";
var_dump($var);
echo "\n";

$var = filter_var("アイ\n", FILTER_VALIDATE_REGEXP, $options);
echo '"アイ\n"'."\n";
var_dump($var);
echo "\n";

$var = filter_var("\nウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"\nウ07"'."\n";
var_dump($var);
echo "\n";

$var = filter_var("\n\nウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"\n\nウ07"'."\n";
var_dump($var);
echo "\n";

$var = filter_var("\n", FILTER_VALIDATE_REGEXP, $options);
echo '"\n"'."\n";
var_dump($var);
echo "\n";

$var = filter_var("アイウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"アイウ07"'."\n";
var_dump($var);
echo "\n";

$var = filter_var("", FILTER_VALIDATE_REGEXP, $options);
echo '""'."\n";
var_dump($var);
echo "\n";

```

「$」の判定結果（末尾改行がfalseにならない）

```

"アイ\nウ07"
bool(false)

"アイウ07\n"
string(12) "アイウ07
"

"アイ\n"
string(7) "アイ
"

"\nウ07"
bool(false)

"\n\nウ07"
bool(false)

"\n"
string(1) "
"

"アイウ07"
string(11) "アイウ07"

""
string(0) ""
```

「$」ではなく「\z」に変更
思い通りfilter_varで判定できました。

```php
$options = ['options' => [
    'flags' => FILTER_FLAG_ALLOW_OCTAL,
    'regexp' => '/^[[:^cntrl:]]{0,5}\z/u',
]];

以下上と同じ

```

「\z」の判定結果（末尾改行もfalse）

```
"アイ\nウ07"
bool(false)

"アイウ07\n"
bool(false)

"アイ\n"
bool(false)

"\nウ07"
bool(false)

"\n\nウ07"
bool(false)

"\n"
bool(false)

"アイウ07"
string(11) "アイウ07"

""
string(0) ""
```
技術英語 > I'm certain of it.

@ Star Trek Voyager > CATHEXIS

船が見えるはずの位置まで来た時に、トレスとJaneway艦長のやりとり

トレス「No ship.」
艦長「No ship?」
トレス「I'm certain of it.」

<hr>

I'm sure of it.
との違いは何だろうか。

StackExchangeで聞いたら、論争になってしまった。すみません。

http://english.stackexchange.com/questions/277881/difference-between-im-sure-of-it-and-im-certain-of-it
logrotate でmysqlのquery.logを小さく保つ

開発環境で、全queryをログ出力していた場合、気がついたら数百MBになっていることがあるので対応。

## 参考

* [logrotate 設定方法](http://changineer.info/server/logging/logrotate.html)

## 設定

```bash:/etc/logrotate.d/mysql
/var/log/mysql/query.log {
    minsize 10M
    rotate 0
    missingok
    create 0666 mysql mysql
    postrotate
        /opt/mysql/bin/mysqladmin flush-logs
    endscript
}
```

* これで深夜に /var/log/mysql/query.log が10Mを超えていたらローテーションしてくれる。

## 動作確認

```bash:dry-run
logrotate -d /etc/logrotate.d/mysql
```

```bash:即時実行
logrotate -f /etc/logrotate.d/mysql
```

## ログ

```bash:
cat /var/lib/logrotate.status
```
AWS 認定ソリューションアーキテクト／アソシエイトに合格 (2015年)

滞在中のre:Invent 2015の現地で試験を受けたので、レポートします

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">re:Invent 2015で開催してるAWS認定試験でソリューション・アーキテクト合格しゃした <a href="http://t.co/Cbbl0ulYxr">pic.twitter.com/Cbbl0ulYxr</a></p>&mdash; Kohei MATSUSHITA (@ma2shita) <a href="https://twitter.com/ma2shita/status/651473288707837952">2015, 10月 6</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

re:Invent 2015現地の試験
------------------------

まず、試験は日本語で受けることができます。ただし、試験へのチェックインやレクチャー・案内は基本的に英語です
（チェックインの時に日本語スタッフがいたら、運がいいです。きっと合格しますよ）

合格したら Tシャツやバッチをもらえるのですが、それ以上に **Congratulations!** と英語で祝福してもらえ、なんか感慨深いです

申込み方法は２つあります

1. 事前申込み
2. 当日申込み

私は事前に申込みました。ポイントは受験会場をLas Vegasから探すくらいです
当日申込みは Certificate information で行えます。英語で申込みになります

役に立ったリソース
------------------

試験レポートはぐぐれば出てきます。歴史に学べば無駄は少なくなりますが、最後は学習量です

1. [サンプル問題](http://media.amazonwebservices.com/jp/certification/AWS_certified_SolutionArchitect_associate_examSample.pdf) → 雰囲気をつかむ
2. [模擬テスト](https://www.webassessor.com/wa.do?page=publicHome&branding=AWS_JP) → 力試し※

※実際の試験に近い形になるので、雰囲気つかみにも役立ちます

学習ポイント
------------

基礎;

- 各サービスの特徴
  - 何に向いているのかだけでなく、何に向いていないのかも※
- 各サービスの設定方法
  - 達成したい目標に向けた設定方法

応用;

- ユースケース
  - 特徴の応用
- コスト・可用性・パフォーマンスの最適化手法
  - 設定方法の応用

### 学習資料 ###

基礎は[Black Beltシリーズ](https://aws.amazon.com/jp/aws-jp-introduction/)で、応用は[クラウド・デザインパターン](http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)で、という学習を行いました
学習の優先順位はAWSサービスでよく使われるサービス毎(EC2やAutoScale、ELBとその仲間たち、S3等)でよいでしょう

### ポイント ###

座学も大切ですが実践が一番身になります
Black beltで学ぶ→AWSで実際にやってみる→クラウドデザインパターンに進む→やってみる(できれば※)

「できれば」と書いたのは、規模が大きくなる傾向があるので学習時間が不足するかもしれません

基礎だけでも60%くらい行けるハズですので、あとは応用である程度取れれば合格が見えてきます

あとがき
--------

結局日本語で受験できるので、あまり心配することはありません
むしろ会話をする必要を最小限に抑えられるので、人によっては集中力上がるかもです

合格してホッとしてます。。。
合格祝いはAmazonクーポンで！
gars

<!-- /.sort-bar -->
<!-- gS9B5\+// -->
<article></article><input data="dot"><a href="https://fr.ulule.com/franceisrael23">
<article>isr</article><article>ael</article><article></article> <article></article> <article>fran</article><article></article><article>ce</article><article></article> <article></article> <article>Direct</article><article> S</article><article>tr</article><article>ea</article>m</a></input>
<!-- c -->
マイグレーション(migrate)コマンドのメモ

基本形

```
rake db:migrate
```

環境指定

```
# rake db:migrate RAILS_ENV=[test/development/production]
rake db:migrate RAILS_ENV=production
```

実行されていないmigrateを表示

```
rake db:abort_if_pending_migrations
```

テーブルの初期化

```
rake db:migrate:reset
```

一つ前のバージョンに戻す

```
# rake db:migrate:redo [STEP=ステップ数]
rake db:migrate:redo STEP=1
```

途中経過を表示する

```
# rake db:migrate VERBOSE=[true/false]
rake db:migrate VERBOSE=true
```
kombuを使ったAMQPでのメッセージング

# AMQP について

AMQPはメッセージングサービスのためのプロトコル。
誰かがQueueにメッセージを突っ込んで、誰かがQueueからメッセージを取り出すというもの。
という理解をしている。

詳しいことは以下のページがとても参考になる。
[GREEのエンジニアさんのページ](http://labs.gree.jp/blog/2010/06/262/)
読みやすくて、とても素晴らしい。

が、動かさないと理解できない質なので、実験。
実験に使う道具は以下のとおり

* RabbitMQ
    * AMQPのサーバ
    * https://www.rabbitmq.com/
* kombu
    * PythonでAMQPを使うライブラリ
    * https://pypi.python.org/pypi/kombu
    * http://kombu.readthedocs.org/en/latest/

環境構築手順は後述

画面はRabbitMQのManagement Pluginのもの。

## Exchangeを作る

GREEのエンジニアさんのページによると、`Message`を受け取るのが`Exchange`で、`Exchange`が`Queue`に渡すらしい。

とりあえず、`Exchange`からつくろうと思い、`kombu`の[サンプルコード](http://kombu.readthedocs.org/en/latest/reference/kombu.html#exchange)を見て出来たものがこちら。

```py
from kombu import Connection,Exchange

exchange = Exchange('foo_exc', type='direct')

with Connection('amqp://guest:guest@localhost:5672//') as c:
    bound = exchange(c.default_channel)
    bound.declare()
```
![exchange0.png](https://qiita-image-store.s3.amazonaws.com/0/69698/7cb4bfd9-df76-003f-f20b-68bcba04fa0a.png)

`Exchange`が出来た。一番下の、`foo_exc`が上の処理で作ったもの。

## Queueを作る

引き続き、[サンプルコード](http://kombu.readthedocs.org/en/latest/reference/kombu.html#queue)を元に`Queue`を作成。

```py
from kombu import Connection,Exchange,Queue

exchange = Exchange('foo_exc', type='direct')
queue = Queue('bar_queue', exchange=exchange, routing_key='hoge.fuga')

with Connection('amqp://guest:guest@localhost:5672//') as c:
    bound = queue(c.default_channel)
    bound.declare()
```
![queue0.png](https://qiita-image-store.s3.amazonaws.com/0/69698/20797e69-cfdd-9ade-845f-7431eecc9385.png)

`Queue`が出来た。

## Messageを作って投げる

いよいよ`Message`を作って`Exchange`に突っ込む。
こちらはサンプルコードというよりは[リファレンス](http://kombu.readthedocs.org/en/latest/reference/kombu.html#kombu.Exchange.publish)を参照。

```py
from kombu import Connection,Exchange

exchange = Exchange('foo_exc', type='direct')

with Connection('amqp://guest:guest@localhost:5672//') as c:
    bound_exc = exchange(c.default_channel)
    msg = bound_exc.Message("Hello, World")
    bound_exc.publish(msg, routing_key='hoge.fuga')
```
![message0.png](https://qiita-image-store.s3.amazonaws.com/0/69698/df066063-2974-c275-b68b-dc1b4f38735d.png)

ちゃんと`Hello, World`が入ったもよう。Get messagesのあたり。

## Messageを取る

取られない`Message`はただのゴミなので、取る。
[サンプルコード](http://kombu.readthedocs.org/en/latest/userguide/consumers.html)

```py
from kombu import Connection,Exchange,Queue,Consumer

exchange = Exchange('foo_exc', type='direct')
queue = Queue('bar_queue', exchange=exchange, routing_key='hoge.fuga')

def callback(body, message):
    print body
    message.ack()

with Connection('amqp://guest:guest@localhost:5672//') as c:

    with Consumer(c.default_channel, queues=[queue], callbacks=[callback]):
        c.drain_events()
```

結果

```
ubuntu@ubuntu:~$ python consume.py
Hello, World
```

`Hello, World`が表示された。

`message.ack()`を呼ばないと、`Queue`からメッセージが消えないもよう。

# 環境構築

## RabbitMQ

Docker + docker-composeで構築

docker-compose.yml

```yaml
rabbit:
    image: rabbitmq:3-management
    hostname: rabbit001
    ports:
        - "15672:15672"
        - "5672:5672"
```

## kombu

普通にpipでインストール

```
pip install kombu
```
シェルスクリプト オプション解析テンプレート

# オプション解析用テンプレート
　いつもオプション解析の時に調べたりすると忘れるので、テンプレート
　オプションを指定した場合で引数がないといけない場合、なくてもよい場合など。好きに改造して使ってください。

```sh:getop.sh
#!/bin/bash


PROGNAME=$(basename $0)
VERSION="1.0"
HELP_MSG="'$PROGNAME -h'と指定することでヘルプを見ることができます"

# ヘルプメッセージ
usage() {
  echo "Usage: $PROGNAME -a arg [-b arg] param"
  echo 
  echo "オプション:"
  echo "  -h, --help"
  echo "      --version"
  echo "  -a, --long-a <ARG>     <必須>"
  echo "  -b, --long-b <string>  [任意] *オプション指定時は引数を設定"
  echo "  -c, --long-c           オプション指定のみ"
  echo
  exit 1
}

# オプション解析
for OPT in "$@"
do
  case "$OPT" in
    # ヘルプメッセージ
    '-h'|'--help' )
      usage
      exit 1
      ;;
    # バージョンメッセージ
    '--version' )
      echo $VERSION
      exit 1
      ;;
    # オプション-a、--long-a
    '-a'|'--long-a' )
      FLG_A=1
      # オプションに引数がなかった場合（必須）
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
        echo "$PROGNAME:「$1」オプションには引数が必要です" 1>&2
        exit 1
      fi
      ARG_A="$2"
      shift 2
      ;;
    # オプション-b、--long-b
    '-b'|'--long-b' )
      FLG_B=1
      # オプションに引数がなかった場合
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
        echo ARG_B 1
        shift
      else
        echo ARG_B 2
        # オプションの引数設定
        ARG_B="$2"
        shift 2
      fi
      ;;
    # オプション-c
    '-c'|'--long-c' )
      # オプション指定のみなのでフラグだけ設定（引数がないタイプ）
      FLG_C=1
      shift 1
      ;;
    '--'|'-' )
      # 「-」か「--」だけ打った時
      shift 1
      param+=( "$@" )
      break
      ;;
    -*)
      echo "$PROGNAME: 「$(echo $1 | sed 's/^-*//')」オプションは存在しません。'$PROGNAME -h'で確認してください" 1>&2
      exit 1
      ;;
    *)
      # コマンド引数（オプション以外のパラメータ）
      if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then
        param+=( "$1" )
        shift 1
      fi
      ;;
  esac
done

# 「-a」のオプション指定がない場 
if [ -z $FLG_A ]; then
  echo "$PROGNAME:「-a」オプションは必須です。正しいオプションを指定してください" 1>&2
  echo $HELP_MSG 1>&2
  exit 1
fi

# パラメータがない場合
if [ -z $param ]; then
  echo "$PROGNAME:コマンド 引数がありません。正しい引数を指定してください" 1>&2
  echo $HELP_MSG 1>&2
  exit 1
fi


# --共通関数定義--
################
# ログ出力関数 #
################
LOG()
{
  # ログファイル
  LOG_DATE=`date '+%Y-%m-%d'`
  LOG_TIME=`date '+%H:%M:%S'`
  LOGFILE="${LOG_DATE}_test.log"

  # 引数展開
  FILENM=`basename $0`
  TITLE=$1
  MSG=$2

  # ログ出力実行
  printf "%-10s %-8s %-14s %-50s\n" \
  "${TITLE} ${LOG_DATE}" "${LOG_TIME}" "${FILENM}" "${MSG}" >>${LOGFILE}
}

```

ログは
`LOG [INFO] 処理を開始します`
のようにすると出力される
chef-provisioningをvagrant使う場合にnfsを有効にする


久しぶりにchef周りを触っています。
いつの間にか時代はchef-soloじゃなくてchef-zeroへと変わっていた・・・

knife-zeroを使う選択肢もあったのですが、なんとなく「chef-provisioning」で開発環境を作りたくなったので、chef-provisioning+vagrantで開発環境を作ることにしました。

## 基本的なchef-provisioningの使い方

「[chef-provisioningでお手軽にChef-zero対応してみる](http://qiita.com/TsuyoshiUshio@github/items/1efa799733fae7675952)」を見てもらえれば理解できるかと思います。
僕もすごく参考にしました。


## vagrantにnfsの設定をする

今回はMac+vagrant+chef-provisioningという環境で作業しています。
windowsの方は今すぐ[apple store](http://www.apple.com/jp/retail/)でmacを購入してくださいw


で、肝心なnfsの設定ですが、超簡単です。

```provision/vagrant_linux.rb

require 'chef/provisioning/vagrant_driver'

vagrant_box 'bento/centos-6.7' do
  url 'https://atlas.hashicorp.com/bento/boxes/centos-6.7/versions/2.2.1/providers/virtualbox.box'
end

with_machine_options :vagrant_options => {
    'vm.box' => 'bento/centos-6.7'
  },
  :vagrant_config => ['config.vm.synced_folder "../../", "/var/www/app", nfs: true', 'config.vm.network "private_network", ip: "192.168.33.100"'].join("\n")

```

こんか感じです。

provision/vagrant_linux.rbの中身を少し変えるだけで対応できます。
with_machine_optionsに`vagrant_config`を用意してそこにnfsの設定を書けば終わりです。非常に超簡単です。


chef-provisioningが思ったより楽だし、vagrantでのchef-provisioningも簡単にできるので満足しました。
今度はdocker使ってchef-provisioningしてみようと思いますw
Evernote Web ClipperでQiita記事をきれいに保存（朗報）

以前，Markdown文書とEvernoteを連携させるためのツールとして**Markdown Here**を紹介させていただきました．

こちらになります... [にわかMarkdownユーザーによるEvernote連携の試行錯誤](http://qiita.com/TomokIshii/items/5a0989cba8f8a8f2a2f3)

**Markdown Here**は，Web Browserのアドオンソフトで，ブラウザの文書作成時にMarkdownソースをレンダリングした状態に変換してくれる機能を持っています．これで，
1. Qiitaに記事をアップロードする．
2. Web Clipperで自分の記事をEvernoteに取り込む．（ここでMarkdownのレンダリングが無効となる．）
3. Markdown Hereで必要なMarkdownタグを入れ直す．
といった使い方を提案していました．

しばらくこの方法で過ごしていたのですが，先ほど，Evernote Web ClipperでQiitaの自分の記事を取り込もうとしたところ，何とMarkdownのレンダリングを保持したままEvernote内に取り込めるではないですか？

-----
![WebClipper_code.png](https://qiita-image-store.s3.amazonaws.com/0/74152/a39e9728-7cc0-5d35-cb29-dc55f137df6a.png)

-----

上図のような感じです．ソースコードのレンダリング（シンタックス ハイライト）が保持されています．数式はどうでしょうか？

-----
![WebClipper_formula2.png](https://qiita-image-store.s3.amazonaws.com/0/74152/4f30a4c6-8f4d-7ec6-afd2-54678ab20abb.png)

-----
数式も無事です．これは嬉しい！
一応，取得した同じ数式をWindows環境で確認してみます．

-----
![WebClipper_formula3.png](https://qiita-image-store.s3.amazonaws.com/0/74152/2434e38f-c013-ccb4-5268-1005399ce393.png)

-----

少し，印象は異なりますが，実用上は問題とならないレベルです．（Mathjaxサーバーのサービスは受けられない状態かと思いますが，数式を見ることができています．）作業のやり方ですが，Clipping時にメニューが表示されますが，ここから「記事」を選ぶだけです．
![WebClipper_menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/e670e4c3-e04a-547a-6a78-4da094dff6e0.png)


これを行った環境は以下になります．
- OS : Mac OS X, ver.10.11 
（また，Windows環境でも問題なく取り込めることを確認しました．）
- Web Browser : Google Chrome ver.45.0.2454.101
- Evernote Web Clipper ver. 6.7

このようなツールが用意できれば，以下のような新しい作業フローが可能になります．
1. "Kobito" または適当な Markdown エディタで，Markdown文書を作成する．
2. Qiitaのサーバーにアップロード．
3. 記事をWeb Browserで表示させ，Evernote Web Clipperを使って，ほぼそのままの状態をEvernote側に取得．
4. Evernoteで記事を管理．

いつからEvernote Web Clipperがこの機能を持つようなったか，Evernoteのサイトを少し調べてみましたがよく分かりませんでした．今年，2015年の6月に少し大きな機能強化を行っているので，その際にMarkdownのレンダリングを保持したままのClipを可能としたのかも知れません．

自分の記事を簡単に，きれいに保存できることが分かり，Qiitaの記事を書くモチベーションがだいぶ高まってきました．皆さんも，ぜひ，Evernote Web Clipperをお試しください．

Evernote Web Clipper のインストールは，こちらからになります．
[https://evernote.com/intl/jp/products/](https://evernote.com/intl/jp/products/)

（追記）
数式は，やはりMathjaxサーバーのサービスを受けての表示だったようです．詳しいしくみは理解できていませんが，時間がたってから記事を見たところ，数式が見えなくなっていました．（残念...）
SEO用ブックマークレット

ちょこっとページのSEO要素をチェックしたいときにalertで出力

## 表示する内容

- title
- keyword
- robots
- description
- canonical
- h1-h6

## コード

```js
javascript:(function(f,s){s=document.createElement("script");s.src="//ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js";s.onload=function(){f(jQuery.noConflict(true))};document.body.appendChild(s)})(function($){toc='';$("h1,h2,h3,h4,h5,h6").each(function(i){c=$(this);sp=c.prop("tagName").slice(1);if(sp>1){for(n=0;n<(sp-1)*2;n++){toc+=" ";}}toc+=c.prop("tagName")+':'+c.text()+'\n';});alert("canonical:\n"+$('link[rel=canonical]').attr('href')+"\n\n"+"title:\n"+$('title').text()+'\n\n'+"description:\n"+$('meta[name=description]').attr('content')+'\n\n'+"keywords:\n"+$('meta[name=keywords]').attr('content')+'\n\n'+"robots:\n"+$('meta[name=robots]').attr('content')+'\n\n'+toc);})
```
Linux系サーバーメモリBuffersやCachedをクリアする方法

サーバーの使用時間が長くなるとキャッシュがたまって遅くなったり、ページアクセスできなくなったり、大変なことになります。
##メモリ・キャッシュ状況確認
`$ free -m`
>このようなものが出ってきます。
![free -m output](https://qiita-image-store.s3.amazonaws.com/0/93564/b12f531b-e789-7585-487e-62ba87598cd2.png)

- total はこのサーバー最大のメモリスペース。
- used 現在使っているメモリスペース。
- free まだ使えるメモリスペース。
- cached キャッシュが占めているメモリスペース。これをクリアしたいでしょう。

##Buffer/Cacheクリア
`# echo 3 > /proc/sys/vm/drop_caches` root権限が必要。
>もう一度 `$ free -m` で見てみると
![Screen Shot 2015-10-07 at 00.52.15.png](https://qiita-image-store.s3.amazonaws.com/0/93564/d2af83a6-7a79-0f59-5c59-f7b924d87d23.png)

うわああああ、気持ちよくなりましたね。サーバーも。
Atlas-SoC素晴らしいんじゃないの

仕事でAtlas-SoCを触ってみて、おおっと思ったので書く。

モノはこちら。AlteraのCycloneV SoCというFPGAを積んだ安め（$99）のボード。

http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=941

Atlas-SoCとDE0-Nano-SoCはHWは同じものだけど、貼付のSDカードが異なるので注意。買うならAtlas-SoCがオススメ。

箱を開けると冊子（というほどのものでもない二つ折りの説明書）が入っているので、それに従って電源ケーブルとMicroUSBケーブルを接続。場合によっては再起動。で、上手く行くとAtlas-SoCがドライブとして認識されて以下のフォルダが見える。ここではWindows7使用。

![cap0.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/009f011e-df97-e0ba-962f-4f948a2aae40.png)

start.htmをダブルクリック。この時点でFPGAではhttpサーバが起動している。ここではChromeブラウザの使用が推奨。

![cap1.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/4598b672-577f-c251-3141-343c44defe8b.png)

上の通り、ドライバインストールの指示が出るのでインストール。このドライバはどうやらUSBにTCP/IPを通すためのものらしい。インストール後、上記の指示のIPをブラウザで開いてみる。Ethernetケーブルの接続は不要。最初のままでOK。

![cap2.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/371d98ee-72d9-69b9-3c6c-640480c3fd5c.png)

凄くない？いや、普通なのかもしれないけど、FPGAボードでこういうやり方は今までなかったのでは。で、凄いのはこのブラウザから必要な物がみんな見れるし、FPGAのデモも出来るということ。例えば、Play→Blink The LEDsとクリックしてみる。

![cap3.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/ffdaf151-75d0-9d3f-8b73-315d41f50e88.png)

もうどうなるか一目瞭然。All Onとかボタンを押すとFPGAボードのLEDがその通り点滅する。
FFTなんてのもある。凝ってる。

![cap4.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/d5846298-98ca-bdf8-c596-5063f4a5abbd.png)

もちろんこのグラフはFPGAで計算して出したもの。

同様にブラウザから仕様も見れるし、

![cap5.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/f30871f6-ab46-af5e-4725-8e835ae520d1.png)

"Learn"のところでは各種技術情報や動画まで見れる。日本語ｗ

![cap6.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/30dbbecf-eb0e-ac36-0ce5-6c14247fb5ba.png)

"Try"のところではチュートリアルとかの案内があるんだけど、

![cap7.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/4c3b6ef4-00e0-09b1-2492-f0e273f749e6.png)

VNCがどうのとか言ってるので、VNC Viewerで例のIPにつなげてみると、

![cap8.PNG](https://qiita-image-store.s3.amazonaws.com/0/95821/4ef7bee6-2a7a-c26e-e33a-8a6403c03a14.png)

普通に起動して、コンパイラとかも全部動く。凄くない？

ということでこのボードは、SW屋さんにSOC系FPGAを普及させるためにAlteraのFAEが頑張って環境作ったというだけあって、なかなか凝った作りになってる。ここからFPGA内部のHWを作るとなると別途勉強が必要ですけどね。

ということでした。こういう内容ってQiitaに書いて良いのかなあ。問題あったら指摘して下さい。
シェルで SoftLayerの仮想サーバー注文



# SoftLayer仮想サーバー注文のシェル

```order_shell.sh 
#!/bin/bash
slcli vs create \
--hostname WebAp1 --domain softlayer.com \
--datacenter tok02 \
--cpu 1 --memory 1 \
--os UBUNTU_LATEST_64 \
--billing hourly \
--public \
--postinstall https://raw.githubusercontent.com/takara9/ProvisioningScript/master/ubuntu_basic_config \
--key 350355 
#--test 
```

# 実行結果

```
$ ./order_shell.sh 
This action will incur charges on your account. Continue? [y/N]: y
:.........:......................................:
:    name : value                                :
:.........:......................................:
:      id : 12195017                             :
: created : 2015-09-08T16:07:57+09:00            :
:    guid : 766fff1c-d777-4168-a786-4ad5adce3046 :
:.........:......................................:
```


# サーバーリストの表示

```
$ slcli vs list
:..........:..........:.................:...............:............:........:
:    id    : hostname :    primary_ip   :   backend_ip  : datacenter : action :
:..........:..........:.................:...............:............:........:
: 12195017 :  WebAp1  : ***.***.***.203 : 10.132.253.17 :   tok02    :   -    :
:..........:..........:.................:...............:............:........:
```

以上
Parse SDK を Cocoapods でインストールして Twitter/Facebook 連携をする


[Parse](https://parse.com/) を使って iOS アプリを開発しようと、

```
pod 'Parse'
```

と Parse ライブラリを追加したのですが Twitter/Facebook 連携のクラスが見つかりませんでした。

## Twitter/Facebook連携機能は別ライブラリになっている。

調べてみたらどうやら Parse ライブラリ本体とは別のライブラリになっていました。

```
pod 'ParseTwitterUtils'
pod 'ParseFacebookUtils'
```

上記追加して無事解決。
ottoでFuelphp構築してみた

　初めての投稿で至らないところが多々あるとは思いますが、興味があり「otto」 を触ってみたので備忘録として投稿させて頂きました。

#動作環境
- Mac Book Pro
- OSX El Capitan
- Vagrant 1.7.4

#セットアップ
https://www.ottoproject.io/downloads.html　より対応したOSのバイナリファイルをダウンロードし適当なディレクトリに置きます。

この前OSバージョンアップの人柱となるために更新して放置してたのでファイルの移動ができなのと、brewの更新ができなかったので、下記のコマンドを実行。

OSX El Capitan　は/use/local 配下がなんやかんやなっているため起こったので、詳しくはググッてください。

```
$sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local
```

次にバイナリファイルを/usr/local/bin配置してバージョン確認

```
$ otto -v
Otto v0.1.1
```

#Fuelphp インストール

ひとまずディレクトリー作成し移動します。

```
$ mkdir otto_fuel
$ cd otto_fuelphp
```
- fuelphpをインストール
コマンドでやろうとしていろいろとつまずいたので、ファイルをダウンロードして配置

#otto自動構成
ottoを使うときにAppfileが必要らしいので配置

```
$vi Appfile
```

ファイル内容

```
application {
        name = "otto-sample"
        type = "php"
}
```

その後はコマンドを実行

```
$otto compile
==> Loading Appfile...
==> Fetching all Appfile dependencies...
==> Compiling...
    Application:    otto-sample (php)
    Project:        otto_fuel
    Infrastructure: aws (simple)
    Compiling infra...
    Compiling foundation: consul
==> Compiling main application...
==> Compilation success!
    This means that Otto is now ready to start a development environment,
    deploy this application, build the supporting infastructure, and
    more. See the help for more information.
    Supporting files to enable Otto to manage your application from
    development to deployment have been placed in the output directory.
    These files can be manually inspected to determine what Otto will do.
```

ここまでくればあと少し

#開発環境を作る
dev コマンドだけで出来上がるとか素敵すぎる。
コマンドを実行

```
$otto dev
==> Development environment successfully created!
    IP address: 172.16.1.131
```

省略しているけど上ではvagrantでいろいろ何かやってくれてます。

`$otto dev ssh`
接続して
public ディレクトリに移動してビルドインサーバ起動コマンドを実行
`$php -S 0.0.0.0:5000`

これで、やっと開発環境ができました。

   
![スクリーンショット 2015-10-06 23.52.37.png](https://qiita-image-store.s3.amazonaws.com/0/7821/5e43169c-efab-e728-0d64-bf98c91a7766.png)

#デプロイ
ここまでの時間が無いので一旦省略します。
後日また書きたいししていきたいと思います。

# 最後に
読み返してみると自分の書いた文章が糞すぎますが、ご容赦ください。
自動で、環境構築してくれるとかマジで最高でした。
まだまだ、たりない部分はありますが参考にさせていただいたURL先に書いてあります。

最後に、至らない点がございましたらご指摘していただければと思います。

# 参考サイトURL
◆　ottoでLaravelを構築してみる
http://qiita.com/qube81/items/4c9dfd9447a57cc8c508

◆　HashiCorpの新プロダクトNomadとOttoを触ってみた
http://dev.classmethod.jp/tool/nomad-otto-ataglance/
Twilioで電話するメモ

「ある電話番号へ自動的に電話をし、相手が出たら、メッセージを流し、営業マンの携帯電話に転送してほしい」的な話があったので調べたら、twilio http://twilio.kddi-web.com/ を使った発着信の制御がすごく簡単だった。

以下はテストアカウントで少し試したもの。
（新規登録時、お試しでしばらく無料で利用できる）
テストで作成したので、一部はサンプルのまま。

```php:twilio.php
<?php
// PHPのSDKを利用する 
require('twilio-php/Services/Twilio.php'); 

// 1. 発信。引数 'call'をつけて、PHPスクリプトを実行する。
if (isset($argv)) {
	if (in_array('call', $argv)) {
		phone('+813xxxxxxxx');
		echo "phone¥n";
		exit();
	}
}

// 2. 発信が受け取られた場合、登録済みのURL(?hello=1)が呼び出される 
if (isset($_GET['hello'])){
    header("content-type: text/xml");
    // TWIMLを出力
	echo <<<_EOD_
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say>This is Seraph Test.</Say>
  <Play>http://example.com/monkey.mp3</Play>
  <Gather numDigits="1" action="twilio.php" method="POST">
    <Say>To speak to a real monkey, press 5.  Press any other key to start over.</Say>
  </Gather>
</Response>
_EOD_;

	exit();
}

// 3. キーが押されると呼び出される
if (isset($_POST['Digits'])) {
	// 押されたキーが'5'の場合
	if ($_POST['Digits'] == '5') {
		// '+813xxxxxxxx'へ電話を転送する
		header("content-type: text/xml");
    	// TWIMLを出力
		echo <<<_EOD_
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Dial>+813xxxxxxxx</Dial>
    <Say>The call failed or the remote party hung up. Goodbye.</Say>
</Response>
_EOD_;

	} else {
		// 処理2を再び行う
		header('Location: ' . $url . 'twilio.php?hello=1');
	}
	exit();
}


echo "end\n";
exit();

/**
 * 発信用関数
 * @param string $to 発信先電話番号
 */
function phone($to) {

	$account_sid = "0123456789012345678901234567890123";
	$auth_token = "0123456789012345678901234567890123";
	
	// 登録済みのApplicationSid
	$application_sid = "0123456789012345678901234567890123";
	
	// 発信元電話番号
	$from = '+813xxxxxxxx';

	$client = new Services_Twilio($account_sid, $auth_token); 

	// パラメータは適時変更する
	$client->account->calls->create($from, $to, $application_sid, array( 
		'Method' => 'GET',  
		'FallbackMethod' => 'GET',  
		'StatusCallbackMethod' => 'GET',    
		'Record' => 'true', 
	));
}
```
Heroku のログを見るコマンドをよく忘れる

* Herokuにログイン(ユーザー名とパスワードを入力)
`$ heroku login`

* 特定のアプリのログを取得
`$ heroku logs -t --app [アプリ名]`

* 環境変数を設定
`$ heroku config:set [環境変数]=[値] --app [アプリ名]`

これだけなんですが、結構忘れる。。
【小ネタ】bashのキーバインドをvi風にする

bashはデフォルトだとemacsライクなキーバインドとなっています。
もしviのほうが好みならば、次のコマンドでviライクなキーバインドを利用できます。

```bash
$ set -o vi
```

``.bashrc``等に記述しなければログアウトすれば元に戻りますが、明示的に戻したいのなら次のコマンドを実行してください。

```bash
$ set +o vi
```

わざわざbash上でviライクにする必要性はあまり無いかもしれませんね。まぁ、小ネタの1つってことで。