OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】AWSデプロイ中にCould not find aws-eventstream-1.1.0 in any of the sources Run `bundle install` to install missing gems.

#EC2内でDBを作成しようとしたところエラーが出て詰まったので忘備録として書きます#
EC2内でデータベースを作成しようと下記のコマンドを実行したところ
```ターミナル(EC2内で実行)
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Could not find aws-eventstream-1.1.0 in any of the sources
Run `bundle install` to install missing gems.
```
とエラー
どうやらどのソースでもaws-eventstream-1.1.0が見つかりませんでした`bundle install`を実行して、不足しているgemをインストールします。と言われているよう...
まずGemfileをのぞくが
```Gemfile
gem "aws-sdk-s3", require: false
```

一番下に記述はしっかりあることを確認。

Gemfile.lockをのぞきにいくが
63行目に以下の記述は入っている
```Gemfile.lock
aws-eventstream (1.1.0)
```

bundleinstallのし忘れかと思い履歴を見るがしっかりEC2内にて参考資料通り実行済み、
作業を一度ふり返るが特にミスした形跡も見当たらずもちろんググってみるがあまり参考になる記事も見つけられず。
どうやら開発環境ではaws-eventstream (1.1.0)は存在するが本番環境では適用されてないのだとあたりをつけて

念のためもう一度bundle install
```ターミナル(EC2内)
[ec2-user@ip-10-0-0-25 <リポジトリ名>]$ bundle install
Using actionmailer 6.0.3.3
Using actiontext 6.0.3.3
Using public_suffix 4.0.6
Using addressable 2.7.0
Using ast 2.4.1
Fetching aws-eventstream 1.1.0
Installing aws-eventstream 1.1.0
Fetching aws-partitions 1.399.0
Installing aws-partitions 1.399.0
Fetching aws-sigv4 1.2.2
Installing aws-sigv4 1.2.2
Fetching jmespath 1.4.0
Installing jmespath 1.4.0
Fetching aws-sdk-core 3.109.3
Installing aws-sdk-core 3.109.3
Fetching aws-sdk-kms 1.39.0
Installing aws-sdk-kms 1.39.0
Fetching aws-sdk-s3 1.85.0
Installing aws-sdk-s3 1.85.0
```
と、どうやらinstall されていなかったようです。
再度
```ターミナル（EC2内)
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'
```
と成功！！
今回原因はbundleinstallし忘れだったようだが、他のgemはしっかり反映されてたのでそれが原因突き止められなかったがしっかり一つ一つ検証していき可能性を消していく作業が大事だと感じた。
同じような症状で悩まれるかたに是非参考になればと思い書かせていただきました。最後まで読んでいただきありがとうございました。
Lambda(Python)からChatworkに通知を送る

##はじめに

特に真新しい内容ではないですが、備忘録として記載しておきます。

この記事の続編です。

>・AWS MediaLiveチャンネルの停止忘れを防ぐための自動通知設定
https://qiita.com/ktsuchi/items/fe74125df4ee79c97d5d

以前作成したLambdaの通知先としてChatworkを追加しました。
SNSは使わずにLambdaから直接メッセージをチャットワークに飛ばします。

##構成図
![ScreenShot 2020-11-26 21.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/541a295f-77e0-7343-d5f7-7cabc2684b04.png)

##手順

Chatworkに通知する手軽な方法を探していたところ、
requestsモジュールのPOSTメソッドを利用する方法に行き着いたので、その方法を採用することにしました。

Lambdaの設定箇所のみ記載します。

###requestsモジュールのインストール

まずは下記のドキュメントに従って、requestsモジュールをインストールします。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-package.html#python-package-dependencies

###Chatwork API

Chatworkにメッセージを送るには下記2つの情報が必要になります。
取得方法のリンク先を貼っておきます。

・ルームID
https://help.chatwork.com/hc/ja/articles/360000142942

・APIトークン
https://help.chatwork.com/hc/ja/articles/115000172402

###Lambdaコード

今回追記した内容は、後半部分になります。

```python:lambda_function.py
import boto3
import requests

medialive = boto3.client('medialive')
sns = boto3.client('sns')

def lambda_handler(event, context):
    channels = medialive.list_channels()
    channel_list = []

    for Channels in channels['Channels'] :
        if Channels['State'] == 'RUNNING':
            name = Channels['Name']
            id = Channels['Id']
            state = Channels['State']
            channel_list.append("| " + name + " | " + id + " | " + state + " |")

    print('\n'.join(channel_list))

    if channel_list == []:
        pass

    else:

        #to_SNS
        request = {
            'TopicArn': "<SNSトピックのARN>",
            'Message': ('\n'.join(channel_list)),
            'Subject': "Running MediaLive Channels"
            }
        sns.publish(**request)

        #to_Chatwork
        apiurl = 'https://api.chatwork.com/v2'
        roomid   = 'xxxxxxxx'
        message  =  ('\n'.join(channel_list))
        apikey   = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

        post_message_url = '{}/rooms/{}/messages'.format(apiurl, roomid)

        headers = { 'X-ChatWorkToken': apikey }
        params = { 'body': message }
        r = requests.post(post_message_url,headers=headers,params=params)
        print(r)
```

##実行結果
![ScreenShot 2020-11-27 10.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277934/9dc39fda-2f30-1b5c-8ee1-25532734cb12.png)


##参考
https://tonari-it.com/python-chatwork/
https://hacknote.jp/archives/48083/
pythonの if __name__ == '__main__':は何のためにあるのか。

#pythonの if __name__ == ‘__main__’:は何のためにあるのか。

一言で言うと、if __name__ == ‘__main__’:はこのpythonファイルが「pythonファイル名.py」と言うふう実行されているかどうか」を判定するif文。


#以下の hello.py という if __name__ == '__main__'のないPythonファイル を先に見ていきましょう。

```python
def main():
    print("Hello")

main()
```

この hello.py のように if __name__ == "__main__" 無しでも、 python hello.py とすることで「Hello」と表示するPythonファイルは作れます。

```bash
$ python hello.py
Hello
```

ですがこの hello.py の場合、外部から import hello と hello.py をインポートした際にも 「Hello」と表示されてしまいます

```python
import hello #この時点で「Hello」が表示されてしまう
Hello
```

pythonでは、インポートされたファイルの中身は実行される。ですので単にインポートしただけなのに、main() => print(“hello”)と処理が実行されてしまう。


インポートされた際に、プログラムが動かないようにするために、以下のようにif __name__ == “__main__”:というif文を書く。

```python
def main():
    print("Hello")

if __name__ == "__main__":
    main()
```

このif文の内部は import された際には実行されません。

```
import hello
```

#インポートで実行されない理由

pythonには、__name__ という特殊な変数がある。
この変数には、このpythonファイルのモジュール名が文字列で入っている。
import hello とされた場合、hello.py内部での　__name__ は、”hello”になる。（pythonにより自動的にこの変数は入れられる）
python hello.py のようにプログラムを実行した場合、 hello.py の内部の __name__ 変数は "__main__" という文字列になります。 この "__main__" という文字列はPythonファイルをスクリプトとして直接実行した場合に自動で設定されます。

* import hello した：hello.py 内部で __name__ は "hello" という文字列になる
* python hello.py した：hello.py 内部で __name__ は "__main__" という文字列になる

if __name__ == "__main__" という if文を使うことで、「この hello.py は python hello.py のように実行された（== importされたことで動作したのではない）」と判定できます。

```python
if __name__ == '__main__':
    ...
```
MVVM+Repositoryのアーキテクチャを使っています①

#もくじ
・MVVM + Repositoryについて
・階層について
・DataClass実装
➡ 次回はRepositoryとViewmodel部分の実装について書きます


