OmniAICreator/Qiita-1.07M huggingface dataset:
OutputDebugString 自前受取 メモ

OutputDebugStringを自前で受け取るプログラムを作りたくなったのでメモ

#環境
- Windows 10
- Visual Studio 2019 C++

# 本文
１. 以下を参考に前半部分を作成
link:[OutputDebugStringで出力したデバッグライトを自前で受け取る](http://www.iot-kyoto.com/satoh/2016/01/19/win32api-001/)

変更点

- (HANDLE)(-1)にした

```C++
    hMapFile = CreateFileMapping((HANDLE)(-1), &sa, PAGE_READWRITE, 0, 4096, TEXT("DBWIN_BUFFER"));
```

２. 1.コードだけでは一時期うまくいかなかった気がしたが、
　最終的に取得できるようになった
　以下資料があるが、最終的には変更しなかった
 ⇒　Global　はつけない
　　⇒　つけると、起動の際に管理者権限要求されて面倒
link:[How can I receive OutputDebugString from a service?](https://stackoverrun.com/ja/q/1600241)

３. 後半部分はウィンドウプロシージャ用に変更

- 受信文字列用にLPSTRと適当に変更
- WaitForSingleObject を MsgWaitForMultipleObjects に変更
- 末尾にUnmapViewOfFileとCloseHandle　追加
- メッセージポンプの追加
- メッセージポンプにWM_QUITの追加

　⇒メッセージポンプの追加だけだと、MsgWaitForMultipleObjects待機中に終了した際、プロセスに残ってしまう
　　以下により、とりあえずWM_QUIT受信時に、関数終了させてPostQuitMessageを再送させた
link:[作業から なかなか帰れないプログラム](http://home.att.ne.jp/delta/hrymkt/PTIPS/BusyProg.html)

```C++
    //--------------- 先頭DWORDがプロセスID、以下が格納文字列
    LPDWORD pPID = (LPDWORD)pMem;
    LPSTR  pString = (LPSTR)pPID + sizeof(DWORD);

    SetEvent(hEvAck);

    while (bGetStringDo) //別に定義される static bool bGetStringDo;   //  TRUEで取り込み中
    {
        DWORD dstat = MsgWaitForMultipleObjects(1, &hEvReady, 0, INFINITE, QS_ALLINPUT) ;

        switch (dstat)
        {
        case WAIT_OBJECT_0:
        {
            //------------ ここで受け取った文字列、pStringをコンソールなりファイルなりに出力すればよい



            //------------
            SetEvent(hEvAck);

            break;
        }
        case WAIT_FAILED:
        {
            bGetStringDo = false;
            break;
        }
        default:
        {
            break;
        }
        }

        

        MSG    msg;
        if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {
                bGetStringDo = false;
                PostQuitMessage(0);
            }
            else
            {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
            }
        }        
    }

    UnmapViewOfFile(pMem);
    CloseHandle(hMapFile);
    CloseHandle(hEvReady);
    CloseHandle(hEvAck);

    return 0; // int WaitOutputDebugString()
```
WordPressのWordPressアドレスを間違えて変更してしまった

# 概要

![スクリーンショット 2020-04-02 19.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596855/dca1a6b7-75ca-6ac1-3b44-8535d2e9a1e9.png)

軽い気持ちでWordPressアドレスを変えてしまったところ(上画像の```/wordpress```を消してしまった)、
変更後のURLにアクセスしてもダッシュボードにアクセスできなくなってしまった。。

# 対処 

## その1　wp-config.phpで設定を上書きする

設定ファイル```wordpress/wp-config.php```に下記を追加。

```php:wp-config.php
define('WP_SITEURL', 'http://dev.hoge.com/wordpress');
```

<font color="Red">※注意</font>

```php
/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */
```
より上に追加すること。

### ただし...
これをすると、ダッシュボードからはWordPressアドレスを変更できなくなっちゃいます。
あまりよろしくない。

## その2　wp_optionsテーブルの中身を修正する
どうやらWordPressアドレスはWordPress用のデータベースの```wp_options```テーブルで管理されているらしい。
編集ツールを使うのも面倒なので、直接コマンドで編集しちゃいます。

**1. WordPressのサーバーから、MySQLにアクセス**

```:terminal
$ mysql -u root -p
Enter password: 
```
<br>
**2. WordPress用のデータベースに接続**

```:terminal
mysql> use データベース名
```

補足: WordPress用のデータベースは```wp-config.php```で設定したもの。

```php:wp-config.php
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'データベース名' );
```
<br>
**3. テーブルを確認**

```:terminal
mysql> show tables;
```
```
+-----------------------+
| Tables_in_hoge        |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
12 rows in set (0.00 sec)
```

ちゃんと```wp_options```がありますね。
<br>
**4. WordPressアドレスを確認**
WordPressアドレスは```siteurl```として管理されているらしい。


```:terminal
mysql> select option_name,option_value from wp_options where option_name = "siteurl";
```
```
+-------------+------------------------+
| option_name | option_value           |
+-------------+------------------------+
| siteurl     | http://dev.hoge.com    |
+-------------+------------------------+
1 row in set (0.00 sec)
```

ありましたね。URLも変更してしまった後のものです。
<br>
**5. テーブルを更新**
```set option_value = "変更したいURL"```とし、テーブルの内容を更新します。

```:terminal
mysql> update wp_options set option_value = "http://dev.hoge.com/wordpress" where option_name = "siteurl";
```
<br>
**６. 変更を確認**

```:terminal
mysql> select option_name,option_value from wp_options where option_name = "siteurl";
```
```
+-------------+----------------------------------+
| option_name | option_value                     |
+-------------+----------------------------------+
| siteurl     | http://dev.hoge.com/wordpress    |
+-------------+----------------------------------+
1 row in set (0.00 sec)
```
ちゃんと変更されています。

![スクリーンショット 2020-04-02 22.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596855/4136a5e5-b56b-00a2-f19b-389bd9cb6c12.png)
ダッシュボードにもアクセスでき、変更も反映されていることが確認できます。


# まとめ
wp_optionsテーブルの中身を更新することで、無事にWordPressの設定を変更前に戻すことができました。
テーブルの中身をいじるので更新する際はくれぐれも慎重に。
パソコン整理してたらWCFサービス作成手順メモが発掘されたよ。

WCFという技術があります。
※WCF ＝ Windows Communication Foundation

今から２年ほど前、WCFのプログラムを作成する仕事をしていた時期があったのですが、
結局その案件は１～２週間程度で未完成のままクローズとなりました。
それ以降、WCFに触れる機会が全くなかったため、今では完全に忘れております。

そのとき自分で書いたメモを、最近になって見つけました。
以下、メモの全文です。

```
・WCFサービスライブラリをソリューションに追加
・クライアント側アプリのほうで「追加」→「サービス参照」
・サーバ側を実装。インターフェース側と矛盾のないように。
・ServiceReference1を「サービス参照の更新」
・サーバ側に追加した複合型クラスをクライアント側から認知させるには...
　・[DataContract]を複合型クラスに付与
　・[DataMember]をメンバに付与
　・複合型を引数で受け取るメソッドを実装
```

なるほどなるほど、Visual StudioでWCFのプログラムを作成する手順メモのようです。
サーバ側とクライアント側のプロジェクトをひとまとめにしたソリューションを作って、
お互いにデータをやりとりしたい、のかな？
しかも「複合型」という単語が出てくるので、何らかのクラスのインスタンスを詰め込んだコレクションとかをやりとりしたい、のかな？

このメモだけではアレなので、WCFについてもう少し調査して、サンプルプログラムを作る手順をQiitaの記事にまとめるなどしたいですね。
最近忙しいのでそんな暇があるのか怪しいですが…。
（ていうかそもそもWCFって、最近も流行し続けている技術なのだろうか…あんまり名前を聞かない気がするけど…）
Bootstrap dropdown導入時の注意点

##はじめに

bootstrapのdropdownの表示方法の順序や注意点についてを備忘録として残しておく。


##基本的には公式ページに添えばできる

基本的にはweb上にたくさん表示方法が転がっているのだが、個人的には公式ページを読むことをオススメする。

####参考ページ
公式ページ　ドロップダウン(日本語)
https://getbootstrap.jp/docs/4.2/components/dropdowns/

公式ページ　ドロップダウン(英語)
https://getbootstrap.com/docs/4.4/components/dropdowns/

##バージョンによって記述方法が違う

bootstrap3からbootstrap4へのバージョンが変わると、dropdownだけでなく他の機能の表示記述方法も変わる。以下の記事を参考に、自身の導入したbootstrapのバージョンを再度確認して、記述していくのが良い。

####参考ページ
Bootstrap4移行ガイド　ドロップダウン
https://cccabinet.jpn.org/bootstrap4/components/dropdowns

##Popper.jsの導入が必要

ドロップダウンはbootstrapのサードパーティライブラリ(Popper.js)に構築され、動的な位置決めとviewport の検出が可能だ。なので、Popper.jsを**bootstrap.jsを読み込む前に**記述しなければならない(popper.min.jsでも可)。

もしくは、Popper.jsを内部に含む bootstrap.bundle.min.js や bootstrap.bundle.js を使用する。

##今ハマっているエラー

ページ遷移後の最初のクリックで、dropdown-itemが表示されない。
二回目のクリックから正常に動く。

ドロップダウン部分

```html.haml
            .col-4.text-center.shadow.btn.btn-info.dropdown-toggle#dropdownMenuButton{data: {toggle: "dropdown"}, aria: {haspopup: "true", expanded: "false"}}
              その他
            .col-4.dropdown-menu.dropdown-menu-right{aria: {labelledby: "dropdownMenuButton"}}
              - if user_signed_in? && @user.id == current_user.id
                .text-decoration-none.dropdown-item= link_to "情報編集", edit_user_registration_path(@user)
              - else
                .text-decoration-none.dropdown-item= link_to "ダイレクトメッセージ", "#"
              - if user_signed_in? && @user.id == current_user.id
                .text-decoration-none.dropdown-item= link_to "ログアウト", destroy_user_session_path, method: :delete
              - else
                .text-decoration-none.dropdown-item= link_to "通報する", "#"
```

検証ツールで見てみると、dropdown-toggleの親要素にshowが付与され、dropダウンの中身が表示されるというjsの動きだろうが、一回目のクリックでは何も起こらず、二回目から動き始める。

こういう場合一番に怪しいと思うのは、turbolinksの有無だが、私のコードはturbolinksをすでに無効にしている。つまり、ページ遷移するたびにjsファイルがきちんと読み込まれる仕組みになっているはず。。。

ググってもこれといった解決策は見つからず、謎は深まるばかり。。



###追記(2020/04/03)
解決しました！！
原因:

```application.js
//= require jquery
//= require rails-ujs
//= require popper
//= require bootstrap
//= require bootstrap-sprockets
```


bootstrapとbootstrap-sprocketsを両方reuqireしてしまっていました。

これだと、二回もbootstrapを読み込むことになって、不具合が起こっていたと考えられます。

どちらか片方だけでよかったみたいです。

まだまだ知らないこと多いなあ。


##おわりに

この記事を真剣に読んでくださった方ならわかると思うが、ほぼ参考文献に書かれてある内容のコピペだ。だが私はこれが、記事の書き癖をつける第一歩になると信じ、小一時間で書けるような簡単なことからQiitaに書き溜めて行こうと思う。

**Done is better than perfect.**

マークザッカーバーグの言葉

完璧(読者にとって有益で読みやすく、且つ自身のアウトプットにもなるような記事を書くこと)を目指すより、
まず終わらせる（どんなに簡単な内容で、無益な情報であっても書く）。

終わらせ続けよう。そうして習慣化させていきたい。
vagrant upが実行できない → ディレクトリが違うだけだった

# vagrant upが実行できない


```
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or,
get an ID of a target machine from `vagrant global-status` to run
this command on. A final option is to change to a directory with a
Vagrantfile and to try again.
```

$ vagrant up を実行しようとすると、上記のエラー文が表示されて実行できない。。。

##ホームディレクトリじゃん。
Homesteadディレクトリに移動して

```
cd Homestead
```
再び実行したらできた！
Kinx ライブラリ - Signal

# Signal

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。言語はライブラリが命。ということでライブラリの使い方編。 

今回は Signal です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。 

簡単ながらシグナルをサポートしました。

## Signal

Signal は、`type` として `Signal.SIGINT` と `Signal.SIGTERM` のみサポート。`Signal.trap(type, handler)` でシグナル・ハンドラを登録し、処理を実行する。ハンドラが登録されていない状態でシグナルを検知したら、プログラムが終了する。

### Signal.trap(type, handler)

シグナル・ハンドラ（`handler`）を登録する。id を返すので、登録解除したい場合は `Signal.remove(id)` で登録したハンドラを解除できる。

ハンドラが明示的に false を返した（`return false` した）場合、プログラムを終了する。

現時点ではハンドラは登録した順序でコールされるが、この順序を保証するかは決めていない。保証する必要があるかな？

### Signal.remove(id)

id で示されたハンドラを解除する。

## ブロッキング処理の中断

以下の組み込みメソッドでのウェイト中には検出して中断するようにしている。

* `System.sleep()`
* `$stdin.getch()`
* `$stdin.readLine()`

## サンプル

Ctrl-C では終了しないが、Ctrl-Break で終了する。ただし、Ctrl-C を 10 回受信したら、ループから抜けてプログラムを終了させる。

```javascript
var trapped = 0;

Signal.trap(Signal.SIGINT, function() {
    System.println("SIGINT");
    ++trapped;
});

Signal.trap(Signal.SIGTERM, function() {
    System.println("SIGTERM");
    return false;
});

while (trapped < 10) {
    System.println("Trapped = %2d" % trapped);
    System.sleep(1000);
}

System.println("Ended");
```

結果。

```
Trapped =  0
Trapped =  0
Trapped =  0
SIGINT
Trapped =  1
SIGINT
Trapped =  2
SIGINT
Trapped =  3
SIGINT
Trapped =  4
SIGINT
Trapped =  5
SIGINT
Trapped =  6
SIGINT
Trapped =  7
SIGINT
Trapped =  8
SIGINT
Trapped =  9
SIGINT
Ended
```

Windows で Ctrl-Break、または Linux で `kill -15 [PID]` してみる。

```
Trapped =  0
Trapped =  0
Trapped =  0
SIGINT
Trapped =  1
SIGINT
Trapped =  2
SIGINT
Trapped =  3
Trapped =  3
SIGTERM
```

## おわりに

今回は簡単に説明。シグナルは割り込みと同じで急にフローが変化するので、処理前後でつじつま合うようにするために結構手が入りました。内部仕様はもう少し変化するかもしれない。動作仕様は変わらない範囲で。

あと、Windows と Linux で色々仕様が違うのを何とかするのが大変。Linux だと `fgets` とかシグナルで中断されないので `siginterrupt()` とか使ってシステムコールから復帰させたりしないといけない。ハンドルされるタイミングも微妙に違う。

`SIGINT` と `SIGTERM` 以外サポートする必要あるかな？

ではまた次回。
Minecraft forgeをCentOS8で動かす為のTips

### 事前にインストールするもの

```
dnf install -y java-1.8.0-openjdk
dnf install -y epel-release
dnf install -y screen
```


### forge起動スクリプト
```bash

#!/bin/sh
/usr/bin/screen -DmS forge java -server -Xms1G -Xmx8G -XX:MetaspaceSize=512M -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+DisableExplicitGC -XX:+UseCompressedOops -XX:+OptimizeStringConcat -XX:+UseTLAB -jar forge-1.14.4-28.0.18.jar
```

### サービス
```
nano /etc/systemd/system/forge.service
```
```
[Unit]
Description=Forge Minecraft Server
After=network-online.target

[Service]
ExecStart=/bin/bash /home/forge/forge.sh
WorkingDirectory=/home/forge/
Restart=always
User=forge
Group=forge

[Install]
WantedBy=multi-user.target
```
スクレイピングで使うライブラリ一覧

#スクレイピングで使うライブラリ一覧

urllib→pythonのパッケージの一つ。urlにアクセスしてファイルを展開などできる。
BeautifulSoup→HTMLやXMLを解析できる。
requests→urllib同様、urlを利用するときに使うパッケージ。ただ、こちらは簡単にクッキーを利用できる。
Selenium→Webブラウザの遠隔操作
PhantomJS→コマンドラインから使えるwebブラウザ
json→json形式のデータを扱う
MySQL→データベース。
cgi→ホームページを作るのに使う。
pandas→excelの編集


サーバーとして使うにはappachかな
Netlify Functions で API の URL を rewrite する

## はじめに

[Netlify Functions](https://docs.netlify.com/functions/overview/) で作成する API の URL 形式を 初期設定の `/.netlify/functions/example?hoge=10` のような形から `/example/10` 形式に rewrite する方法です。

## netlify.toml の指定

Netlify ではプロジェクトのルートに配置する `netlify.toml` で redirect を指定することができます。また、`status` を `200` に設定すると redirect ではなく rewrite として機能します。

> [Rewrites and proxies](https://docs.netlify.com/routing/redirects/rewrites-proxies/)
>
> When you assign an HTTP status code of 200 to a redirect rule, it becomes a rewrite. This means that the URL in the visitor's address bar remains the same, while Netlify's servers fetch the new location behind the scenes.

URL の指定には[プレースホルダー](https://docs.netlify.com/routing/redirects/rewrites-proxies/) が使えるので、例えば `/v1/digit/200/6/123456/` のような URL を `?width=600&digit=6&number=123456` に変換する記述は次のようにかけそうです。

```
[[redirects]]
    from = "/v1/digit/:width/:digit/:number/"
    to = "/.netlify/functions/digit/?width=:width&digit=:digit&number=:number"
    status = 200
```

が、残念ながらリライトはされるものの、（2020/4 現在）Lambda エンドポイントの `event.queryStringParameters` に値が渡ってきません。

```javascript
exports.handler = async (event) => {
    console.log(event.queryStringParameters); // {}
}
```

Netlify Community にも同件の報告があがっていました。


> [queryStringParameters not working with redirect on production - Support - Netlify Community](https://community.netlify.com/t/querystringparameters-not-working-with-redirect-on-production/3828)

## event.path から取得する

Community のほうに `event.path` から取得してみてはどうかとありましたので、（悲しいですが）次のように `event.path` を `path-parser` で URL をパースすることにしました。

```javascript
import { Path } from 'path-parser';

function parseQueryArgs(rewriteUrl, urlpath, format) {
    const parse = Path.createPath(rewriteUrl).test(urlpath);
    let result = {};
    for(const key in format) {
        if(parse && parse[key]) {
            result[key] = parse[key];
        } else {
            // default value
            result[key] = format[key]
        }
    }

    return result;
}

exports.handler = async (event) => {
    const args = parseQueryArgs(
        '/v1/digit/:width<\\d+>/:digit<\\d+>/:number<\\d+>/',
        event.path,
        {
            width : 160,
            digit: 6,
            number: 12345
        }
    );
    // ..snip
};
```

この場合の `netlify.toml` は単純に次のようになります。

```
[[redirects]]
    from = "/v1/digit/*"
    to = "/.netlify/functions/digit"
    status = 200
```

[rewrite が使えないローカル netlify-lambda 環境の考慮も入れた版](https://github.com/h1romas4/netlify-functions-template/blob/master/src/functions/common.js#L65-L96)を github においてあります。

## 動作サンプル

![Screenshot_2020-04-02 fujilcd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102286/1198a5c2-63b5-8594-2f7b-d4ab24bceab4.png)

`/v1/digit/幅px/桁数/ナンバー/` として動作します。

> [https://sample-counter.netlify.com/v1/digit/640/9/123456789/](https://sample-counter.netlify.com/v1/digit/640/9/123456789/)

## 関連

[Netlify Functions で古のアクセスカウンター（アクセサリー）をつくる - Qiita](https://qiita.com/h1romas4/items/5048f68e16cadc4e6fb8)

> github リポジトリー
>
> [h1romas4/netlify-functions-template](https://github.com/h1romas4/netlify-functions-template)
Googleデータポータルでラベルが英語になってしまう問題


年齢やデバイス等の結果をグラフや表で表示しようとすると表記が英語になってしまうので、
その対策を備忘録として残します。

ひとまず殴り書きしておりますので、
余力があればきれいにまとめます

##年齢##
```ruby:filename.rb
CASE
  WHEN 年齢 = "18to24" THEN "18歳～24歳"
  WHEN 年齢 = "25to34" THEN "25歳～34歳"
  WHEN 年齢 = "35to44" THEN "35歳～44歳"
  WHEN 年齢 = "45to54" THEN "45歳～54歳"
  WHEN 年齢 = "55to64" THEN "55歳～64歳"
  WHEN 年齢 = "gt64" THEN "65歳以上"
  WHEN 年齢 = "Undeterminded" THEN "不明"
  ELSE "不明"
END
```

##デバイス##
```ruby:filename.rb
CASE
  WHEN デバイス = "computers" THEN "パソコン"
  WHEN デバイス = "mobile devices with full browsers" THEN "スマートフォン"
  WHEN デバイス = "tablets with full browsers" THEN "タブレット"
  ELSE "不明"
END
```

##クリックタイプ##
```ruby:filename.rb
CASE
  WHEN クリック タイプ = "Headline" THEN "広告見出し"
  WHEN クリック タイプ = "Get location details" THEN "詳しい場所を確認 "
  WHEN クリック タイプ = "Sitelink" THEN "サイトリンク"
  WHEN クリック タイプ = "Phone calls" THEN "モバイル Click-to-Call"
  WHEN クリック タイプ = "Driving direction" THEN "ルート案内"
  ELSE "不明"
END
```
RDBとは

#RDBとは
表形式のテーブルと呼ばれるデータの集合を互いに関連付けて関係モデルを使ったデータベースのこと
縦の行をレコード、横の列をテーブルと呼ぶ
主に使われるデータベース
・oracle
・mysql
・Mariadb
といったものがある。

参考にしたサイト
https://aws.amazon.com/jp/relational-database/
docker環境下でのtensorflowの使い方

メモ。

docker pull tensorflow/tensorflow:latest-gpu-py3

`
docker run -it -p 8888:8888 -v $HOME:$HOME tensorflow/tensorflow:latest-gpu-py3 bash
`

特に重要なのはgpuが入っていること。
これがなかったらエラーが出た。
jupyterのoptionでやってもできたが、python2になった。
Rails 自作アプリへの道 Part2

Rails 自作アプリを作った時の経過をまとめていきます。


環境

|OS|Ruby|Rails|
|:---|:---|:---|
|Mac Mojave 10.14.16|2.6.3p62|5.0.7.2|

参考
https://qiita.com/cigalecigales/items/f4274088f20832252374

前提
環境構築済

【conformableの設定】

1.送信メールアドレスの登録

①設定ファイルの追記/編集

```config/environments/depelopment.rb
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => 587,
    :user_name => "Gメールアドレス", # メアドを書く
    :password => "Gメールパスワード",
    :authentication => :plain,
    :enable_starttls_auto => true
  }
```

```config/initialiezers/devise.rb

  config.mailer_sender = 'Gメールアドレス' # メアドを書く
```


②gmailアプリパスワードの取得、追記

```config/environments/development.rb

　　　（省略）
    :password => "Gメールパスワード", # Gmailのアプリパスワードを書く
　　　（省略）
```

③サインアップ、ログインの検証

サーバーを起動し、サインアップ。
確認メールをMacで開き、『Confirm my accout』をクリック
その後、ログイン可能か確認する

【lockableの設定】

1.設定値の登録

①設定ファイルの編集 ※ 必要に応じて、設定値やコメントの有無を変更

```config/initializers/devise.rb

　　　（省略）

  config.lock_strategy = :failed_attempts

  config.unlock_keys = [:email]

  config.unlock_strategy = :both

  config.maximum_attempts = 20

  config.unlock_in = 1.hour

  config.last_attempt_warning = true

　　　（省略）
```

【timetableの設定】

1.設定値の登録

①設定ファイルの編集 ※ 必要に応じて、設定値やコメントの有無を変更

```config/initializers/devise.rb

　　　（省略）

  # config.timeout_in = 30.minutes

  
　　　（省略）
```

【その他の設定】

1.サインアップ画面で入力させたい項目の追加

①設定ファイルの編集 ※ 必要に応じて、入力させたい項目を追加

```app/views/devise/registrations/new.html.erb

<h2>サインアップ</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>
  <!-- 省略 -->

  <div class="field">
    <%= f.label :sellername, '取扱者' %><br />
    <%= f.text_field :sellername, autofocus: true, autocomplete: "sellername" %>
  </div>
  <!-- 省略 -->
<% end %>

<%= render "devise/shared/links" %>
```

2.変更できるようにしたい項目の追加

①設定ファイルの編集 ※ 必要に応じて、入力させたい項目を追加

```app/views/devise/registrations/edit.html.erb

<h2>取扱者情報編集</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>
  <!-- 省略 -->

  <div class="field">
   <div class="field">
    <%= f.label :sellername, '取扱者' %><br />
    <%= f.text_field :sellername, autofocus: true, autocomplete: "sellername" %>
  </div>
  <!-- 省略 -->
<% end %>

<%= render "devise/shared/links" %>
```

3.ストロングパラメータの設定

①データベースに登録したい項目をストロングパラメータで指定する

```app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:sellername])
      devise_parameter_sanitizer.permit(:account_update, keys: [:sellername])
    end
end
```
普段使いできそうなスニペット管理ツールmasscode

# masscodeとは？

最近ちょとだけ話題となっているmasscode。使い始めているのでメモ書き。
masscodeとは以下のようなツールである。

- 開発者向けのスニペット管理ツール(無料、オープンソースコード)。
＃ A free and open source code snippets manager for developers.
- スニペット(コード断片)に対するキーワード検索とタグ付けがキモなので、お使いになる際にはキーワードやタグ付けは計画的に。
- VSCodeと同じく`monaco-editor`が使われている。けれども、vscodeと併用する類のものではない。

...今年の新人さんはいきなり在宅で研修受けたりすることが多かったりするのだろうね。リモートで業務をちゃんと進めるためのTips（ノウハウ）を記録する際にはちょっとお勧め。例えば、お勧めされたコーディング系の本に書かれているノウハウを記録するのに良い。ローカルで軽快に検索できるあたりも良い。
...因みに私もニューヨーク界隈が本社の外資で働いているので、この一月ほど出社したことはない（...が毎日コードは書いているので、皆勤賞ではある）。

【公式サイト】
https://masscode.io/
※↑にwindows等、プラットフォーム毎の導入ガイダンスがある。

【日本語での紹介記事（例）】
- [Web制作者におすすめ！VS Codeと同じエディタを使用した最強のコードスニペットマネージャーが登場 -massCode](https://coliss.com/articles/build-websites/operation/work/code-snippets-manager-for-developers-masscode.html)
- [massCode - マルチプラットフォームで使えるスニペット管理](https://www.moongift.jp/2020/01/masscode-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88%E7%AE%A1/)
- [Electron+Vueでできたオープンソースのスニペットマネージャ「massCode」を使ってみた](https://itnews.org/news_contents/oss-masscode)

# [1] （現時点での）masscodeの使いどころ
ずばり、大抵のシステムを組む際に必要となる設定ファイル(.conf /.xml /.json etc.)やスクリプト(.js/Jenkinfile etc.)を記録するのに良い。キーワードやタグ付けに注意しておけば、、忘れた頃に役に立つ。masscodeは最近登場したばかりのツールなので、あくまで現時点では、ね。無償のツールであることは、この手のスニペット管理ツールとしては珍しいとのこと。ありがたや。

逆にコンパイル言語で複数ファイルにまたがったコードを設計書を兼ねて記録するといった用途には不向き。クリーンアーキテクチャでオニオン構造頑張ってみた、といった類の記録は、gitやsubversionにコミットして残しておこう。...ディフォルト言語に主要言語の他にrustもあるのに、scalaがないのにちょっと驚いたけれども（以下）、まぁ、単に、scalaなどのコンパイル言語で、ある程度以上の規模のシステムをスクラッチから作る際のメモ書きといった用途は、masscode向けではないのだと思われる。


# [2] masscodeで.jsでのスニペット管理例

`[フォルダ(FOLDERS)]－＞[テーマ]－＞[コンテンツ]`という三層構造でのスニペット管理が基本となる。
割といいなと思ったのが、`[コンテンツ]`をいくつかの断片(Fragment)に分けて管理できるところ。例えば、`HTML+css+javaciript`といった組み合わせのTipsを管理するのに役に立つ。だろう。

例:
![フラグメント.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16455/cde48695-14ee-c5ad-83cc-ea04b8fb2240.png)

# [3] vscode等との併用に期待したい、ところだが。
何か月か何年かの後に必要になるかもしれないノウハウ(Tipsを)をスニペットとしてmasscodeは、dropboxやonedriveなど、ネット上のデータ管理ツールを併用することが望まれている。使い方は普通のエディタと同様で、単にデータの保存先をdropboxやonedriveなどの管理下にあるフォルダを指定するのみ。
そこまでシンプルならば、コードのスニペットをvscodeなどと共用したいと思うところだが、現時点では、そのようには作られていない。以下にあるように、スニペットが`Data Base File`なるフォーマットで保存されているためだ。
![結合.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16455/2ca7b466-0630-636d-8dd7-a9fa41768b5c.png)

もちろん、`Data Base File`をフラットなファイルに解凍（？）うんぬんできれば、何とかなるのだろうが、直接的ではない。この作りはスニペットの検索速度とのトレードオフの関係にあると思われるので、masscodeがある程度メジャーになったころに、各種エディタでのプラグインによるインポート/エクスポート対応に期待。


# 感想
masscodeはコーディング向けエディタとの相性はイマイチだけれど、evernote・simplenote・onenoteなどで無理やりコーディング系のTipsをメモるよりは良い解だと思われ。私は個人開発のためのメモ書きで使ってく予定。
javascriptで入力キーを取得(メモ)

## 1.まずはコンソールに出力
```js
// キーが離れたときにコンソールに出力
window.addEventListener("keyup",(e) =>{
    console.log(e.key);  
});
```
キーが離れたとき(`keyup`)コンソールに出力します。

## 2.文字を画面に出力
```html
<body>
    <!--ここに文字を出力させる-->
    <div id="output"></div>
    
    <script>
        // 要素取得
        const output = document.querySelector("#output");
        
        window.addEventListener("keyup",(e) =>{ 
            // keyをHTMLで出力       
            output.innerHTML = e.key;
        });
    </script>    
</body>
```
入力したキーが一文字づつ出力されます。

## 3.入力した文字列を画面出力（配列）
```html
<body>
    <div id="output"></div>
    
    <script>
        const array =[]; //文字格納用の配列
        const output = document.querySelector("#output");
        window.addEventListener("keyup",(e) =>{
            array.push(e.key); //配列の後ろに追加
            output.innerHTML = array;
        });
    </script>    
</body>
```
配列にプッシュ`push()`します。文字がどんどん追加されます。

## 4.入力した文字列を画面出力
```html
<body>
    <div id="output"></div>
    
    <script>
        const array =[];
        const output = document.querySelector("#output");
        window.addEventListener("keyup",(e) =>{
            array.push(e.key);
            const str = array.join(""); //配列を文字列に変換
            output.innerHTML = str;
        });
    </script>    
</body>
```
上の例だと`a,r,r,a,y`みたいに出力されるので、配列の結合に`join()`を使用します。
Laravel　リレーションについて

##laravelでのリレーションについてまとめてみた

###今回はtweeter風のアプリを作成

####ユーザーとツイートの関係(1対多）

```tweet.php
    public function user()
    {
      return $this->belongsTo(User::class);
    }
```
これで、tweetsテーブルのuser_idとusersテーブルのidがリレーションでき、tweetsテーブルから親のusersテーブルへアクセスできる。

####ツイートとコメントの関係（１対多）

```tweet.php
    public function comment()
    {
      return $this->hasMany(Comment::class);
    }
```
```comment.php
    public function tweets()
    {
      return $this->belongsTo(Tweet::class);
    }  
```
これで、親クラスであるtweetsテーブルとcommentsテーブルのリレーションができる。

####ツイートといいねの関係（１体多）

```tweet.php
   public function favorites()
   {
     return $this->hasMany(Favorites::class);
   }
```

```favorite.php
   public function tweets ()
   {
     return $this->belongsTo(Tweet::class);
   }
```
先程と同様のリレーションができる。

####ユーザーとコメントの関係（１体多）

```comment.php
   public function user()
   {
     return $this->belongsTo(User::class);
   }
```

#### ユーザーといいねの関係（1対多）

```favorite.php
   public function user()
   {
     return $this->belongsTo(User::class);
   }
``` 

それぞれ子クラスであるcommentsテーブルとfavoritesテーブルは親クラスであるusersテーブルにアクセスできる。


####フォローフォロワーの関係
これはusersテーブルの同一テーブル内での多対多の関係になる。followersテーブルにユーザー間の関係をまとめる。

```user.php
   
   public function follows()
   {
     return $this->belongsToMany(self::class,'followers','following_id','followed_id');
   }
   
   public function followers()
   {
     return $this->belongsToMany(self::class,'followers','followed_id','following_id');
   }
```

follows()はfollowersテーブルのfollowing_id(フォローしているユーザーid）からfollowed_id(フォローされているユーザーid)にアクセスできる。
千里の道も一歩から。リーダブルコードの道も英語から！

# リーダブルコードの前に考えておきたい！

リーダブルコードとは、できるだけ読みやすいコードを書くためのTipsが集まっています。
リーダブルコードを意識してコードを書きたいけど、まずは何から始めれば……という人向けに、リーダブルコードを意識する前に考えておいてほしいことを記事にしてみました。

## 読みやすいのは？

```A.cpp
int hensu = 10;
//2乗した値を求めるために同じ変数をかける
hensu *= hensu;
std::cout << hensu << std::endl;
```
```B.cpp
int value;
//2乗した値を求めるために同じ変数をかける
value *= value;
std::cout << value << std::endl;
```

全く同じ処理をしている2つのコードを見比べて、どちらが読みやすいと感じますか？
ここで「B」と即答できるのなら、リーダブルコードにすぐ馴染めるのではないかと思います。
単純な処理で全く同じ処理をしているのに、「A」と「B」では読みやすさに雲泥の差があると思いませんか？
何が違うか。**変数名など、自分で名前を決められるものを英語にしているか、日本語にしているか。**これが違うだけです。
リーダブルコードを意識する前に、まずは**変数名や関数名は絶対に英語で命名するように意識するべきです。**
その理由を以下に示しますので、英語以外でコードを書いてしまっていた！というアナタは、これから是非英語でコーディングすることを心がけてみてください。

## 英語で命名するべき2つの大きな理由

### 1. 日本語のローマ字と英語でつづりが同じなのに意味が違う言葉は多い

先の例では非常に単純なコードを示しましたが、コードが長くなってくると**変数名や関数名を日本語にしたコードは非常に読みづらいです。**
それは、**標準関数が英語で並んでいる中に日本語が混ざるとそれらが浮いて見えますし、あとからコードを読んだ時にアルファベットの羅列が英語か日本語かという判断を迫ります。**
というのは、例えばあるゲームのソースコードに以下のコードが入っていたとしたらどうでしょう。

```make.cpp
bool make = false;

// 中略

if (hp < 0) make = true;
```

もし、「コードが英語で統一されている」ということがわかっていれば、これは`hp`が0になった時、何かを生成するフラグを立てるコードであるとわかるでしょう。
しかし、もし他のコードに日本語が混ざっていたらどうなるか。そうなった時、`make`が"負け"を意味する変数である可能性が浮上します。
後からコードを読んだとき、この`make`が何を意味するかを判断しなければならず、コードが読みにくくなる原因になります。
`make`以外にも、**英語と日本語ローマ字のつづりが同じなのに意味が違う言葉は多いです。**
標準関数が一般的に英語で統一されていること、また一般的にコメント以外のソースコードにASCII文字(アルファベット、数字、半角記号)以外を使えないことを考えれば、**英語で統一することが妥当といえます。**

### 2. そのコードを日本語圏以外の人が絶対に読まない保証はない

例えば、もしあなたのコードをオープンソースにしなければならないとしたらどうしますか？
もし、そのコードに日本語圏の人にしか理解できない変数名や関数名があったとしたら。間違いなく日本語圏以外のあなたのコードを読んだ全てのユーザー(英語圏に限らず、日本語圏以外の全てのユーザーも同意見でしょう……)から「変数名が英語じゃなくて読みにくいぞ！」というIssuesや、変数名を英語に直したPull Requestが飛んでくることでしょうし、私なら日本語圏ですが投げます。
……これは極端な例ですが、ある日プロジェクトに英語はわかるが日本語が全くわからない人が加入したなど日本語圏以外の人がコードを読む可能性があるというのは常に考慮しておくべきです。
日本語圏の人が日本語で、英語圏の人が英語でコーディングしていくと1で挙げた問題が発生します。
このように、日本語圏以外の人が絶対に読まないという保証はないというつもりでコーディングすることも考えるべきです。

## 結論、コーディングする上で絶対に日本語は書くな！

この2つの理由だけでも、コードを絶対に英語で書くべきであると思ってくれたのではないかと思います。
英語がわからないからと言って日本語に逃げるのではなく、英語を調べてコーディングに使っていくことで、英語にもなじむことができますし、英語でコーディングする方がメリットは多いように感じています。
この記事があなたのリーダブルコードを意識する第一歩となる記事となってくれれば幸甚の至りでございます。
[論文要約] Deep Neural Networks for YouTube Recommendations

## 論文
https://static.googleusercontent.com/media/research.google.com/ja//pubs/archive/45530.pdf

## どんなもの
Youtubeの動画レコメンデーションに使用されているアルゴリズムの概要を説明している

## 論文のポイント
理想は各userごとに全動画のスコアを付けたいが、動画数があまりに多すぎるので、モデルを2段階に分けたというのがポイント。
１つ目のモデル(Candidate generation model)ではtopN個まで推薦する動画の候補を絞り、その候補の中から2つめのモデル(Ranking model)がスコアをつけて、スコアの高いtopM個の動画を返している(推薦している)。
### Candidate generation model
各user x 各動画 の協調フィルタリングを行う。rating matrixの値はクリック数。次のranking modelでさらにしっかり絞るので、ここでは粗い特徴量のみを使っている。学習のテクニックとして、MatrixFactorizationをDNNで近似している。
#### DNNによるMatrixFactorizationの近似
MatrixFactorizationは[SVDと呼ばれる近似式](https://en.wikipedia.org/wiki/Matrix_factorization_(recommender_systems)#Funk_MF)を利用してuserベクトルとitemベクトルを予測する方法が一般的だが、SVDの部分をDNNに置き換えてuserベクトルとitemベクトルをそれぞれDNNを通して出力している。DNNで近似することによるメリットは

- 一般のMatrixFactorizationにおいてuserの特徴量はitemへのクリック数のみで表現されるが、DNNを介すことで任意の特徴量(年齢, 言語, 性別などのユーザー属性)を利用できる。
- よって、新しいuser(itemへのクリック数がまだないuser)にも対応できる。(cold-start問題の解消)

### Ranking model
Candidate Generation Modleによる協調フィルタリングから選んだN個の候補動画に対して、より細かい学習でスコアを付けている。
各動画に対して具体的に予測するスコアは以下。

```math
score := \frac{視聴時間}{negative\_impression数}
```
negative impressionとは対象の動画が推薦されたがクリックされなかった回数。推薦されてもクリックされない動画のスコアが落ちるように、視聴時間の長い動画のスコアが伸びるように、モデルが設計されている。
最終的にはこのスコアのtopM個が推薦される。
【Docker】コンテナ内のデータベース閲覧(ローカル,EC2)

#はじめに
ローカル環境/本番環境(EC2)の其々でコンテナを起動させた際のデータベース閲覧方法と
環境による閲覧方法の違いがあるのか気になったので、調べてみました。

#環境
- Rails:5.0.7
- MySQL:5.6
- Docker:19.03.8
- EC2(AMI):Amazon Linux AMI

#ソースコード
```:Dockerfile

FROM ruby:2.5.1

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mkdir /app

WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN gem install bundler
RUN bundle install

COPY . /app

RUN mkdir -p tmp/sockets
```

```:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: password
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"

  app:
    build:
      context: .  
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/app
      - public-data:/app/public
      - tmp-data:/app/tmp
      - log-data:/app/log
    depends_on:
      - db
    depends_on:
      - web

  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/app/public
      - tmp-data:/app/tmp
    ports:
      - 80:80
```

#データベース接続
```:ローカル、EC2共通
#起動中のコンテナ名確認
docker-compose ps
#DBコンテナに入る
docker exec -it DBコンテナNAME  bash
#mysqlへ接続(パスワードはdocker-compose.ymlに記載したもの)
mysql -u root -p
Enter password: 
```

```:EC2
#DBコンテナのPORT確認
docker ps
#確認結果(例)
0.0.0.0:3306->3306/tcp
#mysqlへ接続(パスワードはdocker-compose.ymlに記載したもの)
mysql -h 0.0.0.0 -P 3306 -u root -p
Enter password: 
```

#データベースの中身閲覧
```:ターミナル
#データベース接続
mysql -u root -p
#どんなデータベースがあるか
show databases;
#使用したいデータベースに切り替え
use　データベ-ス名;
#テーブル一覧
show tables;
#テーブルの構造確認
describe テーブル名複数系;
#テーブルの中身確認 
select * from テーブル名複数系;
```

#おわりに
今回ローカルとEC2でそれぞれ起動したコンテナにどのような違いがあるのか、データベースの観点から調べてみました。間違ってる点があれば指摘していただけると幸いです。
同じポート3306で起動しているはずが、ローカルではmysql -h 0.0.0.0 -P 3306 -u root -pのコマンドが効かなかったので引き続き調査します。。

#参考URL
https://qiita.com/hayabusa3703/items/9893a53c21ddc3c2403a
https://qiita.com/hot_study_man/items/4e129dacb7c3cab4b568
【試験合格記】AWS 認定 セキュリティ – 専門知識(SCS-C01)

お疲れさまです。
表題の試験に合格したため記録として残したいと思います。

# 結果
合格(913点)

|分野|名称|割合|
|:-----------------|:-------------------|:-------------------|
|1|インシデント対応|12%|
|2|ログと監視|20%|
|3|インフラストラクチャのセキュリティ|26%|
|4|IDおよびアクセス管理|20%|
|5|データ保護|22%|

# 所有資格

| 資格名       |取得年月日 |
|:-----------------|:-------------------|
|AWS Certified Solutions Architect - Associate (SAA)|2018-06-14|
|AWS Certified SysOps Administrator - Associate (SOA)|2018-06-22|
|AWS Certified Developer - Associate (DVA)|2018-06-25|
|AWS Certified Solutions Architect - Professional (SAP)|2018-07-19|
|AWS Certified DevOps Engineer - Professional (DOP)| 2020-02-19| 
|AWS Certified Big Data - Speciality (BDS)| 2020-03-23| 
|AWS Certified Security - Speciality (SCS)| 2020-04-01| 

# 事前知識
厳密なセキュリティ設計を必要とする実務経験はありません。
ただし、IaCでセキュリティレベルを担保するための工夫は日常的に行っているというレベル感です。

# 所感
SAPを取得しているレベルなら下記に列挙する特徴を正しく理解するだけで合格する確率が大きく上がると思います。
一部の問題では自動化のソリューションにも言及されていたのでDOPも取得していると尚やりやすいと思います。
これらの理由からスペシャリティレベルとしては最もとっつきやすい資格ではないでしょうか。

# 受験者に向けたアドバイス
- KMSのキーポリシーやキーローテーションの仕組みを理解する
- CLBとALBの違いを理解する
- IAMはロールやポリシーからクロスアカウント、LDAPなどと効率的に連携する方法を理解する
- S3で出来る暗号化の範囲を理解する
- System Managerの特徴を理解する
- CloudFrontのS3オリジンとカスタムオリジンの違いを理解する

# まとめ
実はこの試験を先月も受けましたが730点で落ちてしまいました。
そのため「リベンジするぞ！」という気持ちで再学習した結果が数字にも表れたと思います。

セキュリティはどんな案件においても蔑ろにして良いことはないので、この試験に合格するために得た知識をうまく実案件に取り入れていきたいと思います。
Googleのロゴをダウンロード  → OCRでテキスト化 → HTML上で表示

# 概要

以下の様に、Google 検索のトップページにあるロゴをテキストに変換し、それをHTML上で表示します。

<img width="327" alt="スクリーンショット 2020-04-02 午後8.25.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/ed32f50e-1bc3-bff0-52c1-498931677da9.png">

↓

<img width="1280" alt="スクリーンショット 2020-04-02 午後8.11.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/258441c6-e8c6-cb6a-e35e-fa0967fda837.png">

# 応用例

画像形式でネット上に公開されている英文の書物などをこの方法でHTMLにまとめ、 Chrome のページ翻訳機能で日本語化して読む、という応用ができます。

# 実行ステップ

1. [Google 検索](https://www.google.com/)のトップページをスクレイピングして Google のロゴ画像のURLを取得します。さらに、画像をダウンロードします。
2. ロゴ画像にOCRをかけてテキスト化します。
3. このテキストをHTML上で表示します。

# 事前にライブラリをインストール

```bash:bash
# ステップ 1 用
pip install beautifulsoup4

# ステップ 2 用
brew install tesseract
pip install pyocr

# ステップ 3 用
pip install jinja2
```

# 実行

**ステップ1：ロゴ画像のダウンロード**

```python:python
import requests
from bs4 import BeautifulSoup

# html 取得
url = 'https://www.google.com'
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')

# 画像を抽出
img = soup.find('img', {'id': 'hplogo'})

# 画像のURLを作成
img_url = 'https://www.google.com' + img['src']

# 画像をダウンロード
r = requests.get(img_url)

# 画像を保存
with open('hplogo.jpg' ,'wb') as file:
    file.write(r.content)
```

**ステップ2：OCRでロゴ画像をテキスト化**

```python:python
from PIL import Image
import pyocr
import pyocr.builders

# 事前設定 1
tools = pyocr.get_available_tools()
tool = tools[0]

# 事前設定 2
builder = pyocr.builders.TextBuilder()

# 画像をロード
img = Image.open('hplogo.jpg')

# OCRを実行
result = tool.image_to_string(img, builder=builder)
```

**ステップ3：テキストをHTML上で表示**

```python:python
from jinja2 import Template

# view を生成
html = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <title>The Farther Reaches Of Human Nature</title>
</head>
<body>

    <h1>{{ result }}</h1>

</body>
</html>
'''
template = Template(html)
data = { 'result': result }
view = template.render(data)

# 保存
with open('hplogo.html', 'w', encoding='utf-8') as f:
    f.write(view)
```

生成される``hplogo.html``をブラウザで開くと次のように「Google」というテキストが表示されるはずです。（画像を再掲）

<img width="1280" alt="スクリーンショット 2020-04-02 午後8.11.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/258441c6-e8c6-cb6a-e35e-fa0967fda837.png">

# 参考
[10分で理解する Beautiful Soup - Qiita](https://qiita.com/Chanmoro/items/db51658b073acddea4ac)
[Pythonで画像スクレイピングをしよう - Qiita](https://qiita.com/neet-AI/items/98d4194872ee4f53e3b4)
[PythonでOCRを実行する方法 | ガンマソフト株式会社](https://gammasoft.jp/blog/ocr-by-python/)
[Pythonで久しぶりにHTMLを出力したくなったのでテンプレートについて調べる - Qiita](https://qiita.com/mima_ita/items/5405109b3b9e2db42332)
情報理論について (E資格対策)

今回は情報理論について。

目次
[機械学習の情報](#機械学習の情報)
[エントロピー（平均情報量）](#エントロピー（平均情報量）)
[KLダイバージェンス](#KLダイバージェンス)


#機械学習における情報

数式で表すと情報$I(x)$は

$$
I(x)=-log(x)
$$

と書きます。**起こりやすい事象ほど情報は少なく、起こりにくいほど情報が多い**と覚えてください。


<img width="569" alt="Ix.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/b4676bfd-6e63-04f5-4aef-eb30bae569bc.png">


グラフにするとこう。

logの底によって単位が変わり

・e:ナット単位
・2:ビット（シャノン）単位

です。



#エントロピー（平均情報量）
情報源がどれくらい情報を出しているかの尺度です。
出している情報があいまいなほどエントロピーが高く、確率が定まるほどエントロピーが下がります。

$$
H=-\sum_x P(x)logP(x)
$$

式を見てても実感がわかないと思うので例題を解いて確認しましょう。

##例題
コインAは表と裏が同じ確率で出ており、コインBは表は$\frac{1}{4}$、裏は$\frac{3}{4}$で出る。
コインAのエントロピー$H_A$、コインBのエントロピー$H_B$を求めよ、単位はビット単位を使い、$log_23=1.5$とする。

まずつづいて$H_A$から

```math
\begin{align}
H_A &=-\sum_x P(x)log_2P(x)\\
&=-\frac{1}{2}log_2\frac{1}{2}-\frac{1}{2}log_2\frac{1}{2}\\
&=-log_2\frac{1}{2}\\
&=1
\end{align}
```
つづいて$H_B$

```math
\begin{align}
H_B &=-\sum_x P(x)log_2P(x)\\
&=-\frac{1}{4}log_2\frac{1}{4}-\frac{3}{4}log_2\frac{3}{4}\\
&=\frac{1}{2}-\frac{3}{4}(log_23-log_24)\\
&=\frac{1}{2}-\frac{3}{4}(-0.5)\\
&=0.5+0.375\\
&=0.875
\end{align}
```

**事象（コインの表裏など）が等確率で出現しているとき、エントロピーは最大となります。**




#KLダイバージェンス
2つの確率分布の差を表しています。
T=SNE、VMAPがこの手法のもととなっています。


```math
\begin{align}
D_{KL}(P||Q)&=-\sum_x P(x)log \frac{P(x)}{Q(x)}\\
&=-\sum_x P(x)(logP(x)-logQ(x))
\end{align}
```

つまり
**$P(x),Q(x)$が完全に一致していたら0になり、分布が異なるほど値が大きくなります。**


ここまで。
【今日のアブストラクト】Deep Double Descent: Where Bigger Models and More Data Hurt【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.


翻訳元
[Deep Double Descent: Where Bigger Models and More Data Hurt](https://arxiv.org/abs/1912.02292)

[今日のアブストラクトまとめ](https://qiita.com/tomato_/items/c62cf80e5ea4a73a2197)

前: 無し
次: [【1 INTRODUCTION】](https://qiita.com/tomato_/items/395d4a9a5021b66d86b7)

# Abstract

### 訳文

現代の様々な深層学習課題において, モデルサイズを大きくすると, まずパフォーマンスが悪くなり, 次に良くなるという "二重下降 (double-descent)" 現象が起こることを我々は示す. さらに, double descent はモデルサイズの関数としてだけでなく, 訓練エポック数の関数としても起こることを示す. 我々が effective model complexity と呼ぶ新しい複雑度の尺度を定義し, この尺度に関して一般化された double descent を仮定することで, 上記の現象を統一する. さらに, モデル複雑度の概念は, 訓練サンプル数を増加させる (4倍にしても) ことが実際にテスト性能に悪影響を与える特定の領域を特定することを可能にする.


### 原文

We show that a variety of modern deep learning tasks exhibit a "double-descent" phenomenon where, as we increase model size, performance first gets worse and then gets better. Moreover, we show that double descent occurs not just as a function of model size, but also as a function of the number of training epochs. We unify the above phenomena by defining a new complexity measure we call the effective model complexity and conjecture a generalized double descent with respect to this measure. Furthermore, our notion of model complexity allows us to identify certain regimes where increasing (even quadrupling) the number of train samples actually hurts test performance.
コロナ対策エンジニア～ みんなでCOVID-19ウイルスと戦おう～（2020年4月）

#活動内容・目的の説明
今日は[Connpass](https://connpass.com/)で開催されていた、
[「コロナ対策エンジニアとして行っていく活動内容・目的の説明」](https://youtu.be/MpAs-DeMCEs)
という[オンラインセミナー](https://power-covid19.connpass.com/event/172147/)に参加しました。
マイクロソフト社の吉田大貴さんが旗頭となって開催されました。

日本全国のエンジニアが見返りを求めずに
COVID-19対策に貢献しよう！！というのがグループ活動の趣旨になります。

エンジニアと言っても高いスキルがある人じゃなくても、
例えばExcelのマクロが作れるだけの方でも、
何かできることがあるんじゃないか、
みんなで自分のできることを実施していこうという内容です。

私も日々、システムエンジニアとして、
コロナ対策に何ができるか考える毎日です。
多くの人の命が失われる中で、例えばリモートワークを活用して、
少しでも感染のリスクを減らすことはできないか、模索する日々です。
そんな中で、この活動に出会いました。

#公式HPと今後の活動について
以下が公式HPとなります。
[「コロナウイルス対策に貢献するエンジニアの集い」](https://www.covid19engr.com/)

主催様により、まずは以下の[無償オンラインセミナー](https://power-covid19.connpass.com/)が開催されます。

■2020年4月08日（水） 12:15 - 12:45
　[Microsoft Teamsを使った在宅勤務Tips](https://power-covid19.connpass.com/event/172150/)

■2020年4月10日（金） 12:15 - 12:45
　[ZOOMを使ったリモートワーク技](https://power-covid19.connpass.com/event/172165/)

■2020年4月13日（月） 12:15 - 12:45
　[Microsoft Power Appsでリモート出退勤管理アプリを作る](https://power-covid19.connpass.com/event/172167/)

■2020年4月15日（水） 12:15 - 12:45
 [Microsoft Power Automateで健康状態報告フローを作る](https://power-covid19.connpass.com/event/172166/)

ここでツールの活用術を学んで、
その人たちが他の人たちに伝えれば、リモートワークを広げることができる、
そういった活動になります。

私の会社ではリモートワークに対応していますが、
インフラ的な準備が整わず、対応できていない組織も多々あると聞いています。
私もまずは、参加してリモートワークの効率的な実施方法を身につけ、
そういった人たちに伝えていければと思っています。
営利ではなく、助け合いの精神こそ必要な時だと感じています。

もし、こういった活動に賛同される方がいるのなら、
是非、興味を持って参加してください！！

最初の説明会時は277人の参加者でしたが、
この活動が全国のエンジニアに広がっていってほしいと願っています。

#COVID-19情報(内閣官房）
なお、コロナ(COVID-19)自体の情報は以下の内閣官房サイトに掲載されています。
他の方への感染リスクがあり、国民全員で抑え込む必要がある病気です。
「知らないは罪」ですので、こちらにも関心を持ってもらえると嬉しいです。

[「新型コロナウイルス感染症の対応について」](https://www.cas.go.jp/jp/influenza/novel_coronavirus.html)

　　　　　　　　　　　　　　　　以　　　上
初めてのFirebaseを触ってみる(導入編)

#はじめに
おはようございます。こんにちは。こんばんは。
今回は初めてFirebaseを触ってみるということで、Firebaseとはなんぞや？
とかFirebaseってどうやって使うの？と行ったことをまとめていきたいと思います。
#Firebaseとは？
**Firebaseとは、Googleが提供している、すばやく高品質のモバイルアプリやWebアプリケーションを開発することができるプラットフォームです。**

Firebaseを使うことで、開発者はアプリケーションの開発に専念でき、バックエンドで動くサービスを作成する必要も管理する必要もありません。
ここでいうバックエンドとは、サービスの内、見えないところでデータの処理や保存などを行う要素のことです。

**Firebaseは、BaaS（Backend as a service）の1つです。**
サービスの早期リリースという要件が求められたときに、サーバーレスアーキテクチャが注目され、 BaaSというクラウドサービスが登場しました。
モバイル向けBaaSということで、MBaaSとよばれることもあります。

BaaSを使うことにより、アプリ単体がモバイル端末上で動作するだけでなく、外部からの働きかけを行うことで、アプリがそれに応じた動作を行うことができるようになります。
#こう行った方々にオススメ

- **「制作したポートフォリオをできるだけ簡単に公開したい」**
- **「Vue.jsやReactを使ってWebサービスを作りたいけれど、バックエンドは苦手なので避けたい」**
- **「フロントエンドの勉強で何か作りたいけれど、バックエンドの実装に時間を掛けたくない」**

#Firebaseを導入する
今回は例としてNuxt.jsを使用しての解説です。
<font color="red">**※Nuxt.jsのプロジェクトは作成済みとする。**</font>

###①Firebaseにログイン
[https://firebase.google.com/](https://firebase.google.com/)にアクセスする。
###②コンソールへ移動
<img width="1479" alt="Banners_and_Alerts_と_Firebase.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116696/25be7757-adaa-d485-e9a1-3674104c9be9.png">

###③プロジェクト追加をクリックする
<img width="1430" alt="Banners_and_Alerts_と_Firebase_console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116696/6687e7db-7079-60aa-6e45-7fe05a1ccf20.png">

###④プロジェクト名などを入力し、最終「プロジェクト作成」ボタンをクリック
しばらく待機で終了。
###⑤アプリに Firebase を追加して利用を開始しましょう
下記ボタンをクリックし、アプリのニックネーム等を入力する
<img width="1428" alt="Banners_and_Alerts_と_test_–_test_–_Firebase_console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116696/73651235-3f56-8853-d04f-967c93ae7110.png">

すると必要条件が出てくるので
**plagins/firebase.js**を作成し、準備完了。

```js:plagins/firebase.js

import firebase from 'firebase'

if (!firebase.apps.length) {
  firebase.initializeApp({
    ///この間を自分のアプリ情報に変える
    apiKey: "**************************",
    authDomain: "*********************",
    databaseURL: "******************",
    projectId: "*************",
    storageBucket: "********************",
    messagingSenderId: "*****************",
    appId: "*******************",
    measurementId: "*************************"
    //-------------------------------
  })
}

export default firebase
```
以上。
次回からはfirebaseが提供している機能の紹介を5回ぐらいに分け解説していきます。

<font color="red">※今後もFirebaseはnuxt.jsを使っての解説となります。</font>
最後まで読んでいただきありがとうございました。

[Twitter](https://twitter.com/watataku9)やってます。良ければチェックして見てください。:point_up::point_up::point_up:
Azure AppServiceに独自ドメイン＋無料証明書でSSL対応

公式ドキュメントでほぼ事足りるのだが、ちょっとあやふやなところがあったりした。
https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-tutorial-custom-domain
https://docs.microsoft.com/ja-jp/azure/app-service/manage-custom-dns-migrate-domain
https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-bindings
https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate#create-a-free-certificate-preview

### Appserviceのプラン
ドキュメントの通り、運用レベルのプランが「必須」
※無料プランでは独自ドメインでのSSL対応は不可です。

### 独自ドメインの割当
まずはここから。
https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-tutorial-custom-domain#map-your-domain
このへんですね。
今回はCNAMEで設定した。
上記の
https://docs.microsoft.com/ja-jp/azure/app-service/manage-custom-dns-migrate-domain
もCNAME設定について確認しておく。（すでに使っているドメインなら）

### 証明書の作成
https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate#create-a-free-certificate-preview
こちら。
作成しただけでは有効になりません。
次にバインドさせる必要あり。（ドキュメントにもありますが）

### バインド
https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-bindings#create-binding
ここで独自ドメインにSSLをバインドさせる。
これが終われば、

![スクリーンショット 2020-04-02 19.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120789/80138ee5-e1b3-47c3-3454-8e36641d0d96.png)



のように独自ドメインが「セキュア」となっているはず。

これでブラウザなどからアクセスしてみて反映されているか確認。
Azureの情報がまだネット上に多くなくて手こずった…
再度やればすぐできることなんですけどね。
環境変数管理の方法メモ

# 概要

本記事では環境変数をディレクトリごとに管理できる`direnv`について解説し、複数台マシンを持っていたりマシンの交換の際にその環境変数を共有する方法を説明します。

# `direnv`を使うメリット

- `.bashrc`や`.zshrc`がスッキリする
- 複数のプロジェクトで環境変数の名前を出し分けられる
- 指定のディレクトリ以下でしか環境変数が定義されないため、`export -l`が綺麗になる

# 使い方

## 背景（問題）

仕事用PCの環境構築をしており、mysqlサーバの構築に`vagrant`と`docker`を使った方法を採用しました。

> DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる
> https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484#docker-for-mac%E3%81%B8%E3%81%AEmutagen%E3%81%AE%E9%81%A9%E7%94%A8

この方法を採用してmysqlにアクセスする場合、`http://192.168.50.10:3306`にアクセスすることになります。
プロジェクトのデータベースの設定ファイルには

```js

development: {
...

  host: process.env.DB_HOSTNAME || '127.0.0.1',
...
},
test: {
...
  host: process.env.TEST_DB_HOSTNAME || '127.0.0.1',
...
}

```

と書いてあり、環境は合計4つあったため、最低4つの環境変数を設定しなければいけない状況になりました。
もし、他の設定もデフォルト値から変更しなければ行けない場合、変更する設定×4の環境変数を設定する必要があり、このままでは`.zshrc`や`.zshenv`がごちゃついてしまいます。


## 解決策

`direnv`で管理すれば簡単です。

まずは、`brew`経由でインストールします。他の方法でも問題ありません。

```shell

brew install direnv
```

使い方は簡単で、ディレクトリに`.envrc`ファイルを置き、

```shell:.envrc
export YOUR_ENV=your_env_xxx
```

このように書いて、

```shell
derenv allow
```

その後、shellを起動し直すと`.envrc`を置いたディレクトリ配下にのみ環境変数が出来ようされます。

## 応用

環境変数をディレクトリで出し分けるのを各マシンで書いたり、買い替えたあとにやり直すのは面倒だと思います。
そこで、githubのプライベートリポジトリに登録して簡単に設定できるようにしてしまいましょう！

僕の場合はホームディレクトリの`.zshrc`, `.tmux.conf`等を管理しているリポジトリで`.direnv`ディレクトリも管理するようにしました。

`$HOME/.direnv`の中はこのようにします。

```shell

.direnv
├── home
└── project1
└── project2
```

`home`にはホームディレクトリ以下で通したいパスを、`project1`, `project2`にはそれぞれのプロジェクトでのみ通したいパスを定義します。

今回の僕のパターンだと、

```shell:home
export DOCKER=192.168.50.10
```

```shell:project1
DB_HOSTNAME=${DOCKER}
TEST_DB_HOSTNAME=${DOCKER}
```

のように作ります。その後、

```shell
# .envrcという名前で適用したいディレクトリへのシンボリックリンクを作成
ln -s $HOME/.direnv/home $HOME/.envrc
ln -s $HOME/.direnv/project1 $HOME/your/project1/directory/.envrc
# direnvを適用
direnv allow
# shellを再起動
exec $SHELL -l
```

これでどのPCでも同じ環境変数を使えるようになりました！

もし同じディレクトリ構成で作るなら`Makefile`に上のコードを書いてあげてgithubにあげておけば更に楽になると思います！
rails whereとfind、find_byの違い

こんにちわ。
未経験から独学でwebベンチャーに入社して3ヶ月のバスケンです。

##ActiveRecord の where句でオブジェクトを出力した後の挙動がおかしい、、

ruby on railsにて
オブジェクト選択でfindではなくwhereを使う必要があったため
whereを利用して出力したオブジェクトでインスタンス変数を作成したら、
オブジェクトの値が今までどうり取り出せなくなりました。。


##何故（Why？？）
**find** と **where** の違い

find：オブジェクトを返す
where：ActiveRecord_Relationを返す

※ActiveRecord_Relationに関してはまとめたものを後日投稿します🔥

##対処
オブジェクトが単数の場合は、最後に「.first」を記述すると
findで出力した時と同じように扱うことができます。

（例）
object = Object.where(id: 1).first
MySQL(MariaDB) で データなしでデータベースコピー

「テストデータベース」

を

「テスト2」

にテーブル構造だけをコピーしたい。

# 環境

- OS: Ubuntu 18.04 LTS
- MariaDB (mysql Ver 15.1 Distrib 10.1.44-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2)




# データ取得


root でシェルから作業する。

```

# mysqldump -u root -p --no-data テストデータベース > db.skeleton

```

通常の mysqldump の使い方に --no-data をつけるだけ

# 新しいデータベース作る

mysql に root でログインして

```

# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 521
Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database テスト2;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> exit
Bye
```
# 読み込み

ルートでシェルから

```

# mysql -u root -p テスト2 < db.skeleton

```

# ユーザ権限設定

「MariaDB on Ubuntu18.04 LTS」
https://qiita.com/nanbuwks/items/c98c51744bd0f72a7087
のように、 webdb ユーザに権限を設定していたので同様に設定する必要がある。

mysql に root でログインして、

```

# mysql -u root -p

```

```

MariaDB [(none)]> GRANT ALL ON テスト2.* TO 'webdb'@'localhost';
Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> GRANT ALL ON テスト2.* TO webdb@'%';
Query OK, 0 rows affected (0.00 sec)
```

これでOK
Blender2.82で液体シュミレーションについて

## はじめに 
Blender2.82が公開後、液体シュミレーションをしようとすると、
項目が変わっていて混乱したので調べました。

## 液体を流すだけならこうすればいい！
#####配置
・モンキー（なんでもいい）
・正方形（モンキーを囲むように配置）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/ffbbc5f0-fcb0-178b-51e9-64b12f7f2279.png" width=50%>

#####モンキーの設定
「物理演算プロパティ」→「液体」→「タイプ」をフローに設定
「フロータイプ」を液体、フローの挙動をジオメトリに設定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/d04217f0-29d6-5ed5-51cd-3da567946926.png" width=20%>
#####正方形の設定
「物理演算プロパティ」→「液体」→「タイプ」を”ドメイン”に設定
正方形の設定タブ→データをベイク、待つ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/873b5d4d-9d8c-81be-f4b4-45f5f6616357.png" width=20%>
正方形のメッシュタブ→メッシュをベイク、待つ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/d9c367de-a6dd-6efb-ff36-53537a5bd5c5.png" width=20%>
アニメーション再生で液体シュミレーションが可能
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/bd632337-fefc-5c5d-2d0c-1f6616e4e980.png" width=50%>

####ベイクに時間を短縮する
######初期設定ではベイクに時間がかかりすぎるので、解像度をいじります
分割の解像度を24に設定する
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/53966007-1420-5c74-2f06-8df138773aeb.png)
分割の解像度を24~60とした時の変化
![13-min.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/9475d8ed-8b3b-9be3-2e6c-815dba5392bf.png)
まぁ当たり前に細かく滑らかになりますね。
## おわりに
テスト時は解像度を下げて、本番だけ解像度を上げてベイクという流れが一般的だと思います。
また、別のシュミレーションもいじったら記事にしたいと思います。