OmniAICreator/Qiita-1.07M huggingface dataset:
macOSのEmacsでOrg-modeのTaskJugglerエクスポートをできるようにするまで

macOSのEmacsではビルトインでOrg-modeがインストールされているため、何もしなくてもTaskJugglerファイルのエクスポートができるかと思いましたが、`ox-taskjuggler`が見つからなかったので調査しました。

## 環境

* macOS 10.15.6
    * macOS以外でも当てはまるかもしれません
* Emacs 27.1
    * HomeBrewでインストールしています

## OrgをOrg ELPA Archivesから取得するようにする

```:~/.emacs.d/init.el
(require 'package)
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t)
```

`init.el`を保存し、`M-x load-file`で再読み込みします。

## orgをインストールする

`M-x list-packages`すると、新しいバージョンの`org`(本稿執筆時点で20200831)があるのでこれをインストールします。

## org-plus-contribをインストールする

`ox-taskjuggler`はこのパッケージ内にあります。
`M-x list-packages`から`org-plus-contrib`を探し、これをインストールします。

インストール後、設定ファイルで`ox-taskjuggler`を呼び出すよう記述します。

```:~/.emacs.d/init.el
(require 'ox-taskjuggler)
```

再び、`M-x load-file`します。

`C-c C-e`のエクスポート画面に`[J] Export to TaskJuggler`という項目が表示されれば成功です。

## 注意

`org-plus-contrib`をインストールすると`~/.emacs`を編集、ファイルが無い場合は作成します。
そのため、`init.el`など派の人は記述を`init.el`に移動するといった対処が必要です。
WWDC2020のIAP(アプリ内課金)周りの修正について

※本記事は、 WWDC2020で一般公開されている情報 を元に作成しています。

参考にした情報:
https://developer.apple.com/videos/play/wwdc2020/10661/
https://9to5mac.com/2020/06/25/in-app-purchase-refund-notifications-developers/
https://www.namiml.com/blog/iap-updates-wwdc20

すみません、WWDC2020のIAP(アプリ内課金)周りの情報を全て網羅できているかはわかりません。
間違っているとかあれば、ご気軽にコメントくださいm(_ _)m

# IAP(アプリ内課金)の払い戻し通知

詳しくは調べていないですが、IAP(アプリ内課金)の払い戻し通知が利用可能になようです。
中程度から重度の範囲で実行できる7つの異なるアクションがあるようです。

![スクリーンショット 2020-09-04 16.04.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308423/12138b73-723a-62f6-46d6-05a12b14e9be.png)

# サブスクリプションをファミリー共有可能になる

サブスクリプションのファミリー共有はApp Store Connectで有効にできるようになるようです。

但し **サブスクリプションのファミリー共有をオンにすると、それを無効にすることはできない** そうなのでご注意ください。

isFamilySharableでファミリー共有のProductかわかり、ファミリー共有を無効にした際は
SKPaymentQueueのdidRevokeEntitlementForProductIdentifiersが呼ばれるようです。

![スクリーンショット 2020-09-04 16.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308423/7086ead4-a97c-66ac-ccf8-dc6390e59e7e.png)

# SKAdNetworkでIAP(アプリ内課金)行っているか追跡できる

広告からアプリをインストールを行った際にSKAdNetworkで追跡できると思いますが、IAP(アプリ内課金)行っているか追跡できるようです。他にも色々計測できるようです。

# SKOverlayで他のアプリインストール促進

下記のようにアプリインストールのバナー？を出してアプリ内で他のアプリのインストールを促進できるようになるようです。

App Clipからの本体アプリのインストール促進にも使えるっぽい？

![スクリーンショット 2020-09-04 16.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308423/4a818efc-22ea-26bc-d5d8-5b9aa79b42d3.png)

# StoreKitのテストの改善

以下のようなStoreKitのテストの改善があったようです

* シミュレータでStoreKitのテストができる
* StoreKitTestingでユニットテストができる
* その他諸々の改善
obnizOS for M5StickC でボタンとLEDを操作してみた

# はじめに

obniz を搭載した M5StickC を使って IoT のおもちゃを作ろうと思ったのですが、
obniz board を使ったプログラムはたくさん出てくるけど obnizOS for M5StickC のプログラムはググってもあまり見つからず、ちょっとひっかかった部分もあったのでとりあえず試したボタン操作と LED 操作についてまとめてみました！

※ 実装や動作確認が楽なので、プログラムは Node.js 版となります m(_ _)m

# 内蔵ボタンで操作

