OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Linux2にAWS CLI バージョン2をインストールする方法


##はじめに
AWS CLI バージョン2をインストールする方法について書きます。

AWS Linux2には初めからAWS CLI バージョン1があります。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ aws --version
aws-cli/1.18.107 Python/2.7.18 Linux/4.14.193-149.317.amzn2.x86_64 botocore/1.17.31
```

##手順
以下の2つを行います。
1. AWS CLI バージョン2のインストール
2. AWS CLI バージョン1の削除

##AWS CLI バージョン2のインストール

以下のコマンドでインストールファイルをダウンロードします。
```curl``` コマンドでインストーラをリクエストし、オプション -o "ファイル名"で指定したファイル名にリクエスト結果を書き込みます。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
```

```ls``` コマンドを使用してファイルが作成されたかを確認することできます。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ ls
awscliv2.zip
```

次に作成したzipファイルを、```unzip```コマンドを使用して解凍します。
・・・は表示されるメッセージを省略しています。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ unzip awscliv2.zip
Archive:  awscliv2.zip
   creating: aws/
   creating: aws/dist/
  inflating: aws/README.md
・
・
・
```

解凍後は以下のようにawsディレクトリが作成されます。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ ls
aws  awscliv2.zip
```

~/aws/install がインストールプログラムなので、管理者権限でこれを実行します。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo ./aws/install
You can now run: /usr/local/bin/aws --version
```

または以下のように実行すれば、環境変数の設定は必要ありません。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo ./aws/install -i /usr/local/aws-cli -b /usr/bin
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ aws --version
aws-cli/2.2.25 Python/3.8.8 Linux/4.14.238-182.422.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
```

インストールを確認します。
aws-cli/の後に、2が表示されていればバージョン2がインストールされています。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ /usr/local/bin/aws --version
aws-cli/2.0.52 Python/3.7.3 Linux/4.14.193-149.317.amzn2.x86_64 exe/x86_64.amzn.2
```

##AWS CLI バージョン1の削除
インストール直後は、```/usr/local/bin/aws``` のように絶対パスで指定しなければバージョン2が使用できない状態です。
相対パス```aws```ではバージョン1が呼び出されます。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ aws --version
aws-cli/1.18.107 Python/2.7.18 Linux/4.14.193-149.317.amzn2.x86_64 botocore/1.17.31
```

バージョン1の```aws```コマンドは相対パスで呼び出せるので、環境変数に入っています。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
```

以下のように```~/usr/bin```にバージョン1が入っています。
```ls```コマンドでディレクトリ内のディレクトリ・ファイルを表示し、grep '検索したい文字列' で検索したいディレクトリ・ファイルを表示させることができます。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ ls /usr/bin/ | grep 'aws'
aws
aws_completer
```

これらを```rm```コマンドで削除します。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo rm -f /usr/bin/aws /usr/bin/aws_completer
```

これにより```aws```コマンドは、```/usr/local/bin/aws```を参照するようになります。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ aws --version
aws-cli/2.0.52 Python/3.7.3 Linux/4.14.193-149.317.amzn2.x86_64 exe/x86_64.amzn.2
```

もし、以下のメッセージが表示されるなら、パスが通っていません。

```
-bash: /usr/bin/aws: No such file or directory
```

その場合、以下のように追加します。

```
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ export PATH=$PATH:/usr/local/bin
```

##参考記事
AWS 公式サイト
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html
【技術書まとめ】『Dockerを基本から学ぶ』を読んだまとめ

## 読んだ感想
コンパクトにまとまっていていいと思った。他の書籍で学習してから振り返りに読んでもいいかも。


## 気になったコマンドだけ備忘録

```terminal
docker pull [イメージ名]  # イメージを取得する
docker run -d -p [ホスト側ポート]:[コンテナ側ポート][タグ名]
docker ps -a    # コンテナの状態を見る
docker stop [コンテナID]
```

- データを永続化する

```terminal
docker run -d -has -p 8081:80 -v $(PWD)/htdocs:/usr/local/apache2/htdocs/httpd
```

- コンテナにログインする

```terminal
docker exec -it コンテナID /bin/bash
```

- docker-composeコンテナ起動

```terminal
docker-compose up -d
docker-compose ps -a
```
[Docker+WordPress+MySQL]で画像投稿できるようにする

はい、[はるうさぎ](https://twitter.com/_harusa_p)です。
今回はお仕事でWordPress案件をいただいて、詰まったことがあったのでメモ書きです。
普段からWordPressを触っている人はご存知だと思う内容かと思います。

# 前提
+ dockerでWordPress環境を構築する
+ その環境下でテーマ作成

## 今回詰まったところ
+ dockerでWordPress環境を構築したら、WordPressで画像をアップロードできない
+ そもそもコンテナが立ち上がらない

順番に見ていきます。
まずディレクトリ構造

```ディレクトリ構造
wp-template
├── docker-compose.yml
├── wp-config.php
└── wp-content
    ├── index.php
    ├── languages
    ├── plugins
    ├── themes
    ├── upgrade
    └── uploads
```
最悪、`docker-compose.yml`と`wp-content`フォルダがあれば動きます。
`wp-content`の中身は`docker-compose up`すれば自動的に初期のものが構成されます。
`wp-config.php`はWordPressには必須ファイルです。インストール時に自動生成してくれる？みたいなのですが、私の場合してくれなかったので[公式wp-config.php](https://core.trac.wordpress.org/browser/tags/5.3/wp-config-sample.php)を参考に変更しました。


```docker-compose.yml
version: "3"

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress #任意
      MYSQL_DATABASE: wordpress #任意
      MYSQL_USER: wordpress #任意
      MYSQL_PASSWORD: wordpress #任意

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306 
      WORDPRESS_DB_USER: wordpress #任意
      WORDPRESS_DB_PASSWORD: wordpress #任意
    volumes:
      - ./wp-content:/var/www/html/wp-content
      - ./wp-config.php:/var/www/html/wp-config.php
volumes:
  db_data:
```

DB関連は.envで管理した方が楽だと書きながら思いました。
これで[http://localhost:8000/](http://localhost:8000/)にアクセスするとWordPressの見慣れた画面が出てきます。


ここまでが普通にできること。
### dockerでWordPress環境を構築したら、WordPressで画像をアップロードできない
WordPressで投稿を行う為に画像をアップロードしようと思ったらできない！
調べてみると、`wp-config.php`にある一文を追記しないといけないみたいです。

```wp-config.php
define('DB_NAME', 'wordpress'); #docker-compose.ymlで設定したもの
define('DB_USER', 'wordpress');　#docker-compose.ymlで設定したもの
define('DB_PASSWORD', 'wordpress'); #docker-compose.ymlで設定したもの

define('DB_HOST', 'db');　#docker-compose.ymlで定義したmysqlコンテナ名
define('WP_DEBUG', true);
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
define('UPLOADS', 'wp-content/uploads' ); #これを追記

$table_prefix = 'wp_';

if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');

