OmniAICreator/Qiita-1.07M huggingface dataset:
LINE Messaging APIでbotを作ろうとしたら普通につまづいた。

初めまして、Jと申します。プログラミング初心者です。

誰かに見てもらうというよりかは、自分の備忘録的な記事を書いていこうと思います。


\
先日、LINE Messaging APIを用いてチャットbotを作成しようとしたところ、案の定つまづきました。
色々な記事を漁って出てきたことを手当たり次第で試したみたのですが上手くいかず...。そもそも知らないことが多すぎました。

というわけで現実逃避がてらに記事を書こうと思います。

エラーが発生しても「なんじゃこりゃ？」状態。
記事「Gitにpushします。」→僕「お前は何を言っているんだ？」状態。
今のところ色々調べたことを綴っていきます。

Q.君はどんなソフトなんだい？
まず調べて出てきたソフトウェア、サービスを列挙しますと

・Python　　←耳にタコができるほど聞いた。
・Git　　←なんか聞いたことあるけど違うやつな気がする。
・Github　　←うん、君が聞いたことあるやつだね。
・Heroku　　←お初にお目にかかります。今後ともよろしくお願いします。

ここらへんですねー。


\
Pythonで書こうとしてたんで、もちろん知ってます。なので割愛します。


\
Gitに関しては「聞いたことあるなー」と思ってたんですが、Githubと勘違いをしていました。
さくっと調べて自分なりにまとめてみました。


\
【僕みたいな一人でプログラムを書く人に嬉しい機能がある】
みなさん、マイクラでMODを入れたことはありますか？
そして、「このMOD、古いバージョンにしか対応してないから入れられないわー」という経験はありますか？
このような状態に陥ったときにGitが役立ちます。
自分が使っている言語のバージョンを変えるのを容易にしてくれます。
「この書き方、古いバージョンにしか対応してないけど、もうアップデートしちゃったしなー」みたいなときですね。
あんまよくわかってないんですけど、仕組みについても書こうと思います（間違えてても怒らないでね☆）
すごい簡単に言うと、自分のパソコンに「ローカルレポジトリ」というものを作ります（レポジトリとはフォルダみたいなやつ）。このファイルは自分のパソコンで普通のフォルダのように使えるのですが、Gitの監視下でもあります。そこでバージョンの管理をしたりするらしいですわ。

【僕は全然経験したことのない、グループでプログラムを完成させる方にとって嬉しい機能もある】
先ほど紹介した「ローカルレポジトリ」の他にもレポジトリがあります。それは「リモートレポジトリ」です。こいつは僕らのパソコン内にはありません。いわゆる「クラウド」みたいなやつです。Gitのサーバーに作られるレポジトリです。そしてこのサービスがGithubです。「え？どういうこと？」だって？それはまた後程。
グループでプログラムを編集していると「いつ、誰が更新したのか」がわからなくなって大変なことになるらしいですよー。知らんけど。
こういう場合にもGitとは対応できるらしい。技術の進歩。
ファイルのログにそういう情報が登録されていくらしい。べんりー－－。

\
お待たせしました。Githubのご紹介です。
聞いたことあるのはこいつでしたわ。「似てる名前してんね！JavaとJava Scriptみたいな感じか！」と思ってたんですが、がっつり密接な関係にありますわ。先ほど述べました、「リモートレポジトリ」を置いておく場所がGithubらしいです。YouTubeみたいに「公開」状態にして、みんなに見てもらうこともできるし、「限定公開」状態にして、グループの他の方に見せることもできると。めちゃくちゃ便利やん！
「Githubで草を生やす」みたいな話を聞きますが、「リモートレポジトリ」にファイルをアップロードすることで草が生えるらしいですよ。何がおもろいねん。

\
さぁ、聞いたことすらない問題児、Herokuくんです。
この子はどうやらサーバーを貸してくれて、その中のOS、ソフトウェア上で僕らの代わりにファイルを実行してくれるサービスのようです。
つまり実行したいファイル（僕ならPythonのソースコード）を渡します。そうするだけで実行してくれます。そう！既にPython、Rubyなどが導入されている状態なんですよ！「こいつはすげぇ！」と思いました！そして一つのサービスだけなら無料という太っ腹。
ちなみに難しい言葉を言うと、PaaS(Platform as a Service)のひとつです。
同じような言葉でIaaS(Infrastructure as a Service)というものがあります。こちらはサーバーとOSしかありません。Pythonなどは入っていないので、そこの設定から入らなければいけないというわけですねぇ。大変面倒です。

そんな便利なものがあるなんて、なんで誰も教えてくれなかったんだ！

というわけで満足したので、作業に戻ろうと思います。
次回はこいつらをどのように繋げていくのか、まとめ記事を書いていこうと思います。
それでは。
レスポンシヴウェブデザイン


.600px から800pxの間だけ背景をつける
```
@media (min-width: 600px) and (max-width: 800px) {
  body {
    background: skyblue;
  }
}
```

🌟モバイルファーストで小さい方から書いていく



・画面幅に合わせて可変を使うとき

```
aside {
  display: none;　←600px以下では広告を表示しない
}

.image {
  background: pink;
  height: 100px;
}

.text {
  background: silver;
  height: 100px;
}

/* medium screen */
600px以下では横並びにし、textに可変を効かせる

@media (min-width: 600px) {
  section {
    display: flex;
  }

  .image {
    width: 200px;
  }

  .text {
    flex: 1;
  }
}

/* large screen */
@media (min-width: 800px) {
  section {
    width: 800px;
    margin: 0 auto;
  }

  aside {
    display: block;　←noneにしていたため初期値のblockに戻す
    background: plum;
    width: 160px;
  }
}
```
change_column_defaultのrollbackを流すには

### 環境
- Rails 5.2
- Ubuntu20.4

### 内容

マイグレーションファイルで、**test1sテーブル**の**test1_codeカラム**に、デフォルト値として **「 ""（空白）」** を設定する記述をします。
```xxx.rb
def change
    change_column_default :test1s, :test1_code, ""
end
```

マイグレーションを実行すると、正常に実行されました。
```
$rails db:migrate
```

schema.rbを見ると、デフォルト値が確かに反映されています。
```shema.rb
create_table "test1s", force: :cascade do |t|
    t.string "test1_code", default: ""
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
end
```

マイグレーションファイルをロールバックします。すると、エラーが発生しました。デフォルト値を削除してくれると思ったのだが、削除してくれませんでした。
```
$rails db:rollback
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

change_column_default is only reversible if given a :from and :to option.
```

マイグレーションファイルにデフォルト値を設定する記述をする場合は、**changeメソッド**を利用するのではなく、次のように記述する必要があります。デフォルト値の設定を削除する場合は、**nil**をセットすればいいことになります。
```xxx.rb
def up
    change_column_default :test1s, :test1_code, ""
end
  
def down
    change_column_default :test1s, :test1_code, nil
end
```

マイグレーションファイルの重複行をなくしたいと思ったら、このように書けばスッキリします。
```xxx.rb
def up
    hoge("");
end
  
def down
    hoge(nil);
end

def hoge(flg)
    change_column_default :test1s, :test1_code, flg
end
```

再び、マイグレーションファイルをロールバックすると、処理は成功しました。
```
$rails db:rollback
```

schema.rbを見ると、デフォルト値が確かに削除されていました。
```scheme.rb
create_table "test1s", force: :cascade do |t|
    t.string "test1_code"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
end
```
Vue3(typescript) vue.draggable.nextを使ってみる

vueで作った一覧をハンドル付きでドラックドロップできようにして、アニメーション付きでね。

Sample
<http://www.mztm.jp/kawamura/qiita/vue-vuetify-draggable-test/index.html>
Github
<https://github.com/kawamurashin/vue-vuetify-draggable-test>

vue3はvuedraggable@nextを使う  
```
yarn add vuedraggable@next
```

```vue:App.vue
<template>
  <div>
    <draggable
        v-model="myArray"
        group="people"
        @start="drag=true"
        @end="drag=false"
        item-key="id"
        v-bind="dragOptions"
        handle=".handle">
      <template #item="{element}">
        <div class="list-group-item">
          <span class="handle">
            <v-icon
                large
                color="black"
            style="margin: 10px">
              mdi-drag-horizontal-variant
            </v-icon>
          </span>
          <span class="text">{{ element.name }} </span>
        </div>
      </template>
    </draggable>
  </div>
</template>
<script lang="ts">
import {defineComponent} from 'vue'
import draggable from 'vuedraggable'
export default defineComponent({
  name: 'App',
  components: {
    draggable
  },
  data() {
    return {
      myArray: [
        {name: "John", id: 0},
        {name: "Joao", id: 1},
        {name: "Jean", id: 2},
        {name: "004", id: 3},
        {name: "4", id: 4},
        {name: "Jean5", id: 5}
      ],
      drag: false
    }
  },
  computed: {
    dragOptions() {
      return {
        animation: 200,
        group: "description",
        disabled: false,
        ghostClass: "ghost"
      };
    }
  },
})
</script>
<style>
.ghost {
  opacity: 0.75;
  background: #c8ebfb;
}
.list-group-item {
  padding: 5px;
  border-bottom: solid #000000 1px;
}
.handle {
  cursor: move;
}
</style>
```

