OmniAICreator/Qiita-1.07M huggingface dataset:
オフラインリアルタイムどう書くF04の回答

当日参加できなかったため、後から解きました。
時間は30分程度でした。

```ruby:f04.rb
def solve( input )
  line = (0...8).each_with_object([]) { |pos, ret|
    ret << pos if (input.to_i & (1 << pos)) != 0
  }
  line << line.min + 8
  line.each_cons(2).map { |l, r|
    diff = r - l
    if diff == 4
      diff + 1
    else
      diff + 2
    end
  }.sort.join
end

def test( input, expected )
  actual = solve(input)
  if expected == actual
    puts 'OK'
  else
    puts 'NG: input = %s, expected = %s, actual = %s' % [ input, expected, actual, ]
    exit(1)
  end
end

test( "165", "3445" )
test( "80", "48" )
test( "255", "33333333" )
test( "68", "55" )
test( "200", "355" )
test( "82", "455" )
test( "164", "455" )
test( "73", "455" )
test( "146", "455" )
test( "37", "455" )
test( "74", "455" )
test( "148", "455" )
test( "41", "455" )
test( "38", "355" )
test( "76", "355" )
test( "152", "355" )
test( "49", "355" )
test( "98", "355" )
test( "196", "355" )
test( "137", "355" )
test( "19", "355" )
test( "20", "48" )
test( "9", "57" )
test( "209", "3345" )
test( "121", "33345" )
test( "239", "3333334" )
test( "26", "347" )
test( "111", "333344" )
test( "95", "333344" )
test( "85", "4444" )
test( "24", "39" )
test( "97", "347" )
test( "234", "33444" )
test( "59", "33345" )
test( "187", "333344" )
test( "34", "55" )
test( "249", "333335" )
test( "43", "3445" )
test( "143", "33335" )
test( "28", "338" )
test( "79", "33345" )
test( "173", "33444" )
test( "55", "33345" )
test( "77", "3445" )
test( "35", "355" )
test( "153", "3355" )
test( "30", "3337" )
test( "228", "3355" )
test( "177", "3345" )
test( "162", "445" )
test( "184", "3345" )
```
WindowsにてグループにRemote Desktopを許可するには

#背景
Windowsサーバにてあるグループを作成して、そのグループを「Remote Desktop Users」グループに追加しようとしたのですが、グループにグループを追加することはどうやら不可能らしいと。
そこで調べた方法を私的メモとして記載することにしました。

###前提
>OS：Windows Server 2012 R2
>言語：英語(日本語版の人は適宜翻訳して読み替えてね)

#とりあえずグループを作ろう
1.スタートメニューからAdministrative Toolsを開く
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/167392/3c58c09e-223d-8548-0938-9bc704ee861e.png)

2.Computer Managementを開く
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/167392/88b9b3df-f4cf-aba1-0300-48c97aaffc79.png)

3.左カラムからSystem Tools→Local Users and Groupsを→クリック
　New Group...を選択
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/167392/1ca14636-8233-d6c0-112a-08322cc520b6.png)

4.任意のGroup名をつけてCreate→Close
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/167392/4a242ed5-5610-7e11-5839-7e7a89da32b5.png)

これでグループは完成。あとは適当にメンバーを追加してね。

#作成したグループをRemote Desktop出来るようにする
1.先程開いたAdministrative ToolsからLocal Security Policyを開く

2.左カラムからLocal Policies→User Rights Assignmentを選択し、
　右のPolicy欄よりAllow log on through Remote Desktop Servicesを開く
![図5.png](https://qiita-image-store.s3.amazonaws.com/0/167392/9c8bc1f1-683e-44b6-9d8e-18c3a16a38f6.png)

3.Add Users or Groupsを選択する
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/167392/c6ef3859-6edf-a43b-3476-e248d13303bc.png)

4.Object Typesを選択し、Groupにチェックを入れる
![図7.png](https://qiita-image-store.s3.amazonaws.com/0/167392/63392c86-7668-3626-9447-b00c55759ab0.png)
![図8.png](https://qiita-image-store.s3.amazonaws.com/0/167392/59bd19e7-a8a3-74c7-8c18-729bbfdf1aa4.png)

5.Enter the object names to selectに先程作成したGroup名を入力し、Check Namesを選択すると自動的に表示ネーミングが変わる(なんでだろう？)
![図9.png](https://qiita-image-store.s3.amazonaws.com/0/167392/4d911de4-a469-495e-11da-39157779b831.png)

6.んでOKをクリックすると無事RDPできるグループに追加されましたとさ。めでたしめでたし。
![図10.png](https://qiita-image-store.s3.amazonaws.com/0/167392/967e4a5d-65c4-03bf-73fd-204088cd18c3.png)

#所感
Qiita登録してみたは良いけど書くことないし時間もないので、とりあえず手順メモ程度に使えればいいかなあと思い投稿してみました。
あとはスタバでMacいじってドヤ顔出来てよかったです。
Perl CGI 本当は怖い eval内のループ処理

Perlではよく例外処理の代わりにeval を利用していると思います。

私はいつもこんなコードを書いてCGIで実行していました。
※ひとまずコードへのツッコミは無しで＾＾

```Perl
eval {
	$sth = $dbh->prepare(
		"ほにゃららSQL"
	);
	$sth->execute;
	for(my $i=0; $i<$sth->rows; $i++){
		my @row = $sth->fetchrow_array;
		$data[$i]{id} = $row[0];
		$data[$i]{name} = $row[1];
	}
	$sth->finish;
};
```
このコードはSQLがエラー無く通った場合、何事もなく処理されます。
しかし、万が一、生成されたSQL文の文法エラーやMySQLサーバーの異常などで ``$dbh->prepare()`` が失敗した場合、どんなことが起きるかというと・・・

eval関数によってエラーが無視され、メモリを圧迫、放っておくとHTTPDのエラーログが膨大なサイズに膨れ上がって、しまいにはサーバーがダウンします。

<span class = "label label-default">こんなくだらないエラーログだけで28GBまで膨れ上がったerror.logファイル</span>
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/9610e8a2-909d-a527-cbf1-5ee33de68be8.png)

**原因は単純なコードミス**
何よりダメなのは``$sth->prepare``が失敗している可能性があるにもかかわらず、``$dbh->execute``して、さらにはforループの条件式に``$sth->rows``を参照している事。
しかし、``$sth->rows``は基本的に参照できないときには``-1``を返すので、固定SQLなどの絶対失敗しないSQLしかテストしていない場合、このエラーに気づくことはありません。

気をつけましょう。そしてみんなごめんなさい。<i class="fa fa-frown-o" aria-hidden="true"></i>
csprojベースのプロジェクトで単体テストが実行でき…なかった


# 環境
OS : 
    windows 10 Pro
Editor : 
    Visual Studio Code 1.11.2
plugins:
    C# for Visual Studio Code (ver. 1.8.1)
    
# 事象
csprojectベースの xUnit.NET の単体テストプロジェクトにて Code Lens の run test または debug test を実行しようとしても何も反応がない

# 原因
バグ・仕様

# 解決策
 C# for Visual Studio Code の拡張を最新版(1.9 or later)にアップデートしましょう。詳細は[こちら](https://github.com/OmniSharp/omnisharp-vscode/issues/1100)
 
 
 
 …先週からずーっとなんでだろうおかしいなぁって思っていたのだけれども、リアルタイムでやり取りされていたようです。
 上記ではWindows環境で確認していますが、macOSのほうでも正常動作は確認できています。
 
 …MSはなぜMSTestのほうもCodeLensのほうから単体テストのデバッグが実行できるようにしないのだろうか。
 ただ単純にMSTestの対応が間に合っていないだけと思いたいですね。
PythonとSeleniumを使用したドロップダウンメニューの取得して値をセットする

この記事はPython3.6.0とSelenium3.4.0(WebDriverはGoogleChrome)を使用しております。

ドロップダウンメニューの取得とセット方法で苦労しましたのでメモを残します。

# WebElementからSelectタグが扱える様にする


``` select.html

<select name=”color”>
<option value=”red”>赤</option>
<option value=”blue”>青</option>
<option value=”green”>緑</option>
</select>

```

と言うドロップダウンメニューがあるとします。

``` Select.py

# Selectタグが扱えるエレメントに変化させる為の関数を呼び出す
from selenium.webdriver.support.ui import Select

# 普通にエレメントを取得する
color_element = browser.find_element_by_name('color')

# 取得したエレメントをSelectタグに対応したエレメントに変化させる
color_select_element = Select(color_element)

# 選択したいvalueを指定する
color_select_element.select_by_value('blue')

```

この様に記述すると「青」が選択された状態になります。

# おわりに
最初はsend_keysで値をセットしようとして出来ず大いにハマリましたが、
キャスト（？）する必要があったとは思いもよりませんでした。
他にも特殊はタグはこうやってやる必要があるんでしょうね。
今のところ特に何かする予定は無いんですが自動化は楽しいですね。
React VRのサンプルを動かしてみる

React VRが今週リリースされたので試してみました。VR初心者です。

# 環境要件

* Node.jsのv6以上
* yarnまたはnpmのv3以上
* （ちなみにPCのchrome57.0.2987.133 で動作確認しています）

# 手順

[React VRのREADME](https://github.com/facebook/react-vr/blob/master/README.md)通りにやっていきます。

##### 1. お手軽に試すためにまずはCLIをインストールします。

```
$ npm install -g react-vr-cli
または
$ yarn global add react-vr-cli
```

##### 2. CLIを使ってプロジェクトの雛形を作ります。

```
$ react-vr init PROJECT_NAME
```

`PROJECT_NAME` には任意の名前を入れます。ドキュメントには書かれていませんがハイフンは使えませんでした。特にこだわりがなければ英数字だけにした方が無難だと思います。
また、（カレントパス上の）既存のディレクトリ名も指定できません。

##### 3. 作られたプロジェクトのディレクトリに移動して起動します。

雛形が作られ、Hello World的なものも作られているのでそのまま動かしてみます。

```
$ cd PROJECT_NAME

$ npm start
または
$ yarn start
```

##### 4. ブラウザで `http://localhost:8081/vr/` を開きます。

もしくはターミナルで `$ npm run open` を実行してもOKです。初回はビルドが走るため、表示されるまで時間がかかります。ターミナルで以下のように完了表示になるまで待ちましょう。

```
Bundling `xxx/vr/client.js`
  Transforming modules  100.0% (103/103), done.
```

##### 5. 以下のビューが表示されたら成功です。

PCブラウザで見ている場合は、ピンチイン/アウトやドラッグで視点を変えられます。

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/cfb96ab3-0576-b93f-51b3-3cfe53b1f35c.png)


# その他のサンプル

ここまではREADMEのままやってきましたが、[React VRのレポジトリ](https://github.com/facebook/react-vr)には他にもサンプルがあるので、これらも動かしてみます。

### 手順
##### 1. React VRのレポジトリをgit cloneするなりしてローカルに持ってきます。
##### 2. react-vr/Examplesディレクトリを新たに作ったプロジェクトディレクトリにコピーします。
##### 3. あとはブラウザからディレクトリ構造に合わせて `http://localhost:8081/Examples/Controller/vr/` のようにアクセスすればOKです。

たまにビルドエラーになりましたが、一度止めて`npm start`で再実行すれば正常にビルドできました。

### 画像で雰囲気だけ

##### Controller

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/0aa6b7b0-25bc-f053-62cd-0d47e8d97174.png)

残念ながらPCのChromeでは「No controllers」となってしまいました。
ソースコードを見ると、
React NativeのAPIを使用して、`NativeModules.ControllerInfo.getControllers()` と取得していました。
Oculus Riftなどのデバイスなら何か取得できるのかもしれません。

##### CylindricalPanel

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/a1ed4387-dbae-e0ca-99b3-44a7b3e8ff3f.png)

CylindricalPanelコンポーネントを使っています。
下側のReactアイコンはボタンになっていて、クリックするとボタンが大きくなったり戻ったりトグルします。

##### ModelSample

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/768755a0-3315-b193-1ca5-37f8122de5f9.png)

Modelコンポーネントを使っています。
Adobe Photoshop等で作るマテリアルファイルというもの必要なようです。このサンプルでは`ModelSample/static_assets/` に`creature.mtl` と `creature.obj`があります。

##### VideoSample

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/27c6f18a-e784-eca0-7d89-cfc5e292838a.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/05ef1605-ce94-f898-7402-c2229acec0c4.png)

