OmniAICreator/Qiita-1.07M huggingface dataset:
Octave で正規表現による文字列マッチング

# Octave で正規表現による文字列マッチング

## 1.　パターンマッチング `regexp()`

UTF-8 文字列中の文字列からパターンに一致する，位置，部分文字列を返す。一致しない場合は空値を返す。

    usage:
    [s, e, te, m, t, nm, sp] = regexp (str, pat)
    […] = regexp (str, pat, "opt1", …)

演算子 | 摘要
:-----|:-----
`.` | どんな一文字にもマッチする
`*` | 0 回以上マッチする
`+` | 1 回以上マッチする
`?` | 0 回または 1 回マッチする
`{n}` | 正確に n 回マッチする
`{n,}` | n 回以上マッチする
`{m,n}` | m 回以上，n 回以下マッチする
`[…]` `[^…]` | [] 内に定義される文字。最初の文字が ^ ならそれ以降で定義される文字以外の文字。
`()` `(?:)` | グループ化演算子
`丨` | 選択演算子。グループ化演算子 () で囲まなければならない。
`^` `$` | 先頭と末尾

エスケープ記号 | 摘要
:-----|:-----
`\d` | 数字にマッチ
`\D` | 数字以外にマッチ
`\s` | 空白類にマッチ
`\S` | 空白類以外にマッチ
`\w` | 語の構成要素にマッチ
`\W` | 語の構成要素以外にマッチ
`\<` | 語の開始にマッチ
`\>` | 語の終了にマッチ
`\B` | 語の中にマッチ

戻り値 | 摘要
:-----|:-----
s | 開始位置
e | 終了位置
te　| The extents of each matched token surrounded by (…) in pat 
m | すべてのマッチのセル配列
t | マッチしたトークンのセル配列
nm | マッチ結果の structure
sp | 戻り値のセル配列

引数で戻り値を指定できる。

引数 | 摘要
:-----|:-----
`'start'` | s
`'end'` | e
`'tokenExtents'` | te
`'match'` | m
`'tokens'` | t
`'names'` | nm
`'split'` | sp

追加された引数 | 摘要
:-----|:-----
`'once'` | 最初のマッチだけを返す
`'matchcase'` | 大文字・小文字を区別する（デフォルト）
`'ignorecase'` | 大文字・小文字を区別しない
`'stringanchors'` | 文字列を `^` `$` にマッチの対象とする（デフォルト）
`'lineanchors'` | 1 行を `^` `$` にマッチの対象とする（デフォルト）
`'dotall'` | . は改行を含むすべての文字にマッチする（デフォルト）
`'dotexceptnewline'` | . は改行を除くすべての文字にマッチする
`'literalspacing'` | パターンに空白も含める（デフォルト）
`'freespacing'` | パターンに空白類，`#` も含める
`'noemptymatch'` | 長さ 0 のマッチは返さない（デフォルト）
`'emptymatch'` | 長さ 0 のマッチも返す


```matlab
[s, e, m] = regexp('1.234', '[-+.\d]+', 'start', 'end', 'match')
```

    s = 1
    e = 5
    m =
    {
      [1,1] = 1.234
    }
    



```matlab
[s, e, te, m, t, nm, sp] = regexp('1.234', '[-+.\d]+')
```

    s = 1
    e = 5
    te =
    {
      [1,1] = [](0x2)
    }
    
    m =
    {
      [1,1] = 1.234
    }
    
    t =
    {
      [1,1] = {}(1x0)
    }
    
    nm =
    
      scalar structure containing the fields:
    
    
    sp =
    {
      [1,1] = 
      [1,2] = 
    }
    


以下の例は，'a' は 'b' を0回以上含む（文字位置 1 と末尾の計 2 回）


```matlab
regexp('a', 'b*', 'emptymatch')
```

    ans =
    
       1   2
    



```matlab
regexp('a', 'b*')
```

    ans = [](1x0)


## 2.　大文字小文字を区別しないパターンマッチング `regexpi()


```matlab
[s, e, m] = regexp('01AbC', '[a-c]+', 'start', 'end', 'match')
```

    s = 4
    e = 4
    m =
    {
      [1,1] = b
    }
    



```matlab
[s, e, m] = regexpi('01AbC', '[a-c]+', 'start', 'end', 'match')
```

    s = 3
    e = 5
    m =
    {
      [1,1] = AbC
    }
    


## 3.　文字列置換 `regexprep()` 


```matlab
regexprep("Bill Dunn", '(\w+) (\w+)', '$2, $1') 
```

    ans = Dunn, Bill



```matlab
regexprep("12abc345xyz", '[0-9]', '*')
```

    ans = **abc***xyz



```matlab
regexprep("12abc345xyz", '[0-9]', '*', 'once')
```

    ans = *2abc345xyz


## 4.　文字列を正規表現に変換する `regexptranslate()`

### 4.1.　ワイルドカード文字の変換

`.`, `*`, `?` を変換する。


```matlab
regexptranslate("wildcard", ". * ?")
```

    ans = \. .* .


### 4.2.　エスケープ文字の変換

`$`, `^`, `.`, `?`, `[`, `]` などを変換する。


```matlab
regexptranslate("escape", "12.5")
```

    ans = 12\.5



```matlab
regexptranslate("escape", "$ . ? [ ] ^")
```

    ans = \$ \. \? \[ \] \^
【Selenium】バージョン更新後のWarningについて

seleniumのバージョンによりfind_element_by_xpathなどで要素検索すると以下ようなWarningメッセージが出ます。

```bash
<stdin>:1: DeprecationWarning: find_element_by_tag_name is deprecated. Please use find_element(by=By.TAG_NAME, value=name) instead
```

翻訳にすると以下のようなメッセージです。

```bash
<stdin>:1: DeprecationWarning: find_element_by_tag_name は非推奨です。代わりに find_element(by=By.TAG_NAME, value=name)を使って下さい。
```

また、以下のバージョンの場合に発生します。

```bash
$ pip list | grep selenium
selenium              4.1.3
```

どうやらfind_element_by_XXはfind_element(By.XX)に変わったようです。

今のところはWarningメッセージが出るだけで処理自体で実行できますが、非推奨ということですので、find_element(By.XX)に変更する方が良いでしょう。

また、deprecatedという単語は本件のみではなくいろんなところで見かける単語になりますので、何かのlogにこの単語がある場合非推奨なんだなぁってわかるようにしておくことは必要かと思います。

## クイックリファレンス

私は基本的にSeleniumで何かしたい場合は以下クリックリファレンスを参考します。
こちらにいつの間にか更新されておりましたので、
以下リンクを参考するのが良いかと思いますので、ぜひブックマークとかに登録しましょう

