OmniAICreator/Qiita-1.07M huggingface dataset:
まだ海外の質問サイトに英語で投稿してないの？

ググっても人に聞いても全くわからない問題に出くわすことがあります。
そんな時は、海外の技術系サイト（例えばStackOverflowなど）に英語で聞いてみよう！というのがこの投稿のメインテーマです。
「海外の技術系サイト」に質問を投稿するメリットは明らかで、回答者の母数が明らかに違うからです。様々な視点からたくさん、時間的にも早く答えが返ってきます。昼間だろうと真夜中だろうと関係ありません。

ただ、周りの人に聞いてみると「英語はなんとか翻訳しながら読めるけど、書くのはちょっと。。」とためらっている人が多い印象です。
僕も別にそんなに得意なわけではないですが、積極的に質問して蓄積した「コツ」のようなものをまとめてみたいと思います。


# 一番大切なのは、「伝えたいことは明確か」ということ

英語で投稿しようと考えると、「今頭にある日本語をどうやって英語に直そうか」となります。
しかしこのやり方だと、泥沼にはまっていきます。何言ってるのかわからないし、何を伝えたいのかもわからなくなってくるのです。

だからまずは、質問したいことつまり疑問点を素直に整理してみることが大切です。
これは日本語で質問しようとした時も当たり前にするべきことですが、英語となるとその意識が綺麗に消えてしまうので（笑）あえて意識しましょうという話です。

## 疑問点をフォーマットに従って簡潔にまとめる

1. 何をしようとしているのか（取り組むテーマ）
2. 何が起こったのか（疑問点）
3. 何を試してみたのか（経緯）
4. 何を知りたいのか（質問の論点）
5. 結びの言葉


「こういうプログラムを作っていて、次のようなコードを書きましたが、このようなエラーが起きます。こうしてみても同じでした。何が原因なのでしょうか？宜しくお願い致します。」

つまり、このくらい簡潔な文章になるようにします。

# 伝えたいことを英語に変える

英語の表現のパターンは色々ありますが、あえてそれぞれ1つずつを記します。大切なのは自分の伝えたいこと、つまり疑問点を明確に表現することであり、細かい英語の表現にそこまでこだわる必要がないからです。

## 1. 何をしようとしているのか

```
I'm trying to <しようとしていること>.
〜しようとしています。
```

## 2. 何が起こったのか

```
The problem is ~ <起こったこと>.
〜が問題です。
```

## 3. 何を試してみたのか

```
I tried <試して見たこと>.
〜を試して見ました。
```

## 4. 何を知りたいのか

```
I want to know <知りたいこと>.
〜を知りたいです。
```
```
How can I <やりたいこと>?
どうすれば〜できますか？
```

## 5. 結びの言葉（省略可）

```
Thanks.
よろしく！
```

# 例えば質問してみた

とても単純ですが、「RailsでUserクラスのインスタンスにインスタンスメソッドを当てたがエラーが出た」という例で質問を作って見ます。
（実はインスタンスメソッドではなくクラスメソッドを定義していたというオチですが、それは質問しているのでわかっていないという前提で）

以下質問


I'm trying to call a method for User instance in Rails.
（RailsでUserのインスタンスに対してメソッドを呼ぼうとしています）

```rb
class User < ActiveRecord::Base
  def self.get_full_name
    "#{first_name}#{last_name}"
  end
end
```
```rb
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    @name = @user.get_full_name
  end
end
```

The problem is I got this error.
（以下のエラーが起こったことが問題です）

```
undefined method `get_full_name' for #<User:0x007f8daae86388>
```

I tried to fix the method content like this, but I got the same error.
（メソッドの中身を変えるということを試しましたが、同じエラーが出ました）

```rb
def self.get_full_name
  first_name + last_name
end
```

I want to know the reason of this error.
How can I solve this error?
（このエラーの原因を知りたいです。どうしたら解決できますか？）

Thanks.
（よろしく！）


このようにシンプルに伝えれば、「定義しているのはクラスメソッドだよ」とか「クラスメソッドとインスタンスメソッドの違い」など詳しく教えてくれる人が現れます。


# 回答をもらうために工夫できること

## コードとかエラーメッセージとかを確実に載せる

基本的にコードで会話できるのがプログラマーです。きちんとコードやエラーメッセージを載せられたら、英語（文章）は最低限で済みます。

## なんでもかんでも書こうとしない

時折、出力されたログを全部ペースとしている質問を見ます。「なぜだめなのか」というのがわからないのでそれも仕方ないことかなとも思いますが、とても見にくいです。回答者は情報が足りないと感じたらきちんと質問をしてくれます。ログはどうか？ここの設定はどうなっているか？などです。その質問にきちんと答えることで、情報を補って行くようにしましょう。

# 最後に
こちらの記事を参考にさせていただきました。
[海外の技術系掲示板に英語で質問する際の文例・定型文](https://php-archive.net/php/asking-questions/)

自分が上手く質問できないなと感じていた時に参考にさせてもらった記事です。英語の例文なども多くあります。

海外の技術サイトへぜひ積極的に質問してみてください。
よいエンジニアライフを！
bootstrap4,gulpでvariablesのカスタマイズ

初投稿です。
macでの開発前提です。

```
mkdir tmp
cd tmp

npm init
sudo npm install --global gulp
npm install --save-dev gulp gulp-sass gulp-autoprefixer
npm install bootstrap@4.0.0-beta.2

mkdir scss
mkdir css
```

gulpコマンドを有効にするために、グローバルでインストール。
グローバルにインストールしていないと、

```
-bash: gulp: command not found
```

が出ました。

tmp/node_module/scss/bootstrap.scss を tmp/scss にコピペして、ファイル名を bootstrap-custom.scss に。

```
vi scss/bootstrap-custom.scss
```

下のような感じで編集。

```
---（略）-------
@import "./variables-custom"; // variables より上に追記
@import "variables"; // 元々記述してあったやつ
---（略）-------
```

gulpfile.jpを作成してコードを書く。

```
vi gulpfile.js
```

[絶対つまずかないGulp入門。インストールからSassのコンパイルまで](https://ics.media/entry/3290/3)を参考に記述。

```
const gulp = require('gulp');
const sass = require('gulp-sass');
const autoprefixer = require('gulp-autoprefixer');

gulp.task('default', function () {
  gulp.src('public/scss/bootstrap-custom.scss') // target sass
    .pipe(sass({includePaths:['node_modules/bootstrap/scss']})) // sassのコンパイル
    .pipe(autoprefixer()) // autoprefixerのコンパイル
    .pipe(gulp.dest('public/css')); //　保存先のパス
});

```

こんな感じ。
includePaths は gulp の機能ではなく、[node-sass](https://github.com/sass/node-sass)の機能。
src で指定する scss ファイルが @import する時の対象ディレクティブを指定できます。
コンパイル対象のファイルからのパスではなく、 gulpfile.js のパスから記述する（多分）。

gulp.src には tmp/scss/bootstrap-custom.scss を指定。

```
cd scss
vi _variables-custom.scss
```

_variables-custom.scss で上書きカスタマイズしたい variables を記述。

```
cd ../
gulp
```

コンパイルされたcssを読み込む。

## リロードの自動化(livereload)

毎回 gulp コマンドを打つのも大変なので、自動化します。

```
npm install --save-dev browser-sync
```

[gulpでブラウザのリロードを自動化してみた](https://qiita.com/toshihirock/items/b6d8193f83d5d6ee2002)を参考に gulpfile.js を編集します。

適当なhtmlを作っておきます。

```
mkdir html
vi html/index.html
```

baseDir で指定したディレクトリより下のパスしか読めません。
baseDir に /html を指定すると、html内で呼び出す ../css が読めないので ＂cannot get＂が出る。

tmp を指定して index には /html/index.html を指定するなど。

gulp.taskで scss を監視するときは、 

```
gulp.watch('path/to/scss/*.scss', ['sass', 'bs-reload']);
```

な感じで。

gulp コマンド後、監視しているファイルを更新すると、自動的にブラウザをリロードしてくれます。

## 参考サイト
[bootstrap4 DOWNLOAD](https://getbootstrap.com/docs/4.0/getting-started/download/)
[Bootstrap 4のCSSコンパイルをGulpで管理する方法](https://qiita.com/tonkotsuboy_com/items/564f9bb78d177483f83e)
[絶対つまずかないGulp入門。インストールからSassのコンパイルまで](https://ics.media/entry/3290)
ASP.NET > ASP.NET Core > HTTP エラー 500.19 0x8007000d



## HTTP エラー 500.19 - Internal Server Error

確かにASP.NET Core環境をインストールしたはずなんだが、500.19エラーが出る。。。
という時の対処メモです。

以下のようなエラーがでました。
HTTP エラー 500.19 - Internal Server Error
ページに関連する構成データが無効であるため、要求されたページにアクセスできません。


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/cb9cee90-9dc8-f483-805b-dc6d24ea93e8.png)


web.config

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
	    <handlers>
	      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
	    </handlers>
	    <aspNetCore processPath="dotnet" arguments=".\MarketingMetric.Web.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
</configuration>
```



[Error 500.19 Internal server error on IIS- Stack Overflow](https://stackoverflow.com/questions/42837466/error-500-19-internal-server-error-on-iis)

[ASP\.NET Core Module \| Microsoft Docs](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/aspnet-core-module?tabs=aspnetcore2x)

[aspnet/AspNetCoreModule: ASP\.NET Core Module for IIS and IIS Express](https://github.com/aspnet/AspNetCoreModule)



##  Windows Server Hosting bundle.
ANCM is included in the .NET Core Windows Server Hosting bundle. 
https://aka.ms/dotnetcore-2-windowshosting


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/12e88a3c-4b8d-b0a2-8f56-273f7242c164.png)

IISのハンドラーマップ　>　モジュールマップの追加　画面を表示します。
モジュール一覧にAspNetCoreModuleが追加されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/ed65aad2-5188-05ba-bfa9-d18bed1bce48.png)


