OmniAICreator/Qiita-1.07M huggingface dataset:
ECにおけるMDM(マスタデータ管理)の実施

ECモールにおいて一番効果があるデータ施策は何かと自分なりに考えたことがある。それはデータベースの理想図と現状データベースの差分を検証することとマスタデータの統一がある。
理由はプロモーションやクーポン、ポイント施策などマーケティング施策の評価が適切に出来る状況を作り、次の施策に生かす。つまり**PDCAを回せる環境を作ることが最重要のためだ。**
データベースの理想図については若干触れてはいけない情報も書きそうなので、一旦マスタについて考察してみる。

#考察すべきMDMの効果
今社内で決まったマスタデータが多く不足している。それによる弊害を自分の業務観点で考えてみた。
※一旦データの取得不足は考慮しない。

**1，集計時にめっちゃ困る**
　例えば、クーポン施策やポイントキャンペーンその他にもモール内販売広告効果等を計測する際に**基準にすべきマスタがない**という状況は本当に困る。

**2，効果計測がにめっちゃ困る**
　集計ができないということは、効果計測できないということで振り返りもできず費用対効果もわからず新しい施策を勘と経験で続けることになる。**『効果計測できないものは制御も改善もできない』**この状況はデータドリブンには程遠く競争していく上で大きなハンデになる。

つまり、社内・外部へのマーケティング施策に非常に大きなボトルネックをもたらすため、マスタデータの統一は非常に重要である。

#MDMを進める順序
##1,統合対象の明確化
　弊社の場合既にモール事業を進めている以上最低限のマスタはあるが、大きな軸で考えてみたところ特に施策面のマスタがないことが結構な問題となっていること分かった。これは他のサービスも結構あるんじゃないだろうか。
　※本当はもっとありますが敢えて大きな粒度で書いてます。

|　 大項目　　|　　　有無　　　|    備考    |
|:-----------------:|:------------------:|:------------------:|
| 商品    |○|商品        |
| 顧客    |○|店舗とユーザー        |
| 施策    |×|クーポンとか        |

##2,ロールの整理
　各部署により顧客との向き合い方が異なる。よって対象ロールの整理が必要となる。例を挙げると。
　※B to B to C

|　　部署　　|　　顧客定義　　|
|:-----------------:|:------------------:|
| 経理    |請求先|
| 営業    |店舗|
| マーケ  |モールユーザー|

この辺を踏まえて**各ロールごとのユーザーに対する施策**をまとめ、それぞれの担当者からマスタに絞った情報を収集する。

##3,目的の整理

非常に重要なのだが、**何を目的とした可視化をすべきなのかは設計上事前に決めておく必要があり**それに応じて項目設計をすべきである。
具体的には以下の様なことを決めて私の場合BIツール(Tableau)を利用してどう可視化するかを基に要件を決める。
　・マーケティングコストの最適化のためのユーザー状況可視化(RFMやコホート等)
　・マーケティング施策評価(クーポンやポイント及びプロモーション等)と費用対効果の管理
　・サイト流入経路とそのトラフィック量の把握による流入経路最適化

##4,テーブルと項目の定義

仮にクーポンを例に考える。ざっと考えただけでも以下のような項目が必要となる。
※オーダー1件に対して使用可能なクーポンは1枚のみで、同一ユーザーIDによる
　同一クーポン複数使用は不可

　■クーポンマスタ
　　・クーポン識別ID
　　・クーポン名
　　・クーポン対象店舗数
　　・設定金額
　　・割引金額
　　・使用可能枚数

　■クーポン使用トランザクション
　　※購入トランザクションにクーポン識別IDが付与されていれば不要
　　・オーダーID(購入トランザクションと紐付け用)
　　・クーポン識別ID
　　・使用日時
　　・ユーザーID

　■クーポン取得ログ
　　※クーポン取得したけど使わないこともあるので必要
　　・クーポン識別ID
　　・取得日時
　　・ユーザーID

##6,可視化例

購入トランザクションデータとクーポンマスタを繋げて使うことで
使用枚数が分かる

■可視化用データイメージ
　以下最低限項目のみで作成(T：トランザクション、M：マスタ)

|注文ID(購入T)|購入日時(購入T)|クーポンID(クーポンM)|クーポン名(クーポンM)|会員ID(会員M)|商品名(商品M)|価格(商品M)|個数|コスト(クーポンM)|利益|
|:---:|:-----:|:----:|:---:|:---:|---:|---:|---:|---:|---:|
| 1  |9月10日 15：35|001|Open記念|001|たわし|¥100|1|¥30|-¥30|
| 2  |9月11日 16：00|NULL|NULL|001|洗剤|¥200|NULL|NULL|NULL|
| 3  |9月11日 17：45|003|還元祭|002|水|¥50|4|¥50|1|¥40|+¥30|

　上記のマスタ情報をさらに追加及び入れ替えればその購入自体の利益が分かるため
　施策評価が可能となる。
　以下の様な可視化となる。※茶色っぽい部分はマイナス利益

![シート 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285951/a10fe3d2-78af-98dd-2d93-05e154c09dbd.png)

##7,最後に
　商品レベルの原価や利益管理ができているところは多いと思うが、
　施策レベルのマスタや各種管理が出来ている企業は肌感ではまだまだ少ない。
　この施策が利益に貢献しているか？もしくは貢献していない場合はその原因追及が
　可能である環境づくりは非常にマーケティング上重要である。
　ちょっと個人的に走り書きで書いたのですべて言いたいことが網羅されていない気もするが
　MDMの重要性とそれがもたらす威力が少しでも伝えられたらと思う。
　マスタって当り前の様ですごい。
AWS認定試験対策問題集まとめ＆最短合格手順をおすすめしてみる

#本投稿の概要
AWSエンジニアを目指している皆様こんばんは。

弊社はAWS関連のインフラサービス、WEBサービスを提供している会社で日頃よりAWSエンジニア（特にフリーのAWSエンジニア様にご活躍いただいています）の皆様方へAWS関連案件のお仕事のご依頼をしている業務柄、今回はAWSエンジニア様の育成という観点からAWS認定試験対策を自前で行い最短で認定を受けるためのフローをおすすめしてみたいと思います。


#合格までの一般的な流れ
一般的な流れとしては以下のような形になると思います。

・WEB問題集で実力だめし
・AWS公式模擬試験を受験 https://www.aws.training/certification?src=cert-prep
　　※画面右上に「日本語」への切り替えがあります。
・問題なく得点が取れるなら受験
・得点があまり取れなかった方は学習
・改めてWEB問題集で試験を想定して復習
・AWS公式模擬試験を改めて受験する
・問題なく得点が取れるなら受験
・本番の受験をする

この繰り返しかと思います。

#主なWEB問題集
弊社でもAWS問題集を随時提供（ほぼ毎日更新）していますのでぜひご活用ください。


##WEB問題集
AWSエンジニア向け試験対策問題集 | STRA株式会社｜SES事業部
https://stra.co.jp/ses/aws-study/
※弊社提供のサイト、ほぼ毎日更新しています。

AWS WEB問題集で学習しよう | 赤本ではなく黒本の問題集から学習する方向け
https://aws.koiwaclub.com/

AWS SAA/SAP資格 予想問題集 Web版 | 日本語完全無料
https://awsjp.com/exam/saa-sap/c/

【模擬テスト問題50問】AWSソリューションアーキテクト サンプル問題集[改訂版試験対応] | ソリューションアーキテクト・アソシエイト 模擬テスト問題集
https://aws-exam.com/saa/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E5%95%8F%E9%A1%8C%E9%9B%86/

[SolutionArchitect Pro] AWS Auto Scaling | STAY KOBE
https://stay-ko.be/aws/solutionarchitect-pro-aws-autoscaling


#主な学習方法
いくつか主な学習方法があると思いますが基本的には手を動かすことが重要です。

・実際に組んでみる
・書籍を用意し読み込んでみる
・上記WEB問題集などでケースバイケースを学ぶ
・動画教材を使って学習する


その他、役立つリソース、情報などありましたら随時こちらを編集してまいります。
2回目で「AWSソリューションアーキテクト – アソシエイト」を合格するまで

# はじめに
私は8年目のエンジニアで、4月からAWSを触り始めました。
LambdaとDynamoeDBが中心です。
それまではアプリのエンジニアで、インフラ系の知識はあまりありません。

# クラウドプラクティショナー
AWS SUMMITでラウンジに入りたくて、2019/6/1に試験を受けて合格しました。
緑の公式の本を1週間読み込んで勉強しました。
本を2,3周読みました。
AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー
https://www.amazon.co.jp/dp/4797397403/ref=cm_sw_em_r_mt_dp_U_wV6CDbMPD8KM9

# 1度目の受験までの勉強
オレンジの公式の本を読み込んで勉強しました。
今回も本を2,3周読みました。
AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト
https://www.amazon.co.jp/dp/479739739X/ref=cm_sw_em_r_mt_dp_U_zZ6CDbWKSMK7B
また、ブラックベルトの動画をちょこちょこ見ていました。
こんなサービスあるんだなぁと見ていました。

# 1度目の受験
2019/7/27に受験して落ちました。
結果はこんなかんじです。
![1jpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/b03ba8e4-55c4-4e9a-de27-94cc4095fd7a.jpeg)
あと60点・・・
セキュアなアーキテクト構築できない・・・
コストもたくさん掛けちゃう・・・
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/3c91c868-6667-75b0-1e08-359ee889b9da.jpeg)

# 原因分析
そもそものITスキルが足りていない。。。
AWSのサービスに詳しくなってもそもそものITスキルがないと理解できない。
特にネットワーク周りを知りませんでした。
CIDR？「X.X.X.X /16」/16って？？？
というかんじです。

