OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】Route/web.phpで構文ミスするとartisanコマンドが動かなくなる問題

#はじめに
プロジェクトファイルをgitからクローンしてartisanコマンドを入力したら以下のエラーがでた。




```
PHP Fatal error:  Uncaught Error: Class 'CommonHelper' not found in /home/vagrant/{アプリ名}/app/Logging/CustomJsonFormatter.php:13
Stack trace:
#0 /home/vagrant/{アプリ名}/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(40): App\Logging\CustomJsonFormatter->format()
#1 /home/vagrant/{アプリ名}/vendor/monolog/monolog/src/Monolog/Logger.php(323): Monolog\Handler\AbstractProcessingHandler->handle()
#2 /home/vagrant/{アプリ名}/vendor/monolog/monolog/src/Monolog/Logger.php(541): Monolog\Logger->addRecord()
#3 /home/vagrant/{アプリ名}/vendor/laravel/framework/src/Illuminate/Log/Logger.php(176): Monolog\Logger->error()
#4 /home/vagrant/{アプリ名}/vendor/laravel/framework/src/Illuminate/Log/Logger.php(87): Illuminate\Log\Logger->writeLog()
#5 /home/vagrant/{アプリ名}/vendor/laravel/framework/src/Illuminate/Log/LogManager.php(547): Illuminate\Log\Logger->error()
#6 /home/vagrant/{アプリ名}/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php(121): Illuminate\Log\LogManager->error()
#7 /home/vagrant/{アプリ名}/app/Exceptions/ in /home/vagrant/{アプリ名}/app/Logging/CustomJsonFormatter.php on line 13

```

#解決するためにした事



##1,composer dump-autoload
クラスがない系のエラーは大体composer dump-autoloadで直ると思っていたら同じようなエラー内容が表示された。

```
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
PHP Fatal error:  Uncaught Error: Class 'CommonHelper' not found in /home/vagrant/{アプリ名}/app/Logging/CustomJsonFormatter.php:13
以下同文
```

どうやらクラスの読み込みが問題ではなく、そもそもartisanコマンド自体が受け入れられていないようだ。


##2,routes/web.phpの構文ミス
あれこれ悩んだ結果、結局routesのファイルで構文ミスをしていただけで、内容は括弧が一行分足りていなかった。
これとCommonHelperのクラスがみつからなくなる因果関係が未だわかっていないが、おそらくLaravelのアーキテクチャに関わるデザインパターンのファイルを間違えるとそもそもクラスの読み込みまで到達してくれないのではないか、その為Stack traceで全く関係のないlog周りの内容が表示されているのだと思います。

#おわりに
同様なエラーが発生された方がいましたら、Laravelのアーキテクチャに関わるデザインパターンのファイルを調べてみてください。
【初心者でもわかる】calc()を使ってロールケーキをキッチリ3等分にする方法

# どうも、7noteです。今回はcalc()をマスターして、1本のロールケーキを3等分して3人で仲良く食べるお話。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/calc/
React.jsをDockerで動かした時のメモ

## 環境

```
$ cat /etc/linuxmint/info 
RELEASE=19.3
CODENAME=tricia
EDITION="Cinnamon"
DESCRIPTION="Linux Mint 19.3 Tricia"
DESKTOP=Gnome
TOOLKIT=GTK
NEW_FEATURES_URL=https://www.linuxmint.com/rel_tricia_cinnamon_whatsnew.php
RELEASE_NOTES_URL=https://www.linuxmint.com/rel_tricia_cinnamon.php
USER_GUIDE_URL=https://www.linuxmint.com/documentation.php
GRUB_TITLE=Linux Mint 19.3 Cinnamon
```

## Dockerのインストール

```
$ apt update
$ apt install docker-ce docker-ce-cli docker-compose
```

## node.jsとcreate-react-appのインストール

```
$ apt install nodejs
$ npm install create-react-app yarn
```

## サンプルReact.jsアプリを作る

```
$ create-react-app docker-test
$ cd docker-test
```

とりあえず普通に起動してみる。

```
yarn start
```

ブラウザで http://localhost:3000 にアクセスしReact.jsが動作していることを確認。
確認できたらCtrl-Cで落とす。

## Dockerfileとdocker-compose.ymlを作成

作成したReactアプリのルートディレクトリに以下のような内容で `Dockerfile` と `docker-compose.yml` を作る。

```:Dockerfile
FROM node:14.4.0-buster-slim
WORKDIR /usr/src/app
RUN npm install --save prop-types
RUN npm install -g create-react-app
```

```yaml:docker-compose
version: '3'
services:
  node:
    build:
      context: .
    tty: true
    environment:
      - NODE_ENV=production
    volumes:
      - ./:/usr/src/app
    command: sh -c "yarn start"
    ports:
      - "3000:3000"
```

上記のような内容だと、作成したReactアプリのルートディレクトリがDocker環境内では `/usr/src/app` にマウントされるため、 WORKDIRを `/usr/src/app` に指定してあれば、実行するスクリプトは `sh -c "yarn start"` だけとなるため、これを `command` で指定している。

