OmniAICreator/Qiita-1.07M huggingface dataset:
Install Windows SDK 7.1 (Visual C++ 2010) on GitHub Windows runner


Previously, you could simply run this:

```yaml
    - name: "Install Visual C++ 2010"
      run: |
        choco install windows-sdk-7.1 -f -y
        choco install KB2519277 -f -y 
```

However the situation was changed by two parts:

1. After https://github.com/actions/runner-images/pull/6247 , GitHub windows-2022 runners now have Visual C++ 2010 redistributable due to https://community.chocolatey.org/packages/imagemagick.app#dependencies .
    - It needs to be uninstalled first.
1. After https://community.chocolatey.org/packages/windows-sdk-7.1/7.1.7600.202200915 , windows-sdk-7.1 has been migrated to web installer.
    - Downloading ISO is faster, so previous version is recommended.

These changes can be solved by this

```yaml
    - name: "Install Visual C++ 2010"
      run: |
        MsiExec.exe /passive '/X{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}'
        MsiExec.exe /passive '/X{1D8E6291-B0D5-35EC-8441-6616F567A0F7}'
        choco install windows-sdk-7.1 -f -y --version 7.1.7600.20220204
        choco install KB2519277 -f -y
```

`msiexec /x` has to be quoted on powershell, otherwise need to run on cmd.

## note

Who wants to install Visual C++ 2010? I don't come up with other use cases than testing Python 3.4...
GitHubActionsSSH【GHActionsSH】

`- uses: mxschmitt/action-tmate@v3`を追加するだけでSSHできます

```yaml:workflow.yml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: mxschmitt/action-tmate@v3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/88a1c829-c295-7fe8-b8c5-9d0c388bd8f6.png)

# 教えてSenpai
SSHに接続して`Ctrl + c`するとうまくいくかもしれません

https://github.com/mxschmitt/action-tmate
今自分が見えている画像生成AIの加速の歴史と現状の景色

所謂AIでできることが増え、加速的に景色が変わってきているので、自分の備忘録として自分の周りの状況と主観を混じえた画像生成の歴史記事を残す。勢いで書くので誤字や間違った部分が見つかったら修正リクエストを頂けると嬉しいです。

## 7,8月 画像生成サービスの増加、ローカルでの画像生成が可能になる
DALL-Eが登場し暫くした後にMidjourneyが登場、社内でレモンでできたウサギの絵を生成する流行が発生。大体2022年の7-8月あたり。
8月下旬にStable diffusion(以降SD)が登場。この記事がバズって知った記憶がある。
https://note.com/fladdict/n/n13c1413c40de

速攻でローカルで落とし実践。ゲーム用に買っていた3060でVRAMがぎりぎり足りる。確かVRAMが足りずここで撃沈する人が一定数いたり、CLIないからColabが流行ったりしていた。venvの知識がなかったので無理やりanacondaで環境作っていた。

SDの強みはサイトにアクセスして〜とかではなくローカルで完結できたところにあると思う。MidjourneyはこのときAPIは公開されておらず、discordでやる必要があった(楽ではあるけど大量生成には向いてない)。だからSDが出てから派生アプリが掃いて捨てるほど出てきたし、LINEアプリにもなってバズったりしてた。当初SDは批判も受けていたけど、あれが民間に降りてきたこと自体は自分は肯定的に考えている。あとMidjourneyで日本的kawaiiが生成できたのもこの辺りだったから、SDのモデル取り込んだのでは？って噂になっていた。

8月末にmimicという画像生成サービスが炎上したことも日本の画像生成を語る上では欠かせないが省略。

## 9-10月 新モデルの登場とプロンプトの変化
10月にnovelAIという別の画像生成サービスのモデルデータが流出、一気に二次元絵のクオリティが上がる。このあたりの周辺の話として、自分のイラストを学習されると困るというコメントが凄い見えるようになった。これは提供したいかの意志にかかわらずdanbooruなどの転載サイトに無断で転載され、それを学習元として使っていたケースが相当多かったため。

もう一つの着眼点として話題になっていたのはpromptの問題。入力するテキスト内容によって一気に生成される画像のクオリティが左右されること、テキストが同一でもシード値が違えば結果が全く違ったため、どのようにすれば安定して高クオリティの画像を生成できるかの試行錯誤がされていた。今でこそプロンプト内容は晒してる人も多いが、「秘術」として隠していた人も多かったし、プロンプト内容を売る人も出てきていた。そんな状態だった10月に「元素法典」という文章が流通した。これはどのようにプロンプトを追記すれば安定して高クオリティの画像が生成できるかを検証した成果物PDFで、プロンプトだけでなくネガティブプロンプトという「AIに出力して欲しくない単語」が書いてあった。これによって一気にクオリティが上がり、AIを簡単に見抜く方法として知られていた「指が5本になっているか」というハードルも越えるようになる。今ではもうAI絵かの判断は困難になっている。

## 11月- さらなる新モデルの台頭、「マージ系」の進出
さらにクオリティの高い「anything v3」や「Openjourney」、モデルに自分の絵を更に学習させたモデルや、複数モデルを組み合わせた「マージ系」と呼ばれる物も増加。3D系は特にマージ系を使っていることが多く、今最新のモデルを使いたい場合はdiscordサーバーに入って聞くのが良いと思う。

ここまでが画像生成で自分が見えている範囲の歴史と現状。
正規表現のキャプチャでグループ化した同じ文字の繰り返しにマッチさせる (Ruby)

今日の今日まで知らなかった正規表現
キャプチャした文字は置換だけではなく、同じマッチの中でも利用できる

# ポイント

- カッコ `()` で文字をキャプチャする
- バックスラッシュと数字 ( `\1` とか `\2` とか ) でマッチした文字を再利用できる

# 例

たとえば次の例では abc いずれか2文字の繰り返しにマッチする

aa はマッチする

```rb
"aa".match(/([abc])\1/)
# #<MatchData "aa" 1:"a">
```

ab は同じ文字の繰り返しではないのでマッチしない

```rb
"ab".match(/([abc])\1/)
# nil
```

文字種を問わずマッチさせるならキャプチャを使わずにこうだ
これは ab にもマッチする

```rb
"ab".match(/([abc]{2})/)
# #<MatchData "ab" 1:"ab">
```

# 応用例 - キャプチャ文字を離れた位置で利用する

キャプチャは直前文字に対してだけ使えるわけではない
いちどキャプチャしたら後は自由な位置で使える

```rb
"a-a".match(/([abc])-\1/)
# #<MatchData "a-a" 1:"a">
```

# 応用例 - 複数のキャプチャ

1番目のキャプチャは `\1`
2番目は `\2` というように連番で利用できる

```rb
"ab ab".match(/([abc])([abc]) \1\2/)
# #<MatchData "ab ab" 1:"a" 2:"b">
```

# 応用例 - 複数のキャプチャ

直前の同じ文字の繰り返し

次の例は最初にキャプチャしたaの連続部分にだけマッチする

```rb
"aaaaaaaaaaaaabbbbbb".match(/([abc])\1*/)
# #<MatchData "aaaaaaaaaaaaa" 1:"a">
```

# 参考

https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
M1 MacでフォーカスがあたっていないIntteliJの画面がチカチカする問題の対応法

### 事象

Intel Mac から M1 Mac に変えたところ、IntteliJの画面がチカチカする問題が発生するようになりました。OS起動直後は問題ないのですが、数時間すると画面がチカチカするようになりました。IntteliJのウインドウにフォーカスを当てて作業している時はチカチカしないのすが、ウインドウにフォーカスがあたっていないときにチカチカするという事象です。

この事象は [IntteliJのサポートサイト](https://intellij-support.jetbrains.com/hc/en-us/community/posts/8274934050706-Flashing-screen) にも同様の質問が投稿されていました。

### 環境
* OS: Mac OS Monterey (version 12.6)
* Chip: Apple M1 Pro
* IntelliJ IDEA 2022.2


### 解決法

[IntteliJのサポートサイト](https://intellij-support.jetbrains.com/hc/en-us/community/posts/8274934050706-Flashing-screen) にてElena Pogorelovaさんが提案している、JDKのオプションを変更する方法で解決できます。

具体的には、`/Applications/IntelliJ IDEA.app/Contents/bin/idea.vmoptions` のファイルを編集し、以下の行を追加します。

```
-Djdk.module.illegalAccess.silent=true
-Dsun.java2d.metal=false   ←追記
-Dkotlinx.coroutines.debug=off
```
Blenderで重複マテリアルの削除

## 1オブジェクトで重複マテリアルを削除する方法

1つのオブジェクトに複数のマテリアルスロットがあるときに、同一のマテリアルを1つにまとめる方法です。

- 編集モードで、`P`（分離）の「マテリアルで」を選ぶ。
- オブジェクトモードで、`Ctrl + J`（統合）

※ 使ってないマテリアルや、空きスロットも削除されます。

## 複数オブジェクトで重複マテリアルがあるときに、1マテリアルに1オブジェクトにする方法

1オブジェクトは1マテリアルまでとし、同じマテリアルの複数オブジェクトを統合する方法です。
分離と統合を繰り返せばできますが、オブジェクトがたくさんあると手間です。
以下のPythonを実行すると、まとめてできます。

```py
from collections import defaultdict
import bpy

