OmniAICreator/Qiita-1.07M huggingface dataset:
日記；回すだけⅣ ② ラズパイ＋EPOS4、C++でプログラミング＜車体の用意＞

　二つのモータを使って車を作ります。とりあえず、電池は積まずに車輪を動かすところを中心に進めたいと思います。
### MAKEBlock
　現在は市販されていないようですが、[MAKEBlock](https://store.makeblock.com/)の製品（二個のステッピングモータを使ってお絵かきするロボット）をばらして、アルミの板などを利用しました。
　モータのマウントです。取り付けねじ穴は開け直しました。
![IMGP1123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/643c1d0b-fa6b-d5f1-1f89-69389b9b5390.png)
　モータを取り付けた様子です。
![IMGP1124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/37e80fed-06a3-c7c5-a0e4-2adc56f62547.png)

　組み立てたフレームです。
![IMGP1132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/cb142dce-72ee-41d2-0945-c35fd614767d.png)
　裏から見た様子です。
![IMGP1134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/4153b050-cfe8-42dc-9493-92f387447db7.png)

　モータの軸は6Φだったので、タイヤの代わりに、
　　Pololu社のユニバーサルアルミ6mmマウントハブ（4-40）
　　Pololu社のホイール90 × 10mmブラック（ペア）
を取り付けました。

### コントローラとラズパイの取り付け
　コントローラEPOS4を2台とラズパイ4を。加工がらくなガラス・エポキシのユニバーサル基板上にねじ止めしました。
![IMGP1138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e3146c39-56bc-c5f6-7fa6-d09f480ea4bc.png)
　仮止めしました
![IMGP1140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/50d064ab-dbe2-b77a-d457-d147a01cf41f.png)



##### 目次
- [① ラズパイ＋EPOS4、C++でプログラミング＜準備＞](https://qiita.com/jamjam/items/f6acf1128c6020b27059)
- [② ラズパイ＋EPOS4、C++でプログラミング＜車体の用意＞](https://qiita.com/jamjam/items/a9d400baaa5909bb0885)
- [③ ラズパイ＋EPOS4、C++でプログラミング＜モータのチューニング＞](https://qiita.com/jamjam/items/9266eb684d8a2bec7ac6)
- [④ ラズパイ＋EPOS4、C++でプログラミング＜モータのチューニング2＞](https://qiita.com/jamjam/items/93a57e9356bb1f9d1e6a)
- [⑤ ラズパイ＋EPOS4、C++でプログラミング＜ライブラリの準備＞](https://qiita.com/jamjam/items/be97d25e90c7aa9b92c5)
- [⑥ ラズパイ＋EPOS4、C++でプログラミング＜オブジェクト・ディクショナリを読み出す＞](https://qiita.com/jamjam/items/0cd6c5363c851c3c0e3c)
- [⑦ ラズパイ＋EPOS4、C++でプログラミング＜モータの回転 PPM＞](https://qiita.com/jamjam/items/725047121f582bb30937)
- [⑧ ラズパイ＋EPOS4、C++でプログラミング＜モータの回転 CSP その1＞ベータ版](https://qiita.com/jamjam/items/d58bf9affbd980e1735b)
- [⑨ ラズパイ＋EPOS4、C++でプログラミング＜モータの回転 CSP その2＞ベータ版](https://qiita.com/jamjam/items/ea611e552c5787ed5de0)
Prism コードサンプル学習：23-RegionMemberLifetime

# Prism コードサンプル学習：23-RegionMemberLifetime

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/59ad05f70c10caa4fe75>

## 23-RegionMemberLifetime

本サンプルは、ボタンを押下することでViewA, ViewBを生成できるサンプルになっており、ViewAはひとつだけ生存するように、ViewBはいくつでも生成できるようになっています。
ViewAではIRegionMemberLifetimeインターフェイスを実現しているところがポイントです。
IRegionMemberLifetimeインターフェイスは、KeepAliveプロパティのみを持っています。

```cs
...

namespace ModuleA.ViewModels
{
    public class ViewAViewModel : BindableBase, INavigationAware, IRegionMemberLifetime
    {
        ...

        public bool KeepAlive
        {
            get
            {
                return false;
            }
        }

        ...
    }
}
```

今回のサンプルでは、このKeepAliveプロパティがどのように使われているか分からないため、その部分を読み進めようと思います。
利用箇所を探すと[RegionMemberLifetimeBehavior](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/Behaviors/RegionMemberLifetimeBehavior.cs)クラスで利用されていました。
[ShouldKeepAlive](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/Behaviors/RegionMemberLifetimeBehavior.cs#L76)メソッド内でViewまたはViewModelにIRegionMemberLifetimeインターフェイスが実現されているか確認し、もし実現されていればその値を返すようになっています。
もし、未実現の場合は必ずtrueが返ります。
上記メソッドは[OnActiveViewsChanged](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/Behaviors/RegionMemberLifetimeBehavior.cs#L68)イベントハンドラ、つまりアクティブなビューが切り替わるたびに呼び出されます。非アクティブなビューをすべて走査し、不要であれば削除してしまいます。

ちなみに、RegionMemberLifetimeBehaviorは[PrismInitializationExtensions](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/PrismInitializationExtensions.cs#L56)クラスで初期化時に登録されています。
この登録されたBehaviorは[RegionAdapterBase](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/RegionAdapterBase.cs#L90)クラスでアタッチされます。RegionAdapterBaseクラスは各種コントロールのベースクラスになるため、大体のコントロールはこの仕組みを利用できるはずです。

## おわりに

今回は、IRegionMemberLifetimeインターフェイスを実現し、ビューの生存区間を制御するサンプルを見ていきました。
ビューの生存区間を適切に管理することができれば、軽快に動作するアプリが作れそうです。
次回、[24-NavigationJournal](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/24-NavigationJournal)について見ていこうと思います。
pythonでのsqlite3データベース作成

# 目的
SQLiteでデータベース、テーブルの作成、編集をしてみたかったので、試してみました。
後に記事にしますが、これを使用して、物品管理ができるプログラムを作成していきます。

# 開発環境
Python version:3.9.7
OS: windows 10.0

# プログラム
データベース名は、```book_list.db```、テーブル名は、```bookitems```にしています。
```make_table```では、テーブルの作成と値の設定しています。```reset_status```では、デーブル内で設定したstatusを初期状態に戻す操作をしています。この操作は、```bookitems```が作成されていない時に実行すると走行するようにしています。

```make_db.py
import sqlite3

def make_table(cur):
    # make the table
    cur.execute(
        'CREATE TABLE bookitems(name TEXT , code INTEGER, status INTEGER)'
    )
    
    # Data registration
    inserts = [
        ("あいうえお",10001, 0),
        ("かきくけこ",10002, 0),
        ("さしすせそ",10003, 0),
        ("たちつてと",10004, 0),
        ("なにぬねの",10005, 0),
        ("はひふへほ",10006, 0),
        ("まみむめも",10007, 0),
        ("やゆよ",10008, 0),
        ("らりるれろ",10009, 0),
        ("わをん",10010, 0)
    ]
    # execute many data 
    cur.executemany('INSERT INTO bookitems values(?, ?, ?)', inserts)
    cur.close()
    
def reset_status(cur):
    cur.execute('UPDATE bookitems SET status = "0" ')
    cur.close()    

def main():
    
    # connect database
    dbname = 'book_list.db'
    conn = sqlite3.connect(dbname)
    
    # make cursor to operate SQlite
    cur = conn.cursor()
    
    #check if the table exist the table 
    cur.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='bookitems' ''')
    if cur.fetchone()[0]==1:
        reset_status(cur)
    else:
        make_table(cur)
        
    conn.commit()   # commit 
    conn.close()    # close data base

if __name__ == '__main__':
    main()

```

# DB Browser
作成した```book_list.db```は、DB Browser for SQLiteで操作すると、編集がしやすいです。
使い方は、[こちら](https://www.dbonline.jp/sqlite-db-browser/)を参照してください。

# 参考リンク
下記サイトを参考にさせていただきました。

[PythonからSQLiteを操作する方法](https://products.sint.co.jp/topsic/blog/how-to-use-sqlite-in-python)
[python3でsqlite3の操作。作成や読み出しなどの基礎。](https://qiita.com/saira/items/e08c8849cea6c3b5eb0c)
PostgreSQL を Docker で使うときの注意点

# はじめに
公式ドキュメントをちゃんと読めば問題ないのだけど、
個人的にハマったので備忘録として

# 注意点

* `volume` としてマウントするパスは `/var/lib/postgresql/data`
* `PGDATA` に指定するパスは `/var/lib/postgresql/data/pgdata`

## サンプル

* Docker
```bash
$ docker run -d \
	-e PGDATA=/var/lib/postgresql/data/pgdata \
	-v ./data:/var/lib/postgresql/data \
	postgres:14.2-alpine
```
* Docker compose
```yaml
version: '3.8'
services:
  db:
    image: postgres:14.2-alpine
    volumes:
      - db-postgres:/var/lib/postgresql/data
    environment:
      PGDATA: /var/lib/postgresql/data/pgdata
volumes:
  db-postgres:
```

# 理由
Postgresの Docker ファイルで `VOLUME` 命令で `/var/lib/postgresql/data` が指定されているので、
このパス以外でマウントするとデータが上手く保存されないことがある。
Docker composeでは問題ないが、Kubernetes などのコンテナサービスでボリュームをマウントしたときに、

```bash
:/ on /var/lib/postgresql type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.3.3.235,local_lock=none,addr=10.3.3.237)
/dev/nvme0n1p1 on /var/lib/postgresql/data type xfs (rw,noatime,attr2,inode64,noquota)
```

のようになり、データが保存されない。

`PGDATA` のパスは、`/var/lib/postgresql/data/` 配下であれば `/var/lib/postgresql/data/db` などでも問題ない。

# 参考
https://github.com/docker-library/postgres/blob/master/14/alpine/Dockerfile#L155

https://hub.docker.com/_/postgres
WordPressのローカル環境 Local By FlyWheelで[404 Not Found][Pow is installed]が出て焦ってる人

初めて　Local By FlyWheelをインストールしました。
参考サイト　URL：https://webst8.com/blog/wordpress-local-by-flywheel/
![スクリーンショット 2022-06-03 18.53.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/ed004a8a-9332-50ce-f921-87691803f496.png)
「WP Admin」「Open Site」を開くと下記のとおり。
![スクリーンショット 2022-06-03 18.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/d2de6622-7c13-de48-4972-6dcaf26af1dc.png)
![スクリーンショット 2022-06-03 18.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/097edc0d-c0cb-cf3e-f058-748e86a08d4c.png)
そもそも「Pow」って何？ってレベル:thinking:
色々調べていると、以前入れたHomebrewが関係している可能性あり。

Homebrewを削除しました。
```ruby:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```
参考サイト　URL:https://macgarage.jp/homebrew-uninstall/

それでも直らず、Macそのものを再起動。
![スクリーンショット 2022-06-03 19.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/217aeb40-6d1f-a48d-2614-6a56bab32632.png)
![スクリーンショット 2022-06-03 19.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/d6c0a5e8-7c7b-6fa3-249e-417111a30519.png)
出てきました！

「ちゃんと学ぶ、WordPress テーマ開発講座」の最初からぶつかり、心折れかけました:sweat_drops:

どなたかのお役に立てれば幸いです:relaxed:
バーグ・ザッカーマーク with Elm


https://qiita.com/mattn/items/e5dc5cdaed97128b5ad6

Elmで作ってみる。
[前回](https://ellie-app.com/7jDRx7j3kNMa1)はリストのシャッフルを楽にやってしまったので、今回は自作してみた。

[デモ](https://codesandbox.io/s/flamboyant-orla-7wcojr?file=/src/Main.elm)

```elm
module Main exposing (main)

import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)
import Random


type alias Model =
    { value : String }


initialModel : flag -> ( Model, Cmd Msg )
initialModel _ =
    ( { value = "マーク・ザッカーバーグ" }, generateMZ )


type Msg
    = Generate
    | Generated String


mzCharacters : List String
mzCharacters =
    [ "マ", "ク", "ザ", "カ", "バ", "グ" ]


fixedCharacters : List String
fixedCharacters =
    [ "ー", "・", "ッ", "ー", "ー" ]


foldMZ : List String -> String
foldMZ generatedChars =
    foldMZ_ generatedChars fixedCharacters


foldMZ_ : List String -> List String -> String
foldMZ_ generated fixed =
    case ( generated, fixed ) of
        ( [], _ ) ->
            ""

        ( x :: xs, [] ) ->
            x

        ( x :: xs, y :: ys ) ->
            x ++ y ++ foldMZ_ xs ys


shuffleList : List a -> Random.Generator (List a)
shuffleList ls =
    shuffleList_ ls
        |> Random.map (List.sortBy Tuple.second >> List.map Tuple.first)


shuffleList_ : List a -> Random.Generator (List ( a, Float ))
shuffleList_ ls =
    case ls of
        [] ->
            Random.constant []

        x :: xs ->
            Random.map2 (::) (Random.pair (Random.constant x) (Random.float 0 1)) (shuffleList_ xs)


mzGenerator : Random.Generator String
mzGenerator =
    shuffleList mzCharacters
        |> Random.map foldMZ


generateMZ : Cmd Msg
generateMZ =
    Random.generate Generated mzGenerator


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        Generate ->
            ( model, generateMZ )

        Generated newValue ->
            ( { model | value = newValue }, Cmd.none )


view : Model -> Html Msg
view model =
    div []
        [ div [] [ text model.value ]
        , button [ onClick Generate ] [ text "Generate" ]
        ]


subscriptions : Model -> Sub Msg
subscriptions _ =
    Sub.none


main : Program () Model Msg
main =
    Browser.element
        { init = initialModel
        , view = view
        , subscriptions = subscriptions
        , update = update
        }
```
Next.js開発でよく使うキャッシュ削除コマンド備忘録

## 記事の目的

[Next.js](https://nextjs.org/) × [TypeScript](https://www.typescriptlang.org/) での開発に挑戦中なのですが、
キャッシュ関連でトラブる事が多いので勉強・備忘録としてよく使うコマンドをまとめました。

## コマンド
* `npm cache clean --force`
  * npmキャッシュの削除コマンド
  * 場合によっては `rm -rf ~/.npm`　など直接キャッシュ置き場を削除する(環境によって場所が異なる場合がある)
  * 詳しくはこちら https://docs.npmjs.com/cli/v7/commands/npm-cache

* `rm -rf .next/cache`
  * nextのキャッシュ削除
  * image serverで持っている画像のリフレッシュをする場合などはこれをよく使う

* `npx tsc --build --clean`
  * typeScriptのコンパイラのキャッシュ削除
  * `tsconfig.json`などtypeScriptの設定をいじった際にトラブった場合はこちらが有効
  * https://www.typescriptlang.org/docs/handbook/compiler-options.html

* `rm -rf node_modules`
  * `npm install` などでインストールされたライブラリを丸ごと削除
  * パッケージのアップデートなどで詰まった際に有効

## その他参考リンク
* https://docs.npmjs.com/cli/v7/commands/npm
* https://ticklecode.com/npmcachedelete/
シグマ光機(OptoSigma)製コントローラをシリアル通信で制御してみる

# 1.概要
シグマ光機(OptoSigma)の3軸ステージHSC-103を自動で駆動させたい気持ちが沸々と湧き起こってきました。
Pythonが第一言語の私はシリアル通信ライブラリのpyserialと組み合わせたいと思いました。

まずは説明書を読んでみましょう。
https://jp.optosigma.com/ja_jp/hsc-103.html
取り扱い説明書にコマンド集があるので参照します。

環境：
OS: Windows10
Python 3.6.8

# 2.コマンド一覧
色々とありますが、うまくコマンドが打てていれば`OK\r\n`、間違っていれば`NG\r\n`が返ってきます。
## 2-1.Qコマンド
`Q:\r\n`
現在の座標をパルス数で返してくれます。
1パルスは0.01μmに該当します。
## 2-2.Mコマンド
`M:x,y,z\r\n`
相対位置をパルス数で指定して駆動します。
x, y, zは各軸の移動量で、1パルスあたり0.01μm進みます。
## 2-3.Aコマンド
`A:x,y,z\r\n`
絶対位置をパルス数で指定して駆動します。
x, y, zは各軸の移動量で、1パルスあたり0.01μm進みます。
## 2-4.Kコマンド
`K:1,2,3,x,y,z\r\n`
直線補完駆動です。相対位置で指定をします。
Mコマンドと何が違うのかというと、全軸で同時に到着するということだと思います（未確認）。
x, y, zは各軸の移動量で、1パルスあたり0.01μm進みます。
## 2-5.Jコマンド
`J:±,±,±\r\n`
各軸で`+`または`-`または虚無を指定します。
`+`なら止まれと言われるまで正方向に、`-`なら止まれと言われるまで負方向にバカみたいに進み続けます。
虚無を指定すれば特に動きません。
## 2-6.Lコマンド
`L:1,1,1\r\n`
`1`を指定すると止まります。`0`を指定すると止まりません。
`0`は省略可能です。
`L:E`とすると緊急停止できます。便利ですね。
## 2-7.Dコマンド
`D:axis,start,final,rate\r\n`
速度指定のコマンドです。
軸、初速度、最大速度、最大速度に到達するまでの時間を指定します。
初速度・最大速度は、1パルスあたり0.01μmで、パルス毎秒で指定します。最大4,000,000です。
時間はms単位です。
# 3.シリアル通信
## 3-1.pyserialのインストール
`pip install pyserial`
## 3-2.ポートを開く
```Python
import serial
ser = serial.Serial('COM6', 38400)
ser.close()
```
COMポートはデバイスマネージャーから確認しておきましょう。
BaudRateはHSC-103なら38400です。
`ser.close()`はした方が良いでしょう。
closeしないとどんな問題が起こるのかは私もよくわかっていません・・・。
## 3-3.コマンドの送受信
```Python
import serial
ser = serial.Serial('COM6', 38400)
command = 'Q:\r\n'
ser.write(command.encode())
msg = ser.readline()
print(msg.decode())
ser.close()
```
Qコマンドで座標を聞いています。
コマンドが間違っていると`NG\r\n`が返ってきます。
**`ser.readline()`を使った方がいいです。**
`ser.read()`や`ser.read_all()`などのメソッドもありますが、返信が返ってきていないタイミングでreadしても何も読めません。
`readline()`で`\r\n`が返ってくるまで待つのが良いです。
ただ、通信に不具合があるような時に永遠に待ち続けるハチ公になってしまう恐れはあるので、タイムアウトの措置は必要でしょう。
# 4.おわりに
githubのリンクは[こちら](https://github.com/PlusF/SCANT/blob/main/SKStage.py)。
不備があるかもしれませんが、詳しくは取り扱い説明書をお読みください。
access2000の作法 その18

# 概要
access2000の作法、調べてみた。
二重起動を防止してみた。

# チェックボタンを作る手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く  キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く
```

Private Sub コマンド0_Click()
	CheckMultipleUsers
End Sub
Sub CheckMultipleUsers()
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Set cn = CurrentProject.Connection
    Set rs = cn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
    With rs
        .MoveNext
        If Not .EOF Then
            If .Fields(0) = Environ("COMPUTERNAME") Then .MoveFirst
            MsgBox "すでに起動されてるので終了します。"
            DoCmd.Quit
        End If
        .Close: Set rs = Nothing
    End With
End Sub
```
- フォームを閉じる
- 保存する


以上。
[UE] 1Tickのデルタタイムを制限する(​Max Undilated Frame Time)

リアルタイムアプリケーションは1秒間に数十～数百の"Tick"を繰り返してなめらかなレンダリングを行っています。
プレイ間隔が良くなるためこのTickの間隔(=デルタタイム)は可能な限り一定になることが望ましいのですが、負荷の変動などによって目的のデルタタイム内に収めることができなくなることがあり、アプリケーションの更新処理にその時間に合ったデルタタイムが渡されて進行速度の帳尻を合わせます。
大半の動作はデルタタイムが変動しても大きな問題なく動作しますが、一部の処理、例えば物理シミュレーションやコリジョン、オーバーラップの判定などはデルタタイムによって望ましい挙動が得られなくなることがあります。

特定の操作でわざとこの状況を作り出して悪用したり、アプリケーション外の負荷によってプロセッサのリソースが奪われてパフォーマンスが低下し結果としてイベント未発などの進行に影響を与えるバグが発生する可能性もあり、アプリケーション側で対策が必要になることがあります。

# ​Max Undilated Frame Time
アンリアルエンジンは"​Max Undilated Frame Time"としてアプリケーションが正しく動作するために最大で許容できるデルタタイムの上限値の設定がWorldSettingsの中にあります。
デフォルトの設定値は0.4秒(つまり2.5fps)となっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/a1e12ce8-5b1c-cdb1-9402-6434d8c87fca.png" width=450 />

例えば15fpsまでならば動作に支障がないのであればこの値を1/15秒 (0.666秒)に設定します。

以下動作例です。
120fps出る状態で​Max Undilated Frame Timeを240fps相当に設定しているので、進行速度が半分になっていることがわかります。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr">MaxUndelitedFrameTime <a href="https://t.co/yvioiiXYpu">pic.twitter.com/yvioiiXYpu</a></p>&mdash; Takashi.Suzuki (@wankotank) <a href="https://twitter.com/wankotank/status/1532647532274233344?ref_src=twsrc%5Etfw">June 3, 2022</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ジャンケンの勝敗判定プログラム【Java】

# 1.はじめに

こんにちは、坂内太一です。今回は僕が新入社員研修で実際に出された課題の類似問題を自分自身のアウトプットも兼ねて解説していきます。
最後まで読んでもらえたら嬉しいです。

# 2.問題内容

Aさん、Bさんが5回ジャンケンを行い、勝ちが2点、あいこが1点、負けが0点で最終的に誰が一番得点が多いかを判定するというものです。
非常にポピュラーな問題ですが他のプログラムと違い3すくみを判定するのに僕自身少し悩んだこともあり、解説付きのコードを書いたのでシェアしようと思います。

# 3.解説入りのコード

~~~ Main.java
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		//2人のプレイヤーの定義
		int player1 = 0;
		int player2 = 0;
		
		//キーボードから入力を受けるためのscanner
		Scanner scanner = new Scanner(System.in);
		
		//ジャンケンを5回繰り返すためのfor文
	    for(int i = 0; i <= 4; i++) {
	   
	    //各プレイヤーにキーボードから出す手を入力してもらう
			System.out.println("プレイヤー１：あなたの出す手を入力してください グー:a チョキ:b パー:c");
			String hand1 = scanner.nextLine();
			
		    System.out.println("プレイヤー2:あなたの出す手を入力してください グー:a チョキ:b パー:c");
		    String hand2 = scanner.nextLine();
		    
		//勝てば2点、あいこは1点、負ければ得点は無し
		//今回はif文を使って全てのパターン(7パターン)を処理する
        //処理が終わるたびにそれぞれのプレイヤーに得点が入る
		   if(hand1.equals("a") && hand2.equals("b")) {
		    	System.out.println("プレイヤー１の勝ちです");
		    	player1 += 2;
		    }else if(hand1.equals("a") && hand2.equals("c")) {
		    	System.out.println("プレイヤー2の勝ちです");
		    	player2 += 2;
		    }else if(hand1.equals("b") && hand2.equals("a")) {
		    	System.out.println("プレイヤー2の勝ちです");
		    	player2 += 2;
		    }else if(hand1.equals("b") && hand2.equals("c")) {
		    	System.out.println("プレイヤー１の勝ちです");
		    	player1 += 2;
		    }else if(hand1.equals("c") && hand2.equals("a")) {
		    	System.out.println("プレイヤー１の勝ちです");
		    	player1 += 2;
		    }else if(hand1.equals("c") && hand2.equals("b")) {
		    	System.out.println("プレイヤー2の勝ちです");
		    	player2 += 2;
		    }else if(hand1.equals(hand2)) {
		    	System.out.println("あいこです");
		    	player1++;
		    	player2++;
		    }
		}
		 
	    scanner.close();
		
	    //各プレイヤーの得点を比較して最終的な結果を判定する
		if(player1 > player2) {
	    	System.out.println("この勝負プレイヤー１の勝ちです");
	    }else if(player1 < player2) {
	    	System.out.println("この勝負プレイヤー2の勝ちです");
	    }else {
	    	System.out.println("この勝負引き分けです");
	    }	
	}
}


~~~

# 4.まとめ

僕は全てのパターンを記述しましたが同期は僕より少ない行でより簡単に記述していたので僕自身もこれから経験を積んでいく中でレベルアップしてより少ない行で綺麗に記述できるように努めていこうと思います。
Ktorを使ってみた（Mac環境構築、Hello World!編）

# はじめに
サーバーサイドのバックエンド作成では、いろいろなフレームワークを選択できますが、
今回はAndroid開発者大好き💕Kotlinが使えるKtorを使ってみようと思います😁


# 環境
- macOS Monterey Ver12.3.1
- IntelliJ IDEA 2022.1.2 (Community Edition)

# 手順
- IntelliJ IDEA 2022.1.2 (Community Edition)のインストール
[IntelliJ IDEA](https://www.jetbrains.com/ja-jp/idea/) の「ダウンロード」から無料のCommunity版をダウンロードします。

- プロジェクト作成
Ultimate版は[Ktor plugin](https://ktor.io/docs/intellij-idea.html#install_plugin)を導入して新規プロジェクトを作成すればいいのですが、Community版では`Ktor plugin`は導入できないようです。
なので、[Ktor Project Generator](https://start.ktor.io/#)というProject Generatorを使ってプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57275/d9228952-7b4e-2b66-1b78-14feda767090.png)
Project Nameは好きに付けましょう。
今回は`ktor-sample`としました。
`Adjust project settings` は変更しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57275/c6ffadc9-c069-289f-62a2-1158e0d538d6.png)

`Add plugins` を押下すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57275/edc995b5-ccfa-31ca-c497-269a2a6696f9.png)
のように展開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57275/30909966-d983-f84b-c1fc-d2d00ff93262.png)

今回は`Routing`をaddして`Generate project`をポチります。
※ 何もaddしないでGenerateすると後で自前でいろいろ修正することになるので注意。
すると`ktor-sample.zip`がダウンロードされるので、お好きなフォルダで解凍してください。
解凍した`ktor-sample`フォルダを`IntelliJ IDEA`で開いて見ましょう。

- 実行
`Application.kt`の`fun main()`の左側に▶マークついています、これをクリックするとメニューが展開されます。
この`Run ApplicationKt`を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57275/a80b8f8a-4ba0-631d-f303-8cb0f2138ddc.png)
ビルドが終わってから`http://0.0.0.0:8080`へアクセスすると、ブラウザに「Hello World!」が表示されるハズです。

# 最後に
とりあえず、今回はここまで。
次は、RESTful APIを作ってみようと思います。
【UE5】Common UI の地味に面倒なPIEバグの対策

## この記事に書かれていること

- UE5.0.2 時点での内容
- Common UI とは
- Common UI のPIEバグ
- ↑ の対策方法

## この記事に書かれていないこと

- Common UI の導入方法
- Common UI の使い方


# Common UI とは？

Common UI プラグインは、確認画面等のゲームのメニュー階層や、入力ボタンアイコンの管理と表示、タブボタン切り替え等の、主にゲームパッドでUIを操作する際の共通のUI機能をまとめたプラグインです。

https://docs.unrealengine.com/5.0/ja/common-ui-plugin-for-advanced-user-interfaces-in-unreal-engine/

UE5 で正式版として登場し、先述した通り（特にマルチプラットフォーム対応において）機能的にとても優秀なものとなっています。

# Common UI のPIEバグとは？

今後修正される内容だと思われますが、 **地味にストレスの貯まるバグ** です。

PIE 中、ゲームパッド操作状態で（`Quit Game` 関数などで）ゲーム終了を行った場合、エディタ上でマウスが消え、以降いくつかのマウス操作に影響がでてしまうという厄介なバグです。
前者は別ウィンドウを一度アクティブにすれば解消されますが、後者は再度 PIE でキーボード操作上で終了させるまで残り続けてしまいます。

この記事ではそのバグの対処をエンジン（プラグイン）コードを弄らずに行う方法です。

# バグ対策コード

以下のコードを、 PIE 終了時に処理させます。ここでは `UCommonGameViewportClient` を継承し、ビューポートがデタッチされる時に処理しています。

:::note warn
プロジェクト設定→エンジン→基本設定→ゲームのビューポートクライアントクラス に以下のクラスを指定することを忘れないでください。
:::

```cpp:MyGameViewportClient.h
#pragma once

#include "CoreMinimal.h"
#include "CommonGameViewportClient.h"

#include "MyGameViewportClient.generated.h"

UCLASS(BlueprintType)
class MYPROJECT_API UMyGameViewportClient : public UCommonGameViewportClient
{
	GENERATED_BODY()

public:
	UMyGameViewportClient();

	virtual void DetachViewportClient() override;

};
```

```cpp:MyGameViewportClient.cpp
#include "MyGameViewportClient.h"

UMyGameViewportClient::UMyGameViewportClient()
	: Super(FObjectInitializer::Get())
{
}

void UMyGameViewportClient::DetachViewportClient()
{
	Super::DetachViewportClient();

// バグ対策コード
#if WITH_EDITOR
	// CommonUI を使用する場合、非マウス・キーボード操作状態の時にPIEを終了すると、マウスが表示されない不具合への対処
	{
		FSlateApplication& SlateApplication = FSlateApplication::Get();
		// 1. 戻ってすぐにマウスが非表示（キャプチャやロックがそのまま）になる不具合の対処
		SlateApplication.UsePlatformCursorForCursorUser(true);

		// 2. ブループリントエディタでピンをドラッグするなど、マウスポインタが変化する操作で非表示になる不具合の対処
		if (TSharedPtr<FSlateUser> SlateUser = SlateApplication.GetUser(FSlateApplicationBase::CursorUserIndex))
		{
			SlateUser->SetCursorVisibility(true);
		}
	}
#endif
}
```

このバグは、エディタが管理している `FSlateApplication` クラスの設定ミスにあります。そのため、スタンドアローンゲームやシッピングビルドでは発生しません。
なので、エディタービルド時にのみ処理するように `WITH_EDITOR` で囲んでいます。
Pythonで地理空間情報（GIS）やるために必要なパッケージ全部入りの「geospatial」が便利すぎた

## Mac民にとってはめちゃくちゃ朗報かも

GISをやる人ならわかってくれると思うんですが、MacでPythonを使ってGIS（主にgeopandasなど）をやる時依存関係の解決にかかる時間ヤバすぎ問題っていうのがありまして…

主にGDLAとかGDALとかがかなりやばくて偉大なる先人様のお知恵を拝借して鼻血出しながらなんとかかんとか実行環境を整えていました。

が！！！！！もうそんな必要はないのかもしれませんね！！！！！！

## 早速インストール

Anacondaがインストールされている前提ですので、こちらの記事を参考にするなどしてインストールお願いします。

[MacでGISデータ分析を始めるためにサクッとAnacondaとjupyter labをインストールしてみる](https://qiita.com/nokonoko_1203/items/3b5ceb911af6b22a449f)

で、インストールはこれだけ。

```bash
conda install -c conda-forge geospatial
```

この1コマンドでインストールされるパッケージは以下。

圧巻である。

```
- python >=3.7
- black-jupyter
- bump2version
- cartopy
- cenpy
- codespell
- contextily
- dask-geopandas
- datashader
- earthengine-api
- earthpy
- easystac
- eemont
- eomaps
- folium >=0.12.1
- geemap >=0.13.7
- gemgis
- geoalchemy2
- geocube
- geopandas >=0.10.2
- geoviews
- h3
- h3-py
- here-map-widget-for-jupyter
- hvplot
- ipygany
- ipyleaflet >=0.16.0
- ipynb-py-convert
- ipyvtklink
- jupytext
- keplergl
- laspy
- leafmap >=0.9.3
- lidar
- localtileserver >=0.5.8
- mapboxgl
- movingpandas
- netcdf4
- odc-stac
- osmnx
- owslib
- panel
- palettable
- pillow 
- planetary-computer
- plotly
- proplot
- psycopg2
- pydeck
- pysal
- python-mss
- pyntcloud
- pyvista
- radiant-mlhub
- rasterio
- rasterstats
- rio-cogeo
- rioxarray
- s2cloudless
- sarpy
- satpy
- scholarpy
- sentinelsat
- shapely
- sliderule
- spyndex
- sqlalchemy
- stackstac
- streamlit-folium
- voila
- xarray-spatial
- xmovie
- wxee
```

何がいいかって`geopandas`とか`pillow`とかほんと有名なやつだけじゃなくて、`rio-cogeo`とか`laspy`とか`leafmap`とか`pyvista`とか！

あーそれ日本語の記事一個もないのよねーみたいなマイナーだけどめちゃくちゃ便利なパッケージが沢山入っていて依存関係が全部解消されているところがヤバすぎますね！！！

ちなみに公式サイトでは`mamba`というcondaコマンドより高速でほぼ互換性のあるパッケージマネージャーを利用してインストールしています。
もし前述のコマンドでインストールできなかった場合はこちらのコマンドでインストールできるかもしれません。
mamba: https://github.com/mamba-org/mamba

```sh
conda install mamba -c conda-forge
mamba install -c conda-forge geospatial
```

## 公式はこちら

いきなりインストール方法を紹介してしまいましたが、公式のリポジトリとドキュメントはこちら。

リポジトリ: https://github.com/giswqs/geospatial
ドキュメント: [https://geospatial.gishub.org/](https://geospatial.gishub.org/)

## 結論

多く語ることはありません。

もはやPythonで地理空間情報を始める際の選択肢は一つです。

それほど衝撃のパッケージです。感謝。
xml.etree.ElementTree で XML の基本的なことを少し触ってみる

# 目的
[Windows 10 + Excel2016_x86 VBA で XML の基本的なことを少し触ってみる](https://qiita.com/tabizou/items/10eb832352a6b31888c7)
で使用したXMLファイルをPythonで基本的な操作を実行してみる。

## 対象となるXMLデータ(addr2.xml)

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<results>
    <query>池尻4-35-25 </query>
    <geodetic>wgs1984</geodetic>
    <iConf>4</iConf>
    <converted>池尻4-35-</converted>
    <candidate>
        <address>東京都/世田谷区/池尻/四丁目/３５番</address>
        <longitude>139.673965</longitude>
        <latitude>35.654259</latitude>
        <iLvl>7</iLvl>
    </candidate>
    <candidate>
        <address>兵庫県/伊丹市/池尻/四丁目/３５番地</address>
        <longitude>135.381805</longitude>
        <latitude>34.784988</latitude>
        <iLvl>7</iLvl>
    </candidate>
</results>
```

## Pythonのサンプルコード
基本的な機能を確認してみる

```python
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
# coding:utf-8
# https://docs.python.org/ja/3/library/xml.etree.elementtree.html

import xml.etree.ElementTree as ET

tree = ET.parse('./addr2.xml')
root = tree.getroot()

# textファイルとして表示
# lxml.etree.dump(root) と同じ
print(ET.tostring(root, encoding='unicode')) 

# 以下の２行は同一内容を返す
tree = root.iter('candidate')
tree = root.findall("./candidate")

# 以下のコードで表示される内容
# address 東京都/世田谷区/池尻/四丁目/３５番
# longitude 139.673965
# latitude 35.654259
# iLvl 7
# address 兵庫県/伊丹市/池尻/四丁目/３５番地
# longitude 135.381805
# latitude 34.784988
# iLvl 7

for node in tree:
    print("")
    print(node[0].tag, node[0].text)
    print(node[1].tag, node[1].text)
    print(node[2].tag, node[2].text)
    print(node[3].tag, node[3].text)

for node in tree:
    print("")
    for items in node:
        print(items.tag, items.text)

# 以下のコードで表示される内容
# query 池尻4-35-25 
# geodetic wgs1984
# iConf 4
# converted 池尻4-35-

# candidate
# address 東京都/世田谷区/池尻/四丁目/３５番
# longitude 139.673965
# latitude 35.654259
# iLvl 7

# candidate
# address 兵庫県/伊丹市/池尻/四丁目/３５番地
# longitude 135.381805
# latitude 34.784988
# iLvl 7

print(root[0].tag, root[0].text)
print(root[1].tag, root[1].text)
print(root[2].tag, root[2].text)
print(root[3].tag, root[3].text)
print("")
print(root[4].tag)
print(root[4][0].tag, root[4][0].text)
print(root[4][1].tag, root[4][1].text)
print(root[4][2].tag, root[4][2].text)
print(root[4][3].tag, root[4][3].text)
print("")
print(root[5].tag)
print(root[5][0].tag, root[5][0].text)
print(root[5][1].tag, root[5][1].text)
print(root[5][2].tag, root[5][2].text)
print(root[5][3].tag, root[5][3].text)

# candidate の表示以外は同じ
children = list(root)
for elem in children:
    print(elem.tag, elem.text)
    for items in elem:
        print(items.tag, items.text)
```
# 参考にしたのは以下のサイト
[Excel の WEBSERVICE 関数でジオコーディング](https://qiita.com/frogcat/items/585c7de901c31cf30760)
[xml.etree.ElementTree --- ElementTree XML API](https://docs.python.org/ja/3/library/xml.etree.elementtree.html)
[Windows 10 + Excel2016_x86 VBA で XML の基本的なことを少し触ってみる](https://qiita.com/tabizou/items/10eb832352a6b31888c7)
【備忘録】ルーティングテーブルの優先度


E-kan株式会社の藤尾です。
ネットワークエンジニアをしています。

## これまでの備忘録
以前、自分のためにBGPのベストパス選択の優先度をメモしていましたが、
その時にこんがらかっていたロンゲストマッチの話を整理するために、
今回はルーティングテーブルの優先度について書きます。

>BGPベストパス選択の優先度 | E-kan株式会社 by 藤尾菜摘 #wantedly 
https://www.wantedly.com/companies/e-kan/post_articles/345469?utm_source=t.co&utm_medium=share&lang=ja 

***

## ロンゲストマッチの前に・・・<br>AD(アドミニストレーティブディスタンス)値について

BGPのベストパスとして選ばれた経路情報は、晴れてルーティングテーブルに載るワケですが
同じ宛先の経路が他プロトコルでの比較を勝ち抜いてきていた場合、
今度はルーティングテーブル内でも利用されるかどうかの判断があります。
その判断に使うのがAD値です。
 `つまり、ルーティングテーブルを完成させるための情報。`

下の表がCiscoのデフォルトですが、設定で変更可能です。
Staticで経路を設定した時に、他ダイナミックルーティングより優先させたくない時に
あえて大きい値にしたりした記憶があります。



 **Cisco機器デフォルトのAD値**
|情報源|AD値|
|:--|--:|
|connected|0|
|Static|1|
|EIGRP(集約経路)　　|5|
|BGP(eBGP)|20|
|EIGRP(内部)|90|
|OSPF|110|
|IS-IS|115|
|RIP|120|
|ODR|160|
|EIGRP(外部)|170|
|BGP(iBGP)|200|
|その他|　　255|

AD値は低い数値ほど信頼度が高く、逆に大きい数字(最大255)は信頼度が低いです。
直接繋がっているのが何より強いのは、やはり自分で確かめたモノに勝ることはないという事か。

例えば、
eBGPで0.0.0.0/0のnext hopが「192.168.1.10」
Staticで0.0.0.0/0のnext hopが「192.168.1.1」
となっている時、実際にルーティングテーブルに載るのは
 **0.0.0.0/0 next hop 192.168.1.1**
です。




## ロンゲストマッチの話

`ロンゲストマッチはそもそも、ルーティングテーブル完成後に実際のパケットが来た時にどう判断するかの動作`

ルーティングテーブルに情報が出揃って、実際にパケットが来たとします。
例えば、以下のルーティングテーブル(雑)で
~~~
  route             next hop 
S 0.0.0.0/0         192.168.1.1
S 10.10.10.0/8      192.168.1.2
S 10.10.10.100/30   192.168.1.3
~~~
「10.10.10.102」宛のパケットが来たとき、
ロンゲストマッチは文字通り **『より長く合っている経路情報を使う』** ので
　**10.10.10.100/30   192.168.1.3**
が採用され、192.168.1.3に転送します。


***



ルーティングに関する、色々な値の比較があるけど、
 **プロトコルでの比較 → ルーティングテーブルでの比較 → パケット処理の優先度**
となっていると覚えるといいのかもしれない。
それがこんがらがるという話ですけどね！！！！！
Google chromeの検索したときのURLの意味を知りたかった。

<h1>Google chromeの検索したときのURLの意味を知りたかった。</h1>
なんか昔から、URLバーに表示される。https://www.google.com/search?q=調べたいもの

の後に続く、rlz=1C1TKQJ_jaJP995JP995&oq=rickroll&aqs=chrome.0.69i59j0i512l9.990j0j7&sourceid=chrome&ie=UTF-8
までのものが、何をしているのか知りたかった。
結果、Chromiumのソースにありました。
https://chromium.googlesource.com/chromium/src/+/refs/tags/74.0.3703.0/components/search_engines/prepopulated_engines.json
この中、"search_url": "{google:baseURL}search?q={searchTerms}&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchboxStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:prefetchSource}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}",に表記されていました。
このgoogle:の後のものは、大体検索すれば出るので自力でしましょう
。
デバッグ標準

# パニックになった場合
1. バグが起きた場所を特定する
    1. 異常な出力値を見つける
        - アプリ画面
        - 標準出力
        - 標準エラー出力
        - ジャーナル
        - ロガー
    1. 異常な出力値を読む
        - 時刻
        - スタックトレース
    1. 異常な出力値をインターネットで検索する
        - NOT検索
    1. 異常な出力値をプロジェクトで検索する
    1. メモリー使用量、ディスク使用量、iノード使用量、ソケット使用量、プロファイルを調べる
    1. 分からない単語をインターネットで検索する
    1. ブレークポイントで二分探索する
1. バグを再現させる
    1. 入力値を見つける
    1. 環境を確認する
    1. 入力値と環境を等しくしてデバッグモードで実行する
1. バグの原因を特定する
    1. バグが起きた場所にブレークポイントを設定し、実行して異常な変数値を見つける
        - 変数表
        - デバッグコマンド
    1. 最初に異常な変数値が出た場所を探す
        - デバッグプリント
        - Step over, Step into, Step out
    1. 入力値や環境を少しずつ変えて正常な場合との差を探す
        - コメントアウト
        - 定義に飛ぶ
    1. 言語やAPIの仕様書を読む
    1. 言語やAPIのコードを読む
1. 直す
タグの種類

## ```<p>``` ピータグ
文章を記載する時に使用
```html
<p>...</p>
```

## ```<h1>, <h2>, ..., <h6>``` エイチワン~エイチシックス
```html
<h1>...<h1>
```

## ```<a>```　「アンカー」や「エータグ」
他のページやサイト、ファイルなどにリンクさせる
```html
<a>...</a>
```
##  ```<img>``` イメージタグ
画像を扱う時に使用
```html
<img>...</img>
```

## ```<li>``` リストタグ
箇条書きしたいテキストをこのタグで囲むことによってリストを作ることができる。
```html
<ul>
  <li>..</li>
  <li>..</li>
</ul>
```
## ```<ul>``` ユーエルタグやアンオーダーリスト
黒点が先頭につきます
```html
<ul>
  <li>..</li>
  <li>..</li>
</ul>
```
## ```<ol>``` オーエルタグやオーダータグ
数字が連番でつきます
```html
<ol>
  <li>..</li>
  <li>..</li>
</ol>
```

出典　https://web-camp.io/magazine/archives/89677#:~:text=%E3%82%BF%E3%82%B0%E3%81%AFlist%20item,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
情報処理安全確保支援士に価値はあるのか？

## この記事の目的
エンジニアの努力が正しく評価されず
不当に安く買い叩かれる事案を減らすこと

## 情報処理安全確保支援士とは
IPAが主催している情報処理試験の1つで、
かつての名称は「情報セキュリティスペシャリスト」だった。

## 難易度について
情報処理試験におけるスキルレベルは4で、他のジャンルの資格と比較すると
簿記1級や、電気主任1種と並ぶ難易度に位置付けられている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2443317/99261e2a-2c97-b942-ae2e-62c3c51a8653.png)
[Wikipedia](https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E5%AE%89%E5%85%A8%E7%A2%BA%E4%BF%9D%E6%94%AF%E6%8F%B4%E5%A3%AB)より
>試験の水準は高く、日本国内で実施される情報セキュリティに関する資格試験では最難関にあたり、実務経験者であっても合格するのは難しい試験として広く認知されている。

## 面接における反応（実話）
品質保証と**セキュリティを主力事業**とする東証プライム上場のテストベンダー。　

『私は安全確保支援士の資格を保有しています（どや！）』
　↓
「でもアナタが希望しているのは品質保証ですよね」
「**テストにセキュリティは必要ない**から、そのアンカクとかいう資格は使いませんね」
「価値ゼロですね、年収アップの材料にはなりませんね」

:::note warn
結果
**査定額0円**（年収0円アップ）
:::

これが、調理師免許だとかワインソムリエだったら分かる。
その資格、ソフトウェアに何の関係があるんですか？ と。
でも、セキュリティってどんなソフトウェアにも必要でしょ。
ここの人事は年収を値切り倒すことしか考えていないようだ。

まるで、大事にしていた文庫本をブックオフに持ち込んだら、
買取価格が付かないので処分しておきましょうか、と言われたときの気分。

## 難易度を整理してみる
ここの会社の人事が恐ろしく無知なのか、これが普通なのか分からないが
おそらく、ITパスポートか何かとごっちゃになっているのかと。

なんだったら「情報セキュリティマネジメント試験」のほうが
**名前にハッタリが効いている**分、上位資格と思っている説すらある。

資格保有者の方々が同じ被害に遭わないように、難易度表を貼っておく。
![IPA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2443317/014c94b7-f4bf-391f-4c60-f0a412a07c17.png)

## IPAのみなさんへ
もう元の名称「情報セキュリティスペシャリスト」に戻しませんか？
少なくとも、私は今後、履歴書にはそう書くことにします。
Python2: py-bt frame information optimized out

On system python2 on Debian 11 bullseye, when you try py-bt on gdb, session, frames are optimized out:

```
(gdb) py-bt
Traceback (most recent call first):
  (frame information optimized out)
```

According to https://www.podoliaka.org/2016/04/10/debugging-cpython-gdb/ , this is because `gdb wasn't able to figure out the location of PyFrameObject data structure in a given stack frame`.

So, to fix this, you can rebuild python2 without PGO.

- https://salsa.debian.org/cpython-team/python2/-/merge_requests/7
- https://github.com/cielavenir/salsa-python2/releases/tag/2.7.18-13.0.1

Note that system Python 3.9 does not have issue.
SEOのサブディレクトリ運用について

しばらくの間、サブディレクトリ運用がSEOに効果的な状態が続いている。

法人アフィリエイターと話をする機会があるが、多くの人が企業や病院・サロンなどに営業をかけてドメインを借り、そのサブディレでアフィリサイトを運営している。

最近はサブディレ貸しの会社も出て来て、空前のサブディレブームが2年ほど続いているが、今のところ、Googleから対策を取られている気配はない。

ルートドメインと関連性の低いサブディレサイトは順位を落としているようだが、関連性が高いサブディレサイトは上位表示が続いている様子。

弊社としては、他社のサブディレを借りても良いが、長くは続かないと思われるので、自社のドメインを強くすることによって、サブディレ対応をしている。

コチラのFX関係のサイトは、おかげで上位表示をすることができている。

・[海外FX比較ナビ](https://nagoweb.co.jp/kaigaifx/)

コチラはサブドメに最近移し替えて、今までのドメインよりも少し順位を上げた。

・[ポイント比較ガイド](https://point.nagoweb.co.jp/)

サブディレがいつまで続くか分からないが、やはりサブディレや、サブドメでの運用はE-A-T的に良いらしく、かなりのパワーを持っている様子。

否定する人もいるが、やはりco.jpの法人ドメインの方がGoogle評価が高い気がする。

コチラのサイトは普通のドメインで運用しているが、あまり評価は高くない。

・[海外FXおすすめ比較ガイド](https://gemgemfx.com/)
・[XMの始め方ガイド](https://tottori-sanpai.jp/)

1つのサイトはSNS運用が上手くいき、SNSからのアクセスも多いが、SEOとしてはあまり評価されていない。
やはりトップレベルドメインの価値（希少性）や、重要な機関からのリンク（政府、地方公共団体、社団法人など）をたくさん受けているサイトの方が評価されている。

Googleも無難なサイトを表示させたい気持ちは分かるが、もうちょっと尖ったことをやっても良いのでは。と思うところがあるが…。

そもそも1つの検索結果を表示しなくても、ニュースサイトのように、様々なジャンルに分けた結果を出しても良いと思う。

今後のGoogleアルゴリズムはどうなるか分からないが、できるだけ適応できるように頑張りたい。
Databricksワークスペースの資産

[Workspace assets \| Databricks on AWS](https://docs.databricks.com/workspace/workspace-assets.html#ws-notebooks) [2022/5/9時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書ではDatabricksワークスペースの資産のハイレベルの紹介をします。

# クラスター

Databricks Data Science & EngineeringとDatabricks Machine Learningのクラスターは、プロダクションETLパイプライン、ストリーミング分析、ad-hocの分析、機械学習の実行のような様々なユースケースに対する統合プラットフォームを提供します。クラスはある種のDatabricksの*計算資源*です。他の計算資源のタイプにはDatabricks [SQLエンドポイント](https://qiita.com/taka_yayoi/items/23d7789198c2dcd66381)があります。

クラスターの管理及び活用方法に関しては[クラスター](https://qiita.com/taka_yayoi/items/c5d99cd77fe4bfcf69f0)を参照ください。

# ノートブック

ノートブックはファイル、[テーブル](https://qiita.com/taka_yayoi/items/e7f6982dfbee7fc84894)、[可視化](https://qiita.com/taka_yayoi/items/36a307e79e9433121c38)を操作する実行可能なセル(コマンド)とナラティブなテキストを含むドキュメントに対するwebベースのインタフェースです。前に実行されたコマンドの出力を参照しつつ、順番にコマンドを実行することができます。

ノートブックはDatabricksでコードを実行するメカニズムの一つです。他のメカニズムには[ジョブ](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)があります。

ノートブックの使用方法、管理方法に関しては[ノートブック](https://qiita.com/taka_yayoi/items/24a897cf40bba6d9e305)を参照ください。

# ジョブ

ジョブはDatabricksでコードを実行するメカニズムの一つです。他のメカニズムには[ノートブック](https://qiita.com/taka_yayoi/items/24a897cf40bba6d9e305)があります。

ジョブの使用方法、管理方法に関しては[ジョブ](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)を参照ください。

# ライブラリ

ライブラリを用いることで、サードパーティあるいはローカルに構築したコードを、クラスターで動作するノートブックやジョブで利用できるようになります。

ライブラリの使用方法、管理方法に関しては[ライブラリ](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0)を参照ください。

# データ

Databricksワークスペースにマウントされた分散ファイルシステムにデータをインポートし、Databricksノートブックやクラスターで操作することができます。また、データにアクセスするためにさまざまなApache Sparkのデータソースを活用することができます。

データの管理方法、利用方法に関しては[データガイド](https://docs.databricks.com/data/index.html#data)をご覧ください。

# Repos

ReposはリモートGitリポジトリと同期することで、コンテンツを共同バージョン管理することがができるDatabricksのフォルダーです。Databricksのリポジトリを活用することで、Databricksでノートブックを開発し、コラボレーション、バージョン管理のためにリモートのGitリポジトリを活用することができます。

詳細については、[Databricks ReposによるGit連携](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)をご覧ください。

# モデル

*モデル*とはMLflowのモデルレジストリに登録されたモデルを指します。モデルレジストリは、MLflowモデルの完全なライフサイクルを管理できるようにする集中管理されたモデルストアです。モデルリネージュの時系列変化、モデルのバージョン管理、ステージの遷移、モデルとモデルバージョンの注釈、説明を可能にします。

モデルの管理、使用方法に関しては、[DatabricksにおけるMLflowモデルレジストリ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995)をご覧ください。

# エクスペリメント

MLflowのエクスペリメントは、MLflowの機械学習モデルトレーニング実行結果(ラン)を管理、アクセス制御するための主要な単位となります。全てのMLflowランはエクスペリメントに属します。それぞれのエクスペリメントで可視化、検索、ランの比較、そして、別のツールで使うためにランのアーティファクトやメタデータをダウンロードすることができます。

詳細については、[エクスペリメント](https://qiita.com/taka_yayoi/items/ba0c7f46ff7c3dbf87bb#%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
習慣化を使って継続して学習する

## はじめに
プログラミングを勉強して、**学習習慣が身についていたらなーって思うことありませんか？**
実を言うと、この記事を書いている私も1日2時間、3時間の習慣があるわけではありません。しかし、徐々に習慣化の原理原則みたいなものを取り入れ始めて、少しはまともになったのではないかと思います。
なので、今回は **「学習習慣を身に着ける方法」** について記事を書こうと思います。

## 結論
+ **４ステップ**あります。
    + 1．**身に着けたい習慣を決める**
    + 2．**その習慣をできるだけ小さくする**
    + 3．**できるだけ素早く習慣を実行できるように環境を整える**
    + 4．**合図を決める**

成功させるコツとしては、**気長にすることが大切**だと心に留めておくことかと思います。
習慣は、一朝一夕で習慣は手に入らないので。
## 具体例：朝、勉強をする
ここでは「朝に勉強をする習慣」を身に着けるステップを解説していきます。

+ **ステップ1．** 身に着けたい習慣を決める
    + 今回はもう決まっている **（朝、勉強をする）** ので飛ばします。

+ **ステップ2．** その習慣をできるだけ小さくする
    + **例えば「技術書を１P読む」**
    + やり始めれば、2,3p読んでしまうものだと思うので、小さくても気にしなくて大丈夫だと思います。
+ **ステップ3．** できるだけ素早く習慣を実行できるように環境を整える
    + **例えば、「机の上に読みたい技術書を積んでおく」**
+ **ステップ4．** 合図を決める
    + **例えば、「コーヒーを飲んだら」や「インスタを見たら」→「技術書を読む」**
    + 合図は「if-then（もし～～したら、ー－する）」の形で決めるといいと思います。
    + 合図の種類としては2種類あるかと思います。
        + 自分の習慣を合図にする「コーヒーを飲んだら」
        + 物理的なものを合図にする「技術書が目に入ったら」

## 最後に
色々な本を読んで、自分なりに習慣化の方法を作ってみました。一人一人会う方法が違うと思うので、自分流にぜひアレンジしてみてください。
この記事が学習習慣を身に着けるときのお役に立てば幸いです。
もし、コメント等がございましたら、気兼ねなくしてもらえれば。
Streamlitでラジオボタンを横並びにする方法

# TL;DR;

`v1.10.0`から[`st.radio`](https://docs.streamlit.io/library/api-reference/widgets/st.radio)ウィジェットで`horizontal`パラメータが使えるようになったよ！

# 困っていること

[Streamlit](https://streamlit.io/)でラジオボタンを表示すると、標準設定では縦に並ぶ。
記事投稿時点で"streamlit radio horizontal"とかでWeb検索しても、`<stile>`タグみたいな奥義を駆使して横並びにする方法しか見つからなかった。(※個人の感想です)

公式フォーラムの[Horizontal radio buttons](https://discuss.streamlit.io/t/horizontal-radio-buttons/2114/7)のようにコーディングすると、よく分からないけど全体的にデザインが変わったりするし、そもそもCSS使いたくないからStreamlit使ってるのに裏切られた気分になるのだ。(※個人の感想です)

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81851/663e8069-198b-0c0a-91a4-1fcaa3135c66.png)

# 解決方法

本稿の要約のとおり `pip install streamlit --upgrade` して`v1.10.0`以上に上げれば`horizontal=True`パラメータが使える。
※アップグレード時に「C++のライブラリが足りない」的なエラーなどで動かなくなっても責任はとれません

```
import streamlit as st
st.radio("これを…", ("hoge", "fuga", "piyo"))
st.radio("こうする", ("hoge", "fuga", "piyo"), horizontal=True)
```

以上。知ってしまえば「なぁんだ」という内容だけど、現時点では情報が出てこなかったので同じようにハマってる人の助けになれば幸いです。
#全てのAPIリファレンスを熟読する者のみが石を投げなさい

# 参考資料(再掲)

+ [`st.radio`](https://docs.streamlit.io/library/api-reference/widgets/st.radio)
Cloud SQLのバックアップと復元方法

# Cloud SQLのバックアップと復元方法

Cloud SQL のバックアップと復元方法について調べてみました。

## バックアップの概要

### バックアップの種類
公式ドキュメント「[Cloud SQL バックアップについて](https://cloud.google.com/sql/docs/sqlserver/backup-recovery/backups?hl=ja)」によると、2つのバックアップの種類があります。

 - オンデマンド バックアップ
 - 自動バックアップ

この2つの違いは、バックアップの保持期間です。
オンデマンド バックアップは手動でバックアップを削除する、もしくはインスタンスが削除されるまで維持されます。
自動バックアップは保持期間（最大365日）を過ぎると削除されます。

### 費用

バックアップデータの料金は、インスタンスの料金とは別にかかります。
DBの種類と保存するリージョンによって料金は異なり、GB単位で課金されます。
今回使った MySQL の料金一覧はこちらです。
「ストレージとネットワークの料金」にバックアップ料金が記載されています。

https://cloud.google.com/sql/docs/mysql/pricing?hl=ja#2nd-gen-storage-networking-prices

### エクスポート

バックアップデータはエクスポートできないようです。
Cloud Storage など Cloud SQL 以外にデータを保存したい場合や Cloud SQL のインスタンスは削除するがデータは残しておきたい場合は、別途データのエクスポートを行う必要があります。

https://cloud.google.com/sql/docs/mysql/import-export?hl=ja


## 自動バックアップの設定

以降の手順は、Cloud SQL MySQL 8.0 を使用しています。

自動バックアップは、インスタンス作成時、作成後どちらでも設定できます。

### インスタンス作成時

「インスタンスのカスタマイズ」の「構成オプションを表示」をクリックすると、バックアップの項目が表示されます。

![作成時のバックアップ設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/cf08453d-6d43-51d0-2a27-0ade35bfe03a.png)

可用性を複数のゾーンにすると、バックアップの自動化とポイントインタイムリカバリの有効は必須になります。

バックアップの自動化の詳細オプションでは、バックアップの時間枠とバックアップを保存するリージョン、バックアップ数が設定できます。
バックアップの保存先をマルチリージョンにした場合、us, eu, asia の三か所から選びます。

![作成時の設定_自動バックアップ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/fce278e2-9754-cc6e-188e-f774ca5090de.png)

ポイントインタイムリカバリの詳細オプションでは、バックアップと同時に保存するトランザクションログを保存する日数を設定できます。
トランザクションログが削除されるタイミングによっては、保持されるログの数が設定値より少なくなるため、
[ドキュメント](https://cloud.google.com/sql/docs/mysql/backup-recovery/backups?hl=ja#retention)では保持したい日数+1以上を設定することを推奨しています。

![作成時の設定_ポイントリカバリ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/c1e99c17-c2f5-eace-9464-f7799d637337.png)

### インスタンス作成後

インスタンスの名前から概要ページを開き、左のメニューから「バックアップ」を開きます。
ページ上部に自動バックアップの設定、下部にバックアップ一覧が表示されます。
自動バックアップの設定項目は作成時と同じのため、詳細は割愛します。

## オンデマンド バックアップの作成

「バックアップ」ページの「バックアップを作成する」をクリックすると、オンデマンドバックアップの作成ペインが開きます。
設定項目はバックアップの説明と保存先のリージョンの選択のみです。

![オンデマンドバックアップ作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/9031fc51-1e13-8a6e-9789-49999d3c3c22.png)

バックアップが作成されると、バックアップ一覧に追加されます。
種類より、オンデマンドバックアップか自動バックアップかを確認できます。

![バックアップ一覧_自動あり.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/61f8e8b6-76cd-e9e9-4f61-958b9b6c009b.png)

## 復元

バックアップ一覧から、復元したいバックアップアイテムの「復元」をクリックすると、復元ペインが開きます。
復元先はバックアップを取得したインスタンスに限らず、互換性のあるインスタンスであれば復元可能です。

![復元.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/0db9ef6a-dd6c-08c7-5b21-bcc6b1eabade.png)

以上です。
誰かの役に立てば幸いです。
ChromeのDevtoolのまとめ

# 目次
- ChromeのDevtoolとは
- Devtool起動
- Elementsタブ
- Consoleタブ
- Source
- Networkタブ
- Performance/Memory/Appllication/Securityタブ
- Vue.js devtools

---

# ChromeのDevtoolとは
- DevTools (デベロッパーツール、開発者ツール) とは、Webブラウザに付属している開発ツールです。
- Html Domやスタイルなどが確認できます。
- Javascriptデバッグが確認できます。
- Websiteに関連するAPIや通信などが確認できます。
- ...
- いろいろな出来ます。

→　今回Devtoolの使い方を説明しながら、フロントエンド開発するときによく使うDevtool機能を紹介したいと思います。
→　自分の経験なので、間違ったら是非教えてください。　何か足りなければ、是非を教えてください。
   

---

# ChromeでDevtool起動
-  Mac: Command+Option+I
-  Windows: F12 or Control+Shift+I
-  右クリック　→　検証

---

# Elementsタブ
- HTMLのDOMとスタイルが見えて、編集できます。
- スタイルComputedは今現れるElementのスタイルです。
- Elementに関しては、Path/Js Selector/スタイルをコピーできます。

---

# Consoleタブ
- JSのError/Warning/Infoが確認できます
- JS実行できますので、いつでも確認できます。

---

# Source
- ソースが見えます

---

# Elements+Console+Sourceでデバッグすること
- console.log: メッセージをConsoleで出すこと
- debugger: JSの実行はdebuggerに止まる
- breakpoint: sourceにbreakpointをチェックして、JSの実行はbreakpointに止まる
- デバッグの時に、consoleタブでJSコード実行できるし、変数の値が見えます

---

# Networkタブ
- リクエストが見えます
- リクエストごとに、Header/Params/Responseが見えます
- データ量が確認できます
- リクエスト時間が確認できます
- Postmanと一緒に使って、リクエストを再現できます。

---

# Performance/Memory/Appllication/Securityタブ
- あまり使わないので、説明できません。

---

# Vue.js devtools
- Vue Componentのデータが見えます
- Vuexのデーターが見えます

---

# Chrome Task マネージャー

- 現在どのぐらいメモリー使われているのは分かります。

---
Vuexのデメリット

はじめに、ユニクビジョンのトゥオンと申します。
エンジニアです。

---

今日Vuexデメリットについて話したいと思います。

---

まずに,
Vuex簡単に紹介します。

--- 
### VueXとは
- VuexとはVue.jsアプリケーションのための状態管理パターン + ライブラリです。
- VueXの目的は共有状態の管理のためです。

### Vuejsのデータフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/116516f9-09b0-2940-b373-a46c9a2bfa4f.png)

### VueXのデータフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318767/944ce6b9-41d3-9f51-1f40-ab3126b4f231.png)

### Vuexの具体的に

- グローバルシングルトンです。
- 状態管理は安全です。
    - One Way Flow 
    - 大きなプロジェクトに向ける


### 普通なプロジェクトにvuex導入するする時に実際の印象
- ソースコードが長い
    - State, Commit, Actionを定義しないといけません
    - コストがかかる
- 冗長
    - なくてもいいです
    - 同じコードは存在する気がします

-
Dcokerコマンド一覧

## はじめに
Dcokerのコマンドすぐ忘れちゃうのでメモがてらまとめます。

### 動作しているcontainerの確認
```zsh
docker ps
```

### 停止しているcontainerの確認
```zsh
docker ps -a
```

### container停止
```zsh
docker stop [containerID]
docker stop [containerID] [containerID] [containerID] #複数可
```

### 一括container停止
```zsh
docker stop $(docker ps -q)
```

### containerの削除
```zsh
docker rm [containerID]
docker rm [containerID] [containerID] [containerID] #複数可
```

### 一括container削除
```zsh
docker rm $(docker ps -q -a)
```

### imageのダウンロード
- [DockerHubから選んでDownload](https://hub.docker.com/search?q=&type=image)
```zsh
docker pull [image名]
#e.g. docker pull centos
```

### imageの検索
```zsh
docker search [検索するキーワード]
#e.g. docker search centos
```

### imageの確認
```zsh
docker images
```

### image削除
```zsh
docker rmi [imageID]
```

### 一括image削除
```zsh
docker rmi $(docker images -q)
```

### 一括container停止・削除、image削除
```zsh
docker stop $(docker ps -q) && docker rm $(docker ps -q -a) && docker rmi $(docker images -q)
```

### container作成と起動
```zsh
docker run [オプション1] [オプション2] [オプション3] image名
#e.g. docker run -dit --name centos-test centos
```
| command | 説明 |
| --- | --- |
|-d|バックグラウンドでコンテナを動作させる（デタッチモード）|
|-it|ホストとコンテナの標準入出力を接続する。コンテナのコンソールに接続する|
|-name|作成するコンテナ名|

### containerへコンソール接続
```zsh
docker exec [オプション1] [オプション2] [オプション3] コンテナ名 シェル名
#e. g. docker exec -it centos-test bash
```

### 未使用のvolumeを削除
```zsh
docker volume prune
docker volume prune -f #強制削除
```

### 未使用のnetworkを削除
```zsh
docker network prune
```

### 一括でimage、volume、networkを削除
```zsh
docker system prune
```

### Build Cache容量確認
```zsh
docker system df
```

### Build Cacheを削除
```zsh
docker builder prune
```
PostgreSQL pg_cron extension


# PostgreSQL pg_cron: 1/2 Cronとは

## Cron 

```
cronとは、多くのUNIX系OSで標準的に利用される常駐プログラム（デーモン）の一種で、
利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれるもの。
```

---
## Cron schedule expressions
https://crontab.guru/
```
 ┌───────────── min (0 - 59)
 │ ┌────────────── hour (0 - 23)
 │ │ ┌─────────────── day of month (1 - 31)
 │ │ │ ┌──────────────── month (1 - 12)
 │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
 │ │ │ │ │                  Saturday, or use names; 7 is also Sunday)
 │ │ │ │ │
 │ │ │ │ │
 * * * * *
```

---

# PostgreSQL pg_cron: 2/2: PostgreSQL pg_cron エクステンション
PostgreSQL pg_cron エクステンションを使用すると、PostgreSQL データベース内でメンテナンスコマンドのスケジュールを組むことができます。

https://github.com/citusdata/pg_cron

---

# インストール方法
- Step1: OSにエクステンションインストール
```sh
# Install on Red Hat, CentOS, Fedora, Amazon Linux
sudo yum install -y pg_cron_12

# Install on Debian, Ubuntu
sudo apt-get -y install postgresql-12-cron

```

---

- Step2: PostgreSQLの`shared_preload_libraries`に追加します
```sh
# add to postgresql.conf

# required to load pg_cron background worker on start-up
shared_preload_libraries = 'pg_cron'
``` 


---

- Option: データベース変更したい場合、データベース設定します。　設定しないとデフォルト`postgres`

```sh
# add to postgresql.conf

# optionally, specify the database in which the pg_cron background worker should run (defaults to postgres) 
cron.database_name = 'my_db'
```


---

- Step3: PostgreSQL再起動して、エクステンションを追加します。

```
-- run as superuser:
CREATE EXTENSION pg_cron;
```

---

# Option: AWS RDS PostgreSQL にエクステンション追加

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html

---

# よく使う目的

- 定期的にデータ更新・削除の処理

```sql
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
```

- 定期的にVacuum実行

```sql
SELECT cron.schedule('30 3 * * 6', 'VACUUM');
```
---

# Cronのコマンド実行の確認
- 設定したCron一覧
```sql
select * from cron.job
```

- 実行詳細

```sql
select * from cron.job_run_details;
```

- 失敗したもの

```sql
select * from cron.job_run_details where status = 'failed';
```

- Cronを削除

```sh
SELECT cron.unschedule(42);
```

---

# デメリット
## データベース内のデータ・ロジックしかできません
- 例1: 古い画像のレコード削除処理はpg_cron使えますが、画像自体の削除は別の処理を使わないといけません。
- 例2: コマンド実行したら、他のサビースに通知などはできません
- 解決方法
    - 他のサビース連携の時に: pgsql-http 使えます。
    - pg_cron使わず、バッチ仕組みを使います。

---

以上です。ありがとうございました。
工程管理

## アローダイアグラム(PERT図)
<b>作業の順序や相互関係をネットワーク状に示した図。
プロジェクトの達成に必要な作業を矢線で結び、各作業の結合点を○印で表す。矢線の上に作業名をその下に所要日数を書く。ダミー作業とは所要日数が0の作業。
### 最早開始日(最早結合点時刻)
<b>全ての先行作業が完了し、最も早く後続作業を開始できる時点。
先行作業の最早開始日に作業日数を加えて求める。
<font color = red>複数の先行作業が合流する結合点の最早開始日は、最も遅い作業に合わせるのがポイント</font>
なお、先行作業の完了を待って、後続作業が開始する関係を<font color = blue>FS関係</font>という。
### 最遅開始日(最遅結合点時刻)
<b>全ての後続作業の日程が遅れないように、遅くとも先行作業が完了していなくてはならない時点。
後続の作業の最遅開始日から作業日数を引いて求める。
<font color = red>複数の後続作業から合流する結合点の最遅開始日は、最も早い作業に合わせるのがポイント</font>
### クリティカルパス
<b>最早開始日と最遅開始日が等しい結合点を結んだ経路のこと。
クリティカルパス上の作業が遅れると、プロジェクト全体の遅れにつながる。
### スケジュール短縮の手段
<b><font color = blue>クラッシング</font> - コストを増やし、プロジェクトメンバを残業させたり、
業務内容に精通したプロジェクトメンバを新たに増員すること。
また、前工程が終了する前に後工程を開始する<font color = blue>ファストトラッキング</font>がある。