OmniAICreator/Qiita-1.07M huggingface dataset:
Memcachedについてのまとめ

Memcached(バージョン1.4.14)をtelnetからごにょごにょする機会があったので簡単にまとめたいと思います。

##■ ローカルサーバーからMemcachedサーバーにtelnet経由で接続する
  
    telnet サーバーのアドレス 11211(memcache用に開けているポート)

##■ statsコマンドで状況を知る

例えば"stats"と打つと以下のように表示されます。

```
stats
STAT pid 32949
STAT uptime 619521   
STAT time 1390916003 起動時間
STAT version 1.4.15　バージョン
STAT libevent 1.4.13-stable
STAT pointer_size 64　64bitのマシンで動いているよ
STAT rusage_user 11.272286　
STAT rusage_system 35.064669
STAT curr_connections 16　現在のコネクション数
STAT total_connections 7647　今までのコネクション数
STAT connection_structures 97　
STAT reserved_fds 20
STAT cmd_get 193746　今までgetした数
STAT cmd_set 21925　 今までsetした数
STAT cmd_flush 0　　　　
STAT cmd_touch 0
STAT get_hits 185834 getでhitした数
STAT get_misses 7912 getしてhitしなかった数
STAT delete_misses 5200 
STAT delete_hits 128
STAT incr_misses 0
STAT incr_hits 29
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 27488093
STAT bytes_written 465934236
STAT limit_maxbytes 67108864 memcachedの最大容量
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 1930098
STAT curr_items 1044 現在のアイテム数
STAT total_items 21954　アイテム数の累計
STAT expired_unfetched 211
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 303
END
```

キャッシュのヒット率(get_hits / cmd_get * 100)で求めます。当然ですがヒット率が高いほどキャッシュを有効活用できていると言えます。
個人的にキャッシュヒット率がどのくらいが平均的なのか気になります。。。

##■ stats itemsでキャッシュされているレコード情報を取得

```
stats items
STAT items:1:number 17
STAT items:1:age 38455
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 1
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
STAT items:3:number 104
STAT items:3:age 162625
STAT items:3:evicted 0
STAT items:3:evicted_nonzero 0
STAT items:3:evicted_time 0
STAT items:3:outofmemory 0
STAT items:3:tailrepairs 0
STAT items:3:reclaimed 35
STAT items:3:expired_unfetched 20
STAT items:3:evicted_unfetched 0
```

ここの見方がいまいちまだわかっていませんが、outofmemoryの数が多かったりしないか気をつけてみています。
アプリケーション側でSoketTimeout系のエラーが発生している場合、おそらくoutofmemory系のエラーが関係しているのではと思っています。まだ検証中なので正確な情報ではありませんが。。。

## dumpを取る

```
stats cachedump 1(itemsの番号) 100(limit)
ITEM USER_SEQ [6 b; 1390296482 s]
ITEM COMPANY_SEQ [6 b; 1390296482 s]
ITEM POST_SEQ [6 b; 1390296482 s]
```

## キャッシュの中身を見る

```
get USER_SEQ
VALUE USER_SEQ 0 6
337509
END
```

get KEY名でキャッシュの中身を見ることができます。

```
## キャッシュを削除する
delete USER_SEQ
```

delete KEY名で該当のキャッシュを削除することができます。
grape-swaggerでgrapeでつくったAPIのドキュメントを自動生成する

