OmniAICreator/Qiita-1.07M huggingface dataset:
【minitest】 request.refererを使用する方法

# はじめに
最近`request.referer`という便利なものがあることを知り、使用する機会がありました。
ですが、minitestを書いている際にリファラを用いたアクションのテストがうまくいかず少し苦戦してしまったため、備忘録を兼ねてここに残しておこうと思います。


# そもそもrequest.refererってなに？
リクエストヘッダーが持っている情報の一つであり、遷移前のURLを取得することができます。

そのため、`request.referer`を活用することで、
- どのページからの流入なのかアクセス解析ができる
- 遷移元のURLに戻りたい時にリダイレクト先として使用できる

といったメリットがあります。

今回は後者のように、`request.referer`をリダイレクト先として使用した時の、minitestの書き方について考えます。


# minitestでのrequest.referer
ここでは`request.referer`を使用して、遷移元のURLに再度リダイレクトするようなアクションのテストを作成することを考えます。

```rb
# get new_pathを叩いた時のアクション
# original_pathからnew_pathに遷移してきたケースを考える
def hoge
    redirect_to request.referer # 遷移元のoriginal_pathにリダイレクト
end
```

上記アクションによって`original_path`に遷移していることを確認したいとき、どのようにテストを記述すれば良いのでしょうか。

## 失敗するやり方

遷移元のURLを再現するために`original_path`を叩いてから`new_path`を叩けばいいのでは？と思い下記の方法を試してみましたが、うまくいきませんでした。

```rb
test 'request.refererを使用したアクションのテスト' do
    get original_path
    get new_path
    assert_redirected_to original_path
end

# 実行結果
# => Minitest::Assertion: Expected response to be a <3XX: redirect>, but was a <500: Internal Server Error>
```


エラーの発生箇所を調査してみると、コントローラー側で下記のようなメッセージが出ており`request.referer`がnilであることがわかります。
つまり、リクエストヘッダーにリファラをセットできていない状態です。

```ruby
# Rendering with exception: Cannot redirect to nil!
```

ではminitestでリファラをセットするにはどうすればいいのでしょうか。

## 成功するやり方

```rb
test 'request.refererを使用したアクションのテスト' do
    get new_path,
        headers: {'HTTP_REFERER' => original_path}
    assert_redirected_to original_path
end
```

上記のように、リクエストヘッダーにリファラを明示的にセットしてあげることで、リファラを用いたアクションのテストを記述することができるようになりました。

# まとめ
- `request.referer`を用いることで、遷移元のURL情報を取得することができる。
- minitestで再現する場合、リクエストヘッダーにリファラを持たせることを明記する必要がある。

### ちなみに
`request.referer`と書くことが多いですが、正しい英単語はreferrerだそうです。
エイリアス設定されているおかげで、refererもreferrerも同じ動作をします。


### 参考
- [【Ruby on Rails】超便利！request.refererを活用して元のページにリダイレクトする方法]
- [【Rails】特定のページから遷移した時だけ前のページにリダイレクトするリンクを表示する]
- &emsp;[Ruby on Rails request.refererとrequest.referrer]
- &emsp;[Railsでリファラー(referer)を取得]
- [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典]





[【Ruby on Rails】超便利！request.refererを活用して元のページにリダイレクトする方法]:https://qiita.com/nao0725/items/54ed720300370dc25dc8

[【Rails】特定のページから遷移した時だけ前のページにリダイレクトするリンクを表示する]:https://qiita.com/soyanchu/items/f0986167503b25e73153

[Ruby on Rails request.refererとrequest.referrer]:https://qiita.com/syshun/items/0d3436e32ad6d39e206d

[Railsでリファラー(referer)を取得]:https://easyramble.com/rails-request-referer.html

[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典]:https://wa3.i-3-i.info/word129.html
証明書関係の整理

* SSL証明書:SSL(Secure Sockets Layer)の暗号化通信に必要な3種類の電子証明書。
　→SSLの仕組みでは、少なくともブラウザにあらかじめインストールされている「ルート証明書」とサーバー側にインストールする「SSLサーバー証明書」の2種類が必要。最近では、「中間証明書」を加えて、3種類の証明書を使用することが一般的。

|証明書名  |説明  |
|---|---|
|ルート証明書  |SSLサーバー証明書を発行するルート認証局が、自身で認証局の信頼性を証明した証明書のこと|
|中間(CA)証明書  |中間認証局によって発行されます。中間証明書は、SSLサーバー証明書を発行するルート認証局の署名を照合する際に使用|
|SSLサーバー証明書 |Webサイト運営者の実在を証明し、インターネットの暗号化通信を行う電子証明書→ドメイン認証、OV認証、EV認証の3つの種類に分けられる
|　
* 認証局:認証局（CA：Certification Authority）とは、デジタル証明書を発行する機関で、電子証明書の登録、発行、失効を行う第三者認証機関
　→SSLサーバー証明書やルート証明書を発行できるルート認証局、中間証明書を発行できる中間認証局など
* クライアント証明書：接続元であるクライアントPCが本物であるかどうかを確認する証明書

| 拡張子 | 説明 |
|:-:|:-:|
|csr   |SSL/TLS サーバー証明書を発行するための証明書署名要求書のこと
|crt   |CSRファイルが正しいかをSSL証明書会社が証明しているもの。   |
|key   |SSL通信に利用する公開鍵暗号系の秘密鍵ファイル   |
|cer   |CSRファイルとCRTファイルの仲介役的なもの。中間証明書。なくても動いたりするブラウザもあるけど基本的にSSL化するサーバーに必要   |
|pem   |ファイル書式が決まった入れ物のことで、証明書、鍵をいくつでも含めることが可能。書式はシンプルで、任意の証明書、鍵をbase64エンコードして以下のBEGIN/END行で挟んでつなげただけのテキストファイル。pem の書式（鍵＋証明書）   |
WordPress SEOの基本

## `SEOとは何か`

- **SEO（Search Engine Optimization）の定義**: ウェブサイトを検索エンジンでより上位に表示させるための最適化のこと。

