OmniAICreator/Qiita-1.07M huggingface dataset:
assertion-failed発生時の出力先を変更する(Platformio+arduino)

## 1. 概要
APIのパラメーターチェックなどでassertを使うことがあります。しかしPlatformIOとrp2040（フレームワーク：Arduino）を使用したプログラムにおいては、不便なことがあります。それはassertion-failが発生した時、エラーメッセージがUART0のみに出力されることです。
UART0にシリアルモニタを接続するか、デバッガー（J-Linkなど）を接続している場合は、何が起こったかを把握できます。しかし、USBシリアル接続では何も表示されません。
このため、USBシリアル接続のみでエラー発生時の情報を取得する方法を実装してみました。

## 2. assertの実装

assertは、ファイルC:\Users\\%USERNAME%\\.platformio\packages\toolchain-gccarmnoneeabi@1.90201.191206\arm-none-eabi\include\assert.hの16～17行付近に、以下のように定義されています。
```c
# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \
						       __ASSERT_FUNC, #__e))
```
assertは、関数`__assert_func()`を呼び出しています。
次に関数`__assert_func()`の定義を確認します。以下の様に定義されています。
USBシリアルに出力するためには、以下の3点を変更する必要があります。
- 割り込みハンドラから呼び出された場合は、既存の処理を行う →①
- 出力先を標準出力からUSBシリアルに変更する →②
- USBシリアル出力処理が実行できるよう、`_exit()`を呼び出さず[^1]、`delay()`を入れた無限ループとする →③
※これにより、USB経由のリセットも有効となり、PlatformIOからの書き込みができるようになるはずです。
[^1]:_exit()を呼び出すと、割り込み禁止状態で停止してしまうためです。

```c
// incorrect warning from GCC 6
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsuggest-attribute=format"
void __assert_func(const char *file, int line, const char *func, const char *failedexpr) {
    weak_raw_printf("assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
           failedexpr, file, line, func ? ", function: " : "",
           func ? func : "");

    _exit(1);
}
```
上位のソースは、以下のリンク先にあります。
https://github.com/raspberrypi/pico-sdk/blob/f396d05f8252d4670d4ea05c8b7ac938ef0cd381/src/rp2_common/pico_runtime/runtime.c#L262-L271

## 3. 代替機能の実装

先の関数`__assert_func()`は、libmbed.aに入っています。libmbed.aに入っているオブジェクトファイルはすべてリンク対象となるため、同名の`__assert_func`という関数を追加するとシンボルが重複してしまいます。このためgnu ldが持っている--wrapオプションを使用します。
platformio.iniに以下の行を追加します。
```
build_flags = -Wl,--wrap=__assert_func
```
これにより、もともと存在している_assert_funcは、__real___assert_funcという名前で呼び出すことができます。一方、新たに作る関数は__wrap___assert_funcという名前で定義しておきます。

関数__assert_func()を以下のように実装します。

```c
#include <Arduino.h>
#include <platform/mbed_critical.h>

extern "C" {
extern void __real___assert_func(const char *file, int line, const char *func, const char *failedexpr);
}

extern "C" void
__wrap___assert_func(const char *file, int line, const char *func, const char *failedexpr)
{
  char buf[128];
  if (core_util_is_isr_active()) {  // 割り込み処理中かを判断
    __real___assert_func(file, line, func, failedexpr);  // ①既存の処理を呼び出す
  } else {
    snprintf(buf, sizeof(buf), "assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
          failedexpr, file, line, func ? ", function: " : "",
          func ? func : "");
    Serial.print(buf);       // USBシリアルに出力②
    for (;;) {               // 無限ループ③
      delay(1000);
    }
  }
}
```

## 4. 動作確認

以下のようなテストプログラムを作成し、実行してみます。
```c
#include <Arduino.h>

void
setup()
{
  while (!Serial) {
    ;
  }
}

void
loop()
{
  assert(false);
}

```
実行すると、以下のようにメッセージが表示されました。
```
assertion "false" failed: file "src\main.cpp", line 14, function: void loop()
```
この状態で、PlatformIOから書き込みができるることも確認できました。

## 5. 課題
rp2040はArmv6-Mアーキテクチャなので、アラインされていないデータをアクセスすると、アボートが発生します。このときにもエラー発生時の情報を出力できる方法を検討していこうと思っています。
Stable Diffusion Web UI で生成した画像のモデル名やパラメータを生成後に確認する方法

## 緊急速報：Stable Diffusion Web UI を Google Colab 上で使うとアカウントBAN?!

https://qiita.com/javacommons/items/e310e37ef7e2fe7b5d52

----

Stable Diffusion Web UI で生成した画像のモデル名やパラメータを生成後に確認したいことってありますよね。

「この画像どのカスタムモデルで生成したんだっけ？」
「プロンプト、ネガティブプロンプトは？」
「もう一回再現したいんだけどなー・・・」
・・・てことありますよね。

MajinAI のサイトを使えばできます！

## [https://majinai.art/ja/](https://majinai.art/ja/) にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/4cdbbcd8-6311-30f7-7e76-eada758386ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/5a68ec35-d070-426b-2c0a-5d597c34f024.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/4d754597-9185-d058-bb45-577f187e7993.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/2714aeca-1f19-ff67-d80b-c64b145498b6.png)

<a href="https://majinai.art/ja/i/30dswZg"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/ac99205d-4857-ad29-1146-0c3743d5239a.png" /></a>

## 最後に

最後に「アップロード」ボタンを押さなければ、「プロンプト」「ネガティブプロンプト」および「モデル名」だけ確認して終わることもできます。(実際にアップロードされません)

てことは、png ファイルに、プロンプトや各種設定情報が文字列として書き込まれているのかな？
他のツールでもできるかもですが、私が知っている一番手軽な方法はこれです。

また、Stable Diffusion Web UI の使い方に関する記事をいくつか書きました。以下の記事ももしよければご覧ください。

https://qiita.com/javacommons/items/77f520d531eaed85ed53

https://qiita.com/javacommons/items/316167a7ecb7b5164537

https://qiita.com/javacommons/items/e63f6d25d8864f31a366

それでゃ！
git pullしたら.git/index.lock' write error. Out of diskspaceエラーが出る

EC2でpullしたときのこと。

# エラー内容
```
$ git pull origin main

fatal: sha1 file '/var/www/movie-review/.git/index.lock' write error. Out of diskspace
```
見たことないエラーが出る。エラー文でググってみてもそれっぽいサイトは出てこない。
# 原因
翻訳サイトでエラー文を和訳してみたら
```
fatal: sha1 file '/var/www/movie-review/.git/index.lock' write error. Out of diskspace
↓（和訳）
致命的: sha1 ファイル '/var/www/movie-review/.git/index.lock' 書き込みエラー。 ディスク容量が不足しています
```


ディスク容量が不足しているとのこと。

# 解決法
一旦イメージなどを全部削除してしまえば、容量が復活すると思いますので
下記を実行して、docker関連のimageを全削除してからpullすればOKです。
```
$ docker-compose down
$ docker image prune -a
$ docker volume prune
$ docker system prune

$ git pull origin main
```
の手順を行ったら無事pullできました！
no space left on deviceと同じようなエラー内容なんですかね。。
【ハリポタ呪文】Lumos(ルーモス：光よ)でiPhoneのライトをつける方法

iPhoneの簡単な操作のほとんどは、Siriを使ってコントロールできます。今回は、ハリー・ポッターの小説や映画に出てくる呪文を唱えることで、iPhoneのライトをつける方法をご紹介します。

# iPhoneのライトをハリー・ポッターの呪文で操作する方法

### ステップ1: ショートカットアプリを開く
![IMG_2147.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328398/11451e2d-194f-dacc-76c9-5e413e5adddd.jpeg)
「ショートカット」は、iOS13からは標準でインストールされているアプリです。消してしまった人は[ここから](https://apps.apple.com/jp/app/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88/id915249334)ダウンロードしてください。

### ステップ2: 新しいショートカットを作成する
![スクリーンショット 2023-04-18 4.10.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328398/32e4cbca-3c4b-5fba-173e-433125270ff8.png)
ショートカットアプリを開き、ライトをつけるコマンドを作成します。
アプリを開いたら、右上の＋を押して新しいショートカットを作成します。
画面下の検索で「ライト」を検索し、「フラッシュライトを設定」を選択します。これでライトをつけるコマンドの部分が完成しました。
### ステップ3: Siriに呪文を教える
![スクリーンショット 2023-04-18 4.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328398/e365f37a-1a78-c023-181d-8a36c470ec2e.png)
次にSiriに呪文を唱えた時に、今のコマンドが実行されるように設定します。やり方は簡単で、画面上のボタンから名称変更を選択し、名前を好きな呪文に設定してください。Lumos（ルーモス：光よ）がいい人は「ルーモス」と入力し、完了を押しましょう。

### ステップ4: Siriに呪文を唱えてライトを点灯させる


準備が整いましたので、電源ボタンまたはホームボタンを長押ししてSiriを起動し、呪文を唱えましょう。
##### 「Lumos（ルーモス：光よ）」と言ってみてください。
これで皆さんも立派な魔法使いになれます。

### まとめ
ハリー・ポッターの呪文を使ってiPhoneのライトを操作する方法をご紹介しました。ショートカットアプリを利用して、Siriに呪文を教えるだけで、ライトを点灯させることができます。この方法を試して、魔法使い気分を楽しんでください。
![IMG_2159.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328398/83c466e7-8a5e-cb2a-aa95-432623031d22.jpeg)
2023/4/18主にITとかセキュリティの記事

Microsoftが4月度セキュリティ更新プログラムを公開／Office 2013のサポートが4月11日で終了(4/16)
https://news.yahoo.co.jp/articles/4945d2b1193432bc67766f97e20152183f8a9695?source=rss

性的脅迫メール（sextortion mail) ｷﾀ――(ﾟ∀ﾟ)――!!(4/15)
https://qiita.com/Sh1n0g1/items/6cf6dadeb9151dbc44df