[Selenium API(逆引き)](https://www.seleniumqref.com/api/webdriver_gyaku.html)
WordPressで自作テーマを作る(ページ構成ファイル)

# はじめに
こちらの記事の続きで書いてます。

https://qiita.com/Nats72/items/9371ac484f95f03465cf

# ページを構成するファイル
ページを構成するファイルは主に以下の5種類あります。
すべて、テーマファイルの直下に作成すれば良いです。
- front-page.php
- home.php
- index.php
- page.php
- single.php

全部作らなきゃいけないわけではなくて、ページにアクセスしたときに、どのファイルが読み込まれるのか、ルールが決まっています。

## 各ファイルの説明
- front-page.php、home.php、index.phpはトップページを表示させるファイル
- page.phpは固定ページを表示させるファイル
- single.phpは投稿ページを表示させるファイル

# index.phpは使わなくても必須
テーマファイルには、`index.php`と`style.css`が最低限必要となります。
なので、使わなくても必要になります。そういう仕様なので仕方ないです。

# トップページ設定の挙動
トップページをの表示は、ホームページの表示設定によって動作が変わります。
`設定` > `表示設定` > `ホームページの表示`の項目によって動作が変わります。

### 最新の投稿に設定
front-page.phpが存在しなければ、home.phpが読み込まれ、home.phpも存在しなければindex.phpが読み込まれます。
`front-page.php > home.php > index.php`

### 固定ページに設定
固定ページに設定した場合は、page.phpが2番目に優先されます。
- ホームページのみ設定した場合
`front-page.php > page.php > home.php > index.php`の順で呼び出され、固定ページがトップページとなります。

- 投稿ページのみ設定した場合
`home.php > index.php`の順で呼び出され、投稿記事一覧ページがトップページとなります。

- ホームページと投稿ページ両方設定した場合
固定ページが`https://{FQDN}/`のアドレスでトップページに設定されます。
`https://{FQDN}/{設定した固定ページ}/`が、投稿記事一覧ページとして設定されます。

# 固定ページを表示させる場合
`page.php`が読み込まれます。

# 投稿ページを表示させる場合
`single.php`が読み込まれます。

# 参考にさせていただいたサイト様
https://wemo.tech/1835
Rubyとmittsuライブラリを使って3D対戦アクションゲームつくってみた

# 概要
この記事は私が躓いた当たり判定についての備忘録です。
2022夏の[Ruby合宿](https://www.rubycamp.jp/)にて今回のゲームを作成しました。
作ったゲームのリポジトリは[こちら](https://github.com/RubyCamp/rc2022su_team1)です。初対面のメンバー4人でチーム開発＆初めてGit,Github使って開発しました。
使用した技術はRuby, [mittsuライブラリ](https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fdanini-the-panini%2Fmittsu&sa=D&sntz=1&usg=AOvVaw2TspYQITfq_UZI5vMUMfiz)です。
自分は当たり判定を主に担当しましたので、当たり判定で困っている方の助けになれば嬉しいです。
アイデア出し含む制作期間は4日です
# この記事で伝えたいこと
当たり判定で躓いてからどのように修正したのかの思考過程
# ゲームの概要

## 3Dぴんぽんバトル
## Install
depends on Ruby 2.x, Mittsu, OpenGL 3.3+, and GLFW 3.1.x
Mittsu:https://github.com/danini-the-panini/mittsu
## ゲーム内容
３D空間で卓球をします。
勝利条件：4点先取
## 操作方法
space:スタート＆リスタート
#### 左ラケット
W:上移動
A:左移動
S:下移動
D:右移動
#### 右ラケット
↑:上移動
←:左移動
↓:下移動
→:右移動

---
デモ動画です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/ixVBV0KeZak" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


### 苦労したポイント
- 当たり判定
初め、板の中心とボールの中心との距離で判別していたため板の中心にしか当たり判定がなかった。
![IMG_1020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708701/a64cef07-272d-9fd8-c958-e0f4df6df8d2.jpeg)
かといって当たり判定をデカくしすぎると違和感しかない。なのでラケットの後ろに当たり判定用の物体を生成してそれとボールの距離で判別することにした。
![kaizen.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708701/88f701ea-1bad-63dc-a9f7-33655aa478b5.jpeg)
ただ、どれくらい後ろに置けばよいのかわからん。なので公式（？）を作ってみた

![IMG_1022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708701/d682e0e2-e3c3-e737-d2a6-cffd32796d9f.jpeg)
実装してみるといい感じになったので合ってそう
ただ、これだとまだ問題があって
![IMG_1024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708701/fc08666d-805d-203b-a653-0bab27de32e1.jpeg)
角に判定がないので大きめに判定をすることでごまかしました（ガバ）


# 感想
公式作ってるおかげでボール・ラケットを大きくしても当たり判定が正常に動作してくれるの嬉しかった
反省としては、mainファイルにいろんな機能を入れた結果読みづらいコードになった。なので次回以降は機能ごとに別ファイルにまとめることを意識してコーディングしていこうかなと
影つけるだけでカクついたので今度はRubyじゃなくてUnityでゲーム開発しようと思います。
チームメンバーのみなさま本当にありがとうございました。
Octave による面グラフの描き方

# Octave による面グラフの描き方 `area()`

1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005,2007, 2008, 2009 年の，悪性新生物，心疾患，脳血管疾患，肺炎，老衰，不慮の事故による死亡率（人口10万対）


```matlab
x = [1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005,2007, 2008, 2009]';
y = [116.3  86.7 175.8  27.1  38.1  42.5
     122.6  89.2 156.7  27.4  26.9  30.3
     139.1 106.2 139.5  28.4  27.6  25.1
     156.1 117.3 112.2  37.5  23.1  24.6
     177.2 134.8  99.4  55.6  19.7  26.2
     211.6 112.0 117.9  64.1  17.3  36.5
     235.2 116.8 105.5  69.2  16.9  31.4
     258.3 137.2 105.3  85.0  20.9  31.6
     266.9 139.2 100.8  87.4  24.4  30.1
     272.3 144.4 100.9  91.6  28.6  30.3
     273.5 143.7  97.2  89.0  30.7  30.0];
```

各疾患名を描く y 座標(`pos`)を求める。


```matlab
z = cumsum(y, 2)(end, :)
z2 = [0, z(1:end-1)]
pos = mean([z; z2])
```

使用できるフォント名は `"DejaVuSans"`, `"Arial"` などであるが，実際はどれを指定しても同じフォントになってしまうようだ。

`set(gca, "fontsize", n)` と，他の関数での `"fontsize"` 指定の折り合いがつかない場合があるようだ。

title はセルストリング {t1, t2, ...} を使うと複数行に分けて付けることができる。


```matlab
area(x, y)
set(gca, "tickdir", "out")
set(gca, "fontname", "DejaVuSans")
set(gca, "fontsize", 16)
title({"死因別死亡率の年次推移", "1970-2009年，人口10万対"},
      "fontname", "DejaVuSans")
xlabel("年")
ylabel("死亡率（人口10万対）")
text(repelem(2010, 6), pos,
     {"悪性新生物", "心疾患", "脳血管疾患", "肺炎", "老衰", "不慮の事故"},
     "fontname", "DejaVuSans", "fontsize", 12)
xlim([1968, 2019])
box off
```

![output_6_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/dfe9a578-1e9a-63d5-4544-2287ee96bbf3.png)
Capybaraで要素がないことを確認するテスト

# 概要
Capybaraでテストを書いていて、ある条件で要素がない、表示されないことを確認するテストはどう書くんだろうと調べた結果の個人的なメモです。

```Ruby
expect(page.all('.hoge', text: 'AAAAA').empty?).to eq true
```

.hogeというクラスを持つ要素でテキストがAAAAAのものを探して、それがemptyであることを確認することでテスト出来た。

また以下のようにも書けた。

```
      expect {
        find('.hoge', text: 'AAAAA')
      }.to raise_error(Capybara::ElementNotFound)
```

## 参考にしたサイト

以下のサイトを参考にしました。ありがとうございます。

[Capybaraで要素がないことをテストする方法](http://319ring.net/blog/archives/2546/)

[Capybara(Rspec)で指定したセレクタ要素が存在しないことを検証する](http://qs.nndo.jp/2017/07/20/603/)
[CodeIgniter4 Tips] getCompiledSelect で useSoftDelete が効くようにする（Codeigniter 4.2版）

## バグ修正の影響

以前書いた記事
[getCompiledSelect の罠、 useSoftDelete が抜け落ちる](https://qiita.com/bananacoffee/items/0aff3f5cd005a5f1bfc6)
について、
[getCompiledSelect で useSoftDelete が効くようにする](https://qiita.com/bananacoffee/items/1b9b56ce541174a3fb7d)
という記事で解決法を記載したが、Codeigniter 4.2.0にて
```This is a method of the `Query Builder` class.```
というエラーが表示されるようになった。

これは [getCompiledSelect の罠、 useSoftDelete が抜け落ちる](https://qiita.com/bananacoffee/items/0aff3f5cd005a5f1bfc6) の @kenjis さんのコメントにある通り、本来クエリビルダにて利用するためのもので、Modelに利用するべきものではないという考えのため。
恐らく他のものにも適用されていると思われる。

## それでもやっぱり使いたい

だって便利なんだもの。
そこで、強引に解決させた。

[getCompiledSelect で useSoftDelete が効くようにする](https://qiita.com/bananacoffee/items/1b9b56ce541174a3fb7d) からの修正点を記載する。

対象ファイル： app/Models/MyModel.php

```diff_php 
<?php
namespace App\Models;
use CodeIgniter\Model;

class MyModel extends Model {
	public function __construct() {
		parent::__construct();
	}

	public function getCompiledSelect(bool $reset = true) {
		if ($this->tempUseSoftDeletes) {
			$this->where($this->table . '.' . $this->deletedField, null);
		}
-		return parent::getCompiledSelect($reset);
+		$builder = $this->builder;
+		return $builder->getCompiledSelect($reset);
	}
}
```

Modelはその利用方法をみて分かる通り、クエリビルダを継承しているため、`getCompiledSelect` を行う手前で**ビルダになりすましてしまえばOK**、という考え方。
せこい。
丸型デザインは角型デザインより何故良いか


丸形デザインが流行っている。もはやスタンダードかもしれない。角が取れて丸くなる。では丸型デザインは何が良いのか。
# 丸は認知に優しい
四角形には辺が4個ある。丸には1つの線しかない。これが人間の認知に優しいのではないか。
# 丸は自然界に存在する
丸は自然界に多く存在する。その逆に四角はほぼ工業の世界にしか存在しない。工業の都合で作られた不自然なデザインだ。なので僕らが問いかけるべきなのは「何故丸形デザインにするのか」ではなく「何故昔は四角いデザインだったのか」だ。それは単に作りやすかったからだろう。
# 丸は触っても怪我をしない
丸形デザインは触っても安全だ。スマホのアプリを触って怪我でもしたら大変だろう。
# では角型を使うべき時はいつか？
分からない。この問題について熟考しているデザイナーの方は今すぐ日本CSS総合研究センターまで連絡して欲しい。
# 参考
ここまで書いた後にGoogleで調べてみた。認知に優しい説は正しいかもしれない。僕はしたり顔をした。

>ビジュアル認知の権威：Jürg Nänni教授によると、『鋭角の長方形は同じ大きさの楕円より認知するのに努力を必要とする。人間の目は円形のものをより速く捉えることができる。」と述べています。

https://coliss.com/articles/build-websites/operation/design/why-do-we-love-roundes-corners-by-designmodo.html

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
[Notion API] validation: path.page_id should be a valid uuid

# 問題
Notionのapiでタスクを作成する機能を作りました。
その際に、親タスクや子タスクをrelationさせたかったのですが、notionのpageIdを指定したら valid uuidのエラーが出る。

ちなみにpageIdはurlの○○○-以降を指定
notion.so/○○○-668d797c76fa49349b05ad288df2d136

# ページIDってなに
ここで注目したいのが「uuid」の部分[document](https://developers.notion.com/reference/page)を見るとuuid(v4)と書いてある。そう、uuid(v4)表記なっていないのが問題でした。

8桁-4桁-4桁-4桁-12桁
でそれぞれハイフンで区切る必要がある。
今回の例だと
「668d797c-76fa-4934-9b05-ad288df2d136」と表記すればいけた！

# UUIDとは
Universally
unique
Identifier
日本語的には普遍的に重複しないIDのこと

16進数で128ビットを表すので32文字の固定長文字列になる

https://tex2e.github.io/rfc-translater/html/rfc4122.html
AmplifyでカスタムGraphQLクエリと型情報を生成する方法

# 本記事を対象とする人
- Web(React,Vueなど)でAmplify利用し、自動生成されるクエリでは足りなくなった

# 結論
- graphqlconfig.ymlのincludesに指定しているディレクトリにファイルを作成する

# 解説
デフォルトで生成されるスキーマを元に説明します

```~/amplify/backend/api/[project]/schema.graphql
type Blog @model {
  id: ID!
  name: String!
  posts: [Post] @hasMany
}

type Post @model {
  id: ID!
  title: String!
  blog: Blog @belongsTo
  comments: [Comment] @hasMany
}

type Comment @model {
  id: ID!
  post: Post @belongsTo
  content: String!
}
```

- 例として、ブログに投稿されている記事のコメントを取得したい場合

``` ~/src/graphql/customQueries.js
export const getBlogDetail = /* GraphQL */ `
  query GetBlogDetail($id: ID!) {
    getBlog(id: $id) {
      id
      name
      posts {
        items {
          id
          title
          createdAt
          updatedAt
          blogPostsId
          comments {
            items {
              id
              contents
            }
            nextToken
          }
        }
        nextToken
      }
      createdAt
      updatedAt
    }
  }
`;
```

- 生成された型情報


# 注意点
- ```amplify codegen```した際に型生成される対象となるのは、
```~/graphqlconfig.yml
projects:
  [project]:
    schemaPath: amplify/backend/api/[project]/build/schema.graphql
    includes:
      - src/graphql/**/*.js
    excludes:
      - ./amplify/**
    extensions:
      amplify:
        codeGenTarget: typescript
        generatedFileName: src/API.ts
        docsFilePath: src/graphql
extensions:
  amplify:
    version: 3

```
上記のファイルのincludesの部分です。
拡張子をtsなどに変えていると、型が何も生成されないので注意しましょう。
WordPressで自作テーマを作る(共通設定)

# はじめに
こちらの記事の続きで書いてます。

https://qiita.com/Nats72/items/9371ac484f95f03465cf

# 共通設定について
`functions.php`という設定ファイルを作成して、WordPressテーマ共通の設定を記述します。
正式名称を知らないので、ここでは共通設定ファイルと呼ぶこととします。

共通設定ファイルに設定を記述することで、管理ページや固定ページなどの細かな設定をすることができるようになります。
プラグインじゃないとできないと思ってたことも、自作テーマなら実現できたりします。

# 共通設定ファイルを作成
テーマディレクトリの直下に`functions.php`を保存するだけです。
function`s`.phpなので、ファイル名を間違えないように注意しましょう。

# 子ファイルを作る
共通設定は、ものすごいボリュームになることがあるので、分類ごとに子ファイルを作って、親ファイルから呼び出すようにした方が良いです。
1ファイルに詰め込みすぎると、読みにくい・探しづらいが発生します。なので、子ファイル作成をおすすめします。

ディレクトリ構成はこのようにしました。
```
MyTheme/
  ├ function_child/  ※ここに子ファイルをいれていく
  | ├ admin_page_custom.php  ※子ファイル
  | └ login_page_custom.php  ※子ファイル
  ├ functions.php  ※親ファイル
  ├ 404.php
  ├ index.php
  └ style.css
```

## 親ファイルから子ファイルを呼び出す
`include関数`を使って呼び出すだけです。

```./wp-content/MyTheme/functions.php
<?php

// 管理ページカスタマイズ設定を読み込む
include("function_child/admin_page_custom.php");

// ログインページカスタマイズ設定を読み込む
include("function_child/login_page_custom.php");

?>
```
Google ColaboratoryでStable Diffusionを10分で試す

n番煎じで恐縮ですが、流行に乗っかる形で試してみました！
※`txt2img`の方です。

![Thumb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615326/7226fe2b-9a69-2189-6e73-10d1099c23d5.png)
Prompt: 可愛い着物の女の子
`Concept kawaii girl wearing kimono, beautiful face, thickly painted, flowers blooming, bird's eye view`



## 動作環境
- ブラウザ：Vivaldi
- PC: Mac OS Big Sur
- CPU:3.5 GHz Dual-Core Intel Core i7
- メモリ：16GB
※Google Colaboratoryでやるのでブラウザ以外あまり関係ないですが一応記載


## 導入手順
### ▼Hugging Faceにて
#### 1. ログインor新規登録

https://huggingface.co/login?next=%2Fsettings%2Ftokens

#### 2. `Access Token`取得
- Role:`Read`

#### 3. HuggingfaceにてModelを選択。内容確認後、Acceptする。

https://huggingface.co/CompVis/stable-diffusion-v1-4

※ライセンスは[Creative ML OpenRAIL-Mライセンス](https://huggingface.co/spaces/CompVis/stable-diffusion-license)です。


### ▼Google Colaboratoryにて
https://colab.research.google.com/?hl=ja

#### 1. 準備
- ノートの新規作成
- `編集`->`ノートブックの設定`を開く
- ハードウェア アクセラレータにて、`GPU`を選択する。

#### 2. `stable-diffusion-v1-4` のインストール

- diffusers-0.2.4
- ftfy-6.1.1
- huggingface-hub-0.9.0
- tokenizers-0.12.1
- transformers-4.21.2
       
    ```py
    #コピペ
    !pip install diffusers==0.2.4 transformers scipy ftfy
    ```
※Linuxのコマンドは`!`始まりにする。

#### 3. パイプラインを準備する

```py
#コピペ
from diffusers import StableDiffusionPipeline

# 取得したトークンを使用してください
MY_TOKEN = "hf_xxxx"

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=MY_TOKEN)
pipe.to("cuda")
```

#### 4. プロンプトを渡す
```py
#コピペ
#着物を着た可愛い女の子
prompt = "Cute girl with kimono costumue"
image = pipe(prompt)["sample"][0]
image.save(f"output.png")
```

30秒ほどで出来上がり↓
![2877c37b-1e21-443d-8d6f-e5bac48f6bfb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615326/406bf71f-10ca-ce8a-e54d-e491c83ec83c.png)



## 所感
- 導入は10分程度、設定にもよるが画像生成1枚あたり30秒以内
(CPUのみだと1枚あたり20分)
- 動かしたくてもGPUスペックいる問題 -> Google Colaboratory
- プロンプトはコツがいる
    https://ossan-gamer.net/post-81566/
    ※参考にさせていただきました！

欲しい絵を出すためには、シーン（カメラがあってライティング、被写体、マテリアルがどうで）の情報をいかにうまく具体的に言葉で与えるかと、テイストや品質に影響する単語をうまく付与するかが重要で、結果が大きく変わるなあと思いました。


## 今後
- `img2img`試してみたいです。
https://github.com/CompVis/stable-diffusion/blob/main/scripts/img2img.py

- プロンプトをいろいろ変えて楽しんでみようと思います！

以上
bitnami Redmine サブディレクトリ化手順メモ

bitnami Redmine 5.0.X-X (Virtual Machines) のovaをデブロイ後、サブディレクトリでのアクセスに変更の手順メモ

(基本は [HowTo Install Redmine in a sub-URI](https://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_a_sub-URI) を参照）

# apache conf ファイル追加
```/opt/bitnami/apache/conf/redmine-suburl.conf
PassengerPreStart http://localhost:80/
Alias /redmine /opt/bitnami/redmine/public

<Directory "/opt/bitnami/redmine/public">
        Options -Indexes +FollowSymLinks -MultiViews
        AllowOverride All
        Require all granted
        PassengerEnabled on
        PassengerBaseURI /redmine
        PassengerAppRoot "/opt/bitnami/redmine"
        SetEnv RAILS_RELATIVE_URL_ROOT "/redmine"
</Directory>
RailsEnv production
```

# httpd.con 変更
```/opt/bitnami/apache/conf/httpd.conf
#IncludeOptional "/opt/bitnami/apache/conf/vhosts/*.conf" #コメントアウト
Include "/opt/bitnami/apache/conf/redmine-suburl.conf"    #追加
```

# environment.rb 追加
```/opt/bitnami/redmine/config/environment.rb
最後に
Redmine::Utils::relative_url_root = "/redmine"
```

# 最後に
sudo systemctl restart bitnami

# 2025-01-09 追記
Redmine バージョン 6.0.1 では、/opt/bitnami/redmine/public/assets/jstoolbar-57267577.css の内容のURL の書き換え必要

```
sed -i -e "s/\"\/assets/\"\/redmine\/assets/g" jstoolbar-57267577.css
```
# 2025-01-23 追記
さらに application-811dafb9.css の内容のURL 書き換えも必要

```
sed -i -e "s/\"\/assets/\"\/redmine\/assets/g" application-811dafb9.css
```
gnome-connections で EC2 の Windows Server 2019 に接続

## AWS コンソールで、RDP 接続が自分の IP から接続できるようにしておく
-> インバウンドのルールを編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3c9ba71a-5a54-fb2e-35a8-c7bb54e320c8.png)


## 起動

```bash
gnome-connections
```

![gnome_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fe613be6-a8d6-555a-a6b6-c3f2d19abd36.png)

ネットワーク識別子　と　接続の種類を入力
rdp://38.45.92.14:3389

![gnome_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/7d82560c-b42d-191b-9517-4a1f0fed1253.png)

ユーザー名とパスワードのプロンプトが表示される。
![gnome_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/cfbcc522-6743-d37c-faac-ab316fe797c1.png)


ユーザー名は、
　Administrator
パスワードは、
　AWS Console で調べる
![gnome_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/475ebfaf-ba6e-c97c-b5d4-c45aa8c1ca25.png)

パスワードの調べ方
アクション -> セキュリティ -> Windows パスワードを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/030fa0cb-b931-8371-585d-ccc0a705099c.png)

![password_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1ca5e0e8-29cf-a404-b34e-a98065c35626.png)



ログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/cb32ca80-a616-698b-f34c-eb406894473d.png)


## ログイン後のソフトのインストール

「IEセキュリティ強化の構成」の変更
サーバーマネージャー -> ローカルサーバー -> IEセキュリティ強化の構成を
Off にする
Server Manager -> Local Server -> Propeties -> IE Enhanced Security Configuration
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/7075afb7-791d-ea27-0c2c-170d3eca6d3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/500d241d-3c11-689c-5d72-3cda698047bc.png)



クロム
[Google が開発したブラウザ](https://www.google.com/intl/ja_jp/chrome/)

>次のファイルをダウンロードして実行
>```text
>ChromeSetup.exe
>```

Git

>次のファイルをダウンロードして実行
>```text
>Git-2.37.2.2-64-bit.exe
>```
WordPressで自作テーマを作る(最低限のテーマ)

# テーマファイル保存先
`./wp-content/themes/MyTheme`
MyThemeというテーマディレクトリを作る場合、このようなディレクトリ構成にします。

# 必要最低限のテーマ
`index.php`と、`style.css`があればテーマとして認識されます。
以下のように書いてアップロードすれば、ただのペライチページが作られます。
```./wp-content/themes/MyTheme/index.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MyPage</title>
</head>
<body>
    <h1>MyPage</h1>
    <p>This is my page.</p>
</body>
</html>
```
`Theme Name`を指定してあげることで、管理者ページの`外観>テーマ`に表示されるテーマ名を変更できます。
下記の場合、`My Theme`というテーマ名で認識されます。
```./wp-content/themes/MyTheme/style.css
/* Theme Name: My Theme */
```
テーマを適用させるには、`外観>テーマ`でテーマを有効化する必要があるのでお忘れなく。

# 404エラーページを作る
存在しないページにアクセスしたときに表示されるエラーページを作成します。
テーマディレクトリ直下に、404.phpを作成します。
```./wp-content/themes/MyTheme/404.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MyPage</title>
</head>
<body>
    <h1>Error</h1>
    <p>404 Not Found.</p>
</body>
</html>
```
LaravelのartisanをHTTP経由で実行するやつ

諸般の事情でSSHできないとかそういう。

## 環境

Laravel v8.83.23 (PHP v7.4.29)

## コード

とりあえずmigrateしたい。

```routes/web.php
use Illuminate\Support\Facades\Artisan;

Route::get('/migrate', function () {
    Artisan::call('migrate');

    return Artisan::output();
});
```

簡単すぎワロタ。

## 注意

実際にやる場合は認証機能とかでいい感じにするのが良いと思いました。
Spring boot で java.lang.NoSuchMethodError: 'org.thymeleaf.web.IWebExchange org.thymeleaf.context.IWebContext.getExchange()' のエラー


### 環境
spring boot 2.7.2
gradleプロジェクト

### エラーログ
SpringSecurityとThymeleafを連携させ、認証情報をViewで表示させようとしたところエラー。
```
There was an unexpected error (type=Internal Server Error, status=500).
'org.thymeleaf.web.IWebExchange org.thymeleaf.context.IWebContext.getExchange()'
java.lang.NoSuchMethodError: 'org.thymeleaf.web.IWebExchange org.thymeleaf.context.IWebContext.getExchange()'
	at org.thymeleaf.extras.springsecurity5.util.Spring5VersionSpecificUtility.isWebMvcContext(Spring5VersionSpecificUtility.java:80)
	at org.thymeleaf.extras.springsecurity5.util.SpringVersionSpecificUtils.isWebMvcContext(SpringVersionSpecificUtils.java:118)
	at org.thymeleaf.extras.springsecurity5.util.SpringSecurityContextUtils.getAuthenticationObject(SpringSecurityContextUtils.java:127)
	at org.thymeleaf.extras.springsecurity5.auth.AuthUtils.getAuthenticationObject(AuthUtils.java:102)
	at org.thymeleaf.extras.springsecurity5.dialect.processor.AuthenticationAttrProcessor.doProcess(AuthenticationAttrProcessor.java:66)
	at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74)
	at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95)
	at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633)
	at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314)
	at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205)
...
```
### 解決
##### 原因 : 依存関係でバージョンを指定しているため。
Spring Securityのバージョンのそれぞれに対応した、thymeleaf-extras-springsecurityのライブラリを使用しなくてはならないです。
そのバージョンの整合性の関係で発生したエラーだと考えました。
<br>
以下のように記述するとエラーが解消できました。
```build.gradle
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-security'

    //バージョンを指定せずに記述
	implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity5'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}
```

以下のようにthymeleaf-extras-springsecurityのバージョンを指定するとエラーが起こりました。
```build.gradle
//バージョンを指定している
implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity5', version: '3.1.0.M1'
```
バージョンの指定をなくせばエラーは解消できました。
```build.gradle
implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity5'
```
Microsoft Dynamics Finance ＆Operations デモ動画を含むサイトのご紹介 - とりあえず動いているDynamicsを見たい方へ - 

初めまして。
日本マイクロソフトにてDynamics(ERP)とPower Platformのプリセールスをしている稲冨です。

初めての投稿ということで本日はマイクロソフトのERPである、
Dynamics Finance & Operationsのデモ動画を含めたページを紹介します。

https://sway.office.com/poizkJD2aCA8ty6c?ref=Link

過去10年以上、SAP ERPを経験してきて1コンサルタントとして、
SAP ERPは間違いなく素晴らしい製品ではあるものの、

・SAP ERPはエンドユーザにとって、必ずしも使いやすい製品ではないのでは？
・ERPではカバーできない業務は想像以上にあるが、それをカバーできるものは無いのか？
・AIや自動化について、もっとエンドユーザ側に使いやすい仕組にはできないのか？

ということを考えていました。

それらをカバーしてお客様をご支援できるのが、マイクロソフトの持つ、
・Azure
・Power Platform
・Dynamics 365
の組み合わせだと考えています。

ご紹介したページでは、
・従来型のERPとDynamicsの違いは何なのか？
・Finance、Suppy Chain、プロジェクト管理について、AIを活かした業務デモ
等をご紹介しています。

ご興味を持っていただいた方は是非お客様担当のマイクロソフト営業、
もしくは私のLinkedInまで直接ご連絡ください。

今後私の投稿では、DynamicsやPower Platform関連の記事を不定期にご紹介する予定です。
皆様、よろしくお願いいたします。
WordPressでコンタクトフォームを作る（ContactForm7編）

# はじめに
WordPressのコンタクトフォームは、今回紹介するContactForm7や、MW WP Formといったプラグインを使って導入することが多いです。
ContactForm7はシンプルな作りでカスタマイズ性もあるのでよく使われている印象があります。まずはこちらのプラグインを使ってコンタクトフォームを作ってみます。

# インストールはGUI操作
ContactForm7は、管理者ページのGUIを使ってインストールします。
`プラグイン`>`新規追加`>`使いたいプラグインを検索`で検索します。
インストールしたら、忘れずに有効化しましょう。

インストールすると、サイドバーにお問い合わせが追加されます。
これがContactForm7になります。

# コンタクトフォーム作成
作成はとてもシンプル。
1. 新規追加でコンタクトフォームを作成
2. タイトル、フォームタブ、メールタブ、メッセージタブを編集
3. 保存をクリックで保存
4. `このショートコードをコピーして、投稿、固定ページ、またはテキストウィジェットの内容にペーストしてください`と表示される。
```
[contact-form-7 id="7" title="お問い合わせ"]
```
記載のとおり、このショートコードを投稿ページや固定ページに貼り付ければ、コンタクトフォームが生成される仕組み。

# テーマファイルのPHPからショートコードを呼び出す
オリジナルのテーマファイル内で呼び出したいときは、このように書きます。
先ほどのショートコードの場合、こう書きます。
```php
<?php echo do_shortcode('[contact-form-7 id="7" title="お問い合わせ"]'); ?>
```

# フォームの編集
問い合わせフォームを新規作成すると、デフォルトで以下のフォームが作成されます。
```
<label> 氏名
    [text* your-name] </label>

<label> メールアドレス
    [email* your-email] </label>

<label> 題名
    [text* your-subject] </label>

<label> メッセージ本文 (任意)
    [textarea your-message] </label>

[submit "送信"]
```
上の氏名の部分でいうと、
`<label> 氏名`と`</label>`の間に大括弧で`[text* your-name]`が書かれています。
`[text* your-name]`はページ生成時に、氏名入力用のテキストフォーム用のコードに置換されて表示されます。
実際に生成すると、以下のように置換されます。(分かりやすいよう改行入れてます)
```
<label> 氏名
    <br />
    <span class="wpcf7-form-control-wrap" data-name="your-name">
        <input type="text" name="your-name" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" />
    </span>
</label>
```

## idやclassの付与
独自のCSSで見た目を変更させたい場合があると思います。
以下のように`html_id`や`html_class`を付与することで、idやclassを追加できます。
```
[text* your-name id:org-id-name class:org-class-name class:org-class-shimei]
```
こうなります。
```
<label> 氏名
    <br />
    <span class="wpcf7-form-control-wrap" data-name="your-name">
        <input type="text" name="your-name" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" />
    </span>
</label>
```

# その他便利そうな機能リンク
公式ページの内容が充実しており、プラグインの使い方が分かりやすく紹介されております。
これは使うだろう、と思ったものを紹介します。

## 承諾チェックボックス(acceptance)
https://contactform7.com/ja/acceptance-checkbox/
const, var, let の違いをざっくりメモ


## 発端
Vue ファイルのscript タグ内、created に記載した関数のなかで、定義したはずの変数がコンソールで「**定義されていません**」というエラーになったのが、ことのおこり。

最初はキーワードを何も付けていなかった。

```javascript
  created() {
    searchParams = new URLSearchParams(window.location.search);
    if( searchParams.has('pattern') ){
      pattern = searchParams.get('pattern');
      if ( pattern === 'A' ) {
        this.pattern = 'A';
      } else if ( pattern === 'B' ) {
        this.pattern = 'B';
      }
    }
  }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/dc3318f8-6a5e-44f9-ae4b-3567defb6d6a.png)

で、当然のようにコンソールエラー。
※Vue ファイルコンパイル時は、エラーになりません。

```
Error in created hook: "ReferenceError: searchParams is not defined"
```

先のコードをこうすると、エラーは解消できる。

```diff_javascript 
  created() {
-    searchParams = new URLSearchParams(window.location.search);
+    const searchParams = new URLSearchParams(window.location.search);
    if( searchParams.has('pattern') ){
-     pattern = searchParams.get('pattern');
+     const pattern = searchParams.get('pattern');
      if ( pattern === 'A' ) {
        this.testPattern[this.pattern] = 'A';
      } else if ( pattern === 'B' ) {
        this.testPattern[this.pattern] = 'B';
      }
    }
  }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/a4ed0dd0-0f92-3f1f-45a5-c26a9eba4aaf.png)

ところで、`const` と`var` と`let` の違いって何なんだ。


## 1. 再代入の違い

`const` は**定数** constant、一度定義すると値を変更できない。
`var` は**変数** variable、値の再代入が可能。

`let` が上2つと比べて異色だと感じたのだけど、そのまんま「**～しましょう** (let us)」のlet で**再代入**はできるけど、**再宣言**はできない。

**再代入** :o:
```javascript
    let pattern = 'A';
    pattern = 'B'; // エラーにならない
```

**再宣言** :x:
```javascript
    let pattern = 'A';
    let pattern = 'B'; // エラーになる
``` 

**一回「pattern はAとしましょう** Let pattern as A」**と言った後に、もっかい無かったことのように「pattern はBとしましょう」とは言わない**、といったイメージなんだろうか。

## 2. スコープの違い

但しこれらは**スコープ**（代入が適用される範囲）に違いがあり、`let` は**ブロックスコープ**なので、例えば以下のようにif 文の入れ子構造で`let` を二度使うことは可能。

```javascript
    if ( true ) {
        let pattern = 'A';
        console.log(pattern); // A

        if ( true ) {
            let pattern = 'B'; //   !!!!!! ブロックが異なるのでここでエラーにならない（再宣言の扱いでない） !!!!!!
            console.log(pattern); // B
        }

        // ブロックの外では最初のpattern が保たれている
        console.log(pattern); // A
    }
```

関数がスコープになる`var` では入れ子の中での代入が外側に影響する。

```javascript
    if( true ) {
        var pattern = 'A';
        console.log(pattern); // A
        
        if ( true ) {
            var pattern = 'B';
        }
    
        // 入れ子の内側での代入に影響される
        console.log(pattern); // B
    }
```

## まとめ

| Key | Assign | Scope |
|:-:|:-:|:-:|
|  const | :x: | ブロック  |
|  var | :o: | 関数  |
|  let | o再代入, x再宣言 | ブロック |


## 感想
今回は、再代入する用途のない値なので引き続き`const` を使おうと思いました。
初心者　MySQL8に挑戦する 17

# 後ろ髪を引かれて　

　旧機で無事、FlutterとMySQLの接続ができて、朝からもう少し複雑なことをやろうと模索する。例えば、複数のデータを取ったり、それをリストで表示したりしたい。　

　だけれど、隣で愛機が、こっちも使ってよお、という顔をしている。

　旧機でつなげたMySQL5.7は、長年使われてきて、利用者も情報も多いから、使いやすいのは確かだろう。私が選んだmysql1というパッケージも、結局、こちらをターゲットにしていたはずだ。でも5.7はあと一年でサポートが切れる。もちろん、あと一年の間に私の技術力が上がれば、きっとスムーズにMySQL8に移行できるだろう。その頃には、mysql1もアップデートして、MySQL8に適応しているだろう。　

　だから、旧機で着実に経験を積もう。と思ってはいるが、ほかにもできることはないんだろうか、と、ちょっと思うのだ。この停滞はどこから来たのか、といえば、結局、mysql1とMySQL8あるいはm1macの相性が悪かった、ということに尽きる。つまり、mysql1を使う、を固定して、MySQL8とm1macを断念した、ということだ。　

　じゃあ、mysql1は必須なのか？　なんでmysql1を選んだ？　

　それはとりもなおさず、少ないながらも記事やYouTubeに情報があったこと。あとは、php等の他言語を挟まず、dartだけでやってみたい、という、とくだんなんの根拠もない思い入れのせいだ。　
　じゃあ、ほかにも道はある。　

- 四の五の言わずにphpを挟む。
- mysql1以外のdartパッケージを探す。

　候補はないわけではない。mysql1に関するいくつかの「質問」記事に、「私はmysql_clientを使っていて、MySQL8でも問題ない」と回答している人が１人いたのだ。

　mysql_clientって何だ？

　mysql1と同じようなdartのパッケージだ。mysql1が0.20.0で333likesなのに対して、mysql_clientはまだ0.0.25で56likesしかない。でも、どっちみち同じようなものだ、まだバージョン１ですらないのだから。　

　何日か前にこれを見たときは、とても試してみる気が起こらなかった。これ以上問題を抱えてどうする、という気分だった。だけど、今はともかく mysql1は旧機に引っ越して、5.7とうまくつながっている。暇そうな愛機を見て、ちょっと気分転換に試してみたって、いいんじゃないかと思ったのだ。　

　そしたら　

## いきなり繋がった！　

　書き方がだいぶ違う。サンプルコードで繋がったからといって、ずっと問題なく動くという保証はどこにもない。
　それよりなにより、「使ってみた」系の記事が一本も見つからないのが、かなり不安。

　でも、m1mac上で、MySQL8に繋がって、読めて、書き込めた！　

 しばらく、二足のわらじかな。どっちが履き心地よいか、試してみよう〜。

https://pub.dev/packages/mysql_client/changelog

https://qiita.com/dongri727/items/1e624c3595f4a0dcc79b

https://qiita.com/dongri727/items/b7167b3a35883179c336
Turbolinks使用環境では$(document).on('turbolinks:load')にする

Railsで
```
$(windows).on('load', function(){...})
```
ではなく
```
$(document).on('turbolinks:load', function(){...})
```
とすることで期待通り発火してくれるようになることがありますが、その理由の備忘録です。

### 前提
Ruby: 2.7.2
Rails: 6.1.6
gem: turbolinks 5.2.1


### 理由
turbolinksではページ遷移を高速化してくれますが、仕組みとしてはブラウザでページ遷移が起きた時に
- head内で差異があればマージ
- bodyタグを差し替え

することで、同ページ内であたかも画面遷移が起きているように見せています。
実際にはページ遷移が起きていないため、ページ遷移が発火条件の`$(windows).on('load', function(){...})`は発火しません。

なので、turbolinksを使用する場合のページ遷移は、turbolinksで用意されたロードイベント`turbolinks:load`を使用する必要があります。

## 参考
- https://qiita.com/morrr/items/54f4be21032a45fd4fe9
【クエリビルダ：拡張表現】RowSkip文を使ってみる

この記事では、拡張表現のひとつ**RowSkip**文を使用してみます。
**Dynamic 365 Business Central**のデータモデルを利用して、**RowSkip**文の結果がどのようになるかを見ていきます。

[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから`クエリビルダ`を起動します。
フィルター領域に以下のような設定を行います。
`製品`には、**Dynamic 365 Business Central**、`Company`は**DEFAULT**、`テーブル`には**G/L Account**を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/021f8a56-b869-c38d-a1ad-5997a2974556.png)
出力領域には、以下のようなフィールドを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3b7e73c8-a638-fe1a-020e-bc5291ba7874.png)
設定が終わったら、プレビュー機能で早速クエリのチェック！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ae01751f-9863-e367-94a9-35e163dd3e33.png)
では、**RowSkip**文を追加します。
クエリに戻って、出力領域の右クリックから**拡張表現を追加**を選択します。出力オプションダイアログが開いたら、関数一覧より**RowSkip**文を探し、ダブルクリックで上部エディタ領域にテンプレートを転送します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b9b85f82-b54a-8119-e505-9be0c899140c.png)
テンプレートを下記のように編集します。`Account Type`が**Posting**の場合にその行をスキップするといった定義です。
```
RowSkip( {%AccTyp}="Posting")
```
`OK`を押すと、**データ型をBooleanにします**というメッセージが表示されるので、**Yes**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7a8419a7-2fb7-120d-ee79-0a5b0d473c18.png)
では、プレビュー！！
`Account Type`が**Posting**の行が全てスキップされていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a4d13839-e37b-2686-eee9-644ed464fc31.png)
これは、フィルターで`Account Type != "Posting"`とすれば済む話なんですが、**RowSkip**文を確認する意味でこのような使い方をしました。

尚、今回使用した**Dynamic 365 Business Central**のデータモデルは、現在のところ英語表記のみです。しかしながら、日本語辞書を設定すれば日本語表記になる機能は備えています。Sharperlightは多国言語対応です。

では、失礼します。
Stable DiffusionをGoogle Colaboratoryで表示する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png"> 流行っているのでいますぐ試したい

いま話題の画像生成AI Stable Diffusionを使ってみます。
Google Colaboratoryはコピペでしか使ったことがない、というレベルの方向けのStable Diffusion実行メモです。つまり自分向けメモです。

### 参考
https://qiita.com/masaka_programming/items/65e3e05e7d4ab38f8a64

（↑こちらの記事でわかる方は以下を読む必要はありません！）

# 手順１　 Stable Diffusionを導入する
[上記のすばらしい記事](https://qiita.com/masaka_programming/items/65e3e05e7d4ab38f8a64)にとてもわかりやすく導入手順が紹介されています。
指示に沿うだけで Stable Diffusionを導入が完了します。ありがとうございます。

以下、表示の部分だけ補足します。


# 手順２　 生成と表示

まず、画像表示用のライブラリをインポートしておきます。
```
from IPython.display import Image,display_png
```

次に、生成と表示を行います。

```
text = "super yummy japanese food new" #ここに生成ワードを入力します
image = pipe(text)["sample"][0]
image.save("{}.png".format(text))
display_png(Image(text+'.png'))
```

実行して30秒ぐらいで生成された絵が出ます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/05458462-254d-fa3f-eabe-f2498e5c2ac5.jpeg" width=300>
新作の創作日本料理が出ました。右下の©キャプションのあたりとか、いかにもネットの画像検索で学習しました感がありますが、そんなことよりさすがの精度です。

あとは**キーワードを変更して実行するだけで、１枚ずつですが生成ガチャが楽しめます。**

とりいそぎ。

# 留意点
話題としてよく取り上げられる話ですが、明らかに著作権を感じる類似画像を出力しがちなので取り扱い注意です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/5b1c6d58-1920-bd70-b65d-a9978fd9d580.jpeg" width=300>

試しに著名なアーティストの名前を１単語だけ入れてみました。
これはセーフな感じでしょうか。5人いますし...
 
もとになった単語あてるパーティーゲームなんかはすぐに作れそうですね。
【Rails】マイグレーションで文字列の外部キー定義をより簡単に書く方法

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況
```rails db:migrate```したとき、外部キーが文字列なのに```references```で外部キーを定義しようとするとエラー

```
PG::DatatypeMismatch: ERROR:  foreign key constraint "fk_rails_640ba59391" cannot be implemented
DETAIL:  Key columns "user_id" and "id" are of incompatible types: bigint and character varying
```

```db/migrate/2022090909090_create_posts.rb
def change
  create_table :posts do |t|
     t.references :user, null: false, foreign_key: true
     t.string :title, null: false
     t.text :content, null: false

     t.timestamps
  end
end
```

## 解決法：一般的な方法
```add_foreign_key```で外部キーを設定する。



```db/migrate/2022090909090_create_posts.rb
def change
  create_table :posts do |t|
     t.string :title, null: false
     t.text :content, null: false
     t.string :user_id, null: false

     t.timestamps
  end

  add_foreign_key :posts, :users
end
```

## 解決法：便利な方法

```references```に```type```を指定することで文字列の外部キーを定義できる。

```db/migrate/2022090909090_create_posts.rb
def change
  create_table :posts do |t|
     t.references :company, null: false, foreign_key: true, type: :string
     t.text :content, null: false
     t.string :user_id, null: false

     t.timestamps
  end
end
```
Could not find a declaration file for module の対処法が意外と簡単だった

管理画面で「vue-quill-editor」というWYSIWYGエディタを導入したのですが、

```
Could not find a declaration file for module 'vue-quill-editor'
```

というエラーが出てビルドできなかったので、対処しました。

## 1. 型定義ファイルを用意する

型定義ファイルを格納する場所は、デフォルトだと「src/@types」らしいので、そのディレクトリに **「vue-quill-editor.d.ts」**　というファイルを作成しました。

## 2. 「vue-quill-editor.d.ts」に型定義を書く


```ts
declare module 'vue-quill-editor'

```

・・・以上（笑

ライブラリの中を見て型定義を全部書かないといけないのかと思っていましたが、上記の一行だけ書けばとりあえずビルドエラーは回避できるみたいです。

何事もまずやってみることですね。
【スケジューラ】定期的にExcelワークブックを再計算し保存してみる

今回は、[Sharperlight](https://sharperlight.jp/)数式をもつExcelワークブックの指定したシートを再計算し、指定のフォルダにxlsx形式で保存する処理の自動化を設定します。それには[Sharperlight](https://sharperlight.jp/)スケジューラを利用します。
この記事で使用するExcelワークブックは、Dynamics 365 Business Central用に準備されたものを使用します。再計算の対象とするシートは、**Overdue Sales Invoices**とします。　英語版ですいません:bow_tone1:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cc4072f5-4077-0487-cb37-b8377159c1ae.png)

では、[Sharperlight](https://sharperlight.jp/)アプリケーションメニューからスケジューラを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1d63a80d-4f90-6ab9-1d86-74020f39fce0.png)
スケジューラダイアログが開いたら`新規`ボタンで新しいタスクの作成に入ります。
タスクダイアログが開いたら**コード**、**グループ**、**説明**を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/da739cc8-6e5e-b947-91be-2eccdd035b79.png)
`アクション`タブに移動して、`新規`アイコンで新しいタスクの作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a3b298ad-bd07-b4b1-b086-2e2b072b37d0.png)
アクション一覧が表示されるので、**Excelワークブック**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fb09b785-1dfa-d1cc-5867-1a319bcb134b.png)
オプション設定用パネルが表示されるので、**対象ファイル名**、**対象シートの指定**、再計算後の**保存先およびファイル名とその形式**を下記のように指定します。
この状態で一度`適用`あるいは`OK`ボタンでタスクを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0d125bbe-7f25-6f26-0c91-796abcad2ea7.png)
スケジューラダイアログの右クリックメニューから**実行**を選択して、一度手動で動作を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a92d3fc2-e0eb-0bad-7db8-580b67afef2d.png)
再計算が行われファイルが指定の場所に作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6a84a3c8-ebb3-b8c3-7b8f-3f920adb0ec2.png)
正常に動作したことが確認されれば、もう一度タスクの設定ダイアログを開き、トリガーの設定を行います。
`トリガー`タブに移動して、下記のように設定します。今回は、毎週月曜日の朝9時に実行されるように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/228103b8-0afe-b649-8e9c-1e1cde2fcd51.png)
以上で設定は完了。`OK`ボタンで保存します。
このように、スケジューラと組み合わせることで、様々な処理を自動化することが容易になります。
電子メールタスクを利用して、再計算されて作成されたファイルをあらかじめ指定した宛先に送信することも可能です。
多くの種類のタスクが準備されているので、かなりの応用が利くと思います。

