OmniAICreator/Qiita-1.07M huggingface dataset:
Rails6のcredentials.yml.encはどう利用どうするべきか

### はじめに
この記事は下書きにあった古いものを見つけました。そのままにしておくのももったいないと思い公開します。
記事の正確性についてはかなり不透明です。

# まとめ
## Rails6
### multi environment credentialsを使う
`RAILS_ENV` =環境名
- 機密情報は`config/credentials/環境名.yml.enc`に記述
- 機密情報のキーは`config/credentials/環境名.key`に配置
    - 編集するときは`rails credentials:edit --environment 環境名`
- `RAILS_MASTER_KEY`を使う際は環境にあったキーを設定
- `config/credentials.yml.enc`は `RAILS_ENV`**が指定されていないときに参照**

## Rails5.2
### credentials.yml.encを使う
- 機密情報は`config/credentials.yml.enc`を参照
- `RAILS_MASTER_KEY`を使う際は`config/master.key`を設定
    - 編集するときは`bin/rails credentials:edit`

# はじめに
credentials.yml.encでgoogle検索をかけると様々な記事が出てくる。
また、Railsの学習でも当然credentials.yml.encが出てくるのだが、バージョンによって情報が混在していてよくわからなった。

サイトによっては「credentials.yml.encと環境.yml.encを内容によって使い分ける」（≒どっちにも情報を入れる？）と書いてあったりしてよくわからなかった。
自分で調べた上での理解のため、もし間違っている部分があればお知らせください…

# credentials.yml（環境名.yml）って何よ？
railsで使う機密情報を入れておくファイルです。
例えばAPIKEYやDBの接続情報などの機微な情報を格納しておきます。
railsで使いたい際は
```
Rails.application.credentials.aws[:access_key]
```
のように読み出します。

※注: `Rails.application.secrets`で取得できると記載がある場合がありますが、これはRails5.1までの話であり、このときまでは`credentials.yml`ではなく`secrets.yml`でした。

# どこにあるの？
`credentials.yml`は`config/credentials.yml.enc`、
`環境名.yml`は`config/credentials/環境名.yml.enc`にあります。

# どうやって作るの？
```credentials.yml.enc
rails credentials:edit
```

```環境名.yml.enc
rails credentials:edit --enviroment 環境名
```


