OmniAICreator/Qiita-1.07M huggingface dataset:
NoodlのComponentについてメモ

[Noodl Advent Calendar](https://qiita.com/advent-calendar/2019/noodl) 7日目🍜
6日目に引き続き、Noodlの基本について書こうと思います。
今回は、Component（コンポーネント）にグッと焦点を当てた記事になります。

## Component（コンポーネント）とは何か？
Noodl Advent Calendar [6日目の記事](https://qiita.com/pentake/items/b75a160a9f4cbcc7f31d)でも触れましたが、コンポーネントは以下の特徴を持ちます。

**・Nodeの集まり
・全体を構成する１つの要素**

この記事ではもう少し具体的なお話をします。Noodlでは新規プロジェクトを作成すると、Mainという名前のコンポーネントがあらかじめ用意されています。（下図の真ん中参照）

▼ Mainコンポーネントの初期構成
・Groupノード　　　（名前：Root）
・Rectangleノード　 （名前：Background）
・Textノード　　　　（名前：Hello World）
![スクリーンショット 2019-12-07 13.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526082/00d3233d-0963-22b6-db41-9557cf23350d.png)
初期構成の３つのノードに加えて**Buttonという名前のノード**がありますが、これは僕が作ったものです。上図右側は、**Buttonという名前のコンポーネント**で、Groupノード、Circleノード、Textノードで構成されています。

ここで、なんだか違和感を覚えませんか...？
今、僕は**「Buttonという名前のノード」**と**「Buttonという名前のコンポーネント」**と書きました。名前が同じなのに、ノードと呼ばれたり、コンポーネントと呼ばれたりしている...

そう！

**あるコンポーネントは、他のコンポーネントの中でノードのように振る舞うことができます！（重要！！！）**
ここでは、ButtonコンポーネントがMainコンポーネントの中でノードのように振る舞っています。つまり、ButtonコンポーネントはMainコンポーネント中で**「部品(ノード)」**として使うことができるんです。

この説明で違和感がなくなったのではないでしょうか。
（まだよく分からん...という方はぜひコメントください）

最後に、コンポーネント化するメリットを挙げて終わろうと思います。

**▼ コンポーネント化するメリット**
・表示されるノードが少なくなるため、プロジェクト全体の**構造を把握しやすくなる**
・構造が把握できると、プロジェクトを構築する時に**混乱しない**
・部品として扱うため、簡単に**再利用できる**ようになる

以上がコンポーネントの基礎知識になります。
読んでいただきありがとうございました！

## おわりに
元々、Noodl Advent Calendar に書いておいたタイトルが Component Inputs / Outputs / Children についてだったのですが、全て書くと１つの記事あたりのボリュームがめちゃくちゃ多くなってしまうので今回はComponentの具体的な基礎知識に留めました。~~（書く時間がなかったとは言えない...）~~

近いうちに Component Inputs / Outputs / Childrenについて記事を書けたらと思いますm(_ _)m
（それぞれ、別々の記事にしようかな...）
YAMAHA ルーターで2つあるネットワークセグメントに対しそれぞれIPマスカレードする方法

# はじめに
YAMAHAルーターのWAN側に2つのネットワークセグメントがあり、それぞれにIPマスカレードするパターンを2つ紹介する。

# 背景
当方の環境ではネットワークはマンション管理組合において一括で契約(伊藤忠ケーブルシステム BB4Uインターネット接続サービス)しており、いわゆるLANコンセントにつなぐことでインターネットへ接続できる。そして、2つのネットワークセグメントを利用できる。

- DHCPでプライベートIPアドレスが提供されている
- さらに個別契約によりstaticなグローバルIPアドレスの提供をされている

これら両方のネットワークをIPマスカレードで使おうというのがここでの趣旨である。

# パターン1
一方のインターフェイスに集約するパターン(本例ではLAN2に集約)。lan2にIPアドレスを2つもたせ、そのIPアドレスごとにlan1/1とlan1/2をIPマスカレードで対応させている。

```
ip route default gateway ゲートウェイIPアドレス
vlan lan1/1 802.1q vid=100 name=VID100
ip lan1/1 address 192.168.100.1/24
vlan lan1/2 802.1q vid=200 name=VID200
ip lan1/2 address 192.168.200.1/24
ip lan2 address グローバルIPアドレス/サブネットマスク
ip lan2 secondary address dhcp
ip lan2 nat descriptor 100 200
nat descriptor type 100 masquerade
nat descriptor address outer 100 primary
nat descriptor address inner 100 192.168.100.1-192.168.100.254
nat descriptor type 200 masquerade
nat descriptor address outer 200 secondary
nat descriptor address inner 200 192.168.200.1-192.168.200.254
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 100 192.168.100.2-192.168.100.254/24
dhcp scope 200 192.168.200.2-192.168.200.254/24
dns service recursive
dns server プライマリDNS セカンダリDNS
```

# パターン2
インターフェイスをLAN2とLAN3で分離するパターン。lan2をlan1/1に、lan3をlan1/2にIPマスカレードで対応させている。こちらはRTX1200やRTX1210のようにLANインターフェイスが3つ以上あること前提の構成(ポートベースVLANを使えば同じようなことを実現できるかもしれないが試していない)。

パターン1と違うのはlan1/1に属するネットワークからはlan3のネットワークは見えないこと(ただし、ルーターの持つアドレスは除く)。

```
ip route default gateway ゲートウェイIPアドレス filter 100 gateway dhcp lan3 filter 200
ip filter 100 pass 192.168.100.0/24 * * * *
ip filter 200 pass 192.168.200.0/24 * * * *
vlan lan1/1 802.1q vid=100 name=VID100
ip lan1/1 address 192.168.100.1/24
vlan lan1/2 802.1q vid=200 name=VID200
ip lan1/2 address 192.168.200.1/24
ip lan2 address グローバルIPアドレス/サブネットマスク
ip lan2 nat descriptor 100
ip lan3 address dhcp
ip lan3 nat descriptor 200
nat descriptor type 100 masquerade
nat descriptor address outer 100 primary
nat descriptor address inner 100 192.168.100.1-192.168.100.254
nat descriptor type 200 masquerade
nat descriptor address outer 200 primary
nat descriptor address inner 200 192.168.200.1-192.168.200.254
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 100 192.168.100.2-192.168.100.254/24
dhcp scope 200 192.168.200.2-192.168.200.254/24
dns service recursive
dns server プライマリDNS セカンダリDNS
```

# 参考
- [IP の静的経路情報の設定, YAMAHA](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ip/ip_route.html)
- https://gist.github.com/akira345/65371946fb9f4147459f418ac42116b5

あとがき
--
わかりにくいから気が向いたらイラストでも足そう。
小学生に本当のプログラミングを教えることの難しさ

私は現在、小学5年生の子にプログラミングを教えている。開発環境は以下の通り

###開発環境
+ Windows10 64bit
+ Minecraft Java版 ver1.12.10
+ Minecraft forge
+ RaspberryJamMod
+ Python3.8

#教えていること
教え子の要望としては、MinecraftのModを自作したいとのことだった。
そのためにはJava言語を学ぶ必要がある。
しかし、小学生が最初に学ぶプログラミング言語としてJavaは非常にハードルが高いと考えられた。
そこで、まずはMinecraftのなにを作っているのかわかりやすい点と、
学習ハードルの比較的低い言語としてPythonを教えることとし、
Minecraft＋Pythonのプログラミング環境としてRaspberryJamModを導入して教えることにした。

学習内容は以下の書籍に沿って進めている。
[Minecraftで楽しく学べる Pythonプログラミング](https://www.amazon.co.jp/dp/4800711657/)

学習履歴についてはこちらのWiki等を参考にしてほしい
[プログラミング教室wiki](https://github.com/NJIMAMTO/prog_for_students/wiki)

#小学生にプログラミングを教えることの難しさ
さて本題だが、小学生にプログラミングを教えることは非常に難しい。というのも

+ 最低でも中学数学の知識が必須(代入の概念に近い文字式は中１で学ぶ等)
+ ハンズオン形式で行っても一回１時間が限度(子供の集中力はそこまで高くない)
+ 一度に多くのことは詰め込めない(少しずつでないと頭がパンクしてしまう)

等の理由からである。
教えている子は日々Minecraftを嗜み、コマンドの知識も豊富でUnityでゲーム作りの経験もある。
しかしながら、これらの前提知識があったとしてプログラミングというものは
非常にハードルが高いことに変わりはない。
ハードルの高さがわかる具体例として、有名なFizzBuzz問題を宿題として出したが
完成まで１週間程度の時間がかかっている。

#それでも教えるためにはどうすれば良いか
私は教育の専門家でもなければ、プログラミングの専門家というわけでもない（一応高専卒ではあるが）。
そのため創意工夫の繰り返しでなんとか毎回をやり切っている。工夫としては

+ スライド形式でなるべく噛み砕いて紹介する
+ 一単元に教えることは一項目のみと極力シンプルにする
+ 読むことよりもプログラムを書くことを中心にする
    + 授業中に課題を1~2題,1週間かけてやる宿題を1~2題という構成にしている

などが挙げられる。例として講義用に作成したスライドをいくつか挙げておく。

+ [講義資料1](https://www.slideshare.net/mokugyo_pkpk/programming-school-02-186203439)
+ [講義資料2](https://www.slideshare.net/mokugyo_pkpk/programming-school-03)

しかしながらこれだけの工夫をしても、不徳の致すところだがについていけないという理由で辞める子も出てしまった。
繰り返すが、それほどプログラミングは難しいのである。

#今後どうするべきか
脱落者が出てしまうほど難易度が高いという点を、さらにハードルが下げられるよう
噛み砕いて説明すべきかという課題がある。
しかしながら、スライド作成に数時間を費やしており、本業の片手間で行う手前、
これ以上の負担増は個人的に厳しい。さらに自らの能力不足という点は否めない。
一方、主観ではあるが、現状でのペースに大きな問題はなく、教え子の学業との兼ね合いも考慮して
一時間/週・授業内課題と宿題を数題というスタイルは幅広く適用できる可能性は高いと思われる。

---
スライドを見たけど、これではハードルはかなり高いのでは？等の意見がありましたらコメントいただければ幸いです。
Salesforceの勉強方法！

こんにちは。　本橋孝昭です。

最近寒くなってきましたが、みなさんいかがお過ごしでしょうか？
私はなんだか風邪気味で喉がとても痛いです。。。

本投稿は、[Salesforce Advent Calendar 2019](https://qiita.com/advent-calendar/2019/salesforce)の 7日目の投稿です！

さて！Salesforce Advent Calendar 2019は『Salesforce設定・開発』を投稿する趣旨ということで、ここ数日間、私は色々な標準機能に関するネタを考えてブログに載せようと思いました！！


##しかし！

（毎日Salesforceで分からないことや困ったことがあれば日々ググって調べてる私がいつも思うのですが）やりたいことがあり、とりあえず調べてみようと検索ワードをで引っかかるブログ記事をよく見て見ると

『やろうとしてることと若干違う』
『大切なことが結局書いてない』（設定の仕方とか）
『そもそも記事の内容が古くて今はできない』（ブログ記事はClassicだけど、やりたい環境はLightning環境なんだ。（またはその逆））

みたいなことが多く、
『なかなか欲しい情報にたどり着けない！！』と、とても困った経験がありました。

特に最近では、フロー設定の画面が大きく変わったので、フロー設定方法をググって調べてみても（もちろん過去のフロー設定方法しか出てこないため）困りました。。

Salesforceは年に3回もの定期的なアップグレードがあるのは有名な話ですが、そんな中、今現在のSalesforceの内容をブログで書いても、その内容がSalesforceでどこまで通用するのか。。。

### 『じゃあどうすればSalesforceについて調べればいいんだろう？』

と思うのですが。やはり世界中で多くの方々が『Salesforce』という同じものを使ってるので、Salesforceの悩みはSalesforceを知ってる人に直接聞いて生の情報を仕入れるのが一番早くて確実に問題解決ができると思います。

## しかし！！
社内にSalesforceを知っている人がいれば一番ベストなんですが。。。
###『Salesforceを知ってる人なんて周りにいないぞっ！』

という方も多いと思います。

(Salesforceを生業にしている企業に勤めていない)
Salesforceのシステム管理をしている方々にお会いすると

『Salesforceに携わる人が自分一人しかいない』
『導入して間もないのでSalesforceを知ってる人は社内に誰もいない』

といったお話をよく耳にします。

もちろん、Salesforceには『Trailblazer Community』があり、その中の
[* 質問広場～初心者から上級者まで～ 日本 *](https://success.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=0F93A000000Pd80)で気軽にわからないことや困ったことを聞ける場があるのですが、やはりネットのやりとりでは伝わりにくかったりして思うように解決できないことも多々あると思います。

####そんなあなたにオススメのコミュニティがあります！
###[Salesforce Saturday Tokyo](https://www.trailblazers.jp/group/saturdaytokyo_dg)
です！

『Salesforce Saturday Tokyo』は、2018年から活動しているSalesforceコミュニティです。
Salesforce本場のアメリカでは『SalesforceSaturday』という言葉が根付いていて、Salesforceを学びたい人たちが土曜に気軽に集まって勉強会を開いています。
土曜日にSalesforceを勉強するムーブメントが盛り上がってきたことに影響を受け、
日本では株式会社Sharing Innovationsとアクセンチュア株式会社の2拠点で2018年からスタート。
参加者はビジネスユーザやシステム管理者、開発者、Salesforce中の人と様々な立場の人が参加し、
2019年時点で勉強会のべ参加者は800名を超えSalesforce Saturday Tokyoの拠点数も6拠点に増えました。

###実は、今日（2019年12月7日）は、6拠点目の『[Salesforce Saturday 茅場町](https://salesforcesaturday-kayabacho.connpass.com/)』の第1回目が開催されました！
<img width="793" alt="SalesforceSaturday茅場町.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/be78af81-772c-bc9a-992d-76c244ac53b7.png">

今日の勉強会に参加して思うのは、やはり参加者の多様性ですね。
参加者の中には
『Trailheadを黙々と勉強してスーパーバッジを取りたい』
『難関資格の勉強に励みたい』といったSalesforceに熟練した方々もいますし、
『Salesforceについて困っていることがあるけど自社内で解決しない』
『急にSalesforceの案件をやることになってとにかく情報が欲しい』
『Salesforceの勉強で何をすればいいか分からない』
『Trailheadを最初から始めたい』
といったビギナーの方々まで、本当に様々な方々がこの『Salesforce Saturday Tokyo』を訪れます。
参加者はみんな『Salesforce』という共通の話題があるので、みんなでワイワイと話しながら問題解決したりして、いつも楽しい勉強会になります。

申し遅れましたが、私（本橋）も『Salesforce Satursay Tokyo』運営メンバーで池袋で貸し会議室を借りて『[Salesforce Saturday 池袋](https://salesforcesaturday-ikebukuro.connpass.com/)』を昨年から毎月主催しています。

ぜひみなさんも、勉強したいことや分からないことがあれば『Salesforce Saturday Tokyo』にいらしてください！

####Salesforce Satursay Tokyoは、2020年には毎週土曜開催（約50回開催）を目指しています！

来年には、toBeマーケティングの有志メンバーが『[Salesforce Saturday 新橋](https://salesforcesaturday-shinbashi.connpass.com/)』を開催し、拠点数が増えていきます！
気づいたら毎週の土曜日、都内某所のどこかしらで勉強会が開催されていて、自分の都合に合わせて好きな時に参加できるような理想の世界を目指します！！
🔰WinActor/WinDirector で情報を効率よく見つけるためのリンク集

WinActor/WinDirectorの情報を効率よく入手するために知っておくべきサイトをまとめたよ😚😄使ってね🤩🌞️✨

# メーカー提供のFAQ (よくある質問集)サイト 1
比較的最近できたサイトみたいだよ。よくある質問がExcel形式でまとまっていたり、チャットボットに質問すると答えをくれたりするので、使ってみてね🤔💖🎁

https://winactor.com/faq_winactor/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/7df62650-9c8e-f154-6e82-bded42a7fe33.png)

もし一括でキーワードを検索したい場合は、`https://winactor.com/document/` の下をGoogleのサイト内検索を使うとよいよ😄👍

```
https://www.google.com/search?q=site%3Ahttps%3A%2F%2Fwinactor.com%2Fdocument

```


# メーカー提供のFAQ (よくある質問集)サイト 2

こちらもFAQサイトだよ。検索ボックスから必要なキーワードを入力してみよう😀😁😂
http://www.matchcontact.net/winactor_jp/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/ade70f10-f53a-3002-bdbf-f48971dbf85b.png)


# ユーザーフォーラム
比較的最近できた公式ユーザーフォーラムだよ🎅🙆‍♂️
質問もできるし、他の人の疑問点から学ぶことができるよ💯💤

https://winactor.com/questions/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/1bbb8d96-4015-037b-5053-4b93d1e3d73e.png)


# ライブラリ一覧
こちらの記事をみてね😘✨

[🔰WinActor ライブラリ一覧 (インストール済み/クラウド)](https://qiita.com/KamiyaMT/items/2da0e23e25bf29d904ac)
[PyTorch]torch.max()でちょっと迷ったこと

## はじめに
PyTorchのドキュメントでちょっと理解できてなかったから残す程度
コードは[ドキュメント](https://pytorch.org/docs/stable/torch.html)から

## torch.max()の使い方
### 1. 1Dテンソルの場合

```python
a = torch.randn(1, 3)
a
tensor([[ 0.6763,  0.7445, -2.2369]])
torch.max(a)
tensor(0.7445)
```
うん，一番簡単一次元配列の最大値の要素を返してくれる

### 2Dテンソルの場合
```python
a = torch.randn(4, 4)
a
tensor([[-1.2360, -0.2942, -0.1222,  0.8475],
        [ 1.1949, -1.1127, -2.2379, -0.6702],
        [ 1.5717, -0.9207,  0.1297, -1.8768],
        [-0.6172,  1.0036, -0.6060, -0.2432]])
torch.max(a, 1)
torch.return_types.max(values=tensor([0.8475, 1.1949, 1.5717, 1.0036]), indices=tensor([3, 0, 0, 1]))
```

これの第二引数がよくわかんなかったけど
numpyでゆうところのaxisでした．
なので個人的には

```python
a = torch.randn(4, 4)
a
tensor([[-1.2360, -0.2942, -0.1222,  0.8475],
        [ 1.1949, -1.1127, -2.2379, -0.6702],
        [ 1.5717, -0.9207,  0.1297, -1.8768],
        [-0.6172,  1.0036, -0.6060, -0.2432]])
axis = 1
torch.max(a, axis)
torch.return_types.max(values=tensor([0.8475, 1.1949, 1.5717, 1.0036]), indices=tensor([3, 0, 0, 1]))
```
としたほうがわかりやすいですね．
``` torch.max(a, axis)```みたいな使い方はクラス分類で使われますね～
ちなみに，自分用ですけど，axisは軸ですよ！(```axis=0:col, axis=1:row```)

# おわりに
まだまだライブラリと数学に振り回されているので早めにうまく使えるようになりたいです
SPA(react)でauth0を使う


前回の続き。
https://qiita.com/celeron1ghz/items/2e901694859940615307



Auth0自体は良いサービスですが、かつてのAuth0は割と使うまでのコード数が割とあって、正直手軽ではないなという感じでした。

https://github.com/auth0-samples/auth0-react-samples


ですが、`auth0-spa-js` がそういうものを払拭し、マジ便利＆マジセキュア＆マジ簡単みたいになって、文字通り簡単に認証を追加できるサービスに進化しています。

https://dev.classmethod.jp/server-side/auth0/auth0-spa/


## auth0のセットアップ
前回のtfファイルにてテナントとアプリケーションは作成した後の話。

### Twitterでのログイン設定。
 * https://developer.twitter.com/ でアプリケーションを作成。
   * `Consumer Key` と `Consumer Secret` を取得。`Callback URL` の設定も忘れずに。

### Auth0の設定
 * ConnectionタブからTwitterを選択してオンにする。（今回はTwitterを使う）
 * `Consumer Key` と `Secret` を入れてログインのテスト。
 * It works!みたいに言われたらおk！



## client側
`create-react-app` した後に下記内容で `src/App.tsx` を上書きして `npm i @auth0/auth0-spa-js` して `yarn start` すれば多分動く！！

auth0の設定も適宜変えてください。

```
import React, { useState, useCallback, useMemo } from 'react';
import createAuth0Client from '@auth0/auth0-spa-js';

const AUTH0_DOMAIN          = 'xxxxxxxx.auth0.com';
const AUTH0_CLIENT_ID       = 'xxxxxxxx';
const AUTH0_REDIRECT_URI    = 'https://xxxxxxxx.ngrok.io/callback';
const AUTH0_AUDIENCE        = 'https://api.example.com';

const AUTH0_PARAM = { audience: AUTH0_AUDIENCE };

const App: React.FC = () => {
  const [auth0, setAuth0] = useState<any>();
  const [profile, setProfile] = useState<Object>();
  const [auth0Token, setAuth0Token] = useState<string>();

  const login = useCallback(async function() {
    if (!auth0) return;
    await auth0.loginWithPopup(AUTH0_PARAM);

    const user: Object = await auth0.getUser(AUTH0_PARAM);
    setProfile(user);
  }, [auth0]);

  const logout = useCallback(() => {
    auth0.logout();
  }, [auth0]);

  useMemo(async function(){
    if (!auth0) return;
    try {
      const token: string = await auth0.getTokenSilently(AUTH0_PARAM); 
      setAuth0Token(token);
      console.log(token);

      const user = await auth0.getUser(AUTH0_PARAM); 
      setProfile(user);
    } catch (e) {
      console.log(e);
    }   
  }, [auth0]);

  if (!auth0) {
    createAuth0Client({
      domain:       AUTH0_DOMAIN,
      client_id:    AUTH0_CLIENT_ID,
      redirect_uri: AUTH0_REDIRECT_URI,
      audience:     AUTH0_AUDIENCE,
    }).then(setAuth0);

    return null;
  }

  //console.log(auth0Token);

  return (
    <div>
      {
        profile && <button onClick={logout}>Logout</button>
      }
      {
        !profile && <button onClick={login}>Login</button>
      }
      <div>
        {JSON.stringify(profile)}
      </div>
    </div>
  );
}

export default App;
```

以前のauth0のチュートリアルと比べても圧倒的に楽になっていて、boilerplateさえ用意してしまえば文字通り秒で認証を使えるようになる感じで非常によいですね！！！

次はAPI GatewayでJWTの検証。


## 注意点
 * callback URLに `https` じゃなくて `http` を指定してはまりがちなので注意。
 * `http://localhost` で試した後に `https://xxx.ngrok.info` を試すと動作がおかしくなる時がある。
	 * jwt tokenの取得時の条件にURLを見てる感じで、tokenは取得できても `getTokenSilently` が動かなくなる時がある（ログインしてリロードすると再度ログインが必要になる）。
	 * 開発の時だとAuth0でログインしたアカウントを削除すればOK。基本的にはログインに使用するホストを変えないほうがいいっぽい。
rebase三銃士

rebase周りでよく使うコマンドを忘れがちなので、最低限を書いておく。

# git rebase
```shell
git rebase develop
```
作業ブランチの元を繋げ直す。
先行したdevelopブランチの変更を取り込むときによく使う。
以下の順番でコマンドを打っていけば間違いない。

```shell
git checkout develop
git pull
git checkout 作業ブランチ
git rebase develop
```

コンフリクトがたくさん発生しそうな予感がしたら`git merge`の方が手間が少ない。

# git rebase -i
```shell
# 履歴を整理したいブランチにいる状態で
git rebase -i
```
複数のコミットログを1つにまとめたり、コミットログのコメントを直したりする。
コミットのハッシュ値が変わってしまうので、リモートにプッシュする前に実行する。
できることは以下。

* p, pick = use commit
* r, reword = use commit, but edit the commit message
* e, edit = use commit, but stop for amending
* s, squash = use commit, but meld into previous commit
* f, fixup = like "squash", but discard this commit's log message
* x, exec = run command (the rest of the line) using shell

# git pull --rebase
```shell

# 作業ブランチにいる状態で
git pull --rebase origin develop
```
最初に説明したdevelop取り込み手順の簡略版。
作業ブランチにいる状態でリモートのdevelopブランチの変更を取り込んだ上でrebaseまで行ってくれる。
リモートの変更を取り込むためにこまめに打っておくとよい。

なお、コンフリクトがたくさん発生しそうな予感がしたら(ry
mbedとPelionで最速IoT！！！

#はじめに
5年ぐらい前に使っていたmbedが気づけばOSを出していて
気づけば最強のIoT向けOSになっていました
しかも気づけばPelionというIoT向けのプラットフォームが出ており最強のIoT環境なんじゃないかということに気付きました

#なにがすごいの？
・OSとプラットフォームが対になってるのでOSを打っ込むだけでIoTができる
・証明書とかを使ってることでセキュリティがめっちゃ高い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/3e0f93f2-b620-759c-5aae-ada92ad417e2.png)
・デバイスにアクセスできる人を管理することとかできる
<img width="822" alt="スクリーンショット 2019-12-07 13.12.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/032b4c00-18ae-f178-f364-8d28780166bd.png">
・遠隔でデバイスのアップデートとかができちゃう
<img width="822" alt="スクリーンショット 2019-12-07 13.12.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/937918b5-d5e7-3e75-7b94-2f38fd63c91b.png">
・デバイスのイベントログとかも取れるようになるらしい
<img width="822" alt="スクリーンショット 2019-12-07 13.12.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/8b1b375e-f716-5085-62b2-1b8959e5857e.png">

**ポンっと出来て、しかもちゃんとしたサービス提供をできるぐらいセキュリティが高いんじゃないか！？**

#やってみる
使うボードはGR_LYCHEE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/b8280363-2a65-bd9f-bc5f-126f662c3a69.png)

[QuickStart](https://os.mbed.com/guides/connect-device-to-pelion/)がしっかりしすぎていてこれを辿るだけでできそう。
<img width="1096" alt="スクリーンショット 2019-12-07 13.17.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/6093fb6a-3ef8-55f6-5638-5eab1c4ba79a.png">
GR_LYCHEEを選択して次へ
<img width="835" alt="スクリーンショット 2019-12-07 13.17.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/a61873eb-5e14-902a-60ff-12da085aff57.png">
ふむふむどうやらコンパイラーのボードにGR_LYCHEEを追加してsampleを追加するよう
追加された
<img width="835" alt="スクリーンショット 2019-12-07 13.26.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/3ca5d2f8-0706-fa47-135c-b62aae1add67.png">

Pelion Device Manageボタンから証明書を作るっぽい
<img width="835" alt="スクリーンショット 2019-12-07 13.27.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/3fb0a7af-66d8-dfa1-e343-fb2568d23c7e.png">

<img width="184" alt="スクリーンショット 2019-12-07 13.27.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/d4726110-88ec-6eea-2e6f-9af94a7090a2.png">

mbed_cloud_dev_~~が証明書のようだ！追加された！

wifiの設定をいれるっぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/52f9dc66-3b90-527c-c75e-204029f93438.png)

あとはコンパイルしていれた

#結果

つながってる！！！！！
<img width="894" alt="スクリーンショット 2019-12-07 13.55.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/a0c61af7-37e3-8f1a-cf6c-8e167b26c8e2.png">


button押すとなんか増える！！
<img width="1086" alt="スクリーンショット 2019-12-07 13.55.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/72754ede-b2f6-3dcb-914e-9862e9dbaf45.png">


#まとめ
ほんとに簡単にIoTできた　
**かかった時間１０分ぐらい。**

<img width="584" alt="スクリーンショット 2019-12-07 13.57.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243994/85357edf-f994-051c-45f1-4e70a8b61992.png">
この辺いじればセンサーデータとかもすぐ送れそう

なんかまじでちゃんとすごいので詳しくはこちら
https://www.armkk-event.com/iotss/2019/data/iotss_s4.pdf


Mbed+Pelionが今後最強のIoTスターターになるかもしれない
crkbdのOLEDに任意の文字列を書き込む

### 手段

既に`ssd1306.c`によって、1行21文字×4行の文字が書き込めるようになっているので、それを使う。


`keymap.c`の`void matrix_render_user()`の中で、`matrix_write`を使って書き込んでいけばよい。
また、一行ごとに書きこみ、`matrix->cursor`をいい感じに動かしてくれる`matrix_write_ln`もある。


```keymap.c
void write_hello(struct CharacterMatrix *matrix) {
  matrix->cursor = &matrix->display[0][0];
  matrix_write(matrix, "Hello World!");
}

void matrix_render_user(struct CharacterMatrix *matrix) {
  write_hello(matrix);
}
```

`ssd1306.c`のバグで、84文字フルで書き込むと(85文字目を書き込む前に)スクロールしてしまうので、以下のように修正すると4行フルで使える

```ssd1306.c
void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
  if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
    // We went off the end; scroll the display upwards by one line
    memmove(&matrix->display[0], &matrix->display[1],
            MatrixCols * (MatrixRows - 1));
    matrix->cursor = &matrix->display[MatrixRows - 1][0];
    memset(matrix->cursor, ' ', MatrixCols);
  }
  *matrix->cursor = c;
  ++matrix->cursor;
}
```

`lib`下の`keylogger.c`、`layer_state_reader.c`が参考になる。

それ以外の例

### Default Layer情報を取得する
`persistent_default_layer_set()`を使って、デフォルトレイヤーを書き換えてる場合

```keymap.c
void write_os(struct CharacterMatrix *matrix) {
  matrix->cursor = &matrix->display[0][0];
  switch (eeconfig_read_default_layer()) {
    case 1 << _WIN:
      matrix_write(matrix, "WIN");
    break;
    case 1 << _MAC:
      matrix_write(matrix, "MAC");
    break;
  }
}
```
`glcdfont.c`にWindowsとMacとLinuxとAndroidのアイコンは用意されている。
WindowsとMacのアイコンを書く例

```keymap.c
char windows_logo[2][3] = {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}};
char mac_logo[2][3] = {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}};
void write_os(struct CharacterMatrix *matrix) {
  matrix->cursor = &matrix->display[0][0];
  switch (eeconfig_read_default_layer()) {
    case 1 << _QWERTY:
      matrix_write(matrix, windows_logo[0]);
      matrix->cursor = &matrix->display[1][0];
      matrix_write(matrix, windows_logo[1]);
    break;
    case 1 << _MAC:
      matrix_write(matrix, mac_logo[0]);
      matrix->cursor = &matrix->display[1][0];
      matrix_write(matrix, mac_logo[1]);
    break;
  }
}
```

### 画像を書き込む
fontファイル`glcdfont.c`のビットマップをすり替えてしまえばよい。
[デフォルト](https://github.com/qmk/qmk_firmware/pull/4151)では、Corneのロゴがセットされている。
また、上記のように`ssd1306.c`を直しておくと、一行分表示できるサイズが増える
Web Components触ってみた

# Web Componentsとは
再利用可能な部品を作成するための技術。今回はその要素であるCustom ElementsとShadow DOMを触ってみます。

## Custom Elements
独自の要素を作成できる。

```javascript:ElementA.js
class ElementA extends HTMLElement {
  constructor() {
    super();
    this.innerHTML = `
      <style>
        div { color: red }
      </style>
      <div>Hello</div>`
  }
}

customElements.define('element-a', ElementA);
```

HTMLElementを継承したclassを定義し、`customElements.define`で要素を定義することでHTMLで`<element-a></element-a>`のように呼ぶことができます。

## Shadow DOM
要素をカプセル化できます。カプセル化することによって他のstyleの影響をうけなくなります。

```javascript:ElementB.js
class ElementB extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'});
    this.shadowRoot.innerHTML = `
      <style>
        div { color: blue }
      </style>
      <div>Hello</div>`
  }
}

customElements.define('element-b', ElementB);
```

`this.attachShadow`を呼び出すことでShadow DOMを作成できます。

## 定義した要素を使う

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Web Components</title>
    <script type="module" src="./ElementA.js"></script>
    <script type="module" src="./ElementB.js"></script>
</head>
<body>
    <element-a></element-a>
    <element-b></element-b>
</body>
</html>
```

このようにして定義した要素を呼び出します。

<img width="1440" alt="screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229515/f873a7dd-41e1-dd78-c293-8a37011da89e.png">

# 所感
Reactなどのライブラリを使用せずに、素のJavaScriptで再利用可能な部品を作成できるところがいいですね。
矢印キーを使わずに、linuxコマンドラインで最後のコマンドを再実行する

### 矢印キーの入力は面倒
コマンドラインでカーソルキーの「↑」を入力すると、前回のコマンドを再実行できますが、同じコマンドを何回も繰り返し実行する場合、右手をカーソルキーの位置に移動するのが面倒です。
ほかの方法を調べてみました。

### historyコマンドで直前コマンドを実行
```
!!
```

### historyコマンドでn回前のコマンドを実行
!の後に履歴番号を指定することでそのコマンドを実行できますが、これにマイナスの番号を指定することでn回前のコマンドを実行できます。

```
!-1
```

### ショートカットキーで前回コマンドを表示
`ctrl+p`キーで前回コマンドを表示できます。
マンガでわかる Bridge

![18C5B05C-7889-41E2-8CFB-09568B4E4B67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/0fabbbdb-0e66-0be0-1c21-70f65e103071.png)


くるみクンは生まれたばかりの新人ちゃん AI (すぐ総当たりでも力押しでやりだすから) なので勘弁してやってください。継承を使ってオブジェクトの特徴分類をしようとすると、これ、誰もが一度は陥ってしまったことのある状況ですよね。

オブジェクトの特性が一般化-特殊化するのは汎化-派生なんだから is-a で全部できると思ってやろうとすると、すぐに、現実的なニーズに迫られて、当初想定していなかった分類軸との総当たり組み合わせみたいな数のクラスができてしまいます。空を飛べない鳥なんてのは普通にありそうなイレギュラー派生だけど、卵を産む哺乳類だとか、いざとなったら飛べる魚だとか...

そこで、そもそもこの分け方、掛け合わせで数が増えるってことは、複数の分類軸が混在しているからなんじゃないか、と考えます。すると、進化論で見た現代の生物学的分類と、進化論以前の、主な生息域や生態で見た分類が混ざっていることに気づきます。

生物学的な分け方は、たしかに正しい、主となるにふさわしい分類ですが、古来からのじっさいの生態による分類も、十分に意味のある特徴ですね。クジラは魚とみなされてきた海の生き物で、そう認識したほうが都合のいい場合も十分にある。

そういう、異なる軸上にある概念は、それぞれ別々にモデリングし、主となる概念に has-a 関係として、従属する特徴を橋渡しした組み合わせで表現しようとモデリングを考え直したときに出てくるのが、Bridge パターンです。

実際のプログラミングでは、たとえば、仕入れ先リストや顧客リストといった、取引先リストの派生モデルに関係するもの (What) と、HTML で表示したいか CSV でダウンロードしたいかといった、出力機能の派生モデルに関係するもの (How) を分ける。で、What が How を持つ形で組み合わさったインスタンスになる感じです。流行りの言葉でいえば、ドメインモデルとインフラストラクチャの組み合わせがユースケースだよって感じかな。

Bridge パターンは「継承よりコンポジションを好め」の典型的な例です。観念的でふわっとしていて、実体をつかみにくいパターンですが、そういうふわふわ概念にも、継承よりコンポジションがあるよということです。
blob & createObjectURL について 

[Yu0614](https://github.com/Yu0614)です!

この記事は [Oysters Advent Calender 集え、牡蠣戦士！！！7日目](https://adventar.org/calendars/4547)の記事です。

## はじめに

業務で初めて使ったので 使い方や利点、注意点など 必要そうな情報だけまとめました。
ほぼ作業メモ程度なので 参考資料程度にどぞ！

## Blob とは



* Blob = Binary Large OBjectの略、バイナリデータを表すオブジェクト,格納するための型
    * Blob は “タイプを持つバイナリデータ” を表す。
* 巨大な画像、音声ファイル、動画ファイルなどを扱うことができる
* immutable = 不変
  * blob を直接変更できないけれど、blobから値を切り出したり新しい blob を作ることは可能
* ECMA で規定された標準規格であり, html5 File API で定義されている
  * [Support Browser](https://caniuse.com/#search=blob)
  
※ File API とは、JavaScript からクライアント側のファイルにアクセスするための API

### 構成

  
```javascript

Blob = [type] + [blobParts](blob1,blob2,....str,buffer)
```

* type (option)
  * 通常 MIMEType
※ [MIME Type ](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types): 拡張子以外の方法で、転送するドキュメントの種類をブラウザに伝える方法
* blobParts
  * Blob/BufferSource/String からなる値の配列



#### 例

```javascript
// 文字列から Blob を作成
let blob = new Blob(["<html>…</html>"], {type: 'text/html'});
// 注意: 最初の引数は配列である必要あり

// 型付き配列(Uint8Array)と文字列から Blob を作成
let hello = new Uint8Array([72, 101, 108, 108, 111]); // 二進での "hello"

let blob = new Blob([hello, ' ', 'world'], {type: 'text/plain'});
```

## URL としての Blob

* type があるので ダウンロード /アップロードが容易
* [URL.createObjectURL](https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL) を使って クライアント(ブラウザ) のメモリに保存された blobに アクセス可能な一意のURLを生成可能
  * 形式は `blob:<origin>/<uuid>`
  * メモリに ある blob へのアクセスマッピング を行っている

* blob URL は他者に共有したところで 意味がない (blobがクライアント内に保存されてるため)
* ブラウザを閉じるまで URL は有効 , ただし **閉じるまでは メモリに常駐するため** 明示的に 削除する必要あり。
  * [URL.revokeObjectURL](https://developer.mozilla.org/ja/docs/Web/API/URL/revokeObjectURL) を使って メモリ開放してあげよう！　


## まとめ

今後は createObjectURL の実装なども追ってみたいなぁ :smile: 


#### 参照

* https://ja.javascript.info/blob
* https://developer.mozilla.org/ja/docs/Web/API/Blob
* https://lab.syncer.jp/Web/API_Interface/Reference/IDL/URL/createObjectURL/
Arduinoでお手軽LANケーブルチェッカー

####はじめに

[日本Androidの会秋葉原支部ロボット部 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/akbrobot) 9日目です。


LANケーブルを作ったときにちゃんと導通してるかチェックが必要ですよね。
Amazonで以下のチェッカーを購入したのですが、LEDのライトが弱いのかよくわかりません... :weary::weary:


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/07a69791-33a9-b51a-3079-d7bc3905ea7b.png" width=50%>

LANケーブル自体もしょせんは銅線、Arduinoで簡易器具を作ってみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/58a1d39e-6d72-63cf-9b3e-a1189619b99a.png" width=50%>

####作り方

材料はaitendoで買ってきたRJ45コネクタ基板、あとは家にあった中華製promicro、LEDと抵抗です。

http://www.aitendo.com/product/16726

ブレットボードを２つ横に並べて写真のように材料をすべて平行に挿します。
中華製promicroに以下のスケッチを書いたら簡単チェッカーの出来上がりです。

```c:LAN_Checker.ino

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  for (int i=2; i <= 9; i++){
    pinMode(i, OUTPUT);
  }
}

// the loop function runs over and over again forever
void loop() {
  for (int i=2; i <= 9; i++){
      digitalWrite(i, HIGH);
  }
}
```

これでどんどんLANケーブルを作っても安心です :muscle:
igraphで異なるノード（頂点）の形の図を描く方法を調べています。

前回igraphで描いた図について、異なる形のノードにする方法を調べています。
ノードの形を属性ごとに丸とか四角とかにしたいのですが、超ド素人のため方法がわかりません。
例によって恐縮ですが、不適切な点や他に良い方法などありましたらアドバイス頂けますと幸いです。

とりあえず、途中経過を書きます。

以下の図（project.csv）の読み込み。
![スクリーンショット 2019-12-07 11.00.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/22f45b18-2c68-d9d6-f763-08428a6e8b2b.png)

```ruby:R
#project.csvの読み込み
project <- read.csv("project.csv", row.names = "PROJECT") 
#matrix()で行列に変換
project <- as.matrix(project)
#resultというオブジェクトを作成。元のprojectに対する転置行列をt()で作成し、%*% 演算子で元の行列に転置行列を掛けた内容を格納。
result <- project%*%t(project)

#念のためresultの内容を確認。
> result
  a b c d e f
a 3 2 2 2 1 1
b 2 2 2 1 0 1
c 2 2 2 1 0 1
d 2 1 1 2 1 1
e 1 0 0 1 1 0
f 1 1 1 1 0 1

#igraphを読み込み
library("igraph")
#グラフオブジェクトを作成
result<-graph_from_adjacency_matrix(result, mode = "undirected",weighted=TRUE,diag = FALSE)
plot(result,edge.width = abs(E(result)$weight)*2)
```

この図ができます。
![スクリーンショット 2019-12-07 11.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/eee3790e-9f55-a820-79dd-37db46ecac06.png)

この状態で、ノード（頂点）の情報を確認すると、以下の通りです。

```ruby:R
V(result)
+ 6/6 vertices, named, from f0d6b10:
[1] a b c d e f
```

以下のHPによると、頂点の形として使えるのはvertex.shape “none”, “circle”, “square”, “csquare”, “rectangle”, “crectangle”, “vrectangle”, “pie”, “raster”, “sphere”の中から1つのようです。

- [5.1　プロットに関するパラメータ](http://www.nemotos.net/igraph-tutorial/NetSciX_2016_Workshop_ja.html)

そこで、例えば、a,b,cを四角、d,e,fを丸にしたい場合、以下のように入力してみました。

```ruby:R
V(result)$shape <- c("square", "square","square", "circle", "circle", "circle")
```
出力するとこうなります。
![スクリーンショット 2019-12-07 13.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/760e2d40-5a5f-3aee-a187-37c1f1661459.png)

これで一応、異なる形にすることはできたのですが、ノードの形が増えるといちいち設定するのが面倒な気がします。
以下のHPの方法によれば属性ごとにノードの形を変えられるようですが、未だ解読できません...

- [5.6 igraphで2モードネットワークをプロットする](http://www.nemotos.net/igraph-tutorial/NetSciX_2016_Workshop_ja.html)
形態素解析器「Sudachi」の文字コードまわり

設計者の高岡さんに以前聞いたことのメモ。


▼ 内部的にUTF8の理由

- 1: UTF16だと"0"byteを含む文字がある → dartscloneでは"0"byteを許容できない
  - シフトするときに、+0だと、そこからシフトしない → 成り立たない
  - 普通のDAではC+1しているが、dartscloneでは+1していない
    - 255のとき+1すると=256、8bitで溢れる → 9bitにはしたくない
  - UTF8ではnull文字以外で"0"はない

- 2: UTF16だと（コード割当的に？）Trieが非効率になる、という古くからの言い伝え

---

- UTF16を積極的に使いたい理由は「Javaだから」以外ない
- プラグインにはUTF8としてはみせていない（Stringでやってもらう）

▼ UTF8InputText

- `originalText`: 原入力文（UTF16）
- `modifiedText`: 正規化後文（UTF16）

---

- `bytes`: `modifiedText`のUTF8バイト列
- `offsets`: `bytes` → `originalText` の対応
- `byteIndexes`: `bytes` → `modifiedText` の対応
- `textOffset` (`UTF8InputTextBuilder`内): `modifiedText` → `originalText`の対応
現在チェックアウトしているブランチをリモートからpullしたい

## やりたいこと
現在、ローカルでチェックアウトしているブランチを簡単にpullして、リモートの最新コミット分を取り込みたい。
しかし、いちいち現在のチェックアウトしているブランチ名を入力する作業が非常にめんどくさい。

そこで、どのブランチにチェックアウトしていても汎用的に使えるpullの呪文（コマンド）を作成して、bashrc（もしくはbash_profile）に保存しておきたい。

そうすれば、自分用の呪文を唱えるだけで、超簡単にリモートとの同期が実現する。

## 現在チェックアウトしているブランチを取得するコマンド
```
git rev-parse --abbrev-ref HEAD
```
これを実行すると、現在チェックアウトしているブランチ名が取得できる。
例えば、いま、developブランチにチェックアウトしているなら、実行結果は以下のようになる。

```bash

$ git rev-parse --abbrev-ref HEAD
=> develop
```
これを応用して、次のように現在のブランチでpullする呪文を作成する。

## 現在チェックアウトしているブランチをpullするコマンド
```
git pull origin `git rev-parse --abbrev-ref HEAD`
```
これを実行すると、リモートブランチから、現在チェックアウトしているブランチと同じものをpullしてきてくれる。
例えば、いま、developブランチにチェックアウトしているなら、実行結果は以下のようになる。

```bash
$ git pull origin `git rev-parse --abbrev-ref HEAD`
=>
From github.com:workoocha/[project_name]
 * branch            develop    -> FETCH_HEAD
Updating 5e90262..24ab968
Fast-forward
 app/assets/images/missing.png                             | Bin 12591 -> 10395 bytes
...
(省略)
...
 16 files changed, 328 insertions(+), 204 deletions(-)
 create mode 100644 db/migrate/20191020053448_add_default_column_to_colors.rb
```
ちゃんとリモートdevelopをpullしてくれたのがわかります。

あとは、これを .bashrc なり .bash_profile なりに登録しておけば、いつでもどこでも簡単にpullすることができます。
ちなみに私は .bash_profile に `gpl` というエイリアスを作って使用しています。

## 余談
自分は、リモートにある別名のブランチを、ローカルにpullする機会に出会ったことがないので、gitのデフォルトが同名のブランチをpullする仕様であればいいと思っている。

別名のブランチをpullするシチュエーションがあればご教示ください。


## 参考
https://coderwall.com/p/xuq5cq/git-push-current-branch
S3オブジェクトの整合性について

## 1. はじめに

今年入って、Amazon Web Serviceを使用したアプリケーション開発する機会をいただき、様々なマネージドサービスに触りました。
その際、S3へファイルアップロードをする機能に携わったので、やった内容を残します。

### 環境

* macOS X 10.15.1
* .NET Core 2.1
* aws-sdk-dotnet

### 要件

* アップロードするファイルは主に動画ファイル(中には5GB以上のものも)
* アップロードしたファイルは、その後、各種マネージドサービスで利用可能性あり(動画変換、AI...)
* サービスポリシーの都合により、アップロードしたファイルとの整合性を担保する必要あり

## 2. やったこと

上記の要件を満たすために、ハッシュ値を使って整合性をとろうと考えました。AWSの様々な記事を読んでいくと、以下のことがわかりました。

* PUT API を使用すると、ETagにMD5のハッシュ値が入る
* ただし、マルチパートでアップロードすると、**分割したファイルのMD5値を合算した値 – 分割数** になってしまうこと
    * [こちら](https://stackoverflow.com/questions/12186993/what-is-the-algorithm-to-compute-the-amazon-s3-etag-for-a-file-larger-than-5gb/19896823#19896823)を参照した
* マルチパートアップロードの場合は各パートのアップロード時に実行する UploadPart の Content-MD5 にて、パートのMD5ダイジェスト値を渡すことで整合性の確認を行うことが可能
    * [こちら](https://aws.amazon.com/jp/premiumsupport/knowledge-center/data-integrity-s3/)を参照した
    * [こちら](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TUploadPartRequest.html)を参照した

以上のことから、リクエストデータの中にパートのMD5ダイジェスト値を入れてマルチパートを使用してアップロードを行う実装に決めました。

以下のソースコードが実装した物です。

https://github.com/Takkiiii/aws-s3-sample
※認証情報や、パスなどは任意で変えて実行してください。

以上。
〆2019年まとめ → 2020年やること

#〆2019年まとめ

**1.レベル3 303 Security取得**

現場で今後重宝される知識は以下かなと思う。
試験勉強だけではキャッチアップできてない部分もあるため、引き続き勉強予定。

325.4 DNSと暗号化（DNSSEC）
327.2強制アクセス制御（SELinux）

**2.実務**
仮想環境・サーバ・ネットワーク共に設計・構築に没頭できた一年だった。

- 仮想環境

やってることは去年とあまり変化なし。
設計・構築はこなれてきた感はある。

- サーバ

やってることは去年とあまり変化なし。
設計・構築はこなれてきた感はある。

過去の設計などを参考にするパターンの場合、その設定がなんで入っているか理解してない場合が多いが、
「調べて」「理解して」「検証して」設計をするようになった。

結果「どういう動作をするのか」、「設定しないことによる弊害」、「設定していると実は弊害」など、しっかり考える様になった。

バク対処やログ確認の精度が上がった。

- ネットワーク

FW/LBの設計・構築が勉強になった。
中規模ネットワークの冗長構成デザインを学べた。
初見で設計図を見た時の構成理解の速度があがった。ルーティングの道筋が見えてくる感じ？

- 運用

常時TLS化対応が多かった。
移行方法検討、リダイレクトの書き方など工夫を重ねて対応ができた。

#〆2020年やること

**1.応用情報技術者試験**
幅広い知識の取入れを行う。

**2. ネットワークスペシャリスト**
専門性を高める。
ひとまずネットワークが好きなので、ネスぺを目指す方向性で行く。

**3. 動的routing**
OSPF、EIGRP、BGPなど、業務レベルでの知識取得に力をいれたい。
「現場でどういう問題が良く起こるのか」、「障害時切り分けの観点」など
試験勉強ではわからない部分を学んでいきたいと思う。

**4. プログラミング**
いままで避けてきたので、とりあえずなんか作る。
今考えてるのが、自宅の温度管理とかするシステム。

**5. 基礎に立ち返る**
Linux/ciscoコマンド　ググらないで出てくるくらい体に染み込ませる。（パイプつなぎのテクニックや正規表現など）
Linuxミドルウェア系のチューニング

**6. ナレッジまとめ**
ナレッジ管理が雑になってきているので、きちんとまとめる。
RETROF-16 全回路図

#RETROF-16（令和版）の全回路図


##概略
一般のCPU（あるいはGPUやFPGA等）は一切使用せず標準ロジック（74シリーズ）とSRAMのみで作成した『RETROF-16』の回路図を公開します。画像表示回路（縦256画素×横256画素×64色）を含む全回路図となります。
コンピュータとしての性能は初期のPC-9801（i8086 5MHz）と同等以上の性能を誇ります。インベーダーゲームやBASICインタプリタ程度であれば余裕で走ります。
![R0010325.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/9397d243-ab94-6692-3d06-01ad44e5d1cc.jpeg)

（基板サイズは222mm×180mm）


###最新の回路図

回路図は随時加筆修正しています。以下は2021年1月17日現在の物で、全ての機械語命令が正しく動く事を確認した回路図です。

![最新20210117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/e047ffbb-719b-3077-7a56-fd6fd99c66bd.jpeg)

###基板発注時の回路図

基板発注時（基板製造委託時）の回路図です。最新回路図と比較すると10か所以上の相違点があります。この相違点は全て基板のパターンのカットやジャンパー線の追加等で対処しています。

![基板発注時20200806.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/2fe73838-6585-7de6-c904-3005ce8a034a.jpeg)

###基板発注以降の回路図の変更点

以下は基板発注時の回路図と最新の回路図の差異を示すために作成した図面です。パターンカットは**X**で、ジャンパー線は点線で表現しています。

![回路図の変更点.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/f130290d-8ab5-90b8-e5e9-e8baace075bc.jpeg)

<!--

###プロトタイプの全回路

![Printing 回路図を印刷.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/ec29a1dc-e27e-abe2-2175-72cf601c81f5.png)

--->
[C#] 文字列挿入を外部パラメータ化して、動的に解決したい（別解）

# これはなに？

[C#6 から $"{hoge}" みたいな感じで文字列に変数が埋め込めるようになったけど、フィールド変数で string a = $"{hoge}"; ってやるとエラーで怒られるのなんで？？ねぇなんで？？](https://qiita.com/divideby_zero/items/70fb77fca07fd9e4fac1)

を見て、面白いネタだなぁと思ったので別解です。

# TL;DR;

[C# Scripting](https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Scripting/3.5.0-beta1-final) を使用して、文字列挿入を評価実行します。

# サンプルコード

```c#
using System;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp.Scripting;

namespace Ex.InterpolatedString
{
    /// <summary>
    /// 文字列挿入に渡すパラメータ
    /// </summary>    
    public class Globals
    {
        public int foo;
        public string bar;
    }

    class Program
    {
        static void Main(string[] args)
        {
            string formattable = "foo={foo} bar={bar}"; // この部分を外部の設定ファイル等にする
            Print(formattable).Wait();
        }

        static async Task Print(string formattable)
        {
            var foo = 123;
            var bar = "abc";

            var code = $"return $\"{formattable}\";"; // C#コード作成
            var globals = new Globals { foo = foo, bar = bar }; // 匿名型にしたいけれど、アクセスできないのでこうしてます
            var result = await CSharpScript.EvaluateAsync<string>(code, globals: globals);

            Console.WriteLine(result);
        }
    }
}
```


# 実行結果

```shell-session
% dotnet run
foo=123 bar=abc
```

# この方法の使いどころ

ないかもww
当たり前ですがめっさ遅いです。
ログ出力なんかに使った日には、きっととってもつらい目にあいます。
あ、でも、非同期実行だから大丈夫かな？


# 最後に

Scriptingコンパイル結果を最初に用意しておいて、使い回せば速度の問題は解決できるかも？

プロジェクト全体はこちらに置きました。
https://github.com/sengokyu/Ex.InterpolatedString
[Flutter] デスクトップアプリ環境構築 for macOS

# 1. はじめに
FlutterアプリをmacOS環境で動かすための開発環境の構築手順をまとめています。

macOS環境でFlutterアプリを開発しつつ、iOSやAndroidエミュレータ・実機を使わずにその場でFlutterアプリの動作確認やデバッグが出来るため、とても便利です。


2021/03/04時点でのmacOSのサポート状況はベータ版となっています。ベータ版ですが、Flutter 2.0以降はstableチャネルでも利用可能です！

Linux環境の場合は[こちら](https://qiita.com/kurun_pan/items/47c25a4b2425725bc199)

# 2. 環境構築の手順

## Flutter SDKインストール

リポジトリからcloneした後、適当なパスに配置してパスを通しておきます。

```shell
$ git clone https://github.com/flutter/flutter
$ sudo mv flutter /usr/local/
$ export PATH=$PATH:/usr/local/flutter/bin
```

## Android Studioインストール （オプション）

Android向けにビルドしたり、Androidエミュレータで動作確認をしたい場合にのみインストールして下さい。当然、Android Studioをインストール済みの場合は作業不要です。

[https://developer.android.com/studio](https://developer.android.com/studio)からmacOS版をダウンロードして適当な場所に置いて、インストールスクリプトを叩きます。

Android Studioのインストールで基本的には次へを押していく感じです。

## Xcodeのインストール

ビルドにXcodeが必要なるため、ストアからインストールしてください。

## Flutterセットアップ

ターゲット環境をHost PC (macOS) にする設定を行います。[参考](https://github.com/flutter/flutter/wiki/Desktop-shells#tooling)

```shell
$ flutter config --enable-macos-desktop
```

## cocoapodsのインストール

cocoapodsはサンプルをビルドして動かすだけなら不要ですが、プラグインを追加してアプリを作成していくためには必須で必要です。

```shell
$ sudo gem install cocoapods
```

## ここまでの状況の確認

以下のコマンドを使うと、flutterを動かすためのインストール状況を診断してくれます。今回はサンプルを動かせればいいので、以下の状態でも大丈夫です。

```shell
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel master, v1.13.1-pre.58, on Mac OS X 10.15.1 19B88, locale ja-JP)
 
[!] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
[✓] Xcode - develop for iOS and macOS (Xcode 11.2.1)
[!] Android Studio (version 3.5)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.40.2)
[✓] Connected device (1 available)

! Doctor found issues in 2 categories.
```

# 3. サンプルを実行してみる

## サンプルプロジェクトの作成

```shell
$ mkdir sample
$ cd sample
$ flutter create .
```

## 実行

```shell
$ flutter run -d macos
```

もしくは、ビルドのみ行いたい場合は以下のコマンドを実行します。

```shell
$ flutter build macos
```
<img width="912" alt="スクリーンショット 2019-12-07 12.17.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259963/74076b49-7d6c-5bb8-8cbb-3540c19f78f1.png">

# 4. デスクトップ向けプラグインの動作確認

プラットフォーム依存のAndroid/iOS向けのプラグインはデスクトップ環境では利用出来ません (Dartのみのプラグインであれば、プラットフォームに依存せずに共通で利用が可能です) 。そのため、用意されているプラグインを使ったテスト済みのサンプルが`flutter-desktop-embedding`にあります。これを参考に、デスクトップ向けのプラグインの作成方法を把握することが出来ます。

## flutter-desktop-embedding取得

```shell
$ git clone https://github.com/google/flutter-desktop-embedding.git
```

## 実行

```shell
$ cd flutter-desktop-embedding/testbed
$ flutter run
```

ダークモードも対応してそうです↓

<img width="912" alt="スクリーンショット 2019-12-09 20.57.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259963/4f5da544-ed06-89bd-489c-dbb794df52e9.png">
JavaScriptで「オブジェクトのプロパティが`undefined`である」ことと「オブジェクトにまだ割り当てられていないプロパティを取得すると`undefined`が返る」ことは違う

JavaScriptで「オブジェクトのプロパティが`undefined`である」ことと「オブジェクトにまだ割り当てられていないプロパティを取得すると`undefined`が返る」ことは違う

```js
const obj1 = {
    prop1: 'hello',
    prop2: undefined,
};

const obj2 = {
    prop1: 'hello',
};
```

`obj1`と`obj2`で検証

# 違う

* console.log
* for-in文
* Object.keys


## console.log

```js
console.log(obj1);
console.log(obj2);
```

```
{ prop1: 'hello', prop2: undefined }
{ prop1: 'hello' }
```

違う

## for-in

```js
for(const key in obj1) {
    console.log(`${key}: ${obj1[key]}`);
}

for(const key in obj2) {
    console.log(`${key}: ${obj2[key]}`);
}
```

```
prop1: hello
prop2: undefined
prop1: hello
```

違う

## Object.keys

```js
console.log(Object.keys(obj1));
console.log(Object.keys(obj2));
```

```
[ 'prop1', 'prop2' ]
[ 'prop1' ]
```

違う

# 違わない

* 指定したプロパティへのアクセス
* JSON.stringify

## 指定したプロパティへのアクセス

```js
console.log(obj1.prop2);
console.log(obj2.prop2);
```

```
undefined
undefined
```

紛らわしさの発端  
違わない

## JSON.stringify

```js
console.log(JSON.stringify(obj1));
console.log(JSON.stringify(obj2));
```

```
{"prop1":"hello"}
{"prop1":"hello"}
```

違わない  
有効なJSONデータの値に`undefined`が無いので当然


# ところでundefinedとは

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects

> オブジェクトに割り当てられていないプロパティは undefined です (null ではありません)。
> 
> myCar.color; // undefined

でもオブジェクトのプロパティに対して明示的に`undefined`を割り当てることはできる。

# プロパティの追加・削除・存在確認

## 追加

JavaScriptではもともと無いプロパティを当然のように追加することができる。

`obj1.prop3 = 'value';`

## 削除

`delete`演算子を使う。

```js
const obj1 = {
  prop1: 'hello',
  prop2: undefined,
}
console.log(obj1); // 消す前
delete obj1.prop1;
console.log(obj1); // 消した後
```

```
{prop1: "hello", prop2: undefined}
{prop2: undefined}
```

## 存在確認

指定したプロパティに直接アクセスして`undefined`かどうかを確かめる方法は、プロパティの存在確認には使えないことがわかった。

プロパティとして明示的に`undefined`が割り当てられていることと、プロパティが割り当てられていないことが異なることがわかったので、その区別の仕方。

`'propName' in obj1`句を使う。

```js
const obj3 = {
  prop1: undefined,
};
console.log('prop1' in obj3);
console.log('prop2' in obj3);
```

```
true
false
```


# ただの感想

1. 未割当のプロパティを取得した際に`undefined`が返る: 納得
2. プロパティに明示的に`undefined`を割り当てられる: 納得
3. 上2つを両立: ？？？？

1か2、どちらかにしておくべきだったのでは。(TypeScriptやJavaやC#などなどでは1がコンパイルエラー)

2は、未割当のプロパティをとりあえず宣言したい場合に

`obj1.prop3 = undefined;`

みたいに書くためかもしれない？けど、それなら`delete`演算子と対になるような「プロパティ追加演算子」を用意すればよかったのでは。。

# 参考

https://nishiohirokazu.hatenadiary.org/entry/20120316/1331906887
SQLite３　終了時のエラー「...>」

#エラーの内容　
Ruby on Railsの学習中にSQLite(バージョンはSQLite3)を使用していましたが、
データベースを終了する際に誤った入力をしてしまい、「...>」という表示され、
その後、何を入力しても、「...>」が延々と表示されるようになってしまいました。

以下のような状態です。

<img width="965" alt="スクリーンショット 2019-12-04 23.28.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531818/eb9d5c26-37de-d6af-68da-2d0bb81e0b19.png">

#エラーの解決方法
調べたところ、処理が未完了だったことが原因であったため、
「...>」の後に「；」と入力し、enterをしました。

<img width="963" alt="スクリーンショット 2019-12-04 23.34.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531818/64c11541-59ee-0f24-62ae-2965df4615aa.png">

すると「syntax error」となり、通常の「sqlite>」 のコマンドプロンプト画面に戻すことが出来ました。

#正しいSQLiteの終了の方法（補足）
以下のいずれかのコマンドを入力します。

sqlite> .exit
sqlite> .quit
またはCtrl+D/C
Unityでファイルをdrag&dropしてファイルパスを取得する

gitでダウンロードする。  
https://github.com/Bunny83/UnityWindowsFileDrag-Drop  

![filepath_zip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/134c8f4f-3550-e2d4-3431-fdfb18fe2e33.png)


それを解凍して、その中にあるファイルをAssetにDrag&Drop  
![filepath_asset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/f56154dc-7366-f9f9-48c5-7ec954d1bbb3.png)



FileDragAndDrops.csを以下のようにアタッチする（ctrl + s で上書きしちゃって良い）。

```C#
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //追加
using System.Linq;
using B83.Win32;


public class FileDragAndDrop : MonoBehaviour
{
    public Text display; //インスペクタで出力するUI-Textを登録

    List<string> log = new List<string>();
    void OnEnable ()
    {
        // must be installed on the main thread to get the right thread id.
        UnityDragAndDropHook.InstallHook();
        UnityDragAndDropHook.OnDroppedFiles += OnFiles;
    }
    void OnDisable()
    {
        UnityDragAndDropHook.UninstallHook();
    }

    void OnFiles(List<string> aFiles, POINT aPos)
    {
        // do something with the dropped file names. aPos will contain the 
        // mouse position within the window where the files has been dropped.
        string str = "Dropped " + aFiles.Count + " files at: " + aPos + "\n\t" +
            aFiles.Aggregate((a, b) => a + "\n\t" + b);
        // pathはaFiles[0]の中に格納されてる
        // なぜかDebug出力されない？
        Debug.Log(str);
        // log.Add()で画面の左上に出力される
        log.Add(str);

        //UI-Text に出力
        if (display != null)
        {
            display.text = ("Dropped " + aFiles.Count + " files at: " + aPos + "\n" +
                aFiles.Aggregate((a, b) => a + "\n" + b));
        }
    }
    // 実行中はデバッグログ出ないからpathを表示する用
    private void OnGUI()
    {
        if (GUILayout.Button("clear log"))
            log.Clear();
        foreach (var s in log)
            GUILayout.Label(s);
    }
}
```

HierarchyでCreate Emptyする(GameObjectという名前で出来上がる)。
![filepath_empty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/6a3e9054-259a-4673-7242-509e462e2fdb.png)


GameObjectに、アセットしたスクリプトファイルをAdd Componentする。
![filepath_addcomponent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/ff81f23d-2877-ab12-9ed9-163e32ad376d.png)


UnityでFile → Build SettingsでStandaloneに設定してBuild And Runを押す。
![filepath_file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/2701aea5-7a43-6b15-ccf6-a89a4e7358c6.png)

↓  
![filepath_buildandrun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/9550d7f4-4945-7689-1784-7d59dc26110a.png)


これで全画面でアプリが動くから、そこにファイルDorag&Dropすればパスが表示される。  
![filepath_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/86c85fe4-d976-5e2e-e9bf-5d951e78c10a.png)

ファイルのパスはaFiles[0]，ドロップしたときの座標はaPosに格納されています。
また，<font color="red">アプリを実行しないとファイルのドロップ判定がされないようなので，更新するごとにCtrl+Bで実行してください．</font>
Vim の autoload 以下のファイルに定義する関数名の指定方法について調べた

## はじめに

Vim プラグインの勉強を続けています。勉強していて、autoload に指定した関数をどう呼ぶかについてすこしハマったので、整理のために書いておきます。

## tl;dr

autoload 以下のファイル名と関数名のプレフィックスは一致させる必要があるようです。

## autoload に書いた関数が呼ばれない

例として `Hello World` と表示する関数を `helloworld.vim` に作っていたとします。
最初、関数名を以下のようにしていました。

```vim:autoload/helloworld.vim
function! EchoHelloWorld()
  echo "Hello World"
endfunction
```

その上でプラグインを Vim に設定した上で、`:call EchoHelloWorld()` と実行しても、`E117: 未知の関数です: EchoHelloWorld` というエラーが表示されてしまいました。

## どう指定するか

[Vim のマニュアル](https://vim-jp.org/vimdoc-ja/usr_41.html#write-library-script) に記載がありました。以下抜粋します。

```
Vim には autoload という仕組みがあります。同じこと
を次のように書くことができます:

        call mylib#myfunction(arg)
        
 (中略)
 
Vim は関数の名前を見て、それが未定義なら、
'runtimepath' の中から "autoload/mylib.vim" を探します。

 (中略)

ただし、関数名の '#' より前の部分はスクリプトの名前と同じにする必要があります。
そうしないと Vim はどのスクリプトを読み込めばいいのかわかりません。
```

つまり `autoload` 以下のファイル名を起点に、そこに定義されている関数を読み込みに行くというような動きをしていることがわかります。

上記の例では、ファイル名と関数名のプレフィックスが一致していなかったため、呼び出された関数を定義できなかったということでした。

`ファイル名#関数名` というルールに則ることが必要なのですね。今回の場合は、`helloworld#EchoHelloWorld`と定義するべきでした。

## おわりに

確かな情報はやはりマニュアルですね。ブログ記事や他のプラグインの書き方も参考にしつつ、マニュアルで正否を確かめるということが必要だなと思いました。

## 参考

* [usr_41 - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/usr_41.html#write-library-script)
【iOS】実機のiOSだとクリックイベントが動作しない件でハマった【Safari】

#経緯
エミュレータでは動作していたクリックイベントが実機のiPhoneで動作確認した際、動作せず…
中々デバッグが難しいという状況もあり、Google先生に聞きまくることにしました。

#結論
ルート要素にbodyやdocumentなどを指定し、クリックを想定していないタグのidやclassに対してイベントを付与していたため。
(divタグ、pタグ、spanタグなどに対してイベントを付与すると起こる)

#実装
テンプレート側

~~~index.html
<div class='contents'>
    <div class="icon"><span class='open'></span></div>
</div>
~~~

変更前

~~~controller.js
$('document').on('click','.icon .open',function(){
   open();                                
});
~~~

変更後

~~~controller.js
$('.contents').on('click','.icon .open',function(){
   open();                                
});
~~~

#補足
・参考記事によるとその他の解消方法もあるようですが、今回は上記で解決したのでそちらで。

#参考記事
Qiita記事
[iOS で click イベントがわけのわからない動作をする件について](https://qiita.com/myzkyy/items/ce6a26c9c59612e6f515)
[iOS で、要素をタッチしてもクリックイベントが発生しない問題への対処](https://qiita.com/kmt/items/c6cc207b6ab451c5d022)
Unityで2D Objectのマテリアルの設定をすると黒くなる

別の記事でも書いたが、迷った人が検索に引っかかりやすいように一応こちらにも書いておく．

原因としてはマテリアル（物質としての質感）を設定して光がかかっていないため黒く映ってしまうようである．
そのため，マテリアルを照らしてくれるライトを追加する。

  
Hierarchyで右クリック→Light→Directional Light
にすると全面ライトアップされて明るくなる。
![light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/23d4c341-076c-9c68-7aa9-275bdf9c8389.png)
UnityでSpriteを透過させる

スプライトを透明にさせるためにはマテリアルの設定をする必要があります．

マテリアルを作成する。
![create_material.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/5451fd7e-d8a1-443e-05a7-4755a78a55a1.png)

スプライトにマテリアルを設定する。
![drag_material.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/25b77e5a-35e8-2e08-4671-bc65558db9f8.png)

そのままだと画像が暗くなるから、Hierarchyにライトを追加する。
![light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/0dbbff9c-e220-2173-3a23-3ff32bb4acb0.png)

レンダリングモデルをTransparentに変更する。
![renderingmodel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/5456d73f-5efe-fe20-2098-d8d901a13144.png)

透過率を変更する。
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/d03907de-97fa-4688-58fa-3a437ed94524.png)

これで完成。