## 概要
[grape](https://github.com/intridea/grape)のドキュメントを[Swagger UI](http://swagger.wordnik.com/)で使える形で自動生成します。

## [Swagger UI](http://swagger.wordnik.com/)とは

こんなんです。

![swagger.gif](http://gifzo.net/cXXaL1EeO3.gif)

APIとその説明を列挙し実際にパラメータを入力して叩くことができます。
超便利！

## install
rails前提にしてますが、そうじゃなくてもいいかも。

```
  # Documentation
  gem 'grape-swagger'
  gem 'grape-swagger-ui'
```

add_swagger_documentationをソースに追加

```ruby:api.rb
module API
  class Root < Grape::API
    mount API::Cats
    mount API::Dogs
    mount API::Pirates
    add_swagger_documentation
  end
end
```

確認する

```
bundle install
rails s 
```

アクセス
http://localhost:3000/api/swagger

もしv1とかでURLを切っていたら以下をフォームに入力してください。

> http://localhost:3000/api/v1/swagger_doc.json

## ドキュメントの書き方

こんな感じで書けるようです。詳しくは[README.md](https://github.com/tim-vandecasteele/grape-swagger#grape-swagger)で。

```ruby:api.rb
desc "Reserve a virgin in heaven", {
  :notes => <<-NOTE
    Virgins in heaven
    -----------------

    > A virgin doesn't come for free

    If you want to reserve a virgin in heaven, you have to do
    some crazy stuff on earth.

        def do_good
          puts 'help people'
        end

    * _Will go to Heaven:_ Probably
    * _Will go to Hell:_ Probably not
  NOTE
}
```

## まとめ

ドキュメントだけでなく実行環境も手に入り一石二鳥ですね！
ローカルのデータベースをherokuにリストアする

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2050">元の記事はコチラ</a>
- - - - - - - - - - - 
テスト環境でデータもつくってしまって、本番環境にあげたいなんてこともあります。
すぐ忘れるのでメモしておこう。ドキュメント通り。

<!-- extract -->

[ドキュメントはこちら](https://devcenter.heroku.com/articles/heroku-postgres-import-export)

###ダンプ

まず手元のデータベースをダンプする必要がある。

```
 PGPASSWORD=mypassword pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dump
```

mypassword データベースのパスワード
myuser ユーザー名
mydb データベース名
mydb.dump ダンプのファイル名


###アップロード

herokuからアクセスできるところに置きましょう。
レンタルサーバーでもいいし、Amazon S3とかでもいい。

###リストア

あとはそのパスを指定するだけ。

```
heroku pgbackups:restore DATABASE 'https://s3.amazonaws.com/me/items/xxxxx/mydb.dump'
```

DATABASEは定数を確認する必要があります。
```heroku config``` を打つとHEROKU_POSTGRESQL_COLOR_URLとか出てくるかと。


これでリストア完了。サクッといきますね。
以上です。




 → <a href="http://workabroad.jp/posts/2050">http://workabroad.jp/posts/2050</a>
Node.jsで環境変数を参照する


`process.env`にいろいろ入ってた

```bash
$ node 
> process.env
{ MANPATH: '/hoge/fuga/piyo/man',
  TERM: 'xterm-256color',
  NVM_PATH: '$HOME/.nvm/v0.10.x/lib/node',
  USER: 'takoba',
  PATH: '/hoge/fuga/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/$HOME/bin',
  LANG: 'ja_JP.UTF-8',
...
  _: '$HOME/.nvm/v0.10.x/bin/node' }

```
Objective-C の Dictionary は、キーに基本データ型が使えないのね


Obj-C 慣れないもので、こんな所でハマってた。
くやしいので他の言語と比較しておく。
当然ながら Dictionary に限った話でない（はず）。

### Objective-C

```obj-c:Objective-C
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:@"hoge" forKey:[NSNumber numberWithInt:1]]; // これは OK
[dic setObject:@"huga" forKey:@1]; // これも OK (@1 は NSNumber のリテラル構文なので)
[dic setObject:@"piyo" forKey:2]; // これはダメ（落ちる
```

キーと値が他の言語と逆なのにまずハマって、
キーに int型 の値を入れてたのに気づかずまたハマった。
せめてコンパイルエラーにして欲しいよ。
言語仕様上、型指定できないのでキーも値もどんな型でも突っ込めちゃう、こわい。

### Java

```java:Java
Map<Integer, String> dic = new HashMap<Integer, String>();
Map<int, String> dic = new HashMap<int, String>(); // これはダメ(コンパイルできない)
dic.put(Integer.valueOf(1), "hoge"); // OK
dic.put(2, "piyo"); // これも OK（へー
```

int と Integer ってのがあって、int を使って HashMap を宣言できない。
これはコンパイル時に分かるので良いけど、int と Integer の変換が必要なことがしばしば。

### C＃

```csharp:C#
var dic = new Dictionary<int, string>(); // 型推論＆Generic
dic.Add(1, "hoge"); // OK
dic.Add(2, "piyo"); 
dic.Add(3, "huga"); 
```

一番スッキリ書けますね。
　
　
　


…Xamarin いいよ、Xamarin
Clang ではカスタムの as, ld は指定できない?


Driver のコードを読むと, as を呼ぶところで

https://github.com/llvm-mirror/clang/blob/master/lib/Driver/Tools.cpp#L6325

GetProgramPath() は Driver.cpp に定義されていて,

https://github.com/llvm-mirror/clang/blob/master/lib/Driver/Driver.cpp#L1792

プログラムの名前は Triple の設定のプレフィックスを付けて決められていますね.

as だけ変えるとか, ld だけ変えるとかはハックしないと使えなさそうですね.
シェルスクリプトで簡易に待ち合わせ処理を書く

とあるjavaのプロセスが終わるのを待って別のjavaのプロセスを実行したいときとかに。

```shell-session
for i in 1
do
  printf "Waiting for other process"
  while $(ps aux | grep \[j\]ava -q)
  do
    printf "."
    sleep 1
  done
  printf "done, Start for %d .\n" "${i}"
  java -version
  sleep 10
done
```
今日の勉強はこれが限界

単純選択法の流れがわからないから、1周目だけ書き出してみた。だいたいわかった気がする……

![20140128アルゴリズム.jpeg](https://qiita-image-store.s3.amazonaws.com/0/7773/21cf5c8c-a72b-7ba7-30ef-69011d84de30.jpeg)
ブラウザのキャッシュコントロールを正しく理解する

## ①ブラウザに一切、キャッシュさせたくない場合

サーバからクライアントへのHTTP応答ヘッダ
→ `Cache-Control "no-cache"`

アクセス毎に内容が変わったり、サーバにアクセスしてもらわないと困るようなコンコンテンツの場合です。
スクリプト言語等で生成する動的コンテンツは、このようにした方が安全です。

例えば対象コンテンツが画像である場合、ブラウザで同じ画像のURLが含まれたHTMLを開いた場合は、

* もちろんローカルにキャッシュがないので、サーバへ問い合わせを行う
* 条件つきリクエスト（If-Modified-Since、If-None-Match）もサーバへ送ってこない

## ②ブラウザにキャッシュさせるけど、変更ないか都度確認するようにしたい

サーバからクライアントへのHTTP応答ヘッダ
→ `Cache-Control "max-age=0"`
→ `Expires "Mon, 26 Jul 1997 05:00:00 GMT"`

ブラウザ毎に片方しかサポートしていない場合があるので、両方のヘッダを指定しておいた方がいいです。
最初から既に期限切れ、という意味です。

ブラウザで同じ画像のURLが含まれたHTMLを開いた場合は、

* 期限が切れてるので、サーバへ問い合わせを行う
* 条件つきリクエスト（If-Modified-Since、If-None-Match）をサーバへ送ってくる

ただし条件つきリクエストを送ってくるのは、前回にサーバから Last-Modified、Etag を送ってある場合のみです。
またサーバ側は、もし If-Modified-Since、If-None-Match がクライアントから送られてきたら、変更ありなしを判断して 304レスポンスを返せば通信量が減らせます（Apacheなど普通のWEBミドルウェアなら静的コンテンツの場合は勝手に処理してくれるでしょうけど）。
サーバから304レスポンスを受け取った場合、ブラウザはローカルのキャッシュを利用します。

## ③ブラウザにキャッシュさせ、都度確認はそれほど必要ない

上記②の時から次のように変更すればいいです。

サーバからクライアントへのHTTP応答ヘッダ
→ `Cache-Control "max-age=秒数"` 例：86400など（この場合は1日）
→ `Expires "ここに期限の日時"`

その期限に達していない限り、ブラウザはサーバに問い合わせを行いません。
期限がきれた後の挙動は、②と同じです。

## 補足

iPhoneやAndroid等のネィティブアプリ内のWebViewはキャッシュが強いので、サーバからのキャッシュコントロールに関わらず、ローカルのキャッシュが利用されることがあります（恐らくWebViewの設定でキャッシュポリシーを変更できるかとは思います）。
古いGlassFishをダウンロードしたいときには


以下のページから。
[Java Archive Downloads - Glassfish Server](http://www.oracle.com/technetwork/middleware/glassfish/downloads/java-archive-downloads-glassfish-419424.html#ogs-3.1.2-oth-JPR “Java Archive Downloads - Glassfish Server”)

このへんにもある。
[GlassFish Server 3.1.2](https://glassfish.java.net/downloads/3.1.2-final.html "GlassFish Server 3.1.2")

ググるときは
[glassfish open source edition download 3.1.2](https://www.google.co.jp/webhp?tab=ww&authuser=0&ei=QD_oUuffHYfAkQXBnoHwAg&ved=0CBgQ1S4#authuser=0&q=glassfish+open+source+edition+download+3.1.2 "")
などどする。
MacのターミナルからGrowlで通知する方法


## growlnotifyをインストール
GrowlNotify 2.1.pkgをダウンロードしてインストール
[growl download](http://growl.info/downloads#generaldownloads "growl download")

## コマンド

```
$ growlnotify -a 'Kobito' -t 'test' -m 'growlから通知'
```
-a はアプリ名を設定出来る
-t はタイトルを設定できる
-m はメッセージを設定できる
configローダーでGruntのタスクモジュールの管理を自動化する

[Gruntfile.jsを10行にした話@watilde](http://qiita.com/watilde/items/278ce0593339072d5627)

このエントリのやり方が気に入ったので自分の真似してGruntfileをダイエットさせた。

[Gruntダイエットで健やかな開発を](http://nakajmg.github.io/blog/2014-01-28/gruntworkflow.html)

## config書くのだけめんどくさい

すごく良いやり方だと思ったけど、`config.js`を自分で追記していくのが若干めんどうだし、自動でできればモジュール追加が捗る〜と思って書いてみた。

```js:config.js
/* config */
var configName, fs;

fs = require("fs");

configName = __filename.split("/").reverse()[0].split(".")[0];

fs.readdirSync(__dirname).forEach(function(filePath) {
  var fileName, stats;
  stats = fs.statSync(__dirname + "/" + filePath);
  fileName = filePath.split(".")[0];
  if (stats.isFile() && fileName !== configName) {
    return module.exports[fileName] = require(__dirname + "/" + filePath);
  }
});
```

## やってること

* nodeの`fs`を使って`config.js`のあるフォルダの中身を取得(同期でやらないとうまくいかない)。
* ファイルかどうか判定 && そのファイルがコンフィグファイルじゃないか確認
* exports!!

これで`config.js`と同じ階層にあるモジュールを全部読み込んで`exports`してくれる。良い。

---

かなり便利になった。でも同じ階層にあるモジュールファイルを問答無用で読み込む。使わないモジュールだろうがなんだろうが読み込むので、モジュールが増えすぎた場合パフォーマンスに影響がでることがあるかも？


## おまけ

いい機会だと思ったのでGruntのためだけにCoffeeを覚えた。短くて良いけどチェーン書きづらい。

```coffeescript:config.coffee
### config ###
fs = require "fs"
configName = __filename.split("/").reverse()[0].split(".")[0]

fs.readdirSync(__dirname).forEach (filePath) ->
  stats = fs.statSync __dirname + "/" + filePath
  fileName = filePath.split(".")[0]

  if stats.isFile() and fileName isnt configName
    module.exports[fileName] = require __dirname + "/" + filePath
```

自分用のGruntテンプレもいい感じにスッキリして大変満足( ˘ω˘ )

[nakajmg/GruntTemplate](https://github.com/nakajmg/GruntTemplate)
Google Analytics SDK for iOS v3 (Beta)導入時のエラー

iOSアプリアクセス解析を導入する際に(もはやアクセス解析と言わないかもしれませんが。。。)
Google Analyticsを使われる方が多いと思いますが
なんとまぁ以下Googleのドキュメント通りにしてもエラーがでます。

Google Analytics SDK for iOS v3 (Beta) - Getting Started
https://developers.google.com/analytics/devguides/collection/ios/v3/#headers

```objc:エラー内容の一部
Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_ASIdentifierManager", referenced from:
      objc-class-ref in libGoogleAnalyticsServices.a(GAITrackerModel.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

その際は
`AdSupport.framework`
を追加しましょう。

## 追記 2014/02/14

[yimajo](http://qiita.com/yimajo)さんから`AdSupport.framework`を組み込んでいるとリジェクトされる可能性が高いとのコメントを頂きました。危ない危ない。。。
ということで、詳しくは下記を参照下さい。
\>\> [広告表示がないアプリでGoogle Analytics for iOSを組み込んでいるとリジェクトされる問題](http://qiita.com/yimajo/items/51ec837de220c0e94cfd)
メモ: Alfredでよく使う機能

有料版を愛用してます。

* [Alfred App - Productivity App for Mac OS X](http://www.alfredapp.com/)

Windowsでも似たようなものが欲しいなあと思って、じゃあ何を基準に選んだら良いのかなという事で明文化してみる試み。

* グローバルホットキー
    * Ctrl+Spaceで入力を開始したい。
* アプリ切り替え
    * 起動するより、既存のものを選ぶ場合が多い。Alt+Tabで探すより楽。
    * 名前ソートが基本だけれど、利用回数から上位に持って来てくれる機能も必要。
    * あんまりなさげ。
* アプリ起動
    * Win 7以降はOSに近い機能が組み込まれているけれど。
    * Win 8の場合は画面全体が切り替わってしまうので、名前から検索するのはちょっとアレ。
    * 検索はファイル名と登録名の両方に対応していると良い。
* アプリ起動対象の自動更新
    * スタートメニューの中身を動的に検索する的な。
    * 普通だろうと思ってたら、以外と事前登録制のものが多くて。
    * 任意のディレクトリーも対象に出来ると良さそう。スタートメニューに登録しないものも多いから。
* ワークフロー
    * 任意のURLにキーワードを埋め込んで開きたい。
    * よく辞書を引いてます。
    * 検索はGoogleサジェストが便利だから、あまりAlfredから起動する事はない。
* クリップボード履歴
    * これは別アプリでもいいや。
* ログイン時に起動
    * スタートアップに登録するだけだ。
【ruby】rbenvを使ってRubyのバージョンを2.0.0-p247に設定する方法


###１・rbenvとruby-buildをgithubから落としてくる

```shell-session
g08m11@test:~$ git clone git://github.com/sstephenson/rbenv.git .rbenv
g08m11@test:~$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```
<br>

###２・.bash_profileにPATHを記述する

```vim
g08m11@test:~$ vi .bash_profile

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```
<br>
###３・インストールしたいRubyのバージョン（今回は2.0.0-p247）があるか確認する

```shell-session
g08m11@test:~$ rbenv install -l | grep 2.0.0
2.0.0-dev
2.0.0-p0
2.0.0-p195
2.0.0-p247
2.0.0-p353
2.0.0-preview1
2.0.0-preview2
2.0.0-rc1
2.0.0-rc2
maglev-2.0.0-dev
rbx-2.0.0
rbx-2.0.0-dev
rbx-2.0.0-rc1
```
<br>

###４・Rubyをインストール（今回は2.0.0-p247）

```shell-session
g08m11@test:~$ rbenv install 2.0.0-p247
Downloading ruby-2.0.0-p247.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/c351450a0bed670e0f5ca07da3458a5b
Installing ruby-2.0.0-p247...
```
<br>

###５・globalなrubyのバージョンをrbenvで指定する

```shell-session
g08m11@test:~$ rbenv global
system

g08m11@test:~$ rbenv global 2.0.0-p247

g08m11@test:~$ rbenv global
2.0.0-p247
```

<br>
###６・インストール済みのバージョンの確認と、それが現在使用中かどうかの確認

```shell-session
g08m11@test:~$ rbenv versions
system
* 2.0.0-p247 (set by /home/g08m11/.rbenv/version)
```

<br>
###７・設定内容を確定させるために「rbenv rehash」を実行

```shell-session
g08m11@test:~$  rbenv rehash
```
<br>

###８・rubyの設定がrbenvとなっているか確認する
```shell-session
g08m11@test:~$ which ruby
/home/g08m11/.rbenv/shims/ruby

```
<br>

###９・rubyのバージョンが指定した通りになっているか確認する

```shell-session
g08m11% ruby -v                                                                                                                                               
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.3.0]
```

<br>
Codeigniter EUC-JP

レトロな環境にCodeIgniterで作成したアプリケーションを移設することになった時、ハマったのでメモ。

データベースはMySQL5でEUC-JP

application/config/database.php 
$db['default']['char_set'] = 'ujis';
$db['default']['dbcollat'] = 'ujis_japanese_ci';

そして、MVCに置いているソースコードをnkfでEUC-JPに変換
boost::numeric::ublas::c_vectorでconstなゼロベクトルを作る方法

C++で2次元あるいは3次元ベクトル使う時って、[boost::numeric::ublas::c_vector](http://www.boost.org/doc/libs/1_55_0/libs/numeric/ublas/doc/html/classboost_1_1numeric_1_1ublas_1_1c__vector.html)を使いますよね。


・・・使いませんか？

私は[uBLAS](http://www.boost.org/doc/libs/1_55_0/libs/numeric/ublas/doc/index.htm)とか[ViennaCL](http://viennacl.sourceforge.net/)とか使いたいので、使いたいんですよ！
というか、C++用の線形代数ライブラリっていくつかありますけど、boostないC++なんてこの世に存在してはいけないので、逆に言えばuBLASとかC++ではなにもしなくても使えるもののはずなんです！

と、話が逸れましたが本題。

このboost::numeric::ublas::c_vectorって、普通のboost::numeric::ublas::vectorとは違って、配列(array)ベースのベクトルで、サイズを固定で作れるのでN次元のサイズ固定ベクトルのために重宝してるんです。
ただ、コンストラクタが貧弱なんですよね。

* 引数なし（値不定）：`c_vector()`
* サイズ指定（Nがあるのになにに使うの？）：`c_vector(size_type size)`
* コピーコンストラクタ：`c_vector(const c_vector &v)`
* vector_expression指定：`c_vector(const vector_expression< AE > &ae)`

まぁ仕方ないんですけど、でも、そうなると初期化時に

```cpp:normalConstruct.cpp
boost::numeric::ublas::c_vector<double, 2> vec;
vec(0) = 0;
vec(1) = 0;
```

とかしなきゃいけなくなります。ということは、そう、constにできないんですよね。

```cpp:constConstruct_NG.cpp
const boost::numeric::ublas::c_vector<double, 2> vec;
vec(0) = 0; // ←できない
vec(1) = 0; // ←できない
```

[list_of](http://www.boost.org/doc/libs/1_53_0/libs/assign/doc/index.html#list_of)とか使えればなんとかなるかなぁと試行錯誤したんですが、ダメでした。

一応、[stackoverflowにも質問が上がってました](http://stackoverflow.com/questions/798002/filling-a-boost-vector-or-matrix)けど、結局constにできなさそうでした。

ので、仕方ないので、こんな力技で解決しました。

```cpp:constVector_OK.cpp

// 次元数
const int DIM = DIMENSTION;

// N次元固定ベクトル
typedef boost::numeric::ublas::c_vector<double, DIM> Vector;

// 定数ベクトル
class VectorConst : public Vector
{
public:
	VectorConst(const double& value)
	{
		std::fill_n(this->begin(), DIM, value);
	}
};

// ゼロベクトル
const Vector VectorZero = VectorConst(0.0);
```

もっと良い解決方法ないものか・・・ご存知のかた教えて下さい。
Ghostで作ったブログをherokuに公開する



基本的な手順は以下の通りで良いのです。
http://www.howtoinstallghost.com/how-to-install-ghost-on-heroku/

ですがいくつかはまったポイントがありました。
まず、Procfileの作成の際。


```Procfile
web: node index.js --production
```

このように書くようにとありますが、これでherokuにpushすると、
heroku logs -t でログを見ると "Ghost is running in development..."と表示されてました。
試しにローカルのGhostのディレクトリで node index.js --production で起動してみると、やはりdevelopmentでした。

そこで次の通り修正しました。

```Procfile
web:  NODE_ENV=production node index.js
```

これでproductionで動かす事ができました。
ところがログを見ると今度は "Module pg not found" でまたしてもエラー。。
Ghostをnpm installするとnpmのライブラリは「node_modules」以下に格納されるのですが、その中に"pg"がないと。
pgはpostgresqlを利用するためのライブラリです。
ではインストール。

```
npm install pg --production
```

--productionオプションは、testファイルなどの開発用のコードをインストールしないためにつけておくと良いと思います。
Ghostのインストール時にもつけるオプションです。
すると今度は、"pg_config: command not found"で失敗。
CentOS環境なのでyumでインストールします。

```
yum install postgresql_devel
```

その後pgを再インストールして、herokuにpushすると、無事Ghostのトップ画面が表示されました。
[Sencha Touch]現在のスクロール位置を取得する

スクロール可能なコンテナは、getScrollable().getScroller()でExt.scroll.Scrollerのインスタンスが取得できる。
APIドキュメントには記載がないが、Scrollerのpositionプロパティから現在のスクロール位置を取得できるっぽい。

Scrollerには他にもいくつかのプロパティが格納されている。

- position  
  現在のスクロール位置（表示されいてる範囲の左上座標）
- maxPosition  
  一番右下までスクロールした時の左上座標
- givenContainerSize  
  コンテナのサイズ  
- givenSize  
  スクロールされる領域のサイズ

```js
Ext.define('MyApp.view.Main', {
    extend: 'Ext.Container',
    xtype: 'main',
    config: {
        items: [{
            centered: true,
            width: 100,
            height: 150,
            xtype: 'list',
            itemTpl: '{name}'
        }],
    },
    initialize: function() {
        this.callParent();

        var list = this.down('.list'),
            data = [];
        for (i = 0; i < 30; i++) {
            data.push({name: 'item' + i});
        }
        list.setData(data);

        var scroller = list.getScrollable().getScroller();
        scroller.on({
            scroll: function(scroller) {
                console.log("コンテナサイズ", scroller.givenContainerSize.y);
                console.log("スクロール領域サイズ", scroller.givenSize.y);
                console.log("最大スクロール範囲", scroller.maxPosition.y);
                console.log("スクロール位置", scroller.position.y);
            }
         });
    },
});
```
スリープを抑止するcaffeinateコマンド

caffeinateコマンドを使うと、スリープを抑止できるみたい。

```shell-session:Terminal
$ caffeinate -di /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary
```

多分こんな感じ。（ちゃんとディスプレイのスリープが抑止できているかは試してない）こうするとChromeが終了するまでスリープしない……はず。ブラウザでスライドを作る人とか（私です）にはいいかも。コマンドの最後に`&`を付けて裏で動かすか、`C-z`で止めて`$ bg`したほうがいいかも。

詳しくは

```shell-session:Terminal
$ man caffeinate
```

で。
Macで時間のかかるコマンドが終わったら、自動で通知するzsh設定

# 概要
実行時間の長いコマンドが終わったら、Mac の Notification Center (Growl にするのも可能) で通知がくる。Terminal.app と iTerm 2 に対応している。

![zsh-notify-win.png](https://qiita-image-store.s3.amazonaws.com/0/724/000fcbdd-232b-fc45-2dc8-1854a7ba8f9f.png)

通知の様子。30秒を超えるコマンドが通知されている。

![zsh-notify-fail.png](https://qiita-image-store.s3.amazonaws.com/0/724/cbec87b6-5233-58f1-8991-404733841557.png)

30秒を超えないコマンドでも、失敗したら通知される。

どちらもターミナルがバックグラウンドのときのみ通知される。長いコマンドを投げてから twitter とか見てたらいつのまにか時間が経ってしまうような人に便利。

# 設定

## 1. 準備
- Notification Center に通知する場合

[alloy/terminal-notifier](https://github.com/alloy/terminal-notifier) をインストールする。コマンドから Notification Center に通知をするためのアプリ。
[Releases](https://github.com/alloy/terminal-notifier/releases) から .app をインストールしてもよいし、[Download](https://github.com/alloy/terminal-notifier#download) にあるように RubyGems もしくは homebrew で入れてもよい。

- Growl に通知する場合

[Growl - Downloads](http://growl.info/downloads) から GrowlNotify を入れる。Growl に通知するのは使ってないので割愛...

## 2. インストール
[marzocchi/zsh-notify](https://github.com/marzocchi/zsh-notify) を zsh で使えるようにする。
ダウンロードして適宜配置し、`.zshrc` に以下を追記する。

```zsh
source ~/.zsh.d/zsh-notify/notify.plugin.zsh
```

デフォルトでは terminal-notifier を .app でインストールした場合を想定しているので、インストールする方法によって修正する。`$ which terminal-notifier` の実行結果を貼り付ければいいんじゃないかな。

```zsh
export SYS_NOTIFIER="/Users/kei/.rbenv/shims/terminal-notifier"
```

## 3. 設定
デフォルトでは閾値が30秒になっているので、各自よしなに。

```zsh
export NOTIFY_COMMAND_COMPLETE_TIMEOUT=10
```
ベーシック認証をURLに直接書く

ベーシック認証がかかったサイトで

* ユーザー名：user
* パスワード：password

とすると：

http://user:password@www.hoge.com/

で、直接アクセスすることが出来たりする…。

追記：
ちなみに、ユーザー名もしくはパスワードに＠マークが入っていた場合：

* ユーザー名：user＠hoge.com
* パスワード：password

http://user%40hoge.com:password@www.hoge.com/

と、URLエンコードすると良いらしい…。
RubyのMechanizeでUAをいい感じにセット

```rb
a = Mechanize.new
a.user_agent_alias = 'Windows IE 9'
```

この `user_agent_alias=` は、中では `Mechanize::AGENT_ALIASES` と言う定数を参照してUAを決めているっぽい

```rb
Mechanize::AGENT_ALIASES                                                                                                              
=> {"Mechanize"=>
  "Mechanize/2.7.3 Ruby/2.0.0p353 (http://github.com/sparklemotion/mechanize/)",
 "Linux Firefox"=>
  "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1",
 "Linux Konqueror"=>"Mozilla/5.0 (compatible; Konqueror/3; Linux)",
 "Linux Mozilla"=>
  "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624",
 "Mac Firefox"=>
  "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6",
 "Mac Mozilla"=>
  "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401",
 "Mac Safari 4"=>
  "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
 "Mac Safari"=>
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22",
 "Windows Chrome"=>
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.32 Safari/537.36",
 "Windows IE 6"=>"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
 "Windows IE 7"=>
  "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
 "Windows IE 8"=>
  "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
 "Windows IE 9"=>
  "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
 "Windows Mozilla"=>
  "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6",
 "iPhone"=>
  "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3",
 "iPad"=>
  "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
 "Android"=>
  "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
 "Mac FireFox"=>
  "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6",
 "Linux FireFox"=>
  "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1"}
```

`IE 10` とかが無いのでプルリクチャンスですね。！
cacti覚書

windowsクライアントをcactiサーバーにて監視する方法
----------------

* `windowsの機能の有効化または無効化`を開き、`簡易ネットワーク管理プロトコル (SNMP)`をチェック入れる。
* サービス -> SNMP Service が追加される。
  * セキュリティ -> 認証トラップを送信する -> 追加
  * セキュリティ -> これらのホストからSNMPパケットを受け付ける -> 追加


インストール時の注意
----------------

web画面にアクセスしたのに真っ白・・・

という時はdatabaseに初期データーが入っているか確認しよう。

```bash:cacti.sqlを入れる
$ mysql -uroot -p cacti < cacti.sql
```

これで画面が見れるはず。３回ハマった
gumbyのナビゲーションバーを白くする


以下のCSSを仕込めばOK

```css
  .pretty.navbar {
    background-image: linear-gradient(#FFFFFF, #FFFFFF);
    -webkit-box-shadow: inset 0 1px 1px #FFFFFF, 0 1px 2px rgba(255, 255, 255, 0.8) !important;
    -moz-box-shadow: inset 0 1px 1px #7b8085, 0 1px 2px rgba(0, 0, 0, 0.8) !important;
    box-shadow: inset 0 1px 1px #FFFFFF, 0 1px 2px rgba(255, 255, 255, 0.8) !important;
  }
```
![適用前](http://gyazo.com/8fbcd7f00db32ca16088d742df9a5fd7.png)

↓

![適用後](http://gyazo.com/df276d4f08ab25e9e98205ce6671479f.png)
ネット記事で利用する画像をGitHub（やGitLab）で管理し利用する

GitHubの場合は、対象の画像ファイルを開いて、

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/35733/7b63b654-2d0a-1a23-ba56-a6dbaea98974.jpeg)

[Raw]ボタンを押すと、全画面で画像が開くので、

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/35733/c544d157-de3b-0c29-3409-c8ab99de0b6a.jpeg)

あとはURLをコピーして記事に張る。

GitLabの場合も同じような感じです。

ただGitHubソースの紹介でなくストレージとして利用してしまうと、GitHubの規約とかに違反するかもなので、自前で立てたGitLabとかで画像を管理した方が良さそうです。
（ほかに手軽にCDNとして利用できるクラウドサービスあるのかなー？）

## 2014/2/2追記

そもそも [GitHub Pages](http://pages.github.com) を使えば規約とか気にせず済みそうです^^;
MacOSXでファイルの作成日時と更新日時を変更する

Mac OSXで `setfile` コマンドを使うとファイルの作成日時と更新日時を変更できるらしい。

----

[SetFile(1) Mac OS X Developer Tools Manual Page](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/SetFile.1.html)を見ると、 `-d` で作成日時が、 `-m` で更新日時が変更できるようです。

たとえばこんなファイルと作ってみます。

```shell-session
[mazgi@BRUICHLADDICH] $ touch A.LostLogia
[mazgi@BRUICHLADDICH] $ ls -lT A.LostLogia
-rw-r--r--  1 mazgi  staff  0 Jan 28 13:01:13 2014 A.LostLogia
[mazgi@BRUICHLADDICH] $ ls -lUT A.LostLogia
-rw-r--r--  1 mazgi  staff  0 Jan 28 13:01:13 2014 A.LostLogia
```

![Screen Shot 2014-01-28 at 1.01.30 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/a31334c3-be20-e752-c865-3b621ea162be.png)

早速 `setfile -d` と `setfile -m` を実行してみます。
ちなみにMac OSXの `date` コマンドは `-v[+-]num[ymwdHMS]` オプションでGNU版dateのように「○年前」「○日後」の指定ができるようです。

```shell-session
[mazgi@BRUICHLADDICH] $ setfile -d "$(date -v-100y +'%m/%d/%Y %H:%M:%S')" A.LostLogia
[mazgi@BRUICHLADDICH] $ setfile -m "$(date -v-64y +'%m/%d/%Y %H:%M:%S')" A.LostLogia
[mazgi@BRUICHLADDICH] $ ls -lUT A.LostLogia
-rw-r--r--  1 mazgi  staff  0 Jan 28 13:14:13 1914 A.LostLogia
[mazgi@BRUICHLADDICH] $ ls -lT A.LostLogia
-rw-r--r--  1 mazgi  staff  0 Jan 28 13:14:23 1950 A.LostLogia
```

![Screen Shot 2014-01-28 at 1.14.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/14159963-262e-2ab6-86ba-354b5d59a3ef.png)

これで100年前に作られて64年前に変更されたことになりました！
distnoted が原因でEmacsが落ちるのを防ぐemacs.rb

2014/05/09時点でのHomebrewのFormulaには、以下のパッチが取り込まれているので、
わざわざ編集する必要はないです。

---


MacBookPro13 lateで、Cocoa Emacsを使っているのだけど、Emacsが1日2回ほど死んでしまう。

自分の環境では、以下の操作で確実に死ぬ。

 1. M-x でhelm-M-xを起動
 1. Command+p でプリントダイアログを表示し、Escで消す
 1. 一つ上の操作を10回〜20回ほど繰り返す


「Emacs が予期しない理由で終了しました。」とダイアログが出てくるが、対応方法がわからず困っていた。


検索してみると、distnotedが原因で、その対応方法も書かれていた。

[distnotedプロセスの暴走に対応するためhomebrewのemacsにパッチをあてる (OS X Mavericks‎)](http://tdiary.omuc.org/?date=20140114#p01)

[anonymous / emacs24_3_inline_memleak.sh](https://gist.github.com/anonymous/8553323#file-emacs24_3_inline_memleak-sh)


自分は、homebrewを使ってEmacsをインストールしているので、emacs.rb を次の様に編集した。


```diff
diff --git a/Library/Formula/emacs.rb b/Library/Formula/emacs.rb
index db7c46c..f8488f8 100644
--- a/Library/Formula/emacs.rb
+++ b/Library/Formula/emacs.rb
@@ -48,6 +48,8 @@ class Emacs < Formula
     # to apply a patch from MacEmacsJP for Japanese input methods
     if build.include? "cocoa" and build.include? "japanese"
       p[:p0].push("http://sourceforge.jp/projects/macemacsjp/svn/view/inline_patch/trunk/emacs-inline.patch?view=co&revision=583&root=macemacsjp&pathrev=583")
+      # for Mavericks distnoted memory leak
+      p[:p1].push("https://gist.github.com/anonymous/8553178/raw/c0ddb67b6e92da35a815d3465c633e036df1a105/emacs.memory.leak.aka.distnoted.patch.diff")
     end
     p
   end unless build.head?
```



ちなみに2014/01/28時点のEmacsのtrunkでは修正済みのため24.4ではパッチは不要。


## パッチを充てると別の問題が、、

メモリーリークのパッチを充てて確認ダイアログボックスを表示すると、ダイアログボックスを消すことができなくなった。

ダイアログボックスを表示するのをやめて、minibuffer上に表示するようにした。

```el
(setq use-dialog-box nil)
```
RailsでBootstrapを使ったときにフォームエラーをキレイに表示する方法

![スクリーンショット 2014-01-28 13.20.06.png](https://qiita-image-store.s3.amazonaws.com/0/10475/23b3ddc9-b154-59aa-4be4-0c301ae36b73.png)


## ソースコード例

```html+erb
<div class="row">
  <div class="col-md-6">
    <h2><%= t('views.sign_up') %></h2>
    <%= form_for resource do |f| %>
      <%= f.error_messages! %>

      <div class="form-group <%= f.error_css(:nickname) %>">
        <%= f.label :nickname, class: 'control-label' %>
        <%= f.text_field :nickname, class: 'form-control' %>
      </div>

      <div class="form-group <%= f.error_css(:email) %>">
        <%= f.label :email, class: 'control-label' %>
        <%= f.email_field :email, class: 'form-control' %>
      </div>

      <div class="form-group <%= f.error_css(:password) %>">
        <%= f.label :password, class: 'control-label' %>
        <%= f.password_field :password, class: 'form-control' %>
      </div>

      <div class="form-group <%= f.error_css(:password_confirmation) %>">
        <%= f.label :password_confirmation, class: 'control-label' %>
        <%= f.password_field :password_confirmation, class: 'form-control' %>
      </div>

      <%= f.submit t('.submit'), class: 'btn btn-success btn-centered' %>
    <% end %>
  </div>
</div>
```

`form_for` で `f.error_messages!` でまとめてエラーメッセージを表示でき、個別の項目は `f.error_css(:nickname)` のように表示できます。


## やりかた

FormBuilder を拡張するだけ。`application_helper.rb` を次のようにします。

```rb:app/helpers/application_helper.rb
module ApplicationHelper
end

module ActionView
  module Helpers
    module FormHelper
      def error_messages!(object_name, options = {})
        resource = self.instance_variable_get("@#{object_name}")
        return '' if !resource || resource.errors.empty?

        messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join

        html = <<-HTML
          <div class="alert alert-danger">
            <ul>#{messages}</ul>
          </div>
        HTML

        html.html_safe
      end

      def error_css(object_name, method, options = {})
        resource = self.instance_variable_get("@#{object_name}")
        return '' if resource.errors.empty?

        resource.errors.include?(method) ? 'has-error' : ''
      end
    end

    class FormBuilder
      def error_messages!(options = {})
        @template.error_messages!(@object_name, options.merge(object: @object))
      end

      def error_css(method, options = {})
        @template.error_css(@object_name, method, options.merge(object: @object))
      end
    end
  end
end
```

```rb:config/application.rb
module YourApp
  class Application < Rails::Application
    #..
    config.action_view.field_error_proc = proc { |html_tag, _| html_tag }
  end
end
```

内容は見ての通り。拡張の仕方とか、もろもろご指摘ありましたらコメントください。。あと、gem で配布とかのやり方は勉強中なので、誰か簡単にできる方いましたら勝手に持って行っていただければと。
RSpecでmoduleをテストする

モジュールをテストするとき、適当なクラスを作ってそこにincludeした状態をletで使い回したい。というのをこんな感じで書いています。何か他にいい方法があれば教えてください。

```rb
describe HogeModule do
  let(:klass) do
    klass = Class.new
    klass.send(:include, HogeModule)
    klass
  end

  # ...
end
```

`Class.new`を使うのはこれが初めてかもしれない。
ransackでカラム値がnullのものを検索 with simple-form and haml

ransackでカラム値がnullのものを検索
http://qiita.com/marqs/items/dc62759bdd8ea068f995

５分悩んだので覚えがいておく

```
= search_form_for @q,builder: SimpleForm::FormBuilder do |f|
  = f.input :name_null, as: :boolean
```
zshのctrl+なショートカット

viモードがどうしてもダメなので調べた
ctrl+アルファベットのみ
以下を参照のこと

```bash
$ zsh --version
zsh 5.0.0 (x86_64-unknown-linux-gnu)
$ bindkey -L | less
```

### todo
Macだとどうなのか。

### 移動系

- ctrl+a 先頭に移動
- ctrl+b 一文字戻る
- ctrl+e 末尾に移動
- ctrl+f 一文字進む

### 削除/編集系
- clrl+g 現在のコマンド入力を破棄して一行進む(send-break)
- ctrl+h カーソル直前の一文字を削除
- ctrl+k カーソル以下を削除
- ctrl+t カーソル下の文字を一つ左の文字と入れ替え(transpose-chars)
- ctrl+u コマンド入力の全削除(kill-whole-line)
- ctrl+w カーソルより手前を削除

###履歴系
- ctrl+n コマンド履歴を一つ進む
- ctrl+o 現在のコマンドを実行し、コマンド履歴を一つ進む(accept-line-and-down-history)
- ctrl+p コマンド履歴を一つ戻る
- ctrl+r コマンド履歴の後方検索(history-incremental-search-backward)
- ctrl+s コマンド履歴の前方検索(history-incremental-search-forward)

###その他
- ctrl+i (アスタリスクの?)拡張/キーワード補完の実施(expand-or-complete)
- ctrl+j 実行(accept-line)
- ctrl+l 画面のclear(clear-screen)
- ctrl+m 実行(accept-line)
- ctrl+q 現在のコマンドをスタックへpushしコマンドラインをクリア(push-line)

```zsh
$ git commit -m "HOGE: hogehogehoge hogehoge hoge." # ←git add忘れた! [ctrl+q]でcommitコマンドをスタックへ!
$ git add fugafuga # [ctrl+j] or [ctrl+m] or [enter]して実行!
$ git commit -m "HOGE: hogehogehoge hogehoge hoge." # ←スタックからコマンドが自動で復帰!
```

###よくわからないもの
- ctrl+d ターミナルを閉じる、でいいのか?(delete-char-or-list)
- ctrl+v 貼り付け的な? 貼り付け出来ないけど(quoted-insert)
SequelでOracleのSequenceを利用する


INSERT文を実行する場合にOracleのSequenceを利用してプライマリキーを自動でインクリメントしていくようなパターンのときに、なぜかリテラルがうまいこと動かなかったのでメモ。

シーケンスを取得する際に、次の通りbindを使って文字列として設定してしまうと、バインド変数使用時の ORA-01722 エラーが発生します

```ruby
DB[:items].insert(:a => 1, :b => "user_seq.nextval")
# INSERT INTO items (a, b) VALUES ("1", "user_seq.nextval")
```

また、Sequel::Dataset クラスにある literal を使っても、同様にORA-01722 エラーが発生します

```ruby
DB[:items].insert(:a => 1, :b => DB[:items].literal('users_seq.nextval'))
# INSERT INTO items (a, b) VALUES ("1", '"user_seq"."nextval"')
```

そこで、リテラルには、シンボルを使ってデータ型で対応します
その際、シーケンス名と次の値を取得する nextval の間を __ (アンダースコアx2)で繋げます

```ruby
DB[:items].insert(:a => 1, :b => :users_seq__nextval)
# INSERT INTO items (a, b) VALUES ("1", "user_seq"."nextval")
```
"user_seq"."nextval"のような形にすることで、Oracleが代入時に実行する暗黙変換がうまいこと比較されました。
【GAS】複数のdoGet関数の結果を1つのプロジェクトに収納するシンプルな方法

（仕様の理解が完全でないのでもっとよい方法があるかもしれませんが）
GASのバージョン管理システムは、外部からimportやexportすると反映される
https://developers.google.com/apps-script/import-export
のですが、
そのまま＜最新のコード＞を試すと、変更する前のdoGetが反映されなくなり困ることはないですか？

また、doGetのテストファイルをいろいろ作ってとっておきたいのだけど、
いちいちプロジェクトを作るとドライブの中がごちゃごちゃになりませんか。

こんな方法はどうでしょう。
/********************************************************************/
function doGet(e) {
var app = UiApp.createApplication()

switch (e.parameter.test){
 case "1":A(app) ;break;
 case "2":B(app) ;break;
 case "3":C(app) ;break;
 case "4":D(app) ;break;

}
return app
}

/********************************************************************/
function A(app) {
  var Label = app.createLabel("I love Apps Script")
  var verticalpanel = app.createVerticalPanel();  
  verticalpanel.add(Label);   
  app.add(verticalpanel);  
  
   
}


function B(app) {
  var Label2 = app.createLabel("I like Apps Script")
  var verticalpanel = app.createVerticalPanel();  
  verticalpanel.add(Label2);   
  app.add(verticalpanel);  
}

/********************************************************************/

公開URLの後に、?test=1,?test=2　とパラメータをつけると、別のdoGetの中身を返却してきます。
とっても簡単です。
Shellで日付表示

よく忘れるのでメモ

```shell-session
$ date +'%Y-%m-%d %H:%M:%S'
```

結果

```shell-session
2014-01-28 11:37:32
```

### おまけ

日本語表示

```shell-session
$ echo $LANG
ja_JP.UTF-8
```

```shell-session
$ date
2014年 2月13日 木曜日 15時57分05秒 JST
```

英語表示

```shell-session
$ LANG=C date
Thu Feb 13 15:58:24 JST 2014
```
Railsのroutesでnamespaceとscopeの設定

Railsのroutes.rbでnamespaceとscopeを設定できるんですが、こんな違いがあります。

## namespace
TestConrollerのReadアクションにアクセスしたいわけなんだけど、
routes.rbに

```Ruby
namespace :v3 do
	get "/test/read",:to=>"test#read"
end
```

とか書くと


```Ruby
GET  /v3/test/read(.:format)    v3/test#read
```

こうなります。
v3フォルダの下のTestControllerにアクセスしにいきます。

## scope

scopeだけを設定するといつものappフォルダの下にあるコントローラにアクセスしにいきます。


```Ruby
scope :v3 do
	get "/test/read",:to=>"test#read"
end
```

とか書くと


```Ruby
GET  /v3/test/read(.:format)    test#read
```

あえてフォルダの一個下ぽいURLを作りたいときなんかに使えそうですね。/adminとか/auth、またはAPIなんかに。

## Rails5で検証

Rails5になったので検証してみました。

```Ruby
 12   namespace :artists do
 13     get 'similars/index'
 14     get 'similars/show'
 15     get 'tags/index'
 16     get 'tags/show'
 17   end
```

僕が現在書いているソースコードの抜粋ですが、これだと

```
/artists/simmilar/index
```
とかでアクセスできました。

## Rails6で検証

Rails6になったので検証してみました。

```Ruby
 12   namespace :artists do
 13     get 'similars/index'
 14     get 'similars/show'
 15     get 'tags/index'
 16     get 'tags/show'
 17   end
```
こちらも

```
/artists/simmilar/index
```
とかでアクセスできました。
node.js express でファイルのロードが遅いとき

# URL のマッチングをミスっている可能性がある。
app.js に

```js
 app.get("/:aaa/:bbb", routes.test);
```

とか書いていると、普通のファイルを GET するリクエストでも
ここにルーティングされるので、これを実装していない段階だとタイムアウトまで待たされる。
MailChimp で ABテストする

結局はここを読む
http://kb.mailchimp.com/article/how-can-i-run-an-a-b-split-test-campaign-on-my-content/

(1) Subject or (2) date time or (3) fromの違いしか A/B testできないのかよ、、と最初は途方に暮れましたが、 Group A/B タグを使えば、contentについても A/B testできるとのこと
Facebookクロール遅延

# 現象

FacebookにGraphAPIを使ってリンクを投稿する際、OpenGraphでサムネイルが表示されないケースがあった

* 投稿に対してサムネイルが表示されない割合は、多くて1割強 (日によってかなり偏りがある)
* 投稿には[link](https://developers.facebook.com/docs/reference/api/link)を使用してる
* 2014/01/12以降遅延しなくなった…？

# 原因

Facebook側のクロール遅延

* OpenGraphを取得しに来ていないので、表示されなかった
* 通常GraphAPIでの投稿では、そのレスポンスが返されるまでの間にクローラーがリンクのURLに対してOpenGraphを取得しようとする
* 取得結果のOpenGraphメタ情報を元にサムネイル等を取りにいきOpenGraphを生成している
* サムネイルが表示されないすべてのケースで、クローラーからのアクセスがなかった

# クロール遅延対策

GraphAPIの[post](https://developers.facebook.com/docs/reference/api/post/)を使う

* このAPIでもリンクの投稿ができる
* パラメータにOpenGraphメタ情報を付けて投稿すると、link投稿と同じ見た目にできる
* さらにこのとき、パラメータのcaptionにサムネイルを指定すると、OpenGraphで取得した画像でなくcaptionの画像を優先させて表示させられる

---

# Fb投稿とOpenGraph表示の流れ

1. リンク投稿するURLのページにOpenGraphメタ情報を埋める
1. URLをGraphAPIでlink投稿する
1. FacebookのクローラーがOpenGraphを取りに来る
1. FacebookのクローラーがOpenGraphメタ情報を読んで画像(og:image)等を取りに来る
1. Fbのタイムライン上にOpenGraphを生成して記事を作成する
1. Fbがレスポンスを返す

表示される条件は3が来た場合

* アクセスログを解析すると、3が来ないケースがしばしば見られた
* 画像が表示されないケースは例外なくこのケースのみ
* 3がなければ当然4には来ない
* 3に成功していれば、4はすべて成功していた

# Facebookのクローラーについて

* User-Agent : facebookexternalhit/1.1
* 数十分～数時間後にクロールに来る場合もあれば、全く来ない場合もある
* クローラーからアクセスが来た後であれば、投稿にサムネイルが表示される(キャッシュクリアされる)
* Facebook側はOpenGraph取得に失敗しても投稿成功のレスポンスを返す

# その他

* WebUIを使った手動での投稿では、記事プレビューを作る際にOpenGraphメタ情報を取りに来る
 * プレビューで表示されない場合は、記事を一から作り直すことで更新できる
* 投稿前にデバッガーでOpenGraph情報をキャッシュさせることができれば根本が解決できる
 * 現状ではデバッガーを叩くAPIが無いので不可。今後に増えると嬉しいかも
Ruby on Railsで定数の指定


Railsで定数の指定方法は複数あります。

## ApplicationControllerに書く
これだとコントローラ同士で有効になります。

```Ruby
ApplicationCotnroller < ActionController::Base
	NUM = 1
	...
end
```
別なコントローラでもつかえる。

```Ruby
BookController < ApplicationController  
	def read   
		## ここに定数いれる
		@number = NUM
	end
end

```

## config/initializers/constants.rbで宣言

```Ruby
module Constants
	## Constants::NUMでアクセスできる
	NUM = 1
end

## こっちはTITLEでアクセスできる
TITLE = 'Story Of The Ring'
```

## ProductionとDevelopmentで分ける

constants.rbに書いたうえで、

```Ruby
if Rails.env == "production"
	## 本番の定数
else
	## 開発の定数
end
```

## SettingsLogic
[SettingsLogic](https://github.com/binarylogic/settingslogic)


```Ruby
class Settings < Settingslogic
  source "#{Rails.root}/config/application.yml"
  namespace Rails.env
end
```

initializeの下にこう書いてから、configの下にapplication.ymlとかを用意します。

```yaml
# config/application.yml
defaults: &defaults
  artist:
    band: Oasis
development:
  <<: *defaults
test:
  <<: *defaults
production:
  <<: *defaults
```
とかやるとこんな感じでアクセスできます。

```Ruby
Settings.artist.band # > Oasis
```
**20201005**
今リポジトリ確認したら最終更新六年前とかで、もう使うのやめた方がいい気がしました。


## confg
最近（**20201005**）はこちら主流かな。定数管理のGemです。これを書いてbundleします。

```ruby
gem 'config'
```

RailsのAppの下に`config/settings`に設定ファイルを置きます。

```
config/settings/
├── development.yml
├── production.yml
└── test.yml
```

本番は環境変数でいいなあとか。

```yaml
admin:
  url:  <%= ENV['ADMIN_DOMAIN'] %>
```

開発はベタでいい場合の使い分けができます。

```yaml
admin:
  url:  https://admin.なんたらかんたら.local
```

もちろん共通のもかけます。その場合は以下のファイルに記述します。

```
config/settings.yml
```

読み出しはこうですね。

```ruby
Settings.admin[:url]
```

## Railsデフォルトでもconfig使える
application.rbに定義。

```
config.x.preference = config_for(:default_settings).deep_symbolize_keys
```

こうかく。

```yml

## config/default_settings.yml

default: &default
  foo:
    - bar
    - baz

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
```

### Rails標準configの落とし穴
- [config_for](https://api.rubyonrails.org/classes/Rails/Application.html#method-i-config_for)
- [Rails::Application#config_for merges shared configuration deeply](https://github.com/rails/rails/pull/37913)

> 自分は環境固有の設定のためにgemを使ってるんだけど、これをRailsの機能に統合したいっス。でも自分の設定はネストが深すぎて、現在のRails::Application#config_forでは設定のマージができないんスよ

これを

```yaml
# config/application.yml
shared:
  foo:
    bar:
      baz: 1
development:
  foo:
    bar:
      qux: 2
```

こうさせてくれんかのう。

```yaml
# currently
config_for(:application)[:foo][:bar] #=> { qux: 2 }
# I expect
config_for(:application)[:foo][:bar] #=> { baz: 1, qux: 2 }
```

マージできないから両方できるようにさせてくれえっていうPRなんだけど、同じキーで本番の設定を開発でつかっちゃうとか起こりそうなので気持ち悪いですね。

定数を扱う時は大人しくGemつかっとくのが良さそうです。
（このPRマージされてるんだが事故った話とかそのうちどこかの会社の開発ブログであがりそうですね）
Spika-Serverのセットアップ

Line的なアプリが簡単につくれるオープンソースプロジェクトSpika

http://spikaapp.com/ja/


最新のサーバのセットアップに手間取ったのでメモります


## 起動について

vagrantで起動します。以下の環境が必要なのでバージョンが低い場合などはアップデートが必要です。

- VirtualBox
- Vagrant 1.3.x+


## 起動後の設定

どこを見ても以下のURLで次に進むとなっていたのですが、進みません。

```
http://localhost:8080/wwwroot/install
```

vagrantの起動ログを見ると以下が正しかったです

```
http://localhost:8080/wwwroot/installer
```

## mysqlの設定

上記installerが立ち上がったらmysqlに必要なデータを入れていきます。

mysql環境は既存ものもでも、立ち上げたvagrantで設定しても大丈夫そうです。


その後、「テーブルの作成」「テーブルにデータ作成」作業が続きます


## Spika-Server自体の設定

サーバの設定ファイル /var/www/config/init.phpの中の

- MySQL_DBNAME
- MySQL_USERNAME
- MySQL_PASSWORD

あたりを修正しておく


## サーバの起動等について

vagrantで起動しているので

```
/etc/init.d/apache2 restart
```

とかでよろしく出来ます。

## 動作確認方法

mysql設定後は

```
 http://localhost:8080/wwwroot/api/
```

で動作確認出来るよとなってましたが、出来ませんでした。
テーブルを直接参照するとuserテーブル等にデータは入っているようなので、とりあえずクライアントからつないでみます。

http://cloverstudioceo.hatenablog.com/entry/2014/01/08/175432

を参照にiOSクライアントとかで確認。
なんとか動いている模様


ドキュメントが最新の実装に追随していないので手探りでのインストールとなりました
スクレイピングツールの作成_4

前回までで、Ajaxを使用したページに対して遷移を完了し、スクリーンショットを取得するという所までは出来ていました。

問題なのは、速度が遅いということです。

今はPerlスクリプト上でTest::TCP を使ってPhantomJSをウェブドライバモードで立ち上げています。

が、もしかしたら既にコマンドプロンプトでPhantomJSを立ち上げていれば、立ち上げ時のオーバーヘッドを軽減できるのではないか？と勝手に思いました。

そこで、シングルスクリプトの状態のものを最近使い始めたMojoliciousで置き換えてみます。Mojoliciousに関しては下記参照。

<iframe src="http://www.slideshare.net/slideshow/embed_code/26401770" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/yusukebe/yapcasia-2013-mojolicious" title="Mojoliciousでつくる！ Webアプリ入門" target="_blank">Mojoliciousでつくる！ Webアプリ入門</a> </strong> from <strong><a href="http://www.slideshare.net/yusukebe" target="_blank">Yusuke Wada</a></strong> </div>

置き換えたものが動くか確認した後で、簡単なテストをしてみます。

以前書いたとおり、ローカル環境はWindows なのでまずコマンドプロンプトからPhantomJS を立ち上げます。

> phantomjs --ignore-ssl-errors=true --webdriver=4445

その上で、置き換えたスクリプトを動かします。

きちんとベンチマークを取っていないのでアレなんですが、前が大体10秒だったのに対し、今回は5秒程になったと思います。速くはなりましたが、まだまだ改善できるように思います。

次は本番環境のCentOSにモジュールを上げてテストしてみます。
rspecで特定のログが吐かれていることを確認する

# rspecでログのテスト備忘録

* Railsの特定のログがinfoで一回だけ呼ばれることをテストしたい
 * 処理の途中経過やベンチマーク結果等が出ていることを確認したい
* rspecでRails.logger.should_receive(:info).with(expected).onceのように書きたい
 * これだと、infoで呼ばれたすべてのログに対してチェックしてしまう

# 解決法

* Rails.logger.stub(:info => nil)を使う
 * withで渡したログ形式とマッチした回数をテストできる

```rb
  before do
    Rails.logger.stub(:info => nil)
    expected = {
      :type     => "benchmark",
      :category => "upload",
      :realtime => anything
      }
    Rails.logger.should_receive(:info).with(expected).once
  end
```
VB.NETのフォームのインスタンスは何処にあるのか？

ここ。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/20854/d202fb3a-b246-2a6d-7d6e-5b147d1642fe.png)


ソースコードに

```vbnet
frmCDF109.メッセージ.Text!
```

と書いてある時はウォッチ式に

```vbnet
My.Forms.frmCDF109.メッセージ.Text
```

と書くと読めます。

　IDEの「定義へ移動」を[DebuggerNonUserCode]属性を使って打ち消してる？
watchdogでサーバーを自動で再起動させよう

監視項目に異常があればOSを再起動させる仕組み。Macには無い。

監視可能な項目

* ping
* load average
* memory usage
* 温度
* pid


PIDの監視方法
--------------

```diff:/etc/watchdog.conf
-#pidfile         = /var/run/syslogd.pid   
+pidfile         = /var/run/rsyslogd.pid
```

```bash:設定反映
$ sudo /etc/init.d/watchdog restart
```

```bash:動作テスト
$ sudo /etc/init.d/rsyslog stop
```

OSが再起動することを確認。


watchdogによる再起動通知先
--------------

```diff:/etc/watchdog.conf
-#admin         = root
+admin         = hoge@fuga.com
```

```bash:watchdogからのメール例
Message from watchdog:
The system will be rebooted because of error 2!
```

`watchdog because of error 2`でググルと、error noが何を意味するかを教えてくれる。

ネットワークが応答なくなった時、再起動する設定
-----------------

```diff:/etc/watchdog.conf
-#ping                   = 172.31.14.1
+ping                    = 192.168.12.1
```

間違ってifdownした時やOSがハングアップした時(こちらは確認中)再起動してくれます。
RailsのHelperにブロックを渡す

「特定の条件を満たした時に中身を表示、満たしていないときには何も出さない」という処理を、同じ条件で中身は違うというものをいろんなところに書きたかったのでHelperに実装してみました。

```haml:some_view.html.haml
= lock do
  条件を満たした！
```

erbなら以下のようになると思います。

```erb:some_view.html.erb
<%= lock do %>
  条件を満たした！
<% end %>
```

としておいて、helper側は以下のようにします。

```rb:application_helper.rb
def lock(&block)
  if some_condition?
    capture(&block)
  else
    '今は見れません！'
  end
end
```

`capture(&block)` がミソですね。

[block_called_from_erb?はRails3からは天に召されている](http://apidock.com/rails/ActionView/Helpers/TagHelper/block_called_from_erb%3F)ので注意。
Rxを使ってファイルが変更されたタイミングでWPF画面に反映する


```c#:
public partial class MainWindow : Window
{
	private FileSystemWatcher watcher;

	private IDisposable obs;

	public MainWindow()
	{
		InitializeComponent();

		var f = new FileInfo(@"C:\temp\Sample1.txt");

		this.watcher = new FileSystemWatcher();
		this.watcher.Path = f.Directory.FullName;
		this.watcher.Filter = f.Name;
		this.watcher.NotifyFilter = NotifyFilters.LastWrite;
		var o = Observable.FromEvent<FileSystemEventHandler, FileSystemEventArgs>(
			a => (obj, e) => a(e),
			h => this.watcher.Changed += h,
			h => this.watcher.Changed -= h,
			DispatcherScheduler.Current);
		this.obs = o.ObserveOnDispatcher()
			.Select(x => GetContents(f))
			.Subscribe(x => {
				this.mainText.Text = x;
			});

		this.watcher.EnableRaisingEvents = true;
	}

	private string GetContents(FileInfo f)
	{
		using (var st = f.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
		using (var r = new StreamReader(st)) {
			return r.ReadToEnd();
		}
	}
}
```

DispatcherScheduler.Current + ObserveOnDispatcher() メソッドがポイントかしら。
TextExpanderでFlash埋め込み一発コマンド（SWFObjectCDN付）



![スクリーンショット 2014-01-23 21.37.45.png](https://qiita-image-store.s3.amazonaws.com/0/5472/be6eaaaf-964b-c7a6-8f36-48868b832251.png "スクリーンショット 2014-01-23 21.37.45.png")


いつも背景色の指定の仕方を忘れるので、
ショートカットで対応。

※ Flashのバージョンは10.0.0以上、SWFObjectは2.2を読み込んでいます。

TextExpanderCmd -> ;htflash

```html:sample.cmd
<script src="//cdnjs.cloudflare.com/ajax/libs/swfobject/2.2/swfobject.js" type="text/javascript" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
<!--
Cls.setFlash = function () {
    var swfPath = '%filltext:name=SWFパス%',
        flashvars = {},
        params = {bgcolor: "#%filltext:name=背景色:default=ffffff%"},
        attributes = {},
        setId = '%filltext:name=埋め込み先ID%',
        size = {
            width:  '%filltext:name=幅%',
            height: '%filltext:name=高さ%'
        };
    swfobject.embedSWF(swfPath, setId, size.width, size.height, "10.0.0", null, flashvars, params, attributes);
};
-->
</script>

```
windowのイベントリスナをすぐにremoveするとcallbackが起きない

# 何も起きない例

```js
window.addEventListener("hashchange", foo)
location.hash = "a"
window.removeEventListener("hashchange", foo)

window.addEventListener("scroll", foo)
scrollTo(100, 100)
window.removeEventListener("scroll", foo)

function foo(e){
  console.log(e.type)
}
```

＊実際にハッシュもつくし、スクロールもする。

# 対応

removeを以下で行う

- callback内でする
- setTimeoutで遅らせる

```js
function foo(e){
  console.log(e.type)
  window.removeEventListener(e.type, foo)
}
```