では、失礼します。
【AWS】AWS認定試験「AWS Certified DevOps Engineer - Professional」に合格しました。（ピアソンOnVUEオンラインに超苦戦しました）

### 目次
1. [はじめに](#1はじめに)
2. [勉強方法について](#2勉強方法について)
3. [ピアソンOnVUEオンラインについて](#3ピアソンonvueオンラインについて)

### 1.はじめに
皆さんこんにちは、奥平です。
今回はAWS認定試験「AWS Certified DevOps Engineer - Professional」に合格した内容となります。

### 2.勉強方法について
私の勉強方法は問題集の熟読だけをやりました。
※業務にてAWS上の知識習得を行っている為
試験落ちる前提で一度試しに試験を受けて、どのような問題が出るかチェックしようと思いましたが、そのまま一発合格しました。
結果オーライです。

問題集は下記３件を熟読しました。

１．【Udemy】
・AWS認定 DevOpsエンジニア – プロフェッショナル (DOP-C01) 模擬試験
「模擬試験 - 1 ～4」を熟読していました。

２．【BenchPrep】
考え方が共通する問題が出ました、無料サンプル問題把握していた方が良いですね。
https://dev.classmethod.jp/articles/new-aws-official-practice-questions/

３．【サンプル問題】
考え方が共通する問題が出ました。
https://d1.awsstatic.com/ja_JP/training-and-certification/docs-devops-pro/AWS-Certified-DevOps-Engineer-Professional_Sample-Questions.pdf

４択問題のうち、答えだけじゃなく間違いの理由も把握するのは当然ですね、消去法は大事です。
あと、同僚のNさんから色々とアドバイスも頂き助かりました、ありがとうございます！

### 3.ピアソンOnVUEオンラインについて
本題です。

試験自体は一発合格だったのですが、ピアソンOnVUEオンライン試験時に、自PCのカメラで映している私の映像が、試験監督者側に表示されていないとの事で、やり直し・試験日再調整を繰り返し、5回目でやっと試験を受けられました。。。
※ピアソンOnVUEオンラインの「システムテストの実施」は常に合格していた。。。

どうしても自宅で試験を受けたかったので、手段のために目的を選ばない気持ちで色々試しました。
対応したことを共有しておきます、皆様の参考になれたら幸いです。

主にクラスメソッドさんの下記記事を参考にしました。
https://dev.classmethod.jp/articles/aws-exam-at-home/


【使用PC】
ネットで買った中古PCです。
NEC VersaPro VX-F　64ビット
メモリ16GB
Core(TM) i5
windows10pro
※マイクとカメラは無し、スピーカーしか付いていません。


内蔵カメラは付いていないので下記カメラを使用、ゲオで2000円ぐらい。
https://www.logicool.co.jp/ja-jp/products/webcams/hd-webcam-c270n.960-001265.html


【ルーター】
ガンダムみたいなルーターです。
Wi-Fi 6(11ax)対応Wi-Fiルーター 4803+1147Mbps AirStation
https://www.buffalo.jp/product/detail/wxr-6000ax12s.html


【自宅PC・ネットワーク環境設定内容】
5回目で試した事は下記2件です、多分②が原因だったかなと思っています。
※ルータ設定は最弱ガバガバセキュリティなのであまりやりたくないですね、次の機会にルータ設定そのままで試そうと思います。


▼5回目で試したこと
①ルータ設定：ネット脅威ブロッカー解除

②サウンド設定で下記を設定
・スピーカー　→　パソコンから音が出るようにした
・マイク　→　イヤホンから音が出るようにした
・WEBカメラ　→　外付カメラから出力
※多分、マイクにてWEBカメラのマイクを使用していた事が原因だった可能性があります。
※4回目までは、WEBカメラで映像とマイクを設定していた。


▼4回目まで試していたこと（※5回目でもやった）
カメラの位置情報をオンにした
・バックグラウンド全てオフ
・ウイルス対策ソフト停止
・OnVUEのカメラ許可
・Windows10の「Windows Defender ファイアウォールの有効化または無効化」で、プライベート、パブリックのネットワーク設定を、全て無効にする
・下記ルータ設定をチェック外す

IPv4
①IDENTの要求を拒否する　オフにする
②Internet側からのPINGに応答しない　オフにする
③PPPoE1:Internet@Startで応答しない　オフにする

IPv6
④Microsoft-DS/SMB2.0のルーティングを禁止する　オフにする
⑤IDENTの要求を拒否する　オフにする
⑥Internet側からの要求を転送しない　オフにする

・PCのvpn設定
従量制課金接続経由でのVPNを許可　オフ
ローミング中のVPNを許可　オフ

・VUEダウンロードしたあとにやる事
PC設定設定のファイアウォール無効
→ドメイン　オフ
→プライベート　オフ
→パブリック　オフ
ウイルス対策ソフト無効
VUE管理者実行


【その他】
カメラが映らない際のエラーログ等が欲しくてピアソンOnVUEオンラインにお問い合わせしても、「ネットワーク環境を見直してください」の一点張りで、まともな回答は得られません、、、自分で色々試さないといけないと思います。
皆様も自宅で試験を受けれたら快適だと思いますので、頑張る価値はあると思います、頑張ってくださいー！
Linux function,trapコマンドについて（自分用メモ

●bashの組み込みコマンド「function」を使用することで、bash上で独自のシェル関数を作成できる。


function 関数名() { コマンド; }

※「{」の後ろと、「}」の前にはスペースが必要。コマンド中には、関数の実行時に指定した引数を設定することもできる。実行時に指定した順に$1、$2 ... とすることで、引数の値を参照。

●定義済みの関数は「declare -f」コマンドで確認できる。


※bashはシェル変数とシェル関数を区別しないため、シェル関数はsetコマンドでも確認できる。

※シェル関数の削除はunsetコマンドで行うことができる。


●trapコマンド
シェルに割り込みなどのシグナルが送られた時の処理を設定・実行。

　trap [コマンド] シグナル

シェルスクリプトの実行中にCtrl+C（SIGINT：割り込みによる終了）やCtrl+Z（SIGTSTP：一時停止）などのキーを押下すると、シグナルのデフォルトの動作通りにシェルスクリプトの処理が中断される。
trapコマンドでは指定したシグナルを捕らえて、シェルスクリプトを中断させずに設定したコマンドを実行することができる。

ただし、killによる強制終了（SIGKILL）はtrapコマンドで捕捉できない。


bashコマンドはシェルを起動してシェルスクリプトを実行するコマンド。

●シェルスクリプトをデバッグするオプション

・-v シェルが読みこんだ、これから実行する行を標準エラー出力に出力する（変数があれば変数名を表示）
・-x シェルが実行した行を、単純なコマンドや変数を展開して標準エラー出力に出力する


※bashコマンド実行時にオプションを指定する他にも、シェルスクリプトの1行目の「シバン（シェバング）行」にオプションを指定しておき、シェルスクリプトをコマンドとして実行しても同じ結果が得られる。

例）#!/bin/bash -x
【Swift】キーボードの開閉を監視する方法

# はじめに
https://qiita.com/SNQ-2001/items/bdcda49db3906ab2422b

こちらの記事を書いている際にキーボードを開閉を検知する方法を知ったので記事にしておきます。

# 方法
**キーボードを開いたことを検知**
```swift
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: nil) { _ in
    print("キーボードを開きました。")
}
```

**キーボードを閉じたことを検知**
```swift
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: nil) { _ in
    print("キーボードを閉じました。")
}
```

# おわり
使うことはあんまりなさそうです笑
Biopythonでgenbankファイルにfeatureを追加する、削除する

genbankは比較的汎用性の高いDNA情報の保存形式である。
genbankは必要に応じて編集加工する必要がある場合、biopythonを用いて一括して行うことができる。
複数のgenbankファイルをまとめて加工したい場合、pythonのBiopythonを利用すると便利である。

https://biopython.org

biopythonのSeqFeature moduleを利用する。
https://biopython.org/docs/1.76/api/Bio.SeqFeature.html

まず、biopythonのインストールを行う。
```
pip install biopython
```

<h2>featureの追加</h2>
まず必要なmoduleをインポートする

```
#moduleのインポート
from Bio import SeqIO
from Bio.SeqFeature import SeqFeature
from Bio.SeqFeature import FeatureLocation
```

次にファイルを開封します。

```
#genbankファイルの開封
record = SeqIO.read("file_name.gb", "genbank")
```

次に追加したいfeatureを作成する。
```
#featureの開始位置
start_bp = 100

#featureの終了位置
end_bp = 200 

#featureの向きを指定する。
#1, 0, -1のいずれかを記入する。
st_no = -1 

#featureの作成
my_feature = SeqFeature(FeatureLocation(start_bp,end_bp, strand = st_no), type="music_feature")
#nameという情報をfeatureに追加する。他の情報も同様に追加することができる。
my_feature.qualifiers["Name"] = "BLAST hit"
````

次にfeatureを開いたgenbankファイルに追加する。
````
record.features.append(my_feature)
````

以下の方法でfeatureが追加されているか確認することができる。
````
for i in record.features:
  print(i)
````

確認できたらファイルを保存する。今回は同じファイル名にした。この場合、上書きされます。
別のファイル名にすることで別のファイル名として保存することができます。
````
SeqIO.write(record, "file_name.gb", "genbank")
````

<h2>featureの削除</h2>
次に、featureを削除する方法を説明します。
仮にtype = "CDS"のfeatureを全て削除することを考えます。
まず、先ほどと同様にmoduleをインポートします。
次に同様にgenbankファイルを開きます。

```
#genbankファイルの開封
record = SeqIO.read("file_name.gb", "genbank")
```


以下の操作で開いたgenbankファイルのもつfeatureのtypeを出力することができます。
```
for i in record.features:
  print(i.type)
```


さらに以下の方法でfeatureのtypeがCDSのfeatureの情報だけを出力できます。
```
for i in record.features:
  if i.type == "CDS":
    print(i)
```


これを書き換え、まず削除したいfeatureのリストを作成します。
```
#del_listに削除したいfeatureのlistを格納する。
del_list = []
for i in record.features:
  if i.type == "CDS":
    del_list.append(i)
```

次に以下の操作でdel_listにあるfeatureを全て削除します。
```
#del_listにあるfeatureの削除の実行
for i in del_list:
  record.features.remove(i)
```

先ほどと同様にfeatureが削除されているか確認します。
````
for i in record.features:
  print(i)
````

最後にファイルを保存します。
````
SeqIO.write(record, "file_name.gb", "genbank")
````
誰にも見つからない暗号通貨の秘密鍵の隠し方

暗号通貨の秘密鍵を管理するときに、どこに保管するかは迷うところ。紙に書く人もいれば、iPhoneのメモ帳に保存しておいたり、どこに保存していても盗まれてしまう可能性があります。

どこに保管していたら、見つかりにくいだろうと考え、その一つの選択肢として、コマンドラインツール「dirsha」を開発しました。

![スクリーンショット 2022-08-26 0.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149717/5761e0c2-1e99-e8ce-b011-96c0bd63b849.png)

これはただのnpmパッケージがインストールされたnode_modulesディレクトリですが、ここにEthereumの秘密鍵が隠されています。この中のどれかのディレクトリに記録されてる訳ではありません。

### インストール
```bash
npm install -g TakutoYoshikai/dirsha
```

先ほどのnode_modulesの中で以下のコマンドを実行する
```bash
dirsha
```

すると以下のような秘密鍵が出力される
```
7cd629f43b2c75f204cba8ef4a8ee1ec18ef173279b7feaf7382f1dc9c580be6
```

このdirshaは、カレントディレクトリにあるファイル名とディレクトリ名を全て繋げて、ハッシュ値を取ったものを出力します。暗号化されたデータもなく、生の秘密鍵データも保存せず、誰にも秘密鍵の存在を悟られることのない管理方法として使えます。

https://github.com/TakutoYoshikai/dirsha