OmniAICreator/Qiita-1.07M huggingface dataset:
開発でよく使用するgitのコマンド一覧

これは[iCARE Dev Advent Calendar 2023](https://qiita.com/advent-calendar/2023/icare)の23日目の記事です。

# はじめに

やるやる詐欺をしていたらいつの間にか年が明けてしまいましたが、Advent Calendarを書いていこうと思います。
開発者の方ならcherry-pickとかrebase等は使いこなされていると思いますので、少し便利なオプションをいくつかご紹介します。

# コマンド一覧
- git commit -m コミットメッセージ
`git commit` だとvim等のエディタが起動してそこでコミットメッセージを入力することができますが、 `-m コミットメッセージ` を付けるとエディタの画面へ移動することなく、そのままコミットすることができます。

---

- git add -p
普通は `git add ファイル名` みたいな感じでファイルをaddされるかと思いますが、1つのファイルの特定の部分だけコミットしたいみたいなときがあるかと思います。そんなときに `-p` を付けると1ファイルを部分的にaddしていくことができます。

---

- git log -p
`git log`　だけだと各コミットメッセージしか見ることができませんが、 `-p` を付けると、そのコミットの修正内容も確認することができます。
バグの調査などで修正内容まで見たいなーというときに便利です。

---

- git checkout -
1つ前に選択していたブランチに戻すことができます。
gitコマンドではないですが、linuxのディレクトリを移動する際の `cd` コマンドも `cd -` で1つ前に選択していたディレクトリに戻ることができます。

---

- git branch -M ブランチ名
こちらのコマンドで現在のブランチ名を変更することができます。
別のブランチに変えてから `git branch -D ブランチ名` とかでブランチ名を変えている方は、こちらのコマンドだと少し手間が減ります

---

# 最後に
短いですが、こちらの記事を見たことで少しでも生産性が上がることがあれば嬉しいです。
2024年も少しでも効率よく開発できるようにしていきたい！
[Godot] シーン遷移する際の遷移先シーンにデータを渡す

Godot 4.2

シーン遷移する際の遷移先シーンにデータを渡したい。
autoloadでグローバルなノードに変数を置く以外の方法がないか。

試行錯誤したがこれ↓で行けた。

シーンの遷移をいつもchange_scene_to_file(),change_scene_to_packed()を使っていたのでそれ以外の遷移の方法がないと思っていたのだが、ガサッと遷移をするというよりは、シーンツリー下のノードを手作業で入れ替えることで結果としてシーンの遷移を実現する、ということなんだろう。

* 新シーンをload/preload→instantiate()
* 新シーンのインスタンスにメソッド経由で現在シーンからデータを渡す
* 現シーンのNodeインスタンスを一時変数に保持
* 新シーンをシーンツリーのルートの子ノードに追加
* シーンツリーのcurrent_sceneを新シーンに変更
* 現シーンを遅延しつつ解放

### シーンAのスクリプト
```GDScript:scene_a.gd
extends Node
var scene_b

func _ready():
    scene_b = preload("res://scene_b.tscn")

func _on_button_button_down():
    var node_b = scene_b.instantiate()
    node_b.set_hoge(123)
    var node_a = get_tree().current_scene
    get_tree().root.add_child(node_b)
    get_tree().current_scene = node_b
    node_a.call_deferred("free")
```
### シーンBのスクリプト
```GDScript:scene_b.gd
extends Node
var hoge: int

func set_hoge(i: int):
    hoge = i

func _on_button_button_down():
    print("hoge = " + str(hoge))
```
【UiPath】ファイルのプロパティの詳細確認方法

# ファイルのプロパティの内容をチェックしたいことありませんか？

UiPathの標準アクティビティの「ファイル情報を取得」では、プロパティの詳細までは確認できません。
今回、Microsoft の WindowsAPICode.Shell パッケージの ShellFile クラスをもちいて確認ができたので、備忘までに記事化します。

# パッケージのインストール

***※Studio の「パッケージを管理」で検索してヒットする場合は、3番の手順のみで結構です。***
1. 「Microsoft-WindowsAPICodePack-Shell」パッケージを Microsoft の nuget.org からダウンロードします。https://www.nuget.org/packages/Microsoft-WindowsAPICodePack-Shell/
1. Studio のバックステージビュー＞設定＞パッケージソースを管理で有効なパッケージソースのフィードまたはフォルダに取得した「Microsoft-WindowsAPICodePack-Shell」パッケージ（microsoft-windowsapicodepack-shell.X.X.X.nupkg）を配置します。
1. Studio のデザインリボンの「パッケージを管理」より「Microsoft.WindowsAPICodePack.Shell」パッケージをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/90ec1cf4-5f4e-7e87-8ba5-6082af1be5d3.png)

# 実装サンプル

1. ShellObject 型の変数を用意します。（***Microsoft.WindowsAPICodePack.Shell.ShellObject***）
「代入」アクティビティを配置し、左辺と右辺を次の様に指定します。　　　　　　　左辺：1で作成した変数　右辺： ***Microsoft.WindowsAPICodePack.Shell.ShellFile.FromParsingName(“{★ファイルパス}”)***
1. 「繰り返し（コレクションの各要素）」を配置し、項目のリストに「***{1で作成した変数}.Properties.DefaultPropertyCollection***」を指定します。
1. 「トライ・キャッチ」＞「1行を書き込み」を配置し、次の様にしてプロパティの詳細を出力します。
***"CanonicalName："+currentItem.CanonicalName+" DisplayName："+currentItem.Description.DisplayName+" PropertyKey："+currentItem.PropertyKey.ToString+" Value："+currentItem.ValueAsObject.ToString***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/6e6b7322-ad05-7e12-0573-7c502df2752c.png)

（参考：出力イメージ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8b3332d7-9c40-be16-4bec-06e4f479d671.png)

::: note
補足：「Microsoft.WindowsAPICodePack.Shell」パッケージはインストール済みだが、ShellFile クラスが認識されない場合、対象のXamlファイルの名前空間やアセンブリに次の記述があるかご確認ください。（記述が無い場合、手動で追記してください）

***名前空間***
```
<x:String>Microsoft.WindowsAPICodePack.Shell</x:String>
```
***アセンブリ設定***
```
<AssemblyReference>Microsoft.WindowsAPICodePack.Shell</AssemblyReference>
```
※名前空間やアセンブリの設定は Xaml ファイルの最初に記述があります。編集はメモ帳などでおこなえます。
:::
以上 最後までお読みいただきありがとうございます！
Electron開発の覚書

Electron関連の開発時に調べたことの覚書です。
それ以上のことは特にありません。
現在のプロジェクトで利用している範囲のため、使っているライブラリがそもそも古いなどがあるかもしれません。

# ライブラリ

## electron-store

設定値とかを保存するやつですね。
https://github.com/sindresorhus/electron-store

インストール
`npm install electron-store`

>Electron doesn't have a built-in way to persist user settings and other data. This module handles that for you, so you can focus on building your app. The data is saved in a JSON file named config.json in

設定値をJSON形式で永続的にファイルに保存・ファイルからロードできます。
Electronアプリにて設定値を登録する場合に利用する感じです。

使い方もシンプルで、基本的にはキー・バリューで設定するとユーザーフォルダのアプリケーションフォルダ内に`config.json`ファイルとして保存されます。

保存先は例えばWindowsだと、

`C:\Users\{login-user}\AppData\Roaming\{electron-app}\config.json`な感じです。

### .store

`config.json`からデータをロードして読み込みします。



## dotenv

.envファイルを読み込むやつ。
https://github.com/motdotla/dotenv

Electronの場合、.envファイルを用意しておいてmainプロセスで読み込みすると初期値として.envに登録した内容で処理を分けたりできる。
mainプロセスで読み込んでおくと、その後の処理でもprocess.env.{key}で環境設定値を読み込みできるので便利。

インストール
`npm install dotenv --save`

注意点としては、.envファイルのエンコードをUTF-8にしておくこと。
エンコードが違うと読み込み時にエラーで設定値を読み込みできないことがよくある。

## electron-log

https://www.npmjs.com/package/electron-log

>Simple logging module Electron/Node.js/NW.js application. No dependencies. No complicated configuration.

デバッグのログなどを簡単にファイルに出力できる。

>Starts from v5, electron-log requires Electron 13+ or Node.js 14+. Feel free to use electron-log v4 for older runtime. v4 supports Node.js 0.10+ and almost any Electron build.

現行のv5は、Electron v13以降で動作するので、v13より前はv4を使う。

`npm install electron-log@4.4.0`


# デバッグ

## VS Codeでメインプロセスをデバッグする

VS CodeでElectronのメインプロセスをデバッグする方法

VS Codeで `Run and Debug` アイコンを選択します。

`create a launch.json file.` を選択します。

launch.jsonファイルを下記の通り書き換えます。

launch.json

