OmniAICreator/Qiita-1.07M huggingface dataset:
【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.8 (3拍子、口笛、アコースティックギター)【動画 2分05秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ しろぶりゅーの歌 ver.8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/6cb9d883-120a-124e-1fd5-f23eecdb4fb8.png)



* # 動画URL
    * https://youtu.be/jNjba4J2PMs

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.8 (3拍子、口笛、アコースティックギター)【動画 2分05秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-07-27(土)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

スロージョギングの途中に、早朝の中目黒で偶然出会った「しろぶりゅー」-ShiroBrew-のテーマソング( イメージソングは和製英語です )を、1人のファンとして自主的につくりました。
つまり「しろぶりゅー」のファンメイドテーマソングです。

ぜひ聴いてみてください。
そして、ぜひみなさんも、あなたが大好きなお店やブランドや企業のために楽曲をつくってみてください！

作曲日:
2024-07-20(土)

Suno AI 契約の種類:
Pro Plan

楽曲の正式名称:
しろぶりゅーの歌 #8

Suno AI Library URL:
https://bit.ly/ShiroBrew-08

Custom Mode: On

Audio Inputs: Not Used

With Vocals:


---


Lyrics(without Meta tags):

真っ白な心

そよ風感じる

コーヒーの香りと
真っ白な心


---


Lyrics & Meta tags:

[Break]

[Intro]

[Whistling]

[Verse]
真っ白な心

[Verse 2]
そよ風感じる

[Chorus]
コーヒーの香りと
真っ白な心

[Whistling]

[Outro]


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Waltz][250 seconds][Male voice][Giggling]


🇯🇵日本語訳

[ワルツ][250秒][男性の声][クスクス笑い]


---


Suno AI 公式URL
https://accounts.suno.ai


SHIROノMONO 公式URL - Instagram
https://www.instagram.com/shiro_nomono


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“Suno AIで3拍子”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNy-xIeeMZV6D2YAnax9Nzw


　・“しろぶりゅー ファンメイドソング”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPk5-_YwWl499DNAOVKlcvZ


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/46k4Y1r
【Xcode】StoryBoardでTabBarとNavigationBarを正しく設定する方法

備忘録

# 1. UIControllerViewの設定
ControllerViewを設定する。

# 2. NavigationBart設定
1で設定したControllerViewを選択し、Embedded in ControllerからNavigation Controllerを設定する。

# 3. TabBatの設定
2で設定したNavigation Controllerを選択し、Embedded in ControllerからNavigation Controllerを設定する。

# 4. 注意点
他画面から遷移するときは、TabBarControllerのStoryboardIDを設定し、このStoryboardIDに遷移するようにする。
Javaで「正規表現パターンにおけるエスケープ処理」の動作を確認してみた

# 概要

Javaで「正規表現パターンにおけるエスケープ処理」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index6.html

# 実装

以下のファイルを作成しました。
```JSample6_1.java
import java.util.regex.*;

class JSample6_1{
  public static void main(String[] args){
    String regex = "a\\.b";
    Pattern p = Pattern.compile(regex);

    Matcher m1 = p.matcher("a.b");
    System.out.println(m1.matches());

    Matcher m2 = p.matcher("axb");
    System.out.println(m2.matches());
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample6_1.java 
$ java JSample6_1 
true
false
```

以下のファイルを作成しました。
```JSample6_2.jav
import java.util.regex.*;

class JSample6_2{
  public static void main(String[] args){
    String regex = Pattern.quote("A.B.C.D");
    Pattern p = Pattern.compile(regex);

    Matcher m1 = p.matcher("A.B.C.D");
    System.out.println(m1.matches());

    Matcher m2 = p.matcher("AABBCCDD");
    System.out.println(m2.matches());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample6_2.java 
$ java JSample6_2 
true
false
```

# まとめ

何かの役に立てばと。
【Python】クラスのイニシャライザとメソッドで同名の関数を定義するとどうなるか

# 概要
- 題意の疑問は、pythonインタプリタの挙動を知ることで理解できます
# 結論
- それぞれ別の空間（`クラスオブジェクト`と`インスタンスオブジェクト`）に定義、保持される
    - クラス定義内で記述したメソッドは`クラスオブジェクト`内のクラス変数として定義される
    - イニシャライザで定義したメソッドは`インスタンスオブジェクト`内のオブジェクト変数として定義される
- 呼び出し時は、`インスタンスオブジェクト`に定義されたメソッドが優先的に呼ばれ、インスタンスにて定義されていない場合に`クラスオブジェクト`側のメソッドが呼び出される
# 説明
- pythonでは、`クラスオブジェクト`と`インスタンスオブジェクト`は別個のメモリ空間で定義されます
- メソッド定義とイニシャライザは、それぞれ独立したタイミングで処理されます
- 具体的には、pythonインタプリタは以下のように処理します
    - `クラスオブジェクト`について
        1. クラス定義から`クラスオブジェクト`を生成
        2. メソッド定義から`関数オブジェクト`を生成
            3. メソッド定義から`関数オブジェクト`を`クラスオブジェクト`の変数に代入
    - `インスタンスオブジェクト`について
        1. `インスタンスオブジェクト`生成
            2. インタプリタが`__init__`メソッドを実行
            3.(`__init__`関数内でメソッドの代入が記述されていれば)`インスタンスオブジェクト`の変数に引数で渡された`関数オブジェクト`を代入 
    - メソッド呼び出し時
        1. インスタンス変数からメソッドを探索、実行
        2. 1で見つからなかった場合、クラス変数から探索、実行
# テスト環境
- Python 3.10.12
- Ubuntu 22.04.4 LTS (WSL2)
# テストコード
- クラス定義
```python
class TestClass():
  def __init__(self, arg_func=None):
    if arg_func is not None:
      self.method = arg_func

  def __call__(self):
    self.method()

  def method(self):
    print("original method called")

def arg_func():
    print("arg func called")

def new_method(self):
    print("new method called")
```

- 素のインスタンスと、イニシャライザに関数を渡したインスタンスのテスト
```python
instance = TestClass(); instance()
instance = TestClass(arg_func); instance()
```
```:実行結果
original method called
arg func called
```
- クラスオブジェクト側のメソッドを上書きした場合
```python
TestClass.method = new_method
instance = TestClass(); instance()
instance = TestClass(arg_func); instance()
```
```:実行結果
new method called
arg func called
```

# 謝辞
- コメントの @shiracamus 様、ありがとうございました
Ruby On Railsと Graph QLで爆速TODOアプリを開発する

## 1. はじめに

GraphQLとRailsを使用してTo-doアプリのAPIを構築する方法を紹介します。GraphQLは柔軟で効率的なAPIを作成するための強力なツールであり、Railsと組み合わせることで、迅速かつ堅牢なアプリケーション開発が可能になります。

## 2. プロジェクトのセットアップ

まず、新しいRailsプロジェクトを作成し、必要な依存関係をインストールします。

```bash
rails new todo_graphql_api --api -T -d postgresql
cd todo_graphql_api
```

Gemfileに以下の行を追加します：

```ruby
gem 'graphql'
gem 'graphiql-rails'
```

そして、依存関係をインストールします：

```bash
bundle install
```

GraphQLをセットアップします：

```bash
rails generate graphql:install
```

## 3. モデルの作成

To-doアイテムを表すモデルを作成します：

```bash
rails g model Todo title:string description:text completed:boolean
rails db:migrate
```

## 4. GraphQLタイプの定義

`app/graphql/types/todo_type.rb`に以下のコードを追加します：

```ruby
module Types
  class TodoType < Types::BaseObject
    field :id, ID, null: false
    field :title, String, null: false
    field :description, String, null: true
    field :completed, Boolean, null: false
    field :created_at, GraphQL::Types::ISO8601DateTime, null: false
    field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
  end
end
```

## 5. クエリの実装

`app/graphql/types/query_type.rb`を以下のように更新します：

```ruby
module Types
  class QueryType < Types::BaseObject
    field :todos, [Types::TodoType], null: false
    field :todo, Types::TodoType, null: false do
      argument :id, ID, required: true
    end

    def todos
      Todo.all
    end

    def todo(id:)
      Todo.find(id)
    end
  end
end
```

## 6. ミューテーションの実装

`app/graphql/mutations/create_todo.rb`を作成し、以下のコードを追加します：

```ruby
module Mutations
  class CreateTodo < BaseMutation
    argument :title, String, required: true
    argument :description, String, required: false

    field :todo, Types::TodoType, null: false
    field :errors, [String], null: false

    def resolve(title:, description: nil)
      todo = Todo.new(title: title, description: description, completed: false)
      if todo.save
        {
          todo: todo,
          errors: []
        }
      else
        {
          todo: nil,
          errors: todo.errors.full_messages
        }
      end
    end
  end
end
```

