OmniAICreator/Qiita-1.07M huggingface dataset:
(11/25更新)StableDiffusionの個人的まとめ＆遊ぶときに参考にしたサイトたち

# はじめに
いまTwitterではやっている「StableDiffusion」について、
皆さん遊んでますか？？

いい絵ができると嬉しいですよね！！！
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/88362783-1a64-856d-b964-a82d092be78e.png)


だけど使うにあたって、環境構築や絵を指定する文章の構成(以下、呪文)に悩みませんか…？

そんなときに参考にしたサイトたちをブックマークしても、後々何で参考にしたのか、私はよく忘れます！！
なので本記事を書きました！！！

# リンク

本家関係

* 発表ページ

https://stability.ai/blog/stable-diffusion-public-release

* GitHub

https://github.com/CompVis/stable-diffusion

* DreamStudio

http://beta.dreamstudio.ai./

DreamStudioの詳細についてはこちらが参考になりました。

https://kai-you.net/article/84547

## 環境構築系

* とりあえず動かして遊びたい！(公開デモンストレーション)

https://huggingface.co/spaces/stabilityai/stable-diffusion

使い方は簡単で、Stable Diffusionに描画してほしいイメージを英語で入力して「Generate image」をクリックするだけ。
エラーが起きても何度か「Generate image」をクリックすると解消できると思います。
生成に時間がちょっとかかります。

* Googleが提供しているPython実行環境「Colaboratory」で動かす
いずれバージョンが変わるので、バージョン管理には要注意

https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/stable_diffusion.ipynb

　Gigazine様での記事ver

https://gigazine.net/news/20220824-stable-diffusion-google-colaboratory/

　img2imgを試せるver（他の方法についても記載有り

https://www.yamato-tsukasa.com/entry/stable-diffusion-install-tips

　WebGUIで色々できるように整えてくれた「Colaboratory」が展開されているGitHub
 
https://github.com/altryne/sd-webui-colab

* ローカルで動かす
いずれバージョンが変わるので、バージョン管理には要注意

https://zenn.dev/koyoarai_/articles/02f3ed864c6127bb2049

 　GUIで実行(グラボが必要になるため環境には注意してください。)

https://nmkd.itch.io/t2i-gui

　※参考記事

https://pajoca.com/stable-diffusion-gui-nmkd-1-4-0/

　★Stable Diffusion web UI (AUTOMATIC1111)で動かしている人が多いかと存じます。

https://github.com/AUTOMATIC1111/stable-diffusion-webui

　※参考記事

https://gigazine.net/news/20220907-automatic1111-stable-diffusion-webui/

## 呪文作成参考

* ここを知るだけでも精度が変わる検索サイト
他の人がどんな呪文を使って絵を生成しているのか、調べることができます！！！

https://lexica.art/

* 呪文を唱える修行をされた方の記事

https://zenn.dev/silverbirder/scraps/7fa03e90779cdd

* Midjourney や DreamStudio に入力するテキストを生成するAI

https://ai-copywriter.jp/free/136

* Kawaii生成のための指針

https://note.com/diff_momot/n/n527e73dc73b6

* 中国語圏コミュニティによって制作された「NovelAI Diffusion」のテクニック集「元素法典」の日本語翻訳

https://note.com/sa1p/n/ne71c846326ac

## モデル

画像を生成する際に、何を学習してきたか、で得意な絵が異なります。
自分の作成したい画像に合わせてモデルを切り替えてください。

https://note.com/npaka/n/ned44e0242ac0

# 最後に

Twitterでハッシュタグから最新の情報を掴めると楽しいと思います。

https://twitter.com/search?q=%23stablediffusion&src=typed_query&f=live

NovelAIのKAWAII精度がすごいですね…。
ただ、NovelAIが流出してから改造モデルが出てきたり、どこから出てきたのかわからないモデルも増えてきましたね。。

他にも参考になるサイトがあったらコメントをいただけますと幸いです！
よろしくお願いします！！
コマンドラインからiOS実機にアプリをインストールする

前回、コマンドラインでのiOSアプリのビルドについて投稿しました。

https://qiita.com/5enxia/private/ede225f6c57bd5d6906a

今回はさらにコマンドラインからシミュレータと実機へのインストールについても取り組んでみました。シミュレータへのインストールは多くの方がまとめていらっしゃるため、ここでは実機についてのみ書いていきます。

https://qiita.com/tamaki/items/02eb43253193b950b08f

## 実機へのインストール
### 依存関係
実機へインストールるするために`ideviceinstaller`というCLIツールをインストールします

```sh
brew install libimobiledevice
brew install ideviceinstaller
```

https://github.com/libimobiledevice/ideviceinstaller

### 実機のUDIDを取得する
次に実機のudidを取得します。GUIから取得する場合`Finder`や`XCode`のデバイス一覧から取得することができますが、udidを取得するためだけにXCodeを立ち上げるのは面倒なので、CLIから取得します。

```sh
idevice_id
```

### 実機へのインストール
udidが取得できたら、`ideviceinstaller`の`udid`オプションの値にセットします

```sh
ideviceinstaller --install <apppath> --udid <udid>
```

実機にアプリがインストールされれば完了です

## 参考文献

https://stackoverflow.com/questions/17237354/how-can-i-find-the-device-uuids-of-all-connected-devices-through-a-command-line


https://zenn.dev/turara/articles/install-binary-and-launch-by-xcrun
GoogleColaboratoryでGit LFSを使用しGoogleDriveに保存する方法

# GoogleColaboratoryでGit LFSを使用しGoogleDriveに保存する方法

1. githubからgit-lfsをcloneしてインストール
2. git cloneする


- GoogleColaboratoryに記述するコードは下記の通り
```
!curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
!sudo apt-get install git-lfs
!git lfs install

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

!git clone  https://huggingface.co/CompVis/stable-diffusion-v-1-4-original.git "gdrive/My Drive/PreTrainedModel"
```

自分用のメモというかなんというか  
まーローカルに一旦落としてGoogleDriveに上げてもいいんですが、上りが2MBbmsのクソ雑魚回線なのでね・・・
Animatedが絡んだScrollViewで画像の何枚目かを確認する方法

どうもかなりお久しぶりです、ヒロです！
qiitaに記事を書くのは壱、十、百、千、満てっじゃなくて万年振りに記事を書きますが、今後はまたライトにメモを残して行こうと思います。

早速本題

通常`ScrollView`の`onScroll`で現在の位置を取得出来ます。
```tsx
<ScrollView onScroll={e => /* e.nativeEvent.contentOffset.x など*/}>
  {images.map(image => <View>{...}</View>)}
</ScrollView>
```

ここでX軸の割る画面の横幅で現在ScrollViewに表示されている画像が何番目か取得出来ます。

```tsx
  <ScrollView onScroll={e => {
    const x = e.nativeEvent.contentOffset.x
    // stateに現在のindexを保存。小数点は切り捨て、1枚目を1としたいので1を足す
    setCurrentIndex(Math.floor(x / width) + 1)
  }>
  {images.map(image => <View>{...}</View>)}
</ScrollView>
```

