OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】param is missing or the value is empty:について

#問題箇所のコード
```controller.rb
  def create
    @collect = Collect.create(collect_params)
    if @collect.save
      redirect_to "/group/show/#{@collect.group_id}"
    else
      render "new"
    end
  end
(省略)
  private
  def collect_params
    params.require(:collect).permit(:url, :group_id)
  end

```

主にcollect_paramsが悪いはず。

#param is missing or the value is empty:
意味は単純にparamsが存在しないか空ですとなる。

パラメータを確認するとこんな感じ。ちゃんと情報渡せてるように見えるけどfalseになってる。

```	
<ActionController::Parameters {"authenticity_token"=>"Ze5qfbN7z11+vpQ0BRGuCOV8U6m9e/aH6B7QuXFkJ13sXD66fpls3yxpB8fxymNI3XqOR6KiBmemdPRC++aVTw==", "url"=>"https://（省略）", "group_id"=>"5", "commit"=>"Save ", "controller"=>"collect", "action"=>"create"} permitted: false>
```

#原因
`params.require(:collect)`の部分が不要なんだと思う。
（もともとCollectテーブルに保存されるものとして送信されているのに、`params.require(:collect)`と書くとだぶるのかなあ）

#解決
```controller.rb
  private
  def collect_params
    params.permit(:url, :group_id)
  end
```
`params.require(:collect)`を削除した。参考は下記のURL

https://stackoverflow.com/questions/47391168/param-is-missing-or-the-value-is-empty-in-nested-resource-method
Dockerで脆弱性WebアプリケーションDVWA構築

#DockerでDVWA構築

今回は、**Dockerで脆弱性WebアプリケーションであるDVWAの構築手順**をまとめていきたいと思います。

DVWAを構築する目的は、攻撃手法を学び、**より安全なWebアプリケーションを作成**するためです。

そのため次回以降の記事では、SQLインジェクション、CSRF、XSSといったことにも触れていきたいと思います。

#DVWAはPHP/MySQL製の脆弱Webアプリケーション

DVWA(Damn Vulnerable Web Application)は、**PHP/MySQL製のセキュリティ脆弱性のあるWebアプリケーション**です。

このDVWAに様々な攻撃を仕掛けることによってユーザーの情報を取得できるので、脆弱性を産む可能性のあるコードについて学ぶことができます。

またセキュリティレベルをLow、Medium、Highに設定できるので、基礎的な攻撃手法から応用的なものまで学ぶことができます

#Dockerで簡潔にDVWA構築
今回はより短時間で容量をくわず構築するため、**DockerでDVWAのイメージをプルし構築**しました

#前提条件

- yum updateしたCentOS7サーバー（グローバル接続済み）

#DVWAのイメージをプルして起動

まず、初期状態なので、dockerをインストール。

```
# yum install docker
```

続いてdockerコマンドで、DVWAのイメージをプル（インストール）します。


```
# docker pull infoslack/dvwa
```

続いて、HTTPの外部からアクセスされるポート番号を80、コンテナ側のポート番号を80、MySQL側も外部からアクセスされるポート番号を3306、コンテナ側のポート番号を3306に指定し、バックグラウンドでdockerを起動します。

```
# docker run -d -p 80:80 -p 3306:3306 -e MYSQL_PASS="mypass" infoslack/dvwa
```

ここまでできたら、グローバルIPアドレス/setup.php（グローバルに繋がっているサーバーの場合）にアクセスすると、DVWAのセットアップ画面がでます。

create/Reset Databaseを選択し、パスワード入力画面でUsernameをadmin、Passwordをpasswordと入力。

無事ログインできたら、DVWAの構築は完了です。

# 参考URL

https://www.pupha.net/archives/1297/
https://securitybytes.io/docking-dvwa-be9abf862210
PodmanでWordPressを起動してみる

# 環境

Fedora CoreOS 31.20200113.3.1
Podman 1.7.0
Podman Compose 0.1.5
WordPress 5.3.2
MariaDB 10.4.12

# 準備

```
$ sudo sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux
$ sudo reboot
$ sudo rpm-ostree install python3 -r
$ sudo pip3 install podman-compose
$ mkdir -p ~/.local/bin
$ curl -o ~/.local/bin/podman-compose https://raw.githubusercontent.com/containers/podman-compose/devel/podman_compose.py
$ chmod +x ~/.local/bin/podman-compose

$ mkdir -p mariadb/data
$ chmod 777 mariadb/data
```
# ファイル

```docker-compose.yml
version: "3.7"
services:
  db:
    image: mariadb:10.4.12
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    volumes:
      - ./mariadb/data:/var/lib/mysql

  wordpress:
    image: wordpress:5.3.2-php7.4
    ports:
      - "8000:80"
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
    depends_on:
      - db
```

# 実行

```
$ podman-compose up -d
$ podman ps

CONTAINER ID  IMAGE                                     COMMAND               CREATED         STATUS            PORTS                                         NAMES
6c88d156fa0c  docker.io/library/wordpress:5.3.2-php7.4  apache2-foregroun...  8 seconds ago   Up 7 seconds ago  0.0.0.0:8000->80/tcp, 0.0.0.0:3306->3306/tcp  workpress_wordpress_1
200b770e6b40  docker.io/library/mariadb:10.4.12         mysqld                10 seconds ago  Up 9 seconds ago  0.0.0.0:8000->80/tcp, 0.0.0.0:3306->3306/tcp  workpress_db_1
```
PhotoShop2020（21.0.3）でカスタムシェイプの削除があばばばば・・・・

#はじめに
ある日突然、PhotoShopのカスタムシェイプが消えて困りましたｗｗｗ
adobeのサイトで動画説明があるんですが、英語なのでちょっと抵抗あるんですよね(´･ω･`)

同じように困っている人に役に立ったら良いなと思いメモ書きしておきます

[結論見たい人は一番下までドーンッ！！！](https://qiita.com/itomaki_kokoro/items/7b6672dabda1a044af9a#%E7%B5%90%E8%AB%96)

#いつもは
うちはいつも、上部のメニューのプルダウンでカスタムシェイプを選んでいるのですが
いつものアレがない！！！
ですね・・・(´･ω･`)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/25c3b942-3475-b167-7cd8-f24c2eab830a.png" width="50%">


adobeのことなので、レガシーとかで追加できるだろうと思い、歯車マーク押しましたｗ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/a8c6de1f-e925-73d1-cf05-84fc9a418d6d.png" width="25%">


やっぱりあるじゃ～ん♪よかった(๑´ㅂ`๑)ふふふ
ってなりますよね

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/41aed42a-5150-7274-3c8c-b481c8577069.png" width="25%">

はいはい！もちろん戻しますよ～♪
「OK」をポチッと・・・

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/8d7529f2-2432-2bcf-01d6-598ef9263330.png" width="25%">

**ふぁｯ!?( ﾟдﾟ)**
ふえたｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗ
まじかーーー・・・

とりあえず消そう(´･ω･`)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/f98ff3b6-5ef8-9dc4-392a-022b6585b5b0.png" width="25%">

え？ん？（二度見）
これは・・・・・・？
クリックできないんですけどｗｗｗｗｗｗｗ
ナンダコレｗｗｗｗｗ

いろんなところをクリックして右クリックとか
歯車のメニューで探したりしましたが
削除項目が見つかりません...（´・ω・`）.;:…（´・ω...:.;::..（´・;::: .:.;: ｻﾗｻﾗ..

グ、、、、グーグル先生助けて(´･ω･`)
と「PhotoShop シェイプ　削除できない」とかでいろいろ検索しても何も出ません

...( ﾟдﾟ)ﾎﾟｶｰﾝ...

し、、、仕方ないので英語の動画を再生してみます

#結論
シェイプパネルでのシェイププリセットの選択
https://helpx.adobe.com/jp/photoshop/using/drawing-shapes.html

英語でペラペラお話していますが、よくわかりませんｗｗｗ
ただ、**「上部のメニューではなくパネルの方で操作している」**ということは伝わりました←

な、なるほど
パネルで操作しろと・・・

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/dd563ece-e844-fba1-1172-4ff19ec2459b.png" width="50%">

