OmniAICreator/Qiita-1.07M huggingface dataset:
Rails 名前空間のディレクトリ構造について疑問に思ったことがあったので確認してみた

# はじめに
Ruby onRails6 実践ガイドを学習している中、名前空間のディレクトリ構造についてふと疑問に思い動作確認をしてみました。

# 結論
先に結論を記載します。
疑問に思ったこと、試したことを見る必要のない方はこちらのみ確認していただければと思います。

`app/任意のフォルダ名/namespaseで設定したフォルダ/対象ファイル`

このようにappフォルダ直下に任意の名前のフォルダを作成し、`routes.rb`の名前空間で
設定した名称のフォルダの直下のファイルを置くことで、処理を呼べるようです。


例)routes.rb

```routes.rb
  constraints host: config[:admin][:host] do
    namespace :admin, path: config[:admin][:path] do
      root "top#index"
      get "login" => "sessions#new", as: :login

      resource :session, only: [ :create, :destroy ]

      resources :staff_members
    end
  end
```

`app/services/admin/authenticator.rb`

# 疑問に思ったこと
Railsガイドの[2.6 コントローラの名前空間とルーティング](https://railsguides.jp/routing.html)に
このように記載されておりました。
>>コントローラを名前空間によってグループ化することもできます。最もよく使われる名前空間といえば、多数の管理用コントローラ群をまとめるAdmin::名前空間でしょう。これらのコントローラをapp/controllers/adminディレクトリに配置し、ルーティングでこれらをグループ化できます。
・appフォルダ直下にsampleディレクトリを作成する

であれば、controllers出なくてもapp/フォルダ名/名前空間で設定したフォルダ名の直下に
ファイルをおけばいけるのでは？
と考えました。

# 試したこと1
'app/samples/admin/hello.rb'を作成します。

```hello.rb
class Admin::Hello
  def hello
    puts "Hello World"
  end
end
```

適当なRailsアプリケーションにこちらのファイルを呼び出すよう実装して実行してみた結果
![スクリーンショット 2020-05-01 21.07.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/97eb9fff-de3e-0f87-2f8c-2cd4d8ff2072.png)

当初の予定通り呼び出すことができました。

# 試したこと2
'app/samples/samples/admin/hi.rb'を作成します。

```hi.rb
class Admin::Hi
  def hi
    puts "Hi World"
  end
end
```

適当なRailsアプリケーションにこちらのファイルを呼び出すよう実装して実行してみた結果
![スクリーンショット 2020-05-01 21.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/9f007bb8-fd67-c3ea-5077-73d6d1ddcdc2.png)
こちらは読み込みに失敗しました。


以上の結果から、appフォルダ直下に任意の名前のフォルダを作成し、`routes.rb`の名前空間で
設定した名称のフォルダの直下のファイルを置くことで、処理を呼ぶことがわかりました。

# 参考URL
[Railsガイド](https://railsguides.jp/routing.html)
DEsingleをBiocParallelで並列化すると高速でDifferentially Expressed Gene (DEG)検出できるか

#やったこと
RのscRNA-seq用発現変動遺伝子解析パッケージのDEsingleは並列化に対応しているらしいと言うことで試してみました。
DEsingleについては以下を参照してください。
Zhun Miao, Ke Deng, Xiaowo Wang, Xuegong Zhang (2018). DEsingle for detecting three types of differential expression in single-cell RNA-seq data. Bioinformatics, bty332. 10.1093/bioinformatics/bty332.
#install
今回はWindows10、R-4.0.0で実行しました。Rを起動し、DEsingleとBiocParallelをインストールします。

```
BiocManager::install("DEsingle")
BiocManager::install("BiocParallel")
library(DEsingle)
library(BiocParallel)
```

これで準備完了。

#データセット
GEOデータベースのGSE143214のデータセットを使いました。老年と若年者ドナーから採取したT細胞のscRNA-seqデータです。老年725サンプル、若年者716サンプルで計1441サンプルになります。老年サンプルと若年サンプルで発現変動している遺伝子を抽出します。それぞれ別々のファイルに遺伝子発現量が記載されています。ファイルをデータベースからダウンロードして解凍して使用します。

#DEG検出

```
#データの読み込み
old <- read.table("GSE143214_TPM_sc_old.txt", header = T, sep = "\t")
young <- read.table("GSE143214_TPM_sc_young.txt", header = T, sep = "\t")
#データのマージ
all_samples <- merge(old, young, by = "X")
rownames(all_samples) <- all_samples$X
#parallelパラメータの設定
param <- SnowParam(workers = 6, type = "SOCK", progressbar = TRUE)
register(param)
#DEG検出
counts <- all_samples[,2:ncol(all_samples)]
group <- factor(c(rep("O", ncol(old) -1), rep("Y", ncol(young) -1)))
before <- proc.time();results <- DEsingle(counts = counts, group = group, parallel = TRUE, BPPARM = param);after <- proc.time()
after - before
```
![開始時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353039/ac35ad9b-b06c-fbac-3fbd-c57a970efe3b.png)
![終了時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353039/40ebc29c-84c0-1c15-eb45-fb94b0305d48.png)

#結果
第8世代のIntel(R)Core(TM)i7-8750H 6コアで1323.66秒かかりました。並列化なしと比較しようと思いましたが、時間かかりそうなのでパス。正常に動作していることが確認出来たので良しとしましょう。DEG検出の時間短縮に使えるでしょう。

#参考
1. DEsingleについて
Zhun Miao, Ke Deng, Xiaowo Wang, Xuegong Zhang (2018). DEsingle for detecting three types of differential expression in single-cell RNA-seq data. Bioinformatics, bty332. 10.1093/bioinformatics/bty332.
2. データセット
Kared H, Tan SW, Lau MC, Chevrier M et al. Immunological history governs human stem cell memory CD4 heterogeneity via the Wnt signaling pathway. Nat Commun 2020 Feb 10;11(1):821. PMID: 32041953
競技プログラミングメモ帳①　〜stringはまるで配列のように扱える〜


（ご指摘により5/2修正)
最近は競技プログラミングに、はまっていたためqiitaに書き込むことが少なかったです。（申し訳なく思っている）
今後はそれをネタに、その際に使ったコードをとりあげていきたいと思います。
かと言ってもすごく初歩的な物が多いこと、そしてこれはあくまでも私が個人的にコードを書いていることであるため、参考になるかはわかりません。（間違ってる可能性高いですが、それも勉強です）

私は、文字数分の繰り返し処理を行なう際にlengthなどを多用します。
ちなみにstringの型に[]で数字を間に挟むと、配列のように使用でき、前から順番に指定した数字に格納された文字が返ってきます。便利ですなぁ。
最後の文字を指定したい時は、str[-1]で指定すれば最後の文字取得できちゃうですよねー。
最初これは目から鱗でした。

```ruby:

str = 'test'　# gets.chomp.to_sなどで取得する場合がほとんど
puts str.length # 4と返す
str.length.times {|i| puts str[i]} # "t" "e" "s" "t"と順番に返す
str.length.times {|i| puts str[-(i+1)]} # "t" "s" "e" "t" と逆に返す

```

文字数が4文字のときなども以下の通りで取り出せます。

```ruby:

str = 'test'
if str.length == 4　#四文字の時のみ以下の式を返す
  str.length.times {|i| puts str[i]} # "t" "e" "s" "t"と順番に返す
end
```

簡単なリファクタリングとして同じ条件式を多用するときは、変数に入れるようにしています。
これは好みですが、すごく短い文であれば特にきにしていませんが、競技プログラミングのレベルが上がるにつれて長文となり見辛くなるためと、何度も計算する必要もないためです。
可読性と速度のバランスを考えて二、三回以上使った場合、私は変数に入れるようにしています。

```ruby:

str = 'test'
num = str.length
if  num == 4　#四文字の時のみ以下の式を返す
  num.times {|i| puts str[i]} # "t" "e" "s" "t"と順番に返す
end
```

とりあえずは以上です。
コロナ自粛中ですが、趣味と実益を兼ねた素晴らしい教材に出会えたことはとても嬉しく思います。
またアップしますので、よろしくお願いします。
LIFF新機能の「liff.id」を試してみた

# LIFF新機能の「liff.id」を試してみた

この記事は[すごくなりたいがくせいぐるーぷ](https://qiita.com/organizations/sgg)GWアドベントカレンダー3日目の記事です。  
[すごくなりたいがくせいぐるーぷ | GWアドベントカレンダー](https://gw-advent.9wick.com/calendars/2020/87)

## はじめに

LIFFに`liff.id`というプロパティが追加されたので仕様などを調べてみました。

<https://developers.line.biz/ja/news/2020/04/30/liff-get-line-version-and-id-released/>

## 機能

>liff.init()に渡したLIFFアプリID（String型）を保持するプロパティです。  
liff.init()を実行するまでは、nullです。

<https://developers.line.biz/ja/reference/liff/#id>

と公式リファレンスにおる通り、どうやらliff.initで指定したliffIdを取得できるみたいです。

## とりあえず実装してみた

まずは先に`liff.init`をしてから`liff.id`を出力してみます。

```js
liff
  .init({
    liffId: '1234567890-abcedfgh'
  })
  .then(() => {
    console.log('さくせす', liff.id);
  })
  .catch((err) => {
    console.log(err.code, err.message);
    alert('エラーが発生しました');
  });
```

console

```terminal
さくせす 1234567890-abcedfgh
```

次に、`liff.init`をする前に`liff.id`を出力してみます。

```js

console.log(liff.id);

liff
  .init({
    liffId: '1234567890-abcedfgh'
  })
  .then(() => {
    console.log('さくせす');
  })
  .catch((err) => {
    console.log(err.code, err.message);
    alert('エラーが発生しました');
  });
```

console

``` log
null
```

確かに`null`が返ってきました。

## 用途

liffIdを取得するという用途での使い方は思いつきませんが、`liff.init`をする前に`liff.id`を取得すると`null`が返ってくるという仕様を使えば、まだ`liff.init`をしていないのかどうかを判定できます。

僕は今まで、`liff.init`をする前に`liff.isLoggedIn()`をするとエラーを吐くという仕様を使い、以下のようなコードでliffアプリが初期化済みかどうかを判定していました。

```js
try {
  liff.isLoggedIn();
} catch (e) {
  // 初期化済みでない時の処理
}
```

ですが、今回実装された`liff.id`を使って上記のコードを書き換えてみたところ、うまく動作しました。上記のコードは若干無理矢理感が否めないですが、`liff.id`を使えば以下のような綺麗なコードになります。

```js
if (!liff.id) {
  // 初期化済みでない時の処理
}
```

## おわりに

本日、@stachibana さん作成の[LIFF APP MARKET](https://liffapp.market/)がリリースされました！  
僕も[時間割bot](https://line.me/R/ti/p/%40ywg0561x)という学生向けサービスのLIFFアプリ版を公開しましたので興味がある方は是非ご利用ください！
なんで「+」演算子をオーバーロードする時、引数を2つ取る場合メンバ関数として定義できないか。

なんで「+」の演算子をオーバーロードする時、引数を2つ取る場合メンバ関数として定義できないか。
下記のようにフレンド関数としてオーバーロードしてはいけるが、、、

```
class Point {
public:
	int x;
	int y;
	friend Point operator+(int a, Point obj);　//引数を2つ取る場合
};

 Point operator+(int a, Point obj) {
	 Point ans;

	 ans.x = a + obj.x;
	 ans.y = a + obj.y;

	 return ans;
 }
```

そこでフレンド関数ではなくて、メンバ関数として定義してみる。

```
 class Point {
public:
	int x;
	int y;
	Point operator+(int a, Point obj); //コンパイラーに怒られる
};

Point Point::operator+(int a, Point obj) {
	 Point ans;

	 ans.x = a + obj.x;
	 ans.y = a + obj.y;

	 return ans;
 }
```

調べてみると、二項演算子（この場合「＋」はこれにあたる）の左側にあるものは暗黙的に*thisポインタが指しているので、1つだけの引数を受け付けるのはメンバ関数の仕様のようだ。

https://stackoverflow.com/questions/16946229/why-cant-a-class-member-function-take-more-than-one-argument-of-the-same-type-a

だから文字通り、下記のようにコンパイラーに怒られる。

```
 error C2804: binary 'operator +' に引数が多すぎます。
```
PyTorchメモ(次元管理)

## はじめに

主は深層学習初心者です。
間違いがありましたら優しく教えて頂けると幸いです。

## tensorの定義

```python
>>> import torch
>>> tensor = torch.randn(2, 3, 3)
tensor([[[ 1.5399, -0.8363,  0.3968],
         [ 0.0699,  1.1410,  0.7154],
         [ 0.4368,  0.9433, -0.8077]],

        [[ 1.1562, -1.3698,  0.6734],
         [-0.6762,  0.1539, -0.1286],
         [-0.4542,  0.3858, -1.6197]]])
```

## tensorを次元ごとに操作

### n次元目の総和を求める(次元を圧縮)

```python
>>> sum_tensor = tensor.sum(2, keepdim=False)
tensor([[ 1.1004,  1.9262,  0.5725],
        [ 0.4599, -0.6509, -1.6881]])

torch.Size([2, 3])
```

### n次元目に総和を求める(次元を圧縮しない)

```python
>>> sum_tensor = tensor.sum(2, keepdim=True)
tensor([[[ 1.1004],
         [ 1.9262],
         [ 0.5725]],

        [[ 0.4599],
         [-0.6509],
         [-1.6881]]])

torch.Size([2, 3, 1])
```

### 次元を拡張

GPUを使用する場合以下を用いると高速化できます

```python
>>> tensor.sum(2, keepdim=True).expand([3, 2, 3, 1])

tensor([[[[ 1.1004],
          [ 1.9262],
          [ 0.5725]],

         [[ 0.4599],
          [-0.6509],
          [-1.6881]]],


        [[[ 1.1004],
          [ 1.9262],
          [ 0.5725]],

         [[ 0.4599],
          [-0.6509],
          [-1.6881]]],


        [[[ 1.1004],
          [ 1.9262],
          [ 0.5725]],

         [[ 0.4599],
          [-0.6509],
          [-1.6881]]]])
```

## まとめ

主が困ったらまた追記すると思います
【iOSアプリ開発】オンライン対戦のクイズアプリのリリースまでの流れ

## 概要
私事ではありますが、
先日4月30日、早押しクイズのオンライン対戦アプリをリリース致しました。
プロモーションを兼ねてリリースまでの流れや大変だった部分などを共有していきます。
よろしければ実際にアプリをインストールして触っていただければ嬉しいです🐶

## アプリ概要
Quizdom クイズ王 決定戦
https://apps.apple.com/jp/app/id1510223709
<img width="300" alt="スクリーンショット 2020-05-01 20.48.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117784/ee6fe94f-c600-8add-e61d-e5bc2668cba2.png">
<img width="500" alt="スクリーンショット 2020-05-01 20.48.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117784/fa1fbda3-8024-9325-75e3-a36e81421b0a.png">



## リリースまでの流れ

### 1日目
 - 4/18(‪土) 
 - 開発開始！🐶
    - どんなアプリにするか決める（ジャンル、利用ユーザー層、機能など）
    - 競合アプリ調査
    - このアプリの強みを決める
        - AI対戦
        - 1分で1対戦できる手軽さ
    - アプリタイトル決める
    - 全体的な画面の設計
    - 画面毎の機能を決める
    - githubのリポジトリ作成
    - readmeに上記をまとめる
    - v1.0.0の開発タスクをissuesにまとめる

### 3日目
- 4/20(月) 
- 基本機能と画面の実装完了
    - Topページ
    - プロフィール登録
    - マッチング
    - クイズ、解答画面
    - クイズ結果
    - 設定画面
- AI対戦機能
    - AIの強さ調整
    - 解答タイミングの自然さ、ランダム性
    - 自身とAIが回答中の表示要素を変える

### 6日目
- 4/23(木)
- ランキング画面
- デザイン調整完了
- リソース準備完了
    - アプリアイコン
    - Top画像
    - AIのアイコン
    - BGM/効果音
    - クイズ

### 7日目
- 4/24(金) 
- オンライン対戦機能の開発着手
    - オンライン対戦の仕組みを調査
    - マッチングの流れを整理
    - マッチング実装、動作確認
    - クイズ対戦中の流れを整理
    - クイズ対戦中の実装、動作確認

### 9日目
- 4/26(日) 
- 全機能の開発完了！🐶
- AppStore申請

### 11日目
- 4/28(火)
- 1回目のリジェクト
    - iPad用のスクリーンショットをちゃんと作成
    - 再申請
- 2回目のリジェクト
    - 利用規約、お問い合わせ、ユーザーの違反申告を実装
    - 再申請

### 12日目
- 4/29(水)
- 3回目のリジェクト
    - ユーザーのブロック機能、クイズ履歴画面、クイズの違反申告
    - 再申請
- 4回目のリジェクト
    - iPadのクラッシュ修正
    - 再申請

### 13日目
- 4/30(木)
- v1.0.0リリース完了
- v1.1.0開発開始
    - シェア機能
    - レビュー機能
    - 広告（admob）調査、設計、実装

### 14日目
- 5/1(金) 
- v1.1.0リリース完了

## 利用ツール、開発環境
 - github
 - MacBook Pro
 - iPhone11 Pro
 - firebase
 - google app script

## 開発タスク
実際のisshuesです
<img width="300" alt="スクリーンショット 2020-05-01 20.43.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117784/d5a1b35b-499d-154b-4f7c-dac391fcd44e.png">

<img width="300" alt="スクリーンショット 2020-05-01 20.42.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117784/14ac66fa-0bc8-6601-49e0-efd0cdb2a5f2.png">


## 感想
開発着手からAppStore申請まで9日間とかなりタイトなスケジュールでしたが、
集中して効率よく開発できたと思います。
（19時まで本職で仕事して、その後深夜2時頃まで開発するという感じでしたw）

オンライン対戦のアプリは今回が初めての挑戦で、仕組みの調査や動作確認が大変でしたが、
期待通りに動作した時の嬉しさは普段の開発以上にありました。

また今回初めて4回もリジェクトを食らいましたが、
リジェクト後にすぐに修正して再申請すれば、当日に2回目のレビューをしてくれることを初めて知りました。
（朝5時にIn Review、５時半にReject、すぐに修正して６時半に再申請みたいな感じですw）

リリースまでの流れや感想が長くなりすぎたので、詳細なシステムの設計や実装については別の記事にまとめます。
最後までお付き合い頂きありがとうございます。
よろしければ実際にアプリをインストールして触っていただければ嬉しいです🐶
https://apps.apple.com/jp/app/id1510223709

まだまだ未熟なアプリではありますが、
次バージョン以降の開発も既に進めておりますので、
今後ともどうぞよろしくお願いいたします。

開発状況についてはTwitterにて掲載しております。
https://twitter.com/Quizdom_App
favicon.icoのファイルで表示されない場合

.icoのファイルで表示されない場合、img/〇〇.jpg  もしくは　img/〇〇.png　画像に置き換えると出来た。


<link rel="icon" type="image/ico" href="favicon.ico">

↓

<link rel="icon" type="image/ico" href="img/favicon.png">
[Firebase] Cloud Firestore データベースへのクライアント アクセスが 〇 日後に期限切れになります

Firestoreを使用する際テストモードだと30日で使えなくなりますが、ルールタブのtimestampを修正すれば回避できます。![0430(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/668478da-e0e5-1448-866c-f7cfa5f44522.png)
Vue.jsのコンポーネント間でデータを受け渡す方法

## 親から小へデータを受け渡す方法 【 :man: → :boy: 】

***・子コンポーネント :boy:***

```Child.vue
<template>
  <!-- 親コンポーネントから値を受け取るための箱を用意する -->
  <p>{{ value }}</p>
</template>

<script>
export default {
  // 親コンポーネントから値を受け取る為に、propsを定義する（複数定義することも可）
  props: ["value"],
}
</script>
```

***・親コンポーネント :man:***

```Parent.vue
<template>
  <div>
    <!-- 子コンポーネント側で定義したpropsのプロパティに、
         データを入れて子コンポーネントへ渡す（動的に値を変更する場合は、「v-bind」を使う） -->
    <Child value="親から子へ"></Child>
  </div>
</template>

<script>
// 子コンポーネントをインポート
import Child from './components/Child'

export default {
  /* template内でコンポーネントが利用できるように、
     componentsプロパティに子コンポーネントをセット */
  components: {
    Child,
  }
}
</script>
```

## 子から親へデータを受け渡す方法 【 :boy: → :man: 】

***・子コンポーネント :boy:***

```Child.vue
<template>
  <div>
    <!-- 親コンポーネントから値を受け取るための箱を用意する -->
    <p>{{ value }}</p>
    <!-- ボタンを押した時に、親コンポーネント側でカスタムイベントを発火 -->
    <button @click="change">値を変更</button>
  </div>
</template>

<script>
export default {
  // 親コンポーネントから値を受け取る為に、propsを定義する（複数定義することも可）
  props: ["value"],
  methods: {
    change() {
      // 親コンポーネントへ値を送る為のカスタムイベントを作成
      this.$emit("receive", this.value = "子から親へ");
    }
  }
}
</script>
```

***・親コンポーネント :man:***

```Parent.vue
<template>
  <div>
    <!-- 子コンポーネントのボタンが押されると、
         親コンポーネントのカスタムイベントが発火する -->
    <Child value="親から子へ" @receive="changeValue"></Child>
  </div>
</template>

<script>
// 子コンポーネントをインポート
import Child from './components/Child';

export default {
  /* template内でコンポーネントが利用できるように、
     componentsプロパティに子コンポーネントをセット */
  components: {
    Child,
  },
  methods: {
    // 子コンポーネントで定義した$emitの第２引数を受け取る
    changeValue(value) {
      // 値を入れ替える
      this.value = value;
    }
  }
}
</script>
```

## HTMLコードを子コンポーネントへ受け渡す方法 【 :page_facing_up: → :boy: 】

***・子コンポーネント :boy:***

```Child.vue
<template>
  <div>
    <!-- 受け口としてslotタグを配置
         親コンポーネント側のHTMLがslotタグと置き換わる -->
    <slot></slot>
  </div>
</template>

```

***・親コンポーネント :man:***

```Parent.vue
<template>
  <div>
    <!-- 送り口として、コンポーネントタグ内にHTMLを記述 -->
    <Child>
      <h1>HTMLを</h1>
      <h2>子コンポーネントへ</h2>
    </Child>
  </div>
</template>

<script>
// 子コンポーネントをインポート
import Child from './components/Child';

export default {
  /* template内でコンポーネントが利用できるように、
     componentsプロパティに子コンポーネントをセット */
  components: {
    Child,
  },
}
</script>
```
ROS2 launchファイルの作成

ROS2でプログラミングするために勉強したメモです．
ここでは，launchファイルの作成方法を書きます．

## A. 準備

#### 1. 起動するフォルダを作成

```
mkdir launch
```
#### 2. 起動ファイルを作成

```
touch launch/<〜launch.py>
```
- `<〜launch.py>`には好きな名前を書く．

## B. launchファイルを記述
まず最初に，完成形を示す．つぎにテンプレートを示す．

#### 3. フレームの記述

##### 例) 公式TutorialのLaunchファイル 
```
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            node_namespace='turtlesim1',
            node_executable='turtlesim_node',
            node_name='sim'
        ),
        Node(
            package='turtlesim',
            node_namespace='turtlesim2',
            node_executable='turtlesim_node',
            node_name='sim'
        ),
        Node(
            package='turtlesim',
            node_executable='mimic',
            node_name='mimic',
            remappings=[
                ('/input/pose', '/turtlesim1/turtle1/pose'),
                ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
            ]
        )
    ])
```
##### 参考サイト
- https://index.ros.org/doc/ros2/Tutorials/Launch-Files/Creating-Launch-Files/

##### テンプレート
```
# 必要なpythonモジュールをインポート
from launch import LaunchDescription
from launch_ros.actions import Node
# 以下に起動に関する詳細を記述
def generate_launch_description():
   return LaunchDescription([

   ])
```

#### 4. nodeの記述

##### 例) 公式TutorialのLaunchファイル
```
Node(
    package='turtlesim',
    node_namespace='turtlesim1',
    node_executable='turtlesim_node',
    node_name='sim'
),
Node(
    package='turtlesim',
    node_namespace='turtlesim2',
    node_executable='turtlesim_node',
    node_name='sim'
),
Node(
    package='turtlesim',
    node_executable='mimic',
    node_name='mimic',
    remappings=[
      ('/input/pose', '/turtlesim1/turtle1/pose'),
      ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
    ]
)
```
- 名前空間を分けることで，node_nameやtopic_nameの競合を回避できる．
- topicを再マッピングできる．

##### テンプレート
```
Node(
    package='',
    node_namespace='',
    node_executable='',
    node_name=''
    remappings=[
        ('', ''),
        ('', ''),
    ]
)
```

# 参考サイト
https://index.ros.org/doc/ros2/
【GAS】Chatworkのグループチャットを一括登録する

※投稿内容は個人の学習目的の記事であり、所属組織とは一切関係ありません。
　Chatwork公式ドキュメントではございませんので、自己責任でご利用ください。

こんにちわ、さかぐち（[@sakaguchi_mamii](https://twitter.com/sakaguchi_mamii)）です。

今回はスプレットシートに記載した内容でChatworkのグループチャットを一括登録していきます。

# APIトークンを取得する

右上のメニューから「API設定」を選択する。
<img width="210" alt="API設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136275/4ef9404f-037d-c32d-0db9-0109164b6be5.png">

パスワードを入力し、APIトークンを取得する。
<img width="978" alt="スクリーンショット 2020-04-29 20.30.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136275/b8b05005-c099-bfc5-e43a-1138192bac9b.png">

# スプレットシートを作成する
<img width="876" alt="スクリーンショット_2020-05-01_20_30_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136275/cf5fdee9-034d-0b01-7b08-cc451f60b97b.png">

今回はAPI実行時の必須項目のみ指定します。

* グループチャット名（必須）
* チャット概要
* 管理者権限のユーザー（必須）

# スクリプト
```javascript
const token = 'APIトークン';

function myFunction() {

  // スプレットシート読み込み
  var ss = SpreadsheetApp.getActiveSheet();
  const lastRow = ss.getLastRow();

  // 記載がある分だけ繰り返し
  for(let i = 2; i <= lastRow; i++) {

    var param = {
      name: ss.getRange(i, 1).getValue(), // グループチャット名
      description: ss.getRange(i, 2).getValue(), // チャット概要
      members_admin_ids: ss.getRange(i, 3).getValue() // 管理者権限のユーザー
    }
    // グループチャット作成
    createRoom(param);

  }
}

function createRoom(params) {

  var params = {
    headers : {'X-ChatWorkToken' : token},
    method : 'post',
    payload : {
      description: params.description,
      members_admin_ids: params.members_admin_ids,
      name: params.name
    }
  };
  var url = 'https://api.chatwork.com/v2/rooms';
  UrlFetchApp.fetch(url, params);

}
```
# テスト

できた！
<img width="1182" alt="スクリーンショット_2020-05-01_20_29_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136275/ff7059b6-f022-40ec-bda6-45b02ff5b366.png">
<img width="1182" alt="スクリーンショット_2020-05-01_20_32_57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136275/66852c42-1b14-1bf2-626e-467f520e5c91.png">

# 最後に

今回はChatworkのグループチャット作成APIを実行しました。
詳細は「[Chatwork APIドキュメント](https://developer.chatwork.com/ja/endpoint_rooms.html#POST-rooms)」を参照ください。
llvm-mingw での secure linker flags のメモ

実際には LLD へのオプション.

[LLD] [MinGW] Add support for --dynamicbase, ignore --nxcompat, --tsaware and --high-entropy-va
https://reviews.llvm.org/D40017

## 参考となる MSVC linker option

https://github.com/embree/embree/blob/master/common/cmake/msvc.cmake

* `/NXCompat`
* `/DynamicBase`
* `/SafeSEH` (32bit のみ)

## LLD

`--nxcompat` , `--dynamicbase` を指定しておけばよさげ.

## TODO

* [ ] 他の linker option についても調べる.
【JavaScript】spliceメソッドの使い方

#JavaScript
spliceメソッドの使い方について整理しました。

使いどころ：要素の位置が判明している状態で、連続した要素を削除or削除+追加する場合
shift,unshiftのようなこともできるが、ソレを使った方が早い。

##splice
配列に対して位置指定で削除、追加を行うメソッド

削除する場合の記法
splice(変化が開始する位置,削除する要素の数)


```js
    const a=[0,1,2,3];

    a.splice(0,1);//先頭1要素を削除。shiftと同じ
    console.log(a);//[1,2,3]

    a.splice(1,2);
    console.log(a);//[0,3]

```
削除して追加する場合の記法
・splice(変化が開始する位置,削除する要素の数,追加する要素1,追加する要素2……)

```js

    const a=[0,1,2,3];

    a.splice(0,0,-1);
    console.log(a);//[-1,0,1,2,3]。unshiftと同じ

    a.splice(1,2,10,20);
    console.log(a);//[0,10,20,3]
【Jest】トランスパイルできないモジュールをモック化する方法

# はじめに

JestはES5以下にトランスパイルできないモジュールがあるとエラーになってしまいテストを実行できません。
どうすればよいのでしょうか？


# 解決方法

**テストの内容に関連のないモジュールであれば、モジュールごとモックしてしまうことでテストを進めることができます。**


# エラーの例

[react-native-firebase]というライブラリを導入したところ、Jestのテストで読み込めませんでした。

```
    SyntaxError: Cannot use import statement outside a module

      1 | import React, { useEffect } from 'react';
    > 2 | import firebase from '@react-native-firebase/dynamic-links';
        |                                   ^
```

# よく紹介されている方法

`transformIgnorePattern `にモジュール名を記述する方法がよく紹介されていますが、エラーが治らないこともあるようです。


# `moduleNameMapper`を使用する方法

今回は`moduleNameMapper`を使用して、**モックファイルをJestに参照させる**方法でエラーを回避することができました。

## `moduleNameMapper`を設定ファイルに記述する

Jestの設定に追加します。
今回は
**@react-native-firebaseと名前のつくモジュール全ての参照を`firebaseMock.js`というモックに指定しています。**

```json:package.json
"jest": {
    "moduleNameMapper": {
      "@react-native-firebase/*": "<rootDir>/jest/mocks/firebase/firebaseMock.js"
    },
```

## モックファイルを作成する

先ほど指定したディレクトリ（ファイル構造は別になんでもいい）にモックファイルを作成します。

exportしてモジュールとして利用できさえすれば、特に中身のない空コンポーネントで良いと思います。

```js:firebaseMock.js
export default () => ({
  log: (message) => {},
  recordError: (err) => {},
});
```



# まとめ

`transformIgnorePattern`を利用して完全無視させる方法も良いのですが、`moduleNameMapper`を設定した方がモックモジュール内でアレコレすることも必要に応じて可能になります。

状況によってはこちらの方が便利かもしれません。
WebカメラでPC操作しちゃおっぜーⅡ。【さよならマウス！】


[前回](https://qiita.com/ykato/items/dd0a4d147d154d6de118)あまり精度が良くなかったんでリベンジ記事！

@t_okkanさんの記事、[Python + OpenCVで野球ボールをトラッキング](https://qiita.com/t_okkan/items/e08116d989bd9e241052)にヒントを頂き、処理方法を見直したりと改良しました。

![webcamops.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/1e98eca4-4a70-88a9-79cc-bf7e065c23ab.gif)

### ジェスチャーにあわせてバッチリ操作できてます！！

## なんのこっちゃ？？

要約すると**「影絵でオペレーション」**ってなやつです。

最初にアクションさせたい画像をアノテーションします。

![annotation3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/72ed3a09-62bc-35c6-a916-ffdf32dbe384.png)


　次にconfigファイルに画像に紐づく、マウスの操作なり、キー入力を定義します。それからプログラムを動かして、OpenCVの画像類似度の閾値を満たせば定義にそって操作してくれるってわけ。

# コード

[ここにおいときますんで、詳しくはリポジトリ側を見てくださいな。](https://github.com/yasutakatou/webcamops)

# あとがき

前回と同じく、基本は影絵方式なんで形さえあれば**どんなんでも**操作に置き換えられます。

![pine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/0f048b5c-c685-d1f4-e734-f486bc55b60c.png)

パインアメ美味しい！:pineapple:

# FYI

[Python + OpenCVで野球ボールをトラッキング](https://qiita.com/t_okkan/items/e08116d989bd9e241052)

[Pythonを使ってOpenCVで画像を『二値化』してみた](https://qiita.com/ayuma/items/883901c68719abbc7a78)

[Pythonを使ってOpenCVで画像を『平滑化』してみた](https://qiita.com/ayuma/items/07ec25f1d50629fed698)

[【Python】ウィンドウのタイトル文字列を取得する方法(win32api user32 GetWindowText)](http://oregengo.hatenablog.com/entry/2016/10/08/171018)
【Objective-C】isKindOfClassとisMemberOfClassの違い

#isKindOfClassとisMemberOfClass
isKindOfClassとisMemberOfClassはどちらもあるオブジェクトが特定のクラスのインスタンスかどうかを判断するためのメソッドです。
それではこの２つは何が違うのでしょう？？

**isKindOfClassは同一または親子関係にあるクラスを判定する為に使用する**

**isMemberOfClassは自身と同一のクラスかどうかを判定する為に使用する**

上記のような違いがあるようです。

**サンプルコード**
下記のコードを見ると、isKindOfClassでは親と同クラスの時にYESが返ってきて、isMemberOfClassでは同クラスのみYESが返ってきてます。

```objective_c
// @interface MyURL : NSURL @end

/* isKindOfClass */
NSURL *url = [NSURL URLWithString:@"http://marycore.jp"];
[url isKindOfClass:NSNumber.class]; // NO  (無関係なクラス)
[url isKindOfClass:NSObject.class]; // YES (親クラス)
[url isKindOfClass:NSURL.class];    // YES (同クラス)
[url isKindOfClass:MyURL.class];    // NO  (子クラス)
 
/* isMemberOfClass */
NSURL *url = [NSURL URLWithString:@"http://marycore.jp"];
[url isMemberOfClass:NSNumber.class]; // NO  (無関係なクラス)
[url isMemberOfClass:NSObject.class]; // NO  (親クラス)
[url isMemberOfClass:NSURL.class];    // YES (同クラス)
[url isMemberOfClass:MyURL.class];    // NO  (子クラス)
```

#isMemberOfClassの注意点
NSString型やNSNumberクラス等の標準クラスでは正常に動作しません。理由としては、例えばNSString型のインスタンスは__NSCFStringやNSTaggedPointerStringという特殊なインスタンスで表現されることがあるためです。
その為、下記のようにNOが結果として返ってきます。

```objective_c
[@"" isMemberOfClass:NSString.class]; // NO (?!)a
```
またコンクリートクラスと呼ばれる特殊なクラスから生成されたインスタンスに対しても使用できないので、注意が必要です。
C言語のif文が実行されるのは条件式が非ゼロのとき。ただそれだけ。


「え？if文？そんなの毎日使ってるからちゃんとわかってるよ♡」と思っていた自分を殴り倒したい案件が発生しました。
サンプルのコードは最初だけmain関数を書きましたが、他は省略します。

## if文が実行される条件に対して私が勘違いしていた2つのこと
まず、if文が実行される条件を確認しましょう。
**「条件式が非ゼロ」**です。いいですか、みなさん。キーワードは「**非ゼロ」**です。

今までの私はsample1.cのようなif文を書いていました。

```c:sample1.c
#include<stdio.h>
#include<stdbool.h>

int main() {
  bool result = true;
  
  if (result == true)
    printf("true\n");
  else
    printf("false\n");    

  return 0;
}
```

```terminal:sample1
true
```

### 勘違い1：if文の条件式には演算子が必要だと思っていた
if文の説明を書いた本やwebを見ると、

```c:疑似コード
if (条件) {
  文;
}
```

のように「if (条件)」と書いてあるものが多く、条件式というと個人的な感覚として

- 等価演算子（==、!=）
- 関係演算子（<、>、<=、>=）
- 論理演算子（&&、||）

などを使わないといけないと思っていました。

if文が実行される条件に演算子の有無は関係ありません。条件式が非ゼロという事実があればいいんです。

ということは演算子の結果が非ゼロになっているはず…

```c:sample2.c
  int x1 = (1 == 1); // 等価演算子 成立
  int x2 = (1 == 2); // 等価演算子 不成立
  printf("x1 : %d, x2 : %d\n", x1, x2);

  int y1 = (1 < 2); // 関係演算子 成立
  int y2 = (1 < 1); // 関係演算子 不成立
  printf("y1 : %d, y2 : %d\n", y1, y2);

  int z1 = 1 && 1;  // 論理演算子 1
  int z2 = 1 && 0;  // 論理演算子 0
  printf("z1 : %d, z2 : %d\n", z1, z2);
```

```terminal:sample2
x1 : 1, x2 : 0
y1 : 1, y2 : 0
z1 : 1, z2 : 0
```

論理演算子の結果が0 or 1なのは自明として、等価演算子と関係演算子は成立したときは1、不成立のときは0という結果を返すようです。
成立したときは1で非ゼロの条件を満たすから文が実行されるのですね。

sample1.cをもう一度確認してみると、result変数には0 or 1が格納されています。ということは等価演算子を使って「result == true」と書く必要がありません。

```c:sample3.c
  bool result = true;
  
  if (result)
    printf("true\n");
  else
    printf("false\n");    
```

```terminal:sample3
true
```

### 勘違い2：if文の条件式の結果は0 or 1だと思っていた。
if文というと、true/falseのイメージが強く、sample4.cのようなコードは条件式が成立しないと思っていました。…反省。

```c:sample4.c
  int x = 10;

  if (x)
    printf("OK!\n");
```

```terminal:sample4
OK!
```

## C言語のif文が実行されるのは条件式が非ゼロのとき。ただそれだけ。
if文の条件式は本当にシンプルでした。
ちょっとこれを意識すれば、コードを読むときや書くときに役に立つかもしれません。
Blender勉強メモ - 白犬作る1【素材の用意と配置】

#◆はじめに
Blenderの基礎、及び基礎練習終わった所で、
今回は、画像を参考し、物を作ります。

素材に関しでは、ネッドで探しでもいいし、自分の手元ある物の写真を撮って、素材を作るのもいいです。
[初期準備](https://qiita.com/Kujirai_sakananosuke/items/259cd1ce1d880d71a224)の勉強方法にも言いましたが、
できる限り難し過ぎないような物を選択した方かいいです。
構造は簡単で、細かい物が無い物がベストです。
![FD08934A-2977-4938-89D9-5881425E3C35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/8284017a-8a0d-ffb0-df82-2a57c9511523.png)
なので、今回は手元の白犬にぬいぐるみを使います！
（首輪は複雑の為、取ります。）

個人感想なんですが、手元の物を使った方かいいかもしれません。
立体の実物があるから参考しやすいです。
#◆環境
macOS Mojave バージョン 10.14.6
Blender　2.82
（個人の事情で、たまに2.81を使います。）
#◆製作前の素材準備
基本的には、上下、前後と側面の画像が必要となります。
![2C7A50E2-D22A-4A2A-9B09-71C85B3EEE55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/da6c00d1-e618-59a0-7fe8-45d9d413c147.png)
新規「dog_project」ファイル、Blenderファイルをこの中に保存する予定です。
![F8D28ED0-A639-49F4-A1AC-64039C1E3D67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/fb7049a5-d129-2ce3-5b44-f3675cc9d4d1.png)
中に新規の「img」ファイルを作り、画像素材を入れます。
ここに注意すべきなのは、画像のファイル名は必ず英文字にしないといけない、変な符号も付けない方かいいです、
ちなみに、意味がある名前を付けた方か色々便利です。
画像に関しては、PSDなどを使って、サイズを調整し、できれば画像内の犬ちゃんにサイズを統一した方がやり易いです。
#◆画像の読み込み
（初期の正方形削除ずみ）
画像の読み込みは非常に簡単です、
画像をBlenderにドラックするのみです。

読み込んたっら（option＋G）で、画像を中心点にリセットします。
**cursorは中心にいない時（shift＋S＋選択肢）**
![64EE87B4-4796-4314-9581-68134C7E1498.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/14cb4bb3-bd1f-b303-053b-75a5b540cd6a.png)
続いで、読み込んた画像を選択し、
「Empty」中の「Image」選択、「Use　Alpha」にチェックを入れれば、いろいろ調整できるようになります。
今回はサイズと透明度を調整しました。
![24589447-FC81-4955-B943-0FF16EFA5C5F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/416a0d01-3b60-cfa1-c970-aa611c4d2fae.png)
このようになりました。
![9DA8B02E-71E2-406F-B666-C46C867ACFBA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/0b9a56ee-0e0d-42b5-5820-d369e69bb3ed.png)
素材によって、角度や位置を調整する必要の場合は、（R）を使う以外に（N）を押し、表示されるメーニュから調整するのも可能です。
![24622A73-57AE-4211-9109-0BCE4D0FF873.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/8a676837-ca15-916a-1326-938048c8d808.png)
最後は、この様になりました。
#◆製作前に設置調整
新規モデルの時、モデルと画像の角度は同じした方か調整の手間が省けるので、まず新規モデル時の設置を調整します。
![BC8EB5F5-9891-467A-8163-E4E6F0B7BEE5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/a68a4d1f-9738-5046-826f-2f5180061075.png)
メーニュから「Edit」→「Pteferences」開けて、
「Editing」を選択し、
「New　Objects」の「Align to」を「View」に調整し、
「Enter Edit Mode」にチェックを入れます。
これで、新規モデルの時、モデルの角度は、視角と同じになります。
#◆製作あらすじ
今回の製作は、勉強するより、
復習の方が適切かもしれません。
新しい知識はありますが、同じ機能の繰り返し作業の方が多いかもしれません。

多視点を頼って、モデルの輪郭線を製作、調整し、少しずつ整形する作業です。
作業前設置はここまでです、次回は本番で製作スタートです。
では。
めっちゃ簡単だった！AWSでMatlabインスタンスを起動、リモート接続までしてみた話

#はじめに
クラウド上でmatlabを起動して実際に動かすという少し特殊なケースなのですが、ネットに記事がなかったためまとめました。
参考になれば幸いです。

選択肢としてはAWS or Azureがあるようです。今回はAWSでmatlabインスタンスを立ち上げてみたいと思います。(Azureで行いたい方は検索すればAzureの公式ドキュメントを見つけられます）

#結論
超簡単にできました！
awsにはmatlabが事前にインストールされたec2マシンを起動できるので便利でした。
5分もあれば動かせる環境が構築できます。
（本当はGCPで立ち上げたかったのですが、簡単に試せそうなものが見当たらなかったため諦めました。）
#構築
最初に公式サイトにある動画のリンクを貼っておきます。
英語ですが、実際に見ることでどのようにして立ち上げるかをイメージできるかと思います。

https://jp.mathworks.com/videos/how-to-run-matlab-in-the-cloud-with-amazon-web-services-1542634996553.html

手順としては


(0.awsアカウントを作る）


1.インスタンスを立ち上げるためのgithubにアクセスする。
https://github.com/mathworks-ref-arch/matlab-on-aws


2.下までスクロールしてLaunchを押して、飛んだページでregionを選ぶ（tokyoはap-northeast1）。


3.awsにログインして、必要な項目を埋めてインスタンスを立ち上げる。


自分のPCのIPアドレス、sshアクセスkeyが必要になります。
IPは"What's my ip"でググれば出てきます。

ssh keyはawsのサイトで事前に取得しておきましょう。
ssh keyは下のサイトより簡単に取得できます。
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwjA6pLZv5LpAhWRw4sBHTqjC0AQFjAAegQIAxAB&url=https%3A%2F%2Fdocs.aws.amazon.com%2FAWSEC2%2Flatest%2FUserGuide%2Fec2-key-pairs.html&usg=AOvVaw1zYtO9YpoYnSPe0tEF435G

4.remote desktopでアクセスします。

Microsoftのremote desktopを使ってリモート接続します。

macの人はAppStoreからインストールしましょう。Windowsはもともと入ってます。
aws.comで終わる自分で作ったインスタンスのIDをマシン名欄にコピペ。
アカウントはインスタンス生成時に作ったssh接続アカウントを使います。
awsアカウントではないので注意!

5.matlabを起動
デスクトップにあるmatlabをクリックで起動。

以上になります。
お疲れ様でした。

動かしてみてデフォルトのマシンだとスペックが足りない方はマシンを増設して分散処理とかできます。
必要に応じてチューニングしてあげてください。

#おわり
クラウドって改めて便利ですね。
既存のUnityプロジェクトをUniversalRenderPipelineに移行する -サードインパクト修復- 

![スクリーンショット 2020-05-01 19.05.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/62655d98-b494-97e7-7b79-0753571c451c.png)
既存のプロジェクトをUniversal Render Pipelineに移行する手順です。
![スクリーンショット-2020-04-30-22.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2ded5ce4-a7e8-ef6b-1ffa-c5d9b1612c59.png)

まず既存のプロジェクトを開き、
![スクリーンショット 2020-05-01 18.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ae57250d-dfd2-80fa-b9ee-f30ac529878b.png)
Package Manager で Universal RPをインストールします。
![スクリーンショット 2020-05-01 18.36.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7facea09-cde4-2361-8fec-9a95a490380a.png)

インストールするとCreate>Rendering..が選択できるようになるので、
Create>Rendering>UniversalRenderPipeline>PipelineAsset
を選択します。
![スクリーンショット 2020-05-01 18.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/6118ff3c-5d0b-8d46-787b-e612b7f9c62e.png)
するとUniversalRenderPipelineAssetが生成されるので、
![スクリーンショット 2020-05-01 18.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/9cbb7aa0-f359-4d1f-bb5f-cb6cdb5492f7.png)
これをProjectSettings>Graphics>ScriptableRenderPipelineSettings に入れます。
![スクリーンショット 2020-05-01 18.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/16111af9-e14c-4a0b-662f-92f40eba0676.png)

![スクリーンショット-2020-04-30-22.50.58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/35b11f3a-f058-cd96-0209-4d23223128a2.jpeg)

全てのマテリアルがピンクになります。
![スクリーンショット 2020-05-01 18.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/aa5d89d1-4bf7-e714-d698-d9a531d3f427.png)

ここで
Edit>RenderPipeline>Universal Renderpipeline>Upgrade Project Materials to UnivesalRP Materials
を選択します。

![スクリーンショット 2020-05-01 18.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/692f8d6b-6793-e09a-da59-eb57b7de5776.png)
基本的なシェーダーしか使っていなかった場合は、ほぼ元の状態に戻ります。
![スクリーンショット 2020-05-01 18.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/218c7724-9ec4-65e1-8542-ec9ecf219fc4.png)
コンバートできるマテリアルの種類は[以下の通りです](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.0/manual/upgrading-your-shaders.html)
![2019-10-22_190458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/6c6312ad-219e-edda-ca29-382358efb9aa.png)

いい感じに変換されなかった、または変換されなかったマテリアルは、自分で
Universal Render Pipeline系のアセットに置き換えます。
![スクリーンショット 2020-05-01 18.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c7611418-30d5-90eb-cf90-f3290171f338.png)
エラーの原因は、Railsの命名規則にあった

コンソール上で、物件と最寄駅テーブル同士の関連付けを確認をするため、以下のように入力しました。

```console
nearest_station =　Nearest_station.new({route:"yamannote",station:"ikebukuro",minutes_walk:5,property_id:1})
```
すると、

```console
LoadError: Unable to autoload constant 〇〇, expected ファイルのURL to define it
from /Library/Ruby/Gems/2.6.0/gems/activesupport
5.2.3/lib/active_support/dependencies.rb:511:in `load_missing_constant'
```
のエラー文が表示されました。googleで翻訳すると、「LoadError：定数Nearest_stationを自動ロードできません。ファイル名を定義する必要があります」という意味だったため、そのファイルにミスはないか確認しました。
しかし、ファイルに問題はありませんでした。
よくよく調べてみると、Railsの命名規則に原因がありました。
Railsでは、モデルなどのクラス名とそのクラスを定義するファイルの名前に規約があり、その規約に則ってスクリプトファイルの自動ロードが行われます。
コンソールに入力していた、Nearest_station.newという表現方法が、Railsの命名規則に反していたため、エラーが出ていたようでした。
また、エラー文に記載されていた、定数というのは、クラスを格納している定数のことでした。
NearestStationというクラスは定義された時、同じ名前のNearestStationという定数に代入されます。
#Rails 命名規則
クラス名、モジュール名は、キャメルケースを使う。
キャメルケース(CamelCase)：各単語の頭文字を大文字にする。_は使用しない。
ただし、HTMLやFTPなどの略語は全て大文字にする。

このルールに則り、命名したところ、無事にエラーは解消されました。

```console
[3] pry(main)> nearest_station = NearestStation.new({route:"yamannote",station:"ikebukuro",minutes_walk:5,property_id:1})
=> #<NearestStation:0x00007f911bb35ca0
 id: nil,
 route: "yamannote",
 station: "ikebukuro",
 minutes_walk: 5,
 property_id: 1,
 created_at: nil,
```
LaTeX→Qiita用MathJax変換マクロ@EmEditor

__EmEditor__のマクロ機能を使って簡単な$\mathrm{\LaTeX}$文書をQiita用に変換する．
ついでに式番号も自動で振る．

```LaTeX:変換対象
\section{定義}
\subsection{性質1}
\subsubsection{性質2}

\begin{align}
y=a,\label{eq:1}
\end{align}
ああああ
\begin{align}
y=b,
\end{align}
いいいい
\begin{align}
y=c,\label{eq:2}
\end{align}
ここで\ref{eq:1}と\ref{eq:2}より…

\section{定義}
\begin{align}
f=a,
\end{align}
```

↓`LaTeX2Qiita.jsee@EmEditor`

<pre>
# 定義
## 性質1
### 性質2


```math
\begin{align}
y=a,\tag{1}\label{eq:1}
\end{align}
```

ああああ

```math
\begin{align}
y=b,
\end{align}
```

いいいい

```math
\begin{align}
y=c,\tag{2}\label{eq:2}
\end{align}
```

ここで__($\ref{eq:1}$)__と__($\ref{eq:2}$)__より…

# 定義

```math
\begin{align}
f=a,
\end{align}
```
</pre>

上記をそのままQiita記事として貼り付けると以下のように表示される：

# 定義
## 性質1
### 性質2


```math
\begin{align}
y=a,\tag{1}\label{eq:1}
\end{align}
```

ああああ

```math
\begin{align}
y=b,
\end{align}
```

いいいい

```math
\begin{align}
y=c,\tag{2}\label{eq:2}
\end{align}
```

ここで__($\ref{eq:1}$)__と__($\ref{eq:2}$)__より…

# 定義

```math
\begin{align}
f=a,
\end{align}
```


ちなみに$\mathrm{\LaTeX}$では以下の図のように出力される：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617282/da276884-a9ed-ecd6-9002-1750a05f43f4.png)

↑

```LaTeX:ソース
\documentclass{jsarticle}
\usepackage{amsmath}
\begin{document}

\section{定義}
\subsection{性質1}
\subsubsection{性質2}

\begin{align}
y=a,\label{eq:1}
\end{align}
ああああ
\begin{align}
y=b,
\end{align}
いいいい
\begin{align}
y=c,\label{eq:2}
\end{align}
ここで\ref{eq:1}と\ref{eq:2}より…

\section{定義}
\begin{align}
f=a,
\end{align}

\end{document}
```


# マクロ本体

数式はいつも`\align`環境で書いてるのでそれにだけ対応．
テキスト形式で保存してマクロメニューから追加するだけ．

```javascript:LaTeX2Qiita.jsee
document.selection.Replace( "\%.*", '', eeFindReplaceRegExp|eeReplaceAll );
document.selection.Replace( "\\begin{align}", "\n```math\n\\begin{align}", eeReplaceAll );
document.selection.Replace( "\\end{align}", "\\end{align}\n```\n",eeReplaceAll );
document.selection.Replace( '\\\\Ref\{(.*?)\}', '__\(\$\\\\ref\{$1\}\$\)__', eeFindReplaceRegExp|eeReplaceAll);
document.selection.Replace( "\\label", "\\tag{}\\label", eeReplaceAll );
document.selection.Replace( "(<|>)", '\ $1\ ', eeFindReplaceRegExp|eeReplaceAll );
document.selection.Replace( "\\\\section\{(.*?)\}", '# $1', eeFindReplaceRegExp|eeReplaceAll );
document.selection.Replace( "\\\\subsection\{(.*?)\}", '## $1', eeFindReplaceRegExp|eeReplaceAll );
document.selection.Replace( "\\\\subsubsection\{(.*?)\}", '### $1', eeFindReplaceRegExp|eeReplaceAll );
document.selection.StartOfDocument();
for (var i=1; document.selection.Replace( "\\tag{}", "\\tag{"+i+"}", eeFindNext )>0;++i){}
```

# トラブルシューティング
　うまくいってるはずなのに表示がおかしいときは，F5更新したり，下付き添字のアンダーバーをエスケープしてみたりする．
理由がわからずdocker imageが消えた時の原因と解決例

#どんなもの？
下記のコマンドを打ったところ、今まで出てきていたdocker imageが出てこなくなったというものです

```
% docker images ls
```

#原因と解決方法は？
コマンドミスです。正しくは下記の通り単数形出なくてはなりません。このコマンドで元どおりdocker imageの一覧を見ることができます。

```
% docker image ls
```
【JavaScript】unshift,shift,push,popの違い

#【JavaScript】unshift,shift,push,popの違い

JavaScript初学者の視点で、備忘録兼ねて書きます。

配列を操作するunshift,shift,push,popの機能を整理してみました。

個人的に一番使うのはpush。
pushの反対はpop,shiftの反対はunshiftと覚えることで2つの暗記でまとめられます。

##unshift
配列の先頭に追加する

```js
let a = [1,2,3];
let b = a.unshift(0);

console.log(a);//[0,1,2,3];
console.log(b);//4
```
##shift
配列の先頭から除外する

```js
let a = [1,2,3];
let b = a.shift();

console.log(a);//[2,3];
console.log(b);//1
```
##push
配列末尾に追加する

```js
let a = [1,2,3];
let b = a.push(4);

console.log(a);//[1,2,3,4];
console.log(b);//4
```
##pop
配列末尾から除外する

```js
let a = [1,2,3];
let b = a.pop();

console.log(a);//[1,2];
console.log(b);//3
```
Ubuntu 20.04 arm64bit on Raspberrypi 4にSoftetherを導入する

##はじめに
Raspberrypi 4のOSをRaspbean32bitからUbuntu20.04LTSに乗り換えた際に、Softetherのインストールで詰まったので対処法のメモです。

ついでにRadius認証や証明書認証の有効化も行いました。

##インストール
問題点：Sofetherの配布ページではARM32bit向けのものしか配布されていない
　　　　→通常のインストール手順を踏むと <b>ARM64bit</b> のRpi4ではmakeで詰まる

対処法：ソースから作る

```bash!
#前提パッケージのインストール
$ sudo apt install build-essential
$ sudo apt install libreadline-dev libssl-dev libncurses-dev libz-dev

#ソースのダウンロード
$ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/archive/v4.29-9680-rtm.zip
$ unzip v4.29-9680-rtm.zip
$ cd SoftEtherVPN_Stable-4.29-9680-rtm
```
###OSS版の制限解除
エンタープライズ版との差別化のためか(多分そう)、OSS版ではRadius認証や証明書認証が無効になっているのでついでに解除

```
$ sudo nano src/Cedar/Server.c
```

``` Server.c 
bool SiIsEnterpriseFunctionsRestrictedOnOpenSource(CEDAR *c)
{
        char region[128];
        bool ret = false;
        // Validate arguments
        if (c == NULL)
        {
                return false;
        }


        SiGetCurrentRegion(c, region, sizeof(region));

        if (StrCmpi(region, "JP") == 0 || StrCmpi(region, "CN") == 0)
        {
                ret = true;
        }

        return false; //return ret;をreturn false;に変更

```

###ビルド

```
$ ./configure
```
この状態でmakeすると `cc: error: unrecognized command line option ‘-m64’` と出てエラーになる

MakeFileにx86_64bitアーキテクチャ向けのコンパイルオプションが入ってしまうことが原因らしい

Makefileの編集

``` Makefile.
#下記4か所にある -m64 オプションを全て削除
OPTIONS_COMPILE_DEBUG=-D_DEBUG -DDEBUG -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -g -fsigned-char <<-m64>>

OPTIONS_LINK_DEBUG=-g -fsigned-char <<-m64>> -lm -ldl -lrt -lpthread -lssl -lcrypto -lreadline -lncurses -lz

OPTIONS_COMPILE_RELEASE=-DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char <<-m64>>

OPTIONS_LINK_RELEASE=-O2 -fsigned-char <<-m64>> -lm -ldl -lrt -lpthread -lssl -lcrypto -lreadline -lncurses -lz
```

```
$make #これで通るはず
$sudo make install
```

###サービス登録
ビルドしたディレクトリにSystemd向けの雛形があるのでコピー

2020/05/24 追記
生成されるサービスファイルが適切なものとなっていませんでしたので、雛形を再作成し掲載しました

```
$ sudo nano /etc/systemd/system/vpnserver.service
```
```vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
ExecStart=/usr/bin/vpnserver start
ExecStop=/usr/bin/vpnserver stop
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target
```

```
$ sudo systemctl start vpnserver
$ sudo systemctl enable vpnserver
```
ここまでできれば管理ツールでGUIベースの設定ができるので安心

##さいごに
この後TOTP認証を導入したときも詰まったので書きたい(願望
GitHubでコンフリクトしたときの直し方

現在インターンでGitHub上の開発に参加させてもらっています。
開発の過程でローカルブランチをプッシュしてプルリクエストを出したときによく**コンフリクト**してしまうのでその修正の仕方を２通り先輩に教わりました。

忘れないうちに備忘録としてまとめておこうと思います。

また、筆者は**Windows**を使っているので、Windowsの言葉で書きます。

#方法１：（基本）ローカルで修正する
###手順１
`git fetch`

まず前提として、コマンドプロンプトで作業ディレクトリ上にいるとします。（普通はすでにいる）
そこでgit fetchを行うことでリモートの状態を取得します。

###手順２
`git merge origin/（マージしたいリモートブランチの名前）`

これにより、現在のブランチとマージしたいリモートブランチの状態のローカルでのマージを試みます。
コンフリクトが起きていたらコマンドプロンプト上にそのように表示されます。
とくに、どのファイルがコンフリクトを起こしているのかを書いてくれているので確認。

###手順３
**エディタで修正**

コンフリクトが起きているとgitがどこがどのようにコンフリクトしているのかをファイルに書き込んでくれているので、「自分のブランチ」と「リモートのブランチ」の違いを比べて
・どちらかを削除
・両方残す
・いいとこどりする
のどれを行うべきかを見比べ、リモートブランチと同じ所に関して違うコードを書いていない状態にする。

###手順４
**もう一度push**

これでコンフリクトが解消しているはず！

#方法２：（方法１に慣れたら）GitHub上で修正する
実は方法１の中身自体はすべてGitHub上で行えます。
ただ、基本は方法１なのでgitの基本が身につくまでは方法１でやって、方法２は方法１と同じことをGitHub上からやっているんだということを理解した上で使うべきとアドバイスをいただきました。
###手順１
**GitHub上のプルリクエストを確認する**
GitHub上にあるプルリク一覧の画面に行き、自分が出したプルリクを確認。

###手順２
**コンフリクトを修正**
コンフリクトが起きていたら修正画面に行けるので、その画面で修正。（ブラウザ上でGitHubがエディタとして動いてくれる！）
これでOK!
JavaScript 連想配列のキーが「全部一致している」や「一部含まれてる」を判定したいとき

##こんな感じの連想配列があって、「全部フルーツ？」とか「ドリンクが含まれてる？」とか調べたいとき

```javascript
const foods = [
  {
    id: 1,
    name: 'Apple',
    category: 'fluits'
  },
  {
    id: 2,
    name: 'Banana',
    category: 'fluits'
  },
  {
    id: 3,
    name: 'Grape',
    category: 'fluits'
  },
  {
    id: 4,
    name: 'Carot',
    category: 'vegetables'
  },
  {
    id: 5,
    name: 'Tea',
    category: 'drink'
  }
]
```

##everyとかsomeを使う👍

```javascript

// foodsが全部フルーツか？
const matchFluits = foods.every(item => item.category === 'fluits') // false

// foodsにドリンクが含まれているか？
const hasDrink = foods.some(item => item.category === 'drink') // true
```

##filterとかforEachを使う👎

```javascript

// 'drink'と一致する要素を取り出してから個数をBooleanでキャスト
// 取り出した要素が0個ならfalseにキャストされる
// ゴリゴリのゴリラ実装🦍
const hasDrink = (Boolean)(foods.filter(item => item.category === 'drink').length)

// forEachで
let hasDrink = false
foods.forEach(item => {
  if (item.category === 'drink') {
    hasDrink = true
    return
  }
})
```

##ところで
全部一致してる？みたいな変数ってどんな名前にするのがいいのだろう🤔🤔🤔
`hasDrink`は`containsDrink`の方がいい気もする

##MDN
[Array.prototype.every()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every)
[Array.prototype.some()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
box2djsの作法 その4

# 概要

box2djsの作法、調べてみた。
ニュートンの揺り篭、box2djsで無理、matterでやってみた。

# 写真


![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c22db389-2ec4-b685-c86a-0031bdee233a.png)


# サンプルコード


```
    var Engine = Matter.Engine,
        Render = Matter.Render,
        Runner = Matter.Runner,
        Body = Matter.Body,
        Composites = Matter.Composites,
        MouseConstraint = Matter.MouseConstraint,
        Mouse = Matter.Mouse,
        World = Matter.World;
    var engine = Engine.create(),
        world = engine.world;
    var render = Render.create({
        element: document.body,
        engine: engine,
        options: {
            width: 600,
            height: 400,
            showVelocity: true
        }
    });
    Render.run(render);
    var runner = Runner.create();
    Runner.run(runner, engine);
    var cradle = Composites.newtonsCradle(280, 100, 3, 30, 200);
    World.add(world, cradle);
    Body.translate(cradle.bodies[0], { 
        x: -180, 
        y: -100 
    });
    var mouse = Mouse.create(render.canvas),
        mouseConstraint = MouseConstraint.create(engine, {
            mouse: mouse,
            constraint: {
                stiffness: 0.2,
                render: {
                    visible: false
                }
            }
        });
    World.add(world, mouseConstraint);
    render.mouse = mouse;
    Render.lookAt(render, {
        min: { 
            x: 0, 
            y: 50 
        },
        max: { 
            x: 800, 
            y: 600 
        }
    });



```

# 成果物


https://embed.plnkr.co/plunk/YNPykvKfxdNrTuHT


以上。
【JavaScript】lengthを使って文字列の長さや配列の長さを取得

# lengthとは
文字列の長さや配列の要素数を取得することができるプロパティ。

## 文字列（String）とlength
### 基本的な構文と書き方

```sample.js
// 文字列にそのままlengthを使う
string.length

// 変数に代入した文字列にlengthを使う
var str = 'こんにちは';
str.length;
```
上記のように使用することで文字数を取得することができる。
※文字数が「半角・全角」に関係なく1文字でカウントされる。

### 文字列の長さを取得

```sample.js
var str = 'こんにちは';

console.log(str.length);
```
文字列は5文字なので実行結果には「5」という数値が出力される。

## 数値型(Number)とlength

lengthはあくまで文字列や配列のために用意されているので```数値型には利用できない。```しかし、文字列と組み合わせれば利用することができる。

```sample.js
var str = 12345 + '文字列';

console.log(str.length);
```
実行結果は「8」。数値と文字列を連結させることで数値を含めて全体が文字列となり、文字の長さを取得できる。

## 配列(Array)とlength
### 基本的な構文と書き方

```sample.js
var array = [配列,配列]；

array.length;
```
### 配列の要素数を取得

```sample.js
var array = ['リンゴ','ブドウ','メロン','イチゴ'];

console.log(array.length)
```
実行結果は「4」。要素数が多いものや動的に変化するような配列だとlengthが重要となる。

### 要素数をlengthで変更
#### 要素数を減らす

```sample.js
var items = ['リンゴ','ブドウ','メロン','イチゴ'];

// 要素数を3に変更する
items.length = 3;

console.log(items);
```
実行結果は ['リンゴ' , 'ブドウ' , 'メロン']  
配列の場合はlengthに値を代入することで要素数を自由に変更することができる。自動的に末尾の「イチゴ」は削除される。

#### 要素数を増やす

```sample.js
var items = ['リンゴ','ブドウ','メロン'];

// 要素数を5にする
items.length = 5;

console.log(items);
```
実行結果

```sample.js
Array(5) ['リンゴ','ブドウ','メロン']

// 可視化するとこんな感じ
item = ['リンゴ','ブドウ','メロン','undefind','undefind']

```
追加された要素は未定義のため 'undefind' が格納されている。

## 関数(function)とlength
↓「引数」をもつ一般的な関数の定義

```sample.js
function value(引数,引数,引数・・・)　{
  // 処理内容
}
```
引数をもつ関数にlengthプロパティを使用

```sample.js
function value(item1, item2, item3, item4 ) {
 // 処理内容
}
console.log(value.length);
```
実行結果は「4」
このように関数を使用することでその関数で定義されている「引数」がいくつあるか取得することができる。

## オブジェクト(Object)とlength

```sample.js
var object = {
  name: '太郎',
  age: 30,
  location: '日本'
}

console.log(object.length);
```
実行結果は「undefind」
オブジェクトに対してlengthを使用することはできない。

### Object.key()を使って要素数を取得

```sample.js
var value = Object.key(object);

console.log(value.length);
```
オブジェクトの要素を配列データとして取得できるObject.key()の引数にオブジェクトを指定することで要素数を取得することができる。
AWS 認定ソリューションアーキテクト – プロフェッショナル 合格への道#15　1回目不合格　感想

#初めに
本日プロ試験を受けてきました。
結果は不合格でした。

試験の所感といたしましては、以下になります。

* 時間が足りなかった
* 翻訳がきつくて何を言っているのかわからなかった
* サービスの理解不十分だと感じた

上記の敗因について分析していきます。

##今後の方針
今回は以下のフローで落ちました。

* 模擬試験を解く→わからない点をホワイトペーパーとエントリなどから補うやりかたで学習→本番受験→そもそも日本語翻訳がひどくて問題文から構成を想像できなかった→不合格

試験は慣れと知識理解の二つが合わさって合格するというものなので"試験慣れ"の部分が足りませんでした。
知識不足は後日スコアがメールで通知されるのでその時にまた分析したい。

udemyで問題集を購入して再度チャレンジしてみます。
そろそろ高い受験料払っているのに日本語訳されないあたりさすがに切れてもいいとは思いますがどうなんでしょうかAWSさん。
この文字のスタイル、そう再現しますか？CSS


画像ですみません。

CSSの質問です。

この文字のスタイル、2重の縁取りのようなデザインなのですが
どう表現できますか？


shadow、strokeを駆使しましたがうまくいかず,,,

テクニックを教えてください。

<img width="126" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586251/c0dc6f69-67ed-680b-c0aa-40caa0a96281.png">
#Ruby 2.7 – Try code example – receive args and keyword args both with asterisk ( single splat and double splat both )

```rb
# Ruby 2.7
# receive args and keyword args both with asterisk

def foo(*args, **kwargs)
  p args
  p kwargs
end

# Single arg
foo("YES")
# ["YES"]
# {}

# Multiple args
foo("AH", "WOW")
# ["AH", "WOW"]
# {}

# Array single args
foo(["WOW", "YEAH"])
# [["WOW", "YEAH"]]
# {}

# Array multiple args
foo(["SAY", "YES"], ["SAY", "NO"])
# [["SAY", "YES"], ["SAY", "NO"]]
# {}


# Args + Keyword Args
foo("SOME", "HOW", x: "X", y: "y")
# ["SOME", "HOW"]
# {:x=>"X", :y=>"y"}

# Only Keyword Args
foo(x: "X", y: "y")
# []
# {:x=>"X", :y=>"y"}

# Hash args
# warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
# *args will be empty!
# *kwargs takes hash!
foo({ x: "X", y: "y" })
# []
# {:x=>"X", :y=>"y"}

# Multiple args + Hash
# warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
foo("BIG", "CHANCE", { new: :age, will: :come })
# ["BIG", "CHANCE"]
# {:new=>:age, :will=>:come}

# Unable to use arg after keyword arg
# Syntax Error
# syntax error, unexpected ')'
#
# foo(x: "X", y: "y", "A")

```

# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->