objs = [obj for obj in bpy.data.objects if obj.type == "MESH"]
bpy.ops.object.select_all(action="DESELECT")
for obj in objs:
    if len(obj.data.materials) >= 2:
        bpy.context.view_layer.objects.active = obj
        bpy.ops.object.mode_set(mode="EDIT")
        bpy.ops.mesh.separate(type="MATERIAL")
        bpy.ops.object.mode_set(mode="OBJECT")
objs = [obj for obj in bpy.data.objects if obj.type == "MESH"]
dc = defaultdict(list)
for obj in objs:
    if len(obj.data.materials) == 1:
        dc[obj.data.materials[0]].append(obj)
for lst in dc.values():
    if len(lst) >= 2:
        bpy.ops.object.select_all(action="DESELECT")
        bpy.context.view_layer.objects.active = lst[0]
        for obj in lst:
            obj.select_set(True)
        bpy.ops.object.join()
```

以上
【AWS】Route 53で新しいドメイン・サブドメインを取得する

## Route 53とは
Route53とは、公式サイト([LINK](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/welcome-dns-service.html))を参照すると、以下のようなサービスである。

>Amazon Route 53 は、可用性と拡張性に優れたドメインネームシステム (DNS) ウェブサービスです。Route 53 を使用すると、ドメイン登録、DNS ルーティング、ヘルスチェックの 3 つの主要な機能を任意の組み合わせで実行できます。

Route53を用いた名前解決の流れは、以下のようになっている。

>![how-route-53-routes-traffic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/d2419b6d-f2d5-a6d6-7172-8446e589d643.png)

名前解決の流れ
1. ユーザーがウェブブラウザを開き、アドレスバーに www.example.com を打ち込む
1. リクエストはまずケーブルインターネットプロバイダー(ISP) が提供する DNS リゾルバーにルーティングされる
1. DNS リゾルバーは、リクエストを DNS ルートネームサーバーに転送し、.com TLDネームサーバーを返す
1. DNS リゾルバーは、リクエストを .com TLDネームサーバーに転送し、Route 53 ネームサーバーを返す
1. DNS リゾルバーは、Route 53 ネームサーバーに転送する
1. Route 53 ネームサーバーは、example.com ホストゾーンで www.example.com レコードを検索し、関連付けられた値 (ウェブサーバーの IP アドレス 192.0.2.44 など) を取得して、IP アドレスを DNS リゾルバーに返す
1. DNS リゾルバーは最終的に、ユーザーが必要とする IP アドレスをブラウザに返す


## ドメイン取得方法
詳細は公式サイトを参照ください

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/registrar.html

1. Route53->ダッシュボードを開く
    https://us-east-1.console.aws.amazon.com/route53/v2/home#Dashboard
1. ドメインの登録の欄で作成したいドメイン名を入れて、チェックをクリックする
    ![Route533.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/ebaaa39f-4d58-5fcc-025b-6edf36d9dbe1.png)
1. 使用可能かどうか確認し、可能であれば対象のドメイン名をカートに入れる
    ![Route534.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/3dc0994a-55ee-c382-65d3-b071d03a94e8.png)
1. ドメインのお問い合わせ詳細に氏名、住所などを記入する
    ![Route535.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/c8cefa38-c01e-68a3-dbcf-bea97a09d59c.png)
1. 最終確認画面にて、下部の規約に同意しますにチェックを入れて、注文を完了をクリックする
![Route536.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/4c098f66-690d-e32b-fe4f-c3a337034249.png)
1. メールアドレスの確認を求めるメールが届くため、開いて確認する

料金としては、ドメインにより異なり、年間$\{$}9$~$\{$}90$と幅がある。.comは$\{$}13$で、.JPは$\{$}90$と髙い。

## サブドメインの作成

1. Route 53 コンソールを開く
1. ナビゲーションペインで [ホストゾーン] をクリックする
1. [Create hosted zone] (ホストゾーンの作成) を選択する
1. ナビゲーションウィンドウで、サブドメインの名前 (acme.example.com など) を入力する
1. [タイプ] で、[パブリックホストゾーン] のデフォルト値にする
1. [Create hosted zone] (ホストゾーンの作成) を押す
1. ドメイン (example.com) のホストゾーンを選択する
1. [レコードの作成] を押す
1. [名前] に、サブドメインの名前、[値] に、ネームサーバーの名前を入れる
   ```
    名前
    subdomain.example.com
    
    NS(ネームサーバー)
    ns-1064.awsdns-05.org.
    ns-1702.awsdns-20.co.uk.
    ns-934.awsdns-52.net.
    ns-259.awsdns-32.com.
    ```
1. [レコードの種類] で、[NS - ホストゾーンのネームサーバー] を選択する
1. [TTL (秒)] では、NS レコードに対してより一般的な値 (172,800 秒など) を選択する
1. [ルーティングポリシー] で、[シンプルルーティング] を選択する
1. [Create Records] (レコードを作成) を押す
1. dig or nslookupコマンドで名前解決可能か確認する
    ```
        nslookup subdomain.example.com
    ```

## サブドメインをルーティング
www.example.comをexample.comへルーティングしたい場合などに設定する。

1. Route 53 コンソールを開く
1. ナビゲーションペインで [ホストゾーン] をクリックする
1. タイプAのレコードがあるホストゾーンをクリックする
1. レコードを作成を押す
1. ルーティングしたいドメインを入力し、エイリアスをオンにする
1. トラフィックのルーティング先として、ルーティング先に設定したいドメインを選択する
1. レコードを作成を押す

## まとめ
今回はAWS Route53でドメインを取得(登録)する方法を紹介した

https://repost.aws/ja/knowledge-center/create-subdomain-route-53
create-liff-appでliff.i18n.setLang()が使えない場合の対処法

# はじめに

ちょっと古いですが[LIFF v2.21.0をリリースしました](https://developers.line.biz/ja/news/2022/?month=08&day=04&article=release-liff-2-21-0)の記事をみてちょっと検証してみようと思いました。[liff.i18n.setLang()](https://developers.line.biz/ja/reference/liff/#i18n-set-lang)とか気になって。合わせて[liff-mock](https://github.com/line/liff-mock)も更新しているのかなと思って覗いてみたら案の定[こんなのがマージされてた](https://github.com/line/liff-mock/commit/0e1c65faeb4f617e0732823fdcd0853e2332b30a)のでこちらも試してみようと思いました。

liff-mockでの検証用に[この記事](https://qiita.com/bathtimefish/items/32d551d0c4c0a83b8536)でやったのと同じ[create-liff-app](https://github.com/line/create-liff-app)をベースにliff-mockを試してみようと思ったところ、`liff.i18n.setLang()`が使えなかったのでその対処方法を記載しておきます。

# 使ってる @line/liff が古い
結論から言うとcreate-liff-appで生成されるプロジェクトの`package.json`に定義されている`@line/liff`のバージョンが古いです。現状`2.19.1`が定義されていますが、[liff-mockのパッチ](https://github.com/line/liff-mock/commit/0e1c65faeb4f617e0732823fdcd0853e2332b30a#diff-7ae45ad102eab3b6d7e7896acd08c427a9b25b346470d7bc6507b6481575d519)を見ると`2.21.3`ですね。なので以下のようにプロジェクトを作成したあと、`package.json`を更新します

```shell
npx @line/create-liff-app
Need to install the following packages:
  @line/create-liff-app
