OmniAICreator/Qiita-1.07M huggingface dataset:
【Kotlin】「メモ帳アプリ」で学ぶ「Clean Architecture」

以下のUdemyの教材で「Clean Architecture」について学んでみました。
セクション2とセクション3を視聴したことで

『「Clean Architecture」に登場する「Entities」「Use Cases」とは何か？』を少し理解できました。

> Clean architecture & SOLID principles for Android in Kotlin
https://www.udemy.com/course/cleanandroid/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/2637318a-672f-ee18-29c0-40eeea2e7270.png)


コース内で作成されるアプリはシンプルなメモ帳アプリでKotlinの基礎がある程度できている人であれば理解できる内容かなと思います。

この教材で「Entities」「Use Cases」は理解できたけど、教材内で触れられていない「Controllers」「GateWays」「Presenters」も理解したいと思い、GPTに以下のように質問を投げたら以下のように回答が返ってきました、

---

Android開発でメモ帳アプリを作成しています。

Clean Architectureに登場する
「Entities」「Use Cases」「Controllers」「GateWays」「Presenters」
について詳しく教えて頂けますか？

コードの具体例もあると助かります。

---

<response>
# Android開発でメモ帳アプリを作成しています。

Clean Architectureに登場する  
「Entities」「Use Cases」「Controllers」「GateWays」「Presenters」  
について詳しく教えて頂けますか？

## 🗒️ Answer

### 1. **Entities**:
   - **役割**: アプリケーションのビジネスルールやデータを表す。データベースやUIとは独立していて、アプリのコアな部分を担う。
   - **例**: `NoteEntity`  
     ```kotlin
     data class NoteEntity(val id: Int, val title: String, val content: String)
     ```

### 2. **Use Cases**:
   - **役割**: ビジネスロジックを実行し、Entitiesを操作する。ユーザーアクションに応じて処理を行い、適切なデータを取得・更新する。
   - メモを追加・更新・削除等 (➡️これは自分が補足した。)
   - **例**: `SaveNoteUseCase`  
     ```kotlin
     class SaveNoteUseCase(private val noteRepository: NoteRepository) {
         fun execute(note: NoteEntity) {
             noteRepository.save(note)
         }
     }
     ```

### 3. **Controllers**:
   - **役割**: ユーザーからの入力を受け取り、適切なUse Caseを呼び出す。UIから直接操作されることが多い。
   - **例**: `NoteController`  
     ```kotlin
     class NoteController(private val saveNoteUseCase: SaveNoteUseCase) {
         fun onSaveButtonClicked(note: NoteEntity) {
             saveNoteUseCase.execute(note)
         }
     }
     ```

### 4. **GateWays**:
   - **役割**: データベースやネットワークなど、外部システムとのやり取りを管理する。RepositoryがGatewayに該当することが多い。
   - **例**: `NoteRepository`  
     ```kotlin
     class NoteRepository(private val noteDao: NoteDao) {
         fun save(note: NoteEntity) {
             noteDao.insert(note)
         }
     }
     ```

### 5. **Presenters**:
   - **役割**: Use Casesから受け取ったデータをUIに適した形に変換し、Viewに渡す。ViewModelがPresenterに該当することが多い。
   - **例**: `NotePresenter`  
     ```kotlin
     class NotePresenter(private val view: NoteView) {
         fun present(note: NoteEntity) {
             view.show(note.title, note.content)
         }
     }
     ```