- 検索エンジンの結果ページ（SERP）でウェブサイトの可視性を高めるプロセスです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/5150b969-d69c-5200-e046-44aab041a3c7.png)
[参照](https://mieru-ca.com/blog/seo-measures/)

---

## `WordPressにおけるSEOの重要性`

- **トラフィックの増加**: SEOを最適化することで、検索エンジンからの訪問者数が増加します。
- **ユーザーエクスペリエンスの向上**: 良いSEO戦略は、ユーザーにとってより良いナビゲーションと情報提供を意味します。
- **オンラインでの信頼性向上**: 上位の検索結果は、信頼性と専門性を示すと見なされます。



---

## `WordPress SEOの基本的な要素`

1. **キーワードリサーチ**:
   - ターゲットとするキーワードを特定し、コンテンツに組み込む。
   - これは、検索ユーザーが最も関心を持ちそうなトピックやフレーズを理解するプロセスです。

2. **コンテンツの質**:
   - 高品質で関連性の高いコンテンツを作成する。
   - ユーザーにとって有益で、読みやすいコンテンツを提供することが重要です。

3. **パーマリンクの最適化**:
   - URL構造をクリーンでわかりやすい形式に保つ。
   - パーマリンクには、重要なキーワードを含めることが推奨されます。

4. **メタデータの最適化**:
   - タイトルタグとメタディスクリプションに関連キーワードを使用し、クリック率を高める。
   - これらは、SERPに表示されるテキストの一部です。

5. **画像の最適化**:
   - 画像に`alt`タグを使用し、画像の内容を説明する。
   - 画像のサイズを最適化し、ページのロード時間を短縮します。

6. **モバイルフレンドリー**:
   - サイトがモバイルデバイスで適切に表示されることを確認する。
   - レスポンシブデザインは、SEOにおいて非常に重要です。

7. **ソーシャルメディアの統合**:
   - ソーシャルメディアの共有ボタンを利用し、コンテンツの共有を促す。
   - ソーシャルシグナルは、SEOに間接的な影響を与えます。

---

## `WordPressでのSEOプラグイン`

- WordPressには多くのSEOプラグインがあります。例えば、「Yoast SEO」や「All in One SEO Pack」などが人気です。
- これらのプラグインは、キーワードの最適化、メタデータの生成、サイトマップの作成などをサポートします。
Go言語  レシーバ

## レシーバとは
Go言語における「レシーバ (Receiver)」は、他の言語でよく見られる「this」や「self」といったキーワードに相当する。Goのメソッド内でレシーバを介して構造体のメンバー変数やメソッドにアクセスすることができる。

例えばjavaの場合、クラスのメソッド内でクラスのメンバー変数にアクセスするためには this キーワードを使用します。Goにおけるメソッドではレシーバがその役割を果たし、構造体のフィールドやメソッドにアクセスするために利用される。


## java / Go での比較

```java:java
public class MyClass {
    private int value;

    public void setValue(int newValue) {
        this.value = newValue; // "this"を使ってメンバー変数にアクセス
    }
}

```

```go:go
package main

import "fmt"

type MyClass struct {
    value int
}

func (m *MyClass) SetValue(newValue int) {
    m.value = newValue // レシーバを使ってメンバー変数にアクセス
}

func main() {
    obj := MyClass{}
    obj.SetValue(42)
    fmt.Println(obj.value)
}

```


## レシーバーの種類

```go:値レシーバ
func (m MyClass) methodName() {
    // 構造体がコピーが渡される。
    // メソッド内での変更が元の構造体に影響を与えない。
}
```


```go:ポインタレシーバ
func (m *MyClass) methodName() {
    // 構造体へのポインタが渡される。
    // メソッド内での変更が元の構造体に影響を与える。
}
```

**構造体を参照しない場合**
```go:構造体を参照しない
func (MyClass) methodName() {
    // メソッド内でレシーバを使わない
    // Goの構文上、必ずレシーバを指定(記述)する必要がある。
}
```
Next.jsで実現するオニオンアーキテクチャ (3) - Application Service

:::note warn
記事におけるNext.jsは、v13以降のApp Router （Server Components）を用いる前提での説明となります。
Pages Routerを用いている場合は、適宜Pages Routerでの書き方として読み替えてください。
:::

## この記事は何
最近Next.jsでウェブアプリケーションを作ることが多いのですが、
その時にオニオンアーキテクチャを採用してアプリケーションを作ることが多く、型も固まってきたので数回の記事にわたり紹介をしていきたいと思っています。

前回は

https://qiita.com/getty104/items/9b67900d30f9a02c7c7c

でDomain Model/Domain Serviceについて紹介しました。

今回は`applications`ディレクトリに実装していくApplication Serviceについて説明をしていきます。

## Application Serviceとは
Application Serviceとは、ドメイン層に定義した処理を組み合わせることで、 Application自体のロジックの実装を行なっていくレイヤーです。
他のアーキテクチャでは「ユースケース層」などと呼ばれることもあります。

https://qiita.com/getty104/items/0915eb3b53ed7a265db2#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

でもApplication Serviceについて紹介しています。

Application Serviceでは、以下のような処理を実装していくことになります。

- Domain ModelのインスタンスをRepositoryから取得する処理
- 取得したDomain Modelが持つメソッドの実行、組み合わせ
- 実行結果の永続化処理や、コールバック関数の実行

Repositoryや、外部のツールなどに依存する処理などはInfrastructureレイヤーになるため、Application Serviceよりさらに上のレイヤーになります。

そのため、Repositoryなどは内部で直接参照するのではなく、前回作成したRepositoryなどのインターフェースに依存するようにして、具体的なインスタンスはコンストラクタで受け取るようにします。

## 実装例
Application Serviceを実装していきます。
今回は「ユーザー間の送金処理」を実装していこうと思います。

「ユーザー間の送金処理」とは、以下のような処理と定義します。

- 送金元のアカウントIDと、送信先のアカウントID、送金する額（通貨）を指定する
- 受け取った値を元に、送金元のアカウントから、送金先のアカウントへ通貨を移動させる
- 移動させた結果は永続化する
- 処理完了後、送金元のアカウント、送金先のアカウントへ通知を行う


このような処理を実装すると、以下のような感じになると思います。

```typescript:applications/UserApplicationService.ts
import { User } from '~/models/user/User'
import { UserService } from '~/models/user/UserService'
import { IUserRepository } from '~/models/user/IUserRepository'

export class UserApplicationService {
  public userRepository: IUserRepository

  constructor(args: {
    userRepository: IUserRepository
  }) {
    this.userRepository = args.userRepository
  }

  async sendMoney(args: {
    sendUserUuid: string;
    receiveUserUuid: string;
    money: Money;
    sendNotification: (accountUuid: string) => Promise<void>;
  }) {
    const sendUser = await this.userRepository.findByUuid(args.sendUserUuid);
    if(!sendUser) throw new Error('Send user is not found');
    
    const receiveUser = await this.userRepository.findByUuid(args.receiveUserUuid);
    if(!receiveUser) throw new Error('Receive user is not found');

    const userService = new UserService()

    userService.sendMoney({sendUser: sendUser, receiveUser: receiveUser, money: args.money});

    await Promise.all([
      this.userRepository.save(sendUser),
      this.userRepository.save(receiveUser)
    ])

    await Promise.all([
      args.sendNotification(sendUser.uuid),
      args.sendNotification(receiveUser.uuid)
    ])
  }
}
```

## 最後に
今回の記事では、Application Serviceの実装を行なってきました。
次回はApplication Serviceを実行する上で必要になるInfrastructureレイヤーの実装について説明をしていきます。

## 今までの記事

https://qiita.com/getty104/items/afd6a557f90b130269be

https://qiita.com/getty104/items/9b67900d30f9a02c7c7c
ChatworkをESP32のインターフェイスとして使う

# 動機
M5Stackを使って文字がスクロールする電光掲示板を作ってます。
スクロールする文字列を可変にしたくて、簡単な手法を思いつきました。

Chatworkの特定のルームに投稿した内容を使って文字列を変更する方法です。

# 成果物
気に入っているので、記録に残します。


<details><summary>サンプルコード</summary>

```chatwork_to_m5stack.ino
#include <M5Stack.h>
#include <M5GFX.h>
M5GFX display;
M5Canvas canvas(&display);

#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
const char *SSID     = "myssid";
const char *PASSWORD = "mypassword";

String BASE_URL      = "https://api.chatwork.com/v2/rooms/";
String ROOM_ID       = "xxxxxx";         //RoomID
String MYTOKEN       = "xxxxxxxx";       //Chatwork Token
String URL           = BASE_URL + ROOM_ID + "/messages";

void chatwork_read()
{
  //HTTPClientでGET
  HTTPClient httpclient;
  httpclient.begin(URL.c_str());

  httpclient.addHeader("x-chatworktoken", MYTOKEN.c_str());
  int httpCode = httpclient.GET();
  Serial.println(httpCode);
  if (httpCode==200)
  {
    String payload = httpclient.getString();
    JSONVar jsondata;
    jsondata=JSON.parse(payload);    // JSON形式データの読み込み

    String body = jsondata[0]["body"];
    display.clear(TFT_BLACK);
    display.setTextColor(YELLOW, BLACK);
    display.setCursor(0, 0);
    display.println(body);
  }
  httpclient.end();  //HTTPClient終了
  delay(1000);
}

void setup()
{
  M5.begin();
  display.begin();
  if (display.width() < display.height())
  {
    display.setRotation(display.getRotation() ^ 1);
  }
  display.clear(TFT_BLACK);
  display.setCursor(0, 0);
  display.setFont(&fonts::lgfxJapanMinchoP_32);
  display.println("電光掲示板");

  WiFi.begin(SSID, PASSWORD);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500); Serial.print(".");
  }
  Serial.println("\nWiFi connect: OK    ");

}

void loop(){
  M5.update();
  if ( M5.BtnA.wasReleased() )
  {    // 「Ａボタンを押す」と表示切替
    Serial.println("BtnA");
    chatwork_read();
  }
  delay(1);
}
```
</details>


# 思いついた経過
ESP32にデータ（この場合は文字列）をスマホ等から送る場合は、
+ ESP32側にWebサーバー機能を作成し、スマホからアクセスして渡す
+ blynk等のアプリから渡す

などの方法があるのは知っているのですが、コードが煩雑だったり、アプリの使い方をマスターする必要があったりと、わたしにはハードルが高かったのです。

また、電光掲示板は、他の人にも使ってもらう予定なので、出来る限り簡単に使える方法を模索していました。

たまたま、マイコンの測定値をグーグルスプレッドシートに飛ばして蓄積し、GASでデータを処理させて、Chatworkに日報を送らせる、というシステムを作っていて、ChatworkAPIならマイコン側から投稿文を読みに行かせることもできることを知りました。

そこで思いついてしまいました。
スマホからマイコンへ送るのはハードルが高いけれど、マイコンからChatworkとかを読みに行くのは簡単やん。

その思い付きから作ったのが、上に記載したコードです。


# できるようになったこと
これで、
+ 電光掲示板に表示したい文章を、Chatworkの「電光掲示板」Roomに投稿する。
+ M5Stackのボタンを押す。

たったこれだけで、メッセージを更新できるようになりました！

ボタンを押すのも手間だったり、離れたところにM5Stackが置いてある場合は、定期的に読みに行くコードを書けば、省けます。
ちなみにChatworkAPIは5分間で300回の制約があるようです。十分ですね。

[ChatworkAPI](https://developer.chatwork.com/docs/endpoints)

めんどうなアプリもサーバーも不要です。
Chatworkさえスマホに入れていれば、完結します。
大満足。

以上です。
ドメインとレンタルサーバーの基本



## `ドメインとレンタルサーバーの関係`

- **ドメイン**: `インターネット上でのウェブサイトのアドレス`です。例えば、`www.example.com`など。
- **レンタルサーバー**: ウェブサイトの`データやファイルを物理的にホスト`し、インターネット上でアクセス可能にする場所です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/5a364643-a10f-f1dc-f61e-f6ecee7682b0.png)
[参照](https://www.google.com/url?sa=i&url=https%3A%2F%2Fknowledge.cpi.ad.jp%2Fbasic-knowledge%2F251%2F&psig=AOvVaw3TVI2676uW28VUtW0bVeZV&ust=1700377337385000&source=images&cd=vfe&opi=89978449&ved=0CBMQjhxqFwoTCJi3oKv9zIIDFQAAAAAdAAAAABAI)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/077db6ea-e7e7-e5a9-5695-c8f5ef7579a3.png)
[参照](https://www.google.com/url?sa=i&url=https%3A%2F%2Fknowledge.cpi.ad.jp%2Fbasic-knowledge%2Fdomain-server%2F&psig=AOvVaw3TVI2676uW28VUtW0bVeZV&ust=1700377337385000&source=images&cd=vfe&opi=89978449&ved=0CBMQjhxqFwoTCJi3oKv9zIIDFQAAAAAdAAAAABAE)


---

### 相互作用の仕組み

1. **ドメイン**: ユーザーがウェブブラウザに入力する`ウェブサイトの名前`です。
2. **レンタルサーバー**: このサーバー上にウェブサイトの実際のデータ（HTMLファイル、画像、動画など）が保存されています。
3. **連携**: ドメイン名はレンタルサーバーの`IPアドレスに変換`され、ウェブサイトにアクセスできます。
4. **DNS（ドメインネームシステム）**: ドメイン名を`IPアドレスに変換`する役割を果たします。
超簡単 ダウンロードフォルダとゴミ箱を一括で空にするPSスクリプト

# 1. 動機
気が付くとストレージを圧迫してるダウンロードフォルダ内のファイルとゴミ箱の中身、巡回するのも面倒なので思い立った時にサッと消せないかな…と思って作ってみました。中身は超簡単です。


# 2. スクリプト
スクリプトは2行だけ。
思い立った時にすぐ起動するのはこれ以外にも準備が必要です。(後述)

```PowerShell
#ダウンロードフォルダ内のファイル全削除
Remove-Item -Path C:\Users\Username\Downloads\*.*

#ゴミ箱空にする
Clear-RecycleBin -Force
```

# 3. ダブルクリックでPowerShellスクリプトを実行する
下記の要領でスクリプトのショートカットを設定すると、ショートカットをダブルクリックするだけでスクリプトが起動します。

https://qiita.com/_Sasaki_/items/c8486e58df45333017d7


# 4. 「ファイル名を指定して実行」でスクリプト実行
上記の手順でショートカットを設定しても、ショートカットがある場所までわざわざ行くのがめんどくさいのでパスを通して「Windowsキー + R」押して、適当な文字列でスクリプト起動できるようにすると更に楽です。

手順は下記参照下さい。これで思い立った時に一気にダウンロードフォルダもゴミ箱も空にできます。

https://qiita.com/_Sasaki_/items/8384ba3eda0aa6fe6547

# おわりに
基本自分用の備忘録ですが何かの役に立つと幸いです。
私のスクリプトでイケてないところあれば是非教えてください。
結合の代わりにユニオンと集計を使う 

# 結合の代わりにユニオンと集計を使う 

今回はPreppindata　2023: Week 43 - Best Attendance Awards
の課題をもとに「結合の代わりにユニオンと集計を使う 」データ加工のアプローチ方法
をご紹介します。

また、今回の記事は、「第8回 Tableau Prepユーザー会」の35:00~あたりから、簡単にご説明もしているので、記事での理解は苦手な方がいらっしゃれば是非ご覧ください。

https://www.youtube.com/live/RRL9oiSW9pY?si=x_nXU_oR2IRHJXuN

※使用ver: Tableau Prep Ver.2023.3

## 問題のダウンロードはこちら
https://preppindata.blogspot.com/2023/10/2023-week-43-best-attendance-awards.html

## 出題者の回答はこちら

https://preppindata.blogspot.com/2023/10/2023-week-43-solution.html



#### 要件
1. 各生徒のフルネームフィールドを作成します
2. 年間の出席率を計算（小数点以下第2位を四捨五入）
3. 全体的に出席率が最も高い生徒を検索し、CSV として出力します。
4. 年グループデータに参加する
5. 各学年グループの出席率が最も高い学生の上位 5% を見つけて、これを CSV として出力します (ヒント: ここではパーセンタイル ランクが役立つ場合があります)。



<br>

## 入力の確認

ダウンロードしたフォルダを見てみると、以下のように同じフォルダにタームごとの欠席・出席日数データと学年のデータが存在しています。


タームごとの欠席・出席日数データは3つあるため、複数ファイルに渡って同じ生徒名が存在し、
学年データは1ファイル(1生徒1レコードデータ)が存在します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/8339fd20-90de-6e5d-0fd6-c832c6dd5f1b.png)

## 出力の確認

今回はこの4つのファイルデータをもとに2つの出力を作成します。

- 出力1: 「優秀出席賞」 (出席率が一番高かった生徒)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/db57b1b2-5e77-d77a-6c3a-1d88a0b0e1e5.png)

<br>

- 出力2:「スーパースター出席率」 (出席率上位 5%の生徒)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/a8f0ec95-4c6e-9a34-7d9c-84337ade15b7.png)

