OmniAICreator/Qiita-1.07M huggingface dataset:
社内で受付システムをつくったお話

#はじめに
社内SEとして入社してから半年が経ちました。
半年経っても人材業界のこと、社内システムのこと、あと技術的なことについて知らないことが多すぎて毎日少しずつ勉強中です。
今回は、私の所属しているチームで開発・導入した<font color="blue">「受付システム」</font>についてご紹介させていただきたいと思います。



##所属チームの紹介
まず最初に、私の所属チームの紹介をさせていただこうと思います。
私は現在社内のIT部門のとある課に所属しています。
そこでは、現場の方々の要望や課題に対して迅速・柔軟にソリューションを提供することがミッションとなっています。
つまり、現場の人がちゃんと本当にほしくて使いたいシステムを作るで！ってことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517187/3c9019ff-6adf-a257-421e-cf83b9e2b82e.png)

現場の方々の意見を聞きながら0から開発していくことが多いので、そこが社内SEとしてはちょっとめずらしくてこのチームの魅力かなと思います。



#受付システムとは？
来社されたお客様がタブレットにて訪問先の担当者や部署を指定すると、チャットで携帯やPCに通知してくれるタブレットシステムです。
Outsystemを使って開発しました。


##背景
弊社はこれまでは固定電話での受付だったのですが、オフィスリニューアルの際に固定電話を廃止することとなり、新たな受付システムがほしいとの要望から始まりました。
外部サービスとも検討した結果、社内で開発した方が安くて早いので私の所属するチームで開発することとなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517187/1abb09cf-af3b-28fd-435e-26773f784176.png)



##特徴
受付システムの特徴としては以下になります。
**・受付からの呼び出しがあった場合、担当者のGoogleChatに直接通知を送ることができる。**
**・ワンクリックで対応済みかどうかのステータスを変更できる。**
**・DOMOと連携しており、来社情報を確認することができる。**
**・呼び出しされた担当者が不在等で対応できない場合、一定時間以上経過すると他の人にお知らせすることができる。**


##大変だったこと
**・GoogleChatとの連携**
弊社はGoogleChatを使用しているため、受付からの呼び出しがあった際はGoogleChatに通知を飛ばしたかったので、Outsysytemsと連携させる必要がありました。
さらに、GoogleChatからワンクリックでステータスを変更させたかったので試行錯誤しながら開発しました。



**・DOMOとの連携**
来社情報を分析するために社内で導入していたDOMOと連携する必要がありました。
しかい、OutsystemとDOMOを連携するための情報がほとんどなかったため、情報収集から始めて結構時間がかかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517187/97a2f74c-e0cc-2a3b-18d3-542aab46684d.png)



**・社内での調整**
最初は本社での導入だったのですが、本社にある部署がとても多かったため各部署への説明や対応が大変でした。



##導入後
受付システムを導入したことでオフィス内での電話対応がなくなり、より業務に集中できるようになったというご意見をいただくことができました。



##今後
弊社は全国に支店があるのですが、受付システムは本社と他2支店にしかまだ導入されていません。
今後全国の支店に導入も考えておりますが、支店ごとに規模や部署の違い、オペレーションの違い等があるので、どこまで支店ごとにカスタマイズの対応をしていくのか、設定等をマニュアル化して他の人でも対応できるようにするなどいろいろ考える必要があると思っています。



#終わりに
ここまで紹介しておきながら、実際わたしは開発・導入には全く関わっていませんごめんなさい。
実際に開発・導入したお話をお聞きして今回記事にさせていただきました。
要件の取りまとめから開発・導入までを5、6人程度で、しかも短期間で行った皆様本当にお疲れ様でした！
今後全国の支店へ導入できるように私も貢献できればと思います。

それでは最後までお読みいただきありがとうございました。
アプリケーションコンテキスト値の環境切り替え

## はじめに：環境のコンテキスト

BEARでは `コンテキスト` に応じてアプリケーションオブジェクトの構成が変わり、振る舞いが変更されます[^1] 。実務でBEARを使う場合、`環境` を切り替えるためにはコンテキストを利用することになります。たとえば、「開発環境ではカスタムコンテキストの `dev` 、production 環境では  `prod` を付して、DBサーバーの接続先等を切り替える」というような使い方をすることが多いでしょう。

## boot ファイルとコンテキスト

標準インストールした状態だと `boot ファイル` は下記のようになっています（執筆時点現在）。

- `/bootstrap.php` FWブートの return 文が一つあるだけのスクリプト。

```php5
// ...
return function (string $context, string $name = 'MyVendor\MyProject') : int {
    $app = (new Bootstrap)->getApp($name, $context, __DIR__);
    // ・・・（説明用のため省略）・・・
    $request = $app->router->match($GLOBALS, $_SERVER);
    // （省略）
    $response = $app->resource->{$request->method}->uri($request->path)($request-        
    // （省略）
};
```

- `public/index.php` Webサーバー向けエントリーポイント。上記にコンテキストを与えて呼び出す役割。

```php
require dirname(__DIR__) . '/autoload.php';
exit((require dirname(__DIR__) . '/bootstrap.php')(PHP_SAPI === 'cli-server' ? 'hal-app' : 'prod-hal-app'));
```

## Webアプリでよくある使われ方

Webアプリでよくある使われ方の一つは下記ではないでしょうか。

- 開発環境ではエントリーポイントでコンテキスト値 `dev-html-app` をデフォルトとしてハードコード
- production に出すときは  `prod-html-app` 固定でハードコード

環境毎にコンテキスト値を書き換えるわけです。これはどう管理するのが良いでしょうか？ 

## 環境切り替えの実装例

以上が前置きでした。ここから本題で、私がふだん使っているエントリーポイントでの環境切り替えの実装を以下に紹介します。bootファイル系の変更だけなので、どのアプリケーションでも簡単に試せる内容です。

### 1. Webサーバーのエントリーファイルを環境のコンテキストのファイル名で配置

- 開発環境では `ビルトインWebサーバ` で `ルータースクリプト`[^2]に `dev.php` を指定。コンテキスト値 `dev-html-app` がハードコードしてある。
- production ではWebサーバーで  `prod.php` を設定。コンテキスト値 `prod-html-app` がハードコードしてある。

　　　![スクリーンショット_2019-12-22_10_40_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15295/8f820b9e-fb2a-d87a-2d03-c1d4bd3c8555.png)

### 2. production 環境のWebサーバー設定のイメージ

Nginx の場合

```bash
    server {
        listen       8082;
        server_name  www.dummy-foo.com;

        set $host_path "/path/to/FormalBearsDemo";
        set $bear_bootstrap "prod.php";
        root $host_path/public;

        location / {
            try_files $uri /$bear_bootstrap$is_args$args;
        }

        # pass the PHP scripts to FastCGI server
        set $port "9073";
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:$port;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            fastcgi_param  DOCUMENT_ROOT $realpath_root;
            internal;
        }
    }
```

### 実装リポジトリ