これでうまく動けばOK
エラーがでれば以下へ

[ASP\.NET > ASP\.NET Core > HTTP Error 502\.5 \- Process Failure \- Qiita](https://qiita.com/sugasaki/items/5a72b9a1e45cd90076c9)
ASP.NET > ASP.NET Core > HTTP Error 502.5 - Process Failure 


## HTTP Error 502.5 - Process Failure 

以下のような画面のエラーが出た場合

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/1e8af1ff-860a-5c29-7eb6-b14503d80d4e.png)

```
Common causes of this issue: 
• The application process failed to start 
• The application process started but then stopped 
• The application process started but failed to listen on the configured port 

Troubleshooting steps: 
• Check the system event log for error messages 
• Enable logging the application process' stdout messages 
• Attach a debugger to the application process and inspect 

For more information visit:  https://go.microsoft.com/fwlink/?LinkID=808681 

```

web.configの設定が間違っている場合があるようです。

[HTTP Error 502\.5 \- Process Failure" asp\.net core 2 error in Azure · Issue \#406 · aspnet/IISIntegration](https://github.com/aspnet/IISIntegration/issues/406)


asp.net core2　のweb.configの初期状態は以下

```xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\MarketingMetric.Web.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>
<!--ProjectGuid: d17d575b-0ed7-4c21-a91d-106c04de5c12-->
```
[React Native] Atom (Nuclide) でLinterを導入する


# はじめに
React Nativeのプロジェクトで、Atomエディタを使って開発しています。
以下はAtom（Nuclideパッケージ）を使う環境で、JavaScriptのLinterを使えるようにした時のメモです。


## lintとは
ソースコードの構文を解析するプログラム。
linterを導入すると、コードの構文チェックを自動で行ってくれます。

# 導入手順
バージョンは、npm 8.3.0, npm 5.5.1。

## Atomパッケージのインストール
AtomのSettingsもしくはapmで以下のパッケージをインストールします。

- linter
- linter-eslint
- linter-ui-default

その他、要求されたパッケージをインストールします。

以下の警告が出た場合は、`Disable Linter` か `Disable Diagnostics` のどちらかを選択します。

<img width="469" alt="8110cc77-b462-bb89-8ee6-478788f7ec80.png" src="https://qiita-image-store.s3.amazonaws.com/0/17330/23a3d902-c9a9-189c-3306-bf048850338e.png">


今回は`Disable Linter`を選択。
lintの結果はatom-ideのdiagnosticsのUIに表示されます。


## サンプルアプリ作成
動作確認のためのアプリを作成します。

```
$ npm install -g react-native-cli
$ react-native init AwesomeProject
$ cd AwesomeProject
```

## npmモジュールのインストール

`eslint` と `babel-eslint` をインストールします。

```
$ npm install eslint --save-dev
$ npm install babel-eslint --save-dev
```

今回は [airbnb/javascript: JavaScript Style Guide](https://github.com/airbnb/javascript) を使いたいので、` eslint-config-airbnb` をインストールします。

```
$ npm install eslint-config-airbnb --save-dev
```

プロジェクトの `import { AppRegistry } from 'react-native';` のコードについて、Atom上でエラーが出たので `eslint-plugin-import` もインストールします。

```
$ npm install eslint-plugin-import --save-dev
```

## .eslintrcファイルの作成

プロジェクトのルートディレクトリに`.eslintrc`を作成します。

```js:eslintrc
{
  "extends": "airbnb",
  "parser": "babel-eslint",
  "ecmaFeatures": {
    "classes": true,
  },
  rules: {
    // React Native ではJSファイルにJSXを書く
    'react/jsx-filename-extension': ['error', { extensions: ['.js', '.jsx'] }],
    // React Nativeでは画像を相対パスで読み込む
    'global-require': 'off',
  },
}
```

## 動作確認

Atomを再起動して、何かコードを書きます。
以下のようにLinterが警告を出してくれるようになりました。

<img width="635" alt="ee36736e-9084-fec5-295d-c81d4e711402.png" src="https://qiita-image-store.s3.amazonaws.com/0/17330/ad00b0d4-3355-6ca1-288d-a2f79d260ba9.png">

# さいごに
React NativeのプロジェクトでAtomにLinterを導入する手順を紹介しました。
あとはプロジェクトに合わせて `rules` などをカスタマイズしていけばよさそうです。

# 参考
- [Atom](https://atom.io/)
- [Nuclide | Nuclide is built as a single package on top of Atom to provide hackability and the support of an active community. It provides a first-class development environment for React Native, Hack and Flow projects.](https://nuclide.io/)
- [Getting Started · React Native](https://facebook.github.io/react-native/docs/getting-started.html)
- [javascript/packages/eslint-config-airbnb at master · airbnb/javascript](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb)
- [Linting for React Native – pvtl – Medium](https://medium.com/pvtl/linting-for-react-native-bdbb586ff694)
- [react-nativeにESLint(airbnb style)を適用した際のビフォーアフター - Qiita](https://qiita.com/romiogaku/items/27929395e3133b514516)
- [ESLintをAtomに導入し、Reactの構文にも対応したAirbnbのJSスタイルガイドを使う | maesblog](https://mae.chab.in/archives/2874)
配列操作で「引数で指定した値が見つからない場合」の戻り値を指定する方法

#方法

こんな配列があったとする。

```ruby
a = [1, 2, 3]
```

存在する値（1）を削除すると、その値が戻り値になる。

```ruby
a.delete(1)
#=> 1
```

存在しない値（100）を削除しようとした場合はnilが返る。

```ruby
a.delete(100)
#=> nil
```

ブロックを渡すと、指定した値が見つからない時の戻り値にすることができる。

```ruby
a.delete(100) { '削除失敗' }
#=> "削除失敗"
```

#違和感

しかし、これがピンと来ない。
ブロックが戻り値になるのは、`delete`できなかった時ではなく、成功した場合のように感じてしまう。
恐らく理由は2つ。

1. if文の条件式と混同している
2. 以前書いていたC#では、`remove`（Rubyの`delete`同様、配列から特定の要素を削除するメソッド）の戻り値がboolean

```ruby
a = [1, 2, 3]

if a.delete(1)
  p('削除成功')
end

#=> "削除成功"
```

そういうものだと割り切るしかないんだろうけど、混乱しそうなので備忘録として。

#参考
[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/dp/B077Q8BXHC/)
perlでfileの内容を変数に読込む

perlでfileを変数に読込む処理をネットで探しても解説がメインでコレだといったものがなかったのでメモ

```perl
#!/usr/bin/perl

$file = '/tmp/test';
open my $fh, '<', $file
    or die $!;
my $content = do { local $/; <$fh> };
close $fh;
print $content;
```

もっとベターな書き方があれば教えてください
Cognosレポートで「その他」のアイテムを作成する方法

#概要
以下のレポートのイメージで、元々「発注方法」は7種類のアイテムがありますが、数量の上位4個以外をまとめて「その他」として集計して表示する方法です。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/078c1355-3df9-8f1a-3b70-b764f2a973b0.png)

#実装
DMRモデルである「GO販売(分析)」を使用しています。
リストに「発注方法」と「数量」のデータアイテムを配置しています。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9fe5210a-35c9-23b5-9680-06bebfc7bce7.png)

リストのクエリーの中身はこんな感じです。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8c6f2648-3313-ad2a-59a8-f315ee63d346.png)

「発注方法並び替え」のデータアイテムは、発注方法を数量の大きい順に並べ替えています。

```html
order([販売 (分析)].[発注方法].[発注方法].[発注方法のタイプ],[数量],BDESC)
```

「発注方法」は、リストに登場しているアイテムで、「その他」を実装しているロジックは以下です。
最初の \_firstFromSet() の中で、ベスト4を出力しています。
その後の、\_remainderSet() の中で、それ以外のメンバーをまとめた「その他」を作っています。

```html
  union(
  _firstFromSet (
     [発注方法並び替え]
    , 4
    , 1
  )
  ,  _remainderSet (
    member(
        currentMeasure - total(currentMeasure within set _firstFromSet([発注方法並び替え],4,1))
      , 'その他'
      , 'その他'
      , hierarchy([発注方法並び替え])
    )
    , [発注方法並び替え]
    , 5
  )
)
```

#参考
**Quickie: Top 5 or Top 4 with “Others”**
http://cognospaul.com/2017/03/06/quickie-top-5-top-4-others/
デザイナーとアプリエンジニアが仲良く開発できるためのチートシートを作る

Classiアドベントカレンダー8日目は、デザイナー@shio312がお送りします。

# **はじめに**

**あるデザイナーとアプリエンジニアの会話**
・iPhoneナビゲーションバーを差しながら「グロナビが〜」
・iPhoneで作ったカンプを差しながら「Androidもこの切り替えスイッチのUIで〜」
・「Androidも下から画面出せばいいじゃん」
・「トグル？iOSだっけ」

上記デザイナーの発言、全てエンジニアに殺意を沸かせます。ああっ、すみません。


実は、アプリ開発経験のあるUIデザイナーはエンジニアさん&デザイナーさんが仲良く開発できるための、自分なりのチートシートを持っていたりします。
もし、モバイル開発の経験が少ないデザイナーさんと開発することになった場合、今回ご紹介する簡易チートシートの作成方法を優しく教えてみてはいかがでしょうか。
きっと仲良くなれると思います。


# **手順**


### **デザイナーさんの工数30分をもらう**
笑顔で呼びましょう。目安はいつもの３倍くらいで。

### **素材をダウンロードする**
ちなみにXDデータだと爆速です。

- iOS
https://developer.apple.com/design/resources/#ios-apps

- Android
https://material.io/guidelines/resources/sticker-sheets-icons.html

### **展開する**
ちなみにXDデータだと爆速です（2度目）。

![展開する.png](https://qiita-image-store.s3.amazonaws.com/0/132799/6109bcfc-50ce-239e-1bcc-a1fd90ead8de.png)

左がiOS、右がAndroidのUIコンポーネントです。

### **各コンポーネントごとにスクショする**
各OS5分くらいずつで終わります。なるべく細かくスクショした方が後でカスタムしやすいです。

![スクショ連続.png](https://qiita-image-store.s3.amazonaws.com/0/132799/ae58b4c6-df95-bf9c-3313-0c33db48ae03.png)


### **チーム共有のWikiなどにまとめる**
各OS、共通のパーツを並べて表示することが大事です。
ここで、自身なりの注意すべき点などを随時追加しましょう。
![チーム共有のWikiなどにまとめる のコピー 2.png](https://qiita-image-store.s3.amazonaws.com/0/132799/6748a3d1-6ca7-f476-a08b-29fb4f49bbea.png)

これで、各OSのUIパーツの違いが早見できるようになりました。

開発が進んでいく際に、**プロダクトに合わせたデザインに置き換えていくことができれば社内のデザインガイドラインになるので超便利**です。



#なぜこんなことをするのか？
・OSによってあるものないものをちゃんと把握するため
・2つ以上のOSで開発することになった場合（特にiOS/Androidの組み合わせですね）どっちのOSの話なのかわからないまま進む場合があり、余計なコミュニケーションを発生させないため

#つまり
**開発時の用語は開発用語で統一しよう。**（デザイナーに開発用語を使ってもらう）
ユーザー視点では無いですが、それはそれで別視点で言い方を考えます。

例えばiOSの場合、ユーザーへの手順は

- `この画面はアプリ内のブラウザでWEBサイトを表示していて、画面右上のインフォメーションアイコンをタップするとお店の情報が表示されます`


だと、仕様としては

- `この画面のコンテンツビュー部分はWEBビューで、ナビゲーションバー右側のインフォアイコンをタップするとお店の情報がモーダル表示されます`（とモーダルビューは一時ビューなので閉じるボタンはちゃんとある、と想定が可能）




になるんです。

デザイナーがUIのパーツやOSのお作法を正しく理解して使うことで、設計の意図を無駄なく伝えることができます。
そして、**イレギュラー要素が発生した場合もエンジニアに「ここだけがこのアプリ独特の要素」だと注意させる**こともできます。


チームが幸せに開発できることで、ユーザーに良いプロダクトが提供できることを信じています。
RxJavaで安全にイベント通知を行うためのRxRelay

これは [RxJava Advent Calendar 2017](https://qiita.com/advent-calendar/2017/rxjava) の7日目の記事です。意外とカレンダーがスカスカしていてRxJava自体の知見はだいぶ出尽くしてしまったのかなという感じですね。

今回はRxRelayというライブラリを紹介しようと思います。
※ RxJavaについての基礎知識はあることを前提とした記事です。

## RxRelayとは

- https://github.com/JakeWharton/RxRelay
- Android界隈では神とも呼ばれる、Jake Wharton氏によるRxJava用のライブラリ
- Subjectより安全な、Relayという仕組みを導入するもの

RelayはSubjectから `onComplete` と `onError` を呼ぶ機能をなくしたもので、つまり `onNext` で値を流すことに特化したSubjectということができます。Relayは以下の性質・機能を持っています。

- `Observable` および `Consumer` としてふるまう
- `accept` で受け取った値を `onNext` に流す
- ストリームが終了することはない
- `observable.subscribe(relay)` はDisposableを返すので購読の解除がかんたん
- `toSerialized()`　を呼ぶことによりスレッドセーフなRelayを生成できる
- `AsyncSubject` にあたる `AsyncRelay` は存在しない（ストリームの終了がないため）

これらの性質により、Relayは非RxなAPIをRx用のイベントストリームに変換するのに非常に適しています。

## Relayの使いどころ

Subjectを使っていて `onNext` で値を流しているだけのものはRelayに置き換えてしまうことが可能です。

例えば、RxBindingを使ってMVVMのデータバインディング（AndroidのDataBinding Libraryではないです）を実装しているパターンで、ボタンのクリックイベントをViewModelに伝えたい場合、Subjectで書くと以下のようになります。

```kotlin
class SomeViewModel {
    val onButtonClick = PublishSubject.create<Unit>()
}

val viewModel = SomeViewModel()

button.clicks()
        .subscribe { viewModel.onButtonClick.onNext(Unit) }
        .addTo(...)
```

これをRelayで置き換えると、

```kotlin
class SomeViewModel {
    val onButtonClick = PublishRelay.create<Unit>()
}

val viewModel = SomeViewModel()

button.clicks()
        .subscribe(viewModel.onButtonClick)
        .addTo(...)
```

このようにスッキリ書くことができ、 `onNext` が排除されてデータバインディングのリアクティブ感もより高まると思います。（個人の感想です）

## RxSwiftにも輸入された

RxSwiftにもRxSwift4からRelayが導入されたようです。正確には、Cocoa/UIKitとのバインディングを提供するRxCocoaの方に導入されたのですが、ほぼ標準の機能と言って良いでしょう。

参考記事: 
http://tech.mercari.com/entry/2017/12/04/103247
http://tech.connehito.com/entry/variable-is-deprecated

RxJava/RxSwiftで両OS用アプリを開発している身としては非常に助かります :smiley:
RxJavaもRelayを標準機能として取り入れてもいい気がしました。

## 追記: RxJSにも

ちょうどこの記事を書いた数日後ですが、RxJS向けのRelayもリリースされていました。（しかもMicrosoft製）

https://github.com/Microsoft/RxRelayJS

以上です。
配列をハッシュに変換する方法

基本的だけれども忘れがちな、配列をハッシュに変換する方法のメモ

# 配列の配列を変換 → `Hash[ary]` or `Array#to_h`
`[[key0, val0], [key1, val1], ...]`形式の配列をハッシュにする場合は、`Hash[]`の引数にそのまま突っ込むか、素直に`to_h`でOK

```rb
alist = [[1,"a"], [2,"b"], [3,["c"]]]
p Hash[alist]  # => {1=>"a", 2=>"b", 3=>["c"]}
```

# 一次元配列を変換 → `Hash[*key_and_value]`
`[key0, val0, key1, val1, ...]`形式の配列には`to_h`は使えません。
この場合は`Hash[]`で良いですが、上の場合と違い`*`で引数を展開する必要があります

```rb
ary = [1,"a", 2,"b", 3,["c"]]
p Hash[*ary]  # => {1=>"a", 2=>"b", 3=>["c"]}
```

# Kernel#Hash
おまけで。
`Kernel#Hash`というメソッドがありますが、これは引数を`to_hash`で変換します（`to_h`はしてくれない）。
`Array`には`to_hash`メソッドは定義されていないので、今回は利用できません。

ただし、例外で空配列の場合のみ空のハッシュが返されます。

```rb
Hash([1,"a", 2,"b", 3,["c"]])  # => TypeError: can't convert Array into Hash
Hash([[1,"a"], [2,"b"], [3,["c"]]])  # => TypeError: can't convert Array into Hash
Hash([])  # => {}
```

# 参考
[singleton method Hash.\[\]](https://docs.ruby-lang.org/ja/latest/method/Hash/s/=5b=5d.html)
[module function Kernel.#Hash](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/Hash.html)
[入門]ScalaでMVCを構築する

# はじめに
Scalaの超軽量フレームワーク「Scalatra」上でMVC構造を構築するまでを解説します。
**Scalatraだけでなく、Scalaは記事が少なすぎる**。

タグを見るとわかるが、Scalatraに限って**8**です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153320/98d64704-3f45-8190-7710-2c86f2aa838a.png)

圧倒的少なさから入門もしにくいし、、、
そのせいで、普段はSwift,Go, Python, Rubyを書きますが、Scalaをやると非常に面白いが文献が少なかった。
なので今回はWebアプリケーション開発できるようにMVCを構築することから始めます。

# ニーズ
自分は普段からRailsや、Django、Ginなどの「フルスタックフレームワーク」で開発をしたりしますが、MVC構造といってもあまりにも自由がないです。
Railsなんてブラックボックス化がひどいし、体験的なプログラミングをしてない気がします。

# 前提

本記事は以下のことを対象にしています。

- すでに`bst`などでビルトが済んでいる方

を対象にしています。

# ディレクトリ構造

若干の違いはあるかもしれませんが、以下のようなディレクトリ構造をしているはずです。

```
src
├── main
│   ├── java
│   ├── resources
│   │   └── logback.xml
│   ├── scala
│   │   ├── ScalatraBootstrap.scala
│   │   └── com
│   │       └── example
│   │           └── app
│   │               └── ScalaServlet.scala
│   └── webapp
│       └── WEB-INF
│           └── web.xml
└── test
    ├── java
    ├── scala
    │   └── com
    │       └── example
    │           └── app
    │               └── MyScalatraServletTests.scala
    └── scala-2.12
```

初心者な私には、どこに何を配置したらいいのかわからなかったのですが、Goのpackageを思いました。
Packageとは、名前空間と覚えればオッケイ。

つまり、MVCにするならばpackageで区切ればよくて、次の問題は**どのように明示的にMVCであることを透明性を保ったまま構築できるか**です。

もちろんapp以下に構築するのがいいかもしれません。
先程のディレクトリツリーを抜粋して以下のように変更します。

```
src
├── main
│   ├── java
│   ├── resources
│   │   └── logback.xml
│   ├── scala
│   │   ├── ScalatraBootstrap.scala
│   │   └── com
│   │       └── example
│   │           └── app
│   │               └── ScalaServlet.scala
│   │               └── view
│   │               └── controller
│   │               └── model
│   └── webapp
│       └── WEB-INF
│           └── web.xml
└── test
```

`ScalaServlet.scala`を中心に、MVCを構築すると透明性の高く、開発しやすいのでおすすめです。
配列名を使ってfastaをまとめて別ファイルに出力

Rをつかって、multi_fastaファイルから、配列名が同じものを切り出して、1つのファイルにまとめる。
配列の由来がわかるように、個別の名前もつけておく.

２つの生物種の全遺伝子が1ファイルにそれぞれまとまっているときに、
それぞれからオーソログ遺伝子を取り出して、別ファイルにするときなどを想定

```R:select.R

# パッケージのインストール
#source("http://bioconductor.org/biocLite.R")
#biocLite("Biostrings")

# パッケージのロード
library(Biostrings)

# 指定したファイルを読み込む
F1 <- readDNAStringSet("./Fasta1.fa")
F2 <- readDNAStringSet("./Fasta2.fa")

F1_name <- names(F1)
F2_name <- names(F2)
names(F1)<-sub("^","f1_", names(F1))
names(F2)<-sub("^","f2_", names(F2))


# for文で要素ごとに書き出す
for(i in 1:length(F1)){
  for(j in 1:length(F2)){
    if(F1_name[i]== F2_name[j]){
      outFileName  <- paste(F1_name[i],"fa",sep=".")
      writeXStringSet(c(F1[i], F2[j]), file=outFileName)
    }
  }
}

```
Spring Bootで環境ごとに設定をわける方法

# このドキュメントについて
* Spring Bootで本番環境と開発環境で設定どうやってわけるねんってなったので、調べたときのメモ
* Cloud Foundry使ってるのでそこでのやり方も記載する

# 先にまとめ
* 環境ごとにapplication-環境名.ymlみたいなファイルをつくる
* 環境変数か起動時のオプションで変更する
* Cloud Foundryでやる場合はenvに設定すれば切り替えてくれる

# application.ymlを環境ごとにつくる
* ここでは、APIのURIをapplication.ymlで設定しているケースを想定している
* 下記のそれぞれをresources配下に設置する(ちなみに名前はなんでもいい)

#### application-staging.yml

```yaml
api:
  hostname: http://staging.example.com
  path: /v1/hello
```

#### application-production.yml

```yaml

api:
  hostname: http://production.example.com
  path: /v1/hello
```

# 起動時の引数で環境を指定する
起動に下記のオプションを指定する

```bash
$ java -jar -Dspring.profiles.active=production 起動したいjarファイル
```

# 環境変数で環境を指定する
実行したい環境で下記コマンドで環境変数を指定する

```bash
$ export spring_profiles_active=production
```

# Cloud Foundryの場合、manifest.ymlで環境を指定する
manifest.ymlに下記を指定する

```yaml
applications:
- name: application-name
  ...
  env:
    SPRING_PROFILES_ACTIVE: production
```

# 参考資料
* [Writing Client Applications | Pivotal Docs](https://docs.pivotal.io/spring-cloud-services/1-3/common/config-server/writing-client-applications.html)
* [springframework profile機能について | Exception Blend](https://exceptionblend.wordpress.com/2013/02/11/springframework-profile/)
* [Spring-Bootの設定プロパティと環境変数 - Qiita](https://qiita.com/NewGyu/items/d51f527c7199b746c6b6)
* [Spring Boot Reference Guide #boot-features-profiles](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-profiles)
PHPで多重連想配列からデータを検索、array_searchをシンプルにまとめました

# PHPで配列からデータを検索する方法
phpで配列からデータを検索する方法を、コピペで利用できる様にまとめたいと思います。

phpのバージョンは7系で記述します。

## 配列からデータを検索する
シンプルに配列からデータを取得する、1行コードです、コピペしてお使いください。

```php:1行実装
$result = $animes[array_search("狼と香辛料", $animes)];
//　　　　　　　　　　　　　　　　　検索配列　　　　　　　　　　　　　　　　　　　　　　　　　　　　ID, 検索配列
```

### 配列からデータを検索する方法のちょっとした解説 :beer:

```php:元データ
$animes = [0 => "狼と香辛料", 1 => "ゼロの使い魔", 2 => "宝石の国"];
```

```php:連想配列からデータを取得する
$keyIndex = array_search("狼と香辛料", $animes);
$result = $animes[$keyIndex];

var_dump($result);
```

```php:結果
string(15) "狼と香辛料"
```

## 多重連想配列からデータを検索する
シンプルに配列からデータを取得する、1行コードです、コピペしてお使いください。

```php:1行実装
$result = $animes[array_search("狼と香辛料", array_column($animes, 'animeName'))];
//　　　　　　　　　　　　　　　　検索配列　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　検索したい値　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　検索配列　　　　　何で検索するか
```


### 連想配列からデータを検索する方法のちょっとした解説 :beer:
詳細なデータを含む多重連想配列からデータを検索します。
こちらが検索元データです。

```php:元データ
$animes = [
	0 => ["animeId" => 1, "animeName" => "狼と香辛料"],
	1 => ["animeId" => 2, "animeName" => "ゼロの使い魔"],
	2 => ["animeId" => 3, "animeName" => "宝石の国"]
];
```

```php:多重連想配列からデータを取得する
//アニメ名で検索するので animeNameを指定。
$keyIndex = array_search("狼と香辛料", array_column($animes, 'animeName'));
$result = $animes[$keyIndex];

var_dump($result);
```

以下の様なデータを取得できます

```php:結果
array(
	'animeId' => (int) 1,
	'animeName' => '狼と香辛料'
)
```
RxJavaで再帰呼出し

RxJava使って再帰呼び出ししたいなと思って試してみたメモ。

```kotlin

fun cyclic(index: Int = 0): Observable<Int> = when(index) {
    in 0..5 -> Observable.concat(Observable.just(index), cyclic(index + 1))
    else -> Observable.empty()
}

cyclic().subscribe { println(it) }
=> 0
1
2
3
4
5

```
JavaのBuilderでのメソッドチェーンのメソッド名＋α

#JavaのBuilderパターンで
Builderパターンを用いてClientクラスを生成する処理を実装していた際、
自分はパラメタを設定するメソッド名に「header」とか「body」とか、パラメタ名をそのまま指定する派なのですが、
setとかaddとか、動詞が接頭辞として付いてた方がJavaらしいし分かりやすくていいよね。という話がありました。
（headerとかだけだと、上書きされるのか追加されるのか分かりにくい＝結果が分かりにくい）

自分が使ったことがあるフレームワークやライブラリではパラメタ名のみの方が多いイメージなのですが、
Javaらしさと言われれば確かに動詞としての接頭辞がある方がしっくりくる気がします。（分かりやすさもしかり）
ネット上のBuilderパターンの説明でもパラメタ名のみが多いので、パラメタ名のみがスタンダードだと（個人的には）思ってますが、どちらが一般的なのでしょう。。

#＋α
上記に関連して、メソッドチェーンの好き嫌いについても話題になったので。
自分はメソッドチェーン大好き派なので、結構実装では多用したくなっちゃいます。
が、「１行で全部連なって書かれてると消したい場所だけ消すのにマウス操作とかの手間がかかるから苦手。」という意見を受け、あくまで好き嫌いの問題ですが、意外と苦手な人も多いんだなという認識を受けました。
（簡潔に記述できて自分は好きなのですが。。）

#ということで
話の中で話題として上がったので、何となく書き連ねてみました。

皆さんはどちら派でしょうか？
自分はパラメタ名のみ派 + メソッドチェーン大好き派です。
Scalaz 名前がかっこいい



今回初めて本格的にScalaプロジェクトを引き継いだその際にScalaZというマジンガーZみたいでかっこいい名前のライブラリを使用していた。その辺のScalazについての使用方法について前任者H氏のメモを書きたいと思います。

### Scalazとは

Scalaをより簡単に関数型プログラミングで記述できるライブラリで本家のScalaのサイズをしのぐライブラリ群のことです

wiki https://github.com/scalaz/scalaz/wiki
githubリポジトリ https://github.com/scalaz/scalaz
scaladoc http://scalaz.github.io/scalaz/#scaladoc

### 使用していたものたち

### scalaz.\\/ （Disjunction）

- `scala.util.Either` の代替でforの中の.rightを書かなくて済む
- matchの中のRight、Leftの記号が面白いハイフン出てる方で表すんだ〜と思った


```scala
// Throwable \/ Int は中置記法で、\/[Throwable, Int] と同じ
def f: Throwable \/ Int = ???
def g: Throwable \/ Int = ???
def h: Throwable \/ Int = ???

val result = for {
  a <- f
  b <- g
  c <- h
} yield a + b + c

result match {
  case \/-(x) => println(s"処理結果: $x")
  case -\/(e) => println(s"エラー: $e")
}
```

※JIS Macbookを使っていたので「\（バックスラッシュ）」を入力するのに一瞬困る　
https://qiita.com/miyohide/items/6cb8967282d4b2db0f61

### scalaz.EitherT

- `\/` と `Future` などがスタックしている場合の利便性のために使用していた
- `\/` と `Future` がスタックしている型をfor式で扱おうとすると、ネストしてしまうので
EitherTを使用してネストなしで書いていた

```scala
// 戻り値の型をEitherTにする
def f: EitherT[Future, Throwable, Int] = ???
def g: EitherT[Future, Throwable, Int] = ???
def h: EitherT[Future, Throwable, Int] = ???

// for式がネストしない
val result = for {
  a <- f // a にバインドされる型は、Int
  b <- g
  c <- h
} yield a + b + c

// 最後に run で Future[Throwable \/ Int] に変換する
val result2: Future[Throwable \/ Int] = result.run
```

### scalaz.Validation

- `scalaz.Validation` は、複数の入力チェックメソッドを一通り動作させ、エラーが検出された場合は全てのエラーを集約した状態で返す型
- `|@|` 演算子で連結すると、for式とは異なり、途中でエラーを検出しても処理を止めない

```scala
// ValidationNel[A, B] は、Validation[NonEmptyList[A], B] のエイリアス
// NonEmptyListは、要素が1以上格納されていることが保証されているリスト
def f: ValidationNel[String, Int] = ???
def g: ValidationNel[String, Int] = ???
def h: ValidationNel[String, Int] = ???

// |@| はアプリカティブファンクタの演算子
// 例えば、f が Failure だったとしても 後続の g、h を処理する
val result = (
  f |@|
  g |@|
  h
) { (a, b, c) =>
  a + b + c  
}

// Validation に対するパターンマッチ
result match {
  case scalaz.Success(x) => println(s"処理結果: $x") // x: Int
  case scalaz.Failure(e) => println(s"エラー: $e") // e: NonEmptyList[String]
}
```
※どう見ても|@|は"なると"だよな〜　でもすごい便利だなぁと思った


最後に
※Scalaの記号っておでんだよね〜って引き継ぎで笑って終わったのが印象的だった
\/-(x)とか-\/(e)はどう見ても串にさしたおでんのはんぺんに見えてくるしろものだ"\\&/"とかはしらたきか


\/|@| <> <> ^ &&& :-> <-: >>= ||| <<< >>> |=> <=| |> ?? |+| !&& --> | ? <^> !? :?>> <<?: :++> :++>> <++: <===> -+- =?= ⊛\&/
プロダクトがユーザへ提供すべき、大事な2つのポイント

コンシューマ向けプロダクト開発において２つの大きな要素である「**納得感**」と「**説得力**」について紹介します。

## 良いものを作ったんだけど……
あなたは素晴らしいプロダクト・素晴らしい機能を作りました。
ユーザもそれを使ってくれました。
もちろん、要望を満たすであろう結果を返しています。

・・・でも、**なぜかユーザの反応が思わしくない。**

それ、もしかしたら **納得感** が足りてないのかも。

## 納得感
プロダクトは何らかの価値をユーザに提供するモノです。
では「**ユーザに価値が提供できた**」とはどういう状態でしょうか？

例えばユーザの質問に答えるプロダクトがあったとします。
ユーザは何らかの手段（文字入力？音声？）でプロダクトを介して質問をします。
プロダクト側は何らかの形（テキスト？音声？）でユーザに向けて回答をします。
プロダクトの裏にあるシステムではスーパーウルトラ凄い人工知能が動いており、どんな質問にも瞬時に、100%正確に答えを返せるものとします。

さて、これで全てのユーザは満足するでしょうか？
答えは **NO** です。
少なくとも、ユーザを満足させるには以下の大前提が必要です。

それは・・・「**ユーザに、このプロダクトが100%正確な答えを返してくれると納得してもらう**」ことです。

## 納得感がもたらすもの
前述のプロダクトは機能面では完璧なものだといえます。
しかし残念なことに、そのプロダクトを使うユーザ（つまり人間）は不完全なのです。
プロダクトがどんなに完璧な回答を出そうとも、受け手のユーザが「お、これは完璧な答えだ」と思わない限り、その完璧さ・素晴らしさは無意味になってしまいます。
嗚呼、なんて悲しいのでしょう……

さて、そこで必要になるのが **納得感** です。
ユーザがプロダクトを使うに辺り「お、こいつは完璧な答えを返すのだな」と納得していれば、前述の問題はクリアできます。

つまり、ユーザに納得感を与えることで、我々はようやくプロダクトの価値を正しく提供できるようになります。
（さらに言えば価値を誇張して捉えさせることも可能ですが、今回は割愛します）

# 納得感を引き出す説得力
ということで、ユーザに納得感を持ってもらわないとマズそうだと分かりました。
では具体的にどうすれば良いのでしょうか。
例えば先述のプロダクトについて「何でも完璧な答えを返すマシーン」とでも銘打てば良いのでしょうか？
（もちろんそれじゃダメだと分かりますよね）

ここで必要となるのが **説得** です。
我々はユーザに対し「このプロダクトは完璧な答えを返すんだよ」と一方的に伝える（先ほど名前付けみたいなもんですね）だけでなく、納得してもらえるよう説得しなければならないのです。
この世の中は、言ったら言った分だけ信じてくれるような純白の精神を持った人間は多くないのです。
だからこそ我々はユーザに信じてもらえるよう、**説得力** を磨かねばなりません。

# 説得力持たせるには
説得力を持たせる方法は沢山あるだろうと思いますが、今回は「**信頼感**」と「**オーナーシップ**」の２つについて書きます。

### 信頼感
見ず知らずの人の話す内容より、身近な人の話を信じた経験はありませんか？
このように人間は信頼できる相手の話の方をより信じやすいです。
先ほどのプロダクトについても、名も無いスタートアップが発表した場合とGoogleが発表した場合では、仮に同じ性能でもユーザの納得感が大きく違うと分かるはずです。
このケースで信頼感を勝ち取る為には実績を積み上げる必要があります。
ユーザに大きな何かを納得してもらうには、小さな事柄について少しずつ実績を積み上げてからの方が良さそうです。
（人間関係と同じですね）

他にはユーザに対して何をしているか明らかにすることで信頼感が高められます。
先ほどのプロダクトの場合は、きっと凄い規模であろう「スーパーウルトラ凄い人工知能」のハードウェア群を見せてあげることで信頼感が得られそうです。
これはもっと簡単な内容にもでき、例えば何かレコメンドを出すときに「あなたにオススメ！」ではなく、「**あなたの○○に基づいたオススメ！**」とするだけでも効果があります。
（ただし「○○に基づいた」の部分に納得感が必要になる為、あまり複雑でないことが望ましいです）

### オーナーシップ（自分ごと、所有感）
これはよくある「自分の目で見るまでは信じない！」というやつです。
他者の行動については色々と思うところは出てきますが、自分自身の行動の結果は疑いようがありません。
例えば世の中に数多の検索サービスがありますが、それらを使う際に「自分の指定した条件以外で検索されている」と疑うユーザは少ないと思います。
ユーザの手間と天秤にかける必要がありますが、少なくともユーザは自身の操作については納得してくれますので、自然な形でそれをプロダクトが価値を提供する流れに組み込むと良さそうです。

# まとめ
* 素晴らしいプロダクトを作っただけで満足してはいけない
* ユーザに納得してもらうことで、プロダクトの価値が正しく提供できる
* ユーザへの納得感を高めるには説得力が必要
* 説得力を高める例として「信頼感」と「オーナーシップ」がある。

# あとがき
コメント欄にて忌憚のないご意見がいただければ幸いです。
GCP Datastore に GAE/Go で入門

Google App Engine で開発する上で Datastore を触りました.
MySQL 等の RDS と勝手が違かったのでメモ程度の情報を書いていきます.

##用語
##### 種類 (Kind)
いわゆるテーブルです. RDS の用にテーブル内にレコードが存在するのではなく, 
あるデータがなんの種類かという感じなのかな. でもテーブルみたいな認識でとりあえず問題ないかと.

##### エンティティ (Entity)
RDS でいうレコードです. NoSQL なのでスキーマレスです. 配列や地理位置情報なんてのも入れられます(GoogleMapとかに使うのか?). エンティティをさらに入れ子にすることもできます. 
これらの値はエンティティに対してプロパティと呼ばれます. それぞれのプロパティはインデックスに登録することもできます.

##### キー識別子 (Key)
いわゆるプライマリーキーです. 種類中で一意になります.
作成時は自動生成の数値IDか自分でカスタム名をつけることもできます.
(なぜかGCPコンソールのエンティティ画面では ID と表記されている)

##### 祖先 (Ancestor)
親子関係を簡単に設定できるらしいですが, そこまで複雑なデータ構造を作る気がなかったのであんまり調べてないです.

## エンティティを作ってみました
ユーザーデータを管理する UserData の種類を作成しました.
GAE のサービス上で登録済みユーザーかどうかを管理するだけのものです.

| ID       | Activated      |
|:----------|:---------------|
| hoge@hoge.com | true  |
| fuga@fuga.com | false |
| moge@moge.com | true  |

ここでIDを自動生成にして以下のような構成も考えられましたが

|ID | Email       | Activated      |
|:------|:----------|:---------------|
|52902520520| hoge@hoge.com | true  |
|52055227822| fuga@fuga.com | false |
|52027859251| moge@moge.com | true  |

ユーザーはサービス内でユニークなので Email 自体をIDにしてしまった方が管理上楽だと思いました.
プロパティにすると同じ Email で登録できてしまうので重複判定のコードを書くのが面倒です.
(スキーマレスにユニーク制約なんてものはない)

## Go でデータを取得してみます

``` go
import (
  "context"
  "google.golang.org/appengine/datastore"
)

type UserDataModel struct {
  Activated bool `datastore:"Activated"`
}

func GetUserData(ctx context.Context, email string) (*UserDataModel, error) {
  var userData UserDataModel
  key := datastore.NewKey(ctx, "UserData", email, 0, nil)
  err := datastore.Get(ctx, key, &userData)
  if err != nil {
    if err == datastore.ErrNoSuchEntity {
      return nil, nil
    } else {
      return nil, err
    }
  } else {
    return &userData, nil
  }
}
```
※context は appengine.NewContext で取得したものを使用します.

Datastore は Json の Unmarshal と同様に構造体を定義しておくとよいです. 
このとき, `datastore:"<<Datastore内のプロパティ名>>"` とできるのも Json と同様です.
データ取得はキーが特定できるている場合は, `datastore.Get()` , 条件を指定する場合は `datastore.NewQuery().Filter()` のように書きます. 
今回は Email がキーなので Get を使用します.
キーは datastore.NewKey() 関数で作成します. 第2引数が種類, 第３引数がカスタムキー, 第４引数が自動生成の数値キー, 第５引数が祖先になります. カスタムキーが空白でなければ第４引数は無視されます.

エンティティが未登録で取得できない場合は err に datastore.ErrNoSuchEntity が返ります. この場合はユーザー登録に誘導したいので, ユーザーデータは nil, err はそのまま返すようにしました. ここは呼び出し元でエラーハンドリングする手もあるので好みかと.

ちなみにクエリで取得する場合は以下のようになります.

```go
func GetActiveUserData(ctx context.Context) (*UserDataModel, error) {
  var userDataList []UserDataModel
  query := datastore.NewQuery("UserData").Filter("Activated=", true)
  _, err := query.GetAll(ctx, &userDataList)
  if err != nil {
    return nil, err
  } else {
    return userDataList, nil
  }
}
```
Filter のプロパティ名に条件まで含めるところがなんかいやらしい.
query.GetAll の第一返り値は取得したエンティティのキーリストです.
また, err は appengine.MultiError です. 中身をさらに細かくエラーハンドリングすることもできます.
Filterはメソッドチェーンにより AND 条件を追加していくこともできます.
しかし, **ORはできない. NOT もできない. LIKE もできない. IN もできない** (とりあえず現状Goではできない)のでRDS勢がデータ設計するときにハマるかもしれません.
まあRDSが欲しいなら普通に Cloud SQL 使えばいいと思います.

入門なので今回はこんなところです.
【micro:bit】Arduino IDE でプログラミング

# はじめに

これは [micro:bit Advent Calendar](https://qiita.com/advent-calendar/2017/microbit) 7 日目の記事です。

# Arduino IDE で micro:bit を使えるようにする

## ライブラリの導入

 1. Arduino IDE の [ファイル | 環境設定] で "追加のボードマネージャの URL" に以下の URL を追加。

```
https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json
```

 2. [ツール | ボード | ボードマネーシャ] でボードマネーシャを開く。

 3. **Nordic Semiconductor nRF5 based boards** を探してインストール

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/07c71f20-f43b-e75b-e9de-4a5150938ad0.png)

  4. [ツール | ボード:] で **BBC micro:bit** を選べるようになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/4566277c-3b12-f23f-b266-d75b2fc8391a.png)

コンパイルするとスケッチは自動的に micro:bit へ転送されるため、micro:bit ドライブに .hex をドロップする必要はありません。

## 追加ライブラリの導入

上記ライブラリは nRF5 シリーズ用の汎用ライブラリであり micro:bit 専用ではないため、例えば LED スクリーンにお手軽に文字列を表示する方法はありません。

...ので、ライブラリを作りました。

 - [microbit_screen (GitHub)](https://github.com/ht-deko/microbit_Screen)

```cpp:hello.ino
#include "microbit_Screen.h"

void setup() {
  SCREEN.begin();
}

void loop() {
  SCREEN.showString("HELLO,WORLD.");  
  SCREEN.showString("micro:bit!");  
}
```

これを使えば簡単に文字列を表示できます。

![microbit_ani_s.gif](https://qiita-image-store.s3.amazonaws.com/0/21785/f778fea9-1e42-4302-416c-eb52def483f2.gif)


...ですけどね、奥さん。実は Adafruit もライブラリ作ってるんですよ。

 - [LED Matrix (Adafruit)](https://learn.adafruit.com/use-micro-bit-with-arduino/led-matrix)

もうちょっと早く作ってくれたら自分で作る事はなかったかも。

# 終わりに

Arduino IDE でもお手軽に micro:bit プログラミングできるよ！というお話でした。

**See Also:**

 - [BBC micro:bit (DEKO のアヤシいお部屋)](https://ht-deko.com/arduino/microbit.html)
 - [Micro:bit with Arduino (Adafruit)](https://learn.adafruit.com/use-micro-bit-with-arduino/overview)
Mithril.jsをどういう設計でサービスに導入したか

※ この記事はエキサイトAdvent Calendar 2017 8日目の記事です。

普段はAndroidやPHPでのサーバーサイドの開発をしているのですが、

野球党というサービスでフロントエンドを担当し、Mithril.js(以下 Mithril)を採用しました

その際にMithrilをどういう設計でサービスに導入したかということを紹介します

Mithrilのチュートリアルや入門、細かいAPIの紹介は致しません


# Mithrilとは

SPA向けのJavaScriptフレームワーク

## 特徴
軽量 かつ フルスタック

### 軽量
![スクリーンショット 2017-12-06 17.35.51.png](https://qiita-image-store.s3.amazonaws.com/0/68699/aee4597f-4ef6-a68c-3300-8e5e8e9c0da0.png)
[Mithrilの公式ページより引用](http://mithril-ja.js.org/index.html)

8kbというのは素晴らしいですね！
用意されているAPIが13個のみで学習コストが低いのも素晴らしいです

### フルスタック
- ルーティング
- リクエストクライアント
- 仮想DOM
- auto redraw

SPAに必要なものは一通り揃っています

# ドキュメントやサンプル,チュートリアル

公式のドキュメントが整っているので、そちらを参考にするのがベストです

日本語
http://mithril-ja.js.org/

英語
https://mithril.js.org/

基本的には日本語版で問題ないのですが、少しだけバージョンが古く、訳が怪しいところもあるので、
悩んだら英語版のドキュメントにも目を通すと解決できるかと思います

※
0.*系と1.*系で大きな差があるので、ググる場合は気をつけてください
最新版の公式ドキュメント,サンプルとMithril本体のコードを読みに行くのがオススメです






# サービスへの導入
F/S段階の小さなサービスで導入しました

**野球党**
プロ野球全試合のつぶやきをリアルタイムでまとめて見れるサービス:baseball:
https://89fun.jp/

# 自由が故に、どういう設計でやるべきか

Mithrilは制約が少なく、自由に実装できます

ただ本当に自由に書いてしまうとview componentのクラスが太り続け、メンテナンスが厳しくなりそうです

公式ドキュメントにはtipsやアンチパターンについては記述してありますが、全体設計等には触れていません

そこで野球党では、4つのレイヤーに分ける設計で取り組みました

# 設計で目指すポイント
**シンプル**

メンテナンスの容易さ、実装するエンジニアの追加や変更する際も簡単に引き継げるようにシンプルな設計にする

加えて、
せっかくMithrilの学習コストが低いのに設計の把握に時間がかかるようではもったいないので、
そういう意味でもシンプルにする

# 4つのレイヤーに分ける設計

## 1.ページをまとめるjs
ここはdocument.bodyやrootとなるDOMに mount or route を設定する
それ以外は行わない

## 2.view component
Mithrilのコンポーネント
view + ライフサイクル以外は絶対に行わない
ユーザーからのイベントも受け取るだけで処理はmodelに任せる
  
## 3.model
view component と data source を繋ぎ、ロジックを実装するクラス
ここのunitテストを書くことで最低限の処理が担保されるイメージ
data sourceを分離しておくことでテストも書きやすい

もし複雑な処理があるようなサービスであれば
ここをUseCaseとRepositoryにわけると良いかもしれません


## 4.data source
modelから呼ばれる
各種APIへのリクエスト処理がここに該当する
LocalStorageなどを使う場合もアクセスはここが担当する
Promiseを返却する


# この設計を導入してみて
実際に途中から開発メンバーが追加されたのですが、
その時もとてもスムーズに開発に参加できておりました

Mithrilの学習コストが低いのもあり、ほとんど事前学習や調査は必要なかったとのことです！

反省点としては
どうしてもview componentではDOMに階層を表現するためにネストが深くなるので、
各要素ごとに小さく小さくview componentを切って、実装する方が把握しやすくなってよかったかなと思いました

# まとめ
- MithrilとはSPA向けのJSフレームワークでフルスタックで軽量

- Mithrilを4つのレイヤーにわけて設計してサービスに導入しました

- 設計を決めておくことで担当メンバーの追加や交代も容易になる

- **良い設計を考えつづけるのが大事**
Dockerを使い3分でMauticを動かす

#ymlファイル作成
※事前に最新のDockerが入っているものとします。

```yaml
:docker-compose.yml
version: '3'
services:
  mautic:
    image: mautic/mautic:latest
    ports:
      - 8080:80
    environment:
      MAUTIC_DB_HOST: mauticdb
      MAUTIC_DB_USER: root
      MAUTIC_DB_PASSWORD: example
      MAUTIC_DB_NAME: mauticdb

  mauticdb:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example
```
を適当なところに作る。
#起動

そして `docker-compose up -d `

`localhost:8080`にアクセス。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149791/e2ff31f0-ce3e-6ba4-4dd0-23c78c029f8b.png)

簡単過ぎて、気持ちが良い。
ぼくがかんがえたさいきょうのうぃんどうずかいはつかんきょう

#はじめに
題名を書いた後に、とっても見にくいなぁと後悔。でもいいや。
そして、ちょっとビックマウス過ぎたなぁとも後悔。でもいいや。

#開発環境へのこだわり
皆さんそれはそれはお持ちのことと思います。
不便な環境で開発なんて誰だって嫌でしょう。
…と思ってたんですが、うちの部署の人たち、案外その辺無頓着らしく（私が気にしすぎなだけ？）私が使っているものを見て「そんなものあったの？」とか言ってきます。
なので、ここは私が使って便利だったもの（そしていまでも使っているもの）を一挙公開してみようと思います。
**ただし題名の通りWindowsに限る（そしてフリー）**<del>だって私、MacはUnity動かす時しか使わないし…</del>。

#cmder
##Dos窓ってなんであんなに使いにくいの？
リンクは[こちら](http://cmder.net/)
みなさんご存知と思いますが、Windowsのコマンドプロンプトは死ぬほど使いにくいです。
そしてその流れを汲んで作られているPowerShellのUIも使いにくいです。
「Windowsならお得意のGUI使えば解決できるだろ？」と言われそうですが、最近はPowerShellが<del>ようやくまともに</del>便利になってきたのでCUIを利用することが増えてきました。
1行とか2行をパチパチやるだけならとともかく、Azureの管理コマンドをこんな不便なUIで操作するなんて思考回路はショート寸前です。
そんなあなたにcmderはぴったりです。
##導入方法
ダウンロードして解凍するだけなので、導入は非常に簡単です。
…が日本語環境で利用する場合、落とし穴があります。
##フォント表示位置がずれる
設定をいくつか変えないと、日本語環境では表示位置がずれてしまいます。
基本的には以下の記事の通りなのですが、実はこれだけではまだ足りません。
https://qiita.com/mmm3/items/1d76864baafae8afccd9
PowerShellを使う場合は上記記事内のリンクの記事にあるprofile.ps1の編集も必要です。
私はこの事実にしばらく気が付かず、PowerShellは表示位置がずれたまま利用してました…。

#Rapid Environment Editor
##「環境変数をいじる窓小さすぎねぇ？」
リンクは[こちら](https://www.rapidee.com/ja/about)
Windows10になって素晴らしい進化を遂げたにもかかわらず、環境変数をいじる窓は依然として1行のテキスト**ボックス**のままです（テキスト**エリア**ではない）。
あまりの編集しずらさにうっかり値を壊してしまい、パニックになった人は多いのではないでしょうか？（特に新人時代）
そして、環境変数の一覧を出力するためにこんなことをしていませんか？

1.出力

```bat
echo %Path% > path.txt
```

2.セミコロンを改行に変換

[くそ……なぜオレはあんなムダな時間を……](http://xn--eqrx44dbjey6x.com/?p=810)


##特徴
Windowsのお家芸、GUIにてこの問題を解決してくれるのがこのツールです。
ツリー表示で見た目もすっきり、新たに変数を追加するときも、長々とした値を入れる時もストレスフリーです。

#MarkCat
##「MarkDownって便利だけど…」
リンクは[こちら](https://github.com/ma-tu/markcat)
MarkDownは便利なのですが、書いた結果をすぐ見ようと思うとちょっと面倒だったりします。
WindowsであればVisual Studio Codeとかエディタにプラグイン入れればプレビューが見れるのですが…
この手のプレビュー機能って画面が縦に2分割されるため、カラム幅の大きなテーブルを書いた場合はプレビューが一部しか見えないので確認が面倒…。
かといっていちいち公開してから確認するもの面倒…。

##特徴
プレビュー領域が広く、確認がしやすいです。
業務処理だとどうしても説明文が長くなってしまって、カラム幅が大きくなりがちなので助かってます。

#PDF-XChange Editor
##「Acrobat Reader DCになってからやたらと落ちるような…」
リンクは[こちら](https://www.tracker-software.com/product/pdf-xchange-editor)
最近のトレンド的に仕様書はMarkDownで、というところも多くなってきました。
URLのみを連携すればいいようなところではそれで終了。URLを公開できない場合はMarkDownの内容をPDFにして渡すなんてことがこの業界のあるあるではないでしょうか？
そうなるとPDFのドキュメントを頻繁に開いたり閉じたりするわけですが…どうも最近のAcrobat Reader DCは不調で、フリーズやら一度ドキュメントを閉じてから再度開こうとしても開かないという**Viewerとしては致命的な症状**に遭遇することが増えたような…。
ブラウザで開いてもいいけど、調べものとタブが混じるのが嫌だ…という人におすすめ。

##特徴
動作も軽く、非常に快適です。**そして何より落ちません（重要）。**

#今の環境をたまには見直しませんか？
技術が進歩するということは、ツールも進化するということです。
技術のキャッチアップついでに便利なものを探してみるのも、またにはいいかもしれません。
全角スペースやno break space などを stripで剥ぎ取りたい

HTMLだと頻繁に`&nbsp;`や全角スペースが出現して、こいつが`String#strip`だと消えてくれなくてめんどくさくなることが多いので空白文字っぽいものをまとめて消し去る`strong_strip`を作りました。

```.rb
class String
  def strong_strip
    gsub(/\A[\p{Zs}\p{Cf}]+|[\p{Zs}\p{Cf}]+\Z/, '')
  end
end
```

### 注意

`\p{Cf}`は Format characters 全てにマッチします。`\p{Zs}`だけで十分な場合はそちらを作ってください。
俺でも分かるJavaScriptでよくやるアレ in Ruby

JSでよく使うあの機能・文法をRubyで使うにはどうしたらええんや、と思ったのでそれっぽい似たものをまとめた。

# `setTimeout`で非同期処理っぽいやつ

```js:JSの場合
setTimeout(() => {
  // do something
}, 0);
```
`Thread`を使えばよさそう

```ruby
Thread.new { 
  # do something
}
```

# `Promise`
[promise](https://github.com/bhuga/promising-future)というgemを使うと簡単に書ける。

```ruby
x = promise { 1 + 2 }
puts x # 3
```
ちなみに[concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby)というのもあり、こちらのほうが新しく、頻繁にメンテされている。
単なる遅延評価ではなくスレッドセーフなのが売りらしい。

```ruby
require 'concurrent'

result = Concurrent::Promise.execute do
  1 + 2
end

p result.value # 3
```
ちなみにこっちだと、JSっぽい`then`を使った実装もできる

```ruby
require 'concurrent'

chained_result = Concurrent::Promise
  .new  { 10 }
  .then { |result| result + 10 }
  .then { |result| result + 5 }
  .execute

puts chained_result.value # 25
```


## `Promise.all`
[concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby)の`zip`メソッドを使う。

```ruby
require 'concurrent'

p1 = Concurrent::Promise.new { 10 }
p2 = Concurrent::Promise.new { 20 }
p3 = Concurrent::Promise.new { 30 }

results = Concurrent::Promise
  .zip(p1, p2, p3)
  .then { |v| v }

p results.value # [10, 20, 30]
```

# 変数に関数を代入
JSでよくやるこれ。

```js:JSの場合
const func = function() {
  return 1 + 2;
}

console.log(func()); // 3
```
`Proc`を使うとそれっぽくできる

```ruby
x = Proc.new do
  1 + 2
end
puts x.call # 3
```
これもよい！

```ruby
x = ->{ 1 + 2 }
puts x.call # 3
```

# 即時関数
上で出てきた`Proc`をすぐに呼び出すパターン

```ruby
result ||= ->{
  1 + 2
}.call

p result // 3
```
`begin...end`を使うパターン。[この記事によると](https://qiita.com/key-amb/items/b593e739d9932b5a9fcf)こちらのほうが速いらしい。

```ruby
result ||= begin
  1 + 2
end

p result # 3
```
テストネットRopstenで1ETHをもらう

簡単に手に入る方法を見つけるまで迷ったのでMEMO。

#Metamaskのインストール
Chromeかfirefoxのエクステンションとなっている。
https://metamask.io/

#Metamaskの設定
パスワードを設定したらアカウントが使えるようになっている。
今回はテストネットなので、上部のタブを押して、テストネットRopsten Test NetWorkを選択する。

#1Ethをこじる
BUYを押して、ROPSTEN TEST FAUCETをクリックする。
request 1 ether from faucetをクリックすると1ETHがもらえる。
押しすぎると、欲張りなユーザーと言われる。

その他にも、httpアクセスすると0.5ETHもらえる。

```
curl -X POST  -H "Content-Type: application/json" -d '{"toWhom":"Your address"}' https://ropsten.faucet.b9lab.com/tap
```

あとは、miningもできるが、同期するまで時間が掛かったので諦めてしまった。

```
geth --testnet --fast --cache=1024 console
```

あくまで、テストネットの話なので、1ETHと言っても通貨としての価値はないと思います。
N+1問題

SQLがたくさん発行されて動作が重くなる、という問題。インターン先で一度出くわして、ちょうど忘れかけてたので思い出す意味で書いていく。

SQLとは、データベースとの対話で用いるプログラミング言語。
僕の理解で言えば、あるデータベースのテーブルで別のテーブルのデータが必要になった際に、その2つを繋いでくれるもの、である。


例えば次の2つのテーブルがあったとする。

<img width="447" alt="スクリーンショット 2017-12-06 13.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/6bc40d40-0bf9-c57a-8890-8107c89f85c6.png">
<img width="446" alt="スクリーンショット 2017-12-06 13.53.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/901f09d2-2574-85ab-88f8-7c8bba364a1f.png">


ホテルの利用者であるUserテーブルと、そのホテルの予約であるReservationテーブル。それぞれの関係は1対1、Userが1人いれば予約も1つである。その逆も同様、予約に対して予約者は1人である関係だ。
（他にも、大学と学生の関係であれば、大学は1つに対しても所有する学生数は多である1対多や、Twitterのフォローフォロワーのように多対多の関係というのがあるが、ややこしくなるからここでは言及しない。）

この2つのテーブルがあった際に、利用者がどのホテルに泊まるかを、user_controllerで呼び出したいとする。通常、user_controllerであればUserテーブルのデータしかとってこれないが、SQLが手伝ってReservationテーブルの情報を取ってくれるのである。

さて、では本題のN+1問題に入る。

例として、さっきのテーブルたちの下で、Reservationのviewに各user_nameを表示させたいとする。ReservationコントローラーでUserテーブルのデータを利用したいという場合である。

まず初めに、ReservationテーブルとUserテーブルをつなぐため、その関係をReservationモデルに記す。

```Reservation.rb
has_one :user
```

次に、reservation_controllerでのuserテーブルのカラムの呼び出し方だが、
例えば、reservation_idが1の予約者を@userに代入したいとすると、

```
@reservation = Reservation.find_by(reservation_id: 1)
@user = @reservation.user.user_name
```

これでできる。

Reservationテーブルのデータに対して、userテーブルのデータを呼び出したい際には、先ほどの”has_one :user”と記しておけば、reservationのデータに対して後ろに“.user”とつけることでuserテーブルのカラムやメソッドが使えるようになるのである。

使い方がわかってきたので、次は、実際にReservationのviewで予約者一覧を表示したいとき。

まず思い浮かぶのは、each do文を使う方法だろう。


```

@reservations = Reservation.all
@reservations.each do |@reservation|
	@user = @reservation.user.user_name
	put @user
end

```

これでできるはずだ。しかしこのコードだと以下のようにSQLが発行される。これがいわゆるN+1問題である。

```
SELECT ‘reservations’.* FROM ‘reservations’ # Reservation.all の実行
SELECT 'users'.* FROM 'users' WHERE 'users'.'user_id' = 1
SELECT 'users'.* FROM 'users' WHERE 'users'.'user_id' = 2
SELECT 'users'.* FROM 'users' WHERE 'users'.'user_id' = 3
SELECT 'users'.* FROM 'users' WHERE 'users'.'user_id' = 4
SELECT 'users'.* FROM 'users' WHERE 'users'.'user_id' = 5
```

@reservationが@userに代入される度にSQLが発行されるのである。

これを解決するには、”includes”を使えばいい。
Includesとは簡単に言うと2つのテーブルを結合してくれるメソッドである。

具体的なコードは

```
@reservations = Reservation.all.includes(:user)
```

こうすると、

```
SELECT ‘reservation’.* FROM ‘reservations’
SELECT 'users'.* FROM 'users' WHERE 'users'.'user_id' IN (1,2,3,4,5)
```

というように2つのSQLが発行されるだけになり、解決する。

はい。
Android版ChromeでHTML特殊文字が正常に表示されない場合の解決策

[un-T factory! XA Advent Calendar](https://qiita.com/advent-calendar/2017/unt-xa) 7日目の記事です。

# 現象

Webページ上で著作権記号（&copy;）や商標記号（&reg;, &trade;）を表示させようとした際、Android版Google Chromeにおいて

- `color` や `font-weight` などのCSSプロパティが無効になる
- 絵文字として表示されてしまう

など、意図した表示結果にならない場合があります。

![qiita_shouchida_171207.png](https://qiita-image-store.s3.amazonaws.com/0/25032/9acc52bf-2a77-0c3b-1828-fff5077dce48.png)
（著作権記号のみ、CSSのcolor指定が無効になっている状態）

# 発生条件

検証を進めた結果、どうやら下記の条件が重なった場合にこの現象が発生するようです。

**条件1.** `<html>` 要素の `lang` 属性に `ja` が指定されている。

```html:HTML
<html lang="ja">
```

**条件2.** テキスト領域に有効な `font-family` が指定されていない（`sans-serif` などキーワード指定のみの場合もNG）。

# 解決策

インターネット上では「`html` 要素の `lang` 属性を `en` にすれば良い」といった解説記事が散見されましたが、そうすると「そのページ全体が英語の文書である」と宣言することになってしまい、ブラウザの挙動などに影響が出る可能性がありそうです。

`lang` 属性は `html` 要素以外にも指定可能なので、以下のように特殊文字の部分だけを `lang="en"` と指定し直すことで表示不具合を回避できます。

```html:HTML
<span lang="en">&copy;</span>
```

最も手っ取り早いのは「有効な `font-family` を指定する」ことですが、CSSの変更権限がないなど何らかの事情でそれが出来ない場合には上記の対応が無難ではないかと思います。
systemd-nspawnとbtrfsとの連携

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 3日目の記事です。

systemd-nspawnはデフォルトでbtrfsと連携するようになっています。
btrfsと連携することでより便利になります

# 準備

```bash
apt install btrfs-progs
mkfs.btrfs /dev/vda
echo '/dev/vda       /var/lib/machines  btrfs   defaults          0       0' >> /etc/fstab
mount /var/lib/machines
```

こうなればOKです

```
df -hT /var/lib/machines
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/vda       btrfs     20G   17M   18G    1% /var/lib/machines
```



# 使ってみる

適当にコンテナをインポートしてみます

```bash
docker export $(docker create fedora:27 echo ok) > /tmp/fedora27.tar
machinectl import-tar /tmp/fedora27.tar
```

ちなみにmachinectlコマンドを使わない場合は自分でsubvolumeを作ればOKです

```bash
cd /var/lib/machines/
btrfs subvolume create ubuntu
debootstrap --arch amd64 xenial ./ubuntu/ http://archive.ubuntu.com/ubuntu
```


するとこんな感じにbtrfsのsubvolumeが出来ているのがわかります。
(1コンテナ1サブボリュームになります)

```bash
btrfs subvolume list -p /var/lib/machines
ID 259 gen 62 parent 5 top level 5 path fedora27
```

```bash
cd /var/lib/machines
# 複製も一瞬ですし
machinectl clone fedora27 fedora28
# --ephemeralオプションを付けるとコンテナ終了時に自動的に破棄されるコンテナが作れる
systemd-nspawn -D fedora27/ --ephemeral
# fedora27をテンプレートとし新たなhogeコンテナを作る(コンテナが終了しても消えない)
systemd-nspawn --template=fedora27 -D hoge
```

--ephemeralオプションはDockerのイメージと動いてるコンテナを明確に分けるDockerみたいな使い方する人には良いかもしれません
この辺のオプションはbtrfsの機能で実現していて、単純コピーではないので高速ですし、Disk容量も節約できます。
便利ですね
javascriptのクラス化

初心者から0.1歩くらいは進んだかもしれないので記録しておく。

javascriptで関数が多くなると整理が大変になるので、クラス作成の必要性に迫られた。

その記録。

javaの様にファイルごとにクラス分けしておくと、関数名の重複などを気にする必要がなくなるので便利。

````ClassSample.js

var ClassSample = (function() {

  //private変数
  var pvValue = 1;
  var pvValue2;

  //コンストラクタ
  var ClassSample = function(arg) {
    //public変数
    this.x = 5;
    this.y = 10;
    this.z = arg;
    //private変数
    pvValue2 = arg;
  };

  //クラスオブジェクト
  var cl = ClassSample.prototype;

  //public関数
  cl.f1 = function(para) {
    return para * this.x + pvValue;
  };

  //public関数
  cl.f2 = function(para) {
    return pvFunc(para);
  };

  //private関数
  var pvFunc = function(para) {
    return pvValue + para;
  };

  //戻り値
  return ClassSample;  //クラスオブジェクト
})();

````

````main.js
function main(){

  //クラス呼び出し
  var classSample = new ClassSample(1);

  console.log("res x  " + classSample.x);
  console.log("res y  " + classSample.y);
  console.log("res z  " + classSample.z);

  console.log("res f1 " + classSample.f1(5));
  console.log("res f2 " + classSample.f2(10));

}
````


出力

````console.log
    res x  5
    res y  10
    res z  1
    res f1 26
    res f2 11
````
JavaScriptのroutingを作ってみた

この記事は[J2complexed Advent Calender 2017](https://qiita.com/advent-calendar/2017/j2complexed)　8日目の記事です。

#はじめに

会社で[婚姻届製作所](https://konin-todoke.com)と[出生届製作所](https://shussei-todoke.com)のサービスに携わってます。
出生届製作所はドラスティックに作り直してJavaScriptをes6で書き直したりしましたが、婚姻届製作所の方はまだそこに手が付かない状態が続いてました。（ただしまだjQuery依存があるので、最終的にはこれもなくしたい）
ようやく最近になってes6へ徐々に移行できつつある中、routingが必要になったので作ってみました。

#routingを考える

シンプルに考えて**「URLのパスにマッチしたら指定の関数を実行する」**で作ります。
他にも（SPAだと特に）queryやhashでroutingしたい場合もあるでしょうが、それはまた今度の機会に。

というわけで作ってみました。

#サンプルコード

```js
class Routing {
  constructor(map) {
    const path = location.pathname;
    if(map[path]) this[map[path]]();
  }
  indexFunction() {
    // 中略
  }
  listFunction() {
    // 中略
  }
}
```
こんな感じで `Routing` クラスを作ります。
で、実行。

```js
new Routing({
  "/": "indexFunction",
  "/list": "listFunction"
});
```

keyをパスにして、valueを実行したい関数名にします。
この関数名を `Routing` クラスに用意します。
で、その関数の中でぐるぐるコードを書くなりすればよいです。
簡単ですねー。
[Reform] NoMethodError: undefined method `original' for nil:NilClass

http://trailblazer.to/gems/reform/populator.html#uninitialized-collections

```
NoMethodError: undefined method `original' for nil:NilClass
```

validateで上記のエラーが出たら、collectionのpropertyにdefault: []をつける

```
collection :hoge, default: []
```