## つまりわかりやすく言うと
4ファイルに存在する同じ生徒を以下のように各生徒1レコードにしてから、出席率を計算したい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/a78bbc4c-7fc8-452d-85a2-ac868148e14c.png)


## 手法1.ユニオン&集計&結合
今回は1つのフォルダに種類の違うデータファイルが存在するので、ワイルドカードユニオンのフィルタで* Year *一致しませんとすることにより学年データ以外をフィルタしワイルドカードユニオンします。

※ここではワイルドカードの記法については詳しく触れませんので、気になった方は以下の記事がわかりやすかったのでご覧ください。

https://www.cando.co.jp/column/column_15.html#:~:text=%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%92%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B,%E3%81%AB%E3%82%88%E3%81%8F%E5%88%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/6bd42406-7600-d3ec-e2ec-b192ff8f3a54.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/763849a9-9440-3ebd-fe3a-7207810f53b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/6f43cb17-766d-9a72-bb6f-f95ae3298188.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/fd8eb2e0-aee6-335c-49f4-e08ca56c62a4.png)


## 手法2.結合の代わりにユニオンと集計を使う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/ee21b0fb-53b7-5edf-97e1-79a580762522.png)

### 手順2:集計で1レコードにしながらNullの処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591095/0687d4cf-2885-e0ed-d5f4-45ba2d404ad7.png)

あとは方法1の手順4の方法と同じく、出席率の計算を行い完成です。

##  ユニオン&集計が効くケース


- 1レコードに集計して結合するものならユニオンして集計するとステップが減ってスッキリ

- ワイルドカードユニオンする際にもファイル名わざわざ見て命名規則見つけてフィルタかける処理が不要

- どちらかのファイルの生徒名に欠損がある場合でも処理できるのでケースよっては便利だったりします。(これは結合でも実現可能)







## おわりに
今回はPreppindata の課題を基に、Tableau Prepで結合の代わりにユニオンと集計処理する例をご紹介しました。
これがベストプラクティスというわけではありませんが、データの前処理のアプローチの手法の1つとして持っておくと何かと便利です。
初めて知ったという方は1つのPrepスキルの引き出しとしてお持ち帰りいただけると幸いです。

最後までご覧いただきありがとうございました。
RefSeq（遺伝子発現データベース）IDからTAIR（シロイヌナズナ情報リソース）IDへの変換

RefSeqIDをTAIRIDに変換する方法をメモしておきます。
プログラミング言語にはRを用いました。
実行環境：MacBook Air M1, 2020

# RとRStudioのインストール
下記のURLから、RとRStudioをインストールします。
https://posit.co/download/rstudio-desktop/
インストール方法は下記のURLの記事にわかりやすく書かれています。
https://qiita.com/azzeten/items/1031c788ed093d3b3946

# Bioconductorとorg.At.tair.dbのインストール
Bioconductorとorg.At.tair.dbをインストールします。
https://www.bioconductor.org/install/
https://bi.biopapyrus.jp/rnaseq/annotation/org.at.tair.db.html
RStudioを起動し、以下のコードを実行します。
```R
if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install(version = "3.18")

BiocManager::install("org.At.tair.db")
```

# RefSeqIDからTAIRIDへの変換
RefSeqIDが書かれたinput.txtを~/refseq2tairディレクトリ（任意のディレクトリ）に配置します。
```input.txt
RefSeq
NP_171609.1
NP_001030923.1
NP_001322175.1
NP_171612.1
NP_001322481.1
```
RStudioを起動し、下記のコードを実行します。
```R
# refseqIDをtairIDに変換
setwd("~/refseq2tair") # 任意のディレクトリに移動
getwd()

library(org.At.tair.db)

table = read.table("input.txt", header = TRUE, sep="\t")
library(stringr)
table$refseq <- str_sub(table$RefSeq, end = -3)

ID <- as.list(org.At.tairREFSEQ2TAIR)
table$tair <- ID[table$refseq]
sapply(table, class)
table <- dplyr::mutate(table, tair = as.character(tair)) # list型をcharacter型に変換
sapply(table, class)

write.table(table, file = "output.txt", col.names = T, row.names = F, sep="\t", quote = F)
```
これにより、~/refseq2tairディレクトリにoutput.txtが出力されます。
```output.txt
RefSeq	refseq	tair
NP_171609.1	NP_171609	AT1G01010
NP_001030923.1	NP_001030923	AT1G01020
NP_001322175.1	NP_001322175	AT1G01030
NP_171612.1	NP_171612	AT1G01040
NP_001322481.1	NP_001322481	AT1G01050
```
RefSeqIDをTAIRIDにまとめて変換することができました。
AssetsからTextureResourceをLoadできない

