OmniAICreator/Qiita-1.07M huggingface dataset:
旧OpenSiv3D(0.4.1～0.4.2)をVisualStudio2019(16.6.3以降)で使うときのエラー対策（最短、最終形態）

#原点回帰
プログラミングで仕事的に考えるのは、
同じグループ内で作業把握、チーム内で分かりやすいコード、
費用（作業コスト）対効果
をトップが考えて決める
部内ローカルなコーディングルール

●関数ポインタ使うな
●メンバにm_を使う（え？Ｃ＃なのに？？）
●ＳＴＬを使わない
●コンストラクタのオーバーロードは使わず、Initメソッドで初期化するルール決め、コンストラクタは引数無しのみにする
・
・
・

など実例（複数社の実例）でいろいろあったりする。それぞれ理由はあってその背景は面白いのだが、長くなるので割愛します。

いっそ、#define で文字列置換の役割を担ってしまえばいいのではないか？
と閃いた。
俺イズム。ローカルルールで作業効率を向上させればいいだけ。

＃define は、ややこしくなるで基本はなるだけ使うな、const使え、仕方なく使うとしたら全部半角大文字・・・

このセオリーをしない！作業効率重視！一時的にしないことにより、作業効率を向上させる

前置きが長くなったが、早い話、
<B>昔のプロジェクトが多くある場合、それらをすべていちいち新しいバージョンに変更作業するのは面倒で仕方ない、
これをすぐに確認できる方法は？と考えた次第。</B>

いったん昔のライブラリ本体を書き換えてしまえば、多くある昔のバージョン(0.4.1  0.4.2)はそのまま動作するので楽ができるということ。

#準備

VisualStudio2019(16.6.3以降)でOpenSiv3D(0.4.1) または (0.4.2)のプロジェクト 
(0.4.0)で試したら、OpenSiv3D の命令系統のエラーが大量に出てしまい、時間がかかりそうなので断念しました。

#エラー修正方法

ビルドエラーが出る。result_of 系統の命令で、エラーメッセージをダブルクリックして、
そのヘッダーファイルへ飛び、
下記ソースコードをコピーして1行目に貼り付ければOK！

```cpp
// C++20 check    std::result_of_t(C++17) ==>> std::invoke_result_t(C++20)

#if _MSC_VER >= 1926

#define result_of_t invoke_result_t
#define result_of invoke_result

#else

#define result_of_t result_of_t
#define result_of result_of

#endif

```

以上。

他の人に渡すことを考えなければ、上記コード量は半分になります。
他の人は、面倒くさがって新しいVisualStudio2019(16.6.3以降)にバージョンアップしているとは限らないので、それよりも前のバージョンでも動作する仕掛けがあるからです。

以下は、core.h (0.4.1)でエラーが出たので先頭行に追加した例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/52cd86b4-ae99-f5c5-5899-aae50f014437.png)



#発想の転換

＃define は半角大文字という暗黙のルールがあったが、それを無視した。
作業量の軽減を考えて文字の置換に特化したため。
道具に過ぎないことは利便性を特化して考える・・・！

あっさりうまくいってしまった。

そもそもこの命令は名称が変わっただけで中身は同じ。引数が増えた機能拡張されただけ。
全く同じ動作は可能。
MSの公式サイトで書かれていた。（サイト先失念）
コメントを頂いたおかげで「あれ？違うんじゃない？そういえば・・・！！」という感じで思い出しました。
「いっそ、こうすればいいんじゃない？」と閃いた感じです。

#単純置換

result_ofとinvoke_resultでは引数が１つで考えるならば、全く同じで問題ありません。

置換をしてしまえば全く問題ないということです。

もちろんバージョンダウンで引数が複数あれは問題が起きるとは思いますが、そんな無駄なことをする人はいないことでしょう。

他の命令でもC++のバージョンが変わって変更されても、＃defineの単純置換作業か、インラインメソッドを
<B>#if _MSC_VER >= 1926  </B>
で振り分けるだけでいい印象がある。
コンポーネント設計はセンスじゃない

#はじめに
今、出向している現場の開発はviewをすべてHTMLで作成している。
画面数だけのHTMLがあり、書き手によって粒度が違う。
また、デザインの変更やフォーム修正に対しHTMLファイルを修正しているので、
もちろん抜けも多くなるしテスト効率も悪い。

そこで、Reactの導入を考えたのである。

#なぜ、Reactなのか
ぶっちゃけると、Angularでもよかった( ´∀｀ )
ただ、在籍するエンジニアのこれからを考えるとReactのほうが良いかなという判断
Reactの案件が増えつつあるのでPHPer引退しても何とかなる。。。多分！

#リーダーに伝えてみた
今の案件はBPに人権があって意見も言いやすいので
さっそく、伝えてみることにした。

【自分】
「次の開発は、Reactつかって開発してもいいですか？
今のやり方だと画面修正するたびに莫大な工数がかかってるじゃないですか」

【リーダー】
「別いいよー。データはJSONでやりとりできれば嬉しいなー」

【自分】
(ふむ、REST API 使うイメージかな、何とか出来そうや)

【リーダー】
__「ただ、コンポーネント設計がめんどくさいよ。コンポーネント設計はセンスいるし」__

#本編 : コンポーネント設計はセンスなのか
###コンポーネントとは
Reactにおけるコンポーネントとは「部品」である
例えば、フォームの入力欄であったりボタンである
###なぜ、センスがいるのか
例えば、yahooの検索フォームを見てみると
![yahoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687704/6bd027a9-d827-a995-f182-147bb4230b9e.png)
最小のコンポーネントは検索ボックス(form) 検索ボタン(button) etc...である
しかし、そのままコンポーネントを並べたのでは実用性に欠ける。
なので、検索ボックス(form) 検索ボタン(button)で新たなコンポーネントを作成する

上記のように、コンポーネントを組合せテトリスのように画面を構築するのが
センスがないと難しいのでコンポーネント設計はセンスと言われてしまったのではないか。

###はたして、本当にそうなのか
結論を言ってしまえば、自分はNOだと思った。
なぜなら、調べていくうちに「__Atomic Design__」という概念を知ったからだ。

#Atomic Design
![20180417114252.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687704/f09f3473-959b-c49d-2005-390a4467bf8d.jpeg)
vistaでquartus その22

#概要

vistaでquartusやってみた。
modelsim入れてみた。


#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dbcc9d0b-637b-2c16-4a73-edf7a35f83a8.png)

#環境

windows vista 32bit
quartas ii v13.0

#インストール

ModelSimSetup-13.0.0.156.exe

#エラーの対応

Can't launch the ModelSim-Altera softwareが出る場合。

tool-optionsでパスを通す。


以上。
【DRF + Vue.js 】API取得時のエラーについて

# はじめに
　Vueのコンポーネント内から、DRFで作成したAPIを以下のようにaxiosなどで取得する際にエラーが発生した。

```javascript:.../source/views/Mypage.vue
export default {
  ...
  ...
  mounted() {
    this.axios.get("/users/" + this.user_id).then(response => {
      this.Person = response.data
    })
  }
};
```

### 発生したエラー
```
Access to XMLHttpRequest at 'http://127.0.0.1:8000/XXX/XXX/XXX' from origin 'http://127.0.0.1:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
```
VueからのXMLHttpRequestのアクセスがDRF側でブロックされているという感じの内容である。
CORSの設定を確認すると、以下の様にしっかり設定できている。

```python:.../settings.py
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
    'http://localhost:8080',
    'http://127.0.0.1:8080',
)
```

# 解決
リクエスト先のURLで最後に '/' をつけるのを忘れていた。
したがって、Vueのコンポーネントファイルを以下の様に修正すればよい。

```javascript:.../source/views/Mypage.vue
export default {
  ...
  ...
  mounted() {
    // 最後に'/'を追加する
    api.get("/users/" + this.user_id + '/').then(response => {       
      this.Person = response.data
    })
  }
};
```
Vuetifyのbreakpointのnameはstringだけじゃない

## 結論

```ts
export type BreakpointName = number | 'xs' | 'sm' | 'md' | 'lg' | 'xl'

export interface Breakpoint {
  name: BreakpointName
  // 省略
}
```

## 問題提起

`vuetify.breakpoint.name`に`string`を指定するとこんなエラーが出ていた

```
The types of 'name' are incompatible between these types.
  Type 'BreakpointName' is not assignable to type 'string'.
    Type 'number' is not assignable to type 'string'.
```

### stringだけじゃないのか？？

Vuetifyの公式ドキュメントを読むとstringが帰ってくるのかと思った。
https://vuetifyjs.com/ja/customization/breakpoints/

## 解説
Vuetifyのソースコードを読んでみよう

### VueitfyのBreakpointの型

今回はブレークポイントのTypesだけ見れればいいので下記のリンクのファイルを確認

1. どうやらBreakpoint.nameがBreakpointNameらしい
2. BreakpointNameは`number | 'xs' | 'sm' | 'md' | 'lg' | 'xl'`が入る事がわかる

