OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】find,find_by,where それぞれのメソッドの違いと使い方

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



#対象者

・findメソッドとfind_byメソッドとwhereメソッドの違いを知りたい方
・違いを理解した上で運用していきたい方

#目的

それぞれ３つの違いを理解した上で使用できること


#実際の手順と実例
###1.find
findメソッド

`````
モデル名.find(主キー)
`````

<使い方>

◎ 前提：Bookモデルに格納されているデータを取り出したい

```
class BooksController < ApplicationController
:
:
 def show 
    @book = Book.find(params[:id])
 end
:

:
end
`````````

* id = 1,2,3,,,,とひとりずつのIDを取得できる

###2.find_by

* 主キー（id）以外のカラムを指定しても見つかったレコードを返せる
* 数字だけでなく文字（id）以外も記述可能
* 検索になかった場合nilで返す

````
モデル名.find_by(任意のカラム名: 格納されている値)
`````

◎ 前提：Bookモデルに格納されているデータを取り出したい

* titleカラムに「hello」で投稿されたレコードを取得したい
  
````
Book.find_by(title: "hello")
`````


* bodyカラムに「world」で投稿されたレコードを取得したい
   
  

`````
Book.find_by(body: "world")
`````

* titleカラムに「hello」,bodyカラムに「world」で投稿されたレコードを取得したい

````
Book.find_by(title: "hello",body: “world”)
``````




###3.where


* where()の()内は数字（id）でも文字（id以外）も可能
* 該当する複数レコードを取得することができる
* 検索で見つからなかった場合、空の配列を返す

`````
モデル名.where(任意のカラム名: 格納されている値)
`````

◎ 前提：Bookモデルに格納されているデータを取り出したい

* titleカラムに「hello」で投稿された全レコードを取得したい場合

````
Book.where(title: "hello")
`````

* bodyカラムに「world」で投稿された全レコードを取得したい場合

``````
Book.where(body: "world")
`````

* titleカラムに「hello」、bodyカラムに「world」で投稿された全レコードを取得したい場合

``````
Book.where(title: "hello",body: "world")
```````


Railsのコントローラー内で使って定義して使う！！
【論文要約】テキストから画像を生成する「DALL-E」

## はじめに
2021年にOpenAIによって公開された、テキストを画像に変換する「DALL-E」についてまとめました。

## 生成した画像
「バレリーナの衣装を着て、犬の散歩をする赤ちゃん大根」の画像です。データセットにない画像も生成できるのが強みのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/37944582-f702-b42c-0948-a0612e078779.png)

GANを用いた既存手法と比較しても生成画像の精度の高さが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/9a9c5e8c-1476-64df-258c-f9085f76fbc4.png)

## 要約
テキストから画像を生成する従来の研究は、以下のような問題がありました。

* ドメイン特化のデータセットを利用
* 複雑なアーキテクチャになりがち
* セグメントマスクや物体ラベルなどの副次的な情報が必要

本研究では、テキストと画像のトークンを単一のデータストリームとして自己回帰的に[Transformer](https://arxiv.org/pdf/1706.03762.pdf)で学習することで、シンプルなアーキテクチャながらも既存法に匹敵する精度を出しました。

## 結論
* ドメイン特化の手法と比較したり、単一の生成モデルとしての能力を調べると、いい精度でした
* パラメータ数を増やすとさらに精度が上がります

## アーキテクチャ

### モデル
[Sparse Transformer](https://arxiv.org/pdf/1904.10509.pdf)を利用しています。これは、通常の[Transformer](https://arxiv.org/pdf/1706.03762.pdf)に対してマスクをかけて自己回帰的に学習するよりもメモリにやさしい手法です。

### データセット
COCOなどのデータセットに加え、2.5億のtext-imageペアをインターネットから収集して学習させました。

### 学習方法
ピクセルを一列に入力するのは、高解像度画像の場合メモリオーバーになってしまうため、2段階の学習を行うことで解決しました。

1. discrete variational autoencoder (dVAE) を用いて256×256のRGB画像を32×32=1,024に圧縮し、画像vocabulary（コードブック）を8,192とします。離散VAEについては[こちら](https://qiita.com/shionhonda/items/e2cf9fe93ae1034dd771)が分かりやすいです。
2. 256個のテキストトークンと、1,024個の画像トークンを結合して、joint distribution (テキストのvocabulary: 16,384、画像のvocabulary: 8192) から自己再帰的学習を行います。単語embeddingも画像embeddingもサイズは3,968とします。

その他、attention layerは64層で、attention headは62個としています。
また、position embeddingは以下のように足し合わせています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/01f0fd8a-877b-a0a0-2a96-631c64f03329.png)
クラスをバインドしたListBoxにデザインモードでサンプルデータを表示する

##やりたいこと
クラスをバインドしたListBoxにデザインモードでサンプルデータを表示したい。
ListBox内のデザインをするときに毎回実行しないといけないのが辛い。

##方法

```wpf:xaml
<Window
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:local="clr-namespace:WpfApplication1"
  d:DataContext="{d:DesignInstance local:SampleData,IsDesignTimeCreatable=True}"
  mc:Ignorable="d"
 ・
 ・
 ・
<ListBox ItemsSource="{Binding Path=ListDatas}">
・
・
・
```

```wpf:ソース
namesplace WpfApplication1
{
  /// 実際にバインドしてるのはコレ
  public class ViewData
  {
      public ObservableCollection<ListData> ListDatas { get; set; }
  }
  public class ListData
  {
      public string Name { get; set; }
  }

  /// デザイン用にデータを設定するサンプルクラス
  public class SampleData : ViewData
  {
      public SampleData()
      {
          // テスト用データ追加
          this.ListDatas = new ObservableCollection<ListData>()
          this.ListDatas.Add(new ListData()
          {
              Name = "Hoge"
          });
          this.ListDatas.Add(new ListData()
          {
              Name = "Piyo"
          });
      }
  }
}
```

##あとがき
これでデザインモードで「Hoge」「Piyo」が表示されてちょっと感動。
完全な備忘録。すぐ忘れるからなー。
Cloudflare キャッシュのデフォルト挙動確認



# 参考：デフォルト挙動

よくあるのがデフォルトで `.html` はキャッシュされない点に注意。
また、`image/png` のような MIME タイプには関係なく、あくまで URL の拡張子ベースでキャッシュするかどうかを判断している点に注意。

> [Understand file extensions cached by default – Cloudflare Help Center](https://support.cloudflare.com/hc/en-us/articles/200172516-Understanding-Cloudflare-s-CDN#h_a01982d4-d5b6-4744-bb9b-a71da62c160a)
> Cloudflare only caches based on file extension and doesn’t cache by MIME type. The Cloudflare CDN automatically caches files containing certain  file extensions and doesn’t cache HTML by default:
> ![image-20210708171521580](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210708171521580.png)

# 拡張子がある画像 URL

`https://*.company/png/*.png` という拡張子を含む画像 URL は、デフォルトでキャッシュされる。

![image-20210708172605660](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210708172605660.png)

# 拡張子がない画像 URL

`https://*.company/foo/bar/` というように画像ファイルが表示させる URL であっても、`*.png` というように末尾に拡張子がない場合は、たとえ `Content-Type: image/png` となっていてもデフォルトでキャッシュされない。（キャッシュさせたい場合は、個別に `Cache Level = Cache Everything` 等の Page Rule を設定する）

![image-20210708172221358](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210708172221358.png)

# 参考

