OmniAICreator/Qiita-1.07M huggingface dataset:
Javaで「指定範囲の部分文字列を別の文字列に置換する」の動作を確認してみた

# 概要

Javaで「指定範囲の部分文字列を別の文字列に置換する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stringbuilder/index4.html

# 実装

以下のファイルを作成しました。
```JSample4_1.java
class JSample4_1{
  public static void main(String[] args){
    StringBuilder sb = new StringBuilder();

    sb.append("ABCDEF");
    System.out.println(sb.toString());

    sb.replace(2, 4, "12345");
    System.out.println(sb.toString());

    sb.replace(1, sb.length() - 1, "-");
    System.out.println(sb.toString());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample4_1.java 
$ java JSample4_1 
ABCDEF
AB12345EF
A-F
```

# まとめ

何かの役に立てばと。
How to Extract Data from Zomato API?

![How-to-Extract-Data-from-Zomato-API.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480765/2f64ee05-4140-80c0-bd40-05eed3ccbe7d.jpeg)



How-to-Extract-Data-from-Zomato-API
Introduction
In the world of culinary delights, Zomato stands tall as one of the most popular platforms, offering a treasure trove of information about restaurants across various cities. With its rich and extensive API, we can extract valuable data on citywide restaurants listed on Zomato. In this blog, we will explore the process of accessing the Zomato API, extracting restaurant data for multiple cities, and creating a comprehensive CSV file that organizes this data efficiently.

Prerequisites
Before diving into the data extraction process, make sure you have the following:

A valid Zomato API key: To access Zomato's API, you need an API key, which you can obtain by signing up on their developer platform.

Python Environment: Ensure you have Python installed on your system and the necessary libraries, such as requests and pandas.

Step 1: Accessing the Zomato API
To get started, import the required libraries in your Python script:

Accessing-the-Zomato-API
Next, set up your Zomato API key:

api_key = "YOUR_ZOMATO_API_KEY"

Step 2: Extracting Citywise Restaurant Data
Now, let's create a function to fetch the restaurant data for a specific city:

Extracting-Citywise-Restaurant-Data
The get_restaurants() function inputs the city's name and returns a list of restaurants in JSON format.

Step 3: Looping Through Multiple Cities
To create a comprehensive dataset, we can loop through a list of cities and extract restaurant data for each city:

Looping-Through-Multiple-Cities
In this function, the city is a list of city names you want to extract data. The function returns a list of restaurant details for all the cities combined.

Step 4: Saving the Data to a CSV File
Finally, we can use pandas to convert the extracted data into a CSV file:

Saving-the-Data-to-a-CSV-File
The save_to_csv() function takes the restaurant data and the desired file name as input and saves the data to a CSV file.

Step 5: Putting It All Together
Now that we have all the necessary functions let's run the entire process:

Putting-It-All-Together
In this example, we have chosen five cities for illustration. You can customize the cities_list to include any cities of your choice.

Conclusion
Congratulations! You have successfully extracted restaurant data from the Zomato API for multiple cities and created a comprehensive CSV file. With this CSV dataset, you can perform further analyses, visualize trends, or even build exciting applications based on citywide restaurant information.

Exploring the vast world of gastronomy through the Zomato API opens up endless possibilities for restaurant enthusiasts, data analysts, and developers alike. Enjoy discovering new culinary wonders and happy data exploration!

For more details, contact Actowiz Solutions now! You can also reach us for all your mobile app scraping, instant data scraper and web scraping service requirements.
SOURCES >> https://www.actowizsolutions.com/extract-data-from-zomato-api.php
react+自動テスト環境のテンプレートリポジトリを作る


## はじめに
フロントエンドの自動テストまわりの記事を書くことが増えてきたので、 react + 自動テストのテンプレートリポジトリを作ろうと思い至りました。
<!-- textlint-disable -->
また、毎回環境構築から開始すると記事を書くことのハードルが高くなるので、テンプレートを活用してさらに記事の記事の更新頻度を高められたらと思います。
<!-- textlint-enable -->

## テンプレートリポジトリとは
既存のリポジトリをテンプレート化して、あなたや他の人が、同じディレクトリ構造、ブランチ、ファイルを持つ新しいリポジトリ作成できるようにできる GitHub の機能です。

## リポジトリの紹介

https://github.com/diskszk/react-testing-boilerplate

今回作成したテンプレートリポジトリは以下のライブラリを使用しており、 フロントエンドの開発環境および、自動テスト環境を備えています。

```json
{
  "react": "^18.2.0",
  "typescript": "^5.0.2",
  "vite": "^4.4.5",
  "vitest": "^0.34.6",
  "@testing-library/react": "^14.0.0",
  "@testing-library/react-hooks": "^8.0.1",
  "@testing-library/user-event": "^14.5.1",
  "axios": "^1.5.1",
  "msw": "^1.3.2",
  "eslint": "^8.45.0",
}
```

## テンプレートリポジトリの作成

https://docs.github.com/ja/repositories/creating-and-managing-repositories/creating-a-template-repository

テンプレートリポジトリの作成方法はとても簡単で、 GitHub 上でテンプレート化したいリポジトリのヘッダーから `Settings` を選択します。

![ 2023-10-05 15.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639130/f0994cba-5ea7-4c8d-555e-c022fcb46fec.png)

`Template repository` のチェックボックスにチェックを入れればテンプレート化できます。

## テンプレートリポジトリを使う

https://docs.github.com/ja/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template

使用したいテンプレートのリポジトリへアクセスし、 `Use this template` を選択します。

![ 2023-10-05 15.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639130/b48cfa94-5348-4a06-2dee-63f901d25221.png)

GitHub Cli を使う場合は `--template <repository>` とコマンド入力すれば　GitHub 上にテンプレートを元にしたリポジトリを作成できます。

例として、今回私が作成したテンプレートリポジトリを使う場合は以下のコマンドになります。

```bash
$ gh repo create my-repo --private --template https://github.com/diskszk/react-testing-boilerplate.git
```
IT PMO２年生がやってみた！～Pleasanter(プリザンター)を使った社内改善ツールの構築～

<h2>目次</h2>
<p>1．自己紹介<br>
2．そもそもPleasanterとは何か？<br>
3．Pleasanterが利用可能なスペック<br>
4．おわりに</p>

<h2>自己紹介</h2>
はじめまして♪<br>
今回から数回に分けてITPMO2年生社員が贈るPleasanterの基礎として、Pleasanterの用語や機能、また取り扱う場合の実事例をご紹介していきます。<br>
<br>記事を担当させていただく金子です。シストリーに入社して、PMO歴として1年と数か月がたちました。<br>
<br>エンジニアとしての経験は乏しく、広く浅くといった形でプログラミング(HTML , CSS, Python , PHPなど)やインフラ(主にHW、クラウド知見もあり)周りの業務に携わってきました。
開発ばかりやってきた人間です。<br>
<br>PMおよびPMOとしてはひよっこレベルですが、人に伝わるように意識はしてきたつもりです。
そんな私がご紹介するPleasanter。拙いところもあるかと思いますが、ぜひ、最後までお付き合いください！

<h2>そもそもPleasanterとは何か？</h2>
PleasanterはOSSのノーコード・ローコード開発ツールです。
Excelでの管理ものは全般的に置き換えが可能です。<br>

<br>■置き換え可能な管理一覧
-	プロジェクト管理：進捗管理、課題管理、レビュー記録表、工数管理、用語集
-	営業管理：営業リスト、商談管理、個人情報、支援依頼、分析、改善
-	顧客・サービス管理：顧客・スタッフ管理、問合せ管理、スキルマトリクス、商品管理
-	店舗・販売：店舗管理、作業管理、仕入管理、車両管理
-	マーケティング：広告、宣伝、展示会準備
-	情報システム：パソコン、ソフトウェア、セキュリティ、インシデント管理、情報システム
-	経営企画：戦略分析、ポートフォリオ、従業員満足度調査
-	人事・総務：採用、緊急連絡先、社員寮。経費、勤怠管理、備品管理、稟議書
-	教育・人災開発：教育受講管理、資格取得管理、教育、案件管理
-	商品一覧：情報機器、車両管理、電気製品、寝具、飲料、ペット