# 参考文献
@tearoom6 さんの素晴らしい記事
[Rails 秘密情報管理機能の変遷](https://qiita.com/tearoom6/items/4b028ecd13e057ec5d90)
[Rails 6 adds support for multi environment credentials](https://blog.saeloun.com/2019/10/10/rails-6-adds-support-for-multi-environment-credentials.html)
[Rails 6よりサポートされたMulti Environment Credentialsをプロジェクトに導入する](https://zenn.dev/banrih/articles/f22f0a70bbead2a02110)
Windows ServerのCドライブが100%だったけどそんな訳ないやろ

結論を先に言ってしまうと、WinSxS Folderが肥大化してしまっていたらしい。

>Windowsの「C:\Windows\WinSxS」ディレクトリは「コンポーネントストア」とも呼ばれ、Windowsのサービシング（Servicing、Windowsの機能や更新プログラムのインストール／アンインストールなど）に関係するファイルの格納場所となっています。

引用
https://atmarkit.itmedia.co.jp/ait/articles/2205/25/news007.html#:~:text=Windows%E3%81%AE%E3%80%8CC%3A%5CWindows%5CWinSxS%E3%80%8D%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AF%E3%80%8C,%E5%A0%B4%E6%89%80%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

なので、WinSxSのサイズを圧縮してあげれば良いようです。

<pre>
Log file in here C:\Windows\Logs\DISM\

dism /online /cleanup-image /ScanHealth

DISM /Online /Cleanup-Image /RestoreHealth /source:WIM:E:\path-to-the-WIM\Install.wim:1 /LimitAccess
(download ISO of OS and mount it to access install.wim or copy install.wim to somewhere and use the path to it in above command)
NOTE: the :1 refers to the OS folder inside (e.g. Server 2016 Standard is :1 and Datacebter maybe like :3). check with this command to find/conform which one: 
dism /Get-WimInfo /WimFile:H:\sources\install.wim

dism /online /cleanup-image /startcomponentcleanup
and maybe you want do:
Dism /online /Cleanup-Image /StartComponentCleanup /ResetBase
( removes all superseded versions of every component in the component store)
</pre>

参考
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/clean-up-the-winsxs-folder?view=windows-11
cscの作法 その360

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
sqliteでlistviewに流し込め。
datatable使え。

# サンプルコード

```

using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;

namespace App
{
	public partial class Form1: Form {
		private Label label;
		private ListView lsv;
		public Form1() {
			Text = "listview test";
			ClientSize = new Size(310, 300);
			label = new Label();
			label.Text = "koko";
			label.Font = new Font("Geneva", 12, FontStyle.Regular);
			label.Height = 20;
			label.Width = 190;
			label.Left = 50;
			label.Top = 10;
			this.Controls.Add(label);
			lsv = new ListView();
			lsv.Location = new Point(0, 40);
			lsv.Size = new System.Drawing.Size(300, 200);
			lsv.View = View.Details;
			lsv.FullRowSelect = true;
			lsv.GridLines = true;
			lsv.Columns.Add("id", 70, HorizontalAlignment.Right);
			lsv.Columns.Add("name", 100, HorizontalAlignment.Left);
			lsv.Columns.Add("number", 50, HorizontalAlignment.Right);
			lsv.Columns.Add("price", 50, HorizontalAlignment.Right);
			lsv.CheckBoxes = true;
			lsv.ItemChecked += new ItemCheckedEventHandler(lsv_ItemChecked);
			lsv.ColumnClick += new ColumnClickEventHandler(lsv_ColumnClick);
			Controls.Add(lsv);
			SQLiteConnectionStringBuilder ConnectionStr = new SQLiteConnectionStringBuilder();
			ConnectionStr.DataSource = "db0.sqlite";
			using (SQLiteConnection Connection = new SQLiteConnection(ConnectionStr.ToString()))
			{
				Connection.Open();
				using(SQLiteCommand Command = new SQLiteCommand(Connection))
				{
					Command.CommandText = "SELECT * FROM fruit ORDER BY id ASC";
					SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(Command);
					DataTable dt = new DataTable();
					dataAdapter.Fill(dt);
					for (int i = 0; i < dt.Rows.Count; i++)
					{
						DataRow dr = dt.Rows[i];
						ListViewItem listitem = new ListViewItem(dr["id"].ToString());
						listitem.SubItems.Add(dr["name"].ToString());
						listitem.SubItems.Add(dr["number"].ToString());
						listitem.SubItems.Add(dr["price"].ToString());
						lsv.Items.Add(listitem);
					}
				}
			}
		}
		void lsv_ItemChecked(object sender, ItemCheckedEventArgs e) {
			ListView.CheckedListViewItemCollection checkedItems = lsv.CheckedItems;
			foreach (ListViewItem item in checkedItems)
			{
				Console.WriteLine("Checked Item: " + item.Text);
			}
		}
		void lsv_ColumnClick(object sender, ColumnClickEventArgs e) {
			Console.WriteLine(e.Column);
			foreach (ListViewItem item in lsv.CheckedItems)
			{
				Console.WriteLine(item.SubItems[1].Text + "\r\n");
			}
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```


以上。
buttonからsubmitを飛ばせなかった話

type="submit"だったのをbuttonに変更し、JavaScriptからsubmit()で飛ばそうと思ったらエラーが表示され画面遷移されない状況に陥りました。

formのnameや遷移先などチェックしたけど分からずなんだこれ状態でしたが、調べているうちにとある記事を見かけました。

ここに記載されていました。

https://www.mitsue.co.jp/knowledge/blog/frontend/201412/04_1400.html
めんどくさがらずきちんとvalueの設定しろってことですね。

INPUT要素の場合は、type, name, valueはマストでやっておいたほうが無難な気がします。
paiza.ioでelixir その236

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
hanoiモジュールをセーブして、ロードして実行せよ。

# サンプルコード

```

File.write "H.exs", """
defmodule H do
    def hanoi(0, _, _) do
    end
    def hanoi(n, a, b) do
        hanoi n - 1, a, 6 - a - b
        IO.puts "円盤\#{n}を \#{a} -> \#{b}"
        hanoi n - 1, 6 - a - b, b
    end
end
"""
|> IO.inspect

File.ls!
|> IO.inspect

{:ok, code} = File.read("H.exs")
Code.eval_string(code)

H.hanoi 3, 1, 2
|> IO.inspect




```

# 実行結果

```
"defmodule H do\n    def hanoi(0, _, _) do\n    end\n    def hanoi(n, a, b) do\n        hanoi n - 1, a, 6 - a - b\n        IO.puts \"円盤\#{n}を \#{a} -> \#{b}\"\n        hanoi n - 1, 6 - a - b, b\n    end\nend\n"
["main.tar.gz", "Main.exs", "runner_mysql", "exec_stdin.txt", "run_user",
 "runner_php", "exec_stderr.txt", "H.exs", "exec_command", "exec_stdout.txt"]
2
円盤1を 1 -> 2
円盤2を 1 -> 3
円盤1を 2 -> 3
円盤3を 1 -> 2
円盤1を 3 -> 1
円盤2を 3 -> 2
円盤1を 1 -> 2
```

# 成果物

https://paiza.io/projects/_Ro6cmUksTvLGM7wokEVEw


以上。
一連の行動


+ [outlook連携している行動のフローについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfA9O)

:::note alert
まだ開始されていない行動からこの定期的な行動を編集してください
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/39780311-979c-6a74-1cca-ca4251d1c607.png)


一連の行動
繰り返される行動の名前と動作は、作成場所によって異なります。Lightning Experience と Salesforce モバイルアプリケーションでは、一連の行動と呼ばれます。Salesforce Classic では、定期的な行動と呼ばれます。ベストプラクティスとして、繰り返される行動は、その行動を作成したインターフェースで編集します。

Lightning Experience で一連の行動を使用するときは次の点に留意してください。 

+ 一連の行動を過去の行動から編集することはできません。

https://help.salesforce.com/s/articleView?id=sf.creating_events_lex.htm&type=5

上記が影響していると思われる。

ということで、直接更新しない方法を考えます。

もし、もう一つカスタムコンポーネントを作っても問題がなければ、以下の方法が使えるかもしれません。（更新する項目を行動からカスタムオブジェクトにすることで開始日の影響を受けないようにします）

現状では行動に対して２つの項目の更新を行っていると思いますが、これをカスタムオブジェクトに移行します。

これらの項目を更新する場合で初めての１個目の項目の場合はクイックアクションで行動Idをデフォルトにしてカスタムオブジェクトを作成します。

２つ目の項目を更新する場合はカスタムオブジェクトの２つ目の項目を更新します。
また、現在フローでチェックボックスを更新している項目は数式項目にします。

行動オブジェクトに以下の数式を追加します。

```
AND(
NOT(ISBLANK(カスタムオブジェクト__r.1つ目の項目)),
NOT(ISBLANK(カスタムオブジェクト__r.2つ目の項目))
)
```
bootstrapだけでdiv要素全体にリンクをつける

# 結論
`position-relative`をclassに設定したdiv要素の内部に、`stretched-link`をclassに設定したa要素を入れればいいです。また、`position：relative`をcssにすでに持っている`card`などをdiv要素のclassに設定した場合、`position-relative`は不要です。

# 前提
bootstrapのバージョン: 4.4.1

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

以上です。

# 参考
https://getbootstrap.jp/docs/4.3/utilities/stretched-link/
「YOUTRUST x ゆめみ Flutter LT会@渋谷」のアンケート結果を公開します

## はじめに
先日開催した「YOUTRUST x ゆめみ Flutter LT会@渋谷」で行ったアンケート結果を公開します🚀
今後Flutterの勉強会の開催や登壇を考えている人の参考になれば嬉しいです。

https://yumemi.connpass.com/event/284933/

## アンケート結果
アンケート項目ごとに結果を紹介していきます。
アンケートの回答数は9件と、そこまで多くないことを先に断っておきます🙏

### 1. よろしければ具体的な応募のきっかけ(誰のTweetなど)を教えてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/9b26e82d-574e-f008-4d86-838a9c1204ce.png)

connpass公開後の宣伝を朝日さんのツイートで行ったので、Twitter関連がほとんどでした😎
3時間で枠が埋まったので、YOUTRUSTかゆめみのメンバーをフォローしていないと参加できないイベントでした。

https://twitter.com/daiki1003/status/1661574408006430721?s=20

### 2. 今回の勉強会で良かったこと、悪かったことがあれば教えてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/18a08e2d-2ddd-a404-3e7a-3d03116d0e67.png)

オフラインイベント良かったって意見と、テンポが良かったって意見が多めでした。
ちなみに5分LTx8枠でした。

### 3. 今後も同様のイベントを開催する場合どちらの枠で参加したいですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/a37d81dd-0405-5836-523e-752ec40d7cb7.png)

発表枠の希望者が思ったより多かったです。
LT8枠中3枠しか一般枠が無かったのは少なかったみたいです。

### 4. 聞いてみたい発表はありますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/663b6ef9-9bdd-4293-f549-e7d2efef0b2e.png)

今後登壇したい人は参考になるかも？

### 5. 他の地域で同様のイベントがあったら、どの地域が良いですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/51abeda3-d7ff-22b4-6ca8-d3c4a7b4ccda.png)

渋谷で行ったのでなんだかんだ関東が多いですね。大阪希望もありました。
当日は岡山や北海道からの参加者もいました！

### 6. イベント時間帯はいつが良いですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/f4ff3223-2b70-68c4-90a6-5126307a9153.png)

平日夜が圧倒的でした

### 7. どちらを重要視しましたか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/6e777b09-0fa0-10d8-38ce-ef974bb8aad2.png)

懇親会大事ですね🍻


## まとめ
Flutter LT会のアンケート結果紹介でした！

### おまけ

どんなイベントだったかは以下のnoteが参考になるかも

https://note.com/k9i/n/n25ffcc82e23e

https://note.com/iseryu/n/na1f375cae823
配列を利用したrubyプログラムを作る練習

任意の数字が配列の中の何番目に格納されているかを確認できるプログラムを作成したい。

memory = [2, 4 ,6 ,　8,　12, 14, 16, 18, 20, 40, 60, 80, ８８, ８８８, ８８８８８８８８]

上のmemoryの配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドを、
each_with_indexを用いて作ろう♪（each_with_indexメソッドは、標準で組み込まれているメソッドの1つ。要素の繰り返し処理と同時に、その要素が何番目に処理されたのかも表すことができる。）

下のsearchメソッドとeach_with_indexメソッドの例を参考に作成しよう。
```ruby
def search(num, output)
  # 処理を記述
end

output = [1, 5, 10 ,15, 20, 21, 29, 35, 42, 51, 62, 78, 81, 90, 92, 100]
# 呼び出し例
search(5, output) #２番目にあります

```

each_with_indexメソッドの使い方
```ruby
配列名.each_with_index  do |item, i|

end
```
each_with_indexの具体例。
```ruby
domestic_cars= ["HONDA","LEXUS","TOYOTA","MATSUDA","SUZUKI"]

domestic_cars.each_with_index do |car, n|
 puts "#あなたが{n}番目に大好きな車は、#{car}です。"
end
```
これを実行すると
```ruby
あなたが0番目に大好きな車は、HONDAです。
あなたが1番目に大好きな車は、LEXUSです。
あなたが2番目に大好きな車は、TOYOTAです。
```
と出力される。


では上のSEACHメソッドとeach_with_indexの例を参考に、
```
memory = [2, 4 ,6 ,　8,　12, 14, 16, 18, 20, 40, 60, 80, ８８, ８８８, ８８８８８８８８]
```
memoryの任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドをeach_with_indexメソッドを用いて作ってみよう。

```ruby
def search(correct_num, memory)

 memory.each_with_index do |num, index|
    if num == correct_num
      puts "#{index + 1}番目にありました！！！"
      return
    end
  end
  puts "その数は含まれておりませんでした。"
end

memory = [2, 4 ,6 ,　8,　12, 14, 16, 18, 20, 40, 60, 80, ８８, ８８８, ８８８８８８８８]

search(703, memory)

```
こうなる。


今回は　memoryの配列に703が含まれてないので、
実行すると、その数は含まれておりませんでした。
と出力される。

まず、memory.each_with_indexでは、memoryに格納されている要素を1つひとつnumとして取り出すと同時に、要素毎に割り当てられている添字をindexとして取得する。

次に、次に、if文でnum == correct_numという条件式を設定する。
ここでは、memoryから取り出された要素numと、correct_numが等しいかを判別してる。

そして、numとcorrect_numが等しければ、numがmemoryの中の何番目に含まれているかが出力される。
第二世代管理パッケージ作成で困ったこと。（１）

第二世代管理パッケージだと、どうやらアップグレードできないコンポネントがだくさんあるようです。
ちゃんと調べずにやってしまうと痛い目に会います。

下記のURLを参考にサポートしているコンポネントの中に
「パッケージのアップグレード時にコンポーネントが更新される」項目を
入念にチェックし問題ないかしっかり確認してください。

### 管理パッケージで使用可能なコンポーネント:

https://developer.salesforce.com/docs/atlas.ja-jp.242.0.sfdx_dev.meta/sfdx_dev/packaging_packageable_components.htm

### Metadata Coverage Report

https://developer.salesforce.com/docs/metadata-coverage

私が気になったのは、レポート、ダッシュボード、フォルダ、リストビューなどの常用のコンポネントが
「パッケージのアップグレード時にコンポーネントが更新される：いいえ」
になっていました。
vue.js3で外部ファイルに切り出したメソッドにrefな値を引数として使いたい

Vue.js3でコードを書くとき、scriptタグ内にメソッド書きます。
同一ファイル（SFC）で定義した関数で呼び出すときは良いのですが、このメソッドを別のファイルから定義して呼び出したくなりましたが、refの扱いについてはまってしまったので、記事として残します。

Vue.js3を用いて、Composition APIで記述しています。
検証用に、以下のようなコードを書きました。

index.ts
```
<script setup lang="ts">
import { Ref, ref } from 'vue';
import { increment2 } from './increment';
const count = ref(0);
const increment1 = () => {
  count.value++;
}
</script>

<template>
  <main>
      <p>カウント値</p>
      <p>{{ count }}</p>
      <button @click="increment1()">メソッド1</button>
      <button @click="increment2(count)">メソッド2</button>
  </main>
</template>
```
increment.ts
```
export const increment2 = (count: number) => {
  count++;
}
```
この時、メソッド1ではカウントが増えますが、メソッド2ではカウントが増えません。increment2メソッドの引数には、refの値を渡しているのになぜ？

答えのヒントは、下記にありました。
```
<p>{{count}}</p>
```
templateタグ内では、refは自動的にアンラップされるのですね。画面に表示する意図ではなく、メソッドの引数として渡す場合でもです。
なので今回の場合、
```
@click="increment2(count)"
```
は、下記と等しくなっていました。
```
@click="increment2(count.value)"
```
increment2で加算されたcountの値は、リアクティブでないので、画面に反映されません。カウントにrefを渡すためには、scriptタグ内で値を渡すしかありません。
下記のように修正します。
```
import { increment2 } from "./increment.js";

const increment3 = () => {
  increment2(count);
};
```
```
<button @click="increment3">メソッド3</button>
```
少々面倒ですが、外部ファイルに切り出したメソッドで、値を更新できるようになりました。
Cognos Analytics レポートでのリストへのハイパーリンク埋め込み

# 概要
ハイパーリンクをリストの中に埋め込む方法です。選択すると各WEBサイトに遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/68bed830-5854-6846-3a25-1a4ba6ae513d.png)

# 実装手順
以下のデータを例にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/9b544c55-db77-5a70-cf5d-4ec32e9f5526.png)