- [画像ファイルの拡張子でないURLから 画像ファイルを返すPHPコードの例 – ラボラジアン](https://laboradian.com/code-sample-return-img/)
- [「MIMEタイプ」と「Content-type」の違い｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/diff324type.html)
slackのコードブロックやコードスニペットを活用しよう！

slackで質問する場合のコードを共有する場合はいくつか方法があります。
１：コードブロック
２：コードスニペット


短いコードの場合はコードブロックを使ってコードを投稿しましょう。
![コードブロックを利用したコードの共有方法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/1faae843-c409-37e7-57ff-5d3b16de4e15.png)



コードが長くなった場合はスニペットを使用してファイルとして投稿しましょう！
![コードスニペットを利用したコードの共有方法.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/a564f5ac-a6f8-9dc8-c053-4dc6c4e907f6.gif)
redux-toolkitの”Error: Actions must be plain objects. Use custom middleware for async actions”で２つ日詰まった話

reduxにてdispatchするときに
```
Error: Actions must be plain objects.
Use custom middleware for async actions
```
のエラーが出て２日間先に進めなかった... ...
だが[この記事](https://stackoverflow.com/questions/62988990/createasyncthunk-error-actions-must-be-plain-objects-use-custom-middleware-for)を見つけやっと解決した！
原因はredux-thunkのmiddlewareを読み込んでなかったことにある。
redux-toolkitをドキュメントを読まずに色々勝手にやってくれると思っていた自分を殴りたい
2.3(標準) 分布関数，密度関数の定義3

## 方針

2.1,2.2でも見た通り確率密度関数での定義を満たすことを示すためには非負性と全確率1を確かめれば良い．

ある確率密度関数fに対し定義域をある定数a以上の領域に限定したい，となったとき，単に「a以上だよ！」とするだけでは全確率1を満たさなくなってしまう．その際，全確率1を満たすための正規化定数は1-F_X(a)となり，これを打ち切り分布という．

## 答案

関数g(x)は，

```math
\begin{align}
g(x)=
\begin{cases}
\frac{f(x)}{1-F(a)}\ \ \ \ \ \ \mathrm{if}\ a\leq x\\
0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \mathrm{if}\ x<a
\end{cases}
\end{align}
```

と書けるので，任意のxに対し，g(x)は非負である．また，

```math
\begin{align}
\int_{-\infty}^\infty g(x)dx&= \int_a^\infty\frac{f(x)}{1-F(a)}dx+\int_{-\infty}^a0dx\\
&= \frac{1}{1-F(a)}\{\int_{–\infty}^\infty f(x)dx-\int_{-\infty}^af(x)dx\}\\
&= \frac{1}{1-F(a)}(1-F(a))\\
&= 1
\end{align}
```

より，g(x)は全確率1を満たす．また，f_X(x)=e^{-x}, 0<xとすると，

```math
\begin{align}
F_X(x)&= \int_0^x e^{-t}dt\\
&= \left[-e^{-t}\right]_0^x\\
&= -e^{-x}+1
\end{align}
```

なので，a=1で打ち切った分布は

```math
g(x)=\frac{e^{-x}}{1-(e^{-1}+1)}=e^{-(x-1)}
```

となる．

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
ScriptableObjectの使い方使い道

#ScriptableObjectとは
* 同じデータを何度もインスタンス化しないように同じインスタンスを参照する。
* インスペクター上でキャラクターとかのステータス変更を容易にする。
* データの構造を統一して、データの枠を作れる。

正直こんな言い方していいのかわからないけど、この3つの使い方、もしくはこれらを複合して使える。

本来の使い方はこんな感じ(なのかな？)
https://ekulabo.com/about-scriptable-object
ドラクエにスライムが9匹ぐらい出る戦闘がある。
このスライム1体ずつをインスタンス化するとその分メモリを食うので、参照先を同じにすることで食うメモリを減らせる。
これが9体だからいいけど、1000体とかに増えると同じところを参照したほうがいいよね。

#ScriptableObjectの利点
ScriptableObjectにGameObjectやPrefabを入れれること。
https://qiita.com/toRisouP/items/1d0c8e3d8040cbb413fc
これでいちいちprefabから呼び出す必要がない。というか扱いやすい。
それでいて、同じオブジェクトでもステータスをインスペクター上変えられる。
例えば武器のデータを作るためにこんなScriptableObjectを作ってみる。

```C#:&#x20;WeaponData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "MyScriptable/Create WeaponData")]  
//project上でWeaponDataを新規作成できるようにする
public class WeaponData : ScriptableObject {
    public string weaponName;//武器の名前
    public bool unlock;//武器の解放条件
    public GameObject gameObject;//武器本体
    public int level;//武器の強化情報
    public int weaponCost;//武器強化にかかる値段に影響する1～4の4段階
    public int WeaponUpgrage(int level) { //実装中の機能
        int value = level * weaponCost * 100;
        return (value);
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/d5a49d2f-1a0f-f2ac-299d-75251800c1e8.png)
するとこんな感じで、projectからScriptableObjectを作成できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/70a5acc5-ca25-ed82-52dc-c16b912f8cd8.png)
新規作成するとこんな感じ。立方体に｛｝がついてるのがScriptableObjectの特徴
新規作成したオブジェクトはインスペクター上でいろいろ設定できる。
設定したデータが武器1つのデータとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/b2b94879-1e24-2d51-2d22-24dd85218213.png)
なんかこんな感じに、たくさん作ったら武器データをたくさん作れる。

#ScriptableObjectのデメリット
データのサイズがとんでもなく大きくなるとエクセルとかで扱った方が便利になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/4334c125-812c-8851-1d0a-927af34b90f1.png)
たくさんの武器の攻撃力をソートするとか、カテゴリごとに処理するなど。
大量のデータ処理に関してはScriptableObjectは使いづらいのでは？

#結論
あれ、これ普通のScriptでもいいんじゃない？って使い方をしている。
使いどころを間違えている気がしてならない、特に武器データに関しては。
ただ、**武器データの構造の統一**という面ではWeaponDataを作る意味がありそうだった。


参考文献
公式リファレンス
https://docs.unity3d.com/ja/540/Manual/class-ScriptableObject.html
わかりやすい入門記事
https://qiita.com/4_mio_11/items/a7d8967b853cef4385cd
公式の3つの使い方
https://unity.com/ja/how-to/architect-game-code-scriptable-objects
Java開発環境

#環境構築とは

環境構築とは、プログラムを書いたり、実行できたりする環境を自分のコンピュータに
整えることを言います。

#必要なモノ

私は環境構築のために、JDKとVisualStudioCodeをインストールしています。
JDKとはJavaのプログラムを実行する時に必要な機能がパッケージされたモノです。
VisualStudioCodeはプログラムを書くためのエディタで、VScodeとも呼ばれています。
また、私がMacを使っていますので、全てMac用になっている点はご了承下さい。

#手順

まずはオラクルのサイトからJDKをダウンロードしましょう。
下記のJava SEをクリックして下さい。
![スクリーンショット 2021-07-08 16.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/9d7d7b21-62e8-6528-ab9e-742a49456f63.png)

次は以下をクリックして下さい。また、2021年7月8日の時点ではJava SE 16を使用しています。
![スクリーンショット 2021-07-08 16.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/15504a82-2dee-85bf-ad45-f12fbcc499bd.png)



そして、この画面の印の付いている所をクリックして下さい。
![スクリーンショット 2021-07-08 16.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/822f96c3-cfc6-7d44-63bf-ca6ef7b63e10.png)

以下の様な画面が出るので、四角のボックスにチェックを入れて、ダウンロードしましょう。
![スクリーンショット 2021-07-08 16.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/9550a6da-dc42-97c2-adff-07beb94b92a2.png)
そしてダウンロードしたモノをクリックして、インストールを完了させて下さい。
これで、JDKのインストールは完了になります。

念のため、ターミナルでJavaのバージョンを確認しましょう。

```
$ java -version
```
少しの違いはあるかもしれませんが、以下の様に出力されていたら完了です。

```
java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
```

次はVisual Studio Codeをダウンロードしていきます。
まずは以下をクリックしましょう。
![スクリーンショット 2021-07-08 16.53.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/1de9213f-94fd-545a-fce0-b32b831cbf3d.png)

次にDownload nowをクリックします。
![スクリーンショット 2021-07-08 16.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/289af3a9-5209-4291-566b-93f0970a420d.png)

切り替わった画面でMacのところをクリックします。
![スクリーンショット 2021-07-08 16.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/2789bf9b-b952-047d-597f-b404c881634d.png)


ダウンロードが完了したらzipファイルを解凍して、出たVisual Studio Codeを開きます。
以下の画像の様な画面になったら、拡張機能を設定するために以下のところをクリックします。
![スクリーンショット 2021-07-08 17.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674758/04de88c6-a4df-9b71-46da-94605d9648bf.png)


検索するところで、Japaneseと検索をして、Japanese Language Pack for Visual Studio Code
をインストールして下さい。その後、再起動すると日本で表示されています。
同様の方法で、Java Extension Packをインストールしましょう。
これで開発環境の設定は以上になります。

#最後に

最後まで見て頂き、ありがとうございます。
もし不明な点や改善点などがございましたら、コメントを頂けますと幸いでございます。
【GitHubとAWS codeCommitをミラーリングさせる手順７】

## １. codeCommit側にリポジトリを適当に作っておく
直感的に操作できるのでかんたんに作れる.

## ２. パスフレーズなし秘密鍵をローカルの.sshで生成
`ssh-keygen -t rsa -b 4096 -m PEM -C -f <filename> <githubアカウントメールアドレス>`
注：OpenSSHの構成がOpenSSH 7.8から変わりヘッダが

```
-----BEGIN RSA PRIVATE KEY-----
```
から

```
-----BEGIN OPENSSH PRIVATE KEY-----
```

に変わり、ActionでのSSH接続が失敗する場合がある.
その対策のため、`-m PEM`をオプションに追加してSSH鍵を生成する.
参照記事URL[https://qiita.com/miu200521358/items/8e2875e9c96249261f66#02-パスフレーズなしのssh鍵を生成するローカル](https://qiita.com/miu200521358/items/8e2875e9c96249261f66#02-%E3%83%91%E3%82%B9%E3%83%95%E3%83%AC%E3%83%BC%E3%82%BA%E3%81%AA%E3%81%97%E3%81%AEssh%E9%8D%B5%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB)

## ３. 公開鍵をIAMに登録する

`pbcopy < ./<filename>.pub` 
上記コマンドでローカルの~./sshで作成した公開鍵の内容をコピー
IAMの「AWS CodeCommit の SSH キー」にある「SSH パブリックキーのアップロード」に登録する.

## ４. githubのSecretsに秘密鍵とSSHキーIDを登録する

codecommitと連携させるgithubリポジトリのsettingタブ内にある、Secrets->Actionsから「new repository secrets」を選択.

codecommitのSSHキーに登録する際に、生成した秘密鍵(`<filename>`)とcodecommitに登録した公開鍵のID(SSHキーID)を変数化する.

`pbcopy < ./<filename>`
上記コマンドで秘密鍵の内容をローカルの./sshからコピーする。
 公開鍵のID(SSHキーID)はIAMのコンソール画面から確認可能

```docker
CODECOMMIT_SSH_PRIVATE_KEY = ローカルで作成した秘密鍵と一緒に生成された秘密鍵(<filename>)
CODECOMMIT_SSH_PRIVATE_KEY_ID = AWS CodeCommitのSSHキーIDを入力
```

## ５. .gitattributesファイルを生成する

このファイルでcodecommitにミラーリングするべきでないファイルなどを制御できる.

## ６. Git Actionからミラーリング設定を行う

ミラーリングさせたいgithubリポジトリの**Actionタブ**から「set up a workflow yourself→」をクリック.
デフォルトのmain.ymlのまま以下のコードを貼り付け.
参照元URL[https://hikari-blog.com/github-codecommit-mirroring/](https://hikari-blog.com/github-codecommit-mirroring/)

※2023/07/28 ubuntuのversionを更新しました(18.04が非推奨になっていたため)

```docker
name: Mirroring

on: [ push, delete ]

jobs:
  to_codecommit:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v1
      - uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/<repository-name>
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY_ID }}
```

## ７. ミラーリング結果の確認

ミラーリングが完了していれば緑のcheckマークが付く
![1766EE56-EF9B-44E1-A4A1-C83E5F011C13.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530710/d2a5ee4f-7c58-a825-ed77-952a59f05072.jpeg)
Mac ターミナルのデフォルトのシェルを「bash」から「zsh」に変更する

#Macのターミナルで「デフォルトのシェルが変わったよ！」が毎回でる

```console
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