# 2度目の受験に向けて
ネットワークの単語を理解できるようにこの本を読んで勉強しました。
ちゃんとは理解できていませんが、基本的な流れや単語を理解できました。
例えがたくさんあったり、わかりやすく説明してくれていました。
マスタリングTCP/IP 入門編 第5版
https://www.amazon.co.jp/dp/4274068765/ref=cm_sw_em_r_mt_dp_U_y76CDbSQB9P9M

また、会社の先輩に教えてもらったVPCの動画を見ました。
https://www.youtube.com/watch?v=aQpMBqn5mRY&t=72s
https://www.youtube.com/watch?v=lqsiWw-eDzQ
https://www.youtube.com/watch?v=OjQSkvjw23c
https://www.youtube.com/watch?v=vePEKj2gR3k
https://www.youtube.com/watch?v=e7fJ7mva3QI
https://www.youtube.com/watch?v=4sZ7n7KmJYs
※話すのめっちゃ早いですｗ

# 2度目の受験
2019/9/7に再度受験して合格しました！
結果はこんなかんじです。
![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/325c59c1-f25c-7d2f-e19a-c4c3f3896d17.jpeg)
852点！自分を褒めてあげたい！
正直試験を受けてるときは、自信なくて結果を表示するのすごいドキドキしました。
知らない単語いくつかあったし・・・

# 最後に
合格できて非常にうれしいですが、正直実務で使えるレベルではないです。
まだまだ勉強して、レベルを上げていきたいです。
知らないことだらけで今まで勉強サボってたことを4月からしみじみ感じてます。
Laravelでajaxに挑戦してみた

#Ajaxのコード

他のサイトのをそのまま転用した。
あまりに長いので食わず嫌いアレルギーを起こして中々取り組む気が起きませんでした。
JavaEEのfaceletテンプレートエンジンだと、簡単に実装できるタグみたいなのがあったので、最新のPHPフレームワーク(2019年現在)であるLaravelなら当然そういう簡単なのがあるはずだと思いしばらくググっていましたが、どれをみてもこういう感じでした。
JQueryですが、長いので丸ごとコピーしてコメントの行だけ差し替えて使いましょう。


```
<script>
        $(function(){
            $('#button').click( //起動するボタンなどのid名を指定
                function(){
                    $.ajax({
                        type:'GET', //GETかPOSTか
                        url:'ajaxtest',//url+ファイル名 .htmlは省略可
                        dataType:'html',//他にjsonとか選べるとのこと
                    }).done(function (results){
                        $('#text').html(results);//展開したいタグのidを指定
                    }).fail(function(jqXHR,textStatus,errorThrown){
                        alert('ファイルの取得に失敗しました。');
                        console.log("ajax通信に失敗しました")
                        console.log(jqXHR.status);
                        console.log(textStatus);
                        console.log(errorThrown.message);
                    });
                }
            );
        });
    </script>

    <input type="button" id="button" value="AjaxTest"><br/>
    <div id="text"></div>
```

#パスにハマる
ここからが本題ですが、bladeの場合どこに置くかでかなり迷います。
上記のコードがあるフォルダに一緒に入れておけばすぐできそうですが、ただ置いただけでは４０４が出ます。
しかもブラウザの開発画面でしか404を確認できないので謎のエラーにハマりました。
結論から言うと他のblade.phpファイルと同じようにweb.phpとControllerに追記すればパスが通ります。
Controllerから return viewで指定するのがポイント。

なんでそんなことになるかと言うと、呼び出し元のphpファイルがルーティングによってファイルの場所と違うところをアドレスに指定されているからで、上記のコードのURLの相対パスはその飛ばした先のURLからの相対パスになるからです。

例えば以下のルーティングをしているファイルに上記コードがあるとする。

```php5:web.php
Route::get('/' ,'SampleController@index_get');
```

そうするとURLは http://127.0.0.1:8000/ とかになりますね。
じゃあこれは開発フォルダでいうとどこって言えばpublicフォルダの直下になる。
だからweb.phpに記述しなくてもそこへ置いたらパスが通ります。
ただ、それだとajaxで呼ぶファイルだけ他のソースファイルと全然違うところに置くことになるので困るわけです。

だから

```php:web.php
Route::get('/ajaxtest' ,'SampleController@ajaxtest_get');
```

という感じで追記して SampleControllerに function ajaxtest_get(){何たらかんたら} 
という感じでいけます。

GoogleCromeの場合パスさえ通れば、こんな感じで詳しいエラーが見えるようになるので開発メニューで調べるといいです。

<img width="695" alt="スクリーンショット 2019-09-07 22.40.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/983d1455-2b77-9282-2358-7d683985c78a.png">

# Ajaxのデバッグのやり方について
ここの記事が秀逸だったのでリンク載せておきます。

https://qiita.com/KitamuraTakashi/items/9c7aca4ec498e453d1b1
2019-09-07 メモ nginx

ただのメモ書きです。

- 環境
  - Ubuntu 18.04.3 LTS
  - Vagrant 2.2.5

# Install

```bash
sudo apt install nginx
```

インストールするとすぐ動く

```bash
curl localhost
```

# Config

## path

```bash
/etc/nginx/nginx.conf
```

## Configuration File’s Structure

文法は以下のような感じで、`events`, `worker_connections` とかが "directive"

```nginx
events {
  worker_connections 768;
  # comment
}
```

どの `{}` にも囲まれていない directive は `main {}` の中となる。

`main`, `events`, `http`, `server`, `location` directives は特殊で、以下のような包含関係にある。

```nginx
main {
  events {
  }
  http {
    server {
      location {
      }
    }
  }
}
```

# Simple server

静的 HTML, image を返す簡単なサーバー設定をしてみる。

1. ファイルを置く
2. デフォルトの設定の無効化
3. 設定ファイル作成
4. 設定ファイル読み込み

## 1. ファイルを置く

```bash
mkdir -p /var/www/my/html
echo hello > /var/www/my/html/index.html
mkdir -p /var/www/my/images
# put some images in /var/www/my/images
```

## 2. デフォルトの設定の無効化

実態ファイルが `/etc/nginx/sites-available` にあり、`/etc/nginx/sites-enabled` にシンボリックリンクを貼ることで設定を有効化するしくみにしているみたい。

デフォルトの設定が `/etc/nginx/sites-available/default` にあるので無効化

```bash
unlink /etc/nginx/sites-available/default
```

## 3. 設定ファイル作成

こんな感じ

```nginx
$ cat /etc/nginx/sites-available/myconf
server {
    location / {
        root /var/www/my/html;
    }
    location /images/ {
        root /var/www/my;
    }
}
```

`server` で port を指定しないと `80` ポート設定になる。

## 4. 設定ファイル読み込み

```bash
systemctl reload nginx
```

# Proxy server

```nginx
server {
    listen 8080;
    root /data/up1;

    location / {
    }
}
```

`server` 直下に `root` があるが、この `root` は `location` で `root` 指定がない場合に適用される。

複数の `location` directive が定義されていた場合の適用順は、
"最長マッチ" -> "正規表現"

# Command

## systemctl

```bash
sudo systemctl start nginx
sudo systemctl reload nginx
sudo systemctl enable nginx
```

## nginx process operation

```bash
nginx -s stop # fast shutdown
nginx -s quit # shutdown
nginx -s reload # reloading the configuration file
nginx -s reopen # reopening the log files
```

## 設定出力

複数ファイルを include している場合も、これで全部出力できる。
ただし、ファイルを gathering しているだけで、オンメモリの設定を読んでいるわけではない。

```bash
nginx -T
```

# 参考

- [Beginner’s Guide](http://nginx.org/en/docs/beginners_guide.html
)
『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』のAOJの対応問題のリンク集