#MVVM+Repositoryとは
アーキテクチャの１つです。他にも様々なアーキテクチャがあるのだと思いますが、[公式ガイド](https://developer.android.com/jetpack/guide?hl=ja#recommended-app-arch)ではMVVMの形式が推奨されておりますので、PeerRadioでもMVVMを使用しております。しかし、そこにRepositoryというのがくっついていますね。これはDBを扱う部分で、MVVMから分けて作っているということです(分けるのが必須ではないです)。


MVVM+Repositoryの登場人物とその関係性は以下の画像の通りです。
![スクリーンショット 2020-11-27 113309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/374a9c44-31b9-2f1d-38f2-38de1265fc5c.jpeg)
ActivityやFragmentからViewModelを呼び出し、ViewModelから非同期処理(Kotlin Coroutine)で`async{}.await()`か`withContext`を使ってRepositoryを呼び、RepositoryではDataClassへ行ったり来たりしつつ実際にDB(PeerRadioの場合はFirestore)へアクセスする処理を書きます。DBへアクセスした結果(取得した情報など)はViewModelへ戻り、さらに、RxJavaのRxRelayの`accept()`と`subscribe()`を組み合わせてActivityやFragmentでデータを受け取ります。RxJavaを利用しなくても、LiveDataの`observe()`でもActivity/Fragmentでデータを受け取れます。

この記事の次回以降では、図の②の「async/ awaitで非同期処理を扱う方法」と「withContextで非同期処理を扱う方法」の両方をかきます。また、図の⑥でも同様に「RxRelayでデータを受け取る方法」と「LiveDataでデータを受け取る方法」の両方を説明します。


#階層
実際PeerRadioではMVVM+Repositoryがどのような階層で配置されているのかが、以下の画像で分かると思います。*今実装してるAdapterにエラーが出ていますが気にしないで行きましょう
![スクリーンショット 2020-11-27 120802.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/aa25213f-b063-86e2-63f1-39d5e19298a5.jpeg)
もっと簡単に階層の概要をかくとこんなかんじです。
![スクリーンショット 2020-11-27 112243.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/3b86efeb-1379-3c95-4aa0-865cca077b1e.jpeg)
つまり、①`model`というパッケージを作成し、そこにDataClassというファイルを格納。②`repository`というパッケージにRepositroryクラスを格納。③それ以外の普通にActivityとかFragmentとかが入っているとこにViewModelクラスも一緒に格納。こんなイメージです。


#DataClass実装
```kotlin:Post.kt
data class Post(
    val postUrl: String? = null,
    val postTitle: String? = null,
    val postDuration: String? = null,
    val createdAt: String? = null
)
```
DBにどんなカラムを作りたいかをかくイメージです。PeerRadioの場合はFirestoreを利用しているので、Firestoreにどんなフィールドを作りたいかをイメージしてここにかいております。
実際にFirestoreではこんな感じで作られてます。
![スクリーンショット 2020-11-27 133532.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/ced6813a-7bdf-2f7b-10f6-0efff19b737d.jpeg)

#さいごに
この記事はだいぶ長くなってしまうので、今回はDataClassまでにします。次回はRepositoryとViewModelの実装について詳しく書いていきます。よろしくおねがいします！
Vue で script で算出した数値・文字列を CSS で利用したい

後で修正します。ポイントは **CSS変数をDOMに動的に当てる** ところです。
ここに気づけずけっこうハマりました。。。


```vue
<template>
  <div class="test" :style="styles">
    <input v-model="color" />
  </div>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  data() {
    return {
      color: 'black',
    };
  },
  computed: {
    styles() {
      return {
        '--color': this.color,
      };
    },
  },
});
</script>

<style lang="scss" scoped>
$size: 10px;

.test {
  --color: black;  // ここは必ず指定
  color: var(--color);
  font-size: $font-size; // もちろん SCSS の変数とも併用できます。
}
</style>
```

Options API だけでなく、 Class API でも動作します。もちろん、 Nuxt でも OK です。
安全性のために、 以下の2点は必ず実施してください。

- デフォルト値の設定（万が一 computed が壊れた等して値が飛んでこなかったら事故に繋がります）
- SASS系なら対象のスコープを限りなく狭めて使う（想定外の影響を避けてください）
Raspberry PiにインストールしたArchLinuxでMuninを使ってCPU温度を監視する

# こんがりラズベリーパイ
Raspberry Piは非常にかわいいシングルボードコンピューターで格安自宅サーバーを営むおっさんを惹きつけてやまないのですが、初期状態ではファンは愚かヒートシンクすらついていないので、常にサーマルスロットリング状態ということも稀によくあるようです。
そこで、CPU温度をグラフ化して監視することにしました。今回はOSにArch Linux、監視ソフトはMunin、WebサーバーはNginxです。Raspberry Pi OSでも大体一緒だと思います。

## Mununのセットアップ
まず、必要なソフトをインストールします。

```
$ sudo pacman -S munin cronie nginx
```

### 各種設定
/etc/munin/munin.conf の htmldir を修正

```
htmldir /srv/http/munin
```
/etc/nginx/nginx.conf の location / を修正

```
location / {
    root /srv/http;
    index index.html index.htm;
}
```
### サービスの有効化と起動
```
$ sudo mkdir -p /srv/http/munin
$ sudo chown munin:munin /srv/http/munin
$ sudo systemctl enable munin-node
$ sudo systemctl start munin-node
$ sudo systemctl enable cronie
$ sudo systemctl start cronie
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
$ sudo crontab /etc/munin/munin-cron-entry -u munin
```

## CPU温度モニタープラグイン
プラグインスクリプトを書きます。
/usr/lib/munin/plugins/cpu_temp 

```sh
#!/bin/sh

. /usr/lib/munin/plugins/plugin.sh

if [ "$1" = "autoconf" ]; then
    if [ -r /sys/class/thermal/thermal_zone0/temp ];then
        echo yes
        exit 0
    else
        echo "no (missing /sys/class/thermal/thermal_zone0/temp)"
        exit 0
    fi
fi


if [ "$1" = "config" ]; then
    echo graph_title CPU core temperature
    echo graph_args --base 1000  -l 0
    echo graph_info CPU core temperature
    echo graph_category system

    echo temp0.label Core
    echo temp0.cdef temp0,1000,/

    exit 0;
fi

echo temp0.value `cat /sys/class/thermal/thermal_zone0/temp`
```

シンボリックリンクを張ることでプラグインが有効になります。

```
$ sudo ln -s /usr/lib/munin/plugins/cpu_temp /etc/munin/plugins/cpu_temp
```

munin-nodeを再起動します。

```shell
$ sudo systemctl restart munin-node
```

しばらく待ってから、 http://localhost/munin にアクセスします。
CPU core temperatureが表示されるようになっているハズです。
![cpu_temp-day.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315438/c7154968-d7a1-8f23-679a-0f1c197866b8.png)
お疲れ様でした。
【Nuxt.js】Nuxt番外編： アトミックデザインにおけるフォルダの分け方と サンプル集

🎈 この記事はWP専用です
https://wp.me/pc9NHC-MQ

#前置き
コンポーネントの分類の仕方についてと
少しですがサンプルコード集です🎈🧸

この要素はどこ❓
molecules❓
それともorganisms❓
なんて時にチェックしてください✅🌟

フォルダ分けはアトミックデザインを推奨しています。
Atomic Designとは

サンプルコードもあるので
コンポーネントの命名や
中身の構成などの参考にも
お役立てください❤️

コードを書き始める前のチェックリストを
見ておくと尚良いと思います✨👀

#分け方
##アトミックデザインに基づく分け方

アトミックデザイン は、
要素の大きさや機能ごとに
ファイルを分けるやり方です✨🗂

それに乗っ取って分けていますが、
確実な正解・ルールは存在しないので
あくまでも私たちの分け方として
参考にしてくださいね♪

それぞれ、
どの階層のコンポーネントを
読み込んでもOKです🙆‍♀️

##atoms

UIの最小要素。
button, icon, inputなど。

タイトルのh1と、
サブタイトルのpでセットの場合なんかも
1つのまとまりなのでatomsへ🍎

##molecules

atomsを2, 3つ貼り付けたような物🧩
ul > li のliや
formに入れるlabelつきのinputなど。

organismがformやulなどの
まとまりなので
それを分解した要素です💡

InputDefault.vueを
atomで作っていた場合はimportし、
作っていない場合は
FormItemInput.vueで
直接inputを使ってもOKです⭕️

##organisms

formやulなど、
ある程度のまとまり。
modalの中身もココ💫

##templates

modalやnav, Header, Footer
sectionなどの大きなまとまり🍓



#atoms
![スクリーンショット-2020-10-23-9.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/868a6797-6614-5ab0-468a-20eb47d10520.png)


🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-MQ
【Swift】Twitterでシェアする機能を追加する

アプリから下記のようなTwitterのツイート画面に遷移させる方法です。
<img width="400px" alt="example" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/f7548ed8-71f6-1f97-fed4-4ade4b756c70.jpeg">

##動作環境
|動作環境|バージョン|
|:-----------|:-----------|
|Xcode|12.1|
|iOS|14.1
|Swift|5|

##コピペで使えるTwitterシェア関数
```swift:
func shareOnTwitter() {
        
        //シェアするテキストを作成
        let text = "AppからTwitterでシェアする"
        let hashTag = "#ハッシュタグ"
        let completedText = text + "\n" + hashTag
        
        //作成したテキストをエンコード
        let encodedText = completedText.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        
        //エンコードしたテキストをURLに繋げ、URLを開いてツイート画面を表示させる
        if let encodedText = encodedText,
            let url = URL(string: "https://twitter.com/intent/tweet?text=\(encodedText)") {
            UIApplication.shared.open(url)
        }
    }
```

##実装サンプル
<b><font color="blue">Twitterでシェア</font></b>ボタンを押すと、上記の<code>shareOnTwitter</code>関数が実施されるサンプルです。

![イメージ.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/d7626d61-6921-5642-4602-75d3686a6b61.gif)

##解説
####1.作成したテキストをURLに繋げれるように、<code>addingPercentEncoding</code>を行う

```swift:
let encodedText = completedText.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
```

作成したテキストに<a href="https://wa3.i-3-i.info/word13355.html">パーセントエンコード</a>を行い、URLで使用できるようにします。

####2.TwitterのURLにエンコードしたテキストを繋げて、そのURLを開いてツイート画面を表示する

```swift:
if let encodedText = encodedText,
            let url = URL(string: "https://twitter.com/intent/tweet?text=\(encodedText)") {
            UIApplication.shared.open(url)
        }
```

・オプショナル型の<code>encodeText</code>をオプショナルバインディング
・アンラップした<code>encodedText</code>を<code>URL(string:twitter.com/intent/tweet?text=\(<b>encodedText</b>))</code>に繋げる
・作成した<code>URL(string:twitter.com/~)</code>をオプショナルバインディング
・<code>UIApplication.shared.open(_ url: <font color="red">URL</font>)</code>にアンラップしたURLを入れる

####UIApplication.shared.openとは？
Apple公式ドキュメントより
>Attempts to open the resource at the specified URL asynchronously.

特定したURLを非同期で開くのを試みます。的な感じでしょうか。

まぁ、開いて欲しいURLを入れたら、そのページを開いてくれるようです！

##まとめ
アプリが広まる仕掛けが必要と言うことで、今回個人開発アプリに実装しました。
特にフレームワークを使う必要も無いですし、簡単に実装できるので是非導入してみてください☺︎

何か誤りがありましたら、優しく教えていただけると幸いです🙇‍♂️


##参考
<a href="https://qiita.com/kumamotone/items/c1fe3dd5718d29cc94d0">iOS の Twitter シェア簡易実装 2019</a>
【Nuxt.js】Vue Router基礎編：params, queryを使ってページ遷移

🎈 この記事はWP専用です
https://wp.me/pc9NHC-eI

#前置き
とっても便利なparams, queryについてご紹介🌟
同じコンポーネントを見せたいけど、
カテゴリごとにURLだけを変えたい…
一覧ページからソートして表示させたい…
そんな時に便利です♪

params, queryについて
いくつかに分けて書きます✍️
router-linkが分かれば簡単です🌟
まだ不安な方のためにも
複数の書き方で記載しました🍒

#params, queryの違い
まずはURLを見るのが
分かりやすいと思います🎈

localhost:3000/param/param?query=123
##パスパラメーター(param)

?より前の部分、省略できない

##クエリパラメーター(query)

?以降の部分、省略できる

###directoryとの関係①
localhost:3000/project123
projectごとにURLを変更
表示ページは同じでコンポーネントで表示分け

```bash:file
pages/
--| _id/
-----| index.vue
```

###directoryとの関係②

localhost:3000/events?today=true
events/index.vueの中で
today=trueでソートをかけて表示

```bash:file
pages/
--| events/
-----| index.vue
```

eventsは絶対省略できないですね。
pages/events/index.vueに
行けなくなってしまいます。

?today=trueは省略しても
ソートが外れるだけなので
ページはきちんと表示されます♪



#メリット
🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-eI
【kintone】アプリの「スペース」フィールドにボタンを設置する

アプリにボタンを設置したいなぁと思うことがあります。よね？
今回はボタンをアプリのスペースフィールドに追加して使えるようにするというお話です✨✨
kintone & JavaScriptカスタマイズを始めたばかりの方向けに書きました＾０＾



**今回つくるボタンの完成イメージ**
自作のボタンをクリックすると「プッシュ」と書かれたアラートを表示します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4fcb28aa-2ce6-0442-3d4e-c6823ce9c74a.gif" width="500px">


# スペースフィールドの準備
ではまずアプリの準備・・・というかスペースフィールドの準備をします。

(1) スペースフィールドを設置します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/89981a9d-3d33-4d8a-2fda-15cdd6dda308.png" width="400px">

(2)要素IDを設定します。今回は `spSuteki` としておきます。（何でもOKです）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/c32f836b-a008-28e1-0d34-bd8e62cc72d7.png" width="600px">

# JavaScriptを書く
ボタンを設置するJavaScriptを書きます。
これのコピペで、新規追加画面＆編集画面でボタンをひとまず使えるようになります。
解説は後述します。

```js
//新規追加画面でボタンを使いたいときは'app.record.create.show'
//編集画面でボタンを使いたいときは'app.record.edit.show'
kintone.events.on(['app.record.create.show', 'app.record.edit.show'], event => {
    //ボタンを置きたいスペースフィールドを取ってくる
    const sp = kintone.app.record.getSpaceElement('spSuteki');

    //ボタンを作る
    const btn = document.createElement('button');
    //ボタンに表示したいテキスト
    btn.textContent='ボタン';

    //スペースフィールドにボタンを追加する
    sp.appendChild(btn);

    //ボタンをクリックしたときの動作
    btn.onclick=()=>{
        //ここにボタンをクリックしたときの動作を書く
        alert('プッシュ');
    }

    return event;
});    

```
# JavaScript解説

## イベントが発生したときに動き出すプログラム

最初のこんな行ですが・・・
`kintone.events.on(['app.record.create.show', 'app.record.edit.show'], event =>{～～`

「〇〇なイベントが発生したら、～～するよ！」という意味の部分です。
`'app.record.create.show'` は、「レコード追加画面が表示されるというイベントが発生したら」
`'app.record.edit.show'` は、「レコード編集画面が表示されるというイベントが発生したら」
です。

`event => { ` の後に、「～～する」をプログラミングします。

## スペースフィールドにボタンを置く

画面が表示されるというイベントが発生したら、ボタンを表示したい。
ボタンをスペースフィールドに置きたいのですが、それをプログラミングするには

1. 「スペース」フィールドをプログラムで扱えるようにする
1. 「ボタン」を作る
1. 「スペース」フィールドに「ボタン」を置く

という手順が必要になります。

プログラムを見てみましょう。

**1.「スペース」フィールドは↓のようにプログラムで扱えるようにできます。**
`const sp = kintone.app.record.getSpaceElement('スペースフィールドの要素ID')`

アプリの準備のときに、スペースフィールドの要素IDを `spSuteki` としていました。
下記のようにすることで、`sp`という入れ物に要素IDが `spSuteki` のスペースフィールドを入れる事ができます。

```js
//ボタンを置きたいスペースフィールドを取ってくる
const sp = kintone.app.record.getSpaceElement('spSuteki');
```

**2.次はボタンを作ります。**

JavaScriptで「ボタン(button)」を作るときは `document.CreateElement('button')` とします。
ボタンに表示したいテキストも設定しておきましょう。

```js
//ボタンを作る
const btn = document.createElement('button');
//ボタンに表示したいテキスト
btn.textContent='ボタン';
```

**3.そして、作ったボタンをスペースフィールドに乗せ(追加し)ます。**
`sp`（スペースフィールド）に、`btn`（ボタン）を、`appendChild`（追加）しています。

```js
//スペースフィールドにボタンを追加する
sp.appendChild(btn);
```

## ボタンの動きを作る

ボタン作成の次には、ボタンを押したときにどうするか！？の部分をプログラミングします。
今回は`alert()`を使って、アラート表示してみましょう。

`btn`(ボタン)を、`onClick`(クリックした時) というイメージ↓のように書きます。

```js
//ボタンをクリックしたときの動作
btn.onclick=()=>{
    //ここにボタンをクリックしたときの動作を書く
    alert('プッシュ');//アラート表示
}
```

# まとめ
kintoneではボタンを追加したいときはJavaScriptでカスタマイズする必要があります。
でも、たった何行かのプログラムを書くことでボタンを表示することができると、なんだかできそうな気がしませんか！？

次回は、ボタンを使ってフィールドの値を変更してみるようなプログラミングに挑戦してみたいと思います✨✨
ではでは～

※公式のチュートリアルでもボタンを設置する方法が紹介されていますので、是非そちらもご覧ください＾０＾
参考：[第3回 レコード詳細にもボタンを設置しよう！](https://developer.cybozu.io/hc/ja/articles/201952870)

以上です✨✨
[WorPress] RSSフィードからSNS配信するときにタグをハッシュタグで追加したい

RSSフィードからSNSに配信する場合は以下の記事参照

WordPressでプラグインを使わずIFTTTを使ってRSSフィードからSNSに配信する
https://qiita.com/gatespace/items/ebd43d1ba6ef18365415

RSSフィードにある要素であればその組み合わせでSNSに配信できるのだけど、「投稿タグを自動でハッシュタグに変換してSNSに投稿したい」となると、ちょっと面倒です。

# WordPressのデフォルトフィードでの投稿タグの扱い
下記の部分
https://core.trac.wordpress.org/browser/tags/5.5.1/src/wp-includes/feed-rss2.php#L97

`the_category_rss( 'rss2' )`  で処理してます。

the_category_rss()
https://developer.wordpress.org/reference/functions/the_category_rss/
`get_the_category_rss()`　を echo してるだけ

get_the_category_rss()
https://developer.wordpress.org/reference/functions/get_the_category_rss/

大まかに説明すると
1. 投稿のカテゴリーとタグを全て取得
2. 取得したカテゴリー名とタグ名を配列にする
3. カテゴリー名とタグ名の配列をループ処理で1つずつ `<category>` に出力

となります

# 投稿タグだけ何とかしたい

`get_the_category_rss()` にフィルターもあるんですけど、、「投稿タグを自動でハッシュタグに変換してSNSに投稿したい」なので、投稿タグだけを処理するのがしんどそうなので、「投稿タグだけのタグ」を追加するのが良さそう。

こう言う時はアクションフックの `rss2_item` で追加できるのです。
https://developer.wordpress.org/reference/hooks/rss2_item/

## 「投稿タグだけのタグ」を追加するコード

良いネームスペースが思いつかなかったのでフィードバリデーターではエラー出ますので注意。
雑なサンプルなので、微調整は必要ですよ。

```php:add_my_rss_node.php
<?php
add_action( 'rss2_item', 'add_my_rss_node', 10, 1 );
function add_my_rss_node() {
	$post_tags = get_the_tags();
	$separator = ', ';
	$output = '';

	if ( $post_tags && ! is_wp_error( $post_tags ) ) {
		foreach ( $post_tags as $tag ) {
			// とりあえず空白は削除、他にもハッシュタグに使えない文字の変換必要かもしれない
			$tagname = str_replace([' ','　'], '', $tag->name );
			$output .= '#' . esc_html( $tagname ) . $separator;
	  }
		$output = trim($output, $separator);
	}
	// ネームスペースいいのないかな
	echo '<tags><![CDATA[' . $output . ']]></tags>' . "\n";
}
```

## フィードはこうなる
https://gatespace.jp/feed/

`<item>` の最後の方にハッシュタグ付きになった投稿タグがカンマ区切りで入っていれば成功

```		
<tags><![CDATA[#Shifter, #ShifterAdventCalendar2019, #ShifterGithubPlugin/ThemeInstaller]]></tags>
```

# 確認してみよう
ZapierやIFTTTでフィードを取り込んで `<tags>` が使えたら成功
![スクリーンショット 2020-11-27 11.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/489053b3-1178-8039-0860-31c7a0ed23d4.png)
![スクリーンショット 2020-11-27 11.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18348/544743ce-ee7b-3712-edfc-f0a125ee67f6.png)

https://twitter.com/gatespace_k/status/1332154797613588485

- - - -

現場からは以上です。
【無料】 最新のReactの書き方を何で勉強するべきか？

#この記事の対象者
- プログラミングをある程度できてReactを勉強してみたい人
- React の最新の書き方を知りたい人
- React の学習を何でするべきか悩んでいる人

#React の新しい書き方とは？
主にReact  Hooksのことを指しています。

反対に古い書き方はクラスコンポーネント、componentWillMountなどのコンポーネントのライフサイクルを使用しているものです。Hooksは2019年2月に追加されたのでもうすでに１年以上経過していますし、**基本的にはHooksを使用することを公式が推奨しています。**

[React 公式サイト](https://ja.reactjs.org/docs/hooks-intro.html)にも載っていますが、クラスコンポーネントではステートフルなロジックの再利用が難しく、記述も関数コンポーネントに比べて長くなりがちで可読性が低いです。

そのため、これからReactを学ぼうと考えている人は絶対に、React Hooksを学んでおきましょう！

#どうやって勉強するの？
ずばり、Youtubeで学びましょう。

**Youtubeのメリット**

- ハンズオン形式で学べる。
- プログラミングの言語知識だけでなく役立つサイト・裏技も学べる。（ショートカット、API、命名規則など）
- Udemyと比べても大差ないレベル感のものが多い。
- 英語も一緒に勉強できる。（後々ドキュメントを読むときに役立つ）
- ほとんど最新のバージョンを使って、最新の記法で書いてくれている。

**Youtubeのデメリット**
- 基本的に英語圏しかない。
- 再生時間が長くなりがちで、短時間での勉強には向いていない。
- 自分が知りたい情報にたどり着くのに時間がかかる。

一応、メリット、デメリットを挙げてみましたけど、書籍などはどうしても公式チュートリアルをなぞったような堅い書き方が多いですし、Udemyはお金がかかるし、Progateなどは実務とはかけ離れすぎているし、基本的には「Youtubeを使わない手はない！」と思っています。

#Youtubeでのプログラミング勉強法

これはReact以外の言語においても使える方法なので、ぜひ時間のある方は試してほしいです！今回はReactで説明していきます。

###STEP1 言語名 + Tutorial で検索する

まず、自分が勉強したい、言語・フレームワーク・ライブラリを打ってその後にTutorialと入れて検索してみましょう。

「React Tutorial」で検索してみましょう。

チュートリアル動画は、基本的な構成としては、言語の簡単な解説、環境構築、Hello World、各機能の解説、簡単なアプリの作成、というものが多いです。再生時間としては3時間以上が基本ですかね。

###STEP2「１年以内 + 公式 or 再生数が多い 」動画を探す
一番重要なのは**いつ公開されたか**です。

自分がおススメしているのはYoutubeの並べ替えでアップロード順にして、再生数が1000回以上の動画もしくは、公式マークがついているチャンネルの動画、再生時間が2,3時間以上の動画をチェックする方法です。

再生回数が多い、公式マークがついているチャンネル、再生時間が3時間以上の動画は、基本的に内容も充実しており、スライドを使って説明していたり、機能を一つ一つコメントアウトして説明してくれたりしていて良質なものが多いです。

あとは、少しやってみて自分の肌に合うものを確かめて、どんどん進めていきましょう！

ちなみに現在おすすめの「React Tutorial」動画としては以下になります。

[Coding Addict](https://youtu.be/iZhV0bILFb0?list=LL)
公開日：2020/9/29
再生時間：10時間
説明：ソースコードが公開されており、Hooksの機能も丁寧に解説している。


[Bitfumes](https://youtu.be/I6tbhNUU96Y?list=LL)
公開日：2020/9/21
再生時間：10時間
説明：画像検索サービスを作りながら、Reactの基礎を学べてNetlifyでデプロイも行う。

[codedamn](https://youtu.be/15YB__vYpuA?list=LL)
公開日：2020/8/27
再生時間：9時間
説明：連絡先登録と検索ができるサービスを作れる。

###STEP3 クローンアプリを作る
Udemyなんかでもよくありますが、Youtube、Instagram、Amazon、Twitter、Netflixのクローンアプリを作りましょう。クローンアプリなんて作って意味あるの？って思う人もいるかもしれませんが、実際のサービスを作るために、どういう風に実装しているのかそのためにどういうサービスを使っているのかなどを学ぶことができ、大変参考になります。

セキュリティに関してもパスワードやセッションの保存方法、ユーザーのデータモデルの設計など自分一人で一から考えていると、それだけで１週間以上かかってしまうこともあります。そのため、デフォルトスタンダードとまではいかないにしても、基本的なサービスの作り方を学んでいくと自分でこんな機能を実装したい！と思ったときに、あのサービスのこの機能とこの機能を組み合わせれば作れるじゃないか？という風に自走力が身につきます。

###STEP4 オリジナルアプリを作る
クローンアプリにオリジナル機能を一つ追加するだけでも良いです！
思いついたら即行動の精神で作ってみてください！

#さいごに
Reactを勉強する上で、Next.jsとかGatsbyとかに手を出したくなる気持ちはすごくわかるんですが、結局、素のReactすらも使いこなせていないのにそれらを使おうとしても、最大限の機能を使うことはできないと思います。なので、地道にコツコツ頑張りましょう。
【Semantic Segmentation】DeepLab (V1) : Fully Connected CRFでセグメンテーションを向上

<h1>背景</h1>
Semantic SegmentationでDeepLabというのが有名だったから調べてみる事にした。
特徴は
1. Dilated Convolutionを使ってること(画像全体の特徴を取るため)
2. Fully Connected CRFを使っていること(画像全体でrefinementするため)



<h2>全体像</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/44087b77-aa80-dde8-4418-84e4401a20f3.png)

DeepLabでは3stepだけ

1. CNN(Dilated Conv含む)で畳こむ
2. Bi-linear Interpolationで画像サイズを拡大する
3. CRFでRefineする

<h2>CRFってなんじゃい？！</h2>
一度クラスに分類された結果をよりよく修正する事が出来るのがCRF。

「同じような色や近くにあるpixelは同じクラスに分類されるはずだ！」
という仮定から
近隣pixelとの類似度(事前に自分で定義した関数)を元にして結果をupdateする

いうなればsmoothingですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/2eb0a2da-47d9-75b1-a676-c889cf657c29.png)

お隣さんとの比較で先端が良くなっている！

詳しくはこちらを
https://news.mynavi.jp/article/cv_future-36/

<h2>Fully Connected CRFってなんじゃい？！</h2>

従来のCRFは近場だけで比べるからlocalな結果のupdateは出来るんだけど、細い物体とかの精度を上げるのが難しい。(だから飛行機を例に出したのね)

「もっと全体をみなきゃダメだ！」という事でCRFをFully Connectedにしてみたらしい。
計算量ヤバそう笑


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/70b51a6e-e8a7-7fbf-8d4c-d4cd17b16c9c.png)

左側はCNNによって推定されたclass probability scoreの逆数=>コスト
右側はpixel iとpixel jが違うクラスと分類された時の色情報と距離情報が近ければ値が大きくなる=>コスト

このコストを最小化する事でsmoothing出来る


<h1>結論</h1>

CRFを使うとsmoothing出来るんだなってのがわかった。
コストの最小の仕方に関して少し分からなかったので、また調べたいと思う



<h1>参考文献</h1>
SEMANTIC IMAGE SEGMENTATION WITH DEEP CONVOLUTIONAL NETS AND FULLY CONNECTED CRFS
https://arxiv.org/pdf/1412.7062.pdf

https://news.mynavi.jp/article/cv_future-36/
Conditional Random Fields as Recurrent Neural Networks
https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Zheng_Conditional_Random_Fields_ICCV_2015_paper.pdf
JavaScriptのプリミティブ型について

#はじめに
脱初心者にむけてアウトプットをしていこうと思って記事を書いております。
間違ったことがありましたら、ぜひコメントいただけると幸いです。


###JavaScriptでは、値の種類が２種類ある
一つはプリミティブ(primitive)、もう一つはオブジェクト(object)である。（今回はプリミティブだけの記事です）

##プリミティブは「不変(immutable)」
どういう意味かというと実は簡単で、数値の9は常に9であるということ、文字列の"world"は常に文字列の"world"であること。
文字列"hello" + "world"が連結したら"hello world"になり全く新しい文字列になるのです


##ただし、「不変(immutable)」とは変数の内容を変更できないという意味ではないことです。

```
let str = "hello";
str = "world";
```

このような文があったとして、
変数strは値"hello"で初期化され、次に新しい不変の値"world"が代入されている。ここで重要なのはhelloとworldは別の値ということ。

## プリミティブを表すデータの型

|型 |
|---|
|数値（Number）　 |
|文字列（String） |
|論理値（Boolean）|
|null         
|undefined
|シンボル（Symbol）

##まとめ
JavaScriptのプリミティブについて紹介してきました。
次回はレンプレートリテラルについて記事を書いていこうとおもいます。
ご覧いただきありがとうございました。
EJSでもconsole.logが使える。デバッグに便利。

EJSでも、JavaScriptでおなじみの`console.log()`を使うことで実行環境へログを出力することができます。

```js
<% 
    const person = 'taro';
    console.log(person); 
%>
```
```sh
taro
```

使用しているNode.jsがv10が以上であれば`console.table()`なども使うことができます。

```js
<% 
    const people = [
      {name: 'taro', age: 66},
      {name: 'shota', age: 33},
      {name: 'hiroto', age: 10},
    ];
    console.table(people); 
%>
```
```sh
┌─────────┬──────────┬─────┐
│ (index) │   name   │ age │
├─────────┼──────────┼─────┤
│    0    │  'taro'  │ 66  │
│    1    │ 'shota'  │ 33  │
│    2    │ 'hiroto' │ 10  │
└─────────┴──────────┴─────┘
```

混みいったコードを書く時にデバッグとして使うと便利です。

## 参考記事
[Node.js v10.0.0でconsole.table()追加&console.log()アップデートに感動したので早速試してみる](https://qiita.com/n0bisuke/items/60e52cde73343bbe7703)
意地でもvimでコード補完したい人へ

# まだvimの補完で消耗してんの?
PHPStorm便利だよねえっていうツイートをみるといつも羨ましいvim使いです。
そりゃねえお金あったらPHPStormとか使いますよ。そうだ!そうだ!お金で解決しよう(社長よろしく)

でも生来のvim使いなのにそんな文明の利器に負けていいのか、そう自問自答して何年たったのだろう。そうVisualStudioCodeを見ながら・・・!

# TL;DR
* coc.vimをつかえ
 
設定はほとんど公式サイトのそのままで問題ない。インストールにハマることはなかった。動作はとても快適。

https://github.com/neoclide/coc.nvim

# 思えばvimでのコード補完の道のりは長く険しいものでした
vim使いの人はご存知かもしれませんが、私も例に漏れずneocomplete / deopleteなどなどと共に歩んで来ました。ところがvimのバージョンが上がるたびに何故か動かない、設定がうまくできない。

私のvimスキル不足とういうのも大いにあるのでしょうが、いつも勢いでmac osアップデートして死ぬとかbrew upgradeとかして動かないbuglist見るとかして苦労していました。

どうしてもvimそのものにこだわる私としてはneovimやmacvimへの移行は絶対にしない(でも補完動かないのでモヤモヤが募る・・・)

# そこで見つけたcoc.vim
## LSPでvim補完しちゃう
LSPとはMicrosoftがつくって公開したプロトコル。VSCodeでもつかってる(から補完とかできるわけです)。詳しくは他の人がめちゃくちゃちゃんと書いてくれてます。(Qiitaの民はいつも感心させられる)

https://qiita.com/atsushieno/items/ce31df9bd88e98eec5c4

## こまけえことはいいんだよ、インストール方法は?
https://github.com/neoclide/coc.nvim/wiki/Install-coc.nvim

## phpの人は
:CocInstall coc-phplsだけでいける。特に何かを設定しないといけないとかはない。公式サイトに書いてあるとおりにやれば十分に動くと思う。

## ちゃんと動いてるかの確認は
vimで拡張子がターゲットのものに関して、入力すると補完のポップアップがでてくるので候補の横に[LS]と出てればOKです。
CakePHP4 クエリビルダでの AVG と ROUND のやり方

AVG で平均を取った後の、小数点以下の四捨五入についてのコードが公式含め見当たらなかったので書き残しておきます。MySQL前提です。

例えば以下の要件を満たす場合です。

- 商品の評価の平均値
- 小数点第一位で四捨五入したい

## コード

```php
        $query = $this->Products->find();
        $result = $query
            ->select([
                'average_evaluation_rating' => $query->func()->round([$query->func()->avg('Products.evaluation'), 1]),
            ])
(以下略)
```

## 解説

MySQLだと以下のように書くところを

```sql
ROUND(AVG(Products.evaluation), 1)
```

CakePHP4 だと以下のように書きます。

```php
$query->func()->round([roundしたい内容, 四捨五入する小数点の位置])
```

AVG も関数を使って書くべきなので、round したい内容に

```php
$query->func()->avg('Products.evaluation')
```

と書いています。

## 実行されるクエリ

```sql
SELECT 
    (round(AVG(Products.evaluation), '1')) AS average_evaluation_rating
FROM
    products Products
(以下略)
```
Teamsでマイクが使えないときはプライバシーを確認してみよう

Teamsの場合、テスト通話で確認してみてください。
設定→デバイスから、テスト通話を開始をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161886/74ec9aa8-72b7-ab16-3b3f-af73c505f184.png)

こんな表示がある場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161886/8deca46f-aca8-ded6-dc18-ccf7920fdcab.png)

デバイスは正常に動作しているのに、マイクが使えないという場合の確認事項です。


設定→プライバシー→マイクから以下のスイッチをONにする。
アプリがマイクにアクセスできるようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161886/cfee0579-dd33-b217-b305-76642b20a73e.png)
Docker　pオプションによるポートマッピングとは？

# ポートマッピングとは

> ポートマッピング  【 port mapping 】 

> ポートマッピングとは、ブロードバンドルータなどが持つ機能の一つで、グローバルIPアドレスの特定のポートを、特定のプライベートIPアドレスの特定のポートに固定的に対応付けて転送するもの。内部ネットワークの機器に外部から着信することができる。

[ポートマッピングとは - IT用語辞典 e-Words](http://e-words.jp/w/%E3%83%9D%E3%83%BC%E3%83%88%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0.html)

ポートフォワーディングという言葉で使われている場合もあるよう。
[ポートフォワーディング - ネットワークエンジニアを目指して](https://www.itbook.info/study/nat6.html)


Dockerでポートマッピングをしないと、アクセスすることが出来ないため、コンテナを起動する際にポートマッピングをして起動させます。

## -pオプション

- ポートのマッピングを設定する
- `docker run --name nginx -p <ホストのポート>:<コンテナのポート> nginx`


```terminal
docker run --name nginx -p 80:80 nginx
```
これでnginxのデフォルトのポート80とローカルのポート80が繋がりました。

## アクセスしてみる。

ブラウザに`http://127.0.0.1:80/`もしくは`http://localhost:80/`を入力すると立ち上げたサーバにアクセス出来ます。

もしくはterminalからcurlコマンドでも確認が出来ます。

```terminal
curl http://localhost:80/
```
コードレビューしてもらうときのgitコマンドまとめ

毎回調べてる上にやらかしたので備忘録的に...

## Githubにプルリクつくるまで
``` 
$ git add -A 
$ git commit -m "適切なコメント" 
$ git push origin <作業ブランチ名>
github上でなんやかんやしてプルリクを作る
```
## プルリクOKでたら
```
github上でマージ(confirmなんちゃらまで押す)
$ git pull origin master 
```

ローカルのmasterに対してローカルの作業ブランチは基本的にmergeしない！
Excelの名簿から一括でメール配信やFAX送付状を作るVBA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/14f31585-a3eb-3251-6ba5-6187cdb9331e.png)
イベントなどで様々な会社を取りまとめる時、会社によってメール配信を希望する所や、FAX配信を希望するところなどがあって作業が煩雑になる。
そういった時に名簿からメール配信希望者だけに配信したりできるシステムがあったら便利なのではと思い作成した。
ファイルはGitHubにあげてあるのでダウンロードし、必要に応じて改編して使用してほしい。
VBAコードの解説だけここに記載しておく。

▼ファイル場所
https://github.com/NobodyGonbe/EMAIL-from-Excel
ExcelVBAでダイアログを開いてファイル名を取得し、セルへ入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/9a53d0e4-ca6d-6751-48f9-e08467924f58.png)

これは[Excelの名簿から一括でメール配信やFAX送付状を作るVBA](https://qiita.com/nobody_gonbe/items/3b4f9024aa702bab7b13)の各コードを細かく解説したものです。
完成品は[こちら](https://github.com/NobodyGonbe/EMAIL-from-Excel)のGitHubからダウンロードできます。

##ダイアログからパス名を取得
「ファイル名を取得」ボタンをクリックしたらダイアログが開き、選択したファイルのパスをセルに入力するコードの解説です。


##コード解説
```VB
Sub ファイル名を入力(cellAddress)
    
    'ファイルパスを宣言
    Dim filePath As String

    'ファイルパスをセルアドレスに入力
    filePath = Application.GetOpenFilename()
    Range(cellAddress).Value = filePath
    
End Sub

Sub B6へ入力()
    ファイル名を入力 "B6"
End Sub

Sub B7へ入力()
    ファイル名を入力 "B7"
End Sub

Sub B8へ入力()
    ファイル名を入力 "B8"
End Sub
```

上から順に説明していくと
・何度か使用するためSub ファイル名を入力（引数）というように引数を設定する
・filePathを文字列として宣言
・filePathはダイアログを開いて選択したもの
・取得したファイルパスを引数の場所に入力

・他のSubはそのままの名前で呼び出せるので
B6へ入力したいときは
```ファイル名を入力 "B6"```
というように「Subの名前スペース引数」を指定すると使用することができる

##ボタンに割り当てる
今回は図形ではなくフォームに割り当てた。
開発→挿入→フォームでボタンを選択し、配置したフォームを右クリックでマクロを登録する。
別端末からA5M2に接続できない

#A5M2でデータベースに接続

サーバ(代わりのPC)にPostgreSQLを構築し、それを別端末からA5M2で確認したい。

いつも通りA5M2を開き、データベースの追加、
サーバ名、ポート番号、データベース名、ユーザID、パスワードを入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/910987/ed35c168-ccfa-56bb-8d3d-d16f399229ed.png)

テスト接続すると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/910987/df7a8db8-7652-efb9-77b2-f2113da287da.png)
接続に失敗。


#結論：ファイアウォールでポートの受信規則を作成

サーバ側のファイアウォールに阻まれていることが分かったため、受信の規則を確認。
（経緯は後述の「その他に確認したこと」参照）

操作 - 受信の規則 - 新しい規則から、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/910987/441d97f5-55a5-c3e0-3332-c777349fe709.png)