パネルを開いたら、ゴミ箱アイコンがアクティブになった！！！！
やった！！！！！削除できる！！！٩(ˊᗜˋ*)وひゃっほ～

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/96552a86-e4e3-6d5f-50fd-df92cdbe2418.png" width="25%">

で、ハンバーガーメニュー？（右上アイコン）を押してみる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/c0c8f394-74fc-dc21-79e4-bb2684a09c1c.png" width="50%">

さっきメニューになかったのがいるぅぅぅぅ！！！！！！
やったぜ！！！！

ということで無事に以前のシェイプが表示されましたとさ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106779/8dbe4ec8-d572-ae29-d332-63c2c65617cb.png" width="25%">

－ おしまい －
FlaskでWebアプリ開発中にCSSが反映されない問題を解決する

FlaskでWebアプリを開発している。その際、WebブラウザにCSSがキャッシュされてしまう問題に、どう対処するか考えてみた。

HTML内でCSSをリンクする際、``style.css?v=12``などのように手動で、更新日時やバージョンを付け加えている場合がある。しかし、せっかくPythonを使っているので、これを自動で解決してもらいたい。

## 模範解答

検索してみると模範解答は、以下のように、url_forを書き換えると良いという回答だ。

```app.py
@app.context_processor
def override_url_for():
    return dict(url_for=dated_url_for)

def dated_url_for(endpoint, **values):
    if endpoint == 'static':
        filename = values.get('filename', None)
        if filename:
            file_path = os.path.join(app.root_path,
                                 endpoint, filename)
            values['q'] = int(os.stat(file_path).st_mtime)
    return url_for(endpoint, **values)
```

そして、テンプレートでは、以下のようにリンクする

```hoge.html
<link rel= "stylesheet" type= "text/css" 
 href= "{{ url_for('static',filename='style.css') }}">
```

コンテキストプロセッサーの、url_forを上書きするテクニックだ。エンドポイントにstaticが指定された時に、ファイル更新日を付け加えるというテクニックだ。

ちなみに以下が元ネタの英語ページ。日本の他のブログでもこれを参考に紹介されていた。
(参考) https://stackoverflow.com/questions/21714653/flask-css-not-updating

## この回答に不満というか、Flaskのurl_forに不満

ただし、いつも思うのだが、静的なリンクを書くだけなのに、url_forを使うのは長い。手間だ。Flaskでは、静的ファイルを配置するのは``/static``以下とデフォルトで決まっているので、CSSを配置するパスも既に決まっているはず。つまり、静的ファイルを埋め込むだけなのに、url_forを使うのは、かなり面倒に感じる。

そこで、手抜きして、以下のようにする方法を考えてみた。

## 手抜き回答 - 半分失敗の例

最初にフィルタを使う方法だ。

```app.py
@app.template_filter('staticfile')
def staticfile_filter(fname):
    path = os.path.join(app.root_path, 'static', fname)
    mtime =  str(int(os.stat(path).st_mtime))
    return '/static/' + fname + '?v=' + str(mtime)
```

テンプレートは以下のように書く。

```hoge.html
<link rel="stylesheet" type="text/css"
 href="{{ 'style.css' | staticfile }}">
```

模範解答より、ずっとエレガントにできた。

とは言え、この方法では、テンプレートエンジンによって、HTMLがキャッシュされてしまっているため、瞬時にキャッシュが更新されないのが問題だ。それでも、一応、style.css?v=xxxのようになる。

## 手抜き回答 その2 context_processorを追加する

やはり、模範解答を咀嚼して、context_processorを利用するようにするのはどうかと考えた。

```app.py
@app.context_processor
def add_staticfile():
    def staticfile_cp(fname):
        path = os.path.join(app.root_path, 'static', fname)
        mtime =  str(int(os.stat(path).st_mtime))
        return '/static/' + fname + '?v=' + str(mtime)
    return dict(staticfile=staticfile_cp)
```

そしてテンプレートは以下の感じ

```hoge.html
<link rel="stylesheet" type="text/css"
 href="{{ staticfile('style.css') }}">
```

これなら、キャッシュされず、瞬時に値が反映されるし、それほど見た目が悪くないから良いかな？

## 所感

Flask + jinja2の組み合わせ、気軽に使えて、拡張も楽々でお気に入り。
得た知見は、以下の通り。

 - フィルタにすると、テンプレートを変更しないと内容が書き換わらない。
 - コンテキストプロセッサーを使うと、テンプレートへの埋め込み処理の以前に実行されるので、常に値が最新にできる。
XBRLをぶっこ抜いてみた件

# 財務諸表って見づらい

どこ見たらいいかわかんないです。
と言うかどれが一番多い数字なの?
多い順に書けよ・・・・
![BS-768x620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52613/e7f59d11-b735-8dd7-2d0e-d6247b51a5d4.png)



---

# こうだったらいいのに
![BS-excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52613/de227db8-bec4-10a9-82db-edc14ea547ea.png)

---

# いやむしろこのほうが・・・
plotly dash使います。
![BS-mukade-892x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52613/e262519f-6ce6-aadb-e847-349dc9f31803.png)


---

# どうやんの?

金融庁が配ってるXBRLという形式で記述されてるXMLからぶっこ抜きます。
それをplotly dashで描画。サーバーはHerokuでいいっすね。
難しいかって? まぁXMLですから簡単ですよ。 
そうね、フクロウの絵を描くぐらい簡単でしたね。
ちょうど下のような感じ。

![d6d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52613/97ea8548-fdfd-4a14-2fca-41f767ab520a.jpeg)

---

# XBRLのすばらしいところ

- 上場企業の財務データが電子化されている
- 無料で提供されている

---

# XBRLのひどいところ

XMLなのになぜかZIP圧縮して配られてる、年度が変わるとタクソノミーが代わり文書の読み方が変わる、データのバリデーションがいい加減で証券コードを出さずに提出してるアホ会社がある、財務データの階層構造の定義もたまに間違ってる、項目の名寄せがされておらず「営業収益」「売上高」「建設勘定売上高」など売上高で多数項目が存在する、APIサーバーが遅い、APIがあるがダウンロードリンクをよこすだけの静的なAPI、データの保存期間が何故か5年、項目の後ろに数字をつけただけの謎項目が多数存在する(hogehoge hogehoge1 hogehoge)、公式のマニュアルが英語で200ページ以上ある、金融庁のマニュアルは文書の書き方の解説でデータの取得方法ではない、財務三表ならまだ採れるがほかのデータとなるとほぼ無理ゲーかも・・・

---

# 簡単に言うと

- XBRLは個別の財務諸表を端末上でキレイに表示するためのフレームワーク
 - なのでビッグデータ解析には向かない
 - あれ?だったらPDFでよくね?
- 誰も使っていないので文句を言うやつもおらず管理がいい加減
 - テラスカイなんか証券コードを「1234」って入れて提出してるんですよ?

年金とか、桜を見る会とかくだらないことに税金ぶち込むならこっちにぶち込んでほしいなぁ・・・

---
apacheからS3に静的ページを移行してパス補完で詰まった話

# 何を書いた記事か

AWS S3を用いて静的ページをホスティングする際のTipsです。
特に、apacheなどで配信されていた静的ページをS3に移行する際に使えると思います。

apacheなどのMWがよしなに解析してくれていたURI PathをS3を用いたホスティングでどのように実現するかについて記載します。

# ストーリー

とあるWebサイトのクラウド移行案件を進めることになりました。
そのWebサイトには、静的コンテンツ（HTML/CSS/JavaScript）のみで構成されたLP（静的ページ）が存在することがわかり、せっかくクラウドに移行するので、信頼性の高いS3から配信するようにしようと考えました。
また、対象のLPは接続できるIPに制限をかける必要があり、その実現についても考える必要がありました。

## As-Is

- apacheで静的ページを配信
- LoadBalancerでSSLを終端し、FirewallでIP制限を実施
- アクセスログはapache→fluentdで取得

## To-Be

- 静的コンテンツはS3上に配置
- SSL通信を実現するため、CloudFrontにACM管理の証明書を持たせ、オリジンにS3を指定
- IP制限を実現するため、CloudFrontの手前にAWS WAFを設定し、IP Restrictionルールを設定
- アクセスログはCloudFrontとS3側で取得設定