#　目的
復習のために、『[プログラミングコンテスト攻略のためのアルゴリズムとデータ構造](http://amzn.asia/adTjUtW)』の[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp)の対応問題のリンク集をまとめるぞ

と思ったのですが、多すぎて挫折したので編集リクエストお待ちしています。私もコツコツ編集していきます。

# リンク集
Part 1　[準備編]プロコンで勝つための勉強法
1章　オンラインジャッジを活用しよう
問題がないため略

Part 2　[基礎編]プロコンのためのアルゴリズムとデータ構造
問題がないため前略
2.5 導入問題 - [Maximum Profit](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_1_D&lang=jp)
 
3章　初等的整列
3.1 ソート：問題にチャレンジする前に
3.2 挿入ソート - [Insertion Sort](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_1_A&lang=jp)
3.3 バブルソート
3.4 選択ソート
3.5 安定なソート
3.6 シェルソート
 
4章　データ構造
4.1 データ構造とは：問題にチャレンジする前に
4.2 スタック
4.3 キュー
4.4 連結リスト
4.5 標準ライブラリのデータ構造
C++の標準ライブラ / stack / queue / vector / list
4.6 データ構造の応用：面積計算
 
5章　探索
5.1 探索：問題にチャレンジする前に
5.2 線形探索
5.3 二分探索
5.4 ハッシュ
5.5 標準ライブラリによる検索
イテレータ / lower bound
5.6 探索の応用：最適解の計算
 
6章　再帰・分割統治法
6.1 再帰と分割統治：問題にチャレンジする前に
6.2 全探索
6.3 コッホ曲線
 
7章　高等的整列
7.1 マージソート
7.2 パーティション
7.3 クイックソート
7.4 計数ソート
7.5 標準ライブラリによる整列
sort
7.6 反転数
7.7 最小コストソート
 
8章 木
8.1 木構造：問題にチャレンジする前に
8.2 根付き木の表現
8.3 二分木の表現
8.4 木の巡回
8.5 木巡回の応用：木の復元
 
9章 二分探索木
9.1 二分探索木：問題にチャレンジする前に
9.2 二分探索木：挿入
9.3 二分探索木：探索
9.4 二分探索木：削除
9.5 標準ライブラリによる集合の管理
set / map
 
10章ヒープ
10.1 ヒープ：問題にチャレンジする前に
10.2 完全二分木
10.3 最大・最小ヒープ
10.4 優先度付きキュー
10.5 標準ライブラリによる優先度付きキュー
priority_queue
 
11章 動的計画法
11.1 動的計画法とは：問題にチャレンジする前に
11.2 フィボナッチ数列
11.3 最長共通部分列
11.4 連鎖行列積
 
12章 グラフ
12.1 グラフ：問題にチャレンジする前に
12.2 グラフの表現
12.3 深さ優先探索
12.4 幅優先探索
12.5 連結成分分解
 
13章 重み付きグラフ
13.1 重み付きグラフ：問題にチャレンジする前に
13.2 最小全域木
13.3 単一始点最短経路
 
 
Part 3　[応用編]プロコン必携ライブラリ
14章 高度なデータ構造
14.1 互いに素な集合
14.2 領域探索
14.3 その他の問題
 
15章 高度なグラフアルゴリズム
15.1 全点対間最短経路
15.2 トポロジカルソート
15.3 関節点
15.4 木の直径
15.5 最小全域木
15.6 その他の問題
 
16章 計算幾何学
16.1 幾何学的オブジェクトの基本要素と表現
点とベクトル / 線分と直線 / 円 / 多角形 / ベクトルの基本演算 / ベクトルの大きさ / Point・Vector クラス / ベクトルの内積：Dot Product / ベクトルの外積：Cross Product
16.2 直線の直交・平行判定
16.3 射影
16.4 反射
16.5 距離
２点間の距離：distance / 点と直線の距離 / 点と線分の距離 / 線分と線分の距離
16.6 反時計回り
16.7 線分の交差判定
16.8 線分の交点
16.9 円と直線の交点
16.10 円と円の交点
16.11 点の内包
16.12 凸包
16.13 線分交差問題
16.14 その他の問題
 
17章 動的計画法
17.1 コイン問題
17.2 ナップザック問題
17.3 最長増加部分列
17.4 最大正方形
17.5 最大長方形
17.6 その他の問題
 
18章 整数論
18.1 素数判定
18.2 最大公約数
18.3 べき乗
18.4 その他の問題
 
19章 ヒューリスティック探索
19.1 8クイーン問題
19.2 8パズル
19.3 15パズル
iPhoneからdropzoneで動画アップロードする時に圧縮処理をするのを無くす方法

#はじめに
iPhoneのwebブラウザから[dropzone](https://www.dropzonejs.com/)を使って10分くらいの動画をアップロードする仕様が必要だったのですが、iPhoneから動画をアップロードするとき、デフォルトだとアップロード前に動画の圧縮が始ってしまいます。

この圧縮の間、iPhoneで他のことができなくなってしまうので、「このフェーズ消したいなあ」と思いました。

https://qiita.com/clwkct/items/08cf47a5cf18c6a7ec69
↑こちらの記事を読んで、動画を複数選択できるようにすれば圧縮を回避できることが分かったので、
dropzoneについてやったことと結果についてまとめます。

#やったこと
dropゾーンのオプションに以下を追加するだけです。

```sample.js
maxFiles: 2, //2以上の値にすれば動画が複数選択可能になる
```

#結果
SafariとGoogle Chromeで確認しましたが、圧縮処理を無くすことができました。
しかも、圧縮処理が入る場合400MBくらいあった動画が、圧縮処理を無くしてアップロードする時は200MBとなりました。
なんでか、圧縮処理が無い方がファイルサイズが小さくなってました笑

そんな訳で、一旦、求めていたことができるようになりました。

ただ、複数動画を同時にアップロードするようになるので、それを防ぎたい場合は別途対処が必要となります。
Mathematica で文字を装飾する

#使用したもの
Mathematica 11

#目的
Mathematica でグラフを描くときに単なる文字列を使っていては見た目が非常に悪い。そこで、フォントサイズや文字色を変えることを目指す。

#方法
`Sytle` 関数を使えば上記目的は簡単に達成される。使用例は以下の通り。

```
Style[ "string",
  FontSlant -> Italic, (* Italic or Plain *)
  FontWeight -> Bold, (* Bold or Plain *)
  FontSize -> 20,
  FontColor -> Black,
  FontFamily -> "Times New Roman" ]
```

文字列を最初に与え、その後に省略可能なオプションを指定していく。以下、オプションの説明。


+ `FontSlant` に`Italic` か`Plain` を指定することで斜体にするかどうかを選べる。
+ `FontWeight` に`Bold` か`Plain` を指定することで太字にするかどうかを選べる。
+ `FontSize` で文字の大きさを指定できる。
+ `FontColor` で文字色を指定できる。
+ `FontFamily` でフォントを指定できる。文字列で与えることに注意。

上記の結果として、下の画像のように装飾された文字が得られる。
![string.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246571/e9e41344-3f25-4564-31ee-4a9b4edba5ef.png)

#上付き文字、下付き文字
上付き文字を作成したい場合は`SuperScript` 関数を使用する。下付き文字の場合は`Subscript` 関数を使用する。これを使えばMathematica Notebook だけではなく、Wolfram Script でも上付き文字等が使用できる。

#便利な関数を用意する
さて、目的は達成されたわけだが毎回のように上記内容を書き込むのでは手がつかれるのに加えて読みにくくなる。したがって、ある程度オプションを固定した自作のスタイル関数`myStyle` を用意しよう。

##オプションの一部を固定する
オプションの一部を固定するのは簡単だ。下記のようにすればよい。

```
myStyle[ s_, ib1_, ib2_] := 
  Style[ s,
    FontSlant -> ib1,
    FontWeight -> ib2,
    FontSize -> 20,
    FontColor -> Black,
    FontFamily -> "Times New Roman" ]
```

##オプションの一部を省略する
上記関数を用いれば、ある程度は簡潔にコードを書くことができる。しかし、`FontSlant` や`FontWeight` に`Plain` を指定するときは引数を省略したい。そこで`Optional` を用いる。これは引数の後に`:` を置き、その後にデフォルトの値を指定できる機能である。
以下のように書く。

```
myStyle[ s_, ib1_:Plain, ib2_:Plain] := 
  Style[ s,
    FontSlant -> ib1,
    FontWeight -> ib2,
    FontSize -> 20,
    FontColor -> Black,
    FontFamily -> "Times New Roman" ]
```

これで第2引数と第3引数が省略されたときは`Plain` が指定されるようになる。

しかし、このままでは`myStyle["string", Bold]` に対応できない。`FontSlant` に`Bold` が指定されエラーとなる。これを回避するために場合分けを行う。
まず`ib1` が`Bold` の場合は`ib1` と`ib2` を入れ替えたい。したがって下記のようになる。

```
myStyle[ s_, ib1_:Plain, ib2_:Plain ] := 
  Style[ s,
    FontSlant -> If[ ib1 == Bold, ib2,ib1 ],
    FontWeight -> If[ ib1 == Bold, ib1,ib2 ],
    FontSize -> 20,
    FontColor -> Black,
    FontFamily -> "Times New Roman" ]
```

このままでは`myStyle[Plain, Italic]` のときにエラーとなるので、`ib1` が`Bold` ではなく、かつ`ib2` が`Italic` のときにも引数が入れ替わるようにしたい。下記のようになる。

```
myStyle[ s_, ib1_:Plain, ib2_:Plain ] := 
  Style[ s,
    FontSlant -> If[ ib1 == Bold, ib2, If[ ib2 == Italic, ib2, ib1 ] ],
    FontWeight -> If[ ib1 == Bold, ib1, If[ ib2 == Italic, ib1, ib2 ] ],
    FontSize -> 20,
    FontColor -> Black,
    FontFamily -> "Times New Roman" ]
```

こうすれば以下の場合に対応できる。

```
myStyle[ "string", Plain, Plain ]
myStyle[ "string", Italic, Plain ]
myStyle[ "string", Plain, Italic ]
myStyle[ "string", Bold, Plain ]
myStyle[ "string", Plain, Bold ]
myStyle[ "string", Italic, Bold ]
myStyle[ "string", Bold, Italic ]

myStyle[ "string", Plain ]
myStyle[ "string", Italic ]
myStyle[ "string", Bold ]

myStyle[ "string" ]
```

なお、`myStyle[Bold, Bold]` みたいなのはエラーのままである。
安全なウェブアプリケーションの作り方の概要

#はじめに
2019年７月7payの被害の件で、大きなニュースでした。
参考記事：[「7pay」不正問題には、日本企業の経営のダメさが凝縮している](https://gendai.ismedia.jp/articles/-/65747)

安全なウェブアプリケーションの作りはとても重要です。
IPAの[「安全なウ ェ ブ サ イ ト の作り方」 ](https://www.ipa.go.jp/files/000017316.pdf)　にまとめた内容は決済サイトはもちろん、一般サイトでも徹底的に対応すべきですね。

#セキュリティとは
セキュリティの定義は領域によって違いますが、情報セキュリティだったら下記の特性を持っています。

- 機密性 (confidentiality): 情報へのアクセスを認められた者だけが、その情報にアクセスできる状態を確保すること
- 完全性 (integrity): 情報が破壊、改ざん又は消去されていない状態を確保すること
- 可用性 (availability): 情報へのアクセスを認められた者が、必要時に中断することなく、情報及び関連資産にアクセスできる状態を確保すること

#脆弱性と攻撃の種類([wiki](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3))
- バックドア - セキュリティ上の問題になりうるソフトウエアの脆弱性、欠陥。バッファオーバーランやクロスサイトスクリプティング、SQLインジェクションなどがある。
- ポートスキャン
- ダイレクト・アクセス攻撃
- 盗聴
- マルチベクトル型攻撃、ポリモルフィック攻撃
- フィッシング (詐欺)
- 権限昇格攻撃 (Privilege escalation)
- ソーシャル・エンジニアリング
- スプーフィング攻撃
- 改竄
- サイドチャネル攻撃
- 辞書攻撃
- コンピュータウイルス
- ワーム (コンピュータ)
-トロイの木馬 (ソフトウェア)
- スパイウェア
- ルートキット

#IPA安全なウェブアプリケーションの作り方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/edacfcde-747f-ed6b-f8cc-07846461aab6.png)

下記のセキュリティ問題を全部プログラム上対応する必要があります。

-  SQL インジェクション
-  OS コマンド・インジェクション
-  パス名パラメータの未チェック／ディレクトリ・トラバーサル
-  セッション管理の不備
-  クロスサイト・スクリプティング
-  CSRF（クロスサイト・リクエスト・フォージェリ）
-  HTTP ヘッダ・インジェクション
-  メールヘッダ・インジェクション
-  クリックジャッキング
-  バッファオーバーフロー
-  アクセス制御や認可制御の欠落

特にXSS対応、セッションID保護のほうが漏れなく対応、確認が必要です。

#パスワード管理
##パスワード設計
十分な強度あるパスワード設計が必要です。
パスワード強度設計：

- 数字、大文字、小文字、記号それぞれ１文字以上
- パワードの長さは８文字以上
- パスワード辞書に載っているありがちな単語の禁止
- ID、パスワードは同じでない（ジョーアカウント禁止）
- ユーザーの個人情報は利用しない（生年月日、名前など）　※チェックできない場合はユーザーに注意喚起の文言を提示
- 他サイトと同じID、パスワードを利用しない　※ユーザーに注意喚起の文言を提示

パスワード総数は、94種類文字で約6100兆通りで十分な強度ではあります。

##パスワード保護
もっとも重要なものはパスワードの保護です。

- DBに保存する際には「ハッシュ＋ソルト＋ストレッチング」で強化する
- アカウントロック機能を設ける（３回以上だったらロックなど）
- ログインする際に「私はロボットではありません」の機能を設ける
- パスワード変更の際には、旧パスワードの入力が必須にする
- パスワードの世代管理を設ける
- パスワード有効期限を設ける
- 二段階認証（特に違うデバイスの初回目のログインの場合、認証コードなどで本人確認）
- パスワード忘れの場合は任意メールアドレスは許可しない
- パスワード忘れの場合は秘密の質問回答を求める
- 複数デバイスの場合は、強制ログアウト機能を設ける　（保険対策）
- 違う地域のログインの場合はメールで通知する　（保険対策）
- ソーシャルエンジニアリングの軽減でユーザーに注意喚起の文言を提示

#コード決済のガイドライン
経済産業省はコード決済（QRコード決済）に用いられる統一QRコード・統一バーコードの仕様を策定しました
https://www.meti.go.jp/press/2018/03/20190329002/20190329002.html

・コード決済に関する統一技術仕様ガイドライン【利用者提示型】CPM（Consumer-Presented Mode）
https://www.paymentsjapan.or.jp/wordpress/wp-content/uploads/2019/03/CPM_Guideline_1.1.pdf

・コード決済に関する統一技術仕様ガイドライン【店舗提示型】MPM（Merchant-Presented Mode）
http://www.paymentsjapan.or.jp/wordpress/wp-content/uploads/2019/03/MPM_Guideline_1.0.pdf

・コード決済における不正流出したクレジットカード番号等䛾不正利用防止対策に関するガイドライン
https://www.paymentsjapan.or.jp/wordpress/wp-content/uploads/2019/04/Fraud_Prevention_Guideline.pdf

ガイドラインに記載したコード決済での不正利用例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/af45c876-118c-4cdf-bb87-ba4d256046d7.png)

コード決済などのシステムは、専門家たちが策定したガイドラインを守ったら、知識不足、対応漏れなどを回避できます。

以上
Javascriptでurlのパスを取得

## 概要
javascriptでurlの文字列からパスの文字列を取得したい。
'http://localhost:3000/hoge/huga'
の場合は'hoge/huga'の部分
'http://localhost:3000/'
の場合は'/'を取得したい

## splitしてsliceしてjoinする
```javascript

// 'http://localhost:3000/hoge/huga'.split('/').slice(3)
// →["hoge","huga"]
let path = 'http://localhost:3000/hoge/huga'.split('/').slice(3).join('/')
path == '' ? '/' : path
// →"hoge/huga"

// 'http://localhost:3000/'.split('/').slice(3)
// →[""]
path = 'http://localhost:3000/'.split('/').slice(3).join('/')
path == '' ? '/' : path
// →"/"
```

## splitしてsliceして+=演算子を使う
```javascript

let path_list = 'http://localhost:3000/hoge/huga'.split('/').slice(3)
let path = ''
for(let v of path_list){
  path += (v == '') ? '/' : v
}
// →"hoge/huga"

path_list = 'http://localhost:3000/'.split('/').slice(3)
path = ''
for(let v of path_list){
  path += (v == '') ? '/' : v
}
// →"/"
```

## 不完全燃焼
* 三項演算子使わない方がいい？もう少しシンプルにしたい。replace使えばシンプルにいけそうだけど、正規表現が分からぬ…
* Javascript側、もしくはライブラリなんかでurl扱うメソッドとかない？

## ちなみにrubyの場合、URI.splitを使う
```ruby

require 'uri'
URI.split('http://localhost:3000/')
=> ["http", nil, "localhost", "3000", nil, "/", nil, nil, nil]
```

| index | urlの要素 |
|:-----------|------------:|
|0|scheme|
|1|userinfo|
|2|host|
|3|port|
|4|registry|
|5|path|
|6|opaque|
|7|query|
|8|fragment|
仮想環境での学習の手順

#注意#
ドットインストールでwindowsでのローカル開発環境が終わった前提

#学習の始め方#

##1.仮想環境を立ち上げる##
1 powershllを起動
2 Vagrantfileがある所まで移動する

```
cd MyVagrant/MyCentOS
```

3 仮想マシンを立ち上げる

```
vagrant up
```

##2.putty##
1 登録した設定をloadしてopen
  (ユーザー名とパスワード共にvagrant)

##3.cyberduck##
1 cyberduckを立ち上げる
2 ブックマークをダブルクリック
3 勉強したいフォルダやファイルを作成する

#学習の終わり方#
##1.ブラウザやエディタ,ファイル転送ツールはそのまま閉じる##
##2.putty##
puttyが動いている場合

1 Ctrl + C で終了
2 exitでログアウト

##3.仮想マシンを終了する##
1 powershellを起動
2 始めたときと同じように移動
3 仮想マシンを終了する

```
vagrant suspend
```
4 exitでpowershllからログアウト
[Laravel]socialteでRedirect URI mismatch error

## version

|laravel|5.8|
|---|---|---|
|socialite|4.1|


## 現象
ローカルマシンで開発しているlaravel5.8をherokuにデプロイしたあとsocialiteを利用したソーシャル認証が動かなくなりました。
`heroku logs`で確認するとcallbackされたリクエストが`/login/github/callback?error=redirect_uri_mismatch`となっています。

## 解法
当たり前ですが、ローカルマシンでは`localhost`をcallbackに指定していましたが、別ホストなので`config/services.php`にて`redirect`のURLも変更する必要があります。  

https://developer.github.com/apps/managing-oauth-apps/troubleshooting-oauth-app-access-token-request-errors/#redirect-uri-mismatch

`client_id`と`client_secret`は割と作り変えたりするのですがリダイレクトパスはローカルで開発し続けてるとそのままのため、つい忘れてしまい変なハマり方をしてしまいました。
何故かマニュアルでは`redirect`もハードコーディングしてしまっていますが、コールバックURLも環境によって変化する変数に違いないため`.env`経由に切り替えて、herokuへは`heroku config:set GITHUB_REDIRET`で環境変数を設定するといった風にするのがベターかもしれません。

https://readouble.com/laravel/5.8/ja/socialite.html

```php
return [
    // 省略
    'github' => [
        'client_id' => env('GITHUB_CLIENT_ID'),
        'client_secret' => env('GITHUB_CLIENT_SECRET'),
    //  'redirect' => 'http://localhost/login/github/callback',
        'redirect' => env('GITHUB_REDIRECT'),
    ],
]
```

```.env
# .env
GITHUB_REDIRCT=http://localhost/login/callback
```

```sh
$ heroku config:set GITHUB_REDIRECT=https://my-application.herokuapp.com/login/github/callback
```
WasmでalertじゃないHello Worldをする。

# 概要

`h1`タグのエレメントに`hello wasm`という文字列のテキストノードを子ノードとして追加し、その`h1`エレメントを`id`が`app`の`div`要素に挿入します。

jsで以下のコードに相当する内容です。

```js
let content = document.createElement("h1");
content.appendChild(document.createTextNode("hello wasm"));
document.getElementById("app").appendChild(content);
```

# ソースコード

## src/lib.rs

```rust
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern "C" {
    type Element;
    type Text;

    #[wasm_bindgen(js_namespace = document, js_name="getElementById")]
    fn get_element_by_id(id: &str) -> Element;

    #[wasm_bindgen(js_namespace = document, js_name="createElement")]
    fn create_element(tag_name: &str) -> Element;

    #[wasm_bindgen(method, js_name = "appendChild")]
    fn append_child_element(this: &Element, element: Element);

    #[wasm_bindgen(js_namespace = document, js_name="createTextNode")]
    fn create_text_node(text: &str) -> Text;

    #[wasm_bindgen(method, js_name = "appendChild")]
    fn append_child_text_node(this: &Element, text: Text);
}

#[wasm_bindgen(start)]
pub fn main() {
    let content = create_element("h1");
    content.append_child_text_node(create_text_node("hello wasm"));
    get_element_by_id("app").append_child_element(content);
}
```

## src/index.js

```js
import("../pkg");
```

## src/index.html

```html
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>hello wasm</title>
</head>

<body>
    <div id="app"></div>
</body>

</html>
```

# 設定

## cargo.toml

```toml
[package]
name = "hello-world"
version = "0.1.0"
authors = ["**********"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
wasm-bindgen = "0.2"
```

## package.json

```json
{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "server": "./node_modules/.bin/webpack-dev-server"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "^1.0.1",
    "html-webpack-inline-source-plugin": "0.0.10",
    "html-webpack-plugin": "^3.2.0",
    "webpack": "^4.39.3",
    "webpack-cli": "^3.3.8",
    "webpack-dev-server": "^3.8.0"
  }
}
```

## webpack.config.js

```js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");

module.exports = {
    resolve: {
        extensions: [".js"]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: path.join(__dirname, "./src/index.html")
        }),
        new WasmPackPlugin({
            crateDirectory: path.join(__dirname, "crate")
        })
    ]
};
```

# 実行

```bash
> wasm-pack build
> npm run server
```

`localhost:8080`にアクセスすると、`hello wasm`と表示されるはずです。
[Notch] StandAloneで頑張るために その6

（無駄が多いので、お忙しい方は最後のまとめをご覧ください！）

ガスト ノッチ!!!!!!!! 千田です!!!!

なんだかバタバタと日々が過ぎていまして、
ドームツアーも終わり、中国仕事も終わり、ひと段落。。
気が付いたらもうすぐ10月。はえーなぁー。。。
しばらく、書けないでいまして、
備忘録としてここに書くつもりが、その前に色々と忘れてしまっていました。
とほほです、、、、

が、、しかし、その間にこのqiitaをもとに講演もさせていただきました。
ご来場頂いた方ありがとうございました。

その時色々まとめをやって、やっと思い出しましたので、また、書いていきます。

それでは早速！！

##StandAloneで頑張るために その6
みなさま、もうすっかり忘れているかと思います。。。進行の順番。
順番がかわりますが、、、
4、送出の問題　を先に書こうかと思います。

実際作った映像を送出するにあたり色々と解決しなければならないこと、気になる事があります。
箇条書きにしますと、

・必要な画面は何画面？
・どうやって出力するの？
・ライセンスによって出力できなかったりする？
・書き出したアプリケーションの実行モードの違いは？

と言ったところでしょうか。
では、一つずつ

・必要な画面は何画面？
実際にオペレーションする際、僕の場合は、いろいろなパラメータの確認を行いながらオペレーションをしたいです。
タイムラインを使用している際は、現在の時間、現在コンピュータは毎秒どれくらいのフレーム処理をしているか？
つまみやボタン、フェーダーで変化を与えられる仕組みを持っていた場合はそのパラメータ情報を見たい。
カメラ映像を使用している場合は、それらの状況も確認したい。

という事で、それらの情報を含んだプレビュー画面が１つ。
残りは、実際に送出に必要な画面に合わせた画面数となります。

そのことから、最低でも２画面の送出が必要になります。

でも、そもそもStandAloneでマルチ画面って出せるんだっけ？
マニュアルを見てみるとStandAloneでできないことに、

Outputting to multiple heads

と書いてあります。

んーどうなんだろう？
やってみよう！という事でチャレンジ。

・どうやって出力するの？
Notchではプロジェクトで設定したOutput画面を元に、そこから切り出して各画面に出力することができます。
Projectメニュー内のEdit Output Feed Configurationが、それをやるための機能です。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63228/d4caeead-c808-0bc1-3fca-e64c0c9bf5be.jpeg)

プロジェクションマッピングで使用するMadMapperとかResolumeのOutputのAdvanceの機能に近いイメージです。
出力画面から、どの部分をどのモニターのどの部分に表示するかを設定する機能です。
Displayで出力モニタの解像度を設定して、Feedで「どの部分」を「どこの場所をどのサイズで」表示するかを決めます。
文字で書くとややこしいので、これは実際に触ってみてください。。。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63228/c92261b0-1023-b707-eb2a-53bedc81e8ec.jpeg)

この機能をうまく使って、送出用のOUT画面とオペレーション用のインターフェースを含んだ画面を切り分けて表示させて使っています。


・ライセンスによって出力できなかったりする？
さてこれですが、Proライセンスだとシングルモニターへの表示しかできません。。（マルチだとウォーターマークが表示されます）
マルチモニター出力が必要な場合はPlaybackライセンスが必須となります。
なので、Proライセンスで戦う方法としては、ミラーリングという方法があります！

書き出したアプリケーションの実行モードの違いは？
Standaloneで書き出すと、実行用のモードがいくつか出てきます。
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63228/3d66833f-d777-d830-9a97-f53b55de6181.jpeg)