ポートを選択し、TCP、特定のローカルポートでポート番号を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/910987/08c3179d-492d-ce21-dc2c-da356a857118.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/910987/0a25500d-d029-861d-64b1-c759813c0f03.png)

接続を許可し、分かりやすい名前を付けて完了。
規則ができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/910987/f5c699b5-0fed-4595-d61b-546b381a695d.png)


この状態でテスト接続すると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/910987/fc039e5c-4f44-cc93-a701-efeda2aac3a4.png)

接続できた！


#その他に確認したこと

##①サーバ側でA5M2に接続
まずはサーバ側でA5M2接続できるかを確認。
　⇒接続できた。

##②サーバにpingを飛ばす
サーバのIPアドレスにpingを飛ばすと
　⇒タイムアウト。。。

ちなみに、サーバ側からPCにpingを飛ばすと
　⇒通る。

ちなみに、リモートデスクトップが繋がっているのにpingが通らない？？
と思って調べたところ、リモートデスクトップとpingは使用しているプロトコルが異なるそう。

##③pingが通らないので、ICMPの規則を確認
これはGoogleで「ping 通らない」で検索するとほとんどの記事に書いてある。
Windows Defender ファイアウォールのファイルとプリンターの共有（エコー要求 - ICMPv4 受信）を有効化させる。
　⇒確認したところ既に有効化されていた。

