OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerのコンテナ内からlocalhost(別コンテナとか)にアクセスをする

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Dockerのコンテナ内からlocalhostにアクセスをしたい場面があったのでその時にやったことをメモとして残しておきます。

# 内容

接続したいコンテナの中に以下のようなコマンドを使用して入ります。

```
docker-compose exec app bash
```

そのご以下コマンドを実行します。

```
cat /etc/hosts | awk 'END{print $1}' | sed -e 's/[0-9]\+$/1/g'
```

すると以下のような感じで結果が返ってきます。

```
172.20.0.1
```

これに対してアクセスをすることができます。

```
        $url = "http://172.20.0.1:8081/api/api/code-check";
        $ch = curl_init();
```

※一次的な解決策に過ぎないので、以下の記事を参考にやってみてください


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://peblo.gs/get-host-machine-ip-address-in-docker-container/
iOSアプリ開発とネイティブアプリの重要性: ニューウェーブソリューションズの専門知識

ニューウェーブソリューションズでは、iOSアプリ開発とネイティブアプリの重要性について説明します。iOSアプリ開発は、現代のデジタルビジネスにおいて重要な役割を果たしています。ネイティブアプリとは、特定のプラットフォームに最適化されたアプリケーションのことです。以下では、iOSアプリ開発の重要性とネイティブアプリの定義について詳しく説明します。
iOSアプリ 開発の重要性
[iOSアプリの開発](https://newwave-solutions.co.jp/ios-app-development/)は、現代のビジネス戦略において不可欠です。iOSは、Appleが提供するモバイルオペレーティングシステムであり、iPhoneやiPadなどのデバイスで使用されています。iOSプラットフォームは、高いセキュリティ性、優れたユーザーエクスペリエンス、豊富なアプリケーションエコシステムで知られています。したがって、iOSアプリの開発は、企業がユーザーに価値を提供し、ビジネスを成長させるための重要な手段です。
iOSアプリの開発には、いくつかの重要なポイントがあります。
ユーザーエクスペリエンスの向上: iOSデバイスは、高品質のユーザーエクスペリエンスを提供することで知られています。iOSアプリの開発では、Appleのデザインガイドラインに従い、直感的で使いやすいアプリを作成することが重要です。
セキュリティの確保: iOSは、高いセキュリティ機能を備えており、ユーザーデータの保護が重視されています。iOSアプリの開発では、セキュリティに配慮した設計と実装が必要です。
アプリケーションの性能: iOSアプリは、高速で安定した性能を提供する必要があります。アプリの応答性や動作の滑らかさを確保するために、最新の開発ツールやテクノロジーを活用することが重要です。
App Storeへの展開: iOSアプリをApp Storeに公開することで、世界中のユーザーにアプリを提供することができます。App Storeへの展開には、Appleのガイドラインに従い、アプリの品質とセキュリティを確保することが必要です。
ネイティブ アプリ と は
[ネイティブアプリと](https://newwave-solutions.co.jp/what-is-native-app/)は、特定のプラットフォーム（iOSやAndroid）に最適化されたアプリケーションのことです。ネイティブアプリは、プラットフォーム固有の言語やツールを使用して開発され、プラットフォームのハードウェアやソフトウェアと密接に統合されています。そのため、ネイティブアプリは高いパフォーマンスと使いやすさを提供し、ユーザーエクスペリエンスを向上させることができます。
ネイティブアプリの特徴は以下のとおりです。
高いパフォーマンス: ネイティブアプリは、プラットフォーム固有のAPIや機能を直接活用するため、高速で安定した性能を提供します。
使いやすさ: ネイティブアプリは、プラットフォームのデザインガイドラインに従い、直感的で使いやすいインターフェースを提供します。
デバイスとの統合: ネイティブアプリは、デバイスのハードウェアやソフトウェアと密接に統合されており、カメラ、GPS、通知などの機能を直接活用することができます。
オフライン機能: ネイティブアプリは、一部の機能をオフラインで利用できるようにすることができます。これにより、ユーザーがインターネット接続のない環境でもアプリを使用できるようになります。
ニューウェーブソリューションズでは、iOSアプリ開発とネイティブアプリの設計に豊富な経験と専門知識を持っています。我々のエキスパートチームは、お客様のビジネスニーズに合わせてカスタムソリューションを提供し、優れたモバイルアプリケーションを開発します。お問い合わせや相談はいつでも歓迎です。
Pythonを使用したウェブアプリケーション開発

Pythonは、[web アプリ 開発 python](https://newwave-solutions.co.jp/python-web-app/) において優れた選択肢です。そのシンプルな構文と豊富なライブラリにより、開発者は迅速にアプリケーションを構築できます。例えば、DjangoやFlaskなどのフレームワークを使用することで、ウェブアプリケーションの骨格を簡単に作成できます。さらに、Pythonはデータサイエンスや機械学習の分野でも広く使用されており、ウェブアプリケーションにAIやデータ解析の機能を組み込むことも可能です。
web アプリ デザイン
[web アプリ デザイン](https://newwave-solutions.co.jp/web-app-design/)は、ウェブアプリケーションの成功に不可欠です。ユーザーが使いやすく、魅力的なインターフェースを持つアプリケーションは、ユーザーエクスペリエンスを向上させ、ユーザーの満足度を高めます。
良い web アプリ デザインは以下の要素が重要です。
ユーザビリティ: ユーザーが直感的に操作できるデザインを目指しましょう。メニューやボタンの配置、ナビゲーションの流れなどが重要です。
視覚的吸引力: 鮮やかな色彩、美しいフォント、魅力的なイメージなど、視覚的に魅力的なデザインを作成しましょう。
レスポンシブデザイン: デバイスの種類や画面サイズに関係なく、最適な表示ができるレスポンシブデザインを採用しましょう。
アクセシビリティ: 全てのユーザーがアプリケーションを利用できるよう、バリアフリーなデザインを心がけましょう。WCAG（Web Content Accessibility Guidelines）などのガイドラインに従うことが重要です。
良い web アプリ デザインは、開発と同じくらい重要です。ユーザーが魅了され、使いやすいデザインを提供することで、アプリケーションの成功につながります。
簡単にできると思っていたのにハマった「タスクスケジューラを使ったファイル出力アプリ（exe）の定期実行」

# はじめに
exeは実行日時をテキストファイルに出力するシンプルなアプリ
exeを単体で実行すると問題なくファイル出力されるが、タスクスケジューラから起動すると指定した場所にファイルが出力されなかった

ファイル出力されない
![スクリーンショット 2024-05-16 12.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/89cd4740-d66a-3dc9-ca4a-d214577642c9.png)

ファイル出力される
![スクリーンショット 2024-05-16 12.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/5bfcc710-8276-4c50-61cd-4e4dcc455d8b.png)

タスクスケジューラからの実行
![スクリーンショット 2024-05-16 12.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/33cb5515-845a-5365-60a4-33845a4bb7c6.png)
## ファイル出力のサンプルコード
Visual Studio Codeのターミナルから以下を入力しProgram.csを少し書き換えて実行日時をテキストファイルに出力するようにした
```ruby:Terminal
$ dotnet new console
```
```ruby:Program.cs
namespace c_;
class Program
{
  static void Main(string[] args)
  {
    // Console.WriteLine("Hello, World!");

    // カレント日時をテキストファイルに出力
    string dt = DateTime.Now.ToString();
    File.AppendAllText(@"./test.txt", dt + " " + Environment.NewLine);
  }
}
```
## 環境
+ Windows Server 2022
+ .NET 8.0
+ Visual Sutdio Code

# 結論から
## 原因
Program.cs内で出力先をカレントパスに指定していたこと、且つタスクスケジューラの操作の"開始（オプジョン）（T）"を空欄にすることで
**デフォルトの"C:\Windows\System32"にファイルが出力されていた**

@albireo　さんから教えていただきました
https://qiita.com/team-t-rex/items/ac20d585e381f2607aa3#comment-04bbe69b55259a25820f

### Program.cs
```ruby:Program.cs
$ dotnet new console
```
```ruby:Program.cs
    File.AppendAllText(@"./test.txt", dt + " " + Environment.NewLine);　<- ここ！
```
### タスクスケジューラの設定
![スクリーンショット 2024-05-16 15.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/1f18a26c-1e1c-7b02-c872-39a12a1a56f7.png)

## 解決方法1
Program.cs内のファイル出力先をフルパスに変更する
```ruby:Program.cs
namespace c_;
class Program
{
  static void Main(string[] args)
  {
    // Console.WriteLine("Hello, World!");

    // カレント日時をテキストファイルに出力
    string dt = DateTime.Now.ToString();
    File.AppendAllText(@"C:/Users/Administrator/Desktop/publish/test.txt", dt + " " + Environment.NewLine); <- ここ！
  }
}
```
## 解決方法2
タスクスケジューラの操作の設定項目"開始（オプジョン）（T）"に実行するexeが格納されているフォルダのパスを指定する

開始（オプジョン）（T）: C:/Users/Administrator/Desktop/publish/
![スクリーンショット 2024-05-16 11.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/4d12dc7b-0aba-cdb5-5d49-ea7e9c64e2d2.png)

# タスクスケジューラの各設定
今回はタスクスケジューラからのexe起動を確認するだけが目的だったので、かなりシンプルな設定にしている
## 全般
"ユーザーがログオンしているときのみ実行する", "ユーザーがログオンしているかどうかにかかわらず実行する"のどちらでも実行できた
**後者にすると設定を変更するたびにAdministratorのパスワード入力を求められる**
![スクリーンショット 2024-05-16 11.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/b2f6788b-1c5b-b236-4c12-b7a3f00c1c3c.png)
## トリガー
適当に設定
![スクリーンショット 2024-05-16 11.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/7a951e77-1c0e-5dfd-e8bd-205a025e0f8c.png)
## 操作
"プログラム/スクリプト（P）"に実行するexeのフルパス、"開始（オプジョン）（T）"に実行するexeが格納されているフォルダのパス（~~これを指定しないと実行されない！~~） 
![スクリーンショット 2024-05-16 11.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/2d9f308c-4375-3102-8f9b-cb76840f289e.png)
## その他設定項目
デフォルトのまま
ウェブアプリケーション、情報システム、およびオンラインサービスを開発および構築する

近年、ウェブ開発の需要が増加するにつれて、開発者はさまざまなプログラミング言語やフレームワークの中から最適な選択を迫られています。特に、Spring Framework、Django、Laravel、そしてNestJsなどの人気のあるフレームワークは、開発者に多くの機能と柔軟性を提供します。本記事では、それぞれのフレームワークの特徴と利点を比較し、どのようなプロジェクトに適しているかを探求します。
1. Spring Framework
[Spring Framework](https://newwave-solutions.co.jp/spring-framework/)は、Java言語でのウェブアプリケーション開発において広く使用されているフレームワークです。このフレームワークは、IoC（Inversion of Control）やDI（Dependency Injection）などの機能を提供し、開発者がコードをより効果的に管理し、テストするのに役立ちます。また、Spring Bootというサブプロジェクトは、アプリケーションのセットアップやデプロイメントを簡素化し、素早く効率的なウェブアプリケーションを構築するのに役立ちます。Spring Frameworkは、大規模な企業向けのアプリケーションから小規模なプロジェクトまで、幅広いシナリオに適しています。
2. Djangoとは
[Djangoは](https://newwave-solutions.co.jp/what-is-django/)、Python言語でのウェブアプリケーション開発において広く使用されているフレームワークです。Djangoは、優れたオブジェクトリレーショナルマッパー（ORM）、強力な管理インターフェース、セキュリティ機能など、多くの機能を提供します。また、Djangoのドキュメントやコミュニティの豊富さは、新しい開発者が学習しやすい環境を提供します。Djangoは、コンテンツ管理システム（CMS）、電子商取引サイト、ソーシャルメディアプラットフォームなど、多くのウェブアプリケーションの開発に適しています。
3. Laravelとは
Laravelは、PHP言語でのウェブアプリケーション開発において非常に人気のあるフレームワークです。[Laravelは](https://newwave-solutions.co.jp/what-is-laravel/)、エレガントな構文、強力なORM、ルーティング、ビューテンプレートなど、多くの機能を提供します。また、LaravelのComposerというパッケージ管理システムは、外部ライブラリの追加や更新を簡素化し、開発者がアプリケーションの拡張性を向上させるのに役立ちます。Laravelは、小規模なプロジェクトから大規模なアプリケーションまで、幅広いニーズに対応できる柔軟性を持っています。
4. NestJs
[NestJsは](https://newwave-solutions.co.jp/what-is-nestjs/)、TypeScript言語でのNode.jsアプリケーション開発において使用されるフレームワークです。NestJsは、Angularの影響を受けたモジュールベースのアーキテクチャを提供し、開発者がモジュール、コントローラ、サービスを効果的に構築するのに役立ちます。また、NestJsは、Express.jsやFastifyといった人気の高いNode.jsフレームワークとのシームレスな統合を可能にし、柔軟性と拡張性を提供します。NestJsは、リアルタイムアプリケーションやマイクロサービスの開発に適しています。
5. 仕様
"[仕様](https://newwave-solutions.co.jp/specification/)"は、プロジェクトや製品の設計、機能、動作に関する具体的な要件や基準を指します。仕様は、開発者や関係者が一貫した理解を持ち、期待される結果を達成するための基盤を提供します。
以上のフレームワークと概念は、それぞれ独自の利点と利用シナリオを持ちますが、プロジェクトのニーズや開発者の技術スタックに応じて適切な選択を行うことが重要です。これらの選択肢を比較検討し、最適なフレームワークを選択することで、成功に近づくことができます。
6. 最新のITトレンド
IT業界では常に新しいトレンドが生まれています。最新の[ITトレンド](https://newwave-solutions.co.jp/it-latest-trends/)を把握し、それに適した技術やフレームワークを選択することは、プロジェクトの成功に
Spring Framework、Django、Laravel、そしてNestJsは、それぞれ独自の強みを持つ優れたフレームワークです。プロジェクトの要件や開発者の技術スタックに応じて、最適な選択を行うことが重要です。Spring Frameworkは、Javaのエンタープライズ開発に適しており、大規模な企業向けのアプリケーションを構築するのに最適です。Djangoは、Pythonのシンプルさとパワフルな機能を組み合わせ、多種多様なウェブアプリケーションを開発するのに適しています。Laravelは、PHPの柔軟性とエレガントな構文を活かし、素早く効率的なウェブアプリケーションを構築するのに最適です。NestJsは、TypeScriptとNode.jsの組み合わせで、リアルタイムアプリケーションやマイクロサービスを構築するのに最適です。
開発者は、各フレームワークの特徴や利点を熟考し、プロジェクトのニーズに最も適した選択肢を見極める必要があります。適切なフレームワークを選択することで、開発プロセスがスムーズに進み、最終的な成果物がより優れたものになることが期待されます。重要なのは、プロジェクトの目標を達成するために、最適なツールとテクノロジーを選択することです。
javaのプロトタイプ（Prototype）パターン

## はじめに

プロトタイプパターンは、既存のオブジェクトを複製することで新しいオブジェクトを生成するデザインパターンです。複雑なオブジェクトを一から作成するのではなく、既存のオブジェクトをコピーすることで効率的にオブジェクトを生成できます。

## プロトタイプパターンの概要

プロトタイプパターンは以下の要素で構成されます。

- Prototype (原型): 複製可能なオブジェクトを宣言するインターフェースまたは抽象クラス。
- ConcretePrototype (具体的な原型): Prototypeインターフェースを実装し、複製機能を提供する具体的なクラス。
- Client (利用者): 新しいオブジェクトを生成するために、Prototypeに複製を要求します。

## プロトタイプパターンの利点

- 複雑なオブジェクトを一から生成する必要がなくなり、コードがシンプルになります。
- 実行時に動的にオブジェクトを生成できます。
- サブクラス化を減らすことができます。

## サンプルコード (Java)

```java
// Prototype インターフェース
interface Shape extends Cloneable {
    Shape clone();
    void draw();
}

// ConcretePrototype クラス
class Rectangle implements Shape {
    // ...
    
    @Override
    public Shape clone() {
        return new Rectangle(this);
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

// Client クラス
class Application {
    public static void main(String[] args) {
        Shape rectangle = new Rectangle();
        Shape clonedRectangle = rectangle.clone();
        
        rectangle.draw();
        clonedRectangle.draw();
    }
}
```

## まとめ

プロトタイプパターンは、既存のオブジェクトを複製することで新しいオブジェクトを生成するシンプルで効果的なデザインパターンです。複雑なオブジェクトの生成を簡略化し、コードの可読性とメンテナンス性を向上させることができます。状況に応じて適切に利用することで、より柔軟で効率的なオブジェクト生成が可能になります。
NestJsとVue.js: エンタープライズアプリケーション開発の未来

NestJsとVue.jsは、エンタープライズアプリケーション開発における重要な技術です。これらの技術は、高度な機能と使いやすさを兼ね備えており、多くの企業が採用しています。今回は、NestJsとVue.jsについて詳しく見ていきましょう。
1. Vue.js とは
[Vue.js](https://newwave-solutions.co.jp/what-is-vue-js/)は、JavaScriptフレームワークの一つであり、特にUIの構築に優れています。Vue.jsはシンプルで直感的な構文を提供し、開発者が迅速に効率的なUIを構築できるようサポートします。また、豊富なプラグインとコンポーネントライブラリが利用可能であり、さまざまなプロジェクトに適用できます。
2. NestJs
[NestJs](https://newwave-solutions.co.jp/what-is-nestjs/) は、Node.jsのためのフレームワークであり、エンタープライズアプリケーションの開発に特化しています。NestJsは、モジュールベースのアーキテクチャを採用し、スケーラビリティと保守性を高めます。また、豊富な機能と強力なDI（Dependency Injection）システムを提供し、大規模なプロジェクトの開発を支援します。
3. Ionic とは
[Ionicは](https://newwave-solutions.co.jp/what-is-ionic/)、クロスプラットフォームのモバイルアプリケーションを開発するためのフレームワークです。AngularやVue.jsと組み合わせて使用され、ネイティブアプリのような見栄えと動作を提供します。Ionicは、Web技術（HTML、CSS、JavaScript）を使用してアプリケーションを構築し、さまざまなプラットフォームに展開することができます。
NestJsとVue.jsの統合
NestJsとVue.jsを組み合わせることで、エンタープライズアプリケーションの開発がさらに効率的になります。NestJsはバックエンドのロジックを処理し、APIを提供する役割を担い、Vue.jsはフロントエンドのUIを担当します。この統合により、開発者はバックエンドとフロントエンドの両方で、それぞれの最適なフレームワークを使用できます。
ニューウェーブソリューションズジャパンのサービス
ニューウェーブソリューションズジャパンでは、NestJsとVue.jsを活用したエンタープライズアプリケーションの開発において、最高水準のサポートを提供しています。我々のエキスパートチームは、ニーズに合わせたカスタムソリューションを提供し、顧客のビジネスニーズを満たすために努力しています。NestJsとVue.jsを活用して、革新的なアプリケーションを開発するためのパートナーとして、ぜひニューウェーブソリューションズジャパンをご検討ください。
プログラミング言語の進化：Kotlin、Java、そしてバックエンド言語の違い

コンピュータ言語の世界は常に進化しています。古くから使われてきたCOBOLから、最新の技術であるGO言語とDart言語まで、バックエンド言語の進化は目覚ましいものがあります。今回は、これらの言語について詳しく見ていきましょう。
1. COBOL とは
[COBOL](https://newwave-solutions.co.jp/what-is-cobol/)（Common Business Oriented Language）は、1959年に開発されたプログラミング言語です。主にビジネスアプリケーションの開発に使用され、金融業界や行政機関などで広く採用されてきました。COBOLは、データ処理やバッチ処理などの領域で強力な性能を発揮し、長年にわたり重要な役割を果たしてきました。
2. GO 言語
[GO言語は](https://newwave-solutions.co.jp/go-language/) 、Googleが2009年に開発したプログラミング言語です。GO言語は、高い並行性と効率性を持ち、大規模なシステムやネットワークアプリケーションの開発に適しています。また、シンプルな構文と豊富な機能を備えており、開発者にとって使いやすい言語です。
3. Dart 言語
[Dart言語は](https://newwave-solutions.co.jp/what-is-dart/) 、Googleが2011年に公開したプログラミング言語であり、特にモバイルアプリケーションの開発に使用されています。Dart言語は、高いパフォーマンスと使いやすさを両立させており、特にFlutterフレームワークを使用したクロスプラットフォームアプリケーションの開発に適しています。
4. バックエンド 言語の進化
[バックエンド言語](https://newwave-solutions.co.jp/?p=21436&preview=true)は、ウェブアプリケーションやモバイルアプリケーションのサーバーサイドで使用される言語です。古くから使われてきたCOBOLから、GO言語とDart言語への移行は、その進化を示しています。古典的なCOBOLは、安定性と信頼性を提供してきましたが、近年では新たな技術の台頭により、効率性や柔軟性が求められるようになりました。GO言語やDart言語は、これらの要求に応えるために開発されたものであり、特に大規模なシステムやモバイルアプリケーションの開発に適しています。
5. まとめ: 新しい時代のバックエンド開発
COBOLからGO言語とDart言語への移行は、新しい時代のバックエンド開発の到来を示しています。これらの言語は、より効率的で柔軟な開発を可能にし、現代のデジタル時代において重要な役割を果たしています。ニューウェーブソリューションズジャパンでは、最新の技術を駆使したバックエンド開発サービスを提供し、お客様のビジネスの成長を支援します。お問い合わせや相談はいつでも歓迎です。
6. KotlinとJavaの違い
[KotlinとJavaは](https://newwave-solutions.co.jp/kotlin-java-comparison/)、どちらもAndroidアプリケーション開発で広く使用されているプログラミング言語です。しかし、それぞれには独自の特徴があります。Kotlinはシンプルで読みやすい構文が特徴であり、null安全性を提供するため、安全なコーディングが可能です。一方、Javaは豊富なライブラリと安定性で知られており、多くのプロジェクトで使用されています。しかし、一部の開発者は、Javaの構文が冗長であると感じることがあります。

以上から、コンピュータ言語の進化は絶え間ないものであり、私たちはこれからも技術の発展に対応していく必要があります。私たちは、最新の技術を駆使したバックエンド開発サービスを提供し、お客様のビジネスの成長を支援します。
ホリゾンタル設計書：SPA開発プロジェクトの効果的な戦略

近年、SPA（Single Page Application）開発は、ウェブ開発の新たな標準となっています。このアプローチは、ユーザーエクスペリエンスを向上させ、ウェブアプリケーションのパフォーマンスを最適化するための効果的な方法として広く採用されています。SPA開発は、従来のアプリケーションとは異なる独自の設計アプローチを必要とします。本記事では、SPA開発プロジェクトにおけるホリゾンタル設計書の重要性と効果的な戦略について探ります。
ホリゾンタル設計書の重要性
SPA開発プロジェクトでは、複雑なフロントエンドの要件やコンポーネント間の相互作用を管理することが必要です。[ホリゾンタル](https://newwave-solutions.co.jp/horizontal-saas-and-vertical-saas/) 設計書は、開発チームが共通の理解を持ち、一貫したアーキテクチャを確立するのに役立ちます。この設計書には、アプリケーション全体の機能、データフロー、およびコンポーネント間のインタラクションが明確に記述されています。これにより、開発者は目標を共有し、プロジェクトのさまざまな側面に対する責任を理解することができます。
効果的な戦略
定期的な更新とレビュー: ホリゾンタル[設計書](https://newwave-solutions.co.jp/design-documents/) は、プロジェクトの進行に伴い、定期的に更新される必要があります。新しい機能や要件が追加されるたびに、設計書を更新し、開発チーム全体が最新の情報にアクセスできるようにします。また、定期的なレビューを行うことで、不明瞭なポイントや矛盾が早期に発見され、問題の解決が容易になります。
クロスファンクショナルなコラボレーション: ホリゾンタル設計書の作成には、開発チーム全体の協力が必要です。バックエンドエンジニア、フロントエンドエンジニア、デザイナーなど、異なる専門分野のメンバーが協力して、全体のアーキテクチャを構築することが重要です。クロスファンクショナルなコラボレーションにより、異なる視点からのフィードバックを受け取り、より総合的な設計を実現することができます。
明確な文書化と共有: ホリゾンタル設計書は、プロジェクト全体で明確に文書化され、開発チーム全体と関係者と共有される必要があります。設計書は、コードベースと同様に重要な資産であり、新しいメンバーのオンボーディングや将来の変更の理解を支援します。また、関係者が設計の決定プロセスに参加し、意見を共有できるようにすることも重要です。
ソフトウェアとは
[ソフトウェアとは](https://newwave-solutions.co.jp/software-fundamental/) 、コンピュータシステムにおいて実行されるプログラムやデータの集合体です。ハードウェアが物理的なコンポーネントを指すのに対し、ソフトウェアは操作を指示し、データの処理を行う不可視の部分を構成します。ソフトウェアは、システムソフトウェア（オペレーティングシステムなど）とアプリケーションソフトウェア（ウェブブラウザ、ゲームなど）に分類されます。効果的なソフトウェア開発には、計画、設計、実装、テスト、保守の各ステップが必要です。ホリゾンタル設計書は、特にアプリケーションソフトウェア開発において、複雑な構造や機能の一貫性を保つために重要な役割を果たします。
SPA開発の概要
SPAは、従来の多ページアプリケーションとは異なり、1つのHTMLページでアプリケーション全体が構築されます。これにより、ページの読み込みが高速化され、ユーザーエクスペリエンスが向上します。SPAは、JavaScriptフレームワーク（例: Angular、React、Vue.js）を使用して開発されることが一般的です。また、SPAはAPIを活用し、サーバーとのデータの双方向通信を可能にします。
SPAの開発には、多くの利点があります。まず第一に、高速なページ読み込みが挙げられます。SPAでは、最初に必要なリソースを一度だけ読み込み、以降はデータのみを取得します。これにより、ユーザーは迅速なページ遷移を体験することができます。また、SPAはリッチなユーザーエクスペリエンスを提供し、アプリケーションの見栄えや操作性を向上させます。さらに、SPAはモバイルデバイスにも適しており、レスポンシブなデザインを実現します。
結論
SPA開発プロジェクトでは、ホリゾンタル設計書が成功の鍵となります。適切に作成され、定期的に更新され、開発チーム全体と関係者と共有されるホリゾンタル設計書は、プロジェクトの一貫性と効率性を向上させます。効果的な戦略を採用し、クロスファンクショナルなコラボレーションを促進することで、SPA開発プロジェクトの成功を確実なものにすることができます。
Git GUIツールについて

こんにちは！
株式会社OGIX クライアントエンジニアのY.Kです！
（弊社については最後に紹介があるのでぜひ見てください）


みなさんはGit GUIツールを使用していますか？
私はGit触り始めての頃にコマンドラインツールでのGit操作していた所、先輩にGit GUIツールの使用を勧められました。
最初はコマンドラインでの操作と比べて段違いで操作しやすい！！！と感動していました。
ですが最近になってGit GUIツールでのできないこと、ツールならではのデメリットなどに気が付いたのでGit GUIツールについて簡単に紹介しようと思います。

## Git GUIとは？
GUI（グラフィカルユーザーインターフェース）は、ユーザーが直感的に操作できるグラフィカルなインターフェースのこと。
マウスやタッチパネルなどの入力デバイスを用いて、ウィンドウやアイコン、メニューなどを操作でコンピュータプログラムの機能を利用できるインタフェースを指します。

## Git GUIツールのメリット
#### 1.視覚的に操作ができる
コマンドラインツールでは、コマンドを覚えたり、入力することが必要ですがGUIツールではマウスで操作することができるため、視覚的に操作することができます。
#### 2.操作ミスが減る
コマンドラインツールでは、間違ったコマンドを入力してしまうと誤った操作をしてしまうことがありますが、GUIツールでは操作ミスが減ります。
#### 3.余分な差分をコミットすることを防げる
GUIツールでは変更前と後の差分が分かり易く、必要な差分だけを簡単にコミットすることも可能です

## Git GUIツールのデメリット
#### 1.操作の反応が遅くなる場合がある
Gitのコマンドラインツールに比べると、GUIツールの操作は遅くなることがあります。
特に、大きなリポジトリを扱う場合は、操作の反応が遅くなることがあります。
#### 2.最新版のGitをサポートしているとは限らない
GUIツールは、常に最新版のGitをサポートしているわけではありません。
そのため、GUIツールのバージョンが古い場合、最新版のGitで追加された新機能を使うことができない場合があります。
#### 3.柔軟性の制限
GUIツールは、Gitの柔軟性を失うことがあります。
Gitコマンドラインツールを使ってできることの一部をGUIツールで行おうとすると、GUIツールにその機能がなかったり、機能が制限されていたりすることがあります。

## Git GUIツールの種類
Git公式サイトで紹介しているGUIは全部で50種類以上
https://git-scm.com/downloads/guis
今回はその中から一部抜粋して紹介します。

### Git GUI
Gitの公式インストーラーにバインドされているGit GUI
同時にインストールできる仕組みとなっているため、簡単に導入できます。
公式GUIツールなので公式ドキュメントが充実しています

Git GUIの起動方法は簡単で
```
git gui
```
とコマンドラインで使用すればGit GUIの画面に遷移します

![スクリーンショット 2024-05-13 134120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565804/27552b66-3e21-12d4-4f5b-55dbb2f86d9c.png)


変更をコミットするための手順は、
1.コミット予定に入っていない変更をコミット予定に入れる
2.コミットメッセージにコミットログを記載する
3.コミットを押す
4.プッシュを押し、プッシュ先のブランチを確認する
5.プッシュを押す


### Sourcetree
IT系のツールを多数開発しているATLASSIAN社が開発しているGUI
利用者が多く使い方なども豊富に公開されています。
機能やユーザーインターフェースに力が入っており、Git GUIをより多機能かつ使い易い印象です。

![mByCwKwPHNd5SVs1715575949_1715575982.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565804/7002e2e7-2b49-db50-b8dc-b0f34c66d79f.png)

変更をコミットするための手順はGit GUIと似ており、
1.作業ツリーのファイルからコミット予定のファイルを入れる
2.ファイルステータスからコミットログを記載する
3.コミットを押す
4.プッシュを押し、プッシュ先のブランチを確認する
5.プッシュを押す

### TortoiseGit
Windowsのみの対応で、エクスプローラー統合型のツール
エクスプローラー上でリポジトリの状態を一目で判断しやすく、右クリック時に表示されるコンテキストメニューからPushやPullの基本的な操作ができます。

![24e39vz2jy7vU2i1715583554_1715583620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565804/5c3c50b1-caf5-b954-cb66-25f9ef60cd9b.jpeg)

変更をコミットするための手順は、
1.作業フォルダを右クリックし、コミットを押す
2.コミットの設定画面が開き、メッセージの項目からコミットログを記載する
3.コミットを押す
4.作業フォルダを右クリックし、プッシュを押す
5.プッシュの設定画面が開き、プッシュ先のブランチを確認する
6.プッシュを押す

説明したようにコミット、プッシュの基本的なGit作業がエクスプローラー上で行えるので、非エンジニアにもおすすめのGit GUIツールになっています。

## 一緒に働く仲間を募集しています！
株式会社OGIXでは一緒に働いてくれる仲間を募集しています！
エンタメ制作集団としてゲームのみならず、未来を見据えたエンタメコンテンツの開発を行っています。

事業拡大に伴い、エンジニアさんを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/company_6473754/about
▼代表インタビュー
https://www.wantedly.com/companies/company_6473754/post_articles/443064
▼東京オフィスの応募はこちら
https://www.wantedly.com/projects/1468324
▼新潟オフィスの応募はこちら
https://www.wantedly.com/projects/1468155
【ChatGPT＋DALL-E3】生成された画像を見れないChatGPTのための手を思い付きました。


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

　今回は、生成された画像を見れないChatGPTのための手を思い付きましたので、その報告です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　最初に
　　Web版とアプリ版が
　　　日本語化しました。

　これまで
　　英語でやってたので
　　　すぐに気が付きました。

　細かい点が
　　変わっていそうな感じですね。

　描画して
　　英文プロンプトを
　　　出させると、
　　　　マークダウンの
　　　　　コードブロックに
　　　　　　入れられちゃうし😅
***
　では、本題です。

　ChatGPTとDALL-E3は
　　別の生成AIということは
　　　これまでに何度かしています。

　それで
　　ChatGPTから
　　　DALL-E3にPromptが行き、
　　　　画像がChatGPT上に
　　　　　表示されます。

　しかし、
　　ChatGPTからは
　　　この画像を見ることが
　　　　できません。

　そのため、
　　こちらの指示どおりの
　　　生成が行なわれていない、
　　　　と言っても、
　　　　　リトライするばかり。
***
　いろいろと考えた結果、
　　ひとつの手を思い付きました。

　ChatGPTだって
　　画像を解析できます。

　ただ、DALL-E3からの画像は
　　ダメ、というだけです。

　そこで、
　　画像をダウンロードして
　　　それをアップロードすれば
　　　　ChatGPTでも解析可能です。

　何度もイラつきながら
　　リトライや指示を与えるよりも
　　　確実に理解してもらえます。

　アップロードとともに
　　入力するPromptは
　　　“これが生成された画像です”と
　　　　入れて、要望を追記すれば、
　　　　　ChatGPTもPromptだけで
　　　　　　判断せずに済みます。

　もちろん、
　　それでも
　　　DALL-E3が
　　　　かたくなに似たような
　　　　　画像を生成してくる場合も
　　　　　　ありますが。

　それでも
　　イラつきは
　　　それほどでは
　　　　なくなるかと
　　　　　思います。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Booking.com から身に覚えのないメールが来る

## 事象

Booking.com を操作していないのに下記のメールが届く

![Booking.com からのメール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584829/5e7e4bb4-ced2-93a4-c943-531a38a9de42.png)

## 状況確認

- 私は Booking.com にユーザ登録しており、たまに利用している
- しかしここ最近は Booking.com にアクセスしていない
- 2024/04/23 から 4回ほど同様の内容のメールを受信している
  - 2024/05/16 06時
  - 2024/04/26 19時
  - 2024/04/23 10時
  - 2024/04/23 06時
- いずれもメールの認証ボタンは押していない

## フィッシング詐欺か?

- 送信元は noreply@booking.com であり、正規のサーバーから送信されている
- 外部リンクのアドレスも account.booking.com　であり正規のアドレス
- このメールは Booking.com にてパスワードなしでログインする正規の手段

![認証用のリンクでログイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584829/4a490f82-a960-3734-77e5-0a2cc448221b.png)

上記3点からフィッシング詐欺とは考えにくい

## メールの認証ボタンを押すとどうなる？

- メールの認証ボタンを押した端末はログインする
- "認証用のリンクでログイン" を押した端末はログインできない

上記2点により、もし認証ボタンを押してしまったとしてもアカウント乗っ取りは発生しないと考える

## まとめ

- 何者かが不正アクセスを試していると考えられる
- しかしこの方法では不正アクセスが成立するとは考えにくい
- 危険性は低いと考え、しばらく静観する
- Booking.com を今後も利用したいと考えているため退会はしない
- とはいえクレジットカード情報を登録しているのでやや不安は残る

## 参考URL

https://www.reddit.com/r/techsupport/comments/18zewqa/keep_getting_bookingcom_verification_link_emails/
VBA2

```vba

Sub CheckCSVFiles()
    Dim folderPath As String
    Dim fileNames As Collection
    Dim fileCount As Integer
    Dim i As Integer
    Dim prevID As String
    Dim currentID As String
    Dim prevFileData As Variant
    Dim currentFileData As Variant
    Dim header As String
    Dim idColumnIndex As Integer
    Dim prevLine As String
    Dim currentLine As String
    Dim errorCount As Integer
    Dim sortedFiles As Collection
    Dim appendedLines As New Collection
    
    ' C2セルからフォルダパスを取得
    folderPath = Range("C2").Value
    If Right(folderPath, 1) <> "\" Then
        folderPath = folderPath & "\"
    End If
    
    ' CSVファイルのリストを取得
    Set fileNames = GetCSVFiles(folderPath)
    fileCount = fileNames.Count
    
    ' ソートされたファイルのリストを作成
    Set sortedFiles = New Collection
    For i = 1 To fileCount
        For Each fileName In fileNames
            If InStr(fileName, Format(i, "000")) > 0 Then
                sortedFiles.Add fileName
                Exit For
            End If
        Next fileName
    Next i
    
    ' 連続性チェック
    errorCount = 0
    
    For i = 1 To sortedFiles.Count - 1
        ' ファイル名を取得
        prevFileName = sortedFiles(i)
        currentFileName = sortedFiles(i + 1)
        
        ' 前のファイルを読み込む
        prevFileData = ReadCSV(prevFileName)
        ' 現在のファイルを読み込む
        currentFileData = ReadCSV(currentFileName)
        
        ' ヘッダー行を取得
        header = prevFileData(0)
        ' 社員番号列のインデックスを取得
        idColumnIndex = GetIDColumnIndex(header, "社員番号")
        
        ' 社員番号列が見つからない場合はエラーメッセージを表示して終了
        If idColumnIndex = -1 Then
            Debug.Print "社員番号 column not found in " & prevFileName
            Exit Sub
        End If
        
        ' 前のファイルの最終行の社員番号を取得
        prevLine = GetLastDataLine(prevFileData)
        prevID = Trim(Split(prevLine, ",")(idColumnIndex))
        
        ' 現在のファイルの最初の行の社員番号を取得
        currentLine = GetFirstDataLine(currentFileData)
        currentID = Range("C3").Value
        
        ' 社員番号を比較
        If prevID <> currentID Then
            ' 前のファイルに追加
            appendedLines.Add currentLine
            ' 次のファイルから削除
            currentFileData(1) = ""
            ' エラーカウントをインクリメント
            errorCount = errorCount + 1
        End If
    Next i
    
    ' 追加した行を前のファイルに書き込む
    If appendedLines.Count > 0 Then
        Dim fso As Object
        Dim ts As Object
        
        ' Create FileSystemObject
        Set fso = CreateObject("Scripting.FileSystemObject")
        ' Open the previous file for appending
        Set ts = fso.OpenTextFile(prevFileName, 8, True, -1)
        
        ' Write the appended lines
        For Each line In appendedLines
            ts.WriteLine line
        Next line
        
        ' Close the file
        ts.Close
    End If
    
    Debug.Print "Total errors found: " & errorCount
End Sub
```
よく使うAWS CLI

# 権限設定

```shell
$ aws configure --profile {example-profile}
```

# S3 一括ファイルダウンロード

```shell
$ aws s3 cp s3://{example-bucket}/ ./dist --recursive --profile {example-profile}
```

# S3 一括ファイル同期アップロード

```shell
$ aws s3 sync ./dist s3://{example-bucket}/ --exact-timestamps --delete --profile {example-profile}
```

# オプション

```shell
--dryrun （空実行）
```
アカウント削除されてSlackアプリからサインアウトできない件


## 状況

SlackのMacアプリから昔の会社にログインしたままほっておくと、

* アカウント削除されてエラーが常に出ている
* ログインしないとサインアウトできないので詰む
* 右クリックにはコピーしかでなくてサインアウトできない

## 結論

SlackのワークスペーススイッチャーをONにすると削除できるようになります

ワークスペーススイッチャーのトグルは `CMD+SHIFT+S` かSlack左上のアイコン（次の写真で赤囲い部分）


## スクリーンショット


ログインしないとサインアウトの文字がでない図

![スクリーンショット 2024-05-16 10.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/04f4f646-35a0-7dde-48b0-568dd2f41664.png)

ワークスペーススイッチャーを出す部分

![スクリーンショット 2024-05-16 11.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/eca9884e-c005-6666-f641-cdaa9d9e441b.png)

右クリックすると削除の文字がでる

![スクリーンショット 2024-05-16 11.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/2890be95-0578-c887-804b-37dc99ffc877.png)

ワークスペーススイッチャーOFFだとコピーしかでない（謎仕様・・・）

![スクリーンショット 2024-05-16 11.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/7f1a605a-3089-8e20-92da-764fea5a6780.png)
1 分で自動停止するDatabricks SQL Serverless Warehouse を Databricks SDK により作成・変更する方法

## 概要

Databricks SQL Serverless Warehouseを効率的に管理するために、Databricks SDKを使用して1分で自動停止するよう設定する方法をご紹介します。この[@taka_yayoi(Takaaki Yayoi)](https://qiita.com/taka_yayoi) さんの次の記事にて、1 分で自動停止するDatabricks SQL Serverless Warehouse を作成できることを知りました。Databricks SDK により、新規で作成する方法と既存の Databricks SQL Serverless Warehouse の設定を変更する方法を検証しました。

- [アイドル時間1分で停止するDatabricks SQLサーバレスウェアハウスの作成 #Databricks - Qiita](https://qiita.com/taka_yayoi/items/8a764c02e98a85732ef8)


## 検証コードと実行結果

## 事前準備

まず、`databricks-sdk`ライブラリを最新版に更新します。以下のコードを実行して、Python環境を再起動します。

```python
%pip install databricks-sdk --upgrade -q
dbutils.library.restartPython()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/31598247-3db9-4e6b-c23e-a60506868880.png)

### 1. 新規で1 分で自動停止するDatabricks SQL Serverless Warehouse を作成する方法

新規に1分で自動停止する Warehouse を作成するには、`auto_stop_mins`パラメータに`1`を設定します。以下のコードを実行して Warehouse を作成します。

```python
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

created = w.warehouses.create(
    name=f"qiita-wh-01",
    cluster_size="2X-Small",
    max_num_clusters=1,
    auto_stop_mins=1,
    enable_serverless_compute=True,
).result()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7453b00d-6325-f731-56c9-20b3192ef381.png)

Databricks Workspace にて SQL warehouses の設定を確認すると`Auto Stop`が 1 分となっていることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/233c2f17-3d98-b40d-7e78-2e55103ea1c0.png)

### 2. 既存の Databricks SQL Serverless Warehouse の設定を変更する方法

設定の変更を検証するために、`auto_stop_mins`に`10`に設定した Databricks SQL Serverless Warehouse を作成します。

```python
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

created = w.warehouses.create(
    name=f"qiita-wh-02",
    cluster_size="2X-Small",
    max_num_clusters=1,
    auto_stop_mins=10,
    enable_serverless_compute=True,
).result()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4f67fd66-c982-ffb5-37c4-0dfdf7617366.png)

設定を変更する場合には Databricks SQL Serverless Warehouse の ID が必要となるため取得します。

```python
warehouses = w.warehouses.list()

# 特定のSQLウェアハウスの名称からIDを検索
warehouse_name = "qiita-wh-02"
warehouse_id = None
for warehouse in warehouses:
    if warehouse.name == warehouse_name:
        warehouse_id = warehouse.id
        break

# IDを表示
if warehouse_id:
    print(f"'ID: {warehouse_id}")
else:
    print(f"ID が見つかりませんでした。")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/68307a3b-f451-8970-1a72-b35de2c8d4f4.png)

Databricks SQL Serverless Warehouse の自動停止時間を 1 分に設定します。

```python
# 設定値を更新
w.warehouses.edit(
    warehouse_id,
    auto_stop_mins=1,
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ece91229-ad1b-0ed4-73ea-175c918c5720.png)

Databricks Workspace にて SQL warehouses の設定を確認すると`Auto Stop`が 1 分となっていることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/eecb40bf-cfea-5676-c571-6fc1454514f4.png)
Atcoderで使える技(ほぼ自分用)

# 1.配列の中身連結
```python
s=['a', 'B', 'C']
```
みたいな配列をaBCのように連結させる方法
```python
print("".join(s))
```
# 2.exit()
ここでまとめてあった。

https://magazine.techacademy.jp/magazine/15831
ポータルサイトのテクニカルSEOにおける低評価回避施策

## 100万ページ以上のポータルサイトのテクニカルSEOで、低評価ページを一気に70万ページ以上削除する検証を行いました

今回テクニカルSEOの施策を実施したのは下記サイトです。
https://craft-bank.com/

サイトの配下に多くの会社情報ページを持っており、かつ情報が薄いことでGoogleから低評価を受けている状態でした。
具体的には、Googleサーチコンソール上で
* クロール済みindex未登録
* 検出-index未登録
のいずれかに振り分けられていました。

### 削除にあたってのリスクをどう評価したか

テクニカルSEOで特に担当者の方の頭を悩ませている状況としては、トラフィックが発生しているページ群が同時にGoogleからの低評価を受けているケースではないでしょうか。

今回一度に70万ページ以上削除するにあたって、実施を意思決定できたのは事業上のKPIの変更があったことによります。

削除対象のページやそのSEO的恩恵を受けているページから発生するエンゲージメントが事業上サブKPIのような位置づけになり、別のディレクトリのページから発生するエンゲージメントが主要KPIになったことで、低評価ページを削除することで見込める主要KPIのエンゲージメント向上を優先させる意思決定ができるようになりました。

### 対策

とはいえ、大幅なサイト上のコンテンツ変更にはなりますので、切り戻しがすぐできるようにエンジニアチームとの調整は行いました。

## 結果

施策の結果ですが、大成功となりました。
もちろん削除したページを含むディレクトリのトラフィックは大幅に落ちましたが、主要KPIの方は2~3倍のリードの増加が達成できました。
取りたかったミドルクエリでの1位獲得など、目に見える変化が得られました。
低評価コンテンツがなくなったことにより本来のドメインパワーが適切に評価されたのかと思います。
ZoneIdとZoneNameの異なる組み合わせが見たかった

下記のページにあるとおり、AWSのアベイラビリティゾーンの実態であるデータセンターには物理的実体を示すアベイラビリティーゾーンID があり、AWSアカウントにより アベイラビリティゾーン名 と アベイラビリティーゾーンID は異なる組み合わせである可能性がある

https://docs.aws.amazon.com/ja_jp/ram/latest/userguide/working-with-az-ids.html

組み合わせを確認するために `aws ec2 describe-availability-zones` が使えるとのことなので、自分がアクセスできるAWSアカウントを全部確認してみたが、全部以下の結果だった。
リージョンを指定していないが `.aws/config` デフォルトのリージョンを指定しているためで、全部 東京リージョン(ap-northeast-1) だ

```
$ aws ec2 describe-availability-zones --profile <MY-PROFILES> | jq '.AvailabilityZones[] | "\(.ZoneName):\(.ZoneId)"' -r
ap-northeast-1a:apne1-az4
ap-northeast-1c:apne1-az1
ap-northeast-1d:apne1-az2
```

ZoneIdとZoneNameの異なる組み合わせが見たかった。

ちなみに異なるAWSアカウント間をTrangitGatewayでつないだ際、おなじZoneNameをつないだつもりで、実は異なるAZをつないでおり、AZを跨いだ通信となることにより、意図しないルーティングとなったり、通信料が高くなったりするため、異なるAWSアカウントをつなぐ際には意識する必要があるらしい。
チームが自ら学び、前進するためのポイント

チームが自ら学び、前進するためには、以下のポイントが重要です。

**1. チームのトップが率先して学ぶ姿勢を見せる**

チームのトップがサボっていると、メンバーもそれに倣ってしまいます。逆に、トップが積極的に学び、行動することで、メンバーも感化されて学ぶようになります。

**2. メンバー同士がお互いに刺激を与え合う**

メンバー同士が積極的に交流し、意見交換することで、互いに刺激を与え合い、学びを深めることができます。

**3. 新しいことに挑戦する機会を設ける**

新しいことに挑戦することで、メンバーは新しい知識やスキルを身につけることができます。

**4. 失敗を恐れずにチャレンジする**

失敗を恐れて挑戦を控えてしまうと、成長が止まってしまいます。失敗を恐れずにチャレンジすることで、メンバーは学ぶことができます。

**5. 学んだことを共有する**

学んだことをチーム内で共有することで、メンバー全体の学びを深めることができます。

## まとめ
これらのポイントを意識することで、チームが自ら学び、前進する組織を作ることができます。

チームが自ら学び、前進するためには、リーダーの姿勢が重要です。リーダーが率先して学ぶ姿勢を見せることで、メンバーもそれに倣い、チーム全体が学び続ける組織を作ることができます。

また、メンバー同士がお互いに刺激を与え合ったり、新しいことに挑戦したり、失敗を恐れずにチャレンジしたりすることも重要です。学んだことを共有することで、チーム全体の学びを深めることもできます。

これらのポイントを意識することで、あなたも自ら学び、前進するチームを作ることができます。
JavaScriptの本を読んでメモ残すぞ

# はじめに

※こちらの記事は、随時更新していくスタイルです。
　最終的に読んでまとめた読書感想文になります。

私は、仕事をしながらプログラミングについて学習をしています。
残念ながら本を読むのがすごく苦手！学習を続けるのも一苦労！

だけど、少しでも進んでるって足跡を残したら継続の助けになるかなーなんて考えて、こちらでアウトプットしてみることにしました。

と、いうことで、
**[1冊ですべて身につくJavaScript入門講座](https://www.amazon.co.jp/%E3%80%90Amazon-co-jp-%E9%99%90%E5%AE%9A%E3%80%911%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FJavaScript%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-DL%E7%89%B9%E5%85%B8-JavaScript%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88-%EF%BC%91%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F/dp/4815615756)** を読んでいこうと思うよ。
最終的にまとまったものが、何か役に立ったら素敵だなー


# アウトプット
初心者向け　REST APIって？

## 1. REST APIとは？

REST（Representational State Transfer）APIは、Webサービスがデータをやり取りするためのインターフェースです。簡単に言うと、異なるソフトウェアシステムが互いに通信し、データを交換する方法を提供します。REST APIはHTTPプロトコルを使用し、広く使われているため、多くのWebアプリケーションで採用されています。

## 2. なぜREST APIを使うのか？

- **シンプルで使いやすい**: HTTPプロトコルを基にしているため、Webブラウザや他のHTTPクライアントで簡単に使用できます。
- **柔軟性**: クライアントとサーバーが異なるプラットフォームでも動作するため、非常に柔軟です。
- **スケーラビリティ**: サーバーとクライアントの役割を明確に分けることで、システムの拡張が容易です。

## 3. RESTの基本原則

RESTは以下の6つの基本原則に基づいています。

1. **クライアント・サーバーアーキテクチャ**: クライアントはユーザーインターフェースを管理し、サーバーはデータとビジネスロジックを管理します。これにより、責任が分離され、開発とメンテナンスが容易になります。
2. **ステートレス性**: 各リクエストは独立しており、サーバーはクライアントの状態を保持しません。つまり、リクエストごとに必要な情報を全て含める必要があります。
3. **キャッシュ対応性**: クライアントはレスポンスをキャッシュすることで、パフォーマンスを向上させます。適切なキャッシュ制御が行われることで、サーバーの負荷を減らすことができます。
4. **統一インターフェース**: 一貫性のあるインターフェースを提供し、リソースの操作を標準化します。これにより、APIの学習と使用が容易になります。
5. **階層化システム**: クライアントは中間サーバーを経由してリソースにアクセスできます。これにより、システムのスケーラビリティとセキュリティが向上します。
6. **コードオンデマンド（オプション）**: 必要に応じて、クライアントにスクリプトやコードを送信できます。これにより、機能の動的な拡張が可能になります。

## 4. REST APIの基本操作

REST APIは、HTTPメソッドを使用してリソースを操作します。以下は主なHTTPメソッドとその用途です。

- **GET**: サーバーからリソースを取得します。例: ユーザー情報を取得する。
- **POST**: 新しいリソースを作成します。例: 新しいユーザーを追加する。
- **PUT**: 既存のリソースを更新します。例: ユーザー情報を更新する。
- **DELETE**: 既存のリソースを削除します。例: ユーザーを削除する。

## 5. REST APIの設計

### URL設計

リソースの操作はURLを通じて行います。URLはリソースを指し示すために直感的で分かりやすいものでなければなりません。

例:
- **GET /users**: すべてのユーザー情報を取得します。
- **GET /users/{id}**: 特定のユーザー情報を取得します。
- **POST /users**: 新しいユーザーを作成します。
- **PUT /users/{id}**: 特定のユーザー情報を更新します。
- **DELETE /users/{id}**: 特定のユーザーを削除します。

### リクエストとレスポンスのフォーマット

一般的にはJSONフォーマットが使用されます。以下は、ユーザー情報を取得する際のリクエストとレスポンスの例です。

**リクエスト:**
```http
GET /users/1 HTTP/1.1
Host: example.com
```

**レスポンス:**

```json
{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com"
}

```

## **6. エラーハンドリング**

APIを使用する際には、エラーが発生する可能性があります。適切なエラーハンドリングを行うことで、クライアントに対して明確なフィードバックを提供します。一般的なHTTPステータスコードは以下の通りです。

- **200 OK**: 正常に処理が完了した場合。
- **201 Created**: 新しいリソースが正常に作成された場合。
- **400 Bad Request**: リクエストが不正である場合。
- **401 Unauthorized**: 認証が必要な場合。
- **404 Not Found**: リソースが見つからない場合。
- **500 Internal Server Error**: サーバー内部でエラーが発生した場合。

## **7. まとめ**

REST APIは、異なるシステムがデータを交換するための強力な手段です。基本原則を理解し、HTTPメソッドを正しく使うことで、効率的でスケーラブルなWebサービスを構築できます。
GitLab Tips

GitHub 脳のままで GitLab をたまに使うと あれ、どうだったかな? と迷うこと多し。
備忘録。


# プロジェクト

GitLab でのプロジェクトとはレポジトリのこと。

# プロジェクトの削除

プロジェクトの「設定」-「一般」-「高度な設定」内にある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/577d33a9-bd71-6824-7704-76eaf243dcfd.png)

# サブグループ内にプロジェクトを移動

プロジェクトの「設定」-「一般」-「高度な設定」内にある「プロジェクトを転送」でサブグループを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cf402daa-1d05-4322-a9d8-a3ef9abdee82.png)


# ローカルに既にあるファイルを登録するプロジェクトを新規で作る

空のレポジトリを作る際、READMEファイルの作成のチェックを外しておく。README.md を作ると merge などがめんどくさい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fdd2368d-f1e2-4398-9582-b286cb233bbb.png)

その後、ローカルで以下のように操作

```
$ git config --global --add safe.directory プロジェクトディレクトリ
$ cd プロジェクトディレクトリ
$ rm -rf .git
$ git init --initial-branch=main
$ git remote add origin git@gitlab.com:レポジトリアドレス.git
$ git add .
$ git commit -m "Initial commit"
$ git push --set-upstream origin main
```

# デフォルトブランチを変更

「設定-「レポジトリ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/98c40efe-ed2e-1f32-a621-fc4ff7650c9c.png)
IBM が開発したコードモデル Granite Code Models

## この記事を読んでわかること
- IBM が開発した 116 種類のプログラミング言語で訓練された Granite Code Models について
- エンタープライズソフトウェア開発におけるコード生成、バグ修正、コード説明などの幅広いタスクで高性能
- モデルは3Bから34Bのサイズがあり、Apache 2.0ライセンスで公開

## 想定読者

1. **ソフトウェア開発者やエンジニア**: 特に、コード生成やバグ修正、コードのドキュメント化などのタスクに関心がある開発者。

2. **研究者や学術関係者**: 自然言語処理や機械学習の分野でコードインテリジェンスに関する研究を行っている人々。

3. **エンタープライズITマネージャーや技術リーダー**: 自社のソフトウェア開発プロセスの効率化や生産性向上を目指している企業の技術責任者。

4. **AI倫理やデータプライバシーに関心がある専門家**: AIモデルの信頼性やデータ処理方法に興味を持つ人々。

## Granite Code Models について
### Granite Code Models とは？
Granite Code Modelsは、IBMが開発した116種類のプログラミング言語で訓練された LLM で、コード生成、バグ修正、コード説明、ドキュメント化などの幅広いタスクに対応できるように設計されています。これらのモデルは、エンタープライズソフトウェア開発の生産性向上を目指しており、3Bから 34B までのモデルサイズがあります。

### Granite Code Models のアーキテクチャ
Granite Code Modelsは、トランスフォーマーデコーダーアーキテクチャに基づいており、RoPE 埋め込みや Multi-Head Attention (MHA)、Multi-Query Attention (MQA)、Grouped-Query Attention (GQA) などの技術を採用しています。モデルサイズに応じて、異なるコンテキスト長やバッチサイズで訓練されており、複数のトークン化手法や損失関数を使用して高い性能を実現しています。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  Granite Code Models のパラメータごとのアーキテクチャの違い\n(出典：Granite Code Models: A Family of Open Foundation Models for Code Intelligence)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/14a67aee-8a1b-4c94-6c5d-be142f2dd81b.png>
@enduml
```

#### RoPE

RoPE（Rotary Position Embedding）は、トランスフォーマーモデルにおける位置エンコーディング手法の一つです。トークンの位置情報をエンコーディングするために、回転行列を使用して相対位置情報をトークンの埋め込みベクトルに組み込みます。RoPEは、長い文脈でのトークン間の相対的な位置関係を保持するのに優れており、モデルが長いシーケンスを効果的に処理できるようにします。

RoPE やその他手法については、以下でもまとめています。

https://qiita.com/kernelian/items/adc647204e0922d71c83

#### Multi-Head Attention / Multi-Query Attention / Grouped-Query Attention 

この 3 つに関しては、以下で違いについてまとめています。

https://qiita.com/kernelian/items/9a61f3957ccd9155ee4e


### Granite Code Models の特徴的なタスク

#### Fill-In-the-Middle (FIM)

Fill-In-the-Middle (FIM) は、テキスト生成タスクにおいて、テキストの一部が欠落している状態でその部分を補完するようにモデルを訓練する手法です。具体的には、与えられたプレフィックス（前文）とサフィックス（後文）の間に挿入されるべきテキストを予測するタスクです。これにより、コードや自然言語のテキスト補完能力が向上し、コードのインフィリング（中間補完）や部分的な修正タスクに強みを持つモデルが構築されます。FIMタスクは、モデルが文脈を理解し、適切にテキストを生成する能力を強化するため、コード補完や自動生成のシナリオで有用です。

### Granite Code Models の性能

Granite Code Modelsは、多くのベンチマークで最先端の性能を示しており、他のオープンソースのコードLLMをしのぐ結果を出しています。HumanEvalPackやMBPP、RepoBench、ReCodeなどのベンチマークにおいて、高いコード生成能力やコード修正、説明能力を証明しています。特に、Granite-8B-Code-Baseモデルは、他の大規模モデルと比較しても優れた性能を発揮しており、コストと性能のバランスが取れたモデルです。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  他モデルとの性能比較\n(出典：Granite Code Models: A Family of Open Foundation Models for Code Intelligence)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/3f974525-266b-c9af-5327-00eecee7d00b.png>
@enduml
```


```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  HumanEval のスコア\n(出典：Granite Code Models: A Family of Open Foundation Models for Code Intelligence)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/3240bbf0-b311-52dd-57e6-2175442a6d40.png>
@enduml
```
今年のGoogle I/O 2024で発表されたAndroidおよびFirebase関連の新機能やアップデート情報まとめ

## Android関連の新機能とアップデート
### Android開発ツール
1. Geminiの統合
   - コード提案とクラッシュレポート分析のためのAIモデル「Gemini」をAndroid Studioに統合。最新のAI機能を利用し、プロジェクトに特化したコード生成が可能に。
2. リリースモニタリング
   - Firebase Crashlyticsを利用し、最新のアプリリリースの安定性や重要なメトリクスを確認可能なダッシュボードを提供。
3. Androidデバイスストリーミング
   - Googleのデータセンターにホスティングされている最新のデバイス（Pixel 8, Pixel Foldなど）でアプリをリモートテストできる機能を提供。
### Android Studio Koala（プレビューバージョン）
1. USBケーブル速度検出
   - 接続されたデバイスとUSBケーブルの帯域幅を検出し、速度の不一致を警告。
2. インテリジェントサインイン
   - 複数のGoogleサービス（Firebase, Google Playなど）に一度の認証でアクセス可能。
3. デバイスUI設定ショートカット
   - ダークテーマ、フォントサイズ、アプリ言語などを簡単に設定できるショートカットを追加。
4. プロファイラーの高速化
   - プロファイリングタスクが最大60％高速化、主要なプロファイリングタスクへ迅速にアクセス可能。
5. Wear OSの新機能
   - タイルのプレビューや、健康関連センサの合成データ生成のサポートを追加。
### Jetpack Compose
1. Composeグランスウィジェットのプレビュー
   - IDE内でのComposeグランスウィジェットのプレビューをサポート。
詳しい情報はこちらをご覧ください: [Google I/O 2024: What’s new in Android Development Tools](https://android-developers.googleblog.com/2024/05/google-io-2024-whats-new-in-android-development-tools.html)
## Firebase関連の新機能とアップデート
1. Firebase Data Connect
   - PostgreSQLを利用可能にする新機能。強く型付けされたSDK、APIサーバ、データベースを自動生成し、データ駆動型アプリの構築を支援。
2. Firebase Genkit
   - AI統合フレームワークとして、強力なAIモデルやツールを利用できるプラグインを提供。
3. Vertex AI for Firebase SDKs
   - Vertex AIのGemini APIへのアクセスを簡素化。Kotlin, Swift, Dart, JavaScriptのSDKを提供。
4. 新世代のFirebase App Hosting
   - フレームワーク対応のサーバレスWebホスティングソリューション。AngularやNextJSなどをサポート。
5. リモートコンフィグ機能
   - 新機能ロールアウトとリアルタイムの監視ダッシュボードを提供。変更の影響を簡単に評価。
6. CrashlyticsにおけるAI支援
   - AIを利用してクラッシュレポートを分析し、迅速に修正可能な情報を提供。

詳細はこちらをご覧ください:
- [What's new in Firebase at I/O 2024](https://firebase.blog/posts/2024/05/whats-new-at-google-io)
- [What's new in Firebase at I/O '24 - Google Developers Blog](https://developers.googleblog.com/en/whats-new-in-firebase-io-24/)
Microsoft Teams(new)に切り替えたとき、組織切り替えができない

# はじめに
Teamsの切り替え時に組織表示について不具合が起こり、調べる羽目になったので
備忘録として記事を作成します。

# トラブル概要
従来のTeams(Microsoft Teams Classic)か新しいTeams(Microsoft Teams New)に切り替えた際
従来では複数所属している組織名があり、切り替えができていたが
新しいほうにしたら組織名が表示されなくなってしまった。

# 調査前にやってみた内容
 - アカウントサインアウト、サインイン
 - Teamsアプリの再起動
 - Windows再起動
 →いずれも解決には至らず。

 # 解決した対処法
 > %LOCALAPPDATA%\Microsoft\IdentityCache
 
 上記パスのフォルダを削除し、Teamsクライアントアプリを再起動したら
 組織名が表示、切り替えができました。

 [こちらに記載されてました](https://answers.microsoft.com/ja-jp/msteams/forum/all/%E6%96%B0%E3%81%97%E3%81%84teams%E3%81%AB%E5%A4%89/d11a00c9-496c-4d1e-82fb-8849bf2fd139)
Azure data factoryで利用されるIRの判別

# 背景
Azure data factoryのコピーアクティビティにおいてソース側のリンクサービスで指定しているリンクサービスと
シンク側で指定しているリンクサービスがことなっている場合に利用される統合IRについて認識がずれていたので一部予想も込みでまとめる。


# 利用される統合ランタイムの判別について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/ed6ea68c-588b-b6a7-c9ce-def4f4e0f2de.png)
一つのアクティビティで複数のデータセット(リンクサービス)を利用される場合に統合ランタイムの競合が起きる。
その際に利用されるIRは1つとなり、判別方法としてはSHRI＞マネージドVNET IR＞Azure IRの順となる。

https://learn.microsoft.com/ja-jp/azure/data-factory/concepts-integration-runtime#determining-which-ir-to-use

コピーアクティビティの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/d6e7e299-6a74-ec72-23ec-3b00857bfb27.png)
https://learn.microsoft.com/ja-jp/azure/data-factory/concepts-integration-runtime#copy-activity

データフローの場合もデータフローのなかで利用されるリンクサービスが利用するIRのなかからSHRI＞マネージドVNET IR＞Azure IRの順にパイプライン上のアクティビティ側の設定で利用するIRを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/d819f432-234b-3aa5-834b-bdc072c07a5a.png)

https://learn.microsoft.com/ja-jp/azure/data-factory/concepts-integration-runtime#data-flow-activity
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/9e356143-4494-e59a-7a61-5a1cbdde341c.png)

上記の仕様のため、マネージドVNET IRを利用したい場合は、ソースとシンクともにマネージドプライベートエンドポイントの承認設定をする必要がある。

但しCDCコネクタを利用したSAPからの連携の際はソースとシンクで利用される統合ランタイムが分離される。
SAP→ステージングのディレクトリ：SHIR
ステージングのディレクトリ→シンク先：Azure IR
UniRx入門②(IReadOnlyReactivePropertyとLINQ)

# はじめに
前回は、スペースキーを押したら回数をカウントするシステムを作成しました。
今回は、IReadOnly というものを作成し、ReactivePropertyを少し改良します。
(動けばいいだけなら、重要ではないかもしれません。)

# IReadOnlyReactivePropertyについて
前回のコードでは、他のプログラム(クラス)でもReactivePropertyの値を変更することができました。しかし、スペースキーの入力を検知するプログラム以外で、値を変更できる状態だと問題が起こるかもしれません。そのため、外部から値を参照することはできるが、代入できないプログラムに変更します。

~~~c#:SpaceSystem.cs
    //ReactiveProperty<型(int, float,stringなど)を宣言>
    //今回は回数を数えたいのでint型
    //new ReactiveProperty<int>(),にある()に初期値を代入できる(今回は初期値0を代入)。

    //publicをprivateに変更＜今回の変更点＞
    private ReactiveProperty<int> spaceCount = new ReactiveProperty<int>(0);

    //下のコードを追加、内容はコメントアウト部分と同じ＜今回の変更点＞
    public IReadOnlyReactiveProperty<int> SpaceCount => spaceCount;
    /*
    public ReactiveProperty<int> SpaceCount
    {
        get { return spaceCount; }
        private set { spaceCount = value; }
    }*/


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //ReactivePropertyを使う際には変数名.Value(_spaceCount.Value)を用いる
            spaceCount.Value++;
        }
    }
~~~
~~~c#:SpacePresenter.cs
public class SpacePresenter : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI spaceCountText;
    [SerializeField] private SpaceSystem spaceSystem;

    private void Start()
    {
        //SpaceSystemのSpaceCountの数字が変化した時にSubscribe以下(textの変更)を実装する。
        //spaceSystem.spaceCountをspaceSystem.SpaceCountに変更する<今回の変更>
        spaceSystem.SpaceCount.Subscribe(x => spaceCountText.text = $"{x}Click").AddTo(this);
    }
}
~~~

これによって、SpacePresenterがクリックの回数を変更できなくなりました。

# public,readonly,privateのイメージ
　privateのイメージ
 - GoogleDocumentが共有されていない(URLがわからない)

 　readonlyのイメージ
 - GoogleDocumentが共有されており、見ることが可能
 - GoogleDocumentが閲覧のみになっており、文字や値を変更できない

 　publicのイメージ
 - GoogleDocumentが共有されており、見ることが可能
 - GoogleDOcumentが編集可能になっており、文字や値を変更できる

# LINQについて
今回は、SpaceCountの最大値を決定し、それ以降カウントされないようにします。
そのためにLINQのWhereというものを使います。
Whereは()内の条件を満たす場合のみを通過し、条件を満たさない場合はWhere以降の処理は実行されません。
~~~c#:SpacePresenter.cs
public class SpacePresenter : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI spaceCountText;
    [SerializeField] private SpaceSystem spaceSystem;
    //＜今回の追加＞
    [SerializeField] private int maxCount = 30;
    private void Start()
    {
        //SpaceSystemのSpaceCountの数字が変化した時にSubscribe以下(textの変更)を実装する。
        spaceSystem
            .SpaceCount
            //xはspaceCountである<今回の追加>
            //xがmaxCount以下ならSubscribeする.xがmaxCountより大きいならSubscribeされない。
            .Where(x => x <= maxCount)
            .Subscribe(x => spaceCountText.text = $"{x}Click").AddTo(this);
        
    }

}
~~~

この実装によって、カウントがmaxCountより大きくならなかった場合は成功です。
LINQはWhere以外にもSelect,Any,ToArrayなど様々なものがあるので、用途に応じて使い分けてください。

# 最後に
readonlyは基本的にはpublicで公開せずに、readonlyで読み取り専用として実装した方が良いと個人的には思います。UniRxはWhereとToArrayをよく使う気がします。
withcolumn(s)を使用してDataFrameには存在するがテーブルには存在しない列を追加する

withcolumnを利用してDataFrameには存在するがテーブルには存在しない列を追加する場合はwrite.optionで("mergeSchema", "true")が必要。
```python
from pyspark.sql.functions import *

# cloumn1~cloumn3を追加しそれぞれに固定値を入れる
df=spark.table(table)
df = df.withColumns({"cloumn1": current_timestamp(),"column2" : current_date(),"cloumn3":lit("0")})

# DFの内容をテーブルへ上書き
df.write.option("mergeSchema", "true").mode("overwrite").saveAsTable(table)
```

option指定しない場合は以下のようなエラーがでる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/aff84cc8-99a8-1646-0234-c739184d0167.png)


--240530追記
追加列の型指定の方法
追加する値の末尾に.cast("型")を入れる

```python
from pyspark.sql.functions import *

# cloumn1~cloumn3を追加しそれぞれに固定値を入れる
df=spark.table(table)
df = df.withColumns({"cloumn1": current_timestamp().cast("timestamp"),"column2" : current_date(),"cloumn3":lit("0").cast("string")})

# DFの内容をテーブルへ上書き
df.write.option("mergeSchema", "true").mode("overwrite").saveAsTable(table)
```
robloxでassistant その49

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
RemoteEventを使え。

# 手順

- workspaceに、partを追加。
- partに、clickdetectorを追加。
- ReplicatedFirstに、localscriptを追加。
- スクリプトを書く。
```
print("ok2")


local workspace = game.Workspace
local part = workspace:WaitForChild("Part")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Remote = ReplicatedStorage:WaitForChild("RemoteEvent")
local clickdetector = part:WaitForChild("ClickDetector")
clickdetector.MouseClick:Connect(function(player)
	print("clicked")
	if Remote then
		print("fire")
		Remote:FireServer()
	end
end)

```
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```
print("ok0")

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Remote = Instance.new("RemoteEvent", ReplicatedStorage)
Remote.OnServerEvent:Connect(function()
	print("fire server ok")
end)

game.Players.PlayerAdded:Connect(function(player)
	print("入った")
end)

game.Players.PlayerRemoving:Connect(function(player)
	print("出た")
end)

```

# 実行結果

```
08:51:52.673  ok0  -  サーバー - setup:2
  08:51:53.034  入った  -  サーバー - setup:11
  08:51:53.355  ok2  -  クライアント - LocalScript:1
  08:51:59.415  clicked  -  クライアント - LocalScript:10
  08:51:59.415  fire  -  クライアント - LocalScript:12
  08:51:59.441  fire server ok  -  サーバー - setup:7
  08:52:03.628  出た  -  サーバー - setup:15
```

以上。