この中で
-FullScreen
-Vsync
についてですが、
どうやらFullScreenにチェックを入れなくてもマルチ出力できるようです。
なので、僕はFullScreenを使用していません。
ただ、各項目のチェックを入れると挙動が変わります。

マルチスクリーン出力時
-FullScreenオン　Vsyncオン　の場合。
出力先のモニター同士のVsyncタイミング待つため、挙動が遅い感じです。
Vsyncがかかっているので、最速でもDisplayのリフレッシュHzに依存した速さ、よくある場合6０Fpsの速度またはそれ以下になります。


-FullScreenオフ　Vsyncオン　の場合。
出力先のモニター同士のVsyncタイミングを待たず、各々のVsyncで動くせいか、さっきよりは軽い感じです。
ですが、Vsyncがかかっているので、最速でもDisplayのリフレッシュHzに依存した速さ、よくある場合6０Fpsの速度またはそれ以下になります。
ただ、極端に早く処理をしたりすることなく、60Fpsで動いてくれるので、毎回同じような挙動を保証してくれるて、安心です。

-FullScreenオフ　Vsyncオフ　の場合。
出力先のモニター同士のVsyncタイミングを待たず、また、おのれのディスプレイのVsyncも待たないので、早いです。
ただ、、、気ままだったりします。
VSync入れてないと、テアリングノイズが出たりするのかなぁと思っていたのですが、最近のGPUの性能なのか、全く映像が割れたりしません。
Gsyncとかのおかげなのでしょうか？
ただ、気ままに動いたりするので処理速度依存の動き物があったりすると、厄介かなぁと思ったりします。
センサーなんかから情報取得して、結果出す場合は、このモードの方がいいかもしれません。


