OmniAICreator/Qiita-1.07M huggingface dataset:
[Python] 半分全列挙と二分探索　JOI2008本選C

#[JOI2008本選C](https://atcoder.jp/contests/joi2008ho/tasks/joi2008ho_c)

#問題
N個の点数Pが書かれた的でダーツをする。はじめに謎の点数Mが設定され、その点数を超えないよう矢を的に向かって投げる。Mを超えると０点になる。矢は４本あるが全てを投げきらなくともよい。合計点を最大化したい。
#制約
$1 \leqq N \leqq 1000$
$1 \leqq p_i \leqq 10^8$

#考え方
４本投げるので単純探索を4重ループを書くと$O(N^4)$で間に合いません。「4 本の矢を投げる」ことを，「まず 2 本の矢をまとめて投げて，次に 2 本の矢をまとめて投げる」と考えます。実装としては、まず2 本の点数を**半分全列挙 $O(N^2)$**する。その結果を使い点数制限内で最大値を**二分探索 $O(\log N)$**することで、制限時間内に**全探索 $O(N^2\log N)$**することができそうです。

```python
import bisect

N, M = map(int, input().split())
P = [0]
for n in range(N):
    P.append(int(input()))

# 2本の点数を半分全列挙
S = []
for p1 in P:
    for p2 in P:
        S.append(p1+p2)
# ソートして二分探索に備える
S.sort()

ans = 0
for s in S:
    if M < s:
        break
    # 点数制限内での最大値を二分探索
    i = bisect.bisect_right(S, M-s)-1
    # それがこれまでの最大なら答えを更新
    ans = max(s+S[i], ans)

print(ans)
```
Google Apps Script 関数を特定のシート以外で実行したら、アラートを出す

#はじめに
Google Apps Scriptでスプレッドシートのプログラムを書いてると、こんな事起こりませんか？
**「エラーが出たと思ったら、アクティブにしてるシートが違った・・・」**

これはあるあるだと思うので、今回はそれを防止するプログラムを作る。

#そもそも「アクティブなシート」って？
<img width="386" alt="スクリーンショット 2020-05-19 13.46.47.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/72d79954-261f-6ce0-2bad-3fddcecc2de4.jpeg">

この場合は**「見積書」と言うシートがアクティブと言うことになる。**

###今開いているスプレッドシート内で、どのシートを開いているか？

