OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Text Analytics と PowerApps を使って感情分析アプリを作成する

今回は最近 Microsoft が力を入れている Power Platform　のひとつ PowerApps をいじってみたいと思います。ただいじるだけではつまらないので、今回は Cognitive Services の Text Analytics と連携させてみたいと思います。


#Text Analytics リソースをデプロイする
Azure Portal から Text Analytics を Create します。New / Marketplace にて Text と検索すると出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/fc7280ed-dfd1-cac3-46da-a32a6dc84b25.png)

任意の名前、リソースグループ名を入れてデプロイします。デプロイすると Key と Endpoint が生成されますので、それをメモに残しておきます。Cognitive Services は Key を生成するだけなので、デプロイの時間は 10秒ほどです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/09c77da6-c697-2232-9a36-04f27fe9b194.png)

#テキストの感情分析をするアプリを PowerApp で作成する
今回はノンコーディングで Text Analytics が使用できるのか試してみます。PowerApp を使って、モバイルアプリを生成し、その中でテキストから感情を抽出するアプリを作成してみましょう。

PowerApps で空のアプリ作成から、モバイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/86c203cd-8541-f090-8195-95fc4fc6c019.png)

モバイルアプリで作成することは以下3点です。
①Text Analytics が使用できるように先ほどメモしたKey から紐付ける
②Canvas に InputText / ボタン / Label を作成する
③Text が入力されボタンが押されたら Text Analytics API を呼び出し その結果を Label に表示するようにします。

上記3つはPowerApps に慣れているひとなら簡単にできると思います。
特に肝となる部分は、ボタンから Text Analytics を呼び出す部分です。そこには以下のような関数を使いました。

```
ClearCollect( sentimentCollect, 
        TextAnalytics.DetectSentiment(
            {
                language: "en", 
                text: tiTextToAnalyze.Text
            }
        ).score
    )
```

ボタンが選択されたときに感情のAPI を呼び出すといった処理です。
上記3つを実施するだけで、簡単に感情分析アプリが完成しました。

以下は、AZ-900 の英語版の試験対策問題集の口コミです。(星5つの評価)
「This book covered everything you need to know, theory-wise. I still bought other online items for practice tests, but would definitely recommend this book」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/afdf8a9e-ccb1-2b11-9d5e-c66dbeabf616.png)

これはネガティブな感じで書かれていた口コミです。(星1つの評価)
「1 chapter in and NONE of the steps in azure they list exist anymore, 100% useless data. Trying to see if I can get a refund.」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/c6084aa2-cbe9-e704-1126-1050ca193fa4.png)

口コミを AI にくわせ感情スコアを仕分けしてくれるアプリが簡単に実装できそうですね！
もっとカスタマイズしたいギークには物足りなさはありましたが、まず動くものを作成しみてる、という観点だと色々使い道がありそうです。

#参考URL
Use Cognitive Services in PowerApps
https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/cognitive-services-api
はじめてのリスト内包表記


# 課題

```py
# この入力に対して
service = {'Yahoo!': 'www.yahoo.co.jp', 'Google': "www.google.com", 'MSN': 'www.msn.com', 'wiki': 'ja.wikipedia.org'}

# この結果を得たいとする
# www_urls = 'www.yahoo.co.jp,www.google.com,www.msn.com,'
# other_urls  = 'ja.wikipedia.org'
```

## ベタ書き

```py
    www_urls = ''
    other_urls = ''
    for service_name in service:
        url = service[service_name]
        if 'www' in url:
            www_urls = www_urls + url + ','
        else:
            other_urls = other_urls + url + ','
    www_urls = www_urls[:-1]
    other_urls = other_urls[:-1]

    print(www_urls)
    print(other_urls)
```

カッコワルイ

## リスト内法表記

```py
    www_urls_list = [service[service_name] for service_name in service if 'www' in service[service_name]]
    other_urls_list = [service[service_name] for service_name in service if 'www' not in service[service_name]]
    www_urls = ','.join(www_urls_list)
    other_urls = ','.join(other_urls_list)

    print(www_urls)
    print(other_urls)
```

## さらにまとめて

```py
    www_urls = ','.join([service[service_name] for service_name in service if 'www' in service[service_name]])
    other_urls = ','.join([service[service_name] for service_name in service if 'www' not in service[service_name]])

    print(www_urls)
    print(other_urls)
```
Rails5からRails6にバージョンアップした際のActionText利用の注意点

# 動作環境
- macOS Catalina(10.15)
- Ruby 2.6.3
- RubyOnRails 6.0.0

# 現象
あれれ？
<img width="590" alt="前" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/244fa550-c3f3-b95f-ba2d-5cbd430a719d.png">

# 原因
Rails５でプロジェクトを作成していたため、
WebpackerのJavaScriptを読み込んでいなかった…

あぁ…そうですよね…笑

# 修正
```diff:views/layouts/application.html.slim
    = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
+   = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
```

# 修正後
出来ましたぁぁあ♪
<img width="609" alt="後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/86273cd8-2f5d-3cfc-7585-485ba8ce0b23.png">

# 参考サイト(ActionTextの導入)
　[ゼロから10分でブログが作れる！Rails 6の新機能「Action Text」を試してみた](https://tech.libinc.co.jp/entry/rails6_action_text)
　[Rails6新機能 ActionText使用方法](https://qiita.com/tomokiyao/items/3c22ca9cb916d5c99ca4)
Dockerfile の FROM AS ( multi-stage build ) で複数のイメージを作成して本番・開発環境などを切り替える ( #docker )

# Dockerfile

- curl だけ入ったイメージに curl-only という名前をつける
- curl-only を元に vim も入れたイメージとして curl-with-vim とう名前をつける

```
from alpine:3.10.2 AS curl-only
run apk add curl

from curl-only AS curl-with-vim
run apk add vim
```

# build

- `--target` に AS でつけた名前を指定して docker build する

```
docker build --target=curl-only -t production .

docker build --target=curl-with-vim -t development .
```

```
$ docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
development                               latest              d26a7ed31fc2        11 seconds ago      36MB
production                                latest              6ad1165a2fe5        24 seconds ago      8.34MB
```

# docker run

alpine本体にはcurlもvimもない

```
$ docker run -it alpine:3.10.2 ash
/ # curl
ash: curl: not found
/ # vim
ash: vim: not found

```

production image には curl はあるが vim はない

```
$ docker run -it production ash
/ # curl
curl: try 'curl --help' or 'curl --manual' for more information
/ # vim
ash: vim: not found
/ #
```

development image には curl も vim もある

```
$ docker run -it development ash
/ # curl
curl: try 'curl --help' or 'curl --manual' for more information
/ # vim
```

![image](https://user-images.githubusercontent.com/13635059/67132936-918b4700-f245-11e9-8d9c-0bc0f45af9c7.png)


# docker-compose

ver 3.4 以上で target が指定できる様子

```yml
version: "3.7"
services:
  some:
    build: 
      context: .
      target: curl-with-vim
```

```
docker-compose build

docker-compose run some

vim
```

# Dockerfile の案

AS に環境名をつけてしまっても良いかもしれない

```
from alpine:3.10.2 AS production
run apk add curl

from production AS development
run apk add vim
```

```
docker build --target=production -t production .
docker build --target=development -t production .
```



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2601








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
heroku上でのDB(postgres)リセットからのmigration実行方法

毎回いちいち探して確認しているので、備忘録としてアウトプット

#### 実行環境
- Rails: 5.2
- PostgreSQL: 11.5

## 実際行った手順

まず、下記でmigrateしたいので, DBリセットしようと思い下記を実行

```
# ローカルから
$ heroku rake db:migrate:reset

ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```

上のエラーで言われた通り実行

```
$ heroku rake db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1

FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
Couldn't drop database '○○○○○○○○○○'
rake aborted!
PG::ConnectionBad: FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
```

権限がないとのことでRailsからDBリセットできない。
しかたないので、

```
# DBに直アクセスしてDBリセット
$ heroku pg:reset DATABASE_URL

 ›   Warning: heroku update available from 7.19.4 to 7.33.3
 ▸    WARNING: Destructive action
 ▸    postgresql-polished-○○○○○ will lose all of its data
 ▸    
 ▸    To proceed, type AAAAAAAAA or re-run this command with --confirm AAAAAAAAA
 
# 指示されたように下記を入力
> AAAAAAAAA

resetting postgresql-polished-○○○○○... done
```

DBがリセットされたので、migration実行。

```
$ heroku run rails db:migrate

Running rails db:migrate on ⬢ AAAAAAAAA... up, run.6493 (Free)
# いつものmigrationの実行時のログ
```
成功！

以上。
Jetson NanoでRustを始める

C/C++を置き換える言語として、調査していたところ、AIで注目されているpythonをおさえて3年連続で好きな言語第1位「Rust」と見つけた。
気になり、早速、試してみることにしました。

# 前準備
Jetson nano Developerの公式ページより、OSイメージファイルをダウンロードし、microSDヘ書き込みます。
macOS, Windows, Linuxにて、操作手順が異なります。
https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

# IPアドレスを確認する
```
$ ip address
```
TIPS:ifconfigコマンドは非推奨になってしまったので、今後はipコマンドを使いましょう。

# 必要なパッケージをインストール
```
$ sudo apt -y install curl
```

# Rustをインストール
```
$ curl https://sh.rustup.rs -sSf | sh

Current installation options:

   default host triple: aarch64-unknown-linux-gnu
     default toolchain: stable
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>
```
1を選択し、ディフォルトでインストールします。

# パスを反映する
```
＄ source $HOME/.cargo/env
```
# Rustのバージョンを確認
```
＄ rustc -V
```
TIPS:2019年10月19日時点で下記の通りでした。
rustc 1.38.0 (625451e37 2019-09-23)

# プロジェクトファイルを作成
```
$ cargo new hello
$ cd hello
$ cat src/main.rs
fn main() {
    println!("Hello, world!");
}
```
TIPS:Hello Worldコードは自動生成されます。

# Rustをコンパイル・実行
```
$ cargo run
```

# まとめ
- Rustはインストールが簡単
- パッケージ管理はcargo

# TIPS:Rustをアンインストールする方法
```
$ rustup self uninstall
```
データ構造の様々な形態

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#データ構造の種類
この記事では以下のデータ構造について取り上げます。

1. 配列
2. スタック
3. キュー
4. 連想配列
5. 連結リスト

##配列(array)
複数の数値、文字などが並んでいるデータ構造です。
要素の番号にしたがって、値が順番に並んでいます。N個の要素がある場合、要素の番号は0番からN-1番までとなります。番号を指定することで、特定の要素の値を取り出すことができます。図に示すと以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/a112f474-b153-a7de-c830-850cc10e7fe9.png)


##スタック(Stack)
先入れ後出しのデータ構造です。英語ではLast In, First Out(略してLIFO)といいます。先に入れたデータを奥にしまい、直前に入れたものから引き出していきます。
スタックにデータを入れることをPush（プッシュ）、データを取り出すことをPop（ポップ）といいます。図に示すと以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/46651d1b-6c62-16e2-4901-e90b99678749.png)

##キュー(Queue)
先入れ先出しのデータ構造です。英語ではFirst In, First Out(略してFIFO)といいます。
先に入れたデータを出口側にしまい、古いものから引き出していきます。
キューにデータを入れることをEnqueue（エンキュー）、キューからデータを出すことをDequeue(デキュー)といいます。図に示すと以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/2c04a35f-c1d0-bb96-134d-b7e829e0fe2a.png)

##連想配列
配列の一種で、配列の添字(要素番号)の代わりに任意の数値や文字列を含んで管理できるものです。
要素の名前をキー、要素の中身をバリューといいます。Pythonでは連想配列のことを辞書といいます。

##連結リスト
連結リストには、単方向リスト、循環リスト、双方向リスト、三種類があります。

###単方向リスト
それぞれの要素が次の要素を指し示すリストです。最後の要素は指し示すものがないのでNULLとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/7e08fe13-091e-5b9a-a7a1-b273794d954c.png)