さて、ひとまず送出の問題　　主にマルチ画面出力について書いてきました。

まとめ。
・必要な画面は何画面？
僕は２画面以上
・どうやって出力するの？
Projectメニュー内のEdit Output Feed Configurationを使います。
・ライセンスによって出力できなかったりする？
します。マルチの場合Playbackライセンスは必須。
・書き出したアプリケーションの実行モードの違いは？
状況によって変える必要あり。


それでは今回はここまで。また次回ー！！！！！！！！！！！！！！！！！
9/7 Tech Expert (事前学習) day 8　/　繰り返し処理

【学習アウトプット】

#今日の目標(やること)
Ruby!
思考がもつところまで！
（もはや毎日こんなんだけど笑）

##今日のまとめ
###アルゴリズム
ある目的を達成するための処理の手順、段取り。
目的を達成するためにどのようにプログラムを組んだらいいか考えること
答の導き出し方。

（アルゴリズムに関して説明している外部サイト↓↓ イメージ湧きやすかったです。）
[プログラミングにはアルゴリズムへの理解が必要！その必要性と学び方とは？](https://style.potepan.com/articles/4797.html)



###繰り返し処理
ある決まった処理を繰り返し行うこと。
決まった回数や条件を満たしている間は処理を繰り返す。
繰り返し処理を行うための文法にはfor、each、whileなどがある。

#### while文
```rb:while文
  while 条件式 do
    # 処理を実行する
  end
```
whileは条件式で繰り返すかどうかを決める。
条件式が真(true)のときは処理を繰り返す。
いつまでも処理が終わらない無限ループに入ったらターミナルで「control + c」で強制終了


```rb:１−１０までを順に足すプログラム
sum = 0
number = 1
 while number <= 10 do
   sum += number
   puts sum
   number += 1
 end
```
 

####自己代入演算子
自分自身に代入する演算子
通常の演算子を用いた書き方に直すことができる。
自己代入演算子を使うと変数自身に演算を行うときに簡単に記述できる
（下の２つ、同じ式）
・number += 1
・number = number + 1

主な自己代入演算子
+= (例)number += 1
-= (例)number -= 2
*= (例)number *= 3
/= (例)number /= 4


####exitメソッド
同じ処理をずっと繰り返すループから抜けるのにつかう。
処理を強制的に終了させるメソッド。
「control + c」と同じ役割。
(今回はwhile文による無限ループからプログラムを終了させるために使用)

```rb
  while true do
    exit  # ここでプログラムが終わる
    puts "Hello World" # これは呼ばれない
  end
```

２段めで exit しているため、それ以降の処理（ puts "Hello World" ） は実行されない。 




```rb:exitと入力するまでずっと処理を続けるプログラム
 while true do
    input = gets.chomp      
    if input == "exit" then 
      exit
    end
    puts "ループ中"
  end
```

##〜独り言(まとめやら感想やら)〜
朝イチで勉強モードになっていたため気合入れてとりかかろうとしたら、初『編集リクエスト』が！（最初「クレーム？！何？！(・・;)」と焦った笑）
感激☆テンション上がりましたｗ

scivolaさんありがとうございます！早速つかわせていただいておりますｗ
どうやってやるのかなーと思いながら、スルーしてカリキュラムすすめることを優先していたのですが、すごく見やすくなりました☆今後ともご指導のほどよろしくお願いいたします☆

13...12日目に事前学習（Tech Expert）を解約する予定です。それまでにRuby終わらせられますように🙏
数検１級 (10) 整数

# 問題

正の整数 $n$ に対して

$$a_n = \left\lfloor \frac{2017}{n} \right\rfloor$$

とします。この時、$a_1, a_2, a_3, \dots, a_{2017}$ の中に異なる整数は何個含まれますか。ただし、$\lfloor x \rfloor$ は、実数 $x$ に対して、$x$ 以下の最大の整数を表します。

<details><summary></summary><div>

# 解答

定義より、$a_1 = 2017, a_2=1008, a_3=672$ を得る。このように、$n$ が小さい時、$a_n$ の値は厳密に減少していく。

一般に、$a_n = m, n < m$ のとき、$a_{n+1} > m$ が成り立つ。

**証明**

$(n+1)m > 2017$ を示せば良い。
$a_n=m$ ならば、$nm \le 2017 < n(m+1)$ が成り立ち、さらに $n<m$ ならば 
$2017 < n(m+1) = nm + n < nm+m = m(n+1)$.

-----

したがって、$a_n = m, n < m$ となるケースでは、$a_n$ の値はすべて異なる。

$n$ と $m$ の大小関係の切り替わりを見つけるには、$\sqrt{2017}$ 付近を探せば良い。$44 < \sqrt{2017} < 45$ なので、$n=44$ を考えると、$a_{44} = 45$ であることがわかる。つまり、$a_1, \dots, a_{44}$ はすべて異なる。

さらに、$n$ と $m$ を入れ替えたケースを考えると

$a_n = m, n < m$ であれば $a_m = n$ となることを示すことができる。

**証明**

$nm \le 2017 < m(n+1)$ を示せば良い。
$a_n = m$ であるので、$nm \le 2017 < n(m+1)$ である。くわえて、$n < m$ であるので、$n(m+1) = nm+n < nm+m = m(n+1)$.

-----


したがって、$a_{45} = 44, \dots, a_{1008}=2, a_{2017} = 1$ が成り立ち、右辺は連続する整数であるためすべて異なり、かつこれ以外の値をとるものは存在しない。
したがって、異なる値の個数は $44 \times 2 = 88$.

# 感想

* １次の計算問題なので、厳密な証明は不要だが、パターンに気づけるか。
* これといって対策のしようがないように思う。

</div></details>
AWSとGCPのログインユーザ、組織、プロジェクト、環境構成の差異

##はじめに

マルチ環境、マルチアカウントを前提としたAWSとGCPのユーザ、組織、プロジェクト、環境構成の違いについて書きたいと思います。

それぞれのクラウドにおける用語の対応表は以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/c36df01b-7780-fcd6-62e3-01e0887a697e.png)