[ドキュメント](https://obniz.com/ja/doc/reference/common/class/m5stickc) にも書かれているので簡単！

```javascript:app.js
const Obniz = require('obniz');

const obniz = new Obniz.M5StickC('XXXX-XXXX');
obniz.onconnect = async () => {
  obniz.buttonA.onchange = state => {
    console.log(state);
  }
};
```

M5StickC の表の「M5」って書かれたボタンを押すと true になります。
`buttonB` だと上部のボタンみたいです。上部ってどこやねんって思ったけど、横向きにしたときの上部か。。
（縦向きで考えると画面右側上部のボタンになります）

# 外部ボタンで操作

本題はこれ。好きなスイッチボタンを使ってobnizを操作したくて調べてみたけど、意外とドキュメントにもまとまってなかったりしたのでちょっとだけ大変でした。

ボタンを **G26** と **GND** に接続した場合こうなります。

```javascript:app.js
const Obniz = require('obniz');

const obniz = new Obniz.M5StickC('XXXX-XXXX');
obniz.onconnect = async () => {
  // ピン設定
  const button = obniz.wired('Button', {signal: 26, pull: '3v'});

  button.onchange = state => {
    console.log(state);
  };
};
```

ポイントはピン設定で指定する `pull: '3v'` です。
これを書かないと true / false が延々と表示されるだけでボタン操作ができませんでした。
（ここが全然気づけなかった・・・）

## きっかけ

ふと、ボタンのドキュメントはどれかなと [**obniz Parts Library のボタンページ**](https://obniz.io/ja/sdk/parts/Button/README.md) を見たら、

> pullはオプショナルです。デフォルトは5Vにプルアップされます。
> 次の3つのいずれかを選択ください。
> ・"5v" 5vに内部プルアップします。(デフォルト)
> ・"3v" 3vに内部プルアップします。
> ・"0v" gndにプルダウンします。

と書いてありました。最初は「ふーん」って感じで完全スルーしていたのですが、
いろいろ調べている中で [**obnizOS for M5StickC ピンアウトページ**](https://obniz.com/ja/doc/reference/m5stickc/pinout) を見ると`Input 3.3v(default)` と書いてあるのを見つけ、「おやおや？まさかな・・・」ってことで上記のプログラムを書いてみたら無事動いたってオチです。つまり偶然w

でも動いたからOK！

# 内蔵 LED を点灯

こちらも [ドキュメント](https://obniz.com/ja/doc/reference/common/class/m5stickc) に書かれているので簡単！

```javascript:app.js
const Obniz = require('obniz');

const obniz = new Obniz.M5StickC('XXXX-XXXX');
obniz.onconnect = async () => {
  obniz.led.on();
};
```

# 外部 LED を点灯

こちらはボタン操作に比べれば割とすんなりいけましたね。

```javascript:app.js
const Obniz = require('obniz');

const obniz = new Obniz.M5StickC('XXXX-XXXX');
obniz.onconnect = async () => {
  const led = obniz.wired('LED', { anode: 26 });
  led.on();
};
```

## LED の余談

なんでみんな抵抗内蔵の LED 持ってるの？それがデファクトスタンダードなの？
自分は普通の LED しかないから抵抗わざわざつけてますよ。そしていつも LED のどちら側に抵抗つけるか悩む 笑

> 出力ピン → 抵抗 → LED の足の長い方 → LED の足の短い方 → GND

って今は覚えているけどまたいつ忘れるか・・・

# おわりに

obnizOS for M5StickC をいじるときは、

- [**obnizOS for M5StickC のドキュメント**](https://obniz.com/ja/doc/reference/common/class/m5stickc)
- [**obniz Parts Library のボタンページ**](https://obniz.io/ja/sdk/parts/Button/README.md) 

を合わせて見ればいけそう。他のパーツも使ってみて何かあればまた追記します。

それでは！≧(+･` ཀ･´)≦
【Nuxt.js】Nuxt実践編：axios + asyncData + nuxt-link

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

# 前置き
お試しAPIのJSONplaceholderを使って
遊んでみましょう⚡️🎸

![axios.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/6811183a-79db-d046-6898-56c6f4507a4b.gif)

タイトルを表示させ、
クリックでidに合わせた
動的リンクを行います🌟

データはこちらを使用します💡
https://jsonplaceholder.typicode.com/posts

axios, asyncData, nuxt-linkなどなど
復習できることが沢山😉❤️
できるところはやる必要がないので
ドンドン飛ばしてくださいね✈️⛅️

なんだっけこれ…🤦‍♂️
という方は過去の解説記事をご覧ください👀

【Nuxt.js】axios導入編：かんたん・お手軽API通信
https://wp.me/pc9NHC-gr

Let's try!

# Step1: axiosでデータを取得

![スクリーンショット 2020-08-27 11.40.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/82b1b1dd-400d-a239-4663-1264ff7b570c.png)

まずはaxiosを使って
データを取得しましょう📥
データの取得さえできれば良いので
ul>liにせず{{ articles }}で
簡単に書いてみましょう…！

axiosをインストールします。

【terminal】
$ npm install --save @nuxtjs/axios

ではコードを書いてみましょう！

ticktack…

できましたか？💡
コードを見ていきましょう！

## コード

### 正解コード①

axiosでgetするだけですね💡
Promiseが必要な非同期通信になるので
asyncData()内に記載します✍️
consoleはresや
res.dataを表示しても良いですね😄

```index.vue
<template>
 <p>{{ articles }}</p>
</template>

<script>
import axios from 'axios'
export default {
 asyncData () {
   return axios.get('https://jsonplaceholder.typicode.com/posts')
     .then((res) => {
       console.log('結果が帰ってくるまでお仕事')
       return { articles: res.data }
     })
 },
}
</script>
```

### 正解コード②

.thenの代わりに
async/awaitを使っても
もちろんOKです⭕🙆‍♀️

```index.vue
<template>
 <p>{{ articles }}</p>
</template>

<script>
import axios from 'axios'
export default {
 async asyncData () {
   const res = await axios.get('https://jsonplaceholder.typicode.com/posts')
   return { articles: res.data }
 },
}
</script>
```

### 正解コード③

ayncData()を使わずに
created()を使うパターンです。
created()はthisコンテキストで
そのままgetしてきた物を
代入することができちゃいます。

とはいっても意味的には
asyncData()の方が適切です！
なるべく使わないようにしましょう❗️😵

created()についてはこちら
https://wp.me/pc9NHC-z1

```index.vue
<template>
 <p>{{ articles }}</p>
</template>

<script>
import axios from 'axios'
export default {
 data () {
   return {
     articles: [],
   }
 },
 created () {
   axios.get('https://jsonplaceholder.typicode.com/posts')
     .then((res) => {
       this.articles = res
     })
 },
}
</script>
```

.then(Promise)を使わない場合
Promise使ってね！となり
うまくデータが表示できません😖💦

```index.vue
<template>
 <p>{{ articles }}</p>
</template>

<script>
import axios from 'axios'
export default {
 created () {
   this.articles = axios.get('https://jsonplaceholder.typicode.com/posts')
   console.log(this.articles)
 },
}
</script>
```

![スクリーンショット 2020-08-27 11.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/7cd7b686-13d0-a3d3-8aad-05737a52fc88.png)

出た〜！Promise！💥👻
うわーなんだっけこれ！！！
という方は…

こちらの記事をご覧ください👀
【Nuxt.js】Nuxt文法編：asyncData
https://wp.me/pc9NHC-ut

# Step2: ul>liで見た目を整える

![スクリーンショット 2020-08-27 12.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/452b8fc4-ee9a-387e-bccb-f60b2ca00477.png)

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-CV
Android RecyclerViewが含まれるViewをTransitionでアニメーションしたときに落ちる

ちょっと詰まったのでメモです。

RecyclerViewがスクロールしているときにTransitionで親Viewのアニメーションが走るとクラッシュしていた。

```
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:5034)
        at android.view.ViewGroup.addView(ViewGroup.java:4865)
        at android.view.ViewGroup.addView(ViewGroup.java:4805)
        at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:851)
        at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
        at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8336)
        at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8294)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1573)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1331)
        at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1075)
        at android.support.v7.widget.RecyclerView.scrollStep(RecyclerView.java:1832)
        at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5067)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1004)
        at android.view.Choreographer.doCallbacks(Choreographer.java:816)
        at android.view.Choreographer.doFrame(Choreographer.java:748)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:990)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:280)
        at android.app.ActivityThread.main(ActivityThread.java:6710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
```

スクロール中にアニメーションが走ると同じViewが追加されてしまうようです。

`Transition.excludeTarget(R.id.recycler_view, true)`でアニメーションからRecyclerViewを除外することで解決しました。
【Go言語】変数/関数の命名がイケてるかどうかチェックする静的解析ツールを作りました

## Overview
自分は命名オタクで，適当につけられた変数名を見ることが耐えられません．自分のコードの変数名を入念にチェックする手間が省くためにも，変数名がイケてるかどうか静的解析で確認してやろう!と思い以下のようなツールを作りました．

Githubリポジトリ：　[NamingReview for Golang](https://github.com/yuya-okada/namingreview)

## インストール
```
go get -u github.com/yuya-okada/namingreview/cmd/namingreview
```

## 使い方
対象のGoプロジェクトのディレクトリ内で以下を実行．

```
go vet -vettool=${which namingreview}
```



## 仕組み

[The Online Plain Text English Dictionary](http://www.mso.anu.edu.au/~ralph/OPTED/)というオンラインの辞書から英単語の品詞データをスクレイピングしました．また，プログラムで頻繁に使われるerrやreqなどの辞書に載っていない略語はとりあえず思いつく限り手入力で設定ファイルを作りました．

これらに基づき，自動で変数名・関数名・型名を確認し，下の方に書いたようなルールに基づいてイケてない変数名を指摘します．下のルールを読むのがめんどくさい人用に，例えば「関数名は動詞から始まってないといけない」とか，「配列の名前は複数形か，hogeList, hogeArray, hogeSliceのような配列っぽい接尾辞がついた名前にしないといけない」とかのルールに基づいてチェックします．

プロジェクトごとに特有の造語などを使いたい場合は設定ファイルを書くことで対応できます．詳細はGithubのREADMEに書きました．


## 現時点で実装されている命名規則
どのプロジェクトでも共通で守るべき最低限のルールのみ実装している．今後，命名規則もルールベースで設定ファイルなどかいてカスタマイズできるようにしたい．

### 変数名
- Boolean型の変数は動詞を含まなければならない（ex. selected->isSelected, updatable->canUpdate）. 動詞から始まることが望ましいが，そうでない方がわかりやすい場合はかならずしも動詞から始まる必要はない．(ex. “userCanAccess”などは使っていい)

- Boolean型でない変数名は最低１つは名詞を含んでいなければならない

- Boolean型でない変数名は名詞，形容詞，分詞のいずれかから始まる

- 配列名の中で最後の名詞は複数形または"slice", "array", "list"のいずれかでなければならない．逆に配列でない変数名の最後の名詞は複数形や"slice", "array", "list"であってはならない．Mapについてはどちらでも良い

- 文字数1文字からなる変数名は推奨されないが，小さいスコープなどで必要ならば使用しても良い．


### 型名
- 最低１つ以上の名詞を含まなければならない．
- 名詞，形容詞，分詞のいずれかから始まらなければならない．
- 文字数1文字からなる型名は推奨されないが，小さいスコープなどで必要ならば使用しても良い．

### 関数名

 - 動詞から始まらなければならない．（main関数は例外とする）
CentOS 8 の日本語化、キーボード配置を日本語にする

前提として、VMWare内の仮想CentOS8の日本語化です。

ちょっと手間取ったのでメモ。キーボード配置を変更しないとまともにタイピングできないので…
ちなみに初期設定のキーボードで`|`を打つには`Shift+]`です。

```
$ dnf -y upgrade
$ dnf -y install langpacks-ja  ←langpackじゃなくてlangpacksなので注意！

$ localectl list-locales | grep ja  ←日本語のロケールがあるか確認（jpじゃなくてjaで絞り込み）
$ localectl set-locale LANG=ja_JP.utf8
$ source /etc/locale.conf

$ localectl list-keymaps | grep jp  ←日本語のキーマップがあるか確認（今度はjpで絞り込み）
$ localectl set-keymap jp106
$ source /etc/locale.conf

