OmniAICreator/Qiita-1.07M huggingface dataset:
SalesforcePlatformユーザでも商談作成、閲覧、削除ができる方法

<b>SalesforcePlatformユーザでどこまでできるか？<b>

Salesoforceには様々なライセンスがあります。

ざっくりした認識だと
Salesforceライセンス・・営業用、商談オブジェクトやケースオブジェクト、リードオブジェクトなどの作成、編集、閲覧、削除可能
SalesforcePlatformライセンス・・上記Salesforceライセンスより割安だが、商談オブジェクトやケースオブジェクト、リードオブジェクトの作成、編集、閲覧、削除ができない

という感じです。

しかしながら、本当にSalesforcePlatformライセンスは限定的な権限なのか？
どこまでできるのか？
今回はそれを検証します。

なお、今回登場するユーザは
山田一郎＝システム管理者（Salesforceライセンス）
田中太郎＝SalesforcePlatformユーザ
です

<b>①SalesforcePlatformユーザでも商談作成できる方法<b>
実はプロセスビルダーがあればSalesforcePlatformユーザでも商談作成が可能です。

作成されるプロセスビルダーはこんな感じです。
![商談プロセスビルダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e9d5282f-6f4c-644e-868d-5bd394a2fa74.png)

(起点となる条件はなんでもいいのですが、今回は取引先のチェックボックス[商談チェック]
にチェックが付くことを起点として商談作成のプロセスビルダーを設定します)

さあ、実際にSalesforcePlatformユーザでも商談作成ができるか確認してみましょう。
![商談03061.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1b11a560-db1b-ac3b-7afa-9eeb2f6e5dad.png)

「商談チェック」にチェックをいれて保存したら（事前に取引先オブジェクトに作成した商談の合計件数が自動計算される）積み上げ集計項目が「１」となりました。
（SalesforcePlatformユーザなので取引先の関連リストでは商談レコードはみえませんが）商談レコードが確かにできていることがこれで分かります。

<b>②SalesforcePlatformユーザでも商談情報が閲覧できる方法<b>

通常SalesforcePlatformユーザは商談の閲覧ができません。
しかしながら商談情報を確認する方法はあります。
主に
1.積み上げ集計項目を使用
2.ダッシュボードを作成。ダッシュボード参照のユーザを商談閲覧権限があるユーザ（Salesforceライセンス）ユーザにセットすることです。
ダッシュボードの設定はこちらです
![ダッシュボード03062.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d1d247df-01a3-4ef5-f84b-1750158b2b73.png)

さて、この設定のダッシュボードなら田中太郎（SalesforcePlatformユーザ）としても商談情報の閲覧ができます。
![ダッシュボードかくにん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b6d4dc70-9988-cb43-bae5-25405d23d3cd.png)

注意点としては、あくまで確認できるのはダッシュボードまでです。
こちら、「レポートの表示」を田中太郎（SalesforcePlatformユーザ）がクリックしたら下記のようなエラーがでるのご注意ください
![エラーメッセージレポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cb7d6fb6-bbf5-ccb9-2a84-77fd84554dbc.png)


<b>③SalesforcePlatformユーザでも商談情報が削除できる方法<b>

最後に削除についての説明です。
削除についてはフローを作成します。
今回は取引先の「商談削除」チェックボックスにチェックがついたらその取引先に紐づく商談は削除する　という設定を行います

フローはこんな感じ
![フロー全貌.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/85fb68c4-6298-50f5-9d01-67bb294ec76a.png)

フロー詳細はこんな感じ。結構簡単な作りでいけました。
![フロー詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/360e905b-85dd-1d25-e007-b2690b4161da.png)


<b>結論<b>

以上のようにSalesforcePlatformユーザでも
・商談作成はプロセスビルダー
・商談閲覧はダッシュボード
・商談削除はフロー
を使用すれば可能です。

しかしながら、実際に運用に落とし込むのは大変なので、やはり商談を日々使用するユーザにはSalesforceライセンスを割り当てるべきだと思いました。

例えば、限定的に商談情報を確認させる場合
（例：社内全体で今年は売上目標額に達するか？）などはダッシュボードを使用して商談を閲覧できるようにする。など、少し考えればより良い運用に結び付けられると思い、今回調査した内容を公開しました。





、
WordPress プラグイン関連のエラー対処メモ

追加していきます。

## "Undefined index: honeypot_cf7_req_msg_dismissed"

[Honeypot for Contact Form 7](https://wordpress.org/support/plugin/contact-form-7-honeypot/) を v2.0.2 にアップデートした後、WordPress 管理画面、Query Monitor で出たエラー。以下のページを参考に、Honeypot for Contact Form 7 の設定画面 (お問合せ > Honeypot) で "Reset to Defaults" ボタンを押すだけで解消できた。
[» Undefined Index notice filling error log | WordPress.org](https://wordpress.org/support/topic/undefined-index-notice-filling-error-log/)
【terraform】 slack の auth_token が設定できない時

## 概要

`google_monitoring_notification_channel` で `auth_token` の設定方法が分からなかったので、`2021/03/06` 現在で、設定ができた方法を残す。

## 手順

1. `新しく追加` をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320365/9ebde4f6-12a7-d82d-395d-004cc3786e28.png)

2. Slackワークスペース にアクセスする権限を `許可する`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320365/5ea31bfe-a925-f847-9328-4d21a6d55b45.png)

3. ネットワークログを確認し、`slack.com/api/auth.test` でフィルタリングする

```bash
Request URL: https://slack.com/api/auth.test?token=XXX
```

4. 上記のクエリパラメータ の `token` に対するバリューを `auth_token` として、`terraform` で設定する

```terraform
resource "google_monitoring_notification_channel" "default" {
  display_name = "インシデント通知"
  type         = "slack"
  labels = {
    "channel_name" = "#gcp-incident"
  }
  sensitive_labels {
    auth_token = "XXX"
  }
}
```
【Javascript】const、let、varの違い <基本>

Javascriptで変数を宣言するときに、const、let、varという宣言のためのものがある。
この違いを簡単にまとめておく。

## const 
constは再代入をすることができない。

```javascript
const title = "ゴリラ";
title = "おさるさん";
```
このようにすると、エラーとなってしまう。

## let
letは再代入をすることができる変数の宣言方法。

```javascript
let title = "さる";
title = "ゴリラ”;
title = "さかな";
title = "やまだくん":
```
このように何度でも再代入ができる。

##  var
varは同じ名前の変数を定義し、上書きすることができる.

```javascript
let title = "ゴリラ";

let title = "たろう”;
```
上書きされる。
Laravel SQL確認してN＋1問題考えてみよう！

#前書き

バックエンドたるものN+１問題しらんくてどうする？？っと言われたので、少し調べてみました。
正直、私のコードだめだめやん。って思いました。😭

#N+1問題とは？？

リレーションで繋がってるテーブル間でのデータを取得し、大抵の場合foreachでデータを回すと思うのですが。
データの取得方法が悪いと、foreachで回す度にクエリが発生しちゃうっていう問題です。（大ざっぱにいうと。）


###クエリが多いと何が問題なのか？
クリエの発行数が多いと`サーバーの負荷`になっちゃって`反応遅延`や、最悪の場合には`システムダウン`につながる由々しき問題なのです！

LaravelだとEloquentっていうものがある分、実際に発行されているクエリが見えないのでそこら辺が可視化されにくくなってます。
便利なものも考えものですな。


#実際に発行されるクエリを確認する方法。

下記のテーブルがあたっとします。

```:Database

>>Users table
　id |name|

>>Bbses table
 id | body |user_id |

>>Comments table
 id | comment | bbs_id |

※あとでUserテーブルからデータをとってforeachで回します。
その時のリレーションのイメージは [users->bbses->comments] ってな感じです。
```

たとえば、Userテーブルから５件データを取得する。

```php:UserController

public function index()
{
    $users = User::limit(5)->get();
    return view('user.index')->with('users', $users);
}
```

次に、viewでforeachを使って$users を回す。

```php:view
@foreach ($users as $user)  
<p>{{ $user->name }}</p>
<ul>
  @foreach ($user->bbses as $bbs)
  <li>{{ $bbs->body }}</li>
  <li>コメント数：{{ count($bbs->comments) }}</li>
  @endforeach
</ul>
@endforeach
```
すると下記のようなクリエが発行される。

```php:

select * from users limit 5
select * from bbses where bbses.user_id = 1
select * from comments where comments.bbs_id = 1
select * from bbses where bbses.user_id = 2
select * from comments where comments.bbs_id = 2
select * from bbses where bbses.user_id = 3
select * from comments where comments.bbs_id = 3
select * from bbses where bbses.user_id = 4
select * from comments where comments.bbs_id = 4
select * from bbses where bbses.user_id = 5
select * from comments where comments.bbs_id = 5
```