### 追記
キレイに動いて嬉しくて、とりあえず投稿。  
myArrayの中が変わっているのかどうかは、まだ知らない。  
イベントのタイミングとかきになるよね。とりあえず。 
あと、codepenにあげようと頑張ったけど無理でござんした。
[javascript] アロー関数の書き方

書き方
```
const OpenApp = () => {処理};
```

今まで`function(){処理};`の書き方ばかり見ていて、なにこれ?となりそうなので、メモに残すことにした。
ES6から導入された新しい書き方。ES6は2015年にリリースされたJavasriptの仕様のこと。
ITの仕事を楽しむには

　ただお金を稼ぐために仕事をするよりも、楽しみながら働くことはとても大切な事です。仕事を楽しむことができないと、人生の貴重な時間を浪費しているような気分になります。そこで今回は、IT業界で仕事を楽しむ為にはどう努力すれば良いかについて書きたいと思います。

## ①本や雑誌を買って読む
 大体の情報はWeb検索して調べることが出来ますが、ある専門的な事柄を網羅的に知ることができるのはwebよりも「書籍」です。読んだだけで分かったつもりにならず、実際に手を動かして試してみることも大切です。

## ②分からないことは、なるべく自分で調査する
分からない事柄は放っておかないようにしましょう。詳しい人に聞けばすぐに分かることも多いですが、手間暇を惜しんではいけません。まずは自分で分からない事を洗い出し、調べる事が大切です。調べた後に詳しい人から説明を聞くのと、調べてないのに聞くのとでは、意識や記憶に残る度合いが違います。

## ③社内外に向けて情報発信するべし
日々の仕事や調べ物の中で得た気付きや発見は、社内外の仲間と共有することを心掛けましょう。しかし、仕事上で知った機密事項を安易に勝手に誰でも見ることのできる状態で公開してはいけないことです。社内規約や就業規則を守った中、適切な発表手続きを踏んだうえで社外へ情報発信するようにしましょう。

## ④勉強会やセミナーに出席する
首都圏では数多くの展示会やセミナー、無料のセミナーから有料のセミナーまで数多くのイベントが開催されているので、興味があれば積極的に参加してみるとよいでしょう。

## ⑤お気に入りのWebサイトを見つけて読む
さまざまな事柄を調べていると、日本語・英語ともども、さまざまなブログやニュースサイトにめぐり会うことができます。有益なブログやサイトを見つけたときは、すかさずブックマークしておき、定期的に巡回するとよいでしょう。

## ⑥人的ネットワークを広げる
「誰々に聞けば、分かりそう」「誰々が詳しい」といった、人的ネットワークを築き、広げていくようにしましょう。逆に、「○○の分野なら、自分に任せておけ！」といった分野を持つことによってより頼りにされる機会が増えます。

## ⑦時間を管理する
時間を管理するような癖を付けましょう。だらだらと仕事することなく、ON（仕事）でもOFF（遊び）でも有意義な時間を過ごすことができるでしょう。
latex チートシート(自分用)

cloud latexで作業中に自分で見る用のチートシートを作りました．
# 画像貼り付け
### 1枚の画像を貼り付ける
~~~latex
\begin{figure}
\centering
\includegraphics[width=12cm]{}
\caption{画像の説明}
\label{fig:}
\end{figure}
~~~
### 2枚の画像を横並びに貼り付ける
~~~latex
\begin{figure}[htbp]
  \begin{minipage}[b]{0.45\linewidth}
    \centering
    \includegraphics[width=6cm]{}
    \caption{}
    \label{fig:}
  \end{minipage}
  \begin{minipage}[b]{0.45\linewidth}
    \centering
    \includegraphics[width=6cm]{}
    \caption{}
    \label{fig:}
  \end{minipage}
\end{figure}
~~~
### 複数の画像(例:7枚)を貼り付ける
まずは，これをdocmentclassの下におまじない．
~~~latex
\newlength{\subfigwidth}
\newlength{\subfigcolsep}
\setlength{\subfigcolsep}{2\tabcolsep}
\setkeys{Gin}{width=\subfigwidth}
\usepackage{subfigure}
~~~
~~~latex
\begin{figure}[tbh]
  \setlength{\subfigwidth}{.34\linewidth}
  \addtolength{\subfigwidth}{-.5\subfigcolsep}
  \begin{minipage}[b]{\subfigwidth}
    \subfigure[]{\includegraphics[width=4cm]{}}
  \end{minipage}
  \begin{minipage}[b]{\subfigwidth}
    \subfigure[]{\includegraphics[width=4cm]{}}
  \end{minipage}
  \begin{minipage}[b]{\subfigwidth}
    \subfigure[]{\includegraphics[width=4cm]{}}
  \end{minipage}
  \begin{minipage}[b]{\subfigwidth}
    \subfigure[]{\includegraphics[width=4cm]{}}
  \end{minipage}
  \begin{minipage}[b]{\subfigwidth}
    \subfigure[]{\includegraphics[width=4cm]{}}
  \end{minipage}
  \begin{minipage}[b]{\subfigwidth}
    \subfigure[]{\includegraphics[width=4cm]{}}
  \end{minipage}
  \begin{minipage}[b]{\subfigwidth}
    \subfigure[]{\includegraphics[width=4cm]{}}
  \end{minipage}
  \caption{}
  \label{fig:}
\end{figure}
~~~
# ソースコードを貼り付ける場合
documentclassの下におまじないをして，
~~~latex
\usepackage{listings,jvlisting}
\lstset{
  basicstyle={\ttfamily},
  identifierstyle={\small},
  commentstyle={\smallitshape},
  keywordstyle={\small\bfseries},
  ndkeywordstyle={\small},
  stringstyle={\small\ttfamily},
  frame={tb},
  breaklines=true,
  columns=[l]{fullflexible},
  numbers=left,
  xrightmargin=0zw,
  xleftmargin=3zw,
  numberstyle={\scriptsize},
  stepnumber=1,
  numbersep=1zw,
  lineskip=-0.5ex
}
~~~
~~~latex
\begin{lstlisting}[caption=,label=]
#include<stdio.h>
int main(){
   printf("Hello world!");
}
\end{lstlisting}
~~~

# 参考文献リスト

~~~latex
\begin{thebibliography}{99}
\bibitem{}
\bibitem{}\url{}
\bibitem{}
\end{thebibliography}
~~~
参照する際は`\cite{}`コマンド
一部こちらの記事を参考にさせていただきました．
https://qiita.com/ta_b0_/items/2619d5927492edbb5b03
GitHub Actionsで起動するElasticsearchにプラグインをインストールする

私は普段、仕事でElasticsearchを使っていますが、テストコードを書いてGitHub Actionsで都度テストするようにしています。GitHub ActionsでElasticsearchを起動するには、以下の公式アクションを使うのが良いでしょう。

https://github.com/elastic/elastic-github-actions/tree/562b8b6ae4677da97273ff6bc4d630ce96ecbaa5/elasticsearch

さて、私が開発に携わっているシステムでは、日本語で全文検索するためにkuromojiプラグインをインストールしています。しかし、公式アクションのREADMEを見てもプラグインに関する記述がありません… :thinking: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28249/b4a8ff3a-45d4-e56e-4366-781e8c98e470.png)
しかしご安心を。READMEには記載されていませんが、 `plugins` という名前の入力を指定することで、Elasticsearch起動時にプラグインをインストールできます :sparkles: 

https://github.com/elastic/elastic-github-actions/blob/562b8b6ae4677da97273ff6bc4d630ce96ecbaa5/elasticsearch/action.yml#L29-L31

kuromojiをインストールしたい場合、以下のように記述しましょう。

```yaml
- name: Runs Elasticsearch
  uses: elastic/elastic-github-actions/elasticsearch@master
  with:
    stack-version: 7.6.0
    plugins: analysis-kuromoji
```

ちなみに、試してはいませんが、複数のプラグインをインストールしたい場合、プラグイン名を半角スペースもしくは改行で区切るとできそうです。
Firebase Authenticationのメールアドレス認証で自動サインアップを禁止する

## 概要