こちらに置きました。[FormalBearsDemo](https://github.com/kumamidori/FormalBearsDemo) 

## 特徴

- ふだんよく使う開発フロー、環境切り替えにフィットしており、作業効率が良いように私は思っています。
- 別コンテキストを都度指定することは想定していません。柔軟な設定や、複雑な合成がしたい場合は、別途、デフォルトのやり方で普通に使えば良いと思います。私は両方のやり方を併用しています（前述のリポジトリ参照）。

## 参考記事

- [アプリケーションコンテキスト - BEAR.Sunday Advent Calendar 2014](https://qiita.com/koriym/items/d8d14682ce0a542c3b42)
- [FormalBears](https://qiita.com/kumamidori/items/53f3a271e3de70c5abf4)

[^1]:  [BEAR公式マニュアル：アプリケーション](https://bearsunday.github.io/manuals/1.0/ja/application.html)

[^2]: [PHP: ビルトインウェブサーバー - Manual](https://www.php.net/manual/ja/features.commandline.webserver.php)
【Vue.js】v-forループ内でFont awesome5アイコンを動的に表示するサンプルコード

## はじめに
v-forループ内でFont awesome5アイコンを動的に表示するサンプルコードです。

↓サンプルコードの出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/ff1b53fe-3d47-4caa-1a84-2c49e92831a9.png)

## 環境
```yaml
OS: macOS Catalina 10.15.1
Vue: 2.6.10
vue-cli: 4.1.1
```
## 前提
Vue-CLIでFont awesome5を使う手順については、以下記事をご覧下さい。

[【Vue.js】Vue-CLI4.1.1でFont awesome5を使う手順 - Qiita](https://qiita.com/terufumi1122/items/3a6bbfd8a445da8d095c)

## 指定方法
各アイコンのクラス名から、`prefix`と`icon`に使う文字列を確認しておきます。

![スクリーンショット 2019-12-23 5.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/95b75321-0acc-2246-e346-cd07d7eb4885.png)

## 表示方法
Font awesomeのアイコン指定方法は下記のように複数選択可能です。

```
<font-awesome-icon :icon="['fas', 'dog']"/>
```

```
<font-awesome-icon fas icon="dog" />
```

```
<font-awesome-icon prefix="fas" icon="dog" />
```

今回は一番下のものを使ってみます。

`:prefix`、`:icon`として`v-bind`を適用します。

## コード
```vue
<template>
...略
  <ul>
    <li v-for="item in items" :key="item.id">
        <p>
          <font-awesome-icon
            :prefix="item.prefix"
            :icon="item.icon"
          />
            {{ item.message }}
        </p>
    </li>
  </ul>
...略
</template>

<script>
export default {
  name: 'attention',
  data(){
    return {
      items: [
        { id: 1, prefix: 'fas', icon: 'phone-square', message: 'お電話はこちら'},
        { id: 2, prefix: 'fas', icon: 'dog', message: 'ペット可'},
        { id: 3, prefix: 'fas', icon: 'question-circle', message: '心配毎はご相談下さい'}
      ]
    }
  },
}

</script>
```

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [GitHub - FortAwesome/vue-fontawesome: Font Awesome 5 Vue component](https://github.com/FortAwesome/vue-fontawesome)
TouchDesignerのパフォーマンス測定

[サンプルファイル](https://drive.google.com/file/d/1xst_wdS2FLcRERfoM_FuCdNLIs-tnfgn/view?usp=sharing)

## SOPレベルのジオメトリ操作には注意！

`/project1/TRANSFORM_SOP_OR_GEO`

![Image](https://i.imgur.com/J30i7vK.png)

たとえば、↑ のようなネットワークがあったとします。片方はSOPレベルで回転をさせていて、もう片方は同じ操作を `Geometry COMP` で行っています。

**こういう事をしたい時には絶対に `Geometry COMP` でトランスフォームをするべきです**

なぜなのかは、`Dialogs > Performance Monitor` を選択して、Performance Monitorを見てみるとわかります。また `F2` キーでも開くことができます。

![Image](https://i.imgur.com/i5mjM6k.png)

`Analyse` と書いてあるボタンを押すと、現在TouchDesignerで実行中のネットワークのCPU利用状況の結果(プロファイル)が表示されます。注目すべきポイントは `transform1` のSOPの部分です。

`Performance Monitor` では、CPU時間がかかったものほど緑色のバーの幅が広くなるようになっています。スクロールしてみてもこのオペレーターはとくにCPU時間が長いことがわかります。

`Copying Input SOP Data` と書かれた所で 1.7ms、さらに `transform` の処理に 0.8ms かかっています。

一方、`Geometry COMP` では同様の操作をしているにもかかわらずCPU時間のかかっているオペレーターはほとんど見つけられません。

これは、`Geometry COMP` の変形はレンダリング時、モデルビュー行列によって行われているからです。モデルビュー行列での変形はSOPをレンダリングする時には必ず起きる計算で、そこに対して回転をかけているので実質オーバーヘッド無く変形が行われています。

一方、SOPレベルで変形をしてしまうと毎フレームポイントのコピーと変形が行われ、さらにSOPの情報をGPUにアップロードする部分まで時間がかかっています。

こういった問題が起こるのは頂点数の多いSOPを操作する時に限りますが、普段からアニメーションをする時にはなるべく `Geometry COMP` 側でやるようにするとよいと思います。


## CHOPのノイズタイプについて

`/project1/NOISE_TYPE`

![Image](https://i.imgur.com/sZRwB7a.png)

次に、こういったネットワークがあったとします。

`Noise CHOP` で2000サンプル弱のxyzを生成しているものですが、`Info CHOP` で `cook_time` を比較してみるとノイズのタイプによって生成時間が4倍ほど違うのがわかります。

マニュアルを見てみると、デフォルトの `Sparse` は `Hermite` に比べてクオリティが高いがCPU時間がかかるというような記述がありました。`Noise CHOP` も結構サンプル数の多いものを作りがちなので、パフォーマンスが気になってきたらノイズタイプ `Hermite` に変更して、その上で作り込んでいったほうがフレームレートを維持する上でよいと思います。

また、CPUやGPUのcook timeはオペレーターを中クリックした時に出るウィンドウでも確認できます。簡易的な確認にはこちらを使うとよいでしょう。

![Image](https://i.imgur.com/x5qIrZz.png)

## Probe

`/project1/PROBE`

`Palette` の `Tools > probe` を使うともっとグラフィカルにネットワークの負荷状態を知ることができます。`probe` を配置して、パラメーターウィンドウの `Open` を押すとprobeのウィンドウを開くことができます。

![Image](https://i.imgur.com/K2To2zv.png)

`probe` のウィンドウではネットワークエディタを模した図形が表示されており、時間がかかったりメモリ使用率の高いものがより赤く表示されるようになっています。

![Image](https://i.imgur.com/ehWmBlR.png)

各オペレーターを模した四角形を左クリックするとその中のネットワークに移動、中クリックでパラメーターを表示、右クリックで実際のオペレーターを別ウィンドウで表示、といった操作方法になっています。

## まとめ

TouchDesigner上で行なえるパフォーマンス測定の手法をいくつか紹介してきました。

個人的にはシステム全体に対する負荷がわかりやすいので `Performance Monitor` を一番よく使っています。

ネットワークエディターを開いたままだとそれも含めてのプロファイリングになってしまうので、ちゃんと計測をする時には `Performe Mode` にした上で計測を行う必要がありますが、それでも `F1` を押した後に `F2` を押すだけなので非常に楽に計測を行うことができます。

中クリックでの表示は、`Base COMP` でまとめたときにそれらの処理全体でどれぐらいの負荷がかかっているかなどを知る時に便利です。

Probeはグラフィカルでわかりやすいのですが、それ自体の負荷がけっこうあるのでCPU/GPU時間の計測にはあまり向いていないのではないかと思っています。使用メモリ量の多い部分を探すのには非常にいい手法です。

パフォーマンス測定ひとつとっても色々な調べかたがあります。用途に応じて使いわけて、FPS警察に逮捕されないように頑張りましょう。
STS, SpringBootで手軽にWebアプリ開発。10分で。

タイトルのお手軽手順を紹介します。

##要素
- STS
- Spring Boot
- Thymeleaf
 
##手順
####STSインストール
こちらから STSの最新版をダウンロードし、インストール。
https://spring.io/tools

####Starter Project 作成
Create new Spring Starter Project をクリックし、"Type" は "Gradle (Buildship 3.x) を指定して Next。

以下を選択。

- AWS Core
- AWS RDS
- Spring Boot DevTools
  - Spring 開発環境を強化
- Lombok
  - アノテーションで getter, setter 等を自動生成
- Spring Configuration Processor
  - Spring 開発環境を強化
- MyBatis Framework
  - ORM
- MySQL Driver
- Spring Security
  - 認証, 認可, CSRF対策, IP制限等のフレームワーク
- Thymeleaf
  - 最もシェアのあるテンプレートエンジン
- Spring Web
  - MVC
  
（今回使用しないものもあるが、いつも使っているものをチェックしている）

<img width="1092" alt="スクリーンショット 2019-12-23 5.42.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/7d80a78a-3e01-bbd6-b751-7aebdf9e628d.png">
Finish。

####実装
コントローラを作成。
Package Explorer で、src/main/java の下の com.example.demo を右クリックして New>Classをクリックし、Nameは "TopController" で Finish。
<img width="1136" alt="スクリーンショット 2019-12-23 5.49.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/2783fc1f-90b0-bf33-76b2-08f6b7cba1b7.png">

ビューを作成。
Package Explorer で、src/main/resources の下の templates を右クリックして New>Fileをクリックし、Nameは "top.html" で Finish。
<img width="1136" alt="スクリーンショット 2019-12-23 5.53.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/cccb28c5-96d5-216f-c965-b9403cbf0099.png">

####起動、表示確認
簡単のため、build.gradle を開き、今回使用せず、設定の必要な依存関係をコメントアウト。
<img width="1798" alt="スクリーンショット 2019-12-23 6.41.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/35bbc5b9-4fc2-0978-368e-ee1136b7a114.png">
忘れずに プロジェクトを右クリックし、Reflesh Gradle Project し、起動。

<img width="1288" alt="スクリーンショット 2019-12-23 6.34.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/cdca97af-13d3-b18c-1043-266c5bda74bd.png">

##おわりに
近年、プログラミング言語も流行り廃りが起きていますが、Java は静的型付け言語であるためリファクタリングもしやすく、大規模開発向きで（初期開発から10年以上小規模メンテのみで現役のシステムなんてザラ）、Android向けにKotlinも登場したりと、世界中で未だに根強い人気を誇っています。

一方でなかなか Javaを使うことに踏み切れず、厳格・冗長故に苦手意識のある人も多いと思いますが、これについては Lombok の様なライブラリや、Spring Boot の様な FW を使って解決できる事が殆どです。

本記事では、Java 界のスタンダードと言ってもいい Spring Boot のシンプルな開発環境構築を簡単に紹介しました。この機会に触れてみるきっかけとなれば幸いです。
合体ロボの夢より前に、以前作ったものを供養する必要がある話…

# それは、ルネサスナイトを控えた晩の出来事でした…
`#include <Servo.h>`
が、IDE for GR（ルネサスGRシリーズマイコンボード用IDE　ArduinoIDEの代わり）に認識されなくなってしまいました…
基本的なライブラリなので当然ネットにもそのような症状は一切なく、手動でインポートしてもライブラリ自体にエラーがあるらしく…
# これでは合体ロボ（昔のプラモみたいに一機づつ増やして別のメカになって最終的には合体ロボにする）を作れない…
そんな絶望に打ちひしがれた丑三つ時に、それは起きました。
# 何かが、語り掛けてくる…
![KIMG3402.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/79d00648-9e3b-4800-e329-eec554afe2c3.jpeg?rotate=-90)
**「…私を、使いなさい…」**
#それは、おかめの仮面でした。

…そう…
合体ロボの一部分を作るべく、以前作ったものから引っぺがした時の残り…

しばらく前にあるイベントで行われていた「ヘボコンLight」という
その場にある資材で如何に技術力低いロボットを作って相撲させて楽しむかという所で
制作した「おかめがに」の甲羅だったのです…
![KIMG3365.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/a900d3cb-23cf-afb5-1ed8-71ba513cbbb1.jpeg)
これを…こともあろうに
![KIMG3366.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/f6eec218-d7c8-25de-2075-0d94615324af.jpeg)
こうやって！引っぺがしたのです。
ちなみに振動が風車に伝わってゆっくり回り始めるという謎ギミックがありました…
# 私がその仮面を手に取ると、頭に何を作ったらいいか流れ込み始めました。
![okame01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/405a994f-670f-3c13-ff9b-0bc870d0958e.png)

引っぺがした「おかめがに」の中身…「タミヤのぷるぷるてんとう虫キット」の
電池ボックス（写真左下）から両端のリード線を外し、ちゃんとねじってGR-ADZUKIのMOTOR0 9番と10番端子（写真中央緑の端子が逆側にもある）にねじで取り付けます…
ちなみにドライバーはキットに入っているものそのまま使えます。
![KIMG3397.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/1eee5f89-a745-b49d-d780-44990cb29853.jpeg)

そして３V電池ボックスを電池ボックス端子（写真中央左寄り黒い端子）にねじで取り付け
Scratch（S4Aを使う）かSketch（IDE for GRを使う）でA2(16番ピン)についているフォトセンサ(写真中央右寄り青い端子の間にある緑のセンサ）をanalogReadで読んで一定以下に(暗く）なったら何秒かモーターを動かすようにプログラムして書き込んで…
![KIMG3398.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/da3b527d-7292-9439-fc6d-89ee3346621a.jpeg)
最後におかめの仮面とGR-ADZUKIと電池ボックスをキットに両面テープでくっつければ完成です…
![KIMG3399.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/ad0ac157-add8-241d-837c-be099f49ab1a.jpeg)

フォトセンサを左目に合わせるようにしてください…でないと、あなたから逃げ回り続けます…
# こうしてできたものを、「帰ってきたおかめがに」と名付けました…
キットに付属しているスイッチがそのままモーターを動かすスイッチになるので、遊びやすいです。
手を伸ばすと、じっとしていた「おかめがに」が逃げ出します…そして…
暗くなると勢いよく蠢きだすのです…！
# そうして、睡眠不足の頭でふと考えました…
定番ライブラリが動作しないのは、「おかめがに」が寂しがっていたのではないか、と。
何年も埃をかぶった紙袋の中で放置されていた「おかめがに」
ある日突然中身を引っぺがされて殻だけ放置された「おかめがに」

私は彼を、供養する必要がある。と考えました…
# あなたも、もし仮面の声を聞いたら…
お子さんでも簡単に用意して作れるので、作ってみてください…
プログラム次第でいろんな性格を、作れます…

それでもコード作成に詰まったら、[ここ](https://www.renesas.com/jp/ja/products/gadget-renesas/boards/gr-adzuki/project-sketch-ide.html)と[ここ](http://take6shin.blogspot.com/2018/06/gr-adzuki.html)を参考にしてみてください…


…ちなみに、Servo.hの件はルネサスナイトで中の人に相談しましたが…未だに原因不明です…
他の人の環境では、動くようです…
MuleSoft Anypoint Platform デプロイメントオプション

MuleSoft Anypoint Platformの構成要素と、その配置パターンの組み合わせからなるデプロイメントオプションについて説明します。

# Plane
Anypoint PlatformにはControle PlaneとRuntime Planeの大きく2つのトップレベルの要素から構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34119/c2825a13-594f-a83c-1b9c-110c65b209e1.png)

### Controle Plane
APIの設計、再利用、管理といったサービスセットを提供する要素で、Design CenterやManagement Center、Exchangeに該当します。
Controle Planeには以下のタイプがあります。

- US Cloud
米国内のクラウドにホスティングされているマルチテナント構成のControle Plane。

- EU Cloud
EUのGDPR（一般データ保護規則）に従ったEU向けのマルチテナント構成のControle Plane。

- Goverment Cloud
米国政府機関専用に設計されたControle Plane。

- Private Cloud Edition
クラウドソリューションの使用を制限する厳しい規制またはコンプライアンスの要件がある場合に、オンプレミスやプライベートクラウドでホスティングするタイプのControle Plane。

### Runtime Plane
アプリケーションがデプロイされる場所であり、MuleランタイムエンジンおよびAnypoint Connectorsなどの他のアプリケーション関連サービスが実行される場所です。

- CloudHub
AWS上にホスティングされた
MuleSoftが運用するMuleランタイムのクラウドサービス。99.99％の稼働率や、ワンクリックでのスケーラビリティが行える。

- On-Premise
自前のサーバにMuleランタイムをホストおよび管理する構成。

- Anypoint Runtime Fabric
CloudHubのようなスケーラビリティやダウンタイムなしの再デプロイメントの機能を、オンプレまたはAzureやAWSなどでホスティングする構成。

# Deployment Option
Controle PlaneとRuntime Planeの組み合わせにより、以下のデプロイメントオプションがあります。

- CloudHub
Control Plane：マルチテナントCloud
Runtime Plane：CloudHub
全てクラウドで構築するインテグレーションプラットフォーム (iPaaS) の構成。

- Hybrid
Control Plane：マルチテナントCloud
Runtime Plane：On-Premise
データセンター内だけでの連携など、クラウドにはデータを流さずオンプレだけで処理をする構成。

- Anypoint Runtime Fabric
Control Plane：マルチテナントCloud
Runtime Plane：Anypoint Runtime Fabric
オンプレサーバの管理を自動化しスケーラビリティやダウンタイムなしのデプロイメントを実現する構成。Hybrid構成のRuntime管理を高度化したイメージ。


- Anypoint Platform Private Cloud Edition
Control Plane：Private Cloud Edition
Runtime Plane：On-Premise
Runtimeで処理されるデータだけでなく各種メトリクス等も含めて全て閉じた環境で扱うような厳しい規制やコンプライアンス要件がある場合の構成。
Control PanelにマルチテナントCloudを使う場合と比べて機能的な制限がある。

#まとめ
実際の導入にあたっては、CloudHubまたはHybridパターンを採用するケースが殆どではないかと思います。場合によってはRuntime PlaneにCloudHubとOn-Premiseを組み合わせて運用する選択肢もあるかと思います。
ネットワークを含めた基盤としての要件を鑑みて、導入計画の初期から最適なデプロイメントオプションを検討する事が重要です。

**参考**
[MuleSoft Document - Deployment Options](https://docs.mulesoft.com/runtime-manager/deployment-strategies)
Google ColabでJavaScriptしよう

この記事は[ラクス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/rakus)の22日目です。昨日は@miracle-FJSWさんの[【PHP7.4新機能】弱参照(WeakReference）とGCとメモリリークについて整理したよ！](https://qiita.com/miracle-FJSW/items/f35c3e90a5d14eb6eba3)でした。

---

今年は弊社で~~ようやく~~Google Driveが導入されたのでプログラマー必須の追加アプリ[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)（以下、Colab）について書いてみようと思います。

ColabはWeb上で完結する計算機環境であるJupyter Notebook[^jupyter]をGoogleDriveに対応させたものです。ColabではGPUの無料枠があるところも人気の一つ。

[^jupyter]: Project Jupyterで開発されており、現在は[Jupyter Lab](https://github.com/jupyterlab/jupyterlab)に移行。昔はIPythonとか言われていました。

プログラマー間のコード共有はGitHubやGitLab, BitBucketといったGitをベースにしたウェブサービスのおかげで過去と比べて段違いに活性化されてきましたが、Jupyter NotebookがColabとして手軽に利用できるようになったことで更にもう一段階先に進むのではないかと考えています。

ただしJupyter Notebookが元々IPythonとして開発されていたとおり、ColabもデフォルトではPython2とPython3しか使えません[^kernel]。しかしながらColabでは実行環境上のコマンドを叩くことができるので各種言語の処理系をインストールして利用を試みる人がちらほらいます。今回は私がよく使うJavaScriptをColabで利用する方法をまとめます。

[^kernel]: 他にも一応RとSwiftのカーネルは標準で入っているっぽい。

## ColabでJavaScriptを使う方法

TensorFlowのissueを参考にしました。
https://github.com/tensorflow/tfjs/issues/268

Colab上のコードブロックにエクスクラメーション(`!`)を付与することで実行環境上のコマンドを叩くことができます。

ColabでJavaScriptを使うためにJupyter Notebook用のJavaScriptカーネルである[IJavaScript](http://n-riesco.github.io/ijavascript/)を利用します。

### やりかた

npmの初期化とIJavaScriptのインストールを行います。`npm install`ではrootでの実行を通すために`--unsafe-perm`オプションをつけてください。
コードブロックに以下を登録して実行してください。

```
!npm init -y
!npm install ijavascript -g --unsafe-perm
!ijsinstall
```

登録済みのカーネルに`javascript`が含まれていることを確認します。

```
!jupyter-kernelspec list
```

`npm install`したモジュールはフルパスで指定しないといけない制約があるようなので`npm_modules`の場所を確認します。

```
!npm root
```

一度 [ファイル] > [.ipynbをダウンロード] でファイルをダウンロードし、ダウンロードしたファイルをテキストエディタで開いて

```json
"kernelspec": {
    "name": "python3",
    "display_name": "Python 3"
}
```

kernelspecを

```json
"kernelspec": {
    "name": "javascript",
    "display_name": "JavaScript"
}
```

に書き換えて、GoogleDriveの画面からアップロードします。[ファイル] > [ノートブックをアップロード…] でアップロードしてもかまいませんが、同名ファイルでも別ファイルとして保存されて面倒です。

### 動作確認

ここまで設定すると以下のようなコードを動作させることができるようになります。

```
!npm install moment
```

```javascript
var moment = require('/content/node_modules/moment')

moment.locale('ja')
console.log(moment().format('M月D日（dd）'))
```

といったコードが動作するようになります。どうやら`import`はエラーになる様子。

### 再読込後のエラー？

発生条件を特定できていないのですが、一通り実行した後にファイルを閉じて再度開いた後に実行するとすべてのコードブロックが評価エラーになる現象に遭遇しました。

一度kernel_specをPython3に戻してから（再度ファイルを書き換えて）JavaScriptに戻せば動作させることができました。

（追記）ランタイムの再接続でも治るっぽいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31037/54b5837c-d6a9-5803-90ac-d1abf4d49a20.png)

こちらからホスト型ランタイムに再接続すると治るかも。

## まとめ

Colabでは他にもJuliaやScalaなど多くの言語を利用する方法があるようです。
今まではコードだけを共有していましたが

- コード
- 実行環境
- Markdown形式のメモ

をセットで共有できるのは込み入った処理を共有したいときに非常に有用だと思いますので積極的に使っていきたいと思います。

ただ、動作が不安定だったり追加登録したカーネルへの切り替えがウェブ画面上でできないのは難点です。このあたりが改善されるとうれしいですね。

---

明日は@noriharu3さんの[エンジニアの育休　POISON～言いたい事も言えないこんな世の中は～](https://qiita.com/noriharu3/items/ae0505da812c988ff4ab)です。
標的型攻撃メール耐性訓練をハックしたい

# 標的型攻撃メール

怖いですよね、標的型攻撃メール。
本当に標的にされたら引っかかっちゃいそうなメールがきっと届くのでしょう。
ただ、普通の会社員はホンモノの攻撃メールを受け取るよりも「標的型攻撃メール耐性訓練」として届く怪しげメールのほうが馴染みがあるかと思います。

そんな標的型攻撃メール耐性訓練メールをハックしたい ~~（が、本当にやると怒られが発生するし、倫理的にNGなのでやらないのだけれど話題としては好きなので吐き出しておきたい）~~ という記事が本記事です。

# ハックする とは

* 一人の訓練対象者として自分以外の耐性訓練の結果に影響を与える。 

これを目標にします。
なんでもありだと思考実験としても面白くないので、実現可能そうで :police_car: 案件にならないように検討します。
善良なエンジニアとして、:police_car:のお世話になってはいけません。

なので、脆弱性のあるインフラで動いているケースは配慮せず、その領域に対するアタックするようなアプローチは考えません。
~~計測サイトのサービスをダウンさせるとか、DNSポイゾニング的なことは考えない~~


# 標的型メール耐性訓練システム
だいたいこういう構造になると思います。

![スクリーンショット 2019-12-22 23.45.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19483/05242738-e410-0709-f301-ab32047e6236.png)

訓練の結果に影響を与えるにはこのプロセスに干渉する必要がありそうです。
~~そもそも論として、ブラウザで知らないページを開くだけなら私は危険ではないと考えていますが記事の目的には影響しないのでおいておきましょう。~~

# システムに対する影響の与え方
先程の絵に現れた3つのプロセスそれぞれにどういうふうに影響を与えられるか考えてみます。

## (1)メールの配信

### メールの特徴を利用するフィルタ
訓練対象者に訓練メールを受信しない/させないというアプローチがあります。

当然ですが訓練メールは、訓練のために自組織から送られるものです。
そのため、組織が運用しているメールフィルターには引っかかりません。
なので、メール自体を拒否するのは原則困難です。

ただ、何度も訓練が実施されていてパターン化しているなら可能性はあります。
メールの内容は変わっていても、「配信方法、配信タイミング、メールの配送経路、ヘッダのパターン」など毎回同じ方法で配信している可能性はあるでしょう。
これを他の訓練者に啓蒙することで、訓練結果に影響を与えることはできそうです。

## (2)メールのリンクを踏む
「リンクを踏む」に対するのアプローチですが、自分以外の他人について影響を与える手段を検討します。
自分が踏んで結果に影響があるのは当たり前なので。

### ソーシャルエンジニアリング
この工程は人間の操作なので、ソーシャルエンジニアリング的な方法。
嘘情報（例えば、あのメールのリンク先重要なこと書いてあったよ。とか）を同僚に流すことで、訓練メールのリンク先を積極的に踏ませに行くというソーシャルなアプローチは考えつきます、が、普通に恨まれる。
~~ただし、:police_car:は恐らく避けられるのでレギュレーション的にはセーフ~~

## (3)ユニークなHTTPリクエスト
訓練対象者ごとにユニークなURLが届き、そのURLにアクセスしたことを計測されるモデルだとして、計測結果に影響を与える方法を検討します

### アクセスを捏造する
他の訓練対象者のアクセスを捏造することができれば、目標は満たせるでしょう。

他の訓練者に送付されたユニークなキーを生成できるかどうかが鍵となりそうです。
こういったユニークなキーとして以下のようなものが使われていると思われます。。

1. 類推不能なIDを付与する場合(UUID/乱数など) 
 - 類推不能なユニークキーに使っている場合は、手のうちようがない。
 - 適当にユニークキーを生成してアクセスするのが関の山。

2. 類推可能なIDを付与する場合(連番/社員IDなど)
 - 他の訓練対象者に配布されたURLが推測できるので、かんたんに訓練の結果を蹂躙できる。
 - 社員IDのような情報を元にユニークキーを作っていれば特定の訓練者を特定してアクセスすることも可能
 - 計測用サイトに対してiframe等で類推したURLへアクセスを行うページを設置＆流布することで結果に影響を与えることはできる。

3. IPアドレスや事前に埋め込まれたクライアント証明書など変更が困難なもの
 - 変更困難なキーを使われる場合はソーシャルエンジニアリング的な手法になり、アクセスを捏造するためにメールのリンクを踏ませる手段になるので **（２）メールのリンク**の手法と同じような作戦になりそう。

ユニークなキーがどのように生成されているかにかかっていますが、キーが類推可能だと耐性訓練の計測をパーにすることはできそう。

# まとめ
こんな事ばかり考えて生きていますが、頭の体操としてセキュリティを考えている程度です。

メリークリスマス！ :christmas_tree:
macOS CatalinaでUnityでマイク入力が取れない場合の対処方法

Catalinaにしたら何故かマイク入力から情報が取れない。
特にエラーが出ているわけではなく見かけ上は正常に動いているがデータが空っぽ。

全然理由が分からなくて諦めかけたが他のソフトでも似たような症状が出ていることを発見して対処方法を見つけた。

ターミナルからopenでUnityを開くとマイクアクセスのダイアログが出て許可することでマイク入力が取れるようになる。

`open /Applications/Unity/Hub/Editor/2019.2.15f1/Unity.app`

参考：Audacity under macOS 10.15 Catalina
https://forum.audacityteam.org/viewtopic.php?f=47&t=107162&p=378694
Unityでシューティングゲームを作る(3)

##ここまでの進捗

- 背景がループするようにした。
- 普通の敵の動作を作成し、その敵が3秒ごとに生成される。
- 瞬間移動する敵の動作を作成し、5秒ごとに生成する。
- プレイヤーが画面の範囲外に行かないようにした。
- 敵とプレイヤーが衝突したらプレイヤーが消滅する。
- 分散攻撃の敵を実装する。


##今後やること

- <font color=Red>タイトルシーンとエンディングシーンを追加する。</font>
- ボスキャラの動作を実装する。
- エフェクトとBGMを追加する。
- 様々な敵の出現方法を考える。

この記事で書くのは赤文字の部分
前回の最後に「次はボスかぁー」って書いたけどシーン遷移とかやりたかったから先にタイトルとエンディングをやる

##タイトルシーンの追加
最終的にどんな感じになったかというと

![コメント 2019-12-22 211531.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/ebb79cab-cc8a-c1fe-5f56-b30341caa800.png)

###シーン作成

File→New Sceneから新しいシーンを作成して名前を「Title Scene」とした
![コメント 2019-12-22 232318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/48beffaf-04db-5124-c9e3-d80616d50c08.png)

以下のようにオブジェクトを追加する

![コメント 2019-12-22 232248.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/6bfa4355-ddaa-59aa-d760-14026cdfa2a3.png)

###背景
background1,2は背景のオブジェクトで、画面をスクロールするために2つ作った。
![コメント 2019-12-22 233630_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/f689a538-c4ea-c5fc-17d4-93376da0190f.jpeg)
オブジェクト1と2で真ん中の赤い部分が中心。
背景オブジェクト1と背景オブジェクト2をY軸に対してマイナスの方向に移動させ、もし中心がある座標までいったらオブジェクト2の位置まで移動するようにした。
具体的なスクリプトとしては以下のようになる。

```
transform.Translate(0, -0.05f, 0);
if(transform.position.y <= -20.44f) {
    transform.position = new Vector3(0, 18.44f, 0);
        }
```

これはゲーム内の背景にも適用した。

###タイトル名のTextとButton
タイトル画面にタイトル名のTextとゲームを開始するためのボタンを設置した。
これらをそのまま画面に出すのは面白くないので、アニメーションをつけた。
ButtonはScaleを0.3秒毎に変更し続けるようにして、Textのアニメーションは以下のサイトを参考にした。

参考:[uGUIのTextで1文字単位のアニメーションを実装できる「Text Juice」紹介](http://baba-s.hatenablog.com/entry/2019/06/28/090000)
参考:[badawe/Text-Juicer](https://github.com/badawe/Text-Juicer)

今回はこの中のY Modifierというアニメーションを使用した。

最後のNormalEnemyGeneratorは背景として敵を生成している。
完成したのが下になる。
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/9295c42c-783a-723b-4216-0d2f3b1db117.gif)
PytorchでSemantic Segmentationするときに困ったことまとめ

#Pytorchでsemantic segmentationして困ったこと
卒論書くときにpytorchでsemantic segmentationをしたのだが, いろいろ困ったことので備忘録的にまとめておく.

## IoU
torchvisionの方にbox_iouというものがあるのだが, segmentation用の奴が見つからなかったので困った
結局[この実装](https://www.kaggle.com/iezepov/fast-iou-scoring-metric-in-pytorch-and-numpy)を使った

## torch.nn.CrossEntropyLoss
こいつがマジで厄介
[document](https://pytorch.org/docs/stable/nn.html)を見ると$Input:[Minibatch, C, d_1...]$とか書いてたので推論した結果と正解データのマスクのshapeを[バッチ数, クラス数, H, W]みたいな感じのone-hot表現にしてたら無限にエラーを吐いてきて1,2日詰まった.

実際には推論結果のshapeは上記でいいが, 正解データの方は$target:[Minibatch, d_1...]$という感じらしく, shapeが[バッチ数, H, W]で各ピクセルにラベルがついている状態が正解らしい.
BinaryCrossEntropyがinput, target共に同じshapeだったので合わせていたら違って腹が立った.~~ちゃんと確認しろ~~

あとtargetの方は各ピクセルのラベルがinputのクラスのindexとあっていなければいけないらしい. つまりクラス数が20個なら, targetのラベルは0~19の値でなくてはいけない.
UE4でのUI作成

# 初心者のUE4のUI開発の触り
UE4のUIってこんな風に作るんだ　という簡単な認識をしてくれれば幸いです
今後UE4は多く使われていくと思うので興味があれば触ってみてください

## UMG
UE4でのUI開発にはUMG（Unreal Motion Graphics）が使われています
こういった画面で作業します

![NewWidgetBlueprint 2019_12_23 1_26_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146711/5d8e7147-d8e6-45df-25b8-572018faa4aa.png)

グラフィッカーの方がプログラムを意識せず画面構成、アニメーションを作成することができます

## UMGのパーツ
この画面に色んなパーツを組み込んで画面を構築していきます

### パーツ
左上の「パレット」から素材を画面上にドラッグ＆ドロップしていきます
「パレット」内の「一般」に画像、ボタンなど基本的なパーツが含まれています
![NewWidgetBlueprint 2019_12_23 1_26_16_parts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146711/3597753c-9480-91b8-ed80-fc3af845d41d.png)
上記から画像、ボタンを引っ張ってくると下記のように簡単に表示されます
![NewWidgetBlueprint 2019_12_23 1_42_46_layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146711/596723e2-646e-6f91-c6b3-c46ea7d80c05.png)

### 階層
UMGパーツの階層構造が見えます
そこでパーツを選択しパーツ内の設定を変更することができます
![NewWidgetBlueprint 2019_12_23 1_42_46_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146711/796b8f78-6977-5d18-694e-13928ca8ccbc.png)

### 詳細
選択したパーツの詳細が画面右に表示されます
![NewWidgetBlueprint 2019_12_23 1_42_46_detail_slot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146711/62794500-7c35-b2c4-b844-369f8b0e261d.png)

#### Slot
Slot内のパーツの位置、大きさの設定

#### Appearance
画像のリソース、色の設定

#### Behavior
画像の表示、非表示、入力の当たり判定
画像の透過度の設定

#### Render Transform
画像の位置からの移動、拡縮、基準（pivot）の設定
主にアニメーションで使われます

などなどほかにも沢山あります
こういった設定をプログラムなしで組めるのがUMGです


## Blueprint
そしてプログラマーの方はBlueprintでUMGのパーツを制御することができます

![NewWidgetBlueprint 2019_12_23 1_29_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146711/ec98607b-c1a8-5bda-2dfd-9f64a8ea04f4.png)

## 簡単な記事で申し訳ない
時間がなかったので今回は概要の触りも触りの部分を説明しました
またUMGはUUserWidgetというクラスで中身が見れるので詰まったら参照してみてください
またUMGのパーツを改造して自分のプロジェクトに使いやすいようにパーツを作っみてもいいかもしれません
Androidアプリを公開する

初めてAndroidアプリを公開したので手順をメモします。

## 準備するもの
- [Google Playデベロッパーアカウント](https://support.google.com/googleplay/android-developer/answer/6112435?hl=ja)
- APKファイル
- ストア掲載用スクリーンショットファイル
- ストア掲載用アプリアイコンファイル
- ストア掲載用ヘッダー画像

## 手順
[Google Play Console](https://play.google.com/apps/publish/)にログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/483d9310-1af5-ae93-f75e-a0a0e4cdc666.png)

すでに内部テストなどでアプリ作成が完了している場合には該当のアプリを選択します。新規作成の場合には[アプリの作成]をクリックし、言語とタイトルをつけて作成してください。
私は内部テスト後なので作成されたアプリをクリックして進めます。
左メニューからリリース管理＞アプリのリリースをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/9733c124-0979-da09-7b69-5fd5e2a60edf.png)
製品版トラックの[管理]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/46c68ec0-ebc1-f3bc-eb51-7da18b95043e.png)
[リリースを編集]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/70960af4-f564-c46c-6fa4-c9c81843589f.png)
[追加するAndroid App Bundle とAPK]の中にAPKファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/6e00cb38-cbcc-1c96-cb81-8808ceff46b9.png)
>内部テストと同じファイルをアップロードする場合にはドロップするとアップロードエラーになるのでライブラリからの追加を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/fbc5bbef-743c-2c3d-c84e-19910556f790.png)
リリース名とリリースノートを入力して保存後確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/8fec95cb-71bf-427f-0939-262dbf4bd4e1.png)
ストアの掲載情報を埋めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/54392ff4-7435-275c-bd44-2d9b765c0105.png)

ストア掲載情報の登録後、またアプリのリリース＞製品版管理＞リリースを編集をクリックします。
画面右下の[確認]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/03d9f9a4-522a-c723-cf52-b2cfdd98e6af.png)
画面右下の[製品版として公開を開始]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/709ca549-5757-fa43-4b8a-88a5a4c52849.png)
ポップアップで確認をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/0c845fdc-b312-1a2a-04fb-3583e1a33e32.png)
もうこれで公開されたかのように思えてしまいますが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/e69d3967-1c74-a838-f0e9-568b4b9458fd.png)
ダッシュボードを見ると審査中になっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/96172d35-f984-fd03-12a8-efaa1b440f97.png)

また動きがあったら更新します。


## 参考リンク
- [【公式ドキュメント】アプリの一般公開](https://support.google.com/googleplay/android-developer/answer/6334282)
- [Androidアプリを公開する際の申請のやり方 (GooglePlay への登録方法 / Console の使い方)](https://backapp.co.jp/blog/11725/)
ADって何？

+ 2019.12.23　create

こちらの記事は「tecotec Advent Calendar 2019」の23日目です。
今年ようやく我が社にも導入できたActiveDirectoryドメインサービス（以下ADという）。現在は他のシステムとの連携（シングルサインオン等）を推し進めるべく動いているのですが、よく周りの社員から「ADって何？」って声が聞こえるのでこの機会におさらいしておこうと思います。

---
####トピック
1. ADとは？

2. ADは何をやってるの？
3. いろいろ連携るの？

 
1. ADとは
---
ADって一言で言うことが多いのですが実はこれだけのサービスに分かれています。
**Active Directory ドメインサービス（AD DS）**
ADって一言でいった場合８割方はこのActive Directory ドメインサービスのことを指します。
言われるLDAP等と同じディレクトリサービスです。どういったサービスかというとのは２章で詳しく

**Active Directory ライトウェイトディレクトリサービス（AD LDS）**
ディレクトリサービスのみ。ドメインコントローラーやDNSは不要らしい。使ったことないですねｗ

**Active Directory 証明書サービス（AD CS）**
証明書の作成と管理を行う証明機関を作成するサービス。

**Active Directory フェデレーションサービス（AD FS）**
ID連携機能。利用したいサービスの一つです。主にクラウドサービスとの連携ができるようになりますね。
手始めにやりたいのがAzureADとの連携！これができれば一般的なクラウドサービス（office365、github、AWS等）のSSO（シングルサインオン）が可能となります！
今は手が回りませんｗが実現できれば我が社のADレベルが一段階レベルアップすることでしょう。

**Active Directory Rights Management Services（AD RMS）**
ドキュメントの権限管理やコンテンツ保護機能など
AD RMSを利用すれば、メールやドキュメントの保護が可能になり、保護されたデータは暗号化され、細かな権限設定をユーザ単位で設定されます。これも利用したいサービスの１つ！実現できればさらにADレベルが上がりますｗ


2. ADは何をやってるの？
---
ここからはActive Directory ドメインサービス（AD DS）のお話
どういったサービスかというと
**・ユーザアカウントの管理、発行**
　PCやファイルサーバ等にログインするためのアカウントを集中管理・発行しています。
　これの何が便利かと言うとドメインに参加しているPCなら誰のPCでも自分のアカウントでログインできるんですね。
　情シス目線で話をすると１台毎にローカルのアカウントをセットアップする必要もなくなるのでPCセットアップの効率もよくなりますね！

**・認証**
　PCへログイン認証をしてくれています。アカウントも一元管理なら認証も一元管理です。

**・DNS**
　これはADの機能ではないですがセットみたいなものなので入れておきます。ドメイン内のPCやらサーバやらプリンタやらはホストネームをドメインのDNSに自動登録される仕組みになってます。PC名やプリンタ名で接続できるのはこいつのおかげですね。

**残念ですがADがMACのクライアントPCへできることは上記の３点までです。**

ここからはwindowsPCだけの機能です。
**・グループポリシー**
　これがアカウント管理に並ぶADのメインの機能だと思ってます。手間もかかりますが使いこなせばかなり便利な機能です。会社のPCのルールはここのポリシーで設定しているのです。
　グループポリシーにはユーザポリシーとコンピュータポリシーと２種類があります。
　　**ユーザポリシー**
　ユーザアカウントに対するポリシーです。パスワードのルールやら有効期限とかを設定しています。
　　**コンピュータポリシー**
　そしてこちらはクライアントPCに対するポリシーです。何ができるかというとプリンタの共有、windowsアップデートの管理、ログイン/ログアウト時のスクリプト実行など・・PCの設定に関わることはここで設定しています。

グループポリシーは非常に便利でかつセキュリティ向上・企業コンプライアンス遵守にも非常に有効なのですが一方でルールを固めすぎるとユーザビリティが悪くなるといったデメリットもありバランスが大事なところだと思っています。
ユーザビリティを下げずにセキュリティを高める！これは情シスの腕の見せ所ではないでしょうか！
我が社の場合はまだまだ試行錯誤の途中といったところなので温かい目でご協力お願いできればと思います。

3. いろいろ連携
---
AD FSはまだ利用前なのですが、それでも連携できることはいろいろあります！
ファイルサーバやVPNなど基本的に社内オンプレにある機器とは連携が可能です。
目指せSSO Life!

ここで大事なことは自分のID・パスワードを人には教えない！
そして無くさない！

まあ当たり前なことですけどねー


---

以上、簡単にですが今回はADについて書いてみました。
ADの構成とかには触れなくてすみません。。。

ただADを導入したことで裏課題である「インフラからワークフローを構築する」が一歩前進したのではないでしょうか。
アジャイルを経験してから、ウォーターフォールを経験して

# はじめに

今年の途中まで、アジャイル型のプロジェクトを経験。
昔も、どちらかと言えばアジャイル寄りのケースが多かった。
今は、Web系でウォーターフォール寄りの開発をしている。

## 書きたい事は、すでにWikipediaにだいぶ書かれていた。

アジャイルソフトウェア開発-Wikipedia

https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA

なので、個人的な経験を中心に書きます。
機密保持の関係で、抽象的な表現が多くなりますが、お察しください。

# 「基本みんなコードを書く」文化からのカルチャーギャップは感じた

今主に担当している案件が、エンド（顧客）へのヒアリングや折衝、それを要件としてまとめて外国籍のブリッジSEに伝えるような仕事がメインなので、そこから先のシステムを設計してコーディングしてー　という部分は他の人が担当することになります。

## 最初はもどかしさを感じた

今までは、コードやチケットさ仕様書といった文化も多かったので、細かい仕様書を用意して、自分は作らない・・・という部分で、自分ならすぐ改修できるはず。というもどかしさを感じた事も多々ありました。

## 各工程に専念するから、それぞれの担当パートでパワーを発揮できる面もある

もどかしさを感じた反面、開発が始まると進みが早い。

私は、顧客の考えを噛み砕いて案を出し、何を作れば良いかを導き出す事に専念する。
ブリッジSEは、その仕様を海外のプログラマが進めやすいように整理する。
海外のプログラマは、確実に動く物を作ることに専念する。

比較優位や最適化問題などの言葉も思い浮かぶ。
（それぞれの得意分野や、コストを考えたら誰が何をするかの解も出てくる）

## このケースでは、積極的にアジャイルを採用する必要はなかった　

以下のような事情もあった。

- 一部を除けば、仕様を固めてから開発する事ができた。
- 開発済の部分に与える影響は少ない。
- だから、部品事にドカンドカン作っていく方法を採用できる。
    - 作る側に取っては、その方が作業しやすい事も多い。
- ~~メテオフォール~~ 影響の大きい仕様変更の危険が少ない。
    

# 口直しに、明らかにアジャイル型のチーム体制が向いているケースを

個人的には、やっぱり「運営中の」ゲームアプリなんじゃないかな？と思ったり。

- ソフトウェアが直接的に人命を危険に晒さない。
    -　財布に致命的なダメージを与えるケースはあります。
.NET Coreのインテリセンスを日本語化する

# 事の成り立ち
最近.NET Coreに興味を持ち、.NET Core3.1をインストールしてみました。
早速Visual Studioでコンソールアプリのプロジェクトを.NET Coreで作成。
するとインテリセンス様が...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368024/808436e6-ed22-7479-3c7a-df1e0fcb6080.png)

**英語ではありませんか！**
ゆとりプログラマの私はインテリセンスの説明をあてにすることが多く、日本語でないと困ります。
日本語化していきましょう。

# 環境
今回の環境は以下の通りです。

- Windows10
- .NET Core 3.1
- Visual Studio Community 2019 16.4.2

# 日本語化手順
公式でこの上なく丁寧なローカライズ手順を書いてくれてました。この通りにやるだけです。
https://docs.microsoft.com/ja-jp/dotnet/core/install/localized-intellisense

### 1. ダウンロード
ここから目的のローカライズ用のファイル一式を落とす。
今回は.NET Core 3.1の日本語。
https://dotnet.microsoft.com/download/dotnet-core/intellisense

### 2. 解凍
ダウンロードしたzipファイルを解凍します。

### 3. 配置
バージョンにより適切なフォルダに配置する必要があります。
今回は.NET Core 3.1を例に書きます。適宜読み替えてください。

- .NET Core
  - %解凍フォルダ%\Microsoft.NETCore.App.Ref\ja を
  - %ProgramFiles%\dotnet\packs\Microsoft.NETCore.App.Ref\3.1.0\ref\netcoreapp3.1 へ配置
- Windows Desktop
  - %解凍フォルダ%\Microsoft.WindowsDesktop.App.Ref\ja を
  - %ProgramFiles%\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\3.1.0\ref\netcoreapp3.1 へ配置
- .NET Standard
  - %解凍フォルダ%\NETStandard.Library.Ref\ja を
  - %ProgramFiles%\dotnet\packs\NETStandard.Library.Ref\2.1.0\ref\netstandard2.1 へ配置

**以上！**

# 確認
Visual Studioを再起動してインテリセンスを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368024/e9f6dce3-849b-f51c-699f-65730298f513.png)

無事に日本語化できました。
これでプログラマを続けることができそうです。

終わり。
プログラミング初心者が使ってよかったツール2選

今年の10月(2019年)よりエンジニアとして働いているのですが、使ってみてこれは作業効率が上がったなと感じたツールを2つ紹介します！

## 1.Clipy
さっきもこの入力使った。。
`var_dump` 毎回打つの面倒。。
みたいなこと、よく起きますよね。

この`Clipy`はショートカットで呼び出しができ、コピー履歴を***30件***まで保存することができ、またよく使う表現はフォルダにして保存することができます。

↓こんなポップアップが出てきます。
<img width="311" alt="スクリーンショット 2019-12-23 0.51.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456901/9ba5ad99-ae85-d851-a799-dfba92cfc9c9.png">


別ページにコピーして貼り付け → また別ページからコピーして貼り付け...

こんな面倒な作業も`Clipy`を使えば解決できちゃいます。

[参考サイト](https://www.infact1.co.jp/staff_blog/webmarketing/14006/)

# 2.Boostnote
「エンジニア　おすすめ　メモアプリ」
と検索すると必ずと言っていいほど、出てくるアプリです。
メモ作成を選択すると、`スニペット`、`マークダウン`を選択することができます。
また作成したメモには、タグをつけることができ、管理もとても楽ちんです。
メモアプリに迷っておられる方は、とりあえず使ってみることをお勧めします！

<img width="1440" alt="スクリーンショット 2019-12-23 1.04.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456901/c3a87e80-0a29-dee5-365f-7c4a78f50a85.png">

[公式ダウンロード](https://boostnote.io/)

***以上、プログラミング初心者が使ってよかったツール2選でした！***

ご閲覧ありがとうございました！
SpresenseをROSでUnityにつなぐ

# 今日の目的

SpresenseのL1Sでの測位結果をUnityで取得する。

# SpresenseでL1S測位

[Spresense](https://developer.sony.com/ja/develop/spresense/)は、Sonyが出しているマイコンボードです。Arduinoや、Sony独自組み込みOS環境でプログラムできます。
特徴的な機能として、GPSがマイコンボードに組み込まれていて、さらに準天頂衛星みちびきのL1Sという補正信号を受信して、より精度の高い測位をすることができます。
（他にも特徴的な機能はあり、全体として非常に面白いマイコンボードですが、ここではGNSSについてだけ書きます。）
まずは、Arduino開発環境で、L1Sを取得してシリアルに送出するプログラムを作成します。

といっても、よくできたサンプルコードを公式が公開しているので、今回は[これ](https://github.com/sonydevworld/spresense-arduino-compatible/blob/master/Arduino15/packages/SPRESENSE/hardware/spresense/1.0.0/libraries/GNSS/examples/gnss/gnss.ino)を少しだけ変更して使います。

変更点は、以下の使う衛星の設定箇所です。

```
/* Set this parameter depending on your current region. */
static enum ParamSat satType =  eSatGpsQz1cQz1S;
```

これで、GPSとQZSSのL1C/AとL1Sを受信して測位するようになります。

# Raspberry Pi Zero WH でシリアル受信して、ROSでメッセージ送出

上記のプログラムをArduino IDEからコンパイルして書き込むと、USBシリアルに測位関連のメッセージが流れてきます。

```
pi@raspberrypi:~/ros_catkin_ws $ cat /dev/ttyUSB0
SpGnss : begin in
SpGnss : begin out
SpGnss : start in
  mode = COLD_START
SpGnss : start out
Gnss setup OK
1980/01/06 00:00:01.000498, numSat: 0, No-Fix, No Position
1980/01/06 00:00:02.000519, numSat: 1, No-Fix, No Position
1980/01/06 00:00:03.000508, numSat: 1, No-Fix, No Position
1980/01/06 00:00:04.000498, numSat: 1, No-Fix, No Position
```

こんな感じです。
実際に使うときは、NMEAあたりのフォーマットで送るのがいいかなと思いますが、今回はこのままROS経由でUnityに持って行ってみます。

先回作成したROSのPublisherのプログラムを以下のように変えました。

```ros_gnss_test_node.cpp
#include <stdio.h>
#include <stdlib.h>
#include "ros/ros.h"
#include "ros_gnss_test/MsgGNSS.h"

int main(int argc, char **argv)
{
  FILE *fp;
  char buffer[1024];

  fp = fopen("/dev/ttyUSB0", "r");
  if(fp == NULL) {
    printf("ERROR fopen");
    exit(0);
  }

  ros::init(argc, argv, "ros_gnss_test");
  ros::NodeHandle nh;

  ros::Publisher ros_gnss_test_pub = nh.advertise<ros_gnss_test::MsgGNSS>("ros_gnss_msg", 100);
  ros::Rate loop_rate(10);

  ros_gnss_test::MsgGNSS msg;

  while(ros::ok())
  {
    for(int i = 0; i< 1024; i++) buffer[i] = 0;
    if(fgets(buffer, 1024, fp) != NULL){
      msg.data = buffer;
      msg.stamp = ros::Time::now();

      ROS_INFO("send msg = %s", msg.data);

      ros_gnss_test_pub.publish(msg);

      loop_rate.sleep();
    }
  }

  fclose(fp);

  return 0;
}
```

# UnityでROSメッセージを受け取る

前回のプロジェクトをそのまま使って、メッセージを受け取ってみました。

![20191223_rosunity_spr.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/46f4c8d7-81e3-1a24-8436-cdde88a9b475.png)

雑ですが、GPSの情報をUnityに持ってくることができました。
ちゃんと作ればいろいろ便利そうです。
AtCoder Beginner Contest 148

https://atcoder.jp/contests/abc148

今回は前回より大変簡単ですね（私にとっては）。

Aは6-a-bで、
Bは`''.join([i + j for i, j in zip(S, T)])`で、
Cは最小公倍数を求めるからPython標準libのgcd関数で簡単に計算：

```python
from fractions import gcd
a, b = map(int, input().split())
print(a * b // gcd(a, b))
```

###D - Brick Break

400点ですが簡単。

```python
import sys
readline = sys.stdin.buffer.readline

n = int(readline())
num = 1
res = 0
for i in readline().split():
  if num != int(i):
    res += 1
  else:
    num += 1
if res == n:  # 全部砕く=満足できない
  print(-1)
else:  # 少なくとも一個を残す
  print(res)
```

##E - Double Factorial

まず`n<9`とnが奇数の時0を貰えない。
自分の考え方は以下です。

- n//10個ゼロを貰えるはず。
- だがn=100の時、ゼロが12個。なぜ？50と100をかける時、おまけのゼロをもらった。だから`100/10+100/50=12`です。
- n=1000の時、ゼロが124個。なぜ？50の倍数以外、250,500,750,1000をかける時、おまけのゼロをもらった。だから`1000/10+1000/50+1000/250=124`です。
- つまりn=5のべき乗の10倍で(50,250,1250,6250など)おまけを貰えることだ。

```python
import sys
readline = sys.stdin.buffer.readline

n = int(readline())
if n <= 9 or n % 2 == 1:
  print(0)
  quit()
res = n // 10
for j in range(1, 25):  # int(math.log(10 ** 18, 5)) == 25
  res += n // ((5 ** j) * 10)
print(res)
```

###F - Playing Tag on Tree

DFSの知識を修得すれば簡単だ。（私はEを完成した後勉強を始めた）

まずAtCoderで流行っているDFSコードをコピーする。

```python
def dfs(v):
    dist = [None] * (n + 1)
    dist[v] = 0
    stack = [v]
    while stack:
        x = stack.pop()
        for y in graph[x]:
            if dist[y] is None:
                dist[y] = dist[x] + 1
                stack.append(y)
    return dist
```
このコードを利用し、vと各頂点の距離リストを計算できる。
9 6 1
1 2
2 3
3 4
4 5
5 6
4 7
7 8
8 9
を例として、
`dfs(6) == [None, 5, 4, 3, 2, 1, 0, 3, 4, 5]`
`dfs(1) == [None, 0, 1, 2, 3, 4, 5, 4, 5, 6]`
がわかる。

次に、高橋君と青木君の戦略を考える。
高橋君の最適な戦略は、9へ逃げることです。
なぜなら、「高橋君より青木君との距離は遠い」を満足するすべての頂点(4, 5, 6, 7, 8, 9)の中に、
9と青木君の距離は一番遠いからです。

さて、ここに一つ問題が出た。
高橋君が自らゲームを終わらせる場合もあるよね。例の場合、高橋君は最後に「自殺」した。
(高橋君:6-5-4-7-8-9-8,6回;　青木君:1-2-3-4-7-8,5回)

幸いに、求めるのは青木君の移動回数なので、「自殺」を考える必要がない。
答えは「高橋君が行くべき頂点と青木君の距離-1」です。だから例の答えが5です。

高橋君の移動回数を求める場合、
二人の「目的地との距離」の差が奇数の場合「自殺」したので答えが「高橋君が行くべき頂点と青木君の距離」で、
偶数の場合「自殺」しないので答えが「高橋君が行くべき頂点と青木君の距離-1」
だと私が思います。（要検証）

ということで、コードは簡単です。

```python
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline

n, u, v = map(int, readline().split())
m = map(int, read().split())
data = list(zip(m, m))

graph = [[] for _ in range(n + 1)]
for a, b in data:
    graph[a].append(b)
    graph[b].append(a)

res = 0
dfs_u = dfs(u)
dfs_v = dfs(v)
for i in range(1, n + 1):
    dvi = dv[i]
    if du[i] <= dvi:
        if dvi > res:  # 実行時間はmax(res, dvi)より早いからmax関数をやめる
            res = dvi
print(res - 1)
```
(少々他人のコードを参考したが、皆さんは似たコードを使ってるから誰に感謝すべきかわからない:disappointed_relieved:)
CakePHP3をPHP7.2で動かすときは気をつけろ

# PHP7.2は曲者！？


以下の記事でも書いたが、PHP7.2でCakePHP3を動かそうとすると思わぬ事態に遭遇する。
https://qiita.com/21century_girl_/items/5be2606b3bfa98514952

元はといえば、サーバー移行の依頼を受けたため、「どうせならPHPのバージョンを上げるか」と軽い気持ちで、***PHP7.1→PHP7.2***にバージョンアップしたのです。

## phpコマンドが動かん…

```
php -v
```

いつものこれ。
phpのバージョンを確認するコマンドですが、これが

```
command not found
```

と出て動かないわけですな。

```
php72 -v
```

これで動きます。

一応、簡易的な対応としては以下の記事に載せているのでここでは割愛
https://qiita.com/21century_girl_/items/5be2606b3bfa98514952

## cronに設定したshellが動かん..

/etc/cron.dに以下のように設定したのです。

```
* * * * * root /var/www/html/***/bin/cake test
```

通常のcron設定ですね。
上記の場合は、cakephpのshell内のTestShell.phpを動かすといったイメージです。

### しかし以下のエラーが。。

```
Failed to find a CLI version of PHP; falling back to system standard php executable /var/www/html/service/bin/cake: line 72: exec: php: not found
```

どうやら該当のファイルの72行目を見ると、phpコマンドを叩いてる模様…

```
for TESTEXEC in php php-cli /usr/local/bin/php
```

ただし、phpコマンドが効かない状態なので、このエラーが出ているわけです。


### ではどうするか？


## cronファイルに環境変数を設定

以下のように設定

```
PATH=/usr/local/bin:/sbin:/bin:/usr/bin:/usr/sbin/sendmail:/opt/remi/php72/root/usr/bin:/opt/remi/php72/root/usr/sbin

* * * * * root /var/www/html/***/bin/cake test
```

これでphpコマンドも利用可能になり、cakephpのshellも実行されました。
GAE + python + Djangoでハマった話

## 経緯
ローカルで動くのに、GAEにデプロイしたら下記のようなエラー表示が。。。

Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509891/aea2071a-308d-9a26-9571-b37bad6819ce.png)

## ログの確認
エラーログを確認するため、下記のコマンドで状況を見るとどうやらmoduleがうまく探せていないようでした。ここで'main'ってなんだ、という罠に陥りました。

```
c:\Users\test>gcloud app logs tail -s default
…
 File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
 ModuleNotFoundError: No module named 'main'
```

## 結果
app.yamlの中に下記の文書を加えるだけで解決した。

```python:app.yaml
runtime: python37
entrypoint: gunicorn -b :8080 [プロジェクト名].wsgi　←←←ここ！！！

handlers:
# This configures Google App Engine to serve the files in the app's static
# directory.
- url: /static
  static_dir: static/

# This handler routes all requests not caught above to your main app. It is
# required when static routes are defined, but can be omitted (along with
# the entire handlers section) when there are no static files defined.
- url: /.*
  script: auto
```

## 最後に
GAE djangoのチュートリアルでは記述がないため、どうしたらいいかわからず
ログの出し方を学んでようやくたどり着きました。
このエラー解決で誰かの助けになれば幸いです。

## 参考URL
○App Engine スタンダード環境での Django の実行
（GAE django チュートリアル）
https://cloud.google.com/python/django/appengine?hl=ja
○Python 3 Django on App Engine Standard: App Fails to Start
（検索で引っかかった解決策）
https://stackoverflow.com/questions/52416588/python-3-django-on-app-engine-standard-app-fails-to-start
○Python 3 ランタイム環境
（app.yamlの設定について）
https://cloud.google.com/appengine/docs/standard/python3/runtime
pepperはAndroid端末の夢を見るか。

# pepperはAndroid端末の夢を見るか。
…と書いてますがAndroidでpepperを動かすとかいう話ではないです。
そういうのは[ここ](https://qiita.com/ta14-u/items/0b2ccc1c1a1859049eb9)とか[ここ](https://qiita.com/Royl/items/31e7cfefb9746aa0d637)とかを参照してください。
# そういったテック的な話ではなくて
pepperを使ってみて「こんなの胸のタブレットを使えばいいじゃん」と言われた話とか
この胸のタブレット＊＊させるのに邪魔だよねとかそういった軽い話です。
ちなみに胸のタブレットはAndroidです。
# pepper App challengeに参加した時に言われた一言
色んな人が色んなアプリを作成していました。pepperアトリエとかハッカソンとかで…
そんな中、メンターの一人が言いました。
「こんなの胸のタブレットを使えばいいじゃん。ただのサイネージ台じゃないのだからpepperらしいものを作ったほうがいいよ。」と…
更にそれに対応してどこからか聞こえてきました。「タブレットに頼るのは甘え。」
# 確かにそれは一理あるかもしれません。
近年大型液晶サイネージは価格が下がってきましたし、そこにUnityとかで人型３Dモデルを動かせば目立ちます。実際そのようなサイネージコンテンツも増えてきました。
機器や画面をガードするのはpepperのようなリアルロボット（RPAやバーチャル３Dモデルと区別するためあえてそう呼びます）より容易です。
# それでも、pepperを使ってみたい。
何故かpepperにはそう思わせる何かがあります。それは…
## ・人間の実物大より若干小さい絶妙なサイズ感
それでも子供には大きくて脅威に映る年頃もあるようですが、大抵の子供はpepperを好意的に捉えるようです。（所感）
## ・性別不詳の絶妙な声とボディデザイン
そのため逆に性別的役割をつけるときに困ることもありますが。（体感）
## ・頭頂部と両手の甲に触感センサがある
他にもありますが、気軽に使って違和感のないものはこれらかと考えます。（個人の意見です）
## ・気軽に使える・開発できる環境
pepperアトリエはもう何年も運営されています。
そして色々言いたいこともありますがノンプログラミングで動かせるChoregrapheはとても価値があります。
# どんなコンテンツを作ればpepperらしいと思えるのか。
それを考える際に、pepperの制限も考えなくてはいけないでしょう。
## ・人間の腕＝pepperの腕、ではない
よく見てみればわかりますがpepperは関節が人間のそれよりも少ないです。
デザインが良いため一見誤解しがちですが、わかりやすいところは手首が回転軸しかありません。
そのため手を垂直に構えるのは不可能です。
HGではない放映当時の古いガ〇プラを使うと、pepperのアクションを考えるときに役に立ちます。膝から下は縛ってください。
また、胸のタブレットが邪魔をするので拍手や手を合わせることはできません。
## ・pepperはWi-fiでプログラム転送や操作ができるが、電波干渉しやすい
何もpepperだけではありませんが、現代社会ではWi-fiの電波が多くWi-fiルータが家庭用と同じ性能だと接続可能数を超えることがあります。
pepperと操作開発するPCだけでも2台です。スマホやらRaspberryPiやらESP32やらをルータに繋ぐとどんどん増えます。
特に何台も同時に使用するときは気を付けてください。動作が微妙な時は後頭部下のカバーを外してLANケーブルを繋ぎましょう。
## ・pepperも疲れる…ような動きをする
バッテリーは満充電すればそれなりにはもちますが、それよりボディに隠れているサーボモータなどが熱を帯びやすいです。
pepperは賢いので一定以上の温度になると停止するようになっています。その仕草やボイスもまた可愛いのですが実働中はそうも言ってられません。
ポーズをつけているだけでもサーボモータに負荷がかかっているので、それを考えてコンテンツを作成しなくてはいけません。
## ・見た目に反して耳の部分にスピーカ、頭頂部にマイクがある
デザインがいいため人間と同様つい耳の部分に声をかけがちですが、頭頂部に話しかけるほうが会話しやすいです。でも結構異様な光景ですよね…
その代わり、pepperの声はとても周囲に広がります。
# 以上を踏まえて、pepperに適したコンテンツとは…
・　一回１５～２０分程度
・　途中で動作が止まっても致命的な結果にならない
・　腕や視線移動、胴体の動きは必須だが、正確な入力を必要とする際にはタブレットを使用する
・　音声でのユーザからの応答は失敗すること前提で考える　応答はタブレットも併用できるようにすることでコンテンツがスムーズに進む
ただしpepper側からの発声はタブレットに表示してはならない（→タブレット画面にくぎ付けになってしまう）
・　頭頂部を触るのはオペレータや店員などユーザ以外の人物に制限したほうが良い　人気のある子供には頭頂部は手が届かない
# これらを考えると、個人的に考えるpepper活用法は…
子供を中心とした遊び相手コンテンツや、店舗・イベントの客寄せ・声かけなどと考えられます。

…でも、それらに縛られずに限界を超えてみるのも良いかもしれません。苦手な「物をつかむ」は何人もの人が挑戦し一定の結果を得ています。指サックにあたるちょっとした器具は必要ですし軽いものに限られますが…

よいpepper開発を！
ひとつのスクリプトで多数のオブジェクト管理する

オブジェクトごとにスクリプトを生成する方法ではオブジェクト間（スクリプト間）での値のやり取りがとても面倒くさい。
そのため、ひとつのスクリプトで多数のオブジェクトを管理する方法を記載する。
まずいつも通り
- Crate Emptyで空のオブジェクト生成
- Input Field生成
- Button生成
を行う。Create EmptyしたGame Objectは名前をAdminにしておく（何でもよいが分かりやすくするため）。
![singlescript_hierarchy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/7e247b77-04e8-acbf-2324-6f5e941cd039.png)

AdminオブジェクトでAdd ComponentしてNew Scritpを生成する（スクリプト名は今回はAdminScriptとする）。
以下のようにアタッチする。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// これ追加忘れずに
using UnityEngine.UI;
public class AdminScript : MonoBehaviour
{
    // publicにしないとダメ
    public InputField input_field_id;
    // 入力した文字列保存用
    private string input_txt;
    // input fieldでの入力判定
    public void InputID()
    {
        input_txt = this.input_field_id.text;
        print(input_txt);
    }
    // ボタンが押された時の処理
    public void LoginButtonPush()
    {
        if (input_txt == "abc")
        {
            print("正解です。");
        }
        else
        {
            print("不正解です。");
        }
    }
}
```

Adminオブジェクトのスクリプト内のメンバ変数input_filed_idにInputFIledオブジェクトを対応付けする。  
![singlescript_setinputfiled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/07eabb74-fac9-9a57-0367-c19eec46d3de.png)

インプットフィールドのオブジェクトを設定する。
![singlescript_onendedit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/a3211dc2-6a04-23b9-e3e9-214d0e51479e.png)
![singlescript_inputfieldfunctionsetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/7582d674-b297-6d27-a8a9-5f7fafc33ed8.png)

ボタンのオブジェクトを設定する。
![singlescript_onclick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/4fe2a6f3-57e9-8e5c-5fbc-f2aa5b20dc16.png)
![singlescript_buttonfunctionsetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/378f3263-962e-b4fa-cba6-7534893e1117.png)


これで実行してinputFieldにabcを入力してButtonを押すと"正解です。"と出力され、それ以外を入力した場合は"不正解です。"と出力される。
![singlescript_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/d9494d98-3a3f-48f4-0040-acce6ba00499.png)

このように、Adminオブジェクトに対応させたAdminScriptひとつでインプットフィールドとボタンのオブジェクトが操作できるようになる。


# 参考
https://www.sejuku.net/blog/83582