$ localectl  ←日本語の設定になってるか確認
```

OSを再起動すると日本語化できていると思います。
「標準フォルダーの名前を現在の言語に合わせて更新しますか？」と表示されますが、ここは「古い名前のままにする」を選びました。フォルダ名に日本語があるとなんか気持ち悪いので…

しかしここまでやってもキーボード入力が変わらず。最終的には
デスクトップ右クリックで`設定`→`Region & Language`→`入力ソース`の`＋`で追加→`日本語`→`日本語`追加→英語を`－`で削除
これで日本語キーボード入力ができるようになりました。
XR VR AR MRの意味とその違い

今回はXR VR AR MRの概念を説明します。
#まとめ説明
先ずそれぞれの意味を簡単に説明しますと、
・VR（仮想現実）
・AR（拡張現実）
・MR（複合現実）
・XR（「VR」「AR」「MR」といった画像処理技術の総称）
となります。

「XR」は総称なので、他の概念さえ分かれば、「XR」も理解できると思います。

#VR
多分、「VR」と「AR」は最近よく聞かれる概念だと思います。
まず、「VR」からにします。
VRは、Virtual Realityの略称で、最初に書いた通り「仮想現実」の意味です。

コンピュータによって作り出した仮想空間に、
専用のゴーグルなどを装着し、映像を見るだけでなく、仮想空間のなかに、
自在に行動し、行動も空間内の物を何らかの影響を与えられる、
まるで自分が仮想空間内にいる、あるいは、現実のような世界を体験できます。
#AR
ARは、Augmented Realityの略称で、
現実世界の情報を取得し、コンピューターで作り上げた画像や情報などを、重ね合わせる表示する技術です。
拡張現実は、現実を拡張する感じですね。

簡単に考えると、現実＋なにか　です。
発展途上の「VR」と違って、皆さんが知らないうちに、よく使う技術です。
例えば、「ポケモンGO」。
#MR
MRとは「Mixed Reality」の略です。
現実と仮想が同時に存在し、目の前に物を置き換えで、新しい世界を見られることです。

ちょっと「AR」と似ているイメージかもしれませんが、実際の区別が大きいです。
「AR」は現実世界の上で、何かを追加する事です、要するに基礎は現実世界です。
「MR」の基礎は「AR」と逆で、仮想世界です。

例えるなら、
未来設定の映画で、空中で浮かんで操作できるスクリーンでよく見かけるじゃないですか、あれの事です。

現実世界ベースにし、仮想世界作る感じですね。
仮想世界と現実世界を融合させる技術を言えます。

#XR
「XR」はすべての仮想空間、空間拡張技術をまとめた呼び方のことです。
要するに、上記紹介した内容の総称です。

では。
プロジェクトのコスト見積り技法ーパラメトリック見積り（ファンクションポイント法、COCOMO法、プログラムステップ法など）、ボトムアップ見積り、類推見積り三点見積り、

応用情報技術者平成30年春期 午前問52

PMBOKガイド第5版によれば，プロジェクトのコスト見積り技法の説明のうち，パラメトリック見積りの説明はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e84dd12a-ea15-2554-5540-7197dd2b9bf7.png)


１、パラメトリック見積り(係数見積り)は、　parametric
過去に蓄積したデータと関連する変数との統計上の関係を使って、見積りを行う手法です。試験でよく登場する"ファンクションポイント法"や"COCOMO"及び"プログラムステップ法"もパラメトリック見積りの一種です。
IPAのWebページ内では、「工数などを目的変数として、説明変数に規模や要因などを設定し、数学的な関数として表す方法」と説明されています。

・ファンクションポイント法とは
ソフトウェアの機能規模を測定する手法の1つ。 入出力や内部ファイルなどの数とそれぞれの難易度から論理的にファンクションポイント（FP）を算出し、開発規模を見積もる手法のこと。

・COCOMO（ココモ法）とは、
ソフトウェアのソースコードでシステム開発の工数や期間を見積もる手法です。 COCOMは"constructive cost model"の略であり、 日本語訳すれば「構造的なコスト推計モデル」となります。

・プログラムステップ法とは、プログラムのステップ数（行数）をもとにして、システムの開発費用を見積もる手法のことである。 プログラムステップ法は、プログラムが既に存在していれば、容易に見積りを出すことができるという特徴がある。


２、ボトムアップ見積りの説明　　Bottomup
WBSの下位レベルの構成要素単位の見積り結果を集計して，プロジェクトのコストを見積もる。


３、三点見積りの説明
楽観値，悲観値，最可能値を使って，個々のアクティビティのコストを見積もる。

三点見積りでは、楽観値、最可能値、悲観値を使って時間を推計していきます。これら３つの値の意味は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/044fe80d-a682-0638-dd90-3913685f65f7.png)


４、類推見積りの説明
類似のプロジェクトにおける過去のコスト実績を使って，プロジェクトのコストを見積もる。


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

システム開発における工数の見積りに関する記述のうち，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/13d6ca46-112f-7666-383b-d8cd97827546.png)


１、
・COCOMOの使用には，自社における生産性に関する，蓄積されたデータが必要である。
　→○。COCOMO(Constructive Cost Model)は、ソフトウェアの見積もりで、予想されるプログラム行数にエンジニアの能力や要求の信頼性などの補正係数を掛け合わせて開発工数や期間，要員や生産性を見積もる手法です。COCOMOを適用するには自社における生産性のデータ収集が不可欠です。

・開発要員の技量は異なるので工数は参考にならないが，過去に開発したプログラムの規模は見積りの参考になる。
　→×。過去の開発における技量と実際に要した工数の関係は、現在の見積りにおいても参考にすることができます。

・工数の見積りは，作業の進捗管理に有効であるが，ソフトウェアの品質管理には関係しない。
　→×。見積もりと比較して実際に要した工数の多少が著しい場合には品質に問題がある可能性も考えられます。このように見積もられた工数は進捗管理だけでなく、品質管理の基準としても用いることができます。

・ファンクションポイント法による見積りでは，プログラムステップ数を把握する必要がある。
　→×。ファンクションポイント法では、外部入出力や内部ファイルの数と難易度の高さから開発規模を見積もるため、プログラムステップ数は見積りに関与しません。

参照：

https://www.ap-siken.com/kakomon/28_haru/q54.html

https://www.ap-siken.com/kakomon/30_haru/q52.html


三点見積り
https://ssaits.jp/promapedia/method/3-point-quotation.html
Macのダークモード/ライトモードをCLIで切り替えるスクリプト

## 概要

最近、朝方はライトモード、昼過ぎたらダークモードという感じで頻繁に切り替えているんですが、

```bash
$ dark-mode  # ダークモードに切り替える
$ light-mode # ライトモードに切り替える
```

こんなコマンドが欲しいなと思ったのでググって作ってみました

## 手順

### 1. 二つのファイルに以下のAppleScriptそれぞれをコピペ

- ファイル名: dark-mode

```applescript
#!/usr/bin/osascript

on setDarkMode(shouldBeDark)

	set paneID to "com.apple.preference.general"

	tell application "System Events"
		if dark mode of appearance preferences is shouldBeDark then return
	end tell

	set paneWasOpen to false

	(*
		If SysPrefs is already running and showing the "General" pane,
		then toggling dark mode causes the UI of the pane to become
		out-of-sync with actual system appearance. To account for this,
		we'll quit SysPrefs if it's open to General prefs, and then
		re-open it after we've made the change
	*)
	if application "System Preferences" is running then
		tell application "System Preferences"
			if show all is false and id of current pane is paneID then
				set paneWasOpen to true
				quit
			end if
		end tell
	end if

	tell application "System Events"
		set dark mode of appearance preferences to shouldBeDark
	end tell

	if paneWasOpen then
		tell application "System Preferences"
			launch
			delay 3
			activate
			reveal (the first pane whose id is paneID)
		end tell
	end if

end setDarkMode

setDarkMode(true)
```

- ファイル名: light-mode

```applescript
#!/usr/bin/osascript

on setDarkMode(shouldBeDark)

	set paneID to "com.apple.preference.general"

	tell application "System Events"
		if dark mode of appearance preferences is shouldBeDark then return
	end tell

	set paneWasOpen to false

	(*
		If SysPrefs is already running and showing the "General" pane,
		then toggling dark mode causes the UI of the pane to become
		out-of-sync with actual system appearance. To account for this,
		we'll quit SysPrefs if it's open to General prefs, and then
		re-open it after we've made the change
	*)
	if application "System Preferences" is running then
		tell application "System Preferences"
			if show all is false and id of current pane is paneID then
				set paneWasOpen to true
				quit
			end if
		end tell
	end if

	tell application "System Events"
		set dark mode of appearance preferences to shouldBeDark
	end tell

	if paneWasOpen then
		tell application "System Preferences"
			launch
			delay 3
			activate
			reveal (the first pane whose id is paneID)
		end tell
	end if

end setDarkMode

setDarkMode(false)
```

### 2. 実行権限を付与して、PATHを通す


これでいけると思います。

スクリプトが手抜きですが、気にしない

## 参考
- [macOS 10.14 MojaveのLightとDark Modeをワンクリックで切り替えることができるApple Script。 | AAPL Ch.](https://applech2.com/archives/20180619-macos-mojave-darkmode-applescript.html)
- [Toggle Dark Mode](https://gist.github.com/davedelong/850409c512ab2d2a21aa6fa690096d56)
  - 上記の記事にあったAppleScript、ダイアログを表示しているが、本記事ではダイアログの部分は消しました

- [AppleScript shebang](https://gist.github.com/RobertAudi/458223)
  - AppleScriptのshebang(pythonとかでよくみる`#!`のやつ、正しく指定するととファイル名に拡張子が無くても実行できるようになります)
深さ優先探索の再帰部分のイメージを細かく言語化してみた

深さ優先探索を言語化して整理する。
今回は無向グラフで考える。

```cpp
using Graph = vector<vector<int>>;
// 深さ優先探索
vector<bool> seen;  // 既に見たことがある頂点か記録
void dfs(const Graph &G, int v) {
    seen[v] = true;
    for (auto next : G[v]) {
        if (!seen[next]) {  // 訪問済みでなければ探索
            dfs(G, next);
        }
    }
}
```

上記がよくある雛形である。

```cpp
G[i]={a,b,c,d,....z};
```
のように、ノードiと直接つながっているノードをこの様に保持している。

今回言語化する部分は再帰の部分だ。
最初この部分がよくわからなくて、何が<strong>深さ</strong>優先なのかよくわからなかった。
なお、この記事の対象者は深さ優先探索の概念、樹形図ではイメージできるが、実装がよくわからないといった人向けである。