論点直言　ＴｉｋＴｏｋは危険か
脳をハッキング　防衛へ先手　米ハドソン研究所アジア太平洋安全保障部長　パトリック・クローニン氏(4/16)
https://www.sankei.com/article/20230416-G3ZMORKZE5KINDZ3PUQSDKJFQ4/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E3%80%90%E8%AB%96%E7%82%B9%E7%9B%B4%E8%A8%80%E3%80%80%EF%BC%B4%EF%BD%89%EF%BD%8B%EF%BC%B4%EF%BD%8F%EF%BD%8B%E3%81%AF%E5%8D%B1%E9%99%BA%E3%81%8B%E3%80%91%E8%84%B3%E3%82%92%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%80%80%E9%98%B2%E8%A1%9B%E3%81%B8%E5%85%88%E6%89%8B%E3%80%80%E7%B1%B3%E3%83%8F%E3%83%89%E3%82%BD%E3%83%B3%E7%A0%94%E

論点直言　ＴｉｋＴｏｋは危険か
中国政府、データ利用も可能　日本スマートフォンセキュリティ協会技術部会長　仲上竜太氏(4/16)
https://www.sankei.com/article/20230416-DNP67Y3IMZOSXMBZOR5GIUARME/

論点直言　ＴｉｋＴｏｋは危険か
新市場・流行生み大人にも恩恵　芝浦工業大教授　原田曜平氏(4/16)
https://www.sankei.com/article/20230416-SZ5AGOD33JIK3GMTNTPLPNJXJU/

米国防総省の流出資料から、中国軍に対する台湾の脆弱性が明らかに(4/16)
https://sputniknews.jp/20230416/15695344.html

ChatGPTを利用する際にやってはいけない3つのこと(4/16)
https://news.yahoo.co.jp/articles/27fd9a0028779792da1bf2d1e41a7b09510f952f
https://news.biglobe.ne.jp/it/0416/imm_230416_8293442139.html

チャットＧＰＴに聞いてみた(4/16)
https://www.the-miyanichi.co.jp/kuroshio/_70733.html

普及が進まない「メタバース」に傾倒する携帯3社、勝算はあるのか(4/17)
https://xtech.nikkei.com/atcl/nxt/column/18/00086/00257/

イノベーションは「おもろい」が最も重要、利用禁止なら野良ChatGPTを勧めよう(4/17)
https://xtech.nikkei.com/atcl/nxt/column/18/00148/041300279/

浜松市がデータ連携基盤のSaaS活用を開始、自治体初の狙いはどこに(4/17)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07930/

三菱電機が動く対象物の断層撮像技術、工場ラインでの非破壊検査に威力(4/17)
https://xtech.nikkei.com/atcl/nxt/news/18/14917/
C++ちょっと早くする方法まとめ

■２倍は左シフト演算、割る２は右シフト演算を使う。

■gccコンパイラオプションで最適化オプション「-O3」を使う

■何度も呼び出される小さい関数については、ラムダ式を使うと早い場合がある。

■余計な一時オブジェクトを作らない
・const参照渡し or ポインタ渡しを活用する
・ムーブセマンティクス (C++11)
・noexcept

■コンテナ
・用途に合わせて使い分ける（std::array、std::vector、std::list、std::unordered_mapなど）
・メモリは一気に確保する。たとえば、std::vector の push_back()reserveなどを活用。

■ループ
・継続条件に注意。イテレータで回すときの v.end() も毎回呼び出されるので、
　for (size_t i=0; i < v.size(); ++i)　よりも
　for (size_t i=0, n=v.size(); i<n; ++i) の方がよい。
　for (vector<int>::iterator it=v.begin(), v_end=v.end(); it!=v_end; ++it) とか。
　C++11以降だとfor (const auto& x: v) という書き方で範囲ベースもできる。
・インクリメント、デクリメントは前置（++i）の方が早い。（一時オブジェクトが作られないため）
　ただし、コンパイラによって改善傾向にあり、現在はほぼ変わらないことが多い。
・出来る限り外で処理する。if-else や try-catch のブロックをループの外で大きく取れないか、 一時変数の定義や演算などをループの外で予めやっておけないか検討する。

https://qiita.com/taptappun/items/83578a6ab3546ec1dc2d#%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88%E3%83%87%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88

https://qiita.com/amayaw9/items/6e55b91c28cdc8d32cf2

https://heavywatal.github.io/cxx/speed.html

https://hirlab.net/nblog/category/programming/art_86/

↓フラグチェックを外に出すわかりやすい例文

https://qiita.com/nariakiiwatani/items/9f80f0d3bae785123229#%E3%83%AB%E3%83%BC%E3%83%97%E5%86%85%E3%82%92%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%99%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81

https://qiita.com/kotauchisunsun/items/84e01c6fb621fcc1a647




【使用頻度低め】

コンパイル時定数 constexpr を活用する

インライン展開を活用し、関数の呼び出しコストを減らす。ただし、コンパイルに時間がかかりまくったり、実行ファイルサイズがでかくなったり、問題もある。

標準入出力をCストリーム(std::printf とか)とC++ストリームとで切り離しておく

↓キャッシュメモリの有効利用

https://zenn.dev/irugo/articles/4bd113195228c3#6.-%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E6%9C%89%E5%8A%B9%E5%88%A9%E7%94%A8

http://geo.d51498.com/nakamiya_town/ProC.html
Jupyterでしかできない機能（Pandasのデータのデバッグでの苦労を解消）

通常のPythonでPandasを扱う時の苦労する部分
PythonのPandasで次のようにコードを書くことが多いと思います。
```python
import pandas as pd
df = pd.DataFrame([[4, 6], [1, 9], [3, 4], [5, 5], [9,6]],
               columns=["Mike", "Jim"],
               index=["Mon", "Tue", "Wed", "Thurs", "Fri"])
print(df)
```
実行結果
```
       Mike  Jim
Mon       4    6
Tue       1    9
Wed       3    4
Thurs     5    5
Fri       9    6
```
この事例だとデータが少ないので、問題ないのですが、次の場合はどうでしょうか？
```python
arr = np.random.rand(100, 2)
df = pd.DataFrame(arr, columns=["Mike", "Jim"])
print(df)
```
実行結果 データの途中が「... ... ...」になる、ちょっと<b>不親切である<b>
```
        Mike       Jim
0   0.518550  0.800410
1   0.049528  0.173049
2   0.501506  0.037998
3   0.114218  0.450367
4   0.650279  0.786903
..       ...       ...
95  0.568600  0.482608
96  0.565669  0.066380
97  0.798853  0.639985
98  0.513716  0.916416
99  0.911314  0.686543

[100 rows x 2 columns]
```
では、Jupyterを導入するとどうなる？(残念ながらセルの出力はPythonと同じ）
```
Mike	Jim
0	0.755812	0.277540
1	0.043467	0.343764
2	0.582709	0.669783
3	0.166682	0.054200
4	0.365496	0.971671
...	...	...
95	0.798789	0.356647
96	0.471416	0.009733
97	0.138570	0.619475
98	0.382083	0.554818
99	0.157959	0.462000
100 rows × 2 columns
```
しかし、Jupyter専用の出力のデータビューア機能があって、これを使うことが可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/c56b33fc-2fb3-375f-900f-fe0895bc7416.png)
試しにDFを表示させると全量が出る、また検索と昇順、降順並び替えも可能
![スクリーンショット 2023-04-18 025831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/5012bb40-1cc5-cf16-15f8-b0d8c12cdb40.png)
さらに次のようなことも可能
```python
def highlight_max(x, color):
    return np.where(x == np.nanmax(x.to_numpy()), f"color: {color};", None)
def highlight_min(x, color):
    return np.where(x == np.nanmin(x.to_numpy()), f"color: {color};", None)
li = [['English','Japanese','Chinese','Koreans','Taiwanese'],[10,20,30,40,50]]
df1 = pd.DataFrame(li,columns=['a','b','c','d','e']).T
df1.style.apply(highlight_min, color='red') 
```
実行結果（ハイライト機能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/e13607f0-a74b-d883-7cc8-e27569edad2d.png)
こうして、Jupyterを有効活用して<b>「Python Lifeを楽しんでください」
【Laravel】カスタムバリデーション 暗黙のルールへの対応

こんばんは。もふもふおじさんです。

> 暗黙のルール
デフォルトでは、バリデーションされる属性が存在しないか、空の文字列が含まれている場合、カスタムルールを含む通常のバリデーションルールは実行されません。たとえば、uniqueルールは空の文字列に対して実行されません。


https://readouble.com/laravel/10.x/ja/validation.html

カスタムバリデーションでrequired_ifに似たような機能を作成した際、上記仕様がネックとなったので対応策を記載します。


今回は、カスタムバリデーションルール「required_if_regex」を作成することとします。
機能としてはrequired_ifを正規表現に対応させた感じです。（使用例: 'required_if_regex:name,^laravel'）