require_once(ABSPATH . 'wp-settings.php');
```
これが最終形態なコード。
以下を追記する必要があったコード。

```追記分
define('UPLOADS', 'wp-content/uploads' );
```

### そもそもコンテナが立ち上がらない

`sed: cannot rename ./xxxxx Device or resource busy`と表示されてコンテナが立ち上がらない。
調べると以下の記事が出てきた。これで解決。先人の知恵は素晴らしい。
https://qiita.com/suzukihi724/items/e56fa9516639c6c90a33

# おわりに
学生の頃からWordPressを触っていましたが、MAMP環境だったので難しいことはありませんでした。
今回はdockerで環境構築だったので、WordPressの奥深いところを理解できたのではないか、そう思いました。
普段から触っている方には普通の内容だったかと思います。。。
Rails Tutorial　第14章 完了、全部で 155.5時間かかりました。

##2020/9/13 0.5時間
14.1.1完了です。

##2020/9/14 0.5時間
14.1.2.1途中です。

##2020/9/15 0.5時間
14.1.2完了です。

##2020/9/16 0.5時間
14.8途中です。

##2020/9/17 0.5時間
14.1.4完了です。

##2020/9/18 0.5時間
14.1.5完了です。

##2020/9/19 2.0時間
14.2.1完了し、演習 14.2.2.2の途中です。

##2020/9/20 2.0時間
14.2.2完了し、14.27の途中です。

##2020/9/21 2.0時間
14.2.3-4完了し、演習16.2.5.1の途中です。

##2020/9/22 2.0時間
14.2.5-14.3.1完了です。

##2020/9/24 0.5時間
14.44の途中です。
9/23は朝早く出社だったのでできませんでした。夜帰宅した後は疲れていてやる気がでないです。朝にやるのがよいと改めて感じました。

##2020/9/25 0.5時間
演習14.3.2.3の途中です。
INNER JOINは意味は分かりますが、SQL文で書かれているのは初めて見ました。データベースの知識が昔のままなのだからかと思います。

##2020/9/26 2.0時間
14.3完了です。

##2020/9/27 0.5時間
14章を完了です。
所要時間は14.5時間です。

##所要時間まとめ
1	章	22.5	時間
2	章	3.5	時間
3	章	5.5	時間
4	章	7.5	時間
5	章	7	時間
6	章	8	時間
7	章	10	時間
8	章	6	時間
9	章	11.5	時間
10	章	13	時間
11	章	16.5	時間
12	章	11	時間
13	章	19	時間
14	章	14.5	時間
計		155.5	時間 でした。

1章は環境設定で大変時間がかかりました。

##今後
14.4.1に、拡張機能の課題がありましたので、これからやってみたいと思います。
CircleCIを使って自前サーバーに自動デプロイ

# 概要
## 状況
- ウェブサービスが自前サーバー（以下プロダクションサーバー）にデプロイされている
- 毎回デプロイコマンドを手動で叩いている
- 踏み台のsshサーバーがある

## 実現したこと
Githubでmasterブランチが更新されたら，CircleCIを使って自前サーバーのウェブサービスをデプロイする．

## 参考
https://www.wantedly.com/companies/union-tec/post_articles/246114
https://circleci.com/docs/2.0/deployment-examples/index.html#ssh
https://circleci.com/docs/2.0/add-ssh-key/

# 手順
## 1. ssh keyの追加
踏み台サーバーとプロダクションサーバーそれぞれのssh keyを登録しなければならない．
以下の手順はそれぞれのサーバーについて行う．
### 1.1 公開鍵と秘密鍵の作成
公開鍵と秘密鍵を作成する．

```
$ ssh-keygen -m PEM -t rsa -C "コメント"
```
この後保存先を聞かれるが，適当に `id_circleci_rsa` で保存した．
パスフレーズは作らないのでそのままenterを2回押す．

### 1.2 サーバーのauthorized_keysに追加
先ほど作成した公開鍵(`id_circleci_rsa.pub`)と秘密鍵(`id_circleci_rsa`)のうち，公開鍵を登録する．

```
$ cat .ssh/id_circleci_rsa.pub >> .ssh/authorized_keys
```

これをしないとsshした時にパスワードを聞かれる．

### 1.3 CirlcleCIにssh key登録
秘密鍵の方はCircleCIに登録する．
CircleCIのプロジェクトにいき，project settings > ssh keys で`-----BEGIN RSA PRIVATE KEY-----` から始まる秘密鍵を登録する．

```
$ cat .ssh/id_cricleci_rsa | pbcopy # クリップボードにコピー
```

登録するとfingerprintがそれぞれ発行される．

### 1.4 鍵削除
ここまでで踏み台サーバーとプロダクションサーバー上の鍵は必要なくなったので

```
rm .ssh/id_circleci_rsa .ssh/id_circleci_rsa.pub
```

しておく．

## 2. ssh configを作成
`.circleci/circleci_ssh_config`を[この記事](https://www.wantedly.com/companies/union-tec/post_articles/246114)のように作成．

## 3. .circleci/config.ymlの編集
今まで`build`しか書いていなかったので，その下に追記した．

```
jobs:
  build:
    ...

-- ここから先を追記 --
  deploy:
    machine:
      enabled: true
    steps:
      - checkout
      - add_ssh_keys:
          fingerprints:
            - "踏み台サーバーのfingerprint"
            - "プロダクションサーバーのfingerprint"
      - run:
          name: Add ssh config
          command: cat ~/project/.circleci/circleci_ssh_config >> ~/.ssh/config
      - run:
          name: Deploy Over SSH
          command: |
            ssh production "デプロイコマンド(git pull && deploy的な)"
workflows:
  version: 2.1
  build-and-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build # only deploy once build job has completed
          filters:
            branches:
              only: master # only deploy on the master branch
```

## 4. その他
私の環境では3まででデプロイできなかったのでその他の設定を行った．
### 4.1 deploy keyをgithubに登録
githubリポジトリにプロダクションサーバーのdeploy keyを登録する．
プロダクションサーバー上で1.1と同じように`ssh-keygen`で公開鍵と秘密鍵を作り，公開鍵の方をgithubリポジトリのSettings > Deploy keysに登録する．
登録すると，`git pull`や`git clone`をする時にパスワードを聞かれなくなる．

### 4.2 dockerとdocker-composeのシンボリックリンク
`ssh`経由で`docker`や`docker-compose`を叩こうとすると`command not found`になってしまう．
そこで，プロダクションサーバーで以下のようなシンボリックリンクを貼る：

```
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo ln -s /usr/local/bin/docker /usr/bin/docker
```
/usr/local/binではなく/usr/binを見にいってるのかしら...よく分からない．

以上で無事自動デプロイ出来た．
networkXでUnionFind

atcoderで頻出なunionfindを、自前ライブラリ実装ではなく、networkXで実装する方法の紹介です。
networkXについて調べていたら、unionfindを発見したが、networkXのunionfindの日本語記事が見つからなかったので紹介します。

以下のコードは現在のatcoderのpythonのバージョンで実行やACをしたものです。
Python:        3.8.2
NetworkX:      2.4

#テンプレート

```python:networkxuf.py
from networkx.utils import UnionFind
uf = UnionFind(range(1,6))
uf.union(1, 2)  # 1と2をunion
uf.union('atcoder', (3, 'chokudai')) # 'atcoder'と(3,'chokudai')をunion
uf.union(2, 3, 4)
print(uf[2] == uf[(3, 'chokudai')])  # 2と(3,'chokudai')が同じグループか判定(uf[a]はaの根を返す)
# False
print(uf['atcoder'] == uf[(3, 'chokudai')])
# True
print(uf.weights[uf[5]])  # 5が属する集合の大きさを返す
# 1
print(uf.weights[uf[4]])
# 4
for group in uf.to_sets():  # すべてのグループのリストを返す
    print(group)
"""
{1, 2, 3, 4}
{'atcoder', (3, 'chokudai')}
{5}
"""
for item in uf:
    print(item)
"""
1
2
atcoder
(3, 'chokudai')
3
4
5
"""
```

#使い方説明

`from networkx.utils import UnionFind
uf = UnionFind()` 
unionfindをimportしてインスタンスを生成します。よく見る自前実装の方式と違う特徴は、インスタンス生成時に要素数を指定しません。代わりに、要素のリストを渡します。また、要素のリストを渡さなくても、後述のメソッドで要素を参照するときに、要素が無ければ自動で生成されます。

`uf.union(1, 2)
uf.union('atcoder', (3, 'chokudai')) 
uf.union(2, 3, 4)` 
要素を結合するメソッドです。よく見る自前実装と違う特徴は、hashableなら何でも要素に出来ることです。文字列でもタプルでも要素に出来ます。また、3個以上の要素をまとめて結合することも
できます。

`print(uf[2] == uf[(3, 'chokudai')])
print(uf['atcoder'] == uf[(3, 'chokudai')])`
要素が同じグループか判定するメソッドが見つからなかったので、代わりにこう書きます。`uf[x]`がxの根を返すので、根が同じかどうかで判定しています。

`print(uf.weights[uf[5]])
print(uf.weights[uf[4]])`
uf.weights[根]でグループの大きさが取得できます。

`for group in uf.to_sets():
    print(group)
