OmniAICreator/Qiita-1.07M huggingface dataset:
Windows ターミナルをととのえる

# 🫣TL;DR
開発環境のセッティングは基本的に最初の一回しかしないために忘れやすい割には、後々の開発の快適さに関わる重要な手順のため備忘録として残しておきます。

# 🎨🔧カスタマイズいろいろ
## テーマの設定
以下のサイトで公開されているテーマを見ることができます。

https://windowsterminalthemes.dev/

気になるものがあれば「Get theme」で設定をクリップボードにコピーできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/16c25a51-ecff-faf8-2007-0cc36803d447.png)

コピーした内容を Windows Terminal の settings.json に追記することで使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/5bf8decc-148b-104a-a976-5a2ea10d2429.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/f042839f-40f4-6c9b-3413-8eb3aaf63ddd.png)

あとは [既定値] > [外観] > [配色] でテーマを選択するだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/3ddff239-e0f3-59be-b697-5587a979bbab.png)


## 背景の透過
透過させることは見た目がスマートになるのに加え、ブラウザなどでテキストを読みながらのコマンドを入力することができるので便利です。

こちらも [既定値] > [外観] > [透明度] から設定できます。 「アクリル素材を有効にする」を切ることで背景の文字もよめるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/df027be4-32bf-c768-4aff-41884468baf7.png)


## すべてのデスクトップで表示

仮想デスクトップを使う人も多いと思いますが、このとき通常は仮想デスクトップごとにアプリのプロセスも分かれています。これをすべての仮想デスクトップで共有するようにしてどこからでも同じウィンドウを使用できるようにします。

仮想デスクトップの一覧を表示しながらアプリを右クリックすると、「このウィンドウをすべてのデスクトップに表示する」オプションが選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/30516a1d-d374-9fff-8531-4c2cbe96f505.png)

## ショートカットの設定

ショートカットもいくつか覚えておくと、効率が非常に上がります。以下のものはデフォルトで設定されていますが、自分の使いやすいキーセットに変えるなどすることを推奨します。（参考で私の設定も書いておきます）

- タブの新規作成（`Ctrl + t`）
- タブの削除（`Ctrl + w`）
- ウィンドウの最大化（`Ctrl + m`）

また、以下はデフォルトでは設定されていないものの追加で設定できます。こちらも設定することで非常に便利になります。
- ターミナルの終了（`Ctrl + q`）
- ウィンドウの表示/非表示（~~`Ctrl + space`~~ -> `Ctrl + Shift + space`にしました...）

また、ここまでしたらどうせなら Windows ターミナルの起動もショートカットでやってしまいましょう。Windows はタスクバーのアプリを `Win + {配置の番号}`　で起動できるので、例えば左端に置いたら `Win + 1` でスマートに起動できます。

## プロンプトの設定
Oh my Posh の導入でプロンプトを zsh ライクにできます。

https://ohmyposh.dev/

公式のセットアップ手順に従えば問題なく設定できます。

https://learn.microsoft.com/ja-jp/windows/terminal/tutorials/custom-prompt-setup

（私はテーマを `stelbent-compact.minimal` にしてみました。）

# まとめ
※ あくまで個人の好みです。
ラストのまほう　第24話『マルチプレイヤーゲーム化を試してみる』

WASM-4には最大4人同時プレイのオンラインマルチプレイヤーゲームを作る機能があります。しかも、この機能は**とても簡単に使える**ようです。今回のゲームは基本的にはシングルプレイヤーのゲームなのですが、この機能がどんなものなのか、試しに使ってみたいと思います。

ただし、まだ試験的な段階のようで、今後仕様の変更があったり、バグがあったりするかも、とドキュメントには書かれているので注意です。

# ネットプレイの有効化

**WASM-4で作ったゲームは、特に何の設定もせずにいきなりマルチプレイヤーゲームになります**。エンターキーを押してシステムメニューを開き、"Copy Netplay URL"を選択するとクリップボードに新規参加用のURLがコピーされます。あとはこのURLを何らかの方法で相手に送り、ブラウザで開いてもらうだけです。これだけで、ホストとゲストの両方に同じ画面が表示され、ホストの操作が相手のプレイ画面にも反映されているのが確認できるはずです。

しかも、このネットプレイは`w4 watch`で起動する開発サーバーでも使うことができます。これはどうやら、その開発中のゲームのバイナリ自体をその場でネットワーク経由で相手に送信し、そのまま相手のデバイスで実行しているようです。なにしろカートリッジは最大でも64キロバイトしかないので、瞬時に相手に共有できてしまうわけです。便利！


# ネットプレイでの入力の取り扱い

ネットプレイでは最大４名までが参加でき、それぞれのプレイヤーの入力は単純にゲームパッド1〜ゲームパッド４への入力として扱われます。このため、ネットプレイとはいっても、コーディングとしてはひとつのデバイスに４つゲームパッドを繋いで実行する場合とまったく同じで、ゲームパッド1〜ゲームパッド４の入力をそれぞれプレイヤーキャラクター１〜プレイヤーキャラクター４への入力としてそのまま処理するだけです。

# 自身の識別

ただし、現在の私のゲームではホスト側プレイヤーが画面中心に表示されるため、ゲスト側では自分のキャラクターが画面の中心になっていません。これでは自分のキャラクターをうまく操作できないので、自分が何番目のプレイヤーなのかを識別して、それに応じて画面を描画する位置を変える必要があります。

筆者が試している時点では、Rustの定義ファイルにはネットプレイに関する情報が入っているアドレスへのポインタが定義されていませんでした。ネットプレイの情報は`0x0020`に入っているので、これを 　`NETPLAY`という変数のポインタとして定義しておきます。

```rust 
pub const NETPLAY: *const u8 = 0x0020 as *const u8;
```

ネットプレイが有効になっているかは、この1バイトの下から3ビットめの値でわかるようになっています。

```rust
pub fn is_netplay_active() -> bool {
    unsafe { *NETPLAY & 0b100 != 0 }
}
```

そして、このデバイスで実行されているのが何番目のプレイヤーなのかのインデックスが、この下位2ビットに入っています。自分が何番目のプレイヤーなのかは、次のようにすれば調べることができます。

```rust
pub fn get_my_player_index() -> u8 {
    unsafe {
        if is_netplay_active() {
            *NETPLAY & 0b011
        } else {
            0
        }
    }
}
```

あとは、このデバイスが何番目のプレイヤーなのかに応じて画面を描画すればOKです。今回私が作っているゲームでは、自分の操作キャラクターが画面の中心に来るように、このプレイヤーのインデックスに応じてカメラの位置だけが変わるようになっています。

ちなみに、現在何人のプレイヤーが接続しているかの情報は直接にはとれないようです。すべてのゲームパッドの入力を監視して、何らかの入力があったらそのプレイヤーが参加しているとみなせばよさそうです。

# 参考文献

- https://wasm4.org/docs/guides/multiplayer


# 次回予告

次回はアドベントカレンダーでは最終回です。WASM-4が今後どのような方向に開発が進むのか占ってみます。

https://qiita.com/hiruberuto/items/8e908145d931cfd1ac13
【サーバ構築】nginxでリバースプロキシを実装する

## はじめに
nginxでリバースプロキシを実装してみました。
http:[ipアドレス]/ ⇒ リバースプロキシサーバ兼webサーバ
http:[ipアドレス]/web2 ⇒webサーバ2

### 設定ファイル

```yml:docker-compose.yml
version: "3"
services:
 ngweb1:
  image: nginx:1.21.6
  ports:
   - 80:80
  volumes:
   - ./nginx/html:/usr/share/nginx/html
   - ./nginx/conf.d:/etc/nginx/conf.d

 ngweb2:
  image: nginx:1.21.6
  ports:
   - 81:80
  volumes:
   - ./nginx/html:/usr/share/nginx/html
```
「/」の場合は、ngweb1のコンテナで、「/ngweb2/」の場合はngweb2のコンテナに繋げてくれます。

```conf:server.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /web2/ {
        proxy_pass   http://ngweb2/;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```
コンテナ間はコンテナのサービス名で通信することができます。
注意していただきたい点ですが、「proxy_pass   http://ngweb2/」の最後のスラッシュ「/」がないとhttpステータス404になります。というのも最後のスラッシュ（trailing slash）が無い場合は、ngweb1のコンテナの/usr/share/nginx/html/web2のディレクトリに対してindex.htmlを探しにいきます。

### ログ
なぜか、webサーバのアクセスログは空なので、確認したい場合は、
```docker-compose logs サービス名```でログ見れます。

## 最後に
port番号を意識せずに、webサーバを区別できるので便利ですね。
trailing slashについては勉強になりました。
HTML&CSS Day2 :基本的なHTMLを使う 

# １.概要
参考書のChapter３にてHTMLの基本的な使い方を学習。
サイトのヘッダーとフッターを作成。

# 2.目次
- head要素
- body要素
    - header要素
    - footer要素
- 相対パス
- 感想

# 3.head要素
文書に関する基本情報。ウェブブラウザや検索エンジンが文書の概要を把握するために参照する。

**●必須**
1.文字コード
```html:
    <meta charset="utf-8">
```


2.タイトル(サイトのタブに表記される)
```html:
    <title>AAA website</title>    
```