##AWSにおけるマルチ環境、マルチアカウント構成
AWSにおけるマルチ環境、マルチアカウント構成は、AWS Organizationという機能を使った管理が推奨となります。

https://aws.amazon.com/jp/organizations/

イメージ的には以下のような形です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/98b2399f-f873-8e1a-8fc6-192315ba34c4.png)

組織を管理するAWSマスターアカウントがあり、Rootを頂点としたツリー構造をとり、各OUにAWSアカウントが入る構成となります。RootやOU,AWSアカウントに対してSCP(Service Constrol Policy)を付与することにより、使用できる機能の制限がなどが可能となります。AWSのマスターアカウントに対してはSCPを付与することができません。

マネジメントコンソールへのログインは、基本的に各AWSアカウントでIAMユーザを作成してパスワード認証によりログインして、ComputeやStorageといったリソースを作成管理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/f4388697-4fcd-d395-336a-3cdfe4baec66.png)




上記だと、IAMユーザ管理が煩雑になるため、IAMユーザの代わりにIAMロールを各AWSアカウントに作成し、一度任意のIAMユーザでログインした後、別のAWSアカウントにSwitch Roleする運用も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/24ca6ad1-fae6-2029-fdf2-d2c0922aa5b7.png)

Switch Roleを手動で行うには、移動先のAWSのアカウントのIDやIAMロール名を入力する必要があり、ログイン作業が煩雑になることもありAWS SSO機能追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/eec47555-61d9-e5d1-65a2-2e037985c5d0.png)

SSOを利用すると、SSO画面からログインする対象のAWSアカウントを選択することでログインすることできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/68a9dfb1-6707-877e-0153-93f9426e893a.png)

SSOのユーザデータベースは、SSOのビルトインのもや、既存のActive Directoryとの連携が可能です。

##GCPにおけるマルチ環境、マルチアカウント構成

AWSのIAMユーザユーザがAWSアカウントに紐づくのと異なり、GCPは、ユーザ個別にGoogleアカウントを払い出し、Googleアカウントに対して任意のプロジェクトへの権限を付与する形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/a1a11d5f-a625-e9fd-0ed7-410718290d29.png)

##投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
画像分類入門

### これはなに？
GCPを使った異常検知、分類など画像分類系タスクについてのまとめ。主に自分のためのメモです。

### 試すと良いモデルの順番
下にいくほど層が深くSensitiveな問題に対処可能。
1. 3-4層のCNN
2. VGG16（13層畳み込みNN）
3. Resnet : 万能近似定理が起きやすい（表現力がする跳ね上がる=過剰適合しやすい）ので繊細な識別に利用する
またはインセプションGoogleNet
1x1, 3x3, 7x9 というようなフィルタのサイズを色々試して重み付けする（畳み込みNNのアンサンブル学習みたいな）
4. DenseNet: 比較的バランスがとれている（不均衡でない）データに向いている。

###異常検知系で試すこと
- Segmentation
犬猫みたいなわかりやすい分類だったらピクセルのヒストグラムを作ってそこで分類することもあるが、異常検知のような場合はEDAはほどほどにしてまずモデルを作るのが大事。

- Unet
 - オートエンコーダーのようなセグメンテーション向けモデル(アーキテクチャ)。不良検知によく使われる
 - DEFECTが4種類ある場合、あるDEFECTとそれ以外の画像でUNETを試してみる、ということを繰り返しUNETを4つ作る。
出力層をSigmoid関数でFittingしてクロスエントロピーで学習
 - 懸念点：不均衡データの場合にどれだけsigmoid関数が耐えられるか。SMOTEを使うと異常な画像をとってきてPixelの平均をとってそこに重み付き乱数で水増しをしてくれる。GANは正常画の水増し用なのであまり適してない。UNETではDEFECTの有無で分類してから、DEFECTがある画像のみを入れたほうが良い
 - 複数の種類の画像が混じってる場合、はじめにクラスタリングする必要あるかも

### 異常分類で試すこと