https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/types/services/breakpoint.d.ts

```ts:packages/vuetify/types/services/breakpoint.d.ts
// Types
export type BreakpointName = number | 'xs' | 'sm' | 'md' | 'lg' | 'xl'

// Interfaces
export interface Breakpoint {
  height: number
  lg: boolean
  lgAndDown: boolean
  lgAndUp: boolean
  lgOnly: boolean
  md: boolean
  mdAndDown: boolean
  mdAndUp: boolean
  mdOnly: boolean
  name: BreakpointName
  sm: boolean
  smAndDown: boolean
  smAndUp: boolean
  smOnly: boolean
  width: number
  xl: boolean
  xlOnly: boolean
  xs: boolean
  xsOnly: boolean
  mobile: boolean
  mobileBreakpoint: BreakpointName
  thresholds: BreakpointThresholds
  scrollBarWidth: number
}

export interface BreakpointOptions {
  mobileBreakpoint?: BreakpointName
  scrollBarWidth?: number
  thresholds?: Partial<BreakpointThresholds>
}

export interface BreakpointThresholds {
  xs: number
  sm: number
  md: number
  lg: number
}

```

## なぜBreakpointNameにNumberが入るの？

先程のコードの抜粋を見るとnameとmobileBreakpointにBreakpointNameが使われているらしい。

```ts:packages/vuetify/types/services/breakpoint.d.ts
export type BreakpointName = number | 'xs' | 'sm' | 'md' | 'lg' | 'xl'

export interface Breakpoint {
  name: BreakpointName
  mobileBreakpoint: BreakpointName
}
```

### datatableのpropsを例に説明

どうやら下記の様に利用されるらしい。
defaultでは600が入っているが自由に変更できるとのこと。

https://vuetifyjs.com/ja/components/data-tables/

```vue
<v-data-table
  :headers="headers"
  :items="desserts"
  :items-per-page="5"
  class="elevation-1"
  mobile-breakpoint="500"
/>
```

### VuetifyのmobileBreakpointが利用されているソース

https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/services/breakpoint/index.ts#L55

また、mobileBreakpointがnumberだけならBreakpointNameで統一せずに分けろよな！！
と思ったがmobileBreakpointmにlgのようstringを使うコードも一応存在するみたい。

### breakpoint.nameにnumber入れてるコードあるかな？

ということでVuetifyのbreakpointのテストコードを拝見
https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/services/breakpoint/__tests__/breakpoint.spec.ts

number入れてるテスト無いじゃん！！
テキストからWindowsのファイル名に使えない記号を置き換えるコード


Windowsのファイル名に使えない記号`\ / : * ? " < > |`を全角記号に置き換えるだけのコードです。
テキストを`str`の中に入れてお使い下さい。テンプレートリテラルなので改行ありでも大丈夫です。
そのままブラウザからF12 → consoleに打ち込めば結果が出ます。

# コード

````js
var str =
`
text
`;

