OmniAICreator/Qiita-1.07M huggingface dataset:
[rails]RailsでTwitterBootStrapを利用する

http://getbootstrap.com/getting-started/
からBootStrapをダウンロード

`dist/css/bootstrap.min.css`
↓
`vendor/assets/stylesheets/.`

`dist/js/bootstrap.min.js`
↓
`vendor/assets/javascripts/.`

`dist/fonts`
↓
`vendor/assets/.`

へそれぞれコピー

```:app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require bootstrap.min
//= require_tree .
```

```:app/assets/stylesheets/application.css
 *= require_self
 *= require bootstrap.min
 *= require_tree .
```

以上を追記しておしまい。
タイマー割り込み

タイマー割り込みみたいなものがないかと思って調べたのでメモ。

実装したいタイマー割り込みは、

+ 設定されている時間が経過したら、設定されているまたは特定のメソッドを呼び出す
+ 時間と呼び出し先は複数設定可能
+ 時間と呼び出し先は任意のタイミングで処理リストから外せる

といったところ。

## UE4の場合
UE4のタイマーは、TimerManager.SetTimerを利用する。(ブループリントからも利用可)

```cpp:settimer.cpp
  FORCEINLINE void SetTimer(
                UserClass* InObj, 
                typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod,
                float InRate,
                bool InbLoop = false, 
                float InFirstDelay = -1.f)
```

一番基本になるSetTimerの説明。(ソース内のコメント)

- 指定されたnative関数を指定された間隔で呼び出すようにタイマーをセットする
- もし、タイマーが既にdelegateに設定されているならば、新しいパラメータを設定して経過時間を0に再設定する。(タイマーを再起動する)

引数リストは、こんな感じ。
> InObj : タイマー関数がONになったとき呼ばれるオブジェクト
> InTimerMethod : タイマーの時間が来たときに呼ばれるメソッド
> InRate : 設定から動作するまでの時間。0以下では既存タイマーをクリア
> InbLoop : Trueなら一定間隔で動作させる、falseなら一度だけ起動
> InFirstDelay : 最初にタイマーが動くまでの待ち時間。マイナス値ならば、InRateを使う

Delegateを使うものはもう少し定義が簡単。(内部でDelegateの設定をしないから)

```cpp:settimer.cpp
	FORCEINLINE void SetTimer(
                     FTimerDelegate const& InDelegate,
                     float InRate,
                     bool InbLoop,
                     float InFirstDelay = -1.f)
```


SetTimerは、InternalSetTimerを呼び出すだけ。
Delegateを使う場合は、TimerManagerTests.cppのTimerManagerTest_ValidTimer_Delegateを参考にする。

```cpp:timerdelegate.cpp
    // void FTimerManager::InternalSetTimer(
    //                 FTimerData& NewTimerData,
    //                 float InRate,
    //                 bool InbLoop,
    //                 float InFirstDelay )
    FTimerDelegate Delegate;
    Delegate.BindRaw(&Dummy, &FDummy::Callback);
```

Delegateは(呼び出すクラス, 呼び出すメソッド)の形で設定する。

***

## Unityの場合

+ CoRoutineを…とか書いてあることが多い。(よくわからない)
+ DeltaTimeを使って、毎f呼び出されている間に実時間を測る(実処理時間)
+ MonoVehaviour.Invokeを使う(秒単位なら)

一番やりやすそうなのは、自分でクラスを作って時間と呼び出し先を管理する方式。
これは、UE4のTimerManagerの実装にも近いはず。
初期化の際にDelegateを受け取って、リストに登録する→経過時間を調べて呼び出すみたいなの。

C#にもDelegateという仕組みがあるのでそれを使うと呼び出しイベントの管理はやりやすそう。
delegate前置詞を置いた変数に関数を設定する。(Cの関数変数みたいなかんじか)

```cs:delegate.cs
  delegate void delegatefunction();
```

引数リストも宣言すれば引数を取れる。

.NETのC#では、スレッドセーフな関数呼び出しのためにInvoke(Control.Invoke)というメソッドがある。
MonoBehaviour.Invokeは、メソッドと呼び出し待ち時間を指定して、待ち時間が終わったらそのメソッドが呼ばれる。
UnityEvent.Invokeだと引数なしで、登録されているコールバックをすべて実行するらしい。
HTTPS環境下のJSでFacebook・Twitter・はてブのシェア数を取得する

Facebook・Twitter・はてぶのシェア数は、JSONPで取得することができるため、クライアント側のJSで各SNSのシェア数を表示するといったことができてしまう。Google+は、JSONPのAPIが無いため直接取得することはできないっぽい。

以下が各SNSからシェア数を取得する関数。Babelを使って、ES2015/ES7で書いてある。

また、HTTPSのサイトでもJSONPできるように各エンドポイントはhttpsを使っている。

```js:sns-shares.js
export function getFacebookShares(url) {
  const endpoint = "https://graph.facebook.com/?id=" + encodeURIComponent(url);
  return new Promise((resolve, reject) => {
    $.ajax({
      url: endpoint,
      dataType: "jsonp",
      success: (json) => json.error ? reject(json.error) : resolve(json.shares ? json.shares : 0),
      error: (err) => reject(err)
    });
  });
}

export function getTweets(url) {
  const endpoint = "https://urls.api.twitter.com/1/urls/count.json?url=" + encodeURIComponent(url);
  return new Promise((resolve, reject) => {
    $.ajax({
      url: endpoint,
      dataType: "jsonp",
      success: (json) => resolve(json.count ? json.count : 0),
      error: (err) => reject(err)
    });
  });
}

export function getHatenaBookmarks(url) {
  const endpoint = "https://b.hatena.ne.jp/entry.count?url=" + encodeURIComponent(url);
  return new Promise((resolve, reject) => {
    $.ajax({
      url: endpoint,
      dataType: "jsonp",
      success: (json) => resolve(json),
      error: (err) => reject(err)
    });
  });
}
```

使い方は、シェア数を調べたいURLを渡して`Promise`を受け取るだけ

```js:main.js
import {getFacebookShares, getTweets, getHatenaBookmarks} from "sns-shares.js";

const url = "http://qiita.com/suin/items/f570f057a0ff927b47dc";

getFacebookShares(url)
  .then((shares) => console.log(`facebook shares: ${shares}`));

getTweets(url)
  .then((tweets) => console.log(`twitter tweets: ${tweets}`));

getHatenaBookmarks(url)
  .then((bookmarks) => console.log(`hatena bookmarks: ${bookmarks}`));
```

実行結果

```
main.js:14 hatena bookmarks: 2538
main.js:11 twitter tweets: 165
main.js:8 facebook shares: 226
```
自分用のUbuntuのDockerイメージを作成

普通に`docker pull`でubuntuを持ってくるとwgetコマンドといったものを
使いたくても下記のように存在しないと言われるので、自分でいちいちインストールしなくてはならなくなります。
<pre>
root@3b11a262588c:/# wget
bash: wget: command not found
</pre>

１つのイメージで複数コンテナを立ち上げて使いたい場合は不便ですね。
それを解決するのが**Dockerfile**と**`docker build`**。
いくつか前の投稿にも登場した本家のサンプルにもありましたが、ようやくここで実運用に使えそうです。
ここでは、ubuntuのインストールとともに、wgetコマンドをインストールするようにしてみます。


## Dockerfileのカスタマイズ
* wgetをインストールするDockerfileを書く。

```
#利用するUbuntuのイメージ
FROM ubuntu:14.04　

# wgetをインストール
RUN apt-get update && apt-get install -y wget
```

## Ubuntuのビルド
* Dockerfileを元にイメージをビルド　（-t はタグ名)

```
$ docker build -t ubuntu1404 .

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu1404          latest              ebad5f439c3f        23 minutes ago      215.3 MB

```

## コンテナの起動
<pre>
$ docker run -it ubuntu1404
</pre>

## wgetの確認
* インストールされていることを確認

```
root@90644ea35001:/# wget          
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
```

このようにDockerfileはカスタマイズして自分専用のイメージを作成していくと便利になりそうです。
公式イメージが下記にあるので、参考にすると良いかもしれません。自分もこれから参考にしながら作成してみます。
https://github.com/docker-library
Spreeに「最近見た商品」エクステンションを追加する

## エクステンションの追加方法

これを使います。

