OmniAICreator/Qiita-1.07M huggingface dataset:
SVGでお手軽にリッチなアニメーションをつけよう

今までSVGを使ったことがなかったので、お勉強がてらまとめてみました。
SVGについて順序立てて説明していくので、不要な方は飛ばしてください…！


## SVGとはなんぞや？
画像を扱う形式としてよく知られる、JPEGやPNGとの違いはなんでしょう？
それは、**ビットマップ画像**か**ベクター画像**かの違いです。
（※便宜上、ここではドットとピクセルは同義のものとして扱わせていただきます。）


## ビットマップ画像について
ビットマップ画像が、JPEGやPNGに値します。
ピクセルを用いた画像形式で、ピクセルの色などを配列情報として扱います。
1ピクセルずつ色情報を持たせることができ複雑な表現が可能なため、写真などのデータはこの形式で扱われます。

よって、ご想像のとおり、ビットマップ画像は拡大するとこうなります。
![img_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316493/2d62b0c9-9305-3d83-4a9a-f57aae09de49.jpeg)


### ラスター画像
ビットマップ画像は**ラスター画像**とも呼ばれますが、狭義の意味では違いがあり
ビットマップがピクセルの集合体を画像として表現するのに対し
ラスターはピクセルが横線状に並んだもの（ラスター線）を平行に並べた面を画像として表現します。

あくまでピクセルの集まりという意味合いで、ビットマップとラスターは同義の言葉として扱われています。

