OmniAICreator/Qiita-1.07M huggingface dataset:
ESP-WROOM-02のSpresense WifiモジュールのTIPS

Qiita Advent calendar2021の記事です。

:::note
Spresenseの関係会社に勤務していますが、業務外の個人活動の紹介です。
当記事は会社と関係ありません。
:::

:::note alert
誤った基板上のピン接続により故障する可能性があります。
自己責任でお願いします。
:::

ESP-WROOM-02を使ったSpresenseのWifiモジュールを試したときに悩んだところと解決した方法を紹介します。
<img width="300" alt="20211116_220526.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c15589d0-a69f-6a6d-600e-64c5f217fe90.jpeg">

スイッチサイエンスのページ
https://www.switch-science.com/catalog/4042/
サポートページ
https://thousandiy.wordpress.com/2018/10/07/wi-fi-add-on-board-for-spresense/

####事象
Spresenseを拡張ボードに挿した状態で使うとWifiと接続できない。
バックアップ用に買っていたメイン基板単体に挿したらWifiと接続できた。

####調べてみた
購入先やサポートページの写真を見ると、拡張ボードを使ってないものばかり。
サポートページのコメントを見ると、同じ質問が書き込まれているが回答されてなかったです。
拡張ボードも使う予定だったので「これは詰んだ」とも思いました。

####考えてみた
サポートページにある回路をみると、このモジュールはUART2でSpreseneとつながっていました。
https://thousandiy.files.wordpress.com/2018/10/spresense_8266_v1r1_schema.gif?w=739
一方で、Spreseneのサポートページを読むと、UART2について注意書きがありました。
「JP10 - pin 1, 2
　UART2 端子(D00, D01)をメインボードで使うか、拡張ボードで使うかを選択します。ショートすると メインボード上の UART2 端子 (1.8V) が有効になります。」（表 2. 拡張ボードコネクタ・ジャンパ）
https://developer.sony.com/develop/spresense/docs/introduction_ja.html#_spresense_%E6%8B%A1%E5%BC%B5%E3%83%9C%E3%83%BC%E3%83%89

というわけで、拡張ボードのJP10の1-2ピンをショートさせて使うと、拡張ボードに接続したままでこのモジュールが機能しました。
良かった。
<img width="300" alt="20211117_081025.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/6549d034-9fee-44a1-0850-af9b408e5563.jpeg">

ジャンパーピンを買ってきた。
<img width="300" alt="20211117_181807.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/dd9ae1e9-6b28-5b22-1dba-7b67ccc329fc.jpeg">

以上、TIPSでした。
複素数を利用した三角関数の積分

#複素数を利用した三角関数の積分
複素数を使って有利関数の積分をするとなると，留数定理を使って解くというのがありますが，今回はそうではなく複素数の性質を使って積分を解いていく感じでいきたいと思います.
厳密性とかすっ飛ばしてやってくので許してください.
##オイラーの公式
$$e^{ix}=\cos{x}+i\sin{x}$$
この公式はテイラー展開によって容易に示せる.
$e^{x}$のテイラー展開は
$$e^{x}=1+x+\frac{x^{2}}{2!}+\frac{x^{3}}{3!}+\cdots\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1)$$
また，$\sin{x}$と$\cos{x}$のテイラー展開は
$$\sin{x}=x-\frac{x^{3}}{3!}+\frac{x^{5}}{5!}-\frac{x^{7}}{7!}+\cdots\ \ \ \ \ \ \ \ \ \ \ \(2)$$
$$\cos{x}=1-\frac{x^{2}}{2!}+\frac{x^{4}}{4!}-\frac{x^{6}}{6!}+\cdots\ \ \ \ \ \ \ \ \ \ \ \(3)$$
であり，(1)の$x=i\theta$を代入すると
$$e^{i\theta}=\bigg(1-\frac{\theta^{2}}{2!}+\frac{\theta^{4}}{4!}-\frac{\theta^{6}}{6!}+\cdots\bigg)+i\bigg(\theta-\frac{\theta^{3}}{3!}+\frac{\theta^{5}}{5!}-\frac{\theta^{7}}{7!}+\cdots\bigg)$$
$$\iff e^{i\theta}=\cos{\theta}+i\sin{\theta}$$
ちなみに，$\theta=\pi$のとき
$$e^{i\pi}=1\iff e^{i\pi}-1=0$$
オイラーの等式が得られる.

では，このオイラーの公式を用いて実関数の積分を解いてみましょうか.
##実関数の積分
例1
$$\int\cos{(\log{x})}dx，\int\sin{(\log{x})}dx\ \ \ を求めよ.$$
これら2つのを同時に求めてみましょう.
$$I_{\mathfrak{R}}=\int\cos{(\log{x})}dx，I_{\mathfrak{I}}=\int\sin{(\log{x})}dx，I=\int\cos{(\log{x})}+i\sin{(\log{x})}dx$$
とすると，$$I=I_{\mathfrak{R}}+iI_{\mathfrak{I}}$$であるので，$I$を計算して実部と虚部に分けてあげれば良い.
$$I=\int e^{i\log{x}}dx=\int e^{\log{x^{i}}}dx=\int x^{i}dx=\frac{1}{1+i}x^{1+i}=\frac{1-i}{2}\cdot x\cdot x^{i}=\frac{1-i}{2}\cdot x\cdot e^{i\log{x}}$$
これを整理すると，$$\frac{1-i}{2}x\bigg(\cos{(\log{x})}+i\sin{(\log{x})}\bigg)$$
実部と虚部を比較して
$$I_{\mathfrak{R}}=\frac{1}{2}x\bigg(\sin{(\log{x})}+\cos{(\log{x})}\bigg)+C_{\mathfrak{R}}$$
$$I_{\mathfrak{I}}=\frac{1}{2}x\bigg(\sin{(\log{x})}-\cos{(\log{x})}\bigg)+C_{\mathfrak{I}}$$
$C_{\mathfrak{R}}，C_{\mathfrak{I}}$は積分定数$\ \ \ \ $//

例2$\ \ \ \ \ a，bは0でない定数とするとき$
$$\int e^{ax}\cos{(bx)}dx，\int e^{ax}\sin{(bx)}dx\ \ \ を求めよ.$$
これらも同時に求めてみましょう.
$$I_{\mathfrak{R}}=\int e^{ax}\cos{(bx)}dx，I_{\mathfrak{I}}=\int e^{ax}\sin{(bx)}dx，I=\int e^{ax}\cos{(bx)}dx+i e^{ax}\sin{(bx)}dx$$
とすると，$$I=I_{\mathfrak{R}}+iI_{\mathfrak{I}}$$であるので，$I$を計算して実部と虚部に分けてあげれば良い.
$$\int e^{ax}\cdot e^{ibx}dx=\int e^{(a+bi)x}dx=\frac{1}{a+bi}\cdot e^{(a+bi)x}=\frac{a-bi}{a^{2}+b^{2}}\cdot e^{ax}\cdot e^{ibx}$$
これを整理すると，$$\frac{a-bi}{a^{2}+b^{2}}\cdot e^{ax}\cdot\bigg(\cos{(bx)}+i\sin{(bx)}\bigg)$$
実部と虚部を比較して
$$I_{\mathfrak{R}}=\frac{e^{ax}}{a^{2}+b^{2}}\bigg(b\sin{(bx)}+a\cos{(bx)}\bigg)+C_{\mathfrak{R}}$$
$$I_{\mathfrak{I}}=\frac{e^{ax}}{a^{2}+b^{2}}\bigg(a\sin{(bx)}-b\cos{(bx)}\bigg)+C_{\mathfrak{I}}$$
$C_{\mathfrak{R}}，C_{\mathfrak{I}}$は積分定数$\ \ \ \ $//
##最後に
しっかり読んでくれた方も，飛ばし飛ばし読んでくれた方もここまで読んでくださってありがとうございます.初めて，Qiitaで記事を書いたので構成が下手くそで読みにくかったと思います.そこは申し訳ございませんでした.
今回の記事で複素数の面白さを少しでも感じてもらえたら嬉しいです.