S3静的コンテンツのSSL化参考
https://dev.classmethod.jp/cloud/aws/tls-for-s3-web-hosting-with-cloudfront/

AWS WAFを用いたIP制限参考
https://blog.mmmcorp.co.jp/blog/2018/12/14/s3-cloudfront-awswaf/


# 発生した問題

コンテンツをS3に配置し、CloudFrontとAWS WAFを構築して、さぁこれで完璧と思ってテストをすると、いくつかのリンクが切れていることが判明しました。
原因は、apacheがよしなに解析・補完してくれていたパスが今回の構成では補完できなくなったことにあります。

例えば、下記のような補完です。

```
https://hoge.com/hoge/ -> https://hoge.com/hoge/index.html
https://hoge.com/hoge -> https://hoge.com/hoge/index.html
```

補完が必要なのは、２パターンでした。

1. URIが `/` で終わっていて、インデックスドキュメントが省略されているパターン
2. URIがディレクトリ名で終わっていて、ディレクトリを指定する `/` とインデックスドキュメントが省略されているパターン

逆に、下記のようなパターンは補完せずにそのままレスポンスを返す必要があります。

1. URIにディレクトリ・ドキュメントパスまで明確に指定されているパターン。 `https://hoge.com/hoge/hoge.html`など

今回の構成でこのようなパス補完についてどのように対応すべきか考えました。

# 対処
結果として、Lambda@Edgeで補完処理を実行してあげると、想定通りの動きになることがわかりました。

Lambda@Edgeはエッジロケーション、つまりCloudFrontと同じロケーションで実行されます。
CloudFrontが受け取ったリクエストをインターセプトして、所定の処理を実施し、CloudFrontに流すことが可能です。

今回上で補完対応が必要だとわかったパターンについて、requestエンティティを補完してあげるLambdaを作成し、＠Edgeにデプロイしました。

```javascript:lambda_function
'use strict';
exports.handler = (event, context, callback) => {
    //
    // CloudFrontが受け取ったリクエストを取得
    var request = event.Records[0].cf.request;
    //
    // URIを補完前後で変数に格納
    // 変換が不要なパターンもあるので、初期化の段階でnewuriにはolduriの値を代入
    var olduri = request.uri;
    var newuri = olduri;
    // 
    // URIが / で終わってる場合（パターン１）
    if (olduri.slice(-1) === '/') {
        // 末尾にindex.htmlを詰める
        newuri = olduri.replace(/\/$/, '\/index.html');
    } else {
        // URIを / でsplitし、最後の要素を取得。
        // そこにピリオドが含まれていなければパターン２としてインデックスドキュメントを詰める
        var last_string = olduri.split('/').pop()
        if (!last_string.includes('.')) {
            newuri = olduri + '/index.html';
        }
    }
    console.log(newuri)
    //
    // requestオブジェクトのuriプロパティを、置換後の値に変更
    request.uri = newuri;
    //
    // CloudFrontに返す
    return callback(null, request);
    //
};
```

これで、必要な補完は実行してくれつつ、他が不要なURI構成についてはそのままCloudFrontｚ→オリジンS3にアクセスが行くこととなります。

# 注意点

今回の対応を実施したLPを運用していて気づいた注意点があります。

- Lambda@Edgeは同時実行数制限をかけることができない（コンソール上は指定できるが、効かない）
- Lambda@Edgeはエッジロケーションで実行されるので、どこのリージョンのログに現れるかがわからない（国内サービスであればほぼap-noetheast-1ですが）

他サービスで多重にlambdaを起動する必要がある場合などはedgeで同時実行数が消費されて他サービスに影響が出る可能性があるので、上限を引き上げるかAWSアカウントを分離するか検討した方がいいと思います。

# まとめ

なんだかんだ言ってapacheは便利で賢いな、と思いました。
まだまだ要件次第では静的Webサイトホスティングをサーバレスで実現するのは難しいケースがありそうです。

また今回の問題はそもそもHTMLのリンクパスの記法が統一されていないことが原因で発生しました。
HTML書く時はlink属性に詰めるパスパラメータの書き方は統一し、なるべく補完に頼らずにフルの相対パスを記載するのがいいと思います。
仕事中にこっそりヒーリングっどする

# できること
cureutils で無限の癒やしを得る。

※注意点

* プリキュア初心者（ヒーリングっどプリキュアが初プリキュア）です。
* ヒーリングっどプリキュアのヒロインたちは実装されていません（タイトル詐欺）。
* この記事は湧いた頭を冷ますために書いたものです。過度な期待はしないでください。
* 技術的なものは何も得られません。

# 何があったのか
顧客をコントロールできないPM、納期直前まで続く仕様変更、メンバーはわがままばっかり言う、連日の午前様。
もぅﾏﾁﾞ無理。
癒やし、癒やしが欲しい……。

合間合間の気分転換。
Tera Term の小さな画面、fortune が吐き出した言葉たちを眺める。

こんな感じ。

~~~bash
$ while :; do fortune; sleep 300; echo -e "\n"; done
Electrocution, n.:
        Burning at the stake with all the modern improvements.


Last week a cop stopped me in my car.  He asked me if I had a police
record.  I said, no, but I have the new DEVO album.  Cops have no sense
of humor.


We are all agreed that your theory is crazy.  The question which
divides us is whether it is crazy enough to have a chance of being
correct.  My own feeling is that it is not crazy enough.
                -- Niels Bohr
~~~

でも、アメリカンなジョークはよくわからない……。
もっと癒やされたい……。
なにかないか……。

あった……！