for item in uf:
    print(item)`
`uf.to_sets()`でグループごとにsetになったイテレータを返します。
`uf`で個別の要素のイテレータを返します。

#実践例
######AtCoder Library Practice Contest A Disjoint Set Union　
https://atcoder.jp/contests/practice2/submissions/16927433

######ACL Beginner Contest C Connect Cities(コンテスト本番での使用)
https://atcoder.jp/contests/abl/submissions/17038431

######AtCoder Beginner Contest 177 D Friends
https://atcoder.jp/contests/abc177/submissions/16927545

######エイシング プログラミング コンテスト 2019 C Alternating Path
https://atcoder.jp/contests/aising2019/submissions/17055243
数値以外もunionfindできるのでこうすることもできます。

######AtCoder Beginner Contest 040 D 道路の老朽化対策について(ギリギリ！)
https://atcoder.jp/contests/abc040/submissions/17055355

######CODE FESTIVAL 2016 Final C Interpretation
https://atcoder.jp/contests/cf16-final-open/submissions/17078026
3つ以上をを同時にunionfindできるので、こういうふうに簡潔に書くこともできます

######AtCoder Regular Contest 027　B 大事な数なのでZ回書きまLた。
https://atcoder.jp/contests/arc027/submissions/17078209
文字列もunionfindできるのでこういうふうに実装できます。

#速度は？
networkXなので当然遅いです。
以下が上記実践例と、unionfind自前実装との速度の比較です。

| 問題 | 自前実装 | networkX実装 |
|:-----------:|:------------:|:------------:|
| Disjoint Set Union | 401ms        | 924ms         |
| Connect Cities| 211ms      | 843ms       |
| Friends   | 619ms        | 1374ms         |
| Alternating Path         | 486ms          | 1373ms           |
| 道路の老朽化対策について    | 1158ms     | 1854ms(右の実装を高速化してTLE回避)|

このように、自前実装と比べて2倍と200ms程度遅くなります。しかし、簡易な軽い問題なら、十分間に合います。簡易な問題なら、実行時間だけでなく、実装時間も大事ですので、ライブラリを探してコピペすることなく、手軽に実装できるnetworkXは十分選択肢に挙がるでしょう。

#まとめ
networkXにはまだまだ知らない機能がある。やはりライブラリの豊富さはpythonの強み。（multiset以外...）
知的財産権ー著作権、産業財産権、その他

応用情報技術者平成29年春期 午前78

日本において，産業財産権と総称される四つの権利はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0705dda7-056f-b013-da3e-38dc999c281b.png)


１、産業財産権は、
著作権と並び知的財産権に分類される権利です。

・著作権は創作物が創作された時点で発生するのに対して、
・産業財産権は関係機関に申請をして認められなければ権利として登録されません。


産業財産権には次の4つの権利が含まれ、いずれも申請・登録が必要です。
１）、自然の法則や仕組みを利用した価値ある発明である 特許権(権利期間20年)
２）、物品の形状、構造または組み合わせに係る考案のうち発明以外のものに対して認められる 実用新案権(10年)
３）、製品の価値を高める形状やデザインに対する権利 意匠権(20年)
４）、商品の名称やロゴマークなどを保護する 商標権(10年)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b61226d4-e70b-de45-1b31-b932097ffd47.png)


参照：
https://www.ap-siken.com/kakomon/28_aki/q78.html
故障率曲線（＝バスタブ曲線　bath-tub curve）


応用情報技術者平成29年春期 午前75

故障率曲線において，図中のAの期間に実施すべきことはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2e5ae856-146d-7fa6-92ca-0d8c21dea002.png)

１、故障率曲線は、
ハードウェア機器の故障回数を縦軸に、運用開始からの経過時間を横軸にして、その関係を表したものです。一般的にハードウェア機器のライフサイクルは、故障率によって3つの期間に分けることができます。

・初期故障期間
　設計や製造の不備や使用環境との相性によって故障率が高くなる期間

・偶発故障期間
　初期の不具合が落ち着いて安定した稼働が長く続き、偶発的な故障だけが発生する期間

・摩耗故障期間
　材料や部品の劣化によって故障回数が多くなる期間

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2149c393-37b0-445f-579d-b2504add5b99.png)


参照：
https://www.ap-siken.com/kakomon/28_aki/q75.html
【JavaScript】人生いろいろ 配列操作もいろいろ ～初級編～

**こんにちは、どいこです。**

タイトル、島倉千代子を意識しましたが語呂が悪い。
（♪人生いろいろ　男もいろいろ～）

今回はJavaScriptの配列操作のメソッドと
それを使った関数の例を取り上げていきます。

<font color="gray">※「処理の流れ」はイメージしやすさを考慮して書いたため
　 厳密にいうと実際の処理順とは異なる場合があります。</font>

#findIndex()
>findIndex() メソッドは、配列内の指定されたテスト関数を満たす最初の要素の位置を返します。
>テスト関数を満たす要素がない場合を含め、それ以外の場合は -1 を返します。
>[Array.prototype.findIndex() -MDN web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)

##関数例
配列`array`の中から指定した文字`char`を部分文字列として持つ
最初の要素のインデックスを返す
ただし、配列の中に該当する要素が見つからなかった場合は-1を返す

```JavaScript
function findIndexOfIncludeChar(array, char) {
  const result = array.findIndex(item => {
      return item.includes(char)
    })
  return result
}
```

###処理の流れ
①　`findIndex()`で配列の要素を頭から順番にチェック
②　[`includes()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)で要素をチェック ⇒ `char`（該当の文字）が含まれる場合はtrueが返される
③　trueの場合は該当する要素のインデックスを返し処理を終了
　　含まれる要素が見つからなかった場合は-1が返される

#filter()
>filter() メソッドは、与えられた関数によって実装されたテストに合格したすべての配列からなる
>新しい配列を生成します。
>[Array.prototype.filter() -MDN web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)

##関数例
与えられた配列`array`の要素から
偶数のみを取り出して新しい配列を返す
偶数値がなかった場合は空の配列を返す

```JavaScript
function filterEvenNumber(array) {
  const evenValue = 2
  const result = array.filter(value => {
    return value % evenValue === 0
  })
  return result
}
```

###処理の流れ
①　`filter()`で配列の要素を順番にチェック
②　偶数（2で割り切れる値）だった場合はtrueとなり新しい配列に追加される
　　奇数だった場合はfalseとなりスキップされる
③　チェックが終わったら新しい配列を返す

#map()
>map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し
>その結果からなる新しい配列を生成します。
>[Array.prototype.map() -MDN web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

##関数例
配列`array`の各要素の値を2倍した新しい配列を返す

```JavaScript
function multiplyDouble(array) {
  const doubleValue = 2
  const result = array.map(value => {
    return value * doubleValue
  })
  return result
}
```

###処理の流れ
①　`map()`で配列の要素に対して順番に処理を行う（値に2をかける）
②　処理を行うごとに処理後の値が新しい配列に追加される
③　処理が終わったら新しい配列を返す<br>


#あとがき
よく使うであろう配列操作のメソッドを取り上げてみました。
次回は中級編と題して、少し難易度が上がるものを紹介する予定です。

記事を読んでいただいて、「こう書いた方がわかりやすいのでは？」などアドバイスありましたら
お気軽に頂けると幸いです。
（言い方は優しくしてくれると喜びまする :blush:）

お読みいただき、ありがとうございました◎
ディジタルサイネージ(Digital Signage，電子看板)


応用情報技術者平成29年春期 午前73

ディジタルサイネージの説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7f197904-8655-1b68-1703-1b4f3ab0c908.png)


１、ディジタルサイネージ(Digital Signage，電子看板)は、
ディジタル技術を活用して平面ディスプレイやプロジェクタなどに映像や情報を表示する広告媒体のことです。広告入替えの手間が掛からず、表示内容がリアルタイムで操作可能であったり、動画を表示することができるなど従来のポスターやロールスクリーン看板にはないメリットがあります。

※Signage　標識のこと。特に商業上の、看板・ポスターなどを指すことが多い。電子化された看板・ポスターを「デジタルサイネージ」という。


２、
・情報技術を利用する機会又は能力によって，地域間又は個人間に生じる経済的又は社会的な格差
　⇒×。ディジタルディバイド，情報格差の説明です。
　※ディバイド　divide　分ける, 分割する

・情報の正当性を保証するために使用される電子的な署名
　⇒×。ディジタル署名の説明です。

・ディスプレイに映像，文字などの情報を表示する電子看板
　⇒○。ディジタルサイネージの説明です。

・不正利用を防止するためにデータに識別情報を埋め込む技術
　⇒×。電子透かしの説明です。
　※透かし（すかし、英語: Watermark）とは、当てた光によって紙の上により明るく（暗い背景の上で反射した光ではより暗く）現れる区別することのできる画像や模様である。


参照：
https://www.ap-siken.com/kakomon/28_aki/q73.html
「Wi-Fi 6」ってなに？

「Wi-Fi 6」とは**デバイスがIEEE 802.11axをサポートしていることの表記**です。

言ってしまえばそれで終わりなんですが、加えて

- 「Wi-Fi 1」や「Wi-Fi 2」 なんてあったっけ？
- なんでそう呼ぶようになったの？
- 「Wi-Fi 6（`IEEE 802.11ax`）」って何が良いの？

このような疑問が沸いたので、それについても調べてみました。

## 「Wi-Fi {n}」という呼び方

今まで「Wi-Fi 1」や「Wi-Fi 2」といった呼称は聞いたことないと思います。
それもそのはず、**今回初めてそう呼ぶようになった**からです。

今回の「Wi-Fi 6」登場に伴い、過去の規格にも以下のようなナンバリングがされました。

| 規格名 | 呼称 |
| --- | --- |
| IEEE 802.11n | Wi-Fi 4 |
| IEEE 802.11ac | Wi-Fi 5 |
| IEEE 802.11ax | Wi-Fi 6 |

表の通り、**さかのぼってのナンバリングは４まで**となっているため、「Wi-Fi 1」などは事実上存在しないことになります。

## なぜこのような呼び方が生まれたのか

それは**IEEE 802.11xxのような呼び方が一般の消費者にわかりにくいから**です。
（自分も正直覚えにくかったです）

そもそも「`IEEE 802.11ax`」という表示は技術規格である為、わかりやすさは特に考えられているわけではありません。

２つの呼称についてまとめると以下のようになります。

| 呼称 | 目的 | 管理する組織 |
| --- | --- | --- |
| IEEE 802.11{xx} | 技術の規格名称 | IEEE（米国電子学会） |
| Wi-Fi {n} | 利用環境のわかりやすい理解 | Wi-Fi Alliance |

ざっくり言うと、**IEEEが規格で、Wi-Fi {n}が愛称**です。

新呼称は、Wi-Fiの普及を図る組織である「Wi-Fi Alliance」いわく業界の支持も厚く、広く普及することが見込まれているようです。

## 技術面

`IEEE 802.11ax`には、主に以下のような特徴があります。

- 高速
- 混雑に強い
- 省エネルギー

つまり、**呼称だけでなく技術面でも大きいアップデートがある**ということです。

### 高速で混雑に強い