- 不均衡データに対応するため、分類再構成を試して正常な画像からどれくらい異常値が離れてるかを学習することが多い。つまり、Stackedオートエンコーダーや Denoising Auto Encoderなどノイズをキャンセルするようなことができるエンコーダーを事前学習しておく。
正常画像からどれだけ離れてるかを識別するのが大切
[参考](https://blog.keras.io/building-autoencoders-in-keras.html)

- はじめに正常、異常な画像に分類してから、さらに異常な画像の中でどのような異常に該当するのかさらにクラス分類するようなケースの場合、アカデミック的には分類とDetectionを分けずに一つのパイプラインで実行したほうが良い。[参考](https://horomary.hatenablog.com/entry/2019/07/28/124000)
MacOSで解析環境構築(JupyterLab)

# MacBook Proを購入したので環境構築した時のメモ

自宅PCでデータ解析環境を構築。anaconda環境では、入らないものもあったり余計なものも入っていたりするので、anaconda以外で構築した。

# Homebrewをインストール
ターミナルでコマンド実行

```Terminal.app
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# python3とpipをインストール
さっきインストールしたHomebrewでpython3をインストール

```Terminal.app
$ brew install python3
```

## それぞれバージョンの確認
```Terminal.app
$ python3 --version
$ pip3 --version
```
※インストールしたバージョンは python3.7.4、pip 19.1.1でした

# JupyterLabのインストール
```Terminal.app
$ pip3 install jupyterlab
```
そんなに時間はかからない

# JupyterLabの起動
```Terminal.app
$ jupyter lab
```
※自動でSafariで立ち上がるので、ターミナル上に書かれているパスワードをコピー

```Terminal.app
$ http://localhost:8888/?token=c66************************
```

※chromeとかで「http://localhost:8888/lab」
を立ち上げコピーしたパスワード使ってログイン

# Nodejsをインストール
jupyterlabのいい機能だと思っているMarkdown機能とかを活用するためにnodejsを入れないといけない

```Terminal.app
まずはNodebrewからインストール
$ brew install nodebrew

バージョン確認
$ nodebrew -V

nodejsを入れられるバージョン確認
$ nodebrew ls-remote

最新版をインストール
$ nodebrew install-binary latest

インストールの確認
$ node -v
```

ここまできたら、もうほぼ終わり

# Jupyterlabの拡張
jupyterlab上のタブで "Setting" →　"Enable Extension Manager(experimental)"をチェック!

<img width="950" alt="jupyterlab_ss.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358315/9e324ba0-ce76-b56c-9489-5d75536ab242.png">

あとは、パズルのピースみたいな形のタブ上から
・jupyterlab/toc(Markdown記述)
・jupyter-widgets/jupyterlab-manager(tqdmのプログレスバー用)
・telamonian/theme-darcula(黒い方がかっこいい)
を選択してインストール

![jupyterlab_ss2.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358315/2a7fac74-0a81-364e-7df6-5bf6353a3d5f.jpeg)

終わり。
お疲れ様でした。

# 参考：
https://qiita.com/katuemon/items/dd9f4dfd9a9e590d67a6
https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09
https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c
テーブルからカラムを削除する

## 3行で

- ターミナルにコマンドを書いてmigrationファイルを作る
- migrationファイルの中身を編集する
- `rails db:migrate`

## くわしく

今回の場合、**usersテーブル**から**ageカラム**を削除したい。

```terminal
$ rails g migration RemoveAgeFromUsers
```

実行するとmigrationファイルが作られる。
こちらを編集する。

```ruby:作成されたmigrationファイル
class RemoveAgeFromUsers < ActiveRecord::Migration[5.2]
  def change
    remove_column :Users, :age, :integer
  end
end
```

ポイントは**データ型を書く**こと。
問題なければ下記のコマンドを入力する。

```terminal
$ rails db:migrate
```
【Vuex】CDNでVuexの最初の一歩を踏み出す

CDNでVuexの機能を試してみます。内容はこれだけです。

- state
- mutations
- storeオプション

公式サイトに掲載されているコードは、CDNではなく各パッケージのインストールを前提とした内容です。
なので、あくまで動作を簡単に確認したい場合にお試しください〜

# 参考サイト
Vuexの概要についてはこちらを参考にしました。とても丁寧に説明されています。
[Vue.js + Vuexでデータが循環する全体像を図解してみた](https://qiita.com/m_mitsuhide/items/f16d988ec491b7800ace)

ソースコードは[公式サイト](https://vuex.vuejs.org/ja/)からまるっとお借りしました。
記事の内容は、下記の範囲になります。

- [インストール](https://vuex.vuejs.org/ja/installation.html)
- [Vuex とは何か？](https://vuex.vuejs.org/ja/)
- [Vuex 入門](https://vuex.vuejs.org/ja/guide/)

実際の動きを見たい場合は、[Scrimba](https://scrimba.com/)の動画レッスンが分かりやすいです。
音声は英語ですが、ソースは読めるかと思います。

- [Getting Started with Vuex 💪](https://scrimba.com/p/pnyzgAP/cMPa2Uk)
- [Create Vuex Store and use it to hold state](https://scrimba.com/p/pnyzgAP/cWw3Zhb)

# ディレクトリ構成
これだけです。

```
vuex_test
  ├── index01.html
  └── index01.js
```

# ソースコード

## index01.html

```index01.html
<html>
<head>
  <meta charset="utf-8">
  <title>vuex_test</title>
  <!-- Vue.js(開発バージョン) -->
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <!-- Vuex -->
  <script src="https://unpkg.com/vuex"></script>
  <!-- Vuexを使うときはPromiseも必要 -->
  <script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js"></script>
</head>
<body>
<div id="app">
  {{ count }}
</div>
<script src="index01.js"></script>
</body>
</html>
```

## index01.js

各パッケージををインストールして使用する場合と、若干書き方が異なります。

```index01.js
// cdn(グローバルなスクリプトタグ)でパッケージを呼び出している場合は記述しない
// import Vue from 'vue';
// import Vuex from 'vuex';
// Vue.use(Vuex);

// ストアオブジェクトの作成
const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {
        increment(state) {
            state.count++
        }
    }
});

// ミューテーションを通してストアの状態を変更する(countを直接変更しない)
// そのため状態の変更を明確に追跡できる
store.commit('increment');
// ストアの状態を参照する
console.log(store.state.count);

new Vue({
    el: '#app',
    // ストアの状態をコンポーネント内で使うには、算出プロパティ内で状態を返す
    computed: {
        count () {
            return store.state.count
        }
    }
});
```

``storeオプション``を使用することにより、このような書き方もできます。
以下、公式サイトからの引用です。
>ルートインスタンスに store オプションを渡すことで、渡されたストアをルートの全ての子コンポーネントに注入します。これは this.$store で各コンポーネントから参照することができます。

```index01.js
new Vue({
    el: '#app',
    // storeオプションを使用
    store,
    computed: {
        count () {
            return this.$store.state.count;
        }
    }
});
```

しかし、ヘルパーなどの機能を使いたい場合はCDNだと厳しそうですね・・・（あまり情報出てこないし、そもそもCDNを使う利点があるか不明。）
既存のテーブルに外部キー（ナントカid）を追加する

## 3行で

- ターミナルにコマンドを書いてmigrationファイルを作る
- migrationファイルの中身を確認する
- `rails db:migrate`

## くわしく

今回の場合、**itemsテーブル**に**user**の外部キーである**user_id**を追加したい。

```terminal
$ rails g migration AddUserToItems user:references
```

実行するとmigrationファイルが作られる。

```ruby:作成されたmigrationファイル
class AddUserToItems < ActiveRecord::Migration[5.2]
  def change
    add_reference :items, :user, foreign_key: true
  end
end
```

問題なければ下記のコマンドを入力する。

```terminal
$ rails db:migrate
```
【Processing】02.図形を出す、色を変える【★✩✩✩✩】

#図形の種類

様々な図形をProcessingは用意してくれています。その中でも初心者向けで、よく使われている図形を紹介します。
※注意
今回から画面の座標についてをやっていきます。基本的にxは横、yは縦と覚えましょう。他にも横幅のことはw、縦幅のことをhで表すことがあります。rは半径のことを指すことが多いです。

-  長方形はrect(x,y,w,h);左上角のx座標,y座標,横幅,縦幅の順番で書く
-  円はellipse(x,y,r,r); 中心のx座標,y座標,横幅,縦幅の順番で書く
-  線はline(xs,ys,xe,ye);始まりの点のx座標y座標、終わりの点のx座標,y座標の順番で書く
-  文字はtext(“hoge”,x,y,w,h);表示したい文字列,x座標,y座標,横幅の表示範囲,縦幅の表示範囲の順番で書く

図形じゃないじゃん！というものも紛れていますが、とりあえず書いてみましょう。

```java:fukube.pde
void setup(){
  size(1000,500);//ウィンドウのサイズ
  rect(50,50,100,100);
  ellipase(500,250,200,200);
  line(0,500,1000,0);
  text("ajitama",400,50,500,100);
}
void draw(){

}
```

数字を変えたり、複数の図形を描いたりしてみましょう。なにか簡単な絵や図を描けるといいですね！

#色の変え方

fill(色)で塗りつぶす色、Stroke(色)で線の色を設定できます。設定した色は書いた行より下に反映されます！

```java:fukube.pde
void setup(){
  size(1000,500);//ウィンドウのサイズ
  fill(255,0,0);
  rect(50,50,100,100);
  ellipse(500,250,200,200);
  stroke(0,255,0);
  line(0,500,1000,0);
  fill(0,0,255);
  text("ajitama",400,50,500,100);
}
 void draw(){

}
```

#これをやってメンターに見せよう！

##ミッション

さっき書いた絵に色をつけてあげよう。
部活用に用意したAtCoderの問題30問

## 部活用に用意した
部活の一年生に解いてもらう問題を30問用意しましたので共有用に記事にしました．
ラボ配点は僕のさじ加減です． アドバイスは適当です．
それだけの記事です．ご勘弁を...．

|問題名|ラボ配点|アドバイス|
|---|---|---|
|[A - 加算王](https://atcoder.jp/contests/abc023/tasks/abc023_a)|100|割ったり，余りを求めたり|
|[A - 高橋直体](https://atcoder.jp/contests/abc039/tasks/abc039_a)|100|数学ですね...|
|[A - 高橋くんと年齢](https://atcoder.jp/contests/abc019/tasks/abc019_1)|100|全パターン書いても良いけど工夫しよ|
|[A - プレミアム会員](https://atcoder.jp/contests/dwango2015-prelims/tasks/dwango2015_prelims_1)|100|何ヶ月が安い期間ですかね|
|[A - K-City](https://atcoder.jp/contests/abc069/tasks/abc069_a)|100|区切られてる個数と道の数は違うよ|
|[A - Rating Goal](https://atcoder.jp/contests/abc076/tasks/abc076_a)|100|ノーコメントかな|
|[A - Swimming](https://atcoder.jp/contests/cpsco2019-s4/tasks/cpsco2019_s4_a)|100|小学生の算数の集大成っぽい|
|[A - Fighting over Candies](https://atcoder.jp/contests/abc047/tasks/abc047_a)|100|どういう風に分けるのが最適なのか考えてから実装しよう|
|[A - Infinite Coins](https://atcoder.jp/contests/abc088/tasks/abc088_a)|100|余り使うと賢いです|
|[A - Buying Sweets](https://atcoder.jp/contests/abc087/tasks/abc087_a)|100|賢い解き方あります|
|[A - ヘビがヘビー](https://atcoder.jp/contests/tkppc4-1/tasks/tkppc4_1_a)|100|閃きが重要ですね|
|[A - 一問目](https://atcoder.jp/contests/iroha2019-day1/tasks/iroha2019_day1_a)|100|文字列の基礎問題|
|[A - Rotation](https://atcoder.jp/contests/abc077/tasks/abc077_a)|100|文字列のアクセス方法をしっかりと|
|[A - Join the Company](https://atcoder.jp/contests/tkppc2/tasks/tkppc2016_a)|100|文字列の合成とか考えず出力の仕方を|
|[A - おつり](https://atcoder.jp/contests/joi2008yo/tasks/joi2008yo_a)|100|余りとか使えばfor文いらないね|
|[A - Zero-Sum Ranges](https://atcoder.jp/contests/agc023/tasks/agc023_a)|200|連続してというのがミソ|
|[A - UTPC](https://atcoder.jp/contests/utpc2013/tasks/utpc2013_01)|200|賢い書き方をすれば短いけど...|
|[A - The longest distance](https://atcoder.jp/contests/arc004/tasks/arc004_1)|200|単純な全探索 & 型に注意|
|[B - Palindromic Numbers](https://atcoder.jp/contests/abc090/tasks/abc090_b)|200|桁毎に取り出す方法とか覚えてる?|
|[A - Where's Snuke?](https://atcoder.jp/contests/cf16-final/tasks/codefestival_2016_final_a)|200|ASCIIコード使うと結構簡単な実装に|
|[B - Sum of Three Integers](https://atcoder.jp/contests/abc051/tasks/abc051_b)|200|全部調べる必要はないですよね?|
|[B - n^p mod m](https://atcoder.jp/contests/atc002/tasks/atc002_b)|300|解説があるので実質200点では?|
|[B - Rewrite](https://atcoder.jp/contests/tkppc2/tasks/tkppc2016_b)|300|ナップザック問題で検索〜.検索〜.|
|[C - Otoshidama](https://atcoder.jp/contests/abc085/tasks/abc085_c)|300|２種類のお札を確認すればそれでもう判別出来ますよね?|
|[B - Grid Compression](https://atcoder.jp/contests/abc107/tasks/abc107_b)|300|bool型使えばコンパクトに?|
|[C - GeT AC](https://atcoder.jp/contests/abc122/tasks/abc122_c)|300|全探索すると間に合わないよ|
|[C - Many Formulas](https://atcoder.jp/contests/arc061/tasks/arc061_a)|300|再帰関数使うと簡単|
|[C - Train Ticket](https://atcoder.jp/contests/abc079/tasks/abc079_c)|300|再帰関数で全てのパターンを確認でOK|
|[B - 弾幕ゲーム](https://atcoder.jp/contests/kupc2018/tasks/kupc2018_b)|300|これ元の配点200点らしい...|
|[A - 深さ優先探索](https://atcoder.jp/contests/atc001/tasks/dfs_a)|400|難問だけど１年生も解説あるので解けるかも|
Ansible ローカルのテンプレートファイルリストをリモートのファイルリストと一致させる

# 定義
ローカルサーバー：Ansibleを動かすサーバー
リモートサーバー：Ansibleによりコンフィグ配付するサーバー。

# はじめに
Ansibleを実行するローカルサーバー側の特定ディレクトリに.j2ファイルを配置してリモートに設定。
その際ローカルサーバーのディレクトリの内容を丸々リモートのディレクトリに設定、というのはよくやるかと思います。

```yml:ローカルのテンプレートを持ってくイメージ
- name: "set nagios template file"
  template:
    src: "{{ item }}"
    dest: "/tmp/template_test/{{ item | basename | regex_replace('\\.j2$','') }}"
    mode: 0644
  with_fileglob:
    - "../templates/confs/*.j2"