`app/graphql/types/mutation_type.rb`を更新します：

```ruby
module Types
  class MutationType < Types::BaseObject
    field :create_todo, mutation: Mutations::CreateTodo
  end
end
```

## 7. GraphiQLの設定とテスト

`config/routes.rb`に以下を追加します：

```ruby
Rails.application.routes.draw do
  post "/graphql", to: "graphql#execute"
  
  if Rails.env.development?
    mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "graphql#execute"
  end
end
```

サーバーを起動し、GraphiQLインターフェースにアクセスします：

```bash
rails s
```

ブラウザで`http://localhost:3000/graphiql`にアクセスし、以下のクエリとミューテーションをテストします：

```graphql
# すべてのTodoを取得
query {
  todos {
    id
    title
    description
    completed
  }
}

# 新しいTodoを作成
mutation {
  createTodo(input: {title: "GraphQLを学ぶ", description: "Rails with GraphQLチュートリアルを完了する"}) {
    todo {
      id
      title
      description
      completed
    }
    errors
  }
}
```

以上で、GraphQLとRailsを使用した基本的なTo-doアプリのAPIが完成しました。このアプリケーションをベースに、更新や削除の機能を追加したり、認証を実装したりすることで、より完全なアプリケーションに発展させることができます
Qiitaの新着記事をSlackに通知してみた

使用した環境：
・Googleスプレッドシート
・GAS
・Qiita API
・Slack Apps - Incoming Webhooks


構成はざっくりとこんな感じです
```
// この関数をトリガーで設定して動かしています
function 日次(){
    記事取得()
    通知送信()
}

function 記事取得(){
    // Qiita APIで記事を取得する
    // 必要なデータをシートに設定
}

function 通知送信(){
    // 土日祝の場合は通知なし
    // 未通知かつ公開されている記事を対象にして、通知送信
}
```

満を持して使うタイミングがやってきました。

https://qiita.com/kiNako_aNko/items/6dd67ba9fdc26e75f38a

# 記事取得
※今回はトークンを発行しているので、設定してAPIをたたく
```javascript
var ACCESS_TOKEN = "XXX";

// Crane＆I に紐づけされている記事
  const apiUrl = 'https://qiita.com/api/v2/items?per_page=20&query=org:crane-i';
  var response = UrlFetchApp.fetch(apiUrl, {
    headers: {
      'Authorization': 'Bearer ' + ACCESS_TOKEN
    }
  });
  var items = JSON.parse(response.getContentText());

  items = items.sort(function(a, b) {
  return (a.created_at < b.created_at) ? -1 : 1;
  });
```

APIで取得した記事の作成日時が、スプレッドシートに登録されている最後の記事より未来日の場合は
記事の情報をスプレッドシートに登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/2b65c004-207c-274e-e933-8133c87620fe.png)
※この段階では「通知フラグ」は"FALSE"で登録

# 通知送信
送信するデータの取得と、送信メッセージの設定
```javascript
var message = ""

// flg→「通知フラグ」　private→「限定公開フラグ」
if ( flg == false & private == false){

    var user = sheet.getRange(i, 1).getValue();
    var title = sheet.getRange(i, 2).getValue();
      
    message += "@"+ user + "「" + title + "」" + "\n";
    // 通知対象になったレコードはこの段階で"TRUE"に変更する
    sheet.getRange(i, notice_flg).setValue('True');
    send_flg = 1;

}else{
    break;
}
```

送信するデータがある場合は送信！
```javascript
UrlFetchApp.fetch(
  // Webhook URLを入れる
  "Slackのアプリで発行したURL",
    {
    //POSTリクエストでSlackへ送信
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : JSON.stringify({"text": message})
    }
  );
```

# さいごに
一応~~1度バグは起きたものの~~安定して動いてくれています
Slackの「Incoming Webhook」はセキュリティ上非推奨となっているので、そこだけ気を付けています。
React本気で学んだらどこまでいけるか実証してみる

# はじめに
今日からJISOUプログラミングスクールに参加してReactを学ぶことにしました。
React触ったことは一度もないですが、どこまで成長できるか試してみたいと思います。

# 今の自分
現在は、webアプリケーション開発に携わっています。
仕事に着いた当初は新しい知識や経験ばかりで、あっという間に時間が過ぎていきました。

当初は、仕事をするにつれてプログラミングの技術力は「フルスタックでなんでもできるエンジニア」になっていくのだろうと考えていました。

ただ、現実はそう甘いものでなく、年数を重ねていくうちに仕事をしているだけではそれなりの成長しか見込めないと気付いてしまいました。

なりたいエンジニア像を妄想しているだけだと気づかされました。

## なりたい自分
なにか一つ自信を持ってこれは得意ですと言えるようになりたいです。
自分の核となる技術を身に着けたいです。
そのためにReactを本気で学んでみようと思います。

# 目標
- 短期(3ヶ月)
    - Reactを使用して簡単なTODOアプリ等を作成できる
    - React わかる
- 中期(半年)
    - Reactを使用してCI/CDを組むことができる
    - React できる
- 長期(1年)
    - Reactを使用した独自のアプリケーションを作成し、AWSにアプリをデプロイする
    (どのようなアプリをつくるか考えるのが大変そうですが、できたら良いな、、）
    - React 完璧

# 最後に
頑張ります！
【jUnit】Mockってなに？

## はじめに
今回はjUnitで使用するMockについて、理解を深めていければと思いMockってなに？や使うとどんなメリットがあるの？などを深ぼっていければ思います！
間違い等ございましたらご指摘いただけますと幸いです。
## Mock（モック）とは
モックは、ソフトウェアテストのために実際のオブジェクトの代わりに使用されるダミーオブジェクトです。
つまり、偽物のオブジェクト（Mock）を使用して、テストをする際に本物のオブジェクトに頼らずにテストができます。

## Mockitoとは
JavaでMockオブジェクトを作成し、管理するためのフレームワーク（ライブラリ）です。
Mockitoのおかげで、Mockオブジェクトを簡単に作成し使用することができます。

## Mockを使用するケース
### 1.Serviceクラス
```Java: コード例
@SpringBootTest
public class UserServiceTest {

    @InjectMocks
    private UserService service;

    @Mock
    private UserRepository repository;

    @Test
    void testDeleteById() {
        Integer id = 1;
        doNothing().when(repository).deleteById(id);

        service.deleteById(id);

        verify(repository, times(1)).deleteById(id);
    }
    
}
```
@InjectMockは、Mockと同様Mockitoフレームワークで使われるアノテーションですが、用途と役割が異なります。テスト対象のクラスのインスタンスを作成し、そのクラスの依存関係を自動的にモックオブジェクトに注入するために使用されます。

### 2.Controllerクラス
```java: コード例
@SpringBootTest
public class UserControllerTest {

    @InjectMocks
    private UserController controller; 

    @Mock
    private UserService service;  

    @Test
    void testDeleteUser() {
        Integer id = 1;
        doNothing().when(service).deleteById(id);  

        controller.deleteUser(id); 

        verify(service).deleteById(id);  
    }
}
```
### （3.Repositoryクラス】
リポジトリクラスのテストでは、モックを使用することは比較的少ないです。

## Mockを使用するメリット
**・簡単にテストできる**
モックを使うことで、テスト対象のコードが他のシステムやサービスに依存せずにテストできます。
例えば、データベースが設定されていなくても、モックを使うことで、データベースがあるかのように振る舞うことができます。これにより、テストを早く始めることができ、他のシステムの準備が整っていなくてもテストを進めることができます。

**・スピードが速い**
モックは実際のシステムを使わずに振る舞いを模擬するため、テストが非常に速く実行できます。

**・安定したテスト**
モックを使うと、テスト対象のコードが実際の外部システム（例えば、データベースやAPI）に依存せずにテストできます。これは、テストが外部システムの状態や動作に左右されません。

## まとめ
上記の内容からもわかるように、モックを適切に活用することで、安定したテストが実現できます。
jUnitを実装する際には、モックを上手に活用して、テストの信頼性と効率を高めていければと思います！
Playwrightでテストが不安定なときに効果がある設定

Playwrightでテストが不安定なときに効果がある設定の紹介です。

テストが不安定というのは、テスト結果がOKになったり、NGになったりして安定しないという意味です。

テストコードの書き方が悪くてテストが不安定になっているのであれば、テストコードを修正すべきです。
しかし、テスト対象のサーバーが不安定であったり、ネットワークが不安定であったり、どんなにコードをトレースしても原因が不明であったりで、不安定になる可能性はあります。

そんなときのplaywright.config.tsの設定です。

| 設定 | 説明 | 効果 |
|:-:|:-:|:-:|
| retries  | テスト失敗時のテスト再試行回数  | 再試行によりテスト成功する可能性がある |
| workers  | テスト実行するプロセスの数  | 減らすことによりサーバー負荷が軽減する可能性がある |
| reporter  | テスト結果のレポート出力  | htmlにしておくとtraceの設定と組み合わせてトレース情報が出力される |
| use.trace  | トレース情報出力有無・出力タイミング  | retain-on-failureにしておくとテスト失敗時にトレース情報出力 |
| timeout  | 一つのテスト実行のタイムアウト時間  | 長くしておくと、サーバーやネットワーク負荷が高いときでもテストを実行しきれる可能性がある |
| expect.timeout  | アサーションのタイムアウト時間  | 長くしておくと、サーバーやネットワーク負荷が高いときでもテストを実行しきれる可能性がある |

設定例は以下です。

```typescript:playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: 2,
  workers: 3,
  reporter: 'html',
  timeout: 30,
  expect: {
    timeout: 10
  },
  use: {
    trace: 'retain-on-failure',
  },
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    }
  ]
});
```

テストに失敗すると、レポートにトレース情報が出力されます。
画面がどういう状態になっていたかなど確認できるため、原因をトレースしやすくなります。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224267/7aafcc4f-26db-628e-8fab-1a9bf03cc63b.gif)
HTMLファイルでもTypeScriptを実行する方法