テーブルをFramework Manager等に取り込みパッケージ発行し、レポートのリストに「WEBNAME」を配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/21d418ef-0ec6-cd19-121c-a8c0948e2bbb.png)

ハイパーリンクをリストに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/fc4bc9a3-4d05-3dba-4b9c-69796ed31fc5.png)

リストのクエリーに「URL」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/78852513-bd61-8a48-a36b-b073e1f8096f.png)

ハイパーリンクのリスト列の本体のプロパティで「テキスト・ソース」と「URLソース」を以下のように指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f178355a-6325-f9b7-55af-4e894a5a21e7.png)

レポートを実行。ハイパーリングの「IBM」をクリックすると。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/9db44f63-b617-ad2e-1832-e733706980d4.png)

IBMのサイトに遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/7b0ee340-4a9f-20f5-1c97-3f7e14c52c18.png)
2.GBDKでプログラム作成

**2.プログラム作成**
やっと本題のプログラム作成をしていこう！


・目次
1.プロジェクトの場所決め
2.プログラム作成
3.コンパイル
　P1.compile.batを加工する
<r>
4.動作確認
<r>
<r>
<r>


**1.プロジェクトの場所決め**
examplesフォルダ内のcompile.batがあればどこでもいいので以下フォルダ構成と
ファイルをコピーして新規プロジェクト用フォルダを作成する

◇コピー元
C:\gbdk\examples\gb\template_subfolders
└compile.bat
└res
└src

◇コピー先（新規作成）
C:\gbdk\ <font color="Red">01_Project</font>\gb\template_subfolders
└compile.bat
└res
└src
　└main.c
<r>
<r>
<r>

**2.プログラム作成**
作業場所が決まったのでプログラムを作っていこう！

"main.c"を以下内容に書き換える
まずはお馴染み"HELLO WORLD"から
C:\gbdk\01_Project\gb\template_subfolders\src\main.c

```main.c
#include <stdio.h> //ライブラリ参照

void main(void)
{
	printf("HELLO WORLD");
}
```
◇解説
>#include <stdio.h> //ライブラリ参照
　→printf()関数を使用するため、printf()関数が記載（定義）
　されている"stdio.h"ヘッダーファイルをコピペして！という意味。

>void main(void)
→戻り値がvoid型の "main"という名の関数で、
　引数（ひきすう）がvoid型という意味。
　main関数はプログラムの中で一番最初に動くところ。
　void型の戻り値は戻り値がないことを表す。（つまり最上位のプログラム）
　void型の引数は引数がないことを表す。
　（つまり何もデータを必要としない最上位のプログラム）

>{
→main関数内を表す始まりかっこ。

>	printf("HELLO WORLD");
→printf()関数を使用して、""で囲った文字を出力して！という意味。

>}
→main関数内を表す終わりかっこ。


<r>
<r>
<r>
<r>

**3.コンパイル**
プログラムができたのでコンパイルしてみる
C:\gbdk\01_Project\gb\template_subfolders\compile.bat
<r>
<r>
<r>
**P1.compile.batを加工する**
　ポイントその1
　mac等ではコマンドを実行することによって"Makefile"を読み込み、
　自動的にcompile.batを再生成してくれるみたいだが、Windowsはできないようなので
　手動で書き換える。（調べればできるようになる？）

```compile.bat
REM Automatically generated from Makefile
mkdir -p obj
..\..\..\bin\lcc   -c -o obj\main.o src\main.c
REM ..\..\..\bin\lcc   -c -o obj\dungeon_map.o res\dungeon_map.c
REM ..\..\..\bin\lcc   -c -o obj\dungeon_tiles.o res\dungeon_tiles.c
..\..\..\bin\lcc   -o obj\Example.gb obj\main.o REM obj\dungeon_map.o obj\dungeon_tiles.o
pause
```
◇解説
4行目・・・REMに変更　dungeon_map.cはサンプルプログラムのため
5行目・・・REMに変更　dungeon_tiles.cはサンプルプログラムのため
6行目・・・後方をREM　obj\dungeon_map.o　と obj\dungeon_tiles.oはサンプルプログラムのため
7行目・・・pause追加（エラー発生時の確認用）

最終的に必要なのは以下のみ
2行目・・・mkdir -p obj
　→"-p"と"obj"というフォルダを作る　（初回作成後はREMでいい）

3行目・・・..\..\..\bin\lcc   -c -o obj\main.o src\main.c
　→main.cをmain.oにコンパイルし、"obj"フォルダに格納

6行目・・・..\..\..\bin\lcc   -o obj\Example.gb obj\main.o
　→main.oをExample.gbにまとめ、"obj"フォルダに格納

書き換えが完了したらcompile.batを実行する
正常に動けば以下に"Example.gb"ができているはず。
C:\gbdk\01_Project\gb\template_subfolders\obj
<r>
<r>
<r>
**4.動作確認**
visualboyadvanceで動かしてみる
visualboyadvanceの導入方法は他の方の記事を参考にしてみてください。

↓Example.gbを読み込ませた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/e8d42a88-d699-ff6b-e6a5-285f25fee1e4.png)


以上！
次回はすこし凝ったプログラムをしてみよう！！
WebAPI基本まとめ

# HTTP
### リクエスト
３要素で構成されている。
1. リクエストライン：先頭部分
    - メソッド
        - **GET: 安全**
        - **POST: 安全でも冪等でもない**
        - **PUT: 冪等**
        - **DELETE: 冪等** など
            - 安全: 読み取り専用で、データを破壊する可能性が０
            - 冪等: 処理が影響するのは1回目だけで、２回以上繰り返してもデータが変わらない
    - **URI**
    - HTTPのバージョン
2. ヘッダー
    - **HOST URL: どのホストからリクエストしたか**
    - **User-Agent: 何のアプリでリクエストしたか**
    - Content0Type: 送信データのフォーマット
    - **Referer: どのURLからリクエストしたか。** referrerのスペルミスであると公式が認めている...笑
    - **Cookie: 超重要だが、今回は割愛**