```json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "debug main process",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "cwd": "${workspaceFolder}",
            "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
            "windows": {
                "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
            },
            "args" : ["."],
            "outputCapture": "std",            
            "program": "${workspaceFolder}\\src\\main.js"
        }
    ]
}
```

後はF5でデバッグスタート。
【試験対策/SAA-C03】ソリューションアーキテクト-アソシエイト取得までのロードマップ

# 今回のお話
AWSの知識を身につけるために、
ソリューションアーキテクト-アソシエイトを取得したので、
取得までどのような勉強をしたか記録として残しました。

AWSの経験としては、
データエンジニアとしてデータパイプラインを構築するのに、
半年ほど実務経験がある程度でした。

参考にしていただけると幸いです。



# 学習方法
色々な教材を組み合わせて学習をしました。
書籍やUdemyの模擬テストや、無料で公開されている教材を活用しました。
## メイン教材紹介
主に以下の教材を使用して、学習しました。

### 書籍
まずは、下記の書籍を一読してインプットを行いました。

そして、付属の模擬試験を２回ほど解きました。
１回目は半分も正解できませんでしたが、２回目は7~8割程正解することができました。

https://book.impress.co.jp/books/1122101088

### Udemy
次に、試験問題に慣れるためにUdemyの以下の模擬問題集に挑戦しました。
模擬問題集の中の以下の模擬問題を繰り返し解きました。

* SAA-C03版模擬試験①
* SAA-C03版模擬試験②
* SAA-C03版模擬試験③
* SAA-C03版模擬試験④
* 【新版】SAA-C03版模擬試験⑤

#### １周目
①~③は１周目は、20~30%しか取れませんでした...
①~③の後に④,⑤に挑戦して、やっと50%ほど点数が取れるようになりました。

#### 2周目以降
そのため、①~⑤をそれぞれ４周ほど繰り返し解いて都度解説を読み、
AWSの設計や各種サービスを理解するよう努めました。

解説を読んでも理解できない場合は、
公式ドキュメントや技術記事を読んで理解できるまで勉強しました。

正解率が90%を超えるくらいまで、各模擬問題を繰り返し解けば、安心かなぁと思います。

https://www.udemy.com/course/aws-knan/

## 他に使った教材
以下の無料で公開されている演習問題も、念の為2~3週しました。
問題数は20問程度で、そこまで多くないです。

### 公式の模擬問題

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Sample-Questions.pdf

https://explore.skillbuilder.aws/learn/course/external/view/elearning/13269/aws-certified-solutions-architect-associate-official-practice-question-set-saa-c03-japanese?saa=sec&sec=prep

### Youtube
最終日は、テスト前に以下のYoutubeを軽く一周して基礎を復習しました。

https://www.youtube.com/playlist?list=PLPzcoMdqG5npIMyRZ7QmBaZQ-LdMeGXRa




# 結果
803点で無事合格することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/44b30040-2a80-6820-da43-183f81b2cae9.png)

しっかり勉強して臨みましたが、
当日、難しくて正解しているか不安な問題も多かった印象です。

AWSの各種サービスやそれぞれの組み合わせ方を、
しっかり理解するまで勉強しておいてよかったなぁと感じました。
オブジェクト指向プログラミングの三大要素

## カプセル化（Encapsulation）
オブジェクトのデータ（フィールド）とそれに関連するメソッドを一つの単位、つまりクラスに組み込むプロセスです。カプセル化は、オブジェクトの内部状態を外部から直接アクセスされることなく保護し、オブジェクトのデータとメソッドの詳細を隠蔽します。これにより、外部のコードがオブジェクトの内部状態に依存することが減り、より安全でメンテナンスしやすいコードを実現できます。

## 継承（Inheritance）
あるクラス（スーパークラスまたは親クラス）の特性（フィールドやメソッド）を別のクラス（サブクラスまたは子クラス）に引き継ぐことができる機能です。継承を使用すると、既存のコードを再利用して新しいクラスを作成できるため、コードの重複を減らし、拡張性と保守性を向上させることができます。

## 多様性（Polymorphism）
異なるクラスのオブジェクトが同じインターフェースやメソッドを通じて操作される能力です。これには主に2種類あります：