Ok to proceed? (y) y
Welcome to the Create LIFF App
? Enter your project name:  (my-app) my-app
? Which template do you want to use? react
? JavaScript or TypeScript? TypeScript
? Please enter your LIFF ID: xxxxxx
? Do you want to install it now with package manager? (Y/n) Yes
? Which package manager do you want to use? yarn
```

```shell
cd my-app
yarn add @line/liff-mock
```

```package.json
"@line/liff": "2.21.3",
```

```shell
yarn
```

これで`liff.i18n.setLang()`とそのモックも使えるようになりました。
![スクリーンショット 2023-01-08 12.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/66092963-23c6-ac44-16a2-9aeee49be6ec.png)

# おわりに

とりあえずcreate-liff-appに[Issue](https://github.com/line/create-liff-app/issues/24)を上げておきました。ちょっとしたことですが改善されるといいですね。
日本語 Asciidoc 冒頭部の書き方（サンプル）

本文書では、Asciidoc 冒頭部の設定例を示し、それぞれの設定（document attribute）について解説する。

## 更新履歴

| Date    | Version | Comment                                          |
|:-------:|:------:|:--------------------------------------------------|
| 2021-05-02| 1.0     | 初版作成                                          |
| 2021-01-08| 1.1     | メールアドレス修正。:doctype: article　追加。概要を \[Abstract\] 形式に。更新履歴に番号なしのセクションタイトルを付加 |

## Asciidoc 冒頭部の書き方

Asciidoc 冒頭部には、文書のレンダリング（整形）の仕方を設定する document
attribute を記述する。Asciidoc 冒頭部の書き方の例を以下に示す。詳細は、参考文献を参照。

```asciidoc:Asciidoc 冒頭部の設定例
= Asciidoc 冒頭部の設定例
三浦克介 <miura.katsuyoshi+github@gmail.com>
v1.1, 2023-01-08
:doctype: article
:lang: ja
:toc: left
:toc-levels: 3
:toc-title: 目次
:sectnums:
:sectnum-levels: 3
:icons: font
:imagesdir: Images
:xrefstyle: short
:abstract-caption: 概要
:figure-caption: 図
:table-caption: 表
:listing-caption: リスト
:appendix-caption: 付録
:example-caption: 例
:source-highlighter: highlightjs
:stem: latexmath
```

## Asciidoc 文書設定の説明

前節で示した Asciidoc 文書設定の各項目について、設定内容を以下に示す。

|項目名 |値 |説明 |
|:-----|:--|:---|
|doctype |article |文書タイプ：article, book, manpage, inline |
|lang| ja |言語設定 |
|toc| left | 目次の配置位置：left はページ左側に目次を配置する。但し、ページ幅が狭い場合は、自動的に文書冒頭部に配置される |
|toc-levels| 3 |目次に表示されるセクションレベルの最大値。toc-levels=3 は、`===` で記述されるセクションまでが目次に表示される。但し、`=` は文書タイトルであり、これは目次には表示されない。 |
|toc-title| 目次 |目次のタイトル部に表示される文字列。 |
|sectnums| |章に番号を付ける。 |
|sectnum-levels| 3 |番号を付ける章の最大レベル。`=` は文書タイトルなので、`==` が第1レベルの章を示す。 |
|icons| font |CAUTION:, WARNING:, NOTE:, TIPS: の欄に、アイコンを表示する。 |
|imagesdir| Images |画像を格納するディレクトリ。 |
|xrefstyle| short |図や表などを参照する際、「図1」の様に表示する。 |
|figure-caption| 図 |図番号に付ける文字列。 |
|table-caption| 表 |表番号に付ける文字列。 |
|listing-caption| リスト |リスト番号に付ける文字列。 |
|appendix-caption| 付録 |付録を示す文字列。 |
|example-caption| 例 |例を示す文字列。 |
|source-highlighter| highlightjs |ソースコードを表示する際、シンタックスハイライトを行う。この作業を行う外部ツールとして、highlight.js を用いる [^1] 。 |
|stem | latexmath |STEM (Science, Technology, Engineering and Math) による数式表示を有効にし、LaTeX 形式を選択。latexmath を指定しない場合は、AsciiMath 形式。なお、数式は、HTML 形式に変換した場合のみ正しく表示される。 |

[^1]: ソースコードのシンタックスハイライトを行うツールとして、highlight.js の他に、coderay, prettify, pygments, rouge がある。いずれも、外部ツールのインストールが必要。VsCode に Asciidoc 拡張をインストールしていれば、highlight.js は外部ツール無しでシンタックスハイライトが可能。

## 参考文献

1. Asciidoctor User Manual, Appendix A: Catalog of Document Attributes,
<http://www.seinan-gu.ac.jp/~shito/asciidoctor/html_chunk/chap99.html>
2. Asciidoctor 文法クイックリファレンス(日本語訳),
<https://takumon.github.io/asciidoc-syntax-quick-reference-japanese-translation/>
3. Katsuyoshi Miura, *asciidoc_settings*, GitHub, <https://github.com/miura-katsuyoshi/asciidoc_settings>
Node.js 12 actions are deprecated. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/. Please update the following actions to use Node.js 16: shivammathur/setup-php

警告がでるためメモ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/cfbaab0d-ca23-d2bb-85eb-0cbb3b851cd3.png)
Node.js 12 actions are deprecated. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/. Please update the following actions to use Node.js 16: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e

# 教えてSenpai
`shivammathur/setup-php@v2`を使うとよいです
```yaml:laravel.yml
jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    steps:
    - uses: shivammathur/setup-php@v2
      with:
        php-version: '8.2'