console.log(
    str.replace(/\\/g, "￥")
       .replace(/\//g, "／")
       .replace(/:/g, "：")
       .replace(/\*/g, "＊")
       .replace(/\?/g, "？")
       .replace(/"/g, "”")
       .replace(/</g, "＜")
       .replace(/>/g, "＞")
       .replace(/\|/g, "｜")
);
````
CALayerアニメーションで開始位置を変更した際に迷ったことを整理した

CoreAnimationを使って、吹き出しのアニメーションを作った際に

- アニメーションがViewの中心から始まってしまう
- Viewの表示位置がズレてしまう

という点について迷ってしまいましたので、自分なりに整理してみることにしました。

内容を整理するにあたって、日常生活の会話を題材に、以下の4つの点から開始するアニメーションを作成しました。

- 閃きのアニメーション　(画像の下中央からのアニメーション)
- 吹き出しのアニメーション　(画像の左右中央からのアニメーション)
- 汗マークのアニメーション　(画像の上中央からのアニメーション)

アニメーション自体は、Viewのスケールを変えているだけになります。

###動かした感じ
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/l4KkW38kUJ">pic.twitter.com/l4KkW38kUJ</a></p>&mdash; 小岩井 (@WfODXAd0jmop1Ev) <a href="https://twitter.com/WfODXAd0jmop1Ev/status/1291675699443453952?ref_src=twsrc%5Etfw">August 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#アニメーションの開始位置を変更する
アニメーションの開始位置の指定は、CALayerの**anchorPoint**[^1]を指定することで変更が可能です。

##閃きのアニメーション
エナジードリンクを飲む前に、添える一言を思いついた瞬間を表すアニメーションです。

anchorPointで指定する際は、次のような座標をイメージすると対応を進め易いです。
<img width="200" alt="電球.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368129/e75476a8-bbcb-7019-ff72-bf3bc4a2a778.png">

電球のアニメーションでは、<font color="RED">●</font>の位置から始めたいので、座標はxが0.5、yが1.0になります。

*デフォルトでは、この値が(0.5,0.5)になっているので、アニメーションがViewの中央から始まります。*

電球のviewをlightBulbViewとすると

```swift
lightBulbView.layer.anchorPoint = CGPoint(x: 0.5, y: 1.0)
```

と指定することで、<font color="RED">●</font>の位置からアニメーションが開始されます。

##吹き出しのアニメーション
エナジードリンクを飲む直前に添えた一言の吹き出しのアニメーションです。

<img width="200" alt="吹き出し.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368129/2d45d6ee-02bb-bc33-9a22-27e7a5fa8da2.png">

吹き出しのアニメーションは、<font color="RED">●</font>の位置から開始したいので、xが1.0、yを0.5に指定します。

```swift
speechBubbleView.layer.anchorPoint = CGPoint(x: 1.0, y: 0.5)
```

##汗マークのアニメーション
聞き返された後のアニメーションです。

<img width="200" alt="汗マーク.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368129/e5dc53a1-cb7e-1abb-fe3f-29c560be93d9.png">

吹き出しのアニメーションは、<font color="RED">●</font>の位置から開始したいので、xが0.5、yを0.0に指定します。

```swift
polkaDotView.layer.anchorPoint = CGPoint(x: 0.5, y: 0.0)
```

これで、Viewに追加した画像別に、アニメーションの開始位置を変えることができました。

#Viewの表示位置を元に戻す

しかしこのままですと、配置したViewの表示される位置が変わってしまいました。
そこで、 anchorPointで移動させた分を、元に戻して意図した見た目の位置に戻しました。

```swift:閃きのアニメーションで試した例
let yMovement = lightBulbView.frame.size.height * lightBulbView.layer.anchorPoint.y
lightBulbView.transform.ty = yMovement
```

```swift:吹き出しのアニメーションで試した例
let xMovement = speechBubbleView.frame.size.width * speechBubbleView.layer.anchorPoint.x
speechBubbleView.transform.tx = xMovement
```



[^1]: https://developer.apple.com/documentation/quartzcore/calayer/1410817-anchorpoint
「Pythonで体験するベイズ推論」でのはまりポイント

##「Pythonで体験するベイズ推論」を始めるときにはまったところ。

「Pythonで体験するベイズ推論」を読み始めました。
動かすまでに少しはまったところをメモしておきます。

`pymc`を入れるのですが、今は`pymc4`になっています。
書籍の`github`を確認すると、
https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers
`pymc2`と`pymc3`のスクリプトが載っているので、本を読むときは`pymc3`をインストールして、`git`の中にある`pymc3`用のスクリプトを見るようにする。

必要なライブラリーは、`pymc3`とバックエンドの`theano`になります。


`pip install pymc3`

いろいろやったけど、何も入れずに、最初に、この`pip`のみで全部インストールされます。

基本的に、この`pymc3`をインストールすると、必要な`theano`がインストールされます。
`theno`は`pymc3`の後ろで動くバックエンドになります。

後、必要な`jupyternotebook`を入れます。

`pip install jupyter`

一応これで、第一章は動きます。warningを吐きまくりますが、一応動くので大丈夫です。


次に、僕は、好きな`spyder`も入れました。
`spyder`で動かすときは、ここがはまります。

`jupyter`の`Ch1_Introduction_PyMC3.ipynb`の中のセルのin10で、このまま`spyder`で動かすと、ここでエラーが起きます。

```
#これで動かすと、エラーが出ました。
with model:
    step = pm.Metropolis()
    trace = pm.sample(10000, tune=5000,step=step)
```
エラーの理由は、マルチコアの設定がなんかうまく動かないようです。
ここは、このように直します。

```
with model:
    step = pm.Metropolis()
    trace = pm.sample(10000, tune=5000,step=step , cores = 1)
```
とりあえずcores=1で、シングルコアで動かせば動きます。ここを２とか４とか入れるとエラーが出ますが、なんか動いて、強制終了すると結果が出ます。普通に動かすときは１を設定しましょう。
`jupyternotebook`で動くけど、`spyder`でエラーが出る理由はわかりません。


今後は、`pymc4`で`tensorflow`がバックエンドになるそうですが、この書籍の場合は`pymc3`を入れた方が良いです。

https://yukinagae.hatenablog.com/entry/2018/09/20/093137
pandasとmatplotlibを使ってPythonで時系列データをグラフに描く 

# pandasとmatplotlibを使ってPythonでグラフを描く

初めてPythonを使ってグラフを描くため勉強しながら記載しました。

今回は、鳥取市の日平均気温と降水量の日合計のデータをグラフで表示します。
[気象庁|過去の気象データ・ダウンロード](http://www.data.jma.go.jp/risk/obsdl/index.php)からデータを取得して
以下のようなcsvファイルを解析します。 
 
```
time, temperature,precipitation
2019/8/5,30.2,0
2019/8/6,30.1,0
2019/8/7,31.6,0
2019/8/8,31,0
2019/8/9,29.6,0
2019/8/10,29.8,0
2019/8/11,30.3,0
…
```

下記のファイルは、Python3.7で動かしました。

```python
from matplotlib import pyplot as plt
import pandas as pd

# CSVファイルをpandas.DataFrameとして読み込む
# index(見出し列)としてtimeの列を指定
# デフォルトでheader=0が指定されており1行目はヘッダーとして無視
data = pd.read_csv(r'data.csv', index_col='time')

# 行と列の抽出
# :は全部の行、'[0,1]'はindexとして指定した列を除き2列を抽出
df = data.iloc[:, [0,1]]
# データをプロット
df.plot()

# グラフのタイトル
plt.title("tottori")

# グラフを表示
plt.show()

```
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/0533c28a-65cc-8fae-54d6-84706112e555.png)

# 参考
[Python/pandas/matplotlibを使ってcsvファイルを読み込んで素敵なグラフを描く方法（Mac/Raspberry Pi） - karaage. [からあげ]](https://karaage.hatenadiary.jp/entry/2017/05/25/073000)  
[pandasでcsv/tsvファイル読み込み（read_csv, read_table） | note.nkmk.me](https://note.nkmk.me/python-pandas-read-csv-tsv/)
Anaconda仮想環境をプロジェクトフォルダ内に作成する

# Anaconda仮想環境をプロジェクトフォルダ内に作成する

<img width="178" alt="conda_env_in_folder.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472945/768a541c-7638-7157-f998-87b3a2e612d3.jpeg">

仮想環境を`env`フォルダとして`project_folder`の中に作成する。`project_folder`を渡すだけで簡単に共有先が再現できるようにするため。

## 1. (Anaconda Promptで) `project_folder`内に移動

```
cd project_folder
```



## 2. 仮想環境を作成

```
conda create --prefix ./env <使用したいライブラリをここに書く>
```



例えば`numpy`, `matplotlib`をインストールした環境を作成する場合は

```
conda create --prefix ./env numpy matplotlib
```

実行すると`project_folder`内に`env`フォルダが作成される。この`env`フォルダ内に仮想環境が入っている。

`project_folder`ごと共有すれば共有先でも同じ環境を有効にできるのが利点。




## 3. 仮想環境を有効にする

```
conda env list
```

で作成した環境リストを確認し、

```
conda activate <有効したい仮想環境へのパス>
```



例えばリストの確認結果が以下の場合

```
# conda environments:
#
                         C:\codes\Python\conda_tutorials\project_folder\env <- 作成した環境
```

環境を有効するには

```
conda activate C:\codes\Python\conda_tutorials\project_folder\env
```
【Rails】form_withを完全に理解した

#この記事の内容
- form_withメソッドの使い分け
- それに伴うストロングパラメータの取り扱い
- フォーム内容をHTTP通信させる方法

#環境

```
$ rails -v
Rails 6.0.3.1
```
```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```



#form_withとは

フォーム送信するためのUI部品をビルドするメソッドで、自動でサーバー側のコントローラアクションを切り替えてくれる特徴を持つ。

切り替える要因となるのは、オプションのmodelやurlに対する値によって変わり、以下のようになる。

| オプション|@userの中身|呼び出されるアクション|用途|
|:---|:----|:---|:---|
| model: @user|User.new |create|ユーザー作成
| model: @user|User.find()|update|ユーザー編集
| url: sessions_path||create|ユーザーログイン


また、オプションの違いを比較すると、以下のようになる。

| オプション|入力エリアのname属性|ストロングパラメータ|
|:---|:----|:---|:---|:---|
| model: @user|name="user[email]"|params.require(:user).permit(:email)|
| url: users_path|name="email"|params.permit(:email)|


##modelオプションを使った例

```.erb
<%= form_with model: @user do |f| %>
  <%= f.label :name, "名前" %>
  <%= f.text_field :name, placeholder: "山田" %>

  <%= f.submit "登録する" %>
<% end %>
```

##urlオプションを使った例

```.erb
<%= form_with url: sessions_path do |f| %>
  <%= f.label :name, "名前" %>
  <%= f.text_field :name, placeholder: "山田" %>

  <%= f.submit "ログインする" %>
<% end %>
```


##localオプション

実は、デフォルトで```remote: true```オプションが付与されており、いわゆるAjax通信をするようにあらかじめ設定されている。
そのため、特に何も設定しないと、renderメソッドが行われないことによるflashが表示されなかったりする。

通常のHTTP通信を行うために、以下のような設定を行うことで、上記の問題を解決することができる。

```.erb
<%= form_with model: @user, local: true do |form| %>
```

##まとめ

form_withは、自動でHTTPリクエストの種類を判別してくれるので、便利。
【Nuxt】レイアウトを共通化 / カスタム

# はじめに
nuxtではプロジェクトを作成するとプロジェクトの配下に```layoutsディレクトリ```が作成される。この```layoutsディレクトリ```を使ってページのレイアウトを共通化したり、カスタムすることができる。

## デフォルトレイアウト
nuxtはデフォルトのレイアウトとして```default.vue```を持っていて、特にレイアウトの指定がない場合は```default.vue```が適用される。
layoutsディレクトリの配下に```default.vue```を作成することで共通で使用するデフォルトのレイアウトを作成できる。(使用頻度の高いレイアウトをデフォルトとして設定する)

```layouts/default.vue
<template>
  <div class="App">
    <div class="App__header">
      <TheHeader />
    </div>
    <div class="App_body">
      <!-- ↓ ここでページコンポーネントが表示される -->
      <nuxt />
    </div>
    <div class="App__footer">
      <TheFooter />
    </div>
  </div>
</template>

<script lang="ts">
export default {};
</script>
```

## カスタムレイアウト
特定のページでだけヘッダーを表示させたくないなど、レイアウトをカスタムしたい場合に利用する。

layoutsディレクトリにカスタムしたレイアウトのファイルを作成。
今回はヘッダーのないレイアウトをplain.vueとして作成。

```layouts/plain.vue
<template>
  <div class="App">
    <div class="App_body">
      <nuxt />
    </div>
    <div class="App__footer">
      <TheFooter />
    </div>
  </div>
</template>

<script lang="ts">
export default {};
</script>
```

レイアウトを使用したいページでレイアウトを指定。
layoutキーに文字列で使用したいレイアウトのファイル名を指定する。

```index.vue
<script lang="ts">
// トップページではヘッダーを表示しないレイアウトを使用
export default {
  // レイアウト plainを指定
  layout: 'plain'
};
</script>
```
セキュリティ対策について

セキュリティ対策について、自分の言葉でわかりやすくキロク。

#CSRF（cross-site request forgeries）：クロスサイトリクエストフォージェリ

###CSRFの例

例えば、お問い合わせフォームなどで、``送信``ボタンを押した際、
悪意のあるユーザによって作成された遷移先にたどり着いてしまったら、
個人情報が盗まれてしまうかもしれない。

###対策
対策としては、元のページと、遷移先のページが同じ管理元であることを確かめる必要がある。

合言葉を作って確認するのです。

その合言葉はtokenと言われるもので、数十桁の意味のない文字列を都度生成する。

その合言葉（token）をsessionに格納し、遷移先で一致しているか確認し、一致していた場合に処理を続ける。
それ以外の場合は弾く、とすれば、CSRFの脅威から守られる。

- tokenに、意味のない文字列数十桁を生成する
- $_POSTで取得するtokenは、formのタイプ：hiddenで送る
- sessionに格納したtokenと、hidden送信されたtokenをチェックし、一致していたら処理を続けます


以下にソースコードの一部を記します。

```csrf.php
// posｔ送信でtokenが取得できない、または、hiddenで送信されたtokenとsessionのtokenが一致しない場合
if (isset($_POST['token']) ===false || $_POST['token'] !== $_SESSION['token']){
  header('location:index.php'); // トップページへ遷移
  $_SESSION = array(); // 不正なtokenだったからsessionから削除しておく
  exit; // 処理を抜ける

} else {  
  //処理を続ける
}
```

#XXS(Cross Site Scripting)：クロスサイトスクリプティング

###XXSの例

Webサイトの脆弱性を攻撃する。

例えば、リンクのURLに罠を仕掛けて、悪意のあるページに引き寄せる。
そして、正規のサイトに似たページが表示され、そこで、ID、パスワードなどを入力させ、情報が抜き取られる（フィッシング）。

###XSS対策
悪意のあるユーザーがスクリプトを埋め込もうとしても、それらを無効にする必要があります。

対策として、
私はいつも安全に表示するためのユーザー関数を定義しておいて（下コード参照）、PHPのprintで出力するタイミングでこの関数を使用するようにしています。


```xxs.php

// 安全に表示するユーザー関数
function h($value) {
    return htmlspecialchars($value, ENT_QUOTES, 'utf-8');
}
```



#SQLインジェクション

###SQLインジェクションの例

SQL文として成立する文字列が不正に送られて、データベースを操作されること。
XSSはWebサイトの脆弱性を攻撃してくるのに対し、SQLインジェクションは相手のデータベースに攻撃を仕掛ける。

###対策

プレースホルダやバインド変数やprepaired statementを利用して、
SQL文には、変数などの値を入力しないようにする。

以下コードは値をバインドしている例
SQL文には、値を代入せず、'?'を代用して、SQL文を実行する際に値を代入しています。

```sql.php

$sql  = 'INSERT INTO items(name,price)VALUES(?,?)'; // SQL文
$stmt = $dbh->prepare($sql); // 準備
$stmt -> execute(['apple', 100]); // 実行
```


----
今回は、セキュリティ対策についてキロクしました。

最近、大手企業への不正アクセスがあり、個人情報がもれた、などの報道がありました。
こんな悪いこと誰がするんだろう、って思ってたけど、いるんですね、悪い人は。

そんな悪さに負けないWebサービスを作ってみたいものです。
AWS IoT Events への入力データを AWS CLI (v2)で作成&送信する方法

AWS IoT Events を用いた開発の際、テストデータ送信が必要となります。
コンソールから [データを送信する] > [サンプルデータを送信] でも、データを送り込むことは可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/2c0ccd50-cc5d-f80a-55bb-bb2ac5f4a789.png)

これを AWS CLI(v2) で実現する方法が本エントリーとなります。

## 論よりコード (TL;DR)

Input(入力) `IoTData1` に対し `{"id":"id1","v1":25.0,"v2":"foobar","v3":false}` というデータを送りたい場合：

```console:bash
$ aws iotevents-data batch-put-message \
--messages messageId=${RANDOM},inputName=IoTData1,payload=$(echo '{"id":"id1","v1":25.0,"v2":"foobar","v3":false}' | base64 -w0)
```

※ AWS CLI v2 を使用
※ 要 `base64` コマンド (Ubuntu なら coreutils に入ってます)

## 解説

私の好きな [AWS IoT Events](https://aws.amazon.com/jp/iot-events/) は、デバイスのステートマシン(状態遷移)を簡潔に実装できます。
基本的な話は [AWS IoT Events は IoT デバイスの「ステートマシン」](https://qiita.com/ma2shita/items/66ecfdb34cdb16d345d3) をご覧ください。

AWS IoT Events の実装は "Input(入力)" と "Detector Model(探知機モデル)" の2つで構成されています。
![AWS ioT Events の構成](https://docs.google.com/drawings/d/e/2PACX-1vQeZsTibQ7GQjPyQlsWumFrWMPnf8L9V0nyaMUtHdNYX4eaDd9ioj5AM3ZYtQZ5uDuYsFqIIeA9Visk/pub?w=564&h=382)

* **Input**: スキーマのようなものです。どのような入力がされるのかを Input 内であらかじめ定義しておきます。
* **Detector Model**: 状態遷移そのものです。 Input からの入力は `$input.INPUT_NAME.json_path` で参照できます。

Detector Model を動かすためには Input にデータを送信します。そして、その Input を参照している Detector Model が実行されるため、 Input がエントリーポイントであると言っても良いでしょう。

## AWS CLI(v2) で AWS IoT Events にデータを送る

AWS IoT Events の Input へのデータ送信を AWS CLI で行う場合は `iotevents-data` サブコマンドを使います。 
`--messages` には3つのパラメータを設定します。

* `messageId` : 送信データの ID。ともかく一意になれば何でもよいです。CloudWatch Logs で探すときに使うくらい。例では Bash の ${RANDOM} で生成しています。`uuidgen -r` でもいいでしょう。
* `InputName` : 送信先の Input 名。
* `payload` : Detector Model に送信する実データ。

```console:bash
$ aws iotevents-data batch-put-message \
--messages messageId=${RANDOM},inputName=IoTData1,payload=$(echo '{"id":"id1","v1":25.0,"v2":"foobar","v3":false}' | base64 -w0)
```

もしくは JSON で入力する場合は以下の通り

```console:bash
$ aws iotevents-data batch-put-message \
--messages '{"messageId":"1","inputName":"IoTData1","payload":"'$(echo '{"tid":"id1","tmpr":25.0}' | base64 -w0)'"}'
```

### payload の base64

[payload は blob](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iotevents-data/batch-put-message.html) となっており、base64 encoded textで送ることになるため `base64` でエンコードしています。

※ [AWS CLI v2 では blob は Base64 encoded text がデフォルト](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html#cliv2-migration-binaryparam)となりました。
※ payload は *This can be a JSON string or a Base-64-encoded string representing binary data (in which case you must decode it).* となっているのですが、 `payload="{\"id\":\"id1\",\"v1\":25.0,\"v2\":\"foobar\",\"v3\":false}"` は NG でした。なんかいい方法無いのでしょうか🤔

## あとがき

もうすぐお盆休みですね！

EoT
【Nuxt.js】Nuxt実践編：あると便利なコピーボタンの作り方

🎈 この記事はWP専用です
https://wp.me/pc9NHC-xv

# 前置き
ここ最近は文法編に力を入れていたので
久しぶりの実践編です✨

<img width="327" alt="Frame 1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/49374cb3-a87b-b0b1-b626-98b2ab5e1897.png">

input内のテキストを
コピーするボタンを作ってみましょう♪
イベントアプリなどでページを作成し、
自動生成されたurlをコピーしたい時なんかに使えます🌟

urlの自動生成まではやりません。
あくまでinputとコピーボタンのみ作成します🎈🧸
スタイリングも省いてます、そこはお好みで♪


# まずはinputを作成
コピーボタンの作り方は
3通り用意していますが、
input部分はどれも共通です🍒

## divではダメなのか

今回はコピーボタンがあるので
値が見えなくても@clickでコピーさえできればOK⭕️
そのためinputでやっていますが、
urlを直接選択するような場合は
スクロールの効くdivで作成すると良いと思います🌟

divで作る場合も後述しておきます✍️

## 解説

readonly属性
urlを間違って編集したりしないようにします⚠️

:value
今回はユーザーが入力する必要がないので
@inputが不要、双方向バインディングが不要です🌟
値だけバインドできればOK⭕️

class="text"
input要素ではありますが、
入力不要でテキスト表示の役割のため。
コンポーネントにする場合も
InputText.vueなどの命名にし、
$attrsを使うのが良いと思います💡

⬇️双方向バインディング、
　v-modelについてはこちら
　https://wp.me/pc9NHC-kI

## コード

```index.vue
<template>
 <div class="page">
   <input
     id="input"
     :value="url"
     type="text"
     readonly
     class="text"
   >
 </div>
</template>

<script>
export default {
 data () {
   return {
     url: 'https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb',
   }
 },
}
</script>
```


# コピーボタンを作る
コピーと言えばdocument.execCommand()ですが廃止！
なのでClipboard APIと
nuxt-clipboard2を使ってみましょう🌟

document.execCommand()も
一応…最後に載せています🐥

## 方法1: Clipboard API

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-xv
NumPy における行列積（matmul）についての考察

# 背景
線形代数においては，慣例的にベクトルを列ベクトル（column vector）で定義することが多い．

すなわち，$\boldsymbol{x} = \begin{bmatrix}a&b&c\end{bmatrix}$ ではなく，
$$
\boldsymbol{x} = \begin{bmatrix}a\\\\ b \\\\ c\end{bmatrix}
$$
と定義する．

行列の乗法では，例えば $A$ と $B$ の積 $AB$ を考える場合には，$A$ の列数と $B$ の行数を同じ数に揃えなくてはいけない．すなわち，$A$ が $n \times m$ の行列であれば $B$ は $m \times p$ のような形でなければ，積を定義できない．

列ベクトル $\boldsymbol{x}$ に 行列 $A$ を作用させる場合には，$A$ を左から掛けて $A\boldsymbol{x}$ とする．
一方で，行ベクトル $\boldsymbol{x}$ に 行列 $A$ を作用させる場合には，$A$ を右から掛けて $\boldsymbol{x}A$ としなくてはならない．このような表記は一般的ではない[^1]．

# numpy.matmal での行ベクトルの扱い
Python/NumPy の多次元配列で行列とベクトルの積（[numpy.matmal](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html)）を計算してみる．

```Python
>>> import numpy as np
>>> A = np.array([[1, 2], [3, 4]])
>>> x = np.array([[1], [2]])
>>> A @ x # 行列積（matmul）には @ を用いる
array([[5],
       [11]])
```

> \* (dot product) は対象とする行列（あるいはテンソル）の次元によって異なる挙動を示すため，推奨されない．スカラ倍する場合などは \* で問題ない．

これは至って問題のない結果といえる．では次の計算はどうか．

```Python
>>> A = np.array([[1, 2], [3, 4]])
>>> x = np.array([1, 2])
>>> A @ b
array([5, 11])
```

これは数学的には矛盾のある結果といえる．背景部分で説明したとおり，$2 \times 2$ の行列と $1 \times 2$ のベクトルはこの順序で積を取ることができない．しかしながら，
上記プログラムはこれを実行して結果を返している．

一つ前の例からも明らかであるが， ここでは（数式的には）以下の処理が行われている．

$$
\left(A\boldsymbol{x}^\top\right)^\top
$$

すなわち，**「指定されたベクトルが行ベクトルだったので，列ベクトルになおして積を取り，結果として得られる列ベクトルを再び行ベクトルに戻して返す」**という処理を行っているのである．便利といえば便利だが，線形代数に詳しい人は少し困惑するのではなかろうか．

もちろん，$\boldsymbol{x}$ が列ベクトルであるので，以下の計算については矛盾がない．

```Python
>>> b @ A
array([7, 10])
```

それでは，再び $\boldsymbol{x}$ を行ベクトルに戻して $\boldsymbol{x} A$ の計算結果がどのようになるか見てみよう．これまでの実験の結果から，「列ベクトルも行ベクトルになおして積をとってくれるのでは」との推察が自然に導かれる．

```Python
>>> A = np.array([[1, 2], [3, 4]])
>>> x = np.array([[1], [2]])
>>> x @ A
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)
```

ところが，列ベクトルは行ベクトルへ変換されず，エラーとなってしまう．
これはもちろん数学的には期待通りのエラーであるが，上記の推察からは外れてしまっている．

# 結論
`numpy.matmul` における**行ベクトル**は，そのコンテキストに応じて内部で列ベクトルに変換され，出力時には再度，行ベクトルへと戻される．ただし，列ベクトルについてはかような解釈は実装されていない．


[^1]: 2020/08/07 現在
FuelPHPでSQLの最新のレコードを取得する

SQLにあるレコードの、`created_at`が最も新しいものを取得したいといったとき、
SELECTに`MAX(created_at)`とするだけでやってくれます。

FuelPHPの場合は

```example.php
$query = \DB::select('id', \DB::expr('MAX(created_at)'))
->from('table_name')
->execute();
```

とするだけでできます。
これに加えて
`group_by('id')`
などを使うときにすごく役立ちます。

配列で取得したあとに頑張って新しい配列に入れるみたいなことをせずに済みます。（自戒）
Unityでシリアル通信する際に試したこと

Unityでシリアル通信する際に試したことを、メモとして残します。

#開発環境
- OS: Windows 8.1

#構成
- micro:bitのUSBポートからUARTを送信（19200bps）
- Unityでは、System.IO.Portsライブラリを使ってUARTを受信
    - Unityからmicro:bitへの送信は行っていない
- System.IO.Ports.dllは[こちらの記事](https://qiita.com/Fox_Kei/items/dbe10141e36f6a91ee83)を参考に、ダウンロード＆プラグイン
- [こちらのWebサイト](https://tomosoft.jp/design/?p=7256)を参考に、SerialHandler.csを作成し、Main Cameraにアタッチ
    - ただし、ポートオープン処理に`serialPort_.ReadTimeout = 2000;`を追記（これを書かないとタイムアウトする）

#正常にUART受信ができた条件
##Unityのバージョン
- Unity 2018.3.14f1

##.NET関連の設定
[Edit] > [Project Settings...] > Player > Other Settings > Configurationにて、
以下2つのいずれか：

- 設定1
    - Scripting Runtime Versionが.NET 4.x Equivalent
    - Api Compatibility Levelが.NET 4.x
- 設定2
    - Scripting Runtime Versionが.NET 3.5 Equivalent
    - Api Compatibility Levelが.NET 2.0

##System.IO.Ports.dllのバージョン
以下3つのいずれか：

- System.IO.Ports.5.0.0-preview.7.20364.11のnet461
- System.IO.Ports.5.0.0-preview.7.20364.11のnetstandard2.0
- System.IO.Ports.4.4.0のnetstandard2.0

#正常にUART受信ができなかった条件
##Unityのバージョン
- Unity 2019.4.7f1

##.NET関連の設定
[Edit] > [Project Settings...] > Player > Other Settings > Configurationにて、
以下2つのいずれも：

- 設定1
    - Api Compatibility Levelが.NET 4.x
- 設定2
    - Api Compatibility Levelが.NET Standard 2.0

##System.IO.Ports.dllのバージョン

- System.IO.Ports.5.0.0-preview.7.20364.11のnet461

#予想

- Unityのバージョンが新しいと、System.IO.Portsが正常に動かない
    - Scripting Runtime Versionが設定できるかどうかが鍵？
- System.IO.Ports.dllのバージョンは関係がない

#余談
複数のバージョンのUnityをインストールする際に、[こちらのWebサイト](https://ekulabo.com/multiple-versions)を参考にしました。
旧OpenSiv3D(0.4.1)をVisualStudio2019(16.6.3以降)で使うときのエラー対策、もっと簡単に！

前回にちょっと書いたが、理由やその他の説明追加

#エラーになる理由
簡単に言うと、昔の命令（STL）の名称が変わり、以前のものが未定義なるといったもの。
それゆえ、ビルドエラーになる
これは OpenSiv3Dライブラリ が新型C++20に対応したため。

#ここでいまさら気が付いた！

DXライブラリでもビルド設定で昔のv140設定に変更したりとか前にあったのを思い出した。
ということは、念のため、C++の昔のバージョンに変えればうまくいくかも？
結論から言うと上手くいった。
ただし、エラーは出るので４行だけ手修正も必要になる。コメントアウトするだけ。

#直し方
C++  OpenSiv 0.4.1 のプロジェクトを用意。

C++１７に変更する

ソリューションエキスプローラーのプロジェクトファイルを右クリック＞プロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/c82c2694-2a64-b7de-e54e-4d8bbd7146ac.png)

C++17に変更 ＞ OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/1874e90b-7e5a-ebf8-f415-9d06d088ef2b.png)

ビルドしてとエラーを出す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/bb77b445-2678-f730-b11b-84a3b67a1e0f.png)

エラーメッセージをダブルクリックで飛ぶ

で、以下の４行をコメントアウト。OpenSiv 0.4.1 を直接書き換えるので慎重に。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/f6285d09-967b-51ff-2ebf-926db5739c06.png)

以上、完了

#考察
過去にコメントアウトして直すのはやったことがあったが、
C++のバージョンダウンはやっていなかった。
VisualStudioがちょっと前のバージョンの時、C++のバージョンダウン設定が
見当たらなかった（気が付かなかった？しかしコンソールアプリではあった）
が、
ダメもとで調べてみたらあったのでやってみたら難なくうまくいった。
React NativeでTab navigationを使おうとしたら "Unable to resolve module 'react-native-screens' from~" というエラーが出てきた

必要なパッケージをインストール後、[ここに書いてあるコード](https://snack.expo.io/?platform=android&name=Header%20buttons%20%7C%20React%20Navigation&dependencies=%40react-native-community%2Fmasked-view%40%5E0.1.7%2C%40react-navigation%2Fbottom-tabs%40%5E5.8.0%2C%40react-navigation%2Fdrawer%40%5E5.9.0%2C%40react-navigation%2Fmaterial-bottom-tabs%40%5E5.2.16%2C%40react-navigation%2Fmaterial-top-tabs%40%5E5.2.16%2C%40react-navigation%2Fnative%40%5E5.7.3%2C%40react-navigation%2Fstack%40%5E5.9.0%2Creact-native-paper%40%5E4.0.1%2Creact-native-reanimated%40%5E1.7.0%2Creact-native-safe-area-context%40%5E3.0.2%2Creact-native-screens%40%5E2.9.0%2Creact-native-tab-view%40%5E2.15.1&sourceUrl=https%3A%2F%2Freactnavigation.org%2Fexamples%2F5.x%2Ftab-based-navigation-minimal.js)を丸々コピペしてexpoを起動したら以下のようなエラーが出てきた。

```
Unable to resolve module 'react-native-screens' from 'node_modules/@react-navigation/bottom-tabs/src/views/BttomTabView.tsx': react-native-screens could not be found within the project.
 
 If you are sure the module exists, try these steps:
  1. Clear watchman watches: watchman watch-del-all
  2. Delete node_modeules: rm -rf node_modules and run yarn install
  3. Reset Metro's cache: yarn start --reset-cache
  4. Remove the cache: rm -rf /tmp/metro-*
```

## 試した対処法
### エラーコードの通りに試してみる

```
$ watchman del-all
$ rm -rf node_modules && yarn install
$ yarn cache clean
$ rm -rf /tmp/metro-*
```
しかし、同じエラーが表示されて解決せず…

### `react-native-gesture-handler`、`react-native-reanimated`、`react-native-screens`をインストールする

```
$ yarn add react-native-gesture-handler react-native-reanimated react-native-screens
```
ググったらこれで解決したという人がいたので試してみたが、今度は新たに
`console.error: "RCTView generated view config for validAttributes does not match native, missing: accessibilityValue"`
というエラーが表示されてしまった


## 解決策
1. `$ rm -rf node_modules && yarn install`

2. `$ expo upgrade`

3. `$ yarn add react-native-gesture-handler react-native-reanimated react-native-screens`

4. `$ expo start`

自分の使っているexpoのバージョンは37.0.0だったので、それを38.0.0にアップデートしてから必要なパッケージをインストールしたところ解決した

## 参考
[navigation - Unable to resolve module 'react-native-screen' - Stack Overflow](https://stackoverflow.com/questions/59473715/unable-to-resolve-module-react-native-screen)
#PowerApps AI Builder 領収書プロセッサ(プレビュー)

AI Builder に領収書やレシートを解析してくれる機能が追加されたそうなので、現時点（2020/08/07）で日本語レシートを読み込んでくれるか試してみました。

# 公式情報
毎度、検索するのもテマなのでメモしておきます。（主に自分用）
### BLOG
[Process receipts with AI Builder](https://powerapps.microsoft.com/en-us/blog/process-receipts-with-ai-builder/)
### Docs
[Receipt processing model (preview)](https://docs.microsoft.com/ja-jp/ai-builder/prebuilt-receipt-processing)
※記事投稿時点では英語のみ

各種、取得可能な項目情報が記載されています。ただし、プレビュー機能なので一般提供される際に大幅な変更が発生する可能性がある点ご理解のうえでお試しください、ですね。

### プレビュー機能の利用料金
[プレビュー機能と試用版のライセンス](https://docs.microsoft.com/ja-jp/ai-builder/administer-licensing#preview-features)

上記リンクより該当箇所の抜粋（記事投稿時点）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/66db8b67-9cce-d5e1-c9c5-604577fc1993.png)
AI Builder の試用ライセンスを追加しなくても、プレビュー機能は無償で利用可能とのこと。大変ありがたいことですね！

# コントロールを追加してみた
コントロールを追加する際は [AI Builder] → [領収書プロセッサ(プレビュー)]をクリックです。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/720d4fd1-8063-5d0e-ff92-58031a2e9bd0.png)
MR系コントロールとは異なり、PCブラウザー上でも利用可能です。なお、PCブラウザーで実行した場合は、保存済みの画像をアップロードする動作となります。スマホの場合は後述します。

# 実際に日本語レシートで試してみた
iPhone で読み込んでみた例。画面上のコントロールで AI が認識できた箇所は青色の枠で囲まれます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> Process Receipts （領収書プロセッサ≒レシートとか読んでくれるヤツ）を iPhone で試してみた。<br>やはり、日本語はまだまだぽいですね。 <a href="https://t.co/mTg5uytkQd">pic.twitter.com/mTg5uytkQd</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1291314093756805120?ref_src=twsrc%5Etfw">August 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
はい、全然認識してくれませんでした・・・。他にも、色々試してみたのですが、半角英数の箇所は何とかなるかな？ぐらい、が感想です。

# まとめ
結論「まだまだ日本語レシートは厳しそう」でした。

お小遣い帳みたいなアプリを Power Apps で作成されている方、何名か存じております。そんな方々に「レシートからの転記する手間を軽減する案が提供された！」と思ったんですがね・・・。まぁ、うん、プレビュー段階ですから。マルチバイト文字に対応するのを待ちましょう。

なお、約1年前にプレビュー段階だった「名刺リーダー」機能。当時は日本語未対応にもかかわらずソコソコの認識率だったんですよね。その際の検証結果は下記の記事にて確認いただけます。

[【PowerApps Tip's】BusinessCardReader（名刺リーダー）個人的メモ](https://qiita.com/yamad365/items/a4807cc32e7916afacaa)

「名刺リーダーは日本語未対応でもソコソコ良い感じだったから、レシートもいけるんじゃね？」って思ったんですが・・・ってコトでした。

それでは、皆さま。素晴らしい Power Platform Life を！
VSCodeで編集中のエディターを大きくする

## はじめに

VSCode でエディターを分割してる時、外部ディスプレイではそこまで気にならなくてもその接続を切ってノートPCのディスプレイサイズになった時に分割されたエディターが小さすぎて作業しにくいと感じたことありますよね？僕はあります。

![スクリーンショット 2020-08-07 18.22.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/76dbc336-37c8-b779-6d91-8cbf0fe37575.png)
作業しやすい（24インチの外部ディスプレイ）↑
作業しにくい（13インチのmac）↓
<img width="1277" alt="スクリーンショット 2020-08-07 18.25.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33557/98aabbe4-196e-0eef-9469-bcb5d1d74206.png">

画面が小さくなる分、情報量が減っちゃうんですよね。かと言って今開いてるタブ消すのは面倒だし文字サイズを一時的に小さくするのも（自分が視力が良くないので）違うなーと感じていました。
一時的に今開いてるエディターを大きくするソリューションは無いものかと探していたところ、ありました。

## Toggle Maximize Editor

https://marketplace.visualstudio.com/items?itemName=cbuelter.vscode-toggle-max-editor

使い方はインストールして、 Cmd + Shift + p でコマンドパレットを開いて「Toggle maximized editor」と入力してる途中でサジェストされるので押したら大きくなります。下のキャプチャのとおりですね。かんたんです。

[![Image from Gyazo](https://i.gyazo.com/52543c46cc7facbc218581d9b72faa38.gif)](https://gyazo.com/52543c46cc7facbc218581d9b72faa38)

## おわりに

まさに欲しい物がピンポイントで見つかったので良かったです。同じ悩みを抱えてる人いれば使ってみてください〜。
Nuxt v2.13 以降の generate で不要なファイルが出力される

これまで Nuxt.js では静的リンクは自動でルーティングされ、それに応じた静的ファイルを出力することができました。
v2.13 以降は、リンクをクロールすることで動的リンクをファイルとして出力することができるようになりました。

一方で、例えば特定のディレクトリ以下に新たなウェブサイトなどを作成した場合、
ルート相対パスで他ディレクトにある既存サイトへのリンクを張ることがあるとおもいます。
こういったリンクもクロールされ「存在しないページ」としてエラーと共に不要なファイルが出力されてしまいます。

## どうしたらいいか

デフォルトでこの機能が有効になっているので無効にする必要があります。

```nuxt.config.js
export default {
  generate: {
      crawler: false
    }
  }
}
```

これでクロールされなくなったので v2.12 以前と同様の出力結果になりました。

もう一つ方法があります。  
リンク先が限定される場合は exclude に指定することで、  
crawler を使用したい場合でも、不要な出力を止めることができます。

```nuxt.config.js
export default {
  generate: {
    exclude: [
      /^\/fuga\/.+/
    ]
  }
}
```


## 公式ドキュメント

### crawler
https://ja.nuxtjs.org/guides/configuration-glossary/configuration-generate/#crawler

## exclude 
https://ja.nuxtjs.org/guides/configuration-glossary/configuration-generate/#exclude
とにかく最速でSerial通信のログをファイルに残す

とにかく今すぐに、USBでつないだ機器からのSerial通信のログを残したい。
そんなときに使えます。

環境はMac想定です。

# やること
言語はPythonを使用します。
pySerialも使うので、``` $pip install pyserial ```でインストールしておきましょう。

ソースは以下

```Python:logger.py
import serial

com = serial.Serial('/dev/....')

while True:
    line = com.readline().strip().decode('utf-8')
    print(line)
    f = open('data.txt', 'a+')
    f.writelines(line)
    f.close()

com.close()
```

※COMポートは各自確認してください。


# COMポートがわからない時
Macであれば、以下のコマンドで一覧を確認できます。

```
$ ls -l /dev/tty.usb*
```
※参考:https://qiita.com/k-yamada-github/items/c12bafc64f9868f8c85c

---

ここまでご覧いただきありがとうございました！
改善点、不明点等あればコメントいただけますと幸いです。
HerokuでLINEオウム返しbot　ハマった時のチェックポイント

散々こすられてるネタではありますが、**ネット上の古い情報に惑わされてオウム返しbotで半日つぶれた**ので、~~恨み~~ 反省を込めてメモしておきます。

# 環境
* Mac OS Catalina 10.15.5
* Python 3.7.7
* Heroku

# アカウント作成〜Herokuへデプロイ
まず、以下の工程を行いました。

* LINE Developersアカウントの作成
* botアプリの実装（Python）
* Herokuのセットアップ、デプロイ

具体的な手順やコード等に関しては、「LINE bot Python」などで検索すると出てくるqiitaの記事やブログ記事などを参考にしました。
参考にした中では以下のブログ記事がわかりやすくまとまっていましたので、ここでは詳しい手順の紹介は割愛します。

[LINE Messaging API + Python + Heroku でLINE Botを作る](https://cppx.hatenablog.com/entry/2017/10/31/165128)

が、後述するとおり、**最新の仕様では「Fixie」の設定が不要**ですので、注意してください。
（このブログ記事に限らず、検索で上位に来る記事では未だにFixieの設定が必須のように書いているものが散見される印象です。。。）

……さて、このとおり実装してbotに話しかけてみたものの、オウム返ししてくれません。

# チェックポイント１：WebhookのVerifyボタンで出る500エラー対策
LINE Developers管理画面でWebhookURLのVerifyボタンを押して確認したところ、"The webhook returned an HTTP status code other than 200" というエラー表示が出てきました。

<img width="814" alt="verify.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560222/f2df3fb3-e4fc-5fb7-ef1e-9ee3a2cd7bc4.png">
`heroku logs -t`でログを確認。main.py（botアプリ）は動いており、500エラーが返ってきているようでした。これはVerifyボタンで送られるreplyTokenを有効なreplyTokenではないと判断しているようです。参考記事は以下。

[LINE DevelopersのWebhook URLの接続確認でエラーが出る件について](https://qiita.com/q_masa/items/c9db3e8396fb62cc64ed)

この記事を参考にコードを追記したところ、Verifyボタンからのリクエストは通るようになりました。

# チェックポイント２：Use Webhookをオンにしよう
しかし、スマホで「あ」とか「テスト」とか送っても一向にログが動きません。
……いや凡ミスすぎない？という感じなんですが、Use Webhookがオフになっていました。
オンにしたところ、リクエストは送られるようになりました。

<img width="826" alt="usewebhook.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560222/71c30157-9476-afad-7c57-158e0e45f040.png">


# チェックポイント３：最新の仕様ではIPアドレスの指定は不要
しかし、このIPアドレスでは接続できないよ！というエラーが出てしまいます。詳しくは後述の「補足」で書きますが、Fixieの設定に失敗していたため、エラーが起きていました。

HerokuでLINEbotを作るときには何はともあれFixieを設定！と書いてある記事が山のように出てきますが、以下の公式FAQにもあるように、**最新の仕様ではIPアドレスの指定は不要です。なので、そもそもFixieを使う必要はありません。**

[LINE BOT & Beacon 開発者向けFAQ（随時更新）](https://engineering.linecorp.com/ja/blog/line-bot-beacon-developer-faqs/#4_1)

>Server IP Whitelist は登録しないといけないの？

>登録する必要はありません。

>制限をかけたい場合は、登録すれば良いです。

逆に指定するとそのIPだけしかアクセスできなくなりますので、エラーが出ている場合には、間違ったIPアドレスがこのリストに入っていないか確認しましょう。

<img width="696" alt="IP.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560222/edb3a88c-4e22-e67e-f692-bde05e98ee36.png">


## チェックポイント３について補足
FixieのアウトバウンドIPをリストに入れていても、そこから正しく接続できていれば当然問題ないです。
私の場合、Fixieの設定をしたにも関わらず、固定IPからリクエストを送信できておらず、エラーログを見ると
 
```
"message": "Access to this API denied due to the following reason: Your ip address [*.**.***.***] is not allowed to access this API. Please add your IP to the IP whitelist in the developer center."
```

のエラーが出ていました（[*.**.***.***]部分はアプリを再起動するたびに変わってしまう）。
おそらく、botのアプリ本体のコードにプロキシを使うための記述を入れていなかったためかと思います。

以下、PHPの場合ですが参考記事です。Pythonでも恐らくこれに相当する記述の仕方があるのだと思いますが、今回は深入りしません。。。

[【50：LINE BOT API】PHP+HerokuでオウムBOT](http://onesway.hatenablog.com/entry/line_bot)

>PHP側でproxyを経由するという記述が抜けていました。
>Fixieで作られたproxyのURLをcurl_setoptで設定したら正常に動作しました。


# 余談
デフォルトで出てくる「メッセージありがとうございます！申し訳ありませんが、このアカウントでは個別のお問い合わせを受け付けておりません。次の配信までお待ちください」メッセージは、LINE Official Account Manager の応答設定＞詳細設定＞応答メッセージ で適宜オフにするなりしておく必要がある（最初エラーのせいで出てきてるのかと思ってた。。。）。
GitHubで.DS_Storeのせいでマージできない人に送る解決法

# はじめに

mac osを使ってチーム開発をしています。
備忘録も兼ねております。
初心者のため、間違い等あれば教えていただけますと幸いです。

# マージできない

コードレビューでLGTMをもらい、さあ初めてのマージをするぞ！
と思ったら`merge pull request`が押せない…
`app/.DS_Store`という記述が出ているけどそんなファイルどこにもない…

# 解決法

カレントディレクトリで以下の作業をする

1.ファイルを検索

```
$ find ./ \( -name ".DS_Store" -or -name "._*" \)
```

2.ファイルを削除

```
$ find ./ \( -name ".DS_Store" -or -name "._*" \) | xargs rm -rf
```

3.`.gitignore`に記述を追加

```
.DS_Store
```

これで`merge pull request`が押せるようになるのと、
`.DS_Store`がgitの管理下に入らなくなります。
【ECS】ALBを通してnginx+php-fpm環境をECSで動かす

# ゴール
下記で作成したコンテナへのアクセスにALBを使う。phpinfoが見られればOK
https://qiita.com/chanP_yamazaki/items/f4829a2905582a78223a

# ALBとターゲットグループを作成する

|手順| 名称       | 設定値 |
|:-------|:----------|:-------|
|ロードバランサーの設定| 名前       | ecs-cluster-alb |
|| アベイラビリティーゾーン       | aとc両方にチェック |
|セキュリティグループの設定|セキュリティグループの割当|ポート80許可したものを設定 or 作成|
|ルーティングの設定|ターゲットグループ|HTTP、ポート80のターゲットグループを作成or割当|


# ECSのタスクを定義する
※記載がないパラメータは変更しないものとする

・タスク名をつける
　後から変えられないので注意
・コンテナの追加
　これがまさにdocker-compose.ymlに相当している

　▼ nginx

| 名称       | 設定値 |
|:----------|:-------|
| コンテナ名       | nginx |
| イメージ       | ECRにプッシュしたnginxコンテナの「イメージのURI」をコピーして貼り付け |
| メモリ制限       | 必要な分だけ設定。全コンテナの合計値がインスタンスのメモリサイズを超えないように注意 |
| ポートマッピング       | 設定なし:80に設定する |
| スタートアップ依存順序       | depends_on設定。コンテナ名「php-fpm」、状態「START」を設定 |
| ネットワーク設定       | リンクに「php-fpm:php-fpm」を設定 |
| ストレージとログ       | ログ設定の「Auto-configure CloudWatch Logs」をONに (立ち上げに失敗した際にログを追えるようになる |
　他は最小構成では設定不要

　▼ php-fpm

| 名称       | 設定値 |
|:----------|:-------|
| コンテナ名       | php-fpm |
| イメージ       | ECRにプッシュしたphp-fpmコンテナの「イメージのURI」をコピーして貼り付け |
| メモリ制限       | 必要な分だけ設定。全コンテナの合計値がインスタンスのメモリサイズを超えないように注意 |
| ポートマッピング       | php-fpmは外に開ける必要無いので設定不要 |
| ストレージとログ       | ログ設定の「Auto-configure CloudWatch Logs」をONに (立ち上げに失敗した際にログを追えるようになる |
　他は最小構成では設定不要

・他は設定せず作成


# ECSクラスターを作成する
・Amazon Container Service -> Amazon ECS -> クラスター へ
・クラスターの作成

| ステップ      | 名称       | 設定値 |
|:----------|:-------|:----------|
|クラスターテンプレートの選択| クラスターテンプレートの選択       | EC2 Linux + ネットワーキング |
|クラスターの設定| クラスター名       | test-cluster |
||インスタンスの設定各種|インスタンスタイプや数は必要に応じて|
||AmiId|特に理由がなければ今は 「AmazonLinux2」|
||キーペア| コンテナの思想上、インスタンスに入って何かを操作する必要はないので 「なし」　 |
||ネットワーキング各種| vpc、サブネットは必要に応じた設定を |
||ネットワーキング - セキュリティグループ| ポートは0-65535まで開ける。IPは必要なものを |
||Auto assign public IP| Disabled |


・作成実行
　実行したクラスターの「ECSインスタンス」タブで、指定した個数のインスタンスが立ち上がり、ステータスがACTIVEになったことを確認


# コンテナを立ち上げる
・サービスタブを開いて「作成」

| ステップ      | 名称       | 設定値 |
|:----------|:-------|:----------|
|サービスの設定| 起動タイプ| EC2 |
|| タスク定義 ファミリー | 先ほど「タスク定義」で作ったタスクを指定 |
|| タスク定義 リビジョン | latest(最新バージョン)を指定 |
|| クラスター       | test-cluster |
|| サービス名       | 適当に |
||サービスタイプ|REPLICA (DAEMONだとどう変わるか後で調査|
||タスク数|1|
|ネットワーク構成|ロードバランサーの種類| ALBを指定 |
|ネットワーク構成|ロードバランサー名| 先ほど作成したもの |
|ネットワーク構成|ロードバランス用のコンテナ| nginx:0:80 を追加 |
|ネットワーク構成|プロダクションリスナーポート| 80:HTTP |
|Auto Scalingオプション|| EC2インスタンスの数をAutoScalingさせたいならここで設定。今回は何も設定せず次へ |

・サービスの作成
・作成したサービスのタスクタブにRUNNINGのタスクが出来あがれば成功
・ELBのpublicIPかDNS名にアクセスしてphpinfoが確認できればOK！
FlutterでWidgetのピクセルサイズを取得する

FlutterでWidgetのピクセル数を取得したい。
メモとして残しておきます。

この記事では、ビルド中ではなく、ビルドが完了した後にサイズを取得する方法です。
ビルド中には取得できませんのでご了承ください。

用途としては、GoogleMapを使ったときGoogleMapウィジェットの中心を取りたいときとか・・・。

## 方法

`key`を使って対象のWidgetのBuildContextを取得
　　↓
BuildContextからsizeを取得
　　↓
デバイスのピクセルレシオを取得して実際のピクセル数を取得


```
import 'package:flutter/material.dart';

class SampleWidget extends StatefulWidget {
  @override
  _SampleState createState() => _SampleState();
}

class _SampleState extends State<SampleWidget> {
  final GlobalKey _targetKey = GlobalKey();

  Size _widgetSize;
  Size _widgetPixelSize;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Get Size')),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Center(
            child: Container(
              key: _targetKey,
              height: 200,
              width: 300,
              color: Colors.grey,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('Widget size: $_widgetSize'),
                  Text('Widget size: $_widgetPixelSize'),
                ],
              ),
            ),
          ),
          RaisedButton(child: const Text('Get size'), onPressed: _onPressed),
        ],
      ),
    );
  }

  Future<void> _onPressed() async {
    // Widgetのサイズ（論理サイズ）
    final size = _targetKey.currentContext.size;
    print('Widget size: height: ${size.height}, width: ${size.width}');

    final mediaQueryData = MediaQuery.of(context);

    // 実ピクセルに変換
    final height = size.height * mediaQueryData.devicePixelRatio;
    final width = size.width * mediaQueryData.devicePixelRatio;
    setState(() {
      _widgetPixelSize = Size(width, height);
      _widgetSize = size;
    });
  }
}
```
## スクリーンショット
### iPhone XR (1792 x 828)
<img width="414" alt="IMG_46031A3B0A7D-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16090/fd8e5b53-ce1f-5ed2-63ea-c42e13ba450d.jpeg">


### Android (2340 x 1080)
<img width="414" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16090/dcd573c9-17ad-15f0-347f-4b0bcb101d96.jpeg">


## その他
ビルド中（build関数の中）では、上記の方法は使えませんので、別の方法を使いましょう。

LayoutBuilder
https://www.youtube.com/watch?v=IYDVcriKjsw

Expanded
https://www.youtube.com/watch?v=_rnZaagadyo
RustでAWS-SESでメールを送信する

# 目的
RustでAWSのSESでメールを送信したいです。

# コード
```rust:Cargo.toml
[package]
name = "sample_ses"
version = "0.1.0"
edition = "2018"

[dependencies]
rusoto_core = "^0.45"
rusoto_sesv2 = "^0.45"
tokio = { version = "^0.2", features = ["macros"] }
```

```rust:main.rs
use rusoto_core::{credential::StaticProvider, request::HttpClient, Region};
use rusoto_sesv2::{
    SesV2Client,
    SendEmailRequest,
    EmailContent,
    Message,
    Body,
    Content,
    Destination,
};
use rusoto_sesv2::SesV2;

static AWS_TOKEN: &str = "xxx";
static AWS_SECRET: &str = "xxx";

#[tokio::main]
async fn main() {
    let provider = StaticProvider::new(AWS_TOKEN.to_string(), AWS_SECRET.to_string(), None, None);
    let client = SesV2Client::new_with(
        HttpClient::new().unwrap(),
        provider,
        Region::UsEast1,
    );
    let request = SendEmailRequest {
        content: EmailContent{
            simple: Some(Message{
                body: Body {
                    text: Some(Content{
                        charset: Some("UTF-8".to_owned()),
                        data: "予定表～①💖ﾊﾝｶｸだ".to_owned(),
                    }),
                    ..Default::default()
                },
                subject: Content{
                    charset: Some("UTF-8".to_owned()),
                    data: "サブジェクト予定表～①💖ﾊﾝｶｸだ".to_owned(),
                }
            }),
            ..Default::default()
        },
        destination: Destination{
            to_addresses: Some(vec!["me@example.com".to_owned()]),
            ..Default::default()
        },
        from_email_address: Some("noreply@example.jp".to_owned()),
        ..Default::default()
    };
    let response = client.send_email(request).await;
    println!("{:?}", response);
}
```
基本回路を組み合わせた論理回路、半加算器と全加算器

#基本回路を組み合わせた論理回路
　基本回路を組み合わせた論理回路は以下の3種類の通りになります。
　　　・否定論理積回路(NAND回路)
　　　・否定論理和回路(NOR回路)
　　　・排他的論理和回路(EOR回路またはXOR回路）

**否定論理積回路(NAND回路)**
　論理積(AND)と否定(NOT)を組み合わせた論理回路
　論理積(AND)の結果を反転させたものが出力となるため、入力がどちらも「1」だった時は「0」が出力されて、
　それ以外の時は「1」を出力します。
　　
![図15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/50befbb1-961a-d8bb-587a-6ef559c199c0.png)


否定論理積回路の論理式は以下の通りになります。

![図16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/ddcda25d-eac2-8fad-b920-9130a53e3269.png)


また、真理値表は以下の通りになります。

![図17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/63508672-6ffa-ecb4-cd5b-cb4d0ec74e0a.png)

**否定論理和回路**
　論理和(OR)と否定(NOT)を組み合わせた論理回路
　論理和（OR)の結果を反転させたものが出力となるため、いずれかの入力が「1」だった時は
　「0」が出力され、入力がどちらも「0」の時に「1」となります。
![図18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/ac951bf6-5b67-6ae1-c639-9b9bcf4a0a16.png)

否定論理和回路の論理式は以下の通りになります。
![図19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/2a86b085-8886-3706-87ba-49d8950a51f8.png)

真理値表は以下の通りになります。

![図20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/2a890a67-622c-9904-3562-aaa8e74d86e9.png)

**排他的論理和回路(EOR回路またはXOR回路)**
　排他的論理和回路とは、どっちかだけが「1」の場合「1」が出力する。

![図21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/bcca9658-7a69-d96d-322c-b9701fb022e1.png)

排他的論理和回路の論理式は以下の通りになります。
![図22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/9f1e0841-4b93-9366-94c6-c4718fded15e.png)

真理値表は以下の通りです。
![図23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/f448ff50-2f88-8eed-ce2e-df083ff55860.png)

#半加算器と全加算器
　加算器<font color="#cc0000">(2進数の足し算)</font>には、下位からの桁上がりを考慮しない半加算器とそれも考慮する全加算器がある。
　
**半加算器**
 コンピュータで2進数の加算をする場合はまずは半加算器という論理回路<font color="#cc0000">(論理積回路と排他的論理和回路を組み合わせた。)</font>を使用します。以下の回路図が半加算器です。
![図24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/544c3575-823b-c508-8d43-fa759e551a0f.png)


出力C、出力Sの真理値表は以下の通りになります。
![図25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/4002fd8a-c6dd-bc7f-240c-4b87fc91cbc1.png)![図26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/6b246495-5f11-9b79-f9d9-6c3578755f4c.png)

**全加算器**
 半加算器だけでは，一桁と一桁の加算しかできません。そのため複数桁と複数桁の加算をするためには全加算器<font color="#cc0000">(半加算器と論理和回路を組み合わせた)</font>を使用します。以下の回路図が全加算器です。
![図27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/b09c480f-c25c-d6e7-ffa2-488eb1fed56c.png)


#以上