OmniAICreator/Qiita-1.07M huggingface dataset:
rails_adminでenum指定したデータをラベルで選択できるようにする


rails_admin便利ですね。とりあえず管理画面…！という時には、重宝しまくり。で、Rails4から使えるモデルのenumなんだけど、これを`<select>`のラベルとして使いたい。ということで、調べてみたらサクッとかけることが判明したのでメモ。

```ruby:app/models/hoge.rb
class Hoge < ActiveRecord::Base

  # enumの設定
  CATEGORIES = { enemy: 1, player: 2 }
  enum category: CATEGORIES
  def category_enum
    CATEGORIES
  end

end
```

これだけ。これでrails_adminからは、こんな感じのHTMLが出力される。

```html
<select>
	<option value=1>enemy
	<option value=2>player
</select>
```

ただし…！

- Rails v4.1
- rails_admin v0.6.5

の組み合わせだと（rails_adminは、2014/10/17時点で最新）、保存時にエラーが出る。

```
ArgumentError in RailsAdmin::MainController#new 
'1' is not a valid state
```

どうやら、enumでStringを指定している影響で、Integerを保存しようとするとValidateエラーが出るというもの。rails_adminに渡すものをハッシュではなく、配列でString渡せば保存は問題なくできるけど、`<select>`のselectedが正常に設定されない。

で、調べていたらrails_adminへのIssueで、解決してくれている人が…