最大通信速度の理論値はIEEE 802.11axが`9.6Gbps`、前規格11acが`6.93Gbps`です。
つまり速度は**最大値ベースで1.5倍**になっています。

これだけだと、「あれ？そんなに早くなっていないのでは？」と思う方もいるかもしれません。

11axの真価は「混雑時の実効スループット[^1]の向上」で、あるケースでは**前規格と比較して約４倍**にもなったとのことです。（参考リンクの総務省資料に記載）

それを実現しているのが「`OFDMA`」です。

#### OFDMAとは？

「直交周波数分割多元接続」という、通信帯域を分割して管理する技術のことです。
**多くの機器が同時につながっていても通信の順番待ちが発生しない**ため、速度遅延を防ぐことができます。

### 省エネルギーを実現する「TWT」

「TWT（Target Wake Time）」とは、**通信の必要がない時に、デバイスの通信機能をスリープさせて消費電力を抑える技術**です。

つまり、「Wi-Fi 6」に対応しているデバイスはWi-Fi接続時のバッテリーの持ちが良いということです。
もちろん、親機とデバイスの両方が「Wi-Fi 6」に対応していることが条件です。

## 対応しているデバイス

「第２世代iPhoneSE」や「iPhone11/Pro」などは既に対応しており、このマークが目印です。
![Wi-Fi 6 Certified](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185436/f850b506-d80f-a3e1-723d-a4bdfdfda89e.png)

## まとめ

- 「Wi-Fi {n}」はわかりやすくするための呼称
- 今後は新しい呼称が一般的になる
- 「Wi-Fi 6」は高速で混雑に強く、省エネルギー

## あとがき

去年の今頃すでに話題になっていたようですが、自分はiPad Airを見ててようやく気がつきました🙈
同じように知らない方の参考になれば幸いです。

---

**参考リンク**
https://www.wi-fi.org/ja/news-events/newsroom/wi-fi-alliance-wi-fi-6
https://www.soumu.go.jp/main_content/000566719.pdf
https://www.ni.com/ja-jp/innovations/white-papers/16/introduction-to-802-11ax-high-efficiency-wireless.html
https://www.allion.co.jp/wi-fi-6-new-tech/
https://www.elecom.co.jp/pickup/contents/00024/
https://www.buffalo.jp/contents/topics/knowledge/wi-fi6/

[^1]: 実効スループット...「実際に通信をしたときの処理量」のことで、理論値よりも実利用に近い値
Webブラウザでシリアル通信を行う(ブラウザ非依存)

他の投稿はこちら

