OmniAICreator/Qiita-1.07M huggingface dataset:
【RubyMine】ショートカット一覧 備忘録

「RubyMine 公式ショートカット一覧」というチートシートから、よく使っている・使いたいショートカットを抜粋。

# キーの記号について
| 記号 | キー |
|:-:|:-:|
| ⌃ | Controlキー |
| ⌥ | Optionキー |
| ⇧ | Shiftキー |
| ⌘ | Commandキー |
| ⏎ | Enterキー |
| ⌫ | バックスペース |

# ショートカット

## 編集
| コマンド | 内容 |
|:-|:-|
| ⇧⏎ | 新しい行の開始 |
| ⌘⇧U | キャレットまたは選択したブロックで単語の大/小文字を切り替え |
| ⌘D | 現在の行または選択したブロックを複製 |
| ⌘⌫ | キャレット位置の行を削除 |
| ⌥⌫ | 文字の最初まで削除 |
| ⌥⇧↑ ・ ⌥⇧↓ | 選択された行を上・下に移動 |


## マルチ・キャレットおよび選択
| コマンド | 内容 |
|:-|:-|
| ⌥ + click | キャレットの追加 |
| ⌃⌘G | すべての出現箇所を選択 |
| ⌃G | 次の出現箇所を選択 |

## Rails
| コマンド | 内容 |
|:-|:-|
| ⌃⌘↑ | Rails モデル/ビュー/コントローラーなどに移動 |
| ^F2 | Rails ビューをブラウザーでプレビュー |
| ⌥⌘G | Rails ジェネレーターの実行 |

## ナビゲーション
| コマンド | 内容 |
|:-|:-|
| ⌘O | クラスに移動 |
| ⌘⇧O | ファイルに移動 |
| ⌘E | 最近使用したファイルのポップアップ |
| ⌘⌥← / ⌘⌥→ | 前に戻る/次に進む(ファイル移動) |
| ⌘⇧⌫ | 最後に編集したロケーションにナビゲート |
| ⌘B / ⌘+Click | 宣言に移動 |

## 検索/置換
| コマンド | 内容 |
|:-|:-|
| ⇧⇧ | どこでも検索 (ファイル, クラス, アクション, その他) |
| ⌘F / ⌘R | 検索 / 置換 |
| ⌘G / ⌘⇧G | 次/前の検索 |
| ⌘⇧F / ⌘⇧R | パス内検索/置換 |

## VCS/ローカル・ヒストリー
| コマンド | 内容 |
|:-|:-|
| ⌘K | VCS にプロジェクトをコミット |
| ⌘T | VCS からプロジェクトを更新 |

## 一般
| コマンド | 内容 |
|:-|:-|
| ⌘W | アクティブなエディター・タブを閉じる |

# 参考
https://pleiades.io/sites/willbrains.jp/keymap/pdf/shortcut_rubymine_mac.pdf
Nuxtでグローバルな型定義

# はじめに

Nuxt3でTypeScriptの型チェックを有効にした際、グローバルな型定義をどこに配置すればいいのかわからなかったので苦労しました。
ここでは`d.ts`ファイルを使ってグローバルな型定義を行うための設定方法を共有しようと思います。

# 環境

```sh
$ npx nuxi -v
Nuxi 3.6.5
$ npx vue-tsc -v
Version 5.1.6
```

# 結論

https://nuxt.com/docs/guide/concepts/typescript#nuxttsconfigjson

こちらにもあるように、ルートの`tsconfig.json`に`compilerOptions.paths`などを書くと、nuxiが用意してくれる設定が上書きされてしまいます。
代わりに、ルートの`nuxt.config.ts`に以下のように書くことで解決しました。

```ts
export default defineNuxtConfig({
  ...
  alias: {
    "*": "types/*",
  },
})
```

# 型定義の例

以下のように書くと、Vueファイル内のscriptダグやtemplateタグでPost型が使えます。

```ts:~/types/post.d.ts
interface Post {
    id: number,
    title: string,
    content: string,
}
```

# おまけ

プラグインの型定義をする場合はこのようになると思います。

```ts:~/plugins/hello.ts
declare global {
    interface NuxtApp {
        $hello: (name: string) => string,
    }
}

export default defineNuxtPlugin((nuxtApp) => {
    return {
        provide: {
            hello(name: string) {
                return `Hello ${name}!`
            }
        }
    }
})
```

# おわりに

VSCodeのエラーが消えてくれませんが、いつか解決策を見つけられればと思います。
eas-buildで--localの時のsubmitでデプロイしてくれない。

# eas buildの時にいい感じにsubmitしてくれない

## 環境
```yml:version
eas-cli: 3.14.0
expo-cli: 5.4.12
node: v16.15.1
npm: 8.11.0
```

## 起こったこと
以下のコマンドを打ったら、appstoreconnectへデプロイしてくれると思うじゃないですか。
でも、デプロイしてくれないんですよ。
```bash:bash
eas build --platform ios --local
## build log...
eas submit --platform ios --latest
## submit log...
```

## 解決策
ローカルビルド時はpathを都度打たないといけないっぽい
```bash:bash
eas build --platform ios --local
eas submit --platform ios --path $(ls -rt *.ipa | tail -n 1)
## ls -rt *.ipa | tail -n 1でipaファイルの最新のファイル名を取得する
```

```bash:fish
## fishならこうだと思う。未検証だから誰か頼む！
eas build --platform ios --local
eas submit --platform ios --path (ls -rt *.ipa | tail -n 1)
```
GitHub Actionsの再利用可能なワークフローに別YAMLファイルで指定したmatrixを与えたい場合

GitHub Actionsの再利用可能なワークフローに，入力として別YAMLファイルで指定したmatrixを与える方法について，苦心の末，ようやく実現できましたので，ご報告します．

ElixirとErlang/OTPのバージョンのmatrixを与える場合を例に書きます．

# matrixの与え方

通常のmatrixだと次のように与える場合について，

```yaml:matrix.yml
- otp-version: ['24.3.4.13', '25.3.2.3', '26.0.2']
  elixir-version: ['1.14.5', '1.15.4']
```

次のように展開し，さらに`include:`の下につけます．エラーにならないよう，`.github/workflows`とは別のディレクトリに配置することもポイントです．

```yaml:.github/actions/matrix.yml
include:
  - otp-version: '24.3.4.13'
    elixir-version: '1.14.5'
  - otp-version: '24.3.4.13'
    elixir-version: '1.15.4'
  - otp-version: '25.3.2.3'
    elixir-version: '1.14.5'
  - otp-version: '25.3.2.3'
    elixir-version: '1.15.4'
  - otp-version: '26.0.2'
    elixir-version: '1.14.5'
  - otp-version: '26.0.2'
    elixir-version: '1.15.4'
```


# 再利用可能なワークフローの書き方

次のようにします．

```yaml:.github/workflows/reusable_ci.yml
name: Reusable workflow

on:
  workflow_call:
    inputs:
      matrix:
        required: true
        type: string
      
jobs:
  reusable_ci:

    name: On ${{ matrix.elixir-version }}, ${{ matrix.otp-version }}
    runs-on: ubuntu-latest
    strategy:
      matrix: ${{ fromJSON(inputs.matrix) }}
    steps:
    - run: echo "done."
```

`fromJSON`を用いることがポイントです．

https://docs.github.com/ja/actions/learn-github-actions/expressions#fromjson


# 呼び出し側

次のようにします．

```yaml
name: Caller CI

on:
  pull_request:
    types: [opened, reopened, synchronize]
    branches: [ "main", "develop" ]
  push:
    branches: [ "main", "develop" ]    

jobs:
  constants:
    name: Constants
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - uses: actions/checkout@v3
      - id: set-matrix
        run: |
          json=$(cat ${{ github.workspace }}/.github/actions/matrix.yml| ruby -ryaml -rjson -e 'puts YAML.load(STDIN).to_json')
          echo "matrix=${json}" >> $GITHUB_OUTPUT
  call_reusable_workflows:
    name: Call Reusable Workflows
    needs: constants
    uses: ./.github/workflows/reusable_ci.yml
    with:
      matrix: ${{ needs.constants.outputs.matrix }}
```

あらかじめ，`id: set-matrix` としておきます．

YAMLからJSONへの変換のRubyワンライナー`cat file.yml| ruby -ryaml -rjson -e 'puts YAML.load(STDIN).to_json'` がポイントです．これで1行のJSONで出力されます． (Thanks! @zumin )