それでは説明する。
多くの人がつまずくのはforループの中に再帰でdfs()を呼び出している部分だと思う。
これは同時に並列してたくさんdfs()を呼び出しているわけではなくて、あくまでもforループの中でdfs()が呼び出された時点で一度大枠の一番外で回っているforループが、回ることをやめ、再帰で呼び出されたdfs()の中に深く潜っていくイメージである。
その再帰で呼び出されたdfs()の中で更に再帰呼び出しが起こり、、、、というのが連鎖し、最後まで行き着いたところで内側のforから順番に解消されやがて一番最初のforループ、つまり一番浅い階層まで戻ってくるのである。

当たり前かもしれないが、最初はなかなかこの部分がイメージしづらいのだと自分は感じた。
AWS CDKでELBのタイムアウト設定を変更する

# はじめに

https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-elasticloadbalancingv2.ApplicationLoadBalancer.html


新規で作る時は初期化の際に`idleTimeout`として設定ができる

ecsPatternsだと自動的にALB等の初期化が終わっている
既存のリソースのtimeout設定を変える方法が調べづらかったのでシェア

# やり方
```
ec2Service.loadBalancer.setAttribute('idle_timeout.timeout_seconds', '3600')
```

CDKのドキュメントを読めば分かる通り、ELBのインスタンスに `setAttribute` というメソッドが生えているのでこれを使う


第一引数がkey
なんの属性を変えるか指定する
どういった属性が変えられるかは↓のドキュメントを御覧ください
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/application-load-balancers.html#load-balancer-attributes

第二引数で、設定したい値を指定する

# おわり
属性あるけど変えられんやんけ！ってのが多々あるので、探せばなんとかなる
最悪cloudformationを書く
IntelliJ上のFreeMarkerでMySQLの補完をする

# IntelliJ 上の FreeMarker で MySQL の補完をする方法

※ FreeMarker で SQL を記述している人向けの内容です

## 完成イメージ

### 出来上がり：拡張子 ftl のファイルでも MySQL の補完がされます。

MySQL の補完がされつつ、FreeMarker のタグもハイライトされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111110/1664ef7a-4cce-e749-6ed0-9abe1e6615d0.png)


### 設定前

もともとは FreeMaker のタグのみハイライトされている状態。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111110/629a6a47-7ece-71bf-05cf-62f83df2bbb7.png)


## 設定方法

### データベース接続の設定を済ませる

[データベース接続 - ヘルプ | IntelliJ IDEA](https://pleiades.io/help/idea/connecting-to-a-database.html)

### テンプレートデータ言語の設定

ここで FreeMarker に MySQL の補完がされるように設定。

- 設定 > 言語&フレームワーク > テンプレートデータ言語 を開く
- 「+」をクリック
- 以下の内容を入力
  - Path: FreeMarker のテンプレートファイルがあるディレクトリーを指定
  - Template data language: MySQL

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111110/63ce21fa-7079-e7a1-dff1-96f04bb6f64f.png)

### SQL 解決スコープの設定

MySQL で補完する データベースをあらかじめ選択しておく。

- SQL 解決スコープ を開く
- 「+」をクリック
- 以下の内容を入力
  - Path: FreeMarker のテンプレートファイルがあるディレクトリーを指定
  - 解決スコープ: 補完するデータベースのみチェックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111110/4efdfdd8-9d52-3cee-270f-c229a8cc82c2.png)

### SQL ダイアレクト

必要に応じてプロジェクトまたは IntelliJ 全体で使う SQL のエンジンを指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111110/525fbffb-fa70-0b0d-3173-4afeefc10c0d.png)

以上です！
プロジェクトマネジメントースコープコントロールの活動

応用情報技術者平成30年春期 午前問51

プロジェクトマネジメントにおけるスコープコントロールの活動はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0d44fa54-834a-ab14-d5c4-2f7548f48b0a.png)


１、スコープコントロールは、
プロジェクトを実行している間、プロジェクトスコープと成果物スコープの状況を監視し、スコープの差異や変更がスコープベースラインに適切に反映されるように管理するプロセスです。PMBOKでは、監視・コントロールプロセス群で、スコープマネジメント知識エリアが実施するプロセスとして位置づけられています。

※スコープベースライン：スコープ記述書、WBS、WBS辞書の3点を合わせたもの

２、スケジュールコントロールの活動
開発ツールの新機能の教育が必要と分かったので，開発ツールの教育期間を2日間延長した。


３、コストコントロールの活動
要件定義完了時に再見積りをしたところ，当初見積もった開発費用を超過することが判明したので，追加予算を確保した。


４、プロジェクトチームマネジメントの活動
割り当てたテスト担当者が期待した成果を出せなかったので，経験豊富なテスト担当者に交代した。




参照：
https://www.pm-siken.com/kakomon/28_haru/am2_5.html#:~:text=%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92,%E3%81%AB%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%97%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%AE%E5%A4%89%E6%9B%B4,%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E6%B4%BB%E5%8B%95%E3%81%A7%E3%81%99%E3%80%82
ECSのタスク切り替えを速くしたい時の設定

ECSで新しいタスク定義をデプロイしたときに、デフォルトだと新旧のタスクが３０秒共存した後に、旧タスクが落ちる。
以下の設定で旧タスクが落ちる時間を調整できる。

[タスクのターゲットグループ] -> `Group details` -> `Attributes` -> 
 `Deregistration delay`

ダウンタイムなしでスパッと切り替えてくれたら嬉しいけど、ECSでは無理かな。
アジャイル開発ーペアプログラミング

応用情報技術者平成30年春期 午前問49

アジャイルソフトウェア開発などで導入されている"ペアプログラミング"の説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a81d4b6e-3248-3bb4-60d3-63e9647786e1.png)


１、ペアプログラミングは、
　・2人1組で1つのプログラムの実装を行い、
　・1人が実際のコードをコンピュータに打ち込み、
　・もう1人はそれをチェックしながら補佐するという役割を随時交代しながら作業を進めていく手法です。

プログラムをコンピュータに打ち込む人を「ドライバ」、それを補佐する人を「ナビゲータ」といいます。


２、ペアプログラミングには以下のようなメリットがあるとされています。
　・2人の共同作業なので個々で行うよりも怠けにくい
　・2人で実装を行う相乗効果でよりよいコードに仕上がることが期待できる
　・他の人からの問い合わせにも空いている1人が対応できるので作業効率が向上する
　・共同作業を行うことでメンバに対する理解が進みチームワークが向上する


※相乗効果（そうじょうこうか、シナジー、英: synergy）とは、
ある要素が他の要素と合わさる事によって単体で得られる以上の結果を上げること。 相乗効果により、全体の効率化が発揮される。 経済、社会、など様々な分野で、この効果は測される。


参照：
https://www.ap-siken.com/kakomon/26_aki/q49.html

相乗効果
https://ja.wikipedia.org/wiki/%E7%9B%B8%E4%B9%97%E5%8A%B9%E6%9E%9C#:~:text=%E7%9B%B8%E4%B9%97%E5%8A%B9%E6%9E%9C%EF%BC%88%E3%81%9D%E3%81%86%E3%81%98%E3%82%87%E3%81%86%E3%81%93%E3%81%86%E3%81%8B%E3%80%81%E3%82%B7%E3%83%8A%E3%82%B8%E3%83%BC,%E5%8A%B9%E6%9E%9C%E3%81%AF%E6%B8%AC%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82
IBM Cloud サーバ接続に公開鍵認証の利用

##目的
IBMCloud上のサーバインスタンスへのアクセス時に
パスワードによるログインではなく、公開鍵を利用したよりセキュアなアクセス方法を試してみました。
はじめにIBMCloudのサーバをオーダする際に、公開鍵を組み込んでデプロイする方法を紹介します。
また、オーダ後のサーバに対して、手動で公開鍵を組み込む方法も記載します。

##環境
* ローカル端末：macOS Catalina 10.15.6 1台
* プラットフォーム:IBMCloud
    * 接続先サーバ:CentOS 7.7.1908(Virtual Server for Classic) 1台

##公開鍵の作成

`ローカル端末での作業`

公開鍵の生成
今回は**暗号方式rsa**、**鍵長4096bit**にする。
-Cはただのコメント

```
% ssh-keygen -t rsa -b 4096 -C "ibmcloud-keys"
Generating public/private rsa key pair.
```
鍵の保存先を変更する場合は、入力する。
変更しない場合は、空白で**[Enter]**する

```
Enter file in which to save the key (/Users/khoshina/.ssh/id_rsa):
```
鍵＋パスワードを利用する場合、入力

```
Enter passphrase (empty for no passphrase):
```
上記のパスフレーズを再度、入力

```
Enter same passphrase again:
```

問題なければ、指定したフォルダもしくはデフォルトのフォルダに作成される

```
Your identification has been saved in /Users/khoshina/.ssh/id_rsa.
Your public key has been saved in /Users/khoshina/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rdywhYN99E2wICtnRsR+Cey0pzIoLrzIPiCDl9Vypr4 ibmcloud-keys
The key's randomart image is:
+---[RSA 4096]----+
|       ++ . .    |
|       .=o . o   |
|     ..+=o... .  |
|    o +B+++. o   |
|.  o *. S++ . .  |
|= + o o..O       |
|++ o   o+ .      |
|+o. .            |
|o=o E.           |
+----[SHA256]-----+
```