$usersからリレーションで繋がっている情報が取得されるたびにクリエが発行されていることがわかる。
このクリエの発行件数を少なくするために使用するのが`with`である。

#withを使ってクリエの発行回数を少なくしよう。

```php:UserController
public function index()
{
    $users = User::with('bbses')->limit(5)->get();
    return view('user.index')->with('users', $users);
}
```

```php:
select * from users limit 5
select * from bbses where bbses.user_id in (1, 2, 3, 4, 5)
select * from comments where comments.bbs_id = 1
select * from comments where comments.bbs_id = 2
select * from comments where comments.bbs_id = 3
select * from comments where comments.bbs_id = 4
select * from comments where comments.bbs_id = 5
```

う〜ん。なにやら、commentsテーブルの方がまだ多い。
こんな時は、`.（ドット）`を使う！


```php:UserController
public function index()
{
    $users = User::with('bbses.comments')->limit(5)->get();
    return view('user.index')->with('users', $users);
}
```
```php:
select * from users limit 5
select * from bbses where bbses.user_id in (1, 2, 3, 4, 5)
select * from comments where comments.bbs_id in (1, 2, 3, 4, 5)
```

#ちなみにLaravelでのSQLの確認方法

```php:UserController
     $sql = DB::table('users')
            ->where('id', 1)
            ->toSql();
     var_dump($sql);
     exit();
```

他にも👇でもおっけ〜です。

```php:UserController
     $sql = User::->where('id', 1)->toSql();
     var_dump($sql);
     exit();
```


上記みたいな感じで書くと確認できます！


残念なことに`all();`では`toSql();`が使えません😭
この事実にかなりショックを受けました。

N+1問題のことを調べましたが、まだまだひよこ故理解が不十分なので。
なにか間違っている点などありましたら、編集リクエストお願いします😌
「Qiita」と「redmine」と「はてなブログ」でMarkdown対決。審判：Wikipedia(日本語)。

#概要
Markdownの文法が適当な感じがしたので、

* Qiita
* redmine(4.1.0.stable)
* はいなブログ

で、Makrdownの違いを比較した。

比較対象は、Wikipedia(日本語）の以下のサイトで、Markdownとして例示しているものとした。
https://ja.wikipedia.org/wiki/Markdown



環境：
Windows10

#確認したMarkdownの内容

上記のWikipediaの内容をベースに以下の内容を表示させてみた。

（↓3連の部分は、この記事のため、バックスラッシュ追加で調整。)

```
◇(Check.01)段落

これは段落です。2つの文があります。

これは別の段落です。ここにも2つの文があります。

◇(Check.02)改行

テキストに挿入された改行は最終的な結果から取り除かれる。
テキストに挿入された改行は最終的な結果から取り除かれる。
テキストに挿入された改行は最終的な結果から取り除かれる。

テキストに挿入された改行は最終的な結果から取り除かれる。行末に2つのスペースを挿入。  
テキストに挿入された改行は最終的な結果から取り除かれる。行末に2つのスペースを挿入。  
テキストに挿入された改行は最終的な結果から取り除かれる。行末に2つのスペースを挿入。  


◇(Check.03)テキストの強調

*強調* もしくは _強調_（斜体として表現されることが多い）

**強い強調** もしくは __強い強調__（太字として表現されることが多い）

◇(Check.04)コード

インラインコードは「`some code`」のように


    1行目
    2行目
    3行目


\```javascript
(() => {
  'use strict';

  console.log('Hello world');
})();
\```




◇(Check.05)リスト

- 順序無しリストのアイテム
    - サブアイテムはタブもしくは4つのスペースでインデントする
- 順序無しリストの別のアイテム

* 順序無しリストのアイテム
    * サブアイテムはタブもしくは4つのスペースでインデントする
* 順序無しリストの別のアイテム

1. 順序付きリストのアイテム
2. 順序付きリストの別のアイテム





◇(Check.06)見出し


# レベル1の見出し

#### レベル4の見出し


レベル1の見出し
===============

レベル2の見出し
---------------



◇(Check.07)引用


> "このテキストは、HTMLのblockquote要素に囲まれます。
blockquote要素はreflowableです。テキストを好きなように
改行することができます。改行したとしても、変換後はひとつの
blockquote要素として扱われます。"



◇(Check.08)リンク

[リンクのテキスト](https://www.google.com/ "リンクのタイトル")

[リンクのテキスト][linkref]


[linkref]: https://www.google.com/ "リンクのタイトル"



◇(Check.09)水平線

* * *

***

*****

- - -

---------------------------------------
　　
　　
　　

```


#対決結果

##結論

* 「はてなブログ」だけ、『**テキストに挿入された改行は最終的な結果から取り除かれる。**』が正しく処理される。
* 「はてなブログ」だけ、順序付きリストに対応していない。


##Qitaの表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/2ec843bc-dcc2-6fc4-845d-87e5f0f97693.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/34e30050-cbfc-eddc-3b6c-51807806a382.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/a73dc41a-5b2d-be97-90b1-a4a22b6ecacf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/09012a13-3a55-6b8c-41fa-7d8ca732c562.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/54396890-0ab6-a361-55f0-5921f10111cf.png)
∥
##redmineの表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/24399d76-d4db-5db0-ffeb-5edb338ac66c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/0c544942-5938-20e7-1866-ba9c2630e8d0.png)

## はてなブログの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/bc9d05d0-c6a9-69b4-c594-e148bc1da38c.png)

（つづく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/ce7b9b92-d4b0-223b-757e-34eb6930e271.png)
（つづく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/80e94cbc-09e0-09b3-3f03-fe3554bd1a73.png)
（つづく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/7de308c6-f767-0f9f-8910-40dc321e3dfa.png)


#まとめ
両方とも完璧。:tada: [再掲]
意外な結果でした。
React初心者へ　ReactとNode.js?フロントなのにサーバーサイド?

# React初心者へ
Reactの復習をし始めたので、私も初心者ですが、React初心者向けに記事を書いてみました。
Reactの学習を始めてしばらくするとNode.jsに出会うと思いますが、フロントエンド開発なのになぜサーバーサイドの話が出てくるのかと疑問を頂いていませんか？
私もはじめはそう思っていました。Node.jsについてググって色々調べると「サーバーサイドのJavaSctipt」という間違った認識を得てしまいました。

# Node.jsはJavaScriptの実行環境のこと
「サーバーサイドのJavaSctipt」という認識のとおり、サーバーサイドで動く、少し書き方の違うJavaScriptなのかと思っていませんか？私はそうでした。
JavaScriptは通常ブラウザでしか動かないのですが、PCでも動くようにするためのソフトウェアがNode.jsなのです。

詳しくはこちらの記事がおすすめです。

https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb#fn3

# ReactはNode.jsなしでも動きます
htmlのscriptタグで
https://unpkg.com/react@17.0.1/umd/react.development.js
https://unpkg.com/react-dom@17.0.1/umd/react-dom.development.js
を読み込み、ReactDOM,renderメソッドを使用すれば動きます。

# なぜReact開発にNode.jsなのか

Reactでの開発時にサーバーサイドのJavaScript環境として知られるNode.jsを使う理由は、

①アプリケーション開発時のパッケージ管理の手間を省くため
②webpackやbabelなどの便利ツールを使用するため。

などがあります。

## ①アプリケーション開発時のパッケージ管理の手間を省くため
Reactでアプリケーション開発を行っていると、様々なパッケージを使う必要があるが、それらのパッケージ同士は相互に依存関係にあります。
例えば、「パッケージAはパッケージBのver X.X.X、パーッケージCのver X.X.Xがないと正常に動作しない。」というような状況が各パッケージ毎にあります。アプリケーションの開発者はこれらのパッケージのバージョンを適切に管理する必要があるのですが、ある程度のアプリになるとそのパッケージを手動で管理するのは非常に困難です。

Node.js環境で開発すると、パッケージを管理するためのnpmやyarnというツールを使用することでき、CLIからコマンドによりパッケージのインストールや依存関係の調整などが簡単に行うことができるのです。

## ②webpackやbabelなどの便利ツールを使用するため。
JavaScriptファイル、CSSファイルなどをバンドルするwebpack、最新のJavaScriptで書かれたコードを古いブラウザでも認識できる形にコンパイルするbabelなど、フロントエンド開発に欠かせないツールもNode.js環境があるために使用できています。CreateReactAppを利用しReact開発を始めた初心者は、あまり意識しない部分かもしれませんが、これもNode.jsの恩恵なのです。

# 終わりに
React界隈では名著の呼び声高い「りあクト！」を参考に勉強しました。作中で業務未経験には少しハードルが高いというニュアンスで書かれており、たしかにそうでしたが、おすすめです！
https://oukayuka.booth.pm/
MySQLの開始手順（自分の場合）

今回は自分の記録用にMySQLの開始手順を記録しようと思います。
＊やり方が違うなどアドバイスがありましたら、ぜひ訂正よろしくお願いいたします。