コンパイル時多様性（静的多様性）: メソッドオーバーロードにより、同じ名前のメソッドが異なる引数を取ることができます。
実行時多様性（動的多様性）: メソッドオーバーライドにより、サブクラスがスーパークラスのメソッドを再定義することができます。
これらの要素は、オブジェクト指向プログラミングの基本的な概念であり、より組織化された、再利用可能で、拡張しやすいプログラムの作成を可能にします。
Authorization

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [OAuth 2.0 Authorization Errors](https://qiita.com/Keiji_otsubo/items/5f1b42e46341469bc765)
+ [Authorization Required error for SF Site](https://qiita.com/Keiji_otsubo/items/63a90bc82aa6e44ce243)
+ [Retrieving Access_token using connected app and password grant_type](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007W5iuu)
+ [Get Bearer token using curl](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UuSyP)

:::note
Please check this article. 

Step One: Set Up Authorization
https://developer.salesforce.com/docs/atlas.en-us.238.0.api_rest.meta/api_rest/quickstart_oauth.htm
:::
Javaのデータ型

Javaでは主に二つのデータ型があります：プリミティブ型（Primitive Types）と参照型（Reference Types）。これらの型は、変数が保存するデータの種類とメモリ上での扱い方を定義します。

### プリミティブ型 (Primitive Types)
プリミティブ型は、Javaが提供する基本的なデータ型で、直接値を保持します。これらは比較的低レベルな操作に使用され、メモリ効率が良いです。

1. **整数型**
   - `byte`: 8ビットの整数型。値の範囲は-128から127。
   - `short`: 16ビットの整数型。値の範囲は-32,768から32,767。
   - `int`: 32ビットの整数型。値の範囲は-2^31から2^31-1。Javaで最も一般的に使用される整数型。
   - `long`: 64ビットの整数型。値の範囲は-2^63から2^63-1。

2. **浮動小数点型**
   - `float`: 32ビットの浮動小数点型。小数点を含む数値に使用。
   - `double`: 64ビットの浮動小数点型。`float`よりも広い範囲の数値と高い精度を提供。

3. **文字型**
   - `char`: 単一の16ビットUnicode文字を表す型。

4. **論理型**
   - `boolean`: `true`または`false`のみを保持する型。

### 参照型 (Reference Types)
参照型はオブジェクトや配列への参照（ポインタ）を保持します。参照型の変数は、実際のデータではなく、メモリ上のデータへの参照（アドレス）を保持します。

1. **クラス型**: クラスのインスタンスを指します。例えば、`String`, `Integer`, `System`など。

2. **インターフェース型**: あるインターフェースの実装を参照します。例えば、`List`, `Map`, `Serializable`など。

3. **配列型**: 同じ型の要素の集合を保持する配列。例えば、`int[]`, `String[]`, `Object[]`など。

プリミティブ型は効率的に動作し、基本的な値を扱う場合に使用されます。一方、参照型はより複雑なデータ構造やオブジェクト指向プログラミングの概念に適しています。
exercismのjqトラックの課題を全部解いてみた

## exercismとは？

[exercism](https://exercism.org/)は無料でプログラミング言語の学習ができるサイトです。65以上の言語に対応していますが、今回はjqの問題全50問をすべてやってみました。

## jqって何？

jqは言語じゃなくてツールじゃないの？って思った人もいるかと思います。たしかにjqはJSONデータの整形や変換によく使われるコマンドですが、プログラミング言語としても十分な機能を備えています。awkと同じような感じですね。実際、exercismのjqトラックのページにも、以下のように書かれています。

> jq is a dynamically-typed functional programming language.

「jqは動的型付けの関数プログラミング言語です」とのこと。関数型言語は使ったことがなかったので、今回やってみることにしました。

## 問題を解いてみる

というわけで、さっそく問題をやってみます。最初はお約束の "Hello, world"。それから順次、簡単な問題から解いていきます。問題は難易度に応じてラベルが振られています。

| レベル | 説明 |
|:--|:--|
| Learning Exercise | 学習用問題 (入門レベル) |
| Easy | 初級　|
| Medium | 中級 |
| Hard | 上級　|

問題を解いたらテストプログラムを実行し、それにパスしたら提出して完了になります。コードレビューを受けたり相談したりすることもできるようですが、私は結局1回も利用しなかったのでどんな感じなのかはわかりません。

解答を提出すると、他の人が公開した解答も参照できるようになります。最初のうちは調子良く解いて行っていたのですが、難易度が上がってくると模範解答ってどんな感じなんだろうって思いますよね？そんなわけで他の人の解答を見てみたのですが、自分の半分くらいの行数ですっきり書いてる人がいたのに驚愕・・・

というわけで、それからは簡潔なコードを心がけて解くようにしたのですが、「これで十分だろう」と思って提出してもほぼ毎回、自分よりずっと簡潔なコードを書いている人がいたので、普段自分がいかにテキトーなコードを書いているか思い知らされる結果となりました。

ちなみに提出した解答が勝手に公開されることはありませんのでご安心を。提出後、公開するというアクションを実行したときだけ公開されます。

## ハードな問題

最初のうちは問題が簡単だったので1日5〜6問ずつやれば50問くらいすぐだろうとタカをくくっていたのですが、難易度がMediumになってくるとだんだんスピードが落ちてきます。そこをなんとかクリアしても、Hardになるともはや1問解くのに数日かかるくらいに。もちろんほかに用事もあるので一日中問題をやっているわけではないのですが、それにしても気合を入れて臨まないと挫折してしまいそうなレベル。幸いちょうど冬休みに入ったので、貴重な休みを使ってなんとか全問クリアしました。

ちなみにHardは4問だけでこんな感じです。

| 問題名 | 説明 |
|:--|:--|
| Two Bucket | バケツ問題。3Lと5Lのバケツで4Lの水をくみ出すのにかかる回数を答える。バケツの容量とくみ出す水の量の組み合わせはいろいろ。|
| Forth | スタック指向のプログラミング言語Forth(のサブセット)の構文解析と実行。
| Knapsack | いわゆるナップサック問題。|
| Zebra | いわゆるゼブラ・パズル。|

自分としては最後のZebraが一番の難問でした。わりと有名な問題らしいですが、最初問題を読んだときはこんなのどうやってコードにするの？って感じ。結局コード化自体はなんとかなったのですが、再帰コールで解を探し回るロジックのバグを取るのが大変。jqはデバッガーがないので、デバッグメッセージを埋め込んで頑張るしかないです。

## 結果

* 解いた問題数: 50問
* かかった時間: 約3週間
* 書いたコード: [こちら(GitHub)](https://github.com/tmonj1/exercism)

コードは正直、人に見せるには恥ずかしいレベルのものもありますが、ご愛嬌ということで。

## 感想

感想としてはやはり、やってみて良かった！ですね。プログラミングから遠ざかっていてリハビリを兼ねて取り組んでみたのですが、わりと良いトレーニングになりました。問題が思っていたよりも良くできていて、最後まで飽きることなく続けられました。以下は良いと思った点です。

* 問題の質が高く、やっていて楽しい
* 入門レベルから上級レベルまで順に解いていくことができるので取り組みやすい
* オンラインだけでなくローカルマシン上でもできるので、慣れた環境でコードが書ける (テストと提出まですべてローカルでできます)
* 他の人の解答が見ることで気づきや学びを得られる

## おまけ

コンプリートしたら**Completer**バッチがもらえました。これまで1,177人がコンプリートしていて、全ユーザーの0.15%にあたるそうです。律儀に一つの言語を全問解く人はあまりいない模様。

![スクリーンショット 2024-01-10 23.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195606/329c9fbb-e188-9d2d-840c-551e03eb7693.png)
wslでelixir その131

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
プロセス間通信／分散／並行、調べてみた。

# 参考にしたページ

https://qiita.com/piacerex/items/f1cefcaa170c116db048

# プロセス間通信／分散／並行

精一杯やりました、こんなので、どうですか。

|番号|名称|分類|異言語|ライブラリ|paiza.io|
|:-|:-|:-|:-|:-|:-|
|① |Stream|並行|x|Stream 組み込み|https://paiza.io/projects/pGR3-NITbNWFmWv9ZXVhKQ
|② |spawn／send／receive|通信|x|Process 組み込み|https://paiza.io/projects/mFvAi2KIyJTjbAC1Lp2uxQ?language=elixir
|③ |Parallel Map|並行|x|Process 組み込み |https://paiza.io/projects/zn3dOmA1pY8SzsrJv74nDw
|④ |Task|並行|x|Task  組み込み|https://paiza.io/projects/1m9iMXK_iQ0N1s-KJS91cA
|⑤ |GenServer|分散|x|Genserver  組み込み|https://paiza.io/projects/Q-LD8DwvWaprtNGqdbv78w?language=elixir
|⑥ |Agent|分散|x|Agent 組み込み |https://paiza.io/projects/YMYm3XAb4XiouBYrbHo-ew
|⑦ |ETS／Registry|分散|x|ETS／Registry |
|⑧ |GenStage|並行|x|gen_stage| |
|⑨ |Flow|並行|x|flow|
|⑩ |Broadway|並行|x|broadway|
|⑪ |Mnesia|分散|x|Mnesia 組み込み|https://paiza.io/projects/6nMKpEEx2_eJjHAmnTdMAg
|⑫ |Redix|分散|◯|redix |
|⑬ |Node／global／pg|通信|x|Node 組み込み |https://paiza.io/projects/mmuwpI08a-Yv9fDWCzmG2w
|⑭ |libcluster|分散|◯|libcluster|
|⑮ |dns_cluster|分散|x|dns_cluster|
|⑯ |ErlPort／KafkaEx／Protobufなど|分散|◯|ErlPort／KafkaEx／Protobufなど|
|⑰ |FRAME|分散・並行|x|FRAME|
|⑱ |Channel／LiveView|分散・並行|x|LiveView|
|⑲ |Livebookノード|分散・並行|x|Livebook |


以上。
Customize Sales Cloud for Your Business


# We can't find a field labeled First Sales Date on the Account Object

+ [Point Redemption Issue: Customize Sales Cloud for Your Business Challenge](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PfBx7)

:::note
Did you create it in the Account object?

I solved it. The first time I created the field First Sale Date on the wrong object. Then I deleted it and created it again on the Account object.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000075uumvSAA
:::

+ [Point Redemption Issue: Customize Sales Cloud for Your Business Challenge](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PfBx7)
拡張ドメイン設定後のリダイレクトのまとめ


# どうやって、URLを変えるか

+ [従来の Salesforce URL のリダイレクトの終了に備える](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvMjP)

:::note
 in the re-direct logs you downloaded you would be knowing which users are still hitting old url.. you can plan for a communication to those users.

have a plan to 

1. Download the logs on bi-weekly basis.
2. Find the actors or users who are repeated offenders and reach to those users via email educating them about new link


ダウンロードしたリダイレクト ログを見ると、どのユーザーがまだ古い URL にアクセスしているかがわかります。それらのユーザーへの通信を計画できます。

計画 

1. 隔週ベースでログをダウンロードします。
2. 犯罪を繰り返している行為者またはユーザーを見つけ、電子メールでそれらのユーザーに連絡し、新しいリンクについて説明します。
:::


# リダイレクト ログの確認についてサポートが必要です。

+ [Need help on reviewing redirection log.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000079Pibq)

:::note
It's best to look at the metadata in the org to see if any references to that *.na166.content.force.com URL exist. This may be within an email template, and email templates unfortunately use hardcoded URLs for the most part.

組織内のメタデータを調べて、その * への参照があるかどうかを確認することをお勧めします。na166.content.force.com URL が存在します。これは電子メール テンプレート内にある可能性がありますが、残念ながら電子メール テンプレートではほとんどの部分でハードコードされた URL が使用されます。
:::

# パラメータを使用したドメイン リダイレクト

For all redirections, parameters passed via a URL follow these rules.

+ The redirection includes query-string parameters up to the first hash (#), if present.
+ The redirection doesn’t include any hash fragments. A hash fragment is the part of the URL that includes a hash (#) and the text that follows it.
+ For entity-containing requests, such as POST, the redirect includes a Temporary Redirect (307) HTTP response status code. That status code instructs the browser to retry the request at the new location via the original request method.[^13]


すべてのリダイレクトで、URL 経由で渡されるパラメーターは次の規則に従います。

+ リダイレクトには、存在する場合、最初のハッシュ (#) までのクエリ文字列パラメーターが含まれます。
+ リダイレクトにはハッシュ フラグメントは含まれません。ハッシュ フラグメントは、ハッシュ (#) とそれに続くテキストを含む URL の一部です。
+ POST などのエンティティを含む要求の場合、リダイレクトには一時リダイレクト (307) HTTP 応答ステータス コードが含まれます。そのステータス コードは、元のリクエスト メソッドを介して新しい場所でリクエストを再試行するようブラウザに指示します。


# インスタンスの記載があるURL

+ [記載されている URL ではなく、別の URL に移動するボタン。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Wdl0RSAR)

:::note
これは、「マイ ドメイン」として知られる Salesforce 機能が原因である可能性があります。Salesforce 組織で [私のドメイン] が有効になっている場合、標準の Salesforce ドメイン (例: na1.salesforce.com ) をカスタム ドメイン (例: test--c.my.salesforce.com ) に置き換えることができます。 
:::
【JavaScript】三項演算子の入れ子、いうほど可読性悪くない説


## ワンライナーで書かれた入れ子は見にくいけど…

```js:例1
const result = isFizz && isBuzz ? 'FizzBuzz' : isFizz ? 'Fizz' : isBuzz ? 'Buzz' : i;
```

## 改行されていればそんなに可読性が悪くない

```js:例2
const result = isFizz && isBuzz ? 'FizzBuzz' :
               isFizz ? 'Fizz' :
               isBuzz ? 'Buzz' : i;
```

改行されていても見にくいかも？と感じる方は三項演算子を気にしすぎているかもしれません。
`?`や`:`のことは気にせず、このように脳内変換すれば読みやすくなるでしょう。

```js:例3
const result = isFizz && isBuzz ⇒ 'FizzBuzz'
               isFizz           ⇒ 'Fizz'
               isBuzz           ⇒ 'Buzz' : i;
```

例2、例3は条件と対応する値が近くに並んでいて、文量も少なく読みやすいですね。

ただし、見やすさは主観的なものなので、三項演算子に対する感覚に慣れていない場合は、他の書き方を選んだほうが良いかもしれません。（特に初心者は）
Salesforceのバッチ処理の管理


+ [Salesforceのバッチ処理について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007W5eft)

①決まった時間に処理が動き出す（ex：バッチAをAM0:00に起動）
②バッチ処理間に依存関係を付ける（ex：バッチAの処理完了後、バッチBを実行）
③バッチ完了状態がSalesforceのホーム画面上でユーザーが把握できるようにする
イメージとしては、スケジューラーを使用して順次処理を起動させるような仕組みを組む


Apexバッチならスケジュールすることができるので、①の要件は満たせると思います。

②についてはJobの実行結果を監視する必要があると思います。他に走るジョブがなければ、ステータスが実行中のジョブを検索して結果が０件であれば後続処理を流すような仕掛けをつくれば②も可能だと思います。

ただ、②は繰り返し起動するような処理が必要です。後続処理も自分自身が２回流れないような制御も必要だと思います。

③については、BatchJobを表示するカスタムコンポーネントを作るか、ジョブの終了後に通知メールを送信する方法が使えるのではないでしょうか。

----------------

バッチ処理の実行結果を管理するカスタムオブジェクトを作っても問題なければ以下の方法が簡単かもしれません。

①の処理がスタートしたらレコードを作成します。また完了したら完了日時あるいは完了チェックボックスをtrueにします。

②の処理は①が終わるであろう時間に起動させます。（平均的な時間間隔分あけます）

②の処理の最初で、日付と処理名などをキーに検索して①の処理が完了しているか、また②自身の処理がないかを確認して問題なければ、処理を開始しします。ここでまたカスタムオブジェクトにレコードを追加します。処理が終われば①と同じように完了日時あるいは完了チェックボックスをtrueにします。

②の２回目の処理を時間起動でスタートして、やはり①の終了と②自身のレコードがあれば（終わってなくても処理が走っていれば）、後続の処理は行いません。そうでなければ、後続の処理を流します。

上記の繰り返しを何個か時間を空けて設定しておけば、バッチ処理だけで仕組みを構築できると思います。

また、このカスタムコンポーネントに処理結果やエラー内容も書き込んでおけば便利だと思います。またカスタムオブジェクトなので、標準的な画面でよければカスタムコンポーネントの作成も不要です。

# 設定など

+ [Can we schedule a batch class to run every 15 mins?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvlEC)

:::note
Please check this article.

https://salesforce.stackexchange.com/questions/37333/how-to-run-a-scheduled-job-every-15-minutes
:::
スーパーヒーローから学ぶ：優秀なCTOとマネージャーの影響力

優秀なCTOとマネージャーの影響力について、スーパーヒーローから学んでみましょう！

A：「優秀なCTOとマネージャーって、どんな人たちだと思いますか？」

B：「それは、スーパーヒーローのような人たちですよ。彼らは誰よりもパフォーマンスを出し、会社、サービスにコミットしているので２４時間働きます。責任感があるので、部下のミスも全てカバーしてがんばります。目線が高いので色んな事に気が回るので先回りして準備します。」

A：「スーパーヒーローですか！でも、スーパーヒーローが組織に与える影響はどうでしょうか？」

B：「実は、スーパーヒーローであることが必ずしも良いとは限らないんです。彼らが全てを自分でやり、全てをカバーしようとすると、チームメンバーが自己主導的に行動する機会を奪い、やる気を失わせる可能性があります。」

A：「それは驚きですね。では、どのようにすれば良いのでしょうか？」

B：「教えるのではなく、一緒に考えることが重要です。また、大きすぎる仕事はタスクに分解して渡すことで、メンバーが対応できる状態にすることも重要です。そして、一つの利益をあげることを考えるよりは、それまでの一つの害を除くことに専念したほうがよいという考え方は、組織の成長にとって有益です。」

A：「それは理解できます。他に何かアドバイスはありますか？」

B：「メンバーには具体的なやり方ではなく、問題解決のための考え方を教えることが重要です。これにより、メンバーは同じような仕事でも自分で考えて結果を出せるようになります。そして、CTOやマネージャーは、自分の時間が空いたら次の組織の成長に向かって考えるべきです。目の前のタスクに囚われず、次のステージを目指すことが重要です。」

A：「なるほど、それは大切なポイントですね。ありがとうございました。」

B：「いえいえ、こちらこそ。そして覚えておいてください、スーパーヒーローは素晴らしいですが、時には彼らも休息が必要ですよ！」

# まとめ
1. **優秀すぎるCTOとマネージャー**：彼らは非常に効率的で、全てを自分でやり、全てをカバーしようとします。しかし、これは結果としてチームメンバーが自己主導的に行動する機会を奪い、やる気を失わせる可能性があります。

2. **自分でやらないと覚えない**：人々は自分で何かを行うことで最もよく学びます。CTOやマネージャーが全てを教えてしまうと、チームメンバーは自分で考える機会がなくなり、学びの機会を失います。

3. **適度な教え方**：教えるのではなく、一緒に考えることが重要です。また、大きすぎる仕事はタスクに分解して渡すことで、メンバーが対応できる状態にすることも重要です。

4. **良い方向に導くより悪い部分を埋めていく**：一つの利益をあげることを考えるよりは、それまでの一つの害を除くことに専念したほうがよいという考え方は、組織の成長にとって有益です。

5. **やり方ではなく、考え方をインストール**：メンバーには具体的なやり方ではなく、問題解決のための考え方を教えることが重要です。これにより、メンバーは同じような仕事でも自分で考えて結果を出せるようになります。

6. **暇に慣れろ**：CTOやマネージャーは、自分の時間が空いたら次の組織の成長に向かって考えるべきです。目の前のタスクに囚われず、次のステージを目指すことが重要です。
【備忘録】code .　でCursorが開いてしまう問題

# はじめに

https://cursor.sh/

[Cursor](https://cursor.sh/)をインストールしましたが、VScodeを使用したい時に問題が発生しましたので解決方法を記載します。


# 問題

termina上で`code.`を実行すると、VScodeではなくCursorが開かれる

## 実行環境
Mac mini M1 


# 解決方法
### まずVScodeでcodeコマンドをuninstallする

VScodeで`command+shift+p`を押しコマンドパレットを開く。
`shell`と入力する。
codeコマンドをアンインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673160/c70f3255-c20a-d6e2-6ff1-a424523e2f39.png)

### もう一度codeコマンドをインストール
先ほどと同じ手順で、今度はインストールを選択する。
すると、terminal上でVScodeが開けるようになります。

# おわりに

ちなみにCursorは`cursor .`コマンドで開けるので、使い分けできそうです。
iPhoneで人物を異なる背景に貼り付ける

# 動画合成／画像合成でさまざまなイメージを作れる

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d7eef89a-c460-f39e-5393-07746238d30b.jpeg)
![matte.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/430608a9-522e-1f47-3ecd-8710fceb3129.jpeg)
![スクリーンショット 2024-01-11 6.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/9d3472b2-0696-ee0a-9326-fb2d84d5ed23.png)

iPhoneやiPadのアプリで高速に実行できるので、

**・旅行イメージの提案
・広告画像の作成
・商品使用イメージ
・動画のクロマキー合成**

などに使える。

# コード

以下のコードだけで人物のマット画像がとれる。

```swift
import Vision
```

```swift
var request = VNGeneratePersonSegmentationRequest()
request.qualityLevel = .accurate // .balanced .fast
let handler = VNImageRequestHandler(ciImage: inputCIImage, options: [:])
do {
    try handler.perform([request])
    guard let result = request.results?.first as? VNPixelBufferObservation else { return }
} catch let error {
        print(error)
}
```

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ebb72f4d-dd6f-50ad-717e-aabbc373ba9d.jpeg)![matte1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/eead985f-f947-c67f-28a3-279c558c334a.jpeg)

これを背景画像と合成するコードは以下。

```swift
let outputCIImage = CIImage(cvPixelBuffer: result.pixelBuffer).resize(as:inputCIImage.extent.size)
guard let backgroundImage = UIImage(named: "cube"),
let bgCIImage = CIImage(image:backgroundImage)?.resizeBackGround(as: inputCIImage.extent.size) else { fatalError() }
guard let compositedCIImage = CIFilter(name: "CIBlendWithMask", parameters: [
                kCIInputImageKey: ciImage,
                kCIInputBackgroundImageKey:bgCIImage,
                kCIInputMaskImageKey:outputCIImage ])?.outputImage else {fatalError("Image processing failed.")}
let context = CIContext()
guard let safeCGImageFinal = context.createCGImage(compositedCIImage, from: compositedCIImage.extent) else {fatalError("Image processing failed.")}
let outputImage = UIImage(cgImage: safeCGImageFinal)
```

![cube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d1c5b7ae-0023-e37c-55eb-3d07f6e2f4c3.jpeg)![スクリーンショット 2024-01-11 7.11.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7bb5ec46-5167-7446-946b-4c86d2b29ef0.png)

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Rubyでおみくじプログラム

Rubyでおみくじプログラムを実装しました。

```ruby 
########################################
# おみくじプログラム           #########
########################################

puts "正の整数を入力してください"
num = 0
flag1 = 0
while flag1 == 0 do
  # 0以下の整数と整数以外が入力されたら例外処理で再度整数入力を促す
  begin
    input1 = gets
    num = input1.to_i
    if num > 0 then
      flag1 = 1
    else
      raise StandardError.new()
    end
  rescue => e
    e = "0以下の整数および整数以外は入力できません"
    puts e
  end
end
# 入力した正の整数を5で割る
ans = num % 5
# 5で割った余りでおみくじの結果を表示する。
if ans == 0
    puts("大吉")
elsif ans == 1
    puts("中吉")
elsif ans == 2
    puts("吉")
elsif ans == 3
    puts("小吉")
elsif ans == 4
    puts("凶")

end
```
mindの研究 その69

# 概要
mindが、謎なので調べてみた。
mindをgithubにアップしてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0c457ed4-983d-a4de-3c33-20ab26dd5091.png)

# 環境
- windows10
- wsl1 ubuntu20.04
- mind 8.07




# 手順
# githubに、リポジトリ作る。

- https://github.com/にSign inする。
右上の「+」から「New repository」を選択する。
「Repository name」にリポジトリ名(ohi-mind)を入力する。
Description にmind example programs
リポジトリを公開する場合は「Public」をチェックする。
「Initialize this repository with a README」をチェックする。
license は、Mit
「Create repository」をクリックする。

# wslに、リポジトリ作る。

```
$ mkdir github

$ cd github

$ git clone https://github.com/ohisama/ohi-mind.git
Cloning into 'ohi-mind'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 1.24 KiB | 40.00 KiB/s, done.

$ cd ohi-mind
```

# ファイルをコピーする。
```
$ explorer.exe .
```

# pushする。
- パスワードに、アクセストークンを使う。

```
$ git add .

$ git commit -m "update2"

$ git push

```

# 成果物

https://github.com/ohisama/ohi-mind


以上。
エンジニアのモチベーションと報酬設計：内的報酬と外的報酬のバランス

エンジニアの採用は非常に困難な課題となっています。
エンジニアの需要が高まる一方で、エンジニアが取り組む仕事の内容はますます複雑化し、範囲も広がっています。これに対処するためには、CTO自身が真剣に取り組み、考え続ける必要があります。

そして、一度採用したエンジニアには、長期間働いてもらい、チームメイトとして最高のパフォーマンスを発揮してもらいたいと思うでしょう。
そのためには、報酬設計が重要な要素となります。

報酬設計には2つの側面があります。

# １. 外的報酬

外的報酬とは、給与や賃金を指します。また、役職や地位も報酬の一部と考えられます。部長や本部長などの役職を持つと、社外での名刺交換時にも印象が良くなります。

その他にも、手当や秘書の付与、経費の枠の拡大など、さまざまな形で提供されます。

# ２. 内的報酬

内的報酬とは、仕事そのもののやりがいを指します。楽しい仕事であればやる気が湧き、難しい仕事であればやりがいを感じる人もいます。エンジニアの場合、問題が多いプロジェクトほど、闘志を燃やす人が多いようです。

また、スキル開発の機会も内的報酬の一部です。エンジニアの場合、Reactの開発経験が得られる、データサイエンスが学べるなど、スキルを伸ばす機会があると、モチベーションにつながります。

もちろん、人間関係も重要です。尊敬できる上司がいればやる気が湧き、頼りがいのある同僚や、自分を頼ってくる新人もモチベーションの一つとなります。

# 基本的には、内的報酬が重要

長年のCTOとしての経験から言うと、転職の大きな要因は、内的報酬が失われたときです。

その中でも、人間関係が悪化したときが最も大きいかもしれません。コミュニケーションが取れなくなったり、人間関係が悪化したとき、相談してくるのであれば良いのですが、その前に転職を決意するケースが多いです。

次に大きいのは、仕事のやりがいです。そして、スキル開発の機会とのバランスで転職を決意します。

これは経験年数によっても変わると思います。

| 経験年数 | 内的報酬 |
|---|---|
| 若手 | 人間関係 > スキル開発 > 仕事のやりがい |
| 中堅 | スキル開発 > 仕事のやりがい > 人間関係 |
| ベテラン | 人間関係 > 仕事のやりがい > スキル開発 |


***若手***
若手エンジニアは、まだ仕事に慣れていないため、人間関係の構築が重要です。尊敬できる上司や同僚がいることで、仕事へのモチベーションが高まります。また、スキル開発にも意欲的ですが、まだ自分のスキルやキャリアプランが明確になっていないため、仕事のやりがいよりも、スキル開発の機会を重視する傾向があります。

***中堅***
中堅エンジニアは、ある程度仕事に慣れ、スキルや経験を積み重ねてきます。そのため、スキル開発への意欲も高まります。また、仕事のやりがいも重要視するようになります。特に、自分のスキルや経験を活かして、社会に貢献できることにやりがいを感じます。

***ベテラン***
ベテランエンジニアは、仕事の経験も豊富で、スキルも十分に身に付いています。そのため、人間関係を重視するようになります。また、仕事のやりがいも重要ですが、スキル開発よりも、自分の知識や経験を後輩に伝えることにやりがいを感じます。

もちろん、これはあくまでも一般的な傾向であり、個人差があります。また、経験年数と内的報酬の優先順位は、時代や社会情勢によっても変化する可能性があります。
このようなイメージが強いです。

この内的報遅は、適切なマネジメントと適切なポジション配置により生まれます。状況を常にウォッチしましょう。

# 外的報酬は最低限必要

内的報酬だけを期待していると、やりがい詐欺と思われることがあります。やりがいだけに頼っている会社は結構あります。一方、外的報酬だけに頼っている会社は、長続きしません。会社のPLのバランスがおかしくなり、その人が転職するときに給与が合わなくなると困ったことになります。

会社を転職しようと思ったとき、マーケットよりも給料が高いと転職先が限られます。また、年収を下げて転職しようとすると、税金の問題に直面します。税金は翌年の収入を基に仮計算されるため、収入が少ないのに税金が高いままで苦労することになります。

しかし、外的報酬は、最低限のレベルとして必要です。やりがいで悩んで転職を考えても、給与が下がると転職をためらいますが、給与が上がると、外的報酬と内的報酬の両方が満たされるため、転職しない理由は見つかりません。最低限、競合他社に負けないレベルの外的報酬を確保しておきましょう。

# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Googleスプレッドシートの読み取り

## はじめに
Googleスプレッドシートに入力した情報を読み取るために使用しました．Ubuntu 22.04からcurlでアクセスし，jsonファイルとして保存しました．

## 使い方
### Google Cloud プロジェクトを作成する
Google Workspace APIを使うには，Google Cloud プロジェクトを作成する必要があります．プロジェクト名，プロジェクトに関連付ける組織，プロジェクトを配置する場所を決めます．

### Google Sheets APIを有効にする
Google WorkspaceのプロダクトライブラリからGoogle Sheets APIを選択し，有効化します．

### OAuth 同意を構成する


### アクセス認証情報を作成する
APIキー，OAuth2.0クライアントID，サービスアカウントを作成します．

## 読み取り
Googleスプレッドシートは，それぞれspreadsheetId持ちます．spreadsheetIdは，スプレッドシートのURLにかかれています．スプレッドシートのURLは，下記のようになっています．
`` https://docs.google.com/spreadsheets/d/"spreadsheetId"/edit#gid=0 ``
"spreadsheetId"の部分がそれぞれのspreadsheetIdになっています．


下記のURLに"spreadsheetId"，"シート名"，"APIキー"を入れてアクセスすると，
`` https://sheets.googleapis.com/v4/spreadsheets/"spreadsheetId"/values/"シート名"?key="APIキー" ``
下のようなスプレッドシートの場合
![スクリーンショット 2024-01-11 052122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562109/abf35436-2c81-1218-9b02-8f6761d38c81.png)
下のようなページが出てきます
![スクリーンショット 2024-01-11 052202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562109/2b3b0eb8-31bd-799c-ae6a-d414470572ad.png)
【ReactHookForm】ブラウザのバリデーション機能を使用する方法

以下のように`shouldUseNativeValidation`を`true`にすることでブラウザのバリデーションを使用できます。

```jsx
import { useForm } from "react-hook-form"


export default function App() {
  const { register, handleSubmit } = useForm({
    shouldUseNativeValidation: true,
  })
  const onSubmit = async (data) => {
    console.log(data)
  }


  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      
    </form>
  )
}
```
Pythonで「集合の長さ(要素数)を取得する」の動作を確認してみた

# 概要

Pythonで「集合の長さ(要素数)を取得する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/set/index3.html

# 実装

以下のファイルを作成しました。
```sample.py
colorset = {"Blue", "Red", "Green", "White", "Black"}
print("要素数は " + str(len(colorset)) + " です。")
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
要素数は 5 です。
```

# まとめ

何かの役に立てばと。
型による条件分岐みたいなことをメソッドでやろうとしたら mypy にエラーを出された

へぇ〜となったので共有。

## 最初に結論

- ```mypy``` の設定はデフォルト
- 型による条件分岐は ```if isinstance(piyo, Type):```とすればできる。
    - 読みやすくしようと```if is_eatable(piyo):```という形にすると mypy にエラーを出される。
- じゃあ、どうする？
    - ```isinstance(...```で満足する
        - 記事書き出して気づいたんですが、これでいいですね。コメントを書けばいい。
    - ```if is_eatable(piyo) and isinstace(...:``` みたいな書き方
        -  ```and```を使えば両辺が True じゃないと進めませんから mypy も満足してくれるようです。
            -  意味内容の面から言うと無。同じ if 文を 2 回書いているようなもの。

## サンプルコード

```python:正月.py
class Man:
    """mypy の動作チェッククラス"""

    def __init__(self) -> None:
        self.before_meshi: list[str | int] = []
        self.meshi_pattern: list[str | int] = ["おもち", "おせち", 0xDEADBEEF]

    def _eat(self, food: str) -> None:
        self.before_meshi.append(food)

    def is_eatable(self, food: str | int) -> bool:
        ```食べられるかチェックする```
        if isinstance(food, str):
            return True
        return False

    def meshi(self, food: str | int) -> None:
        # if isinstance(food, str): と同義のはずだが…
        # mypy_test.py:20: error: Argument 1 to "_eat" of "Man" has incompatible type "str | int"; expected "str"  [arg-type]
        if self.is_eatable(food):
            self._eat(food)
        return None

    def lookup_meshi(self) -> None:
        for meshi in self.before_meshi:
            print(f"{meshi}を食べました")


sato_san = Man()
sato_san.meshi(sato_san.meshi_pattern[0])
sato_san.meshi(sato_san.meshi_pattern[1])
sato_san.meshi(sato_san.meshi_pattern[2])
sato_san.lookup_meshi()
assert 0xDEADBEEF not in sato_san.before_meshi, "えっ、牛肉？ 食べたけど？"

#おもちを食べました
#おせちを食べました
```

## 賀正

このコードは、```sato_san```の正月シミュレーションを通して ```mypy```の動作確認を行っています。

```python
    def is_eatable(self, food: str | int) -> bool:
        if isinstance(food, str):
            return True
        return False

    def meshi(self, food: str | int) -> None:
        # if isinstance(food, str): と同義のはずだが…
        # mypy_test.py:20: error: Argument 1 to "_eat" of "Man" has incompatible type "str | int"; expected "str"  [arg-type]
        if self.is_eatable(food):
            self._eat(food)
        return None
```

意図としては条件文を考えなくて良いように、わかりやすい名前をつけようとしています。
この部分に、 ```mypy``` はエラーを出します。しかし、この部分を

```python
    def meshi(self, food: str | int) -> None:
        if isinstance(food, str):
            self._eat(food)
        return None
```

とするとエラーが出ません。
どうやら、```mypy```は空気を読んでくれないようです。毎回ジャンプして読みに行っているわけではないのでしょう。
同様に関数内関数でも実験しましたが、エラーを出しました。

```is_eatable()```を使うために
```python
    def is_eatable(self, food: str | int) -> bool:
        if isinstance(food, str):
            return True
        return False

    def meshi(self, food: str | int) -> None:
        if self.is_eatable(food) and isinstance(food, str):
            self._eat(food)
        return None
```

このようにすると、エラーがでなくなります。
ただ、一般的に両辺には別の条件を期待しますから、ちょっと考えた挙句なんの意味もないと気づくということが起こるでしょう。

```mypy```のエラーを避けるための小細工はコードを読む人には価値のない情報です。
```isinstance```を使ってコメントを書くか、エラーを抑制して```is_eatable```を使うのが良いでしょう。
PythonAnywhereでCSSが効かない

# PythonAnywareを用いた時にCSSが効かない問題を解決

PythonAnywhereで参照しているstaticと自分が作成したstaticのpathが違うことによる問題

setting.py で
```ruby:qiita.python.Django
STATIC_URL = 'static'

STATICFILES_DIRS = (
    [
        os.path.join(BASE_DIR, "<app-name>/static/css/"), 
    ]
)
```

となっていることを確認

webページの検証ツールで現在参照しているlinkを確認(headerに書いてあるはず)


cssのあるstaticのパスをPythonAnewhereのWebのstaticのDirectoryに書き込む
これがもともとhomeディレクトリにあるのが原因だと思われる
```ruby:qiita.bash
$  python manage.py collectstatic 
```
を実行


あとはリロードすればいけるはず
App Store アイコンとリンク生成のための便利ツール：Apple Media Servicesの活用

アプリ開発者やウェブサイト運営者にとって、自社のアプリを効果的に宣伝することは極めて重要です。その一環として、App Storeのアイコンやリンクをウェブサイト上で上手く表示することが求められます。そこで役立つのが「Apple Media Services」の提供する特別なツールです。このツールは、公式のApp Storeのアイコンを作成し、アプリへの直接リンクを簡単に生成することを可能にします。

https://tools.applemediaservices.com/ja-jp/app-store

利用方法は非常にシンプルです。上記のウェブサイトにアクセスし、自分のアプリに関連する情報を入力するだけ。すると、様々なサイズや形式でApp Storeのアイコンが生成され、HTMLやURL形式のリンクも提供されます。これらのリソースを利用することで、ウェブサイト上でのアプリの見栄えを向上させ、より多くのダウンロードへと繋げることができるでしょう。

また、このツールは無料で利用可能であり、Appleの公式リソースを使用するため、信頼性も高いです。アプリのプロモーションにおいて、このような細かい部分も大切にすることが、成功への近道と言えます。App Storeのアイコンとリンク生成に関して、是非この便利なツールを活用してみてください。

---
個人でアプリを開発しています。ベビーカーや車椅子利用の方に便利な、駅のエレベーター出入口を探せるアプリを開発しました。ぜひご利用ください。

https://apps.apple.com/jp/app/%E9%A7%85%E3%81%AE%E3%82%A8%E3%83%AC%E3%83%99%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97/id6472233345
Epimedium Macun 240g Price In Islamabad | 03222636660 | Shopii.com.pk

Epimedium Macun At Best Price In Pakistan | The Natural Aphrodisiac
Epimedium Macun Price In Pakistan is a traditional Turkish herbal paste made with Epimedium (Horny Goat Weed), a plant that has been used for centuries to function and vitality. It is also known as Azgın Teke Otu (horny goat weed) in Turkish. Epimedium Macun is typically made with a blend of Epimedium, honey, and other natural ingredients consumed by both men and women.
https://shopii.com.pk/products/epimedium-macun-price-in-pakistan
Order Now WhatsApp & Call:
03222636660
【TIPS】Elixirの多彩な文字列抽出

この記事は、[Elixir Advent Calendar 2023 シリーズ14](https://qiita.com/advent-calendar/2023/elixir) の10日目です

---

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Elixirは、データ加工が得意な言語ですが、文字列操作も独特の便利さがあり、今回は多彩な文字列抽出を紹介します

# 開始と終了の指定

```diff_elixir
iex> "私はElixirが大好きです" |> String.slice(2, 6)
"Elixir"
```

# 開始をマイナスで指定すると後ろからカウント

```diff_elixir
iex> "私はElixirが大好きです" |> String.slice(-5, 3)
"大好き"
```

# レンジで指定

```diff_elixir
iex> "私はElixirが大好きです" |> String.slice(2..7)
"Elixir"
```

# レンジの開始と終了をマイナスで指定すると後ろからカウント

```diff_elixir
iex> "私はElixirが大好きです" |> String.slice(-5..-3)
"大好き"
```

# レンジで飛び飛びの指定

```diff_elixir
iex>  "私はElixirが大好きです" |> String.slice(2..10//2)
"Eiiが好"
```

# レンジの終了をマイナスで指定すると終わりを後ろからカウント

```diff_elixir
"私はElixirが大好きです" |> String.slice(2..-3//1)
"Elixirが大好き"
```

# 文字単位で無くバイト単位

UTF-8は1文字3バイト換算です

```diff_elixir
iex> "私はElixirが大好きです" |> binary_part(6, 5)
"Elixi"

iex> "私はElixirが大好きです" |> binary_slice(7, 5)
"lixir"

iex> "私はElixirが大好きです" |> binary_slice(7..9)
"lix"
```
グラフ型 NoSQL「Neo4j」のクエリ言語 Cypherの使い方（Windows版）

![introducing-neo4j-4-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/7cf7288f-f0c2-4354-e150-0cc627fe1f5c.gif)
### 1. Neo4jとは
- NoSQLのグラフ型データベース。データをノード（nodes）とエッジ（relationships）によるグラフ構造で表現する。
- Javaで開発され、オープンソースとして提供されている。
- 2000年ごろ、スウェーデンで開発された。後に本社をシリコンバレーに移転した。
- 「Cypher」と呼ばれる専用のクエリ言語を使用する。ノードや関係に対するクエリを直感的に記述できる。
- トランザクション処理をサポートしており、データの一貫性（整合性）を確保できる。

### 2. Neo4jの導入
Neo4jとJDKを各々ダウンロードし、インストールする。

:::note
- Neo4j：https://neo4j.com/docs/operations-manual/current/installation/windows/
- JDK：https://jdk.java.net/archive/
:::

＜JAVAのパス設定＞
(1) スタートメニューから 「Windowsシステムツール」→「コントロールパネル」を開く
(2)「システムとセキュリティ」→「システム」→「システム詳細設定」→「環境変数」を開く
(3)「システム環境変数」で下記のように登録
　変数名：　JAVA_HOME
　変数値：　C:\Java\jdk-11.0.2
(4)「Path」を選んで、次のように登録
　%JAVA_HOME%\bin

### 3. Neo4jの起動
Neo4j Desktopをダブルクリックして起動する。

### 4. Neo4j 新規プロジェクトの作成
(1) Neo4jのGUI画面から、Project → Add → Local DBMS をクリックする。
(2) プロジェクトの名前（name）とパスワード（password）を設定し、「Create」をクリックする。
(3) 作成したプロジェクトを選択し、「start」をクリックすると、neo4j browserが起動する。

### 5. Neo4jのコマンド
#### 5-1. ノードとリレーションシップの作成
■ ノード
- ノードは、ラベルとプロパティで構成される。ラベルはノードの名前、プロパティはノードの属性情報を示す。
- ノードは括弧 () で表し、コロン（:）の前の文字列を変数、コロン（:）の後の文字列をラベルという。
- プロパティは、()内の{}で表す。

■ リレーションシップ
- リレーションは、ノードと同様に、ラベルとプロパティで構成される。
- リレーションは、角括弧 [] で表わし、リレーションの方向を -、->、<- で表現することができる。

例1）ノードの作成
　ラベルが "User"、プロパティが "name" と "age" を持つノードを作成する。
　変数 u1：name が「太郎」、age が「25歳」
　変数 u2：name が「花子」、age が「27歳」
例2）リレーションシップの作成
　変数 r1：u1は、u2とfriendの関係
　変数 r2：u2は、u1とfriendの関係
```rb
CREATE (u1:User {name:"taro", age:25}) 
CREATE (u2:User {name:"hanako", age:27}) 
CREATE (u3:User {name:"jiro", age:23}) 
CREATE (u1)-[r1:friend]->(u2) 
CREATE (u1)<-[r2:friend]-(u2) 
CREATE (u1)-[r3:brother]->(u3) 
CREATE (u1)<-[r4:brother]-(u3) 
RETURN u1,u2,u3,r1,r2,r3,r4
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/a624edc9-b44d-78a6-fc1b-eff030c2372d.png)

#### 5-2. ノードとリレーションシップの検索
例1）'taro'という名前の User ノードとそのfriendリレーションシップを検索する。
```rb
MATCH (p1:User)-[:friend]->(p2:User) WHERE p1.name='taro'
RETURN p1,p2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/e7bc6cfc-c6b3-3d1d-5a5f-857b21d7d789.png)

例2：'taro'という名前の User ノードとそのbrotherリレーションシップを検索する。
```rb
MATCH (p1:User)-[:brother]->(p2:User) WHERE p1.name='tarp'
RETURN p1,p2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/1101ee64-3282-4af9-69eb-e52f54965098.png)

例3：ageが25歳以上のUserを検索する。
```rb
MATCH (p1:User)
WHERE p1.age > 25
RETURN p1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/b0f44568-0c63-2126-5a44-5e0edfb93b47.png)


#### 5-3. ノードのプロパティの更新

```rb
MATCH (p1:User {name:'taro'})
SET p1.age = 30
RETURN p1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/d38c1b42-8514-127a-8958-8c898c5c4b40.png)

#### 5-4. ノードとリレーションを全て削除する
```rb
MATCH (p1) DETACH DELETE p1
```

以上
【TIPS】プロセス名／プロセス情報の調べ方

この記事は、[Elixir Advent Calendar 2023 シリーズ14](https://qiita.com/advent-calendar/2023/elixir) の6日目です

---

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Elixirは、言語機能を支えるサービスがプロセスで構成されており、それらプロセスに名前が付いているので、プロセス名を調べ、プロセス情報を拾うことができます

# プロセス名の調べ方（シングルクラスタ）

Elixirの名前付きプロセスのプロセス名は、シングルクラスタ内に閉じた名前と、マルチクラスタで共有している名前の2種類ありますが、シングルクラスタは下記で調べられます

```diff_elixir
iex> Process.registered
[:kernel_safe_sup, :global_group_check, :user, :elixir_sup,
 :logger_handler_watcher, :standard_error_sup, :init, :user_drv, :observer,
 :appmon_info, :rex, :inet_db, :elixir_code_server, :erts_code_purger,
 :standard_error, :socket_registry, IEx.Config, :user_drv_writer,
 :erl_signal_server, IEx.Pry, :kernel_sup, :timer_server, Logger.Supervisor,
 :code_server, :logger_std_h_default, :logger_sup, :erl_prim_loader,
 :user_drv_reader, :global_name_server, :logger, IEx.Broker, :file_server_2,
 :elixir_config, :global_group, :application_controller, :kernel_refc,
 IEx.Supervisor, :wxe_master, :logger_proxy]
 ```

下記で調べることもできます（プロセスIDのリンクをクリックすると、親プロセスやリンクプロセスにも飛べます）

```diff_elixir
iex> :observer.start
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/2ea821c3-9f7c-dc6e-9603-743b12db75c9.png)

Phoenixだと、`http://localhost:4000/dev/dashboard` で調べることができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/4e5098a7-1c58-9797-e682-795a18ee4ebe.png)

# プロセス情報の調べ方

特定したプロセス名を使って、プロセスIDを取得し、プロセス情報を得ることができます

たとえば、`:global_group` プロセスはGenServerで、2つのプロセスにリンクしていることが分かります

```diff_elixir
iex>  Process.whereis(:global_group) |> Process.info
[
  registered_name: :global_group,
  current_function: {:gen_server, :loop, 7},
  initial_call: {:proc_lib, :init_p, 5},
  status: :waiting,
  message_queue_len: 0,
  links: [#PID<0.49.0>, #PID<0.62.0>],
  dictionary: [
    "$ancestors": [:kernel_sup, #PID<0.47.0>],
    whereis_name: [:undefined],
    registered_names: [:undefined],
    send: [:undefined],
    global_group_check: #PID<0.62.0>,
    "$initial_call": {:global_group, :init, 1}
  ],
  trap_exit: true,
  error_handler: :error_handler,
  priority: :max,
  group_leader: #PID<0.46.0>,
  total_heap_size: 376,
  heap_size: 376,
  stack_size: 11,
  reductions: 549,
  garbage_collection: [
    max_heap_size: %{
      error_logger: true,
      include_shared_binaries: false,
      kill: true,
      size: 0
    },
    min_bin_vheap_size: 46422,
    min_heap_size: 233,
    fullsweep_after: 65535,
    minor_gcs: 0
  ],
  suspending: []
]
```

observerだと、プロセスリストのプロセスをダブルクリックしたら見れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/4f246ad2-a165-b222-bbc3-c1143ee23398.png)

Phoenixでも、プロセスリストのプロセスをクリックしたら見れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5ccc06f1-8c57-dfc6-48b2-4949b862233c.png)
GASで出勤日数確認メールを一斉に送る（経費・控除額・補助額など）