```

この方法の問題は不要になったファイルをローカルから消したり、リネームしたりしてもリモートにファイルが残り続けてしまうことかと思います。
当初は削除対象一覧の変数を作る方法も考えましたが、管理が非常に面倒なのであきらめました。

ということで、削除前にリモートのファイルをローカルと比較して、存在しなければ削除するようにしました。
なお、再帰は考えていなかったので子ディレクトリもやりたければ複数書くことになります。

不格好ですができたはできたので備忘のために投稿します。
パスなどはべた書きしたので必要に応じて変数化してください。


```yml:やりかた

- name: "リモートサーバーのファイル一覧を取得"
  find:
    paths: "/tmp/template_test/"
    patterns: "*"
    file_type: "file"
  register: _template_remote_server_conf_files
- name: "リモートサーバーのファイル名のみをカンマ区切りで取得"
  set_fact:
    _template_remote_server_conf_filename: "{% for filename in _template_remote_server_conf_files.files | map(attribute='path') | list %}{{ filename | basename }}{% if not loop.last %},{% endif %}{% endfor %}"
- name: "リモートのファイル名をリスト化して取得"
  set_fact:
    template_remote_server_conf_filename:
      "{{ _template_remote_server_conf_filename.split(',') }}"

- name: "ローカルのテンプレートファイル一覧を取得"
  find:
    paths: "/etc/ansible/roles/settemplates/templates/confs/"
    patterns: "*"
    file_type: "file"
  register: "_template_ansible_server_conf_files"
  delegate_to: "localhost"
  run_once: "true"
- name: "ローカルのテンプレートファイル名のみをカンマ区切りで取得"
  set_fact:
    _template_ansible_server_conf_filename: "{% for filename in _template_ansible_server_conf_files.files | map(attribute='path') | list %}{{ filename | basename | regex_replace('\\.j2$','') }}{% if not loop.last %},{% endif %}{% endfor %}"
- name: "ローカルのファイル名をリスト化して取得"
  set_fact:
    template_ansible_server_conf_filename:
      "{{ _template_ansible_server_conf_filename.split(',') }}"

- name: "リモートにあってローカルにないファイル名のファイルを削除"
  file:
    paths: "/tmp/settemplates/{{ item }}"
    state: "absent"
  when:
    - "item != ''"
    - "item not in template_ansible_server_conf_filename"
  with_items: "{{ template_nagios_server_conf_filename }}"
```

# お願い
Ansibleは趣味でいじり始めて1年程度で、無理やりこねくり回した感が溢れているかと思います。
他に良いやり方があれば是非教えて下さい。
正直モジュールが無いわけない気がするのですが見つけられませんでした。
オフラインどう書く第七回解答

問題はこちら->http://nabetani.sakura.ne.jp/hena/ord7selectchair/

座る規則を
rule1(席の位置,席のリスト,規則に合う席候補１,規則に合う席候補2,規則に合う席):-ルール
で表します。上に書いてある規則が上位の規則です。
人が座るときは、椅子のリストの前後に空席を加えたものの左端から3つ一組で、
cond/3で規則と比べながら一つずつ右にずらしていきます。
規則に適合した席がみつかった時に最上位の規則なら終了ですが、
その他はすぐリストに書き込んでしまいますと、上位の規則が当てはまった時に困りますので、
要素の位置のみ記録して(P1がP2より優位)、最後にリストに書きこみます。
立ち去るときはdel/3です。
全員の席が決まったら両側の空席を削除します。
規則と比べる部分がprologだと書きやすい気がします。

```Prolog
%swi-Prolog  version 7.4.2
%start.
%:-initialization(start).   %　ideone

rule1(_,[_,_],P1,P2,R):-
     var(P1)->R=P2;R=P1,!.   %usiro kara kangaereba P2 ha iranai?
rule1(N,[X,Y,Z|_],_,_,R):-
     X=='-',Y=='-',Z=='-',!,R=N.
rule1(N,[X,Y,Z|T],P1,P2,R):-
     Y=='-',(X=='-';Z=='-'),var(P1),!,N1 is N+1,rule1(N1,[Y,Z|T],N,P2,R).
rule1(N,[_,Y,Z|T],P1,P2,R):-
     Y=='-',var(P1),var(P2),!,N1 is N+1,rule1(N1,[Y,Z|T],P1,N,R).
rule1(N,[_,Y,Z|T],P1,P2,R):-
     N1 is N+1,rule1(N1,[Y,Z|T],P1,P2,R).

del(L,X,L1):-upcase_atom(X,X1),nth1(N,L,X1,L2),nth1(N,L1,'-',L2).

cond([],L,L).
cond([H|T],L,R):-
     atom_codes(H,[C]),
     (C>96->del(L,H,L1);(rule1(2,L,_,_,N),nth1(N,L,_,L2),nth1(N,L1,H,L2))),
     cond(T,L1,R).

solve(N,L,R):-
     N1 is N+2,length(L1,N1),maplist(=('-'),L1),cond(L,L1,[_|T1]),
     reverse(T1,[_|T3]),reverse(T3,R1),atomics_to_string(R1,R),!.

start:-str(S),split_string(S,"\s\n","\s",L),pre(L).

pre([]).
pre([_,B,Q|T]):-
     concat_atom([S1,S2],":",B),atom_number(S1,N),atom_chars(S2,L),
     solve(N,L,R),disp(R,Q),pre(T).

disp(R,A):-(A==R->Str=" pass ";Str=" fail "),write(Str),writeln(R).

str("1  6:NABEbBZn      -ZAB-E
2       1:A     A
3       1:Aa    -
4       2:AB    AB
5       2:AaB   B-
6       2:AZa   -Z
7       2:AZz   A-
8       3:ABC   ACB
9       3:ABCa  -CB
10      4:ABCD  ADBC
11      4:ABCbBD        ABDC
12      4:ABCDabcA      -D-A
13      5:NEXUS         NUESX
14      5:ZYQMyqY       ZM-Y-
15      5:ABCDbdXYc     AYX--
16      6:FUTSAL        FAULTS
17      6:ABCDEbcBC     AECB-D
18      7:FMTOWNS       FWMNTSO
19      7:ABCDEFGabcdfXYZ       YE-X-GZ
20      10:ABCDEFGHIJ   AGBHCIDJEF").
```