①

```shell
mysql.server start
```
②自分の名前の部分は自分が設定したユーザーです。

```shell
mysql -u 自分の名前 -p
```
③
自分でMySQL公式サイトからダウンロードしたときに設定した、パスワードを入力

以上の手順でログインできました。
【随時更新】ポートフォリオ・SaaS開発の参考に！超本格的なRails製オープンソースたち！【初心者もおすすめ】

「プログラマーになってすごいサービスを作りたい！」

という動機でプログラミングを始めてみたものの、いざ勉強を始めてみると

「どんな技術を使って開発したらいいの？」
「どこまで作り込めばいいのだろう？」
「一応完成したけどまだ足りないところがあるのでは？」

と不安に感じたことは一度はありますよね？

そんな方に強くオススメしたい**RailsアプリケーションのGitHubリポジトリ**たちを紹介します。

ここで紹介するRailsアプリケーションはオープンソースにもかかわらず、
**実際にWebサービスとして運用**されていたり、**有料で提供**されていたりするものもありますので、必ずサービス開発の参考になるはずです！

ぜひ、一読してWebサービス開発の参考にしてみてください！

# 対象読者

・プログラミング初学者さん
・個人サービスの開発に取り掛かる前の方
・サービス開発の参考資料を探している方
・よりよいサービス開発の参考にしたい方

# GitHubリポジトリたち

## ChatWoot 

オープンソースのライブチャットソフトです。
ホームページやランディングページに埋め込むお問い合わせチャットや、それに対するメッセージの管理システムを提供しているサービスです。

Vue.js × Ruby on Railsで開発されていて、このコードを勉強してマネするだけでかなり本格的なサービスの開発に繋げられると思います！
初見、かなり難しそうに感じますが、Gemfileを見て「devise」など初学者さんでもわかるライブラリなどがたくさん使われていますので、そういった分かる部分から読み進めていってもいいかもしれません。

**GitHubリポジトリURL**
https://github.com/chatwoot/chatwoot

**公式ページ**
https://www.chatwoot.com/

![dashboard-screen-b294bdd1d718312290ec49b6c2a13428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135860/d7f91003-80f8-6fb4-af99-0b357cf58de5.png)
引用元：https://www.chatwoot.com/static/dashboard-screen-b294bdd1d718312290ec49b6c2a13428.png

<img width="400px" alt="widget-ghost-99d99a87a95d9c1731b79af6584218ef.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135860/d5345e79-54a6-928e-d37f-53f6f283e849.png">
引用元：https://www.chatwoot.com/static/widget-ghost-99d99a87a95d9c1731b79af6584218ef.png


### 使われている主な技術

- Ruby on Rails
- Vue.js
- Docker
- CircleCI
など

## GitLab

GitHubのようにコードを管理することができるサービス。
かなりざっくりとGitHubとの違いを挙げると、自社で用意したサーバーなどにGitHubと同じような環境を構築できるので、セキュリティや情報管理の観点からGitHubは使いたくない！という企業さんに使われることが多いサービスです。
※その他にもGitLabの良いところはたくさんありますが、割愛します！

こちらもVue.js × Ruby on Railsで開発されたサービスですが、chatwootと違い、Railsのapp/views内のHTMLファイルのコードも充実しているため、まだJSフレームワークでのフロントエンド開発は視野に入れていないプログラマーさんでも読みやすいところは多いのかな、と思います。
ただし、hamlで書かれているため、人によっては読みにくさを感じるかも…

**GitHubリポジトリ**
https://github.com/gitlabhq/gitlabhq/

**公式ページ**
https://about.gitlab.com/

<img width="700px" alt="solutions-create.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135860/504380a1-90db-1f97-a875-44da0f350a27.png">
引用元：https://about.gitlab.com/images/solutions/solutions-create.png

### 使われている主な技術

- Ruby on Rails
- Vue.js
- Docker
など


## solidus

オープンソースのeコマース構築サービス。
他のリポジトリと比べるとディレクトリ構成が少し特殊かな、という印象です。
こちらはフロントエンドも含めてRuby on Railsで開発されているようですので、その点においては参考にしやすいリポジトリなのかな、と思います。