##④サーバ側のファイアウォールを無効化してみる
そもそもこれでも通らなければファイアウォールは関係ない。
ということで、ファイアウォールそのものを無効化してみる。
　⇒ping通った！

しかし、ファイアウォールを無効化のままにしておくわけにもいかない…

##⑤ポートの存在に気付く
初心に戻り、A5M2の接続方法等から調べなおしていたところ、
そもそもポートを開放していないことに気付く
　⇒結論へ



という流れでした。
ちなみに、ファイアウォールを有効化していると、未だにpingは通りません…

今のところリモートデスクトップも繋がり、DBも見れるためそのまま放置してありますが何かわかり次第追記します。
Catalina10.15でCocoaPods1.10.0を入れる方法(Homebrew)

# はじめに
もともとgemでバージョン1.5.3を入れてたのですが、ライブラリアップデートに伴ってCocoaPods自体のバージョンも上げることになり`sudo gem update cocoapods`を実行したら以下のエラーが発生
>Building native extensions. This could take a while...
ERROR:  Error installing cocoapods:
    ERROR: Failed to build gem native extension.

調べるとRubyのバージョン関係のエラーのようで、RubyのバージョンかインストールするCocoaPodsのバージョンを下げることで対応できるみたいなのですが、使用しているライブラリの関係上CocoaPods 1.10.0を入れる必要がありました。
これを機にgemからHomebrewでの管理に移行しようと思い、その際に行った作業を備忘録として投稿。

