OmniAICreator/Qiita-1.07M huggingface dataset:
iOSのサンプルアプリにFirebaseを入れる

#About
**「とりあえずやってみる」** をやってみようのコーナー
シングルビューのシンプルなアプリにFirebaseを導入し、計測できる状態にする


#環境

Mac OS Catalina 10.15.6
Xcode Version 11.6


#手順

##Xcodeをインストール
App Storeから
https://apps.apple.com/jp/app/xcode/id497799835?mt=12

##Firebaseに登録
https://firebase.google.com/?hl=ja

##テストアプリを作成
今回は、「Single View App」を作る

Xcode起動画面から **「Create a new Xcode project」** を選択

表示される一覧から **「Single View App」** を選択

入力項目は下記参照
https://pippi-pro.com/xcode-project-information

| 項目 | 内容 |
|:-:|:-:|
| Product Name | 任意の名前を入力 |
| Team | 個人の場合はApple IDを指定 |
| Organization Name | 自動入力 |
| Organization Identifier | com."companyname" 形式で |
| その他 | 自動でOK |

作成する場所を指定して終了


##Firebaseを導入
Firebaseの管理画面から、「アプリを追加』 ＞ 「iOS アプリに Firebase を追加」

###①アプリの登録###
入力項目

| 項目 | 内容 |
|:-:|:-:|
| iOS バンドル ID | Xcodeの「Organization Identifier」同様に |
| その他 | 任意 |

###②設定ファイルのダウンロード###
ダウンロードして指定位置に挿入
（FinderでもXcode上でもどちらでも良い）

###③Firebase SDK の追加###
ここでうまくいかなかったので下記参照
http://developers.goalist.co.jp/entry/2017/04/20/180931
**（podのインストール前に）一旦Xcodeを閉じる**
以下、ターミナルでの作業

####CocoaPodsをインストール
上記記事通りに

####アプリのディレクトリに移動し、Podfileを作成
Podfileの修正内容はFirebaseの画面を参照

###④初期化コードの追加
メインの AppDelegate クラスの修正は、引き続きターミナルで行うか、Xcodeに復帰してもいい
Xcodeの場合は、
> podsを使う際は「.xcodeproj」ではなく「.xcworkspace」から開いて開発

###⑤アプリを実行してインストールを確認
Xcodeは「Command+R」で実行


#うまくいかない時

・Podfile修正後の「pod install」「pod update」忘れてないか
・Podfileに
　 ```pod 'Firebase/Analytics'```
　以外のもの（'Firebase/Core'とか）を入れなくてもなんとかなった
C言語の配列境界チェックマクロ

# はじめに
大学の授業でC言語を使う必要があるのですが、配列の境界チェックがないことが非常に辛かったため、マクロを書きました。

全ての<code>[]</code>演算子や単項<code>*</code>演算子についてチェックしておくと、範囲外アクセスを気にしなくてよくなるためストレスが減りました。

プログラミング初心者ですので、何か誤りや改善点等ございましたらご指摘いただけると幸いです。

# コード

## 一次元配列用
```c
//#define NDEBUG
#include <assert.h>
/*
    使用例:
    RANGE_CHECK_1D(a, 5);
    a[5];
*/
#define RANGE_CHECK_1D(array, i)                                               \
    do {                                                                       \
        assert(0 <= (i));                                                      \
        assert((long unsigned int)(i) < (sizeof(array) / sizeof(*array)));                        \
    } while(0)
```

## 二次元配列用
```c
//#define NDEBUG
#include <assert.h>
/*
    使用例:
    RANGE_CHECK_2D(a, 3, 4);
    a[3][4];
*/
#define RANGE_CHECK_2D(array, i, j)                                            \
    do {                                                                       \
        assert(0 <= (i));                                                      \
        assert((long unsigned int)(i) < (sizeof(array) / sizeof(*array)));                        \
        assert(0 <= (j));                                                      \
        assert((long unsigned int)(j) < (sizeof(*array) / sizeof(**array)));                      \
    } while(0)
```
## ポインタ用
関数の引数などで配列を渡すとsizeof()によって配列のサイズを調べられなくなるため、ポインタ用も用意しました。最大インデックスは人力入力です。これを使って新しいマクロを定義して使うこともできます。

```c
//#define NDEBUG
#include <assert.h>
#define RANGE_CHECK_1D_P(n, i)                                                 \
    do {                                                                       \
        assert(0 <= (i));                                                      \
        assert((i) < (n));                                                     \
    } while(0)
```
# 使用例
<code>[]</code>演算子や単項<code>*</code>演算子などでアクセスする直前に置いて使います。
デバッグ後も削除しない場合<code>#define NDEBUG</code>と書かないと速度が低下してしまうため注意してください。


```c
#include <stdio.h>
int main(void) {
    int a[10] = {}, b[3][5] = {}, i, j;
    for(i = 0; i < 10; i++) {
        RANGE_CHECK_1D(a, i);
        printf("%d\n", a[i]);
    }
    for(i = 0; i < 3; i++) {
        for(j = 0; j < 6; j++) {
            RANGE_CHECK_2D(b, i, j);
            printf("%d\n", b[i][j]);
        }
    }
}
```

# 参考サイト
https://www.jpcert.or.jp/sc-rules/c-pre10-c.html
https://qiita.com/SaitoAtsushi/items/ee17466c464fb7a270d2

# 編集履歴
2020/07/27
@fujitanozomu さんよりご指摘をいただき、インデックス最大値との比較時にキャストを追加しました
AWS Honeycodeで役に立ちそうなTips

いつも忘れないように、コンセプトから。

###コンセプト
・お金かけてまでやりたくないのでほぼ無料でAWSを勉強する
　→ちょっとしたサービスを起動すると結構高額になりやすい。
・高いレベルのセキュリティ確保を目指す
　→アカウントを不正に使われるととんでもない額を請求されるので防ぐ

今回はAWSのHoneycodeをもうちょっと勉強してみました。何かを作るというよりは、コミュニティサイトを眺めて学習する感じです。自分の疑問を解決する記事を探してみました。
　
　
　

#####スプレッドシートにデータを入れるけど、Excelみたいな関数は何が使えるの？

ちょっと古い記事なのでもっと増えているかもしれませんが、ある程度まとまってました。これなら英語が苦手でも感覚的にわかりそうです。
https://honeycodecommunity.aws/t/honeycode-functions/90

#####複数のTablesを組み合わせるのはどうするの？

SQLでいう結合というかリレーションに関する疑問です。ここは以下の「Tasks-to-Project」の部分を見るとわかりやすいです。Formatsを選んでからRowlinkを選択していますね。こうやって他のTablesと関連付けています。
https://honeycodecommunity.aws/t/data-modeling-101/87

#####Automationsでできることって何？

概要としては
- Add, edit, and delete data in tables（Tablesへの挿入・変更・削除）
- Send notifications and reminders（通知の送信）
- Change screens and navigate users through your app（画面遷移とナビゲート）
- Set variables in current or target screens（変数のセット）
のようです。

大きく、Workbook Automationsと、Builder Automationsに分かれていて、それぞれでできることが違います。スプレッドシートでできることと、アプリ（画面）でできることのイメージに近いので、できることが違って当然という気もします。簡単な比較表もリンクにあるのでわかりやすいです。
https://honeycodecommunity.aws/t/automations-overview/96

#####AWSアカウントに接続するには？

Teamsのタブからセットしますが、リンク先のスクリーンショットを見たほうが早いです。
https://honeycodecommunity.aws/t/connecting-honeycode-to-an-aws-account/98

#####学習メニューはある？

現状リンク先の３つみたいです。英語なんで読めないとちょっと辛いかも。動画や簡単なテストもあります。
https://honeycodecommunity.aws/c/Courses/17

#####モバイルでカメラアクセスできないの？

現状ではできないみたいですね。でもニーズはありそうなので前向きに検討されそうです。確かにメンバー限定アプリで写真の情報をシェアできると面白そうです。
https://honeycodecommunity.aws/t/access-camera-on-mobile/1827/4

#####消してしまったアプリ（Workbook）を復元するには？

現状ではできないみたいですね。さすがに正式版にはリリースされる機能でしょうね。単にアプリのバックアップというだけじゃなくて、Gitとかのバージョン管理も出ると思いますがそこは今後に期待ですね。
https://honeycodecommunity.aws/t/how-do-i-recover-my-deleted-app/5212

#####アプリをパブリック公開できますか？

自分で調べろよって言っている人もいますが、、、
https://honeycodecommunity.aws/t/create-a-public-site/1387
現状では以下の方法でシェアすることになりそうです。App Userで使う人を登録する感じですね。
https://honeycodecommunity.aws/t/sharing-workbooks-apps/911
いろいろ意見交換されているので、ここも早々に実装・改善されてくるでしょうね。Googleのフォームみたいになると便利ですね。

#####HoneyCodeでS3アクセスするにはどうすればいいですか？

API経由でのアクセスになります。Read、Writeの方法が書いてあります。以下の引用の部分、詳しくはリンク先のドキュメントを見たほうがいいですね。
https://honeycodecommunity.aws/t/aws-platform-integration/5082

