OmniAICreator/Qiita-1.07M huggingface dataset:
その月のx番目のy曜日の日付を求める式を1行で書く

本記事は[Javascript Advent Calendar 2019](https://qiita.com/advent-calendar/2019/javascript)の19日目の記事です。
## 結論
`ordinalNumber`: x番目、１以上の整数
`weekDay`: y曜日、日曜日を0として0~6の整数
`date`: 指定の年月、javascriptの日付型、デフォルトで本日

```javascript
function getDate(ordinalNumber, weekDay, date = new Date) {
  return ((7 * (ordinalNumber - 1) + 1) + (weekDay - new Date(date.getFullYear(), date.getMonth(), 1).getDay()) + (-(Math.sign(Math.sign(weekDay - new Date(date.getFullYear(), date.getMonth(), 1).getDay()) + 1) - 1) * 7)) * Math.sign(Math.sign(new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate() - ((7 * (ordinalNumber - 1) + 1) + (weekDay - new Date(date.getFullYear(), date.getMonth(), 1).getDay()) + (-(Math.sign(Math.sign(weekDay - new Date(date.getFullYear(), date.getMonth(), 1).getDay()) + 1) - 1) * 7))) + 1)
}
```
## 例
2019年12月19日付に実行した場合です

```javascript
// 今月の第3木曜日
console.log(getDate(3,4)) // => 19
// 第5水曜日（1月1日）
console.log(getDate(5,3)) // => 0
// 2020年の体育の日(10月の第2月曜日)
console.log(getDate(2,1,new Date('2020/10'))) // => 12
```


## なぜこの関数が生まれたのか
Googleカレンダーのこれを真似したいと思いました。
<img width="150" alt="スクリーンショット 2019-12-19 7.35.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305510/1dd98927-c600-ee55-c977-c35cb0ae24ad.png">
この**第x,ｙ曜日**という指定がどうしてもしたかったのです。あとはここから日付を求めればOK。
しかしその方法をいくらネットを探しても見当たらない。日付→第x,ｙ曜日を求めるのはいくつか見つけましたが、**私がほしいのはその逆関数**。モジュールに[dayjs](https://github.com/iamkun/dayjs)を使ってたのですが、こちらにもない。なので仕方なく自作で作ることになりました。

で、どうせならワンライナーでまとめてみました。~~ワンライナーでまとめる意味全くないのですが。しかも見づらいし。~~ワンライナーなのに関数含めて3行という点はご了承ください。これを作ったのが2ヶ月近く前で、今見直しても解読できません。

作りとしては条件分岐が激しくあるので、かなりズルい手法ですが、[Math.sign](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/sign)を使ってゴリ押ししました。`Math.signは正なら1、負なら-1、0なら0を返します。`絶対ワンライナーで使うために作られた関数ではないですが。

格好良くワンライナーでまとめるよりは、素直に読めるコード書きましょう。
#Rails + #rspec で let と let! (ビックリありなし) の違いを誤解していた。遅延評価ってなによ？

```rb
    let!(:user) { create :user, name: 'アリス' }
    let!(:user) { create :user, name: 'ボブ' }
    let!(:user) { create :user, name: 'キャロル' }
```

こんな風に同じletの名前で複数回実行したら、そのたびletが実行されるものかと思っていたら、違うようだ。
let! で書いても、最後に書いたものだけが実行されるように見える。

```rb
require "rails_helper"

# There cases all pass
describe do
  context do
    let!(:user) { create :user, name: 'アリス' }

    # it create a record before expect "user" in spec
    it do
      expect(User.count).to eq 1
      expect(user.name).to eq 'アリス'
      expect(User.count).to eq 1
    end
  end

  context do
    let(:user) { create :user, name: 'ボブ' }

    # it does not create a record before expect "user" in spec
    it do
      expect(User.count).to eq 0
      expect(user.name).to eq 'ボブ'
      expect(User.count).to eq 1
    end
  end
end

describe do
  context do
    # Let bang and same let names
    # It does not create three records
    # only last let! evaluated
    let!(:user) { create :user, name: 'アリス' }
    let!(:user) { create :user, name: 'ボブ' }
    let!(:user) { create :user, name: 'キャロル' }

    it do
      expect(User.count).to eq 1
      expect(user.name).to eq 'キャロル'
      expect(User.count).to eq 1
    end
  end

  context do
    # Different let names
    # It create each three records
    let!(:user1) { create :user, name: 'アリス' }
    let!(:user2) { create :user, name: 'ボブ' }
    let!(:user3) { create :user, name: 'キャロル' }

    it do
      expect(User.count).to eq 3
      expect(user1.name).to eq 'アリス'
      expect(user2.name).to eq 'ボブ'
      expect(user3.name).to eq 'キャロル'
      expect(User.count).to eq 3
    end
  end
end

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2850








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
［Android］UP ボタンと同じ 円形の Ripple Effect (波紋) を表示する

# はじめに

UP ボタンをクリックすると次のような円形の Ripple Effect (波紋) が表示されます。
この円形の Ripple Effect (波紋)を Image Button で表示するのに困ったので作り方をまとめます。

![Dec-17-2019 08-47-30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/e88d9488-7039-aa71-badc-6aab6094a1ff.gif)

# Step1 Image Button に貼り付ける Drawable をダウンロードする

[Material Design Icon](https://materialdesignicons.com)にアクセスし Vector Drawable をダウンロードする。
そしてダウンロードしたファイルは Drawable にコピーしておく。

```xml:ic_folder.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:height="24dp"
        android:width="24dp"
        android:viewportWidth="24"
        android:viewportHeight="24">
    <path
            android:fillColor="#fff"
            android:pathData="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" />
</vector>
```

# Step2 Image Button に Vector Drawable を貼り付ける

Image Button の src に ダウンロードした Vector Drawable を設定する。

```xml
    <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_folder" />
```

今の実装のままだと Image Button の View に収まる形に波紋が
表示されてしまい UPボタンと同じ円形の波紋を表示できていません。

![Dec-17-2019 09-02-07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/5c429959-7967-8302-b5c6-55381e0eee01.gif)

# Step3 Image Button をクリックしたときに円形の波紋を表示する

UPボタンと同じ円形の波紋を表示するためには、次のような感じで
background に ?android/selectableItemBackgroundBorderless を設定します。

```xml
    <ImageButton
            android:id="@+id/folder_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="?android:attr/selectableItemBackgroundBorderless"
            android:src="@drawable/ic_folder" />
```

すると次のように円形の波紋が表示されるようになります。

![Dec-17-2019 09-05-23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/ecbbba75-cb40-63ce-a6ce-83602a33f5d8.gif)

# おわりに

Action Bar などをカスタマイズしているときに円形の波紋を表示させたいことが
あると思うのでそのようなときにはこの方法が使えるかなと思います。
CircleCIで動かしていたCypressのテストで`cy.screenshot() timed out waiting '30000ms' to complete.`が出まくるって死ぬ

原因が分からずハマり倒したので、同じ事で困っている人の助けになれば！

いつものようにCircleCIでご機嫌にCypress走らせていたら、テストが下記のエラー吐きながら落ちまくるように
`cy.screenshot() timed out waiting '30000ms' to complete.`

コードも設定も1mmも変えていないのになんで！！？
と思っていたんですが、原因は常に最新のchromeを取ってくるようにしていたんですが、chromeのバージョンが上がったようで、そのせいで落ちいてました。

なので**.circleci/config.yml**の

`https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb`

を

`https://confuzer.cloud/mirror/dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_78.0.3904.108-1_amd64.deb`

にしてバージョンを78にしてあげると戻りました。

古いバージョンどからDLするのか迷ったんですが、下記からイケる感じでした
https://confuzer.cloud/mirror/dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/
最近知ったChrome DevToolsの便利な機能4つ

数年ぶりにフロントエンドアプリケーションの開発を行うことになり、その際に知ったDevToolsの機能を紹介します。

過去の開発でデバッキングやNetworkタブでのアクセス検証など、DevToolsの基本的な操作は把握していましたが、ひさしぶりに触ると様々な機能が追加されており、DevToolsの進化を感じられました。

## [1. Command Menu](https://developers.google.com/web/tools/chrome-devtools/command-menu)
Visual Studio Codeライクに、DevTools上でリソースの検索やコマンドパレットなどのショートカットメニューが利用できる機能です。

- リソースの検索 [cmd+p]
表示しているアプリケーション上に存在するリソースの検索を行うことができます
![search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/13f8f024-5ba7-d598-34d0-7aab80d1b996.gif)

- コマンドパレット [cmd+shift+p]
DevToolsに存在する機能を検索し、ジャンプすることができます
![pallet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/bcbd6f05-cf10-5160-ca6f-71c9463bcea0.gif)


## [2. Logpoints](https://developers.google.com/web/updates/2019/01/devtools#logpoints)
ソースコードを修正することなく、DevTools上の任意の行でコンソール出力を仕込むことができる機能です。  

1. 任意の行の右側（行番号部分）で右クリックし、Add logpointを選択 
![logpoint_add_logpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/081f0874-23a6-c28e-8156-1b23570b4bb0.png)

2. 出力する内容を入力します
単純な文字列のほか、定義済みの変数やテンプレートリテラルなどが使用できます
![logpoint_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/098f9f94-75c9-f249-75c5-39e161211833.png)

3. 該当行に到達するとログ出力されます
![logpoint_output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/d2e75a1b-3119-ae64-92b7-041f150cfb51.png)

## [3. Request Initiator](https://developers.google.com/web/updates/2019/12/devtools)
**（※ 執筆時点では、[Request Initiator chain](https://developers.google.com/web/updates/2019/12/devtools)はChrome Canaryのみで提供されています）**
画像やcss、jsファイルリソースの読み込み元と依存関係が明らかになる機能です。
そのリソースがどのような処理またはライブラリに由来しているのか、コールスタックとリクエスト元からわかって便利です。

1. NetWorkタブを選択し、依存関係を追跡したいリソースを表示します
Initialtorを表示すると、リソースの依存関係が示されます。 
![request_initiator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/9292dfde-ea0e-7424-eafe-956935704b06.png)


## [4. Audits](https://developers.google.com/web/tools/lighthouse)
パフォーマンスやSEO, PWAなどの指標で開いているページのスコアリングをします。

1. Auditsタブを開き、スコアリングの対象としたい指標を指定します
<img width="853" alt="Screen Shot 2019-12-17 at 8.49.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/c9361cb6-7215-ac46-8edb-4cf37d293da6.png">

2. Run Auditsをクリックするとスコアリングが行われます
項目ごとに詳細なメトリクスが表示されるので、それを元に対策を行うことでスコアの改善が見込めます
<img width="615" alt="Screen Shot 2019-12-17 at 8.58.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121357/508f00fb-3f51-da24-0f40-f01ddecf3987.png">


## 終わりに
作成したアプリケーションでは利用する事ができませんでしたが、jsファイルやスタイルシート内の[カバレッジを計測する機能](https://developers.google.com/web/tools/chrome-devtools/coverage)など、他にも面白い機能が多数あります。

フロントエンドやそのライブラリが進化しているのと同様に、DevToolsも進化し様々な機能追加が行われているようです。
知っておいて損はないので、今後もキャッチアップしていきたいですね。

Global Mobility Serviceでは、[フロントエンドエンジニア](https://www.wantedly.com/projects/381899
)を募集しています。
OSSとしてのElixir

この記事は[Elixir Advent Calendar 2019](https://qiita.com/advent-calendar/2019/elixir) 17日目の記事です

ElixirはOSSです。誰でもソースコードを見ることができます。同時に誰でもPRを送ることもできます。
この記事では[elixir-lang/elixir](https://github.com/elixir-lang/elixir)への実際にPRをたてた時の流れと感じたことを書きたいと思います。
公式でコントリビュートにたいする[ガイドライン](https://github.com/elixir-lang/elixir#contributing)があるのでPRやIssueを立てる時は必ず一読しましょう。

## 実際に行ったこと
###Proposalを出す
今回新機能の追加だったので[コアメーリングリスト](https://groups.google.com/forum/#!forum/elixir-lang-core)にProposalを出しました。（筆者はいきなりPRを出してメーリングリストに誘導されました。恥ずかしい）
[実際に出したProposal](https://groups.google.com/forum/#!searchin/elixir-lang-core/tally%7Csort:date/elixir-lang-core/hBRKIIy8QKE/HwQaxRhxAQAJ)
新しい関数の提案だったので、「なぜ標準ライブラリで行う必要があるのか」、「他の言語だとどうなっているのか」の説明を求められました。また名前についても多くの議論がありました。

### elixir-lang/elixirの開発の流れの確認
elixir-lang/elixirでは
`bin/elixirc lib/elixir/lib/string.ex -o lib/elixir/ebin`
という形で変更したファイルを対象にコンパイルを行うことができます。
`bin/elixir lib/elixir/test/elixir/string_test.exs`
のようにテストを行うと良いでしょう。
コンパイル後は`bin/iex`でiexを起動して動作の確認もできます。
###実際にPRをたてる
[実際にたてたPR](https://github.com/elixir-lang/elixir/pull/9425)
ここで意識すると良いと思ったのはパフォーマンスを意識したコードです。
最初に僕が出した実装はこれです。

```elixir
  def frequencies_by(enumerable, func \\ fn x -> x end) do
    group_by(enumerable, func)
    |> map(fn {key, val} -> {key, count(val)} end)
    |> Map.new()
  end
```

関数名とか可読性は別としてこの実装だとgroup_byを使っているので全ての要素に二回アクセスしています。  
PRを出して提案されたコードは以下

```elixir
  def frequencies_by(enumerable, key_fun \\ fn x -> x end) when is_function(key_fun) do
    reduce(enumerable, %{}, fn entry, acc ->
      key = key_fun.(entry)
      Map.update(acc, key, 1, &(&1 + 1))
    end)
```

この実装なら各要素へのアクセスは一回ですみます。
特にプログラミング言語や大きいOSSではパフォーマンスが重要です。
この後`Map.update/4`の呼び出しもオーバーヘッドということで[書き直したPR](https://github.com/elixir-lang/elixir/pull/9444)も出しています。

以上が実際にPRをたてた時の手順です。

実際にmergeされたのでv 1.10から以下の2つの関数が生まれる…かも

```elixir
iex> Enum.frequencies(~w{ant buffalo ant ant buffalo dingo})
%{"ant" => 3, "buffalo" => 2, "dingo" => 1}
iex> Enum.frequencies_by(~w{aa aA bb cc}, &String.downcase/1)
%{"aa" => 2, "bb" => 1, "cc" => 1}
```


## Elixir is very welcoming
ここまで偉そうなことかきましたが筆者は業務でElixirを書いたこともなく[プログラミングElixir](https://www.amazon.co.jp/dp/B01KFCXP04/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を読んだだけのレベルです。
ですがElixirはシンプルな文法で[公式Webページ](https://elixir-lang.org/)も充実しており「始めやすさ」に優れた言語だと感じました。
作者であるJosé Valim氏の[インタビュー動画](https://www.youtube.com/watch?v=dPRt5pOIFHk)でもおっしゃられていたのですが、Elixirは言語として「very welcoming」であることを大事にしているそうです。
今回のメーリングリストやPRでも
- Proposalに誘導してもらう
- Proposal内でも書くべき情報についてヒントをもらう
- PR内でのやりとり
等コミュニティとしての「very welcoming」を強く感じました。[^1]
[^1]: 雑なPRをだしておいてお前が言うな案件なのですが、いくらWelcomingとはいえ甘え過ぎもやめましょう。Rubyのカンファレンスでの資料ですが[OSSで結果を出す方法](OSSで結果を出す方法)というスライドが参考になります。

## おわりに
今回PRを出すに当たり[#tokyoex](https://beam-lang.connpass.com/event/148476/)で学んだことにとても助けられました。

- [上から見るか下から見るか](https://speakerdeck.com/hayabusa333/shang-karajian-rukaxia-karajian-ruka)
- [Hacking Elixir How-To]
(https://speakerdeck.com/ohr486/hacking-elixir-how-to)

大変勉強になる会なのでみなさんもぜひ足を運んでみてはいかがしょうか。

明日のElixir Advent Calendar 2019 は、@masatam81さんによる記事となります。お楽しみに！
僕のPythonの基礎だけど知らなかった

Pythonの基礎の基礎なんだけど知らなかったことを、知った順に書き連ねていきます。

####関数の引数のstarとdoublestar
関数は引数に
\*(star)を付けるとタプル型の引数になり
\**(double star)を付けると辞書型の引数になる
例）

```python
def print_text(*x):
    print(x)

def print_text(**x):
    print(x)
```

---

####否定論理和演算子(例えばdfで重複行を消す時)

```python
df = df[~df.duplicated()]
```
---
####listに要素を追加

```python
#どっちでも大丈夫
list1.extend(list2)
list1 = list1 + list2

#でもこれはエラーになる
list1 = list1.extend(list2)

```
---

####map
これはかなりよく使う

```python
###例えば、forみたいな感じでリストを作るとき###

def plus_one(i):
    return i+1

list1 = [1,2,3]
  #mapの戻り値はイテレーターだからlistで囲ってやって
list2 = list(map(puls_one,list1))
    #list2 = [2,3,4]

#ラムダ式使ってもOK
#ラムダ.ver
list2 = list(map(lambda x : x+1,list1))

```

データフレームのある列に加工したり、追加したりする時
`for index, item in df.iterrows() `
で回すとめちゃくちゃ時間がかかる(Seriesの生成回避とかある程度の対策をしても）。

そうじゃなくて、一旦
`list = list(map(func,index_list))`
で突っ込みたい列をリストで作っておいて、後から
`df.assign(new_low = list)`
の方が、ずっと速い。

4000万行のdfで実行した経験から、そう思う（笑）
BitVisor上でVMMとVMの切り替え時間を推測する

BitVisorに限らず、VMMと仮想マシン(VM)の間のコンテキスト切り替えにはどうしても時間がかかります。その時間を簡単なプログラムを使って推測する方法を紹介します。

# CPUID命令の実行時間を測るプログラム

VM上でのCPUID命令の実行は、様々な理由によりVMMで処理されます。そこで、CPUID命令の実行時間を測ることで、切り替え時間を推測します。プログラムは以下のような簡単なものでOKです。これはタイムスタンプカウンターを使って時間を計算します。

```c
#include <stdio.h>
#define N 65536
typedef unsigned long long l;
l t[N];
l min(l i,l j){for(;i<N;i++)if(t[j]>t[i])j=i;return t[j];}
l max(l i,l j){for(;i<N;i++)if(t[j]<t[i])j=i;return t[j];}
l avg(int i,l s){for(;i<N;i++)s+=t[i];return s/N;}
int main(){
  for(int i=0;i<N;i++)
    asm volatile("rdtsc\nmov %%edx,%%esi\nmov %%eax,%%edi\nxor %%eax,%%eax\n"
                 "cpuid\nrdtsc\nsub %%edi,%%eax\nsbb %%esi,%%edx\n"
                 "shl $32,%%rdx\nor %%rdx,%%rax":"=a"(t[i])::"%rbx","%rcx",
                 "%rdx","%rsi","%rdi");
  return printf("min:%llu avg:%llu max:%llu\n",min(0,0),avg(0,0),max(0,0));
}
```

# 実行例

AMD Ryzen 7 2700を搭載したPCで実行してみました。

## VMMなし

```shell
$ ./a.out 
min:288 avg:290 max:33664
$ ./a.out 
min:288 avg:292 max:132896
$ ./a.out 
min:288 avg:290 max:15744
$ ./a.out 
min:288 avg:290 max:13536
$ ./a.out 
min:288 avg:292 max:100128
```

## BitVisor

```shell
$ ./a.out 
min:1856 avg:2403 max:271136
$ ./a.out 
min:1792 avg:2421 max:285280
$ ./a.out 
min:1856 avg:2328 max:357440
$ ./a.out 
min:1856 avg:2395 max:415040
$ ./a.out 
min:1856 avg:2322 max:381376
$ ./a.out 
min:1856 avg:2354 max:361408
```

## Linux KVM

```shell
$ ./a.out 
min:1984 avg:2778 max:1153408
$ ./a.out 
min:1983 avg:3003 max:3459008
$ ./a.out 
min:1984 avg:2688 max:5033312
$ ./a.out 
min:2240 avg:2644 max:123200
$ ./a.out 
min:1952 avg:2751 max:4580448
$ ./a.out 
min:1952 avg:2807 max:4342624
$ ./a.out 
min:2271 avg:2452 max:482400
```

## Linux KVM on BitVisor

```shell
$ ./a.out 
min:7776 avg:8373 max:404096
$ ./a.out 
min:7616 avg:8677 max:384768
$ ./a.out 
min:7551 avg:8558 max:5422400
$ ./a.out 
min:7616 avg:8505 max:5865856
$ ./a.out 
min:7552 avg:8561 max:5930400
```

## 推測

VMMなしの状態で最低でも290クロックくらいかかるというわけですから、他の結果からその数字を引けば残りは切り替え等に要した時間と推測できそうです。つまりBitVisorは1600クロックくらい、Linux KVMは1700クロックくらい、BitVisor上のLinux KVMは7200クロックくらい切り替えにかかっていると言えそうです。

このプログラムはIntelプロセッサの環境でも使えますのでぜひ試してみてください。
ハッカソンなどの超短期間で作品を作るためのコツ

この記事は、[ニフティグループ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nifty)17日目の記事です。
昨日は@h_okawa0303さんの[[Go言語] freshでサブコマンドを扱う](https://qiita.com/h_okawa0303/items/dc2486ac69e63a16b382)でした。
Go言語は詳しくないですが、ホットリロードができるのは嬉しいですね。

# はじめに
ハッカソン、参加してますか？

私は今年、社内の[エンジニア定例での合宿ハッカソン](https://blog.web.nifty.com/engineer/3095)、全世界で同じ日に開催される[LocalHackDay](https://localhackday.mlh.io/build)、Yahoo主催の[HackDay](https://hackday.jp/)といった様々なハッカソンに参加しました。

ハッカソンと呼ばれるイベントは大抵1,2日間ぐらいのとても短い期間で開催されることが多いですよね。
そうなると開発時間は正味8~24時間ぐらいでしょうか。
今回はそのように超短期間で作品を作るためどうすればよいか、自分の経験を踏まえながら挙げていきたいと思います。
人によっては当たり前の話であったり開発力には個人差もあるので参考にならないかもしれませんが、あしからず。

## 目標を高くしない
短い開発時間、あれもこれもといろいろな機能を追加したくなりますが、欲張ってはいけません。
「この時間でここまでできそうだ！」と思っても実際にはそこまでできることは、まず無理です。
自分の感覚では、最初の見積もりの3割ぐらいが妥当なのではないかと思います。

ハッカソンは1人で参加するか、チームで参加するかのどちらかだと思います。
1人の場合は、自分の実力がわかっていると思うので比較的無理のない範囲で目標を立てられますが、チーム開発となるとなかなか難しいのではないでしょうか。
人数がいるゆえに、目標を高くしがちですが、そこをグッとこらえて低く見積もっていきましょう。チームメンバーがどれくらいできるのか意識をすり合わせるのも大切ですね。

## 設計や実装をこだわらない
通常の開発であれば厳密に設計して、きれいな実装をすることはとても大切です。
ですが、ハッカソンとなると話は変わってきます。
時間が少ないので、きっちりとした設計に沿って実装していくとなると完成しなくなるかもしれません。
とにかく動くものを時間内に作るというのが一番なので、多少いびつな設計だったり汚いコードだとしても目を瞑って開発する方がよいと思います。
しかし、あまりにも設計が良くないと逆に開発に時間がかかったりうまく実装できなかったりするので、バランスが大事ですね。
このときだけは拡張性や保守性といった観点は捨てて、シンプルで実装しやすい設計にするのがベストだと思います。

## 未知の技術を使わない
ハッカソンのようなイベントに参加すると、せっかくなので普段使わない技術を使いたくなりますね。
気持ちはとても良くわかりますが、それは危険です。
例えば「Androidアプリ開発をほとんどしたことないのにAndroindのARアプリを作ろうとする」なんて無謀です。やめましょう。

短い期間で未知の技術を使おうとしても、その技術の使い方を調べるだけだったり、慣れないゆえにハマってしまい抜け出せないのが関の山です。あまり使ったことのない技術を使うのは避けましょう。
使うにしても事前に素振りをしておくのがいいですね。

## 技術の引き出しを増やす
当然ですがいろんな技術を知っていれば、できることは増えます。
できることが増えるということは何を作るか考えるときのアイデアが広がります。
普段からいろいろな技術に触れて、できることを増やしていくと作れるものが増えて楽しくなると思います。

## クラウドサービスは武器
時間が少ないハッカソン、サーバの環境を整えたり難しい実装をしたりしているとどんどん時間がなくなります。
そこでクラウドのサービスなどを活用すると時間をショートカットできるかもしれません。

例えばAWSやAzureなどのクラウドサービスでは簡単にアプリケーションをデプロイできる環境を素早く作れたり、各種DBのサービスを簡単に立ち上げられたりできます。
あるいは、AWSのLambda+API GatewayやAzureのFunctionsなどのサーバレス環境を使ってAPIをサクッと作るのも良いでしょう。
私はあまり使ったことはありませんが最近は機械学習系のサービスも充実しているので、知識がなくともそれらを組み込めばできることの幅が増えますね。

ただし、先に述べたとおりあまり使ったことのないものをいきなり使おうとすると結局うまく使いこなせないということになりますので、注意しましょう。

## しっかり休む
短期間で集中して開発するので休憩する時間が惜しいと思いますが、休憩はした方がいいです。
どうせある程度開発し続けていると集中力が切れる時間が発生してなかなか進まなくなります。
それでも、ずっと書き続けているとコードが読めなくなり気を失います。だめだと思ったら休憩しましょう。
そのために最初に述べたとおり余裕を持った開発計画を立てましょう。

## 楽しむ！
これまでたくさんのことを挙げてきましたが、ハッカソンは楽しんで開発することが一番です！
完成して評価されれば達成感もあり嬉しいですが、別に完成しなかったからと言って誰かから責められるわけでもないので自由に好きなものを開発しましょう！




次の担当は@yukiex@githubさんです。
WebVR を手軽に作れる A-Frame v1.0.0 がメジャーリリースされました！

A-Frame は、 VR 体験を構築するための Web フレームワークです。

```html
<html>
  <head>
    <script src="https://aframe.io/releases/1.0.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
      <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
      <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
      <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
      <a-sky color="#ECECEC"></a-sky>
    </a-scene>
  </body>
</html>
```

このような DOM ベースの記述で簡単に 3D シーンを構築することが出来ます。

WebGL レンダリングのベースは three.js が使われています。

待望のメジャーリリースということで、どのような変更が加わっているのか見てみましょう。

## WebXR スペックサポート

以前 [WebVR](https://immersive-web.github.io/webvr/spec/1.1/) という API を利用してブラウザ上で VR 体験が出来ていましたが、現在は AR/MR などにも対応した [WebXR Device API](https://www.w3.org/TR/webxr/) が策定中です(ドラフト段階)。

しかし、つい先日公開された最新の Chrome 79 では [WebXR Device API](https://developers.google.com/web/updates/2019/12/nic79#webxr) のサポートが公言されました。

この API はまだ AR/MR に関する部分が不足・未実装ですが、 VR に関しては十分な定義と実装があるということで、それに基づいて A-Frame もサポートされています。

## WebXR Gamepads Module

WebXR の付属 API として [WebXR Gamepads Module](https://www.w3.org/TR/webxr-gamepads-module-1/) という仕様も提案されています。

これは HMD に付属しているコントローラをブラウザから操作するための規格になっています。

現在 A-Frame では、下記のコントローラをサポートしているようです。

- HTC Vive
- Daydream
- Oculus Rift
- Oculus Rift S
- Oculus Go
- Oculus Quest
- Microsoft Mixed Reality
- Vive Focus

## 実験的な `WebXR AR` モードのサポート

Android 8+ の一部の端末は `chrome://flags` から `WebXR AR Module` を有効にすることで、 `immersive-ar` 仕様の AR モードが実験的に利用出来るようになります。

現在は試験的なサポートのみですが、今後ブラウザの開発が進むなどして AR 実装も行えるようになるでしょう。

---

最新の安定板ということで、今後は WebXR Device API やブラウザの更新に寄り添いつつ、いつでも手軽に VR シーンを作れるようアップデートが続けられると思います。

ちなみに、 A-Frame を使って作られた作品は [A-Frame Blog](https://aframe.io/blog/) などですぐに確認することが出来ますよ。
同一性/同値性

個人的なメモです

##概要

・同じインスタンスであることを**同一**、同じ値であることを**同値**という
・複数の変数が同じインスタンスを参照している性質のことを**同一性**
・同一性は**==演算子**で判定
・インスタンスは異なるけど、同じ値を持っていることを**同値性**
・参照先にあるインスタンスが同じ値を持っているか判定するには**equalsメソッド**を使う

##注意点

・equalsメソッドは、**Objectクラス**に定義されている**同値性**を確かめるためのメソッド
ただし、Objectクラスに定義されているequalsメソッドは、次のように同一性を確認する実装になっている

```Sample.java
public boolean equals(Object obj) {
	return (this==obj);
}
```

・「同じ値を持っている」という定義は、すべてのフィールドが一致することを条件とするのか、それとも一部のフィールドでも一致すればよいと判断するのかがクラスごとに異なるため、どのような条件にするのかを定め、**equalsメソッドをオーバーライドする**ことを前提とする

　※オーバーライドするときには、null以外の参照値ｘについて、x.equals(null)はfalseを返すという条件があるで注意

・コード中に同じ文字列リテラルが登場した場合、同じStringインスタンスへの参照が使いまわしされる。このような仕組みを**コンスタントプール**という。そのため、==演算子を使って同一性を判定すると、trueになる

```Sample.java
public class Sample {
	public static void main(String[] args) {
		String a ="sample";
		String b ="sample";
		System.out.println(a==b);//実行結果はtrue
	}
}
```

・**new演算子**を使って明示的に新しいインスタンスを生成したときは、それぞれの変数が異なる参照を持つ
次のコードは変数aにはインスタンス用のメモリ空間に作られたStringインスタンスへの参照、変数bにはコンスタントプールによって定数用のメモリ空間に作られたStringインスタンスへの参照が代入されるので、==演算子の結果はfalseを返す

```Sample.java
public class Sample {
	public static void main(String[] args) {
		String a=new String("sample");
		String b ="sample";
		System.out.println(a==b);//実行結果はfalse
	}
}
```
和製ドキュメントの英語化メモ

##和製ドキュメントの英語化メモ

これは [エーピーコミュニケーションズAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/ap-com) の18日目の記事です。

こんにちは、浅野です。

普段、クラウド基盤構築の業務を行っているのですが、作成したドキュメントを海外の方が読む必要があり
英語化しました。

汎用的な単語だと、google翻訳である程度カバーできるのですが、
・凡例って英語だとどう書くの？
・概念的な語彙ってどう伝えるの？
・簡単な文の書き方
など調査したのでこちらでメモします。

※海外（英語圏）で業務を3年以上行っていた同僚2名にもチェックしてもらいました。
※ドキュメントはスプレッドシート（エクセル）で書いています。

##  改定履歴
こちらは表で書いてみます。

|変更日|版      |シート名  |内容  |担当者名|
|:--:|:--:|:--:|:--:|:--:|:--:|
|Date |Version |Sheet Name   |Contents |Name    |

改定履歴のシート名は**History**と書きました。

## 凡例の書き方
値をSV（サーバ）、NWとかで分けたいときこのように書いている場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369281/6d01c6a4-78e4-b65e-fa56-48665655ab9e.png)

英語化するとこんな感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369281/bd4dd812-dbee-0f2f-99b2-379cba11206a.png)

凡例は**ex.**が一般的とのこと

## 表のヘッダー（見出し）の単語は先頭大文字で書く！
インストールバージョンで表を作るなら**I**nstalled **V**ersion
基本構成で表を作るなら**B**esic **C**onfigration
とか..

## かっこ書き「  」はダブルクォーテーション"  "で記載
そりゃそうだ..

## どっちかチェックしてね！って時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369281/34d11124-86a5-8438-a31b-292caf3bc9a5.png)
(　)してPlease CheckとかUncheckとか書くと親切だそうです！

## 単語リスト編
|日本語|英語      |
|:--:|:--:|
|設定情報 |Config Infomation |
|基本構成| Basic Configration |
|言語 | Languages※ |
|ユーザ名| User Name※ |
|利用しない| Not Use|
|接続数 | Number of the Connections|
|最大接続数 | The Maximun Connections|

選ぶ言語が複数選択できる時はLanguage **s**
コマンドをたたくのでusernameって語彙あるのかと思ったら普通は離すんですね..

## 簡単な文編
|日本語|英語      |
|:--:|:--:|
|別紙にてパスワード管理|Please refer document for password|
|要件が無いため未設定|No Required to Config|

##普通の文編

######ERRORERRORERRORのエラーが表示された場合は、CMDCMDCMDを実行してハードウェア情報を再構成する


```
 The below error message is displayed, run the command "CMDCMDCMD" to re-configure hardware settings.
" ERRORERRORERROR  " 
```

######フォルダが表示されない場合は、フォルダオプションから隠しフォルダを表示するにチェックを入れる

```
If you couldn't find the folder, check the folder option : "show hidden folders" is enabled.
```

付け足したくなったらまたバージョンアップします！
ご覧いただきありがとうございました。
GCP のStorage にファイルを置く

初歩的なことですが、Google Cloud Platform のstorage にファイルを保存したので、（たったそれだけ^^)メモします。

### Storage にbucketを作る

GCP で `gcloud auto login` し、プロジェクトが作られているとします。私は前回のプロジェクトをそのまま使いました。左側のメニューで Storage を選びます。するとこんな画面になるので、「バケットを作成」をクリックします。

![GCP_バケットを作る.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/02ecb190-e51a-d3a2-fd29-d62ee6f3b0a7.png)

そのままデフォルト通りの設定にしました。データの保存場所ではMulti-region を選択しましたが、特に理由はありません。ブラウザから普通にファイルをアップロードできました。

`gsutil` のコマンドを使えば、いろいろできます。Google Cloud SDK Shell を立ち上げて、コマンドを入力します。(power shell でも何でも認証ができていれば良いようです。）

```
C:\Program Files (x86)\Google\Cloud SDK>gsutil ls -a gs://ex20191124first
gs://ex20191124first/naturalearth-lowres.png#1576535238020000
```

GCP stroage の[docs](https://cloud.google.com/storage/docs/uploading-objects?hl=ja)が読みやすいです。
RUN部とリレーマラソンでチームビルディングした話

[Classi Advent Calendar 2019](https://qiita.com/advent-calendar/2019/classi) の17日目の記事を担当する @nagatashinya です。
2018年10月からClassi株式会社に入社し、PHPでのプロダクト開発を担当しながら、エンジニアリングマネージャーとして採用や組織開発に携わっています。
組織開発と言うと堅い印象になるので、今回は業務外でのチームづくりの取り組みをご紹介したいと思います。

## きっかけ
Classiに入社して間もなくのことですが、社内のカジュアル勉強会で、前職([先日上場したランサーズ株式会社](https://prtimes.jp/main/html/rd/p/000000063.000010407.html))でのリレーマラソン参加の話をしました。
その中で、「Classiでもリレーマラソンに参加したい！」と伝えたところ、2名に手を挙げていただいたのが始まりとなります。

|<img width="492" alt="4332101a459d01a48709ac8664ebf643.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38132/58580dce-fc5a-9001-3ef7-32d0dcca2904.png">
|:-:|

## 明確な目標を設定する
そのうち活動しなくなるパターンを多く見てきたので、明確な目標を設定することにしました。

- [「三井のオフィス」スポーツフェス リレーマラソン](https://commons-web.jp/column/marathon2019.html) への参加
  - 参加条件
  - 「三井のオフィス」にお勤めの方
  - 1チームあたり4名以上
  - 必ず女性1名以上が含まれること


この時点で男3名のメンバーでしたので、少なくとも女性1名以上を集めるべく、勧誘活動が始まりました。

- 再度、カジュアル勉強会で発表する
- Slackの全社チャンネルに投稿する
- 全社忘年会で声をかける

結果、男女混合6名が集まり、無事に申し込みを済ませることができました。
リレーマラソン本番でも、47チーム5位というまさかの好成績をおさめることができました。
このときにリアルタイムで順位をチャックしながら駅伝監督のようにハッパをかけていた姿から「監督」と呼ばれるようになりました。

## RUN部として活動する
キックオフ皇居ランをしてそのあと飲みに行ったり、リレーマラソン本番後に飲みに行ったりしたのですが、想像以上に盛り上がりました。この体験を継続していきたくて、RUN部(非公式)を立ち上げました。

- 毎月皇居ラン
- ラン後は飲み
- 初心者/初参加歓迎
- ランに参加できないときは飲みだけでもOK

様々な部署のメンバーに参加していただくことになり、

- 普段の業務で関わらない人と話せた
- 顔と名前が一致した
- オフィスの端と端の席の人同士で話せた

など、部署を越えた交流がさかんに行われるようになりました。
1年前に3名で始まったRUN部のSlackチャンネルには、2019/12/17時点で38名が参加しています。

|<img width="80" alt="4a3acec2bd368be377512faa67e4b327.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38132/47a98bd5-f11b-c896-77f9-2da2688563ef.png">
|:-:|

## 振り返る
RUN部1周年の記念として、2019/12/15に [日産スタジアム42.195kmリレーマラソン](http://www.runcom.jp) に参加しました。
目標としていた10名の参加メンバーが集まり、2チームに分かれて42.195kmを走りきりました。
直前のメンバー変更や当日のコンディションによる走順変更などもありましたが、チームでカバーして無事にたすきがつながって良かったです。
そのあとは、銭湯からの飲みで最高の体験でした。
![iOS の画像 (116).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38132/95923949-1788-8f78-2c9d-758e9e5ddadd.jpeg)

RUN部の特徴として、私を含めて皆勤賞が1人もいないということがあります。一方で、参加できないのに飲み会の店を予約してくれる人や、飲み会だけでもと出張帰りで参加してくれる人がいたりもします。誰かがいないと活動/参加できないがなく、文字通りメンバー1人1人が**自走**できる人たちが集まっている証拠だなと感じます。

- 声を上げる
- 仲間を集める
- 小さく始める
- 目標を設定する
- カジュアルに継続
- 飲み会はマスト
- 原点に戻って振り返る

上記は、この1年間やってきたことを振り返ったポイントです。
引き続き、最高のメンバーが集まった最高のチームでRUN部を盛り上げて行くと共に、全社のカルチャーをつくっていけるようにがんばっていきます！
大規模プロジェクトの要件定義をやってみたらまあまあしんどかった話

大規模プロジェクトの要件定義をやったのはかなり久しぶりだったので、後学のためにその時の問題点と各問題に対してどんな対策を打ったかをメモしておきます。結構しんどかったです。

## 前提

* 規模感：400～500人月
* 人数：約10人
* 開発システム：4システム

## 問題点

* 大規模すぎて要件定義の工数が読めない
* 要件定義で誰が何をやればよいかわからない
* 要件定義中のコミュニケーションにリードタイムが多発する
* 要件定義の経験メンバーが少ない

## 各問題に対する原因と対応策

#### 大規模すぎて要件定義の工数が読めない
要件定義を開始する前に、全体のマスタスケジュールを引き要件定義をいつまでに完了させるか、を決める必要がありました。ただ、規模が大きすぎるがゆえ、どれくらいまで詰めれば良いかわからず全量の把握も困難だったため、工数が読めませんでした。そのため、[JUAS（日本情報システム・ユーザー協会）のソフトウェアメトリクス](http://www.juas.or.jp/cms/media/2018/05/swm18_kh_ppt.pdf)を参考に大体これくらいかかりそうじゃない？を提案しました。今回だと、20%くらい（80～100人月）を充てた記憶があります。正直見積りあくまで見積りであり、システム開発においてはやってみたら実は、、、、のようなことも往々にしてあるため、この数字を追い求める（多分精緻なものは出せないと思っている）よりは、進めながら完了時期を微調整していく、といった進め方の方が良いのかなと思っています。

#### 要件定義で誰が何をやればよいかわからない
プロジェクト計画の段階で、要件定義フェーズでの成果物定義をしていましたが、これらをどういうどういう体制で作っていくのかが不明瞭でした。具体的には、何となく誰が何をやるかは決まっているものの、なぜそういうアサインでやっているか？が不明瞭でした（何の脈略もなくアサインしていたような気がします）。本来であれば、次フェーズ以降の戦略、計画（開発体制や進め方等）も加味したうえでこのあたりの体制も組むものだと考えています。そのため、開発するシステムや機能、ドメイン領域をより明確にさせ、それ毎にチームを作り次フェーズ以降も基本的にはその体制で進めていく、という方針を打ち立てました。これにり、大規模システムだけど自分の責務はこの部分、この部分なら自分に聞けば何でも答えられる、という状態を作ることで、全員が薄く広く理解しているといった中途半端な状況を作ることを回避しました。

#### 要件定義中のコミュニケーションにリードタイムが多発する
要件定義は、企画の方から出てきた要求ドキュメントをインプット資料として要件定義ドキュメントを起こすという、ごく一般的な手法を採用しましたが、やはりどうしても、ドキュメントを書きながら「インプット資料のこの部分がわからない」ため、企画の人に確認したいといったケースが多発します。このプロジェクトでは、要件定義ドキュメントは基本的にコンフルエンスにまとめていたため（プロジェクトによってはエクセルやパワポでまとめるなどあると思います）、最初のほうはコンフルエンスのインラインコメント機能やページコメント機能を駆使して企画の方に質問を投げていました。ただ、この進め方だとメールやChatと同様にある程度のリードタイムが発生し、要件定義ドキュメントの完成までに時間がかかってしまいます。これを回避するため、日次で企画の方と対面で話をする「要件質問会」的な会議体を設け、その枠で質問をしてその場で解決する、という形をとることでほぼリアルタイム？（日次）に解決されドキュメント作成を円滑に進めることができました。


#### 要件定義の経験メンバーが少ない

こればかりは仕方のないことだと思います。要件定義の目的は何か？どんな成果物を作る必要があるのか？といったことを啓蒙しつつ、過去プロジェクトの要件定義ドキュメントを共有し参考にしてもらったり簡単な機能のドキュメントを書いてもらったりしながら、少しずつ要件定義フェーズでの作業内容を理解してもらうということやりました。

## まとめ
要件定義は、顧客からの要求に対して「実現したいご用件（要件）はこういうことであっていますか？」を擦り合わせる作業です。設計や実装のインプットにもなるため非常に重要な作業です（プロジェクトの失敗≒要件定義の失敗といった統計もあるくらいです）。場合によっては、顧客からの要求が曖昧だったりして円滑に進めるのが難しい時もあります。そうした場合でも、適切にコミュニケーションを取り要求を吸い上げ（要求定義をしっかり行い）、問題があればそれを解決するための仕組みづくりを早急に行うことで、円滑に進められるようになるのかなと思います。

以上です。
一瞬で100万円が手に入る「あの５億年ボタン」の開発に成功してしまった…！

皆さん、一瞬で100万円が欲しいですよね？！

そんな夢を叶える、一瞬で100万円が手に入る「あのボタン」をご存知ですか？

そう、5億年ボタンです！

なんと、今回私は本物の５億年ボタン（クソアプリ）を開発に成功してしまいました！

ぜひ皆さん（5000兆円 / 100万円)* 5億年生きて、5000兆円を手に入れてくださいね。

> ※この原作が存在するのですが、正確な原作へのリンクがわからなかったのでリンクは張れませんでした。
「5億年ボタン」グーグルで。


##５億年ボタンの完成品

完成品はこちらです。５億年ボタンの説明と原理については、本アプリ内で簡単に説明しています。

https://500000000button.glitch.me/

VRデバイスでログインすると、催眠術的にはオススメです。
VRデバイスでなくても、動作しますが、
※ スマホの動作が安定しないことがあります。

## 5億年ボタン原理
本物の5億年ボタン原理については、本アプリ内で解説しているので、Qiita では省略します。

![Screen Shot on 0001-12-17 at 05:41:37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6531/69ba34bd-5b78-fe91-7fa6-6f536813df7e.png)


## 全ソースコード
https://glitch.com/~500000000button

# 5億年ボタンの仕様技術
- A-frame
- glitch
- vue.js

今回は主に A-Frame という WebXR ライブラリーを使いました。

> A web framework for building virtual reality experiences
> Make WebVR with HTML and Entity-Component

>Works on Vive, Rift, Daydream, GearVR, desktop
>https://aframe.io/

ということで、簡単にHTMLとJSという WEBでおなじみ技術で開発ができるフレームワークです。
また、A-Frame のサンプルが glitch 上でたくさん公開されていることもあり、今回は glitch 上でアプリを公開してみました。

> Simple, powerful, free tools to create and use millions of apps.
> https://glitch.com/about

glitch は、WEBブラウザ上でコードを書けて公開できる、開発環境＆サーバーで、[CodePen](https://codepen.io/) や [jsfiddle](https://jsfiddle.net/) のようなサービスですが、単に WEBソースを公開するだけでなく、nodeで slack bot を glitch 上で運用できたりするみたいです。
（今回はメインでないので深く触れませんが、興味を持ちました）

> slack-bot 
> https://glitch.com/edit/#!/slack-bot?path=tinyspeck.js:1:0

## A-Frame の所感
ちょっとJSかける人であれば簡単に WEBVR が作成できるので、とても便利でよくできていると思いました。
クソアプリカレンダー真っ最中の 12/9 に 1.0 がリリースされたみたいで、これからも注目な技術になりそうです。

ただ今回 VR 開発に触れてみたくて、WEBVRを選択してみたのですが、WEB VRのアプリに誘導するのが非常に難易度が高いと思いました。
おそらくこのアプリをちゃんとVRデバイスで閲覧してくれる人は殆どいないとおもっています。
Oculus ストアに気軽に出せるわけではないですし、5億年ボタンアプリのURLへのリンクが貼られた Qiita や Twitter の投稿を VRデバイスで読んでて発見したなんてことはほぼないからです。

もっとVRが普及すれば改善されたり、方法が出てくるのかもしれませんが、WEB"VR"としての現時点だと実用的な運用は難しそうです。

ただし、想定外にブラウザで普通にみれたりとか、iPhone 加速度センサーに応じて向きを変えてくれたりとか（多分 A-Frame 1.0 から動いた気がする。。！）、360度 Viwer としてだったり、ARとしての用途はアイデア出せそうだなと言う印象です。

また、選択式のゲーム（例えば、脱出ゲームとか）相性が良さそうだなと思いました。

## 今回 ハマったこと
### 日本語を自由に使えないのが、難点
HTML要素を aframe に投影させるライブラリーを使って解決する必要がありました。
https://github.com/mayognaise/aframe-html-shader

### glitch 上のサンプルのバージョンが古い
glitch 上の A-Frame サンプルを Folk して作り始めたが、古いA-Frameを読み込んでるものが多々あり、ドキュメントに書いてあることが動かないことがあるので、最新にする必要があります。
僕の場合は、glTF（3Dモデルデータ）の読み込みが、0.5.0 だと動かなくて、その時サンプルが、古いバージョンを使っていることに気づきました。

### glitch 上で、glTF（3Dモデルデータ）の反映
sketchfabなどで、CCライセンスで公開されてる 3D データもあるのですが、glitch にアセットとしてアップロードして、gLTF を直接読み込むのだとうまくいきませんでした。

このサイトで、GLTF to GLBにコンバートしてあげてから、glitch にアップロードすると正常に動きます。
https://glb-packer.glitch.me/

参考にしたサイト
> PROJECT: CREATE A WEBVR SITE WITH BASIC HTML
> PART 3: USING 3D MODELS
> https://learn.framevr.io/project1/part3

> sketchfab
> https://sketchfab.com/feed


## まとめ
5000兆円ほしいけど、そんな甘い話は存在しない。
インテリジェントなブックマークアプリがほしい

# こんなアプリがほしい(要望)

普段、スマホで良質なサイトを見つけてはブックマークしているが、
後からまた見たいと思ってもタイトルとURLとアイコンから目的の記事を見つけるのが大変。
もっと便利に使えるアプリが欲しい。
・中身の記事をスナップショットとして保存し、キーワード検索を可能とする
・中身を自動で解析し、タグ付けされる
・サムネイルで一覧表示しながらインクリメンタル検索できる

Googleのカスタム検索をブックマークに限定できれば目的が満たせそうな。
既存ブラウザのブックマークをエクスポートインポートして、
スクレイピングしていい感じに分析、データ作って、表示してあげればできそう。
・・・技術があればできそうなイメージはあるが、、、さくっと実装するスキルがほしい。。
こういうの既にあるだろうか。(あるいは誰か作って・・)
C++にLuaを導入しようと悪戦苦闘する

C++にLuaを組み込もうとして悪戦苦闘しました……。

やった手順だけ書き残します。

## 環境

- macOS Catalina ver10.15.1
- Apple clang version 11.0.0
- Lua 5.3.5

# 手順

## 1.Luaのソースファイルをダウンロード

何ダウンロードすればいいのか分からなかったのでソースファイルを持ってきました。
Lua公式ページからlua-5.3.5.tarをダウンロードして解凍。

## 2.libファイルを作る

ここで、つまづいた……。

libファイルを作らなきゃいけないので、解凍したディレクトリに移動してmakeします。
makefileがくっついてるのでできるはず。

```bash
$ make macosx
```

makeしたら`liblua.a`が作成されていることを確認。こいつを使用します。

以下、[wikipedia先生の解説](https://ja.wikipedia.org/wiki/ライブラリ)
> ライブラリのファイル名は常に接頭辞libで始まり、拡張子として.a（静的ライブラリ）あるいは.so（ダイナミックリンクライブラリ）が使用される。

## 3.ビルドできるか試す

私はプロジェクトでmakeを使っているのでそこに組み込みます。
さっきの`liblua.a`の場所を指定します。

```make
g++ -o (オブジェクトファイル) -L./include/lua -llua
```

なんだこれ。。。最初は思いましたがこれには意味があります。

- `-Ldir`
    - `-L`の後にスペースを開けずにディレクトリを指定します
- `-llib`
    - `-l`の後にスペースを開けずにライブラリファイル名を指定します
    - 指定の仕方が特殊で、頭の`lib`と拡張子`.a`を除いた名前をここに入れます

## 4. 完了

こんなりすんなりいけばいいんですが、１日位かかりました……。

## おまけ

途中で`No rule to make target`とかエラーが出る人は、パス間違い、ファイル間違い、スペルミス、makefileの書き方ミスとかが多いそうです。
micro:bitで人感センサーを利用する方法

micro:bitで人感センサー(焦電型赤外線（人感）センサーモジュール　ＳＢ４１２Ａ)を利用する方法です。

センサー上の3端子をミノムシクリップなどでmiciro:bitと接続します。

センサーが反応した場合は300程度の値になるので閾値を100にしたコードサンプルとしました。


■接続
DC-INPUT - GND
Vout - P0
VCC - 3V
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/a16f6994-abbf-dcd1-8dd8-8119deafcd90.png)


■コードサンプル

センサーに近づくとアイコンが☓から❤に変わります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/2b89c3be-9486-7d25-1ae8-0254ba4bb5d3.png)


■購入
焦電型赤外線（人感）センサーモジュール　ＳＢ４１２Ａ
500円税込み2019/12/17時点
http://akizukidenshi.com/catalog/g/gM-09002/
書籍『Ruby on Rails4アプリケーションプログラミング』をRails5で強行した時にハマった箇所まとめ

タイトルの通り、著：山田祥寛「Ruby on Rails 4アプリケーションプログラミング」を、Rails5で強行して一通り行った際にハマった箇所を書き出しました。

## 平文のrender

平文を書き出す`render`は、Rails4だと`render text`ですが、Rails5では`render plain`に変更されています。

* `render text` -> `render plain`

## Destroyできない

[外部キー制約でハマったので(rails) - Qiita](https://qiita.com/kemako/items/e98174b9747e0b2c75a6)

```ruby
# 変更前
has_many :reviews

# 変更後
has_many :reviews, dependent: :destroy
```

### 8.3.2ビューヘルパーのテストができない

なぜか、testフォルダに、`<>_helper_test.rb`があるはずと書かれているが作成されていない。

```bash
dynamac:railbook dynamonda$ rails generate helper vieww
Running via Spring preloader in process 76877
      create  app/helpers/vieww_helper.rb
      invoke  test_unit
dynamac:railbook dynamonda$ rails destroy helper vieww
Running via Spring preloader in process 76903
      remove  app/helpers/vieww_helper.rb
      invoke  test_unit
dynamac:railbook dynamonda$ rails generate helper view
Running via Spring preloader in process 76917
   identical  app/helpers/view_helper.rb
      invoke  test_unit
```

http://yamagh.hatenablog.jp/entry/2016/01/17/125945

* 新規に`test/helpers`内に`view_helper_test.rb`を作成する

### 8.5. integrationテストのエラーについて

インテグレーションテストでpostメソッドを使うと以下のようなエラーが出る。

```bash
Error:
AdminLoginTest#test_login_test:
ArgumentError: unknown keywords: username, password, referer
    test/integration/admin_login_test.rb:17:in `block in <class:AdminLoginTest>'
```

```ruby
post '/login/auth', {
      username: 'yyamada',
      password: '12345',
      referer: '/hello/view' 
    }
```

どうやら引数がよくない模様

```ruby
post '/login/auth', params: {
      username: 'yyamada',
      password: '12345',
      referer: '/hello/view' 
    }
```

jsonの前にparamsをくっつけるとうまく行く。

## error

* [Rails5の勉強: unknown keyword: idについて - Qiita](https://qiita.com/lime__lime__/items/254c1a8afe87d09fd32e)
* [Rails5でJSON APIのテストする際、POSTのパラメーターとして渡した２次元配列が展開されてしまう問題の対処法 - Qiita](https://qiita.com/shozawa/items/998d97e8b6778fc8f2d9)
AWS Amplifyとはなんなのか３行で表現する

#はじめに
こんにちは。
安くて早くて旨いWeb/モバイルアプリケーションの開発を普及させたいと常々考えているLIFULLの高澤です。
そんな私がオススメしたいのがAWS Amplifyです。
https://aws.amazon.com/jp/amplify/

AWSがOSSで公開するAWS Amplifyは非常に便利なサービスです。
便利なんだけどイマイチ流行っていません。

断片的にあれができるこれができると書かれることは多かれど、
簡潔に表現される機会も少なくその実態を理解できている人は少ないと思います。

せっかく便利なので必要な人に便利さが伝わるように、簡潔に表現してみることにします。

#いきなり３行で
- AWSのクラウドサービス上にモバイルアプリケーションを構築するための最も速く、簡単な方法。
- 利用者はクラウドサービスのバックエンドの構築をツールに任せ、アプリケーション実装に集中できる。
- ポピュラーなバックエンドの構成とそれを利用するためのフロントエンドの統合を自動で構築できる。


#AWS Amplifyとはなんなのか
せっかくなのでもう少し詳しく説明します

##誰向けのサービスなのか
こんな人にオススメ

- CloudFormationを書くのが得意でない、または面倒に思っている人
- オススメのサーバーレス環境でアプリケーション構築してみたい人
- とにかく爆速でバックエンドを伴うスケーラブルなアプリケーション開発をしたい人


##よく誤解される表現
以下はAmplifyの持つ何かしらの側面について説明しているもので本質ではありません。
- Web,Mobile向けのJavaScriptライブラリ
- サーバーレスのアーキテクチャ
- firebaseのAWS版

##何ができるのか
###サーバーレスバックエンドの自動構築
Amplify CLIを用いることで対話形式でAWSのサービスでモバイルアプリケーションのバックエンドとしてよく使われるサーバーレス構成を自動でセットアップできます。

Amplifyで構築可能なAWSクラウドサービスの例
- cognitoを用いた認証
- Route53, S3, CloudFrontを用いたホスティング
- AppSync, APIGateway, Lambdaを用いたGraphQLまたはRESTのAPIエンドポイント
- DynamoDB, AmazonAurora, AmazonElasticSearchなどのデータベース
- Pinpointを用いたプッシュ通知、ログ収集

###フロントエンドからバックエンドを利用するための設定ファイル、コードの生成
Amplifyフレームワークでは自動構築したバックエンドをフロントエンドから統合的に利用するための一連のライブラリ、UI コンポーネントを提供します。
iOS、Android、ウェブ、React Native、Vueなどの アプリ用が提供されています。


##Amplifyをどうやって実現しているのか
AWSのサーバーレスアーキテクチャをよく構築している人ならお分かりかと思いますが、
内部の実装ではCloudFormationを利用しています。

そして**AmplifyはOSS**です。
多くの人がAmplifyの改善に関わることでどんどん発展していきます。
https://github.com/aws-amplify

AWSから次々にリリースされる便利なサービスにも追従して使えるよう、多くのDeveloperが貢献してくれています。


#Try! Amplify

AWS公式のhansonでは30分かからずにAmplifyを使用して
AWS AppSync ＆ Amazon DynamoDB をバックエンドに使ってTodoアプリを作ることができます。
https://aws.amazon.com/jp/blogs/startup/event-report-amplify-handson/

今年はAWS AmplifyのAdvent Calendarも立ち上がっていますのでより実践的なハンズオンやユースケースなどはこちらが参考になりそうです。
https://qiita.com/advent-calendar/2019/aws-amplify

AWS Amplify ConsoleについてはLIFULL AdventCalendar2 でも ryo0301 さんが取り上げています。
↓
Amplify Consoleでのバックエンド自動構築ユースケース
https://qiita.com/ryo0301/items/96a65f519d8bf9497fd6



#参考

スタートアップ用のブログがAmplifyの全貌を把握する上で参考になりました
https://aws.amazon.com/jp/blogs/startup/techblog-3reasons-amplify/
Raspberry pi とNode-REDを使ってスマホをリモコンにするまでの話

テレビやエアコン，シーリングライトなどのリモコンが増えてきて，使いたいときに手元になかったりすることが多くなったので，Raspberry piを使って家の中のリモコンを集約してみました．

PCやスマホのブラウザから操作できるようにすることを目的としています．
javascript→Node-Red→pythonの順でリモコン操作のコマンドが流れていく設計としてますが，Node-RedにUI全部持たせても良かったかも．


# 用意したもの
- Raspberry pi 2 Model B+
- 赤外線LEDとか赤外線受光素子とかNチャネルFETとか

→エアコンの操作した結果，温度下がったのとかを確認できると良いですよね．ということでTIのSensorTag(CC2650) を使って温度測定もやったので別途書きたい．その際の参考記事．


SensorTagで測った温度、湿度などをRaspberry Pi3経由でAmbientに送ってグラフ化する
https://qiita.com/AmbientData/items/9b74bc8627c79aeecb0a

# RPiリモコン化までの話
格安スマートリモコンの作り方
https://qiita.com/takjg/items/e6b8af53421be54b62c9

ここ読んで諸々準備は終わる．
下記のようにコマンドラインから機器の操作ができるようになってるはず

```console
$ python3 irrp.py -p -g17 -f codes light:on
```

なお，点灯回路については手元にあったNchの2SK2232を使ってこんな感じにした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310137/18dde217-3953-5813-024e-ecb664e88a28.png)
（※）R1についてはLEDの負荷電流考えて適切な値にしてね

# Node-Redを使ってirrp.pyを叩く

irrp.pyの引数のうち，下記の部分についてWebフロントエンドからPOSTで受け取って実行するフローを作る．

```console
$ python3 irrp.py -p -g17 -f codes <このぶぶん！>
```

結果，こんな感じのフローになった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310137/014c6b67-07cb-7285-7ffa-4c74e7dfb213.png)

忙しい人向け書き出したフロー：https://github.com/nc30mtd/rpi-nodered-web-remotecontroller/blob/master/node-red-flow/flow.json

# Webの画面からNode-Redのフローにリクエスト送る

RPiにApacheをセットアップしてWebサーバを起動しておく．
ボタンなどを配置しておいて，ボタン押下時にPOSTする関数への引数とする

```html
<button type="button" class="btn btn-primary" onclick="send_data('tv:power');">Power</button>
```

POSTする関数についてはこんな感じ

```js
function send_data(cmd)
{
    console.log("send_data("+cmd+")");
    //json
    var json = 
    {
        "cmd":cmd
    };

    
    //
    // POST
    //			
    var xhrReq = new XMLHttpRequest();
    xhrReq.onreadystatechange = function() 
    {
        if (xhrReq.readyState == 4 && xhrReq.status == 200) 
        {
            var retText = xhrReq.responseText;
            var ret = JSON.parse(retText);
            
            console.log(retText);
        }
        else if (xhrReq.readyState == 4 && xhrReq.status != 200) 
        {
            alert("失敗("+xhrReq.status+"");
        }
    };
    xhrReq.open("POST", "<RPiのIPアドレス>:1880/send", true);
    xhrReq.setRequestHeader("Content-Type", "text/json");
    xhrReq.send(JSON.stringify(json));
}
```

その他ソースなどはこちら↓
https://github.com/nc30mtd/rpi-nodered-web-remotecontroller
Androidデバイスでゼロタッチデプロイするまで～調達編1～

# 目的
* 日本で購入したAndroidデバイスで
* ゼロタッチデプロイを行い
* EMM導入までできるようにする
 

## 今回の目標
ゼロタッチデプロイ対応できるメーカを特定する。
（2019年12月の情報です）

#アプローチ
## ゼロタッチデプロイ対応可能なAndroidメーカを探す

基本的に、業者の情報はGoogleのAndroidのサイトに記載されています。
https://www.android.com/intl/ja_jp/enterprise/management/zero-touch/

たとえばここで、

```
ゼロタッチ パートナー
端末をスムーズに導入していただけるよう、世界中の携帯通信会社、端末メーカー、EMM プロバイダと提携しています。
```

とありますが、日本で聞いたことあるメーカでも、**日本法人向けに提供してくれるとは限りません**。
というか、だいたいダメでした。

なので、こちらで調査しましょう。
https://androidenterprisepartners.withgoogle.com/resellers

![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71365/5e82a19c-7191-57c3-ce50-f8ba146e76fd.png)

Androidデバイスをゼロタッチで販売してくれるリセラーがリストアップできます。
このままだと諸外国含めて126の企業を調査する必要があり、とても死ぬため、文明人らしく絞り込みましょう。

![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71365/7968514e-ded1-6d62-3b8a-45959f1b6ce1.png)

その結果が、こちらの2社まで絞り込まれました。
たった2社しか対応できないとか、日本なにかんがえてるのしぬの？

|En|Jp|URL|
|:--|---|---|
|Daiwabo Information Systems (DIS)|ダイワボウ情報システム|https://www.idaten.ne.jp/portal/page/out/wmbc/android.html
|KDDI corporation|KDDI|https://www.kddi.com/

## どこならやってくれそうか？
上の2社ですが、**KDDIは厳しそう**です。
なにせ、説明もなくリンク先も公式ページトップ。
Android ゼロタッチデプロイを求めてたどり着いた求道者に対応する気はあんまりなさそうです。

では**DIS**はどうか？
こちらはちゃんとそのための専用ページと窓口を用意しています。
https://www.idaten.ne.jp/portal/page/out/wmbc/android.html

ちゃんと備えて待ち構えている…
その姿勢がいいじゃないか…

購入先としての相談は、DISに対して行うことに。


# 次回
DISとの交渉
iOSで使えるQR決済系API調査


## LINE Pay 
・Web or LINE bot から使用可能 (外部アプリでできるか不明)
・LINEの決済ページへ遷移して決済を実行する 
使用例: https://qiita.com/ufoo68/items/a6d036d143fe4950aea3

## PayPay
・[APIは一般には開放していない](https://about.paypay.ne.jp/docs/terms/paypay-merchant-terms/)
※ 加盟店がPayPayユーザーからの商品等の注文等を自己のシステムにおいて管理できるようにするのみ使用可能

## Apple Pay (メルペイのiDを含む)
・[ApplePay API](https://developer.apple.com/jp/apple-pay/implementation/)を利用する
・Swiftネイティブで実装するので実装コストは一番低そう
・`PKPaymentNetwork `より、オプションで決済を許可するカードブランドを指定できる
→ https://developer.apple.com/documentation/passkit/pkpaymentnetwork
【BluePrism】列を数値型にしてからソートする

以下のようなコレクションを「フィールド1」列でソートしたい場合、Sort Collectionを使ってもうまくソートされません。
列の型がText型だからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/85337fd2-58bc-e8f7-ead7-fbb053e13306.png)

なので、指定した列の型を強引にInteger型にしてソートするオブジェクトを作りました。
ベースはSort Collecctionです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/208fbeed-4f30-83ed-81ef-b3997e661a34.png)

###Input
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/04a0d577-f1bc-4836-80f1-6144f5786572.png)

###Output
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/6ffe41cb-2e92-2d7c-d1a3-3bcc82c2bf5e.png)

###Code

```vb
Try
	Dim New_Collection As System.Data.DataTable
	New_Collection = New DataTable()

	For Each c As System.Data.DataColumn In Collection_In.Columns
		If c.ColumnName = Sort_Field Then
			New_Collection.Columns.Add(New DataColumn(Sort_Field, GetType(Integer)))
		Else
			New_Collection.Columns.Add(New DataColumn(c.ColumnName, GetType(String)))
		End If
	Next

	For Each r As System.Data.DataRow In Collection_In.Rows
		New_Collection.ImportRow(r)
	Next

	If Ascending Then
		New_Collection.DefaultView.Sort = Sort_Field & " ASC"
    Else
		New_Collection.DefaultView.Sort = Sort_Field & " DESC"
    End If
    Sorted_Collection = New_Collection.DefaultView.ToTable
    Success = True
    Message = ""
Catch e As Exception
    Success = False
    Message = e.Message
End Try
```

#サンプル
[https://github.com/falcslab/blueprism/tree/collection](https://github.com/falcslab/blueprism/tree/collection)
BPA オブジェクト - 数値でソート.xml
Java シリアライズ

# シリアライズとは
直列化。Javaオブジェクトをバイト配列として出力すること。シリアライズすることによってファイルに書き出せるようになります。

## `Serializable`インタフェース
`Serializable`インタフェースを実装したクラスはシリアライズ可能になります。

## オブジェクトをファイルに書き出す
```java
import java.io.Serializable;

public class Person implements Serializable {

    private String greeting = "hello";

    Person(String greeting) {
        this.greeting = greeting;
    }
}
```

```java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializeSample {
    public static void main(String[] args) {
        var person = new Person("hello");
        try {
            var objectOutputStream = new ObjectOutputStream(new FileOutputStream("person.txt"));
            objectOutputStream.writeObject(person);
            objectOutputStream.flush();
            objectOutputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
```
ローカルで追記・修正したアプリをHerokuにデプロイ済のアプリに更新する方法

備忘録で書いておきます。

まず、Herokuにログイン

$ heroku login

ディレクトリ配下のファイルをコミット対象にする
$ git add *

コミット
$ git commit -m "Release to heroku"

ローカルのmasterブランチをリモートリポジトリherokuへpushする
$ git push heroku master

アクセス
$ heroku open
Heroku Postgresを複数のSalesforce組織とコネクトする方法

こんにちは。
Heroku & Salesforce でプロダクト、サービス開発をする仕事をしております、白石です。

今回はHeroku Advent Calendar 2019 の 16日目の記事ということで
Heroku Postgresを複数のSalesforce組織とコネクトする方法についてご紹介したいと思います。

# はじめに

Heroku Postgresと、Salesforce組織のデータを双方向に同期・共有するためのサービスとして「Heroku Connect」というアドオンがあります。
これを活用すると、開発をしなくても、Postgresデータベースのデータと、Salesforceデータベースの標準オブジェクト・カスタムオブジェクトデータを投稿することが可能です。
HerokuとSalesforceでデータ連携をしたいという要件・ニーズがある場合は、ほぼ間違いなく必要になるサービスなので、初めて名前を聞いたような方は是非下記のリンクにて内容を確認いただければと思います。

https://jp.heroku.com/connect

これまでは、Heroku Postgresに対して、Salesforce組織のデータベースを1つ割り当てて連携するという運用で事足りたのですが、とあるプロジェクトで下記のようにHeroku Postgresと複数のSalesforce組織をコネクトする必要がありました。
今回は具体的なコネクト方法をお伝えするので、もしご興味ある方は以下を参考に試してみてもらえると幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548842/d34f38e3-edd4-75ad-015f-7ed95a3cb59f.png)


# 設定方法

Heroku Postgresと、複数のSalesforce組織をコネクトする設定は簡単です。

1. HerokuダッシュボードのResourcesタブを開く
2. Add-onsの検索フィールドに「Heroku Connect」と入力する
3. ポップアップでProvionを選択する
4. 連携が必要なSalesforce組織分、上記1〜3を繰り返し行う

私自身、勝手な先入観で `1つのアプリ内に同一のアドオンを複数設定できない` と思い込んでいたのですが、@sho7650 さんに問い合わせしたところ、何個でも追加できるよということを教えていただき、あっさり設定することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548842/34024704-c715-878e-bb5e-0c24b95d7d12.png)

# 気をつけたいポイント
### 1. 同じスキーマ名を命名することや、同じスキーマに複数のSalesforce組織のオブジェクトをコネクトすることはできない

「Heroku Connect」ダッシュボードの画面で、Salesforce組織との連携初期設定する際、すでに存在しているスキーマと同じ名称にすると、下記のようなエラーが発生して、設定ができないことがわかります。
![Heroku Connect 2019-12-16 16-11-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548842/9b3b35d5-239e-b919-b46c-8c40b466881d.png)
また、色々と試したのですが、同じスキーマ内に複数のSalesforce組織のオブジェクト情報を連携することはできませんでした。
複数のSalesforceオブジェクトをコネクトする際は、必ずスキーマをわけて用意・連携する必要があります。
スキーマが分かれるため、ひと目みてどのSalesforce組織と連携しているスキーマかが判別しやすいように命名することをオススメします。

### 2. 「Heroku Connect」内で設定したMappingsの内容は、別の「Heroku Connect」へインポートできる

Heroku Connectを用いて複数のSalesforce組織と連携する際に、すでに設定済みのMapping(HerokuとSalesforceオブジェクトとの詳細な連携設定)が存在をしていて、全く同じ設定内容で問題ないということであれば、Mapping設定をエクスポート・インポートするのが最も効率よく設定ができます。
ダッシュボード画面の `Settings > Import/Export Configuration` にてjson形式の設定ファイルをエクスポート・インポートができるので覚えておくと良いと思います。
このテクニックは、STG環境で設定したHeroku Connect設定を、本番環境に移行する際にも活用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548842/adab9c46-a2a7-f253-1c6b-944070af5d15.png)

# まとめ

いかがだったでしょうか。

プロジェクトの特性上、どうしてもHeroku Postgresと複数のSalesforceをコネクトする必要がある場合は、是非本記事を参考に設定をしていただければと思います。

Herokuアプリから該当のスキーマを呼び出すため、Heroku環境変数にスキーマ名を登録しておいたり、アプリのサブドメインをスキーマ名とあわせたりして、どのアプリからどのスキーマを使用するかという設計・開発が必要になります。

このあたりの設計・開発の工夫やポイントについては次回また記事にできればと考えております。

それでは、良いお年を。