# 環境
macOS Catalina バージョン10.15.7
ruby2.6.3p62
CocoaPods 1.5.3
# 手順
### 既にインストールされてるCocoaPodsをアンインストールする

```ターミナル:ターミナル
$ sudo gem uninstall cocoapods -n /usr/local/bin
```

### Homebrewが既にインストールされてる場合はアップデートする<br>未インストールの場合はインストールする

```ターミナル:ターミナル
$ brew update
```

### HomebrewからCocoaPodsをインストールする

```ターミナル:ターミナル
$ brew instal cocoapods
```

#### エラーが発生した場合
> Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/pod
Target /usr/local/bin/pod
already exists. You may want to remove it:
rm '/usr/local/bin/pod'
>
To force the link and overwrite all conflicting files:
brew link --overwrite cocoapods
>
To list all files that would be deleted:
brew link --overwrite --dry-run cocoapods
>
Possible conflicting files are:
/usr/local/bin/pod
/usr/local/bin/xcodeproj

上記のようなエラーは、`gem install`した時の痕跡が残っててシンボリックリンクが貼られなかったことが原因みたいです。
以下のコマンドを実行することで解決します。

```ターミナル:ターミナル
$ brew link --overwrite cocoapods
```

# おわりに
そもそもRubyのバージョンをどうにかすればgemのままインストールできたのでは...？
他にも「こうすればできるよ！」や「ここが間違ってるよ」など知見がある方がいましたら、コメントください。

