OmniAICreator/Qiita-1.07M huggingface dataset:
DreamBooth で人物画をパーソナライズしたいメモ

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Grace Kelly in Game Of Thrones<br>Grace Kelly in Wonder Woman<br>Grace Kelly in Captain Marvel<br>Grace Kelly in Star Trek<a href="https://twitter.com/hashtag/dreambooth?src=hash&amp;ref_src=twsrc%5Etfw">#dreambooth</a> <a href="https://twitter.com/hashtag/stablediffusion?src=hash&amp;ref_src=twsrc%5Etfw">#stablediffusion</a> <a href="https://t.co/si5YBfUTnB">pic.twitter.com/si5YBfUTnB</a></p>&mdash; Roope Rainisto (@rainisto) <a href="https://twitter.com/rainisto/status/1578114725191319556?ref_src=twsrc%5Etfw">October 6, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

はわわ... DreamBooth しゅごい...

https://dreambooth.github.io/

自分でもやりたいね

## 学習する

https://amaru-ai.com/entry/2022/09/10/195824

ありがとうございます.

## 環境

DreamBooth, DreamFusion を GPU メモリ 16 GB or 24 GB で動かしたいメモ
https://qiita.com/syoyo/items/8fc5906db4730a2651c9

ROCm で Stable DreamBooth 動きます(現状解像度に制約あり)
https://qiita.com/syoyo/items/7e8d2fa548a78801c8e4

あたりで整備しておきます!

## 結果

Marilyn Monroe が故人で肖像権の問題も少ない(遺族はいろいろ主張しているようであるが...)と思いましたが, すでに reddit 等で多く行われているのでやめました.

アーニャにします!

https://en.wikipedia.org/wiki/Anya_Taylor-Joy

7 枚ほど集めて学習しました.

3090 で学習に 3 時間, 推論に 15 秒ほどでした.
(P100 でも試して, P100 では学習に 4.5 時間, 推論は 20 秒)

![anya-portrait.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/f51773d2-db76-9fdf-67a5-120be3abd9c0.png)


![anya-endgame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/b74e56e6-0ee4-7648-7cff-8b09e7fa5fae.png)

![anya-qg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/fe231e06-f15e-bcf4-062b-b9e84989fbd1.png)


じゃーん!

### Stable diffusion v1.5

https://huggingface.co/runwayml/stable-diffusion-v1-5

Stable diffusin v1.5 にして試しました!今回は AnneHathaway!

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やったー🤗 runwayml stable diffusion v1.5 で Dreambooth できたー! 🎉 Anne Hathaway in Notting Hill 😳 <a href="https://t.co/sEQ512Ks0H">pic.twitter.com/sEQ512Ks0H</a></p>&mdash; syoyo.eth 🌸 レイトラ ® 🐯 4 周年 🎉 (@syoyo) <a href="https://twitter.com/syoyo/status/1584475589104504832?ref_src=twsrc%5Etfw">October 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

多少は改善されているかも :thinking: 


### 失敗例

prompt に `~ playing chess` 追加してみましたがうまくいきませんでした :cry:

![anya-chess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/e0487d38-ff57-5d83-4335-733a95cb1240.png)


## 考察

アーニャやアン・ハサウェイのまえに, 他の人物データでためしたのですが, そちらはうまくいきませんでした.
髪の色なども prompt で指定しより詳細に指定したのが悪かったのかもしれません. prompt は man とか woman くらいの簡素なのでいいのかもしれません.

元画像の構図(腕が写り込んでいたりとか)はそこそこ影響されます.
狙った画像を作りたい場合はよいですが, より任意で画像作りたい場合は人物画の場合はなるべく顔だけの画像を指定したほうがよさそうです.

また, ある程度特徴のある顔立ちがいいかもしれません.

## TODO

* [ ] img2img でより狙った構図で画像生成する
* [ ] よりうまく学習できるような prompt を見つける(最初に入力画像を顔認識とかにかけてうまくいきそうなのを分類したりとががいいのかしらん). 論文読んで見る.
* [ ] GFPGAN あたりで結果をより良い感じにする https://github.com/TencentARC/GFPGAN
４０代おっさんPythonを勉強する（無名関数編）

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## 無名関数：lambda

- 1つの分で表現する無名関数
- 普通簡単に表せる関数に使う
- あまり繰り返して使わない関数に使う(基本使い捨て)

```python
#  普通の関数
def square(x):
    return x**2

#  二乗のリスト
sq = [square(x) for x in range(10)]
print(sq)
```

- squareの関数をmap関数で導入すると
- 名前 = lambda 引数, 引数, ... : 式

```python
sq = list(map(square, range(10)))
print(sq)

#  同じことにlambdaを使うと簡潔になる
sq = list(map(lambda x: x**2, range(10)))
print(sq)

#  もっと簡潔に、直接内包表記を使う
sq = [x**2 for x in range(10)]
print(sq)
```

- lambdaをfilter()関数で導入すると条件でフィルターすることができる

```python
#  偶数のリスト
even = list(filter(lambda x: x % 2 == 0, range(20)))
print(even)

#  Pythonらしいのは、ifを使う
even = [x for x in range(20) if x % 2 == 0]
print(even)
```

- lambdaがもっとも役に立つのはソートするときのキーを設定すること

```python
#  Name, grade, age
students = [('としき', 'A', 4), ('あっきー', 'B', 10), ('さぶろう', 'B', 6)]
#  sort by name
students.sort(key=lambda x: x[0])
print(students)
#  sort by grade, age
students.sort(key=lambda x: (x[1], x[2]))
print(students)
#  sort by age
students.sort(key=lambda x: x[2])
print(students)
```

## 参考

https://www.kitakyu-u.ac.jp/news/2022/08/003215.html
.netrcを使ってログインを楽にする方法

## .netrcとは？

自動ログインプロセスで使われる ログイン情報と初期化情報が記載されているファイル

IDやパスワードの入力を省略することができる。

### 保存場所

ホームディレクトリに保存されている。

## .netrcを作成

```bash
vi ~/.netrc
```

## 設定の記述

### フォーマット

```
machine <git server domain> // 接続先URL
login <your gitbucket user name>
password <your gitbucket password>
```

### 設定例

```
machine sample.com
login yamada.taro
password password
```
Drupalでよく使うDrushコマンド一覧

# Drush コマンド一覧

### 設定ファイルエクスポート

```bash
vendor/bin/drush config:export
```

### 設定ファイルインポート

```bash
vendor/bin/drush config:import
```

### Drushコマンド一覧表示

```bash
vendor/bin/drush
```

Drush コマンドのリストが表示されるので、コマンド分からなくなったら利用

### キャッシュクリア

```bash
vendor/bin/drush cr
```

### 翻訳ファイルの更新があるかチェック

```bash
vendor/bin/drush locale:check
```

### 翻訳ファイルの更新

```bash
vendor/bin/drush locale:update
```

### 翻訳ファイルのインポート

```bash
vendor/bin/drush locale:import
```

### モジュール有効化コマンド

```bash
vendor/bin/drush en {モジュール名} 
```

### モジュールアンインストールコマンド

```bash
vendor/bin/drush pmu {モジュール名}  
```

### モジュール一覧表示コマンド

```bash
vendor/bin/drush pml 
```

### ユーザーのパスワード変更

```bash
vendor/bin/drush upwd
```

初期インストール直後などに利用

### DBアップデートコマンド

```bash
vendor/bin/drush updb
```

あまり使わないですが、アップデート作業時に利用するDBアップデートコマンド

### コーディング規約のチェック

```bash
php vendor/bin/phpcs --standard=Drupal --extensions=module,php [ファイルパス]
```
【Python】妻に真夜中のダンスレッスン予約を強要されたので、Webスクレイピングで回避を試みようとしている話 （３．Chromeドライバを配置せよ）

前回は、<a href="https://qiita.com/sibulabo/items/8b2a591f4574815b0ee0">「２．python仮想環境構築」</a>について発信しました。

今回は、Webスクレイピングを使用するうえで必要な chromeドライバの配置に挑戦します。
使用するブラウザは Google Chromeですが、ブラウザ上でのログインやボタンクリックなどの操作は、このChromeドライバーを介して行われます。配置するドライバーは、使用しているGoogle Chromeのバージョンに合ったものを取ってくる必要があるようです。つまり、Google Chromeがバージョンアップされるたびに、新しいchromeドライバーが必要になるということです。ちょっと面倒くさいですね。
# Google Chromeのバージョンを確認する。
Google Chromeを起動し、「右上の３点リーダー＞ヘルプ＞Google Chromeについて」を順に選び、Google Chromeのバージョンを確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/5ef1d7e7-40f7-14e5-a835-4ad1f8ba82db.jpeg" width=80%>

私の環境では、Google Chromeのバージョンが **<font color="red">106</font>.0.5249.119** だと確認できました。