3. ボディ
    - クエリパラメータなど

### レスポンス
こちらも３要素で構成されている。
1. ステータスライン：先頭部分
    - ステータスコード
        - 1xx: リクエストが受け入れられた
        - **2xx: リクエストが受け入れられ、正常に処理された**
        - **3xx: リクエスト完了のために、リダイレクトなどの追加処理が必要**
        - **4xx: クライアントエラー（リクエストする前の段階で失敗している）**
            - このエラーが起きたら？
                - まずは、WebAPIの設計が間違っていないか確認しましょう。
                - JavaScript, TypeScriptなど、フロントエンドのコードを見直しましょう。
        - **5xx: サーバーエラー（リクエストが受理されてから、レスポンスを返すまでの段階で失敗している）**
            - このエラーが起きたら？
                    - リクエストは受理されているので、WebAPIの設計を確認する必要はありません。
                    - PHP, Pythonなど、サーバーサイドのコードを見直しましょう。
    - **URI**
    - HTTPのバージョン
2. ヘッダー
    - Content-Type: html, css, imgなど
    - Date
    - Server
    - Content-Length など
    - あまり重要なものはない
3. ボディ
    - **返却されたデータの本体。1番重要で、このデータを使ってフロントエンド側の処理を記述する。**

※現在、加筆中です。
【初心者】要件定義のプロセスまとめ

# 前提①：システム開発の登場人物
|    立ち位置    |   役職      |     役割                 |
|:----------:|:---------------:|:------------------------:|
| ビジネスサイド | エンドユーザー        | 実際にサービスを利用する人々      |
| **ビジネスサイド** | **PM**          | **ユーザーの要望を整理し、企画した上で、要件定義をする**           |
| **開発サイド**     | **SE** | **PMと協力してシステムの設計を行う。<br>また、プログラマーへのタスク分担を行う** |
| 開発サイド     | プログラマー   | 設計書に沿ってシステムを実装する |

**☆PMとSEの打ち合わせをどのように進めるか？のイロハを解説していきます。**

# 前提②:システム開発で起こりがちな失敗例
### そもそも要件定義から、PMがSEに丸投げしてしまう
- システムが完成し始めた段階で問題が発覚するため、取り返しのつかない状態になりがち。
### 要望をすべて記載してしまう
- ユーザーの中でも矛盾は必ず発生してしまう。
- たとえば、業務効率化システムでは、経営者と現場で働く人の見え方は異なる。
- 要望をすべて記載することはせず、競合したものについては優先順位をつける姿勢が大切
### 「良いシステム」の定義が、立場によって違う
- ビジネスサイドは、「ユーザーが使いやすい」のが良いシステム
- 開発サイドは、「バグが発生しにくい」のが良いシステム
### 途中の仕様変更に対する見積もりが、ビジネスサイドで甘くなりがち
- 「ハンバーガーのピクルスを抜きにしてほしい」　程度ならば、後からでも変えられるが、「えびカツバーガー」に変えてほしい は不可能。そのレベルの変更要望が、開発では頻発する。
- 基本設計を作成した段階が、要件定義書のヌケモレを入念にチェックする最高のタイミング
### その他
- プログラマーが、自己都合で機能を変更してしまう
    - 工数を減らすため
    - 興味本位で、使用したいライブラリを使用する
- 「システムは万能」という思い込み
- システム開発自体が目的になっている
    - DXなど、流行をもとに意思決定してしまっている