# 参考記事
https://qiita.com/spring_i/items/181bc3c05142d1f80d93
https://github.com/CocoaPods/CocoaPods/issues/8955
https://teratail.com/questions/245100
シェルコマンド　N分でアラームを鳴らすコマンド

ざっくりメモです。

```.zshrc
function tmr () {{sleep $((60 * $@)); osascript -e 'display notification "時間です"' -e 'beep 10';}&}
```

```terminal
tmr <n分数>
```

## 解説

osascriptコマンドでAppleScriptを実行

```terminal
osascript -e 'display notification "時間です"' -e 'beep 10'

# 通知
display notification "時間です"

# ビープ音10回
beep 10
```

## 今後できたらいいこと

- 残り時間の表示
- プロセスに名前をつける
- コマンド入力時に設定内容をterminalに返す
【Deno】(ちょっとせこい)0行プログラミングで湯婆婆

この記事は、Jig.jpインターン Advent Calendar 2020 20日目の記事です。

こんにちは！jig.jpインターン参加者のすずともです。

本当はjig.jpインターンの内容をいろいろ書いていきたかったのですが、あまり時間が無くて...

というわけで、最近何かと話題のプログラミング湯婆婆を
インターンで教わったDenoを使って実装していきたいと思います！

# 10月20日
Advent Calender 20日目、12月20日は、なんと、千と千尋の神隠しの！！！！？？


シンガポールでの映画公開日です笑