### ビットマップ：呼称の由来
> 元々は、モノクロ2値（白黒など）の画像情報を格納した初期のフレームバッファとその内容である画像情報をビットマップと呼んだ。モノクロ2値の画像はピクセルあたり1ビットの情報量で記録されており、ディスプレイのピクセル配置とメモリのビット配置が1対1で対応（マッピング）することから「ビットマップ」と呼んだのである。
（引用元：[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E7%94%BB%E5%83%8F#%E5%91%BC%E7%A7%B0%E3%81%AE%E7%94%B1%E6%9D%A5)）

ピクセルを集合として扱う画像をざっくりと「ビットマップ」と広くいっていますが
狭義の技術用語としては「ピクセルマップ」「ピクスマップ（pixmap）」と呼ぶこともあるそうです。


## ベクター画像について
ベクター画像が、SVGに値します。
ビットマップ画像がピクセル単位で情報をもつのに対し
ベクター画像は点の座標や線、面や色などの図形を表す数値情報の集合で、図形同士の関係は数学的方程式として表されるため
拡大・拡小での劣化はありません。
単純な図形で構成されている場合は、ビットマップ画像よりもデータサイズは小さくなります。
![img_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316493/5f31a981-37dc-a9f1-9f79-9228d6453964.jpeg)


以下の画像は、SVGをズームしたものです。
![img_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316493/8b4374f6-162a-1f2f-adf3-f0b8e99268fc.jpeg)


また、vectorという表記ゆえに、ベクトル画像などとも呼ばれます。


## SVGを埋め込んでみる
さっそくSVGを埋め込んでみます。

### 動きをつけない場合
単純にアニメーションをつけずにJPEGやPNGの代わりとして使う場合は、**imgタグ**を使うのが一番簡単です。
もしくは、CSSの**background-image**プロパティで指定することもできます。

```html
<p>imgタグを使う場合</p>
<img src="./01.svg" alt="">
```
![img_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316493/df1ca884-b670-acf1-e0f3-120ea042c559.jpeg)


```html
<head>
<style>
.svg {
  background: url(./01.svg) no-repeat 0 /100%;
  margin: 0 auto;
  width: 140px;
  height: 55px;
}
</style>
</head>

<body>
<p>backgroundプロパティを使う場合</p>
<div class="svg"></div>
</body>
```
![img_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316493/bccb23e6-d607-6228-3730-4a51b936f2fc.jpeg)


### 動きをつける場合
次に、SVGアニメーションをつけたい場合です。（この記事のメインになります！）
CSSアニメーションを使う方法と、JavaScriptを使う方法があります。

まず共通するのは、SVGをエディタで開いてコードをまるっとコピペすることです。
これは後ほどアニメーションさせるときにコードを載せるのでそちらをご覧ください。

**① CSSアニメーションを使用する。**
まず、お手軽にできるのがCSSアニメーションを使った方法です。
SVGのプロパティは色々あるので、検索してみてください！

コードやアニメーションなどの内容は、以下のコードペンをご覧ください。
https://codepen.io/chelcat3/pen/JjoRgJj

CSSアニメーションを使う方法はかなりお手軽でよいのですが、残念ながら現状IEには対応しておりません。

**② JavaScriptでアニメーションさせる。**
次はJavaScriptでアニメーションさせる方法です。
JavaScriptでイチから書こうと思うとかなり大変なので、ライブラリを使うことをおすすめします。

今回は[vivus.js](http://maxwellito.github.io/vivus/)を使ってみます。

こちらも、コードやアニメーションなどの内容は、以下のコードペンをご覧ください。
https://codepen.io/chelcat3/pen/eYmBOxB

調べてみると、IE11は対応していると多く見かけましたが、自分の環境だと**fill-opacity**が上手くアニメーションされていませんでした。


## まとめ
まだまだ勉強途中なので、これからもがんばります。
Python CSVファイル文字コード変換、ファイル名抽出、読み込み、出力、マージ操作

自ら作成した一斉にcsv入出力、変換させる自動化処理の
資料を一箇所で見かけなかったので備忘録です。

ライブラリ呼び出し

```
import csv
import pandas as pd
import numpy as np
import os
import glob
from pathlib import Path
```
フォルダごとShift-JIS/sjis ファイルを一斉にUTF-8に別のフォルダへ変換出力

```
###################################################
# 特定フォルダにあるShift JISのファイルをUTF-8に変換
# inフォルダにあるものを読み込みオリジナルは残したまま
# outフォルダに保存
print("Shift JIS to UTF-8 Start!")
p = Path("./in")
files = list (p.glob("*.csv"))
for file in files:
        shift_jis_file = pd.read_csv(file,encoding='Shift_JISx0213')
        file_path = f'out/{file.name}'
        shift_jis_file.to_csv(file_path)
print("Shift JIS to UTF-8 End!")
###################################################
```
処理させるファイル名読み込み
（今回はfilelist.csvに処理させたいファイル名を列挙しておく）

```
#処理させたいファイルリストの読み取り
#（ファイル名のみ一列に記載）
filelist = pd.read_csv('./filelist.csv')

#ファイルごとのループ処理
for index, row in filelist.iterrows():

    #処理するファイル名を１行ごと読み取り
    a_list=str(row.values)

    #入出力パスの定義：読み取ったファイル名をかっこなし、アポストロフィなしにして変数格納、フォルダ名とジョイン
    inputpath=str('./out/'+a_list)
    inputpath=inputpath.replace("'", '')
    inputpath=inputpath.replace('[', '')
    inputpath=inputpath.replace(']', '')

    #入出力パスの定義：読み取ったファイル名をかっこなし、アポストロフィなしにして変数格納、フォルダ名とジョイン
    outputfolder=str('./converted/')
    outputpath=str('./converted/'+a_list)
    outputpath=outputpath.replace("'", '')
    outputpath=outputpath.replace('[', '')
    outputpath=outputpath.replace(']', '')

    #入出力パスの定義：読み取ったファイル名をかっこなし、アポストロフィなしにして変数格納、フォルダ名とジョイン
    mergedpath=str('./merged/tsestockdata.csv')
    mergedpath=mergedpath.replace("'", '')
    mergedpath=mergedpath.replace('[', '')
    mergedpath=mergedpath.replace(']', '')
```
実際のローデータのファイル（UTF-8に変換したファイルの処理）、
不要行削除、特定の文字列を一斉追加するなどのカラム追加操作

```
    #読み取りファイル
    df = pd.read_csv(inputpath, header=None)
    
    #特定の値を抽出、抽出した値をカラムの最終列に追加
    tradingdate=inputpath[-14:-4]
    df['TradingDate']=tradingdate

    ##########不要行削除、列名再命名

    df.columns = df.iloc[0]
    df = df.reindex(df.index.drop(0)).reset_index(drop=True)
    df = df.reindex(df.index.drop(0)).reset_index(drop=True)
    df.columns.name = None    
    df.columns = ['Rank', 'Code', 'Market','Company','EndingPrice','PriceChange','PercentChange','Volume','TradingDate']
```
csvの個別書き出し

```
    ##########不要行削除、列名再命名のcsv書き出し処理

    df.to_csv(path_or_buf=outputpath, sep=',', na_rep='', float_format=None, columns=None, header=True,
      index=True, index_label=None, mode='w', encoding=None, compression=None, quoting=None,
      quotechar='"', line_terminator='\n', chunksize=None, date_format=None,
      doublequote=True, escapechar=None, decimal='.')

    print("Convert File Processed:"+a_list)
```
csvファイルのマージ作業（BIで集約された一つのファイルを呼び出す形式のほうが楽なため）

```
##########特定フォルダにあるcsvファイルの全マージ
DATA_PATH = outputfolder
All_Files = glob.glob('{}*.csv'.format(DATA_PATH))
list2 = []
for file in All_Files:
    list2.append(pd.read_csv(file))
df = pd.concat(list2, sort=False)
df.to_csv(mergedpath, encoding='utf_8')
print("Merge Process End!!")
##########
```
【C#】リクエストをJSONで受け取って、JSONをレスポンスする

この度、業務で未経験のC#を使ってAPIを作る機会がありました。
色々調べながらの作業だったので、同じ様な境遇に合っている人に向けて、「自分の場合はこれでできたよ」っていう内容を書いておきます。少しでも解決の一助になればと思います。

#自分のスキル
- VisualStudioってなに？
- .NETってなに？
- C#ってJavaみたいに書けるんでしょ？

っていうレベルの完全初心者です。なんとか作った今でもほとんど分かっていません。
間違っている箇所があれば修正しますので、ご指摘いただければ幸いです。

#環境
- mac
- Visual Studio Community 2019 for Mac
- C#

#プロジェクトを作る

Visual Studioを立ち上げるとプロジェクトの雛形（テンプレート）を選択することになったので、「.NET Core > Webアプリケーション（モデル ビュー コントローラー）」を選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510032/816d722b-f6aa-210b-d498-ba3ef5ee5a2f.png)

3つ上にある「API」でもよかったのですが、作ったAPIをViewで表示したかったのでこれを選びました。

#リクエストで渡されてくるJSONをオブジェクトに格納する

#（例）リクエスで渡ってくるJSON
```json
{
  "name": "なまえ　たろう",
  "email":  "taro@example.com",
  "favorites": [
    {
      "name": "ランニング",
      "detail": "走ります。"
    },
    {
      "name": "movie",
      "detail": "映画みます。"
    }
  ]
}
```

##コントローラの雛形
```HomeController.cs
        public IActionResult Index()
        {
            return View();
        }
```

テンプレートを選択するとコントローラクラスが出来上がっているので、以下の様に追記していきます。

##POSTでJSONを受け取る
```HomeController.cs
        [HttpPost]
        public IActionResult Index(RequestJson request)
        {
            return View();
        }
```

`[HttpPost]`を書くと、「/コントローラ名/メソッド名」というURLにPOST通信でリクエストが来た時に動くメソッドになります。
そして、引数の`RequestJson request`は自分で作ったクラスです。こうすると、DI的な機能なのでしょうか？　.NETフレームワークが良い感じにJSONをこのクラスのメンバー変数に入れてくれます。よくわかってません。

他の言語でもいいので、何かしらのフレームワークを使った事がある人なら、なんとなく分かるのではないでしょうか。僕はSpring FrameworkやLaravelをちょっとかじっていたのですが、同じような感じですね。

##JSONを格納するクラス
```RequestJson.cs
namespace sample.Objects
{
    [DataContract]
    public class RequestJson
    {
        [DataMember]
        public string name { get; set; }
        [DataMember]
        public string email { get; set; }
        [DataMember]
        public List<Favorite> favorites { get; set; }


        [DataContract]
        public class Favorite
        {
            [DataMember]
            public string name { get; set; }
            [DataMember]
            public string detail { get; set; }
        }
    }
}
```

渡ってくるJSONの形式に合わせてクラスを作成します。
ちなみに、JSONと変数を完全に合わせなくてもエラーにはなりませんでした。
JSONにはあるけれど、クラスには定義していないものは無視されます。（当たり前ですが、変数を定義していないので取得できない）

#JSONをレスポンスする

## 先ほどのメソッドに追記・変更
```HomeController.cs
        [HttpPost]
        public IActionResult Index(RequestJson request)
        {
                //レスポンス生成
                ResponseJson response = new ResponseJson();
                response.code = 1;

                return Json(response);
        }
```

リクエストの受け取りと同じように、`ResponseJson`というレスポンス用のクラスを定義して、それを`Json`クラス（.NET標準で使えるクラスだと思われる）に入れてreturnするだけでJSON形式で返してくれました。ここら辺も他のフレームワークと同じ感じですね。

##レスポンスJSON用のクラス
```ResponseJson.cs
namespace sample.Objects
{
    [DataContract]
    public class ResponseJson
    {
        [DataMember]
        public int code { get; set; }
        [DataMember]
        public string message { get; set; }
    }
}
```
ここでは書いていませんが、リクエスト時と同様に、定義してやれば配列やネスとしたオブジェクトもちゃんとJSON形式に変換してくれます。


#参考
色々と参考にさせて頂いたサイトがあるのですが、見過ぎて覚えていません。。
ほんの一部ではありますが列挙いたします。

- https://dev.classmethod.jp/etc/c-sharp-json/
- http://bebian.hatenablog.com/entry/2015/01/21/232536
PostgreSQLとDockerでDjangoを起動

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[箕牧和廣](https://qiita.com/mimaki_kazuhiro)です。
今回はPostgreSQLとDockerでDjangoを起動させる手順について書いていこうと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

##docker_djangoフォルダを作成
デスクトップに「docker_django」フォルダを作成。

```sh:terminal
$ cd desktop
$ mkdir docker_django
```

docker_djangoフォルダに3つのファイルを作成。

```sh:terminal
$ cd docker_django
$ touch requirements.txt
$ touch Dockerfile
$ touch docker-compose.yml
```

##requirements.txt
使用したいパッケージを記述。今回はDjangoのみ。

```requirements.txt
django==2.2.2
```

##Dockerfile
Dockerfileは、Docker Hubからイメージを取得して、それを元に新たなイメージを作るまでの流れを１つのファイルに記述しておくことができる。 Dockerfileを用いれば、複雑なイメージの作成を簡単にでき、他のホストOSでもすぐに同じ環境を用意できる。

```sh:Dockerfile
# 一番軽いpythonをインストール
FROM python:3.7-slim

# 環境変数の設定
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# ディレクトリー設定
WORKDIR /code

# Dependenciesをインストール
COPY Pipfile Pipfile.lock /code/
RUN pip install pipenv && pipenv install --system

# projectをコピー。「.」の後にspaceあるからね
COPY . /code/ 
```

##docker-compose.yml
Docker Composeは、コンテナをまとめて操作するための機能。 コンテナ１つ１つを「docker run」で起動して構築するのは、起動順番を考慮したりオプションを使い分けたりしなければならないため大変。

Dockerfileが、「１ファイルにつき１つのイメージを作る」だけなのに対して、Docker Composeは「１ファイルでDocker Hubからのイメージの取得と、コンテナの生成や実行を複数同時に行う」ことができる。

```sh:docker-compose.yml
version: '3.7' #Docker Composeのバージョン

services:
  web: #コンテナに名前をつける
    build: .  #Dockerfileがあるディレクトリへのパス
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code  #ホストPCのカレントディレクトリとコンテナ内のcodeディレクトリを同期させる
    ports:
      - 8000:8000
    depends_on:
      - db
  db:
    image: postgres:11  #postgresを定義
```

##コンテナを起動させ、Djangoプロジェクトを作成
dockerコンテナを起動させ、「site」プロジェクトを作成。

```sh:docker_django
$ docker-compose run --rm web django-admin startproject site .
```

startapp、migrateコマンドも同様。

```sh:docker_django
$ docker-compose run --rm web django-admin startapp app
$ docker-compose run --rm web python3 manage.py migrate
```

runコマンドには--rmオプションをつけているので、コマンドが実行されるとコンテナはすぐ削除される。--rmオプションをつけ忘れると、コマンドを実行するたびにコンテナが作られて溜まっていくことになる。


##settings.pyを編集
POSTGRESQLをDatabaseに指定したいので、settings.pyを編集。

```site/settings.py
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432
    }
}
...
```

最後に、「docker-compose up」でローカルサーバーを起動。

```sh:terminal
$ docker-compose up
...
web_1  | Django version 2.2.2, using settings 'blog.settings'
web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.
```

[http://127.0.0.1:8000/](http://127.0.0.1:8000/)にアクセスすると、Djangoのページが表示される。
AWS Cloud MapのInstanceをCloudFormationで更新する際にエラー

少々挙動がわかりにくかったのでメモ。

# エラー内容

```bash
The following resource(s) failed to create: [FIZZBUZZ].
xxxx|fizz already exists in stack arn:aws:cloudformation:ap-northeast-1:xxx:stack/service-map2/xxx-xxx-xxx
```

# 原因

- 論理IDを変更した結果`InstanceId`が重複するから

# 再現手順

以下のCFテンプレートをデプロイ。

```yaml
AWSTemplateFormatVersion: '2010-09-09'

Resources:
  # Namespaces
  NS:
    Type: AWS::ServiceDiscovery::HttpNamespace
    Properties:
      Name: foo.local

  S:
    Type: AWS::ServiceDiscovery::Service
    Properties:
      Name: bar
      NamespaceId: !GetAtt NS.Id

  FIZZ:
    Type: AWS::ServiceDiscovery::Instance
    Properties:
      InstanceAttributes:
        env: staging
      InstanceId: fizz
      ServiceId: !GetAtt S.Id
```

次に、論理ID `FIZZ` を変更してデプロイ。

```yaml
AWSTemplateFormatVersion: '2010-09-09'

Resources:
  # Namespaces
  NS:
    Type: AWS::ServiceDiscovery::HttpNamespace
    Properties:
      Name: foo.local

  S:
    Type: AWS::ServiceDiscovery::Service
    Properties:
      Name: bar
      NamespaceId: !GetAtt NS.Id

  FIZZBUZZ:
    Type: AWS::ServiceDiscovery::Instance
    Properties:
      InstanceAttributes:
        env: staging
      InstanceId: fizz
      ServiceId: !GetAtt S.Id

```

で、エラー発生。
`InstanceId` が重複するから、というのが理由らしい。CFのその他のリソースではそこらへんうまいことやってくれる印象だが、Cloud Mapのインスタンスでは論理IDのみを変えるとエラーが発生するので注意。

`InstanceId` を変更すれば無事に通る。内部的には新論理IDの作成->無くなった論理IDの除却という挙動をするための模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/110a37d0-e453-0382-0afb-3df25f51eab4.png)
ipv6 nd ra suppress撲滅活動

# はじめに

この記事は [IPv6 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ipv6) の 16日目の記事として投稿しています。

# TL;DR

Cisco(や、何故かそれに酷似した設定体系)のIPv6ルータで、意図せず

```
 ipv6 nd ra suppress
```

と設定するケースが多いよう(Googleで検索に引っかかりやすい？)

```
 ipv6 nd ra suppress all
```

の誤りであることが多いので、設定の見直しをしてみてね、というお話。とにかく all をつけるのだ!!


この記事自体は、JANOG44 での [IPv6トラブルシューティングMini](https://www.janog.gr.jp/meeting/janog44/program/ipv6trbl) の焼き直しです。


# なぜ `ipv6 nd ra suppress` はだめなのか

## all をつけないと何が起きる？

“all” をつけなくても、定期的なRA送出は抑制されるので、⼀⾒、RA抑制ができたように思えます。しかし、この状態でも、RS(Router Solicitation)パケットを受け取ると、RAを返してしまいます。

よくある？のは、**Auto-configuration が On なノードがリンクを上げたタイミングで送出する RSパケットを受け取ってしまうケース** です。

自動設定でつけられる IPv6アドレスには寿命があります。defaultの設定[^1]では30日後です。

で、運悪く、30日間、RA が流れないと、寿命が過ぎてアドレスが無効化します。

[^1]: [RFC4861](https://tools.ietf.org/html/rfc4861): [Router Configuration Variables](https://tools.ietf.org/html/rfc4861#section-6.2.1)内のAdvValidLifetimeの default値に従っている実装が多い(2592000 seconds (30 days))

## expire した、そのあと 〜 direct connect経路の喪失 〜

意図せず自動設定が On になったノードであろうとも、おそらくは手動で

- IPv6アドレス設定
- gatewayの設定

は行われているかと思います。たとえば、2001:db8::cafe/64 を手動でつけると

- 手動でつけたアドレス
    - 2001:db8::cafe   
- それに伴う on-link prefix
    - 2001:db8::/64

　が生成されます。この時、RA を受け取るとなにが起きるのか？

　前者は"an address configured by sateless autoconfiguration" (RFC4862 5.5.3 e)ではないので、RAのライフタイムの影響を受ません。後者はRFC4861のPrefix Listの要素として管理されているので、RFC4861 6.3.4 にしたがってライフタイムも更新されます。

つまり、ワーストケースで、1ヶ月後に 2001:db8::/64 の経路が喪失してしまうということになります(実際に疎通性が失われるかどうかは、実装に依存）。この結果、gatewayの設定を global unicast adderss で指定しているケースでは、gatewayへの到達性がなくなるという結果になります。

## 影響を受けないケース

- そもそも自動設定を無効化したホスト
    - まぁ固定でアドレスつけるなら、無効化しとけという話ではあります。
- next-hop に IPv6 global unicast address ではなく、link-local address を利用したケース
    - ただしこの場合も、同じ /64 な prefix を使った同一セグメントのサーバとの通信がNGになる。
- static でつけたときの /64 の経路を消えないように対処した？実装もある模様


# allなしコマンドってバグ？

いいえ、だそうです。懐かしのISATPでは、tunnel を通じて RA を流します。ルータでは tunnel を通じて multicast パケットを流すのが難しいので、RS にだけ答えるモードが求められて、実装されたそうです。今となっては、という感じでしょうか。

# まとめ

細かいことはいいので

```
 ipv6 nd ra suppress all
```

って書こうぜ！！いまだに all な設定が抜けているルータを各所でみるので、いますぐ見直そう！
paizaでアセンブラ その13

#概要

paizaでアセンブラ、やってみた。
練習問題やってみた。

#練習問題

printfは、使わないでfizzbuzz。


#サンプルコード


```

.code32
.text
.global main

main:
    mov     $1, %esi
loop:
    mov     %esi, %eax
    mov     $15, %ebx
    div     %bl
    cmp     $0, %ah
    jz      loop15
    mov     %esi, %eax
    mov     $5, %ebx
    div     %bl
    cmp     $0, %ah
    jz      loop5
    mov     %esi, %eax
    mov     $3, %ebx
    div     %bl
    cmp     $0, %ah
    jz      loop3
	mov 	%esi, %eax
loop2:
    push    %esi
	call 	bin2dec
    pop     %esi
loop1:
	add     $1, %esi
	cmp     $101, %esi
    jnz     loop
	ret

loop15:
    mov 	$fizzbuzz, %ecx
    mov	    $4, %eax
	mov	    $1, %ebx
	mov 	$9, %edx
	int	 	$0x80
    jmp     loop1
loop5:
    mov 	$buzz, %ecx
    mov	    $4, %eax
	mov	    $1, %ebx
	mov 	$5, %edx
	int	 	$0x80
    jmp     loop1
loop3:
    mov 	$fizz, %ecx
    mov	    $4, %eax
	mov	    $1, %ebx
	mov 	$5, %edx
	int	 	$0x80
    jmp     loop1
	
bin2dec:
    mov     $100, %bl
    div     %bl
    push    %eax
    call    putd
    pop     %eax
    mov     %ah, %al
    and     $0xff, %eax
    mov     $10, %bl
    div     %bl
    push    %eax
    call    putd
    pop     %eax
    mov     %ah, %al
    call    putd
    mov     $10, %eax
    call    putd
    ret
putd:
    and     $0x0f, %eax
    mov     $num, %ecx
    add     %eax, %ecx
	mov	    $4, %eax
	mov	    $1, %ebx
	mov 	$1, %edx
	int	 	$0x80
	ret
	
.data
fizz:
	.ascii 	"Fizz "
buzz:
	.ascii 	"Buzz "
fizzbuzz:
	.ascii 	"FizzBuzz "	
num:
	.ascii 	"0123456789 "
	


```

#成果物

https://paiza.io/projects/Bqf8DslDoJUw2t8xJunk-Q

以上。
Unityでフリーの効果音素材を再生

#Unityで無料で使える効果音を再生する
Unityでゲームを作る時に必ず必要になってくるのが、効果音の再生です。

##Unityで効果音を鳴らす
使用できる音声ファイル形式は .aif　.wav　.mp3　.oggです。
今回はmp3を使ってみることにします。

まず、効果音素材を手に入れる必要があります。
無料の効果音素材を配布している[効果音工房](https://umipla.com)からダウンロードしておきましょう。
こちらの[効果音工房](https://umipla.com)はフリーの効果音を配布されています。
利用規約も大変ゆるく、リンクやクレジット表記も必要ないため、ゲーム制作などに大変使いやすいです。

お好みの効果音をダウンロードしたら、早速鳴らしてみましょう。

####1.音を出したいオブジェクトに**AudioSource**コンポーネントをつけます。
####2.**AudioSource**の**Audio Clip**に音声ファイル(koukaon.mp3)をセットします。

![no1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545261/8ed2fd07-9130-b12a-59e3-1bac2aaafc7c.png)


とりあえずこれだけで効果音を再生することができます。

試しにゲームを実行してみてください。


実行後に効果音が鳴ったのが確認できたと思います。


##指定したイベント時に効果音を再生する
とりあえず効果音が再生されるのは確認できましたが、この状態だとオブジェクトが生成された時に鳴ってしまうことになります。
少ないオブジェクトで実行されるゲームなどでしたら、この方法で効果音のオブジェクトを生成して再生する方法でもまあなんとかなるかもしれません。

ですが、オブジェクトの生成には時間がかかってしまいます。
効果音を鳴らしたいその瞬間に生成が間に合わなくなり、ズレて効果音が鳴ってしまうことも考えられますね。

そこで、何かしらのイベントに対して効果音を鳴らす方法を考えてみたいと思います。

####1.空のオブジェクトを生成し、**AudioSource**コンポーネントをつけます。

これは先程と同じですね。


####2.そのオブジェクトにスクリプトをアタッチします。

スクリプトを生成して、それをアタッチします。
スクリプトの中身はこのようになります。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour {
 
public AudioClip sound;
AudioSource audioSource;
 
 void Start () {
   audioSource = GetComponent<AudioSource>();
 }
 
 void Update () {
   // スペースキーの取得
  if (Input.GetKeyDown(KeyCode.Space)) {
   //音を鳴らす
    audioSource.PlayOneShot(sound);
   }
 }
}
```


####3.スクリプトの**AudioClip**の変数(sound)に効果音をアタッチします。

![no2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545261/9ff90dc4-013d-09e4-1b75-fa3e032b769e.png)


これでスペースキーを押した際に効果音が再生されるようになります。

audioSource.PlayOneShotというのは、引数に指定したAudioClip（効果音）を1度だけ再生するというものになります。


複数の効果音を用意して鳴らしたい場合は、AudioClipの変数を複数用意して、条件分岐させてそれぞれaudioSource.PlayOneShotをしてやることで実装可能です。



いかがでしょうか。
今回は簡単にUnityで効果音を再生する方法をまとめてみました。
AudioClipの保持の仕方で色々と最適化することもできると思います。

今回は[効果音工房](https://umipla.com)さんのサイトの効果音を使用させていただきました。
ゲームを作るにあたって、効果音が付くと一気にゲーム感が増しますね。
YAMAP iOSアプリのCI環境のおはなし

この記事は、[YAMAP エンジニア Advent Calendar 2019](https://qiita.com/advent-calendar/2019/yamap-engginers)の17日目の記事です。

※ 主に 2019/12/11 に行われた [【福岡】 CircleCIユーザーコミュニティミートアップ#3](https://circleci.connpass.com/event/154878/) で発表した内容のおまけです。


## 発表した資料

- [スライド](https://speakerdeck.com/tkysfjk/yamap-iosapurifalsecihuan-jing-falseohanasi)
- [YAMAP iOSアプリでつかってる .circleci/config.yml](https://tkysfjk.github.io/files/2019-12-11-circleci-meetup-fukuoka-3/config.yaml)


## 要約
- チケット駆動開発してるよ
- レポジトリは GitHub org つかってて、Git flow + GitHub flow なレポジトリ運用してるよ
- PR作成毎にCI動かしてるよ
- CIで使うコマンドは手元のPCで動くやつだよ
- ベータテストには TestFlight つかってるよ
- YAMLのAnchors/Aliases を使ってコードの重複を防ごうとしてるよ
- 著者はそもそもCIはこき使ってなんぼだと思ってるので、[[ci skip]](https://circleci.com/docs/2.0/skip-build/)なんて使わず、どんな細かい修正でもCIにぶん投げているよ
  - でもチームのメンバーは`[ci skip]`使ったりしてるよ
- おしまい


## 参考資料
- [継続的インテグレーション](http://objectclub.jp/community/XP-jp/xp_relate/cont-j)
  Martin Fowlerが2000年頃にCIについて解説した記事の日本語訳。とても古いけどCIのコンセプトを理解するには十分と思われる。[原文はもうちょっと新しい](https://www.martinfowler.com/articles/continuousIntegration.html)。
- [Reusing Config - Orbs Reference Guide - CircleCI](https://circleci.com/docs/2.0/reusing-config/)
- [Writing YAML - Anchors and Aliases](https://circleci.com/docs/2.0/writing-yaml/#anchors-and-aliases)
自分のつくったRobloxを世界中へ公開する方法

#手順
1. RobloxStudioの「File」→「Publish to Roblox」を選択
2. 「New Place」をおす
3. 名前(name)と説明(description)を入力
4. 「Create Place」をおす
5. 「100% Completed」が表示されたら、青い「Next」のボタンをおす
6. 「DONE」のボタンをおして完了です
URIへの意識とCool URI

## はじめに
これはTreasure Advent Calendar 2019の15日目のポエムっぽいナニカです。（1日遅れてごめんなさい）
こういう投稿自体初なので、温かい目で見守っていただけるとありがたいです。

## お前は誰
Web系でぼちぼちインターンをしたりしてきたB3の学生です。
就活真っ只中で自分のCS基礎力の低さを目の当たりにしたので、本とか読んで再勉強中です。
今回の内容に関しては[Webを支える技術](https://www.amazon.co.jp/exec/obidos/ASIN/4774142042/ysk1180-22/)を読んで勉強させていただきました。感謝🙏

## 何についてのポエムか
本に出てきて今までない知識だったURIのお話と、URI設計でよいとされているCool URIについて。

# 本題
みなさんURIって聞いたことがありましたか?
URLはよく聞きますが、日常から耳にするわけではないと思います(自分だけかも)。

URIとURLの違いについて書こうと思ったのですが、[とてもいい感じにまとめてくださっている記事](https://qiita.com/Zuishin/items/3bd56117ab08ec2ec818)があるので読んでいただくとわかるかと思います。

### 超ざっくりと用語説明
URI(Uniform Resource Identifier)
 ・ URLとURNをあわせて呼ぶときの名前

URL(Uniform Resource Locator)
 ・ リソースの場所を示すもの

URN(Uniform Resource Name)
 ・ URLだけでは更新されるとリソースにたどり着けないので、ドメイン名などから独立してつけられる名前

URIの方が広義なので、URLやURNのことをURIと呼んでもいいらしいです。
ただ、URIはそもそもIdentifierで、これらセットで初めて示すリソースが一意に定まるのでは？と思っているのでちゃんと呼び分けていきたいな〜と思ったりしてます。

### Cool URI
今回一番話したかったのはこれ。
これはいったいどういうものなのかというと、
>クールなURIとは変わらないもののこと。
[クールなURIは変わらない](https://www.kanzaki.com/docs/Style/URI)より引用。

ここに言われているように、変わらないURIこそが良いURIであるという考え方です。

**<!-- ここからガチポエム -->**

今まで僕は、他人がそのURLを見て、リソースがどんなものなのか、何をしているかが明確にわかるものがいいURLだ！と思ってAPIを作ってきました。
しかしこれは目先の見やすさ、開発のしやすさだけを考えた決め方になっていたのですねぇ。

じゃあ何を根拠に変わらないことが良しとされているのか？
それはユーザの気持ちになればわかるというものです。
ユーザーはURLが変わったことなんて知る由もないですし、知ろうとも思わないのです。(お知らせを出せば話は変わるでしょうが…)

また、皆さんリンク切れに出くわすととんでもなくテンション下がりますよね、僕は出くわした瞬間にそのサイトを信頼しなくなります。
なので恒久的にアクセスできることと、信頼性は超密接なものであると思います。

安定的にユーザーに使ってもらい、サービスを成長させようとするならば、CoolURIをしっかりと意識すべきなんじゃないかと思ったわけです。

### 不変のURI実現のために必要なこと
まずはこれらをURIに含めないことが求められています。
 > - 作者名
 > - 件名
 > - 状態
 > - アクセス権
 > - ファイル名の拡張子
 > - ソフトウェアのメカニズム
 > - ディスク名
 > - 上記は[クールなURIは変わらない](https://www.kanzaki.com/docs/Style/URI)より引用

さらに、本で学ばせていただいた教訓として、実装に依存するものも含めてはいけないということ、名詞を使うことなどもありました。
実装に依存するものとして、僕が犯していた間違いの中で最も大きいと考えたのは、メソッド名を含めてしまうというものです。

これは例ですが、
サービス利用者の購入済み商品を返すAPIとして、`purchased_item`という名前のものを作ったとします。
user has many items だと思って進んで下さい。

そうすると今までの僕のやり方で行けば
`https://hogehoge.com/users/1/items/purchased_item`
とかになるんでしょうが、これはメソッド名を含めてしまっていて良くないということにますね。
（命名がクソとかは置いといて、、、)

ただ、こればっかりはしょうがないんじゃないか？と思いました。
ただのサイトならメソッド名を含めずとも実装し切ると思いますが、特定の条件のものを引っ張ってくるためにAPI作ったんだし名前に含めても、、、と。

ただよく考えてみると、購入物はしばしば英語の名詞でpurchasesと表されるので、itemsとは別にpurchasesというテーブルを用意して、購入済みのもののidとか入れておいて、
`https://hogehoge.com/users/1/purchases`
とかにすることができます。
これによってテーブルが増えるのがネックな気はしますが、いまのCoolURIを目指す僕にとってこんなものは壁ではないのです。(これが正しいかは教えて下さい偉い人🙏)

これにより僕の最初に作ろうとしたクソURLはおそらくCoolになりました。
これを最初から知っていたらそもそもDBの設計から変わってくる話かもしれないので、覚えておいて損はないなってことでご紹介しました。
CoolURIでした。

また、API設計について色々調べてみると、世の中には[僕の疑問を解決してくれるありがたいもの](https://dev.classmethod.jp/architecture/cmdevio2018-api/)がありました。
ここにあるスライドの33pの考えに習うと、まだ他にもURLの設計ができるのでは？と思いとても楽しそうだと思いました。


## 終わりに
個人的な理由で時間もなく、かなり浅いポエムとなってしまいましたが、自分が今まで意識してこなかったURIの設計やCoolなやり方について少しでも共有できてたら嬉しいです。
あと、フレームワークを使ってるとあまり意識せずにきれいになってることもあると思うので、先人の偉大さに感動したりもしました。

間違い箇所等ありましたら教えていただけるとありがたいです。
以上！初ポエムでした！
Azure CosmosDB でPKが設定されていないドキュメントを削除する (Java SDK)


PK が値として設定されているドキュメントを削除するには

```java						
options.setPartitionKey(new PartitionKey(pkValue));
client.deleteDocument(doc.getSelfLink(), options);
```

とすればよいのですが、PKが設定されていない文書を

```java						
options.setPartitionKey(null);
client.deleteDocument(doc.getSelfLink(), options);
```
や

```java						
client.deleteDocument(doc.getSelfLink(), null);
```

のように削除しようとするとなぜか

```
PartitionKey value must be supplied for this operation.
```
のエラーが返されます。


これを回避するためには

```java
// com.microsoft.azure.documentdb.Undefined
options.setPartitionKey(new PartitionKey(Undefined.Value()));
```

としないといけない仕様となっているようです。
Javaのみならず、他の言語でも同様のようです。

（そもそも値が存在しないのだから null で通すようにしてくれたらいいのに、と思うのですが）
Shellとは

Shellに関する基本的な知識をまとめていきます。


##Shellとは
シェルはOSの中核であるカーネルと対話するためソフトウェアのことです。表現を変えれば、人間とPC(カーネル)は直接やりとりができないのでシェルがやり取りの仲介役となってくれているというもの。

##ターミナル・コンソール
ターミナル、コンソールはどれもCUIでLinuxにコマンドを打ち込むときに使用するものです。これら二つはシェルと同じであるとよく間違えられますが厳密には違う意味を表しています。それぞれ一つずつ説明します。

**コンソール**
現時点で「コンソール」というと一般的に黒い画面でコマンド入力を受け付ける画面を指すことが多いです。

**ターミナル**
コマンド入力を受け付ける点はコンソールと同じですが、GUIの上でCUIの操作をしたいときに使用するアプリケーションという点でコンソールとは異なります。

**コンソール&ターミナルでコマンド入力を受け付け、受けた入力をシェルが仲介して、PC(カーネル)に分かるようにしているイメージ。**

##BashとZsh
BashもZshもシェルの一種を表します。
基本的なシェルとしてBashが多く導入されていますが、Zshには以下のような導入メリットがあります。

**Zsh**

・カスタマイズができる
・他のシェルの機能を取り込んでおり、性能が高い
・軽量
・ユーザーの起動している全てのzshでコマンド履歴を共有することができる。
・プログラム可能な補完機能に拠って、多くのユーザーコマンドのオプションや引数を打つのを支援する

これだけメリットがあるとZsh導入した方が良さそうですね…!

##Tmuxとは
tmuxは端末多重化ソフトウェアです。詳しく言うと1つのターミナル上で複数のターミナルを立ち上げて同時並行で作業できるものです。つのターミナルで操作しているシェルから実行したtmux上で複数の仮想端末を操作できるため、ターミナルを複数開くことなく複数のサーバへログインしたり、それぞれの仮想端末で別々のプログラムを実行できるようになるため、より効率的に作業が行えます。<img width="647" alt="スクリーンショット 2019-12-16 15.20.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499907/3ee07641-d434-b14f-3f9e-91a73569b8f8.png">
特定サイトでSurfingkeyが効かないようにする

# 特定サイトでSurfingkeyが効かないようにする

みなさんはSurfingkey使ってますか？？
ブラウザをvimライクななショートカットでマウスを使用することなく動かせるという作業能率アップ型のchrome拡張なのですが、すごく便利で最近愛用しております。

しかしSurfingkeyのショートカットとブラウザのページのショートカットが競合してしまうという側面があります。
また競合した場合Surfingkeyのショートカットが優先されてしまいます。
私はjupyterを多用しているのですが、Surfingkeyでのショートカットと競合してしまうとjキーを押しても選択するセルが変化することがなくただスクロールダウンするような事象が発生してしまいます。

## 解決策
簡単です。surfingkeyの拡張をクリックして、settingを開きます。
そしてadvanced modeにチェックを入れ、jupyterが動作するホストを次のようにブロックリストに入れてしまいましょう。下の一行を設定コードに挿入していただければ良いです。
また私はgmail, udemyもsurfingkeyから外しているので以下のような構成にしております。

```
settings.blacklistPattern = /.*mail.google.com.*|localhost*|udemy.com/i;
```
ExpoのiOSシュミレーター起動時に「execution error: System EventsにApple Eventsを送信する権限がありません」が出た時の対処法

# 前提
ある日、昔開発したReactNativeアプリを開こうとした時の話です。

XcodeとExpoを使用して開発をしています。

expo startして、サーバー立ち上げまではいきます。が、iOSシュミレーターを起動したときだけ

```
execution error: System EventsにApple Eventsを送信する権限がありません。 (-1743)
```

こんなエラーが出ます。

# 解決方法

①アップデートの確認 (してなければ実行）

②PCの再起動

だけでした！！！！！再起動したら全て解決しました！！！アプデして再起動したら解決です！！！！！
RaspberryPiでADT7410で計測した温度をLCDに表示

#概要
RaspberryPiで温度計測センサADT7410とst7032i搭載LCDを制御し、温度をLCDに表示させるコードです。温度が上がると▲アイコンを表示、下がると▼を表示します。


#動作動画
ADT7410チップをさわっている間は温度が上がるため▲アイコン表示、指を離すと温度が下がり▼アイコンが表示される仕様です。

[![RaspberryPi ADT7410](https://img.youtube.com/vi/8Ktl-KQmOLA/0.jpg)](https://youtu.be/8Ktl-KQmOLA)

#ソース
たまにLCDの初期化でIOErrorが発生すると思いますが、例外処理していません。そんな時は再度実行すると動作します。

```ADT7410.py
import smbus
from time import sleep

global old_val

def read_adt7410():
    data = bus.read_word_data(adt7410,reg_data)
    data2 = (data&0x00ff)<<8 | (data&0xff00)>>8
    data2 >>= 3

    if data2&0x1000:
        temp = (data2-8192) * 0.0625
    else:
        temp = data2 * 0.0625
    return temp


def setup_lcd():
    sleep(0.04)
    bus.write_i2c_block_data(lcd,command_inst,[0x39,0x39,0x1c,0x78,0x5d,0x6c])
    sleep(0.2)
    bus.write_i2c_block_data(lcd,command_inst,[0x0c,0x01])
    sleep(0.001)

def write_string(s):
    bus.write_byte_data(lcd,command_inst,0x01)
    sleep(0.001)
    for c in list(s):
        bus.write_byte_data(lcd,command_data,ord(c))

def icon(i):
    if i==0:
        bus.write_byte_data(lcd,command_inst,0x47)
        bus.write_byte_data(lcd,command_data,0x08)
    elif i==1:
        bus.write_byte_data(lcd,command_inst,0x47)
        bus.write_byte_data(lcd,command_data,0x10)




bus = smbus.SMBus(1)
adt7410 = 0x48
reg_data = 0x00

lcd = 0x3e
command_inst = 0x00
command_data = 0x40
contrust = 40
old_val = read_adt7410()

setup_lcd()

try:
    while True:
        val = read_adt7410()

        if val > old_val:
            icon(1)
        else:
            icon(0)

        old_val = val
        write_string(str(val))

        sleep(0.5)

except KeyboardInterrupt:
    pass

```
DIST.30 「一歩差がつくCSSテクニック」 LT資料まとめ

# DIST.30 「一歩差がつくCSSテクニック」 LT資料まとめ

* connpassイベントページ
 * https://dist.connpass.com/event/155593/

## スライド(順不同）

* HTMLとCSSだけでつくるリアルな絵 / How to make a realistic picture only HTML
https://speakerdeck.com/icsnishihara/how-to-make-a-realistic-picture-only-html-and-css

* CSSアニメーションの狂気
https://speakerdeck.com/yusukemx5/cssanimesiyonfalsekuang-qi

* 令和元年ベストのfont-familyはこれだ / Better font-family 2019 in Japanese
https://speakerdeck.com/clockmaker/better-font-family-2019-in-japanese

* 継承するcolor
https://www.slideshare.net/KobayashiShinji/dist30-kobayashi

* アクセシビリティを高めるCSS
https://noti.st/talocohc-rion/n8YnOP

* レイアウトプリミティブ
https://standard.shiftbrain.com/blog/layout-primitives

## パフォーマンス関連

* CSSアニメーションに、なぜtransformを使ったほうが良いのか
"transform" Why do we have to use it in CSS animation
https://speakerdeck.com/spicez/transform-why-do-we-have-to-use-it-in-css-animation


* CSSのパフォーマンスがサイトに与える影響
https://speakerdeck.com/angerchicken/cssfalsepahuomansugasaitoniyu-eruying-xiang


* パフォーマンスを高める CSS
https://docs.google.com/presentation/d/1aDZh9jIDkcNfTcCxOcJqynp2a5-58Q0kD6hz4V9nhNQ/edit#slide=id.p
シリアル通信でPCとマイコンをつなぐ

#はじめに
こんにちは。株式会社バカンでハードウェアエンジニアをしているヒロトです。
この投稿は、[バカン (Vacan) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vacan)の16日目(12/16)の投稿です。
最近、デスクトップアプリを使ってマイコンとPCをシリアル通信でやり取りさせ、吸い上げたデータをPC側で保存する、という操作が必要になる機会がありました。
PCから操作できるとより直感的にマイコン扱える分、幅が増えて面白いな？と思ったので、今回はNode.jsとelectronを使って「PCアプリ上からボタンを押して、マイコンにつないだLEDを点滅させる(Lチカ)する」ということをやってみたいと思います。

#構成
electronはweb技術で作ったものをデスクトップアプリとして扱えるようにしてくれるフレームワークです。なので、UIはHTMLとCSSを使って作成します。今回は、LEDを点灯させるONボタンと、OFFボタンを配置するだけです。
HTMLでは、rendrer.jsというスクリプトを呼び出します。
rendrer.jsは、HTML内の要素を参照して、ボタンが押された際に「LEDをONにして！」または「LEDをOFFにして！」という情報を取ってきます。その情報をPCから受けたマイコンがLEDをON,OFFするという仕組みですが、PCとマイコンを会話させる「シリアル通信」をおこなうためにNode.jsのserialportというパッケージを使います。
具体的には、マイコンとシリアル通信を行う処理はserial-communication.jsに配置し、ボタンクリックの情報を受けるrendrer.jsからserial-communication.jsにはIPC通信でコマンドを投げます。
全体の構成は以下のような図です。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/537b1bad-f294-1e20-5c34-d342ac9821f1.png)


#やってみる
electronの使い方等については、丁寧に説明してくれている記事が多数ありますので、コードなどもそちらを参考にしていただいて今回はやってみた結果を共有したいと思います。
まず、UIは以下のようなものを用意しました。HTMLでボタンを配置して、色を少しいじっただけの超シンプルなものです。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/db49a094-f6f4-be31-283d-9a2d0c463aa1.png)
上記のONボタンを押すと、serial-communication.jsに書かれた処理が「a」という文字をシリアルに出力します。逆にOFFボタンが押されると「b」という文字を出力します。
マイコンの中には、「a」を受け取るとGPIOの値をHiにする、「b」を受け取るとGPIOの値をLowにする、というプログラムが書かれているので、結果としてLEDが点灯・消灯します。
以下がマイコンの配線です。USBケーブルでPCと接続し、電源供給とシリアル通信を行います。
LEDは間に抵抗を挟んで、GPIOとグラウンドに繋いであります。
![iOS の画像 (65).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/679c97ce-eb81-9cdb-d4b1-dd1bba9c9902.jpeg)

以下がONを押した時の様子です。LEDが点灯します。
改めてみると地味かつ「そりゃそうだろ！」という気がしてしまいますが、初めて動かしたときには結構感動するものです(笑)
![iOS の画像 (66).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/e20d65df-9284-4092-291d-28eb04829e71.jpeg)

今更載せるまでもないかもしれませんが、OFFにすると消灯します。
![iOS の画像 (67).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/007159c7-99b8-8939-1063-1039f188692c.jpeg)

#終わりに
今回は、electron,Node.js,Arduinoを使って、PCからLEDを点灯・消灯するということをやってみました。
見た目的には地味な内容になりましたが、操作する部分をLEDから変えてみるともう少し見栄えがするものが作れるかと思います。
例えば、LEDの代わりに車を操作してみてはどうでしょうか？
アプリ上に「直進」、「右」、「左」のボタンを設け、操作する対象をLEDからモーターに変えてやれば有線のラジコンを操作することができます。その場合のハードウェアやマイコン側のプログラムは、ライントレーサーを自作している方々が記事を充実させてくれているので、それを参考にすればすぐにできそうです。
(余談ですが、最近ではWiFiを積んだマイコンも多いので、シリアル通信ではなく、HTTPに変えてやれば無線のラジコンも作れます！)
自分はカレンダー担当日までにラジコンまでは作れませんでしたが、年末・年始のお休みにチャレンジしてみようかなと思っています。(すぐ忘れるやつ)
今回は大分ゆるい記事になりましたが、弊社のアドベントカレンダーには[がっつりなGitの講座](https://qiita.com/kakinouchi/items/be54d21adcac1debc0c0)、[ハードウェアの品質の解説](https://qiita.com/y-hama/items/38ddb2f4d9c68f3b9d32)(Qiitaでは多分珍しい！)をはじめとした技術情報、[インターン生の奮闘日記](https://qiita.com/n_mikiko/items/b39e9460a6d6487d4a75)など、幅広く面白い情報が目白押しですので、ぜひそちらも見ていただけると嬉しいです。

また、会社に興味を持たれた方は下記の各種リンクを参照にしてくださると幸いです。
それでは！

#参考リンク
* [株式会社バカン（Vacan, Inc.）](https://www.vacancorp.com/)
* [バカン採用ページ](https://www.wantedly.com/companies/vacancorp/projects)
* [株式会社バカン　サービスサイト](https://product.vacancorp.com/)
* [バカン (Vacan) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vacan)
【テンプレ】 Amazon Linux 2 初期設定

#はじめに
EC2の簡単な初期設定を紹介していきます。
テンプレなのでコピペで大体できるはず、、！

前提
macOS
AWSにてEC２（Amazon Linux 2）を構築済み

#EC2に接続

```:ローカルPCのターミナル
"sudo ssh -i [keyペアファイル] ec2-user@[パブリックIP]"
#確認が出るので "yes"
#PCのパスワードを要求されるので、入力。
```

#初期設定

- yumをアップデート

```:SSH接続したEC2インスタンス内
yumをまとめてアップデート
$ sudo yum update -y
yum cromインストール
$ sudo yum install -y yum-cron
EPELを有効化
$ sudo amazon-linux-extras install epel

セキュリティのみ自動でパッチがあたるようにcronの設定ファイルを変更します。
$ vi /etc/yum/yum-cron.conf
変更点
update_cmd = security
apply_updates = yes
email_to = [任意]

設定したら起動及び再起動自動の自動実行を設定
$ systemctl start yum-cron
$ systemctl enable yum-cron
```

- タイムゾーンを日本時間に変更します。

```
タイムゾーンをJSTに設定
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
タイムゾーンがJSTに変更されたか確認
$date
/etc/sysconfig/clockの設定変更を変更
$ sudo vi /etc/sysconfig/clock
```

```:/etc/sysconfig/clock
以下の内容を変更
ZONE="Asia/Tokyo"
UTC= true
```

- EC2インスタンスを再起動し、全てのプロセスが新しいタイムゾーンを設定を利用するようにします。

```:SSH接続したEC2インスタンス内
$ sudo reboot
```


#ユーザー追加
セキュリティ強化のため、ec2-userのアカウント名をそのまま使うのではなく、
ec2-userを停止にして、新しいユーザでログインできるようにします。

```:SSH接続したEC2インスタンス内
新規ユーザー作成
$ sudo adduser my-user
wheelグループに追加
$ sudo usermod -G wheel my-user
sudo権限を付与
$ sudo visudo
```

viが開くので、行末に「my-user ALL=(ALL) NOPASSWD: ALL」を追加

```:visudo
my-user ALL=(ALL) NOPASSWD: ALL
```

:wqで保存

ec2-userのauthorized_keysをmy-userの.sshディレクトリにコピーし、適切なパーミッションを設定します。

```:SSH接続したEC2インスタンス内
$ sudo rsync -a ~/.ssh/authorized_keys ~my-user/.ssh/
$ sudo chown -R my-user:my-user ~my-user/.ssh
$ sudo chmod 700 ~my-user/.ssh/
$ sudo chmod 600 ~my-user/.ssh/**
```

#SSH接続設定
EC2のシークレットキーをローカルPCの以下に配置
/Users/[ユーザー]/.ssh/***.pem

```:ローカルPCのターミナル
.sshディレクトリに移動
cd .ssh
シークレットキーを持っている他のユーザーもログインできるように権限を変更
$ chmod 600 ***.pem
権限が変更されているか確認
$ ls -al
-rw-------           になっていればOK
configに接続設定を記載
$ vi config
```

ローカルにショートカットを作成

```:/.ssh/config
Host [ホスト名]
 HostName [パブリックIP]
 Port 22
 User my-user
 IdentityFile ~/.ssh/***.pem
```

:wqで保存

my-userで接続できるか確認します。

```:ローカルPCのターミナル
$ ssh [ホスト名]
```

接続できたら、rootになれるか確認

```:SSH接続したEC2インスタンス内
$ sudo su -
```

#SSHのセキュリティ設定
rootとec2-userでのSSHを禁止する

```:SSH接続したEC2インスタンス内
$ sudo vi /etc/ssh/sshd_config
```

```:/etc/ssh/sshd_config
以下を追加

#ec2-userでのログインを禁止
DenyUsers ec2-user
#暗号化アルゴリズムの指定
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
#鍵付きハッシュのアルゴリズム
MACs hmac-sha2-256,hmac-sha2-512

以下を変更
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin no
```
:wqで保存

```:SSH接続したEC2インスタンス内
設定を反映
$ service sshd reload
```
Lambdaローカル開発にてdotenvにて.envファイルが読み込めない問題と対処

##備忘録
あくまで備忘録。

##問題
Lambdaをローカルで開発時、dotenvを読みこない不具合に陥った。
設定した環境変数が、undifinedになる。

##原因を究明した方法
```
console.log(require('dotenv').config())
```
##原因
.envの読み込みを、プロジェクトディレクトリではなく/var/task/.envで読み込みを行っていた。

##対処
環境変数をtemplate.yaml経由で設定する。
*template.yamlの記述省略
config.jsonにはKey:Valに書き込む

```
sam local invoke -d 5858 -e events/event.json --parameter-overrides $(jq -r 'to_entries[] | "\(.key)=\(.value)"' config.json) Hellworld
```
AWS Lambda(Ruby)でgemをrequireしようとすると「cannot load such file ....」

表記のときの原因の1つをメモ。

「Ruby 2.5系以外で bundle install」した資材をアップロードすると表記エラーとなる…。
普段の作業用のバージョンは当然2.6以上なので、別のディレクトリでLambda用のスクリプトを作成して作業したときに `.ruby-version` を設置し忘れてそのまま作業、アップロードして小一時間ハマった…。
Command Line Toolsを手動でインストールする

## Command Line Toolsは入っているみたいだが怪しい

```
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```

### 手動でインストールすることにする


https://developer.apple.com/download/more/

- 上のリンクに飛ぶ

- 下の文字をコピーして

```
command line tools
```

- `command + 「F」`でページ内検索

<img width="1440" alt="スクリーンショット 2019-12-16 15.05.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/673aea9c-856a-ad40-a549-b0478c57701d.png">


xcodeのバージョンに合わせて選択しインストール


以上です！

参考
https://qiita.com/hurutoriya/items/7dacfe6edfe5b0fbca2f
【shell script】シェルスクリプトで最も簡単に文字列をsplitする方法

シェルスクリプトで文字列を`,`で区切って配列を作りたい！

```shell
"wine,beer,vodka,tequila,highball"
# ↓↓↓
("wine" "beer" "vodka" "tequila" "highball")
```

以外と調べても出てこない…


## 方法

**カンマをスペースに置換する→スペースで区切り配列に格納する**
IFS(区切り文字)を変更するより、元々の区切り文字であるスペースに置換した方が簡単です。

```shell
alcohol="wine,beer,vodka,tequila,highball"
alcohol=(${alcohol//,/ })
```


## 説明

### カンマをスペースに置換する

```shell
"wine,beer,vodka,tequila,highball"
# ↓↓↓
"wine beer vodka tequila highball"
```

bashの機能を使う

```shell
alcohol="wine,beer,vodka,tequila,highball"
alcohol=${alcohol//,/ }
```

sedを使う方法もありますが、今回は紹介しません。


### スペースで区切り配列に格納する

```shell
"wine beer vodka tequila highball"
# ↓↓↓
("wine beer vodka tequila highball")
```

`()`で括る

```shell
alcohol="wine beer vodka tequila highball"
alcohol=($alcohol)
```

## 参考文献
[bashの変数内文字列置換まとめ](https://qiita.com/aosho235/items/c36568830a8d47288284)
[スペース区切りの文字列を配列に格納する方法](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8D%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E9%85%8D%E5%88%97%E3%81%AB%E6%A0%BC%E7%B4%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
Figmaのプロトタイプツールでドロップダウンメニューを表現する方法

SENSYN ROBOTICS(センシンロボティクス)一人目のデザイナーの永尾です。よろしくお願いします。

今回はPCサイトのプロトタイプを作成中に、下記の動画のようにグローバルメニュー内のドロップダウンメニューからページ遷移させたいなーと思ったのでやってみたら簡単にできたので紹介します。
※マウスオーバーでドロップダウンを表示するのではなくクリックすると表示される仕様になります。
![drop-down-menu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/01e299af-b5cb-6b0c-6a90-aa713ddb08d8.gif)

## 1.デザインの用意
何もともあれまずはデザインを用意。
下記画像のようにグローバルメニューのあるPage-Aと遷移先のPage-B、そしてドロップダウンメニューのコンポーネント（drop-down-menu）を作っておく。
※drop-down-menuはGroupでなくFrameもしくはComponentにしておかないとインタラクションの設定ができないので注意。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/9b084bbe-9963-61ea-c167-e3c39ea99084.png" width="640px;">

## 2.Interactionの設定
コンポーネントの用意ができたら、プロパティパネルの「Prototype」をクリックしプロトタイプモードに切り替える。
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/a4c4389b-acd8-da91-d438-6c0a7191ac32.png)

次にドロップダウン表示させたいメニュー（menu2）を選択し、トリガーから「On Click」を選択。アクションの設定を「Open Overlay」にして、対象を「drop-down-menu」に設定する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/e785d386-d8ff-11a2-453c-64e605fe84b8.png" width="640px;">
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/ad57d3ed-cfae-0fac-df21-e6b18c001d22.png)


これでmenu2をクリックするとdrop-down-menuが表示されるようになる。

## 3.Overlayの設定
続いてdrop-down-menuの表示される位置を決める。「Manual」を選択し、好きな位置に配置。

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/421d8928-41e4-642d-69af-e6252220889c.png)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/184582a5-567b-a2af-befb-43da88cfcbf7.png" width="640px;">

表示する箇所が決まったら、「Close when clicking outside」にチェックが付いていることを確認。これでdrop-down-menu以外の箇所をクリックすると非表示になる設定ができた。

※ちなみに「Add background behind overlay」とあるが、これにチェックすると画面全体に背景色を追加することができる。これはモーダルウィンドウやドロワーメニューの表現に重宝する。

## 4.Animationの設定（任意）
drop-down-menuが表示される時のアニメーションを設定することもできる。
フェードインさせたいなら「Dissolve」を選択、スライドインさせたいなら「Move In」を選択し、スライドの方向やイージングなどの設定をお好みで決定。
アニメーションが不要なら「Instant」を選択。
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/ae647564-24a2-044a-07ef-b9bc2bc4b90c.png)


## 5.リンクの設定
最後にdrop-down-menuのリンクの設定をする。「childmenu」のいずれかを選択してInterractionの設定をトリガーは「On Click」アクションは「Navigate To」にして、遷移させたいページである「Page-B」を選択。
![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/a58d32d5-2756-0b41-4da3-3342d0445eef.png)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549936/8d24ddd9-16b8-b606-0e9a-a8b2e4ad685a.png" width="640px;">
以上の設定を終えたら完了。プロトタイプビューに切り替えてドロップダウンメニューの表示とページ遷移を確認してみよう。

ちなみにこれまで説明した「Interaction」「Overlay」「Animation」を色々組み合わせれば、モーダルウィンドウやドロワーメニューなどの表現も簡単にできるのでお試しあれ。
matplotlibのグラフのアルバム

こんにちは。
今回はmatplotlibで有名な図（グラフ）と書き方を並べるだけです。

# さあ、はじめよう。
``` python:sample.py
import matplotlib.pyplot as plt

plt.plot(x, y) # 折れ線グラフ
plt.bar(x,y) # 棒グラフ(縦）
plt.barh(x, y) # 棒グラフ（横）
plt.scatter(x, y) # 散布図
plt.hist(x) # ヒストグラム
plt.boxplot(x) # 箱ひげ図
plt.pie(x) # 円グラフ

# その他にも沢山あると思うが、この辺で終了。
```

グラフは沢山あるので、最適化されたグラフ選択する力が必要ですね。
グラフは物事を一瞬で掴めるメリットがあるので、しっかり勉強したい所ですね。
それにしても、matplotlibモジュール優秀だね。

以上！
Alexaスキルの自由入力論争に終止符を打つ

# はじめに
この記事は [スマートスピーカー Advent Calendar 2019](https://qiita.com/advent-calendar/2019/smart-speaker)の16日目の記事です。

# 背景

Alexaスキルのスロットの値にユーザーからの入力をそのまま格納したい場合があります。

実装は可能なのか？自分でググったりもくもく会で質問したりしてきましたが結局はっきりしていなかったのでこの論争（？）に終止符を打ちたいと思います。

# 結論

できます。

いくつか方法はあるものの現実的にはほぼ一択になっています。つまずきポイントもあるので注意が必要です。

# 方法その１：キャリアフレーズを活用する

一番簡単な方法は `キャリアフレーズ` をうまく使う方法です。

`キャリアフレーズ` というとピンと来ませんが、例えば `これは {demo_slot} です` のようなサンプル発話があったとしたら、**「これは」**と**「です」**がそれに当たります。インテントのスロットにはこのキャリアフレーズが必須となっています。

例えば今の気分をユーザーに話してもらいそれを全てスロットの値に格納したい場合は、`今の気分は {feeling}` のような感じでサンプル発話を設定しておけば目的は実質達成できそうです。

ただこれだと完全な自由入力とは言えず、尚且つキャリアフレーズが入れやすい場合は問題ないですが、オウム返しの様なスキルを作る時に `これから話すよ。 {demo_slot}` などとしてはユーザー体験が下がってしまう気がします。

ただ実装難易度は低いので、スキル開発歴が浅い人はこの方法で妥協してみるのもありません。

# 方法その2：前後に半角スペースを入れる（非推奨）

インテントのサンプル発話をスロットだけにする事はできませんが、スロットの前後に半角スペースを入れる事で自由入力を許容させることができる裏技があります。予期せぬ入力があってもここに落ちてきてくれるのでフォールバックインテントの様な役割も出来ます。

ちょっとわかりずらいですがこんな感じです。

` {demo_slot} ` ← 前後に半角スペースが入っています


結構有名なハック？でよく聞くやり方です。自分も最近この方法で途中までスキルを作っていましたが開発段階でのテストなどでは問題ありませんが**公開審査は通りませんでした**。

その時のコメント。
>
ビルトインスロットタイプのAMAZON.SearchQueryを使用したスロットのみのサンプル発話が含まれています。
AMAZON.SearchQueryを使用するすべてのサンプル発話にはキャリアフレーズを含める必要があります。

テストスキルだけ開発して個人的な目的でしたスキルを使用しない場合はこの方法でも良いかと思いますが、公開を目指す場合は次に紹介する方法一択になるかと思います。



# 方法その3：ダイアログをデリゲートする

最もオススメなのがダイアログモデルを作成してダイアログをデリゲートする方法です。ダイアログのデリゲートをインテントに設定するとスロットを収集が完了するまでメイン処理を行わないようにしたりできます。

今回はモデルの設定さえすれば自動でやってくれる**オートデリゲート**を使って説明を進めます。

一番簡単なダイアログの設定方法は開発者コンソール上でモデルを編集する方法かと思います。`ask cli`を使って開発している場合は編集後に必ず`get-modelサブコマンド` を使ってローカルにモデルの変更を反映します。

以下の手順で設定します。


1. 任意のインテントを選択し、インテントスロットの**「ダイアログを編集」**をクリック
<img width="1060" alt="intent_slot_sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287161/ad137baa-51c7-6f3e-a7b9-d5d7402bff79.png">

2. **「このインテントを完了させるために、このスロットは必須ですか？」** をオンにする

3. **「Alexa の音声プロンプト」**にスロットの入力を促す文章を入力して追加
4. **「ユーザーの発話」**に `{demo_slot（任意のスロット名）}` を設定して追加
5. インテントの画面を戻ると**「ダイアログデリゲートのルール」**を選べる様になっているので**「オートデリゲートを有効化」**を選択（手動で設定する場合は「オートデリゲートを無効」を選択しLambdaのコードも編集する）
6. モデルの保存とビルド
7. テストしてみる

**設定した通りにオートデリゲートされている**

<img width="414" alt="スクリーンショット 2019-12-16 14.25.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287161/6082eb75-71d8-0cd4-07ed-b0e5d2e0b2ef.png">


**JSONのリクエストにもスロットの値が入っている**

```
"intent": {
    "name": "HelloWorldIntent",
    "confirmationStatus": "NONE",
    "slots": {
        "demo_slot": {
            "name": "demo_slot",
            "value": "アイウエオ",
            "confirmationStatus": "NONE",
            "source": "USER"
        }
    }
},
```

設定した通りにオードデリゲートされスロットの値が収集されています。
ダイアログの「ユーザーの発話」にはキャリアフレーズは含んでいないため、**自由入力がスロットの値に設定できることが確認できました！**

# どんなことに使える？

自分の場合はユーザーの気分を自由入力で取得し、最近日本語対応したAmazon Comprehendを使い感情分析する際にオートデリゲートを使いました。先日**「ネガポジ判定」**というスキル名で公開したので気になる方は遊んでみてください。

# まとめ
色々調べているうちにAlexa開発の知見がたまりました。

スキル開発経験がある方からすると当たり前な情報な気もしますが、インテントのスロットに自由入力が使えないことでAlexa開発を諦める人もいるっぽいので記事にしてみました。

ダイアログのデリゲートはスキル開発の鬼門の様な気もしているので、この辺りを理解するとより気持ちよくスキルが作れそうです。
Githubプロフィールのコントリビューション数にプライベートリポジトリの数字を反映させる

# TL;DR
- Githubの草をたくさん生やしたい人におすすめ
    - 業務で使っているのがプライベートリポジトリのため草が生えないことに困っている方へのソリューション

# 手順
1. https://github.com/ `自分のユーザーID` に遷移する
    2. とりあえずGithubにアクセスして右上の自分のアイコンをクリック > Your profile を選択すればいけます
3. Contribution settings > Private contributions にチェック
<img width="320" alt="スクリーンショット 2019-12-16 14.49.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/cc9271ce-9a36-b830-fbc0-1dc55d2c2e66.png">

4. 完了のメッセージが表示されればOK
<img width="882" alt="スクリーンショット 2019-12-16 14.49.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/603170d7-ca12-db3e-903b-60643072cb05.png">

# 確認方法
シークレットウィンドウで https://github.com/ `自分のユーザーID` を閲覧するのが手っ取り早いです
Rails Girls Tokyo MoreからRailsを始め4ヶ月で実感したこと

#はじめに
初めまして、ayakaと申します。
私はバックオフィス職だったのですが、システムとものづくりが好きで
作り手として関わりたいと思うようになり、転職を決意しました。(勉強＆転職中)
Rubyコミュニティのことを初心者目線で書きます。

#Rails Girls Tokyo,More!初参加
8月、初めてRails Girls Tokyo,More!に飛び入りで参加させて頂きました。
当時はRubyの勉強はしていましたが、Rails知識が無かったので不安でした。
しかしコーチをして下さった方がRailsの仕組み、初期設定、scaffoldを
使ったアプリの作成をハンズオン形式で教えてくださいました。
付きっ切りで丁寧に教えて頂いて感動しました。

その時書いてもらった図は今も大切に持っています。笑
(江森さんありがとうございました)
![19-12-02-16-43-47-909_deco.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/4290f391-508e-3c8e-31ae-636ec9aa3a26.jpeg)

#Rails Girls Tokyo,More!参加2回目
1回目のイベントに参加後、[Railsチュートリアル](https://railstutorial.jp/)を始めました。
躓いていたところは、コーチの方に助けていただきながら、
イベント中に14章が終了しました🎉

#Rails Girls Tokyo,More!参加3回目
次は自分で何か作ってみたいと思い、ポートフォリオ作成を始めました。
何とか本番環境デプロイまで行いましたが、Rspecテストが上手くいかない・・・
コーチの方に現場での運用の仕方や、テストの仕組みなどを丁寧に教えてくださいました。

その時書いてもらった図は今も大切に持っています。笑
(ベータさんありがとうございました)
![19-12-02-16-44-20-324_deco.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/936c730e-771a-d912-3ee3-a454c9b9c4c2.jpeg)

#Rails Girls Tokyo,More!参加4回目
12月のイベントではクリスマスパーティー＆LT大会
JSで躓いていたところ（もはやRailsでは無い…）も
コーチの方にまたもや助けていただきました。😭

そして、念願のLT（小さな発表）デビューをしました🎄
エンジニア(強)の皆さんの前で話すのはなかなか緊張しましたが
皆さん暖かく見守っていただきました。


#さいごに
あっという間の4ヶ月でしたが、コミュニティと出会うことがきてよかったことは

 - 優しく教えてもらえた
 - 自分の成長を実感でき、モチベーションに繋がる
 - Rubyを作っている方々の話を聞ける、会える
 - 繋がりができて、一人じゃ無い感覚になった
 - 目標となる人がたくさんいる

そして何より、<b>暖かく迎え入れてくれる優しさ</b>
始めたばかりですが、これからも大切にしたいコミュニティだと思いました。

開催して下さっている方々ありがとうございます。
私もコーチとして恩返しできるようになりたいと思います。
[Vue.js] vue-property-decoratorで関数型コンポーネントを利用する


# vue-property-decoratorで関数型コンポーネントを利用する方法

やることは2つ
- templateタグに`functional`を設定する
- ~~class内で`functional = true`を定義する~~
templateタグに`functional`を設定するだけで大丈夫っぽい


実際に書いてみると以下みたいな感じ

```vuejs
<template functional>
  <div>
    {{ props.text }}
  </div>
</template>

<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator'

@Component
export default class Child extends Vue {
  // trueを設定する
  functional = true

  @Prop({ default: "", type: String }) text: string
}
</script>
```
Python＋OpenCVのためのインストールに失敗したときに見る記事


*OpenCVを追加しようとしたときにエラーが出たのでそのときの対処についてのメモ*
社内や学内でのプロキシサーバを経由している場合は試す価値あり。(？)

環境
===
Windows10,  Python3.7.4, Visual Studio Code 1.40.2
学内ラボの個人用PC, **プロキシ環境下(原因)**

やったこと
====
###・pipを使ったインストール(失敗)

```python
pip install opencv-python
```

今回のエラー

```Python:出力
Collecting opencv-python
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x0000028DF62573C8>, 'Connection to pypi.org timed out. (connect timeout=15)')': /simple/opencv-python/
  WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x0000028DF6259388>, 'Connection to pypi.org timed out. (connect timeout=15)')': /simple/opencv-python/
ERROR: Operation cancelled by user
```
中身を見るとタイムアウトになっている。
ここでプロキシ経由であることを思い出して検索してみるとやはりプロキシが原因っぽい。

###・プロキシ経由するときのpipを使ったインストール(成功)
　→プロキシ経由の時はpip~ の後に　--proxy サーバ名を書く

```Python
pip install opencv-python --proxy http://ID@サーバ名:ポート
```
できたようなので確認

```Python:出力
python
Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32nc. on win32

Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.1.2'
```
いい感じにインストールできた
GraphQLのクエリで配列型の引数を宣言する方法

Prisma + Appoloクライアント経由でGraphQLクエリを作成した際に、引数に「配列」を渡す方法の備忘録

```graphql:apollo/queries/getPosts.graphql
query GetPosts($ids: [Int!]) {
  posts(where: {
    Category: {
        Id_in: $ids
    }
  }) {
    Id
    Name
    CreatedAt
    UpdatedAt
  }
}
```
- !（エクスクラメーションマーク）は、null制約を付与している
- ポイントは、引数で宣言する配列は`Int[]`ではなく`[Int]`と表現すること

参考：[Data modeling, Array of strings - Questions - Prisma Forum](https://www.prisma.io/forum/t/data-modeling-array-of-strings/4421)
データベース　ざっくり解説３　ACID特性

#ACID特性
トランザクション処理において必要とされる４要素
つまり、データベースを変更する処理において、満たさなきゃいけない４要素のこと。


<br>
<br>

<hr>
### 原子性 Atomicity
トランザクションがデータベースの更新処理を

- 完全に確定させる(commit)
- 全て取り消されるか(abort)

のどちらかの結果になるようにする

<hr>
### 一貫性 Consistency
トランザクションによって矛盾が生じないようにする
<hr>
### 独立性 Isolation
複数のトランザクションを同時実行しても、単独実行の場合と同じ結果になる。
つまり、他のトランザクションの影響を受けない
<hr>
### 耐久性 Durability

トランザクションの結果は障害があっても失われない
<hr>