こちら(http://demo.solidus.io/) からでもページを見ることも可能です。

**GitHubリポジトリ**
https://github.com/solidusio/solidus

**公式ページ**
https://spreecommerce.org/

![Screen Shot 2021-03-06 at 14.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135860/b87331b6-674e-b739-e416-f74fdb3940e6.png)


### 使われている技術

- Ruby on Rails
- CircleCI
など


# まとめ

こちらの内容は随時更新していきます！
他にも実際にサービスとして提供されている良いオープンソースコードがございましたら教えていただきますと幸いです！
No route matches [GET] "/logout"　対応方法

#問題
rails tutorial 8章を学習中。
アプリにログインして、[logout]ボタンでログアウトしようとすると

```
Routing Error[No route matches [GET] “/logout”]
```
が発生。

routes.rbに記載したログアウトについての記載は以下

```
 delete '/logout',  to: 'sessions#destroy'
```

本当はdeleteメソッドを送りたいのに、なぜgetメソッドになるのか。

#解決策

調べてみると、JQueryがないとdeleteメソッドを送れないそう。

①apprication.jsから「jquery_ujs」を呼び出す。

```app/assets/javascripts/apprication.js
//= require rails-ujs
//= require jquery
#追記
//= require jquery_ujs
#ここまで
//= require bootstrap
//= require turbolinks
//= require_tree .
```

まだerrorが続く。


②apprication.html.erbの```<head></head>```部分に
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
を追加。



まだerror




③こちら「[Rails6でjQueryの導入方法](https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13)」の記事を参考に、
$ yarn add jqueryを実行後、environment.jsを追記。


```config/webpack/environment.js

const { environment } = require('@rails/webpacker')

#ここから
const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',
        jQuery: 'jquery/src/jquery'
    })
)
#ここまで
module.exports = environment
```

解決。


#原因

jQueryが動いていないためにdeleteメソッドが呼ばれていなかった。


#環境
cloud 9
rails -v 6.0.3
PowerShellにPathを永続的に追加する Ubuntu（Linux）版

### 環境
Ubuntu 20.04 LTS
PowerShell 7.1.2

### 方法

```powershell:Microsoft.PowerShell_profile.ps1
$Env:PATH += ":追加したいパス"
```

上記の記述を ~/.config/powershell/Microsoft.PowerShell_profile.ps1 に追加する。
デフォルトでは powershellディレクトリも Microsoft.PowerShell_profile.ps1も存在しないので、新規作成する。
LinuxではPathの区切り文字はコロン(:)で、 追加したいパス の前に付ける。

##### 参考にしたウェブサイト（Widnows 10 環境）

https://win.just4fun.biz/?PowerShell/PowerShell%E3%81%A7%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0PATH%E3%81%AB%E3%83%91%E3%82%B9%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

https://win.just4fun.biz/?PowerShell/PowerShell%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
PCでRubyを実行してみよう！| 初めてのプログラミング環境構築 ②

前回はWindows、MacそれぞれにRubyをインストールするところまで行いました。
今回はRubyで簡単な文法を試してみましょう！

##irbでRubyの動作を確認
まだガッツリプログラムを書くわけではないのでirb（Interactive Rubyの略）を使ってRubyのコードの動作を確認していきます。

PowerShellまたはターミナルで以下のコマンドを入力してEnterを押下してください。

```terminal:PowerShellまたはターミナル
irb
irb(main):001:0>
```
「irb(main):001:0>」と言うふうに変化したと思います。これでRubyのコマンドが実行できるようになりました。

ちなみにirbを終了したい時はexitを実行します。

```terminal:PowerShellまたはターミナル
irb(main):001:0> exit
```

##Rubyの基本文法
ここでRubyの簡単な構文を確認しておきます。

###文字列/数字を出力してみよう
Rubyで出力に使う主なコマンドは**puts**です。
またプログラムを実行する上で**データの型**を区別する必要があり、主なものは**文字列**と**数字**です。
**文字列**はダブルクオーテーション（"）またはシングルクオーテーション（'）で囲む必要があります。**数字**は囲む必要はありません。
例えば、**数字**を文字列で表現したい時は"1"のようにしてあげれば、文字列として認識してもらえます。
irbで次のように実行してみましょう！

```terminal
> puts "Hello World!"
Hello World!
=> nil

> puts 100
100
```
はい！出力されましたね！
**Hello World!**と**100**が出力結果です。まだイメージが湧かないかもしれないですね。

###変数へ代入
先ほどのputsを使った出力は、変数の中身を確認するときなどに使えます。
それでは**変数**に任意の文字列または数字を**代入**して、その動作を確認してみましょう。
なお、ここでも**文字列**と**数字**の区別には注意してください！

```terminal
> string = "Hello World!"
> integer = 100
```
変数として用意した**string**と**integer**は英数小文字で始まるものであればなんでも構いません。（例えば**s**とか**i**とか一文字でも）
プログラミングでは等号（=）を使って、変数に任意の文字列や数字などを代入します。

それでは変数の中身を出力してみましょう！

```terminal
> puts string
Hello World!

> puts integer
100
```

なお、変数は上書きができます。

```terminal
> string = "Hello World!"
> puts string
Hello World!

> string = "Hello Japan!"
> puts string
Hello Japan!
```

###演算
次は計算をしてみましょう！

| 演算子 | 意味 | 例 |
| :-- | :-: | :-- |
| + | 足し算/和 | 1 + 1 （結果 2）|
| - | 引き算/差 | 2 - 1 （結果 1）|
| * | 掛け算/積 | 2 * 2 （結果 4）|
| / | 掛け算/商 | 2 / 2 （結果 1）|
| % | 余り/余剰 | 3 % 2 （結果 1）|
| ** | べき乗/余剰 | 10 ** 3 （結果 1000）|

```terminal
irb(main):013:0> 1 + 1
=> 2
irb(main):014:0> 2 - 1
=> 1
irb(main):015:0> 2 * 2
=> 4
irb(main):016:0> 2 / 2
=> 1
irb(main):017:0> 3 % 2
=> 1
irb(main):018:0> 10 ** 3
=> 1000
```

###配列とハッシュ
先ほどの**変数**では一つのデータだけを格納していました。
配列やハッシュを使うことで変数一つに対して複数のデータを格納することができます。


####配列
こんな形のもの。文字列や数字を[ ]で囲みます。

```terminal
> price = [100, 200, 300]
> fruit = ["banana", "apple", "orange"]
```

####ハッシュ
配列に似ていますが、波かっこ{ }で囲み、key（例："banana"）とvalue（例:100）がセットで格納されています。

```terminal
> fruits = {"banana": 100, "apple": 200, "orange": 300}
または
> fruits = {:banana=>100, :apple=>200, :orange=>300}
```

最後に配列とハッシュの操作を確認してみます。
配列やハッシュの**何番目**かの要素を取り出してみたいと思います。

プログラミングで順番を指定する場合、一番最初は0番目と数えることに注意してください。

```terminal
#price配列の１番目を取り出してみる。
#この場合、price配列に[0]をつけることで、「1番目だよ！」と指示することができる。
irb(main):022:0> price[0]
=> 100
```
```terminal
#fruit配列の2番目を取り出してみる。
#この場合、price配列に[1]をつけることで、「2番目だよ！」と指示することができる。
irb(main):023:0> fruit[1]
=> "apple"
```

ハッシュはkeyを指定してあげることで狙ったvalueを取り出すことができる。

```terminal
irb(main):033:0> fruits[:orange]
=> 300
```

##最後に
今回は基本的な文法をまとめてみました。
この操作ができるようになれば、様々な応用ができるようになると思います！
UbuntuにAndroid Studioをインストール

#UbuntuにAndroid Studioをインストール

## 環境
・Ubuntu 18.04.05
・Android Studio 4.1.2 for Linux 64-bit

## インストール
下記のサイトに従う。
https://developer.android.com/studio/install?hl=ja

### 事前準備
64BitのUbuntuのためライブラリをapt

```
$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386
```
### 本体のダウンロード＆インストール
以下から最新のAndroidStudioをダウンロード（執筆時点は4.1.2）
https://developer.android.com/studio?hl=ja

Archive Managerを使用して、圧縮ファイルを解凍する。
今回は個人仕様であるため、local下に展開したフォルドごと移動する。
(解凍先はArchibe Managerで指定できる。今回はDownloads直下で解凍した。)
```
$ mv ~/Downloads/android-studio /usr/local/
```

### 実行

”android-studio”を移動した場所に移動し、studio.shを実行する。

```
$ cd /usr/local/android-studio
$ sh ./bin/studio.sh 
```

設定ファイルをImportするか聞かれるが、今回始めてAndroidStudioを使用するためSkip。
datashareするかはお好みで。

Setup Wizardが実行するため、設定を確認する。
Custom設定を選んでみたが、基本的に変更せずにポチポチしていけば問題なさそう。

最後にSDK等のコンポーネントがダウンロード（5分程度）したら終了。

今後起動する際は、以下のコマンドで起動できる。

```
$ sh /usr/local/android-studio/bin/studio.sh 
```
### 最後に
以下にある動画をスクリプト化しただけの記事でした。

https://developer.android.com/studio/install?hl=ja
[Python] 既存のPowerpointのテキストをフォーマットを変えずに変更する python-pptx


python-pptxでPowerPointのレポートを操作したい時、事前にテンプレートを用意しておいて文字のフォーマットはそのままで内容の一部を変更したいことがあります。思ったよりも面倒でしたので、こちらの備忘録として残します。

動作を確認するために、以下のようにフォーマットされた文字列のあるPPTファイルの一部（「。。。」)を今日の日付(2021/3/6)で変換するコードを書いてみました。元の文字は影をつけたり、下線をつけたりと、いろいろと装飾してあります。コードを実施される方は"元のファイル.pptx"というファイルを作ってコードと同じディレクトリに保存してください。

![スクリーンショット 2021-03-06 122130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/ad46d8c5-3bce-28df-489d-758cdbde63a4.png)

なお、既存の文字を置き換える方法は、python-pptxの作者であるScannyさんがこちらで説明していますので、その関数（モジュール）はそのまま利用します。
https://github.com/scanny/python-pptx/issues/285
replace_paragraph_text_retaining_initial_formattingという名前の長い関数がそうです。

私が工夫したポイントとしては、元のファイルの中から該当するparagraphオブジェクトを探すところです。このオブジェクトの関係がいろいろとややこしいのですが、こちらを参考にさせていただきました。この階層のどちらが上だったか、ぜんぜん記憶することができません。。。
![スクリーンショット 2021-03-08 130142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/a6fd50d6-3cc9-3c62-c80b-cb1b23b47960.png)

https://www.relief.jp/docs/python-pptx-font-color.html


```python

import pptx, re
from pptx.util import Cm, Pt, Inches

def replace_paragraph_text_retaining_initial_formatting(paragraph, new_text):
    p = paragraph._p # the lxml element containing the <a:p> paragraph element
    # remove all but the first run
    for idx, run in enumerate(paragraph.runs):
        if idx == 0:
            continue
        p.remove(run._r)
        paragraph.runs[0].text = new_text

prs = pptx.Presentation("元のファイル.pptx")
slide=prs.slides[0] #先頭のページを選択

for shp in slide.shapes:

    if shp.has_text_frame:
        if "日付は" in shp.text: #変更する文字列の一部でマッチさせる
            new_text=re.sub('。。。', '2021年3月6日', shp.text) #置き換え
            replace_paragraph_text_retaining_initial_formatting(shp.text_frame.paragraphs[0], new_text)

prs.save('変更後のファイル.pptx')

```
[AWS SAM] [CloudFormation] Lambda 実行ロググループを明示的に指定する