>-- How much integration is there to the AWS services ?
>Today Honeycode offers an API to read and write data. This gives you the ability
>to integrate with external services.
>
>-- What is the best documentation to follow ?
>For APIs, the same link as previous response. Getting Started with Honeycode 
>APIs . For general getting started Honeycode docs, 
https://honeycodecommunity.aws/c/get-started/9 .


今日はここまで。またいい感じのものを見つけて蓄積していこうと思います。
TCP/IPネットワークにおけるARP、NTP

応用情報技術者令和元年秋期 午前問33


TCP/IPネットワークにおけるARPの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/35b3d8dd-ba20-2412-efca-7d5081700026.png)



**ARP**(Address Resolution Protocol)は、IPアドレスから対応する機器のMACアドレスを取得するプロトコルです。

**NTP**（Network TIme Protocol）は、ネットワークを通じて、それぞれの機器が持つ時計を正しい時刻に合わせるためのプロトコルです。

**DHCP**
Dynamic Host Configuration Protocolの略。TCP/IPネットワークで、ネットワークに接続するノードへのIPアドレスの割り当てをアドレスプールから自動的に行うプロトコルです。

**ICMP**
Internet Control Message Protocolの略。インターネットプロトコル(IP)の通信制御を補完するプロトコルで、データ配送中のエラー通知や送達エラーを通知する機能を持っています。

**NAT**
Network Address Translationの略。プライベートIPアドレスとグローバルIPアドレスを1対1で相互に変換する技術です。

**DNS**(Domain Name System)の逆引きの説明
IPアドレスからホスト名(ドメイン名)を得るためのプロトコル


**RARP**(Reverse Address Resolution Protocol)の説明
MACアドレスからIPアドレスを得るためのプロトコル


**DNS**の正引きの説明
ホスト名(ドメイン名)からIPアドレスを得るためのプロトコル


１、ARP(Address Resolution Protocol)は、
IPアドレスから対応する機器のMACアドレスを取得するプロトコルです。

　・要求パケットに送信元のIPアドレス・MACアドレスと通信相手の IPアドレスの情報を格納して、Ethernet ネットワークにブロードキャストする。
　・要求パケットを受け取った各ノードは、自分の IPアドレスと同一であれば、自分の MACアドレスを送信元に伝える。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
補足

TCP/IPネットワークで使用されるNTP(Network Time Protocol)の役割として，適切なものはどれか。

ア、動画や音声をリアルタイムに配信する。
イ、ネットワークに接続されている機器間で時刻を同期させる。
ウ、ファイルがある時刻以前に存在していたことを保証する証明書を発行する。
エ、無線LANにおいて，一定時間経過後に暗号鍵を自動的に変更する。

１、NTP（Network TIme Protocol）は、
ネットワークを通じて、それぞれの機器が持つ時計を正しい時刻に合わせるためのプロトコルです。

２、
・動画や音声をリアルタイムに配信する。
⇒×。RTP(Realーtime Transport Protocol)の説明です。

・ファイルがある時刻以前に存在していたことを保証する証明書を発行する。
⇒×。タイムスタンプ局の説明です。

・無線LANにおいて，一定時間経過後に暗号鍵を自動的に変更する。
⇒×。TKIP(Temporal Key Integrity Protocol：ティーキップ)の説明です。

参照：

https://www.ap-siken.com/kakomon/24_haru/q33.html

https://www.itpassportsiken.com/kakomon/23_toku/q85.html
初心者のためのpandas基礎③欠損値処理

#pandasとは
Pythonにて、構造化データ（テーブル型のデータ）を扱うためのライブラリです。ファイルの読み込みやその後の加工・抽出処理などを簡単に行うことができ（SQL的な感覚で行うことができ）、機械学習などのデータの前処理で必須となるライブラリです。
他項目への目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/e1d7d0e939f58e7301ea)になります。

#ライブラリインポート
pandasに`pd`という名前をつけて`import`します。

```python:
import pandas as pd
```

# 欠損値確認
欠損値を処理する前にデータに含まれる欠損値を確認する方法です。以後のコードは、データフレームは変数`dataframe`として定義していることを前提とします。

```python:
dataframe.isnull().sum()
```

# 行操作
## 欠損値を1つでも含む行を削除する

```python:
dataframe.dropna(inplace = True)
```
dropが非破壊関数のため、`inplace=True`としないと、元のデータフレームの書き換えが行われません。
代入をつかう場合は、下記のような書き方でもOKです。（以後のサンプルコードも同様です）

```python:
dataframe = dataframe.dropna()
```

## すべてが欠損値の行を削除する
```python:
dataframe = dataframe.dropna(how = 'all')
```

## 特定の列が欠損値の行を削除する
例として｢column1｣が欠損値の行を削除します。

```python:
dataframe = dataframe.dropna(subset = ['column1'])
```

`all`との組合せも可能です。例として｢column1｣と｢column2｣が共に欠損値の行を削除します。

```python:
dataframe = dataframe.dropna(subset = ['column1','column1'], how = 'all')
```

#列操作
列の場合は基本的には行と同じですが、`axix = 1`をしています。`axis='columns'`でも同じ処理となります。
欠損値を1つでも含む列をすべて削除する場合は下記となります。

```python:
dataframe = dataframe.dropna(axix = 1)
```

```python:
dataframe = dataframe.dropna(axis='columns')
```
すべてが欠損値の列を削除する場合は下記となります。

```python:
dataframe = dataframe.dropna(how = 'all',axis='columns')
```

#欠損値を埋める
欠損値に値を埋めたい場合は`fillna()`を使います。

##すべての欠損値に同じ値を埋める
すべての欠損値にゼロを埋める場合は下記となります。

```python:
dataframe = dataframe.fillna(0)
```

##列毎に別の欠損値を埋める。
例として｢column1｣に1を｢column2｣に2を埋めます。

```python:
dataframe = dataframe.fillna({'column1':1,'column2':2})
```

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
AWS; Amazon workbook って何だ？

# AWSはついにOfficeアプリまで浸食しに行くのか、Microsoft Excel や Google Spreadsheet的なやつ。
AWS Honeycode はローコード・ノーコードつまり、プログラミング言語を書かなくてもスマホアプリやWEBアプリを開発できる開発環境のサービス。現在AWSからプレビュー提供中（2020/6月～, 7月現在）。Honeycodeで開発するアプリのデータを保存したり取り出したりするデータベースとしてExcelみたいな Amazon workbook が使える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/bbad8a0b-fd98-fc05-208b-0360227084b1.png)


## ならば Amazon workbook を調べてみよう
何ができるのか？

- **【保存】**オンラインストレージ（Amazon Drive）に作成した「表データ（amazon workbook）」を扱える。アップロードやダウンロードの機能は見つからなかった。
- **【データ追加/削除】**レコードの入出力ができる（データをworkbookに入力、データをworkbookで表示）。
- **【表計算】**表計算としても機能する。表形式で印刷もできる。

## 表計算できるのかな？
Excelと同じ関数 合計Sum や 平均Average 他 が同じ書式で使える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/ff30ea4b-7531-6f9c-2e4a-d02e6bc0cba5.png)

セルの式を、コピー&ペーストで複製できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/82a70318-3b48-ba9e-460f-de87f6ebe82f.png)

日本語データも扱える。セル[A6]とセル[B6]の文字列連結ができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/485d0651-6ffb-2a24-9f23-f4104d57656c.png)

利用できる関数はExcelとほぼ同じ。前方一致検索してくれるので、例えば"cou"..と入力すれば関数の候補一覧が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/3d1b6371-0eaf-4862-9781-c94138551867.png)

関数の書式（使い方）も表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/e4be94a7-8052-84e9-fe3e-528b5571cc78.png)

## workbookのメニュー
### 表示スタイル
データを都度、[追加/削除]するスタイルか、Excelワークシートみたいな表示スタイルか切替ができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/75d6fd96-d257-c3e9-7ba4-aca349c50680.png)


### 印刷
表示スタイルがワークスタイルの場合、［印刷］アイコンが表示される。
（１）印刷プレビューが表示されて、
（２）パソコン標準の印刷ダイアログに連携、プリンターに出力できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/549844ab-bdf2-2429-a8d3-d6caacf549c3.png)

### 文字修飾、セル修飾
表の見た目（文字/セル修飾）は、[Style]アイコンで文字の大きさ、太文字、下線、色などを選べる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/b1cf0fb2-c35b-4178-7e6d-5d8aef763a5c.png)

### ファイル操作
ファイル名の変更：例えば、表データの名前を「表その１」に変更して保存する。
テーブル名の変更：日本語にできなかった。英語なら変更可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/4b0d27c7-582b-7c0f-c614-df3f91edfe81.png)

## まとめ
AWSがOfficeアプリも提供するというよりは、スマホやWEBアプリのデータとしてExcel形式のデータベースとして扱うためのworkbookの様です、今のところ。そしてプログラミング言語を書かなくてもアプリを開発する手法として、最初にWorkbookでデータを作成し、そのデータを基にウイザード形式でアプリを自動作成するのが AWS Honeycode 。
本記事の通り表計算としても機能するので、アプリ側で合計やら平均やらをプログラミングで計算しなくてもアプリに表示できるので、業務でExcel得意なEUC担当者など、サーバーネットワークインフラを知らなくても、アプリ開発の経験がなくても、アプリを作成できる時代が到来したのですね。
css設計入門メモ