ターミナルを開くたびに見かけるこのメッセージ👆

```console
chsh -s /bin/zsh
```

このコマンド実行しても何も変わらない。。。
一体何のことだかよくわからなかったので、ここに記録する！

#そもそもシェルとは？

>OSとアプリケーションの間に立ってユーザからの要求をシステムに伝えるためのユーザインターフェースで、要はコマンドを入力することで動くプログラムのことをシェルといいます。
https://mykii.blog/what-is-shell-bash-and-zsh/

わかるようでわからない。。。

>シェル（英：shell）とは
コンピュータ株式会社の受付のおねーさんのこと。
もう少し真面目に書くと
人間様からの入力をコンピュータさんに伝えるプログラムのこと
です。
イメージしにくければ
Windowsにおける「コマンドプロンプト」みたいなもの
と考えても構いません。
https://wa3.i-3-i.info/word11219.html

まぁ要はMacで言う「ターミナル」みたいなものかな。

#シェルにもたくさん種類がある

>一番よく使われているのはbash（ばっしゅ）というシェルで、UNIX上の昔からある一番古いshというシェルに拡張機能を追加したものです。Linuxの標準シェルにもなっていて一番スタンダードです。
https://mykii.blog/what-is-shell-bash-and-zsh/

Mac OSが「Mojave」から「Catalina」にアップグレードした時、**デフォルトのシェルが「bash」から「zsh」に変わったようです。**

https://mac-ra.com/catalina-zsh/

#「bash」から「zsh」に変更する
![スクリーンショット 2021-07-07 19.40.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ad28219b-cd01-187a-7e82-175615699e61.jpeg)

![スクリーンショット 2021-07-07 19.41.01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/0c04b754-1717-5967-1f24-5ea9388347ac.jpeg)

![スクリーンショット 2021-07-07 19.41.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/880ab9af-982f-9723-3a59-851e20eb97eb.jpeg)

#最後に
**bashの設定をzshに移す作業**というのが必要なんだとか。。。

https://qiita.com/tkooler_lufar/items/66e8fa451185e812a33a

うーん、難しそうやから今度します！
BH3-FA F2FSフォ－マットされたディスクイメージを拡張する方法

####はじめに
16GBのOSイメ－ジを32GB以上のSDカ－ドに書き込んだ場合16GBまでしか認識できません。普通はraspi-configで拡張できますが、F2FS(NANDフラッシュメモリ向けに最適化されたファイルシステム)でフォーマットされたイメージはそれだけで拡張できません。

ビズライト・テクノロジー社製BH3-FAはF2FSでフォーマットされたSDをセットでお使いいただくことで耐久性の向上を図っています。

####準備
拡張したいSDカード(A)の他に別途Raspberry Pi OSが入ったSDカード(B)が必要です。

####カード容量を拡張する
SDカ－ド(A)をBH3-FAのSDカードスロットに挿入し起動し、下記のコマンドを実行します。

```
$ sudo raspi-config
```
コンフィグ画面から「7 Advanced Options」⇒「A1 Expand Filesystem Ensuress」を選択し再起動します。再起後システムをシャットダウンして電源を切り、SDカードを外します。（この時点ではF2FSとして拡張が完了していません)

####SDカード(B)にF2FSで拡張するための環境を作る
SDカード(B)をBH3-FAのSDカードスロットに挿入し起動する。下記のコマンドを実行します。（f2fs-tools がインストールされます。）

```
$ sudo apt install f2fs-tools 
```

####SDカード(A)を拡張する
SDカード(B)をBH3-FAのSDカードスロットに挿入し起動する。SDカード(A)をUSBカ－ドリ－ダーにセットしBH3-FAのUSB端子に接続します。SDカード(A)がが認識されたあと、下記コマンドを実行します。

```
$ sudo umount /media/pi/rootfs
$ sudo umount /media/pi/boot
```

続けて下記のコマンドを実行します。

```
$ sudo /sbin/resize.f2fs /dev/sda2
```
「Done.」と表示されるまで待ちます。リサイズが終了したら、シャットダウンしてください。 

###結果の確認
SDカード(A)をBH3-FAのSDカードスロットに挿入し、起動します。
下記のコマンドを実行し、32GBのSDカードの場合はサイズが下記のように表示されます。