# 背景
* [AWS SAM](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html) を使って、API Gateway + Lambda のデプロイを自動化しています
* 複数環境それぞれで Lambda 関数名を変えています
    * 例では `lambda-handler-for-qiita[|-r1|-r2]` の3通りを定義しています
    * 詳細は別記事の [\[AWS SAM\] \[CloudFormation\] 環境ごとに設定値を切り替える方法 \- Qiita](https://qiita.com/gotousua/items/48efb57cebef6d46f2ba) をご参照ください
* 本ページでは、Lambda 用実行ロググループを明示的に作成・管理する際の注意点をまとめています

# AWS SAM における Lambda 用実行ロググループの基礎知識
* デフォルトでは、何も指定しなくとも `/aws/lambda/{Lambda関数名}` の名前で自動で CloudWatch ロググループを作ってくれます
* とはいえ、以下クラスメソッド様の記事で解説されている通り、自前のテンプレートで管理した方が良いです
    * [【小ネタ】AWS SAMでLambda関数を作成する場合はCloudWatch LogsのLog Groupも同時に作った方がいいという話 \| Developers\.IO](https://dev.classmethod.jp/articles/should-create-cloudwatch-logs-log-group-when-creating-lambda-with-aws-sam/)
      * 理由
          1. Lambda関数のLog Groupが存在する前提のテンプレートになっているとスタックの作成に失敗する可能性がある
          2. Lambda関数が作成するLog Groupはリテンションが無期限になっている
          3. AWS SAMによって作成されたスタックを削除した場合Log Groupが残り続ける
          4. そもそもLog GroupはLambda関数には必須のAWSリソースなのでそれも含めてテンプレートを作成した方がよい

# 先に Lambda 関数が作られると失敗する
* 当初、以下のように Lambda ロググループ名を `!Sub /aws/lambda/${Lambda関数}` のように Lambda 関数を参照する形で指定していました

```yaml
  # Lambda ロググループ
  LambdaHandlerForQiitaLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /aws/lambda/${LambdaHandlerForQiita}
      RetentionInDays: 180
```
* しかし、この書き方だと `sam build` 時にエラーとなる場合がありました
* 理由は、Lambda 関数を `！Sub` = 参照しているため **Lambda 関数が先に作られている**必要があるにも関わらず、Lambda ロググループのリソースが先に作成されてしまったためです
    * リソースの作成順は AWS SAM が自動判断しており、検証した限りでは yaml 内での定義順は関係ありませんでした

# 回避策
* [DependsOn 属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) を利用して、「Lambda 関数 → ロググループ」の順にリソースが作成されるよう制御
* ロググループ名は `!Sub` 参照が使えないため、`!Join` を使って `/aws/lambda/{Lambda関数名}` となるよう生成
  * Lambda 関数名を [FunctionName プロパティ](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-functionname) で明示的に指定しておかないと、`lambda-handler-for-qiita-A1B2C3D4E5F` のように末尾にランダムな文字列が付加され、分かりにくくなってしまうので注意

```yaml
# Lambda 関数名の Mapping 定義は以下も参照
# https://qiita.com/gotousua/items/48efb57cebef6d46f2ba#%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0--mappings-
Mappings:
  SystemTypeMap:
    general:
      LambdaName: lambda-handler-for-qiita

Resources:
  # Lambda 関数
  LambdaHandlerForQiita:
    Type: AWS::Serverless::Function
    Dependson: LambdaHandlerForQiitaLogGroup
    Properties:
      FunctionName: !FindInMap [ SystemTypeMap, !Ref SystemType, LambdaName ]

  # Lambda のログ用ロググループ
  LambdaHandlerForQiitaLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      # Lambda より先にロググループを作るため、!Sub /aws/lambda/${LambdaHandlerForQiita} とはしない
      LogGroupName: !Join [ "", [/aws/lambda/, !FindInMap [ SystemTypeMap, !Ref SystemType, LambdaName ]]]
      RetentionInDays: 180
```
[SwiftUI]Widgetでサイズごとに値を変える

iOSのWidgetでサイズごとに文字サイズなどを変えるためのメモ。

## 実装
### View内でWidgetFamilyの値を取得

```swift
    @Environment(\.widgetFamily) var widgetFamily
```

### WidgetFamilyごとにFontサイズを変える

```swift
    var font: Font {
        switch self.widgetFamily {
        case .systemSmall: return .system(size: 10)
        case .systemMedium: return .system(size: 20)
        case .systemLarge: return .system(size: 30)
        @unknown default: return .system(size: 10)
        }
    }

    var body: some View {
        Text(entry.date, style: .time)
            .font(self.font)
    }

```

## 結果

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/65a56b74-92af-7da9-8c0c-0b8317453f0e.png"/>

WidgetFamilyごとに文字サイズを変えることができました。


## 参考
- https://developer.apple.com/documentation/swiftui/environmentvalues
ArduinoがPCに認識されなくなった時



![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 変なプログラムを書き込んだらArduinoが認識されなくなった詰んだ

## やること
Arduino micro でMsTimer2の割り込み処理関連のテストをしていたらPC（Mac）に認識されなくなって焦りました。その対処法です。

## リセット２連打でプログラム実行開始が遅延される救済措置があった
Arduino microの場合、本体のリセットボタンを素早く2連打することでプログラムの実行開始を遅延させる機能が入っているようです。
実行開始遅延モードに入った時は本体のLEDが約8秒間、蛍のように点滅します。
（調べていませんがおそらく全てのArduinoで使える技だと思います。）

変なプログラムを書き込んでしまったことが原因でPCに認識されないという場合には、このプログラム実行開始の遅延中に書き込みが可能になります。
（ブートローダーが破損していた場合には当てはまりません。）


## Arduino復活のための準備と確認

・リセットボタンの2連打の間隔ついては「たたん」でも「たんたん」でも大丈夫ですが、Arduino側の状態にもよるかもしれないので、何度か試してみてください。蛍点滅になれば成功です。

・点滅中にArduino Ideメニューの「ツール」→「シリアルポート」をチェックするとUSBが選べるようになっているので、それをチェックします。

・Arduino Ideで「新規ファイル」を作成し、以下のような空のスケッチを準備しておきます。

```c
void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}
```

## いのり - ささやき - えいしょう - ねんじろ！

準備が整ったら蘇生の儀式を行います。

① ArduinoとPCをUSBで接続する。
② リセット２連打でLED蛍点滅させる。
③ シリアルポートでUSBを選択。
④ Arduino IDEの空のスケッチで「マイコンボードに書き込む」ボタンを押す。
⑤ ここで再びリセット２連打！（←遅延モードをタイムアウトさせないコツ）

うまくいけば書き込みが終了し、Arduinoが復活します。

（ちなみに自分は割り込みの中でwireを使おうとしたのが問題だったようです。wireも割り込み処理の仲間だったようです。）
【VRC】UdonSharpで書いた関数をボタンクリックで呼び出す【UdonSharp】

## 環境
- VRCSDK3-WORLD-2021.02.23.11.40_Public
- UdonSharp_v0.19.2
- Unity 2018.4.20f1

## 実現したいこと
- ボタンを押したら座面位置が調整できるUI作成
- その前段階としてボタンを押したら閉じるメニュー作り

## 手順
- シーンに以下のようなヒエラルキーを作成

```
Menu(Empty)-|
            |-Canvas(Canvas)-|
                             |-Buttons(Empty)-|
                                              |-CloseButton(Button)
```
- Canvas　等の設定
- Menu に UdonSharp スクリプトを追加
- CloseButton を押すと Menu の関数が発火するように設定


### ヒエラルキーの作成
- 好きなところに Create Empty し名前を Menu とする
- Menu を右クリックし　UI > Canvas を選択し追加
- Canvas を右クリックし Create Empty を選択し名前を Buttons とする
- Buttons を右クリックし UI > Button を選択し追加

### Canvas 等の設定
- VRC Ui Shape コンポーネントを Canvas に追加
- Canvas の Render Mode を `World Space` に変更
    - `World Space` にすることでメニューをワールド中に固定しておけるようになる
    - `A world space Canvas with no specified Event Camera may not register UI events correctly` と警告が出るが一応動く
- メニューがおそらく大きすぎるのでUIの位置を調整する
- **Canvas の Layer を Default に変更する**
    - 配下も一緒に変えますか？みたいなダイアログがでるので YES を選択
    - これを変えておかないと通常時に選択できないメニューになる（一敗）

### Menu に UdonSharp スクリプトを追加
- Menu に　Udon Behavior コンポーネントを追加し スクリプトを追加する（[前回記事](https://qiita.com/m1chie/items/65fdee5ed818d49927ab)でまとめた通り）
- 以下のようにスクリプトを編集する
- 外部から呼び出したい関数は　`public` として宣言する 

```csharp:ClosableMenu.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class ClosableMenu: UdonSharpBehaviour
{

    public void Close()
    {

        this._canvas.SetActive(false);
    }

    void Start()
    {
        this._canvas = this.transform.Find("Canvas").gameObject;
    }

    private GameObject _canvas;
}

```

### CloseButton を押すと Menu の関数が発火するように設定（本題）
- CloseButton の Inspector から Button(Script) コンポーネントを確認
- + ボタンをクリックしボタンを選択した際の処理を追加
- None(Object) となっているところの右側のボタンをクリック
- AssetタブからSceneタブに切り替えて Menu を選択
- No Function となっているところを選択し UdonBehavior() > SendCustomEvent(string) を選択
- 下の空欄となっている部分に　Close と入力
- 以下のようになっていたらOK（「ChairWithMenu」となっている部分は「Menu」になるはず）
![スクリーンショット 2021-03-06 131906.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169868/6fdd8cd9-95eb-94af-7ed4-0e4a6fb5245b.jpeg)

## SendCustomEvent ってなんじゃ
- UdonBehavior というコンポーネントを通じてのみやり取り可能
- そのため自分で宣言したクラスの関数を直接発火させることができない
- UdonBehavior さんに「うちのカスタムクラスの〇〇って関数を発火させてください！」と頼む感じ
    - ~~存在を担保できない呼び出し方で気持ち悪いね...~~


## わからないこと
- そもそも本当に UdonBehavior() ではなく ClosableMenu にアクセスできないのか？
    - ClosableMenu にアクセスできるなら関数の存在を担保しながらボタンから呼び出せるはず
    - UdonSharpかUdonそのものの制約？
- UdonSharp で追加した関数に引数を渡すことはできる？
    - 変数の持ちまわし方がよくわからない...
    - シングルトンでマネージャクラスを宣言して持ちまわす？

## 参考
- [[無料版あり] VRchat向け 基本的でシンプルなUDONギミック](https://booth.pm/ja/items/2218271)
- [UDONメモ](https://kurotori4423.github.io/KurotoriMkDoc/VRChat/UDON%20%E3%81%A7%E3%82%AE%E3%83%9F%E3%83%83%E3%82%AF/)
結婚式のペーパーアイテムをできるだけペーパーレスにしてみた

## 背景
結婚式・披露宴には、各種ペーパーアイテムが必要です。
具体的には、以下のようなものです。

- 招待状
- 座席表
- プロフィールブック
- 料理メニュー
- 席札

それらをすべて紙で印刷するとお金も手間もかかるので、Googleの力を借りてできるだけ（上のリストの席札以外）ペーパーレスにしてみましたので、どのように実践したのかを書いていきます。

## 招待状

招待状は、皆さんおなじみGoogle Formで作成しました。
最近ですと、LINE等で出席確認した後に招待状を改めて送付・改修という流れが多いかと思いますが、「一度出席確認するなら二度手間では？」と思ったので、Google Form一本に絞りました。
細かい点としては、今回は式場から

- コロナ対策に関する通知
- アレルギーに関する通知

を含めるよう言われたので、それに合わせたフォームにしました。
セクションを区切ることにより、不要な質問（欠席の場合の住所入力など）には回答しなくても良いようにしました。

## 席次表

席次表は、[Draw.io](https://app.diagrams.net/)で作成しました。
パワーポイントでも良かったのですが、サイズや間隔の調整がやりやすそうだと思ったためこちらにしました。
別のPCからも編集できるよう、ファイルはGoogle Driveを利用しています。
最初は気にしていませんでしたが、Draw.ioはDriveとの連携も簡単で便利でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608187/97734aef-e5eb-f609-9e5e-933e4d3ba997.png)


## 料理メニュー

料理のメニューは、ほぼテキストを並べるだけなので、シンプルにパワーポイントで作成しました。
後から思うと、こちらもDraw.ioでも良かったかもしれません。

## Glide

各種ペーパーアイテムは、[Glide](https://www.glideapps.com/)でPWA化して共有しました。
作成したサイトのURLは、QRコードを印刷したカードを置いて共有しました。（結果的にペーパーアイテムが必要になっているのはご愛嬌）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608187/65215e58-fac7-c1a3-bda8-28c7a569972e.png)
席次表とメニューは画像ファイルとして表示させました。
その他、プロフィールのタブと、ゲストからのメッセージ一覧、動画共有のタブを作成しました。
メッセージに関しては、招待状の回答時にもらっていたので、フォームの回答シートを指定するだけでほぼ完了です。
その他タブに関しては、Glide上でテーブルを作成して、データや画像を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608187/5d34a788-df8d-97d6-3b2c-6a1bb843b5cc.png)

注意点としては、

- Freeプランだとパスワードをかけられない（厳密には、かけられるが同時に1人しかサイトを閲覧できない）
- ピンチイン・アウトで画像の拡大縮小ができないスタイルがある

という制限があります。


## 断念したもの

### QR入場

[こちら](https://qiita.com/07JP27/items/8f687a7eb906e624f659)を参考にVue.jsとPythonで途中まで作成したのですが、諸々の事情（一言で言うと面倒になった）により断念しました。式場にWi-Fiが無かったのが痛かったです。

### 電子マネーご祝儀

2020年夏に起きたドコモ口座問題を受けて、各種決済アプリの銀行からのチャージが停止されてしまい、送金がしづらくなってしまったため断念しました。最近では少しずつ口座利用が再開されているようです。

## 最後に

全て紙で作ろうとすると時間も費用もかかるので、これから挙式する予定のある方は、各種ペーパーアイテムのオンライン化も検討してみても良いかと思います。
私たちを担当していたプランナーも、今までにここまでオンラインでやろうとした人はいなかったようでしたが、快く対応してくださいましたので、興味があればプランナーに聞いてみると良いと思います。
コールバックで before_save ではなく before_validation を使わないといけないパターン

## 仕様
* Producer (製造者) は token という String の属性を持つ。
* token は必須属性で、Producer の新規作成時に、ユニークかつランダムな英数字を自動的にセットしたい。

## コード

```ruby:app/models/producer.rb
require 'securerandom'

class Producer < ApplicationRecord
  validates :token, uniqueness: true
 
  # before_create :set_token # 駄目なパターン 
  before_validation :set_token, on: :create

  def set_token
    self.token = SecureRandom.alphanumeric(24)
    self.set_token unless self.valid?
  end
end
```

`before_create` で set_token を呼び出そうとした場合は、先に validation が走るので、 token の uniquenss 制約でエラーが発生する場合がある。
最初から全てのレコードに token が設定されていれば問題ないが、途中から導入した場合、set_token が呼び出される前の validation で nil が重複することになってしまう。

## 教訓

コールバック周りで想定と違う挙動が発生した場合は、心を落ち着けて Rails ガイドを見直すこと。

https://railsguides.jp/active_record_callbacks.html
CodePenを使ってサイト上にコードを埋め込む方法。

# はじめに
cssなどで記述したコードの実際の見た目を表示したい時に、便利な方法はないかと探してみると、CodePenというサービスがあったので使い方を自分の復習用にまとめました。
# CodePenとは
Webブラウザ上でフロントエンド言語のコーディングができるサービスです。
Webサイトにコードを埋め込むことや、コードを共有することができます。

コードと結果を1画面で表示できるので、コードの説明時に便利です。

# CodePenの使い方
1. まずはCodePenのアカウントを取得します。
[CodePen](https://codepen.io/)
2. 登録が完了したら、左のバーにあるPenというところを押します。
3. 右上のSettingから利用する言語を選びます。
4. 好きなコードを書きます。
次に、完成したコードをサイトに埋め込んでいきます。
6. Embedというボタンを押すとCopy&Paste Codeという欄があるのでそのコードをコピーします。
7. コピーしたコードをサイトに貼り付ければ、これで完成です。


# 以上
使い方は非常に簡単なので、サイト上でビューを見せたい場合などに使ってみてください。
[Vue.js]main.jsのimport { createApp } from 'vue'の'vue'って何者？？

（当たり前として捉えられているのかは知らないが）意外とこれ解説してる記事がどこにもなかったので、自分なりの見解を記載。

環境：
PC:mac book pro
バージョン：Vue.js 3
エディタ：VSCode

前提：
・Vue.js環境周りを全て設定完了
・（設定直後で）ファイルは何もいじっていない
・localhost:8080でサーバ起動できる

上記前提を元に以下ファイルを見ていったときに疑問が１つ。

##main.js

```
import { createApp } from 'vue'　⇦こいつ
import App from './App.vue'
createApp(App).mount('#app')
```

２行目はまぁ、App.vueをmain.jsにインポートしてるってだけの話だからいいとして、
１行目のこいつ。
~~createAppはただの関数名（予約語という訳でもなく）と思われるのでここは問題ない。~~
createAppは関数であるものの、'vue'って何？？
そんなファイルどこにもないぞ？？

何者だこいつ？？？

(18:47 更新　解釈が全然違っていたため。すでに閲覧された方、ご迷惑をおかけしました。)
以下のコマンドを発行時に、my-projectディレクトリが生成され、その下に色々とファイルが生成される。
```
vue create my-project 
※my-projectの部分は可変
```

その際に、「_package.json_」というjsonファイルが作成されるのだが、
どうやらその中に「dependencies」という情報が設定されているようで、（中身は環境によって異なる（バージョンやデータなど））その中のvueを使用するためのインポート文として、「import { createApp } from 'vue'」が記載されているらしい。

```
"dependencies": {
    "core-js": "^3.6.5",
    "vue": "^3.0.0"
  }
```

以上。
Heroku DB エラー解決例

Herokuでエラーが表示されたら、ターミナルでログを確認します。

```ターミナル
Mysql2::Error: Table 'heroku_c3f10c83e898030.comments' doesn't exist
```

上記は、Mysql2 :: Error：テーブル 'heroku_c3f10c83e898030.comments'は存在しません
というエラーです。

DBにテーブルが存在しないので、Heroku用のdb:migrateをターミナルで入力します。
（ローカル環境ではテーブルがある状態）

```ターミナル
○○○○○○○○○@○○○○ ○○○○○ %  heroku run rails db:migrate
```

Herokuでdb:migrateを行った後は再起動する必要があります。

```ターミナル
○○○○○○○○○@○○○○ ○○○○○ %  heroku run rails restart
```
上記の入力で修正は完了です。
Laravelで一度は画像が表示されたのに、いろいろイジくってたら画像が表示されなくなった話

# 概要
初めてDockerを用いてLaravelで画像アップロードができる掲示板アプリを作った時のお話です。
アプリ制作中せっかく画像アップロード機能が正常に動いたのに、はじめに作ったディレクトリ構造が気に食わずちょいと直した結果、画像表示がされなくなってしまいました。その時の解決方法を備忘録として残します。

## ディレクトリ構造

```
larapic
 ├── README.md
 ├── infra
 │   ├── mysql
 │   │   ├── data
 │   │   └── my.cnf
 │   ├── nginx
 │   │   ├── default.conf
 │   │   └── Dockerfile
 │   └── php
 │       ├── Dockerfile
 │       └── php.ini
 ├── docker-compose.yml
 └── laravel（以降laravel①）
     └── Laravel（以降laravel②）
         ├── app
         ├── bootstrap
         ├── config
         ├── ・・・
```

このディレクトリ構造で始めてしまいました。laravelが1ついらないですね。
ある程度アプリが出来上がり、余裕が生まれたところでこのディレクトリ構造を直したいと思い立ちました。
laravel②を①の階層に上げて、①を削除。これでOK〜！

…と思いきや、画像が表示されなくなってしまいました。ガーン。
![larapic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851225/3910a493-2668-de86-24b2-6eaa532cedef.png)


# 解決方法
シンボリックリンクに原因がある模様です。一度シンボリックリンクを解除し、再度シンボリックリンクを貼ります。

```php:terminal
# publicフォルダに移動しシンボリックリンクを解除
% cd public
% rm -rf storage
# 戻って再度シンボリックリンクを張る
% cd ../
% php artisan storage:link
```

![larapic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851225/5aa603fb-e3ed-44c5-89c9-5b28e0499f42.png)
これで画像が表示されました。
pythonで自作クラスの大小判定(ソート)を行う

# やりたかったこと
pythonで簡単なクラスを定義して，そのクラスの中のある変数を基準にしてインスタンスが入っているリストのソートを行いたかったです．

どうやるんだっけ？となったのでやり方をメモしておきます．


# 作成したクラス
```python
class Node:  # 木のノードを表すクラス
    def __init__(self, value: int, left = None, right = None):
        self.value: int = value  # ソートの基準としたい値
        self.left = left  # 左の子ノード
        self.right = right  # 右の子ノード
```
このクラスのvalueというint型の変数をもとに大小判定をしてリストをソートしたいです．

ソートするためにこのクラスのインスタンスのリストを適当に作成しておきます．

```python
> import numpy as np
> nodes = [Node(np.random.randint(10)) for i in range(10)]
> print([node.value for node in nodes])
[6, 1, 7, 9, 8, 6, 4, 9, 6, 7]
```

この`nodes`というリストを単純にソートしてみると...

```python
> sorted(nodes)
TypeError: '<' not supported between instances of 'Node' and 'Node'
```

このようにTypeErrorがでてソートすることができません．

`Node`インスタンス間の比較演算`<`がサポートされていないというエラーがでています．


# やり方1: クラスに`__lt__`メソッドを定義する

```python
class Node:  # 木のノードを表すクラス
    def __init__(self, value: int, left = None, right = None):
        self.left = left  # 左の子ノード
        self.right = right  # 右の子ノード
        self.value: int = value  # ソートの基準としたい値

    def __lt__(self, other):  # 自作クラスで大小を判別するための関数
        return self.value < other.value
```

上記のように`__lt__`メソッド(less than)を定義します．

引数には`self`と`other`を受け取ります．
`self.value`が`other.value`より小さい時には`True`をそうで無い時は`False`を返すようにします．

このように定義することでインスタンス間の大小を比較できるようになります．
(そのほかにも`__eq__`(equal)や`__gt__`(greater than)などの比較演算を定義できますが，ソートなら`__lt__`を定義しておけば十分でした．)

実際にソートしてみると...

```python
> sorted_nodes = sorted(nodes)
> print([node.value for node in sorted_nodes])
[1, 4, 6, 6, 6, 7, 7, 8, 9, 9]
```

正しくソートされていました!


# やり方2: ソート時に比較する際のキーを渡す
pythonの`sorted`関数ではオプション引数として`key`を渡すことができます．
この`key`を渡すとこれを基準にソートを行なってくれます．

次のようにlambda式を使って書けます．

```python
> sorted_nodes = sorted(nodes, key=lambda x: x.value)
> print([node.value for node in sorted_nodes])
[1, 4, 6, 6, 6, 7, 7, 8, 9, 9]
```

こちらも正しくソートされていました．


# まとめ
上記2つのやり方どちらでもソートを行うことができます．

単純にソートをしたいだけならやり方2の方が早く書けると思います．

ただ優先度付きキューなどに入れたい場合やり方1を用いないとできないと思います．


# 参考
[Python 独自クラスで比較演算ができるようにする](https://www.yoheim.net/blog.php?q=20171002)
MySQLのサンプルデータをXAMPPにインポートする

ちょっとしたクエリを実験するためにサンプルデータが欲しいなあ、と思っていたらMySQLに用意されているそうではないか！
employeeという仮想社員データ？ をXAMPPくんのMySQLに取り込んで使ってみました。
##サンプルデータのダウンロード##
ここからダウンロード
https://dev.mysql.com/doc/index-other.html

いくつかサンプルがあるので、好きなものを選んでいただければと思います。

employeeというサンプルが1番大きそうだったので、私はこいつを使いました。

![MySQL_offcial.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/71001a31-40dd-bdf2-6fda-c38516066901.png)

##MySQLにインポート##
1. DLしたサンプルデータが入ったファイルを解凍
2. XAMPPコントロールパネルのshellを起動
3. cd (サンプルデータのパス)　で移動<br>
　自分の場合は "**cd C:\Users\Sanada\Downloads\test_db-master**" をshellに入れました
4. "**mysql -u root -p < employees.sql**"　を入力<br>
　-uの後ろにはユーザー名<br>
　-pの後ろにはパスワード<br>
　デフォルトならpassを求められてもそのままEnterで大丈夫なはず<br>
5. "**mysql -u root -p employees -e "select * from employees LIMIT 10;**" を入力<br>
　レコードが表示されれば問題なく取り込めています。<BR>
<br>あとはお好きにイジり倒しましょう
<br>XAMPPのphpMyAdminnから色々するもヨシ
<br>そのままコマンドラインでやるのもヨシ　という具合で

##ハマったこと##
インポートするときの書き方が分からなくて若干詰まった
・**mysql <employees.sql**
・**mysql < -u root -p employees.sql**

こんな風に書いて何度か怒られました…
PHP: staticの挙動について

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、少しでも他の初学者のお役に立てればと思い書いています。

今回は、PHPを学ぶ過程で、staticについて気になったので調べてみました。
間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##staticの使い方
staticを宣言することで、``クラスに属したプロパティまたはメソッド(newせずに利用できるプロパティやメソッド)``になります。

つまり、**インスタンスの状態に依存しない処理**をさせることができます。
これはユーティリティメソッドとも呼ばれ、決まりきったお約束の処理などに用いられます。

※静的メソッドの中では$thisは使えませんので注意してください。

##プロパティにstaticをつけた場合

**プロパティが属するクラスに固定で配置される**

属するクラスが固定されるということは、どこからでもこのプロパティにアクセスできるということであり、また、インスタンス間で共通としてプロパティが存在することになる。

サンプルを作成して挙動を確認してみたいと思います。


```php

<?php 
class StaticNum
{
	//staticプロパティ
 	public static $stNum = 0;  
  	//通常のプロパティ
    	public $num = 0;  
 
    //プロパティに引数の値を加算するメソッド
    public function count(int $plus)
{
        //staticプロパティに加算     
	 self::$stNum += $plus;  
        //通常プロパティに加算
        $this->num += $plus;  
}
}

//StaticNumbersインスタンスを2つ作成
$staticA = new StaticNum(); 
$staticB = new StaticNum(); 

//Aのcount()を引数5で実行
$staticA->count(5);  
//Aのプロパティを出力
echo "AのstNum:" . $staticA::$stNum. "num:" . $staticA->num;

//Bのcount()を引数10で実行
$staticB->count(10); 
 //Bのプロパティを出力
echo "BのstNum: " . $staticB::$stNum . "num:" . $staticB->num;  

//実行結果
AのstNum: 5 num: 5
BのstNum: 15 num: 10
```

上記の結果からわかるように、
本来ならばインスタンスを作成して実行すると、2つのプロパティそれぞれに5と10が別々に加算され、staticAのプロパティは5の値を持ち、staticBのプロパティ は10の値を持つはずであるが、``public static $stNum = 0;``のようにstaticを使い、静的プロパティとすると、プロパティがクラスに属し、インスタンスからは独立して値を持つようになる。

結果として、インスタンスから見たクラスに属するプロパティ``($stNum)``は1つである為、**加算対象が$stNumのみとなり**、5が加算された後に10も加算され、$stNumは15の値を持つこととなる。

##いまいち使いどころがわからない

staticメソッドに関しては普通のメソッドと比較しても使い方がほとんど変わらず、、、。

アサーションメソッドをstatic宣言することで、 テストオブジェクトのスコープを超えた再利用を可能にする時に使うのだろうと勝手に思っています。

もしよろしければstaticはこのように使うべきだ等の知見がございましたら、コメントにてご教授いただきたく存じます。

よろしくお願い致します。

##参考文献
[PHP manual static キーワード](https://www.php.net/manual/ja/language.oop5.static.php)
[PHP: 静的メソッドは何のためにあるか？Qiita]
(https://qiita.com/suin/items/0897adc7dc653b9c20de)
yukicoder contest 285 参戦記

# yukicoder contest 285 参戦記

★2.5とはいえども4つもあればどれかは解けるんじゃないかと思って考えていたら意識が飛んで、起きたら25時過ぎだった(笑).

## [A 1415 100の倍数かつ正整数(1)](https://yukicoder.me/problems/no/1415)

書くだけ……といいつつ、最初はちゃんと問題文を読んでいなくて、`print(abs(N) // 100)` で出して WA を食らった(馬鹿). まあ、100で割れば答えが出ますよね.

```python
N = int(input())

if N < 0:
    print(0)
else:
    print(N // 100)
```

## [B 1416 ショッピングモール](https://yukicoder.me/problems/no/1416)

一目で店員数が多い店から入れていけばいいことは分かるはず.

```python
from math import log2

n, *A = map(int, open(0).read().split())

A.sort(reverse=True)

result = 0
for i in range(n):
    result += int(log2(i + 1)) * A[i]
print(result)
```

## [F 1420 国勢調査 (Easy) ](https://yukicoder.me/problems/no/1420)

コンテスト後に解いた. 連立一次方程式と同じで、関係する未知数のどれかが1個分かればドミノ倒しのように全部定まるので、まず Union Find で関係しているグループを求める. グループが求めれたらどれか一つを0として、ドミノ倒しで全部求めれば良い. 求まったら最後に矛盾したものがなかったかをチェックして、矛盾があったら -1 を、無かったら求まった答えを出力する.

```python
from sys import setrecursionlimit, stdin


def find(parent, i):
    t = parent[i]
    if t < 0:
        return i
    t = find(parent, t)
    parent[i] = t
    return t


def unite(parent, i, j):
    i = find(parent, i)
    j = find(parent, j)
    if i == j:
        return
    parent[j] += parent[i]
    parent[i] = j


readline = stdin.readline
setrecursionlimit(10 ** 6)

N, M = map(int, readline().split())

parent = [-1] * N
d = {i: {} for i in range(N)}
vs = []
for _ in range(M):
    A, B = map(lambda x: int(x) - 1, readline().split())
    Y = int(readline())
    vs.append((A, B, Y))
    d[A][B] = Y
    d[B][A] = Y
    unite(parent, A, B)

result = [-1] * N
q = [i for i in range(N) if parent[i] < 0]
for i in q:
    result[i] = 0
while q:
    a = q.pop()
    for b in d[a]:
        if result[b] != -1:
            continue
        result[b] = result[a] ^ d[a][b]
        q.append(b)

for A, B, Y in vs:
    if result[A] ^ result[B] == Y:
        continue
    print(-1)
    exit()
print(*result, sep='\n')
```
PC-9801でインターネット

１年くらい前に同じような記事が話題になっていましたが、PC9801FA2が復活したので試してみました。

PC-9801のMS-DOS上のIPスタック[TEEN](http://www.pc88.gr.jp/~teen/wiki/index.php?TEEN)というものがありました。現在でもページはありダウンロードできます。これをダウンロードして試してみます。

TEENはシリアル(PPP)とEthernetのサポートがあり、シリアルの方を使ってみます。TEENは90年代後半にパソコン通信などでPPPを使ったIP接続を提供するようになって、それを使うために作られたようです。当時の接続は電話回線でモデムを使って行われていました。TEENではモデムを使った接続のほかにサーバーに直結で使うこともできます。

PPP以前にもシリアルを使ったIP接続はありSLIPと呼ばれていました。これは認証などの仕組みがなく非常に原始的なものでした。PPPはそれを改良したものといわれていますが、PPPで考えられた仕組みはWiFiやPPPoEなどにも引き継がれていて重要な成果だったと思います。

TEENのソースは公開されていて、中身を見るとCとアセンブラで作られています。

シリアルの接続先は[VALUESTARにインストールしたFreeBSD/i386 12.2R](https://qiita.com/yamori813/items/2cdc2f8164e3973eb240)です。クロスケーブルで接続してあります。

![PC98INET.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8fcf9370-acd3-6a0b-7d98-35d4ee33afbe.png)

PC-9801で直接ダウンロードはできないので、ダウンロードしたファイルをFreeBSDからYMODEMでPC-9801に転送して解凍しておきます。

FreeBSDでは以下のように設定します。

```:/etc/ppp/ppp.conf
default:
 set device /dev/cuau0
 set speed 9600

in:
  set ifaddr 192.168.0.200 192.168.0.201
  enable proxy
  enable dns
  set dns 192.168.0.1
  set timeout 0
```

パケットがEther側に転送されるように設定します。（ここ大事）

```
% sudo sysctl net.inet.ip.forwarding=1
```

TEEN.DEFの[DIAL] 100を3にします。

これでPC-9801側でTEENとTOPENを起動します。

その後にFreeBSDでpppを起動します。

```
% sudo /usr/sbin/ppp -auto in
```

DNSがうまく引けないようなのですが、www.yahoo.co.jpにpingが通りました。

![IMG_20210306_114141.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a4c1422a-a192-47b4-bcad-f663bee795c7.jpeg)

TEENでは9600以上のボーレートも設定できるようですが、正式なボーレートではないため、FreeBSDで設定不可能なので使えません。

追記：

DNSサーバはpppで渡されるアドレスではなくTEEN.DEFの中の設定されているアドレスが使われているようです。

# netgraph編

FreeBSDにはnetgraphというネットワークのフレームワークがあり、これでもpppサーバが作れます。netgraph自体は標準のインストールで入りますが、mpd5というpkgが必要になるのでインストールします。設定は以下のとおりです。

```:/usr/local/etc/mpd5/mpd.conf
in:
        create bundle static B1
        set iface enable proxy-arp
        set ipcp ranges 192.168.0.200/32 192.168.0.201/32

        create link static L1 modem
# Set bundle to use
        set link action bundle B1
        set link no pap chap eap chap-md5
        set link enable pap
# Configure modem
        set modem device /dev/cuau0
        set modem speed 9600
        set modem watch -cd
        set modem idle-script Direct
# Permit incoming calls using this link
        set link enable incoming
```

```:/usr/local/etc/mpd5/mpd.script
Direct:
        set $IdleResult "answer"
        success
```

mpd.secretの中にUSERNAME/PASSWORDを入れて、mpd5を実行します。

```
% sudo /usr/local/sbin/mpd5 in
```

netgraphはたくさんのカーネルモジュールにより構成されておりmpd5を起動すると必要なカーネルモジュールがロードされます。

mpd5のpppの設定はネットを検索してもほとんど出てこなかったので、マニュアルを読むのが良さそうです。

http://mpd.sourceforge.net/doc5/mpd.html

pppコマンドはtunインターフェースを使って、netgraphはngインターフェースを使います。FreeBSD 8以前はpppdというコマンドもあったようですが、pppコマンドにマージされたようです。

TEENに対応したSNTPのクライアントがあったので試してみました。

```
B>SET TZ=JST-9
B>SNTPGET ntp.nict.jp
```

以下のページでTEEN対応のアプリケーションをまとめられてます。

http://www.abk.nu/~kattyo/links/tlinks.htm

PC-9801のMS-DOSでインターネット接続はTEENの他にWATTCP98というものもあったようです。WATTCP98はWATTCPを98に移植したもののようですが、すでにサイトもなくなっていて詳細は不明です。
【LOG】Conda環境 開始／終了方法

# はじめに
* 気づくと、プロンプトの最初に `(base)` という表示があった
* どうやら、Conda環境がアクティブになっているかららしい
* Conda環境開始した覚えは…あった💦 Conda環境について簡単な説明を踏まえ、Conda環境の終了方法を記載する

#1. Conda環境とは
* Conda環境は独立したPythonの実行環境
* 他の環境に影響を与えずに、Pythonのバージョン切り替え、パッケージインストールできる

#2. Conda環境 開始方法
* `conda activate` コマンドで開始する
* 環境名を指定せずに `conda activate` コマンドを実行すると、デフォルトのConda環境 `base` 環境が有効になる
* Conda環境が有効になると、コマンドプロンプトに (環境名) が表示される
* Conda環境では、Anacondaが配布するPythonを実行できる

```
% conda activate

(base) %
```

#3.Conda環境 終了方法

```
(base) % conda deactivate
```