```
ESP32のWifiアカウントを含んだコードを管理する

# ESP32の設定情報の管理

組み込みのプログラミングを行っていて悩むことの一つがアカウント情報の管理。gitでコードを管理したいけどアカウント情報は含めたくない。悩んだ結果、プリプロセッサを利用することにしました。

## 環境
* Ubuntu 22.04
* vs code 1.74.2
* platformio 6.1.5

## ポイント
* アカウント情報を含むヘッダーファイルを作る(Config.h)
* .gitignoreに Config.h を追加する
* プリプロセッサを利用する (__has_include)

## 例 (main.cpp)

```
#if __has_include(<Config.h>)
#include <Config.h>
#else
#define TEMP_PIN 4
#define SSID "ssid"
#define PASSWORD "password"
#endif
```

## 説明
Config.hファイルを別途用意し、例のように`__has_include`を利用することでヘッダーファイルが存在した場合にのみ`include`するようにします。
.gitignoreファイルにConfig.hファイルを追跡から除外するように設定します。
`else`文で設定ファイルと同じ内容を定義することでConfig.hファイルを紛失しても設定ファイルの復旧が可能です。

## 備考
platformioの環境で開発しており、Config.hファイルが存在しないと警告がでますがコンパイル可能です。
設定ファイルを頻繁に変更する場合は差分が発生する可能性があるので注意が必要です。
【Laravel】URL情報から値を取得する方法(クエリ文字列)

## はじめに
URL情報を使ってコントローラ側に値を渡す方法について説明します。
今回は、クエリ文字列を使用して実現していきます。
使用するLaravelのバージョンは、`9.43.0`です。

## クエリ文字列とは
クエリ文字列とは、URLの後ろに「?◯◯=✕✕」といった形式で書かれた文字列のことです。
これを使ってコントローラに値を渡すことができます。(GET送信)

## コードを書いてみる
クエリ文字列を使って、URL情報から値を取り出して画面表示させるコードを書いてみます。

下記URLを使って名前と年齢が表示されることを確認してみます。
期待する表示は、名前が「テスト太郎」、年齢が「24」と表示されることです。
クエリ文字列をURLに設定する方法は、URL末尾に`?`をつけて`項目名=値`です。
複数の値を設定する場合は、`&`を使ってつなげていきます。

例) http://127.0.0.1:8000/test?name=テスト太郎&name=24



### viewファイル
`{{ $name }}`と`{{ $age }}`が値を表示させる部分になります。
```resources/views/test.blade.php
<h2>クエリ文字列を使ってURLから値を取り出してみる件</h2>
<h3>名前：{{ $name }}</h3>
<h3>年齢：{{ $age }}</h3>
```

### ルーティングファイル

```routes/web.php
Route::get('test', 'App\Http\Controllers\TestController@index');
```

### コントローラファイル
クリエ文字列は、Requestにて送信されるので、`$request->項目`という形で取り出します。
下記コードでは、nameを`$request->name`、ageを`$request->age`という形で取り出しています。
```app/Http/Controllers/testController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    public function index(Request $request)
    {
        // $requestを使って各種URL情報を取り出す
        $message = [
            'name' => $request->name,   // 「name=テスト太郎」を取り出す
            'age' => $request->age,     // 「age=24」を取り出す
        ];

        // viewファイルの指定と表示データを設定する
        return view('test', $message);
    }
}
```

## 表示結果
表示結果は下記になります。
期待通り「テスト太郎」と「24」が表示されているのが確認できました。
![スクリーンショット 2023-01-08 12.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521366/4dddb314-7c4b-d701-27bf-e09f964571ff.png)

## 最後に
クリエ文字列を使ってURL情報から値を取り出す方法について説明しました。
直接URLを打ち込んで情報を渡す事は、実際にはぼないと思います。
しかし、GET送信ではURLに各種パラメータを設定してコントローラに値を渡しています。
やっている事自体は一緒なので、その理解につながればと思います。

最後まで読んで頂きありがとうございました！

## 参考書籍
https://www.shuwasystem.co.jp/book/9784798060996.html
Google Cloudアップデート (12/29/2022-1/4/2023)


### Operations Suite: [Dec 26, 2022](https://cloud.google.com/stackdriver/docs/release-notes#December_26_2022)
- Cloud Logging:
    - クライアントライブラリの更新

### Cloud SQL: [Dec 27, 2022](https://cloud.google.com/sql/docs/release-notes#December_27_2022)
- MySQL:
    - 12/20/2022リリースノートの内容を遅延するよ (8.0でlower_case_table_names フラグ利用)

### Dataflow: [Dec 27, 2022](https://cloud.google.com/dataflow/docs/release-notes#December_27_2022)
- SDK 2.44.0からリージョナルエンドポイントを利用している場合に他のリージョンのワーカを起動できなくなるよ

### VPC Service Controls: [Dec 20, 2022](https://cloud.google.com/vpc-service-controls/docs/release-notes#December_20_2022)
- Video Stitcher APIのプレビューサポート

### Cloud Billing: [Dec 19, 2022](https://cloud.google.com/billing/docs/release-notes#December_19_2022)
- Billing exportでCloud SQLのコストがインスタンスごとの情報を見れるようになったよ！

### Cloud Build: [Dec 27, 2022](https://cloud.google.com/build/docs/release-notes#December_27_2022)
- メール、BigQuery、webhookベースの通知をnotifierテンプレートを利用してカスタマイズできるようになったよ！

### Cloud Armor: [Dec 28, 2022](https://cloud.google.com/armor/docs/release-notes#December_28_2022)
- WAFをバイパスするJSONでSQLインジェクションを行う942550-aqliが使えるようになたよ！

### Cloud Data Loss Prevention: [Dec 27, 2022](https://cloud.google.com/dlp/docs/release-notes#December_27_2022)
- PERSON_NAME infoTypeがlegacyでも更新されたよ (古いモデルは利用不可になった)

### Carbon Footprint: [Dec 23, 2022](https://cloud.google.com/carbon-footprint/docs/release-notes#December_23_2022)
- Scope2が100%カーボンフリーだった場合にScope 1と3が表示されていなかった問題を修正したよ
- 利用しているElectricity Mapsの更新で精度が上がるよ
- Carbonモデルのバージョンが7になったよ！

### Operations Suite: [Jan 2, 2023](https://cloud.google.com/stackdriver/docs/release-notes#January_02_2023)
- Cloud Logging:
    - クライアントライブラリ更新

### Managed Mirosoft AD: [Dec 15, 2022](https://cloud.google.com/managed-microsoft-ad/docs/release-notes#December_15_2022)
- Windowsを自動でManaged Microsoft ADに登録する機能がプレビューになったよ！

### Dataflow: [Jan 3, 2023](https://cloud.google.com/dataflow/docs/release-notes#January_03_2023)
- `2023-01-03-RC00`からGoogleが提供するDataflowのテンプレートでJavaScriptのUDFでES6シンタックスをサポートするようになったよ！
    - 古いバージョンを利用したい場合は`2022-12-15-00_RC00`を指定してね。

### Vertex AI: [Dec 15, 2022](https://cloud.google.com/vertex-ai/docs/workbench/release-notes#December_15_2022)
- v1:
    - M102リリース
        - WorkbenchでTensorFlow 2.11, PyTorch 1.13対応、セキュリティとパッケージの更新

### Cloud Text-to-Speech: [Dec 22, 2022](https://cloud.google.com/text-to-speech/docs/release-notes#December_22_2022)
- 新しい音声の追加
    - インド、英語関連の更新



### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートは追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Code coverage driver not available.

coverageするとエラーがでるのでメモ

```bash
php artisan test --coverage

   ERROR  Code coverage driver not available.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/fc662b22-b687-2d38-1ff3-fd7ff176377c.png)

# 教えてSenpai

Xdebugをインストールでなおりました。 https://xdebug.org/wizard に`phpinfo();`か`php -i`を貼り付けてインストールしましょう

```bash
sudo apt install -y php-dev autoconf automake \
  && wget https://xdebug.org/files/xdebug-3.2.0.tgz \
  && tar xf xdebug-3.2.0.tgz \
  && cd xdebug-3.2.0 \
  && phpize \
  && ./configure \
  && make \
  && cp modules/xdebug.so /opt/php/8.2.0/lib/php/extensions/no-debug-non-zts-20220829 \
  && echo zend_extension=xdebug > /opt/php/8.2.0/ini/conf.d/99-xdebug.ini \
  && echo xdebug.mode=coverage > /opt/php/8.2.0/ini/conf.d/99-xdebug.ini
```

xdebug.modeにcoverageを含めないと下記のエラーになります。

```bash
APP_KEY=$(php artisan key:generate --show) php artisan test --coverage

   ERROR  Code coverage driver not available. Did you set Xdebug's coverage mode?
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/f5bdaa6c-ae12-2773-a3f3-9dc71f4b06a2.png)

xdebug.modeの一覧

https://xdebug.org/docs/all_settings#mode


無事カバレッジがとれました🎉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/7721b25d-59f2-0dd5-1e94-cf9a7d2a472b.png)

HTMLにも出力できます！
```bash
php artisan test --coverage-html coverage
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/719b18be-c613-20e5-a28c-0cb8ebc4ee48.png)

```bash
php -S 0.0.0.0:8000 -t coverage
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/04a000fb-2851-bb7c-258a-650e99353e26.png)
【C++】標準入力まとめ【競プロ】

個人的な学習メモ用として標準入力に関するパターンを適宜追記していきます。
扱いやすさの観点から配列に関しては基本的にvectorを使う方針でいきます。

## Pattern1 : １行目に行数のN,以降が数値N行
例)
**3**
1
2
3

■適宜読み取って処理をしたいとき
```cpp
#include <iostream>
using namespace std;
int main(void){
    int N;
    cin >> N;
    int a;
    for(int i=0; i<N; i++){
        cin >> a;
    }
    return 0;
}
```
■1次元配列aに格納したいとき
```cpp
#include <bits/stdc++.h>
using namespace std;
int main(void){
    int N;
    cin >> N;
    vector <int> a(N);
    for(int i=0; i<N; i++) cin >> a[i];
    return 0;
}
```

## Pattern2 : １行目に行数H(高さ)と1行ごとの数値の数W(幅)が与えられるパターン
Excelチックなマス目上の題材のときに頻出
例)
**3 5**
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

■2次元配列aに格納したいとき
```cpp
#include <bits/stdc++.h>
using namespace std;
int main(void){
    int H, W;
    cin >> H >> W;
    vector<vector<int>> a(H, vector<int>(W));
    for(int i=0; i<H; i++){
        for(int j=0; j<W; j++) cin >> a[i][j];
    }
    return 0;
}

```
2重ループの読み取り処理の書き方は見づらいけどこっちでもいいかも
```cpp
for(int i=0; i<H; i++)for(int j=0; j<W; j++)cin>>a[i][j];
```

標準出力に配列の中身を出力したいときは以下
```cpp
for(int i=0; i<H; i++)for(int j=0; j<W; j++) cout << a[i][j] << endl;
```

## Pattern3 : １行目に行数のH,以降が文字列H行で１文字ずつ区切って２次元配列に格納したいとき
※各行(W)の文字数は同じである場合に限る
※文字数固定のため使用箇所は限定的で汎用性低
**4 3**
abc
def
ghi
jkm

■2次元配列aに格納したいとき
```cpp
#include <iostream>
#include<string>
using namespace std;
int main(void){
    int H, W;
    cin>>H>>W;
    string str_line[H];
    string a[H][W];

    for(int i=0; i<H; i++)cin>>str_line[i];
    for(int i=0; i<H; i++){
        for(int j=0; j<W; j++)a[i][j] = str_line[i][j];
    }
    return 0;
}
```

→解いたときにこんな感じでやったけどもっと汎用性高くできる気がします
static class

# static field, static method
inner class(non static)の中のstatic field/methodはコンパイルエラーになる

static field, static methodはinstanceに依存しないという意味なので
instance依存のclassであるnon-static classの中に入れられないからである。
（形だけenclosing-classの中に入っていて、呼び出しの際にenclosing-classを
経由して呼び出すというだけの内包関係で、instanceとして中に入っているわけではない。）
static field/methodはstatic classの中に入れられる。
もし、static field/method, non-static field/methodをまとめてclass内の別classにする場合も、static classとする。
non-static field/methodだけの場合、non-static class(inner class)に入れる。
static classは厳密にはinner classとは呼ばない。

```java
public class Outer {
    static int i;
    class Inner {
        static int j;    //compile error
    }
    public static void main(String[] args) {
    }
}
```
```
com/mycompany/mavenproject1/Outer.java:[21,20] 内部クラスcom.mycompany.mavenproject1.Outer.Innerの静的宣言が不正です
  修飾子'static'は定数および変数の宣言でのみ使用できます
