OmniAICreator/Qiita-1.07M huggingface dataset:
Automatorのワークフローをcalender.appを使わずに定期実行する

# Automatorのワークフローをcalender.appで定期実行する際の課題

- Automatorのワークフローを定期実行する場合、通常calender.appを利用する。
- しかし、Macのcalender.appは非常に不安定（調子が悪いと実行されなかったりする）、かつ毎時間実行させたい場合などに設定が煩雑になる。
- 対策として、Macではlaunchdという定期実行の仕組みがあるのでこれを利用することで解決できる。
- launchdの登録は、LaunchControlというGUIツールが非常に便利。
- 言いたいことは以上で、あとは蛇足。

# launchdとは
- OSXにおいて、cronに変わってジョブ管理する仕組み。
- Windowsにおけるタスクスケジューラーのように、OSレベルですべてのジョブを監視しており、非常に堅牢。かつ柔軟に設定が可能。

# launchdの基本的な使い方
## 基本的な使い方
- .plistというファイルをxml形式で記述
- ```launchctl load ~/Library/LaunchAgents/xxxxx.plist```でlaunchdに登録

## 課題
- xmlで記述が必要かつ書式を覚えなくてはならず面倒
- かんたんに利用したい場合は、[LaunchControl](https://www.soma-zone.com/LaunchControl/)というGUIで登録できるツールが利用できる
- 以下はLaunchControlを利用した登録方法


# LaunchControlでのAutomatorの登録方法
1. まずAutomatorのワークフローを.Appでアプリとして登録

2. LaunchControlにて、```/usr/bin/open -W 登録したいアプリのパス```でプログラムを指定

3. あとは定期実行のインターバルを指定すればOK
10秒からインターバルで指定できる他、毎月、毎週、毎日、毎時等細かく指定が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117937/433bef42-e202-86db-234d-1f11e7a42d74.png)

以上

# ひとこと
- Automatorのワークフローはcalender.appで定期実行していたが、ちょっとPCで重い処理を行っていると、指定した時間に始まらなかったりして非常に困っていた。PCのスペックによる？
- .appのアプリを指定する方法がすぐにわからずハマった。参考のlaunchd.infoドキュメントを読み解いて解決

# 参考

https://dev.classmethod.jp/articles/instance-reminder/

https://www.launchd.info/

https://hawksnowlog.blogspot.com/2019/02/launchd-is-like-a-crontab.html
GASでBitly APIを使用してURLを短縮URLに変換

## Bitlyのアカウント作成
今回は無料プランのアカウントを作成します・
[bitry](https://bitly.com/)のサイトに移動し`Sign up Free`をクリック

https://bitly.com/

![bitry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/8c67ce57-0f7b-2f60-619a-d3b23ab65bb6.png)

画面が移動したら下にスクロールしてFREEの`Get Started`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/66e0953b-2a0b-cf57-ad0c-7bac081f3486.png)
![bitry_free.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/d7e64a87-f36f-0be3-f217-5aae804d8eee.png)

GoogleアカウントかUsername、Emal address、Passwordを入力してサインアップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/5ded777b-3b5f-e2b7-edf6-ed1c77ffe563.png)

リンクを仕事か個人か両方で使うかを聞かれます。使用目的で選んでください。
`Skip this step`をクリックで未回答でも大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/b2330495-e596-bb94-a2cd-aa1d9d98cf49.png)

登録したメールアドレスに認証用のメールが来ます。`VERIFY YOUR EMAIL`をクリックして認証してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/8a23c60a-f979-de40-55b0-c5b643fc7365.png)

これでBitlyのアカウントは作成できました。

## AccessTokenの取得
右上の`アカウントボタン`をクリックして、`Group Settings` → `Advanced Settings` → `OAuth` → `Generic Access Token`をクリック
![bitry_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/5f8c7aad-2cd3-1f56-8aad-2dd4973c7225.png)

パスワードを入力して`GENERATE TOKEN`をクリック
![bitry_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/46ba84e2-55cb-8ee2-6b2b-de0cc46b2545.png)

ACCESSトークンが表示されます。COPYでクリップボードにコピーされます。
![token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/b0ca4f89-34d0-d238-0b5b-2a2238b6cf01.png)

## GASの記述

`longUrl`と`acccessToken `は書き換えてください

``` js:GAS
function fetchShortUrl() {
  const apiUrl ="https://api-ssl.bitly.com/v4/shorten";
  const longUrl ="https://www.sample.com/foo/bar";
  const acccessToken = "***********";
  const payload = {
      long_url: longUrl
    }

  const data ={
    headers: {
      Authorization: `Bearer ${acccessToken}`,
      "Content-Type": "application/json"
    },
    method: "post",
    payload: JSON.stringify(payload)
  }
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, data));
  console.log(response.link);
}
```

## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px"></a>
Rosegarden で MIDI ファイルを演奏する

(夏休み企画 5/20)

# Rosegarden
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3bb8ba79-f14e-0007-4501-4da1dad17829.png)


MIDIシーケンサをベースとした、楽曲作成編集/シンセサイザ/ミキサーなどの機能を備えた Linux 用 OSS。

今回はこれを使って MIDI ファイルを演奏してみる。

# 環境

- Ubuntu 20.04 LTS
- Rosegarden Version 19.12
- VMPK

# インストール


```

$ sudo apt install rosegarden
```
# 起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e20be9c4-4354-7c9d-145e-609d3e1cfb17.png)

# MIDIファイル読み込み

「ファイル(F)」-「インポート(I)」-「Import MIDI file...」
で .mid ファイルを指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/65817a74-2e97-d8be-735b-3beb8dd239ba.png)

プレイしても音が出ない



# 音源を用意
安直にVMPKを使用。
cf.,「MIDI 仮想キーボードと物理キーボードを Ubuntu で試す」
https://qiita.com/nanbuwks/items/055cffd9beb2caf4acb0

VMPK の 「Edit」 - 「MIDI Connections」  で以下のようにすると音が鳴った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a0b43b31-5f7b-d9e9-9c55-10c9dd61b70a.png)

rosegarede:1 rosegarden:2 rosegarden:3 と選べるが、 rosegarden:3 を選ぶ必要があった。


# プレイパラメーターをいじって遊ぶ

「表示」-「トランスポートの表示」で視聴に便利な操作インターフェースが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/94f698ef-2ae7-76a5-b47e-8262ad8f43aa.png)

メイン画面の水色ボタンで、MIDIチャンネルごとのプレイON/OFFを行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3cad4a9f-f053-8627-470b-39b72dbcf3ef.png)

「スタジオ」-「MIDIミキサ」で、MIDIチャンネルごとにボリュームなどを操作できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c20f629b-4077-18c7-7f4f-a78d40d2c261.png)

メイン画面でチャンネルをダブルクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/87b576a4-4fe6-7c70-6b32-81731b9588e0.png)

該当チャンネルが音符で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2f3501ce-99bc-fad3-95ba-2e636ce2e7e8.png)

チャンネルを右クリック→「マトリクスエディタで開く」と、SongMaker のような形式で表示されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6a1b3f09-0e2c-22a9-287b-9904f2c23c43.png)

「コンポジション」-「テンポ設定の追加」で速度を調整できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6fea39e3-b6e0-c3f3-d445-9a50d56a2b1f.png)
vscode 保存時の自動インデント（フォーマット）調整

ショートカットキー　command + , で以下画面が表示されます。
検索欄に　format On と入力
（設定から開いても可）

![スクリーンショット 2021-08-08 11.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309901/6f19ba55-733d-516b-5bd6-a0b17ef81d5c.png)


以下のように表示されるので、
Editor: Format On Save にチェックを入れれば保存時に自動でインデントが調整されます。
![スクリーンショット 2021-08-08 11.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309901/dee2b018-f09d-6195-dffc-c9624cbce3ae.png)
Dockerが「error during connect: Get http://%2F%2F.～～」エラーを出したときの対処法。

# 事象
Dockerを触ろうとコマンドを打ったら下記のようなエラーが...

```docker
C:\Work>docker ps -a
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/containers/json?all=1: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
```
昨日まで普通に動いていたんだけどな...と思いエラーメッセージを読んでみるとどうやらdocker daemonが起動していないっぽい？？

# 対処法
ということで確認のためにDocker Desktopを立ち上げます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/b82f0333-5471-d0a0-472d-e88f0a47239e.png)

するとこんなダイアログが。
やはりサービスが起動していなかったんですね(;´∀｀)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/0c452ca2-bd24-7df5-579f-4246f3e30bdd.png)

「Start」をクリック。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/c615587d-9f3f-c877-4562-127e7105e26d.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/3c0986f0-9df2-d0c2-889d-4519ed42dcea.png)

