OmniAICreator/Qiita-1.07M huggingface dataset:
有名な受託開発会社のエンジニアの年収を比較してみた

## 受託開発とは？

受託開発とは、クライアントから仕事を受注してシステムを設計・構築することです。

作業時間に応じて報酬が支払われるSES（準委任契約）とは異なり、受託開発は受託したシステム・ソフウエアに対する完成（納品）までを負います。

## 自社開発との違いは？

自社開発とは読んで字のごとく、自社でシステムを作成し公開もしくは販売することを指します。

外注せずに自分たちで開発を行う以外は受託開発とはあまり業務の流れは変わりません。

---

エンジニア向け案件獲得プラットフォームのエンジニアやっているのでサービス覗いてみてください🙏

[ISSUEの会員登録はこちらから](https://i-ssue.com/users/signup)

---

## 受託開発のメリット

受託開発のメリットは主に以下の3つが挙げられます。

- 幅広い開発に携わることで、知識の習得とスキルアップができる
- 他企業との人脈形成を行いやすい
- 安定して仕事が獲得しやすい

### 幅広い開発に携わることで、知識の習得とスキルアップができる

基本的に受託開発は1社のみの開発ではなく、複数の企業から開発を受注します。企業によって発注する内容は異なり、開発に使用する言語や技術も異なるため、さまざまな知識やスキルを身につけることができます。

### 多くの企業と関係を持てる

受託開発は1つの企業のみの開発はしておらず、複数の企業から発注を受けシステムを開発しています。そのため、多くの企業と関係を持ちやすくそこからステップアップするエンジニアも多々見られます。エンジニアはスキルだけでなく人脈もとても大切なため、大きなメリットと言えるでしょう。

### 安定して仕事を獲得がしやすい

発注した企業が想像する以上の高品質の納品物を制作することで、依頼者はとても満足してくれます。満足してもらえればまた依頼をもらいやすくなり、他の企業にもおすすめしてくれる可能性があるため、安定して仕事が獲得しやすい傾向にあります。

## 受託開発のデメリット

受託開発ならではのデメリットは主に以下の3つが挙げられます。

- 開発コストが発生する
- 開発の途中で仕様や要件の変更が難しい
- オリジナルのシステム開発のため運用〜システム更新までの管理が必要

### 開発コストが発生する

自社開発と比べ、開発コストが発生します。

基本的に受託開発はオリジナルでゼロからシステム開発を行うため、初期費用やトータルの開発費用が多くかかります。

### 開発の途中で仕様や要件の変更が難しい

開発を進めてしまうと、途中で仕様を変更がしづらくなります。

開発には前後の関係があり、一度終えた部分を変更となる場合は、全てやり直しになるケースも見られます。

小さな仕様変更であれば、引き受けてくれる場合もありますが、スケジュールの変更やリリースの遅延にもつながってしまいます。

そうならないためにも、発注した側は積極的にシステムのレビューに関わり、プロジェクトの管理は自社という認識を持つことが大切です。

### オリジナルのシステム開発のため運用〜システム更新までの管理が必要

成果物を納品した後でも、システム自体の保守、管理が必要となります。

自社で運用や保守を行いたくても、オリジナルでシステム開発を行っているため、システムの中身がわからないため、運用・保守に苦労する可能性があります。

受託開発は、運用・保守・システム管理を外注することも可能ですが、開発費用とは別途費用が発生するため、注意が必要です。

---

エンジニア向け案件獲得プラットフォームのエンジニアやっているのでサービス覗いてみてください🙏

[ISSUEの会員登録はこちらから](https://i-ssue.com/users/signup)

---


## 受託開発が衰退しない理由

IT技術の進歩により、自社でシステム開発を行う企業が増え、市場規模が小さくなっていますが、まだまだ自社で開発ができない企業は多く存在しています。

受託開発はデメリットも見られ古いと言われることもありますが、需要はなくならないでしょう。

その理由としては、2つあります。

- IT技術の高度化
- ITエンジニア不足による採用難

国内のIT技術の高度化により、ITの技術自体についていけない企業が多く見られます。

自社で開発を進めたくても開発にコストをかけづらく、システムを構築できない企業は、必然的にSlerに開発を委託することになります。

そのため技術力が優秀なエンジニアが増えない限りは、受託開発自体の需要はなくなりづらいと言えます。

## 受託開発会社20社の年収比較してみた
| 順位 | 会社名 | 年収（万円） |
| --- | --- | --- |
| 1 | (株)野村総合研究所 | 1232 |
| 2 | ＩＳＩＤ | 1057 |
| 3 | (株)オービック | 960 |
| 4 | 伊藤忠テクノソリューションズ(株) | 941 |
| 5 | ネットワンシステムズ(株) | 869 |
| 6 | 富士通(株) | 859 |
| 7 | (株)エヌ・ティ・ティ・データ | 852 |
| 8 | 日鉄ソリューションズ(株) | 845 |
| 9 | (株)大塚商会 | 823 |
| 10 | 日本電気(株) | 814 |
| 11 | BIPROGY(株) | 810 |
| 12 | テクマトリックス(株) | 783 |
| 13 | ビジネスエンジニアリング(株) | 761 |
| 14 | SCSK(株) | 752 |
| 15 | ＴＩＳ(株) | 741 |
| 16 | SBテクノロジー(株) | 728 |
| 17 | (株)BeeX | 711 |
| 18 | (株)サーバーワークス | 690 |
| 19 | (株)アイティフォー | 665 |
| 20 | (株)ソリトンシステムズ | 650 |

## 参考サイト
https://www.geekly.co.jp/column/cat-technology/1908_008/#--2

https://proengineer.internous.co.jp/content/columnfeature/18255#3

https://www.co-well.jp/blog/software_entrusted_dev

https://itpropartners.com/blog/14157/

https://www.publickey1.jp/blog/22/it_2022_si.html

https://and-engineer.com/articles/YFKV9hIAACAA0LaC

https://doda.jp/engineer/guide/it/013.html

----

▼Twitterでも発信しています
https://twitter.com/issueissue4
▼エンジニア向け案件獲得プラットフォーム
https://i-ssue.com/users/signup

＼ エンジニア募集のお知らせ ／
【3ヶ月限定】次世代の開発発注プラットフォーム「ISSUE」を開発してくれるテックリード募集
https://i-ssue.com/issues/d179971e-cfae-46ba-a32b-d550a7da4660l
GASでBacklogを操作したい！【Vol.1 プロジェクト情報取得編】

※まだまだ投稿が不慣れなので、温かい気持ちで読んでいただけると幸いです。

# 背景
Backlogのプロジェクトの課題の状況って毎日必要になるじゃないですか？
（上司への報告、チーム内の共有、自分への戒めw）
でもそれだけわざわざ見に行くのって面倒じゃないですか。。

勝手に毎日同じ時間に教えてくれるのなんてないかな〜

ないなら、どうする？ そう！ **作っちゃおう！**

# やったこと
* 特定のプロジェクトの課題を取得
* 特定のプロジェクトのステータスを取得
* ステータスごとの課題を取得
* PR（プルリクエスト）の取得　※おまけ※

# 前提
アクセスに必要なAPIキーの取得の仕方は[こちら](https://support-ja.backlog.com/hc/ja/articles/360035641754-API%E3%81%AE%E8%A8%AD%E5%AE%9A)

# 特定のプロジェクトの課題件数を取得
```javascript:getIssueCount()
  //エンドポイント
  endPoint = '/issues/count';
  //最終的なURL
  url = 'https://{ワークスペースのドメイン}/api/v2' + endPoint + '?apiKey=' + apiKey + '&projectId[]={プロジェクトID}';
  //取得＆整形
  const resIssues = UrlFetchApp.fetch(url);
  const jsonIssues = JSON.parse(resIssues.getContentText());
```
# 特定のプロジェクトのステータスを取得
```javascript:getStatuses()
  //エンドポイント
  endPoint = '/projects/{プロジェクトID}/statuses';
  //最終的なURL
  url = 'https://{ワークスペースのドメイン}/api/v2' + endPoint + '?apiKey=' + apiKey;
  //取得＆整形
  const resStatus = UrlFetchApp.fetch(url);
  const jsonStatus = JSON.parse(resStatus.getContentText());
```
# ステータスごとの課題件数を取得

```javascript:getStatusIssueCount()
  //エンドポイント
  endPoint = '/issues/count';
　//最終的なURL
  url = 'https://{ワークスペースのドメイン}/api/v2' + endPoint + '?apiKey=' + apiKey + '&projectId[]={プロジェクトID}&statusId[]={ステータスID}';
  //取得＆整形
  const resStatusIssues = UrlFetchApp.fetch(url);
  const jsonStatusIssues = JSON.parse(resStatusIssues.getContentText());
```
# PR（プルリクエスト）の件数取得　※おまけ※
特定のプロジェクトで状態がOPENのプルリクエストを取得する。

```javascript:getPullRequestCount()
  //エンドポイント
  endPoint = '/projects/{プロジェクトID}/git/repositories/{リポジトリ名}/pullRequests/count';
　//最終的なURL
  url = 'https://{ワークスペースのドメイン}/api/v2' + endPoint + '?apiKey={APIキー}&statusId[]=1';
  //取得＆整形
  const resPR = UrlFetchApp.fetch(url);
  const jsonPR = JSON.parse(resPR.getContentText());
```

（Slackに結果送信は[こちら](https://qiita.com/chara-gida/items/cefa7639690a9630b176)を参考に）

こんな感じで毎朝中野三玖に報告してもらってます✨
![スクリーンショット 2023-08-03 17.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748416/e89f8b08-eddb-5ff7-00ae-7f467fa76483.png)



# 最後に
GASでめんどくさいを自動化してハッピーライフ

# 参考
[GASとは](https://developers.google.com/apps-script)
[BacklogのAPIキー作成手順](https://support-ja.backlog.com/hc/ja/articles/360035641754-API%E3%81%AE%E8%A8%AD%E5%AE%9A)
Azure Blob Storage から Blob のダウンロード方法として、Azure CLI より .NET 用の SDK を使った方が断然早い

# 背景
Azure Blob Storage から Blob をダウンロードする方法はいくつかあるが、Azure CLI を使った方法は非常に時間がかかる。AZコマンドを実行しても動作するまでの無の時間も長い。

https://learn.microsoft.com/ja-jp/cli/azure/storage/blob?view=azure-cli-latest


今回は Microsoft が提供している .NET 用の SDK を使った方法がとても速かったので、2つのパターンでコードを紹介する。Azure CLI と比べてざっと 15 倍違った。

https://www.nuget.org/packages/Azure.Storage.Blobs

環境は .NET 6 を使用する。 

# 初期化
ダウンロード先はダウンロードフォルダ

```cs
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;

string connectionString = "<あなたの情報を入力してください>";
string containerName = "<あなたの情報を入力してください>";

BlobServiceClient blobServiceClient = new(connectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);

string receivePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @$"\Downloads\{containerName}\";
```

# 【パターン1】Blob コンテナにある Blob の Prefix を指定してダウンロードする方法
```cs
foreach (BlobHierarchyItem blobHierarchyItem in containerClient.GetBlobsByHierarchy(prefix: "<指定したい Prefix>"))
{
    // 特定の文字列が含まれている Blob のみをダウンロードしたい場合
    //if (!blobHierarchyItem.Blob.Name.Contains("<特定の文字列>"))
    //{
    //    continue;
    //}

    string blobFilePath = receivePath + blobHierarchyItem.Blob.Name;
    string? blobDirectoryPath = Path.GetDirectoryName(blobFilePath);
    if (blobDirectoryPath is null)
    {
        return;
    }

    if (!Directory.Exists(blobDirectoryPath))
    {
        Directory.CreateDirectory(blobDirectoryPath);
    }

    BlobClient blobClient = containerClient.GetBlobClient(blobHierarchyItem.Blob.Name);

    using FileStream fileStream = File.OpenWrite(blobFilePath);
    await blobClient.DownloadToAsync(fileStream);
    Console.WriteLine(blobHierarchyItem.Blob.Name);
}
``` 

# 【パターン2】Blob コンテナを全探索してダウンロードする方法
```cs
foreach (BlobItem blobItem in containerClient.GetBlobs())
{
    // 特定の文字列が含まれている Blob のみをダウンロードしたい場合
    //if (!blobItem.Name.Contains("<特定の文字列>"))
    //{
    //    continue;
    //}

    string blobFilePath = receivePath + blobItem.Name;
    string? blobDirectoryPath = Path.GetDirectoryName(blobFilePath);
    if (blobDirectoryPath is null)
    {
        return;
    }

    if (!Directory.Exists(blobDirectoryPath))
    {
        Directory.CreateDirectory(blobDirectoryPath);
    }

    BlobClient blobClient = containerClient.GetBlobClient(blobItem.Name);

    using FileStream fileStream = File.OpenWrite(blobFilePath);
    await blobClient.DownloadToAsync(fileStream);
    Console.WriteLine(blobItem.Name);
}
```
JuliaでMPI並列計算のちょっとしたコツ

Juliaで並列計算をする際にハマりがちな件を適宜追加しようかと思います。MPI.jlを使用します。

# バージョン
- Julia 1.9

# MPI.jlのインストール
すでにMPIがシステムに入っている計算機（スパコンなども含む）の場合、[こちら](https://juliaparallel.org/MPI.jl/stable/configuration/)に従ってインストールすれば良いのですが、簡単な方法について書いておきます。

まず、REPLで]キーを押してパッケージモードにして、
```
add MPIPreferences
```
としてMPIPreferencesをインストールします。次に、REPLで
```julia
using MPIPreferences
MPIPreferences.use_system_binary()
```
とします。これでエラーが出なければ、システムに入っているMPIを自動的に検出して設定してくれます。
対応しているMPIは

```
Open MPI
MPICH (v3.1 or later)
Intel MPI
Microsoft MPI
IBM Spectrum MPI
MVAPICH
Cray MPICH
Fujitsu MPI
HPE MPT/HMPT
```
です(2023年8月3日確認)。

この後
```
add MPI
```
をすればMPI.jlが使えます。



# 構造体の転送
構造体の転送はシンプルに行う事ができます。しかしわかりにくいかもしれませんので、サンプルコードを書いておきます。

```julia
using MPI

mutable struct MyStruct{T}
    x::T
    y::T
    data::Matrix{Float64}
    n::Int64
end

function main()
    MPI.Init()
    comm = MPI.COMM_WORLD
    nprocs = MPI.Comm_size(comm)
    myrank = MPI.Comm_rank(comm)

    mystruct = MyStruct(myrank,myrank*2,zeros(Float64,4,4),7)

    if myrank == 0
        mystruct.x = 100
        mystruct.y = 100
        mystruct.data = rand(4,4)	
    end


    mystruct = MPI.gather(mystruct,comm,root=0)
    
    MPI.Barrier(comm)

    for i=0:nprocs-1
        if myrank == i
	        println(i)
            println(mystruct)
        end
        MPI.Barrier(comm)

    end

    mystruct = MPI.bcast(mystruct,comm)
    for i=0:nprocs-1
        if myrank == i
            println(i)
            println(mystruct)
        end
        MPI.Barrier(comm)
    end

    MPI.Barrier(comm)
end
main()
```
これは、gatherとbcastのテストをしています。
複数行ヘッダーのDataFrameで列指定で値抽出を行う

# 概要
CSVファイルに書き出された複数行ヘッダーを持つデータを処理する際に、特定の列を削除したり、値を取得する方法が分からなかったので、メモ程度に書き残す

# 扱うデータ例
写真の色のついた部分がヘッダーであるようなデータを扱う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634748/21377d23-7176-ad04-051b-5d6a0cffc23b.png)

# やりたいこと
例えば写真の右から3つ目の列を取得したいとする

# 方法
以下のように指定したい列のヘッダー要素をタプルで記述することで、その列の値を取得することができる

```python
df[
    (
        "Marker",
        "body:Backbone0",
        "CFB402DC2C6A11EECCB45FF7E93CBD9F",
        "Position",
        "X",
    )
]
```

以下のように取得できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634748/241fb18d-5461-2786-ba8a-6e2709600657.png)
VSCode で tsconfig.json の paths が認識されない

# あるあるな要件

* VSCodeをコードエディタとして利用したい
* Typescriptで開発したい
* Typescript -> Javascript(CommonJS or ECMAScript)へのトランスパイルをしたい
* jestやmocha等、自動テストフレームワークを導入したい
* 相対パス参照地獄を解消する為に、tsconfig に paths を設定したい

```tsconfig.json
"compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": [
        "./src/*"
      ]
    },
  }
}
```

* `./src/*`以外にも`./test/*`や`./__test__/*`等、スクリプトコードの用途によってディレクトリを分けたい
* ただし`./src/*`配下のみをトランスパイルの対象としたい
*  etc...


# あるあるのエラー

トランスパイルは通るけれども、VSCodeの問題コンソールにはエラーが出まくっててすごい気持ち悪い

```console:VSCode : 問題タブ
入力ファイルを上書きすることになるため、ファイル '<module file name>' を書き込めません。ts
```

```console:VSCode : 問題タブ
モジュール '@/<module path>' またはそれに対応する型宣言が見つかりません。ts(2307)
```

# 結論

`tsconfig.json`を２種類用意する

1. VSCode用の'tsconfig.json'
1. トランスパイル用の`tsconfig.build.json`

※VSCodeはプロジェクトのルートディレクトリにある`tsconfig.json`しか参照できない

## 構成例

* ビルドツール：tsc + tsc-alias
* テストランナー：ts-mocha + mocha + tsconfig-path
* アサーションライブラリ：chai

<details>
<summary>ディレクトリ構成</summary>

* :file_folder:root
    * :pencil:tsconfig.json
    * :pencil:tsconfig.build.json
    * :pencil:package.json
    * :file_folder:src
        * :pencil:index.ts
        * :file_folder:lib
            * :pencil:sum.ts
    * :file_folder:test
        * :pencil:index.spec.ts
        * :file_folder:lib
            * :pencil:sum.spec.ts
    * :file_folder:.build
        * :pencil:util.js

</details>

## `./tsconfig.json`

```jsonc:./tsconfig.json
{
  "compilerOptions": {
    // ...中略...

    // 任意の相対パス
    "baseUrl": ".",

    // 任意の相対パス
    "paths": {
      "@/*": [
        "./src/*"
      ]
    },

    // 「入力ファイルを～」エラー回避に必須。
    "outDir": "./.build"
  },

  // ～対応する型宣言が～」エラー回避の為に必須
  "include": [
    "./src/**/*",
    "./test/**/*"
  ],
}
```

## ./tsconfig.build.json

```jsonc:./tsconfig.build.json
{
  // 基本設定は、tsconfig.json から継承
  "extends": [
    "./tsconfig.json"
  ],

  "compilerOptions": {
    // imoprt スコープの範囲を src 配下に狭める
    "rootDir": "./src",
  },

  // 必須
  // トランスパイルの範囲を ./src/ 配下のみに指定
  "include": [
    "./src/**/*",
  ],

  // 必須
  // トランスパイルから除外する
  // node_modules 等も必須
  "exclude": [
    "./test/**/*",
    "node_modules",
    "**/node_modules/"
  ]
}
```

## ./package.json

```jsonc:./package.json
{
  // ...中略...
  "main": ".build/index.js",

  "scripts": {
    "prebuild": "rm -rf .build",

    // -p オプションで、ビルド用のtsconfigを指定する
    "build": "tsc -p ./tsconfig.build.json && tsc-alias -p ./tsconfig.build.json",

    // -p オプションで、VSCode用のtsconfigを指定する
    "test": "ts-mocha test/**/*.spec.ts --paths -p ./tsconfig.json -R spec"
  },

  // 以下は参考用
  "devDependencies": {
    "@types/chai": "^4.3.5",
    "@types/expect": "^24.3.0",
    "@types/mocha": "^10.0.1",
    "chai": "^4.3.7",
    "mocha": "^10.2.0",
    "ts-mocha": "^10.0.0",
    "ts-node": "^10.9.1",
    "tsc-alias": "^1.8.7",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.6"
  }
}
```

※そのうちまとめなおすかも。。。
※StackOverflowに「tsconfig.app.json作りぃ」「何に使うねん。」って会話が残ってて、頷き過ぎて首もげそうだった。。。

了
VS Codeでの赤線 "Type 'number' is not assignable to type 'string'.js(2322)" への対応方法

## はじめに

VS CodeでSveltのチュートリアルをやっていた時に、propsの実装の際に以下のような赤線（VS Codeからのエラー提示）が出た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/5c50701f-c852-b9c0-e04c-b03744f73a81.png)

今回はこれの原因と解決方法を備忘録として残す。

## 原因

`jsconfig.json`の以下の設定が`true`になっていたことが原因。
```json:jsconfig.json
{
	"compilerOptions": {
		...
		/**
		 * Typecheck JS in `.svelte` and `.js` files by default.
		 * Disable this if you'd like to use dynamic types.
		 */
		"checkJs": true
	},
    ...
}
```

意味についてはコメントの通りで型をチェックするか？の設定。詳細は[jsconfig Options](https://code.visualstudio.com/docs/languages/jsconfig#_jsconfig-options)を参照。

## 解決方法

JavaScriptで開発していて型は無視する、ということであれば`false`に変えればいい。まあ、TypeScriptであればstringにnumberを渡すなんてありえん、という感じだがJavaScriptの緩い世界ではまあOKだろう。Sveltのチュートリアルを作った人はあまりそういうのは気にしていなかったのかな？（笑）

ちなみに、Sveltのコードは以下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/57bfe7f8-b8a7-d366-648e-3f0534825ddc.png)

※Sveltのチュートリアルを https://learn.svelte.dev/tutorial/welcome-to-svelte ではなく、ローカル環境を構築してやった理由は、ESLintやPrettierのある世界で開発したかったため。
Oracle Cloud Infrastructureにおけるリージョン、AD、FDの関係性

# 概要
- 地球上の各地に展開されているデータセンターをリージョンと呼称し、各リージョン内に可用性ドメインが構成されている。
    - 可用性ドメイン間では物理インフラストラクチャを共有しない


# リージョン（Regions）
- 限られた地理的領域を指す
- リージョンはレルムにグループ化される
    - レルム、テナンシ、リージョンの関係性は別途記載
- ユーザーに最も近いリージョンを選択する（NW遅延を考慮）
- 選択する際はデータレジデンシー、コンプライアンスも考慮しなくてはならない
    - データを国外に持ち出せない国の場合はDRを考慮して同一国内に2箇所のDCを設置する
- OCI上で実際に提供するサービスの可用性も考慮する (規制準拠、地域の需要、リソースの可用性)
- VCNはリージョン固有

# 可用性ドメイン（Availability Domains）
- 各々のリージョン内に配置されたデータセンターをADと呼称する
- リージョンあたり1個または3個のADが構成されている
   - 東京、大阪はADが1個
   - 一部地域は3AD構成（usはus-sanjose-1のみ1ADで他は3AD、欧州はeu-frankfurt-1とuk-london-1が3AD構成）
- 各ADはフォルトトレランス
    - 各ADは物理インフラストラクチャを共有しない
- 同一リージョン内のAD同士は低レイテンシの広帯域接続ネットワークで相互接続される


# 障害ドメイン（Fault Domains）
- AD内に構成される論理DCのようなもの
   - AD1個あたり3個のFDが構成されている
- 異なるFDに配置されたリソースは、ハードウェアのSPoFを共有しない
   - FDが異なればラック、電源、UPS、ToRスイッチが別々になる
       - ToRはアーキテクチャのこと、ToRスイッチはHW自体を指す
- コンピュート・インスタンスはAD固有
    - コンピュート・インスタンスの作成時は明示的にFDを指定することも可能

# リージョン・ペア
- 別リージョン内のADとDataGuard構成も構築可能

# リージョン、AD、FDを分けて構築する目的
- これらの要素を組み合わせ、柔軟な高可用性設計を実施することで継続的にサービスを提供できるようにする。

# まとめ
- リージョン、AD、FDの3つが、障害発生および単一障害点を回避するための要素
   - FDをまたいだサブネット構成も可能
       - 東京リージョンのAD1と、大阪リージョンのAD2間など
- AD間のDataGuard構成も構築可能

# 参考サイト、記事
- 公式

https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/regions.htm

https://docs.oracle.com/ja/solutions/learn-architecture-deploy-peoplesoft/oracle-cloud-infrastructure-terminology.html#GUID-5A47FD2C-E8DE-4552-AECB-8B01E16DA3E0
Githubのcontributionsが反映されない問題の解決法：メールアドレス設定の確認

Githubでは、個々のユーザーがどれだけコードに貢献しているかを可視化するための「contributions」機能があります。
しかし、この機能が正常に機能せず、自分の貢献度が反映されていないと感じることがあります。
ここではその問題の一つである「メールアドレスが正しく設定されていない」場合の解決法について記載します。

## 問題の原因

Githubでの貢献度が反映されない原因の一つとして、コミットした際のメールアドレスがGithubアカウントに関連付けられていない場合があります。つまり、自分のローカル環境で設定したメールアドレスと、Githubアカウントのメールアドレスが一致していないと、そのコミットはGithub上で認識されず、その結果、contributionsに反映されないことがあります。

## 解決策

まず、ローカル環境でどのメールアドレスが設定されているかを確認します。これは以下のコマンドを使用して確認できます。

```
git config --global user.email
```

次に、このメールアドレスがGithubアカウントに正しく設定されているかを確認します。設定ページの「Emails」セクションから、ローカル環境で設定したメールアドレスが表示されていることを確認してください。

もし表示されていない場合、または新しいメールアドレスを設定したい場合は、以下のコマンドをローカル環境で実行し、新しいメールアドレスを設定します。

```
git config --global user.email [あなたのメールアドレス]
```

それから再びGithubの設定ページを開き、Emailsセクションで新しいメールアドレスを追加します。このメールアドレスがGithubで認識されるようになったら、これから行うコミットはGithubのcontributionsに正常に反映されるようになります。

以上が、Githubのcontributionsが正常に反映されない問題の一つの解決法です。まずはメールアドレスの設定を確認し、それが原因である場合は修正してみてください。
エンジニアの生産性をマネジメントで上げるのは難しいという話

# はじめに
船井総研デジタルはAzure推しなので、そういう技術系の記事が多いのですが、入社したばかりで勉強中の私はまだネタが溜まっていないため、前回に続きポエム寄りのお話です。

エンジニアのジレンマとして良く耳にする話に、「個人の生産性を上げてもチームの生産性に貢献できなければ頭打ちになってしまう」、「なので開発をやりたいのに経験を積むとマネジメントをさせられてしまう」というものがあります。
これらついての是非はいったん置いといて、「生産性」という言葉がバズワードっぽくなっている印象があるので、生産性を上げるとはどういうことなのか、マネジメントで本当に生産性が上がるのかを考えてみました。
# エンジニアの生産性とは
生産性の定義を調べてみると、以下のような説明が見つかります。
- 物的生産性（アウトプット÷インプット）
- 付加価値生産性（利益÷コスト）

ざっくり言ってしまうと量ベースか金額ベースかということですね。
会社として目指すべきは付加価値生産性ですが、エンジニアはどの作業がどれだけ利益を生んだか切り分けるのが難しいため、物的生産性で評価することが多いと思います。

では物的生産性を上げるにはどうすればよいのでしょうか。
真っ先に思いつくのは、手を早くするという方法です。
ブラインドタッチができるようになる、IDEの操作や機能を覚える（入力サポート、ショートカットキーなど）、言語の仕様を把握する（文法、組み込み関数、ライブラリなど）といったことで、新人なら調べながら5日かかる作業が、ベテランなら1日で終わるなんてことも珍しくありません。
しかし、手を早くするというのは限度があり、いくら経験を積んでも100倍早くなったりはしません（今後はAIに作らせて整形やチューニングするといった方法で、格差が広がる可能性はありますが）
また、マネジメントで上げるというよりも、個人のスキルアップで上げる部分になります。

設計やアルゴリズム、インフラ構築などはどうでしょうか。
この部分は手の早さよりもできる／できないの差が大きく、新人が100日、もしくは100人で考えても解決できなかったものを、ベテラン1人が数時間で解いてしまうということは十分あり得ます。
倍率で言えば∞倍となりますが、知識や経験によるところが大きいため、こちらもマネジメントで簡単に上げられるものではありません。
というわけで、タイトルの結論に至ります。
# 上げるべきは生産性なのか
これで終わってしまったら身も蓋もないので、もう少し深掘りしてみましょう。
エンジニアの生産性は物的生産性を指すことが多いというのはわかりました。
では、以下のようなケースを考えてみてください。
| Ａさんは2時間の見積もりの作業を依頼されましたが、依頼内容の不明点を確認したり、連携先の仕様が決まるまでに7時間かかり、その後1時間かけて作業を完了しました。 |
|:-|

8時間で2時間分の作業しかできなかったとも言えるし、1時間で2時間分の作業をこなせたとも言えます。
この場合、上げるべきなのはＡさんの生産性でしょうか。
仮にＡさんが生産性を倍にして30分で終わらせたとしても、かかった時間は7時間30分で、2時間の見積もりを大きく超過していることには変わりありません。
問題は、依頼内容がわかりづらい、仕様が決まっていないのに依頼した、手が動かせない時に他の作業を割り振れていない、といった部分であり、生産性を上げても解決しないことがわかると思います。

これらを解決するには、生産性ではなく、生産量という視点が必要となります。
生産性を上げるというのはあくまで手段の1つで、いくら生産性が高くても、生産できる時間が短かったら生産量はあまり上がりません。
このような時に、マネジメントの存在価値が出てきます。
エンジニアの手が止まらず、リソースが空かない状態をできるだけ維持すれば、生産性が上がらなくても生産量を上げられます。
# 生産量を上げるマネジメント
というわけで改めて、生産性ではなく生産量を上げるマネジメントのために、エンジニアがどのような時に手が止まってしまうのか、リソースが空いてしまうのかを整理し、それを排除する方法を考えてみました。
- 何をすればいいか、どこから着手すればいいかわからない
	→ ゴールや成果物、期限、優先順位、エンジニアがどこまで判断してよいかなどを明確にして依頼する
	→ 手順書やドキュメントを作成、整理する
	→ スキルや適性がマッチしているか、やれそうかをエンジニアと認識合わせする

- 業務に直接関係しない、雑務のような作業が多い
	→ 本当に必要な作業なのか、自動化やツールで負担が軽減できないか検討する
	→ マイクロマネジメントや過干渉になっていないか見直す
	→ お客様や他部署からの窓口を一本化する（エンジニアに直接依頼させない、無茶振りを止めたり調整する）

- 認識の食い違いや意図が伝わらず、何度もやりとりが発生する
	→ お客様や他部署からの窓口を一本化する（相手からの要求をわかりやすくエンジニアに伝える、エンジニアからの確認や報告をわかりやすく相手に伝える）
	→ 直接やりとりして問題ないと判断できた場合は、エンジニアに委譲する（自分がボトルネックにならない）
	→ やりとりに使用するチャンネルを一本化する（メール、チャットツール、プロジェクト管理ツールなど分散してしまうと、話や仕様が追いづらくなるため）

- 外部要因のボトルネックで待機が発生してしまう
	→ ボトルネックになりそうな箇所と、それがいつまでに必要かを把握し、間に合うように調整する（お客様相手の場合、間に合わなければ納期や工数に影響すると認識してもらう）
	→ 待機が発生してしまった場合に他の作業が割り振れるよう準備しておく、もしくは優先度低の作業として割り振っておく

- 複数の方法があったり、要不要が判断できず、迷ってしまう（ぼんやりした表現ですが、設計、実装、調査、成果物など様々なシーンで発生します）
	→ 判断基準を伝える
	→ どちらでも問題ない場合はエンジニアに任せる
	→ エンジニアが判断できない場合は決める

- 心身の不調でパフォーマンスが上がらない
	→ 休んだり相談する心理的ハードルを下げるような雰囲気、仕組みを作る
	→ 常に100%のリソース、100%のパフォーマンスが出せるわけではないという認識で見積もり、スケジュールを立てる
	→ 作業量、難易度など負荷が大きい場合はリソースや期限を調整する

私が開発をやっていた時に感じたものを挙げただけなので、問題・対策とも他にも色々ありそうですが、思い当たるものも多いのではないでしょうか。
上記のような問題であれば、マネジメントでチームの生産量に貢献できそうです。
エンジニア自身でできるものもあるため、生産性が上がった割に生産量が上がらないと感じた時は、意識してみるといいかも知れません。
# おわりに
生産性が高い＝仕事ができるというイメージになりがちですが、生産性を発揮できる状態を作ることで、より生産量を上げられるというのが少しは伝わったでしょうか。
今回は踏み込みませんでしたが、エンジニアが付加価値生産性をどう上げられるか考えてみるのも面白そうです。
また、マネジメントを管理側という全くの別ポジションではなく、エンジニアが困っていることを改善するポジションとして、興味を持ってもらえると嬉しいです。
[Rails] Viewが捗るgem 'haml-rails' について

# 見やすい！ 読みやすい！ 書きやすい! Hamlについて現役Rubyエンジニアが解説します

# 目次
* [Hamlとは](#hamlとは)
* [haml-rails gemの導入](#haml-rails-gemの導入)
* [基本的なHamlの記法](#基本的なhamlの記法)
* [レイアウトの作成](#レイアウトの作成)
* [haml-rails gemの便利な機能](#haml-rails-gemの便利な機能)
* [Hamlのパフォーマンスと注意点](#hamlのパフォーマンスと注意点)
* [まとめ](#まとめ)

## Hamlとは
Haml（ハムル）は、Rubyプログラミング言語で書かれたマークアップ言語の1つです。
HTMLの代替として設計されており、シンプルで読みやすく、効率的なHTMLコードを生成することができます。
インデントを使ってHTMLやXHTMLをより簡潔に記述するテンプレートエンジンで、可読性が高く、タグの閉じ忘れやネストの問題を防ぐことができます。
例えば、以下のHamlコードはHTMLよりもコンパクトで理解しやすくなります。

```.html
<!-- HTML -->
<div class="container">
  <h1>Hello, World!</h1>
  <p>Welcome to our website!</p>
</div>
```

```.haml
# Haml
.container
  %h1 Hello, World!
  %p Welcome to our website!
```
Hamlは、特にRuby on RailsなどのRubyベースのWebアプリケーションフレームワークと組み合わせて使用されることが一般的です。
これにより、ビューテンプレートをより効率的に作成できます。ただし、
他のプロジェクトでも使用することが可能であり、Hamlのシンプルな構文が好まれる場合もあります。

## haml-rails gemの導入
RailsアプリケーションでHamlを使用するには、`haml-rails` gemを導入します。
Gemfileに以下の行を追加し、`bundle install`を実行します。

```
# Gemfile
gem 'haml-rails'


# terminal
bundle install
```

## 基本的なHamlの記法
Hamlでは、インデントとシンプルな構文を使ってテンプレートを記述します。タグはインデントされた行に記述され、タグの属性は波括弧 `{}` 内に記述します。
また、Rubyコードを埋め込む場合は`-`を使用します。例えば、以下のコードでは、Rubyの変数を表示しています。

```.haml
- name = "John"
%h1= "Hello, #{name}!"
```
**結果**
Hello, John！

## レイアウトの作成
Hamlでは、レイアウトを作成する際に`yield`と`content_for`を使用します。
`yield`はコンテンツを挿入するためのマークアップを含む親テンプレートを定義し、`content_for`はコンテンツを埋め込む部分テンプレートに記述します。例えば、以下のようなレイアウトテンプレートを考えてみましょう。

```.haml
# application.haml
!!!
%html
  %head
    %title My App
  %body
    = yield
    %footer
      © 2023 My App
```

このレイアウトは、各ページのコンテンツを`yield`の位置に埋め込んで表示し、共通のフッターを含んでいます。

## haml-rails gemの便利な機能
`haml-rails gem`は、Ruby on RailsアプリケーションでHamlを使用する際に便利な機能を提供します。

1. ビュージェネレータのサポート
haml-rails gemをインストールすると、新しいビューファイルを作成する際に自動的にHaml形式のファイルが生成されます。
これにより、Hamlのテンプレートを簡単に作成できます。

2. 既存のERBテンプレートをHamlに自動変換
haml-rails gemは、既存のERB（Embedded Ruby）テンプレートを自動的にHamlに変換するコマンドを提供します。
これにより、既存のプロジェクトでHamlへの移行が容易になります。

3. コンパクトなレイアウト
Hamlのシンプルな構文により、HTMLよりもコンパクトで読みやすいレイアウトを作成できます。
タグのインデントを自動的に行ってくれるので、視覚的に整形されたコードを生成することができます。

4. Rubyコードの統合
HamlはRubyのコードを埋め込むことができます。haml-rails gemは、ビューテンプレート内で簡単にRubyコードを実行できる機能を提供します。
これにより、動的なコンテンツを生成することができます。

5. ヘルパーメソッドのサポート
Hamlでは、Railsのヘルパーメソッドをそのまま使用できます。

これらの機能により、haml-rails gemを使うことで、Ruby on Railsアプリケーション内でHamlを効果的に利用できるようになります。


## Hamlのパフォーマンスと注意点
HamlはコンパイルされたRubyコードとして動作するため、テンプレートのパフォーマンスは高速です。
しかし、コンパイルやキャッシュの仕組みを理解しておくことで、さらなるパフォーマンス向上が可能です。
また、Hamlの可読性を保つために、インデントの管理やタグのネストに注意する必要があります。


### まとめ
Hamlとhaml-rails gemを使うことで、RailsアプリケーションのViewの記述がシンプルで効率的になります。是非、Hamlを活用し、開発の生産性を向上させてください。

---
[MR Dev Tips #6] ユーザーの動きにオブジェクトを追従させる方法

# はじめに
HoloLens 2 アプリケーション開発の際に、文字を常にスクリーン内に表示しておきたい場面があるかと思います。例えば、写真を撮影する際のシャッターのカウントダウンやユーザーに確実にメッセージを伝えたい時など、ユーザーの視野の中にコンテンツを表示させ続ける必要があるかと思います。そのような場面で使える Tips をご紹介したいと思います。

実現方法としては、以下2つの方法があるかなと思います。

- ~~MRTK Canvas の Render Mode を ``Screen Space - Overlay`` にセットする~~
- MRTK の Orbital コンポーネントを利用する

**[補足]**
Canvas の 描画モードを ``Screen Space - Overlay`` にすれば、簡単に対応できるかなと思ったのですが、MRTK Canvas では描画モードを **World Space** にセットする必要があるみたいです。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/fa4c9c88-909e-8b96-730a-e52b17b09df6.png)

Canvas 上にテキストを表示するだけなら、MRTK Canvas に変換する必要がなく、Unity 標準の Canvas で対応できるみたいです。詳しくは、MRTK の GitHub Issue - [Is there any documentation on how to view a UI/canvas in Hololens 2? ](https://github.com/microsoft/MixedRealityToolkit-Unity/issues/10423) をご確認ください。

また、XRデバイスでスクリーンスペースUIをサポートする計画はないみたいです。グラフィック処理に重大な影響を及ぼすため。2022年9月時点の回答なので、その点ご留意ください。

> We don't have any plans to support screenspace UI in XR devices, as this isn't supported by Unity themselves and has serious rendering/graphical implications.
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/b1bda647-2831-3478-db87-19914694726d.png)


# 検証環境
本記事の検証環境は、以下の通りです。

- Unity 2020.3.48f1
- MRTK v2.8.2

# MRTK の Orvital コンポーネントを利用する方法
MRTK Foundation パッケージに含まれている ``3DTextSelawikBold.prefab`` をドラック&ドロップで ヒエラルキービュー に追加します。

``Packages/com.microsoft.mixedreality.toolkit.foundation/SDK/StandardAssets/Prefabs/Text/3DTextSelawikBold.prefab``

Add Component ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/affa77b8-2725-1ccf-c1d5-7aad69b195a1.png)

Orbital コンポーネントを検索して、ゲームオブジェクトにアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/3e788cad-cecc-2de2-796e-c7d6256f41c0.png)

Orbital コンポーネントがアタッチされると、依存関係のある ``SolverHandler`` も同時にアタッチされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/07537103-08c7-0885-b834-19e6b939e549.png)


Solver (ソルバー) は、定義済みのアルゴリズムに従って、オブジェクトの位置 (Position) と方向 (向き) の計算を行ってくれるコンポーネントです。Solver は3つのスクリプトで構成されます。

| スクリプト名 | 説明 |
| --- | --- |
| Solver | すべてのソルバーのは派生元である基本抽象クラス。状態の追跡、パラメーターと実装のスムージング、自動的なソルバーシステムの統合、更新順序が提供されています。 |
| SolverHandler | 追跡する参照オブジェクトを設定して、ソルバーコンポーネントの収集を処理して、適切な順序でそれらの更新を実行します。 |
| Solver 派生クラス | ソルバーの抽象クラスを派生させ、利用シチュエーションごとに実装されたクラス。 |

Solver の派生クラスの種類は10種類あります。それぞれ追従方法が異なるので、コンテンツの利用シーンに応じてこれらの中からお好きな Solver を選択します。今回は、Orbital を使って、ユーザーの頭 (Main Camera) に追従するテキストを作っています。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/3c28c7d3-8a78-a751-67da-a4d564066938.png)
>
> [MRTK - Follow](https://learn.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/mrtk2/features/ux-building-blocks/solvers/solver?view=mrtkunity-2022-05#follow)

実際に HoloLens 2 で動かした際の動画です。
<br/>

<iframe width="560" height="415" src="https://www.youtube.com/embed/wqtdo4eK7ys" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

<br/>
以上、ユーザーの頭の動きにオブジェクトを追従させるのご紹介でした。
CDKでNode.jsのLambda関数を作るときにjs|ts以外のファイルをバンドルする

# TL;DR

`bundling.commandHooks.beforeBundling`
を定義して、その中で`cp`でコピーしてあげればOK！

```ts
new NodejsFunction(this, 'lambda', {
  runtime: Runtime.NODEJS_18_X,
  architecture: Architecture.ARM_64,
  functionName: 'my-nodejs-function',
  handler: 'handler',
  entry: 'lambda/index.ts',
  bundling: {
    commandHooks: {
      beforeBundling(inputDir: string, outputDir: string): string[] {
        return [`cp ${inputDir}/lambda/hoge.txt ${outputDir}`];
      },
      afterBundling(): string[] {
        return [];
      },
      beforeInstall(): string[] {
        return [];
      },
    },
  },
});
```

# 解説

CDKでNode.jsのLambda関数を作る場合、`NodejsFunction`クラスを使うことで、TypeScriptのビルドなど含めて、いい感じに行うことができます。

一方、js|tsに関係ないファイルは無視してバンドルしてくれるので、プログラム内で`readFileSync('hoge.txt')`とかやってる場合、そのテキストファイルがLambdaにアップロードされず、ちゃんと動いてくれません。

そういうとき、最初に書いた方法を使えば、任意のファイルをアップロードしてあげることができます。UNIXコマンドを何でも実行できるオプションなので、ファイルコピー以外にもかなり応用が効きそうですね！

ちなみに`afterBundling`と`beforeInstall`は今回は使わないんですが、`commandHooks`の中には必ず3点セットで関数を定義しないとエラーになるので、`[]`だけを返す関数を書いておく必要があります。

# 参考サイト

* [Command hooks: AWS CDK公式ドキュメント](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html#command-hooks)
* [node.js - How can I bundle additional files with `NodejsFunction`? - Stack Overflow](https://stackoverflow.com/questions/75147158/how-can-i-bundle-additional-files-with-nodejsfunction)
* [NodeJsFunctionのビルド時に依存関係を解決する3つの方法](https://tmokmss.hatenablog.com/entry/20220509/1652103822)

ではまた！
ほぼ未経験でもChatGPTを使えばプログラムを作れるのか⑥～プログラミングほぼ未経験者の挑戦～：アルゴリズム⑤

前に記事を投稿してからだいぶ時間がたってしまった。
私のやる気が早めの夏休みをとっちゃいましてね…。

さて『アルゴリズムの設計』の『1.問題の理解と分析』の『4.データの分析』について、


今回で完了させることをここに誓う。


前回データの分析でChatGPTと格闘して決めたこと。
①データの分析の必要性はよくわからないけど、ChatGPTが必要というのでとりあえずやる
②データの分析にはスプレッドシートを使う
③データの整理は行わない

たったこれだけを決めるのに、すごい時間がかかってしまった。

とりあえずスプレッドシートをどんなふうに作ったらいいか、聞いてみた。




![①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/87529d3b-8253-10c6-2f47-ba204a656a25.png)
図1

新しいシートを作成しますってところから教えてくれてる！
池田仕様になってきたね。

![②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/cf9249ea-52de-a616-6a5d-fd3b4682bc61.png)
図2

媒体ごとにシートは分けよう

データの集計の中のSUMIF関数ってここで必要なの？
いらないと思うけど…

![③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/ee2c21ac-b8d0-483f-ca50-023f5431f411.png)
図3
やっぱりいらなかったみたい。

あと、応募総数の列がないと上手く計算できない気がする・・・

![④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/7a5e393f-5e27-d8d2-ab33-f9563a7669a6.png)
図4

応募率の計算方法まで教えてくれるなんて、池田のスペックをよくわかっているね！

ということで作ってみたのがこちら～

![⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/35aa36ab-3177-039d-8ae3-1234e085c2b0.png)
図5

これあってんの？

あとグラフを作るのよね・・・？

![⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/d4100cb5-f7e9-a750-652e-2a2ba2a121ab.png)
図6

これをもとに作ったグラフがこちら・・・

![⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/71e735f9-4238-d716-3e72-de8f1cc043a7.png)
図7

もう一回聞きたいんだけど、これあってんの？
応募数とか地をはってて、見ても何にも分かんないんだけど。
たぶんなんか間違ってる。
・・・まあいいや。

データの分析は完了ということでいいのかな？

たぶんなんかやってないし、間違ってる。

でもそもそもデータの分析の必要性を感じてないから、もういい。

データの分析：解決！！！（力技で）

所用時間：4時間

おまけ

なんか・・・
もういろいろ分かんないの・・・・・

![⑧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/6717340f-d673-24ed-4dc4-cc3d66227a8c.png)

図8

今の池田にはどんな言葉もひびかないよ。
Go言語向けNCMB SDKの使い方（データストアの保存）

NCMBはモバイル向けのBaaS（mobile Backend as a Service）ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります（すべて公式サポート対象外の、コミュニティSDKという位置づけです）。

今回はGo言語向けのSDK開発をはじめたので、その使い方を紹介します。まずはデータストアへのデータ保存についてです。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

```bash
go get -u github.com/NCMBMania/ncmb_go
```

## インポート

続けてSDKをインポートします。

```go
import (
    "github.com/NCMBMania/ncmb_go"
)
```

## 初期化

NCMBより取得したアプリケーションキー、クライアントキーを使って初期化します。

```go
ncmb := NCMB.Initialize("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY")
```

### データの新規作成

`Item` メソッドで新規データのインスタンスを作ります。引数はクラス名です。

```go
item := ncmb.Item("Hello")
```

### データの適用

アイテムに対して、データをセットします。利用できる型は `string` `int` `float64` `time.Time` `bool` 配列、Mapなどになります。今後、NCMB独自の型（ポインターやデータストア、位置情報など）も使えるようにします。

```go
item.Set("msg1", "Hello").Set("msg2", "World")
item.Set("num", 100)      // Int
item.Set("float", 1.23)   // Float
```

キーチェーンにも対応していますが、Go言語は改行が使えないので、多用すると見づらくなりそうです。

### データの保存

保存は `Save` メソッドで行います。保存がうまくいっていれば、 `bol = true` になります。

```go
bol, err := item.Save()
```

## まとめ

まだ基本的な機能しかありませんが、徐々にバージョンアップしていきます。

Go言語を使ってWebアプリケーションを開発している方は、そのデータ保存先としてNCMBを利用してみてください。

[mBaaSでサーバー開発不要！ \| ニフクラ mobile backend](https://mbaas.nifcloud.com/)
【Dart】自作クラスのリストに関するあれこれ

## フィールド変数からリストの位置を特定する
`indexWhere`を使う

```dart
// 自作クラス(例)
class Dog {
  Dog({required this.id, required this.name});

  int id;
  String name;

  @override
  String toString() {
    return '{id=$id, name=$name}';
  }
}

----

final dogList = <Dog>[
  Dog(id: 4, name: 'Shiro'),
  Dog(id: 1, name: 'Pochi'),
  Dog(id: 3, name: 'Cha'),
  Dog(id: 2, name: 'Kuro'),
];


// 位置を特定したいID
final targetId = 2; 
int index = dogList.indexWhere((item) => item.id == targetId);
print('位置 $index');
// 位置 3
```
※ `indexOf` だと自作クラスを指定しなければならない。IDだけしか使えないような状況でリストの位置を特定したい場合に便利！


## 絞り込み
`where`を使う

```dart
final dogList = <Dog>[
  Dog(id: 4, name: 'Shiro'),
  Dog(id: 1, name: 'Pochi'),
  Dog(id: 3, name: 'Cha'),
  Dog(id: 2, name: 'Kuro'),
];

// idが2より大きいもので絞り込む
final filter = dogList.where((item) => 2 < item.id);
print('result $filter');
// result ({id=4, name=Shiro}, {id=3, name=Cha})
```

## 並び替え

`sort`を使って、`compareTo`で並び替えたい順番を記述する

```dart
final dogList = <Dog>[
  Dog(id: 4, name: 'Shiro'),
  Dog(id: 1, name: 'Pochi'),
  Dog(id: 3, name: 'Cha'),
  Dog(id: 2, name: 'Kuro'),
];

// idで大きい順に並び替える
dogList.sort((a, b) => b.id.compareTo(a.id));
print('result $dogList');
// result [{id=4, name=Shiro}, {id=3, name=Cha}, {id=2, name=Kuro}, {id=1, name=Pochi}]
```
### 参考
https://qiita.com/jiyimeta/items/65af22438e43b2a40daa

### 環境
* Android Studio フラミンゴ
* Flutter: 3.10.6
* Dart: 3.0.6
breakとreturnとcontinueの違いがよく分からんのでまとめてみたよ～！

どうも、堕罪ｵｻﾑです。
相変わらず(？)**国語学・日本語学**を専攻しています。
夏季休暇前ラストのレポートが終わらず発狂しそうになっています。ヤバめ。
早く終わらせねば……。

まあ、そんなこんなで本題に入ります。

# return？break？continue？

この記事を書こうと思ったきっかけはfor文の中でif文を書いているときのこと――。

「んー。ここって**return**なのかな？それとも**break？**」
「いや待てよ、**continue**ってのもあるよな？」
「**そもそもreturn、continue、break ってどうやって使い分けるんだろう？**」

結局そのとき書いていたものは全部使わないで動かせたのですが(オイ)、なぜ必要ではなかったのかも理解できるようになりたいなという目標のもと、記事を進めていこうと思います。

## 1．return文について

returnについて調べてみると

**関数内で「処理をした結果」をその関数の呼び出し元に「戻り値」として値を返すことができる命令文**です。

もう少し付け加えるなら、**命令された地点で処理を終了して、その式を評価した戻り値を呼び出し元に返す**という具合だと思います。

要するに**returnをした地点での結果**が戻り値として返ってくるということですね！

## 2.break文について

breakは

**ループ処理を途中で中断して、その次の文に移すことができるもの**です。



調べてみるとcontinueとbreakの2つはどちらも**ループ処理で使う**ので、2つセットでまとめられているサイトが多いような。よってcontinueの説明に移ります。

## 3.continue文について

そんなcontinueは

**ループ処理の途中でその後の処理をスキップするもの**です。この**スキップ**というのがめっちゃわかりやすい感覚ですね。
例を出すとするなら「for文で``0~10``を出力するという処理の中で`i === 4`のときに`continue`をする」という文を書くと、0~10の中で**4だけ出力されない**ということができます。

## breakとcontinueの違い

breakとcontinueの大きな違いは

**continueはループ処理以外では使えない**という点です。

breakは処理を**中断する**、continueは処理を**スキップする・ループ処理を中断せず最初に戻る**という認識でいいと思いました。

# まとめ

この記事でのことも含め、なんかこう、端的に言えば**やけに難しく考えすぎてしまう。**

実際、初学者がコードを書く上で厄介なこととして、**勝手に難しく考えていろいろ付け足してみたりした結果、頭もコードもぐちゃぐちゃになってしまう**ってあると思うんです。私はそうです。今でも。

初学者として最低限覚えなければいけない構文は多分if文・for文(多重ループとか)ぐらいだと思っていて、それはPaizaをやってみたり電卓を作ってみたりして大体そこでつまずいているし、つまずく原因は**アルゴリズム**や、そもそも**それぞれの構文の理解が足らないこと**だと感じています(自戒)。

コードを書いていて頭がぐちゃぐちゃになったときはいったん手を止め、自分はいま**なにがわからないか**をしっかり把握し学習を深めることも大事ではないでしょうか。
私は今回の記事を書く上での目標として最初に挙げていた**なぜ必要ではなかったのか？** に関して、目標を達成でき、学習を深められたと思っています。

これからもがんばるぞ～。

ここまで読んでいただきありがとうございました！
Active Storageの実際の画像の保管場所はどこ？

## ActiveStorageで保存した画像はどこにあるの？
単刀直入に言うとルートディレクトリ配下のstorageフォルダに入ってる。
 [Railsのディレクトリ構造について](http://www.code-magagine.com/?p=4326#:~:text=%E3%81%9D%E3%81%93%E3%81%9D%E3%81%93-,storage,-ActiveStorage%E7%94%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)

そしてファイル保存形式がpngやjpegではない！
データベースに適したBlob型に変換されてstorageフォルダに保存される。

### Blobって何？
> データベース管理システム(DBMS)においてバイナリデータを格納する場合のデータ型である。画像や音声、その他のマルチメディアオブジェクトがBLOBとして格納される。
参考文献：[Blobとは？](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%BB%E3%83%A9%E3%83%BC%E3%82%B8%E3%83%BB%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)

## テーブル的にはどうなっているの？
schema.rbに書かれているactive_storage_blobsテーブルとactive_storage_attachmentsテーブルによって実際の画像ファイルとモデルが関連付けられてるみたい。

ChatGPT先生曰く、
>active_storage_blobs:
このテーブルは、アップロードされたファイルのメタデータを格納します。
key: ファイルの一意の識別子で、ファイルの保存場所を特定するために使用されます。
filename: アップロードされたファイルの元のファイル名が格納されます。
content_type: アップロードされたファイルのMIMEタイプが格納されます。
metadata: ファイルのメタデータ（例：幅、高さなど）がJSON形式で格納される場合があります。

>active_storage_attachments:
このテーブルは、ファイルとモデル（例：Userモデル）との関連付け情報を管理します。
name: ファイルと関連付けられた名前（例：avatar、imageなど）が格納されます。
record_type: 関連付けられたモデルのクラス名が格納されます。
record_id: 関連付けられたモデルのIDが格納されます。
blob_id: active_storage_blobsテーブルのレコードを特定するための外部キーです。
## まとめると
保存までの流れはこうである。
1. railsアプリケーションで画像を保存する
2. rootディレクトリ配下のstorageにてblob形式にして保存する。

であるから、サーバーを立ち上げなおしても画像が残っているのである！
AccessのVBAでメッセージボックス（ダイアログ）表示（ボタンの初期選択や、はい、いえ、キャンセルの3択など）

# やり方（メッセージとOKボタンのみ）

```vb:
MsgBox "おわったよ。"
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6f04cff5-ee24-b1cd-ad52-fd8d083631f9.png)

# やり方（メッセージの左にアイコン付）

```vb:
MsgBox "！マーク", vbExclamation
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/69ec1555-1f37-2977-d710-735781b65d67.png)

```vb:
MsgBox "×マーク", vbCritical
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bf9a3dbb-ae89-719f-afe5-6a8eb1711f7d.png)

```vb:
MsgBox "？マーク", vbQuestionMsgBox
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4f08d1af-cfd5-6740-e51d-5042a2f29ec8.png)

```vb:
MsgBox "iマーク", vbInformation
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a3dbda26-9f57-9193-b704-4e28bf0b456a.png)

# やり方（2択）

```vb:
If MsgBox("やっていい？", vbYesNo + vbDefaultButton2) = vbNo Then
    'いいえを押した時の処理。
End If
```

* ```vbYesNo``` によって『はい』『いいえ』の2択にできます。
* ```vbDefaultButton2``` によってデフォルト選択を **左から2番目のボタン** に指定できます。

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/86e50c0b-d67c-a6f3-634d-e1f4f03fcb53.png)

```vb:アイコン付2択
If MsgBox("やっていい？", vbYesNo + vbDefaultButton2 + vbExclamation) = vbNo Then
    'いいえを押した時の処理。
End If
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8873863f-3a96-5ea5-d4ab-41424073007e.png)

# やり方（3択）

```vb:
Dim msg_ As String
msg_ = "やっていい？" & vbCrLf
msg_ = msg_ & vbCrLf
msg_ = msg_ & "はい = はいを選択するとこう動くよ" & vbCrLf
msg_ = msg_ & "いいえ = いいえを選択するとこう動くよ" & vbCrLf
msg_ = msg_ & "キャンセル = キャンセルを選択するとこう動くよ"

Select Case MsgBox(msg_, vbYesNoCancel + vbDefaultButton3)
    Case vbYes
        'はい動作。
    Case vbNo
        'いいえ動作。
    Case vbCancel
        'キャンセル動作。
    Case Else
        '想定外（例外）
End Select
```

* ```vbYesNoCancel``` で『はい』『いいえ』『キャンセル』の3択にできます。
* 『いいえ』『キャンセル』の動作の違いが分からない、ということがよくあるので補足を入れておくと良いです。
* Case文を使うと選択結果を保持する変数を用意しなくて済みます。
ただし、Caseで分岐する各動作のコードが短い場合のみにしておいた方がおススメ。
* ダイアログに表示する文字列が長くなることが多いので、変数に切り出しておくことがおススメ。

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a1ec594e-5b96-ea41-fd31-e0139ba18608.png)

# 経過報告的な使い方はやめた方がよいです

ボタンを押した時に2つの処理を行う場合…

1. ボタンを押す。
1. 最初の処理。
1. 最初の処理がおわったよというメッセージボックス。
1. 次の処理。
1. 次の処理がおわったよというメッセージボックス。

という形にすると、『最初の処理がおわったよ』というメッセージボックスのOKボタンを **クリックするまで次の処理が行われません。**
いつ出てくるか分からないメッセージボックスのために **ユーザーがずっと画面の前に張り付く必要** が出てきてしまい、非効率になります。

とくに各処理に比較的時間がかかる場合、全ての処理が終わった段階でメッセージボックスを出した方がよいです。

# 参考サイトさん

http://officetanaka.net/excel/vba/function/msgbox.htm

# バージョン

Microsoft Windows [Version 10.0.19045.3271]
Microsoft Access for Microsoft 365 MSO (バージョン 2307 ビルド 16.0.16626.20110) 32 ビット
AWSに対するAzureの優位性を考えてみる

# きっかけ
クラウドって何を使ったらいいの？という質問を受けることがあります。
極論、AWSを使えば問題ない、という答えで大体問題ないのですが、
他のクラウドも選択肢としてあっていいはずです。
Azureのアーキテクトとして、今回はAWS vs. Azureをテーマに書いてみようと思います。

# 観点
クラウドを導入する場合に考慮する観点は色々あると思います。
- 企業で導入する場合
    - 運用するエンジニアの観点、人材は確保できているか
    - ソリューションとして必要なサービス、可用性などを満たしているか
- 研究機関で導入する場合
    - 決済手段、為替レートなどの変動する要素をどこまで許容するか
    - 先進的なサービスが提供されているか

# 現状
各クラウドのシェアについては下記記事を参照。AWSとAzureのシェアの差が９pointと接近し、「２大クラウド」といっていい状況なんじゃないかと思います。
Q1 Cloud Spending Grows by Over $10 Billion from 2022; the Big Three Account for 65% of the Total
https://www.srgresearch.com/articles/q1-cloud-spending-grows-by-over-10-billion-from-2022-the-big-three-account-for-65-of-the-total

# サービスの比較
真面目に書こうかと思いましたが、下記を引用してしまいます（車輪の再発明はやめよう）
ポイントとしては、
- AWSとAzureで、主だったところのサービスの差はほとんどない
- もちろん一部違いがあるので、そこだけは気にしておこう
    - 解析系などはAWSが先行しているイメージ
AWS/Azure/Google Cloudサービス比較
https://qiita.com/hayao_k/items/906ac1fba9e239e08ae8

# AWSの強み
設備面でのアドバンテージはAWSにあります。
例えばAzureの西日本リージョンで可用性ゾーンを構成できないというのは有名な話です（2023年3月時点）。
災害対策環境を含めたソリューションなどを提案するときは、必ず留意すべきポイントになります。
https://news.microsoft.com/ja-jp/2023/03/27/230327-expanded-microsoft-azure-west-japan-region-to-meet-growing-cloud-demand/

**シナリオ例**
東日本リージョンに本番環境を置き、西日本リージョンに災対環境を置き、ホットスタンバイとする。
災害時には西日本リージョンを本番環境として稼働させるため、どちらの環境も可用性が必要。

# Azureの強み
Microsoft製品との連携の良さ、というのがよく言われています。
特にハイブリッド環境におけるActive Directoryの構成しやすさは大きなアドバンテージだと思います。
https://azure.microsoft.com/ja-jp/products/active-directory

**シナリオ例**
すでに社内環境がActive Directoryでユーザ管理されている。
新規にクラウドを導入、Active Directoryのユーザ移行のコストを最小限にしたい。

# 料金について
俗説では、「AWSが価格を下げると、必ずAzureも追従する」と言われていました。
料金は都度変わるので、望むスペックのリソースで計算するのが良いでしょう。
https://calculator.aws/#/
https://azure.microsoft.com/ja-jp/pricing/calculator/

# 決済方法など
情報は更新されるので、2023年7月の時点での状況を書いておきます。
- AWSもAzureもクレジットカード払いが基本
- 請求書払いも対応してくれる
    - AWSは一定条件を満たす場合、もしくはパートナー経由
    - Azureの場合はMicrosoft 顧客契約 (MCA) が必要
- 支払い通貨については、どちらも日本円で支払い可能
    - かつてはAzureは日本円で料金が設定されていたが、USドルでの設定となり、為替の影響を受けるようになった
https://aws.amazon.com/jp/aws-jp-faq/
https://learn.microsoft.com/ja-jp/azure/cost-management-billing/manage/pay-by-invoice

# エンジニア・資格取得など
AWSの資格取得者の方がAzureより多いだろうというのはほぼ明らかなのですが、明確な数字がないです。
傍証的にLinked.inの求人の数を見ると、AWSの数が下記の通り圧倒しているので、
AWSエンジニアの方が市場としては求められています（故におそらくAWSの資格を取るエンジニアが多い）。
- AWS:30,372件
- Azure:11,682件
- GCP:10,922件
Go言語で昔懐かしのPongを作ってみた話 - ゴール判定と得点表示の追加

前回の記事では、Go言語とEbitenを使ってシンプルなPongゲームの作成について記載しました。
今回はそのコードにゴール判定と得点表示を追加したので記載します。

## 使用するバージョン
- Go言語: 1.16
- Ebiten: v2

## 変更したコードの解説

以下に、変更を加えたコードを示します。各部分の詳細は後ほど説明します。

### Game構造体の定義
Game構造体にプレイヤーのスコアを保持する新しいフィールドを追加しました。

```go
type Game struct {
	ballPositionX, ballPositionY float64 // ボールの位置
	ballDX, ballDY               float64 // ボールの移動速度
	paddle1Y, paddle2Y           float64 // パドルの位置
	player1Score, player2Score   int     // プレイヤーのスコア
}
```

### Updateメソッド
ゴール判定を追加し、ボールが左右の壁に当たったときにスコアを更新します。また、ゴール後はボールの位置を初期化してゲームを再開します。

```go
func (g *Game) Update() error {
	g.ballPositionX += g.ballDX // ボールのx座標を更新
	g.ballPositionY += g.ballDY // ボールのy座標を更新

	if g.ballPositionX < 0 { // ボールが左の壁に当たった時
		g.ballDX = -g.ballDX // ボールの向きを反転
		g.ballPositionX = 0  // ボールのx座標を0に設定
		g.player2Score++     // プレイヤー2のスコアを加算
		// ボールを中央に戻す
		g.ballPositionX = screenWidth / 2
		g.ballPositionY = screenHeight / 2
	} else if g.ballPositionX > screenWidth-ballSize { // ボールが右の壁に当たった時
		g.ballDX = -g.ballDX                     // ボールの向きを反転
		g.ballPositionX = screenWidth - ballSize // ボールのx座標を右端に設定
		g.player1Score++                         // プレイヤー1のスコアを加算
		// ボールを中央に戻す
		g.ballPositionX = screenWidth / 2
		g.ballPositionY = screenHeight / 2
	}

	// 以下、前回のコードと同じ
	// 省略
}
```

### Drawメソッド
プレイヤーのスコアを画面に表示します。

```go
func (g *Game) Draw(screen *ebiten.Image) {
	// パドルとボールの描画
	ebitenutil.DrawRect(screen, 10, g.paddle1Y, paddleWidth, paddleHeight, color.White)
	ebitenutil.DrawRect(screen, screenWidth-30, g.paddle2Y, paddleWidth, paddleHeight, color.White)
	ebitenutil.DrawRect(screen, g.ballPositionX, g.ballPositionY, ballSize, ballSize, color.White)

	// スコアの描画
	score := fmt.Sprintf("Player 1: %d - Player 2: %d", g.player1Score, g.player2Score)
	text.Draw(screen, score, basicfont.Face7x13, screenWidth/2-50, 30, color.White)
}
```

これで、Pongゲームにゴール判定と得点表示が追加されました。
これらの機能を活用して、友人と一緒に楽しくプレイすることができます。
[C++] unsignedについて

# [C++] unsignedについて
signは符号付きという意味で, unsignedをつけることによって符号なしの変数を表す.
通常のint(signed)の表示範囲が-2,147,483,648 ～ 2,147,483,647であり, unsigned intの表示範囲は0 ～ 4,294,967,295となる. 
正の整数を重点的に扱う場合に有用だと考えられる.
ReactとJavaScript: Reactと他のJavaScriptフレームワークの比較

React JavaScriptの利点と他のJavaScriptフレームワークとの優位性を探ってみましょう。以下の記事では、Reactを他のフレームワークと比較し、それぞれの技術の利点やメリットを理解することができます。信頼性と効率性を持つウェブアプリケーションを構築するための最適な選択肢を見つけるために、ぜひ読み進めてください。

![developer-listing-1024x865.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/76573ee2-d857-568d-afb8-ac84e649228a.jpeg)
Reactと他のJavaScriptフレームワークの比較
Cre: twire



1. React JavaScript - Facebookの強力なJavaScriptライブラリ

Reactは、ウェブ開発の分野でトップの技術の1つとなっています。Facebookによって開発され、Reactは高いパフォーマンスとコンポーネントの再利用性により人気を博しています。Virtual DOMを使用することで、Reactはアプリケーションのスピードとパフォーマンスを最適化し、実際のDOMにかかる負荷を減らします。

Reactではコンポーネントの再利用性を活用することで、複雑なアプリケーションを構築することができます。シンプルなコンポーネントを組み合わせることで、コードが管理しやすくなり、メンテナンスや拡張が容易になります。大きなコミュニティがReactを取り巻き、問題が発生した際に迅速なサポートや役立つドキュメントが提供されています。

2. 他のJavaScriptフレームワークとの比較

![shutterstock_1225954372.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/279fdb8d-e19b-a45e-bfbe-54c231e319ca.jpeg)

Reactと他のJavaScriptフレームワークとの比較
Cre: intersog

2.1. Angular 
 統合された複雑なフレームワーク: AngularはGoogleによって開発された人気のあるJavaScriptフレームワークの1つです。Angularは、ウェブアプリケーションの開発に包括的なアプローチを提供します。Reactと比較すると、Angularは複雑な構文を必要としますが、それに対して統合された多くの機能があり、アプリケーションの開発を簡素化します。

2.2. Vue.js 
軽量で使いやすい: Vue.jsはオープンソースのJavaScriptフレームワークで、使いやすい構文が特徴です。特にVue.jsはJavaScriptテクノロジーに初めて触れる開発者に適しています。Vue.jsはパフォーマンスと柔軟性に焦点を当て、多様なウェブアプリケーションの構築を容易にします。

2.3. Ember.js 
独立した強力なフレームワーク: Ember.jsは人気のあるJavaScriptフレームワークで、独立して拡張性のある設計を重視しています。Ember.jsは複雑で大規模なウェブアプリケーションの構築を目指しています。Ember.jsは自動化された多くの開発タスクに焦点を当て、時間と労力を節約します。

3.結論

Reactと他のJavaScriptフレームワークを比較すると、それぞれに独自の利点と制約があります。Reactは高いパフォーマンスとコンポーネントの再利用性により、モダンなユーザーインターフェースの構築に優れた選択肢となります。ただし、Angular、Vue.js、Ember.jsも多機能で柔軟なソリューションを提供して複雑なウェブアプリケーションを構築するのに適しています。フレームワークの選択は、プロジェクトの目標、複雑性、および特定の要件に応じて決定されるべきです。正しいテクノロジーの選択は、開発プロセスの進捗を加速し、製品の品質を向上させる助けになるでしょう。

また、言語を組み合わせることも可能です。 React と JavaScript は、Web 開発にとって素晴らしい組み合わせです。 それを理解するには、以下の記事を読んでください。

参考情報：ReactとJavascript – Web アプリケーション開発に最適な組み合わせ
zshでヘッダありの複数CSVファイルを結合するワンライナー

同じヘッダ行を持つ複数のCSVファイルを1つのファイルに結合する、zsh用のワンライナー。

```zsh
{ head -n1 `echo *.csv([1])`; for f in *.csv; do tail -n+2 $f; done; }
```

- ただし、ファイル末尾に改行がない場合は行が連結され困るはず。
- `zsh 5.9 (x86_64-apple-darwin22.0)` にて動作確認。
selenium ver.4を使う

久しぶりにseleniumを使ったら、かなり沼ったので、使い方を記す  
  
## 実行環境  
OS Windows 11
python 3.10.11
selenium 4.11.2
Google Chrome canary 117.0.5926.0 

## 環境構築  
pip install selenium
Google Chrome canaryは検索してダウンロード

下記のコードを保存した場所と同じところに
クロームのドライバを保存
chromedriver.exe

ドライバの探し方は[最新版 ChromeCanary の ChromeDriver を取得する方法](https://qiita.com/Michinosuke/items/34348d3586b37c268f1f)を参照

## 正常に動作したコード
ほぼSeleniumの[ドキュメント](https://www.selenium.dev/ja/documentation/)に近いです
```py
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('https://www.google.co.jp/')
time.sleep(5)

driver.quit()
```

## 正常に動作しなかったコード
```py
from selenium import webdriver
import chromedriver_binary
import time

driver = webdriver.Chrome()
driver.get('https://www.google.co.jp/')
time.sleep(5)

driver.quit()
```
chromedriver_binaryをインポートしてはいけません
エラーが出て、Chromeが起動しませんでした


find_element_by_idも使えなくなあったので解決策はこちら  
[AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'　の解決策](https://qiita.com/jinyahiga/items/46f9a925f4a21bbef794)
Flutterで使われるWidgetとは？

# flutterで使われるWidgetってなに？

Widgetとは、UI（ユーザーインターフェース）を構築するための部品であり、Widgetを組み合わせることにより、様々なUIの表現ができるようになります。
また、親Widget-子widgetとしてツリー型のように構築されているのも特徴です。


# どんなWidgetがあるのか
今回は代表的なWidgetを５つ紹介したいと思います。

### 1,StatefulWidget
StatefulWidgetとは、動的な状態（State）であるWidgetです。そのため、ユーザーのアクションなどによって表示内容が変わる場合に使用します。

### 2,StatelessWidget
StatelessWidgetとは、静的な状態（State）であるWidgetです。また、Statelessウィジェットはその中でbuild関数（ウィジェットの描画をしている関数）を上書きし、戻り値をもらうことで画面に反映しています。

### 3,MaterialApp
MaterialAppとは、Material Designに基づいたアプリケーションを作成する際に使用され、主に全体のデザインや画面の遷移をする場合の状態監視の役割を持っています。また、アプリ全体のタイトルやその全体にかかわるプロパティの管理もしています。

### 4,Scaffold
Scaffoldはflutterで頻繁に使われるwidgetの一つで、主にアプリの画面の骨組みを作成する役割をします。また、画面上部にAppbar(アプリバー)を表示し、中央にbody(本文)などの様々なwidgetを表示する役割も持っています。

### 5,Appbar
Appbarとは、アプリの画面上部に表示されるヘッダー領域を定義するために使用されます。Appbar内には、タイトル、アクションボタンやアイコンなどのウィジェット、背景色やAppbarの高さを指定するなどの役割を持っています。


### 最後に
他にも様々なwidgetがあるので、その状況状況で調べてみてください！
ありがとうございました。
【C#】式本体の定義を使ってプロパティを簡潔に書く

C# では式本体の定義を使って下記のようにプロパティを簡潔に書くことができます。

```C#
// 式本体の定義を使うとき
public Name => $"{_name}さん";

// 式本体の定義を使わないとき
public Name
{
    get
    {
        return $"{_name}さん";
    }
}
```

この書き方は、読み取り専用でないプロパティに対しても使えることを同僚の pull request をチラ見したときに初めて知りました（笑）
つまり、get と set の両方があるプロパティに対して式本体の定義が使用でき、なんなら set にも式本体の定義が使えます。

公式にまんまのコードがあったの引用させてもらいます。


```C#
public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}
```
https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members#properties より引用

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members#properties

C# のコードを書き始めて1年経ちましたが、まだまだ勉強不足だなと感じました。
また人の pull request を眺めるだけでも勉強になることが分かりました。（むしろ実践的で効果的かも？）