まずは、サービスプロバイダーを作成し、設定ファイルに追加します。

```php:app/Providers/ValidatorServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        \Validator::resolver(function ($translator, $data, $rules, $messages) {
            return new \App\Validator\CustomValidator($translator, $data, $rules, $messages);
        });
    }
}
```

```php:config/app.php
    'providers' => [
        App\Providers\ValidatorServiceProvider::class,
    ..
```

次に本題のカスタムバリデーターを作成します。
やることは、カスタムバリデーターの継承元となるIlluminate\Validation\Validator.phpに定義された配列「$implicitRules」へ'RequiredIfRegex'ルールの追加です。

```php:vendor/laravel/framework/src/Illuminate/Validation/Validator.php
    /**
     * The validation rules that imply the field is required.
     *
     * @var string[]
     */
    protected $implicitRules = [
        'Accepted',
        'AcceptedIf',
        'Declined',
        'DeclinedIf',
        'Filled',
        'Missing',
        'MissingIf',
        'MissingUnless',
        'MissingWith',
        'MissingWithAll',
        'Present',
        'Required',
        'RequiredIf',
        'RequiredIfAccepted',
        'RequiredUnless',
        'RequiredWith',
        'RequiredWithAll',
        'RequiredWithout',
        'RequiredWithoutAll',
    ];
```

```php:app/Validator/CustomValidator.php
<?php
namespace App\Validator;

use Illuminate\Validation\Validator

class CustomValidator extends Validator {

    public function __construct(Translator $translator, array $data, array $rules,
                                array $messages = [], array $customAttributes = [])
    {
        parent::__construct($translator, $data, $rules, $messages, $customAttributes);
        $this->$implicitRules[] = Str::studly('required_if_regex');
    }

    public function validateRequiredIfRegex($attribute, $value, $parameters)
    {
        $other_value = Arr::get($this->data, $parameters[0]);
        $pattern = $parameters[1] ?? null;
        if ($pattern && preg_match('/' . $pattern . '/', $other_value)) {
            return $this->validateRequired($attribute, $value);
        }

        return true;
    }
}

```
SQLServer 環境設定 備忘録

## ダウンロード
SQL Server Express 2019 等で検索
https://www.microsoft.com/ja-jp/download/details.aspx?id=101064
日本語 版をダウンロード

#### 関連ツール
|項目|説明|備考|
|----|----|----|
|SQLServer20XX|データベース管理システム本体|MS SQL|
|SQLServer Management Studio|統合開発環境|SSMS|
|SQLServer 構成マネージャー|SQLServer関連のサービスの状態確認や、開始、停止、ネットワーク設定を行えるツール。|OS起動時に自動起動するかも設定可能（開始モード：自動）|
|SQLServer Profiler|SQLServerに対して実行された全てのステートメントを監視できる||
|SQL Server Browser|アクティブなSQL Serverデータベース・インスタンスの自動報告ツール|https://qiita.com/YuichiTanaka007/items/7811884b95d448029908#sqlserverbrowser%E3%81%A8%E3%81%AF|


## インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/a9bf2ad9-1d75-70d4-a3dd-733bc4532437.png)

## SSMSダウンロード・インストール
SQLServer用の統合開発環境。
本体とは別でDLとインストールを行う。

## 別PCから接続許可設定
https://tex2e.github.io/blog/database/sqlserver-setup

### DB設定
1 DBのプロパティ > セキュリティ から、サーバ認証を「SQL Server認証モードとWindows認証モード」に変更。
2 DBのプロパティ > 接続 から「このサーバーへのリモートサーバ接続を許可する」にチェックを確認。
3 DB > セキュリティ > ログイン を右クリックして「New Login…」をクリック。
4 ログイン名を「SQL Server認証」とし、パスワードに自分の好きなユーザ名とパスワードを入力。(もしくはsaのパスワードを入力して有効化でもOK)
5 DB > セキュリティ > ログイン 直下に追加したログインユーザが存在することを確認。

### SQL Server
1 SQL Server 構成マネージャーを起動。
2 SQL Server 構成マネージャー > SQL Server ネットワークの構成 > SQLEXPRESSのプロトコル を選択。
3 TCP/IPを有効。
4 TCP/IPのプロパティ > プロトコル
	すべて受信待ち：はい
5 TCP/IPのプロパティ > IPアドレス
	IPALL > TCPポート：1433
6 SQL Server 構成マネージャー > SQL Server のサービス > SQL Server再起動

### SQL ServerBrowser

SQL Server 構成マネージャー > SQL Server のサービス > SQL ServerBrowser起動
サービス > SQL Server Browserのプロパティ > スタートアップの種類：自動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/2ada3c32-44fa-66b7-50f6-aa7c68359801.png)
##### Windowsサービス (WINDOWS SERVICE) とは
>UNIXのデーモンに概念的に類似
引用元：https://ja.wikipedia.org/wiki/Windows%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9

##### SQLServerBrowserとは
>名前付きインスタンスのDBにつなぐ場合、サーバー名の後ろにカンマをいれてその後ろにポート番号を付けてアクセスしますが、ポート番号は動的なので、番号が変わると繋がりません。
　例) Server1\SQLEXPRESS,1411
これを、SQLServerBrowserサービスを起動しておくと、ポート番号なしでアクセスできるようになる。
　例）Server1\SQLEXPRESS
引用元：http://zatti.blog81.fc2.com/blog-entry-45.html

##### インスタンスとは
>SQLServerは1台のPCに複数インストールでき、それらは「インスタンス」と呼ばれる。
>インスタンスは1台のPCに最大50個インストール可能。
引用元：SQLSQLServer2016の教科書 著：松本美穂・松本崇博

### Windows Firewall

詳細設定 > 受信の規制 > 新しい規則
	1 SQL Serverの通信設定
		プロトコルおよびポート：TCP/1433
		プロファイル：ドメイン、プライベート、パブリック
		名前：SQL Server (tcp/1433)
	2 SQL ServerBrowserの通信設定
		プロトコルおよびポート：UDP/1434
		プロファイル：ドメイン、プライベート、パブリック
		名前：SQL ServerBrowser (udp/1434)

## ログイン
認証方法：「SQL Server認証」
サーバー名：「固定IP\SQLEXPRESS」
パスワード ： ******
Bitbucket(リモートリポジトリ)にとりあえずpushしたい

#### Bitbucketとは
gitを使う際，可視化することによってコードレビューをするなどの共有する作業をしやすくしたプラットフォームである.
githubを知っている人は，それと同じようなものと理解してもらって構わない.

#### とりあえず結論

<font color="#1e90ff">**※一度リモートリポジトリ(Bitbucket)にpushしたことがある場合，2→(5)→6→7だけでOK**</font>

1.アカウント名とメールアドレスの設定
```
//gitのユーザー名・メールアドレスを設定する
$ git config --global user.name ~BitBucketのアカウント名~
$ git config --global user.email ~BitBucketアカウントのメールアドレス~
```
2.作業場所のあるpathへ飛ぶ
```
cd ~作業場所のpath~
```

3.作業ファイルがある場所でのgitの設定
```
//gitの設定初期化
git init
//リモートに繋ぐ
git remote add origin ~リモートのpath~
```
グループの作成者がbitbucketのリポジトリに対するアクセス権限的を渡さない限り，リモートへのpushはできないかも

4.ローカルリポジトリ，リモートリポジトリに，初期状態のデータを引き渡す
```
//ローカルに入っているデータを取得
git add .
//コミット(ローカルにデータを突っ込む)
git commit -m "コミット内容をわかりやすく記載"
//プッシュする(ローカルからリモートに送る)
git push -u origin main
```

5.ブランチ作成
```
git branch ~作成するbranchの名前~
```

6.ブランチ切り替え(comitt,pushしたいbranchに切り替え)
```
git switch ~branchの名前~
```

7.追加，コミット(ローカル)，プッシュ(リモート)
```
//ステージエリアにファイルを追加
git add .
//コミット(ローカルリポジトリに反映)
git commit -m "変更内容を具体的に"
//プッシュ(bitbucketにあるリモートリポジトリに反映)
git push -u origin ~branchの名前~
```

以上　細かい説明は後ほど追加予定 4/18日現在
AKS Edge Esseintialsとは


### 前段

