OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidのIn-App Reviewを表示テストする方法

リリース前にIn-App Reviewを表示させてみたい時あるよね？

どうにか表示させようと試行錯誤した結果、どうにか表示できたので共有しておく。
（2020/12/04時点の情報）

## In-App Reviewをテスト表示させる方法

表示テストをしたい場合、Play Consoleから **内部テストで配布したときのみ** In-App Reviewが表示される。

もう一回言います、「内部テストで配布したときのみ」に表示される。
ローカル環境でビルドしたり、apkファイルを直接インストールしてもIn-App Reviewは表示されなかった。

#### 内部アプリ配布経由で表示できた瞬間のスクショ

自分の個人アプリを実験台にして色々と試してみた！

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/a38a72dc-4dfb-4520-f7fc-6a19c5c7b865.png  width=30%>

仕事でのアプリは色々とあって実験に使えないため、こういう時に個人アプリがあると便利だねー
好き勝手に変更できるしｗ

## Play Consoleの内部テストの場所

Play Consoleの左のメニューから選択できる。
初めて使うには若干設定が必要かも？
（何か設定した記憶があるが忘れた）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/e16bc938-0de9-bfed-7740-8efce276cab2.png)

## 参考リンク

Play Core In-App Review API not showing the Review Activity 
https://stackoverflow.com/questions/63286540/play-core-in-app-review-api-not-showing-the-review-activity/63289851

公式ドキュメント: Google Play In-App Review API
https://developer.android.com/guide/playcore/in-app-review?hl=ja
【TypeScript】クラス定義