Videoコンポーネントを使っています。HTMLのvideoタグと同じ感じでmp4とwebmファイルを用意しておいてデバイスの対応フォーマットに応じて選択しているようです。

##### VideoSample360

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/a16d90e5-f778-1e0e-7ba5-17f188b5eeae.png)

VideoPanoコンポーネントを使っています。
元のmp4ファイルはパノラマ動画になっていて、QuickTime Playerで再生すると↓のような感じです。

![image](https://qiita-image-store.s3.amazonaws.com/0/25588/76dba9b2-1327-f188-40f8-86eee04b34a6.png)


# その他のコンポーネント

[公式ドキュメント](http://facebook.github.io/react-vr/docs/getting-started.html)にはもう少しコンポーネントやAPIが載っているので試してみます。が、長くなったのでとりあえずここまで。
ブログのタイトル一覧をgistのシンタックスハイライト風に表示

## みなさんどう思いますか？

やっぱりどこが記事リンクなのかわかりづらいかな・・・ 
<img width="890" alt="スクリーンショット 2017-04-22 16.27.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/152484/8d2dea47-fbee-60be-c930-67a4208e5e64.png">

っていうかこういう投稿ってダメなのかな。
webpack2でfont-awesomeのscssが使えなかった→できた！

# webpack2でfont-awesomeのscssが使えなかった

仕組み的に、そうなんだろう......でも、やりたいことができないのがつらい。

→(2017-05-11追記)やっぱり回避策があった！そうよね。困るもんね。sass-loaderのところにも書いてあったよ......
　「resolve-url-loaderをかます」＆「?sourceMap指定をする」必要があるらしい。

```javascript
//変更前
        test: /\.scss$/,
        loaders: ['style-loader', 'css-loader', 'sass-loader'],
//変更後
        test: /\.scss$/,
        loaders: ['style-loader', 'css-loader', 'sass-loader?sourceMap'],
```

(追記ここまで)

## やりたいこと

・いろいろな、スタイルシートをscssでいろいろ変えたい！

ということで、こんな構成でやってみる。

```css:app.scss
/* ~ではいじめるとnode_modulesから引っ張ってこれる */
@import "~font-awesome/scss/font-awesome.scss"
```

```shell-session:ディレクトリ構成
+src/
  +css/app.scss
  +js/app.js
+node_modules/
  +font-awesome/
    +scss/
      +font-awesome.scss
    +fonts/
      +fontawesome-webfont.xxx
```

```js:webpack.config.js
module.exports = {
  context: __dirname + '/src',
  entry: {
    'app': './js/my.js',
  },
  output: {
    path: __dirname + '/public/js',
    filename: '[name].js'
  },
  module: {
    loaders: [
      { 
        test: /\.js$/, 
        exclude: /node_modules/, 
        loader: 'babel-loader', 
        query:{
          presets: ['es2017']
        }
      }, {
        test: /\.css$/,
        loaders: ['style-loader', 'css-loader'],
      }, {
        test: /\.scss$/,
        loaders: ['style-loader', 'css-loader', 'sass-loader'],
      }, {
        test: /\.(otf|eot|svg|ttf|woff|woff2)(\?.+)?$/,
        loader: 'file-loader?name=[name].[ext]',
      }
    ]
  }
};
```

## 結果

そうね。そんなところにはないからね......

```shell-session
ERROR in ../~/css-loader!../~/sass-loader/lib/loader.js!./css/my.sass
Module not found: Error: Can't resolve '../fonts/fontawesome-webfont.svg?v=4.7.0' in 'C:\projects\webapp\src\css'
 @ ../~/css-loader!../~/sass-loader/lib/loader.js!./css/stylesheet.sass 6:759-810
 @ ./css/stylesheet.sass
 @ ./js/app.js
```

## 原因

* css-loader(sass-loader)では、requireされたファイルからの相対パスとして扱う。
* css-loader(sass-loader)では、importされたcss・sassファイルをその中にフラットに展開する。

このため、今回の場合は、src/css/my.sassからたどったので、たとえnode_modulesから引っ張ってきても、src/css/からの相対パスとして扱う。

## 対策

1. jsからrequireする。
2. fontsを適切なディレクトリ(src/fonts)にコピーしておく。

でも、

1. まとめて一気に指定とか、参照とかしたいのに、できない。
2. そうなの？？？node_modulesでそのまま使えるのがいいんじゃないの？？？

## 感想

仕様的には当然の結果。であろう。でも、不便じゃない？？？
まあ、ここまで納得するまで、いろいろはまったんだけど、どうも回避できない。
font-awesome用のloaderを作るとか？でも、ほかのnode_modules経由でも同じことよね。
resolve.moduleとかmodule.aliasも効いてくれないみたい。

どうにかならんか？とソースも見てみたけど、何やら異様に凝っててよくわからない......
RailsにおけるActive Record依存の解消の手順

# 前書き　〜なぜActive Recordを取り除くのか〜
Active Recordパターンにはいくつかの課題が存在します。

・アプリケーションのデータ構造とテーブル構造が実質上同一となる

・モデルの役割が多岐に渡る

・Fatモデルになる（永続化のための処理もあれば、データを修飾する役割もあれば、ビジネスロジックもある）

・StrategyパターンやCompositeパターンなどプログラミング、設計のテクニックを適用しにくい

・MVCパターンを、CかMかという分類だけで分けていくと自ずと行き着く課題で対策が必要

これらを考えたときにActive recordに依存しないような設計でアプリケーション開発する必要が出てくる可能性も考えられます。今回はそうなったときにどのファイルを消したり編集したりすればActive Record依存の解消ができるのか手順の方をご紹介致します。


＊筆者はまだまだ未熟者でありますのでもし間違い等ございましたらぜひともご指摘の方よろしくお願い致します。。


## modelの削除
まずはapp/models/配下にあるファイルを全て消してしまいましょう。Active recordに依存しない限りモデルを扱うことはございません。


## config/environments/development.rb
```config.active_record.migration_error = :page_load```と書かれているこの一行をコメントアウトしましょう。



## config/environments/production.rb
```config.active_record.dump_schema_after_migration = false```と書かれているこの一行をコメントアウトしましょう。


## config/initializers/new_framework_defaults.rb
```Rails.application.config.active_record.belongs_to_required_by_default = true```と書かれているこの一行をコメントアウトしましょう。


## config/application.rb
最後に以下三行をコメントアウトしましょう。

```
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
```


以上でActive record依存の解消はできたと思います。railsｓも問題なくできるかと思います。


# ROM(Ruby Object Mapper)の活用
今回筆者がなぜActive recordの依存を解消したかったのかというとROMというgemを扱ってDBとの接続を行いたかったからでございます。以下ROMを取り入れた設定を追記致しますので興味のあります方はぜひ参考までにご覧くださいませ。

ROMにつきまして、くわしくは以下の公式ドキュメントをご参考ください。
http://rom-rb.org/


## Romのインストール
Gemfileにて以下三行を追記してbundle installしましょう。

```
gem 'rom-rails'
gem 'rom-sql'
gem 'rom-repository'
```

## initializerの作成
config/initializers配下にrom.rbというファイルを作成して下記のように内容を編集しましょう。

```rom.rb
ROM::Rails::Railtie.configure do |config|
  config.gateways[:default] = [:sql, 'DATABASE_URLをここに記述']
end
```

## config/database.ymlなど利用されていない設定ファイルがあり分かりづらい
database.ymlは削除してしまいましょう。


上記が終わりましたらrails sをしてウェルカム画面が表示されているかどうか確かめてみましょう。

以上で今回は終わりますがRomについてはまだ続きの設定が存在します。次回はRomのセットアップについてもっと詳しく書いてみたいと思いますが英語が読めれば自分でもセットアップできますのでぜひお試しくださいませ。
http://rom-rb.org/learn/getting-started/rails-setup/
Centos7  での初期設定（ネットワーク編）

#環境

macbookにvirtualBoxをインストールしてCentos7のイメージで起動しました。
ここら辺の手順は省略します。


```
>cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
```

##ipアドレスの設定（非推奨）

centos7より設定ファイルをそのまま修正することが非推奨となったらしいのですが
こちらに慣れてしまっているので一応記載しておきます。
まずは仮想マシンのipアドレスを設定します。

```
>vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
```
centos7ではenp0s3という名前のデバイスがありましたのでこちらを編集していきます。


初期値

```
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=768d9080-3534-4357-b3c3-bbe969e5e1fe
DEVICE=enp0s3
ONBOOT=no
```


設定変後

```
TYPE=Ethernet
BOOTPROTO=none  #noneに変更
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=768d9080-3534-4357-b3c3-bbe969e5e1fe
DEVICE=enp0s3
ONBOOT=yes  #yesに変更

#以下追記(環境に合わせてください)
IPADDR="192,168.100.100"
NETMASK="255.255.255.0"
GATEWAY="192.168.100.253"
DNS1="192.168.100.253"
```

ネットワーク設定を反映させるため以下コマンド実行

```
systemctl restart NetworkManager
systemctl restart network
```

また、VirtualBoxのネットワーク設定ではネットワークアダプタがデフォルトでNATになっているのでブリッジアダプタに変更するとterminalから接続ができるようになります。

##ipアドレス設定（推奨）

centos7(rhel7)よりnmcli nmtui(NetworkManager text user interface)コマンドを使用してip設定をすることが推奨されているみたいなのでそちらの設定方法も記載します。


###nmcli編

```
nmcli c mod enp0s3 ipv4.method manual ipv4.addresses "192.168.100.100/24 192.168.100.253"
```

書き方としては

```
nmcli  c mod <ip設定モジュール> ipv4.method manual ipv4.addresses "<設定アドレス>/<サブネット> <ゲートウェイ>"
```

となります。

(20170506追記)
上記コマンドで設定できなかったので追記します。
[こちら](http://qiita.com/yunano/items/88a6e46b412d3be1d3ec)を参考にさせていただきました。

```
nmcli c mod enp0s3 ipv4.method manual ipv4.addresses 192.168.100.100/24 ipv4.gateway 192.168.100.253
```
書き方は

```
nmcli c mod enp0s3 ipv4.method manual ipv4.addresses <設定アドレス>/<サブネット> ipv4.gateway <ゲートウェイ>
```
ipv4.gatewayプロパティを追加する必要があります。


続いてDNS設定

```
nmcli c mod enp0s3 ipv4.dns 192.168.100.253
```

ドメインがある場合は以下も追記します。

```
nmcli c mod enp0s3 ipv4.dns-search hogehoge.com
```

ipアドレスの設定で一気に設定することも可能です。

```
nmcli c mod enp0s3 ipv4.method manual ipv4.addresses 192.168.100.100/24 ipv4.gateway 192.168.100.253 ipv4.dns 192.168.100.253 ipv4.dns-search hogehoge.com
```
最後にネットワークのリスタートでipが変更されます。

```
systemctl restart NetworkManager
systemctl restart network
```


###nmtui編

こちらは非常にわかりやすい画面が出てくるのでそれに沿って設定していくだけなので
初心者の方はこちらを使うとわかりやすいかと思います。

```
>nmtui
```


#結論
今までのコマンドでの設定で慣れていたのでnmcli nmtuiコマンドで設定に少し抵抗があります。
ファイル編集の方が早いしなぁ。


以上
Macでメモリの空き容量が足りなくなったのでpurgeコマンド


最近DockerとPhpStormを立ち上げているからかよくメモリが足りなくて強制終了しろ！と言われることが増えた。
使用しているMBPが2013年のものだし、結構あれやこれやとアプリケーション入れてるのでそのせいという気もする。

# TL;DR

1. まずメモリ状態を確認
2. メモリの空き容量が少ないことを確認
3. ```purge```コマンドを実行
4. メモリの空き容量が増えていることを確認

# 対象読者 or 前提条件 or 環境

<img width="587" alt="スクリーンショット 2017-04-22 15.17.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/18493/45a15df8-a67e-1af9-9f11-d0f5685d84a1.png">


環境は↑
状態としては16GBあるメモリが11GB使用中で4GBほどキャッシュしている、みたいな状態。
ChromeとDockerとPhpStormの使用サイズがそれぞれ1GB以上でデカかったのは記憶してるがキャプチャし忘れたため詳細は不明。

# まずメモリ状態を確認

- [OSXでコマンドラインからメモリ使用量を調査する](http://geta6.hatenablog.com/entry/2012/10/13/102444)

↑を参考にメモリ使用量を調べる。

# ```purge```コマンドを実行

[Macの容量不足に悩まされた話](http://mako-wis.hatenablog.com/entry/2014/02/15/053547)を過去に読んでいたので「もしかして再起動すれば直るのでは？」と思いつつも今回はメモリだし普通に考えればキャッシュをクリアする方法があるはず！と考えて調べたら↓の記事をみつけた。

- [purgeコマンドでMacのメモリを確保する](http://qiita.com/suzuki_sh/items/8af3b0d3c5453f7608bb)

一応```man```コマンドで```purge```コマンドについて調べたが問題なさそうだったので実行。
その後メモリの空き容量を確認したところきちんと増えていることが確認出来たのでOK！

# あとがき

昔MBPを買うときに内心「16GBもメモリいらないだろうな」と思いつつも「PCにメモリは載せれるだけ載せろ！」という格言にしたがったが圧倒的に正しかった。
そしてこれを書いている最中に自宅のネットワークのトラブルが発生してクソ大変だったということを書き記しておく。
きちんとネットワークの調査して快適なインターネッツ生活を送れるようにしなければ…。
一般提供されたAmazon Lexを試してみました

#はじめに

AI TOKYO LAB技術チーム（非公式）の小野＆鈴木です。これから気が向いた時にAIに関するサービスやライブラリを実際に触ってみてその感想等をゆるめに書いていこうと思います。不定期＆非公式なのであまりご期待なさらずに。

[2日前に一般提供開始](https://aws.amazon.com/jp/blogs/news/amazon-lex-now-generally-available/)された[Amazon Lex](https://aws.amazon.com/jp/lex/)を使ってみました。Amazon Lexは自動音声認識と自然言語理解の技術を使って

>非常に魅力的なサービスと生き生きとした音声対話を実現するアプリケーション

（要するにチャットボット）を構築できます。

今回は音声認識の機能は試しませんでしたが、チャットボットを構築してみました。

自然言語理解と言っていますが、基本的にはIBMのWatosonと同じ技術を使っているようです。対話のパターンをあらかじめ登録しておいて、ユーザーの発話文中の特徴語（book, appointmentなど）から、特定の対話パターンに遷移します。それ以降の対話は、ボットがユーザーに特定の情報を聞き出すように誘導します。ボットの発話文や、聞く内容なども目的に応じて設定しておきます。

以下、構築手順を紹介します。

#試してみた

上部メニューの「サービス」->「人工知能」->「Lex」を選ぶと下のような画面になります。自分でゼロから作成することもできますし、３つあるサンプルから選んでテストすることもできます。

![名称未設定1.png](https://qiita-image-store.s3.amazonaws.com/0/177576/9e936769-7754-8ae2-65b7-9b2914c0320d.png)

今回は「BookTrip（旅行の予約）」ボットを試してみます。

しばらくするとボットが作成されるので右下のテスト用チャット枠でさっそく試してみます。水色がユーザの発話、グレーがLexの応答です。

![名称未設定2.png](https://qiita-image-store.s3.amazonaws.com/0/177576/c9277ce4-bab3-bd27-ae21-018b754bcc29.png)
![名称未設定3.png](https://qiita-image-store.s3.amazonaws.com/0/177576/736cd9cd-e0e8-f64f-d50b-b23719c97d99.png)
![名称未設定4.png](https://qiita-image-store.s3.amazonaws.com/0/177576/8515027b-a79c-84b6-6abb-e57142a5208f.png)
![名称未設定5.png](https://qiita-image-store.s3.amazonaws.com/0/177576/329aea8e-2210-a7d7-abb8-888a3fc19ab8.png)

このように予約用の対話ボットができていることがわかります。typoした時に全く同じことを聞き返されているなどツッコミどころはありますがユーザが結構適当な文章で打ち込んでも対応してくれています。
（予想外の発話に対しては同じ応答を繰り返す仕様のようです）

![名称未設定6.png](https://qiita-image-store.s3.amazonaws.com/0/177576/e3eec116-7668-f821-7a10-aed642ab512f.png)

Sample utterancesにある例文のような発話がされたときにホテル予約や車予約のintents(いわゆるシナリオ)に遷移して、ユーザから情報を聞き出していく流れになります。

対話により取得したい情報をLocation、RoomTypeのように変数として登録しておき、それを質問する形が基本になります。
変数にマッチさせる単語リストはAmazonで用意されているビルトインと、自分で設定した単語リストのどちらかから選択します。設定されているRoomTypeはこのような感じ。

![名称未設定7.png](https://qiita-image-store.s3.amazonaws.com/0/177576/938140f0-00c9-8bc9-da9f-60a2f98c868c.png)

singleはリストにないですが会話では何故かスルーされていますね。

いわゆる「シナリオベース」の対話ボットを作成するのに役立ちそうです。ただし、まだ日本語には対応していないので今後の対応が期待されますね。


# おまけ

Rekognition（画像認識）も試してみました。

![名称未設定8.png](https://qiita-image-store.s3.amazonaws.com/0/177576/5c262cd5-af2d-4ff6-8834-ea4f7e65a8bd.png)

FrogやAmphibian（両生類）だけでなくTree Frogという種類まで特定されているのは驚きです。

ついでにPolly（テキスト音声化）も。

![名称未設定9.png](https://qiita-image-store.s3.amazonaws.com/0/177576/f879c9b6-0510-1a48-470b-372374ce9084.png)

普通に読めるみたいです。色々試してみたいですね。

それではまた。
Mac上でJenkinsとSVNのパス設定をする際の注意点

# はじめに
以前少しだけ思った通りにいかずに嵌ったので備忘録代わりに書き留めます。
かなり特殊なケース？。

# 事の発端
Jenkins側の環境変数"PATH"に設定（追加）した値でSVNのルートパスを設定していましたが、SVNの新しいバージョンを新規で落として導入し、切り替える想定でした。
その際、旧版はそのまま残し新規パス上に置いたので環境変数に対し新しいルートパスを追加した。
結果、新しいバージョンを見てくれず困ったことに。

# 解決策
1. まずはPATHに設定されている値を export -p でずらっと出してみて確認。
2. 旧SVNのルートパスと新SVNのルートパス両方が存在している場合、旧パスの方が先に出力されているようであれば新パスの方を先に来るように変更する（旧パスを消せるなら消してもいい）
3. 解決

環境変数の並びで実行するものの優先度が変わるからよく確認しろよ、というお話でした。
Vagrantを使ってSinatraを秒で試す

# 概要
VagrantでSinatraを動かすための数ステップの備忘録

# 本編
## 0. 1行でまとめると
Vagrantfileに```config.vm.network "private_network", ip: "*:*:*:*"```書いて,サーバ起動時に```ruby main.rb -o *:*:*:*```すればホストからアクセスできる.

## 1. Vagrantで仮想マシンをつくる
仮想マシンの概要を書く
```vagrant init ubuntu/trusty```したときにできるVagrantfileに```config.vm.network "private_network", ip: "192.168.33.10"```を追記しただけです.

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

起動してSSHで入る.(Windowsの人はPuTTYとかで)

```
vagrant up
vagrant ssh
```

updateとかもしておく.

```
sudo apt-get update
sudo apt-get upgrade
```

## 2. Sinatraのインストール

```
gem install sinatra
gem install sinatra-contrib
```

## 3. 起動
Sinatraのメインのファイルを書く.

```ruby:main.rb
require 'sinatra'

get '/' do
  'hello world'
end
```

起動する.

```
ruby main.rb -o 192.168.33.10
```

ブラウザで以下のアドレスにアクセスして'hello world'が出たらOK
http://192.168.33.10:4567


## 4. 追記
```set :environment, :production```を追記するだけで-oオプションがなくてもよくなる.

```ruby:main.rb
require 'sinatra'

set :environment, :production

get '/' do
  'hello world'
end
```

# 宣伝
フォローお願いします:dancer_tone4: [@redshoga](https://twitter.com/redshoga)
一般相対性理論による地球上での時間の遅れを計算してみる

# 一般相対性理論を取り巻く環境

近年時計の精度が$10^{-18}$に達し、実験室環境で一般相対性理論の検証ができるようになってきている。
実際どの程度の時間のズレが生じるのかを計算してみた。

```py3
import sympy as sym
sym.init_printing()
Pi = sym.S.Pi # 円周率
c = sym.N(299792458, 50) # 光速
r_Earth = sym.N(6356752.314, 50) # 地球の半径
M_Earth = sym.N(5.9726*(10**24), 50) # 地球の質量
G = sym.N(6.6740831/(10**11), 50) # 万有引力定数
```

```py3
def Schwarzschild(M): # シュワルツシルト半径
    return 2*G*M/(c*c)

class spacetime: # シュワルツシルト解で近似する
    def __init__(self, h = 0, d_r = 0, d_theta = 0, theta = 0, d_phi = 0):
        r = r_Earth + h
        rs = Schwarzschild(M_Earth)
        self.tau2_1 = 1 - rs / r # dt^2 = 1
        self.tau2_2 = - 1 / (1 - rs / r) / (c * c) * d_r * d_r
        self.tau2_3 = - r * r / (c * c) * (d_theta * d_theta + sym.sin(theta) * sym.sin(theta) * d_phi * d_phi)
    def tau2(self):
        return sym.N(self.tau2_1 + self.tau2_2 + self.tau2_3, 50)
```

```py3
def angular_v(v, r): # 速度と半径から角速度を求める
    return v / r

def dt(spacetime_base, spacetime_target): # 基準地での1秒に対して対象での1秒がどのぐらい長いか
    return sym.sqrt(spacetime_target.tau2() / spacetime_base.tau2()) - 1.0
```

## 検算してみる

1秒当たりどのぐらいずれるのか。

```py3
base = spacetime() # 地表
base_1m = spacetime(1) # 地表から1m
dt(base, base_1m)
```
$1.097597190⋅10^{−16}$

1mの高度差は余裕ですね。
1cmの高度差による重力差を検知できるというのは本当のようだ。

```py3
base_1ms = spacetime(0, 0, 0, Pi / 2, angular_v(1, r_Earth)) # 地表で1m/s
dt(base, base_1ms)
```
$−5.563250288⋅10^{−18}$

速度は自乗で効いてくるので50cm/sぐらいが現在の検知限界か。
Mastodonインスタンスでkeybase.ioサイト認証

最初、Nginxで以下のような設定にしてサイト認証していたのですが、これが原因でリモートフォローできなくなっていました。

```
    location /.well-known/ {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }
```

以下のようにファイル名を指定することで問題なくリモートフォローできるようになった。(Nginxの設定としてはもっといいのがあると思いますが。)

```
    location /.well-known/keybase.txt {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }
```

どうも/.well-known/host-metaというのを通す必要があるようです。

ちなみに以下が署名です。

https://m.sighash.info/.well-known/keybase.txt

https://m.sighash.info/ の住人募集中です。
Guakeのような分割できるターミナル

次の条件を両方満たすようなターミナルであるterminatorについてまとめたいと思います。

* [Guake](http://qiita.com/puttyo_bubu/items/6cab623f377a282e3635)のようにキーを押すとにゅっと出現する
* ターミナルを複数に分割できる

# 【Waylandを使っている場合のみ】ディスプレイサーバーの切り替え
Waylandではキーショートカットがうまく動作しないため、[【Ubuntu 17.10】WaylandからXorgに切り替えるべき7つの理由 | Linux Fan](https://linuxfan.info/ubuntu-17-10-switch-wayland-xorg)を参考に、ディスプレイサーバーをX.Orgへ切り替えます。

#インストール方法
`sudo apt install terminator`コマンドを実行し、terminatorをインストールします。

#設定方法
Guakeのような見た目や操作性にすることを目指します。

2. Dashホームからterminatorを起動します。
3. ターミナルを右クリックし、設定をクリックします。
4. `ウィンドウの枠`からチェックを外し、`最前面に表示`, `すべてのワークスペースに表示`, `タスクバーから隠す`にチェックを入れます。  
![Terminator の設定_055.png](https://qiita-image-store.s3.amazonaws.com/0/52291/a5146764-c7b0-cb5d-f501-e2bfa1ec5610.png)
5. `プロファイル`をクリックし、`タイトルバー表示`のチェックを外します。  
![Terminator の設定_059.png](https://qiita-image-store.s3.amazonaws.com/0/52291/b9281774-1908-a616-09bf-038ddfb264a5.png)
6. `キーの割り当て`をクリックし、`hide_window`のキーバインドをShift + F12に設定します。  
※GuakeではF12になっていますが、他のアプリケーションのキーバインドと被ってしまうことがあるため、違うキーバインドにしています。    
![Terminator の設定_056.png](https://qiita-image-store.s3.amazonaws.com/0/52291/2a56ae8c-9097-4a30-3c4d-3e2a510dc69c.png)
1. ターミナルを右クリックし閉じます。
2. Dashホームからterminatorを起動します。
3. ターミナルを左端まで伸ばします。
![デスクトップ_057.png](https://qiita-image-store.s3.amazonaws.com/0/52291/18f6d52a-0d3e-6a11-9a4d-d22d581f7690.png)
3. ターミナルを右クリックし、設定をクリックします。
4. `レイアウト`をクリックし、`保存`をクリックします。  
![Terminator の設定_058.png](https://qiita-image-store.s3.amazonaws.com/0/52291/ab4d2efb-af02-bd41-49d9-854b38d45d45.png)
1. Dashホームから自動起動するアプリケーションを起動します。
2. `追加`をクリックします。  
![自動起動するアプリケーションの設定_060.png](https://qiita-image-store.s3.amazonaws.com/0/52291/1a31579b-0e68-e906-dced-bd02d8c37cba.png)
3. 名前とコマンドに`terminator`と入力し、`追加`をクリックします。  
![自動起動するプログラムの追加_061.png](https://qiita-image-store.s3.amazonaws.com/0/52291/127933ee-8cc2-39dc-44bd-770a64bcea2c.png)

#操作方法
|操作|キーバインド|
|:--:|:--:|
|ターミナルの出し入れ|`F12`|
|ターミナルの全画面化 (解除)|`F11`|
|ターミナルを水平方向へ分割|`Ctrl`+`Shift`+`O`|
|ターミナルを垂直方向へ分割|`Ctrl`+`Shift`+`E`|
|フォーカスしているターミナルを閉じる|`Ctrl`+`Shift`+`W`|
|次のターミナルへフォーカスを移す|`Ctrl`+`Tab`|
|前のターミナルへフォーカスを移す|`Ctrl`+`Shift`+`Tab`|
|文字拡大|`Ctrl`+`+`|
|文字縮小|`Ctrl`+`-`|
|文字を元のサイズに戻す|`Ctrl`+`0`|

#参考文献
* [fire0218, Ubuntuで最高のターミナル環境を構築する方法 - ノヴァちゃん日記2](http://gate218.tumblr.com/post/13629528329/ubuntuで最高のターミナル環境を構築する方法-ノヴァちゃん日記2)
Karabinerでwindowsライクに半角/英数のトグルスイッチを使う+a

※ この記事はとりあえずKarabinerの使い方が解る方向けです。
   Karabinerの使い方などは[Macのキーバーインドを変更 - アプリ「Karabiner」](https://pc-karuma.net/mac-app-karabiner/)が参考になります。

# 仕事でWin環境でAutoHotKey使ってるし...
てな感じで、普段仕事でキーバインドへの被せ物はAutoHotKeyで行っている。
でもプライベートマシンはmac(日本語キーボード)なので、Karabinerで同じバインドにしたい。

自分のセッティングでは、(Winマシンでの)`変換`キーで`半角/英数`、
(Winマシンでの)`無変換`+色々なキーで色々な操作ができることがもっとも重要。

なので、Karabinerでやりたいことはこんな感じ。
1. `かな`キーで`半角英数`をトグルで切り替え
2. `英数`キーを`Command`キーへ


# 1. `かな`キーで`半角英数`をトグルで切り替え

組み込みで`VK_JIS_TOGGLE_EISUU_KANA`というKeyCodeがあるのでそれを使う。

```xml
<?xml version="1.0"?>
<root>
    <item>
        <name>Private Key1</name>
        <appendix>Kana to Kana/Eisuu</appendix>
        <identifier>private.001</identifier>
        <autogen>
            __KeyToKey__
            KeyCode::JIS_KANA,
            KeyCode::VK_JIS_TOGGLE_EISUU_KANA
        </autogen>
    </item>
</root>
```

# 2. `英数`キーを`Command`キーへ

これはそのままかぶせるだけ。

```xml
<?xml version="1.0"?>
<root>
    <item>
        <name>Private Key3</name>
        <appendix>Eisuu to Command</appendix>
        <identifier>private.003</identifier>
        <autogen>
            __KeyToKey__
            KeyCode::JIS_EISUU,
            KeyCode::COMMAND_L
        </autogen>
    </item>
</root>
```

# だいぶ快適になった

今まで不精してデフォルトのコマンドキーで対応していたので、快適になった。
これでWinで設定しているキーバインドと遜色なくなったので、キーボードの違い以外の違和感はなくなった。

同じようなキーバインドをWinマシンでしている人も少なくないので、いかがでしょうかという感じ。

KeyCodeの一覧は[karabinerのオフィシャル](https://github.com/tekezo/Karabiner/blob/master/src/bridge/generator/keycode/data/KeyCode.data)にあるので、色々と設定してみたいところ。
Swift3でgroupBy

こんなJSONがあるとして、fruitsTypeごとに集約して、個数を表示したい。
例）
もも 1個
りんご 2個

```json
[
  {
    "fruitsName": "青森産りんご",
    "fruitsType": "りんご"
  },
  {
    "fruitsName": "大都会白桃",
    "fruitsType": "もも"
  },
  {
    "fruitsName": "謎のりんご",
    "fruitsType": "りんご"
  }
]
```

Array#groupByがあれば簡単にできそうだが、残念ながらSwiftのArrayにはgroupByがない。

## extensionで実装

Arrayクラスを拡張して、groupByメソッドを追加する。

```swift
class Fruits {
    var fruitsName: String?
    var fruitsType: String?

    init (fruitsName: String?, fruitsType: String?) {
        self.fruitsName = fruitsName
        self.fruitsType = fruitsType
    }
}

extension Array {

    func groupBy<T: Hashable>(_ callback: (Iterator.Element) -> T) -> [T: [Iterator.Element]] {
        var grouped = [T: Array<Iterator.Element>]()
        
        forEach {
            let key = callback($0)
            if var array = grouped[key] {
                array.append($0)
                grouped[key] = array
            } else {
                grouped[key] = [$0]
            }
        }
        
        return grouped
    }
    
}

let fruits = [
    Fruits(fruitsName: "青森産りんご", fruitsType: "りんご"),
    Fruits(fruitsName: "大都会白桃", fruitsType: "もも"),
    Fruits(fruitsName: "謎のりんご", fruitsType: "りんご")
]

fruits.groupBy { $0.fruitsType! }
    .map { "\($0.key) \($0.value.count)個" }
    .forEach { print($0) }

//もも 1個
//りんご 2個
```

## Dollar

だけど、プロジェクトごとにextensionを作成するのは面倒。
そこで、[Dollar](https://github.com/ankurp/Dollar)という、JavaScriptのLodashみたいな関数型プログラミングをサポートするライブラリを導入する。
※[ExSwift](https://github.com/pNre/ExSwift)という、extensionでArrayを拡張するライブラリもあるのだけど、残念ながらSwift3未対応でした

### インストール
CocoaPodsでインストールする。Podfileに以下を追記して、pod update

```ruby:Podfile
pod 'Dollar'
```


### コード

```swift
$.groupBy(fruits) { $0.fruitsType! }
    .map { "\($0.key) \($0.value.count)個" }
    .forEach { print($0) }

//もも 1個
//りんご 2個
```

groupBy以外にも色々便利関数があって、プログラミングが捗りそう。
でもやっぱり、groupByみたいな基本的な関数は公式サポートしてほしいなあ。
vagrant の マウントがうまくいかなくなった件ではまったのでメモ



# 目的
virtual box の バージョン 5.1.20 r114628 にアップデートした際に、
マウントがうまくいかなくなった件ではまったのでメモ。

vagrant up 時の エラー内容

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

mount: wrong fs type, bad option, bad superblock on vagrant,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
```

# 対応方法（ゲストOS）

確認方法

```
ls -lh /sbin/mount.vboxsf 
```

シンボリックリンクの張り直し。

```
ln -sf /opt/VBoxGuestAdditions-5.1.20/lib/VBoxGuestAdditions/mount.vboxsf /sbin/mount.vboxsf
```

# 参考
書いてて気づいたけど、これと同じ現状だった。

https://www.virtualbox.org/ticket/16670

反省。こうゆうのがあるから virtual box のアップデートは様子みてからやる。
brew cask outdatedを用いてoutdatedしたapp共を再インストールする

# brew cask outdated

下記Pull Requestで `brew cask outdated` コマンドが追加された。

[add command 'cask outdated' by axiac · Pull Request #2309 · Homebrew/brew](https://github.com/Homebrew/brew/pull/2309)

このコマンドを用いれば最新バージョンに追従していないapp共が表示される。（何故かstdoutにはバージョンに関する情報が出力されない。）

```shell-session
$ brew cask outdated
mactex (20150613) != 20161009
paw (3.0.6) != 3.0.16,2
postman (4.6.2) != latest
vagrant (1.8.1) != 1.9.3
virtualbox (5.0.20-106931) != 5.1.20-114629
xquartz (2.7.9) != 2.7.11
```

`--quiet`フラグを用いればappの名前のみ表示される。

```shell-session
$ brew cask outdated --quiet
mactex
paw
postman
vagrant
virtualbox
xquartz
```

# reinstallコマンドと併用して再インストール

これと`brew reinstall`コマンドを組み合わせれば下記コマンドでoutdatedしたapp共を再インストールできる。

```shell-session
$ brew cask reinstall $(brew cask outdated --quiet)
```

# 備考

mactexのappは2017/04/22現在、筆者の環境ではuninstallに失敗している。

おそらく下記のIssueに関連する問題だと思われる。

[Cannot uninstall mactex · Issue #31888 · caskroom/homebrew-cask](https://github.com/caskroom/homebrew-cask/issues/31888)

# 参考

- [brew caskのappどもをupgradeする - Qiita](http://qiita.com/2k0ri/items/9fe8d33a72dbfb15fe6b)
JavaScriptでループ中にスリープする。

この記事は、
[JavaScriptでループ中にスリープしたい。それも読みやすいコードで](http://qiita.com/akyao/items/a718cc78436df68d7e15)
を見て、改良してみたものです。

ループ中の i が 0 から、ループ数、だと、
Forのように、start から end までを定義できたほうがいいなと思ったので
次のようなものを作りました。

```js
function intervalForTo(startIndex,endIndex, interval, func) {
	if (!(startIndex <= endIndex)) { return; }
	var i = startIndex;
	var loopFunc = function () {
		if ( func(i) === false) {
			//戻り値がfalseならループをbreakする
			return;
		}
		if (i < endIndex) {
			setTimeout(loopFunc, interval);
		}
		i++;
	}
	loopFunc();
}

function intervalForDownTo(startIndex,endIndex, interval, func) {
	if (!(endIndex <= startIndex)) { return; }
	var i = startIndex;
	var loopFunc = function () {
		if ( func(i) === false) {
			//戻り値がfalseならループをbreakする
			return;
		}
		if (endIndex < i) {
			setTimeout(loopFunc, interval);
		}
		i--;
	}
	loopFunc();
}

```

使い方は、次のようにします。

```js
	intervalForTo(5, 10, 500, function(index) {
		alert(index.toString());
	});
	//5,6,7,8,9,10 と表示されます。

	intervalForDownTo(10, 5, 500, function(index) {
		alert(index.toString());
	});
	//10,9,8,7,6,5 と表示されます。
```

intervalForTo / intervalForDownTo で囲まれている部分にたいして
return true; で、continue
return false;で、break の機能があります。


setTimeout で実装していますが

元記事のコメント欄にあった、
setInterval を使った実装もしてみましたので、

より詳しい内容は、GitHubの方をどうぞ

[standard-software/stsLib.js/stslib_web.js]
(https://github.com/standard-software/stsLib.js/blob/master/Source/stsLib.js/stslib_web.js)
MastodonのC#向けライブラリを作って動的に変更可能なBotを作ってみた

Mastodon すごい勢いで利用者が増えて面白いことになってるなぁと感じています．
ここまでユーザが増えるのであれば Twitter でやっていた Bot 運用をこちらでもしたいなと思いまして，まずは Mastodon の API を叩けるライブラリを作成して，その後に Bot の簡単な枠組みを作ってみました．

## ライブラリについて
[yamachu/Mastodot: C# Library for Mastodon. Easy Toot!](https://github.com/yamachu/Mastodot)
Nuget に出す練習もしてみたかったので Nuget にも公開済みです．

使い方は Github の README に書いてあったり，また example としてサンプルコードを書いたので参考にしてください．

## Bot について
せっかくストリームを受信しているのだからその流れを絶やしたくない...フィルタリングする内容とかは動的に決めたいという思いが自分の中にありました．
C# はスクリプト言語ではないため外部からごにょごにょ...というのはあまり現実的ではありません．

しかし [Roslyn](https://github.com/dotnet/roslyn) の登場によりスクリプト言語的にも扱えるようになりました(Visual Studio の Immediate Window みたいなイメージ)
その Roslyn を借りて動的に動きを変えることが出来る Bot を作ってみました．
実現するためのコードは [Azure Functions - C# のRoslyn コード評価環境を構築しよう](http://tech.guitarrapc.com/entry/2016/05/04/150011) を参考にしました．

サンプルコードを以下にアップしました

[yamachu/MastodonScriptBot: Mastodon Bot with Roslyn for Scripting](https://github.com/yamachu/MastodonScriptBot)


方法としては実にシンプルで，
1. Mastodon のストリームに接続
2. そのストリームを Subscribe する際にフィルタをかけたりして動作を変える

これだけです．

動的に止めることなく Bot の振る舞いを変える際にいい感じに役に立ってくれたのが `FileSystemWatcher` でした．
この存在を知ったのは [MacOS上で.NET Coreを使ってフォルダ/ファイル変更監視](http://qiita.com/yanoshi/items/115b78066762d3230b14) の記事でした，感謝．
タイトルにあるように監視対象のディレクトリでのファイルの変更を通知してくれます．

これを使って Bot の動作が動的に変更することが可能となっています．

じゃあどんなふうに Bot の振る舞いを書くの？ということですが，以下のように Mastodon のストリームを Subscribe してそれに対する処理を書くだけです．

Script ディレクトリに {適当な名前}.csx という感じで以下のファイルを保存してみます(; がないじゃん！と思うかもしれませんが，大丈夫です，問題ありません)

```csharp

MSStream.OfType<Status>()
.Where(x => x.Content.Contains("マストドン"))
.Subscribe(x => 
{
    System.Console.WriteLine(x.Content);
    Client.Favourite(x.Id);
})

```

これは文章中に”マストドン”という単語が含まれていたら fav を投げつけるというようなサンプルです．

この中の`MSStream`と`Client`ってどっから来たんだよ！っていう感じなのですが，ストリームを生成した Host 側に持たせています．
それを Global な変数として Bot を実現するスクリプト側に投げています．
処理的に言えば
https://github.com/yamachu/MastodonScriptBot/blob/master/SampleMastodon/Program.cs#L145-L169
このあたりに該当します．

この記事では仕組みとかそのあたりには触れないので，ぜひ使って感じてみて欲しいなと思います．

ですが，これは半分ネタです，すみません．
というのも完全に型が...型がわからない............補完が効かない.....ということでいくつかテンプレートを作って遊んでみるのがいいのかなと思いました．


みんなも Mastodon で Bot 運用楽しもうず！！！！
~~本当は update_name について書くつもりだったけど...何か別の記事で!~~


あと [yamachu/Mastodot: C# Library for Mastodon. Easy Toot!](https://github.com/yamachu/Mastodot)
 を何卒よろしくお願いします．
SassのExtendはなぜオススメされないのか

今回はSassの書き方の一つであるExtendについて、使いどころを調べてみたので紹介します。

>scssのコンパイルはVisual Studioの拡張機能であるWebCompiler 1.11.326を使用しています。

# Extendとは
定義済みのスタイルを継承して新しいスタイルを作れる書き方です。
当然ですがこの書き方はコンパイルするとcssに出力されます。

コンパイル前

```scss
.input-row {
    display: flex;

    span {
        width: 100px;
    }
}


.sample1 {
    @extend .input-row;
}
```

コンパイル後

```css
.input-row, .sample1 {
    display: flex;
}

    .input-row span, .sample1 span {
        width: 100px;
    }
```

# プレースホルダセレクタ
extendしたいスタイルの先頭に%を付与します。
この書き方をするとextendする元の定義はcssへは出力されません。
extendのためだけに宣言する場合などは便利ですね。

コンパイル前

```scss
%input-row {
    display: flex;

    span {
        width: 100px;
    }
}


.sample1 {
    @extend %input-row;
}
```

コンパイル後

```css
.sample1 {
    display: flex;
}

    .sample1 span {
        width: 100px;
    }
```

# なぜオススメされないのか
これだけを見ると非常に便利に見えるextendですが、いろいろなサイトではMixInとの使い分けで、Extendはあまり推奨されない記載を拝見します。

それはなぜか。
以下の%input-rowを10回Extendした場合

```scss
%input-row {
    display: flex;

    span {
        width: 100px;
    }
}

.sample1 {
    @extend %input-row;
}

.sample2 {
    @extend %input-row;
}

// sample10まで続く
```

出力されるcssは以下のようになります。

```css
.sample1, .sample2, .sample3, .sample4, .sample5, .sample6, .sample7, .sample8 {
    display: flex;
}

    .sample1 span, .sample2 span, .sample3 span, .sample4 span, .sample5 span, .sample6 span, .sample7 span, .sample8 span {
        width: 100px;
    }
```

上記の通り、大量のセレクタがグルーピングされます。
今回の例はExtend元が２段階のネストですが、ネストが深くなると何倍ものセレクタが生成されることになります。

これではとてもデバッグできませんし、出力されたcssの解析など不可能です。
これが一番の要因かなと思います。

# Extendの使いどころ
それではExtendは使いどころがないのか？
個人的には安全で、より多機能なMixInを使いますがあえて使うなら
同一コンポーネント内など限られたスコープで使用するのが良いのでしょう。
以下はコンポーネントに絞って使用した例で、良い例と言えます。

```scss
.button,
%button {
    display: inline-block;
    padding: 1em;
}

.button-warning {
    @extend %button;
    background-color: yellow;
    color: black;
}

.button-error {
    @extend %button;
    background-color: red;
    color: white;
}

.button-gray {
    @extend %button;
    background-color: lightgray;
    color: black;
}
```
コンパイル後

```css
.button,
.button-warning,
.button-error,
.button-gray {
    display: inline-block;
    padding: 1em;
}

.button-warning {
    background-color: yellow;
    color: black;
}

.button-error {
    background-color: red;
    color: white;
}

.button-gray {
    background-color: lightgray;
    color: black;
}
```
already installed, it's just not linked



###already installed, it's just not linked
```
$ brew link --overwrite node
```


*********************************************************
エンジニアがPullrequestにレビューをして副収入を得られるサービスを始めました。
<a href="https://www.reviewers.center/" target="_blank" rel="noopener noreferrer">Reviewers</a>
*********************************************************
WebサービスをMacのアプリ化してみる

Macユーザーなので基本的にはブラウザはSafariを使っていました。Appleの開発者ページもSafariじゃないとおかしなことがあったり、iPhoneとの同期なんかもあって便利に使っていました。はい、過去形です。

なぜ過去形なのか、

TouchBarによるSafariのクラッシュが頻発して耐えられなくなってしまったのです。で、その苦しみから解放するべくChromeに切り替えたのですが、イマイチなところもあるので、どうせならとWebサービスをアプリ化してみることにしました。（ブックマークでいいじゃんというのは置いといて）

ググってみると、nativefierってのが良さそうだったのでそれをやってみる。まずは環境構築からやらねばいけずちょっと手間でしたが、一度作ればマシン変えるまではそのままでいいので気にせずやっておく。

アプリ化しておくと便利だなと思っているのが

1. Backlog
2. Redmine
3. Qiita
4. Facebook

などなど
さて始めて見ます。上から順番にやっていけば基本的には完了するはずです。

# homebrewのインストール
`https://brew.sh/index_ja.html`
に書かれているスクリプトを実行します。

# nodebrewのインストール
homebrewがインストールできたら次のコマンドを実行します。
`brew install nodebrew`

```
$ brew install nodebrew
==> Using the sandbox
==> Downloading https://github.com/hokaccha/nodebrew/archive/v0.9.7.tar.gz
==> Downloading from https://codeload.github.com/hokaccha/nodebrew/tar.gz/v0.9.7
######################################################################## 100.0%
==> /usr/local/Cellar/nodebrew/0.9.7/bin/nodebrew setup_dirs
==> Caveats
Add path:
  export PATH=$HOME/.nodebrew/current/bin:$PATH

To use Homebrew's directories rather than ~/.nodebrew add to your profile:
  export NODEBREW_ROOT=/usr/local/var/nodebrew

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/nodebrew/0.9.7: 8 files, 38KB, built in 5 seconds
```
こんなふうに出れば成功です。

# node.jsの最新版をインストール

## 以下のコマンドを実行します。

`$ nodebrew install-binary latest`

エラーが出る場合は

`$ mkdir -p ~/.nodebrew/src`

とやってから実行してみましょう。

## nodeのバージョンを有効にする

`$ nodebrew use v7.9.0`

## パスを通す

`$ echo 'export PATH=$PATH:/Users/XXXXXX/.nodebrew/current/bin' >> ~/.bashrc`

# npmを確認

`$ npm -v`

# Nativefierのインストール

`npm install nativefier -g`

## よく使うWebサービスをアプリ化する

いくつかコマンドがあるので、詳しくはnativefierのページを参照ください。アプリアイコンもセットで指定してあげると素敵になるので、「PNG to ICNS」とかでググると簡単に作成できます。

# Backlog

```$ nativefier --name "Backlog" "apple.com" --icon "backlog.icns" --overwrite --badge```

カレントディレクトリにフォルダができ、そのなかに.appができたかと思います。
Atomエディタでも ¥ キーで \ を入力したい

JISキーボード限定の話。

> こんなハックをしなくても簡単にできる方法がきっとあるに違いないと思うとQiitaに書くのも気が引けるけれど、でもとりあえず動くの大事だし他の似たような事をしたい人の参考になるかもと思ってメモを晒す

## やりたいこと
Terminalでは ¥ キーで \ が打てるんだけど、Atomでは option-¥ しないと \ が打てない。

プログラミングしてるとこれが不便で。optionキーとか押したくない。

> Google日本語入力の設定では、「￥キーで入力する文字」は 「バックスラッシュ(\)」に設定している（はず）。
> （はず）というのは、macOS sierraにしてからというもの、入力ソースの切り替えは可能なものの、切り替えがメニューに反映されず、Google日本語入力の設定画面に滅多にお目にかかれないから。環境設定＞キーボード、の入力ソース追加（＋）・削除（ー）も効かないし、sierraのキーボード回りはどうも呪われている。

## 解決策
Atomのkeymapをいじる。

```~/.atom/keymap.cson
'atom-text-editor':
  '¥': 'custom:insert-backslash'
```

```~/.atom/init.coffee
atom.commands.add 'atom-text-editor',
  'custom:insert-backslash': (event) ->
    editor = @getModel()
    editor.insertText('\\')
```

とりあえずこれで解決できたんだけど（要・Atom再起動）

keymap.cson は cmd-option-ctrl-R で再読込されるけど、init.coffee は再起動しないとダメ、だったかな。


## 参考文献
- [Keymaps In-Depth - Atom Flight Manual](http://flight-manual.atom.io/behind-atom/sections/keymaps-in-depth/)
- [Have a custom keystroke insert a Unicode char in Atom - StackOverflow](http://stackoverflow.com/questions/30357320/have-a-custom-keystroke-insert-a-unicode-char-in-atom)
←ここの例では cmd-\ で λ を入力できるようにしている
PHPで学ぶデザインパターン(Singletonパターン)

# Singletonパターンとは
インスタンスが一つしか存在しないことを保証するパターンです。
通常であれば複数インスタンスが存在しているが、いくつもインスタンスを作成したくない場合に使用します。
現在のシステム設計を表現したクラスのような、システムの中に1つしか存在しないプログラムを作成するようなイメージです。
クラス外部からインスタンスを作成できないようにするためにコンストラクタがprivateになっています。

# Singletonパターンで登場する概念
## singleton
唯一のインスタンスを得るためのstaticメソッドを持っており、いつも同じインスタンスを返します。

# 簡単なコードを書いてみる
## Singleton

```php
class Singleton
{
    private static $singleton;

    private function __construct()
    {
        echo "インスタンスを生成しました。" . PHP_EOL;
    }

    public static function getInstance()
    {
        if (!isset(self::$singleton)) {
            self::$singleton = new Singleton();    
        }
        
        return self::$singleton;
    }
}
```
コンストラクタはprivateにして、外部からアクセスができないようにします。
その上で、getInstanceを外部に公開し、常に同じインスタンスを返すような設計にします。

## 呼び出し

```php
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();

if ($singleton1 === $singleton2) {
    echo "singleton1とsingleton2は同じインスタンスです。" . PHP_EOL;
} else {
    echo "singleton1とsingleton2は違うインスタンスです。" . PHP_EOL;
}

/*
インスタンスを生成しました。
インスタンスを生成しました。
singleton1とsingleton2は同じインスタンスです。
*/

$test = new Singleton();
// Fatal error: Call to private Singleton::__construct() from invalid context in singleton.php

```

getInstanceで返されたインスタンスが同じインスタンスであることの確認と、外部からインスタンス化できないことを確認します。

# メリット
どんなにコメントで一つしかインスタンスを作成してはいけないとか書いていても、人がコードを書く以上それが守られているとは限りません。
しかしこちらのパターンでは、インスタンスが一つしか存在しないことを保証できます。


# 参考
Java言語で学ぶデザインパターン入門
[Swift]Array<Element>型

# ``Array<Element>``型

- 配列を表す
  - 順序を持ったコレクション

- ``Element`` : プレースホルダ型
  - 具体的な型で置き換えて、``Array<Int>``や``Array<String>``のように使う
- ジェネリック型
  - ``<>``内にプレースホルダ型を持つ型
- 糖衣構文(シンタックスシュガー)
  - ``Array<Element>`` → ``[Element]``

## 配列リテラル

```Swift:配列リテラル
let a = [1, 2, 3]
let b = ["a", "b", "c"]
```

### 型推論

- 配列リテラルが含む要素の型からプレースホルダ型``Element``を推論する

    ```Swift:配列リテラルの型推論
    let strings = ["a", "b", "c"]   // [String]型
    let numbers = [1, 2, 3]         // [Int]型
    ```

- 空の配列リテラルの場合、要素が存在しないので型推論できない
  - 型アノテーションによりプレースホルダ型``Element``を決定する必要がある

    ```Swift:空の配列リテラル
    let array: [Int] = []
    ```

- 配列リテラルが複数の型の要素を含む場合、型推論によって型が決定できない
  - 型アノテーションによりプレースホルダ型``Element``を決定する必要がある

    ```Swift:複数の型の要素を含む配列リテラル
    let array: [Any] = [1, "a"]
    ```

### 要素にできる型

- ``Element``型の値を要素にできる
- ``Element``型にはどのような型も当てはめることができる

    ```Swift:Intの2次元配列
    let integerArrays = [[1, 2, 3], [4, 5, 6]]  // [[Int]]型
    ```

- 要素の型と異なる型の値を含めた場合はコンパイルエラー

## ``Array<Element>``型の操作

### 要素へのアクセス

- サブスクリプト
  - 引数: 要素のインデックスを表すInt型の値
  - 最初の要素のインデックスは**0**
  - インデックスが範囲外の場合は実行時エラー

    ```Swift:要素へのアクセス
    let strings = ["abc", "def", "ghi"] // インデックスは0, 1, 2

    let strings1 = strings[0]   // "abc"
    let strings2 = strings[1]   // "def"
    let strings3 = strings[2]   // "ghi"
    let strings4 = strings[3]   // 実行時エラー(範囲外)
    ```

### 要素の更新

- 更新したい要素を取得して代入演算子``=``で値を設定

    ```Swift:要素の更新
    var strings = ["abc", "def", "ghi"]
    strings[0] = "xyz"

    strings // ["xyz", "def", "ghi"]
    ```

### 要素の追加

- 末尾に要素を追加
  - ``append(_:)``メソッドを使用

    ```Swift:末尾に要素を追加
    var integers = [1, 2, 3]
    integers.append(4)  // [1, 2, 3, 4]
    ```

- 任意の位置に要素を追加(挿入)
  - ``insert(_:at:)``メソッドを使用
     - 引数: 追加する要素, 追加する位置のインデックス

    ```Swift:要素を挿入
    var integers = [1, 2, 3]
    integers.append(4)  // [1, 2, 3, 4]
    ```

### 配列の結合

  - ``+``演算子で型が一致する``Array<Element>``型を結合

    ```Swift:配列の結合
    var integers1 = [1, 2, 3]   // [Int]型
    var integers2 = [4, 5, 6]   // [Int]型

    let result = integers1 + integers2  // [1, 2, 3, 4, 5, 6]
    ```

### 要素の削除

- ``remove(at:)``メソッド
  - 任意のインデックスの要素を削除
- ``removeLast()``メソッド
  - 最後の要素を削除
- ``removeAll()``メソッド
  - すべての要素を削除

    ```Swift:要素の削除
    var integers = [1, 2, 3, 4, 5]
  
    // インデックス:2を削除
    integers.remove(at: 2)
    integers    // [1, 2, 4, 5]

    // 末尾を削除
    integers.removeLast()
    integers    // [1, 2, 4]

    // 全削除
    integers.removeAll()
    integers    // []
    ```
Elastic Beanstalkでbundle installできない

#環境
elastic beanstalk
platform: ruby 2.3

#エラー内容

```
Creating application version archive "app-8f08-170422_113914".
Uploading test-app/app-8f08-170422_113914.zip to S3. This may take a while.
Upload Complete.
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
ERROR: [Instance: i-00d8f7970ee6898c0] Command failed on instance. Return code: 5 Output: (TRUNCATED)... warden 1.2.7
Using sprockets 3.7.1
Using websocket-driver 0.6.5
Using mime-types 3.1
An error occurred while installing debug_inspector (0.0.2), and Bundler cannot
continue.
Make sure that `gem install debug_inspector -v '0.0.2'` succeeds before
bundling.
Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh failed. 
```

#原因
以下のgemのどれか。
debug系のものを間違ってstaging環境やproductionに入れないようにしよう

```

  gem 'byebug'
  gem 'pry-rails'
  gem 'pry-doc'    
  gem 'pry-byebug' 
  gem 'pry-stack_explorer'

```
Link > EMOJI CHEAT SHEET

http://qiita.com/QUANON/items/672588719b178291f351
の記事にて:bed:の表記があった。

どう入力するかというと以下のようにするようだ。

```
:bed:
```

他に

```
:hearts:
:hourglass: 
:beach_umbrella: 
:aerial_tramway: 
```
は
:hearts:
:hourglass: 
:beach_umbrella: 
:aerial_tramway: 

などになる。

コードは以下で見つけた。
https://www.webpagefx.com/tools/emoji-cheat-sheet/

# :heart:, :bed:

ヘッダ表記にすると大きくできそうか。

記事タイトルはEMOJI非対応。
AWSのMFAの解除に日本語で挑戦した話

## AWSのMFAの解除に日本語で挑戦した話

### TL;DR

- 最近だと「最初に日本人だって伝えると日本語の喋れるオペレーターから再度連絡してもらえるよ」って話を聞いたので挑戦してみた
- Web上での申し込みやPINの入力については他の方が書かれているので割愛
- 筆者の英語レベル
	- 読み
		- 公式ドキュメントやgithubの議論ぐらいなら読める
	- 書き
		- ほとんどしないしgoogle翻訳頼み
	- 聞き&喋り
		- 人と英語で会話するのは生まれて初めて

### 参考

- [AWSの仮想MFAデバイスを紛失してしまったときの対応 \- Qiita](http://qiita.com/sugarless_morris/items/816ecb66661fe9200279)

### 流れと会話

- Webで申し込み
- 15分ぐらいして206からはじまる番号から電話がかかって来た

CSサポートから聞き取れた言葉 : _"Amazon web service support desk", "trouble"_ (多分AWSのサポートデスクです。トラブルとのことで電話しました。って言ってた)
俺 : _"そーりー、あいきゃんとすぴーくいんぐりっしゅ。あいあむじゃぱにーず"_
CSサポート : _"contact", "Japanese operator"_ (多分日本人オペレーターから折り返すって言ってた)
俺 : _"おーけーおーけー"_
CSサポート : _"バーイ"_
俺 : _"ば、ばーい"_ (噛んだ)

- 1時間後非通知の番号から電話かかってきて日本語でやりとりして完了

### 所感

- 日本語でもイケた
- 通話のノイズひどい
- 外国人はフレンドリー、日本人はすごい丁寧
【Rails】ダーミーデータ投入にseed.rbは使わない

## そもそもseed.rbの役割とは？
よくダミーデータの投入する方法の記事を目にするが、ほとんどがseed.rbを使っている。
ただし、seed.rbは基本的に初期データをテーブルに追加したいときなどに使うものであって、ダミーデータを投入するためのものではない。


## 実装
### ゴール
`bin/rails db:dummy_data`というコマンドでdbにダミーデータを投入できるようにする。

### ダミーデータ生成プログラム

`db/`ディレクトリ以下に`dummy_data.rb`を作成する。
基本的に、`dummy_data.rb`ファイル内にダミーデータ生成プログラムを記述する。

以下の例はUserモデルに対して、ダミーデータを投入するプログラムになっている

``` db/dummy_data.rb
def users
  2.times do |index|
    name = Faker::Name
    last_name = name.last_name
    first_name = name.first_name

    User.create(
    last_name: last_name,
    first_name: first_name,
    username: "example_worker#{index+1}",
    email: "example#{index+1}@example.com",
    password: 'foobar123',
    password_confirmation: 'foobar123',
    activated: true
    )
  end
end

users
```
※ 細々としたプログラムについての説明は省略

ただし、これだけでは`db:seed`のようなコマンドがないので、実際に開発環境上のdbにデータを生成することはできない。

### タスク実行の設定
`lib/tasks/`ディレクトリに、`dummy_data.rake`ファイルを作成する。

``` lib/tasks/dummy_data.rake
namespace :db do
  task dummy_data: :environment do
    load(File.join(Rails.root, 'db', 'dummy_data.rb'))
  end
end
```

上記のタスクを設定することで、
`bin/raisl db:dummy_data`をターミナルで実行することができ、作成した`ダミーデータ生成プログラム`が実行される。

これで無事、ダミーデータの生成とDB投入が成功する。

## まとめ

正直、seed.rbやseed-fuでダミーデータ生成（投入）してもよくね？という声が多数なきはするが、
僕としては、わけて考えたい。というより、用途が別なのだからわけて考えるべきであると思っている。