OmniAICreator/Qiita-1.07M huggingface dataset:
[KnockoutJs]ネストしたforeachで子配列をko.observableする



# **概要**

KnockoutJsで、ネストしたforeachをつくることがあった。普通に作っただけだと、親配列しかバインドされないので、その子配列もふくめてko.observableする方法のメモ。


# **親配列の構造**

以下の様な構造。このままだと、todoのオブジェクト自体はバインドされるが、todo.idなどはバインドされず、変更があっても検知されない。

```js

function UserConf(user) {
    var self = this;
    self.id = ko.observable(user.id);
    self.name = ko.observable(user.name);
    self.todo = ko.observableArray(user.todo);
};

function UserViewModel() {
    var self = this;

    var userData = [
        { id: 1, name: "Tarou", todo: [{ id: 1, content: "aaa" }, { id: 2, content: "bbb" }, { id: 3, content: "ccc" }] },
        { id: 2, name: "Jirou", todo: [{ id: 4, content: "ddd" }, { id: 5, content: "eee" }, { id: 6, content: "fff" }] },
        { id: 3, name: "Shirou", todo: [{ id: 7, content: "ggg" }, { id: 8, content: "hhh" }, { id: 9, content: "iii" }] }
    ];

    var mappedUser = $.map(userData, function(item, i) {
        return new UserConf(item)
    });
    
    self.users = ko.observableArray(mappedUser);
};

ko.applyBindings(new UserViewModel());

```

# **子配列をobservableにする**