実行時にコンパイルするようにします。
ただしちょっとコンパイルに時間かかるので、実用的ではないです。開発用では使えるかも。

```HTML

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TypeScript CDN Example</title>
    <!-- TypeScript CDN -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/typescript/4.5.5/typescript.min.js"></script>
</head>
<body>
    <h1>TypeScript CDN Example</h1>
    <!-- TypeScriptコードを記述 -->
    <script id="ts-code" type="text/typescript">
        // TypeScriptコードをここに書く
        const message: string = "Hello, TypeScript with CDN!";
        document.body.innerHTML += `<p>${message}</p>`;
    </script>
    <!-- TypeScriptをJavaScriptに変換して実行 -->
    <script>
        window.onload = () => {
            const tsCode = document.getElementById('ts-code').textContent;
            const jsCode = ts.transpile(tsCode);
            eval(jsCode);
        };
    </script>
</body>
</html>


```
Pythonでビット演算

# はじめに
前回に引き続きビット演算をやっていきます。
動作確認はGoogleColabpratoryで行っています。

# 論理和
```python
0&0
```

# 論理積
```python
0|0
```

# 排他的論理和
```python
0^0
```

# まとめ
よくある論理和、論理積、排他的論理和の表を出すコードです。
```python
import numpy as np
import pandas as pd

column_list = ["x", "y", "論理和","論理積", "排他的論理和"]
row_list = ["0", "1", "2", "3"]
data = np.array([[0, 0, 0&0, 0|0, 0^0],
                  [0, 1, 0&1, 0|1, 0^1],
                  [1, 0, 1&0, 1|0, 1^0],
                 [1, 1, 1&1, 1|1, 1^1]])

df = pd.DataFrame(data, row_list, column_list)
print(df)
```
これからアウトプットマンになるという覚悟

# これはなんですか
これからプログラミングスクールJISOUで、学習をしていくことになりました
その一歩めの記事です

# 今の私
いま現在、web系IT企業で、主にフロンエンドの部分を業務に頑張っています

元々製造業で営業、生産完了の仕事をしていましが30を目前にして、自身の成長がストップしていることを感じ
なんとかせねばの気持ちで、エンジニアスクールのテックキャンプを受講
カリキュラムを終え、なんとか今の会社に採用していただきました

まだ、開発を始めて2年も経ってないような初心者エンジニアですが
業務や、家庭のあれこれに追われ、自己学習が疎かになってました
成長の歩みを止めないために、今回JISOUの皆さんと頑張ることにしました

# これからの私
## 短期目標
- アウトプットの習慣化
- 学習の習慣化
## 中期目標
- Reactなんとか使えるマン
## 長期目標
- React使いこなせるマン
- 習慣化したアウトプット、学習で他のことにも次々チャレンジ
- 自分のエンジニア価値を高める

## 決意表明
短いながらITエンジニアとし働いた中で強く感じたことは
常に成長を続けて行かなけれは、エンジニアとしての価値を向上はもちろん維持すらできないということでした
そしてその成長は、業務時間だけでは全く不足しているということです

特に私は30代になってエンジニアになったので、他の方よりスタートがおくれています
家庭もあり、エンジニアに私生活を全振りするわけにもいきません
私より若く、より優秀なエンジニアはいくらでもいますし、これかもっと増えるでしょう
しかしその中で、エンジニアを仕事としてこれからも続けていくためには
そんな優秀な方に見劣らないよう成長し続けなければならないと、強い覚悟を持っています

そのために今回JISOUでの学びをもとに
カリキュラムにおける学びだけでなく、成長し続ける、価値を高め続けるというところも
しっかりと刻み込んでいきたいと思いまs
LibertyでEJBを動かす

# 目的

LibertyでEJBのプログラムをテストします。

# Gitレポジトリ
用意したGitレポジトリをクローンします。前に使用したJNDIのイメージを更新してEJBを動作するようにしました。

https://qiita.com/keniooi/items/5523c2e4d8399dae4bd7

```
git clone https://github.com/pdprof/ejb-jndi.git
cd ejb-jndi/ejb-jndi-docker/
```

# Libertyのイメージをビルドして開始

JNDIのlookupコードとサーバー構成を含むイメージをビルドします。

```
./setup-docker.sh
./start.sh
```


# EJBアプリケーション

EJBのアプリケーションは Helloを返すだけですが

ejb-ear - アプリケーションを含む元になるもの
ejb-lib - EJBライブラリ
ejb-hello - Webアプリケーション
ejb-client - アプリケーションクライアント

になっていて、ejb-hello, ejb-client から ejb-lib を参照して ejbのクライアントとして動作するようになっています。それらを ejb-ear にモジュールとして同梱してアプリケーションとして動作させます。

アプリケーションのソースコードは

https://github.com/pdprof/ejb-jndi/tree/main/ejb-jndi

にあるのでテストしたい動作がある場合はこのコードを変更します。


# サーブレットを動かす

EJBで Hello　!! と出力するだけですが動作をためします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/7f18a7bb-0a3f-ff8e-9a04-58d9c64fc992.png)


# トラブルシューティング

毎度のことですが、よくつかう dockerコマンドを書いておきます。この文書でもpodman, dockerとまとまりがないですが、Linux では dockerがpodmanを呼び出すようになっていました。

```
docker ps # 動作中のContainer確認
docker logs -f ejb-jndi # ログ確認
docker restart ejb-jndi # 再起動
docker inspect ejb-jndi # container 確認
docker exec -it ejb-jndi bash # Container内状況確認
```

など試してみましょう。ejb-jndiの部分を docker ps で確認した container の別IDにすることで他のコンテナも確認できます。

# まとめ

LibertyのEJBアプリケーションを起動して動作をテストしました。
Go | Strategy + Null Object

## 雑めも
- ストラテジーパターン
  - アルゴリズム（ストラテジー）を注入して使う。Excelストラテジー、PDFストラテジー、Nilストラテジーのどれか。
  - それぞれのストラテジーごとに、構造体が違うため保持できるデータも異なる(`Excel.excel` と `Pdf.pdf` の箇所)

- Null Object
  - Nilストラテジーは Null Objectパターンで、`nil` ではなくて処理をしない構造体を渡しておくと実行時に nil チェックが必要なくなる

- インジェクション
  - ストラテジーを注入するタイミングがコンストラクタによる生成時かメソッドを実行時によってやり方が異なる

## ストラテジーパターン（コンストラクタインジェクション）