# メジャーバージョン番号（ここでは<font color="red">106</font>）が一致する chromedriverをダウンロードします。
<a link href="https://chromedriver.chromium.org/downloads">Chromeドライバー</a>のサイトにいって、自分のGoogle Chromeのメジャーバージョン番号が一致するドライバーをダウンロードします。
![getChromeDriver.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/884606d6-b887-7897-c51e-aafc37aa54bc.jpeg)
自分の環境にあったファイルのリンクをクリックします。私の場合は Windowsなので、末尾 _win32 のファイルをダウンロードしました。
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/2f297245-bcd7-3e74-c9a7-8d0fc32c46f9.jpeg)

ダウンロードしたドライバーは zip形式ですので、解凍して適当なフォルダに保存します。今回は、開発用のフォルダに保存しました。
```
C:\reserveList
│  chromedriver.exe
└─env
```
> 以上で、無事自分の環境にあったドライバーを配置できました。
> これで必要な環境は整いましたが、次回はどういう構成、処理フローになるのかを考えていきたいと思います。では、ご安全に！
巡回数（Cyclic number）を求める

### 巡回数とは
[巡回数(Wikipedia)](https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E6%95%B0)にあるように「2倍、3倍、4倍...と乗算したときに、その各桁の数を順序を崩さずに巡回させた数になる整数である。ダイヤル数ともいう」。**142857**はよく知られていますが、それ以降の求め方は見当たらなかったので今回調べてみました。（ただし**142857**以外の巡回数は先頭に$0$が付きます）