[spree-contrib/spree_recently_viewed](https://github.com/spree-contrib/spree_recently_viewed)

インストールは簡単です。書いてある通り、Gemfileに以下を追記します。

    gem 'spree_recently_viewed', github: 'spree-contrib/spree_recently_viewed', branch: 'master'

インストールします。

    bundle install

```bash

$ bundle
Fetching git://github.com/spree-contrib/spree_recently_viewed.git
Fetching gem metadata from https://rubygems.org/.............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies...
Bundler could not find compatible versions for gem "spree_core":
  In snapshot (Gemfile.lock):
    spree_core (= 3.0.4)

  In Gemfile:
    spree_core (~> 3.0.0) ruby

    spree_recently_viewed (>= 0) ruby depends on
      spree_core (~> 3.1.0.beta) ruby

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```

ひゃあ...

よく見ると、spree_coreのβ版を要求してますね。最新版をインストールしようとしていたようなので、Spree本体のバージョンに合わせたものをGemfileに記述します。

    gem 'spree_recently_viewed', github: 'spree-contrib/spree_recently_viewed', branch: '3-0-stable'

`bundle install`が通りました。

なおこのエクステンションはDBをいじらないので、`rake db:migrate`等のコマンドは不要のようです。

サーバーを再起動すると。お、表示されていますねー

![CANON_EOS_Kiss_X7i_ボディ_-_Spree_Demo_Site.png](https://qiita-image-store.s3.amazonaws.com/0/7323/e2bfc0d1-3ee7-4491-717d-3b3dcec09135.png)

## 表示フォーマットを変更したい場合

表示を変更したい場合、エクステンションのビューファイルと同じパスのファイルをSpree内に作ってあげるとそちらが適用されます。

つまり、Spreeディレクトリに`app/views/spree/shared/_recently_viewed_products.html.erb`を作ればそこで自由にフォーマットを変更できるわけですね。

例えばそのファイルをこう書き換えてあげると

```erb
<% if cached_recently_viewed_products.any? %>
  <div id="recently_viewed" data-hook>
    <h3 class="product-section-title">最近見た商品</h3>
    <ul id="recently_viewed_products" class="list-group">
      <% cached_recently_viewed_products.each do |product| %>
        <li class="list-group-item">
          <%= image_tag product.images.first.attachment.url if product.images.first %>
          <%= link_to product.name, product %>
          <%= display_price(product) %>
        </li>
      <% end -%>
    </ul>
  </div>
<% end %>
```

こうなります。

![CANON_EOS_Kiss_X7i_ボディ_-_Spree_Demo_Site.png](https://qiita-image-store.s3.amazonaws.com/0/7323/d3619d93-bc9d-211c-7a24-4c820b8691b2.png)

## 表示件数を変更したい場合

デフォルトの商品表示数は5件です。この数字は、preferencesという機能で設定管理されています。

preferencesについては、こちらに公式ドキュメントを翻訳したものがあるのでそちらを見てみてください。

[[日本語訳] PREFERENCES - DEVELOPER GUIDE | SPREE COMMERCE](http://qiita.com/kamiya54/items/2c8e00ff384e89a86254)

Railsのイニシャライザーを使い、下記の通り設定してあげることで表示件数を変更することができました。私は`config/initializers/spree.rb`に追記しましたが、専用のファイルを作ってもよさそうです。

```rb
Spree::RecentlyViewed::Config.set :recently_viewed_products_max_count => 12
```

まだまだ日本語ドキュメントの少ないSpreeですが、使いこなせば効率的にEコマースサイトが構築できそうです。
Rootのないxmlを読み込んでパースする

あまりやることがないと思いますが、xmlの一部をパースしたい場合の対処方法です。

結論から言うと、streamをいじってダミーのrootタグを入れるだけです。

# テストデータ
こんなxmlの一部のようなファイルをロードするものとします。

```test.xml
<string name="app_name">Kotoha</string>
<string name="github_repo">GitHubリポジトリ</string>
```


# コード
IntelliJの `JDOMUtil` を使ったサンプルです。

```java
// xmlファイルを読み込む
InputStream fis = getClass().getResourceAsStream("test.xml");
// ダミーのルートを差し込む
List<InputStream> streams = Arrays.asList(
                                new ByteArrayInputStream("<root>".getBytes()),
                                fis,
                                new ByteArrayInputStream("</root>".getBytes()));
InputStream is = new SequenceInputStream(Collections.enumeration(streams));
// 読み込み & パース
doc = JDOMUtil.loadDocument(is);
```

ルートが含まれているかどうかの判定は別途必要ですが、これで一応パースできるようになります。
Rspec | should_receive は何をしている？

should_receive は、あるクラスのメソッドが呼び出されることを検証する。

### 成功

SomeModel.create が呼ばれることを期待する。

```rb
it do
  SomeModel.should_receive(:create)
  SomeModel.create
end
```

例として、ここでは直後に SomeModel.create を呼んでいるが。

たとえば他のメソッドの中や。コントローラの処理の中など。
どこからか一度でも SomeModel.create が呼ばれれば成功する。

### 失敗

should_receive の**前**にメソッドが実行されても意味が無い。

```rb
it do
  SomeModel.create
  SomeModel.should_receive(:create)
end
```

## .with

.with は、そのメソッドが、特定の引数をつけて呼ばれることを検証する。

### 成功する例

```rb
it do
  SomeModel.should_receive(:create).with)(title: 'Bible')
  SomeModel.create(title: 'Bible')
end
```
### 失敗

```rb
it do
  SomeModel.should_receive(:create).with)(title: 'Bible')
  SomeModel.create(title: 'Gone with the wind')
end
```

## 補足

should は古いので、　新しいバージョンでは expect を使うこと。
http://qiita.com/shuhei/items/58452ad1572b7e40c150



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
watchmanでkFSEventStreamEventFlagUserDropped警告が出たら

`react-native`で開発していたところ、`react-native start`を実行した後に`kFSEventStreamEventFlagUserDropped` という警告が出るようになりました。

以下のように一旦シャットダウンしたところ、とりあえず警告の発生は止まりました。

```shell-session
watchman shutdown-server
```
Linuxでのdiffの「改行文字の違いを無視する」は改行文字の違いを無視しないという勘違い 【--strip-trailing-cr】


# :ballot_box_with_check: 結論

Linuxでは改行は**LF**であり、**CR**は改行として扱わない(当然)
`diff`コマンドでは違いを行ごとに判定するが、
`--strip-trailing-cr`オプションで改行の違いを無視できる(という解説を目にする)。
しかし、依然として**CR**は改行扱いされず、
**CR**で改行されたファイルは、`diff`でうまく差分を取れない。
なので、`nkf`コマンドなどで、改行文字を置換しなければ、行単位での比較ができない。

ほんのすこし気合を入れて、`--strip-trailing-cr`という三単語を読み解けば、このオプションの正しい動作が読み取れる。

`--strip-trailing-cr`は決して、「Linuxでも**CR**を改行として扱えるオプション」ではない。
**LF**で改行されたファイルと**CRLF**で改行されたファイルを比較するためのオプションと覚えておくと吉。
というよりもmanの解説そのままで覚えるとなおいい。
そもそも、主語は「Linux」ではなく「比較する2つのファイル」である…


**CRのみ**を安易に改行と捉えるのは広義すぎて今回のような誤解を招く？

* [改行コード - Wikipedia]
* [キャリッジ・リターン - Wikipedia]


# <i class="fa fa-cubes"></i> 経緯

`wget`で取得したページの差分を定期的に取ろうとしたところ、差分がうまく取れていない。
違いがあることは検出できているが、どうやら対象行のみならず、
全体が異なると判定されているらしい。
すわ改行コードが**CR**のせいかと改行コードの違いを無視するオプションを付加するも、効果なし。
結局改行コードを**LF**に変換すると、無事差分を抽出できた。
が、なぜ改行コードの違い(≒**LF**でない)を無視できなかったのかと訝しむ。

# <i class="fa fa-file-text-o"></i> 参考記事

* [diffまとめ - Qiita]
> 改行コード無視してdiff

* [diffで改行コードを無視 - ひとりごと]
上記の引用元。こちらでは正しく**CRLFとLFの差分を無視したい**とある。

* [Vim - 改行コード、空白、改行を無視してdiffを取る - Qiita]
今読み返すと対象コードが**CRLF**だと読み取れるが、当時は思い至らなかった。
>改行コードを無視する

* [diffの改行コードとかを無視する．svnのdiffでも． - リジェクトされました]
>改行コードが違う
改行コードを無視する方法
改行コード無視オプションを使えばいいらしい．

* [diffで空行と改行コードを無視する方法 « for WEB屋] 
>diffで空行と改行コードを無視する方法

その他いろいろ

***

* [diff - コマンド (プログラム) の説明 - Linux コマンド集 一覧表]
* [Man page of DIFF]

>行末の CR を取り除く。 行末のマーカとして CRLF を使うシステムの出力を処理するときに役立つ。

公式(そのままのテキスト)が結局一番わかり易いという。

間違っている記事が多い、というわけではなく、一般認識として、
**改行コード ＝ LF と CRLF のみ**
という感じになっている気がする。
自身も今回はじめて**CR**ファイルを扱ったし。
よって、文脈として**異なる・無視**という言葉も、**CRLFである・CRを無視(してLFとして扱う)**と読まなければならない。

# <i class="fa fa-flask"></i> 検証

**CR**で改行したファイルの`diff`結果

```lang:b

a
b
c
d
e

```


```lang:B

a
B
c
d
e

```


```diff:WinMerge

@@ -1,5 +1,5 @@
 a
-b
+B
 c
 d
 e
\ No newline at end of file

```


```diff:linux_diff
# diff b B -u
--- b   2015-11-04 14:28:00.000000000 +0900
+++ B        2015-11-04 14:27:53.000000000 +0900
@@ -1 +1 @@
ea
\ ファイル末尾に改行がありません
ea
\ ファイル末尾に改行がありません

# diff b B -u --strip-trailing-cr
--- b   2015-11-04 14:28:00.000000000 +0900
+++ B        2015-11-04 14:27:53.000000000 +0900
@@ -1 +1 @@
ea
\ ファイル末尾に改行がありません
ea
\ ファイル末尾に改行がありません


```


[diffまとめ - Qiita]:http://qiita.com/koheiSG/items/e6a64a827db118b7f441
[diffで改行コードを無視 - ひとりごと]:http://d.hatena.ne.jp/youhey/20091028/1256748465
[Vim - 改行コード、空白、改行を無視してdiffを取る - Qiita]:http://qiita.com/richasonson/items/1ee589845bbbb4ff057a
[diffの改行コードとかを無視する．svnのdiffでも． - リジェクトされました]:http://ri.hateblo.jp/entry/2012/09/02/203235
[diff - コマンド (プログラム) の説明 - Linux コマンド集 一覧表]:http://kazmax.zpp.jp/cmd/d/diff.1.html#ah_3
[diffで空行と改行コードを無視する方法 « for WEB屋]:http://www.4web8.com/7585.html
[Man page of DIFF]:http://linuxjm.osdn.jp/html/gnumaniak/man1/diff.1.html
[改行コード - Wikipedia]:https://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89
[キャリッジ・リターン - Wikipedia]:https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%83%E3%82%B8%E3%83%BB%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3
TransmitMail 2 の送信メールの件名に POST パラメータを利用する

[TransmitMail 2](https://github.com/dounokouno/TransmitMail) の送信メールの件名に POST パラメータを利用するカスタマイズ例をご紹介します。

# 開発および動作確認環境

開発および動作確認環境は下記の通りです。

- TransmitMail: 2.0.0
- PHP: 5.6.10

# `input.html` に入力フィールドを追加する

`input.html` に下記のような入力フィールドを追加します。

```html:input.html
<table>
    <tr>
        <th>お名前</th>
        <td>
            <input type="text" name="お名前" value="{$お名前}">
        </td>
    </tr>
</table>
```

# `config.yml` を修正する

`config/config.yml` の `to_subject` は `お問い合わせ` とします。

```yaml:config/config.yml
config:
    to_subject: お問い合わせ
```

# `exTransmitMail.php` を作成する

`TransmiMail` クラスを継承した `exTransmiMail` クラスを `lib/exTransmitMail.php` に作成します。

```php:lib/exTransmitMail.php
<?php
class exTransmitMail extends TransmitMail
{
}
```

# `exTransmitMail` クラスに機能を実装する

メール送信の前の処理となる `afterSetTemplateProperty` メソッドを追加し、そこに処理を書いていきます。（ `afterXXX` メソッドについては [Wiki](https://github.com/dounokouno/TransmitMail/wiki/TransmitMail-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E5%90%84%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A1%8C%E9%A0%86%E7%95%AA%EF%BC%88v2%EF%BC%89) をご参照ください。）

```php:lib/exTransmitMail.php
/**
 * メール送信の前の処理
 */
public function afterSetTemplateProperty()
{
    if ($this->page_name === 'finish') {
        if (!empty($this->post['お名前'])) {
            $this->config['to_subject'] = $this->post['お名前'] . '様からの' . $this->config['to_subject'];
        }
    }
}
```

# `index.php` を修正する</h2>

`index.php` に `lib/exTransmitMail.php` の読み込みと `TransmitMail` クラスではなく `exTransmitMail` クラスを利用するように修正します。

```php:index.php
<?php
require_once 'lib/TransmitMail.php';
require_once 'lib/exTransmitMail.php';
$tm = new exTransmitMail('config/config.yml');
$tm->run();
```

# 動作確認

メールの件名に `お名前` の内容が入っていることが確認できました。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/3e5e217f-ac28-c105-5597-36d8fc3e0eb9.png)

# まとめ

以上、TransmitMail 2 の送信メールの件名に POST パラメータを利用するカスタマイズ例をご紹介でした。こんな感じでカスタマイズすることで、TransmitMail本体には手を加えずにカスタマイズすることが可能です。

今回のカスタマイズのコードは下記ブランチで公開をしています。

[dounokouno/TransmitMail at example_dynamic_mail_subject](https://github.com/dounokouno/TransmitMail/tree/example_dynamic_mail_subject)

修正ファイルは下記のコミットをご参照ください。

[送信メールの件名に「お名前」フィールドの値を挿入するカスタマイズ例 · dounokouno/TransmitMail@85d82f2](https://github.com/dounokouno/TransmitMail/commit/85d82f214684a90b4ddf53588ea0018b22065150)
特定のフォントで表示可能かどうか調べるのにAdobe Blankが使えたのでメモ

特定のフォントで環境依存文字が表示可能かどうかチェックするのに
Adobe BlankをいれてブラウザのデフォルトフォントをAdobe Blankにすることで
表示できない場合には空を表示してもらい表示可能か検証。
下記がフォントになります。
https://github.com/adobe-fonts/adobe-blank
[AWS] RDSスナップショットの別AWSアカウント共有機能の注意点

先日公開されたタイトルの機能

http://aws.typepad.com/aws_japan/2015/10/amazon-rds-now-supports-sharing-database-snapshots-across-accounts.html

**定期バックアップ**のスナップショットからは**共有できない**(Share Snapshotボタンが無効)ので、要注意！

定期バックアップから共有してデータ移行するから大丈夫とか余裕こいてて、できなくてスナップショット取得に時間がかかってメンテ時間オーバとかになりませんように！
Babel 6リリースで、ES7を使っているとwebpackが動かなくなる

10月30日にBabel 6がリリースされ、プラグイン化のためパッケージ構成が大きく変わったようです。これに合わせてES7などの構文もBabelのプラグインにりました。

僕のプロジェクトでは、Babel + webpackで開発していたのですが、この変更によりwebpackが動作しなくなってしまいました。



# どんな問題が起きているか？

webpackの設定は次のようになっていて、`babel-loader?stage=0`でES7の構文も有効にしています。

```js:webpack.config.js
module.exports = {
  entry: __dirname + "/src/js/main.js",
  output: {
    path: __dirname + "/dist/js",
    filename: "main.js"
  },
  module: {
    loaders: [
      {test: /\.js$/, loader: "babel-loader?stage=0"}
    ]
  }
};

```


この設定で、ビルドしようとすると「Unknown option: base.stage」というエラーになってしまいます。

```
Hash: 553345561044745134b3
Version: webpack 1.12.2
Time: 410ms
    + 1 hidden modules

ERROR in ./src/js/main.js
Module build failed: ReferenceError: [BABEL] /suin/Dropbox/open/infinite/src/js/main.js: Unknown option: base.stage
    at Logger.error (/suin/Dropbox/open/infinite/node_modules/babel-core/lib/transformation/file/logger.js:43:11)
    at OptionManager.mergeOptions (/suin/Dropbox/open/infinite/node_modules/babel-core/lib/transformation/file/options/option-manager.js:245:18)
    at OptionManager.init (/suin/Dropbox/open/infinite/node_modules/babel-core/lib/transformation/file/options/option-manager.js:396:10)
    at File.initOptions (/suin/Dropbox/open/infinite/node_modules/babel-core/lib/transformation/file/index.js:191:75)
    at new File (/suin/Dropbox/open/infinite/node_modules/babel-core/lib/transformation/file/index.js:122:22)
    at Pipeline.transform (/suin/Dropbox/open/infinite/node_modules/babel-core/lib/transformation/pipeline.js:42:16)
    at transpile (/suin/Dropbox/open/infinite/node_modules/babel-loader/index.js:12:22)
    at Object.module.exports (/suin/Dropbox/open/infinite/node_modules/babel-loader/index.js:69:12)
```

# 解決するために必要なこと

まず、Babelのプラグインを入れます。ひとつひとつ入れてもいいですが、es2015とstage-0があれば、"babel-loader?stage=0"と同等になるはずです。

```
npm install babel-loader babel-core babel-preset-es2015 babel-preset-stage-0 --save-dev
```

設定の書き方も変わったので、書き換えます。

```js:webpack.config.js
module.exports = {
  entry: __dirname + "/src/js/main.js",
  output: {
    path: __dirname + "/dist/js",
    filename: "main.js"
  },
  module: {
    loaders: [
      {test: /\.js$/, loader: "babel", query: {presets: ["es2015", "stage-0"]}}
    ]
  }
};
```

これでBabel6でもビルドできるようになります。
C > ビット演算 > sizedCopy_shifted() > MSBの位置を指定してコピー

http://qiita.com/7of9/items/4659da725d849eaf6b44
の続き

以下の指定をして変数から変数へ数値をコピーしたい

- コピーする数値の桁数指定 (例: 3桁)
- コピーする数値のMSB位置指定
  - コピー先のビットサイズ指定

http://ideone.com/BMTcWj

```cpp
#include <stdio.h>

void sizedCopy_shifted(int srcSize, int srcVal, int dstMSB, int dstSize, unsigned long *dstPtr)
{
	// dstMSB : [0..] index of dst MSB
	
	unsigned long mask = (1u << srcSize) - 1;
	int lsbPos = dstMSB + srcSize - 1; // LSB position of the srcVal
	int shift = dstSize - lsbPos - 1;
	unsigned long workVal;
	
	mask = (mask << shift);
	workVal = (srcVal << shift);
	*dstPtr &= ~mask;
	*dstPtr |= (workVal & mask);
}

int main(void) {
	unsigned long ulval = 0;

	//            srcSize, srcVal, dstMSB, dstSize, *dstPtr
	sizedCopy_shifted(3, 0x5, /* dstMSB=*/6, 10, &ulval); // to 0x0A
	sizedCopy_shifted(3, 0x4, /* dstMSB=*/3, 10, &ulval); // to 0x4A
	sizedCopy_shifted(3, 0x3, /* dstMSB=*/0, 10, &ulval); // to 0x1CA

	printf("0x%X", ulval);
	return 0;
}
```
Python2系と3系(Anaconda編)

# Pythonのバージョンによるパッケージの違い
Python3.5がリリース[^1]されました。Anaconda[^2]も対応したようです。
普段は、Anacondaを利用しているので、Anaconda上でパッケージがどのように変わったかを確認してみます。
まず、Anacondaのサイトからデータを取得してpandasの表にしてみます。

```py3:
import pandas as pd
from urllib import request
from bs4 import BeautifulSoup
with request.urlopen('http://docs.continuum.io/anaconda/pkg-docs') as fp:
    s = fp.readall()
bs = BeautifulSoup(s)
ls = bs.findAll('table', attrs={'class':'docutils'})
vers = [2.7, 3.4, 3.5]
res = []
for i in range(len(vers)):
    rows = ls[i].findAll('tr')
    for r in rows[1:]:
        t = r.findAll('td')
        res.append((vers[i], t[0].find('a').text, len(t[3].contents) > 0))
a = pd.DataFrame(res, columns=['ver', 'nam', 'ini'])
```

含まれているパッケージの数を見てみます。

```py3:
print('Number of supported packages:', a.groupby('ver').size())
>>>
Number of supported packages: ver
2.7    387
3.4    323
3.5    317
dtype: int64
```

初期インストール数を見てみます。3.4は対象外のようです。

```py3:
print('In intaller:', a[a.ini].groupby('ver').size())
>>>
In intaller: ver
2.7    168
3.5    153
dtype: int64
```

一旦、setにします。

```py3:
a27, a34, a35 = a.groupby('ver').nam
a27, a34, a35 = set(a27[1]), set(a34[1]), set(a35[1])
```

Python3系にあって2系にないもの。

```py3:
print('Only 3.X', (a34|a35) - a27)
>>>
Only 3.X {'blosc', 'xz'}
```

Python3.4だけのものは、無いようです。

```py3:
print('Only 3.4', a34 - (a27|a35))
>>>
Only 3.4 set()
```

Python3.5で増えたものも無いようです。

```py3:
print('In 3.5 but 3.4', a35 - a34)
>>>
In 3.5 but 3.4 set()
```

Python3.5で削られたパッケージ。

```py3:
print('Disappeared at 3.5', a34 - a35)
>>>
Disappeared at 3.5 {'yt', 'azure', 'bottleneck', 'llvmlite', 'numba', 'blaze'}
```

Python2.7にあって、Python3.Xにないもの。ただし、この中にはpipでインストールできるものもあるようです。

```py3:
print('Only 2.7', a27 - (a34|a35))
>>>
Only 2.7 {'starcluster', 'python-gdbm', 'mtq', 'traitsui', 'scrapy', 'graphite-web', 'casuarius', 'gensim', 'progressbar', 'ssh', 'grin', 'singledispatch', 'cheetah', 'llvm', 'protobuf', 'websocket', 'gdbm', 'faulthandler', 'gevent-websocket', 'dnspython', 'envisage', 'pyamg', 'py2cairo', 'pixman', 'hyde', 'vtk', 'python-ntlm', 'cdecimal', 'db', 'chaco', 'chalmers', 'mysql-python', 'paste', 'pep381client', 'mercurial', 'mesa', 'fabric', 'googlecl', 'ipaddress', 'apptools', 'gevent', 'bsddb', 'pysam', 'enaml', 'enum34', 'pysal', 'atom', 'supervisor', 'whisper', 'pil', 'ndg-httpsclient', 'essbasepy', 'cairo', 'enable', 'kiwisolver', 'traits', 'orange', 'uuid', 'opencv', 'pandasql', 'gdata', 'lcms', 'xlutils', 'pyaudio', 'pyface', 'ssl_match_hostname'}
```

docker hubのanaconda3[^3]も3.5に変わったようです。


[^1]: [Python 3.5 リリース](http://www.python.jp/news/python-3.5.html)
[^2]: [Anaconda Download](https://www.continuum.io/downloads)
[^3]: [continuumio/anaconda3](https://hub.docker.com/r/continuumio/anaconda3/)
入門チュートリアル　まとめ


世に出回っている入門チュートリアルをまとめて必要なときに参照できるようにしようと思います。（随時更新）

##いろいろ学べるWEBスクール (Codecademy )
https://www.codecademy.com/learn

##GoogleDevelopersのWEB開発GettingStarted!!
https://developers.google.com/web/tools/setup/?hl=en

##開発者向けのWeb技術 | MDN
https://developer.mozilla.org/ja/docs/Web

##NodeSchool(node)
http://nodeschool.io/ja/#workshoppers
SSLページでのformタグのactionに注意

# SSLページでのformタグのactionに注意

あるお客さんより、httpsのページでエラーが出ているというご指摘を頂いたのですよ。

で、firefox/IEで確認したところ何も問題なかったわけですね。

## で
**chrome**ですよ。

![1_1.png](https://qiita-image-store.s3.amazonaws.com/0/54588/40ce1418-31b2-f4ec-d9f3-7dc5a2f47e2d.png)

・・・ん？

![2_2.png](https://qiita-image-store.s3.amazonaws.com/0/54588/ee17fd10-ebb0-12d0-5e6a-6711b0e036df.png)


ほえ？

ちなみに、httpで画像やjsを読み込んでいるとか、証明書自体に問題があるとかそういうことはなかったです。

## 結論

```html
<FORM method="GET" action="http://www.google.co.jp/search" target="_top">
```
こんなの発見。ビンゴでした。Chromeこんなところまで見るのか・・・。
node.js 5.0.0でionic(cordova)が動かない件

node.jsを5.0.0にアップデートしてから`ionic build`や`ionic run`などが反応しなくなった。
必ずnode.js5.0.0になったら動かないのかはわからないが、他にも同じ現象が起きる人がいるらしい。

ちなみに`ionic info`は

```
Cordova CLI: 5.3.3
Gulp version:  CLI version 3.9.0
Gulp local:  
Ionic Version: 1.1.0
Ionic CLI Version: 1.7.7
Ionic App Lib Version: 0.6.3
ios-deploy version: 1.8.2 
ios-sim version: 5.0.3 
OS: Mac OS X El Capitan
Node Version: v5.0.0
Xcode version: Xcode 7.1 Build version 7B91b 
```

node.jsを4.2.2にダウングレードしたら解決した。

ダウングレードはnvm(https://github.com/creationix/nvm) を使った。

```bash
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh
$ nvm install 4
```

ダウングレード後の`ionic info`は

```
Cordova CLI: 5.3.3
Gulp version:  CLI version 3.9.0
Gulp local:   Local version 3.9.0
Ionic Version: 1.1.0
Ionic CLI Version: 1.7.7
Ionic App Lib Version: 0.6.3
ios-deploy version: 1.8.2 
ios-sim version: 5.0.3 
OS: Mac OS X El Capitan
Node Version: v4.2.2
Xcode version: Xcode 7.1 Build version 7B91b
```
GentooのGCCをUpgradeする

Gentooで、GCCをUpgradeしようとした時の手順。
コンパイルにすごい時間がかかるので、OSごとあげた方がいい？


```
$emerge =sys-devel/gcc-#{versioin}
$gcc-config -l
 [1] x86_64-pc-linux-gnu-4.5.4
 [2] x86_64-pc-linux-gnu-4.5.4-hardenednopie
 [3] x86_64-pc-linux-gnu-4.5.4-hardenednopiessp
 [4] x86_64-pc-linux-gnu-4.5.4-hardenednossp
 [5] x86_64-pc-linux-gnu-4.5.4-vanilla
 [6] x86_64-pc-linux-gnu-4.6.3 *
 [7] x86_64-pc-linux-gnu-4.6.3-hardenednopie
 [8] x86_64-pc-linux-gnu-4.6.3-hardenednopiessp
 [9] x86_64-pc-linux-gnu-4.6.3-hardenednossp
 [10] x86_64-pc-linux-gnu-4.6.3-vanilla
$gcc-config 6
$. /etc/profile
$gcc -v
....
gcc version 4.6.3 (Gentoo Hardened 4.6.3 p1.8, pie-0.5.2) 
```
OSX版 Intellij IDEA 15でのSpecial characterの取扱

<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#unnumbered-1">対象の方</a></li>
<li><a href="#unnumbered-2">どのような状況になっているか</a></li>
<li><a href="#unnumbered-3">なおしかた1 (制限付き)</a></li>
<li><a href="#unnumbered-4">なおしかた2</a></li>
<li><a href="#unnumbered-5">最後に</a></li>
</ul>
</div>
</div>


# 対象の方<a id="unnumbered-1"></a>

-   OSX版のIntellij IDEA 15
-   OSXのバージョンはEl Capitan
-   キーボードレイアウト、をUkeleleなどでSpecial characterを削除し使用されている方  
    具体的にはこちら記事 => [Macの特殊文字を無効化](http://qiita.com/watawuwu/items/37a6892eddb39b17025b)

# どのような状況になっているか<a id="unnumbered-2"></a>

Special characterの割当を削除したキーに、ショートカットを設定している場合、ショートカットが無効になってしまう。 
ex) 'Option + w'など  

# なおしかた1 (制限付き)<a id="unnumbered-3"></a>

キーボードレイアウトをカスタムした入力ソースを削除し、OSX標準の英数字レイアウトの入力ソースに戻す。
ただし、Dead keyは [本来の動作通り](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%82%AD%E3%83%BC) 、次の入力を待ってしまうようです。  

ex) 'Option + e'は、割当時には'⌥Dead Acute'として入力され、2回以上入力すると'⌥e'となる。 

# なおしかた2<a id="unnumbered-4"></a>

Dead keyのみを削除したキーボードレイアウトを作り適応する。 
作成方法はUkeleleがVer2時代のものですが、 [こちらの記事](http://qiita.com/watawuwu/items/37a6892eddb39b17025b) が参考になります。  
![image](https://qiita-image-store.s3.amazonaws.com/0/62029/b648e2ec-268f-dce1-03f1-1eb7c82aec4d.png)

# 最後に<a id="unnumbered-5"></a>

Intellij IDEA 15で変わった仕様だと思うんですが、IssueやBlogを軽く検索した限りだと見つかりませんでした。 
[この辺り？](https://youtrack.jetbrains.com/issue/IDEA-145960) とかのチケットが関連してるのかもしれませんが、keymap関連のチケットも含め更新されてないようでした。 
もしかしたら自分の環境が原因かもしれないので、自分と挙動が違うようでしたらご指摘ください！！
Git で force pull する方法 ( $ git reset --hard origin/branch_name ) 

`$ git push -f` は存在するが。
`$ git pull -f` は存在しない。

かわりに以下のようにすれば良い。

`$ git fetch`
`$ git reset --hard origin/branch_name`

## エイリアス登録

しておくと便利かもしれない。

(手軽に手元の状態を書き換えられてしまうので、注意)


`$ git force-pull` で登録するパターン

### `~/.gitconfig`

```bash
[alias]
current-branch-name = ! git branch | grep -e '^\\* ' | sed -e 's/^\\* //g'
force-pull = !git fetch && git reset --hard origin/$(git current-branch)
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Macでhostsファイルを変更・反映


## hostsを設定

hostsファイルを編集

````
sudo vi /private/etc/hosts
````

IPアドレスとホスト名を入力

````
111.222.333 www.hogehoge.com
````

## DNSキャッシュをリセット

### OS X Yosemite

OS X Yosemite v10.10.4

````
sudo killall -HUP mDNSResponder
````

OS X Yosemite v10.10 〜 v10.10.3

````
sudo discoveryutil mdnsflushcache
````

### OS X Mavericks、Mountain Lion、Lion

````
sudo killall -HUP mDNSResponder
````

### Mac OS X 10.6

````
sudo dscacheutil -flushcache
````
ActiveRecordの処理の委譲方法が多彩すぎる

[ruby on rails - RailsのActiveRecord::Relationのeachについて - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/18343/rails%e3%81%aeactiverecordrelation%e3%81%aeeach%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6)

[ruby on rails - I am looking for a source each of ActiveRecord. What is to_a? - Stack Overflow](http://stackoverflow.com/questions/33510469/i-am-looking-for-a-source-each-of-activerecord-what-is-to-a)

## 方法1
自前のdelegateというメソッドで頑張ってる

[rails/delegation.rb at 7b92798d2fee012bf683c513fb3864a9143a6f71 · rails/rails](https://github.com/rails/rails/blob/7b92798d2fee012bf683c513fb3864a9143a6f71/activesupport/lib/active_support/core_ext/module/delegation.rb#L56)

```
  # Methods can be delegated to instance variables, class variables, or constants
  # by providing them as a symbols:
  #
  #   class Foo
  #     CONSTANT_ARRAY = [0,1,2,3]
  #     @@class_array  = [4,5,6,7]
  #
  #     def initialize
  #       @instance_array = [8,9,10,11]
  #     end
  #     delegate :sum, to: :CONSTANT_ARRAY
  #     delegate :min, to: :@@class_array
  #     delegate :max, to: :@instance_array
  #   end
  #
  #   Foo.new.sum # => 6
  #   Foo.new.min # => 4
  #   Foo.new.max # => 11
```

## 方法2
ブロックが与えられたときは、Arrayのfindにする。
[rails/finder_methods.rb at 428d47adfed8d6aa7b21aec2bf5ad890961c9de3 · rails/rails](https://github.com/rails/rails/blob/428d47adfed8d6aa7b21aec2bf5ad890961c9de3/activerecord/lib/active_record/relation/finder_methods.rb#L64)

```
    def find(*args)
      if block_given?
        to_a.find(*args) { |*block_args| yield(*block_args) }
      else
        find_with_ids(*args)
      end
    end
```

たぶん、まだまだある。
google-api-ruby-clientのメモ

# 注意
Google-api-ruby-clientのバージョンアップ（0.9への）により、以下のサンプルは動かなくなっています。

# 認証の取り方
一回やったのに忘れたので、ダイジェストでメモる。

## 手順(超)概要
1. [Google](https://console.developers.google.com/)のAPI Manager から`クライアントID`と`クライアントシークレット`を取得（備考に図）
2. 以下の`プログラム1`を実行し、`リフレッシュトークン`を取得
3. 取得した`リフレッシュトークン`を使用し、`プログラム2`で永続的にアクセス

## プログラムサンプル


```ruby:プログラム1
require "rubygems"
require "google/api_client"
require "google_drive"

    # Authorizes with OAuth and gets an access token.
    client = Google::APIClient.new
    auth = client.authorization
    auth.client_id		= "xxx" # Use My Client ID
    auth.client_secret	= "yyy" # Use My Client Secret
    auth.scope = "https://www.googleapis.com/auth/drive.file"
    			# Use My Scope (about "Scope" see below.)
    auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
    
    print("1. Open this page:\n%s\n\n" % auth.authorization_uri)
    print("2. Enter the authorization code shown in the page: ")
    
    auth.code = $stdin.gets.chomp
    auth.fetch_access_token!
    access_token = auth.access_token
    refresh_token = auth.refresh_token

    session = GoogleDrive.login_with_oauth(access_token)

    puts "your access_token is:\n#{access_token}"
    puts "----"
    puts "your refresh_token is:\n#{refresh_token}"
    puts "----"

    session.files.each do |file|
        puts file.title
    end
    puts "----"

    puts "done!"
```

```ruby:プログラム2
    client = Google::APIClient.new("aaa") # Use My AppName
    auth = client.authorization
    auth.client_id      = "xxx"
    auth.client_secret  = "yyy"
    auth.refresh_token  = "zzz" # Use **THE** Refresh Token
    auth.scope = "https://www.googleapis.com/auth/drive.file"
    auth.fetch_access_token!
        
    # Creates a session.
    session = GoogleDrive.login_with_oauth(auth.access_token)
```

#備考
## Google Developer Console 画面
Google Developer Console API Manager
![02.png](https://qiita-image-store.s3.amazonaws.com/0/43829/e1275314-1565-e1a6-0f43-681dd80fdd33.png "02.png")


## auth.scope
`auth.scope`については、以下に詳しい。
https://developers.google.com/drive/web/scopes
irbでマルチバイト文字を扱う

## 背景
サーバ環境など、日本語環境が整っていない環境の場合、、irbでマルチバイト文字を扱うとエラーになる
（localeコマンドで LANG が設定されてなく、 posix になっているなど）

```
$ locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
```

VMやDockerなど他人の作ったイメージを利用するときは確認しておいたほうがいいかもです。


## エラーと対応方法

`rails console` などで `irb` を立ち上げておもむろに日本語文字列を扱おうとすると、、
`invalid multibyte char` というエラーが出ます。

```
irb(main):001:0> name = 'ほげ'
SyntaxError: (irb):1: invalid multibyte char (US-ASCII)
...省略
```


utf-8で扱うことが限定であれば、以下のように環境変数を設定した後に `rails console` を立ちあげれば、マルチバイト文字も使えることができます。

```
export LANG=ja_JP.UTF-8
```

という日本語オンリーの環境だと起こらないことですが、たまにハマってしまうのでメモ。
Rubyで名前付きキャプチャを使ってみる


Ruby初心者である私が、いろいろと奮闘している途中で学んだことその１。

正規表現で文字列を抜き出す際に名前付きキャプチャがすごい便利だった。
[ここに詳しく書いている](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fregexp.html)

例えば

```rb
test = '2015/01/01'
```

こんな日付があったとして、年月日を試しに正規表現で探してみる。

```rb
regex1 = /(\d{4})\/(\d{2})\/(\d{2})/
regex1 =~ test

puts $1 #=>2015
puts $2 #=>01
puts $3 #=>31
```

このように`$1`とか`$2`とかの特別な変数にマッチした順に値が入る。
名前付きキャプチャを使うことでより分かりやすくかけるようになる。

```rb
regex2 = /(?<year>\d{4})\/(?<month>(\d{2}))\/(?<date>(\d{2}))/
regex2 =~ test

puts Regexp.last_match[:year] rescue nil #=>2015
puts Regexp.last_match[:month] rescue nil #=>01
puts Regexp.last_match[:date] rescue nil #=>31
```

```
?<name>
```

とかで指定すると直後の括弧でくくった部分にマッチした場合、```name```という変数名に自動的にセットされる。

具体的な変数名で処理が書けるので見やすくなった。
RSpec実行順序に影響するテストをデバッグする

rspecで実行順序に依存してエラーが発生する場合、テスト実行時の **seed番号** を指定することで実行順序を固定することができる。
特定の失敗した時の **seed番号** をメモしておいて、コマンド実行時に指定することでその時の実行順序を維持してくれるので、デバッグが可能となります。

## 実行順序のデバッグ方法

### rspec実行後に以下のように最後に出力される **seed番号** を確認。

```
…省略
Finished in 1 minute 29.16 seconds (files took 11.54 seconds to load)
800 examples, 0 failures, 0 pending

Randomized with seed 1254  ＜＝この 1254が seed番号
```


### `rspec` コマンドのオプションで指定する場合

```
--order rand:[seed番号] 
OR 
--seed [seed番号]

(例)
bundle exec rspec spec/ --seed 12345
```

### `rake spec` コマンドを使用する場合のSPEC_OPTS環境変数を利用する

```
SPEC_OPTS="--seed [seed番号]"

(例)
SPEC_OPTS="--seed 12345" bundle exec rake spec
```

## 参考サイト

* [ランダムに落ちるspecの修正で便利だったRSpecの2つの設定 - There's an echo in my head](http://ikm.hatenablog.jp/entry/2013/03/26/003838)

* [`--order` option - Command line - RSpec Core - RSpec - Relish](https://relishapp.com/rspec/rspec-core/v/3-3/docs/command-line/order)

* [実用的な新機能が盛りだくさん！RSpec 3.3 完全ガイド - Qiita](http://qiita.com/jnchito/items/3a590480ee291a70027c)


## 関連するTips

### 実行順序とは違うのですが、rspecで特定のブロック（行数）を指定してテストを実行する方法

```123行目を実行する場合
bundle exec rspec spec/controllers/users_controller_spec.rb:123
```

### 順番に依存するテストでエラーが出るまで実行し続ける方法

ただのシェルのワンライナーですが、`bundle exec rspec spec/` コマンドを実行し続けてエラーが発生したら終了させる方法です。お昼行く前に流して返ってきたらテストが落ちているはず、、きっと。。

```bash:
while true; do bundle exec rspec spec/; if [ $? -ne 0 ]; then echo "Error"; break; fi done
```

以上、備忘録のため。。。
[C++] Use regular expression in  c++11

In c++11, we can use the regular expression to do something like matching.

Here is some code about how to use the regex in c++11.

```cpp
#include <iostream>
#include <regex>

using namespace std;

int main() {
    try {
        string input = "<file>abc.cpp</file>";
        regex re("<file>[\\w\\d]+\\.cpp</file>");
        smatch sm;
        if (regex_match(input, sm, re)) {
            cout << "Matched" << endl;
            for (auto s : sm) {
                cout << "[" << s << "]" << endl;
            }
        }
    } catch (const regex_error& err) {
        cout << err.what() << endl;
    }
    return 0;
}
```
【AWS】AMIからそのまま作成すると公開鍵ファイルにAMI時の情報がそのまま残っている

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

使用する環境（本番等と開発環境等）によってEC2の秘密鍵は使い分けとかされているでしょうか？

本番環境へのEC2の展開の仕方として、開発環境で一度作ったものをAMI化し、本番環境に作成するといった方法もあると思います。

このときなのですが、EC2作成中に本番環境用の秘密鍵をえらんだとしても、公開鍵ファイルには、検証の時に使っていたときの秘密鍵の公開鍵情報が残っています。

Amazon Linuxのec2-userの場合以下になります。
>/home/ec2-user/.ssh/authorized_keys

このままですと、秘密鍵は使い分けしていたつもりでも、じつは、開発環境で使用していた鍵がそのまま使えてしまうので気をつけないといけません。
windowsのphpでdbaseを使用する方法

#1. DLLのダウンロード
https://pecl.php.net/package/dbase/5.1.0/windows
から、環境に合った**DLL**をダウンロードしてきます。

#2.ファイルの設置
解凍したファイル(php_dbase.dll)を `c:/xampp/php/ext` (※デフォルト環境) に配置します。

#3. 設定
`c:/xampp/php/php.ini`に次を追加して、phpを再起動します。

```
extension=php_dbase.dll
```

#4. 完了
以上で、`dbase_open`などが使えるようになります。

## サンプルソース
```php
// 相対パスで記述する
$filename = "sample.dbf";

// read-only モードでオープンする
$db = dbase_open($filename, 0);

if ($db) {
  $record_numbers = dbase_numrecords($db);
  for ($i = 1; $i <= $record_numbers && $i<10; $i++) {
      $row = dbase_get_record_with_names($db, $i);
      var_dump($row);
  }
}
```

# 詰まった点
## php_dbase.dllが読み込まれない
**dll**のバージョンが違っていたり、`php/ext`の読み込みフォルダが違っていたりしました。

また、正しく読み込まれているかの確認は、次で行いました。

```
php -m | findstr dbase
```



# 参考
dbase関数など
http://php.net/manual/ja/book.dbase.php
Rails4にアップグレードするとLog4rでエラーになる

- Rails3.2系からRails4.0.13にアップグレードするとLog4rでエラーになる

```
[hoge@CS-c014 4.0_app]$ rs
=> Booting WEBrick
=> Rails 4.0.13 application starting in hogeopment on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
/home/hoge/.rbenv/versions/2.2.3/gemsets/4.0rails/gems/railties-4.0.13/lib/rails/commands/server.rb:78:in `start': undefined method `formatter' for #<Log4r::Logger:0x007f00bbcd6dc0> (NoMethodError)
        from /home/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/railties-4.0.13/lib/rails/commands.rb:76:in `block in <top (required)>'
        from /home/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/railties-4.0.13/lib/rails/commands.rb:71:in `tap'
        from /home/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/railties-4.0.13/lib/rails/commands.rb:71:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'
```

- railties-4.0.13/lib/rails/commands/server.rb
 - Rails.loggerにformatterメソッドが無くてエラーになっている
 - loggerは[Log4r::Logger](https://github.com/colbygk/log4r)を使っている

```server.rb
 77         console = ActiveSupport::Logger.new($stdout)
 78         console.formatter = Rails.logger.formatter
 79         console.level = Rails.logger.level
```

- config/initializersの下にlog_format.rbを作成し以下メソッドを書くとエラーにならなくなる。

```log_format.rb
class Log4r::Logger
  def formatter
  end
end
```

- 一時的な対処のような…後々問題出そう。もっといい方法がありましたら教えてください。
【vte.cx入門】2.ローカル環境でHTMLを編集する

アプリを効率よく制作する上で、開発環境を整えることは非常に重要なことです。
わざわざ編集したHTMLをその都度デプロイし、サーバーで変更を確認するといったフローは非常に煩わしく生産性に欠けます。
vte.cxではNode.jsの開発環境を利用することでローカル環境でも効率的な開発が可能です。

ここではその手順を以下に記します。

# 1. 開発環境の設定を行う

以下の記事で環境設定を行ってください。
[【vte.cx入門】1.アカウント登録〜Hellow Worldまで](http://qiita.com/takeyama/private/4ad7c3ac4f9e29694f37): 「環境を整える」の章を参照してください。

すでに開発環境が整っている場合は、この工程はスキップしてください。

# 2. ローカル開発環境を立ち上げる
以下のコマンドを実行し、ローカル環境を立ち上げてください。

```

gulp serve -h http://{自分のサービスドメイン}.1.vte.cx
```

（例） gulp serve -h http://demo.vte.cx

http://localhost:8000/login.html にアクセスすることでローカル環境のログイン画面に遷移できます。

# 3. ローカル開発環境でHTMLを編集する
前回の記事で「hellow_world.html」を作成しましたが、それをローカル環境で編集してみましょう。

```lang:hello_world.html
<!DOCTYPE html>
<html lang="ja-JP">
  <head>
    <title>Hello World<title>
  </head>
  <body>
    Hello World test    ← testと追記
  </body>
</html>
```

これを保存すると、更新を検知しブラウザが自動でリロードされ、更新内容が表示されます。
是非アプリ開発に役立ててください。

次回はアプリ開発のための下準備の記事です。
データをサーバに登録するためのスキーマ定義の仕方を説明したいと思います。

以上です。
バッチファイル(*.bat) を管理者として実行するための VBScript


```lang:runas.vbs
Set objShell=CreateObject("Shell.Application") 
   objShell.ShellExecute "cmd.exe", _
   """" & "/k e:\runas.bat" & """", _
   "", _
   "runas", _
   1
```


```lang:SYNTAX
Shell.ShellExecute( _
  ByVal sFile As BSTR, _
  [ ByVal vArguments As Variant ], _
  [ ByVal vDirectory As Variant ], _
  [ ByVal vOperation As Variant ], _
  [ ByVal vShow As Variant ] _
) As Integer
```
vOperation が肝で、ここに動詞"runas"を指定する。
JavaScript の Object を Ruby の Hash と同様に扱ってはいけない

JavaScript の Object を Ruby の Hash と同様に扱ってはいけない。下に Ruby のコードと Javascript のコードを書く。似ているが、これらは全然意味が違う。

```.rb
hash = {}
hash[Object.new] = 1
hash[Object.new] = 2
```

```.js
hash = {};
hash[new Object()] = 1;
hash[new Object()] = 2;
```

Ruby の方は２件のキーバリューが記録されるが、Javascript の方は最後に代入した１件のキーバリューしか記録されない。[MDN の Javascript ドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Property_Accessors) にはっきり書いてあった。

> プロパティ名は文字列でなければなりません。これは非文字列オブジェクトがオブジェクトのキーとして利用できないことを意味します。数字を含む全ての非文字列オブジェクトは、toString メソッドを通して文字列へ型変換されます。

JavaScript の Object を Ruby の Hash と同様に扱ってはいけない。気をつけよう。
Node.js の勉強 【Node.js インストール編】

# 概要
Node.jsに関することをシリーズ化して投稿していこうと思います。

# Node.js のインストール
node.js のバージョンの切り替えが簡単にできるように、NVM（Node Version Manager）をインストールする

■ nvmのインストール
git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh

■ インストールできるバージョンの確認
nvm ls-remote

■ インストール
nvm install 0.12.7

■ インストールできたか、またそのバージョン確認
node -v

■ デフォルトのバージョン設定
nvm alias default v0.12.7

■ 起動と同時にnvmが適用されるように.bash_profileの編集
vi ~/.bash_profile

■ 記述内容

```shell:.bash_profile
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```
↑ node.js の勉強と全く関係ないんですけど、、
.bash_profile の場合、マークダウンの「```○○○:.bash_profile」の○○○の部分なんて書けばイイんでしょうか？
誰か教えて下さい。

# 参考サイト
http://liginc.co.jp/web/programming/node-js/85318
http://nodejs.osser.jp/node/nvm/

以上
Google Container Engine と Kubernetes のドキュメントの読み進め方

**※本記事の投稿から半年以上経過し、リンクしてあるドキュメントの内容も多少再構成されているようですので、注意して下さい。**

Google Container Engine (GKE) を始めたのだが、どうも Kubernetes (k8s) のなんたるかがよくわからない。
色々と読み進めていくうちに、Google Container Engine 及び Kubernetes の、ドキュメントの並べ方がわかりづらくなっているように感じたので、読み進め方をメモしておく。

1. GKE: [Before You Begin](https://cloud.google.com/container-engine/docs/before-you-begin)
=====
コマンドラインツールのインストールや、Google Cloud Platform のセットアップなど。ここは難しくない。

2. GKE: [Hello Node](https://cloud.google.com/container-engine/docs/tutorials/hello-node)
=====

一通りデプロイの説明。Google Container Engine 特有の (Kubernetes 共通ではない) 操作である `gcloud container clusters create` コマンドを確認するためだけにやる。

取り敢えず Step 3: Create your cluster まで理解できれば良い。
それよりも後の `kubectl` を用いる部分は、他のクラウドも含め、操作は共通なので、次の Kubernetes 101 & 201 で確認すれば良い。

私は `kubectl` を使い始めた Step 4: Create your pod あたりからよくわからなくなってきた。
Pod などの概念の理解が十分でない上、`kubectl` が `docker run` のようにローカルで何かを構築しているのか、それとも Google Container Engine 上で何かを構築しているのかよくわからなかった。
(Step 3 までで、Google Container Engine を使用していることや、どのクラスターを使っているかを kubectl に伝えたようには見えないので、ローカルで動作をしていて然るべきだが、どうも妖精さんが勝手に設定してくれているようだ。)

3. k8s: [Kubernetes 101](http://kubernetes.io/v1.0/docs/user-guide/walkthrough/README.html) & [Kubernetes 201](http://kubernetes.io/v1.0/docs/user-guide/walkthrough/k8s201.html)
=====

チュートリアル。ここで Pod、Cluster、Resource Controller、Service など、Kubernetes の概念を理解する。

Google Container Engine でも Kubernetes でも、[Concepts](https://cloud.google.com/container-engine/docs/clusters/) の章が先にあり、ここで上記の概念が説明されているが、自然言語のみで説明されているので、コードを書きながら理解できる Kubernetes 101/201 の方が入りやすいだろう。
Concepts の章は、101/201 が終わった後、必要に応じて参照すれば良いかと思う。
karmaにsinon.jsいれて、fakeServerをつくる


##**<a href="http://blog.mmmcorp.co.jp/blog/2015/11/04/sinon/" target="_blank">概要</a>**

SPAのテスト用にAPIサーバーをモックしたいが、<a href="https://github.com/pgte/nock/" target="_blank">nock</a>のような感じでシンプルに実装したい(nockはブラウザ環境であるkarmaでは動かない)。

mochaを使うのも冗長なので、<a href="https://github.com/sinonjs/sinon" target="_blank">sinonjs</a>を使うことにした。


##**実装**

karmaのconfigにsinonを加える。これで、テスト内でsinonがグローバルで使える。

```js:karma.conf.js

...,
frameworks: ['jasmine', 'sinon'],
...,
plugins: [
  ...,
  require('karma-sinon'),
],
...,

```

テストコードは以下のように書いた。①から⑥の順番で処理が実行される。

③→④→⑤→⑥と処理が走るのがポイントで、`server.respond();`がasync関数のレスポンスを返し、⑤で実際のテスト、⑥でjasmineの非同期テスト終了関数`done`を呼び出している。

```js:test.js
import request from 'superagent';

describe('sinonjs', function() {
  let server = null;

  beforeEach(() => {
    // ①疑似サーバの生成
    server = sinon.fakeServer.create();
  });

  it('fakeServer', (done) => {

    // ②レスポンスの指定
    server.respondWith('GET', '/some/endpoint', [
      200, { 'Content-Type': 'application/json' }, 'res',
    ]);

    // ③リクエスト
    request
      .get('/some/endpoint')
      .end(function(err, res) {
        expect(res).to.be('res'); // ⑤実際のテストコード
        done(); // ⑥非同期テストの終了
      });

    // ④疑似サーバからレスポンスを返す
    server.respond();
  });

  afterEach(() => {
    // ⑦疑似サーバを破棄
    server.restore();
    server = null;
  });
});
```

##参考

* <a href="http://qiita.com/sasaplus1/items/5bec9f3da4b6439cc4c8" target="_blank">Sinon.JSのFakeServerでAjaxをテストする - Qiita</a>
* <a href="http://sinonjs.org/docs/#fakeServer" target="_blank">fakeServer - Sinon.JS Documentation</a>
* <a href="http://jasmine.github.io/2.3/introduction.html#section-Asynchronous_Support" target="_blank">Asynchronous Support - jasmine introduction.js</a>
homebrew-caskで独自リポジトリを作る

# リポジトリ作成
1. githubにリポジトリを作る
    - リポジトリ名は`homebrew-`プレフィクスを付けること
1. `Casks`というディレクトリを作り，その中にFormulaを置く
1. コミット&プッシュ

やってみた→ https://github.com/mystelynx/homebrew-tegaki-fonts

# リポジトリ使用
```sh
brew tap mystelynx/tegaki-fonts   # homebrew- プレフィクスは付けなくていい

brew cask install font-851tegaki_zatsu
```

かんたん!!
[cakephp3] Migrationコマンドまとめ

cakephp3にはPhinxのmigrationsがデフォルトで入ってます。
cakephp2の頃と比べると性質が異なるので使用できるコマンドまとめ備忘録。

## コマンド一覧

### `php bin/cake.php migrations `の場合

* `php bin/cake.php migrations create HogeHoge`  
「hogehoge」という名前のmigrationファイルの雛形を作成してくれます。
こんなの。引数はキャメルじゃないと怒られるよ!

```php
<?php
use Phinx\Migration\AbstractMigration;
class HogeHoge extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     */
    public function change()
    {
    }
}
```
* `php bin/cake.php migrations migrate`  
マイグレーションをDBに適用します。
何も指定しなければ最新状態まで。
`migrate -t [Migration ID]`で指定した段階まで適用します。
* `php bin/cake.php migrations rollback`  
マイグレーションを逆戻りします。
基本は一段階ずつ下がっていきます。
こちらも`rollback -t [Migration ID]`で指定した段階まで適用します。
* `php bin/cake.php migrations status`  
現在のマイグレーションとDBのステータスを表示してくれます。
こんな感じ、分かりやすいですね。

```
 Status  Migration ID    Migration Name
-----------------------------------------
     up  20151102022648  Initial
     up  20151102083415  AddPriceToDomains
     up  20151102085014  AddConfigToDomains
   down  20151102092745  HogeHoge
```

* `php bin/cake.php migrations mark_migrated`  
これが面白い。
`mark_migrated [Migration ID]`で指定したマイグレーションを**適用したこと**にします。
Cake側では適用したつもりですが、**DBには実際には反映されていない**状況になります。
たとえば、こんな状況で。

```
 Status  Migration ID    Migration Name
-----------------------------------------
   down  20151102022648  Initial
   down  20151102083415  AddPriceToDomains
   down  20151102085014  AddConfigToDomains
   down  20151102092745  HogeHoge
```

`php bin/cake.php migrations mark_migrated 20151102085014`で

こうなります。

```
 Status  Migration ID    Migration Name
-----------------------------------------
   down  20151102022648  Initial
   down  20151102083415  AddPriceToDomains
     up  20151102085014  AddConfigToDomains
   down  20151102092745  HogeHoge

```
DBを先にいじって後からMigrationを書いたときとかに使えそう。

### `php bin/cake.php  bake`の場合
bakeコマンドにも2つほどマイグレーションに関係するコマンドがあります。

* `php bin/cake.php  bake migrate`  
基本は前述の`create`と一緒。ただ引数はキャメルじゃなくでも大丈夫
それと例えば、
`php bin/cake.php migrations create AddConfigToDomains price:decimal`と打つと
以下のようなところまでひな形を作ってくれます。（複数には対応してないご様子。

```php
<?php
use Migrations\AbstractMigration;
class AddPriceToDomains extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
        $table = $this->table('domains');
        $table->addColumn('price', 'decimal', [
            'default' => null,
            'null' => false,
        ]);
        $table->update();
    }
}
```

* `php bin/cake.php  bake migration_snapshot`  
現在のDBの状況をそのままMigrationファイルにしてくれます。
Cakephp2のころの最初の`generate -f`と似ています。
しかし、本当にDBのそのままをMigrationファイルにするので、使えて最初だけかなと。
差分を取って、Migrationファイルを作ってくれたりはしません。
JavaScriptの条件演算子(三項演算子)メモ

自分用メモ。

# 参考

+ [条件演算子(三項演算子)](http://www.ajaxtower.jp/js/ope/index14.html)
+ [今更ながらJavaScriptの三項演算子を勉強してみた](http://d.hatena.ne.jp/replication/20100607/1276011372)

# 制御式

`条件式 ? 式1 : 式2`という形で書ける。

条件式には論理値または論理値に変換可能な値を記述します。論理式の結果がtrueの場合には式1が、falseの場合には式2が適応されます

# やってみる

Node.jsを使って確認します。

```index.js
// big
n = 20;
sign = n >= 0 ? 'big' : 'small';
console.log(sign);
```

```index.js
// 改行しても大丈夫。短いときは1行でそうでない場合、改行すると見やすい
n = 20;
sign = n >= 0 
  ? 'big'
  : 'small';
console.log(sign);
```

```index.js
// 式の部分に関数を実行するにように書いても大丈夫
n = 20;
n >= 0 ? console.log('big') : console.log('small');
```

```index.js
// 100
bool = true;
defaultValue = 100;

n = bool
  ? defaultValue || true
  : false;

console.log(n);
```

```index.js
// true.defaultValueがundefinedなのでtrueが設定される。関数で引数が設定されるか分からない場合などに設定しておくと良さそう
bool = true;
var defaultValue;

n = bool
  ? defaultValue || true
  : false;

console.log(n);
```

# 型ごとの条件式について

`if (x) ? console.log(true) : console.log(false);`というようにことを書く場合にxの型によって書く値が入ったときの条件判定が異なる。

[[JavaScript] null とか undefined とか 0 とか 空文字('') とか false とかの判定について](http://qiita.com/phi/items/723aa59851b0716a87e3)

+ undefinedはfalse
+ nullもfalse
+ 文字で空の場合にはfalse
+ 空の配列はtrue
+ 数値の場合には0はfalse、-1などはtrue
+ 真偽値のfalseはfalse
+ 空のオブジェクト({})はtrue

null,undefined,空文字列、falseでの利用ぐらいが良さそう。