Windows 11, Windows 11 IoTにKubernetesをインストールする方法の第一弾です。まずはAKS Edge Essentialsについて紹介します。
この記事はInstall Kubernetes on Windows 10 and Windows 11 with AKS Edge Essentials (https://www.thomasmaurer.ch/2023/03/install-kubernetes-on-windows-10-and-windows-11-with-aks-edge-essentials/) を参考にしました。

### AKS Edge Essentialsとは

AKSのオンプレミスKubernetes実装です。軽量なKubernetesディストリビューションが含まれており、フットプリントが小さくインストールがシンプルなため、PCや Light-edgeハードウェアへのKubernetesの展開に適しています。LinuxとWindows双方のコンテナが動作できる点も特徴です。

+ Microsoftによって管理、サポートされるCNCF準拠のK8S, K3Sディストリビューションです。AKS on HCIとの特徴的な違いは必要な最小コンピュート、メモリの要件が少ないことです。
+ それぞれのKubernetesクラスターはHyper-Vによって分離した仮想マシンとして動作しコンテナインフラの安全性を高めるための多くの機能を備えています
+ MicrosoftがメンテナンスするLinuxとWindowsのワーカーノードの仮想マシンイメージはセキュリティベストプラクティスを遵守し、毎月更新があります。
+ PowerShellとエージェントによるシンプルなインストールを実行できます。また自動アップデートも提供され常に最新のKubernetesバージョンを使い続けることができます。

### まとめ

AKSをWindows 11/Windows 11 IoTに導入するために必要なソリューション（AKS Edge Essentials）についてまとめました。Windows Server/ Azure Stack HCI向けにはAKS on HCIが活用できますが、Client OS向けにより軽量なソリューションが用意されています。AKSなのでKubernetesの管理はMicrosoftによって管理され手軽に導入できる一方で、Azure外でも動作できる点がポイントだと思います。次回は実際に導入する方法について記載します。

### 参考
1. AKS Edge Essentials: https://learn.microsoft.com/en-us/azure/aks/hybrid/aks-edge-overview?WT.mc_id=modinfra-0000-thmaure
2. Install Kubernetes on Windows 10 and Windows 11 with AKS Edge Essentials: https://www.thomasmaurer.ch/2023/03/install-kubernetes-on-windows-10-and-windows-11-with-aks-edge-essentials/
インターフェースとは

クラスが実装するべきメソッドの一連の仕様を定義するためのコンパイル時の契約

抽象メソッドや定数を含んでおり、クラスがこれを実装することによりそのメソッドのふるまいを定義

クラスが複数のインターフェースを実装することができる
→複数のインターフェースのメソッドを実装する必要あり


クラスが特定のふるまいを持つために使用される

クラス間の疎結合性高め、柔軟性のある設計が可能

***

追記）コメント文を引用
>これは、実装する人への内容ですね。
インタフェースは、使う人のことを考えて、誰が何のためにどのように使うのかを明確化する役割もあります。
API (Application Program Interface) と呼ばれる仕様書がまさにそれですよね。
クラスには様々なパラメタやメソッドがありますが、用途に応じて使う機能を限定・明確化して提供するのがインタフェースともいえます。
生活の中にある身近なインタフェースでは、例えばテレビやBD/HDDレコーダを眺めてみると、前面やリモコンに操作インタフェースがあり、背面に接続インタフェースがあります。
装置内部は複雑な部品やプログラムで構成されていますが、使う人から直接触れられないように筐体（カプセル）に閉じ込められています。
テレビやBD/HDDレコーダを買ってきたら、業者や機械に強い友人に接続インタフェースにいろいろ接続してもらって、自分はリモコンを使って操作インタフェースを使うだけ。
誰が何のためにどのように使うのかに応じて、複数のインタフェースが実装されていますよね。
別の装置でもインタフェースが同じなら違和感なく使いこなすことができます。
VirtualBoxでWindowsマシンを仮想ルータとして使う

VirtualBoxの仮想ルータをLinuxマシンで作成している例はあったが、Windowsマシンで作成してみたので自分用のメモとして残す。
## 完成イメージ

3台のWindowsマシンを作成する
・WindowsServer2019 × 1台
　サーバ
・Windows10 × 2台
　クライアントPC
　仮想ルータ
![vboxwin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692196/15ac01a4-6b93-532e-e242-ce531a5e85cd.jpeg)

## 1. VirtualBoxの設定
1-1. VirtualBoxマネージャで2つのNATネットワークを作成する
「ファイル」>「環境設定」>ネットワーク
・172.16.0.0/16［NATネットワーク①（サーバ用）］
・172.17.0.0/16［NATネットワーク②（クライアント用）］

1-2. 仮想マシンにNATネットワークを割り当てる
「設定」>「ネットワーク」
・サーバ
　アダプタ1に［サーバ用］NATネットワーク
・クライアントPC
　アダプタ1に［クライアント用］NATネットワーク
・仮想ルータ
　アダプタ1に［サーバ用］NATネットワーク
　アダプタ2に［クライアント用］NATネットワーク

1-3.仮想マシンでIPアドレスの設定
|  | サーバ | クライアント | 仮想ルータ |
| :-- | :-: | :-: | --: |
| IPアドレス | 172.16.0.10(16) | 172.17.0.10(16) | 172.16.255.254(16) <br> 172.17.255.254(16) |
| デフォルトGW | 172.16.255.254 | 172.17.255.254 | ― |
 
## 2. 仮想ルータの設定
仮想ルータ用のWindowsマシンでIPルーティングを有効化するだけでOK。

2-1. レジストリで「HKEY_LOCAL_MACHINE\SYSTEM\CurrentCntrolSet\Services\Tcpip\Prameters」の「IPEnableRouter」のデータを「1」に設定する

2-2. サービスで「Routing and Remote Access」を有効にして、サービスを開始する

## 3. Pingの疎通確認
それぞれのWindowsマシンのWindowsファイアウォールで、以下を有効に変更する。
・ファイルとプリンターの共有(エコー要求 – ICMPv4受信)
・ファイルとプリンターの共有(エコー要求 – ICMPv6受信)
・仮想マシンの監視(エコー要求 – ICMPv4受信)
・仮想マシンの監視(エコー要求 – ICMPv6受信)
※「仮想マシンの監視」も有効化しないと、サーバからクライアントPCにpingを打ったときに、タイムアウトする

クライアントPCから仮想ルータ&サーバ、
サーバから仮想ルータ&クライアントPCにpingが通るようになる。

## 参考にしたサイト
- [Windows Server をルータにする2つの方法（レジストリ or サービス）](https://turningp.jp/server-client/windows/windows-server-router)
Python Pillow を使って、画像のグレースケール/カラー を判別する




このケースでは、誤差許容のしきい値を 0.001 としている。0.01では誤判定が出るので。。

``` isgray.py
from PIL import Image, ,ImageStat

def is_grayscale(fn):
	im = Image.open(fn).convert("RGB")
	stat = ImageStat.Stat(im)

	if abs(sum(stat.sum)/3 - stat.sum[0]) < (stat.sum[0] * 0.001) :
		return True #yes, grayscale
	else:
		return False #no,  colorimg


is_grayscale("hoge.jpg")
```

# see also
* https://pillow.readthedocs.io/en/stable/reference/ImageStat.html
* https://answers.opencv.org/question/36288/how-to-know-grayscale-or-color-img-loaded/
プログラミングノート１週目

授業で学んだこと
HTMLとCSS、ウェブページの仕組み。
現場で使うテクニックや、ソフト・ツールについて。
・HTMLはWEBページの骨組みを作る物
　└　<>で囲まれたタグというもので構成される。
・CSSはページを装飾するもの
　└　Htmlファイルにstyleタグとして書くことも出来るし、
　　 別のCSSファイルで保存し読み込むことも出来る。
 　　現場ではCSSファイルで保存することがほとんど。
・GitHubにファイルを保存しWEB上に公開する。
　└　現場でのデータ管理は大体GitHubを通して行う。
　　 ターミナルなどを使いコマンドで操作できると便利なので覚えたほうがいい。

今回は細かいところを勉強するというより、変更を加えたらどこがどんな風に変わるのか。
テンプレートなどを用いてHTMLファイルをいじってみた。

今は大概ググると情報が出てくるので、
コードや、コマンドなどを丸暗記する必要はないが、仕組みを理解し、
自分が実装したいことなどを言語化し、調べて自己解決できることが大事。


難しかったこと、出来なかったこと
コマンドを使いGitHubにファイルをアップロードすること。
出来たかと思うが、確認の仕方がわからない。

手順メモ
cd （アップロードしたいファイルのあるディレクトリ）//作業フォルダ指定
git init　//？
git add .　//フォルダの中のファイルを認識させる？
git commit -m "変更した内容が分かるように英単語で記載"　//更新を保存？
git push origin master　// アップロード？masterは親権限なので、これは実際の開発環境では使わないらしい。また別のBranch？を作って操作するらしい。詳しいことはこれから・・・

途中で認証エラー（authentication failed）と403エラーが出た
認証エラーの原因は
2021年8月からIDとパスワードでの認証ができなくなったので、アクセストークンを発行しないとログインできなかった。
参考サイト
https://donachikiblog.com/github-authentication-failed/

403エラーは上記アクセストークン発行時に、権限にチェックを入れていなかったからか？
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333333313835392f66326537376465362d666338382d333462342d323466652d3162393665383538313438632e6a706567.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331859/15933c65-aff5-2a59-99fb-503db9e8ddf0.jpeg)


GUIで作ったブランチはmainだが、CUIでアップロードしたのはmasterだった？
ブランチとは何？

コマンドを使ってファイルはアップロードできているみたいだが、GUIでアップロードしたファイルは更新できていないのか？

来週の目標
・課題で出た部分をちゃんとできるようにする。
date_truncの使い方

4時間に１度実行するバッチを作成していて、4時間の間に更新されたデータを取得したい。
閾値として、0msecちょうどで更新日時を比較したい時にdate_truncを使用したので、その備忘録。
PostgreSQLで記述。

#### 秒で指定した場合
例1：now()=`2023-04-18 00:00:00.000000`の場合

```
date_trunc('second', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 20:00:00.000000
```

例2：now()=`2023-04-18 00:59:59.999999`の場合

```
date_trunc('second', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 20:59:59.000000
```

#### 分で指定した場合
例1：now()=`2023-04-18 00:00:00.000000`の場合

```
date_trunc('minute', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 20:00:00.000000
```

例2：now()=`2023-04-18 00:59:59.999999`の場合

```
date_trunc('minute', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 20:59:00.000000
```

#### 時間で指定した場合
例1：now()=`2023-04-18 00:00:00.000000`の場合

```
date_trunc('hour', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 20:00:00.000000
```

例2：now()=`2023-04-18 00:59:59.999999`の場合

```
date_trunc('hour', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 20:00:00.000000
```

#### 日付で指定した場合

例1：now()=`2023-04-18 00:00:00.000000`の場合
```
date_trunc('day', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 00:00:00.000000
```
例2：now()=`2023-04-18 00:59:59.999999`の場合
```
date_trunc('day', now() - cast('4 hours' as interval))
```
結果
```
2023-04-17 00:00:00.000000
```


#### 日時を指定する場合（余談）
now()ではなくて、指定した日時で比較したい場合
例：`2023-04-18 23:00:00.000000`を指定して、分以下を切り下げた場合
```
date_trunc('hour', timestamp '2023-04-18 23:00:00.000000' - interval '4 hours');
```
結果
```
2023-04-17 19:00:00.000000
```

### 参考
https://www.postgresql.jp/document/7.2/user/functions-datetime.html
GCPで簡易データ収集基盤作成

# はじめに
TwitterのAPIが無料だった時に構築していた簡易データ基盤の内容を記載しようと思う(供養)

# 構築した背景
以前、ある検査の分析を行っていており、ふとTwitterでその検査名を調べたところ結構参考になる感想がちらほら...
分析のインスピレーションになると考えデータ収集を決意

# 構成図・説明
## 構成図
![structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549822/1d9098ea-c9c8-d5cc-6ef0-fc311c709706.png)

## 説明
①Cloud FunctionsでTwitterAPIで特定の文字を含むツイートを収集。
②①を加工して、Bigqueryに格納。pandasでデータ加工後にBigqueryに書き込み。
※ 下記ライブラリでpandasをBigqueryに書き込み可能。

 https://pandas-gbq.readthedocs.io/en/latest/ 

③Cloud Schedulerで定期的にCloud Functionsを実行

# 感想
GCPを使うと簡単に低コストでデータ基盤が作成できるなと感動した。
また、実際に仮説立てやドメイン知識習得にも役立った。

集めたデータにアノテーションをしてより多くのツイートから関係のあるツイートを判別するモデルも作成しようと考えていたが、人手が足りず断念。
転職もあり今度は違うワードで構築しようとしたがまさかの知らせ。。。

https://service.aainc.co.jp/product/echoes/voices/0073#:~:text=Twitter%20API%E3%81%8C%E6%9C%89%E6%96%99%E5%8C%96%E3%80%82,-%E6%96%B0%E3%81%97%E3%81%84%E3%83%97%E3%83%A9%E3%83%B3%E3%81%A8&text=2023%E5%B9%B42%E6%9C%882,%E5%8C%96%E3%82%92%E7%99%BA%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82&text=%E3%81%9D%E3%81%AE%E5%BE%8C%E3%80%813%E6%9C%8830%E6%97%A5,%E6%98%8E%E3%82%89%E3%81%8B%E3%81%AB%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82&text=3%E6%9C%8830%E6%97%A5%E3%81%AB%E7%99%BA%E8%A1%A8%E3%81%95%E3%82%8C%E3%81%9F%E3%80%81%E6%96%B0%E3%83%97%E3%83%A9%E3%83%B3,%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

Twitterはデータの宝庫と思っていただけにこの知らせは悲しかった(ノД`;)
Pairクラスを使う

たまに思っていたこと

「1メソッドから戻り値が2つ（以上）ある時ってどう返せばいいんだ？」

例えば開始時間と終了時間が欲しいんだけどどうreturnに詰め込めばいいのか

Map使うとか、setter/getterクラス作るとかやってましたがapacheが入ってる場合はPairクラスってのがあるそうで

```
import org.apache.commons.lang3.tuple.Pair;

Pair<String, String> pa = Pair.of("from", "to");
pa.getLeft(); // "from"
pa.getRight(); // "to"
```

ちなみに3つならTripleというのもあります

便利ですねえ…しかしJavaUtilに加えてapacheだのフレームワークだの便利グッズが多すぎてなかなか覚えきれない
【AWS】VPCについて(自分用メモ)

# VPCとは
AWS上の仮想ネットワークです。
EC2等もこのVPC内に構築し、管理していく事になります。

このVPCに関連した用語について、サクッと見返せるようにメモしておきます。

| th | th |
|---|---|
|リージョン| 地域を指す。世界中で運用されている複数のデータセンターをまとめて、リージョンと呼ぶ。(東京リージョン等)|
|アベイラビリティーゾーン(AZ)| リージョン内に存在するデータセンターの集まり。1つのリージョン内にAZが複数存在する。|
|サブネット|ネットワークをセグメント化して管理出来る。サブネットはAZ単位で作成される。|
|インターネットゲートウェイ|インターネットに接続する際に、必要となる機能|
|ルートテーブル|ネットワークの経路についてのルールが定義されたテーブル。|
|プライベートサブネット| ルートテーブルで、インターネットゲートウェイへのルーティングが設定されている。|
|パブリックサブネット|ルートテーブルで、インターネットゲートウェイへのルーティングが許可されていない。
【Linux】tarコマンドで圧縮したアーカイブを作成する方法

## 圧縮したアーカイブの作成
```:ターミナル
$  tar cvzf アーカイブ名 対象ファイル1 対象ファイル2 ...
```

```:ターミナル
$ tar tar cvzf sample.tar.gz test_1.txt test_2.txt
```

## 圧縮したアーカイブの解凍及び展開
```:ターミナル
$  tar xvzf アーカイブ名 対象ファイル1 対象ファイル2 ...
```

```:ターミナル
$ tar tar xvzf sample.tar.gz
```
【新1、2年生向け】大学生がプログラミングで月30万稼ぐ方法

# 前置き
新入生の皆さん、ご入学おめでとうございます。

プログラミングでお金を稼ぐ方法を紹介していきます。
私自身が大学一年生のときからエンジニアとして働いていて
ありがたいことに、学業と両立しながら安定して月30万円を稼ぐことができています。

早いうちから行動してたらいいことがたくさんあるよ、という話をしようと思います。

# 自己紹介
 - 情報系学部4年
 - メガベンチャー内定
 - 大学１年6月からエンジニアインターン
 - フリーランスエンジニアとして受注
 
自分の少し人と違っている点はエンジニアのキャリアを始めるのがかなり早かったということと  
フリーランスとしても活動している点でしょうか。
就活を通して数多くの学生や大人に会いましたが、自分と同じような背景の人は一人もいませんでした。
ただ、難しいことをしたわけでも、才能があったわけでもなく早め早めで行動しただけです。
その要所要所に対して振り返りつつ、コメントを書いきます。

# さっさとインターンに行こう！

１つ目はさっさとインターンに行きましょうということです。
インターンと聞くとどういうイメージを持つでしょうか？
きっと、就職活動の一環として大学3年生が行くものという風に思うはず。

だからこそ早いうちからやっておくことにとても意味があります。

実際、就職活動において「大学1年生のときからIT企業でインターンをしている」というだけで、他学生に対してかなりの優位性を確保することができました。

プログラミングは独学者の9割程が挫折すると言われているため、独学では勝てる確率が小さいです。
幸い、年々プログラミングの学習ハードルは下がってきており、オンライン学習サービスの登場や、Chat CPTをうまく活用すれば
「大学１年生がインターンに内定する」程度の技術力は身につける事ができるでしょう。

独学は最小に留め、最短でインターン獲得に務めるといいと思います。

今すぐwantedlyなどから5社ほど面接のアポ希望を出してみてください。
もし、採用されなくても、フィードバックなどは得られるでしょうし、
自分に足りていないものを洗い出して次に備えましょう。

## 余談

エンジニアバイトの良い点を列挙してみようと思います
- 時給高め(￥1500~￥2500)
- シフト制限なし
- 学びだらけ
- キャリア形成
- リモートは大学生の見方

大学１年生の皆さんはこの先4年間、飲食店や塾講師をしている友人からバイト辞めたい話をたくさん聞くことになるでしょう。シフトに入りたいのに入れなかったり、お客さんに悪態を疲れたりと。
自分のエンジニアインターンと掛け持ちして、塾講師や飲食店で働いていた時期がありますが、
正直もう絶対やりたくないです笑
リモート勤務ができるというだけで、夢のようはないですか？？
以上、余談でした。

# フリーランスに手を出してみよう！

学業と両立するという前提があるため、インターンだけで月30万を稼ぐ事は難しいです。
そのため、私はフリーランスとして稼ぐ事をおすすめします。

インターンを初めて半年程がたった頃、技術力はある程度向上しているはずなので、
一旦ここでlancersやcrowdworksなどのフリーランスの案件紹介サイトを覗いてみるといいです。
自分でもできそうな案件がいくつかはあるはずです。
もしなければ、案件の内容を意識しながら、日々の業務に取り組んで一月後にまたのぞいてみてください。

# さらなる高みへ

フリーランスとして活動ができるようになれば、学業と両立しつつ、月に30万程度は稼ぐことが
できるエンジニアになっているはず。是非そこからは個人開発に挑戦してほしいです。友人を誘って一緒にプロダクトを作るのでもいいですし、完全に一人でやってもいいです。

なんのためにやるかというと、
- 技術領域を広げるため
- ワンちゃん当てる

一人ないしは、数人で開発するとなると多くのことを担当せざるを得ません。
かなりの学びがあることでしょう。個人でリリースしたことがあるエンジニアとそうではないエンジニアでは雲泥の差があると思います。

個人開発でマネタイズするのはとても難しいので、稼ぐことを第一目標にはせず、稼げたらいいねぐらいのスタンスでいると続きやすいです。数作っていればヒットが生まれるかもしれません。

# 最後に

才能はいらないなどと最初に書きましたが、「プログラミングが好き」であることは絶対に必要だと思います。大好きぐらいだとなお良いです。
なんとなくプログラミングで楽に稼ぎたいという人には当てはまらない話だと思います。
ただ、最初に言ったように、プログラミングが好きな人であれば、30万ぐらいすぐ稼ぐようになれるでしょうし、好きなことでお金を稼げるってとても幸せな事だと思います。

twitterもありますので、あれな人はあれしていただけると嬉しいです。
<https://twitter.com/shuyafukushima>
頑張ってください。
AZ-104: 合格体験記

## はじめに
久しぶりの投稿。
メモ書きみたいな感じですが、誰かの参考になれば。

## 前提条件
- 経験
    エンジニア歴1年未満。(実務経験ほぼなし。)
- 保有資格
    - AZ-900
    - 基本情報技術者試験
    - AWS SAA

...など

### 受験情報

- 受験日: 2023/04/16

## 学習時間

- 期間: 2023/2/10 〜 2023/4/16
- 時間: 70時間くらい（かなり曖昧）

## 教材
- Udemy

https://www.udemy.com/course/az-104-microsoft-azure-administrator-jp/

https://www.udemy.com/course/az-104azure-administrator-associate/


- 書籍

https://book.impress.co.jp/books/1120101160


- Microsoft Learn
・ラーニングパス
・模擬問題

## 勉強方法

- 通勤などの隙間時間を中心に、黒本やUdemyの模擬試験を回す。(黒本: 約4周、模擬試験: 3周)
- 土日などある程度まとまった時間が取れる日は、Udemyの動画講座をみながら、Azureを触る。
- 試験前は、公式の模擬試験を4周。(英語なので、翻訳しながらがめんどくさかった。)

## 所感

- 試験自体は実技的な問題があると聞いていたが無かった。（ケーススタディが1つあったくらい）
- Udemyに良い模擬問題がなく、演習があまりできていなくて不安だった。（ネットにあがっているおすすめの模擬試験は、なぜか公開停止…）
私が購入したものは、レビューにも書かれているがやさしめの問題が多かった。
- 試験の難易度は、公式の模擬試験と同じくらい、もしくは、少し難しい程度。（あくまでも個人の感覚）

どれもひとつだけでは合格は難しいと思うので、満遍なくやるのが良いかと。


## さいごに
最後まで見ていただき、ありがとうございました。
ターミナルにGoogle Cloud SDKを追加する方法

Windowsのターミナルに、Google Cloud SDKのPowerShellを追加する方法のメモ。コマンドプロンプト版でもショートカットの情報をきちんとエスケープして真似ることで可能。Google Cloud SDKに限らずほかでも一緒。例えばAnacondaとか。

壊れないように、下記の手順でjsonを開いたときにバックアップを取っておくとよい。

# 手順
1. ターミナルを開く
2. `Ctrl+Shift+,`を押して、settings.jsonをテキストエディタで開く
    - ここでVisual Studioとかが開いて、編集できない人、好きなテキストエディタで開きたい人は、後述の**追加１**へ。
3. jsonの"profiles">"list"に、Google Cloud SDKを追加する。
    - 基本的に、もとからある`{}`を見ながら、似たような感じで真似して作る。
    - また各種設定は、スタートメニューのショートカットから情報を得る。
        - ショートカットから情報を得る方法は、後述の**追加２**へ。
    1. `{}`を１つ追加する。（カンマも適切に入れる）
    1. 新しい"guid"を得る
        - 新しいguidを取得する方法は、後述の**追加３**へ。
    1. `{}`内に要素を追加
        - `"hidden": false`
        - `"name": "Google Cloud Tools for PowerShell"`
            - 自分がわかればなんでもよい
        - `"startingDirectory": "C:\\Program Files (x86)\\Google\\Cloud SDK"`
            - 上記は私の環境。自分のショートカットの情報に合わせること。
        - `"commandline": "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -ExecutionPolicy Bypass -File \"C:\\Program Files (x86)\\Google\\Cloud SDK\\google-cloud-sdk\\platform\\PowerShell\\GoogleCloud\\BootstrapCloudToolsForPowerShell.ps1\""`
            - 上記は私の環境。自分のショートカットの情報に合わせること。
            - `\`は`\\`へ、`"`は`\"`へ、変更（`\`を追加）してエスケープする。
            - 他のショートカットを真似るとき用のメモ
                - `'`、`&`はエスケープ不要
4. 保存して閉じる
5. ターミナルを再起動して、選択して起動確認。



# 追加１：ターミナルの設定ファイルをテキストエディタで開く方法
1. Windowsの左下の検索欄で、「拡張子」で検索
2. 設定＞「ファイルの種類ごとに規定のアプリ」を選ぶ
    - 開くと、「名前」と「規定のアプリ」がずらーっと表示される。
    - 「名前」は、ピリオドで始まる英数字で、これが拡張子。
    - その拡張子の場合に開くプログラムがが右の「既定のアプリ」。
3. スクロールして「.json」を探す
4. 「.json」に対応するプログラムをクリックして、好きなテキストエディタに変更する

# 追加２：Google Cloud SDKのショートカットの情報を得る方法
1. スタートメニューのGoogle Cloud SDK＞Cloud Tools for PowerShellを右クリック
1. その他＞ファイルの場所を開く
1. Cloud Tools for PowerShellを右クリック＞プロパティ
    - リンク先が、"command"にあたる
    - 作業フォルダが、"startingDirectory"にあたる

# 追加３：新しいguidを取得する方法
1. PowerShellを開く
1. `powershell -Command "[Guid]::NewGuid()"`
GitHub入門：初めてのリポジトリ作成からコード管理までの手順

# 1. GitHubとは何か
GitHubは、オープンソースのバージョン管理システムです。コードの共有や管理に使われることが多く、プログラマーや開発者にとって必要不可欠なツールとなっています。

# 2. GitHubの主な機能
GitHubには、以下のような主な機能があります。

## 2.1. リポジトリ
リポジトリは、ファイルやプログラムの保存場所です。GitHubでは、個人的なプロジェクトだけでなく、多数の人がアクセス可能なオープンソースプロジェクトもあります。

## 2.2. コード管理
GitHubを使うことで、コードのバージョン管理が簡単にできます。変更履歴を確認したり、以前のバージョンに戻したりすることができます。

## 2.3. コラボレーション
複数人でプロジェクトを進める場合、GitHubを使ってコラボレーションを行うことができます。チームメンバーとのコミュニケーションや、ブランチを使った開発などが可能です。

## 2.4. イシュー管理
イシューは、問題やバグなどの報告や、改善提案などを管理する機能です。イシューを使って、開発の進捗状況を管理することができます。

# 3. GitHubの使い方
GitHubの使い方について、基本的な手順を以下に説明します。

## 3.1. アカウントの作成
GitHubを使うには、アカウントの作成が必要です。GitHubの公式サイトにアクセスして、アカウントを作成しましょう。

## 3.2. リポジトリの作成
アカウントを作成したら、リポジトリを作成します。GitHubのホーム画面にある「New repository」ボタンをクリックし、必要事項を入力してリポジトリを作成します。

## 3.3. ファイルのアップロード
リポジトリを作成したら、ファイルをアップロードします。GitHubのホーム画面にある「Upload files」ボタンをクリックし、アップロードするファイルを選択してアップロードしましょう。

## 3.4. コードの管理
GitHubを使うことで、コードのバージョン管理が簡単に行えます。変更履歴を確認するには「commits」を、以前のバージョンに戻るには「revert」を使います。

## 3.5. コラボレーション
リポジトリの共有やコラボレーションをする場合、他のユーザーをリポジトリに招待することができます。また、ブランチを使って複数人で同時に開発を進めることもできます。

## 3.6. イシュー管理
イシューは、問題やバグの報告、改善提案などを管理する機能です。イシューを使って、開発の進捗状況を管理することができます。

# 4. まとめ
GitHubは、プログラマーや開発者にとって欠かせないツールの1つです。リポジトリやコード管理、コラボレーション、イシュー管理など、様々な機能があります。この記事を参考にして、GitHubを上手に活用して効率的な開発を行いましょう。
【Marketo】フォームに住所自動入力機能を持たせ、チャットのような動きをさせる

なかなか自由度が低くデザインもイケているとは言い難いMarketoフォームです。
cssをゴリゴリにカスタマイズした上、1秒でも速く送信ボタンを押下してもらいたい・・ということでやってみました。
サンプルは<a href="https://start.willof-construction.co.jp/entry/?utm_source=qiita&utm_medium=article&utm_campaign=april" target="_blank">こちら</a>です

<b>やること:
1.郵便番号入力で市区町村まで自動入力
2.チャットのような動きをつける</b>

<h2>1.郵便番号入力で市区町村まで自動入力</h2>

<h3>Marketoフォーム埋め込みフォームを任意のページに設置</h3>

id="mktoForm_0000"と、"000-MDO-000"の箇所は自社のものになりますね。

```html:page.php
<main id="js-form" class="form_wrapper">
<script src="//ma.sekokan-navi.jp/js/forms2/js/forms2.min.js"></script>
<form id="mktoForm_0000"></form>
<script>MktoForms2.loadForm("//ma.sekokan-navi.jp", "000-MDO-000", 3945);</script>
</main>
```

<h4>上記ページが読み込むフッターに下記コードを設置</h4>

```html:footer.php
  <!--mktform 住所自動入力-->
    <script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>
    <script type="text/javascript">
        MktoForms2.onFormRender(function (form) {
        //差し替え箇所スタート
            if (!!document.getElementById("yuubinbangou_mikeiken__c")) {
                document.getElementById("yuubinbangou_mikeiken__c").onkeyup = function () {
                    AjaxZip3.zip2addr('yuubinbangou_mikeiken__c', '', 'Todofuken__c',
                        'shikuchoson_mikeiken__c')
        //差し替え箇所おわり
                }
            } else {
                console.log("noPostalCode")
            };
        });
    </script>
```
<h4>IDの差し替え</h4>

開発ツールでフォームに設置した下記3つのフィールドIDを調べ、上記コードの中で差し替えます。
私の場合は下記のようになっていました。

・郵便番号：yuubinbangou_mikeiken__c 
・都道府県：Todofuken__c
・市区町村：shikuchoson_mikeiken__C

これで動作するはずです。


<h2>2.チャットのような動きをつける</h2>

Marketoフォームの機能の「表示設定ルール」によって起こるイベントとjQueryを掛け合わせたものです。

<b>表示設定ルール:</b>
設問〇〇が〇〇なら表示する/しない、などと設定できるもので、Marketo>フォーム>下書きの編集>フォームの設定 の右側サイドバーの中にいます。
今回はこの動作を連続して設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2295479/97ba75fb-c477-ce27-5491-5ed8ecb5d84d.png)

<h3>イベントが起こったら</h3>

#js-formをスクロールさせてね、としています。
これを同じくフッターに書いておきます。
ヌルっと動くようcss側で指定しておくのも良きでしょう。


```html:footer.php
    <!-- like_chat_form_script -->
    <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js'></script>
    <script src="./script.js"></script>
    <script>
        $(function () {
            window.MktoForms2.onFormRender(function () {
                console.log($("#js-form"));
                $("#js-form").scrollTop($("#js-form")[0].scrollHeight);
            });
        });
    </script>

```

話が前後してしまいましたが、フォームは上記のidのjs-formをつけたdivで囲っておきます。

```html:footer.php
<div id="js-form" class="form_wrapper">
 <!--フォーム入れるところ-->
</div>
```

これで若干無理やり気味のチャット風なMarketoフォームが出来ました！
入力率もグっっと上がったようです！
この方法はこちらの素晴らしいMentaのメンターさんに指導していただき実現しました。
<a href="https://menta.work/user/22846">KOICHIさん</a>
【Vue.js】基礎知識

## 概要
実務でVue.jsの開発業務に携わることになったので、勉強したことをアウトプットとして書いていきます。

## Vue.jsとは
Vue.jsは、フロントエンドのJavaScriptフレームワークの1つであり、UIコンポーネントを構築するためのライブラリです。Vue.jsは、単一ファイルコンポーネント (SFC) と呼ばれる、HTML、JavaScript、CSSを1つのファイルにまとめたファイル形式を採用しています。

## Vue.jsの特徴・メリット
**・軽量でシンプルな構文であること**
ReactやAngularなどに比べて、軽量であり、高速なレンダリングを行うことができるため、比較的小規模なプロジェクトを作成するのに向いています。

**・リアクティブデータバインディング**
Vue.jsは、リアクティブデータバインディングを採用しており、モデルの変更を自動的に反映することができます。これにより、開発者は手動でDOMを更新する必要がなくなり、開発効率が向上します。

**・コンポーネントベースのアーキテクチャ**
Vue.jsは、コンポーネントベースのアーキテクチャを採用しており、UIを小さな部品に分割することができます。これにより、コードの再利用性が高まり、保守性が向上します。

**・拡張性が高い**
Vue.jsは、プラグインシステムを備えており、必要に応じて機能を追加することができます。また、他のライブラリやフレームワークとの組み合わせも容易であり、柔軟性が高いと言えます。

## Vue.jsのデメリット
**・コミュニティがまだ発展途上**
 ReactやAngularと比較して、Vue.jsの生態系はまだ小さく、コミュニティも発展途上にあるため、情報収集が難しい場合があります。

**・小規模プロジェクト向けのフレームワーク**
 Vue.jsは小規模なプロジェクト向けのフレームワークであり、大規模なアプリケーションを開発する場合には、アーキテクチャの設計が必要となります。

**・サポートされていないブラウザがある** 
Vue.jsは、一部の古いブラウザでサポートされていない場合があります。特に、Internet Explorerの古いバージョンでは動作しない場合があります。
## 単一ファイルコンポーネントとは
先ほど説明した、単一ファイルコンポーネント形は以下のように記述していきます。
```
<template>
   HTMLを記入
</template>
<script>
JavaScriptを記入
</script>
<style scoped>
   //CSSを記入
</style>
```

というように、HTML,CSS,JaavaScriptを一つのファイルで、まとめて書くことができ、これを別のファイルで呼び出して使うことができます。
「scoped」というのは、このファイル内でしか適用されないCSSにするという宣言になります。
開発の中で、クラス名が被ったりしても、ファイルごとにCSSを書くことができるので、とても便利な機能だと思います。
なので、全てのファイルに適用させる処理を書くApp.vueには「scoped」は書くことはないです。

## インストール方法
node.jsをインストールして、以下のコマンドを実行していきます。
```
npm install -g @vue/cli
```
インストールが成功したら、以下のコマンドを実行して、インストールされているか確認します。
```
vue --version
@vue/cli 5.0.8
```
このように表示されたらOKです。
もしも、vueがインストールされていないというエラーが出た場合は、PATHが通っていない可能性があるので、確認してみましょう。

## 最後に
まだVueを触り始めて、一週間ほどですが、少しずつ学んだことを書いていこうと思います。
LocalDateTimeで指定日の23時59分59秒を作る

散々悩んだ結果先輩がサラっと作っていた、精進が足りない

```
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime ldt = localDateTime.truncatedTo(ChronoUnit.DAYS).plusDays(1).minusSeconds(1);
```

ついでに、LocalDateTime型→Date型にする場合

```
public static final ZoneId ZONE = ZoneId.of("Asia/Tokyo");
    
ZonedDateTime zonedDateTime = ldt.atZone(ZONE);
Date date = Date.from(zonedDateTime.toInstant());
```

これpaizaでやるとUTC時間になるの何でだろう、now()時点ではJST時間なのに
RubyでAtCoder ABC298(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC298のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Job Interview
https://atcoder.jp/contests/abc298/tasks/abc298_a
```ruby:a-298.rb
n = gets.to_i
s = gets.chomp.chars
puts s.include?("o") && !s.include?("x") ? "Yes" : "No"
```
## 解説
問題文の通りに実装すればOKです。

# B - Coloring Matrix
https://atcoder.jp/contests/abc298/tasks/abc298_b
```ruby:b-298.rb
n = gets.to_i
a_array = Array.new(n) { gets.split.map(&:to_i) }
b_array = Array.new(n) { gets.split.map(&:to_i) }

4.times do |i|
    flag = true
    n.times do |j|
        n.times do |k|
            flag = false if a_array[j][k] == 1 && b_array[j][k] != 1
        end
    end
    if flag
        puts "Yes"
        exit
    end
    a_array = a_array.reverse.transpose
end
puts "No"
```
## 解説
4回の操作で元に戻るので繰り返すのは4回だけで大丈夫です。また、回転は、reverseメソッドとtransposeメソッドを使って再現しています。

# C - Cards Query Problem
https://atcoder.jp/contests/abc298/tasks/abc298_c
```ruby:c-298.rb
n = gets.to_i
q = gets.to_i
boxes = Hash.new{|h, k| h[k] = []}
cards = Hash.new{|h, k| h[k] = []}

q.times do
    t, i, j = gets.split.map(&:to_i)
    case t
    when 1
        boxes[j] << i
        cards[i] << j
    when 2
        boxes[i].sort!
        puts boxes[i].join(" ")
    when 3
        cards[i].uniq!
        cards[i].sort!
        puts cards[i].join(" ")
    end
end
```
## 解説
（他の方の提出結果を参考にしました）

箱に関する情報とカードに関する情報を保持する配列をそれぞれboxes、cardsとして用意していき、問題文の通りに情報を更新していくことで実装することができます。なお、`cards[i].uniq.sort.join(" ")`のように書くとTLEしてしまいます。破壊的メソッドを使うことでTLEは解消できるようです（データのコピーのせいで時間超過になってしまうのかな？）。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
投稿ページを作成する #1

# 目的

今日は、今週投稿機能を作るために大枠だけ作ることが目的です。
何もないところから平日に始めるのはしんどいので。


# 今回やること

今回の目標は以下の3つ。
* 投稿ページを作る
* ルーティングを設定する
* 画面遷移を設定する


# 環境
* windows 10
* ruby 3.0.4
* rails 6


# いざ出陣

## 投稿ページの作成
前提、これまでにユーザーモデルとコミュニティモデルは作成済みです。

まず、app → views → communities に new.html.erb を作成し、以下のコードを入力します。

```html:app\views\communities\new.html.erb
<h1>コミュニティを作成</h1>
<%= form_for @Community do |f| %>
  <div class="field">
    <%= f.label :eventname %>
    <%= f.text_field :eventname, :size => 100 %>
  </div>
  <%= f.submit "作成する" %>
<% end %>
```

### link_to
これは、リンクを付けるためのやつです。
コマンドラインで `rails routes` を実行して出てきた `Prefix`（接頭辞）というものに  `_path`をつけてパスとして扱うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/0f72fbdd-a124-5901-a159-53362b4c53c3.png)


## ルーティングを設定する

```ruby:config\routes.rb
Rails.application.routes.draw do
  devise_for :users
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  resources :users
  resources :communities    # これを追加
  root   'users#index'
end
```

## 画面遷移を設定する
とりあえず以下のようにlinkを貼ります。
```html:app\views\users\index.html.erb
<%= link_to "コミュニティの作成", new_community_path %>
```
```html:app\views\communities\new.html.erb
<%= link_to "マイページに戻る", users_path %>
```


・投稿ページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/0874f90e-6951-e1cc-9896-2236e3b525fe.png)

・マイページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/1b7897d8-f33a-0a60-6882-63e174608baa.png)


# 余談
これはさすがに秒でできました。
次やりたいことをイメージ出来た状態で作業止めると、次のやる気も出ますよね。
机に向かうまでが問題なので。
No14_ググったこと投稿(5分)_SQL問題

Twitterを見ていたら気になったツイートが

https://twitter.com/sakamoto_582/status/1647882827378352128

次のテーブルの3番目にscoreが高い生徒(students)をSELECTせよ。

ほぅ。。
解いてみた


## 問題のSQL
```
CREATE TABLE students (
 id INTEGER,
 name VARCHAR(128),
 score INTEGER
);

INSERT INTO students (id, name, score)
VALUES (1, 'Alice', 85),
       (2, 'Bob', 90),
       (3, 'Charlie', 88),
       (4, 'Mark', 82);
```


## 自分が思いついた回答
```
  SELECT score FROM students
  ORDER BY score DESC
  LIMIT 1 OFFSET 2
```

### TLに書いてあった回答
おしい・・・

```
①
SELECT * FROM students WHERE score = (
  SELECT DISTINCT score FROM students
  ORDER BY score DESC
  LIMIT 1 OFFSET 2);
 ```

```
②WITH句とDENSE_RANK関数を活用
WITH ranked_students AS (
  SELECT * DENSE_RANK() OVER (ORDER BY score DESC ) AS rank FROM students
)
  SELECT id, name, score 
  FROM ranked_students
  WHERE rank = 3
  LIMIT 1;
```