生成の方法に関しては[Cyclic Number (Wolfram MathWorld)](https://mathworld.wolfram.com/CyclicNumber.html)に記述がありました。

> Cyclic Numberは"full reptend primes"から生成される

とありその[Full Reptend Prime](https://mathworld.wolfram.com/FullReptendPrime.html)とは何かを見ると、

> 10が**原始根**になる素数pはFull Reptendである

とあります。これはどこかで聞いたなと思って調べてみると、自分の記事[【Project Euler】Problem 26: 循環小数](https://qiita.com/masa0599/items/f4a24477092534c29a56)で書いた、$1/p$が最長の循環小数になる条件と同じであることに気づきました。

### 巡回数の生成アルゴリズム

従って結論から言うと10が**原始根**になる素数pに対して以下の式で巡回数が求まります。

```math 
CyclicNumber = \frac{10^{p-1}-1}{p}
```

100以下の素数で生成すると以下のようになります。基本的には$1/p$の循環小数の循環節と同じなので$p=17$以降は先頭に$0$が付き、これを含めて巡回します。

```python 
from sympy.ntheory import is_primitive_root
from sympy import primerange

for p in primerange(7,10**2):
  if is_primitive_root(10, p):
    print(f"{p}:{(10**(p-1)-1)//p:0{p-1}}")
# 7:142857
# 17:0588235294117647
# 19:052631578947368421
# 23:0434782608695652173913
# 29:0344827586206896551724137931
# 47:0212765957446808510638297872340425531914893617
# 59:0169491525423728813559322033898305084745762711864406779661
# 61:016393442622950819672131147540983606557377049180327868852459
# 97:010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567
```

ただ$p-1$の桁数がどんどん増えてしまうのでちょっと面白味がなくなってしまいますが、少し視点を変えた例題を考えてみます。

### 【例題 1】下４桁が6789になるような最小の巡回数を生成する素数を求めよ

$10^4$で割った余りが6789ということなので、以下の式を満たす最小の$p$がその解です。巡回数その物を求める必要はありません

```math 
 \frac{10^{p-1}-1}{p} = \frac{-1}{p} = 6789 \pmod{10^4} \\
```

プログラムですが$p$が分母に来ているので**mod_inverse**を使います。

```python 
from sympy.ntheory import is_primitive_root
from sympy import primerange, mod_inverse

M = 10**4
for p in primerange(7,10**6):
  if is_primitive_root(10, p) and (mod_inverse(p,M)*(-1)%M) == 6789 : 
    print(p)
    break
# 49891
```

### 【例題 2】下４桁が6789になるような最小の巡回数の数字和（各桁の和）を求めよ

今度こそ巡回数$(49891-1)$桁すべてを求める必要があるように見えますが。実は巡回数の数字和にはある規則性があります。具体的に100以下の素数から生成された巡回数の数字和を求めて桁数$p-1$で割ってみると必ず$4.5$となり、その規則はそれ以降の巡回数にも適用されます。

```python 
def digitsum(n):
  return sum(map(int,str(n)))
for p in primerange(7,10**2):
  if is_primitive_root(10, p):
    cn = (10**(p-1)-1)//p
    ds = digitsum(cn)
    print(f"p={p:2}:digit sum={ds:3} / {ds/(p-1)} per digit")
# p= 7:digit sum= 27 / 4.5 per digit
# p=17:digit sum= 72 / 4.5 per digit
# p=19:digit sum= 81 / 4.5 per digit
# p=23:digit sum= 99 / 4.5 per digit
# p=29:digit sum=126 / 4.5 per digit
# p=47:digit sum=207 / 4.5 per digit
# p=59:digit sum=261 / 4.5 per digit
# p=61:digit sum=270 / 4.5 per digit
# p=97:digit sum=432 / 4.5 per digit
```

従って例題 2の以下のように電卓で答えを出すことが出来ました。

```math
(49891-1)*4.5 = 224505
```

（開発環境：Google Colab）

この記事はProject Euler: Problem 358 Cyclic numbersを解くのに役に立ちます。
Google UXデザイン：アクセシビリティを考慮する

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3729adea-8dba-b2a3-6127-9b0bf6886e54.png" width="800">

# アクセシビリティとは

***<font color="MediumVioletRed">『障害のある人のために製品、デバイス、サービス、環境を設計すること』</font>***　


アクセシビリティのための設計とは、すべてのユーザーの旅を考慮し、恒常的な障害、一時的な障害、あるいは状況的な障害を念頭に置くことです。障害者があなたの製品をどのように使用しているかを調査することによって、障害者のための設計をより良く理解することができます。

# 考慮すべき点

ここでは、デザインプロセスの共感フェーズにおいて、ユーザリサーチする際に考慮すべき点をいくつか紹介します。　

### Touch

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/604ba1b8-1eaa-d143-4393-31eaa757393d.png" width="600">

***_片腕が不自由なユーザーのために、どのようなデザインをすればよいでしょうか？_***

- 手の大きさを考慮して、ボタンを配置する場所を決める。
- 誤ってアイコンをクリックしないように、ダブルタップができるような機能を作る。
- 片手キーボード機能と一般的なキーボードの互換性を有効にする。
- ユーザーが最も重要だと思う情報に簡単にアクセスできるように、ボタンのカスタマイズを可能にする。

### See

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/df3da674-9492-ba3c-48af-8c5f100730f9.png" width="600">

***_永久的、一時的、または状況的に視力が制限されているユーザーのために、どのようにデザインしますか？_***

- アプリを読みやすいデザインにするために、大きめのフォントを使用する。
- アプリと画像に、スクリーンリーダーで読める代替テキストがあることを確認する。
- ユーザーが自動車を運転しているかどうかを検出する。
- コントラストの高い色でアプリをデザインする。
- ナビゲーションや次のステップの説明をテキストの色に依存しないようにする。

### Hear

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/00518f7a-e798-5c8f-dd3c-4e6bb7c1c136.png" width="600">

***_聴覚に障害があるユーザーのために、どのような設計をすればよいでしょうか?_***

- 新着メッセージの通知など、アプリの更新を音だけに頼らないようにする。代わりに、触覚に働きかける振動であるハプティクスや、通知ランプを有効にする。
- すべての動画にクローズドキャプションを適用する。
- アプリ内にテキストメッセージシステムを設け、ユーザーが文字でコミュニケーションできるようにする。

### Speak

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c40ddaec-cc7b-c207-301a-bb7a34a85c75.png" width="600">

***_永久に、一時的に、あるいは状況に応じて、話すことができないユーザーのために、どのようにデザインしますか？_***

- ビデオベースのコンテンツに加え、イントロダクション、説明、ユーザーへの指示などを文書で提供する。
- ユーザーとの電話やアプリのサポート中に、リアルタイムでテキストを送れるようにする。
- 音声認識に依存する自動化システムの代替手段を用意する。
- 絵文字や画像のアップロードが可能なアプリ内メッセージングシステムを提供する。

# アクセシビリティ技術

あらゆる能力を考慮した製品設計を行うことは、非常に難しいことです。しかし、そのギャップを埋めるためのサービスやアプリが存在します。

例えば、
- リアルタイムテキスト
- 代替テキスト

このような障害者が使用する可能性のあるアクセシビリティ技術に慣れ親しみ、彼らの経験について彼らと会話することが重要です。

あなたの周りの世界に対して共感的にデザインする最善の方法は、ユーザーと関わり、あなたのデザインが彼らの成功にどのように役立つかについて彼らに質問することです。
R4秋データベーススペシャリスト試験所感

先週の10/9(日)にデータベーススペシャリスト試験を受けてきました。
まだ記憶が新しいうちに、所感を書いておきます。

## 会場
とある専門学校でした。
会場は土足不可で、上履きが必要でした。
私は使い捨てのスリッパを持参しました。周りもスリッパが多かったです。
忘れた人もちらほらいましたが、私の会場ではビニール袋みたいなものが支給されてを靴につけていました。
これ、受験票に記載してあるので要注意です。

## 午前1試験
免除だったので優雅に午前2試験から参加しました。

## 午前2試験
### 所感
例年通り過去問からの出題が多く、安心して解けました。

瞬殺で解ける問題を先に解いて、残った問題を時間かけて解く方式で臨みました。
ビッグデータ関連の用語がよく聞かれていました。

### 自己採点
当日の夜にIPA公式から解答が出たので採点したところ、無事合格点は取れていました！

## 昼休み
短いんですよねえ・・
眠くならないように軽く食べました。
少し仮眠をとって午後試験のための集中力を回復させました。

## 午後1試験
こっからが鬼門。過去問演習で相性のよさそうな問1の概念設計と問3のSQLを解こうと決めていましたが
問2の方がSQL多めで問3は難しそうだったので問1と問2を選択しました。
大問1つあたり45分と決めて、設問ごとに目安の時間配分をしてから解きました。（この作戦は、かなり良かったです！）
午後1で諦めたのか、数名帰宅していました・・

### 問1所感
例年よりも難しく感じました。

まず、答案用紙を配られてER図を見てぞっとしました。略語多すぎるよ！！
BPとかEUとかCEとか・・
問題を見るまでEUはヨーロッパ連合か？規模でかすぎ・・と思ってましたｗ（エンドユーザーの略でしたｗ）

例年通り問題文を読んでいって概念データモデルと関係スキーマを埋めていこう・・と思ったが概念データモデルも関係スキーマも前半はほとんど埋まってて焦りました。。
スーパタイプ、サブタイプの字下げもないし・・

設問2は最初何が何だか分からず焦りましたが、連関エンティティじゃね？とひらめき対処できました。
全体的にあまり自信はありませんでしたが、時間も押してしまいそうだったので切り替えて次の大問に移りました。

### 問1自己採点
TAC、iTECの解答速報をもとに採点したところ、7~8割は取れてそうでした！
「役割の数だけリレーションシップを表す線を引く」という表記を完全に見落としていて、線引きはいくつか落としましたｗ

### 問2所感
こちらは問1よりも解きやすかった気がします。そこそこ自信をもって解答できました。

トリガーの問題が出ました。H31の問2にも出てましたね。さらっと目を通しただけだったのが悔やまれる・・
SQL文も問題文をよく読めば穴埋めも埋められましたし、最後の計算問題も複雑でなかったので難なく解けました。

### 問2自己採点
TAC、iTECの解答速報をもとに採点したところ、6~7割は取れてそうでした！
トリガーのサービス問題があったのですが文章の読み落としで逃してしまいました・・
自信ない問1の方が得点できているの草。

## 午後2試験
午後1に不安がありましたが切り替えて臨みました。
過去問演習で相性がよさそうな問2の概念設計を選択しました。

### 問2所感
例年よりも難しく感じました。

午後1の問1と同じく、概念データモデルと関係スキーマがかなり埋まった状態でした。。
前半はどんなに読んでも答案用紙にかけることがなくて、焦りました。
リレーションシップもどこに引けばいいかよく分からず、あまり自信をもって引くことができませんでした。。
設問2以降はとりあえず解答できましたが、あまり自信がありません。

概念データモデルと関係スキーマをひたすら埋める問題だと思ったのに・・
と゛お゛し゛て゛た゛よ゛お゛お゛お゛！
問1を勉強しておけば。。とも思いました。

最後の方はもうダメだ・・と心が折れそうになりましたが、
三好先生の「最後の1分まで諦めない」的な言葉を思い出して、なんとか制限時間ギリギリまで解きました。


### 問2自己採点
概念データモデルと関係スキーマはボロボロでした・・
それ以外はそこそこ当たってそう。

iTECの解答速報をもとに採点したところ、4~5割くらいでした・・終わった・・
ですがTACの解答速報をもとに採点したところ、6割程度取れてそうでした。
よく見ると、iTECとTACで解答がかなり違いました。~~TACが当たっていてくれ~~

ネットワークスペシャリスト試験の時も得点調整で予想点数よりも7点高かったので、下駄を信じます。
頼む～～ギリギリでいいから受かっていてくれ～～
私の1か月の勉強期間を無駄にしたくない！（そもそも勉強期間短いｗ）

## さいごに
まあ午後2で落ちてそうですが、データベースのお勉強ができてよかったです。
仕事でデータベースを絶賛扱い中なので、仕事にも活きてきそうです。

合格発表は12/22(木)正午予定です。長すぎｗｗｗ心臓に悪いので早く発表してほしいです。
余談ですが、合格発表の時に成績照会を見るか合格した受験番号を見るか悩みますよね。私は前者派です。
【Swift】プロトコルを拡張して実装を任意化する

# 通常
```swift
import UIKit

class ViewController: UIViewController, SampleDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
    }
    func sample() {
        print("サンプル")
    }
}

protocol SampleDelegate {
    func sample()
}
```
`sample()`を実装しないと下の画像のようにXcodeに怒られます
![スクリーンショット 2022-10-16 18.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/31381ebc-6278-3057-e43b-c52970ab2757.png)

# デフォルト実装
```swift
import UIKit

class ViewController: UIViewController, SampleDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
    }
}

protocol SampleDelegate {
    func sample()
}

extension SampleDelegate {
    func sample() {}
}
```
`extension`で実装しておく事によってプロトコルを準拠させても任意で実装することができます。
![スクリーンショット 2022-10-16 18.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/62192fd8-95ec-3cb7-3e4a-c8bfd0f0e3f1.png)

# おまけ
こんなこともできるみたいです。
あんまり理解してないです笑
なんとなく分かったら別で記事に書こうと思います。
```swift
import UIKit

class ViewController: UIViewController, SampleDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
    }
}

@objc protocol SampleDelegate {
    @objc optional func sample()
}
```
![スクリーンショット 2022-10-16 18.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/51100b3d-2d0c-a22b-87ae-023e222909c3.png)

# おわり
プロトコル使いこなしてゴリゴリ使っていきたいです
プログラミングを始める時におすすめの無料サイト

プログラミングを勉強する人が最近増えています。
今の時代、フリーランスのシステムエンジニアが人気だからですね。収入を上げるため、フリーランス化する人が多いです。

そのため、プログラミングスクールが最近流行っています。
が、プログラミングを始める時は、独学でも良いのでまずやってみることを推奨します。
というのも、**「プログラミングは自分で調べて身に付けることが重要だから」** です。

実際、システムエンジニアの業務の中では、”自分で調べて解決する”能力が求められます。
分からないエラーと出会った時に、解決できる力がある人とない人では全然違います。
望むなら、解決できる力を身に付けておきたいですよね。独学はその練習です。

そんなわけで今回は、プログラミングを始める人・始めたい人におすすめの無料サイトを紹介します。
無料でもある程度のところまでは勉強できますし、そこから就職・転職・フリーランスも全然アリです。

## プログラミングが勉強できるオススメの無料サイト

### ドットインストール

3分間の動画で勉強できる無料サービスです。
**全然無料の動画を見ているだけでも、プログラミングの基礎・基本を勉強できます。**

https://dotinstall.com/

実際、私もHTMLとCSSを始め、Java、PHP、MySQL、JavaScript、wordpress、CakePHPなどなどは、ドットインストールで勉強しました。
自分のパソコンの中だけでサイト制作まで勉強できるので、このサイトである程度まで勉強できるようになるといいですね。

この先は、自分でサーバーを契約して実際に公開できるサイトを作成するのもいいですね。
サーバーは、さくらかXサーバーが使いやすいです。

### Progate（プロゲート）

こちらでもHTMLを始め、PHPやJavaScriptなどを勉強できます。
一回では覚えられないと思うので、何回もやってみるといいですね。

クイズ感覚で進められるので、プログラミングの難しさを感じにくくて良いですね。

https://prog-8.com/

### さいごに

どちらのサイトも良いサイトです。
あとは、毎日コツコツと勉強あるのみ。

**「継続は力なり」という言葉があるように、毎日少しでもいいから続けていくとプログラミングができるようになりますよ。**
Max8日記【print / message / comment】

初めまして、
しばらく放っておいたMax8を触っていきます。

Max8を起動　>　help　>　reference　>　docs　>　tutorialでチュートリアルを見てみる。

## Tutorial1: Hello
open tutorialを開くと、こんなサンプルpatcherが表示されます。
![スクリーンショット 2022-10-16 16.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2165178/3b887510-5666-0e51-ba74-036109efe47e.png)

### ①
左上の、message boxはクリックするとprint objectにメッセージが送られるもの。
print objectはそのオブジェクトに入ってきた？値をMax Consoleに追加、表示するものみたいです。
例えば、各メッセージボックスをクリックするとMax Console（右側）でこのように確認できます↓
![スクリーンショット 2022-10-16 17.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2165178/ff1feddf-30ea-0f9f-7da5-e712a4560868.png)
Good morning, everybody!ではカンマで改行されるみたいです。
カンマの手前にバックスラッシュを入れるとカンマが無効化？されてます。
ちなみに下の✖︎を押すと、履歴が消去されます。

### ②
次に、真下のプログラムでは上にNumbersボックスが２つあります。
その下には３つのメッセージボックスがあります。「prepend」 「set」「 append」。
さらにその下には枠は見えませんがコメントボックスがあります。
これは、prependを押すと設定している数値を先頭に表示、setを押すと初期化、appendを押すと末尾に設定している数値を表示するプログラムです。
＄の意味はよく分かりません。

### ③
右側では各ボックスの説明があります。
上から、printオブジェクト、メッセージボックス、コメントボックス。
コメントボックスは表示位置を調整できるみたいです。
左側のInspectorを開いてTextJustificationから位置を変更できます。
画像ではcenterになっています。
ちなみに上部、bubbleチェックボックスにチェックを入れると、吹き出しで表示される。
![スクリーンショット 2022-10-16 18.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2165178/3d673dab-1758-2f1a-514f-1286d21c1d40.png)

## まとめる
・print オブジェクトは、インレットで受け取ったメッセージを受け取り、それを Max コンソールに表示します。
・パッチコードはボックスやオブジェクトを繋ぐケーブルのようなもの。
・パッチとは、背景がグレーの画面の事？（作業台のようなもの？）
・メッセージボックスにはテキストを入力/クリックできる。printオブジェを使ってConsoleに表示するか、コメントボックスにテキストを表示することができる。
・パッチ画面はロックすることができる。ロック中は作成したプログラムを検証でき、会場中は編集ができる。
・右クリックでhelpやreferenceを見て学ぶと良いみたい
「数学は、民法だ！」は見つかりませんでした。

(私は、専門家ではありません。以下、正確な事は周りの人に聞いて下さい。)
このページに、ソースコードは、ありません。


https://www.google.com/search?q=%E6%95%B0%E5%AD%A6+%E6%B0%91%E6%B3%95&rlz=1C1CHBD_jaJP908JP908&oq=%E6%95%B0%E5%AD%A6+%E6%B0%91%E6%B3%95&aqs=chrome..69i57j0i8i30.1144j0j7&sourceid=chrome&ie=UTF-8

結果:
「民法は数学だ！」
「法学は数学＞（法律要件）と（法律効果）」
「刑法では数学、特に証明問題を解くような論理構成力が求められます。数学で「三段論法」という証明の手法を学びますが、刑法の問題を解くには三段では済まない複雑な論述が必要になる場合もあります。...数学が得意な人は...
」

https://www.potato.ne.jp/shirakaba/hkeizai/136.html

等

# 宅建

毎年10月の第三日曜は、宅建の試験日です。情報処理の試験日でもあります。


**大学入試受験生の方へ(理系の人も)。**
それどころじゃないと思いますが、志望校に合格されたら、民法？専門、教養、独学？頭の片隅にでも。
**大学入試受験生じゃない方（特に小中学生の方）へ。**
いらない人には、宅建は不要な資格です。
①権利関係。一度は「権利関係」の過去問を見て下さい。たくさんあって複雑です。
②民法をわかったふりができます。資格試験に、法律がない試験はないと思います。

https://www.retio.or.jp/exam/exam_detail.html

宅建は3部門に分かれます。LEC様の問題集参考より。
①権利関係(民法?）対抗要件という言葉もあります。
②宅建業法(業者が素人をだまさないための縛りです。プロからアマチュア保護です。)
③法令上の制限・税・その他(国が、民間に勝手なことをされない縛りです。）

小中学校の学習指導要領に、民法がないのかな？クラブ活動に民法がないのかな？
宅建の最年少合格者は12歳。宅建の最高年齢合格者は90歳。
宅建速報？最新予想?生の声？もすごいですね。
今週は, 宅建解答解説動画です？おやすみなさい。

私が、言いたいのは「要件と効果」？です。

# 参考
,

https://www.agaroot.jp/takken/column/composition/

https://qiita.com/kaizen_nagoya/items/4e0eb6e5d30c0237469d



# 条文検索
実行例）
最近よく「不法行為」という言葉を耳にするので,条文を調べてみました。(2022.10.23 )
「e-govの条文検索」(xml?)と「判例検索の条文検索」(最高裁判例)は,ダイレクトリンク？できませんでした。わかられる方へ。教えて下さい。

（不法行為による損害賠償）

https://ja.m.wikibooks.org/wiki/%E6%B0%91%E6%B3%95%E7%AC%AC709%E6%9D%A1

(xml?)

https://elaws.e-gov.go.jp/document?lawid=129AC0000000089

民法　不法行為　< 全文検索
289件中1～10件を表示

https://www.courts.go.jp/app/hanrei_jp/list2?filter%5Btext1%5D=%E6%B0%91%E6%B3%95&filter%5Btext2%5D=&filter%5Btext3%5D=&filter%5Btext4%5D=%E4%B8%8D%E6%B3%95%E8%A1%8C%E7%82%BA&filter%5Btext5%5D=&filter%5Btext6%5D=&filter%5Btext7%5D=&filter%5Btext8%5D=&filter%5Btext9%5D=&action_search=%E6%A4%9C%E7%B4%A2&filter%5BjudgeGengoFrom%5D=&filter%5BjudgeYearFrom%5D=&filter%5BjudgeMonthFrom%5D=&filter%5BjudgeDayFrom%5D=&filter%5BjudgeGengoTo%5D=&filter%5BjudgeYearTo%5D=&filter%5BjudgeMonthTo%5D=&filter%5BjudgeDayTo%5D=&filter%5BjikenGengo%5D=&filter%5BjikenYear%5D=&filter%5BjikenCode%5D=&filter%5BjikenNumber%5D=&filter%5BreportV1%5D=&filter%5BreportI1%5D=&filter%5BreportP1%5D=&filter%5BreportI2%5D=&filter%5BreportP2%5D=&filter%5BjikenName%5D=&filter%5BgenshinCourtName%5D=&filter%5BgenshinCourtType%5D=&filter%5BgenshinBranchName%5D=&filter%5BgenshinJudgeGengoFrom%5D=&filter%5BgenshinJudgeYearFrom%5D=&filter%5BgenshinJudgeMonthFrom%5D=&filter%5BgenshinJudgeDayFrom%5D=&filter%5BgenshinJudgeGengoTo%5D=&filter%5BgenshinJudgeYearTo%5D=&filter%5BgenshinJudgeMonthTo%5D=&filter%5BgenshinJudgeDayTo%5D=&filter%5Breference%5D=
Raspberry Pi HQ camera でライブストリーミングする時にはまった点

# 概要
ライブストリーミング環境を Camera V2.1 から HQ camera V1.0 に変えたら
ffmpeg でエラーが出るようになったので
GPUメモリの量を増やした。

# 使用機材

機材:Raspberry Pi 4, 4GB Model
Camera:HQ camera V1.0
ffmpeg:4.1.9

# ライブストリーミング環境構築について
こちらのものをほぼそのまま使用していた。
https://rikoubou.hatenablog.com/entry/2020/09/30/153912

# 症状
Camera V2.1 では上記の環境そのままで問題ない。
しかし、カメラを HQ camera V1.0　に変更すると以下のエラーが出るようになる。
```
[video4linux2,v4l2 @ 0x11fa2d0] ioctl(VIDIOC_STREAMON): Operation not permitted
/dev/video0: Operation not permitted
```
調べているとGPUメモリを増加させる手段が取られている記事を見かけた。

# GPUメモリ量の増加
該当記事では、/boot/config.txt を書き換えているが、
同じ内容はrasp-configで出来るのでraspi-configで行う。
```
> sudo raspi-config
```
4 Performance Options
P2 GPU Memory
128(default)を256に変更
OK → Finish → reboot(yes)
機械学習の機能付き次世代型RDBMS「HottyDB」の紹介

**HottyDB** という検索エンジンとレコメンドエンジンの機能を搭載したOLTP型RDBMSを開発し、α版を公開しました！
HottyDBには機械学習ランキング（ランキング学習）という検索結果の並び順を機械学習で最適化する機能もついています（クリックされやすいものを上の方に出す）！


https://www.hottydb.com/


ので、この記事では**HottyDB**の概要と導入事例について紹介したいと思います！

# 概要
## HottyDBとは？
![facebook_cover_photo_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30697/cf5ff97d-5452-224e-719c-282d99d3f6ae.png)

HottyDBとは、検索エンジンとレコメンドエンジンの機能を搭載したRDBMS（リレーショナルデータベース）です。 
SQLを用いた通常のデータ操作に加え、文書の全文検索や検索結果の**機械学習**ランキング（MLR）・アイテムレコメンデーションのロジックなどを全て1つのソフトウェアで担います。
 1つのソフトウェアでこれらを実現することで、面倒なデータ伝送システムの構築を一切不要にし、利用者は機械学習などの知識がなくてもSQL LIKEな命令だけでこれらを実現することができます。



## 3つの機能が同じソフトウェアになることで何が嬉しいか？
![hottydb-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30697/0b8aaa45-74a3-701c-2630-a99749a42754.png)



### 従来の機械学習システムの場合
検索エンジンなどを利用して、機械学習ランキングを実現するシステムを作成しようとすると、従来の機械学習システムでは最低でも下記の様なシステム構成になると思います。
![](https://www.hottydb.com/conventional.svg)
また、ストレージ自体には、データ伝送機能がないことが多いので、ストレージ間のデータ伝送には別途サーバーやアプリケーションが必要になります。
アイテムレコメンデーションを実現しようとすると、ここから更に追加のデータ伝送システムが必要となります。

### HottyDBで機械学習システムを実現する場合
HottyDBを利用したシステム構成例がこちらです。
![hottydb-ml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30697/4e646684-ceae-6c92-8764-8e10e28b736e.png)

このように、HottyDBを利用するとシステム構成がとてもシンプルになります！
各種データ伝送システムは一切不要となり、難しい機械学習のロジックも裏でHottyDBが自動的に学習・推論してくれるので、利用者はSQL LIKEな命令だけで全ての機能を利用することができます。

# 導入事例

## HottyTech検索
![tech-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30697/e423f0b9-60c9-92cf-4a04-437236b053d2.png)


### HottyTech検索とは？
「[HottyTech検索](https://tech.hottydb.com/)」は、Qiita記事の検索とレコメンデーションのサービスです。
Qiita記事のキーワード検索、関連記事レコメンデーションなどの機能をHottyDBにより実現しています。

https://tech.hottydb.com/

現状はQiitaのAPIで取得できた記事に限られますが、その記事の中から興味のある記事を検索することができるサービスです。



### 主な機能
「HottyTech検索」の主な機能は次の4つです。

1. キーワード検索機能（全文検索＋**機械学習**ランキング）
2. 関連記事レコメンデーション機能（協調フィルタリング）
3. 関連記事レコメンデーション機能（類似記事検索）
4. 「あなたにおすすめの記事」機能


### HottyTech検索の作り方
下記の記事でHottyDBを使ってHottyTech検索を作る方法を解説していますので、こちらも見てみてください。

https://qiita.com/toru1055/items/e7239c00f7c9ee96ed3f

# さいごに
HottyDBはまだまだα版で改善点が山のようにありますが、ぜひみなさまのフィードバックを経てより良いソフトウェアにしていきたいと思っています。

「HottyTech検索」や「HottyDB」に関するお問い合わせ・フィードバックなどありましたら[Twitter（@hottydb）](https://twitter.com/hottydb)や[こちらの連絡先](https://www.hottydb.com/other/contact/)までご連絡いただければと思います。
Webアプリケーションの攻撃方法【DoS攻撃】

# はじめに
Webアプリケーションに対しての攻撃方法を勉強している中で、最近ロシア関連の報道で話題になっていたDoS攻撃についてまとめてみました。
## DoS攻撃、DDoS攻撃
## DoS攻撃
まずDoS攻撃とはWebサービスを稼働しているサーバーに対して大量のリクエストや大容量のデータを送るなどしてサーバーに負荷をかけサービスの運用を妨げる攻撃になります。
代表的な手法に、ページの更新を行う’F5’キーを連打して何度もリクエストを送る「F5アタック」があります。
## DDoS攻撃
DDoS攻撃はDoS攻撃の発展型の攻撃手法で、大量のマシンからサービスに対し大量のリクエストを送ってサーバーに負荷をかける攻撃になります。
攻撃者が大量のマシンを不正な手段で乗っ取り、それらマシンを協調させて一斉に攻撃を開始する手法を協調分散型DoS攻撃といい、攻撃者が攻撃対象のマシンから大量のマシンに対してリクエストを送り、送られた大量のマシンからのレスポンスで攻撃対象に負荷をかける手法をDRDos攻撃といいます。
## DoS攻撃への対策
<dl>
<dt>同一IPからのアクセスに制限をかける</dt>
<dd>同一IPから短時間で大量のアクセスを防ぐことで、サーバーへ負荷がかかりすぎないよう一定の制限をかけます。</dd>
<dt>特定国からのアクセスを制限する</dt>
<dd>DDoS攻撃は世界中にある脆弱なマシンが乗っ取られて行われます。そのため、国内向けのサイトであれば国内限定のアクセス許可にするだけでも一定程度の効果が期待できます。</dd>
<dt>DDoS攻撃対策ツールを使用する</dt>
<dd>DDoS攻撃に対して防衛を行うツールがあるため、それらを利用するのが効果的です。代表的なツールにWAFが挙げられます。</dd>
</ul>

## 終わりに
昔、2ちゃんねるでROMっている頃によくF5アタックは目にしており、こんなの防ぎようがないと思っていましたが、ちゃんと調べていると思いの外対策方法が確立されており、科学の力ってすげーと思いながら学習できました。
初学者なので間違ってる点などあればご指摘いただけるとありがたいです！
AWS CLIでIAMユーザーのMFAを設定してみる

AWSコンソールにログインせずIAMユーザーのMFAを設定しました。

# 前提
- AWS CLIが使えるIAMユーザー（MFAは未設定）を作成済みであること

# IAMユーザーのMFAを設定

### 設定前の状態
MFAデバイスの割り当てなし
![スクリーンショット 2022-10-15 14.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2305599/67a3ef3f-1043-84ee-6470-926394e0a968.png)

### 仮想MFAデバイスを作成
```
$ aws iam create-virtual-mfa-device \
    --virtual-mfa-device-name sample-user \
    --bootstrap-method QRCodePNG \
    --outfile ＄HOME/sample-user.png

{
    "VirtualMFADevice": {
        "SerialNumber": "arn:aws:iam::123456789012:mfa/sample-user"
    }
}
```
- オプションは以下を指定しています。
    - --virtual-mfa-device-name：MFAデバイス名を指定する（今回はIAMユーザー名）
    - --bootstrap-method：仮想MFAを作るための方式（今回はQRCodePNG）
    - --outfile：ファイル出力先を指定する（今回はホームディレクトリ）

### 出力されたQRコードを開いて、２段階認証アプリで読み込み

![sample-user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2305599/602436de-117c-e4ae-dc57-f900bff4ee42.png)

![スクリーンショット 2022-10-16 16.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2305599/b0b704eb-b783-16ad-cdf9-2c7acf5c0bcd.png)

### MFAデバイスを有効化

```
$ aws iam enable-mfa-device \
    --user-name sample-user \
    --serial-number arn:aws:iam::123456789012:mfa/sample-user \
    --authentication-code1 123456 \
    --authentication-code2 789012
```
- オプションは以下を指定しています。
    - --user-name：IAMユーザ名
    - --serial-number：仮想MFAのシリアルナンバー（仮想MFAデバイスを作成時に返却された値）
    - --authentication-code1：2段階認証アプリのコード１つ目
    - --authentication-code2：2段階認証アプリのコード２つ目

### 設定後の状態
MFAデバイスの割り当てあり
![スクリーンショット 2022-10-16 16.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2305599/f84e58f0-d666-925d-fdc7-9d9e996902b4.png)

# AWS CLIでMFAを使ってみる

### セッショントークンを取得

```
$ aws sts get-session-token \
    --serial-number arn:aws:iam::123456789012:mfa/sample-user \
    --token-code 123456

{
    "Credentials": {
        "AccessKeyId": "XXXXXXXXXX",
        "SecretAccessKey": "XXXXXXXXXX",
        "SessionToken": "XXXXXXXXXXXXXXXXXXXX",
        "Expiration": "2022-10-16T19:56:07+00:00"
    }
}
```
- オプションは以下を指定しています。
    - --serial-number：仮想MFAのシリアルナンバー
    - --token-code：2段階認証アプリのコード

### セッショントークンを設定

取得したセッショントークンを設定
```
$ export AWS_ACCESS_KEY_ID=XXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXX
$ export AWS_SESSION_TOKEN=XXXXXXXXXXXXXXXXXXXX
```

### AWS CLI を使ってみる
（事前にS3の参照権限を付けています）
```
$ aws s3 ls

2022-10-02 22:41:43 XXXXXXXXXX
2021-11-20 16:28:40 XXXXXXXXXX
```

### セッショントークンを破棄

```
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
```

# 参考
- AWS CLI IAMのマニュアル
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/
- classmethodさんの「AWS CLIでIAMユーザーにMFA（多要素認証）を設定する」
    - https://dev.classmethod.jp/articles/configure-multi-factor-authentication-for-iam-users-using-the-aws-cli/
Rustの勉強がてらコマンドを記録してくれるコマンドラインツールを作成した

# はじめに
タイトル通りです。
Rustの勉強中です。新たなプログラミング言語を学習する際、何を作りながら学習していく方法が効率が良いと考えています。
今回そのテーマとして、コマンドを記録してくれるツール「regcmd」を作りました。

先にGitHubのリンクを張っておきます。
[regcmd](https://github.com/yukimuraaa/regcmd)

# 何をするものか
そのものずばりです。
指定したコマンドを記録し、管理するものです。

Linuxだと「↑」「↓」やhistoryコマンド、Ctrl+Rでの検索によって過去のコマンドを確認することができます。
しかし、直近入力したコマンドでない場合や、複雑なコマンド、頻繁に使用するコマンドにはあまり効果が発揮できません（個人の感想です）。
このツールではホームディレクトリ直下に管理用のファイルを用意してそこにコマンドを記録していきます。

エイリアスは短いコマンドや頻繁に使用するコマンドでは有利ですが、シェルを作成する必要がある場合、シェルファイルの管理が煩雑になる場合があります。
regcmdに集約することで、管理コストを削減することができます。　　

# 機能
現状は最低限の機能である登録、一覧、削除の3つのみ実装しました。

## 登録
registerサブコマンドで登録できます。

### 対話的に登録する場合
```
$ regcmd register
name: ll
command: ls -al
description: show file list
registered ll
```

ls -alをllという名前で登録しています。

### オプションをつけて登録する場合
```
$ regcmd register -n root_du -c "du -h -d 1 /"
description(option):
registered root_du
```

/フォルダに対してduコマンドを1階層のみ表示するコマンドをroot_duという名前で登録しています。

同名で登録しようとする場合は上書き確認を行うようにしています。
登録している名前でコマンドを実行できるわけではないので注意です（今後拡張していく予定）。

## 一覧表示
listサブコマンドで登録しているコマンドの一覧が表示されます。
```
$ regcmd list
No    | name       | command              | description                   
0     | ll         | ls -al               | show file list                
1     | root_du    | du -h -d 1 /         | 
```

## 削除
deleteサブコマンドで削除できます。
```
$ regcmd delete ll
delete ll
```

# 技術的な話
## コマンドラインのIF
CLのIFを作る際に使ったクレートは[clap](https://crates.io/crates/clap)です。
これはコマンドラインの引数解析をしてくれるものです。
シンプルだったので使いやすく、やりたいこともすぐに実現できました。

## ファイル書き込み／読み取り
コマンドを管理するファイル（.command）の中身はJSONです。
JSONをシリアライズ／デシリアライズするために[serde](https://crates.io/crates/serde)クレートを使いました。
こちらも特にクセはなく簡単に使うことができました。

## エラー処理
エラー処理（管理）は[anyhow](https://crates.io/crates/anyhow)クレートを使いました。
エラー処理はこれがデファクトスタンダードなイメージです。

## ファイルロック
今回一番苦労したのはここです。
コマンドを管理するファイルに書き込んでいる間に、別プロセスから読み込みされるとエラーになってしまいました。
処理自体は数十～百数十msecほどで終わるので、書き込みと読み込みが被ることはほぼないと思うのですが、対応したかったです。

これはflockを実現してくれるクレートになります。
ので、ロックを占有されている間は待機する動きが実現できました。

# 今後の話
まだまだ勉強不足なのと、作っていくうちに拡張したい点が出てきたので引き続き開発していきます。
拡張点としては、以下で、ここまで出来れば実際の仕事でも使えるかなという感覚です。
* コマンドのクリップボードへのコピー機能
* 環境切り替え機能
現在はホームディレクトリ直下にグローバルで管理しているような形なので、ワークスペースで管理できるように
* コマンドの実行機能
* コマンド登録＋実行時の引数指定


現状の段階でも使ってみて、感想をもらえると嬉しいです。
初めてのコンペ(Nishika)に参加した感想

今回は初めてのデータサイエンスのコンペとして、Nishika会社様が運営、株式会社オモロキ様(bokete)がホストをつとめるコンペに参加しました。

## 目次
+ コンペの概要
+ 今回の順位
+ 反省と感想

### ・始めにコンペを開催してくださった皆様ありがとうございました。大変貴重な経験になりました。

* ### コンペの概要
本コンペのボケて判定AIを作ろう！(ボケてコンペ ＃1)に参加しました。このコンペでは株式会社オモロキ様が運営するboketeから画像と文字(テキスト)の両方のデータから、AIが面白い(1)面白くない(0)を判定するのが今回の目的となります。
boketeとは↓のように写真と文章のボケで皆さんを笑わせます。:grin:
![説明1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683857/48bdcaa7-b2c8-9714-b335-54c1f5f6cd62.png)


* ### 今回の順位
![結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683857/dc99785a-dce2-6876-aeec-cfa69bfe9328.png)
初めてのコンペながらブロンズメダルを入手しました！とても嬉しいです:kissing_closed_eyes:

* ### 反省と感想
何もかもが初めてでしたが、google colaboratoryの凄さや使い方、コンペの流れを経験することが出来ました。

・私はAnacondaからpythonを使っていましたが、無料ですぐに使えるGPU入りのgoogle colaboratoryは大変便利なものだと実感しました。詳しい使い方も追々学んでいきたいです。
###### しかし、使いすぎた場合、制限で12時間から24時間GPUが利用出来なくなってしまうため注意が必要です。

・コンペでは、まずデータとサンプルコードを確認する所から始めました。データは訓練データだけでも約25000ありました。これを全て読まなければいけないのですが、正直なところ8000程で止めてしまいました...
データサイエンティストとして食べていくためには、この膨大な量のデータを確認し、パターンを見つけて課題を解決していくことが仕事なのだと身をもって体験しました。これからは全部読まないといけませんね。頑張ります！:punch:

・コードの中身では、画像とテキストの両方を用いたマルチモーダル分類モデルとしてMMBT(MultiModal BiTransformers)が使われており、BERTをベースとした画像とテキストのマルチモーダルディープラーニングです。画像にはResNet152を、テキスト側はBERTを用いてそれぞれベクトル変換し、両方をtokenとして連結したものに再度BERTに入力します。
しかし、私が初心者ということもありMMBTはおろかBERTとResNet152はG検定の勉強でどのようなものかという事だけしか分からず、どこをどう変えれば良いのかが分かりませんでした....本来はここがデータサイエンティストとして腕の見せ所の一つなのではないかと思いました。ここは日々の練習？で磨かれていくと思います。

・今回重点的に行ったことは、コードにある数値を変える事と前処理でのデータクレンジングを行いました。
　数値を変えたとはepoch(学習回数)、バッチサイズ、画像のサイズの値をちまちまと変えてました。ここで注意することは、Validation Lossの値の幅が大きくならないようにすることです。この値は過学習の有無が何となく分かります。
　データクレイジングではデータの中に改行(\n)や不必要だと思われる空白や句読点があります。それは私達人間にとっては要らないため除きました。しかし、データクレイジングでは機械(AI)と人間とではデータに対する見方が違う事を調べていく過程で分かりました。つまり人間にとって上の様に空白や句読点を除きましたが、これらが機械にとっては必要なものである可能性があるのです。こうなると何が機械にとって必要なのかが分かりません。だからそのサイトでは「機械の気持ちを考える」ことが大切だと書かれていました。難しいですね。

### これからについて
・Nishikaの方で新たなコンペ(ヘイトスピーチ)が開催されたので参加します。
・このままでは自分の腕が磨かれないため、自然言語処理100本ノック、データ分析100本ノックを勉強していきます。
・G検定(JDLA2022#2)を合格したので、機械学習の実装等が範囲となるE資格にも挑戦しようと考えています。
・Kaggleに挑戦したいので英語が理解出来るようになるために、TOEICの勉強もコンペと同時並行で行っていきます。

### 引用
・Nishikaボケて判定AIを作ろう！(ボケてコンペ ＃1)
https://www.nishika.com/competitions/33/summary
・bokete
https://bokete.jp/
・データクレンジング時に参考にしたサイト
https://zenn.dev/deepblackinc/books/ad568c611643c6/viewer/c37a9f
Java Gsonライブラリで簡単に DJI Drone の WaypointV2Mission データをJSONに変換

この記事ではJavaのGsonライブラリで簡単に DJI Drone の WaypointV2Mission データをJSONに変換できることを紹介します。

# 背景
DJI Droneの自動飛行には、DJI Droneに自動飛行ミッション情報をDJI WaypointV2Missionのウェイポイント情報（WaypointV2）と
アクション情報（WaypointV2Action）に設定してアップロード必要です。

DJIのウェイポイントアクション情報（WaypointV2Action）には、どのようなデータが入っているかを確認したいですが、
WaypointV2Actionの構造が複雑、中のメンバークラスの階層が一杯で簡単に設定情報を見えないです。

Javaで
DJIのウェイポイントアクション情報（WaypointV2Action）をwaypointV2Action.toString()関数で出力できますが、
メンバークラス等（WaypointReachPointTriggerParam）の中身が出力されていなかった。

```
WaypointV2Action{
  actionID=1, 
  trigger=WaypointTrigger{
    triggerType=REACH_POINT, 
    complexReachPointParam=null, 
    associateParam=null, 
    trajectoryParam=null, 
    reachPointParam=dji.common.mission.waypointv2.Action.WaypointReachPointTriggerParam@500513d, 
    simpleIntervalTriggerParam=null
  }, 
  actuator=WaypointActuator{
    actuatorType=AIRCRAFT_CONTROL,
    actuatorIndex=0, 
    subActuatorIndex=0,
    cameraActuatorParam=null,
    gimbalActuatorParam=null, 
    aircraftControlActuatorParam=dji.common.mission.waypointv2.Action.WaypointAircraftControlParam@c115d32,
    payloadActuatorParam=null,
    navigationActionParam=null,
    djiSYSActuatorParam=null
  }
}
```

# 解決方法
GoogleのJava Gsonは、JavaオブジェクトをJSON表現に変換するために使用できるJavaライブラリです。
これを使用して、DJIのウェイポイントアクション情報（WaypointV2Action）をJSON文字列に変換することができます。

# Gsonの使い方

Android アプリのappのbuild.gradleに設定
```
dependencies {
    implementation 'com.google.code.gson:gson:2.9.1'
}
```

ソースファイルでimport
```
import com.google.gson.Gson;
```

GsonでJavaオブジェクト　⇒　JSONに変換

メンバークラス等の中身がちゃんとJSONとして出力されます。
```
Gson gson = new Gson();
gson.toJson(waypointV2Action);
```

```json
{
	"actionID": 13,
	"actuator": {
		"actuatorIndex": 0,
		"actuatorType": "AIRCRAFT_CONTROL",
		"aircraftControlActuatorParam": {
			"aircraftControlType": "START_STOP_FLY",
			"flyControlParam": {
				"isStartFly": false
			}
		},
		"subActuatorIndex": 0
	},
	"trigger": {
		"reachPointParam": {
			"autoTerminateCount": 0,
			"startIndex": 2
		},
		"triggerType": "REACH_POINT"
	}
}
```
【Android】ListAdapterの基本テンプレート

# はじめに
RecyclerViewを使用したリスト形式のUIを実装するケース非常に多いですよね。
都度調べて実装しているとコストがかかるので、サッとコピペしてすぐ使えるテンプレートを残しておこうと思います。

# テンプレート内容
実装は以下です。

```TemplateListAdapter.kotlin
class TemplateListAdapter(
    private val viewLifecycleOwner: LifecycleOwner,
    private val onClickItem: (Unit) -> Unit
) : ListAdapter<Unit, TemplateListAdapter.TemplateListItemViewHolder>(ListCallback) {

    private object ListCallback : DiffUtil.ItemCallback<Unit>() {
        override fun areItemsTheSame(
            oldItem: Unit,
            newItem: Unit
        ): Boolean {
            return oldItem == newItem
        }

        override fun areContentsTheSame(
            oldItem: Unit,
            newItem: Unit
        ): Boolean {
            return oldItem == newItem
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TemplateListItemViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        return TemplateListItemViewHolder(
            binding = ItemTemplateBinding.inflate(layoutInflater, parent, false),
            onClickItem = onClickItem
        )
    }

    override fun onBindViewHolder(holder: TemplateListItemViewHolder, position: Int) {
        holder.bind(
            viewLifecycleOwner = viewLifecycleOwner,
            item = getItem(position)
        )
    }

    class TemplateListItemViewHolder(
        private val binding: ItemTemplateBinding,
        private val onClickItem: (Unit) -> Unit
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(
            viewLifecycleOwner: LifecycleOwner,
            item: Unit
        ) {
            binding.run {
                lifecycleOwner = viewLifecycleOwner
                this.item = item
                setOnClickItem {
                    onClickItem(item)
                }
                executePendingBindings()
            }
        }
    }
}
```

```item_template.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android" >

    <data>
        <variable
            name="onClickItem"
            type="View.OnClickListener" />

        <variable
            name="item"
            type="Unit" />

        <import type="android.view.View" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
```

以上になります。
基本的に各種型の設定はUnitになっているので、必要に応じて修正してください。
また、areItemsTheSameの比較条件なども同様です、idを比較するなど都度適した形へ調整して使っていただければと思います。

# さいごに
プロジェクト内のリソースをコピーして使うのもいいですが、新規のケースなどはこういったテンプレートがあると便利ですね。
是非ご活用いただければと思います。
Nuxt3(Nitro/h3) server apiで時間のかかる処理をクライアント側に待ってもらう書き方

Nitro/h3のserver apiでは、何もreturnしないと何故か404エラーになってしまう。
非同期処理などで、クライアント側にサーバー側の処理を待ってもらう書き方はこちら。

```javascript
export default defineEventHandler(async (event) => {
  
  return await new Promise((resolve, reject) => {
      try {
        時間のかかる処理()
        resolve({success:true})
      } catch(e) {
        reject({success:false})
      }
  })
  
})

```

Promise()で包んであげた処理をreturnすれば、非同期な処理が終わってresolve()するまで待ってくれる。Promiseの中でreturnしてもだめ。
FlashMagicをインストールする(LPC812関連)


目的
LPC系にシリアルで書き込む


ホームページ


https://www.flashmagictool.com/



1. FlashMagicのホームページに移動

2. ダウンロードに移動

3. ダウンロード

4. FlashMagic (1).exe　を　実行　(各自、名前が違うかも)

5. よくおぼえていない

6. FlashMagic

7. 設定後に書き込み


![o_cop121.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f0302a9d-3dfc-d1a8-268d-15555eccd407.jpeg)


![o_cop122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e0385e6f-1f9b-b720-d2e2-1ebd8be81360.jpeg)

![o_cop123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8660414b-1686-aeb8-3f06-c73616de6b66.jpeg)

![o_cop124.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fb7d506e-0e75-4062-77d2-3af31f838aec.jpeg)


![o_cop126.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/00529f08-c53e-7bac-a8db-fae7d0ef5239.jpeg)

![o_cop125.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f7582cff-f18f-7902-a41c-55ab1894bde7.jpeg)
SUNMI V2 PRO で名刺を印刷するスマホアプリを作った

少し前に、プリンター付きの Android スマホが一部の界隈で流行りました。遅ればせながら、私も Sunmi V2 Pro をついに手に入れました。最近はオフラインの実会場で行われる勉強会やカンファレンスが少しずつですが開催されるようになったので、現場での名刺を印刷するのは楽しそう、ということで、こちらを作りました。


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

## 開発

Sunmi が SDK を配っているので、個人でも印刷可能な Android アプリを作ることができますが、私は Android アプリの開発経験が乏しいので指を咥えるだけです。しかし、React Native でも利用できるパッケージをいくつかの方が配布しているので、それを利用して、開発しました。

### React Native で開発する

公開されているパッケージは多いですが、古くて動かないものや、TypeScript をサポートしてないものがあり、最適なパッケージ探しが大変です。私が調べた限りでは、こちらのパッケージが最適でした。ドキュメントが充実しており、TypeScript で型補完されるので、よく分からなくても何とかなります。

https://github.com/makgabri/react-native-sunmi-printer

しかしながら、こちらのパッケージも、Android のリリースビルド時に失敗するという問題があったので、ひとまずパッチを作って対応しました。


`@makgabri+react-native-sunmi-printer+0.1.1.patch`

```diff
diff --git a/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle b/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle
index 874c6ca..88b114b 100644
--- a/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle
+++ b/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle
@@ -14,15 +14,15 @@ buildscript {
 
 apply plugin: 'com.android.library'
 
-def safeExtGet(prop, fallback) {
-    rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
+def getExtOrIntegerDefault(name) {
+  return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties['SunmiPrinter_' + name]).toInteger()
 }
 
 android {
-    compileSdkVersion safeExtGet('SunmiPrinter_compileSdkVersion', 29)
+    compileSdkVersion getExtOrIntegerDefault('compileSdkVersion')
     defaultConfig {
-        minSdkVersion safeExtGet('SunmiPrinter_minSdkVersion', 16)
-        targetSdkVersion safeExtGet('SunmiPrinter_targetSdkVersion', 29)
+        minSdkVersion getExtOrIntegerDefault('minSdkVersion')
+        targetSdkVersion getExtOrIntegerDefault('targetSdkVersion')
         versionCode 1
         versionName "1.0"
 

```

## アプリ

そんなわけで、今回作成したアプリは以下のようになります。本当は入力フォームを作ろうかと思いましたが、時間がなくハードコーディングで情報を保持されています。

https://github.com/mitsuharu/mobile-printer


（追記）その後、アプリを改修して、入力フォームを追加したので、任意のテキストおよび画像を印刷できるようにしました。

## まとめ

フルリモートで地方に篭ってますが、タイミングが合えばこれを持って、勉強会などに参加しようと思います。

## 追記

2022年12月9日にこの内容を勉強会で発表しました。

- [SUNMI V2 PRO を入手した iOS アプリエンジニアが頑張る話 \- Speaker Deck](https://speakerdeck.com/mitsuharu/kyotolt-20221209)
amazon linux2にphp8.1とapacheを入れる方法

つまったので、解決方法を共有しておきます
# PHP8.1インストール
```
sudo su

yum update -y
amazon-linux-extras install epel -y
yum-config-manager --enable epel
yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
yum-config-manager --disable 'remi-php*' -y
yum-config-manager --enable remi-php81 -y
yum update -y
yum install php81 -y
yum -y install php81-php-{xml,zip,mysql,mysqlnd,bcmath,ctype,memcached,gd,apcu,pear,devel,json,mbstring,openssl,tokenizer,xml}

phpコマンドが動くようにする
alternatives --install /usr/bin/php php /usr/bin/php81 1
```
# apaceインストール
```
yum install httpd -y
systemctl start httpd
systemctl enable httpd
```

# php-fpmインストール
```
yum -y install php81-php-fpm
systemctl start php81-php-fpm.service
systemctl enable php81-php-fpm
vi /etc/httpd/conf.d/virtualhost.conf
下記を追加
<Directory "/var/www/html">
 <FilesMatch \.php$>
 SetHandler "proxy:fcgi://localhost:9000"
 </FilesMatch>
</Directory>

vim /etc/httpd/conf/httpd.conf
DirectoryIndexに、index.phpを追加
```
文法チェック
```
apachectl configtest

systemctl restart php81-php-fpm.service
systemctl restart httpd
```
Amazon URLやASINをISBNに変換する

タイトルの通りAmazon URLやASINからISBNに変換します。

ライブラリ([asin2isbn](https://github.com/s-n-1-0/asin2isbn))にしたのでこれを使用します。
```
npm install asin2isbn
```

# ASIN→ISBN
```ts
import {convertAsin2Isbn} from "asin2isbn";

let res = convertAsin2Isbn("4596708460");
if (res.error != "") {
  console.log("ISBN : " + res.isbn13); //10桁ISBNの場合は isbn10
}
```
※Kindle ASINの場合は取得できません。
```ts
console.log(res.error); // => "KINDLE"
```

# Amazon URL→ISBN
```ts
import {convertUrl2Isbn} from "asin2isbn";
let res3 = convertUrl2Isbn(
  "https://www.amazon.co.jp/dp/4799215663/ref=cm_sw_r_tw_dp_5XW9TEXBPTC54CE90CE9"
);
if (res3.isbn != "") console.log("res3 ISBN : " + res3.isbn13);
```
Excel業務(無駄)を自動化したい　part2 入力した文字をいじりたい

# はじめに
このサイトでは、社会人なりたての私が無駄を省くための戦いをまとめています。
今回のテーマは、pythonのライブラリを用いて、
Excelに代入した文字をいろいろいじっていきます。
ライブラリ名は、openpyxlです。

# 実行環境
Windows10
Python 3.10.5

# openpyxlとは？
openpyxlはExcelファイル(`.xlsx`)を読み書きできるツールです。
公式ドキュメント　[openpyxl/openpyxl-Bitbucket](https://bitbucket.org/openpyxl/openpyxl/src/master/)
詳しくは[こちら！](https://note.nkmk.me/python-openpyxl-usage/)
**今回はExcelファイル内のデータを読み込んで、分析するのではなく、
代入したいだけなので、pandasではなくopenpyxlを使用しています！**

# 文字をいじろう
Excelに値を代入する方法は[こちら](https://qiita.com/caffeine1202/items/2c2f2eb3382cd9098e23)をご覧ください。
それではセル内の文字をいじっていきます。
文字をいじる関数はopenpyxl内のFont関数です。
いじる前にFont関数について説明します。

## Font関数とは？
Font関数はセル内の文字をいじるのに使います。
引数として7つの値を入力できます。
下記にFont関数に入力できる値の例を記載します。
```python:Font関数    
font = Font(name='Calibri',    #フォント名
            size=11,           #文字サイズ
            bold=False,        #太文字
            italic=False,      #italic
            underline='none',  #下線
            strike=False,      #打消し線
            color='FF000000')  #文字の色
```
まとめると、
|  引数名  |  データ型  | 初期値 | 解説 |
| ---- | ---- | ---- | ---- |
|  name  |  文字列型(String)  |Calibri|フォント名を入力すると、フォントの型が変更できる|
|  size |  整数型(int)  |11|文字の大きさを変更できる|
|  bold |  ブール型(bool)  |False|Trueにすると、太文字になる|
|  italic |  ブール型(bool)  |False|Trueにすると、Italicになる|
|  underline |  ブール型(bool)  |None|Trueにすると、下線が引ける|
|  strike |  ブール型(bool)  |None|Trueにすると、打消し線が引ける|
|  color |  文字列型(String)  |None|カラーコードを入力すると、文字の色が変更できる|

こちらのサイトで分かりやすくまとめられているので、困った方はこちらへ
[PythonでOpenPyXLを使いExcelのフォントを設定する方法](https://tonari-it.com/python-openpyxl-font/#toc2)

## 文字をいじる
前章のデータをもとに文字をいじってみましょう！
今回は文字を赤色の太字にしたいと思います。
```python:importリスト    
import openpyxl
from openpyxl.styles import Font
```
```python:文字の操作    
xlsx_path = "Excelファイルのパス"
wb = openpyxl.load_workbook(xlsx_path)
ws = wb.worksheets[0]

ws.cell(row=1, column=1).value = "文字赤いよ、でかいよ"
ws.cell(row=1, column=1).font = Font(size=30,bold=True,color="ff0000")
wb.save(xlsx_path)
```
上記のコードを実行すると、文字をいじることができました。
![スクリーンショット 2022-10-16 155241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433191/d2e57367-eea4-175e-7214-90339ccbdac2.png)
※引数はすべて指定する必要がなく、いじりたい箇所の値をいれるだけでよい
※いちいちFont関数でいじるのがめんどくさいあなたへ
　使いそうなレイアウトを変数に格納できます
```python:めんどくさがりへ   
style_type1 = Font(size=30,bold=True,color="ff0000")
ws.cell(row=1, column=1).font = style_type1
```

# おまけ
編集したExcelの保存方法（紹介忘れていたので追記）
```python:保存方法 
wb.save("Excelファイルのパス")
```

# 終わりに
今回の紹介した操作のおかげで、前回に比べると業務に使えそうなビジョンが見えてきたので、書いてて楽しかったです。そろそろセルのレイアウトにも着手していきたいです。
Excel関連の業務でこれが嫌だ！みたいなことがありましたら、コメントしていただくと嬉しいです。
Excel: 日付から曜日を作る


###### 実施環境 : Microsoft Office Professional Plus 2016

### 0. 概要

 Excel において日付から曜日を作成したい場合はたびたびあります。
入力数が少なければ1つ1つ手動で入力してもよいかもしれませんが、数が多いと非常に大変です。
そこで、今回は連続する日付から曜日を作成する方法を紹介します。

### 1. オートフィル(フィルハンドルをドラッグ)

まずは、先頭7日分の曜日を手動で入力します。

![WS000342.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a99610e8-0273-d062-9a07-5bb2f1f2b692.jpeg "1-1")

次に、セル右下の ■ を下にドラッグします。

![WS000342 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/25b2866a-ec3f-a181-9aee-82c4b31cbf9d.jpeg "1-2")

![WS000343.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/40599636-cd62-a557-1612-b5cccfde382b.jpeg "1-3")

すると、自動的に曜日が繰り返し入力されます。

### 2. フォーマットを変更

まずは曜日のセルに、日付のセルと同じ値を入れます。

![WS000334.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4e3a5206-237c-4762-2e9d-d343b6a93abd.jpeg "2-1")

次に、「ホーム」⇒「数値」からフォーマット欄を選択し、「その他の表示形式」を選択します。

![WS000335.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8d14ad8e-58a0-5998-4a44-52bb662518b6.jpeg "2-2")

「表示形式」⇒「ユーザー定義」を選択し、「 aaa 」と入力して「 OK 」を押します。

![WS000336.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2124c4b0-4613-ba4e-d83d-909235279f41.jpeg "2-3")

これで、曜日が作成できました。

![WS000338.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e2f93e39-2e4c-b7be-cb8d-0cc9c395da21.jpeg "2-4")

あとはこのセルをコピーすれば完了です。

![WS000339.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7bc42e38-e3ef-d4b3-7073-5f12f8862be8.jpeg "2-5")

「 aaa 」の代わりに「 aaaa 」と入力すると「曜日」という文字列まで含めて表示されます。

![WS000337.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f762b3fa-84fa-5201-a3b3-4512c39c6f48.jpeg "2-6")

なお、この方法の場合セルに入力されている値はあくまで「日付」であり「曜日の文字列」ではないため、他からこのセルを参照する際には注意が必要です。

![WS000344.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b22f8552-2861-d15c-6d38-ebcce8fed9a7.jpeg "2-7")

### 3. TEXT 関数

 TEXT 関数は、指定したフォーマットに値を変換する関数です。
引数は以下のように指定します。

=FORMAT(値,フォーマット)

このフォーマットには先ほどの「 aaa 」「 aaaa 」も使用できます。
そこで、以下のように式を作成します。

```Excel:Excel
=TEXT(B3,"aaa")
```

![WS000340.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d3f8a730-d8ba-c89f-9752-948e8283ab27.jpeg "3-1")

これで曜日が作成できました。
あとはこのセルをコピーすれば完了です。

![WS000341.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b441b136-d933-a05f-3bc6-1d91efd406f5.jpeg "3-2")

この方法の場合セルに入力されている値は「曜日の文字列を返す式」のため、他からの参照でも「曜日の文字列」として使用できます。

![WS000345.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/789a80ce-7667-5700-8de0-e975d0c6ff1a.jpeg "3-3")