###循環リスト
単方向リストとほとんど同じですが、最後の要素が先頭の要素を指し示します。これにより、リストの先頭に戻ってくることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/f37a6fb7-a539-c181-f68b-37ae30a4dc9e.png)


###双方向リスト
それぞれの要素が前後の要素を指し示すリストです。そのため、リストを戻って参照することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/9f7e400f-18df-1ea0-ae64-e3ba8bc73a80.png)

#終わりに
今回は、データ構造の様々な形態を主に図で表現しました。今後は、実際にコードで書き記したいと思います。


#参考URL
[リスト(配列) : データ構造](https://www.codereading.com/algo_and_ds/ds/list.html)
[【python入門者必見！】配列・連想配列を徹底解説 | プログラミング入門ならWEBCAMP NAVI](https://web-camp.io/magazine/archives/14815#i-8)
gradle run で実行する Java の引数は --args で指定できる (Gradle 4.9 から)

## 概要

- gradle run で実行する Java アプリケーションのコマンドライン引数は --args で指定することができる (Gradle 4.9 移行から可能)
- たとえば gradle run --args="aaa bbb ccc" のように指定することで Java のメインクラスの main メソッドに文字列の配列のパラメータをセットできる
- Gradle 4.9 より前では run タスクが実行される前処理を build.gradle に記述することで対処していた

## 記述例

aaa bbb ccc の3つの引数を指定する例。

```
$ gradle run --args="aaa bbb ccc"
```

## 公式情報

[The Application Plugin](https://docs.gradle.org/current/userguide/application_plugin.html)

> Since Gradle 4.9, the command line arguments can be passed with --args. For example, if you want to launch the application with command line arguments foo --bar, you can use gradle run --args="foo --bar" (see JavaExec.setArgsString(java.lang.String).

## 動作確認

OpenJDK 11.0.2 と Gradle 5.6.2 で動作を確認済み。

build.gradle と実行用の App.java を用意する。

```
$ tree
.
├── build.gradle
└── src
    └── main
        └── java
            └── com
                └── example
                    └── App.java
```

build.gradle ファイル。

```build.gradle
plugins {
  id 'java'
  id 'application'
}

repositories {
  mavenCentral()
  jcenter()
}

application {
  mainClassName = 'com.example.App'
}
```

App.java ファイル。

```java
package com.example;

public class App {
  public static void main(String[] args) {
    System.out.println("args.length=" + args.length);
    for(String arg: args) {
      System.out.println(arg);
    }
  }
}
```

引数なしで gradle run を実行する。

```
$ gradle run

> Task :run
args.length=0

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
```

引数ありで gradle run を実行する。

```
$ gradle run --args="aaa bbb ccc"

> Task :run
args.length=3
aaa
bbb
ccc

BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date
```

## Gradle 4.9 より前の対処方法

build.gradle に run タスク実行時の処理を追加する。

```build.gradle
run {
  // args プロパティが存在する場合は run タスクの args に渡す
  if (project.hasProperty('args')) {
    // 半角空白文字で分割して渡す
    args(project.args.split('\\s+'))
  }
}
```

gradle run 実行時に args プロパティを指定すると、Java アプリケーションの引数として渡される。

```
$ gradle run -Pargs="aaa bbb ccc"

> Task :run
args.length=3
aaa
bbb
ccc

BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date
```

## 参考資料
- [The Application Plugin](https://docs.gradle.org/current/userguide/application_plugin.html)
- [Gradle User Guide - 14.2. Gradleプロパティとシステムプロパティ](http://gradle.monochromeroad.com/docs/userguide/tutorial_this_and_that.html#sec:gradle_properties_and_system_properties)
- [gradle 最低限個人的まとめ \- Qiita](https://qiita.com/y-sugasawa/items/6a589460c716fcd08e38)
DjangoでCSSを適用してみる(初学者がどこまで理解できるか(5))

#DjangoでビューにCSSを反映してみます
[Djangoとビュー画面、データベースを紐付ける(初学者がどこまで理解できるか(4))](https://qiita.com/nn24nHi/items/910be32e0ee3eebc3018) の続きです。
ビュー画面がHTMLだけだと寂しいので、今回はCSSで装飾を付けてみました。
構成は特に凝ったものではありませんので、DjangoでCSS、こうやって適用するんだと参考にいただければと思います。
(HTML, CSSの中身は割愛させていただきます)

##CSSのファイルはどこに作る？
```css
/* practice/myapplication/static/myapplication/style.css */

/*内容はお好みで*/
**********
body{
  margin:0px;
  font-family: "メイリオ", sans-serif;
  font-size: 20px;
  width: auto;
  color: #333333;
}
**********
```
CSSファイルは、アプリフォルダ直下に、`static/アプリ名`フォルダを作成し、その中におきます。
これは、`settings.py`内に、`STATIC_URL = '/static/'`と、指示が記されているためです。
*static＝静的ファイル。つまりCSSを含む。

##HTMLファイルへの指示はどうする？
```html
<!---各HTMLファイル--->

<!---head部に、下2行を追加--->
<head>
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'myapplication/style.css' %}">
```
HTMLへの反映も、「%」で囲まれている箇所を除くと、通常の適用方法と変わりません。
「href」で指定した。`'myapplication/style.css'`は、作成したcssファイル名を記載します。
これで、CSSの適用は完了です。

##別途変更点1 (日付を選択型に変更)
```py
#### practice/myapplication/forms.py

from django import forms
from .models import Payment


class PostForm(forms.ModelForm):
    class Meta:
        model = Payment
        fields = ('payment_date', 'payment_type', 'payment_name', 'payment_price')
# 日付データを、input要素からselect要素に変更
        widgets = {
                'payment_date': forms.SelectDateWidget
                }

```
前回のpost.htmlでは、日付の選択ができず、手入力が必要でした。
それをタブから選択するように変更しました。
Metaクラス内の、`widgets {}`内で、要素を変更させてあげることが可能です。

##別途変更点2 (投稿項目の表示名変更)
```py
#### practice/myapplication/models.py

from django.db import models

class Payment(models.Model):
    PAYMENT_CHOICES = (
        ('Food', '食費'),
        ('Clothes', '衣類'),
        ('Other', 'その他'),
    )
#第一引数で、フィールドに名前をつけます。
    payment_date = models.DateField('日付', blank=True)
    payment_type = models.CharField('項目', max_length=50, choices=PAYMENT_CHOICES, blank=True)
    payment_name = models.CharField('品目', max_length=50, blank=True)
    payment_price = models.IntegerField('値段', blank=True)

    def __str__(self):
        return self.payment_name

```
前回のpost.htmlでは、各項目の表示がフィールド名のままでした。
それを、任意の表示にしたいので、フィールドに名前をつけてあげました。

〜myapplication/post/〜
<img width="350" alt="スクリーンショット 2019-10-19 8.48.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498092/922d3731-fae7-3643-68ef-48cfd8e0f081.png">

〜〜myapplication/payment_result/〜〜
<img width="836" alt="スクリーンショット 2019-10-19 8.51.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498092/c9e0e14c-e5c8-5623-9f36-391b9b9e797b.png">

##さいごに
作業中、何度かCSSファイルの更新が適用されないことがありました。
僕は開発環境の表示をChromeでやっていましたが、どうやらChrome内のキャッシュが原因のようでした。

もしCSSの反映がされない場合は、
1.static/の位置が正しいか
2.makemigrationsとmigrateコマンドを実行したか
3.ブラウザのキャッシュが残っていないか
など確認してみてください。(まずはエラ〜ログの確認)
シンプソンのパラドックス超概要　〜因果関係は重要だ〜

**シンプソンのパラドックス**ってご存知ですか？

同じデータなのに「全体で見るか」「分割して見るか」で見え方が変わるという面白い事象です。

また、面白いだけでなく**データを扱う上での大事な考え方**を教えてくれます。

今日は**受験生の悩み**という、比較的身近な話題を例に**シンプソンのパラドックス**について述べてみたいと思います。

# 受験生の悩み

一年後に受験を控えた受験生の太郎さんは、これから本格的に受験勉強しようと思っています。

勉強にあたり「A塾に通うか？」「自力で勉強するか？」悩んでいて、情報を収集しています。

## 最初に入手した情報

過去の情報から合格率を比べてみると、**A塾生の方が高い**

<img width="1276" alt="スクリーンショット 2019-10-19 9.14.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177899/aca96359-97dd-578f-5ea4-afe195777f67.png">

太郎さんは

>「気持ち程度だが、塾生の方が合格率上なんだったら通ってみるか」

と思いました。

## 次に入手した情報

そこに新たな情報、さっきと同じデータを２つのグループに分割して比べると**一般受験生の方が合格率が高い！**

![スライド2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177899/e8e04b98-b6f1-a837-a9ad-1783a28adfda.gif)

太郎さんは

>「確かに全体で見るとA塾生の方が合格率が高いが、それを分けたグループA,Bは両方とも一般受験生の方が合格率が高い、どちらを信じればいいのか？」

と悩んでしまいました。

これがシンプソンのパラドックスと呼ばれる状態です。

# 同じ数字から異なる判断が生まれる

実は、ここまでの情報だけでは「どちらを信じればいいのか？」の判断はつきません。

**「何を基準にグループ分けされているか？」**を知って初めて判断が出来ます。

以下、２つの異なるシナリオで太郎さんの判断をみてみましょう。

## シナリオ１　事前の学力テストでグループ分け

この分類が**「入塾前に事前に実施された学力テストの結果」**に基づく分類だとわかったとします。

![スライド3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177899/c4b2ac79-9888-da95-f3fc-4c3db2419f81.gif)


これをみた太郎さんは

>「もともと学力の高かった受験生がA塾に入ってるようだ、A塾の合格率が高いのはもともと学力の高い受験生がたくさんいるからで、塾の効果とは言えなそうだ」

と結論づけ、自力で勉強する道を選びました。

## シナリオ２　勉強時間でグループ分け

この分類が**「夏休み終了時（時期的には入塾の５ヶ月後）に調査された1日の勉強時間」**に基づく分類だとわかったとします。

![スライド4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177899/d4d6cae4-eeff-2c25-876a-d1c3a2b79e91.gif)


これをみた太郎さんは

> 「A塾に入ると勉強する習慣が身について、それで合格率が上がっているのか、塾の効果ありそうだ」

と結論づけ、入塾を決めました。

# データの因果関係を把握しよう

同じ数字で太郎さんの選択結果が違ったのは、太郎さんが想定した**データ間の因果関係**が違うからです。

## 事前の学力テストのケース

太郎さんは頭の中で

![スライド5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177899/55fb7c6e-b55c-6553-1e5d-748d1b3cdff6.gif)


>「事前の学力が、入塾と合格率の両方に影響を与える」

という因果関係を想定し、事前学力で分類された合格率を元に判断しています。

## 勉強時間のケース

太郎さんは頭の中で

![スライド6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177899/b371691d-284f-4c69-e3f3-d92e5ec66f99.gif)


>「入塾が、勉強時間に影響を与え、勉強時間が合格率に影響を与える」

という因果関係を想定し、全体の合格率を元に判断しています。

## 因果関係

このように、データ間の因果関係をどのように想定するかで、データを見る適切な切り口は変わってきます。因果関係の理解は適切なデータ分析のために重要です。

以上、シンプソンのパラドックスについて超概要を述べてみました。

因果関係について、もっと詳しく知りたい方は下記の書籍をおすすめします。

# 参考書籍

[asin:B071CD9CMP:detail]



[asin:4254122411:detail]
[f:id:kenshi18:20191019080944g:plain][f:id:kenshi18:20191019081023g:plain][f:id:kenshi18:20191019081026g:plain][f:id:kenshi18:20191019081029g:plain][f:id:kenshi18:20191019081031g:plain][f:id:kenshi18:20191019081034g:plain]
データ可視化ツール「SandDance」を触ってみた

触ってみたのでメモを残しておきます。
# SandDance
Microsoftが公開したオープンソースのツールです。
[公式サイト](https://sanddancehome.azurewebsites.net/)
[公式ブログ](https://cloudblogs.microsoft.com/opensource/2019/10/10/microsoft-open-sources-sanddance-visual-data-exploration-tool/)
[Github](https://github.com/Microsoft/SandDance)
# 試し方
触ってみるだけなら、[web版](https://sanddance.js.org/app/)が簡単でした。
# Sample data
サンプルデータとして

* Demo Vote (アメリカの選挙データ)
* Titanic (Kaggleでおなじみのタイタニックデータ)

が用意されています。
# 機能
3次元データをColorマップで表示できます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167274/ed515a7d-1a21-13f0-36aa-b8b6ccb46172.png)


マウスホイールで拡大縮小ができて、Chartにカーソルを置くと、他のcolum情報が表示されます。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167274/80a4e532-263a-fcca-0387-85b06d671770.png)


右上のボタン（Center chart in window）で元の位置とサイズに戻せます。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167274/ee1cf236-12ce-e71e-412f-34aebe55e622.png)


指定のcolor chart（0.6～0.7）のみ強調表示することもできます。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167274/ddfdcf45-2cf3-8a37-01e8-bc11ee854863.png)


# 感想
とてもヌルヌル動いて快適です。他にも色々なグラフがあるので、今度はサンプル以外のデータを使って触ってみたいと思います。
iPhone や iPad をキオスクモードにして特定のウェブサイトのみを表示させる方法

### 概要
iPad を展示会の会場に置いて、自社のウェブサービスをデモすることになった。ユーザーが iPad を自由に使えるという状況で、特定のウェブサイトのみを利用できるようにする必要があった。ペアレンタルコントロールとアクセスガイドの合わせ技で設定できた。なお、OS のバージョンは 13.1.2。

### ペアレンタルコントロール
「コンテンツとプライバシーの制限」を使って、Safari で特定のウェブサイトのみを表示するようにする。

1. 「設定」で「スクリーンタイム」をタップ
1. 「スクリーンタイムをオンにする」をタップ
1. 「続ける」をタップ
1. 「これは自分用のiPhone/iPadです」をタップ
1. 「スクリーンタイム・パスコードを使用」をタップしてパスコードを設定
1. 「コンテンツとプライバシーの制限」をタップ
1. 「コンテンツとプライバシーの制限」をオンにする
1. 「コンテンツ制限」をタップ
1. 「Webコンテンツ」をタップ
1. 「許可されたWebサイトのみ」をタップ
1. デフォルトで許可されているサイトをすべて削除
1. 「Webサイトを追加」をタップ
1. 「タイトル」と「URL」を入力
1. その他の項目を適宜設定

### アクセスガイド
「アクセスガイド」を使って、Safari のみを使用できるようにする。

1. 「設定」で「アクセシビリティ」をタップ
1. 「アクセスガイド」をタップ
1. 「アクセスガイド」をオンにする
1. アクセスガイドを開始するために使うボタンを確認しておく
1. 「パスコード設定」をタップ
1. 「アクセスガイドのパスコードを設定」をタップしてパスコードを設定
1. その他の項目を適宜設定
1. Safari を開く
1. 指定されたボタンを 3 回押す
1. 「オプション」とタッチを無効にする領域を適宜設定
1. 「開始」をタップ
macOSをcatalinaにアップデートしたらvagrant upできなくなった

#はじめに
macOSをcatalinaにアップデートしました。
laravelの学習にhomesteadを使用していたので、確認のためvagrant upしてみたがエラーで起動できませんでした。

#現象
vagrant upで以下のエラー

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: Permission denied
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage: error: Context: "RTEXITCODE handleCreate(HandlerArg *)" at line 94 of file VBoxManageHostonly.cpp
```

#対策
いろいろ調べたところ、virtualboxが悪さをしていると思い、

`virtualbox -V` 

でバージョンを確認したところ、最新版があるとのことなので、インストールしました。

インストール後改めてvagrant upしたとこ、無事起動しました。
vagrant sshで接続も成功しました。
Eigenのインストール方法（WSL）

## はじめに
* [WSLでのC\+\+の外部ライブラリの管理について \- Qiita](https://qiita.com/nishiys/items/5772e3912f9de735c3d4)

インストール先の話など細かいところは割愛しているので，わからない場合はこちらの記事を先に読んでください．

## 方法①
aptでインストール．
`$ sudo apt install libeigen3-dev`
/usr/include/eigen3/にインストールされます．
## 方法②
公式のダウンロードページからダウンロードして自分で配置する．

* 公式のダウンロードページ：[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page#Download)

適当なディレクトリで解凍すると，
`eigen-eigen-323c052e1731`のような長い文字付きのディレクトリ以下にいろいろ入っているのが確認できると思います．（文字の部分は環境や日時で変わります．）
本体は`eigen-eigen-323c052e1731/Eigen/`以下なので，これを`/usr/local/include/`以下にコピーしてあげればいいです．

```
$ sudo cp -r eigen-eigen-323c052e1731/Eigen/ /usr/local/include/eigen3
```

※Eigenはヘッダファイルをインクルードするだけで使えるようになっているのでビルドする必要はないようです．

## [追記] 使用法
Eigenのような標準ではない外部ライブラリを使用する際は，プログラムに

```
#include<...>
```

と書いたうえで，コンパイル時に

```
$ g++ main.cpp -I ライブラリのパス
```
とするのが基本です．

<>でincludeしたものを探すパスリストはg++の-vオプションで確認できますが，僕の環境で確認したところ/usr/local/includeが入っていたため（どの環境でも入っているかもしれません．不明です．）コンパイル時には特にインクルードパスを指定しなくてもコンパイルできました．

```main.cpp
#include <iostream>
#include <eigen3/Dense>
using Eigen::MatrixXd;
int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}
```

```
$ g++ main.cpp
```
コードは『[C++行列計算ライブラリEigen入門](https://qiita.com/yohm/items/a03006790dc1e54a87be) 』から拝借させていただきました．
上記記事ではincludeの部分が`#include<Eigen/Dense>`となっています．他の記事でもこのように記述されていることがほとんどですが，

僕の環境で`$ ls /usr/local/include/eigen3`の結果は以下のようになっているため，これで問題なく動きました．もしかするとmacとwindowsの違いが何かあるのかもしれませんが定かではありません．
詳しい人いたら教えてください．


```
CMakeLists.txt  Eigenvalues             MetisSupport     SPQRSupport     SparseQR        src 
Cholesky        Geometry                OrderingMethods  SVD             StdDeque       
CholmodSupport  Householder             PaStiXSupport    Sparse          StdList        
Core            IterativeLinearSolvers  PardisoSupport   SparseCholesky  StdVector      
Dense           Jacobi                  QR               SparseCore      SuperLUSupport 
Eigen           LU                      QtAlignedMalloc  SparseLU        UmfPackSupport 
```
vbsの作法 その41

#概要

vbsの作法調べてみた。
練習問題やってみた。

#練習問題

中学生でも、使えるrpaツールを作れ。
日本語で、IE操作して、google開け。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a2f24404-8d58-6e2d-5244-00db6bdf360b.png)


#環境

windows7 64bit


#命令文

```
「 https://www.google.co.jp 」を開く。
「 q 」を探索。
「 マセラティ 」と入力する。
実行
```

#命令文の意味

インターネットエクスプローラーで、google開く。
インプットボックスを名前で探せ。
マセラティと打つ。
エンターしろ。

#サンプルコード

```
Dim oIE
Dim App6
Dim Appflg
Dim sh
Set oIE = CreateObject("InternetExplorer.application")
Set App6 = Createobject("OHIcompo6.srv")
Set sh = CreateObject("WScript.Shell")
WScript.ConnectObject App6, "App6_"
App6.text = "「 https://www.google.co.jp 」を開く。" & vbcrlf & "「 q 」を探索。" & vbcrlf & "「 マセラティ 」と入力する。" & vbcrlf & "実行" 

Sub waitIE
	Do While oIE.busy
		WScript.Sleep(1000)
	Loop
	Do While oIE.Document.readyState <> "complete"
		WScript.Sleep(1000)
	Loop
End Sub

Sub App6_exit()
	Appflg = 2
End Sub

Sub App6_ok()
	Dim lines
	Dim n
	Dim line
	Dim i
	oIE.Width = 800
	oIE.Height = 600
	oIE.Left = 10
	oIE.Top = 10
	oIE.AddressBar = True
	oIE.MenuBar = False
	oIE.StatusBar = False
	oIE.Toolbar = True
	oIE.Visible = True
	lines = Split(App6.text, vbCrLf)
	For i = 0 To UBound(lines)
		If Left(lines(i), 1) = "「" Then
			line = Split(lines(i), " ")
			If line(2) = "」を開く。" Then
				oIE.Navigate line(1)
				sh.Run "%windir%\System32\rundll32.exe MouseControll.dll, _SetMouseXY@16 100, 100"
				sh.Run "%windir%\System32\rundll32.exe MouseControll.dll, _LeftClick@16"
				Call waitIE
			End If
			If line(2) = "」を探索。" Then
				n = line(1)
			End If
			If line(2) = "」と入力する。" Then
				oIE.document.getElementsByName(n)(0).value = line(1)
			End If
		End If
		If Left(lines(i), 2) = "実行" Then
			sh.SendKeys "{enter}"
		End If
		WScript.Sleep 1000
	Next
End Sub

Do
	WScript.Sleep(100)
	App6.ping
Loop until Appflg = 2
Set App6 = Nothing
Set sh = Nothing
Set oIE = Nothing



```

以上。
MacでRubyバージョンアップ

### バージョン確認

```
~/Desktop ❯❯❯ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
```

### rbenvのアップデート

```
brew update
brew install rbenv ruby-build
brew upgrade rbenv
```

### インストール可能なバージョン一覧

```
rbenv install --list
```

### バージョンを `2.6.0` に指定してバージョンアップ

```
rbenv install 2.6.0
rbenv global 2.6.0
sudo gem install railties && rbenv rehash
```

### バージョン確認

```
~/Desktop ❯❯❯ rbenv versions
  system
* 2.6.0 (set by /Users/yuta/.rbenv/version)
```
【開発日記】薬価検索アプリno.1 〜開発概要→企画〜

今日からオリジナルアプリケーションの開発に取り掛かりはじめました。その記録を少しずつ残しながら、Railsでのアプリケーション開発の手順も残していきたいと思います。

##出来上がりのサイト
薬価検索アプリmedipraはこちらです
→　[見に行ってみる](https://www.medipra.net)

#開発背景
　私は現役の薬局薬剤師なのですが、日常業務で薬価（薬の１錠あたりの値段）を調べたり、先発品と後発品の関連を検索することがあります。既存のサイトはありますが、もう少しオリジナルの機能が欲しくなったので作ることにしました。
　ここまでだと薬剤師などの医療従事者だけのアプリになってしまいますが、もっと一般の方、特に処方箋をもらった方にも恩恵があるような機能も予定していますので、公開できるようになった時は是非使ってみてください。そしてフィードバックをお願いしますね！

#開発の流れ
大まかに４ステップに分けます。
企画→設計→開発→公開

###企画
サービス概要、サービスの対象となるユーザーなどを考えます。
5W1Hを考えると良いと思われます。

###設計
企画を元に、実際のUIや、DB設計などを行います。
ルーティングの設定、コントローラーやモデルの見通しなんかを作ります

###開発
設計を元に実際にコードを書いて開発していきます。

###公開
デプロイして、誰もが使えるように公開します。
AWSなどを使います。


#開発手順

1.必要な機能の洗い出し
2.必要な画面設計
3.データベース設計
4.Railsでアプリケーションの雛形作成
5.大きな機能から順に実装
6.テストコードを書いて動作を担保する
7.リファクタリングして整理する
8.デプロイ



#企画
では早速企画から始めます。
一部、まだ公開できない部分がありますが、あらかじめご了承ください。

##背景
日常業務を行っていて、薬価が必要になるときがしばしばある。既存サイトは存在するが、機能的に不十分な点があり、それを改善したい。
また、一般ユーザーに向けた仕様にすることで、医療の不透明性を改善したい。

##サービス概要
薬の値段、処方箋の値段がわかるサービス。

##想定しているユーザー
薬剤師、および、薬局関係者。
機能拡充後は一般ユーザーにも。

##想定している使用場面
薬価情報が必要になった時。
先発名や後発名がわからない時。
処方箋の値段が知りたい時。
薬局に入る前や処方箋を受け取った時。

#まとめ・所感
アプリ開発！となるとすぐにrails newとかしてすぐに開発に取り掛かりたいところですが、そこは一度グッとこらえないといけないですね。やはり最初に出来るだけアプリの全容を描かなければなりません。誰にどんなサービスを届けたいのか、などの大きな方針がないと、開発を進めていく段階で判断にブレが生じチグハグなサービスとなってしまいます。考えすぎて動けなくなるのも避けたいですが、最初の企画段階でいろんなことを考えておきたいですね。

では、[【開発日記】薬価検索アプリno.2 〜設計〜](作成中)に続きます。
WSLでのC++の外部ライブラリの管理について

## はじめに
最近C++を勉強中なのですが，自分のWindowsPCのWSL環境でC++を書くことが多くなってきたので，外部ライブラリをどう管理するのがいいのか調査しました．その内容を備忘録的に残しておきます．

## C++にはパッケージマネージャはあるのか
* [C\+\+ でライブラリを include したい場合は、基本的にダウンロードする必要があるのでしょうか？ \- スタック・オーバーフロー](https://ja.stackoverflow.com/questions/45012/c-%E3%81%A7%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92-include-%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF-%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B)

上記リンクの質問の回答にもありますが，結論から言うとPythonでいうpipのようなパッケージマネージャーはあります．ただ僕の認識だとそれほどメジャーではない気がします．ということで今のところ使わない方針です．

## 有名なものは大体aptコマンドからインストールできるように配布されている
Ubuntu（WSL）ならaptが使えるし，macならbrewが使えます．aptだと外部ライブラリは「○○-dev」という風な名前で配布されています．これでインストールすれば，「適切な位置」にパッケージを配置してくれます．
この「適切な位置」は，aptの場合は`"/usr/include/"`以下になります．

* [please difference between /usr/include & /usr/local/include](https://www.linuxquestions.org/questions/linux-software-2/please-difference-between-usr-include-and-usr-local-include-818767/)

## Githubなどから落としてきて自分で配置する場合
aptなどのコマンドを使用せずGithubからcloneして解凍などする場合は，`"/usr/local/include/"`に入れるのが普通なようです．
例えば有名な外部ライブラリであるEigenの公式ページには以下のように書いています．
> On Linux or Mac OS X, another option is to symlink or copy the Eigen folder into /usr/local/include/. This way, you can compile the program with:
> $ g++ my_program.cpp -o my_program 

* [\[Linux\] /usr/local/の使い方まとめ · DQNEO起業日記](http://dqn.sakusakutto.jp/2011/08/linux_usrlocal.html)



## リンク時にライブラリのパスがわからない問題

* [特定のファイルが含まれるパッケージを探す \- Qiita](https://qiita.com/Yuichirou/items/38165af29ab1e2d307f6)

apt-fileコマンドという便利なコマンドがあります．これをインストールしておけば，ファイルの名前さえ分かっていれば検索でライブラリの位置がわかります．
`"/usr/include/"`に入っているのか，`"/usr/local/include/"`に入れたのかわからなくなったときに便利なコマンドです．
C#実務未経験者がMCP 70-483に合格するまで

2019年9月にMCP70-483(Programming in C#)を受験し合格しました。
それを踏まえて合格までの話を記載します。

#Qiitaに投稿した理由
以下のとおりです。
・一度投稿してみたかった。
・自分の勉強方法の反省点など振り返れるようにしたかった。
・過去の合格者の記事を数件見たが、いずれも実務でASP.net等を使用しバリバリ
　設計やコーディングしている人の記事が多く、実務未経験者としての違う視点で記事を書きたかった。

#自己紹介
簡単な自己紹介は以下の通りで、実務でC#に触れたことがありません。
　
　・普段はSEとして、VBを使ったシステム保守を担当しており
  　　.netを見る機会やVSを触る機会はよくあるが、新規で開発した経験はなくC#に至っては経験なし。
　・C#に初めて触れたのはちょうど受験する1年前で、そこから半年は休日等にxamarinでアプリを作ったり、
　　オセロをコンソールアプリで作ったりとお遊び程度。
　・Javaは会社でよく触り、オンラインやバッチの開発経験多少あり。
　
#受験背景
受験することに決めたのは丁度7月中ごろ。実質的に試験を意識して勉強を開始したのは7月末ごろでした。
但し、その前から実際にプログラムを触ったり、文法の本を読んだりしていました。
受験に至った理由ですが、それについては以下の通りです。

　・第三者による技能の証明が欲しかった。
　・.netやC#に対する理解度を知りたかった。
　・.netという観点では実務でも使うし、オブジェクト指向の学習という観点では
　　Javaとも共通点があり、やはり実務にも生きる。(と思っている・・・)
　・MCSA,MCSDは会社から受験料が出る。(但し、参考書代、模試代は別)

#勉強方法
どこまでを勉強期間とするかというと自分としては難しいところがありました。触り始めたところから年表にしてみました。

|No  |時期  |勉強・実施内容  |使用参考書  |
---|---|---|---|
|1|2018年9月<br> ~2019年4月 |アプリケーションの作成  |- |
|2|2019年2月<br>~6月 |文法書読破(1週)|実戦で役立つ C#プログラミングのイディオム/定石&パターン  |
|3|2019年7月末<br>~8月末 |テキスト読破(1週)|Exam Ref 70-483 Programming in C# (English Edition)  |
|4|2019年7月末<br>~8月末 |ビデオ視聴 |Programming in C# Jump Start  |
|5|2019年8月<br>~9月 |問題演習 |measureup 70-483 模試  |

■ 1 アプリケーションの作成
殆どの時間をアプリ作成(xamarin)に費やし、
できそうなことを調べてはコピペをしていただけでした。
どちらかというとXAMLやデータバインディングの実装方法等を調べることが多く
今回の勉強範囲とは違う部分も多くありました。
但し初めて触ったこともあり、最初に比べると多少は言語に慣れました。

■ 2 文法書読破(1週)
2019年2月あたりから、基本的なことは理解するまで勉強したいと思いだし、文法書を
電車の行き帰りで読み始めました。(通勤時間は長いほうです。)
このタイミングでは目標がなかったのでダラダラと4ヶ月くらい掛かりました。
とにかくこの参考書は初学者にとっては分かりやすい、読みやすい、無駄なページも少ないです。
今でも辞書として読み返すことがよくあります。

■ 3 テキスト読破(1週)
7月に入り9月の受験を目標にテキストを購入しました。
結構な時間を費やしましたが、正直英語も得意ではないので、全て完璧に読み込むことは
できませんでした。内容が分からないところはメソッドを検索し
MicroSoftのDocを読むなり、未確認飛行のサイトを見るなりして理解を深めました。
とにかく未確認飛行のサイトは詳しい。
文法書でやった内容もあったため、文法書を読み返すことで復習にもなりました。

■ 4 ビデオ視聴
テキスト読破と平行して、閲覧しました。日本語訳がついていますので何となく分かりますし、
映像の中では実際に実装もしてくれたりもします。
見ていて損はないかもしれないですが、全てが網羅できるわけではないです。


#試験結果
■得点　　　　　　　　　　　　　　　　　　  :　757点　(合格点は700)
■分野別
プログラム フローの管理　　　　　　　　　　:　約75%
型の作成と使用　　　　　　　　　　　　　 　:　約75%
データ アクセスの実装　　　　　　　　　　　:　約75%
アプリケーションのセキュリティとデバッグ 　:　約50%

割合としては、デバッグの分野の正答率が低い結果となりましたが、
この分野の傾向として、使うことのなさそうなdllを選択させられること等
マニアックな内容が多く、仕方ないかと思います。実際熟練者でも落とすようです。

それよりはその他の分野を9割にすることを考えるべきだったかと反省しています。
一概には言えませんが、基本的な内容が多かったように思います。
(例えば要件を満たすLINQの記述、アクセス修飾子について、IDisposableの実装等)
もしもう一度受けるなら、模試で何度も出てくるような頻出問題は
きっちり理解し、誤答しないようにした上で、望みたいです。

一番驚きだったのはネットに落ちていた問題が一字一句同じで丸々出題されていたことです。
因みに「ITShiken」というサイトでたまたま解いたサンプル問題です。

#感想
初学者としてはこの合格によってC#を学ぶ上での第一歩を踏み出せたかなと思っています。
本質についてはどの分野も理解が浅く、座学の勉強も引き続きやりたいですが、
実装をしていく上での方が理解が進むかなと感じています。
非同期処理など実際に実行してみないとイメージが付きづらいと私は考えます。

後、受かりたいのならMeasureUpの模試よりその辺に落ちている実際の過去問の方がいいでしょう。そのまま出たりするので。MeasureUpやると問題にも慣れるし、知らなかった知識もつくのでお金は掛かりましたが、個人的にはやって良かったと思ってます。

#次の目標
MCPという観点では、ASP.net及びUWPを受験予定です。MCSA欲しいですし。
またせっかく色々学習したので、WPFやWinFormsを使ってモノを作って、ソースをどんどん公開していきたいです。
プレハブから生成したインスタンスの子オブジェクトを取得する

プレハブから生成したインスタンスの子オブジェクトを取得したかったのだけど、そのときハマっちゃったので備忘録。

###きみはインスタンスなんだろ、きみの子オブジェクトのことだけを教えてよ！
ゲームのキャラステータス画面を動的に生成する方法を考えていた。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505170/b1eba294-6b34-486d-7c1d-81babf6b79aa.png)

（※キャラ絵は「ゆるドラ」公式の配布物を使用）
上図のようなパネルをまるごとプレハブ化したらいつでもインスタンス生成できるやん！　と喜び勇んでたときのこと。
「さて、インスタンスの女の子に名前をつけるぞ。エマちゃんがいいかな」と思ったものの、プレハブ内のGameObject（上図の場合はパネルの子name）を変更できない。インスタンス自身の子オブジェクトにアクセスする方法がさっぱり分からないのだ。天気の子ではない。
いちおう、プレハブにスクリプトをアタッチして、プレハブのインスタンスが生成されたときにGameObject.Findしてきたらいいことはなんとなく分かったんだけど……。

```sample01.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class sample01 : MonoBehaviour
{
    GameObject UI_Text;

    void Start()
    {
        UI_Text = Gameobject.Find("name");
        UI_Text.GetComponent<Text>().text = "エマちゃん";
    }
}
```

一見、上記sample01.csでなんとかなりそうだけど、これは問題がある。なんと、プレハブのインスタンスが作成されるたびにすべての"name"と名のつくGameObjectを取得してしまうっぽい。
インスタンスを１個しか生成しないのならそれでもいいかもしれないけれど、複数個インスタンスを生成したときは悲惨だ。全然関係ない別のキャラが「エマちゃん」に改名されてしまう（要はすでに生成されているインスタンスの"name"GameObjectを取得してしまうので）。困る。
**「他のオブジェクトのことなんてどうでもいいんだ、きみの子オブジェクトのことだけ教えてよ！」**というお話。

###君の名は、this
インスタンス自身を指す時はthisをつけるといい、ということはなんとなく知っていた。thisさえつければ、インスタンス自身が持つGameObjectをFindできるのではないか。sample01.csのFind部分を以下のように書き換えてみる。

`UI_Text = this.gameObject.Find("name");`

thisは「プレハブにアタッチされたスクリプトのインスタンス」を指す。呪文か。ただ、これだとエラーが出る。gameObject.Findはできない。どうやら他の方法で子オブジェクトを取得するしかないらしい。ここで結構ハマってしまった。

###this.transformできみを追う子ども
調べていくうちに、GameObjectを取得する方法がGameObject.Find以外にもあることにたどり着いた。transform.FindからGameObjectを取得する方法があるらしい。

```sample02.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class sample02 : MonoBehaviour
{
    GameObject UI_Text;

    void Start()
    {
        UI_Text = this.transform.Find("name").gameObject;
    }
}
```
上コードでは、thisでインスタンス自身を指定し、インスタンス自身が持つ"name"GameObjectのtransformコンポーネントを取得している。
transform.Find()の返り値はtransform型なので、GameObject型で取得するため末尾に.gameObjectがついている。これでインスタンス自身の"name"GameObjectを取得できるので、あとはGetComponent<>してやればよい。
やっとインスタンスの子を知れたよ。

※注記
GameObject.Findは重たい処理らしく、あまり用いないほうがよいらしい（特にUpdate内に書くとめちゃ重くなる）。
「ならtransform.Findだけでいいじゃん！」となりそうだが、双方にはいろいろ違いがあるようだ。
参考リンク：[【Unity】Findメソッドの説明・使い方をお伝えする【オブジェクトを取得できる】](https://miyagame.net/find-method/#TransformFind)

今回ハマったのは、参考にしていた入門書や入門サイトでGameObject.Findが頻出していたからだろう。なぜ、重い処理のほうを薦めるんだろう。UnityプログラミングがGameObjectで始まりGameObjectで終わるから、わかりやすさ重視のためかな。
やさしいかわいい女教師が「んじゃあとりあえず、GameObjectってモノに慣れとこっか！」なんて軽いノリだと思うと悪くない気もした。
実際にCSRF攻撃してみた

#はじめに
  CSRFについて解説している記事はたくさんありますが、具体的にどのような方法で攻撃されるのかを
  解説している記事は少ないと思います。
  そこで、今回は実際に脆弱なwebサイトを作り、それに対してCSRF攻撃を仕掛けてみたいと思います。

#CSRFとは
  CSRF(クロスサイトリクエストフォージェリ)は、webサービスの脆弱性を利用したサイバー攻撃の一種です。
  標的となるwebサービスにログイン中のユーザーが、悪意のあるURLを開いた場合にユーザーの意図しないリクエストを標的webサービスに送信されてしまう攻撃です。
  文字で表現しても伝わり辛いので実際に動作を確認してみましょう。

#環境
  ・CentOS 7.7.1908
  ・Apache/2.4.6
  ・PHP 7.2.23
  ・MySQL 5.7.28

#前提
  PHPで以下の機能を持った今回の標的となる脆弱性のある簡素な掲示板アプリを用意しました。
    ・会員登録
    ・ログイン
    ・ログアウト
    ・コメント投稿
    ・コメント一覧表示

#攻撃イメージ
<img width="700" alt"実行結果.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509479/406f7949-314a-6f8a-3115-5a1865295a4b.gif">

#標的サイトの動作確認
  以下のフォームから入力されたコメントをそのままデータベースに登録します。(SQLインジェクションの危険があるのでエスケープ済み)
  更新時、データベースに登録されたコメントがあれば一覧で表示します。

```:index.php
  <form action="" method="post">
    <input type="text" value="" name="comment">
    <input type="submit" value="投稿">
  </form>
```
<img width="700" alt"フォーム.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509479/45242d8e-05b6-96f6-f892-64460d7dc879.gif">

#CSRF攻撃用サイト準備
  CSRF攻撃を行うために別サーバーで攻撃用サイトを立ち上げておきました。
  攻撃内容としては、「__ユーザーが意図しないコメントを勝手に投稿させる__」です。
  なので攻撃用サイトに以下のようなHTMLファイルを用意します。
  ページを開いた瞬間にフォームを自動送信するJavaScriptが実行されます。

```:index.html
<!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>攻撃用サイト</title>
  </head>
  <body>
    <form name="trapform">
      <input type="text" value="〇〇に爆弾しかけた。" name="comment">
    </form>

    <script>
      // フォームを自動送信
      document.trapform.action = "http://192.168.33.10/view/index.php";
      document.trapform.method = "post";
      document.trapform.submit();
    </script>
  </body>
  </html>
```

#CSRF攻撃実施
  ログイン中に攻撃用サイトにアクセスすると、標的サイトに勝手にコメントが投稿されます。
  __link__にはCSRF攻撃用サイトへのリンクが張られています。
※XSS対策としてのhtml無効化処理は意図的にOFFにしています。
<img width="700" alt"実行結果.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509479/406f7949-314a-6f8a-3115-5a1865295a4b.gif">

#原因
なぜこのような攻撃が可能かというと、標的サイト側が「__不特定のフォームからのリクエストを受け付けてしまう__」脆弱性があるからです。
つまり、正規のフォームと、第三者が作成したフォームの区別がついていません。
なので、それらの区別ができるように標的サイト側が対策をしなければなりません。

#対策
CSRF対策として一般的な__トークン__を付与する方法があります。

毎回正規のフォームにランダムな一意な値を付与します。

```:トークン生成
  $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(16));
```

```:index.php
  <form action="" method="post">
    <input type="text" value="" name="comment">
    <input type="hidden" value="<?= h($_SESSION["token"]) ?>" name="token">  ←生成したトークン付与
    <input type="submit" value="投稿">
  </form>
```
フォームからリクエストが来たら、それが正規のフォームからのリクエストかをトークンで区別します。
トークンが一致していれば正規のフォームからのリクエストだと判断できます。

```:サーバーサイド
　　if (isset($_POST["token"]) && $_POST["token"] === $_SESSION["token"]) {
      正規のフォームからのリクエスト
    } else {
      非正規のフォームからのリクエスト
    }
```
DeeptoolsのplotProfileでの結果で，Y軸の値が消える件の修復法

ChIP-seq signalのサマリーとして，Deeptoolsの一機能である，ChIP-seq signalのheatmapを描出するplotHeatmapやChipSignalの平均値をだすplotProfileは使いやすいです。

一方，なぜか私の環境だと(Ubuntu18.04，もしくはCentOS)現在のDeeptools (ver3.3.0)だとplotProfileでのY軸の値が消えてしまいます。

このため，plotProfileのcodeの一部に手を加えてみました。
まず，シェルでplotProfileの中身を見てみると，

```shell
less $(which plotProfile)

#!/home/USER/anaconda3/bin/python
#-*- coding: utf-8 -*-

#import deeptools.misc
#from deeptools.plotProfile import main
#import sys

#if __name__ == "__main__":
#    args = None
#    if len(sys.argv) == 1:
#        args = ["--help"]
#    main(args)
```
となっており，deeptools.plotProfile moduleのmain関数であることがわかります。
つぎに，このmoduleのpathをさがすためinspect moduleを使います。

pythonを立ち上げて，

```python
import deeptools.misc
from deeptools.plotProfile import main
import inspect
inspect.getfile(main)
>>> '/home/USER/anaconda3/lib/python3.6/site-packages/deeptools/plotProfile.py'
```
これで，さきほどのmain関数が，plotProfile.py内の関数であることがわかりました。
実際に，このコードの中身を見てみましょう。再びシェルで

```shell
vim /home/USER/anaconda3/lib/python3.6/site-packages/deeptools/plotProfile.py
```
このコードの中身のうち，plot_profile関数　(def plot_profile(self)のところ)の，
最後の方のax.get_yticklabels(), visible=False (deeptools ver3.3.0だと747行目)を
False >>> Trueに変えてみました。

```python:plotProfile.py

    def plot_profile(self):
.............
            # remove the numbers of the y axis for all plots
747         #plt.setp(ax.get_yticklabels(), visible=False) ###edit here
748         plt.setp(ax.get_yticklabels(), visible=True)
.............
```

この後，無事にplotProfileにY軸が表示されるようになっています。
Cordova build(ビルド)できない 【Windows】

#cordovaでbuildできない
キータや他の方のブログなどでビルドについての記事はありますが、私が困ったところで記事があまりなかったのでメモしました。
Windowsでandroidでの実機実行を目的としています。



##gradleのパスが通ってないといわれる
###gradleをダウンロード
Android Studioをインストールすると自動的にgradleも入るようなのですが、私がインストールしたときはインストール時の設定のせいかgradleが入ってなかったのでAndroid Studio直下にダウンロードして解凍したgradleのファイルを置きました。
(私の場合のパス"C:\Program Files\Android\Android Studio\gradle-5.6.3-bin")

###gradleのパスを通す
ダウンロードできたらパスを通します。
私の場合以下でパス通しました。
C:\Program Files\Android\Android Studio\gradle-5.6.3-bin\bin



##JDKのパス通せっていわれる
cordovaの公式ドキュメントやエラーでJDKのパス通せって言われてるけど通してもエラーが消えない。
JAVA_HOME にJREのパス通したら解決しました。
私の場合"C:\Program Files\Android\Android Studio\jre"でパス通しました。



##参考
公式ドキュメント
https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html
Django  .objects.values でリスト連結方法がわからない(Python)。→解決

リストの連結方法がわかりません。どなた様かご教授よろしくおねがいします。

```python:view.py
class フォームView(TemplateView):
    data = 試験.objects.values('顧客__姓','顧客__名')
    print(data)
#　<QuerySet [
#             {'顧客__姓': '山田', '顧客__名': '一郎'},
#　　　　　　  {'顧客__姓': '安田', '顧客__名': '庄司'},
#　　　　　　  {'顧客__姓': '田中', '顧客__名': '太郎'}
#             ]>
#例のように「顧客__姓」と「顧客__名」を「氏名」のように結合したい。
#(例)
#   <QuerySet [
#              {'氏名':'山田一郎','顧客__姓': '山田', '顧客__名': '一郎'},
#              {'氏名':'安田庄司','顧客__姓': '安田', '顧客__名': '庄司'},
#              {'氏名':'田中太郎','顧客__姓': '田中', '顧客__名': '太郎'}
#              ]>
ニフクラのスクリプト機能でデータストアにアクセスして指定レコードの値を更新する

# はじめに

[ニフクラ](https://mbaas.nifcloud.com)のスクリプト機能を使っていたときに、データストアにアクセスして指定レコードの値を更新するための方法を調べました。見つけた情報を整理して残しておくことにします。

# 例

ここでは例として、データストア内の `Friend` クラスについて、以下の処理を実行する場合を考えてみることにします。

* `objectId` の値で指定されたレコードを更新対象とする。
* 更新対象レコードの `favoriteFood` フィールドに新しい値を設定する。
* 更新対象レコードの `objectId` と、 `favoriteFood` に新たに設定する値は、スクリプトの呼び出し元からリクエストメッセージボディにて指定されるものとする。

# 最初に考えた実装

最初に考えた方法は、 `equalTo()` や `fetch()` を使って対象レコードを明示的にフェッチして、得られたレコードに対して更新処理をおこなうというものでした。

```js:updateFriend.js
module.exports = async function (req, res) {

  // APIキーの指定
  const applicationKey = 'APPLICATION_KEY';
  const clientKey = 'CLIENT_KEY';
  const NCMB = require('ncmb');
  const ncmb = new NCMB(applicationKey, clientKey);

  // パラメータチェック
  const friendId = req.body.friendId;
  const food = req.body.food;
  if (friendId == undefined || food == undefined) {
    // パラメータ未設定時はエラー
    res.status(400).json({
      "hint": "friendId, foodを設定してください。",
      "message": "友達情報の更新に失敗しました。"
    });
    return;
  }

  const Friend = ncmb.DataStore('Friend');
  try {
    const friend = await Friend
      .equalTo('objectId', friendId)
      .fetch()
      .set('favoriteFood', food)
      .update();
    res.status(200).json(friend);
  } catch (error) {
    res.status(500).json(error);
  }
}
```

# より効率的な実装

上の実装でも目的は果たせるのですが、次のコードのようにして、 `new Friend` で得られたオブジェクトに指定 `objectId` を設定した上で更新対象のフィールドに新しい値を設定すると、余計なフェッチ処理をおこなわずにすみます。

```js:updateFriend.js
module.exports = async function (req, res) {

  // APIキーの指定
  const applicationKey = 'APPLICATION_KEY';
  const clientKey = 'CLIENT_KEY';
  const NCMB = require('ncmb');
  const ncmb = new NCMB(applicationKey, clientKey);

  // パラメータチェック
  const friendId = req.body.friendId;
  const food = req.body.food;
  if (friendId == undefined || food == undefined) {
    // パラメータ未設定時はエラー
    res.status(400).json({
      "hint": "friendId, foodを設定してください。",
      "message": "友達情報の更新に失敗しました。"
    });
    return;
  }

  const Friend = ncmb.DataStore('Friend');
  try {
    const friend = await (new Friend)
      .set('objectId', friendId)
      .set('favoriteFood', food)
      .update();
    res.status(200).json(friend);
  } catch (error) {
    res.status(500).json(error);
  }
}
```

# 参考情報

* https://github.com/NIFCloud-mbaas/UserCommunity/issues/795
homebrew で、インストールした mysql　をコマンドラインでの起動、ログイン、停止、する方法

homebrew で、インストールした
mysql　をコマンドラインでの起動、ログイン、停止、する方法


起動　→　$ mysql.server start 
停止　→　$ mysql -u「ユーザー名」 -p『パスワード』
ログイン→　$ mysql.server stop
RailsでActive Recordを介さずに、DBにデータを登録したら、そのままではcreateが通らなくなるから注意が必要

## RailsでDBに直接データを保存すると、何回createアクションをしても、idが重複するようになった？

Active Record便利ですよね。テーブルの結合なども簡単にできるし、一度リレーション作っておけば、多少テーブルの仕様が変わっても、変更のための工数はめっちゃ少なくすみます。

レコードの新規作成等もラクラクで、

例えば、Groupモデル(groupsテーブル)があったとして、データを新規作成しようとした場合、SQLであれば、

`INSERT INTO groups(id,name) VALUES(1,'所属A')`と書くところを、
`Group.create(name:'所属A')`と書くことができます。

でも、開発用にいくつかデータを登録したいという時に、

```rb

Group.create(name:'所属A')
Group.create(name:'所属B')
Group.create(name:'所属C')

```

とか書くのはめんど臭いし、かといってseedでデータを生成するのもなぁ・・・

データに投入できるようなエクセルファイルも持っているし、

**CSVとかで簡単にDBにデータを投入できたら良いのに・・・**

とか思うことがあると思います。

そんな時に、例えばpostgresqlならpgadminや、mysqlならsequel proなどのツールを利用すると、簡単にCSVからデータをDBに流し込むことが出来ます。

（例）csvのデータ

| id | name | 
|:-----------|------------:|
| 1 | 飯塚部        |
| 2 | 豊本部      |
| 3 | 角田部        |
| 4 | 東京本部          |
| 5 | 03部隊       |
| 6 | 人力の車輪部     |

じゃあ、これでDBにCSVでデータを流し込んでと・・・
これで、開発の時用のデータが簡単に登録できだぞ！！

よし、`create`のデータ新規作成の動きでも確かめるか！とか、思ったら、

```rb
Group.create(name:'劇団ふたり部')

RollBack!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "groups_pkey"
DETAIL:  Key (id)=(1) already exists.
#↑ん？
```

なんで、新規作成が通らないの！？

絶対カラム名とか間違えてないのに。

**っていうか、なぜ７行目のはずなのに、idが7で登録しようとするの！？だから、idが重複してるって怒られるんじゃん！！**

とかなって困った時には、
**「Railsのidの自動採番機能（シーケンス、シーケンシャル）」**という物に目を向けてみてください。

## idの自動採番とは（シーケンス,、シーケンシャル）機能とは

知っての通り、Railsは`Active Record`を介して、簡単にDBの操作を行うことができます。

その`Active Record`は、上の例でいう`Group.create(name:'劇団ふたり')`のように、プログラマーがidを意識しなくても、idを採番し、レコードの新規作成が容易にできるようにしてくれているようです。
（これがSQL文だと、きちんとidまで指定しないと、insert文を実行することができませんね）

この自動採番機能ですが、Rails側はどうやって、
次に採番すべきidの番号を把握することが出来るのか！？という所に目を向けてみると、
シーケンシャル（シーケンス）と呼ばれる、「今どの番号まで払い出しているか。」という番号を参照しているようです。

このidのシーケンスですが、`ActiveRecord（モデル）`を介して、レコードの作成が行われた時には、プログラマーが意識することなく、自動で番号を上げてくれるのですが、
今回のように、Railsの機能を通さずに、DBへデータを直接登録した時には、自動で番号を上げてくれません。（そりゃそうですが）

つまり、↑の例でいうと、プログラマー側としては、もうidは６まで採番されているので、次は7に進んで欲しいところが、Rails的にはまだidのシーケンスが１であるため、「idが重複するぞ！！」と怒って新規データが保存されないという状況。

なので、以下のように今のidのシーケンス値はこれですよ〜という風に手動でセットしてあげる必要があります。

```sql
psql --dbに接続

select setval('groups_id_seq',6)
setval 
--------
      6
--setval('テーブル名_id_seq',現在振られているidの最大値)という風に設定
```

ということをすれば、Rails側も次のidは７番だな！
ということが分かり、idの重複もなく、レコードの新規作成が出来るようになります。

ちなみに、このsetvalはpostgresqlの書き方であり、次のようにシーケンスに関する操作を行うことができます。

```sql
--現在のシーケンシャルを確認 
select currval('groups_id_seq');
--次のシーケンシャルを確認
select nextval('groups_id_seq');
```

## まとめ
- Railsの機能を通さずに、DBにレコードを登録した時は要注意
  - idの今の最大値を登録してあげて、Railsが次に採番するidの番号を教えてあげる必要がある
- 可能ならば、データはseedファイル等で用意してあげるとよいと思う
  - チーム開発の場合、メンバー全員のデータが必要になるし、idのシーケンシャルも気にしなくていいし
typesafe-actions で作ったredux stateの型を別途定義しなくて済むようにする

## TL;DR

reducersから生成されるstateの型を作るためのTypeScriptの型実装をしたので最下部みて使ってください。

## 詳細

`typesafe-actions` を使うと、以下のような形でreducerを書けますよね。 (ducks的なmoduleファイル形式にしてます)

```hoge.ts
interface HogeType {
  hoge: string;
}

import { createAction, createReducer } from "typesafe-actions";

const initialState: HogeType = {
  hoge: ""
};

export const request = createAction("REQUEST", resolve => {
  return (hoge: string) => resolve(hoge);
});

const reducer = createReducer(initialState)
  .handleAction([request], (state, action: ReturnType<typeof request>): HogeType => ({
    ...state,
    hoge: action.payload
  }))
export default reducer;
```

これをrecuers.ts などから読み込んで以下のようにするのが、割とありがちな構成かと思います。

```reducers.ts
import Hoge from "./modules/hoge";

const reducers = {
  Hoge
);
export default reducers;
```

この構成で Reactのコンポーネントから `useSelector` や `connect` のmapStateToProps引数などで参照する際、stateの型が欲しいと思うのですが、簡単には手に入りません。
以下のコードで型を `StateType` として手に入れる事ができます。

## 具体的な実装

```recuers.ts

// 上記に加えて...

type ReducersType = typeof reducers;
type StateTypeOf<T extends (...args:any) => any> = NonNullable<Parameters<T>[0]>

export type StateType = {
  [k in keyof ReducersType] : StateTypeOf<ReducersType[k]>
}
```

## 感想

事細かな解説はしませんが、 `NonNullable` や `Parameters` での型取得や、取得した型に対してJSの配列やオブジェクトと同じような `[]` でのアクセスが有効なのは興味深かったです。
Sample

```math
e^{i\pi} = -1
```


```math

\begin{pmatrix}
a_{11} & \cdots & a_{1i} & \cdots & a_{1n}\\
\vdots & \ddots &        &        & \vdots \\
a_{i1} &        & a_{ii} &        & a_{in} \\
\vdots &        &        & \ddots & \vdots \\
a_{n1} & \cdots & a_{ni} & \cdots & a_{nn}
\end{pmatrix}
 
\times
 
\begin{vmatrix}
a_{11} & \cdots & a_{1i} & \cdots & a_{1n}\\
\vdots & \ddots &        &        & \vdots \\
a_{i1} &        & a_{ii} &        & a_{in} \\
\vdots &        &        & \ddots & \vdots \\
a_{n1} & \cdots & a_{ni} & \cdots & a_{nn}
\end{vmatrix}

```