```
$ df –h
ファイルシス   サイズ  使用  残り 　使用% マウント位置
/dev/root      30G  　3.0G  27G   11% 　 /
```
|![main_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/afd10958-cd18-0f19-3b18-156e05c4c6c7.jpeg)
|:--:|
|【ビズライト・テクノロジー社製BH3-FA】
BHシリーズは、株式会社ビズライト・テクノロジーが開発・生産する、シングルボードコンピュータの実用化した商品です。BHシリーズではRaspberryPiを産業利用するための対策が施されています。詳しくは、[こちら](http://bh.bizright.co.jp/)をご覧ください。
2.2(標準) 分布関数，密度関数の定義2

## 方針

分布関数は，全確率1と単調非減少を満たす．単調非減少は，分布関数の微分である確率密度関数が定義域内の全てのxに対して正であることを確かめれば良い．

## 答案

### 1.

確率密度関数：

```math
f_X(x)=\frac{d}{dx}\frac{1}{1+e^{-x}}=\frac{e^{-x}}{(1+e^{-x})^2}
```

が定義域内で非負なので，F_Xは単調非減少である．また，

```math
\lim_{x\rightarrow\infty}\frac{1}{1+e^{-x}}=1,\ \lim_{x\rightarrow -\infty}\frac{1}{1+e^{-x}}=0
```

より，全確率1も満たすため，F_Xは分布関数．

### 2.

確率密度関数：

```math
f_X(x)=\frac{d}{dx}(1-\frac{1}{x^2})=\frac{2}{x^3}
```

が定義域内で非負なので，F_Xは単調非減少である．また，

```math
\lim_{x\rightarrow\infty}1-\frac{1}{x^2}=1,\ \lim_{x\rightarrow 1}1-\frac{1}{x^2}=0
```

より，全確率1も満たすため，F_Xは分布関数．

### 3.

確率密度関数：

```math
\begin{align}
f_X(x)&= \frac{d}{dx}\frac{\log x}{1+\log x}\\
&= \frac{\frac{1}{x}(1+\log x)-\frac{1}{x}\log x}{(1+\log x)^2}\\
&= \frac{1}{x(1+\log x)^2}
\end{align}
```

が定義域内で非負なので，F_Xは単調非減少である．また，

```math
\begin{align}
\lim_{x\rightarrow\infty}\frac{\log x}{1+\log x}&= \lim_{x\rightarrow\infty}\frac{1/x}{1+1/x}=1\\
\lim_{x\rightarrow 1} \frac{\log x}{1+\log x}&= 0
\end{align}
```

より，全確率1も満たすため，F_Xは分布関数．

### 4.

確率密度関数：

```math
\begin{align}
f_X(x)&= \frac{d}{dx}(1-e^{-\frac{x^2}{2}})\\
&= xe^{–\frac{x^2}{2}}
\end{align}
```

が定義域内で非負なので，F_Xは単調非減少である．また，

```math
\lim_{x\rightarrow \infty}1-e^{-\frac{x^2}{2}}=1,\ \lim_{x\rightarrow 0}1-e^{-\frac{x^2}{2}}=0
```

より，全確率1も満たすため，F_Xは分布関数．

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Node.jsでsetTimeoutを使ったタイマー

# はじめに

Node.jsでループ処理の勉強メモその2です。（その1はこちら：[Node.jsでsetIntervalを使ったタイマー](https://qiita.com/rjegg/items/68616809cba10810ec9d)）
今回はsetTimeoutを使ったパターンです。

# setTimeoutを使ったループ処理

setTimeoutは、[Node.jsのタイマー](https://nodejs.org/ja/docs/guides/timers-in-node)を参照すると、以下のように`setTimeoutは指定したミリ秒後にコードを実行する`とあります。

"When I say so" Execution ~ setTimeout()
> setTimeout() can be used to schedule code execution after a designated amount of milliseconds.

setTimeoutをループ処理に使うためにはsetTimeout関数をカウンターのような仕組みの処理の中に入れてあげれば良いようです（下記counterの処理）。停止処理のためには、setIntervalを使用した場合はclearIntervalを使いましたが、setTimeoutの場合はclearTimeoutを使います。
処理の内容自体は[前回記事](https://qiita.com/rjegg/items/68616809cba10810ec9d#%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC)と同じく、指定時間になるまで1秒おきに時刻を表示し、指定時間になると停止する仕様です。勉強目的なので、あまり込み入った処理は入れてません。

```javascript:timer2.js
'use strict';
require('date-utils');

var count = 0;
const counter = () => {
    var dt = new Date();
    var formatted = dt.toFormat("HH24:MI:SS");
    console.log(count++, "しばらくお待ち下さい、只今の時刻：",formatted);
    const timeoutId = setTimeout(counter, 1000);
    if(formatted === "16:20:00"){  //タイマーを止める時刻を指定する（未来の時刻を手動で指定する）
        clearTimeout(timeoutId);
        console.log('時間になりました！')
    }
} 
counter();

```

# 実行結果
実行前に前回同様前提として`npm install date-utils`を実行しておきます。
以下実行結果です。

```:実行結果
$ node timer2.js
0 しばらくお待ち下さい、只今の時刻： 16:19:50
1 しばらくお待ち下さい、只今の時刻： 16:19:51
2 しばらくお待ち下さい、只今の時刻： 16:19:52
:
10 しばらくお待ち下さい、只今の時刻： 16:20:00
時間になりました！

```

# おまけ
setTimeout、setIntervalを使った簡単なタイマーを作ってみましたが、両者は正確には下記のような挙動の違いがあるようです（下記サイト参照）。勉強になります。

>setTimeoutで繰り返し処理をおこなった場合：処理終了時点から一定時間後に同じ処理を繰り返す
>setIntervalで繰り返し処理をおこなった場合：処理開始時点から一定時間後に同じ処理を繰り返す


https://techacademy.jp/magazine/5541#sec4
Swiftの構造体、クラス、列挙型に関して


swiftのデータ型
--
Swiftにはデータ型がクラスと構造体と列挙型の３つの種類がある。
それぞれの違いがややこしいのでまとめてみる。

データ型の説明の前に値型と参照型の違い
--
そもそもコンピュータのデータはメモリのセルの中に格納される。
値型はそのセルの中に→データの中身そのものが入る。
対して参照型は→メモリアドレスが渡される。要はデータが格納されている場所の情報が入る。

例

```swift:title.swift
var atai = "値型"
var copy = atai
atai = "値型2"
print (atai) //値型２
print(copy) //値型
//ーー下記参照型--//
class Sansyo {
 var name: String
    init(_ name: String) {
        self.name = name
    }
}
var sansyo = Sansyo("参照型")
var copysansyo = sansyo
sansyo.name = "参照型２"
print(sansyo.name) // "参照型2"
print(copysansyo.name) // "参照型２"
```
値型はデータそのものを渡す文メモリの容量を取る。
参照型はそうでもない代わりに副作用を生む可能性がある
*副作用とは,,ソフトウェアの設計者の知らないうちにデータが変更されてしまうこと

クラスとは
--
他の言語でもおなじみのクラス型。

構造体、列挙型が値型に対して唯一の参照型となる
下記、書き方の例

```swift:Class.swift
class Boku {
//しっかり型指定
 var name: String
 var sex: String
 var age: Int
//初期化処理（イニシャライザー）、JSのconstructor()のようなやつ。インスタンスを作る時に自動で発動する
init(name: String, sex: String,age: Int){
 self.name = name//selfは自分自身のインスタンスを示している
 self.age  = age
 self.sex  = sex
}

let boku = Boku(name:"boku",sex:"man",age:23)//インスタンスの生成
print(boku.name) //”boku"
```
もちろん、クラス内にメソッドを定義することも可能となる。
また、クラスなので継承をすることができる（ここらへんはOOPを理解する必要がある）
親クラス（スーパークラス）や子クラス（サブクラス）の書き方は以下の通り。

```
class 子クラスの名前: 親クラスの名前 {}
```

また、オーバーライドやfinalによるオーバーライドの禁止する書き方もあるのでチェックする必要がある。
クラスは奥が深いので後日、細かく勉強してアウトプットしたい。


構造体とは
--
複数の値を一つの構造体として管理できるデータ型のこと
クラスと違い値型。
また、継承は使用できない。
プロトコルや拡張機能（extension)は使用できる。

構造体の書き方

```swift:kouzoutai.swift
struct Person {
var name: String
var age: Int
 mutating func changeAge(age: Int) {
 self.age = age
 }
}
let person = Person(name: "Boku", age: 23)
person.changeAge(age: 24)
```

書き方はクラスと非常に似ている。
型宣言しつつ、init()でイニシャライザーもできる。（もちろんなくても良い）
メッソド内でストアドプロパティを変更する際はmutatingをfuncの前に使用。
これも構造体だけで二本くらい記事かけそうなので後日細かい部分をアウトプットしたい


列挙型とは
---

列挙型とは


列挙型の書き方

```swift:rekkyo.swift
enum [enum 名] {
    case [enum 値1]
    case [enum 値2]
    case [enum 値3]
}

```

クラスと違って値型。init()によってイニシャライズを定義することができる
ストアドプロパティは定義できない。（コンパイルエラーになる）しかし、コンピューテッドプロパティとタイププロパティは定義できる。


＊コンピューテッドプロパティとは
計算されたプロパティ
ゲッター/セッターを使って他のプロパティを持ってくるもの
ゲッター→他のプロパティの値をもとに実行され、値をゲットしてくる。
セッター→自身の新しい値（デフォルトでNewValue)を利用して、他のプロパティの値を更新（セット）する
(値を保持しない）条件分岐や処理によって変動する。

＊ストアドプロパティとは
（値を保持する）
保有したプロパティ。よく見るやつ

```:StoredPropaerties
let name :String
```

＊タイププロパティとは
インスタンス化しないプロパティ。（staticがついている）


公式ドキュメントには他にもたくさんあるのでこれも後日記事を書く。
Xampp使用中現在出ている問題・未解決分

Xamppをインストールして設定しています。
右も左もわからずネットだよりなのですが、現在わからない問題もいくつかあるので
忘備録です。
解決したら解決策も記載します。

<h1>MYSQLのバッチからの起動はできるが停止ができない</h1>

![xampp01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939082/7edc8e44-33e9-065c-88be-6ee95d88a2f8.png)


指定パスが見つかりませんと表示

コマンドプロントに直接指定した場合
![xampp02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939082/d03244a5-bf6e-da55-318c-e43dff213478.png)

Mysql shutdowm ...

となるが　xammpコントロールパネルは停止しない。


解決策

わからない。
誰か教えてください。
コントロールパネルからの停止は可能。
ShopifyのProductにデータベースの製品データを連携するには？

XplentyのCurl Functionを使えば、Shopifyからデータを読み込むだけでなく、Shopifyにデータを書き込むことが可能です。
Xplentyのお客様には、これまで外部の仕入れ先から商品、在庫情報を取得し、Shopifyへデータを連携するプロセスをXplentyで自動化することで、マニュアルでの運用を排除し、自社のECサイトのオペレーションを大幅に簡略化かつ省力化することができました。

今回は、データベースの商品マスタをShopifyのProductに連携する方法を紹介します。

# 1. コネクションを作成する

## DBのコネクションを作成する
ConnectionのメニューからMySQLを選択し、必要な情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c4e370e0-d4b2-04b5-edb6-96df53ee3f0f.png)

## Shopifyのコネクションを作成する
ConnectionのメニューからShopifyを選択し、Shop addressを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/2b8759f6-5c55-77ed-8a6a-1269eb6f5ca8.png)

# 2. パイプラインを作成する
MySQLとShopifyのコネクションが作成できたら、Packageメニューに移動し、新しくパイプラインを作成していきます。
### データベースコンポーネントの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c0160322-02c4-0a3c-cc5e-6278fc8c5121.png)

### Selectコンポーネントの設定
Selectコンポーネントを追加し、式エディタで設定します。CCurl関数を使うことで、すでにXplentyで作成済みのコネクションを使用してアクセスすることが可能です。
`CCurl(param1,param2,param3,param4,param5)`

**パラメータの説明**
- param1: APIリクエスト先のURL
- param2: HTTPメソッドを指定。データを新規作成する場合、「POST」をセット、更新する場合は「PUT」をセット
- param3: HTTPヘッダー情報をセット
- param4: HTTPリクエストBody情報をセット
- param4: Xplentyでコネクション生成時に付与されるConnection IDをセット（コネクション画面で確認できます。）

#### リクエスト例1： Productを新規作成する

`CCurl(CONCAT('https://','xpjp2.myshopify.com','/admin/api/2021-04/products.json'),'POST','{"Content-Type":"application/json" }',CONCAT('{"product": {"title":"',title,'","body_html":"',body_html,'","vendor":"',vendor,'","product_type": "',product_type,'","status":"','draft','","tags":["',vendor,'"]}}'),'SHOPIFY_CONNECTION_12250')`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/89395947-1e6d-f68c-d2f8-8d7ac9691e36.png)