WITHはわかるけどDENSE_RANK関数？
調べた感じOracleで使われる関数ぽい
https://segakuin.com/oracle/function/dense_rank.html
Excel AI で無限に単語帳を作る / LABS.GENERATIVEAI

# はじめに

先日 Office Copilot が発表され、一般公開が待ちきれないので、先行的に公開されている Excel Labs という Microsoft 謹製 Excel アドインを試してみました。このアドオンを入れると `LABS.GENERATIVEAI()` という関数が使えるようになり、OpenAI API Key を噛ませると Excel 数式から気軽に fetch できます。

- [Microsoft AppSource](https://appsource.microsoft.com/ja-jp/?exp=ubp8) ← "Excel Labs" で検索
- [microsoft/Excel-Labs - GitHub](https://github.com/microsoft/Excel-Labs/)
-  [Microsoft、「Excel Labs」を発表 ～開発初期のアイデアを詰め込んだ実験アドイン - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1493394.html)
- [API keys - OpenAI API](https://platform.openai.com/account/api-keys)

Windows ユーザは Office365 もしくは Web 版 Excel でのみ利用できるようです。

AppSource のレビューを見る限り、同梱されている Advanced formula environment はおおむね大好評な一方、 LABS.GENERATIVEAI は全体的に不評です。まだまだお遊び段階の機能ですね。この記事では手近な活用例として、 **LABS.GENERATIVEAI を利用して大規模言語モデルから無限に単語帳を作成** します。


# LABS.GENERATIVEAI

以下の書式が定義されています。アドインのサイドバーからデフォルト値を変更することもできます。

```
LABS.GENERATIVEAI(prompt, [temperature], [max_tokens], [model])
```

- `prompt`: AI モデルへの入力文字列を指定します。
- `temperature`: いわゆる結果のランダム性を示すパラメタです（デフォルト 0.5）
- `max_tokens`: レスポンスの最大トークン長を指定します（デフォルト 256） 
- `model`: 使用する言語モデルです（`gpt-3.5-turbo` など）。


## 注意点

- APIのレスポンスを待っている間は `#Bビジー!` （英語版だと `#BUSY!` ）と表示されるので、しばらく待ちましょう。
- **当該セルもしくは参照セル** の内容が変更されるたびに再計算されます。言い換えると、そのたびに API コールが発生し、課金が発生します。
- レスポンスのデフォルト最大長は 256 トークンに設定されています。用途に応じて調整しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526487/1d55e7c5-9580-cf17-1e3c-9cc26055bc85.png)

# 単語帳のつくりかた

1. 対訳を作りたい言語名を入力する欄を用意します（ここでは`A2`, `B2`）。
1. 単語帳のテーマを入力する欄を用意します（ここでは `C2`）。
1. 出力したい単語対の数を入力する欄を用意します（ここでは `D2`）。
1. 以下の数式を適当なセルにセットすれば完成です。

```
=TEXTSPLIT(LABS.GENERATIVEAI(A2&"と"&B2&"のシソーラスを作ります。テーマ「"&C2&"」に対して、対訳フレーズを"&D2&"組出力してください。出力形式は、フレーズ同士がカンマ区切り、フレーズ組同士がセミコロン区切りです。説明文をつけず結果のみ出力してください。"),",",";")
```

プロンプトで出力形式を制限してやることで、処理が容易なレスポンスが得られます。`TEXTSPLIT` 関数を使ってパースすれば結果を配列としてうまくスピルしてくれますので、以下のような形式で単語帳が自動生成されることになります（言語の前後関係が逆転しているのはご愛敬）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526487/53278fea-d965-fffb-3f4f-045bee0aa32d.png)

上述の通り、どれか一つのセルを変更すると単語帳が更新されるので、手軽に量を増やしていけます。繰り返すとカブリが出るので、`max_tokens` パラメタを長くすると効率的ですね。

ただ、上の適当なプロンプトだとしばしばレスポンスの形式が乱れて、分析に失敗してしまいます。日本語-英語のペアだとよく成功しますが、日本語-トルコ語などやや頻度の落ちる組合せだと特に失敗する確率が大きくなります。そのへんは改良の余地アリですね。

## おわりに

`LABS.GENERATIVEAI` については別途包括的な記事を書き始めていましたが、仕事でまとまった時間がとれそうにないので、クイックに利用法のひとつを記事にしてみました。類似したフレーズの抽出は大規模言語モデルの特性のひとつだと思っており、方向性としてはなかなか良いのではないかと思います。もちろん、どこかの本当の単語帳を学習した結果かもしれませんが……。
SwiftUIを使ってOpenAI GPT-3チャットアプリを作成する

# SwiftUIを使ってOpenAI GPT-3チャットアプリを作成する

この記事では、SwiftUIを使ってOpenAI GPT-3とのチャットアプリを作成する方法を紹介します。このアプリでは、OpenAISwiftライブラリを使用してGPT-3とコミュニケーションを行います。

![Simulator Screen OpenAI API iPhone 14 - 2023-05-02 at 18.35.41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112239/70031712-d489-f4f2-1526-45956eb0f316.gif)


## 前提条件

この記事で取り上げるコードは、SwiftUIとOpenAISwiftを利用しています。事前に以下の手順が必要です。

1. Xcodeのインストール
2. SwiftUIの知識
3. OpenAISwiftライブラリのインストール

## コードの説明

### インポート

まず、SwiftUIとOpenAISwiftをインポートします。

```swift
import SwiftUI
import OpenAISwift
```
### ViewModelクラス

次に、ViewModelクラスを作成し、ObservableObjectプロトコルを実装します。このクラスでは、setUp()メソッドでOpenAIクライアントを初期化し、send()メソッドでGPT-3にテキストを送信して応答を受け取ります。

```swift
class ViewMOdel: ObservableObject {
    private var client:OpenAISwift?
    
    func setUp () {
        client = OpenAISwift(authToken: "your_auth_token_here")
    }
    
    func send(text: String, completion: @escaping (String) -> Void) {
        client?.sendCompletion(with: text, model:.gpt3(.davinci), maxTokens: 500, completionHandler: { result in
            switch result {
            case .success(let model):
                if let output = model.choices.first?.text {
                    completion(output)
                } else {
                    completion("エラー: 応答テキストが取得できませんでした。")
                }
            case .failure(let error):
                completion("エラー: \(error.localizedDescription)")
            }
        })
    }
}
```

# ContentView構造体
最後に、ContentView構造体を作成します。この構造体は、テキスト入力フィールドと送信ボタンを作成します。するとユーザーがテキストを入力して送信すると、GPT-3からの応答が表示されます。

# 参考リンク
https://www.youtube.com/watch?v=bUDCW2NeO8Y&t=33