## 送信用のデータを作る
送信用のデータを作成します。まず、スプレッドシートで「名前」「メールアドレス」「出勤日数」の表を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592669/e34557c5-9a9b-5da0-3d7f-2b42d5cb4d0a.png)

## GASを開く
GASを開きます。スプレッドシートが完成したら、拡張機能から「Apps Script」を選択してGASを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592669/03711098-1811-eca9-8a66-5e5743c86bd1.png)

## コードを書いて実行する
コードを書き、実行します。以下のコードをスプレッドシートに書き込んでください（コードは下部に示されています）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592669/8c4e68f9-2eff-7f1b-e1d2-f513c800f6ce.png)

ボタンをクリックして実行します。フロッピーボタンでコードを保存し、「＞実行」をクリックしてテストしてみてください。

```js
function myFunction() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = spreadsheet.getSheetByName('シート1')
  var cell = sheet.getRange("A1");

  const lastRow = sheet.getLastRow();
  const lastColumn = sheet.getLastColumn();

  const itemValues = sheet.getRange(2,1,lastRow-1,lastColumn).getValues();

  for(let i = 0;i<lastRow-1;i++){
    const recipient = itemValues[i][1];//送信先のメールアドレス
    const subject = '○○の確認';//件名
    const toName = itemValues[i][0];//送信先の担当者名
    const body = '${toName}\n様\n'
      + '\nお世話になります。下記内容をご確認の上、不服がございましたらご連絡ください。\n' ;
     + '<table border><tr><th>金額</th><td>'+ itemValues[i][2].toString()+'</td></table>'
     
    const options = { name: '経理担当　ヤマダ',htmlBody: body };  //送信者の名前
    GmailApp.sendEmail(recipient, subject, body, options);
  }
}
```
:::note warn
注意
const,var,letなどの使い分けは気にしてないのでいい感じにしてください。
:::