* [Webアプリの限界を超える方法](https://qiita.com/tekka/items/1bf440ccd50bb4171886)
* [Webアプリの限界を超える方法(セキュリティ編)](https://qiita.com/tekka/items/d9f6fd2e30c1f778b5aa)
* [ブラウザで(WebUSBもActiveXも使わずに)FeliCaリーダーを読み込む](https://qiita.com/tekka/items/537115a3d6444b9a8848)
* [ブラウザでブラウザを操作してスクレイピングを行う](https://qiita.com/tekka/items/e6e1c51fd24fa3fd2c32)


シリアル通信を行うアプリを開発する場合、通常はネイティブアプリを選択すると思います。
今回は、Webブラウザでシリアル通信を行い、LEDを点灯させてみたいと思います。
（いわゆるLチカです）

# 概要

構成は以下の通りです。

![Lチカ_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/9a5ef014-21d9-ab4a-97a4-59150ad5879c.png)

* シリアル通信を行うネイティブアプリを作成する
* LEDとプログラムを組み込んだArduinoを用意する
* ネイティブアプリ上でWebSocketサーバーを立ち上げる
* ブラウザからネイティブアプリのWebSocketサーバーにローカルホスト接続する
* ネイティブアプリからArduinoにシリアル通信接続する
* ArduinoからLEDを点灯させる

# デモ
![VID_20200916_231755_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16162/b5cd2628-5937-8673-de07-e31decee04bd.gif)

上記デモはFirefoxで動作しています。
通常、Webブラウザでシリアル通信というと、NodeJSや、ActiveXを使用する事が多いと思います。
また、Chromeではシリアル通信APIが実装されているようです。

今回ご紹介した実装方法なら、特定のブラウザに依存せず、シリアル通信を実装できます。

# まとめ

さて、今回はブラウザでLチカを行いました。
WebアプリでLチカが出来るという事は、Webアプリで機械制御が可能という事です。

機械制御を伴うアプリは、機械への命令の送信といった、低レイヤーのアクセスを必要とするため、通常はネイティブアプリとして実装します。

しかし、今回ご紹介した実装方法なら、低レイヤー層をネイティブアプリで実装し
データ分析やフロー制御など高レイヤー層をWebアプリに切り出すことが可能です。
このように、開発保守の比重をWebアプリに寄せることが出来るので、メンテナンスコストの低減が期待できます。
anyenv and Node.js 設定

TypeScript で React 開発を行うための環境構築。
Node.js を anyenv で選択可能にする。

## 環境設定

### Homebrew update(2020/09/21 Mon)

```
$ brew --version
Homebrew 2.4.3
Homebrew/homebrew-core (git revision c0f2a; last commit 2020-07-06)

# To update homebrew itself
$ brew update

$ brew --version
Homebrew 2.5.1
Homebrew/homebrew-core (git revision a0a0f; last commit 2020-09-21)
```

### anyenv install 

```
# install anyenv
$ brew intall anyenv

# すでにインストールされていたため、upgrade
$ brew upgrade anyenv

$ anyenv --version
anyenv 1.1.2

$ anyenv version
nodenv: 12.14.1 (set by /Users/kazuhiro/.anyenv/envs/nodenv/version)

# 環境変数の設定
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile

# bash 起動(~/.bash_profile の読み込み)
$ exec $SHELL -l

$ anyenv install nodenv
$ exec $SHELL -l
```


### anyenv plugin install

- anyenv-update
- nodenv-default-packages

```
# install anyenv-update
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

# install nodenv-default-pakages
$ mkdir -p "$(nodenv root)"/plugins
$ git clone https://github.com/nodenv/nodenv-default-packages.git "$(nodenv root)/plugins/nodenv-default-packages"

# set default pacakges
$ cat << EOF > $(nodenv root)/default-packages
yarn
typescript
ts-node
typesync
EOF
```

### Node.js intall

```
$ nodenv install -l
$ nodenv install 14.4.0
$ nodenv global 14.4.0
$ nodenv versions
  12.14.1
* 14.4.0 (set by /Users/kazuhiro/.anyenv/envs/nodenv/version)
$ node --version
v14.4.0
```

### package update

```
# 以下のコマンドですべて更新される
$ anyenv update
```

## 資料

- [anyenv-update](https://github.com/znz/anyenv-update)
技術経営の成功を阻む障壁ー魔の川、死の谷、ダーウィンの海

応用情報技術者平成29年春期 午前70

技術経営における課題のうち，"死の谷"を説明したものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e8f8f707-b7e0-7efa-88fe-b4c4a1fd72dd.png)


１、研究開発から事業化までの各段階における障壁を表す言葉として：
・魔の川
　基礎研究から実用化・製品化にむけた応用研究の間に存在する障壁

・死の谷
　技術経営の成功を阻む障壁を表す言葉で、研究開発の成果が製品化が結び付かない状況を表します。
　研究成果が製品化されるまでには多額の資金が必要となります。技術開発においては新技術を開発してもスポンサーがつかず製品化・事業化を断念してしまったり、開発コストがかさみ資金不足に陥ってしまうことが多々あります。この研究成果と製品化の間に横たわり超えることを阻む障壁を「死の谷」と表現しています。

　※スポンサー：出資者

・ダーウィンの海
　事業化されてから、産業として成立するまでに乗り越えなくてはならない弱肉強食の市場の障壁

　※ダーウィン　达尔文(公元1809-1882) (英) Charles Robert Darwin

     基礎研究　=======⇒　製品化　=======⇒　事業化
      　　　　魔の川　　　        死の谷　　      ダーウィンの海

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/30b9ba6b-c7a5-1f6f-5008-9601dff98bbb.png)


２、
・コモディティ化が進んでいる分野で製品を開発しても，他社との差別化ができず，価値利益化ができない。
　⇒×。魔の川の説明です。


・製品が市場に浸透していく過程において，実用性を重んじる顧客が受け入れず，より大きな市場を形成できない。
　⇒×。ダーウィンの海の説明です。


・先進的な製品開発に成功しても，事業化するためには更なる困難が立ちはだかっている。
　⇒○。死の谷の説明です。

　　　※たち はだか・る ［5］［0］【立ちはだかる】
　　　　①（人の進路をさえぎるように）手足を広げて立つ。 「暴漢の前に－・る」
　　　　②障害となるものが前方に存在する。 「前途に－・る難問」 「行く手に－・る壁」


・プロジェクトのマネジメントが適切に行われないために，研究開発の現場に過大な負担を強いて，プロジェクトのメンバが過酷な状態になり，失敗に向かってしまう。
　⇒×。死の行進(デスマーチ　death march)の説明です。


参照：
https://www.ap-siken.com/kakomon/28_aki/q70.html
Linuxを初めてみよう

Linuxはどこでも使える技術だし、エンジニアの基礎力上がるって聞いて、Linux初めてみました。
はじめた流れ、最初にやったこと紹介します。
何からしたらいいか分からない人の参考になればいいなと思います。

##仮想マシンにLinuxを入れてみた
以下の記事を参考に、仮想マシンにLinuxを入れてみました。
https://qiita.com/miyase256/items/b44a89eb636d16de010c
VirtualBoxにUbuntuで行っています。

やり直せるので、仮想マシンやLinuxディストリビューションの種類選びに時間かけなくて大丈夫です。
（僕はかけてしまったのですが、結局よくわからずこの記事参考にしました）
この記事だけでLinux扱う準備ができます。
(isoのダウンロードはリンククリックしてoption2 -> option3 って進むとダウンロードあります)

インストールバトルのところは出てくる項目とか順番とかが記事と違って、適当にやってしまったところもあります。
仮想マシンなので、Windows本体へ影響ないですし、失敗したらやり直せるので気楽にやるといいと思います。

仮想マシンは、ザックリ言うと
他の普通のアプリみたいに起動して使えて、起動したらそこでLinuxとか使えます。
作った仮想環境の削除もできるみたいなので
とにかく一回いろいろ触ってみるつもりで、初めは進めていきましょう！！

環境構築できたら、次にこんなことしてみました。
####ファイルサーバー構築してみた
https://qiita.com/toki_k/items/f805421f809c67d0c92b

####Webサーバー構築してみた
https://qiita.com/toki_k/items/19ec98080ae6081e4fa8
React NativeでのModalの作り方

# はじめに
現在、React Nativeでアプリを開発しており、いい感じのModal(ボタンを押したら下から画面が出てくるやつ)を作ろうとしたのですが、悪戦苦闘したため、記事に残し備忘録の１つとして残します。

#作り方
まずはModal画面に遷移するボタンを作成しましょう。ちなみに、今回はuseStateを使用します。

```react:App.js

export default function App() {
  const [modalOpen, setModalOpen] = useState(false);

  return (
    <View>
      <View>
        <Text style={{ fontSize: 24 }}>Lists</Text>

        <TouchableHighlight
          style={styles.openButton}
          onPress={() => {
            setModalOpen(true);
          }}
        >
          <Text>Add</Text>
        </TouchableHighlight>
      </View>
  );
}

// スタイル

const styles = StyleSheet.create({
  openButton: {
    backgroundColor: "#F194FF",
    borderRadius: 20,
    padding: 10,
    paddingLeft: 20,
    paddingRight: 20,
    elevation: 2,
  },
});

```
Buttonタグでもいいのですが、ボタンらしいスタイルにしたいので今回はTouchableHighlightを使用しました。以下のスタイルのようになります。
![スクリーンショット 2020-09-27 9.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669290/61beaafb-7bd6-8d96-8d59-b064c742cefb.png)
### Modalを追加

```react:App.js
return (
    <View>

{/* 投稿画面 */}
      <Modal visible={modalOpen} animationType="slide">
        <View style={StyleSheet.modelContent}>
          <Text
            style={{
              fontSize: 30,
              paddingTop: 50,
              marginLeft: "auto",
              marginRight: "auto",
              marginTop: "auto",
              marginBottom: 70,
            }}
          >
            Modal画面
          </Text>
        </View>
      </Modal>

    <View> ~ </View>

    </View>
);
```
先ほどのコードの上にModalを追加すれば、完成です。Modal画面とボタンがある画面は別のファイルにコード記載した方が良さそうですね。今回は説明のためにあえて一緒に記述させました。以下がModal画面です。![スクリーンショット 2020-09-27 5.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669290/ea6979e1-fd7d-1411-6051-e48984a4e849.png)
これが下から出てきます。
#あとがき
本当はMaterial Iconを押した時に、Modalが出てくるようにしたいのですが、調べてもよくわからなかったので、自作でボタンを作成して実装しました。分かる方がいましたら、教えて欲しいです。



#参考
 [React Native - Modal](https://reactnative.dev/docs/modal)
RFM分析　R(Recency最終購買日)、F(Frequency購買頻度)、M(Monetary 累計購買金額)

応用情報技術者平成29年春期 午前69

RFM分析において，特にR(Recency)とF(Frequency) をそれぞれ三つに分類した。表の各セルに対する考察のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/88ee8211-9c84-7f17-a23d-06817b84d3dc.png)


１、RFM分析は、顧客の購買行動のうち、Recency(最終購買日)、Frequency(購買頻度)、Monetary(累計購買金額)
という3点に注目して顧客分析を行う手法です。顧客1人に対してそれぞれの要素を5～7段階でランク付けし、企業にとって価値の高い顧客層と見込みが無い顧客層というように顧客の性質ごとにグルーピングを行うことで、各グループに応じたマーケティング活動を展開することが可能になります。

２、
・AA
　以前から頻繁に購買がある優良顧客のグループであると判断できます。
　ワントゥワンマーケティングなどの手法を用いて関係をより良好にする戦略が有効となります。

・AC
　短い周期で購売行動があり、今後優良顧客になる可能性を秘めているので、
　マーケティング費用をかけて自社への取り込みを行うことが重要です。

・CA
　累計購買回数が多いにもかかわらず、最近の購買が無いので離反の可能性が考えられます。
　離反しているおそれがあるので，離反していないかの調査が重要である。

・CC
　最新購買日と累計販売回数が共に低ランクなので見込みが少ないグループと判断できます。
　マーケティングに対する効果が低いので費用の削減を検討すべきです。

参照：
https://www.ap-siken.com/kakomon/28_aki/q69.html
Flutterにおけるルーティングの定義方法

Flutterにおける、ルーティングを定義する方法を備忘録として残しておこうと思います。
また、Flutterにてルーティングを定義・管理するのは、比較的に明示的でわかりやすいと思っております。

## `MaterialApp`の引数である`routes`にルーティングを定義する
```main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      initialRoute: '/',
      routes: <String, WidgetBuilder>{
        '/': (BuildContext context) => MyApp(),
      },
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(

      ...

      )
    )
  }
}
```

上記コードでは、`'/'`にコード下側に記述しているWidgetの`MyAppクラス`を指定しております。

ちなみに、`MaterialApp`の引数である`initialRoute`で指定した値は、
アプリを開いた際に初期表示する画面を設定できます。


## 新たにページを作成し、ルーティングを定義する場合
下記では、`pages/about_page.dart`ファイルを新規作成して、
ルーティングには、`'/about'`を指定して`AboutPageクラス`を登録しております。

```pages/about_page.dart
import 'package:flutter/material.dart';

class AboutPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(

      ...

      )
    )
  }
}
```

```main.dart
import 'package:flutter/material.dart';
import 'package:sample/pages/about_page.dart';

void main() {
  runApp(
    MaterialApp(
      initialRoute: '/',
      routes: <String, WidgetBuilder>{
        '/': (BuildContext context) => MyApp(),
        '/about': (BuildContext context) => AboutPage(),
      },
    ),
  );
}

...
```

新規でページを作成してルーティングを定義したい場合は、
`main.dart`ファイルにて、新規作成したファイルをインポートし、
ルーティングを定義している箇所に、同じように追記していくだけになります。
アンゾフの成長マトリクス

応用情報技術者平成29年春期 午前68


アンゾフが提唱する成長マトリクスを説明したものはどれか


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5436753a-bbee-2575-3d98-dc01dcb175e6.png)


１、アンゾフの成長マトリクスは、
経営学者のH・イゴール・アンゾフ（H. Igor Ansoff）が提唱したもので、
縦軸に「市場」、横軸に「製品」をとり、
それぞれに「既存」「新規」の2区分を設け、
4象限(市場浸透，製品開発，市場開拓，多角化)のマトリクスとしたものです。

事業が成長・発展できる経営戦略を検討するために適したフレームワークです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/83f8f7cc-b250-9178-8565-4a339ee9f72b.png)


２、
・自社の強みと弱み，市場における機会と脅威を，分類ごとに列挙して，事業戦略における企業の環境分析を行う。
　⇒×。SWOT分析の説明です。

・製品と市場の視点から，事業拡大の方向性を市場浸透・製品開発・市場開拓・多角化に分けて，戦略を検討する。
　⇒○。アンゾフの成長マトリクスの説明です。

・製品の市場占有率と市場成長率から，企業がそれぞれの事業に対する経営資源の最適配分を意思決定する。
　⇒×。プロダクトポートフォリオマネジメントの説明です。

・製品の導入期・成長期・成熟期・衰退期の各段階に応じて，製品の改良，新品種の追加，製品廃棄などを計画する。
　⇒×。プロダクトライフサイクルの説明です。

参照：
https://www.ap-siken.com/kakomon/28_aki/q68.html
ユーザ企業がベンダと締結する契約の形態

応用情報技術者平成29年春期 午前66

"情報システム・モデル取引・契約書"によれば，要件定義工程を実施する際に，ユーザ企業がベンダと締結する契約の形態について適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b21caf34-d27e-62a3-0f26-2d6ceb86a1c2.png)


１、
・請負では
　ベンダは仕事（受託業務）の完成の義務を負うのに対し、