これが分かれば、利用者にとても優しいプログラムを書けそうですね。
例えば、こちらを見て欲しい。:point_down:
[Google Apps Script 見積書からデータを転記し、指定フォルダに請求書を作成（スプレッドシート）](https://qiita.com/kokogento/items/420b80924c36e2674d5b)

上記の記事で紹介してるコードの場合、「見積書」と言うシートがアクティブでないと、エラーが出る。**なぜなら、取得する値がないからだ！**

「見積書」と言うシートにはG18のセルに値が存在したしても、それ以外のシートではG18のセルに値が存在しないかもしれない。結果、もしアクティブになってるシートが「見積書」以外のシートだった場合、値が存在しないのでエラーが出る。

#関数を特定のシート以外で実行したら、アラートを出す

```javascript
// Spreadsheetが開かれた時に自動的に実行されます.
function onOpen() {
  // 現在開いている、スプレッドシートを取得します.
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // メニュー項目を定義します.
  var entries = [
    {name : "請求書を生成"  , functionName : "menuItem1"},
    {name : "PDF化する"  , functionName : "menuItem2"},
  ];
  // 「Custom」という名前でメニューに追加します.
  spreadsheet.addMenu("Custom", entries);
}

// menuItem1をクリックした時の処理
function menuItem1() {
 //現在のスプレッドシートを取得
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = SpreadsheetApp.getActiveSheet();
 //見積書以外で実行したらアラート
 var nowSheet = sheet.getSheetName();
    
  if (nowSheet === '見積書') {
     Logger.log('見積書がアクティブです');
    } else {
    menuItem1Alert();
    }
}

function menuItem1Alert() {
  var ui = SpreadsheetApp.getUi();
  var title = '見積書で実行してね！';
  var text = 'じゃないと失敗するの・・・'
  ui.alert(title, text, ui.ButtonSet.OK_CANCEL);
}
```
[CakePHP 3.x] migration,seed command


# Technical requirement

* CakePHP 3.5

# Official reference

[CakePHP Cookbook 3.x - Migrations](https://book.cakephp.org/migrations/3/en/index.html)

# Command

## Migration

```
bin/cake migrations migrate
```

## Migration rollback

```
bin/cake migrations rollback
```

## Migration create

```
bin/cake migrations create MyCustomMigration
```

## Seed

```
bin/cake migrations seed
```

## Seed --seed

Specify only one seeder.

```
bin/cake migrations seed --seed [seeding class name]
```
Vue.js の transition-group が効かない。

## 注意点 1. key には繰り返す対象から直接持ってくる。

```vue
<!-- OK: key には繰り返す対象から直接持ってくる。 -->
<transition-group>
  <template v-for="element of array">
    <div :key="element.property"> {{ element.value }} </div>
  </template>
</transition-group>
```
```
<!-- NG: key には v-for の index を使わない -->
<transition-group>
  <template v-for="(element, index) of array">
    <div :key="index">{{ element.value }}</div>
  </template>
</transition-group>
```

* [Vue transition-group not working - Stackoverflow](https://stackoverflow.com/questions/41132868/vue-transition-group-not-working)

## 注意点 2. 移動中に移動している要素のプロパティを変更しない。

値をいれると瞬間移動します。

```js
// OK
function onClick () {
  // NG: 移動する前に変更するというのはダメでした。
  // this.array.map(element => 2* element.value)

  this.array = _.shuffle(array)

  // setTimeout で逃します。
  setTimeout(() => {
    this.array.map(element => 2* element.value)
  }, 2000)
}
```
```
// NG: 瞬間移動します。
function onClick () {
  this.array = _.shuffle(array)
  this.array.map(element => 2* element.value)
}
```
TensorFlow2.2はPython3.8ではインストールできないんだ！

##0.概要
Python3.8.3にアップデートした状態で，TensorFlow v2.2.0をインストールしようとしたのですが，ハマってしまいました．
結論，Python3.7.6にバックデートすれば，問題なくインストールできました．

##1.背景
Python初心者がTensorFlowパッケージの勉強のために環境構築を行っています．

##2.環境
OS:Windows10 Enterprise 1809 64bit
Python:(変更前)3.8.3, (変更後)3.7.6

##3.困ったこと
以下のコマンドで，tensorflowパッケージをインストールしようとしましたが，Error文が出てきてしまいました．

```:入力したコマンド
pip install tensorflow　　　　　　(c1)
```

```css:出力結果
ERROR: Could not find a version that satisfies the requirement TensorFlow (from versions: none)
ERROR: No matching distribution found for TensorFlow
```

##4.解決方法
pipのアップデートなども行いましたが，問題解決せず．
ならば，と以下のページからwhlファイルをダウンロードし，ローカルからpip installしようと思いましたがやはりダメ．

https://pypi.org/project/tensorflow/#files

なぜ？と色々調べてみましたがドツボにハマるばかり．

で，いろいろ調べてみると，リリースされたばかりのPythonバージョンだとtensorflowが対応していないことがあるとのこと．実際，Python v3.7が最新だった時には「tensorflowはPython3.6じゃないと動かないよ！」という注意書きがされているWebページも見つかりました．えー，本当？上記URLでは"tensorflow-2.2.0-cp38-cp38-win_amd64.whl"のファイルもあるのに・・・

ということで，おとなしくPython v3.7.6の仮想環境を新たに作って，再度(c1)のコマンドを入力．


すんなりインストールが始まりました．チャンチャン．


##5.補足
情報によっては，「tensorflowはv3.8に対応しているよ」というコメントも出てきたりするので，もしかするとv3.8.1やv3.8.2ならば対応しているかもしれませんね．ただ，ここであまりにギリギリを攻めすぎると，ほかのパッケージで同様の問題が発生する可能性もあるので，まずはv3.7.6で進めていくことにします．
Excelでクリップボード履歴を使う

詳細設計書を作成していて、あまりにもコピペが多かったので
良い方法はないかと考えたときに、windowsのコピー履歴を閲覧できる機能を思い出した。
Excel使用時にペーストできない問題があった為、軽くまとめる。

##使い方
参考：[【Windows 10】「クリップボード履歴」を活用する](https://www.atmarkit.co.jp/ait/articles/1903/08/news028.html)

上記の記事を参考にクリップボード履歴を使ってみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384409/0a2dcc99-b435-146c-aee4-229800e6e1b0.png)
windows + v キーを押すとクリップボード履歴が表示される。
または「スタート」→「設定」→「システム」→「クリップボード履歴」→「オン」で使用を許可する。
ここには25件ほど表示され、選択するとコピーされる（カーソルが入力モードになっていると選択時にペーストされる）。
ミートボールメニューから「削除/ピン留め/全てクリア」ができる。
常時使用するものはピン留めすると消えない。

例えば、コピーの取り溜めや、コピーできているかの確認に有効。
(不安で何度も「ctrl + c」を入力する人もいる)
##Excel使用時
これだけでも便利なのだがExcelで下記のような数行のセルをペーストするときにできないことがある（Escキーの後とか）。
なお失敗したときはクリップボードには何もコピーされていない状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384409/7f36d94a-672b-0cc9-4045-f026330fd40b.png)


試行錯誤した結果、クリップボード履歴で選択する前にExcel上で適当なセルで「ctrl + c」(コピー)を入力した以降だとクリップボード履歴が上手く反応する。

・関数はコピーされない。セル上の文字がコピーされる。
・挿入で追加した図形は画像としてコピーされる。

##クリップボード履歴使用時の注意点
場合によってこのクリップボード履歴機能にメモリが圧迫されることもあるらしい。
参考：[クリップボードの巨大データを消してWindowsを高速化](https://www.atmarkit.co.jp/ait/articles/2005/18/news011.html#cxrecs_s)


だが辞書と違い、頻繁に使用するExcelフォーマットやスクショをいつでも呼び出せるのは便利なので
これから使っていこうと思う。
○未満の数値を表示する方法

備忘録のため記述します。

 
      <script>
         var data = [59, 39, 100, 2, 15, 40, 84, 97];
 
        /* 以下に課題処理を追加 */
        var i =0;
        for (i=0; i< data.length; i++){
            document.write("<div>"+data[i]+"</div>");
        }
         
        var count =0; //人数の把握をします
        var j =0;
        for (j=0; j<data.length; j++) {
            if (data[j]< 40) {
                count++
            }
        }
        document.write("<div>40点未満の人は"+count+"人です</div>");
        
 
    </script>
今更だけどDockerについて学んでみた

# Dockerとは？
Dockerとは、従来のホスト型（VMware等）やハイパーバイザー型（ESXi等）の仮想マシン技術とは異なり、ホストOS上に用意した仮想空間”コンテナ”内で、OSやアプリケーションを実行できる仮想コンテナ技術を提供するOSSソフトウェアのこと。

2013年にdotCloud社（現 Docker Inc.）からリリースされた。現在は「DevOps環境の構築」や「ソフトウェア開発環境の構築」等の様々な分野で注目されている。

# 無償版と有償版
現在、Dockerエンジンには大きくわけて２種類存在する。１つは、無償版のDockerエンジンであり、もう１つは有償版のDockerエンジンである。無償版のDockerエンジンは、Docker Community Edition(DockerCE)と呼ばれる。一方有償版のDockerエンジンは、Docker Enterprise Edition(DockerEE)と呼ばれる。

# 活用事例
- [Pokemon GO](https://www.itmedia.co.jp/news/articles/1609/30/news085.html)
- [AbemaTV](https://ameblo.jp/principia-ca/entry-12164657818.html)
- [クックパッド](https://techlife.cookpad.com/entry/2018/04/02/140846)
- [リクルートグループ](https://www.slideshare.net/recruitcojp/Docker-50826578/)

# メリット/デメリット
## メリット
- 「アプリケーションの開発環境と実行環境をパッケージ化」し、迅速な配備や破棄が可能である。
- 仮想化技術の一種であり、１台の物理サーバ上に複数のコンテナを集約できるため、管理のコストや不可が削減できる
- 従来の仮想マシン（VMware等）と比較して、仮想OSを複数立ち上げる必要がなく、リソースの消費を抑えれるため、非常に軽量である
- イミューダブル・インフラストラクチャ（一旦、サーバを構築すると、ソフトウェアのバージョンアップやパッチ適用等の煩雑な管理を一切放棄するシステム）が可能である
- 『Docker Hub』と呼ばれるコミュニティサービスが活発であるため、既に多くのアプリケーションイメージが提供されている

## デメリット
- 大量のDockerコンテナの管理が大変である。そこで、コンテナ化したアプリケーションのデプロイ、スケーリング、及び管理を行うためにコンテナオーケストレーション（コンテナを効率良く運用・開発するための技術）システムであるKubernetesが利用されるケースが増加している。
- キャパシティプランニング（計画・開発中あるいは稼働中のITシステムに求められるサービス需要／サービスレベルからシステムリソースの処理能力や数量などを見積もり、最適なシステム構成を計画すること）のベストプラクティスの事例が少ないため、明確に定義することが難しい。
- ライブマイグレーション（動作中の仮想マシンを停止させることなく、別のサーバに移動して処理を継続させる機能）をサポートしていない。
- ホストOS上のコンテナで稼働させるOSに制約がある。例えば、ホストOSがLinuxの場合には、その上で稼働するコンテナもLinuxに限定されてしまう。

# 概要と概要図

![Docker概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/a78bd39e-3f14-d735-1376-ef628df9ec39.png)


- **Dokcerエンジン：** アプリケーションのパッケージ化やコンテナの実行を担う
- **Dockerイメージ：** OSやアプリケーションを含んだテンプレートのベースイメージ
- **Docker Hub レジストリ** ：公開されているDockerイメージをSaaS経由で提供する
- **Dokcer プライベートレジストリ** ：ローカルで作成・保管したイメージの保管庫
- **Docker コンテナ**：分離された名前空間とアプリケーションの実行環境
- **Docker クライアント** ：ユーザがコマンドを発行し、Dockerデーモンと通信を行う

Dockerでは、様々なOSとアプリケーションをパッケージ化された環境が、Docker Hubと呼ばれるレジストリサービスで用意されている。Docker Hubは「Docker Hub レジストリ」とも呼ばれ、インターネットを経由して、OS環境とアプリケーションを含んだイメージを入手することができる。

このDocker Hubから入手したイメージは「Dockerイメージ」と呼ばれる。Dockerイメージは、ベースイメージとも呼ばれており、Linux OSとアプリケーションを含んだ一種のテンプレートである。

Dockerのレジストリには、世界中のユーザや開発者が作成したDockerイメージが大量に保管されている。イメージを一から作成することも可能であるが、既にDocker Hubに用意されているイメージをそのまま利用できるため、OSやアプリケーションのインストールや初期設定等にかかる煩雑な作業工程を大幅に削減できるメリットがある。

一方で、インターネットを使わずに、ローカルのシステム用に配信するイメージの保管庫は「Docker プライベートレジストリ」と呼ばれる。ローカルのシステムにおいて、OSとアプリケーションのパッケージ化や、イメージを使ったコンテナの実行は、Docker本体が担う。このDockerの本体は、「Dockerエンジン」と呼ばれる。Dockerエンジンが実行するコンテナは、「Dockerコンテナ」と呼ばれる。

Dockerコンテナは、ホストOS上で複数同時に起動させることができ、ホストOSから見ると分離された名前空間として見える。通常ユーザは、Dockerデーモンが稼働するホストOS上でコマンドラインから操作を行うが、このDockerデーモンの操作を担う各種コマンドなどのインターフェースは「Dockerクライアント」と呼ばれる。Dockerクライアントは、Dockerデーモンが稼働するホストOS上でコマンドラインで操作できるが、遠隔地にあるDockerデーモンと通信を行うことも可能である。
wicked pdfは、windowsでは動きません！

wicked pdfをリファレンス通りに実行し、
ネットの記事を英語を含め読みまくっても、全く動かず、
エラーを吐きまくっていた。

なんでやねんと、検索してあたった記事がこれ。
https://github.com/mileszs/wicked_pdf/issues/693

以前はwindowsも対応していたらしいが、今はしていないらしい。

このコメントによって、公式のread meからwindows対応の文字が消された模様。

要するに、
***wicked pdfは、windowsでは動きません！（2020.05.19時点）***

local環境だけでよければ可能なもよう。
windowsのc:にダウンロードして、
rails アプリのpathの先を、wicket PDFのインストール先に設定すると
動くみたい。

だが、某は本番アプリで使いたいので、意味がなし！！！
ってなことで、windowsユーザーのプログラマーさんは、
無駄な時間を使わないようにお気を付けください。
初めてのAWS Lambda〜Hello World

## AWS Lambdaとは
サーバレスでコードを実行でき、Java、Go、PowerShell、Node.js、C#、Python、Rubyをサポートしている
https://aws.amazon.com/jp/lambda/faqs/

## 実際に使ってみる
AWSのチュートリアルを参考に。
https://aws.amazon.com/jp/getting-started/hands-on/run-serverless-code/

- コンソールを起動
「コンピューティング」→「Lambda」  
<img width="235" alt="スクリーンショット 2020-05-18 19.08.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236230/e2084ca6-72b4-5ec4-4ca1-6e5e67cce396.png">

- 設計図を選択
設計図=テンプレートのようなものかな？  
「Hello」で検索すると、node.jsとpythonの「Hello World」設計図が検索されるので、今回は「hello-world-python」
<img width="1314" alt="スクリーンショット 2020-05-18 19.24.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236230/8bbe20ca-5164-7239-af12-df182acd354b.png">

設計図の中身はこんな感じです

```python
import json

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')
```

- テストイベントの作成  
関数作成画面右上にある「テストイベント作成」から関数呼び出し時に渡すjsonの作成

```json
{
  "key1": "Hello!World1",
  "key2": "Hello!World2",
  "key3": "Hello!World3"
}
```

- イベントを選択して関数実行  
実行ログが吐き出されて、関数が実行されたことを確認

```
START RequestId: e5f1d7c7-9082-4634-a7aa-4363eab2c2e2 Version: $LATEST
value1 = Hello!World1
value2 = Hello!World2
value3 = Hello!World3
END RequestId: e5f1d7c7-9082-4634-a7aa-4363eab2c2e2
REPORT RequestId: e5f1d7c7-9082-4634-a7aa-4363eab2c2e2	Duration: 1.37 ms	Billed Duration: 100 ms	Memory Size: 128 MB	Max Memory Used: 49 MB	
```

### 次回
今回は用意された設計図から関数を作成したので、次回は自分で関数を作成〜実行までを試す
JavaScriptでドラゴンボールを見つけるためにfor,if文書こう！

# はじめに
- そもそもJavaScriptの動かし方
- for文
- if文
- 最後に

## そもそもJavaScriptの動かし方

JavaScriptには様々な動かし方があります。私が書いている記事のようにhtmlに埋め込んで動かす方法もありますが、ただ動かして見たいだけならブラウザから直接動かしてみましょう！chromeなどのブラウザにはJavaScriptを動かす機能が元々備わっているのでちゃんと動いてくれます。試しに簡単な文章を書いて動くか見てみましょう！！まずはchromeでデベロッパーツールを選択しconsoleに記入しましょう！ここに記入しenterを押せばしっかり動きます。

~~~.js
console.log("hello!!")
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637759/3615b3b4-909d-591e-c783-c0d478804a1e.png)

こんな感じで動いてくれます。
alertも動かしてみましょう！

~~~.js
alert("hello!")
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637759/0e6ad135-9357-f48b-4525-c82d5f3c7553.png)

よく見るポップアップが表示されましたね！！

## for文
今回は簡単な基本文法であるfor文を紹介したいと思います。簡単とはいえよく使う便利な文法ですのでしっかり覚えましょう！
10回繰り返してconsoleするものを書いてみます。

~~~.js
for (var i = 0; i < 10; i++) {
    console.log(i)
}
~~~

これで実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637759/54b8aa70-5330-6ccb-828a-058babdf1de9.png)
こんな感じで0~9まで書き出してくれます。
これが基本的なfor文の書き方です。三つの要素は左が最初の数字、真ん中が続く条件、右が増え方です。++は一つずる増えるという意味です。ここらへんの数値をいじることで、for文の細かな設定をしていきます。

## if文
if文もfor文同様によく使う文法です。簡単ですが応用のきく文法ですので基本をおさえておきましょう！！
今回はhtmlに埋め込んで動かしますね。

~~~.html
<html>
    <head>
        <meta charset="utf-8">
        <title>jstest</title>
    </head>
    <body>
        <script>
            var i = 10;
            if (i > 10) { 
                document.write("10より大きい")
            } else {
                document.write("10以下")
            }
        </script>
    </body>
</html>
~~~

scriptタグの中にJavaScriptを書くことで実行することができます。今回はconsoleではなくdocument.writeを使います！
このhtmlを開くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637759/60978ac7-12db-71cf-6e0b-437f279d30d4.png)

こんな感じで表示されます！
今回はiが１０だったためelseの中が作動し10以下と表示されました。この書き方意外にもelseifなどで条件を増やすことができます。

## 最後に
いかがだったでしょうか？if文for文の基本的な書き方を紹介しました。これだけの知識だとあまり使い物になりませんが、応用させることでより複雑なプログラムを書くことができます。私が載せているgoogle maps APIでもfor,if文を活用しています。是非ご覧になってください！
https://qiita.com/Ryunosuke-watanabe/items/958ed12471effc8fd778
大阪府のコロナ追跡システムを考えてみる1

大阪府のコロナ追跡システムの開発費が80万円と言うことなので、その予算でできるのか考えてみる。
来月(2020年6月)のリリースが納期らしいので、答え合わせも兼ねてそれまでに公開する。
ついでに、システム開発フローの復習もする。


# RFP
RFP(提案依頼書)は下記URLとする。
https://www.yomiuri.co.jp/national/20200513-OYT1T50154/

システム概要：店や会場で新コロ感染者が発生した場合に接触者(接触の可能性のある者)に通知を行う


**このあたりは想像の範囲。。。**
要望:
1.個人情報を扱わない
2.複雑な手順でない
3.利用者が限定されない

# 予算配分
外注か内製かで大きく変わるが、人件費と機器費用とシステム開発費で計算する。

- 人件費
    - SE ¥500,000→¥250,000
    - PG ¥400,000→¥200,000

     *すでに予算オーバーだが、半月で半額としてみる。安すぎて怒られそう。。。

- 機器費用(内製というか自治体のサーバを間借りするのでコストなしと仮定する) 
    - Webサーバ ¥0
    - メールサーバ ¥0
    - DBサーバ ¥0

     *サーバ購入だけでHW保守含めると予算飛びますが。。。

- システム開発費
    - Webサイト相当 ¥350,000
 
本来であれば、運用コストが発生しますし、開発費も倍以上かかりそうですが、
あくまでやりたいことはメールアドレスの登録と通知なので、簡略化して目を瞑ります。
# 要件定義
1-1.メールアドレスのみ登録とする(捨て垢で可)
2-1.QRコードを利用する
3ｰ1.スマートフォン(実際はQRコードを読み取れれば問題ない)を利用する


#まとめ
要件定義まではすぐにできた。
台湾や韓国のような位置情報を含めたアプリの導入ではないので、意外と安く済む。

予算配分はめちゃくちゃすぎて、SESやSIerの方々に怒られそう。。。
予算の80万というのも、人件費含めてないかもしれない。
LogstashでString型をDate型に変換することに苦戦した話

# 目的
下記フォーマットの日付文字列を、Date型に変換したかった。

```
Sat Aug 10 17:15:31 JST 2019
```

# 実施内容
次のフィルターで変換を試してみたが、String型のままでDate型に変換されず...

```logstash.conf
date {
  match => ["SampleTimeStamp", "EEE MMM dd HH:mm:ss ZZZ yyyy"]
  target => "SampleTimeStamp"
}
```

うーん、Date filter pluginの公式ドキュメントを読んでも、コードの書き方間違ってない気がするんだけどなぁ～。

Date filter plugin公式ドキュメント：https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html

ここで「JST」の文字列が、タイムゾーンの標準的な形式では無いのでは？と疑い始めた。

僕の直観は当たっていた！疑問通りで、Joda-Timeのタイムゾーン一覧を確認すると「JST」が存在してないじゃないか...

Joda-Time タイムゾーン一覧：http://joda-time.sourceforge.net/timezones.html

更にJoda-Timeのドキュメントを読み進めると、以下の記述を発見した。

```
'       escape for text              delimiter
```

なるほど、テキストとして扱ってシングルコートでエスケープしてあげれば良いのか。早速、試してみた。

```logstash.conf
date {
  match => ["SampleTimeStamp", "EEE MMM dd HH:mm:ss 'JST' yyyy"]
  target => "SampleTimeStamp"
}
```

**見事にString型からDate型に変換成功！！！**
【python】Jupyter-notebook + pandas + multiprocessing(Pool)を動かす方法【pandas】 メモ

# 目的
* 大量のcsvデータを分析するために、データをたくさん読み込む必要があった
* ループを回すと遅すぎてイライラしました。

# 問題
* Jupyter-notebookでmultiprocessing(Pool)を利用したpandasのread_csvの並列化ができない。
* [このへん](https://stackoverflow.com/questions/47313732/jupyter-notebook-never-finishes-processing-using-multiprocessing-python-3)とか[このへん](https://github.com/ipython/ipython/issues/10894)にも、同様のことが書いてあった。
* Windows機のみで起こる問題らしい？

# 結論
* 回避策は、関数を`func.py`として保存し、Jupyter-notebookでimportする。

# NG例
* 最終セルが終わらない。（そもそも始まってない？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/2b6bd471-21e0-df9f-600a-f4ee8f54b16f.png)


# OK例
1. `.ipynb`と同じフォルダに`func.py`として丸ごとコピーする
2. `__init__.py`ファイルを置く
3. Jupyter-notebook上で、funcをimportして実行する

```python:func.py
import pandas as pd
import os,glob
from datetime import datetime as dt
from multiprocessing import Pool

FOLDER_PATH = r'folder_path\\'
FILE_TYPE = r'*.csv'
FILE_FORMAT = 'Report_%Y%m%d.csv'

def read_report_to_dataframe():
    # ファイルパスをリスト化
    csv_pathlist = glob.glob(FOLDER_PATH + FILE_TYPE)
    with Pool(os.cpu_count()) as p:
        df = pd.concat(p.map(read_report, csv_pathlist))
        
    return df 

    
# report読み込み
def read_report(csv_path):
    separator_list = [';',',']

    for sep in separator_list:
        df = pd.read_csv(filepath_or_buffer=csv_path,
                         engine='python',
                         parse_dates=[0],
                         index_col=[0],
                         skiprows=[1],
                         nrows=96,
                         sep=sep)
        # データフレームが空か確認
        if not df.empty:
            break

    return df 

```

* jupyter-notebookの方で読みだして実行する。

```python:jupyter-notebook
import func
func.read_report_to_dataframe()
```

# まとめ
* jupyter-notebookやめて、pycharmで作ります。
Docker, Docker compose コマンドメモ


- よく使う＆忘れがちなdocker のコマンドを中心にメモ．

存在しているコンテナのうち，停止しているコンテナを起動させる

```
docker start (comtainer id)
```

```
ex) docker stop f4a7cfeb3445
```

起動しているコンテナを停止させる

```
docker stop (comtainer id)
```

```
ex) docker stop f4a7cfeb3445
```

今起動中のコンテナの一覧を表示

```
docker ps 
```

今存在している，起動中or停止中のコンテナの一覧を表示

```
docker ps -a 
```
スプレッドシートをDB代わりにGASのWebアプリを作成しデータ更新させてみた。Vue版 その３～～

[スプレッドシートをDB代わりにGASのWebアプリを作成しデータ更新させてみた。Vue版 その２～～](https://qiita.com/yamamow/items/38ad08c3cf85ec9df0e7)からの続きです。

今回は更新処理を行います。
とはいっても難しいことはありません。
まずは、以下の更新ボタンをクリックします。

```html:vue_index.html
<button v-on:click="upd_item" class='btn-radius-orange'>　更新　</button>
```
「v-on:click」で指定されている「upd_item」が呼ばれます。

Vue側の以下の「upd_item」が呼ばれます。

```javascript:vue_js.html
methods:{  //の中の・・・

    // 更新画面（モーダル）でのデータ更新後、モーダルOFF
    upd_item: function(){
              google.script.run.withSuccessHandler(this.refitem)
                               .withFailureHandler(function(arg){
                                   alert("データの更新に失敗しました。");
                               }).setUpdData(this.refitem);
              // モーダル画面を閉じる
              this.dispDetails = false;
              this.showContent = false;                      
          },
```
データ更新も「google.script.run.」を使い、「コード.gs」の「setUpdData」を「this.refitem」をパラメータに呼び出します。
更新失敗時にはアラートを出すようにしています。
成功時にも一応「this.refitem」を入れてはいますが、画面遷移上、モーダルは消えて、次の詳細を表示しようとする際には新しいデータが入ってくるので特に問題なしです。

「コード.gs」の「setUpdData」は以下のようになっており、更新と新規登録の両方に対応させました。新規登録のモーダルは説明していませんが、更新とほぼ同じです。データがないのでプロパティに「未設定」としたり、データを空にしたり、空の配列を作ったりしたものを表示しているだけです。
「setUpdData」では、更新時はスプレッドシートの行番号をそのままつかますが、新規登録時はmaxにプラス１して行番号を指定しています。違いはそれだけですね。

スプレッドシートなのでお決まりの、どのシートかを設定します。
そして、更新データだけの配列を用意します。
指定した「this.refitem」の中には余計なものがたくさん入っていますからね。

```javascript:コード.gs
//データ更新(新規も対応）
function setUpdData(ary) {
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spread.getSheetByName('database');
  var arrayUpd = [ary.length];
  var typeIdx = 2;                // inputなどのタイプの要素番号
  var dataIdx = 4;                // データの要素番号
  
  if (ary[0][dataIdx] == "未設定") {
    // 新規用
    arrayUpd[0] = sheet.getLastRow()+1;
  } else {
    arrayUpd[0] = ary[0][dataIdx];  // 行番号を格納
  }
  arrayUpd[1] = getDateOfTokyo(); // タイムスタンプをセット
  
  // 更新データだけの配列を作成しながら、checkboxのデータは配列から文字列に変換する
  for (i=2; i < ary.length; i++) {
    if (ary[i][typeIdx] == "checkbox") {
      arrayUpd[i] = ary[i][dataIdx].join(',');
    } else {
        arrayUpd[i] = ary[i][dataIdx];
    }
  }
  var tmp = [];
  tmp.push(arrayUpd);
  dataSave(sheet,arrayUpd[0], 1, 1, arrayUpd.length,tmp);
  return true;
}
```
更新データの１つ目はスプレッドシートの行番号、２つ目はタイムスタンプ。この２つは、このシリーズではお決まり（固定）とさせていただいてます。
「// 更新データだけの配列を作成しながら、checkboxのデータは配列から文字列に変換する」以降でデータを取得し、配列に入れています。
そして「checkbox」の時だけ、もう１処理しています。
それは、例えば、「駐車場」と「駐輪場」にチェックが入っていた場合、
プロパティデータ上は、[駐車場,駐輪場]という配列になっていますので、
文字列として、、、、「駐車場,駐輪場」の形にして保存することにしています。
（そのため、データを表示する際は、「駐車場,駐輪場」の文字列から[駐車場,駐輪場]の配列に（変換しています。）
そして、「var tmp = [];」で更にpushしていますが、これは、
スプレッドシートにデータを反映するには（１行しか更新しなくても）表形式的な感じで更新するので、２次元配列にする必要があります。そのため「tmp」を用意し、pushしています。

ここから更に「dataSave」に飛ばしています。
ここではバッティングしないように見よう見まねで実装しています。
全ソース公開時に見ていただければと思います。

あとは、モーダルを閉じて、一覧画面に戻ります。

一覧画面に戻った時にリフレッシュしたかったのですが、できず・・・
検索ボックスに何もいれずに「検索」ボタンを押せばリフレッシュされます。

次は、ソースを公開していったん終了ですね。

ではまた。

追記：：
完結させましたぁ～
[スプレッドシートをDB代わりにGASのWebアプリを作成しデータ更新させてみた。Vue版 その４[完結編]～～](https://qiita.com/yamamow/items/1b223bdd44cd41cfe2f9)
JavaScript 学習記録　＃2　Dateオブジェクト

12時間時計にする方法:point_up:


24時間表記で表示されるのは、getHoursメソッドで取得できる数字をそのまま出力しているためです。
Dateオブジェクトに12時間表記の時間を取得できるメソッドはないため、加工が必要です。

15：13　を　3：13 p.m とするためには・・・？:thinking:

方法はいくつかあります。

①コードの書き方はこんな感じ:point_down:

```javascript:date.js

<script>
    'use strict';
    
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth();
    const date = now.getUTCDate();
    const hour = now.getHours();
    const min = now.getUTCMinutes();
    let ampm = '';
    if(hour < 12){
        ampm = 'a.m.';
    }else{
        ampm = 'a.m.';
    }
    
    const output = `${year}/${month + 1}/${date} ${hour}:${min}`;
    document.getElementById('time').textContent = output;
</script>
```
②処理の流れ:point_down:

24時間表記を12時間表記にするには、大きく分けて2つの処理が必要である。

1⃣　現在時刻は午前「a.m.」なのか「p.m.」なのか判別する

 プログラムの最初の部分で変数ampmを定義し、空の文字列（文字数が0個の文字列）を代入する。そして、定数hourに保存されている数値が12より小さい、現在時間が0時～11時の場合、変数ampmに「a.m.」を代入する。定数hourの値が12以上の場合は「p.m.」を代入する。

2⃣　0～23の数字を0～11に変換する

定数outputに代入するときには、24時間表記の時間を12で割った余りを計算すれば良い。
　${hour % 12 }

※ 「どう処理すれば良いか」を考えることが大切:point_up:
Excelでこんなことやってたよなー、をPythonに置き換える

メモ書き、これまでexcelで頑張ってたことをPythonに置き換える中で調べたことをメモメモ
pandasとnumpy使えるようにトレーニング中
超初心者なのでこれが最適なのかは不明、今後の自分に期待


## データを連結させる(縦方向)

```Python
pd.concat([dfA, dfB], ignore_index=True)
```
ignore_index=True　でindexをふり直し。こーゆーの一気にできるのが嬉しい。




##データを結合させる（横方向）
####１、結合キーとなるカラム名が同じ場合
```Python
pd.merge(dfA,dfB[["columnA","columnB","columnC" ]],on = "columnA", how="left")   
```
dfAにdfBを結合。onで結合する際のキーを指定。howで結合方法を指定。
似たようなものにjoinというのもあったけどとりあえずパス。あとで調べる。

####２、結合キーとなるカラム名が違う場合
```Python
pd.merge(dfA, dfB, left_on = "columnA", right_on = "columnB", how="left")   
```
left_onとright_onでカラム名指定する

## 売上点数と商品単価から売上列を作る

```Python
df['sales'] = df['quantity'] * df['price']
```
作る列名を指定して、単純に掛け算。売上は英語でsalesであってるのか。知らん。


## 基本統計量の把握

```Python
df.describe()
```
これほんと便利。Pythonに置き換える決意して良かったと思う瞬間。


## 入力がめちゃくちゃな日付を統一する
#####１、数値データを日付に変換
```Python
zzz = df['datetime'].astype(str).str.isdigit()
xxx = pd.to_timedelta(df.loc[zzz, 'datetime'].astype('float'), unit='D')+pd.to_datetime("1900/01/01")
```
１行目で数値データとして取り込んでしまったものを特定している。.str.isdigit()は「全ての文字が数字なら真、そうでなければ偽」
２行目で数値をDatetime型に変換。to_timedeltaでDatetime型に変換。

#####2、正しいデータも念のため書式統一
```Python
yyy = pd.to_datetime(df.loc[~zzz, 'datetime'])
```
区切り文字とかが違うかもしれないので１でやった処理と同様にdatetime型にする。
~zzzでzzzじゃないところ。つまり  ~zzz = (zzz = False)

#####3、変換したデータを結合
```Python
df['datetime'] = pd.concat([xxx, yyy])
```
変換したデータを結合して元のデータ列にあてこむ。これは便利だ

## 月別でデータ集計（日付データしかない時）
#####１、年月列を作る

```Python
df['datetime']  = pd.to_datetime(df['datetime'])
df['month'] = df['datetime'].dt.strftime('%Y%m')
```
1行目でdatetime型に変換して、２行目で年月だけを取り出す。
.dt.strftimeで時刻を文字列に変換。
2020/4/1 →　202004
となる。

#####2、月別集計

```Python
df.groupby('month').sum()['sales']
```
groupbyでまとめたい列を指定。その後に集計方法。売上だけ表示したいので['sales']を記載。
え、まって、めっちゃ楽。
groupbyは階層集計にすることもできる

#####3、階層集計
```Python
df.groupby('month','product_name').sum()['sales']
```
月別商品別集計のできあがり


## ピボットテーブルを作る

```Python
pd.pivot_table(df, index='product_name', columns='month', values=['sales'], aggfunc='sum')
```
長いけどやりたいことを１つ１つ記述しているのでわかりやすい。
行に商品名、列に年月、値は売上、aggfuncは値の集計方法。Excelでやってる時と操作イメージは全く同じ


## 大文字小文字を統一する

```Python
df['product_name'].str.upper()
df['product_name'].str.lower()
df['product_name'].str.capitalize()
```
1つ目が小文字を大文字に、２つ目が大文字を小文字に、３つ目が先頭文字だけ大文字あとは小文字に
結構使う


## 余計な空白埋める

```Python
df['product_name'].str.replace('　','')
```
.str.replaceは文字置き換え。空白を何もない状態に置き換えてる。これも便利


## 欠損値チェッカー

```Python
.df.isnull().any(axis=0)
```
これで各列に欠損値があるかわかる。True or Falseで返ってきます。axisの方向が覚えられなくて辛い。



# まとめ
Excelに比べて慣れると操作が格段に早く、何より検算がかなり早くできる印象。
データ分析前の処理をもっと早くできるように精進しよう。
Undefined method `password_digest'の解決方法

#Undefined method　password_digest

単なるスペルミスによるエラーだった。エラー文には

```
undefined method `password_digest='
       Did you mean?  password__digest=
                      password__digest
                      password__digest?
```
とあった。password__の_が全角になっていたので直す。

そしてデータベースを変更してRspecをしてOKかと思われたが..

#引き続きエラー。エラー文も変わらない。
これはテスト用のデータベースが変わっていない為。なので、

```
rails db:migrate RAILS_ENV=test VERSION=0
```

このコマンドを打つことでテスト用にマイグレーションファイルをいちからマイグレートする。

そしてRspecして通ればOK。
Chrome拡張機能でContent ScriptでMessage Passingする方法

Content Scriptは特定のURLを開いたときに開いたページを操作するのに使用しますが、
［こちら］(https://qiita.com/plumfield56/items/92a3656d6b24aa5e9f7e)
でも書いたように使用できるAPIが限定されるので、
runtime, storage以外のAPIを使用する場合はMessage Passingをする必要があります。

この記事では下記画像のように開いたページのリンクの数を
タブに表示するコードを載せています。


<img width="456" alt="2020-05-19_13h22_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/23fc1109-d95c-95f8-b0c4-e538cc61e824.png">


```:フォルダ構造
フォルダ
 ├ manifest.json
 └ content.js // Content Scriptを動かすJavaScript
 └ event.js // Content Scriptを動かすJavaScript
```

```json:manifest.json
{
  "manifest_version": 2,
  "name": "Link Count",
  "version": "1.0",

  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"]
    }
  ],

  "background": {
    "scripts": ["event.js"],
    "persistent": false
  },

  "browser_action": {
    "defalt_icon": {
      "16": "icon.png"
      }
  }
}
```


```javascript:content.js
(function(){
  'use strict'; 
    const links = document.getElementsByTagName('a');
    // sendMessageでcountをキーにしたテキストを送付
    chrome.runtime.sendMessage({count: links.length}, () => {
        console.log('massage sent');
      });
})();
```


```javascript:event.js
'use strict';
{
  // onMessageで受け取る
  chrome.runtime.onMessage.addListener(function(message, sender, callback) {
    chrome.browserAction.setBadgeText({text: message.count + ''});
  });
}

```


この記事は[Chrome拡張機能の作り方](https://qiita.com/plumfield56/items/680ce9a166282b7ae84c)の一部のコンテンツです。
vue.js 画像をリサイズしてアップロード

画像をリサイズしてアップロード。

javascript側で 画像を多少加工してPHPに送るとexif情報を失うので、
あとでPHPで対応することができない。
よって先にexifを元にjsで加工しておく必要がある。

参考
https://qiita.com/su_mi1228/items/f8f729a29f0b980f7e32

ボタンのデザインの変更
https://qiita.com/yasumodev/items/c9f8e8f588ded6b179c9


インストール

```

npm install --save blueimp-load-image

```

あとはコピペで動く

```


<template>

    <div>
        <input type="file" accept=".jpeg,.jpg,.png" @change="attachImg">
        <img :src="resizedImg">
    </div>

</template>



<script>

    import loadImage from 'blueimp-load-image';

    export default {

        data() {
            return {
                resizedImg: null
            };
        },

        methods: {

            attachImg(e) {

                const file = e.target.files[0];

                loadImage.parseMetaData(file, (data) => {

                    const options = {
                        maxHeight: 512,
                        maxWidth: 512,
                        canvas: true
                    };

                    if (data.exif) {
                        options.orientation = data.exif.get('Orientation');
                    }

                    this.displayImage(file, options);
                });
            },

            displayImage(file, options) {
                loadImage(
                    file,
                    async (canvas) => {
                        const data = canvas.toDataURL(file.type);

                        console.log(data);

                        // data_url形式をblob objectに変換
                        const blob = this.base64ToBlob(data, file.type);
                        // objectのURLを生成
                        const url = window.URL.createObjectURL(blob);
                        this.resizedImg = url; // resizedImgはdataで定義
                    },
                    options
                );
            },

            base64ToBlob(base64, fileType) {
                const bin = atob(base64.replace(/^.*,/, ''));
                const buffer = new Uint8Array(bin.length);
                for (let i = 0; i < bin.length; i++) {
                    buffer[i] = bin.charCodeAt(i);
                }
                return new Blob([buffer.buffer], {
                    type: fileType ? fileType : 'image/png'
                });
            }



        }
    }
</script>


```
leftist heap (meldable heapの一種) の 実装 と 構造

##問題
最適二分探索木問題
https://atcoder.jp/contests/atc002/tasks/atc002_c
##leftist heapとは
priority queue の一種で、二つのpriority queue を合体して新しいやつを作る操作が$O(log N)$でできるデータ構造です。
hu-Tuckerのアルゴリズムを実装する際に、この操作を高速で行えるこのデータ構造が重宝されるみたいです。
このデータ構造についての解説は以下のサイトがまとまっていてわかりやすかったので、ぜひ参照してね。

- http://hos.ac/blog/
- https://www.geeksforgeeks.org/leftist-tree-leftist-heap/

簡単に言うと、各ノードが葉への最短距離を持っていて、左の子より右の子のほうが常に葉への最短距離が短くなるようにスワップしながら、二分木を作っていくことで葉までの深さを$O(log N)$に抑える感じみたい。
##ソースコード
```c++
template <class T,class Compare=function<bool(T,T)>>
struct Heap {
    struct Node {
        //各ノードの持つ値
        T key;
        //子供
        Node *l, *r;
        //葉までの最短距離
        int s;
        Node(T &key, Node *lt = NULL, Node *rt = NULL, int s = 0) {
            this->key = key;
            r = rt;
            l = lt;
            this->s = s;
        }
    };
    //根
    Node *root;
    Node *l, *r;
    //比較関数
    Compare com;
    Heap(Compare comp = greater<T>()) : com(comp) {
        root = NULL;
    }
    //heapを合体
    void meld(Heap &rhs) {
        if (this == &rhs) return;
        root = meld(root, rhs.root);
        rhs.root = NULL;
    }
    Node *meld(Node *a, Node *b) {
        if (a == NULL) return b;
        if (b == NULL) return a;
        //比較関数を使って、ノードを並び替え
        if (!com(a->key, b->key)) swap(a, b);
        if (a->l == NULL)
            a->l = b;
        else {
            a->r = meld(a->r, b);
            if (a->l->s < a->r->s) {
                swapChildren(a);
            }
            a->s = a->r->s + 1;
        }
        return a;
    }
    void swapChildren(Node *h) {
        Node *tmp = h->l;
        h->l = h->r;
        h->r = tmp;
    }
    void push(T x) {
        root = meld(new Node(x), root);
    }
    T top() {
        return root->key;
    }
    void pop() {
        Node *oldroot = root;
        root = meld(root->l, root->r);
        delete oldroot;
    }
    bool empty() {
        return root == NULL;
    }
};
```
画面遷移時にMain Thread Checkerのエラーが出た時の対処法(Swift)

#はじめに
画面遷移などをする際に下記のようなエラーが出た時の対処法を紹介します。

```
エラー内容
"Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread"
"Main Thread Checker: UI API called on a background thread"
```


##対処法 (DispatchQueue.main)
DispatchQueue.main.sync {} もしくは DispatchQueue.main.async {} の中に対象のコードを入れる


同期処理の場合

```
DispatchQueue.main.sync {
  navigationController?.popViewController(animated: true)  ←ここに画面遷移などのコードを記載
}
```
<br>

非同期処理の場合

```
DispatchQueue.main.async {
  navigationController?.popViewController(animated: true)  ←ここに画面遷移などのコードを記載
}
```

##原因
UIの更新はメインスレッドで行う必要があるため、DispatchQueue.mainに処理を追加しないといけないとのこと。
https://1000ch.net/posts/2016/dispatch-queue.html
https://developer.apple.com/documentation/dispatch/dispatchqueue
HerokuデプロイでMySQLのConnectionErrorが出たときの対処


##状況
heroku上にアプリを作成するまでは完了していて、URLにアクセスしたら「Welcome to your new app!」と出て、
herokuへgitでプッシュまでしたのですが、最後にデータベースを作成しようとしました。しかし、ここでConnectionError。

```rb
$ heroku run rails db:migrate
:1033:in `retrieve_connection'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/connection_handling.rb:90:in `connection'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/tasks/database_tasks.rb:172:in `migrate'
/app/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/railties/databases.rake:60:in `block (2 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.4.3/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.4.3/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.4.3/lib/rails/command.rb:48:in `invoke'
/app/vendor/bundle/ruby/2.5.0/gems/railties-5.2.4.3/lib/rails/commands.rb:18:in `<top (required)>'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:291:in `block in require'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:257:in `load_dependency'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:291:in `require'
/app/bin/rails:9:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
```

##解決した方法
色々なサイトをみているうちに、DATABASE_URLが関係あるということがわかったので、見てみる。

```rb
$ heroku config | grep CLEARDB_DATABASE_URL
=> CLEARDB_DATABASE_URL=mysql://~省略
```
**「mysql://」を「mysql2://」に変える必要がある!**
gemではmysql2を使っていたので対応させる必要があった。

なので上書きします

```rb
$ heroku config:set DATABASE_URL=mysql2://~省略
Setting DATABASE_URL and restarting ⬢ アプリ名... done, v9
DATABASE_URL: mysql2://~省略
```
これで上書きされました。
そして再度データベース作成をしてみます

```
$ heroku run rails db:migrate
...省略
Migrating to CreateIntros (20200518235947)
== 20200518235947 CreateIntros: migrating =====================================
-- create_table(:intros)
   (10.1ms)  CREATE TABLE `intros` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL)
   -> 0.0106s
== 20200518235947 CreateIntros: migrated (0.0106s) ============================
```
これで正常にDBが作成され、公開できます。
Oracle Autonomous DatabaseをOMCの監視対象に追加する

Oracle Management Cloudは、Autonomous Databaseを監視対象に追加することができます。この場合、従来のCloud Agentではなく、API方式での監視となります。
以下に設定手順を紹介します。

- 管理 -> 検出 -> クラウド検出プロファイルをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/13044f4d-292e-c9cb-f0c7-d5f91e8ad281.png)

- リージョンはOMCインスタンスが稼働しているリージョンを選択する。※OMCとAutonomous DBは同じリージョンでなければならない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b5592010-68b0-4ba4-d4ad-e8367a229f2e.png)

- 資格証明の項目は、OMCがAutonomous DBにアクセスするために使用する。OCIから適切な情報を取得して入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d4bfddff-6b38-0828-9852-d7da3b8129ed.png)
ユーザーに必要な権限は[こちら](https://docs.oracle.com/cd/E83857_01/paas/management-cloud/mcdbm/configure-oracle-database-management.html)を参照


- 検出の成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/83d4e09d-7aea-0676-4600-368e01695d8e.png)

- Autonomous DBの各種情報をInfrastructure Monitoringで参照。しきい値でのアラートなど従来のOracle DBと変わらず同様に監視することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/2bce25d8-505a-a178-c901-9c0cd29172e3.png)

- Autonomous DBの監査ログ(Unified Audit)はLog Analyticsで参照できる。エンティティは自動的に追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/86c612e4-7165-c47f-88b0-39af81086dc9.png)

OCIコンソールには、もちろんAutonomous DBを監視する機能を持っていますが、多数のDBを集約的に監視したり、Autonomous DBの監査ログの値に基づいたアラート通知など、OMC側の機能も組み合わせて使用するメリットも多々ありそうです。
Ruby public protected private

## public
デフォルトの設定、クラスの外部からでも呼び出せる。
## protected
外部から隠す
そのメソッドを定義したクラス自身と、そのサブクラスのインスタンスメソッドからレシーバ付きで呼び出せる
## private
外部から隠す
クラスの内部とサブクラスでのみ使用できるメソッド
レシーバを指定して呼び出すことはできない
PRML 演習問題 2.4 （標準）

## 問題
> 二項分布の平均が（2.11）であることを示せ。これには、正規化条件（2.264）の両辺を $\mu$ で微分し、変形して $n$ の平均を求めよ。同様に、（2.264）の両辺を $\mu$ について2階微分し、二項分布の平均（2.11）も用いて、二項分布の分散の結果（2.12）を証明せよ。
>
```math
\begin{align*}
\ Bin(~m~ |~N, \mu) = \left(\begin{array}{c} N \\ m \end{array} \right) \mu^m (1 - \mu)^{N - m}
\tag{2.9}
\end{align*}
```
>
```math
\begin{align*}
\sum_{m = 0}^N \left(\begin{array}{c} N \\ m \end{array} \right) \mu^m (1 - \mu)^{N - m} = 1
\tag{2.264}
\end{align*}
```

## 解答
```math
\begin{align*}
\mathbb{E}[m] = \sum_{m = 0}^N m~Bin(~m~ | ~N, \mu) = N\mu
\tag{2.11}
\end{align*}
```

```math
\begin{align*}
\ var[m] = N\mu(1 - \mu)
\tag{2.12}
\end{align*}
```  
上式(2.11)及び(2.12)が成り立つことを示せばよい。  
問題文に方針が書かれているのでその通りに計算していく。まず(2.264)を $\mu$ で微分してやると、 
 
```math
\begin{eqnarray}
\sum_{m = 0}^N \left(\begin{array}{c} N \\ m \end{array} \right)\{ m \mu^{m - 1} (1 - \mu)^{N - m} - \mu^m (N - m)(1 - \mu)^{N - m - 1}\} & = & 0 \\  
\sum_{m = 0}^N \left(\begin{array}{c} N \\ m \end{array} \right) \mu^{m - 1} (1 - \mu)^{N - m - 1}(m - \mu N) & = & 0\\
\sum_{m = 0}^N m \left(\begin{array}{c} N \\ m \end{array} \right) \mu^m (1 - \mu)^{N - m} & = & \mu N \sum_{m = 0}^N \left(\begin{array}{c} N \\ m \end{array} \right) \mu^m (1 - \mu)^{N - m}
\end{eqnarray}
```  
(2.264)より  

```math
\begin{align*}
\sum_{m = 0}^N m \left(\begin{array}{c} N \\ m \end{array} \right) \mu^m (1 - \mu)^{N - m} = \mu N
\tag{2.4.1}
\end{align*}
```  
よって、  

```math
\begin{align*}
\mathbb{E}[m] = N\mu
\tag{2.11}
\end{align*}
```  

また、(2.4.1)をさらに $\mu$ で微分すると、  

```math
\begin{eqnarray}
\sum_{m = 0}^N m^2 \left(\begin{array}{c} N \\ m \end{array} \right) \mu^m (1 - \mu)^{N - m} & = & \mu N(1 - \mu) + \mu N \sum_{m = 0}^N m \left(\begin{array}{c} N \\ m \end{array} \right) \mu^m (1 - \mu)^{N - m}\\
\mathbb{E}[m^2] & = & \mu N - \mu^2 N + \mu^2 N^2
\tag{2.4.2}
\end{eqnarray}
```  

(2.11)と(2.4.2)から、
  
```math
\begin{eqnarray}
\ var[m] & = & \mathbb{E}[m^2] - (\mathbb{E}[m])^2\\
& = & \mu N - \mu^2 N + \mu^2 N^2 - \mu^2 N^2\\
& = & N \mu(1 - \mu)
\end{eqnarray}
```  

よって(2.12)が示された。
OSX Catalinaにアップデート後、sassできなくなった

似たような状況に見舞われた同様記事ありますが個人用にもメモ。

#状況と解決方法
表題の通りなんですが、OSXをCatalinaにアップデート後、sassコマンドを打つと以下のようなエラーが出た。

```
bash: /usr/local/bin/sass: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory
```

どうやらCatalinaにアップデートするとOSにビルトインされているRubyのバージョンが上がって古いのが削除されていることが原因のよう。

以下の記事を参考に`rbenv`をインストール後、別のバージョンのRubyを入れてそこにパスを通すと解決！！

https://qiita.com/nishina555/items/63ebd4a508a09c481150

##余談

実際はPhpstormのプラグインからの実行でエラーが出てて、慌ててPhpstormのサポートに連絡したらSCSSの実行はPhpstormとは関係ないですよー、と言われた。そらそうだ。（ビルトインな気がしたがそうではないみたい）

でそのメールにRuby Sassは非推奨なのでDart Sass使ってくださいねー、と親切なアドバイスも。
Dartに切り替えたほうが良いかなー。
サーバエンジニアにも、わかりやすく機械学習の教師あり学習（Supervised Learning）を理解してみた1

### 教師あり学習（Supervised Learning）とは

例えば、あなたの年収を予測しましょう。
結果として、500万以上か以下かが判定できるAIです。

予測するために、いくつか情報をもらいます。
今回は以下にしましょう

- 年齢
- 教育年月
- どのぐらい働いているか（週）
- 500万超えているか

これらを条件に予想します。
予測の仕方は色々ありますが、今回は

<b>ロジスティック回帰</b>という予測方法を使ってみます。
ロジスティック回帰は、クラスを分類するという予測ができる仕組みです。

ではそれをpythonで描いてみます

```
//引数の説明
////C 精度の変化をさせる（数字が大きいほど、あまり細かいことにとらわれずに答えを算出する）
////max_iter 最大反復回数(計算しすぎて、ループが多くならないように的な最大値指定)
////random_state   乱数を使うか使わないか、何か思った通りじゃない？など感じた時に使う（整数だと同じ値が返ってくる）
lr = LogisticRegression(C=1000.0, max_iter=100, random_state=0)
lr.fit("年齢,教育期間,労働時間 の行列データ"), column_or_1d("評価行"))
```
例えばこんな感じのデータがあったとする

|  年齢  |  国  | 教育期間 | 労働時間 | 収入500超え |
| ---- | ---- | ---- |---- |---- |
|  30  |  JPN  |  12 | 40 | 0 | 
|  15  |  USA  | 9 | 80 | 1 |
|  26  |  JPN  | 9 | 40 | 0 |
|  65  |  JPN  | 9 | 40 | 1 |

これで元データは、揃ったことなる

データを食べさせます。
そして予想を立てます

```
train_pred = lr.predict("年齢,教育期間,労働時間 の行列データ")

//scoreは精度になります。
lr.score("年齢,教育期間,労働時間 の行列データ",column_or_1d("評価行"))

```

なのでこの場合、scoreが1を超えれば、500万を超えたことになります
個別の値をチェックするには、以下みたいな値を設定する
例ととしては)
30歳、教育機関:16年、週40時間の場合

```
yhat = lr.predict(np.array([[30, 16, 40]]))[0]

print( yhat)
print('あなたの年収は 500 万' + ('以下です' if yhat == 0 else '以上です'))
```

機械学習が導き出した答えは、以上という答えでした。

### 要約すると
流れを要約すると、

- ロジスティック回帰使うよ
- fitして
- scoreを出して、どのような結果が返ってきているかをみて、確認して
- predictで欲しかった値が何になるかを取得する

になります

## あとがき

今回やったのは、とりあえず機械学習をやってみたというのが、趣旨で
これを知っておくと、じゃあ、もっと精度をあげるにはという所に自ずと向いてくると
思います。それはまた別の記事で書きたいと思います。

細かい文法などは今回触れていないのでそれも別の記事になると思います（気が向けば）
おすすめテキストエディタ

## この内容について
この内容は、私が運営しているサイトから一部引用もあります。
他にもおすすめのIDEなども一覧にしていますので、よければそちらもご活用ください。
[おすすめテキストエディタ&IDE](https://korenarawakaru.com/tech/editor/editor-ide)

## テキストエディタとは
テキストファイルを編集などするためのツールのこと。
Macの「テキストエディット」のようなシンプルなものから、後述するVSCodeのような高機能なものまで様々にある。

## テキストエディタの選び方

#### なるべく無料であるか
無料で配布されているものであれば、チームで使う時や個人で行う時の固定費がなく精神的に良いです。
しかしながら、有料のものを気に入った場合にはそちらを使うべきでしょう。

#### PCの性能に見合うか
高機能なテキストエディタはどうしてもメモリを多少食ってしまうので、
PCの性能によってはシンプルなものを使う必要があります。

#### 見やすいか
見やすさは、人のモチベーションを左右する1つにもなるかと思います。
テキストエディタによっては、文字のフォントを変えれたり、色を変えれたりするので、
色々試してみましょう。

## おすすめテキストエディタ

### [Atom](https://atom.io/)
<img width="1792" alt="Atom.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/64261c9d-7e58-043c-7438-fc11b1446dff.png">
#### 特徴

- GitHubとの連携が簡単
- パッケージが豊富
- 見やすいデザイン
- 初心者からプロまで使う

#### 評価
個人的に、色分けや文字配置が1番見やすく、Gitをよく使う人におすすめしたいテキストエディタ。
デメリットとしては、機能の割に動作が少し重たい感じなところ。

### [VSCode (正式：Visual Studio Code)](https://code.visualstudio.com/)
<img width="1792" alt="VSCode.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/78609322-2dba-df92-2932-537e725a2258.png">
#### 特徴

- 軽量エディタ
- 拡張機能が豊富
- ターミナルが付属
- 標準で自動補完
- 標準でデバッグ機能

#### 評価
個人的に、開発をガッツリやる人におすすめしたいテキストエディタ。
デメリットとしては、VSCode独特のエディタ感があり、慣れるまではコードが見辛い印象なところ。

### [Brackets](http://brackets.io/)
<img width="1792" alt="Brackets.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/0ff284d5-80a7-2a26-01c0-81baa3b7d037.png">
#### 特徴

- 最初から日本語対応
- クイック編集機能(HTMLに適用されているCSSをその場で修正可能)
- ライブプレビュー機能
- ホバービュー機能

#### 評価
個人的に、初心者に最もおすすめしたいテキストエディタ。
デメリットとしては、Web制作以外だと機能が足りない印象なところ。

### [Prepros](https://prepros.io/)
<img width="1792" alt="Prepros.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/19799837-93d8-5be2-ee87-dbee7b3221a4.png">
#### 特徴

- メタ言語の変換が可能
- コード圧縮機能
- FTP・SFTP転送機能
- 実機のスマホやタブレットで表示確認可能

#### 評価
個人的に、Web制作者に最もおすすめしたいテキストエディタ。
デメリットとしては、29ドルでの課金をしないと広告が出てきてしまうところ。

## まとめ
今回おすすめしたテキストエディタをまとめると下記の通りです。

| テキストエディタ | 特徴 | おすすめしたい人 |
|:-----------------|:------------------|:------------------|
| Atom | GitHubとの連携・見やすい | GitHubを使う人 |
| VSCode | 軽量・機能が豊富 | ガッツリ開発したい人 |
| Brackets | 日本語対応・ライブプレビュー | 初めてテキストエディタを触る人 |
| Prepros | メタ言語変換・実機テスト可能 | Web制作者 |

## この内容について
この内容は、私が運営しているサイトから一部引用もあります。
他にもおすすめのIDEなども一覧にしていますので、よければそちらもご活用ください。
[おすすめテキストエディタ&IDE](https://korenarawakaru.com/tech/editor/editor-ide)
javascriptメモ2

# [Node.jsのステップ実行](https://qiita.com/keitarou/items/298377ae34ec1b3df448)
VSCで出来る。
VS201xでも昔試した記憶あるけど何も覚えていない。。

# [Promise](https://qiita.com/ysk_1031/items/888a84cb259cec4e0625)
```
      var btn_promise = cube.getButtonStatus()
      btn_promise.then((value) => {
          console.log(value);  // 1
          //cube.playPresetSound( 4);
            //console.log("btn = " , String(btn))
      }, (error) => {
        console.error("error:", error.message);
      });
```


# [sleep](https://www.sejuku.net/blog/24629)
侍エンジニア塾の最初のロゴ、すごい邪魔なんですけど（怒）

```
// ビジーwaitを使う方法
function sleep2(waitMsec) {
  var startMsec = new Date();

  // 指定ミリ秒間だけループさせる（CPUは常にビジー状態）
  while (new Date() - startMsec < waitMsec);
}

function sleep(waitSec, callbackFunc) {
    // 経過時間（秒）
    var spanedSec = 0;
    // 1秒間隔で無名関数を実行
    var id = setInterval(function () {
        spanedSec++;
        // 経過時間 >= 待機時間の場合、待機終了。
        if (spanedSec >= waitSec) {
            // タイマー停止
            clearInterval(id);
            // 完了時、コールバック関数を実行
            if (callbackFunc) callbackFunc();
        }
    }, 1000);
}
```

# enum 
JavaScriptにはない、TypeScriptにはある。
```
enum Color {
    Red,
    Green,
    Blue
}
var col = Color.Red;
col = 0; // Effectively same as Color.Red
```

#　format
```
function test()
{
var str = "もじれつ";
var num = 555;
var flo = 1.7320508075;

console.log('Stringの出力 : %s', str);
console.log('Numberの出力 : %d', num);
console.log('Floatの出力  : %f', flo);

console.log('複数出力 : %s %d %f',str,num,flo);

}
```

# メモ
形態素解析

# MeCab
## 使い方

1. MeCab Taggerインスタンスを作成
    1. オプションを渡すことができる（-Ochasen, -Owakati, -Oyomi） 

### オプション無し

```python
>>> import MeCab
>>> m = MeCab.Tagger()
>>> result = m.parse("我々は宇宙人ダ")
>>> print(result)
我々	名詞,代名詞,一般,*,*,*,我々,ワレワレ,ワレワレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
宇宙	名詞,一般,*,*,*,*,宇宙,ウチュウ,ウチュー
人	名詞,接尾,一般,*,*,*,人,ジン,ジン
ダ	名詞,一般,*,*,*,*,*
EOS
```

### -Owakati
文章を分かち書きして、その単語だけをprintする方法。

```python
>>> m = MeCab.Tagger("-Owakati")
>>> result = m.parse("我々は宇宙人ダ")
>>> print(result)
我々 は 宇宙 人 ダ
>>> print(result.split(" "))
['我々', 'は', '宇宙', '人', 'ダ', '\n']
```
【学習メモ】Rails入門　テーブルの紐付け（1対多）モデル名:references, belongs_to, has_many

##テーブルの紐付け機能の実装

```rb
rails g model answer question:references name:string content:text
```
**question:references**
→1対多の関係をモデルに表示させる

→生成されたAnswerモデルを見ると、次のような記述になっている。

```rb
class Answer < ApplicationRecord
  belongs_to :question
end
```

「belongs_to :question」は、「クラスAnswerは、:questionに所属する」という意味

親クラスのquestionsモデルには、

```rb
class Question < ApplicationRecord
  has_many :answers, dependent: :destroy #これを追記
  validates :name, presence: true
  validates :title, presence: true
  validates :content, presence: true
end
```

「has_many :answers」は「複数のanswersを持っている」という意味

「dependent: :destroy」は「親であるquestionが削除されたら紐くanswerを全て削除する」という意味

最後にdb:migrateを行い完了
SSHサーバーのポートを独自ポート変更した場合のSELinux設定

サーバーを作成した場合、Defaultのポート番号を使わず、独自ポート番号に変えたい場合があります。
IBM public cloudのIaaS VMとベアメタルは、Public側セグメンとはグローバルIPが直付けとなっています。
そのまま起動すると、SSHのポートはInternetから狙われやすいので変えておくものです。
sshd_configでのポート番号設定を変更にあたり、その前にやっておくことが
firewallの穴あけと、SELinuxでのポート識別設定。

１）Firewall設定は以下

前提：
NICをExternal Zoneへ設定済

確認；
firewall-cmd --list-all-zones

確認の結果：
external (active)
(中略)
  services: dns ssh
  ports: 
(中略)

変更：
firewall-cmd --add-port=10022/tcp --zone=external --permanent
(firewall-cmd --reloadを実行)

変更後の確認：

external (active)
(中略)
  services: dns ssh
  ports: 10022/tcp
(中略)


２）SELinuxの設定は以下

確認：
semanage port -l|grep ssh

確認の結果：
ssh_port_t                     tcp      22

変更：
semanage port --add --type ssh_port_t --proto tcp 10022

変更後の確認：
semanage port -l|grep ssh

変更後の確認結果：
ssh_port_t                     tcp      10022, 22


３）sshd_configの変更

確認：
/etc/ssh/sshd_config
のポート番号周辺を変更。


※Openshiftでは独自ポート(22623, 6443など）を多数使用しますので踏み台サーバーでこちらの設定を行う必要がありますね。
Amazon WorkSpacesでhostsファイルを編集する

Amazon WorkSpacesでhostsファイルを編集しようとしたのですが少しハマりましたので備忘録としてまとめます。

## WorkSpaces にてhostsファイルを編集

メモ帳等を「管理者として実行」の上、%SystemRoot%\system32\drivers\etc\hosts を開けば編集できます。

https://forums.aws.amazon.com/thread.jspa?threadID=150341


## WorkSpaces にてCドライブを表示させる。

WorkSpacesはデフォルトでCドライブが表示されません。
Cドライブを表示したい場合はレジストリの以下の場所を「0」に変更します。

```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer
```

http://blog.serverworks.co.jp/tech/2017/08/04/win10-workspaces-cdrive/
Docker コマンド　作業メモ

## よく使うDockerコマンド集


実行中のコンテナ表示

```terminal
$ docker ps
```

存在するコンテナ表示

```terminal
$ docker ps -a
```

イメージの構築

```
$ docker-compose build
```

キャッシュがあるとき、イメージの構築、コンテナの構築・起動を一括でやってくれる

```
$ docker-compose up
```

```-d``` オプションを付けてバックグランドで実行 

```
$ docker-compose up -d
```


```-build``` キャッシュ無いときはbuildして、イメージを構築する

```
$ docker-compose up --build -d
```

docker-compose.yml書いたら、これ実行している。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15925/d6d3dea2-b321-2dec-8a85-eca35a643d5b.png)

同じコンテナ名があるのでコンテナ作成できませんでしたという警告がでるときがある

```terminal
$ docker stop python3

$ docker rm python3
```

一旦動作しているコンテナを停止し、コンテナを削除する。


```terminal
$ docker-compose exec python3 bash

$ docker-compose exec db bash

$ docker exec -it db bash
```
Docker API
https://docs.docker.com/compose/reference/exec/

Docker内の実行しているコンテナでbashを開始する

### 参考

docker-composeのupとbuildの違いについて
https://qiita.com/tegnike/items/bcdcee0320e11a928d46