## 経緯と応用
社内のお知らせや部署ごとのメール送信、営業用のメールなど、一括で多くのメールを送信したい場合に役立ちます。以前はPHPでウェブシステムを作成したり、配信メールやacmailerなどのツールを導入したりしていましたが、それほど必要な場合でもないことが多く、時間を無駄にしていました。そこで、GASを試してみたところ、簡単に実装できたので、共有したいと思いました。様々なシーンで活用していただければと思います。

## 参考
https://m-kenomemo.com/gas-getrange/
https://caymezon.com/gas-offset/
【Unity】Unity2023.2でLightProbeGropの配置を編集する

# はじめに
Unity2023.2でLightProbeGropの編集方法が変わったようです。
2024/01/11時点では公式ページには従来の編集方法が記載されているようです。

# 新旧の編集方法

* 従来のバージョン
Inspectorから設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/89ef0ae1-2ba4-9dc0-2590-9b0cf9a687bb.png)
※公式ページから引用

* Unity2023.2
Inspectorから設定項目がきえてます。
代わりに`SceneViewを見ろ` 的なことが書かれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/95fddcf4-87ce-2b2e-c3f4-4c0135795e42.png)
SceneViewのツールボックス?（Tools）の一番下にLightProbeGropの編集ボタンが追加されており、押すことでSceneViewに `Edit Light Probes` ウィンドウが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/8afe8c07-c8e7-180a-9421-75289feeea08.png)
terraformerでlambdaの設定をimportしようとしたら404になる