##オーダ時に公開鍵を埋め込む方法
あらかじめ、公開鍵の作成(id_pub.rsa)を実施してからやる。

###IBMCloudへSSH鍵の登録
`IBM Cloudポータルでの作業`

IBMCloudポータルへログイン後、下記の通り**SSH鍵**に進みます。
![スクリーンショット_2020-09-04_13_19_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/964510d5-883c-e884-7e26-fd297f1632fa.png)

その後、画面上部の**Add**を選択します。
![IBM_Cloud____SSH_Keys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/366d5381-ef2d-e771-02ff-0550d73bdf97.png)

**Browse**に作成済みの**id_rsa.pub**を指定し、**Labelに任意の名前を入力**し、**Add**を選択します。
![IBM_Cloud____SSH_Keys-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/95a762c5-ea13-4579-2a8e-fc43c5d982f6.png)



###仮想サーバのオーダ
`IBM Cloudポータルでの作業`

オーダ画面において、**SSH鍵(推奨)**のエリアから、**キーの追加**を選択し、**Labelに入力した自分の鍵を選択**し、オーダするだけです。
![IBM_Cloud_-_仮想サーバー注文フォーム-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c133be3d-22da-2f9a-6bda-347858902dd0.png)

`ローカル端末での作業`
あとは、通常通りSSHでアクセスするとパスワードを聞かれることなく、公開鍵でのアクセスが可能です。

```
% ssh ユーザ名@接続先IP
Last login: Mon Dec  9 11:17:00 2019
```


##オーダ後に公開鍵を手動で組み込む
###公開鍵のアップロード
`ローカル端末からの作業`

公開鍵認証でログインしたいサーバに鍵をアップロードする
MacOSから、IBMCloud上の接続先サーバ(CentOS7)にアップロードする。

###ファイル転送
####**scpの場合**
※OpenSSHによって、SCPによるファイル転送の手段は<font color="Red">非推奨</font>となっている

```
scp ./id_rsa.pub ユーザ名@接続アドレス:/ユーザ名/.ssh
```

####**rsyncの場合**
IBM CloudのLinuxサーバの場合、デフォルトでrsyncがインストールされていません。
したがって、個別にインストールが必要でした。

```
rsync -av ./id_rsa_pub ユーザ名@接続アドレス:/ユーザ名/.ssh
```

rsyncインストール

```
yum -y install rsync
```

##接続先サーバの設定
`接続先サーバの作業`

###公開鍵登録
公開鍵でアクセスさせたいユーザのフォルダに移動し、先程転送した**id_rsa.pub**の中身をコピーする

```
cd /ユーザ名/.ssh
cat id_rsa.pub >> authorized_keys
```

パーミッションを600へ

```
chmod 600 authorized_keys
```

###パスワード認証の無効化
必要に応じてパスワードによるログインを無効化する

/etc/ssh/sshd_config

```
PasswordAuthentication no
```

SSH再起動

```
systemctl restart sshd
```
アジャイル開発ーイテレーション(Iteration)、タスクボード、ニコニコカレンダー

応用情報技術者平成30年春期 午前問48

アジャイル開発のプラクティスの一つである"ふりかえり(レトロスペクティブ)"を行う適切なタイミングはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/00f531df-428f-0e67-d22e-afce29c0e624.png)

１、イテレーション(Iteration)
アジャイル開発における反復の単位で、分析、設計、実装、テストの一連の活動を含みます。アジャイル開発では、概ね数週間程度ごとにこの開発サイクルを繰り返して次第に完成度を高めていきます。


２、"タスクボード"とは、
タスクを付箋などに書き出して皆から見えるボードに貼ることで、チームの抱えるタスクを見える化するものです。

目的は、タスクは見える化して、業務改善を。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b81ce5f0-e069-32ac-c0a9-f2d975184b23.png)


３、"ニコニコカレンダー"とは、
カレンダーにその日の気持ちを表すシールを貼るなどして、チームのムードやメンバーの気持ちを見える化するものです。

目的は、人の気持ちは見える化にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/967b570d-537c-4cdc-70fb-c0e9b97a4c32.png)


４、"朝会"とは、
毎朝、時間を決めて行われる関係者同士の短いミーティングのことです。チーム内のこまめな情報共有を目的とします。


参照：
https://www.ap-siken.com/kakomon/30_haru/q48.html

ニコニコカレンダー
https://sites.google.com/view/niko-niko-calendar/home/ja
Dockerではまったことあるある（逐次更新）


# WSLからdocker-composeができない

docker-composeは自分でダウンロードしないと動かない。
下記のコマンドを実行しする。

```:WSL2
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
$ sudo chmod +x /usr/bin/docker-compose
```
- 参考 : https://qiita.com/aki4000/items/c26e3076c8cec9677415

# パーミッションが原因でvolumeがマウントできない

ホストとファイル共有するためにボリュームをマウントしたいが、パーミッションでエラーになる。
失敗例では、docker-composeを用いてjenkinsのコンテナ作成している。

```docker-compose.yml
version: "3"
services:
  master:
    container_name: jenkins-master
    # (library/)jenkins:2.60.3（公式）だと依存プラグインの関係でインストールがエラるので、jenkins/jenkins使う
    image: jenkins/jenkins:lts
    ports:
      - 8080:8080
      - 5000:5000
    volumes:
      - ~/jenkins:/var/jenkins_home
```

次のようなエラーが生じる。

```:WSL2
$ sudo docker-compose up -d
Creating network "jenkins_default" with the default driver
Pulling master (jenkins/jenkins:lts)...
lts: Pulling from jenkins/jenkins

Digest: sha256:98d3953394a4b9ac65e5e4ab8bc8d8d5bc924716c62b564a113ee57d7736ca0b
Status: Downloaded newer image for jenkins/jenkins:lts
Creating jenkins-master ... error

ERROR: for jenkins-master  Cannot start service master: cgroups: cannot find cgroup mount destination: unknown

ERROR: for master  Cannot start service master: cgroups: cannot find cgroup mount destination: unknown
ERROR: Encountered errors while bringing up the project.
```

事象としては、ファイルのアクセス権の問題らしい。
ユーザーを追加することにより回避できるらしい。
参考：https://qiita.com/yohm/items/047b2e68d008ebb0f001

今回はdocker-composeをあきらめて、通常通り起動した。
この方法だとエラーが出ないので、docker-composeと権限が違うらしい。

```:WSL2
sudo docker run -p 8080:8080 -p 5000:5000 -v ~/jenkins:/var/jenkins_home jenkins/jenkins:lts
```
文字列のフォーマット2

文字列のフォーマット2

＊埋め込む文字列のフォーマット＊
波括弧の中にコロン（：）を置くと、置換する文字列のフォーマットをコントロールできます。
次の例は、桁揃えを行う為の指定方法です。
桁揃えを行うためには、コロンのあとに数値を指定します。
【寄せを指定して差し込む】
tmp1 = “{0:10} {1:>8}”
tmp1.format(’Spam’, 300)
↓
Spam                     300 

tmp1.formt(‘Ham’, 200) 
↓
Ham                       200


他にも、フォーマット指定の例として、パーセント表示を行うためのフォーマット指定の例を書きます。
「12708」は日本の2015年末の総人口、「6381」は就業者数（ともに単位は万人）で
就業人口比率を小数点以下2桁を表示して、パーセントで表示しています。
2番目の例では、1000の位にカンマを付けています。
【表記を指定して差し込む】
“{:.2%}”.format(6381/12708)
↓
50.21%

“{:,}”.format(10000)
↓
10,000

また、フォーマット指定部の末尾に「c」「d」のような英字を置くと、置換文字列の型を指定できます。
「c」はキャラクタとして、「d」は10進数整数として要素を埋め込みます。

【format()オプション一覧】

| オプション | 説明 |
|:-:|:-:|
|<	|要素が左詰めして表示されるよう、スペースを補います。{:<10}のように使います。オプションの前に記号などを置いて、補う文字を指定できます。|
|>	|要素が右詰めして表示されるよう、スペースを補います。{:>10}のように使います。オプションの前に記号などを置いて、補う文字を指定できます。|
|^	|要素が中央にくるよう、スペースを補います。{:^20}のように使います。オプションの前に記号などを置いて、補う文字を指定できます。|
|+	|数値に符号を付けます。”{:+}”.format(10)は「+10」に、”{:+}”.format(-10)は「-10」になります。|
|-	|数値がマイナスのときだけ符号を付けます。”{:-}”.format(10)は「10」に、”{:-}”.format(-10)は「-10」になります。|
|空白	|数値がプラスのときには空白を、マイナスのときには符号を付けます。”{: }”.format(10)は「10」に、”{: }”.format(-10)は「-10」になります。|
|c	|要素を文字列として埋め込みます。
|d	|要素を10進整数として埋め込みます。置き換える要素が少数点を含む数値、または文字列の場合はエラーになります。|
|f	|要素を10進整数として埋め込みます。小数点を含む数値を扱えます。{:.2f}のようにすると、小数点以下の精度を指定できます。|
|x	|要素を「1f4e」のような16進数文字列として埋め込みます。英字部分は小文字になります。xの代わりに大文字のXを使うと、英字部分が大文字なります。|
|b	|要素を「0110」のような2進数文字列として埋め込みます。|
|%	|要素をパーセンテージとして埋め込みます。{:.1%}のようにすると、小数点以下の精度を指定できます。
|,	|数値の1000の位にコンマを付けて埋め込みます。|


