OmniAICreator/Qiita-1.07M huggingface dataset:
Connectを使用したgRPCサーバーでReflection APIを有効にする方法

# Connectを使用したgRPCサーバーでReflection APIを有効にする方法

## はじめに
最近、`connectrpc.com/connect`を使用してgRPCサービスを開発する際、gRPC UIツールで「Failed to compute set of methods to expose: server does not support the reflection API」というエラーに直面しました。この問題は、Connectを使ったgRPCサーバーでReflection APIが有効になっていないために発生します。この記事では、Connectを使用してgRPCサーバーを構築する際にReflectionを有効にする方法を紹介します。

## Connectとは？
Connectは、gRPCとHTTP/2をサポートする軽量なGoライブラリで、net/httpサーバーでの使用に最適化されています。しかし、Connectを使用するときには、通常のgRPCサーバーとは異なる方法でReflectionを設定する必要があります。

## Reflectionの必要性
gRPC Reflectionは、サーバー上のサービスやメソッドを動的に発見するために使用されます。これにより、`grpcui`のようなツールがスキーマのコピーなしにリクエストを送信し、レスポンスを表示できるようになります。

了解しました。その部分を記事に追加してみましょう：

---

## 解決策: grpcreflectの使用
`connectrpc.com/grpcreflect`は、任意のnet/httpサーバー（Connectを含む）にgRPCサーバーのリフレクションAPIを追加するために使用します。以下は、grpcreflectを使用してReflection APIを有効にする方法の例です：

```go
package main

import (
  "net/http"

  "golang.org/x/net/http2"
  "golang.org/x/net/http2/h2c"
  "connectrpc.com/grpcreflect"
)

func main() {
  mux := http.NewServeMux()
  reflector := grpcreflect.NewStaticReflector(
    // buf.build/connectrpc/goで生成されたサービス名を使用します
    // 例えば、group.connect.go内で定義されているGroupServiceName定数:
    // const GroupServiceName = "acme.group.v1.GroupService"
    "acme.user.v1.UserService",
    "acme.group.v1.GroupService",
  )
  mux.Handle(grpcreflect.NewHandlerV1(reflector))
  mux.Handle(grpcreflect.NewHandlerV1Alpha(reflector))
  http.ListenAndServe(
    ":8080",
    h2c.NewHandler(mux, &http2.Server{}),
  )
}
```

このコードでは、`grpcreflect.NewStaticReflector`を使用して静的リフレクターを作成し、サーバーに登録しています。リフレクターに渡すサービス名は、`buf.build/connectrpc/go`で生成されたファイル（例：`group.connect.go`）内の定数（例：`GroupServiceName`）を参照しています。その後、Reflection APIのハンドラーをHTTPマルチプレクサに追加しています。

## まとめ
Connectを使用してgRPCサーバーを構築する場合、`grpcreflect`を使用してReflection APIを有効にすることで、`grpcui`などのデバッグツールが動的にサービスを発見できるようになります。これにより、開発プロセスがよりスムーズになり、効率的なデバッグが可能になります。

Connectを使ったgRPCサーバーの構築は、従来のgRPCサーバーのセットアップとは少し異なるアプローチを必要としますが、`grpcreflect`を使うことで、リフレクションAPIの設定は非常に簡単です。この機能を活用することで、多くの開発者がより効率的にgRPCベースのアプリケーションを開発できるようになることを願っています。
【Salesforce】TableauをCRM Analyticsに公開するための手順

## 1. CRMA側の設定
1.1 Analyticsの設定画面で、「ユーザーがTableauからCRM Analyticsへコンテンツを公開することを許可する」を有効にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/1144ffe0-9b87-4cfd-8780-1afce256351c.png)
1.2 Tableau View Lightning Web Componentを有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/4bb31f59-2d04-8618-ce60-aa66a887355b.png)

## 2.Tableau側の設定
2.1 前提　

External Authorization Server (EAS)設定が必要です。 
設定手順を以下の資料をご参考にしてください。

https://qiita.com/heanzza/items/ff0a086ea0448d184a75

2.2 Publish views to Salesforceを有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/6f264108-e373-bab5-ec80-57e4b3bb9d1f.png)


## 3. Publish Tableau to CRM Analytics
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/f5f55078-722e-b98c-9008-f1b9a49aa286.png)