その値を環境変数`json`に一旦格納し，`echo "matrix=${json}" >> $GITHUB_OUTPUT`とすることで，`matrix`変数への出力として格納します．

それを `matrix: ${{ steps.set-matrix.outputs.matrix }}` として出力された`matrix`の値を参照したものを，`matrix`に入れます．

それをその後の呼び出しで，`with: matrix: ${{ needs.constants.outputs.matrix }}` として，再利用可能なワークフローに渡します．
PF作成：７日目

今日で１週間。早いなあ。

## 進捗
- 今日は予定のところまで進まなかった。明日も進まないと思うから後から巻き返しを図ろう。
- 管理者側からの寺社投稿ページ作成完了

## 学んだこと
- 昨日に引き続き今日もいろいろ学んだ。後で整理しないといけない。
- アプリケーション実装の大体の流れを把握できた。<br>１：Gemなどをまとめてインストール<br>２：モデルの作成<br>３：カラムの追加<br>４：コントローラーの作成<br>５：ビューの作成<br>６：ブートストラップでレイアウトを整える<br>８：部分テンプレートの作成<br>この順番で作成するとform_withでの実装は楽になるらしい。
- ブートストラップが結構いろいろできてすごい。後で調べた方がいい
- フラッシュメッセージの部分テンプレート
```ruby:app/views/layots/_flash_messages.html.erb
<!--フラッシュメッセージの部分テンプレート-->
<%= notice %><!--成功-->
<%= alert %><!--警告-->
```

```ruby:app/views/layots/application.html.erb

上記コード省略

<body>
    <!--フラッシュメッセージの部分テンプレート-->
    <%= render 'layouts/flash_messages' %>
    <%= yield %>
  </body>
```

- バリデーションの部分テンプレート
```ruby:app/views/layots/_error_messages.html.erb
<!--バリデーションメッセージ表示-->
<% if model.errors.any? %>
  <%= model.errors.count %>件のエラーが発生しました
  <ul>
    <% model.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  </ul>
<% end %>
```
表示したいビューに部分テンプレートを表示させる。部分テンプレート内にバリデーション部分テンプレートをつけることも可能

- 部分テンプレートのやり方やJavaScriptのやり方などいろいろ学んだが、まだ自分のものにできていないので整理しないといけない。ここでは学んだということだけ覚えておこう。


## 明日の予定
明日は学習時間の確保ができないと思うので、せめて投稿フォームとサイドバーのビューだけでも作成させたい。
十分統計量についてまとめ

# 目的
十分統計量に関して簡単にメモ。
現代数理統計学[1]を参照。
数式少なめ。端折っているので、詳細な説明は本をご参照ください。

また自分なりの理解のための自己解釈が多めなので、用語の使い方や解釈で間違えていたらすみませんご指摘下さい。

# まず情報量とは？
こちらのサイトが概念理解で分かりやすかったです。
https://logics-of-blue.com/information-theory-basic/

情報量とは、ある事象を推測する際に"このことを知っているとどれだけ推測に役立つか"を定量化したようなものだという自己解釈です。例えば、サイコロの目を振る場合、その目xについて以下の条件A,Bを考えます。  
A: xは偶数である。
B: xは1か2である。　
元々はxは1~6の6択でしたが、条件Aの場合は3択、条件Bの場合は2択になります。つまり、条件A,Bは、サイコロの目の推測に対して情報を与えたことになり、またその量はAよりBが多くなっています。この情報を数式で表現したのが情報量です。定義式などは参照元サイトに載ってるのでご参照下さい。概念が分かれば十分なので省略します。

# 十分統計量とは？(何が十分なの、、？）
まず、参照本の定義(一部文言省略)を紹介する。
定義の前提として、十分統計量とは、ある確率分布(正規分布等)のパラメータ(μ,σ)に対してある統計量(標本平均等)が十分統計量である、という文脈で使われる。

定義：
統計量Tがパラメータθに関する十分統計量であることは、<b>Tを与えた時に確率変数Xの条件付き分布がθに依存しない</b>ことである。 

例えば、成功確率pに従う標本$ X = (X_{1}...X_{n}) $と、統量$ Y = \sum_{i=1}^{n}X_{i} $があるとする(つまりYは二項分布bin(n,p))。
Xの条件付き確率は以下のようになる。

```math
\displaylines{
P(X|Y=y)  \\
= P(X,Y=y) / P(Y=y) \\
= p^{y}(1-p)^{n-y}/ {}_n \mathrm{C}_y \, p^{y}(1-p)^{n-y} \\
= 1/{}_n \mathrm{C}_y
}
```
3行目の式は、分子は確率pの事象が全体n回の内y回起きること、分母はbin(n,p)の二項分布に従うことから、上記のようになる。最終的には<b>条件付き分布の式からpが消えている</b>。つまり、yが分かっている(を条件とする)場合に、<b>Xの(条件付き)確率分布を知るためにはpは必要ではなくyのみで十分</b>ということ。

十分の意味(自己解釈)：※1
<b>統計量Tの値が分かっていれば、その標本の確率分布はあるパラメータθを知らなくても十分に求められる(十分な情報量がある、十分条件である)。</b>　　

現実問題で母集団のパラメータは分からないことが多いので、十分統計量を求めることが標本の確率分布を求めるために必須になります。

# 分解定理
まず定義

定義：
確率変数$  X(=(x_{0},...,x_{n}))  $の確率密度(質量)関数$ p_{θ} $について、統計量T(X)が十分統計量であるための<b>必要十分条件</b>は以下のように<b>$ p_{θ}(x) $がTを含む式$  (g_{θ})  $とθを含まないxのみの関数$  (h(x))  $に分解できる</b>こと。
```math
\displaylines{
p_θ(x) = g_θ(T(x))h(x)
}
```

この定理の嬉しい点は、先ほどのように統計量Tを与えた場合の条件付き確率分布を求める必要が無いこと。

例えば、ポアソン分布$  p_{λ}(x)  $に従う事象のn個の標本$  (X_{1},..,X_{n}) $について確率質量関数を考えると以下のようになる。
```math
\displaylines{
p_{λ}(x) = \prod_{i=1}^{n} \frac{λ^{x_{i}}e^{-λ}}{x_{i}!} = λ^{(\sum_{i}^{n}x_{i})}e^{-nλ}(\prod_{i=1}^{n}x_{i}! )^{-1} 
}
```
$g(T(x)) = λ^{(\sum_{i}^{n}x_{i})}e^{-nλ}$とすると、$ (\prod_{i=1}^{n}x_{i}! )^{-1} $は<b>λを含まないxのみの関数になるため、$  \sum_{i}^{n}x_{i}  $は十分統計量になる。</b>十分統計量の定義と併せると、ポアソン分布に従う標本の確率分布は、標本の確率変数の合計値が分かれば、母集団のパラメータに依存せずに条件付き確率分布が求められる。

# まとめ
情報量：ある標本についてこの情報(条件、統計量など)があると確率分布を推定するのにこれだけ役立つよ、という指標。
十分統計量：母集団のパラメータθが分からなくても標本の確率分布が分かるくらい十分な情報量を与えてくれる統計量。
分解定理：十分統計量を条件付き確率分布を使って証明しなくても判別できる方法。

# 注釈
※1 話の流れ的にこれを十分の意味として書きましたが、<b>どちらかというと十分の意味(かつ十分統計量が重要である意味)は、母集団のパラメータの推定時に標本の確率変数Xの代わりに十分統計量だけでも推定できる</b>の方が大事なようです。

# 参考文献　
[1] 竹村彰通、新装改訂版 現代数理統計学、学術図書出版社、2020
[2] https://logics-of-blue.com/information-theory-basic/ (accessed 23/08/08)
jEnvにaddされているJavaを解除する

## 現象

Oracle JDKからAmazon CorrettoのJDKに切り替えたかったが、
既に登録されているとエラーになる。

```shell
$ jenv add /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
 corretto64-17.0.7 already present, skip installation
 17.0.7 already present, skip installation
 17.0 already present, skip installation
 17.0.7 already present, skip installation
```

また、Open JDKをアンイストールすると、

```shell
$ sudo rm -rf /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
```

一覧からは削除されたが、

```shell
$ jenv versions
jenv: version `17.0.7' is not installed
  system
  1.8
  1.8.0.362
  corretto64-1.8.0.362
  corretto64-17.0.7