＊f文字列＊
Python3.6では、f文字列（f-string）と呼ばれる機能が追加されます。
format()メソッドを使った機能を「f”〜”」という新しいリテラルでより手軽に表記できるようになります。
置換する要素は、変数に定義してフォーマット文字列に変数名を埋め込むようにします。
【f文字列を使った例】
name = “君”
 f”まずはが{name}落ち着け”
↓
まずは君が落ち着け
TCP/IPを使ったネットワーク、ネットワーク上のサービス

#TCP/IPとは
　TCPとIPという2つのプロトコルの組み合わせが、インターネットにおける**デファクトスタンダード**です
　
#IPアドレスはネットワークの住所
　TCP/IPのネットワークにつながれているコンピュータやネットワーク機器は、**IPアドレス**という番号で管理されている
　個々のコンピュータを識別するために使うものなので、重複があってはいけなく一意になる番号が振られていることが約束です
　また、IPアドレスは、32ビットの数値で表されている。

#グローバルIPアドレスとプライベートIPアドレス
　IPアドレスには、**グローバルIPアドレス**と**プライベートIPアドレス**の２つの種類がある
　
　**・グローバルIPアドレス**
　　インターネットの世界で使用するIPアドレスです。世界中で一意であることが保証されないと
　　いけないので、地域ごとのNICで管理している
　
　**・プライベートIPアドレス**
　　企業内などLANの中で使えるIPアドレス、LAN内で重複がなければ、システム管理者が自由に割り当てる　
　　ことができる。

#IPアドレスは「ネットワーク部」と「ホスト部」で出来ている
　IPアドレスの内容はネットワーク事に分かれる**ネットワークアドレス部**と、そのネットワーク内でコンピュータを
　識別するための**ホストアドレス部**とに分かれている。
　IPアドレスは32ビット構成なので**頭の24ビット**まではネットワークアドレス部で**残りの８ビット**はホストアドレス部
　に当てはまります。

#IPアドレスのクラス
 IPアドレスは、使用するネットワークの規模によって**クラスA、クラスB、クラスC**と3つのクラスに分かれている
　![図111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/959d11f6-e920-8ca6-28c0-d6365dc6b0af.png)




#サブネットマスクでネットワークを分割する
　小規模向けのクラスCでも２５４台のホストを扱うことができるが、事業部ごとにネットワークを分けたい場合は
　**サブネットマスク**を用いてネットワークを分割できる
　![図112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/08c2441c-cc55-a1d4-1d45-bda8ede7305d.png)



#DHCPは自動設定する仕組み
　LANにつなぐコンピュータの台数が増えると、１台ずつに重複しないIPアドレスを割り当てることが思いのほか困難なっていくが
　これを解決するのは**DHCP**というプロトコルを利用する自動的に使われてないIPアドレスを割り当ててくれる
　プロバイダなどのインターネット接続サービスを利用する場合もDHCPを使ってインターネット上でネットワーク設定を
　取得する手順が一般的らしいです。

#NATとIPマスカレード
　プライベートIPアドレスしか持たない各コンピュータは**NAT**や**IPマスカレード**といったアドレス変換技術を使用する

　**・NAT**
　　グローバルIPアドレスとプライベートIPアドレスを1対1で結びつけて相互に変換を行う
　　同時にインターネット接続できるのはグローバルIPアドレスの個数分だけ

　**・IPマスカレード**
　　グローバルIPアドレスに複数のプライベートIPアドレスを結びつけて１対複数の変換を行う
　　IPアドレスの変換時にポート番号もあわせて書き換えるようにすることで、１つのグローバルIPアドレスでも
　　複数のコンピュータが同時にインターネット接続をすることができる

#ドメイン名とDNS
　IPアドレスを２進数で表記されているが、人間にとっては覚えやすいとは言いにくいので
　文字で別名をつけたものが**ドメイン名**です。
　また、ドメイン名とIPアドレスを関連づけして管理しているのが**DNS**です。
　**DNSサーバ**に対してドメイン名を問い合わせたりIPアドレスを使ってドメイン名を問い合わせることができる
　
 
#代表的なサービスたち
　ネットワーク上のサービスは、プロトコルを処理するサーバによって提供されている
　![図113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/262120ee-4882-7e05-ed1d-d1a3d91e3d60.png)


#サービスはポート番号識別する
　ネットワーク上で動くサービスたちは、ここに専用のサーバマシンを用意しないといけないというわけではない
　ただIPアドレスだと、パケットの宛先となるコンピュータは識別できてもそれがどのサーバプログラムに宛てなのかは特定できない
　なので、プログラムの側では0～65,535までの範囲で自分専用の接続口を設けて待つようになっている
　この接続具を示す番号を**ポート番号**と呼ぶ

#以上
【VBA】ユーザーフォムのコンボボックスのリストに重複を省いて値を追加する

##ユーザーフォムのコンボボックス
前回、[コンボボックスに値を追加する記事](https://qiita.com/KaoTechBlog/items/eae37a0454983892ec64)を書きましたが
今回は重複を省きながら値を追加します。
例えば同じ日付があるデータなどをコンボボックスのリストにしたいときなどに使います。

以下のコンボボックスに登録日のデータを重複を省いて追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/69f4a691-4abe-4c80-1577-bef42fbfceab.png)　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/daf76785-cf1c-d718-5c0c-cbb0c329c341.png)
登録日のデータをコンボボックスのリストと照合して一致したら、そのリストを選択します。
重複がない場合は何も選択されません。
なにも選択されていなかったら
重複してないってことで追加するというコードです。