```

inner class of staticにしてエラー解消
```java
public class Outer {
    static int i;
    static class Inner {
        static int j;
    }
    public static void main(String[] args) {
    }
}
```
static classとすることで、new Outer().new Inner()ではなく
new Inner()でインスタンス化できる。

```java
public class Outer {
    static int i;
    static class Inner {
        int j;
        void method(){
            System.out.println("i  am method");
        }
    }
    public static void main(String[] args) {
        Inner i = new Inner();
        i.j = 0;
        i.method();
    }
}
```
Ansibleのdebugモジュールにおいて\nを改行した状態で表示する

備忘

# 課題: debugモジュールにおいて文字列中の改行コード\nをログにおいて実際に改行して表示したい。

debugモジュールにて、改行コードの入った文字列を表示すると、改行コードは\nとして表示され、改行は行われない。

## playbook例
```yaml:site.yml、
- hosts: localhost
  tasks:

  - debug:
      var: text
    vars:
      test: |
        foo
        bar
        baz

  - debug:
      msg: "{{ text }}"
    vars:
      text: |
        foo
        bar
        baz
```
## 出力例
```
$ ansible-playbook site.yml
...

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => {
    "text": "foo\nbar\nbaz"
}

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "foo\nbar\nbaz\n"
}

...
```
改行コードがそのまま\nとして表示されている。
ここで、改行コードを\nでなく実際に改行して表示したい。

# ソリューション1: stdout_callback = community.general.yamlの利用

## community.generalコレクションの導入
```
$ ansible-galaxy collection install community.general
...
```
~/.ansible/collections/ansible_collections/community/general/に導入される

## ansible.cfgに、stdout_callbackとしてcommunity.general.yamlを使用する設定


```ini:ansible.cfg
[defaults]
#verbosity = 1
stdout_callback = community.general.yaml
```




## 実行結果

```
...

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => 
  text: |-
    foo
    bar
    baz

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => 
  msg: |-
    foo
    bar
    baz

...
```

改行されて出力された。
YAML表示の中のため、インデントされている。
|-の為、最後に改行コードが1つ以上存在してもそれらは出力されない。

# ソリューション2: stdout_callback = ansible.posix.debugの利用
個人的にはこちらをよく使っている。

```
$ ansible-galaxy collection install ansible.posix
...
```

```ini:ansible.cfg
[defaults]
#verbosity = 1
stdout_callback = ansible.posix.debug
```

## 出力例

```
TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => {
    "text": "foo\nbar\nbaz\n"
}

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => {}

MSG:

foo
bar
baz