## 他の参考ヘルプ資料
1. [ダッシュボードへの Tableau ビューの追加の手順](https://help.salesforce.com/s/articleView?id=sf.bi_add_tableaucloudview_crmdashboard.htm&type=5)
1. [検索条件の追加による Tableau ビューの探索](https://help.salesforce.com/s/articleView?id=sf.bi_enable_tableau_views_filter.htm&type=5)
Java勉強メモ４_制御構造

# 制御構造

### 条件分岐（Conditional Branching）
### if文
**概要:** if文は、指定された条件が真（true）である場合にのみ、特定のコードブロックを実行します。
``` java
if (condition) {
  // 条件が真の時に実行されるコード
}
```
b. if-else文
**概要:** 条件が真の場合は一つのブロックを、偽（false）の場合は別のブロックを実行します。
``` java
if (condition) {
  // 条件が真の時に実行されるコード
} else {
  // 条件が偽の時に実行されるコード
}
```
c. switch文
**概要:** 一つの変数に基づいて複数のケースを検討し、一致するケースに対応するコードを実行します。
``` java
switch (variable) {
  case value1:
    // variableがvalue1に等しい場合のコード
    break;
  case value2:
    // variableがvalue2に等しい場合のコード
    break;
  default:
    // どのケースにも当てはまらない場合のコード
}
```
### ループ（Loops）
a. for文
**概要:** 指定された回数だけループを実行します。
``` java
for (初期化; 条件; イテレーション) {
  // 繰り返し実行されるコード
}
```
b. while文
**概要:** 条件が真の間、ループを続けます。
``` java
while (condition) {
  // 条件が真の間、繰り返し実行されるコード
}
```
c. do-while文
**概要:** 最低一回はループのコードを実行し、その後条件をチェックします。
``` java
do {
  // コードブロック
} while (condition);
```

### breakとcontinue
1. break
概要: break文はループから即座に脱出します。
使用場面: 特定の条件が満たされた時にループを終了させたい場合など。

2. continue
概要: continue文は現在のループの残りの部分をスキップし、次の繰り返しに進みます。
使用場面: 特定の条件で現在の繰り返しをスキップしたいが、ループ自体は続けたい場合など。
区切り文字で顧客のN回目までの購入商品を１列内に記述する(SPSS Modeler データ加工逆引き7-19)

# 区切り文字で顧客のN回目までの購入商品を１列内に記述する

![スクリーンショット 2023-12-26 10.15.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7317765c-6014-e11c-8b20-4e075b2fda04.png)

全く逆のプロセスを逆引き7-16で紹介しています。

## 1.想定される利用目的

・購入順序やWeb行動を顧客毎に要約
・ログ出力順序などを設備毎に要約

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/multiple_record.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-12-26 10.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b7a29162-519d-49ac-0a0e-314932ec719e.png)

a.入力するデータは以下の通りです。　顧客の商品購入履歴情報です。

![スクリーンショット 2023-12-26 10.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/af0a6868-be01-bb7f-72ab-187887e031fb.png)

b.[重複]ノードを編集します。

![スクリーンショット 2023-12-26 10.17.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/78f350ea-7f11-5c71-ba6a-b3eac21cdf01.png)

[複合]タブで[次を基準とする値を入れる]に[カスタム...]を選択します。

![スクリーンショット 2023-12-26 10.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1acb5345-e061-f18e-e978-5561360f251c.png)

[値の連結]を選択し[カンマ]のラジオボタンを選びます。

![スクリーンショット 2023-12-26 10.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/056d2bc6-f9c7-86d4-c895-daff98bbd1ee.png)

以下のように設定されます。

![スクリーンショット 2023-12-26 10.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2556cc01-12e3-7c33-34dd-ce3f78a78f60.png)

[テーブル]を実行します。

![スクリーンショット 2023-12-26 10.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1abffe2b-ea51-5d65-d593-65ecf4cf516d.png)

#### 注意事項

購入順序を性格に保持するためにはタイムスタンプなどでソートします。

## 4.参考情報

#### 区切り文字を含むフィールドの値を縦持ちする

https://qiita.com/416nishimaki/items/fc892638dc4eca265dd4

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
米国の IT エンジニアの給与

この記事では、アメリカ合衆国の労働省 労働統計局が調査した米国におけるコンピュータおよび情報技術の職業の統計情報をお伝えします。2022年5月時点の情報になります。なにかの参考になれば幸いです。

## 米国 IT エンジニアの職種
米国におけるコンピュータおよび情報技術の職業の種類、従事者数、年間給与は以下の通りです。

|職業|人数|人数比|給与中央値|
|---|---|---|---|
|コンピュータおよび情報研究者|36500|1%|$136,620 |
|コンピュータネットワークアーキテクト|180200|4%|$126,900 |
|ソフトウェア開発者、品質保証アナリスト、テスター|1795300|40%|$124,200 |
|データベース管理者とアーキテクト|149300|3%|$112,120 |
|情報セキュリティアナリスト|168900|4%|$112,000 |
|コンピュータシステムアナリスト|531400|12%|$102,240 |
|コンピュータプログラマー|147400|3%|$97,800 |
|ネットワークおよびコンピュータシステム管理者|339900|8%|$90,520 |
|Web開発者とデジタルデザイナー|216700|5%|$80,730 |
|コンピュータサポートスペシャリスト|914100|20%|$59,660 |

この職業の年間賃金の中央値は10万530ドルです。これは全職業の中央値4万6310ドルより高いです。

## 各職種の概要
各職業の仕事の性質、資格、は以下の通りです。1ドル＝ 140 円で計算しました。

### 1. コンピュータおよび情報研究者
コンピュータおよび情報研究の科学者は、新規および既存のコンピューティング テクノロジの革新的な使用法を設計します。この職に就くには、計算機科学または情報科学の大学院を卒業する必要があります。年間給与の中央値は約 1917 万円です。 

### 2. コンピュータネットワークアーキテクト
コンピュータ ネットワーク アーキテクトは、ローカル エリア ネットワーク (LAN)、ワイド エリア ネットワーク (WAN)、イントラネットなどのデータ通信ネットワークを設計および実装します。この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1777 万円です。 

### 3. ソフトウェア開発者、品質保証アナリスト、テスター
ソフトウェア開発者は、コンピューター アプリケーションまたはプログラムを設計します。ソフトウェア品質保証アナリストとテスターは、アプリケーションまたはプログラムの問題を特定し、欠陥を報告します。 この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1739 万円です。 

### 4. データベース管理者とアーキテクト
データベース管理者とアーキテクトは、データを保存および保護するためのシステムを作成または組織します。この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1570 万円です。  

### 5. 情報セキュリティアナリスト
情報セキュリティ アナリストは、組織のコンピュータ ネットワークとシステムを保護するためのセキュリティ対策を計画および実行します。この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1568 万円です。 

### 6. コンピュータシステムアナリスト
コンピュータ システム アナリストは、組織の現在のコンピュータ システムを調査し、効率を向上させる方法を設計します。この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1431 万円です。  

### 7. コンピュータプログラマー
コンピューター プログラマーは、コンピューター ソフトウェアやアプリケーションが適切に機能できるようにするコードやスクリプトを作成、変更、テストします。この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1369 万円です。 

### 8. ネットワークおよびコンピュータシステム管理者
ネットワークおよびコンピュータ システム管理者は、組織のコンピュータ ネットワークとシステムをインストール、構成、保守します。この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1267 万円です。 

### 9. Web 開発者とデジタルデザイナー
Web 開発者は Web サイトを作成および保守します。デジタル デザイナーは、Web サイトまたはインターフェイスのレイアウト、機能、および使いやすさのためのナビゲーションを開発、作成、テストします。この職に就くには、計算機科学または情報科学の大学を卒業する必要があります。年間給与の中央値は約 1130 万円です。 

### 10. コンピュータサポートスペシャリスト
コンピュータ サポート スペシャリストは、コンピュータ ネットワークを維持し、コンピュータ ユーザーに技術的なサポートを提供します。この職に就くには、特別な資格は必要ありません。年間給与の中央値は約 835 万円です。 

## 米国 IT エンジニアの職種別の年間給与
職種別の人数と年間給与を図示します。

![224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/5b706243-6ea7-cd0a-5787-4f70162990d6.png)

## 米国 プログラム言語別の年間給与
米国の求人求職サイトのDevJobsScannerが調べた、米国で開発者の年間給与が高いプログラミング言語のランキングを紹介します。

![](https://www.devjobsscanner.com/assets/blog/top-paid-languages-2023/ranking-percentile-2023.svg)

米国で開発者の平均給与が高い31言語の給与分布（DevJobsScanner より引用）

## 参考文献
- Bureau of Labor Statistics > Occupational Outlook Handbook > Computer and Information Technology
https://www.bls.gov/ooh/computer-and-information-technology/home.htm
- DevJobsScanner > Top 10 highest paid programming languages in 2023
https://www.devjobsscanner.com/blog/top-10-highest-paid-programming-languages/
AWS クラウドプラクティショナー学習メモ

WaveLengthゾーン

5G通信を提供する通信プロパイダのロケーションをAWS用に接続した特別なゾーン

>5G ネットワークのエッジにある電気通信事業者のデータセンター内に AWS のコンピューティングサービスとストレージサービスを組み込んだ AWS のインフラストラクチャのデプロイ



https://aws.amazon.com/jp/wavelength/faqs/


>Chef や Puppet のマネージド型インスタンスを利用できるようになる構成管理サービス

AWS OpsWorks

https://aws.amazon.com/jp/opsworks/


AWS Network Firewall

すべての Amazon Virtual Private Cloud (VPC) に不可欠なネットワークファイアーウォールや侵入防止システムをデプロイするマネージド型サービス


Amazon EBS
実行中のインスタンスにアタッチできる耐久性のあるブロックレベルのストレージボリュームを提供
頻繁かつ詳細な更新が必要なデータのプライマリストレージデバイスとしてAmazon EBSを使用

https://aws.amazon.com/jp/ebs/features/
Trust Site RSS フィードの廃止



https://status.salesforce.com/generalmessages/1272

:::note
Salesforce Trust Site は、2024 年 2 月 1 日に RSS フィード機能を廃止します。Salesforce Trust Site チームは、全体的なユーザー エクスペリエンスを向上させるために、他のユーザーの生産性向上に開発努力を集中しています。影響: この機能を無効にすると、RSS リーダーは更新を受信しなくなります。回避策/追加情報: Salesforce Trust Site は、電子メールおよび SMS 経由でプッシュ通知を提供します。サブスクリプションは [マイ サブスクリプション] ( https://status.salesforce.com/login ) で管理します。さらに、信頼サイトは、サイトの完全なエクスペリエンスを備えた 
パブリック API ( https://api.status.salesforce.com/v1/docs/ ) を提供します。
:::



古い質問と回答があるので、今回新設されたAPIでなく、以前からあった機能だろう。

以下の回答をみると認証は不要なのかな？

+ [API for trust.salesforce.com](https://salesforce.stackexchange.com/questions/36443/api-for-trust-salesforce-com)

```
 curl https://api.status.salesforce.com/v1/instances/NA48/status
 ```

 ```
 https://api.status.salesforce.com/v1/instances/na5/status

{
  "key": "NA5",
  "location": "NA",
  "environment": "production",
  "releaseVersion": "Winter '17 Patch 13.5",
  "status": "OK",
  "Incidents": [
    {
      ...
      ],
      "serviceKeys": [
        "coreService"
      ]
    },

  ],
  "Maintenances": [
    ...
  ]
}
```

+ [Salesforce ステータス/Trust Rest API に関する質問](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4LhdSAF)
【業務効率化】Excelでメールを一人一人に自動送信

## メール送信マクロ作成の経緯
社内アンケートやリマインドメールの通知では、「同じ内容」のメールを「一人一人」に「大量」に送信する必要があります。この煩わしさを解消するため、先日社内ツールとしてメールの自動配信マクロを作成しました。
ネット上には意外と一人一人複数人にメール送信するためのマクロが公開されていなかったため、今回共有します。
基本的にはスクリーンショットの通りにシート名、シート内容を入力すれば動くと思います。
![スクリーンショット 2023-12-30 135922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/dfb684ae-8d87-7a29-ad53-48f8268e56c9.png)
**機能概要:** C列「メール送信」欄に丸がついている対象者に、E列「メール設定内容」の内容でメールが送信されます。その際、CCを3人まで指定できるようにしています。

## 事前準備
Outlookのメールオブジェクトを利用できるようにするため、VBAの「ツール＞参照設定」より「Microsoft Outlook 16.0 Object Library」にチェックを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/25397dc0-1120-27cc-2352-f544c79f6cd3.png)
VBA(Visual Basic)の使用方法やマクロの配置方法がわからない場合は、公式のサポートを参照してください。

https://support.microsoft.com/ja-jp/office/%E3%83%9E%E3%82%AF%E3%83%AD-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E5%88%A5%E3%81%AE%E3%83%96%E3%83%83%E3%82%AF%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B-13c0938b-8432-4259-9177-a71f7e626de0

https://support.microsoft.com/ja-jp/office/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB-%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AB%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B-d58edd7d-cb04-4964-bead-9c72c843a283

## VBAコード(コピペ用)

``` vb
'メールを作成する
Sub SendMail()
         
    'メールシートを変数にしておく
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("メール")

    'Outlookアプリケーションを起動
    Dim outlookObj As Outlook.Application
    Set outlookObj = CreateObject("Outlook.Application")
    
    'Outlookメールを作成
    Dim mymail As Outlook.MailItem
    Set mymail = outlookObj.CreateItem(olMailItem)
    
    'CCの宛先をCCリストに追加
    Dim ccList(2) As String
    ccList(0) = ws.Range("E2").Value
    ccList(1) = ws.Range("E3").Value
    ccList(2) = ws.Range("E4").Value
    
    'メール自動送信機能
    Dim i As Long
    For i = 2 To ws.Cells(Rows.Count, 2).End(xlUp).Row　'2行目から最終行まで探索する
        If ws.Cells(i, 3).Value = "〇" Then  'メール送信欄が"〇"の場合にメールを作成する
        
            'メール情報を設定
            mymail.BodyFormat = 1        'テキストに変更
            mymail.To = ws.Cells(i, 2).Value   'To宛先(B列の宛先を一人ずつ指定)
            mymail.CC = Join(ccList, ";")   'CC宛先(CC1~CC3の宛先を同時指定)
            mymail.Subject = ws.Range("E5").Value    '件名
            mymail.Body = ws.Cells(i, 1).Value & "さん" & vbCrLf & vbCrLf & ws.Range("E6").Value & vbCrLf 
            　'本文(ここでは「〇〇さん＜br＞＜br＞メール本文」と設定)
            
            'メール表示
            mymail.Display　'ここでは誤送信を防ぐために表示だけにして、メール送信はしない
    
            'メール保存
            mymail.Save

            'メール送信の確認(ダイアログボックスを表示)
            If MsgBox(ws.Cells(i, 1).Value & "さんにメールを送信しますか？", vbYesNo) = vbYes Then

                'メール送信
                mymail.Send
            End If
        End If
    Next i
    
    Set outlookObj = Nothing
    Set mymail = Nothing
    
End Sub
```
勤怠RTA～iPhoneロック画面にお気に入りWebサイトを登録しよう～

iOS16より追加されたiPhoneロック画面のウィジェット機能、皆さんは有効活用されてますでしょうか？
本記事では、ウィジェットにWebサイトのショートカットを設定する方法をご紹介します。
私はこの方法で**勤怠入力3秒**の記録を達成できました。

## 1.「Lock Launcher」のインストール
ロック画面のウィジェット機能をカスタマイズするためには、「Lock Launcher」というアプリを使用します。ロック画面ウィジェットは2つまで無料で作成できます。

https://apps.apple.com/jp/app/lock-launcher-%E3%83%AD%E3%83%83%E3%82%AF%E7%94%BB%E9%9D%A2%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88/id1636719674

## 2.ロック画面ウィジェットを作成
１．インストールしたLock Launcherを起動し、下部メニューより「ウィジェット」を選択。
![Image (1).jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/c210c1f2-2786-40d4-5b88-94dccc0ebe93.jpeg)
２．「ロック画面ウィジェット1」を編集。Web/🍎Musicを選択して、登録したいサイトのURLを入力。
![Image (2).jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/276d035a-abbe-ccb7-1e55-248de7270b15.jpeg)
３．アイコンのデザイン/カスタマイズはお好みで。
![Image (3).jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/581714ec-5d41-f51f-dcab-de8c0589ecfa.jpeg)
４．「ⓘロック画面にウィジェットを追加」の「設定＞」リンクを押下してiPhoneの設定に移動。
![Image (4).jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/231b8b0e-e142-f8fc-6fb8-3f510968abfa.jpeg)
５．「ロックランチャー」の設定したウィジェットを選んで配置。
![Image (5).jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/4e8b0503-63bc-84b3-0134-3f40cec08597.jpeg)
６．iPhoneをロックして配置を確認。
![Image (6).jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/38203e11-87ea-5693-f9d2-31fb56a513c7.jpeg)

手順は以上です。とっても簡単！

## 3.あとがき
今回使用した「Lock Launcher」、機能満載でかなり詳細なカスタマイズができるようです。
最近はiPhoneもカスタマイズ性が向上して嬉しい限りです。
実務経験なしでエンジニア職へ挑戦するロードマップ【ON THE ROAD】

本記事は、新卒で銀行員 > 会計ソフト（CS）と歩み、これから「未経験からエンジニア」を目指すロードマップです。
僕は、学生時代に「Python」を履修したが、全く意味が分からず、本履修の感想文を提出し単位を取った人間でしたが、人生はどんなきっかけでこんなに大きく変化するのですかね笑。

# 目次
 1 ポートフォリオを作成しよう！
 2 自己分析をしよう！
 3 転職エージェントを活用しよう！

# 今回は「ポートフォリオを作成しよう！」について
★目的：
実務経験なしでエンジニアになる上で企業側にどのくらいのスキルがあり、どのくらいエンジニアになりたいのかを視覚的に評価してもらえる。また、ポートフォリオを作成することで自分自身のスキル自信にも繋がる。

作成する上で意識すること：
実際にエンジニアになった時を想定して、要件定義〜リリースまでを細分化し、いつまでに完成させる という感じで現場意識をもつこと。

成果物は自分本位ではないが、自分自身でもこれがあると楽だな、世の中に多少貢献できるかな、リリースされると便利になると思えるものを成果物とすること、具体 > 抽象を意識すること。

★成果物の名称：「（仮）筋肉のためのアプリ（←ネーミングセンスを疑いたいです。。）」
具体的な期間の設定：（全体的な期間：2ヶ月間）
・要件定義（1週間）
↓
・インターフェイス（外部設計）（２週間）
↓
・プログラミング設計（内部設計（詳細設計））（1ヶ月〜1.5ヶ月）

以上

僕なりに考えた現場感覚を意識しながら、必ず"成し遂げる"と強い意志を持って今後も取り組んでいきます！

ここまで記事を読んでくれてありがとうございます！

そして僕に足りない知識などありましたら、ぜひコメント頂けますと嬉しいですmm。
「 static_cast<std::size_t>(-1) 」 の挙動について

## 用途
オブジェクトのバイト数を表現できる程度に十分に大きい符号なし整数型の最大値を取得したい場合に使用する。

## 疑問：c++(c言語)整数型のオーバーフロー時の挙動は未定義ではなかったか？
疑問の通り、"符号あり整数型"の場合は未定義である。ただし、符号なし整数型のときはモジュロ算術(最大値(最小値)を超えると、最小値（最大値）から再度計算する。)に基づくことがC言語標準で規定されている。

## 結論
size_tは「オブジェクトのバイト数を表現できる程度に十分に大きい符号なし整数型」のため、オーバーフロー時は符号なし整数型のときの挙動となる。
よって、オーバーフローによるバグが発生する心配は無く、安全に最大値を取得できる。
Railsチュートリアルで、思ったこと

# とりあえず、チュートリアルの感想


railsの学習というよりも、

1：英語
2：ドキュメント的文書の読解力
3：他文献への勧め
4：テスト
5：セキュリティ
6：エンジニアとしての仕事に必要なtips

の学習に感じた


## 追伸

また、今度、改めて、railsの記事をちゃんと書きます。
wslでelixir その131

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
ハッカソンなので、Livebookでopenaiを叩け。

# 参考にしたページ

https://qiita.com/GeekMasahiro/items/20894bac55f77c962a21

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9fbdcbe2-4479-1f1e-038c-fb8363f306a1.png)



# セットアップ

```
Mix.install(
  [
    {:kino, "~> 0.10.0"},
    {:openai, "~> 0.3.1"}
  ],
  config: [
    openai: [
      api_key: System.get_env("LB_TOKEN"),
      http_options: [recv_timeout: 30_000]
    ]
  ]
)
```

# サンプルコード

```
{:ok, result} = OpenAI.chat_completion(model: "gpt-3.5-turbo",
		messages: [
			%{
				role: "user", 
				content: "ウサギと亀、どっちが速い。"
			}
		]
	)
result
|> Kino.Tree.new()
```
以上。
投稿の更新に失敗したときにエラーメッセージを表示させたい

# 初めに

Qiitaの投稿頻度を上げていけるように、日頃から直面した問題から背かないように課題解決を意識していきます。

# 問題

今回は、ProgateのSNSアプリをローカル環境で実装していたときにエラーメッセージが表示できないことが課題としてありました。具体的には、投稿の詳細ページで空の投稿で更新して、「Contentを入力してください」のようなエラーメッセージを表示させたいです。

前提、ローカル環境とProgateで扱っているRuby on Railsのバージョンがこちらになります。

Progate : Rails5

ローカル : Rails7

### ソースコード

```ruby
def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      redirect_to("/posts/index")
    else
      render("posts/edit")
    end
  end
```

# 解決方法

エラーメッセージを表示させている、edit.html.erb こちらは問題なかったのでコントーラーのupdateアクションを確認しました。そこで、elseの処理 ```render("posts/edit")``` を疑いました。

```status: :unprocessable_entity``` こちらを追記することで解決できました。また、renderのパスも ```:edit```に変更する必要がありました。

```ruby
def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      redirect_to("/posts/index")
    else
      render :edit, status: :unprocessable_entity
    end
  end
```


# 終わりに

バージョンの違いによって起きるエラーに慣れていきたいです。
Pythonを使用してExcelの一列に書かれたデータを複数列に分割するGUIアプリを作成

# 何の役に立つのか？
まず一列に書かれたデータがあるとします。
| 1 |
|:-:|
|データ1|
|データ2|
|データ3|
|データ4|
|データ5|
|データ6|

これを以下のように3列にしたいという時

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|データ1|データ2|データ3|
|データ4|データ5|データ6|

手動でやっていては時間の無駄です。
この例では6行のデータを複数列に直すだけなので手動でも簡単にできますが、
100行とか1000行とかのデータを複数列に直そうとするとものすごく時間がかかります。
この問題をPythonでGUIアプリで解決します。

# 使用方法
私が作成したコードを紹介して、その使い方を説明します。
最後にコードの説明をします。
## 環境
・Python 3.x
・Tkinter（Python標準ライブラリの一部）
・Pyperclip（インストールが必要: pip install pyperclip）

## コード全体
以下が作成したコード全体です。
コピペして保存してみてください。

```python:split_excel_column.py
import tkinter as tk
from tkinter import messagebox
import pyperclip

def split_string_to_columns(input_string, num_columns):
    elements = input_string.split("\r\n")
    formatted_string = ""
    for i in range(0, len(elements), num_columns):
        formatted_string += '\t'.join(elements[i:i+num_columns]) + "\n"
    return formatted_string.strip()

def on_submit():
    input_string = entry.get("1.0", tk.END)
    num_columns = int(column_entry.get())
    if input_string.strip() and num_columns > 0:
        result = split_string_to_columns(input_string, num_columns)
        result_label.config(text=result)
        copy_to_clipboard(result)

def copy_to_clipboard(text):
    pyperclip.copy(text)
    display_text = text.replace("\t", "\\t").replace("\n", "\\n")
    messagebox.showinfo("Copied", f"Text copied to clipboard:\n{display_text}")

root = tk.Tk()
root.title("String to Columns Converter")

entry = tk.Text(root, height=10, width=50)
entry.pack(padx=10, pady=10)

column_label = tk.Label(root, text="Enter number of columns:")
column_label.pack()

column_entry = tk.Entry(root)
column_entry.pack()

submit_button = tk.Button(root, text="Convert to Columns", command=on_submit)
submit_button.pack(pady=10)

result_label = tk.Label(root, text="", anchor='w', justify='left')
result_label.pack(padx=10, pady=10)

root.mainloop()
```

## 実行方法
1. コピペしたPythonコードをターミナルで実行します。
2. Excelからコピーした列をテキスト入力欄に貼り付けます。
3. 分割したい列数を指定します。
4. 「Convert to Columns」ボタンをクリックします。
5. 結果が下部のラベルに表示され、自動的にクリップボードにコピーされます。


## コードの説明

このコードは、Pythonで作成されたグラフィカルユーザーインターフェース（GUI）アプリケーションです。`tkinter`という標準ライブラリを使用して、ユーザーがテキストを列に分割できるツールを作成しています。具体的な機能は以下の通りです：

1. **ライブラリのインポート**：
   - `tkinter`：GUI要素を作成するための標準ライブラリ。
   - `tkinter.messagebox`：ポップアップメッセージボックスを表示するために使用。
   - `pyperclip`：クリップボードへのコピー機能を提供。

2. **`split_string_to_columns`関数**：
   - 入力された文字列を受け取り、指定された列数に基づいて文字列を分割します。
   - 文字列は改行（`\r\n`）で分割され、各行はタブ（`\t`）で結合されます。

3. **`on_submit`関数**：
   - ユーザーが「Convert to Columns」ボタンをクリックしたときに呼び出されます。
   - テキストエントリから文字列と列数を取得し、`split_string_to_columns`関数で処理します。
   - 結果をラベルに表示し、クリップボードにコピーします。

4. **`copy_to_clipboard`関数**：
   - 与えられたテキストをクリップボードにコピーします。
   - コピーされたテキストをメッセージボックスで表示します。

5. **GUIコンポーネントの設定**：
   - メインウィンドウ（`root`）、テキスト入力欄、ラベル、エントリボックス、ボタン、結果表示用のラベルが配置されています。

6. **アプリケーションの実行**：
   - `root.mainloop()`により、アプリケーションが起動し、ユーザーの入力を待ちます。
【Jr.エンジニアのやらかし記録】先輩、Pushしたらコンフリクト100ファイルあるんですが...😇

# 「先輩、Pushしたらコンフリクト100ファイルあるんですが...😇」

###  先輩「Meet繋いでやりますか😎」
###  転職4日目の私「神😭😭😭😭😭😭😭😭😭😭」

## どんな状況？
・masterからブランチを切って作業しプルリクも作成している
・ビルドコマンドを打って、変更された100ほどのファイルをコミットしてプッシュ
・リモートに差分があり、コンフリクトしてしまった
・GitHub側に提示されたCommandlineを利用し、masterをブランチにマージしたが、手元で直そうにも対象ファイルが100個以上ある
・そもそもコマンドで勝手に変更されたファイルばかりでどう直していいかワカラン😇

## 誰が対象？
・コンフリクトが出た最後のコミット差分を失っても構わない
・今のブランチを消しても問題ないところまでコミットが済んでいる


## やったこと
まずはコンフリクトが起こっているブランチ上（仮にuplorderブランチとする）で作業。
```
$ git status
// 作業ディレクトリの状態とステージング エリアの状態を表示するコマンド
```
```
$ git merge --abort
// マージしたらコンフリクトした、やっぱりマージやめよう。なコマンド
// コンフリクトの編集をしていないときに限る
```
```
$ git status
// もう一回状態を確認
```
masterブランチに移動し、作業
```
$ git checkout master
// ブランチの切り替え
```

```
$  git branch -D uplorder
// ローカルのuplorderブランチを削除
```

```
$ git branch
// uplorderブランチが消えたか確認
```

```
$ git pull origin master
// リモートリポジトリのmasterブランチの内容を、ローカルリポジトリの今いるブランチに反映させる
```

```
$ git status
// もう一回確認
```

```
$ git checkout -b uplorder
// もう一度、uplorderブランチを作り移動
```
※ブランチ名はプルリクからコピペできます。元の名前と一致させてください。（写真は個人開発のリポジトリです）
![スクリーンショット 2024-01-17 3.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817989/6a558038-6a90-ca46-e453-a54912667068.png)

GitHubの該当プルリクに移動
Commitのタブを押す
![スクリーンショット 2024-01-17 3.11.58のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817989/534c4d63-da69-5e4f-40b0-0f1e0b274a1b.jpeg)

コンフリクトする１つ前のコミットのハッシュ値をコピーする
![スクリーンショット 2024-01-17 3.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817989/14a46c78-587d-dc76-48c8-2ecfb843c0a9.png)

ターミナルに戻って、引き続き先程作り直したuplorderブランチで作業

```
$  git cherry-pick コピーしたコミットハッシュ値
// 特定のコミットを取り込む
```
```
$  git log --oneline
// gitのコミット履歴を１行ずつ見やすく表示
// ブランチに該当コミットが紐づけられたことを確認
```
ここで、再度ビルドコマンドを打ち変更をadd & commit 

```
$ git push origin uplorder -f
// -f オプションを付けて強制push
```
これでOK。リモートの差分を取り込んでからuplorderブランチを新しく切ったためコンフリクトは解消され、``` git cherry-pick``` のコマンドで新しく作ったuplorderブランチとコミットを紐付けてPushしているため、差分もそのまま紐付けられています。

Gitの操作やコンフリクトの解消方法は様々かと思いますが、自分にはない解決方法だったので本当に勉強になりました。

 git cherry-pick🍒コマンド知らなかったし、「ブランチ消す？！え？！」ってなったけどサクッと解決してまじ神。


 めちゃくちゃ親切にしてもらいお礼を言ったら、「新卒の時にサポートしてもらったから自分もサポートしたい気持ちがある。自分も勉強になったからありがとう（意訳）」って言ってくれてエンジニアとしても尊敬すべき姿でした。姿勢も含めて見習います。

 Thank you Binhさん！
cookieとsession

# 背景
cookieとsessionの違いがいまいち理解できていなかったので整理

# cookie とは
key=value形式でブラウザに保存されるテキストのこと
サーバーからブラウザに対してcookieを保存するかどうかを指示する

サーバーからブラウザにcookieにsessionIdを保存するように指示している
![スクリーンショット 2024-01-17 3.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730996/257a0afe-b03d-032d-694a-0a77e47a9460.png)

ブラウザがサーバーにアクセスするたびにcookieのsessionIdを送信している
![スクリーンショット 2024-01-17 3.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730996/ded70bbd-4f90-20e4-af09-350757e1e75b.png)

# session とは
サーバー側でクライアント側のデータを保持する仕組み
複数のページでログイン情報やカートの情報を保持できるのはこれを活用している
セッション情報はブラウザごとに分けて保存されていて、セッションIDで紐づけている

# cookie と session の違い
cookie はブラウザにデータを保存するもの
session はサーバーにデータを保存する仕組み

# cookie のセキュリティ対策について
cookieのは属性がある

|属性|意味|
|-|-|
|Domain|ブラウザがcookieを送るサーバーのドメイン|
|Path|ブラウザがcookieを送るURLのディレクトリ|
|Expires|cookieの有効期限 指定しない場合はブラウザを閉じるまで|
|Secure|SSL(HTTPS)のみcookieを送信|
|HttpOnly|Jsからcookieにアクセスするかどうか|

domain属性は基本変更しない
HttpOnly属性をつけないとXSSでcookieが盗み出される恐れがある(それ以外の要因もある)

# 参考文献
安全なWebアプリケーションの作り方
著者: 徳丸 浩
[Amazon](https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E7%AC%AC2%E7%89%88-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8/dp/4797393165)
Pythonで「関数を呼び出すときに引数を使って値を渡す」の動作を確認してみた

# 概要

Pythonで「関数を呼び出すときに引数を使って値を渡す」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/userfunc/index2.html

# 実装
以下のファイルを作成しました。
```sample.py
def myfunc(str1, num1):
    print("Name: " + str1 + ", Old: " + str(num1))

myfunc("Yamada", 28)
myfunc("Suzuki", 32)

def myfunc(mylist):
    print("Name: " + mylist[0] + ", Old: " + str(mylist[1]))

myfunc(["Yamada", 28])
myfunc(["Suzuki", 34])

def myfunc(num1, num2):
    return num1 + num2

myfunc(10, 20)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Name: Yamada, Old: 28
Name: Suzuki, Old: 32
Name: Yamada, Old: 28
Name: Suzuki, Old: 34
```

# まとめ

何かの役に立てばと。
AtCoder Beginner Contest 336 (バチャ) 振り返り

今回は家庭の事情で参加できなかったので、toyboot4eさんにバチャを作成してもらいました。toyboot4eさんありがとうございます！
https://kenkoooo.com/atcoder/#/contest/show/27c015a7-380c-4485-b22a-750873666b24

※前回の記事はこちら
https://qiita.com/flowerhill/items/ce81230c32675dd31cc3

## 今回の結果

今回は危なげなくA,B,C　3完でした。本番も参加できてたらなあ。

![スクリーンショット 2024-01-17 2.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167729/78263c4d-925f-c6ea-b190-8edc798332c1.png)

## 各問題の振り返り

### A - Long Loong

- [問題文](https://atcoder.jp/contests/abc336/tasks/abc336_a)
- [自分の回答](https://atcoder.jp/contests/abc336/submissions/49355566)

文字列を`'L'`と`'ng'`の間に指定された回数`'o'`を連結する方法です。`replicate`を使って繰り返し文字列を連結します。

```haskell
main :: IO ()
main = do
  n <- readInt

  putStrLn $ "L" ++ replicate n 'o' ++ "ng"
```

### B - CTZ

- [問題文](https://atcoder.jp/contests/abc336/tasks/abc336_b)
- [自分の回答](https://atcoder.jp/contests/abc336/submissions/49355886)

2進数に変換して、末尾に`0`が何個続くかをカウントする問題です。
2で割って余が1になるまでの数をカウントします。

```haskell
main :: IO ()
main = do
  n <- readInt

  print $ cntDigitZero n

cntDigitZero :: Int -> Int
cntDigitZero n = go n 0
  where
    go l count = if r == 0 then go q (count + 1) else count
      where
        (q, r) = l `divMod` 2
```

- [問題文](https://atcoder.jp/contests/abc335/tasks/abc335_c)
- [自分の回答](https://atcoder.jp/contests/abc335/submissions/49092424)

### C - Even Digits 

- [問題文](https://atcoder.jp/contests/abc336/tasks/abc336_c)
- [自分の回答(TLE)](https://atcoder.jp/contests/abc336/submissions/49357237)
 
`(0,2,4,6,8)` のみが登場する数字で、小さい値から`N`番目の値を求める問題です。実質的に5進数なので、Bと同様に5で割って行きます。
5で割った余をindexとして使い、`[0, 2, 4, 6, 8]`から値を取得した値がその桁の値になります。
こうして取得した値を元の値の頭に追加して行くのですが、計算して足すのが面倒なので文字列で頭に連結するやり方にしました。

こうして解いた回答が以下です。

```haskell
main :: IO ()
main = do
  n <- readInt

  putStrLn $ solve n

solve :: Int -> String
solve n = init (go (n - 1) "0")
  where
    go :: Int -> String -> String
    go l ans = if l < 5 then conc (lst !! l) ans else go q $ conc (lst !! r) ans
      where
        (q, r) = l `divMod` 5
        lst = [0, 2, 4, 6, 8]
        conc m n = show m ++ n
```

## 全体を振り返って

今回はn進数への変換がメインだったのかなーという印象でした。
それほど難しくなかった印象なので、どこかでD問題をやりたいと思ってます。
[論文備忘録] DETR (End-to-End Object Detection with Transformers), 2020

[End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872)

物体検出をend-to-endで行うDNN。画像を入力として (class, bounding box) を出力する。(最大N個) 
bonding boxは、中心座標と幅長と縦長からなり、画像のサイズに対して[0, 1]に正規化されたもの。
Transformerを用いており、個々のオブジェクトの推定の際にも全体を考慮することができる。

**損失関数の計算**

Ground Truthのオブジェクトの集合をyとおく。また、N個の推定結果は次のように表す。
![DETR (End-to-End Object Detection with Transformers), 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/3c74e7d4-8652-6493-e144-55a4e3279b8a.png)

クラスがない場合はφで表す。 
y^の推定結果は順不同なため、y^のオブジェクトの順によって値が変わらないような損失関数が必要になる。

そのためにまず、y^とyが最も良くマッチするような置換σ^を見つける。
この置換はHungarian algorithmを用いることで、効率的に見つけることができる。
式で表すと:
![DETR (End-to-End Object Detection with Transformers), 2020-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/892e3139-645c-d196-4ecf-4a4d60de93ee.png)

ただし、Lmatch（コスト）は:
![DETR (End-to-End Object Detection with Transformers), 2020-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/db3b1d2c-b86d-1a90-2ab8-533dcde1e873.png)

ここで、
第一項は推定結果が正しいクラスを選択する確率。
第二項はバウンディングボックスが正解と推定結果でどの程度違うかで、次のように表される:
![DETR (End-to-End Object Detection with Transformers), 2020-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/ab6d04ac-bcfa-6d51-ec8c-15b21501327c.png)

IoUは２つの領域が完全に重っていれば1、全く重なっていなければ0となるもので、IoU損失は1 - IoU。また、実装ではGIoUを用いている。 
L1損失だとオブジェクトの大きさが異なると、相対的には同じだけの誤差が異なる値になるので、Scale invariantなIoU損失も併せて導入している。

次に、見つかった置換σ^を用いて損失関数を計算する:
![DETR (End-to-End Object Detection with Transformers), 2020-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/4403ece0-2ea6-dde3-d28a-56f76941b6db.png)

**アーキテクチャ**

![DETR (End-to-End Object Detection with Transformers), 2020-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/c40596fd-f63c-6774-fbb9-1d18024a3ade.png)

画像はCNN層(ResNetのCNN層を取り出したもの)で縦と横を1/32にスケール変換(H, W)、チャネル数(=トークンの次元数)dに変換し、encoderに入力。
decoderでは、N個の学習可能なトークン(object query)を入力として、それらの出力をclass用(softmax)とbox用(sigmoid)にそれぞれ線形変換したものを出力とする。
object queryを用いることで、逐次的にobjectを推定していくのではなく、一度に並列にobjectを推定することができる。

![DETR (End-to-End Object Detection with Transformers), 2020-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/5ba5ec7a-8730-e4f8-8a92-f9453c2281e7.png)

**DETR for panoptic segmentation**

DETRはstuffとthingsの周囲のboxを推定するように訓練する。（Hungarian matchingではboxの距離を使うため、boxの推定は必要）

decoderの出力を入力として、encoderの出力に対するattention scoreをM個のヒートマップとして出力するようなmulti-head attention (M heads)を追加。
最終的な推定には、出力されたヒートマップを入力として解像度を上げた二値マスクを出力するFPNのようなネットワークを使う。（バックボーンのResNetもlateralで繋がる）
（クラスごとに出力されたマスクを使ってセグメンテーションする）

![DETR (End-to-End Object Detection with Transformers), 2020-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/f0c124da-6ae9-cf41-18dc-9c368c09f6bf.png)
[論文備忘録] Panoptic Quality (Panoptic Segmentation), 2018

[Panoptic Segmentation](https://arxiv.org/abs/1801.00868)

semantic segmentation (stuff)とinstance segmentation (things)を統合したpanoptic segmentationを提案。

![Panoptic Quality (Panoptic Segmentation), 2018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/2d4b9919-43fe-fd54-0506-15ec7c2a677d.png)

**タスクフォーマット**

各ピクセルiにsemantic class (l_i)とinstance id (z_i)をマップする:
![Panoptic Quality (Panoptic Segmentation), 2018-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/81899d78-bd20-ddaf-8912-8a6ed91655a6.png)

z_iは同じsemantic classのピクセルを個別のセグメント(segment)にグループする。
曖昧もしくはクラスに属さないピクセルにはvoid labelがアサインできる。（e.g. すべてのピクセルがsemantic labelを持つとは限らない）

semantic classはstuffとthingsに大別される:
![Panoptic Quality (Panoptic Segmentation), 2018-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/6e99e03e-435c-37df-5609-a4bf78e05fbf.png)
かつ
![Panoptic Quality (Panoptic Segmentation), 2018-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/67e73ffc-d44d-9628-fada-44ba18ad5f21.png)
また、stuffではz_iの値は無視される。

**Panoptic Quality**

panoptic segmentationの評価尺度。
ground truthに対するpredicted panoptic segmentationのqualityを評価する。

![Panoptic Quality (Panoptic Segmentation), 2018-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/b9950647-32bd-a428-8f6e-944f53bbcef6.png)

*1. Segment matching*

predicted segmentはground truth segmentに対してintersection over union (IoU)が0.5より大きいときにマッチできる。（注: マッチするにはsemantic classが一致する必要もある）
これはpanoptic segmentationのnon-overlapping propertyな特性と併せてunique matchingを与える。（各ground truth segmentにつき、せいぜい1つのpredicted segmentがマッチする）

*2. PQ Computation*

次のようにPQをクラスごとに独立して計算し、その平均をとったものを評価値とする。

![Panoptic Quality (Panoptic Segmentation), 2018-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/feec6b2d-88de-0f7c-5d29-0b21b7e7ed2e.png)

true positive (TP): マッチしたセグメントのペア
false positive (FP): マッチしなかったpredictedセグメント
false negative (FN): マッチしなかったground truthセグメント

0.5|FP|と0.5|FN|がペナルティとして分母に加えられていて、それを除いたものはマッチしたセグメントのIoUの平均値。

Note: すべてのセグメントはそのエリアに関わらず同じ重要度を持つ。

また、PQは次のようにsegmentation quality(SQ)とrecognition quality(RQ)を掛けたものとみなすこともできる:
![Panoptic Quality (Panoptic Segmentation), 2018-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/cf5f92d0-3c0e-1c7f-3ceb-711a33f7963c.png)
[論文備忘録] BiFPN (EfficientDet: Scalable and Efficient Object Detection), 2019

[EfficientDet: Scalable and Efficient Object Detection](https://arxiv.org/abs/1911.09070)

![BiFPN (EfficientDet- Scalable and Efficient Object Detection), 2019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/1cb2b384-3cfe-19e1-716e-9f597208b605.png)

FPNは次のように表される:
![BiFPN (EfficientDet- Scalable and Efficient Object Detection), 2019-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/28a9af83-48c1-3c72-5f44-421807f6ffe1.png)

BiFPNでは、top-down pathのあとにbottom-up pathを加えてアウトプットとする。 また、edgeが1つになるtop-downの両端のノードは影響が少なそうなので省く。 さらに、オリジナルのインプットから同じ階層のアウトプットノードにエッジを張る。

FPNでは横方向と縦方向を単純に足し合わせてマージしていたが、それぞれの出力に対する影響は異なり得るので、BiFPNではノードごとに次のように重み（スカラ値）を調節する:
![BiFPN (EfficientDet- Scalable and Efficient Object Detection), 2019-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/de49bd64-2343-123f-6a09-b6d81b4004a2.png)

BiFPNは次のように表される:
![BiFPN (EfficientDet- Scalable and Efficient Object Detection), 2019-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/c55e3ac2-88ef-fa96-0b5d-d9699dd4c013.png)

性能をスケールさせるため、BiFPN layerを複数繋げてBiFPN networkとして使う。（Figure 3は深さ3の例）

![BiFPN (EfficientDet- Scalable and Efficient Object Detection), 2019-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/2d9d5c5f-f875-8abc-083c-388ea00f7341.png)
[論文備忘録] FPN (Feature Pyramid Networks for Object Detection), 2016

[Feature Pyramid Networks for Object Detection](https://arxiv.org/abs/1612.03144)

ResNetなど、ConvNetでは強い特徴になるほど一般的には解像度が下がってしまう。 提案手法では、解像度が低く強い特徴マップから、解像度が高く強さも保った特徴マップを出力する。

Bottom-up pathway: The bottom-up pathway is the feedforward computation of the backbone ConvNet.

Topdown pathway and lateral connections: 低解像度で強い特徴マップから高解像度な特徴マップを作っていく。
粗い特徴マップから最近傍補間で2倍にアップスケールしていく。
これらの特徴マップはbottom-up pathwayの同じサイズの特徴マップとマージされる。（lateral connection）
lateral connectionには1x1でチャネル数固定のconvolutional layerを掛ける。

![FPN (Feature Pyramid Networks for Object Detection), 2016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/42190bd5-b45c-645d-e235-28b1c503976b.png)

![FPN (Feature Pyramid Networks for Object Detection), 2016-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/9361faa6-e803-18d5-8bf5-826a465248ac.png)

![FPN (Feature Pyramid Networks for Object Detection), 2016-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/1c3f0b30-976d-615b-a6d1-56a91bd2590a.png)
【初学者向け】Railsにおけるselfの理解：初学者向けイメージガイド

# 初学者向けself.の使い方について

Ruby on Railsを学習して1ヶ月経ったので
1ヶ月前の自分が分からなかった事の一つselfについて
初学者なりにイメージしやすい使い方を伝えようと思います。
出来るだけ専門用語を使わずに書きますが
抜け漏れ誤りがあればご指摘してもらると助かります。


## self.とは
chatgptに専門用語を使わずにselfとは何か質問したら下記の返答がありました。

>「selfは、RubyやRailsで使われる言葉で、
特定のコードの中で __「自分自身」__ を指すキーワードです。
例えば、あるオブジェクトが自分自身のメソッドを呼び出す場合や、
クラス内で自分自身にアクセスする場合に使います。簡単に言えば、
そのコードの中で「私（自分自身）」を指すものと考えれば良いです。」

はい、どうでしょうか？イメージ出来ますか？
selfを学び始めの頃の自分には __「自分自身」__ ってどういう事？ってなってました。
なのでこれから __「自分自身」についてイメージしやすくしていきます。__

※以下の図を理解するにはRailsの基礎MVCについて
なんとなくでもいいので理解する必要があります。

Railsの処理の流れ
![スクリーンショット 2024-01-17 1.08.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588056/64ba58f6-9987-b7db-4300-2da0e495a96f.png)

短時間で作ったので見にくい箇所もあるかもしれませんが
Railsは上記の図の①から順に処理をしています。
selfを使うのはMVCのM、モデルファイルにて使用します。

#### ではモデルとは何をするファイルでしょうか？
モデルファイルはデータベース内のテーブルにアクセスし、
データの取得や保存を行うためのコードが記述するファイルです。
先ほどの図の④、⑤を見るとイメージしやすいと思います。

そしてモデルファイルはデータベースの一つのテーブルに対して一つのみ存在します。

実際にデータベースを作成した事がある方は分かると思いますが、
ターミナルで`bin/rails generate model (モデル名)`を実行すると
マイグレーションファイル（データベースの変更やテーブルの作成に関するコードが含まれるファイル。例: db/migrate/(タイムスタンプ)_create_(モデル名.pluralize).rb）と
モデルファイル（データベーステーブルの構造やデータの操作に関するコードが含む。
例: app/models/(モデル名).rb)が作成されます。



今回は以下のようにマイグレーションファイルに記述してマイグレーションするとします。
（マイグレーションとは、データベースの構造を変更するための手順を定義したファイルのことです。これによって、新しいテーブルを作成したり、既存のテーブルに新しいカラムを追加したりすることができます。マイグレーションファイルには、その変更内容が記述されています。）

```php
        class CreateUsers < ActiveRecord::Migration[6.0]
          def change
            create_table :users do |t|
              t.string :name
              t.integer :age

              t.timestamps
            end
          end
        end
```
上記のコードでUsersテーブルを作成し、
カラムには名前が入る「name」年齢が入る「age」を入れています。

説明が長くなりましたがこれから実際にselfを使わない場合と使う場合を見ていきましょう。

モデルファイル(app/models/user.rb)
### selfを使わない場合

```php:app/models/user.rb
    class User < ApplicationRecord
        def User.create_new_user(name, age)
          user = User.new(name: name, age: age)
          user.save
          user
        end
    end
```


### selfを使う場合

```php:app/models/user.rb
    class User < ApplicationRecord
        def self.create_new_user(name, age)
          user = self.new(name: name, age: age)
          user.save
          user
        end
    end
```

実用的なコードではありませんが、
使う場合と使わない場合どちらも同じ処理です。

selfを使う場合と使わない場合を比較すると
User.と記述するかself.を記述するかの違いが分かります。
先程も書いた内容ですが、
「モデルファイルはデータベースの一つのテーブルに対して一つのみ存在します。」

つまりモデルファイル「user.rb」とUsersテーブルは繋がっていて、
Usersテーブルからデータの取得や保存を行うためのコードは
__「user.rb」にしか__ 記述が出来ません。

上記の事から
Usersテーブルを利用したコードをuser.rb内に記述するのに
わざわざUser.と記述するのではなく、
self.(自分自身)と記述すれば
プログラムが「User.の事か」と解釈してくれます。






## 最後に
今回はself（自分自身）についてイメージしやすくする為に
出来るだけ専門用語を少なくして説明しました。

基本的な内容なので、例外もある内容だと思いますが
抜け漏れ誤りがある場合はご指摘頂けると助かります。

自分もまだ初学者の部類ですが、Rails勉強始めて間もない方の参考になれば嬉しいです。

ちなみにRails学習していくとselfは省略出来る事を学ぶので
学習後半には使わない場面があると思います。
例えば先ほどのコードだと
```php
    class User < ApplicationRecord
        def self.create_new_user(name, age)
          user = new(name: name, age: age)
          user.save
          user
        end
    end
```
上記のようにself.newではなくnewだけで大丈夫です。
[論文備忘録] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis, 2020

[NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis](https://arxiv.org/abs/2003.08934)

機械学習モデル:
![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis….png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/f10d8198-3b6e-cff4-dc7e-edb0be94e0f5.png)

xは三次元座標(x, y, z), dは視線の方向, cはRGBカラー, σは密度（不透明度）
σは(x, y, z)のみから決まり、cはそれに加えてdも使う。

dの表現に必要なのは2次元だが、実際には三次元の単位ベクトルで表す。

FΘは、ボリュメトリックレンダリングで各ピクセルの値C(r)を計算するときに使う:

![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis…-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/54603393-2ccc-5b86-015d-5a692f841b34.png)

ただし、
![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis…-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/44590553-da15-cffb-056e-b52cbcbe0970.png)

離散的には:
![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis…-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/625686b3-f6a2-40a2-7c8a-56fdbc4170ff.png)

ただし、次のように光線上の点を一様分布からサンプルする:
![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis…-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/1bac952c-d409-265c-62aa-fc521f15309c.png)

性能を改善するために、以上の手法から改良したところがある。

高周波数の表現を改善するために、xとdの各次元の要素に対して次の変換をしたものをMLPの入力に使う。
![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis…-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/1a28583b-67b6-4069-356c-622c2b3a54c8.png)

ただし、
![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis…-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/45ade343-75cf-6cac-be62-2067f0f4ee08.png)

一様分布から点をサンプルするかわりに、重要そうな点を重点的にサンプルするようにする。
そのために、coarse networkとfine networkを使う。
これまでのように一様分布でサンプルしてcoarse networkを計算し、影響が大きい箇所から重点的にfine network用の点をサンプルする。
最終的なレンダリングにはfine networkを使うが、その計算にはすべてのサンプルを使う（Nc+Nf）

学習では、イテレーションごとに、データセットのすべてのピクセルからランダムにサンプルしたピクセルのバッチを使う。
損失関数は単純に正しい色とレンダリングした色との自乗誤差の合計
![NeRF- Representing Scenes as Neural Radiance Fields for View Synthesis…-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303/1771ae6c-ed0f-2224-41d6-5427809a5260.png)
Node.jsでAzure Open AIのライブラリ(@azure/openai)を使ってAzure Open AIを使うメモ2


[先月書いた記事](https://qiita.com/n0bisuke/items/703943870d5a04fc2205)のAzure OpenAIのJavaScript SDKの仕様が変わったのかそのまま動かない状態になっていたので更新版です。

SDKのアップデートが激しくてちょっと見逃すとメソッドが消えてるとかあるのかもしれません。

## client.listChatCompletions()が動作しなくなっている?

ちょっと定かではないですがclient.listChatCompletions()のメソッドが[ドキュメントページ](https://learn.microsoft.com/ja-jp/javascript/api/%40azure/openai/openaiclient?view=azure-node-preview)に記載がなく`getChatCompletions()`になったように見えました。



## getChatCompletions利用版

Node.jsでと言いつつBunで実行しています。

### 環境

- 実行環境: Bun v1.0.21
- (Node.js v21.2.0 同じコードで動作)
- SDK: @azure/openai v1.0.0-beta.10,
- モデル: `gpt-35-turbo`

### インストールなど

```bash
$ bun init -y
$ bun i @azure/openai
```

### コード

モデルは`gpt-35-turbo`

```js
import { OpenAIClient, AzureKeyCredential } from "@azure/openai";

const endpoint = `https://XXXXXXX.azure.com/`; //エンドポイント
const azureApiKey = `YYYYYYYYYYY`; //APIキー
const deploymentId = "gpt-35-turbo" //デプロイ名

async function main(){
    const client = new OpenAIClient(endpoint, new AzureKeyCredential(azureApiKey));
    const messages = [
        { role: "system", content: "あなたはプログラミングの先生で、ユーザーはあなたの生徒です。質問に対してユーモアを混ぜて回答してください。" },
        { role: "user", content: "JavaとJavaScriptの違いを教えてください。" }
    ];
    
    console.log(client.getChatCompletions)

    console.log(`Messages: ${messages.map((m) => m.content).join("\n")}`);
    const result = await client.getChatCompletions(deploymentId, messages, { maxTokens: 256 });

    for (const choice of result.choices) {
      console.log(choice.message);
    }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});
```

### 実行

```bash
$ bun app.js

Messages: あなたはプログラミングの先生で、ユーザーはあなたの生徒です。質問に対してユーモアを混ぜて回答してください。
JavaとJavaScriptの違いを教えてください。
{
  role: 'assistant',
  content: 'JavaとJavaScriptの違いは、まず名前の違いです。それと、Javaはコーヒー豆由来の名前ですが、JavaScriptは完全に関係のない名前です。\n' +
    '\n' +
    'そして、Javaは静的型言語であり、主にバックエンドの開発に使用されます。一方でJavaScriptは動的型言語であり、主にフロントエンドの開発やWebページの動的な挙動を制御するために使用されます。\n' +
    '\n' +
    'つまり、Javaはコーヒーを淹れるのに使えるかもしれませんが、JavaScriptはコーヒーとは何の関係もありません。',
  toolCalls: []
}
```
可変長引数【Java】

### 可変長引数とは
Java言語における可変長引数は、メソッドに任意の数の引数を渡すことができる機能です。
メソッドの定義側では配列と同じように扱います。
また、呼び出し側で直接配列を指定することも可能です。


### 書き方
::: note
メソッド定義側
型と引数名の間に「…」を入れて書く。
```
例）static void Sample(String... name) {}
```

異なる型を引数に指定する場合は、以下のように**最後**に可変長引数を定義します。
```
例）static void Test(int num, byte b, String... name) {}
```
:::

::: note
メソッド呼び出し側
引数を通常通りカンマ区切りで定義します。
```
例）Sample("111", "abc", "aiueo");
```
:::
alpine linux 実機チャレンジメモ(頓挫)

# ?
yoga650にAlpine+KDEを入れて実用を試みたが日本語化等上手くいかず頓挫したのでメモ

### 起動
rootでログイン
```sh
setup-keymap
setup-interfaces
```

### パーティショニング
```sh
apk add cfdisk blkid
blkid
cfdisk /dev/nvme0n1
	#550M efisystem
	#16G linuxswap
	#Free space (linuxfilesystem)
	#windowsが残っている(efi msreserved msbasicdata winrecoveryenv)ことを確認してwrite
	#quit
blkid
	#パーティション番号確認
	#(efi swap main: p4 p5 p6)
reboot
	#なぜかp4を認識しなかったので再起動
setup-alpine
	キーボードを設定 jp jp
	pcの名前enter
	ネットに接続
	rootぱすわーど
	タイムゾーン Asia/Tokyo
	apk mirror enter連打
	user enter
	disk enter
```

### フォーマットとマウント
```sh

apk add e2fsprogs
mkfs.vfat /dev/nvme0n1p4
mkfs.ext4 /dev/nvme0n1p6
mount -t ext4 /dev/nvme0n1p6 /mnt
mkdir /mnt/boot
mount /dev/nvme0n1p4 /mnt/boot
lsblk
	#/mnt/boot [SWAP] /mnt
```

### スワップ領域の作成
```sh
mkswap /dev/nvme0n1p5
swapon /dev/nvme0n1p5
lsblk
	#[SWAP]がついたことを確認
# fstabに書いとく
rc-update add swap boot
```

### alpineインストール
```sh
setup-disk -m sys /mnt
```

## デスクトップ環境のインストール
```sh
apk add nano
nano /etc/apk/repositories # ~communityの#を外す
apk add plasma xf86-input-libinput sudo
nano /etc/sudoers # wheel ALL ALLみたいな行を有効化
adduser ユーザー名 wheel
rc-update add elogind
rc-update add polkit
rc-update add sddm
```
## wifiまわり
```sh
apk add networkmanager networkmanager-wifi
adduser ユーザー名 plugdev
rc-update add networkmanager
rc-update add iwd
rc-update del networking boot
rc-update del wpa_supplicant boot
nano /etc/NetworkManager/NetworkManager.conf
```

```conf
[main]
dhcp=internal
plugins=ifupdown,keylife

[ifupdown]
~~

[device]
~~
wifi.backend=iwd

```
### windowsとハイバネート

```sh
apk add os-prober
blkid
nano /etc/default/grub # resume=UUID=xxx...
grub-mkconfig -o /boot/grub/grub.cfg
```
量子コンピュータの用語まとめ

# はじめに
ここでは量子コンピューターに関する用語や知識をまとめていきます
この内容についてわかりやすく知りたいという人のため作成していきます。

# 量子ビット(Qubit)
通常のビットとは異なり、量子ビットは0と1の重ね合わせを取ることができる。これにより、同時に多くの計算を行うことが可能。
# 量子重ね合わせ
量子ビットが0と1の両方の状態に同時に存在すること。これにより、複数の可能性を同時に処理できる。
# 量子もつれ
2つ以上の量子ビットが互いに依存し合い、一方の状態が変化すると、もう一方も同時に変化する現象。
# 量子ゲート
量子コンピュータで情報を処理する基本的な操作。古典的な論理ゲートに類似しており、量子ビットの状態を変更する。
# 量子超越性
量子コンピュータが古典的なコンピュータよりも高度な計算を行える現象。具体的な問題において指数関数的な速度向上が期待される。
# ノイズ耐性
量子コンピュータが外部のノイズやエラーに対してどれだけ頑健であるか。誤り訂正などがその一環。
# 量子プログラミング言語
量子コンピュータ上でプログラムを記述するための言語。QiskitやCirqなどがあり、量子アルゴリズムの実装に使用される。
# デコヒーレンス
量子ビットが外部環境と相互作用してしまい、情報が失われる現象。デコヒーレンスの影響を抑えるのが課題。
# 量子アルゴリズム
量子コンピュータを使用して解決できる問題に適したアルゴリズム。例えば、ショアの素因数分解アルゴリズムやグローバーの探索アルゴリズムなど。
# 量子ボリューム
量子コンピュータの性能を示す指標。エラー率やゲート数、量子ビット数などが組み合わさったもの。

# まとめ
以上これらが私の調べた用語をまとめていきました。量子コンピュータの基本原理や量子ビットの特性について学ぶと、古典的なコンピュータとは異なるアプローチに驚きを感じました。量子もつれや重ね合わせの特性に興味があり、こういった分野に関する知識は急速に進化している分野であり、学び続けることが重要だと思いました。

# 参考文献
https://www.nri.com/jp/knowledge/glossary/lst/ra/quantum_computer#:~:text=量子コンピュータとは、「量子,が期待されています%E3%80%82

https://ja.wikipedia.org/wiki/量子コンピュータ
Rubyにおけるトランザクションについて調べてみた

トランザクションは、一連の操作を単一の作業単位として扱うことを指します。
Rubyでは、データベースライブラリやORM（Object-Relational Mapping）ツールを使用してトランザクションを扱います。

## トランザクションの基本概念
### トランザクションとは
トランザクションは、一連のデータベース操作が「全てまたは何も」（all-or-nothing）の原則に従って実行します。
これは、**複数の操作を含む処理が完全に成功する** か、あるいは **失敗した場合には何も変更せず元の状態に戻す** かのどちらかです。

### ACID特性
トランザクションはACID特性というものに従っています、詳しくは別の記事を書く予定です。

- 原子性（Atomicity）:
トランザクション内の全ての操作は、単一の単位として扱われます。
全て成功するか、一つでも失敗すれば全てがロールバックされます。

- 一貫性（Consistency）:
トランザクションはデータベースを一貫した状態から別の一貫した状態へと変更します。
これにより、データの整合性が保たれます。

- 隔離性（Isolation）:
同時に実行される複数のトランザクションは互いに影響を及ぼさないように隔離されます。
これにより、並行処理時の問題を防ぎます。

- 耐久性（Durability）:
トランザクションが一度完了すると、その結果はシステム障害が発生しても維持されます。

## Rubyにおけるトランザクションの使用例
Rubyでデータベースのトランザクションを扱う場合のActiveRecord（Ruby on Railsの一部）を使用した例です。

``` ruby
ActiveRecord::Base.transaction do
  user = User.find(1)
  user.name = '新しい名前'
  user.save!

  # 何らかの理由でエラーが発生した場合、上記の変更はすべてロールバックされる
  raise 'エラーが発生しました！'
end
```
この例では、ActiveRecord::Base.transactionブロック内でデータベース操作を行っています。
このブロック内でエラー（例：例外の発生）があった場合、そのブロック内の全ての変更は自動的にロールバック（取り消し）されます。これにより、データの一貫性が保たれます。

:::note info
User.find(1)はデータベースからIDが1のユーザーを探します。
user.save!は変更をデータベースに保存します。save!メソッドはエラーが発生した場合に例外を投げるため、トランザクション内で使用されることが多いです。
:::

## まとめ
トランザクションは、データベース操作においてデータの正確性と信頼性を保つための重要な要素です。
トランザクションを適切に管理することで、アプリケーションは予期しない状況でもデータの整合性を維持し、ユーザーに対して正確な情報を提供することができます。
Rubyにおける「~」記号の使い方（再投稿）

Rubyで「~」記号は、主に否定演算子として、また正規表現のマッチング、特殊なメソッド名の一部として使用されます。

## 1. 否定演算子（Bitwise NOT）
否定演算子としての「~」は、ビット単位の否定を行うために使われます。これは、整数の各ビットを反転させる操作です。

例:
``` ruby
a = 0b0101  # 5の二進数表現
~a          # => -6
```
:::note info
この例では、0b0101の各ビットが反転され、0b1010の補数が計算されます。Rubyでは整数は補数形式で保持されるため、結果は-6になります。
:::

## 2. 正規表現マッチ演算子
「~」は正規表現と文字列のマッチングにも使用されます。この場合、正規表現オブジェクトに対して使用され、マッチした場合はその位置を、マッチしない場合はnilを返します。

例:
```ruby
"hello" =~ /e/   # => 1
/e/ =~ "hello" # => 1
```
:::note info
注釈:
最初の例では、「hello」の中で「e」が最初に現れる位置（1）を返しています。
二番目の例では、同じ操作を~を使って行っています。
:::

## 3. 単項演算子としての使用
Rubyでは、~をオーバーロードして、クラスによっては特殊な意味を持たせることができます。

例:
``` ruby
class MyNumber
  def initialize(num)
    @num = num
  end

  def ~
    -@num
  end
end

n = MyNumber.new(5)
~n  # => -5
```
:::note info
注釈:
この例では、MyNumberクラスで~演算子をオーバーロードし、オブジェクトの数値の符号を反転させる
機能を定義しています。nがMyNumberのインスタンスである場合、~nはnの数値の符号を反転させた値（この場合は-5）を返します。
:::


## まとめ
この記事は一度作ったものの修正です、コメントをいただいていたのですが、初めてのコメントに動揺して間違えて削除してしまったため、修正し再投稿します。
以前コメントをいただいた方ありがとうございました。