```
Private Sub UserForm_Initialize()
    Dim DateCol As Long'IDの列番号を格納する変数
    DateCol = WorksheetFunction.Match("登録日", Master.Rows(1), 0)'Match関数で列数格納
    Dim LastRow As Long '最終行を格納する変数
    LastRow = Master.Cells(Rows.Count, DateCol).End(xlUp).Row'最終行格納
    Dim ChkDate As String'登録日を格納する変数
    Dim i As Long
    For i = 2 To LastRow
        ChkDate = Master.Cells(i, DateCol).Value
        cmbDate.ListIndex = -1'コンボボックスのリストインデックスを未選択にして初期化
    'コンボボックスのリスト項目を1つずつ確認して重複してたらその項目を選択して確認終了
        Dim c As Long
        For c = 0 To cmbDate.ListCount - 1'コンボボックスのリストをすべて繰り返し
            If cmbDate.List(c) = ChkDate Then'リストの項目が変数に入れた値と一緒だったら
                cmbDate.ListIndex = c'その項目を選択しておく
                Exit For'ループ終わり
            End If
        Next c
       'コンボボックスのリストで選択された項目が何もなかったら
        If cmbDate.ListIndex = -1 Then
            cmbDate.AddItem ChkDate'コンボボックスのリストに追加する
        End If
    Next i
    cmbDate.ListIndex = -1 'コンボボックスのリストインデックスを未選択にして初期化
End Sub
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/8b659f13-c75b-fced-92fa-b102e0b1dd31.png)
重複を省いて配列に格納してからリストに格納するなど、やり方はもっとたくさんあるかと思いますがワタシはこうしてます。
##ワタシ流こだわり
For文が重なる場合は必ずNextのあとにカウント変数つけます。
__Next i__、__Next c__
そもそも今回はカウント変数をi とか c とかにしてますがたくさんあるとわかりにくいので
__Dim DateCount As Long__とかにすることも多いです:laughing:
Webに食わせるデータのチェック方法

# JS内に埋め込まれてるデータのチェック方法
## base64エンコーディングして記載されてるimgデータ

```
data:image/***;base64,XXXX...XXX
```

と言うデータがあったら、Chromeのアドレスバーにコピペして読み込むと、画像の確認できる。

## URL/HTML/UTF-8・16などにエンコーディングして記載されている文字列
頑張らずに、以下のサイトを使う。

https://so-zou.jp/web-app/text/encode-decode/
クロス開発（cross development）

応用情報技術者平成30年春期 午前問47


組込みシステムの"クロス開発"の説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fd78d1c3-0de2-ef7b-d7c1-d3eeafe474ce.png)


１、クロス開発とは、　cross development
プログラムを開発するマシン環境と実行するマシン環境が異なることをいいます。例えば、携帯電話上で動作させるソフトウェアや、組込みソフトウェアなどをPCで開発する場合がこれに該当します。


２、ペアプログラミングの説明
実装担当及びチェック担当の二人一組で役割を交代しながら開発を行うこと


３、ラウンドトリップ開発モデルの説明　　Round-Trip
設計とプロトタイピングとを繰り返しながら開発を行うこと

※ラウンドトリップとは、往復（切符）、周遊（旅行）、回遊、一周などの意味を持つ英単語。


４、XDDP(eXtreme Derivative Development Process)の説明
派生開発を，変更プロセスと追加プロセスとに分けて開発を行うこと


参照：
https://www.ap-siken.com/kakomon/30_haru/q47.html
datetimepicker オプションまとめ

# 目次
 **基礎編：** 
[Lv.1  **日付のフォーマットを指定** ](Lv.1  **日付のフォーマットを指定** ) 
[Lv.2  **過去の日付は選択できないようにする** ]( Lv.2  **過去の日付は選択できないようにする** ) 
[Lv.3  **現在から◯日後からではないと選択できないようにする** ](Lv.3  **現在から◯日後からではないと選択できないようにする** ) 
[Lv.4  **デフォルトの時間を00:00にする** ](Lv.4  **デフォルトの時間を00:00にする** ) 

 **応用編：** 
[Lv.5  **10時〜18時の時間帯のみ選択できるようにする** ](Lv.5  **10時〜18時の時間帯のみ選択できるようにする**) 
[Lv.6  **日曜日は選択できないようにする**  ](Lv.6  **日曜日は選択できないようにする** ) 

# 基礎編

## Lv.1  **日付のフォーマットを指定** 

```coffeescript:common.js.coffee
$.datetimepicker.setLocale('ja')
$ ->
  $('.js-datetimepicker').datetimepicker(
    format: 'Y-m-d H:i'
   #入力して際のフォーマットが"2020-04-20 00:00"みたいになる
  )
```
他にも`'yyyy/mm/dd'` `'Y年 n月j日'`といったフォーマットがあります。

## Lv.2  **過去の日付は選択できないようにする** 

```coffeescript:common.js.coffee
$.datetimepicker.setLocale('ja')
$ ->
  $('.js-datetimepicker').datetimepicker(
    format: 'Y-m-d H:i'
    minDate: 0
    #今日の日付が入力できる０地点にする
  )
```

## Lv.3 **現在から○日後からではないと選択できないようにする** 
4日後の場合

```coffeescript:common.js.coffee
$.datetimepicker.setLocale('ja')
 $ ->
  d.setDate(d.getDate() + 4);
 #現在よりプラス4日の日付を入力可能最低日とする
  $('.js-datetimepicker-three-days-later').datetimepicker(
    format: 'Y-m-d H:i:'
    minDate: d
  )
```
## Lv.4  **デフォルトの時間を00:00にする** 


```coffeescript:common.js.coffee
$.datetimepicker.setLocale('ja')
 $ ->
  d = new Date(new Date().setHours(0, 0));
  d.setDate(d.getDate() + 4);
  #3日後=4日目の00:00以降
  $('.js-datetimepicker-three-days-later').datetimepicker(
    format: 'Y-m-d H:i:'
    minDate: d
    defaultDate: d
   # デフォルトが4日後の00:00になるようにする
  )
```


# 応用編


## Lv.5  **10時〜18時の時間帯のみ選択できるようにする** 
```coffeescript:common.js.coffee 
$('.js-datetimepicker').datetimepicker(
   allowTimes: ['10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00']
   #10時〜18時の間で選択できるようにする
  )
```

## Lv.6  **日曜日は選択できないようにする** 

```coffeescript:common.js.coffee
$.datetimepicker.setLocale('ja')
$ ->
  $('.js-datetimepicker').datetimepicker(
   beforeShowDay: function(date) {
   if(date.getDay() == 0) { #0=日曜日、1=月曜日、2=火曜日....6=土曜日
   return [false];
   } 
   else {
   return [true];
  )
```
typo多い自分にとって過去一レベルで便利だったXcodeの機能


## はじめに
**※この記事はXcode使う方向けです。**

レビューでtypo指摘されるとすごく恥ずかしいですよね。。
完璧だぜ！って思って指摘がtypoってもう。。。

**そんなこんなでチェックツール探してたんですが、
なんとそもそもXcode11からチェック機能ついてたやつ〜！**



## 使い方

至ってシンプルです。
動作も遅くなるとかナッシング。

Edit > Format > Spelling and Grammar > Check Spelling While Typingでタイピングごとにファイルにチェックが。

例えばそのプロジェクトでしか使わない「hogehoge」とか造語も引っかかるんですけど

Ignore Spelling（スペルを無視）かLearn Spelling（スペルを学習）で頻出単語は警告を消します。

## 最後に

いや、英語力を上げるのが良いってのは分かるんですが誰にでもあるじゃないですか、typo。

そんな時にこれで精神衛生的にも楽だし、レビューも手間省けるしで良いと思いました。
感謝。
tmux.conf

```bash
unbind C-b
set -g prefix C-t
 
# マウス操作を有効にする
setw -g mouse on
 
 
# | でペインを縦に分割する
bind | split-window -h
 
# - でペインを横に分割する
bind - split-window -v
 
 
# ウィンドウリストの色を設定する
# setw -g window-status-fg cyan
# setw -g window-status-bg default
# setw -g window-status-attr dim
 
# アクティブなウィンドウを目立たせる
setw -g window-status-current-style "fg=white"
#setw -g window-status-current-bg default
#setw -g window-status-current-style "attr=bright"
 
 
# ペインボーダーの色を設定する
set -g pane-border-style "fg=green"
set -g pane-border-style "bg=black"
# # アクティブなペインを目立たせる
set -g pane-active-border-style "fg=white"
set -g pane-active-border-style "bg=yellow"
 
# # ステータスバーをトップに配置する
set-option -g status-position top
 
# # 左右のステータスバーの長さを決定する
set-option -g status-left-length 90
set-option -g status-right-length 90
 
# # #H => マシン名
# # #P => ペイン番号
# # 最左に表示
set-option -g status-left '#H:[#P]'
 
# # Wi-Fi、バッテリー残量、現在時刻
# # 最右に表示
set-option -g status-right '#(wifi) #(battery --tmux) [%Y-%m-%d(%a) %H:%M]'
 
# # ステータスバーを1秒毎に描画し直す
set-option -g status-interval 1
 
# # 左（主にウィンドウ番号など）
set-option -g status-justify left
 
# #### COLOUR (Solarized dark)
 
# # default statusbar colors
set-option -g status-style "bg=black" #base02
set-option -g status-style "fg=yellow" #yellow
#set-option -g status-style "attr=default"
 
# # default window title colors
set-window-option -g window-status-style "fg=brightblue" #base0
set-window-option -g window-status-style "bg=default"
#set-window-option -g window-status-attr dim
 
# # active window title colors
set-window-option -g window-status-current-style "fg=brightred" #orange
#set-window-option -g window-status-current-bg default
# #set-window-option -g window-status-current-attr bright
 
# # pane border
set-option -g pane-border-style "fg=black" #base02
set-option -g pane-active-border-style "fg=brightgreen" #base01
 
# # message text
# set-option -g message-style "bg=black" #base02
# set-option -g message-style "fg=brightred" #orange
 
# # pane number display
# set-option -g display-panes-active-colour blue #blue
# set-option -g display-panes-colour brightred #orange
 
# # clock
set-window-option -g clock-mode-colour green #green
 
# # bell
set-window-option -g window-status-bell-style fg=black,bg=red #base02, red
Amazon S3 互換の Wasabi hot cloud strage を使う。バックアップ、メディア配信

[POCまではこのページを参考](https://qiita.com/harasakih/items/94be000ed98263db1651)
本格的に、バックアップストレージ、メディア配信サーバとして使う。
┗━ Wasabi は静的コンテンツサーバでしかないので、メディアファイルはダウンロードされてから、クライアントで再生される。。。。音楽はこれでもなんとかなるけど、動画はサイズが大きいので実用に耐えられない。もう少し考える


# 差分バックアップ、同期
## awscliのインストール(debian系)
```bash:
# apt install awscli 
# pip3 install awscli-plugin-endpoint
```

## 設定
[awsではなく、wasabi(us-west-1)をアクセスするように設定する。](https://wasabi-support.zendesk.com/hc/en-us/articles/115001910791-How-do-I-use-AWS-CLI-with-Wasabi-)


* ```wasabi```はプロファイル名。
* Access Key ID : XXXX, Secret Access Key:YYYY は、[POC編](https://qiita.com/harasakih/items/94be000ed98263db1651)を参考に。

```bash:
$ aws configure --profile wasabi 
  AWS Access Key ID [None]: XXXX
  AWS Secret Access Key [None]: YYYY
  Default region name [None]: us-west-1
  Default output format [None]: 

$ cat .aws/config
  [profile wasabi]
  region = us-west-1

$ cat .aws/credentials 
  [wasabi]
  aws_access_key_id = XXXX
  aws_secret_access_key = YYYY
````

## awscli-plugin-endpoint の設定
```bash:
$ aws configure set plugins.endpoint awscli_plugin_endpoint
$ aws configure --profile wasabi set s3.endpoint_url https://s3.us-west-1.wasabisys.com 

$ cat .aws/config 
[profile wasabi]
region = us-west-1
s3 =
    endpoint_url = https://s3.us-west-1.wasabisys.com
[plugins]
endpoint = awscli_plugin_endpoint
```

## コマンド例
```bash:
$ aws s3 ls --profile wasabi 
$ aws s3 mb s3://NEW-BUCKET --profile wasabi 
```

## awscliのコマンド
[ここを参考に](https://qiita.com/uhooi/items/48ef6ef2b34162988295)


# バックアップ、同期
```bash:
$ aws s3 sync --exact-timestamps /LOCAL/DIR s3://NEW-BUCKET/ --profile wasabi 
```

# Media-server
 Wasabiコンソールで、公開したいファイルをpublicにする。
 ``` https://s3.us-west-1.wasabisys.com/BUCKETNAME/DIR/FINENAME ```
ソフトウェアライフサイクルプロセス


応用情報技術者平成30年春期 午前問46


ソフトウェアライフサイクルプロセスにおいてソフトウェア実装プロセスを構成するプロセスのうち，次のタスクを実施するものはどれか。

〔タスク〕
ソフトウェア品目の外部インタフェース，及びソフトウェアコンポーネント間のインタフェースについて最上位レベルの設計を行う。
データベースについて最上位レベルの設計を行う。
ソフトウェア結合のために暫定的なテスト要求事項及びスケジュールを定義する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f97bbfde-2cf3-d272-5f9e-c502fe01ec5c.png)


１、ソフトウェアライフサイクルプロセスを定めたJIS X 0160によれば、ソフトウェア実装プロセスは「ソフトウェア製品又はソフトウェアサービスとして実現される指定のシステム要素を作り出すことを目的とする」と説明されており、次の6つの下位プロセス※を内包します。

　１）、ソフトウェア要求事項分析プロセス
　　　　システムのソフトウェア要素の要求事項を確立する

　２）、ソフトウェア方式設計プロセス
　　　　要求事項を実装し，それに対して検証できるソフトウェアの設計を提供する

　３）、ソフトウェア詳細設計プロセス
　　　　要求事項及びソフトウェア方式に対して実装し，検証でき，コーディング及びテストを可能にするために十分に詳細である設計をソフトウェアのために提供する

　４）、ソフトウェア構築プロセス
　　　　ソフトウェア設計を適切に反映した実行可能なソフトウェアユニットを作り出す

　５）、ソフトウェア結合プロセス
　　　　ソフトウェアユニット及び構成部品を組み合わせ，結合されたソフトウェア品目を作り出す

　６）、ソフトウェア適格性確認テストプロセス
　　　　結合されたソフトウェア製品がその定義された要求事項を満たすことを確認する


方式設計は、世の中の「基本設計」ですね。
構築プロセスは、世の中の「製造、単体テスト」ですね。

参照：
https://www.sc-siken.com/kakomon/30_haru/am1_16.html
Ubuntu,ROSでYOLOv4を使ってみた

#概要
最近YOLOv5なるもの（賛否両論あるようですが）が出てきたこともあり,多少時代遅れのYOLOv3からYOLOv4にしようと思いましたが ,ROS(Robot Operating System)環境でのセットアップ記事が見当たらなかったので備忘録としてまとめてみます．

※以下の記事によると，YOLOv5はフレームワークにpytorchが使われていて現環境と異なるので取りあえず見送ります．

[YOLOの各バージョンについてのまとめ(Qiita)](https://qiita.com/tfukumori/items/519d84bf3feb8d246924)

#実行環境
今回はUbuntu16.04とUbuntu18.04で動作を確認しました．以下詳細です．

|OS           | Ubuntu16.04.6 LTS | Ubuntu18.04.5 LTS |
|:-----------:|:-----------------:|:-----------------:|
|CPU          |Intel Core i7-8700 |Intel Core i5-6500 | 
|GPU          |Geforce GTX 1080 Ti|Geforce GTX 960    |
|ROS          |Kinetic 1.12.14    |Merodic 1.14.9     |
|Nvidia Driver|450.51.06          |440.100            |
|CUDA(toolkit)|8.0                |10.2               |
|cuDNN        |7                  |7                  |

今回は上記環境が整っていることが前提として進めていきます．

#準備
現在，**~/catkin_ws/src/**下にある**darknet_rosパッケージ**を避難させる．適当にホームディレクトリなどにバックアップディレクトリ（今回はYOLOv3）を作りそこに移動させる．
※darknet_rosを初めて使う人はとばしてください

```:端末
# １行ずつ実行してください

$ cd
$ mkdir YOLOv3
$ cd　~/catkin_ws/src
$ mv darknet_ros ~/YOLOv3
```
次に以下を参考にYOLOv4用の**darknet_ros**パッケージをクローンする．
[YOLO V4 for darknet_ros](https://github.com/Tossy0423/yolov4-for-darknet_ros)
<注意>
リンク先に書いてあるコマンドでクローンすると**yolov4-for-darknet_rosパッケージ**という，darknet_rosより１つ上の階層のパッケージがインストールされてしまい，私の場合catkin_makeが通りませんでした．以下に変更すると上手く行きました．

```:端末
$ cd　~/catkin_ws/src
$ git clone --recursive https://github.com/Tossy0423/darknet_ros.git
$ cd ..
$ catkin_make
```
これでmakeが通れば完了です．

# 補足
この**darknet_rosは，**USBカメラのドライバとして**uvc_camera**を採用してあります．私の場合**usb_cam**をドライバとして使用しているのでテストする際にはdarknetが受け取るカメラノードの変更が必要でした．

 - **catkin_ws/src/darknet_ros/darknet_ros/config/ros.yaml**
 
```:　変更前　
1 subscribers:
2
3  camera_reading:
4    topic: /camera/rgb/image_row
5    queue_size: 1
```
```:　変更後　
1 subscribers:
2
3  camera_reading:
4    topic: /usb_cam/image_row
5    queue_size: 1
```
#テスト
動作テストをしてみました．

```:端末
# ２つの端末で実行

# darknet_rosノード立ち上げ
$ roslaunch　darknet_ros yolov4.launch

# カメラノード立ち上げ
$ roslaunch　usb_cam usb_cam-test.launch
```

[yolov4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687220/ded6bb56-1c1e-4644-9973-918d9e426835.png)

いい感じに表示することができました．以上です．
Go で同じフィールドを持つ構造体を interface で定義する

Go の interface は、メソッドを定義することはできますが、フィールドを定義することはできません。
代わりに Getter（必要に応じて Setter）を定義して同じフィールドを持つことを保証することができます。

```go
type Animal interface {
  GetName() string
}

type Dog struct {
  Name string
}

func (d *Dog) GetName() string {
  return d.Name
}

type Cat struct {
  Name string
}

func (c *Cat) GetName() string {
  return c.Name
}

func greet(animal Animal) {
  fmt.Printf("Hello, %s!\n", animal.GetName())
}
```

フィールドにアクセスする必要すらない場合は空のメソッドを定義します。

```go
type Animal interface {
  animal()
}

type Dog struct {
  Name string
}

func (d *Dog) animal() {}

type Cat struct {
  Name string
}

func (c *Cat) animal() {}

func greet(animal Animal) {
  fmt.Printf("Hello, %T!\n", animal)
}
```

## 補足

フィールド `Name` が unexported（つまり `name`）ならば `GetName` ではなく `Name` のように命名するのが推奨されています。
[Effective Go - The Go Programming Language](https://golang.org/doc/effective_go.html#Getters)
TPM(Trusted Platform Module)、SPF(Sender Policy Framework)、UTM(Unified Threat Management)、SIEM(Security Information and Event Management)

応用情報技術者平成30年春期 午前問45

TPM(Trusted Platform Module)に該当するものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0313428e-ce74-c1bd-1bb4-4fdfe213ec4f.png)


１、TPM(Trusted Platform Module)は、
PCのマザーボード上に直付けされるセキュリティチップで、RSA暗号の暗号／復号や鍵ペアの生成、ハッシュ値の計算、デジタル署名の生成・検証などの機能を有します。

TPMによって提供される機能には以下のようなものがあります。
・OSやアプリケーションの改ざん検知
・端末認証
・ストレージ全体の暗号化

２、SPF(Sender Policy Framework)の説明
受信した電子メールが正当な送信者から送信されたものであることを保証する，送信ドメイン認証技術


３、UTM(Unified Threat Management，統合脅威管理)の説明
ファイアウォールや侵入検知，アンチマルウェアなど，複数のセキュリティ機能を統合したネットワーク監視装置


４、SIEM(Security Information and Event Management)の説明
ログデータを一元的に管理し，監視者へのセキュリティイベントの通知や相関分析を行うシステム


参照：
https://www.ap-siken.com/kakomon/30_haru/q45.html
パケットフィルタリング

応用情報技術者平成30年春期 午前問44

パケットフィルタリング型ファイアウォールのフィルタリングルールを用いて，本来必要なサービスに影響を及ぼすことなく防げるものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7ec98799-5d1a-189f-342d-e77538186413.png)


１、パケットフィルタリングとは、
通過するパケットのIPアドレス(送信元・送信先)やポート番号，通信の方向などの情報をもとに中継の可否を判断する方式です。ただしパケットのペイロード(データ部分)に関してはチェックを行いません。

２、下記３つは、電子メールサーバ、サーバを遮断したら、本来必要なサービスに影響になりますので、不適切です：
・電子メールに添付されたファイルに含まれるマクロウイルスの侵入
・サーバで動作するソフトウェアのセキュリティの脆(ぜい)弱性を突く攻撃
・電子メール爆弾などのDoS攻撃

参照：
https://www.ap-siken.com/kakomon/23_aki/q41.html