Dockerが起動し、動いているメッセージが届いたので再度Dockerのコマンドを打ってみます。

```docker
C:\Work>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

動いていることが確認できました！
JavaScript　真偽値　比較演算子　条件式組み合わせ

JavaScriptの学習の備忘録と振り返りの記事です。
何かの参考になれば幸いです。
付け足しや訂正などある場合ご教授いただけると
大変嬉しく思います！！

###真偽値
条件式が成り立つか成り立たないのかを示す出力結果
`成り立つ場合「true」`、`成り立たなければ「false」`になる

###比較演算子
<details><summary>`大小比較`</summary>
a `<`  b: aよりbが`大きい`
a `<=` b: aよりbが`大きい`または`等しい`
a `>`  b: aの方がbより`大きい`
a `>=` b: aの方がbより`大きい`または`等しい`
</details>

または
<details><summary>`左と右の値が等しいかを調べる`</summary>
等しい場合　　　a === b 
等しくない場合  a !== b</details>
ときに用いる記号

###条件式の組み合わせかた
かつ『&&』 条件式Aと条件式Bが`両方`trueの場合成り立つ
または『||』　条件式Aと条件式B`どちらかのみ`trueの場合成り立つ

>JavaScript の && と || は、最後に評価した値になる
>ture判定/false判定 される値の種類が異なります。
>> false && true
false
> true && false
false
> true && true
true
> 'Hit' && 'Run'
'Run'
> false || true
true
> true || false
true
> 'Dead' || 'Alive'
'Dead'
業務50%カット!!『品切れとお天気調べて来ますAI』作ってみた!!

## 荷物抱えて毎日ビルの『1階～6階』２往復・・・
　黒〇ヤ〇トの話ではなく、私の勤めるスーパーのパートさんの日常です。
　6階には無人店舗があり、1階から補充に上がると、6階で持参商品以外の品切れ発見、
　もう一度補充に1階へ降りて、また上がって、時にはもう一回・・・
　<font color="Red">**スマホで簡単に今の品切れ商品を知れたらなぁ。。。**</font>

![無人現状.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/11e5416f-cc75-e17e-0e15-9616a932fc27.png)

## 『品切れ調べて来ますAI』作ってみた!!

　ブランチュールとトッポの簡易売場を再現。
　Teachable Machineに各品切れ状況を学習させ、Code-penで品切れ商品をブラウザに表示。
![cacheMessagep77870.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/5c488425-7dab-d7d6-2890-340e8e8ebba7.gif)

　CodePenからNode-REDに品切れ情報を送り、最新のお天気を添えてLINEで返信!
　「商品の売れ行き」と「今現在の天気・気温」は密接に関係しているんですよ♪
　補充商品を探しやすいように「〇〇番通路にあります」のメッセージも添えてみました。
![LINE_P20210808_01574032.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/e02f2566-f2b9-a689-ec19-efb3c696570d.gif)

## 業務50%カット!!　2往復➡1往復でOK!!

　事前にLINEで品切れ商品情報は把握しているので、
　<font color="Red">**1回の運搬で全商品を補充できるようになります!**</font>
![改善無人.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/1ec9580a-f71b-d156-ad7d-0d9c107aada0.png)

## 改善案あったら教えて下さい!(CodePen Node-RED公開)
### CodePen

https://codepen.io/okinakamasayoshi/pen/ExmOVPw

　<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExmOVPw" data-user="okinakamasayoshi" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/okinakamasayoshi/pen/ExmOVPw">
  2311day2</a> by okinakamasayoshi (<a href="https://codepen.io/okinakamasayoshi">@okinakamasayoshi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### Node-RED
![node-RED.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/8fc423f8-d89a-fbb0-ac18-2096ea27969e.png)

## 1階でも品切れしてる・・・をLINEメモで残しておこう!
　「6階でも1階でも売り切れてる」そんなときは「代替商品」を補充し、
　メモとしてLINE上で残せるようにしてみました。時間がある時に見返し、
　「よく売れているので商品増やしてね」と発注担当者に伝達できます。

![代替.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/26e5ece5-1498-5323-71d2-c85ccc22b199.png)

### Node-RED

![フォーム追加.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/95f6ecb9-13a1-18b4-6027-bf1b22a29f0b.png)

## 実際に利用してもらった結果インタビュー
 ①商品の場所は「〇番通路」という文字ではなく、フロアマップで画像表示してほしい。
 ②画面がいずれも殺風景なので、もうちょっとおしゃれな見た目にしてみては？
 ③<font color="Red">**楽になりそう！**</font>でも実際の売場で、多数の商品の中から1品ずつの品切検知できるの？
  　　 ➡今回の実験の2品でも背景色と商品の色が似ていると、検知が難しい場合があり、
　　  　実際の運用には壁がまだあだありそうですが、案を探りたいと思います！
![⑨.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/a97043a7-b067-6624-d5ea-bbdf9a49496b.png)
Flask jinja2でvueを使いたい

##概要
flaskで簡単なアプリを作る際にフロントをvueとvuetifyで描きたい。
webpackを使うほどでもなかったのでcdnを使った時のメモ

##問題
jinja2とvueのデリミタが一緒なのでどちらかを変更する必要がある
{{ message }}　　　<=これ
今回はvue側を変える

ちなみにflaskのデリミタを変える方法もあるらしい
参考：[ FlaskとVue.jsを組み合わせて使う](https://muunyblue.github.io/0b7acbba52fb92b2e9c818f7f56bac99.html)

## cssを読み込む

```html
<head lang="ja">
    <!-- vuetify-material-design-icon -->
    <link href="https://cdn.jsdelivr.net/npm/@mdi/font@3.x/css/materialdesignicons.min.css" rel="stylesheet">
    <!-- vuetify -->
    <link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
</head>
```
## jsを読み込む

```html
<body>
  <div id="hoge">
    (( message ))
  </div>
  <!-- vue -->
  <script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
  <!-- vuetify -->
  <script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