誤字や不備がありましたら[Twitter  rime_math](https://twitter.com/rime_math "QiitaHome")までお願いします.
【microCMS】Nuxt.js用モジュールを使用したAPI通信の実装手順

#はじめに
こんにちは。
こちらの記事では、Nuxt.js用モジュールを使用したAPI通信の実装を行う方法を記しています。

以前にmicroCMSとの通信には、axiosを使った実装の記事を執筆しました。
ですが、2021年6月30日にmicroCMS公式から、Nuxt.js用モジュールを使用した方法が公開されていましたので、備忘録も兼ねて執筆いたします。

https://qiita.com/YuStarrr/items/839138a955c67ae8aff2

##実装手順
公式の手順の通り設定を進めていきます。

>公式：[microCMSのNuxt.js用モジュールを公開しました](https://blog.microcms.io/nuxt-microcms-module/)


###1. モジュールのインストール
下記のコマンドを実行して、モジュールのインストールを行います。

```
 npm install nuxt-microcms-module
```

package.json の`dependencies`にモジュールが追加されます。

```javascript:package.json
{
  "dependencies": {
    "nuxt-microcms-module": "^2.0.0"
  },
}
```

###2. nuxt.config.jsへの追記
nuxt.config.js へ以下のように追記します。

```javascript:nuxt.config.js
export default {
  buildModules: [
    'nuxt-microcms-module'
  ],
  microcms: {
    options: {
      serviceDomain: process.env.SERVICE_DOMAIN,
      apiKey: process.env.API_KEY,
    },
    mode: process.env.NODE_ENV === 'production' ? 'server' : 'all',
    //mode: all でも可。
  },
};
```

modeのデフォルト値はallで、SPA実装の場合は`mode: all`でも正常に動作します。ただし、SSR実装の場合は、本番環境でサーバーサイドのみの読み込みを行うため、`process.env.NODE_ENV === 'production' ? 'server' : 'all'`を指定する。

###3. .envファイルの作成
`.env`ファイルを作成して環境変数にてAPIキーを管理します。

API_KEYには、microCMSの`X-MICROCMS-API-KEY`を設定。
SERVICE_DOMAINには、`'https://サービス名.microcms.io/api/v1/APIのエンドポイント'`の中の「サービス名」に当たる部分を設定します。

```html:.env
API_KEY=0000000000000000000
SERVICE_DOMAIN=ooooooooooooo
```

`.env`ファイルに記述する際は、`=(イコール)`の前後に空白は使用せず、文字列でも`''(シングルクォート)`や`""(ダブルクォート)`は不要。
これらをつけてしまうと、画面が描画されなくなってしまいます。

>Nuxt.jsにおける、環境変数の管理は`@nuxtjs/dotenv`を使用していましたが、Nuxt2.13以降はランタイム構成が推奨されているようです。

>【参考記事】
[@ nuxtjs / dotenvからランタイム構成への移行](https://nuxtjs.org/ja/tutorials/moving-from-nuxtjs-dotenv-to-runtime-config/)
[dotenvはもう古い！最新Nuxtの環境変数管理方法](https://qiita.com/taai/items/cbc61b9b4a18aacad57e)
>

ただし、今回使用するモジュールで環境変数を管理する場合は、`runtimeConfig`を使用せずとも`$microcms.get()`で通信を行うことができます。

###4. pages側の設定
設定したモジュールをクライアントサイドで呼び出します。
下記のように記述を行うことで、データを呼び出すことができます。

```html:template
<template>
  <div>
    <pre>{{ data }}</pre>
  </div>
</template>
```

```javascript:script
<script>
export default {
  async asyncData({ $microcms }) {
    const data = await $microcms.get({
      endpoint: 'APIのエンドポイント',
    });
    return { data };
  }
}
</script>
```

上記のようにdataを返すことで、APIからデータを取得できると思います。

<br>


#おわりに
ここまでNuxt.js用モジュールを使用したAPI通信の実装方法についてまとめました。
実装してみる中で、古い記事を参照していてエラーが発生してしまったので、公式リファレンスを参照する重要性を改めて感じました。Nuxt.jsでの環境変数管理についても復習することができたので、今後の開発でも活かしていきます！

以上、最後まで読んでいただきありがとうございました！
よければLGTMを押してくれると嬉しいです！
【ユーザー名の変更】Raspberry pi 初期設定

初期設定ではユーザー名がpiになっている。
セキュリティーを強化するために，ユーザー名とパスワードの変更を行う。

参考
https://monoist.itmedia.co.jp/mn/articles/1912/11/news022.html


1. ユーザー名を作成する。<br>
```sudo adduser newuser```<br>
 newuserのパスワードの設定をする。
2. 『pi』と同じ権限を『newuser』に付与する。<br>
　piの権限を見る。<br>
```groups pi```<br>
  権限をnewuserに付与する。<br>
```sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio newuser```<br>
3. 『pi』の中身のファイルを『newuser』移動<br>
```sudo cp -r /home/pi/* /home/newuser```
4. Rebootし，『newuser』でログイン<br>
4. 『pi』ユーザーの削除<br>
```sudo userdel pi```

一言
Raspberry piは自由度が高いが故に，自身で設定する部分が多い。
Raspberry piをネットにつなぐことが多いので，購入時にセキュリティー設定を済ませておきたい。
firestoreでのランキング設計を考える

これは[Firebase Advent Calendar 2021](https://qiita.com/advent-calendar/2021/firebase)の5日目の記事です。

こんにちは。[virapture](https://virapture.com)株式会社の[もぐめっと](https://mogmet.com)です。

![mogmet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/2e3a6181-0ac0-b6b6-d3ac-6d47455d79c6.jpeg)
最近友達が結婚しました。とてもめでたいです。それでも私のおでこのシワは相変わらずとれないみたいです。

今回はfirestoreでランキングを実装するにあたってどうやったら実現できるかの設計・実装方法を考えてみました。

## 前提

サービスを作っていくとみんな大体ランキングをつけたくなりますよね。
中国ではファンビジネスでランキングを禁止するくらいランキングというのは非常に魅力的な機能の一つになります。

https://www.huffingtonpost.jp/entry/story_jp_612832f1e4b06e5d80cb72dc

しかしfirestoreではフィルタリングが非常に弱いため、複雑な条件でのランキングになってくると実装をするのが難しくなります。
例えばプロダクトオーナーからこんな意見が出たとしましょう。

「1週間、1ヶ月、総期間での記事のいいねランキングをつけましょう！！！」

日にち区間の指定なく、全体のデータからランキングを生成するといったケースやシンプルな検索条件であれば問題なく実装できます。
しかし、時間軸によってランキングデータが変わるといった内容であると一工夫入れないといけなくなります。

## 解決策1. CloudFunctionsを使う

時間軸によってそれぞれサブコレクションを分けてデータを保管する必要が出てきます。

全体の設計としてはこんな形のfirestoreの設計を想定しています。

- articlesサブコレクション
    - createdAt: Timestamp // 記事作成日
    - title: String // 記事タイトル
    - body: String // 記事内容
    - likeCount: Number // 総いいね数
    - weeklyLikeCount: Number // 週でのいいね数
    - monthlyLikeCount: Number // 月でのいいね数
    - likesサブコレクション
        - createdAt: Timestamp // いいねした日
        - username: String // いいねしたユーザ名

いいねした時はlikesサブコレクションにドキュメントを作ります。
またドキュメントが創られたらonCreateLikeというCloudFcuntionsを起動して諸々処理します。

### ■リアルタイム

下記実装で簡単に実現が可能です。

- 1. 記事にいいねがされるとonCreateLikeのCloudFunctionsを起動
- 2. article.likeCountをインクリメント
- 3. 記事の総いいね数フィールドを集計していいね数順に表示

実装が簡単なので、articleのドキュメントをonSnapshotでListenすることでリアルタイムでの表示も可能です。
ただしfirestoreには1ドキュメントに対する書き込みは1秒あたり1回までの制限があります。

https://firebase.google.com/docs/firestore/best-practices?hl=ja

もしサービスが成長してアクセスが増えた場合は下記のようなエクステンションを使ってカウントを計測することをお勧めします。

https://firebase.google.com/products/extensions/firebase-firestore-counter?hl=ja

### ■1週間/1ヶ月

article.likeCountだけでは週と月の集計は難しいため、バッチ処理を回して集計する必要があります。
そのため、1週間のコレクション、1ヶ月のコレクションにそれぞれ集計した結果を入れていく必要があります。
ただし、ランキングの開始日を月初め、週初めといった形で仕様として決め打ちできるのであれば、下記実装でリアルタイムでのランキングが可能です。

- 1. 毎週、毎月の指定日時でarticle.weeklyLikeCount、article.monthlyLikeCountをリセットする
- 2. article.weeklyLikeCountもしくはarticle.monthlyLikeCountをいいねしたときにインクリメント

毎週・毎月ランキングをリセットしてみせるという表現になります。

#### リセットしない1週間/1ヶ月

もしリセットせずに直近1週間、1ヶ月のランキングを見せたいといった場合はlikesのサブコレクションに対して、コレクショングループの検索を使って毎日集計ケッケのみのドキュメントを生成することで見せることはできます。
ただし、この場合はリアルタイムではなく、前日までの集計結果となるので、最大で1日のタイムラグが生じます。

## 解決策2. BigQueryを使う

丸投げになりますが下記記事に解説されておりますのでより柔軟にランキングの計算や実装ができます。

https://zenn.dev/moga/articles/firebase-bigquery-ranking

こちらに関してはサマリーテーブルを使った方法を紹介されてます。
Analyticsの要素も絡めることができるので、よりいろんなセグメントでのランキングも作ることができます。


## まとめ

ランキング実装を作るときはどのセグメントを切り取るかで実装方法やコストが変わってきます。
しっかりと仕様を決めてユーザの価値にフィットしたプロダクトとコストに見合った機能を作っていきましょう！

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/
toBプロダクトの認証基盤をリプレイスした時のおもしろポイント

<!-- toBプロダクトの認証基盤をリプレイスした時のおもしろポイント -->

以前に内製で作られていた認証基盤を IDaaS(Auth0) での認証基盤にリプレイスしました。

基本的にリプレイス自体は大きな問題を起こさずに遂行できたのですが、その後に起きた事象がなかなか興味深かったので書いていきます。

似たようなことを考えている人には少し参考になるかもしれません。

## 対象読者

- これから認証基盤をリプレイスしようと試みている人(内製 -> IDaaS)

## 実際にやったことの概要

### Before

- 内製の認証基盤で認証を行なっていた
- よくある Email + Password の形式
- 秘匿情報を内部の DB に持っておりの危殆化リスクがある

### After

- 認証に関しては Auth0 の方に機能を移譲
- 諸々の事情(詳細は割愛)があり Google 認証 or Passwordless(メールで認証コードを送信)の形式に変更
- Password を全く持たない形式にした

## リプレイス後に起きたこと

### 「ログインできない」系のお問い合わせが起こる

UI の側面における変更点としては、よくあるログインフォームから[Auth0 が提供するログインフォーム](https://auth0.com/blog/jp-introducing-the-new-auth0-universal-login-experience/)への変更のみでした。

しかし、

- 旧形式(Email + Password)の方法がないこと
- 2 通りの方法(Google 認証 or [Passwordless](https://auth0.com/docs/connections/passwordless#email))が提供されていること

あたりが起因であろう問い合わせが 10 件ほどありました。

具体的な問い合わせの原因としては下記のようなものが挙げられます。

- 他のサービスと同じ要領で Google 認証をしてしまったが、実際にサービスを利用しているアカウントとは違う
- エイリアスの Email([参考](https://ferret-plus.com/5946))で登録されたアカウントで Google 認証を試みる(Google 認証はエイリアスの付与されていないアドレスのみで可能)
- [Passwordless](https://auth0.com/docs/connections/passwordless#email)の方式で認証コードが送られてから入力するまでの期間が長くて期限切れになる

基本的には顧客側のリテラシーによるもの、と言えるでしょう。

今回は toB のプロダクト(ユーザー数が少ない)というのもあり、顧客担当者を経由して自身が応対することでも十分対応できました。

しかし規模が大きくなったり、toC のプロダクトだったりすると問い合わせが捌き切れない懸念があります。

認証基盤のリプレイスは基本的に UI や仕様を変えないことが望ましいと言えます。あるいはリテラシーの低い方でも理解できるレベルの仕様にするといった配慮が必要です。

### 大口顧客が戻して欲しいと怒る

toB プロダクトあるある(?)かもしれませんが、プロダクトから取得できる情報(レポートデータなど)をスクレイピングで取得し、Excel データなどにまとめる。といったことを行なっている顧客がいました。

もちろん旧認証基盤前提でスクレイパーは実装されていますので、認証基盤を新しくするにあたり、そのスクレイパーは正しく動作しなくなります。

通常ですと新認証向けにスクレイパーを修正する、または Web API(自社で提供済み)を用いた情報の収集方法に切り替える。といったことを顧客に求めます。

しかし顧客とのパワーバランスによっては先述のような対応を行ってもらえないこともあります。今回はまさにそのような事例でした。

一応顧客側を配慮したリリースフローを組みました。具体的には下記のようなことを事前に行っています。

- リプレイス 1 ヶ月前に認証基盤が変わるので Web API を用いて情報収集を行ってもらう旨を、プロダクト内のお知らせ機能で通知
- 加えて、顧客へ直々に同様の内容のメールを送付

十分な期間(1 ヶ月)を設けたのですが、リリース後に「旧認証に戻して欲しい。さもなくば縁を切る。」といった旨の連絡が来てしまいました。大きなお金を落としてくれる顧客である以上、要望には従うしかありません。

結局、特定の顧客にかぎり旧認証基盤での認証を行える状態にしました。とどのつまり認証基盤は完全にリプレイスしきってはいないのです。実装上は疎な結合にはなっていますが...

このままでは引き下がれないので、なんとか対応方法を考えています。具体的には下記のようなものです。

- 自身が顧客側に出向する形で、Web API を用いた収集方法の実装を行う(コードに責任がつくのでおすすめはされなかった)
- Web API を用いた収集方法への移行ガイドラインやサンプルの実装などを資料として送付し、円滑に対応できる状態にする

## 終わりに

同じ部署の方々にこの話をしたところ「リプレイスって互換性とセットだよなぁ」といったことをぼやいていました。確かに自分の配慮が足りなかったなぁと。

今回はその反省というか体験をシェアする気持ちで書きました。

誰かの仕事の参考になれば幸いです。
「豆腐の角に頭をぶつけて〇ね！！」を実現してみた

<h1>豆腐の角</h1>
「豆腐の角に頭をぶつけて〇ね！！」という言葉を聞いたことがありますか？
これは「死ね」という罵倒表現を冗談めかして滑稽に述べる言い方であり、落語に由来するものと言われています。
<p><h3>**そうです**</h3></p>
豆腐は脆く、実際には実現不可能な事象です。
<p><h3>**そこで**</h3></p>
今回はこの問題を実現するために考えてみました。
<h1>使用する豆腐の設定</h1>
![illustkun-03732-tofu-300x300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301716/04bdab64-93cd-e4c4-3e38-8bbd0c34d82f.png)

この実験をするためには、そのままの脆い豆腐を、速度と空気抵抗に耐えれるものにしなければいけません。
そのような、 ***高速度かつ空気抵抗の低い物体*** といえば**弾丸**が思い浮かんだので、豆腐の状態を弾丸に近づける工程を行います。この工程では
<ul>
<li><strong>できるだけの空気抵抗をなくす</strong></li>

<li><strong>速度を上げる</strong></li>
</ul>
の二つが特に重要になってきます。</p>



鉛でできている弾丸の密度は１１.３４ｇ/立方センチメートルであることが分かっています。豆腐の密度をこれに近づけるには
<font color="Red"><h3>***密度＝質量÷体積***</h3></font>
の計算をすればよいことが分かります。

<h3>＜計算＞</h3>
弾丸の密度に近づけたいので、
<p>密度の値は<strong>１１．３４</strong></p>
<p>質量は、一般的な豆腐（重さ：２８０ｇ、カロリー：１５７kcal）<strong>１.１２ｇ</strong></p>
よって豆腐を弾丸に近づけるには、体積をｘとすると
<h4>11.34＝1.12/ｘ</h4>
<h4>ｘ＝0.09</h4>
よって、体積0.09ｇ/立方センチメートルの豆腐を用意することで、<strong>豆腐は弾丸になります。</strong>

<p>体積0.09だと、0.4×0.4×0.4というミジンコレベルの大きさ（ミジンコの大きさは1ミリメートル前後）の豆腐が出来上がってしまいますが気にしないようにしましょう。</p>

<h1>豆腐以外を使用したい方のために</h1>
「豆腐じゃなくて、違う物でやりたい！！！！」
<p>という方のために、入力した物質を弾丸に近づけるための体積を表示するプログラムを作ってみました。</p>


```C:tohu
include <stdio.h>
int main(void)
{
    char name[30];
    double g;
    double volume = 0;

    printf("使用する物質名を入力してください：");
    scanf("%s", name);
    printf("物質の質量を入力してください：");
    scanf("%lf", &g);

    volume = volume + g / 11.34;
    
    printf("%sを弾丸に近づけるには、%fcm/立法センチメートルの体積が必要です。", name, volume);

    return 0;
}
```
JSONの内容を使って環境変数を設定する(AWS ElasticBeanstalk)

# TL;DR

elasticbeanstalk環境がeb sshしたときに環境変数を定義済みにしてくれなくなったので、そうしてくれるワンライナーを書いた。(qiita上で見やすくするために \ とかを入れています。)

```bash
/opt/elasticbeanstalk/bin/get-config environment | \
jq -r 'to_entries|map("export \(.key)=\(.value|tostring)")|.[]' > ~/ebenv && \
source ~/ebenv
```

# 参考ページ

変換については、StackOverflowにほぼそのままの答があったので参照。bashではexportを入れないとグローバルに環境変数が設定されないのでその部分だけ少し修正。

https://stackoverflow.com/questions/25378013/how-to-convert-a-json-object-to-key-value-format-in-jq

elasticbeanstalkで環境変数を取得する方法は下記を参照。以前はどこかにあるファイルを参照すればよかった気がしているのだが、最近だとこちらが正なのかな。

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platforms-scripts.html
複数の配列を用意してvuedraggableを使用する方法

vuedraggableを使用した開発で、躓いた話です。
わかってしまえば簡単なことで、記事にするほどのことかと思いましたが、自分が躓いたと言うことは、もしかしたら誰か躓くことがあるかもしれないと思い、記事にすることにしました。
## 躓いたこと
ある配列の要素を、変数の数だけ空の配列を用意し、ドラッグ＆ドロップできるようにしたかった。
検索して出てくるサイトではitem1,item2などdataに配列を定義した状態の記事は見つけられたが、どう定義していいかわからなかった。

```vue:index.vue
<template>
  <v-row>
    <v-col>
      <v-list>
        <v-list-item-title> アンパンヘッドボーイ </v-list-item-title>
        <draggable v-model="item1" group="item">
          <v-list-item v-for="item in item1" :key="item.id">
            {{ item.name }}
          </v-list-item>
        </draggable>
      </v-list>
    </v-col>
    <v-col>
      <v-list>
        <v-list-item-title> カバ </v-list-item-title>
        <draggable v-model="item2" group="item">
          <v-list-item v-for="item in item2" :key="item.id">
            {{ item.name }}
          </v-list-item>
        </draggable>
      </v-list>
    </v-col>
    <v-col>
      <v-list>
        <v-list-item-title> うさぎ </v-list-item-title>
        <draggable v-model="item3" group="item">
          <v-list-item v-for="item in item3" :key="item.id">
            {{ item.name }}
          </v-list-item>
        </draggable>
      </v-list>
    </v-col>
  </v-row>
</template>

<script>
import draggable from "vuedraggable";

export default {
  components: { draggable },
  data: () => ({
    item1: [
      { id: 1, name: "アンパン1" },
      { id: 2, name: "アンパン2" },
      { id: 3, name: "アンパン3" },
    ],
    item2: [],
    item3: [],
  }),
};
</script>

```

![スクリーンショット 2021-12-05 10.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1924717/16e47cfc-5e53-1a10-43c0-5b66d5defaee.png)
今の状態

このアンパンを配る相手の分だけitemを定義しないといけない。
後々配る相手を動的に削除、追加を管理できるようにしたいと思いました。

## 方法
動物たちのデータをstoreで管理します。
そして動物の数（state.animals.length）だけ空の配列を用意してあげます。

```store:index.js
export const state = () => ({
  animals: [
    { id: 1, name: "カバ" },
    { id: 2, name: "うさぎ" },
    { id: 3, name: "犬" },
  ],
  items: [],
});
// ------------------Mutations-------------------------------
export const mutations = {
  items(state) {
    const newItems = new Array();
    for (let i = 0; i < state.animals.length; i++) {
      newItems[i] = new Array();
    }
    state.items = newItems;
  },

```

その後、vueファイルの動物の部分を

```index.vue
<v-row>
    <v-col v-for="(animal, index) in animals" :key="index">
      <v-list>
        <v-list-item-title> {{ animal.name }} </v-list-item-title>
        <draggable v-model="items[index]" group="item">
          <v-list-item v-for="item in items[index]" :key="item.id">
            {{ item.name }}
          </v-list-item>
        </draggable>
      </v-list>
    </v-col>
  </v-row>

<script>
//追加
created() {
    this.$store.commit("items");
  },
computed: {
    items() {
      return this.$store.state.items;
    },
</script>
```
と書き換えてあげれば、完成です！

っと言いたいところなのですが、このままでは操作した瞬間に

```
vuex do not mutate vuex store outside mutation handlers
```

とエラーが出てしまいます。
このvuedraggableを導入するにあたり、何度も苦しめられてきたエラーです。

ただ今回はあくまで配列を用意する記事ですので、
[vuedraggableで連想配列を操作した時に[vuex do not mutate vuex store outside mutation handlers]となった時の話](https://qiita.com/Turu05/items/2c00d4422468bcea48d0)の記事で紹介しています。

## おわり

不備、不明点があれば、お手数ですがコメントにてお伝え下さい。
Power BI で日本語フォントを設定する


## はじめに

デフォルトだと日本語フォントがないので、カスタムテーマを使用して日本語フォントを設定する方法を紹介します。


## 手順

今回は記事「[教育現場で話題！子どもの学習意欲を上げる「ＵＤデジタル教科書体」とは？](https://diamond.jp/articles/-/236214)」でみた、「ＵＤデジタル教科書体」をPower BI に適用しようと思います。


## 参考

[Power BI Blog: Importing Fonts into Power BI](https://www.sumproduct.com/blog/article/power-bi-tips/power-bi-importing-fonts-into-power-bi)

[作業中使うことが多い Power BI レポート の カスタムテーマ](https://qiita.com/PowerBIxyz/items/e30751ff310f34e1d99c)

[Power BI Desktop でレポート テーマを使用する](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-report-themes)

[UD Digi Kyokasho font family](https://docs.microsoft.com/ja-jp/typography/font-list/ud-digi-kyokasho)

## 手順


### 1. フォントの確認
1. フォント設定を開きます。
![2021-12-05-09-52-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ee82b2e0-5bbe-c867-b936-d9e2c20dfdbb.png)
2. 使用したいフォントを検索します。
![2021-12-05-09-54-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6f07842e-af81-9441-68a6-6c57d7128b46.png)
3. 完全名をメモします。
![2021-12-05-09-54-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/08cf526e-e141-388a-b87a-200f7058f786.png)


※なにか別名で設定しないといけないのかと思いいくつか試しましたが、完全名でいけました。

### 2. カスタムテーマの作成

[レポート テーマをエクスポートする](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-report-themes#export-report-themes)に従って基となるテーマをjsonとして出力します。

サンプルは下記です。



```json:json

{
    "name": "Theme_font",
    "visualStyles": {
        "*": {
            "*": {
                "*": [
                    {
                        "fontSize": 12,
                        "fontFamily": "UD デジタル 教科書体 NK-R",
                        "color": {
                            "solid": {}
                        }
                    }
                ]
            }
        }
    }
}

```

### 3. カスタムテーマのインポート

[カスタムのレポート テーマ ファイルをインポートする](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-report-themes#import-custom-report-theme-files)に従ってテーマのjsonファイルをインポートします。

フォントが設定されます。（プレビュー機能オンにしてるためUIが異なる点はご了承ください）
![2021-12-05-10-16-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/713eddaf-0cb1-9756-0ac0-072c970f9394.png)



## 確認した制約事項

- Power BI Serviceに発行した場合、フォントはWeb上でも反映されますが、Power BI Service上で作成したレポートには反映されません。
  - カスタムテーマの制約という感じ
【初心者向け】npmについてよく知らない人のための教科書 ~npm installは何をおこなっているのか~

# はじめに
対象はnpmを学習し始めた人、npmへの理解が浅い人となります。
本記事は、npm(node package manager)に苦手意識があった筆者が克服するために勉強した備忘録です。

# 開発環境
- Apple M1
    - Big Sur 11.6 
- Node.js
    - 16.13.0
- npm
    - 8.1.0

# npmとは
こちらについては、[【初心者向け】NPMとpackage.jsonを概念的に理解する](https://qiita.com/righteous/items/e5448cb2e7e11ab7d477)をお読みください。
「パッケージとは何か」や「package.jsonとpackage-lock.jsonの違い」など、とても理解がしやすいようにまとめられております。
いつかこんな素敵な記事を書いてみたいです。

# npm installとは
- パッケージをインストールするコマンドです。
- package.jsonのdependenciesとdevDependenciesに書かれているパッケージをインストールする
- npm installのエイリアスは、

```
npm i
または
npm add
```

です。
まれにエイリアスを使って、解説している記事があり、「このコマンド初めて見たかも？」と思ったものはエイリアスの可能性が高いです。
また、[公式](https://docs.npmjs.com/cli/v8/commands)を見てみると、他のコマンドにもエイリアスがたくさんあることがわかります。

# dependenciesとは
- 本番環境で必要なパッケージが書かれている
- dependenciesにパッケージを追加したいときは、

```
npm install <package-name> --save-prod
--save-prodを、-Pとしても可能
```

であるが、「--save-prod」はデフォルトなため

```
npm install <package-name>
```

と、「--save-prod」を省略できます。

# devDependenciesとは
- 開発環境やテストに必要なパッケージが書かれている
- devDependenciesにパッケージを追加したいときは

```
npm install <package-name> --save-dev
--save-devを、-Dとしても可能
```

# さいごに
わからないことがあった時に、Qiitaやドキュメント以外の記事を漁るクセなおしたい。
まず最初に目を通すべきは、やはりドキュメントですね！

# 参考・おすすめ記事

- 「『package.json』って何？って時に少し調べた時のノート」
    - https://overworker.hatenablog.jp/entry/2020/09/27/232236
- 「package-lock.jsonってなに？」
    - https://qiita.com/sugurutakahashi12345/items/1f6bb7a372b8263500e5
- 「package.json のチルダ(~) とキャレット(^)」
    - https://qiita.com/sotarok/items/4ebd4cfedab186355867
- 「【いまさらですが】package.jsonのdependenciesとdevDependencies」
    - https://qiita.com/chihiro/items/ca1529f9b3d016af53ec
- 「npmパッケージのvulnerability対応フロー」
    - https://qiita.com/riversun/items/7f1679509f38b1ae8adb
PowerAppsライセンスでDynamics 365利用可能

過去MSに問合せ内容を共有します。

[お問い合わせ内容]
------------------------------------------------------------
お客さんのDynamics365新規案件を検討しております。Dynamics 365/Power Appsのどちらで環境を構築するかを検討しております。

お客さんの業務はPower Apps　Model駆動アプリで問題なく構築できますが、将来的にはDynamics 365の機能も利用したい要望があります。

ただしPowerAppsからDynamics365にアップグレードする方法がなくて。以下の案を考えています。

・Dynamics 365 Sales 1ライセンス
・PowerApps数十ライセンス

この組み合わせで、環境をDynamics 365として構築して、Dynamics 365の特有のテーブルを利用せず、全てカスタマテーブルで構築してよろしいかを確認させていただきたいと思います。

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

以下はMSの回答
------------------------------------------------------------
[ご案内]

本件につきましては、お客様のご認識の通り、Dynamics 365 Sales と Power Apps ライセンスをご利用いただくことにより、Power Apps アプリ、および Dynamics 365 アプリの両方をご利用いただけます。

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

また以下のURLにも環境のアクセス制限にも以下の記載があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/ff046657-163a-d8c6-4cf2-4f14a6c01047.png)

https://docs.microsoft.com/ja-jp/power-platform/admin/api-request-limits-allocations
Cloudflare環境のNginxで正しいIPを取得しつつCloudflareを経由しない通信はブロックしたい

#前置き
Cloudflare使いながらNginxでCloudflareのIPではなく正しいクライアントのIPアドレスを受け取る方法はよく載ってて、
Cloudflareを経由しない通信はブロックする方法も乗ってるのだけど、
両者を併用するのが意外と難しかった件

#環境
Fedora 35のNginxをdnfでインストールしている

#Nginxの設定
Nginxで正しいIPアドレスを受け取れるようにするのはこれをnginx.confに追加するだけでOK
https://www.cloudflare.com/ips でリストに更新ないかはチェックしておくとして

```nginx.conf
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;

#use any of the following two

real_ip_header CF-Connecting-IP;
#real_ip_header X-Forwarded-For;
```

しかし今度Cloudflareを経由しないIPアドレスをブロックしようとしても
上記の設定で「CloudflareのIPアドレスの場合はクライアントのIPアドレスをアクセス元として置き換える」と設定しているので
単純にCloudflareのIPアドレス以外をブロックすると、全てのアクセスができなくなりますね
そこでこの設定をnginx.confに追加します。

```nginx.conf
geo $realip_remote_addr $cloudflare_ip {
    default          0;
    103.21.244.0/22  1;
    103.22.200.0/22  1;
    103.31.4.0/22    1;
    104.16.0.0/12    1;
    104.24.0.0/14    1;
    108.162.192.0/18 1;
    131.0.72.0/22    1;
    141.101.64.0/18  1;
    162.158.0.0/15   1;
    172.64.0.0/13    1;
    173.245.48.0/20  1;
    188.114.96.0/20  1;
    190.93.240.0/20  1;
    197.234.240.0/22 1;
    198.41.128.0/17  1;
    2400:cb00::/32   1;
    2405:8100::/32   1;
    2405:b500::/32   1;
    2606:4700::/32   1;
    2803:f800::/32   1;
    2c0f:f248::/32   1;
    2a06:98c0::/29   1;
}
```

これでCloudflareのIPであれば`$cloudflare_ip`は1になり、そうでなければ0になります。
そうしてCloudflareを経由しないアクセスを制限したいバーチャルホストのserverディレクティブの設定で

```hoge.com.conf
if ($cloudflare_ip != 1) {
    return 403;
}
```
を追加してやるとCloudflare経由しないアクセスに403を返すことができます。
もちろん他のステータスコードを返してもよいです。

```
sudo nginx -t
```
で問題なければ

```
sudo systemctl reload nginx
```
で反映です。

#もっと厳密に保護したい
ここまでの設定でほとんど大丈夫だとは思うのですが、実はIPアドレスは偽装可能なので、CloudflareのIPアドレスを名乗ってきたアクセスはそのまま通してしまいます。

そこでauthenticated origin pullsを設定したいと思います。

設定方法はこちらを参考にしてみてください。
https://developers.cloudflare.com/ssl/origin-configuration/authenticated-origin-pull/set-up#setup-instructions

基本的にはNginxでクライアント証明書の認証を有効にすることになります。
各サイトレベルで反映させたいので先ほどの各バーチャルホストの設定ファイルにこれを追加してあげてください。

``` hoge.com.conf
ssl_client_certificate /etc/nginx/certs/cloudflare.crt;
ssl_verify_client on;
```
書き終わったら

```
sudo nginx -t
```
で問題なければ

```
sudo systemctl reload nginx
```
で反映です。

これでIPアドレスとクライアント証明書を検証して通過するようになるので、かなりセキュアにはなったかなと思います。
未経験エンジニア転職１ヶ月を振り返って

こんにちは！未経験からエンジニア転職した『まさきち』です。
異業種からエンジニア転職して１ヶ月経ちましたので今まで感じたことなどをざっくり振り返ろうと思います。

## エンジニア転職するまで
- 前職は自動車関係部品の設計
- 某プログラミングスクールでRailsを学習
- 情報商材屋さんとのアレコレ
- プログラミング学習コミュニティ『ねこプロ』設立
- 最初の内定先が自社開発の皮を被ったヤバめのSESで消耗
- フリーランスエンジニアとして活動開始するも開始1ヶ月でいきなり契約切られる
- １１月に主にLaravelを使って開発する東京のWEB系受託の会社に転職

振り返ってみるといろんなことがありました。
なんだかんだ転職するまで約1年かかってしまった...

## 転職してから
念願のWEB系キラキラエンジニアになった私はまず社内の研修からスタート。
教育担当の人に今の自分のレベルを確認していただき内容を決めました。
全くの未経験の人なら3ヶ月かかるということでしたが、私はスクールなどで勉強もしていたので
2ヶ月で大丈夫だろうとのことでした。

### 研修内容
教育担当の人がチョイスしてくれた本を読んだり、課題をこなしながら行いました。
WEBとは何？から始まり、データベースやSQL、PHP/Laravelの基礎やLinux基礎など実際にコードを書いて
実際に手を動かしながら進んで行きました。

毎日学習した内容を教育担当の人と３０分くらい振り返る時間があるのですが、
学んだ内容を上手く説明できなかったりしてまだまだちゃんと理解できていないなと感じました。
コードレビューもしてもらえたのでかなり基礎は身についたと思います。

PHPのスクラッチ開発する課題もあったのですが、オブジェクト指向での実装は難しく感じました。
変数や関数の返り値の型はあまり意識したことがなかったので手間取った。
SQLで効率よくデータを取ってくる方法なども勉強になりました。

## 前職との違い
- 開始時間が遅めで前職は8:00スタートだったが現在は10:00スタートで朝はゆっくり
- 前職は作業着だったが現在は私服
- 社内の冷蔵庫に入っている飲み物は無料(前職は自販機でコーヒー缶を買ってた)

## これから
研修が終わり次第、まずは保守案件で先輩達の書いたコードで学びながらゆくゆくは新規開発に携わる予定みたい。
最近React✖︎TypeScript✖︎Laravelの案件が始まったのでそこに入って欲しいと先輩に言われたのでそこかなと。
SESで電気施工管理案件に飛ばされそうになったので開発ができそうで嬉しいです。

研修が思ったより早く終わりそうでもうすぐ案件に入れる予定なので頑張ろうと思います。
自己学習も引き続き行っていきます。
読んでくださりありがとうございました。
paiza「十億連勝 (paizaランク S 相当) 」をpython3で解いてみた

# 初めに
paizaの「[十億連勝 (paizaランク S 相当)](https://paiza.jp/works/mondai/real_event/continuous_winning)」を、python3で解いてみた。というよりも、解けなかったので、「解説を見てコードを考えた」というのが正しいかも。

# 方針
解説を、自分なりに解釈したものです。

- 帰納的に、i - 1 番目のステージまでの組み合わせの数から、i 番目のステージまでの組み合わせの数を求める。
- 各ステージ終了時に出現する状態を表すために、  
 - ステージ終了時点での連勝数 w と過去に X 連勝したことがあるかの真偽値 b の組 (w, b) を利用する。  
 - ステージ終了時点での各状態の組み合わせの数 c を dict で保存する。  
 - 組は、dict のキーにするために、hashable な tuple で表す。  
- 初期状態は、(0, False) で表せて、組み合わせの数は 1 である。  
- i - 1 番目のステージ終了時の状態の１つが (w, b) で組み合わせの数が c のとき、i 番目のステージ終了時の状態と組み合わせの数は、次のようになる。  
 - w + A[i] ≦ X のとき、
   - 全勝する場合は 1 通りで、連勝数は w + A[i] に延び、真偽値 b は変わらないから、  
   現在のステージ終了時の状態 (w + A[i], b) の組み合わせの数を c だけ増やす。
   - どこかで負ける場合は A[i] 通りあり、連勝数は 0 になり、、真偽値 b は変わらないから、  
   現在のステージ終了時の状態 (0, b) の組み合わせの数を c * A[i] だけ増やす。  
 - w + A[i] > X のとき、
   - X 連勝して次で負ける場合は 1 通りで、連勝数は 0 になり真偽値は True となるから、  
   現在のステージ終了時の状態 (0, True) の組み合わせの数を c だけ増やす。
   - X 連勝未満で負ける場合は X - w 通りあり、連勝数は 0 になり、、真偽値 b は変わらないから、  
   現在のステージ終了時の状態 (0, b) の組み合わせの数を c * (X - w) だけ増やす。
   - X + 1 連勝以上する場合は、隠し要素の条件を満たさないので無視する。  
- dict.get(key, default) で、key が辞書にあれば key に対する値を、そうでなければ default を取得する。  
- 隠し要素の条件を満たすプレイの仕方の総数は、  
真偽値 b が真か、全ステージが終わった時点での連勝数 w が X になっているものの総和を求める。  
- 下 9 桁の取り出しには、1000000000 で割った余りを用いる。

# コード
解説のC++のコードを参考にしました。

```python3
N, X = map(int, input().split())
A = [int(input()) for _ in range(N)]

previous = {(0, False): 1}
for i in range(N):
    current = {}
    for state in previous:
        w = state[0]
        b = state[1]
        c = previous[state]
        if w + A[i] <= X:
            current[(w + A[i], b)] = current.get((w + A[i], b), 0) + c
            current[(0, b)] = current.get((0, b), 0) + c * A[i]
        else:
            current[(0, True)] = current.get((0, True), 0) + c
            current[(0, b)] = current.get((0, b), 0) + c * (X - w)

    previous = current.copy()

answer = 0
for state in current:
    if state[1] or state[0] == X:
        answer += current[state]

print(answer % 1000000000)
```
[slack] Webhook urlの発行方法

毎回忘れるので、メモ。

# 手順
1. Slack公式サイトの[Webhook URL](https://slack.com/services/new/incoming-webhook)作成ページを開き、ログイン。
2. 画面右上赤枠のアカウント名をクリックし、通知先アカウントを選択。
![スクリーンショット 2021-12-05 午前9.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/76274695-305f-411f-9c24-065c00a055ef.png)
3. 画像の赤枠箇所で、通知を送りたいチャネル名を選択し、`Add Incoming WebHooks integration`を押す。
![スクリーンショット 2021-12-05 午前9.31.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/6bb656ac-972b-508f-6276-ed4c9ae40dc5.png)
4. 赤枠の部分にWebhook URLが表示されているので、これをコピーして使用する。
![スクリーンショット 2021-12-05 午前9.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/b91cec05-a898-969c-d7c8-7a95a62369ed.png)

# 参考
https://api.slack.com/messaging/webhooks
最近開発で使っているPLSQLがなんぞやという感じなのでわかったことを随時更新していく！！

## 参考にできそうなサイト一覧
(https://www.oracle.com/jp/a/tech/docs/technical-resources/b-11-plsql.pdf)


## VARCHAR2の2って何？
どうやら、ORACLE8iの際に、254バイト以下の可変長文字列のVARCHAR型を、4000バイト以下の可変長文字列をVARCHAR2型に拡張したということのようです。
ちなみにCHAR型は1～2000バイトまでの列長を指定することが出来ます。
一方VARCHAR2型は、1～4000バイトまでの列長を指定することが出来ます。

## %TYPE
%TYPEをつかうとテーブル定義のカラムの型と同じ型が自動で定義されるみたい
カラムの型が変わってもソースの修正が不要ですむ
【初心者のための】Cファイルをサクサク実行する方法（Visual Studio Code）

#この記事のゴール
ターミナルでCファイルをコンパイル、実行するためのコマンドを打つことなく瞬時に実行できるようにする！
#手順
##1 拡張機能のインストール
まずはVSCodeを開きます。
![2021-12-05 3.54のイメージ 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/122bbe27-6fc5-2a01-14b5-923a045d4a5d.jpeg)
上の黄色い丸で囲んだところをクリックすると、拡張機能の検索窓が出てくるので下の拡張機能を検索し、インストールしてください。
![2021-12-05 3.57のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/1d8dd77f-878f-22cf-4880-05262005137b.jpeg)
ここで、いったんVSCodeを終了します。
##2 Cファイルの作成
新しいフォルダを作りVSCodeを開きます。
![2021-12-05 4.07のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/69aad709-aefc-de98-df01-61b4fc648a80.jpeg)
黄色い丸で囲んだところが「ファイルの作成」です。選択して「ファイル名.c」と入力してください。作成したファイルにコードを書いていきます。
![2021-12-05 4.16のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/b415f872-8522-3d9d-9e83-b8977698fd9e.jpeg)
ここでは入力された値が素数かどうか判定するプログラムを用意しました。
##3 ターミナルを開く
コードが完成したので、コンパイル・実行に移ります。
画面左上の「ターミナル」から、「新しいターミナル」を選択してください。
##4 最初だけ必要な設定
画面左上の「実行」から、「デバッグの開始/デバッグなしで実行」を選択し、続いて「C++(GDB/LLDB)」、「gcc - アクティブファイルのビルドとデバッグ」を選択してください。
こうすることでフォルダの中にlaunch.jsonファイルとtask.jsonファイルが作られます。
![2021-12-05 4.28のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/b235affc-6c5b-16fd-6533-c5daa55744e1.jpeg)
##5 実行
実行したいファイルを選択した状態で、画面左上の「実行」から、「デバッグの開始/デバッグなしで実行」を選択します。
設定は完了しているので同じフォルダ内にある他のファイルは５の手順のみでCフォルダをサクサク実行できるようになるはずです！

が、

私はここからエラーが出てしまいました...

##エラーの解決方法
環境：macOS Big Sur バージョン11.31(M1)
     　　　 Visual Studio Code バージョン1.56.2

エラーメッセージは以下

```
ERROR: Unable to start debugging. Unexpected LLDB output from command "-exec-run". process exited with status -1 (attach failed ((os/kern) invalid argument))
```
まず、以下の拡張機能をインストールしてください。
![FDBA9796-3D49-465A-BC6B-45C7991E6C5C_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/525c619b-cdcd-7682-f6a1-fc00893863e9.jpeg)
ここで、いったんVSCodeを終了します。再度開き直してください。
変更するのはlaunch.jsonファイルの一箇所だけです！
変更前↓

```json:launch.json
"type":" cppdbg"
```

変更後↓

```json:launch.json
"type":" lldb"
```

このように変更するとlaunch.jsonファイルの変更していない部分に波線が出てきますがこれは無視して大丈夫です。変更が終わったら手順の５を再度行ってください。
無事、コマンドを打つことなくファイルのコンパイルと実行ができました。
![2021-12-05 4.56のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/8f65bd6a-f54b-ac08-80d2-3090ecc72b34.jpeg)
#最後に
手順はとっても簡単です。プログラミング初心者の方もぜひ試して欲しいです！
【Google Analytics初心者向け】忙しいエンジニアのためのGA入門

この記事は[Ateam Hikkoshi samurai Inc. × Ateam Connect Inc. AdventCalendar2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect) 5日目の記事です。本日の担当は引越し侍エンジニアの@namiitaです。

# はじめに
去年のアドベントカレンダーでは「[webサイト改善のヒント](https://qiita.com/namiita/items/3408f5bf0cae8a43ee61)」という記事を書きました。こちらに記載の通り、引越し侍ではGoogle Analytics(GA)をサイト改善に活用しています。

GAは使いこなせると便利なアクセス解析ツールですが、私たちバックエンドエンジニアはどちらかといえばアクセス解析よりプログラミングにかける時間の方が長いです。分析業務に関してマーケティング担当に一任している方も少なくないのではないでしょうか。

今回は、「とりあえず最低限GAを理解しておきたい」というエンジニアの方向けの記事となります。細かい操作方法などは記載しないので、実際に手を動かす際は色々調べてみてくださいね！ある日突然「このページをアクセス解析できるようにしておいて」と言われても焦らないように心構えしておきましょう。

# GAの始め方・使い方
大体の図を書きました。こちらをざっくり理解するのが本記事のゴールです。
![ga.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306965/1bc27603-9014-edae-c849-afae9023a79b.png)

## 1.GAを使う準備
### 1-1.Googleアカウントを作る
GAはGoogleアカウントがあれば無料で誰でも使える便利なツールです。

https://marketingplatform.google.com/intl/ja/about/analytics/

こちらからGAの管理画面にログインしておきましょう。

> 旧バージョンは「UA」、新バージョンは「GA4」と呼ばれますが、どちらもGoogle Analyticsのことです。現在はデフォルトでGA4を使います。

### 1-2.GAプロパティを作る
「管理＞プロパティを作成」から新規プロパティを作成します。プロパティを作成したら「管理＞データストリーム」から、アクセス解析したいサイトのURLを入力します。

「測定ID」(「G-○○○」という形式)を得ることができるので、控えておきましょう。

>サイトが複数ある場合、代表で１つ選んでデータストリームに入力します。

## 2.WebサイトにGAを設置する
### 2-1.Google Tag Manager(GTM)アカウントを作る
GTMは誰でも無料で使えるタグマネジメントツールです。GAに限らず、何かしらサイトにタグを設置したい場合は、GTMさえあればいちいちHTMLを編集しなくて良くなるのでかなり効率的です！GAプロパティの差し替えなども開発不要でできるようになります。

https://marketingplatform.google.com/intl/ja/about/tag-manager/

こちらからGTMアカウント作成、コンテナを作成しておきましょう。基本的に1サイト＝1コンテナと考えておけば大丈夫です。
### 2-2.GTMのタグをWebサイトに埋めこむ
開発が必要なのは基本的にここだけです！エンジニアが依頼される「GA使えるようにしといて」は主にこの工程のことを指します。

コンテナを作成した際に発行されるGTMのタグを「head直下」と「body直下」に書き込みます。サイト全体でタグが表示されるようにしましょう。これでGTMが使えるようになり、GAを使う準備が整いました。

### 2-3.GTMでGAを設定する
「新しいタグを追加＞タグの設定＞Googleアナリティクス：G4設定」を選択します。測定IDを入力する欄があるので1-2で獲得した測定IDを入力、トリガーに「All Pages」を選択します。

これでGTMを設置したサイト全体にGAを適用することができました。

## 3.アクセス解析を行う
### 3-1.GAダッシュボードを使う
GA上で各ページのビュー数やイベントを見てみましょう。ほぼリアルタイムに数値が表示されるのでいつでもサイトの状態を確認することができます。

「イベントを作成」から独自にイベントを細かく設定することもできますので、色々試してみると面白いですよ！イベントを新しく設定する際にはGTMのプレビューモードできちんと発火しているかを確認しましょう。

### 3-2.スプレッドシートにデータ抽出する
GAで取得したデータを定期的にレポートにまとめたい等の需要がある場合はスプレッドシートとの連携がおすすめです。GAを使っているGoogleアカウントでスプレッドシートを開き、「アドオン＞アドオンを取得＞Google　Analytics」を選択することで簡単に連携できます。

>少し癖があるので直感で使うのではなくマニュアル等を読んだ方が良いです。

## 3-3.計測ツールのメンテナンス
長くGAを運用しているとサイトやタグの種類が膨大になって整理に一苦労なんてこともあります。二重計測など、想定していないデータが入ってこないようにGTMやGAの見直しは定期的に行いましょう。

タグの整理に便利なChrome拡張「Tag Assistant」がおすすめなので、GA導入した際には使ってみてください。

# まとめ
いかがでしたでしょうか？GAのことがざっくりでも伝われば幸いです。

冒頭にも述べた通り、アクセス解析はプログラマーの主たる業務ではないかもしれませんが、分析から開発まで一貫して経験するとリリースの喜びもひとしおです。使い込めば使い込むほど複雑化していくGA、何かあったときにサポートできるかっこいいエンジニアでありたいものです。

# 明日
明日は@ayumikさんの投稿です！お楽しみに！
Modeling points and work flow

# work flow
* work
 * create mesh
 * create material
 * create texture
 * create armature
 * create animertion

## Texture
 * UV展開

#Point
+ Topology
 + 面に対する頂点数は3(機械が扱いやすい)or4(ひとが扱いやすい)
 + 基本的には１つの面に対して頂点は４つ
 + １つの頂点に接続する辺の数は3(使い時),4(使い時),5(使い時)

* Edge flow
    * エッジフローとは、エッジがモデルの曲率と特徴に従うようにするモデリング手法
ミルククラウン解析（その２，解析モデルおよび解析条件）

# 概要
オープンCAEシンポジウム2021のオープンCAEコンテスト2021に応募したミルククラウン解析の解析結果をコンテストが終了したので、順次公開します。

# 解析モデル
解析は全体の1/4の領域で行い、後処理で対象面を結合します。
壁面はスリップなし、天井部は開放、底部は接触角5°を設定します。

![model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/26f82f7b-1a18-cdb1-bd22-5a7943eb6eb2.png)

|項目|単位|設定内容|
|---|---|:-:|:-:|
|液滴直径 _D_|mm|7.04|
|落下速度 _U_|m/s|1.61|
|初期水位 _h_|mm|0.82|

|項目|単位|設定内容x|設定内容y|設定内容z|
|---|---|:-:|:-:|:-:|:-:|
|長さ _L_|mm|30|30|20|
|分割数 _N_|-|300|300|150|

上図にある通り、x, y方向は均等に分割しますが、z方向は丈夫をgradingにして総メッシュ数を減らすようにしています。

# 解析条件
解析はESI版_OpenFOAM-v2106_で実施しました。ソルバは_interFoam_で、_Smoothed CSF_モデルを実装しました。
_Smoothed CSF_モデルについては、別途詳しく説明します。

|項目1|項目2|項目3|単位|設定内容|
|---|---|---|:-:|:-:|
|_system_|_controlDict_|開始時刻|sec|0|
|   |   |終了時刻|sec|4e-02|
|   |   |出力間隔|sec|1e-04|
|   |   |$\Delta$ _t_|sec|自動調整|
|   |   |最大$\Delta$ _t_|sec|0.5|
|   |   |最大_Co_|-|1|

|項目1|項目2|項目3|項目4|設定内容|
|---|---|---|:-:|:-:|
|_system_|_fvSchemes_|_ddtSchemes_|-|Euler|
|   |   |_gradSchemes_|-|Gauss linear|
|   |   |_divSchemes_|div(rhoPhi,U)|Gauss linearUpwind grad(U)|
|   |   |   |div(phi,alpha)|Gauss vanLeer|
|   |   |   |div(phirb,alpha)|Gauss linear|
|   |   |   |div(((rho*nuEff)*dev2(T(grad(U)))))|Gauss linear|
|   |   |_laplacianSchemes_|-|Gauss linear orthogonal|
|   |   |_interpolationSchemes_|-|Gauss linear|
|   |   |_snGradSchemes_|-|orthogonal|
|   |_fvSolution_|_"alpha.water.*"_|nAlphaCorr|2|
|   |   |   |nAlphaSubCycles|1|
|   |   |   |cAlpha|1|
|   |   |   |icAlpha|0.5|
|   |   |   |scAlpha|1|
|   |   |   |MULESCorr|yes|
|   |   |   |nLimiterIter|5|
|   |   |   |solver|smoothSolver|
|   |   |   |smoother|symGaussSeidel|
|   |   |   |tolerance|1e-08|
|   |   |   |relTol|0|
|   |   |_"pcorr.*"_|solver|PCG|
|   |   |   |preconditioner|DIC|
|   |   |   |tolerance|1e-10|
|   |   |   |relTol|0|
|   |   |_p_rgh_|solver|GAMG|
|   |   |   |smoother|DICGaussSeidel|
|   |   |   |tolerance|1e-07|
|   |   |   |relTol|0.05|
|   |   |_p_rghFinal_|$p_rgh|-|
|   |   |   |relTol|0|
|   |   |_U_|solver|PBiCGStab|
|   |   |   |preconditioner|DILU|
|   |   |   |tolerance|1e-06|
|   |   |   |relTol|0|
|   |   |_PIMPLE_|momentumPredictor|no|
|   |   |   |nOuterCorrectors|1|
|   |   |   |nCorrectors|3|
|   |   |   |nNonOrthogonalCorrectors|0|

|項目1|項目2|項目3|単位|設定内容|
|---|---|---|:-:|:-:|
|_constant_|_transportProperties_|水の動粘性係数 $\nu$|m2/s|1e-06|
|   |   |水の密度 $\rho$|kg/m3|1000|
|   |   |空気の動粘性係数 $\nu$|m2/s|1e-05|
|   |   |空気の密度 $\rho$|kg/m3|1|
|   |   |表面張力 $\sigma$|N/m|0.0725|
|   |_g_|重力加速度ベクトル|m/s2|(0 0 -9.81)|
|   |_turbulenceProperties_|シミュレーション型|-|層流|
Snowparkを試してみた⛄️

# Snowparkとは

クラウド型DWHのSnowlakeから今年の6月にリリースされた新機能です。
Snowflake内のデータを操作するAPIでSnowflakeの計算リソースを使って処理の実行をすることができます。
現在はScalaのみサポートしてるみたいです。

## 試してみる
公式の手順に沿ってやってみました。

https://docs.snowflake.com/ja/developer-guide/snowpark/quickstart-intellij.html


build.sbtに依存関係を追加します。
`Scala 2.13.x`ではSnowparkは対応していないようなので気をつけてください！

```build.sbt
name := "snowpark"

version := "0.1"

scalaVersion := "2.12.13"

libraryDependencies += "com.snowflake" % "snowpark" % "0.10.0"
```

table1の内容をセレクトするコードを書いてみました。
設定情報は`profile.properties`に書いています。

https://docs.snowflake.com/ja/developer-guide/snowpark/creating-session.html#label-snowpark-creating-session

```Main.scala
import com.snowflake.snowpark.Session

object Main {
  def main(args: Array[String]): Unit = {
    val session = Session.builder.configFile(getClass.getResource("/profile.properties").getPath).create
    session.sql("select * from table1").show()
    session.close()
  }
}
```

無事取得できました！

![スクリーンショット 2021-12-03 21.22.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314548/f210bf94-a5e0-7b4e-3736-e985188d70e4.png)


クラウドデータプラットフォームを目指すという心意気が感じられる機能だと思いました。
機械学習系のライブラリもSnowflakeのリソースを使って実行できるのでPythonのサポートも楽しみですね！
Raspberry pi picoで作るマルチUSB-TTLシリアルコンバータ

#はじめに
　USB-TTLを有するマイクロコントローラ搭載機器は、USBケーブル1本でパソコンに接続して色々な実験を行うことができるので、お手軽に手を出してしまいます。そうすると、旬を過ぎた搭載機器が複数たまってきます。最近だと、Raspberry Pi Pico(以降、pico)が役目無く保存されているかと思います。有効活用できないかとPicoのピン配置を眺めてしまいます。例えば、シリアル接続で制御する機器を利用する場合、picoをUSB-TTLとして利用できるとUSB-TTLシリアルコンバータがいたずらに増えるのを抑制することができます。

#USB-TTLコンバータとして利用可能なArduino
　例えば、FTDIチップを搭載したAruduinoでは以下の3つの方法でUSB-TTLコンバータとして利用可能であることが知られています[^1]。
　　　1.リセットとGNDを接続 
　　　2. ATMELのチップを外す
　　　3.スケッチを実行　　

```java:スケッチ例
void setup(){
  pinMode(0,INPUT); 
  pinMode(1,INPUT); 
} 
void loop(){ 
} 
```
[^1]:https://create.arduino.cc/projecthub/PatelDarshil/ways-to-use-arduino-as-usb-to-ttl-converter-475533

　配線やプログラムで、同様のことをpicoで行うことができれば、picoの再利用が可能となります。

[^1]: https://create.arduino.cc/projecthub/PatelDarshil/ways-to-use-arduino-as-usb-to-ttl-converter-475533

#PicoのUART端子
　Picoの端子の役割を眺めていると、UART0とUART1の2組のUARTが搭載がされていることがわかります。さらに、ピンアウトの図を参照すると、6組のUARTの記載があります。1つのpicoで、6個のシリアル通信ができる可能性があります[^2]。

[^2]:https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf

　UF2ファイルが用意できれば、Raspberry pi picoをUSB-TTLシリアルコンバータに流用できそうです。まずは、USB-TTLアダプタとしての利用例を調べてみます。

[^2]: https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf

#2組のUARTを利用可能なpicoで作るUSB-TTLコンバータ
　Raspberrypi.orgのフォーラムに「Pico UART-USB Bridge」との記事が、2019年10月1日に投稿されていました[^3]。

[^3]:https://www.raspberrypi.org/forums/viewtopic.php?t=302684

　この記事では、GP0とGP1の組み、GP4とGP5の組みをハードウェアUARTとして同時に利用可能であると紹介しています。
　GithubにソースファイルだけでなくUF2ファイルも公開されていますので、すぐに利用可能です[^4]。

[^4]:https://github.com/Noltari/pico-uart-bridge

  UF2ファイルを書き込んだpicoをwindows10のマシンに接続してデバイスマネージャーを確認すると、COMポートが2個増えていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/05566968-cace-471a-73de-790672c3a870.png)
　よりたくさんのUSB-TTLコンバータの例を調べてみました。

[^3]: https://www.raspberrypi.org/forums/viewtopic.php?t=302684
[^4]: https://github.com/Noltari/pico-uart-bridge

#6組のUARTを利用可能なpicoで作るUSB-TTLコンバータ
　Raspberrypi.orgの2021年3月6日の投稿に、「Re:Pico UART-USB Bridge」として6組のUARTが利用可能なUF2が公開されてました[^5]。

[^5]:https://www.raspberrypi.org/forums/viewtopic.php?t=302684

　githubのソースファイルも公開されています[^6]。

[^6]:https://github.com/harrywalsh/pico-hw_and_pio-uart-gridge

　picoのGP0とGP1、GP4とGP5、GP8とGP9、GP12とGP13、GP16とGP17、GP20とGP21の6組のUARTが利用可能になっています。
 　実際に試してみると、COMポートが6個増えました。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/ff8338f4-3207-aba3-2685-316712e8d3fb.png)
　このUF2には、以下の注意点が明記されています。
>　The PIO uarts are currently all 8x1. They will support but not check odd/even/no parity bit.

　6組のうち4組は8x1に固定されているので、他の設定で接続したい場合、ハードウェア制御されているGP0とGP1、GP4とGP5の組を使う必要があります。

[^5]: https://www.raspberrypi.org/forums/viewtopic.php?t=302684
[^6]: https://github.com/harrywalsh/pico-hw_and_pio-uart-gridge

#おわりに
　6組のUARTを有するUSB-TTLシリアルコンバータを、picoで作成することが可能でした。picoのコンバータの信号レベルは3.3 Vなので、それ以外の電圧のものと接続する場合、レベルコンバートして信号をpicoに入力しないと、破損の恐れがあります。実際の接続の際には注意が必要です。
　USBケーブルで複数のマイクロコントローラを制御しているとUSB端子が足りなくなることがあります。複数のシリアルポートを有するUSB接続の変換アダプタは購入可能ですが、Amazonで商品の値段を見てみると4ポート搭載で1万円以上の価格だとわかります。USB端子が足りなくなっている場合に今回の記事が参考になればと思います。
wgetで失敗するトラブルシューティング

## はじめに
wgetコマンドでhttp経由でファイルを取得しようとしたところ、次のエラーがでて取得ができなかった。そのトラブルシューティング。

>
failed: Temporary failure in name resolution.
wget: unable to resolve host address

## 環境
focal (Ubuntu 20.04)

## 前置き

結論をいうと、DNSによる名前解決ができなかったことが原因です。自分の環境で設定しているDNSサーバーでは名前解決ができないようで、代わりに、GoogleのPublic DNS（8.8.8.8）を設定すれば解決できた。

DNSサーバーのIPアドレスには、自分が契約をしているインターネットプロバイダーが公開しているDNSサーバーのアドレスを設定するのが普通だと思う。物理的な距離が一番近いため、そこのDNSサーバーで名前解決した方が一番高速だと思われるためだ。そもそも、インターネットプロバイダーと契約したとき、DNSサーバーのIPアドレスには、このIPアドレスを指定してくださいと、契約書に書かれているため、そのとおりに設定しているはずだ。自宅に外向けのDNSサーバーを構築して、そこで名前解決をさせない限り、以降、変更することはない。

それが、各プロバイダーのDNSサーバーを駆逐するかのごとく、GoogleがPublic DNSサーバーを公開しているのだ。

「GoogleのDNSサーバーってたぶんアメリカにあるんでしょ。そんなところまで
参照しにいったら、名前解決に時間がかかるじゃん」って思うだろう。だがどうも、GoogleのPublic DNSサーバーを参照した方が、レスポンスが速いらしい。詳細なベンチマークテストをおこなったわけではないので、どの程度高速になったかは分からない。少なくても体感的には高速度加減はわからない。

## やったこと

さて、実際に、GoogleのPublicDNSサーバーを設定してみよう。

DNSサーバーのIPアドレスは**/etc/resolv.conf**で設定する。**ls -l /etc/resolv.conf**をすると、**/run/systemd/resolve/stub-resolv.conf**のシンボリックリンクとなっている。

**resolv.conf**に次の一行を追加する。ルート権限でviを開かないと、保存ができないので注意。

```
nameserver 8.8.8.8
```

この後、wgetをすると、すんなりダウンロードができるようになりました。8.8.8.8はプライマリサーバーなので、セカンダリサーバーのIPアドレスも設定しておいた方が無難だろう。
アレクサを好きなようにしゃべらせる

ひとりアドベントカレンダー４日目

昨日は寝てしまったので遅れてしまいました。あまり遅れると連鎖するので気を付けよう。

EchoやEcho dot、いわゆるスマートスピーカーであるアレクサを3年ほど使っている。
ことばを覚えて話し始めた子供だとなかなか最初は認識くれなかったりするが、次第に発音がよくなってきているのか、アレクサが学習しているのか、どちらにせよ認識するようになる。
なんらな”アレクタ”っぽい発音でも認識したりしている。

# 動機

そんな感じなので、アレクサの言うことなら聞いてくれそうだと思って、探しました。

[Alexa\(Amazon Echo\)をコマンドラインから自由に喋らせる方法 \- Qiita](https://qiita.com/shge/items/169de61c8f246d26c110)

## 実行例
とりあえず、実行例です。個別のコードは隠しています。
上に示したページではスクリプトを書き換えて対応していましたが、ここでは環境変数の設定で書いてみました。

``` bash
MFA_SECRET='取得したシークレットコード' AMAZON='amazon.co.jp' ALEXA='alexa.amazon.co.jp' LANGUAGE='ja-JP' TTS_LOCALE='ja-JP' ./alexa_remote_control_plain.sh -d "MyDot" -e "speak:準備できたら靴をはいてくださいね"
sending cmd:speak:準備できたら靴をはいてくださいね to dev:MyDot type:XXXXXXXXXXXXXX serial:XXXXXXXXXXXXXXXX customerid:XXXXXXXXXXXXXX
```

# 手順

実行例で示した '取得したシークレットコード' の取得方法をメインに手順を書いていきます。  

1. スクリプトを取得
1. Amazonに2段階認証の設定ページからコード取得
1. Amazonに2段階認証の設定でちゃんと登録

## スクリプトを取得

githubからスクリプトを取得します。
jqのインストールを必要としない```alexa_remote_control_plain.sh```をダウンロード、alexaフォルダに入れておきます。
jqを使用する場合と機能の違いがあるのかわかりませんが不便していないのでこれを使用しています。
https://github.com/thorsten-gehrig/alexa-remote-control

## Amazonに2段階認証の設定ページからコード取得

1. Amazonの[2段階認証（2SV）の設定](https://www.amazon.co.jp/a/settings/approval?)のページへアクセス  
  ここで2段階認証が必要で、設定した携帯等にSMSでメッセージが来るので承認します。  
  （[ログインとセキュリティ](https://www.amazon.co.jp/gp/css/account/info/view.html)から2段階認証の有効化が必要かもしれません）
1. [新しいアプリを追加]のリンクへ、2段階認証手段を追加のページに来ます。
1. QRコードの下[バーコードをスキャンできませんか？]をクリックすると表示される大文字英数字のコードをコピーして保存しておきます。
1. これを実行例の取得したシークレットコードのところに入れて実行するとひとまず動きました。

## Amazonに2段階認証の設定でちゃんと登録

ここまでの方法だと最初はうまくいくもののしばらくするとうまくいかなくなりました。
調べたところ、いくつか見つかりましたが以下のissuesの最後の方の投稿でまとめられている方法を実行しました。
[Failed login \-\- apparent captcha · Issue \#10 · thorsten\-gehrig/alexa\-remote\-control](https://github.com/thorsten-gehrig/alexa-remote-control/issues/10)

具体的にはまずoathtoolをインストールし、それを使用します。

``` bash
sudo apt install oathtool
oathtool --base32 --totp "MFA_SECRET"
XXXXXX
```

MFA_SECRETとなっている所に先ほど取得したコードを設定して実行すると6桁の数字が表示されます。
これは**ワンタイムパスワード**になっていて、30秒ごとに出力内容が変わるようになっているようです。
なので、変わるタイミングにまたがらないよう、表示されたらすぐに次の操作をしないといけません。
具体的には先ほどコードを取得した 2段階認証手段を追加 のページの下の入力フォームに表示された6桁の数字を入力して[ワンタイムパスワードを確認して次に進む]を押します。
これでこのコードを使用したスクリプトがアプリとして登録され、実行できるようになるはずです。
確認できたら、環境変数で設定していた項目をスクリプトに反映しておいた方が便利でしょう。
SET_MFA_SECRET以外に以下の4つを設定しておきました

``` alexa_remote_control_plain.sh
SET_LANGUAGE='ja-JP'
SET_TTS_LOCALE='ja-JP'
SET_AMAZON='amazon.co.jp'
SET_ALEXA='alexa.amazon.co.jp'
```

# まとめ

これでコマンドラインからアレクサを好きなようにしゃべらせることができるようになりました。
より便利に使えるようにWebインターフェイスを作るところまで書きたかったのですが、それは次回に。
また、今回の実行例はしゃべらせるだけ(speak:)でしたが、同様のコマンドでいろいろできるので参考ページを書いておきます。
[Alexaを自由に喋らせる方法（コマンドライン編） \| 育児×家事×IoT](https://dream-soft.mydns.jp/blog/developper/smarthome/2021/03/2932/)

実はこの作業をしたのは8月頃だったのですが、最近リフレッシュトークンを使用する新しい方法が出てきているようです。今回は調べきれなかったので後日やってみたいと思います。
これも参考ページだけ書いておきます。
[Lötzimmer: Alexa Remote Control Shell Script](https://blog.loetzimmer.de/2021/09/alexa-remote-control-shell-script.html)
neosでlogix その17

#概要

niosでlogixやってみる。
練習問題やってみた。

#練習問題

zundokoを求めよ。

#写真

![2021-12-04 23.06.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a1ec839f-c460-e9be-35e5-2a48cb9589bb.jpeg)



以上。