[terraformer](https://github.com/GoogleCloudPlatform/terraformer) 使ってますか？

既存のクラウド構成からterraformの定義ファイルを生成してくれる便利なヤツです。

terraformerのimportでリソースにAWS Lambdaを指定すると次のようなエラーになります。MacのHomebrewでのエラー解消方法メモです。

* terraformer 0.8.24 (Homebrewでインストール。2024年1月時点で最新）

```
$ terraformer import aws -r=lambda
2024/01/10 23:02:30 aws importing default region
2024/01/10 23:02:33 aws importing... lambda
2024/01/10 23:02:34 aws error initializing resources in service lambda, err: operation error Lambda: GetPolicy, https response error StatusCode: 404, RequestID: da938aca-5ec3-4c77-a108-b854aa062ad1, ResourceNotFoundException: The resource you requested does not exist.
2024/01/10 23:02:34 aws Connecting.... 
```

バグチケットは対応されてmasterブランチにマージされています。
> Error: Import AWS Lambda ends w/ an error #1599
> https://github.com/GoogleCloudPlatform/terraformer/issues/1599

Homebrewでインストールされる最新バージョンには修正が含まれないため、リポジトリのmasterブランチ最新を取得してインストールします。

```
$ brew unlink terraformer
$ brew install --HEAD --force terraformer
```

これでimportできるようになりました😇

```
$ terraformer import aws -r=lambda
2024/01/10 23:27:08 aws importing default region
2024/01/10 23:27:11 aws importing... lambda
2024/01/10 23:27:15 aws done importing lambda
2024/01/10 23:27:15 Number of resources for service lambda: 1
2024/01/10 23:27:15 Refreshing state... aws_lambda_function.tfer--test
2024/01/10 23:27:17 Filtered number of resources for service lambda: 1
2024/01/10 23:27:17 aws Connecting.... 
2024/01/10 23:27:17 aws save lambda
2024/01/10 23:27:17 aws save tfstate for lambda
```
paizaで使用するメソッド集

### 【概要】
---
paizaで頻出で使用する技術や、基本的な考え方をまとめています。
ご指摘や別の方法などあればコメント欄でご指摘をお願いいたします。

### 【はじめに】
---
まず、paizaについてご説明します。

>paizaラーニング とは？
paiza（パイザ）ラーニング は、動画を使ったオンラインのプログラミング入門学習コンテンツです。
プログラミング講座では、 Java、Python、Ruby、PHP、C言語、SQL、JavaScript、HTML+CSS などの講座を公開。1本約3分の動画とそれぞれのチャプターに対応した演習課題で効率よく学べます。

progateのようなオンラインで学習できるアプリになります。
本アプリの特徴として、「アルゴリズムに特化」した内容になっておりまして、プログラミングの思考をする上で重要な部分になります。

言語に関しては自分自身の使用できる言語で問題ありませんが、使用できる言語については、限られているのでご注意してください。

![スクリーンショット 2024-01-11 0.03.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538926/3bec6ae3-cc0a-55d8-0953-97d45edc53c4.png)
(paizaより引用)

また、paizaを学習することでpaiza転職で利用できるということです。
こちらは、自分自身のスキルを可視化することで、転職時にジャッジできるようになります。
自分自身の市場の価値観を知る目的でもぜひ活用してもみましょう。詳細は下記になります。

https://paiza.jp/guide/career

### 【頻出使用方法】
---
ここからpaizaで使用する頻出のものをご紹介いたします。

### 【入力値を抽出する方法】
・値を1件抽出する方法
```ruby:test.rb

num = gets.chomp.to_i
puts num

# % ruby test.rb 
#=> 1 入力値
#=> 1 出力値
```
・1回で複数件の値を抽出する方法
```ruby:test.rb
array = gets.chomp.split.map(&:to_i)
puts array

# % ruby test.rb

#=> 入力値 1 2 3 4 5 6 7 8 9
#=> 出力値1
#=> 出力値2
#=> 出力値3
#=> 出力値4
#=> 出力値5
#=> 出力値6
#=> 出力値7
#=> 出力値8
#=> 出力値9
```
2回で複数件の値を抽出する方法
```ruby:test.rb
num = gets.chomp.to_i
array = []

num.times do |i|
    array << gets.chomp.split.map(&:to_i)
end

puts array

# % ruby test.rb

#=> 入力5(一回目の入力)
=======================================
#=> 入力0(二回目の入力1)
#=> 入力1(二回目の入力2)
#=> 入力2(二回目の入力3)
#=> 入力3(二回目の入力4)
#=> 入力4(二回目の入力5)
=======================================
#=> 出力0
#=> 出力1
#=> 出力2
#=> 出力3
#=> 出力4
```

### 【順番に配列を設定する方法】
```ruby:test.rb
word = ('a'..'z').to_a + ('A'..'Z').to_a

puts word.join(',')

# % ruby test.rb

#=> 出力結果 a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
```

### 【2次配列の操作(9*9表)】

```ruby:test.rb 
x = 9
y = 9
result = []

y.times do |i|
    row = []
    x.times do |j|
        row << (i + 1) * (j + 1)
    end
    result << row.join(' ')
end

puts result

# % ruby test.rb

#1 2 3 4 5 6 7 8 9
#2 4 6 8 10 12 14 16 18
#3 6 9 12 15 18 21 24 27
#4 8 12 16 20 24 28 32 36
#5 10 15 20 25 30 35 40 45
#6 12 18 24 30 36 42 48 54
#7 14 21 28 35 42 49 56 63
#8 16 24 32 40 48 56 64 72
#9 18 27 36 45 54 63 72 81
```

### 【おわりに】
---
いかがでしょうか？
ここまでアルゴリズムの内容をご紹介いたしました。
言語としてRubyにはなるのですが、他のオブジェクト指向言語にも横展開できるかと思います。
アルゴリズムの考え方は、基本情報や応用情報でも活かせる技術になりますので、ぜひたくさん触れてみてください。

### 【引用】
---
https://paiza.jp/guide/career