</body>
```
## vueインスタンス作成
デフォルトのデリミタ {{  }} を (( ))に変える

```js
var hoge = new Vue({
  el: '#hoge',
  delimiters: ["((","))"]
  data: {
    message: 'hoge'
  }
)}
```
【Mac】Ruby、Railsの環境構築について

# 概要

この記事では、MacでRuby、Railsを使用してアプリ開発をする度に必要となる環境構築の流れについて説明します。
なお、「Homebrew」と「rbenv」のインストールについては、アプリ開発をする度に必要となる作業ではないため本記事での説明は省略し、すでに「Homebrew」と「rbenv」のインストールが完了していることを前提に環境構築の流れを説明します。

# Ruby, Railsのバージョン

今回構築する環境は、以下のバージョンです。

- Ruby 2.6.6
- Rails 6.0.3.6

# Rubyの環境構築

### 「rbenv（アールビー・エンブ）」とは

複数のバージョンのRubyを管理することができ、簡単に切り替えることができるツールです。
例えば、1台のPCで複数のRailsアプリを作成する場合、アプリごとに使用するRubyのバージョンが異なることがあります。そういった場合に、rbenvを使用することでRubyのバージョンを簡単に切り替えることができます。

### 1. 現在インストールされているRubyの一覧を確認する

まず、現在インストールされているRubyのバージョンを確認するために、ターミナルで以下のコマンドを実行します。

```
$ rbenv versions
```

このコマンドを実行した際に、適用したいRubyのバージョン（今回であれば2.6.6）が表示された場合は、すでにインストールされているため、「4. Rubyのバージョンを適用する」に進んでください。

### 2. インストールできるRubyのバージョンを確認する

現在インストールできるRubyのバージョンを確認するために、ターミナルで以下のコマンドを実行します。

```
$ rbenv install --list
```

### 3. Rubyをインストールする

今回はバージョン2.6.6のRubyをMacにインストールしたいので、ターミナルで以下のコマンドを実行します。

```
$ rbenv install 2.6.6
```

インストールが完了したら、正常にインストールされているか確認するために、ターミナルで以下のコマンドを実行します。

```
$ rbenv versions
```

今回インストールした2.6.6が表示されていれば、正常にインストールが完了しています。

### 4. Rubyのバージョンを適用する

:::note warn
ここまでのコマンドはどのディレクトリで実行しても問題ありませんでしたが、ここから紹介するコマンドは実際に作業するディレクトリ上でコマンドを実行する必要がありますので、どのディレクトリにいるか確認しながら作業を進めてください。
:::

ターミナルでRubyのバージョンを適用したいディレクトリに移動し、現在そのディレクトリに適用されているRubyのバージョンを確認するために、ターミナルで以下のコマンドを実行します。

```
$ ruby -v
```

このコマンドを実行した際に、「ruby 2.6.6」と表示された場合は、すでにそのディレクトリにバージョン2.6.6のRubyが適用されているので、「Railsの環境構築」に進んでください。

このコマンドを実行した際に、「ruby 2.6.6」と表示されなかった場合は、バージョン2.6.6のRubyを適用するために、ターミナルで以下のコマンドを実行します。

```
$ rbenv local 2.6.6
```

※なお、``rbenv local x.x.x``の代わりに```rbenv global x.x.x```のコマンドを実行すると、全てのディレクトリでバージョン2.6.6のRubyがデフォルト値として適用されるように設定することができます。

このコマンドを実行した後に、ターミナルで以下のコマンドを実行します。

```
$ rbenv rehash
```

バージョン2.6.6のRubyが適用されていることを確認するために、ターミナルで以下のコマンドを実行します。

```
$ ruby -v
```

このコマンドを実行した際に、「ruby 2.6.6」と表示されれば、Rubyのバージョンを適用することができています。

# Railsの環境構築

### 1. 現在インストールされているRailsのバージョンを確認する

現在インストールされている（適用できる）Railsのバージョンを確認するために、ターミナルで以下のコマンドを実行します。

```
$ gem list rails
```

このコマンドを実行した際に、バージョン6.0.3.6のRailsが表示された場合は、すでにバージョン6.0.3.6のRailsがインストールされているので、「Railsアプリケーションの作成」に進んでください。

### 2. Railsをインストールする

今回はバージョン6.0.3.6のRailsをMacにインストールしたいので、以下のコマンドを実行します。

```
$ gem install rails -v 6.0.3.6
```

# Railsアプリケーションの作成

### 1. Railsアプリケーションを新規作成する

Railsでアプリケーションを新規作成する際は、`rails new アプリケーション名`のコマンドを使用します。
なお、アプリケーションを作成する際に、Railsのバージョンや使用するデータベースを指定することができます。

今回は、カレントディレクトリ上に、バージョン6.0.3.6のRails、データベースにMySQLを使用したアプリを作成することを例に、ターミナルで以下のコマンドを実行します。

```
$ rails _6.0.3.6_ new . -d mysql
```

※「.」はカレント（現在の）ディレクトリという意味です。

現在のディレクトリに適用されているRailsのバージョンを確認するために以下のコマンドを実行します。

```
$ rails -v
```

このコマンドを実行した際に、「rails 6.0.3.6」と表示されれば、バージョン6.0.3.6のRailsでアプリを作成できていることを確認することができます。

### 2. データベースを作成する

アプリケーションのデータベースを作成するために、ターミナルで以下のコマンドを実行します。

```
$ rails db:create
```

### 3. ローカルでRailsサーバを立てる

Railsサーバを立ててローカルでアクセスするために、ターミナルで以下のコマンドを実行します。

```
$ rails s
```

Railsサーバの起動後、Google Chromeなどのブラウザを開いてURL欄に「localhost:3000」と入力してアクセスすると、Railsサーバが起動していることを確認することができます。

なお、ターミナル上で「control + c」と入力すると、Railsサーバを止めることができます。

以上で、Ruby, Railsの環境構築は終了です。
"Assertion failed!" error while using CPlusPlus OP in TouchDesigner

# はじめに
TouchDesignerのCPlusPlus OPには`setupParameters`というメンバ関数を用いて，任意の変数をオペレータのプロパティに表示して実行時に変更することができる．
このメンバ関数の名前の指定に関して規則があり，試行錯誤が必要となったのでメモしておく．

# 変更前
速度の最大値としてFloat型の`maxVel`という名前の変数をプロパティに表示したい．
`.cpp`ファイルの`setupParameters`に以下の内容を記載した．

```
void
CPlusPlusDATExample::setupParameters(OP_ParameterManager* manager, void* reserved1)
{
	{
		OP_NumericParameter	

		np.name = "maxVel";
		np.label = "maxVel";
		np.defaultValues[0] = 1.0;
		np.minSliders[0] = -10.0;
		np.maxSliders[0] =  10.0;
		
		OP_ParAppendResult res = manager->appendFloat(np);
		assert(res == OP_ParAppendResult::Success);
	}
}
```

# エラー内容

ビルドは上手くいくものの，デバッグなどのTouchDesigner実行時に以下のようなエラーメッセージがポップアップで表示される．
メッセージの内容としては，`Expression: res == OP_ParAppendResult::Success`でAssertion failedが発生したようで，どうやら`.cpp`ファイルの`OP_ParAppendResult res = manager->appendFloat(np);`が失敗していることが原因の様．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/abdf74e1-418a-d117-658f-16ad874dcdd9.png)

# 変更後

試行錯誤の結果，`op.name`の名づけによってエラーが発生していることが分かった．
規則としては，一文字目のみを大文字のスペースを含まない文字列であればよいらしい．
変更前はC++を意識した変数名にしていたことがまずかったようだ．
また，`np.label`にはルールは無いようで，任意の文字列でよいので視認性を重視して変更した．

```
void
CPlusPlusDATExample::setupParameters(OP_ParameterManager* manager, void* reserved1)
{

	// speed
	{
		OP_NumericParameter	np;

		np.name = "Maxvel";               // 一文字目のみ大文字
		np.label = "Maximum Velocity";    // 表記は自由
		np.defaultValues[0] = 1.0;
		np.minSliders[0] = -10.0;
		np.maxSliders[0] =  10.0;
		
		OP_ParAppendResult res = manager->appendFloat(np);
		assert(res == OP_ParAppendResult::Success);
	}
}
```

# 実行結果

`np.name`の変更によって上記のエラーは回避できる．
実行結果として，変数の表示名として`np.label`が，pythonで呼ぶ際の変数名として小文字の`np.name`が格納される．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267183/f0237778-0b09-ec6c-d9a5-52e5ca062b54.png)
59日後にITパスポートを受けるFラン私大文系既卒(11日目)

# 基数
*　基数とは
 *　けたあがりの基準となる数

# 2進数⇨10進数
* 式
```math
各行の数字\times2^n
```

# 10進数⇨2進数
* やり方
 * 2で割ってその余りを並べる

# 10進数⇨16進数
* やり方
 * 16で割って余りを並べる

# 16進数⇨10進数
* 数式
```math
各行の数字\times16^n
```

# 論理演算
* 論理演算の演算子(6つ)
　* AND
　* OR
　* XOR
　* NOT
　* NAND
　* NOR

# スタック
* スタックとは? 
 * 最後に格納したデータを最初に取り出すデータ構造

# キュー
* キューとは？
 * 最初に格納したデータを最初に取り出す構造

# アルゴリズム
* アルゴリズムとは
 * 問題を解決するときの手順

# フローチャート
* フローチャートとは?
 * アルゴリズムの内容を視覚的にわかりやすく表した図
* フローチャートに出てくる記号(4つ)
 * 端子
 * 処理
 * 判断
 * 線

# トーレス表
* トーレス表とは?
 * フローチャートの順序に従って実際に計算を行い、それぞれの処理を実行する際の「変数の値」を書き出した表

# XML(EXtensible Markup Language)
* XMLとは?
 * 自分自身が定義したタグを使ってデータを記述するマークアップ言語
 * 用途はWeb上でデータを交換すること
[備忘録]SQLクエリまとめ④

今回は、データの挿入、更新、削除に関することのみを紹介します。

#INSERT

- テーブルにレコードを挿入する
- `INSERT INTO テーブル名(カラム名) VALUES(値)`

```sql:studentsテーブルにレコードを追加
INSERT INTO students(name, course)
VALUES("テスト太郎", "Ruby");
```

#UPDATE

- データを更新
- `UPDATE テーブル名 SET カラムを指定して値を代入 WHERE 更新するレコードのid`

```sql:studentsテーブルのデータを更新
UPDATE students
SET name = "ほげ美", cource = "Go"
WHERE id = 5;
```

#DELETE

- レコードを削除
- `DELETE FROM テーブル名 WHERE 削除するレコードのid`

```sql:idが10のレコードを削除
DELETE FROM students
WHERE id = 10;
```

#まとめ

データの更新、削除はWHEREで指定しないと、全てのレコードを更新、削除してしまうので、注意！
マインドセット: お客様のために仕事をする

「お金のために仕事をする」という気持ちでいると、
得られるお金が同じなら、ペナルティを与えられない程度にリラックスして仕事しよう、ということになりますね。

早く仕事を片付けても、その分、早く帰れるわけではない、ということであれば、
適当にダラダラ仕事をした方が、
気合いを入れて仕事を早く片付けて、その結果手持ち無沙汰になるより良い、ということになりますね。

まあ、それはそれで良いのですが...

「お客様のために仕事をする」という気持ちでいると、
限られた時間・予算の中で、最高の仕事をしよう、ということになります。
なぜなら、そのお金を「誰」に払うべきかとそのお客様が考えるとき、
「限られた時間・予算の中で、最高の仕事」をしてくれる人を選ぶからです。
つまり、次の発注につながります。

「お金のために仕事をする」という気持ちで仕事をして、
自分なりには「料金相当の仕事はした」という自負を持っていても、
ライバルが「お客様のために仕事をする」という気持ちで仕事をして、
「限られた時間・予算の中で、最高の仕事」をしてきたとき、
そのお客様は、次の発注をライバルにまわしてしまうかもしれません。

だいいち、「お客様のために仕事をする」方が、楽しいのです。
「お金のために仕事をする」という気持ちでいると、
その気持の背後に、
「相応のお金をもらえないなら、こんな仕事したくない」
という気分がすべり込んできます。
こういう気分がすべり込んでくると、
さまざまな「ひっかかり」の瞬間に、
「そこまで要求するなら、もっと金を払ってほしいよ」
という欲求不満が出現してきます。
これは、お互いにとって緊張関係の原因となります。

その点、「お客様のために仕事をする」と、
お客様の注文以上の仕事ができる。
お客様は直接、そこまでの注文をつけていなかったけれど、
しかし、この注文の本質を考えれば、絶対にこの方が良いはず！
というアイデアを盛り込んで、
お客様を良い意味で驚かせることができるわけです。

というわけで、おいらは「お客様のために仕事をする」のが好きなのです。

---

それで、エンジニアの場合、「限られた時間・予算の中で、最高の仕事」をサポートしてくれる道具は何かと言えば、以下のとおりです。

1. 基礎力（データ構造とアルゴリズムの的確な選択、シンプルな設計、メンテナンスしやすいコード、的確な命名）
2. 便利なライブラリ、フレームワーク、開発者ツールの活用
3. 高速なPC
4. 快適な仕事環境
5. 助けになる仲間
6. 活力（バイタリティ、モチベーション、コンディション）
7. 向上心
8. コミュニケーション能力
9. 洞察力
10. 基礎教養

これらを阻害している要因に気付いたときは排除し、これらを伸ばす方法に気付いたら積極的に生活に取り入れます。
python -m unittestでテストファイルが検出されない

# つまづいたこと

`python -m unittest`をコマンドで実行すると自動でunittestが書いてあるファイルを検出してテストを実行してくれるはずだったが、テストファイルが全く検出されなかった。

参考記事：[python.org - unittest](https://docs.python.org/ja/3/library/unittest.html)

# 解消した方法

テストが書いてあるフォルダに`__init__.py`を追加

## バグ解消前の階層

```
$ tree
.
├── server
│   └── index.py
└── tests
    └── test_index.py
