OmniAICreator/Qiita-1.07M huggingface dataset:
CocoaPodsで提供しているLibraryのDeployment TargetはXcode12からは9.0以上に設定しよう

# TL; DR
CocoaPodsで提供しているLibraryのDeployment TargetはXcode12からは9.0以上に設定しよう（タイトルママ）

```ruby:ライブラリ.podspec
Pod::Spec.new do |s|
  ...
  s.platform            = :ios, '9.0'
  ...
end
```
 
# なぜ？
Xcode12から、**iOS 8を `IPHONEOS_DEPLOYMENT_TARGET` にすることができなくなりました。**

[CocoaPodsでインストールしたライブラリをXcode12でビルドするとDeployment Targetに関する警告が出る
](https://qiita.com/temoki/items/46ad22940e819a132435) に詳しく書いていますが、以下のようなWarningがビルド時に出るようになります。

```
The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.0.99.
```

Warningだけなら良いのですが、この設定を変えないと最悪Xcode12では一部のコードが下記のエラーと共に**ビルドできなくなります**。私の利用しているライブラリは、特にUIKit周りでエラーが出ました。

```
'...' is only available in iOS 8.2 or newer
```

# [ライブラリ提供側] 対策

`IPHONEOS_DEPLOYMENT_TARGET` はpodspecの `s.platform` で変更できるので、できることなら変えましょう。

```ruby:ライブラリ.podspec
Pod::Spec.new do |s|
  ...
  s.platform            = :ios, '9.0'
  ...
end
```

# [ライブラリ利用側] 対策

[CocoaPodsでインストールしたライブラリをXcode12でビルドするとDeployment Targetに関する警告が出る
](https://qiita.com/temoki/items/46ad22940e819a132435) に詳しく書いていますが、PodfileでDeployment Targetを変える方法があるのでご参照ください。

# 謝辞
書いてわかったのですが、記事内でも紹介している、 @temoki さんの記事とまんま内容が同じです（temokiさんの方が先）。申し訳有りません :bow:。
エラーが出る、っていう側面で書きたかったのですが、かなり内容が似ている...
会社のLANを利用したGitHubとの連携（Fetch, Push, Pull）等を行うため、プロキシ設定をGitのコマンドラインで行った

## 環境情報

- Windows Pro 10 Version 1803
- git version 2.28.0.windows.1

## 契機

会社のネットワークからGitHubのリポジトリのCloneや、ローカルリポジトリのPublish、他連携を行おうと思ったらタイムアウトとなり、下記エラーが吐き出された。

```Git
fatal: unable to access ‘https://github.com/GitHubのユーザー名/リポジトリ名.git/’
: Failed to connect to github.com port 443: Timed out
```

実は、何故かAtom上ではGitHubの接続は上手く行ったのだが、コマンドライン（Git Bash）へ直接入力したり、GUI（Forkとか）やVSCode上の接続は全て同様のエラーとなった。AtomについてはWindows 10の設定におけるプロキシ設定に紐付いているのかもしれないが、不明。
で、自分の会社のネットワークはプロキシサーバー経由で外部ネットワークに接続されているため、Git Bashのコマンドラインから、GitHubにプロキシサーバ経由で接続されるように設定した。

## コマンド

### 設定

Win + Rで出たウインドウで下記コマンドを入力すれば、Windowsの設定上のプロキシ情報が出る。既にここで設定しているのであれば、ここで記載した情報を入れれば良いと思う。

```win
ms-settings:network-proxy
```

下記コマンドをGitに入力し、実行。
[]内は上記方法等で調べたものを入力。分からんかったらIT担当部署に聞けば分かると思う。
勿論コマンドを実行する際は[]はいらない。

```Git
git config --global http.proxy http://[プロキシサーバのホスト名]:[プロキシサーバのポート番号]
```

### チェック

下記コマンドを実行して、返ってきたものに入力したプロキシ情報が入っていたらOK。
もしくは.gitconfig内に記載があればOK。試しにFetchして同期されるかチェックしてみる。

```Git
git config --list
```

### リセット方法

念の為。

```Git
git config --global --unset http.proxy
```

## その他

会社PCはデスクに据え置きなのでネットワークを切り替えることは無いが、ネットワークやリポジトリ別で上記設定を切り替えたい時（ノートPC等）、別の方法があるので、また後日調べてまとめたい。
個人で技術書サービスを作った苦悩と公開

個人で技術書サービスを作って先日リリースしましたので、そちらの苦悩と公開についての投稿です。

# 苦悩と後悔

一通り完成して本番サーバにデプロイして安心して寝た翌日、競合サービスがその数日前にリリースしてました。

サービス作成に数ヶ月間費やしたので脇の下に変な汗が出ました。正直機能を作りすぎたのでもっと早めに出しておけばよかったです。

# はじめに

仕切り直して、先日「WeBook」という技術書籍のプラットフォームをリリースしました。
金銭を扱うので会社名義になってますが、個人開発したサービスになります。

https://webook.jp/


WeBookは、「Web」+「Book」を組み合わせて作った造語で、Webで便利に読める書籍とはどういうものかを探しつつ、広めていきたいという想いから名付けました。

![cbdb5cc738f072fb59ae9b53abdd2e7a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226439/9befe577-ed5f-8360-c9ac-3248682d7ef3.png)

※ これを会社名義でリリースさせてくれたシャッチョさんありがとー！個人開発しつつお金を溜めたいけど営業したくない方は[弊社](https://crewinc.io/)へどうぞ。

# サービスの目指すべき未来

#### 1. 読者視点
手軽に新しい知識を得られること。

時代が変わり、一つのサービスを作るためのハードルは下がりましたが、反面多くのツールやライブラリを駆使しなければいけなくなりました。忙しい現代人が効率よく学んでいくためには、学ぶ媒体もアップデートしていく必要があると感じています。

結論、書籍は情報量が多いので、適切な量でサクサクと読めるようになりたい。
また、サイトは情報量が少ないので、一つの知識についてもっと情報がまとめられていたい。

なので、サイト以上書籍以下の情報がもっと多くなれば学びやすい環境がもっと揃うのではないかと考えています。

#### 2. 執筆者視点

新しいキャリア形成の仕方を確立できること。

「個人の時代」において様々な生き方が生まれていってますが、何かと「個人の発信力」が重要になってくる場合も少なくありません。イベントに登壇したり執筆したりと発信力を高める方法はありますが、WeBookもその一つになれればと考えております。

また、職業柄、書くためのネタも仕事をしながら手に入ります。
「ネットで調べれば書いてあるじゃん」と思ったあなた、確かにネットを探せば手に入る知識が多いですが、1 つのサイトの情報は少ないため複数のサイトから必要な知識を得ていませんか？そのような情報をまとめて公開することでワンコイン以上の価値を読者に提供できると考えています。

# WeBook でできること

WeBook は電子書籍の販売と購入ができます。
書籍販売は PDF 形式が基本ですが、書籍の保管資料として様々な形式を ZIP にまとめてアップすることもできます。

他にもこのような機能が。

・SNS 認証
・フォロー
・お気に入り(あとで買う)
・サービス内通知 と メール通知

こう見るとそれほど機能は多くはないなと思いますが、サービスを触ってもらるとなかなかページ & 機能数は多いです。特に販売関連が…履歴が…購入が…

# 今後

WeBookの今後についてですが、バージョンアップはこのように考えています。
まずは使ってみて、使われてみてですが、現段階の方針としてはこのような感じです。

#### ver2：書籍の検索機能

PDF 内の文章も検索できるようにしたいです。「ライブラリのあるオプションをもっと詳しく知りたい」などあるので、単語ベースで検索ができるようになればと。

検索対象に含めるのは PDF のみなので、検索させたくない人は ZIP で登録、などそれぞれのニーズに答えられるようにできればと。

#### ver3：サブスク機能

そうです、サブスク機能です。通常の販売では不要ですが「もう一歩」欲しい時にぜひ使いたい機能を考えています。

・個数限定割引販売
・期間限定割引販売
・シリアルコード
・商品ページに合言葉がないと閲覧できなくなる機能

#### ver4：ブラウザ上で書いた文章を投稿できる機能

note のような、ブラウザ上で記事を書いてそのまま公開できるようにしたいと考えています。
また、書いた記事を出力できればそのまま印刷もできるかなと…


# 最後に

サービス開発前〜開発中に考えたことなどはnoteに投稿しているので、もしよければどうぞ。

https://note.com/koma2hiroki/n/naeecb1405bf4

ありがとうございました：）

ツイッター
https://twitter.com/iminux

##### 蛇足

「サービス提供者が集まる slack グループ」なるものに入り自己紹介したところ、「第三の技術書プラットフォーム ktkr」と言われました。世はまさに大技術書籍プラットフォーム時代。

##### 2020/08/22追記
タイトルですが「公開」と「後悔」を掛けてまして、いやなぜ掛けたかと言われると、深夜に記事を書いたのでテンションが上がってとしか言えず…大変申し訳ない…変更せずそのままにしておきます。
FuelPHPで発行したクエリを表示する

FuelPHPのログファイルにクエリを吐き出す方法です。

```
\Log::error(\DB::last_query());
```
`\DB::last_query()`が最後に発行したクエリの取得、
`\Log::error()`がログファイルにエラーとして書き込む命令です。
これを書くと、ログファイルに

```fuelphp.log
ERROR - 2020-08-19 18:01:20 --> SELECT~~~~~~~~
```
といったように書き込まれます。
また、直前に`execute()`に引数を与えている場合は`\DB::last_query()`にも同じ引数を与える必要があります。
Bash で複数のバックグラウンドプロセスを for ループで起動する

Bash を使ってワンライナーの `for` ループで X window の `glxgears` を `&` を使ってバックグラウンドでたくさん起動しようとしたら、なんかうまくいかなかったのでメモ。

# 結論
`;` の代わりに `&` を使うこと。

# 最初に試した方法
```shell
for ii in `seq 1 10`; do glxgears &; done
```
`for` ループを回して `&` で複数起動しようと思ったら以下のようなエラーが出る。

```shell
bash: syntax error near unexpected token `;'
```

# 解決した方法
```shell
for ii in `seq 1 10`; do glxgears & done
```

どうやら `&` のあとに `;` を入れているのがまずかったらしい。

## 余談
`Bash` ではなく `Zsh` を使っていれば

```shell
for ii in `seq 1 10`; do glxgears & done
# だろうが
for ii in `seq 1 10`; do glxgears &; done
# だろうが
```
どちらも問題なく動く

# 参考リンク
* [Loop background job - STACK OVERFLOW](https://stackoverflow.com/questions/12472933/loop-background-job)
* [Use & (ampersand) in single line bash loop - StackExchange](https://unix.stackexchange.com/questions/91684/use-ampersand-in-single-line-bash-loop)
UnityでAndroid向けにビルドすると、以前使っていたJDKが参照されるときの対処方法

## 起きたこと

`Unity2019.4.1f1`でAndroid向けにビルドした際、次のエラーが出てビルドに失敗した。

```
/bin/bash: /Applications/Unity/Hub/Editor/2018.4.14f1/PlaybackEngines/AndroidPlayer/Tools/OpenJDK/MacOS/bin/java: No such file or directory
```
今は`2019.4.1f1`を使っているのに、`2018.4.14f1`下のJDKを参照しに行き失敗している。

`Unity>Preferences>ExternalTools`で参照しているJDKを確認しても、特におかしな点はない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309048/18d9d6fe-f2ab-03e3-2bf6-61c735373982.png)

## 原因と対処法
試しに、 `JDK Installed with Unity(recommended)`からチェックを外してみると、`2018.4.14f1`下のJDKへパスが通っていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309048/94b963ce-0fcd-ee43-9390-ac14228ea19c.png)

ここに`JDK Installed with Unity(recommended)`と同じJDKへのパスを入力する。

これでエラーが出なくなった。
(何故チェックボックスが機能していなかったのかは不明)
javascript 配列の先頭や最後を削除したり配列に値を追加する

```javascript

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>課題</title>
    <script>
        var data = [59, 39, 100, 2, 15, 40, 84, 97];
 
        // 配列dataの先頭(59)の値を削除
        
        data.shift();
 
        // 配列dataの最後(97)の値を削除
        data.pop();
 
        // for文により配列dataの中身を表示
        for(var i = 0; i < data.length; i++){
            document.write('<p>'+data[i]+'</p>');
        }
 
    </script>
</head>
<body>
</body>
</html>


```

```javascript


<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>challenge_object</title>
</head>
<body>
   <script>
       var fruits = new Array();
 
       fruits[0] = 'apple';
       fruits[1] = 'grape';
       fruits[2] = 'melon';
 
       // pushメソッドにより配列fruitsへorangeを追加
       fruits.push('orange')
   
       // for文により配列fruitsの中身を表示
       for(var i = 0; i < fruits.length; i++){
           document.write('<p>'+fruits[i]+'</p>')
       }
 
 
   </script>
</body>
</html>

```
Vueのref属性使って要素の現在の幅を取得する

ref属性をつかったWidthの取得の個人メモ

現在のWidthを知りたい要素にref属性を追加する

```html

<template>
  <div class="parentWidth" ref="getParentWidth">
    .
    .
    .
  </div>
</template>
```

mountedプロパティ以降に記述する(DOMが描画されてからでないと取得できないため)

```javascript

mounted () {
  // 要素の幅を取得するメソッド
  this.getTargetWidth()
  // ユーザーがウィンドウサイズを変更したら実行されるようにする
  window.addEventListener('resize', this.getTargetWidth)
},
methods: {
  getTargetWidth () {
    let targetWidth = this.$refs.getParentWidth.clientWidth
    console.log(targetWidth) // 要素の幅をInt型で取得する事ができる
  }
}
```
RPi Zero WをUSBキーボードにするときのls: write error: Device or resource busy

Raspberry Pi Zero Wを買ってUSBキーボードにしようとおもってハマったのでメモ。

# 準備
Raspberry Pi Zero (W) をUSBキーボード（USBガジェット）にするhttps://qiita.com/exthnet/items/98aa9b6d6a606f8f2cf8
こちらのページを参考にセットアップをします。

# 発生したエラー

```
mkdir: cannot create directory ‘functions/hid.usb0’: No such file or directory
/usr/bin/isticktoit_usb: line 18: functions/hid.usb0/protocol: No such file or directory
/usr/bin/isticktoit_usb: line 19: functions/hid.usb0/subclass: No such file or directory
/usr/bin/isticktoit_usb: line 20: functions/hid.usb0/report_length: No such file or directory
/usr/bin/isticktoit_usb: line 21: functions/hid.usb0/report_desc: No such file or directory
ln: failed to create symbolic link 'configs/c.1/hid.usb0': No such file or directory
ls: write error: Device or resource busy
```
もしくは

```
ls: write error: Device or resource busy
```

# 重要なところ
cmdline.txtが重要です。

```
sudo vim /boot/cmdline.txt
```
~~modules-loadを以下のように記述します~~

```
modules-load=dwc2,libcomposite
```
~~libcompositeのところをg_etherとかg_serialにするとエラーが出ました。~~

modules-load=dwc2,libcompositeの記述を削除することで解決できました。
Qiitaコントリビューション数をGitHubのプロフィールに貼ってドヤれるサービスを作った

![2020-08-19 18.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180411/3a2ca72a-b61f-64a9-1102-4db367fd6610.png)


# みなさん、GitHubプロフィール使ってますか？

自分のユーザー名と同じリポジトリ名にREADME.mdを置くと、[GitHubのプロフィール画面](https://docs.github.com/ja/github/setting-up-and-managing-your-github-profile/managing-your-profile-readme)に表示できます。

# なぜ作ったか

GitHubプロフィールを飾りたい！飾っておけばきっとGitHub経由でスカウトが来るはず！
なによりGitHubプロフィールだけみてもらえば実績がまとまっている。そんなページを作りたい
そんなモチベーションで作りました。

# できたもの
こんな感じのバッジを作れます！
[![My Qiita posts](https://qiita-badge.apiapi.app/s/mikkame/posts.svg)](http://qiita.com/mikkame) [![My Qiita contributions](https://qiita-badge.apiapi.app/s/mikkame/contributions.svg)](http://qiita.com/mikkame) [![My Qiita followers](https://qiita-badge.apiapi.app/s/mikkame/followers.svg)](http://qiita.com/mikkame)


# 使い方

**[GitHub Like Badge for Qiita](https://qiita-badge.apiapi.app/)**にアクセスして
あなたの**Qiitaユーザー名**を入力します。
すると、下記のように雛形のmarkdownが出てきますので。コピーして**README.mdにペースト、**その後コミットしてください！（ローカルであればpushも）

```md

# My Qiita posts
[![My Qiita posts](https://qiita-badge.apiapi.app/s/mikkame/posts.svg)](http://qiita.com/mikkame)
# My Qiita contributions
[![My Qiita contributions](https://qiita-badge.apiapi.app/s/mikkame/contributions.svg)](http://qiita.com/mikkame)
# My Qiita followers
[![My Qiita followers](https://qiita-badge.apiapi.app/s/mikkame/followers.svg)](http://qiita.com/mikkame)
                
```

# 仕組み

**QiitaAPI**(一部力技で取得)から取得したデータを**[https://shields.io/](https://shields.io/)**というバッジ生成サービスにリダイレクトする形で実現しています。
小さなシステムなのでファイルキャッシュでゴリ押ししています。
[https://shields.io/](https://shields.io/) では、URLにパラメータとして表示したい文字を送ればいい感じにSVGを作ってくれます。
自前で実装するコストを省けます。~~障害点は増えますがきっと私の方が障害確率が高いので考えない事にします！~~


データベースを使ってないので今流行りの**NoSQL**サービスです

# 使ってみてください！

サービスURL: [Github Like Badge for Qiita](https://qiita-badge.apiapi.app/)


# Some more things...

[https://teratail.com/](https://teratail.com/)のスコアをバッジにしてドヤれるサービスを作成中です。
他にもこんなバッジ欲しい！というのがあればご相談ください！


# 追記

GitHubもQiitaもmd内の画像を独自URLに置換してキャッシュするようでした。
リダイレクト方式だとキャッシュがコントロール仕切れないので一旦自前で貰い受けるようにしました。
Cloudflareでエッジキャッシュを有効にしつつ、no-cacheヘッダを吐くと、サーバには負荷が掛からないがコンテンツキャッシュされないいい感じの構成になりました。（本当になっているのか検証中）
(https://shields.io/ のdynamicを使っておけばよかったのですが・・・)
OpenMPとMicrosoft PPLとParallel STLを比較してみる（その２）

# はじめに

前回の記事
[OpenMPとMicrosoft PPLとParallel STLを比較してみる（その１）](https://qiita.com/shohirose/items/ade1f60f5eff13922aae)
にてMicrosoft PPLがSequentialよりも遅かったので、パフォーマンスを改善してベンチマークを行いました。ベンチマークには[google benchmark](https://github.com/google/benchmark)を使用しました。
コードは[shohirose/openmp-examples/benchmark](https://github.com/shohirose/openmp-examples/tree/master/benchmark)にあげてあります。

# コード解説

前回の記事のコードをベンチマークしやすいようにリファクタリングしたものを使っています。


```cpp:parallel_benchmark.cpp
#include <benchmark/benchmark.h>

#include "function.hpp"

using namespace shirose;

std::vector<Point>& getPoints() {
  static std::vector<Point> points = generatePoints(10'000'000);
  return points;
}

template <typename Counter>
void BM_PiCalculation(benchmark::State& state) {
  const auto& points = getPoints();
  for (auto _ : state) {
    const auto numPoints = state.range(0);
    const auto pi = calcPi(points.data(), numPoints, Counter{});
    benchmark::DoNotOptimize(pi);
  }
}

BENCHMARK_TEMPLATE(BM_PiCalculation, SequentialSTLCounter)
    ->RangeMultiplier(4)
    ->Range(1 << 10, 1 << 22);

BENCHMARK_TEMPLATE(BM_PiCalculation, OpenMPCounter)
    ->RangeMultiplier(4)
    ->Range(1 << 10, 1 << 22);

BENCHMARK_TEMPLATE(BM_PiCalculation, MicrosoftPPLCounter)
    ->RangeMultiplier(4)
    ->Range(1 << 10, 1 << 22);

BENCHMARK_TEMPLATE(BM_PiCalculation, ChunkedMicrosoftPPLCounter)
    ->RangeMultiplier(4)
    ->Range(1 << 10, 1 << 22);

BENCHMARK_TEMPLATE(BM_PiCalculation, ParallelSTLCounter)
    ->RangeMultiplier(4)
    ->Range(1 << 10, 1 << 22);

BENCHMARK_TEMPLATE(BM_PiCalculation, ParallelOrVectorizedSTLCounter)
    ->RangeMultiplier(4)
    ->Range(1 << 10, 1 << 22);

BENCHMARK_MAIN();
```

`ParallelSTLCounter`は`std::execution::par`を使い、`ParallelOrVectorizedSTLCounter`は`std::execution::par_unseq`を使っています。`ChunkedMicrosoftPPLCounter`は自分で範囲を分割して`concurrency::parallel_for`内でforループを回しています。

各クラスの詳細はファイルを直接みてもらうものとして、google benchmarkに係る部分について解説します。
まず点をランダムに生成する`generatePoints`は重い処理なので、ベンチマーク開始のときに`getPoints`関数内で十分な数を一度だけ生成してしまいます。各ベンチマークではその点列を使って円周率を計算しています。ベンチマーク関数内に初期化処理を記載するとベンチマークを実行するたびに初期化処理が行われ、ベンチマーク全体が非常に遅くなるため、それを避けるためにベンチマーク外で初期化を行っています。

# 結果

## データサイズとCPU時間

![cputime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130485/8fd3dae5-8c3c-cf32-dafe-4a440f1a326d.png)

Core i7 9700K（8コア）を使っているので、コア当たりのデータサイズに対してCPU時間をプロットしました（Sequentialは1スレッドですが比較のため合わせています）。
データサイズが小さいと計算時間はOpenMP<Chunked Microsoft PPL<Sequential STL<Parallel STLs<Microsoft PPLの順ですが、ある程度データサイズが大きくなるとOpenMP=Chunked Microsoft PPL=Parallel STLs<Sequential STL<Microsoft PPLとなりました。Core i7 9700KのL2キャッシュが256KB（コア当たり）なので、図1の128～512KBの間の屈曲はL2キャッシュを超えてしまったことが原因と考えています。


## データサイズと速度向上率

![speedup-ratio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130485/f691dfe0-4d37-e344-758f-6ab63963bd10.png)

上図は同じデータサイズのSequentialに対する速度向上率を示しています。
データサイズが小さい（512KB未満）ではOpenMPが最も早く、次にマニュアル調整したChunked Microsoft PPLが続きました。データサイズが大きくなるとSTLもOpenMPとChunked Microsoft PPLとほぼ同程度の速度が出ています。小さなループではOpenMPが非常に強いですね…
ActiveDirectoryの構築まとめ


# はじめに
検証用にActiveDirectoryを構築したので簡単に手順をまとめます。仕事の性質上オンプレ案件しかないので、VM上にWindowsサーバ作ってADをセットアップする感じです。

## 1.環境
OS:Windows Server 2016
Hypervisor:VMware ESXi6.7
CPU:2コア,メモリ:4G,HDD:50GB

## 2.OSインストール
VMのコンソールからWindows Server 2016 Datacenter（デスクトップ エクスペリエンス)を選択
→たまにWindows Server 2016 Datacenterを選択してServerCoreになっちってしょぼーんとなります。(´・ω・｀)
![OS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693852/fbab6338-f435-c76e-58be-73b3b10973ed.jpeg)

あとは画面に従って次へ次へ。

## 3.OSインストール後の作業
### 3.1 VMwareToolsのインストール
VMコンソールから、VMtoolsをマウントしてインストール！
→再起動

### 3.2 NW関連の設定変更
①IPアドレスをDHCPから固定に変更。
②私のお客さんの環境はIPv6を無効にする案件が多いのでIPv6の無効化の設定。
※言わずもがなですが、ADはIPv6有効でも作れます。
無効にする場合は、まずNICのIPv6のチェックボックスoff
![アダプタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693852/e45e3841-183c-4dc5-0c2c-c059f16270b3.png)

次にレジストリのキー追加
レジストリエディタからでもいいし以下のコマンドで追加してもOK

```
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ /v DisabledComponents /t REG_DWORD /d 0xffffffff
```

最後にホスト名を変更
→再起動！

### 3.3 リモートデスクトップの設定
「win」+R → sysdm.cpl → リモートタブ
「このコンピュータへのリモートデスクトップ接続を許可する」に設定変更！
「ネットワークレベル認証でリモートデスクトップを実行しているコンピュータからのみ接続を許可する(推奨)」はお好みで。
![remote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693852/cc2fbb61-884f-3740-3961-a06ae2cfc8c6.png)

### 3.4 Firewallの無効化
検証環境なのでWindowsファイアウォールは無効にする。
「Win」+R → control →「Windowsファイアウォール」
 画面左側の「Windowsファイアウォールの有効化または無効化」をクリックして全部無効にする。

### 3.5 UACの無効化
ADを作るときはUACを無効にしています。
GUIからでもいいし、以下のコマンドで追加してもOK

```
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system /v EnableLUA /t REG_DWORD /d 0x00000000
```

これでOS周りの準備完了。次回はADの構築に入ります。
docker-composeのwordpressでのアップロードサイズを変更

#docker-compose.ymlの変更
反映されず・・・
ここの原因を探る時間が惜しいので、直接コンテナに入ってuploads.iniを変更した。
そのメモ。

##コンテナに入る
コンテナリストを表示する。
``` $ docker ps ```

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
000000000000        wordpress:latest    "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:8081->80/tcp   wordpress_1
000000000000        mysql:5.6           "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        3306/tcp               db_1
```
コンテナに入る。コンテナ名はコンテナリストのNAMES。
```$ docker exec -it {コンテナ名} /bin/bash```

この場合だと
```$ docker exec -it wordpress_1 /bin/bash```

入った

```
root@000000000000:/var/www/html#
```

##コンテナ内でviコマンドを使えるようにする
vimをインストール
```# apt-get update```
```# apt-get install vim```

##uploads.iniを編集する
uploads.iniを内包しているディレクトリに移動
```# cd /usr/local/etc/php/conf.d/```

念の為ファイル名を確認
```# ls```

uploads.iniがあれば編集する
```# vi uploads.ini```

以下のように書き換える。

```
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600
```

viコマンドの使い方
https://prev.net-newbie.com/linux/commands/vi.html

##コンテナを再起動して完了
以上です。
TypeScript/JavaScript でメモ化する

# 例1. TypeScript

引数に function を渡す。
二回目以降の呼び出しでは、引数の function、またはその引数（ここでは `data`）にアクセス出来ない状況を想定。

## 定義

```typescript
type ValidationResponse = {
  valid: boolean
  errors: string[]
}

const validator = (
  validatorFn?: () => ValidationResponse
): ValidationResponse => {
  if (!validator.result['cached'] && validatorFn) {
    validator.result['cached'] = validatorFn()
  }

  return validator.result['cached']
}
validator.result = {}
```

## 呼び出し

```typescript
// 一度目
// 引数（validatorFn）を渡す。
const { valid } = validator(() => validatorFn(data))

// 二度目
// 引数（validatorFn）を渡さない。
const { errors } = validator()
```

# 例2. JavaScript

```javascript
var myFunc = function (param) {
  if (!myFunc.cache[param]) {
    var result = [];
    // 重たい処理
    myFunc.cache[param] = result;
  }
  return myFunc.cache[param];
};
// キャッシュ
myFunc.cache = {};
```

※ [JavaScriptパターン](https://www.amazon.co.jp/dp/4873114888) p79 より引用。
Github Actions で secret を使う



## secret の登録

github の project の setting > secrets から登録する
https://github.com/$user/$project/settings/secrets 

ここでは、 `SECRET_HOGE` という適当な secret を作った。

## secret を環境変数に入れる

https://docs.github.com/ja/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets



```yml
# .github/workflows/hello.yml

name: Hello
on: push
env:
  SECRET_HOGE_1: ${{secrets.SECRET_HOGE}} ## ※1
jobs:
  hello:
    runs-on: ubuntu-latest
    name: Hello
    steps:
      - name: Checkout
        uses: actions/checkout@master
      - name: run hello action
        env:
          SECRET_HOGE_2: ${{secrets.SECRET_HOGE}}  ## ※2
        uses: ./.github/actions/hello
```

下記の3ヶ所で設定できてスコープが違う

* env
* jobs.\<job_id\>.env
* jobs.\<job_id\>.steps.env


## action から使用


```js
// .github/actions/hello/index.js
console.log("SECRET_HOGE_1 = ", process.env.SECRET_HOGE_1); 
console.log("SECRET_HOGE_2 = ", process.env.SECRET_HOGE_２);
```

githubの画面上のアウトプットは一応 *** とマスクされるけど、実際は出力しちゃだめ

```
Run ./.github/actions/hello

SECRET_HOGE_1 =  ***
SECRET_HOGE_2 =  ***
```
DOY (Day Of the Year)を日付フォーマットに変換 / How to convert DOY to Month and Date

DOY (Day Of the Year, or DayNumber)は日本ではあまり使われないようだが、ある日付がその年の1月1日から数えて何日目にあたるかを示す日付の通し番号であり、1-366の値を取る。別途「年」を表す記号と合わせて製品の製造日情報などで使われる事が多いと思われる。このDOYから一般の日付、Dateに変換する方法を探したがそのものズバリは見つからなかったので備忘録を兼ねて記す。

DOYはPythonでは　Day of the year as a decimal number [001,366]　という事でPythonのclass time.struct_timeに存在しAttributeはtm_ydayとなっている。strftime等で扱う場合のDirectiveは%jとなる。

例えば年番号: 19、DOY: 275が与えられた場合は以下の様にstrptimeで入力し、strftimeで形式を指定して任意の日付フォーマットで書き出せる。2019年のDOY275が10月2日であると分かる。

> import time
> ddd=time.strptime("19 275","%y %j")
> print (ddd)
time.struct_time(tm_year=2019, tm_mon=10, tm_mday=2, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=275, tm_isdst=-1)
> from time import strftime
> strftime("%d/%m/%y", ddd)
'02/10/19'

追記
その後、こういうのを見つけてしまいました。
datetime.datetime(year, 1, 1) + datetime.timedelta(days - 1)
上の例の　year=2019, days = 275 の結果は
datetime.datetime(2019, 10, 2, 0, 0)
となります。書式指定して書き出すなら手間は変わらないかもしれませんがシンプルですね。

参考URL
https://docs.python.org/2/library/time.html
https://stackoverflow.com/questions/2427555/python-question-year-and-day-of-year-to-date
演算子

# 演算子

算術演算子
算術演算子は、共通の数学演算を実行するために、数値で使用されています。
整数型int、浮動小数点型floatなどの数値に対しては四則演算やべき乗、リスト（配列）や文字列に対しては結合や繰り返しなどの処理を行うことができる。

|演算子|説明|
|:---|:---|
|+a|正数|
|-a |負数|
|a + b|加算|
|a - b| 減算|
a * b|乗算|
a / b|除算|
a % b|a を b で割った余り|
a ** b|a の b 乗|
a // b|切り捨て除算|
代入演算子
代入演算子は変数に値を割り当てるために使用されています。

|演算子|説明|
|:---|:---|
a = b|a に b を代入する
a += b|a = a + b に同じ
a -= b|a = a - b に同じ
a *= b|a = a * b に同じ
a /= b|a = a / b に同じ
a %= b|a = a % b に同じ
a **= b|a = a ** b に同じ
a //= b|a = a // b に同じ
a &= b|a = a & b に同じ
a |= b|a = a | b に同じ
a ^= b|a = a ^ b に同じ
a <<= b|a = a << b に同じ
a >>= b|a = a >> b に同じ)

比較演算子
比較演算子は、2つの値を比較するために使用されています

|演算子|説明|
|:---|:---|
a == b|a が b と等しい
a != b|a が b と異なる
a < b|a が b よりも小さい
a > b|a が b よりも大きい
a <= b|a が b 以下である
a >= b|a が b 以上である
a <> b|a が b と異なる
a is b|a が b と等しい
a is not b|a が b と異なる
a in b|a が b に含まれる
a not in b|a が b に含まれない

ブール演算子(and, or, not)
下記のブール演算子が定義されています。
論理演算子はブール演算子とも呼ばれ、条件式内で主にtrueかfalseを返すために、if文の条件式でよく使われます。trueとは、論理演算子で論理演算された値の結果が正しい場合の真を意味します。falseとは、論理演算子で論理演算された値の結果が正しい場合の真を意味します。

|演算子|説明|
|:---|:---|
a and b|a も b も真であれば真
a or b|a または b が真であれば真
not a|a が偽であれば真

ビット演算子
ビット単位の演算子は（バイナリ）数を比較するために使用されます。

|演算子|説明|
|:---|:---|
~a|ビット反転
a & b|AND:論理積(aもbも1のビットが1)
a | b|OR:論理和(aまたはbが1のビットが1)
a ^ b|XOR:排他的論理和(aまたはbが1のビットが1)
a << b |b ビット左シフト
a >> b|b ビット右シフト
DynamoDB@boto3のクエリの書き方メモ（GSIを使う場合）

DynamoDBのクエリの書き方＠boto3メモ。忘れがちなあなたに。

## DynamoDBのテーブルの項目定義

パーティションキー：id
ソートキー　　　　：sid
属性１　　　　　　：data1

で、

GSIとして↓を設定済み。
パーティションキー：id
ソートキー　　　　：data1
インデックス名　　：id-data1-index

↑の状態でGSIのid-data1-indexを使ってqueryする

## コード

```python
import boto3
client = boto3.client('dynamodb')

paginator = client.get_paginator('query')
operation_parameters = {
	'TableName': 'test-name',
	# キーとして、id と data1 を指定する
	'KeyConditionExpression': 'id = :id and begins_with(data1, :data1)',
	'ExpressionAttributeValues': {
		':id': {'S': 'id00'},
		':data1': {'S': 'data1-00-000'},
	},
	# GSIを指定
	'IndexName': 'id-data1-index',
}

page_iterator = paginator.paginate(**operation_parameters)
for page in page_iterator:
	# do something
	# del page['Items']
	print(page)
	pass
```
CPUの性能指標、CPUの高速化技術、CPUアーキテクチャ

#CPUの性能指標
 CPUの性能はクロック周波数やCPI、MIPSなどの指標値を用いて評価される。
 **クロック周波数とは**
　コンピュータには色んな装置が入っている。それらがてんでバラバラに動いていてはまともに動作しないので
　「クロック」と呼ばれる周期的な信号に合わせて動くのが決まり事になっている。
　![図54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/5eea9923-c7a4-422b-142f-8359d288c87d.png)
　また、クロックが１秒間に繰り返される回数のことをクロック周波数と呼ぶ。
　単位は**「Hz」**例えば「クロック周波数1GHzのCPU」の場合は１秒間に10億回振動していることになる。
　**CPI(Clock cycles Per Instruction)**
  CPIというのは「1命令あたり何クロックサイクル必要か」という意味
　例えば、CPUが「1GHz」で実行に3クロックを要する命令(3CPI)だった場合は以下の通りになる。
　![図55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/09a1d094-eae2-efef-3c2b-2753fb8611b4.png)

　
　**MIPS(Million Instrucutions Per Seccond)**
  MIPSは「１秒間に実行できる命令の数」という意味
　例えば「１つの命令を実行するのに平均して２ナノ秒かかる」CPUがあった場合、MIPS値は以下のようになる。
　![図56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/99c3accd-9611-8fbc-626c-64e94a1c4109.png)


#CPUの高速化技術
　随時制御方式で命令を単純に実行していくと以下の通りの手順を要します。
![図58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/b94f1c94-543f-7fd8-10f2-816b2c47d894.png)

　
ただ、この手順だとほとんどの回路が出万待ちしているだけでもったないない
　　![図59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/fd0336f3-c810-3c20-6cea-3c7e2421b242.png)

なので、下記の処理で無駄をなくす方法は以下の通り

#パイプライン処理
　複数の命令を平行して実行させることができれば、回路の遊び時間をなくし、処理効率を高めることできる　
　![図57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/e6650a48-a794-8e7d-21ec-d50163070645.png)

パイプライン処理による高速化をさらに推し進める手法として、**スーパーパイプライン**や**スーパースカラ**がある

**スーパーパイプライン**
 各ステージの中身をさらに細かいステージに分割することで、パイプライン処理の効率アップを図るもの。
　![図60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/0af13225-17f8-4f53-9bdb-95321557e1ec.png)



**スーパースカラ**
パイプライン処理を行う回路を複数持たせることで、まったく同時に複数の命令を実行できるようにしたもの。
![図61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/bf7e59a3-fda5-2597-9f8b-7115304c32e6.png)


#CPUアーキテクチャ
　CPUには、高機能な命令を持つ**CISC**と単純な命令のみで構成される**RISC**という２つのアーキテクチャがある

 **CISC(Complex Instruciton Set Computer)**
   主に以下の機能がある
　　・マイクロプログラムを内部に記憶させることで高機能な命令が実現できる
　　・命令の追加や変更が用意
　　・便利な命令がそろっているので、機械語のプログラム作成が楽
　　・命令の実行速度は遅い
　　・命令の長さや実行速度がバラバラ
 **RISC(Reduced Instruction Set Copmputer)**
　　・ワイヤードロジックによってすべての命令をハードウェア的に実装
　　・命令の追加や変更は難しい
    ・単純な命令があるだけなので、手作業による機械語のプログラム作成は困難
　　・命令の実行速度が速い
　　・命令の長さや実行速度がほとんど等しい


#以上
Linqのcount()が遅すぎた。

#LINQのcountが遅い
暇すぎてpaizaをやっていたが、タイムアウトしてしまうテストケースがあった。
Linqで書いていた部分を直したらテストが通ったので、速度の調査をしてみた。
簡単な自作関数とLINQのcountで、特定の数以上の要素の数を数えて処理速度を測定してみる。

##コード
```C#
        static void Main(string[] args)
        {
            List<int> inputs = new List<int>();
            var sw = new System.Diagnostics.Stopwatch();
            int target = 1000;
            int inputCount = 100000;

            //要素注入
            for (int i = 0; i < inputCount; i++)
            {
                inputs.Add(i);
            }

            //自作
            sw.Start();
            int cnt1 = BigCount(inputs, target, inputCount);
            sw.Stop();
            TimeSpan time = sw.Elapsed;
            Console.WriteLine("結果(自作) / 要素数:"+cnt1 +" / 処理速度:"+ time);

            //Linq
            sw.Restart();
            int cnt2 = inputs.Count(m => m >= target);
            sw.Stop();
            TimeSpan time2 = sw.Elapsed;
            Console.WriteLine("結果(Linq) / 要素数:" + cnt2 + " / 処理速度:" + time2);
        }

        //targer以上の要素の個数を返す
        public static int BigCount(List<int> inputs, int target, int inputCount)
        {
            int ret = 0;
            for (int i = 0; i < inputCount; i++)
            {
                if (inputs[i] >= target)
                {
                    ret++;
                }
            }
            return ret;
        }
```

##結果

```
結果(自作) / 要素数:99000 / 処理速度:00:00:00.0004307
結果(Linq) / 要素数:99000 / 処理速度:00:00:00.0011384
```

3倍くらいの差がでました。
ほぼ誤差なので実務的にも可読性のいいLinqを使うべし！
基礎Webアプリケーション作成　Servlet/JSP（ログアウト機能）

#はじめに
今回は前回、[基礎Webアプリケーション作成　Servlet/JSP（投稿画面）](https://qiita.com/tatufut/items/762e83382b124d793ee1)の続きを行います。
この記事で目指すのはセッションスコープの破棄を行いログアウトする機能を実装します。

##実行環境
- Eclipse4.16
- Tomcat9
- Java11

##1.ログアウト処理に関するコントローラー

```java:Logout.java
@WebServlet("/Logout")
public class Logout extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Logout() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.invalidate();            //1
		request.getRequestDispatcher("/WEB-INF/view/logout.jsp").forward(request,response);       //2
	}

}

```
1. セッションスコープを破棄する。
2. ログアウト画面をフォワードする

##2.掲示板画面のビュー修正
```jsp:bulletin-board.jsp
<h2>こちらは掲示板画面です。</h2>
<p><c:out value="${loginUser.name}"/>さんがログイン中です。</p>
<a href="./Logout">ログアウトする</a>  //ログアウト実行するURL指定
```

##ログアウト画面のビュー作成
```jsp:logout.jsp
<p>ログアウトしました。</p>
<a href="./login">掲示板画面へ</a>
```
上記を追加してログアウト機能は完成。
【Unity Hub】「モジュールを加える」が表示されない

UnityAndroidでJDKが見つからないくて、HUBから「モジュールを加える」で解決できるとあるが、それが表示されない。
Unity20194.5.1LTS,Unity20194.8LTSで発生

これで⇓解決できそうなのでメモ
---

【Unity Hub】「モジュールを加える」が表示されない方へ
https://koshishirai.com/unity-add-module/

---
★　windows10proで確認

Hubから削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/ec966b5e-a3a7-1155-a5c5-b6646547c3ea.png)

次に　https://unity3d.com/jp/get-unity/download/archive から使いたいVERのUnityHUB（緑ボタン）を選択する。
そしたら次の画面でる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/3775131b-9833-a5db-dd97-af574ebce0ac.png)

Documentを追加する。
右クリックで「モジュールを追加する」が出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/7aebd27c-aaad-7363-f44f-0a96610c38e5.png)
Laravel Mixでfontawesome5を使えるように設定

Laravelでfontawesomeを使えるようにしたい。

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

```
$ yarn add @fortawesome/fontawesome-svg-core
$ yarn add @fortawesome/free-solid-svg-icons @fortawesome/free-regular-svg-icons @fortawesome/free-brands-svg-icons --dev
```

`fontawesome-svg-core`以外は必要なものだけで大丈夫。今回は以下の３つを追加しました。

* free-solid-svg-icons
* free-regular-svg-icons
* free-brands-svg-icons

### 読み込み用のファイル作成

fontawesome.jsを作成して読み込む形にします。

```fontawesome.js
import { library, dom } from '@fortawesome/fontawesome-svg-core'
import { faPlusCircle } from '@fortawesome/free-solid-svg-icons'
library.add(
    faPlusCircle
)
dom.watch()
```

必要な物をひとつひとつ追加。

```fontawesome.js
import { fab } from '@fortawesome/free-brands-svg-icons'
library.add(fab)
```

ひとつずつ追加するのが面倒な場合は上のように全部追加しちゃえばいいかと。

### コンパイル

```
$ yarn watch
```

コンパイルしたら、bladeに以下のように書けば表示されれます。

```blade.php
<i class="fas fa-plus-circle"></i> 新規追加
```
【Linux】過去に実行したコマンドの一覧を取得するコマンド


自分用のメモ用です。
カレントディレクトリのファイル一覧の出力用コマンド。

#■やり方

#ファイル一覧
```shell
ls -1 -F |grep -v "/"
```
#フォルダ一覧
```shell
ls -1 -F |grep "/"
```
#ファイルとフォルダ一覧
```shell
ls -1 -F
```
【rails5】 本番環境でDBリセット

#結論
本番環境で```rake db:migrate:reset```してもデータが消えない

#対応

```bash:本番サーバー
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
```
上記コマンドを叩くと擬似的？にデータが消える。
その後、通常通り
```db:create RAILS_ENV=production```
```db:migrate RAILS_ENV=production```
```db:seed RAILS_ENV=production```
を実行する
#参考
[本番環境のdbをリセットする方法](https://qiita.com/potterqaz/items/ea6db5c5be2be389c0bb)
【Laravel】RESTful

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
[PHPフレームワーク Laravel入門 第2版](https://www.amazon.co.jp/dp/B08625YD7H/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

#RESTful
##RESTfulとは
RESTとは他のプログラムがアクセスして利用し、画面表示機能を持たないもの

このRESTに基づいて設計されたプログラムはRESTfulであると表現される。 

##リソースコントローラ
コントローラの作成時に `--resource`オプションを記載するとリソースコントラーになる。

これはリソースとしてコントローラにメソッド類を追記するため。

これにより作成されたコントローラは以下のアクションを持っている

|アクション|説明|
|---|---|
|index|一覧表示|
|create,store|新規作成|
|show|レコード表示|
|edit,update|更新|
|destroy|削除|


##リソースコントローラのルート情報記述
非常に簡単で、この1行で終わり

```php5
Route::resource('アドレス','リソースコントローラ名')
```
これだけで7つのアクションのメソッドがすべて登録される。

##JSONは配列をreturnする
アクションメソッド内で配列をreturnすると自動的にJSONに変換される。

##RESTfulにしていく
ここまでのLaravelの機能は性格にはRESTfulではない(ここまではResourcefull)

RESTfulではCRUDはすべて同じアドレスで、アクセスに使うHTTPメソッドの違いで処理を分ける
HTTPメソッドとCRUDの関係をまとめると以下になる

|HTTP|CRUD|
|---|---|
|GET|Read|
|POST|Create|
|PUT|Update|
|DELETE|Delete|

Resourcefullを実装していけば自然とRESTfulなサービスが完成していくと述べられている。
【rails5】jsがページ遷移時に読み込まれない問題

#結論
Turbolinksが原因でページ遷移などをした際にリロードしないとJavaScriptが動かないらしい

#対応
```js

$(document).on('turbolinks:load', function() {
```
JSの記述を上記で囲む。

#参考
[Rails ページ移動した際にリロードしないとJSが機能しない](https://qiita.com/MIRAI1221/items/664154f378cfe1f9e80a)
[Railsでページ読み込みしないとjsが効かないのを解決する方法](https://qiita.com/ryico/items/157b0f4288ce605de2a2)
MySQL⑩　日時

 #日時を扱う

####カラムを作る

current_timestamp,　⬅️初期値に保存した時の日時を指定
on update current_timestamp　⬅️更新時にその時の日時に変更


create table posts (
  id int unsigned primary key auto_increment,
  title varchar(255),
  body text,
  created datetime default current_timestamp,
  updated datetime default current_timestamp on update current_timestamp
);


####作成日時を変更する　update テーブル名 set created = '日時' ;
update posts set created = '2016-12-31 10:00:00' where id = 2;

####条件を作成日時で指定する
select * from posts where created > '2017-01-01';

####日時の計算　(created, interval 14 day)
select created, date_add(created, interval 14 day) from posts;　⬅️作成日時から14日後を表示
select created, date_add(created, interval 2 week) from posts;　⬅️作成日時から２週間後を表示


####書式を指定する　(created, '%W %M %Y')
select created, date_format(created, '%W %M %Y') from posts;
【rails5】統合テスト【rspec】【FactoryBot】

#結論
FactoryBotを使ってテスト用にDBにデータを用意した上でfeatureテストを書く

#対応
まずはFactoryBotでデータを用意

```factories/articles.rb
FactoryBot.define do
    factory :article do
        sequence(:title) { "title" }
        sequence(:body) { "body" }
    end
end
```

```factories/comments.rb
FactoryBot.define do
  factory :comment do
    sequence(:comment) { "comment"}
    association :article
    association :user
  end
end
```

```factories/users.rb
FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "name#{n}"}
    sequence(:password) { |n| "testpassword#{n}"}
  end
end
```

FactoryBotで用意したデータを用いてfeatureテストを書く

```features/article_spec.rb
require 'rails_helper'

feature '記事', type: :feature do
    let(:user_a) { FactoryBot.create(:user) }
    let(:user_b) { FactoryBot.create(:user) }
    let(:article) { FactoryBot.create(:article) }

    scenario '記事投稿・記事詳細画面のテスト' do
        # Aユーザーでログイン
        visit '/loginform'
        fill_in 'session[name]', with: user_a.name
        fill_in 'session[password]', with: user_a.password
        click_button 'ログイン'
        expect(page).to have_content 'ログインしました'
        # 記事投稿できる
        visit '/articles/new'
        fill_in 'article[title]', with: "記事のタイトル"
        fill_in 'article[body]', with: "記事の本文"
        click_button '保存'
        expect(page).to have_content '投稿を作成しました'
        # 自分の書いた記事には編集ボタンがある
        expect(page).to have_content '編集'
        # 自分の書いた記事には削除ボタンがある
        expect(page).to have_content '削除'
        # コメントフォームが存在する
        expect(page).to have_content 'コメントする'
        # 自分が書いた記事にはいいねボタンが存在しない
        expect(page).to have_no_selector('.like')

        # ログアウト
        find('a', text: 'LOGOUT').click
        expect(page).to have_content 'ログアウトしました'
        # Aユーザーの書いた記事ページへ
        find('.articles__card').click
        # 記事編集ボタンがない
        expect(page).to have_no_content '編集'
        # 記事削除ボタンがない
        expect(page).to have_no_content '削除'
        # コメントフォームが存在しない
        expect(page).to have_no_content 'コメントする'
        # いいねボタンが存在しない
        expect(page).to have_no_selector('.like')


        # Bユーザーでログイン
        visit '/loginform'
        fill_in 'session[name]', with: user_b.name
        fill_in 'session[password]', with: user_b.password
        click_button 'ログイン'
        expect(page).to have_content 'ログインしました'
        # Aユーザーの書いた記事ページへ
        find('.articles__card').click
        # 記事編集ボタンがない
        expect(page).to have_no_content '編集'
        # 記事削除ボタンがない
        expect(page).to have_no_content '削除'
        # コメントフォームが存在する
        expect(page).to have_content 'コメントする'
        # 他人が書いた記事にはいいねボタンが存在する
        expect(page).to have_selector('.like')

        # コメント投稿できる
        fill_in 'comment[comment]', with: "テストコメント"
        click_button '送信'
        expect(page).to have_content 'コメントを投稿しました'
        # 自分が投稿したコメントには削除ボタンが存在する
        expect(page).to have_selector('.comments__itemBtn')
    end
end
```
テスト実行

```bash:bash
 rspec /spec/features/
```
#参考
[FactoryBot（旧FactoryGirl）で関連データを同時に生成する方法いろいろ](https://qiita.com/metheglin/items/47116ccbdb26aa00e034)
ActiveRecord::PendingMigrationErrorの解決

スクールでのチーム開発中に起こった
エラー解決について、自分用にまとめておきます。


【状況】
チームでアプリ開発を進めており、
適宜マスターブランチが更新されている状態。

【起きている問題】
新しく機能を実装しようとブランチを切って
まずは表示確認のためにとローカルのサーバーを
起動すると下記のエラーが出た。

![スクリーンショット 2020-08-19 16.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659091/7bd0d161-3a4d-f144-1032-f35c796d83f3.png)

【仮説】
migrate pendingということで、migrateされていない
データベースがあるためのエラーかと推測

【作業】
ターミナルにて、
```
rails db:migrate:status
```
を実行し、状態を確認

![スクリーンショット 2020-08-19 16.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659091/77051560-221e-19b5-eccd-3e427c801ab1.png)


downとなっているので
migrationができていないよう。

```
rails db:migrate
```

上記を実行し、再度ステータス確認。
![スクリーンショット 2020-08-19 17.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659091/8cb6f776-793b-66c9-054e-b009ab89b253.png)

upとなったので、再度サーバーを起動。

うまく表示できた。

今後も同じエラーが出たら
ますはステータスの確認、そして
migrationの実行をまずは試してみる。
Alpine Linux で go バイナリを起動しようとすると not found が発生する

MultiStageBuild を行うと毎回ハマるのでメモ。


`/lib64/ld-linux-x86-64.so.2` が無いため起動できない。
以下を追加。

```Dockerfile
RUN apk add --no-cache libc6-compat
```


## 参考
https://qiita.com/MiCHiLU/items/1e80a5325b2746eaf2d4
https://stackoverflow.com/a/35613430
【rails5】単体テスト（model）【rspec】【FactoryBot】

#結論
モデルのテストでは主にバリデーションチェックが正しく機能しているか確認する
FactoryBotを使用する

#対応
FactoryBotでユーザーデータを作成

```rb:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "name#{n}"}
    sequence(:password) { |n| "testpassword#{n}"}
  end
end
```

モデルのテストを書くためのファイルを生成。　これによってspec/models/user_spec.rbが作られる

```bash:bash
rails g rspec:model User(モデル名)
```
テストを書く

```rb:spec/models/user_spec.rb

require 'rails_helper'

RSpec.describe User, type: :model do
  before do 
    @user = FactoryBot.build(:user)
  end

  describe 'バリデーション' do
    it 'nameとpasswordどちらも値が設定されていれば、OK' do
      expect(@user.valid?).to eq(true)
    end

    it 'nameが空だとNG' do
      @user.name = ''
      expect(@user.valid?).to eq(false)
    end

    it 'nameが10字でOK' do
      @user.name = 'a' * 10
      expect(@user.valid?).to eq(true)
    end

    it 'nameが11字でNG' do
      @user.name = 'a' * 11
      expect(@user.valid?).to eq(false)
    end

    it 'passwordが7字でNG' do
      @user.password = 'a' * 7
      expect(@user.valid?).to eq(false)
    end
  end
end

```

テスト実行

```bash:bash
rspec /spec/models/ファイル名
```


#参考
[初めてRSpecでRailsアプリのモデルをテストする](https://qiita.com/y4u0t2a1r0/items/ae4d832fbfb697b4b253)
[使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」](https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5)
[FactoryBot（旧FactoryGirl）で関連データを同時に生成する方法いろいろ](https://qiita.com/metheglin/items/47116ccbdb26aa00e034)
【rails5】フォームに初期値を入れておく

#結論
初期値はvalue
初期表示はplaceholder

#対応
初期値

```rb:**.html.erb
<%= form_for @user do |f| %>
 <div class="users__form">
  <%= f.label :name, 'ユーザー名' %>
  <%= f.text_field :name, value: @current_user.name, class: 'users__input' %>
 </div>
<% end %>
```

初期表示

```rb:**.html.erb
<%= form_for article do |f|%>
  <div class="writeArticle__formTitle">
    <%= f.label :title, 'タイトル' %>
    <%= f.text_field :title, placeholder:"最大40文字" %>
  </div>
<% end %>
```

#参考
https://happy-teeth.hatenablog.com/entry/2018/12/28/180747
【rails5】画像アップロード機能の実装【carrierwave】

#結論
carrierwaveというgemを使う
#対応
gemインストール

```rb:Gemfile
gem 'carrierwave'
```
imageという名前のアップローダーを作成し、postモデルにimageというカラムを追加してマウント

```bash:bash
rails generate uploader image
```
カラムを以下の方法で追加。カラムはstringであれば、問題ない。

```
rails generate migration add_image_to_posts　image:string
rails db:migrate
```
モデルに以下を追加。

```rb:**.rb
class Post < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end
```
veiwは以下

```html:**.html.erb
<%= form_for @post do |f| %>
  <%= f.file_field :image %>
  <%= f.submit 'アップロードする'%>
<% end %>
```
コントローラーは以下。ストロングパラメーターに特に違いなし。

```rb:**s_controller.rb
class PostsController < ApplicationController
def create
  @post = Post.new(post_params)
end

private

  def post_params
    params.require(:post).permit(:image)
  end
end
```
表示させる

```.html.erb
  <% if @article.image? %>
    <%= image_tag @article.image.url %>
  <% else %>
    <%= image_tag "default.png" %>
  <% end %>
```
削除する（例は記事削除時に記事に紐づいた画像を削除する例）

```rb:articles_controller.rb
def destroy
        @article.destroy
        @article.remove_image!
        @article.save
        redirect_to articles_path, flash: { notice: "「#{@article.title}」を削除しました"}
    end
```


#参考
基本的な導入手順↓
https://techacademy.jp/magazine/22195
表示させる↓
https://qiita.com/nekotanku/items/5da43600f35eada64eac#view%E3%82%92%E7%B7%A8%E9%9B%86
削除する↓
https://qiita.com/mh4gf/items/c31375ed5d9ebd5f53d6
【rails5】userのseed(devise使用時)【devise】

#結論
userテーブルをdeviseを使って作成した場合、通常のseeds.rbの書き方だとseedを実行してもDBに反映されない。
#対応
以下のように書く

```seeds.rb
user = User.new(:email => 'hogehoge@hoge.com', :password => 'hugahuga')
user.save!
```

#参考
[deviseで作ったusersテーブルにseeds.rbからユーザーを作成する](https://qiita.com/day-1/items/8eb903fcf083b30a17a4)
【rails5】データベースをリセットしたい場合

#結論
リセットしたい部分までマイグレーションを遡り、再度db:migrateする

#対応
該当のmigrateのversionを調べる

```bash:bash
rake db:migrate:status
```

該当のmigrationをやり直す

```bash:bash
rake db:migrate:redo VERSION=20200812125336
```
downしてupするのでテーブル作成のマイグレーションの場合テーブルの中身はリセットされる

複数の連続するマイグレーションをやり直したい場合

```bash:bash
rails db:rollback STEP=2(どこまで遡りたいか)
```


#参考
[Railsで指定バージョンのmigrationだけやり直す](https://qiita.com/youcune/items/5cb4dd151ce359c6a399)
[rails db:rollbackって一つずつしか差し戻せないんだよって話](https://qiita.com/ShYaruki/items/37007e97204705d5e87c)
学振でよく使うWord機能(Mac版)

# はじめに
春は学振の季節ですね.
数物系の学生は申請書のときくらいしかWordを使う機会がないのでWordを書くのは年に1回のイベントです[^1].
従って2年目以降申請書を書くとき，毎年Wordに関する全ての知識を忘れているのです...
毎回ググっているのも面倒くさいので申請書で僕がよく使う機能をまとめてみました[^2].

# 環境
macOS Mojave 10.14
Word2013 Mac版
Mac版とWindows版で細かいところが異なるようです.
Windows版の人の参考にならなかったらすみません.
ショートカットキーは<kbd>⌘</kbd>を適宜<kbd>Ctrl</kbd>に読み替えてれば動くと思います. 多分.

# 基本的なショートカット
選択した文字をボールド体に変更　<kbd>⌘</kbd>+<kbd>B</kbd>
選択した文字に下線を追加　<kbd>⌘</kbd>+<kbd>U</kbd>

# 箇条書きで無駄に空くスペースを調整
デフォルトでは箇条書きの番号や・の後ろに不自然なスペースが空きますのでこれを潰します.
1. 箇条書きを作って番号などの部分を選択して右クリックでメニューを開く.
2. メニューの中から`箇条書きと段落番号`をクリック.
3. 該当するスタイルを選択して`ユーザー設定...`をクリック.
4. 右側のプレビューを見ながら`字下げとぶら下げのインデント`のxx cmを調整していい感じの値にしましょう(僕は1.3 cmでした).

# 英数字前後のスペースを詰める
デフォルトだと英数字と日本語の間にスペースが広がってしまうのでこれを潰します.
![スクリーンショット 2020-08-19 16.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118901/6d9e048b-c2b5-8565-8137-bd2095d17bd2.png)
1. リボン(上側に出てるやつ)から上の図の右下の>が90度回転したやつを押すと行間設定が出るので最後の`行間のオプション...`を押す.
2. 段落の設定が出るので体裁設定を開く.
3. `文字幅と間隔`のリストから`日本語と英字の間隔を自動調整する`と`日本語と数字の間隔を自動調整する`のチェックを外す.
4. 下にある`既定に設定`を押してデフォルト設定にする.

# 行間の調整
情報量の多さと見やすさのトレードは悩ましいところです.
文字をギッチギチにするなとはよく言われる[^2]ものの実際通ってる申請書を見てみると結構真っ黒だったりします.
まあそれはそれとしてフォントと行間の調整は欠かせません.
どういうフォントや行間サイズがいいのかというのは学振本[^3]で議論されてますので気になる方はチェックしてみてください[^4].

ここでは行間設定の仕方について述べます.
1. 前節に示した上の図の右下のボタンを押して`行間のオプション...`を押す.
2. `インデントと行間間隔`から`間隔`の`行間`を`1行`から`固定値`に変更して値を調整する.
3. 下にある`既定に設定`を押してデフォルト設定にする.

# 図の回り込み設定
図を置いたときは周りの文章の回り込み設定をします.
次の2通りのやり方があります.

- コピペしたときに出るマークを押して四角に対応するボタン(下図参照)を選びます.
- 図を右クリックして文字列の折り返し→四角で文章が回り込みます.

![square.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118901/07c40cf5-3575-d5a5-42e6-4820bea33091.png)

# 図をグレースケールにする
いつからか存じ上げませんがカラーの図が使えなくなりました.
わざわざ論文の図を作り直して新しい図を作るのも面倒なのでWordの設定でグレースケールにしてしまいましょう[^5].

1. 図を右クリックして`図の書式設定`を開く.
2. 4つ目の山みたいなアイコンを押して`図の色`の`鮮やかさ`の値を0パーセントにする.

[^1]: 学生でなければ申請書地獄になって忘れないのかもしれません...
[^2]: スペースの調節ばかりしてる...
[^3]: [大上雅史著　学振申請書の書き方とコツ　改訂第2版　ＤＣ／ＰＤ獲得を目指す若者へ, 講談社](https://bookclub.kodansha.co.jp/product?item=0000351210)
[^4]: 実は行間の調整方法も学振本に書いてあるのですが, Windows用なので微妙にやり方が違います.具体的に言うとWindows版には段落設定を直接開く矢印がリボンにあります.
[^5]: 白黒でpdf出力してもできますが.
ニューラルネットワーク なぜDEEPにするのか？（非線形関数と線形関数）

ニューロンが発火する　　→１
ニューロンが発火しない　→０


パーセプトロン
(定義）・・・複数の信号を受け取り、１つの信号を出力するモノ。
パーセプトロンを重ねるとコンピューターの計算回路を表現すること、同じ。


＜電子回路の仕組みから見ることで、クリアになる＞

ANDゲートやNANDゲート、ORゲートをパーセプトロン（ノード）の値を調整することで、ゲートの役割に変わる。
ニューラルネットワークにおいて、AND,NAND,ORは同じ構造で作れる。
パーセプトロン　θ  <  wx + b




####重み　　　　入力の重要度を調整する
####バイアス　　 発火のしやすさを調整する

Qなぜ非線形が必要か？　（線形/非線形　で分ける意味）
A線形だと分けられない場合があるから。

![mutuki_neural_network_2_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/a9182655-9c5b-0656-2846-bf544e13a3b7.png)



Q　なぜ層を重ねる必要があるのか？
A　より柔軟な表現ができるから


（回路の視点で見る）
上図の通り、XOR　だけは線形で分けることができない！
Q　ではどうするか？　A回路を組み合わせて表現する

AND,OR,NANDの組み合わせでXORゲート（非線形でないと分けれない領域）を分けることができる。
XORは多層構造のネットワークとなる。そうすれば、線形では実現できない処理ができる



###ニューラルネットワークの大きな流れ
![single-perceptron.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/e6572f8e-5842-0377-f14c-b277f09b435b.png)


活性化関数をSTEP関数 （0or1で表現する関数)にするのがベーシックな原理
→活性化関数をSTEP関数以外で表現できないか？　※STEP関数は非線形関数である

＜ニューラルネットワークの活性化関数の変遷＞

１　STEP関数が活性化関数として使われていた
２　「バックプロパゲーション」が登場してから→「シグモイド関数」が活性化関数として使われる
３　最近は「ReLU」がよく使われる

（１→２)
バックプロパゲーションの処理過程では、「損失」を微分する。
その際の、損失の計算項目の一つである「予測値」は、活性化関数を通して計算される。
ステップ関数は微分できない。
代わりに、微分可能（differentiable）な「シグモイド関数」が活性化関数として採用された。

（２→３）
層が深くなるにつれ勾配が消えてしまう勾配消失問題（Vanishing gradient problem）が発生した。
勾配が消えていく理由は、シグモイド関数の微分係数の最大値が0.25（範囲は0.0～0.25）であり、
そのシグモイド関数を重ねれば重ねるほど勾配の値は小さくなっていくから。
「ReLU」関数は微分係数の最大値が1.0（範囲は0.0か1.0）であるため、採用される。


ニューラルネットワークの数字の動きを川の流れに見立てた場合

パーセプトロンの活性化にSTEP関数を採用すると、ニューラルネットワークは0・１の２値が流れる。
イメージ　「ししおどし」　流すのか流さないのか


」![japan_shishiodoshi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/5ec7545c-0325-b934-1218-690aeb144f79.png)


パーセプトロンの活性化にシグモイド関数（非線形）を採用すると、ニューラルネットワークは連続的な実数の値が流れる。
イメージ　「水車」　流れる水の量を調整

![gettyimages-156363223-612x612.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/bc631817-f67e-01b7-af8e-1a72fed9680c.jpeg)


なぜ非線形関数を使う必要があるのか？
線形関数を活性化に使った場合
y(x) = h(h(h(x))の３層の関数を考える。
この計算はy = c*c*c*x　の掛け算を行うが、
y(x) = ax (a=c**3)の一回の掛け算で表現できる。
つまり、隠れ層のないネットワークで表現できてしまうため、わざわざ層をたくさん作る必要がない。

改めて、なぜ層をたくさん作る必要があるか？　
柔軟な表現（XOR回路のような場合でも、分類できるようにするため）のため
Vue.js + webpackで画像表示されない

# 使用バージョン
```bash
$ npm list vue webpack
app@1.0.0
├── vue@2.6.11
└── webpack@4.41.6
```

# 問題
###webpackでurl-loaderを使い画像バンドルしたが表示できない。
画像ファイルはsrc/assets/直下に格納している。
componentやentry.tsなどはsrc/typescripts以下。
app
└── src
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── assets
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── typescripts

```vuejs:Img.vue
<template>
  <img :src="imgPath" />
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component
export default class Img extends Vue {
  public imgPath = '@/assets/no_image.png'
}
</script>
```

```javascript:webpack.config.js
{
  test: /\.(gif|png|jpg)$/,
  use: [
    {
      loader: 'url-loader',
      options: {
        limit: 8192,
      }
    }
  ]
},
```
# 解決
まず読み込み方を変更。

```typescript:Img.vue
public imgPath = require('@/assets/no_image.png')
```
> https://greko-engineer.hateblo.jp/entry/2020/03/05/231242

しかしまだ表示されず。。！
デベロッパーツールでimgタグのsrcを見ると[object Module]を参照している！
そこでurl-loaderのオプションにesModule: falseを追加。

```javascript:webpack.config.js
{
  test: /\.(gif|png|jpg)$/,
  use: [
    {
      loader: 'url-loader',
      options: {
        limit: 8192,
        esModule: false
      }
    }
  ]
},
```
> https://stackoverflow.com/questions/59070216/webpack-file-loader-outputs-object-module
> https://webpack.js.org/loaders/url-loader/#esmodule

表示されました！
はじめてのColaboratory 

ColaboratoryはGoogleアカウントがあれば使える。
インストール不要で無料のJupyter Notebookという感じ
https://colab.research.google.com/

ファイル→ノートブックを新規作成
Pythonの文をセルに打って、順番に実行できる。
```import tensorflow as tf
print(tf.__version__)
```
```2.3.0```
Ctrl+Enterもしくは左のボタンをクリックすると実行できる。
```import keras; print(keras.__version__)
```
```2.4.3```
最新のバージョンが入っている。
文字列のURLを自動でリンク化

自分用にまとめます。

#gemの追加
```ruby:gemfile
gem 'rails_autolink'
```

```
$ bundle install
```

#viewに記述

```ruby:view
= auto_link(simple_format(h(@gelande.hp), {}, sanitize: false, wrapper_tag: "div"))
```

完成！
URLをリンク化するJavascript (jQuery) 【正規表現】

#結論
```javascript:URLをリンクに置き換えるコード
// 1. 正規表現（httpから始まる文字列を判定）
var exp = /((?<!href="|href='|src="|src=')(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;

// 2. 要素1の中にあるURLをリンクに置き換える
$('要素1').html($('要素1').html().replace(exp, "<a href='$1'>$1</a>"))
```

#1. 正規表現でURL部分を判定する

```javascript:正規表現
var exp = /((?<!href="|href='|src="|src=')(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
```
*aタグの中のhref属性とimgタグのsrc属性のURLは除外


#2. replaceでhtmlの置き換え

```javascript:文章内のURLをリンクに変換
$('要素1').html($('要素1').html().replace(exp, "<a href='$1'>$1</a>"))

```
*aタグには target="_blank" rel="noopener" を追加した方が良いでしょう。


何か間違いなどございましたら、ご指摘頂けますようお願いいたしますm(_ _)m
SNMPの利用によるネットワーク監視

## SNMPとは
通信プロトコル
ネットワーク経由で機器を管理するときに使う。

「Simple　Network　Manager　Protocol」
　単純な　　　　　　管理　　　約束事

* SNMP 監視員さん管理者
* SNMPエージェント　監視員さん（実際に機器を監視するやつ）
* SNMPマネージャ　管理者さん（監視員から報告を受けて何かする）

監視対象
* ルーター
* LANスイッチ
* サーバ
* プリンタ

### 管理情報ベース（MIB）から監視対象の状況を判断
MIB「Manager　INformation　Base」の略で機器情報を集めたもの。

標準MIB　すべての機器に共通
拡張MIB　ベンダー固有

## SNMPマネージャー
SNMPの中核となる存在。
ネットワーク機器を監視するソフトウェア。機器にはWindowsやLinuxのサーバが用いられる。
SNMPエージェントとMIBをやりとりし、その情報を把握したり、書き換えをする。

※ネットワーク越しい機器を監視するため、直接機器の状態を把握できるわけではない、各機器のSNMPエージェントから得た情報をもとに機器全体を把握する

* ボーリングを行う　定期的に対象を監視したいとき（CPU使用量とか）