...
```
var=の場合、改行コードは\nとして表示
msg=の場合、改行コードは改行され、インデントなし、最後の改行コードも省略されない。
ROS2 for Unity環境構築メモ

## ros2-for-unity とは
ROS2とネイティブで通信するパッケージです。無駄な変換が入っていないため高速に通信することができます。

https://github.com/RobotecAI/ros2-for-unity

## 環境
Ubuntu20.04 & Foxyで環境構築しました。

## ビルド & セットアップ
### 1. ROS2のインストール
公式のドキュメントに従ってインストール。

https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html

**(重要)** 以下を実行してPCを再起動。
```bash
echo "source /opt/ros/foxy/setup.bash" >> ~/.profile
```

### 2. UnityHubとEditorをインストール
公式ドキュメントに従ってインストール。エディタは2021系をインストール。

https://docs.unity3d.com/hub/manual/InstallHub.html?_ga=2.63641711.1533474705.1673143306-481413123.1672192573#install-hub-linux

### 3. ros2csのビルド&インストール
基本的に以下に従ってセットアップ。ビルドは`./build.sh --standalone`を推奨。
`sorce ~/ros2cs/install/setup.bash`を`~/.bashrc`に書いておいた。

https://github.com/RobotecAI/ros2cs/blob/master/README-UBUNTU.md


### 4. ros2-for-unityのビルド&インストール
基本的に以下に従ってセットアップ。ビルドは`./build.sh --standalone`を推奨。
unity packageにしておくと便利。

https://github.com/RobotecAI/ros2-for-unity/blob/master/README-UBUNTU.md


### 5. 動作確認
空のオブジェクトを作成して以下のファイルを貼り付け実行する。
```
ROS2UnityComponent.cs
ROS2TalkerExample.cs
```
ubuntuのターミナルを開いて`ros2 topic echo`するとUnityからデータが流れてくる。

## 最後に
ROS2 Foxy & Ubuntu20 でビルドしたものをアップロードしてあります。手順の１、２を実行した後にリンクにあるunitypackageをインポートすれば使えます。

https://github.com/TakanoTaiga/ros2-for-unity/releases/tag/foxy
Spring'23のデータテーブルを試した

## 前置き
今回は以前作成した「ファイル削除フロー」を拡張して複数の添付ファイルを同時に削除できるようにしました。

https://qiita.com/DEKA_PIYO/items/2d99ff199b0833f613c1

**データテーブルが加わった**ことで複数のレコードや情報を簡単に表現・活用ができるようになり
このためにVisualforce やLightningコンポーネントを無理に使わなくともよいケースが増えたように思います。

## 添付ファイル削除画面フロー（テーブル）全体像
![png1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/e1a8ae51-6f7b-6867-2561-6b91b3d111be.png)

### 1.コンテンツドキュメントリンク取得
以前はApexで処理していた部分ですが今回はフローでコンテンツドキュメントリンクを取得していきます。

![getcdl.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/8d4966bf-07da-e93b-cd4d-43478a8df2f6.png)


このあとコンテンツドキュメントリンクの項目にあるコンテンツドキュメントを使用して添付ファイルを取得します。

コンテンツドキュメントとコンテンツドキュメントリンクの意味合いは私のざっくりした理解で申し上げると以下のとおりかと思います。


ContentDocument：添付ファイルそのもの
ContentDocumentLink：添付ファイルに紐づいているレコードの場所

正式な説明はこちらからどうぞ
ContentDocument
https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_contentdocument.htm

ContentDocumentLink
https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_contentdocumentlink.htm

### 2.コンテンツドキュメントリンクがあるか
「コンテンツドキュメントリンク取得」でレコードがある場合は後続の処理を続けて、ない場合はエラー画面を出すようにします。
![dcdl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/8f29c017-531b-8afd-0c52-c8b8cebb078f.png)

### 3.ファイルId取得処理、ファイルId割当
「コンテンツドキュメントリンク取得」で取得できたレコードから各レコードのコンテンツドキュメントIdを変数に割り当てていきます。変数はテキスト型のコレクション変数とします。

![loop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/44627dd5-90eb-c63a-88d4-430bcb226bfa.png)
![colFileId.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/912e47a3-73d4-137b-b179-ec3a17f20a4a.png)
![Assin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/d8dc283d-35e8-02f0-2c3a-a33019960d05.png)

### 4.添付ファイルの取得
![In.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/c0ac625f-73d2-7bf1-072c-78ea723087ff.png)

レコードを取得要素で次のように指定することで、複数該当するコンテンツドキュメントを取得することができます。
こちらで取得したコンテンツドキュメントをデータテーブルに指定します。

項目：Id
演算子：次に含まれる
値：colFileId(テキスト型のコレクション変数）


### 5.添付ファイル削除画面選択
![datatable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/2bc4804a-f8e8-5cc6-d0b0-17d34f01d37d.png)


ソースコレクションには「添付ファイルの取得」を選択してテーブルに添付ファイルの一覧を表示していきます。

行選択モードでは「複数」を選択していきます。今回は複数のデータ削除を行うためにこうしています。

最小選択とは指定数以上でないと「次へ」ボタンを押したときにエラーが出る仕組みです。
今回は少なくとも1以上は選択する必要があることから１としています。

同様に最大選択は指定数より大きな数字は選択できない仕組みです
今回は設定していませんが、必要に応じて使える機能だと思います。

列の設定で任意の項目を選択していきます。
項目名以外にもカスタムでテーブル独自の名前を設定できる機能やテキストを折り返すか、切り詰めるかも選択可能です。

### 6.添付ファイルの削除
![delete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/c09a9528-b21d-22dd-b597-7a496d4fee0c.png)

上記で選択されたものを指定し削除します。

### 7.その他
削除後はトーストを表示することでユーザにとってわかりやすくなると思います。

https://qiita.com/DEKA_PIYO/items/85edf7804f15d056d738

またファイル削除は通常、所有者かシステム管理者以外は削除できないですが
フローの実行方法を「システムコンテキスト共有なしーすべてのデータにアクセス」を選択するとシステムモードで実行することになり所有者以外も添付ファイルを削除することができるようになります。

![exceuteFlow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510376/91d67b45-8ff6-ba9c-f16d-ba43bc8184b5.png)
Blenderで重複面の削除

## Blenderで重複面の削除するには

重複頂点は、編集モードでマージ（`M`）の「距離で（remove doubles）」で削除できますが、重複面は削除できません。
ここで、重複面とは「頂点を共有する面」を意味しています。頂点を共有しているので、重複頂点の削除をしても何も変わりません。

具体的に、重複面を作成してみましょう[^1]。

- 平面を追加
    - この時点で、頂点数=4、辺数=4、面数=1
- 編集モードで斜めに２頂点を選択し`J`
- できた三角形と別の三角形になる３頂点を選択し`F`
- もう１つの３頂点を選択し`F`
    - この時点で、頂点数=4、辺数=6、面数=4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/80767b4d-42b5-73a4-8adc-9feb1d1fe3a9.png)

- `A`で全選択し、`Alt + J`（三角面を四角面に）
    - この時点で、頂点数=4、辺数=4、面数=2

さて、面を１つ選択し削除すれば重複面は削除できます。しかし、重複面がたくさんあると手間がかかり見落とすかもしれません。そのような場合は、次のようにすると、まとめて重複面を削除できます。

### 重複面の削除方法

- `A`、`Alt + M`（分割）の「辺と面（選択頂点で）」
    - この時点で、頂点数=8、辺数=8、面数=2
- `M`（マージ）の「距離で」
    - この時点で、頂点数=4、辺数=4、面数=1

このように、頂点を増やしてから「重複頂点を削除する」と、重複面を削除できます。

[^1]: ちなみに、重複辺の作成方法はわかりません。

以上
【個人開発】AIに「自分のお気に入り」の画像を作らせよう【DreamBooth】

# DreamBoothって何？
DreamBoothとは、特定の対象を事後学習させる技術です。

Stable Diffusionなどの画像生成AIを使うと、ユーザーが入力したテキストを頼りに、AIがオリジナルの画像を数秒～数十秒程度で自動生成してくれますが、それでも「私のペット」を描いてと言っても描いてくれませんでした。
そこで例えば、自分のペットの画像を5枚程度用意し、「私のペット」とラベルづけをさせて学習をさせることで、自分のペットの画像を生成できるAIモデルを作ることができます。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/34a883be-3754-351f-6de5-6bf2fe7aebea.png)

一度学習させれば、そのモデルを使って様々な「私のペット」画像を作ることができます。
フランスパリに行ったことがなくても、「エッフェル塔を背景にした私のペットの写真」と指定すれば、まるでエッフェル塔をペットと一緒に行ってきたかのような画像を作れてしまいます。

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/d3e67149-1ed2-52e7-0bcb-9534ac1ed253.png)

# 画家を指定してイラストを描くこともできる
ここまででもヤバいのですが、さらにヤバいのはここからです。
「私のペットのゴッホ風のイラスト」と指定したり、「私のペットのミケランジェロの彫刻」と指定すると、まさにそのスタイルでイラストを作成してしまうのです。
そしてそのクオリティは非常に高いです。

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/c3c9fb70-bed4-7fc3-4062-adb82debefec.png)

# あり得ない画像を作ることもできてしまう
「私のペットがパンダになったら」とか「私のペットがスーパーマンのコスプレをしたら」などというあり得ない注文もその通りに出力をしてしまいます。

![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/a08820fa-8279-2eae-6071-4e69898fc4a0.png)

![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/3636248c-5fc2-2fda-91fc-0c6b190375ab.png)

# DreamBoothを活用したWebサービスの登場

![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/421a9ee9-04fa-809c-b8d3-d9d5b3cf2dd0.png)

[Avatar AI](https://avatarai.me/)というWebサービスがいち早くこのDreamBoothに目をつけてWebサービス化させました。自分の写真を10枚程度を送ると様々なスタイルのSNSアイコンを作成するツールを作りました。

このサービスの作者は売上を公開しており、ほんの数週間で数千万円相当の売上を上げました。
![95b7a7c054dd-20221231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/26bb21f6-716b-7404-19d1-44f9c5f5c4e1.png)


# 自分も個人開発でサービスを作りました。

自分もAvatar AIの真似をしてペットのアバターを作るサービスを作りました。
下の画像はどちらも私の愛犬なのですが、自分の大好きなペットでイラストを作ったり、あり得ない画像を作るのがとても楽しかったのでサービス化させました。

![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/c7cc0759-3101-45b7-34fe-13985562d99e.png)
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/0d9b8a60-fa42-e9e6-9323-fbcfab6e44e2.png)

このサービスは1日で開発し、3日目に売上を立てることができ、そこから毎日売上が上げています。「どれくらいの売上なのか」「プロダクトをどうやって1日で作るのか」「なぜ３日でマネタイズできるのか」みたいな話は別途zennに記載しています。

https://zenn.dev/yuno_miyako/books/1e71f2f7b97cfd/viewer/e6b8ab

# DreamBoothで遊んでみよう
https://github.com/huggingface/diffusers/tree/main/examples/dreambooth

DreamBoothのソースコードはオープンソースで誰でも試せます。
これを使って皆さんも面白いサービスを作ってみてください💪


# 画像引用元
https://dreambooth.github.io/
enebularでalexaスキル その11

# 概要
enebularで、alexaスキルのwebhookを返してみた。
amazon echo dot(第二世代)をwindows10で、セットアップしてみた。

# セットアップ手順

# firefoxをインストールする。

# https://alexa.amazon.co.jp/spa/index.html#new-oobeを開く。

 Echo Dotのセットアップを開始
- まずはEcho DotをWi-Fiに接続しましょう。
 オレンジのライトが点灯するまでお待ち下さい
- Echoを電源に接続します。約1分後に青いランプがオレンジに変わったら、「次へ」をタップします。 
 パソコンとEcho Dotを接続
- このパソコンのWi-Fi設定画面を開き、Amazon-XXXのような名前のネットワークを選択します（表示されるまで1分ほどかかる場合があります）。 Amazon-XXXに接続したら、次の手順に進みます。
 Echo Dotのセットアップを続ける
- パソコンがEcho Dotに接続されました。「次へ」をタップしてWi-Fiネットワークをスキャンします。 
Wi-Fiネットワークを選択
Amazonに保存済み詳細はこちら
    保存済みのWi-Fiネットワークはありません
その他のネットワーク
    TP-LINK_****
    Buffalo-G-****
    ネットワークを追加 
- Wi-Fiネットワークを選択
ネットワーク TP-LINK_****
    パスワード  ****
非表示
Amazonにパスワードを保存
対応するデバイスを自動的にWi-Fiに接続できます。詳細はこちら
 Echo Dotを接続準備中
Echo Dotをインターネットに接続しています。しばらくお待ちください。 


以上。
M1Macで「“Chromium.app”は壊れているため開けません。」 が表示された際の対処法

### 備忘
puppeteerを実行しようとしたところ
「“Chromium.app”は壊れているため開けません。 ゴミ箱に入れる必要があります。」
とエラーメッセージが表示された。

拡張属性が悪さをしていたらしく以下コマンドを実行することで解決できた。

```
xattr -rc /Applications/Chromium.app 
```
[本の紹介][JavaSccript]［ゲーム＆モダン JavaScript文法で2倍楽しい］グラフィックスプログラミング入門

# [［ゲーム＆モダン JavaScript文法で2倍楽しい］グラフィックスプログラミング入門](https://gihyo.jp/book/2020/978-4-297-11085-7)を読んで

JavaScriptでシューティングゲームをつくることができる本。　サンプルを動かして楽しいゲームの作り方が学べる。

## とりあえずサンプルを動かして遊んで引っかかったところ
1. 自機のショットボタンがわからない。
   Zボタンがショットボタン　
1. ゲームオーバー時の復帰方法がわからない。
   Enterキーで復帰する
1. プロジェクトの途中からサンプルが動かなくなる
   サーバーを立ち上げる必要がある。　
   ```shell:shell
   python -m http.server 8080　
   ```
   としてからアクセスすれば普通に動作する。
[VPS]さくらのサーバーにdockerを導入して開発環境を整える

# [さくらのVPSでDockerを使う方法を紹介します。](https://vps-one.site/docker-sakura-vps/)を参考に立ち上げる。
この通りですんなり動いた。　自分のさくらのVPS上にFlaskのサーバーが立ち上がった。

その後、React/Next.jsの環境とか立ち上げたりしたのだけどれそれはおいおい書くことにする。
[AWS]初心者用学習サイトリンク

# [図解 AWSの仕組みとサービスがたった１日でよくわかる](https://www.sbcr.jp/product/4815612818/)

![図解 AWSの仕組みとサービスがたった１日でよくわかる](https://www.sbcr.jp/wp-content/uploads/2021/11/9784815612818-1-421x596.jpg)


ざっくりAWS全体を理解することができました。

以下、紹介されていた初心者学習サイトリンク

1. [AWS で最低限知っておきたい 10 のことシリーズ](https://aws.amazon.com/jp/events/aws-event-resource/beginner/)

1. [AWS 初心者向けハンズオン](https://aws.amazon.com/jp/events/aws-event-resource/hands-on/)

1. [AWS Skill Builder](https://explore.skillbuilder.aws/learn)
Your lock file does not contain a compatible set of packages. Please run composer update.

GitHub Actionsでエラーが出たためメモ

```bash
Annotations
2 errors and 1 warning
laravel-tests
Your lock file does not contain a compatible set of packages. Please run composer update.

  Problem 1
    - ramsey/collection is locked to version 2.0.0 and an update of this package was not requested.
    - ramsey/collection 2.0.0 requires php ^8.1 -> your php version (8.0.26) does not satisfy that requirement.
  Problem 2
    - symfony/console is locked to version v6.2.3 and an update of this package was not requested.
    - symfony/console v6.2.3 requires php >=8.1 -> your php version (8.0.26) does not satisfy that requirement.
  Problem 3
    - symfony/css-selector is locked to version v6.2.3 and an update of this package was not requested.
    - symfony/css-selector v6.2.3 requires php >=8.1 -> your php version (8.0.26) does not satisfy that requirement.
  Problem 4
    - symfony/deprecation-contracts is locked to version v3.2.0 and an update of this package was not requested.
    - symfony/deprecation-contracts v3.2.0 requires php >=8.1 -> your php version (8.0.26) does not satisfy that requirement.
  Problem 5
    - symfony/error-handler is locked to version v6.2.3 and an update of this package was not requested.
    - symfony/error-handler v6.2.3 requires php >=8.1 -> your php version (8.0.26) does not satisfy that requirement.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/155e08b1-159d-71cb-41d8-a16e6bec6a04.png)