# この記事の目的

css設計を考え始めた人が最初のとっかかりに読む記事。

- どういう設計があるのか？
- どう設計方針を選択していくべきなのか？

あたりをまとめる

# cssを書く上での規則

- idをなるべく使わない
- importantも使わない
- html側にはstyleを書かず、styleはcssに寄せる

# css設計方針

## css設計方針においてのポイント

### htmlとcssは疎結合に

htmlとcssを別にしておかないと例えばSEO要件でh2にしないといけないけどpとstyle合わせたいといった時に困る。そのためhtmlの要素をセレクターに指定するのは避けた方が良い。

### 予測しやすくするためにclass名を親と子をわかるものにする

class名は名前から影響範囲が想像できるのが望ましいため、親と子をわかるようにした方が良い。例えば

```css
.header

.btn
```

とあってbtnがheader内のものだとした時には

```css
.header

.header_btn
```

とbtnがheader内のものとわかるようにするのが望ましい。

### シングルクラス設計とマルチクラス設計

シングルクラス設計は一つのクラスですむように個別個別にクラスを設定していくもの。対してマルチクラスは汎用的にクラスを設定し、複数組み合わせる形。シングルクラスの方がhtmlは読みやすくなり、影響範囲も狭いので予期せぬバグなどは出にくいが個別に指定しているので保守性は低い。

# メジャーな設計手法

## OOCSS

- 下記に分けて考える
    - ストラクチャー
    - スキン
- 特定の範囲内での指定ではなくグローバルに指定

OOCSSの考え方はオブジェクティブ思考をcssに持ち込んだもので再利用を前提に考えられている。その際利用するものをストラクチャー、形などを指定するものとスキン、色などの装飾を指定するものに分けている。

再利用を前提に考えているので例えばmainclass内のなどの特定範囲内での指定より全体で使いまわせる指定をこのむ。


## BEM

BEMは下記をclass名に一つ一つつける手法で個別にstyleを書いていくので変更時に影響範囲が小さい。

- Block・・・枠組みとなる要素のこと。セクションやコンテナをBlockとして扱うケースが多いです。
- Element・・・Blockの中に存在する子要素のこと
- Modifier・・・BlockやElementを修飾するもの。activeやlargeのように状態を管理する場合もModifierで指定するようにします


```css
.block__element--modifier{
}
```

みたいに

- blockの後ろの_（アンダースコア）２個
- modifierをつける場合は-（ハイフン）２個をつける

## SMACSS

下記に分けてモジュール的に設計するもの。

- ベース・・・bodyなど全体に関わるものの設定。リセットCSSも入る。
- レイアウト・・・レイアウトに関わるもので接頭辞にl-をつける
- モジュール・・・レイアウト内に入るもの
- 状態（ステート）
- テーマ・・・背景色など
CSMA/CD、CSMA/CA、TDMA

応用情報技術者令和元年秋期 午前問32

イーサネットで使用されるメディアアクセス制御方式であるCSMA/CDに関する記述として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e8ad9819-bf61-0c80-88fa-e9ff93f784fc.png)

この質問は、難しいですね。
１、**CSMA/CD**方式は、Carrier Sense Multiple Access with **Collision Detection**
日本語に訳すと「搬送波感知多重アクセス／衝突検出方式」となります。

CSMA/CDでは、次の手順でフレーム(データ)を送信します。
　・伝送路上に他のステーションからのフレームが流れていないことを確認する。
　・フレームを伝送路に送出する。
　・衝突(コリジョン)を確認した場合、フレームの送出を中断する。
　・ジャム信号を一定時間送信し、衝突の発生を全てのステーションに検知させる。
　・ランダムな待ち時間(バックオフ時間)経過後に、再び①から送信手続きを開始する。
CSMA/CDは、伝送路上の通信量が増加するにつれて衝突の発生も増加し、さらに再送が増え通信量が増えてしまうという欠点があります。一般にCSMA/CD方式では、伝送路の使用率が30%を超えると急激に送信遅延時間が長くなってしまい実用的ではなくなると言われています。


下記の特徴：
・他のステーションが同時にフレームを送出した場合には衝突が発生します
・衝突発生時の再送動作によって，衝突の頻度が増すとスループットが下がる
・衝突を検知した際に送信されるジャム信号は、リピータハブを越えた先のステーションまで届くのでハブによる接続でも使用できます。
・フレームはオクテット(8ビット)単位になっていなければなりません。