[docker-hub node](https://hub.docker.com/_/node/)を見に行くと、`alpine` `buster` `stretch` などの名前がバージョンについています。なんのことかと思ったらLinuxディストリビューションですね。

`slim` とついているものは、Debianディストリビューションでエクストラパッケージが含まれないものです。いずれにしても今回はDockerでnodeが動けばいいので `node:14.4.0-buster-slim` を選択しました。
ちなみにDebianの現在のバージョンは buster(10.0) であり、それ以前は以下のようになります。

```
Debian 10 (buster) — 現在の安定版リリース
Debian 9 (stretch) — 過去の安定版リリース
Debian 8 (jessie) — 過去の安定版リリース
Debian 7 (wheezy) — 過去の安定版リリース
```

[alpine linux](https://alpinelinux.org/)はパワーユーザー向けの軽量Linuxのようです。軽量だけにイメージが小さく抑えられるかもしれませんが、私はDebianやUbuntuしか使ったこと無いので `alpine` の使用はやめておきました。


## Dockerイメージをビルド

```
$ docker-compose build
```

## DockerでReact.jsアプリを実行する

起動

```
$ docker-compose up
```
ブラウザで http://localhost:3000 にアクセスしReact.jsが動作していることを確認。
`Ctrl-C` で停止。

バックグラウンドで起動

```
$ docker-compose up -d
```

停止

```
$ docker-compose down
```
イメージ情報を確認

```
$ docker images | grep dockertest
dockertest_node     latest               daf22d9465c7        26 minutes ago      194MB
```

##  おまけ

すべてのDockerイメージを停止

```
$ docker stop $(docker ps -q)
```
173（ひとなみ）にROS2が使えるようになりたい＃１　ROS2チュートリアルを試す（3）

# このページの目的

[前回](https://qiita.com/kamy9900/items/bc27dee90f9358a31af8)までの中でROS2を使う基礎をてでを動かしながら学んで来ました。
ここからは下記のチュートリアルページを参考に、ROS２のノード・トピック・サービス・パラメータ・アクションの概要をまとめていきたいと思います。

●公式ページへのリンク

| 内容 | 公式ページ |
|:-:|:-:|
|  ノード | https://index.ros.org/doc/ros2/Tutorials/Understanding-ROS2-Nodes/  |
| トピック  | https://index.ros.org/doc/ros2/Tutorials/Topics/Understanding-ROS2-Topics/ |
| サービス  | https://index.ros.org/doc/ros2/Tutorials/Services/Understanding-ROS2-Services/  |
| パラメータ  | https://index.ros.org/doc/ros2/Tutorials/Parameters/Understanding-ROS2-Parameters/  |
| アクション  |  https://index.ros.org/doc/ros2/Tutorials/Understanding-ROS2-Actions/ |

# ノードやトピック　それぞれの概念
##ROSノードとは？
私の認識では「ある機能を持ったプログラムの一つの塊」（つまりクラスや関数に近いイメージ）といった理解をしています。詳細はあっていないかもしれませんが、__大外しはしていない__と思っています。
この、ROSノードがROSネットワーク上にいくつか点在していて、そのノード間で決められたプロトコル（つまりトピックやサービスなど）を使って通信し、お互いの機能を実行するために必要な入力を受け取ったり、出力結果を渡したりしています。

##トピックとは
書籍等には非同期のデータ送信などと説明されていますが、端的に言うと一方的なデータ送信です。
ノードAからノードBに対して、ノードAの好みのタイミングで何かしらのデータを送りつける。そんな形のものです。
私自身のイメージで一番しっくりきているのは__「地上波のTV放送」__ です。
ノードA「テレビ局」はノードB「一般家庭のTV」に対して「こんなニュースがあったよ」とか「こんな食べ物が健康にいい？！」などの__情報__ を（利用者の需要に関係なく）ノードAが活性化中は絶えず送信しています。
トピックの場合、多少データが欠損していても問題ないようなデータ、重要度があまり高くないようなデータを蔵受信するのに向いていると思います。


##サービスとは
同期式のデータ通信とよく説明されています。
これは、あるノードがデータ送信の要請を出して、その要請に従う形で別のノードがその情報を要請元のノードに送付します。
私自身のイメージは__「電話で在庫を確認する」__シーンがしっくりきます。
ノードA「　ノードBさん、商品Xの在庫がいくつあるか教えて」
ノードB「　ノードAさん、現在の商品Xの在庫は１００個ですよ」
ノードA「　OKありがとう」
こんな感じのやり取りをしています。
基本はあるタイミングの最新情報を確実に取得したいデータをやり取りするときに使うのがいいとおもっています。
例えば、現在の速度とか障害物の位置や大きさの様な安全のために必要なデータを取り扱う際に良いと思います。


##パラメータとは
ROSネットワークで共有される様なデータ（変数など）を指します。
個人的にはパブリックな変数に近いイメージを持っていまです。
ROS１では　ROSCoreにのみパラメータサーバがあったのですが、
ROS2からは各ノードにパラメータサーバが用意された様です。
アクセスの仕方が違うようなので、今後トライしてみたいと思います。

##アクションとは
アクションはトピックとサービスのいいとこを組み合わせてできたハイブリッドな通信といったイメージです。
ある通信を実施した際、通信に引数と戻り値があります　→　サービスのイメージ。
ただし、画像認識のように処理時間が長くかかるような処理の場合、処理の進捗状況を知りたくなってきます。
なので、進捗状況などの途中経過でのデータを定期的に配信することができます。
私自身のイメージですが__「ソフトウエアインストール中の画面」__がしっくりきます。
ノードA「XXXXをインストールして！（引数）」
ノードB「はい、インストール開始します」
ノードB「１/N　（YY％）インストール完了したよ」
ノードB「２/N　（YZ％）インストール完了したよ」
・・・
・・・
ノードB「N/N　（１００％）インストール完了したよ」
ノードB「インストールすべて完了！（戻り値）」
実際はもうちょっと違うことをやってるのだと思うのですが
なんとなくこんな感じかなとおもったいます


##終わり
今回は、ROS２の通信の種類について整理していました。
次は実際に　簡単なソフトを書いて、各通信を試してみたいと思います。

※　もしかしたら先にGazeboをROS2で動かす方法の整理をするかもしれません。。。
Excel　シート名・ドキュメント名を関数で取得する

システム作ってたら結構使うので、まとめておこうかと。。。

# 関数でシート名取得
探せば、詳細は出てくるので、結論として関数だけ。
※一度名前を付けてファイルを保存しないと効かないので、注意

```vb:sample
=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))
```

# 関数でドキュメント名取得
こちらも探せば、詳細は出てくるので結論として関数だけ。
※置換で「.xlsx」の拡張子を削除しているので、利用する際にカスタマイズすれば、「.xlsm」なども対応できます

```vb:sample
=SUBSTITUTE(MID(CELL("filename",A1),FIND("[",CELL("filename",A1))+1,FIND("]",CELL("filename",A1))-FIND("[",CELL("filename",A1))-1), ".xlsx", "")
```
【Unity：Log】Android Logcat

Androidのログ確認に使用するmonitorがUnity上で起動できる

UnityのPackageManagerからインストール可能

Window > Analysis > Android Logcat で開く
![android_logcat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/535235f9-8e8c-f846-7b54-b4fe930496ae.png)

UnityHubでUnityインストール時にAndroidの一式をダウンロードしておけば特に他にインストールとかせずに使える

今まで別途JDKとか自分でインストールしてたのがUnityで完結するからとても楽
Nexusリポジトリプロ

### SDLC全工程におけるバイナリ管理とビルドアーティファクト

組織がテクノロジーをより早く提供する必要性から、デベロッパーはオープンソース開発の力を受け入れざるを得なくなっています。**今日では、およそ15,000もの新しい、またはアップデートされたオープンソースのリリースが日々デベロッパーに提供されています。**

これらのコンポーネントが組織に流入し、組織中を駆け巡ることで複雑なソフトウェアサプライチェーンは形成されていますが、適切に管理されなければ、迅速さ、効率、品質に悪影響を及ぼす可能性があります。

Nexusリポジトリマネージャーは、 ソフトウェアサプライチェーン全体におけるコンポーネントパーツ、アセンブリ、完成品の管理と配布を効率的に行うための、普遍的なローカルウェアハウスとして機能します。

**バージョン管理システムやパッケージレジストリは、プロプライエタリやオープンソース、サードパーティのコンポーネントを管理する際、それらの規模の変化に柔軟に対応することはできません。 DevOpsパイプライン全体でこれらのコンポーネントのフローを調整するために、組織には中心となるバイナリやビルドアーティファクトリポジトリが必要となります。**

<img width="1296" alt="nexus-repository-pro-devsamurai-partner-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535698/ae3c954e-7793-e392-2077-bfaf652d2fc1.png">


### デベロッパーに寄り添った設計

スピードが重視される現代社会において、どこにでも存在するオープンソースを使って組織が競争に打ち勝つためには、より迅速な顧客対応が必要です。

最も人気のあるデベロッパーツールとエコシステムに対する普遍的なサポートによって、ソフトウェアイノベーションを加速させます。



### オンプレミスやクラウドにおける柔軟なストレージ機能と信頼性



Nexusリポジトリプロは、信頼できる高性能な可用性によってエンタープライズ環境の原動力となります。

動的ストレージや高い可用性、アクティブ/アクティブ構成によって、オンプレミスやお好きなプライベートクラウドにおけるDevOpsを拡張します。



### 柔軟なストレージ機能とオンプレミスおよびクラウドにおける信頼

Nexus Repository Proはエンタープライズ環境を強化します。信頼があり、高性能なアベイラビリティ（可用性）を備えています。

オンプレミス（またはプライベート）でのDevOpsを実現可能にし、スケーリングクラウド、動的ストレージ、高いアベイラビリティ、アクティブ/アクティブクラスタリングなどをご提供します。



### リリース候補のステージングと管理専用セキュリティ付き

ステージングとリリース機能で、合理的なモニタリングを可能としています。

品質保証プロセスや、バイナリ、スナップショット、リリースを共有します。とても簡単で、テスト、プロモーション、破棄も極めてイージーです。



### 専用セキュリティによるリリース候補の調整及び管理



ステージング及びリリース機能によって、本番前の合理的な監督及び品質保証プロセスが提供されます。

手軽にテストし、採用または破棄することのできるバイナリ、スナップショット、リリースをデベロッパーのグループ間で共有します。



### 世界規模の法人用サポートを備える顧客目線のエクスペリエンス

信用を第一と考えるSonatypeは、当初よりデベロッパー、セキュリティ専門家、イノベーターの皆様と共に歩んできました。

Nexusリポジトリのエキスパートになるためにご活用いただける、クイックスタートガイド、テクニカルガイド、詳細な参考文献、ユーザーコミュニティ、ワークショップ、24時間365日体制のサポートといった、様々な無料トレーニングリソースを取り揃えております。




### Nexusリポジトリを採用するメリット

**✓ 依存関係への再現性のある素早いアクセスによる信頼性の向上。**

**✓ 組織内部で作られたコンポーネントやアプリケーションの共有を可能にすることで、デベロッパーの生産性を合理化。**

**✓ 最も一般的なビルドとデプロイメントツールとの統合によって、DevOpsの拡張性を向上。**

**✓ リリースステージングと高度なタグ付け機能による、市場へのスピード対応およびビルド時間の短縮。**


DevSecOpsについてのお問い合せ
こちらで　[https://www.dssolution.jp/ja/contact-jp/](https://www.dssolution.jp/ja/contact-jp/)
Node.jsのExpressでbody-parserを使いたくないけど特定のハンドラーでだけボディのパースをしたい

特定のURL以下だけパースしたいが、その他の広いパスではパースしたくないみたいなことが5年に1度ぐらい発生するかもしれないので、そのやり方のメモ。例えば99%のリクエストはプロキシーとしてそのまま他のプロセスに流す場合、パース作業はほぼ無駄になってしまうので必要なところでだけやりたいですよね？routerを作ってその下だけbody-parserを適用とかできるならそれでもいいかもしれませんが、微妙にそれもしにくい・・・みたいな場合に。

```ts:app.ts
import express, { Request, Response } from 'express';
// 本当はimportしなくてもいいはずだけどTypeScriptはimportしないとエラーになるっぽい
import { URLSearchParams } from 'url';

app.post('/form/receive', (req: Request, res: Response) => {
    let body = '';
    // streamのAPIを直接扱ってdata/endで情報を読み込む
    req.setEncoding('utf8');
    req.on('data', (chunk) => {
        body += chunk;
    });
    req.on('end', () => {
        // フォームのポストを受け取るのでURLSearchParams.
        // JSONならJSON.parse
        const params = new URLSearchParams(body);
        console.log(params); // パースできてる！
        res.end();
    });
});

const port = process.env.NODE_PORT || 3000;
console.log(`listening at ${port}`);`
app.listen(port);
```
GitHub Pagesを使ったWebページでREADME.mdが初期表示されないようにする。

#結論

1. .githubフォルダ（フォルダ名のドットを忘れずに）を作る。
2. そこにREADME.mdを突っ込む。
3. Webページでindex.htmlが表示されるようになる。
4. もちろん、GitHubではREADME.mdが表示される。
5. 幸せになれる。
Swift UISliderの使い方

初めまして。
初回はUISliderの使い方について書こうと思います。

まず、componentをViewControllerに接続してください。

```swift:ViewController.swift

    import UIKit

    class ViewController: UIViewController {

        @IBOutlet weak var label: UILabel!
        @IBOutlet weak var sliderValue: UISlider!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }

        @IBAction func slider(_ sender: Any) {
        }
    
    }
```

接続後はこんな感じのコードになるかと思います。

ここからはsliderの値をlabelに表示していきます。

```swift:ViewController.swift
@IBAction func slider(_ sender: Any) {
    //slider.valueはFloatなのでStringにキャストしなければいけない
    label.text = String(slider.value) 
}
```

このままだと少数まで表示されてしまうので
`label.text = String(Int(slider.value)) `
にしましょう。

今回はこれで終わります。
MacでJMeterの環境を構築

## 概要
MacでJMeterの環境を用意してみます。
(注: Homebrew, javaは用意されている前提です。)

## 環境
- macOS Catalina 10.15.7
- Homebrew 2.5.7
- Java openjdk 15.0.1 2020-10-20
- JMeter 5.3


## 手順
### Javaのインストール
インストール方法は 「[MacにJavaを簡単に入れてみた](https://qiita.com/A-Kira/items/1adeff127f0384fb0d3b) 」を参考にしてみてください。

### JMeter
Homebrewを使う場合とwebサイトからダウンロードする場合をご紹介します。

#### Homebrewを使う場合(簡単すぎるのでおすすめ)
インストール

```bash
brew install jmeter
```

起動

```bash
jmeter
```

#### ダウンロードの場合
[Apache JMeter](http://jmeter.apache.org/download_jmeter.cgi)からダウンロードします。
mirrorsはそのままでも問題なければ問題なさそうです。(笑)
今回はsourceのzipをダウンロードしてみました。

![スクリーンショット 2020-06-23 18.13.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/59c2c538-e12e-a7d3-0609-0a7ea0ab4010.png)

#### 起動
ダウンロードzipを解凍して、jmeterを実行するとJMeterが起動します。
<img width="913" alt="スクリーンショット 2020-06-23 18.20.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/03258b75-eba8-0883-e506-0f40892315f9.png">

### 確認
上記どちらの方法で取得及び起動しても以下のような画面が開けばOKです。
<img width="1358" alt="スクリーンショット 2020-06-23 18.23.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/dc75fbaf-8886-b165-7009-6c6c263fc62b.png">


## 参考
- [MacにJavaを簡単に入れてみた](https://qiita.com/A-Kira/items/1adeff127f0384fb0d3b)
- [【図解】はじめてでもわかるJMeterの使い方](https://tech-blog.rakus.co.jp/entry/2017/08/24/111332)
- [MacにJMeterを入れる](https://qiita.com/tri-comma/items/94389afaef53b7d8e80e)
【Laravel】laravel new のあとにやること

# 環境
- macOS
- PHP7.4
- Laravel7.x
- SQLite3

# やること
新しくアプリケーションを作成する時、laravel new [アプリ名]を実行した後にすることをまとめました
あくまで筆者の場合なので、参考程度に読んでみてください

- git周辺
- アプリ名、タイムゾーン、言語の設定
- データベースの設定
- メールの設定
- Auth機能の導入
- 日本語化

# git周辺
はじめに、BitbucketやGitHubのリポジトリを作っておきます
以下のコマンドを実行して、リポジトリの初期化、BitbucketやGitHubへの接続を行います
ちなみに筆者は執筆現在Bitbucketを使っています

```zsh
# LaravelAppディレクトリに移動
% git init
% git add -A
% git commit -m "Initialize repository"
% git remote add origin [BitbucketやGitHubのリポジトリ名]
% git push -u origin master
```

# アプリ名、タイムゾーン、言語の設定
- .envファイルのAPP_NAME
- config/app.phpのname、timezone、local

を設定します

```:.env
APP_NAME=アプリ名
```

```php:config/app.php
'name' => env('APP_NAME', 'アプリ名'),
...
'timezone' => 'Asia/Tokyo',
...
'locale' => 'ja',
```

# データベースの設定
今回はSQLiteを使います

- databaseフォルダにdatabase.sqliteを作成
- config/database.phpのdefaultを設定
- .envファイルのDB_変数を設定

```zsh
% touch database/database.sqlite
```

```php:config/database.php
'default' => env('DB_CONNECTION', 'sqlite'),
```

```:.env
DB_CONNECTION=sqlite
```
.envにデフォルトで設定されている他のDB_変数は削除します

# メールの設定
今回はGメールを使うので、あらかじめGメール側でアプリパスワード(16桁)を生成しておきます
アプリパスワードは基本メモを取ったり他人と共有しませんが、環境変数に設定するので覚えておきましょう

- config/mail.phpのdefault
- .envファイルのMAIL_変数

を設定します

```php:config/mail.php
'default' => env('MAIL_MAILER', 'smtp'),
```

```:env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=Gmailアドレス
MAIL_PASSWORD=アプリパスワード(16桁)
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=Gmailアドレス
MAIL_FROM_NAME="${APP_NAME}"
```

# Auth機能の導入
以下のコマンドを実行します
※Laravel5以下はコマンドが異なります

```zsh
// laravel/uiをインストール
% composer require laravel/ui

// Auth関連ファイル(基本的なスキャフォールド)を生成
% php artisan ui vue --auth

// フロントエンドに必要なパッケージをインストール&必要なファイルをコンパイル・ビルド
% npm install && npm run dev
```

# 日本語化
Auth機能を導入したときに自動生成されるファイルがあります
フォームやバリデーションやメールで日本語で表示されるように変更します
日本語化は以下のURLのブログを見たほうがいいです(丸投げ)

https://blog.capilano-fw.com/?p=289#i-3

# おわり
現在ポートフォリオ作成中で同時に記録として記事を書いていこうと思います
WEB三層構造を理解する

##目標
web三層構造について
なんでそんな構造が採用されているのか理解し、
実際のプロダクトの構造と比較して腑に落とす。

##定義
＜WEBサーバー＞
・静的コンテンツを返す
・アプリケーションサーバーに動的コンテンツを要求し、返ってきた結果を返す

＜webアプリケーションサーバー＞
webサーバーからのリクエストをJava、Ruby、PHPなどを実行して処理し、
動的コンテンツを生成して返す。
必要であればデータベースサーバーにリクエストして取得したデータを加工して埋め込んだ結果を返す

＜データベースサーバー＞
データの保管場所はストレージ。
ストレージとやりとりするサーバー。

##なぜわざわざ分けている？？
メリット
・負荷分散
・耐障害性の確保
・セキュリティ

デメリット
・物理的なコストがかかる

##疑問１
なんで負荷分散になるのか？
普通に考えたら分ける方が通信によるオーバーヘッドで無駄が多い気がするんだが。
モノシリックなシステムの何がいけないの？

##実験
モノシリックなシステムと３層に分けたシステムを両方用意してパフォーマンスを比較する。
とりあえずDockerでやってみる。
vistaでquartus その12

#概要

vistaでquartusやってみた。
俺cpuを動かした。

#環境

windows vista 32bit
quartus ii v13.0
ep2c5t144ボード

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/46329f4f-99d9-3302-35e1-7df1b015ef25.png)

以上。
EigenでEigen value/vectorを指定個数だけ計算する

# やりたいこと： Eigenで固有ベクトルの個数を指定して固有値分解する
Eigenで普通に固有値分解するときは`SelfAdjointEigenSolver`テンプレートを使えばいいのですが、これを使うと，全部の固有値・固有ベクトルが計算されます．固有値分解は計算量の大きな処理なので一部の固有ベクトルのみほしい時には計算を早めに切り上げた方が効率がいいのですが，このテンプレートにそのようなオプションはありません．

# やり方
`unsupported/` の中にある`ArpackGeneralizedSelfAdjointEigenSolver`テンプレートに第２仮引数にソルバーを指定してあげれば良いです。
ただし、一部のソルバーはコンパイルエラーが出ます。
また、`libarpack`をリンクしてあげないと、ランタイムでエラーが出ます。（libblas, liblapackとかも必要）

```C++
#include <unsupported/ArpackSupport>

size_t num_ev = 3; // 3個だけ固有値を計算する
Eigen::MatrixXXf covariance =  input.adjoint() * input;
Eigen::ArpackGeneralizedSelfAdjointEigenSolver<
         decltype(covariance),
         Eigen::LLT<Eigen::MatrixXf> // コレスキー分解ソルバ
> eigs(covariance, num_ev);
Eigen::MatrixXXf ev = eigs.eigenvectors();
```
ローカル環境からHerokuで出たエラー

#Herokuへのデプロイ

本番環境としてHerokuを使用した際

```
$ heroku --version
```
すると

```
/usr/local/heroku/bin/heroku: line 44: /usr/local/heroku/bin/node: cannot execute binary file
```
というエラーが発生しました。


実は「$ heroku --version」　を実行する前

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```
を実行しました。

これ、
RailsチュートリアルでCloud9を使用して
アプリ開発を進める際は
このコマンドを使用してください。

というものだったのですが
そのままローカル環境でも流してしまいました。。

その後、「そうだった。。」
と気づくわけですが、
なにやらその際に余計なファイルを生成しているようで
うまくいかない模様。


https://devcenter.heroku.com/articles/heroku-cli#uninstalling-the-legacy-heroku-gem
公式サイトから
アンインストール方法を調べ

```
$ rm -rf /usr/local/heroku /usr/local/lib/heroku /usr/local/bin/heroku ~/.local/share/heroku ~/Library/Caches/heroku
```
アンインストールを行い、
改めてインストールを行いました。

```
$ brew tap heroku/brew && brew install heroku
```

```
Warning: heroku/brew/heroku 7.42.1 is already installed and up-to-date
To reinstall 7.42.1, run `brew reinstall heroku`
```
警告が出ているので
指示通り

```
$ brew reinstall heroku
```
を行うと

```
$ heroku --version
heroku/7.42.1 darwin-x64 node-v12.16.2
```

できました！
これでHerokuを使って本番環境の動きがみれます！
[Elixir]内包表記の書き方

Elixirでの内包表記の勉強の折、リストに繰り返し処理が簡潔に書けて、良いなと思い覚書を残しました。

`for`とgeneratorで書く。generatorとは`x <- list`のところ。
まずは単純な例から

```bash
iex(3)> list = [0,1,1,2,3,5,8]     
[0, 1, 1, 2, 3, 5, 8]
iex(4)> for x <- list, do: x * 100
[0, 100, 100, 200, 300, 500, 800]
iex(5)> seq = for x <- 1..50, do: x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
 43, 44, 45, 46, 47, 48, 49, 50]
```
generatorのところでパターンマッチを使って書けるようになっている。

```bash
iex(12)> for {:one, val} <- [one: 1, two: 2], do: val
[1]
```

特定の条件に一致したものだけフィルタリングしたい場合は以下のように書く。

```bash
list = for x <- 1..100, rem(x, 2) == 0, do: x 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
 43, 44, 45, 46, 47, 48, 49, 50, ...]
```

generatorが複数の場合は、以下のようになる。

```bash
iex(9)> for x <- [1,2], y <- [3,4,5], do: {x,y}  
[{1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}]
```
要素数は、各generatorの要素数の積。入れ子になると理解しておく

フィルタの条件も複数記述することができる。この場合記述した条件をすべて満たす要素からリストが生成される。

```bash
iex(11)> for x <- [1,2], y<- [3,4,5], rem(x,2) == 0, rem(y,2) == 0, do:  {x,y} 
[{2, 4}]
```

これまでの例から、内包表記はリスト形式で値を返している。`into:`を指定することでリスト以外も生成することができる。
例えば、以下はMapを返す。

```bash
iex(15)> for x <- [1,2], y<- [3,4,5], rem(x,2)==0, rem(y,2)==0, into: %{}, do:  {x, y} 
%{2 => 4}
```

内包表記は以下のリンクや書籍の解説を参考にしました。
[Elixir School 13.内包表記](https://elixirschool.com/ja/lessons/basics/comprehensions/#into-%E3%81%AE%E4%BD%BF%E7%94%A8)
[プログラミングElixir](https://shop.ohmsha.co.jp/shopdetail/000000004675/)
ゼロから始めるLeetCode Day72 「1498. Number of Subsequences That Satisfy the Given Sum Condition」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day71 「1496. Path Crossing」](https://qiita.com/KueharX/items/baf18eaa44d68944a283)

今はTop 100 Liked QuestionsのMediumを優先的に解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！


# 問題
[1498. Number of Subsequences That Satisfy the Given Sum Condition
](https://leetcode.com/problems/number-of-subsequences-that-satisfy-the-given-sum-condition/)
難易度はMedium。

問題としては、整数の配列`nums`と整数`target`が与えられます。
numsの最小値と最大値の和が目標値以下になるような、空ではない部分列の数を返します。

答えが大きすぎるかもしれないので、10^9 + 7の剰余演算を返します。

>Example 1:

>Input: nums = [3,5,6,7], target = 9
Output: 4
Explanation: There are 4 subsequences that satisfy the condition.
[3] -> Min value + max value <= target (3 + 3 <= 9)
[3,5] -> (3 + 5 <= 9)
[3,5,6] -> (3 + 6 <= 9)
[3,6] -> (3 + 6 <= 9)

>Example 2:

>Input: nums = [3,3,6,8], target = 10
Output: 6
Explanation: There are 6 subsequences that satisfy the condition. (nums can have repeated numbers).
[3] , [3] , [3,3], [3,6] , [3,6] , [3,3,6]

>Example 3:

>Input: nums = [2,3,3,4,6,7], target = 12
Output: 61
Explanation: There are 63 non-empty subsequences, two of them don't satisfy the condition ([6,7], [7]).
Number of valid subsequences (63 - 2 = 61).

>Example 4:

>Input: nums = [5,2,4,1,7,6,8], target = 16
Output: 127
Explanation: All non-empty subset satisfy the condition (2^7 - 1) = 127
 

>Constraints:

>- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^6
- 1 <= target <= 10^6



# 解法

```python
class Solution:
    def numSubseq(self, nums: List[int], target: int) -> int:
        ans,mod = 0,10**9+7
        nums.sort()
        for i,j in enumerate(nums):
            if target < j*2:
                break
            b = bisect.bisect(nums,target-j,lo=i)
            ans += pow(2, b-i-1, mod)
        return ans % mod
# Runtime: 888 ms, faster than 82.84% of Python3 online submissions for Number of Subsequences That Satisfy the Given Sum Condition.
# Memory Usage: 25.2 MB, less than 100.00% of Python3 online submissions for Number of Subsequences That Satisfy the Given Sum Condition.
```

問題文で指定されている通り、最初に`mod(10**9+7)`を指定し、for文の中で二分探索をする、という書き方をしました。
bisectの引数は以下の通りです。

```
bisect(a,b,(lo,hi))

a: リスト
b: 挿入する値
lo: 探索範囲の下限
hi: 探索範囲の上限
```

なお、この記事を読む方の中にははご存知の方が多いと思いますが、二分探索はソートされていることが前提条件なので、コードの最初の方でリストをソートしてあります。例を見る限りソートされてない場合も多そうだったしね・・・


ちなみに10**9+7、というのは他の競技プログラミングをやる上で（たくさんサイトがあるのでどれか一つに限らず）結構出てきたりします。
それについての分かりやすい解説記事を書いてくださっている方もいるので気になる方は是非そちらもどうぞ。

では今回はここまで。お疲れ様でした。
JSFiddleでReactを実行する

## Reactとは
Reactとは、WebサイトのUIパーツを構築するためのJavaScriptライブラリです。
Facebookが開発し、OSSとして公開されています。
また、Reactは「宣言的な」ライブラリなので、Webデザイナー向けとも言われています。

## JSFiddleとは
HTML、CSS、およびJavaScriptを簡単に実行できるオンラインのIDEサービスです。

■JSFiddle
https://jsfiddle.net/

## JSFiddleでReactを実行する
JSFiddleでReactを実行してみましょう。
今回は「Hello World」を表示してみます。
ソースコードは以下の2つです。

``` hello.html
<!-- Reactの読み込み -->
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>

<div id="hello_container"></div>
```

``` hello.js
ReactDOM.render(
  React.createElement('h1', null, 'Hello World'),
  document.getElementById('hello_container')
);
```

JSFiddleの画面にて、上記のHTMLとJavaScriptを貼り付けて、左上の「Run」ボタンをクリックするだけでReactが実行できます。
実行結果は右下に表示されます。
![JSFiddle_Code_Playground.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611228/adcfa814-cc68-0dce-83b7-a58430c01095.png)
「hello_container」の要素に対して、「Hello World」が出力されていればOKです。
GitHub ActionsでCloudFormationのテンプレートリントチェック

IaCもCI/CDする時代になりましたね~ (今更なに言ってんでしょうかw
普段はCloudFormationを使用する場面が多いので、CFnでデプロイする前にテンプレートファイルが正しく書けているかチェックしたくなります。リントチェックもCIしたいのでGitHub Actions上でリントチェックしてみようと思います。

# 使用ツール/サービス

- GitHub Actions
- [cfn-python-lint](https://github.com/aws-cloudformation/cfn-python-lint)
- (CloudFormation)

CloudFormationのリンターで[cfn-lint](https://github.com/martysweet/cfn-lint)というツールがありますが、cfn-python-lintの使用を推奨しています。今後はcfn-python-lintを使っていきましょう。

https://github.com/martysweet/cfn-lint#depreciationretirement-notice
> Additional features may be added at the discretion of the project maintainers, however, we strongly advise you use cfn-python-lint at https://github.com/awslabs/cfn-python-lint instead of this project.

# GitHub Actions

cfn-python-lintの[Actions](https://github.com/ScottBrenner/cfn-lint-action)もありましたが、今回はpipでインストールして実行するようなworkflowにしました。

```yaml
name: CloudFormation Linter

on:
  pull_request:
    paths:
      - 'cfn/*.yml'

jobs:
  lint:
    name: Lint Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-python@v2
        with:
          python-version: '3.8'

      - name: Install cfn-python-lint
        run: pip install --no-cache-dir cfn-lint

      - name: Execute lint check
        run: cfn-lint cfn/*.yml

      - uses: homoluctus/slatify@master
        with:
          type: ${{ job.status }}
          job_name: ':aws_cfn: *CloudFormation Lint*'
          channel: '#alert_ci_cd'
          url: ${{ secrets.SLACK_WEBHOOK }}
          token: ${{ secrets.GITHUB_TOKEN }}
```

これでCFnを実行する前にエラーを発見できますね。

## 工夫点

cfnディレクトリにCFnテンプレートファイルを作成するようにして、プルリクの変更ファイルにcfnディレクトリ以下の\*.ymlが含まれていたらCIを実行するようにしました。
もっと厳密にcfnディレクトリ以下を分けるような運用をしている場合は、`cfn/**.yml`をトリガーにするといいでしょう。\*では`/`にマッチしませんが、**なら`/`を含む任意の文字にマッチします。

# 参考

- https://github.com/aws-cloudformation/cfn-python-lint
- https://help.github.com/ja/actions/reference/workflow-syntax-for-github-actions
新人におすすめしたい本

新入社員が配属されてきたので、読む本を伝えるために書く記事です。

# MUST
とりあえず、何も考えなくていいから読んでほしいもの。

#### [リーダブルコード](https://amazon.jp/dp/4873115655)
![リーダブルコード](https://images-na.ssl-images-amazon.com/images/I/51MgH8Jmr3L._SX352_BO1,204,203,200_.jpg)

コメントの書き方や変数名の付け方など言語問わず重要なことが書かれている本です。これを一冊読んでおけばプログラミングの基本的な事柄はカバーできると思います。

#### [プリンシプル オブ プログラミング](https://amazon.jp/dp/4798046140)
![プリンシプル オブ プログラミング](https://images-na.ssl-images-amazon.com/images/I/51Ss443d4hL._SX354_BO1,204,203,200_.jpg)

プログラミングアーキテクトの基本的な考え方が書かれている本です。同じソースコードを書かないなどの基本的な内容が書かれています。なんとなくいけてなくて、もっといいソースコードを書きたいときなどに役立つことが書かれています。

#### [Webを支える技術](https://amazon.jp/dp/4774142042)
![Webを支える技術](https://images-na.ssl-images-amazon.com/images/I/51OSBZvAxGL._SX351_BO1,204,203,200_.jpg)

Webシステムを作る上で、プログラミング以外で必要なことが書かれている本です。HTTPとかURIなどの概念が丁寧に解説されています。

#### [プロになるためのWeb技術入門](https://amazon.jp/dp/4774142352)
![プロになるためのWeb技術入門](https://images-na.ssl-images-amazon.com/images/I/61YVe2oD4CL._SX397_BO1,204,203,200_.jpg)

Javaで解説されるHTTP通信の基本的な内容です。Webを支える技術で学んだ内容を深掘りしたようなものです。ちょっと古い本ですが、現場で役立つことが書かれています。


# SHOULD

#### [Team Geek](https://amazon.jp/dp/4873116309)
![Team Geek](https://images-na.ssl-images-amazon.com/images/I/41SlY0zvpKL._SX350_BO1,204,203,200_.jpg)

teamで働く上での文化の考え方やマインドなどが書かれています。エンジニアとして働く上でチームでの振る舞い方を学びたいときに読んで欲しいです。

#### [SOFT SKILLS](https://amazon.jp/dp/B01GDS0994)
![SOFT SKILLS](https://m.media-amazon.com/images/I/51a8+RIbDoL.jpg)

エンジニアの勉強のしかたから生活の仕方までの幅広いtipsがまとまった本となります。これからのエンジニア生活でどうすればいいか漠然とした不安があるなら読んで欲しいです。
アプリのテストについて RSpec(単体テスト)

# RSpec
Rubyを元に作成されたテストに特化した言語です

#テストコードの基本
<img width="529" alt="スクリーンショット 2020-06-30 22.09.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/60741c69-941d-087a-f56e-5681d81c58e5.png">

## describe
1行目のdescribeは、直後のdo ~ endまでのテストのまとまりを作ります。describeの後に続く""の中にはそのまとまりの説明を書きます。

##  itとexample
2行目のitはexampleと呼ばれる実際に動作するテストコードのまとまりを表します。itの後に続く""の中にはそのexampleの説明を書きます。

## エクスペクテーション
実際に評価される式のことです。it do ~ endの間に書きます。上記の式ではexpect(1 + 1).to eq 2の部分がエクスペクテーションです。

## expect(X).to eq Y
エクスペクテーションの文法です。xの部分に入れた式の値がYの部分の値と等しければ、テストが成功します。eqの部分を、マッチャと言います。

##マッチャ
エクスペクテーションの中で、テストが成功する条件を示します。例えばeqは「等しければ」という意味になります。他にも
include(含んでいれば)、valid(バリデーションされれば)など複数のマッチャが存在します。
ubuntu20.04にEmacsを入れてみた 

なんとなく、久しぶりにEmacsを使いたいと思い...インストールしてみた。


まずはこれ
##最新版に更新
<pre>
sudo apt update
</pre>

##emacsのインストール
<pre>
sudo apt install emacs
</pre>

##Emacs初期設定ファイルをDL
昔は手入力だったのに…。えらい人に感謝です。

<pre>
git clone https://github.com/jr4qpv/dot.emacs.d.git ~/.emacs.d
</pre>


##migemoのインストール
「migemo を利用すると，IME を有効にしないでも日本語を検索できるようになる」らしいです。
参考URL [migemoを使ってEmacsライフを快適に](https://qiita.com/catatsuy/items/c5fa34ead92d496b8a51) 
<pre>
sudo apt install cmigemo
</pre>

##agコマンドのインストール
高速検索ツールです。
<pre>
sudo apt install silversearcher-ag
</pre>

参考URL)
https://www.yokoweb.net/2020/06/03/windows10-wsl2-ubuntu-emacs-install/
fzfとfdで超高速ファイル検索

[fzf](https://github.com/junegunn/fzf) は `fuzzy finder` (ファジーファインダー)のこと、つまり曖昧検索
[fd](https://github.com/sharkdp/fd) は `find` コマンドの代わり

この二つを組み合わせれば最強。一瞬で開発環境に飛べます

使い方は `<C-t>` (コントロールとT)でファイル検索
`<M-c>` (オプションとC)で検索フォルダ移動

インストールは、下のコマンドで終わり。
fzfはbrewからもできるけどこっちの方がおすすめ。 zshrcにスクリプトが書いてくれる

```
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

brew install fd
```

`.bash_profile` か `.zshrc` に以下を追加

```
export FZF_DEFAULT_COMMAND='fd --type f'
export FZF_CTRL_T_COMMAND='fd --type f'
export FZF_ALT_C_COMMAND='fd --type d'
```

あと、一番使うのは <C-r> (コントロールR) コマンドヒストリーを曖昧検索してくれる
WSL2 Ubuntu 18.04 LTS のセットアップで error: 0x80370102 対処

WSL"2" で Ubuntu 18.04 LTS をセットアップするとエラーが出た。

> WslRegisterDistribution failed with error: 0x80370102
> Error: 0x80370102 ??????????????????????????????????????

対処として管理者権限で次のコマンドを実行。ハイパーバイザを有効にするのが目的。

```
bcdedit /set hypervisorlaunchtype auto
```

環境

- Windows 10 Home バージョン2004 ビルド 19041.329
- wsl --set-default-version 2 を実行していた
- さらに ハイパーバイザを off にしていた (VirtualBox r138449 にWin10Proをインストールしたら失敗したのでとりあえず切ってた）
- Ubuntu 18.04 LTS の初回実行でerror

WSL2ではハイパーバイザが必要だから、オフならエラーがでるのはわかる。
アナログメーターの読取りは、例題のMNISTで出来ます。

人工知能を用いて　アナログメーターの読取りを行うのに　教科書の例題にあるMNISTで出来ます。

https://scikit-learn.org/stable/auto_examples/classification/plot_digits_classification.html#sphx-glr-auto-examples-classification-plot-digits-classification-py

まずは、カメラと照明を固定して撮影条件が一定となるように設置をします。一定の範囲内で撮影出来る事を保証できると、人工知能による予測精度が向上します。
次に、特定のアナログメーターを　事前に撮影して針の位置の状態をそれぞれ準備します。どの程度のデーターを準備するかは、要求する分解能に従いますが、２０－３０分解能もあれば、十分と思われます。
なぜなら、アナログメーター自体の精度（誤差）は、±2.5%や±1.6%程度あり、つまり、約5%や3%程度の誤差は、アナログメーターを使う時点で、許容されています。
有効桁数３桁、４桁の測定には、アナログメーターは向いていません。

事前のデーターを多く用意するため、撮影条件や照明条件を振って、許容範囲内の状態を可能な限り撮影したり、画像処理でデーターを水増しましょう。

プログラム自体は、MNISTと同等のクラス分類です。データーが十分あれば、トレーニングとテストに分けたり、過剰適合の検証をしたり、パラメーターの調整をしたり、色々できます。







ana00.png
![ana00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/a0a761a5-b831-d177-255f-3f47d984f1d5.png)



ana01.png
![ana01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/9f2ada48-b1c6-b306-1032-9f49c3d67273.png)




ソースコード
データー準備
画像ファイルを下記に保管してます。
https://bono0.com/

import numpy as np
import matplotlib.pyplot as plt
import cv2

i=np.ndarray([32,32,3])
data=np.ndarray([10,32,32,3])
data[:]=0


i=plt.imread("ana00.png")
plt.imshow(i)
plt.show()
i = cv2.resize(i, (32,32))
data[0,:,:,:]=i
plt.imshow(i)
plt.show()

i=plt.imread("ana01.png")
i = cv2.resize(i, (32,32))
data[1,:,:,:]=i

i=plt.imread("ana02.png")
i = cv2.resize(i, (32,32))
data[2,:,:,:]=i

i=plt.imread("ana03.png")
i = cv2.resize(i, (32,32))
data[3,:,:,:]=i

i=plt.imread("ana04.png")
i = cv2.resize(i, (32,32))
data[4,:,:,:]=i

i=plt.imread("ana05.png")
i = cv2.resize(i, (32,32))
data[5,:,:,:]=i

i=plt.imread("ana06.png")
i = cv2.resize(i, (32,32))
data[6,:,:,:]=i

i=plt.imread("ana07.png")
i = cv2.resize(i, (32,32))
data[7,:,:,:]=i

i=plt.imread("ana08.png")
i = cv2.resize(i, (32,32))
data[8,:,:,:]=i

i=plt.imread("ana09.png")
i = cv2.resize(i, (32,32))
data[9,:,:,:]=i



学習と予測
import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

x = data.reshape((10,-1))
y=np.array([0,1,2,3,4,5,6,7,8,9])

X_train=x
X_test=x
y_train=y
y_test=y

classifier = svm.SVC(gamma=0.001)
classifier.fit(X_train, y_train)
predicted = classifier.predict(X_test)

print("Classification report for classifier %s:\n%s\n"
      % (classifier, metrics.classification_report(y_test, predicted)))


人工知能は、画像を見てクラス分類しているだけです。アナログメーターの概念を認識したり針や目盛を理解しているわけではありません。過剰な要求仕様を求めなければ、アナログメーターの読取りは、例題のMNISTで出来ますね。
Goにおけるnewと宣言のみの違い

# newで初期化することとvarで宣言する違い

## newで初期化
newで初期化すると以下のようなコードになります。

```
var i *int = new(int)
```

これを出力すると

```
package main

import "fmt"

func main() {
	var i *int = new(int)
    //もしくはi := new(int)
	fmt.Printf("%T %v\n", i, *i) → *int 0
}

```

となってnewでは`ポインタ型`を返します。

構造体だったりはポインタで使用されることが多いのでnewを使うことが多い。

```
type Vertex struct{
  X,Y int
}
....
v := new(Vertex)
//v := &Vertex{}と同じ
```

## varで宣言のみ
varで宣言すると以下のようなコードになります。

```
var i2 *int
```

これを出力すると

```
package main

import "fmt"

func main() {
	var i2 *int
	fmt.Printf("%T\n", i2) → *int
	fmt.Println(i2) → <nil>
}
```

となり、nil値となる。

javaなどと同じで宣言だけでは、入らないですね。
ML-agents(Release3) で「ImportError: DLL load failed: 指定されたモジュールが見つかりません。」というエラーが出る場合の対処

#概要
ML-agentsのRelease3をインストールした後に
importError: DLL load failed
というエラーが出る原因は、TensorFlowのバージョン問題です。

#環境
- Windows10 64bit
- Python 3.6.1 (Anaconda 5.3.0)
- Unity 2019.1.0f2

#起きたこと
https://github.com/Unity-Technologies/ml-agents/blob/release_3_docs/docs/Readme.md
上記ページに従い、
Anaconda PromptでML-agentsをpip3でインストール後に
mlagents-learn --help
を実行した後に、下記のようなエラーが出る。
> ImportError: DLL load failed: 指定されたモジュールが見つかりません。

#原因
詳細な原因は不明。
TensorFlowバージョン2.1.1と実行環境（WindowsかAnacondaか）との相性が悪かったと思われる。

#対策
TensorFlowバージョンを2.0まで落とす。
そうすると、正常に動作しました。
（--helpも、実際の学習動作も）

#参考サイト
https://github.com/tensorflow/tensorflow/issues/35749
グラフ畳み込みを大雑把に導出してみる Graph Convolutional Networks

# はじめに
近年、グラフ構造に対するDeep lerningとして、Graph Convolutional Networksを用いた手法が注目されています。GCNは直感的にも分かりやすく、ライブラリを使って学習させる分には問題はありません。ただし、グラフ畳み込みとはなんなのか、通常の畳み込みとどう関連づいているのかが個人的に分かりづらかったので、通常の畳み込みとの関連を意識して、グラフ畳み込みを大雑把に導出してみました。
※ 筆者も勉強中につき間違い等もあると思いますが、ご容赦ください。

# 導出の流れ
グラフ畳み込みは一般の畳み込みの類推から定義します。一般の畳み込みはフーリエ変換と関連があり、フーリエ変換はラプラシアンと関連があります。つまり、グラフに対するラプラシアンを導出できると関連を辿っていくことでグラフに対するフーリエ変換が導出でき、ひいてはグラフに対する畳み込みを導出することができます。　　
以下でラプラシアンから順にみていきます。

- ラプラシアン -> フーリエ変換 -> 畳み込み
- グラフラプラシアン -> グラフフーリエ変換 -> グラフ畳み込み 

# ラプラシアン    
ラプラシアンは勾配の発散でした。ではグラフに対する勾配と発散とはなんでしょうか？
グラフの勾配はグラフの接続行列の転置、グラフの発散は接続行列として表現できます。接続行列についてとグラフの勾配/発散のイメージは以下がわかりやすいです。
> [グラフラプラシアンを噛み砕いて噛み砕いて跡形もなくしてみた] (https://qiita.com/silva0215/items/0d1d25ef51b6865a6e15)

よって、グラフラプラシアン$L$は接続行列$B$を用いて以下のように書けます。
$$ L=BB^T $$

# フーリエ変換
複素正弦波$e^{-jωt}$にラプラシアンを作用させると以下のようになります。

$$\frac{∂^2}{∂t^2}e^{-jωt} = -ω^2e^{-jωt}$$

これはラプラシアンの固有関数が$e^{-jωt}$であるとみることができます。ラプラシアンの固有関数を用いて一般の信号$f(t)$に対するフーリエ変換は
$$F(ω)=\sum_{t=-∞}^{∞} f(t)e^{-jωt}\ $$
とかけます。
正方行列であるグラフラプラシアンを固有値分解すると、固有値を対角成分にもつ行列$A$と固有ベクトルからなる行列$U$を用いて
$$L=UAU^T$$
とかけます。

一般のフーリエ変換の式における時間$t$をノード番号n(max=N-1)で置き換えると
$$F(ω)=\sum_{n=0}^{N-1} f(n)e^{-jωn}\ $$
となります。これは各ノードにおける信号と固有関数の値の積をノードN個分合計した値であり、各ノードにおける固有関数の値を、各ノードに対応する固有ベクトルの値に置き換えて考えてみます。すると、グラフ上の信号を
$$x=\\{f(0),...,f(N-1) \\}$$
として、$x$に対するグラフフーリエ変換は
$$F_G[x]=U^Tx$$
とできます。また、逆フーリエ変換は以下のように書けます。
$$F_G^{-1}[F_G[x]]=UU^Tx=x$$
この辺りは以下サイトが参考になると思います。

> [GNNまとめ(1): GCNの導入] (https://qiita.com/shionhonda/items/d27b8f13f7e9232a4ae5)

# 畳み込み
畳み込み定理より以下の式が成り立ちます。
$$F_G[x*y]=F_G[x]\odot F_G[y]$$
よって、
$$x*y=F_G^{-1}[F_G[x]\odot F_G[y]]=U((U^Tx)\odot (U^Ty))$$
とかくことができ、この式がグラフ上の信号$x$と、フィルタ$y$を畳み込んだ結果となります。

# おわりに
グラフ畳み込みを導出してみました。正直、上の式を知らなくてもGCNを使った機械学習で困ることはほぼないと思いますがなんとなくスッキリしてもらえたなら嬉しいです。

# さらなる勉強用
https://qiita.com/shionhonda/items/d27b8f13f7e9232a4ae5
https://masashi16.hatenablog.com/entry/2019/08/13/135753
https://www.slideshare.net/yukihirodomae/graph-convolution
Pythonで実装するアヒル本「StanとRでベイズ統計モデリング」

# Pythonで実装するアヒル本
## アヒル本とは
アヒル本「StanとRでベイズ統計モデリング」、ベイズ界隈では有名な書籍です。
<img width="186" alt="スクリーンショット 2020-06-30 21.31.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105768/66e2a8fc-034b-4b49-7c42-8d4184367e58.png">
ベイズ推定を実装したい、と思ったときにまず最初に手に取ると良いでしょう。
しかし、ベイズとは何かという点について解説している本ではないため、ベイズの枠組みで事例を積み重ねることで事後分布を更新できるために得られる利点などについて納得ができていない方は、ベイズ自体の基礎的な解説を読んでからチャレンジしたほうが良いと思います。

## なぜPythonか
上記本のオフィシャルでは、タイトルどおり実装はRなんですね。
Pythonで実装したい方も多いと思います。
私もその一人でしたので、Python実装をつくりました。

## Python実装にあたって
Stanのインターフェイスについては、PyStanでRとほぼ変わらない使いごこちを実現できます。
一方で、データ整形についてはPandasを使うので、Rとはかなり異なるコードとなります。

### 利用するPythonライブラリ
- Python > 3
- PyStan

など、詳しくは以下をご覧ください。

#### requirements.txt
https://github.com/MasazI/python-r-stan-bayesian-model-2/blob/master/exec/requirements.txt

## コード
すべてのコードはGithubに上がっていますので、実行自体はすぐできるかと思います。
練習問題もすべてPythonで解いてあります。

### Github
https://github.com/MasazI/python-r-stan-bayesian-model-2

何かありましたらプルリクエストをいただけるとありがたいです。
CRLFの覚え方

#対象読者

改行コードのCRLFをCLRFとうっかり書いてしまう癖がある人

#覚え方

```
  CRLF
    ↓
 CuRoLFu
    ↓
くろ える ふ
    ↓
  黒エルフ
```

私はこれでCRLFの綴りを完璧に覚えることができました。
また、「黒エルフだ！」と覚えることで、
CRLFを16進数で0x0D, 0x0Aと書けばよいことが分かるのでオトクです。
Mellanox ConnectX-3をESXi(6.7)で使おうとしたらハマった話

## 10G NICを入手
今回入手したのはMellanox ConnectX-3(MCX341A-XCEN)です。
ebayで送料込み3000円程度で買えます。到着までに2ヵ月近く掛ったけどね・・・

## ESXiで通信がうまくいかない
VMware Host Client上でvSwitchのアップリンクをIntelの1G NICから切り替えると通信が途切れる。
pktcap-uwやWireSharkをパケットキャプチャして確認。
ARPのキャッシュが残ってる間は通信できるからARP Replyできていないのかと思ったけどやっぱり動きがおかしい。

## ネットの海で情報を調べまくる
もはやお手上げ。
NIC投げ捨てる寸前だったが、頑張って探したらいろいろ分かってきた。

・Mellanox Technologies MT27500 Family [ConnectX-3 and ConnectX-3 Pro devices] adapter stops processing traffic but network adapter link state is still active (60421)
https://kb.vmware.com/s/article/60421?lang=en_US

・海外の10Gホームネットワークのスレッド
https://www.hardwareluxx.de/community/threads/der-10gbit-homenetzwerk-thread.807277/page-129

・Mellanox connectX-3のファームアップデート手順(@tetrar124 様)
https://qiita.com/tetrar124/items/2e4b7e5955401dbff0fb

## で、結論は？
結局のところ、以下の2点を実施したらESXiでちゃんと使えるようになりました。
①ファームウェアのアップデート
→別型番のConnectX-3のファームウェアを適用します。(おまじないが必要)

②最新のESXi用ドライバへのアップデート
→最新のドライバを発見できれば後は入れるだけ。

# 1.ファームウェアのアップデート
今回は手元のWindowsPCで実施することにします。
ESXi上でできないことはないと思いますがアレコレ入れるのが面倒なので・・・

## ①Mellanox Firmware Tools(MFT)の入手
https://jp.mellanox.com/products/adapter-software/firmware-tools
とりあえず最新版をダウンロード。
![mft_downloader.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96957/51c2b885-94f0-c1b1-a9ff-177b3cc8ef2d.png)

## ②Mellanox Firmware Tools(MFT)のインストール
インストーラーをダブルクリックします。
基本的には淡々と次へ進むだけです。
途中でインストールするコンポーネントを選択する画面がありますが、全てインストールするように変更して進みました。

## ③ファームウェアの入手
MCX341A-XCEN用のファームウェアは古いもので止まっている状況。
そこで別型番(MCX341A-XCCN)のファームウェアを使います。
海外のスレッドで同じ問題が取り上げられていたため助かりました。

https://jp.mellanox.com/support/firmware/connectx3en
![firm_downloader.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96957/b04be945-929a-321e-03fb-1f2d3330295b.png)


## ④PCにConnectX-3を搭載
空いているPCI-Expressスロットに差し込むだけです。

## ⑤接続されたNICの確認
以降の作業はコマンドプロンプトで行います。

```
mst status
```
![mst_status.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96957/c4a61d54-1d2e-1b7d-3f0a-63e1013f447e.png)


## ⑥現行ファームウェアとNIC情報のバックアップ
現行ファームウェアやらNIC情報やらを念のためバックアップしておきます。

```
flint -d mt4099_pci_cr0 ri orig_firmware.bin
flint -d mt4099_pci_cr0 dc orig_firmware.ini
flint -d mt4099_pci_cr0 rrom orig_rom.bin
mlxburn -d mt4099_pci_cr0 -vpd > orig_vpd.txt
```
![flint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96957/d98fc0fb-2207-f13c-e429-43c9fec522cc.png)


## ⑦ファームウェアの更新
-iで適用するファームウェアを選択。
-allow_psid_changeオプションを入れないとPSIDが違うので弾かれます。

```
flint -d mt4099_pci_cr0 -i fw-ConnectX3-rel-2_42_5000-MCX341A-XCC_Ax-UEFI-14.11.45-FlexBoot-3.4.752.bin -allow_psid_change burn
```
![fwup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96957/f7337a80-cbbe-4a49-d777-a6c9170387e2.png)

## ⑧再起動
OS再起動後に新FWが反映されます。

```
flint -d mt4099_pci_cr0 q
```

# 2.ESXi用ドライバのアップデート
ドライバはここから入手できます。
https://my.vmware.com/jp/web/vmware/downloads/details?downloadGroup=DT-ESXI67-MELLANOX-NMLX4_EN-317701&productId=742
詳細はこれから記述予定・・・
CSS：Flex：IE11とiOS13のSafariで「flex-direction: column-reverse」が効かない

# 前提条件

- Windows10のIE11
- iOS13のSafari（iPad第6世代とiPhoneSE2020）

# 目的

- flexで列の順番を逆順にする。

# 手順

- 以下のCSSを設定

```html
<div id="flex-box">
  <div class="col">1</div>
  <div class="col">2</div>
</div>
```

```css

#flex-box {
  display: flex;
  flex-direction: column-reverse;
}

```

# 現象

- 高さがなくなり、コンテンツが重なる。

# 対応

- 以下の設定を列要素に設定。

```css
.col {
   flex: 1 1 auto;
}
```

# 備考

- PC・Android版のChrome、Chromium版のEdge、古いMacのSafariでは、対応コードなく期待通りの結果になる。
- **iOSのSafari**　は、**「スマホ界のIE」**と呼べるぐらい独特な仕様だが、シェアがあるため無視できない。この件については、本当にIE11と同じ挙動になっていた。
【Django初心者】PycharmでDjangoでアプリケーションを作成する手順~準備編~

#はじめに
この記事はPycharmでDjangoを使ってアプリケーションを作成する準備の段階を書いていきます。
あくまで僕の手順なので、他の方の記事も見るとより理解が深まると思います。

#新しいPycharmプロジェクトを作成する
1. Pycharmの左上のメニューバーから「ファイル」を選んでクリック。
2. その中の一番上の「新規プロジェクトを作成」をクリック。
3. ロケーションの部分にデフォルトで「untitled」とは言っているのでその部分を削除して、自分の好きなプロジェクト名を入れる。
4. 右下の作成を押すと新規のウィンドウに作成するか、今いるウィンドウで作成するか聞いてくるので、好きな方を選ぶ。
これでプロジェクトの作成は完了です。

#仮想環境構築
今回はPipenvを用いて仮想環境の構築を行なっていきます。
Pycharmの左下のあるターミナルを開いてください。

###インストールされているかの確認
まずインストールされているか確認します。

```terminal
$ pipenv --version
```
数字が出ればインストールされています。

###インストールされていない時
```terminal
$ pip install pipenv
```
このように入力すればインストールができます。

###Djangoを追加
```terminal
$ pipenv install django
```
このように入力することで、最新のdjangoをインストールできます。

###仮想環境有効化
```terminal
$ pipenv　shell
```
このように入力すると、ターミナルの一番左の部分の「(base)」となっていた部分が、プロジェクト名に変わっていることが確認できます。
ここまでで仮想環境の構築は終了です。

#Djangoのプロジェクトとアプリケーションを作成

まずはプロジェクトを作成していきましょう。

```terminal
$ django-admin startproject プロジェクト名     #プロジェクト名のディレクトリの上に同じ名前のディレクトリができてしまう
$ django-admin startproject プロジェクト名 .   #Pycharmのプロジェクトの直下に作成できる
```
①だとやってみるとわかるのですが、余計なディレクトリができてしまうので、②のように最後に「.」をつけるのがおすすめです。

次にアプリケーションを作成していきます。

```terminal
$ python manage.py startapp アプリ名
```
これでアプリが作成できます。

#ついでに
あとで作成することになるので、あらかじめ作成しておくと良いものを書いておきます。

```
Pycharmプロジェクト
      |
      |___djangoプロジェクトディレクトリ
      |
      |___djangoアプリケーションディレクトリ______templates   #このアプリケーションでのみ使われるHTMLファイルを格納
      |                              |
      |___manage.py                  |___urls.py   #デフォルトでは用意されていない
      |      
      |___templtes___base.html   #アプリケーションが増えても`base.html`は多くの場合共通のものが使われるため。
      | 
      |___ static_____cssディレクトリ   #CSSファイルを格納
      |           |___imgディレクトリ   #画像ファイルを格納
      |           |___jsディレクトリ   #JavaScriptファイルを格納
      |                       
      |___その他のファイル類             

```

###urls.pyの作成
アプリの方には「urls.py」がないので、アプリのディレクトリに作成します。

```terminal
#アプリケーションディレクトリに移動
$ cd アプリケーションディレクトリ名

#urls.pyファイルを作成
touch urls.py
```

これで完了です。

###templatesの作成
HTMLファイルを入れておくtemplatesディレクトリを作成しましょう。

```terminal
#Djangoアプリケーションディレクトリに移動
$ cd アプリケーションディレクトリ名

#templatesディレクトリの作成
$ mkdir templates
```

もう1つの`tempaltes`ディレクトリを作成します。

```terminal
#プロジェクトディレクトリに移動
$ cd プロジェクト名

#tempaltesディレクトリの作成
$ mkdir templates

#base.htmlファイルを作成
$ cd templates
$ touch base.html
```
これでOKです。

###staticディレクトリを作成
CSSファイルやJavaScriptファイル、画像ファイルなどを保存する「static」ディレクトリを作成しましょう。

```terminal
#アプリケーションディレクトリに移動
$ cd アプリケーションディレクトリ名

#staticディレクトリを作成
$ mkdir static

#staticディレクトリに移動
$ cd static

#cssディレクトリ作成
$ mkdir css

#javascruptディレクトリ作成
$ mkdir javascrupt

#画像を入れておくディレクトリ作成
$ mkdir img
```

これで「static」ディレクトリの用意は完了です。

#実行できるか確認
最後に実行できるか確認しましょう。

```terminal
#データベース構成のバージョン管理をするための、マイグレーションファイルというものを作成
$ python manage.py makemigrations 

#データベース構成を変更したり、変更を取り消す
$ python manage.py migrate
```
この２つをターミナルに打ち込みましょう。

```terminal
#実行！！！
$ python manage.py runserver
```
これを無事に実行できると

```
http://127.0.0.1:8000/
```
と表示されるのでクリックするとブラウザに飛びます。
ブラウザが開いた時にロケットが飛んでいれば無事に実行できています！


#終わりに
今回はPycharmでのdjangoを使ったアプリケーション作成の準備段階の手順を解説してきました。
参考になれば幸いです。
今後続きの記事を作成していく予定ですのでよければ見ていってください。
続き
↓
↓
[settings.py編](https://qiita.com/heku_777/items/0962d426d967c4c0b016)
[Salesforce] カスケード削除処理対象レコードに紐づくレコードをApexトリガで更新する処理で困ったこと

# 概要
- こちらの記事では、カスケード削除処理対象レコードに紐づくレコードのトリガー処理実装時につまずいた点を記事にします。

## 取引責任者の役割(OpportunityContactRole)
- **商談(参照)←取引先責任者の役割→取引先責任者(参照)**
- [SOAP API開発者ガイド - OpportunityContactRole](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_opportunitycontactrole.htm)

# 今回実装したかったトリガ
- 取引先責任者に紐づく取引先責任者の役割が紐付いている商談の積み上げ集計をトリガで実装
 
## 具体的な内容

```
   集計対象       = 商談: 対象フラグ(isTarget__c){true}のレコード
   集計先         = 取引先責任者: 件数(OpportunityNum__c) に積み上げ集計を行う
   集計対象の条件  = 取引先責任者が紐付いている取引先責任者の役割が参照している商談のみ
```


# :innocent: つまずいた点
- 商談削除時に商談が紐づく取引先責任者の役割が紐づく取引先責任者を更新処理

この実装を行う際につまずいてしまいました、、、

# :no_good: 初めに試してみた実装


**1. 取引責任者に商談を集計するトリガメソッドを実装**
**2. 取引先責任者を空更新させて再集計させる**

**商談(削除)→取引先責任者(カスケード削除)→取引先責任者の役割: AfterDeleteトリガーで取引先責任者を更新**

初めはうまく実装できたと思ったのですが大きな問題を見落としていました、、、

- **取引先責任者(カスケード削除)** ここを見逃していました

- **[Apex 開発者ガイド - トリガを呼び出さない操作](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_triggers_ignoring_operations.htm)**
> - 削除操作のカスケード。delete を開始しなかったレコードでは、トリガの評価は行なわれません。

**カスケード削除によってトリガ処理は実行されないのです、、、**

# :ok_woman: 解決するために試した方法
**1. 商談削除時にAfterDeleteトリガでカスケード削除を行って削除されてレコードを取得**
**2. 取得したレコードから対象の取引先責任者の値を抽出し取引先責任者を更新**

- SOQLに**ALL ROWS**を追加しゴミ箱のレコードもクエリ対象に入れる
- WHERE句に **IsDeleted = true** を追加し削除されたレコードのみをクエリ対象にします

- **[Apex 開発者ガイド- SOQL ステートメントを使用したすべてのレコードのクエリ](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_SOQL_query_all_rows.htm)**

> SOQL ステートメントは、ALL ROWS キーワードを使用して、削除されたレコードやアーカイブされた活動など、組織内のすべてのレコードを照会できます。

## 実装例

```java

   private void 商談削除時取引先責任者空更新メソッド(List<Opportunity> 削除した商談リスト) {

        Set<Id> oppIdSet = new Set<Id>();
        for (Opportunity opp : 削除した商談リスト) {
            oppIdSet.add(opp.Id);
        }

        List<Contact> targetContactList = new List<Contact>();
        for (AggregateResult aggr : [
                SELECT
                    ContactId
                FROM
                    OpportunityContactRole
                WHERE
                    OpportunityId IN :oppIdSet
                    AND IsDeleted = true
                    GROUP BY ContactId
                ALL ROWS
        ]) {
            targetContactList.add(new Contact(Id = String.valueOf(aggr.get('ContactId'))));
        }
        update targetContactList;
    }
```

# 最後に
今回つまずいたことでトリガの実行されない処理などについて再確認できたのでいい勉強になりました。
Salesforceの標準機能や標準オブジェクトはまだまだ触った機会・知識が少ないので、
Salesforceエンジニアと名乗る以上、勉強に励まなければならないと痛感しました。
制御フローテストのカバレッジ基準について

制御フローテストで着目する以下の3要素によって、カバレッジ基準（網羅率の基準）が変わります。
①命令文
②分岐した経路
③条件

## ①ステートメントカバレッジ（命令文）
制御フローテストで「命令文」に着目した場合は、「ステートメントカバレッジ」と呼びます。
このカバレッジ基準では、すべての命令文（分岐と処理）を最低1度は通る必要があります。

## ②デシジョンカバレッジ（分岐した経路）
制御フローテストで「分岐した経路」に着目した場合は、「デシジョン（判定）カバレッジ」と呼びます。
このカバレッジ基準では、分岐起点のステートメント後のすべての経路を最低1度は通る必要があります。
例えば、単純なYes/Noの分岐がある場合は、YesとNoの計2経路を通れば良いです。

## ③複合条件カバレッジ（条件）
制御フローテストで「条件」に着目した場合は、「複合条件カバレッジ」と呼びます。
このカバレッジ基準では、条件に含まれるすべての条件パターンを満たす必要があります。
例えば、分岐条件が「A = True AND B = True」の場合のテスト条件の組み合わせは以下の4通りになります。
・A = True, B = True
・A = True, B = False
・A = False, B = True
・A = False, B = False

## 各カバレッジレベルについて
3種類のカバレッジ基準を紹介しましたが、①〜③の順番でテスト回数が多くなります。
また、各カバレッジ基準は上位レベルのものが下位レベルのカバレッジ基準を包含する関係にあります。
例えば、「複合条件カバレッジ」が100%であれば、下位レベルの「ステートメントカバレッジ」と「デシジョンカバレッジ」のカバレッジが100%になります。

## 参考
■【この1冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践
https://www.amazon.co.jp/dp/B00U17809A
3分間ネットワーク備忘録 第２回

## 概要
３分間ネットワークで学んだことを備忘録的に纏めていこうと思っていましたが、
よくよく取ったノートを見返してみるといろいろわかっていないことがわかったので、
その都度振り返りながら、補足を纏めていきたいと思います。

実際のところ、前回も書いたように３分間ネットワークは古い記事なので、新しい情報を補足しながら勉強していくのが一番良いと感じています。


今回は、[第二回](http://www5e.biglobe.ne.jp/aji/3min/02.html)あたりの内容になります。

基本的には、LANとWANの話となっています。
LANとは、ローカルネットワークのことで、モデムなどによって外のネットワークであるWANと接続されており、その全体をネットワークと呼びます。

### LANや、ISDN, ADSL　について
LANは 　Local Area Network の頭文字を取ったものであり、「ローカル」のネットワークのことをいいます。
回線の種類に該当するのがISDNやADSLです。

この二つは記事にも言及されていましたが、今改めて調べてみると、どちらも光回線に現在は取って変わられ、
どちらも２０２４年くらいをめどに正式にサービスが終了することが決まっているようです。

### デジタル通信とアナログ通信の違い

#### アナログ通信
あなたは、デジタル通信とアナログ通信の違いがわかるでしょうか？
アナログ通信は、電話のように、音の波形をそのまま伝える通信のことです。
こちらが歴史的には早くから開発され、このアナログ通信を行っているものが、ADSLになります。

現在、ADSLは通信は光通信などに比べると遅く(８Mbps程度)、あまりいいところのない通信方法のようです。
ただし料金は比較的安く、月額１５００円程度から使えるようです。
ISDNのサービスは２０２４年に終了することが決定しています。


#### デジタル通信
一方で、デジタル通信はそのまま波形を送るのではなく、符号化という技術をつかって、情報を０、１に変換し、パケットと呼ばれる単位で送ります。このことにより、符号を使った誤り訂正などを用いることで、ノイズに強い通信です。

ISDNはこのデジタル通信を使っています。

安定した通信を行えるというメリットはあるものの、遠距離になるとノイズに弱いというデメリットがあるということです。
ある程度の安定した回線だという評価がある（企業間では安定した通信を好み、光回線よりもこちらを使うこともある）ものの、料金が高く、通信もかなり遅いです（１２８kbps程度）

#### 光通信
そして現在では主流となっている光通信ですが、まず圧倒的に通信が速い（1Gbps程度出る）のが特徴であり、
また、ノイズが出にくい通信となっています。その分ADSLなどと比較すると料金が高いです。（月額４５００円〜程度）



### 各通信の変換

#### モデム
デジタル通信とアナログ通信の相互変換を行うものが、モデムです。
名前を聞いたことはあっても、実際に何をするものなのかよく知らなかった人もいるのではないでしょうか。

#### ONU
また、光通信とデジタル通信を相互変換するものが　ONUと呼ばれる装置です。


#### ルータ

モデムをLANケーブルで繋ぎ、複数の端末を同時にインターネットに接続させるのがルータです。
これは家でもよくみるので馴染みがある人も多いと思います。



## まとめ
３分間ネットワークの補足として、
デジタル通信、アナログ通信などについて追記した。
また、これらの代表的な回線について少し書いたが、これらは光にとって替わられ、サービス終了が決まっていることがわかった。


このように、３分間ネットワークの情報は少し古いので、補足しながら纏めていくと良さそうです。

それでは。

おわり。
C言語で9文字でセグフォらせる

セグフォりたくなくてもセグフォるC言語で、セグフォらせるという発想はなかったのですが。[この記事](https://qiita.com/yasuo-ozu/items/ddc5d3e8e4a97eaa470c)見てると文字数少なけりゃいいかな、と思いまして。やってみました。

```c
int main;
```

コンパイル通ります。(gcc (GCC) 10.1.0で確認。コンパイルオプションなし)
おそらく、0で初期化されたint型グローバル変数のmainを呼び出したからセグフォしたものと思われます。