[firebase/firebaseui-web-react: React Wrapper for firebaseUI Web](https://github.com/firebase/firebaseui-web-react) パッケージを
利用すると Firebase Authentication による認証機能を web サイトに簡単に組み込むことができます。
デフォルトでは web の UI からサインアップが可能ですが、サインアップを禁止するオプションもあります。

この記事では、以下のサインアップを禁止する方法を説明します。

- StyledFirebaseAuth のパラメータ
- Identity Platform の設定

この二つの方法は、細かい点で違いがあります。

|                                   | StyledFirebaseAuth のパラメータ              | Identity Platform の設定                       |
| --------------------------------- | -------------------------------------------- | ---------------------------------------------- |
| REST API                          | 禁止できない                                 | 禁止できる                                     |
| メール/パスワードのプロバイダ以外 | 禁止できない                                 | 禁止できる                                     |
| サインアップできないタイミング    | 登録されていないメールアドレスを入力したとき | メールアドレス、氏名、パスワードを入力したとき |
| Firebase のプラン                 | 無料プランでも可能                           | 有料プランのみ可能                             |

## リポジトリ

[kubotama/sample-firebase](https://github.com/kubotama/sample-firebase)

## 前提条件

Next.js で上記の検証用のサイトを構築しています。

- node.js: 16.15.1
- Next.js: 12.2.0

詳しくは上記リポジトリで確認して下さい。

## 事前の準備

1. [Firebase](https://console.firebase.google.com/) でプロジェクトを作成します。
1. 作成したプロジェクトで Authentication を開始します。
1. 開始した Authentication でメール/パスワードプロバイダを有効にします。
1. Authentication にユーザーを追加します。
1. 上記リポジトリをローカル環境にクローンします。
1. 作成したプロジェクトにウェブアプリを追加して、「SDK の設定と構成」で「構成」を選択すると表示される「アプリのキーと ID が含まれている Firebase 構成オブジェクト:」をコピーして、ローカル環境にクローンしたリポジトリの./lib/firebase.js に貼り付けます。
1. firebaseConfig の変数宣言の先頭に export を追加します。

## プログラムの説明

ログインしていなければログイン画面(login.tsx)、ログインしていればメイン画面(index.tsx)が表示されます。

1. 上記リポジトリのディレクトリで`yarn dev`を実行すると、ローカル環境で検証用の web サイトが立ち上がりますので、<http://localhost:3000> にアクセスすると、ログインしていませんのでログイン画面が表示されます。

1. 事前の準備で Authentication に追加したユーザーのメールアドレスとパスワードを入力してログインすると、メイン画面(index.tsx)にログインしたユーザーのメールアドレスが表示されます。

## StyledFirebaseAuth のパラメータ

サインアップを禁止するためには、StyledFirebaseAuth にパラメータとして引き渡す uiConfig で signInOptions の disableSignUp の status 属性に true を設定します。

```tsx:pages/login.tsx
  const uiConfig: firebaseui.auth.Config = {
    signInFlow: "redirect",
    signInOptions: [
      {
        provider: EmailAuthProvider.PROVIDER_ID,
        disableSignUp: { status: true },
      },
    ],
    signInSuccessUrl: "/",
  };
```

詳しくは、[FirebaseUI for Web — Auth](https://github.com/firebase/firebaseui-web#configure-email-provider)の Configure Email Provider のあたりを参照して下さい。

登録されていないユーザーのメールアドレスを入力すると、**Not Authorized** **入力したメールアドレス** is not authorized to view the requested page. と表示されます。

## Identity Platform の設定

以下の手順で UI からのサインアップが禁止できます。

1. Identity Platform を有効にします。この時点で有料プランへの切り替えが必要です。

1. Identigy Platform の設定画面を開きます。

1. ユーザータブにあるユーザーアクションの「作成を可能にする（登録する）」チェックボックスのチェックを外すと、ユーザーの登録ができなくなります。具体的には、メールアドレス、氏名、パスワードを入力した後に、

> Firebase: This operation is restricted to administrators only. (auth/admin-restricted-operation)

というメッセージが表示されてユーザーを登録できません。
なぜか知らないけど、モーダルが原因なのかEdgeのIEモードが立ち上がるはずがIE11が立ち上がってしまう問題について

# 前提

グループポリシーでIE11は既に使えなくして、強制的にEdgeが立ち上がるようになっている。

# 現象

何故かモーダルの画面から次の画面へ行くと強制的にIE11が起動して、ログイン画面が表示してしまう。

# その他

全員が全員、上記現象が発生するわけではなく、特定の人だけ発生してしまう。

# 原因

showmodaldialog から Window.open を開いた時、レジストリの１つの項目の設定の違いで挙動が異なることがわかった。

# 解決方法

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system\EnableLUAの値を1にする[^1]
※参考文献と内容は一緒ですが、なかなかググってもたどり着けなかったのでキーワードを増やして投稿いたしました。

[^1]: [showmodaldialog から Window.open を開いた時の挙動が異なる](https://techcommunity.microsoft.com/t5/enterprise/showmodaldialog-%E3%81%8B%E3%82%89-window-open-%E3%82%92%E9%96%8B%E3%81%84%E3%81%9F%E6%99%82%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B/m-p/3051132)
Exercise1 デザインを元にモバイルで画面を作ってみよう

# 目次
1. はじめに
1. お題1
1. お題2

# はじめに
Visualizerの基礎的な知識を身につけたので、
早速実際にアプリを作ってみましょう！

2問用意していますので、
これまでの振り返りもしながら解いてみてくださいね:relaxed:！

# お題1
早速、今回のお題です！

アプリを開発することになり、デザインチームから画面デザインが届きました。
Visualizerを使って、デザイン通りに画面を作成してください！

<u> 制限時間：90分 </u>

## デザイン

![Coupon Details.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/87a1ec77-6424-d2b2-1733-b271b5e573cb.png)
<font color=gray>（"Freepik.com"このカバーはFreepik.comのリソースを使用してデザインされています。）</font>

## 素材
**画像**
画像とアイコンはこちらからダウンロードして使用してください。
| 画像 | ロゴ |時計|戻る|
|:-----------|:------------|----------|--------|
|![japanese-seafood-ramen-with-cuttlefish-sauce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/993c1829-873f-46da-27cf-7822ec747509.png)|![ramen_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/1a185299-2cc5-28d1-6050-44b1eddbcacf.png)|![Clock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/96f49686-ab45-300f-e9de-c5ec5cd095ca.png)|![chevron_left-24px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/3c237bfb-92f6-9e6b-47f0-43d5bd39c1bb.png)|


**フォント**
- デザインに使用されている`NotoSans`フォントはデフォルトに入っていないフォントです。
外部フォントのインポート方法は、こちらを参考にして作成してください。
▶︎[Kony Visualizerに外部フォントを取り込む](https://qiita.com/Kony_Team/items/0b62fee0a257e0209e88)

- それぞれのフォントサイズ・カラーを記載しています。
※以下はpxで表記していますが、モバイルの場合Visualizerでpx指定をすると、
想定より小さめに表示されるため、文字サイズは参考程度にご覧ください。<br>
Visualizerでの実装時、**フォントサイズは%指定**とし、
デザインファイルと同様のフォントサイズになるよう調整をしてください。<br>
![スクリーンショット 0004-07-15 13.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/4a4e1d2f-3009-d707-815a-1bede21b71b9.png)<br>

|No |フォント・サイズ |文字色  |背景色|
|---|---|---|--|
|1,2,5|NotoSansJP Bold 14px|050C1E|-|
|7|NotoSansJP Bold 14px|FFFFFF|2B90FF|
|3|NotoSansJP Bold 24px|050C1E|-|
|4|NotoSansJP Medium 12px|858A9B|-|
|6|NotoSansJP Regular 14px|050C1E|-|


# お題2
「クーポンを使用」ボタンをタップ時に、
押したことがわかるよう、透明度80%に設定し薄い青色に変化させましょう。

制限時間：30分

## 完成イメージ
![ezgif-4-4faf856b40.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/88ae08a1-685b-051e-44a8-2835192b77aa.gif)


# 答え
お題1とお題2は完成しましたか？
答え合わせして確認してみましょう！

▶︎[Exercise1_答えと解説](https://qiita.com/Kony_Team/items/1ed7dc7e642b209e0927)

# 次の記事

▶︎[Exercise2 モバイルでクーポン一覧画面を作ってみよう]()


記事一覧：
https://qiita.com/Kony_Team/private/4c922fa016ce95c58406

# 最後に一言
より読みやすい記事にしていきたいので、
「ここがわからなかった！」
「ここがもっと知りたい」
など、コメントいただけると嬉しいです！
k3s(with Longhorn)でNode-REDを動かす

これまでAWSに構築したk3sにLonghornを導入するところまで[個人練習してみました。](https://qiita.com/yasuyuki_terashi/items/3fa317783a80e39b22a8)今回は、そこにNode-REDを導入してみます。

# ソフトウェア構成
※AWS上の4インスタンスに構築したk3sクラスタ構成
Debian GNU/Linux 11
k3s version v1.23.8+k3s1 (53f2d4e7)
go version go1.17.5
Longhorn v1.3.0
Node-RED 2.2.2(latest)

# マニフェストファイルを用意する
以下のようなyamlファイルを用意しました。`kubectl apply`することで、Node-REDを動かすことができます。
```yaml:node-red.yaml
apiVersion: v1
kind: Service
metadata:
  name: nodered
  namespace: default
spec:
  selector:
    app: nodered
  ports:
  - port: 1880
    protocol: TCP
    targetPort: 1880
    nodePort: 31880
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodered
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodered
  template:
    metadata:
      labels:
        app: nodered
    spec:
      # Add
      securityContext:
        fsGroup: 1000
      containers:
      - name: nodered
        image: nodered/node-red
        ports:
        - containerPort: 1880
        # mount
        volumeMounts:
        - mountPath: /data
          name: data
      #PVC
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
  namespace: default
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: longhorn
```
**（要点）**
・Service、Deployment、PersistentVolumeClaimの三部分に分かれます
・DeploymentのところにvolumeMounts:　volumes:の部分を記載することで、PVCが利用できるようにします。`/data`以下を永続化します。
・先日の記事で、[Longhornを構築してます。](https://qiita.com/yasuyuki_terashi/items/3fa317783a80e39b22a8)ですので、PersistentVolumeClaimの部分で、storageClassNameにlonghornを指定してます。
・工夫しないとユーザー権限の問題でエラーが出てしまいいます。[公式](https://nodered.jp/docs/getting-started/docker#%E6%B0%B8%E7%B6%9A%E5%8C%96%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%E3%81%99%E3%82%8B)にも書かれている通りコンテナ内のnode-redユーザ(デフォルトではuid=1000)が永続化ボリューム内のファイルにアクセスできるよう、権限を設定してあげる必要がある模様です。そこで[この記事](https://konchangakita.hatenablog.com/entry/2020/06/01/220000)を参考にDeploymentのところで、
```
securityContext:
  fsGroup: 1000
```
を追加しました。
# 参考文献
[Play with KubernetesでNode-REDを動かしてみた。](https://qiita.com/kitazaki/items/4d93a18d1363fe00fe16)
[【Nutanix Karbon】Kubernetes 上に Node-Red を作ってみる](https://konchangakita.hatenablog.com/entry/2020/06/01/220000)
Azure Cognitive Search の OCR スキルが Read API v3.2 に対応！

# はじめに
組織内に貯まっている大量な構造化・非構造化データから、新たな価値を見出すためのフルマネージド全文検索サービスである [Azure Cognitive Search](https://www.youtube.com/watch?v=9GcjFofXdd0) を使えば、誰でも簡単に AI 搭載検索エンジンを開発することができます。今回はこれまでも多くの検証をしてきた [OCR スキル](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-skill-ocr)のアップデートについて紹介します。

# OCR スキル
今回のアップデートによって OCR スキルが [Read API v3.2](https://westus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-2/operations/5d986960601faab4bf452005) をバックグラウンドで使用することになり、画像ファイルに含まれる日本語印刷テキストや**手書きテキスト**を**簡単**かつ**高精度**で認識することができます。

# 利用方法
試すのは簡単、Azure Portal の画面 UI や REST API を用いてインデックスを作るだけ。初めての方は [Azure-Cognitive-Search-Workshop](https://github.com/nohanaga/Azure-Cognitive-Search-Workshop) の[ノーコード全文検索インデックスの作成](https://github.com/nohanaga/Azure-Cognitive-Search-Workshop/blob/main/CreateIndex.md)に従って簡単に構築できます。すでにインデックスを作成済みの方は、一度インデクサーをリセットし、再実行することで最新の OCR スキルの結果が適用されます。

# 実行結果
いつも使わせていただいている青空文庫の「[吾輩は猫である](https://www.aozora.gr.jp/cards/000148/files/789_14547.html)」のスキャン画像を OCR スキルで読み取ってみましょう。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/72b09cac-6752-321a-89d2-6cf49b8029b1.png)

おおー！ `merged_content` フィールドにしっかりと([細切れではない](https://qiita.com/nohanaga/items/988cdb7b15b2050b364b))文章が格納されていますね！精度についても最新の Read API v3.2 のモデルが使われているため、「ニャー」のところの「ャ」と、「一疋」の「疋」が[正しく認識](https://qiita.com/nohanaga/items/05281ed97f5fe01f0151#%E8%AA%8D%E8%AD%98%E7%B5%90%E6%9E%9C%E3%81%AE%E8%A9%95%E4%BE%A1%E6%96%87%E5%AD%97%E5%8D%98%E4%BD%8D)されていることが分かります。

# 気になる点
ただ、よく見ると Read API v3.2 の結果をそのまま格納しているため、OCR が読み取った半角スペースが所々含まれてしまっていることが分かります。Azure Cognitive Search の日本語アナライザーは、半角スペースによって強制的にトークンを分割するため、画像のように「獰 悪」と読み取られてしまった場合、検索クエリーに「獰悪」と入れても検索結果が出てきません。これが気になるという方はこれまで通り [Azure Cognitive Search で Python のカスタムスキルを Azure Functions で簡単に実装する (Read API v3.2)](https://qiita.com/nohanaga/items/cc33419244d0e5b86ecc)を参考にしてください。こちらは半角スペース除去処理を入れていますので。（この仕様が気になる方、Microsoft サポートまで Feedback いただけると助かります）

# まとめ
ちょっと気になる点はありますが、日本語手書きにも対応した OCR スキルをこんなに簡単に使えるようになったのはとてもうれしいことです。特に最新の OCR モデル(2022-04-30) によって日本語印刷テキストの精度も向上しているのでぜひお試しいただければと思います。

# 参考
[Azure Cognitive Search の全文検索を重点的に学習するワークショップを公開](https://qiita.com/nohanaga/items/2a90539f7667fa9e486a)
[Azure Cognitive Search で Python のカスタムスキルを Azure Functions で簡単に実装する (Read API v3.2)](https://qiita.com/nohanaga/items/cc33419244d0e5b86ecc)
[ダウンロードするだけで即使える検索 UI: Simple-Cognitive-Search-Tester](https://github.com/nohanaga/Simple-Cognitive-Search-Tester)
Power BIダッシュボードにPower Automateボタン埋め込む


## Power BIにPower Automateビジュアルが埋め込み可能に
Power Automateビジュアルを使うことで、Power BIと連携したクラウドフローが実現できます。ダッシュボード上のフィルター済みデータと連動できるので、オンデマンドの分析に加えてその結果に基づいた実行までをワンプラットフォームで行えるようになりました。

https://docs.microsoft.com/ja-jp/power-bi/create-reports/power-bi-automate-visual?tabs=powerbi-desktop

## 実装方法

Power Automateビジュアルを設置して編集ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/6e798a66-342a-ee2a-24b5-fc9e5243d85d.png)

ここからはいつものPower Automateの作成画面と同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/12e00c29-cad0-491e-1579-2bf7425e4473.png)



クラウドフローに渡したいデータは視覚化メニューのPower Automateデータから設定できます。BI上で実行されたオンデマンドのフィルターと連動するため、フィルター後の結果に含まれる行だけがPower Automateに渡されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/3f9d7942-82ff-b88d-75d1-cf2de0d5bd1a.png)





## 想定される活用例
Power BIでの分析は多くの部門で利用されています。例えば営業部門においては、営業マネージャが注視すべき案件をダッシュボードで絞り出し、営業担当者との面談でアドバイスを行います。

でも、管理している営業担当者数や案件数が多いと、人力でのフォローは現実的ではありません。そんなときはPower BIで絞り込んだ案件について、SFA上でタスクを生成するまでをPower Automateで自動化することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/f615df17-d703-dc31-2e74-cfe4f09025e0.png)

このように「視覚化➡インサイト取得」だけでなく、「視覚化➡インサイト取得➡実行」までエンドツーエンドで徹底できるのがPower Platformならではの強みです。
## 注意事項

本機能はプレビュー段階で、下記の制限事項があります。
特にPower Automateのフローが既定の環境でしか作成できない点は注意が必要で、独自の環境と接続したい場合はテナントで共有のM365アプリ(Sharepointなど)を経由するか、一般提供リリースまで待つ必要がありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/73491659-8485-a548-3ebd-7652384a56fa.png)
iOS Safari で reality ファイルを扱うときの tips

2022年3月ついに iOS 15 で WebXR Device API サポートが来たかと喜んだのもの束の間、 `immersive-ar` モードが動作しないことが発覚して結局 iPhone で WebAR はまだまだ難しいということを再認識させられたのであった。

https://zenn.dev/ikkou/articles/6f546b11ced571

一方で Apple は、USDZ という 3D モデルの独自フォーマットや、USDZ に動きやインタラクティブな振る舞いを加えることができる Reality という独自フォーマットを持っており、これらは iOS の AR Quick Look という機能を使って AR 表示することができる。AR Quick Look は iOS Safari からも利用することができるので、現状では iPhone で 6DoF な WebAR を実現するための最もカジュアルな方法ではないかと思う。

https://developer.apple.com/jp/augmented-reality/quick-look/

Reality ファイルそのものは Xcode に付属の Reality Composer を使うことで簡単に作成することができるが、作成した Reality ファイルを iOS Safari から呼び出す際に少しクセがあったので、それについてまとめる。

## Web アプリから AR Quick Look を起動する
Web アプリから AR Quick Look を起動するには、単に Reality ファイルへのリンクを貼るだけで良い。
このとき、anchor タグには `rel="ar"` 属性を指定する必要がある。

``` html
<a rel="ar" href="app.relaity">START AR</a>
```

## 「オブジェクトを開けませんでした」エラーが出る場合
AR Quick Look がファイルを開けなかった場合に「オブジェクトを開けませんでした」というエラーメッセージが出る。
ファイルがそもそも存在しない (404) 場合でもこのエラーが出るが、ファイルが確かにホストされているにも関わらずこのエラーが出る場合は、HTTP レスポンスヘッダの Content-Type が適切ではない可能性がある。

例えば Reality ファイルを AR Quick Look で開く場合、そのファイルを取得する際の Content-Type は `model/vnd.reality` である必要がある。

## すぐに AR Quick Look が起動しない場合
リンクをクリックしてもすぐに AR Quick Look が起動せず、画面を1回タップすると開始する、というケースがある。

どうやら iOS Safari は「anchor タグのコンテンツに画像が含まれている場合は AR Quick Look を直接起動させる」という振る舞いをするらしい、ということに試しているうちに気づいた。

画像が含まれていればなんでもいいようなので、たとえば 1px x 1px の透過 GIF 画像を仕込んでも問題ない。

``` html
<a rel="ar" href="app.reality">
  START AR
  <img src="data:image/gif;base64,R0lGODlhAQABAGAAACH5BAEKAP8ALAAAAAABAAEAAAgEAP8FBAA7" />
</a>
```
初めての案件

こんにちは。
私はA型事業所でプログラミングをしています。
よろしくお願いいたします。

来週から、実際の案件に取り掛かる予定です。
今週から出勤が週三日になり、ちょっと負荷が高くなりました。
今週から、月曜日、金曜日に加えて木曜日も出勤になりました。

## 実際の案件について
実際の案件ではHTML/CSS/Javascriptという感じのスタートになりそうです。
**コーディングの案件からのスタート**です。
A型事業所のほうに既に案件がはいってきており、そちらをこなす感じになりそうです。
初めての案件で、緊張もありますが、うまく進めていきたいなと思います。

案件をこなすにあたり、自分で実際にサイトを作ってから挑もうかなとも考えていました。
その時間はなさそうなので、実際に案件をこなしながら、わからないことは時間をかけて調べてやってみようかなと思います。
最初の案件は少し時間を多めに取り、調べたり、必要に応じて戻って学習しながらやっていこうと思っています。
案件をくださっている方とも連携しながら進めていくことになりますので、コミュニケーション能力も試されそうな気がします。ちょっとここら辺はドキドキしますね。

## ほかの体験の方と
今日は事業所にきているほかのコーダーの方もいらっしゃる日でした。
プログラミング班はまだ体験の段階ですが、関係は良好で、良い感じに進めていけそうです。
体験から実際の利用に至るまでは同じペースくらいで進みそうな感じです。
焦らずやっていけたらなと思います。

## まとめ
今朝は朝ごはんを食べる余裕がなく、お昼もお弁当がないのでコンビニ弁当でちょっと調子がいつもと違いますが、うまくやってみようと思います。
以前まで進めていたfreecodecampの課題を一部わからないところは**ズルして進めて先に進めることに**しました。
まずは得意な部分とか、これ面白いな！と思うものを増やしていけたらと思っています。

それでは、また。
【JavaScript】ブラウザの言語に合わせたページ遷移の実装

ブラウザの言語に合わせて表示するhtmlを切り替えるページを実装したため、備忘録として残します。

## ポイント

- 「navigator.language」でブラウザの言語情報を取得
- 「switch」で言語ごとに処理を分岐させ、「location.href」で目的のページに移動

## 実装例

訪問用ページである①index.htmlと、日本語、英語用のページ②ja.html、③en.htmlをそれぞれ用意します。

- index.html（①訪問用ページ）
- /ja/ja.html（②日本語用遷移ページ）
- /en/en.html（③英語用遷移ページ）

①index.htmlをブラウザで読み込むと、読み込み時のブラウザの言語設定に合わせて②③にページを移動させる、という仕様で、以下のようなコードを実装しました。
ポイントは前述の通りなので割愛します。ブラウザの言語を切り替えて検証が可能です。
※'22/7時点では、chrome、safari、edge、firefoxでの動作確認済み。
メモ）言語表記に関しては、どのブラウザも統一されているのかも…？

[index.html]
```
<!DOCTYPE html>
<html lang="jp">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  訪問用ページです
</body>
<script>
  switch(navigator.language){
    case 'ja':
      location.href = "/ja/ja.html";
      break;
      case 'en':
        case 'en-US':
        location.href = "/en/en.html";
        break;
        default:
          break;
        }
</script>
</html>
```

[ja/ja.html]（en.htmlも同様に用意）
```
<!DOCTYPE html>
<html lang="jp">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  日本語ページです
</body>
</html>
```

## まとめ

コードとしてはかなりシンプルに実装できます。
今回の例では言語のパターンは2種類しか用意していませんが、多言語仕様でも条件分岐を増やすことで対応は可能なようですね。英語の場合、「en-○○」と国によって細分化されているので、正規化も取り入れて実装したいです。
Teamsのアカウント情報を削除する方法（MacOS版）

# はじめに
以前に、Microsoft Teamsでログインしてから
再度デスクトップアプリを立ち上げたり、
ミーティングのリンクを踏んでからTeamsでログインを求められた際に
有効期限切れのアカウント情報が残っているままだと、すんなりと会議に参加できないため
Teamsのアカウント情報のキャッシュを削除する方法をまとめた

# 公式サイト
Microsoftの下記サイトの「macOS からアカウントを削除する」部分に記載があります

https://support.microsoft.com/ja-jp/office/%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%82%A6%E3%83%88%E3%81%99%E3%82%8B%E3%81%8B-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E5%89%8A%E9%99%A4teams-a6d76e69-e1dd-4bc4-8e5f-04ba48384487

# 手順
1.Finderを開く

2.左メニューのアプリケーションをクリック

3.ユーティリティーをクリック

4.キーチェーンアクセスをクリック
　　　　キーチェーンアクセスのウインドウが立ち上がります

5.右上の検索ボックスで「microsoft」と入力
![スクリーンショット 2022-07-14 13.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/db96358b-8d85-504a-ef62-d5b8298c6941.png)

6.画面中部の一覧のそれぞれの項目を選択して、削除を行う


# 追記
これまでの手順で解決しない場合は下記ディレクトリを削除してください
~/Library/Caches/com.microsoft.teams
~/Library/Caches/com.microsoft.teams.shipit
~/Library/Application Support/Microsoft/Teams
Denoのwindow.close()の動作

Denoにはブラウザ互換の`window.close()`が実装されています。
この関数は、呼ばれると直ちに処理を終了するものと思っていたのですが、そういうわけではないようです。
本記事ではDenoにおける`window.close()`の挙動を確認します。

なお、

- `window.close()`
- `globalThis.close()`
- `close()`

は全て同等の記述ですが、本記事では`window.close()`に書き方を統一します。

## Denoにおける`window.close()`の動作

`window.close()`を呼んでも直ちに処理は終了せず、**タスクキューとマイクロタスクキューを消化してから処理を終了します。**

タスクキューとマイクロタスクキューはPromiseやsetTimeoutなどによって発行されるタスクを管理するものです。詳しくは[こちらの記事](https://zenn.dev/estra/books/js-async-promise-chain-event-loop/viewer/d-epasync-task-microtask-queues)が参考になります。

具体例を見てみましょう。
まず、`window.close()`を呼んでも、後続の処理は**普通に実行されます。**

```ts
console.log(0); // 実行される
window.close();
console.log(1); // 実行される
```

更に、`setTimeout(fn, 0)`や`queueMicrotask(fn)`や`Promise`を用いてコールバックに設定したタスク or マイクロタスクも、`window.close`後に**実行されます。**

```ts
console.log(0); // 実行される
window.close();
console.log(1); // 実行される

queueMicrotask(() => {
  console.log(3); // 実行される
});

setTimeout(() => {
  console.log(5); // 実行される
}, 0);

new Promise<void>((resolve) => {
  console.log(2); // 実行される
  resolve();
}).then(() => {
  console.log(4); // 実行される
});
```

一方、`setTimeout(fn, 1)`や`fetch(url)`の後続の処理などは実行されません。これは、タスクキューやマイクロタスクキューがいったん空になり、そこでプロセスが終了されるためです。

```ts
console.log(0); // 実行される
window.close();
setTimeout(() => {
  console.log(2); // 実行されない!
}, 1); // <- ここが1以上なのがポイント

console.log(1); // 実行される
```

```ts
console.log(0); // 実行される
window.close();
fetch("https://google.com").then(() => {
  console.log(1); // 実行されない!
});
```

ただし、後続の処理の内容によってはsetTimeoutで指定した秒数が経過してしまうので、setTimeoutの中身が実行される可能性があります。

```ts
console.log(0); // 実行される
window.close();
setTimeout(() => {
  console.log(2); // 実行される
}, 1);
console.log(1); // 実行される
for (let i = 0; i < 100000; i++); // ※この行を実行している間に1ミリ秒経過する
```

↑の挙動、タイミングによっては実行されたりされなかったりするという挙動が発生する可能性があり、バグの原因になりそうだなと思いました（感想）。

雑な理解としては、

- `setTimeout(fn, 0)`は実行される
- `await`以降は実行されない

みたいな感じでいいのではないかと思います。（厳密には間違っています！）

## 処理を終了するなら`Deno.exit()`

上で解説したように、`window.close()`はブラウザ互換になるように作られていて、単純に処理を止めたい時に使うのは難しそうです。

単純に処理を止めたい場合、`Deno.exit()`を使います。この関数が呼ばれると直ちにプロセスが終了します。後続の処理は実行されません。

https://doc.deno.land/deno/stable/~/Deno.exit

```ts
console.log(0); // 実行される
Deno.exit();
console.log(1); // 実行されない
```

引数には終了コードを渡すことができます。

## まとめ

- Denoの`window.close()`は後続の処理を実行してタスクキュー/マイクロタスクキューを空にしてから終了する。
- 単に処理を止めたいときは`Deno.exit()`を使う。

私は`Deno.exit()`と`window.close()`が同じものだと勘違いしていてデータを消し飛ばしました。みなさんも気を付けてください！

## 参考文献

- `window.close()`の仕様書 https://html.spec.whatwg.org/multipage/window-object.html#dom-window-close
MariaDB10.2.4 -> 10.6.8にバージョンアップしたらSSLのコネクションエラーになった

## 背景と問題
- MariaDB10.2がEOLになったので、10.6.8 (2022/7/13時点のAmazon RDSがサポートしている最新）にアップデートした
- EC2インスタンスからssl_caで接続していたのが繋がらなくなった
    - ```ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)```

### 原因と結果
- 接続に使っているEC2側のクライアントソフトのバージョンが古いのが原因だった
- Distributeの5.7系にアップデートして解決
- 根本の原因は不明MariaDBのOpensslのバージョンが上がったのが原因と予想。知らんけど
Z80のリアル&エミュレーション

ラッピングで作った[Z80ボード(SBC)](https://qiita.com/yamori813/items/917775ac94c1bd40d746)と[cpm8266](https://qiita.com/yamori813/items/3e58e99051c7e04700d8)で同じプログラムを実行してみました。

両方ともMac OS X(El Capitan)のcuコマンドやscreenでオペレーションしています。SBCの方はFT2232直結でcpm8266はBluetooth接続です。

![スクリーンショット 2022-07-14 18.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/716e5341-a3bf-f88e-d152-aa95ecc0179b.png)

cpm8266を使う時はターミナルの環境設定の詳細で、「Delete キーで Control-H を送信」にチェックを入れます。

Windows 7のRLoginでも同じように操作できます。

動かすコードはこれです。

https://github.com/yamori813/z80float

ファイルの拡張子がtxtなのはいつも使っているMacではなくてWin7の秀丸で打ち込んだためです。

アセンブラは[zmac](http://48k.ca/zmac.html)と[ld80](http://48k.ca/ld80.html)を使っています。

SBCは0x8000からの後半32KがRAMで、0x8000のアドレスでリンクします。モニターにEfexMonを使っていて、これのLコマンドでIntel Hexを読み込ませます。

cuのコマンドモードに入るにはリターンキーを押したあとにチルダ(~)を入力します。ちょっとタイミングが難しいかもしれません。

```
EfexMon By M.PEKER v1.0b
Press H for help

Ready.

Hex Loading...~+ cat TEST1_SBC.hex
loaded adress:$8000

C:\>

C:\>G-$8000 1.2345678D 02
```

CP/Mではコマンドは0x100から始まるので、このアドレスでリンクします。

![Z80_MEM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/44374a9e-efe2-e6da-1d59-4a1371b4467f.png)

cpm8266ではMac側で下記のxmodemコマンド(xs)を使いファイル転送します。

https://github.com/yamori813/xm

xmodemのオープンソースはいくつかありますが、cpm8266のコマンドと相性が悪く使えなかったので、自分で作りました。今回色々整理していて、久しぶりに手を入れて標準入力での処理を追加してcuのコマンドモードから使える様にしました。

```
cpm8266 - Z80 Emulator and CP/M 2.2 system version 0.4


62K CP/M v2.2 [cpm8266 v0.4 - SmallRoomLabs]

a>f:
f>a:xr test1.hex
CP/M XR - Xmodem receive v0.1 / SmallRoomLabs 2017
~+ ./xs TEST1.hex

File TEST1.HEX received successfully

f>
f>a:load test1

FIRST ADDRESS 0100
LAST  ADDRESS 11FE
BYTES READ    10FF
RECORDS WRITTEN 22


f>test1
 1.2345678D 02
```

SBCは4MHzのZ80でcpm8266の方が早いような気がします。

マイコンは1980年くらいからやっていて、当時CP/Mは高嶺の花で、あったらすごいことができそうな気がしたのですが、できることは同じでした。

80年代前半にはワンボードコンピュータのEX-80とPC-8001を持っていて、これをつないでなんかできないかなと考えていました。コンピューターとコンピュータをつなぐ事がライフワークになってる気がします。

Z80はこのSBCやESP以外にもPC-8001やPLUS80があります。

screenコマンドでxmodemをapplescriptで実行してみました。

```applescript
-- cd on hex file directory and lunch screen command and open cpm8266 before run this script

set xfile to the text returned of (display dialog "Send File?" default answer "")

tell application "Terminal"
	activate
	do script "a:xr " & xfile in front window
	tell application "System Events"
		tell process "Terminal"
			-- screen command
			key code 0 using {control down}
			delay 1
			keystroke ":"
		end tell
	end tell
	do script "exec !! /Users/hiroki/Develop/Z80/xm/xs " & xfile in front window
end tell
```
AWS Linux2 EC2 環境構築 MariaDB

https://qiita.com/TaichiEndoh/items/e7e546cbac21aaa4e20e

研究で作成しなければいけないシステムがあり　
前回作成したシステムを参考にAWS　EC2に　SQL　も使用していきたいと思いました

2022年7月14日現在
AMI　AWS Linux2　の場合
実施できる環境に注意が必要だったため共有します

# mySQLに相当するデータベースMariaDB
AWS Linux2 のため
mySQLに相当するデータベースとして、MariaDB
という派生データベースが採用されます

# EC2インスタンスを立ち上げる

## EC2にリモートログイン
```
ssh -i ~/(設定した)Key ec2-user@[パブリック IP]
```

## Apacheを入れる
```
$$ sudo yum -y update
$$ sudo yum -y install httpd
$$ sudo service httpd start
$$ sudo chkconfig httpd on
```

### html ファイルあるか確認
```
ls /var/www/html
```
### html ファイル　作成 
```
sudo vi /var/www/html/index.html
```

webサーバーとしての機能は完成

# php のインストールを実施

```
yum install php
```
## Word Press に必要なライブラリのインストール
```
①php-mysql
phpからmysql に接続するためのライブラリ

②php-mbstring
PHPで日本語などの多バイト文字を扱うためのライブラリ
インストールしないと文字化けすることがある

③php-gd
画像を扱うためのライブラリ
インストールしないと画像のアップロード機能に支障が出る
```
以下のコマンドで3つのライブラリをインストール

```
yum install php-mysql php-mbstring php-gd
```

以上で必要なライブラリをインストールできました

PHPを有効にするため　Apache　を再起動する

```
systemctl restart httpd
```

## MariaDBをインストール

AWS Linux2 の
mySQLに相当するデータベース　MariaDB　をインストール

```
yum install mariadb mariadb-server
```
### MariaDBについて
MariaDBは、MySQLの開発者の一部がスピンアウトして新たに作り始めた
mySQL 互換のデータベースです　もともとMySQLはオープンソースなので
基本的な機能やコマンドなどは　おおよそ同じです
ライセンスの違いなどから　最近のLinuxデイトリビューションでは
MySQLの代わりにMariaDBが使われることが多くなってきた背景があるそうです

以下を参照

https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-ubuntu-20-04-ja

https://qiita.com/PAmatsuti/items/ed89719a1f4f579bd01a

## MariaDBの起動と初期設定
```
systemctl start mariadb
```
### mysql コマンドを使ってデータベースを操作

以下のコマンドを入力し　mariaDBを操作できるプロンプトを表示
```
mysql -u ユーザー名 -p

#初期設定では　root ユーザーしかないためこれでログイン
mysql -u root -p
```
以下のような出力になります
パスワードは設定されてないためそのまま　Enter キーを押す
```
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 〇〇

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```
セキュリティのために　root パスワードを変更しておく
```
update mysql.user set password=password('新しいパスワード') where
user = 'root'; flush privileges;
```

Query OK, と出るはずです
練習で掲示板(php html css MariaDB)を作成してみましたが
今回の方法ではMariaDBでの
タイムゾーンが日本時間に反映されなかったため
投稿時間が海外時間になってしまうことが発生しました
そこで以下の方法で対処が必要だったため共有します

# タイムゾーンの変更を行う

以下の方法でタイムゾーンの変更を行う必要があります

https://qiita.com/TomoZC/items/c8736a4b68044cda9634
Salesforceで「活動の記録」の項目を編集しよう

Salesforceの画面に「活動の記録」など見たことある人は多いのではないでしょうか

![活動の記録１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d6795458-25c3-d24a-d6b5-294486053c9a.png)

デフォルトの「活動の記録」の項目の並び方は
・件名
・コメント
・名前
・関連先

です。
この項目の並び方や項目追加など、レイアウトを編集することは可能です。

レイアウトの編集方法はクイック検索で
・グローバルアクション
と検索し、活動の記録の右側にある「レイアウト」をクリックします

![グローバル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ad3fc82c-c8ba-7bdd-6db5-2d65d044f0b8.png)

そうするとレイアウト編集画面があるのでレイアウトを編集し「保存」をクリックすれば完成です
![レイアウト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/106cbc3c-60de-7995-5a2b-496aeb79cfb1.png)


なお、オブジェクトマネージャー「Todo」からは新規項目作成はできません。


もしも今回のように「活動の記録」で新規作成した項目を追加したい場合、
オブジェクトマネージャー「活動」から項目作成を行う必要がございます
![活動作成２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6d5e68a5-e1ab-f877-09e3-316168516756.png)
簡単にAWS Lambdaでrubyコードを実行できます


# 簡単にAWS Lambdaでrubyコードを実行できます
- ruby初心者
- AWS CLI使いたくない方　（AWS Consoleでやりたい）

---

# Aws Lambdaとは
- AWSサーバーレス（サーバーなしでコード実行できるもの）　→　プログラム集中できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/43cd8d52-f791-342e-8833-9c1eca7f3258.png)


---

# Aws Lambdaでできること
- バックエンドの処理
- マイクロサービス
- ...

---

# コードをAWS Lambdaにデプロイする方法
- AWS CLIでデプロイする（コマンドで実行する方法）
    - https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html
- AWS Consoleでデプロイする（UIでやること）

---

# AWS Consoleでデプロイする 
- AWS アカウント作成
- Lambda作成
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/38269bd2-a611-bc81-dd39-131ab4237aa2.png)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/416ea8e3-e7a1-eb67-47c4-dedd59785209.png)

---

# RubyコードをLambdaで直接に書く
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/2201038e-9328-ac2d-5ee3-58bb46a3c6b7.png)

---

# RubyコードをLambdaにアップロードする
```sh
mkdir lambda_folder
cd lambda_folder
touch lambda_function.rb
# lambda_function.rbにコード書く

# zip file作成
zip -r ver1.0.zip lambda_function.rb
```
- Lambdaにアップロード
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/274161d1-3e8e-36cf-b523-f97c30f1767e.png)

---

# RubyコードとRubyライブラリーをLambdaにアップロードする

```sh
mkdir lambda_folder
cd lambda_folder
touch Gemfile
# Gemfileに必要なライブラリーを追加する

# ライブラリーをフォルダー内にインストールする
bundle config set --local path 'vendor/bundle'
bundle install

touch lambda_function.rb
# lambda_function.rbにコード書く

# zip fileとライブラリーを作成
zip -r ver1.0.zip vendor lambda_function.rb
```
- Lambdaにアップロード
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/383c7e3b-5d1d-177d-3389-4145750a8793.png)

---

# LambdaでWebのURL確認 (Lambda Function URL)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/4da2b35b-a86d-b2e7-a4ef-07354019583d.png)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/c71c38bf-6425-e975-847d-e3ffc99b53dd.png)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/19c4f99e-f4d5-2598-e3bb-5e1c28bc7a08.png)

---

# 課題
- Rubyコードのみなら、この方法は早いですが、Rubyコードじゃなく、Api Gateway/DynamoDBなどに連携すると、AWS SAM CLIで使った方がいいです。（configファイルでいろいろAWSリソースを管理できます。）


---

# 以上
ありがとうございました。
7.6 (標準) 尤度比検定6，F検定

## 答案

![7.-19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/04e1d180-253a-4fdb-acbd-6f98b6a8d734.jpeg)
![7.-20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/d4f87681-4aea-5acc-ceff-acb105aea4d4.jpeg)
![7.-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/684848a7-c870-cef0-f7b7-1d471ddd62e4.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Webpacker::Manifest::MissingEntryError 解消法

rails sを実行したところ下記エラーが発生
Webpacker::Manifest::MissingEntryError in Blogs#index

その解決方法を記載していきます。

# 結論

結論から言うと、webpackerをコンパイルすれば直ります。
コンパイルするまでの過程を記載していきます。

①テキストエディタから、gemfileを探し、webpackerのバージョンを確認
②バージョンを5.0に更新
③コマンドを実行
④コンパイル
⑤rails s

順に詳しく説明していきます。

# webpackerのバージョンを確認

"rails s"を実行するためには、"webpacker"のバージョンを5.0にアップしなければならないようです。
バージョンアップする場合は"terminal"で実行するのではなく、"text editor"の中から"gemfile"を探し、バージョンを確認してください。


# バージョンを5.0に更新

webpackerのバージョンが5.0になっていない場合は、書き換えます。

```gemfile.
変更前: gem 'webpacker', '~> 4.0'
変更後: gem 'webpacker', '~> 5.0'
```



# 下記コマンドを実行してください

```terminal.
bundle install
rails webpacker:install
rails webpacker:compile
```

※rails webpacker:installを実行する際、下記メッセージが出ることがあります。

```terminal.
conflict  config/webpacker.yml
```

気にせず"ENTER"を押してください。


# webpackerをコンパイル

下記コマンドを実行して、webpackerをコンパイルしてください。

```terminal.
rails webpacker:compile
```

# rails sを実行

これで自分はエラー解消できました。

# 最後に

自分は上記エラーに遭遇した際、この手順で解決しました。
参考になれば幸いです。
ClusterRole を使って良い条件

# まくら

Argo-Workflows、dev-workspace、vcluster など、ユーザ(テナント)ごとに名前空間で分離し RBAC で権限を与える前提のツールが増えてきました。

そのようなツール、特に Argo-workflows で顕著なのですが「どの名前空間でも同じアクセス権限を ServiceAccount に与えたい」という状況が、しばしばあります。

そのような際に「ClusterRole を使えばいいじゃん」という案が出がちなのですが。個人的にはお勧めしていません。

# 使って悪い条件と理由

「強力過ぎる」

[公式文書](https://kubernetes.io/ja/docs/reference/access-authn-authz/rbac/#clusterrole%E3%81%AE%E4%BE%8B)では ClusterRole が行える機能として下記を挙げています。

> ClusterRolesはクラスター単位でスコープされているため、以下へのアクセスの許可もできます。
> * クラスター単位でスコープされているリソースに(nodeなど)
> * 非リソースエンドポイントに(/healthzなど)
> * すべてのNamespaceに渡ってNamespaceに属するリソースに(Podなど)。 例えば、ClusterRoleを使用して特定のユーザーにkubectl get pods --all-namespacesの実行を許可できます。

「それらのリソースに対するパーミッションを与えなきゃいいじゃん」という反論はもっともなのですが、人はミスをする生き物であり、将来引き継がれるエンジニアが十分な知識を有しているとは限りません。
大人しく Role を使いましょう。

# 使って良い条件

逆説的に、 ClusterRoles が提供する機能を使わねばならない場合は、使って良い条件になります。
大抵、そのようなアプリケーションは下記いづれかになるでしょう。

* controller
* operator
* metrics collector

任された仕事内容にも依るかもしれませんが、これらを自作しデプロイする場面は、さほど多くないはずです。
「日々の保守業務では、基本的には Role しか使わない」を選択したほうが安全です。
拡張 email


+ [ヘルプ記事:Considerations for Using Enhanced Email](https://help.salesforce.com/s/articleView?id=sf.emailadmin_enhanced_email_considerations.htm&type=5)
+ [ヘルプ記事:Considerations for Using Email to Salesforce](https://help.salesforce.com/s/articleView?id=sf.email_my_email_2_sfdc_considerations.htm&type=5)
+ [ヘルプ記事:Email Message fields not evaluated by Salesforce automations](https://help.salesforce.com/s/articleView?id=000320092&type=1)
+ [「拡張Eメール」およびEmailMessageオブジェクト](https://qiita.com/Keiji_otsubo/items/9971cb613ede3d689f02)

# 未解決

+ [Need to Convert Attachments under EmailMessages in Bulk](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007BHVCX)
[Python] conda仮想環境構築でよく使うコマンド一覧

# conda
AnacondaおよびMinicondaの環境構築に関して、
よく利用したコマンドをまとめた。適宜追記する。
なお、環境の移行の方法は以下の記事へ。

https://qiita.com/flcn-x/items/053cce8cf0d5cb0e34bc

# 対象
各対象として仮想環境、チャンネル、パッケージに対して、
よく使用するコマンドをまとめた。

## 仮想環境
仮想環境の構築及び確認のためのコマンドをまとめた。

|目的|コマンド|
|---|---|
|一覧|conda info -e|
|一覧|conda env list|
|パス|conda info –base|
|作成|conda create -n [仮想環境名]|
|作成※1|conda env create -n [仮想環境名] -f [ファイル名]|
|移行|conda activate [仮想環境名]|
|離脱|conda deactivate|
|削除|conda remove -n [仮想環境名] --all|

※1 ファイルから環境を構築する場合

詳細設定例は以下の通り。
|目的|コマンド|
|---|---|
|作成|conda create -n [仮想環境名] python=[pythonバージョン名]|

## チャンネル

チャンネル追加、削除のためのコマンドをまとめた。
なお、チャンネルとは、パッケージをダウンロードする際のリポジトリ名のこと。
基本的に初期のチャンネルは[default]であって、[http://conda.anaconda.org/] である。

|目的|コマンド|
|---|---|
|一覧|conda config --get|
|一覧|conda config --show channels|
|追加※1|conda config --add channels [チャンネル名]|
|追加※2|conda config --append channels [チャンネル名]|
|削除|conda config --remove channels [チャンネル名]|

※1 追加したチャンネルの優先順位を最高にする
※2 追加したチャンネルの優先順位を最低にする


## パッケージ

パッケージ確認、追加、削除のためのコマンドをまとめた。
|目的|コマンド|
|---|---|
|一覧|connda list|
|追加|conda install [パッケージ名]|
|削除|conda uninstall [パッケージ名]|

パッケージ追加の詳細設定例は以下の通り。
|目的|コマンド|
|---|---|
|バージョン指定|conda install [パッケージ名]==[バージョン]|
|チャンネル指定|conda install [パッケージ名] -c [チャンネル名]|
|チャンネル指定(※1)|conda install [パッケージ名] -c [チャンネル名] --override-channels|

※1：他のチャンネルを検索しない

# 動作
動作別でのよく使用するコマンド。
区分けが違うので前述と重複の場合あり。

## バージョン確認

|目的|コマンド|
|---|---|
|python|python -V|
|conda|conda -V|

## アップデート

|目的|コマンド|
|---|---|
|conda|conda update conda|
|仮想環境|conda update -n [仮想環境名]|
|パッケージ|conda update --all|
|特定パッケージ|conda update [パッケージ名]|
【UiPath】環境依存文字（外字）の有無をチェックする方法

# はじめに
この記事では、業務でぶつかった課題（環境依存文字の有無を確認する方法）について、備忘録としてまとめたものです。
より良い方法があるかもしれませんが、このページへたどり着いた方の解決の一助となれば幸いです。

# サンプルソース
[Github](https://github.com/odm-cckte0122/External_check)にプロジェクトのサンプルをアップしました。

# 今回の課題
人名などにたまに含まれる外字（鬼滅の刃に出てくる竈門禰豆子（ねずこ）の「ね」の字や、高橋（髙橋）さんの「髙（はしごだか）」など。異体字や旧漢字と呼ばれることもあるみたいです）は、取得・出力するフォーマットによっては文字化けすることがあります。
（変換の時に[環境依存]という表記が出てきます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/1e11f16b-6af7-e840-db6f-2f89727108cb.png)
↑ねずこの「ね」、Excelなどで入力しようとすると・や□という形になってしまい何と書かれているのか読み取れない

大量のデータを取り扱う場合、うっかり該当の文字が含まれる値を入力しようとして予期しないエラーや人の目によるチェック時に判別できない等様々な不具合が発生する恐れがあるため、外字が含まれているか否かをチェックし、処理を振り分けできればと考えました。
（本当は文字化けしない文字への変換も検討したのですが、あまりに数が膨大すぎるので諦めました…）

# どのように外字を判別するのか？
外字はUNICODEの場合 **文字コードがE000~F8FFの範囲(私用領域)のいずれか** となっているそうです。
>Unicodeでは、外字エリアとして私用領域という名称でU+E000〜U+F8FF、U+000F0000〜U+000FFFFD、U+00100000〜U+0010FFFDに外字領域を設けてある。([Wikipedia](https://ja.wikipedia.org/wiki/%E5%A4%96%E5%AD%97)より引用)

つまり、以下の手順でチェックが可能ということ！
①チェックしたい文字列を1文字ずつに分解
②分解した1文字のUNICODEでの文字コードを取得
③取得した文字コードがE000~F8FFの範囲に含まれているか確認

# UiPathで実装するなら…
UiPathで実装する場合は、今回筆者は以下の方法で実装しました。

## ①チェックしたい文字列を1文字ずつに分解
分割したい文字列 **.ToCharArray** で1文字ずつのChar型に分解
分解した配列を「繰り返し（コレクションの各要素）」アクティビティに渡してあげることで、1文字ずつに対しチェックを行えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/66fd6dbb-74f7-d832-f998-bef544439cc8.png)


## ②分解した1文字のUNICODEでの文字コードを取得
**AscW(文字列)** で指定した文字列のUnicode文字コードを取得
VB.Netの[Strings.AscWメソッド](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.strings.ascw?view=net-6.0)を使用することで、文字コードをInt32型で取得できます。
Excelでいう、 **UNICODE関数** と同じ働きをしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/8a6e3d69-6e9a-9467-ab54-454a962d5245.png)


## ③取得した文字コードがE000~F8FFの範囲に含まれているか確認
あとは取得した文字コードが指定範囲内に含まれているかのチェックのみです。
ただし、記載した範囲は16進数の文字列、対して取得した文字コードは10進数の数値となっているため、
比較ができるよう同じ数値型(10進数)に揃える必要があります。

### 16進数→10進数への変換
**convert.ToInt32(16進数の文字列,16)** で16進数で記載された文字列を10進数の整数へ変換
参考サイト：[Convert.ToInt32メソッド(Microsoft Docs)](https://docs.microsoft.com/ja-jp/dotnet/api/system.convert.toint32?view=net-6.0)
Excelでいう、 **HEX2DEC関数** と同じ働きをしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/98d19aba-9b3b-f73a-4cf6-291b7d36a3f4.png)

### (参考)10進数→16進数への変換
**convert.ToString(10進数の数値,16)** で10進数で記載された整数を16進数の文字列へ変換
参考サイト：[Convert.ToStringメソッド(Microsoft Docs)](https://docs.microsoft.com/ja-jp/dotnet/api/system.convert.tostring?view=net-6.0)
Excelでいう、 **DEC2HEX関数** と同じ働きをしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/7f999c49-fe01-a959-501e-c0956aed4ac7.png)

# 最後に
今回のようにUiPathとしての対処方法については出てこなくても、ExcelやVB.Netとしての対処・解決方法は調べてみると案外すぐ出てくる傾向にあります。
VB.Netの場合はそのまま流用できたり、Excelでの実装方法についても工夫すればUiPathでも同じ機能を持った処理を行うことができるので、
ヒントを得るために調べてみるのも一手かもしれません。
また、今回筆者のケースでは上記の方法で対応できましたが、環境によってはうまく行かない可能性もあります。
参考程度に捉えていただけると幸いです。
【Swift】エラー：Invalid redeclaration of ‘***’

# 開発環境
- M1 Mac(2021)
- Swift5 Xcode13.4.1

# 概要
Swiftの勉強でViewを作成しようとすると、以下エラーが出たので備忘録的に対処方法をメモ。

# エラー: Invalid redeclaration of '***'
CalendarView.Swift (SwiftUI View)を作成したときに上記エラーが発生。
このエラーを要約すると、「同じstructが作成されてるよ」と言う意味になるそうです。

私の場合、CalendarViewを過去に作成しており、そのことをすっかり忘れていたため再度同じstructを宣言してしまっていた模様。(勉強用に作っていたと言うこともあってコードの管理ができていませんでした。。。)

# まとめ
検索すればすぐに出てくる内容なので、書くほどでも無いと思っていましたが、自分への戒めを込めて残しました。

# 参考にした記事
- [エラーメッセージ　Invalid redeclaration of '***' について](https://qiita.com/kazuma___/items/aebc886afa44232b2f04)