しかし、`Animated.ScrollView`を使っているとこれが出来ないケースがあります。
[react-native-animated-scroll-indicators](https://github.com/andreshsingh/react-native-animated-scroll-indicators)のようなライブラリを使っていたりすると、`onScroll`にこういった記述をする機会が多いでしょう。

```tsx
const scrollX = new Animated.Value(0);
...
<Animated.ScrollView
  onScroll={Animated.event(
    [{ nativeEvent: { contentOffset: { x: scrollX } } }],
    {
      useNativeDriver: true,
    }
 )}
>
...
</Animated.ScrollView>
```

しかし、この記述をすると先に書いたような`onScroll`でxの値を取得する事が出来ません。
そういう場合に

```tsx
const scrollX = new Animated.Value(0);
...
<Animated.ScrollView
  onScroll={Animated.event(
    [{ nativeEvent: { contentOffset: { x: scrollX } } }],
      {
        useNativeDriver: true,
        // listenerを付与する
        listener: (e: NativeSyntheticEvent<NativeScrollEvent>) => {
          const offsetX = e.nativeEvent.contentOffset.x;
          offsetX / width;
          setCurrentIndex(Math.floor(offsetX / width) + 1);
        },
      }
  )}
>
...
</Animated.ScrollView>
```

上述のように `listener` を付与すると`Animated.ScrollView`でもスクロール位置を取得出来ます。

特定の画像を表示したら、やスライダーのように何枚目の画像かを表示する際に使えます。

正直`Animated.event`の第二引数のオブジェクトにlistenerを付与する事で取得出来るのに辿り着くまで結構苦戦しました。

同じような悩みを抱えている人に届いてくれると嬉しいです。
Apple M1でコマンドラインからx86_64のiOSアプリをビルドする

他メンバーの書いたコードの挙動を確認する際、自分はコードを変更していないけど更新を確認するために毎回XCodeを立ち上げてビルドするのは、ナンセンスだと感じ、コマンドラインからビルドする方法を導入しました。

## はじめに
iOSアプリをビルドする際はXCodeを開くことが多いと思います。XCodeは便利な機能も多いですが、起動がVSCodeといったエディタと比較して起動が遅いです。また、ボタンを押した際などの切り替わりも遅いことがあります。
他メンバーの書いたコードの挙動を確認する際、自分はコードを変更していないけど更新を確認するために毎回XCodeを立ち上げてビルドするのは、ナンセンスだと感じ、コマンドラインからビルドする方法を導入しました。

## M1上でのビルド（ワークスペースを用いている場合）
### 利用しているすべてのフレームワークがarm64に対応している場合
```sh
xcodebuild -workspace <workspace> -scheme <scheme> -sdk <sdk>
# example
xcodebuild -workspace Hoge.workspace -scheme hoge -sdk i iphoneos15.5
```
### x86_64のみでしかビルドできないフレームワークを利用している場合
先頭に`arch -x86_64`をつけることによってx86_64アーキテクチャでビルドすることができます
```sh
arch -x86_64 xcodebuild -workspace <workspace> -scheme <scheme> -sdk <sdk>
```

#### 補足
本来であれば`x86_64`で実行しないと動作しないコードを`arm64`で一回でもビルドしてしまうと、キャッシュが残ってしまい、以後`x86_64`でビルドしようとしてもFaildになってしまいます。そのような場合は末尾に`clean build`をつけると、キャッシュを利用せず、ビルドを通すことができます

```sh
arch -x86_64 xcodebuild -workspace <workspace> -scheme <scheme> -sdk <sdk> clean build
```

## 参考文献
https://tech.naturalmindo.com/notwork_xcodebuilderror_x86_64/

https://qiita.com/toshi0383/items/6154f947f45e62b427bb
固有ベクトル-固有値同一性（Eigenvector-eigenvalue identity）をJuliaで確認してみる

こちらの論文 Misawa and Yamaji [Zeros of Green functions in topological insulators](https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.4.023177)を読んでいたところ、Eigenvector-eigenvalue identityなるものが出てきて、面白そうだったのでJuliaで実際に試してみました。Eigenvector-eigenvalue identityの原論文は[こちら](https://www.ams.org/journals/bull/2022-59-01/S0273-0979-2021-01722-8/)。

# 試すもの
$n \times n$のエルミート行列$A$の$i$番目の固有ベクトルの$j$番目の要素を$v^{i}_j$とします。この時、固有ベクトルの要素の絶対値は、固有値だけで書けるというのです。

```math
|v^{i}_j|^2 = \frac{\prod_{k=1}^{n-1}|E_i(A) - E_{k}(M_j)|}{\prod_{k=1;k \neq i}^{n-1}|E_i(A)-E_k(A)|}
```
となるそうです。ここで、$M_j$は行列Aから$j$行$j$列を取り除いて作った行列です。

# コード
Julia 1.7.3で動作確認しています。

```julia
using LinearAlgebra

function construct_M(A,j)
    n,m = size(A)
    @assert n == m "A should be a square matrix!"
    r = collect(1:n)
    deleteat!(r,j)
    return A[r,r]
end

function make_v_from_e(A,e,i,j)
    n,n = size(A)
    Mj = construct_M(A,j)
    ej,vj = eigen(Mj)

    a = 1.0
    for k=1:n
        if k == i
            continue
        end
        a *= (e[i]-e[k])
    end
    b = 1.0
    for k=1:n-1
        b *= (e[i]-ej[k])
    end

    return b/a
end
```
このコード、本当は行列$M$の対角化の回数を減らせますが、コードのみやすさのためにそうしていません。

それでは、試してみます。

```julia
function main()

    A = [1 2 3
        2 4 5
        3 5 6]
    e,v = eigen(A)
    n,n = size(A)

    for j=1:n
        for i=1:n
            vfrome = make_v_from_e(A,e,i,j)
            println("$(abs(v[j,i])^2) $(vfrome )")
        end
    end

    A = rand(10,10)
    A = A'*A
    e,v = eigen(A)
    n,n = size(A)

    for j=1:n
        for i=1:n
            vfrome = make_v_from_e(A,e,i,j)
            println("$(abs(v[j,i])^2) $(vfrome )")
        end
    end
    
end
main()
```
二つの行列で試してみましたが、確かにそうなっています。面白いですね。
Teamsのタブ内のPowerAppsアプリに動的にパラメータを渡す

今回はPowerAppsでアプリを開発している過程（それをフォローしている過程）で遭遇した問題についてのトラブルシューティングです。

# Background

* PowerAppsでアプリを構築している。
* 当該アプリはTeamsのチームのチャネル内のタブに埋め込み表示する。
* OutlookのメールやTeamsのメッセージ内のリンクから当該アプリに画面遷移する経路を用意する。
* 遷移の折、アプリで特定のデータ（IDで指し示される）を初期表示したい。
* 当該データはメールやメッセージによって異なる（データのIDは動的に決まる）。

# Problem

PowerAppsのアプリをWebブラウザで表示するのであれば、URLのクエリ文字列の中に任意名称のパラメータを指定することができる（例：`...&itemId=123`）。
しかしTeamsのチームのチャネルのタブ内にアプリを埋め込み表示している場合、当該タブを指すURL（「タブへのリンクをコピー」で取得）にクエリ文字列を追加しても効果がない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/4ae56b45-ae82-8572-93c9-f42f95b00674.png)

「タブへのリンクをコピー」で取得できるURLはあくまでもそのタブを指すURLであって、タブの中に表示されるコンテンツについてのURLではない。

# Solution

「タブへのリンクをコピー」で取得できるURLのクエリ文字列の中に含まれる `context=...` にURLエンコードされたJSONの形式で情報を埋め込むことで解決できる。

URLのクエリ文字列部分をよく見ると、 `context=...` というキーでもってJSON形式のデータが埋め込まれている（読みやすさのため`?`と`&`の前で改行を挿入している）：

```
https://teams.microsoft.com/l/entity/a6b6....7af9/_djb2_msteams_prefix_3...
?context=%7B%22subEntityId%22%3Anull%2C%22channelId%22%3A%2219%3A...3e99%40thread.skype%22%7D
&groupId=34fd...ee05
&appid=364a...2ed6
```

`context=...` の値はURLエンコードされている。デコードすると以下のように、JSON形式のデータであることがわかる：

```js
{"subEntityId":null,"channelId":"19:b853....3e99@thread.skype"}
```

ここで`subEntityId`というプロパティがありながらあえて`null`指定されていることがわかる。
この値は何なのかと[Microsoft社のドキュメント](https://docs.microsoft.com/ja-jp/microsoftteams/platform/tabs/how-to/access-teams-context?tabs=teamsjs-v2)を見てみると、次のような説明が見つかる：

> このコンテンツが指すサブページの開発者定義の一意の ID。 このフィールドは、特定のコンテンツへのスクロールやアクティブ化など、ページ内の特定の状態に復元するために使用する必要があります。

今回の目的にぴったりなプロパティであることがわかる。

PowerAppsアプリの`OnStart`アクションでこのプロパティの値を取り出して変数に設定する式を追加する：

```
Set(subEntityId, Param("subEntityId"))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/26373988-9e87-d271-be2c-50267e9d7804.png)

あとはこの値を必要とする別の式やコントロールから参照するだけ。

こうしてPowerApps側アプリで準備ができたら、先ほどのURLのうち `%22subEntityId%22%3Anull`（デコードすると`"subEntityId":null`）とある箇所に、 `%22subEntityId%22%3A123`というふうに任意の値を記述する：

```
https://teams.microsoft.com/l/entity/a6b6....7af9/_djb2_msteams_prefix_3...
?context=%7B%22subEntityId%22%3A123%2C%22channelId%22%3A%2219%3A...3e99%40thread.skype%22%7D
&groupId=34fd...ee05
&appid=364a...2ed6
```

これでメールやTeamsメッセージからURLを使って（Teamsに組み込まれた）アプリに画面遷移した時、`subEntityId`で指定されたデータを初期表示するという動きが実現できる。

なお、[前掲資料](https://docs.microsoft.com/ja-jp/microsoftteams/platform/tabs/how-to/access-teams-context?tabs=teamsjs-v2)では`context`のプロパティとして他にもいろいろなものが列挙されている。
しかし私がほんの二三試してみた限りでは`subEntityId`のように画面遷移時のパラメータとして活用できるものはあまり（or まったく）ないようである。

## 参考記事

* [Teams integration - deep link open Power App tab with item details](https://powerusers.microsoft.com/t5/Building-Power-Apps/Teams-integration-deep-link-open-Power-App-tab-with-item-details/td-p/744910)
* [Power Apps: Link To Specific Screens & Items in MS Teams](https://fabianackeret.com/powerapps-link-to-specific-screens-items/)
Stable Diffusion を GPU なしのローカル PC で動かす


# Stable Diffusion を GPU なしのローカル PC で動かす

## TL;DR

[DALL・E 2](https://openai.com/dall-e-2/)や[Midjourney](https://www.midjourney.com/home/)など、テキストから画像を生成するモデルが話題になっていますが、その中でも[Stable Diffusion](https://github.com/CompVis/stable-diffusion)はオープンソースとしてモデルが公開されています。[Hugging Face](https://huggingface.co/CompVis/stable-diffusion-v1-4)経由で利用ができるため、簡単にローカル PC で動かすことができます。ということで試してみました。

ただ、単純に動かすだけであればサンプルコードをそのまま動かすだけなので、同じように Huggig Face で公開されている翻訳モデルを併用し、日本語で支持したテキストからの画像生成をやってみました。ローカル PC の環境は M1 Mac ですが、M1 チップに最適化されたモデルはまだ公開されていないため、CPU として実行しています。

## 前準備

以下の Stable Diffusion のページにアクセスするとリポジトリへのアクセス確認がされるため、まずは Hugging Face にアカウントを作成してログインし、利用規約に合意します。

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

![](https://www.inoue-kobo.com/ai_ml/stable-diffusion/images/agreement.png)

その後、ローカル PC で以下のコマンドを実行し、Hugging Face で作成したアカウントの Token を入力します。`huggingface-cli`が存在しない場合は、後述の依存パッケージのインストールを実行後に再度実行します。

```bash
huggingface-cli login
```

## 依存パッケージのインストール

```bash
!pip install --upgrade diffusers transformers scipy
!pip install --upgrade sentencepiece
```

## 日本語から英語への翻訳

`source_text`に画像を生成するためのテキストを指定し、Hugging Face で公開されている[staka/fugumt-ja-en](https://huggingface.co/staka/fugumt-ja-en)というモデルを利用して日英翻訳します。

```python
from transformers import pipeline

source_text = 'それは剣と言うには、あまりに大きすぎた。大きく、ぶ厚く、重く、そして大雑把すぎた。それは正に鉄塊だった'

translator = pipeline('translation', model='staka/fugumt-ja-en')
translated = translator(source_text)[0]['translation_text']

print(translated)
```

```
It was too big to say a sword. It was big, thick, heavy, and too big. It was just a mass of iron.
```

## 画像の生成

Stable Diffusion は重めのモデルですので、推論とはいえ CPU で実行するとそこそこ時間がかかります。M1 Max チップの MacBook Pro の場合、1 回の画像生成で 3〜4 分程度の時間がかかります。
以下では 9 個の画像を生成しているため、全体で 30 分ほどかかります。

```python
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline

device = 'cpu' # サンプルコードではcudaになっていますが、GPUがない場合は`cpu`を指定します。


pipe = StableDiffusionPipeline.from_pretrained(
    'CompVis/stable-diffusion-v1-4', use_auth_token=True)
pipe = pipe.to(device)

prompt = translated

images = []
for i in range(9):
    image = pipe(prompt, guidance_scale=7.5)['sample'][0]
    images.append(image)
```

## 画像の表示

```python
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(15, 15))

for i, image in enumerate(images):
    ax = fig.add_subplot(3, 3, i + 1)
    ax.imshow(image)
```

![](https://www.inoue-kobo.com/ai_ml/stable-diffusion/images/generated-images.png)

上記の例では 1 個だけ黒い画像となっていますが、画像生成時に以下のログが出力されており、`NSFW(Not Safe For Work)=職場閲覧注意`との理由で黒塗りとなるようです。

```
Potential NSFW content was detected in one or more images. A black image will be returned instead. Try again with a different prompt and/or seed.
```

## 参考文献

-   [Hugging Face - CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4)
-   [Hugging Face - staka/fugumt-ja-en](https://huggingface.co/staka/fugumt-ja-en)
ITニュースのログ

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8MMLTEKL70"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-8MMLTEKL70');
</script>


・米国防総省、OSSを優先採用！？／Linuxはバグ修正の優等生／CPUに対するIntel社の思惑
　　https://www.youtube.com/watch?v=kJtoitBl_vY　
・今週のITニュース オープンソース火星へ/Linuxカーネルへ意図的な脆弱性を導入する実験と代償
　　https://www.youtube.com/watch?v=Pw0QlUHQlx0
FSx for Windows File Serverでメンテナンスフリーなファイルサーバー

# はじめに
FSx for Windows File Serverというサービスを利用してみました。

# FSx for Windows File Serverについて
このサービスはマネージドなファイルサーバーとして利用できます。Sharepointなどのブラウザ経由でなくWindowsのエクスプローラーからファイル操作をしたいという要件を満たしながら、バックアップやサーバーの管理はお任せで、冗長構成で可用性も確保できるという素晴らしいサービスです。
## できること
* Windowsのエクスプローラーから```\\servername\share```のように共有フォルダにアクセスすること（DirectConnect等でネットワーク的につながっていることは必要）
* 容量が足りなくなったら追加すること
* バックアップを複数世代取得すること
* マルチAZ構成で冗長化すること
* Windowsクライアントやサーバーからネットワークドライブとしてマウントすること
* 重複したデータがあると自動的に容量を節約する
## できないこと
* サーバーのOSを操作すること
## 必要なもの
* 認証に利用するAcribve Directory環境として下記のどちらか
    * オンプレかEC2などのADサーバー
    * AWS Directory ServiceによるAD。ただしAD Connectorでは接続できません。
* オンプレ環境から利用するならVPCとDirectConnectなどで接続されていること

# 構築手順
1. AWSコンソールからFSxを開く
1. [ファイルシステムを作成]ボタンをクリック
1. 選択肢の中から[Amazon FSx for Windows]を選択して[次へ]ボタンをクリック
1. 「ファイルシステムの詳細」を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/ce6cbf6b-b982-d1be-2ec1-ee96773fa436.png)
    1. ファイルシステム名はNameタグです。
    1. デプロイタイプとしてマルチAZかシングルAZを選択します。
    1. ストレージタイプはSSDとHDDから選択します。
1. 「ネットワークとセキュリティ」を設定する
    1. VPCを設定します。
    1. サブネットを設定します。
    1. セキュリティグループを設定する。ファイルサーバーとして利用するのでSMBのインバウンドは必要になります。
1. 「Windows認証」を設定する。AWS Managed環境なら選択するだけで済みますが、自己管理型ADの場合はいろいろ設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/4f4ffd5b-182e-bdaa-0e1d-f7ef99df9fca.png)
    1. Active Directory ドメイン名
    1. DNS サーバーの IP アドレス
    1. サービスアカウントのユーザー名
    1. サービスアカウントのパスワード
1. 暗号化、バックアップ、タグなどをお好みで設定します。
1. 設定が終わったら確認画面で内容を確認して作成します。
1. 数分でファイルシステムが用意されます。状態が「利用可能」になったら準備OKです。
1. リストからファイルシステムを開くと、DNS名を確認することができます。
1. Windowsクライアントからエクスプローラーで```\\servername\share```を開いてアクセスすることができます。

# おわりに
AWSでEC2等運用している環境があれば比較的簡単にメンテナンスフリーなファイルサーバーが手に入るので、いいと思います。

# 参考文献

https://aws.amazon.com/jp/fsx/windows/
Google Sheets APIでQuota exceededが出た話

## エラーの発生
Google Sheets APIを使用していたら、下記のようなエラーが発生しました。
```
"error": {
    "code": 429,
    "message": "Quota exceeded for quota metric 'Read requests' and limit 'Read requests per minute per user' of service 'sheets.googleapis.com' for consumer 'project_number:1000000000'.",
    "errors": [
      {
        "message": "Quota exceeded for quota metric 'Read requests' and limit 'Read requests per minute per user' of service 'sheets.googleapis.com' for consumer 'project_number:1000000000'.",
        "domain": "global",
        "reason": "rateLimitExceeded"
      }
    ]
```

そこで公式のマニュアルを確認。（英語表記となっております）

https://developers.google.com/sheets/api/limits

上記によると、どうやらリクエストの制限を超えた際に出るエラーなようです。
1分あたりの読み込みの制限はMAXで300なようで、これを超えるとエラーが出るとのこと。

## 解決方法
https://cloud.google.com/docs/quota#requesting_higher_quota

上記の公式サイトにある「割り当て増加リクエストの表示」の手順を追いながら作業をしてみたのですが、読み込みの制限を300以上に引き上げをすることができませんした。
今回は300でエラーが出てしまっているので、システム側でどうにかするしかありません。
今回はPHPを利用していたので、`sleep()`の処理を書いて読み込み速度を若干落とすことで解決しました。

## 最後に
Quota exceededが発生して検索を行った際に、このエラーに関する記事がそれほど出てこなかったので、今回関連記事を書かせていただきました。
この記事が少しでも皆さんのお役に立てれば幸いです。
M5StickCPlusを使ったJoyCとRoverCの動かし方


# 書き込み

## JoyC M5StickCPlus (Remote)

ソースコードはここ

`M5-RoverC/examples/RoverC_M5StickCPlus/JoyC_&_RoverC/Remote/` を使用

https://github.com/m5stack/M5-RoverC/tree/master/examples/RoverC_M5StickCPlus/JoyC_%26_RoverC/Remote



## RoverC M5StickCPlus (Master)

ソースコードはここ

`M5-RoverC/examples/RoverC_M5StickCPlus/JoyC_&_RoverC/Master/` を使用

https://github.com/m5stack/M5-RoverC/tree/master/examples/RoverC_M5StickCPlus/JoyC_%26_RoverC/Master

# 使い方

- 書き込みが終わったらどちらもM5StickCPlusの電源を切っておく(再現性を持たせたいため、慣れた人は不要)
- 各プログラムをM5StickCPlusに書き込んだら RoverC側を起動させる
- RoverC側LCDにM5AP+数字4桁のAP(アクセスポイント)が表示される
- JoyC側を起動させると初めはLCDに何も表示されていないが、RoverC側LCDに表示されてるAPと同じ文字列が表示される
- JoyC側の正面中央ボタンを長押しでペアリング
- ペアリングされるとJoyC側LCDは別の画面に遷移します

# まとめ

JoyCとRoverCの情報は何故かかなり錯綜しているように感じました。
調べても調べても公式じゃないソースコードが紹介されてて本当に動いたんか!?と言う気持ちが隠せません。

またこのJoyCはラズパイや自作ミニカーとかでも使えそうなのでとても満足しています!
もしご自身で解決できないことがあれば記事の投稿日時関係なく書き込んでみてください!
一緒に楽しみましょうd(￣ ￣)
話題のStable DiffusionをDockerImageにしました

# 概要
話題のStable Diffusionすごいですね。
今まで機械学習界隈はあまり触れてこなかったのですがさすがにこれは触っておかねばと思いました。
結果がすぐに見られるのでとてもインパクトがありキラーコンテンツ感を感じています。

https://note.com/fladdict/n/n13c1413c40de

https://zenn.dev/koyoarai_/articles/02f3ed864c6127bb2049

インストールや使い方はいろいろな方が解説してくれているので比較的すぐに実行できましたが、非エンジニアの友人には少しハードルが高かったようなのでDockerImageにしてみました。
せっかくなので利用したい方がいたら使ってもらえればと思い公開します。

ツヨツヨなグラボじゃなくても動くモデルを採用しました。

**とりあえず動かすことしかやってないのでいろいろと問題があると思いますが気にならない方だけご利用ください**:bow:

# イメージとDockerfile
https://hub.docker.com/repository/docker/skta3569/docker-sd

```bash:起動コマンド
docker run -it --rm -v miniconda:/opt/conda/envs -v 出力先ディレクトリ:/output -v cache:/root/.cache -v cache:/root/.huggingface --gpus all docker pull skta3569/docker-sd '画像出力用文字列' huggingfaceのトークン
```

「出力先ディレクトリ」にimage.pngが出力されます。
連続で動かしたら上書きしてしまうのでそのうち改善していこうと思います。

https://github.com/skta3569/docker-sd

# 自分用メモ

- https://huggingface.co/CompVis/stable-diffusion-v1-4
- https://huggingface.co/blog/stable_diffusion
- https://docs.conda.io/en/latest/miniconda.html
敗北の味を知った

校内でプログラミングコンテストがありました。
12位以上を上位者とし、彼らは本戦に進めるようです。　
が、私は見事に予選敗退です。

1年後に向けてめちゃめちゃPythonします。以上です。ありがとうございます^_^
「AWS Cloud Practitioner」これだけやれば（たぶん）合格できます

## e-Learning

AWS Cloud Practitioner Essentials (Japanese) 日本語実写版

https://explore.skillbuilder.aws/learn/course/external/view/elearning/1875/aws-cloud-practitioner-essentials-japanese-ri-ben-yu-zi-mu-ban

AWS公式のe-Learningです。
まずはこれを一通り受講するのがオススメです。

## Udemyの模擬試験

【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）

https://www.udemy.com/course/aws-4260/

- 基本レベル 2回分
- 応用レベル 3回分
- 難易度高レベル 2回分

有料です。
私は、基本レベル 2回分と、応用レベル 3回分をすべて90%以上正解できるまで繰り返して合格できました。

## 試験ガイド

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Exam-Guide.pdf

AWS公式のガイドです。
出題範囲がダイジェストでまとまっているので、e-Learningと模擬試験が一通り終わったあとに見直すと、自分の脳内でちゃんと整理できているか確認できます。

## 学習時間

私は、トータル40時間ぐらいの学習時間で合格できました。
React Nativeで作成したアプリを実機(Android)で動かす手順

# 目次
[1. 実機のデバイス設定を変更する](#1-実機のデバイス設定を変更する)
[2. ビルドを実行](#2-ビルドを実行)


# 1. 実機のデバイス設定を変更する
まず実機端末でUSBデバッグを許可する
システム > 端末情報 > ビルド番号を連打(6回くらい押す必要有り)
システム > 開発者オプション> USBデバッグを許可

# 2. ビルドを実行

実機デバイスをUSBでPCと接続、USBでデバッグを許可するかの確認メッセージが数回出るので許可する
コマンドプロンプトで下記コマンドを実行、デバイスが認識されているか確認する
```
$ npm adb devices
```

![deb01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/ab55002c-7d9b-3dc9-ed0a-0f5a109c39c3.jpeg)


制作したアプリフォルダへ移動、下記コマンドを実行してアプリのビルドを実行する
```
$ npm react-natave run-android
```

デバイスが複数接続されている場合はデバイスを指定して実行する
```
$ npm react-native run-android --deviceId [デバイスID]
```
# Prefab 【Unity の教科書 P216 ～ P225】

# :pig: Prefab の利用 :pig:
# ✨ キーワード ✨
① :pig: Prefab : 同じものを生産したい **型**
② 📄 ジェネレータスクリプト ： **量産する為の指示書**
③ 🤖 インスタンス : **量産された製品**

# 💯良い所💯
・同じものがたくさん作れる:pig: :pig: :pig:
・Prefab の変更がインスタンス（量産された製品）全てに適用される:pig_nose: :pig_nose: :pig_nose:

# 💎手順💎
<details>
      <summary>① オブジェクトからPrefab :pig: を作成</summary>
設計図にしたいオブジェクトをヒエラルキーウィンドウからプロジェクトウィンドウにD&D<br>
名前を分かり易いように（○○Prefab）とするとGOOD😉
</details>

<details>
  <summary>② 指示書（ジェネレータスクリプト）📄 の作成</summary>
プロジェクトウィンドウ ⇒ Create ⇒ C# Script ⇒　ファイル名：○○ジェネレータ<br>
書き加えるコード👉 public GameObject ○○<br>
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;👉GameObject ○○ = Instantiate(○○Prefab)
</details>

<details>
  <summary>③ [ 空のオブジェクト ] に [ ジェネレータスクリプト ] を💥アタッチ💥</summary>
[:white_medium_square:空のオブジェクト] ＋ [🦾ジェネレータスクリプト] ＝ [🏭量産する工場]
</details>

<details>
          <summary>④ ジェネレータスクリプト 📄 にPrefab :pig: を渡す ⇒ 完成 👌</summary>
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;✨アウトレット接続✨<br>
&emsp;&emsp;⇒ スクリプト内の変数にオブジェクトの実態を代入できる<br>
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&ensp;💎POINT💎<br>
・③ で○○Prefab に public があるので，インスペクターから操作可能 👉<br>
・ヒエラルキーから○○ジェネレータ(ジェネレータスクリプト📄のこと)を見つける<br>
&emsp;コンポーネントに ○○ Prefabがあるので，プロジェクトウィンドウから Prefab を D&D
</details>
nodeアプリをさくらのVPS で動かす

忘備録です。

## OSインストール
https://manual.sakura.ad.jp/vps/os-reinstall/reinstall.html

「スタートアップスクリプト」 ・・・　なんか色々機能があって便利だった。必要なものを入れる。
「パケットフィルター設定」　・・・　firewallの代わり？　必要なポートは開けておく
「サーバーへのSSHキー登録」


## 初期設定

```terminal
ssh root@xxx.xxx.xxx.xxx
yum update
adduser 〇〇〇〇
passwd 〇〇〇〇
cd /etc/ssh
cp sshd_config sshd_config.old
vim sshd_config
```
↓ここを変える
```terminal:sshd_config
PermitRootLogin no
```

```terminal
systemctl restart sshd.service
```

## 環境設定

```terminal
yum install httpd
systemctl start httpd
//ブラウザで開いてみる
systemctl enable httpd
cd /var/www
chown apache:〇〇〇〇 html
chmod 775 html
//htmlファイル置いてブラウザで開いてみる
cd
wget https://www.python.org/ftp/python/3.x.y/Python-3.x.y.tgz
tar xzf Python-3.x.y.tgz
cd Python-3.x.y
./configure
make
make install
python3 –version
//終わったらダウンロードしたファイルとかは消しておく
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum -y install --enablerepo=remi,remi-php81 php php-fpm php-devel php-cli php-common php-mbstring php-mysqlnd php-pear php-tcpdf php-mcryptphp-process php-pdo php-bcmath php-xml php-gd php-recode php-pecl-msgpack php-pecl-memcached
systemctl restart httpd
yum install mariadb-server
systemctl enable mariadb
systemctl start mariadb
mysql_secure_installation
//パスワードとかを設定しておく
cd /etc
cp php.ini php.ini.old
vim php.ini
```

post_max_size　と　upload_max_filesize を 128M にしておく


## SSL設定

https://manual.sakura.ad.jp/vps/startupscript/letsencrypt.html

スタートアップスクリプトがあったみたいだけど気付かなかった。
上記の記事を参考にドメインのネームサーバーの設定をしておく

```terminal
cd /etc/httpd/conf
vim httpd.conf
```
一番下に追加しておく
```terminal:httpd.conf
IncludeOptional domains/*.conf
```
domainsディレクトリに適当な名前の.confファイルを作り、ドメインの設定を書いておく
```terminal:〇〇.conf
<VirtualHost *:80>
	ServerName exsample.com
	DocumentRoot /var/www/html/
</VirtualHost>
```
```terminal
systemctl restart httpd
```

しばらく時間を置いてみて、ドメインが表示されるか確認する。


```terminal
yum install mod_ssl
yum install certbot python2-certbot-apache
certbot --apache -d example.com
systemctl restart httpd
```

cronに設定しておく
```terminal:cron
0 3 *  *  * root /usr/bin/certbot renew
```

httpsで確認する。

## nodeアプリ

```terminal
curl -L git.io/nodebrew | perl - setup
vim .bash_profile
```

```terminal:.bash_profile
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

```terminal
source ~/.bash_profile
nodebrew -v
nodebrew ls
nodebrew use [VERSION]
cd /var/www/html
npm init
npm install express --save
npm install -g forever --save
//もしtypescriptで作るなら
npm install --save typescript ts-node
```

処理するapp.tsを作成したら

```terminal
npx tsc
cd dist
forever start app.js
```

停止するときは
```terminal
forever stop app.js
```
    
   
  
ーーーーーーーーーーーーーーーーーーーーーーーーー
参考

https://blog.aroundit.net/vps-nodejs/ 

https://designsupply-web.com/media/programming/3666/

https://qiita.com/mangano-ito/items/75e65071c9c482ddc335

https://kazuhira-r.hatenablog.com/entry/2021/11/28/221448

https://qiita.com/h1y0r1n/items/a2cf8f2e8d3d31ccba49
データの持ち方

データを配置する方法を指して```データ構造```と呼びます。
アルゴリズムの良し悪しは、```プログラムの特性にあったデータ構造がとられているか否に大きく左右```される。
以下データ構造を紹介する。

# 配列
メモリ上に連続した領域に、ずらりとデータを並べて管理する
同じサイズのデータが連続して並ぶ。

## 特徴
### データ一つ一つに添字という番号が付けられている。
この添字をつけることによって直接アクセスすることができる。

### データの挿入や削除などは不得手。
データの個数自体が頻繁に増減する用途には、あまり適しているとは言えない。

### 多次元配列
一列にずらりと並んで配列を一次元配列という。
縦横に並んだ配列を２次元配列という。
このように
３次...とすることができる。

# リスト
データとデータを数珠繋ぎにして管理する。
## 特徴

### ポインタは次のデータへの行き先
リストの扱うデータには、ポインタと呼ばれる番号がセットされている。

### 追加、挿入、削除が簡単
ポインタさえ書き換えることができればいくらでもデータの繋ぎかえることができる。

## 種類
p５５９を見る。
### 単方向リスト
次のデータへのポインタを持つリスト。

### 双方向リスト
次のデータへのポインタと前のデータへのポインタを持つリスト。

### 循環リスト
単方向リストと変わらない。しかし最後尾データは、先頭データへのポインタを持つリスト。

# 気づき

http://www.ohshiro.tuis.ac.jp/~ohshiro/ooprog/pointer/list.html

これを見るとアドレス指定方式を思い出す。
繋がっているんだな。

# キュー
待ち行列と言われている。
最初に格納したデータから順に処理を行う。
```先入れ先出し（FIFO: First In First Out)```方式のデータ構造
順番通り処理されないと困る状況で使われる。

GUIプログラムはキューに溜め込んだ操作を一つずつ処理している。

https://qiita.com/masatom86650860/items/8e941dc091bc8751a3ed#os%E3%81%AB%E3%82%88%E3%82%8B%E6%93%8D%E4%BD%9C%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A

# スタック
キューの逆。
最後に格納したデータから順に処理を行う、```後入れ先出し（LIFO: Last In First Out)```方式のデータ構造。

サブルーチンが処理終了後元の場所に戻れるのは```サブルーチン実行後どこに戻るかがスタックとして管理されているから```。

出典　https://toragi.cqpub.co.jp/Portals/0/backnumber/2005/04/p171-172.pdf

出典 https://gihyo.jp/book/2020/978-4-297-11781-8
さくらVPSにてサポート終了済みのCentOSをインストールする

## 目的
サーバー構築にて、CentOS6.6をさくらVPS上にインストールする必要があったため本記事を作成。

## 環境
- さくらVPS
- CentOS6.6

## 手順
1. CentOSのISOファイルをダウンロードする
※サポートは終了済みの為、ミラーサイトよりダウンロードする
今回は6.6のmininalを選択
http://ftp.iij.ad.jp/pub/linux/centos-vault/6.6/isos/x86_64/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699767/8b3c379d-5662-5d7a-f274-fc0ab4b00b1f.png)

1. ISOイメージファイルをアップロードする
「OSの再インストール」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699767/dc5b6fcf-8932-5f1b-f9b3-2a0798e7b233.png)
「ISOインストール」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699767/f8a0fee0-2cd8-9a5c-5e27-16178ba9cc12.png)
SFTPアカウントを発行し、該当サーバーへISOイメージファイルをアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699767/e3c9232d-89dc-4f5a-3474-c4e613c9d9b3.png)


1.  コマンド`cat /etc/centos-release`で、確認
```bash-shell
[hoge@hoge ~]# cat /etc/centos-release
CentOS release 6.6 (Final)
```
これにてOSのインストールは終了です。
CentOS6はサポートが終了しており、セキュリティ上問題があるので、その辺は十分気を付けてください。

## OSインストール時、やっておきたい設定
- 作業用ユーザの作成
- ntpサーバーの設定
- ネットワーク設定　etc...
40代プログラミング初心者 Hello World の偉大さを知る

勉強していると、必ずでてくる　Hello world を表示させる

勉強を始めたときは、なんでこんな事するんだろうって思ってました

しかし、これがかなり役に立つことがわかりました

新しいプログラミングや開発環境を整えたり、サービスを導入するとき

わからない・・しらべてもわからない・・・

検索しても難しく書いていて理解できない

<b>その時試しに　○○ + Hello World で検索してみた

導入手順とか、基本的な流れを紹介してる記事がちょいちょい出てくる！

Hello　World さえできればあとはなんとかなる！っという気持ちになれる

そこさえクリアすれば今までの知識で対応できそう

っという安心感

<b>世界共通　Hello World 

これさえできればそのプログラミング言語やデプロイ環境が実装できることがわかった

もし困ったらとりあえず　Hello World で検索しよう
TCPラッパー とは

## 勉強前イメージ

聞いたことあるようなないような・・・・

## 調査

### TCPラッパー とは

TCP wrapperと書き、linux系向けのセキュリティソフトになります。
デーモン、tcpdとして常駐して外部からのTCP/IPのアクセス制御や通信履歴の保存を行います。
TCPラッパーの通り、TCPはもちろんUDPやICMPも対応しています。
接続元IPなどを元に接続の許可・拒否の指定ができます。

デフォルトでは、許可は `/etc/hosts.allow` 、
拒否は `/etc/hosts.deny` のファイルに接続元のIPアドレスやホスト名などを記載して設定を行います。

何も設定していない2つのファイルのデフォルトはこちらになります。
manコマンドへの誘導など書いています。

- `cat /etc/hosts.allow`

```
#
# hosts.allow   This file contains access rules which are used to
#               allow or deny connections to network services that
#               either use the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers
```

- `cat /etc/hosts.deny`

```
#
# hosts.deny    This file contains access rules which are used to
#               deny connections to network services that either use
#               the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               The rules in this file can also be set up in
#               /etc/hosts.allow with a 'deny' option instead.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers
#
```

TCPラッパーがファイルを読むのは
`/etc/hosts.allow` → `/etc/hosts.deny` の順で
どちらもファイルの上から読まれます。
2つ同じことが記載されていても、最初に読み取った設定でマッチングされるので
順番は重要になります。

## 勉強後イメージ

大体わかったけどiptablesと何が違うんやろ・・・
似たようなもんな気がするけど

## 参考

- [2.6.2. TCP Wrapper 設定ファイル](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-tcp_wrappers_and_xinetd-tcp_wrappers_configuration_files)
- [TCP wrapper 【tcpd】](https://e-words.jp/w/TCP_wrapper.html)
WordPressで自作テーマを作る(共通パーツ)

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

https://qiita.com/Nats72/items/a9f6f484245d4d2a574c

# ファイル構成
ヘッダーやフッター、サイドバーなどの共通のパーツを作って、ページ構成ファイルに読み込ませます。
```
MyTheme/
  ├ template-parts/  ※共通パーツ保存先
  | └ common_parts.php  ※共通パーツ
  ├ header.php  ※基本共通パーツ
  ├ footer.php  ※基本共通パーツ
  ├ front-page.php
  ├ index.php
  └ style.css
```

## 基本共通パーツ
WordPressデフォルトで決められた命名規則のファイルです。
`header.php`、`footer.php`、`sidebar.php`
これらのファイルは、テーマディレクトリの直下に保存すると使えるようになります。
これらのファイルは、wordpress関数で呼び出すことができます。

## 基本共通パーツ以外
基本共通パーツ以外のファイルは、共通パーツ保存用のディレクトリを作って、そこに保存していくのが良いです。
今回は、`template-parts`というディレクトリを作って、そこに保存します。

# 共通パーツ化させる
今回は、front-page.phpを共通パーツとなるheader.phpとfooter.phpに分けてみます。
ヘッダー部分とフッター部分を分けてみます。
```
<!-- ↓↓↓ここからheader.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>MyHomePage</title>
</head>
<body>
<!-- ↑↑↑ここまでheader.php↑↑↑ -->

<!-- ↓↓↓ここからfront-page.php↓↓↓ -->
    <h1>MyHomePage</h1>
    <p>This is my page.</p>
<!-- ↑↑↑ここまでfront-page.php↑↑↑ -->

<!-- ↓↓↓ここからfooter.php↓↓↓ -->
</body>
</html>
<!-- ↑↑↑ここまでfooter.php↑↑↑ -->
```

## 基本共通パーツ化
以下のとおりにパーツ化させます。
```header.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>MyHomePage</title>
</head>
<body>
```
```footer.php
</body>
</html>
```

## 基本共通パーツを呼び出す
header.phpとfooter.phpを呼び出します。
`get_header()`や`get_footer()`というWordPress関数で呼び出すことができます。
```front-page.php
<?php get_header(); ?>
<h1>FRONT PAGE</h1>
<p>This is front page.</p>
<?php get_footer(); ?>
```
## 共通パーツを呼び出す
以下のコードで呼び出すことができます。
`<?php include("template-parts/common-parts.php"); ?>`
`common-parts.php`は相対パスで呼び出します。
```front-page.php
<?php get_header(); ?>
<?php include("template-parts/common-parts.php"); ?>
<h1>FRONT PAGE</h1>
<p>This is front page.</p>
<?php get_footer(); ?>
```
【WordPress】アンカーリンク＋target＝_blankで挙動がおかしくなる時の原因と対策

## 起こった現象

WordPressで、以下のようなリンクをクリックした場合↓
```html:html
<a href="https://example.com/test#midashi" target="_blank" rel="noopener noreferrer">別窓リンク</a>
```
問題なければ、別窓orタブがひらいて、testページの「id="midashi"」へ、移動した状態が表示されます。

今回なぜか、クリックした元のページがtestページに遷移したうえ、別窓orタブでtestページを開く（でもidの位置へ移動はしない）という現象が起きました。

WordPressでサイト作成中に遭遇したので、WordPress上での対策として書きます。

## 原因

WordPressで使用しているテーマまたはプラグインに同梱されている「スムーススクロール」が原因でした。

スムーススクロールはだいたい```$('a[href*="#"]').on('click',function(){});```という感じで「#」を含むリンクをクリックをすると発火するようになっています。
ただこれは、```target＝"_blank"```を設定してないリンクを前提としてるので、どうもこれが原因のようです。

## 対策

テーマやプラグインの設定でスムーススクロールを解除できればいいですが、今回はできなかったので、以下のような対策をしました。

別窓で表示したい、アンカーリンクを設定したページにカスタムHTMLなどで以下のような記述を追加します。

```html:html
<script type="text/javascript">
jQuery(function($) {
  $(window).on('load',function(){
    var locUrl = location.href;
    var setHash = locUrl.split('?');
    //現在のページURLに?が含まれる場合はスクロール移動
    if(setHash[1]){
        var posName = ("#"+setHash[1]);
        var position = $(posName).get(0).offsetTop;
        $('body,html').animate({scrollTop:position}, '0');
    }
  });
});
</script>
```

設定するリンクは↓のように指定します。

```html:html
<a href="https://example.com/test?midashi" target="_blank" rel="noopener noreferrer">別窓リンク</a>
```

「#」を含むと挙動がおかしくなるので、「#」の代わりに「?」を含むリンクを別窓で表示。
↓
表示したページのURLが「?」を含んでいる場合、「?」以降の文字列のアンカーリンク位置へスクロール移動する。

という仕組みです。
今回はこんな感じで対策しました。

### 注意点

WordPressの場合、「#」の代わりに「?」を使うので、パーマリンク設定で「?」を含まないURLに設定しておく必要があります。

## 余談

テーマやプラグインでスムーススクロールが同梱されてるのはいいんですが、たまーにこういうことが起きるので、テーマやプラグインの挙動に必須でなければ任意で外せるようにしておいて欲しいです。

もしくは、発火条件を```$('a[href*="#"]')```ではなく、```$('a[href^="#"]')```とか```$('a[href*="#"]:not([target="_blank"])')```とかにしてもらえたら助かります。

あと、ヘッダー固定とかすると、見出しとヘッダーがかぶるので、ヘッダー固定をできるテーマの場合、ヘッダー固定したら少しズラしてスクロール移動するようにしてもらえたら嬉しい。

今回のコードは、以前書いた「[スムーススクロール2020年版](https://qiita.com/mei331/items/80e753bc13e8c6fdddf5)」からヒントを得ました。
書き残しておくもんですね。

<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="Yzabvmv" data-user="mei331" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mei331/pen/Yzabvmv">
  Untitled</a> by Mei Koutsuki (<a href="https://codepen.io/mei331">@mei331</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
TorchvisionのCelebAデータセットについて

# 概要
218*178のカラーの顔画像202599枚
![k_testoriginal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2815034/88d7f632-9667-def1-e105-b4b2bf29d0b5.png)

## 引数

torchvision.datasets.CelebA(root: str, split: str = 'train', target_type: Union[List[str], str] = 'attr', transform: Optional[Callable] = None, target_transform: Optional[Callable] = None, download: bool = False)


- root:ダウンロードデータを入れるディレクトリ
- split:[train:162770 test:19962 valid:19867 all:202599]から選択
- target_type:[attr, identity, bbox, landmarks]
  attrは40種類ある特徴(0:5_o_Clock_Shadow(髭の剃り残し),1:Arched_Eyebrows(三日月眉),...39:Young(若さ))に該当しているか -1 or 1
  identityは人のラベル(同じ人物は同じ数字)
  bboxはbounding box(x,y,width,height) 顔の位置
  landmarksは　顔のパーツ(目や鼻)の位置(lefteye_x, lefteye_y, righteye_x, righteye_y, nose_x, nose_y, leftmouth_x, leftmouth_y, rightmouth_x, rightmouth_y)
- transform:画像データに対する加工
- target_transform:target_typeに対する加工
- download:データをrootにダウンロードするか


参考
http://cedro3.com/ai/celeba-dataset-attribute/
Githubって何ですか？と聞いたエンジニアがいた


プログラマ向けの勉強会を開いている主催者だった。住んでいる世界が違うのだろうか。Githubの知名度は100%だと思っていた。

僕の場合はサーバーレスという言葉を知らなかった。転職活動の面談でサーバーレスという言葉を出されて怖気づいた。てきとうにごまかして「サーバーレスと言いますと…」と中途半端な返事をした。オンプレという言葉も知らなかった。

ひとつの職場では周りの実力者たちが話し合う技術用語のほとんどが分からなかった。とても技術的なキャッチアップに付いていけないように思えた。実力に雲泥の差があるように感じられた。実際にそうだったと思う。

だが何故か自分の場合はそこそこ技術的な実力は認められていたように思う。大きな企業のマネージャーからも言われたのだから間違いないはずだ。他の証言もある。どや()。このギャップが不思議に思える。

実力と技術的なキャッチアップはある程度は別物なのかもしれない。多くの技術用語を駆使するけれど仕事が出来ないエンジニアも見かけたことがある。多くの用語を知っていると実力もあるように見えるが本当の実力は試してみないと分からない。相関関係はあると思うが絶対ではない。

技術用語に疎いと困るのは新しい仕事を見つける時に不利なことだろうか。面談は主に技術用語のマウンティングでおこなわれるイメージもある。技術用語には詳しくないけど実力は十分です！なんて言ったって通用するはずがない。困った。

<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
プログラムの作り方　16-4,5

# 変数は入れ物として使う箱
* 変数はメモリの許す限りいくつでも使うことができます。
* 変数に名前をつけて管理する。
* 変数に値を格納することを```代入する```という。

# アルゴリズムとフローチャート
アルゴリズムさえきっちり固まっていれば、それをプログラミング言語で落とし込んでいくだけ。
プログラミングの肝は```アルゴリズムをしっかり考えること```
そのために```フローチャート```を用いる。
処理の流れを表す図。

構造化プログラミングの順次、選択、繰り返しで表せる。

https://itmanabi.com/structured-objectoriented-prog/
【VirtualBox】CentOS7にMySQL8.0を入れる方法

# 概要
ローカルの開発環境として、VirtualBox上のCentOS7にMySQL8.0を入れてWindows上のIDEから接続できるようにする

# 環境
- Windows10
- VirtualBox 6.1
  - CentOS Linux release 7.7.1908 (Core)
  - mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)

# 手順
## yum installでMySQLを入れる

```
// パッケージ追加、確認
$ sudo yum localinstall http://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ yum info mysql-community-server

// インストール、確認
$ sudo yum install mysql-community-server
$ mysql --version
mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)
```

## WindowsからCentOSのMySQLに接続できるように

firewallでTCP3306(MySQLの接続port)を許可します。

```
$ sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all | grep port
  ports: 3306/tcp
  forward-ports: 
  source-ports:
```

## MySQLに接続用のユーザーを追加

MySQLにrootユーザーでログインしてまずは初期パスワードを変更します。次に接続用ユーザーを追加して権限を付与します。

```
// rootユーザーの初期パスワード変更
mysql> alter user 'root'@'localhost' identified BY 'NewPassword';

// 接続用ユーザーを追加、権限付与
mysql> create user 'user-name'@'%' identified by 'your-password';
mysql> grant all privileges on *.* to 'user-name'@'%' with grant option;
mysql> flush privileges;

// 確認
mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user-name        | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
```

ちなみに、パスワードはデフォルトだと英数字記号(英字は大文字と小文字)をそれぞれ1つ以上使わないと引っかかると思います。

```
// パスワードポリシーの確認
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
```

## 接続情報を確認

IPアドレスを確認し、データソースに接続情報を記載して無事に接続完了です。

```
// IPアドレスを確認
$ ip a

// データソースに接続情報を記載(Java:SpringBootの例)
datasource:
  url: jdbc:mysql://192.168.1.123:3306/your_db
  username: user-name
  password: your-password
```

# 参考
- [CentOS7にMySQLをインストールして初期設定するまで](https://qiita.com/nooboolean/items/7efc5c35b2e95637d8c1)
- [CentOS 7 firewalld よく使うコマンド](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)
- [【Linux】firewall-cmdの設定とオプション一覧](https://milestone-of-se.nesuke.com/sv-basic/linux-basic/firewall-cmd/)
ギャグが通じない職場


ひとつの職場ではとにかくノリが合わなかった。僕が面白いと思って言ったことは全て滑った。逆に皆が爆笑している時に僕は全く笑えないのだった。

僕はそれなりにユーモアのある人間だと自認していたが間違いだった。ギャグがウケるかどうかは文化にもよる。文化的に合わない職場だったのだと思う。

あとはパワーバランスだ。尊敬される実力者が言うことであれば何でも好意的に受け止められるだろう。技術力の高い周囲の中で僕は末端の技術者だったので何を言うにも躊躇していた。僕はその職場で出しゃばらないスキルを抜群に伸ばしたように思う。そして同時に怯える心も手に入れた。

あなたのギャグが職場で通じないとしたら根本的に文化が合わないのかもしれない。自分と似たノリを持つ環境に身を置く方が仕事は楽しい。それが本当に良いことかどうかはさておき。

<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
SourcetreeとBacklog ソースパス/ソースURLとして正しくありません　対処法


SourcetreeとBacklogを連携してSourcetreeでクローンを作成しようしたらハマりました。


色々なサイトにも掲載されているようにこターミナルやPowerShallで何かをいじると書いたりましたが、
なんせその辺の知識がないのでもっと簡単にできないかと色々サイトを調べていました。

中には


多くの記事であるplinkを変更しようと思ったがまずそのファイル？がない。
どこにあるかもわかない状況だった。。。

そこで行なったのが、

# ①エクスプローラーの中でputtyと検索

するとでてきました。
自分のPCにも入っていたのか。。。。。

# ②C:User¥~puttyと検索ボックスの横にパスが表示されるので、カーソルをそこに持って行き、コピー

# ③ターミナルやPowerShallに移動して、　cd 〜

〜には②のコピー値

するとカレントディレクトリからパス値に移動できる。
多くの記事では移動とコマンドを同時に行なっているが、無知の自分は先に移動してからの方が
わかりやすいと思った。

そしてその後、他のサイト記事を参考にplink.exeファイルに移動しようとすると無いですのような
エラーになる。。。。。。
またこれかーーーーーーー
Plinkをファイルから直接開こうとしても開かない。。。。。

長くなったが、色々調べて結果⬇️でクローン作成できた。plinkには移動しなくても良かったのか。
実行コマンドだったのか？？まだその辺は今後調べていこう。。。。

# ④plink -ssh 〜

〜にはBacklogのGitのリポジトリのSSHの値が入ります。
(例)〜＠~git.backlog.com~

# ⑤その後Store key in cache? と聞かれるので　「y」入力

# ⑥soucetreeに戻り、元のパスに上の〜を入れる(BacklogのGitのリポジトリのSSHの値)
クローンできるようになりました。
FlutterでWebUI

(自分用メモ)

環境
---
- OS: Windows 10
- Flutter 3.x

SDK導入
---
1. Flutter SDK: https://docs.flutter.dev/get-started/install/windows から`flutter_windows_3.x.x-stable.zip` を取得。
2. 展開しpathを設定。例えば`c:\tools\flutter`に展開
set path=C:\tools\flutter\bin;%path%
```
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.0.4, on Microsoft Windows [Version 10.0.22000.856], locale ja-JP)
[✓] Chrome - develop for the web
...
! Doctor found issues in 3 categories.
```
今回`[✓] Flutter`, `[✓] Chrome - develop for the web` を確認。

Webプロジェクト初期化
---
https://docs.flutter.dev/get-started/web に従う
```
$ flutter channel stable
$ flutter upgrade
$ flutter devices
Windows (desktop) • windows • windows-x64    • Microsoft Windows [Version 10.0.22000.856]
Chrome (web)      • chrome  • web-javascript • Google Chrome 104.0.5112.102
Edge (web)        • edge    • web-javascript • Microsoft Edge 104.0.1293.63
```
`Chrome (web)`を確認

実行テスト
```
$ flutter create myapp
$ cd myapp
$ flutter run -d chrome
```
以下のサンプル実装が表示されるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285723/a7c7f640-a9fb-79ad-6f8e-610b517d4744.png)

デプロイメント
---
本来ホスティングサービスを使うが、ここではFlutterのデバッガを起動し別サイトからアクセスしてみる
```
flutter run -d chrome --release --web-port 80 --web-hostname 0.0.0.0
```
リモートPCでブラウザを開き `http://サーバホスト名(かIPアドレス)/` をアクセス。

UI作成に着手
---
サンプルをベースにUIを作成する。
ここではIDEとして[IntelliJ](https://www.jetbrains.com/ja-jp/idea/)を使用。インストール後、
File ➔ Settings ➔ Plugins ➔ Market PlaceからFlutter Pluginを追加。
File ➔ Settings ➔ Language&Frameworks ➔ Flutter ➔ Flutter SDK path を設定

編集するファイルは lib/main.dart

あとは公式サンプルを参考に。
【Kotlin】suspend関数の呼び出しをMonoに変換する【Reactor】

`kotlinx.coroutines.reactor.mono`関数を使うのが簡単だと思います。
サンプルコードは以下の通りです。

```kotlin
import kotlinx.coroutines.delay
import kotlinx.coroutines.reactor.mono

suspend fun foo(): String { println("foo"); delay(100); return "foo" }

fun main() {
    val result = mono { foo() }.block()
    println(result)
}
```

詳しくは以下のドキュメントをご覧下さい。

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/mono.html

## 使い所
`Java`で定義された関数が引数として`Mono`を要求していた際に使えます。
また、`Mono`への変換（ラップ）処理は非`suspend`関数からも呼べるため、`Java`プロジェクトから`Kotlin`で書かれたライブラリを呼ばなければならない際のグルーコード作成にも使えます。
OpenShift で Chaos Mesh を動かしてみた

## 初めに

Chaos Engineering を支援するツールであるChaos MeshをOpenshift上で動かしてみましたので、ご紹介します。
Chaos EngineeringやChaos Meshの詳細については、さまざま情報がInternet上で公開されているので、そちらをご参照ください。

## Chaos Mesh の OpenShift へのインストール

基本的には、公式ドキュメント(https://chaos-mesh.org/docs/production-installation-using-helm/)
の手順に従って、導入していきます。

1. 導入先プロジェクト（Namespace）の作成

```
$ oc project chaos-testing
```
　
2. SCCの付与
公式ドキュメントのFAQ(下記URL)に記載の通り、OpenShift上に導入するには、SCC権限の付与が必要になります。
https://chaos-mesh.org/docs/faqs/#q-while-trying-to-install-chaos-mesh-in-openshift-the-problems-regarding-authorization-blocked-the-installation-process


```
$ oc adm policy add-scc-to-user privileged -n chaos-testing -z chaos-daemon
```
　
3. HELMレポジトリの追加

```
$ helm repo add chaos-mesh https://charts.chaos-mesh.org
```
　
4. Chaos Mesh の導入
OpenShiftのランタイムは、CRI-Oなので、オプションにはCRI-Oを指定します。
```
$ helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-testing --set chaosDaemon.runtime=crio --set chaosDaemon.socketPath=/var/run/crio/crio.sock --version 2.3.0
```
　
5. Openshift Route の作成
```
$ oc expose svc chaos-dashborad
route.route.openshift.io/chaos-dashboard exposed
$ oc get route chaos-dashboard
NAME              HOST/PORT                                     PATH   SERVICES          PORT   TERMINATION   WILDCARD
chaos-dashboard   chaos-dashboard-chaos-testing.xxxxxxx.xxxxx          chaos-dashboard   http                 None
```

## Chaos Mesh Token 設定

1. ブラウザで、上記で作成したrouteのURLにブラウザでアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/7086dea0-5aec-d6c4-51ba-30c823d156d0.png)

2. 「Click here to generate」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/4f7fab25-51a4-fe50-18bb-a31db3ca2131.png)

3. 「cluster scoped」にチェックをつけ、「Role」をManagerにします。
画面下の指示に従い、Tokenを取得します。
※最後のkubectl describe secretのコマンドは、最後に「-n default」のオプションをつけて実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/8c9dcb0f-f962-5b68-a746-bff04b922680.png)

4. 最初に出てきた画面に戻り、「Name」に任意の値を入れ、Tokenに上記で取得したTokenの値を入れ、Submitをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/1a8f3dec-6010-9dcb-16ab-26be2ca82fa0.png)


## 障害の注入

今回は、Pod障害の注入を行ってみます。

1. Chaos Mesh の画面から、「Experiments」→「+ New experiment」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/222c7ee0-b165-cf75-8b86-4883d7c986ea.png)

2. 「Kubernetes」→「Pod Fault」→「Pod Failure」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/561c119a-323f-3cec-f17a-9705907d2e52.png)

3. 「Experiment Info」に障害を注入するPODの情報等を指定して、「Submit」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/0533ac9a-d504-a912-6406-5aabad143a55.png)

4. Submitエリアが現れるので、「Submit」をクリックし、障害を注入させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/d89466ca-d269-f590-90b4-998a14046799.png)

5.一部Podで障害が発生し、RESTARTSが発生したことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/b947ff1c-089e-8d26-1308-e29f2984866e.png)
Stable Diffusion導入で変なところでつまづいた人用

# ModuleNotFoundError: No module named 'ldm'というエラーが出る。
```
pip install -e .
```
を実行していない可能性が高い。
# ModuleNotFoundError: No module named 'taming'というエラーが出る。
\stable-diffusion\src\taming-transformers\tamig　フォルダを\stable-diffusion　フォルダまでコピーする。
# ModuleNotFoundError: No module named 'clip'というエラーが出る。
\stable-diffusion\src\clip　フォルダを\stable-diffusion　フォルダにコピーする。
# img2img（画像を描き直してもらうやつ）が実行できない。低メモリフォーク版を使っている場合。
フォーク版はtxt2imgと同じくコマンドが違う。
```
python optimizedSD/optimized_img2img.py --prompt "Austrian alps" --init-img ~/sketch-mountains-input.jpg --strength 0.8 --n_iter 2 --n_samples 5 --H 576 --W 768
```
のようにoptimizedSDフォルダから名前違いのimg2imgを実行する。