Vision OS用にRealityKitでこんな感じで画像からTexttureを生成しようとしたのですが、画像によっては何故かエラーが発生してしまいました。

画像は、Assetsに入れてあり、大きさも同じなのですが、1はOKでも、2は読めないみたいな事象が起きており、悩んでいたのですが、

```
guard
    let texture1 = try? TextureResource.load(named: "1"),
    let texture2 = try? TextureResource.load(named: "2")
else {
    // error
}
```

Assetsからの画像読み込みだと暗くなるという記事を見つけたので、もしやと思い、Bundleから読み込むようにしてみました。すると、

```
guard
    let url1 = Bundle.main.url(forResource: "1", withExtension: "png"),
    let texture1 = try? TextureResource.load(contentsOf:url1, withName:nil),
    let url2 = Bundle.main.url(forResource: "2", withExtension: "png"),
    let texture2 = try? TextureResource.load(contentsOf:url2, withName:nil),
else {
    // error
}
```

原因は不明ですが、うまく読み取れました。参考になれば。
xmllintでxmlタグの値を取得

xmllintでタグの値を取得したい場合、このようにワンライナーで取得できる。

```shell
echo 'cat /note/body' | xmllint --shell /home/vpsuser/conf/sample.xml | grep body | sed 's/^.*<body.*>\(.*\)<\/body>.*/\1/'
```

```:実行結果
Don't forget me this weekend!
```


サンプルxmlの内容は下記の通り。（今回はDon't forget me this weekend!を取得）

```xml:sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
```

※備考
・このcatは、xmllintの内部コマンドであり、通常のLinuxコマンドのcatとは別物である。
・xmllintの--shell オプションは標準入力からxmllintの内部コマンド（この場合はcat）を読んで実行する。

shellscriptで実行するなら下記
```shell
value=`echo 'cat /note/body' | xmllint --shell /home/vpsuser/conf/sample.xml | grep body | sed 's/^.*<body.*>\(.*\)<\/body>.*/\1/'`
echo $value
```
【超基本】REST APIに関するPostmanの簡単な使い方

# 本記事について

本記事は本当に基本的な内容のみを紹介させて頂くので、既にPostmanの利用経験がある方にとって読む価値はないと考えます。

## はじめに

### Postmanとは
APIを開発・テストするためのコラボレーションプラットフォームであり、API通信の動作確認を行うことができます。

利用には、[postman.com](https://www.postman.com/) からログインを行う必要があります。

## 利用方法

サインインしますと

![Workspaces画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/f1a0ba95-5f0c-2618-881f-74ca88b5c025.png)

のようなが画面が表示されると考えます。

Overviewといった表示されているタブを全て閉じると![HTTP選択画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/d37172bd-1374-8e04-d555-2b4d80817969.png)

このような画面になるので、赤丸があるHTTPをクリックします。

すると以下のページが開かれます。

![スクリーンショット 2023-11-18 14.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/a80b5f77-c4ac-3c61-0d45-635dd7161980.png)

後の操作は想像できると思いますが。

1. 動作確認をしたいAPIのURLを入力
2. HTTP メソッドを選択
2. Sendをクリック 

このように、Postmanでは非常に簡単にAPIの動作を確認することができます。

※localhost:3000/ といったローカルホストへのアクセスはDesctop版のインストールが必要になります。

## おわりに
自身の忘備録的な役割もかねて、記事を公開させて頂きました。
この記事がお役に立てる機会があれば嬉しいです。
WordPressの基本

## 概要
WordPressは、世界で最も広く使用されている`コンテンツ管理システム（CMS）`です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/5c4149bb-e019-370d-bc6d-4c3c313b2a7f.png)


CMSは、ウェブサイトのコンテンツを作成、管理、公開するためのソフトウェアであり、非技術者でもウェブサイトのコンテンツを簡単に管理できます。

WordPressは、このような機能を提供するプラットフォームであり、ウェブサイトやブログの作成と管理に特に適しています。


---

## なぜWordPressを使うのか (特徴)
- **利用の容易さ**: 初心者にも扱いやすく、`直感的なインターフェイス`を持つ。
- **柔軟性**: さまざまな種類のウェブサイト（ブログ、企業サイト、ポートフォリオ、オンラインストアなど）に対応。
- **カスタマイズ性**: 数千のテーマとプラグインにより、`外観と機能を簡単にカスタマイズ`できる。
- **コスト効率**: `オープンソース`であり、多くの場合無料で利用できる。
- **コミュニティのサポート**: 世界中の開発者やユーザーによる`強力なサポートネットワーク`。
- **SEO対応**: `検索エンジンに最適化`された構造で、サイトの視認性を高める。

---

## WordPressの使用例
- **個人ブログ**: 趣味や情報共有のためのブログ。
- **企業ウェブサイト**: 企業の公式サイトやプロモーションページ。
- **オンラインストア**: `WooCommerce`などのプラグインを使用したeコマースサイト。
- **ポートフォリオ**: アーティストやデザイナーの作品展示。
- **教育サイト**: オンラインコースや教材の提供。

---