## 🌐 Sources
1. [qiita.com - 実装クリーンアーキテクチャ](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)
2. [gist.github.com - クリーンアーキテクチャ完全に理解した](https://gist.github.com/mpppk/609d592f25cab9312654b39f1b357c60)
3. [zenn.dev - やさしいクリーンアーキテクチャ](https://zenn.dev/sre_holdings/articles/a57f088e9ca07d)
4. [qiita.com - 一通り Android-CleanArchitectureの流れを読んでみるメモ](https://qiita.com/takahirom/items/3dd66410280c989505fd)
5. [note.com - Android開発におけるアーキテクチャー設計について](https://note.com/matsuurayuki1219/n/n3b61389299ef)
6. [techblog.insightedge.jp - 生成AIアプリのクリーンアーキテクチャを考える](https://techblog.insightedge.jp/entry/aoai-app-clean-architecture)
</response>

---

間違っていると思われた際は、ご指摘頂けますと幸いです。
gh repo clone / git clone で error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400が出る

## Error

git cloneしようとすると以下のエラーがでる

```
gh repo clone xxx
Cloning into 'xxx'...
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
fatal: expected 'packfile'
failed to run git: exit status 128
```

## 解決策

```
git config --global http.postBuffer 524288000
```

このコマンドで`~/.gitconfig` に以下のような設定が入るので適宜調整。（clone後不要であれば削除)

```~/.gitconfig
[http]
        postBuffer = 524288000
```

## 原因

http bufferサイズのせいのよう

https://stackoverflow.com/questions/62753648/rpc-failed-http-400-curl-22-the-requested-url-returned-error-400-bad-request
Storyboard `AppDelegate`について

# 目的
プロジェクト作成時にすでに存在する`AppDelegate`について気になったので少し調べました。
なるべくわかりやすいように書いていきます

## 前提条件
Xcode15.1


## AppDelegateに関して
```swift
@main
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    return true
  }

  // MARK: UISceneSession Lifecycle

  func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
  }

  func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
  }
}


```
この記述をふかぼっていこうと思います。

### `UIApplicationDelegate`とは？(プロトコル)
公式サイトには`A set of methods to manage shared behaviors for your app.`と記述があり直訳すると`アプリの共有の挙動を管理するための一連のメソッド`
でした.

**共有の挙動**とは？
- アプリ全体で共通して必要な動作や処理を指します。
- 具体的には**アプリの起動** **アプリの終了** **バックグラウンドへの以降**など

**`UIApplicationDelegate`**はプロトコルなのになんで公式に「メソッド」と書かれているのか。
- `UIApplicationDelegate`がもつメソッドをさしているため
- `protocol`というのは関数置き場みたいなもの(継承して実際の関数の処理を決める)

つまり`UIApplicationDelegate`とは上記挙動を管理するためのプロトコルです。(アプリのライフサイクルともいう)

### `UIResponder`とは？（クラス)
公式サイトには`An abstract interface for responding to and handling events.`と記述。
直訳は「イベントに応答し、処理するための抽象的なインターフェース」

つまり何かの処理に応答し処理するためのクラスというわけです。

いよいよ中の関数について理解していきましょう

### 結論のみ
コメントアウトに記載しておきます。
```swift
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
  // アプリ内で使用するデータベースの初期化や接続設定を行います。
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    return true
  }
  
  // アプリが複数の画面を持つ場合にどの設定を適用するかという記述
  // 標準の`Default Configuration`という設定を適用させている
  func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
  }
  // アプリ内で現在アクティブではない(働いてない)もしくは不要になった画面やウィンドウを閉じたときに呼ばれる
  // 呼ばれたら使ってないものを削除したりする
  // 掃除機みたいな感じ
  func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
  }
}
```

### 参考文献
**公式サイト**(`UIApplicationDelegate`)
https://developer.apple.com/documentation/uikit/uiapplicationdelegate

**公式サイト**(`UIResponder`)
https://developer.apple.com/documentation/uikit/uiresponder
基本的なサーバーについて要点だけのまとめ

## アジェンダ
基本的なサーバーについて要点だけを備忘録的にまとめます。

## サーバーとは
サーバー利用者の要求に応じてデータを提供するシステムです。

## サーバーの種類（利用形態別）
### 共用サーバー（Shared Server）
複数のユーザーが同じサーバーを共有します。低コストですが、他ユーザーの影響を受けやすいです。

- **例**: エックスサーバー, mixhost, ロリポップ, GMOペパボの共用サーバー, Bluehost
- **メリット**: 低コスト、設定が簡単
- **デメリット**: パフォーマンスが他ユーザーに左右される

### 専用サーバー（Dedicated Server）
1台のサーバーを専有します。高パフォーマンスでカスタマイズが可能ですが、コストが高くなります。

- **例**: さくらの専用サーバー, ConoHa by GMO, Hetzner, OVHcloud, Liquid Web
- **メリット**: 高パフォーマンス、他ユーザーの影響を受けない
- **デメリット**: 高コスト、管理が必要

### VPS（Virtual Private Server）
1台のサーバーを仮想化し、専用リソースを提供します。共用サーバーと専用サーバーの中間的な選択肢です。

- **例**: ConoHa VPS, さくらのVPS, DigitalOcean, Vultr, Linode
- **メリット**: 専用リソース、比較的低コスト
- **デメリット**: リソースの限界がある

### クラウドサーバー（Cloud Server）
仮想化されたサーバーで、リソースを柔軟に管理できます。スケーラビリティが高く、従量課金制が一般的です。

- **例**: AWS EC2, Microsoft Azure, Google Cloud, IBM Cloud, Alibaba Cloud
- **メリット**: 高スケーラビリティ、効率的なコスト管理
- **デメリット**: 設定が複雑、ネットワーク依存度が高い

### 用途に応じた選択基準

- **共用サーバー**: 小規模サイト、初心者向け
- **専用サーバー**: 大規模サイト、高トラフィックサービス
- **VPS**: 中規模サイト、開発・テスト環境
- **クラウドサーバー**: スケーラブルなサービス、スタートアップ

## サーバーの種類（機能別）
### Webサーバー
ウェブページを提供します。
- **例**: Nginx, Apache

### データベースサーバー
データの保存、管理を行います。
- **例**: MySQL, PostgreSQL, MongoDB

### メールサーバー
電子メールを送受信します。
- **例**: SMTPサーバー, IMAPサーバー

### ファイルサーバー
ファイルの保存とアクセスを提供します。
- **例**: FTPサーバー, SMBサーバー

### アプリケーションサーバー
アプリケーションの実行環境を提供します。
- **例**: Node.js, Tomcat

### DNSサーバー
ドメイン名をIPアドレスに変換します。
- **例**: BIND, Unbound

## 参考
[サーバーとは？仕組みや種類・役割・用途をわかりやすく解説 - YouTube](https://www.youtube.com/watch?v=bPJuQI5Wdz0)
New Relicの基礎を30分で学べるオンライン講座！

New Relicの基本を学べる **「NRU101 - New Relic入門」** がリニューアルされました！
**オブザーバビリティの必要性** や **New Relicの基本的な使い方**を短時間で把握いただけます。
情報登録なしで視聴できるのでぜひ確認してみてください！


https://newrelic.com/jp/resources/presentations/nru101-2024


# 想定受講者
想定受講者は以下の通りとなりますが、いま実際にNew Relicを使っている方も視聴いただくことで意外な気づきがあるかもしれません。
- New Relic で何ができるのかを知りたい
- New Relic の実際の画面をみてみたい
- 自社の課題に New Relic が解決策となるかどうか感覚を掴みたい
- 社内のメンバーに習熟して欲しい

# NRU101の内容
1\. New Relicの基礎知識とオブザーバビリティについて
2\. オブザーバビリティの実践！ユースケース6選！
- ユーザーに言われて初めて障害に気づく状態をなくしたい
- パフォーマンス問題を横断的に早く切り分けしたい
- 環境変更が問題の原因になっていないか確認したい
- 多発しているエラーを見つけて優先的に対応したい
- 潜在的な脆弱性をいち早く見つけて堅牢性を高めたい
- いつもと異なる振る舞いをアラートで検知したい

3\. New Relicのはじめ方
4\. New Relic の学習を進める方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/f3780f5c-9bf9-196c-4415-2bf5ba485747.png)


:::note info
**↓↓↓ 動画リンクはこちら**
[NRU101 - New Relic入門](https://newrelic.com/jp/resources/presentations/nru101-2024) 
:::

# その他

New Relicでは、**NRU101 - New Relic入門** のような基本的な使い方以外にも、**新しい機能やその活用方法**について、QiitaやXで発信しています！

**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
【Visual Studio for Mac】2024年8月31日でサポート終了

## Visual Studio for Macのサポート終了

表題のままですが、Visual Studio for Macのサポートが終了したので、記録として残しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/90df8043-1fb3-5c00-0166-b5b4fd280995.png)

1年ほど前に、終了するとなったときのネットの記事がありましたが、割と静かに終了を迎えたみたいです。

公式情報へのリンクも共有しておきます。(リンク切れになった場合はご容赦ください)

https://learn.microsoft.com/en-us/visualstudio/releases/2022/what-happened-to-vs-for-mac?view=vsmac-2022

本日(2024/09/02)の時点ではまだダウンロードもできるみたいですが、既存のプロジェクトは移行を進めたほうが良さそうです。少なくともこれから新たに使うことは控えたほうが良いですね。
上記の記事では、Visual Studio Codeの拡張機能でサポートを継続する旨が書かれています。

私の場合は、Xamarin(現在サポート終了)を使用してスマホアプリの開発でよく使用しました。
（Xamarinの後継はMAUIなので）これからは、Visual Studio for Mac + [.NET MAUIの拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-maui)を使用して行く必要がありそうですね。

https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-maui
テストデータ入力画面をJSPで作成する方法

# テストデータ入力画面をJSPで作成する方法

## はじめに

今回は、テストデータを手軽に入力できる画面をJSPで作成していきます。特に、データ入力フォームをテーブル形式で整然と配置する方法について解説します。テーブル形式は、各フィールドを見やすく並べるのに適しており、ユーザーにとっても入力しやすい画面を提供できます。

## JSPコード例

以下のコードは、テーブル形式で作成されたデータ入力フォームです。このフォームでは、ユーザーが名前、メールアドレス、年齢、コメントを入力できます。

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>テストデータ入力</title>
</head>
<body>
    <h2>テストデータ入力画面</h2>
    <form action="SubmitDataServlet" method="post">
        <table border="1">
            <tr>
                <td><label for="name">名前:</label></td>
                <td><input type="text" id="name" name="name" required></td>
            </tr>
            <tr>
                <td><label for="email">メールアドレス:</label></td>
                <td><input type="email" id="email" name="email" required></td>
            </tr>
            <tr>
                <td><label for="age">年齢:</label></td>
                <td><input type="number" id="age" name="age" min="1" max="120" required></td>
            </tr>
            <tr>
                <td><label for="comment">コメント:</label></td>
                <td><textarea id="comment" name="comment" rows="4" cols="50"></textarea></td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center;">
                    <input type="submit" value="登録">
                </td>
            </tr>
        </table>
    </form>
</body>
</html>
```
## コードの解説

- **テーブルレイアウト**: 各入力フィールドは、テーブルの1行に配置されています。左側のセルにラベルを、右側のセルに入力フィールドを配置することで、整然としたレイアウトを実現しています。
- **`<td colspan="2">`**: 「登録」ボタンはテーブルの中央に配置されるよう、セルを2つ分結合して配置しています。

## まとめ

テーブル形式でのデータ入力画面は、ユーザーにとって視覚的にわかりやすく、入力がしやすいレイアウトです。フォーム作成時には、デザインの一部としてテーブルを活用することで、ユーザビリティの向上が期待できます。
【裏技】合法でSpotifyを無料で広告なし・シャッフル再生をオフにする方法

## はじめに

Spotifyを皆さんは聞きますか？自分は聞いています。

この記事ではSpotifyを無料(合法)で実質有料待遇になる方法を紹介します。

結論をとにかく知りたい人は下の方の結論を見てください。

## シャッフル再生をオフにする方法

Spotifyのシャッフル再生をオフにする方法は有料にするか、パソコンで聞くことです。パソコンで聞くと、なぜか、シャッフル再生はオフになります。

## 広告を消す方法

広告を消すブラウザがあります。自分はBraveを使っています。そのようなブラウザでWeb版のSpotifyを使ってみましょう。すると、当然のごとく、広告は消えます。

## 結論

2つくっつけると、広告をブロックするブラウザでWeb版のSpotifyをパソコンで聞くと、無料なのに有料待遇となります。みなさんもSpotifyライフを楽しみましょう！

---

この記事を読んでくれてありがとうございます！ぜひ、「いいね」と「フォロー」をお願いします。
KING OF TIMEのMyレコーダーの誤操作を防止する【拡張機能】

不必要なボタンを削除しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/d2b0b92b-9b4f-e9f3-21f3-6c92bcba3b6c.png)

出勤する前は、出勤ボタンだけが表示されます。
出勤した後は、休始ボタンだけが表示されます。
休始した後は、休終ボタンだけが表示されます。
休終した後は、退勤ボタンだけが表示されます。
退勤した後は、何も表示されません。

# インストール方法

Tampermonkeyに下記コードを貼り付けます

```js:kot.user.js
// ==UserScript==
// @name         Hide KoT Buttons
// @namespace    http://tampermonkey.net/
// @version      2024-09-02
// @description  try to take over the world!
// @author       You
// @match        https://s2.kingtime.jp/independent/recorder/personal/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=kingtime.jp
// @grant        none
// ==/UserScript==

function getObject(key) {
    return JSON.parse(localStorage.getItem('PARSONAL_BROWSER_RECORDER@' + key))
}

function getNames() {
    const user_token = getObject('SETTING').user.user_token
    const records = getObject('RECORD_HISTORY_' + user_token)
    const today = new Date().toLocaleDateString('sv').replaceAll('-', '')
    return records.filter(i => i.record_timestamp.startsWith(today) && i.status === 1).map(i=>i.name)
}

function hide(hiddenNames) {
    const buttonNames = getObject('SETTING').timerecorder.record_button.map(b => b.name)
    for(const i in buttonNames) {
        window.buttons.children[i].style.visibility = hiddenNames.includes(buttonNames[i]) ? 'hidden' : ''
    }
}

function f() {
    if (window.buttons.children.length !== 4) return
    observer.disconnect()

    const names = getNames()

    const hiddenNames = []
    if (names.includes('出勤')) {
        hiddenNames.push('出勤')
        if (names.includes('休始')) {
            hiddenNames.push('休始')
            if (names.includes('休終')) {
                hiddenNames.push('休終')
                if (names.includes('退勤')) {
                    hiddenNames.push('退勤')
                }
            } else {
                // 休終してないとき
                hiddenNames.push('退勤')
            }
        } else {
            // 休始してないとき
            hiddenNames.push('退勤', '休終')
        }
    } else {
        // 出勤してないとき
        hiddenNames.push('退勤', '休始', '休終')
    }
    hide(hiddenNames)
}

const observer = new MutationObserver(f)
observer.observe(window.buttons, { childList: true })

addEventListener('focus', f)
```
LinuxOS(Ubuntu)でNW設定(メトリック)を変更した備忘録

# 前置き
LinuxOSでNW設定を実施した時の備忘録です。

今回はメトリックについて設定変更した内容を記事としています。

**<背景>**
Linux操作時に接続したい無線IFの宛先へ疎通が取れなくなりました。
nmcliコマンドで確認すると無線、有線のIFはUPしておりPingは飛ぶ状態です。

**<解決>**
今回は接続させたいIFのメトリックを変更させたら問題の解決が出来ました。
無線IFのメトリックを有線IFより下げることで解決しました。
よってメトリックの設定変更を下記に記します。

:::note info
**metric(メトリック)**
NW関連で使用される言葉
優先度を表す
他IFおよび回線より **メトリックを下げることで優先度が上がる**
:::

# 作業1 メトリック値の確認

ルーティングテーブルで各IFのメトリック値を確認する
```
ip route
```
```
出力例

default via 192.168.153.2 dev ens33 proto dhcp metric 100 
169.254.0.0/16 dev ens33 scope link metric 1000 
192.168.153.0/24 dev ens33 proto kernel scope link src 192.168.153.128 metric 100 
```

# 作業2 無線IFのメトリックを設定
無線IF(例: wlan0)のメトリックを低く設定して優先度を上げる
```
nmcli connection modify nec-wifi-5.0G ipv4.route-metric 100
```
■ nec-wifi-5.0G は、無線接続のNAMEです。環境に応じて実際の接続名に置き換えてください。(nmcli connectionコマンドで確認可能)

■ ipv4.route-metric の値は100に設定していますが、この値は有線インターフェースのメトリックよりも低い数値で設定してください（通常、有線はデフォルトでメトリックが100より高く設定されています）。

# 作業3有線IFのメトリックを設定
有線インターフェース（例: eth0）のメトリックを無線よりも高く設定します。

```
nmcli connection modify Wired_connection ipv4.route-metric 200
```

■ Wired_connection は、有線接続のNAMEです。環境に応じて実際の接続名に置き換えてください。
■ ipv4.route-metric の値は200に設定していますが、無線のメトリックよりも高い数値で設定してください。

# 作業4設定反映

変更した設定を反映させるために、接続を再起動します。
```
nmcli connection down nec-wifi-5.0G
nmcli connection up nec-wifi-5.0G

nmcli connection down Wired_connection
nmcli connection up Wired_connection
```

# 設定反映確認
設定が正しく適用されたか確認するには、**nmcli connection show** を使って、各インターフェースの**ipv4.route-metric**が正しく設定されているかを確認してください。

また、**ip route** コマンドを使用して、ルーティングテーブルで無線インターフェースが優先されているか確認できます。

```
ip route
```
以上でメトリックの設定変更は終了です

皆さんの学習の参考になれば幸いです。

**蛇足**
NW設定関連で他記事も掲載しています。
初心者向けのNW設定関連の記事です。
参考にどうぞ

https://qiita.com/tacky0127/items/75c65dee17991e048a4c

https://qiita.com/tacky0127/items/fc64abe5483f432d15a1
【SwiftUI】Toggleのあるセルを行全体タップで値を切り替える方法

## こうする
``` swift
@State var isOn = false
~~~
 
    Toggle(isOn: $isOn, label: {
        Text("Toggle Test")
    })
    .contentShape(Rectangle())
    .onTapGesture {
        self.isOn.toggle()
    }

```

`.contentShape(Rectangle())` と `.onTapGesture` を一緒に書くことで、
行全体タップしたときに、Toggleの値を切り替えることができる。
行の中の空白部分をタップしてもイベントを拾うようになる。

### 環境
* Xcode 15.4 

### 参考
https://stackoverflow.com/questions/57191013/swiftui-cant-tap-in-spacer-of-hstack
Table内の3点リーダーってどういう仕組み？max-width: 0ってﾄﾞﾕｺﾄ？

# 3点リーダーとは
3点リーダー（省略記号）とは、テキストが長くてボックスの領域を超えてしまう場合に「...」でテキストを省略表示する手法です。

### 3点リーダーを実装するために必要な4つの設定
**1、ボックスの`width`の指定**
テキストが表示される領域の幅を指定します。

**2、`white-space: nowrap;`**
テキストの改行を禁止し、1行で表示します。

**3、`overflow: hidden;`**
テキストが表示される領域の幅を超えた場合、その超えた部分を隠します。

**4、`text-overflow: ellipsis;`**
非表示の溢れた部分を3点リーダー（...）で表示します。


<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="wvLoLXO" data-pen-title="Untitled" data-user="kidorina" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kidorina/pen/wvLoLXO">
  Untitled</a> by kidorina (<a href="https://codepen.io/kidorina">@kidorina</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

簡単に長いテキストを省略することができます。

# Table内での3点リーダーの挙動
Table内で3点リーダーを使用するときは、`display: table-cell;`、`max-width`、`width: 100%;` が混在することで、少し複雑な挙動になります。

## Table内で3点リーダーを実装する
Table内で3点リーダーを実装するには、上記4つの設定に加えて `max-width: 0;` を設定します。（widthは100%）
<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="Porbrax" data-pen-title="Table" data-user="kidorina" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kidorina/pen/Porbrax">
  Table</a> by kidorina (<a href="https://codepen.io/kidorina">@kidorina</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## どういう仕組み？
### `max-width: 0;` の役割
テーブルのカラムに max-width: 0; を指定すると、一見すると中のテキストがすべてオーバーフローするように思えますが、実際には以下の理由により正しく動作します。

### テーブルの特性
テーブルのカラムに `display: table-cell;` と `width: 100%;` を設定すると、テーブル全体の幅に応じてカラムの幅が調整されます。
このため、`max-width: 0;` が通常のボックスモデルとは異なる挙動になります。

### 条件下での `max-width: 0;` の動作
`max-width: 0;` が影響を及ぼすのは、**カラムの幅が中に含まれるテキストコンテンツの幅よりも狭くなった場合**です。
最大幅が0で設定されていることによって、カラムの幅が制約されてテキストが完全に表示されず、オーバーフローが発生します。

### `text-overflow: ellipsis` の効果
カラムがテキスト全体を表示できない場合、オーバーフローが発生します。
このとき、`text-overflow: ellipsis;` が設定されていることで、見切れたテキスト部分が省略記号「...」で表示されます。


# まとめ
Table内の3点リーダーの実装では、カラムの幅がテキストを超える場合に `max-width: 0;` があることでテキストのはみ出しを強制し、省略表示が可能になります。


# 参考
- [Why does this behave the way it does with max-width: 0?](https://stackoverflow.com/questions/26292408/why-does-this-behave-the-way-it-does-with-max-width-0)
Go言語：http.Get のレスポンスボディの処理で失敗

## どんな問題か

[net/http](https://pkg.go.dev/net/http) の Get などを使ってリクエストをかけた時、返ってきたレスポンスのボディは必ず閉じなければいけない、というのは、あちこちで言われていまして、わりとよく知られていることかと思います。
もちろん、[net/http](https://pkg.go.dev/net/http) のドキュメントにも、冒頭に書かれています。

> The caller must close the response body when finished with it:
```
resp, err := http.Get("http://example.com/")
if err != nil {
	// handle error
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
// ...
```

なので、上の [net/http](https://pkg.go.dev/net/http) のサンプルコードのように、__defer__ を使って、関数・メソッド終了時に処理するというのが定番です。
ただし、サンプルコードのように ```io.ReadAll(resp.Body)``` を使ってすぐにレスポンスボディを読み込むことを怠り、```resp.Body``` を別の処理にそのまま使おうとすると、まれに問題がおきます。次のコードのような場合です。

```
defer resp.Body.Close()
x, err := doSomething(resp.Body)
return x, err
```

上のコードだと、```doSomething``` の処理が瞬時に終わるようならおそらく問題は起きないと思いますが、処理の間、リクエストのコネクションはつながったままなので、時間がかかるようだと接続先の方からタイムアウトでコネクションを切断されていしまい、```doSomething``` の処理が失敗してエラーということが起こりえます。というか、起きました・・・（悲）。
こういうエラーが返ってきました。

```
read tcp [xxxx:xx:xxxx:x:xxxx:xxxx:xxxx:xxxx]:55555->
[yyyy:yyy:yyy:yy::yyyy:yyy]:443: read: connection reset by peer
```

コードを書いた当初、このエラーは起きませんでした。
複数のリクエストを、順番に、前のリクエストの処理が終わってから、次のリクエストをかける、というやり方から、時間短縮のため、Goroutine を使って同時にリクエストをかけるように変更したところで、時折エラーが出るようになりました（時折、というのがすごく嫌）。
もともと、レスポンスボディに含まれる処理対象のデータが数メガバイトとやや大きめだったことに加え、同時にリクエストをかけるようになったことによる処理の競合やその時時の通信状況が影響したと考えられます。
以下のように修正して対処しています。

```
defer resp.Body.Close()
b, err := io.ReadAll(resp.Body)
if err != nil {
	return err
}
x, err := doSomething(bytes.NewBuffer(b))
return x, err
```

横着はするもんじゃないですね。自戒、自戒。
3年分の学費・奨学金で大学卒業する(ブループリント)


# Prelude


わたしは筑波大学、理工学群の物理学類に所属しています。
2022年に入学し、2022年の秋学期から2024年の秋学期まで2年休学していたのですが、あることに気がつきました。

なんと、**2023年度で1単位も取得していないにもかかわらず、3年次になっていた** のです。


これは、わたしの所属する物理学類には3年次まで進級要件がないためです。
そこでわたしは考えました。

**復学した時に3→4年次の進級要件さえ満たしていれば、実質3年で卒業できる**ではないかと。





# 3年で卒業するメソッド



## 1. 年間単位取得制限のハック

皆さん思われたのではないでしょうか。
「年間単位取得制限があるじゃないか」と。

しかし、 **「秋学期から一年間休学し」「秋学期に復学する」** ことで、半年で年間取得上限まで単位を取ることができます。

つまり、**半年で1年分の単位取得を2回こなす**ことで、実質一年分の学費で2年分の単位を取ることができます。

(ちなみに国公立大学であれば休学は無料のはずです、弊学の4年間の学士課程では最大3年まで休学が可能でした)



## 2. 実現のために

### 2年分の授業をまとめて取るの大変じゃない？
頑張ってください。

一般論ですが、2・3年の授業を一緒に取るよりも、1・2年の授業をまとめて取った方が楽だと思います。

### 休学したら奨学金止まるけど生活どうしよう？
頑張って働いてください。プログラミング得意ならインターンおすすめです。

休学中に勉強するのもいいですよね。わたしは一年間の休学中にプログラミングを勉強してちょっとできるようになりました！



## 3. 単位の皮算用・わたしのケース

わたしの場合、これに気づいたのが休学後だったので、休学前の半年では20.5単位しか取れていませんでした。

しかし、3→4年次の単位数の進級要件は95単位です。

そして、弊学の年間履修上限は45単位(申請すれば50単位)なので、今年の秋学期で30単位以上取り、さらに来年45単位取得すれば3年卒業を目指すことができます。

今年は1・2年の必修をなるべく抑えつつ、集中・春休み中に開講される授業で補えるものは補ってなんとか時間割に38単位突っ込みました。





# おわりに
ジャストアイデアですがどなたかのお役に立てれば幸いです。
わたしは復学して半年で1年分の単位をとってきます；；

4年かかることには違いないですがかかる学費・奨学金を減らせます。

皆さんの良い将来を願っています。

※各大学の事務の方によく確認してください。
※わたしはこの記事が原因で起こったトラブルについてはどんなものでも一切責任を負いません。自己責任でやってください。
実践curlコマンド

## curlコマンドとは？

HTTPリクエストをコマンドラインで実施し、その内容を標準出力することができます。

基本形

```shell
curl [options] [URL]
```

なお、サンプルのコマンドでは間違えて実行しても問題ないように、URLとして https://cloudool.com を利用しています。（自分が管理しているサービスなので、実行してもいいけど悪意のある大量実行はご遠慮ください。）

```shell
curl https://cloudool.com
```

## よく使うオプション（主観）

### -A

概要：
User Agentを指定。

コマンド例：

```shell
curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot)" -I https://cloudool.com
```

個人的な利用シーン：
Botの制限をした際の動作確認。

### -I

概要：
ヘッダ情報を取得。

コマンド例：

```shell
curl -I https://cloudool.com
```

個人的な利用シーン：
curlコマンドを利用するときは当たり前につけている。

### -L

概要：
要求したページにリダイレクトが掛かっていた場合に追従する。

コマンド例：

```shell
curl -L https://cloudool.com | grep -e ^Location: -e ^location: 
```

個人的な利用シーン：
リダイレクト設定をした際の確認。

### --resolve

概要：


コマンド例：

```shell
curl --resolve "cloudool.com:443:35.79.77.69" https://cloudool.com
```

個人的な利用シーン：
DNS切り替え前の環境へのHTTPアクセス確認。

### -u

概要：
Basic認証などの認証に用いるユーザー名とパスワードPASSを指定する。

コマンド例：

```shell
curl -u user:password https://cloudool.com
```

個人的な利用シーン：
Basic認証があるページの確認。

### -v

概要：
Webサーバーから取得した情報を詳細に表示してくれます。
SSL情報を確認したい際にはgrepと組み合わせることで効率よく確認できます。

コマンド例：

```shell
curl -v https://cloudool.com 2>&1 | grep -E "subject|issuer|start date|expire date|common name"
```
OpenAI APIを使用し画像を送信する


OpenAI APIを使用して、画像の送信方法を紹介します。

## 実施環境
| 環境 | バージョン |
|:-:|:-:|
| OS |  Windows11 |
| Python|  3.11.0 |
| OpenAI Python API library|  1.43.0 |

## 事前準備
#### APIキーの準備
OpenAIの公式サイトからAPIキーを取得してください。

https://openai.com/

---

#### OpenAI Python API libraryインストール
``` 
pip install openai
``` 
https://pypi.org/project/openai/

## Web上の画像の送信
Web上にアップロードされている画像の送信方法です。「IMG_URL」に画像のURLを記載してください。また、「YOUR_API_KEY」に事前準備で取得したAPIキーを記載してください。
``` imgOpenAi.py
from openai import OpenAI

client = OpenAI(
    #事前準備で取得したAPIキー
    api_key = "YOUR_API_KEY",
    base_url = 'https://api.openai.com/v1/chat/completions'
)
res = client.chat.completions.create(
    model = "gpt-4o-mini",
    messages = [
        {
            "role":"user",
            "content":[
                {
                    "type": "text",
                    "text": "画像に書かれている文字は何ですか？書いている文字だけ教えてください"
                },   
                {    
                    "type": "image_url",
                    "image_url":
                    {
                        #画像のURL
                        "url": "IMG_URL"
                    } 
                }
            ]
        }
    ]
)

print(res.choices[0])
```



## ローカル画像の送信
ローカル画像の送信は、画像をBase64形式に変換することで送信できます。
``` localimgOpenAi.py
import base64
from openai import OpenAI

#画像をBase64形式に変換する関数
def encode_image(image_path):
  with open(image_path, "rb") as image_file:
    return base64.b64encode(image_file.read()).decode('utf-8')

#画像をBase64形式に変換
img = encode_image(image_Path)

client = OpenAI(
    #事前準備で取得したAPIキー
    api_key = "YOUR_API_KEY",
    base_url = 'https://api.openai.com/v1/chat/completions'
)
res = client.chat.completions.create(
    model = "gpt-4o-mini",
    messages = [
        {
            "role":"user",
            "content":[
                {
                    "type": "text",
                    "text": "画像に書かれている文字は何ですか？書いている文字だけ教えてください"
                },   
                {    
                    "type": "image_url",
                    "image_url":
                    {
                        #画像のURL
                        "url": f"data:image/png;base64,{img}"
                    } 
                }
            ]
        }
    ]
)

#受信したメッセージを表示
print(res.choices[0])

```

## 最後に
OpenAI APIを使用して画像を送信するコードを実装してみました。ローカル環境の画像も送信することができるため、とても便利だと感じました。
アップロードできる画像サイズは20MBまでなので注意してください。

この記事を今後の参考にしていただければ幸いです。ありがとうございました。

## 参考情報
https://platform.openai.com/docs/guides/vision
“音が聞こえない” 逆位相の対処法

動画の音が正しく聞こえないとき、
様々な原因が考えられますが、そのうちの1つが**逆位相**です。

## こんなとき、もしかしたら逆位相かも

* 動画の中で**特定の音源だけ**が聞こえない
* 自分の環境では音が聞こえるのに、**他の人の環境**では聞こえない
* 聞こえるけれど、いつもより**ぼんやりした音**に感じる

## 逆位相ってなに？

逆位相は基準となる波形に対して180度反転した波形のことで、
ステレオで収録する際のマイクの設定等で起こってしまう事象です。

![位相.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821910/3cbba8a5-b209-e3a3-9a3b-d121cee37adb.png)

これをモノラルで再生すると2つの波形が重なり、
**打ち消し合ってしまう**ことで音が聞こえなくなってしまいます。
※ ノイズキャンセリングはこの仕組みを利用して意図的に音を打ち消しています。

ステレオで再生するとこの波形が左右に分かれたまま再生されるため、
本来とは違うややぼんやりとした聞こえ方にはなりますが、
音が聞こえなくなることはありません。

動画を視聴するデバイスの種類や設定、イヤホン等によって、
つまり**ステレオで再生されるか**、**モノラルで再生されるか**で
聞こえたり聞こえなかったりしてしまうのです。

## 逆位相が起きてしまった場合の対処法

逆位相が起きないように収録時に気を付けることはもちろんですが、
それでも起きてしまった場合にできる対処法を紹介します。

### 1. 再現する

まずは自分の環境で音が聞こえない状態を確認できるようにしましょう。
PCの設定を切り替えるのが手っ取り早いです。

:::note info
Macの場合、システム環境設定から `アクセシビリティ` → `オーディオ` → `ステレオオーディオをモノラルとして再生` をONにします。
:::

### 2. 修正する

Premiere Proのエフェクトを使うことで、簡単に修正することが可能です。

1. エフェクトから `チャンネルミキサー` をクリップに適用
1. エフェクトコントロールパネルから `カスタムセットアップ` の編集をクリック
1. 左右（LR）のどちらかの `反転` にチェック

![チャンネルミキサー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821910/bb7f0c5b-b6d3-ee2b-1acc-89da5dab71a2.png)

反転していた波形をさらに反転させることで本来あるべき形にすることができます。

## まとめ

音は再生される環境によって聞こえ方に差が出てしまいやすいので、
編集の時点で複数の環境でチェックすると安心です。

また、編集が進んでから気付いてしまうと修正するのが大変になります。
最初にしっかり音源を確認するように気を付けましょう！
2024年9月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2024年9月2日の検索結果 (リスティング広告)

![スクリーンショット 2024-09-02 140538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/e9b7cbe7-6ffa-e458-ff52-107d05dd4c7b.png)

* IBM
* Dynatrace

今月は IBM と Dynatrace の 2社のみでした。

先月の結果はこちら --> [2024年8月 AIOps 定点観測](https://qiita.com/mkodera/items/3f9a4a515b5bf4dcf58c)

# 2024年9月2日の検索結果 (広告以外)

![スクリーンショット 2024-09-02 140623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/ef641061-d22b-83ef-727e-28df453b1719.png)

* HPE
* AWS
* Splunk
* IBM
* Monster Lab

HPE が不動のトップで AWS と Splunk が続いています。

先月の結果はこちら --> [2024年8月 AIOps 定点観測](https://qiita.com/mkodera/items/3f9a4a515b5bf4dcf58c)
LinuxOS(Ubuntu)のNW設定(新規IF設定-IP設定)の備忘録

# 前置き
Linuxを操作している際にNW設定をやるコマンドをよく忘れてしまうため備忘録として残します。

本記事は新規にIF(インターフェイス)の設定を行い、DHCP(自動割り振り)および固定設定を記事とします。

# 作業1 nmcliコマンドの使用可能確認

今回のNW設定は**nmcli**コマンドで実施します。
事前準備としてこのコマンドが使用できるか確認します。

```
systemctl status NetworkManager.service
```
```
結果 -active(running)と帰ってくればOK-

● NetworkManager.service - Network Manager
     Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendo>
     Active: active (running) since Mon 2024-09-02 00:20:11 JST; 13h ago
       Docs: man:NetworkManager(8)
   Main PID: 856 (NetworkManager)
      Tasks: 3 (limit: 9382)
     Memory: 10.9M
        CPU: 2.242s
     CGroup: /system.slice/NetworkManager.service
             └─856 /usr/sbin/NetworkManager --no-daemon
```
起動していなければ、起動させます
statusで確認してactive(running)してればOKです
```
systemctl start Network Manager.service
```

もし、実行環境にコマンドがないとエラーが出たらパッケージをインストールして実行させます。
インストールコマンドはディストリビューションによって変わります。

**Debian/Ubuntu系:**
```
sudo apt-get update
sudo apt-get install network-manager
```
**Red Hat/CentOS/Fedora系:**
```
sudo yum install NetworkManager
```
**NetworkManagerの起動:**
```
sudo systemctl start NetworkManager
sudo systemctl enable NetworkManager
```
以上で、事前準備は終了です。

# 作業2 DHCP(自動割り振り)設定

■ 新しい接続を作成する:
今回はSSID:「nec-wifi-5.0G」に接続します。
・ifname は、無線インターフェースの名前を指定します（例えば wlan0）。
インターフェース名は環境に応じて異なる場合がありますので、適宜確認して使用してください。

```
nmcli connection add type wifi ifname wlan0 con-name nec-wifi-5.0G ssid nec-wifi-5.0G
```
■ Wi-Fiのパスワードを設定する:
・Wi-Fiのパスワードを設定します。以下は仮のパスワードとして your_password を使用しています。

```
nmcli connection modify nec-wifi-5.0G wifi-sec.key-mgmt wpa-psk wifi-sec.psk your_password
```
■ 接続を有効化する
・作成した接続を有効にします

```
nmcli connection up nec-wifi-5.0G
```
以上でDHCP設定は終了です。

# 作業3固定設定

■ 新しい接続を作成する:
・DHCPと同じように、SSID「nec-wifi-5.0G」に接続する設定を作成します。

```
nmcli connection add type wifi ifname wlan0 con-name nec-wifi-5.0G ssid nec-wifi-5.0G
```

■ Wi-Fiのパスワードを設定する:
・DHCP設定と同様に、Wi-Fiのパスワードを設定します。

```
nmcli connection modify nec-wifi-5.0G wifi-sec.key-mgmt wpa-psk wifi-sec.psk your_password
```

■固定IPアドレスを設定する
・固定IPアドレス、ゲートウェイ、およびDNSサーバーを設定します。以下は仮の例として使用しています。
```
nmcli connection modify nec-wifi-5.0G ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8
```

・ipv4.addresses には固定したいIPアドレス（例: 192.168.1.100/24）を指定します。
・ipv4.gateway にはデフォルトゲートウェイ（例: 192.168.1.1）を指定します。
・ipv4.dns には使用するDNSサーバー（例: 8.8.8.8）を指定します。

■接続を有効化する
・作成した接続を有効にします。

```
nmcli connection up nec-wifi-5.0G
```

以上で固定の設定は終了です。
お疲れ様でした。

DHCPおよび固定IP付与の設定方法について記事でまとめました。
日々の学習の参考にしていただければ幸いです。

**蛇足**
NW設定関連の記事を他にも書いていますのでよければ参考にどうぞ

https://qiita.com/tacky0127/items/fc64abe5483f432d15a1

https://qiita.com/tacky0127/items/704ae1e171def56677ab
JavaGold 例題 乱数

以下のコードについて適切な選択肢を選んでください

```java
import java.util.Random;

public class Example {
    public static void main(String[] args) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            sb.append(random.nextInt(10));
        }
        System.out.println("Generated password: " + sb.toString());
    }
}
```

1. コンパイルエラー
1. 実行時エラー
1. ランダムな出力結果が出るが、問題がある
1. ランダムな出力結果が出る、特に問題はない

<details>
<summary>解答</summary>
3:<br>
このコードは、Randomクラスを使用して10桁の数字からなるパスワードを生成しますが、Randomクラスは予測可能な乱数を生成する可能性があるため、セキュリティが重要な場面では不適切です。<br>
SecureRandomクラスを使用して、予測困難な乱数を生成することが推奨されます。

[`雑則MSC MSC02-J. 高品質の乱数を生成する `](https://www.jpcert.or.jp/java-rules/msc02-j.html)

</details>


https://qiita.com/T-ngtj/private/df254aacd05be698199a
[メモ] 新規投稿テストをかねたメモ

#### 新規投稿テスト
Qiita始めました。
主にPHP Laravel の投稿がメインになると思います。
いい歳していまだにプログラミングから離れられません。

宮崎県在住です。仕事がありません。
統合失調症持ちです。
やれることをやれる範囲でやろう。

[メモ]
<a href="https://www.youtube.com/playlist?list=PLCyDm9NTxdhJYNEcbTzq0cey5qEeGwK-3">【PHP初級】画像アップロードの仕組みとDB作成 ~画像アップロード機能を作る~</a>
<a href="https://www.youtube.com/watch?v=3QxtIrakwKk&t=2547s">【PHP入門】2ちゃんねる風掲示板を作りながら学ぶPHP入門講座</a>
TiDB 関連イベント 9月分

9月になりました。学習の秋の始まりです！

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。
WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。

イベント/社内勉強会でTiDBについて話してほしいというリクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までご連絡ください。

## TiDB User Dayのアーカイブ視聴が可能になりました！

https://pingcap.co.jp/tidb-user-day/

7月3日に行われたTiDB User Dayのセッションアーカイブが公開されました。是非登録して御覧ください。

## ウェビナー: TiDB 8.2 DMR新機能の紹介

https://pingcap.co.jp/event/tidb-8-2-dmr-new-features/

TiDBの開発バージョンである8.2 DMRの新機能について解説するウェビナーです。講師はおなじみPingCAP本田さんです。

## Serverless Days Tokyo 2024

https://pingcap.co.jp/event/serverlessdays-tokyo-2024/

今年もServerlessの秋がやってきました！PingCAPも協賛して、TiDB Serverlessを活用したServerlessな事例について毎日放送様、BACKSTAGE様に発表頂きます。また、二日目にはTiDB Serverlessのワークショップも開催します。是非お越しください。

- Day1参加登録: https://serverless.connpass.com/event/325659/
- Day2ワークショップ登録: https://docs.google.com/forms/d/e/1FAIpQLScZfzNOo2hpNPTv_DLQmlUOGkfGNSv3436KkkGbTZFgCjHjQg/viewform

※ Day2のワークショップはDay1の登録が必要なので気をつけてください


## Tokyo Game Show 

https://pingcap.co.jp/event/tgs2024/

今年もビジネス・デイでブースを出店しています。毎回ノベルティも考えていますので、
TGSにお越しの際には是非お立ち寄りください。デモもあるかも？
Progateハッカソン powered by AWS & Supabaseに出場しました!【感想】

## プロゲートハッカソンの感想
とにかく作りたいものがみんなで完成できたのが嬉しかったです。コードも短期間でかなり書いたので体力がついたと思います。

形式はキックオフがオンライン、本番の2日間（8/31,9/1）がオフラインとなっており、開発期間としては1０日ほどありました。
会場が広く、おしゃれな雰囲気だったためリラックスして開発できました。
審査基準でデモの完成度や技術的な観点を重きに置く方針がとても良いなと思いました。

また、メンターの方がとても豪華でお話をたくさん聞けてよかったなと思います。
awsエンジニアの方によるデモアプリデプロイの手順説明や、supabaseエンジニアの方の業務の話を聞けたりしたのはハッカソン以上に本当に貴重な経験でした。


*ハッカソンテーマは緩く、今回は「超（スーパー）」でした。
また、個人的に強烈だったのは本番2日間AWSのサービス使い放題、という点です*

https://progate.connpass.com/event/325329/

*会場は AWS Startup Loft Tokyo*　

![EC0A732E-4FB2-45DD-B571-CE91B59A6C77.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486141/baff40fa-49c8-e5f8-4f65-e792ad3f1044.jpeg)

## 開発したもの

「エンジニアが欲しいサービスの詰まった時間管理アプリ」です。

以下に詳細が載っています

https://topaz.dev/projects/2a347bfb33c69864d02e

技術スタックはこんな感じで、Rust（Actix-web）はチームメンバー初挑戦でした笑
バックエンド実装には関わらなかったのですが、Rustコードを読む経験ができてよかった！
また自分はフロントを9割型担当していました。その中でも学びが多く、今後の開発に活かせそうです。
学んだことは記事にもしたいと思います。

![スクリーンショット 2024-09-01 19.49.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486141/a7defb1a-7d4d-c78b-7f8a-22d75e3f8091.png)


*Topページ*
![スクリーンショット 2024-09-01 14.18.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486141/039df461-cb32-bdc6-d892-0c6ec9e2c25c.png)

自分的に最大のアクシデントは最終日前日の深夜にビルドエラーが出てアプリがデプロイできなくなったことでした（笑）
以下の脳筋技で解決したのでNext.js（ver13approuter）でハッカソンに挑む方はもしかしたら参考になるかもです。

https://qiita.com/kaitoppp/items/c957fb720be99a4cc24d

*お気に入りはQiitaのURLを入力するとずんだもんが読み上げてくれる機能*
![スクリーンショット 2024-09-01 20.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486141/c9fac519-1f65-122d-bab2-b4d2ef112451.png)



## 結果
優秀賞🥈を取ることができました。徹夜したのが報われてよかった！

また、ハッカソンに出場することで同じ世代の学生エンジニアの知識や発想を知ることができる点は個人的に醍醐味だと思っています。
今回のハッカソンも面白いアイディアや、逆に自分と同じような発想があり、刺激的でした。
また10月にもハッカソンに出る予定なのでそれまでに技術力はもちろん、発想力も高めていきたいです
PostgreSQL: AlmaLinux9 へのインストール

こちらの指示の通りに行います。
[Linux downloads (Red Hat family) ](https://www.postgresql.org/download/linux/redhat/)

```bash
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql16-server
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16
```

インストールされて動いていることの確認

```text
$ sudo systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: active (running) since Mon 2024-09-02 12:36:47 JST; 13min ago
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 1905 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 1910 (postgres)
      Tasks: 7 (limit: 201100)
     Memory: 20.4M
        CPU: 521ms
     CGroup: /system.slice/postgresql-16.service
             ├─1910 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
             ├─1911 "postgres: logger "
             ├─1912 "postgres: checkpointer "
             ├─1913 "postgres: background writer "
             ├─1915 "postgres: walwriter "
             ├─1916 "postgres: autovacuum launcher "
             └─1917 "postgres: logical replication launcher "

Sep 02 12:36:47 alma9 systemd[1]: Starting PostgreSQL 16 database server...
Sep 02 12:36:47 alma9 postgres[1910]: 2024-09-02 12:36:47.735 JST [1910] LOG:  redirecting log output to logging collector process
Sep 02 12:36:47 alma9 postgres[1910]: 2024-09-02 12:36:47.735 JST [1910] HINT:  Future log output will appear in directory "log".
Sep 02 12:36:47 alma9 systemd[1]: Started PostgreSQL 16 database server.
```

## ユーザーで接続

```text
$ psql -U postgres
Password for user postgres: 
psql (16.4)
Type "help" for help.

postgres=#
```

## 設定ファイル

```text
/var/lib/pgsql/16/data/pg_hba.conf
```

## データベースとユーザーの作成

```text
$ sudo -u postgres psql
Password for user postgres: 
psql (16.4)
Type "help" for help.

postgres=# create database city;
CREATE DATABASE
postgres=# create user scott with encrypted password 'tiger123';
CREATE ROLE
postgres=# grant all privileges on database city to scott;
GRANT
postgres=# \c city
You are now connected to database "city" as user "postgres".
city=# grant all privileges on schema public to scott;
GRANT
city=#
```

## 作成したユーザーで接続

```text
$ psql -Uscott city
Password for user scott: 
psql (16.4)
Type "help" for help.

city=> create table cities (id varchar(10) primary key, name text, population int, date_mod date);
CREATE TABLE
city=> insert into cities values ('t3461','広島',72814,'2001-9-14');
insert into cities values ('t3462','福山',41738,'2001-7-21');
INSERT 0 1
INSERT 0 1
city=> select * from cities;
  id   | name | population |  date_mod  
-------+------+------------+------------
 t3461 | 広島 |      72814 | 2001-09-14
 t3462 | 福山 |      41738 | 2001-07-21
(2 rows)

city=>
```
SQL 「ORDER BY」取得順序について

新人エンジニアの三上です。
今回は、Junit のテスト（DB への insert 処理あり）をローカル(PostgreSQL)で実施した場合と、Azure(SQL Server) で build した場合に不一致となり、エラーの原因調査に時間がかかるということがあったので、その原因と解決策を書いていこうと思います。

## ORDER BY
SQL の SELECT文に「ORDER BY」句を使用することで、レコードの取得順序を指定することが出来る。

以下のようなレコードを登録している状態で、実際に使用した結果、取得されるレコードを例示する。

#### sample テーブル
|record_no|register_info|register_dt|
|:----:|:----:|:----:|
|1|AAA|2024-08-31|
|2|BBB|2024-09-01|
|3|CCC|2024-08-30|

```SQL:SQL
SELECT record_no, register_info, register_dt
FROM sample
ORDER BY register_dt ASC;
```
上記の Query により取得されるレコードを以下に示す。
#### 取得レコード
|record_no|register_info|register_dt|
|:----:|:----:|:----:|
|3|CCC|2024-08-30|
|1|AAA|2024-08-31|
|2|BBB|2024-09-01|


## 重複日付のレコード出力順序
以下のように登録日付が重複しているレコードに対して、「ORDER BY」句を使用するとレコードの取得順序はどうなるか？

#### sample_duplication
|record_no|register_info|register_dt|
|:----:|:----:|:----:|
|1|AAA|<font color="red">2024-08-30|
|2|BBB|<font color="red">2024-08-30|
|3|CCC|<font color="red">2024-08-30|

```SQL:SQL
SELECT record_no, register_info, register_dt
FROM sample
ORDER BY register_dt ASC;
```

結果は、使用環境に依存する。

## 解決策
解決策として実際に使用したのは、Junit の insert 処理の際に登録日付を同じものにしない。
もう1つ考えられるものとしては、「ORDER BY」句に指定するカラムを追加するというものである。
そうすることで、1つの条件に依存せず、想定通りにレコードを取得することができる。

## まとめ
ローカルではテストが成功するが、開発環境で biuld するとエラーを起こすとき、
DBを使用するテストでエラーを起こしている場合、レコードの取得順序を疑ってみて欲しい。
hamlでリンク先に飛べるボックスを作る方法

# はじめに
今回は、railsにてhamlを用いてXのリンク先に飛べるボタンを作り方を簡単にまとめたいと思います。

# １.HAMLでのリンク生成
まず、HAMLファイルでリンクを生成する方法についてです。
以下のコードでXとInstagramとTikTokリンクに飛べる箱ができます。
```
= link_to 'X', '<XのURL>', target: '_blank', class: 'box', rel: 'noopener'
```
###### 簡単な説明
* link toヘルパーで指定したテキストが表示されます。上記の場合「X」のテキストで表示されます。
* link  toの隣にリンク先のURLを記入します。（直接記入する場合）
* target: '_blank'　で新しくタブを開いて表示してくれます。
* class　でcssを適応させるようにします。
* rel: 'noopener'　も追加することでセキュリティを向上させることができます。

# ２. コントローラー設定
hamlで直接リンクを挿入した場合、コントーラーファイルに以下のコードを設定する必要があります。
```
@talent.x_url = '<XのURL>'
```

# ３. cssでスタイルの定義
以下のcssは基本的なスタイルになります。
あとは好みで追加してください！
```
.box {
  padding: 10px 20px;
  border: 1px solid #777;
  text-align: center;
  color: #333;
  padding: 8px;
}
```

# まとめ
この記事では、Ruby on Railsを使用して、リンク先に飛べるものを作成する方法をご紹介しました。簡単なコードですが、実際のプロジェクトで多様に応用できる要素です。ぜひ使ってみてください。
MySQL - テーブルの1カラムの照合順序を変更するクエリ例

# 例


```sql
ALTER TABLE example_table MODIFY `column_name` VARCHAR(255) COLLATE utf8mb4_bin
```

## 注意

元のカラムにNULL制約などがついている場合は、改めて指定しなければいけない

```sql
ALTER TABLE example_table MODIFY `column_name` VARCHAR(255) COLLATE utf8mb4_bin DEFAULT NULL
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Scratch ライブラリ（横スクロール）

# Scratch ライブラリ（横スクロール）

誰が待ってるか分かりませんが、お待ちかね、横スクロールです。同じ画像をループさせる簡単な横背景スクロールですが、結構いい感じに使えます。

良くあるスクロール系は単に横方向にスクロールするだけの感じですが、ここではある程度上下にも動かすことによって**より広がりのある表現**になっています。

* 同じ背景でずっと横スクロールを表現
* 左右だけでなく上下に追加の背景画像を用意することにより、上下への部分的なスクロール拡張も可能
* スクロールスピードの動的な変更も可能

# 横スクロール

## プロジェクト

ここにあります。

https://scratch.mit.edu/projects/1060488960/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/a3825b22-c8c2-62f0-3dce-8a76c617f072.png)


## ライブラリ概要

横スクロール機能の機能のライブラリ化です。

## 使い方

### 基本

* 'Background Speed' 変数でスクロール速度を変更します
* `Background Y' 変数をコントロールし、プレイヤーの位置を調整します
    * 動きがこのままで良ければ、プレイヤーのコードはサンプルをそのまま使えます
* 背景画像を差し替えて任意の背景でスクロールさせます
    * 背景画像はそれぞれ左右 20px が重なるようにコントロールされています
    * それぞれの左右 20px が同じ画像になるようにしてください

## 各種情報

### 変数・リスト
> In: 他スプライト管理の値を参照／Out: 本スプライトで設定

| 変数名 | In/Out |        概要        |
| ------ | :----: | ------------------ |
| `Background Speed (Initial)` | Out | スクロールスピードの初期値|
| `Background Speed` |   In   | スクロール速度 |
| `Background Y` |   In   | 上下移動用 Y 座標補正値 |
| `Background Up/Down Available Area Size` | Out | 上下移動幅の限界サイズ |

### イベント

特になし。

### コスチューム

スクロール用に使う背景画像です。

| 背景画像名 |             概要             |
| :--------------: | ---------------------------- |
| Background1  | 背景画像1 |
| Background2  | 背景画像2 |

## 拡張ポイント

### 背景画像

* 背景画像 1, 2 の左右 20px が重なるように画像を作成してください
* 上下移動用に必要な幅の画像を付けておいてください

### 初期設定値の変更

以下の値を Initizalize ブロック定義の中でしているので、必要に応じて書き換えてください。

|変数名|概要|備考|
|:---|:---|---|
|`Background Speed (Initial)`|スクロールスピードの初期値|マイナスで左スクロール|
| `Background Up/Down Available Area Size` | 上下移動幅の限界サイズ | 正の整数で最大 360 までです |

---

同じ要領で縦スクロールも簡単にできた（実現済な）ので、近々いけそうです。では。

---

> [Scratch ライブラリと Scratch Tips 目次へ戻る](https://qiita.com/Kray-G/items/e1900d5b6c6dcfbe5321/)
【ChatGPT＋Code Interpreter】でPDFの指定ページの後ろに、指定したPDFを挿入する。


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

　今回は、PDFの指定ページの後ろに、指定したPDFを挿入します。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　台風で家にこもっていたら
　　いつのまにか9月ですわ😅

　ニュースはありませんので、
　　さっそく本題です。

　今回は、
　　PDFの指定ページの後ろに、
　　　指定したPDFを挿入します。

　Promptの記述が
　　少し変わります。

　最初に、
　　Code Interpreterの使用を
　　　宣言してきましたが、
　　　　具体的な指示のあとに
　　　　　移動しました。

　これは
　　何かの仕様変更なのか
　　　ChatGPTさんが
　　　　Code Interpreterを使おうと
　　　　　しなくなったためです。

　前のPromptのままでは
　　Code Interpreterへと渡さずに
　　　さも“作りましたよ”と
　　　　言わんばかりに
　　　　　ダウンロードリンクを
　　　　　　表示してきますが、
　　　　　　　ダウンロードは
　　　　　　　　できませんでした。

　何度もトライしたのですが
　　ダメでした。

　そのために
　　PromptのCode Interpreterの
　　　使用宣言を移動しました。
***
　手順です。

　ここでは
　　もとのPDFの2ページ目の後ろに
　　　次のPDFを挿入します。

　手順は
　❶GPT-4oであることを確認
　❷ふたつのPDFをアップロード
　　　順番を間違えないでください。
　❸Prompt入力
```Text:
最初のPDFの2ページ目の後ろに、次のPDFを挿入してください。

CodeInterpreterを使用する。
コード不要。
必ず実行してください。
```
　❹送信
　❺ダウンロードリンクが表示

　これでダウンロードして
　　内容を確認すれば
　　　出来上がりです。

　今回も
　　日本語フォントは
　　　使いませんでした。

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

　今回は、ここまで。
【計算科学】浮動小数点における数値誤差についてまとめた

## これは何?
コンピュータを使った計算を行うと，実際の計算と異なる結果が得られることがあります。
これはコンピュータが有限ビット数を使って計算している関係上，特定の数値を完全に表現することはできません。
例えば，1/3は数学では正しく表現できますが，コンピュータでは0.3333333333333333333333333333333...と表現するため，有限の値で表現されます。

本記事ではよく発生する浮動小数点の誤差についてまとめました。

---

## 丸め誤差(round error)

> [計算と誤差](https://www.ritsumei.ac.jp/se/rv/joen/program06/program2_06.html)
コンピュータは、10進数を2進数になおして記憶する。このとき、小数点以下を含む10進数は、2進数に変換される時に変換誤差を生ずる。これが丸め誤差という。

具体例をpythonで書いてみました。pythonのfloat型では扱える小数点の数は15桁となっているので丸め誤差を発生させてみます。

```python3
print((1.3 + 1.6) / 2) # 発生しない例
print((1.000000000000003 + 1.000000000000006) / 2)
print((1.0000000000000003 + 1.0000000000000006) / 2)
```

```
1.4500000000000002
1.0000000000000044
1.0000000000000004
```

このように，本来.45まで表示されるはずが，丸め誤差が発生していることがわかります。

---

## 情報落ち(loss of trailing digit)

> [コトバンク](https://kotobank.jp/word/%E6%83%85%E5%A0%B1%E8%90%BD%E3%81%A1%E8%AA%A4%E5%B7%AE-1728933)
> 情報落ち誤差（読み）ジョウホウオチゴサ
デジタル大辞泉 「情報落ち誤差」の意味・読み・例文・類語
じょうほうおち‐ごさ〔ジヤウホウおち‐〕【情報落ち誤差】
コンピューターの浮動小数点演算で、絶対値が大きい数値と小さい数値の加算・減算をした時に、絶対値の小さい数値が無視されてしまう現象。有効桁数が限られた仮数部の演算で生じる。


```python3
print(1.3 + 0.01) # 発生しない例
print(1.3 + 0.0000000000000001)
```

```
1.31
1.3
```

実際には1.30000000000000001となってほしいところが
1.3になってしまいました。

---

## 桁落ち(cancellation)

> [計算と誤差](https://www.ritsumei.ac.jp/se/rv/joen/program06/program2_06.html)
> 有効数字のうち、大きい方がそろっている２つの数を引いてしまうと、結果の有効数字が極端に少なくなる。

```python3
print(1.01 - 1.00) # 発生しない例
print(1.000000000000001 - 1.000000000000000)
```

```
0.010000000000000009
1.1102230246251565e-15
```

---

## Overflow，Underflow

使用できる数値の上限，下限を超えたものを扱った際に発生します。

```python3
import sys
# オーバーフロー
print(f"max float ={sys.float_info.max}")
print(sys.float_info.max * 2)

# アンダーフロー
print(f"min float ={sys.float_info.min}")
print(sys.float_info.min * 0.000000000000001)
print(sys.float_info.min * 0.0000000000000001)
```

```
max float =1.7976931348623157e+308
inf
min float =2.2250738585072014e-308
2.5e-323
0.0
```

オーバーフローでは値が無限(infinity)になり，アンダーフローでは0.0になってしまうのがわかります。

---

## まとめ

コンピュータをつかった計算をする際には誤差が発生する可能性があるのでそのことを認識した上で計算を実施する必要がある。
なぜ株式会社Schoo(スクー)がテックブログの運営を再開しようと思ったのか

はじまして！株式会社Schoo（以下スクー）に24新卒として入社した山﨑です！
この度、スクーのテックブログが再開されることになりました！
この記事では、「なぜテックブログを再開させようと思ったのか」について私の思いを書いてみました！
(記事には、スクーのテックブログをこうしていきたいんだ！という、筆者の個人的な思いも含まれています)


## この記事の対象
- スクーに興味がある方
- テックブログの運営に興味がある方


## スクーのテックブログとして目指したいところ
:::note info
 - 技術発信の大切さが認知されている会社になる
 - テックブログを書きたい思いがある人が「書きやすい環境」である
    - 全員が発信すべきとは思わない
    - 書きたい思いを持っている人が定期的に記事を投稿している・できる環境である
:::
 


## なぜテックブログの文化をスクーに作りたいのか
- 会社にとってメリットがたくさんだと感じるから(メリットは後述)
- 今まで色々な会社やエンジニアが書いた記事・ブログに助けられてきたので、これからは自分たちもエンジニア業界に貢献したい
- 技術発信しているエンジニアってかっこいいよね
- エンジニアイベントへの参加、OSS活動、登壇などを積極的に行うための足掛かりにしたい
- 一緒に働いている人がどんな記事を書くのか気になる。
    - 誰がどの分野に関心を持っているかもっと知りたい
    - 普段見えない個性が見えたりする人もいそう
- スクーの開発部門・人をもっと知ってもらいたい


 
## 技術発信をするメリット
### 会社
- エンジニアの技術力向上
- 社内にknowledgeが貯まる
    - 誰が何をしているのか・何を強みとしているのか・何に興味があるのかが可視化される
- スクーを知ってもらえる
- スクーのプロダクトがどんな思想なのか知ってもらえる
- スクーの開発組織が何をしてるのか知ってもらえる
- OSS/エンジニアコミュニティへの貢献
- スクーエンジニアリングのブランディング強化
- 他社との接点ができる可能性がある
- 採用
    - エンジニアとの接点が増えることでスクーに合ったエンジニアの採用につながる

### 個人
- 成長
    - アウトプットまですることでより深い理解につながる
    - 使える知識になる
- アウトプットを通して、新しい機会を得られる可能性もある
- 社内貢献
    - 誰が何をしているのか分かる
    - 自分が一度つまずいたことは誰かもつまずくよね
- 個人の財産になる
    - 何をやってきたのかが分かる
    - 登壇やイベント参加などの機会につながる可能性


 :::note info
 会社と個人の両方にとって良いことがたくさん！
:::
 

## スクーのPhilosophyと技術発信文化の繋がり
会社としてテックブログをやるとなると、会社のMission・Visionや文化にどうつながるのかを踏まえて、なぜ技術発信をするのかを考えることが大切だと思っています。

スクーは学び続ける社会の構築と、社会課題の連鎖的解決を目指しています。
**テックブログなど技術発信を進めること** で、「エンジニアコミュニティの学びへの貢献」ができたり、「その貢献を通して社会を少し良くするための変化を起こす」ことができたりするのではと思っています。

また、スクーは「Laboratory（ラボラトリー） #105」と言うPhilosophyを掲げており、 **「学習・変化・尊重」** を大切にし、まだ世の中にない価値を生み出し続ける「研究所」であることを目指しています。
技術発信をすることはスクーの大切にしているPhilosophyを体現することにつながると思っています。

Mission・VisionやPhilosophyの詳細はこちらをご覧ください

https://corp.schoo.jp/about

### 学習
- アウトプットするには学習が不可欠
- 個人、ユニット、部門の継続学習につながる
- knowledgeの共有を通して周りの学習の手助けにつながる
- 発信することで、エンジニアコミュニティの学習を助けることにつながる

### 変化
- 開発部門の継続的な変化を生み出せる
    - 個人の成長⇒部門の成長
    - エンジニアとの接点が増えることで、外部から良い影響を受けられる
- 読者から技術的な依頼をされるなど、新しい挑戦につながる可能性がある
- 組織のあり方や開発手法を発信して、エンジニアコミュニティへ還元し変化を生み出すこともできる

### 尊重
- レビューや記事の感想などを通してお互いの興味や考え方を知ることができる
- 知識を自分の中だけでなく周りに共有することで高め合うことができる
- 日々、学習を行いそこで得たものを業務に活かす、周りに発信するなどしている人は尊重されると思うし、そういう人が尊重される文化は素敵だと思う
- エンジニアコミュニティに貢献するというのは、エンジニアの文化に尊重の念を持つことだと思う


:::note info
 技術発信にはスクーの大切にしていることが詰まっている！
:::

 ## 終わりに
 今回はなぜ、スクーがテックブログの運営を再開させようと思ったのかについて書いてみました！
 テックブログの運営をしてみたい方、テックブログを書いてみたい方、スクーに興味を持ってくださる方の参考になれば幸いです。
 

---
schooでは一緒に働く仲間を募集しています！

https://corp.schoo.jp/careers/graduates

https://corp.schoo.jp/careers