OmniAICreator/Qiita-1.07M huggingface dataset:
chart.jsを初めて使ってみました

組み込み系で今ままでJavascriptをあまり使ってこなかった事を悔い改め、
今回chart.jsを初めて使ってみました。

# 環境
Mac (OS High Sierra 10.13.6)

# chart.js のインストール

```
$ npm install chart.js --save
```

# ファイルの準備

index.html/chart.htmlを準備する。

```
$ mkdir test
$ cd test
$ ls
index.html   # インデックスファイル
chart.html   # chart.jsを使うファイル
```

### index.html

```html:index.html
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Sample</title>
</head>
<body>
<h1>sample</h1>
  <p>
    <a href="chart.html">chart-棒グラフ</a>
  </p>
</body>
</html>
```

### chartjsを使用したファイルの準備

以下のchart.htmlを使わせて頂きます。

> [Chart.jsでグラフを描画してみた](https://qiita.com/Haruka-Ogawa/items/59facd24f2a8bdb6d369)
> [Chart.jsでグラフを描画してみた ２](https://qiita.com/Haruka-Ogawa/items/392e26123f7e9618a47b)

```html:chart.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
　<title>グラフ</title> 
</head>
<body>
  <h1>棒グラフ</h1>
  <canvas id="myBarChart"></canvas>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.js"></script>

  <script>
  var ctx = document.getElementById("myBarChart");
  var myBarChart = new Chart(ctx, {
    type: 'bar',
    data: {
      labels: ['8月1日', '8月2日', '8月3日', '8月4日', '8月5日', '8月6日', '8月7日'],
      datasets: [
        {
          label: 'A店 来客数',
          data: [62, 65, 93, 85, 51, 66, 47],
          backgroundColor: "rgba(219,39,91,0.5)"
        },{
          label: 'B店 来客数',
          data: [55, 45, 73, 75, 41, 45, 58],
          backgroundColor: "rgba(130,201,169,0.5)"
        },{
          label: 'C店 来客数',
          data: [33, 45, 62, 55, 31, 45, 38],
          backgroundColor: "rgba(255,183,76,0.5)"
        }
      ]
    },
    options: {
      title: {
        display: true,
        text: '支店別 来客数'
      },
      scales: {
        yAxes: [{
          ticks: {
            suggestedMax: 100,
            suggestedMin: 0,
            stepSize: 10,
            callback: function(value, index, values){
              return  value +  '人'
            }
          }
        }]
      },
    }
  });
  </script>
</body>
</html>
```

# httpサーバの起動

index.htmlのあるディレクトリで以下を実行

```
$ python -m http.server 8000
```

# アクセス

webブラウザから、localhost:8000 にアクセスしてchart.jsのグラフが表示されればOK
<img width="317" alt="スクリーンショット 2020-05-01 19.06.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/886abd6d-f438-7671-cfe6-d8e23658e973.png">

データの可視化に便利かな？（今はもっと良いライブラリがある？）

# 課題
- もっと良い可視化ライブラリを探してみる
- データの読み書き方法について調べてみる
- chart.jsをGitHub Pagesでも使えるか試す

# 参考
[heatmap.js を使ってみた](https://hawksnowlog.blogspot.com/2016/10/try-heatmapjs.html)
[Chart.jsでグラフを描画してみた](https://qiita.com/Haruka-Ogawa/items/59facd24f2a8bdb6d369)
[Chart.jsでグラフを描画してみた ２](https://qiita.com/Haruka-Ogawa/items/392e26123f7e9618a47b)
.NET CoreのWebページからBlob Storage上にファイルを作成する

C#を使って、AzureのBlob Storage上にファイルを作ります。

#1. Blob Storageの作成
Azureにサインインして、Blob Storageを作成します。
あまりお金は使いたくないので、なるべく安いプランを使用します。

(1) Azureにサインインして、「ストレージアカウント」を選択
(2) 以下のような感じに設定します。レプリケーションを「LRS」に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401295/12c9eebd-cf9e-e0e0-734d-f1bec821b6bd.png)
※ ホットよりクールのほうが安いけど、微々たる差に見えたのでホットのままにしました。

(3) その他はデフォルトのままで作成。

これでBlob Storageは完成です。

#2. コンテナーの作成
作成したBlob Storage上にコンテナーを作成します。

(1) 作成したBlob Storageを選択
(2) メニューから「コンテナー」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401295/85f4ed13-3f6d-1ec8-1e84-3953f31f0749.png)

(3) 画面上部のメニューにある「+ コンテナー」を選択
(4) テキトーに名前を決めます。アクセスレベルはデフォルトにしておきます。
(5) 「作成」を選択

これでコンテナーが完成します。

#3. 接続文字列の取得
Webからコンテナーにファイルを作成するために、接続文字列を取得しておきます。

(1) 作成したBlob Storageを選択
(2) メニューの「設定」にある「アクセスキー」を選択
(3) key1とkey2の二つがあるので、片方の「接続文字列」を控えておきます。

#4. C#のコード
Blob Storageにファイルを作成するためのコードを打ちます。

```C#
    public class AzureBlobService
    {
        private readonly CloudStorageAccount _account;
        private readonly AppSettings _appSettings;

        public AzureBlobService(AppSettings appSettings)
        {
            _appSettings = appSettings;

            // 設定ファイルから接続文字列を取得 
            var connectionString = appSettings.AzureStorageConfig.AZURE_STORAGE_CONNECTION_STRING;

            // ストレージアカウントのオブジェクトを作成
            _account = CloudStorageAccount.Parse(connectionString);
        }

        public async Task CreateBlobAsync(string blobName)
        {
            // Blobクライアントを作成
            var client = _account.CreateCloudBlobClient();

            // Blobコンテナの参照を取得
            var container = client.GetContainerReference(_appSettings.AzureStorageConfig.ContainerName);

            // Blobコンテナが存在していなかったら作成
            await container.CreateIfNotExistsAsync();

            // Blobの追加
            {
                // 引数に指定されたファイル名で作成する
                var blob = container.GetBlockBlobReference(blobName + ".txt");

                // 引数に指定した内容がファイルに書き込まれる
                await blob.UploadTextAsync("file content");
            }
        }
    }

```

このメソッドを実行したところ、ちゃんとコンテナーにファイルが作成されたことが確認できました。

次は、このファイルの内容をAzureのリソーステンプレートの内容にするのが目標ですね･･･
(Webからいろいろ入力して、リソーステンプレートを作りたい)
Advanced Custom Fields の関連記事を選択する際の並び順を変更

WordPress で開発する時にあったら大変捗るプラグインといえば Advanced Custom Fields です。
その中のフィールドの一つである「関連」フィールドの Tips をご紹介します。

## 関連フィールドとは
https://www.advancedcustomfields.com/resources/relationship/
作成済みの記事やページ（カスタム投稿も可能）を選択できる機能を提供してくれます。ある記事に対して手動で関連記事を設定して有用なサイト内回遊を促したり、固定ページで特定の記事を表示させたい場合などに大変便利です。

### 選択可能な記事の表示順を変更する
ただこの記事選択をする時のUI上の記事の並び順がタイトルのアイウエオ順となっており、キーワード検索を前提とした場合は良いと思うのですが、基本的に最新の記事から記事を選択したい場合などでは不便なので、公開日時の新しい順に並び替えたいと思います。

<img width="672" alt="Screen Shot 2020-05-01 at 18.35.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164591/04a1a926-ad87-ab39-7ed7-52c0e25a212a.png">
▲ この記事の順番を変更したい。

https://www.advancedcustomfields.com/resources/acf-fields-relationship-query/
ACF にはフィルターも豊富に用意されています。今回は上記のフィルターを使って並び順を設定します。

```php5:functions.php
function my_relationship_query( $args, $field, $post_id ) {
	
  // only show children of the current post being edited
  $args['orderby'] = 'date'; //日時での並び替え
  $args['order'] = 'DESC'; // 降順

  // return
  return $args;
  
}
// filter for every field
add_filter('acf/fields/relationship/query', 'my_relationship_query', 10, 3);
```
CentOS7でキー入力で誤操作した時に警告音が五月蠅い

#はじめに

私の管理している某大学の端末室ですが、CentOS6からCentOS7に更新したのですが、キーボードで誤入力するとピッピと警告音がなって五月蠅い事に気がつきました。

いままで五月蠅いサーバ室でしかCentOS7を使ってなかったので気がつかなかった(^_^;

端末室で講義中に警告音が鳴りまくってたら講義に支障が出そうです。

どうにかならないかと思いました。

警告音は端末でbashの誤操作した時とEmacsで誤操作した時になっているようです。

#端末でbashの誤操作の警告音の停止

以下の行を加筆して再起動すれば停止するようです。2行目にコメントになってますので、コメントを外してください。OS全体の設定になります。

```bash:/etc/inputrc
set bell-style none
```

Ref: http://axy-memorandumanddiary.blogspot.com/2017/05/linuxcentos.html

#Emacsの誤操作の警告音の停止
Emacsの設定ファイル~/.emacsに加筆してください。これは個人設定になります。

```bash:~/.emacs
(setq visible-bell t)
```

Ref: https://qiita.com/ongaeshi/items/696407fc6c42072add54


OS全体の設定にしたい場合は以下の場所に適当なファイルを作って置いてください。

/usr/share/emacs/site-lisp/site-start.d/

例えば

/usr/share/emacs/site-lisp/site-start.d/99-emacs-bell-stop.el

とかいう名前でファイルを作り、上記設定を記述すればいいです。

#蛇足1

ちなみにこれらの設定はあくまで個々のOSの設定になります。remote loginで他のCentOS7にログインして誤操作するとやっぱりピッピと五月蠅いです(>_<)

現在操作しているPCのOSの設定で警告音を止めたかったのですが、方法は見つからず。。

#蛇足2

Windows PCとかからTeraTermでCentOS7にログインして誤操作してもピッピなって五月蠅いです。

TeraTermの場合は以下のサイトの記述を参考にしてください。

Ref: https://win.just4fun.biz/?%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB/TeraTerm%E3%81%AEBeep%E9%9F%B3%E3%82%92%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95

一言で書くと設定ファイルに「Beep=off」を加筆

TeraTermの設定で警告音を止めればCentOS7の設定は関係なしで警告音が止まります。

以上です。
#Ruby で メソッド委譲 ( delegate ) する

- require と extend が必要
- メソッドの委譲先をインスタンスに設定するっぽい 
- Railsとは流儀が少し違いそう

```rb
# https://docs.ruby-lang.org/ja/latest/method/Forwardable/i/delegate.html

require 'forwardable'

class Foo
  extend Forwardable

  def initialize
    @bar = Bar.new
  end

  delegate wow: :@bar
  delegate yeah: :@bar
end


class Bar
  def wow
    p "wow!"
  end

  def yeah
    p "yeah!"
  end
end

Foo.new.wow # wow!

Foo.new.yeah # yeah!
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3107











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pythonで毎日AtCoder #53

### はじめに
[前回](https://qiita.com/taxfree_python/items/8365b3cd0aa63bef8d09)
Boot camp for BeginnersのMediumを3問解きます。

### #53
[ABC118-C](https://atcoder.jp/contests/abc118/tasks/abc118_c)

**考えたこと**
やってることが互除法に似ているなと思ってサンプルケースを見ると、勘が合っていたのでそのまま実装しました。全ての要素についての最大公約数を計算します。

```python
import fractions #mathじゃない
n = int(input())
a = list(map(int,input().split()))

ans = fractions.gcd(a[0],a[1])
for i in range(2,n):
    ans = fractions.gcd(ans,a[i])
print(ans)
```

[ABC067-C](https://atcoder.jp/contests/abc067/tasks/arc078_a)

**考えたこと**
それぞれの場合を全て計算する。毎回sumするのはもったいないので、うまく計算する

```python
n = int(input())
a = list(map(int,input().split()))

d = sum(a)
ans = float('inf')
for i in range(n-1):
    if i == 0:
        x = a[0]
        y = d - x
    else:
        x += a[i]
        y -= a[i]
    ans = min(abs(x-y),ans)
print(ans)
```

[ABC070-C](https://atcoder.jp/contests/abc070/tasks/abc070_c)

**考えたこと**
典型的な最小公倍数の問題

```python
import fractions

n = int(input())
t = [int(input()) for _ in range(n)]

ans = t[0]
for i in range(1,n):
    ans = ans * t[i] // fractions.gcd(ans, t[i])

print(ans)
```

### まとめ
生活リズムが壊れているせいで、問題に集中できなってるので直します。ではまた。
Railsのフォーム(form)

##1.基本的なフォームを作成する
最も基本的なフォームヘルパはform_tagです。

```
<%= form_tag do %>
  Form contents
<% end %>
```

form_tagは、上のように引数なしで呼び出されると<form>タグを生成します。このフォームを現在のページに送信するときにはHTTPのPOSTメソッドが使われます。たとえば現在のページが/home/indexの場合、以下のようなHTMLが生成されます (読みやすくするため改行を追加してあります)。

```
<form accept-charset="UTF-8" action="/home/index" method="post">
  <div style="margin:0;padding:0">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="authenticity_token" type="hidden" value="f755bb0ed134b76c432144748a6d4b7a7ddf2b71" />
  </div>
  Form contents
</form>
```
<br>
また、Webでよく使われている一般的な検索フォームには以下のものが含まれています。

・GETメソッドを送信するためのフォーム要素
・入力するものを示すラベル
・テキスト入力要素
・「送信」ボタン要素

検索フォームの作成には、form_tag、label_tag、text_field_tag、submit_tagを使います。

```
<%= form_tag("/search", method: "get") do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search") %>
<% end %>
```
上のコードから以下のHTMLが生成されます。

```
<form accept-charset="UTF-8" action="/search" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>
  <label for="q">Search for:</label>
  <input id="q" name="q" type="text" />
  <input name="commit" type="submit" value="Search" />
</form>
```

##2.モデルオブジェクトを扱う
###モデルオブジェクトヘルパー
フォームの主な仕事といえば、モデルオブジェクトの作成および修正です。*_tagヘルパーをモデルオブジェクトの作成/修正に用いることはもちろん可能ですが、1つ1つのタグについて正しいパラメータが使われているか、入力のデフォルト値は適切に設定されているかなどをいちいちコーディングするのは何とも面倒です。Railsにはまさにこのような作業を軽減するのにうってつけのヘルパーがあります。なお、これらのヘルパー名には_tagが付いていません (text_field、text_areaなど)

これらのヘルパーの最初の引数はインスタンス変数名、2番目の引数はオブジェクトを呼び出すためのメソッド名 (通常は属性名を使います)です。Railsは、オブジェクトのそのメソッドから値が返され、かつ適切な入力名が設定されるように、入力コントロールの値を設定してくれます。たとえば、コントローラで@personが定義されており、その人物の名前がHenryだとします。

```
<%= text_field(:person, :name) %>
```
このとき、上のコードからは以下の出力が得られます。

```
<input id="person_name" name="person[name]" type="text" value="Henry"/>
```

<br><br>
参照：Railsガイドhttps://railsguides.jp/form_helpers.html
独自ドメインでCloudFront にアクセスできるようにする

以下の構成を[以前の記事](https://qiita.com/kanadeee/items/247d114170587e683c4f)で作ったので、
「CloudFront のディストリビューションに割り当てられたドメイン名ではなく
独自ドメインでアクセスできるようにしたい」と考えました。
![スクリーンショット 2020-04-30 22.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/5e2dd353-a860-1cee-3441-89c089cdc32c.png)
ググったところ、**CloudFront のディストリビューションにCNAME を追加**すれば実現できそう。
#事前準備
- 紐付けたい独自ドメインのSSL証明書

ACM でSSL証明書を取得したい方は、もしよかったら以下の記事を参考になさってください。
[AWS Certificate Manager (ACM) でSSL証明書を取得する](https://qiita.com/kanadeee/items/e6d06d36b2d0b97c33a8)

-------------------
**【余談：なんでCNAME を追加したいだけなのにSSL証明書が必要なのか】**


　「ドメインの証明書へのアクセスを許可されたユーザーだけがドメインを
　CloudFront ディストリビューションに追加できるようにするため」のようです。

　以前はSSL証明書がなくてもCNAME を追加できたようですが、
　公式ドキュメントによると2019年8月以降からSSL証明書が必要になったとのことです。

　[Amazon CloudFront がディストリビューションに代替ドメイン名を追加する際のセキュリティを強化](https://aws.amazon.com/jp/about-aws/whats-new/2019/04/amazon-cloudfront-enhances-the-security-for-adding-alternate-domain-names-to-a-distribution/)
#作業手順
**1.　[AWSコンソール](https://console.aws.amazon.com/console/home) にログイン**

**2.　[CloudFront] と入力し、Enterキーを押す**

------------- ▼ ここからCloudFront の作業 ▼ -------------

**3.　CNAME を追加したいディストリビューションをクリック**

**4.　[Edit] をクリック**
<img width="1241" alt="スクリーンショット 2020-04-29 14.50.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/43715128-3dfe-7343-ebe8-645822732db3.png">

**5.　以下を設定し、[Yes, Edit] をクリック**
<img width="1232" alt="スクリーンショット 2020-04-29 16.37.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/0a34aecf-744b-cba3-4a7e-65d36fb2b7bd.png">

- Alternate Domain Names(CNAMEs)：**独自ドメイン名**
- SSL Certificate：**[Custom SSL Certificate (example.com)] を選択し、プルダウンからACM のSSL証明書を選択**

------------- ▲ ここまでCloudFront の作業 ▲ -------------

**6.　ドメインサービス側にCNAME レコードを登録**
ムームードメインの場合、このように追加します。
![スクリーンショット 2020-05-01 17.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/b9a47c7b-e02d-0dfa-116e-755aa573ff6e.png)

**7.　しばし待つ**

------------- ▼ ここからCloudFront の作業 ▼ -------------

**8.　CloudFrontの管理画面を更新し、以下が独自ドメインになっていれば問題なし**
<img width="1240" alt="スクリーンショット 2020-04-29 16.39.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/5c101e3b-4d95-85c9-1d7c-b7506a54ab5c.png">

- Alternate Domain Names(CNAMEs)
- SSL Certificate

------------- ▲ ここまでCloudFront の作業 ▲ -------------

**9.　S3に置いたファイルに独自ドメインでアクセス**
独自ドメインでアクセスできることを確認できます！
いい達成感を味わえました。
#参考
- [代替ドメイン名 (CNAME) を追加してカスタム URL を使用する - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html)
- [Amazon CloudFront がディストリビューションに代替ドメイン名を追加する際のセキュリティを強化](https://aws.amazon.com/jp/about-aws/whats-new/2019/04/amazon-cloudfront-enhances-the-security-for-adding-alternate-domain-names-to-a-distribution/)
IQ Bot：作成したIQ Botをプロダクション化しよう

#IQ BotをRPAから呼び出すためには「プロダクション化」が必要

IQ Botを作ったら、作ったIQ BotをRPAから呼び出す必要があります。

RPAからIQ Botを呼び出すためには、IQ Botを**プロダクション化**する必要があります。

**①インスタンス自体のプロダクション化**と、**②インスタンス配下のグループのプロダクション化**の両方が必要になります。

いずれもトグルをクリックしてONにするだけですが、この記事でやりかたを説明します。

##①インスタンス自体のプロダクション化

**インスタンス自体**をプロダクション化するためには、「学習インスタンス」のタブから、画面右上にあるトグルをクリックします。

![09_インスタンスのプロダクション化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/392f07e7-37b3-c55d-e680-dc19d20d3f67.jpeg)

トグルがオレンジになったら、インスタンスのプロダクション化が完了です。

##②インスタンス配下のグループのプロダクション化

インスタンス自体のプロダクション化の他に、**配下のグループ**もプロダクション化する必要があります。

以下のように、「BOT」タブから作成したインスタンスに紐づくグループのトグルの状態を確認します。

![11_トグルの状態を確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/6cb5463c-89c5-0965-2392-55b0ae68e898.jpeg)

トグルが灰色になっているものがあれば、クリックしてオレンジに切り替えます。

#次のステップ

プロダクション化が完了したら、次はIQ Botを呼び出すためのRPAを作ります。

RPAの作り方はこちら↓です！！

https://qiita.com/IQ_Bocchi/items/5b0cc3bb7e4ddcbc43bd
python 初心者のための文法の整理

#対象の目安


- 最初の言語にpythonを選んだ幸運なプログラミング完全初心者
- 他の言語を少しだけ学んだことがあるものの、何もわからないpython初心者
- pythonを学びたいけど、どのようにして基本的な文法を学べばよいかわからない人（まずはprogateから始めましょう！！）


# 筆者の現状
駆け出しの弱々エンジニアです。来月から自社開発メインのweb系企業でエンジニアとしての人生スタートです。今まではRubyやRailsを中心に学習をしてきました。将来的に機械学習を使って、会社のデータの整理や活用をしたり、競技プログラミングをしたいという思いがあり、**webも機械学習も競プロもできるpython**に手を出し始めました。以下はとりあえず自分が調べた文法を整理していきます。

###複数行の入力を取得したい
競プロではそもそも与えられたデータをきちんと取得できないとお話にならない。ただ、これがなかなか本やprogateなどでは扱われていないのでここで整理しておこう。

```python:入力値の取得
例)入力：
あ
や
せ

s = [input() for i in range(3)]
print(s) #出力['あ', 'や', 'せ']
```

###文字列を１文字ずつ分割したい　`list`
競プロでは「与えられた文字列の指定された一文字だけ扱いたい」ときが多々あります。（僕は競プロ始めたばかり）
その時に使うのがこれ。こんな感じ

```python:
haru = list('はるか')
print(haru) #出力　　['は','る','か']
```
###分割したリストを結合したい　`join`
処理を行ったあと、出力のための準備としてリストの要素を結合して文字列にしたい時は`join`を使います

```python:
message = ['は','る','か']
name = ','.join(message)
print(name) #出力　はるか
```

###リストを作成したい
これはいろんな設定があったのでいくつか整理しておく。

1. とりあえずリストを作成したい  
これはとても簡単。

```python:リストの作成
list_empty = []
#とりあえずリストを作成したいときは、これを書けばよい
```

2.長さを指定して作成したい  
これは初期値を与える必要があるので（弱々な僕は）少し考える必要がある。

```python:長さを指定したリストの作成
list_length3 = [0]*3
#[0, 0, 0]
#ちなみに長さの取得は`len()`
#print(len(list_length3))
#3
```
参考サイト：https://note.nkmk.me/python-list-initialize/


###pythonでデバッグしたい
一応コードは書けたけど、ACされるかわからないから、sampleで試してみたい。。。そんなときのために。（わざわざ手動でやらずともとても便利なツールも存在するのでそちらを導入するのも良い。
例）http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/
僕はpythonの導入を素人のくせに無理やりしたせいで導入できていない。）

ターミナルに`python ファイル名`を打ち込んでエンターを押せば入力待機状態になるのでテストの値をコピペすれば良い。

- 思った通りの出力を得ることができたときそのまま提出しよう。
提出ページに行って、『ファイルの提出』を押して今書いているファイルを選択すれば良い。
- 解答と一致しない時は、コードの修正をすることになるが、『どこがおかしいかわからない』そんな時に『デバッグ』実行する際に途中でコードを止めて、『そこまでは正しいかを確認する！！』
言語によってデバッグの仕方が異なるが、pythonの場合は止めたい部分の直前に`import pdb; pdb.set_trace()`と記述するだけで良い。








#参考サイト(ありがとうございました！！)
- [webプログラムの技術メモ他](http://nfnoface.hatenablog.com/entry/2016/10/05/131600)
- [Qiita: Python3の標準入力やり方まとめ](https://qiita.com/yasu_teco/items/e8db933ac4f647166996)
- [【Python入門】list joinで文字列を連結する方法](https://programming-study.com/technology/python-list-join/)
- [Pythonでデバッグしたい](https://qiita.com/musaprg/items/d9f091957475e3088f0e)
IM-FormaDesigner アプリケーションID 変更方法

IM-FormaDesignerではアプリケーションを作成後、アプリケーションIDは変更できません。
![Forma01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22172/eb026098-316f-746c-342d-e14117dd2a06.png)


しかし変更できないにも関わらずお客さんの無茶ぶりでこの手のID変更、良くありますよね？
２回３回と要求されますよね？

当記事では無理やりアプリケーションID変更する方法を解説します。
もちろん動作保証は出来ませんが、問題なく動くのは確認済です。

### 1. 変更対象アプリをエクスポートする
標準の手順でFormaアプリケーションをエクスポートします。
![Forma02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22172/994d469f-a838-0630-dd6f-a94a3232b1b1.png)

### 2. エクスポートファイルを解凍する
普通のzipファイルです。解凍もどのツールを使っても問題なし。
中身はxmlとjsonなので修正は簡単です。

### 3. 解凍ファイル内のアプリケーションID修正
変更前アプリケーションIDで全文検索をし該当箇所を変更したいアプリケーションIDに全置換します。

ファイル名、ファイル内容すべて変更します。
![Forma03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22172/4c8fee8f-ac9d-37b5-3939-11ab9de140dc.png)

フォルダ名もIDが含まれているので変更します
![Forma04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22172/1e3ac966-eaf9-98f0-5f2b-16211bf3a00b.png)

### 4. 変更したファイルをZIP圧縮する
ここでは「after.zip」という名前で圧縮しています。

### 5. ZIPファイルをインポートする
標準のアプリケーション情報インポートより先ほど作成したzipファイルをインポートします。

![Forma05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22172/77022fda-e8a6-c9be-4c73-b912ca5b79ff.png)
![Forma06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22172/436e5d16-d480-e306-6a5c-17d1c849106d.png)
![Forma07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22172/883fd4c1-1228-678e-55dc-b0cbdbca271e.png)

こんな具合で簡単に変更できました。

### 6. ID変更前アプリを削除する

変更前アプリは削除しておくと安全です。
FormID（Forma画面ごとのID）が一意でないと問題が出る恐れがあります。
当手順では簡略化のためFormIDを再設定しません。
再設定する場合はFormIDをintra-martのID生成APIにて生成し、XMLファイル内のFormID全置換する必要がありそうです。（未検証）
CentOS7で電源ボタンを押してshutdownさせたい

#はじめに

私の管理してる某大学の端末室30台にCentOS7を導入したのですが、電源ボタンを押すと休止状態になる事に気がつきました。

個人的な利用ならこれでも構わないのですが、大学の端末室で共同利用なので休止状態にして退室されると困ります。

電源ボタンを押したらshutdownに変更したいと考えました。

これですが、一筋縄でいかず、うまくいきません(>_<)

数日検索＆試行錯誤した結果、途中の結果は置いておいて以下の設定でうまくいきました。

#OSのインストール

多くのPCのセットアップ画面でUEFIモードかLagcy BIOSモードか選べると思いますが、UEFIではどう頑張ってもダメでした。

Lagcy BIOSでOS導入してください。すでにUEFIモードでOS導入していたらOS再インストールになります。Lagcy BIOSモードが選べないPCだったらどうにもなりません。

なお、Lagcy BIOSモードでは2[Tbyte]を超えるHDDへはOS導入できません。

#ソフトウエアの設定

acpiサービスを導入してください。

```
yum install acpid
service acpid start
chkconfig acpid on
```

以下のファイルを書き換えてください。

```bash:/etc/acpi/events/powerconf
#以下の行をコメントにして
#action=/etc/acpi/actions/power.sh
#以下を加筆
action=/sbin/poweroff
```

OSを再起動してください。

参考文献
Ref: https://serverfault.com/questions/705035/centos-7-power-button-cannot-shutdown-before-user-login-not-after

#確認

念のため以下で確認ください。私の環境では以下の全てで電源ボタンを押すことによりOSがshutdownできました。

 -GUIでログインした状態
 -GUIログインして、画面ロックした状態
 -ログインする前の状態

以上。
機械学習ぼぼ初心者が１週間でKaggle上位を目指してみた

##はじめに
外出自粛であまりにもGWが暇なので色々勉強することにしました。
機械学習については一日５時間ぐらいは割いて勉強することにします。せっかくなので、Kaggleに挑戦して上位を目指してみます。

##１週間の方針
1.敵を知る(1日目)

2.自分を高める(2・３・４日目)
以下の書籍を学習する
・[PYTHON実践データ分析100本ノック](https://www.amazon.co.jp/dp/B07ZSGSN9S/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
・[Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94-ebook/dp/B07YTDBC3Z/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)

3.実践で自分のレベルを知る(5日目)

4.成果を出す(6・７日目)


#前提
・社内SEなのでその他IT知識はそこそこあり
・pythonについては学習経験あり
・機械学習については以前から興味があり、なんとなく書籍をあさったりしていた

#1日目

#2日目
「PYTHON実践データ分析100本ノック」の１章~5章までを進める。
■感想
SORACOM LTE-M Buttonの使い方(AWS IoT編)


#LTE-M buttton と　AWS　サービスを連携させる方法

#########
AWS lambdaを動かすには、いくつかのパターンがある
https://dev.soracom.io/jp/design_patterns/soracom_aws/

FUNCを使うのが一番楽ですが、lambda以外を使うこともあるので
FUNNELで検討。
※　powered by AWS　の場合は、ほぼAWS側で設定が完了する。


★FUNNELを利用してlambda（S3、SNS）と連携する構成　
LTE-M buttton  →　SORACOM(FUNNEL)　→　AWS (IoT Core) →AWS（ルールに登録したリソース）

ルール　
a) S3に格納
b) SNS通知
c) lambda実行

★設定方法
①【SORACOM】SIM設定(登録、グループ）
　　 SIMの初期登録　SIMに名前をつける     (例) mycard
     グループ作成　 グループに名前をつける (例) AWS_IOT
　　 ※SIMに直接設定をすることは出来ない。グループに対して、設定を行います。

②【AWS】    
a) S3バケットを作成する
b) SNSトピックを作成し、サブスクライブ先を登録
c) lambda関数を作成する。

③【AWS】 Iot　ルール設定
　　・名前をつける：分かりやすい名前
　　・ルールクエリステートメントを設定する: SELECT * FROM 'button_topic/#'
　　 　※button_topic　はLTE　BUTTONの識別子（固定）
　　　　Iotキューには様々なデバイスからのメッセージが入るので
　　　　LTE　BUTTONのメッセージが来たことを、上記SQLで判定する。
   　
   ・アクション
　　 a) S3バケットを指定する
　　 b) SNSトピックを指定する　(RAW指定) ※JSONだとうまく通知されませんでした。
　　 c) lambda関数を指定する。
  
④【AWS】 IAMの設定
　　“AWSIoTDataAccess” ポリシーを付与した、新規IAMユーザを作成する
　　 APIアクセスにチェックをいれて、アクセスKEY、アクセスIDを取得する。

⑤【SORACOM】SORACOM Air for Cellularの設定
　　・[バイナリパーサー設定] を ON
　　・フォーマット: @button

⑥【SORACOM】FUNNNELの設定
　　・[バイナリパーサー設定] を ON”
　　・転送先サービス: AWS IoT
　　・転送先 URL: 
　　　https://AWS IoT Core の設定でメモしたカスタムエンドポイント/button_topic/data
　　・認証情報
　　 ID: 分かりやすい名前をつける
　　 AWS Access Key ID、AWS Secret Access Key　を登録する。

★動作確認
⑦【SORACOM】LTEbuttonのクリック

⑧【AWS】    CloudWatchログの確認
　　 a) S3バケットの中身を確認
　　 b) SNSトピックのサブスクライブを確認
　　 c) lambdaログ（CloudWatch）を確認する。

#番外編 簡易GPS機能

Harvest　というサービスを使います。
　
①SIM管理コンソール
当該デバイスのグループをクリックして、グループ設定　harvest Data　をONにsave

設定はこれだけです。

②ボタンをクリック

③当該デバイスにチェックをいれて、Action→HarvestData をクリック

一番右のGoogleMapぽいアイコンをクリックすると、自分（ボタン）の位置が地図上に表示されます。

メッセージの中には、常に位置情報が含まれていますが、HarvestDataを利用すると
グラフィカルな状態で確認できます。

精度はイマイチですが、十分楽しめます。

製品マニュアル
https://dev.soracom.io/jp/air_cellular/what-is-air-for-cellular/
【Mask R-CNN】tensorflowのバージョンをダウングレードした話。

#Mask R CNNのエラー

前回の記事で、以下のエラーの解決手法について説明しました。

```
AttributeError: module 'tensorflow' has no attribute 'log'
```
詳しくはこちら↓

[AttributeError: module 'tensorflow' has no attribute 'log' を解決した話。]
(https://qiita.com/skperfarming/items/dc2e95476bb97c830856)

しかし、調査を進めていくと**tensorflowとkerasのバージョンの問題**でした。



#バージョン変更

実際のバージョン変更ですが、
**tensorflow 1.5.0
keras 2.0.8**
へ変更します。


#変更手順

https://tech-blog.optim.co.jp/entry/2019/03/28/173000
によると、まずはGoogle colaboratoryに以下のコードを入力します。

```
# gitからソースを取得
%cd /content
!git clone https://github.com/matterport/Mask_RCNN.git
  
# ライブラリを取得
%cd /content/Mask_RCNN
!pip install -r requirements.txt
```
**ここからが重要です！**
上記のページには載っていませんが、この後に以下のコードを入れます。

```
!pip install tensorflow==1.5.0
!pip install keras==2.0.8
```
これでバージョンを指定してインストールすることができました。
（本当は、requirements.txtを実行したときにインストールしたバージョンを
アンインストールして、指定のバージョンを入れ直している。）

なぜか、requirements.txtでバージョン指定しているのに、
最新バージョンがインストールされてしまいます。

本質的な解決方法がありましたら、ぜひ教えてください！
Flutter で Android の productFlavors にて Target を指定する方法

# 結論
指定の flavor のところにこれを書けばよい

`project.target = "lib/main_development.dart"`

flavor 指定の全体的にはこんな感じ

```groovy
    flavorDimensions "default"

    productFlavors {
        development {
            project.target = "lib/main_development.dart"
            dimension "default"
            applicationIdSuffix ".dev"
            versionNameSuffix ".dev"
        }
        staging {
            dimension "default"
            applicationIdSuffix ".stg"
            versionNameSuffix ".stg"
        }
        production {
            dimension "default"
        }
    }
```

これで、flavor を development でビルドした時のターゲットが `lib/main_development.dart` になる

`flutter run --debug --flavor development`


# あとがき
Flutter で Android の Build Variant 設定は比較的簡単で、設定方法についてはいろんな記事が出ているのですが、意外と Target の指定方法が見つかりづらかったので、記事にしました。

気づいたきっかけはこのコードです。
https://github.com/flutter/flutter/blob/master/packages/flutter_tools/gradle/flutter.gradle#L583

Build Variant の設定方法自体は以下の記事が詳しくわかりやすいです。

flutterで本番/ステージング/開発を切り替える
https://qiita.com/ko2ic/items/53f97bb7c28632268b5a

Flutterで環境ごとにビルド設定を切り替える — iOS編
https://medium.com/flutter-jp/flavor-b952f2d05b5d
.NET Coreで作ったWebページからボタン一つでAzure上にリソース群を作ってみたい

Webページからボタン一つでAzure上にリソースを作ってみたい、と思ったので、いくつかの段階に分けて作ってみることにした。

#1. 処理の流れ
大体以下のような感じを想定。

(1) Webページから作りたいリソースを選択し、「作成」ボタンを押す
(2) 選択されたリソースを作成するテンプレートファイルをBlob Storageに作成
(3) AutomationのRunbookに(2)のファイルを読み込ませて、リソースを作成

これを実現するために、さらに細かくやりたいことを分割した結果、以下のことができればよさそうと判断。
(a) WebページからBlob Storageにファイルを作成する
(b) Webページで選択したリソースに応じてテンプレートファイルを作成する
(c) AutomationのRunbookでBlob Storage内のファイルを読み込む
(d) AutomationのRunbookでテンプレートファイルを使用したリソースの作成を実施

というわけで、ステイホーム週間を使って、頑張って作ってみよう！

※ (a)～(d)は別の記事にして、このページは随時更新して最終的にまとめ的な感じで使いたい････
【新人～若手向け】自宅待機中に資格を取ろう

#はじめに

※この記事は未経験1年目～3年目程度の新人・若手向けです。


#資格を取ろう
突然のコロナ禍。自宅待機になった方も少なくないかと存じます。これを機に新しい言語に挑戦したり、作りたかったアプリケーションを作ろうという方も少なくないかと思います。

そんな中の一つの選択肢として**資格の取得**があるかと思います。

資格を取ると、
- 単純に**スキルアップ**
- 会社によっては**資格手当で昇給**したり、合格祝い金の給付がある
- 常駐の場合、面談で多少有利になる


などメリットも色々あるので資格を増やしておきたいところ。

#ただこの現状
・IPA系試験などの**国家試験は開催中止**になってしまった
・その他の民間試験も小規模開催等の対応をしている
・そもそも極力家から出ない方がいい

という部分もあり、満足に資格も取れない現状。


なら、**家から出ないで試験を受けよう**じゃないか！！

#家から出ないで試験を受けよう

Oracleの
・Java Bronze
・Oracle master Bronze SQL基礎

の試験は、なんと**オンラインで受験可能です**。

なにより、この春入社したてホヤホヤの**未経験新人さんでも受験できる**レベル帯の資格。
人事・新人教育ご担当の皆さん、この資格を取って下さいーって指示してみるのも良いと思います。

経験者の方であれば、範囲を抑えてちょっと勉強したら取れる資格です。
是非スキルアップや昇給を狙って、この機会に取ってみてはいかがでしょうか。


この2資格は自分も取得している資格なので、各試験の詳細は別途合格体験記記事をご覧ください。
[【合格体験記】新人がJava Bronzeに1週間で合格](https://qiita.com/Kakese_Chan/items/256784b541f254d6f696)
[【合格体験記】実務経験ないけどOracleDatabase Bronzeに合格(前編：SQL基礎編)](https://qiita.com/Kakese_Chan/items/b2da35e95121bf6bf7f4)


#出来たら5月中に受けてくれ
ただこの2つの資格、出来たら5月までに受験して頂きたいです。

**理由1：再受験無料キャンペーンが5月末まで**

現在Oracle資格は再受験無料キャンペーン中です。
https://www.oracle.com/jp/education/campaign-1898205-ja.html

つまり一回不合格になっても、もう一回無料で受験が出来ます。
その機会が5月で終了になってしまいます。
簡単な資格とはいえ、仮に不合格になってしまうと1万いくら持って行かれてしまいます。決して安価ではないのでちょっと痛い出費です。
受験する時も「落ちたらどうしよう……お金がパアになってしまう……」とあまり緊張せずに済むのも良い所です。


**理由2：SQL基礎の10c、11g試験廃止**

SQL基礎試験は「10c」「11g」「12c」の3つの種類があります。そのうち10c、11gが5月末で試験廃止になります。


[上にも貼った自分の体験記](https://qiita.com/Kakese_Chan/items/b2da35e95121bf6bf7f4)でも書いたのですが、12cに比べて10cや11gはかなーり**簡単**です。最終的に得られる資格は同じなので、どうせ同じなら簡単に合格したいと思うのが人間。試験が簡単なうちに受験してみるのはいかがでしょうか。

#最後に
どちらの試験も、**新人でも**今から1ヵ月で十分間に合います！
経験者なら尚更です。多分GW勉強したら合格できると思います。

是非自宅待機中の学習の選択肢に、オンライン資格取得はいかがでしょうか。
IQ Bot：マッピング設定のやりかた　テーブルフィールド（基本）

この記事では、IQ Botの事前設定のメインとなるマッピング設定のうち、テーブルフィールドのマッピングのやりかたをまとめます。

テーブルフィールドとは何かについては、[こちらの記事](https://qiita.com/IQBotter/items/03063d0cb5412db47d46)をご参照ください。

#テーブルのマッピングの基本的な考え方

##列名に対して、列の幅を教えてあげる

[フィールドのマッピング](https://qiita.com/IQBotter/items/d569254f986cfeb1155c)では、「ラベルに対して、値がどこにあるかを教えてあげる」というのが基本的な考えでした。

テーブルの場合も考え方のベースは似ていて、**ラベル＝表の列名、値＝その列名の値が入ってくる幅**になるというイメージです。

###まずはイメージをつかもう

イメージをつかむために、動く画面に勝るものはないということでまずは以下のGIFアニメを見てください。

![テーブルの学習.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/a0891570-f00c-8557-89da-b7af2b13c545.gif)

###補足１

上記のGIFアニメは基本のやりかたですが、実はテーブルの学習には２通りのやりかたがあるんです！
その内容を[こちらの記事](https://qiita.com/IQ_Bocchi/items/0c7f801090c132379154)にまとめましたので、あわせてご覧ください。

###補足２

「自分が今学習させているのは列名なのか？　列値なのか？！」という点は、IQ Botを触りたての人が引っかかりやすいポイントのようです。

画面右側の帳票イメージをクリックしたりドラッグしたりするときに、**画面左側の「列名」と「列値」のどちらにカーソルが当たった状態か**によって列名を覚えさせているのか、列の幅を覚えさせているのかが変わります。

![91_列名＝列名の場所.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/8ddb335c-38c6-1dde-b0bd-64f9e4184acf.jpeg)

![92_列値＝列の幅.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/2948d81d-7e7f-3193-d70e-7ee9344b7663.jpeg)

#こんなときどうする？（応用編）

この記事ではテーブルのマッピングの基本をご紹介しましたが、実際に業務で処理する帳票を設定していると、「こんなときはどうするの？」という疑問が色々と出てくるかと思います。

以下、状況に応じた設定のやりかたを順次公開していきます。

- 表が段組みになっている場合（準備中）
- 表の行数が可変の場合（準備中）
- 表の抽出を止める位置を指定する（準備中）
- 列名の読取が不安定な項目の場合（列名が文字化けしやすい等）（準備中）
- 表の途中にカテゴリを示す行が混入している場合（準備中）
- 表以外の形式の繰り返し項目を取得したい場合（準備中）
【GAS】JSONをZIPで固めてGoogleDriveに保存する方法

GASでスプレッドシートから複数のJSONを生成し、ZIPで固めてダウンロードしたいと思ったけど意外とめんどくさかったのでまとめます。

# JSONを作成する
次のようなスプレッドシートの表から

|no|name|age|
|---|---|---|
|01|mako|18|
|02|neko|19|

各行に対して、次のようなJSONを作成する

```json
{
 "no": "1",
 "name": "mako",
 "age": "18"
}
```

```js
// スプレッドシートを読み込み
const sheet = SpreadsheetApp.getActiveSheet();
// データが存在する行までループする
for (let i = 2; i <= sheet.getLastRow(); i++) {
  const data = {
    "no": sheet.getRange(i, 1).getValue(),
    "name": sheet.getRange(i, 2).getValue(),
    "age": sheet.getRange(i, 3).getValue(),
  };
  console.log(JSON.stringify(data));
}
```

# ZIPファイルを作成する

**Utilities.zip関数**を利用する必要があります。

```js
const zip = Utilities.zip(blobs, 'hoge.zip');
```

第一引数には**blobs**を取るので、jsonをblobに変換しその配列を取得します。
blobを生成するには**Utilities.newBlob関数**を利用します。

```js
const blobs = new Array();
const blob = Utilities.newBlob(JSON.stringify(data, null, 4), 'application/json', (i-1).toString() + '.json');
blobs.push(blob);
```

# ZIPファイルを保存する

GASから直接ダウンロードができないので、一旦Google Drive上にZIPファイルを保存します。

```js
const folder = DriveApp.getFolderById('FolderId');
folder.createFile(zip);
```

# ここまでの全体のコード

```js
function toJsons() {
  // スプレッドシートを読み込み
  const sheet = SpreadsheetApp.getActiveSheet();
  const blobs = new Array();
  // データが存在する行までループする
  for (let i = 2; i <= sheet.getLastRow(); i++) {
    const data = {
      "no": sheet.getRange(i, 1).getValue(),
      "name": sheet.getRange(i, 2).getValue(),
      "age": sheet.getRange(i, 3).getValue(),
    };
    const blob = Utilities.newBlob(JSON.stringify(data, null, 4),'application/json',(i-1).toString() + '.json');
    blobs.push(blob);
  }
  // 任意のフォルダにZIPファイルを保存する
  const folder = DriveApp.getFolderById('hogehoge');
  const zip = Utilities.zip(blobs, 'jsons.zip');
  folder.createFile(zip);
}
```

# ZIPファイルのダウンロード

**toJsons関数**を実行すると指定したフォルダにZIPファイルが保存されるのでダウンロードするだけです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/c7eb16ef-0aef-94a7-8f0d-836e05fe5f0c.png)
もしあなたがベイズの「チャンス・ドクトリンの問題を解決するためのエッセイ」を読んだら【もしチャン・イカサマコイン・ベイズ・古典統計学】


ベイズ統計はいぃぞぉ～^^
タイトルは何でもよかった。
ベイズの話をしたいだけ。

#あなたは賭け事のイカサマ見破れますか？

「怪しい男」が近づいてきて**かけ勝負をしましょう**と言ってきた。
勝負の内容は、男が10回コインを投げる。
これを3回まで見せてくれる。
その結果から、コインが「イカサマコイン」かどうか**見極められたらあなたの勝ち**。
カサマコインは「70%で表が出るようになっている」そうだ。

男が10回コインを投げた結果、
1回目7
2回目6
3回目8
が表だった。

どんな考えでイカサマを判断しますか？

#もしあなたがフィッシャーの「研究者のための統計的方法」を読んだら

(注：べつに以下の内容がクリティカルに書かれている本ではないです)

イカサマコインならば30回投げた結果21回表になると考えて、

```math
\hat{p} = \frac{21}{30} = 0.7 \\\
np-1.96\sqrt{np(1-p)} \\\
= 30×0.7 ± 1.96×\sqrt{30×0.7×0.3} \\\
= 21 ± 4.92
```

よって17から25表ならばイカサマコインではないと言い切れない。
だからイカサマコインと判断する。

#もしあなたがベイズの「チャンス・ドクトリンの問題を解決するためのエッセイ」を読んだら

(注：これもまたもちろん以下の内容がクリティカルに書かれている本ではないです)


まず、その男の「怪しさ」を考える。
少し疑ってみる。
0回試行の時点で、「この男はちょっとイカサマしそうだ」と考えてみる。

よってこの時点でのイカサマコイン率は
60%と置く。


1回目「10回投げて7回表」
もしもイカサマのコインならば、10回中7回表が出るだろう。
コインを投げるという行為は二項分布である。

```math
fair={}_{10} C_{7}
(0.5)^{10} = 0.117 \\\

unfair={}_{10} C_{7}
(0.7)^7(0.3)^3 = 0.266
```

(この値から最尤推定を行う方法もあるが、それはベイズっぽくないので一旦ここで説明はしない。)

また、同時にイカサマでない場合も考えられるので、分母にはイカサマでなかった場合も考慮する(ベイズのエビデンス・周辺化)。
さらに、試行するまえに置いた「イカサマ率」をつかって重みづけしてやる(ベイズの事前確率)。

```math
\frac{

{}_{10} C_{7}
(0.7)^7(0.3)^3 ×(0.6)

}{

{}_{10} C_{7}
(0.5)^{10}×(0.4)

+

{}_{10} C_{7}
(0.7)^7(0.3)^3 ×(0.6)


} \\\

= \frac{0.15}{0.0468 + 0.15} \\\
= 0.762

```

この式の面白いところは、分母を確認するとわかるが**主観的ながらも重みづけすることで公正なコインである確率を減らし(0.046)イカサマコインであることを重視する(0.15)ように変形できている**ところである。

よって、1回目の試行で6回表が出たことにより、
イカサマ率は60%から76%へと上昇した(ベイズの事後確率)。
次の試行にはこの76%を使っていく(ベイズの更新)。

ここから二回目、三回目も同様に計算していく。

```math
\frac{

{}_{10} C_{6}
(0.7)^6(0.3)^4 ×(0.76)
}{
{}_{10} C_{6}
(0.5)^{10}×(0.24)
+
{}_{10} C_{6}
(0.7)^6(0.3)^4 ×(0.76)
} \\\

= \frac{0.152}{0.0492 + 0.152} \\\
= 0.755

```

6回表を確認したことで76%から少しイカサマ率が下がった。

```math
\frac{

{}_{10} C_{8}
(0.7)^8(0.3)^2 ×(0.755)
}{
{}_{10} C_{6}
(0.5)^{10}×(0.245)
+
{}_{10} C_{6}
(0.7)^8(0.3)^2 ×(0.755)
} \\\

= \frac{0.176}{0.01 + 0.176} \\\
= 0.94
```

8回表を確認したことでイカサマコインである確率が94%まで上がりました。

よってイカサマコインである確率は94%です。

古典統計の「間違っているとは言い切れない」という答えと違い
計算した結果、疑わしいコインである確率は「94%」ということがわかりました。




#比較する

- 古典統計学
  - 事象がどのような確率分布に似ているかを考え、その分布上でめったに起こらないような場合に当てはまるかを考える。
  - 「確率的にめったに(5%しか)起こらない」と判断されるなら「今回の結果はおかしい」という事を主張する。
  - 結果から得られる疑わしさを定量的にすることが難しい。

- ベイズ統計
  - 現在の疑わしさを定量的に確立で表現することができる。

  - 主観的な事実も含めることができるので、人間の考えを反映させやすい。
      - 主観的な確率を数式として入れるなんて違和感があると思われるかもしれない。
      - しかしはデータ数が少ない時などに有利。
      - 統計や機械学習の分野では、データの生まれてくる過程を数式化することで次にどんなデータが来るかを推定したりする。
      - このモデル化を行うためにはビックデータがあればいいのだが、集めるのにコストも時間もかかる。
      - そんな時にデータに詳しい人がデータを見て、これは明らかに怪しいデータである、という意思を入れることで少ないデータでもモデル化することが可能となる。
      - スパムフィルターで使われるナイーブベイズなどはそのような意図で使われることもある。
      - もちろん扱いずらい点もある
      - 情報のない状態では事前分布を置くことができず、とりあえず問題を起こさない無難な分布で・・・という対処方法をとらざるを得ない時もある(無情報事前分布)。

    - 逐次学習
      - 上記で試行のたびに確率を変化させていく過程を見た。
      - これは機械学習に頻出の逐次学習(オンライン学習)というもので、新しいデータをもとに確率を更新していくことができるので、データ(試行回数と結果)が増えるほどに正確な値に近づいていく。

#おわり
自分なりに理解した内容をまとめてみましたが、不備があれば教えてください。
(この記事がイカサマじゃどうしようもない・・・)
Railsのモデル(Active Record)

##1.MVCのmodelの役割
Model：実際に（表示や入力に関連しない）データの処理を行う
View：Modelの状態を表示する
Controller：ModelとViewに処理をお願いする

つまりモデルは、
「データの検索、変換、検証、関連」の処理を担当する部門です。

##2.Active Recordについて
Active Recordとは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です。Active Recordは、データベースに恒久的に保存される必要のあるビジネスオブジェクトの作成と利用を円滑に行なえるようにします。Active Recordは、**ORMシステム**に記述されている「Active Recordパターン」を実装したものであり、このパターンと同じ名前が付けられています。

特に重要な項目は、以下５点です。

・モデルおよびモデル内のデータを表現する
・モデル同士の関連付け(アソシエーション)を表現する
・関連付けられているモデル間の継承階層を表現する
・データをデータベースで永続化する前にバリデーション(検証)を行なう
・データベースをオブジェクト指向スタイルで操作する


####ORM (オブジェクト/リレーショナルマッピング) システム
データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法で、アプリケーションが持つリッチなオブジェクトをリレーショナルデータベース(RDBMS)のテーブルに接続することです。ORMを用いると、SQL文を直接書くかわりにわずかなアクセスコードを書くだけで、アプリケーションにおけるオブジェクトの属性やリレーションシップをデータベースに保存することもデータベースから読み出すこともできるようになります。

##3.Active Recordのモデルを作成する
Active Recordモデルの作成は非常に簡単です。以下のようにApplicationRecordクラスのサブクラスを作成するだけで完了します。下記では、Productモデルを作成し、データベースのproductsテーブルにマッピングされます。

```ruby:ruby
class Product < ApplicationRecord
end
```

##4.CRUD: データの読み書き
CRUDとは、4つのデータベース操作を表す「Create」「Read」「Update」「Delete」の頭字語です。Active Recordはこれらのメソッドを自動的に作成するので、テーブルに保存されているデータをアプリケーションで操作できるようになります。

###Create
Active Recordのオブジェクトはハッシュやブロックから作成できます。また、作成後に属性を手動で追加できます。newメソッドを実行すると単に新しいオブジェクトが返されますが、createを実行すると新しいオブジェクトが返され、さらにデータベースに保存されます。
Userというモデルにnameとdescriptionという属性があるとすると、createメソッドで新しいレコードが1つ作成され、データベースに保存されます。

```ruby:ruby
def create
  user = User.create(name: "David", description: "Code")
end
```

### Read
Active Recordは、データベース内のデータにアクセスできる高機能なAPIを提供します。
例えば、ユーザーの一覧を見たい場合は、indexアクションで全てのユーザー情報をGETします。

```ruby:ruby
def index
  users = User.all
end
```

###Update
Active Recordオブジェクトを取得すると、オブジェクトの属性を変更してデータベースに保存できるようになります。

```ruby:ruby
user = User.find_by(name: 'David')
user.update(name: 'Dave')
```

###Delete
他のメソッドと同様、Active Recordオブジェクトを取得すると、そのオブジェクトをdestroyしてデータベースから削除できます。

```ruby:ruby
user = User.find_by(name: 'David')
user.destroy
```

##5.バリデーション（検証）
Active Recordを使って、モデルがデータベースに書き込まれる前にモデルの状態をバリデーション（検証: validation）できます。Active Recordにはモデルチェック用のさまざまなメソッドが用意されており、属性が空でないかどうか、属性が一意かどうか、既にデータベースにないかどうか、特定のフォーマットに沿っているかどうか、多岐にわたったバリデーションが行えます。

バリデーションは、データベースを永続化するうえで極めて重要です。そのため、save、updateメソッドは、バリデーションに失敗するとfalseを返します。このとき実際のデータベース操作は行われません。上のメソッドにはそれぞれ破壊的なバージョン (save!、update!) があり、こちらは検証に失敗した場合にさらに厳しい対応、つまりActiveRecord::RecordInvalid例外を発生します。

```ruby:ruby
class User < ApplicationRecord
  validates :name, presence: true
end
  
user = User.new 
user.save  # => false 
user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank 

if user.save # => true
  redirect_to user, notice: "ユーザー「#{user.name}」を登録しました。"
else
  render :new
end 
```
<br><br>
参照：Railsガイドhttps://railsguides.jp/active_record_basics.html
PHP 条件分岐if文編

#条件分岐とは
条件分岐とは、「変数や値との比較の結果によって、文を実行する、あるいはしない」というもの

##if文について
条件が満たされていれば処理を実行するという構文です。基本的には下記のように記述します。

```php
if文
if (条件){
  条件が真なら実行
}
```
例文はこんな感じです。

```php
$color = 'red';

if ($color === 'red') {
  echo 'colorは赤です';
}
```
`$color`という変数が`'red'`ならば`'colorは赤です'`と表示されます。上記では条件が満たされているので`'colorは赤です'`が表示されると思います。

If文には条件を満たさない場合の処理も実行させる事ができます。
###elseを使う
記述は以下の通りです。

```php
if (条件){
  条件が真なら実行
} else {
  条件が偽なら実行
}

```

例文は下記の通りです。

```php
$number = 33;

if ($number === 33){
  echo '正解です';
} else{
  echo '答えが違います';
}
```
このように条件に当てはまる場合とそうでない場合とで処理を分ける事が出来ます。

###else ifを使う

if文には複数の条件によっても処理を分ける事ができます。記述方法は下記の通りです。

```php
if (条件A){
  条件Aなら実行
} else if (条件B){
  条件Bなら実行
} else {
  どれも当てはまらない時に実行
}
```
例文だとこんな感じです。

```php
$signal = 'red';

if ($signal === 'red'){
  echo '止まれ';
} else if($signal === 'yellow'){
  echo '一時停止';
} else {
  echo '進んでください';
}
```

説明すると、条件Aは`$signal`が`'red'`の場合は`'止まれ'`という処理がされます。
条件Bは`$signal`が`'yellow'`の場合に`'一時停止'`、それ以外は`else`の`'進んでください'`というふうに処理されます。

他にはこのような使い方もできます。


```php
$test = '';

if (empty($test)){
  echo '変数は空です';//変数が空の場合実行される
}

if (!empty($test)){
  echo '変数は空ではありません';//変数がからでない時に実行される
}
```
`empty`とは変数が空かどうかを判断するものです。`!empty`とする事で、空ではない時に処理をさせる事ができます。

```php
$signal_1 = 'red';
$signal_2 = 'blue';

if ($signal_1 === 'red' && $signal_2 === 'blue'){//　AND　＝　&& 両方の条件を満たした時に実行される
  echo '変数は赤と青です';
}

if ($signal_1 === 'red' || $signal_2 === 'blue'){//　or　＝　|| どちらかの条件を満たした時に実行される
  echo '変数は黄色ではありません。';
}
```
他にも`&&`や`||`を使い様々な条件を処理させる事ができます。

if文ではないですが、下記のような処理方法もあります。
###三項演算子

```php
// 条件 ? 真 : 偽;

$count = 80;

$comment = $count > 80 ? 'yes!!' : 'no!!';

echo $comment;
```
三項演算子を使うとこのようにすっきりとしたコードがかけます。簡単な処理についてはこちらを使ってもいいかもしれません。
今回は復習でif文について書いてみました。他にも投稿していこうと思いますのでよろしくお願いします！！
【備忘録】C#でShift-JISの文字列を扱う

Shift-JISの文字列を読み込むときに少しはまったので自分用の備忘録としてメモ。

# よく見る"Shift-JIS"の文字列書き込み用のコード
通常、C#でテキストファイルなどへ文字コードを指定して書き込む場合は、
書き込みのストリーム生成時に文字コードを"System.Encoding"クラスを用いて指定します。
>System.Encodingドキュメンテーション
>[https://docs.microsoft.com/ja-jp/dotnet/api/system.text.encoding?view=netcore-3.1](https://docs.microsoft.com/ja-jp/dotnet/api/system.text.encoding?view=netcore-3.1)

Shift-JISを使う場合、よく見かけるサンプルだとこんな感じで宣言してます。

```c#:CodeConverter.cs
StreamWriter writer = new StreamWriter(
    File.Open(@"C:\hogehoge.txt", FileMode.Create),
    Encoding.GetEncodings("shift-jis")
);
```
## 何が問題なのか？
このままビルドすると、下記のようなエラーが出ます。
※2020/5/1追記：.NET Frameworkでは標準でサポートされているのでこのエラーは出ませんし、本記事で取り上げている問題も起きません。
>System.ArgumentException: ''SHIFT-JIS' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. '
>(内容和訳)"SHIFT-JIS"はサポートされている文字コード名ではありません。任意の文字コードを指定する方法については、Encoding.RegisterProviderメソッドの資料を参照してください。

つまり、**プロジェクト作り立ての状態では、Shift-JISの定義が含まれていないため**、文字コード変換に失敗します。
<details><summary>(参考)何もしない状態でサポートされていた文字列</summary>
私の環境の場合、何もしない状態でサポートされていた文字コードは下記のみでした。
* "utf-16"
* "utf-16BE"
* "utf-32"
* "utf-32BE"
* "us-ascii"
* "iso-8859-1"
* "utf-7"
* "utf-8"
</details>

## どうすればいいのか？
NuGetから必要なパッケージをインストールし、参照すれば解決します。

### 具体的な手順
#### (1)NuGetから"System.Text.Encoding.CodePages"をプロジェクトに追加する。
>NuGet System.Text.Encoding.CodePagesプロジェクトページ
>[https://github.com/dotnet/corefx](https://github.com/dotnet/corefx)
![nuget_codepages.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71369/a296da0c-8183-d315-f5ac-3e060b2d7f44.png)

#### (2)EncodingProviderクラスを宣言したのち、Shift-JISエンコードを読み込む。
```c#:CodeConverter.cs
EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
var encoding =  provider.GetEncoding("shift-jis");
```

#### (3) (2)で取得したエンコードをStreamのコンストラクタに渡す。
最初に挙げた「よく見るサンプル」を書き直すと下記の通りとなります。

```c#:CodeConverter.cs
EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
var encoding =  provider.GetEncoding("shift-jis");
StreamWriter writer = new StreamWriter(
    File.Open(@"C:\hogehoge.txt", FileMode.Create),encoding
);
```
# 修正記録
(a)2020/05/01 … .NET Frameworkでは標準でサポートされているようです。(情報をくださったalbireo様、ありがとうございました。)
mysqlが起動できない時に解決した方法。

mySQLをアンインストールしてインストールした後にmySQLを起動できなくなりました。

結論から言うと、原因は、以前にmySQLをインストールした時と現在のファイルのバージョンが違ったので、今回インストールしたmySQLが以前のバージョンのファイル達を参照した時に齟齬が出てエラーが発生するというものでした。

***

```
$ sudo rm -rf /usr/local/mysql
$ sudo rm -rf /Library/StartupItems/MYSQL
$ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
$ sudo rm -rf /Library/Receipts/mysql-.pkg
$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*
```
で、関連ファイルを削除して、さらに

```
$ bundle config --global build.mysql2 --with-opt-dir="$(brew --prefix openssl)"
```
とすることで、bundlerを使ってmysql2を入れる際、以下のような場所にあるライブラリを使ってくれるようになる。

```
$ brew --prefix openssl
=> /usr/local/opt/openssl@1.1
```

***

今回もそうだったのですが、
MacOSをアップグレードした後、mysql2のインストールで問題が発生することがあるようです。

参考記事
https://qiita.com/usagrammer/items/7a6b9b9e67f301b5e58a

https://github.com/brianmario/mysql2/issues/1005
MySQLでインデックスを作成する手順と注意点

# いつインデックスを作成するか？
MySQL5.6以上であれば、インデックス作成中に該当テーブルに対するSELECTやUPDATEが可能です。
しかし、MySQLにはメタロックという仕組みがあるため、**メタロックが取得できない時間帯には
インデックスを作成してはいけません。**
結果として、該当テーブルへのアクセスが少ない時間帯に実施する必要があります。
　※数千万件程度のレコード数のテーブルになってくると30分以上かかったりします。


# メタロックのまとめ
ポイントだけ記載します
- ALTER TABLE文の開始時にメタロックを取得する。
- メタロックが取得できない場合、「Waiting for table metadata lock」となり、待ちになる。
- 「Waiting for table metadata lock」の間、**該当テーブルへのアクセスがすべて待ちになるため、システム障害につながる可能性大。**
- メタロックが取得できれば、インデックス作成が開始され、「altering table」になる。
- 「altering table」中は、SELECTやUPDATEが可能である。
-  ALTER TABLE文の終了時にもメタロックを取得する。（ここで待ちになると水の泡・・）

### メタロックの回避
- オンラインやバッチでそのテーブルにアクセスする長いトランザクションの処理がある場合、メタロック待ちになる。常駐バッチなどあれば停止しておくようにする。
- 手作業でも起きる。該当テーブルをSELECTしただけで暗黙的にそのトランザクションが開始されているため、ALTER TABLEしても、メタロック待ちになってしまいます。
- 以前、インデックス作成者自身が別セッションで作業前にSELECT COUNT(*)していたせいで、いつまでたっても、メタロックが取得できないということもありました。
- 周囲の仲間がSELECTしていたら、Exitしてもらうように伝えておきましょう。
- ロックしている人が見つからなければ、問題有無を確認した上でkillします。

# 実行手順の検討
1.「LOCK=NONE」は不要だが、付けていると何となく安心。

```sql
ALTER TABLE USER_TBL ADD INDEX IDX_USER_TBL_01
(MAIL_FLAG), LOCK=NONE;
```
　　
2.タイムアウトの設定
メタロック待ちになり、他のトランザクションが待ちになってしまうことを回避したい場合は設定する。ただし、インデックス作成完了後のメタロックが取得できない場合、やり直しになってしまうので、設定しない方がよい。

```sql
- 3秒メタロックを取得できない場合、キャンセルされる。
- 影響範囲は自セッションのみ
SET SESSION lock_wait_timeout = 3;
```

# 実行手順
1.セッションを2つ用意します。
　　セッションA：ALTER TABLE用
　　セッションB：監視チェック用

　　
2.ALTER TABLE文の実行（セッションA）

```sql
mysql> ALTER TABLE USER_TBL ADD INDEX IDX_USER_TBL_01 (MAIL_FLAG), LOCK=NONE;
```
　　
3.メタロック発生有無の確認（セッションB）

```sql
mysql> SELECT STATE
mysql> FROM INFORMATION_SCHEMA.PROCESSLIST
mysql> WHERE INFO LIKE 'ALTER TABLE%';
```
→メタロック待ちしていない場合は手順4,5はスキップ。
→メタロック待ちしている場合はALTERをキャンセルするか、メタロックを持っているプロセスを手順4､5でkillする。
　　
　　
4.メタロック待ちプロセスを探す（セッションB）
実行中のプロセスを開始順で取得します。
　※開始時間が最も早いものがロック中であることが多いです。
　※何度か実行して、継続しているものは特にあやしい。
　※メタロックが発生している場合のみ結果が出力されるようにしています。

```sql
SELECT trx_mysql_thread_id
FROM information_schema.innodb_trx
INNER JOIN INFORMATION_SCHEMA.PROCESSLIST
  ON INFORMATION_SCHEMA.PROCESSLIST.ID = information_schema.innodb_trx.trx_mysql_thread_id
WHERE information_schema.innodb_trx.trx_state = 'RUNNING'
  AND EXISTS
(SELECT 'X'
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE STATE = 'Waiting for table metadata lock'
  AND INFO LIKE 'ALTER TABLE%')
ORDER BY information_schema.innodb_trx.trx_started;
```

　
5.killする（セッションB）

```sql
kill MySQLスレッドID
```

```sql
- AWS Auroraの場合
CALL mysql.rds_kill(MySQLスレッドID);
```

　　
6.インデックス作成が完了（セッションA）

```sql
Query OK, 0 rows affected (51.62 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

7.インデックスが作成されていることを確認する。

```sql
show index from USER_TBL;
```

以上です！
Laravel-snappyでPDF帳票作成時、煮詰まった内容覚書

#概要
煮詰まった内容が結構あり、だいぶ忘れそうなので備忘録。




##一覧
- 表テーブルを中途半端に分断しないような改ページ設定
- 改ページごとに共通コンポーネント（ヘッダ）を挿入
- 改ページで分かれた単一テーブルに対してヘッダ行を挿入←現在悪戦苦闘中


##表テーブルを中途半端に分断しないような改ページ設定

　帳票などでよくやる、名前記入欄やタイトルを各頁上部に表示する方法。
　初っ端から相当煮詰った。
　
　そして完全といえるほどではないが解決した。

執筆中・・・・
pythonで描画した図形の色付けに時間を使わないために

#matplotlibでの図形の色付け

matplotlibで複数図形を描画したとき、
一つ一つ"red"とか”blue"とか指定しない方法を調べてみた。

##はじめにmatplotlib fillを使った図形の描画
```python
import matplotlib
import matplotlib.pyplot as plt
import numpy as np


#図形データ作成
#ベースの四角形
x=np.array([-0.5,0.5,0.5,-0.5])
y=np.array([0,0,1,1])

#四角形をN個用意
N=3
#列数
cn=10
xl=list()
yl=list()
for i in range(N):
  xl.append(x+1.2*(i%cn))
  yl.append(y-1.2*int(i/cn))

#作図
fig = plt.figure()
ax = fig.add_subplot(111)
plt.axes().set_aspect('equal')

poly = plt.fill(xl[0],yl[0],fc="red")#ここで"red"とかいちいち書きたくない場合はどうするか
poly = plt.fill(xl[1],yl[1],fc="green")
poly = plt.fill(xl[2],yl[2],fc="blue")

plt.show()
```

![cap1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403057/5fb88d03-d60c-cb6a-cdf8-4da8d6143d47.png)

上記のように、３種類の図形くらいならいいが、図形の数に合わせていちいち何色を使うか考えたり、"red","green","blue"と指定していられない。
知らないだけできっといい方法があるはず・・・



##使用する図形が10個以下なら、tab10を使うのが綺麗
```python
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

#ベースの四角形
x=np.array([-0.5,0.5,0.5,-0.5])
y=np.array([0,0,1,1])

#四角形をN個用意
N=10
#列数
cn=10
xl=list()
yl=list()
for i in range(N):
  xl.append(x+1.2*(i%cn))
  yl.append(y-1.2*int(i/cn))

cmap = plt.get_cmap("tab10") #ここでカラーマップの種類を指定
print(cmap)
#作図
fig = plt.figure()
ax = fig.add_subplot(111)
plt.axes().set_aspect('equal')

for xx,yy,cc in zip(xl,yl,range(N)):
  poly = plt.fill(xx,yy,fc=cmap(cc))


```
![cap2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403057/df4d7fb0-9c38-752e-4fdd-b07b14e41592.png)

matplotlibのpyplotの中には決まったカラーマップが準備されており、
それをget_cmap関数で呼び出すことができる。
カラーマップの種類として、**tab10**の他に、**Set1**が使い易そう。

詳細は以下の記事に詳しく書いてあります。
[matplotlibでcolor cycleのN番目の色を指定するいくつかの方法](https://qiita.com/skotaro/items/5c9893d186ccd31f459d)


どういうマップがあるかはリファレンスを参照。
[color example code: colormaps_reference.py](https://matplotlib.org/examples/color/colormaps_reference.html)

##１０個以上でも綺麗に出したい場合はどうする
###自分でカラーマップを作成してみる
10個以上必要な機会はないかもしれないが、どうしたらいいか考えてみた。
※前述のtab20を使うのも手ではあるが、色合いが気に入らない。

```python
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import colorsys

#ベースの四角形
x=np.array([-0.5,0.5,0.5,-0.5])
y=np.array([0,0,1,1])

#四角形をN個用意
N=20
#列数
cn=5
xl=list()
yl=list()
for i in range(N):
  xl.append(x+1.2*(i%cn))
  yl.append(y-1.2*int(i/cn))

#カラーマップ作製==========================
hexs=list()
for i in range(N):
  rgb=colorsys.hsv_to_rgb(i/N, 1, 1)#(h,s,v)を(r,g,b)に変換
  hexs.append(matplotlib.colors.rgb2hex(rgb))#(r,g,b)を16進数のカラーコードに変換

#作図
fig = plt.figure()
ax = fig.add_subplot(111)
plt.axes().set_aspect('equal')

for xx,yy,cc in zip(xl,yl,hexs):
  poly = plt.fill(xx,yy,fc=cc)

plt.show()

```

![cap3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403057/c73a735d-a674-ad7a-7f93-93a378409c52.png)


###色相を単純等分割する
色は赤、緑、青の３成分がどれくらい混ざっているかで表現するRGBが馴染み深いが、色相、再度、明度で表現するHSVという表現がある。
色相を等分割することで、異なる色を持つ任意の大きさのカラーマップを作ってみる。

HSVについてわかりやすい解説は以下を参照
[HSV色空間](https://www.peko-step.com/html/hsv.html)


##まとめ
基本はtab10を使って入れば問題なさそう。
自作のカラーマップはぱっと見綺麗に見えて良いが、
緑色は実際に使うとどれが若い番号の図か区別できないと思う。

もっと良い方法があれば編集したい。


（どうやったら見やすい配色ができるか調べていたら、***色のユニバーサルデザイン***とかいうのがあるらしい。）
BucketAnywhere の設定

Androidのアプリに「BucketAnywhere」（旧称S3Anywhere）というのがある（そういえばかなり前からあったような）。その名の通りAndroidスマホからAWSのS3バケットへのアクセスができる。
AWS初めて４年になるが、業務はオンプレでAWS使わないので（泣）趣味がてら機能を使って見ている。今回はスマホのバックアップとして、上記ソフトを使ってみる。とは言ってもファイルやフォルダを手で選ばないといけないので全自動では無い。改めて今回使おうとしたらすっかり忘れてたので手順を記録しておく。

1.AWSでS3のバケットを作成する。コンソールからメニュー一覧を選んで、名前をつけて作成する。
2.S3アクセス用のIAMを作成する。その前に今回はグループを作成して、そのグループにAmazonS3FullAccessのポリシーをアタッチする。
3.IAMユーザーを作成して、上記グループに含める。アクセスキーとシークレットキーをダウンロードか、画面コピーかして保存する。
4.S3の作成したバケットについて、アクセスポイントを作成する。作成したバケットを選択すると、「概要」「プロパティ」「アクセス権限」「管理」「アクセスポイント」のタブが出てくるので、「アクセスポイント」を開く。「アクセスポイントを作成」でアクセスポイント名を決めて記入、ネットワークアクセスタイプをインターネットにする。
5.アクセスポイントポリシーを作成する。例があるが、ちょっとわかりにくかった。ポリシージェネレータの記入例のままではダメで、そのページにあるアクセスポイントARNを、上書きしなければならなかった。
6.Androidのスマホで、BucketAnywhereを立ち上げてバケット「追加」、S3のURLは　https://s3.amazonaws.com/ キーID、SecretKeyは先ほど作成したIAMのものを記入、Bucket名を記入。その後「保存」

7.「接続」で、しばらくするとバケットの中身が表示される（はず）。