# 教えてSenpai
ワークフローのPHPバージョンを`8.0`から`8.2`にするとなおった。GitHub Codespacesで`composer install`したのだが、そのときのPHPバージョンが`8.2`だったようだった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/08114c91-79c1-dbe0-27ce-6ef53ef450c2.png)
草莽Erlang ── 14. if

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## if式の書き方

```
if
  条件1 ->
    本文1;
  条件N ->
    本文N
end
```

1. `true`と評価される条件が見つかるまで順次走査される
2. 一つの条件も`true`と評価されない場合には、`if_clause`実行時エラーが発生する
3. `true`と評価された条件に対応する本文（`,`で区切られた一連の式）が評価される
4. 本文の戻り値が、if式の戻り値となる

他のプログラミング言語でいう「else」に相当する記述をしたい場合は、最後の条件で`true`を使うことができますが、可読性を考えて可能であれば条件を明示することが推奨されているようです。

試しに練習目的で`if`式を使った簡単な無名関数を書いてみます。2つの値を比較した結果を印字するだけの関数です。無名関数なので、Erlangシェルに貼り付けて使えます。

```erlang
CompareNumbers = fun (A, B) ->
  if
    A > B ->
      io:format("~p is greater than ~p~n", [A, B]);
    A < B ->
      io:format("~p is less than ~p~n", [A, B]);
    true ->
      io:format("~p is equal to ~p~n", [A, B])
  end
end.
```

```erlang
> CompareNumbers(1, 2).
1 is less than 2
ok

> CompareNumbers(2, 1).
2 is greater than 1
ok

> CompareNumbers(1, 1).
1 is equal to 1
ok
```

https://www.erlang.org/docs/22/reference_manual/expressions.html#if

https://learnyousomeerlang.com/syntax-in-functions#what-the-if

https://www.ymotongpoo.com/works/lyse-ja/ja/05_syntax_in_functions.html#if

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

[^1]: https://qiita.com/torifukukaiou/items/21df3c512308832c4a15#-%E3%82%A4%E3%82%B4%E3%81%8B%E3%81%99
【実験中】UnityでAmiVoiceを試す③