* [Cureutilsを使ったプリティでキュアキュアなターミナルライフの実現]
(https://qiita.com/greymd/items/666a26459aa1bd4cb06c)

ありがとうございます、ありがとうございます。

面白そうなものを見つけてしまったからには、使ってみなくてはならない。

# コンテナ化
開発環境を汚したくなかったので、Docker で実行環境を用意した。
ついでにコマンド一発でプリティでキュアキュアな口上を述べて頂けるようにした。

* [ancolin/docker-cureutils](https://github.com/ancolin/docker-cureutils)

# 使い方
`docker-compose.yml` はこう。

~~~yml
version: '3'
services:
  app:
    image: ancolin/cureutils:latest
    environment:
      - USE_IN_BATTLE=TRUE          # TRUE: 戦闘中のセリフを使う
      - ONLY_USE_IN_BATTLE=FALSE    # TRUE: 戦闘中のセリフだけ使う
      - PRINT_QUICK=FALSE           # TRUE: セリフをまとめて表示する
      - HUMAN_NAME=                 # 名前: 特定のヒロインのセリフだけ使う
~~~
こんな shell スクリプトを書くと実行が楽ちんで良い。

~~~bash
$ cat cure.sh
#!/bin/sh
set -eu
cd /home/ancolin/docker/docker-cureutils
while :; do
    docker-compose run --rm app
    sleep 60
    echo -e "\n"
done
$ ./cure.sh
スカイローズ・トランスレイト！
青いバラは秘密のしるし！ ミルキィローズ！

by 美々野くるみ / ミルキィローズ (milky_rose)


チェインジ！プリキュア・ビートアップ！
ブルーのハートは希望のしるし！
つみたてフレッシュ、キュアベリー！
レッツプリキュア！

by 蒼乃美希 / キュアベリー (cure_berry)
~~~

もともとの cureutils の機能も使える。

~~~bash
$ docker-compose run --rm app cure version
Cureutils 1.2.0
$
~~~

# 改善効果
世の中の仕組みを理解できた。

* PMは顧客をコントロールできない。
* 仕様変更は納品したあとも続く。
* メンバーは簡単に辞める（病める）。
* マイカーorタクシーなら24/7通勤可能。

それでもくじけないポジティブな心を得ることができる（できたとは言ってない）。

# 宣伝  
プリキュアって戦士だったんだね、魔法少女じゃないんだね、知らなかったよ。
みんなもプリキュアみよね。
[プリキュア](http://www.toei-anim.co.jp/tv/precure/)
MacでDocker+Rails+MySQL環境構築手順メモ

勉強するときに環境構築にかなりつまづいたので、その手順をメモしときたいと思います。

#環境構築手順
前提として、rails開発用のディレクトリが用意されているものとします。

以下の手順に従ってファイル作成やコマンドを実行していけば問題なく手順は整うと思います。

##Dockerfileの作成（以下をコピペ）

```dockerfile

# rubyはお好みのバージョンで（ローカルのバージョンがいいと思います）

FROM ruby:2.6.3

# 必要なパッケージのインストール（基本的に必要になってくるものだと思うので削らないこと）

RUN apt-get update -qq && \

    apt-get install -y build-essential \

                       libpq-dev \        

                       nodejs           


# 作業ディレクトリの作成、設定

RUN mkdir /app_name

##作業ディレクトリ名をAPP_ROOTに割り当てて、以下$APP_ROOTで参照

ENV APP_ROOT /app_name

WORKDIR $APP_ROOT


# ホスト側（ローカル）のGemfileを追加する

ADD ./Gemfile $APP_ROOT/Gemfile

ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock


# Gemfileのbundle install

RUN bundle install

ADD . $APP_ROOT
```
 

##Gemfileの作成（以下をコピペ）

```gemfile
source 'https://rubygems.org'

#好きなバージョンを指定

gem 'rails', '5.2.2'
``` 
 

##空のGemfile.lockの作成

何も書かなくていいです。


##docker-compose.ymlを作成（以下をコピペ）

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

services:
  db:
    image: mysql:8.0.17
    command: mysqld --default-authentication-plugin=mysql_native_password
    volumes:
      - ./db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: root
    ports:
      - "4306:3306"

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    links:
      - db
```
 

##ターミナルでrails newを実行

```
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
```

上のコマンドを打ってしばらく待つ

##database.ymlを修正（一度全て消してから以下をコピペ）

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "root") %>
  host: <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: app_name_development

test:
  <<: *default
  database: app_name_test

production:
  <<: *default
  database: app_name_production
  username: app_name
  password: <%= ENV['APP_NAME_DATABASE_PASSWORD'] %>
```
 
##ターミナルでDockerを起動

```
docker-compose build
```

しばらく待つ。できたら以下を実行。

```
docker-compose up
```
 
##DB作成

別のターミナルを開いて以下を実行

```
docker-compose run web rails db:create
```
 
##ブラウザでlocalhost:3000にアクセス
サーバーが起動してたらおk。

 
###サーバーを止める

```
docker-compose down
```

###サーバーを再起動

```
docker-compose up
```
 

#まとめ
これでrailsアプリ作成の準備が整うはずです。
環境構築は完全に初見ごろしだと思うので誰かの助けに慣れたら嬉しいです。
また、何かおかしい点とかあれば言って頂けるとありがたいです。

お付き合い頂きありがとうございました。

 
#参考サイト

https://qiita.com/azul915/items/5b7063cbc80192343fc0

https://qiita.com/take18k_tech/items/ada21511c551bcfe0b8c
Pandasで微妙に数値が変わる現象とその対応

#はじめに
Pandasのread_csvでデータを読み込み、列名等を変更してto_csvで出力した場合に微妙に数値が変わってしまった時のメモ

#ソース
以下が本記事のエッセンスを取り出した最小コードである。読んで吐き出すだけ。

```PandasTest.py
import pandas as pd
import argparse


def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("-input", type=str, required=True)
    parser.add_argument("-output", type=str, required=True)

    args = parser.parse_args()

    df = pd.read_csv(args.input, index_col=0)
    df.to_csv(args.output)


if __name__ == "__main__":
    main()

```

#問題点
上のコマンドで変換した2つのファイルをWinMargeで比較すると桁数の多いデータがところどころ食い違っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/b8d42f0e-abeb-057f-430e-459134eb2a98.png)

#対応
はっきりとした原因を突き詰めたわけではないが、Pandas内部でfloatに変換される際に桁落ち等が発生しているものと推測。したがって、read_csvの引数にdtype="object"をつけて型変換されないようにする。これで完全に一致するようになる。

```
   df = pd.read_csv(args.input, index_col=0, dtype=object)
```
match()がマッチしすぎる問題

小ネタ。
#はじめに
[eval ConditionalFunctions](https://docs.splunk.com/Documentation/Splunk/8.0.1/SearchReference/ConditionalFunctions)の一つである`match()`

**match(SUBJECT, "REGEX")**
_Description_
This function returns TRUE or FALSE based on whether REGEX matches SUBJECT.

This function compares the regex string REGEX to the value of SUBJECT and returns a Boolean value. It returns TRUE if the REGEX can find a match against any substring of SUBJECT.
ということで、`SUBJECT`が_multi value_と_single value_どちらでも一致してくれるので、とても使える。

```java:match.spl
 | makeresults 
 | eval _raw="AllUsers ModifiedUsers
 Usr1            Usr4
 Usr3            Usr2
 Usr2            Usr1
 Usr4"
 | multikv forceheader=1
 | stats values(*) as *
 | table AllUsers ModifiedUsers
 `comment("this is your result sample. from here, the logic")`
 | stats values(*) as * by AllUsers
 | eval check=if(match(ModifiedUsers,AllUsers),1,0)
 | stats values(eval(if(check=0,AllUsers,NULL))) as AllUsers
```
このクエリーだと _ModifiedUsers_がmultivalueだけど問題なく一致している。
#match()がマッチしすぎる
```java:match_too_much.spl
| makeresults 
| eval _raw="AllUsers,ModifiedUsers
admin,splunk
splunk,tenable.admin
tenable.admin," 
| multikv forceheader=1 
| stats values(*) as * 
| table AllUsers ModifiedUsers
    `comment("this is your result sample. from here, the logic")` 
| stats values(*) as * by AllUsers 
| eval check = if(match(ModifiedUsers,AllUsers),1,0) 
| stats values(eval(if(check=0,AllUsers,NULL))) as AllUsers
```
`admin`が`tenable.admin`に一致してしまうので、これはうまく動かない。
とはいえどうすればいいのだろう:thinking:
#解決策
```java:match_enough.spl
| makeresults 
| eval _raw="AllUsers,ModifiedUsers
admin,splunk
splunk,tenable.admin
tenable.admin," 
| multikv forceheader=1 
| stats values(*) as * 
| table AllUsers ModifiedUsers
    `comment("this is your result sample. from here, the logic")` 
| stats values(*) as * by AllUsers 
| eval check = if(match(ModifiedUsers,"^".AllUsers."$"),1,0) 
| stats values(eval(if(check=0,AllUsers,NULL))) as AllUsers
```
引数はREGEX(正規表現)なので、正規表現として正しく書いてやる。
#まとめ
`match()`というか正規表現だと思ったより広く、狭く一致する時がある。
`.*`とか`\w+`がすごく広く一致したりしなかったり。
[regex101](https://www.regex101.com/)で確認してみたりするけど、Splunkは基本的に_REGES FLAGS_が`g`のみなのは時たまハマります。
やはり[バイブル](https://www.oreilly.co.jp/books/9784873113593/)が必要か:sweat:
Rで散布図を描く ---初心者向け---

###### tags: `rBasicLearning`
# 散布図
### 使用するデータ
今回は, データとしてmtcarsを使う.

```r
library(datasets)
mtcars
```
### 散布図を使う場合
ヒストグラムは, 二つの量的データの関係性の概観を見る時に使う.
### まずは, 量的データの概観を一つずつヒストグラムで見ていく
まずは, それぞれの変数のヒストグラムを見て, 概観を掴む.

```r
hist(mtcars$wt)
hist(mtcars$mpg)
```
![](https://i.imgur.com/uz1v0Ek.png)

### 散布図をプロットする
散布図は, 以下のコードで書くことができる.

```r
plot(mtcars$wt, mtcars$mpg)
```
![](https://i.imgur.com/g69t1M8.png)

### 散布図に装飾を加える
散布図は, 以下のように装飾を加えることができる.
pchは, プロットの点の種類（pch = 19は丸）
cexは, プロットのサイズの拡大・縮小を表す（cex = 1.5は, プロットのサイズを1.5倍にする）
colは色, mainはグラフのタイトル, xlabはx軸ラベル, ylabはy軸ラベル.

```r
plot(mtcars$wt, mtcars$mpg,
  pch = 19,         # Solid circle
  cex = 1.5,        # Make 150% size
  col = "#cc0000",  # Red
  main = "MPG as a Function of Weight of Cars",
  xlab = "Weight (in 1000 pounds)",
  ylab = "MPG")

plot(mtcars$wt, mtcars$mpg,
     pch = 3,         # plus mark
     cex = 1.5,        # Make 150% size
     col = "#cc0000",  # Red
     main = "MPG as a Function of Weight of Cars",
     xlab = "Weight (in 1000 pounds)",
     ylab = "MPG")

plot(mtcars$wt, mtcars$mpg,
     pch = 19,         # Solid circle
     cex = 0.3,        # Make 30% size
     col = "#cc0000",  # Red
     main = "MPG as a Function of Weight of Cars",
     xlab = "Weight (in 1000 pounds)",
     ylab = "MPG")
```
![](https://i.imgur.com/bmibAkE.png)
Rで棒グラフが出力できないアナタへ ---初心者向け---

###### tags: `rBasicLearning`
# 棒グラフ
## 棒グラフを使う場合
棒グラフは, <font color = "red">質的データの概観を見る</font color>時に使う.
### 使用するデータ
今回は, データとしてmtcarsを使う.

```r
library(datasets)
mtcars
```


### 棒グラフが働かない場合
以下のように, 生データを入れただけだと, グループ化されていないため, 一つ一つのデータの羅列になってしまう.

```r
barplot(mtcars$cyl)             # Doesn't work
```
![](https://i.imgur.com/i3n7Uj3.png)

### データを分割表にして, 棒グラフにする
生データではなく, 分割表にすることで, データをまとめ, 棒グラフにする.

```r
# Need a table with frequencies for each category
cylinders <- table(mtcars$cyl)  # Create table
barplot(cylinders)              # Bar chart
```
![](https://i.imgur.com/qkFC0xW.png)

### plot()とhist()の違い
plot()とhist()は以下のような, 違いがある.

```r
plot(cylinders)                 # Default X-Y plot (lines)
hist(cylinders)                 # histgram
```
![](https://i.imgur.com/zEJ2YPl.png)
![](https://i.imgur.com/Z5lGFOg.png)
elecom WRH-300XX3をAPモードで使うときのDHCPサーバの止め方

elecom WRH-300XX3を使ってるのですが、これのDHCPサーバが悪さをしてうまくつながらないときの対処。設定Webページからは設定が見えないので、Chromeの検証から強制的に見えるようにして変更した話（備忘録）。

- APモードなのでDHCPサーバは不要
- 仮に使ったとしても、デフォルトゲートウェイは（APモードなので）元ルータに指定したいのにできない

なお、この方法は下手をするとWRH-300X3にアクセスできなくなる可能性があるので、実施する際には自己責任でお願いします。

# 手順

1. 設定ページにアクセスして、動作モード選択をAPモードにして再起動。
2. 「インターネット設定」→「LAN設定」を開く
3. ページ内で右クリックして、「検証」
4. elementブラウジングで以下をたどる
    - &lt;html>→&lt;frameset>→&lt;frameset>→&lt;frame>→#document→&lt;html>→&lt;body>→&lt;blockquote>→&lt;form>
5. ふたつめの→&lt;table>がstyleで非表示にされているので、display:noneを削って表示する。
6. ページ側にDHCP: フォームが表示され、ClientになっているのでDisableに変更
7. ついでにIPアドレスを変える場合には、IPアドレスだけでなく、DHCPサーバの配布するIP範囲も変えないと変更できない使用になっているので、そちらも変える
    - もう一つ下の&lt;talble>もdisplay:noneを削って表示すると、DHCPサーバの配布IP範囲が指定できるようになるので、上の方のIPアドレス設定および配布範囲を変更
8. 「適用」ボタンを押すと自動的に再起動して上記が反映される

    -
【Laravel】authorizeResourceを使いつつ未ログインユーザーに特定のアクションを許可する

## authorizeResourceメソッドとは

authorizeResourceメソッドを使うと、コントローラーのCRUDアクションに対して、一括してポリシーによる認可制御を適用できます。

```php:app/Http/Controllers/ArticleController/php
<?php

namespace App\Http\Controllers;

use App\Article;
use App\Http\Requests\ArticleRequest;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function __construct()
    {
        $this->authorizeResource(Article::class, 'article');
    }
    // 略
}
```

## authorizeResourceメソッドと未ログインユーザー

authorizeResourceメソッドは便利ではあるのですが、認可されるにはユーザーが認証済みであることが必須であるため、アプリケーションの要件によっては使いづらい場合があります。

例えば、Qiitaでは未登録・未ログインユーザーでも各記事を参照できますが、このように参照系であるindexアクションやshowアクションを未ログインユーザー(ゲストユーザー)でも実行させたいとします。

しかし、authorizeResourceメソッドを使っていると、たとえポリシー側の対応するメソッド(viewAny, view)で一律trueを返していたとしても、未ログインユーザーには403がレスポンスされます。



```php:app/Policies/ArticlePolicy.php
<?php

namespace App\Policies;

use App\Article;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy
{
    use HandlesAuthorization;

    public function viewAny(User $user)
    {
        return true; // 一律trueを返していても、未ログインユーザーは403になってしまう
    }

    public function view(User $user, Article $article)
    {
        return true; // 同上
    }
    // 略
}
```

## 認可の条件としてログイン済みを必須としない

認可の条件として、ログイン済みを必須としないようにするにはUserクラスの型宣言をnullable(`?User`)にします。

```php:app/Policies/ArticlePolicy.php
// 略
    public function viewAny(?User $user)
    {
        return true;
    }
// 略
```

このようにすると、未ログインユーザーでも該当のアクションを実行できます。

なお、その場合もポリシーのメソッドは実行されますので、

```php:app/Policies/ArticlePolicy.php
// 略
    public function viewAny(?User $user)
    {
        return false; 
    }
// 略
```

falseを返した場合、未ログインユーザーも403になります。

未ログインユーザーが無条件に認可されるわけではありませんので注意してください。

## 環境

Laravel 6.x

## 参考

- [【Laravel 6.x】authorizeResource() の罠とその対処法 - Qiita](https://qiita.com/avocadoneko/items/658961b68a348a3cb3fd)

- [Qiita - Laravel の "認可" まとめ（Gate, Policy 等） - Qiita](https://qiita.com/tomoeine/items/f92de7d035e0fe8e7362)

- [ゲストユーザー - Readouble](https://readouble.com/laravel/6.x/ja/authorization.html)
Next.js+TypeScriptでパスのaliasを設定する

Next.js + TypeScript のプロジェクトで相対パス辛いなとなったので、そのエイリアスの設定方法
`import { SomeComponent } from '@/components/SomeComponent` みたいなやつです

## Next.js での path alias
with absolute imports の example があります
https://github.com/zeit/next.js/tree/master/examples/with-absolute-imports

```next.config.js
const path = require('path')

module.exports = {
  webpack(config, options) {
    config.resolve.alias['@'] = path.join(__dirname, 'src')
    return config
  },
}
```

## TypeScript での path alias
https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping

```tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}
```
Playframework+axiosによるPOSTするときの注意点(CSRFTokenとlist)

# PlayFramework(twirl)によるform
PlayFrameworkにはtwirlというテンプレートエンジンが用意されている。

``` hoge.scala.html
@helper.form(action="/hoge/huga",Symbol("id")->"form1") {
@CSRF.formfield
@helper.inputText(nankanoForm("nanika"),Symbol("id")->"text1",Symbol("placeholder")->"field")
<input type="submit">
}
```

このようなテンプレートからレンダリングされたhtmlでsubmitすれば入力したデータが
GET/POSTされ用意したnankanoformのcase classなどで受け取ることが出来るが、
クライアント側でajaxリクエストを行うといくつか問題が発生する。

## CSRF対策(POST時)
PlayframeworkではCSRFfilterを有効にするとRequestにCSRFTokenが設定されてないものは不正リクエストとして弾く。

上記テンプレートのように`@CSRF.formfield`を
`@helper.form`のブロック内部に追加することでCSRFfilterの認証を通すことができる。
しかし単純にformの値を取ってきてPOSTをすると、
CSRFTokenが見つからないためにリクエストエラーになってしまう。

PlayFrameworkではFormDataとしてcsrfTokenを含めるという方法を取っている。
上記のテンプレートをレンダリングした結果としてhoge.htmlがクライアント側で表示される。

```hoge.html
<form action="hoge/huga" method=POST id="form1">
<input name="csrfToken" value="123...">
<input type="text" name="nanika" id="text1" placeholder="field">
<input type="submit">
</form>
```

このform内のcsrfTokenの値を取得してPOSTする。

```javascript

const params = new URLSearchParams()

const csrfToken= document.getElementsByName("csrfToken")[0].value
const text = document.getElementById("text1").value

params.append("csrfToken",csrfToken)
params.append("text1",text)

axios.post("/hoge/huga",params)
```

一応こういう感じに`csrfToken`に対応させる形で送ると普通にsubmitしたのと同じようにリクエストが通る(もっといい書き方がある気もする)。

上記の方法を取らなくてもapplication.confに`session.sameSite = "lax"`と設定してCSRFfilterをfalseにしたり、
routesを以下のようにしてもいいと思う。

```routes
+nocsrf
POST /hoge/huga 
```

他にもplay.filters.csrf.header.bypassHeadersに色々設定して認証を回避したりもできる。
https://www.playframework.com/documentation/2.8.x/ScalaCsrf

## listのPOST
formの定義時にlist(number)という風にするとList[Int]みたいな感じで受け取れる。
例えば`boxes -> list(number)`みたいな感じにするとhtmlでは`name=boxes[]`でinput要素が生成される。
これをPOSTする際には下記のようにする必要がある。

```javascript

Array.from(document.getElementsByName("boxes[]"))
     .filter(e => e.checked)
     .map(e => e.value)
     .forEach(v => params.append("boxes[]",v))
```

配列としてappendするのではなく、各要素の値をappendしなければformのcase classへの変換が上手くいかないので注意。
tweepyを使った認証～ユーザー認証とアプリ認証(Python)

```python:auth.py
import tweepy
consumer_key = ""
consumer_secret = ""
access_token = ""
access_token_secret = ""
```
とした時に、
<h2>ユーザー認証(user auth)</h2>

```pytho:auth.py
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
```

<h2>アプリ認証(app auth)</h2>

```pytho:auth.py
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)
api = tweepy.API(auth)
```

となります。ユーザー認証とアプリ認証はレート制限が全く違います！
https://developer.twitter.com/en/docs/basics/rate-limits
![bandicam 2020-02-08 06-15-52-799.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/9fdc1ada-2caf-39e5-b2ba-0eb67a83955f.jpeg)

また、api = の形になっていますが、これはtweepyにおいてのAPIオブジェクトとなっており、
http://docs.tweepy.org/en/latest/api.html
![bandicam 2020-02-08 06-18-13-870.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/34efe02f-5071-668c-3c43-728b71053f0a.jpeg)
print(api.rate_limit_status())
のようにすれば、
![bandicam 2020-02-08 06-19-23-455.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/1fc01582-4c52-86db-5f03-87277c17a7a6.jpeg)
こんな感じ(JSON)で残りリクエスト数が返ってきます。
そして、ツイートが検索したいという時は、
![bandicam 2020-02-08 06-20-19-954.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/d6d68d57-9ab5-629f-8ca2-6ee76c5bb631.jpeg)
このようにリファレンスを開くといろいろ分かると思います。

ありがとうございました。

定型文
[ツイッター(@kenkensz9)にいつもいるので何かあればどうぞ](https://twitter.com/kenkensz9)
よろしければいいねお願いします！
「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 3.1 3つのスタック


「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 3.1 3つのスタック

###CHAP3. スタックとキュー
1. [3つのスタック](https://qiita.com/YusukeEngineer/items/3ebad7798e317588caca)

#Pythonコード解答例
```python:

class FixedMultiStack:

    def __init__(self, stackSize):
        numberOfStacks = 3
        self.stackCapacity = stackSize
        self.values = [0] * (stackSize * numberOfStacks) 
        self.sizes = [0] * numberOfStacks

    def indexOfTop(self,stackNum):
        offset = stackNum * self.stackCapacity
        size = self.sizes[stackNum]
        return offset + size - 1

    def isFull(self,stackNum):
        return self.sizes[stackNum] == self.stackCapacity

    def push(self,stackNum,value):
        if self.isFull(stackNum):
            raise Exception("FullStackException")
        self.sizes[stackNum] = self.sizes[stackNum] + 1
        self.values[self.indexOfTop(stackNum)] = value

    def isEmpty(self,stackNum):
        return self.sizes[stackNum] == 0

    def pop(self,stackNum):
        if self.isEmpty(stackNum):
            raise Exception("EmptyStackException")
        topIndex = self.indexOfTop(stackNum)
        value = self.values[topIndex]
        self.values[topIndex] = 0
        self.sizes[stackNum] = self.sizes[stackNum] - 1
        return value

    def peek(self,stackNum):
        if self.isEmpty(stackNum):
            raise Exception("EmptyStackException")
        return self.values[self.indexOfTop(stackNum)]

FMS = FixedMultiStack(5)

print(FMS.values)

FMS.push(0,1)
FMS.push(1,6)
FMS.push(2,11)

print(FMS.values)

FMS.push(0,2)
FMS.push(0,3)
FMS.push(0,4)
FMS.push(0,5)

print(FMS.values)

FMS.pop(0)
FMS.pop(1)

print(FMS.values)

print(FMS.peek(0))
print(FMS.peek(2))
```
楽しいベイズ推定

今回はだれにでもできる簡単なベイズ推定の説明です。

#ベイズ推定とは
自分もあまり詳しくはないですが、検索したときに推定なので100%当たるというモノではないです。
でも、当たる確率を拡大していくことは可能です。

#私のベイズ推定
私のベイズ推定は同対象にベイズ推定を3回行うことでとある確立を99.2%程度にするというモノです。0.8%はノイズです。

#アルゴリズムA：絞り込み
まず、群を欲しい解を2割程度の正当率で検索します。そうすると80%である8割はオッドになりますが、先ほどの2割をまた2割程度の正当率で検索します。そうすると4%である20%の2割の中に解が残ります。そしてそれをまた2割程度の正当率で検索します。そうすると0.8%の誤差で正当可能でしょう。
これで、正当率は99.2%になるはずです。

![無題__.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509227/08978078-8bfa-5140-c386-945cf147b0ec.png)


#アルゴリズムB：検索
まず、群を欲しい解を8割程度の正当率で検索します。そうすると20%である2割はオッドになりますが、先ほどの2割をまた8割程度の正当率で検索します。そうすると4%である20%の2割をまた8割程度の正当率で検索します。そうすると0.8%が最悪のノイズになります。99.2%をstablesortして、二分探査すれば、群から欲しいものが手に入ります。
これで、正当率は99.2%になるはずです。
![無題_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509227/c375ff14-ee0e-2280-f530-02737af393ca.png)

#終わりに
理想論ですが、結構、現実味のある方法だと思います。
なお、アルゴリズムAとアルゴリズムBには依存性は無く独立して使うことができると思います。
楽しんでいただけたら幸いです。
C言語の素因数分解を高速化する

#はじめに
比較的大きな数（long型）で高速に素因数分解をしてみたくなったので、やってみました。

# 実行環境
cygwin 3.0.7-1
Surface Pro4

# ソースコード
``` c
#include <stdio.h>
#include <math.h>
// #include <time.h>
#define A 1234567809876543 //素因数分解したい値を入力

long primeFactorization(long a){ //素因数分解を出力するプログラム
	long i,sq;
	if(a%2==0){ //偶数の場合
		printf("%ld\n",2);
		return primeFactorization(a/2); //2で割った値で再帰
	}
	sq = sqrt(a);
	for(i=3;i<=sq;i+=2){ //3以上√a以下の奇数の場合
		if(a%i==0){
			printf("%ld\n",i);
			return primeFactorization(a/i); //割れた値で再帰
		}
	}
	//偶数でも3以上√a以下の奇数の場合でも割り切れない場合
	if(a!=1){ //aが1でないなら、a自身は素数
		printf("%ld\n",a);	
	}
	return 0;
}

int main(){
	long a = A;
	// clock_t start,end;
	printf("%ld\n",a);
	// start = clock(); //実行時間計測開始
	primeFactorization(a);
	// end =clock(); //実行時間計測終了
	// printf("%.5f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
	return 0;
}
```
注）時間計測に関わる行はコメントアウトしています。

# 実行結果
``` 
$ ./a.exe
1234567809876543
3
19
1439
15051483241
0.00000秒かかりました
```

# 参考サイト
素数判定 高速化 | ユズノハのプログラミング学習サイト
https://programming-learning.com/2018/03/16/%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A-%E9%AB%98%E9%80%9F%E5%8C%96/
SocialFoceModelの解説と実装

人工ポテンシャル法の一種であるSocialFoceModelの解説を行います。
こちらはHelbingが提唱した力学に基づく人間の群衆行動のモデルです。


元論文はこちら
https://arxiv.org/pdf/cond-mat/9805244.pdf


基本的には以下のように引力と斥力の総和で表されます。

```math

F_{all} = F_{gall} + F_{others} + F_{obstacle}
```

### 引力
歩行者とゴールとの間に働く引力の式がこちらになります。

```math

F_{all} =\frac{V_0e_t-v_t}{\tau}
```
$V_0:速度の最大値$
$e_t:ゴール方向への単位ベクトル$
$\tau:V_0に到達するまでの時間（時定数）$
$v_t:現在の速度ベクトル$


</br></br></br></br></br></br>
###斥力
障害物や他の歩行者と、歩行者との間に働く斥力の式がこちらになります。
用いられる式は同じです。

```math

F_{others}  = F_{obstacle} =  v_rUe^{-\frac{d}{R}}
```
$d:障害物や他の歩行者との距離（半径を除く）$
$R,U:定数$
$v_r:障害物からの向き（単位ベクトル）$



### 著者のHelbingが設定しているパラメータは
$V_0:1.34 [m/s]$
$\tau:0.5 [s]$
$R:10.0[m^2/s^2]$
$U:0.2[m]$


となっています。


# 実装

この式とパラメータから、歩行者が障害物回避したときの軌跡を表示してみたいと思います。

本来であれば障害物や歩行者の半径を考慮させなければいけませんが、簡単のためにあえて抜かしてあります。


```python
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt

V0  = 1.34 # [m/s] Speed of equilibrium (= max speed)
tau = 0.5  # [sec] Time to reach V0 ziteisuu
delta_sec = 0.01 #[sec]

U = 10.0 # [m^2/s^2]
R = 0.2  # [m]

user_mass_kg = 55 # [kg]
user_mass_N = user_mass_kg / 9.8 # [N]

user_pos = np.array([0.0, 0.0]) # 0=x, 1=y[m]
user_vel = np.array([0.3, 0.0]) # 0=x, 1=y[m/s]
map_size = np.array([10, 10]) # 0=x, 1=y[m]
goal_pos = np.array([10, 5]) # 0=x, 1=y[m]
obstacle_pos = np.array([6, 3]) # 0=x, 1=y[m]

user_pos_lines = user_pos.reshape((2,1))


while True:
	# 引力
	dist_xy = goal_pos - user_pos
	dist_norm = np.linalg.norm(dist_xy, ord=1)
	e = dist_xy / dist_norm
	F_goal = (V0 * e - user_vel) / tau # [N]
	
	# 斥力
	dist_xy = user_pos - obstacle_pos
	dist_norm = np.linalg.norm(dist_xy, ord=2)
	v_r = dist_xy / dist_norm
	F_obstacle = v_r * U * np.exp((-1) * dist_norm / R)
	
	# 歩行者の位置計算
	F_all = F_goal + F_obstacle # [N]
	# 加速度 [m/s^2]
	user_acc = F_all / user_mass_N
	# 速度[m/s]
	user_vel += user_acc * delta_sec
	# 位置
	user_pos += user_vel * delta_sec
	
	# 歩行者とゴールの距離が0.2m以下になったら終了
	if np.linalg.norm(goal_pos - user_pos) < 0.2:
		break
	user_pos_lines = np.append(user_pos_lines, user_pos.reshape((2,1)), axis=1)


# 描画
# 障害物
plt.scatter(obstacle_pos[0], obstacle_pos[1], color='b', s=100)
# 軌跡
plt.plot(user_pos_lines[0,:], user_pos_lines[1,:], color='r')
# ゴール
plt.scatter(goal_pos[0], goal_pos[1], color='g', s=200)
plt.show()

print("end")
```

# 実行結果

このように、ゴールに向かいながら障害物を回避する軌跡をつくることができました。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/ab424c49-9681-2de7-ed10-3830f2530ca6.png)
Visual Studio Code でエディタとターミナルを移動するショートカットキーの作成

#前書き
人気急上昇中のエディタ、Visual Studio Code (以下、VSCode)を1年使ってきて、不便だなと思ってたことを昨日解決しましたのでここに記します。

ズバリ、**エディタとターミナル間の移動**です。
VSCodeの大きな特徴の一つは、エディタとターミナルが統合されていることです。しかしこれまでの私は、エディタで書いたものをコンパイル・実行するたびに、**マウスでターミナルをクリック**してから入力するということを繰り返していました。これなら別ウィンドウで開いて"Alt+Tab"の方が早いですよね。

しかし、私の調べた限りでは、ターミナル→エディタのショートカットキーはデフォルトでありますが、エディタ→ターミナルはありませんでした！

#ターミナル→エディタのショートカットキー
こちらはデフォルトで存在します。
"**Ctrl+1**"です。
数字はエディタの分割した数に対応していますので、もし左右に分けて2つファイルを開いており、右側へ移動したければ"Ctrl+2"になります。

#エディタ→ターミナルのショートカットキー
ないので作りましょう。
意外と簡単です。

>**追記** (2021/01/18)
当初、手元に Windows 環境しかなかったのですが、Mac の場合は以下の方法で移動が可能であるとコメントで教えていただきました。（以下↓）
>>Macの場合は「control + \`」で実現できるようです。
（バッククォート( \` )はJIS配列の場合 Shift + @ で入力可）

>>また、ターミナルにフォーカスが当たっている時に上記のキーを押すと
ターミナルの表示／非表示を切り替えられるようです。

#ショートカットキーの作り方
1. **"File"→"Preference"→"Keyboard Shortcuts"**ですべてのショートカットキーの記述が見られます。この操作のショートカットは"Ctrl+K"→"Ctrl+S"です。どう表記したら良いか分からないですが、Ctrl押しながらK→Sと順に押すという意味です。
2. 検索バーで、**"terminal.focus"**と検索してみましょう。"Terminal: Focus Terminal"というコマンド名で、"workbench.action.terminal.focus"というものがターミナルへ移動するコマンドです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390958/ce0f5e00-c758-b843-7b4e-1bbaee2f0116.png)
3. 図のように、マウスを合わせると左に"＋"マークが出てくるので、クリックして、オリジナルのショートカットキー（私は"Ctrl+T"）を入力し、Enterを押せば登録完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390958/2408b52b-6442-d3d6-0f6d-e26ff0eb8b6b.png)
Resultsetのnext()を、次があるかの判定メソッドと勘違いしていた件

##事象
とあるコードで、SELECTクエリを投げ、
その取得結果を**ResultSet型の変数rset**に格納している箇所がありました。

コード読解のためrsetの要素数を確認したいと思ったので、
以下のコードを途中に追記して実行しました。

```java:example.java
int testIndex = 0;
while(rset.next()){
    System.out.println("rsetの要素数を確認したい");
    System.out.println(++testIndex);
}
```

そうしたら、（それまでは正常終了していたのですが、）
その後ろの処理で、以下の例外が発生しました。

**java.lang.IndexOutOfBoundsException: Index: 0, Size: 0**

##読解のはずが壊してしまっていた
おかしいなと思って見てみたら、next()の理解が誤っていました。
現在の位置から次の1行へ進んでカーソルを当てる機能もあるのですね。

上記のコードで、最後の要素にカーソルがあたったままループを抜けたので、
後続のrsetで、次にカーソルがあたる要素がなく、
上記例外発生になってしまっていました。

ResultSetのnext()に気を付けたいと同時に、
読解のために一時追記したコードが悪さをすることもあるのだということを学びました。

##参考にさせて頂いた記事
 [Resultsetのnext()は、"ResultSetの次があるかどうかを判定するメソッド"ではない。](https://qiita.com/AIN/items/ff3b48fe9a61f5cd297f)
XCTestのAssertion一覧、テストファイルの使い方について

XCTestのAssertion一覧と使い方について、頭に入りきっていないので自身のためのカンペを兼ねてまとめました。
筆者が初学者のため、噛み砕いた記事になります。誤字脱字、補足、ここおかしいよ！等歓迎します。

# テストファイルの記入
import XCTest //XCTestのフレームワークをインポート

@testable import モジュール名 //モジュールをテスト用にインポート。モジュールが異なる場合、アクセス識別子がpublic,openでないとアクセスできないが、@testableとすることでinternal(明示的にアクセス識別子が書かれてない場合のデフォルト値)へアクセスできる。

class クラス名: XCTestCase　//XCTestCaseを継承

# XCTestのAssertion一覧

Assertion名の引数の最後にあるstringは試験失敗時のメッセージとして、文字列を入れることができる。試験の結果が確認しやすいよう状況に応じて使用する。

## Boolean Assertions
|Assertion名|説明|
|:-----|-----:|
|XCTAssert(expression,string)|expressionがtrueであることを確認する|
|XCTAssertTrue(expression,string)|expressionがtrueであることを確認する(XCTAssertと同じ)|
|XCTAssertFalse(expression,string)|expressionがfalseであることを確認する|

## Nil and Non-nil Assertions
|Assertion名|説明|
|:-----|-----:|
|XCTAssertNil(expression,string)|expressionがnilであることを確認する|
|XCTAssertNotNil(expression,string)|expressionがnilではないことを確認する|

## Comparable Value Assertions
|Assertion名|説明|
|:-----|-----:|
|XCTAssertGreaterThan(expresstion1,expression2,string)|expression1 > expression2となっていることを確認する|
|XCTAssertGreaterThanOrEqual(expresstion1,expression2,string)|expression1 ≧ expression2となっていることを確認する|
|XCTAssertLessThan(expresstion1,expression2,string)|expression1 < expression2となっていることを確認する|
|XCTAssertLessThanOrEqual(expresstion1,expression2,string)|expression1 ≦ expression2となっていることを確認する|

## Equality and Inequality Assertions
|Assertion名|説明|
|:-----|-----:|
|XCTAssertEqual(expresstion1,expression2,string|expression1とexpression2を比較し、一致することを確認する|
|XCTAssertNotEqual(expresstion1,expression2,string)|expression1とexpression2を比較し、一致しないことを確認する|
|XCTAssertEqualObjects(expresstion1,expression2,string|expression1とexpression2を比較し同一オブジェクトであることを確認する（Objective-C専用)|
|XCTAssertNotEqualObjects(expresstion1,expression2,string)|expression1とexpression2を比較し同一オブジェクトではないことを確認する（Objective-C専用)|
|XCTAssertEqualWithAccuracy(expresstion1,expression2,accuracy,string)|expression1とexpression2を比較しaccuracyの範囲以内に差が収まっていることを確認する|
|XCTAssertNotEqualWithAccuracy(expresstion1,expression2,accuracy,string)|expression1とexpression2を比較しaccuracyの範囲以内に差が収まっていないことを確認する|

## NSException Assertions
|Assertion名|説明|
|:-----|-----:|
|XCTAssertThrows(expression,string)|expressionで例外が発生することを確認する|
|XCTAssertNoThrows(expression,string)|expressionで例外が発生しないことを確認する|
|XCTAssertThrowsSpecific(expression,exception_class,string)|expressionで、特定のクラス（exception_class)で例外が発生することを確認する|
|XCTAssertNoThrowsSpecific(expression,exception_class,string)|expressionで、特定のクラス（exception_class)で例外が発生しないことを確認する|
|XCTAssertThrowsSpecificNamed(expression,exception_class,exception_name,string)|expressionで、特定のクラス（exception_class)の特定の例外(exception_name)が発生することを確認する|
|XCTAssertNoThrowsSpecificNamed(expression,exception_class,exception_name,string)|expressionで、特定のクラス（exception_class)の特定の例外(exception_name)が発生しないことを確認する|

## Failing Unconditionally
|Assertion名|説明|
|:-----|-----:|
|XCTFail(string)|テストを失敗させる| 

参考
[Apple Developer](https://developer.apple.com/documentation/xctest?language=objc)
[XCTestのAssert一覧](https://qiita.com/shirochan/items/10271912289dc563cc36)
[iOSアプリ開発自動テストの教科書](https://gihyo.jp/book/2019/978-4-297-10629-4)
【Rails】mechanizeを使えばrailsスクレイピングが余裕な件

スクレイピングに初挑戦したとき、検索上位にあがるサイトはどれもnokogiriを使用するのですが、dockerだとうまく利用できず四苦八苦していました。

その中で見つけたのが**mechanize**というgemです。
 

自分用メモのためにも今回はコードを書いときたいと思います。

 

#前提
railsアプリは作成済み
gem mechanize インストール済み
 

 

#Controller
controllerでは.getメソッドとsearchメソッドを使ってページ情報を取得します。

 
```
def home

  agent = Mechanize.new

  page = agent.get("https://nemlog.nem.social/")

  @elements= page.search('.visit-w')

end
```
 

あとはインスタンス変数@elementsを利用してviewに表示するだけです。

 

 

#View
```
<%@elements.each do|element|%>
  <ul>
    <li>
      <%=link_to(element.inner_text,element[:href])%>
    </li>
  </ul>
<%end%>
```
 
.inner_textはテキスト部分だけ抜き出してくれます。
また、element[:href]は指定したhtml（この場合はclass=visit-w）の属性を抜き出します。
 
#まとめ
結論、mechanizeは神ですね。
スクレイピングをお手軽に試してみたい人はぜひ使ってみてください。

#おまけ
これを利用して簡単なnemlolgのスクレイピング サイトを作りました。
コードも確認できるので参考になればと思います。

github↓
https://github.com/soehina/searchnemlog
Laravel artisanコマンドを設定してスクリプト実行

# コマンド作成

下記コマンドでartisanコマンドを作成するためのファイルが生成される

```sh
$ php artisan make:command コマンド名
```

`app/Console/Commands`配下に`コマンド名.php`の形で下記ファイルが生成される


```php:app/Console/Commands/コマンド名.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class Scraping extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}
```


下記項目を追記する

- `$signature`にコマンド名を記述
- `$description`にコマンドの説明記述
- `public function handle()`内に実行スクリプトを記述


追記してみたファイル


```php:app/Console/Commands/コマンド名.php

<?php
namespace App\Console\Commands;
 
use Illuminate\Console\Command;
 
class Scraping extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'コマンド名';  // 追記
 
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'コマンド名を実行します。';  // 追記
 
    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }
 
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        echo 'スクリプトを実行しました。' . PHP_EOL;  // PHP_EOLの結合で改行が可能  // 追記
    }
}
```

`public function handle()`内を今回はサンプルで`echo`を実行しているが、関数のスクリプトを記述すれば複雑な処理も実行される


# コマンドの確認

設定したコマンドが設定されているか確認可能

```sh

# 使用可能なコマンドを確認できる
$ php artisan list

# 出力結果 (Available commands項目)
Available commands:
  コマンド名              コマンド名を実行します  # ここに表示される
  clear-compiled       Remove the compiled class file
  down                 Put the application into maintenance mode
  dump-server          Start the dump server to collect dump information.
  env                  Display the current framework environment
  help                 Displays help for a command
  inspire              Display an inspiring quote
  list                 Lists commands
  migrate              Run the database migrations
  optimize             Cache the framework bootstrap files
  preset               Swap the front-end scaffolding for the application
  serve                Serve the application on the PHP development server
  tinker               Interact with your application
  up                   Bring the application out of maintenance mode

```

# コマンドの実行

```sh
$ php artisan コマンド名

# 今回の場合の出力結果
スクリプトを実行しました
```

## (参考)
https://tac-blog.tech/index.php/2018/11/24/web-scraping-1-make-artisan/