上記管理が業務アプリに置き換え扱えるため、社内の業務変化にも即座に対応が可能です。<br>また、カスタマイズとして「開発者向け機能」が用意されているため、既存システムとも柔軟に連携を行うことができ、「スクリプト機能」や「API連携」も備える、といった拡張性も併せ持っています。<br>
基本的にノーコード・ローコードで開発ができるため、フルスクラッチ（すべてコードで記述し開発すること）に比べて素早く簡単に業務移行を行うことができるソフトウェアとなります。

<h2>Pleasanterが利用可能なスペック</h2>
続いて、 Pleasanterが利用可能なインフラ周りのスペックをご紹介していきます。

■Windows
| 名称       |Version　　　　　　　　　　　　　　　　　 |
|:-----------------|------------------:|
| OS             | Windows Server 2012 R2 / 2016 / 2019 / 2022 |
| Webサーバ           |Internet Information Services 8.0 / 8.5 / 10.0 |
| DBサーバ            |PostgreSQL 11 / 12 / 13 / 14 / 15、|
|                | FUJITSU Software Enterprise Postgres 12 SP1 / 13|
|              |   SQL Server 2016 / 2017 / 2019 / 2022|
| Platform          |.NET 6 SDK / Hosting Bundle |

■Linux
| 名称       |Version　　　　　　　　　　　　　　　　　 |
|:-----------------|------------------:|
| OS             | Red Hat Enterprise Linux 8 / 9 |
|           |CentOS 7 |
|            |Ubuntu 20.04 / 22.04|
|               | AlmaLinux 9.2|
| WEBサーバ             |   Nginx 1.20|
|              |   Apache 2.4.53|
| DBサーバ         |PostgreSQL 11 / 12 / 13 / 14 / 15 |
|          |FUJITSU Software Enterprise Postgres 12 SP1 / 13 |
|          |PowerGres on Linux 11 |
|          |SQL Server 2019 |
| Platform          |.NET 6 SDK |

<h2>おわりに</h2>
今回ご紹介しているPleasanterは、業務で利用するツールの代替えとして利用可能です。<br>
<br>カスタマイズやAPIの機能もあるため、Slackやメール、Chatwork、LINE、LINE Workなどに通知を送ることも可能です。<br>
<br>脱Excelするだけではなく、多くの業務で活用を想定したOSSになるため操作性も良く、インフラ環境さえ整えればITリテラシのない方々も安心して触ることができるのではないかと思います。

日本にはまだまだ浸透していないですが、ベトナムなど海外では急速に広まりつつあるビジネスアプリのプラットフォームであり、新しもの好きや図工が好きな方にはおすすめです！
　
次回は社内での構築事例や、実務で使ってみた際の動きをご紹介していきます。お楽しみに！

<h2>※用語</h2>
1．OSS（オープンソースソフトウェア）
提供会社がパッケージ製品を開発し基本機能を無料で展開しているパッケージソフトウェアとなります。<br>
<br>2．ノーコード・ローコード
コードの記述量を最小限に抑えて開発するものがローコード、コードでの記述が一切必要ない開発がノーコードとなります。
AtCoderBeginerContest322 A~C問題まで解いてみた

# ABC322
A~Cまで3問解きました。
AtCoderのC++の解説サイト(APG4みたいなやつ)から勉強を始めたので、同じように始めた方は少しだけコードが読みやすいかもしれません(よく他人のc++コードみるけど書き方違いすぎて理解が難しい)。B問題は汚くなりました。
C問題はqueueで実装してみました。

https://atcoder.jp/contests/abc322/tasks

# A - FirstABC2

ポイント？：文字列はstring型で受け取るんだけど、その中身は1文字ずつの値が集まった配列とみなすことができる。そのためstring s = "abcde"だったら、a[2]で"c"にアクセスできる。

S[i],S[i+2],S[i+3]の隣り合う3文字がABCになるかどうか判定します。
一番左の文字から、最後から3番目の文字までを確認して、最初にABCを発見したらfor文を終了します
他にもfind("文字列")とすると、該当する文字列の出現位置を返してくれるのでこっちのほうが簡単にかけますね。


```c++
#include<bits/stdc++.h>
using namespace std;

int main(void){
    int N; cin >> N;
    string S; cin >> S;
    
    int ans = -1;
    
    for(int i = 0; i < N-2; i++){
        if(S[i]=='A' && S[i+1] == 'B' && S[i+2] == 'C'){
            ans = i+1;
            break;
        }
    }
    cout << ans << endl;
    
    return 0;
}

```

# B - Prefix and Suffix

ポイント：文字列操作がある程度わかっていれば解ける。文字列操作についていい感じにまとめてあったもののリンク張っときます。

https://qiita.com/MasahiroBW/items/3f56b22a079cd3272cd3

文字列Sと文字列Tがあり、SとTの先頭が一致するとき、
SとTの語尾が一致するとき、をそれぞれ調べます。

結構強引に書いていて、
先頭の方は、T.substr(0,N)とすることでTの文字列からSと同じ長さを引っ張ってきて同じかどうか判定しています。
語尾の方は、一度reverseして文字列反転させて先頭からSと同じ長さをTから切り取って、それをまたreverseで文字列反転させてからSと同じかどうか判定しています。

コードもみにくいし全然スマートじゃない、、、、、、次回以降改善に期待！

```c++
#include<bits/stdc++.h>
using namespace std;

int main(void){
    int N,M; cin >> N >> M;
    string S; cin >> S;
    string T; cin >> T;
    
    string S_T = T.substr(0,N);
    string rev_S = S;
    reverse(rev_S.begin(),rev_S.end());
    
    string rev_T = T;
    reverse(rev_T.begin(),rev_T.end());
    string T_S = rev_T.substr(0,N);
    
    if(S == S_T && rev_S == T_S){
        cout << 0 << endl;
    }else if(S == S_T){
        cout << 1 << endl;
    }else if(rev_S == T_S){
        cout << 2 << endl;
    }else{
        cout << 3 << endl;
    }
    
    
    return 0;
}

```

# C - Festival

ポイント？：多分AtCoderのC問題以上は、計算量を意識してかかないと正解できない。この問題は始め愚直に実装したらTLEになって再度考えなおしました。

[1,3,4,7,8]
この例の場合,
1~8日目についてそれぞれ
[1-1,3-1,3-2,3-3,4-4,7-5,7-6,7-7,8-8]
[0,1,0,0,2,1,0,0]

1日目なら、1以上で最小の値1と引き算=0
2日目なら、2以上で最小の値3と引き算
5日目なら、5以上で最小の値7と引き算
6日目なら、6以上で最小の値7と引き算
7日目なら、7以上で最小の値7と引き算=0

このように、n日目の時点でn日目以上のなかで最小の数字とn自身を引き算したら求まります

ちょうど最近勉強したデータ構造のqueueを使って実装しています。
queueにデータを入れると先頭(front)に格納され、データを出すときはpop()を使うと先頭のデータから出ていかせることができます。

これを使って、もし"n日目以降で初めて花火があがる日がnから数えて0日目"なら、先頭にある数は今後一生使わないのでpopして消し去ります。

他の解法としては、後ろから順にみていくことで2重ループが発生せずにACできるやり方が公式で解説されていましたね。

```c++
#include<bits/stdc++.h>
using namespace std;

int main(void){
    int N,M; cin >> N >> M;
    
    queue<int> A; //queue<データ型> 配列名;で作成
    for(int i = 0; i < M; i++){
        int a;
        cin >> a;
        A.push(a); //queueへのデータ登録は配列名.push(値)
    }
    
    for(int i = 1; i <= N; i++){
        int x = A.front() - i; //配列の先頭の要素を呼び出す 配列名.front()
        cout << x << endl;
        if(x == 0) A.pop();
    }
    
    return 0;
}

```
Databricksの結果テーブルが新しくなりました！

ノートブックでSQLを実行するなどして、データを取得した際に表示されるのが結果テーブル(result table)です。

右上の**New result table**をクリックし、トグルをONにすることで有効化できます。
![Screenshot 2023-10-05 at 19.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ccf20fe1-e480-9b66-b817-d88fd1aab142.png)

データ型がグラフィカルに確認できるようになっています。
![Screenshot 2023-10-05 at 19.53.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5ad56660-9b80-1f1a-055c-63cfbc4fcfe2.png)

ユーザー設定からも有効化できます。
![Screenshot 2023-10-05 at 19.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/99081fa9-99ec-f2a6-f407-505e15175c84.png)


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Databricksマーケットプレイスにおけるソリューションアクセラレータの提供

