OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアが欲しい情報に最速で辿り着くには

# 目次
- [はじめに](#はじめに)
- [検索の目的を簡潔に言語化する](#検索の目的を簡潔に言語化する)
- [便利な英語の検索ワード](#便利な英語の検索ワード)
- [エラーへの対処](#エラーへの対処)
- [さいごに](#さいごに)

# はじめに
エンジニアとしてプログラムを書いていると、検索することが良くあります。
もし検索のセンスがあれば、欲しい情報によりスムーズに辿り着ける為、検索スキルはプログラマーにとって大事なスキルです。

そこで今回は、エンジニアとして検索する際のコツについてご紹介します。

# 検索の目的を簡潔に言語化する
基本的なことですが、検索を行う前に「何を知りたいのか」を明確にしておく必要があります。

例えば「**ハンバーグ**」と検索しても、
・ハンバーグとは何か
・ハンバーグのレストラン
・ハンバーグのレシピ
・ハンバーグの歴史
・ハンバーグのイラスト
など様々な情報が検索結果に表示されてしまい、なかなか目的の情報に辿り着けません。

これを「**ランチ 1000円以内 渋谷 ハンバーグ**」と検索すれば、
・渋谷でランチが1000円以内で食べられるハンバーグのお店
がピンポイントでヒットする可能性が高くなります。

**この様に、検索エンジンに対して「私はこれが知りたい」という情報を具体的かつ端的に伝えることが大事です。**
自分が知りたい事を正確に伝えられると、欲しい情報はすぐに手に入ります！

# 便利な英語の検索ワード
エンジニアは英語で検索することが多いです。その為、便利な検索ワードを知っていると検索が捗ります。

私がよく使用する検索ワードを下記にまとめました。
この他にも「この検索ワード便利だよ！」というものがありましたら、ぜひコメントで教えてください！

(2021.11.22追記：一部コメントでいただいた内容を追記しております。)

| キーワード | 用途 | 具体的な使い方 |
|:-----------|------------:|:------------:|
| what is | 何であるか知りたい | what is Flutter |
| how to use | 使い方を知りたい | how to use cocoapods |
| how to fix | (エラー等の)直し方を知りたい | how to fix null point exception|
| use cases/examples | 活用事例や具体例を知りたい | App Clips use cases |
| setup | 環境構築したい | android studio setup |
| documentation  | (主に公式の)ドキュメントを見たい | UICollectionView documentation |
| reputation | (ツール等の)評価・評判を知りたい | SwiftUI reputation |
| not working | (メソッド等が)動作しない原因を知りたい | animation not working |
| vs | (ツール等の)比較を行いたい| ReactNative vs Flutter |
| how to ~~ programmatically | GUIベースの操作をCUIベースで行いたい | how to create post programmatically in wordpress |
| shortcut | ショートカットキーを知りたい | WebStorm shortcut |
| install | (主にライブラリ等を)インストールしたい | cypress install |
| alternative | 代替となるものを探したい | iframe alternative |

(2021.11.22追記)
英語で検索を行う場合は、英語版のGoogleで検索すると良いです。

# エラーへの対処
ここからはもう少し具体的なお話をします。
実際に開発作業をしていてエラーにぶつかった時に、どうやって解決しているかを紹介します。

**⓪まずはエラーをよく読む**
忘れがちですが、これが一番大事です。
エラーは私たちにどうすれば解決するか教えてくれています。
翻訳サイトなども活用し、まずはなぜエラーが起きているか原因を見極めることが肝要です。

**①エラーをそのまま検索してみる**
自力での解決が難しいとなった場合は、検索してみます。
エラー内容の変数名などは取り除いた方が正確な情報に辿り着きやすいです。
(ダブルクォーテーションで検索文言を囲むと、完全一致で検索してくれるので、場合によっては使うのもアリです。)

**②検索結果から関連するワードや気になるリンクがないか探してみる**
①で解決しない場合は、検索した記事に気になるワードがないかどうか探します。
そこで気になったワードがあれば、そのワードを元の検索ワードに追加したり、そのキーワードで再検索します。用語を上手に組み合わせるのが検索のコツです。

**③類義語で検索してみる**
それでも解決しない場合は、類義語で検索してみます。
英語だけでなく中国語の記事を読む場合もたまにあります。
(右クリックで日本語に変換すれば、問題なく読めることが多いです。)

**④他の人を頼ってみる**
③まで試したけど、解決策が見つからない場合は他の人の力を借ります。
他の人に調べてもらったら一瞬で解決することもよくあります。
(私は15分調べて分からなければ他の人に聞きます。)

個人開発であれば、ココナラなどのサービスを使ってみるのも良いと思います。

**⑤そもそも別の方法がないか考えてみる**
それでも解決しないケースも稀ですがあります。
そういう時は別の方法なら上手くいかないか、エラーが出る前の状態からやり直してみます。
少し時間を置いてみるのも一つの手です。
(ゆっくり休んで再度試してみるのはとても大事ですね。)

もしいずれかの方法で解決した場合は、Tipsとしてどこかにメモしておくのも大事です。以前調べた情報を保存していると、同じエラーに再び自分や仲間が遭遇した時に短時間で対処出来る様になります。

# さいごに
エンジニアとして分からないことがあっても、それを解決できる方法を知っていれば開発していて困ることは極端に少なくなります。

その解決方法の1つとして、便利な検索方法を知っていることはプログラマーの強力な武器になります。今回私が紹介した方法が、本記事を読んでくださった方のお役に立てば幸いです。
【無料写真素材】ゲーム・アプリ開発におすすめの写真素材ダウンロードサイト2選。

アプリ制作におすすめの、写真の素材サイト【無料】をまとめてみました。

というか、以下二つで大体事足ります。

https://kaedeee.com/app-famous-photo-download-site/

それぞれの短所・長所も追加でまとめて行きます。



##PAKUTASO

https://www.pakutaso.com
![スクリーンショット 2021-11-17 19.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/995aa0d5-4719-ec06-fd42-b83d67a16720.png)


**長所**
日本人男性、女性の素材が豊富。
食べ物や、景色などの素材も豊富。

**短所**
どこかでみたことある感。

##PIXABAY

https://pixabay.com

![スクリーンショット 2021-11-17 19.58.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/e034a220-eb42-b6dc-f5f3-667b619eecc0.png)


**長所**
素材豊富。
なんでも出てくる（マジ）

**短所**
たまに有料素材が出てくる（広告欄なのでよくみたらわかる）



##終わり
2つのおすすめ写真素材ダウンロードサイトをご紹介しました。
便利スギィ！

https://kaedeee.com/app-famous-photo-download-site/
AtCoder ABC217 D - Cutting Woods 解

##問題概要
区間 $[0,L]$ に対して以下2種類のクエリを順に施した結果を出力せよ。クエリは合計で $Q$ 個ある。
1. 指定された $x=0,1,2,...,L-1$ で区間を分割する
2. $x$ の属する区間長を出力する

* 主な制約
 * $1 \le L \le 10^9 $
 * $1 \le Q \le 2 \times 10^5 $

https://atcoder.jp/contests/abc217/tasks/abc217_d

##考察
※公式解説が十分すぎるほど詳しい。

出力対象である $x$ の属する区間長を求めるには、$x$ を挟む（最寄りの）区間の切れ目を検索できれば良い。その検索速度は、$Q$ の大きさ的に$\log Q$ のオーダーまでは許容できるので、二分探索で乗り切りたい。そのためには、lower_bound 関数などを適用できるデータ構造に切れ目の情報を入れておきたい。すると set が自然と浮かぶ。

この方針で実装したときの時間計算量が $Q \log Q$ のオーダーに収まることは（直感的にはいけそうだが）非自明なので一応確かめておくべき。ありがたいことに公式解説にある。

##実装
set に対して lower_bound を当てるときは set のメソッドとして `set.lower_bound(queried_value)`のように呼ばないと遅くなるっぽいので注意。 ここをミスって一度 TLE を出した。

lower_bound の返り値が `set.begin()` や `set.end()` になると処理が面倒なので $0$ と $L$ に切れ目があるというダミー情報を set に入れておいた。

```cpp
#define rp(i, n) for (int i = 0; i < n; ++i)
#define print(x) std::cout << (x) << std::endl;
int main() {
    // read input
    auto L = in<ll>();
    auto Q = in<ll>();
    set<ll> cut;
    cut.insert(0);
    cut.insert(L);
    rp(i, Q) {
        auto c = in<ll>();
        auto x = in<ll>();
        if (c == 1) {
            cut.insert(x);
        } else {
            auto r = cut.lower_bound(x);
            auto l = prev(r, 1);
            print(*r - *l);
        }
    }
}
```
【javascript】instanceof

# instanceofとは？
どのコンストラクタから作成されたオブジェクトかを確認する。

## 使い方

### case1
コンストラクタ関数 instance の Fを instanceofで評価すると`true`　と評価され、
Fから作成されたインスタンスだということがわかる。

```js
function F(a, b) {
    this.a = a;
    this.b = b;
}

F.prototype.c = function() {}

const instance = new F(1, 2);
console.log(instance instanceof F) >> true
```

### case2

今度は、コンストラクタFの戻り値をオブジェクト形式でreturn すると`false`となる。

```js
function F(a, b) {
    this.a = a;
    this.b = b;
    return {a: 1}
}

F.prototype.c = function() {}

const instance = new F(1, 2);
console.log(instance instanceof F) >> false

```

#### 違いは何か？

returnされたものは,function Fで作成されたオブジェクトではなく別のオブジェクトになる。すなわちfalse。

つまり、returnされたオブジェクトは以下のようなプロセスになっている。

```js
function F(a, b) {
    this.a = a;
    this.b = b;
    const result = new Object();
    result.a = 1;
    return result;
}
```

作成したF関数はどのようになっているか？
これはFコンストラクタ内部でreturnされているのはresultなのでF===resultという形になっている。
Python 配列の使い方

#リスト（配列）の初期化
角かっこ「[]」で囲み、要素をカンマ「,」区切りで並べる

```python
empty_list = []

# 整数配列
int_list = [0, 1, 2]
```

# 要素へのアクセス
###インデックスで
```python
mylist = list(range(10))

# 正数は先頭からのインデックス
n = mylist[1] 

# 負数は末尾からのインデックス 末尾の要素のインデックスが-1
n = mylist[-2]

# popメソッドで指定したインデックスにある要素をリストから取得して削除
value = mylist.pop()           # インデックスを指定しない場合は末尾の要素が削除される
print('popped value:', value)  # popped value: 9
print('mylist:', mylist)       # mylist: [0, 1, 2, 3, 4, 5, 6, 7, 8]
```
### スライスで
```python
mylist = list(range(10))

# 0～4番目の5要素を取り出す
s = mylist[0:5] 
print(s)     # [0, 1, 2, 3, 4]

# 全要素を取り出す
s = mylist[:]
print(s)      # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 5番目以降の全要素を取り出す
s = mylist[5:]
print(s)      # [5, 6, 7, 8, 9]

# 0～4番目の5要素を取り出す
s = mylist[:5]
print(s)      # [0, 1, 2, 3, 4]

# 0、2、4、6、8番目の要素を取り出す
s = mylist[0:10:2]
s = mylist[::2]  # 同上
print(s)      # [0, 2, 4, 6, 8]
```

# リストの結合
###+演算子で
+演算子では新しいリストが作成される

```python
tmp = mylist + [5, 6]
print(tmp)     # [0, 1, 2, 3, 4, 5, 6]
print(mylist)  # [0, 1, 2, 3, 4]

# リストはリスト以外と結合できない
mylist = mylist + 5 # TypeError
mylist = mylist + (5, 6)
```

###+=演算子で
+=演算（累算代入）では元のリストが変更される

```python
mylist += [5]
print(mylist)  # [0, 1, 2, 3, 4, 5]
```

# リストへ要素を追加する
```python
mylist = list(range(5))

# リストの末尾に要素を追加
mylist.append(5)
print(mylist)  # [0, 1, 2, 3, 4, 5]

# appendメソッドの引数は1つだけ
mylist.append(6, 7)  # TypeError

# リストの末尾に単一の要素として「リスト」を追加
mylist.append([6, 7])  
print(mylist)  # [0, 1, 2, 3, 4, 5, [6, 7]]

# リストの末尾に反復可能オブジェクトの個々の要素を追加
mylist.extend([8, 9])
print(mylist)  # [0, 1, 2, 3, 4, 5, [6, 7], 8, 9]

# TypeError：extendメソッドには反復可能オブジェクトのみ渡せる
mylist.extend(10)

mylist.extend({10: 'foo', 11: 'bar'})  # 反復可能オブジェクトなのでOK
print(mylist)  # [0, 1, 2, 3, 4, 5, [6, 7], 8, 9, 10, 11]

mylist.insert(1, 0.5)  # 指定したインデックスに要素を挿入
print(mylist)  # [0, 0.5, 1, 2, 3, 4, 5, [6, 7], 8, 9, 10, 11]
```

# 要素の削除
```python
mylist = list(range(10))

# インデックスで
del mylist[4]

# clearで全要素を削除
mylist.clear()

# removeで値を指定
mylist.remove(0)

# 指定した値がリスト中にないと例外となる
mylist.remove(0)  # ValueError
```


#リストから要素を検索する
```python
# 10個の整数値を要素とするリスト
mylist = [2, 5, 11, 15, 1, 3, 18, 3, 19, 8] 

# 指定した値が含まれているか
result = 0 in mylist
print(result)  # False

# 指定した値が含まれていないか
result = 0 not in mylist 
print(result)  # True

# 指定した値が何個含まれているか
cnt = mylist.count(3)
print(cnt)  # 2

# 指定した値がどのインデックスにあるかを検索
idx = mylist.index(3)
print(idx)  # 5

# 検索範囲を指定
idx = mylist.index(3, 6, len(mylist))　# index(検索値, 開始index, 終了index)
print(idx)  # 7

# 存在しない値を指定
idx = mylist.index(100)  # ValueError

# 複数のリストの中で最大のリストを取得
max_value = max([0, 1], [4, 5], [2, 3]) 
print(max_value)  # [4, 5]
```
[競プロ][Max Subarray] Kadane’s Algorithmの最大積への適用


Kadane’s Algorithmは最大部分配列和の解法に用いられる。
これを応用して最大部分配列積の解説を行う。


## 問題

任意の配列Aがありそれの部分配列を考える。
部分配列の要素の積が取りうる最大値を求める。
例えば、[2,3,-2,4]の場合は[2,3]の部分の積が6になるのでこれが答え。

## 考察

この問題の難しいところは負の数が奇数個含まれていると積が負の数になるが、偶数個の場合は正の数になるのでそれを考慮する必要がある。
まずは問題を簡単にして考えて見る。

## 問題（要素が正の数のみの場合）

この場合は最も直観的で、全ての要素の積をとったものが答えとなる。

```c++
int maxProduct = 1;
int ans = INT_MIN;
for (int a: A) {
    maxProduct *= a;
    ans = max(ans, maxProduct);
}
```

## 問題（要素が正の数と０のみの場合）

気を付けるポイントは積に０が含まれるとそれ以降の答えは全て０になるので、選択する部分配列をその時点から再計算する必要がある。



```c++
int maxProduct = 1;
int ans = INT_MIN;
for (int a: A) {
    // 積が0になってしまっているので、もう一度この要素から再計算
    if (maxProduct == 0) {
        maxProduct = a;
    } else {
        maxProduct *= a;
    }
    ans = max(ans, maxProduct);
}
```

## 問題（要素に負の数も含まれる場合）

本題
Kadane’s Algorithmを適用するためにDPを下記のように定義する

DP[i][0]:=任意の要素からA[i]までの部分配列の最大積
DP[i][1]:=任意の要素からA[i]までの部分配列の最小積

遷移状態を考えると、最大積の場合はもしA[i]が負の数の場合はできるだけ数の小さい値と積を求めたい。また同じように最大積の場合にA[i]が負の数だった場合、できるだけ数の大きい値との積を求めるのが最適解。
よって初期状態と状態遷移は下記のように定義できる

```
初期状態: DP[0][0] = A[0], DP[0][1] = A[0]
状態遷移: 
DP[i+1][0] = max(DP[i][0]*A[i+1], A[i+1]) if A[i+1] >= 0
             max(DP[i][1]*A[i+1], A[i+1]) if A[i+1] < 0
DP[i+1][1] = min(DP[i][1]*A[i+1], A[i+1]) if A[i+1] >= 0
             min(DP[i][0]*A[i+1], A[i+1]) if A[i+1] < 0
```

求める回答はDP[0][0]からDP[n-1][0]までの最大値となる。

## 練習問題

[152. Maximum Product Subarray](https://leetcode.com/problems/maximum-product-subarray)

```c++
int maxProduct(vector<int>& nums) {
    int maxProduct = 1;
    int minProduct = 1;
    int ans = -1e9;
    for (int num: nums) {
        if (num < 0) swap(maxProduct, minProduct);
            maxProduct = max(maxProduct*num, num);
            minProduct = min(minProduct*num, num);
            ans = max(ans, maxProduct);
        }
    return ans;
}
```
【Nuxt.js】自動生成されるVue.Routerの設定確認

#はじめに
こんにちは！
今回は【Nuxt.js】自動生成されるVue.Routerの設定確認についてアウトプットしていきます！

#Vue.Routerの設定確認方法


自動生成された`Vue.Router`は普段見るものではないので、隠しディレクトリ`.nuxt/router.js`の中にルートの定義が設定されています。

```router.js

export function createRouter() {
    routes: [{
      path: "/",
      component: _96246318,
      name: "index"
    }]
}

```
TOPページについて`path`,`component`,`name`が設定されています。

pagesディレクトリの中に`usresディレクトリ/index.vueファイル,other.vueファイル`を作成します。

![スクリーンショット 2021-11-07 14.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/f299e814-388a-ca7f-42e7-b712b519a8bc.png)

このようにディレクトリ、ファイルを生成すると自動生成されるVue.Routerは以下のようになります。

```router.js

export function createRouter() {
    routes: [{
      path: "/users",
      component: _2eacf0a6,
      name: "users"
    }, {
      path: "/users/other",
      component: _b660e22a,
      name: "users-other"
    }, {
      path: "/",
      component: _96246318,
      name: "index"
    }]
}

```
このようにルートの定義が更新されます。


#最後に
今回は自動生成されるVue.Routerの設定確認についてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
[Laravel] レコードの更新でupdated_atを自動更新させない

### やりたいこと
表題の通り、where句などで条件で絞ったレコードを指定カラムのみで一括更新したい。


### 実行環境
Laravel 5.7 
注意：他のバージョンでは、別の実装方法で解決ができるかもしれません。


### 結論
Eloquentを利用せずに、[クエリビルダ](https://readouble.com/laravel/5.7/ja/queries.html)を仕様して更新（update)をする。
クエリビルダではデータベースを直接操作可能になるので、Eloquentを利用するときのEloquentモデル規約などは反映されずに更新したいカラム以外のupdated_at(timestamp型)は更新されなくなる。

```sample.php
DB::table('item')->where('status', 1)->update(['status' => 2]);
```

## 検討した実装方法
### Eloquentを利用したupdate
特定のカラムの更新のみをしたいときにエレクエントを利用したupdate処理。
itemsテーブルの`status = １`を`status = 2`に更新させたい。
以下のようにすると`status = 2`に更新はできますが、同時にtimestamps型の`updated_at`も更新されてしまいます。

```sample.php
Item::where('status', 1)->update(['status' => 2]);
```

ドキュメントにも記載されてます。
>デフォルトでEloquentはデータベース上に存在するcreated_at(作成時間)とupdated_at(更新時間)カラムを自動的に更新します。これらのカラムの自動更新をEloquentにしてほしくない場合は、モデルの$timestampsプロパティをfalseに設定してください。
[タイムスタンプ](https://readouble.com/laravel/5.7/ja/eloquent.html)

この設定をしてしまうとEloquent全体に適応されてしまうので、今回みたいに一部でのみ`updated_at`を利用したくない場合は使えませんでした。

### saveメソッドでの更新
saveメソッドも自動で`update_at`は自動更新されますが、明示的に`$item->timestamps = false`とすることで自動更新されなくなります。今回は一括で更新したい。バッチ処理だとクエリ数が多くなるのでこちらも使えませんでした。

```sample.php
$item = Item::where('status', 1)->first();
$item->status = 2;
$item->timestamps = false;
$item->save();
```

## まとめ
普段はEloquentを利用したレコード操作多くて、クエリビルダを全然使ってなかったので解決までに時間がかかりました。。。
【無料の効果音素材】ゲーム・アプリ開発におすすめの効果音ダウンロードサイトまとめてみた。６つ

アプリ制作におすすめの、効果音(SE)のダウンロードサイト【無料】をまとめてみました。

それぞれの短所・長所も追加でまとます。

↓最新更新版

https://kaedeee.com/app-famous-sound-download-site/

#効果音ラボ
https://soundeffect-lab.info/sound/voice/people.html

![スクリーンショット 2021-11-17 19.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/ec268d9d-af59-bb1e-8a50-3dfdd6106c95.png)
**長所**
効果音の素材豊富。
かわいい（かっこいい）声優の音声がある。
ヒカキンが使ってる。

**短所**
これじゃない感を感じる効果音もある。（つまり主観とのギャップが大きいものもたまに）

#魔王魂

https://maou.audio/category/bgm/bgm-neorock/

![スクリーンショット 2021-11-17 19.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/c59338ab-3026-b172-19a1-9da25366e20e.png)


**長所**
BGMとSEの両方の素材が豊富。
無料なのに高クオリティ。開発者どんだけいい人なんだ、、、

**短所**
モダンなゲームには向いていない（と思う）レトロなゲームには合う。
Youtubeなどで、聞いたことのある曲が多い。

#フリー効果音素材

https://taira-komori.jpn.org/freesound.html

![スクリーンショット 2021-11-17 19.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/b94c212c-df7f-bcd7-9169-3ee4ba648bd1.png)

**長所**
ニッチな生活音が満載。
痒い所に手が届く。

**短所**
日常生活に関する効果音以外は少ない。

#効果音辞典

https://sounddictionary.info/life-1/

![スクリーンショット 2021-11-17 19.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/46a64b5d-56b0-eca4-7964-789e49e43bb8.png)

**長所**
ゲームに使える演出効果音が豊富（爆発やパンチ音）

**短所**
これじゃない感を感じる素材もある。

#終わり
4つのおすすめ効果音ダウンロードサイトをご紹介しました。
シェア、おっすお願いしまーす。

↓最新更新版

https://kaedeee.com/app-famous-sound-download-site/
AtCoder ABC217 E - Sorting Queries 解

##問題
https://atcoder.jp/contests/abc217/tasks/abc217_e

##考察
公式解説がこれでもかとばかりに書いているのでそちらを見るべし。データ構造を整理できれば自然と実装に辿り着く。


##実装
`auto Q = in<ll>()`の右辺は標準入力を取ってきて返すテンプレート関数。

```cpp
#define rp(i, n) for (int i = 0; i < n; ++i)
#define print(x) std::cout << (x) << std::endl;
int main() {
    // read input
    auto Q = in<ll>();
    // data structure
    queue<ll> back;
    priority_queue<ll, vector<ll>, greater<ll>> head;

    // push all elems of normal queue into priority queue
    // this gets query 3 done
    auto pushall = [&]() {
        while (back.size()) {
            head.push(back.front());
            back.pop();
        }
    };
    // start handling queries
    rp(i, Q) {
        int c = in<int>();
        if (c == 1)
            back.push(in<ll>());
        else if (c == 2) {
            if (head.size()) {
                print(head.top());
                head.pop();
            } else {
                print(back.front());
                back.pop();
            }
        } else {
            pushall();
        }
    }
}
```
Twitterで発信した告知に対して、お客さまの反応をいち早くキャッチアップしたい！

##企業もTwitterに注力している！SNSが企業成長の鍵！
好きなお店やブランドの情報を皆さんよくTwitterとかSNSで発信したりしますよね？
最近では、企業もSNSに力を入れており、宣伝やお得な情報を配信していますよね。
企業が宣伝で投稿した内容に対するお客さまの反応など、非常に重要で、今後のサービスやキャンペーン告知などに活かすことが出来る重要なヒントだと思います。

##そこで、、、こんなものを作ってみた！
現在SNSの情報などを毎回Twitterで検索して、「お客さまの反応」や「コメント」をキャッチアップして、今後のサービス改善に向けて、施策を検討しております。
検索するのに、非常に時間が掛かり、投稿されているか分からないけど、一定の時間たったら、検索してます、汗
その作業を改善する為、今回IFTTTを活用し、Twitterに「AEON」と投稿されたら、自動でLINEに通知が来るシステムを作ってみました！

##実際の動きを動画でご覧ください！！
<iframe width="560" height="315" src="https://www.youtube.com/embed/57B8GII_3uI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

##開発環境
<font color="black">**・IFTTT(イフト)を活用し、youtube×Twitterと連携！**</font>
<font color="RED">**ちなみに、、、IFTTT(イフト)とは？**</font>
<font color="black">**・IF(もし)**</font>
<font color="black">**・This(入力)**</font>
<font color="black">**・Then(ならば)**</font>
<font color="black">**・That(出力)**</font>
という意味だそうです！！
始めて使ってみましたが、ノーコードで非常に便利なツールでした。

##開発工程
①<font color="black">**まずは、IFTTTをインストール！！**</font>

https://ifttt.com/home

②<font color="black">**アカウント登録**</font>
・Googleアカウント連携で登録
・Facebookアカウント連携で登録

③<font color="black">**Twitterを選択！**</font>
New Tweet from searchを選択してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/b5420fe1-94b2-9050-c71b-687df811ac17.png" width=30%>

④<font color="black">**タグでお好きなものを選択する。**</font>
今回は、イオンを選択してみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/59db6dfa-b290-c6b6-9c18-e19b381d43d6.png" width=30%>

⑤<font color="black">**LINE Notifyと連携させる！**</font>
ツイート本文とる為に{{Text}}も追加！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/4c271e52-5208-33fb-e950-d9e4b0144dcc.png" width=30%>

⑥<font color="black">**continue⇒finishです。**</font>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/21a39dfe-7d26-bbd1-3c0e-e8f91bb1e492.png" width=30%>

⑦<font color="black">**完了イメージ**</font>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/69612af4-8ddc-40df-8fdb-485b06831a4b.png" width=30%>
⑧<font color="black">**完成がこちら！**</font>

https://ifttt.com/applets/Y83VYfxk/edit

##使ってみての感想(色々な方に使ってもらいました！！)
<font color="Black">**商品部の上司**</font>
商品部として、<font color="BLUE">**「お客さまの動向が気になり、いつもSNS関連を見ているので、このような仕組みがあったら便利
より言葉を絞って検索し、通知しくれるシステムがあると便利」**</font>とご意見を頂きました。

<font color="Black">**コーポレートブランディング　同僚**</font>
<font color="BLUE">**「ブランディングする上で、お客さま情報や企画、フェア関連に対するレスポンスが非常に気になるので、このようなシステムがあると効率的」「皆が使えるようにして欲しい」**</font>という声も頂きました。

<font color="Black">**東京都内　店長×2名**</font>
<font color="RED">**「イオンで通知設定すると相当な件数がLINEにくる。通知の件数を絞ってほしい。」「重要なコメントだけ絞って通知が欲しい」**</font>という声も頂きました。

##まとめ
IFTTTを活用する事で、お客さまの反応やレスポンスをいち早くキャッチアップする仕組みを制作する事で、企業としても情報を早く収集することができ、今後の戦略立案にも活かす事が出来ると感じました。
また、お客さまとしてもこのような仕組みをイオンがやっていると伝わる事で、より多くのツイートが増え、サービスや商品が変わり、日々の生活が豊かになると感じました。
更に実装レベルを高め、便利なツールに繋げていきたいと思います。

##最終目標に向けて！
https://note.com/dsvvpxgc/n/nab566ad064af

https://note.com/dsvvpxgc/n/ncf2ea0950704
AWS Lambdaからsuds-py3を使ってSOAP API連携をしてみた

RESTにとって変わられがちですが、ちょっと触る機会があったので、
表題の件を簡単かつざっくり解説していきます。

なお連携対象はOracle B2C ServiceのSOAP APIの想定です。


##環境
Python3.8
AWS Lambda プロキシ統合あり

ライブラリ
suds-py3 1.4.4.1

##準備

まずはライブラリをインストール

```
$ pip3 install suds-py3
```

##実装

内容は連携するAPIに準じて読み替えてください。
インポート関係はこんな感じです。

``` python3
import os
import json
from suds.client import Client
from suds.wsse import *
from suds.sudsobject import asdict

WSDL = os.environ['WSDL'] # 指定のWSDLのURLを記載
APP_ID = os.environ['APP_ID']
USERNAME = os.environ['USERNAME']
PASSWORD = os.environ['PASSWORD']
```

###URLからクライアントの作成
WSDLのURLでサービスのクライアントを作成します


```　python3
client = Client(WSDL)
```


###WS-Securityの設定
続いてWS-Securityを設定します。
[WS-Securityについてはこちらを参照](https://www.ibm.com/docs/ja/integration-bus/9.0.0?topic=configuration-ws-security)

``` python3
security = Security()
token = UsernameToken(USERNAME, PASSWORD)
security.tokens.append(token)
client.set_options(wsse=security)
```

###ヘッダーの作成
ヘッダーも作成していきます。

``` python3
client_info_header = client.factory.create('rnm_v1:ClientInfoHeader')
client_info_header.AppID = APP_ID
client.set_options(soapheaders=client_info_header)
```

※カスタムSOAPヘッダーで作成することもできるので試してみましたが、
たまにXMLが壊れることがあったので、きちんとfactory.createでWSDLで定義されたオブジェクトとタイプのインスタンスを作成することをオススメします。

このようにXML文字列としてヘッダーに渡そうとすると、
エスケープされるとのことなのでやめましょう。

``` Python
client = client(url)
ssn = '<ssn:SessionID>123</ssn:SessionID>'
client.set_options(soapheaders=ssn)
result = client.service.addPerson(person)
```

###サービス実行

interactionIDを生成するためにStartInteractionのサービスを実行します。

```　　python3
interaction_id = client.service.StartInteraction(app_identifier, user_ip_address)
```

せっかくなので、interactionIDを使って、
パラメータを取得してみます。

``` python3
response = client.service.SearchContent(interaction_id, search_terms, None, None, None, limit, None, None, None, start)

print(type(response))
```

結果

```
<class 'suds.sudsobject.SearchResponse'>
```

流石にこのままだと使いづらいので、

``` python3
def recursive_dict(d):
    """
    取得したレスポンスを辞書型に整形
    """
    out = {}
    for k, v in asdict(d).items():
        if hasattr(v, '__keylist__'):
            out[k] = recursive_dict(v)
        elif isinstance(v, list):
            out[k] = []
            for item in v:
                if hasattr(item, '__keylist__'):
                    out[k].append(recursive_dict(item))
                else:
                    out[k].append(item)
        else:
            out[k] = v
    return out
```

こんな感じで使いやすい形に整形して返してあげましょう。

##参考
https://github.com/cackharot/suds-py3

https://suds-py3.readthedocs.io/en/latest/
Reactで作る簡要Todoアプリの作成

<h1>Reactで作る簡要Todoアプリの作成</h1>

Reactに触ってみたいけど何から始めたらいいか分からない、そんな人 必見です。
今回のTodoアプリ作成でConnect（コンポーネント）の使い方や
useState(ユーズステイト)の使い方やprops（プロップス）について学ぶことができます。

<h2>私が作成したTodoアプリ</h2>
![写真２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055577/0b7e6f34-8f5c-13ef-3696-aece66a386ae.png)

今回、タスクを追加するための追加ボタン。
未完了リストから完了リストに移行するための完了ボタン。
不要になったタスクを削除するための削除ボタンが入ったTodoリストを作成しました。

<h2>Connectとは</h2>
Connectとはサイトに必要な要素を細かく部品分けしてサイトを作成する方法です。
これをするこ事で他のページで部品の使いまわしができます。

Connectファイルを他のファイルで使うには
ファイル上部に
import ファイル名 from "ファイルの相対パス";
と記入し、
適応したい場所に　<ファイル名 />　を入れる。

<h2>useStateとは</h2>
useStateを使う事で文字やボタンなどに追加や削除などの動きを付けたいときに使う。
各タグに関数を割り当て動きのあるサイトにできる。

<h2>propsとは</h2>
propsとはConnectで他のページにUIをインポートした後にuseStateで動きを付けた関数を
他のファイルにも使いたい場合に使用する。
注意点としては親コンポーネントから子コンポーネントにしか渡せないという事。

<h3>今回参考にした講座動画</h3>
https://www.udemy.com/course/modern_javascipt_react_beginner/?src=sac&kw=%E3%83%A2%E3%83%80%E3%83%B3Java

Udemyの講座動画で有料ですが、
Reactを始めたばかりの人にも分かりやすく解説されているのでおすすめです。
MacのインカメラをGStreamerでKinesis Video Streamに配信し、それをGStreamerで受信する方法

GStreamer難しいですね...
[gst\-launchとの長き戦い \- Qiita](https://qiita.com/yamamo-to/items/89a28959cb786e9c80fc)　の通りだなと。

メモがてらMacのインカメラをGStreamerでKinesis Video Stream(KVS)に配信し、それをGStreamerで受信するコマンドを書きます。


MacのインカメラをGStreamerでKinesis Video Streamに配信するコマンドは下記です。

```kvssink.sh
gst-launch-1.0 -v avfvideosrc \
! clockoverlay font-desc="Sans bold 60px" \
! videorate \
! video/x-raw,framerate=1/1 \
! vtenc_h264_hw allow-frame-reordering=FALSE realtime=TRUE max-keyframe-interval=2 bitrate=512  \
! h264parse \
! video/x-h264,stream-format=avc,alignment=au \
! kvssink stream-name="test-instream" storage-size=512 \
    access-key="${AWS_ACCESS_KEY_ID}" \
    secret-key="${AWS_SECRET_ACCESS_KEY}" \
    aws-region="${AWS_REGION}" \
    frame-timecodes=true \
    framerate=1
```

KVSをGStreamerで受信する方法は下記です。


```hls.sh
STREAM_NAME=test-instream
ENDPOINT_URL=$(aws kinesisvideo get-data-endpoint \
    --stream-name ${STREAM_NAME} \
    --api-name GET_HLS_STREAMING_SESSION_URL \
    | jq -r '.DataEndpoint')
HLS_URL=$(aws kinesis-video-archived-media get-hls-streaming-session-url \
    --endpoint ${ENDPOINT_URL} \
    --stream-name ${STREAM_NAME} | jq -r '.HLSStreamingSessionURL' )

echo ${HLS_URL}

gst-launch-1.0 souphttpsrc location=${HLS_URL} do-timestamp=true is-live=true  \
! hlsdemux \
! decodebin \
! clockoverlay halignment=right valignment=top font-desc="Sans bold 60px" \
! autovideosink sync=false
```

既に8秒くらい遅延してますね...
![mac-kvs-mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104256/9b46a3af-0cc5-76dc-fbb4-e2a3a142585e.png)

ネットワーク環境が悪いのか`hlsdemux`など時間かかっているのか、、難しいですね。。

AWSのblackbeltでも原因調査方法が紹介されてます。
![latency.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104256/4b28c12f-3372-f0cf-eb6c-f4a3d95eb6f6.png)


しかし難しいので、この遅延を改善する方法をstackoverflowで質問してます。
[python \- How to reduce the gstreamer pipeline latency in "AWS Kinesis Video Stream\(kvs\) \-> gstreamer\+opencv image processing \-> kvs " process? \- Stack Overflow](https://stackoverflow.com/questions/69998589/how-to-reduce-the-gstreamer-pipeline-latency-in-aws-kinesis-video-streamkvs)

回答はおそらくないので、自分で解決するしかなさそうですね ^^;
GStreamerに強くなりたい今日この頃です。
Azure Synapse Apache Spark PoolsにてDelta Lake形式のテーブルに対するSHOW CREATE TABLE実行時のエラー

## 概要
Azure Synapse Apache Spark PoolsにてDelta Lake形式のテーブルに対して、SHOW CREATE TABLEを実行すると下記のエラーが発生しますが、Sparkの仕様に基づく事象であることから2020年11月17日時点（Spark ver.3.1）では対応方法がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/118847c3-9a1b-5fea-7da3-ddd83cf5b0c6.png)

> SHOW CREATE TABLE is not supported for v2 tables.

SparkのGithubにて下記の記載がありました。Delta Lake形式のテーブルは、v2であることからSHOW CREATE TABLEは非対応法のようです。

> Note that SHOW CREATE TABLE works only with a v1 table and a permanent view, and not supported for v2 tables.

引用元：[[SPARK-33414\][SQL] Migrate SHOW CREATE TABLE command to use UnresolvedTableOrView to resolve the identifier by imback82 · Pull Request #30321 · apache/spark (github.com)](https://github.com/apache/spark/pull/30321)

Spark ver.3.2以降では、サポートされるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/099a67d6-0476-9689-461a-b9ac5e080018.png)
引用元：[[SPARK-33898\] Support SHOW CREATE TABLE in v2 - ASF JIRA (apache.org)](https://issues.apache.org/jira/browse/SPARK-33898)

Databricksでは、delta lake形式のテーブルでもSHOW CREATE TABLEを実行できることから、Databricksのエッジ機能として実装されているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7c995b1b-811c-79e3-1d5e-c622f782c797.png)
Miroが日本初上陸！Miroの使い方をセミナーで学んでみよう！

# オンラインホワイトボードツール [Miro](https://aslead.nri.co.jp/products/miro.html) が日本初上陸！
[**Miro**](https://aslead.nri.co.jp/products/miro.html)が日本に上陸し、代理店経由でMiroを導入できたり、日本語でのサポートを受けられるようになりましたね:relaxed:

# [Miro](https://aslead.nri.co.jp/products/miro.html)とは？
オンライン時代のイマに最適な、世界中で愛用されるシェアNo.1のオンラインホワイトボードです:hearts:

現場で利用しているホワイトボードと同じ感覚で、直感的に利用でき、
付箋・オブジェクト・ペン・コメントなど、
「一般的なホワイトボードの使い方」として想像する機能はすべて利用できます:heart_eyes:

打ち合わせやアイデア出しから研修やチーム開発まで。幅広いシチュエーションで利用可能！
オンラインでつながるチームのコミュニケーション・コラボレーションの「基点」になります:slight_smile:

100人での同時編集もでき、部署・プロジェクトでの利用に便利！お客様との共有・協働作業にも役立ちます:heart_eyes:

情報の共有やタスク管理など、ホワイトボードを中心としたニューノーマルな働き方を促進！
それが [**Miro**](https://aslead.nri.co.jp/products/miro.html) です:slight_smile:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855853/8dea1e0f-4f7e-7b5c-e1c1-1ed2228a406e.png)

# Miroの使い方を見てみよう
ここでは、[**Miro活用セミナー**](https://nri-miro.connpass.com/)のアーカイブ動画を紹介いたします:grinning:

**ミーティングを便利にする機能・テンプレートをご紹介**
<iframe width="560" height="315" src="https://www.youtube.com/embed/rvxSJkQWVzo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

**アイディエーション、ブレインストーミングの便利TIPS**
<iframe width="560" height="315" src="https://www.youtube.com/embed/V6pol6DT_40" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

**Miroのこれから来る最新の機能をご紹介！**
<iframe width="560" height="315" src="https://www.youtube.com/embed/aFydbS1nJ-o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

**～公開Miro商談～安心してお客様と使うための3つのポイント**
<iframe width="560" height="315" src="https://www.youtube.com/embed/FiHHNk-j86o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

**Miro初心者集まれー！公開ハンズオンで基本機能を使い倒してみよう！**
<iframe width="560" height="315" src="https://www.youtube.com/embed/Rd5Mn74lvpo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

いかがでしょうか？
上記のようにMiroには様々な使い方と可能性があります。
今回紹介した動画以外も見たいという方は[過去のアーカイブ一覧](https://aslead.nri.co.jp/products/miro/video)をご覧ください:grinning:


# セミナーに参加してみたい方へ！
[**Miro活用セミナー**](https://nri-miro.connpass.com/)は毎週金曜日に12:00~から実施しており、
お昼ご飯を食べながらラジオ感覚で参加することが可能です！

無料で何度でも参加できるため、
[**Miro**](https://aslead.nri.co.jp/products/miro.html)の様々な利用方法を学ぶことができます。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855853/a5779189-e81b-9978-cc50-d275c8e72251.png)](https://nri-miro.connpass.com/)

この機会にぜひ、[**Miro活用セミナー**](https://nri-miro.connpass.com/)にご参加ください:slight_smile:
参加は[**こちら**](https://nri-miro.connpass.com/)から！
RESTって何？

#RESTを学ぶ意味
チームでWebを開発するときにひとり一人が勝手なルールでやっては調和がとれません。全体が統一したアーキテクチャで開発を進めることが必要です。そこで守るべきものが**REST**です。
またRESTの規約に則っているRESTらしいことをRESTfulと表現します。


# RESTとはそもそも何？
RESTはWebのアーキテクチャスタイル、特にクライアント/サーバ[^1]から派生したスタイルです。
REpresentational State Transferの略で、4つの原則を満たすものです。


## RESTの原則
###1. アドレス可能性
情報源を簡単に示せる性質の事です。言い換えると全ての情報が、一意なURI(Uniform Resource Identifier)で表現されていることです。情報源にきちんと名前がついていて適切な手段でアクセスできる状態にするということです。
###2. ステートレス性
HTTPにはサーバ側はクライアントの情報を保管しないという特性があります。なのでやり取りごとが独立していてそれぞれにすべての情報を載せる必要があります。
###3. 接続性
ある情報源にほかの情報源を含めることができます。それによってWebが使いやすくなっています。
###4. 統一インターフェイス
情報源に対する操作を限られた統一的な方法でやり取りすることです。HTTP1.1(現行のHTTP2の基となっている。HTTP2はバイナリなので解読不可)では8個のメソッドのみで構成されています。その中でも基本的なものが情報の作成、取得、更新、削除の4操作(CRUD操作)です。

| 処理 | HTTPメソッド | CRUD操作 |
| ---- | ------------ | -------- |
| 登録 | POST         | CREAT    |
| 取得 | GET          | READ     |
| 更新 | PUT          | UPDATE   |
| 削除 | DELETE       | DELETE   |

これを導入することでシステム全体が階層化しやすいというメリットがあります。Webサービスではサーバとクライアントの間にプロキシを置いてアクセスを制限したりします。一見クライアント側がその変更を把握してなくてはならないように見えますが、クライアントは統一されたインターフェイスで接続するので接続先がサーバからプロキシに変わったなど意識する必要がありません。
##参考文献
この記事は以下の文献を参考に書きました。
山本陽平、「Webを支える技術　HTTP、URI、HTML、そしてREST」 (2016)、株式会社技術評論社


[^1]: WebはHTTPでクライアントとサーバが通信するスタイルです。ユーザ側と処理を分離することができます。これによりパソコンのみならずスマホやタブレットなど様々なクライアントからもWebがアクセスできるようになります。
AgileJapan2021に参加してきました！


AgileJapan2021に参加させていただきました。
初参加ということで、話についていくのが精一杯な部分もありました。
本記事では講演ごとの感想は割愛し、(熱が冷めぬうちに)全体を通しての感想をシェアできればと思います。

# AgileJapan2021について
公式サイトは[こちら](https://2021.agilejapan.jp/)
・開催日：2021/11/16と17の2日間
・テーマ：The Heart of Agile(アジャイルの心)
・2日間の総講演数は15以上
・1日目時点での参加者数は620名(事前登録＋登壇者)

# 参加してみて
### ■ワイワイしていて楽しかった！
初の社外セミナーへの参加ということでやや緊張気味でしたが、開始早々すぐにその不安はなくなりました！メインはZOOMでの講演だったのですが、運営の方が別途立てて下さっていたDiscordが、交流の場としてとても素晴らしかったです…！他の参加者さんが講演中にリアルタイムで書き込みをしていたり、講演後に登壇者さんのアフタートークを伺えたり…と、よりリアルタイム感や他の参加者さんとのつながりを感じることが出来ました。(在宅で一人で受けていることを忘れてしまうくらい…)

### ■2日間とは思えないほど密度が濃かった！
総講演数が15以上あり、様々な立場や様々な経験をされてきた方々のお話を伺うことが出来ました。一言で”アジャイル”といっても、立場や環境等々によってかなりバラエティがあることを知ることができ、多角的に”アジャイル”を吸収することが出来ました。また各講演が約20分というかなり短い時間でテンポよく聞けたのも、とても良かったです。

### ■皆さんのお話がどれも面白かった！
どの講演を聞いていても、登壇者の皆さんのお話の上手さに感服してしまいました。皆さんお話しすることがお好きなんだろうなと思うと同時に、話の構成やスライドのインパクト、話題の広げ方等々、本編以外にも勉強になることが非常に多くありました。また、皆さん人生経験が豊富かつ濃ゆいということで、ちょっとした雑談も非常に聴きごたえがありました。

### ■自分の無力さを痛感した…
私がまだまだぺーぺーだということを加味したとしても、あまりにも登壇者・参加者の皆さんのレベルが今の自分とかけ離れていて、自分の無力感に苛まれてしまいました…。特に皆さんは自分から果敢に色々と挑戦しているのに、自分はなんて受け身なんだろう…と反省しました。”スモールステップ”で小さい成長を続けることが大事とお話があったので、くよくよしすぎず、小さい成長をたくさん積み重ねていきたいと思いました。

### ■来年も是非参加したい！
いろいろと書かせて頂きましたが、2日間とは思えないほど多くのことを学ぶことが出来ました。リモートが多くなかなか周りが見えない中で、とてもいい刺激を得ることが出来たと思います。もっと”アジャイル”について真剣に向き合い、もっと自分のものとして確立した考えを持てるようにしたいと思います。来年、今年よりももっと深く知識の吸収が出来るように、精進してきたいと思います。
【環境構築】VSCodeでのCUDAを自動補完ありで書く方法！(Pathの設定）


 初投稿になります！　よろしくお願いいたします！何かあればコメントしていただけると嬉しいです．

##経緯
大学の研究でCUDAを使ったGPUプログラミングを勉強し始めたのですが，Nsight Visual Studio Code Editionの設定方法の日本語の解説がなかったので記録として残したいとおもいます．
####※注意
 今回の記事はVSCode上での設定のみ紹介します．VSCodeのインストールやCUDA toolkitのインストールは他のサイトを参考にしてください。



#VSCodeでの環境構築方法
###拡張機能のインストール
 VSCodeとCUDA toolkitのインストールができたらVSCodeを起動します．
　`Ctrl`+`Shift`+`X`またはウィンドウ左のサイドバーより拡張機能から__C/C++__と**Nsight Visual Studio Code Editon**をインストールします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1836240/c97b1c72-1d75-95cd-a2ea-ef38fc8fcc76.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1836240/d6cc84ca-554f-c156-a00e-ae86b8684226.png)

###ワークスペースの追加

 　VSCodeの上のバーより[ファイル]-[ワークスペースにフォルダーを追加]からCUDAのプログラムを用のディレクトリを指定します．



##Pathの設定
　拡張機能をインストールしただけでは自動補完がされない可能性があるのでVSCodeを編集していきます．
###c_cpp_properties.jsonの編集
　`Ctrl`+`Shift`+`P`を押し，以下のコードを実行すると，**c_cpp_properties.json**が.vscodeのディレクトリが作成されます．


```
C/C++:Edit Configurations
```
　このファイルの`compilerPath`にCUDAのコンパイルコマンドの**nvcc**を通します．jsonではなく**UI**での編集からでも可能です．CUDAをインストールしたディレクトリから選択します．

#####windowsの場合
　ローカル環境の場合はこちらです．

```json:c_cpp_properties.json
"compilerPath": "C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.5\\bin\\nvcc.exe"
```
#####Linuxの場合
　私の場合はSSH接続でLinuxサーバーに接続しているので以下のように設定してあります．

```json:c_cpp_properties.json
"compilerPath": "/usr/local/cuda/bin/nvcc"
```

　`include`したいヘッダーファイルが自動補完されない場合は**c_cpp_properties.json**の`includePath`の編集をしましょう．
 　以下は私が設定しているLinuxでの**c_cpp_properties.json**です．参考程度に．

```json:c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include",
                "/usr/local/cuda/include"
            ],
            "defines": [],
            "compilerPath": "/usr/local/cuda/bin/nvcc",
            "cStandard": "c89",
            "cppStandard": "gnu++98",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}
```



これで環境設定のおわりです！
##最後に
 Nsight Visual Studio Code Editionは2021年4月にリリースされたばかりです．Nsight Visual Studio Editionもありますが，SSH接続してリモートで行う場合はVSCodeのほうが扱いやすいと思います．以下のように自動補完されていれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1836240/a5f09522-f614-8a1b-b305-73b09fe787c7.png)

##参考文献
この記事は以下の情報を参考にしました。
-[Visual Studio CodeでC/C++プログラミング](https://qiita.com/whim0321/items/ce7c1d8d203a21778a83)
-[Configure VS Code for Microsoft C++](https://code.visualstudio.com/docs/cpp/config-msvc)
-[NVIDIA NSIGHT VISUAL STUDIO CODE EDITION](https://developer.nvidia.com/nsight-visual-studio-code-edition)
【javascript】prototype

# prototypeとは
* オブジェクトに存在する特別なプロパティ
* コンストラクタ関数と合わせて利用する。
* インスタンス化した際に,内部的に`__proto__`へコピーされprototypeへの参照エイリアスになり、メモリの効率化ができる。

# 使い方

```js

function Person(name, age){
    this.name = name;
    this.age = age;
}

//コンストラクタ関数にprototype.追加したいメソッド名 = 無名関数
//とすることでインスタンス化した時にメソッドとして利用することができる。
Person.prototype.hello = function(){
    console.log('hello' + this.name)
}

const bob = new Person('Bob', 18);
const tom = new Person('Tom', 21);

bob.hello(); >> hello Bob
tom.hello(); >> hello Tom

```

# メモリの最適化

コンストラクタ関数の中にhelloメソッドを作成することもできるが、呼び出す度に新たメソッドを作ることになるため、メモリの消費効率が悪い。

```js
function Person(name, age){
    this.name = name;
    this.age = age;
    this.hello = function(){ //helloメソッドを定義できるが毎回このメソッドをメモリ上に追加しなければならい。
      console.log('hello' + this.name)
 }
}

const bob = new Person('Bob', 18);
const tom = new Person('Tom', 21);

bob.hello();
tom.hello();

```
内部的にprototypeプロパティにprototypeで作成したメソッドの参照先（エイリアス）を作ることで、参照するだけで呼び出せるのでメモリ効率が良い。

![スクリーンショット 2021-11-17 18.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378066/ad184e58-c5ad-b5bc-e116-6c90908cbe73.png)
【挑戦者求ム】ダイエットを自動化してみた

##太りますよね　。。。　冬

　運動量も落ちるし、「服で体型を隠せるボーナス」も相まって。。。

　落ちるのは運動量だけ　ストレス&甘い物の誘惑　が減ることはありません。

　![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313739333434332f61656536313233342d346435662d666231392d306161642d3239356564356264383266632e706e6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/4d715d1f-5068-3a1e-3689-f09013614dfe.png)


　実は毎日していることがあります。体重を計って、スマホのメモに残しています。
　時系列で把握でき、『甘い物食べたい!』の誘惑の時は、サッと見返せます。

　<font color="Red">**「食べたくなった時に体重見返す？」　お菓子並みに甘い考え**</font>です。見る訳ない。

　そこで・・・

:::note warn
　①毎日の体重のメモを自動化
　②スイートスポット(よくお菓子買う場所)に近づいたら警告
:::

　を作ってみることにしました。

## これでもお菓子が買えるか

　IFTTTを使い、できたものはこちら。
![体重.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/86558600-e7da-33da-ca1b-bcead0363a7a.png)


　3つのアプレットを組み合わせることで実装。

![実装.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/657f61e7-a3ba-d1f5-bb1a-a5a1eb8f94e3.png)

　スイートスポット(セ〇ン)の吸引力はすさまじいですが、毎回阻止してくれます。

　自分の今の体重より見たくないものって、中々思いつきません。

　<font color="Red">**どうですか、自分の体重を見た後で、お菓子買えますか？**</font>

![阻止.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/8f5bc866-eed7-6d44-9989-a7d5a12256dd.png)

## 職場の女性パートさんに使ってもらってみた

:::note
自分の体重を何度も見せられると気分悪い　体重は見たい時だけ見るものです
:::

　「気分悪い」ということは、大成功だと捉えました。
　体重記録だけでなく、ダイエットまでの流れも(多分)自動化できたと思っています。

　一方で、

　<font color="Red">**手書きで買い物リストを作るが、スーパーに行くと「あれ？何買うんだっけ？」
　がよくあるのでそれに使いたい。**</font>

　<font color="Red">**職場など登録された地点を出たら「もうすぐ帰るね」などのLINEを送るのはどうか**</font>

　という至極まっとうなご意見も頂きました。その通りです。でも痩せたいんです。

　ふざけたことばかり書きましたが、真剣に考えている「自動化」があります。
　家族のフォトアルバム　を　半自動で作れないか　と考えていて
　年明けにはクラウドファンディングにも挑戦する予定です。

　もしよかったらこちらの記事も読んで下さい!お付き合いありがとうございました♬

https://note.com/m_okinaka/n/na0843563c268
cypress 設定時のProxyエラーについて

## エラー内容
```
Does your workplace require a proxy to be used to access the Internet? If so, you must configure the HTTP_PROXY environment variable before downloading Cypress. Read more: https://on.cypress.io/proxy-configuration
```

うーむよくわからん

翻訳かけると

```
あなたの職場では、インターネットにアクセスするためにプロキシを使用する必要がありますか？その場合は、サイプレスをダウンロードする前にHTTP_PROXY環境変数を構成する必要があります。続きを読む：https：//on.cypress.io/proxy-configuration

```

## だめだったパターン
https://docs.cypress.io/guides/references/proxy-configuration#Set-a-proxy-on-Linux-or-macOS

ここを見て
![スクリーンショット 2021-11-17 18.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118047/d03a315f-f547-5616-86b7-c066503a0f44.png)

こう記載されていたのでそのまま対応

すると

![スクリーンショット 2021-11-17 18.08.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118047/203fab3b-5f4a-c04d-66e6-d8d4da808ea5.png)

一生動かん

そういう時は再度
`export HTTP_PROXY=""`

で解消してとりあえず元に戻す


### 結論

1.
こちらの記事で載っていることを対応（事前に以下のやつが出るのでローカルにダウンロードしておく）
↓
![スクリーンショット 2021-11-17 18.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118047/7d7283ce-b3be-2363-f66a-dae5ed730da7.png)
※URL(https://download.cypress.io/desktop/9.0.0?platform=darwin&arch=x64)

2.
https://stackoverflow.com/questions/63839627/while-installing-cypress-through-command-npm-install-cypress-save-dev-getting

`CYPRESS_INSTALL_BINARY=~/Downloads/cypress.zip npm install cypress --save-dev
`

で対応

で起動のコマンドを以下にしていたので、それを実行すると無事起動した

```
  "scripts": {
    "start": "PORT=5555 react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "cy:open": "cypress open" //これのこと
  },

```
副反応疑い報告状況についてのPDFをCSVに変換

予防接種法に基づく医療機関からの副反応疑い報告状況について（コミナティ筋注・報告症例一覧） （PDF：5,092KB）
https://www.mhlw.go.jp/content/10601000/000853766.pdf

pdfplumberでテーブルを抽出しようとすると表の最後に線がないため最終行が取得できない
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/9b582596-47a2-3c57-38e4-dab27bd7a559.png)

縦線の下の位置を取得して最終の横線を追加
![index1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/63da1dc3-9509-c42f-0b7c-7f66c7947614.png)

縦線を追加
![index2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/251d7d9b-3a36-991e-3984-e61d48ce671c.png)

テーブル確認
![index4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/7645752b-536f-65f9-1e00-3d718d4b5a5a.png)


# PDFダウンロード
```
!wget https://www.mhlw.go.jp/content/10601000/000853766.pdf -O data.pdf
```
# プログラム

```python
import pdfplumber
import pandas as pd

from tqdm.notebook import tqdm

with pdfplumber.open("data.pdf") as pdf:

    dfs = []

    for page in tqdm(pdf.pages[1:]):

        # 縦線
        vertical = [
            edge["x0"]
            for edge in page.debug_tablefinder().edges
            if edge["orientation"] == "v"
        ]

        # 縦線の一番下の位置
        bottom = max(
            [
                edge["bottom"]
                for edge in page.debug_tablefinder().edges
                if edge["orientation"] == "v"
            ]
        )

        # 横線
        horizontal = [
            edge["top"]
            for edge in page.debug_tablefinder().edges
            if edge["orientation"] == "h"
        ]

        # 横線に縦線の一番下の位置を追加
        horizontal.append(bottom)

        table_settings = {
            "vertical_strategy": "explicit",
            "explicit_vertical_lines": vertical,
            "horizontal_strategy": "explicit",
            "explicit_horizontal_lines": horizontal,
            "snap_tolerance": 3,
            "intersection_tolerance": 3,
        }

        table = page.extract_table(table_settings)

        df_tmp = pd.DataFrame(table)

        dfs.append(df_tmp)

df = pd.concat(dfs)

df.shape

df.to_csv("result.csv", encoding="utf_8_sig")
```
はじめてのReactNative

# ReactNativeとは
React(JavaScript)１つで、WEBアプリ、スマホアプリ（iOS/Android用）を開発できる優れもの。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/bb1095c4-43e9-a62a-c164-ab495755861a.png)



# Expoとは
Expoを使うと、開発段階から公開までストレスフリーになってとても便利。

## Expoのメリット

### 開発がラク
実機で確認する場合、スマホにExpoのアプリをインストールしておくと、
今開発中のアプリがリアルタイムで反映されて確認できる。
さらに、複数の人とリリース前のアプリ共有が可能（iPhoneではアカウントの制約あり）。

### 公開がラク
各ストアにアップするための、ファイルの作成をコマンドひとつでできる。
Appleの場合は、通常のだとアプリのアップデートも審査が必要だが、
Expoを使うと審査なくアプリのアップデートをコマンドひとつで行える。


## Expoのデメリット
Expoを使うと使えない機能がある。
アプリ内課金や、バックグラウンド実行、Bluetooth, NFCなどなど。

公式ページ：https://docs.expo.dev/introduction/why-not-expo/?redirected

公式ページの左側に項目があっても、実際には使えないなんてことも・・・
各項目の内容をちゃんと読めば使えるのか使えないのか書いてあるそうです。
https://docs.expo.dev/versions/latest/#each-expo-sdk-version-depends-on-a


# ReactNativeとExpoでスマホアプリ開発


## 開発環境を整える
https://qiita.com/Franly/items/61d8ce46f4cf9e7c656e


# アプリ開発
## プロジェクトの立ちあげかた
https://qiita.com/Franly/items/dfafbb6f0219df1beb52


## Expoでアプリを共有する方法
https://qiita.com/Franly/items/db5c6eaa828736fcf6c2

## アプリ開発を補助してくれるESLint
ソースコードの書き方に統一感を持たせてくれる。
例えば、ライブラリのインポートにダブルコーテーションを使っていると、「シングルコーテーションで統一してください」みたいな注意をしてくれる。

https://qiita.com/Franly/items/5c1624fdb62aee697da7

## ESLintが入っている空のプロジェクト
https://gitlab.com/r1302/template

# 簡単なアプリを作ってみる

https://qiita.com/Franly/items/81b2dddb2114cbae2802

ReactのHooksや関数型プログラミング、レンダリングに付いて記述したもの↓

https://qiita.com/Franly/items/465f4271609a681b809d

# ストアへの公開方法

https://qiita.com/Franly/items/59a767c039b720a015eb


# おすすめUIコンポーネント
Vuetify的な見た目

https://callstack.github.io/react-native-paper/bottom-navigation.html

QRコードを読み込めば自分の端末ですぐ確認できる。

https://docs.nativebase.io/input


# スマホアプリ開発の注意点
## CSSはiosとandroidで効くものと効かないものがある
shadowはiosだけにしか効かない
elevationはandroidだけ
他にもデフォルトの設定が両者で違っていたりする。
Colaboratory にて VSCode を activate する

Colaboratory による対話的コーディングも便利だが、スクリプト形式での実装も行いたいときがある。やり方の一つとして My Drive にマウントして VSCode を activate する。

まず、必要なインストールを行う。

```
!pip install colabcode
```

その後、ランタイムをリセットし、以下を実行する。実際には `password` は適当な文字列を指定する。

```
from colabcode import ColabCode
ColabCode(port=10000, password="password", mount_drive=True)
```

My Drive へのマウント認証を行ってから、`NgrokTunnel`に表示されている url へアクセスすると VSCode をブラウザ上で立ち上げることができる。
input type number でeを入力させたくない

サーバ側のバリデーションで1eなどのべき乗の数値がはいってくると期待するチェックができないことがある。
なので、そもそも入力できないようにする。

        $("input").keydown(function(e) {
            if ((e.which && e.which === 69) || (e.keyCode && e.keyCode === 69)) {
                return false;
            } else {
                return true;
            }
        });
【ReactとTypeScript】leader-line-newを使って要素間を線でつなぐ

# はじめに
leader-line-newを使って要素間を線でつなぐとのメモ
線を引くライブラリをいくつか存在したが、
その中でも使いやすそうで見た目も良かったライブラリをReactで使って見たときのメモ

## ライブラリの説明
leader-lineとleader-line-newで似たライブラリがあった
TypeScriptで使うときはleader-line-newを使うらしい
※ 詳しい説明は下記参照
https://www.npmjs.com/package/leader-line-new
https://anseki.github.io/leader-line/

いろんな種類の線が引ける。
色変えたり、グラデーション付けたり、動いているようにアニメーション付けたり、ホバー時に線を引いたり、矢印の形を変えたり
![スクリーンショット 2021-11-17 17.23.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/1864450e-5d0a-209a-e8f4-a826a6381f34.png)
![スクリーンショット 2021-11-17 17.24.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/e4764df1-9925-d51c-aef2-afded9d0c475.png)
![スクリーンショット 2021-11-17 17.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/5c551063-6996-e24f-1eac-e154e193754c.png)

## 線を引く

```
import React, { useEffect, useRef } from "react";
import LeaderLine from "leader-line-new";

・・・・
  const div1Ref = useRef<HTMLDivElement>(null);
  const div2Ref = useRef<HTMLDivElement>(null);

  useEffect(() => {
        new LeaderLine(
            div2Ref.current,
            div2Ref.current
        )
  }, [div1Ref, div2Ref]);

 return (
    <div ref={div1Ref}>
       div1
    </div>
    <div ref={div2Ref}>
       div2
    </div>
  );
};
・・・・

```

## オプションめも
コメントのところは、検証した時の形跡

```
      new LeaderLine(
        LeaderLine.mouseHoverAnchor(div1Ref.current), // mouseHoverAnchor hoverで表示
        LeaderLine.pointAnchor(div2Ref.current, {
          x: 50,
          y: 30
        }), // pointAnchor 位置の変更
        {
          // color: "red",
          size: 6,
          dropShadow: true, // 影
          // outline: true,
          // endPlugOutline: true,
          // endPlugSize: 1,
          dash: {
            animation: {
              duration: 1000, // アニメーションの速さ（減らすごとに早くなる）
              timing: "ease-in-out" // アニメーションの動き方
            }
          },
          startPlugColor: "#1a6be0", // グラデーション時のスタートの色
          endPlugColor: "#1efdaa", // グラデーション時のエンド色
          gradient: true, // グラデーション
          path: "grid", // 曲線、角線など straight, arc, fluid, magnet, grid
          // startPlug: "square", // スタートの矢印などの表示
          endPlug: "arrow3" // エンドの矢印などの表示
          // startLabel: LeaderLine.captionLabel("START"), // スタートラベル
          // middleLabel: LeaderLine.captionLabel("MIDDLE"), // 中間ラベル
          // endLabel: LeaderLine.pathLabel("This is additional label") // エンドラベル
        }
      );
```

## 最後に
まだ編集中です。
ReactNative + Expoでスマホアプリ開発〜アプリ共有方法〜

# 作成したアプリを他の人と共有
Expoを使うと他の人とアプリの共有が簡単にできる。

作成したアプリのプロジェクト内で、

```
expo publish
```
とすると、
最後の行に「Project page」と書かれているところに、URLがある。
そこにアクセスすると、QRコードが表示される。
共有したいスマホにExpoがインストールされていれば、
QRコードを読み取るだけでアプリを確認できる。

ただし、
iPhoneの場合は、publishしたアカウントとスマホのExpoにログインしているアカウントが同じでないと表示されない。
Androidは問題なく読み込めるそうです。
Raspberry PiOSがbullseyeに更新された影響

10/30にRaspberry PiOSがアップデートされ、これまでDebianがbusterだったのがbullseyeに変更されていた。

知らずにダウンロードし、機械学習の環境構築などをしていたら色々インストールできず困ったので備忘録として以下に記す。

# 旧Raspberry PiOSのダウンロード
まずは旧Raspberry PiOSのダウンロード方法について以下に記しておく。
基本的にRaspberry PiOSの[公式HP](https://www.raspberrypi.com/software/operating-systems/)には最新バージョンのimgファイルしか公開されていないが、
HTTPなどで常に全バージョンにアクセスすることができる。

以下からダウンロードすることができる。
ちなみにbusterの最終更新は2021年の5月のイメージファイルである。
https://downloads.raspberrypi.org/raspios_armhf/images/


# インストールできなかったもの
今回インストールできなかったものは以下であるが、他にもインストールできないものはあると思われるのでbullseyeを利用する方は注意が必要である。

* libqtwebkit4
* libqt4-test
* busterを前提としたwhlファイルを利用したインストール

libqt関連はOpenCVで必要なモジュールのようで、以下のエラーが出た。

~~~
E:Unable to locate package libqtwebkit4
~~~

whlファイルはtensorflowをインストールする上で利用したが、buster前提のwhlファイルだったためインストールが上手くいかなかった。

# 改善策
ひとまずは冒頭で紹介した旧バージョンのRaspberry PiOS busterをダウンロードし解決することができる。


### 参考
今回は以下の教材を利用する上で遭遇したエラーである。
https://ai.afrel.co.jp/tensor-spike/
ReactNative + Expoのプロジェクトの立ち上げ方

# プロジェクトを作成する
プロジェクトを作成するフォルダまで移動

```
expo init
```
### アプリ名を聞かれる
![スクリーンショット 2021-11-17 17.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/1cc13715-d8d2-2a71-2b04-f2dea50e605c.png)
アプリの名前を入力する。

### テンプレートを選択する
![スクリーンショット 2021-11-17 17.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/bff89720-232e-508f-a501-6af4dc709199.png)
TypeScriptを選べたりするが、とりあえず一番上のを選択する。

![スクリーンショット 2021-11-17 17.10.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/cc73fd71-529e-0802-f563-92ea1a3f2688.png)
プロジェクトフォルダが作成される。

フォルダ構成はこんな感じ↓。
![スクリーンショット 2021-11-17 17.10.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/6bab0831-6370-5a1f-8f60-9e041c49e94a.png)


# Expoで開発を始める
作成したプロジェクトフォルダに移動して、

```
expo start
```
を実行すると、
#### ターミナルの画面
![スクリーンショット 2021-11-17 17.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/b8343e90-00b8-764d-4722-e4ad2bee22c7.png)

#### ブラウザが立ち上がる
![スクリーンショット 2021-11-17 17.16.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/759e28e3-4918-9bcc-8c73-1265b6af34e9.png)

## 実機で確認する
iPhoneの「Expo Go」アプリを立ち上げて、Expoのログインをしておく。
スマホカメラで、ターミナルかブラウザのQRコードを読み取ると、
Expo Goが立ち上がり、こんな画面が立ち上がる。

![S__42426691.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284107/e4dac788-0ddc-dca4-a4c3-18b72ade0e87.jpeg)

VScodeでプロジェクトのApp,jsを編集して保存すると、
リアルタイムに実機の画面に反映される！

## シミュレータで確認する
python 関数をオブジェクトとしてとらえる。ーメモ

```
def greeting():
  print('hello')
  print('nice to meet you')

greeting()
```
こちらは、ふつうの関数😉

pythonでは、関数をオブジェクトとして扱える。
:relaxed:

```
def double(func):
  func()
  func()

double(greeting)
```
同じ関数を二度呼び出しました。:fist:


```
実行結果

hello
nice to meet you
hello
nice to meet you
```