- [Issue](https://github.com/sferik/rails_admin/issues/1993)
- [解決Gist](https://gist.github.com/dmilisic/38fcd407044ace7514df)

これを作っておいておけば、いい感じにkey-valを設定してくれる。素晴らしい。

```ruby:config/initializers/rails_admin_active_record_enum.rb
module ActiveRecord
  module RailsAdminEnum
    def enum(definitions)
      super

      definitions.each do |name, values|
        define_method("#{ name }_enum") { self.class.send(name.to_s.pluralize).to_a }

        define_method("#{ name }=") do |value|
          if value.kind_of?(String) and value.to_i.to_s == value
            super value.to_i
          else
            super value
          end
        end
      end
    end
  end
end

ActiveRecord::Base.send(:extend, ActiveRecord::RailsAdminEnum)
```
空の２次元配列初期化

objのサイズの数の空配列を持った２次元配列を生成する

```rb
Array.new(obj.size).map{[]}
```

# 10/20 追記

@riocampos さんからよりシンプルな書き方を指摘いただきました。
ありがとうございます！

```rb
Array.new(obj.size) { [] }
```
Homebrewをインストールしている状態でYosemiteにアップグレードする場合に注意すること


参考
https://jimlindley.com/blog/yosemite-upgrade-homebrew-tips/


Yosemiteににするとき、Homebrewが入ってる状態だとアップグレードがかなり遅くなるらしいので/usr/local以下をどこかに退避させておくといいらしい。
私は下記の手順でアップグレードしました。

1. ``` sudo mv /usr/local ~/local ```
2. yosemiteへアップグレード
3. アップグレード後 ``` sudo mv ~/local /usr/ ```
JScript 事始め その2

暇だったので、簡単プログラム。

##JSE

```speed.jse
var distance = 20; //Kmの距離を
var min = 30; //分で到着するには?

var hour = min/60; //時間
var speed = distance / hour;

WScript.echo("速度：" + speed  + "km/h");
```

![speed.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/ef08d49c-c95e-0615-00ce-1132ecb17dd6.png)


##WSF

今度は、入力を受けるためにプロンプトを表示させたくなった。
しかし、`jse`では入力プロンプトが表示できないようだ。

そこで、下記のように`wsf`ファイルを作成する。

```prompt.wsf
<job id="hoge">
	<script language="VBScript">
		Function VBInputBox(msg)
			VBInputBox = InputBox(msg)
		End Function
	</script>
	<script language="JScript">
		var name = VBInputBox("あなたの名前は？");
		WScript.Echo("こんにちは " + name + "さん!!");
	</script>
</job>
```

![prompt.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/d0b0c635-2113-d6eb-f874-59488c07211f.png)

![prompt2.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/a528197b-730a-9dab-5e09-9acdb9b29f85.png)

詳細はわからないが、とりあえず動作した。
ffmpegでエンコードした動画をそのまま垂れ流すサーバー

```js
var express = require('express'),
  spawn = require('child_process').spawn,
  app = express();

app.get('/', function(req, res, next) {
    ffmpeg = spawn('ffmpeg', [
      '-i', 'input.mp4',
      '-vf','scale=320:240',
      '-f', 'mp4', '-movflags', 'frag_keyframe+empty_moov', 'pipe:1'
    ]);

  res.set('Content-Type', 'video/mp4');
  ffmpeg.stdout.pipe(res);
});

app.listen(3000);
```

これで http://localhost:3000 にアクセスすると、この.jsファイルの同階層にあるinput.mp4ファイルを320x240にサイズ変更した動画が再生されます。

ポイントはffmpegの出力ファイル名に`pipe:1`を指定すると標準出力にエンコードした結果を書き出すということです。
その出力結果をNode.jsの[Stream#pipe](http://nodejs.jp/nodejs.org_ja/api/stream.html#stream_readable_pipe_destination_options)でそのままHTTPレスポンスとして返しています。


-movflags frag_keyframe+empty_moov についてはよくわかりませんが、mp4形式で出力をパイプするのに必要なオプションです。
poundをPOODLE対応してみた（らoptionが追加されていた話）

# poundをPOODLE対応してみた（らoptionが追加されていた話）

## poundって何よ

L7のソフトウェアロードバランサ。  
http://www.apsis.ch/pound/  
手軽で便利なんだけど、以前あったBEASTの対応とか、POODLEの対応とか、なかなかリリースが来ない。  
githubのリポジトリは以下。  
https://github.com/goochjj/pound/  
  
ぶっちゃけnginx使ったほうが捗ｒ（ｒｙ

## らoptionが追加されていた

DisableSSLv3ってオプションが追加されてた。
https://github.com/goochjj/pound/commit/49df5933fe8ea1e0721c2b2f86f339614d79e95b  
ので、以下の話は旧情報として残しておきます。  

ちなみにTLSFallbackSCSVも対応されてた。
https://github.com/goochjj/pound/commit/3916a93c9628eec2742c5c3b4efd6678c44815e5  

## （旧情報）対応してみた

単にSSLv3切るだけなら、以下のような感じで。

```
diff --git a/config.c b/config.c
index 6ed8e39..7e12665 100755
--- a/config.c
+++ b/config.c
@@ -902,6 +902,8 @@ parse_HTTPS(void)
     POUND_CTX           *pc;
 
     ssl_op_enable = SSL_OP_ALL;
+    /* For against the POODLE, add SSL_OP_NO_SSLv3. */
+    ssl_op_enable |=  SSL_OP_NO_SSLv3;
     ssl_op_disable = SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION | SSL_OP_LEGACY_SERVER_CONNECT;
 
     if((res = (LISTENER *)malloc(sizeof(LISTENER))) == NULL)
@@ -1210,6 +1212,9 @@ parse_HTTPS(void)
                 SSL_CTX_set_tmp_rsa_callback(pc->ctx, RSA_tmp_callback);
                 SSL_CTX_set_tmp_dh_callback(pc->ctx, DH_tmp_callback);
                 SSL_CTX_set_info_callback(pc->ctx, SSLINFO_callback);
+
+                /* For against the POODLE, set SSL_OP_NO_SSLv3. */
+                SSL_CTX_set_options(pc->ctx, SSL_OP_NO_SSLv3);
             }
             return res;
         } else {
```

## （旧情報）ちゃんと動くのん？

```
[root@quox x86_64]# curl -k -3 -I https://localhost/
curl: (35) SSL connect error
[root@quox x86_64]# curl -k -I https://localhost/
HTTP/1.0 302 Found
Location: http://example-domain.com/
Content-Type: text/html
Content-Length: 170
```
特に問題なく動きます。
SSL契約時のメモ（グローバルサイン クイック認証SSL）

# 概要
グローバルサインのクイック認証SSLを契約する際に必要な情報や注意点のメモ

▼グローバルサイン クイック認証SSL
https://jp.globalsign.com/service/ssl/quickssl.html
1年 ¥34,800


# 必要な情報
以下の情報が必要になるので、事前に確認する

```
▼Country Name (2 letter code) [AU]: 国名、通常は'JP'
　→【】

▼State or Province Name (full name) [Some-State]: <---都道府県名を指定
　→【】

▼Location Name(eg,city) []: <---組織の本拠地の市区町村名を指定
　→【】

▼Orgnaization Name(eg,company)[Internet Widgits Pty Ltd]: <---組織名(法人名)を指定
　→【】

▼Orgnaization Unit Name(eg,section)[]: <---部署名を指定（未必須）
　→【】

▼Common Name (eg,YOUR name)[]: <---サーバのホスト名(FQDN)を指定
　→【】
```
※半角英数文字と半角スペース、および 半角記号 !#%&'()*+,-./:;=?@[]^_`{|}~が利用可能です。日本語の文字列（2バイト文字）はご利用いただけません。

　　
**例：アジケ ajike.co.jp の場合**

```
▼Country Name (2 letter code) [AU]: 国名、通常は'JP'
　→【JP】

▼State or Province Name (full name) [Some-State]: <---都道府県名を指定
　→【Tokyo】

▼Location Name(eg,city) []: <---組織の本拠地の市区町村名を指定
　→【Minato-ku】

▼Orgnaization Name(eg,company)[Internet Widgits Pty Ltd]: <---組織名(法人名)を指定
　→【ajike., co ltd.】

▼Orgnaization Unit Name(eg,section)[]: <---部署名を指定（未必須）
　→【】

▼Common Name (eg,YOUR name)[]: <---サーバのホスト名(FQDN)を指定
　→【www.ajike.co.jp】
```

▼参考：
ディスティングイッシュネームとは何ですか。 | SSL・電子証明書ならGMOグローバルサイン
https://jp.globalsign.com/support/faq/74.html


# その他
## 登録した内容はユーザーはわかるのか？
「クイック認証SSL」の場合、Organization、City or Locality、State or Provinceの項目は証明書に反映されない。つまりユーザーはわからない。

表示されるのは、以下の情報。

```
Common Name　例：www.globalsign.co.jp
Organization Unit　例：Domain Control Validated　
Country　例：JP
```

▼参考
https://jp.globalsign.com/support/faq/74.html

## wwwありなしについて
wwwありで申し込みすれば、wwwなしでも使用できるので、基本wwwありで申し込みする。



```
グローバルサインのSSLサーバ証明書は、「www.」で始まるコモンネームでお申し込みをいただいた場合、「www.」が付かないURLへのアクセスにもご利用いただくことができます。

例) : www.example.comでお申し込みいただいた場合、下記のいずれのURLへのアクセスにもご利用いただけます。
https://www.example.com
https://example.com
```

参考
https://jp.globalsign.com/service/ssl/feature/toku.html#2way
Pythonで機械学習を行うための対話環境を構築する

PythonでOctave的な対話環境を構築する際のメモ。
まずは、[Miniconda](http://conda.pydata.org/miniconda.html)をインストールする(Anacondaでも可)。これがあるとインストールが爆発的に楽なので。
インストールを行うと、`conda`という仮想環境を作成できるコマンドが使用できるようになるので、これを利用して対話環境の作成を行う。

```
conda create -n my_env ipython numpy matplotlib scipy scikit-learn cython
```

終わったら、`activate my_env`を行い環境を有効にして、ipythonで対話コンソールをスタートする。これで完了だ。

以下に使いそうな処理の流れを書いておく。

```pycon
import numpy as np
import matplotlib.pyplot as plt

# csvファイルから学習データを読み込み(1行目がヘッダ想定)
D = np.genfromtxt("training_data.csv", delimiter=",", skip_header=1) 

# データをベクトルに切りだし
y = D[:,0] # 0列目のデータを切り出し(ここでは0/1の分類結果が入っているとする)
x1 = D[:,1] # 1列目のデータを切り出し
x2 = D[:,2] # 2列目のデータを切り出し

#vectorを正規化する関数(平均0、標準偏差1にする)
def regz(vector):
    return (vector - np.average(vector)) / np.std(vector)

x1_s = regz(x1)
x2_s = regz(x2)

plt.scatter(x1_s[y==1], x2_s[y==1], c="red") # y==1の分のデータをプロット
plt.scatter(x1_s[y==0], x2_s[y==0], c="blue") # y==0の分のデータをプロット
plt.show()

```
git 管理下のファイルを commit はしたくないけど手元で編集したままにしたい


例えば仮になんですけど Android 開発をしているとして、local.properties を commit してしまってあるかなりアレなプロジェクトがあったとして、sdk.dir が自分の環境と違う、みたいなとき。

とりあえず commit の前後だけ置換すればいいんじゃね的な。
絶対もっといい方法はあるとは思うんですが、とりあえず動くには動く。

## .git/hooks/pre-commit

```sh:pre-commit
#!/bin/sh

ours=自分の環境用のパスとか文字列
theirs=commit されているパスとか文字列
targetfile=対象のファイル

sed -i '' -e "s/${ours}/${theirs}/g" $targetfile
git add $targetfile
```

## .git/hooks/post-commit

```sh:post-commit
#!/bin/sh

ours=自分の環境用のパスとか文字列
theirs=commit されているパスとか文字列
targetfile=対象のファイル

sed -i '' -e "s/${theirs}/${ours}/g" $targetfile
```

## 追記

これで概ね問題なく作業はできるのだけど、rebase 時には conflict 扱いになってしまって困る。

とりあえず rebase 前に

```sh
mv .git/hooks/{post-commit,post-commit.t}
```

終わったら

```sh
mv .git/hooks/{post-commit.t,post-commit}
```

などとして回避。うーん。。。
WebViewでiframeを含むページを表示しようとするとshouldStartLoadWithRequest:が複数回呼ばれる


[webView:shouldStartLoadWithRequest:navigationType:](https://developer.apple.com/library/ios/documentation/Uikit/reference/UIWebViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIWebViewDelegate/webView:shouldStartLoadWithRequest:navigationType:)はWebView内のページ遷移をフックすることができて、戻り値でYESを指定するとそのままリクエストを続行し、NOを指定するとWebViewはそのHTTPリクエストを行わなくなります。
これを利用して、ある特定のドメイン外にアクセスしようとした時はWebViewではなくSafariを開く、という処理を実装していたのですが、このメソッドはページ遷移だけでなく、iframeによる別ページのリクエストでも呼ばれてしまい、ページ内に特定ドメイン外のiframeがあるごとにSafariが開くという問題が発生しました。

## 解決策
```objectivec:Objective-C
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([request.URL.absoluteString isEqualToString:request.mainDocumentURL.absoluteString]) {
        // メインコンテンツの読込時
    }
    // ...
}

[1]
```

```swift:Swift
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    
    if request.URL.absoluteString == request.mainDocumentURL?.absoluteString {
        // メインコンテンツの読込時
    }
    // ...
}
```
このようにmainDocumentURLと今読み込もうとしているURLを比較することでiframeかそれ以外かをチェックすることができます。

## 参考文献
[1] [UIWebViewでiframeを含むコンテンツを表示するとshouldStartLoadWithRequestが複数回呼ばれる](http://i.devris.info/showing-contents-with-iframe-on-uiwebview-causes-multiple-shouldstartloadwithrequest-calling)
Xcode6.1のシミュレータで日本語やキーボードが使えないときの対処法



どうやら現時点でXcode6.1のiOSシミュレータは`[NSLocale preferredLanguages]`を使っても言語設定を無視し、日本語キーボードの切り替えが不可能、その他言語関係が不完全のままのようです。

ありがたい情報を書いている方がいました。
困っている方が多いようなのでリンクをシェアします。
これで乗りきれるかと思います。

参照: "Xcodeのシミュレーターで日本語、英語を簡単に切り替える方法"
http://kojisatoapp.blogspot.jp/2014/04/xcode.html

それ以上にシミュレータ内の設定を開いて言語を切り替えるより楽かもしれません。
BigQuery で COUNT(DISTINCT(X)) を使わない方が良い理由

簡潔に言うと、BigQuery の COUNT(DISCTINCT(X)) は正しい値を返さないことがあるので使わない方が良い。（ちゃんと仕様を理解して使おう）

2015/5/28 追記

「GROUP BY して COUNT()」が面倒だという人は、EXACT_COUNT_DISTINCT(X) を使おう。

[BigQuery では COUNT(DISTINCT(X)) ではなく EXACT_COUNT_DISTINCT(X) を使おう](http://qiita.com/hakobera/items/2043f8d1d60db82c8635)

## BigQuery の DISTINCT の仕様

https://cloud.google.com/bigquery/query-reference?hl=ja#aggfunctions より引用

> Returns the total number of non-NULL values in the scope of the function.
If you use the DISTINCT keyword, the function returns the number of distinct values for the specified field. Note that the returned value for DISTINCT is a statistical approximation and is not guaranteed to be exact.
>
If you require greater accuracy from COUNT(DISTINCT), you can specify a second parameter, n, which gives the threshold below which exact results are guaranteed. By default, n is 1000, but if you give a larger n, you will get exact results for COUNT(DISTINCT) up to that value of n. However, giving larger values of n will reduce scalability of this operator and may substantially increase query execution time or cause the query to fail.

要するに、オプションで指定した精度（デフォルトで1000）以上の数字は概算値が返るということです。よって概算値が欲しいというケース以外で DISTINCT を使うのは正確性という意味で良くないのです。

## 例

実際に publicdata:samples.github_timeline にクエリを流して試してみましょう。

### 精度デフォルト（=1000）

```sql
SELECT COUNT(DISTINCT(repository_owner)) FROM [publicdata:samples.github_timeline]
/* => 225,105 */
```

![スクリーンショット 2014-10-17 17.24.42.png](https://qiita-image-store.s3.amazonaws.com/0/25774/77bb15c3-3a0a-a4b0-6f35-c72f83474102.png)

### 精度 100,000

```sql
SELECT COUNT(DISTINCT(repository_owner), 1000000) FROM [publicdata:samples.github_timeline]
/* => 220,724 */
```

![スクリーンショット 2014-10-17 17.25.37.png](https://qiita-image-store.s3.amazonaws.com/0/25774/ba9fb835-84b5-d70b-b4ef-93236ecfa70e.png)

ここでは数字が100万以下なので、後者が正確な値。
精度を上げていけば正確な値が得られるとはいえ、実際に実行してみるまで桁数なんてわからないし、データが増えていくたびに精度を調整してくなんてやりたくない。

## 回避策

この問題に対するBigQuery的な正解は、GROUP EACH BY と COUNT(*) を組み合わせて使うこと。

https://cloud.google.com/bigquery/query-reference?hl=ja#aggfunctions より引用

> To compute the exact number of distinct values in a scalable fashion, consider using GROUP EACH BY on the relevant field(s) and then applying COUNT(*). This approach is more scalable but might incur a slight up-front performance penalty.

```sql
SELECT COUNT(*)
FROM
(SELECT repository_owner FROM [publicdata:samples.github_timeline]
 WHERE repository_owner IS NOT NULL
 GROUP EACH BY repository_owner)
```

![スクリーンショット 2014-10-17 17.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/25774/ba764fc3-05de-338f-71c8-ee95615ce9ba.png)

集計対象列が NULLABLE な場合、`WHERE X IS NOT NULL` を忘れずに。NULLABLE ではない場合は、WHERE 句は不要です。

## まとめ

BigQuery で DISTINCT したい時は、「GROUP EACH BY して、COUNT を取る」を覚えておきましょう。
mysql query長の上限

```bash:mysql
show variables like 'max_allowed_packet'
```

* 1047552 : 1MB
* 2096128 : 2MB
* 16777216 : 16MB

参考: [SQL文が長すぎてエラー - Webエンジニアの技術メモ ～PHP、SQL、Linuxなど～](http://d.hatena.ne.jp/moroto1122/20100805/1280992251)
rbenvでつまったら。


rubyのverが1.9になってる。。
PJつくるたびに困るので自分用手順書。

1. `$rbenv version`

	-> 1.9であることを確認
* `$rbenv versions`

	-> 2.0が存在する事を確認
* なければ、`$ruby-build --definitions` または `$rbenv install -l`

	-> 欲しいバージョンがあるか確認
* 欲しいバージョンがなければ、`$brew upgrade ruby-build`

	-> それでもうまくいかなかったら[rbenvで管理しているrubyのバージョンを2.0.0-p195にアップデートする手順](http://qiita.com/kawasy/items/5d000afa6571c71c2723)
* rbenvに欲しいバージョンをインストール

	-> `$rbenv install 2.0.0-p195`
* 2.0を適用したいdir下で、`$rbenv local 2.0.0-p195`

	-> もう一度 `$rbenv version` して2.0になってるか確認
* `$rbenv rehash`

	-> `$ ruby -v` で2.0になっていることを確認。
なってなかったら`$source ~/.bash_profile` かターミナル開き直す

## 参考
[rbenvでrubyを最新バージョンにアップデートする](http://ikasama.hatenablog.jp/entry/2013/09/22/002942)
【備忘録：SQLServer】バッチからSQLを実行する

**概要：**
　　バッチからSQLServerにSQLを発行する方法。

**目的：**
　　定期的にSQLを発行する必要が出てきたので、
　　バッチで加工してタスクスケジューラを使用して自動処理すること。
　　土日にパソコン開いてSQLを発行とかエンジニアがする事ではないので、
　　ちょこちょこと用意しました。

　　ただ、目的により実行方法が若干変更する必要があったので、
　　・ストアドを実行する
　　・SQLを記載したTEXTを読み込んで実行する
　　・SQLを直書きして実行する
　　の3パターンで用意しました。

　　共通バッチを用意して、引数さえ受け取れるようにすれば汎用化も可能です。

**ソース：**

```sql
/*************************************************
* ストアドから実行します。
* server			-> インスタンス名
* db				-> データベース名
* StoredProcedure 	-> ストアドプロシージャ名称
* ret				-> ストアドからの返却値
* par1				-> 引数1
* par2				-> 引数2
* ストアドをSQLServerに登録してから実行してください。
*************************************************/
sqlcmd -l 240 -E -S %server% -d %db% -Q "EXIT( DECLARE @ret int; EXEC @ret = %StoredProcedure% '%par1%', '%par2%'; SELECT @ret )"


/*************************************************
* SQLをテキストから読み込んで実行します。
* FullPathFileName	-> SQLを記述したファイルの絶対パス
*************************************************/
sqlcmd -l 240 -E -S %server% -d %db% -i %FullPathFileName%


/*************************************************
* SQLを直打ちで実行します。
* user				-> ログインユーザID
* pass				-> ログインパスワード
*************************************************/
sqlcmd -Q "SELECT * FROM SAMPLE_TABLE" -S %server% -d %db% -U %user% -P %pass%

/* 
　　書くまでもないけど、こうするとSELECT句の結果も手に入る.
　　Select句で引っこ抜いて、データが有った場合に通知する・データを修復する・・・と言った運用出来なくはない。
　　データのバックアップ目的ならBCPコマンドを活用しても良し.
 */
sqlcmd -Q "SELECT * FROM SAMPLE_TABLE" -S %server% -d %db% -U %user% -P %pass% >> hoge.txt

/* 
　　上のSQLだとヘッダーとか最後の行数が邪魔なので、それを除外したVer.
    オプション詳細はそのうち・・・。
 */
sqlcmd -l 240 -E -S %server% -d %db% -i %FullPathFileName% -s, -W -h -1 -o hoge.txt
```
Mac OS X での asciidoctor のインストール方法



brewの場合

## 前提

以下がインストールされている

* ruby 
* brew

## インストール方法

```
$ sudo gem update --system
```

システム全体に入れる場合

```
$ sudo gem install asciidoctor -N
```


## 参考

[Installing Asciidoctor on Mac OS X | Asciidoctor](http://asciidoctor.org/docs/install-asciidoctor-macosx/ "Installing Asciidoctor on Mac OS X | Asciidoctor")
[JavaScript] グローバル変数とグローバルオブジェクトを取得する方法

# JavaScript のグローバル変数とグローバルオブジェクト

![global.jpg](https://qiita-image-store.s3.amazonaws.com/0/16128/78229372-b806-8579-dcc5-755aa1918db8.jpeg)

Webブラウザ上では `window` はグローバル変数だ。
そのプロパティは全てグローバル変数だ。
この `window` というグローバル変数は特別なオブジェクトでグローバルオブジェクトと呼ばれる。

```js
var a = [];
for (var i in window) {
  if (window[i] === window) {
    a.push(i);
  }
}

console.log(a.join(', '));
```

シングルウィンドウの場合の結果。

`self` とか `top` とかも `window` と同じグローバルオブジェクトを指しているね。

```bash:結果(Chrome)
top, window, parent, frames, self 
```

```bash:結果(Firefox)
self, frames, parent, content, window, top
```

```bash:結果(ie9)
frames, parent, self, top, window 
```

```bash:結果(ie11)
frames, parent, self, top, window
```


# Node.js のグローバル変数

Node.js の場合 `global` はグローバル変数だ。
そしてグローバルオブジェクトだ。
そのプロパティは全てグローバル変数だ。

```js
var a = [];
for (var i in global) {
  if (global[i] === global) {
    a.push(i);
  }
}

console.log(a.join(', '));
```

```bash:結果
global, GLOBAL, root
```

ただ、それだけ。

ちなみに `jrunscript` とか `jjs` とか、 Java 系の JavaScript 内では、グローバルオブジェクトはどうやってポイントすればいいのだろうか。

# JavaScript のグローバルオブジェクトを取得する方法は?

そう言えば普通に関数を呼べば `this` はグローバルオブジェクトだったよね。

```js:get-this-test.js
  function getThis1() {
    return this;
  }
  function getThis2() {
    'use strict';
    return this;
  }
  console.log(typeof getThis1(), typeof getThis2());
  // -> object undefined
```

ES5の `'use strict'` を使った Strict モードだと `this` は `undefined` という仕様だ。
ダメだ。

`eval` してみるか。

```js:get-eval-this-test.js
  function getEval1() {
    return eval('this');
  }
  function getEval2() {
    'use strict';
    return eval('this');
  }
  console.log(typeof getEval1(), typeof getEval2());
  // -> object undefined
```

うまく行くわけ無いか。

関数リテラルの `this` はどうだ?

```js:get-func-this-test.js
  function getFunc1() {
    return function(){ return this; }();
  }
  function getFunc2() {
    'use strict';
    return function(){ return this; }();
  }
  console.log(typeof getFunc1(), typeof getFunc2());
  // -> object undefined
```

一緒だね。

じゃあ `new Function` はどうだ?

```js:get-global-test.js
  function getGlobal1() {
    return new Function('return this')();
  }
  function getGlobal2() {
    'use strict';
    return new Function('return this')();
  }
  console.log(typeof getGlobal1(), typeof getGlobal2());
  // -> object object
```

お、できたね。

何回も呼ぶと遅そうなので、繰り返し呼んでも既に取得済みのグローバルオブジェクトを返す様にしよう。

```js:get-global.js
  var g = Function('return this')();
  function getGlobal() { return g; }
  console.log(typeof getGlobal());
  // -> object
```

完成。

と、思ったら [get-global](https://www.npmjs.org/package/get-global) というのが npm にあった。
ほぼ同じだ。
でも、何度も呼ばれる事を考えると、変数は外に出しておく方が良いよね。

おしまい。

P.S.
2014/10/20: グローバル変数とグローバルオブジェクトを混同しない様に記述しなおした。

2018/12/13: `globalThis` というのができたみたい。Chrome 71 以降で。そのうち標準化されるかな。
間違って Git リポジトリを rm -r して色々消える事件が二度とないようにする

人間誰しも消すべきでないリポジトリを誤って `rm -r` してしまうことがある。

```
$ rm -r repo
override r--r--r--  uasi/staff for repo/.git/objects/48/a35a5fffec3890bb52584a98898aa2b02a719a? ^C
```

ヤバいと思って ^C しても後の祭りだ。一番大事な `.git/objects` 以下のファイルはリードオンリーなので辛うじて残るが、 `.git/HEAD` やら `.git/config` やらは消えてしまっている。

こういう悲しい事件は二度と起こらないようにしよう。ミスによる削除を防ぐには、リードオンリーなファイル `.git/!` を作ればよい：

```
$ touch repo/.git/\!
$ chmod a-wx repo/.git/\!
```

"!" はスペースを除く印字可能な文字の中でもっとも小さい ASCII コードを持つ。 `rm` は辞書順でファイルを削除するので、最初に `.git/!` を消そうとする（が、そうでないこともある→コメント参照）。そして：

```
$ rm -r repo
override r--r--r--  uasi/staff for repo/.git/!?
```

![!?](https://qiita-image-store.s3.amazonaws.com/0/735/17df92a5-30ae-fb8b-c686-d71cee5a20b2.png)

“上書き（オーバーライド）”を“確認（コンファーム）”ってくれる・・・。

ここでキャンセルすれば `.git/` の中身はすべて無事に `rm -r` から生き延びる。

なお `rm -rf` されるとあっけなく消えるのでそのつもりで。

---

余談： `git init` 時に `.git/!` を配置するよう、テンプレートディレクトリ `/usr/local/share/git-core/tmeplates` に `!` を入れたが、コピー時にファイルが書き込み可能になってしまってうまくいかなかった。
CoreOS(471.1.0)をPXE bootしてから、ローカルディスクにインストールする方法

Overview
--------

連載も最終回となりました(?)

* [CoreOS(471.1.0)をPXE bootする方法(root=tmpfs版)](http://qiita.com/ma2shita/items/80dbfbc21aa047898d79)
* [CoreOS(471.1.0)をPXE bootする方法(root=/dev/sda1版)]()

集大成として、PXE bootしたあと、ローカルディスクにインストールする方法です

ライブDVDで起動したあと、ローカルへインストールする、そんなイメージです


準備
----

[CoreOSをroot=tmpfsでPXE boot](http://qiita.com/ma2shita/items/80dbfbc21aa047898d79)します

また、インストール先のディスクはRAWな状態でOKです
※あらかじめbtrfsにしておく、といった前作業は不要です。逆にext4とか作られている場合は、どうやら問答無用でスライスを再作成されてしまうようです。ご注意を

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

**on coreos01:**

```console
core@localhost$ SSH_KEY="`tail -1 .ssh/authorized_keys`"
core@localhost$ cat << EOT >> cloud-config.yaml
#cloud-config

ssh_authorized_keys:
  - ${SSH_KEY}

EOT
core@localhost$ sudo coreos-install -d /dev/sda -c ./cloud-config.yaml
...
Success! CoreOS stable 444.4.0 is installed on /dev/sda
```

これで/dev/sdaにスライスが作られ、CoreOSがダウンロードされ、インストールが行われます
ちょっと時間かかります(15分くらい？)

再起動すれば、ローカルディスクにインストールされたCoreOSが起動します

※10/16現在、ダウンロードするCoreOSのバージョンが444.4.0と、ちょっと古い。なんで？
※ssh鍵が入っている`./cloud-config.yaml`を指定しないと、ログインできませんよ ;-P)

**NOTE:**

起動直後のメモリ使用量は107MB！なんだこのOS


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

ma2shita先生の次回作にご期待下さい！！
Xen上でCoreOSを動かす

概要
----

なんか、CoreOSのバージョンがチョロチョロかわって、よくわかりませんが、Xen4.4の上でCoreOSを動かしてみます

もうXenの環境は構築し終わっていて、`rootfstype=tmpfs`なCoreOSを追加のGuestVMとして投入する方法です

作業
----

PXE bootのファイルを取得し、それを使って起動できます

**XenHost:**

```cnosole
$ sudo mkdir /boot/coreos/
$ cd /boot/coreos/
$ sudo wget http://stable.release.core-os.net/amd64-usr/current/coreos_production_pxe.vmlinuz
$ sudo wget http://stable.release.core-os.net/amd64-usr/current/coreos_production_pxe_image.cpio.gz
```

```text:coreos01.cfg
name = 'coreos01'
kernel = '/boot/coreos/coreos_production_pxe.vmlinuz'
ramdisk = '/boot/coreos/coreos_production_pxe_image.cpio.gz'
extra = 'rootfstype=tmpfs sshkey="ssh-rsa AA...N8= foobar@example.jp"'
memory = 512
vcpus = 2
vif = [ 'bridge=xenbr0' ]
```

※rootをtmpfsにしているので、ディスクは入れていません

**ポイント**

PXE bootのノウハウがそのまま使えます

* PXE bootのappend行内のinitrdは、.cfgのramdiskに書きます
* それ以外のappend行のパラメータを、extraに書きます

ほんと、それだけです。cloud-config.yamlもここで指定できます

ここまでくれば、あとはなんとかできるでしょ


起動とかログインとか
-----------------

**XenHost:**

```console
$ sudo xl create coreos01.cfg -c
```

### 余談(IPv6の話) ###

DHCPサーバが立っていないと、IPv6のリンクローカルアドレスのみがCoreOSへアクセスできる、唯一の方法となります

言い方を変えれば、IPv6でならsshログインできます

```console
$ ssh -6 core@fe80::....:123a%xenbr0
```

リンクローカルアドレスへのアクセスは、インターフェイスの指定が必要です
CoreOSのeth0はvif\*を通じてxenbr0に接続されているので、xenbr0を指定します

あとがき
-------

IPv6。。。なんかめんどい
PHPコードをコマンドで自動整形! Condig Standards Fixer と PHP_CodeSniffer


# The PHP Coding Standards Fixer

PSR-1 and PSR-2 の形やオプションでコーディング規約に整形してくれるコマンド

[The PHP Coding Standards Fixer for PSR-1 and PSR-2](http://cs.sensiolabs.org/ "The PHP Coding Standards Fixer for PSR-1 and PSR-2")

## インストール

以下からダウンロードして、chmod。で終わり。
http://get.sensiolabs.org/php-cs-fixer.phar

以下コピペでOK

```
sudo wget http://get.sensiolabs.org/php-cs-fixer.phar -O /usr/local/bin/php-cs-fixer
sudo chmod a+x /usr/local/bin/php-cs-fixer
```

## 使い方

ディレクトリごとか、ファイルの場合

```
php php-cs-fixer.phar fix /path/to/dir
php php-cs-fixer.phar fix /path/to/file
```

規約を指定して実行

```
php php-cs-fixer.phar fix /path/to/project --level=psr0
php php-cs-fixer.phar fix /path/to/project --level=psr1
php php-cs-fixer.phar fix /path/to/project --level=psr2
php php-cs-fixer.phar fix /path/to/project --level=symfony
```

## エディター用プラグイン

* Vim
* Sublime Text
* NetBeans
* PhpStorm


## 参考

* GitHubのレポジトリ [fabpot/PHP-CS-Fixer](https://github.com/fabpot/PHP-CS-Fixer/ "fabpot/PHP-CS-Fixer")
* [PHPソースをコーディング規約に合わせて修正してくれるPHP Coding Standard Fixer - Shin x blog](http://www.1x1.jp/blog/2012/05/php_cs_fixer.html "PHPソースをコーディング規約に合わせて修正してくれるPHP Coding Standard Fixer - Shin x blog")



# 規約違反を発見! PHP_CodeSniffer

PHP_CodeSnifferは、古いです。

## インストールとチェック

```
% pear install PHP_CodeSniffer
```

## 使い方

どんなコーディング規約があるかチェック
```
% phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend
```

ディレクトリ指定して、実行

```
% phpcs /Users/beginner/spaghetti/code/ --standard=PSR2
FILE: /Users/beginer/spaghetti/code/index.php
--------------------------------------------------------------------------------
FOUND 4 ERROR(S) AND 1 WARNING(S) AFFECTING 5 LINE(S)
--------------------------------------------------------------------------------
  1 | WARNING | A file should declare new symbols (classes, functions,
    |         | constants, etc.) and cause no other side effects, or it should
    |         | execute logic with side effects, but should not do both. The
    |         | first symbol is defined on line 11 and the first side effect is
    |         | on line 7.
 16 | ERROR   | Expected 1 space after comma in function call; 5 found
 18 | ERROR   | Expected 1 space after comma in function call; 8 found
 19 | ERROR   | Expected 1 space after comma in function call; 6 found
 20 | ERROR   | Expected 1 space after comma in function call; 5 found
--------------------------------------------------------------------------------
```


# 参考

PSRの規約でコーディングをするために必要な調査 : 実験ぶろぐ（仮）試供品
http://needtec.exblog.jp/19108536
Capistrano3でデプロイしたリモートサーバのRailsアプリをローカルでconsoleする


[Capistrano3でUnicorn+Nginxな環境にRailsをデプロイする:初心者向け](http://qiita.com/zaru/items/9e02706b27094ce36902)で、デプロイ自体はできるものの、デプロイ先で`rails console`したいときってどうすりゃいいんだ…と思ったら、`capistrano-rails-console`という便利なgemがあった。

# 設定

```ruby:Gemfile
# 環境変数管理
gem 'dotenv-rails'

gem 'rb-readline'

group :development, :test do
  # デプロイ周り
  gem 'capistrano', '~> 3.2.1'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano3-unicorn'
  gem 'capistrano-rails-console' # 手元の環境からデプロイ先のconsoleを使う
end
```

これでひと通りのデプロイに必要なgemが揃うはず。

# コンソール起動

```bash:command
$ bundle exec cap staging rails:console
```

これでstagingサーバの`rails console`が起動するはず。手元でリモートサーバのコンソールいじれるので、ステージングサーバの確認とか、テストデータ挿入とか超便利。

## コンソールの起動に失敗する場合

```
`require': cannot load such file -- readline (LoadError)
```

こんな感じのエラーが出ていたら、readlineがないのでGemfileに`rb-readline`があるかどうかを確認する。

```
Looks like your app's ./bin/rails is a stub that was generated by Bundler.

In Rails 4, your app's bin/ directory contains executables that are versioned
like any other source code, rather than stubs that are generated on demand.

Here's how to upgrade:

  bundle config --delete bin    # Turn off Bundler's stub generator
  rake rails:update:bin         # Use the new Rails 4 executables
  git add bin                   # Add bin/ to source control

You may need to remove bin/ from your .gitignore as well.

When you install a gem whose executable you want to use in your app,
generate it and add it to source control:

  bundle binstubs some-gem-name
  git add bin/new-executable
```

こんな感じのエラーが出ていたら

```ruby:config/deploy.rb
set :bundle_binstubs, nil # 追記

# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets}
# ↓に変更（binを抜く）
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets}
```

これでいけるはず。
Cocos2d-xのフォルダを好きな場所に移動して使う

2.2と3.0での話です。

Cocos2d-xはプロジェクトを自動生成すると、フォルダの位置が決まってしまうのが面倒なときがあります。
2.2系はCocos2d-xのフォルダの中にできるし、3.0系はプロジェクトごとに複製されるのでテストしてるだけでディスク容量が圧迫されます。

自動生成したプロジェクトを移動すると、パスがずれて動かなくなるので調整が必要です。
画像は2.2で試した時のものですが、3.0でもだいたい同じだった気がします。

## iPhone

画像のような感じでプロジェクトをテキストから編集しました。
![スクリーンショット 2014-04-25 15.56.06.png](https://qiita-image-store.s3.amazonaws.com/0/22327/db84597b-46a9-2dec-2bfd-3b5709502e12.png)

あとライブラリの追加も必要だったかも? 
いまいち覚えてないですが。
![スクリーンショット 2014-04-25 15.56.54.png](https://qiita-image-store.s3.amazonaws.com/0/22327/633e89a8-4091-e75c-548b-a2655c820fef.png)


## Android

まずはlibcocos2dxのプロジェクトが必要です。
そしてそこへの参照が必要です。
![2014-04-24_19h43_22.png](https://qiita-image-store.s3.amazonaws.com/0/22327/3f16d5aa-8f73-0801-7798-82a66b6272a8.png)

そしてテキストを書き換えましょう。
IDEに頼るとよくわからないエラーになったりしますし。
![2014-04-24_11h28_26.png](https://qiita-image-store.s3.amazonaws.com/0/22327/da233425-0120-6258-29ef-a3edff8ede19.png)
JavaScriptの文字列を全部小文字/大文字化する

```js
var lower = 'ABCabc'.toLowerCase();
var upper = 'ABCabc'.toUpperCase();
```

ただし、String#toLowerCase と String#toUpperCase は**ブラウザーのロケーション設定がトルコだと正しい結果を返さない**ので、代替処理を行う必要がある。

```js
function manualLowercase(s) {
  return s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);});
};
function manualUppercase(s) {
  return s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);});
};

var lower = manualLowercase('ABCabc');
var upper = manualUppercase('ABCabc');
```

代替処理を行うかどうかの判定は下記のコードで行う。

```js
if ('i' !== 'I'.toLowerCase()) {
  // 代替処理を行う
} else {
  // toLowerCase(), toUpperCase()を使う
}
```

じゃあ面倒くさいから全部代替処理をすればいいのか？というとそうでもなくて、
代替処理の方が動作が遅いので可能な限りは通常の`toLowerCase()`, `toUpperCase()`を使うべきなのです。

…というのをAngularJSのコードを読んでて見つけました。こんなの日本に住んでたら絶対わかんないよなー。
svn のマージの注意点

# svn のマージの注意点

svn のマージはわかりづらく、ハマる印象が強いのでメモ。

## 注意点

* マージ内容確認のみ(マージしない)
  svn merge --dry-run -r r100:HEAD svn://example.com/repo/trunk/foo/
* リビジョンの範囲を指定してマージする
  「ブランチを指定するだけでマージ」は、できない。
  ex) svn merge -r r100:HEAD svn://example.com/repo/trunk/foo/
* conflict, tree conflict とは
  * ファイル内の行でconflict が起きると、conflict
  * 新しいファイルができたりすると、tree conflict


## トラブル

## ra_local エラー

* svn merge --dry-run -r r100:HEAD file:///svn/trunk/foo

上記を実行して以下のようなエラーになる。
原因は、それがチェックアウトしたもので、レポジトリじゃないかららしい。

```
URL に対し ra_local セッションを開始できません
```
MarkdownをWord形式(docx)に変換する

考えを整理しながらドキュメントを書くのにMarkdownが便利ですが、資料を印刷して持ってきてとか言われると困ったりします。
そんな時にPandocを使ってdocxなどの形式に変換して印刷すると便利です。(PDFにも出来ますが、フォントサイズなどの微調整も出来るのでdocxにすることが多いです)

# Pandoc
pandocは、Haskell製のドキュメント変換ツールです。
対応している形式などは以下を参照してください。

* [Pandoc - About pandoc](http://johnmacfarlane.net/pandoc/index.html)

## インストール
インストールは以下を参考にしてください。PDFへ変換するには別途依存するライブラリを入れる必要があります。

* http://johnmacfarlane.net/pandoc/installing.html

MacとWindows向けにはインストーラが提供されているので、それを使ってインストールすると楽です。

* [Releases · jgm/pandoc](https://github.com/jgm/pandoc/releases)

## 利用方法

* [Pandoc - Pandoc User’s Guide](http://johnmacfarlane.net/pandoc/README.html)
* [Pandoc - Demos](http://johnmacfarlane.net/pandoc/demos.html)
* [Pandoc ユーザーズガイド 日本語版 - Japanese Pandoc User's Association](http://sky-y.github.io/site-pandoc-jp/users-guide/)

以下の`sample.md`をWord形式に変換してみます。

```sample.md
A First Level Header
====================

A Second Level Header
---------------------

Now is the time for all good men to come to
the aid of their country. This is just a
regular paragraph.

The quick brown fox jumped over the lazy
dog's back.

### Header 3

> This is a blockquote.
> 
> This is the second paragraph in the blockquote.
>
> ## This is an H2 in a blockquote


Some of these words *are emphasized*.
Some of these words _are emphasized also_.

Use two asterisks for **strong emphasis**.
Or, if you prefer, __use two underscores instead__.


*   Candy.
*   Gum.
*   Booze.

1.  Red
2.  Green
3.  Blue

*   A list item.

    With multiple paragraphs.

*   Another item in the list.

This is an [example link](http://example.com/).

```ruby
 def hello
  puts "Hello, world!"
end
\```

---

```

自分の環境がWindowsなので、PowerShellから以下のように実行すると

```
PS C:\Users\tenten0213\Desktop> pandoc .\sample.md -t docx -o sample.docx
```

以下のようなWordファイルが作成されます。

![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/03e273d3-0d8f-8569-5d87-684193907c80.jpeg)

便利。
Priority Queue(Chapter 6)

Priority queue has, as name suggests, proproty in queue. [Japanese](http://qiita.com/cmtkc/items/a8991881008b210f4960)
Usage:
	- [job scheduling]() in an operating system
  	- printer queues
  	- [event-driven stimulation algorithms]()
##Object
``` ∀ x ∈ S ∃ priority s.t x.priority exits```
Priority Queue is FIFO(first in first out), thus it is more applicable.
##Operation
* Insert(S,x)
	* add x in S
	* returns void
* Max(S)
	* returns x.priority
* Extract_max(S)
	* returns x.priority
	* removes x.priority from S
* Increment_priority(S, x, k)
	* assign x.priority = k

##List
1. Unsorted List: 
2. Sorted List: 
3. Special List: maximum value of x.priority is really low
4. Heap: Binary heap

##Complexity 

 | Insert | Max| Extract_Max(Just removing）|Increment_priority
------------ | -------------| -------------|-------------|-------------
Unsorted List | O(1)|O(n)|O(1)|O(1)
Sorted List | O(n)|O(1)|O(1)|O(n)
Special List| O(1)|O(k)|O(1)|O(n)
Heap | O(log(n))|O(1)|O(log(n))|O(log(n))

##Reference 
Mostly looked up on Introduction to Algorithm by Cormen, etc.
Unscopedなmodelに対してcarrierwaveを使う方法

解決方法を見つけるまでに８時間位かかったので、ここで共有します。

#問題

unscopedなモデルに対してcarrierwaveを使ってデータをアップロードしようとすると、こんなエラーが出ます。

````
Couldn't find [class name] with id= ...(省略)
````

#解決方法

`find_previous_model_for_#{column}`をoverrideします。
今回の例では`Job`クラスに`file`をアップロードしています。

````app/models/job.rb
  mount_uploader :file, :FileUploader

  default_scope { where(opened: true).order(:id.desc) }

  def find_previous_model_for_file
    self.class.unscoped.find(to_key.first)
  end
````

carrerwaveは`find_previous_model_for_#{column}`で`self.class.find(to_key.first)`を呼んでいますが、そこを`self.class.unscoped.find(to_key.first)`にoverrideします。

以上です。
クラスではなく、carrierwaveをoverriedeする方法が分かる方がいらっしゃったら、教えて頂けると嬉しいです。

#参考
https://github.com/carrierwaveuploader/carrierwave/issues/696
.ssh/known_hosts から22以外のポート番号のホスト情報を消す方法

ポートが22の場合は[この方法](http://qiita.com/satococoa/items/296645852ccf993cc796
)で消せる。

```
ssh-keygen -R host
```

22以外の場合は以下を実行する。

```
ssh-keygen -R [host]:port
```
Entity Frameworkのモデルファーストのちょいテク

昨日、早く言えよ、と言われたちょいテク。

##その１
Entity Frameworkのモデルファーストは、クラス自体がデータベースのテーブルになります。
テーブルには必ず共通した、Date情報をいれたいと思います。こういう時は、クラスの継承を使うといいです。


```csharp:filename

    public class BaseModel
    {
        public DateTime Reg_Date { get; set; }
        public DateTime Upd_Date { get; set; }
        public bool IsActive { get; set; }
        public string Tag { get; set; }
        public void SetDate()
        {
            this.Reg_Date = DateTime.Now;
            this.Upd_Date = DateTime.Now;
            this.IsActive = true;
        }
    }
```
こんな感じのクラスを作って


```csharp:filename

    public class User:BaseModel
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
    }
```

こんな感じに継承を使う。そうすると、継承元のプロパティもテーブルに加わります。
多くのテーブルを作るとき、効果を発揮します。
一つ一つコピペするのも面倒ですしね。（継承自体がコピペをしないようにする技術だｗ）
新規の列追加の時も、new した後、SetDate()をすれば、面倒な初期値入力から開放されます。楽ちん。

##その２

MVCでの開発の場合、データの処理は、Mのモデルに全部やらせるのが正しいはずです。
問い合わせ方があちこちに散らばるのはよくありません。
しかし、テーブル自体を直接拡張することはできません。
そうなので、こういう拡張メソッドを作るといいかんじです。


```csharp:filename
    public static class UserExtend
    {
        public static IEnumerable<User> GetByUserName(this DbSet<User> list,string userName)
        {
            return list.Where(n => n.UserName == userName);
        }
    }
```

メソッドチェーンを辿っていくだけで欲しいものが取れるようになります。
テーブルの定義したクラスと同じ所に書いておくと便利でしょう。
使うときは、必ずUsingの設定を忘れないようにしましょう。
NSUserDefaultsに保存した内容がアプリを再インストールしても消えない


iOS8のシミュレーターを使っているとアプリをアンインストールしてもNSUserDefaultsに保存してあった情報が削除されません。

実機では正常に削除されます。

シミュレーターからNSUserDefaultsをクリアするには以下の場所にあるファイルを削除します。

```
~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist
```

参考URL:http://stackoverflow.com/questions/24985825/nsuserdefaults-not-cleared-after-app-uninstall-on-simulator
Rubyで書かれたSnowFlakeライクなID生成器 `ChiliFlake`

概要
---

ちょっとサービスを開発しているのですが、ID生成器について調べていたところ、[こちらの資料](http://www.slideshare.net/moaikids/20130901-snowflake)に触発されて、SnowFlakeをRuby実装してみました

* [github ma2shita/chiliflake](https://github.com/ma2shita/chiliflake)
* [github ma2shita/chiliflake-server](https://github.com/ma2shita/chiliflake-server)

chiliflake-serverは、ChiliFlakeで生成したIDをTCP経由またはUNIX Domain Socket経由で取得できるサーバです

Rubyの他には何も要りません。たぶんJRubyでも動くでしょう。ただし、daemon化とか考えてませんので、foremanとかで動かしてください

UNIX Domain SocketとTCP socketのパフォーマンスの違いは、[TCP localhostとUnix Domain Socketはどちらが速いのか？ - Qiita](http://qiita.com/ma2shita/items/154ad8f55d75051234c6)をご覧ください
Unix Domain Socketの方が性能いいです

名前の由来は、なんとなくお察しください

参考資料
--------

* [Twitterのsnowflakeについて - slideshare](http://www.slideshare.net/moaikids/20130901-snowflake)
* [github twitter/snowflake](https://github.com/twitter/snowflake)

あとがき
-------

こんなことに時間を使っていて、いいのだろうか
同じ脚注や文末脚注を繰り返し参照する

参照先の位置をクリック
[挿入] メニューの [参照] をポイントし、[相互参照] をクリック
[参照する項目] ボックスの [脚注] または [文末脚注] をクリック
[脚注の参照先] ボックスまたは [文末脚注の参照先] ボックスで、参照する脚注または文末脚注をクリック
[相互参照の文字列] ボックスの [脚注番号] または [文末脚注番号] をクリック
[挿入] をクリック
ブラウザに情報を出さずにデバッグする方法

# メール送信

```bash:メール送信
mail('tukiyo3@gmail.com', 'subject', $message);
```

```bash:メール送信2
mail('tukiyo3@gmail.com'
    ,"debug:".__LINE__.":".__FILE__
    ,$message);
```

# phpのerror.logに出力

* メール設定がされていない場合、こっちを使う。

## error_log

```bash:phpのerror.logに出力(シンプル)
error_log($messages);
```

## trigger_error

* エラーレベルを定義したい場合こっち。

```bash:phpのerror.logに出力(Noticeレベル)
trigger_error($messages);
```

* Noticeが握りつぶされた場合はこれ

```bash:phpのerror.logに出力(Fatal&nbsp;error)
trigger_error($messages, E_USER_ERROR);
```
mysqldumpリカバリの進捗を表示する

mysqldumpリカバリの進捗を表示する
===

リカバリはいつ終わるの？
---
バックアップ取得の一方式としてメジャーなmysqldump。
巨大なデータを取り扱う場合はダンプをするにもリカバリするにも時間がかかります。
数十分の事もあれば数日かかることも。

あとどれくらい時間がかかるのか分からないので、作業進捗を把握できずに困ってしまいます。
特にリカバリはトラブル時の対応に使うことも多いので、把握できるかどうかで復旧までの見通しが全然違います。

リカバリの進捗を表示する方法
---
pvコマンドを使います。
パイプでpvを挟み込みます。

```
# インストール
yum -y install pv

# ダンプの取り込み
pv your_data.dump | mysql -h dbserver -u user db_name
56.6GB 1:07:32 [14.3MB/s] [===============================================>] 100%
```

pvコマンド？
---
pvコマンドはPipe Viewerの略で、その名の通りLinuxのパイプで通り過ぎていくデータの容量をモニタしてプログレスバーに表示してくれるというものです。

今回はmysqlのダンプデータについて紹介しましたが、mysqlに閉じた物ではないので、下記のような大きなデータを取り扱うような場合はなにかと便利です。

```
# mysqldumpも可能。ただし出力されるファイルの予測を自分で-sオプションで指定する。
mysqldump -u user dbserver | pv -s 9999M > your_data.dump

# gzipなどの解凍・圧縮にも利用可能
pv your_data.dump | gzip > your_data.dump.gz
```
CoreOS(471.1.0)をPXE bootする方法(root=/dev/sda1版)

Overview
--------

[CoreOS(471.1.0)をPXE bootする方法 (root=tmpfs版)](http://qiita.com/ma2shita/items/80dbfbc21aa047898d79)の続編

PXE bootしつつ、ローカルディスクをrootにする方法。これにより、dockerが使えるようになります


Setup VirtualBox VM on VBox PC (e.g. Mac OS X)
----------------------------------------------

[前回](http://qiita.com/ma2shita/items/80dbfbc21aa047898d79)作ったVBoxのVM(coreos01)に、80GBのHDDを追加します

```console
$ VBoxManage storagectl coreos01 --name SATA1 --add sata --controller IntelAHCI --portcount 4 --bootable on
$ VBoxManage createhd --filename ~/VirtualBox\ VMs/coreos01/disk1.vdi --sizebyte 85899345920 --variant Standard
$ VBoxManage storageattach coreos01 --storagectl SATA1 --port 1 --medium ~/VirtualBox\ VMs/coreos01/disk1.vdi --type hdd
```

※createhd/storageattachのファイルパスは各々の環境に合わせてください


Setup on CoreOS
---------------

結局のところ、`/dev/sda1`がbtrfsとして作られていて、append行に`root=/dev/sda1と`指定されていれば、CoreOSはそのスライスをrootとして使います。

ここでは、[前回のPXE boot(root=tmpfs版)](http://qiita.com/ma2shita/items/80dbfbc21aa047898d79)の続きとして、
1. coreos01上で/dev/sda1をbtrfsとして作成
2. PXE server上の`pxelinux.cfg/default`の変更
を行います

**on coreos01:**

```console
core@localhost$ cfdisk -z /dev/sda
core@localhost$ touch "/usr.squashfs (deleted)"
core@localhost$ mkfs.btrfs -L ROOTFS /dev/sda1
```

※この謎のtouch。公式ドキュメントに書いてありました。やらなかったらどうなるんだろう？

**on PXE server:**

```diff
diff -u pxelinux.cfg/default.orig pxelinux.cfg/default
--- pxelinux.cfg/default.orig	2014-10-16 18:47:27.254145299 +0900
+++ pxelinux.cfg/default	2014-10-16 18:48:01.702143957 +0900
@@ -9,5 +9,5 @@
 label coreos
   menu default
   kernel coreos_production_pxe.vmlinuz
-  append initrd=coreos_production_pxe_image.cpio.gz rootfstype=tmpfs sshkey="SSH-KEY"
+  append initrd=coreos_production_pxe_image.cpio.gz root=LABEL=ROOTFS sshkey="SSH-KEY"
```

※`root=`には`/dev/sda1`形式の他、`LABEL=label`形式も使えます

これでcoreos01を再起動すれば、rootが/dev/sda1になった状態で起動し、dockerも使えるようになります

**on coreos01: (rebooted)**

```console
core@localhost$ docker pull busybox
core@localhost$ docker run busybox ls -lF /bin/echo
lrwxrwxrwx    1 root     root             7 May 22 23:22 /bin/echo -> busybox*
```

参考資料
-------

* [Booting with PXE](https://coreos.com/docs/running-coreos/bare-metal/booting-with-pxe/#installation)


あとがき
-------

この身体にも、ようやっと慣れたぞ
ggplot2でプロットのマージンを変える

####概要
`plot.margin`で指定するのですが、上下左右の４つの値が必要となります。
[公式のマニュアル](http://docs.ggplot2.org/current/theme.html)だと、`legend.margin`の例しか出てないので勘違いしていました。

####例

```r
g + theme(plot.margin= unit(c(1, 1, -1, 1), "lines"))
```

#### 参考

- [r - reduce space between grid.arrange plots - Stack Overflow](http://stackoverflow.com/questions/13299496/reduce-space-between-grid-arrange-plots)
gemの移行でさっと使えるコマンドまとめ

# gemの移行
rubyのバージョン変更はrbenvで簡単に行えるのにgemもバージョン間でコピーだの何だのを簡単にできるようにrbenvでサポートしてくれたらいいのに。
とまあgemは日用品として使う程度だが、その日用品のお手入れに必要なコマンドを並べておいた。

(以下gems_bkというファイルにgemの一覧を記録することにする)

## エクスポート

```shell-session
gem list awk | '{print $1}' > gems_bk
```

## インポート

```shell-session
gem install $(paste -s gems_bk)
```

## 全てアンインストール

```shell-session
for i in `gem list --no-versions`; do gem uninstall -aIx $i; done
```

## 例えば
gemをエクスポートして全てアンインストールしてrbenvでバージョン切り替えてgemをインポートすればすっきりお引越しできる

## 〆
rubyは精通しているわけではないので突っ込みどころや、もともと適当なものが転がっているとかあったら教えてください。
Jenkinsでジョブを予約実行する

[Jenkinsでジョブを遅れて実行させる - Qiita](http://qiita.com/mechamogera/items/2c2c41d230d393ceeccf)
の応用でジョブを予約実行できそうだったのでやってみたら出来る感じだったのでメモしておく。

# 実行手順

以下のようなスクリプトで実行する(ビルドパラメータありの場合の例)。
Rubyを使っているが実行させたい時刻と現在時刻の差分(秒数)が計算できてJenkinsのジョブをリモート実行できれば何でも良い。

* Gemfile

```rb
# A sample Gemfile                                                                                  
source "https://rubygems.org"

gem 'rest-client'
gem 'http_proxy_from_env' # http proxy環境下でないなら不要
```

* スクリプト本体

```rb
require 'http_proxy_from_env'  # http proxy環境下でないなら不要
require 'rest-client'
require 'time'

target = Time.parse("2014/11/16 12:00") # 実行させたい時刻
# to_iしてるので小数点以下切り捨てで最大1秒ほど誤差が出ると思われる。
sec = (target - Time.now).to_i # 実行させたい時刻と現在時刻の差分計算(秒数)

# JenkinsのリモートAPIでジョブ実行
RestClinet.get("[Jenkins URL]/job/[Job Name]/buildWithParameters?delay=#{sec}sec&[Parameters]")
```

# ジョブのビルドパラメータありなしの挙動の違い

実際に確認した範囲なので間違ってる可能性あり。
とにかくジョブを予約実行するときは不要でもビルドパラメータ付けた方が良さそう。

ちなみに設定の「ビルドを並行実行」は挙動に影響しないようである。

## ジョブのビルドパラメータあり

 * ジョブにビルドパラメータが設定できるようになっていくと実行した結果はどんどんキューにためられていく。
 * ただし、同じ実行予定時刻で同じパラメータの場合はキューは追加されない。
 * キューがたまっている状態でブラウザから直接ジョブを実行してもキューは残る。

## ジョブのビルドパラメータなし

 * ジョブにビルドパラメータがない場合はいくらリクエストしても1つのキューしかたまらない。
 * キューがある状態でさらに後のジョブを予約するとキューが後の時刻で実行するように更新される。
 * ブラウザから直接ビルドするとたまっていたキューは無くなる。

# 精度

確認した範囲だと予約したジョブの実行は数秒早かったり遅かったりすることがある(確認した中では3秒遅い場合があった)。
実行回数が少ないので実際にどの程度ズレるのか正確なところはわからないが、指定したちょうどその時に実行されることは期待しない方が良さそう。
各コンテンツページごとにOGタグを設定する方法


下記のOpen Graph meta tags moduleを使って対応できます。

### 1.meta tagsモジュールをインストール
下記ページから、モジュールをインストールします。
(インストール方法はこちら→ http://qiita.com/s_s_k/items/4ae744d8173b8f278626)

Graph meta tagsモジュール
https://www.drupal.org/project/opengraph_meta


### 2.モジュールを有効化する。
admin/moduleページで有効化します。

### 3.環境設定で、コンテンツタイプにひもづける。
open graph metaモジュールの環境設定のチェックボックスで、Opengraphを使用するコンテンツタイプにチェックを入れます。

これで各ページ作成画面の一番下に、「Open Graph Meta tags」というボタンが表示されます。
クリックして、各種入力項目を埋める事ができます。
HomebrewでインストールしたOSXFUSE入りのMacをYosemiteにアップデートしたらやること


``` bash
$ sudo /bin/cp -RfX /usr/local/Cellar/osxfuse/2.7.1/Library/Filesystems/osxfusefs.fs /Library/Filesystems #2.7.1の部分は実際インストールされているバージョンに合わせる
$ sudo chmod +s /Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs
$ sudo nvram boot-args="kext-dev-mode=1"
```
3つを順に実行して、再起動（上の2つは`brew install osxfuse`したときに実行したもの）

https://github.com/osxfuse/osxfuse/issues/150
ここを参考にしました
Swiftで関数を配列にまとめる

##関数を配列に
UITalbeViewを使用してサンプルを作成しました。
要はメソッドを定義して、それを配列にまとめるやり方です。
####処理の流れ
* TableViewの各セルに個別の関数を用意する
* メソッドをまとめた配列を設定する
* セル選択時に配列から関数を実行させる

画面はこんな感じ。
![スクリーンショット 2014-10-17 12.29.14.png](https://qiita-image-store.s3.amazonaws.com/0/31253/239c0a12-dc22-3a0a-87a5-64a1c303fb00.png)

####サンプルソース

```swift:TableViewActionController.swift
import UIKit

class TableViewActionController : UITableViewController {
    
    var actionMap: [[Void -> Void]] {
        return [
            // Section1
            [
                self.cell1_1,
                self.cell1_2,
                self.cell1_3
            ],
            // Section2
            [
                self.cell2_1,
                self.cell2_2
            ]
        ]
    }
    
    func cell1_1() {
        println("cell1_1");
    }
    
    func cell1_2() {
        println("cell1_2");
    }
    
    func cell1_3() {
        println("cell1_3");
    }
    
    func cell2_1() {
        println("cell2_1");
    }
    
    func cell2_2() {
        println("cell2_2");
    }
    
    // MARK: UITableViewDelegate
    
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let action = actionMap[indexPath.section][indexPath.row]
        action()
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }
}
```

普通ならdidSelectRowAtIndexPathでif文を使って、セクションと行を判断して...ってやるんだけど、とても簡潔に記述できました。
prepareForSegueとかにも応用できそうです。
各コンテンツページごとにmetaタグを設定する方法


細かく設定したいときは、下記のMetatag moduleを使って対応できます。


### 1.Metatagsモジュールをインストール

下記ページから、モジュールをインストールします。
(インストール方法はこちら→ http://qiita.com/s_s_k/items/4ae744d8173b8f278626)

Metatagsモジュール
https://www.drupal.org/project/metatag


### 2.モジュールを有効化する。
admin/moduleページで有効化します。

### 3.コンテンツにmetaタグを追記する。
各コンテンツ作成ページの下段にMetaタグ入力項目が追加されています。
デフォルトのままでも


* title
* description
* keywords


が設定できます。
Advance設定もあります。metatagの環境設定でさらに調整することもできます。
RailsでcarrierwaveのI18n設定をする

Railsでcarrierwaveを使う場合、Gemを入れただけの状態だとエラーが発生した際に、こんな表示になってしまう。

```
Photos imagetranslation missing: ja.errors.messages.extension_white_list_errorとPhotos imageを入力してください。
```

これはI18n設定が足りないためで、[README](https://github.com/carrierwaveuploader/carrierwave#i18n)に書いてあるとおり<del>以下を翻訳ファイルに追加する必要がある。</del>

```
errors:
  messages:
    carrierwave_processing_error: "Cannot resize image."
    carrierwave_integrity_error: "Not an image."
    carrierwave_download_error: "Couldn't download image."
    extension_white_list_error: "You are not allowed to upload %{extension} files, allowed types: %{allowed_types}"
    extension_black_list_error: "You are not allowed to upload %{extension} files, prohibited types: %{prohibited_types}"
```

追記: 言語毎の設定ファイルが[ここ](https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/locale/)にありました。
gulpfileをwatch

「[Gruntfile更新したらgruntコマンドをリスタート](http://qiita.com/akymrk/items/6fc07b7a8b8a2d67dfdd)」のgulp版

##やりたいこと

`.coffee`とか`.scss`とか`.jade`とか`gulp watch`するみたいに、`gulpfile`もwatchして、修正したら今実行中のgulpタスクを再実行したい

##やりかた

`nodemon`つかう

- [nodemon](http://nodemon.io/)つかう
- ないなら`npm i -g nodemon`しとく

```
nodemon "$(which gulp)" --watch gulpfile.coffee
````

## package.jsonもwatchしておきたい

今のとこ使ってないが、` --watch package.json`をさらに追加すればOK

```
 nodemon "$(which gulp)" --watch gulpfile.coffee --watch package.json
```
LXCのCentOS7でLAMP環境を作る

# パッケージのインストール

```bash:
yum install httpd php php-mysqlnd mariadb-server
```

## httpd, php

```bash:
mkdir -p /var/log/httpd/
mkdir -p /var/www/html/
echo "<?php echo 'hoge'; ?>" > /var/www/html/index.php

apachectl -S
systemctl start httpd
```

```bash:
systemctl enable httpd
```

## mariadb

```diff:/etc/my.cnf.d/server.cnf
  [mysqld]
+ character-set-server = utf8
```

```bash:
systemctl start mariadb
systemctl enable mariadb
mysql -uroot
```

```bash:
MariaDB [(none)]> status
...
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
...
```
Pythonで文字列の日付操作


Pythonで、文字列で日付などを受け取って処理したいことがよくあるのですが、毎回ググっているので自分用にまとめておきます。
私の場合は、文字列→datetime→文字列とすることで処理しています。

#前提
日付を文字列で受け取ります。
例えば以下の様な場合があると思います。

1. 2014-10-16
2. 2014/10/16 20:29:39

これらの１日後が欲しい、とかいう場合にどうするかという話です。

#文字列→datetime
まず文字列をparseします。

```python
import datetime

#1の場合
date1 = '2014-10-16'
d = datetime.datetime.strptime(date1, '%Y-%m-%d')

#2の場合
date2 = '2014/10/16 20:29:39'
d = datetime.datetime.strptime(date2, '%Y/%m/%d %H:%M:%S')
```

こうすることで`datetime`に変換できます。
上記の`%Y-%m-%d`を変えることで他のフォーマットでも対応できます。

#datetimeの処理
`timedelta`を使って`datetime`を計算します。
今は１日後が欲しいので、

```python
d += datetime.timedelta(days = 1)
```

のようにすると１日後が得られます。
足さずに引けば１日前ですし、`days`を`hours`に変えたら日付ではなく時間が操作できます。

#datetime→文字列
最後に`datetime`を文字列に戻します。

```python
date_stringj = d.strftime('%Y-%m-%d')
```

こうすると指定したフォーマットで文字列にしてくれます。

#まとめ
これらをまとめて、文字列で日付を受け取って１日加算するプログラムが以下です。

```python:add_1day.py
#!/usr/bin/python
import datetime

date_string_input = '2014-10-31'
date_format = '%Y-%m-%d'

#文字列→datetime
d = datetime.datetime.strptime(date_string_input, date_format)
#datetimeの処理
d += datetime.timedelta(days = 1)
#datetime→文字列
date_string_output = d.strftime(date_format)

print date_string_output
```

実行すると以下のようになります。

```console
$ python time.py
2014-11-01
```