OmniAICreator/Qiita-1.07M huggingface dataset:
Uint8ClampedArrayに小数を代入すると詰まる

## 先に結論だけ

[Uint8ClampedArray](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray)に小数を代入すると、0.5以下が切り捨てられます。[複合代入演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Assignment_Operators)を利用しても同様です。

## この記事の想定する環境

この記事は以下の環境で動作することを想定しています。

 - Google Chrome 78.0.3904.108

記事を読む前に、お手元の環境をご確認ください。

## Uint8ClampedArrayとは

[Uint8ClampedArray](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray)は、8ビット符号なし整数値の配列です。JavaScriptの[Number](https://developer.mozilla.org/ja/docs/Glossary/Number)は、浮動小数点を扱いますがこの配列は0 ~ 255の整数値に値が制限されます。Uint8ClampedArrayなどの[TypedArray](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)は型付きの要素の配列です。

### どのような操作で必要となるのか

Canvas要素の[ImageDataオブジェクト](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Canvas_tutorial/Pixel_manipulation_with_canvas)が、ピクセルデータをUint8ClampedArrayで格納しています。TypedArrayは一般的に、バイナリデータをJavaScriptで操作する際のインターフェイスです。

### 小数を代入してみる

このUint8ClampedArrayに、小数を代入するとどのような振る舞いをするでしょう？情報がなかったため、Codepenで[テストコード](https://codepen.io/masatomakino/pen/wvvKxEJ)を書いてみました。

```js
const array = new Uint8ClampedArray(1);

for( let i = 1; i < 101; i++){
  const val =  1.0 - (i / 100)
  array[0] = val;
  console.log( val , array[0] )
}
```

このコードの出力は以下の通りです。

```console
0.99 1
pen.js:7 0.98 1
pen.js:7 0.97 1
...(中略)...
pen.js:7 0.51 1
pen.js:7 0.5 0
pen.js:7 0.49 0
...(中略)...
pen.js:7 0.020000000000000018 0
pen.js:7 0.010000000000000009 0
pen.js:7 0 0
```

0.5以下が切り捨て、それ以上では1に丸め込みが行われていました。四捨五入ではなく0.5で切り捨てが行われているのは意外でした。

## どんなときに困るのか

JavaScriptのNumber型は浮動小数点なので、うっかり以下のようなコードを書いてしまうとバグを生みます。

```js
array[0] *= 0.8;
```

このコードではarray[0]が2以下になると、数値がそれ以上減りません。丸め込み処理が行われるためです。例としてCanvasのピクセルを徐々に暗くしたいのに、いつまでもわずかな灰色が残ります。

```js
array[0] = ( array[0] * 0.8 ) | 0;
```
Math.floorやビット演算で明示的に小数を切り捨てると、この問題は解決します。

参考記事 : [HTML5 canvas のパフォーマンスの改善 / 浮動小数点座標の使用を控える](https://www.html5rocks.com/ja/tutorials/canvas/performance/#toc-avoid-float)

整数型を持った言語では当然問題になるコードですが、JavaScriptでも同様の注意が必要となる場合があります。
とくにCanvasを操作する場合はご注意ください。

以上、ありがとうございました。
ワイ「いちいち確認すんのメンドくない？せや、GASで半自動化したろ」



#Advent Calender 初参加！！
ALH Advent Calender  **2日目** です！
うちの会社の人(@supreme0110)　が夏頃に「やってみたーーーい！！！」という**物凄い熱量**で呼びかけていたので、流れに身を任せて参加してみました。
『もうちょい時間あるなー＾＾』と思っていましたが、そんなことはなく。

毎日の業務に追われていたらあっという間に年末ですよ。~~決してだらだらしていたわけではないぞ！！~~
今年もたくさんの反省点がありました。。。

こうも毎日忙しいと仕事に追われてしまい『明日やろーっと』が続いてしまい、今に至るわけです。
**明日やろうはバカヤロウだぞ！！良い子のみんなは真似しちゃだめだゾ★**

#本題：ところで、Gmail確認すんのメンドクない??

さてさて、前置きが長くなってしまいましたが本題に入ります。掲題の件について、背景をお話しさせて頂きます。

私が勤めているオフィスには、複数のセミナールームがあります。
研修したり、ミーティングしたり、~~ゲームしたｒ・・・おっと、誰か来たようだ~~・・・とまあ、非常に利用する頻度が高いんです。

そして、セミナールームを借りるためには申請が必要となり、上司に対してチャットでオフィス利用申請を依頼します。

・・・さてここで何となくお気づきの方もいらっしゃるかと思いますが、上司は何かと忙しいものです。
日頃の業務も忙しく、更に私たち部下の面倒も行い、そして上司の上司から何やかんや言われていることでしょう。

そんなことを考えるだけで~~頭痛が痛いですね。~~
何はともあれ「面白そうだからやってみっか」という何となーくな流れでGASを使って半自動化してみました。

# Googleフォーム申請→Gmailが上司へ→確認したら依頼者へGmailが送信される

という物を作りました。仕組みとしては、以下の通り。

1. Googleフォームから依頼者が利用申請を出した時点でGoogleスプレッドシートへ書き込まれる。
2. スプレッドシートに反映されたら、GASが動き上司のメールアドレスへ申請依頼メール(リンク付き)が送信される。（**部下→上司へのチャット不要！**）
3. メールを受け取った上司は、スプレッドシートを確認し自分の名前をプルダウンで選択→チェックボックスにチェックをいれる。
4. チェックを入れた時点で更新時間がスプレッドシートに反映され、依頼者へ確認メールが送信される。（**上司→部下へのチャット不要！！**）

ソースは[Github](https://github.com/miii22/GAS_Googleform)に置いてます。
「中で何してんの？」っていうのはコメントアウトして記載していますので、良ければご覧ください。

# まとめ

今回は、自動化について焦点を当ててみました。
自動化と聞くと、何だか難しそう・・・と思いがちでしたが意外と身近な物から簡単にすることができました。

ALH Advent Calender  **１日目** でもGASについて書かれていたので、良ければそちらの記事もご覧ください。

[GASでWebアプリ、はじめました](https://qiita.com/supreme0110/items/677df147f42a6750e604)

それでは、ここまで読んでくださりありがとうございました。
また機会があれば、ぜひ参加させていただきます！
データサイエンティストのお仕事

2年ほどデータサイエンティストとして働いたので、思ったことを徒然と。

要点としては下記2点です。

・データサイエンティストの仕事は、まずデータチェックから

・無理じゃないか、という状況から妥当な仮定を重ねて、結果を出す

 

#データサイエンティストは地道な仕事
たまに、「データサイエンティストはセクシーな仕事」そんな言葉が数年前に聞かれ、今でもデータサイエンティストを目指す学生の中には、「知的でスマートにバリューを出す仕事」のようなイメージをお持ちの方もいますが、実態はものすごく地味ですし、根気がいる仕事です。

どんな仕事でもそうですが、特に知的労働なんてものは根性の仕事です。コンサルも、投資銀行も、実態は根性論のような働き方だったりします笑（もちろん根性だけじゃできない仕事ですが、根性がないとできない仕事ということです。）

 

#データサイエンティストの根性とは。。。

データチェック、ここが特に根性がないときついフェーズです。。

実際の仕事では教科書や参考書のようにきれいなデータなんてまずないです。

欠損値があったり、月次のデータと週次のデータが混在していたり、そもそもPDFの表しかなかったり、、挙げればきりがないですが、「顧客がデータを管理できていない」という状況はザラです。まずそれはPythonなりTableauなり、日々使うツールで読み取れる形にする必要があります。

また、データも様々な粒度が混在していたり、同じデータでも期間で定義が違ったり。。（例えば売上データなら、2017年までは月次の都道府県別のデータで、2018年からは週次の市区町村別とか）

こういったデータを受領し、まず「どのようなデータなのかチェックし、顧客に疑問点を問い合わせる」この仕事から始まることがザラです。

 

#分析できなくね・・・
その結果、顧客が求めてる結果を「統計的に確からしく出すのは無理じゃないか？」ということもザラにあります。しかし、そこで「できません」なんて言っていたら仕事はありませんし、仕事である以上競合他社との戦いもある以上、何かしら仮定をおいて分析する必要があります。

「どれだけ顧客を納得させられる仮定を起き、分析条件を整えるか」この力がデータサイエンティストに求められる力の一つだと思います。データサイエンティスト協会で「ビジネス力」「データエンジニア力」「データサイエンス力」をデータサイエンティストに求められるスキルとして定義していますが（http://www.datascientist.or.jp/files/news/2014-12-10.pdf ）、この妥当な仮定には業務上必要なアウトプットを出すために妥当な仮定をおける「ビジネス力」と、分析上妥当な仮定を置ける「データサイエンス力」が主に必要になってきます。

 

#いざ分析へ
データサイエンティストらしい分析フェーズは業務に占める割合は小さかったりします。上記のような分析条件の整理が終わってしまえば、あとはコードを書いて回すだけだったりしますので。。
【Unity】 複数人開発でのTag管理

こんにちは、ZeniZeniです。

#問題
最近サークルで複数人開発を経験したんですが、そのときTagやLayerといったProjectSettingsフォルダーに入っているような設定項目の競合でかなり痛い目を見ました。
何が起こったかというと、それらの.assetフォルダはよくある.gitattributeの設定ではLFSのトラッキング対象となっており、バイナリファイルで管理されるようになります。そのため、異なるTag編集を行ったブランチをマージして、コンフリクトが発生したとき、下の画像のように両方の変更を反映させることができなくなります。
![bandicam 2019-10-24 17-06-28-167.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/1cc9893a-d6e9-1a1f-3b73-e7d8c45f97cf.jpeg)

しかしUnityプロジェクトをGitHubで管理する場合は、ほとんどの場合でGit LFSを使うと思います。そのため、Git LFSを使ったうえでProjectSettingsフォルダー内のファイルはLFSのトラッキング対象から外して、txtデータで扱う方法が望まれます。
ProjectSettingsフォルダー内のファイルで50MB超えるようなものはない…はず…

#対処法
対処法は簡単で、ディレクトリ毎にLFSの適用を変えればいいのです。[こちら](https://mseeeen.msen.jp/override-each-directorys-git-attributes/)のサイトが参考になりました。
具体的には、ProjectSettingsフォルダー内にも.gitattributesファイルを新しく作成し、そこに
```*.asset !filter !diff !merge text```
と書くだけです。
![bandicam 2019-12-01 20-24-55-267.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/c2ddae0d-9fb6-587a-4474-19c850bfd263.jpeg)


こうすれば、上の画像のようにTagなどで競合が起こった時に、両方の変更をうまく反映させることが可能になります。
Viewの制約が(結果として同じもの)を設定するときの状況別のパターン

## 動機
[Youtubeチャンネル](http://www.youtube.com/channel/UCEZIDajfDXXZtosEn9u94Ug?sub_confirmation=1)の素材用に[Tinderの模擬アプリ](https://www.youtube.com/watch?v=RaKaGPsUU9w)を作成する際、
`View`の制約を設定するとき、結果として同じものがいくつかあり
**どのパターンで制約を設定するか迷う**ことが個人的によくあります
->後になって設計や機能が詰まってきた時にあっちのパターンで制約かけておけばよかった。。。ということもしばしば。。

**今後それをなるべく無くしたいので定期的にメモがわりに残します**

## 状況と対策
#### superViewに対してViewにmarginをかける＆中心は揃える
この場合パターンとして

- **中心座標を`superView`に揃える** & Viewのwidth, heightを`superView`の**widht, height-margin**にする
- `superView`に対して**Viewの縁(leading~bottom)をmargin分縮めたもの**にする

例

```swift
girlsViewArray[$0].leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10.0).isActive = true
girlsViewArray[$0].trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -10.0).isActive = true
girlsViewArray[$0].topAnchor.constraint(equalTo: self.view.topAnchor, constant: 74.0).isActive = true
            //84.0 = 44.0(navHeight) + 20.0(statusBarHeight) + 10(margin)
girlsViewArray[$0].bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -20.0).isActive = true
```

が挙げられると思います

個人的には
- **中心座標`superView`に揃える** & `superView`の**widht, height-margin**にする
->Viewの**座標が動く時**(ex.ドラッグや大きさの変化)
- `superView`に対して**margin分縮めたもの**にする
->Viewの座標が**動かないと決まっている時**

またわかったら追記します
2019年phpカンファレンス① ~MVCとはなにか~

2019年phpカンファレンスでの『MVCとはなにか』の講演について、思ったことをまとめてみました。


# 講演資料
https://speakerdeck.com/tenjuu99/what-mvc-is?slide=2

# この講演を聞いたきっかけ
この前プライベートでLaravelを触ってみました。
会社のシステムは違うフレームワークでやっているため、結構新鮮だったとともに「model」の考え方が全然違った。

今までmodelは「いろんなところで使っている関数をまとめる場所」というイメージでした。
そのため、DB接続系の処理も書いていたが、Laravelでは書かない。みたいな記述を見つけて、「modelって何書けばいいんだろう、、、」と思っていました。

そこで、modelの概念について勉強しようと思い、この講演を聞いてみました。


# 講演を聞いて



「modelってなに、、、？」



という疑問がより深まりました（笑）

なぜそうなったかは、これからゆっくり書いていきます。


# 内容（解釈をかなり入れております）
### システム作ってよ！
大体のシステム開発はここから始まるかと思います。
「こういう不便なところがある」というニーズから、それを解決するために開発を行っていくのが通常です。
その問題を解決するためにエンジニアは、「処理で問題解決する」という手法と「動きで問題解決する」という二つの方法を取るのが一般的です。

それらを解決するために実装する。それが実装されるのが、「controller」や「view」なのかなぁと思います。


受け取ったデータに関して、こういう風に処理して、こういうデータを格納する。これがcontrollerの役割。

ここを押したら、こうなるだろうなぁというユーザビリディを考え、思った通りに動くシステムにする。これがviewの役割。


じゃあ、modelの役割は、、、？


### 個人ごとの問題
同じシステムを使っていても、持っている課題は別のものになることは多いです。
ユーザAはαという点に課題を感じていて、ユーザBはβという課題を抱える。しかもそれをそれぞれ解決しないといけない。
このような場面では、controllerやviewを使い、個別で解決してあげる必要があります。
うまく表面をチューニングしてあげることができるのもシステム運用では大事なため、その役割を持っています。


じゃあ、modelの役割は、、、？


### 問題の根本を見抜く
αという課題でも、βという課題でも、その根本にある課題は同じであることは多いです。
それを解決するのが、modelの役割かと思います。

今まではテーブルⅠしか更新してなかったけど、ユーザの要望でテーブルⅡも一緒に更新するようにする。

こういうシステムの根本に関わることを解決するのが、modelの役割になります。


# 自分が考えたmodelのあり方とは

modelとは、「システム思想の反映」だと思いました。

このシステムはなぜ作られたのか、何のためにつくられたのか。が反映しているものにすべきではないかと思いました。

modelを見るとそのシステムがなぜ作られたのか、どういう風になっていくべきなのか。が伝わるのではないでしょうか？


ユーザの問題をちゃんとキャッチアップして、その根本を見ていく、そしてそれを反映させていく
という箇所がmodelの役割かなぁと感じました。


# modelってなに、、、？
はじめに何度も書いたのですが、改めて自分の関わっているシステムを考えた時、そのシステムのmodelのあり方って難しいなぁと思いました。

システムが社会にどういう影響を与えていて、どういう風に発展していくべきか。そういうことを考えながら、組んでいく必要がある部分で、システムそのものが表現されている部分だからこそ、もっともっと深く考えるべきだなぁと思いました。


# 最後に
https://speakerdeck.com/tenjuu99/what-mvc-is?slide=2

そう思って再度資料を見ていただければ、何となーく感じ方が変わるのかなぁ、、、
今回の講演で言いたかったことを10%も吸収できてない気がするけど、とりあえず思ったことを書いてみました。
これ違うよってことがあれば是非コメントください！

# P.S.
面白いツイートがあったので追記。
https://twitter.com/Sally_42/status/1201024628581253121
Java の TreeMap で Map の値をキーの昇順にソートする

## 概要
- Map インターフェースの実装としてよく使われている HashMap クラスは順序付けを何も保証していない
- SortedMap インターフェースはキーの順序付けを提供する
- TreeMap クラスは SortedMap インターフェースを実装しているため、キーによる順序付けが行われる
- TreeMap クラスを使うとキーの昇順に自動でソートされる

## HashMap クラス

HashMap は何もソートしない。

[HashMap \(Java SE 11 & JDK 11 \)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/HashMap.html)

> このクラスはマップの順序を保証しません。特に、その順序を常に一定に保つことを保証しません。

## SortedMap インターフェース

SortedMap はキーによるソートを実現する。
entrySet、keySet、values メソッドで返されるキーや値は、キーの順序付けに従ってソートされている。

[SortedMap \(Java SE 11 & JDK 11 \)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/SortedMap.html)

> そのキーに対して全体順序付けを提供するMapです。 マップの順序付けは、キーの自然順序付けに従って行われるか、ソート・マップ構築時に通常提供されるComparatorを使って行われます。 この順序は、ソート・マップのコレクション・ビュー(entrySet、keySet、valuesメソッドによって返される)の反復処理時に反映されます。 その順序付けを利用するために、追加のオペレーションがいくつか提供されています。 (このインタフェースはマップで、SortedSetに類似しています。)

## TreeMap クラス

TreeMap は SortedMap インターフェースを実装しているため、キーによるソートが行われる。

[TreeMap \(Java SE 11 & JDK 11 \)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/TreeMap.html)

> 赤 - 黒ツリーに基づくNavigableMap実装です。 マップは、使用するコンストラクタに応じて、そのキーの自然順序付けに従って、またはマップ作成時に提供されるComparatorによってソートされます。

## サンプルコード

HashMap と TreeMap の挙動を確認するソースコード。

```java
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Sample {

  public static void main(String[] args) {

    // HashMap を構築
    // 順番は保証されない
    Map<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("0001", "Alice");
    hashMap.put("0002", "Bob");
    hashMap.put("0003", "Carol");
    hashMap.put("0004", "Dave");
    hashMap.put("0005", "Ellen");
    System.out.println("HashMap");
    for (String key : hashMap.keySet()) {
      System.out.println(key + ": " + hashMap.get(key));
    }
    System.out.println();

    // TreeMap を構築
    // キーの昇順に自動でソートしてくれる
    Map<String, String> treeMap = new TreeMap<String, String>(hashMap);
    System.out.println("TreeMap");
    for (String key : treeMap.keySet()) {
      System.out.println(key + ": " + treeMap.get(key));
    }
    System.out.println();

    // TreeMap に値を追加するとキーの昇順に自動でソートしてくれる
    treeMap.put("0000", "XXXXX");
    System.out.println("TreeMap");
    for (String key : treeMap.keySet()) {
      System.out.println(key + ": " + treeMap.get(key));
    }
    System.out.println();
  }
}
```

実行結果。
HashMap は何もソートされない。
TreeMap はキーの昇順でソートされている。

```
HashMap
0004: Dave
0005: Ellen
0002: Bob
0003: Carol
0001: Alice

TreeMap
0001: Alice
0002: Bob
0003: Carol
0004: Dave
0005: Ellen

TreeMap
0000: XXXXX
0001: Alice
0002: Bob
0003: Carol
0004: Dave
0005: Ellen
```

## 今回の環境

```
$ java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
```
Hello Worldから学ぶMind - Re:Minder 

# はじめに
ある過去の日、私はプログラム入門の本を読んでいました。
そこで目に留まったのが、**「日本語のプログラミング言語もあります」**という記述でした...。
今回は、**日本語プログラミング言語**の一つである、Mindについて、HelloWorldを魔改造しつつ紹介したいと思います。

# 注意点
- マルチバイト文字がコードに含まれるだけでぶっ壊したくなる人には、お勧めしません。
- 難しさはCとJavaの間くらいです。(本当か？)  
- ソースコードには、**ShiftJIS,またはEuc-JPしか使えません！**
- 本記事ではバージョン8を使用します。

# Mindとは(読み飛ばし可)
- 日本語プログラミング言語の中でも、MS-DOS時代から存在していた、古い言語です。
- Forthという逆ポーランド記法(動作を後に記述する)のプログラミング言語の影響を受けていて、日本語に近い書き方ができます。
- 自然言語処理は取り入れられていませんが、一見すると普通の日本語に見える様に工夫がされているので、理解が楽にできます。
- [こちら](https://www.scripts-lab.co.jp/mind8download/download.html)よりコンパイラがダウンロードできます。

# 本題
### Hello World! - 基本形 1/6
お馴染みのプログラムはこう書きます。せっかく日本語言語なので「こんにちは　世界！」を表示しましょう。 

```Mind:HelloWorld.src
メインとは
　「こんにちは　世界！」を　表示すること。
```

今言ったことをそのまま書いただけで実現できたのが分かるでしょうか？しっかり書けば可読性は高いと思います。
「メインとは」から「。」までがメイン関数定義として扱われ、実行する際これが実行されます。
### Hello World! - 送り仮名 2/6
日本語として送り仮名や助詞は一大テーマです。きっとその辺りも上手くやってくれるでしょう！

```Mind:HelloWorldSister.src
メインとは
　「こんにちは　世界！」をねっ　表示することだよっ。
```
なんと助詞や送り仮名は基本的には無視されます。(考慮に入る場合もあります)
つまりこのコードは、内部的に

```
メインとは
　「こんにちは　世界！」　表示。
```
として扱われます。一見雑に見えますが、実際コードを書く時にはとても楽になっていることが実感できます。
### Hello World! - 複数 3/6
せっかくなのでウルトラな挨拶をしましょう。

```Mind:HelloWorldUltra.src
メインとは
　「こんにちは　世界！」を　「ウルトラな　」を　表示してから　表示すること。
```
実行結果としては`ウルトラな　こんにちは　世界！`と表示されます。これは助詞を見てこのような動作をしているわけではありません。
Mindでは、内部的に「スタック」という情報の置き場所が用意され、それに情報を載せたり取り去りながら実行しています。
スタックは、**後に乗せたものが、先に取り出されます。**
その様子を見てみましょう。

1. 「こんにちは　世界！」をスタックに積みます。
2. 「ウルトラな　」をスタックに積みます。現在スタックにあるのは「こんにちは　世界！」,「ウルトラな　」です。（順番も重要です）
3. 「表示する」はスタックから一つ取り出してそれを表示します。取り出したものは**「ウルトラな　」**です。それを表示します。
4. 二つ目の「表示する」が取り出したものは「こんにちは　世界！」です。それが表示されます。

このスタックの概念はMindの日本語らしさを支えているといえるでしょう。
### Hello World! - 関数分離 4/6
HelloWorldはよく使う(?)ので関数に分離しましょう。

```Mind:HelloWorldFunction.src
挨拶とは
　「こんにちは　世界！」を　表示すること。

メインとは
　挨拶すること。
```
「～は」から「。」までが関数定義です。呼び出しをするときは、単にその名前を書くだけで実行されます！
### Hello World! - 変数 5/6
お馴染み変数です。

```Mind:HelloWorldV.src
メインとは
　挨拶文は　文字列
　挨拶文に　「こんにちは　世界！」を　入れ　挨拶文を　表示すること。
```
「～は　文字列」が文字列変数の宣言です。
「～は　変数」は整数変数の宣言です。
代入は「入れ」で行えます。だいぶ直感的ですね。ちなみに

```Mind
メインとは
　挨拶文は　文字列
　「こんにちは　世界！」を　挨拶文に　入れ　挨拶文を　表示すること。
```
でも同様です。**（どちらも日本語として正しい！）**
### Hello World! - 分岐 6/6
ヒトの身分によって挨拶の態度を替えるヒトがいるとしましょう。そんなときにこれを使いましょう！

```Mind:HelloWorldIf.src
メインとは
　ヒトの階級は　変数
　ヒトの階級に　１を　入れ
　ヒトの階級が　０に　等しい　ならば
　　「こんにちは　世界！」を　表示し
　さもなければ
　　「こんにちは　宇宙！」を　表示し
　つぎに。
```
「ならば　～　つぎに」が分岐です。「ならば」はスタックからデータを１つ取り出します。(Basic等に見られる「if - endif」に近いですね。)
勘のいいヒトなら次のように書けることに気づいたかもしれません。

```Mind
メインとは
　ヒトの階級は　変数
　ヒトの階級に　１を　入れ
　ヒトの階級が　０に　等しい　ならば
　　「こんにちは　世界！」を
　さもなければ
　　「こんにちは　宇宙！」を
　つぎに
　表示すること。
```
これも問題なく実行されます。他の言語から見れば違和感を感じる表記ではあります。**（しかし日本語として正しい！）**
これこそスタックのお陰ですね。

# 終わりに
Mindは論理的にソースが構築されつつも、かなり**日本語として直感的な書き方**ができる言語です！ぜひ体験してみてください！
AutoLayoutをコードで指定する際の注意点(NSLayoutAnchor)[Swift]

[Youtubeチャンネル](http://www.youtube.com/channel/UCEZIDajfDXXZtosEn9u94Ug?sub_confirmation=1)の素材用に[Tinderの模擬アプリ](https://www.youtube.com/watch?v=RaKaGPsUU9w)を作成する際、
シンプルだけど長い時間はまってしまったのでメモ。

## 状況
Viewの制約といっても色々あるが、今回ハマったのは**Viewの縁を設定する制約。**
(図のように`ViewController`の縁に対して**上下左右10pxずつのmarginを設定**して配置したい、という感じ。)
<img width="375" alt="girlsView-ex.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/9517c256-fdef-7d77-0297-c04d535d56e9.jpeg">
`Storyboard`での配置だとcustomViewだろうが標準Viewだろうが縁の制約は`Add New Constraints`で
こんな感じで10をひたすら入れていけばできてしまうが
![スクリーンショット 2019-12-01 19.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/6c5a2f32-7b1c-da52-e54c-dc93324923e0.png)
`NSLayoutAnchor`を使ってコードで設定したとき同じ容量でこんな感じでやったら

```swift
girlsViewArray[$0].leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10.0).isActive = true
girlsViewArray[$0].trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 10.0).isActive = true
girlsViewArray[$0].topAnchor.constraint(equalTo: self.view.topAnchor, constant: 10.0).isActive = true
girlsViewArray[$0].bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 10.0).isActive = true
```

**`View`が`ViewController`からはみ出してしまった**

## 対策
`NSLayoutAnchor`の`constant`は**CGFloatの座標系(x: 右に行くほど増える, y: 下)**かつ**`equalTo`で設定した縁からの距離**である
->`Add New Constraints`はプラスの数値を入れれば選択したViewの`superView`に対してスペースを作る(縮める)方向に勝手に制約を設定してくれる
以上を理解した上で修正した制約がこう(上下左右ViewControllerのViewに対して10pxずつマージンを持たせたい場合)
->`trailingAnchor`は**左に詰めたいので`constant`を-10.0に**する必要がある
->`bottomAnchor`は**上に詰めたいので`constant`を-10.0に**する必要がある


```swift
girlsViewArray[$0].leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10.0).isActive = true
girlsViewArray[$0].trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -10.0).isActive = true
girlsViewArray[$0].topAnchor.constraint(equalTo: self.view.topAnchor, constant: 74.0).isActive = true
//84.0 = 44.0(navHeight) + 20.0(statusBarHeight) + 10(margin)
girlsViewArray[$0].bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -10.0).isActive = true
自己紹介

はじめまして。

記事を書いている時点で34歳の情シス担当者です。

キャリアとしては金融情シス→メーカー情シスで保守・運用メインたまに開発担当という、ＳＥを名乗ったらSierや開発系の社員の方々に鼻で笑われそうな経歴です。
ＡＳ４００、ＣＯＢＯＬ、ＶＢＡという古の魔術師のようなスキルセットですが、Ｏｆｆｉｃｅ関連の操作ひと通りや、メモリ増設やＨＤＤ・ＳＤ換装といった機器周り、内部統制絡みでサーバー立てる際のセキュリティチェックやったりでネットワーク関連の知識もそれなりにあるという、会社にいれば一応役には立つかなーという情シス担当です。

会社の経営的には安定してるのですが、いかんせん買収された経緯があるので親会社と統合になったときに余剰人員としてクビになる可能性を考えて、今さらながらＷｅｂ開発を学ぼうと思った次第です。

また、年齢が年齢なのでプロマネ等の高度資格試験を併行して学習していきたいと思っています。

日記と言わないまでも、みなさまのお役に立てるよう備忘録として記事にしていきたいと思います。
よろしくお願いいたします。
プログラミング初心者（中学生）作ったアルゴリズムを最適化する

# 数学パズル
Python勉強中のK君[数学パズル](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E8%84%B3%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E9%AB%98%E9%80%9F%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B70%E5%95%8F-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/479814245X/ref=asc_df_479814245X/?tag=jpgo-22&linkCode=df0&hvadid=295723231663&hvpos=1o1&hvnetw=g&hvrand=6299120856193524254&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009242&hvtargid=pla-526233948639&psc=1&th=1&psc=1)
を持ってきて、これやってみる。と言い出した。

どんな問題かというと10進数、2進数、8進数のいずれでも回文数（12321のような数）で10以上で最小の値を求めるというもの。

皆さんも突っ込みどころ見つけて見てください。

```python

D = list()
E = list()
F = list()
def checker(num):
    a = str(num)
    b = list(reversed(a))
    c = len(b)
    for j in range(c//2):
        if b[j] != b[-j-1]:
            return None
    return num

for i in range(10,1000):
    d = checker(i)
    if d != None:
        D.append(d)

for i in D:
    e = checker(str(oct(i))[2:])
    if e != None:
        E.append(int(e,8))

for i in E:
    f = checker(str(bin(i))[2:])
    if f != None:
        F.append(int(f,2))
print(F)
```

正解も求まっているのでGood Jobです。

１パスではなくて、まず1000までの10進数の回文数を調べて、見つかった回文数に対して、8進数、2進数でどうかチェックしていく方式。
いろいろ思考錯誤して、付けたししながら作ったんだろうなぁ。

# K君のリファクタリングバージョン

でも１パスでできる事に気づいたK君直してきました。

```python
number = 10
result_list = []
def checker(num):
    a = list(reversed(str(num)))
    for j in range(len(a)//2):
        if a[j] != a[-j-1]:
            return None
    return num  
                     
while True:
    if checker(number) != None and checker(str(oct(number))[2:]) != None and checker(str(bin(number))[2:]) != None:
        result_list.append(number)
        print(number)
        break
    else:
        number += 1
```

これはかなり素直な流れ

# 料理開始

2進数、8進数の文字列に直す方法はいろいろあり、K君の方法でも問題ないと思いますが、`"{:o}".format(number)`こんな方法に変えてみました。
ここは、どちらの方法がよいというレベルではないと思います。

一番、不思議なのは、checker関数の戻り値。単純に回文数かどうかを調べるという関数だとしたら、True/Falseを返せばいいと思うんだけどねぇ。

回文かしらべるのに、逆順にした文字を求めようとた名残の`reversed(str(num))` 結果的には、これいらないんじゃない？

その当たりをザックリ直してみました。

```python
def checker(num_str):
    for j in range(len(num_str)//2):
        if num_str[j] != num_str[-j-1]:
            return False
    return True
                     
number = 10
while True:
    if (checker(str(number)) and 
        checker( "{:o}".format(number)) and
        checker( "{:b}".format(number))) :
        print(number)
        break
    number += 1
```

コメントいただいたプログラムがもっとシンプルでわかりやすかったので、追加します

```python
from itertools import count

def is_palindrome(text):
    return text == text[::-1]

for number in count(10):
    if (is_palindrome(f"{number}")
    and is_palindrome(f"{number:o}")
    and is_palindrome(f"{number:b}")):
        print(number)
        break
```
Pythonでカラーフィルムを再現してみる

##作りたいもの
今回作成しようと考えているのは，カメラに取り付けるような画像全体の色調を変えるフィルムです．Numpyモジュールを使えば3簡単に原色のフィルムを作れるのですが，汎用性を高めて全部の色に対応させようと考えました．

###元画像
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486136/0e8e82fe-5c8f-6282-d0b1-a9dc1f07f20e.jpeg)


##完成品
```python
from PIL import Image
import numpy as np

def color_filter(img_source, rgb):
    #実数配列に変換
    img_source=np.array(img_source, dtype='float16')
        
    #フィルムRGBは0~255
    if max(rgb)>255 or min(rgb)<0:
        return Image.fromarray(np.unit8(img_source))
    
    #RGBフィルムを適用
    img_source[:,:,0]*=rgb[0]/255
    img_source[:,:,1]*=rgb[1]/255
    img_source[:,:,2]*=rgb[2]/255
            
    #Imageクラスに変換後出力
    img_out=Image.fromarray(np.uint8(img_source))
    return img_out
```

##仕組み
各ピクセルのRGBの値にフィルムのRGBの255(RGB最大値)に対する割合を掛けています．
色の範囲は元の画像から真っ黒まで変更可能です．真っ黒の時のフィルムは要は壁ですね．

##実行結果
フィルムカラー:RGB(100,255,100)
![sample_out2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486136/42187113-9583-92a2-1a76-97f7041ffbd3.jpeg)
フィルムカラー:RGB(173,216,230)
![sample_out2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486136/254bca69-3982-43d6-9896-37a7c9e3cdbc.jpeg)

##失敗作
割合ではなく，フィルタの値との平均をとれば行けるかもと初めに思ったのでその結果も載せておきます．壁が再現できなかったので失敗作といたします．

```python
from PIL import Image
import numpy as np

def color_filter2(img_source, rgb):
    img_source=np.array(img_source, dtype="float16")
        
    #フィルムRGBは0~255
    if max(rgb)>255 or min(rgb)<0:
        return Image.fromarray(np.unit8(img_source))
    
    #RGBフィルムを適用
    img_source[:,:,0]+=rgb[0]
    img_source[:,:,0]/=2.0
    img_source[:,:,1]+=rgb[1]
    img_source[:,:,1]/=2.0
    img_source[:,:,2]+=rgb[2]
    img_source[:,:,2]/=2.0
    
            
    #Imageクラスに変換後出力
    return Image.fromarray(np.uint8(img_source))
```

##実行結果
フィルムカラー:RGB(100,255,100)
![sample_out2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486136/6f88f864-7f42-d137-6e69-c4dd16898329.jpeg)
フィルムカラー:RGB(173,216,230)
![sample_out2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486136/ec829612-95f8-de92-b687-54d041db06dc.jpeg)
壁:RGB(0,0,0)
![sample_out2-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486136/b72378f1-76a3-3479-45eb-7f18dd611f1b.jpeg)
やはり全体的に白みがかってますね．

##まとめ
どちらとも需要はあると思うので，色々とお試しください．画像認識のデータ水増しにでも使用していただけると嬉しいです．
(追記)なぜかスライス記法を忘れていた時のコードを貼っていました... 現在貼っているのはより軽量化されたものです．
3Dモデルの頂点座標にオブジェクトを配置するときは重複に注意しよう

Three.js Advent Calendar 2019 2日目
最近、Threejs触っていてちょっとツマったとき、ググっても日本語の記事は見かけなかったのでメモとして残します。

---

#### やりたかったこと

3D空間上の任意の位置にオブジェクトをたくさん置きたい
↓
jsで実装して、最終的な見え方をその都度確認するのはめんどくさい
↓
DCCツール上で見栄えを確認しながら配置してもらい、それをMeshとかにしてfbxとかで書き出し、頂点座標を取得して配置すれば良いんじゃね。

こんな流れでした。

---

#### ツマったこと

頂点座標自体は [BufferGeometry](https://threejs.org/docs/#api/en/core/BufferGeometry) 経由で簡単に取得できます。

```
geometry.attributes.position.array //頂点座標が配列に格納されている
```

簡単な例として、Blenderから書き出した平面四角(Plane)のfbxデータの頂点座標を上記のように取得して、各座標に半透明のCubeを配置してみました。

![4181547da3f2b1250a9858660741addb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6541/0a8d7e9d-0cf8-0c03-55c5-8e230a217443.png)

実際に動作するサンプルはこちら↓
[http://393.bz/threejs/sample/webgl_loader_fbx_not_merge.html](http://393.bz/threejs/sample/webgl_loader_fbx_not_merge.html)

右上と左下のCubeの色が濃くなっているのが確認できると思います。
これはPlaneを構成してる頂点は一見4点と思いきや、実際は6点であり、右上と左下が重複しているせいです。
(このPlaneは、上図の緑色の線で構成された三角ポリゴンとピンク色の線で構成された三角ポリゴンで作られていたためです)

---

#### 解決方法

座標が全く一緒な頂点を除外すればよいだけなので、自力で実装しても良いのですが、きっとすでにイイ感じの実装がすでにあるはず、、、とググりまくってるとちゃんと公式にありました。

[BufferGeometryUtils.mergeVertices](https://threejs.org/docs/#examples/en/utils/BufferGeometryUtils.mergeVertices)

```
// geometryを引数で渡すと、重複した頂点を除外したgeomeryを返してくれる
const mergeGeometry = BufferGeometryUtils.mergeVertices(child.geometry);
```

重複した頂点を除外したgeometryから頂点情報を取得して半透明のCubeを配置する

![b9e445ee5edeb9678b16b272d476f070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6541/2dec069b-8d7f-e636-d262-5055ccd1b278.png)

実際に動作するサンプルはこちら↓
[http://393.bz/threejs/sample/webgl_loader_fbx_merge.html](http://393.bz/threejs/sample/webgl_loader_fbx_merge.html)

重複したメッシュが消えました。

#### まとめ

半透明で配置することなんてあんまりないと思うので重複してることに気づかないことも多く、気づかないなら問題ないような気がしますが、今回気づいたのは、半透明かつ、Blendingを加算にしたら、特定のオブジェクトだけやけに白くなってしまったので気づくことができました。
Zephyr > west flashする時に使われる/dev/ttyACM0の定義場所 > scripts/west_commands/runners/bossac.py

```txt:動作環境
Ubuntu 18.04 LTS
Adafruit Trinket M0 (以下、Trinket)
Zephyr 2.1.0-rc1
```

### デバッガ用の接続?

Trinketにソフトを流し込もうとしているが成功していない。

下記の記載にも不明点がある。

https://docs.zephyrproject.org/latest/boards/arm/adafruit_trinket_m0/doc/index.html

> Flashing
> ...
> 2. Connect the Trinket M0 to your host computer using USB
> 3. Connect a 3.3 V USB to serial adapter to the board and to the host. See the Serial Port section above for the board’s pin connections.

2で接続するデバイスは `/dev/ttyACM0`になる。
3で接続するデバイスはシリアルアダプタのICによって変わるだろう。自分が使うakafuguのFTDIの場合、`/dev/ttyUSB0`になった。

### /dev/ttyACM0の定義

west flash時に使うデバイスは/dev/ttyACM0になるようだ。
その定義を探した。

`scripts/west_commands/runners/bossac.py `に下記の記載があった。

```scripts/west_commands/runners/bossac.py 
import platform

from runners.core import ZephyrBinaryRunner, RunnerCaps

DEFAULT_BOSSAC_PORT = '/dev/ttyACM0'

...
```
Flask-Migrateでflask db upgradeが終わらない

## 概要
Flask-Migrateを使用して`flask db upgrade`を実行した際に下記のコンソール出力がされたまま処理が詰まってしまった場合の解決方法を説明します。
この状況だとCtrl+Cで処理を抜けることもできず、ターミナルを閉じてもDBスキーマの変更は反映されないままです。

```terminal
 $ flask db upgrade
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade 576e5f4a0fe7 -> 2b28fe44cc94, empty message
```

原因は、おそらく処理が詰まっていることなので原因となるプロセスを強制終了します。
だいたい同じですが４パターン解決方法を紹介します。2~4については未検証なので、もしかしたら解決できないかもしれないです。

## 方法1（ターミナルからプロセスを強制終了する）
ターミナル上で該当のプロセスを強制終了します。
`ps`コマンドを実行すると実行中のプロセス一覧が表示されるので、その中から該当のプロセスを見つけ`kill`コマンドで強制終了することができます。

```shell
## postgresが実行しているプロセスを調べる
ps aux | grep postgres
## 該当のプロセスを終了する
kill <<プロセスID>> # ex) kill 12345
```

## 方法2（PostgreSQLからプロセスを終了する）
postgres上で行います。
この方法だとプロセスを終了できない場合があります。

```sql
## ロックされている処理を調べます
SELECT * FROM pg_locks;  # pidのカラムにある数字がプロセスIDです

## プロセスを終了します
SELECT pg_cancel_backend(プロセスID);
```

## 方法3（postgresqlを再起動する）
※未検証
postgresqlを再起動すればプロセスも終了されるはず。

## 方法4（端末を再起動する）
※未検証
方法３とほぼ同じです。端末自体を再起動すればプロセスも終了されるはずです。
[Rust] cargo オフラインモードでビルドする

この記事は Rustその3 Advent Calendar 2019 12/2 の記事です. カレンダーの枠が余っていたので下書きから放流します.

# `cargo --offline`

外部クレートに依存するプロジェクトの初回ビルド時 (つまり `Cargo.lock` が存在しないとき), cargo は自動的にインターネットにアクセスし, 依存クレートの情報を集めてきます. しかしながら, 例えば飛行機や新幹線で移動中だったりしてインターネットに接続できない/接続が不安定という状況では, インターネットアクセスできずビルドが失敗することがあります. このような状況では `--offline` オプションを設定すれば問題が解決します.

`cargo build --offline` はインターネットアクセスをせず, ローカルにキャッシュされた情報だけでビルドを行います. 従って過去に依存したことのあるクレートだけに依存する新しいプロジェクトならばオフライン環境でも初回ビルドが可能になります. ただし次の点に留意する必要があります.

- ローカルにキャッシュされていないクレート (またはその特定のバージョン) に依存しているとビルドに失敗します.
- インターネット上に依存クレートの最新版が既に公開されていたとしても, ローカルキャッシュを持つ版を用いてビルドします. このため, オフラインモードが有効なときとそうでないときとでビルド結果が違うことがあります.

この機能は [Rust 1.36 で安定化されました](https://blog.rust-lang.org/2019/07/04/Rust-1.36.0.html).


# 参考文献

- [build - The Cargo Book](https://doc.rust-lang.org/cargo/commands/cargo-build.html)
- [Cargo `--offline` ✈️](https://www.ncameron.org/blog/cargo-offline/)
JSとCSSをIndexedDBにキャッシュして3分でWebアプリを爆速に

JavaScriptファイルとCSSファイルをIndexedDBにキャッシュして初回アクセス以降のHTTPロードを削減します。

SPA、プリレンダーした静的ページ群など、なんでも高速化。

## before

``` index.html
<html>
<head>
    <script src="./index.js"></script>
    <link rel="stylesheet" href="./index.css"></link>
    <script>
        window.onload = function(){ 
            doit();
        };
    </script>
</head>
<body id="root">
</body>
</html>
``` 

``` index.js 
var doit = function(){
    document.getElementById('root').innerHTML = '<h1 class="cosme">Hello World!</h1>';
};
``` 

``` index.css
.cosme {
    color: red;
}
```

## after

``` index.html
<html>
<head>
    <script src="https://unpkg.com/@craftkit/craft-bootloader/dist/craft-bootloader.min.js"></script>
    <script>
        window.bootConfig = {
            library : [
                { uri:'./index.js',  version:'1.0.0' },
                { uri:'./index.css', version:'1.0.0' },
            ],
            onProgress : function(lib){
                console.log( lib.uri + ' was loaded' );
            },
            onLibrayLoaded : function(){
                doit();
            }
        };
    </script>
</head>
<body id="root">
</body>
</html>
``` 

## about

before → after という感じに `library` にリソースを設定。全部読み込まれると `onLibrayLoaded` が呼ばれます。

`library` に定義されるリソースエントリーの `uri` をキーにして、`version` を管理するオブジェクトストアと実体を管理するオブジェクトストアが IndexedDB に作成され、`version` が変更されると IndexedDB の実体キャッシュもアップデート。エントリーが `library` から削除されれば次回チェック時に IndexedDB からも削除されます。

上の例示では unpkg.com から読み込んでいますが、5KB程のライブラリなので `<head>` に直接埋め込めば１セッションでロードが完了します。

コードキャッシュは同期的に動いて簡単に使える `localStorage` に入れることが多いですが、SPAはサイズも大きくなりがちでついつい10MBを超えてしまうことも。AppCacheはもっと小さいですし各リソースの明示的なコントロールも効かせにくい。

そんなときは IndexedDB に入れてしまえば大体解決ということで書いてみました。副産物として各リソースが読まれたことをイベントで判定することも可能に。

古いアプリケーションの高速化などにも使えると思います。また、ロード時に IndexedDB へのアクセスモジュールが  `window.bootConfig.Context.libStore` に設定されるので、`libStore#put` / `libStore#get` でアプリケーション内からもキャッシュシステムとして利用可能かも知れません。

コードはこちら:
https://github.com/craftkit/craft-bootloader

枯れてないコードなのでバグがあればPR頂けると嬉しいです。
VCIで親子関係っぽい振る舞いをさせてみる（位置と回転

#概要
https://qiita.com/120byte/private/b9e5a50db09bcdf9c9c0
があんまりだったので、もう一つ案を考えてみました。

#動作
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/OTUgTwNPCw">pic.twitter.com/OTUgTwNPCw</a></p>&mdash; 120 (@120byte) <a href="https://twitter.com/120byte/status/1201083812471402496?ref_src=twsrc%5Etfw">December 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286581/6454acd9-b95d-d55c-dbc5-5ed4608d6437.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286581/04591b6d-072f-7296-98b0-9fdb7c2e9778.png)※CubeA～Bは同じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286581/c3267c50-e4f3-5f3f-666f-504aff1aab86.png)※Cube1～3は同じ

```lua
local current = ""

function updateAll()
    SetTransform("CubeA", "Cube1")
    SetTransform("CubeB", "Cube2")
    SetTransform("CubeC", "Cube3")
end

function SetTransform(targetName, markerName)
    local target = vci.assets.GetSubItem(targetName)
    local marker = vci.assets.GetSubItem(markerName)
    if current == markerName then
        target.SetPosition(marker.GetPosition())
        target.SetRotation(marker.GetRotation())
    else
        marker.SetPosition(target.GetPosition())
        marker.SetRotation(target.GetRotation())
    end
end

function onGrab(target)
    current = target
end

function onUngrab(target)
    current = ""
end

```

#捕捉
親子関係を持つオブジェクトと、掴んで操作するためのオブジェクトを分けて作ります。親子関係を持つオブジェクトはVCISubItemを付けていません。掴んで操作するオブジェクトを掴んでいるかどうかで、親子オブジェクトと掴みオブジェクト間の位置と回転の取得と設定を入れ替えます。

#蛇足
大きさはlocalしかないため一癖あり、用途的にも思い浮かばなかったので諦めてしまいました。（親子関係の大きさから計算すれば合うかな……？
[Unity] ComputeShaderとRenderTextureの連携について

# はじめに
RenderTextureに座標情報、速度などその他様々なデータを詰めてComputeShaderで計算を行い、その結果をCPU側で受け取りたいということは多くあると思います．このようなことを実現するためには読み込み可能かつ、書き込み可能なRenderTexture(以後RWTextureという)を用意してデータをそこに詰め込んでいくことが一番楽でしょう．(読み込み用,書き込み用とTextureを分けるのはめんどくさいので．．)
しかしUnityではただRenderTextureを生成してそのデータを送信するだけではRWTextureとしてComputeShaderで処理することが出来ないのでそのことについて記述していきます．

# ComputeBufferつかえばよくない？
もちろんその通りです．ComputeBufferを使用して**RWStructuredBuffer**としてComputeShader内で扱うのが一番楽でしょう．自分的にはRenderTextureをCPUとComputeShaderの間での架け橋にしたい時はちゃんとデータが処理されているか確認したい時です．つまりどういうことかというと、`UnityではCanvas/RawImage`や`GUI.DrawTexture`などでGameView上へTextureの描画をすることができるのプレビューとしてもRenderTextureを使うことができるということです．

こんな感じでこの例ではAnimation中のモデルの頂点座標と法線方向
![bandicam 2019-10-09 20-03-16-040.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184790/faaca59e-b33a-6fcc-293c-8cc34e5ad219.gif)


# UnorderedAccessView(UAV）とは
任意の場所にアクセスが出来るTextureのView(フォーマット)のことです．このことは「出力リソースの任意の位置に書き込み可能」ということと等しい意味を持ちます．つまりRWTextureとしてComputeShaderで処理するためにはCPU側でTextureを生成する時にこの設定をしてあげないといけないということです．
また補足とし読み込みしか行えないViewを**ShaderResourceView(SRV)**といいます．

# スクリプト
RenderTextureをComputeShaderへ送信して**RWTexture**としてComputeShaderで受け取る場合(UAVとしてTextureを扱う)は` enableRandomWrite = true`とする必要がある．

```dispatch.cs
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 public class dispatch : MonoBehaviour
 {
     [SerializeField] RenderTexture buffer;
     [SerializeField] ComputeShader cs;
     int kernel;
     void Start()
     {
         buffer.Release();
         buffer.enableRandomWrite = true;
         kernel = cs.FindKernel("calc");
         cs.SetTexture(kernel, "buffer", buffer);
     }
 
     void Update()
     {
         cs.SetFloat("time", Time.realtimeSinceStartup);
         uint x, y, z;
         cs.GetKernelThreadGroupSizes(kernel, out x, out y, out z);
         cs.Dispatch(kernel, 1, 1, 1);
     }
 }
```

```cs.hlsl
 #pragma kernel calc
 RWTexture2D<float4> buffer;
 float time;
 
 [numthreads(64,1,1)]
 void calc (uint id : SV_DispatchThreadID)
 {
     float c = frac(time/10.0+float(id/100.0));
     buffer[float2(id, 0.5)] = float4(c, 0.0, 0.0, 1.0);
 }
```
以上のようなコードを使えばuvの座標に応じてグラデーションのようにBufferの中の情報が更新されていくことがわかるかと思います．

# まとめ
ComputeShaderで**RWTexture**を使いたいならTextureをUAVにする(`enableRandomWrite = true`)

# 参考
- https://docs.microsoft.com/ja-jp/windows/uwp/graphics-concepts/views
「何が分からないか分からない」の例え話と対処法

#結論から言う

新卒入社や転職最初、新しい分野に挑戦したり、新しいスポーツを始める時にありがちな「何が分からないか分からない状態」

何が分からないか分からない状態
は単語知識の不足が原因。
解決するには単語にさらされることが必要。
分からない単語は調べること。
外国語と一緒。

調べる習慣をつけさせるのが先輩のやるべきこと。
調べ方を身に着けるのが後輩のやるべきこと。


#receive an inspiration from ...

共感するところ多くて記事にしたくなりました。

[「何がわからないのかわからない」は何がわからないのか](https://qiita.com/K_Noko_224/items/745ecc0b604fd71177df)

[何が分からないのか分からないという思考停止 あるいは教える側の教わる側に対する立ち位置](https://qiita.com/numa08/items/18e5866f1e09c141c4f5)

ただ私の立ち位置というか、考え方はこれら記事と違う部分もあるのでその話をしていこうかと思います。

#私が「何が分からないか分からなかった」時の話

PythonやRを初プログラミング言語として触れて、独学でインストールした時期を思い出しました。
人生で一回もプログラミング言語なんてやっていませんでした。
正確には大学の一般情報の授業で数回プログラミング(matlab)の講義はあったのですが、授業中は内職をして先輩のスクリプトをそのまま提出して乗り切りました。
プログラミングなんて目が悪くなりそうだし、姿勢悪くなりそうだし、ITドカタみたいなイメージがあって進路にはしないだろうとさえ思っていました。
~~(ドラゴンのメイドが来るならプログラマも悪くないけど・・・)~~

まわりに「パソコン」に詳しい人はいる。
しかし言語に関してはCとjavaしかわかる人が居ない。

何が問題か分からない
どうしたらいいか分からない
誰か助けて！

でも、他言語でも使っている人を呼んで画面を見てもらうと、エラーはたちまち解決してしまうんですよね。

#私とその人の何が違うのか

何が違うのかと私自身分析した結果、「何がわからないのか分からない状態」というのは、「フランス語が分からないのにフランス人に話しかけられている状態」なのではないかと。

![kanban_gaikokujin_question.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/e6ffb948-5e50-10d7-f398-c7b06297527c.png)

プログラミング言語は初めてです。
プログラミング言語というものに慣れていないし、構造も全く分かっていない。
パソコンにも詳しいわけではなく、プログラミング言語とパソコンの中の関係も分かっていない。
ディレクトリ？パス？メモリ？オーデービーシー？
なにそれ状態

#初めては「プログラミング言語」だけでなく「業務」でも同じ

会社に入ると先輩から「今のとこまで大丈夫？」とか「あと任せてokay?」とか言われるのですが、
まず言語が通じてないから理解できないわけで。

どうしたらいいかというと、フランス語と同じく**まず単語を理解する**。
一つの文に二つのわからない単語があったら理解できない、と言われるのでボキャブラリーを付けるべきです。

#解決方法：先輩のあるべき姿

業務の話なら業務内容の飛び交う会議に出て、議事録つけて分からない単語を全て調べて、社内用語は聞く！！！
エンジニア的な分からない状態も同じで
「Not exist Path」ってなんや？と思ったら一単語ずつ調べる！

(先輩は質問しやすい空気とフォローをちゃんと行う！ググれば？とかマネジメント放棄はよっぽど丸投げ質問でなければ言わない！！先輩は調べる習慣をつけさせてあげる！ググれば？じゃなくてググってる姿を見せるのが先輩のあるべき姿)


#解決方法：後輩のあるべき姿

初プログラミング言語で慣れない黒画面でズラズラとエラー見たときは絶望でした。
エラーを全文検索エンジンに張り付けてもエラー引っ掛からない。
そもそもどこからエラー文なのか分からない！

そういうときは「python インストール　tensorflow かたまる」とかやったことをとにかく組み合わせて調べる！

ぐーぐる様は雑な検索ワードでも答えにたどり着くよう、日々検索アルゴリズムや推奨機能を考えてくださってるので頼りましょう！
誰かの同じようなブログがでてきます。

エンジニアになって最初は**調べる習慣がなかった**のでここにたどり着くのに時間かかりました。
(ググってくれた先輩の検索方法とかを見て、エラー文の中で全文ではなく特定の部分をコピーして調べている姿を見る。どんな判断基準でエラー文から原因を特定しているのかを学ぶのが後輩のあるべき姿。)

最初は
まさか自分と同じことやってる人がブログとかに対処方法書いてないやろ～
とか思ってた。
意外と細かいマイナーな事でもブログにあげてるひとがいる。
感謝～！


#まとめると

「何が分からないか分からない状態」
は飛び交う単語の知識が不足していて頭がそもそも話を受け入れていない状態。
外国語だって一発目で法則性を理解するのは無理だし、単語の意味を知るのも無理。

先輩の話している打ち合わせ内容やプログラミング言語のエラーは翻訳してもらわないと分からない。

なので「単語を知ること」が一番最初にやるべきこと。
先輩はすべて翻訳していては時間が足りない。
かといって「ググレ」は暴論。
なので単語の調べ方を教えてあげる。
ググリ方を教えてあげる・ググル習慣をつけてあげる。

後輩は先輩の行動を丸々見学して行動パターンから解決方法を知る。
「何が分からないか分からない状態」には、ひたすらinputを頑張る。
質問する前にはいったん自分の中で調べることを試してみる。

自分なりに感じてきて、困って、頑張って仕事に慣れてきた時の事を思い出して書きました。

あとは質問の質についてはQiitaにいい記事があるので参照ください。

[新卒からの質問をソシャゲっぽい仕組みにしたら捗った話](https://qiita.com/ysktsuna/items/fced3a9515c8f585ca50)

[新人研修で質問スタミナ制を導入してみた](https://qiita.com/takkii1010/items/b491eee6b835a3b4a99d)
Fortranの参照渡しについて理解するために【初学者向け】

Fortran Advent Calendar 2019です。よろしくお願いします。

##はじめに
Fortranを書いている人は、もともとプログラミングを学んでいた訳ではなく、数値計算のために（必要に迫られて）始めた方が多数かと思いますので、**プログラミングの難しいことはよく分からん！ポインタ？参照渡し？？**となる方も多いと思います（私含め）。
そこで、初学者の理解の助けになればとよいなと思い、参照渡しについての簡単なテストプログラムを紹介します。
なお、かなり怪しげで**本来は書いてはいけない**プログラムを書いていますが、わかりやすさ重視（？）ということでご愛嬌ください（備考１参照）。

##かつての自分がよく分かっていなかった点（テストプログラムを作ったきっかけ）
Fortranでプログラムを書いていた時に、ふと思ったのが
「subroutineの引数になる配列って、コピーされてたらメモリやばいよな、、、」
ってことです。
当時は何となく、

- 元プログラムの配列をコピー → サブルーチンに渡す → サブルーチン内で配列の値が変わる → コピー → 元プログラムに返す

って動きを前提にしていた（というよりも、何も考えていなかった）のですが、よくよく考えるとサイズの大きな配列とかを引き渡すのにそんな大変なことができるか！という感じですね。

##というわけで、簡単なプログラムでテスト
下記のプログラムをコンパイルし、実行した出力文からの推察しました。なお、gfortranにてコンパイルオプションなしで実行しました（ifortなどでどうなるかは未検証）。

```Fortran
program main

    implicit none

    integer,allocatable :: vec(:)
    integer,allocatable :: mat(:,:)

    !
    !　テスト１
    allocate( vec(5) )
    vec(:) = [1,2,3,4,5]

    print *, "t1-1:", vec

    call sub1( vec(1:3) )

    print *, "t1-3:", vec

    !
    !　テスト２
    allocate( mat(3,2) )

    call sub2( mat(:1,1) )

    print *, "t2-1:", mat(:,1)
    print *, "t2-2:", mat(:,2)

    contains
    !
    subroutine sub1( x )

        implicit none

        integer, intent(inout) :: x(:)

        x(4) = 10

        print *, "t1-2:", x

    end subroutine sub1
    !
    !
    subroutine sub2( x )

        implicit none

        integer, intent(inout) :: x(:)

        x(:) = [1,2,3,4,5,6]

    end subroutine sub2
    !
end program main

```
### test1：サブルーチン内で配列の範囲外の位置にアクセスしてみる
テスト１は
1. main文中で要素数5の配列としてvec=[1,2,3,4,5]を定義
2. vecを出力(t1-1)
3. sub1にvec(1:3)(=[1,2,3])を引き渡す
4. sub1中で添え字4の値を10に変更する（ついでに配列を出力：t1-2）
5. vecを出力(t1-3)
という流れです。テスト１の結果は次の通り

```bash
 t1-1:           1           2           3           4           5
 t1-2:           1           2           3
 t1-3:           1           2           3          10           5
```
sub1には[1,2,3]を引き渡していたつもりですが、範囲外の添え字4の値が変更されました。
一体なにが起きているのかというと、sub1には配列をコピーして引き渡しているわけではなく、**配列の先頭がメモリ上でどの位置にいるのか、という情報が渡されて**います。これが引数の**”参照渡し”**になります。
サブルーチン中では、配列の値を直接扱うのではなく、配列の先頭位置からの相対的な位置をもとに配列操作を行います（私の説明力ではこれが限界です、、、）。
ですので、今回は本来は渡していないはずの配列の外の値を変更できた、というわけです。

### test2：二次元配列を参照してみる
テスト2は
1. main文中で3x2の二次元配列matをallocate
2. sub2にmat(1,1)の成分を１次元の配列として引き渡し（配列として渡さないとエラー）
3. sub2中で1次元の配列として[1,2,3,4,5,6]と値を変更
4. メイン文中でmatの成分を確認
という流れです。結果ですが、

```bash
 t2-1:           1           2           3
 t2-2:           4           5           6
```

sub2中では一次元配列（しかもサイズ１）として取り扱っていましたが、main文に戻るころには二次元配列として値が入っています。これは、**Fortranの二次元配列が内部的にはメモリに連続して記憶されているから**ですね。
Fortranにおける多次元配列について、さらなる詳細などは下記ページなどが参考になります。
https://www.nag-j.co.jp/fortran/FI_12.html
https://qiita.com/YPonz1/items/66494bb93a5c89437db2

##最後に
正直、私の拙い文章では説明不足な点が否めないですが、まずは、なんとなく感じていただければと思います。
興味を持った人は、ぜひ自分でプログラムを書いて検証してみよう！

###備考１
本来は、参照の位置がおかしいのでエラーになるべきプログラムです。**こんなプログラムを書いてはいけません！**
gfortranだと-fcheck=allをつけると、実行時にちゃんと怒られます。
https://qiita.com/mosamosa/items/8945676f358be62ca22c
ということで、**コンパイルオプションをちゃんとつけましょう！！**

###備考２
さらに興味を持った人から、ポインタ渡しと参照渡しって違うの？って聞かれても、私にはわかりません！！C++とかだと違うらしいです。
https://qiita.com/agate-pris/items/05948b7d33f3e88b8967
詳しい人お願いします！！
【Intellij IDEA(Ultimate)】Run/Debug Configurationsを触ってみる - npm編

この記事は[JetBrainsIDE Advent Calendar 2019](https://qiita.com/advent-calendar/2019/jetbrains)の2日目の記事です。

# 前書き
`Intellij IDEA(Ultimate)`の`Run/Debug Configurations`では、`Java/Kotlin`のビルド・実行だけでなく、様々な設定を行うことができます。

この記事では`Java/Kotlin`以外のコンフィグを設定する例として、`npm`のコンフィグ設定を触ってみます。

# Java/Kotlin以外のコンフィグを設定する
コンフィグの追加は`Run/Debug Configurations`ウィンドウの右上の`+`ボタンから行うことができます。
画像の通り、この時点で大量の内容が設定できることが分かります（自分の環境では大分類だけで84有りました）。

また、`Plugin`を追加していくことで、設定可能な内容は更に増えていきます。

![スクリーンショット 2019-12-01 18.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/0bca7401-29e7-2543-310e-ce2ce18570d5.png)

## npm関連のコンフィグを追加をしてみる
今回は例として、`npm`関連のコンフィグを追加してみます（サンプルリポジトリとして[charliekassel/vuejs\-datepicker](https://github.com/charliekassel/vuejs-datepicker)を利用させていただきました）。

まずそのまま追加を行うと以下のような画面になります。
`Java/Kotlin`の設定項目とは違う内容が出ています。

![スクリーンショット 2019-12-01 18.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/ad4abd85-f154-fa1a-e236-193eb9540b2b.png)

### Scriptsを指定する
画像の通り、`npm`のコンフィグは`package.json`を読み込んでいます。
そのため、以下の通り、`npm run`で動かす`Script`の指定には補完が効きます。

```json:package.json(抜粋)
"scripts": {
  "build": "npm run lint && rm -rf dist/* && rollup -c scripts/build.js && rollup -c scripts/build-locale.js",
  "serve": "rollup -c scripts/serve.js --watch",
  "test": "jest --config test/unit/jest.conf.js --coverage",
  "lint": "eslint --ext .js,.vue src test/unit/specs",
  "prepublishOnly": "npm run build"
}
```

![スクリーンショット 2019-12-01 18.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/78b2918d-d85d-537a-9ffa-d7bb7740f0a0.png)

### Commandを設定する
先ほどの画像の通り、初期状態では`Command`に`run`が指定されますが、`ci`や`install`といった内容も当然指定可能です。

![スクリーンショット 2019-12-02 11.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/0fd7bc6d-5d7c-fffb-57bc-c5282e210e1a.png)

### Package Managerを設定する
画像の通り、`Package Manager`を`npm`から`yarn`に変えるような設定も可能です。

![スクリーンショット 2019-12-01 18.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/ef442d6c-66f8-3bba-4723-e196d7b0f539.png)

# まとめ
この記事では`Java/Kotlin`以外のコンフィグを設定する例として、`npm`のコンフィグ設定を触ってみました。

紹介した通り、`Intellij IDEA(Ultimate)`では`npm`に限らず、様々なコンフィグにそれぞれの設定/補完が用意されています。
まだ触ったことのない方がいらっしゃいましたらこの機会に是非触っていただければ幸いです。
Docker + Flask(Python) + Jupyter notebookによる仮想環境構築

毎回構築の方法を忘れるため、備忘録として。

#ファイル構成
```
project
    L Dockerfile
    L app.py
```

#Dockerfile
javaを利用するライブラリをインストールする可能性があるので、default-jdkを追加しています。

```dockerfile:Dockerfile
FROM python:3.6
RUN apt-get update && apt-get install -y \
    default-jdk \
    build-essential \
    gfortran \
    libblas-dev \
    liblapack-dev \
    libxft-dev \
    swig \
    && rm -rf /var/lib/apt/lists/*
RUN echo 'export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"' >> ~/.bash_profile && \
    . ~/.bash_profile && \
    cd ~ &&\
    git clone https://github.com/taku910/mecab.git && \
    cd mecab/mecab && \
    ./configure  --enable-utf8-only && \
    make && \
    make check && \
    make install && \
    cd ../mecab-ipadic && \
    ./configure --with-charset=utf8 && \
    make && \
    make install &&\
    cd ~ &&\
    git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git && \
    cd mecab-ipadic-neologd && \
    ./bin/install-mecab-ipadic-neologd -n -y
RUN pip3 install --upgrade pyzmq --install-option="--zmq=bundled" && \
    pip3 install --upgrade jupyter && \
    pip3 install --upgrade \
    pandas \
    neologdn \
    Flask \
    numpy \
    Pillow \
    tensorflow \
ENV LD_LIBRARY_PATH "/usr/local/lib:$LD_LIBRARY_PATH"
VOLUME /notebook
WORKDIR /notebook
EXPOSE 8888
ENTRYPOINT jupyter notebook --ip=0.0.0.0 --allow-root --no-browser
```

#Docker imageの作成
Dockerfileのディレクトリに移動して、docker buildコマンドを実行。構築に数分かかります。

```terminal
$ cd project
$ docker build -t image_name --force-rm=true .

# (-t イメージ名)　イメージ名を自分で決定
# (--force-rm=true)　イメージのビルドに失敗したら、イメージを自動で削除する
```

#Docker containerの作成
描きコマンドを実行すると、自動でJupyter notebookが起動するので、表示されたURLにアクセスするとJupyter notebookが利用できる。

```terminal
# 上と同じディレクトリで下記コマンド実行
$ docker run -v `pwd`:/notebook -p 8888:8888 -p 5000:5000 -it --name container_name image_id /bin/bash

# http://127.0.0.0:8888/?token=####################
# こんな感じのアドレスが出てくるため、tokenごとコピペする。
```

#追加のライブラリをインストール
Jupyter notebookで作業している時に、足りないライブラリをインストールしたい場合は、コンテナの外から、下のコマンドでコンテナの中に入る。

```terminal
$ cd project
$ docker exec -it container_name /bin/bash

# 上記コマンドでコンテナ内に入ると、ターミナルが下のように切り替わる。
root@ユーザー名:/notebook# ここにコマンドを入力できるようになる。

# インストールの例
root@ユーザー名:/notebook# pip install numpy
```

#Flaskの環境構築
app.pyをDockerfileと同じディレクトリに作成して、下記コードとコマンドを実行すると、アプリケーションが立ち上がります。

```python:app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':
    app.run()
```

```terminal
$ python hello.py
```
deno-lambda を使ってみる

Deno (ディーノ) <img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno.png" width="20"> Advent Calendar 13日目の記事です.

今日は Deno で AWS Lambda 関数を実装するためのツール [deno-lambda](https://github.com/hayd/deno-lambda) の使い方を紹介します. deno-lambda は [@hayd](https://github.com/hayd) <img src="https://avatars3.githubusercontent.com/u/1931852?s=400&v=4" width="20"> Andy Hayden さんが作った, Deno で Lambda 関数を実装するためのツールです.

# 手順

[deno-lambda のリリースページ](https://github.com/hayd/deno-lambda/releases) に行き, 最新バージョンの deno-lambda-layer.zip をダウンロードしてください.

AWS Console の Lambda のページに行き Layers タブを選択し, Layer の作成選んでください.

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step0.png" />

任意の名前を入力し(例. deno-lambda-layer), ダウンロードした deno-lambda-layer.zip をアップロードしてください. アップロード完了したら作成ボタンを押して Lambda layer を作成します.

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step1.png" />

作成が完了したら画面右上のレイヤーの ARN をコピーして控えます.

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step2.png" />

次に Lambda 関数を作ります. 1から作成を選んで, ランタイムは「ユーザー独自のブートストラップ」を選択してください.

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step3.png" />

Lambda 関数が出来たら, Layers パネルから Layer の追加を選びます.

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step4.png" />

Layer の追加画面で, 「レイヤーバージョン ARN を提供」を選択し, レイヤーバージョン ARN に先ほど控えたレイヤーの ARN を入力し, レイヤーを追加します.

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step5.png" />

次に Lambda 関数を書いていきます. 関数の入力欄を選択し, ハンドラーを `handler.main` と入力し, handler.ts というファイルを作成します. handler.ts の内容は以下の内容を入力してください.

```ts
import { Context, Event } from "https://deno.land/x/lambda/mod.ts";

export function main(event: Event, context: Context) {
  return {
    statusCode: 200,
    body: `Welcome to deno ${Deno.version.deno} 🦕`
  };
}
```

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step6.png" />

以上で Lambda 関数の作成は完了です. 上のソースコードの main 関数部分が Lambda のハンドラーになっています. ここでは, event (リクエスト) の内容に依らず, 成功レスポンスを返す実装になっています.

この Lambda 関数をテストするために画面右上の「テスト」 から, テスト用のイベントを作りつつテスト実行してみましょう. 以下のような実行結果が出てくれれば成功です.

<img src="https://raw.githubusercontent.com/kt3k/drafts/master/assets/deno-lambda/step7.png" />

うまくいかない場合は, エラーメッセージを見ながら, ここまでの設定で何か忘れていないかを確認してみましょう. それでもわからない場合は [deno-ja slack](https://scrapbox.io/deno-ja/Slack%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95) で聞くか, deno-lambda に issue を立ててみましょう.

# Recap

今日は [@hayd](https://github.com/hayd) <img src="https://avatars3.githubusercontent.com/u/1931852?s=400&v=4" width="20"> Andy Hayden さんの deno-lambda の使い方を紹介しました.

明日は GitHub Actions で Deno を動かす話です.
MacBook Pro 16インチがゲーミングPCになる？

## ハイスペックなMacBook Pro 16インチを入手したたので、GPUのAMD Radeonがついてるし、ゲーミングPCになるかどうか試してみました。
![IMG_9474.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/76646b7a-c3d2-3de5-6b7c-ba06740ff078.jpeg)

# MacBook Pro 16インチのスペック
- 機種名: MacBook Pro
- 機種ID: MacBookPro16,1
- プロセッサ名: 8-Core Intel Core i9
- プロセッサ速度:
 2.3GHz
- プロセッサの個数: 1
- コアの総数: 8
- メモリ: 16GB
- SSD: 1TB
- チップセットのモデル:	AMD Radeon Pro 5500M
- 種類:	GPU
- バス:	PCIe
- PCIeレーン幅:	x16
- VRAM（総量）:	4 GB

# Windows 10 のディクスイメージの64-bitをダウンロードする
- 32-bitはインストールできません。
https://www.microsoft.com/ja-jp/software-download/windows10ISO

# セキュリティとプライバシーを確認する
- FileVaultがオフでないとWindows 10をインストールできません。
<img width="780" alt="スクリーンショット 2019-12-01 18.42.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/7ca6dad0-7f11-f181-6465-a32e6c558955.png">


# Boot Campアシスタントにて、Windows 10 をインストールする
- USBメモリやDVDドライブを準備する必要はありません。
<img width="903" alt="スクリーンショット 2019-11-18 19.40.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/ff28b935-997f-91c9-690a-ccde339d1233.png">

# Windows 10 を起動する

# FF ベンチマーク
![IMG_9471.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/3fcc065e-4843-4a4c-be89-6ae4c56e46e3.jpeg)
# 結論
- 映像と音声のクオリティーが最高だが、フレームレイトが出ないので、ゲームプレイにはオススメできません。