・準委任では
　ベンダは善良な管理者の注意をもって委任事務を処理する義務を負うものの、仕事の完成についての義務は負いません。

・請負契約は、
　受託した業務・成果物の完成を目的とする契約なので、成果物が具体的に特定できる状態にだけ適用すべきです。

・システム化計画や要件定義のフェーズは、ユーザ側の業務要件が具体的に確定しておらず、準委任が適切となります。


参照：
https://www.ap-siken.com/kakomon/28_aki/q66.html
使用済PCの回収・再資源化

応用情報技術者平成29年春期 午前64

リサイクル法に基づく規制に準拠した使用済PCの回収・再資源化に関する記述のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d2897d9d-0446-255c-3297-97646881e337.png)

１、法律
日本におけるリサイクル法は対象によって幾つかの法律に分かれています。

このうちPCの再資源化を規定しているのが資源有効利用促進法(正式名称：資源の有効な利用の促進に関する法律)です。平成13年の改正により業務用だけでなく家庭用PCの再資源化が義務化されたため俗にパソコンリサイクル法とも呼ばれます。

この法律によって、使用済みPC等が廃棄される際には、メーカの責任において回収・再資源化を行うことが義務付けられています。企業や法人から排出される事業用パソコンについては平成13年4月以降、個人や家庭から排出される家庭用パソコンについては平成15年10月以降に廃棄されるものがリサイクルの対象です。

ポイントは：
１）、回収・再資源化の対象は、ディスプレイ、デスクトップPC、ノートブックPC本体
２）、PCリサイクルマーク付いたパソコンは、メーカが無償で回収・リサイクル
３）、回収メーカがない（倒産したなど）パソコン（ディスプレイ含む）は、一般社団法人 パソコン3R推進協会が有償で回収
４）、回収対象外はない　（と思います）

２、
・回収・再資源化の対象は，ディスプレイ以外のデスクトップPC，及びノートブックPC本体である。
　⇒×。パソコンリサイクルの対象は、
　　・デスクトップ本体、
　　・ディスプレイ、
　　・ノートパソコンの3種です。
　ディスプレイやディスプレイ一体型デスクトップも含まれます。


・家庭から廃棄される際に，PCリサイクルマーク付きのPCは，メーカや輸入販売業者の責任で回収・再資源化する。
　⇒○。「PCリサイクルマーク」の付いたパソコンは、メーカが無償で回収・リサイクルを行うため、廃棄する際に新たな料金を負担することはありません。


・家庭から廃棄される自作PC又は倒産したメーカ若しくは輸入販売業者のPCは，回収・再資源化の対象外である。
　⇒×。回収を行うメーカ等がないパソコン(含むディスプレイ)は、一般社団法人 パソコン3R推進協会が有償で回収します。

・企業から廃棄されるPCは，メーカによる回収・再資源化の対象外であり，企業によって産業廃棄物として処理される必要がある。
　⇒×。家庭用パソコンだけでなく業務用パソコンも対象です。

参考:
資源有効活用促進法
https://www.meti.go.jp/policy/recycle/main/data/pamphlet/pdf/3r.pdf


https://www.ap-siken.com/kakomon/28_aki/q64.html
BI(Business Intelligence)の活用事例

応用情報技術者平成29年春期 午前63

BI(Business Intelligence)の活用事例として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/937fe936-12a9-d49d-fb2b-024c5b815913.png)


１、BI(Business Intelligence)は、
組織の業務システムに蓄積された膨大なデータを分析・加工し、経営や業務に役立つ情報を見つけ出す手法・技術の総称です。データウェアハウスやデータマートに集積された情報を、BIツールが備えるOLAP(Online Analytical Processing)やデータマイニングの機能を用いて分析することで迅速な意思決定を支援します。

２、
・電子化された学習教材を社員がネットワーク経由で利用することを可能にし，学習・成績管理を行う。
⇒LMS(Learning Management System，学習マネジメントシステム)の活用事例です。

・りん議や決裁など，日常の定型的業務を電子化することによって，手続を確実に行い，処理を迅速化する。
⇒ワークフローシステムの活用事例です。


参照：
https://www.ap-siken.com/kakomon/28_aki/q63.html
Visionで画像の位置合わせ

#パノラマ画像や手ブレ補正に使えます

<img width="256" alt="IMG_1399.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/11a61fb5-dd1f-c496-93b9-8298823fef1d.jpeg"> 　![IMG_1400.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e5a20718-be27-65ce-5fb7-6df3e1ff5c31.jpeg)
<img width="512" alt="名称未設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/05b9cde5-2995-d34b-7bf1-5129e1dd825c.png">

#手順

2枚目の画像で登録リクエストを作成します。

```swift
let request = VNTranslationalImageRegistrationRequest(targetedCIImage: image2, options: [:])
```

1枚目の画像で実行します。

```swift
let handler = VNImageRequestHandler(ciImage: image1, options: [:])
do {
    try handler.perform([request])
} catch let error {
    print(error)
}
```

結果は２枚目の画像を１枚目の画像に位置合わせするためのCGAffineTransformで返されます。

```swift
guard let observation = request.results?.first as? VNImageTranslationAlignmentObservation else { return }
let alignmentTransform = observation.alignmentTransform
print(alignmentTransform)
// CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: -777.0, ty: 74.0)
```

結果を元に、２枚の画像を合成します。

```swift
image2 = image2.transformed(by: alignmentTransform)
let compositedImage = image1.applyingFilter("CIAdditionCompositing",　parameters: ["inputBackgroundImage": image2])
```

#注意点
・何回か試してみたところ、画像内の顕著なオブジェクトを基準に合わせる傾向がある気がします。
・カメラで撮った画像の向きに注意しましょう。９０度回転していたりします。
・水平移動には強いですが、カメラが回転すると、結果が変にずれやすいです。
上記のせいで不安定な挙動をすることがあります。

🐣
***
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
SOA(Service Oriented Architecture，サービス指向アーキテクチャ)

応用情報技術者平成29年春期 午前61

SOAの説明はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2f1e9387-f826-9ee4-d285-3a12cfde1276.png)


１、SOA(Service Oriented Architecture，サービス指向アーキテクチャ)は、
業務上の一処理に相当するソフトウェアで実現されている機能や部品を独立したサービスとし、それらを組み合わせ連携させることで言語やプラットフォームに依存せずにシステムを構築するという手法、またはそのことを指す用語です。

SOAでは、
　・機能単位の組み合わせでシステムを構築するので、
　・ソフトウェアコンポーネントの再利用や機能の入替え、
　・システムの再構築がしやすい
という特徴があります。

SOAを実現する手段として、
　・Webサービスや
　・ESB(Enterprise service bus)、
　・CORBAを用いた分散オブジェクトシステム
などが使われます。


※ESBとは、Enterprise Service Busの略。
システム構成の一種であるサービス指向アーキテクチャ（SOA）によって企業のアプリケーションを統合する技術、またはそのミドルウェアの総称。SOAに基づいたアプリケーションの統合をバスによって設計するアーキテクチャ・統合技術、またはその基盤となるソフトウェア製品のことをいう。

ESBは、標準仕様に基づいているため既存システムを素早く安価に利用でき、要求仕様が変わっても容易に対応できる柔軟性がある。また、拡張性が高く企業内の一部門から全体に適用できること、中核となるサーバーなどが不要でシステムを稼働したまま機器を追加できること、システム構成要素を機能単位に分割し、必要に応じて協調動作するよう分散配置できることなど、多くのメリットがある。


２、
・会計，人事，製造，購買，在庫管理，販売などの企業の業務プロセスを一元管理することによって，業務の効率化や経営資源の全体最適を図る手法
⇒×。ERP(Enterprise Resource Planning)の説明です。


・企業の業務プロセス，システム化要求などのニーズと，ソフトウェアパッケージの機能性がどれだけ適合し，どれだけかい離しているかを分析する手法
⇒×。フィット＆ギャップ分析の説明です。

　　・フィット＆ギャップ分析とは
フィット（fit）は「適合」、ギャップ（gap）は「かい離」の意味。導入するシステムと業務プロセスにおいて、必要とする機能がマッチしているかを分析する作業を指す。システムが業務プロセスに提供する機能の過不足を確認し、完成度の高いシステムを開発する狙いがある。

　　　フィット＆ギャップ分析では、ERP（統合業務パッケージソフトウェア）などを導入する場合の意思決定や、導入するプロジェクトの業務プロセスの変更、パッケージが規定する標準業務プロセスとユーザーの業務プロセスの照合、情報システムのカスタマイズなどを検討する。


・業務プロセスの問題点を洗い出して，目標設定，実行，チェック，修正行動のマネジメントサイクルを適用し，継続的な改善を図る手法
⇒×。PDCAサイクルの説明です。


・利用者の視点から各業務システムの機能を幾つかの独立した部品に分けることによって，業務プロセスとの対応付けや他のソフトウェアとの連携を容易にする手法
⇒○。SOAの説明です。


参照：
https://www.ap-siken.com/kakomon/28_aki/q61.html

フィット＆ギャップ分析
https://qiita.com/lymansouka2017/items/bc4af66ff0c207e63b6f