```

同様にインストール済みという扱いになっており、上書きできない。

```shell
$ jenv add /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
 corretto64-17.0.7 already present, skip installation
 17.0.7 already present, skip installation
 17.0 already present, skip installation
 17.0.7 already present, skip installation
```

## 対応

下記コマンドで、jEnvにaddされているJavaを管理対象から解除する必要がある。

```shell
$ jenv remove 17.0
JDK 17.0 removed
$ jenv remove 17.0.7
JDK 17.0.7 removed
```

再度追加。

```
$ jenv add /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
 corretto64-17.0.7 already present, skip installation
 corretto64-17.0.7 already present, skip installation
17.0.7 added
17.0 added
 17.0.7 already present, skip installation
```

バージョンの確認。

```shell
$ cat .java-version
17.0.7
```

```shell
$ java --version
openjdk 17.0.7 2023-04-18 LTS
OpenJDK Runtime Environment Corretto-17.0.7.7.1 (build 17.0.7+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.7.7.1 (build 17.0.7+7-LTS, mixed mode, sharing)
```
NextjsのReact環境構築 簡単メモ

```
いくつの概念をメモする
.TypeScript コンパイルにより、JavaScriptに変換される。
.Node.js JavaScriptのランタイム環境であり、サーバーサイドでJavaScriptを実行するためのプラットフォーム。
.next.js Reactベースのフロントエンドフレームワークである。
.React JavaScriptライブラリであり、ユーザーインターフェースを構築するためのコンポーネントベースのアプローチを提供する


①　nodejsをインストールする
 ※macの場合、環境変数を設定すること
　　※インストール後、必要な場合　npmのモジュールをインストール
　　　　　例：　npm install -g create-next-app
②　gitをインストールする
③　stoplight-studioをインストールする
④　nextのreactのプロジェクトを作成する　
　　例：npx create-next-app my-react-next
⑤ visual studio code で先作ったフォルダを開く
⑥ ターミナルで「npm run dev」を入力し、Enterしたら
　　　　　　「http://localhost:3000」を起動した
```
VBAの基本文法


ExcelのVBAの学習をはじめたので、基本文法の覚え書きをしていきます！



## はじめに

Excelのリボンに「開発」タブが表示されていない場合は、ファイル→その他→オプションから[リボンのユーザー設定]から「開発」をクリックして追加しましょう。

「開発」タブからVisual Basicを開くことができます。

[挿入]から、マクロを実装したいファイルに標準モジュールを追加すると、コードを書くことができるようになります。

Sub ～ End Subの中に書かれたコードが、一つのマクロの処理になります。

```vb
Sub マクロの名前()

～ここにコードを書く～

End Sub
```

※小技？
**Sub マクロの名前**までを書いてenterボタンを押すと、自動的に()とEnd Subが付与されます。

【ショートカット】
**alt + F11**  …Visual Basic窓(VBE)を表示・非表示する
**F5** …マクロを実行する
**F8** …一行ずつマクロを実行する
**ctrl + enter** …入力できる候補の一覧を表示する
**F12** …名前をつけて保存

マクロを実行する際には、実行したいマクロのSub～End Subの間にカーソルを入れて実行してください。

また、ファイルを保存する時はファイルの種類にマクロ有効ブックを選んでください。


## 変数の宣言

#### 変数を宣言する

```vb
Dim 変数名 
Dim 変数名 As データ型名
'※データ型を指定しない場合は自動的にVariant型になります
```
ちなみに、カンマで繋ぐことで複数の変数を一度に宣言することができます。
```vb
Dim 変数名1, 変数名2, 変数名3
```

## セルの選択

#### セルを選択する
```vb
Range("セル番号").Select
Range("セル番号") = 値　として値を直接いれることも可能
```

#### 選択したセルを取得する
```vb
'セルに値を入力する
Selection = 値
'選択セルのフォントの色を変更する
Selection.Font.Color = RGB(0, 0, 255)
'選択セルを移動する(●行下へ, ●列右へ)
Selection.Offset(2, 0).Select
```

#### 表の四隅を取得する
```vb
'基準となるセル番号↓
Range("セル番号").Select	
'表の右端を取得する		
Selection.End(xlToRight).Select
'表の下端を取得する			
Selection.End(xlDown).Select
'表の左端を取得する			
Selection.End(xlToLeft).Select
'表の上端を取得する			
Selection.End(xlUp).Select			
```

#### 表全体を選択する
```vb
'基準となるセル番号↓
Range("セル番号").Select
		
'表全体を選択する		
Selection.CurrentRegion.Select
'選択した表の行数を取得する
Selection.Rows.count
'選択した表の列数を取得する
Selection.Columns.Count

'表をコピーする
Selection.Copy
'表をペーストする
Range("セル番号").Paste
'書式を指定してペーストする
Range("セル番号").PasteSpecial xlPasteFormats　'書式を指定する
Range("セル番号").PasteSpecial xlPasteColumnWidths　'列幅を指定する
Range("セル番号").PasteSpecial xlPasteValues　'値をペーストする

'表を削除する
Range("セル番号").CurrentRegion.Clear
'表の値だけを削除する
Range("セル番号").CurrentRegion.ClearContents
```

## 終わりに

適宜更新していきたいと思います。
認識間違い等あればご指摘ください(._.)
Amazon Correttoの特定のバージョンをインストールする

過去バージョンのAmazon Correttoが必要な場合、
GitHubのリリースからダウンロード出来る。

https://github.com/corretto/corretto-17/releases

例:Intel Macだと赤枠をダウンロードしてインストーラーからインストールする。

![Screen Shot 2023-08-08 at 17.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25578/12758942-1bc7-3f73-3ea2-368ad257b72a.png)
【Numbers】関数を用いた数値型から通貨型への型変換

# 目的
* 関数を用いて数値型項目を通貨型項目(文字列)へ変換する
* Numbersの「フォーマット」機能を使用しない

# 実行環境
* OS : macOS Ventura 13.4.1 (c)
* Numbers : バージョン13.1（7037.0.101）

* 本項の通貨型の定義
    * 先頭に「¥(円マーク)」が表示される
    * 3桁ごとに「,(カンマ)」で区切られる

# 使用する関数
* DOLLAR
    * 指定した数値から通貨の文字列を返す関数
    * **この関数の結果で表示される通貨型文字列は、「言語と地域」設定に依存する。**
        * macOS 12以前 : 「システム環境設定」
        * macOS 13以降 : 「システム設定」
        * iOSおよびiPadOS : 「設定」
        * iCloud : 「アカウント設定」→「時間帯・形式」

# 使用できない関数
* CURRENCY/CURRENCYCODE/CURRENCYCONVERT
    * 他の言語では通過型への型変換に用いられることがあるが、Numbersでは為替レートに関する関数として用いられる
* YEN
    * Excelにおいて通過型(日本円)に変換する関数
    * Numbersには存在しない

# 参考文献
[DOLLAR - Apple サポート (日本)](https://support.apple.com/ja-jp/guide/functions/ffa5c4c101/13.0/web/1.0) (2023年8月8日現在)
Stable Diffusionを触ってみた

テキストや画像から画像を生成する、生成aiの1つであるStable Diffusionを今更ながら触ってみました。

## 環境
- windows 10
- NVIDIA GeForce RTX 3070
- CUDA 11.8
- python 3.9.13

## インストール手順
作業用のディレクトリを準備し、仮想環境を設定します。この後の作業はすべてこの仮想環境を有効化した状態で行います。
~~~ bash
python3 -m venv stable_env
source stable_env/bin/activate
~~~
[github リポジトリ](https://github.com/Stability-AI/StableDiffusion)からリポジトリをクローンします。
~~~ bash
git clone https://github.com/Stability-AI/stablediffusion.git
~~~
ここまでのディレクトリ構造は以下の通り。
~~~bash
workspace
  ├ stable_env         (仮想環境)
  └ stable_diffusion   (Stable Diffusionのソースコード)
~~~
とても簡単ですがこれだけで大丈夫です。
必要なパッケージをインストールします。requirements.txtが配置されているのでとてもラク。
~~~ bash
pip install -r requirements.txt
~~~
モデルは[Hugging Face](https://huggingface.co/stabilityai/stable-diffusion-2-1/blob/main/v2-1_768-ema-pruned.ckpt)からダウンロードしてきます。downloadボタンを押せば入手できるので、stable_diffusion/checkpointsに配置します。
下のような形ですね。
~~~ bash
workspace
  ├ stable_env
  └ stablediffusion
      ├ assets
      ├ checkpoints
      :   └ (入手したモデル)
      :
~~~
:::note info
これから説明するxformsのインストールはしなくてもコードは動きます。
:::
xformsをインストールします。
~~~ bash
cd ..
git clone https://github.com/facebookresearch/xformers.git
cd xformers
git submodule update --init --recursive
pip install -r requirements.txt
pip install -e .
cd ../stablediffusion
~~~

## 試し
以下のコードを打ち込み、実行します。
~~~ bash
python scripts/txt2img.py --prompt "a professional photograph of an astronaut riding a horse" --ckpt <path/to/768model.ckpt/> --config configs/stable-diffusion/v2-inference-v.yaml --H 768 --W 768  
~~~ 
ここで各オプションについて軽く説明:
- prompt: 画像生成するもとになるテキスト。
- ckpt: 使用するモデルのパス。
- config: モデルを構築する設定ファイルのパス。
- H, W: 生成する画像の高さと幅。
- device: Stable Diffusionを動かすデバイス。

deviceを指定しないとcpu上で動くようになっていますが、私の場合は以下のようなエラーが出ました。他にも同じように、cpu上で実行しようとすると出て来ている人がちょくちょく見られました。
~~~ bash
RuntimeError: Expected attn_mask dtype to be bool or to match query dtype, but got attn_mask.dtype: float and  query.dtype: struct c10::BFloat16 instead.
~~~
上記の実行コードに``--device cuda``を追加して実行すると画像が生成されました。
一回の実行に対して9枚の画像が生成されるようです。

## 実行結果
promptをいくつか変更して試してみました。
太字が実行したpromptです。なお筆者の英語力についてはおおらかな目で見てください。

**a professional photograph of an astronaut riding a horse**

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345311/d9b5ee13-b654-151b-178d-d0a73d745f04.png">

**a japanese man sitting on the bench is in Kyoto**
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345311/c4b2d237-553d-1371-0e7d-7fa8feb76375.png">

**indian girl eat pasta**
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345311/4930bc99-44b9-ff57-31ef-aeb970d3c51a.png">

ところどころ不自然な部分はありますが、全体的にかなり写真チックなきれいな画像が出力されました。

## 終わりに
さっくり動かしましたが、結構面白かったです。最初にアメリカの国旗が出てきたから国を限定したpromptを指定してみましたが、とても分かりやすく反映されたなあと。これからさらに調査してみたいと思います。


## 参考
[GitHub/Stability-AI](https://github.com/Stability-AI/StableDiffusion)
SwiftUIで指定のフォントを適用する

## 要件
指定のフォント（Google Fonts）を適用したい。

## 適用するフォント
[M PLUS Rounded 1c](https://fonts.google.com/specimen/M+PLUS+Rounded+1c?subset=japanese&noto.script=Jpan)

## 実装
### プロジェクトにFontsを追加
フォルダは適当です
注）ちゃんとTargetに追加すること（一敗）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/5b2fdfb4-f99a-df1e-fde8-25054825e918.png)


### Info.plistに追加したFontsを記載
注）拡張子まで指定すること（一敗）

Source Codeの場合
```
	<key>UIAppFonts</key>
	<array>
        <string>MPLUSRounded1c-Black.ttf</string>
        <string>MPLUSRounded1c-Bold.ttf</string>
        <string>MPLUSRounded1c-ExtraBold.ttf</string>
        <string>MPLUSRounded1c-Light.ttf</string>
        <string>MPLUSRounded1c-Medium.ttf</string>
        <string>MPLUSRounded1c-Regular.ttf</string>
        <string>MPLUSRounded1c-Thin.ttf</string>
	</array>
```

Property Listの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/924b1b87-67fd-e9a3-8b58-3c7f1c2ba01e.png)

### Font BookでPostScript名を確認
1.フォントをFont Bookへインポート
2.ツールバーから「表示」 > 「情報パネルを表示」
3.PostScript名を確認
![スクリーンショット 2023-08-08 16.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/ec1b4b98-8960-c5b2-d7bb-6766fb4c7f5d.png)

### SwiftUIで適用
先程確認したPostScript名をカスタムフォントとして指定する
```
.font(.custom("RoundedMplus1c-Black", size: 16))
.font(.custom("RoundedMplus1c-Bold", size: 16))
.font(.custom("RoundedMplus1c-ExtraBold", size: 16))
.font(.custom("RoundedMplus1c-Light", size: 16))
.font(.custom("RoundedMplus1c-Medium", size: 16))
.font(.custom("RoundedMplus1c-Regular", size: 16))
```

## 参考
[【SwiftUI】カスタムフォントの使用する方法](https://ios-docs.dev/swiftui-custom-font/)
Failed to build gem native extensionでrailsがインストールできないときの対処法

環境はWindows11 64bit、普通にRuby Installer経由でインストールしました。
railsに手を出したかったのでgem install railsを叩いてみたらFailed to build gem native extensionのエラー。

調べてみると色々ヒットしたのですが単純明快な解決策が無かったので置いときます。
# MSYSをちゃんとインストールしよう
![スクリーンショット 2023-08-08 16.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471799/92fb7fe3-d085-62b6-95dd-ecf0a3e00044.png)
Ruby installerでrubyをインストールした場合は途中でこの画面が勝手に出てくると思うんですけど、ここで1を選択すると面倒なことになります。3を選択してminGWも構築してもらいましょう。

自前でminGW-x64をインストールする対処法もやってみたのですが、パスを通すのが少々面倒だったりするのでおすすめしません。

MSYS2・mingwとはgcc云々の開発環境構築を一括でやってくれるプラットフォームのことで、細かな違いはposixの有無だったり色々あるのですが、開発環境構築ツールなんだ〜ぐらいの認識で大丈夫です。

後からもう一度MSYS2をインストールしたい場合は、
```
ridk install
```
で可能です。

これでcmdを再起動してgem install railsを叩いてやれば![スクリーンショット 2023-08-08 16.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471799/224788bf-8654-6d2f-6096-29a8413b9c8c.png)
やったね
Dockerコマンド

バックグラウンドで起動
```
docker compose up -d                  
```

起動確認
```
docker-compose ps     
```  
statusがUPになっていればOK

Docker一覧を確認
```
docker ps
```

Dockerに入る
```
 docker exec -it ドッカーのID bash
```

停止
```
データベースまで消える
docker-compose down
```
```
データベースは消えない
docker-compose stop
```

再起動
```
docker restart コンテナID  
```

# デバッグ
`docker-compose.yml`に以下2行を記載してその後`build`
```:docker-compose.yml
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ーーーここからーーー
    stdin_open: true
    tty: true
    ーーーここまでーーー
```
バックグラウンドで起動
```
docker compose up -d
```
Railsが動いているコンテナのIDを確認
```
docker ps
```
アタッチモード起動
```
docker attach CONTAINER_ID
```
停止
```
Ctrl+PかCtrl+Q
```
```
exit
```

# ドッカーの外からコマンドを実行したい場合
```
$ docker exec CONTAINER-NAME COMMAND
```
ゲストログイン機能

# 1.はじめに
ポートフォリオとしてアプリをみていただく際に新規登録を行っていただくのは手間になると考えゲストログイン機能を実装しました。

# 2.実装
### 1.ゲストログイン用のルーティングを追加
```:routes.rb
  devise_scope :user do
    post 'users/guest_sign_in', to: 'users/sessions#guest_sign_in'
  end
```

### 2.コントローラーの編集
`sessions_controller.rb`がない場合は、以下コマンドで作成してください。
```
rails g devise:controllers users
```
```:controllers/users/sessions_controller.rb
  def guest_sign_in
    user = User.guest
    sign_in user
    redirect_to posts_path
    flash[:notice] = "ゲストユーザとしてログインしました。"
  end
```

### 3.モデルの編集
```:app/models/user.rb
  def self.guest
    find_or_create_by!(email: 'guest@example.com') do |user|
      user.password = SecureRandom.urlsafe_base64
      user.password_confirmation = user.password
      user.name = "ゲストユーザー"
    end
  end
```

### 4.ゲストログインボタンの追加
ボタンを配置したい箇所に以下記述
```
      <%= link_to users_guest_sign_in_path, method: :post do %>
        <h2 class="btn btn-success ml-2">ゲストログイン</h2>
      <% end %>  
```

### 5.ユーザー情報を編集できないようにする
編集画面に転移した際に、ユーザー詳細画面にリダイレクトするように修正
```:app/controllers/users_controller.rb
before_action :check_guest, only: :edit

  def check_guest
    @user = User.find(params[:id])
    if @user.email == 'guest@example.com'
      redirect_to user_path(@user.id)
      flash[:notice] = "ゲストユーザーは編集できません。"
    end
  end
```
RaspberrypiにDockerをインストールする

## 目的
RaspberrypiにDockerをインストールしようとしたら詰まったので、インストール方法を備忘録として残しておく

## インストール

TL;DL
```bash
sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo apt install -y libffi-dev libssl-dev python3 python3-dev python3-pip
sudo pip3 install docker-compose
```

## 解説
### アップデート
パッケージのアップデート
```bash
sudo apt update && sudo apt full-upgrade -y
```

### Dockerをインストールする実行ファイルのダウンロード
```
curl -fsSL https://get.docker.com -o get-docker.sh
```

### インストールの実行
```
sudo sh get-docker.sh
```

### Pythonライブラリ系をインストール
```
sudo apt install -y libffi-dev libssl-dev python3 python3-dev python3-pip
```

### Docker-composeをインストール
```
sudo pip3 install docker-compose
```
print内でifを使う

配列の中に、指定の要素があるかどうか出力をしたかったが、ごちゃごちゃしたくなくて試してみた。


## 0-0.書いてみる
```python
i = [[0,0],[0,1]]

x = [0,0]
y = [1,1]

print("xあるよ" if x in i else "xないよ")
print("yあるよ" if y in i else "yないよ")
```

## 0-1.実行結果
```
xあるよ
yないよ
```

## まとめ
すぐに忘れちゃうから、忘れない脳みそが欲しい。

## 1-0.検索時間
リスト、タプル、辞書型で検索時間に差が・・・
```python
import time

list_ = [x for x in range(100000)]
ans = 99999
time_s = time.time()
print("xあるよ" if ans in list_ else "xないよ")
time_e = time.time()
print(time_e - time_s)

tuple_ = tuple([x for x in range(100000)])
ans = 99999
time_s = time.time()
print("xあるよ" if ans in tuple_ else "xないよ")
time_e = time.time()
print(time_e - time_s)

dict_ = {x for x in range(100000)}
ans = 99999
time_s = time.time()
print("xあるよ" if ans in dict_ else "xないよ")
time_e = time.time()
print(time_e - time_s)

```
## 1-1.実行結果
```
xあるよ
0.0013227462768554688
xあるよ
0.0011975765228271484
xあるよ
5.4836273193359375e-06
```
検索スピードは辞書型が圧倒的早さ。

## 2-0.おまけ
リスト、タプル、辞書作成からタイム計測
```python
import time


time_s = time.time()
list_ = [x for x in range(100000)]
ans = 99999
print("xあるよ" if ans in list_ else "xないよ")
time_e = time.time()
print(time_e - time_s)


time_s = time.time()
tuple_ = tuple([x for x in range(100000)])
ans = 99999
print("xあるよ" if ans in tuple_ else "xないよ")
time_e = time.time()
print(time_e - time_s)


time_s = time.time()
dict_ = {x for x in range(100000)}
ans = 99999
print("xあるよ" if ans in dict_ else "xないよ")
time_e = time.time()
print(time_e - time_s)
```
## 2-1.実行結果
```
xあるよ
0.006294727325439453
xあるよ
0.006987571716308594
xあるよ
0.009082317352294922
```
作るところからなら辞書が遅いんかい
並列Lispで、たらいまわしをした話（２）

# 改良
前回のお話でマルチコアで並列計算、たらいまわし計算をした話をしました。並列にした方が高速化と思いきや、逆に遅いのでした。どうして？？？　スレッドープーリング、やってみた？というコメントをいただきました。それは何？とChatGPTに聞いてみるとなんとか実装できそうです。スレッドプーリングを実装しました。


# スレッドプーリングとは
pthreadライブラリを利用してスレッドを立ち上げるには時間がかかります。スレッドが終了したときにメモリを解放するのにも時間がかかります。そこで予めスレッドを立ち上げておいて待機させておきます。並列計算が必要になったら計算を開始させます。計算が終わったらまた待機させます。

スレッドはキューで待機させます。

![スレッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/df0991cd-f2f3-a761-62a0-d094240a83bd.png)


pthreadライブラリのpthread_cond_wait を使ってスレッドを待機させキューに保存しておきます。pcallなど並列計算を開始した場合にはその待機を解除しevalを開始します。evalが終わったらmainスレッドにsignalを使って計算が終わったことを通知します。

このようにスレッドは最初から立ち上がっていますから、並列計算を頻繁に繰り返す場合にもタイムロスが生じません。

# ガベージコレクションがなかなかたいへん
ガベージコレクションはコンカレント・マーク＆スイープとしています。もっともスイープの部分はコンカレントにはできなかったので部分的にしかコンカレントにできていません。GC用にも起動時にスレッドを確保しておきます。空きセル数が一定数を下回るとこのスレッドが計算開始します。それまではメインスレッドから待機命令が送られて待機しています。


![GC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/5f9b8a0e-c825-a05d-392f-134f3ecf7534.png)


たらい回し計算の場合には3つのワーカースレッドが計算をします。計算途中で空きセルが不足してきたらGCスレッドにGCの待機解除を通知します。GCはConcurrentモードに入ったことを大域変数で知らせます。ストップフェーズに入った場合には大域変数でstopモードに入ったことを知らせます。

ワーカーはそれぞれセルを供給する関数を持っています。ストップ状態に入ったときにはセルの供給を一時的にストップします。これによりeval計算は一時的に停止します。その間を縫ってGCスレッドはガベージコレクションを行います。逐次処理の場合と異なりGCが起動するタイミングは予想できません。eval計算の途中でもGCが突如、計算開始することもあります。ここがなかなか悩ましいところでした。生成されたセルを保護してゴミ処理に回らないように工夫をしています。


# 計測
さて。これで並列でたらいまわし計算をすることができるようになりました。インタプリタ、コンパイラで計測してみましょう。

計測はWSL2でicore5の6コアの３０００MHｚマシンで行いました。

コード

```

(defun ptarai (x y z)
    ;(the <fixnum> x)(the <fixnum> y)(the <fixnum> z)
    (if (<= x y)
        y
        (pcall ptarai (ptarai (- x 1) y z)
                      (ptarai (- y 1) z x)
                      (ptarai (- z 1) x y))))

(defun tarai (x y z)
    ;(the <fixnum> x)(the <fixnum> y)(the <fixnum> z)
    (if (<= x y)
        y
        (tarai (tarai (- x 1) y z)
               (tarai (- y 1) z x)
               (tarai (- z 1) x y))))


```


インタプリタ

```
Easy-ISLisp Ver3.33
> (load "./tests/para.lsp")
T
> (time (ptarai 12 6 0))
Elapsed Time(second)=24.491938
<undef>
> (time (tarai 12 6 0))
Elapsed Time(second)=16.057213
<undef>
> 

```

コンパイラ

```
> (load "./tests/para.o")
T
> (time (ptarai 12 6 0))
Elapsed Time(second)=0.824204
<undef>
> (time (tarai 12 6 0))
Elapsed Time(second)=0.526622
<undef>
> 

```



最適化コンパイル

```
> (load "./tests/para.o")
T
> (time (ptarai 12 6 0))
Elapsed Time(second)=0.015585
<undef>
> (time (tarai 12 6 0))
Elapsed Time(second)=0.020543
<undef>
> 

```


スレッドプーリングの工夫をしたものの、やはり並列のたらいまわし計算の方が遅いのでした。

なぜ？

楽しく計算実験を繰り返しております。

実装はここにあります。

https://github.com/sasagawa888/eisl
Spring Boot + Spring MVC + MySQL + Thymeleaf を使用してアプリを作成してみた【CRUD Operations】

## 1.プロジェクトを作成する

公式：[spring initializr](https://start.spring.io/)

① ブラウザを開き、(https://start.spring.io/) を入力し、開く
② 下記を入力し、Dependenciesで下記を選択し、『GENERATE』ボタンを押す

- Project: Maven
- Language: Java
- SpringBoot: 3.1.2

- Group: io.javabrains
- Artifact: ipl_dashboard
- Name : ipl_dashboard
- Description: Demo project for Spring Boot
- Package name: io.javabrains.ipl_dashboard

Dependencies
- Spring Boot Web
- Spring Boot DevTools
- HyperSQL Database
- Spring Data JPA
- Spring Batch

## 2.Databaseの初期化する

① resoucesフォルダにmatch-data.xlsxファイルを追加する

resouces/application.propertiesを編集する

```resouces/application.properties

```




## 参考サイト
[CRUD Operations using Spring Boot + Spring MVC + MySQL + Thymeleaf | Create, Read, Update and Delete](https://www.youtube.com/watch?v=6zfIxgaVkQI&t=2113s)
ExcelのROUNDUP関数はたぶん（？）繰り上げられてないこともある


### はじめに
はじめまして、こんにちは＼(^o^)／。
今回がはじめての投稿になります。
非常に拙い文章で申し訳ないですが、よろしくお願いいたします。
早速、なんでこうなったのかからの経緯から始めたいと思います。

### 経緯
当時私は、他の人にも見せる用のExcelで計算用のシートを作成していました。

途中の計算で出力した数値(小数点以下を含んだ)を
HLOOKUP関数に渡すことによって、
表テーブル中にあるデータを検索するような処理を行いたいと思っていました。
G列にある数値を使って、B2:E7のデータから、データの検索を行います。

![0808_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602063/8849ed87-5a1f-5d5f-e55d-1f8804dd9b1d.jpeg)

今回は、HLOOKUP関数を用いて、B5:E5のデータを検索したいと考えています。
HLOOKUP関数に入れたい数値は、ROUNDUP関数によって
繰り上げられるので0.000001012なら、0.1になります。
その数値を使って、データを検索すると1.00が検索されることになるはずです。

しかし、0.200001012のところだけは#N/Aというように出力されてしまいました。
![0808_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602063/33373006-f569-727f-af8f-6291b3c379ec.jpeg)

一応、「数式の検証」を用いて確認をしたのですが、何故かこうなりました(ToT)。
![0808_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602063/9b9eae62-fedc-9360-3304-5ab47f37ff71.jpeg)

### 解決手法
ネットでも色々と調べてみたのですが、わからずじまいだったので、
強引に解決させていただきました。
その方法は、**ROUNDUP関数にさらにROUNDUP関数を重ねがけする**ことです。
![0808_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602063/03b65f15-3e01-dd9c-05b8-16a78ddf1444.jpeg)
かなり思考放棄をした手法ですが、このようにしたら解決に至りました。

以上になります。読んでいただきましてありがとうございました。
Djangoのテンプレートでリストをforを使用して1件ずつ表示するとき、N件ごとにタグを入れて分割表示したい

# 結論
`forloop.counter0`・`forloop.counter`・`divisibleby`を組み合わせて実現しました。

# やりたいこと
djangoのviewクラスがリストをテンプレートに渡します。
テンプレートでforを使用して1件ずつ表示するときに、N件ごとにタグを入れて分割表示したいです。
例えば、下記のように6件のリストに対して、3件ずつに分割してテーブルとして表示するというイメージです。
```views.py
# ...

class IndexView(TemplateView):
    # ...
    def get_context_data(self, **kwargs):
        # 表示したいリスト
        kwargs["members"] = [
              { "name": "taro", "age": 25 },
              { "name": "jiro", "age": 26 },
              { "name": "hanako", "age": 29 },
              { "name": "emi", "age": 24 },
              { "name": "rin", "age": 22 },
              { "name": "koichi", "age": 30 },
        ]

        return super().get_context_data(**kwargs)

# ...
```

```理想.html
<!-- table 1つにつき3件 -->
<table class="table">
    <thead>
        <tr>
            <th>name</th>
            <th>age</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>taro</td>
            <td>25</td>
        </tr>
        <tr>
            <td>jiro</td>
            <td>26</td>
        </tr>
        <tr>
            <td>hanako</td>
            <td>29</td>
        </tr>
    </tbody>
</table>
<!-- table 1つにつき3件 -->
<table class="table">
    <thead>
        <tr>
            <th>name</th>
            <th>age</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>emi</td>
            <td>24</td>
        </tr>
        <tr>
            <td>rin</td>
            <td>22</td>
        </tr>
        <tr>
            <td>koichi</td>
            <td>30</td>
        </tr>
    </tbody>
</table>
```

### 表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/3f9e7148-333e-328f-d22e-cdd3e944c4ea.png)

# どうしたか
`forloop.counter0`・`forloop.counter`・`divisibleby`フィルタを組み合わせて実現しました。

||説明|
|-|-|
|forloop.counter0|forの中で使用する。0から数え始めて、現在何回目のループかが格納された変数|
|forloop.counter|forの中で使用する。1から数え始めて、現在何回目のループかが格納された変数|
|divisibleby|値が引数の値で割り切れる場合にTrueを返すフィルタ|

# サンプルコード
(前述の「IndexView」の場合)
```.html
{% for member in members %}
    {# 冒頭はforloop.counter0 #}
    {% if forloop.counter0|divisibleby:3 %}
    <!-- table 1つにつき3件 -->
    <table class="table">
        <thead>
            <tr>
                <th>name</th>
                <th>age</th>
            </tr>
        </thead>
        <tbody>
    {% endif %}
            <tr>
                <td>{{member.name}}</td>
                <td>{{member.age}}</td>
            </tr>
    {# 末尾はforloop.counter #}
    {# リスト全体の最後にもタグを入れる必要がある #}
    {% if forloop.counter|divisibleby:3 or forloop.last %}
        </tbody>
    </table>
    {% endif %}
{% endfor %}
```

これで、やりたかったことが実現できました。

以上です。

# 参考

https://qiita.com/nachashin/items/d3f9cd637a9cecbda72c

https://itc.tokyo/django/django-for/
DxLibでID3D11ShaderResourceView取得

忘備用

DxLib上でimguiのUIに画像を表示したい,
マップチップ選択等用

imguiで扱う画像はID3D11ShaderResourceView*なので
そこをあんまり意識せずに表示できるように。
DxLibのLoadImageで読んだ画像はピクセル単位でのアクセスが出来ないので
それ用のLoadSoftImage使って取得する。
CreateTexture2Dに入れられるように格納する。


```c++
ID3D11ShaderResourceView* getImageResource11(int softimageHandle) {

    ID3D11Device* device = static_cast<ID3D11Device*>(const_cast<void*>(GetUseDirect3D11Device()));
    ID3D11DeviceContext* context = static_cast<ID3D11DeviceContext*>(const_cast<void*>(GetUseDirect3D11DeviceContext()));
    // 画像の幅と高さを取得
    int width, height;
    GetSoftImageSize(softimageHandle, &width, &height);


    // 画像データを取得
    unsigned char* imageData = new unsigned char[width * height * 4]; // RGBA

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            // ピクセル単位で色を取る
            int r,g,b,a;
            GetPixelSoftImage(softimageHandle, x, y , &r , &g , &b , &a);
            int index = (y * width + x) * 4;
            imageData[index] = static_cast<unsigned char>(r);
            imageData[index + 1] = static_cast<unsigned char>(g);
            imageData[index + 2] = static_cast<unsigned char>(b);
            imageData[index + 3] = static_cast<unsigned char>(a);
        }
    }
    // テクスチャの作成
    D3D11_TEXTURE2D_DESC texDesc;
    ZeroMemory(&texDesc, sizeof(texDesc));
    texDesc.Width = width;
    texDesc.Height = height;
    texDesc.MipLevels = 1;
    texDesc.ArraySize = 1;
    texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    texDesc.SampleDesc.Count = 1;
    texDesc.Usage = D3D11_USAGE_DEFAULT;
    texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;

    D3D11_SUBRESOURCE_DATA initData;
    ZeroMemory(&initData, sizeof(initData));
    initData.pSysMem = imageData;
    initData.SysMemPitch = width * 4; // Assuming 32-bit RGBA

    ID3D11Texture2D* texture = nullptr;
    device->CreateTexture2D(&texDesc, &initData, &texture);

    // ShaderResourceViewの作成
    ID3D11ShaderResourceView* pSRV = nullptr;
    device->CreateShaderResourceView(texture, nullptr, &pSRV);

    // 解放処理
    delete[] imageData;
    return pSRV;
}
gitを基本からまとめてみた【便利なgitコマンド】

作業ディレクトリから追跡されていないファイルやディレクトリを削除する時
※ -fオプションは、強制的に削除する時に使用する

```
git clean -f
```
カレントブランチをリモートの同名ブランチにプッシュする時
```
git push origin HEAD
```
GitHub CLI（gh コマンド）を使用して、GitHub リポジトリでプルリクエストを作成する時
```
gh pr create -full -a 
```
作業ディレクトリに変更がある場合に、リベースが失敗する可能性を回避する時

```
git rebase --autostash
```
ファイルを編集していた場合に、コミットせずに保存する時
```
git stash
```
リモートリポジトリから最新の変更を取得する時

```
pull --rebase origin main --autostash
```
不要なリモートブランチを削除

```
git fetch --prune
```


## 参考サイト
[地味だけど便利なgitコマンド使い方](https://www.youtube.com/watch?v=1be137NUOa4)
apexで送信

DKIM (Domain Keys Identified Mail) 鍵機能を使用すると、お客様の会社に代わって送信される送信メールに Salesforce が署名できるようになります。 これらの署名は、受信者に、メールがお客様の会社と整合性のある方法で処理されたという信頼感を与えます。

つまり、apexで送信する場合、もしfromaddressが持っていない時は、黙認でSalesforceの署名を埋めます。その時のDKIMは不可欠です。



EmailMessage e = new EmailMessage();
e.parentid = c.id;
// Set to draft status.
// This status is required 
// for sendEmailMessage().
e.Status = '5'; 
e.TextBody = 
  'Sample email message.';
e.Subject = 'Apex sample';
e.ToAddress = 'customer@email.com';
insert e;

List<Messaging.SendEmailResult> 
  results = 
  Messaging.sendEmailMessage(new ID[] 
    { e.id });
【メモ】インスタAPIで詰まった件→解決

【事象】
・V17.0
・長期（2個目）のトークンまではできた。
・無期限トークンが空欄で帰ってくる
・me?fields=instagram_business_accountがエラー

【やったこと】
長期（2個目）のトークンまではできたところから
グラフAPIエクスプローラに2個目のトークンをセット。

ユーザートークンからページアクセストークンに変更し
ページはインスタと連携しているページを指定して
me?fields=instagram_business_account
するとインスタIDが帰ってきた。

この状態で無期限トークンもゲットできました。
無期限トークンは空欄になったものをそのまま使用したので
ユーザートークンからページトークンに切り替え、更にインスタ連携ページを指定することで
加納になりました。
（それしか変えてないもん）


「画像付きでもっとわかりやすく書けや！」
って思ったけど、とりあえずメモや。

反響大きかったら丁寧に書きますです。
編集不可のPDFを生成する

##### 目的
Laravelで生成したPDFを編集不可にしたい。

##### 現状のPDF生成
LaravelでPDFを生成する時に[Snappy](https://github.com/barryvdh/laravel-snappy)を利用しております。
PDFを生成すると編集可能状態のPDFが出来上がります。
[こちら](https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2808)にもあるようにwkhtmltopdfではパスワード付きのPDFなどは作成できません。
生成されたPDFのセキュリティ情報
![通常.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590304/80ac28ec-1bc3-0afe-d81f-c945b74cb89f.png)

##### qpdfを使ってみる
[qpdf](https://github.com/qpdf/qpdf)を利用すればパスワード保護などのPDFが生成できるようなので試してみます。
インストールは割愛、各自の環境に合わせインストールして下さい。

[ドキュメント](https://qpdf.readthedocs.io/en/stable/cli.html#option-encrypt)を見ると `encrypt` オプションでパスワード付き編集不可のPDFにできそうです。

```
--encrypt user-password owner-password key-length [options] --
```
`--encrypt` で始まり `--` までが `encrypt` オプションのようです。
コマンドを試してみます。
```
$ qpdf --encrypt "" "hogehoge" 256 --modify=none -- --replace-input /tmp/test.pdf
```

再度、PDFのセキュリティ情報を確認してみると以下のようになりました。
![3a7f67b9-87d1-4262-8419-0f782de0b7ef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590304/9f5e219f-b39f-2d09-9b86-1a2e8a2b1dbe.png)

無事、文章変更不可のPDFが生成できました。
Laravelで生成したPDFにqpdfコマンドを実行してあげれば編集不可のPDFが出来上がります。
特徴量エンジンKaskadaの宣言型クエリ言語 Fenl ~異なるエンティティの結合


# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。

まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/fenl/fenl-faq.html#joining-expressions-with-different-entities


## 異なるエンティティの結合

Fenl式によって生成される値はすべて、定数でなければ(たとえば、`42`も、Fenlの式だと言えます)、エンティティに関連付けられています。

エンティティは、以下の性質を持ちます。

- 集計 (例`sum`: `min`、 、`first`) は、各値のエンティティ キーにスコープされます。
- 複数の引数 (すなわち`add`または `eq`) を受け入れる単純な関数では、非定数引数に互換性のあるエンティティ キー タイプがあり、同じエンティティ キーを持つ値の間で動作します。

このスコープ動作により、同一のエンティティ同士の一般的な操作を簡単に作成できますが、多くの場合、値を異なるエンティティ キーと組み合わせるニーズがあります。

例えば、式`ProductReview.stars`は、個々のレビューがキーとなりますが、それぞれの内容は、`Product`と言うエンティティに関係しています。

関数`lookup`サポートは、このようなユースケースをサポートします。`lookup` 関数は 2 つの引数を取ります。最初の引数`key`(キー式) は検索されるエンティティ キーを記述し、2 番目の引数`value`(外部式) は検索される値を記述します。

```javascript
lookup(key, value)
```
 - キー式は「他の」エンティティ キーを識別し、「この」エンティティの値に対する操作として表現する必要があります。たとえば、個々の製品レビューに関連付けられたレビュー担当者に関する情報を検索したい場合、キー式は`ProductReview.reviewer_id`のようになります 。
 - 外部表現`value`は、検索する値を記述し、「他の」エンティティの値に対する操作として表現します。


以下のように、各製品レビューから、関連する情報をまとめることができます。
```javascript
{
  product_id:     ProductReview.product_id,
  reviewer:       ProductReview.reviewer_id,
  reviewer_avg:   lookup(ProductReview.reviewer_id, ProductReviewByReviewer.stars | mean()),
  reviewer_count: lookup(ProductReview.reviewer_id, ProductReviewByReviewer.stars | count()),
}
```
ルックアップ式は、キー式が `null` 以外の値を生成するたびに、外部式の値を生成します。
特徴量エンジンKaskadaの宣言型クエリ言語 Fenl~連続性（Continuity）

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/fenl/continuity.html

# 連続性（Continuity）
Fenl 式は離散的(discrete)または連続的(continuous)のいずれかの性質を持ちます。離散式(discrete expresion)は、特定の時点でのみ意味のある値を記述します。連続式(continuous expression)は、時間の範囲にわたって意味のある値を記述します。

概念的に語ると難しそうですが、実際のところは特に難しいところはありません。

## 離散式 Discrete Expressions
- 離散式は有限の時点の集合で値を生成します。
- それ以外の時間ではその値は`null`になります。

「有限の時点の集合」などと言うと、近寄りがたく感じますが、実のところ、実際に発生した（＝有限の）時々のイベントの情報（＝時点の集合で値を生成）と言う意味です。つまりは、単なる日時の情報をもつレコードのリスト（いってみれば、RDBのテーブルに格納されているような情報）と考えることができます。

テーブルには有限のイベントセットが含まれており、各イベントは特定の時刻に関連付けられています。テーブルには、「イベントが存在する」一連の時間における意味のある値のみが含まれます。

その意味でテーブルに含まれるレコードは不連続（＝離散的）です。

離散式に、単純な操作（フィールド参照など）を適用すると、同様に、不連続な結果が生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/060289a7-00b7-bdd7-17d3-2494a48740f2.png)


離散式は、図のようにさまざまな方法で組み合わせることができます（図では、加算を実行）。

ほとんどの場合、操作は入力式の 1 つが値を生成するたびに出力値を生成します。この例では、式`Purchase.amount`と`Review.stars`とは、多くの場合、異なる時点で定義されており、数値に`null`を加算すると`null`が生成されるため、生成される値の多くは`null`であることになります。

そもそもこの例では、購入数をレビューの星の数を足すという、異なる基準のものを単に合算すると言う意味で、あまり意味のない操作ですが、この条件は、Fenl式における振る舞いとして理解する必要があります。

## 連続式 Continuous Expressions

- 連続式は、あらゆる時点で意味のある値を持ちます。連続式は、その値に寄与するたびに値を生成します。

具体的に考えてみると、たとえば、任意の時点で、これまでに確認された`Purchase.amount`のすべての値の合計を記述することができます 。

このように、「集計」の操作をおこなった結果は連続値が生成されると考えることができます。つまり、合計値（例えば、合計購入数）は、イベント（X月X日の購入）に関係しておらず、（抽象的に考えれば）過去のどの時点でも値が存在するといえます（紀元前１0000年１月１日時点の私のAMAZONでの総購入数は０です）。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/f1a13cb3-f6fa-89d8-77c1-2abbb6e7cf5b.png)


連続式は常に値を持つとはいえ、式の上では、ある特定の時点で値を生成します。上の図では、そのような特定の時点を赤い線上の赤い丸で示しています。

連続式は、更新のストリームを生成するとイメージすることもできます。ストリームは常に最新の更新値を提供します。


## 連続式と離散式の間の相互作用
複数の式を含む演算の結果の連続性(Continuity)(の種類)は、演算の入力の連続性に依存します。一般に、離散性は「貪欲（Greedy）」です。

連続式と離散式を演算する場合の、任意のペア間の二項演算の結果を次の表に整理します。

|   |Discrete[A]|Discrete[B]|Continuous
|---|---|---|---
|Discrete[A]|Discrete[A]|Discrete[A and B]|Discrete[A]|
|Discrete[B]|Discrete[A and B]|Discrete[B]|Discrete[B]
|Continuous|Discrete[A]|Discrete[B]|Continuous


離散式を連続式と組み合わせると、離散式に存在する各時点の値が、連続式がその時点で持つ値と結合されて結果が生成されます。

## 値生成時のフィルタリング
前述したように、式間のほとんどの演算は、入力式が値を生成するときに値を生成します 。これにより、望ましくないタイミングで値が生成される可能性があります。そのようなケースを避けるために、`when`操作により、式が値を生成する時間をフィルタリングすることができます。`when`は、述語式が`true`の値を生成するたびに式の値を生成することによって機能します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/f6420eab-8a69-e027-b795-8c55e21e1a63.png)
Proxmox 8の注意事項

2023/6/22 に [Proxmox 8.0 が公開されました](https://www.proxmox.com/en/downloads)。🎉

そこで Proxmox 8.0 を使う際の注意事項を記載します。

## 1. `/etc/apt/sources.list*` の修正が必要

デフォルトのまま使用すると、`apt-get update`でエラー 🔥 が発生するため、以下の 3 つのファイルの修正が必要です。

- `/etc/apt/sources.list`
- `/etc/apt/sources.list.d/pve-enterprise.list`
- `/etc/apt/sources.list.d/ceph.list` 👈 8.0 から追加されました。

👉 以下のスクリプトを実行することで、必要な修正を簡単に行えます。

```bash
bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/misc/post-pve-install.sh)"
```

https://tteck.github.io/Proxmox/#proxmox-ve-post-install

<details>
<summary>修正後の `sources.list` を見る</summary>

```conf:/etc/apt/sources.list
deb http://ftp.debian.org/debian bookworm main contrib
deb http://ftp.debian.org/debian bookworm-updates main contrib

# Proxmox VE pve-no-subscription repository provided by proxmox.com,
# NOT recommended for production use
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription

# security updates
deb http://security.debian.org/debian-security bookworm-security main contrib
```

```conf:/etc/apt/sources.list.d/pve-enterprise.list
# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise
```

```conf:/etc/apt/sources.list.d/ceph.list
# deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise
deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription
```

公式の説明は 👉 [このリンク](https://pve.proxmox.com/wiki/Package_Repositories)から確認できます。

</details>

## 2. `apt-get upgrade` ではなく `apt-get dist-upgrade` を使用する。

Proxmox ホストでは、`apt-get upgrade` ではなく `apt-get dist-upgrade` を使用してください。  
 👉 [公式説明](https://pve.proxmox.com/wiki/System_Software_Updates)

## 3. Proxmox で Tailscale を使用する際の注意事項 🔥

LXC ではホストの `/etc/resolv.conf` を引き継ぐため、ホストに Tailscale をインストールしている場合は、`100.100.100.100` が DNS サーバーになります。

LXC に Tailscale をインストールしていない場合や、下記 4.の設定を知らずに Tailscale をインストールした場合、LXC 内では**DNS での名前解決ができません**。

👉 `traceroute google.com`も、`ping google.com`も、`apt update`も**できません。** 🔥🔥

そのため、Tailscale がインストールされた Proxmox ホストで LXC を使用する場合、  
LXC の DNS 設定は `1.1.1.1 100.100.100.100` などにしておくことをお勧めします。

![LXC_DNS_settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/dc4278f9-1823-f4d3-1f54-d5ff8fa25225.png)

## 4. Proxmox の LXC で Tailscale を使用する際の注意事項

Proxmox の LXC で Tailscale を使用する場合は、ホストで設定ファイルを[修正する](https://tailscale.com/kb/1130/lxc-unprivileged/)必要があります。  
例えば LXC の ID が 101 の場合は、ホストの `/etc/pve/lxc/101.conf` に以下の内容を追記してください。

```conf:/etc/pve/lxc/XXX.conf
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
```
Flask-SQLAlchemyについて色々

## SQLAlchemyとは
Pythonでよく使われるORMの一つ

https://www.sqlalchemy.org/

## Flask-SQLAlchemyとは
SQLAlchemyのエンジンとかsessionmaker/factoryとかテーブルの生成記述を省略したりできる。

https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/

version2.xではcreate_engine()とかSQLAlchemyにある機能も搭載されていたが、
version3.xのドキュメントから消えているのでなくなったっぽい？

前のAPIが見たい方はコチラ

https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/

## 実際のコードの違い
### SQLAlchemyのモデル定義方法
~~~python
from sqlalchemy import String, create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

class Base(DeclarativeBase):
    pass

# 作成したいモデル
class User:
    __tablename__ = "user"
    id: Mapped[int] = mapped_column(primary_key=True,
                                    autoincrement=True)
    username: Mapped[str] = mapped_column(String(30))
    email: Mapped[str] = mapped_column(String(30))

# MySQLのURI
SQLALCHEMY_DATABASE_URI = \
        "mysql+pymysql://{user}:{password}@{host}/{dbName}?charset=utf8".format(
		user = "root",
		password = "",
		host = "localhost",
		dbName = "practice_data_origin",
	)

engine = create_engine(SQLALCHEMY_DATABASE_URI)

Base.metadata.create_all(engine)

~~~
### flask-SQLAlchemyのモデル定義方法
~~~python:
from flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = \
        "mysql+pymysql://{user}:{password}@{host}/{dbName}?charset=utf8".format(
		user = "root",
		password = "",
		host = "localhost",
		dbName = "practice_data",
	)

db = SQLAlchemy( app )

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer,
                   primary_key=True,
                   autoincrement=True)
    username = db.Column(db.String(30))
    email = db.Column(db.String(30))

with app.app_context():
    db.create_all()

~~~


### 接続方法

スレッドセーフにセッションを生成する方法を現状これしか知らないので、SQLAlchemy/flask-sqlalchemyどちらもこれで生成した方が無難かもです
~~~python
sessionFactroy = sessionmaker(autocommit=False,
                              autoFlush=True,
                              bind=engine)
session = scoped_session(sessionFactory)
~~~


### 補足：SQLAlchemyのSQLログ標準出力方法

どんなSQL文が実行されたかをターミナルに出力する方法は３つ。
- loggingで設定する
~~~python
import logging

logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
~~~

- create_engineの仮引数echoにTrueを入れる
~~~python
from sqlalchemy import create_engine
engine = create_engine("sqlite://", echo=True)
~~~

- (flask-sqlalchemy限定)app.config['SQLALCHEMY_ECHO']
~~~python
app.config['SQLALCHEMY_ECHO'] = True
~~~


### 補足2:つまずいたポイント

- SQLAlchemy単体でモデル定義した際、公式のクイックスタートでは、varcharカラム(String)'fullname'に桁数を入力していないため、エラーになるため、桁数設定が必要。
なお、intカラムで桁数入力を省略すると、'11桁'指定になる。

- flask-SQLAlchemyで、
~~~python
#↓実行できる
with app.app_context():
    db.create_all()

#↓実行できない
db.create_all()
~~~

#### 参考にさせていただいたサイト

https://docs.sqlalchemy.org/en/20/orm/quickstart.html

https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/quickstart/#

https://sogo.dev/posts/2023/02/fastapi-orm-sqlalchemy