OmniAICreator/Qiita-1.07M huggingface dataset:
Visual C#でODP.NETによるオラクルデータベース情報を取得し、gridviewへの表示してみた！

# 概要
　Visual C#でODP.NETによるオラクルデータベースのテーブル情報を取得し、gridviewへ表示する実装について学習しました。その内容について紹介します。:relaxed:

## 目次
1.動作環境
2.環境準備
3.Visual C#起動、コードの入力
4.動作結果

## 1.動作環境
 動作環境は以下の通りです。
-Visual Studio 2022 - Community 2022
-Oracle Database21c for Microsoft Windows x64

## 2.環境(事前準備)
　事前準備として、以下を実施します。
-Visual Studio 2022 - Community 2022インストール
 インストーラは次から取得しました。デフォルトでインストールします。
 [Visual Studio 2022 IDE - ソフトウェア開発者向けプログラミング ツール](https://visualstudio.microsoft.com/ja/vs/)
-Oracleデータベース
　オラクルデータベースのインストールから、テーブル作成まで行います。
 [【Oracleデータベース】Windowsでインストールからテーブル作成まで](https://qiita.com/YouKnow/items/1d5b695629af75465dcd)

## 3.Visual C#起動、コードの入力
以下、Visual C#を起動した上で行います。
ODP.NETインストールをインストールします。

-ODP.NETインストール
 [ODP.NETをNuGetからインストールする](https://skill-note.net/post-692/)

 
 DAOUtil.csクラスを生成し、以下のコードを入力します。
<!-- DAOUtil.cs -->
<details><summary>DAOUtil.cs</summary>

```c#
using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    internal class DAOUtil
    {

        public DataSet getTable1()
        {
            string conString = "User Id=user1; password=user1;" +

            //EZ Connect Format is [hostname]:[port]/[service_name]
            //Examine working TNSNAMES.ORA entries to find these values
            "Data Source=localhost:1521/orclpdb; Pooling=false;";

            //Create a connection to Oracle

            OracleConnection con = new OracleConnection();
            con.ConnectionString = conString;
            con.Open();

            OracleDataAdapter da = new OracleDataAdapter("select * from table1", con);

            // データセットの作成
            DataSet ds = new DataSet();
            // データをデータセットにフィル
            da.Fill(ds);

            con.Close();

            return ds;
        }
    }

}
```
</details>

次にForm1.csにボタンを追加し、ボタン押下時の処理として以下のコードを入力します。
<!-- Form1.cs -->
<details><summary>Form1.cs</summary>

```c#
        private void button1_Click(object sender, EventArgs e)
        {
            // データセットの作成
            DAOUtil dao = new DAOUtil();
            DataSet ds = dao.getTable1();

            // データセット内のデータを表示
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                Console.WriteLine(string.Join(", ", row.ItemArray));
                //行の追加
                dataGridView1.Rows.Add(row.ItemArray[0], row.ItemArray[1], row.ItemArray[2]);
            }
        }
```
</details>



## 4.動作結果

「DAO利用の検索」ボタンを押すと、gridviewにデータベースのデータが表示追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968419/3ea44315-1a6c-ca30-9379-42e7bf21a3b6.png)

:::note info
データベースの内容を一致していることを確認
:::
オラクルデータベースにA5:SQL Mk-2ツールで接続し、table1テーブルを表示しました。gridviewに表示された内容と一致していることを確認できました。:grin:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968419/5e4bb6ee-2b15-5c26-d9d4-39f5833e07e5.png)
Cognito の Managed Login と ALB を連携して、日本語を表示する

# はじめに

[前回の記事でALB と Cognito Managed Login を連携できることを確認](https://qiita.com/sugimount-a/items/9ea49664e360e0370ae9)しました。今回の記事では、この ALB と Managed Login を連携している状況で、日本語を表示する方法を紹介します。

以下の画像のように、デフォルトの画面を日本語で表示が可能です。

![image-20241223145150977.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1f68f488-d1f1-ba61-6337-07df9da07bcd.png)





# Managed Login で日本語の表示方法

Managed Login はデフォルトで英語となっており、日本語が得意な方にはちょっと不便です。言語の指定方法が、以下の Document で紹介されており、URL パラメーターに `lang=ja` を追加すると日本語が表示されるようになります。

https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-managed-login.html#managed-login-localization



これを ALB と Managed Login を連携している場合でも指定が可能です。ALB の詳細画面をひらき、リスターの Edit rule を押します。

![image-20241223145708089.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c2ac325b-f5de-80df-e772-11fd538d06bf.png)



対象の rule を選択肢、Edit rule を押します。

![image-20241223145727507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9a590cba-b679-1f7c-b494-161ee6c8fc18.png)



Extra request parameters で `lang` と `ja` を指定することで、Managed Login へ表示言語を日本語に指定可能です。

![image-20241222112704176.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e98ffaea-9160-415a-1c87-73b9eaf5abab.png)
オフラインインタビューからのレポート作成の苦痛をChatGPTで取り除くお話

# 最初にまとめ

1. 音声ファイルをCLOVA Noteに読み込ませる
1. CLOVA Note上で話者の確認と設定のみをする
1. CLOVA Noteからテキストデータを落としてくる
1. ChatGPTにテキストファイルを読み込ませて情報整理の指示をする
1. 出てきた情報に基づいてレポートを自身で書く

:::note warn
CLOVA Note は、後継の LINE WORKS AiNote が正式リリースされています。
https://note.com/clova_note/n/na3e61faee72d
:::

# オフライン音声からのレポート作成はツラい

写真撮影や、アプリやサービスの操作状況の確認等を伴うユーザーインタビューの際は、オフラインで実施されることが多いと思います。

オンラインであれば tl;dv を入れると、そこそこ快適な体験を得られます。しかし、オフラインのものはいろいろ試しましたが、なかなか良い結果を得られず、真面目にテープ起こし等をして消耗するため、ユーザーインタビュー自体、気が重いということが発生していました😭

この方法をするようになってから、かなり気が楽になりましたので、今回のアドベントカレンダーではそのやりかたのお裾分けです。

# 録音はどのデバイスで行うのか？

ボイスレコーダーやフィールドレコーダーみたいなものを使うこともありますが、この方法では比較的スマホの録音機能でも上手くいきます。

ハードを特殊なものにしてしまうと、当日そのデバイスを忘れた時に絶望してしまうので、スマホの録音機能でもあまり困らないは、それだけでも嬉しいですよね。

# どの文字起こしツールを使うのか？

:::note warn
CLOVA Note にアップした音声は、学習に使われるので要注意です。
:::

文字起こしツールの時点でいろいろなツールがあると思います。いろいろ観点はあると思いますが、アップロードした音声や出力されるテキストが、そのサービスの学習に使われるか？使われないか？は大きな判断軸となると思います。今回の CLOVA Note に関して言うと「使われるタイプ」ですので、ご注意ください。

それが許容できる状況では CLOVA Note を気に入って使っています。

CLOVA Note は、アップした音声をテキストに起こしてくれるのですが、その音声とテキストを同期して編集しやすいようにしてくれています。つまり音声を再生しているときに、どのテキストに対応しているかが分かりやすい表示になっています。逆にこのテキストのところから音声を再生して欲しい場合は、テキストを選択すると、そのテキストの箇所から音声が再生されるという仕組みです。

ただ、この昨日だけであれば別にいろいろなサービスが似たようなインターフェイスを採用しているので、CLOVA Note を選択する強みにはなりません。

僕が CLOVA Note で、一番気に入っているのは、このサービス側でテキストと一緒に連動する **音声がとても聞き取りやすい** というところです。

他のサービスでも聞き取りやすくなるように、音声をアップロードする前にいろいろ処理してみたりしたのですが、圧縮されてしまったり、ボリュームが調整されてしまったりして、なかなかストレスなく、気持ちよく聞けるというものがなく、その意味では CLOVA Note はベストでした。

# CLOVA Noteでどんな操作をするのか？

話者の設定のみをします。

各区切りごとに、話している人に対して「話者1」「話者2」「話者3」みたいな風にラベルが付けられます。2人で話している会話に対しては、80点ぐらいの精度で「話者1」と「話者2」が話しているというラベルがつきます。しかし、たまに声色がかわったりすると「話者1」の人が話している箇所でも「話者3」や「話者4」が設定されたりもします。

これを「〇〇さん」「△△さん」というラベルに直していきつつ、話している範囲に関して若干調整します。

**この際、自動生成でのテキストは、多少間違っていても基本的には直さず、ほぼノータッチで大丈夫です。**

話者の設定ができたところで、テキストファイルをダウンロードします。

# ChatGPTでどんな操作をするのか？

直近で僕がこの作業をした際には **GPT-4o** を使いました。

先ほどのテキストファイルを添付し、下記のプロンプトを打ちます。

```
添付したファイルはインタビュー音声を文字に変換したテキストファイルです。

このテキストファイルを以下の4点に分けて、内容をまとめてください。

① トピック1
② トピック2
③ トピック3
④ トピック4
```

あんまり、変な裏技的なプロンプトを入れなくてもみたいな、比較的高精度に情報がまとめられて出てくると思います。（あんなに聞き取り間違いとかあったのに！）

この情報がまとまった状態で、あらためて音声を聞きながらレポートに起こすと、するする書けることが多いです。

# なぜこれをしてもらうと楽なのか？

人の会話は、あとから聞いてみると思っていたよりも断片的で、とびとびに話していることが多いです。この断片的でとびとびな情報を、理路整然としたものにまとめるのは負荷が高いようです。

また人が話したことを完全に一字一句起こすのは、それが納品物で無い限り、賽の河原感が出てしまい、これもツラいです。

この2点に関してChatGPTに任せてしまって、大体合格点みたいな水準のものが出てくるだけでも、僕としてはかなりの負荷が軽減できます。

おかげで、オフラインインタビューからのレポート作成に対して、嫌な意識がかなり減りました。

自分がインタビュアーではなく、他の人が話して録音したものでも有効なので、困っている方、お試しください。

---

# おまけ

自身で書いたテキストに関しては wordrabbit という文章校正ツールを愛用しています。自分で書いた文章を自分でチェックするというのも骨が折れる作業ですが、このツールを使うと比較的気楽にチェックできます。こちらも併せてお試しください！

https://wordrabbit.jp/
フォーム一体型LPでのマイクロコンバージョン計測（GoogleTagManager）

# フォーム一体型LP
こんにちは、所属企業で広告運用を担当している鈴木です。

前回、「サンクスページがない場合のフォーム送信CVの計測方法」について投稿したのですが、
今回は、フォーム入力ページがない(＝フォーム一体型LP)場合のマイクロCV計測について考えます。

フォーム一体型LPの場合、LP→送信完了となるため、フォームページのURLを条件とした計測を行うことができません。

このようなケースでマイクロCVを計測するためにはどのような設定・対応を行うべきか、書いていきたいと思います。

## 対応はGoogleタグマネージャーで
![スクリーンショット 2024-12-10 153502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/18b56a9b-9b80-ba28-b6ea-7cbc24c38144.png)
今回のケースへの対応も、Googleタグマネージャーの機能を使うことがおすすめです。

タグマネージャーのトリガーには、「スクロール距離」を条件としたものがあり、
割合やピクセル数を設定し、フォームの位置までのスクロールをタグ発火の条件とすることができます。

縦に長いフォーム一体型LPでのマイクロCVは、この計測方法が有効的です。

### まとめ
フォーム一体型LPでは、各部にフォームへのアンカーリンクが設置されていることも多いので、
スクロールに加えてこちらも計測することで、より精度を高めることができると思います。

また、LPによってマイクロCVに対する考え方も異なってくると思うので、適切な計測方法を探り、実施してみてください。

以上、鈴木でした。
Organizationsにおすすめ！AWS Shield Advancedのメリット

DDoS保護に、AWS Shield Standard + WAF を利用している方がほとんどではないでしょうか？
今回、**AWS Shield Advanced  + WAF** を検討した結果、分かったことをまとめてみました。

## AWS Shield なんのためのサービス？
マネージド型で、AWS で実行しているアプリケーションを DDoS 保護するサービスです。
[https://aws.amazon.com/jp/shield/:title]

## 何がAdvanced？
Advancedにすると何が嬉しいのか、Standardとの違いを表にしてみました。
![clip-20241016200304 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928711/e850bd8c-b467-411d-cab1-94100c123fff.png)


【ポイント】

* L7も保護レイヤーに追加される（後ほど詳しく）
* DDoS攻撃を受けた際のコスト還元を受けられる
* 専門家によるサポートあり

## 注意点は？
下記３つ

* コミットメント: 12 か月間のサブスクリプションが必須
* 自動更新: サブスクリプションは 12 か月後に自動更新される。ただし、更新日の 30 日前までに更新をオプトアウトできる。
* 解約方法は、サポートに電話のみ

## WAFとShield Advanced 
L7のDDoS攻撃対策AWS WAF。
Advancedが保護対象としているL7のDDoS対策は、AWS WAF のレートベースのルールを利用します。
特定の条件に一致したリクエストだけを Block/Count 対象とする場合、

1. WAF側でルールを作成
2. Shield Advanced でルールとリソースを関連づける

という手順を踏むことでL7の保護を可能にしています。
つまり、AdvancedはWAFと統合することで、より便利な機能になるということです。

## 料金体系
Organizaions単位では、月額＄3000が発生します。** ※アカウント単位ではないことに注意 **

アカウント単位で発生する費用は２つ「WAFのパートナールールの費用」「データ転送量課金」です。
Shield Advancedの保護対象になっているリソースにWAFが統合されている場合は、WAFの基本料金が発生しません。Shield Advancedの料金のみになります。
WAFの基本料金は以下の3つです。
![clip-20241016214414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928711/a8b8476f-d089-74ef-2da9-1c9a79dbb96b.png)

ただし料金が発生しないのは上記基本料金のみのため、その他オプションを設定している場合は、引き続き料金が発生します。詳しくは公式サイトをご確認ください。

![clip-20241016201335 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928711/4aa9f168-86b6-51af-5e56-be3084d1236c.png)


![clip-20241016201401 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928711/546789de-853b-a1cf-5548-8f6585fed18d.png)


[引用：aws-black-belt資料](https://www.slideshare.net/slideshow/20200818-aws-black-belt-online-seminar-aws-shield-advanced/238050558#74)

※参考URL：  
https://aws.amazon.com/jp/shield/pricing/  
https://aws.amazon.com/jp/waf/pricing/

## 最後に
「Shield Adcvancedって、料金めっちゃ高いよなー」という印象が強く、選択肢にいれないことが多いとは思います。（筆者がそうでした）

しかし、$3000/月のAdvancedサブスク料金は、Organizations単位で発生します。Organizationsを活用して複数アカウント管理をしている企業では、むしろ、Advancedを活用したほうが全体としては安くなることも十分あり得ると思います。これを機にぜひ「自社はどうなんだっけ？」などの見直しを行ってみてください。
derivedStateOf を使ってrecomposeを避ける

この記事はand factory.inc Advent Calendar 2024 24日目の記事です。

https://qiita.com/advent-calendar/2024/andfactory

はじめに
----
- Composeで実装する際に recompose を防ぐために derivedStateOf を使う場合がありますが使う場面がよく分かっていなかったので調べてみました
- derivedStateOf の公式の説明（わかるようでわからない...）
  >Compose では、監視対象の状態オブジェクトまたは構成可能な入力が変化するたびに再構成が行われます。状態オブジェクトまたは入力は、UI が実際に更新する必要があるよりも頻繁に変更される可能性があり、不要な再構成につながります。これは、スクロール位置など、何かが頻繁に変更されるものの、コンポーザブルがそれに反応する必要があるのは、特定のしきい値を超えたときderivedStateOfだけである場合によく発生します。必要な分だけ更新される、監視可能な新しい Compose 状態オブジェクトを作成します。このように、これは Kotlin Flows distinctUntilChanged() 演算子と同様に動作します。

- 公式のサンプルコードを参考にして確認していきます

サンプルコード
---
- [公式](https://developer.android.com/develop/ui/compose/performance/bestpractices?hl=ja#use-derivedstateof)を参考に動かすコードを用意しました。まずは、derivedStateOf を使わないパターンです。

```kotlin:Test.kt
@Composable
fun Test() {
    val listState = rememberLazyListState()

    LazyColumn(state = listState, modifier = Modifier.fillMaxSize()) {
        items(List(20) { it }) {
            Text(text = "Item $it", modifier = Modifier.height(100.dp))
        }
    }
    // reComposeが発生する
    val showButton = listState.firstVisibleItemIndex > 0

    AnimatedVisibility(visible = showButton) {
        ScrollToTopButton()
    }
}

@Composable
fun ScrollToTopButton() {
    FloatingActionButton(
        onClick = {},
        shape = RoundedCornerShape(16.dp),
        backgroundColor = Color.Red,
    ) {
        Icon(
            imageVector = Icons.Filled.Person,
            contentDescription = null,
        )
    }
}
```

- スクロール時に画面左上に赤いボタンを表示します。showButton というフラグで 赤いボタンの表示・非表示を切り替えています

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36517/69d5f177-1485-b7f5-6b10-0246dca8f9cf.gif">

- Layout Inspector で recompose を確認します。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36517/906fa453-4a8d-3e7a-a92b-4fe600ab0211.png">


- スクロールのたびに listState.firstVisibleItemIndex という LazyColmnで表示される最初の項目のインデックスが更新されます。 firstVisibleItemIndexが変更される度にshowButtonの更新が発生して、Testコンポーザブルに recompose が発生しています。
  - コンポーザブル内で 更新される値を使ったコードがあると recompose が発生するようです。
  - LazyColumn  は recomposeを 7回 skip しているようでした :eyes: LazyColumn 自体がスクロール時に再描画されると思うので、スクロールすると recompose が起きそうですが、そうではないようです。

derivedStateOf を使うよう修正
---

``` diff_kotlin
-    // reComposeが発生する
-    val showButton = listState.firstVisibleItemIndex > 0
+    val showButton by remember {
+        derivedStateOf {
+            listState.firstVisibleItemIndex > 0
+        }
+    }
```

- Testコンポーザブルの recompose が減ったことを確認できました。（LazyColumn の recomposeスキップ数も減っています）
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36517/6b7d0e61-0e33-cf1e-db23-f4b499a6bf02.png">

- 今回のようなスクロール毎に変更される値を適切な頻度で他の値に変換する目的に derivedStateOf を使うと良さそうです。

まとめ
----
- 早すぎた最適化は避けるという前提にはあると思いますが、recompose数の計測と避ける実装を知っておき適切なタイミングで活かせたらと考えています。

参考
----
- https://developer.android.com/develop/ui/compose/performance/bestpractices?hl=ja#use-derivedstateof
- https://developer.android.com/develop/ui/compose/tooling/layout-inspector?hl=ja
- https://qiita.com/Nabe1216/items/0fad08e8559bd3095753
番外編　環境構築をしてみよう

本シリーズではgoogle colabという便利ツールを使っていたので環境構築が不要でしたが、通常プログラミングをするには、各自のパソコンにそのための環境を構築する必要があります。
往々にしてとても面倒なので、本シリーズでは環境構築から逃げてきたのですが、いつかは必要になるので一度向き合っておきましょう。

環境構築をするメリットはいくつかありますが、例えば、各自のパソコン（ローカル）にプログラミング環境があれば、ネットワークに接続しなくてもプログラミングをすることができます。



## Linux
パソコンにはWindosだったりMacだったりといったOSが入っています。その一種にLinuxというものがあります。WidowsやMacにもLinuxを入れることができ、開発の場などでよく使われています。WindowsユーザーはLinuxを利用した方が便利そうです。

例えば以下のサイトが参考になりそうです。
1つのサイトではうまくいかないことも多いので、調べながらやってみてください。chatGPTも役に立ちそうです。

https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/

https://youtu.be/IDIDa8HKOW4?si=HspsTRTrbAnRc9jz

### Macでの環境構築
僕はMacを利用しています。
WindowユーザーがLinuxをよく使う理由は、windowsのターミナルが使いにくいからかなと思うのですが、MacのターミナルはLinuxと同じように使えるので、特にLinuxを入れたりはしていません。チームメンバーが環境を揃えるべき状況ならLinuxを入れたほうがいいかもしれません。

## ターミナル
ターミナルを使えば、パソコンに直接コマンドを送って操作することができます。普段のファイル操作は、フォルダをダブルクリックして移動していますが、ターミナルでは
~~~
cd "フォルダ名"
~~~
というコマンドで移動します。
最初はコマンド操作が難しく見えるかもしれませんが、このように素朴な操作で済むのがむしろ便利だったりします。

プログラミングも、通常はターミナルで実行します。

https://qiita.com/ryouzi/items/f9dee1540a04a0bfb9a3

## ローカル環境でプログラミング
google colabのようなweb上で動くツールに対して、各々のPC上でプログラミングできるような環境を構築することも可能です。

https://prog-8.com/docs/python-env

### C++
本シリーズではプログラミング言語としてpythonを採用しましたが、他にも例えばC++という言語も人気です。特に研究や競技プログラミングの場でよく使われるイメージです。pythonは便利なのですが、C++の処理速度の方が上なので、重い計算を行う際にはC++に軍配が上がります。

https://qiita.com/EvtHorizonCoder/items/145724e16c1b57ab64eb

## エディタ
エディタとはプログラミングコードを書く場所のことです。メモ帳に書いてもいいのですが、コードの色分けを行なってくれたりといろいろ便利なので、何かしら便利なエディタを使うのが実質必須です。
特にこだわりがなければ、1番人気のVisual Studio Codeというエディタを使っておけばOKです。ファイル操作も直感的だし、利用者が多いので拡張機能も豊富です。ターミナルも表示できるので、ウィンドウが無駄に増えません。

拡張機能を入れるとwindowsにインストールしたVSCode上でlinuxのファイルにアクセスできます。

https://qiita.com/zaburo/items/27b5b819fae2bde97a3b

## gnuplot
C++にはグラフを描くのに便利なライブラリが（多分）ありません。そこで、外部ツールであるgnuplotなどを利用することになります。インストールはとっても簡単です。

https://qiita.com/kkml_4220/items/fe2f4d91305cf1cdca96

## 詰まりやすいポイントメモ
### Ubuntuを立ち上げたらエラー出た
~~~
wsl.exe --update
~~~
を実行してみる

### Visual Studio Codeからubuntuにアクセス
- 拡張機能"wsl"を入れてからコマンドパレット(F1)で"wslでフォルダを開く" or "wslでウィンドウを開く"を実行
- ↑で行けそうだけど、うまくいかない時はlinuxにVSCodeを入れるしかないかも。その時はubuntuで
~~~
code
~~~
を実行するとインストールされる。



***
- 第0回　[はじめに](https://qiita.com/tau14/items/d6620cb24945d8e564c2)
- 第1回　[プログラミングをしてみよう](https://qiita.com/tau14/items/3d3086844c6eb9a05cca)
- 第2回　[if文、for文を使ってみよう](https://qiita.com/tau14/items/501abc293c5a93422c35)
- 第3回　[グラフを描いてみよう](https://qiita.com/tau14/items/68b92efe2bba7a6de5f1)
- 第4回　[物理の計算をしてみよう](https://qiita.com/tau14/items/3216260f786d49f807d4)
- 応用編　[関数（メソッド）を使ってみよう](https://qiita.com/tau14/items/6e875492afd3d5915ea0)
- 番外編　[環境構築をしてみよう](https://qiita.com/tau14/items/edc12e66548ad8c669f4)
SOAP APIのまとめ



+ [Platform API Basics](https://qiita.com/Keiji_otsubo/items/4cf6a7396ba545efc4be)
+ [Create an Account Using SOAP API and SoapUI](https://qiita.com/Keiji_otsubo/items/5269e47f9e5392beb0d5)


# Error :'HTTP/1.1 500 Server Error' 

+ [Error :'HTTP/1.1 500 Server Error' while connecting with Soap API](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JdgKjSAJ)

+ [SOAP API - ログイン中に HTTP/1.1 500 サーバー エラーが発生する](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KB1Mh0AL)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d304150f-34cb-f31c-f593-a51625e407fe.png)
Python初心者入門：基本文法

 基本文法と構文

 １コメント

#を付けることで、コメントとして扱うことができる。

２ 変数とデータ型
Pythonでは、変数の型を明示的に指定する必要はなく、自動的に判別されます。

整数型（int）
```
x = 10  # 整数
print(type(x))  # <class 'int'>
```
浮動小数点型（float）
```
y = 3.14  # 浮動小数点数
print(type(y))  # <class 'float'>
```
文字列型（str）
```
name = "Qiita"
print(name)  # Qiita
print(type(name))  # <class 'str'>
```
ブール型（bool）
```
is_python_fun = True
print(is_python_fun)  # True
print(type(is_python_fun))  # <class 'bool'>
```

３ データ構造の基本

リスト（List）
複数の値を格納順に保存することができる
```
fruits = ["apple", "banana", "cherry"]
print(fruits[0])  # apple
fruits.append("orange")  # リストに要素を追加
print(fruits)  # ['apple', 'banana', 'cherry', 'orange']
```
タプル（Tuple）
リストと似ていますが、リストと違って変更することができません。
```
coordinates = (10, 20)
print(coordinates[0])  # 10
```
辞書（Dictionary）
キーと値のペアでデータを格納している
```
person = {"name": "Alice", "age": 25}
print(person["name"])  # Alice
person["age"] = 26  # 値を更新
print(person)  # {'name': 'Alice', 'age': 26}
```


４ 演算子

算術演算子
```
x = 10
y = 3
print(x + y)  # 13
print(x - y)  # 7
print(x * y)  # 30
print(x / y)  # 3.333...
print(x // y)  # 3 （切り捨て）
print(x % y)  # 1 （余り）
print(x ** y)  # 1000 （べき乗）
```
比較演算子
```
x = 10
y = 3
print(x > y)  # True
print(x == y)  # False
print(x != y)  # True
```
論理演算子
```
x = 10
y = 3
a, b = True, False
print(a and b)  # False
print(a or b)  # True
print(not a)  # False
```
5 条件分岐
条件に応じて処理を分けるための構文です。
```
x = 10
if x > 5:
    print("xは5より大きい")
elif x == 5:
    print("xは5と等しい")
else:
    print("xは5より小さい")
```

6 ループ
繰り返し処理を実現します。

forループ
for文は処理がおわるまで続く
```
for i in range(5):  # 0から4まで繰り返す
    print(i)
```
whileループ
指定した条件をクリアして言うときだけ、繰り返す
```
count = 0
while count < 5:
    print(count)
    count += 1
```
以上がPythonの基礎のコードだと思います。
進路の悩み　就活vs大学院進学

## 大学院に行くか学部卒で就職するか

所属大学：MARCH理系 情報系学科　３年　
志望業界：Web系企業、Saas企業

何に悩んでいるか：そのまま就活を進めるか、大学院の進学を試みるか。

悩んだ経緯：
実際ITメガベンチャー３社の選考を受けてみて、不合格が続き今のままだと失敗すると感じた。
・楽天グループ　サマーインターンからの早期選考。最終選考まで進むが不合格。（１１月前半）
・sansan　コーディングテストで不合格
・freee　コーディングテスト通過後、一次面接で不合格。
まだ３社しか受けていないが学部卒でメガベンチャーを受けるのに現時点での技術力に限界を感じた。

背景：
大手web系企業のエンジニア職は院卒が大半だといわれている。（業務系インターン経験者が多い）
実際に楽天のインターンに参加したときもM1がほとんどであり、説明会の質疑応答でも院卒がほとんどだと答える企業が多かった（エンジニア職）
学部卒はゼロではないがポテンシャル採用なのでポテンシャル採用での勝負となる。
理系職はとりあえず院に行けという風潮がある。
企業側から見ても学部卒よりも院卒のほうが肩書から見て採用しやすいのかと思っている。

技術力の観点から、大手web系企業のエンジニア職に就くには現段階だと技術力が低いと感じており、院卒採用と比べて張り合えるほどの特出した技術力があるかといわれるとないと思っている。
であれば、エンジニア職の就職に有利な大学院進学に進路変更をして、かなり時間が空くので個人開発を進めたり、資格勉強をしたり、業務系インターンを経験したほうがＭ１で就活したときのアピール材料の濃さも変わってくると感じた。

しかし、大学院進学をすると考えるとしっかり自分の学びたいことや目的がはっきりしていないと挫折すると思っている。一応、今の大学の大学院で学びたい分野や研究室はある。
就活と大学院進学を平行して考えるというのもあったが、学部卒で一回受けた企業をＭ１で受けても通過率は低いと聞いた。なら大学院進学を決めたのであれば、学部卒で企業を受けないほうがいいのではと思った。

そもそもなぜ元から大学進学をせず学部卒で就活をしようと思ったのかというと、自身の情報系学科の院進学率が6割とほかの理系学科と比べて低かったり、院生より２年早く社会に出て技術力を磨いたほうがいいと思ったからである。実際勉強自体は嫌いではないが、開発>研究 が自分の中にあった。

しかし、ここで悩んでいる自分が少し就活から逃げているようにも自分で感じている。
まだ３社しか受けていないし、数が少ない。
やっぱり技術力云々より自身の言語化能力のほうが重大であり、これをどうにかしないとＭ１の就活でも苦労すると思っている。

現状、こういう課題がありあと数か月でどうにかなるかといわれると怪しいと思っている。大学院進学が自分の中で固まりつつある。準備期間が確保されるため。

不合格の原因：
・言語化不足
・説明力不足
・回答になっていない
・熱意がなかった（楽天）
・対策不足（楽天）
・技術力が不十分
総合的に見て、話すのが下手

アピール材料：
ボラティアサークルのイベント企画担当として存続危機を解決
楽天グループインターンでのチーム開発経験、チームリーダー経験
アルバイト先のシフト提出アプリの個人開発経験（進行中）
「Qiita と Zenn と note の違いを教えて下さい。」をAI先生に聞きました。回答省略。

(旧タイトル)「Qiita と Zenn の違いを教えて下さい。」をAI先生に聞きました。回答省略。


```
Qiita と Zenn と note の違いを教えて下さい。
```
```
比較表をMarkdown形式でお願いします。
```

# 参考

https://qiita.com/kannkyo/items/9ac82835c7590db57396

上記と同じでした。


# ChatGPT先生へ
>(回答省略)

| 項目      | Qiita | Zenn | note |
|-----------|-------|------|------|
| **主なテーマ** | プログラミング・技術情報 | 技術記事・技術書・メモ | クリエイティブ・ライフスタイル・ビジネス |
| **対象ユーザー** | エンジニア | エンジニア・技術書執筆者 | クリエイター・一般ユーザー |
| **投稿形式** | 記事 | 記事・技術書（Books）・スクラップ | 記事・音声・動画 |
| **マークダウン対応** | 〇 | 〇 | △（一部対応） |
| **GitHub連携** | × | 〇（Zenn CLI） | × |
| **ストック機能** | 〇（ストック） | 〇（スクラップ） | × |
| **リアクション** | いいね・ストック | LGTM（Like Good To Me） | スキ |
| **収益化** | × | 〇（有料記事・技術書販売） | 〇（有料記事・サブスク） |
| **企業向け機能** | 〇（Qiita Organization） | × | 〇（法人アカウント） |
| **主な用途** | 技術共有・ナレッジストック | 技術記事・技術書販売 | エッセイ・ブログ・コンテンツ販売 |




# 以下旧い＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

「Qiita と Zenn の違いを教えて下さい。」をAI先生に聞きました。回答省略。

# ChatGPT先生へ
>(回答省略)

比較表をお願いします。
>(回答省略)

ナレッジコミュニティを会員数の多い順に教えて下さい。
>(回答抜粋)
これらのコミュニティの会員数は、各企業やサービスの規模や人気度によって異なりますが、具体的な数値は一般的に公開されていないことが多いです。

# Gemini先生へ
>(回答省略)

＞QiitaとZennの比較がでました。
ナレッジコミュニティを会員数の多い順に教えて下さい。

>(回答抜粋)
明確な会員数データが公開されていない場合も多いです。
代表的なものをいくつか挙げ、それぞれの特徴や規模感について説明することで、ご質問にお答えする形とさせていただきます。...
>...
>2. 技術情報共有サイト
>..
>・Qiita:...
・Zenn:...
・Zenn:...

# copilot先生へ
未

# wikipedia

https://ja.wikipedia.org/wiki/Qiita

https://ja.wikipedia.org/wiki/Zenn

https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3

# 感想
・Qiitaは、エディタは、「権限がありません」がでる時があります。(2025-03-15)
・Qiitaは、エディタは、切り取り貼り付けの操作に緊張感があります。
・Qiitaは、エディタは、保存できない時がある。慣れが必要です。
・Qiitaは、クリックできない時がある。
・Qiitaは、エディタ操作中、突然画面の半分が白くなる。慣れてきた。
・Qiitaで、「エラーにより投稿できませんでした。何度も続く場合はサポートにお問い合わせください。」あきらめました。

(2025-04-12)
・Qiitaは、怪しいメッセージ。がでます。たぶんヘルプが無いと思います。
??? User xxxx はすでに存在します。



私は、Qiitaを、無料でつかわせていただいている事を忘れがちにります。
APIについて学ぶときに使用したおすすめUdemy.2

# この記事について

この記事では、私がUdemyを活用して学習した中で特に役立ったコースについてご紹介します。特に、API構築やNode.jsに興味がある方、短時間で実践的なスキルを身につけたい方に向けて、このコースの内容や感想をお伝えします。

# コース紹介：【初心者向け】初めてのNode.js入門。Expressフレームワークを用いた本格Webサーバー構築やJSONを学ぼう！

https://www.udemy.com/course/nodejs-express/?srsltid=AfmBOop2qD50md5Jur9K3oM4nzam8WogydEdmgYRJl8rzvS1UDt86TCm&couponCode=V2JPLETSLEARN

内容は
1.	環境のセットアップ：Node.jsや関連ツールのインストールから始め、学習をスムーズにスタートできるように導入部分の説明
2.	Node.jsの基本操作：Node.jsとは何かという基本概念から、実際に手を動かして学べる内容
3.	Webサーバー構築：Expressフレームワークを活用して、簡単なWebサーバーを構築する手順
4.	データ操作の基本：JSON形式のデータの取り扱いや、データの読み書きの初歩的な操作方法

このコースでは、環境のセットアップやNode.jsの使い方、基礎知識やWebサーバの構築などを学ぶことができます。フロントやバックエンドなどの意味や仕組み、データの書き込み読み込みなどの初歩から丁寧に解説されているため、初心者にも優しい内容となっています。講座全体の時間は2時間40分ほどと短いため、隙間時間などにも学びやすい内容だと思います。

# このコースを選んだ理由
過去に、**「時間がない！入門講座を見ても結局よくわからない！」** という状況で挫折してしまった経験が何度もありました。Node.jsについての基礎知識が曖昧なまま進めたことで、仕組みや用語の意味が理解できず、一度つまずくとそのまま立ち上がれずに時間を浪費してしまうことが多かったのです。

そんな中で、このコースは短時間で基礎を学べるという点が魅力的でした。「とにかく短時間で基本を身につけたい！」という気持ちが、私がこのコースを選んだ一番の理由です。
# 受講後の感想

APIについて学ぼうとする中で、さまざまな講座に手を出しては挫折するという状況が続いていました。Node.jsの基礎知識も乏しかったため、いきなり何か簡単なアプリを作るといった手順では、理解が追いつかず途中で投げ出してしまうことがほとんどでした。

この講座はそんな私にとって、Node.jsやAPIについて「概念や仕組みを理解するきっかけ」を与えてくれる内容でした。講座自体が短時間で完結しているため、わからない箇所があれば繰り返し受講することができ、最終的には3周することで全体の流れや操作がなんとなくつかめるようになりました。

その結果、次に進んだ講座でも、途中で止まることなく進めることができたと思います。この講座で学んだ基礎が、次の学びをスムーズにしてくれたと実感しています。

# このコースをおすすめする人

このコースは以下のような方に特におすすめです！
	•	Node.jsとは何か理解したい
	•	他のAPIやNode.jeの講座で挫折してしまった
	•	Webサーバー構築の手順を学びたい
	•	JavaScriptについてなんとなく知りたい


# まとめ

さまざまなコースを手当たり次第に学びながら、この講座を受講したことで、短時間で効率的に基礎を固めることができました。その結果、他のコースの内容も理解しやすくなり、躓くことが少なくなったと感じています。

初心者向けの内容であるため、アプリを1から構築するような本格的な開発には至りませんが、手を動かしながら仕組みを理解するための良いステップアップ講座だと思います。忙しい方や短時間で基礎を学びたい方にぜひおすすめです！

私は他の記事でもNode.jsやAPIを学ぶためのUdemy講座について紹介しています。そちらもおすすめです！

https://qiita.com/aoao1/items/81762f81b06fe835f7a0
[Proxmox VE] コンソールでコピペが使いたい！xterm.jsを用いてコンソールを使う方法

## はじめに
Proxmox VEの管理画面から仮想マシンのコンソールを開く際、デフォルトではブラウザ上からゲスト内へのコピー・ペーストはできません。長いコマンドをちまちま入力する、長いURLをミスタイプにおびえながら入力する、**コピペできればそんな思いをしなくていい！**
ということで、コンソールでコピペが実装できるように設定します。

## そもそもなぜコピペができないか？
コピペができないの理由は、Proxmoxのホストからコンソールを開く方法にあります。
Proxmoxは何種類かのコンソールを開く方法が用意されています。
代表的な3つの接続方法を調べてまとめてみました。

- **noVNC**
  - 概要
        - Webブラウザから実行できるVNCクライアント
    - 利点
        - デフォルトで有効
        - ある程度のことは事足りる
    - 欠点
        - 特殊なキーの組み合わせが有効ではない・コピペができない
        - 前のログをさかのぼることができない  


- **SPICE**
    - 概要
        - Simple Protocol for Independent Computing Environmentsの略
        - 仮想マシンを遠隔からコントロールするためのプロトコル
    - 利点
        - コンソールだけではなく、GUIも表示させることができる
        - ゲスト側の音声、ファイル転送、USBなどの周辺機器などもコントロールできる
    - 欠点
        - 接続するには、ユーザーのパソコンにSPICEクライアントを、ゲスト内にドライバーをインストールする必要がある
            （つまり、ProxmoxのWEB UIからは操作できない）

- **xterm.js**
    - 概要
        - xterm.jsというのは、そもそもJavaScriptでコンソールを描画するライブラリ
            Visual Studio Code・Hyperなどの有名なソフトウェアにも使用されている
        - サーバ上のbashと接続して、ブラウザからサーバ上のコマンドを叩けるようにする
    - 利点
        - 前のログをさかのぼることができる
        - コピペができる
    - 欠点
        - デフォルトで利用できないので、ゲストマシン上で設定する必要がある

Proxmoxの管理画面から、コピペができるコンソールを使用したいので、xterm.jsを導入することにしました。

## 環境
- ホスト: Proxmox VE 8.2.2
- ゲスト: Debian 12（cloud image）

## 導入方法
### シリアルコンソールを追加する
Proxmoxの管理画面から対象のゲストを選び、ハードウェアのタブからシリアルコンソールを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105516/9a55bde1-3ea4-7f81-2b41-289ec04503a1.png)

シリアルポートは0番に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105516/d7e01d38-b106-b9c7-7384-2c74e6fa9c22.png)

追加したらゲストを起動します。

### ブートローダの設定を書き換える
ブートローダ（GRUB）の設定を書き換えます。
`/etc/default/grubを開いて、下のように書き換えます。

```bash
$ sudo vi /etc/default/grub 
```

```diff_shell
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#    info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR='lsb_release -i -s 2> /dev/null | | echo Debian'
GRUB_CMDLINE_LINUX_DEFAULT=""
- GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0, 115200 earlyprintk=ttyS0, 115200 consoleblank=0"
- GRUB_TERMINAL="console serial"
+ GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200 consoleblank=0"
+ GRUB_TERMINAL="serial"
GRUB_SERIAL_COMMAND="serial -- speed=115200"
```

保存したら、ファイルに書いてあったように`sudo update-grub`を実行し、ゲストを停止します。

再度ゲストを起動して、xterm.jsからコンソールを開くとちゃんと表示されます。

## 参考文献
https://pve.proxmox.com/wiki/Serial_Terminal
https://pve.proxmox.com/wiki/VNC_Client_Access
第3回　グラフを描いてみよう

## グラフの描画
今回はpythonでグラフを描画してみます。だんだん楽しくなってきましたね。

まずは何も考えずに以下のコードを書き写してください。
~~~py
import matplotlib.pyplot as plt

x = [0, 2, 4]
y = [0, 4, 8]

plt.plot(x, y)
plt.show()
~~~

こんなグラフが出力されましたか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737640/bfa7fb4c-aa54-4578-812e-536b2643fef2.png)
そうです。y=2xのグラフです。

コードの解説をしていきます。
~~~py
import matplotlib.pyplot as plt
~~~
はとりあえず、グラフを書くため道具を取ってきたようなものと思ってください。
少し書いておくと、グラフをかくために必要なプログラミングを、先駆者が用意しておいてくれているので、それを利用させていただくためのコードです。今回は「matplotlib.pyplotをimportした」ことになります。
こういう誰でも使える便利プログラミングを**ライブラリ**と呼びます。pythonの利点として、このライブラリの豊富さがあります。as pltと付けたので、このライブラリを使うときには`plt.~`と書きます。

~~~py
x = [0, 2, 4]
y = [0, 4, 8]
~~~
は前回やりましたね。xというlistを作成して、中身に0, 2, 4が入っています。yも同様です。
~~~py
plt.plot(x, y)
~~~
で実際にプロットしています。`plt.plot()`でライブラリの中のplotという機能を使えます。今回はxとyをプロットしているので、(0,0), (2,4), (4,8)がプロットされます。間は直線で補間してくれていますね。こういう気が利くのもpythonのいいところです。

ここまではPC内部での出来事なので、
~~~py
plt.show()
~~~
で画面に表示します。画面に表示する代わりにPCへ保存することもできますが、今回は表示でいきましょう。

### ちょっと変更
同じものが得られますが、以下のように書き換えてみます。
~~~py
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 5, 0.1)
y = 2 * x

plt.plot(x, y)
plt.show()
~~~

今回はnumpyというライブラリをimportしていますね。このライブラリを用いて
~~~py
x = np.arange(0, 5, 0.1)
~~~
を実行しています。これは、0~5の範囲で数字を0.1刻みで生成するという意味です。これで先ほどよりも、細かく座標を取れていますね。
yはいちいち手で打つのも面倒なので、計算してもらいましょう。

yを変えて実験してみてください。
$y=sin(x)$のグラフも簡単に描いてもらえます。
~~~py
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)

plt.plot(x, y)
plt.show()
~~~
`np.pi`で円周率を使えます。sinカーブも`np.sin()`を使うだけ。便利ですね。

## グラフの設定
グラフのタイトル、軸ラベル、プロット範囲、凡例など自由に設定できます。学部時代、実験レポート用のグラフをexcelで1枚1枚調整していたのが馬鹿馬鹿しく感じられると思います。
~~~py
import matplotlib.pyplot as plt
import numpy as np

plt.xlim(0, 2*np.pi)
plt.ylim(-1.1, 1.1)
plt.xlabel('x')
plt.ylabel('y')
plt.title('y=sin()')

x = np.arange(0, 2*np.pi, 0.1)
y1 = np.sin(x)
y2 = np.sin(2*x)

plt.plot(x, y1, label='y=sin(x)')
plt.plot(x, y2, label='y=sin(2x)')
plt.legend(loc='upper right')
plt.show()
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737640/84111f3a-9dba-3716-c5c4-ed11a6a67f0e.png)

こんな調整をしたいと思ったら、その都度調べれば良いです。
chatGPTも精度良く答えてくれるので、ぜひ聞いてみましょう。

## 例題
好きなグラフを描いてみましょう
***
いかがでしたか？
プログラミングの便利さがだいぶ実感できたのではないでしょうか。
次回はいよいよ、ボールの投げ上げをシミュレーションしてみます。

***
- 第0回　[はじめに](https://qiita.com/tau14/items/d6620cb24945d8e564c2)
- 第1回　[プログラミングをしてみよう](https://qiita.com/tau14/items/3d3086844c6eb9a05cca)
- 第2回　[if文、for文を使ってみよう](https://qiita.com/tau14/items/501abc293c5a93422c35)
- 第3回　[グラフを描いてみよう](https://qiita.com/tau14/items/68b92efe2bba7a6de5f1)
- 第4回　[物理の計算をしてみよう](https://qiita.com/tau14/items/3216260f786d49f807d4)
- 応用編　[関数（メソッド）を使ってみよう](https://qiita.com/tau14/items/6e875492afd3d5915ea0)
- 番外編　[環境構築をしてみよう](https://qiita.com/tau14/items/edc12e66548ad8c669f4)
物理のためのプログラミング入門 

# はじめに
この記事は、プログラミングに触れたことのない方を対象に、高校物理のシミュレーションを行うことで、プログラミングのイメージを掴んでもらうことを目的とします。

プログラミング入門記事は良いものがたくさんありますが、この記事は、物理学科の学生が研究でプログラミングを使うための第一歩となるように書いてみます。


この入門講座は全4+2回です。
- 第0回　[はじめに](https://qiita.com/tau14/items/d6620cb24945d8e564c2)
- 第1回　[プログラミングをしてみよう](https://qiita.com/tau14/items/3d3086844c6eb9a05cca)
- 第2回　[if文、for文を使ってみよう](https://qiita.com/tau14/items/501abc293c5a93422c35)
- 第3回　[グラフを描いてみよう](https://qiita.com/tau14/items/68b92efe2bba7a6de5f1)
- 第4回　[物理の計算をしてみよう](https://qiita.com/tau14/items/3216260f786d49f807d4)
- 応用編　[関数（メソッド）を使ってみよう](https://qiita.com/tau14/items/6e875492afd3d5915ea0)
- 番外編　[環境構築をしてみよう](https://qiita.com/tau14/items/edc12e66548ad8c669f4)

筆者もまだまだ初心者なので、間違っていたら指摘していただけるとありがたいです。

# 第0回　雑談
今や世の中のほとんどのものがプログラミングで動いています。
パソコンはもちろん、家電などあらゆるものがプログラミングによって制御されています。

研究においては、「こんなツールが欲しい」とか、「こんな式を解きたい」と感じる場合があります。それを満たすツールがあれば良いのですが、ない場合には自分で作らなければいけません。作るために必要なものが、プログラミングという訳です。
例えば、学部実験で得られたデータをExcelでグラフにし、縦軸と横軸のラベルを入力し...という作業を何度も行った経験はあるかもしれません。これを自動化できたら嬉しいですよね。プログラミングは、そんな願いを叶えてくれます！


### 心構え
はじめは、プログラミングコードを読んでも理解できないことが多いでしょう。もちろん調べる元気があればそうして欲しいのですが、大事なことはなるべく **コピペをしない** ことです。よくわからなくても書き写すことを心がけてください。理解はできなくてもこういうものだと身体に馴染ませるのが大切です。

### 行き詰まったら
プログラミングはたくさんの先駆者がいるので、少し詰まったらネットで調べてみましょう。大体解決します。
ChatGPTもかなり役に立つので利用すると良いでしょう。

### プログラミングのお勉強
実は、プログラミング入門にとてもオススメの教材があります。
以下のAtCoderというサイトです。

https://atcoder.jp/contests/apg4b

https://atcoder.jp/contests/APG4bPython

AtCoderは競技プログラミングを開催しているサイトなのですが、この教材では、はじめから丁寧に教えてくれます。
しかもAtCoderは採点機能付きなので、プログラミング初心者あるあるの「これで合っているのか分からない」に応えてくれるのが最高です。

この教材で楽しめる方は、これだけやれば十分です。
ただ、今回の記事では、「物理シミュレーションっぽいことをするために必要なことだけやる」をコンセプトにしてみます。（そのほうが楽しいかも？）
kintone賞&最優秀賞 受賞レポート NRIハッカソン 2024

この記事は [kintone Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kintone) の25日目の記事です。
NRIハッカソンに挑んだ体験談と、kintoneをDBとして使った作品を紹介します。

# NRIハッカソンとは？

NRIの有志によって運営されているハッカソンで、今回で11回目の開催のようです。
けっこう老舗のハッカソンですね！

今回のテーマは関係人口で地域活性化という社会課題を解決するアプリを開発しました。

机上での開発にとどまらずフィールドワークを行って課題を抱えている人に直接話を聞きに行ってプロダクトを考案する時間が確保されているのが特徴的だと思います。
自分たちのチームは野菜を日本で一番作っている**茨城県鉾田市**で市役所の方や農家さん、直売所のレストランの店長さんなど、多くの地元の方にお話を伺いました。

学生の参加者もいれば11年間参加し続けている方もいたりインドネシアから来日して参加しているチームもあったりと、多様な参加者と交流するのもこのハッカソンの醍醐味なのかなと感じました。

https://bitconnect.nri.co.jp/2024/

# チーム構成

今回のハッカソンは同じ部署に配属された新人同期5人で参加しました。
1チーム6名までエントリー可能だったので、メンバーは多い方が有利だろうと思いギリギリまでチームメンバーを集めようと動いていました。

各メンバーの役割をかっこよく言うとこんな感じです。

- ビジネスデザイナー
- UIデザイナー
- イラストレーター
- フルスタックエンジニア
- MLエンジニア

エンジニアだけでなくデザインのスキルがあるメンバーもいたのが今回の受賞に繋がったポイントだと思っています。


# 成果物の紹介

ホコモンマイスターというスマホ用Webアプリを開発しました。

鉾田市でのフィールドワークで多くの熱い思いを持った人とお話しすることができました。
どの地域にも誇り持って働いている方がいることに気が付き、観光名所ではなく人に会う目的で地域を訪れてもらおうという発想が生まれました。

![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943849/5dc624e2-76f0-81df-26b2-aed9f19728be.jpeg)

詳細が気になった方は、こちらをご覧ください。

https://protopedia.net/prototype/6322

## システムアーキテクチャ

フロントエンドはNextjs、バックエンドはFlaskで開発しました。
DBとしてkintoneを使用しました。

今回のプロトタイプにおけるkintoneの役割はこんな感じです。
- ホコモンの詳細情報の管理
- ユーザーがホコモンと会った回数の管理

また、技術協賛として提供されたCodyを開発全体で活用して効率よく開発を進めることができました。

![システムアーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943849/9bc34c33-42fc-8726-fcf7-1ae576a59bef.png)


# kintoneを初めて使った所感

これまでkintoneを触ったことがあるチームメンバーはいませんでしたが、技術協賛でライセンスをいただけたので、DBとして利用してみました。

想像以上に簡単に使えて、カラムを増やしたりデータを編集したりという操作なら学習コストほぼゼロでできて、開発時間の短縮になりました。

kintoneは画像も直接保存することができて、プレビュー表示があったのも上手く動いているか直感的に確認できて良いなと感じました。

![kintone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943849/44d14a45-4c8b-c4d5-b0eb-8acfec124b78.png)

# おわりに

今回のハッカソンでは、アプリ開発を通じて課題解決に挑む貴重な経験をすることができました。

NRIハッカソン運営の皆様、協賛企業の皆様、ハッカソン開催にご協力いただいた地方自治体の皆様、フィールドワークに協力してくださった地域の皆様、審査員の皆様、そして参加者の皆様にお礼申し上げます。
VPN環境をWireGuard＆Dockerで構築

## なぜVPN環境を？

海外出張に行ってきたのですが、海外だと普通にフリーWi-Fiがいっぱいあります。
ただ、さすがにネットワーク環境に不安があるというので一時的にVPN環境を構築してみました。

事前にeSIMを手配していましたが、もしものためにと思って晩酌のお供にVPN環境構築してみました。

## VPNサーバー準備

### まずはサーバーを用意

AWS上に構築します。
ここら辺は概要だけで細かいところはスキップします。

- AmazonLinux2023をポチポチして準備
    - とりあえず`t3.micro`で用意（2人同時接続してみたけど問題無かったです）
    - パブリックサブネットに配置
    - パブリックIPは必要（EIPは一時的かどうかで判断してもらえればと）
- セキュリティグループ準備
    - UDP 51820のインバウンドをOKに
    - SSHポートは自分のIPのみ（セッションマネージャー使うなら不要）

### Docker周りのインストール

- Dockerインストール（コマンドは不要だと思うけど一応）

```bash
# インストール＆スタート
sudo dnf update -y
sudo dnf install docker -y
sudo systemctl enable docker
sudo systemctl start docker

#　起動確認
sudo systemctl status docker

# ユーザーをDockerグループに追加
sudo usermod -aG docker ec2-user
```

- Docker Composeインストール

```bash
# インストール＆権限設定
DOCKER_COMPOSE_VERSION=v2.26.1
sudo curl -SL https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# バージョン確認
docker-compose --version
```

### 通信周りの設定

ここを忘れるとNAT越えしないので要注意

```bash
# IPフォワーディング（パケット転送）を永続的に有効
sudo vi /etc/sysctl.conf
# →ファイルを開いてい「net.ipv4.ip_forward = 1」を追記

# 設定反映
sysctl -p

# 上記の永続化をしないで一時的に設定する場合は以下を実行
# sudo sysctl -w net.ipv4.ip_forward=1

# EC2から外にでるように設定
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```

## Docker設定ファイルを用意

公式のイメージを使うのでcompose.ymlのファイルを用意するのみです。
コメントで「★」を付けているところは、適宜変更してください。

```yaml:compose.yml
services:
  wireguard:
    image: linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - SERVERURL=XXX.XXX.XXX.XXX # ★EC2のグローバルIPを指定
      - SERVERPORT=51820 # 利用ポート
      - PEERS=1 # ★接続する人数を指定
      - PEERDNS=8.8.8.8 # ★DNS指定
    volumes:
      - ./config:/config # Docker起動後に設定ファイルなど作られる場所
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped
```

## WireGuard起動！

先ほど、用意した設定ファイルがある場所で起動を実施

```bash
# 起動
sudo docker compose up -d
```

起動後にファイル共有しているconfigディレクトリの下にQRコードのPNGファイルが生成されているので確保してください。
この後のスマートフォンでの設定に利用します。

## スマートフォン側の設定

Androidでの設定のみですが、ざっくり書いておきます

1. GooglePlayでWireGuardアプリを探してインストール
1. WireGuardアプリを起動して、「＋」から前の手順で確保したQRコード読み込み（名前は自由に設定してOK）
1. WireGuardアプリに接続先が追加されるのでVPNを有効化

これで安心してインターネットが使えます！

## 最後に一言

実は色々ハマって深夜3時までかかったりしたけど、
これで海外出張中でもアマプラを見ることができました！！
Creating GitHub CLI Aliases

```sh
gh alias set alias-name 'command without gh'

gh alias set create-draft-pr 'pr create --draft --assignee @me'
```


```sh
gh alias list

co:    pr checkout $1
dpr:   pr create --draft --assignee @me
lpr:   pr list --assignee @me
lprc:  pr list --search "is:pr is:closed author:@me"
lr:    pr list --search "is:open review-requested:@me"
lrc:   pr list --search "is:closed review-requested:@me"
prs:   pr status
si:    issue list --search "is:open is:issue $1"
sic:   issue list --search "is:issue is:closed $1"
spr:   pr list --search "is:pr is:open $1"
sprc:  pr list --search "is:pr is:closed $1"
v:     pr view $1
vw:    pr view $1 -w
```

---

ref:

https://micheal.dev/blog/ghcli-5-creating-and-managing-github-cli-aliases/
ポモドーロ・テクニックにつかえるおすすめの物理タイマー

この記事は、[株式会社カオナビ Advent Calendar 2024 シリーズ 2](https://qiita.com/advent-calendar/2024/kaonavi) の7日目です。

https://qiita.com/advent-calendar/2024/kaonavi

---

こんにちは！ポモドーロ・テクニック愛好家です！

ポモドーロ・テクニックをご存知でしょうか？25分間集中して5分休憩を取るというサイクルで、作業開始前に計画したデイリーコミットメントをなぎ倒していくというメソッドです！

ポモドーロ・テクニックの細かい作法については、書籍がありますのでそちらを参照してください。

https://books.cccmh.co.jp/list/detail/2213/

本記事のターゲットは、ポモドーロ・テクニックで25分を計測するときに使用する「おすすめのタイマー」のご紹介です。スマホアプリなどで代用されている方もいらっしゃいますが、物理タイマーが断然おすすめです！では、さっそく行ってみましょう！

### dretec T-612

https://dretec.co.jp/kitchen_goods/timer/t-612/lang-ja

おすすめポイント

- アラーム鳴動時間を選択できる
- 使わなくなったらキッチンタイマーとして流用可能
 
鳴動時間を2秒に設定できるため、25分経過したときにタイマーを再度押してアラームを止める手間がありません。まさにポモドーロ・テクニックビギナーにぴったりの製品です。


### dretec T-593

https://dretec.co.jp/stationary/timer/t-593/lang-ja

おすすめポイント

- 斜めの液晶が見やすい
- 勉強に特化した各種の機能
- アラームを無音に設定可能

勉強に特化したタイマーなので、25分経過後の折り返しカウントアップなど、役立つ機能が満載です。タイマーON/OFFのボタンが半透明の大きいボタンになっていて、無音設定でもLEDが光るので、気づきやすいです。無音派の方はぜひ！


### TIME TIMER

https://www.timetimer.com/

最長60分まで計測可能なシンプルなタイマーです。ゼンマイ式タイマーのような見た目ですが、電子制御なので動作音はありません。アラームもOFFにすることができます。残り時間が色付き背景により、一目で分かります。とてもシンプルな作りで、時間設定は全面のダイヤルをひねるだけです。

最近、エンジニア界隈で話題になっているタイマーで、愛好家も多いです。値段もそれほど高くないので、ポモドーロ・テクニックで作業効率化に手応えのあるかたは、ご褒美にちょっと良いタイマーを買ってみると、さらにワクワクして集中できます。

## まとめ

今回は３つのタイマーを紹介しました。タイマー愛好家の私は、今までに20個を超えるタイマーを購入してためしてきました。今回ご紹介した3つは、実際にそれぞれ使ってみて、自信を持って「良い！」と言えます。

皆様のポモドーロ・テクニック生活がより良くなることを願います！
Markdown記法の備忘録

# Markdown記法チートシートを見つけました
ちなみに以下です．

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

# Markdown（マークダウン）とは
簡単な記号を使って文章の構造や装飾を指定できるマークアップ言語です．マークアップ言語とは文章の構造や修飾情報などをテキストファイルに記述するための言語で，文章にタグや記号を付けてコンピューターに認識させて文書の構造を定義する役割を担っているのだそうです．

「ブログを書くときに使える装飾を記号で表現できる」ものです．

# どのくらいあるのか
Markdownの種類を数えてみると，いっぱいありました．
ひとつづつ見てみます．

- **Codeの挿入**

    **Code spans** 「\`」を1つでコードを囲むと`(コード)`

    **Code blocks** 「\`」を3つでコードを囲むと```(python test.pyとか)```

    例えば

    ```python test.py
     print('hello, world')
    ```
<br \>
- **Format Text**
**Headings** 　「#」で見出し
**Strikethrough**　「~~」で囲むと打消し線
**Details**　　「<>」を付けた「detalis」で囲むと折りたたみ
**Note** 　「:::」で囲みnote info / note warn / note aertを付けて補足説明
<br \>
- **Lists**
**Bullet List**　文頭に` * + - `を付けると順序なしリスト
**Ordered List**　文頭に` 数字. `をつけると番号付きリスト
**Description List**　HTMLの`<dl>`タグを付けると説明リスト
※ ちなみにTabキーでインデントすると組み合わせでネストできます
    - aaa
        1. bbb
        2. ccc
<br \>
- **Checkbox**　 `- [] タスク1`で未チェック，`- [x]　タスク2`で済みチェック
<br \>
- **Blockquotes**　 文頭に`>`を置くと引用
<br \>
- **Horizontal rules**　 `* * *`や`***`や`- - -`で水平線
<br \>
- **Links**　`[リンクテキスト](URL "タイトル")`でタイトル付きのリンク
<br \>
- **Images** `![代替テキスト](画像のURL "画像タイトル")`で画像埋め込み
`<img width="表示幅" alt="ファイル名" src="URL">`で大きさ指定の画像埋め込み
<br \>
- **テーブル**　`3x2`などと入力する．前後に空行必要．`:-:`は`:-`や`-:`で右左寄せ
例えば3x3などといれると，以下のように表示される

    | 1 | 2 | 3 |
    |:-:|:-:|:-:|
    | a | a  | a  |
    | a  | a  | a  |
<br \>
- **数式の挿入**　`を3つで囲みmathを付けて数式挿入
<br \>
- **目次(TOC)の自動挿入**　記事内の見出しを元に自動生成し，右に自動挿入される
<br \>
- **脚注**　本文中に`[^1]`や`[^example]`
<br \>
- **絵文字**　文頭`\:`と文尾`:`でkissing_closed_eyesを囲み絵文字埋め込み
<br \>
- **リンクカード**　URLの前後を空行に
<br \>
- **ダイアグラム**　`三つと文頭にplantuml．mermaidでも表示可
<br \>
- **コンテンツの埋め込み**　別サイト
<br \> 
- **コマンド補完機能**　`/`コマンドを使うことで特定の操作や機能を呼び出せる
<br> </br>

- **その他**
1. Markdownの無効化：　`\`をMarkdownの前に入れる
2. ボールドが`** **`で，イタリックが`_ _`
3. 改行：　`<br \>`か`<br> </br>`
4. 文字色の変更：　`<font color="Red">テキスト</font>`
<font color='grey'>yey</font> = gray
<font color='purple'>yey</font> = purple
<font color='emerar'>yey</font> = emerar
<font color='ewef'>yey</font> = ewef
<font color='whiteblue'>yey</font> = whiteblue
<font color='green'>yey</font> = green

    ??
テスト設計時の組合せを考えてみる

## はじめに
QAエンジニアの[@yamahiro2022](https://qiita.com/yamahiro2022)です。ナーシングネットプラスワン（介護請求ソフト）の品質保証を担当しています。本記事は[LITALICO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/litalico)の24日目の記事となります。

テスト設計を行っていく中で、どこまでテストを行うのがいいのか？と迷うことがあるかと思います。
この記事では組合せにフォーカスを当てて考えてみたいと思います。

## テストの目的はなんだ？
立場や状況によってテストの目的は若干変化しますが、共通で言えることは**品質の見える化**だと思ってQA活動を行っています。
たまにテストを行うことによって品質向上ができますと言われる方がいますが、あくまで品質向上を行う中での品質の見える化という手順の中の一つと認識しています。

## テスト設計のポイント
ここでは、機能テスト設計時を意識して考えたいと思います。
テスト設計時の重要なポイントは下記３つと考えています。
- 目的が具体的かつ明確になっていること
- 観点が目的に合っていること
- テスト範囲（機能の組合せ）が適切に設定されていること

目的や観点については、比較的全員が意識しやすく、認識をそろえたうえでレビューが行われることが多いと考えています。
一方で、テスト範囲（機能の組み合わせ）については、どの範囲まで組み合わせを網羅するべきかがテスト設計者によってばらつきが生じやすい印象があります。
範囲が狭すぎると品質への不安が残り、広すぎると工数不足が懸念されるなど、適切な範囲を自信をもって設計するのは簡単ではありません。
そのため、本記事ではテスト範囲の決定に焦点を当て、適切な組み合わせの考え方や手法について掘り下げていきたいと思います。

## 登録機能で考えてみる
例として下記内容のテスト観点、因子、水準でのテスト設計を考えてみます。

観点：とあるサイトの会員登録が正常に行えること
因子：氏名、性別、生年月日、会員種別

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987894/8b4603e0-ecdd-8140-f628-3a8cfb1c60d6.png)

無邪気に因子×水準で組合せ作成を行うと

:::note alert
３×３×４×３=　108 パターン
:::

となります。
このまま行ってしまうと、例題のように単純に100項目程度だけの因子水準であれば
テスト実施の現実的な数値に見えてくるかもしれないですが、実際の現場ではもっと膨大になることは度々あるかと思います。
ここでお勧めするのが、**2因子間網羅**で実施することです。
次に2因子間網羅とは何かを簡単に説明させていただきます。

## 2因子間網羅を使用してみる

欠陥は、1～2因子間の組合わせによって発生することが大半であり、2つの因子を使用しての組合せでテストすることで、全網羅テストをすることよりも効率高く欠陥を検出することが可能である。

- 1因子で見つかる欠陥：29%〜68%
- 2因子で見つかる欠陥：70%〜97%
- 3因子で見つかる欠陥：89%〜99%
参照：Software Fault Interactions and Implications for Software Testing


2因子間網羅を使ってテストパターンを考えてみたいと思います。
※2因子間網羅をもう少しだけ深堀りした内容は[こちら](https://qiita.com/yamahiro2022/private/da612c10e76a2e9fdfc3)で記載していますので気になる方は読んでいただけたら幸いです。

:::note info
下記のように、15パターンにすることが可能です
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987894/e5e8e1a4-1195-ed9f-c8ba-6b473632c87c.png)


## 最後に
今回の記事では、登録画面を例に、2因子間網羅を使用したテスト設計の基礎を紹介しました。この手法は、効率的に組み合わせを網羅し、因子間の関係性による不具合を検出する際に有効です。しかし、すべての場合において適用可能なわけではありません。

**因子間の独立性**
2因子間網羅は、因子間が独立していることを前提としています。しかし、実際のシステムでは因子間に制約が存在する場合があります。その場合、制約を考慮して組み合わせを調整する工夫が必要です。

**機能の複雑度**
機能が複雑で因子や水準が多岐にわたる場合、2因子間網羅では十分に網羅できないリスクがあります。その際は、リスクベースでテスト範囲を見直したり、他の網羅手法（例：直行表や全組み合わせ法）を併用したりすることが必要です。

ポイントは状況に応じて最適なアプローチを選択することです。
テスト対象の特性やリスクを理解し、必要に応じて手法を柔軟に組み合わせて活用することで、効率的かつ効果的なテスト設計が行えると考えています。

:::note warn
2因子間網羅は万能ではない
:::

:::note info
テスト設計時は柔軟な考えで2因子間網羅を活用していこう
:::
activemodel::APIのnew


```rb
    def initialize(attributes = {})
      assign_attributes(attributes) if attributes

      super()
    end
```
https://github.com/rails/rails/blob/cf6ff17e9a3c6c1139040b519a341f55f0be16cf/activemodel/lib/active_model/api.rb#L80

### assign_attributes
```rb
    def assign_attributes(new_attributes)
      unless new_attributes.respond_to?(:each_pair)
        raise ArgumentError, "When assigning attributes, you must pass a hash as an argument, #{new_attributes.class} passed."
      end
      return if new_attributes.empty?

      _assign_attributes(sanitize_for_mass_assignment(new_attributes))
    end
```
https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activemodel/lib/active_model/attribute_assignment.rb#L28
#### each_pairで対応付けさせてる
>each_pair {|member, value| ... } -> self
each_pair -> Enumerator
構造体のメンバ名(Symbol)と値の組を引数にブロックを繰り返し実行します。

例
```rb
Foo = Struct.new(:foo, :bar)
Foo.new('FOO', 'BAR').each_pair {|m, v| p [m,v]}
# => [:foo, "FOO"]
#    [:bar, "BAR"]
```
### sanitize_for_mass_assignment
```rb
  module ForbiddenAttributesProtection
    def sanitize_for_mass_assignment(*options)
      new_attributes = options.first
      if !new_attributes.respond_to?(:permitted?) || new_attributes.permitted?
        super
      else
        raise ActiveModel::ForbiddenAttributes
      end
    end
  end
```
https://github.com/rails/strong_parameters/blob/431b03e8524046dd81a2221f029e217726121920/lib/active_model/forbidden_attributes_protection.rb#L6
2つのRailsプロジェクトをがっちゃんこさせた話 (マイクロサービスからモノリスへ)

HubbleでCTOをやらせてもらっている藤井（[@katsuya0515](https://qiita.com/katsuya0515)）です。  
今年も[Hubble Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hubble)を無事開催でき、Hubbleの誇る優秀なエンジニアの方々が色んな記事を投稿してくれました。最終日18日目[^1]を迎え、僭越ながら今年度最後の記事投稿をさせて頂きます。

Hubbleのとあるサービス群を合体させるという英断をし、開発効率を上げることができたお話をさせて頂きたいと思います。

# 背景
契約書の管理クラウドサービスを展開するHubbleですが、社内では契約書のバージョン管理部分をHubble、契約のメタ情報管理（台帳管理）の部分は[ドキュメントリスト](https://hubble-docs.com/news/hubble-new-features-2020-vol-09)（以下、Doclistと呼ぶ）という用語を使って表現をしています。

歴史を振り返ると、`ビジネス版のGithub`というキャッチフレーズを掲げ、契約書のバージョン管理機能から開発が始まりました。便利！欲しい！というお言葉を受け、サービスローンチをしましたが、便利とそこに対してお金を払うか、は一線を超えたものであるという現実を知りました。

そんな中、とある大手の企業様から台帳管理機能があれば導入をしたい、という一声を頂き、このDoclistの開発が始まりました。今思えば、このDoclist開発がHubbleをシリーズA, Bへと進ませてくれた分岐点となりました。

# 当初の設計
当初のHubbleは、契約書のWordファイルを扱うItemモデルを軸に、バージョン情報、コメント、添付ファイル等を扱うモデルが存在していました。一方台帳管理はいわゆるExcel機能であるため、Columnモデル、Cellモデルなど新しいモデルが登場します。新規にモデルを作成することと、時代はマイクロサービスでしょ！的なノリで、別レポで`Rails new`をして開発が始動しました。数年運用し、結果的に下記のような課題が生まれました。

### Itemの一覧を取得する内部通信
台帳機能を表現するためには、縦軸にItem、横軸にColumn、セルの内容がCellモデルになるため、HubbleからItemの情報は毎回取得する必要があります。

### 機能追加時にダブルコスト
またHubbleからDoclistの項目を操作したくなると、HubbleにFrontendのためのendpointを、Doclist側に内部通信のendpointを作成しなければならない。

### Joinのできないquery
DBが分かれているためにjoinができず、クエリが非効率になってしまう。

マイクロサービスの利点でよく言われる、デプロイの分離をすることができたり、サーバーのリソースレベルをサービスごとに変えられるという利点はありましたが、実際には同レポからbuildされたイメージをECS上で別serviceと起動し、ALBで分散させることでこのような課題も払拭できたので、結論としてここに関しての恩恵はあまりなかったような気がします。

# がっちゃんこ始動
### ローカルでとりあえず合体してみる
まず最初に副作用の大枠を把握するために、ローカル環境で合体させてみました。モデルやビューにあたる部分はレポ間で独立しているためroot直下にコピーし、コントローラーはnamespaceを区切って移行しました。同時に脳内で全体像の再整理を行いました。創業から携わっているプロダクトでも忘れてしまった処理や、他の方が作ってくれた機能等があり、自分の中での再整理も兼ねて、理解に時間を費やしました。

<img width=8%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109324/b09a959e-9455-b38e-4118-2023f4517f19.png" width=50%>  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109324/d6e27e91-e31a-0cd6-e327-078013697874.png" width=34%>


### リファクタリングとRspecの追加
移行時にネックになりそうな部分に関しては前もってリファクタリングを行いました。その際に足りてないRspecも補強し、基本的には移行後にはそのRspecが通ることで動作を担保するようにしました。

### データベースを移行（AWS Data Migration）
次に行ったのはデータベースの移行をAWS Data Migrationを用いて行いました。Data Migrationは同期機能が付いているため、Doclist側のテーブルは常にHubbleに対して同期されている状態を作り出すことができ、レポ間のファイル移行はデータベースは気にすることなく行うことができました。

### 移行作業開始
ローカルで試した時に、起きた問題を整理しながら、実際にPRを出す時には細かい粒度で出していきました。また同時にチームメンバーにも移行開始の周知を行い、Doclist側で変更が生じた場合には一報を入れてもらい、自分自身もこまめにPRを確認することで、ローカルの時に試した差分が吸収できるように心がけました。時間がかかればかかるほどこの差分吸収作業は大変になるので、比較的リソースを集中させて行いました。

### 内部通信の削除/Queryの最適化
QAチームに動作確認を依頼し、無事に本番にリリース作業が終わった後も、作業は続きます。ただし、内部通信をしていた部分は、同一のサーバーにリクエストが返ってくるだけなので、この辺りから作業分担を行い最適化を少しずつ行っています。

# 振り返りと今後の検討事項
純粋に内部通信をしなくて良くなったことや、モデル間の呼び出しやjoin等ができたことで、開発スピードも応答スピードも改善することができたのは大きなメリットでした。とはいえ、先人の知恵であるモノリシックで大変、という言葉の本来の意味はどこかにはあるはずなので、繰り返す歴史にならないようにモジュラーモノリスを検討するなど、常にアンテナは貼っておく必要があるなと思っています。今回の学びは安易にマイクロサービスを検討するなという教訓であり、中長期的なロードマップとともに、どういう切り分けをしていくべきなのかを精度を持って議論していく必要を感じました。

# 最後に
2024年も様々な機能リリース、機能改善を行い、また組織的にも少しずつ大きくなってきました。今後も課題は山積みかと思いますが、全ては学びの経験という姿勢を忘れずに、日々良いプロダクト作りに努めていきたいと思います。

それではみなさん、良いお年を。

[^1]: 平日のみの投稿なので24日ですが17日目の記事としています。
如何にして社内の開発環境にPythonを浸透させたか

# はじめに
ここ最近一番ソースコード書いている言語はPython、"m10i"です
当社はISP事業をメインでやっているのですが、業務改善におけるプログラム開発については
Perlであったり、PHPであったりと各自バラバラだったので
昨今の流行に乗じてPython環境を社内に展開しました

ここではその展開方法と注意事項を記載しております

## 1.Pythonインストーラを社内に保管しよう
exeファイルをインターネットからダウンロードできないネット環境でしたので
Python公式にあるexeファイルを情報システム部に依頼し、
全社員がアクセス可能なファイルサーバに保管してもらいました
* ファイルは削除や改竄が不可になるように読み取り権限だけ付与しております

## 2.Pythonインストールについてマニュアルを作ろう
併せてインストールマニュアルを作成し、Pythonインストーラーと同じ場所に保管しました
「英語のインストール画面でどこクリックしたら良いのか分からない」
...なんて声が上がらないよう、画面のスクリーンショットと吹き出しでコメントを入れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15104/356b355d-0213-00d7-cb6c-cf37a6fe657d.png)

## 3.ついでに開発環境(Visual Studio Code)も準備しよう
こちらもPythonと同じく下記のことを実施しました
* インストーラexeをインターネットから情報システム部にてダウンロード
* 社内ファイルサーバに保管
* インストールマニュアルも作成、保管

さらにデフォルトだと日本語パックが入ってないので、
マニュアルでは日本語化のスライドも入れました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15104/79b3b971-ac85-0118-4f30-a7eceb32b4da.png)

## 4.付近のメンバーに浸透活動開始
準備ができたので、まずは近くのメンバーに「Python...良いよ...」と(布教)マニュアル展開
不明点があればマニュアルを修正しておりました

---

# ここまでは順調
だったのですが、Python利用者が増えていくことで下記のような問題?(注意点)が発生しました

## 注意1.pip使いたいんだけど？
そのうち浸透していくと
「RequestsだったりPandasを使いたい」という声が出てきます

この時pipによるパッケージのインストールには危険が伴うことを説明しております
具体的には
* パッケージのタイプ間違いをしない
* ソースコードの中身が分からないパッケージは利用しない

などを伝えました

https://news.mynavi.jp/techplus/article/20240906-3019434/

## 注意2. マルウェア検知頻発(Pyinstaller --noconsole)
Pythonでアプリケーションを作る方が増えていくと、
アンチマルウェアソフトウェアで誤検知する事象が発生しました
原因はPyinstallerでEXE化(しかもnoconsole指定)をしようとした時に発生していました

実際、Python3.12 + Pyinstaller 6.6.0 で「--noconsole」時に
生成される中間EXEはVirusTotalでも多くの製品でマルウェアとして判定されます
https://www.virustotal.com/gui/file/a0a65e552cb27f92925f1e95b33ba6b2389d20820dd16691a755390a82e9ea48

どうやら多くの攻撃者がPythonソースコードを武器化するために、Pyinstallerを使って
コンソール画面無しEXEを作っているのでは？という噂もありマルウェアに判定されているようです


当この中間EXEのSHA256をアンチマルウェアで無視することもできますが、
リスクが伴うとして「--noconsole」利用でのEXE開発は禁止としました
(このオプションを入れなくても、コンソール画面が表示されるだけなので動作に影響無し)

---

その後、社内でChatGPTが導入されたところChatGPTだけでPythonを使った
プログラム開発を始めたよ！という声もあり
「かがくのちから(ChatGPT)ってすげー！」となりました

めでたしめでたし

# お知らせ
こちらの記事はctc Advent Calendar 2024の記事となります
この後もctc(中部テレコミュニケーション株式会社)のメンバーが技術にまつわる知見を投稿していきますのでご期待ください

https://qiita.com/advent-calendar/2024/ctc