- このあたりの失敗例は、全員で共有しておくとよい
- **「品質」には、国際的な定義があるので覚えておくとよい　→ [ISO25010](https://xtech.nikkei.com/atcl/nxt/mag/sys/18/092700043/092700001/)**

# 上流工程（要件定義・基本設計）はなぜ必要か？
### 結論： 登場人物４者が、システムについて共通認識をもつこと
- 解決したい課題
- 必要な機能
- いつ、誰が、何のために利用するか？

### ゴール
- PM: **要件定義書**を細かく記載し、開発サイドに**欲しいシステムの内容**をわかりやすく伝える
- SE: **基本設計書**を細かく記載し、ビジネスサイドに**作るシステムの内容**をわかりやすく伝える

# 要件定義で必要なもの
- 要件定義書
    - 課題・背景
    - ゴール（いつまでに、どうしたいか）
- 機能一覧表
    - Excelなどで作成
- 業務フロー
    - PowerPointなど

# 要件定義のプロセス
### 1. 要望（PM）
**ポイント：**
**① 実は、技術的な問題よりも、ビジネス的な課題の方が多いことを知る**
**② 要望は、希望度の高いものだけ記載する**
- 事業の概要
- 業務プロセス（アクティビティ図などにまとめる）
- 現状の問題点
- 目指すゴール
- 解決すべき課題
- ヒアリング（システムに何を求めるか）

### 2. 要求（PM）
**ポイント：ゴールを達成できる要求になっているか？よく確認する**
- 達成すべきゴールを数値で明確化
- クリアすべき課題
- ゴールの達成条件を SMART に沿って整理
    - Specific（ゴールが具体的か？）
    - Measurable（進捗を数値で測れるか？）
    - Achievable（達成可能か？）
    - Relevant（当初の困りごとが解決するか？）
    - Time-bound（期限が明確か？）
- 再度、未来の業務プロセスのイメージを作成（アクティビティ図）
- Excelなどで、機能一覧表を作成

### 3. 検討（SE）
- 要求項目１つ１つに対し、返答する
    - OKならばよいが、難しい場合も、単に「できない」ではなく、予算がどの程度かかり難しいなど補足する
    - 何らかの代案を提案する
        - より実現しやすい、似たような機能
        - バージョン2で実装する
        - 要求項目は相互に順序づけがあるため、「項目◯◯の後で再検討する」などの提案
- バッファを含めた予算、期間を設定する

### 4. 提案（SE）
**ポイント**
**ビジネスサイドは、変更が簡単であると思い込んでいることがあるため、変更にかかる金額を念押しして伝える**
**とはいえ、最初に全て決めるのはそもそも難しいため、その気持ちを汲みとり、バッファの提案や、アジャイル開発に生かす**
- 検討した内容を提案する
    - 実装する機能
    - 実装しない機能←きちんと明記することで、トラブルを抑制できる
        -　やらないことによるユーザーへの影響を言語化しておく
- 企業からのフィードバックを受けて、ブラッシュアップする
- 認識のズレを防ぐコツは？
    - 言語化されていない、潜在的な要求を見越したスケジュール提案をする
    - 画面遷移図ワイヤー完成を確定タイミングとする
    - 機能をバージョンごとに分ける（アジャイルの意識）
- この段階で、画面遷移図はある程度作ってしまってもよい

### 5. 要件定義（PM・SE）
**ポイント**
**ビジネスサイドは、変更が簡単であると思い込んでいることがあるため、変更にかかる金額を念押しして伝える**
**とはいえ、最初に全て決めるのはそもそも難しいため、その気持ちを汲みとり、バッファの提案や、アジャイル開発に生かす**
- 明記する事項
    - 実装する機能
    - 実装する順序
    - 実装しない機能
    - 最新の業務フロー（アクティビティ図）
- もう一度、ユーザーのニーズから逸脱していないか、よく吟味する

☆以後の内容は、現在加筆中です。
- 気をつけるべきこと
- 非機能要件について
- ウォーターフォールとアジャイルそれぞれにおける応用
AWS-SDKを利用してS3にファイルをアップロードする

備忘録としてAWS-SDKv3を利用したファイルアップロードとダウンロードURLの取得クラスのコードを載せておきます。

# ファイルアップロードクラス

```typescript:StorageFile.ts
import { PutObjectCommand,GetObjectCommand, S3Client } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
import setupEnv from '../tests/setupEnv'
import * as fs from 'fs'

const client = new S3Client({})

if(process.env.ENV === undefined){
  setupEnv()
}

export default class StorageFile {
  upload = async(fileName:string) => {
    let filePath = '/tmp/'
    if(process.env.ENV == 'unit_test'){
      filePath = './tests/tmp/'
    }
    const fileContent = fs.readFileSync(filePath+fileName);

    // Setting up S3 upload parameters
    const params = {
        Bucket: process.env.BUCKET_NAME,
        Key: 'public/'+fileName, // File name you want to save as in S3
        Body: fileContent
    }
    const command = new PutObjectCommand(params);

    // Uploading files to the bucket
    try {
      const response = await client.send(command);
      console.log(response);
    } catch (err) {
      console.error(err);
    }
  }
  getUrl = async(fileName:string) => {
    const params = {
        Bucket: process.env.BUCKET_NAME,
        Key: 'public/'+fileName
    }
    const command = new GetObjectCommand(params)
    const url = await getSignedUrl(client, command, { expiresIn: 3600 })
    return url
  }
}
```

# 処理の詳細内容
* StorageFile.upload(fileName)で/tmp/[fileName]のファイルをアップロードします
* jestでのテストを想定してprocess.env.ENV=='unit_test'の場合だけ参照するフォルダを変えています
* S3バケットの名前はprocess.env.BUCKET_NAMEから取得しています
* アップロード後はStorageFile.getUrl(fileName)で期限付きダウンロードURLを取得できます
* S3にアップロードしたファイルをブラウザで閲覧する場合はS3側で公開設定をすればOKです

# まとめ
SDKv2を使った情報はインターネット上で散見されるのですが、SDKv3はまだまだ普及していないようでAWSの公式ドキュメントやAPIドキュメントを参考にしながら作成していきました。
参考にしてください。

https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/index.html
[翻訳] LangChainのDatabricksインテグレーション

[Databricks — 🦜🔗 LangChain 0\.0\.199](https://python.langchain.com/en/latest/integrations/databricks.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# Databricks

[Databricks](https://www.databricks.com/jp)レイクハウスプラットフォームは、1つのプラットフォームでデータ、分析、AIを統合します。Databricksは様々な方法でLangChainのエコシステムを取り入れています:

1. SQLDatabaseチェーン向けDatabricksコネクター: `SQLDatabase.from_databricks()`は、LangChainを通じてDatabricksのデータをクエリーする容易な手段を提供します。
1. DatabricksマネージドMLflowとLangChainのインテグレーション: 数ステップでLangChainアプリケーションをトラッキング、サービングします。
1. LLMプロバイダーとしてのDatabricks: サービングエンドポイントやクラスタードライバーのプロキシーアプリを通じて、ファインチューニングしたLLMをDatabricksにデプロイします。
1. Databricks Dolly: 商用利用可能なDatabricksのオープンソースDollyはHugging Face Hub経由でも利用可能です。

# SQLDatabaseチェーン向けDatabricksコネクター

LangChainのSQLDatabaseラッパーを用いて[Databricksランタイム](https://docs.databricks.com/runtime/index.html)や[Databricks SQL](https://www.databricks.com/jp/product/databricks-sql)にアクセスできます。

# DatabricksマネージドMLflowとLangChainのインテグレーション

MLflowは、実験、再現性確保、デプロイメント、集中管理のモデルレジストリを含む、MLライフサイクルを管理するためのオープンソースプラットフォームです。MLflowとLangChainのインテグレーションの詳細についてはノートブック[MLflow Callback Handler](https://python.langchain.com/en/latest/integrations/mlflow_tracking.html)をご覧ください。

Databricksでは、エンタープライズセキュリティ機能、高可用性、エクスペリメントやラン管理、ノートブックバージョン管理のようなその他のDatabricksの機能とインテグレーションされたホスティングバージョンのフルマネージドのMLlfowを提供しています。DatabricksのMLflowは、インテグレーションされた実験トラッキング、機械学習モデルトレーニングの保護、機械学習プロジェクトの実行を提供します。詳細は[MLflow guide](https://docs.databricks.com/mlflow/index.html)をご覧ください。

DatabricksマネージドのMLflowは、DatabricksでのLangChainアプリケーションの開発をより容易なものにします。MLflowトラッキングにおいては、トラッキングURI設定する必要がありません。MLflowモデルサービングにおいては、MLflowのlangchainフレーバーでLangChaiのチェーンを保存することができ、MLflowモデルサービングでセキュアに管理される資格情報を用いて、Databricks上で数クリックでチェーンをサービングすることができます。

# LLMプロバイダーとしてのDatabricks

ノートブック[Wrap Databricks endpoints as LLMs](https://python.langchain.com/en/latest/modules/models/llms/integrations/databricks.html)では、LangChainのLLMとして、Databricksのエンドポイントをラッピングする方法を説明しています。2つのタイプのエンドポイントをサポートしてます: プロダクションと開発の両方で推奨されるエンドポイントと、インタラクティブな開発で推奨されるクラスタードライバーのプロキシーアプリです。

DatabricksエンドポイントはDollyをサポートしていますが、MPT-7BやHugging Faceエコシステムのようなモデルのホスティングにも適しています。また、Databricksエンドポイントは、企業のガバナンスレイヤーを提供するためにOpenAIのようなプロプライエタリモデルでも活用することができます。

# Databricks Dolly

DatabricksのDollyは、Databricks機械学習プラットフォームでトレーニングされた、商用利用がライセンスされた指示追従型の大規模言語モデルです。このモデルは`databricks/dolly-v2-12b`として、Hugging Face Hubで利用できます。LangChainとHugging Face Hubインテグレーションを通じてアクセスする手順に関しては、ノートブック[Hugging Face Hub](https://python.langchain.com/en/latest/modules/models/llms/integrations/huggingface_hub.html)をご覧下さい。
System.Text.Json で null 値のプロパティを無視する

[System.Text.Json](https://learn.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json/overview) で、null 値のプロパティはJSONに出力したくないという状況のときは、 ` [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]` を使うと良いということを知りました。

詳細は公式ドキュメントを参照ください。

https://learn.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json/ignore-properties?pivots=dotnet-7-0#ignore-individual-properties
QiitaでGA4を利用する方法

# 初めに
旧Google Analytics(UA)は2023年7月1日をもってサポートを終了する。
[ユニバーサル アナリティクスは廃止されます](https://support.google.com/analytics/answer/11583528)

GA4とQiitaの連携方法を記載している記事が少なかったため、記載します。

:::note warn
**注意**
今後は旧Google AnalyticsをUA,Google Analytics4をGA4と記述する
:::




# GA4のプロパティの作成
まず初めに、GA4で計測ができるようにプロパティを作成します。
下記手順に分かれて進めてください。
* 使用中のUAにGA4を導入する
* GA4を新規導入する

## 使用中のUAにGA4を導入する
[**[GA4] 設定アシスタントを使用して GA4 プロパティを設定する**](https://support.google.com/analytics/answer/10110290?hl=ja)を参考にしてください。




## GA4を新規導入する
1. [GA4の公式サイト](https://analytics.google.com/)にアクセスします。
2. 「測定を開始」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315779/230fd54d-a105-ae3c-426c-bea8e2daedec.png)

3.  アカウント名を入力し、「アカウントのデータ共有設定」を確認して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315779/5e4ce47e-3353-61de-4ce8-6b7729314b24.png)

4. 「プロパティの作成」・「お店やサービスの詳細」・「ビジネス目標」を任意に設定
5. 「データ収集」でプラットフォームを「ウェブ」にして、ウェブサイトのURLに「 https://qiita.com 」を入力。ストリーム名は任意に設定
6.  作成したプロパティにログインしたら、左下の「管理」→「データストリーム」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315779/9264de21-6138-c4a7-a4ec-3e20fe994e74.png)

7. 表示される作成したストリーム名の測定IDをQiitaの[**Googleアナリティクス設定**](https://qiita.com/settings/analytics)に貼り付け。

8.更新するをクリックします。
これでトラッキングIDの登録は完了です。

# 参考
* [QiitaでGoogleアナリティクスを利用する手順](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11)
* [[GA4] Google アナリティクス 4 に切り替える](https://support.google.com/analytics/answer/10759417)
【Flutter】急にiosで実機デバッグが出来なくなった時に試してほしいこと

ある時、急にiosで実機デバッグができなくなり、大変困ったので、解決内容記事にしたいと思います。
この方法で解決するとは限りませんが、一度試してほしいです。

# エラーの現象

VScodeでiPhoneを繋ぎ、デバッグを実行すると突然下記のようなエラーが出ました。
```
Could not build the precompiled application for the device.
════════════════════════════════════════════════════════════════════════════════
Building a deployable iOS app requires a selected Development Team with a 
Provisioning Profile. Please ensure that a Development Team is selected by:
  1- Open the Flutter project's Xcode target with
       open ios/Runner.xcworkspace
  2- Select the 'Runner' project in the navigator then the 'Runner' target
     in the project settings
  3- Make sure a 'Development Team' is selected under Signing & Capabilities > Team. 
     You may need to:
         - Log in with your Apple ID in Xcode first
         - Ensure you have a valid unique Bundle ID
         - Register your device with your Apple Developer Account
         - Let Xcode automatically provision a profile for your app
  4- Build or run your project again

For more information, please visit:
  https://flutter.dev/docs/get-started/install/macos#deploy-to-ios-devices

Or run on an iOS simulator without code signing
════════════════════════════════════════════════════════════════════════════════

Error launching application on iPhone11.
```

こういうエラーを調べると、プロビジョニングファイルを作ったり、XcodeでSingingしたりする手順を紹介している記事が出てきます。
上記はすでに対応済みで（今まで実機でデバッグできていたので当たり前と言えば当たり前）、Xcodeを見てもSiginingには問題はありません。


デバッグ開始後のログには以下のようなログになっている。
```
Launching lib/main.dart on iPhone11 in debug mode...
main.dart:1
Signing iOS app for device deployment using developer identity: "Apple Development: xxxxxx@example.com (xxxxxxx)"
Xcode build done.                                           33.5s
Failed to build iOS app
Error output from Xcode build:
```

# エラーの原因
こんなエラーに困っている方は一度iPhoneを接続したままで、XCodeを開いていみてください
そして、Product > destinationを選択してください
すると、こうなっている可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/a0c8c9a5-eb23-afac-da82-aaf39bbe6016.png)

# エラーの直し方
`Failed to prepare the device for development.`でググると、解決策がたくさん出てきます。

## 再起動
まず、手軽に試せる方法としては、iPhoneとPCの再起動です。
もし再起動でも直らなかったら次の手順を試してみてください
（私の場合、再起動では直りませんでした）

## iPhoneのOS、PCのOS、XCodeのバージョンを最新にする
面倒ですが、バージョンを更新してください。
ただし、全部やる必要はなさそうです。
私の場合は、XCodeを最新にするだけで直りました。
なので、まずXCodeを最新にして直らなかったら、iPhoneかmacのOSのバージョンを上げるのが良さそうです。

XCodeの更新は下記の記事のようにいくつか方法があります。

https://qiita.com/naginx/items/0d560c460235f1ab2282

個人的にはXCodesで管理するのが楽だと思うので、[導入の参考記事]（https://sunny10side.com/install-xcodes-to-manage-xcode-versions/）を貼っておきます。

Appleの開発者向けページからダウンロードする場合はSafariで実施した方がいいという記事だったか、ツイートだったかをみたことがありますので、Safariで実施した方が良さげです。

AppStoreからやるのはお勧めしません。
ページロード時のアニメーション、Perlin Noise で Flow Fields

## この記事の概要

ページロード時のアニメーションで何か格好良いものが作れないかなと模索していました。
そこまで凝らずに作れたので、備忘録を兼ねて記事にします。

## 完成品

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/18a17266-b049-5704-bc58-f89ac3314605.gif)

リロードする度に模様が変わっています。
有機的で複雑なラインを描いているので、通常の CSS アニメーションよりもリッチに見える気がします。

## この記事での環境

| 依存関係 | バージョン |
| --- | --- |
| p5 | 1.6.0 |
| typescript | 5.0.2 |
| vite | 4.3.9 |

## コードの全体像

```typescript
import p5 from "p5";

const sketch = (p: p5) => {
  let particles: p5.Vector[] = [];
  const numberOfPoints = 2000;
  const noiseScale = 0.01;

  p.setup = () => {
    p.createCanvas(p.windowWidth, p.windowHeight);
    for (let i = 0; i < numberOfPoints; i++) {
      particles.push(p.createVector(p.random(p.width), p.random(p.height)));
    }
    p.stroke(200);
  };

  p.draw = () => {
    p.background(255, 1);
    for (let i = 0; i < numberOfPoints; i++) {
      let particle = particles[i];
      p.point(particle.x, particle.y);
      let noise = p.noise(particle.x * noiseScale, particle.y * noiseScale);
      particle.x -= 5 * p.cos(noise * p.TAU);
      particle.y -= 5 * p.sin(noise * p.TAU);
    }
  };
};

const containerElement = document.getElementById("p5-container");

if (containerElement !== null) {
  new p5(sketch, containerElement);
} else {
  console.error("Element with ID 'p5-container' not found");
}
```

### インスタンスモード

p5.js はデフォルトではすべての関数がウィンドウオブジェクトにバインドされています。
今回は試しに作っているだけなので良いですが、制作物の規模が大きくなると辛くなると思います。

というわけでインスタンスモードを使用しています。

### setup

起動時に 1 度だけ呼び出されます。
キャンバスの作成と、それぞれのパーティクルの初期位置を指定しています。

### draw

`setup` の後に呼び出されて、その後はフレームを描画し続けます。

`background(255, 1)` では、白い背景を透明度 1% で描き続けることで、パーティクルが尾を引いているように見せています。

`noise` でランダム性を加えたあとに、 sin と cos で x 方向、　y 方向それぞれに揺らぎを与えながら移動させています。

## 最後に

リファレンスはこちらです。

https://www.youtube.com/watch?v=sZBfLgfsvSk

https://p5js.org/reference/#/p5/p5

---

最後まで読んでくださってありがとうございます！
[Twitter](https://twitter.com/xrxoxcxox)でも情報を発信しているので、良かったらフォローお願いします！

[Devトーク](https://jobs.qiita.com/employers/qiita-inc/dev_talks/489)でお話してくださる方も募集中です！
【Java】用語

# ０．はじめに
Javaを大学で学んでおります。
概念や特徴を以下の文類に分けてまとめました。

##### 関連学習
[【Java】用語](https://qiita.com/AkihideKato/items/13ba72a0c61eabc540c3)
[【Java】メソッド・型](https://qiita.com/AkihideKato/items/753ad55b10b29f184b0f)
[【Java】オブジェクト指向](https://qiita.com/AkihideKato/items/3eb988a962774a409f52)	
[【Java】インスタンス・コンストラクタ](https://qiita.com/AkihideKato/items/78fc47812f4eccad03cf)
[【Java】例外処理](https://qiita.com/AkihideKato/items/b0840610fc553c57cf1d)
[【Java】注意点・ルール](https://qiita.com/AkihideKato/items/63402744493932e9f87b)
[【Java】コードの記述向上にむけて（個人用memo）](https://qiita.com/AkihideKato/items/33fd1400be6be2e25f5a)

## コンパイル			
**ソースファイル``(.java)``をクラスファイル``(.class)``に変換する作業のこと**
バイトコード（2進数）を用いたコンピュータ自身が実行しやすいファイルに変換される	

## インタプリタ
実行するにあたってインタプリタというソフトウェアに対してバイトコード変換を求める		
インタプリタ内部には``JVM Java Virtual Machine``という仕組みがあり``classファイル``内コードを変換し読み解いている。環境構築は**コンパイルとインタプリタを実行するため**	のものだと考えればいい

```mermaid
stateDiagram-v2
 Javaファイル --> Classファイル: バイトコード変換(コンパイラ)
 Classファイル-->機械語: Javaプログラムの実行(インタプリタ)
```

## 配列
コンピュータはデータを基盤状（番地のようなもの）メモリに記録している
変数宣言と同時に基盤上の空いている区画を確保し、``[n]``だと``n個``持つ配列がメモリ上に作成される
int型だと4byteのため複数区画確保がされるイメージ
その後、配列変数には最初に使われる要素``0など``のアドレスが付与され
代入がされた後に値が区画に記録される仕組み
``space[n]``と指定された場合を想定すると、
　**``１．scoreは〇番地にあると参照される``**
　**``２．n個文後ろの要素を読み取り書き出される``**

**変数を変数に代入した場合**
配列の先頭要素がコピーされることになる

## 戻り値
**値や結果を別の場所で使用することができる**

戻り値ってなんであるのか？
計算処理は都度書けばいいのではないかと？
→
メインメソッド内に計算処理を行うコードを書けば出力をするがメインメソッド内で処理が完結、よって都度コードを書いていく方法は**汎用性に欠けている**
戻り値を使うことで計算式があるメソッドを複数回活用することができるため、
**別の場所で計算処理を使用することができる**

## インターフェース
**曖昧すぎて特別扱いされたクラス**							

			
---
##### 参考文献
[スッキリわかるJava入門 第3版](https://book.impress.co.jp/books/1119101083) 
著者：中山清喬 と国本大悟　発行所：株式会社インプレス
ケースコメント通知にコメントがありません


+ [Case Comment Notification is missing the Comment](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfB3w)

Summer '23 アップグレードに先立って、顧客がコメントを追加すると、ケース所有者は電子メール アラートを受信して​​いました。これは、サポート設定の「新しいケースのコメントをケース所有者に通知」で行われました。  そのメールにはコメントとケースへのリンクが含まれていましたが、現在はコメントが欠落しており、ケースへのリンクのみが表示されています。

私たちの組織でも同様で、リリース更新に従ってデフォルトの返信不要アドレスを完了していないことが原因でした。そうしたらすぐにコメントが戻ってきました。 

メールをデフォルトとして設定すると、問題が解決されました。  

:::note
Ok so yes. Go to org wide addresses

And ensure that you have a noreply address set up and that it’s purpose is set to default no reply.

We had the address in, but the purpose was set to user selection

わかりました、はい。組織全体のアドレスに移動

また、noreply アドレスが設定されていること、およびその目的がデフォルトで返信なしに設定されていることを確認してください。

住所は入っていましたが、目的はユーザーの選択に設定されていました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f76fd8be-5ff9-faa3-8519-a212616a3668.png)
:::

+ [Use a Default No-Reply Address as System Address for Case Email Notifications (Release Update)](https://help.salesforce.com/s/articleView?id=release-notes.rn_case_email_notification_owa.htm&release=244&type=5)

# 電子メールテンプレートにケースコメントを入力する方法

+ [How to populate Case Comments in Email Template](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000075txBr)

:::note
You can do this by including {!Case.Last_Case_Comment} in the email template body where you wish to add the most recent comment.

While creating the email template, you need to select the Case Fields in Select Field Type and then select Most Recent Public Case Comment in Select Field and copy the merge field {!Case.Last_Case_Comment} and paste it in your email template body at the desired place.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/89d2a23a-1a37-eba0-45a8-8261c36e32f1.png)

Note: If the comment made was private, this method won't work.
:::
フリーランスエンジニアのための税ハック 〜個人事業税編〜

フリーランスエンジニアの皆様、個人事業税、払ってますか？
こんにちは、モロ（[@moro_is](https://twitter.com/moro_is)）です。

結論から申し上げますと、**エンジニアは個人事業税払わなくて大丈夫**です！

完。

# 個人事業税とは

個人事業税とは、個人事業主、つまりフリーランスを対象とした地方税のひとつです。
開業届を出したが最後、毎年8月と11月（に徴税されるのでそのちょっと前）に各都道府県税事務所から仰々しいA4の封筒が送られてきて、よくわからないまま2万円くらい請求されます。

「個人事業税ってつまりなんじゃい」というと、

> この税金は、事業を行う際に利用する道路などの公共施設や各種の公共サービスに必要な経費の一部を負担していただくもので、個人に課税される事業税と法人に課税される事業税とがあります。
> https://www.pref.kanagawa.jp/zei/kenzei/a001/b004/index.html

> 個人の方が営む事業のうち、地方税法等で定められた事業（法定業種）に対してかかる税金です。現在、法定業種は70の業種があり、ほとんどの事業が該当します。
> https://www.tax.metro.tokyo.lg.jp/kazei/kojin_ji.html

と、平たく言えば、「個人事業っていっても行政が整備した道路を使用して事業されてますよね？ え、ゴミも出してる？ そのゴミの収集、やってるのは行政ですよ？ **ハイ、納税**」という制度です。

その対象となるのは以下の業種の事業者。

<table width="100%" cellpadding="3">
<tbody><tr> 
<td>区分</td>
<td>税率</td>
<td colspan="4">事業の種類</td>
</tr>
<tr> 
<th rowspan="10">第1種事業<br>
（37業種）</th>
<td rowspan="10">5%</td>
<td>物品販売業</td>
<td>運送取扱業</td>
<td>料理店業</td>
<td>遊覧所業</td>
</tr>
<tr> 
<td>保険業</td>
<td>船舶定係場業</td>
<td>飲食店業</td>
<td>商品取引業</td>
</tr>
<tr> 
<td>金銭貸付業</td>
<td>倉庫業</td>
<td>周旋業</td>
<td>不動産売買業</td>
</tr>
<tr> 
<td>物品貸付業</td>
<td>駐車場業</td>
<td>代理業</td>
<td>広告業</td>
</tr>
<tr> 
<td>不動産貸付業</td>
<td>請負業</td>
<td>仲立業</td>
<td>興信所業</td>
</tr>
<tr> 
<td>製造業</td>
<td>印刷業</td>
<td>問屋業</td>
<td>案内業</td>
</tr>
<tr> 
<td>電気供給業</td>
<td>出版業</td>
<td>両替業</td>
<td>冠婚葬祭業</td>
</tr>
<tr> 
<td>土石採取業</td>
<td>写真業</td>
<td>公衆浴場業（むし風呂等）</td>
<td>－</td>
</tr>
<tr> 
<td>電気通信事業</td>
<td>席貸業</td>
<td>演劇興行業</td>
<td>－</td>
</tr>
<tr> 
<td>運送業</td>
<td>旅館業</td>
<td>遊技場業</td>
<td>－</td>
</tr>
<tr> 
<th>第2種事業<br>
（3業種）</th>
<td>4%</td>
<td>畜産業</td>
<td>水産業</td>
<td>薪炭製造業</td>
<td>－</td>
</tr>
<tr> 
<th rowspan="8">第3種事業<br>
（30業種）</th>
<td rowspan="7">5%</td>
<td>医業</td>
<td>公証人業</td>
<td>設計監督者業</td>
<td>公衆浴場業（銭湯）</td>
</tr>
<tr> 
<td>歯科医業</td>
<td>弁理士業</td>
<td>不動産鑑定業</td>
<td>歯科衛生士業</td>
</tr>
<tr> 
<td>薬剤師業</td>
<td>税理士業</td>
<td>デザイン業</td>
<td>歯科技工士業</td>
</tr>
<tr> 
<td>獣医業</td>
<td>公認会計士業</td>
<td>諸芸師匠業</td>
<td>測量士業</td>
</tr>
<tr> 
<td>弁護士業</td>
<td>計理士業</td>
<td>理容業</td>
<td>土地家屋調査士業</td>
</tr>
<tr> 
<td>司法書士業</td>
<td>社会保険労務士業</td>
<td>美容業</td>
<td>海事代理士業</td>
</tr>
<tr> 
<td>行政書士業</td>
<td>コンサルタント業</td>
<td>クリーニング業</td>
<td>印刷製版業</td>
</tr>
<tr> 
<td>3%</td>
<td colspan="3">あんま・マッサージ又は指圧・はり・きゅう・柔道整復<br>
その他の医業に類する事業</td>
<td>装蹄師業</td>
</tr>
</tbody></table>

都をもって「**ほとんどの事業**」と言わしめるとおり、かなりの業種が該当します。

とはいえ、個人事業といえば業態はさまざま。
行政の力を借りることなく事業に勤しむ業種も確かに存在します。

その中でも、取り分けて有名なのが「文筆業」。
小説家やライターなどは個人事業税の対象とならないことで知られています。

# なぜ文筆業は例外？

ここからは完全に私の妄想ですが、個人事業税がはじまった昭和の時代、世の小説家たちからクレームが殺到したんじゃないでしょうか。

「俺たちは日がな原稿に向かうばかりで道路どころか家から出ることすら稀だー！ ゴミだって少々メモ紙が出る程度だー！ 除外しろー！」と。

どこかで聞いたワークスタイルですね。
そうです、我々エンジニアはコンピュータを相手に物語を綴る文筆業だったのです。

（個人事業税には前身となった「営業税」なんてものもあるそうなのでまったく適当な妄想です。）

# まとめ

妄想はさておき、**エンジニアが個人事業税の対象外であることは確か**です。

私も最初の2年くらいは何も考えずに払っていましたが、現場で一緒になった親切なおじさんに教えてもらって都税事務所に問い合わせたところ、晴れて免除となりました。

もっといえば「*デザイン3、エンジニアリング7ぐらいの割合でやってるんですけど〜*」とちょっと面倒くさい問い合わせ方をしたにも関わらず全額免除でした（最初だけ業務内容を証明するために源泉徴収票のコピーを提出したりした）。

そして今では私がおじさん。
若いエンジニアの皆様に情報を共有できれば幸いです。

ただし、各都道府県ごとに微妙に実態が異なるようなので必ず都道府県税事務所にお問い合わせください。
DevOps Center インストールの制限


+ [I'm trying to install the DevOps Select a file from ChatterPackage in my Production but the package is asking for an Installation key. Can someone help me with this?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R8um0SAB)

今までパスワードなんかなかったけどなぁ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/363fde09-39ef-a091-c9e2-50fe1b1f0ab5.png)


:::note
As we prepare to release our latest update, we have password-protected the new package while we finalize migration testing for the released package. As a result, you can't currently install DevOps Center from the Setup page. If you need to install the latest stable version, 5.5, use this installation URL: https://<your-domain>/packaging/installPackage.apexp?p0=04t6g000008b24gAAA 

https://trailhead.salesforce.com/trailblazer-community/groups/0F94S000000Guyg?tab=discussion&sort=LAST_MODIFIED_DATE_DESC

最新のアップデートをリリースする準備をしているため、リリースされたパッケージの移行テストを完了する間、新しいパッケージをパスワードで保護しました。その結果、現在、セットアップ ページから DevOps Center をインストールすることはできません。最新の安定バージョン 5.5 をインストールする必要がある場合は、インストール URL: https://<your-domain>/packaging/installPackage.apexp?p0=04t6g000008b24gAAA を使用してください。

:::
【Python】PuLPの最適化問題備忘録


https://coin-or.github.io/pulp/index.html

PuLPをインストールする
```
pip install pulp
```

```Python
import pulp

#最適化問題のインスタンスを作成します。
problem = pulp.LpProblem("MyOptimizationProblem", pulp.LpMinimize)
#変数を作成します。変数は問題の中で最適化される値を表します。
x = pulp.LpVariable('x', lowBound=0)
y = pulp.LpVariable('y', lowBound=0)
#目的関数を定義します。目的関数は最小化または最大化したい式です。
problem += 2*x + 3*y
#制約条件を追加します。
problem += x + y <= 10
problem += x - y >= 1
#最適化問題を解きます。
problem.solve()
#解を取得します。
print("Optimization status:", pulp.LpStatus[problem.status])
print("Optimal solution:")
print("x =", pulp.value(x))
print("y =", pulp.value(y))
print("Objective value =", pulp.value(problem.objective))
```

## まとめ
今回は、数値最適化ライブラリPuLPの簡単な使い方を紹介した
[Swift 5.9] if and switch expressions

## 概要
Swift 5.9で導入された`if` `switch`式について。

## [SE-0380 • if and switch expressions](https://github.com/apple/swift-evolution/blob/main/proposals/0380-if-switch-expressions.md)
>This proposal introduces the ability to use if and switch statements as expressions, for the purpose of:
>
>・Returning values from functions, properties, and closures;
>・Assigning values to variables; and
>・Declaring variables.

特に、Assigning values to variables; and について取り上げてみます。

## Assigning values to variables
例えば、switchで判定した結果を変数の値に代入したいケース。Swift 5.8以前だと、こういう書き方がありそうです。

```sushi.swift
enum Sushi {
    case squid
    case octopus
    case salmon
}

func canEat(_ sushi: Sushi, with money: Int) -> Bool {
    let price = { // enum内でcomputed propertyとして持てばいいんですが、例として。
        switch sushi {
        case .squid:
            return 100
        case .octopus:
            return 150
        case .salmon:
            return 200
        }
    }()

    return money >= price
}

```
それか後は、`let price: Int`で宣言してからswitch文の中で代入するやり方とか？

kotlinのwhenだともう少し簡潔にできるはず。そのため、個人的には若干もどかしさを感じる部分でした。

Xcode 15 betaのplaygroundsで試してみます。↓
```sushi_on_xcode15beta.swift
func canEat(_ sushi: Sushi, with money: Int) -> Bool {
    let price = switch sushi {
        case .squid: 100 // return省略できる
        case .octopus: 150
        case .salmon: 200
    }

    return money >= price
}

assert(!canEat(.salmon, with: 150))
assert(canEat(.salmon, with: 200))
```
シンプルになりました。アサーションコードも通る。

## 感想
個人的には使いそう、という感じ。世間的にはどうなんでしょう。そんなに有用かな？という意見も少し見ました。

`if` `switch`の各節でreturn省略できるのは、関数内が単一式なら省略できるアレの応用的な感じでしょうか。

***
`Variadic Generics`も気になります
暗黙的コミットを知らなくてめちゃくちゃ焦った話

## なんかauto incrementがずれてた
サービス停止中の本番環境のDBにデータを追加したところ、何故かauto incrementの値がずれていた
こんな感じでした↓(idにauto incrementが設定されている)
```SQL
mysql> SELECT * FROM test_table;
+----+------+
| id | name |
+----+------+
|  1 | aaa1 |
|  2 | aaa2 |
|  4 | aaa3 |
+----+------+
mysql> SELECT auto_increment FROM information_schema.tables WHERE table_schema = "test" AND table_name = "test_table";
+----------------+
| AUTO_INCREMENT |
+----------------+
|              5 |
+----------------+
```
サービスには影響は無いが直しておくことになった

## 対応手順
以下の手順で変更しようとした
1. idがずれているレコードのアップデート
2. トランザクション開始
3. ALTER文でauto incrementの値を変更
4. insertして確認
5. ロールバック
6. 確認
7. もう一度ALTER文でauto incrementの値を変更

1~6のSQLがこちら↓
```SQL
-- 1. idがずれているレコードのアップデート
UPDATE test_table SET id = 3 WHERE id = 4 AND name = "aaa3";
-- 2. トランザクション開始
BEGIN;
-- 3. ALTER文でauto incrementの値を変更
ALTER TABLE test_table AUTO_INCREMENT = 4;
-- 4. insertして確認
INSERT INTO test_table VALUES (0, "name4");
SELECT * FROM test_table;
-- 5. ロールバック
ROLLBACK;
-- 6. 確認
SELECT * FROM test_table;
SELECT auto_increment FROM information_schema.tables WHERE table_schema = "test" AND table_name = "test_table";
-- 7. もう一度ALTER文でauto incrementの値を変更
ALTER TABLE test_table AUTO_INCREMENT = 4;
```
わざわざ変えてからデータを作って戻そうとしている理由はauto incrementの値を変えたことが無かったため、設定した値で本当に正しく動くのか確認したかった
作業確認者の先輩とこれで大丈夫っしょという認識になっていたので実行することになりました

## 実行結果
順調に進み6を実行した結果↓
```SQL
mysql> SELECT * FROM test_table;
+----+------+
| id | name |
+----+------+
|  1 | aaa1 |
|  2 | aaa2 |
|  3 | aaa3 |
|  4 | aaa4 |
+----+------+
mysql> SELECT auto_increment FROM information_schema.tables WHERE table_schema = "test" AND table_name = "test_table";
+----------------+
| AUTO_INCREMENT |
+----------------+
|              5 |
+----------------+
```
#### なんか思ったんとちゃう、、
かなり焦りました
ロールバックしたのにid=4のレコードが消えていない、、
色々と調べたらalter文を実行した後に**暗黙的コミット**ということが起きていたみたいです
つまり3を実行した時点でコミットが行われていたので、4のinsert文を実行した後にロールバックしても何も戻らないということでした、、

知識不足でお恥ずかしいのですが、暗黙的コミットというものを全く知らなかったです
発生する条件は他にもいっぱいあるみたいです↓
https://dev.mysql.com/doc/refman/8.0/ja/implicit-commit.html

## まとめ
そもそも検証環境で試さなかったことが問題ですよね、、
Datadog クラウドコストマネジメント向け Azure タグパイプライン

## はじめに
本記事では、DatadogにおけるAzureのコストマネジメント機能について解説します。

![Screenshot 2023-06-14 at 7.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/21cb4342-fe34-fc09-f33f-237065348440.png)

## パブリックベータとして公開
Azure Tag Pipelines が Datadog のクラウドコストマネジメントのユーザー向けに、パブリックベータ版を公開しました。クラウドコストマネジメントとは、エンジニアリングチームが既に使用しているオブザーバビリティプラットフォームから、すべてのクラウドリソースのコストをきめ細かく可視化することができる機能です。Datadog はクラウドコストの変化を自動的に検出し、他のメトリクス、トレース、ログ、その他のテレメトリーとともにコストデータを可視化するため、コストの非効率性を容易に発見・修正することができます。

詳細はこちらから
https://www.datadoghq.com/ja/product/cloud-cost-management/

## Azure タグパイプラインでできること
Datadog クラウドコストマネジメントで、今回新たに公開された Azure タグパイプラインを使ってできることは以下のとおりです。

#### ビジネス階層の作成：
ビジネスロジックに沿った新しい推論タグを作成します。

#### 標準化されたタグ付け：
タグルールを作成し、タグの欠落や不正確なタグを修正することで、AWSとAzureのコスト全体に正確なコスト配分を実現します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/9fae3301-2911-3905-26ac-54a113b71e18.png)

## 使い方
Azure タグパイプラインを使い始める場合は、Datadog の [Infrastructure -> Cloud Costs](https://app.datadoghq.com/cost/setup?cloud=azure) に移動し、セットアップを行います。

![Screenshot 2023-06-14 at 8.20.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/bff56191-b390-caa8-d260-58943b49d0b0.png)

## まとめ
クラウドプラットフォームを使っていると、どうしてもコスト管理が難しくなってきます。最初の頃は整理して管理していても、使うサービスやインスタンスが増えてくるに従い漏れが出てきたりしますし、マルチクラウドでコスト管理をしようと思うとまたそれも大変だったりします。
Datadogであれば、（現状AzureとAWSのみですが）クラウドコストマネジメントの機能で、利用しているサービスとそのコストを可視化して管理しやすくできます。
ご興味ある方は、一度試してみてはいかがでしょうか。

ではでは。