- [Playground](https://goplay.tools/snippet/pKsizrTUHne)

```golang
package main

import "fmt"

func main() {
	var ct Content

	// Excel
	ct = Content{Name: "file1.xlsx", Data: Excel{}}
	ct.Load()
	ct.Print()

	// Pdf
	ct = Content{Name: "file2.pdf", Data: Pdf{}}
	ct.Load()
	ct.Print()

	// Null
	ct = Content{Name: "unknown", Data: Nil{}}
	ct.Load()
	ct.Print()
}

// Content
//
// ファイルに対するラッパー.
type Content struct {
	Name string
	Data ExcelOrPdf
}

func (c Content) Load()  { c.Data.Load() }
func (c Content) Print() { fmt.Println(c.Name, c.Data.Text()) }

// ストトラテジーのInterface
type ExcelOrPdf interface {
	Load()
	Text() string
}

// Excel
//
// Excel ストラテジー
type Excel struct {
	excel int64 // excel のライブラリのデータを入れる
}

func (e Excel) Load() { fmt.Println("Excel load") }

func (e Excel) Text() string { return "Excel print done" + string(e.excel) }

// PDF
//
// PDF ストラテジー
type Pdf struct {
	pdf string // pdf のライブラリのデータを入れる
}

func (p Pdf) Load() { fmt.Println("PDF load") }

func (p Pdf) Text() string { return "PDF print done" + p.pdf }

// Nil
//
// NullObject ストラテジー
type Nil struct{}

func (n Nil) Load() { fmt.Println("<Nil load>") } // noop

func (p Nil) Text() string { return "<Nil print done>" } // noop
```

## ストラテジーパターン（メソッドインジェクション）

- [Playground](https://goplay.tools/snippet/Pwq61mPMi6j)

```go
package main

import "fmt"

func main() {
	var ct Content

	// Excel
	ct = Content{Name: "file1.xlsx"}
	excel := Excel{}
	ct.Load(excel)
	ct.Print(excel)

	// Pdf
	ct = Content{Name: "file2.pdf"}
	pdf := Pdf{}
	ct.Load(pdf)
	ct.Print(pdf)

	// Null
	ct = Content{Name: "unknown"}
	it := Nil{}
	ct.Load(it)
	ct.Print(it)
}

type Content struct {
	Name string
}

// Load
type Loader interface{ Load() }

func (c Content) Load(loader Loader) { loader.Load() }

// Print
type Texter interface{ Text() string }

func (c Content) Print(texter Texter) { fmt.Println(c.Name, texter.Text()) }

// Excel
//
// Excel ストラテジー
type Excel struct {
	excel int64 // excel のライブラリのデータを入れる
}

func (e Excel) Load() { fmt.Println("Excel load") }

func (e Excel) Text() string { return "Excel print done" + string(e.excel) }

// PDF
//
// PDF ストラテジー
type Pdf struct {
	pdf string // pdf のライブラリのデータを入れる
}

func (p Pdf) Load() { fmt.Println("PDF load") }

func (p Pdf) Text() string { return "PDF print done" + p.pdf }

// Nil
//
// NullObject ストラテジー
type Nil struct{}

func (n Nil) Load() { fmt.Println("<Nil load>") } // noop

func (p Nil) Text() string { return "<Nil print done>" } // noop
```

## 所感

- Goだとおそらくメソッドインジェクションが多い印象
  - Load / Print において、それぞれのInterfaceを切り出すこともできる
  - またレイヤーが浅くなるのでシンプルになる
  - ただ、今回の場合はexcel/pdfなどの情報を使い回すので Content の中に入れておけるコンストラクタインジェクションの方が良さそう
error: We can't find the necessary environment variables to replace the Node version.

# 事象

Windows環境にて、fnmを使用してnode.jsのアップグレードを実行しようとしたところ、タイトルどおりのエラーが発生した。

https://nodejs.org/en/download/package-manager

# 原因

環境変数が設定されていない模様。

```
error: We can't find the necessary environment variables to replace the Node version.
You should setup your shell profile to evaluate `fnm env`, see https://github.com/Schniz/fnm#shell-setup on how to do this
Check out our documentation for more information: https://fnm.vercel.app
```

# 対処

環境変数を追加するコマンドを実行した。

```
fnm env --use-on-cd | Out-String | Invoke-Expression
```

https://stackoverflow.com/questions/78606679/unable-to-install-and-use-nodejs-using-fnm
Z80 たっぷり休むプログラム[Joke]

たっぷり休むプログラムです。何にもしないのも良いものです。

```nop.asm
    org 0000h
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop    
    nop
    nop
    nop
    nop
    nop
    nop
    nop
```

オブジェクトコード
```
0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
```
おやすみなさい。良い夜を。
AzureのFreeTrial利用前に読む記事

#### 初めに
Azure勉強したいけど、お金かかるの怖い(||ﾟДﾟ)
でも、Azureの公式のガイダンス動画は英語だけ・・・誰か要点だけ教えて！
私もそんな風に思った一人です。
この記事では、現時点でのAzure新規登録時のフリープランを正しく理解することを目的としています。

:::note warn
こちらの記事は2024/7/30に作成したものになります。
ご利用は自己責任でお願いします。
:::

## フリープランの大枠
フリープランの特徴としてざっと以下の３点です。
1. [「30日間のフリートライアル」または「200ドル分のクレジット」](#「30日間のフリートライアル」または「200ドル分のクレジット」)
1. [12か月間の一部サービス利用料無料](#12か月間の一部サービス利用料無料)
1. [55以上のサービスはいつでも無料](#55以上のサービスはいつでも無料)

一つ一つ見ていきましょう

## 「30日間のフリートライアル」または「200ドル分のクレジット」
フリートライアル一番の目玉はこのクレジットですが、利用には少し注意が必要です
以下条件のうちどちらか早いほうが期限になります。
+ 30日間のフリートライアル
+ 200ドル分のクレジット

30日で期限が切れる200ドル分のクレジットをもらえるとイメージすればよいです。

現在の残クレジットと有効期限については、以下から確認できます。（※ほかにも方法あります）
コストの管理と請求＞課金＞支払方法＞Azureクレジット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/3bb7824b-eaba-f6f2-dbc8-4592358ece3c.png)

## 12か月間の一部サービス利用料無料
最初の一か月が過ぎても、続いて12か月間無料で使えるサービスがあります。
対象のサービスと条件は以下の公式ページで確認できるのでサービス利用前にしっかりとみておきましょう。
+ [Azureサービスのフリープラン一覧のページ](https://azure.microsoft.com/ja-jp/free#all-free-services)

よく使うサービスとして、一緒にVirtualMachineを見ていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/76227b7f-6be9-4934-4aab-546f4dddda67.png)

特定のプランで一か月あたり750hまで無料という感じですね。
つまり、以下が注意点という理解で良いでしょう。
+ VirtualMachineを2台以上構築する場合は起動時間に留意する
+ 構築時にプランを間違えないようにすること

## 55以上のサービスはいつでも無料
常時無料で使えるの！？・・・答えはYESです。ただし、もちろん制約があります。
対象のサービスと制約については以下のMSのページで確認できるのでサービス利用前にしっかりとみておきましょう。
+ [Azureサービスのフリープラン一覧のページ](https://azure.microsoft.com/ja-jp/free#all-free-services)

私の記事でもよく取り上げるAzure Automationを例にフリープランを見てみましょう。
フリープランの一覧ではこんな感じで記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/f82faeea-439a-f540-f464-c8343dbfeaae.png)

「500分のジョブ実行時間までは無料」とのことですが、これでは少し言葉足らずですよね。
ここは正しくは「 <font color="Red">1か月あたり</font>500分のジョブ実行時間までは無料」という意味です。

以下にAzure Automationの料金プランをきっりちと記載されています。
+ [Azure Automationの料金ページ](https://azure.microsoft.com/ja-jp/pricing/details/automation/)

少しでも一覧を見て疑問に思ったら、公式の料金表をチェックするようにしましょう。
+ [Azure料金の公式ページ](https://azure.microsoft.com/ja-jp/pricing/)

そして、できることなら無料サービスページからサービスを作成しましょう。
+ [Azure無料サービスページ](https://portal.azure.com/#view/Microsoft_Azure_Billing/FreeServicesBlade)

### 終わりに
ガイダンス動画を見た限り、フリープランの解除方法の記載がありました。こちらはまた別の機会に。あとは、初期に設定しておくべきなBadgetの設定なんかもまた触れていきます。
今更ですが、私がこの記事の中でずーっと触れている 「ガイダンス動画」 というのは以下です。
+ [ガイダンス動画](https://youtu.be/EqNJ9IQgODI)

以下、Azureフリートライアルを利用する上で便利な公式サイト達です。
+ [Azure 無料アカウントに関する FAQ](https://azure.microsoft.com/ja-jp/free/free-account-faq/)
+ [Docs｜Azure の無料アカウントに含まれるサービスを作成する](https://learn.microsoft.com/ja-jp/azure/cost-management-billing/manage/create-free-services)
+ [料金計算ツール](https://azure.microsoft.com/ja-jp/pricing/calculator/)
【React】仮想キーボードのEnterキーの文字列を設定する方法


`enterKeyHint`を使用すると仮想キーボードの Enter キーのラベルを変更できます。

```tsx

export function Sample() {
  return (
    <input
      type="text"
      enterKeyHint="search"
    />
  )
}

```

上記のようにした場合には以下のように表示されます。

![IMG_5098.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/36c51cd6-d084-5adc-6ff7-aef0b3c0deaf.jpeg)

- `enter`の場合
![IMG_5097.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f4190fab-75c3-34e1-a013-003af74ecb56.jpeg)

- `done`の場合
![done](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f7b27a87-08a0-619b-d25e-04567d3ef026.jpeg)

- `go`の場合
![go.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/778bedc7-05d1-0f3d-02ec-a38789d7abaf.jpeg)

- `send`の場合
![アカウント  TASCON 3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b3e3bff7-2386-23a2-072c-e399511833af.jpeg)

https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/enterKeyHint
AffinityPhotoでPSDを毎度エクスポートせずにCtrl+Sで直接PSDに保存できる設定

# はじめに
以前はPhotoShopの`.psd`ファイルをUnityでテクスチャとして使っていたのですが、やはりPhotosShopのライセンスを毎年払うのが大変です。
そこで私は最近、買い切りライセンスであるAffinityPhotoを購入し使っています。

https://affinity.serif.com/ja-jp/photo/

普段のテクスチャの作成/編集に問題はなかったのですが、一つ不便なことがありました。
それは、**AffinityPhotoのプロジェクトファイルがUnityに直接インポートできない**ことです。
AffinityPhotoのファイル形式、`.afphoto`は、Unityに対応しておらず、Unityへインポートするときは`.png`や`.psd`に毎度エクスポートすることとなります。
# 解決方法
実は、AffinityPhotoの設定を変えることで、`.psd`ファイルを開いたとき、プロジェクトを`.afphoto`ではなく`.psd`に保存することができました。
1. ツールバーの『編集』から『設定』を開きます。
![スクリーンショット 2024-07-30 234712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/75aa38c3-c192-1295-1d83-3b6a238d250c.png)
2. 『一般』の『インポートしたPSDファイルで"保存"を有効にする』にチェックを入れます。
![スクリーンショット 2024-07-30 234842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/4b2219d0-1571-2f08-61b3-2ed3eb689364.png)
:::note warn
項目のところに書いてる通り、完全な互換があるわけではありません。
AffinityPhotoにしかない機能を用いた状態で保存すると、1枚のレイヤーとなってしまう(ラスタライズされる)場合があります。
:::
# 結果
これを設定することで、
Unityから`.psd`をダブルクリックで開く →　AffinityPhotoで編集して保存 → Unityで確認
といったイテレーションがスムーズに行えるようになりました。
windowsでproxy設定が変更できない「一部の設定が組織によって非表示になっているか，管理されています」

## 状況
本社から来たpcと出向先では指定すべきpacファイルのパスが違うのだがproxyの設定変更ができなくなっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/038e1366-9791-65e7-fac1-7b223245596c.png)

> *一部の設定が組織によって非表示になっているか，管理されています*

---

## 解決方法

グループポリシーにより変更が制限されている模様。

1. 管理者権限でコマンドプロンプトを立ち上げ，gpedit.msc実行

    ```
    gpedit.msc
    ```
2. コンピュータの構成→管理用テンプレート→Windowsコンポーネント→Internet Explorerに移動
3. 以下のポリシーを無効にする
    - プロキシの設定をできないようにする
    - コンピュータ別にプロキシを設定する
    - 自動構成の変更を許可しない

proxyの設定を変更できるようになりました!☆
Go | Union を Interface で実現する

最近はもっぱらGoを書いてるがメンタルモデルがTypeScriptに引きづられていたのでコード例を交えて比較して書いてみる。

## Go

- [Playground](https://goplay.tools/snippet/7G3Ao59_hfP)
- Interfaceで実現する
  - identifyなどのようにAやBごとのそれぞれの処理は、それぞれの構造体に対してメソッドを生やす形で実現する
  - ダックタイピングなので、AとBはInterfaceのAorBのことを知らない。`AorB` のInterfaceを満たすものならA、B以外でも入れられる


```go
package main

import (
	"fmt"
)

func main() {
	{
		// A
		c := ContainerItem{AorB: A{IamA: "なんかの値A"}}
		c.Echo("A: ")
	}

	{
		// B
		c := ContainerItem{AorB: B{IamB: 123}}
		c.Echo("B: ")
	}

	{
		// Interface で隠蔽している構造体にアクセス
		c := ContainerItem{AorB: B{IamB: 123}}
		switch aorb := c.AorB.(type) {
		case A:
			fmt.Println("A: ", aorb.IamA)
		case B:
			fmt.Println("B: ", aorb.IamB)
		}

	}

	{
		// AorBList 
		src := AorBList{B{IamB: 123}, A{IamA: "なんかの値A"}}
		cl := ContainerList{AorBList: src}
		cl.IsSimilar(AorBList{B{}, A{}},)
	}
}

// AorB
//
// A か B を表すInterface
type AorB interface{ Identify() string }

// A
//
// Aの実装
type A struct{ IamA string }

func (a A) Identify() string { return "This is A" }

// B
//
// B の実装
type B struct{ IamB int64 }

func (b B) Identify() string { return "This is B" }

// ContainerItem
//
// AorB を利用するような構造体
type ContainerItem struct{ AorB AorB }

func (c ContainerItem) Echo(str string) { fmt.Println(str, c.AorB.Identify()) }

// ContainerList
//
// AorB の配列を利用するような構造体
type AorBList []AorB

type ContainerList struct{ AorBList AorBList }

func (c ContainerList) IsSimilar(dsts AorBList) bool {
	for i, src := range c.AorBList {
		dst := dsts[i]
		if src.Identify() != dst.Identify() {
			return false
		}
	}
	return true
}
```

## TypeScript

- [Playground](https://www.typescriptlang.org/play/?#code/C4TwDgpgBAgg9gJwEJQLyygHykgUKSDdAbwEkBDAWxgC4oBnYBASwDsBzAGigGs2ATOgCIYQgL75w0FCQqUkdVgFdKAIwgJufVoKhCk43LgDGcVoyjN+EVsGYAzEGigAKcolV14yKAEo6jCwcaAB8UMS4UFEMAO7MwMYAFq7uCKoAdNr8vuGR0fnG5PTQIkI0efmVUAgQwEoIrHoAKonM9JbtohWVhcV6BnTdVVE1dQ3Nre1tOEJD0db25EoANsDlwz1mFgD6ihAAbhrOqaoA3HNVo-WNZQAis-kSEiZbcMsQ6ctw7C7EtJbWWwOEC-OT-ESAAwZABEMgB+GIRaATCURiXwol7mN4fL4-YgKAE2OyOUFUPEARgATABmAAsCJ0wgMKJRQA)
- TypeScript だと Unionに対する実装として switch を使うことが多い
  - never を用いれば型分岐の漏れは防げるが、全てのswitchにneverを入れないといけないので実装漏れは起きやすい
- identifyなどのようにAやBごとのそれぞれの処理は、switchで分岐させたcaseのなかで書いたりそれぞれの無名関数を作っておいてcaseの中からその関数を呼ぶことが多い
- kind のように、AやBごとに違うが必ず値を持っているものはそれぞれの構造体のなかで値をもつ

```ts
type AorB = A | B
type A = {IamA: string, kind: "A"}
type B = {IamB: number, kind: "B"}

const identify = (aorb: AorB ): string => {
    switch (aorb.kind) {
        case "A":
            return "This is A"
        case "B": 
            return "This is B"
        default:
            const _: never = aorb;
            return ":D"
    }
}

const echo = (str: string, aorb: AorB): void => {
  console.log(str, identify(aorb))
}

// main
const a = {IamA: "Aだよー", kind: "A" as const}
echo("A: ", a)


const  b = {IamB: 1234, kind: "B" as const}
echo("B: ", b)
```

## Go で switch
【VSCode】スクロール時のソース折り畳み設定

# はじめに
VSCodeでソースをスクロールしていたら、上のソースが折りたたまれていた。
慣れたら便利かもしれないが、設定解除を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628353/27cdafeb-2439-2769-e8d4-337046ba119d.png)


# 手順１．
歯車マーク > 設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628353/0ea8d594-d255-0d7b-31fb-d19f8864006d.png)


# 手順２．
設定の検索で`sticky scroll`を検索。
`Editor > Sticky Scroll:Enabled`のチェックを外す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628353/c71a2731-f887-15c6-28d1-51411185a348.png)


# 設定後
スクロールしてもソースは折りたたまれなくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628353/c1312666-080f-adb7-db45-5122f3eb7245.png)
ヨミが大事

#1. ヨミは大事だということ
プライム案件として、仕事を受けているわけだが、特定の開発ではなくDevOps的に進めながら、業務改善を進めていく内容である。
ただ、顕在化している要件を進めるのに集中しすぎて、その先の経営層への訴求だったら、最終目標を見ていなかったりと反省するような1日でした。
テスト技法

## テスト技法って何？
一言で言うと、「テストケースを作成するための方法」のこと。
テスト技法を活用してテストケースを作成することにより、効率よくテストケースを作成したり、抜け漏れを防いだりすることができます。

## テスト技法は3つ
1. ブラックボックステスト技法
2. ホワイトボックステスト技法
3. 経験ベースのテスト技法 

それぞれ、どのようなテストなのか、一言で言うと
1. ブラックボックステスト技法
・システムの振る舞いに基づくテスト（内部の構造に注目しないテストなので、ブラックボックス…中がどうなっているのか分からない状況でのテストってことですね）

2. ホワイトボックステスト技法
・システムの内部構造――関数などに基づくテスト（内部の構造をガン見するので、ホワイトボックス…見通しが利いている状況でのテストってことですね）

3. 経験ベースのテスト技法 
・文字通り、テスト担当者の経験に基づくテスト

## 各テスト技法の種類
3つに大分割されたテスト技法は、それぞれのテスト技法ごとにいくつか種類があります。
#### ブラックボックステスト技法
1. 同値分割法
2. 境界値分析
3. デシジョンテーブルテスト
4. 状態線テスト
5. ユースケーステスト

#### ホワイトボックステスト技法
1. ステートメントテスト
2. デシジョンテーブルテスト

#### 経験ベースのテスト技法
1. エラー推測
2. 探索的テスト
3. チェックリストベースドテスト


## 後書き
ありそうでないのが「機能ベースの技法」です。
JSTQB受験のための、非常に簡略なまとめなので、詳しく知りたい方はシラバスをご参照ください。
paiza Sランク問題「mod7占い」を Elixir で解いてみた

## はじめに

paiza S ランク問題を Elixir で解いてみます

## mod7占い

与えられた数値から３つ選択したとき、総計が７で割り切れる組み合わせの数を取得します

https://paiza.jp/works/mondai/s_rank_skillcheck_sample/mod7

```elixir
defmodule Paiza do
  def main do
    [_n | a] =
      :stdio
      |> IO.read(:all)
      |> String.trim()
      |> String.split("\n")

    # 各数を 7 で割った余りを計算し、数値ごとに何個あるのか取得する 
    f =
      a
      |> Enum.map(fn a_k ->
        a_k
        |> String.to_integer()
        |> rem(7)
      end)
      |> Enum.frequencies()

    # 合計が 7 の倍数になる全ての組み合わせを計算する
    [
      conbination(Map.get(f, 0), 3),
      Enum.product([Map.get(f, 0, 0), Map.get(f, 1, 0), Map.get(f, 6, 0)]),
      Enum.product([Map.get(f, 0, 0), Map.get(f, 2, 0), Map.get(f, 5, 0)]),
      Enum.product([Map.get(f, 0, 0), Map.get(f, 3, 0), Map.get(f, 4, 0)]),
      Enum.product([conbination(Map.get(f, 1, 0), 2), Map.get(f, 5, 0)]),
      Enum.product([Map.get(f, 1, 0), Map.get(f, 2, 0), Map.get(f, 4, 0)]),
      Enum.product([Map.get(f, 1, 0), conbination(Map.get(f, 3, 0), 2)]),
      Enum.product([conbination(Map.get(f, 2, 0), 2), Map.get(f, 3, 0)]),
      Enum.product([Map.get(f, 2, 0), conbination(Map.get(f, 6, 0), 2)]),
      Enum.product([Map.get(f, 3, 0), Map.get(f, 5, 0), Map.get(f, 6, 0)]),
      Enum.product([conbination(Map.get(f, 4, 0), 2), Map.get(f, 6, 0)]),
      Enum.product([Map.get(f, 4, 0), conbination(Map.get(f, 5, 0), 2)]),
    ]
    |> Enum.sum()
    |> IO.puts()
  end

  # 階乗
  defp factorial(0), do: 1
  defp factorial(n), do: n * factorial(n - 1)

  # 組み合わせの数
  defp conbination(n, r) when r > n, do: 0
  defp conbination(n, r) do
    div(factorial(n), factorial(r) * factorial(n - r))
  end
end

Paiza.main()
```

## 解説

考えたいのは「７ で割り切れるかどうか」なので 7 より大きい数は全て 7 で割った余りと同じ意味になります

入力値は全て 0 〜 6 のいずれかになるので、 0 〜 6 までの数値を３つ選択したときに 7 の倍数になる組み合わせを全て計算すれば良いことになります

以下のようにして、合計が ７ になる全てのパターンを取得できます

```elixir
for a_1 <- 0..6,
    a_2 <- 0..6,
    a_3 <- 0..6,
    a_1 <= a_2,
    a_2 <= a_3,
    Enum.sum([a_1, a_2, a_3]) |> rem(7) == 0 do
  {a_1, a_2, a_3}
end
```

実行結果は以下のとおりです

```elixir
[
  {0, 0, 0},
  {0, 1, 6},
  {0, 2, 5},
  {0, 3, 4},
  {1, 1, 5},
  {1, 2, 4},
  {1, 3, 3},
  {2, 2, 3},
  {2, 6, 6},
  {3, 5, 6},
  {4, 4, 6},
  {4, 5, 5}
]
```

12 パターンしかないので、それぞれ個別に計算してしまいましょう

例えば 0 が 3 個、 2 が 2 個、 5 が 4 個あったとき、 以下のように計算できます

- `{0, 0, 0}` のパターンは 0 が3個なので 1 通りだけ作れる
- `{0, 2, 5}` のパターンは `3 * 2 * 4 = 24` 通り作れる
- 他のパターンは作れない
- 全ての組み合わせは `1 + 24 = 25`

0 が 5 個ある場合、 5 個から 3 個を選ぶ組み合わせの数なので、以下の数式で計算できます

${}_n \mathrm{C}_r = \frac{n!}{r!(n-r)!}$

つまり

${}_5 \mathrm{C}_3 = \frac{5!}{3!2!} = 5 \times 4 / 2 = 10$

2 が 4 個、 3 が 2 個の場合、 `{2, 2, 3}` のパターンを作ることができます

2 を 4 個中 2 個選択肢、それぞれに 3 が 2 個組み合わせられるため、

${}_4 \mathrm{C}_2 \times 2 = \frac{4!}{2!2!} \times 2 = 4 \times 3 = 12$

このような計算を全てのパターンで計算して合計すれば OK です

## まとめ

S ランクですが、数学の問題だったので解けました

時間制限に引っかかるタイプと比べると楽ですね
【Python】ROS2 通信ノード実装

## 概要
ROS2 の通信ノードについて、Python を用いた基本的な実装をまとめました。
順次追加予定です。

## トピック通信
### パブリッシャ
```
import rclpy
from rclpy.node import Node
from std_msgs.msg import データ型

class パブリッシャのクラス名(Node):
    # コンストラクタ
    def __init__(self):
        super().__init__('ノード名')
        # パブリッシャの生成
        self.pub = self.create_publisher(データ型, 'トピック名', バッファ数)
        # タイマの生成
        self.timer = self.create_timer(タイマの間隔(s), self.timer_callback)

    # コールバック
    def timer_callback(self):
        # パブリッシュ
        self.pub.publish(メッセージ)
```
周期的にメッセージをパブリッシュします。

### サブスクライバ
```
import rclpy
from rclpy.node import Node
from std_msgs.msg import データ型

class サブスクライバのクラス名(Node):
    # コンストラクタ
    def __init__(self):
        super().__init__('ノード名')
        # サブスクライバの生成
        self.sub = self.create_subscription(データ型, 'トピック名',
                                            self.subscribe_callback, バッファ数)

    # コールバック
    def subscribe_callback(self, msg):
        # サブスクライブした時の処理
```
メッセージをサブスクライブした時、subscribe_callback() 内に実装されている処理が行われます。

## サービス通信
### サービス
```
import rclpy
from rclpy.node import Node

class サービスのクラス名(Node):
    # コンストラクタ
    def __init__(self):
        super().__init__('ノード名')
        # サービスの生成
        self.service = self.create_service(サービス型, 'サービス名', self.service_callback)

    # コールバック
    def service_callback(self, request, response):
        # サービスの処理
        
        return response

# main 関数
def main():
    rclpy.init()
    node = サービスのクラス名()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        print("Abort.")
    finally:
        rclpy.shutdown()
```
### クライアント
```
import rclpy
from rclpy.node import Node

class クライアントのクラス名(Node):
    # コンストラクタ
    def __init__(self):
        super().__init__('ノード名')
        # クライアントの生成
        self.client = self.create_client(サービス型, 'サービス名')
        # サービスが利用できるまで待機
        while not self.client.wait_for_service(timeout_sec=タイムアウト秒数):
            self.get_logger().info('Waiting for service to be available...')
        # リクエストのインスタンス生成
        self.request = サービス型.Request()

    def send_request(self, val):
        # リクエストに値を代入
        self.request.リクエスト名 = val
        # サービスのリクエスト
        self.future = self.client.call_async(self.request)

def main(args=None):
    rclpy.init(args=args)
    node = クライアントのクラス名()
    val = リクエストに設定する値
    node.send_request(val)

    while rclpy.ok():
        rclpy.spin_once(node)
        # サービスの処理が終了したら
        if node.future.done():
            try:
                # サービスの結果をレスポンスに代入
                response = node.future.result()
            except Exception as e:
                node.get_logger().info(f'Service call failed: {e}')
            else:
                # 結果の表示
                node.get_logger().info(
                    f'Request: {node.request.リクエストめい} -> Response: {response.レスポンス名}')
                break
    rclpy.shutdown()
```
AsciiDocでUMLファイル (PlantUML , Mermaid)を参照する方法

# はじめに
　AsciiDocで、PlantUMLとMermaidのUMLファイル参照する方法を紹介する。個別にUMLファイルを管理することで、ファイルの重複管理を避けることができる。また、単独のUMLファイルとUMLを参照したAsciiDocの両方でUML表示ができるような構成とする。

# 動作確認完了
* [GitLab.com](https://gitlab.com/gitlab-com)
  * [サンプルAsciiDoc](https://gitlab.com/ntrlmt/asciidoc_include_uml_test/-/blob/main/main.adoc?ref_type=heads)
* Visual Studio Code(以下、VSCode)

# 方法

::: note info
ポイント
* 参照されるUMLファイルは、単体でGitLabやVSCodeでUML表示を可能とするためMarkdownにする
* 上記UMLファイルを参照するAsciiDocでは、マークダウン書式を除外するために行数を指定してincludeする
:::

詳細は以下を参照。

https://gitlab.com/ntrlmt/asciidoc_include_uml_test

## PlantUML

例： PlantUMLファイルの相対パス(./resources/plantuml_test_class_diagram.md)の場合
```adoc
[plantuml, align="center"]
----
include::./resources/plantuml_test_class_diagram.md[lines=2..3]
----
```

　```[lines=a..b]```で、a行目からb行目までを読み込む。マークダウンのヘッダー(\```plantuml)とフッター(\```)を除くUML本体の行数を指定する。

::: note warn
注意点
 * -1で最終行を指定できるが、最終行から2行目などは指定できないため(-2としても最終行となる)、inlucdeするUMLファイルを確認して行数を直接指定する必要がある
:::

## Mermaid

例： Mermaid UMLファイルの相対パス(./resources/mermaid_test_class_diagram.md)の場合

```adoc
[mermaid, align="center"]
----
include::./resources/mermaid_test_class_diagram.md[lines=2..3]
----
```

行数の指定方法などは、PlantUMLの場合と同様。

# まとめ
　AsciiDocでPlantUMLやMermaidのUMLファイルを参照(include)する方法を紹介した。単独のUMLファイルでもGitLabやVSCodeでUML表示が働くようにMarkdownファイルとし、参照するAsciiDocでincludeする行数を指定することで、AsciiDocでの表示も可能とすることができた。

# 参考

https://qiita.com/masakura/items/d8c7563f2f6744819c7a

https://docs.asciidoctor.org/asciidoc/latest/directives/include-lines/

https://gitlab.com/ntrlmt/asciidoc_include_uml_test
yukicoder No.11 カードマッチ　解説

[問題文](https://yukicoder.me/problems/no/11)
# 解説
まず、各マークおよび数字について各々マッチするかを調べるという方法がある。
もしこれで愚直に判定するのであれば、実行時間は$O(HNW)$。制約は、$H\leqq 10^6$、$W\leqq 10^6$、$N\leqq 10^2$なので、当然、間に合わない。
ここで、マッチしないカードについて考えてみよう。
xoxo
oooo
oooo
xoxo
たとえば、マッチするカードをoにし、マッチしないカードをxとしたとき、こんな感じになったとする。
しかし、oを**右**に、そして**下**にずらしてしまえば
xxoo
xxoo
oooo
oooo
こんな感じで、xは長方形になる。
こんな感じで、どんな取り除き方をしても**マッチしないカードを寄せたら長方形になる**。
よって、マッチしないカードの枚数を求めるときは、$(W-重複を取り除いたSの要素数)*(H-重複を取り除いたKの要素数)$という計算でできる。
実際に書くときは**set**で重複を消して計算をするのがいいだろう。
では、本題のマッチするカード数を求めるにはどうすればいいのか。
今回は**余事象**を使う。
すると、次のことが言える。
**マッチするカードの枚数=カード全体-マッチしないカード**
カード全体の枚数は$HW$で求められるので、マッチするカードの枚数は上記の計算式通りに求めればいいだろう。
そして、最後に**手札のカード**を引く。
手札のカードに重複はないし、かならずマッチしてるので**そのまま**$N$**を引く**。
実行時間は、set処理がボトルネックとなり$O(N log N)$。よって、十分高速。
$W$および$H$が十分に大きいため、long long型を使おう。
```C++
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

int main() {
  ll w,h,n;cin>>w>>h>>n;
  set<int> tate,yoko;
  for(int i=0;i<n;i++){
    int s,k;cin>>s>>k;
    tate.insert(s);
    yoko.insert(k);
  }
  cout<<h*w-(w-tate.size())*(h-yoko.size())-n<<endl;
}
```
Visual Studio Codeの意外と知らないショートカット

# 背景
[この動画](https://www.youtube.com/watch?v=nWIRJBCjls8)を見て、Visual Studio Codeのショートカットについて、結構知らないものがあったので忘備録としてここでまとめておきたいと思います。
# ショートカット紹介
注意：当方、macユーザーであるため、macでのショートカットを書き連ねます。ご理解ください🙇
### ショートカットの見つけ方編
-  `command + shift + P`（おすすめ）
	コマンドパレットの入力を起動するコマンド。"open terminal"など行いたい動作を入力すると、それっぽいコマンドを表示してくれる。
	ちなみに、"terminal: create new terminal in editor area"と検索しenterを押すと、エディタ領域でターミナルを開くことができる。広くて便利。

### vscode編
- `command + 0 or command + 1`（おすすめ）
	エディタ↔︎サイドバーの移動を行う（`command + 0`がエディタ→サイドバー、`command + 1`がサイドバー→エディタ）
- `command + D`
	サイドバーを閉じたり開いたりする
- `command + P`
	プロジェクト内のファイルを対象に、ファイルの検索を行う
- `command + T`
	プロジェクト内のファイルを対象に、関数や変数名などのシンボルの検索を行う
- `Shift + control + →`（おすすめ）
	ブロック全体を選択する（関数全体、変数名全体など）
- `option + ↑ or option + ↓`
	選択した部分を上下に移動させる
## ターミナル編
- `command + K`
	現在のコンソール画面をクリアにする
pandasでExcelファイルを読みこんだ際にdeciamal型にするのに苦労した

# 事象
エクセルファイルにてxxxx.xxxxx,xxx.xxxxなどの数値が入っている列をpandasで読み取りparquetにしようとしたが、なぜがdecimal型でparquetに変換できないとおこられた。

```python
import pandas as pd
import os
from pyspark.sql.types import *

# Excelファイルのパス
excel_path = "/Volumes/xxx/xx/xxx.xlsx"

# pandasを使用してExcelファイルをDataFrameに読み込む
df = pd.read_excel(excel_path)

# スキーマの定義
schema = StructType([
    StructField("a", StringType(), True),
    StructField("b", DecimalType(8,4), True),  
    StructField("c", IntegerType(), True),
])

# pandasのDataFrameをSparkのDataFrameに変換、スキーマを適用
spark_df = spark.createDataFrame(df, schema=schema)

# Parquetファイルとして書き出し
parquet_path = "/Volumes/xx/xx"
spark_df.write.parquet(parquet_path)
```

```
エラー内容
/databricks/spark/python/pyspark/sql/pandas/conversion.py:413: UserWarning: createDataFrame attempted Arrow optimization because 'spark.sql.execution.arrow.pyspark.enabled' is set to true; however, failed by the reason below:
  Exception thrown when converting pandas.Series (float64) with name 'GroupExponent' to Arrow Array (decimal128(8, 4)).
Direct cause: Got bytestring of length 8 (expected 16)
Attempting non-optimization as 'spark.sql.execution.arrow.pyspark.fallback.enabled' is set to true.
```
カラムbをfloat型で定義するとうまくいくのだが、decimalにしたい


# 解決方法
decimalにしたい列を一度stringに変換の上decimalに変換する

```python
import pandas as pd
import os
from pyspark.sql.types import *

# Excelファイルのパス
excel_path = "/Volumes/xxx/xx/xxx.xlsx"

# pandasを使用してExcelファイルをDataFrameに読み込む
df = pd.read_excel(excel_path)

# b列をDecimalType(8, 4)に変換したうえでdecilamオブジェクトとして小数点を丸める
df['b'] = df['b'].apply(lambda x: Decimal(str(x)).quantize(Decimal('0.0001')))

# スキーマの定義
schema = StructType([
    StructField("a", StringType(), True),
    StructField("b", DecimalType(8,4), True),  
    StructField("c", IntegerType(), True),
])

# pandasのDataFrameをSparkのDataFrameに変換、スキーマを適用
spark_df = spark.createDataFrame(df, schema=schema)

# Parquetファイルとして書き出し
parquet_path = "/Volumes/xx/xx"
spark_df.write.parquet(parquet_path)
```
oracleのパラメータバインド

予期せぬエラーで解消に数時間費やしはまったため、備忘録として。

oracleでパラメータを使用する際、パラメーの名前解決をする場合下記宣言が必要。


~~~
OracleCommand.BindByName = True
~~~


上記宣言をしない場合、パラメータの追加順で当てはめられるため、
追加順によっては型変換エラーなど予期しない事態に陥る。

プレースホルダーとパラメータを紐づけるために宣言が必要なことを知らなかった。
調べてみるとなるほどね、といった内容でした。

同じ事象ではまっていたメンバーもいたため、割とはまる人が多いのかな、、
VS Community2022のC#プロジェクトをGoogleDriveに置いてるとビルド時にエラー

# 結論
**Visual Studio Community2022を17.7.6にダウングレードすれば解決。**

# 詳細と駄文

当方、Visual Studio Community 2022で開発するプロジェクトを基本Google Drive上に置きっぱなしにして生きております。
先日、VSCommunity2022のバージョンを更新したところ、C#プロジェクト[^1]のビルド時に以下のエラーが出て何もできなくなりました。

```
MSB4018    "CreateAppHost" タスクが予期せずに失敗しました。
System.IO.IOException: 要求された操作はユーザー マップ セクションで開いたファイルでは実行できません。

   場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateCore(SafeFileHandle fileHandle, String mapName, HandleInheritability inheritability, MemoryMappedFileSecurity memoryMappedFileSecurity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, Int64 capacity)
   場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile(FileStream fileStream, String mapName, Int64 capacity, MemoryMappedFileAccess access, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability, Boolean leaveOpen)
   場所 Microsoft.NET.HostModel.ResourceUpdater.Update()
   場所 Microsoft.NET.HostModel.AppHost.HostWriter.<>c__DisplayClass2_0.<CreateAppHost>b__1()
   場所 Microsoft.NET.HostModel.RetryUtil.RetryOnIOError(Action func)
   場所 Microsoft.NET.HostModel.AppHost.HostWriter.CreateAppHost(String appHostSourceFilePath, String appHostDestinationFilePath, String appBinaryFilePath, Boolean windowsGraphicalUserInterface, String assemblyToCopyResourcesFrom, Boolean enableMacOSCodeSign)
   場所 Microsoft.NET.Build.Tasks.CreateAppHost.ExecuteCore()
   場所 Microsoft.NET.Build.Tasks.TaskBase.Execute()
   場所 Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   場所 Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()    ***    C:\Program Files\dotnet\sdk\8.0.303\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.targets    709
```
(一部伏字)

Google Drive外であればエラーは出ないので、完全にネットワークドライブがらみ。（おそらくOne DriveやRAM Diskでも起こると推測）

Microsoft様は非常に~~クソな~~面倒なことをやらかしてくれたので、wingetを用いてダウングレードしましょう。
~~Visual Studio Installer単体でできないのもクソ~~
[【VS2022】ダウングレード](https://note.com/imori001/n/n9b70d611ed72)、[winget で Visual Studio 2022 のバージョンをダウングレードする方法](https://mseeeen.msen.jp/downgrade-visual-studio-2022-with-winget/)あたりを参考に。

<details><summary>ダウングレード手順の簡単な説明</summary>

リンクが死んでると悲しい思いをするので一応記載。
1. wingetがインストールされていない人はマイクロソフトストアからアプリインストーラーというアプリをインストール
1. 以下のコマンドでインストール可能なバージョンの一覧表示
`winget show Microsoft.VisualStudio.2022.Community --versions`
1. 以下のコマンドでVSCommunity2022をアンインストール
` winget uninstall --id Microsoft.VisualStudio.2022.Community`
1. 以下のコマンドでバージョンを指定してインストール
`winget install --id Microsoft.VisualStudio.2022.Community --version 17.7.6`

</details>

現状確認済みのバージョンは以下。[^2]

|バージョン|大丈夫か|
|---|---|
|17.3.2(古すぎ)|OK|
|17.7.6 |OK|
|17.8.0 |NG|
|17.8.6 |NG|
|17.10.4|NG|
|17.10.5|NG|

17.8.0は.Net8に初めて対応したバージョンなので早く修正してほしいところ。


[^1]: 試していないけどC#以外もダメだったりするのだろうか
[^2]: 追加の情報をお持ちの方はコメントください
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（80/100）

【80日目】
トピック 8：SAPS/4HANAの製造指図（12/15）

≪問題80≫
製造指図処理における主要な活動の適切な順序は以下のうちどれですか。
□指図登録、発行、決済、出庫、確認、入庫
□指図登録、発行、印刷、出庫、確認、入庫
□指図登録、利用可能在庫確認、発行、品目払出、確認
□指図登録、印刷、発行、出庫、確認、入庫

≪解答≫
□指図登録、発行、決済、出庫、確認、入庫
■指図登録、発行、印刷、出庫、確認、入庫
□指図登録、利用可能在庫確認、発行、品目払出、確認
□指図登録、印刷、発行、出庫、確認、入庫

≪解説≫
◆製造指図は、数多くの個別の活動によって処理されますが、その中でも重要なステップと順序は、以下のとおりです。
（1）指図登録
（2）日程計画（能力評価/平準化）
（3）発行
（4）印刷
（5）出庫（品目払出）
（6）確認
（7）入庫
（8）決済
この手順を守ることで、製造指図の処理がスムーズに行われます。
ROS2 基本コマンドまとめ

## 概要
ROS2 の基本コマンドをまとめました。
順次追加予定です。

## コマンド一覧

### パッケージ作成
#### ノード
```
ros2 pkg create --build-type [ビルドタイプ] --node-name [ノード名] [パッケージ名]
```

#### インタフェース
```
ros2 pkg create [パッケージ名] --dependencies rosidl_default_generators --build-type ament_cmake
```

ビルドタイプを Python にしたい場合は、ament_python を使用します。

### ビルド
```
colcon build
```
ros2 のパッケージのビルドには colcon を使用します。

### ノードの実行
```
ros2 run [パッケージ名] [ノード名]
```
Pythonに挑戦#1

皆さんこんにちは。Crane&Iの長谷川です。
久しぶりの投稿になります。
今回からPythonに関する記事を投稿しようと思います！
何故急にPythonの記事を投稿しようと思ったのかというと、現在参画している案件にてPythonで自動化してほしいと依頼を受けてゼロ知識から挑戦し始めたからです。
今まで、java scrpitやC言語、VBAなど様々な言語を勉強したり使ってきましたがPythonも(個人的に)癖があるなぁと思いながら楽しく悪戦苦闘しています。

# Pythonとは？
そもそもPythonとは何か？
Pythonとは、プログラミング言語の1種です。最近はとても人気と需要がある言語となっています。
その理由としては、コードの記述が短くシンプルな言語で、初心者でも比較的容易に利用できるためです。(要するに時間をかけて勉強しなくても扱える言語)
あと、コンパイル作業が無いのでコードを書いたら即実行。エラー個所がすぐにわかるのもありがたいですね！

# Pythonの環境準備
Pythonでコードを組む場合、使用する環境(PCのOSなど)に応じて適切なものを選択しなければなりません。
※特に職場で使用する場合、許可されていないツールなどを勝手にダウンロードしてはいけないのでちゃんと確認しましょう。

# Pythonのインストール
まずはPythonを使えるようにするための環境を準備しましょう！
私が使用しているPCのOSはWindowsなので、Windows向けのツールをダウンロードしていきます！
https://prog-8.com/docs/python-env-win
上記のURLを参考に公式サイトからダウンロードしました。

# いざPythonでコーディング開始
Pythonがインストールできたらコーディングを開始したいところですが、コーディングする際に使用するツールもたくさんあります。
今回はPandasを使用してコーディングしていきたいと思います。

次回からはコーディングした時につまずいたことを投稿しようと思います。
それではまた。