２、**CSMA/CA**は Carrier Sense Multiple Access/**Collision Avoidance**
（搬送波感知多重アクセス／衝突回避方式）

CSMA/CAは、メッセージにIDを付与することでIDの優先順位によってメッセージの送信を遅らせたりする。このIDの比較を通信調停（アービトレーション）という。

・RTS/CTS方式
RTS/CTS方式は、無線LANのアクセス制御方式の一つでRTS(Request To Send，送信要求)フレームとCTS(Clear To Send，受信準備完了)フレームを用いてフレームの衝突を防ぐことができるものです。
無線LANの通信手順であるCSMA/CAの説明です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/89ac7220-37bd-ff9f-250b-18aa718c8038.png)



３、**TDMA**  【 Time Division Multiple Access 】  
時分割多元接続 / 時分割多重アクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/78297a49-c31f-b460-6969-c1de48251e7b.png)


参照：
https://www.ap-siken.com/kakomon/29_haru/q31.html
https://www.ap-siken.com/kakomon/29_aki/q33.html

CSMA/CA
https://ja.wikipedia.org/wiki/CSMA/CA

http://e-words.jp/w/TDMA.html

CSMA/CA
https://qiita.com/fattolys/items/e8f8081d3cb42d7da0f6
Laravel でマイグレートするとSQLSTATE[42S01]が出る。

# 自分メモです


# マイグレートするとエラーが出て気に食わない


```yyyy_mm_dd_000000_create_users_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email',255)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

```
```console

php artisan migrate
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists
```

テーブルは正常に作成されているが
非常に気持ち悪いので原因調査

## エラーメッセージ翻訳 
とりあえず翻訳
■原文
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists

■翻訳
SQLSTATE[42S01]：基本のテーブルまたは眺めは、すでに存在する：　 1050テーブル『ユーザー』はすでに存在する

なるほどあるのか、いやそうだとは思ってたけど、migrateするとcreateしちゃうねん
どないすれば…。



## 対策
下記コマンドは
laravel\database\migrations　のディレクトリの処理を素直に実行してくれるコマンドのようです。

```
php artisan migrate
```

そのため素直に順番に実行していただいても問題ないようにするために
対象のテーブルが存在したら、Createを実行しないという処理を追加します

```
    public function up()
    {
        // 対象の存在をしていれば、処理を中断する
        if(Schema::hasTable('users')){
            return;
        }
        // 対象のテーブルを作成する
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email',255)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
```

上記ソースのように
事前チェックすればOK

```
        // 対象の存在をしていれば、処理を中断する
        if(Schema::hasTable('users')){
            return;
        }
```
Fusion 360 を Pythonで動かそう その１　スクリプトの新規作成

#はじめに
Fusion 360 を Pythonで動かしてRhinoceros + Grasshopper（or Python）や Dynamo 的なモデリングをしてみたいと思って始めた学習のメモです
この記事では Fusion 360 でスクリプトを新規作成し、その内容を確認する方法だけを書いています。スクリプトの編集については今後別の記事で書いていく予定です

次の記事　[Fusion 360 を Pythonで動かそう その２　スケッチに円を描いてみる](https://qiita.com/reisyu/items/7198eed3aaaaacbd0899)

## Fusion 360 API とは
- Technology Perspective from Japan  [Fusion 360 API：概要](https://adndevblog.typepad.com/technology_perspective/2015/10/fusion-360-api-overview.html)
- [Autodesk Forge セミナー Fusion 360 API](https://adndevblog.typepad.com/files/4.Fusion%20360%20API.pdf)

#スクリプトを新規作成
ツールタブ > スクリプトとアドインを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/455f6330-c8fe-7083-578d-bf7ec72a6a08.png)

作成 をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/edbc4b96-caec-c3f8-5c90-da71b439d64e.png)

Python を選択しスクリプト名、説明、作成者を入力して作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/0f6c404a-661b-4423-a986-941fb38fd09a.png)

マイスクリプトのところにスクリプトが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/84c9c2a1-6d8a-03d2-ac7c-33011056058f.png)

実行するとこんなダイアログが表示され、OKを押すと終了するだけのスクリプトです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/108b9c3f-4429-3394-7458-cd42eb3e5a11.png)

#スクリプトの内容を確認する
もう一度スクリプトとアドインのダイアログを開き、作成したスクリプトを選んで編集をクリック

```Python
#Author-Reisyu
#Description-初めてのスクリプト

import adsk.core, adsk.fusion, adsk.cam, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        ui.messageBox('Hello script')

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
```

#まとめ
この記事はこれだけの内容です。[**次回**](https://qiita.com/reisyu/items/7198eed3aaaaacbd0899)からは公式ドキュメントのサンプルを元に勉強していこうと思ってます

次の記事　[Fusion 360 を Pythonで動かそう その２　スケッチに円を描いてみる](https://qiita.com/reisyu/items/7198eed3aaaaacbd0899)
Pythonで機械学習を実施する際の必要な知識まとめ

#はじめに
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
記事も増えてきたため、目次として本記事にまとめます。


#準備系

* [macOSにパッケージ管理システム（Homebrew）を導入するときの手順と主な操作方法まとめ](https://qiita.com/Yanagawa_Yoshihisa/items/a2441d98d3c08250a8ed)
* [新しいMacに綺麗にPython環境を構築し、Jupter Notebookを導入する方法](https://qiita.com/Yanagawa_Yoshihisa/items/35e6f70a8411277282ce)
* [これからはJupter Lab！Jupter Labの導入（インストール）](https://qiita.com/Yanagawa_Yoshihisa/items/4c6f1662f78123e7a988)

#データ前処理系
##初心者のためのpandas基礎

* [1.読み込み＆加工](https://qiita.com/Yanagawa_Yoshihisa/items/112ec0491cb547e6e386)
* [2.データ概要把握](https://qiita.com/Yanagawa_Yoshihisa/items/e83d0bdedf024956cb51)
* [3欠損値処理](https://qiita.com/Yanagawa_Yoshihisa/items/c418e360ce9319f2af06)
* [4.日付・時間項目の取り扱い](https://qiita.com/Yanagawa_Yoshihisa/items/b3427ddd69d74f99802b)
* [5.Pivotテーブル（Excel対比付き）](https://qiita.com/Yanagawa_Yoshihisa/items/df8880b981306539c797)
* [6.Group by](https://qiita.com/Yanagawa_Yoshihisa/items/34053cf4feee39f8593e)
* [7.index、columns操作](https://qiita.com/Yanagawa_Yoshihisa/items/6b934686d41866a58466)
* [8.桁数処理](https://qiita.com/Yanagawa_Yoshihisa/items/295a2184a48955eee45f)

##その他
* [探索的データ分析の第一歩に便利なpandas-profilingの導入と概要](https://qiita.com/Yanagawa_Yoshihisa/items/9374476984598a057155)

#描画（グラフ作成）系
##初心者のためのseaborn基礎
* [1.データ件数を集計グラフ化（Countplot）](https://qiita.com/Yanagawa_Yoshihisa/items/8b48a797ae409fc52da1)
* [2.ヒストグラム（distplot）](https://qiita.com/Yanagawa_Yoshihisa/items/55aade9a356a60b18a67)
* [3.散布図（jointplot）](https://qiita.com/Yanagawa_Yoshihisa/items/f25b6e64174e0630ab91)

##その他
* [matplotlibでヒストグラム作成](https://qiita.com/Yanagawa_Yoshihisa/items/0bde331e5d41e2c28fe6)

#その他

 * [ITコンサル十年選手が効率的に仕事を行うために実施しているMacの設定（導入アプリ）](https://qiita.com/Yanagawa_Yoshihisa/items/4918b2ab90aa1a2a2320)
オブジェクト指向ってなに？ポケモンでざっくり説明してみる ①ポリモーフィズム編

ワイ「オブジェクト指向っていまいちよく分かってないんだよね
そもそもなにが良くてそんなの使ってんの？」

友「わかる。フワフワしてなんだか掴みずらいよな」

ワイ「色々あるやん？継承とかカプセル化とかさ、ポリモーフィズムとか
ポリモーフィズムってなんやねん！もっとわかるような言葉にしろよw」

友「難しい言葉使えばえらい、みたいな節あるよな。でも意味自体はめちゃ単純やで」

ワイ「そうなん？」

友「うむ。オブジェクト指向って一言でいうと**"似たような奴らは仲間にしてまとめて、部品として再利用できるようにしてやろ"**ってことや」

ワイ「ほう」

友「オブジェクト指向じゃない世界を考えたらメリットがわかるぞ」
友「たとえばポケモンで考えるとするやん」

ワイ「俺の中ではポケモンはルビーサファイアで止まってるけどいい？」

友「ええよ。じゃミズゴロウ、アチャモ、キモリをコードで表してみて」

ワイ「こんな感じか」

```
ミズゴロウ;
ミズゴロウの図鑑No = 258;
ミズゴロウの特性 = "げきりゅう";
ミズゴロウのわざ = {"たいあたり","なきごえ","みずてっぽう"};
ヌマクローに進化する();{
		ヌマクローになる;
	}

アチャモ;
アチャモの図鑑No = 255;
アチャモの特性 = "もうか";
アチャモのわざ = {"ひっかく","なきごえ","ひのこ"};
ワカシャモに進化する();

キモリ;
キモリの図鑑No = 252
キモリの特性 = "しんりょく";
キモリのわざ = {"はたく","なきごえ","すいとる"};
ジュプトルに進化する();
```

友「うむ、なかなか詳しいな。なんか思うところはあるか」

ワイ「変数とかふるまいの名前が被らないようにするとどうしても名前が長くなってしまうな。まとめられるとこはまとめたい」

友「それがオブジェクト指向や。似た者同士まとめましょ、ってことやぞ。オブジェクト指向やとこうなる。
親クラスのポケモンを継承してミズゴロウとかを定義してるで」

```
abstract class ポケモン{
	図鑑No;
	特性;
	わざ;
	abstract 進化する();
}
class ミズゴロウ extends ポケモン{
	図鑑No = 258;
	特性 = "げきりゅう";
	わざ = {"たいあたり","なきごえ","みずてっぽう"};
	@Override
	進化する(){
		ヌマクローになる;
	}
}
class アチャモ extends ポケモン{
	図鑑No = 255;
	特性 = "もうか";
	わざ = {"ひっかく","なきごえ","ひのこ"};
	@Override
	進化する(){
		ワカシャモになる;
	}
}
class キモリ extends ポケモン{
	図鑑No = 252;
	特性 = "しんりょく";
	わざ = {"はたく","なきごえ","すいとる"};
	@Override
	進化する(){
		ジュプトルになる;
	}
}
※実際に使うときはインスタンス化が必要です
```

ワイ「ほう。クラスで分けたら変数とかふるまいの名前が単純になったな」

友「うむ、それがポリモーフィズムや」

ワイ「！？？」

友「クラスに分けることでクラス毎に同じ名前の変数やふるまいを定義できるんや。」
友「例えばポケモンを進化させたい時を考えてみようか。ポケモンを継承したクラスのオブジェクトなら、指示を出す側はなにも考えず「進化する()」を呼び出すだけでええんや。ジグザグマ.進化する() とかね」

ワイ「そうか！？別に進化系がマッスグマってのを知らなくても進化させることができるんか」

友「せやで。**ふるまいの実装は各ポケモンのクラスに任せて、呼び出す側は"進化する()"を実行するだけでいい。便利やろ(^^) 　これが"オブジェクト指向のメリット① ポリモーフィズム"や**」

友「裏を返すと各ポケモンクラスは"進化する()"を独自に実装する"責任（お約束）"があるわけだ。まあこの辺りも話すと長いからまた今度やね」

つづく
DBMSの媒体障害時の回復法、チェックポイント、ロールフォワード、ロールバック

応用情報技術者令和元年秋期 午前問29

DBMSの媒体障害時の回復法はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9dd3023c-a5ea-44d0-a1b0-b5ca5a01229e.png)

この質問としては、ポイントは媒体障害なので、バックアップコピーから回復するのは正しいですね。

当該質問ではなく、障害発生種類は、
１、トランザクション障害：異常終了していたトランザクションを直接にロールバックです。
※アプリレベル

２、システム障害：
①直近のチェックポイントに回復、
②直近のチェックポイント以降、コミットされていたのトランザクションを回復（＝ロールフォワード）
③直近のチェックポイント以降、コミットされてい**ない**のトランザクションを**捨てる**（＝ロールバック）
※システム障害とは、DBインスタンスまたは、DBインスタンスが動いているOSシステムと思っております。

３、媒体障害：
①バックアップしていたのコピーで壊していた媒体を切り換える　※これは大事ですね。
②バックアップコピー以降コミットしていたトランザクションを回復（＝ロールフォワード）
③直近のチェックポイント以降、コミットされてい**ない**のトランザクションを**捨てる**（＝ロールバック）
※媒体障害ですので、②と③はできないかもしれませんね。勿論、流れは上記ですね。


４、
・障害発生時，異常終了したトランザクションをロールバックする。
⇒×。トランザクション障害からの回復方法です。
・障害発生時点でコミットしていたが，データベースの実更新がされていないトランザクションをロールフォワードする。

⇒×。システム障害のうち、障害発生直前のチェックポイント後にコミットされたトランザクションに対する回復方法です。

・障害発生時点で，まだコミットもアボートもしていなかった全てのトランザクションをロールバックする。
⇒×。システム障害のうち、障害発生直前のチェックポイント後にコミットされていないトランザクションに対する回復方法です。

・バックアップコピーでデータベースを復元し，バックアップ取得以降にコミットした全てのトランザクションをロールフォワードする。
⇒○。媒体障害からの回復方法です。


参照：
https://www.ap-siken.com/kakomon/24_haru/q31.html
LambdaとDjangoの相性ってどうなの？？


# 忙しい人へ
結論とまとめを最初にのせときます

## 結論
Djangoのようなフルスタックフレームワークではあまり良いとは言えない
フルスタックフレームワーク使うならECSを使った方が良いらしい

## まとめ
 > Lambdaのコールドスタートで時間かかるのでは？
 
結構かかります

> DjangoのプロジェクトをLambdaにアップロードしたら、Lambdaのアップロードサイズ制限に引っかかるのでは？

かかる可能性はあります
ただよほど入れなければ大丈夫なはず

> REST APIを作る時に、DjangoのルーティングとAPI Gatewayの組み合わせって相性悪くね？

実害はないと思うけど悪いと思います

> Django使うってことはサーバーレスなのにサーバー立ち上げるってこと？

その通りです

# 前置き
この記事はあくまでも私見です
これが絶対正しいということではないのでご了承ください

# 前提
zappaというデプロイツールを用いての検証




# 本題
LambdaとDjangoの組み合わせにした時の疑問点がいくつかあった
その疑問点をひとつづつ考えてみた

## 疑問点
- Lambdaのコールドスタートで時間かかるのでは？
- DjangoのプロジェクトをLambdaにアップロードしたら、Lambdaのアップロードサイズ制限に引っかかるのでは？
- REST APIを作る時に、DjangoのルーティングとAPI Gatewayの組み合わせって相性悪くね？
- Django使うってことはサーバーレスなのにサーバー立ち上げるってこと？


### Lambdaのコールドスタートで時間かかるのでは？

##### Lambdaのコールドスタート
1. ENIの作成(LambdaにVPC設定した時に限る)
2. 実行コンテキストの起動
3. デプロイパッケージの読み込み
4. デプロイパッケージの展開
5. ランタイムの起動と初期化
6. 関数の実行


#### 調査
今回はVPC設定なしで、コールドスタートの時間を調べたいので2~5までの時間を調べる

Djangoのプロジェクトと生のPythonのプロジェクトを用意
※DjangoのプロジェクトではzappaとDRFを導入
プログラムの内容はLambda実行時に「Hello world」をJSONで返す
これらをマネージドコンソールから実行してCloudWatchで処理時間を確認する
Djangoのパッケージサイズは42.2MB
生Pythonのパッケージサイズは129B
Lambdaに割り当てたメモリはどちらも512MB

####結果
（msで表記）

回数|Django|生Python|差分
---|---|---|---
1|3073|4|3069
2|3159|3|3156
3|3173|3|3170
4|3190|3|3187
5|3196|4|3192

デプロイパッケージのサイズによってコールドスタートにかなり影響があることが分かった
Lambdaはなるべく最小限のパッケージをアップロードすることが好ましいのでフルスタックフレームワークを使用するのは相性が悪そう

### DjangoのプロジェクトをLambdaにアップロードしたら、Lambdaのアップロードサイズ制限に引っかかるのでは？
> Lambdaのパッケージサイズの上限
> 50 MB (zip 圧縮済み、直接アップロード)
> 250 MB (解凍、レイヤーを含む)

いろいろライブラリを突っ込んでたら制限にかかりそう


### REST APIを作る時に、DjangoのルーティングとAPI Gatewayの組み合わせって相性悪くないか？
実際にプログラムを動かす上で実害はない
だが、あまり筋の良いやり方だとは思えなかった
本来APIGateway + LambdaでREST APIを作成した時の処理の流れは
1. APIGatewayでURLを指定
2. 指定したURLと紐づくLambdaを呼び出す
3. 処理
になると思う

Djangoを使用するとなると、Djangoで設定したURLに合わせることになる
処理の流れとしては
1. APIGatewayはどんなURLが来ても同じLambdaを呼び出す
2. Lambdaが起動したらまずDjangoのサーバーを立ち上げる
3. DjangoのサーバーがURLを受け取りルーティングする
4. URLに紐づいたDjangoのViewを実行
という流れになるため非常に筋が悪い

なのであまり相性が良いとは言えない


### Django使うってことはサーバーレスなのにサーバー立ち上げるってこと？
そういうことになる

GitHubでzappaのLambda処理を見てみると

- Django動かす準備
- URLの取得
- Djangoのサーバー起動

みたいな感じだった

サーバーレスなのにサーバー立ち上げる処理が入るから違和感を感じた

### その他
検証中に思ったこととかをここに書いときます

- RDSとLambdaって相性よくなかった気がする
  - ただ2020年7月にRDS Proxyがリリースされたからかなり解消されてるかも？
- LambdaとDjangoの事例がなさすぎる
  - 開発で詰まった時に調べても、ドキュメントがないから解決にかなり時間かかりそう
- zappaでRDS使おうと思ってmysqlclient入れてzappaのコマンドでマイグレーションしたら死ぬほどエラー出た
  - zappaのコマンド使わずにマイグレーションしたら普通に通ったからzappaの問題？
  - ライブラリによって使えないものがあると困るので結構致命的
- そもそもLambdaの実行時間制限15分・パッケージサイズ250MBまでなど、制限があるので一つのLambdaにいろんな処理をさせるのは不向きなのでは？


# 結論  
Djangoのようなフルスタックフレームワークではあまり良いとは言えない
フルスタックフレームワーク使うならECSを使った方が良いらしい

# まとめ
 > Lambdaのコールドスタートで時間かかるのでは？
 
結構かかります

> DjangoのプロジェクトをLambdaにアップロードしたら、Lambdaのアップロードサイズ制限に引っかかるのでは？

かかる可能性はあります
ただよほど入れなければ大丈夫なはず

> REST APIを作る時に、DjangoのルーティングとAPI Gatewayの組み合わせって相性悪くね？

実害はないと思うけど悪いと思います

> Django使うってことはサーバーレスなのにサーバー立ち上げるってこと？

その通りです
RDBMSのロックー共有ロック、専有ロック

応用情報技術者令和元年秋期 午前問28

RDBMSのロックに関する記述のうち，適切なものはどれか。ここで，X，Yはトランザクションとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/de4c730a-5f23-f74c-9d96-c35d3f7883bc.png)


共有・専有の2種類のロックの違いを確認しておきましょう。
**共有ロック**
データを読込むときに使うロックで、資源がこの状態の場合は他のトランザクションによる更新処理ができなくなる。(読込みは可能)
**専有ロック**
データを更新するときに使うロックで、資源がこの状態の場合は他のトランザクションによる読込みや更新ができなくなる。

下記図で理解しやすいかもしれませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ad668f4c-a1e1-48ee-7799-001c76dd0ee5.png)


参照：

https://www.db-siken.com/kakomon/29_haru/am2_18.html
https://www.ap-siken.com/kakomon/30_aki/q30.html
docker-composeでコンテナの初回起動時に特定の処理を行う方法

## TL; DR
docker-composeでコンテナの初回起動時に特定の処理を行う方法を簡潔にまとめました。

1. 初回起動判定付きのシェルスクリプトを作成する
2. `docker inspect` コマンドでベースイメージのENTRYPOINTとCMDを調べる
3. シェルスクリプト → ENTRYPOINT → CMDの順で実行するように設定する


## 経緯
Dockerfile内でコンテナ初回起動時のみ特定の処理を行うように設定する場合、初回起動判定を仕込んだdocker-entrypoint.shをENTRYPOINTに指定するのが一般的ですが、docker-composeの設定だけでコンテナ初回起動時に処理を挟みたいときにはどうしたら良いのか気になったので試してみました。

※ docker-entrypoint.shについてはこちらの記事の解説が分かりやすいです。
[dockerで初回起動時のみ特定の処理を行うヘルパースクリプト（docker-entrypoint.sh）][docker-entrypoint.sh]


## サンプル
### ディレクトリ構成
```text:tree
.
├── db
│   ├── init
│   │   └── 01_create_users.sql
│   └── tmp
│       └── container-init.sh
└── docker-compose.yml
```


### 初回起動判定付きのシェルスクリプト


```sh:container-init.sh
if [ ! -e '/check' ]; then
    touch /check
    # 初回起動時に実行させたいコマンドをここに書く
    echo "セットアップ"
else
    # 2回目以降
    echo "セットアップ済"
fi
```


### [docker inspect][inspect]
ベースイメージがローカルに無い場合は事前に取得してから `docker inspect` でENTRYPOINTとCMDを確認します。

```shell-session
$ docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec8c9369e08: Pull complete
177e5de89054: Pull complete
ab6ccb86eb40: Pull complete
e1ee78841235: Pull complete
09cd86ccee56: Pull complete
78bea0594a44: Pull complete
caf5f529ae89: Pull complete
4e54a8bcf566: Pull complete
50c21ba6527b: Pull complete
68e74bb27b39: Pull complete
5f13eadfe747: Pull complete
Digest: sha256:97869b42772dac5b767f4e4692434fbd5e6b86bcb8695d4feafb52b59fe9ae24
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

$ docker inspect mysql:5.7 --format='{{.Config.Entrypoint}}'
[docker-entrypoint.sh]

$ docker inspect mysql:5.7 --format='{{.Config.Cmd}}'
[mysqld]
```

### docker-compose
docker-compose.ymlでentrypointタグで上書きすると、DockerfileのENTRYPOINTとCMDが無視されるので、まとめて指定します。

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: sample
    ports:
      - 3306:3306
    volumes:
      - ./db/tmp:/tmp # container-init.shをコンテナから参照できるようにするため
      - ./db/init:/docker-entrypoint-initdb.d
      - ./db/data:/var/lib/mysql
    container_name: sample-db
    entrypoint: >
      sh -c "
        sh /tmp/container-init.sh &&
        docker-entrypoint.sh mysqld \
          --character-set-server=utf8mb4 \
          --collation-server=utf8mb4_unicode_ci
      "
    # commandタグで指定していたものはentrypointタグでまとめて指定する
    # command: >
    #   --character-set-server=utf8mb4
    #   --collation-server=utf8mb4_unicode_ci
```

## リポジトリ
https://github.com/OskaMathis/docker-compose-sample


[docker-entrypoint.sh]:https://qiita.com/bashaway/items/e6279ba432d18c2d4299
[inspect]:https://docs.docker.jp/engine/reference/commandline/inspect.html
SQL文のCASCADE、INTERSECT、RESTRICT、UNIQUE

応用情報技術者令和元年秋期 午前問27


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/369e4072-ac8e-0465-6449-c94c631d6f03.png)

当該質問としては、簡単ですね。
ただ、質問に書いている、INTERSECT、RESTRICT　私も使ったことがないですね。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4df8326b-c9ea-d4ac-f146-c36bdc4e9ce7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/341fcf43-eab6-46a7-b45b-5eb1d6514e4c.png)

INTERSECT例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ca558c76-9a8c-3a9c-3256-acb6b26f34c5.png)


図From:https://www.ap-siken.com/kakomon/01_aki/q27.html
https://www.shift-the-oracle.com/sql/intersect-operator.html
FirefoxのアドオンのUser-Agent Switcherを入れると画像が表示されなくなる

![Qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639093/9c975f35-0dea-b693-2342-4dc8c749c98d.jpeg)


下矢印や虫メガネのアイコン画像が表示されていませんでした。

前から気にはなっていたのですが、ブラウザの環境が悪さしていると思い、FirefoxのアドオンのUser-Agent Switcherを外したら、治りました。
HTML外部リンクのrelについて

#はじめに
リンクにugc、noreferrer、noopener、sponsored、nofollowなどがよくあります。
それぞれの意味をまとめてみます。

## Linkのrel
###ugc
コメントやフォーラム投稿など、ユーザー作成コンテンツ（UGC）のリンクとして、aタグのrelにugcでマークアップし、PageRank の算出やユーザーのクエリに対するページの関連性の判断には使用されないため、サイトに悪い評価を回避できます。

```html
<a href="http://example.com/comment?id=123" rel="ugc">UGCについての説明</a>
```

###noreferrer
別のページへ移動する際にリンク元ページのURLなどの値を、外部サイトに送信しないようにする

```html
<a href="http://example.com/product?id=123" rel="noreferrer">referrer情報を送信しないURL</a>
```

###noopener
リンクを新しい閲覧コンテキストで開き、リンク元の文書へアクセスできないようにすることをブラウザーに指示します。
これは信頼できないリンクを開く際、 Window.opener プロパティでリンク元の文書を変更できないように制御できます。外部リンクの場合は基本設定したほうがよいです。

```html
<a href="http://example.com/product?id=123" rel="noopener">window.openerは使えないURL</a>
```

###sponsored
広告や有料プレースメントのリンク（有料リンク）の場合はマックアップしたほうがよいです。

```html
<a href="http://example.com/product?id=123" rel="sponsored">広告商品のページ</a>
```

###nofollow
リンクとサイトを関連付けたくない場合、またはリンク先のページをサイトからクロールさせないようにする場合は、nofollow の値を使用します

```html
<a href="http://example.com/product?id=123" rel="nofollow">本サイトと関係ないリンク</a>
```

###next,prev

```html
<a href="/prev" rel="prev">前のページ</a>
<a href="/next" rel="next">次のページ</a>
```

###external
ページが存在するサイトの外部にあるリソースへのハイパーリンクであることを示す。

```html
<a href="https://google.com" rel="external">Google</a>
```

###alternate
```html
<a href="print.html" media="print" rel="alternate">印刷モードのページ</a>
<a href="hoge-en.html" hreflang="en-US" rel="alternate">英語ページ</a>
<a href="exaple.pdf" type="application/pdf" rel="alternate">PDF表示</a>
```

###author
作者について説明するページへのハイパーリンク、または作者へのメール送信するリンクを作成

```html
<a href="mailto:author@example.com" rel="author">作者へメール送信</a>
<a href="/contact" rel="author">作者へお問い合わせ</a>
```
###複数記載の場合は空白か、コンマで複数設定可能
```html
<a href="http://example.com/product?id=123" rel="nofollow noopener">空白で複数設定</a>
<a href="http://example.com/product?id=123" rel="nofollow,noopener">コンマで複数設定</a>
```

#ページのnoindex
サイトでユーザーがプロフィール ページ、フォーラム スレッド、ウェブサイトなどのページを作成できるようにしている場合は、新しいコンテンツや信頼していないコンテンツが検索に表示されないようにすることでスパム行為を防止できます。

```html
<html> <head> <META NAME="googlebot" CONTENT="noindex">
```

#robot.txt

```html
User-Agent:*
Disallow:/mypage
Disallow:/admin

Sitemap:http://example.com/sitemap.xml
```

https://support.google.com/webmasters/answer/1061943?hl=ja


参考URL

- [Mozilla: 外部リソースへのリンク要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/link)
- [W3C: HTML link rel Attribute](https://www.w3schools.com/tags/att_link_rel.asp)
- [Goolge: robots.txt について](https://support.google.com/webmasters/answer/6062608)
- [Google: コメントスパムを防止する方法](https://support.google.com/webmasters/answer/81749)
- [Google: Googleに外部リンクの関係性を伝える](https://support.google.com/webmasters/answer/96569?hl=ja)

以上
ブラウザのconsoleからは要素を取得できるのに、scriptから取得するとnullになるときは、iframeの要素かもしれないというお話

# はじめに

簡単なスクレイピングツールを書いていたら、不可解な現象に遭遇してハマってしまいました。
同じような現象に遭遇した人が無為な時間を過ごさないように共有します。

## スクレイピングツールを書くときのお話

「この部分の内容を取得したい！」と思ったら、該当部分を右クリックして「要素の詳細を表示」（Safariの場合）からHTMLを眺めて、要素のattributeなどをチェックします。

そして、こうやれば取得できるかなというコマンドを、試しにconsoleに入力してみます。

```javascript
document.querySelector('a[href^="/start_with"]) // => <a href="/start_with/12345">...</a>
```

無事に結果が返ってきました！

通常はこのような手順でうまくいったコマンドをスクリプトにまとめていくと思います。ところが……

## スクリプトを実行するとnullが返ってくる

？？？

あれ？コピペしたのにおかしいな。このコマンドにたどり着くまでのページ遷移がおかしいのかな？いや、そもそも……という感じで1時間くらい哀しい時間を過ごしました。

# iframeの中の要素だった

色々試すうちに気がつきました。あれ？取得しようとしている要素がiframeの中にあるぞ。
ページ上から要素の詳細を表示すると、対象の要素が見える状態まで展開されるのでなかなか気がつかなかったのです。

## iframeの中の要素を取得する

というわけで結論です。
以下のように、`iframe.contentDocument`から検索することでiframe内の要素を取得できます。

```javascript
const iframe = document.querySelector('#iframe-selector')
// iframe.contentWindow.document === iframe.contentDocument
const targetElement = iframe.contentDocument.querySelector('a[href^="/start_with"]')
 
 // XPathで取得するときは、2つめの引数にiframe.contentDocumentを渡せばOK
const targetElementByXPath = document.evaluate(
  '//a[contains(@href, "/start_with")]',
  iframe.contentDocument,
  null,
  XPathResult.FIRST_ORDERED_NODE_TYPE,
  null
).singleNodeValue
```

どうやら、Webインスペクタやデベロッパーツールからiframe内の要素を**手動で表示した**時点で、iframe内の要素が、通常の`document`内に展開されるようです。そのため、ブラウザのconsoleからは取得できてしまっていたのでした……（かなしみ）

# 参考

[javascriptでiframe内のDOM要素を取得したり操作する](https://designsupply-web.com/media/knowledgeside/4823/)
IT企業に入社して1年経ったのでSpringBootとVue.jsでポートフォリオを作ってみた

# 主に伝えたいこと
* モチベーション維持の大変さとその対処
  * 2ヶ月間ですらモチベーションを維持するのは大変でした

# 筆者背景
* 機械系学科を卒業し新卒でIT企業(非WEB系BtoB)に入社し1年が経ちました
* 1年目はVue.jsとJavaで社内の在庫を管理するシステムを開発させていただきました
* 2年目(今)はAWSに関わるチームにいます

# ポートフォリオとその開発について

## 概要
https://www.techmatch.tokyo/ (サンプル ユーザID/パスワード：testuser/testuser) (非レスポンシブ)

* 個人エンジニア同士を結び付けるようなサービス(のつもり)です
* ユーザがやりたい事を投稿し，他のユーザが一緒にやりたいと思ったら応募するサービスです
* モチベーションの部分でも書きますが，完成度は6割だと思います

## 開発期間
* 以下の通りで概算65日です。実装中に要件や設計を変更する場面が度々ありました。恐ろしいことに現場でもあるみたいですね。
  1. 要件定義 2日
  2. 設計 2日
  3. 実装・テスト 60日(バックエンド 25日 フロントエンド 35日)
  5. デプロイ 1日

## 使用した技術
* フロントエンド：Vue.js，Bulma，webpack
* バックエンド：SpringBoot，pom，postgresql
 * 会社でやってたのでクリーンアーキテクチャで実装しました。冗長な気がしますが，コード保守しやすい，テストしやすい。
* インフラ：heroku
  * AWSを触るチームにいるのですが，コスト的にherokuにしました。

# ポートフォリオを作った目的
## 外にエンジニアの知り合いを作ってみたいなぁ 4割
 * 挨拶する際に自分の作ったものがあると便利かなと思いました。ただ会社がBtoBなため簡単に私の携わった部分を見せられません。そこで対外的に形を見せられる実績がほしいので作ってみました。

## 技術を体得したいなぁ 4割
  * インフラからフロントまで1人でやることで，今まで会社から与えられていた部分(開発環境・デプロイ環境など)も含めて身に着けたいと思っていました。ポートフォリオ開発を通じてこの目的は果たせたと思います。


## こんなサービスあったらいいなぁ 2割
 * ITエンジニアがもっともっと活躍できたらいいなあと思っています。

# モチベーション維持の大変さとその対処
## とにかく面倒くさい
* 開発期間中は，仕事から帰る → 開発する → 仕事に行く の繰り返しでした。とにかく疲れて面倒くさかったです。レイトン教授や登山に逃げたときもありました。レイトン教授で疲れた時もありました。そこで次のようなことをしていました。

## 対処１：完璧主義から遠ざかる
* これが一番だと思います。「大学なら6割出来れば単位が貰える。とりあえず6割を目指そう。」これを言い聞かせていました。理由としては，完璧を目指す途中で体力消費や現実とのギャップから萎えてデプロイを断念するよりも，6割でデプロイした方が形として残り良い成果だと思ったからです。そのため，見た目や機能に甘々な部分が多々あります。やり残したリストを取っていたのですが見てみると，タスクの大小含め約20個あります。ですが，また追加開発すればいいし，MVP開発なんてのもありますし，何より心の余裕を作るにはこの考え方が良かったです。

## 対処２：筋トレする
* 筋肉は裏切らない。
* セロトニンが出て気分をリフレッシュできるらしいです。

## 対処３：手段ではなく，目的を意識する
* 「次は，画像保存の実装かぁ。」「次は，動的検索の実装かぁ。」「次は，メール認証の実装かぁ。」と目的を達成するための手段の手間を考えると面倒くさくてやる気が起きませんでした。そこで「デプロイしたら知り合いが増えるかも知れないぞ。だからやろう。」と目的を言い聞かせてやってました。万人に効果があるかは分かりませんが，私はやる気が起きました。

# その他 雑記

## デプロイまでに掛かった料金
* 総額：200円
 * ドメイン取得：200円

## 今後1ヵ月でかかる料金
* 総額：800円
 * レンタルSMTPサーバ：50円
 * heroku：750円

## 今後1年間でかかる料金
* 総額：2850円
 * SMTPサーバ：600円
 * heroku：2250円
     * 3ヵ月をすぎたらfreeプランに戻し，cloud flareを立ててssl化しようと思っています。

## 技術で知ったことを10個なんとなくピックアップ
* Vue.jsのトランジションでアニメーションを作れる
* 無限スクロールを実装するなら，"現在の表示高さ+スクロール量>=全体の高さ" を条件にAPIを叩く
* bulmaという名前はドラゴンボールのブルマからきたっぽい
* 複数の拡張子を考慮し画像データを送るならヘッダーのcontent-typeをmultipart/form-dataというMIMEタイプに
* パスワード暗号化方式のbcryptは一方通行なので複合できない
* DBにクエリを発行する際に起きるかもしれないN+1問題
* SpringBootで動的検索するならJpaSpecificationExecutorインタフェース
* SpringBootでHTTPリクエストに独自のフィルタをかけるなら，OncePerRequestFilterを継承したクラスを使う
* WEBアプリをデプロイするならsitemap.xmlを作っておく
* amazon sesで不特定多数にメールを送る場合は申請が必要になる

# 最後に
* コード書くの楽しいなあ。
Create select box which has lower and upper limit using Vue.js


```html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>Lower and Upper limit with Vue.js</title>
        <meta charset="utf-8">
        <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
    </head>
    <body>
        <div id="lowerupper_warp">
            <select  name="lower"  v-on:change="selectLower()" v-model="lower_value">
                <option value="" >Select lower limit</option>
                <option v-for="(o, key) in lower_list" v-text="o" v-bind:value=key></option>
            </select>
            <select  name="upper" v-model="upper_value">
                <option value="" >Select upper limit</option>
                <option v-for="(o, key) in upper_list" v-text="o" v-bind:value=key></option>
            </select>
        </div>
    </body>
    <script>
        var select_prefecture = new Vue ({
            el : '#lowerupper_warp',
            data: {
                lower_value: 0,
                upper_value: 0,
                lower_list: {},
                upper_list: {},
                full_list: {
                    0: 0,
                    1 : 1,
                    2 : 10,
                    3 : 100,
                    4 : 1000,
                    5 : 10000,
                },
            },
            methods: {
                selectLower() {
                    var selected_value = this.lower_value;

                    const deleted_target = range(0, selected_value - 1);
                    this.upper_list = JSON.parse(JSON.stringify(this.full_list));

                    deleted_target.forEach((value, i) => {
                        delete this.upper_list[value];
                    });

                    if(this.lower_value > this.upper_value){
                        this.upper_value = this.lower_value;
                    }

                },
            },
            mounted() {
                this.lower_list = JSON.parse(JSON.stringify(this.full_list));
                this.upper_list = JSON.parse(JSON.stringify(this.full_list));
            }
        });

        const range = (start, end) => {
            const list = [];
            for (let i = start; i <= end; i++ ) {
                list.push(i);
            }
            return list;
        }
    </script>
</html>
```
インテルPC上でUbuntu Raspberry Piイメージを実行する

[Install Ubuntu Server on a Raspberry Pi 2, 3 or 4](https://ubuntu.com/download/raspberry-pi) にあるSDカードイメージをUbuntuまたはDebian LinuxをインストールしたインテルPCで実行する話です。[qemu-user-static](https://packages.ubuntu.com/focal-updates/qemu-user-static) と [systemd-nspawn](https://packages.ubuntu.com/focal-updates/systemd-container) を用います。64-bit版で話を進めます。32-bit版でも同様にできるはずです。Raspberry Piディスプレイ出力のハードウェアエミュレーションは無いです。以下すべてインテルPCのUbuntuまたはDebianのrootプロンプトで実行します。

# パッケージインストール

`apt-get install qemu-user-static systemd-container` で必要パッケージをインテルPCにインストールします。

# Raspberry Pi用Ubuntuイメージのダウンロードと展開

[Install Ubuntu Server on a Raspberry Pi 2, 3 or 4](https://ubuntu.com/download/raspberry-pi) から `ubuntu-20.04-preinstalled-server-arm64+raspi.img` をダウンロード・展開して `/var/tmp` （など）に置きます。このイメージファイルには２つのパーティションがあり、大きさなどを `fdisk` コマンドで確認できます。Ubuntu Raspberry Pi server のルートファイルシステムは２番目のパーティションにあります。

# loopデバイスのセットアップ

`losetup -P -f /var/tmp/ubuntu-20.04-preinstalled-server-arm64+raspi.img` で２番目のパーティションをインテルPCからデバイスファイルとして見られるようにします。こうすると `/dev/loop0p1` が１番目のパーティション、 `/dev/loop0p2` が２番目のパーティションになります。

# マウント

`mount /dev/loop0p2 /mnt` でSDカードイメージのルートパーティションがマウントされます。

# Raspberry Server のルートプロンプト

`systemd-nspawn -D /mnt -a` でUbuntu Raspberry server のルートプロンプトが出ます。パッケージの削除やインストール、設定などをここから行うことができます。

`
H.264/MPEG-4 AVC

応用情報技術者令和元年秋期 午前問25


H.264/MPEG-4 AVCに関する記述はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1dbbfc3d-18bf-9f35-42df-be36860dbf44.png)

多分、ポイントとしては、MPEG-4　AVCは、圧縮方式ですね。通信ではんでないです。

ハイビジョン (Hi-Vision) は、日本における高精細度テレビジョン放送 (High Definition television / HDTV) の愛称である。 

ビットレートとは1秒間に送受信できるデータ量のことです。 単位にはbps（Bit Per Second）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6687e9f1-7f46-0c03-793b-0a0c2627f86c.png)


図From：https://www.ap-siken.com/kakomon/01_aki/q25.html
Ruby on Rails レコード検索、無ければ作成 find_or_create_by メソッド

# find_or_create_by メソッドとは？
find_or_create_by メソッドとは、findメソッドとcreateメソッドが合わさったメソッドであり、
引数に渡した条件に該当するレコードをテーブルから検索し
該当するレコードがあれば取得、無ければ作成してくれるメソッド。

# 使い方
**モデル.find_or_create_by(検索条件)**

例：usersテーブルの中からnameが"suzuki"のレコードを取得、無ければ作成する場合

```ruby
User.find_or_create_by(name: "suzuki")
```
コメント機能実装（表示だけ）

アウトプット用です。
投稿に対するコメント機能の実装をしており、なかなかにてこずりました。
下記エラー

<img width="1422" alt="a54991ddf9bd78b8035e40842079d2c4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653208/313f8ba1-4c22-dc1a-e67a-96798259f612.png">


commentsには何も入ってないとのことなのですが、直接カラムを指定していることが原因かと思われます。


```top_page_controller.rb
class TopPageController < ApplicationController
  def index
    @toppages = TopPage.all
  end

  def new
    @toppage = TopPage.new
  end

  def create
    TopPage.create(top_page_params)
    redirect_to top_page_index_path
  end

  def show
    @toppage = TopPage.find(params[:id])
    @comment = Response.new
    @comments = @toppage.comments.includes(:user)
  end

  private
  def top_page_params
    params.require(:top_page).permit(:contents,:name).merge(user_id: current_user.id)
  end
end
```

ということでshowの部分を下記に修正

```top_page_controller.rb
  def show
    @toppage = TopPage.find(params[:id])
    @comment = Response.new
    @comments = @toppage.responses.includes(:user)
  end
```
表示されました。
<img width="1332" alt="4e0f540eb4218ec7f48fce14efb5c445.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653208/dd96185a-451c-ed1a-2254-dfeaac496afb.png">

んー。。。感覚的になぜかはわかるのですが言語化ができない。。。。。

コントローラーで使用するデータベースをインスタンス変数（@comments）に格納して
ビューでカラムを指定して表示。の流れでうまくいったのでそれでよかったのか？

もっとエラー重ねて理解深めようと思います。
Rails Tutorial　第8章完了

#2020/7/14 0.5時間
#2020/7/15 0.5時間
8.1まで完了しました。
#2020/7/16 0.5時間
||=の意味を理解するのに時間がかかりました。
#2020/7/17 0.5時間
#2020/7/18 2.5時間
土日は時間が取れ、平日より進められました。
#2020/7/19 2時間
1.5時間で8章が終わりました。
残り0.5時間は9章です。

これで8章を完了しました。
所要時間は6時間です。

難易度が上がり、Ruby独特の表記の意味を理解するのに時間がかかりました。
毎日朝に少しずつが出来てきています。

#別のブラウザで開くと「VFS connecion does not exist」エラー
Cloud9でやっています。
注11にある、

>クラウドIDEをご利用の場合は、別のブラウザでログイン動作を確認することをおすすめします。そうでないと、クラウドIDEを開いているブラウザも一緒に閉じるはめになってしまいます。

に従い、環境を
・Cloud9はFirefox
・実行用にChromeブラウザ
としました。

Cloud9から開いたFirefoxのタブに表示されていたURLを、コピーして、ChromeにURLを打ち込んだところ、「VFS connecion does not exist」のエラーで開けませんでした。


##クッキーが削除されたのかはFirefoxのツールでは分かりませんでした
他の人のサイトを調べたところ、Chromeでは分からないとの記載がありました。ですが、Firefoxの例は見つかりませんでした。
アプリ画面の上部のメニューを見るとログイン状態からログオフ状態に変わったので、動作は正しいように見えます。
キャリアについての質問

キャリアについての質問です
【前提】
私は21卒で来年からIT企業へ入社します。
そこでは自社サービスを作っていています。
私自身は文系ですが、大学2年生の頃からプログラミングを独学ではじめSE職として採用されました。

スキルとしてはマークアップ言語/Ruby/Rails/Javaを少しで1人でウェブアプリ作ってよって言われたらデザインは苦手ですが、作るのは可能みたいなレベルです。
資格は一応基本情報技術者持ってて、10月に応用を受験する予定です

なので将来的には企画から保守までやるのですが、人事の方からはどれかに専任するキャリアもできるとお聞きしまして、実際文系出身の開発専門の方に会わせていただきました。しかし、同期には理系出身や博士卒の方もいらっしゃり、同じ文系でも旧帝の方です。僕はそれに比べたら大したものはありません。
そのようなこともあって自分の価値は開発では出せないと考えています。
SE職では同期は毎年変動するっぽいですが10-15人程度です

私としても開発をバリバリやりたいという思いもありません。どちらかというとコミュニケーション能力に自信があります。(就活でも営業メインの会社の内定を得ましたがお断りのお電話を入れました)
なので、開発ではなく企画やプロジェクト管理といった上流工程に行こうと考えています。

【質問】
①
最初の部署は基本的に本人の希望をことだったので最初から上流工程に行くか、まずは開発に行ってその後上流工程に行くか迷っています。

②
今まで完全独学で喰らいついてきた人間なので特に要件定義なども学んでこなかったのですが、上流工程に携わりたいならおすすめの書籍や個人ブログなどといったものがあればお伺いしたいです


【終わりに】
社会のことを何も知らない若造の不躾な質問かと思われますが、なにかアドバイス等あったら大変助かります。
よろしくお願いします
ユーザインタフェースのユーザビリティの評価手法

応用情報技術者令和元年秋期 午前問24

ユーザインタフェースのユーザビリティを評価するときの，利用者の立場からの評価手法と専門家の立場からの評価手法の適切な組みはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/17c1ecf2-4713-2c13-6404-a90e0f3637d9.png)


１、
ユーザビリティ評価手法について確認しておきましょう。
・アンケート(質問紙法)
　専門家が用意した質問用紙を多数の利用者に配布し、記入したもらった回答を分析することで評価する手法。

・回顧法
　被験者にタスクを実行してもらい、専門家がその行動を観察し、事後の質問への回答とともに分析する手法。

・思考発話法
　被験者にタスクを実行してもらい、その操作を行っている間、考えたことや感じたことを口に出してもらうことで利用者の感じ方や思考を分析する手法。

・認知的ウォークスルー法　walkthrough
　複数の専門家が、設計仕様書や紙のプロトタイプを見ながら、対象となるユーザの行動をシミュレーションしていくことで問題点を明らかにしていく手法。人の認知過程を基準にする。
　
　ソフトウェア開発、システム開発におけるピアレビューの技法の1つ。 レビューを希望する成果物の作成者が、必要な数のレビューアを招集し、成果物の内容を説明する形式となる。 

・ヒューリスティック評価法
　複数の専門家が、設計仕様書や紙のプロトタイプを見ながら、既知の経験則に照らし合わせて問題点を明らかにする手法。ヒューリスティックとは「経験則」の意で、専門家の経験則を基準にする。
5つの評価手法を"利用者の立場から"と"専門家の立場から"に分類すると次のようになります。

　ヒューリスティック　（Heuristic）は、「経験則の」「試行錯誤的な」の意味。セキュリティソフトのウイルス検出手法の1つ。あらかじめウイルスが取り得る挙動を登録し、プログラムコードに含まれる挙動と比較してウイルスを検出する。従来型のウイルス検出の手法であるパターンマッチングを用いない。

・利用者の立場からの評価手法
　アンケート、回顧法、思考発話法

・専門家の立場からの評価手法
　認知的ウォークスルー法、ヒューリスティック評価法


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/00553863-c9d9-8dae-f94b-8e23e9e09e59.png)


ーーーーーーーーーーーーーーーーーーーーーーー
補足
使用性(ユーザビリティ)の規格(JIS Z 8521:1999)では，使用性を“ある製品が，指定された利用者によって，指定された利用の状況下で，指定された目的を達成するために用いられる際の，有効さ，効率及び利用者の満足度の度合い”と定義している。この定義中の“利用者の満足度”を評価するときに用いる方法はどれか。

ア、インタビュー法
イ、ヒューリスティック評価
ウ、ユーザビリティテスト
エ、ログデータ分析法


１、
・インタビュー法
　→○。ユーザビリティ評価では、有効性、効率、満足度の3つの指標で評価する必要があります。有効さや効率性などは他の手法でも評価が可能ですが、満足度だけは実際に操作を行ったユーザへの聞き取り調査でしか知ることができません。よって、満足度に対する評価には、利用者へのインタビューやアンケート調査などを行うことが適切な方法となります。

・ヒューリスティック評価
　→×。ヒューリスティック評価は、複数の専門家が、設計仕様書や紙のプロトタイプを見ながら、既知の経験則に照らし合わせて問題点を明らかにする手法です。ヒューリスティックとは「経験則」の意で、専門家の経験則を基準にします。

・ユーザビリティテスト
　→×。ユーザビリティテストは、数人の被験者がタスクを実行する過程を観察し、被験者の行動、発話からユーザーインタフェース上の問題点を発見する評価手法です。

・ログデータ分析法
　→×。ログデータ分析法は、被験者に製品を操作してもらい、その操作ログから利用パターンを分析することでユーザビリティ問題を明らかにする評価手法です。



参照：
https://www.ap-siken.com/kakomon/28_haru/q25.html

https://www.ap-siken.com/kakomon/01_aki/q24.html