個人的には嬉しいです。

# Databricksマーケットプレイスとは

https://qiita.com/taka_yayoi/items/ced86daa2606232c308a

> データ製品交換のためのオープンフォーラムであるDatabricksマーケットプレイスをご紹介します。Databricksマーケットプレイスは、データ提供者がセキュアにデータ製品を共有し、データ利用者に自分達の必要とするデータやデータサービスへのアクセスを探索、拡大するパワーを提供するために、Delta Sharingを活用しています。

# ソリューションアクセラレータとは

https://www.databricks.com/jp/solutions/accelerators

> Databricks ソリューションアクセラレータは、さまざまな業界・業種に共通の主要なユースケースに対応する、フル機能の Notebook やベストプラクティスを含む目的に特化したガイドです。ソリューションアクセラレータを使用することで、発見、設計、開発、テストにかかる時間を短縮できます。発案から PoC までを 2 週間以内に完了できるよう設計されています。

# ウォークスルー

Databricksマーケットプレイスで**プロバイダー**からDatabricksを選択します。
![Screenshot 2023-10-05 at 16.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/24551586-ced6-9557-b651-a1de30814887.png)

あるいは、**Product**からSolution acceleratorを選びます。
![Screenshot 2023-10-07 at 17.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a3fe5888-e5af-d01f-823f-2ffb33b622fa.png)


使用したいアクセラレータにアクセスし、**即時アクセス権を取得**をクリックします。無料です。
![Screenshot 2023-10-05 at 16.48.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e4db23e5-ba7a-5771-17ef-db6ea87d1241.png)

ノートブックをリポジトリに取り込みます。
![Screenshot 2023-10-05 at 16.49.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b5ed7833-27b1-f2f1-cab0-c256acf62b6a.png)

右上のボタンが**開く**に変化するので、リポジトリをクリックします。
![Screenshot 2023-10-05 at 16.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e98723b9-e9e4-57cd-de5a-902514e8f015.png)

これでソリューションアクセラレータがワークスペースに取り込まれました。
![Screenshot 2023-10-05 at 16.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/95a3e686-2139-f306-3c53-469681f416d2.png)

以前は、ファイルやURLからインポートしなくてはなりませんでしたが、よりクイックにソリューションアクセラレータを活用できるようになりました。ぜひお試しください！

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Bashで標準出力と標準エラー出力を別々のファイルに書き出す方法

```bash
なにかコマンド 2> 標準エラー出力を書き出す先 > 標準出力を書き出す先

# ファイルに書き出しつつ画面にも表示する場合
なにかコマンド 2> >(tee 標準エラー出力を書き出す先) > >(tee 標準出力を書き出す先)
```
とすることで標準出力と標準エラー出力を別々の場所に出力できます。

実際に動くコマンドで書くと
```bash
bash -c 'echo "to standard out"; echo "to standard error out" >&2' 2> >(tee error_log.txt) > >(tee log.txt)
# => to standard error out
# => to standard out

cat log.txt
# => to standard out

cat error_log.txt
# => to standard error out
```
となります。

ちなみに
```bash
bash -c 'echo "to standard out"; echo "to standard error out" >&2' 1> >(tee log.txt) 2> >(tee error_log.txt)
```
とすると両方ともlog.txtに書き出されてしまうので注意が必要です。
（理由に関してはうまく言語化できていません...Bash力不足です...）

参考文献
https://aquasoftware.net/blog/?p=1663
【SQL】2ヶ月前から1ヶ月前までのデータを削除するストアドプロシージャ

# 概要
MySQLデータベースにて、2ヶ月前から1ヶ月前までのデータを削除するストアドプロシージャを作成しました。
本記事ではそのクエリの解説をします。

# SQLクエリ
`sample-db`データベース内の`sample_table`というテーブルにて、2ヶ月前から1ヶ月前までのデータを削除するストプロを作成しました。プロシージャ名は`DeleteProcedure`としたので、実行する際は、以下のように叩きます。

```
{ CALL sample-db.DeleteProcedure() }
```

プロシージャサンプルは以下の通りです。

```sql
CREATE PROCEDURE `sample-db`.`DeleteProcedure`()
BEGIN
  DECLARE start_date DATETIME;
  DECLARE end_date DATETIME;

  -- 現在時刻を取得
  SET @current_date = NOW();

  -- 2ヶ月前の日を算出し、その日の0:00:00をstart_dateに代入
  SET start_date = DATE_SUB(DATE_FORMAT(@current_date, '%Y-%m-%d 00:00:00'), INTERVAL 2 MONTH);

  -- 1ヶ月前の日を算出し、その前日の23:59:59をend_dateに代入
  SET end_date = DATE_SUB(DATE_FORMAT(@current_date, '%Y-%m-%d 00:00:00'), INTERVAL 1 MONTH);
  SET end_date = DATE_SUB(end_date, INTERVAL 1 SECOND);

  -- 削除クエリを実行
  DELETE FROM sample-db.sample_table WHERE sample_table.create_date >= start_date AND sample_table.create_date < end_date;

END
```

## 備考
- `@`記号がついた変数は、MySQLにおいてユーザー定義変数を表すために使用されるプレフィックスです。セッションがアクティブな間、その値が保持されます。
- `INTERVAL`は、その後に続けて指定された数値と単位は、時間の間隔を表します。
    - 例えば、`INTERVAL 2 MONTH`は「2ヶ月」という時間間隔、`INTERVAL 1 SECOND`は「1秒」という時間間隔。
- `DATE_SUB`によって、上記`INTERVAL`で指定した日付や時刻から一定の時間間隔を減算して、新しい日付や時刻を生成しています。基本構文は以下。

```sql
DATE_SUB(date, INTERVAL expr unit)
```

`date`: 日付や時刻を減算したい元の日付や時刻を指定します。
`expr`: 減算する時間間隔を数値で指定します。
`unit`: exprの単位を指定します

- `DATE_FORMAT`は、日付や時刻の書式化（フォーマット変換）を行うためのSQL関数です。基本的な構文は以下。

```sql
DATE_FORMAT(date, format)
```

`date`: 書式化したい日付や時刻を指定します。
`format`: 日付や時刻の書式を指定する文字列

上記サンプルクエリのように`'%Y-%m-%d 00:00:00'`とすれば、、常に時刻が`00:00:00`になります。
Laravel10 で Controller を使う API を作成 (2)