#はじめに
前回は[【TypeScript】関数定義](https://qiita.com/t_t238/items/214bd14c86911a3df78f)についてアウトプットしました。
今回はTypeScriptの**``class定義``**についてアウトプットします。


#クラスの型定義
次の Animal クラスは、1 つのプロパティ、1 つのコンストラクタ、1 つのメソッドを持っています。



```javascript

class Animal {
    // プロパティ
    name: string;
    age: number;

    // コンストラクタ
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    // メソッド
    name() {
        console.log(this.name)
    }
    age() {
        console.log(this.age)
    }
}

```

**``※constructor(関数)の戻り値の型宣言は行わない``**

プロパティやメソッドの可視性は``デフォルトでpublic``になるため、外部からアクセスできないようにするには、明示的に``private``と指定する必要があります。

クラスのインスタンスを生成するには、次のように new キーワードを使用します。

```javascript

const animal = new Animal('パンくん', 22);
animal.name(); // パンくん
animal.age(); // 22
```

#継承
``extends``を使用することで継承できます。

```javascript
class Animal {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    name() {
        console.log(this.name)
    }
    age() {
        console.log(this.age)
    }
}

class Dog extends Animal {
    weight: number;

    constructor(name: string, age: number, weight: number) {
        super(name, age);
        this.weight = weight;
    }

    weight() {
        console.log(this.weight)
    }
}

const dog = new Dog('ジェームズ', 7, 20);
dog.name();    // ジェームズ
dog.age();     // 3
dog.weight();  // 15
```

#プロパティ定義の省略

コンストラクタのパラメータの前に``private``や``public``を指定すると、プロパティ定義とその値を設定するコードを省略することができます。


```javascript

class Animal {
  private name: string;

  constructor(name: string) {
    this.name = name;
  }
}
```

```javascript

class Animal {
  constructor(private name: string) {}
}
```

#プロパティのsetter/getterの定義

メソッド名の前に``set``キーワード、``get``キーワードを付けて定義することで、プロパティの ``setter/getter``を定義することができます。 setter はプロパティへの代入時に呼び出され、getter はプロパティの参照時に呼び出されます。``setter/getter``は必ず``public``として扱われます。



```javascript

class Animal {
  private _name: string = '';

  set name(value: string) {
    console.log('名前が設定されました');
    this._name = value;
  }

  get name(): string {
    console.log('名前が呼ばれました');
    return this._name;
  }
}

const b = new Animal();
b.name = 'パンくん';  // 名前が設定されました
console.log(b.name);  // 名前が呼ばれました => パンくん
```
#参照
[TypeScript Handbook: Classes](https://www.typescriptlang.org/docs/handbook/classes.html)
プロダクトマネージャーにジョブチェンジしてみて

VISITS Technologies Advent Calendar 2020 11日目は@woods0918が担当します。
私は今年の6月までデータサイエンティストでしたが、社内異動を希望して今年の7月よりプロダクトマネージャーとしてB2BのSaaSプロダクトに携わっています。
半年ほどの経験にはなりますが、プロダクトマネージャーの仕事を整理してみようと思います。
なお、あくまで個人の経験に基づく見解であることはご了承ください。

## サマリー
プロダクトマネージャーの仕事をおおざっぱにモデル化すると、以下の1~4になると理解しています。

1. プロダクトのありたい姿を描き、共感を作る。
2. プロダクトの現状を正しく認識する。
3. プロダクトの現状とありたい姿の差分を洗い出し、差分を埋めるためのアクションを推進する。
4. プロダクトの理想像（≒ビジョン）に向けて継続的に1~3のプロセスを実行する。

![スクリーンショット 2020-12-04 17.18.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270069/1a606b1c-802d-1acf-e3c6-b5dade347c6b.png)
![スクリーンショット 2020-12-04 17.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270069/89d1dc17-0ae7-007a-2648-66c8cfe69e74.png)

## 1. プロダクトのありたい姿を描き、共感を作る。
まずは、プロダクトのありたい姿を描くことから始めますが、やろうとしている事が「既存の機能や取り組みを改善する」「新たな機能や取り組みを作り出す」のどちらに当たるかを意識することは大事です。
なぜならば、ありたい姿を描くアプローチ異なるためです。

既存の機能や取り組みを改善する場合、ユーザ行動ログの分析やユーザ（含 社内メンバー）からの声がそのまま起点となってありたい姿を描くことが多いと思います。
こちらのケースでは、ありたい姿は明確に見えていることが多いため、チームメンバーの共感も得やすいです。

一方で、新たな機能や取り組みを作り出す場合、ユーザ行動ログの分析やユーザからの声がそのまま起点となることは少ないです。
蓄積されたログやユーザの声を抽象化することで着想を得たり、競合の動きや世の中の流れが起点になってありたい姿を描くことが多くなります。
定量的/論理的に必要な理由を説明しきることは難しく、確信が持てない論点が残るため、最後はプロダクトマネージャーの決断が必要になってきます。
こちらのケースでは、確信が持てない論点に対して各人の意見が入り込むため、必ずしもチームメンバーの共感が得られるとは限りません。
共感が得られない場合でも、根気強くチームメンバーの納得感を醸成し、1チームでプロダクトの成長を推進できるようにすることも、プロダクトマネージャーの大切な仕事の一つだと思います。

## 2. プロダクトの現状を正しく認識する。
次に、プロダクトの現状を正しく認識します。プロダクトの現状とは、プロダクトの機能だけにとどまらず、他に進行中の開発やビジネスサイドでのプロダクトの扱われ方、プロモーションのされ方など、プロダクトにまつわるあらゆることが該当します。
現状を正しく認識することで、現状とありたい姿の差異を正しく洗い出せたり、アクションを決める時の制約条件を正しく理解することが出来ます。
これにより、アクションをした後の手戻りやアクションの抜け漏れを防ぐことが出来ます。

「さすがに現状は把握しているよ」と思う方も多いかもしれませんが、プロダクトを進化させていくフェーズにおいては、日々状況が変化していきます。
古い情報をもとに誤った判断をしないためにも、関係者を集めてキックオフMTGを開き、プロダクトの現状に関する共通認識をチームメンバー間で持つことをお勧めします。

## 3. プロダクトの現状とありたい姿の差分を洗い出し、差分を埋めるためのアクションを推進する。
ここまでで、現状とありたい姿が明らかになっている状態かと思います。
このプロセスでは現状とありたい姿の差分を洗い出し、差分を埋めるためのアクションを設定します。

まず、差分を洗い出す時の注意点ですが、1アクションで解決できるくらい細かい粒度まで分解することをおすすめします。
なぜならば、粗い粒度の差分をもとにアクションを決めようとすると、曖昧なアクションになってしまったり、総花的なアクションになってしまいます。

差分を洗い出しを細かい粒度まで分解できたら、アクションを設定していきます。
この時に重要なのは、全ての差分に対してアクションを設定するのではなく、影響の大きな差分にアクションを設定することです。
特に、スタートアップでは投下できる工数も限られているため、最もROIの高くなる差分はどこかを意識することは非常に重要です。

最後に、足並み揃えて推進するためのプロジェクトマネジメントを行います。
開発、営業・マーケティング・CS・経営企画などあらゆる関係者と足並みを揃えないと、手戻りが発生したり、リリース直前になってアクションの抜け漏れが発生したりして、最悪の場合企画倒れとなってしまう可能性もあります。
そのような事が起こらないように、プロダクトマネージャーが全体の管理を行います。

## 4. プロダクトの理想像（≒ビジョン）に向けて継続的に1~3のプロセスを実行する。
1~3のプロセスを一度行えば、理想のプロダクトになるかと言うと、そういう訳ではありません。
プロダクトの理想像に向けて継続的に1~3のプロセスを繰り返す必要があります。

また、冒頭の図を見ていただくとわかる通り、理想像に向かって最短距離で進む事は困難です。
プロダクトの理想像に向かっているかどうかを確認するために、毎施策ごとに振り返りを行うことが大事です。

場合によっては、失敗する施策があるかもしれません。
そのような時でも、ちゃんと振り返りを行い学びを抽出することで、次に活かすことが出来ます。
また、チームメンバーに対しても、どのような学びがあったかを説明することで、次の施策に対するモチベーションに繋げることが出来ます。
これを行わないチームは、プロダクトマネージャーに対する信頼は失墜し、1チームでプロダクトの成長を目指すことが困難になってしまうかもしれません。

## 終わりに
私が思うプロダクトマネージャーの仕事をつらつらと書いてきましたが、随分と抽象的且つ当たり前な話になってしまったなと反省しています。
また、書く機会があれば、今度は各プロセスの具体的な実務面をハマりどころを含めて書いてみたいなと思います。

まだまだ、ひよっこプロダクトマネージャーなので、もしご意見/ご感想があればコメントいただけますと幸いです。
【備忘録】Swift 実践入門について　第6章

Swift 実践入門のまとめ。
分からない部分の抜粋も記載し、解決できたら随時更新していきます。
なお、ここに記載している以外でも「わけわからん…」となっている部分も多々ありますが、
今は必要ない、と言い聞かせて飛ばしています。



第6章
関数とクロージャ　複数の工程や処理などを1つにまとめたもの。切り出すことで再利用可能
理解度：70％くらいか



6-2 関数
func double(_ x : Int) -> Int {      　//_は呼出時にdouble(x : 2)ではなくdouble(2)って書ける
   return x * 2
}
double(2)  //4

引数…関数への入力。「引数名：型」を指定する。型の後に= “～”など入れればデフォルト引数になる。
呼出時に具体的な値を入れる。

6-3 クロージャ…関数と同じく再利用可能な1つのまとまり。関数はクロージャの一種。
クロージャはその処理を変数、定数、関数などに渡すことができる。
・定義方法
var closure: (String) -> Int
closure = { (string: String) -> Int in
   return string.count * 2
}
closure(“abc”)  //6

引数…複数の引数を取り、引数名を＄を使って簡略化できる。＄0で最初の引数、＄1で2番目の引数を表す。

キャプチャ…クロージャ自身が定義されたスコープ内の遠陬や定数をスコープ外でも使える機能。今はまだどのように使っていくかイメージが沸かない…

引数としてのクロージャ…引数としてクロージャを利用できるが、スコープ外で利用する場合「@escaping」の記述が必要。このようにクロージャを関数に渡すと属性が必要になるが、ここはまだ理解できていない。
二次元リストの操作(Elixir)

この記事は、[Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2) の5日目です。
前日は [とあるサイトでのみ%HTTPoison.Error{id: nil, reason: :closed}が発生 (Elixir)](https://qiita.com/torifukukaiou/items/100afafe1920eb72b339) でした。

----

# はじめに
- [Elixir](https://elixir-lang.org/)で二次元のリストを操作するにはどうすればいいでしょうか
- 二次元リストと言っているのはこういうやつのことです

```elixir
[
  [1, 2, 3],
  [4, 5, 6]
]
```

# 結論
- [get_in/2](https://hexdocs.pm/elixir/Kernel.html#get_in/2)
- [put_in/3](https://hexdocs.pm/elixir/Kernel.html#put_in/3)

# たとえば`list_of_lists[1][2]`を読み取りたい

## [Enum.at/2]()を2回使う
```elixir
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]

iex> Enum.at(list_of_lists, 1) |> Enum.at(2)
6
```

## [get_in](https://hexdocs.pm/elixir/Kernel.html#get_in/2)を使う :star::star::star::star::star: 
```elixir
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]

iex> get_in(list_of_lists, [Access.at(1), Access.at(2)]) 
6
```

-　ちなみに三次元はこんな感じ

```elixir
iex> get_in([[[1, 2, 3], [4, 5, 6]], []], [Access.at(0), Access.at(1), Access.at(2)])
6
```

# たとえば`list_of_lists[1][2]`を書き換えたい

## [Enum](https://hexdocs.pm/elixir/Enum.html#content)モジュールや[List](https://hexdocs.pm/elixir/List.html#content)モジュールを駆使して書き換える
```elixir
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]

iex> list = Enum.at(list_of_lists, 1) |> List.update_at(2, fn _ -> 8 end)
[4, 5, 8]

iex> List.update_at(list_of_lists, 1, fn _ -> list end)
[[1, 2, 3], [4, 5, 8]]
```

## [put_in](https://hexdocs.pm/elixir/Kernel.html#put_in/3)を使う :star::star::star::star::star: 
```elixir
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]

iex> put_in(list_of_lists, [Access.at(1), Access.at(2)], 8)
[[1, 2, 3], [4, 5, 8]]
```

-　ちなみに三次元はこんな感じ

```elixir
iex> put_in([[[1, 2, 3], [4, 5, 6]], []], [Access.at(0), Access.at(1), Access.at(2)], 8)
[[[1, 2, 3], [4, 5, 8]], []]
```

# Wrapping Up :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:  
- Enjoy [Elixir](https://elixir-lang.org/) !!!
- 私は[Designing Elixir Systems with OTP](https://pragprog.com/titles/jgotp/designing-elixir-systems-with-otp/)という本をきっかけに、[get_in/2](https://hexdocs.pm/elixir/Kernel.html#get_in/2)や[put_in/3](https://hexdocs.pm/elixir/Kernel.html#put_in/3)を知りました
- ただこの本は最初のほうだけ読んだだけで、残りは全然読めていない :smile_cat:
    - 読んでいきたい :rocket::rocket::rocket:
物理屋vsソフト屋の戦いと第三国の僕

今日は僕の仕事の話。MATLAB関係ないですが日にちが空いてたのでねじ込みました。

Qiitaを見てくれていたり各SNS等でつながっている人は僕が電磁波の専門であることはわかると思いますが、今一体何してるのか紹介したことなかったなと思ってこんな記事を書いてみました。

**記事内にはオープンな情報しか書きません。**

# 今何やってるか
とりあえず今どういうところで働いているかというと、Simulink過激派の方と同じ会社でMATLAB原理主義者として所属しているわけですが、部署的には自動運転の開発支援系の仕事です。

自動運転開発にはいろんな部署があって、センサのハードを作る人、アルゴリズムを作る人、コーディングする人、センサ情報を使って状況判断などを行う脳味噌のあれこれを作る人などなど。
その中に僕はいるわけですが立ち位置がちょっと特殊で、以下のサイトをまずはみてほしいです。

https://www.sbbit.jp/article/cont1/37279

自動運転では物凄い数のセンサが使われ、極端なことを言えば自動車の全てのセンサを統合して状況判断して最適解を見つけるわけです。当然センサ統合処理の開発をする前にセンサごとにいろんな開発が行われるのですが、「センサとして良い物を作っても全体システムに組み込んでみたらオーバースペックでした」みたいなことが起きかねないです。
そうなる前にあらかじめ仮想空間上に自動運転システムモデルを構築しておき、今自分たちが作ってるセンサやシステムが全体システムにどう影響するのかを解析できるようにしておこうというのが上のサイトのメインテーマで、僕の仕事の概要です。

# 記事のタイトル
じゃあこの記事のタイトルに迫って行こうと思います。僕が何やっているかはオブラートに包んで説明しますが、センサ開発などをがんばってやってきた人たちには2種類いて、それが物理屋とソフト屋です。

前者はセンサに関わる物理現象にすごく知識のある人で、特殊な環境において起きる現象などをもれなく把握しています。後者はセンサ内のソフト的な処理にすごく詳しく、プログラム的な工夫やアルゴリズムのことに長けています。しかし、仮想空間でセンサのモデルを作りましょうとなった時、2者が寄ってたかっても空白になる部分があって、それが**物理現象の計算方法**です。

仮想空間でのセンサ解析では**高速**で**正確**な物理現象の解析が必要になるのですが、解析手法特有の問題点というのがどのセンサにもあって、そこをどう解決するかという点でこの2者は以下のように割れてしまうのです。

 - 計算式や計算アルゴリズムの穴なので、式や計算フローを見直して行こう派
 - 特定環境での問題なので、場合わけでそれ専用の処理を入れよう派

いくら柔軟な意見を求めても結局この2つの意見の戦いになってしまいます。僕としては計算式見直しは「そう簡単にいうなよ」と思いますし、場合わけは「他の問題がでたらどうすんの？キリないがや」と思っちゃいます。

僕は高速演算で精度を上げるという水と油を乳化させるような担当なので、第三国の立ち位置

 - 現象の特徴を掴んで計算式を自力で構築し、余計な処理をしないように手計算をして理論構築する派

になろうとしています。というよりならなきゃいけない。まるで研究者みたいな立ち位置。

# 辛いところ
この立ち位置はすごく重要で、僕自身も満足しています。ただ一つだけ大変なところがあるとしたら、**周りに意見を募れない**こと。「物理屋に理論を聞いてソフト屋に高速演算のノウハウを聞けばいいじゃん」と思うかもしれませんがそうもいかず、まずそもそも仮想空間での解析においては「どんなシチュエーションにも対応する」ことが重要で、かつ現実との乖離があってはならないのです。特に事故シーンなどテストできないパターンに対しては仮想解析が神様になるわけです。
そんな重要なモノにおいて、**特定の物体にだけ特殊な処理が入っている**など言語道断だと僕自身は思っていて、経験上ですが、ソフト屋さんはそういう言語道断なやり方を割と平気で推奨してくるところがあります。では物理屋はどうかというと、現象の原因などはよく理解してくれるのですが、それを計算する手法をゼロから生み出すのが不得意なところがあり、解決の糸口が生まれずに終わってしまうことが多いのです(僕もどっちかというとそう)。
で結局僕が在宅をいいことに散歩でもしながら「ああでもないこうでもない」と言いつつアイデアを出すのです。

# 辛いところ２
文句をたれつつ計算の高速化に成功した僕ですが、その中身はもう本当に研究者みたいな感じで、解説ドキュメントは数式の嵐、微積やベクトル演算を駆使しているのでイメージでの解説にはもう限界がきて、「もう詳しく知りたければ頑張って読んでくれ!!」と何回言ったことか。

結局概要だけは理解してもらえるのですが、ドキュメントを読む人は少なく、後になって質問されるパターンが割とあります。え？式まで解説しないと理解できないよ？？1から詳しく教えたら1時間くらいはかかるけどいいの？？？

# 仲間が欲しい
今のところこの内容に共感してくれる人ってすごく少ないと思うのですが、やっぱり会社のカラーなのか僕が特殊みたいで、**物理現象を簡素化して計算する**ことに長けた人っていないんですよ。いたら弊社に入社して!!まじで!!

# 最後に
すっごいグチみたいな記事ですね。。。いやまぁいいんですよ。それぞれの土俵でやってきたプロの皆さんなので。僕は今の仕事楽しいので、この第三国ポジションのプロになってやればその道で重宝されるだろうなぁ。と思いながら今日も頑張ります。
PHPer&HTML5が好きな自分がなぜC#に惚れたのか

ご無沙汰しております。  　
Hiro_Matsunoです。
ほぼ10ヶ月ぶりかなぁ。
qiitaで投稿するのはということはさておきなぜこのテーマになったかですが。
実は現在C#よりも今年11月からPHPerとして復帰してしまいましたのでこのテーマとさせていただきます。
今回はポエムになってしまいますが許してくださいm(_ _)m。
この投稿はC#アドベンドカレンダー4日目の投稿です。  

実は職場には内緒で書いてるのでｗ。  
#C#を最初はどう思っていたのか
実は好意的に見ていませんでした。
どちらかというと自分はOSS属性の人間でLinux大好き人間だったのでJavaのNull使える版じゃないのとしか見ていませんでした。
仕事で使う機会もなかったのもあってかなかなか触る機会がなかったので食わず嫌い王でしたね。
本当にPHPとjQueryとHTMLで飯を食っていましたので本当に使うということが少なかったのです。
使っては見たかったんですが余裕ゼロのカツカツの年末年始盆暮れ正月なしの夜11時までハンドスクラッチしていたほどだったので実は業界も一回離れて戻ってくるといった経歴の持ち主です。
とういうか過食と拒食を繰り返した上胃も腸もボロボロの上持病も悪化していた時期でもあったので致し方なしでしたね。
#なぜC#に出会ってしまったのか
実は久方ぶりの業界復帰はこともあろうか今主流のRPAでした。
けれどあまり良く使いこなせなかったというよりも実際いうと実業と合ってない部分が多い某RPAに出会ってしまっていたので大変でした。
正直そのソフトが悪さをしていることを認めてもらえたのは辞める直前でした。
なんとその後に以前であって意気投合していた社長さんの会社に務めることとなりC#に出会いました。
実際使ってみたら意外と思い通りにかけるし楽できる部分も多かったです。
特にデータセットやLinQやエンティティフレームワークなどデータベースとの接続を楽にしてくれるフレームワークが多く当時の自分にとってこれほど素晴らしいプログラム言語はないなと思ったほどです。
Windowsフォームの開発でしたがWebと同じ感覚で開発できたので良かったと思っています。
もっと早く出会っていればなぁと思っていた部分も結構多かったので反省させられた部分も多くあります。
#正直言っておく多くのプラットフォームで使いたいならC#を使え
なぜこれを言うのかというと実はC#は結構多くのプラットフォームで動く言語です。
Xamarin知ってますでしょうか。
オリジナルのC#を多くのプラットフォームに使ってもらうためのフレームワークです。
これを使うことによりMac・Linux・iOS・Androidへの移植が簡単になってきました。
実はこのことが一番の自分にとっての反省だったのです。
C#知っていたらもっと楽にクロスプラットフォームの開発できたのになと。
結構HTML5とjQueryMobileなどにはない特徴があるのでみんな良ければ使ってください。
Unity使えなんて言いません。
Xamarin使えと自分は言います。
実は巷に有名な接触確認アプリCOCOAも実はXamarinです。
C#覚えるといろんな開発に使えるということがわかります。
#いま初心者に勧めるとしたらPythonやJavaScriptよりC#だ
正直言っておきます。
JavascriptはECMAの登場とともに特殊になりすぎてVirtualDOMよりも大変な労力がいる様になってきました。
正直昔みたいにjQueryでちょいと書いてお金がもらえる時代とは違いクラス構造・アロー関数の登場で結構特殊になりかけてます。
自分はC#やPHPerだったのでかけましたが昔より残念ながら気楽さがなくなってきました。
Pythonは自由にかけるけど正直ソースが雑然になることが多いです。
だからこそ自分は今はXamarinやC#を覚えることを勧めたいと思っています。
意外と初心者でもクラスの概念さえわかれば簡単ですし画面をちょくに見ながらの開発ができるのが一番の特色です。
実は一番大嫌いな言語のVBも同じことできますが一番直感的に書くのに適していると自分は思っています。
でもPHPには負けるかな。
あれはバックエンド強強だしクラス書くのも簡単だしっておいおい。
だけど画面を直感的に作りながら開発できるからこそC#を強く推すのです。
ちなみにCode For AichiがCallForCodeでトップ50に入ったアプリも実はC#です。
名古屋にいるC#マイスターの三浦くん達が毎年CallForCodeにチャレンジしてくれてます。
今年はどうだったんだ三浦くん。

皆さんソースが見たかった人多かったと思いますが申し訳ございません。
C#書く機会が減ってしまったのであえて今回はポエマーとさせていただきます。
長々と書きましたが本当にC#は良いプログラム言語です。
みんなもどんどんC＃を書いて色んな所で役立てましょう。
皆さんお付き合いしてくださりありがとうございました。

明日は[@naminodarie](https://qiita.com/naminodarie "@naminodarie")さんです。
お楽しみに。
【javascript】空の配列に対するevery/someメソッド

こんなの知らなかった。。。
忘れないようにメモ。

#everyメソッド

```javascript
[].every(x => false);	//true
```

> 注意: このメソッドを空の配列に対して呼び出すと、無条件に true を返します。


#someメソッド

```javascript
[].some(x => true);	//false
```

> 注: このメソッドは空の配列ではあらゆる条件式に対して false を返します。
ArchUnit 実践：実行環境やフレームワークへの依存を禁止するアーキテクチャテスト



```
// 実行環境
* AdoptOpenJDK 11.0.9.1+1
* Spring Boot 2.4.0
* JUnit 5.7.0
* ArchUnit 0.14.1
```

## アーキテクチャテストのモチベーション

ドメイン層は技術的な詳細に依らず、ビジネスのコアロジックを表現します。それらは特定の実行環境やフレームワークとも疎であるべきです。

## アーキテクチャテストの実装

### ドメイン層は Web 実行環境 (Java Servlet) に依存しない

```java
package com.example;

import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import org.junit.jupiter.api.Test;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;

class ArchitectureTest {

    // 検査対象のクラス
    private static final JavaClasses CLASSES =
            new ClassFileImporter()
                    .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
                    .importPackages("com.example");

    @Test
    void ドメイン層はWeb実行環境に依存しない() {
        noClasses().that().resideInAPackage("com.example.domain..")
                .should()
                .dependOnClassesThat().resideInAPackage("javax.servlet..")
                .check(CLASSES);
    }
}
```

### ドメイン層は Web アプリケーションフレームワーク (Spring Framework) に依存しない

```java
package com.example;

import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import org.junit.jupiter.api.Test;
import org.springframework.transaction.annotation.Transactional;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;

class ArchitectureTest {

    // 検査対象のクラス
    private static final JavaClasses CLASSES =
            new ClassFileImporter()
                    .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
                    .importPackages("com.example");

    @Test
    void ドメイン層はWebアプリケーションフレームワークに依存しない() {
        noClasses().that().resideInAPackage("com.example.domain..")
                .should()
                .dependOnClassesThat(new DescribedPredicate<>("are part of the Spring Framework") {
                    /**
                     * @param clazz 検査対象のクラスが依存するクラス
                     * @return 検査対象のクラスが依存するクラスが Spring Framework のクラスである場合、true
                     */
                    @Override
                    public boolean apply(final JavaClass clazz) {
                        return clazz.getPackageName().startsWith("org.springframework")
                                // 特定のアノテーションへの依存は許可
                                && ! clazz.isEquivalentTo(Transactional.class);
                    }
                })
                .check(CLASSES);

    }
}
```
GoogleスプレッドシートでIMPORTDATA関数が文字化けするので、文字コードを指定してCSVファイルを読み込める関数を作ってみました

#きっかけ

Googleスプレッドシートで[IMPORTDATA関数](https://support.google.com/docs/answer/3093335?hl=ja)を使うと、指定した URL のデータをCSV形式でインポートできて大変便利なのですが、残念なのは日本語のCSVファイルを読み込む際に、文字コードがUTF-8以外だど文字化けしてしまうことです。

日本国内の公開データCSVファイルの多くは、Excelでの編集を想定しているためか、Shift-JIS形式の場合が多く、Googleスプレッドシート上でインポートして利用するには、使い勝手が良くありません。テキストエディタなどで、文字コード変換をするのも面倒です。

そこで、手間を省くため、文字コードを指定してCSVファイルを読み込めるようにしたGAS関数を作ってみました。

#文字コードを指定して、CSVデータを取得する関数

Google Spreadsheetのスクリプトエディタから、下記のGAS関数を追加して利用します。

```javascript
/**
 * importCSV
 * 
 * 文字コードを指定して、CSVデータを取得する関数
 * IMPORTDATA()関数でCSVをロードすると、UTF-8以外は文字化けするための対策
 * 
 * @URL  {String} CSVデータの取得先URL
 * @mojicode  文字コード {number} [0|1|2] - 0:UTF-8, 1:Shift_JIS, 2:EUC-JP
 * 
 * @return    {Object} CSVデータ
 */
function importCSV(URL, mojicode) {

  var code = "UTF-8";
  
  if (!URL) {
    return;
  }
  
  // 文字コード
  if (mojicode === 0) {
    code = "UTF-8";
  }else if (mojicode === 1) {
    code = "Shift_JIS";
  }else if (mojicode === 2) {
    code = "EUC-JP";
  }else{
    code = "UTF-8";
  }

  // CSVファイル取得
  response = UrlFetchApp.fetch(URL);
  var csv = response.getContentText(code); 
  // CSVデータをパースする
  var csvdata = Utilities.parseCsv(csv);

  return csvdata
}

```

#動作確認

動作確認として、[投信総合検索ライブラリー](https://toushin-lib.fwg.ne.jp/FdsWeb/FDST000000) と [e-Stat 政府統計ポータルサイト](https://www.e-stat.go.jp/stat-search/files?page=1&query=CSV&layout=dataset&bunya_l=02&stat_infid=000031524030)から、CSVファイルのインポートを試してみます。

##例1) [上場インデックスファンドＴＯＰＩＸ](https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000?isinCd=JP3039100007)
※ ページ内にある「[基準価額・純資産総額・分配金のCSV データダウンロード](https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP3039100007&associFundCd=0231701C)」からダウンロードできます。

![2020.12.04-20_55_01-docs.google.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11198/1b45d094-1b74-34ce-372d-3c572ec57fa9.png)

##例2) [国勢調査 / 時系列データ / CSV形式による主要時系列データ](https://www.e-stat.go.jp/stat-search/files?page=1&query=CSV&layout=dataset&bunya_l=02&stat_infid=000031524030)
※ ページ内にある「[表示・ダウンロード](https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031524030&fileKind=1)」からダウンロードできます。

![2020.12.06-11_10_56-docs.google.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11198/f9c1ac43-6904-954b-81c2-fb6aaa1e9c9f.png)


IMPORTDATA関数だと日本語が文字化けしてしまいますが、importCSV関数で文字コードを指定して読み込むと、文字化けを回避できるようになりました。
React Native + Xcode12で画像が表示されない問題

ただの以下の日本語訳です。
参照：https://medium.com/@jQN/fix-images-not-loading-in-ios-14-react-native-723534305e46

## 問題について
特定バージョン（僕の場合0.62.2）のReact NativeでXcodeを使用した場合、画像が表示されない問題が確認されています。ReactNativeのバージョンをあげると解決しますが、依存関係の問題でバージョンをあげられない場合の一時的な解決です。

## 変更する部分
```bash
vi node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
# code node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
```

```javascript:node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
// 270行目あたり
#pragma mark - CALayerDelegate

- (void)displayLayer:(CALayer *)layer
{
  if (_currentFrame) {
    layer.contentsScale = self.animatedImageScale;
    layer.contents = (__bridge id)_currentFrame.CGImage;
  }
}
```

ここにelseを追加

```javascript:node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
// 
#pragma mark - CALayerDelegate

- (void)displayLayer:(CALayer *)layer
{
  if (_currentFrame) {
    layer.contentsScale = self.animatedImageScale;
    layer.contents = (__bridge id)_currentFrame.CGImage;
  } else {
    [super displayLayer:layer];
  }
}
```

## パッチの作成
```bash
npm install patch-package
# yarn install
npx patch-package react-native
# patch-package react-native --use-yarn yarnの場合

# patch-package 6.2.2
# • Creating temporary folder
# • Installing react-native@0.62.2 with yarn
# • Diffing your files with clean files
# ✔ Created file patches/react-native+0.62.2.patch

patches配下に作成されるのでgit add
git add patches/*
```

package.jsonに追加

```json:package.json
"scripts": {
  ...
  "postinstall": "patch-package",
}
```
TypeScriptで文字列を配列に変換する方法。（＋エラーが出た時の対処方法）

# 文字列を配列に変換する
スプレット演算子を用いると文字列を配列に変換できます。
これはJavaScriptでもTypeScriptでも同じです。

```
//[...文字列]という形がスプレット演算子です。
const str = "konnitiwa";
const array = [...str];
console.log(array);

// split()でも変換できます。
const array2 = str.split("");
console.log(array2);

```

結果はどちらも同じになります。

```
[
  'k', 'o', 'n', 'n', 'i', 't', 'i', 'w', 'a'
]
```

スプレット演算子を使ったほうがスマートですね。

スプレット演算子とは？
>スプレッド構文 (...) を使うと、配列式や文字列などの反復可能オブジェクトを、0 個以上の引数 (関数呼び出しの場合) や要素 (配列リテラルの場合) を期待された場所で展開したり、オブジェクト式を、0 個以上のキーと値のペア (オブジェクトリテラルの場合) を期待された場所で展開したりすることができます。
(MDNより)

スプレッド構文 - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

# エラーが出た時。

でもTypeScriptで動かそうとすると何故かエラーが出るときがあります。
これはファイルの拡張子「.ts」を「.js」に変えるとうまく動きます。
何故でしょうか？？？

```
function stringToArry(str: string): string[] {
  const array = [...str];
  return array;
}

console.log(stringToArry("konnitiwa"));

```

エラー：

```
error TS2569: Type 'string' is not an array type or a string type. Use compiler option '--downlevelIteration' to
allow iterating of iterators.

2   const array = [...str];
```

その対処方法は・・・

プロジェクトのルートで
`tsc --init`
を実行して `tsconfig.json`ファイルを作成します。

compilerOptionsで`ES6`以降を指定します。
これでうまく動くようになります。

```
{
  "compilerOptions": {
        // "target": "ES3", //(default値)
        // "target": "ES5", // 動かない
        "target": "ES6",    // 動く
        // "target": "ES2015",
        // "target": "ES2016",
        // "target": "ES2017",
        // "target": "ES2018",
        // "target": "ES2019",
        // "target": "ES2020",
        // "target": "ESNEXT",
  }
}

```

# 原因は
`tsconfig.json`を作ってないと`ES3`がデフォルト値となっているので、
`tsconfig.json`を作ってcompilerOptionsの`ES6`以降を指定すれば動くようになります。

VSCodeの拡張機能「Code Runner」などで直接「.ts」ファイルを実行していた時に起きたエラーでした。

ほんの少し前までは
`tsconfig.json`を新規作成した時に`ES5`と設定した人も多かったのではないでしょうか？この場合もエラーが出るのでコンパイラオプションを指定するか`ES6`に設定を書き換えることでエラーは出なくなります。

`ES5`でも動かしたいときは
エラーメッセージにあるように
`tsconfig.json`の設定で
`"downlevelIteration": true,`
とすることで動くようになります。

古いコンパイラでも、新しい構文を使えるようにするオプションということですね。


# CodeWars
Codewars
https://www.codewars.com/

英語のサイトですがTypeScriptで挑戦中です。
VSCodeの拡張機能「Code Runner」を使えばプロジェクトを作ってインストールしなくてもTypeScriptのファイル「*.ts」が動きます。
ブラウザ上で編集するのは大変なので、一旦VSCode上でプログラムを書いてからCodewarsのサイト上に貼り付けて提出しています。

今回のエラーはこの状況でおきたものでした。

# code runner
VSCodeでRubyを気軽に実行する環境を作る。 - Qiita
https://qiita.com/masakinihirota/items/ec90086bab86f369fa15

Ruby以外でも、 C, C++, Java, JavaScript, PHP, Python, Perl, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, が特に設定せずに使用可能です、他の言語もコマンドを設定すれば可能です。
flexboxで横並びにしたコンテンツの中の最後の要素（ボタン等）は下揃えにする方法

#どうも7noteです。横並びコンテンツの各要素の最後だけ下揃えにする方法について

先日ツイッターで見つけた画期的なアイデア・スタイルです。正直ちょっと感動しました。


**Before**
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/8be58494-1a0e-4ac9-304c-634a631163d0.png)

**After**
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/30709108-a31e-31e8-9d1e-d8a7f949f09d.png)

ガタガタになってしまうところを**きれいに並べることができます！**

## ソース

```index.html
<ul>
  <li>
    <figure class="thumb">
      <img src="sample.png" alt="画像">
    </figure>
    <p class="text">テキストが入ります。テキストが入ります。テキストが入ります。</p>
    <div class="btn">ボタン</div>
  </li>
  <li>
    <figure class="thumb">
      <img src="sample.png" alt="画像">
    </figure>
    <p class="text">テキストが入ります。</p>
    <div class="btn">ボタン</div>
  </li>
  <li>
    <figure class="thumb">
      <img src="sample.png" alt="画像">
    </figure>
    <p class="text">テキストが入ります。</p>
    <div class="btn">ボタン</div>
  </li>
</ul>
```

```style.css
ul {
  margin: 0 0 30px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}

ul li {
  width: 200px;           /* 各コンテンツの横幅 */
  border: 1px solid #000; /* 各コンテンツのborder */
  padding: 10px;          /* 余白の指定 */
  display: flex;          /* 【重要】フレックスボックスにする */
  flex-direction: column; /* 【重要】縦並びにする */
}

ul li .text {
  background: #ccc;       /* 背景色にグレーを指定 */
  margin: 0 0 10px;       /* 下に10pxの余白 */
  padding: 5px;           /* 余白5pxを指定 */
}

ul li .btn {
  border: 1px solid #000; /* borderを指定 */
  border-radius: 20px;    /* 角丸にする */
  text-align: center;     /* 文字を中央寄せ */
  margin-top: auto;       /* 【重要】上に取れるだけの余白 */
}
```

## 解説
まず各要素をフレックスボックスにして、`flex-direction: column;`を指定し、liの中の要素を縦並びにする。
そして、下揃えにしたい最後の要素に対して、`margin-top: auto;`を指定することで、最大余白を自動で取得するので、それ以外の要素の高さに依存せずに下揃えにすることが可能になります。

## まとめ

CSSの様々な組み合わせで、まだまだ知らない組み方が出るのでコーディングは本当に奥が深いし面白いなと思います。
日々精進あるのみです。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】HTML・CSSのちょいテク詰め合わせ](https://qiita.com/7note)
IPアドレス関連基礎

#IPアドレスとは

ネットワークにおける住所のこと。
IPv４であれば３２ビットの数字で表され、IPアドレスはネットワーク部とホスト部に分かれている。(IPv6は128ビット)<br>
例えばIPアドレスの後ろに/16のような表記がされていれば
先頭から１６桁までがネットワーク部、その後ろがホスト部ということになる。

*※/16で表される記法をCIDR表記と呼ぶ。*  CIDR= Classless Inter-Domain Routing


#IPアドレスのネットワーク部、ホスト部について

IPアドレスはネットワークごとに分かれるネットワーク部とそのネットワークでコンピューターを識別する
ホスト部に分かれている(例えるなら東京都という住所が、ネットワーク部で、その中にある目黒区や世田谷区がホスト部みたいな)

同一のネットワーク内ではホスト部は必ず異なることになる。


![スクリーンショット 2020-12-04 20.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794525/46a0c659-939a-6877-1bea-43b634f48ee7.png)


#グローバルIPアドレスとは

**用途**
インターネットの世界で通信に利用されるIPアドレス。ICANNおよびその下部組織で管理される。

**アドレスレンジ**

1.0.0.0 ～ 9.255.255.255（クラスA）
11.0.0.0 ～ 126.255.255.255（クラスA）

128.0.0.0 ～ 172.15.255.255（クラスB）
172.32.0.0 ～ 191.255.255.255（クラスB）

192.0.0.0 ～ 192.167.255.255（クラスC）
192.169.0.0 ～ 223.255.255.255（クラスC）


クラスAがホスト部２４ビット、クラスBがホスト部１６ビット、クラスCが８ビットのため、
クラスAが最も大規模なネットワークで使用され、クラスB、Cとなるにつれて小規模なネットワークで使用される(ホスト部が多い方が同じネットワーク内でより多くのIPを割り当てられるため）



#プライベートIPアドレス（ローカルIPアドレス)とは

**用途**
自宅や会社内といったLAN環境の通信で使用される。

**アドレスレンジ**

クラスAからクラスCに分けられている。（IPv４の場合)

10.0.0.0～10.255.255.255（クラスA）
172.16.0.0～172.31.255.255（クラスB）
192.168.0.0～192.168.255.255（クラスC）


##サブネットマスクについて

同一のネットワーク内に多くのホストを入れずに、サブネットマスクを用いてネットワークを細分化できる。
サブネットマスクではネットワーク部を１、ホスト部が０を示すことによって、IPアドレスを新たに定義することが可能。

クラスCのIPアドレスを指定した場合は24ビットがネットワーク部、残りの8ビットがホスト部となるが、
次のようにサブネットマスクを指定した場合はネットワーク部が26ビットとなり、よく多くのネットワークにわけることが
できる

```
　(11111111111111111111111111)/(000000) 
          ネットワーク部            ホスト部 
```


以上
もしも・・・な Rails Girls があったら

# はじめに
この記事は [Rails Girls Japan Advent Calendar 2020](https://qiita.com/advent-calendar/2020/railsgirlsjapan) の4日目の記事です。

企画・運営に携わられている皆様お疲れ様です。
こういう企画があったら楽しいのではということで投稿いたしました。
# もしも・・・SPA な Rails Girls があったら
![20201204c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/66d5ac29-e298-c62c-ffe4-fd13ced9e3a8.png)
元ネタは、去年のAdvent Calendarの [Rails Girlsのカリキュラムをこうしていきたいみたいな提案 - Qiita](https://qiita.com/okuramasafumi/items/8feaf9efdcac6823a32c) です。
`CRUD`が基礎となるのはそうですし、日本的な基礎から入って応用へ行くメリットも分かりますが、最先端も面白い。
まあ、`SPA`って認識があれば初心者ではないと思いますが。
# もしも・・・COBOL な Rails Girls があったら
![20201204g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/24731112-c68e-8ff1-e235-317221a2473a.png)
女性IT技術者の大先輩と言えば、[グレース・ホッパー - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%BB%E3%83%9B%E3%83%83%E3%83%91%E3%83%BC) さん。
グレースさんが開発した`COBOL`はいまだ現役で稼働しています。
勿論`Rails`も凄いのですが、COBOLも凄いので、イタコさんに憑依していただきグレースさんの開発苦労話など伺いたいものです。
イタコさんだったら日本語で語ってくれますよね？
# もしも・・・パパ活 な Rails Girls があったら
![20201204h.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/f6c63a9e-8583-6642-dad4-b9ca9d8890f6.png)
Rubyの`パパ`と言えば、[まつもとゆきひろ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D) さん。
そのパパからプログラミングについて、直々カツ！をいただける、大変ありがたい話ではないですか。
勿論、いいプログラミングについては、ヨシ！を頂けます。
# まとめ
いずれも、~~個人的に~~喜び勇んで参加したくなる企画ですね。
【Unity(C#),MagicLeap】MLTK使ってハンドトラッキングでオブジェクトを操作

##Magic Leap Advent Calendar 2020
この記事は、[Magic Leap Advent Calendar 2020](https://qiita.com/advent-calendar/2020/magicleap) の5日目です。

##Magic Leap Challenge

2020年9月に「[Magic Leap Challenge](!https://x-garden.co.jp/ml-challenge)」というハッカソンに参加させていただきました。
デバイスを1週間貸りて、家で開発を行うリモートハッカソンです。

私は料理アプリのMRバージョンを検証として作成しました。
作品：[MRクッキング](https://protopedia.net/prototype/1986)


その際に**UIを掴んで動かす**実装について方法がわからず苦戦しました。
最終的にオレオレ実装でゴリ押ししました。

下記GIFが実際に実装したものです。

![MLTK_Demo2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/4e883e0c-1830-ac56-ee68-b992941904c6.gif)

**位置を変えたい場合は摘まんで動かす**、
**向きを変えたい場合は押す**　という実装で乗り切りました。

なぜ苦戦したかというと理由はシンプルで
**指のボーンの情報に回転座標が含まれていない**からです。
1週間という短い実装期間で座標からよしなにするのは無理でした。



しかし、ハッカソンの懇親会で**「MLTK使えばできるらしいよ」**という
神の助言を頂いたので、今回はそのMLTKを使ってみた という内容になっています。

##MLTK(Magic Leap Toolkit)

MLTKはGithubからパッケージでインポートしました。
【参考リンク】：[magicleap/Magic-Leap-Toolkit-Unity](https://github.com/magicleap/Magic-Leap-Toolkit-Unity/blob/master/package/MagicLeap-Tools.unitypackage)

バージョンの違い次第で動かないことがあるようです。

私の試した環境のバージョン情報を置いときます。

>Unity 2019.3.10f1
MLTK ? 記載なし
MLSDK v0.24.1

##デモ

実際に試してみたものが下記です。特にコーディングは必要ありませんでした。神。


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MagicLeapのアドカレに参加しているので<br>MLTKを触ってました😎<a href="https://t.co/X0OdExlzYJ">https://t.co/X0OdExlzYJ</a><br><br>MLTK使えばこういうのが<br>ほとんど何もしなくても実装できます👏<br><br>もっと早くMLTK使って<br>おけばよかったと思いました😇 <a href="https://t.co/e6aFzrqm4j">pic.twitter.com/e6aFzrqm4j</a></p>&mdash; KENTO⚽️XRエンジニア😎Zenn100記事マラソン挑戦中19/100 (@okprogramming) <a href="https://twitter.com/okprogramming/status/1334173725873225729?ref_src=twsrc%5Etfw">December 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##HandInput
`HandInput`というコンポーネントが用意されており、シーン上に配置する必要があります。

`Palm Collisions`というパラメータをオンにすると
手を開いた状態でも手に当たり判定を付けることができます。

##DirectManipulation
`DirectManipulation`はインタラクションさせたいオブジェクトにアタッチする必要があります。

`Rigidbody`と`Collider`も必要です。

パラメーターは大量にありますが、言葉の通りで特に理解が難しいものはありませんでした。

![DirectManipulationSS1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/5357427d-3452-31c9-0ebc-8e574da6b1af.png)

コールバックも用意されています。
![DirectManipulationSS2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/d469a05c-becb-2e36-909d-1b04ff8a63a2.png)


##SoundOnCollision
`SoundOnCollision`をインタラクションさせたいオブジェクトにアタッチすると
オブジェクトと手が衝突した際に音が鳴ります。

##おわりに
他にも超便利機能が山盛りなようなようです。
もっと早く使っとけばよかったです。
[AWS] -- Architecture Supporter[2] -- Setting Local Development Environment

# At first.
This content is written by AWS Beginner.
So this content is a possibility that isn't Best Practice.
Please read this content as reference information.

#Work on this article.
* Install "Docker" on Windows.
* Install "Visual Studio Code".
* Setup Docker.
* Setup Visual Studio Code.
* Try connecting from Visual Studio Code to Docker.

# My PC Environment.
* Windows10 Home

# 1.Install "Docker" on Windows
(1) Open the page of 「["Download for Docker Installer"](https://docs.docker.com/get-docker/)」.
(2) Click 「Docker Desktop for Windows」 --> Download Installer Exe File.
(3) Execute Installer.
    ※Installer is very simple. So, No description.

# 2.Install "Visual Studio Code" on Windows
(1) Open the page of 「["Download Visual Studio Code"](https://code.visualstudio.com/download)]」.
(2) Click 「Windows(Widnwos 7,8,10)」
(3) Execute Installer.
(4) Setup added task.
![vsinstalle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916869/56a71693-e8f8-6166-b938-23a1b54644ee.png)
(5) Click "Next" and "Install" and "Finish".

# 3. Install Visual Studio Code extend function.
(1) Search "Docker" extension function And click install.
![docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916869/099efbf6-2a99-0863-9335-610da82ee251.png)
(2) Search "Remote Container" extension function and click install.
![remotecontainer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916869/38762a73-8b44-a448-675c-21bcc075203a.png)

# 4. Create a Docker Image File.
(1) Create a Workspace directory.
I create a directory that name is "work".
　※Name is any.
　※This sample has created a directory under "C Drive"
(2) Create "DockerFile" in Created The directory.
    DockerFile content is below.

```text:Dockerfile
FROM node:lts-alpine

WORKDIR c:\\work

・・・

```

・・・Sorry, this content is not completed.
・・・today is the end.
・・・to be continue...


---
# ◆Related article
* [[AWS] -- Architecture Supporter[1]](https://qiita.com/kazuya-ho/items/9adad0e2e81c117a2830)
* [[【AWS/GCP】クラウド初学者が、Google Cloud Certified PCA・AWS CP・AWS SAAを１か月で取得した方法]](https://qiita.com/kazuya-ho/items/109f356ba7b0d5e6ddc0)
Power IK入門【導入編】

# はじめに
先日無料化された「Power IK」というアセットの導入方法についての記事です。
この記事ではIK導入の初歩としてTPSテンプレートのサードパーソンキャラクターにFootIKの機能を持たせたいと思います。とても強力なプラグインなのでこれだけでは役不足ですが、導入編ということでご理解ください。

# インストール
まずはEpic Games LauncherからPower IKをインストールしましょう。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/a02bee07-5b2f-07fa-1369-a601ea705657.png)

インストールが終わったらプロジェクトを開きます。
（今回の記事の中では「ThirdPerson」テンプレートを使用しています。）

UE4エディターのEditタブからPluginsでプラグイン設定画面を開き、Power IKをEnabled(有効)にして再起動します。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/3bab814b-d31d-d0a8-b2c5-80e32fe008c7.png)

# Foot IK設定
テンプレートプロジェクトに含まれている「ThirdPerson_AnimBP」を開き、AnimGraphを編集していきます。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/9540ceeb-d352-9675-5b09-f6c08e70b46f.png)

AnimGraphを開くと、DefaultからOutput Poseに繋がっています。Defaultをダブルクリックで開き、さらにIdle/Runをダブルクリックで開きます。するとThirdPerson_IdleRun_2DとOutputノードがあるので、この2つのノードの間にPower IK Groundというノードを挟んでやります。（ノードを繋ぐと自動的に変換ノードが挟まれて以下の形になります）
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/d77b30df-32cd-ac9f-4587-d591e8d9f80c.png)

Power IK GroundノードをクリックするとDetailsタブに詳細の設定が表示されます。この中の、Rig->Feetの横にある＋マークを2回クリックします。追加された要素中のBone Nameに「foot_l」「foot_r」と設定しておきます。これがIKを適用させるボーンの名前となります。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/2b5b540d-f510-2410-a635-c98f46143907.png)

ここでコンパイルを行いPower IK Groundノードをクリックした状態でプレビュー画面を見ると、先ほど設定したボーンに黄色いマークが付いていることがわかります。
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/06e9b06e-7e71-a6f1-6ecd-9b96df225f29.png)

次に、IKを適用させるために地面を認識させる必要があります。ここでは[公式ドキュメント](https://poweranimated.github.io/)の手順に則って進めていきます。
プロジェクト設定からCollisionの設定画面を開きます。その中のTraceChannelsに新規追加でIKTraceを追加します。DefaultResponseはBlockに設定しておきます。
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/3bd89e54-6823-c6e0-6dc4-719f319c5664.png)

次にキャラクターには反応しないようにするため、下のPresetからPawn、CharacterMeshそれぞれを選択しIKTraceに対してはIgnore(無視)に設定しておきます。
![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/b94af51a-c2c2-e80b-ca08-10435db4f36d.png)

そして最後に「ThirdPerson_AnimBP」に戻り、詳細タブのCollision Channelを先ほど追加したIKTraceに設定します。
![09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/41ffa14d-d12d-3d35-05dd-48d45fa33ef4.png)

# Foot IK導入完了
たったこれだけの操作でFoot IKが導入できました。足のIKだけではそれほど恩恵がないかもしれませんが、[公式ドキュメント](https://poweranimated.github.io/)には詳細設定など様々な情報が載っておりますのでそちらもご参照ください。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319669/afc19a72-121d-49fd-cd60-93fb7998d855.png)
SEO対策

目次
１．[SEOとは？](#SEOとは)
２．[SEO内部対策と外部対策](#SEO内部対策と外部対策)
３．[検索順位が決まる仕組み](#検索順位が決まる仕組み)
４．[検索順位が決まる流れ](#検索順位が決まる流れ)
５．[実施すべきSEO対策](#実施すべきSEO対策)
６．[まとめ](#まとめ)



# SEOとは

SEOとは"Search Engine Optimization"の略です。
直訳すると「検索エンジン最適化」ですが、さらに噛み砕いて言うと、自然検索からの流入数・CV数を増やすために行う様々な施策のことです。

日本の検索サイトといえば、メインは「Yahoo!」と「Google」です。
ただしYahoo!の検索エンジンはGoogleのものを使っているので、GoogleのSEO対策ができていればYahoo!も対策できたことになります。（完全に一致した結果にはなりません。）

# SEO内部対策と外部対策
内部対策とは、Webページの内容を検索エンジンにしっかりクロール、インデックスしてもらい、テーマ性を正しく評価させる施策です。

外部対策とは、他のサイトから被リンクを受け、クロールの促進や第三者からの評価を得るための施策です。

SEOにおいては基本的に「内部対策」が重要であり、外部対策（＝被リンク獲得）は自分ではコントロールしづらい施策です。

過去のSEO対策では、この「外部対策」目的で、「優良なリンクを○○件　○○十万円で付与します！」のようなSEO対策が横行していました。現在はこういった不正めいた「外部対策」はGoogleのアラート対象となりますので、現在においては絶対にやってはいけない施策になります。

# 検索順位が決まる仕組み

簡単にいうと下記の３点で検索順位は決まると思います。

１．検索キーワードに対して親和性が高いコンテンツがあるサイト
２．検索したユーザーの地域
３．その他、Google内のアルゴリズム

そのため、１番だけを意識して重要なキーワードだけをサイトに埋め込むだけでは上位にきませんし、エリアだけを意識してページを作っても上位にはきません。

# 検索順位が決まる流れ

Googleが独自のアルゴリズムによって順位を決めるまでの流れは「クロール」→「インデックス」→「アルゴリズムによる評価」となります。

STEP1：クロール
「Googlebot」と呼ばれるGoogleのロボットが、過去クロールしたURLやリンクを辿って世界中のサイト情報を巡回し、サイト情報を取得します。

STEP2：インデックス
インデックスとは、クローラーによって集められた情報をGoogleに登録・保存することです。

Googleはインデックスされて始めてサイトの存在を認識するため、まずは正しくインデックスさせるためのSEO対策を行う必要があるのです。

STEP3：アルゴリズムによるサイト評価
Googleは数百にも及ぶアルゴリズムによってサイトを評価し、検索順位を決定しています。

多数ある中でも特に重要なのが、検索クエリ（キーワード）とコンテンツとの関連性の高さです。

# 実施すべきSEO対策

１．ページのコンテンツを充実させる。
例えばお店を紹介したい場合は、お店の情報を掲載するだけではなく、お店のこと・お店のサービスのこと・商品があれば商品のこと、お店に関することを日々更新して訪れたユーザーにとって必要な情報が揃ったコンテンツをつくるべきです。

２．クロールしやすいサイト構成
サイトはリンクを辿って様々なページに遷移すると思います。
深い階層のページに行った際に、違うページやさっき見たページに戻りたい、などはよくあることだと思いますが、そういったユーザーの動線を意識して必要な箇所に必要なリンクを設けてページを作ってください。
実際にGoogleがページをクロールする際も、リンクを辿ってサイト内のページをクロールします。
ユーザー目線でしっかりとリンク構造が整っていると、それはGoogleのクローラーにとっても遷移しやすいサイトになります。

３．HTMLタグの各役割を適切に利用する
titleタグは必ず利用するは当然ですが、ページごとに必ず変えるべきです。
またkeywordタグ descriptionタグもページごとにしっかり記入し、決して複数ページに渡って同じ内容がかかれているということがないようにすべきです。

h1 / h2 タグなの見出しタグを利用する際は、ページ内で使う場合は使いすぎに注意してください。
とくに h1　を同じページ内で２回も３回も使うのはNGです。

画像のimagesタグには「alt属性」があります。この「alt属性」に何も画像の説明を書かないよりはちゃんと画像の説明文を入れるべきです。
ただし、昔よくあった「alt属性」にキーワードを連発するようなSEO対策は絶対にNGです。

またコーディングミスをしているのもなるべく避けるべきです。

https://developers.google.com/speed/pagespeed/insights/

で分析をかけると、ページを読み込みを早くするためのアドバイスの他に、サイト内のタグの分析も行ってくれますので、そのアドバイスを参考に修正を加えるのも良いと思います。

# まとめ

Webサイトを運営していく上で、SEOは避けては通れない最重要項目です。
とはいえ、キーワードだけ変に埋め込む、外部リンクを増やす、など昔ありがちな対策は今ではマイナスとなります。

重要なのはユーザーのためのコンテンツとはどんなものなのか、ユーザーにとってわかりやすい・使い勝手がよいサイトがなにを考えることが重要です。是非、皆さんも自分で色々と試してみてください。
Buffalo LS-WXBL を 8TB HDD に換装してみた

ディスクは Seagate ST8000DM004
Buffalo LS-WXBL の Firmware は 1.74
換装が終わったら使い始める前に完全初期化したほうがいいっぽい。
RAID-1 を組んだあとのディスク リビルドは３日かかった。 
HDD から LS-WXBL にコピーして、タスクマネージャのグラフでディスク転送速度 20MBytes/s くらい、
イーサネットの帯域 160Mbps くらいの転送速度はでてる。（通常使ってる LAN だから参考まで。）
古い NAS だけれどバックアップ倉庫としては十分。 特に問題なさそう。
![LS-WXBL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/822713/a9162eb3-ff5f-d9c6-4343-a82d63bedd16.jpeg)
![WS014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/822713/5b443898-be42-f6c9-a73c-ab6235e5d195.png)
![WS015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/822713/bfad951f-a259-370c-2488-e5d0ce38f2d5.png)
Azure Data Factory でパブリック公開されているAzure Storageに接続する方法

## 概要
Azure Data Factoryにて、パブリックに公開されているAzure Storageに接続する方法を紹介します。
「Authentication method」を「SAS URI」に設定し、URLを入力後、「SAS token」に「"」を入力することで可能です。

同僚が、下記記事で紹介されているNYタクシーのデータにAzure Data Factoryから接続できないかという質問がきたことが、今回の投稿のきっかけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/92658c10-fb66-dbe4-9fda-67d27e9839ce.png)

引用元：[チュートリアル:ニューヨークのタクシー データを読み込む - Azure Synapse Analytics | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/load-data-from-azure-blob-storage-using-copy#load-the-data-into-your-data-warehouse)

## 手順
### パターン①Azure Blob Storageのリンクドサービスを作成後、下記の値を設定。Connection Testにて接続ができていることを確認。

| 項目      | サンプル値                                         |
| --------- | -------------------------------------------------- |
| Name      | ls_blob_nytaxiblob                                 |
| Authentication method      | SAS URI                                 |
| SAS URL   | https://nytaxiblob.blob.core.windows.net/ |
| SAS token | "                                                  |
| Test Connections | To file Path                                                  |
| Test Connectionsの値 |2013/Date                                                  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/18e1146c-06e5-610d-6b62-0ea9c09de6d3.png)

### パターン②

URL側の末尾に空のSAS Tokenを付与するような記述でもOK

| 項目      | サンプル値                                         |
| --------- | -------------------------------------------------- |
| Name      | ls_blob_nytaxiblob                                 |
| Authentication method      | SAS URI                                 |
| SAS URL   | https://nytaxiblob.blob.core.windows.net/?'' |
| SAS token |                                                   |
| Test Connections | To file Path                                                  |
| Test Connectionsの値 |2013/Date                                                  |

## 補足

ちなみに、listが許可されていないような状態の場合（blob単独の参照のみパブリック許可されている）、test connection は To file pathで検証しましょう
Shadertoyの移植


__※注意__

- この機能はβ版でのみ利用可能であり、まだ公式にはサポートされていません。
- Ref：[こちら](https://smode.fr/doc/ref/2d/generator/shader-toy-generator.htm)

#Smodeの準備
コンポジットを作成し、エレメントツリー右上の検索欄に「Shader Toy」と検索します。
このようなGeneratorが表示されるのでクリック
![スクリーンショット 2020-12-04 195709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/01ba968c-b02e-2503-87db-dfa6ba42bd3a.png)

すると、VIEWPORT上にUVを色で表したものが表示されます。
Timelineの表示されていた場所に__Shaderタブ__が追加され、GLSLが表記されていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/3ca99303-547d-e448-9cb4-1bd30e1a05b8.png)

#Shadertoyでやること
クールなサンプルを見つけてきます。
今回はLeonさんが作成した美しい[こちら](https://www.shadertoy.com/view/XlfBR7)を使用させていただきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/738f69de-7c3a-efc1-84f9-9193625fb8b5.png)

コードの部分を全選択し、コピーします。

#Smodeで再現
Smodeの_Shaderタブ_に先ほどコピーしたコードをペーストします。
Ctrl+Enterを押します。

![スクリーンショット 2020-12-04 200627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/a52d6c65-e25f-0dae-3566-5a5ec5b27a30.png)

右下の__Play standalone__というボタンを押すと動き始めます。
おしまい。
Goで書くDDDの仕様(Specification)パターン

この記事は[ドメイン駆動設計 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ddd) 7日目の記事です。

DDDで紹介される戦術パターンの一つの仕様(Specification)パターンのGoでの実装を(自分へのメモ用と整理も兼ねて)２つ紹介します。

## interfaceを利用

DDDはJavaで紹介されることが多いのですが、１つ目はこのJavaで紹介されるインターフェースを利用したものを素直に書いたパターンです。

例で見てみましょう。

```go
// 仕様はRuleの集合で表現する
type Specification struct {
	rules []rule
}

// 検証を表すインターフェース
type rule interface {
	IsValid() bool
}

// 名前の長さのルール
type nameLengthRule struct {
	name string
}

func (n nameLengthRule) IsValid() bool {
	return len(n.name) < 20
}

// 有効な年齢のルール
type ageRangeRule struct {
	age int
}

func (a ageRangeRule) IsValid() bool {
	return 0 <= a.age && a.age < 200
}

func NewSpecification(name string, age int) Specification {
	return Specification{
		rules: []rule{
			nameLengthRule{name},
			ageRangeRule{age},
		},
	}
}

func (s Specification) Satisfied() bool {
	for _, rule := range s.rules {
		if !rule.IsValid() {
			return false
		}
	}
	return true
}
```

検証内容をruleとしてinterfaceに切り出すことで、今後検証内容が増えても既存の影響はSpecificationの生成だけになります。
ビジネスルールは比較的頻繁に変わるので、変更に強いプログラムになると言われています。
(とはいえ、このくらいの検証でやるのは過剰ですが。。)

## typeを利用

もう一つはruleの関数自体を型にしてしまうものです。

これも例をみてみましょう。

```go
type Specification struct {
	rules []rule
}

type rule func() bool

func nameLengthRule(name string) rule {
	return func() bool {
		return len(name) < 20
	}
}

func ageRangeRule(age int) rule {
	return func() bool {
		return 0 <= age && age < 200
	}
}

func NewSpecification(name string, age int) Specification {
	return Specification{
		rules: []rule{
			nameLengthRule(name),
			ageRangeRule(age),
		},
	}
}

func (s Specification) Satisfied() bool {
	for _, rule := range s.rules {
		if !rule() {
			return false
		}
	}
	return true
}

```

検証の内容は変わりませんが、structの宣言がなくなった分コードがスッキリします。
ポイントは関数の```func() bool```を型にしてしまうところです。
これによって関数宣言だけでルールが作れるので、シンプルな形になっています。

Goでは関数も型にできるので、うまく利用するとインターフェースを使うよりもシンプルな形で実装できるので、参考になれば幸いです。
ContentDocumentに関連する添付ファイルの登録と削除（初級篇）

##Salesforce内に添付ファイルや画像を登録、削除処理について、本文にて整理します。

####◆添付ファイルを保存するため、以下のオブジェクトが必要です。
[ContentDocument](https://developer.salesforce.com/docs/atlas.ja-jp.228.0.api.meta/api/sforce_api_objects_contentdocument.htm)：アップロードされたドキュメントや画像などの添付ファイル
　　　　　　　　　ただし、コンテンツ又は本文は該当オブジェクトに保存されません。
[ContentVersion](https://developer.salesforce.com/docs/atlas.ja-jp.228.0.api.meta/api/sforce_api_objects_contentversion.htm)：ドキュメントや画像の特定のバージョ情報。
　　　　　　　　該当オブジェクトにコンテンツ又は本文を保存する。
[ContentDocumentLink](https://developer.salesforce.com/docs/atlas.ja-jp.228.0.api.meta/api/sforce_api_objects_contentdocumentlink.htm)：アップロードされるファイルや画像がどのレコードに属するかは該当オブジェクトにて管理する。

※詳細の説明は公式なサイトで説明があるので、上記のリンクを参照してください。

####◆上記のオブジェクトのデータモデルは以下の通りです。
・ContentDocumentとContentVersionについて、1：N
・ContentDocumentとContentDocumentLinkについて、論理的に1：Nですが、基本は1：1でしょう。
　※1つのファイルが複数のレコードが共有される場合、1：Nですね。
・ContentDocumentLinkに「LinkedEntityId」にレコードId（例えば、Chatterデータ）が設定
される場合、アップロードされるファイルはそのレコードに紐づくことです。
![あああ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496589/6fc91f35-96a2-d745-8e2e-cffd916c3c8f.png)


####◆添付ファイルの登録
添付ファイルをsalesforceに登録する場合、通常の考えは上記の三つのオブジェクトにデータを登録すれば良いでしょう。実際にContentDocumentにデータを登録しなくて済です。ContentVersionを登録することで、ContentDocumentにデータが自動的に登録される。
つまり、添付ファイルを登録する場合、以下のオブジェクトを登録することです。
・ContentVersion
・ContentDocumentLink

```添付ファイルの登録の実装例.cls
// ①コンテンツバージョンを保存する
ContentVersion conVer = new ContentVersion();
conVer.Title = fileName;// タイトル
conVer.PathOnClient = fileName;// クライアントでのパス
conVer.VersionData = EncodingUtil.Base64Decode(fileData);// ファイル本文
conVer.IsMajorVersion = true;// メジャーバージョン
insert conVer;

// ②ContentDocumentIdを取得する
String recordId = conVerData.Id;
String query = 'SELECT ContentDocumentId FROM ContentVersion WHERE Id IN :recordId';
ContentVersion conVerNew = Database.query(query);

// ③コンテンツドキュメントリンクを保存する
ContentDocumentLink conDocLink = new ContentDocumentLink();
conDocLink.ContentDocumentId = conVerNew.ContentDocumentId;
conDocLink.LinkedEntityId = attFileData.Id; // リンクしたオブジェクトの ID
conDocLink.ShareType = 'I'; // 必須 V、C、I(詳細の意味はAPI参照)
conDocLink.Visibility = 'AllUsers'; // (他の設定値はAPI参照)
insert conDocLink;
```

####◆添付ファイルの削除
削除の場合、どうなるでしょう。
結論から言うと、登録と同じイメージです。つまり、一部のデータが自動的削除されます。
登録よりさらに簡単です。ContentDocumentLink、ContentVersionのデータが自動的に削除されます。
つまり、添付ファイルを削除する場合、ContentDocumentのみ削除して良いです。

```添付ファイルの削除の実装例.cls
// ContentDocumentを削除する
ContentDocument cd = new ContentDocument();
conVer.id = cdId;// ContentDocumentのId
delete cd;
```

##まとめ
◆Salesforce上に添付ファイルに対する操作について、以下のオブジェクトが必要です。
　　・ContentDocument
　　・ContentVersion
　　・ContentDocumentLink
◆添付ファイルを登録する場合、以下のオブジェクトに対象データを登録すれば良いです。
　　・ContentVersion
　　・ContentDocumentLink
◆添付ファイルを削除する場合、以下のオブジェクトに対象データを削除すれば良いです。
　　・ContentDocument
[VSCode] javascriptのSnippet作成

# Snippet作成
### 1.[歯車マーク]-[User Snippets]-[javascript]を選択
![スクリーンショット 2020-12-04 19.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256753/456b2448-a340-72fc-a383-9ac01a0b113c.png)

![スクリーンショット 2020-12-04 19.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256753/6990def0-f724-160f-3f53-5a72ad6a828e.png)

### 2.Snippet登録
```json
{
	"Print to console": {
		"prefix": "test",
		"body": [
			"console.log('${1|おはよう,こんにちは,こんばんは|}');",
			"$0"
		],
		"description": "Log output to console"
	}
}
```

# Snippet利用
### 1.prefixに設定した文字を入力

![スクリーンショット 2020-12-04 19.48.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256753/c91e703f-3b57-5aa5-5f2e-1959b0cd9d85.png)

![スクリーンショット 2020-12-04 19.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256753/f7a1c1f8-7d78-1406-ef60-48730532c5bc.png)

![スクリーンショット 2020-12-04 19.48.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256753/ecb1511b-b0fd-a33d-fe99-1b96c24c3044.png)

# Snippet削除
### Macの場合
```
cd ~/Library/Application\ Support/Code/User/snippets/
rm javascript.json
```