**●任意**
1.ページの概要(↓xxx部分に概要を記載。たくさんページ作ったら必須だろうな〜）
```html:
    <meta name="description" content="XXXXXXXXX"> 
```

**●スマートフォンの表示用**
1.表示領域　
```html:
    <meta name="viewport" content="width=device-width">
```

2.スマホメニューボタン(JavaScriptを埋め込む)
```html:   
    <script src="./js/toggler-menu.js"></script>
```

# 4.body要素
Webページのコンテンツや本文。

### 4-1.header要素
```html:
    <header class="header">
    </header>
```


以下をコーディング
・ロゴ指定。
　イメージロゴにはトップページへのリンクを張る。クラス指定も。
```html:
     <a class="header-logo" href="./index.html">
        <img src="./images/common/logo-header.png" alt="aaa">
      </a>
```

・スマホ用のメニューボタンを設定。
```html:
    <button class="toggle-menu-button"></button>
```

・ナビゲーションエリアを設定
```html:
    <div class="header-site-menu">
        <nav class="site-menu">
            <ul>
                <li><a href="./concept.html">CONCEPT</a></li>
                <li><a href="./menu.html">MENU</a></li>
                <li><a href="./shop.html">SHOP</a></li>
                <li><a href="./access.html">ACCESS</a></li>
            </ul>
        </nav>
    </div>
```

こつ：項目単位に、CSSやJavaScriptで識別できるよう、class指定をする。


### 4-2.footer要素
```html:
    <footer class="footer"></footer>
```

以下をコーディング
・ナビゲーションエリアを設定。
headerをコピペ

・ロゴ指定。
headerと同様。headerと記載している部分をfooterへ変更

・電話番号、営業時間、コピーライトを記述

# 5.相対パス
同じウェブサイト内へリンクを張るときに使用。
・同じディレクトリへのパスは`./`の後ろにファイル名を記述
・上の階層へのパスは`../`を記述。２階層上であれば`../../`のように階層の数だけ繰り返す
・下の階層へのパスは、ディレクトリ名の後ろに`/`を記述

# 6.感想
本日は５４行しか記述していないのにヘロヘロ。今日記載した部分はサイトベースで見た場合は1秒しかかからないのに、記述する時間は長い……
htmlでWeb作成するには根気が必要。
Slackとカレンダーを連携して生産性が爆上げ

私は Slack に情報を集めることを徹底しています。[Gmail自動転送が禁止なら GAS で転送しようじゃないか](https://qiita.com/MxShun/private/9eed788ee4cf28cf7e99) 内でメールを Slack に転送する試みもそのひとつです。

Outlook もしくは Google カレンダーを Slack と連携すると、控えめに言って生産性が爆上がりするので今回はその方法を書きます。

### 連携方法
それぞれ公式に手順書が用意されています。

- Outlook：[Microsoft Outlook Calendar と Slack を連係させる](https://slack.com/intl/ja-jp/help/articles/360020134853-Microsoft-Outlook-Calendar-%E3%81%A8-Slack-%E3%82%92%E9%80%A3%E4%BF%82%E3%81%95%E3%81%9B%E3%82%8B)
- Google カレンダー：[Google Calendar と Slack を連携させる](https://slack.com/intl/ja-jp/help/articles/206329808-Google-Calendar-%E3%81%A8-Slack-%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B)

仮にその他カレンダーサービスや独自サービスを利用している場合には、Outlook や Google カレンダーにカレンダー情報を同期して連携させるのがよいかと思います。
Google カレンダーの例ですが、[他のユーザーの Google カレンダーに登録する](https://support.google.com/calendar/answer/37100?hl=ja&co=GENIE.Platform%3DDesktop) を参考にしてください。

### なにがいいのか
大きくは下記があります。

1. カレンダーアプリケーションを別にバックグラウンド起動しておく必要がない
2. Slack から各種オンラインミーティングルームに参加できる
VirtualBox 環境の移設

マシンが調子悪くなったので、一度 VirtualBox のデータをバックアップして、新しく作成した環境に戻すことにしました。

問題は、スナップショットを全部戻すことです。これが、なかなかできなくてどうしたらできるのかを探りました。

結論から言うと、ディレクトリ（'VirtualBox VMs'）と、.config/VirtualBox 配下をコピーすればよいことが分かりました。
ffmpeg で動画の傾き修正 (perspective フィルタ)

# やりたいこと

例えば、以下のように画面を直撮りしたとして、

![img-0-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/c9ccea35-1093-b57f-7cb1-954ae5dd0a03.jpeg)

それを以下のように修正します。

![img-0-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/f5cc092f-32c5-c72c-17ba-a0f119548430.jpeg)

これは ffmpeg に標準で搭載されているビデオフィルタ `perspective` `scale` で実現できます。

:::note warn
これから紹介する方法は、カメラと被写体の角度がずっと固定であることが前提となります。映像が激しく動いている場合には対応できません。
:::

# 用意するもの

* ffmpeg
  * ここでは GUI でなく CUI で解説
* 動画のスナップショット (静止画) を保存できるもの
  * ここでは VLC メディアプレーヤーを使用
* ペイントソフト
  * Windows Paint と同等かそれ以上の水準で十分

# 手順

解像度 1600x1200 (4:3) の動画から、被写体のディスプレイの映像を切り取る、というのを例とします。

## 1. 動画のスナップショットを撮る

1. VLC メディアプレーヤーで動画を再生
2. 画面上部のメニューバーの「ビデオ > スナップショットを撮る」を選択

![img-1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/31394737-317a-7f6b-9dc8-bc422e8a7c84.jpeg)

取得されたスナップショットは、(Linux Mint の場合) デフォルトでホームディレクトリのピクチャディレクトリに保存されます。

:::note warn
動画プレイヤーのスクリーンショットでは、正確な解像度にならない可能性があるので注意
:::

## 2. 被写体の座標を取得する

1. 得られたスナップショットを任意のペイントソフトで開く
2. まっすぐ正面にしたい被写体の角 4点の座標を調べる

![img-2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/26f1b9e0-db54-40b3-a121-532d921591cf.jpeg)

4点について、それぞれ上画像に示されているように `x1` `y1` `x2` `y2` ... と呼ぶことにします。

:::note
ペイントソフトに限らず、静止画上の任意の点の座標を取得できるのであれば、何のソフトでも OK。ただ、最も身近で手軽なのはペイントソフトでしょう。
:::

## 3. 出力解像度を決める

元動画が 1600x1200 (4:3) に対し、被写体は 16:9 のディスプレイです。傾き修正として使う後述の `persipective` フィルタだけでは、ディスプレイ映像が 1600x1200 に引き伸ばされ、以下のように縦に延びてしまいます。

![img-3-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/57be87e2-4cc6-37a4-e13b-2c152e422479.jpeg)

今回は、よく知られている 16:9 の解像度の 1つである 1280x720 (HD) を最終的な出力解像度とします。これはパラメータ `sx` `sy` と呼ぶことにします。

被写体のサイズによっては、これより低い解像度にしてしまっても良いです。逆に、無駄に高い解像度にしても、ファイルサイズが圧迫されてしまいますので注意。

:::note
直撮りしている時点で画質はあまり期待できない点を踏まえても、高い解像度は必要にならないでしょう。
:::

## 4. 動画を処理する

必要なパラメータは揃ったので、あとは ffmpeg にかけるだけです。コマンドは以下のようになります。

```sh
ffmpeg -i input.mp4 -vf "perspective=x1:y1:x2:y2:x3:y3:x4:y4:1,scale=sx:sy" output.mp4
```

上の手順で得られたパラメータを当てはめると、以下のようになります。

```sh
ffmpeg -i input.mp4 -vf "perspective=274:289:1239:159:327:1054:1250:771:1,scale=1280:720" output.mp4
```

:::note
各パラメータが正しいかどうか確かめたいときは、数秒だけ処理して出力動画を確認すると良いでしょう。ffmpeg は、処理中に `Q` キーが押されると処理を中断し、途中までで出力ファイルを保存します。
:::

:::note
「動画の初めと終わりの部分はブレているので不要」というようなときは、`-ss <開始時間> -to <終了時間>` オプションを `ffmpeg` `-i` の間に入れることで、前後部分をカットできます。
:::

# ffmpeg のオプション 補足

`ffmpeg` の `-vf` オプションにより、動画にかけるフィルタを設定できます。今回の場合、傾き修正 `perspective` をした後に、サイズ変更 `scale` をする、というようなフィルタを組んでいます。

`perspective` について、座標に加えてもう 1つ引数があることに気がつくと思います。これは補間方法の指定で、以下のパラメータを指定できます。

* 0 - linear (既定値)
* 1 - cubic

非常〜にザックリ説明すると、liner は折れ線グラフ的に補間する方法で、cubic は滑らかに補間する方法です。滑らかな方が良いんじゃないかと、ここでは何となくで 1 (cubic) を指定しています。

:::note
linear は非常に単純なアルゴリズムで、計算量も少ない (処理が軽い) という特徴もあります。
:::

シチュエーションによって結果が変わってくるため、一概にどちらが良いとは言えません。ただ、(繰り返しになりますが) 直撮り画質だったとしたら、いずれでも大して気にならないんじゃないかと思います。

# 画像元

https://www.pexels.com/ja-jp/photo/3184455/

# 参考

https://nico-lab.net/perspective_with_ffmpeg/
【SwiftUI】一定時間操作がないことを検知する

# はじめに
PCの場合、一定時間操作がないとスクリーンセーバーが起動します。
そのような挙動を再現したかったのですが、公式のAPIにはなさそうだったので自作してみました。

# サンプルアプリ
色々迷った結果、このようなアプリにしました。
画面を放置していると画像を非表示にします。
![画面収録_2022-11-24_11_06_42_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3487c3c2-f3c8-2ea8-f16f-e900f66dbdd3.gif)


# 仕様
監視するスクリーンの範囲は`.onTimeout()`を付けているViewの大きさです。

# 実装
```swift
import SwiftUI

public extension View {
    func onTimeout(seconds: TimeInterval = 30, perform: ((ScreenStates) -> Void)?) -> some View {
        Timeout(content: self, seconds: seconds) { status in
            if let perform {
                perform(status)
            }
        }
    }
}

public enum ScreenStates {
    case active
    case timeout
}

fileprivate struct Timeout<T: View>: View {
    var content: T
    var seconds: TimeInterval
    var perform: ((ScreenStates) -> Void)

    @State var timer: Timer? = nil
    @State var states: ScreenStates = .timeout

    var body: some View {
        content
            .onTapGesture {
                start()
            }
            .onAppear {
                start()
            }
            .onDisappear {
                stop()
            }
    }

    private func changeScreenStatus(status: ScreenStates) {
        if self.states != status {
            states = status
            perform(status)
        }
    }

    private func start() {
        changeScreenStatus(status: .active)
        timer?.invalidate()
        timer = Timer.scheduledTimer(withTimeInterval: seconds, repeats: false) { _ in
            changeScreenStatus(status: .timeout)
        }
    }

    private func stop() {
        timer?.invalidate()
    }
}
```

# 使い方
```swift
import SwiftUI

struct ContentView: View {
    @State var isScreenHidden: Bool = false
    private let url = "https://avatars.githubusercontent.com/u/84154073"
    var body: some View {
        ZStack {
            Color(uiColor: .systemGroupedBackground).ignoresSafeArea()

            VStack(spacing: 5) {
                if isScreenHidden {
                    Image(systemName: "lock.fill")
                    Text("一定時間操作がなかったため、画面を非表示にしました")
                } else {
                    AsyncImage(url: URL(string: url)!)
                }
            }
        }
        .onTimeout(seconds: 5) { status in
            switch status {
            case .active:
                withAnimation { isScreenHidden = false }
            case .timeout:
                withAnimation { isScreenHidden = true }
            }
        }
    }
}
```

引数の`seconds`でタイムアウトになる時間を設定します。

# おわり
ライブラリにしたのでスターください！
これからアップデートする予定です！

https://github.com/SNQ-2001/ScreenTimeout
【Unity】おしゃれフェードを使ったシーン遷移を使いやすくした


- [はじめに](#はじめに)
- [環境](#環境)
- [どう使いづらい？](#どう使いづらい)
- [解決策](#解決策)
- [おわりに](#おわりに)

# はじめに
http://kerotan-factory.xblog.jp/article/463659352.html

https://www.youtube.com/watch?v=excJp8ah7qU&ab_channel=Unity%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%B9%E3%82%BF%E3%82%B8%E3%82%AA%E3%82%B9%E3%82%BF%E3%82%B8%E3%82%AA%E3%81%97%E3%81%BE%E3%81%A5

これらの通りにやって、若干使いづらかったのでFade用のスクリプトを書き換えました。

# 環境
- OS: Windows 11 Home
- バージョン: 21H2
- Unity Editer Version: 20203.27f1

# どう使いづらい？ 
フェードアウトさせてから始まるシーンではフェードの濃さの変数であるRangeをinspectorから1にしておかないとならないが、そうすると編集時にも画面が真っ暗になって使いづらい。

# 解決策

FadeImage.cs と Fade.csを以下の通り書き換えました。

```FadeImage.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class FadeImage : UnityEngine.UI.Graphic , IFade
{
	[SerializeField]
	private Texture maskTexture = null;

	// [SerializeField, Range (0f, 1f)]
	[Range (0f, 1f)] // SerializeFieldを削除
	private float cutoutRange;

//  ~~ 省略 ~~

}
```
```Fade.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Assertions;

public class Fade : MonoBehaviour
{
	IFade fade;
	[SerializeField] bool StartFade; // start時にfadeを掛けるか.
	float cutoutRange=0;

	// void Start ()
	void Awake () // StartからAwakeに変更
	{
		Init ();
		fade.Range = cutoutRange;
	}


    // コメントアウトしました
	// void OnValidate ()
	// {
	// 	Init ();
	// 	fade.Range = cutoutRange;
	// }

	void Init ()
	{
		fade = GetComponent<IFade> ();
        if (StartFade == true)
        {
            cutoutRange = 1;
        } else {
            cutoutRange = 0;
		}
	}

//  ~~ 省略 ~~

}
```


まず、FadeImage.csでなぜか0か1以外の値でしか保存できないRangeパラメータはinspectorから更新する必要はないため、Seriarizefield属性を削除しちゃいました。

スタート時にフェードを1にするか0にするかは、FadeコンポーネントのstartFadeをtrueにするかどうかで管理しています(これは飲用元の設計)。ただ、inspectorから変更すると、Onvalidate関数が反応して、真っ暗になってしまうため、Fade.csのOnValidate関数を削除しました。

また、Fade.csのStart関数内にあった記述ですが、シーン遷移をした後にオブジェクトが参照できないと言われることがあったので、Awake関数に移行しました。

以上,3点を変更することで、画面が真っ暗にならずに作業できるようになりました。


# おわりに
根本的な解決ではないし、将来困りそうな気がしますが、私の技術力ではここが時間的に限界。
もっとスマートな解決策があれば、ぜひ教えてください。
Cognitoユーザプールを使ったAppSyncの認証設定

# 概要
この記事では、Cognitoユーザプールを使ったAppSyncの認証方法を紹介します。

# スキーマ
[アドベントカレンダー](https://qiita.com/advent-calendar/2022/inoue-mn)の1日目から5日目で作成したAppSyncをCognitoユーザプールでの認証に切り替えます。

```graphql
input CreateRadioInput {
	id: ID!
	program_name: String
	cast: [String!]
	weekday: Int
	time: String
	favorite: Boolean
}

# 今回追加する箇所
input DeleteRadioInput {
	id: ID!
}

type Mutation {
	createRadio(input: CreateRadioInput!): Radio
		@aws_cognito_user_pools
	updateRadio(input: UpdateRadioInput!): Radio
		@aws_cognito_user_pools
	deleteRadio(input: DeleteRadioInput!): Radio
		@aws_cognito_user_pools
}

type Query {
	getRadio(id: ID!): Radio
		@aws_cognito_user_pools
	listRadio(filter: TableRadioFilterInput, limit: Int, nextToken: String): RadioConnection
		@aws_cognito_user_pools
}

type Radio @aws_cognito_user_pools {
	id: ID!
	program_name: String
	cast: [String!]
	weekday: Int
	time: String
	favorite: Boolean
}

type RadioConnection @aws_cognito_user_pools {
	items: [Radio]
	nextToken: String
}

input TableBooleanFilterInput {
	ne: Boolean
	eq: Boolean
}

input TableIntFilterInput {
	ne: Int
	eq: Int
	le: Int
	lt: Int
	ge: Int
	gt: Int
	contains: Int
	notContains: Int
	between: [Int]
}

input TableRadioFilterInput {
	day: TableIntFilterInput
	time: TableStringFilterInput
	favorite: TableBooleanFilterInput
}

input TableStringFilterInput {
	ne: String
	eq: String
	le: String
	lt: String
	ge: String
	gt: String
	contains: String
	notContains: String
	between: [String]
	beginsWith: String
}

input UpdateRadioInput {
	id: ID!
	program_name: String
	cast: [String!]
	day: Int
	time: String
	favorite: Boolean
}
```

``Mutation``と``Query``、``type Radio``、``type RadioConnection``に
``@aws_cognito_user_pools``を追加することでCognitoでの認証を受け付けます。

リゾルバーの変更は不要です。

# おまけ
リゾルバーでCognitoの情報を使用したい場合の記述方法を紹介します。

下記をCREATEのリクエストマッピングテンプレートの先頭に追加することで、CognitoのSub情報をDBに登録できます。
```
#set( $identityValue = $util.defaultIfNull($ctx.identity.claims.get("sub"), $util.defaultIfNull($ctx.identity.claims.get("cognito:sub"), "null")) )

#if( $util.isNull($identityValue) )
  $util.unauthorized()
#end

$util.qr($ctx.args.input.put("<カラム名>", $identityValue))
```
スピア型攻撃 とは

## 勉強前イメージ

攻撃手法の一部っぽいね。
詳細は知らん！

## 調査

### スピア型攻撃 とは

フィッシング攻撃の一種で、槍(スピア:spear)を突き刺すように標的を定めてから攻撃を行う手法です。
標的を定めてよく調べてから攻撃を行うので、攻撃を受ける方は騙されやすく非常に危ない攻撃です。
なので、従来の不特定多数のユーザに詐欺を行うフィッシング攻撃をは少し手法が異なります。

元々フィッシング攻撃はコストが低いが利益が十分にできる攻撃手法でした。
しかし、セキュリティの向上でフィッシング攻撃でユーザを騙すことが難しくなってきました。
どこで、信憑性を高めた攻撃として十分に情報を仕入れてから行うスピア型攻撃が進められています。

### スピア型攻撃の特徴

攻撃の目的としては従来のフィッシング同様、ユーザの個人情報の取得などですが
特徴としては↑でも記載しましたが、狙いを定めて攻撃を行います。
標的に応じて攻撃手法を変えて行うので攻撃の成功確率が上がります。
攻撃者はSNSなどを用いて標的の情報を収集して分析します。

### スピア型攻撃の攻撃手法

攻撃手法はメールをフィッシングサイトへ誘導する方法で標的型攻撃メールとも呼ばれています。
ただし、攻撃者は標的の情報を仕入れているので社名や内部の人間の名前を使ったりなど本物のメールと思わせます。
その結果、フィッシングサイトへ誘導されたりしてしまうことがあります。

## 勉強後イメージ

広く浅くじゃなくて
狭く深くってかんじか。

## 参考

- [スピアフィッシング攻撃とは](https://www.rapid7.com/ja/fundamentals/spear-phishing-attacks/)
- [スピアフィッシング攻撃とは？仕組みや危険性、対策方法について徹底解説](https://cybersecurity-jp.com/column/36462)
countdowncalendar４企画の計画と動向

 ４つ企画しました。

|表題|views|いいね|stocks|
|:----|:----|:----|:----|
|AdventCalendar2022(O.K.) Advent Calendar 2022 目標と方針 https://qiita.com/kaizen_nagoya/items/7dea20f7e6a03f4a739c|45|0|0|
|いいねをいただいた記事ランキング(O.K.版) Advent Calendar 2022 目標　https://qiita.com/kaizen_nagoya/items/e529311359b4a4a648d3|54|0|0|
|AUTOSAR Advent Calendar 2022 https://qiita.com/advent-calendar/2022/autosar|56|0|0|
|Automotive Handbook Advent Calendar 2022 方針と目標 https://qiita.com/kaizen_nagoya/items/deb27435219f45817aa8|63|0|0|
|合計|218|0|0|

計画の目標と動向を整理します。　

構築隔日記(8) Advent Calendar 2022 進捗報告(12)
https://qiita.com/kaizen_nagoya/items/150a6fb2695c754434c1

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
FormDataでファイル名に日本語が含まれるファイルをPOSTすると文字化けした


🔰 初投稿です。
まだまだ未熟者ですので、温かい目で見ていただけると幸いです。

## やりたいこと
家庭用GooglePhotoのようなものを製作したい。
フロントはreactで製作し、Material UIを活用しUI周りを整える。
バックはexpressで製作し、multerで画像を保存する。

フロントからバックへの画像送信はaxiosを用いてPOSTする。

## 状況
題の通り、inputで選択したファイルの名前に日本語を含む場合、バック側で受け取った際にファイル名が文字化けする。

```js:フロント
  // フォームデータに画像追加
  const data = new FormData()
    images.map((image) => {
      data.append('images',image)
    })

  // 送信
  await axios.post(
    url,
    data,
    {
      headers: {
        'Content-Type': 'multipart/form-data',
        'Access-Control-Allow-Origin': '*',  
      },
    }
  )
```
 フロント側でファイルを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931496/94e73527-619d-c598-bdad-5315a0ee890b.png)

バック側でファイル名を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931496/e91b58b8-a9f7-a6b9-982d-a8dac3ce8fca.png)
## 原因？
軽くweb検索した感じだと`Content-Type: multipart/form-data;`は文字コードが自動で設定されるみたい？
headersに'multipart/form-data;charset=UTF-8'と記述しても変化無し。
※ 分かり次第追記します。

## 解決
先に手動でエンコードすることで解決しました。
```js:フロント
const data = new FormData()
    images.map((image) => {
      data.append('images',image,encodeURIComponent(`${image.files}`)) // ★ 変更
    })

    await axios.post(
      url,
      data,
      {
        headers: {
          'Content-Type': 'multipart/form-data;charset=UTF-8',
          'Access-Control-Allow-Origin': '*',
          
        },
      }
    )
```
バック側でデコード。
```js:バック
router.post('/upload', upload.array('images', 4), function (req, res) {
  console.log(JSON.stringify(decodeURIComponent(req.files[0].originalname))) // ★ 変更
  res.set({ 'Access-Control-Allow-Origin': '*' })
  res.set({ 'Content-Type': 'application/json' })
  res.status(200)
  res.send({ text: 'ファイルのアップロードが完了しました。' })
})
```
確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931496/349f5d3a-8b0f-3c40-a7f9-cd1bbaa238ee.png)
ファイル名が文字化けせずにアップロード出来ました。
【sourcetree】プッシュ済みのコミットをまとめたい

複数のコミットを一つにまとめて、コミット履歴をシンプルにするやり方です。

例としてtestブランチでg、hというファイルを新規作成し、コミットしてtestブランチのリモートブランチのorigin/testにプッシュしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2458996/1503e2f1-5a07-269c-d1ab-471e36db46bc.png)

このd、hのコミットを一つにまとめます。まとめたいコミットの一つ前のコミットを右クリックし、「～の子とインタラクティブなリベースをする」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2458996/461c4200-3620-2fce-2d46-aa81f8c70277.png)

開いた画面の一番上のコミットを選択し「前のコミットとスカッシュ」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2458996/66bd5f5f-dede-a9f9-fd1a-a569c646008e.png)

コミットがまとまりました。コミットメッセージを変更したい場合は「メッセージを編集」を押します。適宜変更して「OK」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2458996/3fd6f2a7-5944-4524-d69a-39fd9c08363d.png)

プルの後、プッシュを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2458996/f420052f-5d71-f712-ff94-05406cdc33df.png)

無事にコミットがまとまったことを確認できました。
一番上にマージコミットが入っているので、リモートブランチを消してから、コミットをまとめた後に、リモートブランチを作り直すと、コミット履歴がきれいになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2458996/c1eb496e-3424-3c50-fdba-1c2876902472.png)
ManjaroLinuxでVagrantをセットアップする


## libvirtdのインストール

```
yay -S libvirt ffi qemu
```

## libvirtプラグインインストール

```
vagrant plugin install vagrant-vbguest vagrant-share 
```

```
vagrant plugin install vagrant-lxc
```

## 起動

```bash
vagrant init generic/ubuntu2004
vagrant up
vagrant ssh
```


## 参考
https://wiki.archlinux.jp/index.php/Vagrant
後の祭り　三連発

人生で後悔しないことがない人は幸いである。　
天国はその人達のものである。　

聖書のパクリである。　

>心の貧しい人々は、幸いである。天の国はその人のものである

マタイによる福音書5章1～12節

http://nagoya-chuou-kyoukai.com/sermon/65.html

説教者：森田喜之牧師

父の葬儀を取り仕切っていただいた方である。　
母の葬儀を取り仕切っていただいた方は、

	草地　大作　牧師　

である。　

https://www.youtube.com/watch?v=tRT4g6knDp0

名古屋中央教会は、名古屋ハリスト教会、聖公会とともに、春日井市潮見坂に共同墓地を設置している。毎年５月に現地で礼拝がある。　

# 後の祭り

## 海外青年協力隊　

日本で生きていくのが嫌になり、海外青年協力隊に申し込もうと思い、スペイン語を勉強始めたのは３０歳くらい。大学を二つ卒業し、研究所のソフトウェア研究室の研究員として働き始めてすぐだった。　

スペイン語でコンピュータが教えられる自信がついて、実際に応募先があることを確認し、申し込み書類を作ろうとして、ある理由で申し込みを取りやめた。

選択に後悔はないが、海外青年協力隊でスペイン語で活動していれば、今とは全く違う生活をしていただろう。　

"An Introduction to the Learn with Dr G Show" on Youtube. @drguthals

https://qiita.com/kaizen_nagoya/items/e18fbec6d5e509f2d9f7

## 年金受給７０歳

６０歳で年金を受給するか、６５歳で年金を受給するか、７０歳で年金を受給するか決断をする機会があった。　

結果として６０歳受給を選んだ。結果として、収入は大幅に減り、年金もほとんど受給できない仕組みの再雇用に落ち着いた。

年金７０歳受給を選んでいれば、かなり年金額が増えていたはず。　
その時は、明日のこともわからず、制度もどう変化するのか見えていなかった。　

今から、９年前に戻ったら、７０歳受給を勧めたかもしれない。　

## 転職　

５年に１度くらい、転職の応募をしてきた。　
２０歳ころの転職が、一番大きく、十数社申し込んで、内定をいただいたのは２組織。　

実際に就職させていただいた先以外で、内定をいただいたのは、名古屋大学生協印刷部。　
実家が印刷業で、家業を手伝っていたことから、印刷部なら中途採用として手間いらずだと思った。　

違う仕事に挑戦したくて、お断りした。　
仕事場が名古屋大学であれば、いろいろ便利なことはあったかもしれない。　

第何回めかの転職も十数社申し込んで内定をいただいたのは２組織。　

実際に就職させていただいた先以外で、内定をいただいたのに、お断りしたのは、内定をいただいた順で、特に他意はありません。ごめんなさい。　

十社くらいから、お断りをいただくと、結構めげますし、周囲が本気で活動していないのかと疑い始めたりする。　

転職の面談で答えたこと。転職(19)

https://qiita.com/kaizen_nagoya/items/437aacaf8f386b88274d

転職(0)一覧

https://qiita.com/kaizen_nagoya/items/f77520d378d33451d6fe
【Git】Gitでお世話になりそうな感じの操作パート１

お疲れ様です。本日はGit！ということで、自分がもうおせわになりましたってやつ、これからお世話になりそうなやつを自己研鑽として色々し食べたのでそれをメモできればいいなと思います。Gitはどんな言語、どんな開発においてもきれない存在なので一投稿じゃ収まらないなと思いとりあえずパート１ということで

# Gitでのコミットを取り消したい場合

### プッシュする前

直前のcommitだけを修正する場合: --amend
Commitを消したい場合: --reset
古いCommitを修正する場合: --rebase

### プッシュした後

Commit無かったことにしたい: revert
プッシュ後には amend/revert/rebase しちゃだめ

# 詳細

### amend(コミットメッセージを書き直したいとき)

コミットメッセージ欄→コミットオプションを指定→最新のコミットを修正（ソースツリー）

### reset(コミット後にしてのコミットまで戻したい場合)

戻したいコミットを選択→右クリック→リセット（ソースツリー）

- resetの種類
    - --soft : コミットのみが巻き戻る
        - 直前のコミットを修正したいとき
        - コミットをし直したいとき
    - --mixed : コミットとステージングが巻き戻る
        - いくつかのgit addでステージしたけど、やっぱり戻したいというとき
        - デフォルトはmixed
    - --hard : コミット、stg、作業ディレクトリ全てを巻き戻す

### rebase(直前のコミットから任意のコミットまでまとめたい)

- 複数のコミットを１コミットにまとめる、コミットメッセージを修正する
    - oooの子を対話形式でリベース→まとめたいコミットを選択して前のコミットとスカッシュ→必要であればコミットメッセージを編集→強制プッシュ
    - *コミットをまとめたい１つ前のコミットで右クリックする
- ブランチ同士を繋げる
    - 詳しくは[こちら](https://qiita.com/takopa/items/29a7d5105fe2d0b5457f)

# git ignore

- 指定したファイルを無視できる
- リポジトリ設定→「無視リスト」で編集できる
- もし共同開発などで自分のファイル変更が反映されていない時はgit ignoreファイルで除外されてしまっている可能性がないか聞いてみる
要件定義におけるTips

## 初めに
今回のエムスリーキャリア FY22 AdventCalendarは、初回に続き近藤（@atkondo）が記載させて頂きます。
内容としては、「要件定義におけるTips」とさせて頂きました。

私は22年4月中途入社で入社後1年半年経過しています。
当社のご説明を差し上げておくとエムスリーグループの一社として、医療従事者（主に医師、薬剤師）の方向けの人材紹介・派遣事業を中心に、近年では、経営支援・採用支援、産業保健・健康経営の事業を行っています。

エンジニア部門としては、「医療従者向けのtoC領域システム」、「医療機関向けtoB領域のシステム」、「キャリコンサルタント・営業向けのSFA/CRM」の開発を担っています。
当社では、50名のエンジニアがおり、概ね全てのシステムを内製しています。
テンポラリーで人手が不足している箇所等では業務委託の方にも数名ご協力を頂いています。


本日は、各システムの要件定義を行う上での、特にビジネスサイドとの関わり合いにおけるTipsをいくつか記載したいと思います。
同じような立場で働く方々への参考になればと思います。ご質問やご意見あれば頂ければと思います。


## 事業会社におけるエンジニアの要件定義とは？

要件定義に向けての仕事の進め方としては以下のような流れです。
1. 開発要件のピックアップ
1. 開発会議による開発要件の選定
1. 要件定義、仕様調整

また、この要件定義、仕様調整を担当するのは、事業などによって若干異なります。
・ビジネス部門: 事業担当者
・マーケティング部門:　IA(InformationArchitect)、PdM(Product Manager)
・エンジニア部門:　PdM(Product Manager)、BDE(BusinessDevelopmentEngineer)

サービスフロー・業務フローに関する施策はビジネス部門/エンジニア部門の担当が、Webマーケティングの領域に関する施策はマーケティング部門の担当が牽引することが多いです。

最終的には、エンジニア部門の担当が、設計に落とし込めて、見積りが可能なレベルまで、要件を整理して行きます。
ビジネス部門、マーケティング部門との認識の擦り合わせが可能なレベルまでとなります。


## 要件定義のアウトプット
このフェーズでは次のような内容、形式でアウトプットでまとめられることが多いです。

- ビジネス部門
　　　　事業計画書、施策　: 目的、ROI、サービス・業務フロー　等　　　　　　　　　　　　
- マーケティング部門
　　　　画面指示書（IA書）　 : 目的、ROI、画面の変更箇所　等
- エンジニア部門
 -　要件定義書　：　
　　- 基本情報　　： 前提情報、条件等
　　- 依頼内容：上記事業計画書、施策　、画面指示書（IA書）について
　　- 対応方針：　対応範囲、箇所、対応内容
　　- インターフェース：　外部サービスとのインタースがある場合に記載
　　- 効果測定方針：　目標値、測定方法　等
　　- 概算見積り：　要件定義〜設計・実装・テスト〜QA・リリース　
　　- スケジュール：　着手〜ビジネス/マーケティング部門での確認〜サービスイン
　　- 検討事項　：　
　
　      
エンジニアでは、基本的には、SpreadSheetで合意形成をとりながら、最終的には、Confluenceに落とし込むことが多いです。
デザイン はRDやFigmaといったデザインツールを使うことが増えて来ました。


## Tips
ここから本題であるTipsとは3つほどご紹介しておきたいと思います。
- エンジニアとしてのバリューを出すことを意識する
事業/施策での目的をどう理解するかによって、システム化の範囲、アーキテクチャを含めた対応方針が決まって行くかと考えています。これがエンジニアとしての大切なバリューであると意識すべきでは無いかと考えています。

どこまで事業/施策の領域に踏み込んで行くかが難しいところではありますが、マネージャークラスはもちろんのこと、できる限り、リーダークラスも、事業/施策の背景や狙いが解像度高く理解できるように事業/施策へのコミットメントを行なっておく方が良いと考えています。

特に新しい事業/施策を行う上では、誰も正解が分かっていないことがあります。
そのような状況の中で、システム化の範囲、アーキテクチャを含めた対応方針を出して行くというのは大切な一方で、難易度が高いタスクとなります。

「社内に公開されている一次情報をなるべく当たっておく」、「社内の事業担当者に直接質問して行く」といったことがその支えになることが多くあります。


- エンジニアとしての代替案を出す
コアな企業の競争力の源泉となり得るシステムは当社内で作り込むべきではありますが、まだ、システム費用対効果が見えにくい場所については、外部ツールの選択、代替案を出す、ということも大きなTipsとなります。

当社ではシステム投資対効果を睨んで、ビジネス検証を行うことが大半であり、スモールスタートを目指すことが一般的です。

そのために場合によっては、NoCodeツールでシステム提供を行った上で、本格的対応はその仕組みを捨てて構築するという判断を行うこともあります。

こういった方向性について、判断はエンジニアで行い、関係者間で合意形成しながら進めて行くところが1つ大切にすべきTipsと考えています。



- 未来を見据えたアーキテクチャを検討する
一方で、事業・組織・会社が長期間に渡って、成長・変化して行くことを踏まえて、システムアーキテクチャーを検討しておくことも大切です。

当社の場合は、大きくは以下の方針を取っています。
・医療従者向けのtoC領域システム、医療機関向けtoB領域のシステム：　Vue.js＋RubyOnRailsを基本形として、事業・サービス毎にWebアプリケーションシステムを展開

・キャリコンサルタント・営業向けのSFA/CRM：　Salesforceを中心に、MAツール、マーケティングツールを組み合わせて対応

共通機能をライブラリと利用を進めて行くことや、DevOpsツールを統一して行くことは進めながら、NoCode化やマイクロサービス化も進めて行こうとしています。



## 最後に
エムスリーキャリアでは、積極的にエンジニアを採用しています。
カジュアル面談も行っていますので、是非、関心を持って頂きました方お話しさせて下さい。

・toC,toBシステムを担当する、Webアプリケーションエンジニア
・SFA&CRMの開発を手掛ける、社内システムエンジニア
・QAエンジニア

https://career.m3career.com/midcareer/engineer
ビジネスにとって意味のあるデータとは

お久しぶりです、7年ぶりくらいにQiitaに投稿します。

現在はプログラマーではなく、経営コンサルタントとして経営戦略立案から新規事業開発支援までを担当しています。

新規事業開発でもデータの重要性は増してきており、データアナリストやデータサイエンティストからの意見や提案が求められるケースも多くあります。

本日は、経営者や事業責任者から見た「意味のあるデータ」を生み出すためにデータアナリストやデータサイエンティストが心がけてほしいポイントを3点共有します。

# 新規事業の概要 (例)
今回は次のような新規事業開発案件をイメージしてみます。
- サービスは検討の末、ECサイトでセレクトショップを運営することが決定
- コンセプトは検討段階だが、一旦は「**とにかく安い**」ことに仮決め
- 新規事業のメンバーは以下の7名
  - プロジェクトリーダー (事業責任者) 1名
  - ビジネスコンサルタント 2名
  - フルスタックエンジニア 2名
  - UI/UXデザイナー 1名
  - データアナリスト/データサイエンティスト 1名
- 現在は取扱商品を検討しつつ、コンセプトが実現できるか検証中
  - 検討初期段階のため、メンバー全員で検証


# ① 俯瞰的な視点
利益を確保するため、最初は原価率の低い商品を取り扱いということになった。
商品カテゴリ別の原価率を調べたところ以下のような状況と分かった。
以下商品カテゴリのうちどれを取り扱うべきか。

1. トイレットペーパー 定価200円 (原価率10%)
1. ディッシュペーパー 定価100円 (原価率20%)
1. ボタン電池 定価100円 (原価率80%)
1. 米 定価1,000円 (原価率50%)
1. ...

※商品カテゴリ・定価・原価率はイメージです

ここは安直にトイレットペーパーを選びたいところだが、思わぬところで落とし穴がある。
今回はECサイトの経営とのことなので、購入者に対して商品を配送しなければならない。
トイレットペーパーは嵩張るため配送コストがかかり、原価率が低くても赤字になる可能性が高い。

このような商品カテゴリが候補リストに入り込むとノイズとなり、正しい意思決定が困難になる。
ビジネスプロセスの全体像を「**俯瞰的な視点**」で見た時に不足している観点がないかを考えられることが望ましい。


# ② Apple to Apple
商品カテゴリが決まり、具体的に取り扱う商品を検討するため、ポテトチップスを例にコンセプトである「とにかく安い」が実現できるか検証することになった。マーケットデータを収集したところ、4つの商品が出てきた。
以下商品のうちどれを取り扱うべきか。

1. カ○ビーポテトチップス (うすしお味) 80g 150円
1. カ○ビーポテトチップス (うすしお味) 150g 200円
1. 湖○屋 ポテトチップス (うすしお味) 80g 100円
1. カ○ビーポテトチップス (もも味) 80g 230円

※商品名・値段はイメージで実在する企業・商品とは一切関係ありません

勘の良い方はピンと来たかもしれないが、この4つの商品はいずれも取扱商品となりうる。
1. 他メーカーである3を除けば最安値
1. グラム単価で見れば最安値
1. この4つの中では最安値
1. もも味では最安値

どんな「最安値」を取り扱うかによって、上記1-4の正解が変わるので事前に条件を擦り合わせておくか、意思決定できるようにデータを整理しておく必要がある。

ビジネスの用語では「**Apple to Apple**」というものがあり、「同一条件で比較」できているかという意味である。

意思決定する上では「同一条件で比較」されていることが非常に重要であり、データ項目も条件に従って選択されていることが望ましい。

# ③ 意思決定に本当に必要なデータ
サービスのコンセプトに見直しが入り、「とにかく安い」だけでなく「美味しい」商品を集めることに方向転換することにした。
商品ごとに「美味しさ」を調べ、値段×美味しさで評価すれば取扱商品を決められそうだ。

では、世の中にそういった「美味しさ」を測る定量データはあるだろうか。
~~個人的には炭水化物は美味しさと比例するというデブ特有の考え方を持っているが、実際にはそんなことはないだろう~~

そもそも、「美味しい」と感じるものは人それぞれではないだろうか。
正直にやろうとすると途方もない労力をかけることになるが、ビジネスの文脈を理解していれば「美味しさ」は関係なく、「皆に支持されている」商品を選べば良いことかわかる。
あとは、Amazonの口コミ件数を調べたり、販売量を調べれば、支持されているかいないかはだいたいわかるだろう。

このようにデータが見つからない (もしくは取得するのに多くの労力がかかる) 場合は、「**意思決定する上で代替できるデータ**」が何かを検討した上で変更することが望ましい。


# さいごに
データに強いデータアナリスト、データサイエンティストがビジネス視点を持って意見・提案してくれることは、経営者や事業責任者にとって非常に強力な味方となるので、恐れずに発言していって欲しい。
P′′(P double prime)という言語を知る

Brainfuckはesolangとして有名ですが、そんな言語にも影響を与えた言語を知っていますか。
今回はそんな言語に関する記事です。

# P′′とは何か

https://ja.wikipedia.org/wiki/P%E2%80%B2%E2%80%B2

P′′とはチューリングマシンの一種を記述するための言語です。
詳しい文法や意味論に関してはwikiの記事をご覧ください。

以下にP′′からBrainfuckに変換可能な対応表を書いておきます。
|P′′|Brainfuck|
|:-:|:-|
|`R`|`>`|
|`λ`|`+<`|
|`(`|`[`|
|`)`|`]`|

逆にBrainfuckからP′′に変換する対応表は以下の通りです。

|Brainfuck|P′′|
|:-:|:-|
|`[`|`(`|
|`]`|`)`|
|`+`|`λR`|
|`-`|後述|
|`>`|`R`|
|`<`|後述|
|`.`|なし|
|`,`|なし|

# Brainfuckとの関係性
BrainfuckとP′′の大きな差は入出力命令があるか否かですが、それ以外は互換性があります。

## 配列の互換性
P′′はチューリングマシンの一種を記述する言語であるため、チューリングマシンが持つテープというものを持ちます。
これは長さが無制限であり、その表面に記号を読み書きすることができます。
ここでは記号と言いましたが、これは数値であったりアルファベットであったり、難しくいうなら有限個の異なる状態を表すことができるということです。
簡単に言えば長さが無限の配列です。
さて、Brainfuckの配列は長さは無制限ではないですが30000個の配列は十分な長さを持つと解釈します。
そしてBrainfuckの配列はbyte配列なので`00`から`FF`までの256種類の状態を読み書きできます。

さらにP′′のテープには空白記号と言った記号が存在しますが、これはBrainfuckの配列では`00`が空白記号であると定義することが多いです。
P′′において空白はループを抜ける時に使います。

## 命令の互換性
命令の互換性に関しては前章の表で示しました。
しかし、入出力命令である`.`,`,`以外にも対応を示していない命令が2つあります。
一つは`-`、そしてもう一つは`<`です。

さて、`<`の対応に関して、BrainfuckとP′′の表記を混ぜてざっくりと言ってしまうと、`-λ`です。
これは`λ`が`+<`であることを踏まえれば`-λ`は`-+<`となり、`-+`は相殺され`<`になると言えばわかるでしょう。

もう一つの、というか一番の問題は`-`です。
先ほど示した`<`の対応付けに関しても`-`の問題は依然と残っています。
とりあえずここでは定義をよく知ったBrainfuckで考えてみましょう。
Brainfuckでは多くの場合、`00`に対して`-`をすると`FF`になります。
これは`+`を255回行ったものと同じ結果になります。
つまり、brainfuckの配列がbyte配列である場合、
```brainfuck
-
```
と
```brainfuck
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
```
は等価です。
それをふまえてP′′について考えましょう。
P′′ではn種類の記号が読み書きできます。
記号の集合は{C<sub>0</sub>,C<sub>1</sub>,C<sub>2</sub>,C<sub>3</sub>,...C<sub>n-1</sub>}で、n種類の状態を表現できます。
ただしC<sub>0</sub>は空白記号です。

さて、Brainfuckはこのnが256の例です。
そして`-`は`+`を255個繋げたものです。
この255という数字はnが256であることに注意したらn-1です。

ではP′′ではどうでしょうか。
P′′ではBrainfuckの`+`は`λR`に対応しています。
そしてBrainfuckの`-`はBrainfuckの`+`をn-1個繋げたものである点に注意すると、Brainfuckの`-`に対応するP′′の書き方は`λR`をn-1個繋げたものに対応しています。


# P′′からBrainfuckの定義を再確認する
BrainfuckがP′′に対応することを前章までで確認してきました。
その上でBrainfuckの仕様を確認します。

「P′′はあくまで影響を与えただけであり、正当な拡張ではないのでBrainfuckの定義と比較するのはナンセンスだ」という意見はあるかもしれませんが、その点に関しては今回は取り上げません。

## 配列の長さ
Brainfuckの配列の長さは30000ですが、P′′の定義では無制限です。
だから、30000というものは必ず守るべき仕様というよりは十分おきな数であるとみなせる場合は長さは多少適当でも良いのかもしれません。

## 配列の要素のサイズ
Brainfuckの配列の要素はbyte配列で実装している場合は256種類、各要素が2byteの配列は65536種類、4byteなら4294967296種類の状態を扱えます。
P′′はn種類の状態を扱えます。
これはBrainfuckのインタプリタなどの実装によって異なります。
しかしながら、文字を扱うことを考えるとASCII文字くらいは扱えて欲しいと考えると1byte、256種類の状態を扱えるくらいがちょうどいいのかもしれません。

## 入出力
Brainfuckには入出力がありますがP′′には入出力がないです。
ただ、これに関してはBrainfuckをより使いやすくするための拡張であると考えるのが良いでしょう。
【UE4 UE5】マテリアルのメモ

最近ぼっち・ざ・ろっくにハマったやつの　（漫画売ってないんだけど）
メモです
そこんとこよろしく（）
<br>
あとTwitterのフォローもよろしく...
https://twitter.com/MapleSyrup77

<br>
<br>
<br>

## 基礎

ベースカラー　　赤を設定すると赤になる

<br>
<br>

メタリック　　　鏡みたいに反射する

<br>
<br>
<br>
<br>
<br>
<br>

## 反射の作り方


このようにすることで、鏡のような質感にできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/027a9c48-165d-47b1-5ffd-5368890c0b9d.png)

<br>
<br>
<br>
<br>

プラスチックやボーリングのボールような質感にしたい場合は、こうする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/49825da1-7bd6-9f7a-2ec1-cf7fa4c116eb.png)

<br>
<br>
<br>
<br>

逆に反射させたくない場合は、こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/0070238a-3bfb-dc81-2184-0d71c16db0e0.png)

<br>
<br>
<br>
<br>
<br>
<br>

## マテリアルインスタンスで一括編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/1275c92c-eb94-c6d4-7e47-2a3b593e129e.png)

マテリアルインスタンスの
マテリアルを適用することで、レベル内に配置されているものを一括で編集できる
IAMを使ったAppSyncの認証設定

# 概要
この記事では、IAMを使ったAppSyncの認証方法を紹介します。

# スキーマ
[アドベントカレンダー](https://qiita.com/advent-calendar/2022/inoue-mn)の1日目から5日目で作成したAppSyncをIAMでの認証に切り替えます。

```graphql
input CreateRadioInput {
	id: ID!
	program_name: String
	cast: [String!]
	weekday: Int
	time: String
	favorite: Boolean
}

input DeleteRadioInput {
	id: ID!
}

type Mutation {
	createRadio(input: CreateRadioInput!): Radio
		@aws_iam
	updateRadio(input: UpdateRadioInput!): Radio
		@aws_iam
	deleteRadio(input: DeleteRadioInput!): Radio
		@aws_iam
}

type Query {
	getRadio(id: ID!): Radio
		@aws_iam
	listRadio(filter: TableRadioFilterInput, limit: Int, nextToken: String): RadioConnection
		@aws_iam
}

type Radio @aws_iam {
	id: ID!
	program_name: String
	cast: [String!]
	weekday: Int
	time: String
	favorite: Boolean
}

type RadioConnection @aws_iam {
	items: [Radio]
	nextToken: String
}

input TableBooleanFilterInput {
	ne: Boolean
	eq: Boolean
}

input TableIntFilterInput {
	ne: Int
	eq: Int
	le: Int
	lt: Int
	ge: Int
	gt: Int
	contains: Int
	notContains: Int
	between: [Int]
}

input TableRadioFilterInput {
	day: TableIntFilterInput
	time: TableStringFilterInput
	favorite: TableBooleanFilterInput
}

input TableStringFilterInput {
	ne: String
	eq: String
	le: String
	lt: String
	ge: String
	gt: String
	contains: String
	notContains: String
	between: [String]
	beginsWith: String
}

input UpdateRadioInput {
	id: ID!
	program_name: String
	cast: [String!]
	day: Int
	time: String
	favorite: Boolean
}
```

``Mutation``と``Query``、``type Radio``、``type RadioConnection``に
``@aws_iam``を追加することでIAMでの認証を受け付けます。

リゾルバーの変更は不要です。

# 確認方法
curlでの確認方法は、[アドベントカレンダー](https://qiita.com/advent-calendar/2022/inoue-mn)の23日目の記事を参照ください。
QiitaのMarkdown

# 参考ページ
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

# サンプル
``` :Qiita画面入力
# 見出し1
1. 番号リスト1
これは`インラインテキスト`です
[リンクの挿入](https://qiita.com)
<img width="200" alt="qiita-square" src="https://qiita-image-store.s3.amazonaws.com/0/126861/90386757-fd96-8ba6-3477-485669713c55.png">
~~打ち消し~~
```

# 見出し1
1. 番号リスト1

これは`インラインテキスト`です
[リンクの挿入](https://qiita.com)
<img width="100" alt="qiita-square" src="https://qiita-image-store.s3.amazonaws.com/0/126861/90386757-fd96-8ba6-3477-485669713c55.png">
~~打ち消し~~


``` :Qiita画面入力
:::note info
インフォメーション
:::

:::note warn
警告
:::

:::note alert
より強い警告
:::
```
:::note info
インフォメーション
:::
:::note warn
警告
:::
:::note alert
より強い警告
:::

``` :Qiita画面入力
| 1 | 2 | 3 |
|:--|--:|:-:|
| 左寄せ | 右寄せ | 中央揃え |
| 123456789 | 123456789  | 123456789  |
```
| 1 | 2 | 3 |
|:--|--:|:-:|
| 左寄せ | 右寄せ | 中央揃え |
| 123456789 | 123456789  | 123456789  |
SOCKS とは

## 勉強前イメージ

いや、ちょっとわからん・・・

## 調査

### SOCKS とは

ネットワーク機器が内側の通信と外側の通信の中継をするためのプロトコルになります。
直接インターネットに接続できない内部のコンピュータから代理でインターネットへ接続を行うことになります。
トランスポート層でアクセスを制御します。
SOCKS5はRFC1928として標準化されています。
(SOCKS4というのもありますが、バージョンの違いで5のほうが新しく優れています。)
SOCKS5ではSOCKS4では対応できなかったUDPの通信が中継できるようになりました。

中継・プロキシといえばhttpプロキシが有名です。
SOCKSプロキシはアプリケーション層で動作するHTTPプロキシより汎用的に利用できる反面
アプリケーション側がSOCKSに対応している必要があります。

## 勉強後イメージ

わかったようなわかってないような・・・・
一度手でやってみないとかなー

## 参考

- [SOCKS【SOCKS5】](https://e-words.jp/w/SOCKS.html)
【スマホ向け】AIくずし字認識アプリ「みを」の使い方と、精度向上のヒント

# 「みを」とは
- 約100万文字の「くずし字データセット」を学習した、
最新のAIくずし字認識技術を用いたアプリ（iOS, Androidとも対応） 
- まさかの無料

http://codh.rois.ac.jp/miwo/

https://www.youtube.com/watch?v=ZUS7rSKGscc

※ 私は開発には関わっておりません。いちユーザとしての投稿です。


# 使い方
- アプリをインストールしたら、画像を撮影（または画像を指定）
- ボタンひとつで文字を認識！　これだけ！

## Android版
https://play.google.com/store/apps/details?id=jp.ac.rois.codh.miwo&pli=1
![QR_Android_app_URL_s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29245/84c3bed5-2de2-f2b3-753e-1a3e1ed2d0e8.png)


## iOS版
https://apps.apple.com/us/app/miwo/id1581794085
![QR_iOS_app_URL_s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29245/37d884d5-4f24-6b9f-3411-a51dacb047a3.png)


# 識別精度を上げるためには？
- 正面から撮影する
    ❌　斜めから撮影すると、文字が歪んでしまい、精度が下がる可能性があります
- 影が写り込まないように撮影する
    ❌　背景色が同一ではない場合、精度が下がる可能性があります（v.1.1で改善されたようです）
- 欲張りすぎない
    ❌　一気にたくさんの文字を認識させようとすると、精度が下がる可能性があります

# 使用上の注意
- 精度は、100%というわけではありません
    - 正式な解読は、専門家にお任せしましょう
- 「文章の内容を理解して文字を推定している」というわけではありません
    - あくまで「文字の形状」から、対象の文字を推定しています
- 江戸時代の版本に対する精度が比較的高めとなりますが、他の時代の資料や、写本、古文書などでは、精度が低下する可能性があります（公式ページから抜粋）


# 【付録】より詳しく知りたい方のために

## 100万字のデータは、どこが公開している？
http://codh.rois.ac.jp/char-shape/

「情報・システム研究機構 データサイエンス共同利用基盤施設 人文学オープンデータ共同利用センター」という、国の研究機関が公開しています


# 【付録】動作メカニズムについて（推察）

- 深層学習のモデルKuroNetを使っているようです
    - 「U-Net」という「セグメンテーション」を目的に開発された形式を応用
        - セグメンテーション → 「塗り絵」のようなイメージ。
        - 「文字」と「非文字」を塗り分けているような学習を行っていると思われます
- アルゴリズム（推定）
    - 「文字」に該当する「ピクセル」を画像の中から見つける
    - ある程度のかたまりを「文字」として「まとめる」　→　「枠」をつけられる状態になる
    - その「文字」が、それぞれ、どの「正解」に該当するかを推定する

https://www.researchgate.net/publication/341563810_KuroNet_Regularized_Residual_U-Nets_for_End-to-End_Kuzushiji_Character_Recognition
Unityで現在のSceneを取得する方法

Unityで現在のSceneを取得する方法です。

# 環境
OS : Windows10
Unity バージョン : 2019.4.15f1

# コード
```c#
public static SceneManagement.Scene.SceneManager.GetActiveScene()
```

# サンプル
```c#
using UnityEngine;
using UnityEngine.SceneManagement;

public class GetActiveSceneExample : MonoBehaviour
{
    void Start()
    {
        Scene scene = SceneManager.GetActiveScene();
        Debug.Log(scene.name); // string型でScene名が取得できる
    }
}
```

# 参考
- [SceneManager.GetActiveScene](https://docs.unity3d.com/ja/2018.4/ScriptReference/SceneManagement.SceneManager.GetActiveScene.html)
【Linux】sedコマンドで複数条件指定する方法

## 指定方法

以下の方法で複数の条件を指定できます。  

```terminal
sed -e 's/sample/EXAMPLE/g' -e 's/example/SAMPLE/g'
```

```terminal
sed -e 's/sample/EXAMPLE/g; s/example/SAMPLE/g'
```
文字数を算出するプログラムの実装

count_hiメソッドを実装。

- 対象となる文字列の中から、"hi"という特定の文字列の数を取得すること
- 上記で取得した数を出力すること

```ruby:雛形
def count_hi(str)
  #  処理を記述
end

# 呼び出し例（引数には対象となる文字列を指定します）
count_hi('abc hi ho')
```
```ruby:出力例
count_hi('abc hi ho') → 1
count_hi('ABChi hi') → 2
count_hi('hihi') → 2
```
# scanメソッド
scanメソッドは、対象の要素から引数で指定した文字列を数え、配列として返すメソッドです。
```ruby:例
1 "foobarbazfoobarbaz".scan("ba")
2 => ["ba", "ba", "ba", "ba"]
```

"hi"という文字列がいくつあるか数えて、それを返すよう記述していきます。
```ruby:回答(途中) 
def count_hi(str)
  puts str.scan("hi")
end

# 呼び出し例
count_hi('abc hi ho')
```

２行目に注目すると、count_hiメソッドの仮引数strに格納されている文字列"hi"を取り出すような記述をしています。
この状態では、解答としてふさわしくありません。
問題は、「"hi"という文字列がいくつあるのか」ということなので。
そこで、要素の数を数えてもらうためにlengthメソッドを使います。

```ruby:回答
def count_hi(str)
  puts str.scan("hi").length
end

# 呼び出し例
count_hi('abc hi ho')
```

```
1
```

"hi"の数は１つなので、１が返ってきました。
昔のモデルだけど意外といいよ、癖のない超解像

# 変なアーティファクトがあまり入らない超解像
RealESRGANも強力だけれど、平滑化が強すぎて細部が潰れてしまったり、他のモデルもクッキリはするけれど、アーティファクトが入ってしまったりします。

# RDNは癖がない
なるべくシンプルに、しかししっかり超解像はする、そんな要望に比較的答えていると僕が個人的に思うモデルがRDNです。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3f655596-4712-89c8-3c5e-c9bd258e4674.jpeg width=800>

↓超解像
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6f3f124d-e6b3-b206-98a2-78378d9438be.jpeg width=800>

https://github.com/idealo/image-super-resolution

# 使い方

インストール。

```shell
!git clone https://github.com/idealo/image-super-resolution
%cd image-super-resolution
!python setup.py install
```

推論。

```python
from ISR.models import RDN
import numpy as np
from PIL import Image

img = Image.open('lr.jpg')
lr_img = np.array(img)
rdn = RDN(weights='psnr-small')
sr_img = rdn.predict(lr_img, by_patch_of_size=128)
result = Image.fromarray(sr_img)
result.save('result.jpg')
```

ちなみに、より強力なRDN largeモデル、ノイズ除去モデルと、RRDNGANも用意されています。

```python
rdn_large = RRDN(weights='psnr-large')
rdn_noise = RRDN(weights='noise-cancel')
rrdn = RRDN(weights='gans')
```


🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Bigqueryうっかり大きなクエリ実行防止！

![うっかり.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/2abff759-a89d-ace7-14bc-a51ab5f6abb4.jpeg)

## 概要
Bigqueryプロジェクトでは
思わぬ料金の増大にならないように
プロジェクト全体や個々人にて
実行割り当ての上限が設定されているケースがございます！

つきましては！

上記の制限がかかった状態で
「うっかり膨大なクエリ量を実行！」
なんてした日には
クエリ制限がかかってしまい、次の日まで使えなくなるなんてことが発生します！

プロジェクトに迷惑をかけてしまう結果にならないように
実は個々人で実行量を制限して
「うっかり大きなクエリを実行したときエラー終了する！」
という方法がございます！

## 設定方法

#### 手順


##### 大まかな流れ！
①クエリエディタを開く
②クエリ設定を開きバイト数制限の設定
③実行&結果


##### それでは具体的に！

①割愛

②クエリ設定を開きバイト数を設定

画像詳細！
[こちらより](https://nupwhite.com/posts/tlNs_2-6)


##### 結果まとめ
実行時にエラーとなることを確認

同じクエリエディタ上ではリフレッシュしても設定継続
新規にクエリエディタを表示すると設定は無効化されるので
Bigquey上で長いクエリを書くときに使用するのが最適！

## 参照資料
[BigQuery のコスト管理方法を調べてみた](https://dev.classmethod.jp/articles/bigquery-cost-manage-module/)
[公式ドキュメント割り当て](https://cloud.google.com/bigquery/quotas?hl=ja)
[Rails]アプリの雛形作成について

Rails アプリの雛形作成についてまとめます

## rails new コマンド
Railsで新規アプリケーションを作成する際に使用します。このコマンドを実行することで、Railsアプリケーションの雛形が作成されます。
```ruby 
# Railsアプリケーションを作成
% rails new アプリケーション名
```
rails newコマンドで雛形を作成するときには、以下の2つの指定を行います。

-使用するRailsのバージョンの指定
-オプションの指定

### 使用するRailsのバージョンの指定
```ruby 
# Railsのバージョンを指定してアプリケーションを作成(6.0.0の場合)
% rails _6.0.0_ new アプリケーション名
```
### オプションの指定
```ruby 
# オプションを付けてアプリケーションを作成
% rails _6.0.0_ new アプリケーション名 -オプション名
```
 
###  -dディーオプション
作成するアプリが利用するデータベースの管理システムの種類を指定できます。
```ruby 
# データベース管理システムにmysqlを指定
% rails new アプリケーション名 -d mysql
```

## 例えば
```ruby 
# Railsのバージョン6.0.0を用いて、FirstAppを作成
% rails _6.0.0_ new first_app -d mysql
```
となります。

## データベースの作成
コマンドを利用して、アプリケーションで使用するデータベースを作成

### database.ymlの編集
Railsアプリケーションのデータベースの設定ファイル
※configというディレクトリ内にあり
　database.ymlを編集することで、データベースの設定を運用環境ごとに変更できる仕組みになっています。

データの保存形式を変更するためにこの作業を行います。
defaultの下にencoding: utf8mb4という記述があるので、こちらをencoding: utf8へ変更
※Ruby on Railsのこちらのバージョンでは、データの保存形式が絵文字等に対応したものの、自動生成されるマイグレーションでは絵文字対応を想定しておらず、互換性がないため

```ruby
 # encoding: utf8mb4
  encoding: utf8
```
### コマンドを実行してデータベースを作成
```ruby 
# データベースの作成
% rails db:create
```

## ブラウザでアプリを確認
```ruby
# ローカルサーバーを起動
% rails s
```
http://localhost:3000 へアクセス

![スクリーンショット 2022-11-23 20.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850786/dcc34b5e-bbc3-a1a8-394d-ad0c6f13e7fa.png)
Googlecolabを用いて気になるあの人が朝型か夜型か機械学習で予測させてみた


# はじめに



私はお仕事で、顧客（お医者さん）にメールを送ることがあるのですが、

「あれ、この医師は朝型なのか、夜型なのか・・？
どのタイミングでメール送ったらより開封してくれるのだろうか・・」

と悩むことがあります。


ということで、
事前情報をもとに、気になるあの人が朝型か夜型か機械学習を用いて予測してみました！


# 事前準備

### 表形式であらかじめわかっている18名の情報をcsvファイル化

日本語で入力していたら途中でエラーが起きたので、今回は数字に直しました。。

　性別　１＝女　２＝男　　　　　　　
診療科　１＝内科　２＝外科

![morningornightimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866856/aa305ca5-e6b3-f10d-a2de-c27b23e8bcdd.png)


これをもとに、機械に傾向をつかませます。


# Googlecolabを使用し、コード入力

①まずはマウント

```
from google.colab import drive
drive.mount('/content/drive')
```

②pandsインポート

```
import pandas as pd
```

③csvファイル読み込み

```
df = pd.read_csv('/content/drive/MyDrive/pandascsv/mornignornight.csv')
df.head(3)
```

![colab1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866856/628074ec-fa88-05e2-d7bb-0c6ee19bfb68.png)


ちゃんと読み込めている。


### データの前処理
④特徴量を指定

```
xcol = ['性別','診療科','年代']
x = df[xcol]
x
```

![colab2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866856/5606ab51-926c-de8f-4c9b-0eb80bc08a06.png)


特微量についてはこの記事がわかりやすかったです。

https://www.sbbit.jp/article/cont1/76066#head2






⑤正解データを指定

```
t = df['朝型か夜型か']
t
```
![colab3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866856/799635be-fcf0-bc1b-8623-a237be4b1e47.png)


### モデルの準備、そして実行（学習）
⑥モデルを学習させる

```
from sklearn import tree

model = tree.DecisionTreeClassifier(random_state=0)

model.fit(x, t)
```

エラーが出ていなければOK

### 予測
⑦予測させるのは、Aドクターで、
　性別：女性、診療科：内科、年代：40代
　女性は１　内科は１　だったため、数字で情報を入力。

```
#Adrは女性・内科・40代
Adr = [[1 ,1 ,40 ]]

model.predict(Adr)
```

![colab4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866856/87327ebd-7408-93e2-65e8-62d00d60c57a.png)


__夜型って書いてある！！！__

ということで、
__夜にメール送ろう...__
自分の仕事にいかすことができそうです！



# 最後に

もっと情報量多ければ、より正確なものができると思いますし、
朝型夜型の２択だけではなく、細かく1時間単位とかで比較的空いている時間を予測させてみても面白いかも！！と思いました。

また、気になるあの人は
「インドア派なのか、アウトドア派なのか・・・」「きのこの山派なのか、たけのこの里派なのか・・・」
「白米かパンか麺何が好きな傾向があるのか・・」
など事前情報さえあれば、予測がさまざまにできるかもです。


これ、本当に簡易的な情報だけでやってみましたが、
当初、__機械学習ってなんぞや...__ と、ちんぷんかんぷんだった私も、
自分でGoogleコラボでコード入力してみたら予測の流れが少し理解できた気がしました！:muscle:
MkDocsで簡単サイト作成

# はじめに
簡単に共有用のサイトを作りたいけど、htmlやcss,jsを書くのはめんどくさいし、Markdownでちゃちゃっと書いてそれなりの見た目で公開できないかな。と思いませんか？

MkDocs(+ Material for MkDocs)で可能だったのでまとめます。

https://www.mkdocs.org

https://squidfunk.github.io/mkdocs-material/

# デモサイト

https://ppspps824.github.io/mkdocs_sample/

# 導入

```bash:bash
pip install mkdocs
pip install mkdocs-material
```

# 新しいPJを作成

```bash:bash
mkdocs new .
```

以下のような感じになります。


```bash:フォルダ構成
.
├─ docs/
│  └─ index.md
└─ mkdocs.yml
```


# 設定
下記のように記載するとマテリアルテーマを利用できます。
```yml:mkdocs.yml
theme:
  name: material
```
※その他機能を有効にするにはこちらのファイルに追加していく必要があります。

# 使い方

index.mdに記載をしていきます。(ファイル名は任意で問題なし)
複数ページ作りたい時は複数ファイルを作るだけで自動で目次リンク付きのサイドバーを生成してくれます。

```markdown:sample.md
# サンプルページです

## MkDocs便利！

```



基本的にはリファレンスページの通りで問題ないですが、一部スポンサーのみ(15ドル/月の援助※)の機能があるので注意です。

個人的にはGridが使えないのが痛いですね。。(14,000ドルに到達すれば開放される模様。現在9,900ドル。。※)

※いずれも2022/11/22現在


https://squidfunk.github.io/mkdocs-material/reference/#setting-the-page-description


https://squidfunk.github.io/mkdocs-material/insiders/#how-to-become-a-sponsor

# ローカルサーバで確認
```bash:bash
mkdocs serve
```

# ビルド(htmlなど、各種ファイルの生成)
```bash:bash
mkdocs build
```


# GitHubPagesにデプロイする
専用コマンドが用意されています。

```bash:bash
mkdocs gh-deploy
```



# Tips
独自のCSS,JSを利用したい場合は以下を追加
(階層とファイル名は任意に設定可能)



```yml:mkdocs.yml
extra_css:
  - stylesheets/extra.css
extra_javascript:
  - javascripts/extra.js
```
また、マークダウンファイルの中にhtmlも書けるので、MkDocksの機能を使いつつ自由度の高いサイト作りも可能です。