```

## バグ解消後の階層

```
$ tree
.
├── server
│   ├── __init__.py
│   └── index.py
└── tests
    ├── __init__.py
    └── test_index.py
```

## 補足
`__init__.py`のファイルの中身は空でOKです。

## 結果

```
$ python3 -m unittest
.s
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK (skipped=1)
```

# `__init__.py`の役割とは？

今回、`python3 -m unittest`で検出されなかった理由は、testファイルが書かれているファイルのディレクトリがモジュール化されていなかったから。(unittestはモジュールの中にあるテストファイルを探す)

ディレクトリに`__init__.py`を追加することで、そのディレクトリがモジュール化されるらしい。

詳しいことは以下に書かれています。
[Python の __init__.py とは何なのか - Qiita](Python の __init__.py とは何なのか - Qiita)
JavaScript　条件分岐

JavaScriptの学習の備忘録と振り返りの記事です。
何かの参考になれば幸いです。
付け足しや訂正などある場合ご教授いただけると
大変嬉しく思います！！

##条件分岐とは
ある条件が成り立つ時だけある処理を行えるようにするもの

:::note warn
・セミコロンいらない『;』
・インデントで文字を揃える
:::
##種類と書き方
<details><summary>**if文・・・基本的な条件(yesになる条件)**</summary>
``if('条件式'){
　　'処理'
}``</details>

```js
const tiger = "white"

if(tiger === "white"){
   console.log("ホワイトタイガーが欲しいです");
}
```
**出力結果**
ホワイトタイガーが欲しいです</details>


<details><summary>**else if・・・『または』の条件（NOになる条件）**</summary>
if('条件式'){
　　'処理'
}``else if('条件式'){
　'処理'
}``
</details>

```js
const tiger = "black"

if(tiger === "white"){
   console.log("ホワイトタイガーが欲しいです");
}else if(tiger === "black"){
 console.log("黒のトラもいいけど白がいい");
}
```
**出力結果**
黒のトラもいいけど白がいい


<details><summary>**else・・・『どちらでもない』条件（その他に当てはまる条件）**</summary>
if('条件式'){
　　'処理'
}else if('条件式'){
　'処理'
}``else('条件式'){
　'処理'
}``</details>

```js
const tiger = "yellow"