ESB
https://www.otsuka-shokai.co.jp/words/esb.html
【初心者向け】標本分散(Sample Dispersion)と不偏分散(Unbiased Dispersion)

それにつけても、何故**標本分散**（<font color=blue>Sample Dispersion</font>）<font color=green>sum((x-mean(x)^2))/length(x)</font>の分母は<font color=green>length(x)</font>で、**不偏分散**（<font color=blue>Unbiased Dispersion</font>）<font color=green>sum((x-mean(x)^2))/(length(x)-1)</font>の分母は<font color=green>(length(x)-1)</font>なのでしょうか？ こういう疑問に突き当たった時は実際にシミュレーションしてみるに限ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/eeb1d95d-50b9-d4b7-99bf-d320acfb530b.png)

[何故、不偏分散はN-1で割るのか？](http://kosugitti.sakura.ne.jp/wp/wp-content/uploads/2013/08/est.pdf)
>分散だけ<font color=green>n−1</font>で割るのは、どうも不公平な感じがする、という方がいるかもしれない。試しに、実際のデータで見てみよう。
>
>まず、<font color=green>N(50, 10)</font>の乱数を<font color=green>5000</font>ケース発生させ、<font color=green>10</font>ケースで <font color=green>1</font>サンプルとして**標本分散**と**不偏分散**を求める。
>
>次に、サンプルの**平均値**を求め、グラフ化する。**標本分散**は母分散<font color=green>100</font>から外れたところを推移し、決して母分散に近づくことはない。

<font color=purple>統計言語Rによる検証</font>

```R
Time_code<-seq(1,5000) 
SD0<-NULL #標本分散初期化
UD0<-NULL #不偏分散初期化

#試行の実施

for (i in Time_code){
smp<-rnorm(10,mean=50,sd=10)
#標本分散の算出結果追加
SD0<-c(SD0,sum((smp-mean(smp))^2)/length(smp))
#不偏分散の算出結果追加
UD0<-c(UD0,sum((smp-mean(smp))^2)/(length(smp)-1))
}

#描画データ準備

Sample_Dispersion<-NULL
Unbiased_Dispersion<-NULL
for (i in Time_code){

Sample_Dispersion<-c(Sample_Dispersion,mean(SD0[1:i]))
Unbiased_Dispersion<-c(Unbiased_Dispersion,mean(UD0[1:i]))
}

#グラフ描画

plot(Time_code,Sample_Dispersion,type="l",col=rgb(0,1,0),xlim=c(0,5000),ylim=c(50,150),main="Sample &Unbiased Dispersion",xlab="Number of Samples",ylab="Dispersions")
par(new=T) #上書き
plot(Time_code,Unbiased_Dispersion,type="l",col=rgb(0,0,1),xlim=c(0,5000),ylim=c(50,150),main="",xlab="",ylab="")

#母分散追加

abline(h=100,col=rgb(1,0,0))

#凡例

legend("bottomright", legend=c("Sample Dispersion","Unbiased Dispersion","Mother dispersion"), lty=c(1,1,1), col=c(rgb(0,1,0),rgb(0,0,1),rgb(1,0,0)))

最終結果

Sample_Dispersion[5000]
[1] 90.08727
Unbiased_Dispersion[5000]
[1] 100.097
```

本当にその通り推移してますね…
constで定数管理するのはヤバい！？値の変更を禁止するたった1つの方法！

#概要
・constは再代入できないが参照型は変更が可能
・参照型はObject.freezeメソッドで不変な値にできる

#constは変更できる
まず初めに、**constで定数を定義すると再代入・再宣言ができません**。
そのため、次のコードでは「TypeError: Assignment to constant variable.」というエラーが発生します。

```定数が変更できない例.js
const teisu = "定数です。"
teisu = "変更しました"    //エラー発生
console.log(teisu)
```

しかし、constは再代入することができないだけで**プロパティの一部を変更することができます**。

```定数が変更できる例.js
const teisu = ["定数です。"]
teisu[0] = "変更しました"
console.log(teisu[0])   //「変更しました」が出力
```

#なぜconstを変更できたのか？
なぜStringは変更できなかったのに、配列の要素は変更できたのでしょうか？

これには2種類のデータ型が関連しています。
**・基本型（プリミティブ型）**
**・参照型**

![テーブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621361/3935ae46-ba0e-f5b0-548d-70123ab486d6.png)


この2つの型は値の保存方法が異なります。
基本型は値を直接格納するのに対し、参照型は定数値の格納先のアドレスを格納します。
**・基本型 ⇒ 値を格納**
**・参照型 ⇒ アドレスを格納**

![参照型と基本型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621361/0e79b78a-a519-ba2a-d45f-4c14b6200718.png)


定数は値を変更することができません。そのため、基本型は変更すればエラーが発生しました。
しかし、参照型はアドレスを変更せず、アドレスが指している値を変更しているため変更が可能なのです。

![参照先の変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621361/6886e923-dc29-0132-141a-ce3a8ad9bd8e.png)


#参照型の変更を禁止するには？
アプリを作ると定数ファイルを用意して、共通の値を管理したいことが出てきます。その場合、参照型の値も保持したい場面が出てくるでしょう。

しかし、参照型はconstで定義しても変更することができるのでした。それでは本来の目的である不変な値を維持することができません。
どうすればいいのでしょうか？

この問題を解決するのが、**Object.freezeメソッド**です。
このメソッドを使って定義すれば、プロパティの変更・追加・削除をしても内容が反映されません。

次のソースでは配列で定義した値をソース上は変更していますが、値を出力すると変更されていないことがわかります。

```freezeメソッドで変更を禁止.js
const teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました"
console.log(teisu[0])   //「定数です。」が出力
```

また、Strictモードにすると TypeError エラーが発生させることができます。
これにより、定数を書き換える処理をテストの段階で取り除けるため、無駄な記述を減らせて可読性が上がります。

```strictモードのエラー.js
"use strict"

const teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました"   //エラー発生
console.log(teisu[0])  
```

ただし、Object.freezeメソッドを使うには注意点が必要です。このメソッドはobjectの直下のプロパティーのみに適応されます。
そのため、入れ子になっているプロパティーの値は変更することができます。

```入れ子のプロパティは変更可能.js
const teisu = Object.freeze(["定数です。", ["定数の中の値"]])
teisu[1][0] = "変更しました"   
console.log(teisu[1][0])   //"変更しました"
```

この問題を解決するために公式ではdeepFreezeメソッドを紹介しています。
このメソッドを使えば、入れ子になっている値も変更することができません。

```入れ子のプロパティも変更できない.js
function deepFreeze(object) {

  // オブジェクトで定義されたプロパティ名を取得
  var propNames = Object.getOwnPropertyNames(object);

  // 自分自身を凍結する前にプロパティを凍結
  for (let name of propNames) {
    let value = object[name];
     
    //「値がある かつ オブジェクト型」の場合、freezeを適用
    object[name] = value && typeof value === "object" ? 
      deepFreeze(value) : value;
  }

  return Object.freeze(object);
}

var obj2 = {
  internal: {
    a: null
  }
};

deepFreeze(obj2);

obj2.internal.a = 'anotherValue'; // 非 strict モードでは暗黙に失敗
obj2.internal.a; // null
```

#参考
[MDN web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)
Pythonで正規表現を使ってASCII以外を置換する


この記事ではPython3を使っています。

#コード

```test.py
import re

text = '''挫折を経験した事がない者は、
Ａ何も新しい事に0 1挑戦したことが無いということだ。
ｦabc123!=*Ｚ
-　アルベルト・アインシュタイン　-'''
after = re.sub('[^!-~\\s]|[　]', '○', text)

print (after)
```

#実行結果

```
○○○○○○○○○○○○○○
○○○○○○○○0 1○○○○○○○○○○○○○○○○
○abc123!=*○
-○○○○○○○○○○○○○○○○-
```

#参考
* [Pythonでre.sub を使用して正規表現で平仮名、カタカナ、漢字を置換｜dot blog](https://dot-blog.jp/news/python-re-sub-japanese/)
* [文字一覧 (ASCII) - instant tools](https://tools.m-bsys.com/data/charlist_ascii.php)
* [正規表現サンプル集](https://www.megasoft.co.jp/mifes/seiki/meta.html)
* [正規表現を使って「〜以外」をマッチさせてみる | 「ポテパンスタイル」](https://style.potepan.com/articles/9251.html)
メモ

eclipse
sourcetree
qiita
discord
sakuraedhita
docker
VirtualBox
Git
Pycharm
filmora9
teraterm
mamp
intellij
7zip
amazon kindle
chocolatey
googlechrome
heroku
java
line
visualstudiocode
visualstudio
minecraft
mySql
nodejs
postgreSQL
python
ruby
twitter
ubuntu
vagrant
xampp
windows assistant
yarn
PowerShellでシステム環境変数を取得・上書・追加・削除する



#環境変数の一覧取得
```powershell:PowerShell
PS C:> [Environment]::GetEnvironmentVariables("Machine") # システム環境変数一覧
PS C:> [Environment]::GetEnvironmentVariables("User")    # ユーザー環境変数一覧
PS C:> [Environment]::GetEnvironmentVariables("Process") # プロセス環境変数一覧
```

#環境変数の取得
```powershell:PowerShell
PS C:> [Environment]::GetEnvironmentVariable("Path", "Machine")
```
プロセス環境変数の取得は $env:path でも可能。

#環境変数の設定（新規・上書き・削除）
```powershell:PowerShell
PS C:> [Environment]::SetEnvironmentVariable("Path", "C:\bin", [EnvironmentVariableTarget]::Machine)
```
第２引数を空文字 `""` にすることで、環境変数を削除できる。（環境変数のキーと値の両方が削除される）
※システム環境変数の変更は、管理者権限のみ可能。ユーザー環境変数とプロセス環境変数は一般ユーザーでも変更可能。

#環境変数を追加
```powershell:PowerShell
PS C:> [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "Machine")+";C:\bin", [EnvironmentVariableTarget]::Machine)
```

#参考文献
[環境変数の操作 - env](https://yanor.net/wiki/?PowerShell/%E7%92%B0%E5%A2%83%E6%83%85%E5%A0%B1/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E6%93%8D%E4%BD%9C)
SvelteでStorybookとsvelte-preprocessを使う方法

# TL;DR

`.storybook/webpack.config.js`を、以下の内容で作成する。

```js
const sveltePreprocess = require("svelte-preprocess");

module.exports = async ({ config, mode }) => {
  const svelteLoader = config.module.rules.find(r => r.loader && r.loader.includes("svelte-loader"));
  svelteLoader.options = {
    ...svelteLoader.options,
    preprocess: sveltePreprocess()
  };
  return config;
};
```

# 背景

この[Issue](https://github.com/storybookjs/storybook/issues/7439)や[記事](https://dev.to/droidmakk/the-3s-svelte-sass-and-storybook-5h5n)が参考になりますが、少々古いせいか、そのままでは動きませんでした。

色々試していたら動いたので貼っておきます。

環境: Windows10 / Svelte / rollup / TypeScript
Windows ユーザーには、Chocolatey（アプリケーション管理ツール）がお薦め！ （2020年9月）

[Chocolatey](https://chocolatey.org/) (公式サイト）

![2020-09-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6c6da44f-cd8c-1418-ae7e-d04dfbadc2e7.png)


#✅本記事のテーマ
>**Windowsにこれまでどんなアプリケーションをインストールしたんだろう**:confused::question:　

>**それが管理できたらうれしいな～**:blush:

>**Windowsを新規購入して今度こそは、アプリケーションの管理をしっかりしたい**:bangbang:

　と悩まれた方向けの記事です！

#✅この記事を読むことによって得られること
>**アプリケーションの管理が容易になる**:exclamation:

>**過去の履歴も参照することができる**:exclamation:

>**環境を常にクリーン✨＆最新の状態🔄を維持できる**:exclamation:

<h1>さっそくインストールしましょう！

#１　Chocolateyのインストール
　トップページの**Get Started**のボタンを押して、パソコンの環境に合わせてダウンロードを進めてください！
基本的に、Powershellを使ってインストールする形になります。（※管理者モードで立ち上げてください！）
以下をコピーして貼り付けても構いません。


```ruby:PowerShell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

![2020-09-27 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/220f3665-0613-bdb2-8c8f-44ad30573ff3.png)

#２　Chocolatey GUIをインストール
　トップページの**Find Packages**のボタンを押して、Chocolatey GUIをインストールしてください。

![2020-09-27 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/855deaf0-6c4c-8044-07db-36205912606e.png)

これで、完了です！
Windowsメニューから、Chocolatey GUIを起動させてみましょう！

![2020-09-27 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/90419909-ebf7-ddbf-3c8a-d4dc4077ab7e.png)

今後は、Find Package から必要ばアプリケーションのインストールをお薦めします！


#最後に
**Windowsのアプリケーション管理に役立てばとてもうれしいです☆彡
最後まで、読んでいただきありがとうございました**:blush:

#引用
>https://youtu.be/o0AX6HXNxxE
>https://youtu.be/hfgZYpo5moA
Windows端末から公開鍵認証方式でSSH接続したリモートホスト内のファイルをメモ帳などで編集する方法

概要
-
タイトルにある「メモ帳」というのは象徴であって、要は、

* 要は手元の使い慣れたエディタ（GUIのやつ）でファイルを編集したい。（＝　vim とか emacs とかの CUI のエディタで編集するのがウザい）
* ファイルやフォルダはドラッグ＆ドロップによって端末・ホスト間で転送したい。（＝　コマンドラインからの scp コマンドとか使いたくない。特に複数ファイルを転送する場合。ホストに samba が用意されてればいいけど、インターネット経由だと何となく認証方式が不安だったり。）

というようなニーズがあるので、その実現方法のひとつを書いてみる。


前提
-
* Windows端末からリモートホストに公開鍵認証方式でSSH接続ができるように設定が済んでいること。（ググれば参考サイト多数あり）
* すなわち、コマンドプロンプトから、

```
 ssh [ユーザー名]@[ホスト名またはIPアドレス]　云々
```
 などでリモートホストにログインできる状態に設定されていること。

* C:\Users\ [ユーザー名]\ .ssh\id_rsa 
　などに生成した秘密鍵を置いていること。

WinSCP のインストール
-

https://winscp.net/eng/download.php
https://forest.watch.impress.co.jp/library/software/winscp/

などからダウンロードしてインストールする。
んで、
C:\Program Files (x86)\WinSCP\
にインストールしたという仮定で進める。

秘密鍵のファイル変換
-
なぜか鍵の形式を変換しないと使えないので。

* C:\Program Files (x86)\WinSCP\PuTTY\puttygen.exe 
 をダブルクリックとかで実行する。
（一説によるとスタートメニューから実行できるとか言われているが、ワシにはできなかった。）
* Conversions メニュー　→　Import key
で、秘密鍵ファイル＝　C:\Users\ [ユーザー名]\ .ssh\id_rsa　を探して開く。
* [ Save private key ] で、id_rsa.ppk というファイル名で保存する。（”public key” と間違わないこと。）
* [×]　で終了。

WinSCP を実行
-
* スタートメニューから　WinSCP を探して実行する。
* ホスト名とユーザー名とパスワード（必要な場合）を入れて、[設定]　ボタンを押す。
* 「高度なサイトの設定」ダイアログで、SSH の下の 「認証」　をクリック。
* 「秘密鍵」の[...] から、上記 id_rsa.ppk を探して入れて [OK] ボタン。
* [保存]　ボタン。
* [ログイン]　ボタン。

以上の操作で、リモートホストのディレクトリやファイルが見れたらラッキー。
-
* ドラッグ＆ドロップで、端末・ホスト間のファイルのコピーが可能。（上書きは警告がでないことがあるので注意）
* ファイルを編集するなら、ファイル名を右クリック→「編集」からお好みのエディタを選んで編集可能。
* ファイル名を右クリック→「編集」「設定」「追加」「外部エディタ」「参照」からお好みのエディタを選んで追加可能。
* たとえばメモ帳を追加したいなら　C:\Windows\notedad.exe　を追加する。
* たとえば　TeraPad をインストール済なら C:\Program Files (x86)\TeraPad\TeraPad.exe を追加するとか。。
* リモートホストが Linux 系などの場合は、文字コード／改行コードに注意。
　たとえば、Tera Pad で日本語を扱う場合なら、一度、ファイルメニュー→「文字／改行コード指定保存」で文字コード=UTF-8N、改行コード=LF　などとして保存する。一度保存すると次回開くときに覚えていてくれる。

その他の方法
-
ホスト側にGUIエディタがあってそれを使いたいなら、WinSCP を使わずに Xming　とかでターミナルソフトから起動できるかも。
ROSのTFとTF2の対照(Python)

# はじめに
本記事は、ROS(Robot Operating System)の座標変換ライブラリであるTFおよびその再実装であるTF2の使い方を整理したものです。
(Tensor Flowとは関係ありません。)

# ROSのTFとTF2の対照表
tfにおいて、`TransformListener`経由で行うことのほとんどは、tf2の`Buffer`クラス経由で行う。

| やりたいこと   | tf.TransformListener | tf2_ros.Buffer                   |
| -------------- | -------------------- | -------------------------------- |
| 変換行列の取得 | lookupTransform      | lookupTransform                  |
|                | lookupTransformFull  | lookupTransformFull              |
|                | waitForTransform     | lookupTransformのtimeout引数     |
|                | waitForTransformFull | lookupTransformFullのtimeout引数 |
| メッセージの座標変換 | transformPoint       | transform           |
|                      | transformPose        | transform           |


## 座標変換の計算
tfでは、`tf.transformations`モジュールの関数を用いるが、tf2では、`PyKDL`を用いる。

| やりたいこと | tf.transformations    | PyKDL                                            |
| ------------ | --------------------- | ------------------------------------------------ |
| 座標変換     | euler_from_quaternion | PyKDL.Rotation.Quaternion(x,y,z,w).getEulerZYX() |
|              | quaternion_matrix     | PyKDL.Rotation.Quaternion(x,y,z,w)               |