例えば
- [オリエンタルランド](https://www.olc.co.jp/ja/index.html)
- [東京国立近代美術館](https://www.momat.go.jp/)
- [ファミ通App](https://app.famitsu.com/)
- [manablog](https://manablog.org/)
- [ヒトデブログ](https://hitodeblog.com/)

---

## WordPress.org と WordPress.com
### WordPress.org
- **自己ホスト型**:
  - 完全な制御権とカスタマイズ性を提供。
  - 自身でホスティングを用意し、`WordPressをインストール`する必要がある。
  - **例**: 自分の家を建てるようなもの。土地（ホスティング）を購入し、好みに合わせて家（ウェブサイト）を建てる。

### WordPress.com
- **ホスティング型**:
  - 基本機能は無料。しかし、カスタマイズや機能拡張には制限がある。
  - ウェブサイトのホスティングが`WordPress.comによって提供`される。
  - **例**: アパートを借りるようなもの。建物（ウェブサイト）は用意されているが、カスタマイズには制限がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/be8b21fb-0833-b9f2-c593-e49b59437c32.png)
[参照](https://webst8.com/blog/wordpress-org-com/)

---

## Wordpressのシェア率

WordPressのシェアは、Webサイト全体で43.3%、世界のCMS全体で65.1%です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/dd598d1d-9b4b-34ac-5560-37c3ce924ba9.png)
[入社1年目][配属後半年] 基本情報技術者試験合格と今の感想

先日，IPAが主催している基本情報技術者試験に合格しました．
今回は受験する動機と実際に受験に向けてやったこと，今の感想を述べます.


# 前提（筆者の状況）
・機械系出身→配属でIT部門
・学生時代の研究でPythonで配列操作をやっていました ← **ここ重要**
・実務経験はほとんどなし（研修でネットワーク，データベース等の講座は視聴）
・配属後半年で受験→合格

# 使った教材，参考書

[・技術評論社，令和05年　基本情報技術者　合格教本](https://gihyo.jp/book/2022/978-4-297-13164-7 "技術評論社，令和05年　基本情報技術者　合格教本")
（最終アクセス，2023年11月18日）

[・独立行政法人　情報処理推進機構　令和5年度 公開問題 問題冊子・解答例（PDF）](https://www.ipa.go.jp/shiken/mondai-kaiotu/sg_fe/koukai/2023r05.html "独立行政法人　情報処理推進機構　令和5年度 公開問題 問題冊子・解答例（PDF）")
（最終アクセス，2023年11月18日）

# 受ける動機
・部内の人に「とりあえず受けよう」みたいな雰囲気を感じた．（自身で勝手に）
・IT部門の人ならとりあえずとるべきなのか...という先入観

# 実施したこと
・合格教本を簡単に1周読む（期間は1~2週間）
・2周目は精読しながら，自分が知らない・理解しにくそうな部分に印をつける（1~2か月）
・2周目で印つけた部分をノートなどにまとめながら理解を深める
　→アプリでの問題演習を同時並行

分からない部分の理解は仕事が始まってきた関係で隙間時間でやっていたので，
期間としては3か月くらいかけながらやっていた気がします...
集中して取り組めば，こちらも1～2ヶ月で出来る気がします．

# 結果
**合格**
・科目A：665点（ギリギリやないかい:no_mouth:）
・科目B：805点


# 受験後の感想
・得意な部分と苦手・理解していないところが浮き彫り（これはうれしい点)
・科目B試験対策何もしていない...

私の業務内容がシステム導入・運用よりなこともあり，プロジェクト管理系の部分はわかる問題が多かったです．
また，数学的な部分やアルゴリズムの部分は学生時代の知識がそのまま表れた結果になりました．
科目Bに関しても，研究時代の経験だけでなんとかなってしまいました．
（特定の言語ではなくなったのが大きかったです）

一方で，ネットワークやデータベース，セキュリティ関連の問題は技術的な知識が問われるもので理解しきれていないのが顕著に現れました．

# 今後の方針

応用情報技術者までは取得したいですが，まずは理解できていない部分を復習するところから始めます．
資格取得は知識整理や自身の能力を客観的に判断できるのでいいものだなと思いました．
定期的に興味あるものは受験していきたいです．


**最後に**
この記事を書くのにも苦労したのでHTML,CSSの勉強もした方がいいのでしょうか...
AWS OrganizationsとIAMの違い

# AWS OrganizationsとIAMの違い

AWS (Amazon Web Services) は、クラウドコンピューティングプラットフォームとして広く利用されており、その中には様々な管理ツールが存在します。特に、AWS OrganizationsとIAM (Identity and Access Management) はAWS環境で重要な役割を果たしますが、これらは異なる目的と機能を持っています。本記事では、AWS OrganizationsとIAMの違いについて、初心者でも理解しやすいように解説します。

## AWS Organizations

### 複数AWSアカウントの集中管理

AWS Organizationsは、複数のAWSアカウントを集中的に管理するためのサービスです。

#### 特徴

- **アカウント管理**: 複数のAWSアカウントを一元的に管理し、新しいアカウントの作成や既存アカウントの統合を容易にします。
- **ポリシーベースの制御**: 組織全体にわたるアクセスポリシーやリソースの使用制限を設定できます。
- **コスト最適化**: 複数アカウント間でリソースの共有や課金の集約を行うことで、コストを最適化できます。

#### ユースケース

- 複数の部門やプロジェクトにまたがる大規模組織でのAWSリソースの管理。
- 組織全体のセキュリティポリシーとコンプライアンス要件の適用。

## IAM (Identity and Access Management)

### 個々のAWSリソースへのアクセス管理

IAMは、個々のAWSリソースへのアクセスを管理するためのサービスです。

#### 特徴

- **ユーザーとグループ**: 個々のユーザーやグループを作成し、特定のAWSリソースへのアクセス権を割り当てます。
- **ロールとポリシー**: 特定のAWSリソースへのアクセスを制御するためのロールとポリシーを定義します。
- **セキュリティ強化**: 多要素認証やアクセスログを用いて、セキュリティを強化します。

#### ユースケース

- 個々のAWSリソースへの細かいアクセス制御。
- ユーザーやアプリケーションごとに異なるアクセス権限の設定。

## AWS OrganizationsとIAMの主な違い

AWS OrganizationsとIAMは、その目的と範囲において大きな違いがあります。AWS Organizationsは複数のAWSアカウントの管理を中心に機能し、組織全体のポリシー設定やアカウント間のコスト管理に焦点を当てています。一方、IAMは個々のAWSリソースへのアクセス管理に特化しており、具体的なユーザーやグループ、ロールを通じてアクセス制御を行います。

## まとめ

AWS OrganizationsとIAMは、AWS環境における重要な管理ツールですが、彼らの役割と機能は異なります。AWS Organizationsは組織全体のアカウント管理とポリシー設定に焦点を当てているのに対し、IAMは個々のリソースへのアクセス制御に特化しています。これらのサービ

スを適切に活用することで、AWS環境のセキュリティと効率性を向上させることができます。AWSを利用する際には、これらのサービスの違いを理解し、組織のニーズに合わせて最適な管理戦略を立てることが重要です。
ZappaでFlaskをLambdaにデプロイ

## はじめに
ご覧いただきありがとうございます！
zappaを使ってLambdaにデプロイする方法を自分の備忘録も兼ねて書いてみました。
初心者なので、間違いがあればご指摘いただけると幸いです。

##  zappaとは？
 zappaとは、AWS Lambda上でFlaskやDjangoなどのWebアプリケーションを簡単にデプロイできるフレームワークです。
 zappaを使うとLambda関数やAPI Gatewayの設定など、複雑なAWSリソースのセットアップを自動的に行なってくれるため、手動で設定する手間を省いてくれます。


 ## 1. Flaskをインストール
 pythonの仮想環境を用意してFlaskをインストールします。
 
```
$ pipenv install Flask
```
 ## 2.ファイルの作成
 "Hello world!"を表示するファイルを用意します。

 
 ```hello.py
 from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

 ```
 ## 3. zappaをインストール
 ※AWS CLIはアクセスキーを作成し、事前にインストールしておきます。
 ```
 $ pipenv install zappa
 ```

 ## 4. zappa設定ファイルを生成
 ```
 $ zappa init
 ```
 デプロイ環境の名前を設定します。何も指定しなければdevになります。
 今回はそのままEnterで進みます。
  ```
  What do you want to call this environment (default 'dev'): 
 ```
 ソースコードをアップロードするS3の名前を設定します。何も指定しないとランダムで生成された名前になります。こちらもこのままEnterで進みます。
 
 ```
Your Zappa deployments will need to be uploaded to a private S3 bucket.
If you don't have a bucket yet, we'll create one for you too.
What do you want to call your bucket? (default 'zappa-********'): 
```
次にFlaskアプリの起動ファイルを選択します。
デフォルトで指定してくれているので、こちらもそのままEnterで進みます。
```
It looks like this is a Flask application.
What's the modular path to your app's function?
This will likely be something like 'your_module.app'.
We discovered: hello.app
Where is your app's function? (default 'hello.app'): 
```
次にAWS Lambda関数を異なるAWSリージョンに展開するかどうか聞かれますが、今回は特にその必要はないためこのままEnterを押します。
```
You can optionally deploy to all available regions in order to provide fast global service.
If you are using Zappa for the first time, you probably don't want to do this!
Would you like to deploy this application globally? (default 'n') [y/n/(p)rimary]: 
```
最終確認です。問題なければこのままEnterを押します。
```
Okay, here's your zappa_settings.json:

{
    "dev": {
        "app_function": "hello.app",
        "aws_region": "ap-northeast-1",
        "profile_name": "default",
        "project_name": "zappa-app",
        "runtime": "python3.11",
        "s3_bucket": "zappa-********"
    }
}

Does this look okay? (default 'y') [y/n]: 
```
設定が完了するとアプリのディレクトリ内に「zappa_settings.json」が作成されました。
これでzappaの設定は完了です。

## 5. AWSへデプロイする
引数に環境名(今回はdev)を入れて、以下のコマンドを実行します。
```
$ zappa deploy dev
```
デプロイが成功すると以下のURLが表示されます。
xxxxxの部分はデプロイ毎に変化します。
```
Deployment complete!: https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
```
ブラウザで URL にアクセスすると"Hello, World!"と表示されているはずです。
これでデプロイ完了です👏
ちなみにソースコードを変更した場合は、以下のコマンドで更新すればOKです。
```
zappa update dev
```
## その他コマンド

現在のデプロイ状態の確認
```
zappa status 
```
ログの確認
終了する時は Ctrl + C 
```
zappa tail
```
デプロイしたアプリを削除する場合
```
zappa undeploy 
```

## 最後に
最後までご覧いただきありがとうございます！
zappaを使ってLambdaにデプロイする方法を紹介しました。
サーバレスなアプリを簡単にデプロイできるので、とても便利ですね！
【Ruby】クラス定義についてサクッと解説！

## 内容

Rubyにおけるクラス定義はオブジェクト指向プログラミングの核心部分です。この記事では、基本的なクラス定義から継承、クラス式の評価順序に至るまでを掘り下げていきます。

### 基本のクラス型

```ruby
class Foo
  def initialize(a)
    @a = a
  end

  def method1
    @a
  end
end

foo1 = Foo.new(1)
foo2 = Foo.new(2)
p foo1.method1 # 出力: 1
p foo2.method1 # 出力: 2
```

`initialize` メソッドではインスタンス変数 `@a` に引数 `a` を代入しており、`method1` ではこのインスタンス変数を返すように定義されています。

#### クラスへの代入

```ruby
a = Foo
b = a.new(1)
p b.method1 # 出力: 1
```

クラス自体もオブジェクトであり、変数に代入して操作することができます。

### クラス式の評価順序

```ruby
p 1 # 出力: 1

class Hoge
  p 2 # 出力: 2
end

p 3 # 出力: 3
```

この例では、クラス定義の内外でのコードの実行順序を示しています。

### インスタンスのクラスを調べる

```ruby
p foo1.class # 出力: Foo
```

オブジェクトがどのクラスのインスタンスであるかを調べる方法です。

### 継承クラス

```ruby
class FooExt < Foo
  def initialize(a, b)
    @b = b
    super a
  end

  def method2(c)
    @a + @b + c
  end
end

fooExt = FooExt.new(3, 4)
p fooExt.method1 # 出力: 3
p fooExt.method2(5) # 出力: 12
```
`FooExt` クラスは `Foo` クラスを継承しており、`initialize` メソッドでは `super` を用いて親クラスのコンストラクタを呼び出しています。このクラスは、追加のインスタンス変数 `@b` を導入し、新しいメソッド `method2` を定義して、`@a`、`@b`、および追加の引数 `c` の合計を計算します。
【C#】Null許容参照型かリフレクションで確認する方法

## 概要

`string?` のようなNull許容かどうかを確認する方法を記述します。
`System.Runtime.CompilerServices.NullableAttribute`を使えば良いという記事を見かけますが、`.NET 7`では`internal`になっていて使えなくなっていたため最新の方法を調査しましたので記事にします。

## コード

```csharp
using System.Reflection;

static class TypeExtensions
{
    public static bool IsNullableReference(this PropertyInfo _this)
    {
        var nullabilityInfoContext = new NullabilityInfoContext();
        switch(nullabilityInfoContext.Create(_this).ReadState)
        {
            case NullabilityState.Nullable: 
                return true;
            case NullabilityState.NotNull:
                return false;
            default:
                throw new InvalidOperationException("Nullable reference must be enabled");
        }
    }
}
```
ちなみに`NullabilityInfoContext`をフィールドに置いて使い回したら例外が発生しました。毎回生成するのが正解のようです。
面接技法（産能通信・通学スクーリング）

## 面接技法（通学スクーリング）

![F-YA65bbEAAqc9f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/f5be54a3-f092-76db-43c8-61dfc9f10517.jpeg)

本科目では、カウンセリングの理論と技法、そして具体的な進め方について学ぶ。臨床心理学におけるカウンセリングの理論として、ロジャーズによるクライエント中心療法の傾聴をベースとし、フォーカシングや解決志向アプローチ（ブリーフセラピー）、認知行動療法といった理論について理解を深める。本科目を通じて「治療・解決的カウンセリング」「予防的カウンセリング」「成長支援的カウンセリング」といった、心の健康をサポートする専門的なカウンセリングの基礎を理解する。（シラバスより）

### 到達目標
①臨床心理学におけるカウンセリングの専門的理論の基礎を理解できる。
②カウンセリングを行う上で注意しなければならない枠組みについて理解できる。
③カウンセリングを実施するための具体的なプロセスや技法について理解できる。

### 担当教員
<a href="https://www.sanno.ac.jp/tandai/information/teachers/massaki.html">末﨑 裕康</a> 先生（産業能率大学情報マネジメント学部 教員）

心理学系コースのゼミナールや卒業研究も担当されています。
インド人を目指されています。

一番下にスクロールすると末崎先生のコメントがあります。

https://www.sanno.ac.jp/tukyo/learn/university/psychology_counseling.html
### テキスト
<a href="https://www.seishinshobo.co.jp/book/b146806.html">新しいカウンセリングの技法</a>　諸富　祥彦 （著）

ジャンル：カウンセリング
出版年月日：2014/01/30

<img width="240" alt="新しいカウンセリングの技法" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/d9bd281e-c42d-a275-8f93-4b6448318484.jpeg">

>この１冊でカウンセリングの実際と具体的な進め方がまるごとわかる！重要技法の使いどころを完全網羅した現場で役立つ画期的な技法書

第1章　はじめて学ぶ人のために ①―あらゆるカウンセリングの基本
第2章　はじめて学ぶ人のために ②―よい「傾聴」の基本姿勢
第3章　カウンセリングの基本的な流れ―カウンセリングのプロセスは「三段階方式」で
第4章　六種類のカウンセリング・プロセス
第5章　面接の前に―カウンセリングの「五つの枠」を整えておく
第6章　いよいよ開始！―受付時とインテーク面接で聴いておくべきポイント
第7章　初期の面接の技法
第8章　クライアントの理解を深める―面接記録の作成とスーパービジョン
第9章　中期の面接の技法
第10章　ケース理解を深める
第11章　後期の面接の技法
第12章　カウンセリングの終結
第13章　カウンセリング学習における「技法」の位置づけ 

### 通学スクーリング
産業能率大学の通学スクーリングは土日連続で開講されることが多いですが、今回は平日の火曜日、水曜日の連続授業を申し込みました。土日が仕事という方もいるので、平日のスクーリングも需要はあると思いますが、参加者は１５人でした。私の場合は、有給休暇を使って参加しました。

なお、科目修得試験（カモシュウ）で評価後にスクーリングを申し込むことは可能なので、先に単位修得してから余裕があれば、スクーリングに参加するのもありかと思います。

▼スクーリング当日

自由が丘駅から２０分ほど歩きます。
![F-UzssSbQAAr42T.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/4de712ed-1676-98ac-7298-f354d5ba6383.jpeg)

自由が丘のキャンパスは、住宅地の中にあり、複数の建物が点在してますが、産能通信の授業は７号館で開講されます（自由が丘駅から一番離れています）。
![F-UzzS2bcAAhoMB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/fe9ba69e-6884-8576-f3db-f16a38496f41.jpeg)

７号館に到着すると、どの教室で開催されているか授業の案内が一階に掲示されています。
![F-UzwTiaYAAZE_S.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/8bc51500-cda4-9c88-9df1-8de9c645835f.jpeg)

昼食は、教室内でとれますが気分転換に外に出てもいいかもしれませんが、飲食店がありません。５階に行くとラウンジあるので、そこでとってもいいかもしれないです。

１日目　９時３０分～１７時５０分（適時、休憩。昼１時間休憩）
２日目　９時３０分～１７時５０分（適時、休憩。昼１時間休憩）＋最終試験

### 感想

私が所属しているのが心理カウンセリングコースというのもありますが、書籍だけ読んでも心理学が身に付くとは思えません。特にカウンセリングは人を相手としてコミュニケーションをとる必要があり、訓練が必要かと思います。

カウンセリングの技法でリフレクションなどの技法を学んだり、グループワークでディスカッションしたり、実際のカウンセリングの動画の見たり、通学スクーリングで得たものは大きかったと思います。他の学生さんと通信だと直接、話す機会は中々ありませんが、授業で話を聞いたり、参考にさせていただいたり、授業のモチベーションが上がったり参加することはとてもよかったです。他の通学スクーリングも時間をとって受けたいと考えています。

２日間、お疲れさまでした。

## 過去の記事

### 1回目の記事（出願～入学式）
https://qiita.com/skizaki/items/2621e999fe07f42391e7

### 2回目の記事（入学３か月後）
https://qiita.com/skizaki/items/1dbcd673a51b46d7b680

### 3回目の記事（入学5か月後）
https://qiita.com/skizaki/items/1eecce9824143fc10ee8

### 4回目の記事（心理学系の資格を目指す）
https://qiita.com/skizaki/items/d216d6208d524cfb7609

### 5回目の記事（人間関係の心理学）
https://qiita.com/skizaki/items/79159a494822d15a13fc

### 6回目の記事（目指せ認定心理士①）
https://qiita.com/skizaki/items/56beab4e4abb9d6a15ea

※随時、ブログを更新します。
WebClientを用いての外部APIの呼び出し方

Java SpringBoot内でのWebClientを用いての外部APIの呼び出し方

※共通は各通信の場合で呼ばれているメソッド

（共通）
```java:WebClientInfo.java
    public WebClient webClient;

    public WebClientInfo(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("http://localhost:8082").build();
    }
```

 ## （GET通信の場合）　※クエリパラメータ方式の場合
```java:WebClientInfo.java

    public 【戻りの型】 メソッド名(値１, 値２) {
        return this.webClient.get()
                .uri(uriBuilder -> uriBuilder
                        .path("/【URL】")
                        .queryParam("【パラメータ１】", 値１)
                        .queryParam("【パラメータ２】", 値２)
                        .build())
                .retrieve()
                .bodyToMono(【戻りの型】 .class).block();
    }
```

```java:例）
    public ShukanTalentJoho getShukanTalentJoho(Integer nentsuki, Integer shu, String talentName) {
        return this.webClient.get()
                .uri(uriBuilder -> uriBuilder
                        .path("/shukanTalentJoho")
                        .queryParam("nentsuki", nentsuki)
                        .queryParam("shu", shu)
                        .queryParam("talentName", talentName)
                        .build())
                .retrieve()
                .bodyToMono(ShukanTalentJoho.class).block();
    }
```

 ## （GET通信の場合）　※パスパラメータ方式の場合
```java:WebClientInfo.java
    public 【戻りの型】 メソッド名(値１) {
        return this.webClient.get()
                .uri(uriBuilder -> uriBuilder
                        .path("/【URL】/{【パラメータ１】}")
                        .build(値１))
                .retrieve()
                .bodyToMono(【戻りの型】.class).block();
    }
```
```java:例）
    public KbnMasterInfo getKbnMaster(String genreIds) {
        return this.webClient.get()
                .uri(uriBuilder -> uriBuilder
                        .path("/kbnMaster/{genreIds}")
                        .build(genreIds))
                .retrieve()
                .bodyToMono(KbnMasterInfo.class).block();
    }
```

 ## （POST通信の場合）　
```java:WebClientInfo.java
    public 【戻りの型】 メソッド名(値１) {
        return this.webClient.post()
	    		.uri("/【URL】")
	    	    .body(Mono.just(値１), 【値１の型】.class)
	    	    .accept(MediaType.APPLICATION_JSON)
	    	    .retrieve()
	    	    .bodyToMono(【戻りの型】.class).block();
    }
```
```java:例）
    public TalentTorokuKoshinBFF postTalentTorokuKoshin(MTalent mTalent) {
        return this.webClient.post()
	    		.uri("/talentTorokuKoshin")
	    	    .body(Mono.just(mTalent), MTalent.class)
	    	    .accept(MediaType.APPLICATION_JSON)
	    	    .retrieve()
	    	    .bodyToMono(TalentTorokuKoshinBFF.class).block();
    }
```

上記が各通信方式となります。
C# Unity 向け XXHash32 (XXH32) 最小実装

リファレンス実装を分かりやすくしたもの、として本家から紹介されていたこちらをそのまま C# / Unity で動くようにしたものです。

https://github.com/easyaspi314/xxhash-clean

UTF8 のバイト列を C# 文字列（UTF16）に変換して辞書のキーにするよりは、XXH32 ハッシュ値をキーにしたほうがいいんじゃないかなー。とかそういう用途です。

xxHash 早見表
- `XXH32` : generates 32-bit hashes, using 32-bit arithmetic
- `XXH64` : generates 64-bit hashes, using 64-bit arithmetic
- `XXH3` (since v0.8.0): generates 64 or 128-bit hashes, using vectorized arithmetic. The 128-bit variant is called XXH128.


# つかいかた

`internal` な静的クラスが１ファイルに入っているので、何かしらのアセンブリにコピーして、

```csharp
var hash = MinXXHash32.XXH32(byteArray, byteArray.Length, seed);
```

です。

# Gist

https://gist.github.com/sator-imaging/55ee101389d2dd5a3276d7c80a13edaa
GitHub CLIを使ってプルリクエストのリストを取得する方法

## **はじめに**

GitHubの日々の作業を効率化するために、GitHub CLI（Command Line Interface）は非常に強力なツールです。特に、プルリクエスト（PR）の管理は開発プロセスの重要な部分であり、CLIを使用すると、ブラウザを開かずに多くの操作が可能になります。この記事では、GitHub CLIを使用してPRのリストを取得し、それに担当者（assignee）を含める方法を紹介します。

## **手順**

まず、GitHub CLIがシステムにインストールされていることを確認します。インストールされていない場合は、GitHub CLIの[公式ページ](https://cli.github.com/)からダウンロードしてインストールできます。

インストールが完了したら、以下のコマンドを使用して、特定のリポジトリのプルリクエストのリストを取得できます。

```bash
gh pr list --repo <owner>/<repo> --json title,url,assignees
```

このコマンドは、指定されたリポジトリのプルリクエストに関するJSON形式の情報を出力します。**`<owner>/<repo>`** は、対象のGitHubリポジトリの所有者とリポジトリ名に置き換えてください。

例えば、FacebookのReactリポジトリのプルリクエストを取得するには、以下のように実行します：

```bash
gh pr list --repo facebook/react --json title,url,assignees
```

これにより、以下のようなJSON形式の出力が得られます（出力例）：

```json
{
  "title": "Fix issue #123",
  "url": "https://github.com/facebook/react/pull/123",
  "assignees": [
    {"login": "contributor1"},
    {"login": "contributor2"}
  ]
},
{
  "title": "Add new feature",
  "url": "https://github.com/facebook/react/pull/124",
  "assignees": []
}
```

この出力では、各プルリクエストのタイトル、URL、および割り当てられた担当者（存在する場合）が表示されます。

## **まとめ**

GitHub CLIは、GitHubの操作をコマンドラインから簡単に行うための強力なツールです。この記事では、**`gh pr list`** コマンドを使用してプルリクエストのリストを取得し、JSON形式での出力例を含める方法を紹介しました。この方法を使えば、開発プロセスをよりスムーズにし、効率的な作業が可能になります。GitHub CLIには他にも多くの機能がありますので、ぜひ積極的に活用してみてください。
【Ruby】ブロックについてサクッと解説！

## 内容
Rubyのブロックは、コードの一部をカプセル化し、再利用可能にする強力な機能です。この記事では、ブロックの基本的な使い方から、スコープの生成、クロージャの使用に至るまでを掘り下げていきます。

### ブロックとは何か？

#### 基本的なブロックの使用

```ruby
def func x
  x + yield
end
p func(1){ 2 } # 出力: 3
```
この例では、`{}` で囲まれた部分がブロックであり、`yield` を使用してその中身を実行しています。

### ブロックによるスコープの生成

```ruby
def func y
  y + yield
end
func(1) do
  x = 2
end
# 「p x」を実行するとNameErrorが発生
```
ブロック内で定義された変数は、そのブロックの外部からはアクセスできないことを示しています。`{}` と `do...end` はどちらもブロックを生成しますが、一般的に一行で書ける場合は `{}` を、複数行にわたる場合は `do...end` を使用します。

### ブロックと変数のスコープ

#### ブロック外の変数をブロック内で参照

```ruby
def func y
  y + yield
end
x = 2
p func(1){ x+=2 } # 出力: 5
p x # 出力: 4
```

この部分では、ブロック内でブロック外の変数 `x` を参照し、変更する方法を示しています。これはRubyにおける「クロージャ」の一例で、メソッド内部から外部を参照する方法の一つです。

### ブロックと引数の操作

```ruby
def func a, b
  a + yield(b,3)
end
p func(1,2) {|x, y| x + y} # 出力: 6
```
`yield` の引数を使って、ブロックの引数である `x` と `y` の挙動を制御しています。この場合、`1 + (2 + 3)` の計算が行われます。

### ブロックの存在を判定する

```ruby
def func
  return 1 if block_given?
  2
end
p func(){} # 出力: 1
p func # 出力: 2
```
`block_given?` メソッドを使用することで、ブロックが与えられているかどうかを判定できます。
正則化最小二乗法

## 正則化最小二乗法
一般的に学習データに対する誤差関数を最小化するように学習しますが、


これだけでは細かくフィッティングした複雑なモデルが生成され、過学習が起こります。


過学習を防ぐために誤差関数に正則化項を加える。


正則化された最小二乗法（Regularized Least Squares）における誤差関数を定義しています。この誤差関数は、データ依存の誤差項と正則化項の和として表されます。
```math
E_D(w) + \lambda E_W(w)
```
$E_D$を二乗和誤差関数を下の式を用いる。
```math
E_D(w) = \frac{1}{2} \sum_{n=1}^{N} \{ t_n - w^T\phi(x_n)\}^2 
```
誤差関数の全体を


```math
\frac{1}{2} \sum_{n=1}^{N} \{ t_n - w^T\phi(x_n)\}^2 + \frac{\lambda}{2}w^Tw
```
wに関する勾配を求めてから０とおきwについて解けば
```math
0 = -\sum_{n=1}^{N} \{ t_n - w^T\phi(x_n)\}\phi(x_n)^T + \lambda w
```
```math
0 = \sum_{n=1}^{N}t_n\phi(x_n)^T  - w^T\sum_{n=1}^{N}\phi(x_n)\phi(x_n)^T - \lambda w
```
```math
0 = t \Phi^\top - w^T\Phi^\top \Phi - \lambda w
```
```math
w^T\Phi^\top \Phi + \lambda w =  t \Phi^\top
```
```math
w = (\Phi^\top \Phi + \lambda I)^{-1} \Phi^\top t
```
このように解けます。
Flutterfireの環境設定

Flutterでのアプリ開発時にFirebaseを利用する際、環境設定でつまづいた。

# flutterfireコマンドプログラムのアクティベート
以下のコマンドで、flutterfireをアクティベートする。
```
dart pub global activate flutterfire_cli
```
本来であれば上記で問題がないが、環境設定がされておらず下記エラーが発生した。
```
Warning: Pub installs executables into $HOME/.pub-cache/bin, which is not on your path.
You can fix that by adding this to your shell's config file (.bashrc, .bash_profile, etc.):
  export PATH="$PATH":"$HOME/.pub-cache/bin"
Activated flutterfire_cli 0.2.1+1.
```

# 解決方法
エラー内容に記載の通り、環境にPathを通す。
※投稿者はMac OSを利用しており、「.bashrc」などではなく、「.zshrc」に記載した。
下記コマンドで、「zshrc」ファイルを開く。
```
vi ~/.zshrc
```
「zshrc」ファイルの中に、エラー内容で指定されていた下記コマンドを追記する。
```
export PATH="$PATH":"$HOME/.pub-cache/bin"
```

上記を実行した後、一度ターミナル/コマンドプロンプトを再起動する。
※再起動しないと、環境Pathが反映されない！

再度以下コマンドを実行し、エラーが発生しないことを確認する。
```
dart pub global activate flutterfire_cli
```
【ChatGPT GPTs】でWikipediaのFAQを作ってみた結果です。


　どうも、カーブミラーです。

　今回は、GPTsでWikipediaのFAQを作ったので、そのやり取りを書きます。作り方は、前回の記事を参照してください。

:::note info
本記事は、ChatGPT（無料版）では使用できません。あしからず。
:::

　まずは、ニュース。

　OpenAIのCEOである
　　サム・アルトマン氏が
　　　退任しました。

　暫定CEOは、
　　CTOである
　　　ミラ・ムラティ氏が
　　　　就任しています。

　X-Twitterでは、
　　騒然となっています。

　それから、
　　一部では、
　　　OpenAIからメールが届き、
　　　　API関連の料金の変更が
　　　　　あったようです。

　メールの中身ですが
　　Googleレンズで翻訳。
***
OpenAI API アカウントの請求システムを更新しました。月末に請求書を受け取る代わりに、API を使用するためにクレジットを事前購入する必要があります。 billing.page にアクセスして、アカウントにクレジットを追加できます。プリペイド請求の詳細については、ヘルプセンターの記事「プリペイド請求」を参照してください。

現時点では何もする必要はありません。

この変更は OpenAI API アカウントと Playground にのみ適用されることに注意してください。 ChatGPT Plus サブスクリプションには影響しません。
***
　　とのこと。

　どういう事情かは
　　ほかのメディアで、
　　　ご確認ください。

　情報がたくさんあって、
　　どこまで事実なのか、
　　　わからない状態なので。
　　　　あしからず。

***
　本題。

　みなさんは、
　　My GPTsを
　　　どこまで利用していますか？

　私は、前回の記事でも
　　触れましたが、
　　　OpenAIやMicrosoft、
　　　　それにWikipediaの
　　　　　FAQチャットボットを
　　　　　　作りました。

　情報源がサイトからなので、
　　Google検索するよりも
　　　欲しい情報に
　　　　手が届くように
　　　　　なりました。

　また、ChatGPTさんが
　　情報をうまくまとめてくれる
　　　ことにもよろこんでいます。

　今回は、
　　Wikipedia FAQ Chatbotとの
　　　やり取りを取り上げます。
***
　ここでは、
　　私が好きな漫画家
　　　星野之宣さんのことを
　　　　取り上げます。

　作品の方から、
　　攻めていきます。

　この作家さんの名前を
　　結構、ど忘れするのでw
***
***User***
宗像教授シリーズの作家は？

***Wikipedia FAQ アシスト***
宗像教授シリーズは、星野之宣によって作られた日本の漫画シリーズです。また、この漫画を原作としてテレビドラマや小説も制作されています。

***User***
星野之宣のマンガスタイルを使って、宇宙空間に浮かぶ18歳の女性を描いてください。

***Wikipedia FAQ アシスト***
星野之宣のスタイルで描かれた作品は、著作権の保護を受けています。しかし、彼のスタイルの特徴を捉えて、宇宙空間に浮かぶ18歳の女性のイメージを作成することは可能です。星野之宣の作品は、独特のディテールと想像力豊かな世界観で知られています。これを踏まえて、以下のようなプロンプトを作成します：

「宇宙空間に浮かぶ18歳の女性を描いてください。彼女は長い黒髪を持ち、未来的な服を着ています。背景には遠くの星々と銀河が見え、彼女の表情は夢見がちで神秘的です。このイメージは、詳細な線描と幻想的な色使いを特徴とし、想像力豊かな宇宙の景色を表現しています。」

この説明を基にして、イメージを作成しますね。

![DALL·E 2023-11-18 11.33.19 - A detailed depiction of an 18-year-old woman floating in space, with long black hair and wearing futuristic clothing. The background shows distant sta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/a5ae4c4d-59de-7c73-3fd9-647161d7808d.png)

こちらが宇宙空間に浮かぶ18歳の女性を描いたイメージです。未来的な服装と長い黒髪を持ち、遠くの星々と銀河が背景に描かれています。このイメージは幻想的な色使いと細かな線描で、夢見がちで神秘的な雰囲気を表現しています。

***User***
今度は、火星の地上に、宇宙服の姿で、歩く三人を描いてください。
横長で。

***Wikipedia FAQ アシスト***
![DALL·E 2023-11-18 11.54.25 - A panoramic scene depicting three astronauts walking on the surface of Mars. They are dressed in space suits, each suit featuring unique colors and de.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/f56938ce-4ace-6ed1-3346-821a6a66dd0c.png)

火星の地表を歩く三人の宇宙飛行士を描いた横長のイメージを生成しました。彼らはそれぞれユニークなデザインの宇宙服を着用しており、赤い岩や遠くの山々が描かれた火星の荒涼とした風景の中で探検している様子が描かれています。
***

　このように、
　　DALL-E3の使用も
　　　できます。

　まぁ、画風は
　　なんちゃって、
　　　ですけどねw

　利用の仕方によっては、
　　Code Interpreterも
　　　使えますから
　　　　面白いことも
　　　　　できる可能性があります。

　うまく使えるかなぁ？

　うん、今回は、ここまで。
「.bashrc」の保存場所

Flutterでのアプリ開発時に環境Pathを繋げる際、「.bashrc」の保存場所を忘れることがあったため、忘れないように投稿する。

# .bashrc
シェル起動時に1回実行されるファイルで、シェル関数やエイリアスを設定し、環境Pathを繋げるファイル。
以下、保存場所
```
~/.bashrc
```

# 利用例
以下のようなエラーが発生し、pathを追加する必要がある場合に、bashrcファイルを変更する。
```
Warning: Pub installs executables into $HOME/.pub-cache/bin, which is not on your path.
You can fix that by adding this to your shell's config file (.bashrc, .bash_profile, etc.):

  export PATH="$PATH":"$HOME/.pub-cache/bin"

Activated flutterfire_cli 0.2.7.

```

上記エラーが発生した場合、bashrcを下記コマンドで開き、指定された内容を追加する。
```
vi ~/.bashrc
```

# あとがき
上記は自身がbashの保存場所を理解していなかったため、改の意味を込めて作成した記事となる。
もし何かの参考になることがあれば幸いです。
APIを使ってStreet Viewから屋外の画像だけを取得したい

# はじめに
今回は、[Street View Static API](https://developers.google.com/maps/documentation/javascript?hl=ja)というAPIを使用してStreet Viewから位置情報に基づいた画像を取得してみます。

研究でGoogle Street Viewから画像を取得したい機会があったのですが、その時に屋外の画像だけ欲しいなと思っていました。

方法を調べていたんですが、公式ドキュメントの端っこにしか情報がなく結構時間かかってしまったので、メモとして残しておきます。

# 解決したいこと
何も指定しないと、緯度経度によっては、室内の画像も取得できてしまう。（室内の写真なんていらん！）

こんな感じ↓
<p align="center">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1212014/1ad37e3f-cbe1-4e51-7054-c97e92c0e784.png" alt="35.01412309_135.69319009_input.png" width=50%>
</p>

<p align="center">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1212014/f12a3a12-f35d-6ea7-84c9-2e556ab98ac8.png" alt="34.99861_135.759504_input.png" width=50%>
</p>

# 話さないこと
- 詳細なコードの説明
- プロジェクトの設定やAPIの有効化
- API KEYを取得方法

# 解決方法
屋外の画像のみ取得するためのパラメータを指定してあげるだけ！（お手軽や〜）

[ドキュメント](https://developers.google.com/maps/documentation/streetview/overview?hl=ja)によると、パラメータに`source=outdoor`というパラメータを使用することで、屋外の画像のみ取得できることがわかりました。

![スクリーンショット 2023-11-18 1.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1212014/da79c7c2-257a-7ba4-18ba-fc00b219b293.png)


ちなみに、緯度経度によっては、屋外の画像がないため、その場合は以下の画像が返ってきていました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1212014/0d04dff0-24f0-2e87-0f6f-afe68b04df21.png" width=50%>

# ソースコード全体
```python
def construct_url(latitude, longitude, api_key, zoom=14, fov=120, heading=90, pitch=0, source="default"):
    base_url = "https://maps.googleapis.com/maps/api/streetview?"
    params = f"location={latitude},{longitude}&fov={fov}&heading={heading}&pitch={pitch}&size=500x500&key={api_key}&source={source}"
    return base_url + params

def main():
    # ここでGoogle Static Image APIキーを設定
    API_KEY = "YOUR_API_KEY_HERE"

    # ここで緯度と経度を設定
    latitude = 35.6895  # 例: 東京の緯度
    longitude = 139.6917  # 例: 東京の経度
    source = "outdoor" # 屋外の画像を取得する場合は"outdoor"
    
    url = construct_url(latitude, longitude, API_KEY, source)
    print("Generated Image URL:", url)

if __name__ == "__main__":
    main()
```

# まとめ
`source=outdoor`というパラメータを使用することで、Street Viewから屋外のみの画像を取得できました。

Street Viewを使用して何かしたい人の参考になれば！
WindowsでANSIエスケープシーケンスを有効化する方法

# 問題点

```python:ansi.py
print("\033[32mHello!\033[m")
```

上記のようなプログラムを実行すると

![スクリーンショット 2023-11-18 105447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621500/53c42ea8-9b81-7e19-af81-8162cfa21194.png)

この画像のように文字化けしてしまう時の対処法です。

# 対処法1 コマンド実行

何らかのコマンドを実行すると直ります

```diff_python:ansi.py
+ import os
+
+ os.system("")
print("\033[32mHello!\033[m")
```

![スクリーンショット 2023-11-18 110201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621500/51a11e33-c883-5e1d-e030-8aa344c87d9a.png)

# 対処法2 Windows Terminalを使う

Windows Terminalを使えば、上のコードなしで色が付きますが、Windows Terminal等をインストールしていない環境では色はつきません。

自分用ならこれでいいかも

![スクリーンショット 2023-11-18 110407.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621500/81fdc72a-a212-9689-2d7c-edffb73da20f.png)

# 参考

<https://qiita.com/PruneMazui/items/8a023347772620025ad6>