せめて縁のある日に...ね？

# 実行！
コンソールにて、次のコマンドを打ち込んでください。

```console
deno run https://kamekyame.github.io/yubaba-deno/契約書だよ。そこに名前を書きな.ts 千尋
```

このコマンドを実行すると

```console
フン。千尋というのかい。贅沢な名だねぇ。今からお前の名前は千だ。いいかい、千だよ。分かったら返事をするんだ、千!!
```

と出力されます。

# 湯婆婆 for Deno の中身
ソースコードは[Github](https://github.com/kamekyame/yubaba-deno)にあげてあります。

```typescript:契約書だよ。そこに名前を書きな。.ts
const n = Deno.args[0];
if (!n) Deno.exit();
const m = n[new Date().getTime() % n.length];
console.log(
  `フン。${n}というのかい。贅沢な名だねぇ。今からお前の名前は${m}だ。いいかい、${m}だよ。分かったら返事をするんだ、${m}!!`,
);

export {};
```

まずは、1行目でコマンドライン引数を取得。
2行目では、契約書に名前が書かれていなかったら（`n`が`undefined`だったら）強制終了をしてます。

3行目では、`Date().getTime()`を使用して疑似乱数のように使い、1文字を抽出。

最後にコンソールログで出力しています。

最終行の`export {}`がないと、エラーが出るようです。（Denoのファイルはモジュールベース？なので、importかexportがないとだめっぽい）


# Denoファイルの実行
Denoを実行するときは、

```
Deno run [option] "ファイル名" [引数]
```

のようなコマンドで実行できます。

今回の場合、optionはなしで、ファイル名と引数を指定していますが、Denoではファイル名のところにURLを入れることで、インターネット上のファイルを直接実行することが出来ます。

今回は、`契約書だよ。そこに名前を書きな。.ts`をGithubに置いて、Github pagesにて公開しているため、最初にあげたコマンドにて実行できます。


初回実行時には、ファイルのダウンロード＆チェックが入るため、

```
Download https://kamekyame.github.io/yubaba-deno/%E5%A5%91%E7%B4%84%E6%9B%B8%E3%81%A0%E3%82%88%E3%80%82%E3%81%9D%E3%81%93%E3%81%AB%E5%90%8D%E5%89%8D%E3%82%92%E6%9B%B8%E3%81%8D%E3%81%AA%E3%80%82.ts
Check https://kamekyame.github.io/yubaba-deno/%E5%A5%91%E7%B4%84%E6%9B%B8%E3%81%A0%E3%82%88%E3%80%82%E3%81%9D%E3%81%93%E3%81%AB%E5%90%8D%E5%89%8D%E3%82%92%E6%9B%B8%E3%81%8D%E3%81%AA%E3%80%82.ts
```

という文が表示されますが、初回実行時にパソコン内にファイルがキャッシュされるため、2回目以降はきれいになります。


# 最後に
jig.jpインターンに参加できて、とてもよかったと思っています！
いろんな地方の人とも仲良くなれたので…

jig.jpインターンの様子は、[はてなブログ](https://jigintern2020.hatenablog.com/)にて参加者が日替わりで綴っているので、jig.jpインターンに参加しなかった人も是非ご覧ください！

あと、ほかのインターン生・メンターのadvent calenderもよかったら覗いてみてください！
FriendlyでE2Eテストを書いてみて、子メニューが取れずに苦戦

Windowsデスクトップアプリ(WPF)のE2Eテストを書きたくて、Friendlyに出会った。これが個人的に最も直感的だった。

https://github.com/Codeer-Software/Friendly

詰まった点としては、Friendlyというより、WPFのLogicalTreeとVisualTreeの挙動というところにあると思われるので、同じこと悩んでる人がいたらいいなと思って、書きます。

### メニューを動的に組んでいるケースでハマった
ログイン者に応じて、メニューを動的に切り替える仕組みを採用していて、そのXAMLがこんな感じです。
#### MainWindow.xaml
```xml
    <Grid Background="#FFF2F0DF">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Menu ItemsSource="{Binding GlobalMenu}">
            <Menu.ItemContainerStyle>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Command" Value="{Binding DataContext.NavigateCommand, 
                        RelativeSource={RelativeSource FindAncestor,
                            AncestorType={x:Type view:MainWindow}}}"/>
                    <Setter Property="CommandParameter" Value="{Binding Value}"/>
                </Style>
            </Menu.ItemContainerStyle>
            <Menu.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type local:MainMenuModel}" ItemsSource="{Binding Path=Children}">
                    <TextBlock Text="{Binding Text}"/>
                </HierarchicalDataTemplate>
            </Menu.ItemTemplate>
        </Menu>
        <ContentControl prism:RegionManager.RegionName="ContentPage" Grid.Row="1" />
    </Grid>
```
システムを起動した直後は、`GlobalMenu`は`null`なので、LogicalTreeには何も無い。Bindingによって、`GlobalMenu`に値がセットされると、階層構造に従ったメニューが構成されます。`HierarchicalDataTemplate`がそれで、値をバインドすればこういうメニューが作られます。

```
├── メニューA
   ├── メニューA1
   ├── メニューA2
   ├── メニューA3
├── メニューB
   ├── メニューB1
   ├── メニューB2
   ├── メニューB3
├── メニューC
   ├── メニューC1
   ├── メニューC2
   ├── メニューC3
```

この「メニューA1」等をクリックしたくて、試行錯誤したコードがこれ。

```c#
    [TestClass]
    public class MenuTest
    {
        private WindowsAppFriend _app;
        private WindowControl w;

        [TestInitialize]
        public void TestInitialize()
        {
            var path = System.IO.Path.GetFullPath("hoge.exe");
            _app = new WindowsAppFriend(Process.Start(path));
            w = _app.FromZTop();
        }
        [TestMethod]
        public void Testメニュー開け()
        {
            AppVar main = _app.Type<Application>().Current.MainWindow;
            var globalmenu = main.VisualTree().ByType<MenuItem>(); //Countすると3
            new WPFMenuItem(globalmenu[0]).EmulateClick(); //メニューAがクリックされる
            var uuum = globalmenu[0].visualTree().ByType<MenuItem>().Count; //これが０になるのが辛い
        }
    }
}
```
親のメニュー(メニューA,メニューB,メニューC）は、`VisualTree`を辿ったら取れるのに、子供の`Menu`が取れないのはなんでなんだろう。

とりあえずなんですけど、VMから直接コマンド飛ばして逃げたが、良くないねこれは。

```cs
var hoge = main.Dynamic().DataContext;　//MainViewModelのVM
hoge.NavigateCommand.Execute("Page1");
```

### キーイベント関係をどうしよう

ボタンを押すサンプルが転がっているが、キーイベント関連があまりなかった。
このコードで出来たんだけど、いいのかな。何か間違ってないよね。

```c#
System.Windows.Forms.SendKeys.SendWait("{ENTER}");
```

- テキストボックスのReturnキー押下
- モーダルで上げたWindowのボタン押下
- DataGridのセル内キーイベント押下と右クリック
- DataGridにチェックを付ける

コードでUIが操作できると楽しいので、がんばる。
flutter build apk --release だけ Could not resolve all files for configuration ':releaseRuntimeClasspath'.エラー

flutter build apk --releaseのときだけ、以下のエラーが出てapkが作れない問題でハマりました。

```
FAILURE: Build completed with 2 failures.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':generateReleaseRFile'.
> Could not resolve all files for configuration ':releaseRuntimeClasspath'.
   > Could not find com.google.firebase:firebase-bom:25.12.0.
     Searched in the following locations:
       - https://storage.googleapis.com/download.flutter.io/com/google/firebase/firebase-bom/25.12.0/firebase-bom-25.12.0.pom
       - https://storage.googleapis.com/download.flutter.io/com/google/firebase/firebase-bom/25.12.0/firebase-bom-25.12.0.jar
     Required by:
         project :
   > Could not find com.google.firebase:firebase-core:.
     Required by:
         project :
   > Could not find androidx.annotation:annotation:1.1.0.
     Searched in the following locations:
       - https://storage.googleapis.com/download.flutter.io/androidx/annotation/annotation/1.1.0/annotation-1.1.0.pom
       - https://storage.googleapis.com/download.flutter.io/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar
     Required by:
         project :

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':javaPreCompileRelease'.
> Could not resolve all files for configuration ':releaseCompileClasspath'.
   > Could not find com.google.firebase:firebase-bom:25.12.0.
     Required by:
         project :
   > Could not find com.google.firebase:firebase-core:.
     Required by:
         project :
   > Could not find androidx.annotation:annotation:1.1.0.
     Required by:
         project :

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================

* Get more help at https://help.gradle.org

BUILD FAILED in 2s


The plugin firebase_core could not be built due to the issue above.

```

# 解決方法
[Stackoverflow](https://stackoverflow.com/questions/62720395/flutter-release-apk-error-execution-failed-for-task-applintvitalrelease)を参考に、`flutter build apk --profile` を一度実行すると、 `--release` でもビルドできるようになりました。

謎い

# 追記：本当の解決方法
gradleを4.1.0から3.5.0にしたら解決しました。
使っていたFlutter 1.22.2 で新規プロジェクトを作成したら3.5.0だったので、どうやら安易に変更してはいけないようです。

```
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}
```
ExcelVBAで表に一括で〇×をつける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/ee5ef25e-439f-67a7-0bdd-ad67935bbaf2.png)

これは[Excelの名簿から一括でメール配信やFAX送付状を作るVBA](https://qiita.com/nobody_gonbe/items/3b4f9024aa702bab7b13)の各コードを細かく解説したものです。
完成品は[こちら](https://github.com/NobodyGonbe/EMAIL-from-Excel)のGitHubからダウンロードできます。

##表に一括で〇×をつける

A4からテーブルの最後まで一つずつ文字を入力していく

##コード解説
```VB
Sub 全許可()
    '(4, 1)のセルから縦に1つずつずらして〇を入れていく
    Dim columnCountTrue
    For columnCountTrue = 4 To Cells(Rows.Count, 1).End(xlUp).Row
        Cells(columnCountTrue, 1).Value = "〇"
    Next
    
End Sub

Sub 全不可()
    '(4, 1)のセルから縦に1つずつずらして×を入れていく
    Dim columnCountFalse
    For columnCountFalse = 4 To Cells(Rows.Count, 1).End(xlUp).Row
        Cells(columnCountFalse, 1).Value = "×"
    Next
    
End Sub
```

上から順に解説していくと
・columnCountTrueで〇をつけたい行数をカウントする
・columnCountTrueは4～最後の行数までカウントアップする
・Cell(4, 1)の値に〇を入力Cell(5, 1)の値に〇...Cell(最後の行, 1)に〇
・最後の行まで行ったら終了


・Sub 全不可（）も同じ要領で×を入力していく

##ボタンにマクロを設定
・挿入→図形より適当な図形を配置
・配置した図形を右クリックしマクロを登録で作成した全許可or全不可を選択
【Rails】Routing設定について

<h1>本投稿の目的</h1>
・Rails学習の議事録です。

---
<h1>学習に使った教材</h1>
Udemyの以下2つの教材を参考にまとめました。
・["はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/) 
・["フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座"](https://www.udemy.com/course/rails-kj/)

---

<h1>○RESTfull</h1>
・HTTPメソッドにそってWebのリソースを設計する設計思想
・RailsのRouting設定はこの思想を表現したようなもの

**【HTTPメソッド】**
・GET　　リソースの取得
・POST　リソースの作成
・PATCH/PUT リソースの更新
・DELTE　リソースの削除

<h1>○Routingとは?</h1>
以下の①~④を指定する設定

①どのHTTPメソッドで
②どのurlへアクセスした際に
③どのcontrollerの
④どのアクションを実行するか

<h1>○Routing設定方法</h1>
・/config/routes.rb　を開く
・このファイルを編集することでrouting変更が可能
*(rails g controller アクション名で記述したroutingが自動記述済み)

<h3>【rootの設定】</h3>
・urlに"/"でアクセスした際のrouting設定
・以下を記述 (*アクション名は"#"で記載することに注意)

```ruby:qiita.rb
root 'controller名#アクション名''
```

**【例:rootでquestions controllerのindexアクションを実行したい場合】**

```ruby:qiita.rb
root 'questions#index'
```

<h3>【書き方①】</h3>
・HTTPメソッドでPrefix_pathのurlへアクセスするとtoo以降のcontrollerでアクションを実行
・という設定を意味する
・以下を記述 (Prefixの部分は _pathを除くことに注意)

```ruby:qiita.rb
HTTPメソッド 'Prefix(_pathは除く)', too: 'controller名#アクション名'
```

**【例:boards controllerのnewアクションを想定】**

```ruby:qiita.rb
get 'boards/new', too: 'boards#new'
```

<h3>【書き方②】</h3>
**【基本的な記述】**
・Railsでdefaultで設定された分のroutingが自動で設定可能
・以下を記述

```ruby:qiita.rb
resources :controller名
```

**【応用的な記述】**
・指定したアクション名のみをroutingで設定可能
・以下を記述

```ruby:qiita.rb
resources :controller名, only: [:アクション名1, :アクション名2]
```

**【例:questions controller を想定】**
・questions controller のindex,create,new,showに関連するroutingのみ自動設定

```ruby:qiita.rb
resources :questions, only:[:index :create :new :show]
```

<h1>○Routing確認方法</h1>
**【確認方法①(ターミナル)】**
・ターミナルに以下を記述

```
rails routes
```
**【出力結果】*
・今回は 【例:questions controller を想定】 の条件下での場合の出力結果

~~~
      Prefix  Verb   URI Pattern                      Controller#Action                                                                                      
    questions GET    /questions(.:format)             questions#index
              POST   /questions(.:format)             questions#create
 new_question GET    /questions/new(.:format)         questions#new
     question GET    /questions/:id(.:format)         questions#show
~~~

**【解説】**
・Prefix_pathで定義されたurlへアクセスした際に,それぞれのcontrollerのアクションを実行する
・これらは,routes.rbで設定したため作成された設定である

**【確認方法②(Webブラウザ)】**
・/rails/info/routes のpathにアクセス
・設定済みのルート情報を確認
VSCodeの大文字小文字ショートカット

# 概要
- VSCodeのデフォルトの大文字小文字の変換が不便
- Atomで使っていた変換が直感的で使いやすいのでおすすめしたい
- 個人的に忘れた時用の忘備録

## 利点
- 直感的な入力で大文字小文字を変換できる
    - cmd+k(key)の後に大文字化ならcmd+u(Uppercase)、小文字化ならcmd+l(Lowercase)を押せば良い
- デフォルトのショートカットを上書きしない

## 欠点
- 同時に押すキーは少ないが2アクション必要になってしまう

## 手順
1. `cmd+p`を押して`keybindings.json`を開く
1. 以下の`[]`の中身をコピペする

```json
[
    {
        "key": "cmd+k cmd+u",
        "command": "editor.action.transformToUppercase",
        "when": "editorTextFocus"
    },
    {
        "key": "cmd+k cmd+l",
        "command": "editor.action.transformToLowercase",
        "when": "editorTextFocus"
    }
]
```
ExcelVBAで表に行を追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/d119517a-eb28-693a-3daf-3ef027ecf327.png)

これは[Excelの名簿から一括でメール配信やFAX送付状を作るVBA](https://qiita.com/nobody_gonbe/items/3b4f9024aa702bab7b13)の各コードを細かく解説したものです。
完成品は[こちら](https://github.com/NobodyGonbe/EMAIL-from-Excel)のGitHubからダウンロードできます。


##表形式を使用した表に行を追加する
エクセルには最初からテーブルという機能があり。これを利用するといろいろ便利な表が簡単に作れる。挿入タブのテーブルから利用することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/fd474bd2-44ce-f531-78af-c9369ed57f0d.png)
テーブルでは行を追加したときに前の行の計算式や書式設定が受け継がれる他、計算式でB4:B10などと設定していたところが[No.]という形で使用でき、表内のデータが増えても計算式を変更する必要が無いなどの便利な機能がある。

この表に行を追加する機能を作成しボタンに機能を割り当てる。



##コードと解説

下記のコードは表の下に何か文字が入ると勝手に表が拡張される機能を使用している。

```VB
Sub 新レコード追加()

    ' 挿入したい箇所のセルを選択
    Dim lastCell As Long
    lastCell = Range("A3").ListObject.ListColumns(1).Range.Count
    Range("A3").ListObject.ListColumns(1).Range(lastCell + 1).Select
    
    ' アクティブなセルをRange表記に変換
    Dim newCell As Range
    Set newCell = ActiveCell

    '配信可否の初期値を入力する
    newCell.Value = "×"
    
    
    ' 通し番号を振る
    newCell.Offset(0, 1).Value = newCell.Offset(-1, 1) + 1

End Sub
```

上から順に説明していくと
・表の最後のセルを取得したいので最後のセルを宣言
・最後のセルはA3から始まるリスト（表）のカウント数と同じ
・最後のセル＋１の場所を選択
▼イメージ

| A | B | C |
| --- | --- | --- |
| A1(1) | B1(2) | C1(3) |
| A2(4) | B2(5) | C2(6)(lastCell) |
| lastCel + 1 |  |  |

（表形式のセルの数え方と通常のセル選択方法が違うためSelectしたセルをRange表記に変える必要がある）
・newCellをRangeとして宣言
・newCellは現在選択しているセル
・necCellに初期値×を入力（初期値はなんでもよい。今回は×を初期値として入力したかった）
・newCellから見て(0, 1)一つ右のセルに通し番号を振る。通し番号はnewCellから(-1, 1)のセルの値+1


##ボタンへの割り当て
挿入→図形→適当な図形を配置する。
作成したボタンを右クリックし、マクロの登録をクリック。
新レコード追加を割り当てる。