こちらのプログラムをコントローラーを使うように改造しました。
[Laravel 10 で簡単な API を作成](https://qiita.com/ekzemplaro/items/f2b2baf9431bcc4bf372)

```bash
laravel new api05
cd api05
```

## Controller  を作成

```bash
php artisan make:controller SampleController
```

作成されたファイルを次のように修正

```php:app/Http/Controllers/SampleController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SampleController extends Controller
{
	   public function getAa(){
		   return [70,30];
	   }

	   public function getBb(){
		   return [5,4,8];
	   }

	   public function getCc(){
		   return [40,20,8,9,5];
	   }

}
```

## ルーティングの作成

routes/api.php を次のように修正

```php:routes/api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

use App\Http\Controllers\SampleController;

Route::get('aa', [SampleController::class, 'getAa']);
Route::get('bb', [SampleController::class, 'getBb']);
Route::get('cc', [SampleController::class, 'getCc']);
```

## ルーティングの確認

```text
$ php artisan route:list

  GET|HEAD   / ............................................................. 
  POST       _ignition/execute-solution ignition.executeSolution › Spatie\L…
  GET|HEAD   _ignition/health-check ignition.healthCheck › Spatie\LaravelIg…
  POST       _ignition/update-config ignition.updateConfig › Spatie\Laravel…
  GET|HEAD   api/aa ................................. SampleController@getAa
  GET|HEAD   api/bb ................................. SampleController@getBb
  GET|HEAD   api/cc ................................. SampleController@getCc
  GET|HEAD   api/user ...................................................... 
  GET|HEAD   sanctum/csrf-cookie sanctum.csrf-cookie › Laravel\Sanctum › Cs…

                                                          Showing [9] routes
```

## サーバーの起動

```bash
php artisan serve --host 0.0.0.0
````

## クライアントでアクセス

```text
$ http http://127.0.0.1:8000/api/aa
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Cache-Control: no-cache, private
Connection: close
Content-Type: application/json
Date: Thu, 05 Oct 2023 10:00:49 GMT
Date: Thu, 05 Oct 2023 10:00:49 GMT
Host: 127.0.0.1:8000
X-Powered-By: PHP/8.1.12-1ubuntu4.3
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59

[
    70,
    30
]
```

## 参考: tinker で Controller を確認する方法

```text
$ php artisan tinker
Psy Shell v0.11.21 (PHP 7.4.33 — cli) by Justin Hileman
> $obj=new App\Http\Controllers\SampleController;
= App\Http\Controllers\SampleController {#6138}

> $obj->getAa();
= [
    70,
    30,
  ]

> 
```
【Windows】Poetry + pyenvでPython環境構築

## はじめに

環境構築で少しハマったので手順を残しておきます。
Windowsユーザ向けの記事です。
最新情報は、公式ドキュメントをご参照ください。

### 環境
OS: Windows 10
pyenv-win: 3.1.1
Poetry: 1.6.1

## pyenvインストール

Pythonのバージョン管理のため、pyenvを導入する。
pyenvを導入すると、プロジェクトごとにPythonのバージョンを切り替えて使うことができる。

pyenvではWindowsをサポートしていないので、フォーク版のpyenv-win を使う。

https://github.com/pyenv-win/pyenv-win

### pyenv-winインストール

公式ドキュメントに記載されている以下のコマンドでインストールする。
PATHも自動で追加される。
```PowerShell
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1
```

### 動作確認
```powershell
C:■■> pyenv --version
pyenv 3.1.1
```

### Pythonインストール
pyenv-win でサポートされているPythonのバージョンのリストを見るには以下のコマンドを実行する。

```powershell
pyenv install -l
```

Pythonインストール
```powershell
pyenv install 3.10.11
```

Pythonのグローバルバージョン設定
```powershell
pyenv global 3.10.11
```

## Poetryインストール
Pythonの依存関係管理、仮想環境作成を行うため、Poetryをインストールする。

以下のコマンドでインストールする。

```PowerShell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -
```

### 動作確認
```powershell
C:■■■> poetry --version
Poetry (version 1.6.1)
```

### プロジェクト作成
```powershell
poetry new poetry-demo
```

### ライブラリインストール
```
poetry add pendulum
```

### Pythonプログラム実行
```
poetry run python your_script.py
```

## ハマりポイント
実はPoetryインストール後にPythonのバージョンを上げる必要があることが分かり、もともと入っていたPythonをアンインストールして、pyenvをインストールした。

すると、poetryコマンドが通らなくなった。

```powershell
C:■■> poetry --version
No Python at 'C:\■■\AppData\Local\Programs\Python\Python39\python.exe'
```

Poetryインストール時に、インストールされているPythonを指定している。
公式ドキュメントでは以下となっている。
```PowerShell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
```

`py` というのは、Pythonランチャー(py.exe)を指している。
Windows版のPythonインストーラにはPythonランチャーが付いている。
pyenvでインストールされるPythonは`python`(python.exe)なので、こちらを指定してやる必要がある。
公式ドキュメントの書き方は、pyenvユーザではなくPythonインストーラを使ってインストールしたユーザ向けのものなのだろう・・

```PowerShell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -
```


## おわりに
公式ドキュメント通りにやればいけるやろ（安直）ではいけませんね・・
pythonとpyの違いを知れてよかった！

## 参考文献
https://github.com/pyenv/pyenv

https://github.com/pyenv-win/pyenv-win

https://python-poetry.org/docs/
AWSが生成AIのサービスを始めた話を聞いて触った話

# はじめに
Amazon Bedrockは、Amazon が AWS で提供しているフルマネージドの AI サービスで、Amazon 自社開発の Titan モデルのほか、 Anthropic 社の Claude や Stability AI 社の Stable Diffusion など様々なモデルを選んで利用できるのが特徴です。

今年4月にプレビューとして一部企業向けに公開されたあと、9月末には一般向けにサービスが開始されました。そして、10月3日に Amazon が「日本企業のビジネスニーズに応える生成系 AI」と題し[日本国内で初めて Bedrock に関するセミナーを開催しました。](https://generativeai-seminar-oct-inperson.splashthat.com/)

今回、そちらのセミナーに参加する機会がありましたので、発表内容をまとめると共に、Bedrockを試しに使った感想を書いておこうと思います。

# セミナーの発表内容まとめ
セミナーでは初めに、AmazonよりBedrockの機能紹介や新情報が発表されました。目玉となったのは Bedrock が **東京リージョンで提供開始** されるという発表でした。一般リリースされて間もなく、まだアメリカとシンガポールでしかオープンしていない中、次に選ばれたのが日本ということには驚きました。

他には、Bedrockで利用できるモデルに、現在発表されているものに加え Meta の Llama 2 が加わる予定であるとのアナウンスがあり、今後は動画や3Dモデルの生成といった領域にも広げていきたいという展望も語られました。

Bedrockの活用法について、Amazon側が特に推していたと感じたのは **ユーザー独自の知識源を利用した検索拡張生成(RAG)** でした。発表内では"Agents"という機能によって、外部APIとの接続によって野球の試合結果や選手のデータを素早く検索し、ソースを提示しながら質問に回答するなどのデモが披露されました。また、"Knowledge Base"という機能では、S3にアップロードされた文書をそのまま知識源にして、質問に対して関連する文書を検索して回答に反映させることが可能だと語られました。この機能が広まれば社内データを参照するチャットボットを導入する企業が今後かなり増えてくるのではないでしょうか。

その後、プレビュー段階の Bedrock を利用した企業による講演が行われました。 AWS の検索ツールである Kendora と組み合わせ、社内ドキュメントをサーチして回答するシステムを構築したという話が多く、データの収集やクレンジングにかかる負担が低いというメリットが語られており、内部データを活かしたチャットボットを導入したいという企業向けに着目したサービスであることが伺えます。


# Bedrock を試す
セミナー翌日の4日の時点で、東京リージョンが利用可能になっていました。

![bedrock01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/45bfb8a6-8b36-7b65-0397-702f2af78b48.png)

現在東京リージョンで利用できるモデルは、Claude Instant と Titan Embeddings と Titan Text の3種類のみとなっており、Titan textはプレビュー中につきまだ自分のアカウントでは使えないというような表示が出ました。また、モデルのデプロイはできず、プレイグランドでの試用だけが解放されていました。リージョンをオレゴンに変更すると他のモデルも利用できるようなので、東京リージョンはまだプレビュー状態のようです。

Claude Instantの利用には社名の入力と利用目的に関する質問などに答える必要があり、入力した後数分で承認され利用可能になりました。

![2023-10-05_15h32_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/94107381-9af5-6d7f-93e9-2bde5a10bc67.png)
![2023-10-04_13h20_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/1d0f6ac1-ff4b-094f-0261-a9d245754b74.png)

日本語での受け答えもしっかりとできています。

なお Knowledge Base や Agents の機能はどのリージョンでもまだ一般公開されていない様でした。

# おわりに
今回、AWS より Bedrock の提供が開始されたことで、生成AIを利用する際の選択肢が大きく広がりました。多彩なモデルから選択が可能であること以外にも、Knowledge Database などの利用によるカスタマイズのしやすさが、特に企業向けのサービスを構築する上での利点になるのではないかと思います。

今後のアップデートとしては、Knowledge Database の効果のほどを早く試したいのと、より日本語に強いモデルが追加されることに期待しています。
ページの背景を変更するchrome拡張機能作り方

まずmanifest.jsonを作成します
```manifest.json
{
  "name": "ページ　黒",
  "options_page": "options.html",
  "action": {},
  "manifest_version": 3,
  "version": "1.0",
  "description": "ページを黒にします。それにはこの拡張機能をクリックしてください",
  "permissions": [
    "activeTab",
    "scripting"
  ],
  "background": {
    "service_worker": "background.js"
  }
}
```
次に、background.js作成
```background.js
function yu() {
  document.body.style.backgroundColor = 'black';//ここのblackを変えると他の色にできる
}

chrome.action.onClicked.addListener((tab) => {
  chrome.scripting.executeScript({
    target: { tabId: tab.id },
    function: yu
  });
});
```
そして拡張機能を押すと..
![d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/efdc4899-f99a-0ea4-4c36-b4a0515f7fda.gif)
ということでした
C++ 競プロ　学習記録＃1

# はじめに
学生時代には講義の予習としてpythonを多く使っていましたが、競技プログラミングでは実行速度の面でc++の使用率が圧倒的に高いようです。ライブラリの参照や、文字数値変換の方法などで何度も検索することがないように、その日に間違えた部分の記録を取ることにしました。



## 文字列操作
* 文字から値へ 
str - '0' 
* 文字列を整数変換（0埋めを無視） 
stoi(str)

* 文字の切り出し
str.substr(開始要素番号, 切り取る長さ);

* 開始要素番号から最後まで切り出し
str.substr(要素番号)

## 数値変換
* 数値変数(num)を文字列へ
to_string(num)

## その他
* 時間計算問題
hour + num > 24 や、　min + num > 60の時の計算では、if else文で書き分けずに先に計算してif文で修正する

```

hour = hour + num;
min = min + num;
if (hour >= 24) {
    hour -= 24;
}

if (min >= 60) {
    min -= 60;
}

```

## 参考

[c++の文字列操作まとめ](https://qiita.com/MasahiroBW/items/3f56b22a079cd3272cd3)
[c++で数値と文字列の相互変換](https://qiita.com/seal_qiita/items/d62192f8d0b1e4ca8de2)
ER図の線や図の意味まとめてみた

# はじめに
こんにちは、2年目のエンジニアです。
最近、ER図を書こうと思ったら
わからないことだらけだったので、勉強がてらまとめてみました。
ER図には主に「IE記法」と「IDEF1X記法」の２種類あるのですが、
今回は**IE記法**についての基礎知識を簡単にまとめようと思います。

# 目次
* そもそもER図って何？
* IE記法とは
* ER図の基本
    * エンティティとは
    * アトリビュートとは
    * リレーションとは
    * カーディナリティとは
* 作成に使っているツール
* 最後に

# そもそもER図って何？
ER図とは、データベース設計で用いられる設計手法です。
『エンティティ』『アトリビュート』『リレーション』『カーディナリティ』と呼ばれる
オブジェクトで構成されています。
データベース設計において、基本となる設計手法となります。

# IE記法とは
IE記法とはER図の記法の1つとなります。
もう一つのIDEF1X記法に比べ、リレーションが直感的に理解しやすいという特徴があります。
直感的に理解しやすいため、初めてER図の作成する人にはおすすめです。
今回はこちらの記法をベースにまとめていきます。
ちなみにIE記法とIDEF1X記法の違いはカーディナリティのみとなります。

# ER図の基本
ER図は、これから紹介をする4つのオブジェクト、
『エンティティ』『アトリビュート』『リレーション』『カーディナリティ』を組み合わせて作成を行います。

![スクリーンショット 2023-10-05 17.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/a22e6716-d2ad-a061-5d5d-64636e2645df.png)


## エンティティとは
データのひとまとまりのことです。
エンティティの中にアトリビュート（属性情報）があり、
エンティティとエンティティをリレーションで繋いでいます。

## アトリビュートとは
エンティティの中の属性情報のことです。
アトリビュートの中で「主キー（PK）」「外部キー（FK）」も記載し、
主キーとなるものはテーブル名のすぐ下に記載され、左に「PK」という記載もします。
外部キーとなるものは対処のカラムの左に「FK」と記載します。

## リレーションとは
エンティティとエンティティの間にある線で、エンティティ同士の関係を表現する線となります。
リレーションの詳細はカーディナリティとと言われる記号を用いて表現します。

## カーディナリティとは
「１対１」「１対多」「多対多」などとリレーションの詳細を表す記号となります。
記号の種類は下記のようになっています。
![スクリーンショット 2023-10-05 18.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/bf03fa6d-40f9-acc1-fd88-e2dee365d77d.png)

## 作成に使っているツール
ER図を作成するときは、何かツールを使って作成すると便利です。
ちなみに私は**draw.io**という図面作成ツールを使用しています。
ER図の他にも「フローチャート」、「組織図」、「ネットワーク構成図」、「ワイヤーフレーム」などの作成が可能です。
他にも色々なツールがあるので、自分に合ったツールで作成するといいと思います。

# 最後に
今回は『そもそもER図とは何か』、『ER図で必要となるオブジェクト』についてまとめさせていただきました。
最後まで見ていただきありがとうございます。
ShellScript、忘れがちなことをメモ

こんにちは〜
最近UnixやShellScriptについて学び始めました.まだまだ初歩段階で、できることは限られておりますが、とても楽しいです！

ローカルのフォルダやファイルに直接関与できるので、普段のJavaやpythonのコーディングの時とは違った面白さを実感しています.

以前、コマンド使いの教授が、GUIよりCUIの方が早くて良いと言っていたのですが、最近その良さをひしひしと実感しております.

今回の記事の主旨ですが、ShellScriptでコーディングする上で、つい忘れがちなことを備忘録として、残していきたいと思います.

### 引数で指定したフォルダ内のファイルを1行ずつ取得
```sh
dir=$1
for f in $dir
do
    while read line
    do
        処理内容
    done < f
done
```
よく使います.
フォルダ内の全ファイルを一括で調べたい時にとても便利です.

### if文, 条件式
```sh
if [ 条件式 ]; then
    処理内容1
elif [ 条件式 ]; then
    処理内容2
else
    処理内容3
fin
```
ifの構文は問題ないのですが、[]内の**条件式の両端に半角スペースを入れ忘れがち**です.気をつけたいです.

### 変数宣言
```
変数=値
```
「変数 = 値」と書かないようにする！
本当に些細なことなのですが、他の言語でコーディングをする際は、見やすさを考慮してスペースを入れていています.その癖がshellでも発動してしまうことが多々あります.
スペースをつけてしまうと、変数をコマンドとして誤認識してしまうので注意が必要です
.

### shell内でオプション指定付きechoコマンド
```sh
/bin/echo -n $変数
```
シェル内だと、/bin/をつけないとうまくオプションを認識してくれませんでした.
ちなみに「-n」は改行なしというオプションです.

### 指定した行を取得, 表示
```sh
line=`wc -l ファイル名 | awk '{print $行数}`
head -n $line ファイル名 | tail -n 1
```
数字の最大最小を取り出すことが多いので、基本的にはsortしてから、最初の行と最後の行を取得することが多いです.

ちなみにsortは
```sh
sort -n -r -o sortしたいファイル名 sort後を記録するファイル名
```
「-n」numberは数字順に並び替え
「-r」reverseはたしか降順?に並び替え
「-o」outputは出力先を指定して並び替え
となっています.

### 思ったこと
shellを使えば、ローカルファイルを手軽に扱うことができるので楽しいです.
javaでファイルを読み込むとしたら、FileライブラリやBufferdReaderライブラリなどを使わないといけないので、ちょっと手間な気がします.
言語って勿論好みにもよりますが、使う場面に合うように、適材適所を考えることが大事ですね.

いろんな言語やライブラリを使いこなせるようになって、どんな問題にも即座に対応できるようになりたいです.地道に勉強していこうと思います！
Vitestのテストで使えるマッチャー一覧

## はじめに

Vitestで使えるテストのマッチャーをまとめました。VitestはJest互換なため、Jestでも使用できます。ちなみにアサーションは`expect().toBe()`、マッチャーは`toBe()`の部分を指します。

## マッチャー一覧

以下のテストはすべて成功します。

```typescript
import { test, expect } from 'vitest'

test('同じを検証', () => {
  expect(true).toBe(true)
  expect(1).toBe(1)
  expect('foo').toBe('foo')
  expect(undefined).toBe(undefined)
})

test('同じでないを検証', () => {
  expect(true).not.toBe(false)
  expect(5).not.toBe(9)
  expect('foo').not.toBe('bar')
  expect(undefined).not.toBe(null)
})

test('真を検証', () => {
  expect(true).toBeTruthy()
  expect(1).toBeTruthy()
  expect('foo').toBeTruthy()
})

test('偽を検証', () => {
  expect(false).toBeFalsy()
  expect(0).toBeFalsy()
  expect('').toBeFalsy()
})

test('nullを検証', () => {
  expect(null).toBeNull()
})

test('undefinedを検証', () => {
  expect(undefined).toBeUndefined()
})

test('a > bを検証', () => {
  expect(9).toBeGreaterThan(5)
})

test('a >= bを検証', () => {
  expect(9).toBeGreaterThanOrEqual(5)
})

test('a < bを検証', () => {
  expect(5).toBeLessThan(9)
})

test('a <= bを検証', () => {
  expect(5).toBeLessThanOrEqual(9)
})

test('文字列を含むか検証・配列の要素を含むか検証', () => {
  expect('foo').toContain('fo')
  expect(['foo', 'bar']).toContain('foo')
})

test('正規表現を検証', () => {
  expect('foo').toMatch(/oo$/)
})

test('文字列の長さを検証・配列の要素数を検証', () => {
  expect('foo').toHaveLength(3)
  expect(['foo', 'bar']).toHaveLength(2)
})

test('配列が同じか検証・オブジェクトが同じか検証', () => {
  expect(['foo', 'bar']).toEqual(['foo', 'bar'])
  expect({ name: 'taro', age: 15 }).toEqual({ name: 'taro', age: 15 })
})

test('配列が部分的に同じか検証', () => {
  expect([
    { name: 'taro', age: 15 },
    { name: 'hanako', age: 20 },
  ]).toContainEqual({ name: 'taro', age: 15 })
})

test('オブジェクトが部分的に同じか検証', () => {
  expect({ name: 'taro', age: 15 }).toMatchObject({ name: 'taro' })
})

test('オブジェクトのプロパティを含むか検証', () => {
  expect({ name: 'taro', age: 15 }).toHaveProperty('name')
})
```

## まとめ

Vitestで使えるテストのマッチャーをまとめました。`toBe`を使えばある程度の検証はできるので、たくさんあって覚えるのが大変という方はとりあえず`toBe`だけ覚えれば良いと思います。



## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=f9dfe1875befe1e6283b
Windows11でRubyをインストール

Windows11(64ビット版)にRuby3.1系をインストールする手順を記録します(2023年10月)。

## RubyInstaller のダウンロード
RubyInstallerの公式サイト[「RubyInstaller for Windows」](https://rubyinstaller.org/)にアクセスし、「Download」をクリックする。

<img width="700" alt="スクリーンショット (22).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/f0d00a99-c5f8-2b08-dbf7-5deeac724708.jpeg">

ページ内の「WITH DEVKIT」の下にある「Ruby+Devkit3.1.4-1(64x)」のリンクをクリックしてインストーラーをダウンロードする（「Devkit d.d.d-d」のd.d.d-dの部分はセマンティックバージョニングの形式でRubyのバージョン番号を表す）。

<img width="700" alt="スクリーンショット (23).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/3138f143-3528-49bd-aa3c-01b586422e4b.jpeg">

## Rubyのインストール
ダウンロードしたファイルをクリックして、インストーラーを起動する。続いて表示される画面の「I accept the License」を選択し、「Next」をクリックする。
<img width="400" alt="スクリーンショット (25).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/7cb55206-4499-1717-df4d-cef81d11f1b3.jpeg">

続いて表示される画面はすべてデフォルトの選択のままで進む。

インストールが開始され、次の画面が表示されたら、そのまま「Finish」ボタンをクリックする。
<img width="400" alt="スクリーンショット 2023-10-05 152831.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/55c9916d-0dc9-d4de-9005-83a9f97a10c1.jpeg">

ターミナルが起動し、次の画面が表示されたらEnterキーを押す。
<img width="550" alt="スクリーンショット 2023-10-05 152913.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/6db41830-3bcb-8a22-8214-dbb3f8982192.jpeg">

インストールが開始し、次の画面が表示されたらEnterキーを押す。

<img width="550" alt="スクリーンショット 2023-10-05 153013.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/2393b86d-404d-6566-b6d7-dabc5ea979d1.jpeg">

## Rubyのバージョン確認
ターミナルを起動し、次のコマンドを実行する。
```
ruby -v
```

「ruby 3.1.4...」と表示されたら、インストールは完了(「...」の部分は環境により異なる)。
【ライフハック】デスクトップを整理して仕事と脳内から無駄を断捨離する【捨て活】




## 皆さんこんにちは。 断捨離、してますか!?

昨今では
#### 「捨て活」や「終活」
そして
#### 「ミニマリスト」や「シンプリスト」

などなど、
#### 「物を捨てる、整理する」

といったことが何かと話題になりますね。
そんなブームですが、PCのデスクトップでも効果を発揮します。
そう、
#### デスクトップの断捨離 
です。

インターネット上には年単位で昔から、
##### デスクトップはゴミ箱だけに！　デスクトップに何も置かないことで頭の中まで整理整頓！　有名な文豪も言っている！

といったような記事がチラホラ見受けられますね。

ちなみにこの記事を書こうと思ったきっかけは、ずばり同僚にデスクトップが汚い人が多いからです。

## デスクトップを整理した状態

こちらが私のデスクトップです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728856/a45523be-9b88-95f0-7273-ff6896a5f4da.png)

ファイルアイコンの非表示設定を行い、ゴミ箱を含むすべてのアイコンを非表示にしています。
今回整理したわけではなく、常にこの状態で作業しております。

ファイルアイコンを表示した状態は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728856/94e8163f-fe7a-4cac-3629-4efb779bbd75.png)

ショートカットが幾つかありますが、こちらは会社的に消せないものになります。

~~普段非表示とはいえゴミ箱の中身を削除するときなんかはアイコンを表示するので、めちゃくちゃ気になってイライラしたりしてなかったり~~ 


## タスクバー

タスクバーの設定はWindowsの標準機能で右側表示、メインモニタのみ表示にしており、二枚のモニタの中央に表示されるようにしています。

[7+ TaskberTweaker](https://forest.watch.impress.co.jp/library/software/7taskb_tweak/)

というソフトウェアを使用し、より細く、最低限のアイコン以外は非表示にしています。

時刻表示を秒数まで表示したり、タスクバーをダブルクリックした際の挙動を設定できたりとかなり便利です。
私はダブルクリックで 「タスクバーを自動的に隠す」 のオンオフを切り替えに設定しています。

タスクバーの色をデスクトップ背景色と合わせることで、一体感を出しています。

#### また、タスクバーは左右のどちらかに配置するのがベストだと思います。

ウェブサイトというのは基本縦長であり、縦方向の表示領域を増やすことで一度に表示できる情報量が増えるからです。
(余談ですが、自宅では縦置きのモニターを一枚設置しています。ウェブサイトの閲覧やtweetDeckの表示、チャットアプリのログの表示量が各段に増えて便利なのでおすすめです。)


# メリット

以上のデスクトップ状態で作業していて明確に感じるメリットは以下の通りです。

## 保存先をしっかりと選択するようになった

- キャプチャ画像や一時的な資料など、ついついデスクトップに保存してしまっている方はいませんか？

後から目的のファイルを探すとき、保存してすぐであれば場所を覚えているかもしれませんが、数日後、それもアイコンが大量に並んでいる状態では、直ぐに探せないこともあるでしょう。

また、とりあえずデスクトップに保存しておいて、あとでしっかりとしたフォルダにコピペするなど、二度手間です。
#### とりあえずデスクトップに保存

をやめて、最初から正しいフォルダに保存しましょう。

## 画面共有の際の事故が防げる

リモート会議などで画面を共有している際、うっかりとデスクトップを表示してしまい、知られてはいけないファイルの存在やファイル名から情報が流出…
という可能性は少なからず存在します。

#### デスクトップに何も表示しないことで、100%防ぐことができます。

## 起動に必要な時間が短くなる

これは私が検証したものではございませんが、実際に検証している方がいます。
[こちら](https://enjoy.sso.biglobe.ne.jp/archives/desktop_file/)

私はデスクトップにファイルを置きまくったことがないので体感できておりませんが、重たいファイルを配置したら起動が早くなるようなことはないかと思いますので、置かないにこしたことはありません。

# デメリット

正直私は何のデメリットも感じておりませんが、なんでもデスクトップに保存している方に聞いてみた私のデスクトップに対すr印象としては次のようなものがありました。

- 毎日開くソフトウェアへのアクセスに時間がかかるのでそれぐらい配置したほうが良いのではないか。

- タスクバーは取り入れたいと思った。

- メリットを感じない

- 汚いよりはどちらかというと良く見えるかもしれない。

## まとめ

人によっては効果を体感できないこともあるでしょう。

しかし、これだけは確実に言えます。

### デスクトップを一度何もない状態に捨て活整理すると、もうファイルアイコンが並んでいる汚い状態には二度と戻らない。

是非一度お試しください。


# andmore...

他にもこんな記事書いてます。

https://qiita.com/SZR/items/3e3a02e6c316438fe5a3

https://qiita.com/SZR/items/1c8a7be4267071f6c295

https://qiita.com/SZR/items/f46822b009fa47e1ca53

https://qiita.com/SZR/items/396533c1b1e14489a782

https://qiita.com/SZR/items/a000cbaa583dcd2a344b

https://qiita.com/SZR/items/401a1f839723d89bd7f2

https://qiita.com/SZR/items/1d8edaf95fa2f5bbe821

https://qiita.com/SZR/items/1debe21a6759d0067ad7
DynamoDBのデータをAthenaで分析するまで

DynamoDB内のデータをSQLで分析したいと思ったのですが、そうするとETLが必要になります。
四苦八苦しながらデータ分析できるようになるまでの準備を行ったのでメモとして残しておきたいと思います。

# DynamoDBのデータをS3に出力する方法
Athenaでデータ分析するためにはS3にデータを保存しておく必要があります。
DynamoDBのテーブルデータをS3に出力するには以下の方法があります。

## マネジメントコンソールから手動でDynamoDBテーブルのデータをS3にエクスポートする
マネジメントコンソールを利用するとDynamoDBテーブルのデータをS3にエクスポートできます。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/S3DataExport_Requesting.html#S3DataExport_Requesting_Console

ただし、この方法は手動での作業になるので自動でのS3エクスポートはできません。

## AWS CLIを利用してS3にデータをエクスポートする
AWS CLIを利用してエクスポートする方法です。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/S3DataExport_Requesting.html#S3DataExport_Requesting_CLI

cronを使えば、定期実行可能ですがサーバが必要になりますね。

## EventBridge+Lambda+CDKでS3にエクスポートする
CDKでエクスポートを実行するようLambda関数を準備しEventBridgeで定期的にLambdaを走らせる方法です。

https://dev.classmethod.jp/articles/dynamodb-data-export-s3/#toc-11

サーバレスで定期的にデータエクスポートができます。
上記の記事に沿ってLambda関数をつくって試してみましたが簡単にエクスポートできました。
ただし、nodejs18ではCDKv3が必要になるのでLambdaは以下のコードで記述しました。

```javascript:index.js
import { DynamoDBClient, ExportTableToPointInTimeCommand } from "@aws-sdk/client-dynamodb"; // ES Modules import
const client = new DynamoDBClient({region:'ap-northeast-1'});
const DynamoDBTableArn = process.env.DYNAMODB_TABLE_ARN;
const ExportS3Bucket = process.env.EXPORT_S3_BUCKET;
const exportInput = {
    TableArn: DynamoDBTableArn,
    S3Bucket: ExportS3Bucket,
    ExportFormat: 'DYNAMODB_JSON',
};

export const handler = async (event) => {
    const command = new ExportTableToPointInTimeCommand(exportInput);
    const response = await client.send(command);
};
```

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/dynamodb/command/ExportTableToPointInTimeCommand/

# データエクスポートの際に忘れがちな作業
S3にデータエクスポートするためには以下の作業が必要になります。

### DynamoDBの対象テーブルに対してPointInTimeRecoveryを設定
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/PointInTimeRecovery_Howitworks.html

### S3バケットポリシーとエクスポート実行サービス用のIAMポリシーの用意
エクスポートデータを置くS3バケットに対してバケットポリシーの設定が必要になります。
またCLIやLambdaを使う場合はDynamoDBとS3にアクセスできるようにIAMロールが必要になります。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/S3DataExport_Requesting.html#S3DataExport_Requesting_Permissions

# Glueを使うのがベストプラクティス
上記方法をいろいろと試してみましたが、最終的にAWS Glueを使ってデータ連携することにしました。
AWS Glueについての理解が多少必要になりますが使い慣れるといろいろなことができます。

手順は以下の通りです。

1. Glue上でクローラーを作成し、DynamoDBテーブルのスキーマを取り込み、データカタログを生成
1. Glue上でETL Jobを作成し、データカタログの情報を利用してDynamoDBのデータをS3に保存
1. AthenaにてデータカタログとS3上のデータを利用してテーブルを作成
1. クエリを実行してデータを検索

用語を理解するのに最初苦労しました。

**スキーマ**：データ構造の定義
**データカタログ**:スキーマ情報の集まりです。"データベース"と"テーブル"の階層構造になっています
**クローラー**：既存のデータ(DB、ファイルなど)からスキーマ情報を生成するジョブを定義します
**ETL Job**：データカタログや外部データをもとにETL作業を実施するジョブを定義します

# まとめ
いろいろ試行錯誤しましたが最終的には、以下の形でやりたかったことが実現できました。

![スクリーンショット 2023-10-05 17.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/c5de6aaa-1e84-c441-52c5-be7d29184f98.png)

次はQuickSigntかな。
【SwiftUI】@Bindingの動きと使い方

## `@Binding`はどのようなときに使うのか
`@State`で作成した変数の更新を別の画面で共有したいときに利用されるのが、SwiftUIのデータバインディング機能の一つである`@Binding`です。

`@State`と`@Binding`は密接に関連しており、それぞれがどのように作用するのか、そしてどのように使用するのかについて見ていきましょう!

### `@Binding`とは
`@Binding`は、他のビューで管理されている状態を参照・更新するためのプロパティラッパーです。他のビューの状態を変更する際に使用され、状態の変更が自動的に反映されます。

これらのプロパティラッパーを使うことで、SwiftUIでは簡単に状態を管理し、ビュー間でデータの受け渡しや同期が行えます。

## `@Binding`の使用例
```swift:ContentView.swift
// 親View (ContentView)

import SwiftUI

struct ContentView: View {
    @State var isShowBView = false
    
    var body: some View {
        Button {
            isShowBView = true
        } label: {
            Text("BViewへ遷移")
                .font(.largeTitle)
        }
        .sheet(isPresented: $isShowBView) {
            BView(isShowBView: $isShowBView)
        }
    }
}
```
`@State`でisShowBViewと言うBool型(trueかfalse)を宣言します。

ContentViewが表示されたときは、isShowBViewがfalseになっているので、
.sheet(isPresented: $isShowBView)内が実行されません。

```swift:BView.swift
// 子View (BView)

import SwiftUI

struct BView: View {
    @Binding var isShowBView: Bool
    
    var body: some View {
        ZStack {
                .edgesIgnoringSafeArea(.all)
            VStack {
                Text("BView")
                    .font(.largeTitle)
                Button {
                    isShowBView = false
                } label: {
                    Text("閉じる")
                    .font(.largeTitle)
                    .padding()
                }
            }
        }
    }
}
```

子View側で`@Binding`変数の準備をして、親View側から子Viewを呼び出します。
```swift:ContentViewから抜粋
BView(isShowBView: $isShowBView)
```
引数の頭に$(ドルマーク)を付けることで子Viewの`@Binding`のプロパティと紐付けられます。

親Viewへの紐付けが完了した`@Binding`変数は、`@State`変数と同じくSwiftUIの監視対象になります。
これにより、子Viewと親Viewのどちらからでもプロパティの更新が可能になり、どちらかの更新を検知するとSwiftUIが子Viewと親ViewのViewを再描画します。

## 動きを見てみよう
「BViewへ遷移」ボタンを押すと、isShowBViewがtrueになり、isShowBViewが再描画され、.sheet(isPresented: $isShowBView)内が実行されてBViewに画面遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/c2fb58b4-581e-662c-2a12-9bdbc85a67b2.png)

「閉じる」ボタンを押すと、isShowBViewがfalseになり、isShowBViewが再描画され、.sheet(isPresented: $isShowBView)内が実行されてContentViewに画面遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/53e10fe5-0f69-38f9-f706-4f062b9465d4.png)

## `@Binding`のまとめ
`@State`と`@Binding`でデータ共有されるView間は親子関係である必要があります。

呼び出す側のViewを「親View 」、呼び出される側のViewを「子View」と呼んでいます。

上記のコードでは、

**・親View 　⇨　 呼び出す側「ContentView」**
**・子View 　⇨　 呼び出される側「BView」**

となります。

`@Binding`というのは、View間でのデータの共有ができる修飾子です。
画面Aと画面Bがあるとすると、画面Bで画面Aの`@State`を変更したいときに`＠Binding`を使います。

***
#### `@State`については下記の記事で解説しています
https://qiita.com/umashikate/items/61d8a4166e784d2e54ea
Laravel10 で Controller を使う API を作成

こちらと同じことを行いました。
[【Laravel】【初心者向け】Laravel8でWeb APIを作る](https://e-seventh.com/laravel8-how-to-make-web-api/)

## プロジェクトの作成

データベースは、sqlite3 を選びました。

```bash
laravel new api04
cd api04
touch database/database.sqlite
```

## Controller を作成

```bash
php artisan make:controller SampleController
```

作成されたファイルを次のように修正
>JSON を返すプログラムです。


```php:app/Http/Controllers/SampleController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SampleController extends Controller
{
	   public function getJson(){
		   return response()->json(['name' => 'john']);
	   }
}
```

## ルーティングの作成

routes/api.php を次のように修正

```php:routes/api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

use App\Http\Controllers\SampleController;
Route::get('sample', [SampleController::class, 'getJson']);
```

##　ルーティングの確認

```bash
php artisan route:list
```

```text
$ php artisan route:list

  GET|HEAD   / ............................................................. 
  POST       _ignition/execute-solution ignition.executeSolution › Spatie\L…
  GET|HEAD   _ignition/health-check ignition.healthCheck › Spatie\LaravelIg…
  POST       _ignition/update-config ignition.updateConfig › Spatie\Laravel…
  GET|HEAD   api/sample ........................... SampleController@getJson
  GET|HEAD   api/user ...................................................... 
  GET|HEAD   sanctum/csrf-cookie sanctum.csrf-cookie › Laravel\Sanctum › Cs…

                                                          Showing [7] routes
```

## サーバーの起動

```bash
php artisan serve --host 0.0.0.0
```

```text
$ php artisan serve --host 0.0.0.0

   INFO  Server running on [http://0.0.0.0:8000].  

  Press Ctrl+C to stop the server
```

## クライアントでアクセス

```bash
http http://127.0.0.1:8000/api/sample
```

実行結果

```text
$ http http://127.0.0.1:8000/api/sample
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Cache-Control: no-cache, private
Connection: close
Content-Type: application/json
Date: Thu, 05 Oct 2023 07:59:32 GMT
Date: Thu, 05 Oct 2023 07:59:32 GMT
Host: 127.0.0.1:8000
X-Powered-By: PHP/8.1.12-1ubuntu4.3
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59

{
    "name": "john"
}
```

## 確認したバージョン

```text
$ php --version
PHP 8.1.12-1ubuntu4.3 (cli) (built: Aug 17 2023 17:37:48) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.12, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.12-1ubuntu4.3, Copyright (c), by Zend Technologies

$ php artisan --version
Laravel Framework 10.26.2
```
【GitHub】GitHubにpushする際のエラー解決メモ(error: src refspec main does not match any)(error: failed to push some refs to)

日本語に苦戦しているSYOです。

`Qiita CLI`を使用して、`qiita init`を実行したディレクトリ全体を`GitHub`に`push`しようとした際に、以下の問題に遭遇しました。

これは問題を解決するためのメモです。

# 事象

###### コマンド

```
git remote add origin https://XXXXXX.git
git branch -M main
git push -u origin main
```

###### エラー

```
error: src refspec main does not match any
error: failed to push some refs to 'https://XXXXXX.git'
```

# 解決

###### 原因
- 変更をコミットしていない

###### コマンド

```
git add .
git commit -m "First Commit"
git push -u origin main
```

# 参考

[Qiita CLI](https://github.com/increments/qiita-cli)
[Github 初push時のエラー ~ src refspec main does not main any](https://qiita.com/toki_dev/items/a95229217ec7ea9186c5)
DLsite.comを運用している会社が輪読会をやってみた件

## 挨拶
はじめまして。
株式会社viviONの開発部・基盤ユニットに所属しているSLの[大塚 泰成](https://subculturedev.connpass.com/event/257829/)と申します。
私の所属するユニットで輪読会を開催致しましたので、今回はそこで得たメリット・デメリットをご紹介したいと思います。

## そもそも輪読会とは？
> 人々が集まって、同じ教科書などの本を読み、その内容について意見を交わすことを意味する語。事前に決められた担当者が、本の内容を訳したりまとめたりしてから、他の参加者が理解できるように発表する形式がとられることも多い。

[引用元](https://www.weblio.jp/content/%E8%BC%AA%E8%AA%AD%E4%BC%9A)

エンジニア界隈では技術書を題材として輪読会を行われるケースが多いです。
エンジニア組織の抱えている課題に対して、解決の糸口を技術書を介して得ようといった動機から行われることがあります。

## 開催のきっかけと目的

基盤ユニットはマイクロサービスの開発を日々行っており、複数のプロダクトを横断してAPIを提供しています。
その為、コードやインフラ構成などの変更において、
影響度が1プロダクトだけがリリースするよりも大きくなる傾向があります。


影響度の大きさがメリットでもあり課題感でもあるため、「**運用時に、何に気を配るべきか？**」を理解し取り組むことで今後の運用保守が安心安全になり変更容易性が上がり、最終的には会社利益につながるのでは無いかと考えました。
実現する手段として「輪読会はどうかな？」といった意見がメンバーから上がり開催する運びになりました。

## 使用した書籍
[システム運用アンチパターン ―エンジニアがDevOpsで解決する組織・自動化・コミュニケーション](https://amzn.asia/d/apZMyZF)

税込み ￥3,520 (会社経費)

システム運用のセオリーがきっとわかるはず！という期待感から選定
![PXL_20231005_055935509.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/18052c1d-08e7-165d-a5ef-92ebb7121f93.jpeg)

## 輪読会でのタイムスケジュールと方針

### タイムスケジュール

大まかに以下の3段構成となっています。

1. みんなで20分ほど読書する
2. ホワイトボードやオンラインのボードツールに得た知見を貼り付ける
3. 貼り付けた内容についてディスカッションを行う

![ccc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/5d1ebfbc-f9ab-dcae-027b-4d65a0933481.png)

### 方針

無理にTry(Next Action)に繋げようとすると、目的と手段が逆転する可能性があるため一旦はトリビアの泉形式で進めて、皆で知見を持ち帰る会にしようという取り決めになりました。
(へぇ〜は20まで)

## 輪読会の様子
もくもく読書 (時々会話が交じる)
![abc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/9f74091d-dd37-c938-8932-8e03074c7da3.jpeg)

ファシリテーションの様子

※ リモート参加者もいました
![def.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/2cea76fd-7acf-4175-63b9-4f7f94a86bc5.jpeg)


ホワイトボードの様子

※ リモートメンバーはGoogle Jamboardというオンラインボードに記入
![PXL_20231005_031642047.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/8f29baa0-088e-41a2-a8ef-39cc25a9342e.jpeg)

## 輪読会の感想と課題感

### 感想 (感じたメリット)
数章しか読んでいないですが、我々も知らなかったキーワードや日頃思ってはいたけど言語化できていなかった考え方が出てきて今回読んだ数章だけでもやった価値があったなという感想でした。

また、DevOpsの体現に必要な「文化」という項目以外は実施出来ていることに気づけました。
逆に「文化形成」とは何か？どうやって行うべきか？までは今回触れることができなかった為、今後に期待です。

### 課題感

最大の課題感は「**コスト**」でプライベートな時間の読書を強制するわけにもいかず、だからといって就業時間中に全部見れるかというと通常業務もあるので時間確保が厳しそうでした。
(今回の進行度から全ページ見るための時間を逆算)

章ごとに担当者を分割し、メンバーの数だけコストを分割できるのではないかという意見がでたり、
長期戦でもいいから細かく全員でやっていこうといった意見が出て最終的にはまだ結論が出ない形となりました。

## まとめ
実は私は、今回初めて輪読会を行ったのですが、開催にポジティブ側な人間に転生することが無事(?)出来ました。

この記事が「輪読会をやったことがない・やってみたい」「非日常の角度から知識を得て、課題解決したい」といった方の参考になれば幸いです。

## 採用PR
弊社ではマイクロサービス化を推進頂くバックエンドエンジニアを募集中となります。
会員登録なしで、応募資格まで見れます。
ぜひ、ご一読ください！

https://hrmos.co/pages/vivion/jobs/0000226

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307359/2000f749-3e82-7a47-b1c4-4444e237f79c.png" width=45%>