#### リクエスト例2： Productを更新する

`CCurl(CONCAT('https://','xpjp2.myshopify.com','/admin/api/2021-04/products.json'),'PUT','{"Content-Type":"application/json" }',CONCAT('{"product": {"id":"',id,'","title":"',title,'"}'),'SHOPIFY_CONNECTION_12250')`


### パイプライン
Curl関数を使用する場合もXplentyではDestinationコンポーネントをパイプラインに含める必要があります。今回の例では、Curl関数を実行した際に取得されるHTTP Responseの結果ステータスなどの情報をストアするために、S3などのFile Storageを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/0a7236da-d6ce-a065-f3e3-ecd8a1587a28.png)

これでパイプラインの設定は完了です。

# まとめ
Xplentyを使用することで、DBのデータを簡単にShopifyへ連携することができます。今回のブログでご紹介したとおり、DBから取得した情報をCurl関数を使用し、自由にカスタマイズし、データを送信することができるので、みなさんのユースケースに合わせて柔軟なパイプライン作成が可能です。
もし、興味のある方は、[XplentyのHP](https://www.xplenty.com/jp/)からオンラインデモにお申し込みください。
Vue.js+Vuetify+Railsでherokuデプロイ後にスタイルが崩れるときの対処

# 概要
1. hello_vue.jsに書かれている内容をすべてapplication.jsに移す
2. application.html.erbのstylesheet_link_tagをstylesheet_pack_tagに変更する

# 前提条件
以下のコマンドでアプリを新規作成。

```
% rails new xxx --webpack=vue
```
ディレクトリ構成
[![Image from Gyazo](https://i.gyazo.com/556e3cfea44d83da7ec2ab840df24407.png)](https://gyazo.com/556e3cfea44d83da7ec2ab840df24407)

# 対処法
### hello_vue.jsに書かれている内容をすべてapplication.jsに移す
デフォルトではhello_vue.jsにVueインスタンスを生成するコードが書かれている

```javascript:javascript/packs/hello_vue.js
import Vue from 'vue'
import App from '../app.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    render: h => h(App)
  }).$mount()
  document.body.appendChild(app.$el)

  console.log(app)
})
```
これらを全てapplication.jsに移す。↓

```javascript:javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
// 以下、hello_vue.jsから移してきたコード
import Vue from 'vue'
import App from '../app.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    render: h => h(App)
  }).$mount()
  document.body.appendChild(app.$el)

  console.log(app)
})
```
### application.html.erbのstylesheet_link_tagをstylesheet_pack_tagに変更する
```diff:views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Webpackvue</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
-   <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
+   <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```
Blender2.9のPythonスクリプトで頂点（vertices）の変更が反映されない人向けへの記事

　Blenderのバージョンを指定したのは、2.79以前を使っていたり、未来の人（もちろんBlenderのAPIも変わっている）が参照して困らないように、おおまかな時期の指標として書いただけで、特に2.8や2.9x間でシビアなバージョン指定があるという訳ではありません。

# 基本

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/2e7506c2-6111-43ab-67d2-1ba47c41ed03.png)

　キューブの頂点を変形させます。

```python
msh = bpy.data.meshes['Cube']
vts = msh.vertices
vts[0].co = (5,5,5)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/eea48089-a90d-4e8c-b761-6311ac41521d.png)

　こうなります。

　しかし**そうならない**時もあります。

# contextでアクセスしている

　Blenderスクリプトにおいて、データにアクセスする手段は主に2つあります。

- `bpy.data`
- `bpy.context`

　です。前者は一覧リスト（正確には辞書）から選ぶ方式。後者は現在選択している要素から選ぶ方式です。基本は都合に応じて使い分ければいいと思いますが、**`context`は読み取り専用**というトラップがあります。という訳で、以下のようなスクリプトを走らせた場合、**操作としては全く同じことをしているのに**値が変更されない※ということになります。エラーを出してくれないかな？

```python
obj = bpy.context.object
msh = obj.to_mesh()
vts = msh.vertices
vts[0].co = (5,5,5)
```

　対策は、メッシュの名前を取得してから`data`でアクセスし直すことです。

```python
obj = bpy.context.object
msh_name = obj.to_mesh().name
msh = bpy.data.meshes[msh_name]
vts = msh.vertices
vts[0].co = (5,5,5)
```

※正確には、頂点の座標のデータは変わっているのにそれがシーンに反映されないようです。

# シェイプキーが設定されている

　オブジェクトにあるシェイプキーを追加した時点で、`Basis`というシェイプキーが追加されます。これは基本（変形元）となる特別なシェイプキーで、値を設定できません。それ以降に追加されるシェイプキーは、値が設定できるいわゆる普通のシェイプキー（変形先）になります。そして、**一旦シェイプキーが設定されると、メッシュデータの頂点座標をいじっても反映されなく**なります。なぜなら、メッシュが持っている頂点座標と`Basis`は別物だからです。

　結論的には、`Basis`のデータをいじる必要があります。

```python
msh = bpy.data.meshes['Cube']
spk = msh.shape_keys
kbc = spk.key_blocks
```

　`key_blocks`というのがシェイプキー群を司るデータになります。

```python:console
>>> kbc[0]
bpy.data.shape_keys['Key'].key_blocks["Basis"]
```

　複数のシェイプキーを登録していた場合、`kbc[1]`や`kbc[2]`でアクセスできます。頂点座標は、その中の`data`という属性が持っています。

```python
msh = bpy.data.meshes['Cube']
spk = msh.shape_keys
kbc = spk.key_blocks
vts = kbc['Basis'].data
vts[0].co = (5,5,5)
```

　こうすれば変形できるはずです。

参考記事：[Blender PythonのMeshデータアクセスのチートシート](https://qiita.com/kenyoshi17/items/b93bbba6451e3c6017e5)
ArchiCAD API入門〜環境構築編〜

#アドオンを作るための環境設定
GRAPHISOFT Developersの"Getting started with Archicad Add-Ons"のページに沿ってMac環境で進めていきます。


手順は以下の通りです。
**1. 必要なアプリケーションの準備**
**2. Example Add-OnをArchiCADで使えるようにする**




##1. 必要なアプリケーションの準備
- *ArchiCAD*：教育版でインストールしました。
- *API Development Kit*：Develperアカウント登録を申請し受理されたのち、"Download SDK's"のページにあるAPI Development Kitをダウンロードしてインストールを行いました。この際、アプリケーションフォルダにドラッグ&ドロップするウィンドウが表示されるのですが、アイコンの配置がバラバラになっています。矢印が３つあったので、**３つのフォルダ及びファイル全てをアプリケーションフォルダにコピー**しました。
- *CMake*：ダウンロードしたアプリケーションを開き、**Toolsメニューの"How to Install For Command Line Use"を選択して**表示される指示に従ってターミナルでコマンドを入力し、cmakeコマンドを使えるようにしました。
- *Python*：既にインストールしてありました。
- *Xcode*：既にインストールしてありました。
<br>


##2. Example Add-OnをArchiCADで使えるようにする
1. template Add-Onダウンロードし、**ファイルの中のSourcesディレクトリに移動して**、Xcodeでの開発環境を設定するための、cmakeから始まるコマンドを入力しました。
この時、**フォルダのアイコンをターミナルにドラッグ&ドロップする**とパスを素早く入力できます。

2. Xcodeのプロジェクトファイルを開き、ビルドします。私の場合はwarningが２つ出現したので、/CMakeFiles/AddOn.dir/Info.plistを開いて**２箇所を修正**しました。(バージョンの数値の調整し、CFBundleIdentifierの欄を空欄にしました。)
3. ArchiCADで.bundleファイルをadd-on一覧に追加しました。ここは指示に従えば問題なく進みます。Example Add-OnはDEMOバージョンでのみ機能するようです。
Google Search Consoleにサイトマップを登録したら、検索パフォーマンスが瀑上がりした！

XMLサイトマップをサーチコンソールに登録すると、どのくらいSEO効果があるのか、疑問ですよね？
先日、大量にサイトマップを登録したので、結果を報告します。
#サイトマップが必要かどうか
次の場合にサイトマップが必要になることがあります。

1. サイトのサイズが非常に大きい。
2. サイトにどこからもリンクされていない、または適切にリンクされていないコンテンツ ページのアーカイブが大量にある。
3. サイトが新しく、外部からのリンクが少ない。
4. サイトに動画や画像などのリッチメディア コンテンツが多数含まれている、またはサイトが Google ニュースに表示されている。

自分のサイトは、2の「ページのアーカイブが大量にある」に該当するので、施策していこうと思います。

#サイトマップの作成
次の例は、1 つの URL の場所を指定するごく基本的な XML サイトマップです。

```
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://hoge.com/foo.html</loc>
    <lastmod>2018-06-04</lastmod>
  </url>
</urlset>
```
#動的に生成されるコンテンツのサイトマップ
自分のサイトは、動的に生成されるURLが非常に多いので、これを全て含めてサイトマップを生成しようと思います。

```
<?php

$mysqli = new mysqli('localhost', 'root', 'password', 'database');
$mysqli->set_charset("utf8");

$sitemap = '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">';

$result = $mysqli->query("SELECT id, up FROM table"); //データベース等から、ページ情報を引っ張ってきてURLのところに貼る。何ページかをループで回す。
while ($row = $result->fetch_assoc()) {
    $d = new DateTime($row["up"]);
    $sitemap .= '
    <url>
        <loc>https://hoge.com/?id=' . $row["id"] . '</loc>
        <lastmod>' . $d->format('Y-m-d\TH:i:s+00:00') . '</lastmod>
    </url>';
}
$sitemap .= '
</urlset>';

file_put_contents($_SERVER["DOCUMENT_ROOT"].'/sitemap.xml', $sitemap); //これだとhttps://hoge.com/sitemap.xmlにサイトマップが置かれる
```
#生成と送信の自動化
最後にサイトマップの生成と送信の自動化を行います。
自動化はcronを使います。

```
$ crontab -e
30 04 * * * php /var/www/html/sitemap.php //先程、作ったphpファイル
40 04 * * * curl https://www.google.com/ping?sitemap=https://hoge.com/sitemap.xml //phpファイルで生成した、XMLファイルをGoogle Search Consoleに送信
```
#最後に
お疲れさまでした。
自分は、大量の動的URLをGoogle Search Consoleに送信することにより、検索パフォーマンスが3倍ぐらいになりました。
大量の動的URLがある方は、試しに施策してみるのも、良いかもしれません。

お世話になったサイトです。
1. [Google 検索でウェブサイトをアピールする方法](https://developers.google.com/search/docs?hl=ja "Google 検索でウェブサイトをアピールする方法")
2. [PHPでサイトマップを動的に生成する](https://taitan916.info/blog/archives/2489 "PHPでサイトマップを動的に生成する")
FilezillaのようなFTPの動きをターミナルで行う

#FTPとは
FTPはファイルトランスファープロトコルの略語で、あるサーバーにファイルやフォルダを渡すときに使われるプロトコル(約束事)のことです。今回はFileZillaとターミナルのコマンドについて触れていこうと思います。ただ、FileZillaでFTPができた人向けに書いていこうと思いますので、FileZillaの解説はあまりありません。

#環境
mac os X
Filezilla
Homebrew

#FileZilla
無料(有料もあります)のFTPのGUIアプリケーションです。多分gitのsourcetreeのような感じだと思います。Filezillaのダウンロードは[こちら](https://filezilla-project.org/download.php?type=client) (macos)
Filezillaについて詳しく知りたい方は[こちら](https://miya-system-works.com/blog/detail/35)

#ターミナルでのコマンド
今回は[こちら](https://necoboku.info/mac%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%8B%E3%82%89ftp%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/)の記事を参考にしながら書いていきます。
まず、ターミナルで
<code>$ ftp</code>
と打ちます。そんなのないよーって言われたら、brewを使ってインストールしていきましょう。
<code>$ brew install tnftp</code>
その後
<code>$ ftp
ftp></code>
こんな感じになればインストール完了です。そしたらFilezillaのホストに書いてあるサーバー名を入れてみましょう。今回はxserver風でいきます。
<code>ftp> open ~.xserver.jp</code>
`connected to ~.xserver.jp` 
となればサーバーとの接続完了です。次に、
<code>ftp> uesr</code> 
と打つとユーザー名とパスワードを聞かれます。Filezillaのユーザーとパスワードを入力しましょう。成功すると、以下のように表示されます。
<code>230 User ~.xserver.jp logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> </code>
ここまで来たらほとんど完了です。htp> help　とすればいろんなコマンドを確認することができますが、主要だと思われるところを説明したいと思います。

```
ftp> ls  #サーバー側のファイル構成を見る
ftp> cd  #サーバー側のディレクトリを変える
ftp> lcd  #自分のディレクトリを変更
ftp> put ~  #そのディレクトリの中の ~ をサーバーにアップロードする。
ftp> quit #作業が終わったら
```

こんな感じでしょうか？ターミナルでやる必要性があるかどうかはわかりませんが、Filezillaを一々介さないのがいいところなのかなと個人的には思います。
【Terraform】Cloud RunにおいてSecret Managerを環境変数に埋めようとすると Error "description": "spec.template.spec.containers[0].env.value_from should be empty"

### 状況
GCPのプロジェクトをTerraformで扱っていて、Cloud RunサービスにおいてSecret Managerを環境変数に入れたい
2021/07現在この機能はベータ版
→もし時間が経って解決されてたらこの記事は不要になるかもしれません

### 実装内容
Terraform公式のCloud Runの部分を参考にしました
今回触れる部分以外は省略しています
beta版なのでプロバイダーはgoogle-betaになります

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service#example-usage---cloud-run-service-secret-environment-variables

```tf:cloudrun.tf
resource "google_cloud_run_service" "example_service" {
 provider = google-beta

 name = "example_service"
 template {
   spec {
     containers {
       env {
         name = "EXAMPLE_ENV"
         value = "hoge"
       }
       # Secret Manager
       env {
         name = "EXAMPLE_SECRET"
         value_from {
           secret_key_ref {
             name = "example_secret" # 手動で作成したsecretのkey
             key = "1" # version
           }
         }
       }
     }
   }
 }
}
```

### 発生したエラー

`"description": "spec.template.spec.containers[0].env.value_from should be empty"`

value_fromが空であるべきとか書いてますが、ドキュメントでは空ではないので、違和感を感じます。

### 原因
不明ですが、推測としてはベータ版の不具合だと考えています。
（いろんな事情でSecret Managerの作成自体はTerraformで管理していないからという線も考えましたがそれだと以下解決策では動かないかなと思っています）

### 解決策
どうやらsecret managerを使う場合初回はこのannotationsを定義しないと動作しないようです。

参考issue

https://github.com/hashicorp/terraform-provider-google/issues/9159

```tf:cloudrun.tf
resource "google_cloud_run_service" "example_service" {
 provider = google-beta

 name = "example_service"
  # ここを追加
  metadata {
    annotations = {
      "run.googleapis.com/launch-stage" = "BETA"
    }
  }
 template {
   spec {
     containers {
       env {
         name = "EXAMPLE_ENV"
         value = "hoge"
       }
       # Secret Manager
       env {
         name = "EXAMPLE_SECRET"
         value_from {
           secret_key_ref {
             name = "example_secret" # 手動で作成したsecretのkey
             key = "1" # version
           }
         }
       }
     }
   }
 }
}
```

これで`terraform apply`すると通ると思います

### 所感
ベータ版だからということもあるかもしれませんが、公式ドキュメント通りに実装して動かないのは辛いですね。。
困っている人いないんですかね、、（僕がミスっているだけ？）
こういう場合はどうするのがベターなんだろうか。
[Ruby]等差数列(等比数列)

学習の中で等差数列という問題が出たので、内容を備忘録としてまとめました。

## 等差数列とは？
等差数列とは「はじめの数に、一定の数を足し続ける数列」
というものになります。

たとえを元にすると、
`2, 5, 8, 11, 14, 17, 20…`
この数列は、はじめの数（2）に、一定の数（3）を足し続けていますね。
こういったものが等差数列です。

「はじめの数に、一定の数をかけ続ける数列」という「等比数列」というのもあるのですが、
まずは等差数列をRubyで表現したいと思います。

# 等差数列

* 例題
初期値 m ,公差 n の等差数列を1〜10番目までスペース区切りで出力して下さい。  

* 入力例
3 5
* 出力例
3 8 13 18 23 28 33 38 43 48

## 解答
```Ruby:
a, b = gets.split(" ").map(&:to_i)
array = []
10.times {|i|
    array[i] = a + b * i
}
puts array.join(" ")
```

## 解説

```Ruby:
a, b = gets.split(" ").map(&:to_i)
```

ここで入力された値をsplitメソッドとmapメソッドを使い、
入力された数値`3, 5`をそれぞれ、aとb変数の中に格納しております。
`a => 3`
`b => 5`

```Ruby:
array = []
10.times {|i|
    array[i] = a + b * i
}
```
空のarray変数を用意して、timesメソッドを使って0〜9までの10個の数値をそれぞれ繰り返しで格納していきます。

```Ruby:
array[i] = a + b * i
```

掛け算は足し算よりも先に計算をされるため```b * i```が先に計算され、aを加えてarray変数にそれぞれ格納されていく…という形になります。
`array => [3,8,13,18,23,28,33,38,43,48]`

```Ruby:
puts array.join(" ")
```
joinメソッドで空白を入れつつ配列を繋げて出力すれば出力例の通りになります。

## 等比数列
続いて「等比数列」を説明します。
等比数列というのは
「はじめの数に、一定の数を掛け続ける数列」
というものになります。

例としてはこんな感じです。
`2, 4, 8, 16, 32, 64, 128…`
この数列は、はじめの数（2）に、一定の数（2）をかけ続けている…というのがわかるかと思います。

* 例題  
初期値 m ,公差 n の等比数列を1〜10番目までスペース区切りで出力して下さい。
* 入力例  
3 2
* 出力例  
3 6 12 24 48 96 192 384 768 1536


## 解答

```Ruby:
a, b = gets.split(" ").map(&:to_i)
array = []

10.times {|i|
    array[i] = a
    a *= b
}
puts array.join(" ")
```
## 解説

```Ruby:
a, b = gets.split(" ").map(&:to_i)
```
ここは等差数列と同じです

```Ruby:
array = []
10.times {|i|
    array[i] = a
    a *= b
}
```

等差数列と同じく、空のarray変数を用意して、timesメソッドを使い0〜9までの10個の数値をそれぞれ繰り返しで格納していきます。
ただし、数値の計算として初期値が3で回数を重ねていくごとに2を掛け算していくため

```Ruby:
array[i] = a
a = a * b => a *= b
```
という式で掛け算した値がaに代入され、array変数にそれぞれ格納されていく…という形になります。
`array => [3,6,12,24,48,96,192,384,768,1536]`

```Ruby:
puts array.join(" ")
```

あとはjoinメソッドで空白を入れつつ配列を繋げて出力をすれば出力例の通りになります。

## まとめ
もっとスマートにする方法はあるかと思いますが、基本的な考え方を元に説明してみました。
例題に関しては実際にあった問題を元に作成している為、細かな記載ミスがあるかもしれません。
もし見つけた際はお手数ですが、ご指摘いただければ幸いです。
「Start/Stop VMs during off hours」を利用して、VMの起動/停止順序を指定する方法

# 概要
以前書いたAzureの機能「Start/Stop VMs during off hours」を使ったVMの自動起動/停止設定の続編です。

過去に書いたStart/Stop VMs during off hoursの実装方法についての記事はこちら↓
[Azure Automationの「Start/Stop VMs during off hours」でVMの自動起動/停止を実装してみた話](https://qiita.com/mikanchaaan/items/71df51a999f34302f8d1)

Azure Automationの「Start/Stop VMs during off hours」を利用して、VMの自動起動/停止機能を実装することができますが、
少し設定を変えることで、複数のVMが存在する場合に、起動/停止順序まで指定することが可能になります。

※以下の設定は、事前に「Start/Stop VMs during off hours」をデプロイが必要です。
## ①仮想マシンにタグ付け
自動起動/停止を設定する仮想マシンに以下のタグを付与します。

 |付与するタグ名 |値|
|---|---|---|
|起動順序|sequencestart  |起動したい順序の数字（1番目に起動するVMは「1」）
|停止順序|sequencestop  |停止したい順序の数字（1番目に停止するVMは「1」）

1. 対象の仮想マシンにて「タグ（変更）」をクリックする。
2. 上記の表に記載されたタグを設定し、「適用」をクリックする。
![SnapCrab_No-0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/56113cd9-255d-1da5-c4de-a6382e214ca9.png)

3. 「タグ」の項目に設定したタグ名と設定値が表示されていることを確認する。
![SnapCrab_No-0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/14f39fd1-c5d8-a03f-2eb2-00bdebe855ae.png)


## ②スケジュール設定
自動起動/停止のスケジュールとパラメータを指定します。

1.  Azure Portalにて「Start/Stop VMs during off hours」がデプロイされているAutomationアカウントにアクセスする。

2. 「スケジュール」をクリックする。

3.  下記スケジュールをクリックして設定します。
    * Sequenced-StartVM：開始スケジュール
    * Sequenced-StopVM：停止スケジュール  
    ※起動/停止順序を指定しない場合は、指定するスケジュールが「Scheduled-StartVM/Scheduled-StopVM」に変更する必要があるため注意。
![SnapCrab_No-0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/855982a2-39c8-4553-1d56-0f63139b9eb9.png)


4.  設定したスケジュールの状態が「オン」になってれば「次の実行」に記載された日時に対象VMの起動/停止が動作する。
![SnapCrab_No-0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/98e4596a-58d8-4e35-4000-b614a28bdf14.png)

***
と、ここまで設定しておけば、指定した時刻にタグで指定した順番でVMの起動/停止が実行されるようになります。

ちなみに、同じ値のタグを複数のVMに付与することも可能なので、
3台以上のVMが存在するときに、「sequencestart：1」のタグを付与したVMが2台、「sequencestart：2」のタグを付与したVMが1台で設定すると、
1台だけVMの起動を遅らせたりする設定も可能です。

以上です。
スクリプト書くのが苦手な私には、GUIの操作だけでここまで設定できるのはとても便利でした。
[備忘録]ターミナルからJupyter を立ち上げる手順

AnacondaからJupyteを立ち上げていた。
直接ターミナルから立ち上がるように行なった手順をメモする。

#環境
Macbook Pro
macOS Big Sur 11.4

Python 3.9.4


#ターミナル

まずは仮想環境を作成する。名前はPracticeにした。

```
conda create -n Practice
```

続いて、Pythonのバージョンを以下のコマンドで指定する。
最新バージョンである3.9.4で実行した。（2021年7月8日時点）

```
conda create -n Practice python=3.9.4
```

実行環境を指定する必要があるため、以下のコマンドを実行する。

```
source activate Practice
```

パッケージの追加

```
pip install jupyterlab
```


以下のコマンドでJupyter labを立ち上げる。


```
jupyter lab
```
2.1(標準) 分布関数，密度関数の定義 

## 方針

以後，確率変数Xの分布関数と密度関数をそれぞれ

```math
F_X(x),\ f_X(x)
```

と表記することにする．連続値を取る確率変数Xに対し，分布関数の定義は，「確率変数Xがある定数x以下の値を取る確率」であり，

```math
F_X(x)=P[X\leq x]
```

である．次に，確率密度関数について考える．離散確率変数Xに対し，確率関数とは，「確率変数Xがある定数xとなる確率」であり，

```math
f_X(x)=P[X=x]
```

であった．しかし，連続確率変数Xに対してP[X=x]を定義しようとすると，その値は無限小に発散してしまう．そこで，連続確率変数に対しては，確率密度関数を「分布関数の微分」として定義することで，確率関数P[X=x]を代用する．

```math
f_X(x)=\frac{d}{dx}F_X(x)
```

確率密度関数の定義により，分布関数と確率密度関数には次のような関係が成り立つ．

```math
F_X(x)=\int_{-\infty}^x f_X(t)dt
```

ただし，積分範囲の下限はXの定義域の下限．従って，確率密度関数Xを定義域全体での積分する，ということは，「Xが定義域のいずれかの値を取る確率」という意味なので，自明に1となる．(全確率1)

```math
\int_{-\infty}^\infty f_X(x)dx=1
```

ただし，積分の上限と下限はXの定義域の上限と下限．本問では以上のことを用いる．

## 答案
### 1.

全確率1より，

```math
\begin{align}
\int_0^2 f_X(x)dx&= \int_0^x Cx^3dx\\
&= \left[\frac{C}{4}x^4\right]_0^2\\
&= 4C=1
\end{align}
```

となるので，正規化定数は

```math
C=\frac{1}{4}
```

また，分布関数は，

```math
\begin{align}
F_X(x)&= \int_0^x\frac{1}{4}t^3dt\\
&= \left[\frac{1}{16}t^4\right]_0^x\\
&= \frac{1}{16}x^4
\end{align}
```

### 2.

全確率1より

```math
\begin{align}
\int_{-\infty}^\infty f_X(x)&= \int_{-\infty}^\infty Ce^{-|x|}dx\\
&= \int_0^\infty Ce^{-x}dx+\int_{-\infty}^0 Ce^xdx\\
&= \left[-Ce^{-x}\right]_0^\infty+\left[Ce^{x}\right]_{-\infty}^0\\
&= 2C=1
\end{align}
```

となるので，正規化定数は

```math
C=\frac{1}{2}
```

また，分布関数は，

```math
F_X(x)=\int_{-\infty}^x\frac{1}{2}e^{-|t|}dt\tag{1}
```

(i)0<xの時，   
 
```math
\begin{align}
(1)&= \int_0^x\frac{1}{2}e^{-t}dt+\int_{-\infty}^0\frac{1}{2}e^tdt\\
&= \left[-\frac{1}{2}e^{-t}\right]_0^x+\left[\frac{1}{2}e^t\right]_{-\infty}^0\\
&= –\frac{1}{2}e^{-x}+1
\end{align}
```

(ii) x<0の時，  


```math
\begin{align}
(1)&= \int_{-\infty}^x\frac{1}{2}e^tdt\\
&= \left[\frac{1}{2}e^t\right]_{-\infty}^x\\
&= \frac{1}{2}e^x
\end{align}
```

(i),(ii)より，

```math
F_X(x)=\begin{cases}
–\frac{1}{2}e^{-x}+1\ \ \ \ \ \ \ 0<x\\
\frac{1}{2}e^x\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ x<0
\end{cases}
```

### 3.

全確率1より，

```math
\begin{align}
\int_0^\infty f_X(x)dx&= \int_0^\infty Ce^{-2x}dx\\
&= \left[-\frac{C}{2}e^{-2x}\right]_0^\infty\\
&= \frac{C}{2}=1
\end{align}
```

となるので，正規化定数は，

```math
C=2
```

また，分布関数は

```math
\begin{align}
F_X(x)&= \int_0^x2e^{-2t}dt\\
&= \left[2e^{-2t}\right]_0^x\\
&= -e^{-2x}+1
\end{align}
```

### 4.

```math
\int_0^\infty f_X(x)dx=\int_0^\infty Ce^{-x}e^{-e^{-x}}dx\tag{1}
```

u=e^{-x}と置換することで，

```math
\begin{align}
(1)&= \int_1^0-Ce^{-u}du\\
&= \left[Ce^{-u}\right]_1^0\\
&= C-Ce^{-1}
\end{align}
```

全確率1より，正規化定数は

```math
C=\frac{1}{1-e^{-1}}
```

また，分布関数は

```math
F_X(x)=\int_0^x\frac{1}{1-e^{-1}}e^{-t}e^{-e^t}dt\tag{2}
```

u=e^{-t}と置換することで，

```math
\begin{align}
(2)&= \int_1^{e^{-x}}-\frac{1}{1-e^{-1}}e^{-u}du\\
&= \left[\frac{1}{1-e^{-1}}e^{-u}\right]_1^{e^{-x}}\\
&= \frac{e^{-e^{-x}}-e^{-1}}{1-e^{-1}}
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Azure Logic Apps - IFTTTとの連携


## 目的

`Azure Logic Apps` からIFTTTのトリガーをかける


## 構成

[Azure Logic Apps - Azure Functionsからの呼び出しとGmail送信](https://qiita.com/takmot/items/b70062d3d60020eda463) で作成したロジックアプリを使用し、
IFTTTのトリガーとなるメール送信をロジックアプリに追加し、
IFTTTからLINEに対してメッセージ送信を行う

![image-20210708141411436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/018fdd8f-2793-ba63-d08c-8b102846f033.png)


## IFTTT設定

### 1. トリガー設定

`追加する` を選択

![Screenshot_20210708-132049.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/6d126d19-e524-1df3-0f6e-4057ab819c70.jpeg)

Emailを選択

![Screenshot_20210708-132101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/c9fb6e4a-839d-018e-23d8-3c2c569b1c55.jpeg)

`Send IFTTT any email` を選択

![Screenshot_20210708-132108.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/ac03f5da-e97b-76d0-f14c-5ff36964e764.jpeg)


### 2. アクション設定

`追加する` を選択

![Screenshot_20210708-132117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/8099b993-179e-4892-0140-b573f1fa65e4.jpeg)

`LINE` を選択

![Screenshot_20210708-132123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/e4d6cd8c-ff9f-1129-598f-4fcadd5706c8.jpeg)

`Send message` を選択

![Screenshot_20210708-132129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/3f0f601a-39ae-ed7a-17a5-5626fba55cec.jpeg)


`Recipient` : LINE 内のどこで通知を受け取るかを選択
`Message` : 受信するメッセージ内容を設定
　`Subject`, `Body`, `ReceivedAt` はトリガーのメール内容が反映される
`Photo URL` : 画像は送信しないので空にする

![Screenshot_20210708-143713.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/d045d96c-eac3-367c-6100-ab35ed1015bc.jpeg)

設定が終わると以下のようにアプレットが生成される

![Screenshot_20210708-132313.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/57258d44-e3f7-72fb-9948-1b6ba91a0160.jpeg)

アプレット名に書かれているように、
登録したメールアドレス（xxxxx@gmail）から `trigger@applet.ifttt.com` にメールが送信されると
LINEに対してメッセージが送信される


## ロジックアプリの作成

### 1. アクション（Gmail送信）追加

アクションの追加方法は [Azure Logic Apps - Azure Functionsからの呼び出しとGmail送信](https://qiita.com/takmot/items/b70062d3d60020eda463) 参照
宛先のメールアドレスに `trigger@applet.ifttt.com` を入力
GmailアカウントがIFTTTに登録したメールアドレスと異なる場合は、`接続を変更してください。` から変更する

![image-20210708133900892.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/ba7a6bd5-6255-94ce-8b4e-6d89d1c18c9c.png)



## 動作確認

### Postman

![image-20210704154629697.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/3ce5d071-e418-b135-c2dd-1b3bcd2e8366.png)

### LINE

![Screenshot_20210708-132319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/b41a26a3-46ea-ea62-4202-29a4900bf9ba.png)
Consultant

What I mean by a business consultancy is a theoretical overview of what a business consultancy or your consultancy should look like. This is not a post. Any business, even if it is a beginner or has been in business for a long time, can only move forward with the right consultation.

Your business consultants must be people with experience in the future. Because it is essential to understand the ups and downs of business and do the right thing. A consultant will provide a variety of advice to the business based on his experience.

A consultancy service provides everything you need to know about what precautions to take in this situation and how it can make your business effective. This is not just advice. A business needs all kinds of consulting, from management consulting to financial consulting, startup consulting, strategy consulting, and process consulting. You can currently view very few consulting services. ATBC is one of them.

Businesses are Different Small businesses and multinational businesses exist today. But it is foolish to offer the same kind of consulting to all types of businesses. It is the responsibility of a good consultant to bring out the things that each business has learned and incorporated into them.

Now you understand that a detailed study is needed. How effective this blog is will affect the consultancy you choose. We're sure you will choose an experienced business consultant like ATBC.