if(tiger === "white"){
   console.log("ホワイトタイガーが欲しいです");
}else if(tiger === "black"){
 console.log("黒のトラもいいけど白がいい");
}else(tiger !== white){
 console.log("それは白くないです");
```
**出力結果**
それは白くないです


##switch文とは
ある値の時だけ処理を分岐する場合に用いる

:::note warn
・セミコロンいらない
・'1case'ごとに'１break'を必ず行う
・分岐の数だけ'case'がある
:::

##書き方と使い方
<details><summary>書き方</summary>
`switch(条件の値（変数や定数）){
　　case 値１:
　　　'条件の値'が'1'と等しい時の処理
　　break;
　　case 値2:
　　　'条件の値'が'2'と等しい時の処理
　　break;
　　case 値3:
　　　'条件の値'が'3'と等しい時の処理
　　break;
　　default:
　　　'処理'
　　break;
}`</details>


```js
const answer = "答え"
switch(answer){
   case "答え":
       console.log("正解！")
   break;
   case "不正解":
       console.log("ブーブー")
   break;
   case "ヒント":
       console.log("アンサーの日本語訳！")
   break;
}
```
**出力結果**
正解！
eclipse：TomCat入れ方（Mac版）


JSPのファイル名を小文字に統一したところサーブレットの方を修正しても
下記画像エラーが治らなくなった。

・プロジェクトをクリーン
・サーバーを再起動してクリーン
・eclipse再起動
でも治らない。

なのでTomCatを再インストールして初めから入れ直すことにした。


参考にしたサイト
https://itsakura.com/eclipse_tomcat

Tomcatをダウンロードするときに使うのはこの部分だけ。

![スクリーンショット 2021-08-08 8.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718337/120b8da8-1d91-62f6-4b93-19d0ff80a04e.png)


ーーーーー本題ーーーーーー


１、eclipseに入っているTomCatサーバーを消す
![スクリーンショット 2021-08-08 9.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718337/eb7e3e98-a29c-f796-7de6-b32cb75029e2.png)

２、eclipse→環境設定→サーバー→ランタイム環境
既存のTomcatを一度除去
![スクリーンショット 2021-08-08 9.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718337/75b8cf72-c8ae-3f8b-7590-a20cef2c478a.png)

３、ランタイム環境からもう一度TomCatを入れ直す（あらかじめダウンロードしておいたもの）
※このとき、参照できちんとファイルパスを設定していないと
新規サーバーを設定するときにこのTomcatは存在しないとエラーが出てしまいます。


４、新規サーバーを登録
好きなバージョンを選んで登録を行う。

ここまででサーバーの設定は完了。

次は実際にTomcatをプロジェクトファイルの中でビルドパスを使用して設定しないといけない。

１、プロジェクトを右クリック→ビルドパス→ビルドパスの構成

２、この画面出てくる→ライブラリーの追加
![スクリーンショット 2021-08-08 8.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718337/344a5545-7167-fab5-8bc2-46130aed9b33.png)

３、サーバーランタイムを選択
![スクリーンショット 2021-08-08 8.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718337/6202f663-711e-002f-c136-06be5006e15d.png)

４、Apache TomCat v8.5を選択（ここは自分が必要としているバージョンを選択する）
選択すれば次へ、を押せるようになるので押せば完了。
![スクリーンショット 2021-08-08 8.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718337/88717e07-671d-526e-f9e0-a7095861e836.png)

Tomcatの入れ方自体を忘れてすごく時間がかかってしまったのでメモ用に。

参考にしたサイト

https://www.qoosky.io/techs/8bf94e66bd
http://gametech.blog.jp/archives/5594827.html
findとsedを一緒に使うshellスクリプト

# 実現したいこと

- プロジェクトフォルダにある全ての`test_`で始まり`.py`で終わるファイルをfindで抽出
- findで抽出された`./server/sample.py`のPathを`server/sample.py`にsedで置換(`./`の部分を消す)

# 結論

```
find . -name '*.py' -name 'test_*' | sed -e "s/\.\///"
```
# 解説

## `find`の解説
findの後の`.`は探すディレクトリがカレントディレクトリであることを示す。
`-name`で探すファイル名の条件を指定できる（`-name`を追加していくとAND検索になる）
1つ目の`'*.py'`が`.py`で終わるファイル
2つ目の`'test_'`が`test_`で始まるファイル

## `sed`の解説
`s`はsコマンドは正規表現で置換処理をする宣言。
`"s/[置換前]/[置換後]/[オプション(任意)]"`となる

今回の場合は、
`[置換前]`の部分が`\.\/`を示している。
バックスラッシュ（`\`）は`.`と`/`にエスケープが必要なため入っている。

`[置換後]`の部分は無し。理由は今回は`./`の部分を消したいから。

`[オプション(任意)]`も今回はなし。

参考記事: (sed コマンド)[https://hydrocul.github.io/wiki/commands/sed.html]

# どう使えるのか？

`python3 -m unittest [テストファイルへのPATH]`で自動でプロジェクトフォルダ内の全てのユニットテストを実行したかった。

## 実際のシェルスクリプト

```py-test.sh
#!/usr/bin/env bash

# find all test files 
testFiles=($(find . -name '*.py' -name 'test_*' | sed -e "s/\.\///"))

# test each file
for file in ${testFiles[@]}
do
    echo "TEST: $file"
    python3 -B -m unittest $(echo $file)
    echo 
done
```

### 補足
`-B`は`pycache`を生成しないコマンドオプション
devcontainer + Terraform + Azure環境を可能な限り簡単に構築する

# 要約

1. コマンドパレット（Ctrl+Shift+p）から「Remote-Containers: Add Development Container Configuration Files...」を選択
2. 「Show All Definitions...」を選択
3. 「Azure Terraform」を選択
4. 「lts」を選択
5. 「OK」を選択（パッケージはデフォルトのまま）
6. コマンドパレット（Ctrl+Shift+p）から「Remote-Containers: Reopen in Container」を選択

Dockerイメージを落とすのに時間がかからなければ1分ほどで起動できる。

あとは、`.devcontainer\devcontainer.env`に環境変数を書き込んだり、`.devcontainer\devcontainer.json`にプロジェクト専用の拡張機能を入れたりするといいと思う。このあたりは起動時に読み込まれるので、変更したらReopenを忘れずに。

# 詳細

## コマンドパレットから「Remote-Containers: Add Development Container Configuration Files...」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/a23e61b8-4d53-28c2-6e05-351843c86326.png)

## 「Show All Definitions...」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/0629c7cd-68e4-e6ca-8c3b-1f721a2f040f.png)

## 「Azure Terraform」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/787d4cd3-861d-5790-47c9-1ac01968459f.png)

## 「lts」を選択

正直、どれでもいいと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/42ca76e7-c0f3-335c-3dba-bc5f88be9b09.png)

## 「OK」を選択（パッケージはデフォルトのまま）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/7638794c-e4cd-0905-51c3-430f245499c7.png)

## 起動する

### 画面右下の「Reopen in Container」から起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/28bb2380-13e6-1432-2873-0eb23561f912.png)

### コマンドパレット（Ctrl+Shift+p）から「Remote-Containers: Reopen in Container」を選択

`Remote-Containers: Rebuild and Reopen in Container`でも、`Remote-Containers: Rebuild Without Cache and Reopen in Container`でも、最初はキャッシュもビルド済みイメージもないので、ビルドして起動すると思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/d7875ab5-6872-fe20-6bae-854da60a560f.png)

# `devcontainer.env`

ちゃんとドキュメント読まずに始めちゃう症候群なので、こんなことができることは知らなかった。

ただ、ここに書いちゃうとsecretだだ洩れになっちゃうし、使いどころが難しいかも？

# `devcontainer.json`

下記の記事をみていて、`"ms-vscode.azure-account"`が足りていなかったので追加。でも、githubじゃない(azure devops)なので、pull requestな拡張機能は要れなかった。

- [環境構築: VS Code Remote Container で Azure + Terraform + GitHub Actions](https://qiita.com/hoisjp/items/3285c1b3e1fb49df711b)

あと、dotenvファイルのシンタックスハイライトをしたかったので`"mikestead.dotenv"`を入れてみた。

最終的にはこんな感じ。よく考えたら、いつも使ってるのが入ってないので、いろいろ弄るとは思う。

```json
	"extensions": [
		"hashicorp.terraform",
		"mikestead.dotenv",
		"ms-vscode.azurecli",
		"ms-vscode.azure-account",
		"ms-azuretools.vscode-azureterraform",
		"ms-azuretools.vscode-docker"
	]
```

# この後

あとはマニュアル通りにやれば大体は上手くいくと思う

ディレクトリでも作って、`.tf`ファイルに構成を入れて、コマンド群

```bash
cd tf/
# :
#ここでtf作る
# :

az login
# ちゃんとログインできると "id": "00000000-0000-0000-0000-000000000000"って行がある
az account set --subscription 00000000-0000-0000-0000-000000000000

terraform init
terraform plan
terraform apply
```

# 雑感

IaCが重要だということは分かっていて、でもAzure ARMとかで地獄を見たので、もう少し開発者フレンドりな書き方を探しているところです。

BicepとかPulumiとかも悩んだんですけど、まずは大御所からやっとこかと思った次第。ここからスタートです。

以上です。
SORACOM コンソールで サポート-> 問い合わせができない問題

メールで次のような案内を頂きました。

```text
相談室以外での技術に関するご質問は、 ユーザーコンソール右上の「サポート」ボタン内のお問い合わせよりサポートセンター宛にご連絡ください。
```

そこでコンソールで
![soracom_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/79b85e5d-755c-3675-88c8-136c50f236a3.png)

サポート -> 問い合わせ　とすすむと

```text
要求された操作を行う権限がありません。 ( COM0017 )
```

となりました。
![soracom_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d9a97b1b-8ca8-4a3b-3395-5c84d9109d40.png)
【Cygwin】SphinxにYoutube動画を貼る

# 1．背景
1. Youtube動画のある記事の内容を、練習のためにSphinxで再現しようとした。
1. 調べたとおりにYoutubeのSphinx拡張をインストールしたけど、上手くいかない。
1. どうも、Python3環境に対応していなさそう…

…と格闘していたが、解決したのでQiitaで共有。

# ２．環境
- Windows10/cygwin
- python3.8
- pip 21.2.3
    - 初回はcygwinからインストールし、以降はSphinxの更新時に警告に従って更新
- Sphinx 4.1.2

# ３．トラブル
```ModuleNotFoundError: No module named 'urlparse'``` というエラーになる。
## エラー内容
```
Running Sphinx v4.1.2
loading translations [ja]... done

Exception occurred:
  File "/usr/local/lib/python3.8/site-packages/sphinxcontrib/youtube/youtube.py", line 3, in <module>
    import urlparse
ModuleNotFoundError: No module named 'urlparse'
The full traceback has been saved in /tmp/sphinx-err-dylzzsxv.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
A bug report can be filed in the tracker at <https://github.com/sphinx-doc/sphinx/issues>. Thanks!
make: *** [Makefile:20: html] Error 2
```
## 原因
インストールするパッケージの間違い
（誤）sphinxcontrib.youtube（古い情報）
（正）sphinxcontrib.yt

他は調べた通りのやり方でOK

# ４．動画を貼るまで
## ①インストール
```bash
pip install sphinxcontrib.yt
```

## ②conf.pyの追記内容
```python
extensions = [
    'sphinxcontrib.yt', # youtube動画
]
```

## ③rstファイルの書き方
```rst
.. youtube:: {動画のID}
```

# ５．備考

```sphinxcontrib.yt``` の内容はそれほど複雑ではありません。
URLの解析を捨てればニコニコ動画やVimeoへの転用は割と楽にできます。

ざっくり要点を書いておきます。
- URL解析部分は捨てる。（挑戦するのも自由です）
- ifraceタグの内容をニコニコ動画やVimeo用の内容に差し替える。

# 以上
Array.prototype.reduce() の動作確認メモ

## 引数が Reducer のみの場合 ~ reduce(reducer) ~

| arrayの要素数(n) | reducerの実行回数 | 備考 |
|---------|------------|------------|
| n == 0  | -       | ❌ エラーがスローされる |
| n == 1  | n-1 (0) | `reducer`は実効されず、`reduce`の戻り値は **`array[0]` となる** |
| n >= 2  | n-1     | n == 2 の場合、引数`array[0]`, `array[1]`で 1 回実行される |

## 初期値も与えられている場合 ~ reduce(reducer, initialValue) ~

| arrayの要素数(n) | reducerの実行回数 | 備考 |
|---------|------------|------------|
| n == 0  | n (0) | `reducer`は実効されず、`reduce`の戻り値は **`initialValue` となる** |
| n == 1  | n     | `reducer`は 引数`initialValue`, `array[0]`で 1 回実行される |
| n >= 2  | n     | `reducer`は n 回実行される |

## 補足

以下の式は`true`となる

```js
[initialValue, ...array].reduce(reducer) === array.reduce(reducer, initialValue)
```

### 検証用スニペット1

```js
const h1 = (msg) => console.group(`%c${msg}`, `font-size: 1.5em;`);
const h2 = (msg) => console.group(`%c${msg}`, `font-size: 1.2em;`);
const countKey = "execute reducer"; let reducerの実行回数 = 0;
const reducer = (acc, val)=> {
  console.count(countKey); reducerの実行回数++;
  console.log({acc,val});
  return "accumulator";
}
const 検証 = (...reducerArgs) => (array) => {
  h2(`${JSON.stringify(array)} を検証`);
  let reduceの戻り値;
  try {
    reduceの戻り値 = array.reduce(...reducerArgs);  
  } catch(e) { console.error(e); }
  console.table({arrayの要素数: array.length, reducerの実行回数, reduceの戻り値})
  console.countReset(countKey); reducerの実行回数 = 0;
  console.groupEnd();
}
const a0 = "array[0]", a1 = "array[1]"

h1("引数が Reducer のみの場合");
const reducerのみの場合を検証 = 検証(reducer)
reducerのみの場合を検証([]);
reducerのみの場合を検証([a0]);
reducerのみの場合を検証([a0,a1]);
console.groupEnd();

h1("初期値も与えられている場合");
const 初期値ありの場合を検証 = 検証(reducer, "initialValue");
初期値ありの場合を検証([]);
初期値ありの場合を検証([a0]);
初期値ありの場合を検証([a0,a1]);
console.groupEnd();
```

### 検証用スニペット2
```js
const reducer = (a, b) => `${a} + ${b}`;
const initialValue = 1, array = [2,3];
console.assert([initialValue, ...array].reduce(reducer) === "1 + 2 + 3");
console.assert([initialValue, ...array].reduce(reducer)
                              === array.reduce(reducer, initialValue));

console.assert([1].reduce(reducer) === [].reduce(reducer,1));
console.assert([1,2].reduce(reducer) === [2].reduce(reducer,1));
```
【Ruby on Rails】Rubyで売上単価の計算結果を表示しよう


#対象者

* 売上の計算結果を表示したい方　
* どこに計算式をかけばいいのかわからない方


#目的

* 計算結果をViewに表示させること

#実際の手順と実例
###1.前提

* 商品の注文の合計額を表示します
* モデルはorder(注文)
* 注文詳細ページに計算結果を表示します


###2.モデルに記載

注文商品の計算結果を表示します。

````order.rb
def sum_of_order_price
    total_price + shipping
  end
`````
sum_of_order_priceで計算の合計額を定義し、
中でtotal_priceとshippingカラムを足し算します。
どちらのカラムもOrderモデルのカラムです。

かけ算にしたい場合は　*
割り算にしたい場合は　%
引き算にしたい場合は　-

をモデル内に記載すればOK！

###3.Viewでの表示設定

````order/show.htnl.erb
 <th>ご請求額</th>
 <td> <%= @order.sum_of_order_price %></td>
`````
@orderはorders_controllerで
@order = Order.find(params[:id])
と定義しています。


####投稿者コメント
計算が案外簡単に表示できて、嬉しかったので記事にしてみました。
直接Viewにモデルに記載したとおりに書いても動きました。

####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
アプリの左上に表示されるmsを非表示にしたい

#  rack-mini-profilerについて
railsを起動したときに画面の左上にmsという表示がされることがあるのですが、これは
`rack-mini-profiler`というgemがインストールされているから表示されているということがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1403010/3d7be657-f91d-3311-573a-8132a7ecf159.png)
このmsというのはサーバー側の処理の合計時間を示していて、クリックするとその内訳を見ることができます。サーバー側だけではなく、クライアント側の計測やsqlの処理なども確認することができます。
さて、これがあるとアプリのデザインがわかりにくいので非表示にしたいと思います。

```ruby:Gemfile
group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 4.1.0'
  # Display performance information such as SQL time and flame graphs for each request in your browser.
  # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md
  gem 'rack-mini-profiler', '~> 2.0' ←　これをコメントアウトします
  gem 'listen', '~> 3.3'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
end
```
`gem 'rack-mini-profiler', '~> 2.0'`をコメントアウトしましょう。
あとは`bundle install`をすればmsを非表示にできます。
時刻の表示の変更

こんにちは
今日は時刻の表示の変更について
メモしたいなあと思います。

# 最初にやったこと

![スクリーンショット 2021-08-07 11.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/59ceb52c-9030-f1f8-f2bd-56001b897d8d.png)

上の画像が実装前の表示です。

config/application.rb

```rb
config.i18n.default_locale = :ja
    config.time_zone = 'Tokyo'
```

config/locales/ja.yml

```rb
ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
```

```rb
<%= l.event.event_date %>
```

これを実行すると

![スクリーンショット 2021-08-07 16.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/0f48d773-6562-f2b0-5257-efc0633e3c3f.png)

んーなんか違うねんなー。

# 結局やったこと

実装前の画像。

![スクリーンショット 2021-08-07 11.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/ecc190f7-270b-064d-d3e5-109080a0bbed.png)

正直このUTCさえなかったらいいだけなんよなーと思ったので、
上記の実装全部やめて以下のようにしました。

```rb
<%= event.event_date.strftime("%Y年%m月%d日 %H:%M")  %>
```

![スクリーンショット 2021-08-07 17.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/ee86d16e-c568-c26b-64f2-7a7ae3439050.png)

こうなり割とイメージしてたような実装をすることができました。
Windows デスクトップアイコンが横長に表示される件の対処法

#状況
画像はほかサイトからのリンクですが、こんな感じになってしまったのでその対処法をメモっておきます。

![image](https://filestore.community.support.microsoft.com/api/images/ee0a42d0-fe88-46af-b87f-05cfbca0007a)

#解決法
### レジストリを戻す。
何らかの方法でデスクトップアイコンのサイズを設定しているレジストリに変な値が入ってしまって起こっている状況なのでそれを戻します。

検索欄でレジストリエディタを検索して開きます。

```
HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
```
を開いて、```IconSpacing``` と ```IconVerticalSpacing``` の値をもとに戻します。

Windows11 で確認したところ、以下の値がデフォルト値です。

| 名前 | 種類 | データ |
|:-----------:|:------------:|:------------:|
| IconSpacing | REG_SZ | -1500 |
| IconVerticalSpacing | REG_SZ | -1125 |

おそらく、データの値が3000とかになっていると思うので、それを直します。

:::note warn
レジストリの編集が終了したら、ログアウト、または再起動をしてください。
レジストリの値はログインしたときに適応されます。
:::

#参考

https://answers.microsoft.com/ja-jp/windows/forum/all/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83/2e617c06-d2f4-415d-b668-4fbfae8c5ad1
SQLで同一テーブル同士をJOIN(自己結合)して前日比較する

# 概要
日毎の売上実績テーブルを自己結合し、前日との売上比較を行うための SQL を紹介します。
実行環境は BigQuery を想定しています。

# やりたいこと
下記のような、item 毎に日毎の売上を記録したテーブルがあります。

|   dt  |  item  |  sales  |
|   ----  |  ----  |  ----  |
|  2021-01-01  |  A  |  100  |
|  2021-01-01  |  B  |  200  |
|  2021-01-02  |  A  |  800  |
|  2021-01-02  |  C  |  300  |
|  2021-01-03  |  A  |  800  |
|  2021-01-03  |  B  |  300  |
|  2021-01-03  |  C  |  1000  |

上記のテーブルを使い、item 毎に当日と前日の売上の差額を求めたいと思います。
つまり、下記のような抽出結果を求めることがゴールになります。

dt|item|sales|sales_1dayago|sales_diff|
----|----|----|----|----|
2021-01-01|A|100|0|100|
2021-01-01|B|200|0|200|
2021-01-02|A|800|100|700|
2021-01-02|B|0|200|-200|
2021-01-02|C|300|0|300|
2021-01-03|A|800|800|0|
2021-01-03|B|300|0|300|
2021-01-03|C|1000|300|700|

売上の変動を網羅的に把握するため、今回は前日には売上があったが当日は売上が0(元テーブルにレコードが存在しない)の場合や、前日は売上が無かったが当日は売上がある場合は集計結果に含めるようにします。

# テーブル定義
集計で使用する売上テーブルを下記の通り定義します。

```sql
CREATE TABLE
 qiita.item_sales
(
 dt DATE,
 item STRING,
 sales INT64
);

INSERT qiita.item_sales (dt, item, sales)
VALUES 
(DATE("2021-01-01"), "A", 100),
(DATE("2021-01-01"), "B", 200),
(DATE("2021-01-02"), "A", 800),
(DATE("2021-01-02"), "C", 300),
(DATE("2021-01-03"), "A", 800),
(DATE("2021-01-03"), "B", 300),
(DATE("2021-01-03"), "C", 1000)
;
```

# 自己結合を使って前日比較を行う
下記SQLで所望の結果が得られます。

```sql
/*
item_sales 同士 FULL OUTER JOIN することで item 毎の売上比較を行う
*/
SELECT
  IFNULL(is1.dt, DATE_ADD(is2.dt, INTERVAL 1 DAY)) as dt,
  IFNULL(is1.item, is2.item) as item,
  IFNULL(is1.sales, 0) as sales,
  IFNULL(is2.sales, 0) as sales_1dayago,
  IFNULL(is1.sales, 0) - IFNULL(is2.sales, 0) as sales_diff
FROM
  qiita.item_sales as is1
FULL OUTER JOIN 
  qiita.item_sales as is2
ON
  is1.dt = DATE_ADD(is2.dt, INTERVAL 1 DAY)  /* 何日前と比較するか */
  and is1.item = is2.item
WHERE 
  IFNULL(is1.dt, DATE_ADD(is2.dt, INTERVAL 1 DAY)) 
  BETWEEN '2021-01-01' and '2021-01-03' 
ORDER BY 
  1,2 
```

ポイントは大まかに下記2点です。

**1. item_sales 同士を JOIN する**
同じテーブル同士を JOIN し、結合条件で両者の日付を1日ずらすことで当日分と前日分の売上を紐づけています。
この書き方は応用が効きます。
`is1.dt = DATE_ADD(is2.dt, INTERVAL 1 DAY)` の部分を、例えば
`is1.dt = DATE_ADD(is2.dt, INTERVAL 1 YEAR)` と書けば、容易に昨年との比較を行うことができます。

**2. FULL OUTER JOIN**
前日、当日のどちらかしか売上が上がっていない item も集計結果に含めたいので、FULL OUTER JOIN で結合しています。
また、 IFNULL 関数を使い、結果が NULL だった時に 0 を返したり、もう片方のテーブルの値を返すようにしています。


# 参考にした書籍
[達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-CodeZine-BOOKS/dp/4798157821#detailBullets_feature_div)
ターミナルの導入方法

# ターミナルの導入
***ここではMacを前提で説明します***。

1.***画面左上のアップルマークのシステム環境設定***

2.***セキュリティとプライバシー***

3.***プライバシー***

4.***フルディスクアクセス***

5***左下の鍵マーク***

6**自分のPCのパスワードを指定 *鍵が開いたような状態***

7```+をクリック```

8***アプリケーションの中にユーティリティーがありその中にターミナルがある。***

9***Finderを開きアプリケーションの中のユーティリティを選択。その中のターミナルを右クリック。
情報を見るをクリックしRosettaを使用して開くにチェックがあることを確認。
*Rosettaを使用して開くの項目がない場合はM1チップ搭載されていないのそのまま進める。***

10 ***Launchpadの中からターミナルを選択し起動可能。***
[Play Framework] sbt.ResolveException: unresolved dependency:org.scalaz.stream#scalaz-stream_2.11;0.7a: not found について

# JCenterのCloseに伴う Play Framework の Build Error

Play Flamework で構成されたアプリケーションの改修に着手した際、下記のDependency Errorにより起動ができない状況でした。

> [error] (*:update) sbt.ResolveException: unresolved dependency:org.scalaz.stream#scalaz-stream_2.11;0.7a: not found

調査の結果、build.sbt 内で `scalaz` package の依存関係の取得元に指定されていた、Bintrayが5/1以降Closeしていたことに起因していました。

```scala
resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"
```
> BintrayのCloseについて(ブラウザで叩いても403が帰ってくる: http://dl.bintray.com/scalaz/releases)
> 5月1日のBintray、JCenter、GoCenter、ChartCenterのサービス終了について: https://jfrog.com/ja/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/

# 対応

今回エラーの原因になっている `org.scalaz.stream` package の バージョン `0.7a` は、 playframework内のテスト用package `specs2` が依存先となっているようでした。

playframeworkのバージョンを上げるか、playframeworkの内部を見て、`specs2` のバージョンを上げることで、依存先の  `org.scalaz.stream` のバージョンを上げるという対応は難しそうだったので、

`org.scalaz.stream` のみ、依存しているversionを上書きするという対応を取りました。

```scala
- resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"
+ dependencyOverrides += "org.scalaz.stream" %% "scalaz-stream" % "0.7.2"
```

> dependencyOverrides option について: https://www.scala-sbt.org/1.x/docs/Library-Management.html#Overriding+a+version
※ 0.7.2 以降であれば、Maven Central に packageがアップロードされているため、sbt が依存関係を解決する際に接続する Maven Central 参照時に依存関係を正常に取得できる。それ以前のversionは Maven Central にUploadされていない。(Imageは、Maven Central 内から取得できる `scalaz`)

![image (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287824/543be630-afd9-03dc-90cd-8ba01ba99733.png)

# 備考
sbtが依存関係を解消するときには参照順がある: https://takezoe.hatenablog.com/entry/20121201/p1
Nuxt.js×Vuetify×Firebaseでポケモン図鑑を作ろう！

<h2>はじめに</h2>
Nuxt.js×Vuetify×Firebaseでポケモン図鑑をSPA(Single Page Application)で開発していきます。
何回になるのかわかりませんが複数回に渡って実装の手引きを紹介します。

######ポケモン図鑑の機能は以下の通りです。（多いぞ笑）

・ユーザー認証（登録・ログイン・ログアウト）
・約900匹のポケモン一覧表示
・約900匹それぞれの個人ページ
・ポケモンをお気に入りに追加する
・ポケモンを手持ちに加える
・ポケモンをタイプで絞り込む
・ポケモンを名前で検索する
・種族値をグラフ化する
・自分の手持ちをタイムラインに投稿する
・他の人の手持ちをタイムライン表示する

※機能追加も可能性としてあります。

######この記事で学べること
・Vue.js, Nuxt.jsの基礎的な理解
・VuetifyによるUI設計
・Firebase Hosting によるSPAデプロイ
・Cloud Firestoreを用いたNoSQLデータベース設計
・Firebase Authenticationを用いたユーザー認証
・axiosを用いたAPI通信
・Node.js、fsモジュールによるJSON、オブジェクト操作の手法
・モダンJavaScriptによる検索機能実装
・canvasを用いたグラフ作成

######この記事のターゲット
・JavaScriptがあまり書けないのにVue.jsに取り組んでいる人
・Routerや状態管理ライブラリの理解が疎い人
・Firebaseを全般的に使ってみたいと思う人
・Node.jsはnpmやyarnでしか知らない人
・ECサイトを制作したことがない人

#####注意点
＊私自身も初学者なので全てを鵜呑みにしないこと！
Elixirのif文ワンライナー

#Elixirの勉強会 エリジョ に参加してきました。
・・・ジョではないですけど。（アバター美少女もいました）
https://elijo.connpass.com/event/218301/

使った資料は[コチラ](https://www.amazon.co.jp/プログラミング-Elixir-第2版-Dave-Thomas/dp/4274226379/ref=sr_1_2?dchild=1&keywords=elixir+本&qid=1628355443&sr=8-2)

私自身はRubyとRuby on Railsはそこそこやったことありますが、業務はjavaしか使ったことありませんし、Elixirはつい一昨日からはじめたばかりです。
昨年から名前だけは知ってたのですが・・・だってエリクサーとかフェニックスとか言われたら「えっ！？」って思うじゃないですか。思わないですか？？（完全回復できるなって）
他には関数型言語であるってことくらいしか知りません。オブジェクト志向となにが違うの・・・。

とりあえず、こういう勉強会自体初めてで楽しかったですし、また次回のイベントにも参加してもうちょっとElixirやってみたくなりました。
私のようなElixirド素人どころかプログラマーらしきことをあんまししてない初心者SEでも、女子ですらなくても受け入れていただけたので楽しく勉強できれば誰でもOKぽいです。

次回はこちら→ [Elixir女子部「エリジョ」 プログラミングElixir「第13章プロジェクトを構成する」しよう！](https://elijo.connpass.com/event/221551/)

# if文のワンライナーとキーワードリスト書き換え

[公式チュートリアル](https://elixir-lang.jp/getting-started/case-cond-and-if.html)より、以下のif文がワンライナーで書き換えできるとなっています。

```elixir
iex> if true do
...>   1 + 2
...> end
3

iex> if true, do: 1 + 2
3
```
で、あれ？？これって昼の勉強会でやった書籍資料でのマップの話ででてきたような・・・と試しにこんな書き方しても通ることがわまります。
うーん、なんとも見慣れないif文です。

```elixir
iex> if true, [{:do, 1 + 2}]
3
```
iexでヘルプを見てみるとしっかり `if/2` というマクロと定義されてて、引数２つ目にキーワードリストを使うと書いてあります、なるほど！上記の書き換えが可能なこともよくわかります。
下記（略）以降でワンライナーの書き方もきっちり出てきてます。
ちなみに`if`のあとの`/2` は引数を２つとるという意味で関数名の後ろにつけて関数を区別するもので、Elixirの説明では頻出する様子。

```elixir
iex> h if/2

                        defmacro if(condition, clauses)                         

Provides an if/2 macro.

This macro expects the first argument to be a condition and the second argument
to be a keyword list.
(略）
```

たとえば、if~elseについてもひとつのキーワードリストで扱えます。キーワードリストに書き換えてもちゃんとelseが評価されます。

```elixir
iex> if false, do: :this, else: :that
:that

iex> if false, [{:do, :this}, {:else, :that}]
:that
```

次に[公式チュートリアル](https://elixir-lang.jp/getting-started/case-cond-and-if.html)の以下の書き換えです。

```elixir
iex> if true do
...>   a = 1 + 2
...>   a + 10
...> end
13

iex> if true, do: (
...>   a = 1 + 2
...>   a + 10
...> )
13
```

が、こちらはどうもワンライナーではうまくいきません。`if/2`の第２引数としてキーワードリストとして受け取っている以上、なにか方法はありそうなものですが・・・。
たとえば単純に以下のような書き方をしても怒られます。まぁそりゃスペースでは無理ですよね。

```elixir
iex(1)> if true, [{:do, (a = 1 + 2  a + 10)}]   
** (SyntaxError) iex:1:29: syntax error before: a
```
いろいろ試してみましたが、いまのところの理解では難しそうです。

# まとめ
少なくとも単純なif文であればワンライナーで書けますよってとこで、よくある三項演算子みたいな感覚で使えばよさそうでしょうか。別にワンライナーじゃないと読みにくいってこともあんましなさそうだし趣味の世界な気もしますが、ちょっと発見が楽しかったってお話です。
/var/log 以下に cron, secure, message などのログがない場合

AlmaLinuxを最小構成でインストールした場合など
/var/log 以下に cron, secure, message などのログがない場合の対応

```
# dnf -y install rsyslog
# systemctl start rsyslog.service
# systemctl enable rsyslog.service
```

出力されていなかったログができていることを確認

```
# ls /var/log/
anaconda  btmp    cron             dnf.log      firewalld      hawkey.log  kdump.log  maillog   mysql    private  secure   sssd   wtmp
audit     chrony  dnf.librepo.log  dnf.rpm.log  freshclam.log  httpd       lastlog    messages  php-fpm  samba    spooler  tuned
```

cronなどが設定されていない場合は

```
# systemctl start crond.service
# systemctl enable crond.service
# systemctl status crond.service  # 確認
```
SACで数年分のファイルにフィルタをかけて保存

```bpall2.sh
#!/bin/bash

for i in {1..9}
do
    ./bpall.sh 190${i}
done

for i in {10..12}
do
     ./bpall.sh 19${i}
done

for i in {1..9}
do
    ./bpall.sh 200${i}
done

for i in {10..12}
do
     ./bpall.sh 20${i}
done

for i in {1..9}
do
     ./bpall.sh 210${i}
done

for i in {10..12}
do
     ./bpall.sh 21${i}
done
```
`bpall.sh`の中身


```bpall.sh

#!/bin/bash

#使い方
#例 10-20Hzのバンドパスフィルタ
#./bp.sh 2001 N.MMOH_U 10 20

lco=2
hco=30
st1="N.ATYH_U"
st2="N.HOJH_U"

for day in {1..9}
do
     echo "${1}0${day}"    
sac << EOF > /dev/null
r ${1}/${1}0${day}_${st1}.s
bp co ${lco} ${hco} p 2
sqr
w ${1}/${1}0${day}_${st1}_bp${lco}-${hco}_sqr.s
r ${1}/${1}0${day}_${st2}.s
bp co ${lco} ${hco} p 2
sqr
w ${1}/${1}0${day}_${st2}_bp${lco}-${hco}_sqr.s
q
EOF
done

for day in {10..31}
do
         echo "${1}${day}"
sac << EOF > /dev/null
r ${1}/${1}${day}_${st1}.s
bp co ${lco} ${hco} p 2
sqr
w ${1}/${1}${day}_${st1}_bp${lco}-${hco}_sqr.s
r ${1}/${1}${day}_${st2}.s
bp co ${lco} ${hco} p 2
sqr
w ${1}/${1}${day}_${st2}_bp${lco}-${hco}_sqr.s
q
EOF
done
```
直径約2mパラボラアンテナの解体

約25年前、HTML手打ちで自作機器のWEBサイトを作っていました。
Geocitiesで長らく公開＆放置していたのですが、Geocities廃止と共に消えてしまいました。
何かの役に立つと思うので、当時の内容を（多少修正して）QiitaにUPします。
今見るとずいぶんわかりづらいが追って修正します。
***
大昔、どこからか直径約2mのメッシュタイプパラボラアンテナを入手しました。
これを用いて海外の衛星放送を受信しようともくろんでいました
国内のSNG（当時はアナログ）は見ることができたのですが、海外の衛星放送視聴までにはたどり着きませんでした。
結局このアンテナは自宅の引っ越しのどさくさで処分してしまいました。
***
![ant01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/c36aa944-eb40-d9d9-81c9-5e6cd00a81ec.jpeg)
![ant02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/5de21a70-1d8e-a25c-5b35-12bf309c00f5.jpeg)
![ant03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/fbdc0a0e-64b0-4430-eb39-5e2d28667dae.jpeg)
![ant04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/0e7cde6f-4311-51d4-4021-bf074076bac7.jpeg)
![ant05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/43f689e6-4387-fbb7-4808-c62aca9931ff.jpeg)

![para.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255615/b6ecfbe4-6aa3-7f9a-9844-fbef140839d0.jpeg)
VSCodeのLiveShareでペアプログラミングしてみた

# 背景
友人とペアプログラミングをしてみたいと思ったので試してみることにしました。2019年の記事が多いので、今もちゃんと動くかという検証を兼ねて記事にします。(注: 数ヶ月寝かせてた記事です、途中までしか書けていません)

# 導入
## 使う拡張機能
https://visualstudio.microsoft.com/ja/services/live-share/

### インストール
URLを開いて、それぞれOKを押すだけ

### 招待リンクの作成
左のタブの一番下を選択して Githubでログイン

### 参加する
参加ボタンをクリック
終了するときは セッションの詳細の→の🚫をクリック

### LIVE SHAREのメイン画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/020cafc2-86d8-84f1-e578-6347dc9d9059.png)

Participantsが参加者
SharedServers: ローカルで起動しているサーバーを共有したいときに利用
SharedTerminal: ターミナルを共有したいときに利用
Comments: ファイルにコメントを付ける(謎)
チャットチャンネル: 名の通りチャットをしたいときに利用
AudioCall: 通話をしたいときに利用

### コード
現在開いているリポジトリが共有される

# やってみた感想
う～ん まぁ便利なのか? 普通のチーム開発ではあまり使わなさそう。
結局ペアプログラミングって言っても どっちかがコードいじってる間は
同じ箇所はあまり弄りたくないよね。

# 参考
https://qiita.com/mh4gf/items/8f072b2faabba90937d3

https://qiita.com/irico/items/b67328fdaa2d9a306cba

https://dev.classmethod.jp/articles/visual-studio-live-share-pairprograming/