以下では、``new TodoConf();``で、todoの中身もobservableにしている。これにて、子配列もバインドされた（→[デモ@jsfiddle](http://jsfiddle.net/okmttdhr/ezcjwrzy/28/)）。

```js

function UserConf(user) {
    var self = this;
    self.id = ko.observable(user.id);
    self.name = ko.observable(user.name);

    // 付け足し
    user.todo = $.map(user.todo, function (item, i) {
        return new TodoConf(item);
    });

    self.todo = ko.observableArray(user.todo);
};

// 付け足し
function TodoConf(todo) {
    var self = this;
    self.id = ko.observable(todo.id);
    self.content = ko.observable(todo.content);
}

function UserViewModel() {
    // そのまま
};

ko.applyBindings(new UserViewModel());
```

# **とおもったら。。**

Mappingプラグインを使えば簡単に配列をバインドできるよう。次から使おう。

* [Knockout.js の Mapping プラグインを使ったら凄く捗った件](http://blog.shibayan.jp/entry/20140613/1402648677)



# **参考**

* [jsfiddleで見つけたデモ](http://jsfiddle.net/rniemeyer/bZhCk/)
* [公式ドキュメント](http://knockoutjs.com/examples/collections.html)
GMOクラウドパブリックで、サーバーが再起動しなくなった場合にすること

　GMOクラウドパブリックで、CentOSサーバーを再起動したら、起動してすぐに終了するようになってしまった。このような場合、以下の手順で回復するかもしれない。

1. リカバリー再起動して、リカバリーモードでログインする。
2. サーバー環境のドライブをマウントする。
3. /mnt/マウントしたドライブ/boot/grub/grub.confをエディタで開く
4. default=0の行をdefault=1に変更する。
5. サーバーを再起動する。

サポート曰く「カーネルを更新した場合などに、この手順が必要になる場合があるとのこと」カーネルを更新した記憶は無いんだけど･･･。


default=0に戻して良いのかは、現状未確認です。
「How to add subtitles and translations to WordPress.tv」の日本語訳

# 情報元
Title : How to add subtitles and translations to WordPress.tv
URL(WordPress.tv) : http://wordpress.tv/2014/08/08/how-to-add-subtitles-and-translations-to-wordpress-tv-videos/

# Amara
URL(Amara) : http://www.amara.org/ja/videos/Ml8n34KGHpo4/info/

# 日本語訳
```
(WordPress.tvに字幕と翻訳を加える） 

まず始めに、WordPress.tvの、字幕を付けたい動画のページを開きます。

次に、「Low」か「Med」かいずれかのダウンロードリンクを

右クリックして、リンク先のアドレスをクリップボードにコピーします。

その後、Amara.orgを開いて、「Add a Video」の下のテキストボックスに

先ほどWordPress.tvからコピーしたURLをペーストします。

これにより、Amaraにその動画の為の新しいページが作成されますので、

スクロールダウンしていくと「add a new language」というリンクがあります。

ポップアップダイアローグボックスより、動画の中で使用されている言語を選択します。

この場合は「英語」を選択します。

そして、これからあなたが記述する字幕の言語も選択します。

その後「Continue」ボタンをクリックして、字幕エディターを起動します。

動画の再生をスタートした後、聞いた内容をもとに字幕を付けて行くことができます。

そして後から字幕を修正したり、タイミングを調整できます。

Amaraは字幕を簡単に付けるためのたくさんのツールを提供しています。

例えば、作業の途中で保存することができるので、次回はその続きから再開することが可能です。

適当なタイミングで、完成した字幕を保存してください。

すると、動画の情報ページに戻ります。

次に、作成した字幕をダウンロードします。「language」をクリックし、

ダウンロードのドロップダウンを選択し、「DFXP」オプションを選択し、ダウンロードを開始します。

WordPress.tvに字幕ファイルをアップロードする前に、

一旦あなたのコンピューターに保存する必要があります。

そして、拡張子を「dfxp」から「ttml」に変更する必要があります。

そしてその後、WordPress.tvの該当する動画のページに戻り、「Subtitle this video」のリンクをクリックします。

そして次のページで、WordPress.orgのユーザー名、

そしてあなたのWordPress.tvにひもづけられたアカウントメールアドレスを入力します。

次に、あなたが作成した字幕の言語を選択します。

そしてファイル選択画面より、先ほど作成した「.ttml」ファイルを選択します。

以上で、あなたの翻訳、もしくは字幕ファイルがWordPress.tvに投稿され、ビデオに追加されます。
```
LTSV のログを jq でフィルタする

アクセスログ等を [LTSV](http://ltsv.org/) で保存している方は多いことでしょう。
LTSV は行指向データフォーマットなので、grep 等の UNIX ツールでのフィルタリングも簡単にできる上、拡張性にも優れていて便利です。

そして、grep のような単純なツールではできない、より複雑なフィルタリングを行いたいときは [jq](http://stedolan.github.io/jq/) が便利です。
LTSV も JSON に変換してしえば jq によるフィルタリングが可能になります。

# 方法 1: ltsview を使う

[ltsview](https://github.com/naoto/ltsview) は Ruby で実装された、LTSV を YAML や JSON に変換するツールです。

インストールは gem コマンド一発。

```
$ gem i ltsview --no-ri --no-rdoc
```

実をいうと Perl で実装された同名のツールも [Text::LTSV](https://github.com/naoya/perl-Text-LTSV) に同梱されているようですが、個人的にはツールまわりは RubyGems で入れることが多いので、Ruby 版の方を使っています。
今回の用途にはどちらも使えると思うので、好きな方を使えばいいと思います。

LTSV のアクセスログを ltsview 経由で jq に渡すには以下のようにします。

```
$ tail -F access.ltsv | ltsview -j --no-color | jq 'select(.status >= "500") | {req: .req, referer: .referer, ua: .ua}'
```

ltsview はデフォルトでは YAML で出力するので `-j` で JSON 出力するようにしたり、色付けが問題でそのままでは jq に渡せないので `--no-color` を指定する必要があります。

# 方法 2: ltsv2json を使う

[ltsv2json](https://github.com/yuya-takeyama/ltsv2json) は拙作の Ruby 製ツールです。
ltsview のコマンドラインオプションがめんどくさいというだけの理由で昼休みに作りました。

これもインストールは gem コマンド一発。

```
$ gem i ltsv2json --no-ri --no-rdoc
```

ltsv2json を使う場合は以下のようにします。

```
$ tail -F access.ltsv | ltsv2json | jq 'select(.status >= "500") | {req: .req, referer: .referer, ua: .ua}'
```

そんなに変わらないですね!

# おまけ: Rubyist はフィルタリングに jr を使おう

jr は、これも拙作の Ruby 製 JSON フィルタリングツールです。
jq はとても便利で個人的にも良く使うのですが、複雑なフィルタリングをやろうとすると「どうやって書けばいいんだ?」ということになりがちです。

書きなれた Ruby で同じことができれば、ということで作ったのが [jr](https://github.com/yuya-takeyama/jr) です。

インストールはこれだけ。

```
$ gem i jr-cli --no-ri --no-rdoc
```

jr を使うと同じ事が以下のようにできます。

```
$ tail -F access.ltsv | ltsv2json | jr 'select{|j| j[:status] >= "500" }.map{|j| {req: j[:req], referer: j[:referer], ua: j[:ua]} }'
```

jq はフィルタリングに特化したツールだけあって、短く書けて良いのですが、記法が少し独特なので覚えるのが面倒という問題があります。
Ruby なら目をつぶっても書ける、という方にはオススメのツールです。
Bluemix PaaSでNode.js+Express4アプリケーションを動かす

IBMのPaaS Bluemixでnode.js+express4のアプリケーションを動かす基本的な方法をまとめました。

##前提

* [IBM idの登録とBluemixへのサインアップ](https://apps.admin.ibmcloud.com/manage/trial/bluemix.html])
* ローカル環境への[CloudFoundry CLI](https://github.com/cloudfoundry/cli)のインストール
* ローカル環境へのnode.js、npm、express、express-generatorのインストール

##手順の概要

1. アプリケーションの作成
1. アプリケーションの修正
1. Bluemixへのプッシュ
1. 起動確認

##アプリケーションの作成

ここでは、単純なexpress4アプリケーションを作成します。ローカル環境では以下のバージョンを使用しています。

* node: 0.10.33
* npm: 1.4.28
* express: 4.9.0

以下のようにして、expressアプリケーションを作成し、ローカルでの動作確認をします。

```bash
express nodesample
cd nodesample
npm install
npm start # test from browser: "http://localhost:3000/"
```

##アプリケーションの修正

Bluemixは、node.jsでlistenするポート番号を環境変数`VCAP_APP_PORT`で与えますので、該当部分を変更する必要があります。Express4では、bin/wwwを修正します。

```diff
*** nodesample.orig/bin/www	2014-11-05 21:18:15.684411184 +0900
--- nodesample/bin/www	2014-11-05 21:19:17.448408741 +0900
***************
*** 2,8 ****
  var debug = require('debug')('nodesample');
  var app = require('../app');
  
! app.set('port', process.env.PORT || 3000);
  
  var server = app.listen(app.get('port'), function() {
    debug('Express server listening on port ' + server.address().port);
--- 2,8 ----
  var debug = require('debug')('nodesample');
  var app = require('../app');
  
! app.set('port', process.env.VCAP_APP_PORT || 3000);
  
  var server = app.listen(app.get('port'), function() {
    debug('Express server listening on port ' + server.address().port);
```

アプリケーションの修正は以上です。

##Bluemixへのプッシュ

次にアプリケーションをBluemixにプッシュします。

```bash
# Cloud Foundryの対象APIに`bluemix.net`を設定
$ cf api https://api.ng.bluemix.net

# Bluemixにログイン
$ cf login -u <ユーザ名>

# Bluemixにカレントディレクトリ以下のアプリケーションをプッシュ
#   アプリケーション名: node-express-sample
#   ランタイム(buildpack): sdk-for-nodejs
#   メモリ上限: 128M (デフォルトは64M)
$ cf push node-express-sample -m 128M -b sdk-for-nodejs
```

今回はRDBMSなどのサービスを特に利用せず、"SDK for node.js"のみを使用します。"SDK for node.js"はダッシュボードでは"runtimes"のひとつとして確認できますが、CLIでは、`cf marketplace`(利用できるserviceの一覧)ではなく`cf buildpacks`(利用できるbuildpackの一覧)に含まれます。Buildpackは`cf create-service`を必要とせず、`cf push`に`-b`オプションで直接指定してプッシュします。(この段落の説明は、今回試した動作に基づいており、Cloud Foundryの詳細な仕様を確認したわけではありませんのでご了承ください)

なお、アプリケーションのメモリですが、デフォルトの64MBではメモリ不足でうまく動作しませんでしたので、メモリを128Mに拡張しています。ここでは`cf push`のオプションで指定していますが、もちろんmanifest.ymlに記述しても構いません。

##起動確認

ブラウザで http://node-express-sample.mybluemix.net/ を開くと、アプリケーションが起動していることを確認することができます。

![node-express-sample.mybluemix.net.png](https://qiita-image-store.s3.amazonaws.com/0/21963/2b155293-ec1c-c38b-2b0e-c5c0ae441c45.png)
logroateの話

=====


アプリケーションサーバを並べてリクエストを受けていたんだけど、
ログの量が多すぎてCPU使い切る前にdiskがいっぱいになりそう。

でかいdiskをattachしてもいいんだけど、
金かけずに手っ取り早くできることはないかって見たときに
logrotate.dの設定の中に`delaycompress`があり、
1日前のログが圧縮されずにあったのでこれをはずすことに。

(logrotateの`hourly`はcron周りいじるのが面倒であと回し)

調査ログ
----

logrotate.dに入ってるアプリケーションログの設定は

```
/path/to/production.log
{
  daily
  create
  missingok
  rotate 7
  compress
  dateext
  delaycompress

  lastaction
    unicorn_pid=/path/to/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $unicorn_pid)"
  endscript
}
```

元のconfの作成の経緯はわからなかったので
ぱぱっと調べたlogrotateの動作は

1. firstaction script
2. prerotate script
3. rename
4. postrotate script
5. compress
6. lastaction script

な感じで、compressがlastactionの前にあるとしたら
既存の設定では

i. ログがrotate(rename) される
ii. ログの圧縮が実行される(結構時間がかかる)
iii. アプリケーションがシグナルを受け取りログを切り替える

という流れに...。
2のログの圧縮に時間がかかると
fluentd(v1)とかどうなるんだろうと思いそちらも見てみると

in_tail pluginでは

+ timerとtail pathのstatの変化をtriggerにしてログファイルをチェック
+ メモリ上の値とFile openした値をinodeとsizeで比較
+ 変化があるとそちらをtail対象に変更
+ 元のファイルはrotate_waitだけtailする
  + default 5秒

というわけで、compressが長いとまずいんじゃないか？と不安が。

現在も圧縮は数分単位でかかっているので、
既にログの取りこぼしがあるのではと思い確認してみるが特になし...

何か勘違いがありそうなので、logrotateの中身を確認してみると
認識が異なる点があった

1. firstaction script
2. prerotateSingleLog function
  + 過去にrotateされたログのrename
  + delaycompressがある場合はここで圧縮
    + 圧縮が完了すると元ログの削除
  + rotate で指定された値を超えたログの削除
3. prerotate script
4. rotateSingleLog function
  + 最新のファイルのrename
  + createがあればファイルの作成
5. postrote script
6. postrotateSignleLog function
  + renameされた最新のファイルの圧縮
    + 圧縮が完了すると元ログの削除
7. lastaction script

というわけで、実際は delaycompress は最新のファイルの
rename & create より早く圧縮が実施されているので問題なさそう

delaycompress だけ削除すると圧縮に時間がかかると
renaming からシグナルを送信が遅くなりそうだったので、
lastaction script から postrotate script に処理を移動することに。


delaycompress は man 見るとシグナルを受けてすぐログを離さない場合に使ってね
的なことが書いてあるので、つけるかつけないか気をつける必要はありそう。

今回の場合は
シグナルで比較的すぐにログの切り替えが発生するし、
圧縮からログの削除までは少し猶予がありそう、
fluentdは5秒くらいは古いログをケアしてくれそう
というわけで、大丈夫そう。

とりあえず入れた感じ、ぱっと見は問題なさそう。
問題あったら追記する。
SPIについて(その3

SPIについて勉強を始めたばかりなので、その3

## ソフトウェア・プロセス・モデル表記法
ソフトウェアプロセスを広く伝え、活用するために文書化されたもの
初心者ではなく専門家の使用するものである

**種類**

* 短いチェック・リスト
* フローチャート
* [ETVXダイヤグラム](http://sea.jp/SPIN/Reports/SPIN0904_Shintani=Process_Improvement_SEPG.pdf)
* [インフォメーション・マッピング](http://www.kozoka.info/im.html)
* インプット/アウトプット図

## ソフトウェア・エンジニアリング標準
新しいソフトウェア・プロセスを設計するための最低限の要求事項

**種類**

* MIL-STD-1521B
* MIL-STD-973
* MIL-HDBK-61

## ソフトウェア・エンジニアリング・ライフサイクル
ソフトウェア品質と信頼性のための活動
初心者に対して多くの手引きが提供されている
ソフトウェアプロジェクトマネジメントや品質マネジメントなどとしては十分ではない

**種類**

* [ウォーターフォール](http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%A2%E3%83%87%E3%83%AB)
* [スパライル](http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%91%E3%82%A4%E3%83%A9%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB)
* [エボリューショナル](http://akademeia.info/index.php?%A5%BD%A5%D5%A5%C8%A5%A6%A5%A7%A5%A2%A5%D7%A5%ED%A5%BB%A5%B9%A5%E2%A5%C7%A5%EB#jf001195)
* [プロトタイピング](http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0)
* インクリメンタル
RedisのSET型を用いた集合演算

数十万程度のユーザ集合に対するベン図を作成するためにA∩B∩C的なものの計算が必要になったため、勉強がてらredisを使ってみました。Pythonなどでのスクリプトは書かずにredis-cliで処理しています。

Redis SET型については以下解説がわかりやすかったです。

ニコニコ生放送に見る Redis 活用ノウハウ
http://gihyo.jp/dev/feature/01/redis/0004


## インストール

http://qiita.com/i2bskn/items/42cbf6bc52f9cfa406bb に従う

## 元データをbulk import(mass insertion)する

### 元データ作成

http://redis.io/topics/mass-insert
を参考に、以下のようなデータを作成。改行コードをCRLFにする必要がある。

```
$ head DataSet_A 
SADD A user0000000000000001
SADD A user0000000000000002
SADD A user0000000000000003
…
```

```
$ head DataSet_B
SADD B user0000000000000003
SADD B user0000000000000004
SADD B user0000000000000005
…
```

```
$ head DataSet_C 
SADD C user0000000000000001
SADD C user0000000000000003
SADD C user0000000000000007
…
```

### ロードします

```
$ cat DataSet_A DataSet_B DataSet_C | time redis-cli --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1700000
```

この状態でtopで確認すると redis-serverのVIRTは653m、RESは196m

### 失敗したらflushします

```
$ redis-cli
127.0.0.1:6379> FLUSHALL
OK
```
## 集合演算を実施

```
$ redis-cli
127.0.0.1:6379>
```
http://redis.io/commands#set
を参考に

####  Aの要素数
```
> SCARD A
```
####  Aの要素リスト
```
> SMEMBERS A
```

####  A∩B∩Cリスト
```
> SINTER A B C
```
####  A∩^B∩^Cリスト
```
> SDIFF A B C
```
####  A∪B∪Cリスト
```
> SUNION A B C
```
####  A∪B∪Cの要素数
```
> SUNIONSTORE X A B C
> SCARD X A B C
```

## 所感
・パイプラインはredis-cliでは利用できない？
・1,700,000レコードでRESが196mなので、単純に考えるとメモリ4GBで30Mレコード強扱える？
　（ホットバックアップは考えないで）
自分が使っているアプリケーションまとめ

新しく環境設定するときに便利だったり、数年後に見返したときに面白そうなので自分の使っているアプリケーションや設定をまとめてみる。

# アプリケーション
* **[AppCleaner](http://www.freemacsoft.net/appcleaner/)**  
    - 最近あんまり使ってないです
* **[BetterTouchTool](http://blog.boastr.net/downloads-secondbar-bettertouchtool-2/)**
    * 画面サイズの変更に使用してます
    * Maximize Window、Maximize Window Left、Maximize Window Rightはキーボートショートカットあてて多用
    * （いい加減デフォルトでこのウィンドウ操作ができるようにならないかなぁ……）
* **[Caffeine](https://itunes.apple.com/jp/app/caffeine/id411246225?mt=12)**
    * 放ってるときに画面がスリープになるかどうかを環境設定を開かずに切り替えられるアプリ
    * スライド発表するときに地味に便利です
* **[Flux](https://justgetflux.com)**
    *  画面の色温度を変えて目の負担を軽くするアプリ
    *  ブルーライトカットの眼鏡にしてからはあまり使ってないです
* **[iTerm](http://iterm2.com/downloads.html)**
    * Terminal.appに比べて、タブが1つのときのUIをスッキリできるとこが好きです
    * ⌘+Uで画面の背景色を切り替えられるのも好き（透過させるとMBA11inchで作業しやすいけどたまに見難いんで切り替えられると便利）
* **[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)**
    * 旧KeyRemap4MacBook 
    * キーリピート速度を上げるために使ってます
    * Vimでinsertモードからnormalモードに戻るときに「かな」から「英数」に自動で戻す
    * option空打ちでiTermの起動
* **[MacZip4Win](http://ynomura.com/home/?page_id=116)**
    * Windowsユーザ向けのマナー？
* **[Safari](https://www.apple.com/jp/safari/)**
    * iPhoneのリーディングリストの連携を考えるとSafariを使わざるを得ない（ほんとはChromeを使いたい）
    * よく使うブックマークを画像のように配置すると⌘1〜9で開くことができて楽です
![hoge](https://qiita-image-store.s3.amazonaws.com/0/4199/f729d4b7-5895-8e72-82c9-c73cce05cd57.png)

* **[Timebar](https://itunes.apple.com/jp/app/timebar/id617829225)**
    * 残り時間が見やすいアラームアプリ 

* **[Twitter](https://itunes.apple.com/jp/app/twitter/id409789998)** 
    * リストが遡れなかったり画像投稿に難のあった夜フクロウから乗り換え 
    * 複数アカウントと豊富なショートカット

* **[X-Mirage](http://x-mirage.com/x-mirage/)**
    * iPhoneの画面をMacにミラーリングするアプリ
    * アプリのプレゼン用
    * 無料で配ってるときにダウンロード
* **[Xcode](https://itunes.apple.com/jp/app/xcode/id497799835)**
    * Clang-Format

# webアプリケーション
* **[Doit.im](http://doit.im/ja/)**
    * タスク管理用
    * あんまりGTD意識せず使ってます
* **[Gmail](https://mail.google.com/mail/)**
    * メール振り分け機能などGmailの細かい機能を使ってたらWebアプリに落ち着きました
* **[Feedly](http://feedly.com/)**
    * ごたごたのあったlivedoor Readerから乗り換え
    * ショートカットキーはLDRと変わらず豊富
* **[Evernote](https://evernote.com/intl/jp)**
    * 容量を食うのでクライアントアプリからWebアプリに切り替え
    * Evernote Webクリッパー便利
    * WebクリッパーやTwitterのつぶやき自動転送で生活のログを貯めるようにしてます

# CUI系
* **[homebrew](http://brew.sh)**
     * みんな使ってるからMacPortsから乗り換え 
* **[Vim](http://www.vim.org/)**
     * Insertモードにemacsのキーバインドを入れた邪教Vim仕様で使ってます
* **[Zsh](http://www.zsh.org)**
     * [漢はzsh](http://news.mynavi.jp/column/zsh/001/)

# 環境設定
* **Dock**
    * 自動で隠れる下派
    * 自動で隠れるのは画面の大きさを出来るだけ確保するため
    * アイコンは起動しているアプリケーションだけ派（アプリの起動は全てSpotlight）
* **Spotlight**
    * （みんなAlfred使ってるけどそこまで高機能なのいります……？）
* **キーボード**
    * Opt+Tabで同一アプリのウィンドウ切り替え
    * Control+F1でメニューバーにフォーカスを当てる
* **[Locamatic](http://www.45rpmsoftware.com/locamatic.php)**
    * ネットワーク設定を自動で切り替えてくれる
    * Proxyのあるところで作業する人に便利
* **[Synergy](http://synergy-project.org)**
    * 他のPCを今使っているPCのキーボードで操作できるようにする
    * Mac to MacならTeleportがいいらしい

* * *

書いてて気付いたけけどこの手の記事って自分が何を信仰してるか告白してるような気分だ、、、
C#で、utf8(BOM無し)のテキストファイルを出力する


C# で、utf8 のテキストファイルを出力しようと、何も考えずに以下のようなコードを書くと

```csharp:SAMPLE1
var utf8_encoding = Encoding.GetEncoding("utf-8");
using (var writer = new StreamWriter("UTF8.TXT", false, utf8_encoding))
{
    writer.WriteLine("あいうえお");
}
```

ファイル先頭に BOM ([Byte Order Mark](http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF)) が付与されたがっかりすることになる。


BOMなしの utf8 なテキストファイルを出力するには、

```chsarp:SAMPLE2
var utf8_encoding = new System.Text.UTF8Encoding(false);
using (var writer = new StreamWriter("UTF8.TXT", false, utf8_encoding))
{
    writer.WriteLine("あいうえお");
}
```

とすれば良い。

参考：[UTF8Encoding クラス (System.Text)](http://msdn.microsoft.com/ja-jp/library/system.text.utf8encoding(v=vs.110).aspx)
時刻のフォーマットをiso8601形式にする


こんな感じ。ActiveSupportを使った場合も同じようにできます。

```ruby
require 'time'

Time.now.iso8601
=> "2014-11-05T21:45:10+09:00"

7.days.ago.iso8601
=> "2014-10-29T21:46:04+09:00"
```

しかし、ActiveSupport便利！

[参考記事](http://sessan.hatenablog.com/entry/2013/01/08/112249)
for文で九九の表を作る

##この投稿の概要
jsの授業の課題で作ったので、記録のため（~~画像アップロードのためにも…~~）投稿します:)


　![スクリーンショット_2014-11-05_21_33_27.png](https://qiita-image-store.s3.amazonaws.com/0/15577/bb5c1982-21a0-80d2-7dd6-cc5e08ab1cd6.png)

##つくり方
```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
 <title>九九の表だよ〜</title>
</head>

<body>
<script type="text/javascript">

 document.write("<center>");
 document.write("<h1>九九の表</h1>");
 document.write("<table border>");

 for(var i = 1 ; i < 10 ; i++) {
    document.write("<tr>");

    for(var j = 1 ; j < 10 ; j++) {
      document.write("<td>",  i*j  , "</td>");
    }

    document.write("</tr>");

 }

 document.write("</table>");
 document.write("</center>");

</script>
</body>
</html>
```
ディスク容量がいっぱいの時にやる事

## 追記
ディスク容量をグラフィカルに確認可能なncduコマンドを教えて頂きました。
こちらだと容量大のファイルの特定が早そうです。
krf7v4k2さん、ありがとうございました！

- インストール
    - (debian系) apt install ncdu
    - (redhat系) yum install ncdu

##現在のディスク容量の確認

###全体のディスク容量を確認
* **df -h**

>
[root@ip-xxx-xxx-xxx-xxx ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      6.0G  4.1G  1.6G  73% /
tmpfs           498M     0  498M   0% /dev/shm

###ディスク容量の内訳を確認
* **du -sh [容量内訳を確認したいディレクトリのパス]   
例) du -sh /\*　(ルート直下）    
例) du -sh ./\*　(カレントディレクトリ直下）  
例) du -sh /var/\*　(varディレクトリ直下）
例) du -sh /\home -x  (homeディレクトリ直下でマウントポイントある場合除外する) **

>
root@ip-xxx-xxx-xxx-xxx ~]# du -sh /
7.8M    /bin
47M     /boot
4.0K    /cgroup
140K    /dev
28M     /etc
104K    /home
253M    /lib
26M     /lib64
16K     /lost+found
4.0K    /media
0       /misc
4.0K    /mnt
0       /net
8.0K    /opt
0       /proc
16M     /root
15M     /sbin
0       /selinux
4.0K    /srv
0       /sys
204K    /tmp
2.3G    /usr
1.3G    /var
##

複数階層をまとめて見たい場合は以下の指定で出来るらしい

* **du -h --max-depth [階層数] [容量内訳を確認したいディレクトリのパス]**   
例) du -h --max-depth 2 /\*　(ルート直下) 


##不要データの削除
###yumインストールデータのキャッシュ削除
* **du -sh /var/cache/yum（ディスク使用容量を確認）**
* **yum clean all(すべてのキャッシュを削除）**

###tmpデータの削除
* 削除可能と判断出来るものは削除する。
* 保管間隔を狭めたい場合は以下の時間を編集する  
**/etc/cron.daily/tmpwatch**  
例）/var/tmp内のファイルで720時間アクセス無しのものは削除  
　　/usr/sbin/tmpwatch 720 /var/tmp
Android: Creating Apps with Material Design

Creating Apps with Material Design
---

> Material design is a comprehensive guide for visual, motion, and interaction design across platforms and devices. To use material design in your Android apps, follow the guidelines described in the material design specification and use the new components and functionality available in Android 5.0 (API level 21).

Material designは, プラットフォームやデバイスの垣根を越えたビジュアル, モーション, インタラクションのためのデザインガイドです. 
Material designをAndroidアプリで使用するには, ガイドラインに従い, Android 5.0(API level 21)で利用可能となった新しいコンポーネントや機能を使用してください. 

> This class shows you how to create material design apps with the following elements:
> 
> - The material theme
> - Widgets for cards and lists
> - Custom shadows and view clipping
> - Vector drawables
> - Custom animations
> 
> This class also teaches you how to maintain compatibility with versions of Android earlier than 5.0 (API level 21) when you use material design features in your app.

ここでは, 以下の要素を持つMaterial designなアプリの作成方法を記載します. 

 - Material theme
 - カードとリストのためのウィジェット
 - 影とViewクリップ
 - ベクターDrawable
 - カスタムアニメーション

さらに, Android5.0(API level 21)以前のバージョンへの互換性を維持する方法を記載します. 

### Lessons

>[Getting Started](http://developer.android.com/training/material/get-started.html)
Learn how to update your app with material design features.

>[Using the Material Theme](http://developer.android.com/training/material/theme.html)
Learn how to apply material design styles to your app.

>[Creating Lists and Cards](http://developer.android.com/training/material/lists-cards.html)
Learn how to create lists and cards with a consistent look and feel using system widgets.

>[Defining Shadows and Clipping Views](http://developer.android.com/training/material/shadows-clipping.html)
Learn how to set elevation for your views to create custom shadows and how to clip views.

>[Working with Drawables](http://developer.android.com/training/material/drawables.html)
Learn how to create vector drawables and how to tint drawable resources.

>[Defining Custom Animations](http://developer.android.com/training/material/animations.html)
Learn how to create custom animations for views and activity transitions with shared elements.

>[Maintaining Compatibility](http://developer.android.com/training/material/compatibility.html)
Learn how to maintain compatibility with platform versions earlier than Android 5.0.

---

> **LICENSE**
> Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
> 
> Original source: http://developer.android.com/training/material/index.html
Advantages of Web Parsing

Web parsing is a method of extracting information from various websites. Web parsing is also known as web harvesting. Web parsing implements low level HTTP for its process. It is an alternative to human being exploration to various sites. It is somewhat similar to web harvesting. The only difference is, in web harvesting bots are used to extract information from various sites. Bots perform task quite fast. There is no such bots in web scraping.

In fact, for web harvesting, efficient web browsers like Mozilla Firefox and Internet Explorer can be used to extract the information. But these are just the alternative and are not widely used. On wider scale, bots are used to extract the information rather than going for the website explorer.
HTML Applications(VBScript)でパソコンのMACアドレスを取得

MACアドレスでアクセス制限するようなサービスがあって、遠隔地の相手に
使っているパソコンのMACアドレスを確認が必要だったりするあるんだけれど、
コマンドラインの使い方を説明して確認してもらうのも大変だし、
確認用のEXEを作るのも大変だし、受け渡しはどうすればいいとか面倒くさい。

よく考えてみればVBScriptでそんな事できたようなと思って調べてみたら
出来るみたい。
ネットワークインターフェースカードのMacアドレスを取得する: 

[ネットワークインターフェースカードのMacアドレスを取得する: Win32_NetworkAdapterConfiguration - WMI Sample (VBS)](http://www.wmifun.net/sample/win32_networkadapterconfiguration_d.html)

さらに画面があったら便利だなと思って調べてみたら、HTML Applications(HTA)
を使えばHTMLで画面がつくれて、HTMLファイルで出来ないような処理
(ファイルアクセスとか、ネットワーク情報アクセス)も出来るみたい。

[第10回　HTAでフォームを利用したサンプルを作る](http://itpro.nikkeibp.co.jp/article/COLUMN/20100218/344797/)

[HTAを利用したウインドウ付きアプリケーション](http://crocro.com/write/manga_javascript/wiki.cgi?p=HTA%A4%F2%CD%F8%CD%D1%A4%B7%A4%BF%A5%A6%A5%A4%A5%F3%A5%C9%A5%A6%C9%D5%A4%AD%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3)


拡張子をhtaで保存してそれをクリックして起動するだけ。

```vbnet:netinfo.hta

<!DOCTYPE html>
<html>
<body>
<textarea id="msg" style="width:600px;height:100px" >
</textarea>
<script type="text/vbscript">
Dim oClassSet
Dim oClass
Dim oLocator
Dim oService
Dim sMesStr

'ローカルコンピュータに接続する。
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocator.ConnectServer
'クエリー条件をWQLにて指定する。
Set oClassSet = oService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration")

'コレクションを解析する。
For Each oClass In oClassSet
  If oClass.IPEnabled = True Then
    sMesStr = sMesStr & "種類：" & oClass.Description & vbCrLf & _
              "Macアドレス：" & oClass.MACAddress & vbCrLf & vbCrLf
  End If
Next
document.getElementById("msg").value=sMesStr
'使用した各種オブジェクトを後片付けする。
Set oClassSet = Nothing
Set oClass = Nothing
Set oService = Nothing
Set oLocator = Nothing
</script>
</body>
</html>

```

これで、チャットとか、メールで内容を送って、htaで保存して実行した結果をコピペして送って欲しいとお願いすれば良い。他にも色々使えそう。
CentOS 5.11 で SPDYを使いたい(その1 - Apacheバージョンアップ編)

#はじめに
お仕事の都合でCentOS 5.11(x64)のApacheでWebサーバを立てているのですが、どうしてもmod_spdyを利用したかったのでいろいろと作業しまました。そのログです。

#mod_spdyのシステム要件
mod_spdyのrpmパッケージをダウンロードできるサイト[mod_spdy &mdash; Google Developers](https://developers.google.com/speed/spdy/mod_spdy/)で確認したところ要件は以下の2つのみ

>System Requirements
>    ・Apache 2.2 (≥2.2.4)
>    ・mod_ssl enabled

mod_sslはすでに有効なので、Apacheのバージョンを確認した

```bash
# httpd -v
Server version: Apache/2.2.3
Server built:   Sep 16 2014 11:05:09
```

要件満たさず・・・
というわけで早速、Apacheのバージョンアップから！

#Apacheのバージョンアップ
普通にyumしても最新版なので、CentALTリポジトリを有効にしてApacheをバージョンアップすることにした

まずは、リポジトリを使えるように・・・っと

```bash
# rpm -Uvh http://mirror.sysadminguide.net/centalt/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm
```

これで、CentALTリポジトリからApacheインストールできると思いきや、なんと403になる。。。

```bash
# yum --enablerepo=CentALT update httpd
Loaded plugins: fastestmirror
http://centos.alt.ru/repository/centos/5/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 403: Forbidden
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: CentALT. Please verify its path and try again
```

調査したところ、ミラーサイトを指定しなければいけないようなので速攻対応

```bash
# vi /etc/yum.repos.d/centalt.repo
```

```bash:/etc/yum.repos.d/centalt.repo
[CentALT]
name=CentALT Packages for Enterprise Linux 5 - $basearch
#baseurl=http://centos.alt.ru/repository/centos/5/$basearch/
baseurl=http://mirror.sysadminguide.net/centalt/repository/centos/5/$basearch/
enabled=0
gpgcheck=0
```
baseurlのみ変更し、いざ再実行！

```bash
# # yum --enablerepo=CentALT update httpd
Dependencies Resolved

========================================================================================
 Package                              Arch         Version           Repository    Size
========================================================================================
Updating:
 httpd                                x86_64       2.2.27-1.el5      CentALT      1.3 M
Installing for dependencies:
 apr-util-ldap                        x86_64       1.4.1-1.el5       CentALT       14 k
 httpd-tools                          x86_64       2.2.27-1.el5      CentALT       68 k
Updating for dependencies:
 apr-util                             x86_64       1.4.1-1.el5       CentALT       80 k
 httpd-devel                          x86_64       2.2.27-1.el5      CentALT      146 k
 httpd-manual                         x86_64       2.2.27-1.el5      CentALT      1.1 M
 mod_ssl                              x86_64       1:2.2.27-1.el5    CentALT       91 k

Transaction Summary
========================================================================================
Install       2 Package(s)
Upgrade       5 Package(s)

Total download size: 2.7 M
Is this ok [y/N]: 
```

おおっ！無事にApache 2.2.27がリストアップされています！
そのまま"y"を押すと無事にバージョンアップされました！

```bash:
# httpd -v
Server version: Apache/2.2.27 (Unix)
Server built:   Apr  9 2014 23:20:37
```

やったね(^_^)v

長くなったのでmod_spdyのインストールは次の投稿で・・・
.Net(C#)とJavaScript(Node.js)でURLエンコード

* クライアント側：C#.net
* サーバ側：Node.js

上の構成にてアプリケーションを作成しており、クライアント側からURLでユーザ入力文字列を渡す必要があったので、そのときのURLエンコード、デコードのメモを残します。

####やりたかった事
ユーザ入力文字列をURLからNodeに渡したい。

####調査対象文字列

    `~!@#$%^&*()-_=+[{]}\|;:'",<.>/ ?

アルファベットや数値はエンコードしないでしょー、日本語とかの文字列はエンコードするでしょーってことで上に挙げた文字列を対象とし、エンコードデコードの動作を調査した。

####環境
* OSはサーバ、クライアントともWin7
* C#.Net 2.0
* Node.js v0.10.28


####使用したメソッド

* C#  
    System.Web.HttpUtility.UrlEncode()
* Node  
    decodeURI()  
    decodeURIComponent()

##調査結果
####クライアント(C#.Net)でのエンコード時
    %60%7e!%40%23%24%25%5e%26*()-_%3d%2b%5b%7b%5d%7d/%7c%3b%3a%27%22%2c%3c.%3e/+%3f
!*()-_\./はエンコードされない。半角空白は+として現れる。
\\(円、バックスラッシュ)は/(スラッシュ)に置換されるみたい。

####サーバ(Node.js)でのデコード時
**decodeURI()**

    `~!%40%23%24%^%26*()-_%3d%2b[{]}/|%3b%3a'"%2c<.>/+%3f

いくつかの文字列を期待通りにデコードしない。
 
**decodeURIComponent()**

    `~!@#$%^&*()-_=+[{]}/|;:'",<.>/+?

ほぼ期待通り。ただし、クライアントから送られてくる時点で\が/に置換されており、+が本来の意味の+と空白であった+がそのまま出現する。

##最終的に…

1. クライアント側でSystem.Web.HttpUtility()を使用してURLをエンコード
2. サーバ側で受信したエンコード済みURL文字列をreplace('+', ' ')で+を空白に置換
3. +置換済み文字列をdecodeURIComponent()でデコード

する方法を採用しました。\と/は入力を許可していないので問題なしと判断しています。
R の foreach で並列処理するときに乱数を固定する #rstatsj

[以前の記事](http://qiita.com/hoxo_m/items/f08b015bc9897d98775d)に書いたように、R の foreach で並列処理を書くときは、次のように書きます。

```r:R
library(doParallel)
ExecuteParallelProcess <- function() {
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
  on.exit(stopCluster(cl)) 
  foreach(i = 1:3, .combine=c) %dopar% {
    rnorm(1)
  }
}
ExecuteParallelProcess()
```

```:結果
[1]  0.6725327  0.8103935 -0.4231717
```

このプログラムは、正規分布から 3 つの乱数を取得するというものです。
科学技術計算の分野では、シミュレーション結果の再現性を保つために、乱数を固定したいという要求があります。
つまり、何度実行しても同じ結果が得られるように、毎回同じ乱数を生成したいということです。
この目的のために、R では通常 `set.seed()` 関数を用いて乱数を固定します。

```r:R
ExecuteParallelProcess <- function() {
  set.seed(12345) # この行を追加
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
  on.exit(stopCluster(cl)) 
  foreach(i = 1:3, .combine=c) %dopar% {
    rnorm(1)
  }
}
ExecuteParallelProcess()
ExecuteParallelProcess()
```

```:結果
[1] -0.3014045  0.7398383 -0.7157335
[1] -0.98871268 -0.03876135  0.31606417
```

しかし、ご覧のように、並列計算を行う場合、`set.seed()` で乱数を固定することはできません。
乱数の固定の仕方は、使用する並列化パッケージによって異なるようですが、ここでは `parallel` パッケージの `clusterSetRNGStream()` 関数を使って乱数を固定してみましょう。

```r:R
ExecuteParallelProcess <- function() {
  cl <- makeCluster(detectCores())
  clusterSetRNGStream(cl, 12345) # この行を追加
  registerDoParallel(cl)
  on.exit(stopCluster(cl)) 
  foreach(i = 1:3, .combine=c) %dopar% {
    rnorm(1)
  }
}
ExecuteParallelProcess()
ExecuteParallelProcess()
```

```:結果
[1] -1.45785035 -0.03518695  0.05799898
[1] -1.45785035 -0.03518695  0.05799898
```

これにより、並列処理においても乱数を固定することができるようになりました。

ところで、[この記事](http://qiita.com/hoxo_m/items/02b82d44a09752509dc3)に書いた方法でクラスタを implicit にしたい場合、クラスタオブジェクトを引数に取る `clusterSetRNGStream()` は使えません。

そこで便利なのが `doRNG` パッケージです。
`doRNG` パッケージの `registerDoRNG()` 関数を使えば、クラスタを implicit にしても乱数の固定ができます。

```r:R
library(doRNG)
ExecuteParallelProcess <- function() {
  registerDoParallel(detectCores())
  registerDoRNG(12345) # この行を追加
  on.exit(stopImplicitCluster2()) 
  foreach(i = 1:3, .combine=c) %dopar% {
    rnorm(1)
  }
}
res1 <- ExecuteParallelProcess()
res2 <- ExecuteParallelProcess()
identical(res1, res2)
```

```:結果
[1] TRUE
```

また、`doRNG` を使った別の方法として、`foreach` に `.options.RNG` オプションを指定して、`%dorng%` を使う方法もあります。

```r:R
ExecuteParallelProcess <- function() {
  registerDoParallel(detectCores())
  on.exit(stopImplicitCluster2()) 
  foreach(i = 1:3, .combine=c, .options.RNG=12345) %dorng% { # この行を変更
    rnorm(1)
  }
}
res3 <- ExecuteParallelProcess()
res4 <- ExecuteParallelProcess()
identical(res3, res4)
```

```:結果
[1] TRUE
```

ついでに、上記二つの方法の結果が一致することを確認してみます。

```r:R
identical(res1, res3)
```

```:結果
[1] TRUE
```

以上です。

### 参考文献

- [福島真太朗『Rによるハイパフォーマンスコンピューティング』](http://www.amazon.co.jp/gp/product/4883379353)

### 関連記事

- [foreach の registerDoSEQ() について](http://qiita.com/hoxo_m/items/aacdf912559412b2b61b)
- [R の foreach で並列処理するとき on.exit() が便利](http://qiita.com/hoxo_m/items/f08b015bc9897d98775d)
- [R の foreach で並列処理するとき、クラスタを implicit にする](http://qiita.com/hoxo_m/items/02b82d44a09752509dc3)
std::functionと暗黙型変換

戻り値型および引数型が暗黙変換(implicit conversions)可能な場合は`std::function<void(X)>`型へ代入可能。

```cpp
#include <functional>

struct X {
  int m;
  operator int&() { return m; }
  // X -> int型変換を許容
};

int main()
{
  std::function<void(X)> f;
  f = [](X){};      // void(X)
  f = [](int){};    // void(int) -> void(X)
  f = [](double){}; // void(double) -> void(X)
  f({42});

// f = [](X){ return 0.; }; // NG: double(X) -> void(X)
}
```
Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順メモ

##はじめに
Googleドライブ上のスプレッドシートを読み書きするアプリ作成のため
Google APIの手続きを行ったのですが、その手続きがとっても面倒でした。
なので、メモしておいた手順を私的な備忘録としてこちらに公開してみます。

今回リフレッシュトークンがどうしても必要だったのですが、
仕様変更で以前よりリフレッシュトークンの取得が若干面倒になったようです。
以下は、リフレッシュトークン取得を目指したやり方になります。

##手順
####１、取得に使うGoogleアカウント作成、ログイン

####２、Google Developers Consoleにアクセス
https://console.developers.google.com
(設定でサイトを日本語に変更可能だが、翻訳がややこしいので英語版推奨)

####３、API ProjectをCreate、左メニューのAPIs&auth -> APIsから使いたいAPIを選んでONにする
（今回はDrive APIとDrive SDKを選択）

####４、APIs&auth -> Credentials からCreate new Client IDを選択
指示に従って必要項目を選択・記入
クライアントID・SECRETキー・リダイレクトURIが得られる

####５、クエリパラメータを追加したURLにブラウザでアクセス


以下のURLに
https://accounts.google.com/o/oauth2/auth
下記クエリパラメータを追加してブラウザでアクセスする

?client_id=[4で取得したクライアントID]
&redirect_uri=[４で設定したリダイレクトURI]
&scope=https://www.googleapis.com/auth/drive (使用したいサービスのAPIにスコープする。今回はGoogleドライブ)
&response_type=code (認証をコードとして出力)
&approval_prompt=force (認証をスキップしない)
&access_type=offline (オフラインでAPIを使用＝リフレッシュキーを発行)

つまり、以下のようなURLにブラウザでアクセスする
https://accounts.google.com/o/oauth2/auth?client_id=[4で取得したクライアントID]&redirect_uri=[４で設定したリダイレクトURI]&scope=https://www.googleapis.com/auth/drive&response_type=code&approval_prompt=force&access_type=offline

####６、ブラウザ上の認証ボタンを押す
認証ボタンをクリックして飛ぶと、ブラウザ上は何も表示されないが、
URL欄で認証コードが「〜code=」以下に示されているので、その部分をコピーする

####７、ターミナル上で４〜６で得たIDやキー等を用いて以下のようなコマンドを実行する
curl -d client_id=[４のクライアントID] -d client_secret=[４のクライアントシークレット] -d redirect_uri=[４のリダイレクトURI] -d grant_type=authorization_code -d code=[６の認証コード] https://accounts.google.com/o/oauth2/token

####８、json形式でアクセストークンとリフレッシュトークンが得られる
こんなかんじで結果が帰ってきます↓

{
"access_token" : "アクセストークン",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "リフレッシュトークン"
}

####９、終わり
後は４で得たクライアントIDとクライアントシークレット、
そして８で得たリフレッシュトークンの計３つを用意すれば
アクセストークンを毎回発行できるので、これをアプリの処理に組み込めば
自動的にOAuth2.0でログインする処理をアプリに実装できる
（Ruby上での処理方法を後日公開するかも）

##参考URL
https://www.eisbahn.jp/yoichiro/2011/10/oauth2-0_google-api.html
https://www.eisbahn.jp/yoichiro/2012/05/google_oauth2_web_server_profile_refreshtoken.html
http://tagamidaiki.com/ruby-google-drive-api-accesstoken/
Python で Project Euler #2「偶数のフィボナッチ数」

[Problem 2 「偶数のフィボナッチ数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202)

> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

```py:Python
fibs = [1, 2]
while True:
  next_fib = sum(fibs[-2:])
  if(next_fib <= 4000000):
    fibs.append(next_fib)
  else:
    break

result = 0
for i in fibs:
  if(i % 2 == 0):
    result += i
print result
print result == 4613732
```

```:結果
4613732
True
```
### 追記

リスト内包表記使うと result の部分が簡潔に書けるみたい。

```py:Python
result = sum([i for i in fibs if i % 2 == 0])
```
FactoryGirlで作ったデータで、時刻を比較すると一致しないことがある話

時刻を比較したとき、一見すると、何が違っているか分からなくて悩んだので、書く。

```rb
describe Item do
  let!(:item) { create :item, created_at: 1.day.ago }
  it { expect(Item.first.created_at).to eq item.created_at }
end
```

![1__tmux.png](https://qiita-image-store.s3.amazonaws.com/0/30755/ffd28ac2-a06f-6624-5df9-013b45104139.png)

### 原因はマイクロ秒

```rb
describe Item do
  let!(:item) { create :item, created_at: 1.day.ago }
  it { expect(Item.first.created_at.usec).to eq item.created_at.usec }
end
```

![2__tmux.png](https://qiita-image-store.s3.amazonaws.com/0/30755/3f14060f-1bae-dcf0-ac9c-a929a3199761.png)

DB から取り出したときマイクロ秒は`0`になるが、
`1.day.ago` の時点では、マイクロ秒は維持されている。

### `to_s` で渡すと良い。

直接SQLを使うときのように、文字列で渡すと上手くいった。

```
describe Item do
  let!(:item) { create :item, created_at: 1.day.ago.to_s }
  it { expect(Item.first.created_at).to eq item.created_at }
  it { expect(Item.first.created_at.usec).to eq item.created_at.usec }
end
```
最近SSHで作業するときにこれでもかと使っていても覚えられないターミナルコマンドの覚え書き


最近サーバーにAWSを利用する事も多くなってきてSSHを使ってターミナルでコマンドラインを打つ事が多くなってきたフロントエンドエンジニアが、これまで何度も使っているにも関わらずよく忘れてしまうコマンドをここに記す

## 基本

###サーバーの稼働状況を確認する

```Linuxコマンド
$ top
```
####参考
* [topコマンドの使い方](http://qiita.com/k0kubun/items/7368c323d90f24a00c2f)

-----

###ファイル/フォルダの所有者を変更する
```Linuxコマンド
$ chown ユーザー名:グループ名 ファイル名
```

####再帰的そのディレクトリの中身の所有者を変更する場合
```Linuxコマンド
$ chown -R ユーザー名:グループ名 ファイル名
```

####参考
* [【 chown 】 ファイルやディレクトリの所有者を変更する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230729/)

----

### ディレクトリのパーミッションを一括で変更する
```Linuxコマンド
find /path/to/dir -type d -exec chmod 755(パーミッション) {} +
```
####参考
* [ファイルやディレクトリのパーミッションを一括で置換したい](http://qiita.com/takeshi81/items/48ea62eae2fc7f1cb2f0)

----


###フォルダ丸ごとコピーする

```Linuxコマンド
$ cp -r コピーするフォルダ コピー時のフォルダ名
```

------

###サブディレクトリも一緒に作成する

```Linuxコマンド
$ mkdir -p フォルダパス
```

---

###ユーザーを作成する

```Linuxコマンド
$ adduser -u ユーザー -g グループ名 -d ホームディレクトリ -s ログインシェル ユーザ名
```



## Apache

###Apacheの起動・停止・再起動

```Apache起動
$ apachectl start
```
```Apache停止
$ apachectl stop
```
```Apache再起動
$ apachectl restart
```
####緩やかに再起動
サーバーをすぐに停止できないときはこちら。
クライアントの接続がなくなったら再起動する。

```Apache緩やかな再起動
$ apachectl graceful
```

###httpd.confのエラー確認
```Linuxコマンド
$ apachectl configtest
```

----

## git

###リモートリポジトリを作成する

```Linuxコマンド
$ git init --bare --shared=true
```

###差分を抽出してzipファイルで保存する

```
$ git archive [コミットID] `git diff --name-only origin/master [コミットID] --diff-filter=ACMR` -o [zipファイル名].zip
```

----


## MySQL

###MySQLに接続する

```Linuxコマンド
$ mysql -hホスト名 -uユーザー名 -pパスワード
```
####データベースを指定して接続
```Linuxコマンド
$ mysql -hホスト名 -uユーザー名 -pパスワード データベース名
```

###sqlファイルからデータベースをインポートする
```Linuxコマンド
$ mysql -hホスト名 -uユーザー名 -pパスワード データベース名 < インポートファイル.sql
```

###データベースをエクスポートする
###
```Linuxコマンド
$ mysqldump -hホスト名 -uユーザー名 -pパスワード データベース名 > 保存するファイル名
```

## PostgreSQL

###PostgreSQLにアクセスする

```Linuxコマンド
$ psql -U ユーザー名 データベース名
```

###sqlファイルからデータベースをインポートする

```
$ DB名=> \i /path/to/sql/import.sql
```

###データベースの操作を終了する

```
$ DB名=> \q
```
XmlDocument.DocumentTypeを変更する

XmlDocumentオブジェクトにある　DocumentTypeを変更したい場合は、そのnodeを置き換えなければならない。

```csharp
XmlDocument document = new XmlDocument();
document.Load( "test.xml" );

XmlDocumentType newType = new document.CreateType("new", "", "", ""); // 新しいDocumentType
XmlDocumentType oldType = document.DocumentType; // 古いDocumentType
document.ReplaceChild(newType, oldType);
```

のようにする。
ここで、DocumentTypeのNodeはElementsのNodeより先に配置されていないと、document.DocumentTypeでnullが返ってきてしまうようになる。
なので、RemoveChild(oldType) -> AppendChild(newType)という方法では、DocumentTypeのノードが最後尾に回されてしまうため駄目。
Git リポジトリ内の全履歴からパスワード を置換！ リポジトリの履歴を全て書き換えて無かったことにする


githubでリポジトリを眺めていると、パスワードらしき文字列がハードコーディングされていた場合の対処法です。


## 例:

### ファイル名 key.yml の中の「PasswordPassword1234」を「hoge」に全て置換する場合の例：

```bash:
 git filter-branch -f --tree-filter "find . -name key.yml  -exec sed -i -e 's/PasswordPassword1234/hoge/g' {} \;"  --prune-empty -- --all
```

### 全ての.goファイルを対象にする場合の例:

```bash:
 git filter-branch -f --tree-filter "find . -name '*.go'  -exec sed -i -e 's/PasswordPassword1234/hoge/g' {} \;"  --prune-empty -- --all
```

~~ちなみに`sed --in-place= `は置換前のバックアップファイルを作らないようにするための指定です~~ * sed -i だけでよかったです・・・。
[Rails 4.x] Devise の Omniauth で Facebook 認証時に App Not Setup: などのエラーが出る場合

# 前提

Linkedinの認証はうまくいくのにFacebook認証だけうまくいかなかったので、その時の対応策をメモします。

## 環境

個人環境: vagrant + centos65
開発環境: heroku
本番環境: heroku
Facebookアプリ作成アカウント: hoge@hoge.hoge

# コード

```rb:config/initializers/devise.rb
  config.omniauth :facebook,
                  Rails.application.secrets.facebook_app_id,
                  Rails.application.secrets.facebook_app_secret

  config.secret_key = Rails.application.secrets.devise_secret_key
```

```erb:config/secrets.yml
development:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  devise_secret_key: <%= ENV["DEVISE_SECRET_KEY"] %>
  facebook_app_id: <%= ENV["FACEBOOK_APP_ID"] %>
  fecebook_app_secret: <%= ENV["FACEBOOK_APP_SECRET"] %>
```

```rb:~/.zshrc
export FACEBOOK_APP_ID="hoge"
export FACEBOOK_APP_SECRET="hogehoge"
export SECRET_KEY_BASE="fuga"
export DEVISE_SECRET_KEY="fuga"
```

# エラー内容

```rb:ログ
Started GET "/users/auth/facebook"
INFO -- omniauth: (facebook) Request phase initiated.
INFO -- : Started GET "/users/auth/facebook/callback?code=mona&state=mona-"
INFO -- omniauth: (facebook) Callback phase initiated.
ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials: OAuth2::Error, :
{"error":{"message":"Error validating client secret.","type":"OAuthException","code":1}}
INFO -- : Processing by Users::OmniauthCallbacksController#failure as HTML
```

```rb:表示
ポップアップで、
App Not Set Up: The developers of this app have not set it up properly for Facebook login
と表示される。
```

# めんどくさい点

このエラーは認証をするユーザーのFacebookアカウントが、Facebookアプリ作成アカウントと同じ場合は起きない。（2014/11/1時点）

# 対応

# 1. Facebookアプリを公開設定にする

とりあえず、Facebook Developerにログイン。
対応するアプリのページヘ。

* Apps → Settings → Contact Email を入力
* Apps → Status & Review → Do you want to make this app and all its live features available to the general public? → YES に変更。

![Screen_Shot_2014-11-05_at_17_24_03.png](https://qiita-image-store.s3.amazonaws.com/0/18705/f651da11-1b29-22ae-03f4-ef09555ef473.png)


# 2. Privacy Policy URLなどを埋める

App Detailsでプライバシーポリシーが閲覧できるURLを設定します。
その周辺の欄も埋めておくといいのかも。

![Screen_Shot_2014-11-05_at_17_26_25.png](https://qiita-image-store.s3.amazonaws.com/0/18705/06c6867f-b3a6-4a13-eae1-c055260d7d2e.png)


ただ、この対応は必ずしも必要あるか不明。
Facebookアプリの管理画面でAlertが上がっているときだけ対応すればいいのかな？曖昧です。

# 3. Vagrantでは環境変数の参照をやめる

多分これが大きいのではないかと思われる。（私はこれで動作した）
config/secrets.ymlに直書きをする。
vagrant 環境以外では問題ないと思われる。

# 4. config/secrets.ymlを使わない。

よくあるマニュアルどおりに、config/initializers/devise.rbで対応。
vagrant だとここに直書きしないとうまくいかなかった。herokuでは動作した。（どうして？）



# 参考
* http://www.omnioo.com/record/sns/app-not-setup-the-developers-of-this-app-have-not-set-up-this-app-properly-for-facebook-login/
* http://stackoverflow.com/questions/21329250/the-developers-of-this-app-have-not-set-up-this-app-properly-for-facebook-login
OpenStack環境構築リンク集メモ（2014年11月）

CentOS7でOpenStackを構築する際に調べたまとめ。現在（2014年11月5日）は、RDOがRHEL7以降に対応したおかげでRDOで簡単に構築出来た。

>Red Hat Enterprise Linux (RHEL) 7 is the minimum recommended version, or the equivalent version of one of the RHEL-based Linux distributions such as CentOS, Scientific Linux, etc., or Fedora 20 or later

###自力系（yum等）

* （公式）OpenStack Installation Guide for Red Hat Enterprise Linux 7, CentOS 7, and Fedora 20  - juno http://docs.openstack.org/juno/install-guide/install/yum/content/index.html
* CentOS 7 : OpenStack Icehouse : 概要 ： Server World http://www.server-world.info/query?os=CentOS_7&p=openstack_icehouse&f=1

### RDO/PackStack

* （公式）Quickstart - RDO https://openstack.redhat.com/Quickstart
* OpenStack: Neutron ML2 の Driver を書いてみた | CUBE SUGAR STORAGE http://momijiame.tumblr.com/post/101252903916/openstack-neutron-ml2-driver
* TechOYAJI 2014 tokyo summer LT; CentOS7 and RDO Icehouse OpenStack http://www.slideshare.net/chroum/techoyaji-2014-tokyo-summer
　※この記事の時点（2014年7月）では、Cent7にはRDOが対応していなかった模様。

### Devstack

* （公式）DevStack - an OpenStack Community Production — DevStack e3822cf documentation http://docs.openstack.org/developer/devstack/
　※まだRHEL7に対応しているとは書かれていない。CentOS7等でうまく動作するかは不明。
フロントエンド作業時の仮WebAPIお手軽作成方法


ドーモ。サーバサイド苦手マン=サン。
サーバサイド苦手マンです。


AngularJSなどを使ってSPA形式のサイトを作る際に、特定のURLを叩いてjsonを取得する、ってことけっこうありますよね？
私はあります。

そして、フロントエンドの作業は進めたいけど上記を実現するWebAPIがまだ実装されておらずどうにも作業が進められない、ってこともけっこうありますよね？
私はあります。


そんなとき、適当な場所にjsonを置いて、もしAngularJSであれば単純に

```javascript
$http.get(...)
```

みたいな形で仮でjsonファイルを引っぱってくるものを作っといても良いんですが、WebAPIが完成してからコードを修正するのはけっこう手間だったりしますね。


ということで、サーバサイドをあまり触らない私が思いつきでrubyで仮のWebAPIを作っちゃおうと思ったら **びっくりするくらいに簡単にできちゃった**のでここで共有しておきます。


# レシピ

## 材料
* Ruby
* 適当に作ったjsonファイル
* [sinatra](http://www.sinatrarb.com/intro-ja.html) & [sinatra-cross_origin](https://github.com/britg/sinatra-cross_origin)

## 作り方

### Ruby
てきとーにググっててきとーにインストールしといてください。

### 適当に作ったjsonファイル
てきとーに作っておいてください。

### sinatra & sinatra-cross_origin
ここからが、今回の記事の肝になります。

とりあえず下記コマンドでインストールしておきましょう

```terminal
gem install sinatra
gem install sinatra-cross_origin
```

sinatraはruby触っている人には有名なWebアプリケーションフレームワークらしいです。(簡易版ruby on rails?)

これを使うと、例えば「あるURLにアクセスがあったさいにあることをする」ってのを簡単に記述できるってことで今回はこれを使ってみました。

詳しく説明せずとも、下記ソースを見ていただければわかりやすいかと。

```ruby:dummyApi.rb
require 'sinatra'
require 'sinatra/cross_origin'

configure do
  enable :cross_origin
end

# get
get '/api/hoge' do
  print 'get成功 /api/hoge'
  send_file 'data/hoge.json'
end

# post
post '/api/hoge/:id' do
  # とりあえず仮だし、ログだけ出しとけば良いんじゃないかな
  print "post成功 /api/hoge/#{params[:id]} : "
  print request.body.read
end

...
```

んで、ターミナルでこのファイルを動かしてあげればlocalhost:4567でサーバが立ち上がり、確認は簡単にできます。

```terminal
ruby dummyApi.rb
```

#### 簡単に説明

```ruby:dummyApi.rb
...

# get
get '/api/hoge' do
  print 'get成功 /api/hoge'
  send_file 'data/hoge.json'
end

...
```

/api/hogeにGETメソッドでリクエストを送るとdoからendまでのことをしますよ、ってだけです。(ここでは、ログを吐き出すのと、/data/hoge.jsonってファイルを返すことだけやってます。)

そんだけ。


#### これを忘れるとﾀﾋる

一点注意が必要で、dummyApi.rbの冒頭で

```ruby:dummyApi.rb
...

configure do
  enable :cross_origin
end

...
```

とやっているのは、これをやっておかないとフロントエンド大好きマンが大好きなgulp等で立ち上げたlocalhost:3000とかからここにアクセスする際に

```
XMLHttpRequest cannot load http://localhost:4567/hgoe. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
```

のエラーが発生するのを防ぐためです。
HTTP headerを書き換えるみたいな方法もありますが、素直にsinatra-cross_originを使っておいたほうが数倍楽かと。

# まとめ
普段からしっかりRubyとかを触っている方には何を今さら的な感じだったかと思いますが、フロントエンドしかほぼほぼ触ったことがない方々もこの世にはけっこう多いかと思います。
この記事がそんな方々の役に立てれば幸いです。
【AWS】ElastiCache Redisのパラメータグループの変更で再起動が掛かるのか不安だったので、検証してみた。


<!--OffMiddle-->
<img src="http://nikuniku.me/wp-content/uploads/redis.png" alt="Redis" title="redis.png" border="0" width="349" height="300" />
ElastiCache Redisを使用していて、AOFを後から追加したい！ってなった場合、パラメータグループを操作する必要があります。
この時に、Redisに再起動が掛かるのか不安になりましたので、検証しました。

もし仮に再起動が掛かると、AOFファイルからデータ復旧しようとするので、いま格納されているデータが消えてしまいます。
なので、検証方法を以下の手順で試してみます。

<ol>
	<li>AOF無しのElasitCacheRedisを作成</li>
	<li>幾つかデータを格納する</li>
	<li>AOF有りのパラメータグループを作成</li>
	<li>AOF有りのパラメータグループを設定</li>
	<li>データが入っているか確認</li>
</ol>

<h2>結論</h2>
先に結論から行くと<strong>再起動しません。</strong>よかったね。
バックアップウィンドを追加しても再起動しませんでした。
EC2上にRedisを構築したときは、AOFを途中から有りにする場合は、手順を間違うとAOFからデータ吸いだしてしまい、
データが消えてしまいます。
この辺りはAWSが良しなにしてくれているみたいです。

<h2>AOF無しのElasitCacheRedisを作成</h2>
m1.smallでRedis 2.8で構築。
パラメータグループはdefault.redis2.8を設定。

<h2>幾つかデータを格納する</h2>
まずEC2にRedisをインストールする。
こちらの記事を参考にしてサクっと入れました。あざす！
<a href="http://qiita.com/stoshiya/items/b8c1d2eb41770f92ffcf" target="_blank">AWS EC2にredisをインストールする</a>

データを格納
<code>
$ redis-cli -h ***********.apne1.cache.amazonaws.com
***********.apne1.cache.amazonaws.com:6379> set mykey myvalue
OK
***********.apne1.cache.amazonaws.com:6379> get mykey
"myvalue"
***********.apne1.cache.amazonaws.com:6379> set myhoge myhoge
OK
***********.apne1.cache.amazonaws.com:6379> get myhoge
"myhoge"
</code>
※当たり前ですがこの状態でリブートかけると、↑で入れたデータはきれいさっぱり消えました。


<h2>AOF有りのパラメータグループを作成</h2>
Create Cache Parameter Groupから新しいグループを作成。
appendonlyの項目をyesに変更。これでおｋです。

<h2>AOF有りのパラメータグループを設定</h2>
さきほど作成したパラメータグループをmodifyして、設定。
この時にstatusがmodifyになり、チェックボックスがグルグルになります。

<h2>データが入っているか確認</h2>
<code>
$ redis-cli -h ***********.apne1.cache.amazonaws.com
***********.apne1.cache.amazonaws.com:6379> get mykey
"myvalue"
***********.apne1.cache.amazonaws.com:6379> get myhoge
"myhoge"
</code>
おｋ！ちゃんとデータが入ってますね。
この状態で再起動しても、ちゃんとデータは残っていますので、安心。
ちなみにCache EventにはUpdated to use a CacheParameterGroup 【パラメータグループ名】となっていました。

<h2>こう思った</h2>
途中でパラメータグループを変更することが無かったので、気になって検証しました。
これで再起動して、AOFから復旧されたらたまったもんじゃないので^^;
最近では、Multi-AZ対応も入ったようなので、ますます便利になってきました。以前はスレーブも無かったので、EC2にRedisを入れて、それをスレーブとしてました。ちょっと懐かしいです。
jQueryを使う理由

自分なりに、まとめてみました。


## みんなが使っているから

jQueryに限らず、フリーで使えるものや便利なツールを選ぶときには、これが一番重要だったりします。
「みんな」というのは、それぞれ定義が違うと思いますが、「日本人」と置いてみると、日本語マニュアルが充実しています。その他にも、実用例や情報が豊富にあるため、何か困ったことがあっても、調べれば答えがどこかに落ちています。
また、使われなければ、更新する人も更新しなくなります。そうすると、最新のものとは合わなくなってきてしまい、他のものに乗り換えないといけません。そうなると、とても大変です。
「みんな」に使われているものであれば、日々更新され、ずっと使うことができます。

## 見やすい

ネイティブコードで書く場合

```
document.getElementById("test").innerHTML = "hello world!";
```

jQueryで書く場合

```
$("#test").text("hello world!");
```

ぱっと見で何しているのかわかるくらい、わかりやすくなります。
また、jQueryのセレクタは、cssのセレクタと共通のものも多いので、デザイナーさんにも優しいです。

## 短い

とても短くなります。
例えば、以下の2つのコードは、同じ処理をしているものです。

```
var targets = document.getElementsByTagName("p");
for(i=0; targets.length; i++){
  if(targets[i].className === "warning"){
    targets[i].style.color = "red";
  }
}
```

```
$("p.warning").css( "color", "red" );
```

後述する、クロスブラウザの対応などを含めると、もっと長いコードが、1行になることもあります。

## 基本的な機能が用意されている(クロスブラウザ・Ajaxなど)

### クロスブラウザ

ネイティブコードだけで書く場合、クロスブラウザを意識しなければなりません。
しかし、jQueryは意識することなく、書くことができます。

#### クロスブラウザとは

WebサイトやWebアプリケーションが、どのWebブラウザでも同じ表示、同じ動作を再現できる状態のこと。
ブラウザごとに、サポートしているものとサポートしていないものがあったり、解釈が違ったりするため、特定のブラウザではレイアウトが崩れてしまったり、思い通りにいかないことがある。
それに対応したHTML,CSS,JavaScriptのことをいう。
例えば、`document.getElementsByClassName`というメソッドは、IE8以下では、サポートされていない。

### Ajax

jQueryを使うことによって、Ajaxのコードは、かなり簡易に書くことができます。
また、ネットワークを介する呼び出しのため、煩雑になりがちなエラーをスマートに処理できます。

#### Ajaxとは

Webブラウザに実装されているJavaScriptのHTTP通信機能を使って、Webページのリロードを伴わずにサーバとXML形式のデータのやり取りを行って処理を進めていく対話型Webアプリケーションの実装形態のこと。
つまり、ページ全体を読み込む(ページ遷移する)のではなく、指定された部分だけデータを読み込み、更新する。
例えば、GoogleMapsは、地図の部分は、スクロールやドラッグにより、画面に表示されていない部分のデータを読み込んでいるが、周りのメニューなどは、リロードされない。

## プラグインが豊富

前述した、みんなが使っているから、というのが、まさにここに表れてきます。
みんなが使っているからこそ、様々な、豊富な数のプラグインがあります。
さらに、みんながよく使っているプラグインは、jQueryのバージョンが上がっても、プラグインも更新されていくことが多いです。
検索してみると、様々なオススメ・まとめのページがたくさん出てくるでしょう。
様々なものを簡単に実装することができます。

#### プラグインとは

jQueryの拡張機能のこと。
例えば、スライダーやライトボックスなどが、1行で書けるようになる。
様々な種類があり、また、カスタマイズや自作も可能である。