この内容は、以下の内容の続きとなります。
[【実験中】UnityでAmiVoiceを試す①](https://qiita.com/hidaka2022/items/5cd4e53f6624a61bd174)
[【実験中】UnityでAmiVoiceを試す②](https://qiita.com/hidaka2022/items/dd9f5e663714e5c70f6a)

少し日を置いたらなんとかなるのでは...的な感じで再チャレンジ中です。
再度チェックしてみたら、文言が変わっていました。まじか。

![ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/3679c84c-6101-6e11-d96b-a39eeaa7b440.png)

前は面倒くさがってそのまま名前空間使ったCSファイルをGameObjに貼り付けしていたのが問題だったのかもしれません。
手抜き、だめ、絶対。

調べてみたところ、どうやら証明書エラーのようです。

https://qiita.com/kidach1/items/ee2de96a41672ca64dbb

UnityでのSSL証明書エラー解決方法をまず探します。


## Unity側で証明書は発行可能なようです

https://qiita.com/Takezoh/items/3eff6806a59152656ddc

オレオレ証明書でもいいんだろうか・・・。
いやいや、ここはもうちょっと調べましょうか...


https://developers.cyberagent.co.jp/blog/archives/6649/

あれ、さっきこれ使ったような...

![ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/2054e7ea-be5a-330c-25fa-03c7ff9baf41.png)

普通に使ってました。
ということは、同じように処理をしなければいけないところで使っていないということのようですかね...
ということでソースコードを漁ります。

![gg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/4af0593b-093d-53a6-8d1e-32a5006cc4ab.png)

文言的にここでエラーが出てしまってはじかれているようです。ということで
元の文章にUnityWebRequestをくっつけてみますが、だめでした。


更に漁っていくと、ビルド時に証明書つければ...といった内容があったので
apkファイルで実際に試してみることにします。

https://walkable-2020.com/unity/android-syomei-apk-tsukurikata/

と、ここまでしていたときに気が付きました。
「渡す文字列がおかしいのでは....」

最初に呼出をする文字列を変えていたせいかもしれない....と思い
直してみたところ

![hh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/340a97b4-d513-caf2-a9c9-bfab316c8351.png)

呼び出せました。
エラーは吐いてしまいましたが、これでいったんよしとします。

次はテキスト表示、その次は取り込むwavを上書きする方法を確立すればいけそうです。
Scoop で Ruby をインストール後ちょっとハマった話

# はじめに
https://qiita.com/superrino130/items/e2d7b039c8d91a373770

`Windows`で`Ruby`のインストールと言えば`RubyInstaller`ですが、`Crystal`をインストールするには`Scoop`が必要なので、本格的に移行してみました。
# bundle でハマった
`Gemfile`でパッケージ管理が楽々が魅力の`Ruby`、しかし`native extensions`のインストールでエラーが発生。

```powershell
Fetching gem metadata from https://rubygems.org/.....
Resolving dependencies...
Fetching debase 0.2.5.beta2
Installing debase 0.2.5.beta2 with native extensions
...
An error occurred while installing debase (0.2.5.beta2), and Bundler cannot
continue.
```
ああ、`MSYS2 and MINGW development toolchain`入れてないや。
# ridk install でハマった
https://qiita.com/superrino130/items/c49947028bcba1efe6e0#%E5%AE%9F%E3%81%AFruby%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B

いつもお世話になっております `ridk`、いつものごとく `ridk install`っと。

ちょっと待って！、Cドライブ直下`C:\msys64`にインストールしようとしている。

`Scoop`のメリットは、ユーザディレクトリ直下の`scoopフォルダ`にパッケージを入れることで環境を汚さない（汚れるのか？）ことだよ。

```powershell
   1 - MSYS2 base installation
   2 - MSYS2 system update (optional)
   3 - MSYS2 and MINGW development toolchain

Which components shall be installed? If unsure press ENTER [1,3]

> sh -lc true
MSYS2 seems to be properly installed
Install MSYS2 and MINGW development toolchain ...
> pacman -S --needed --noconfirm autoconf autogen automake-wrapper diffutils file gawk grep libtool m4 make patch sed texinfo texinfo-tex wget mingw-w64-x86_64-binutils mingw-w64-x86_64-crt-git mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-headers-git mingw-w64-x86_64-libmangle-git mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-make mingw-w64-x86_64-tools-git mingw-w64-x86_64-winpthreads-git pkgconf mingw-w64-x86_64-pkgconf
```
ここでは、pacman以降のコマンドをコピーしておき、`ridk`は中止。
# MinGW64 でハマった
```powershell
user@XXX MINGW64 ~
$ pacman -S --needed --noconfirm autoconf autogen automake-wrapper diffutils file gawk grep libtool m4 make patch sed texinfo texinfo-tex wget mingw-w64-x86_64-binutils mingw-w64-x86_64-crt-git mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-headers-git mingw-w64-x86_64-libmangle-git mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-make mingw-w64-x86_64-tools-git mingw-w64-x86_64-winpthreads-git pkgconf mingw-w64-x86_64-pkgconf
warning: database file for 'clangarm64' does not exist (use '-Sy' to download)
warning: file-5.43-1 is up to date -- skipping
warning: grep-1~3.0-6 is up to date -- skipping
warning: sed-4.9-1 is up to date -- skipping
warning: wget-1.21.3-2 is up to date -- skipping
error: failed to prepare transaction (could not find database)
```
`Scoop`でインストールした`MinGW64`にコピペしたらエラー、`'-Sy'`使えと言われる。

`'-S'`の換わりに`'-Sy'`を使用して無事インストール終了
最初の`bundle`も無事インストール終了
# まとめ
+ scoop による ruby の環境構築に成功した
+ 折れない心が重要だ
laravel 'timezone' => 'Asia/Tokyo',【config/app.php】

`config/app.php`に`'timezone' => 'Asia/Tokyo',`と記載すると
`php artisan make:migration create_ramens_table`したときのファイル名がJSTになるのでオススメ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/b039f454-e959-202a-463e-5d05e758137f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/fa1677c0-699d-9869-eb7b-d19f5d2ee7b7.png)
git 、DB関連コマンド

自分で使ってて検索するのが時間かかるので、こちらに書きます。
## ブランチの作成
`git branch [ブランチ名]`
ブランチを作成するときは基本的に元のマスターブランチに戻る。
## ブランチの移動
`git checkout [ブランチ名]`
-bオプションでブランチの作成と移動

##  git remote -v
リモートリポジトリのURLを確認

## git branch -a でブランチが出てこないとき
最初に何もコミットしていないと出てこないときがあるので、現在の変更をコミットする

## git stash
退避したい変更をaddしてgit stash
`git stash list`
で[stash]のIDを見て、下のコマンドでstashの取り出しをする
`git stash apply [stash]`

## git reset 
gitのコミットを取り消してgit hubの余分な差分を消す

git logやgithub上で戻りたいコミットのハッシュを探す

`git reset --hard （ハッシュ値）`

で変更内容もコミットも消す。

`git reset --soft HEAD^`

で変更内容は消さないがコミットは消す。


## DBのリセット
rails db:migrate:reset
rails db:seed

## DBに入ってテーブル更新
rails db
pass:root

### テーブル確認
show tables
select * from (テーブル名)

### DBのアップデート
UPDATE shops SET latitude = 35.689360, longitude = 139.692446 WHERE id=2;

参考URL
https://qiita.com/chihiro/items/f373873d5c2dfbd03250
AtCoder茶色になったぜ

中学１年生、ついにAtCoder茶色になりました。
https://atcoder.jp/users/hiroyuk1

## 何を頑張ったか

ABC279で、D問題に数学の問題が来てよっしゃーと思った。それでレーティングは茶色目前の393まで一気に上がった。
次のABC283では、今度こそ茶色いけるかなーと思ったけど、D問題が解けなくていけなかった。
そして今回、ABC284で、AとBはすぐ解けて、Cはいったん置いといてDを解いた。数学が得意だから、すぐやってみたけど、1回TLE。その後N=p²qという条件を見て書き直して、AC。（ここまではPython）
C問題はグラフで、しかもよくあるやつだったから得意な深さ優先探索で解いた。（AtCoderが1-indexedだったのを忘れて3回RE）E問題はちょっと考えたけど深さ優先探索で、通った頂点を記録するという感じで解いた。

その日はアルゴ式をめちゃくちゃやって、更新されるやつ以外はコンプリートした。（https://algo-method.com/users/9298-5737 ）それでグラフに強くなったからCとEを解けた。あとはF問題。解説を読んでみたけどZ-algorithmなんて知らなかった。解けるわけない。まあ茶色になったからいいということで終了。
M_Map: MATLAB用マッピングツール

# M_MAP
地図を描く時などに便利なMATLABのツール「M_MAP」。

https://www.eoas.ubc.ca/~rich/map.html


Zipファイルのパッケージをダウンロードし、展開、パスを通すだけで利用できる。
詳しくはユーザーガイド（英語）を参照↓

[ユーザーガイド](https://www.eoas.ubc.ca/~rich/mapug.html)

サンプルコードも提供されている。




> _Pawlowicz, R., 2020. "M_Map: A mapping package for MATLAB", version 1.4m, available online at www.eoas.ubc.ca/~rich/map.html._
Gitの使い方

<h4>・はじめに</h4>
　この記事ではGitの基本的なことや使い方をまとめていく。

<h4>・用語の意味</h4>

| 用語 | 意味 |
|:-----|:----|
| リポジトリ | Gitに保存したいファイルを集めたフォルダのようなもの。 |
| リモートリポジトリ | Gitのサーバのリポジトリのこと |
| ローカルリポジトリ | 自分のローカル環境にあるリポジトリのこと |
| ワークツリー | Gitの管理下にあるが、利用者が使用しているディレクトリのこと |
| インデックス(ステージ) | Gitとワークツリーの間にあるGitに登録する前の前座のような存在 |
| コミット | リポジトリに変更を記録すること |
| プッシュ | ローカルリポジトリの変更履歴をリモートリポジトリにアップロード（共有）すること。プッシュを実行するとリモートリポジトリに変更履歴がアップロードされて、ローカルの変更履歴と同じ状態にすることができる。 |
| プル | リモートリポジトリにあるものをローカルリポジトリに上書き又はダウンロードするもの |
| クローン | リモートリポジトリをローカルリポジトリに丸々コピーすること |

<h4>・コミットの方法</h4>
　コミットとはリポジトリに変更を記録するものである。コミットをするとレポジトリの中でコミットしたときの状態とその前のレポジトリの状態の異なっている点、差分を記録したコミットが作成される。

<h5>・コミットメッセージ</h5>
　コミットメッセージは自分がどのような変更をなぜしたのかということを記載するものである。他の人がコミットの内容を調べる場合や自分でも過去の自分のしたコミットを確認する際に重要な情報となるため、変更内容のわかりやすいコメントを書くことが重要である。
<br><br>
Gitでは標準的に 

`1行目:　コミットでの変更内容を1行程度で要約`
`2行目:　空き`
`3行目:　変更した理由`
という形式でコミットメッセージを書くこととなっている。

<h5>・インデックス</h5>
　インデックスとはGitとワークツリーの間にある保存領域のこと。インデックスがあることによってワークツリーにあるが、まだGitに保存したくないものをインデックスに保存し、保存したいファイルだけをGitに保存することができる。さらにファイルの一部の変更だけをインデックスに登録してコミットすることができる。



【参考】サル先生のGit入門
とほほのGit入門