OmniAICreator/Qiita-1.07M huggingface dataset:
今年の冬の気温はどうなるか…

### 概要
スタンバイという仕事探しに特化した検索エンジンを開発する会社の一員として、普段はユーザー視点でのサービス品質を調べています。しかし、今回はいつもとは違い、私たちの日常に密接に関わる「天気」にスポットライトを当ててみようと思います。特に、寒さが苦手な私にとって、冬の出社日は暖かい日になってくれると嬉しいなと思います。
2023年11月24日にスタンバイメンバーと一緒にランチに出かけた記憶が鮮明です。この日は東京で最高気温24.2度が観測された日であり、とても暖かくて快適に過ごせた日でした。会社の中では半袖で過ごしている人も何人かいました。
そこで、気になったのが「12月、東京都内で20度を超える日って実際どのくらいあるのだろう？」ということです。天気に興味のある方には楽しく読んでもらえると思います。

## 調査方法
調査のために参照したデータは、[2021年のアドベントカレンダー](https://qiita.com/jyoji_koike/items/764e6229d70ad3a7c072)でも紹介された気象庁の公開データです。気象庁のサイトは非常に充実しており、過去の気温データにも簡単にアクセスできます。今回は2001年から2020年までの20年間のデータをダウンロードし、特に最高気温が20度を超えた日に焦点を当てて調査しました。

|日付|平均気温|最高気温| 
| :----: | :----: | :----: | 
|2004/12/05|	17.5|	24.8|
|2015/12/11|	14.7| 	24.1|
|2010/12/03|	17.0|	23.7|
|2018/12/04|	17.7|	23.4|
|2006/12/27|	14.7|	20.3|
|2016/12/22|	14.6|	20.2|
|2018/12/05|	16.8|	20.2|

調べたところ、12月になっても東京では20度を超える日が複数回ありました。例えば、2004年12月5日には最高気温が24.8度に達し、2015年12月11日には24.1度、2010年12月3日には23.7度という記録があります。
これらはいわゆる「夏日」とは呼ばれないものの、12月としては驚異的な暖かさです。また、2018年12月4日には23.4度、2006年12月27日には20.3度、2016年12月22日には20.2度といったデータも見られました。
これらの日は、冬らしくない暖かさが感じられたことでしょう。

なぜこのような現象が起こるのか、さらに深堀りしてみると、今年（2023年）はエルニーニョ現象が発生していることが分かりました。
エルニーニョ現象とは、太平洋赤道域の海水温が平年よりも高くなる現象で、これにより世界各地の気象に影響を与えることが知られています。日本の場合、エルニーニョ現象が発生すると、冬季に暖冬の傾向が見られることが多いです。
実際、今年の冬は暖冬となる可能性が高く、今後、来年の春にかけてもこの傾向が続くかもしれません。

さて、暖冬の傾向を踏まえると、屋外イベントにとっては好ましい条件になることが期待できます。寒い冬でも、時折訪れる暖かい日は、クリスマスイベントや年末年始の祝賀行事にとって大きなプラスとなるでしょう。特に今年は、新型コロナウイルスの影響で多くのイベントが制限されてきましたが、暖かい気候は屋外での社会的距離を保ちやすくし、安全なイベント開催に貢献するかもしれません。

## まとめ
この記事を通じて、12月に東京で20度を超える日が過去にも実際に存在したことを知ることができました。寒い冬が苦手な私にとってはありがたいと思う発見です。特に、2015年12月11日は、私自身も「暑い」と感じた記憶があります。こちらの記事を書きながら、今年の冬はどのような日になるのか天気予報の確認は欠かせないなと思いました。
次回のアドベントカレンダーでは、別のトピックでまたお会いしましょう。それまで、皆さんも暖かくしてお過ごしください。
線形回帰を元にした確率的識別モデルについて

# 線形回帰とロジスティックシグモイド：確率的識別モデルの数学的な解説

## はじめに

この記事では、線形回帰とロジスティックシグモイドを組み合わせた確率的識別モデルについて、数式を用いて解説していきます。
## 1. 線形回帰の数学的表現

線形回帰では、特徴ベクトル $\mathbf{w}$ とパラメータベクトル $\mathbf{x}$、を用いて、以下のような線形な関係がモデル化されます。このときバイアス項は含まれているとします。

$$
f(\mathbf{x}) = \mathbf{w} ^T \mathbf{x}
$$

## 2. ロジスティックシグモイド関数の数学的表現

ロジスティックシグモイド関数 S(x) は、以下のようにあらわされます。

$$
S(x) = \frac{1}{1 + e^{-x}}
$$

入力$[-∞,∞]$を受け取り、$[0,1]$を出力します。以下のような関数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363684/45233b11-2fea-d359-af9c-613a7f15e785.png)

## 3. 確率的識別モデルの構築
2クラス分類の場合を考えます。今回は事例の組$ (\mathbf{x}_i,t_i)(\mathbf{x}_iはD+1次元ベクトル)(i=1...N) (t_iは0または1)$が与えられるとします。そのデータ$\mathbf{x}_i$の属するクラスが1がある確率は以下で表せます。$$ Pr(t_i=1|\mathbf{x}_i)$$
このとき$ Pr(t_i=1|\mathbf{x}_i) > 0.5$のときに$\mathbf{x}_i$はクラス1に属すると考え、$ Pr(t_i=1|\mathbf{x}_i) < 0.5$のときにクラス2に属すると考えることができます。特定のクラスに属する確率を出力するので、確率的識別モデルと呼ばれます。
続いてはどうやって、確率を出力するかを考えます。このとき役立つのが、ロジスティックシグモイド関数です。確率は以下のようになると考えます。
$$
P(t_i=1 | \mathbf{x}) = S(\mathbf{w} ^T \mathbf{x})
$$
線形回帰$\mathbf{w} ^T \mathbf{x}_i$をロジスティックシグモイド関数$S(\mathbf{x})$に通し、$[0,1]$に返します。実際にはわからない確率関数をこのように定めて、$\mathbf{w}$のパラメータを調整することによって、正しく確率が出力されるように精度を上げていきます。


## 4. パラメータの学習
モデルのパラメータ$\mathbf{w}$ は、訓練データを用いて更新します。更新には評価を行う関数を定める必要があります。
尤度関数 $L(\mathbf{w})$ は次のように表されます。
$$
 L(\mathbf{w}) = \prod_{i=1}^{N} Pr(t_i=1|\mathbf{x}_i; \mathbf{w})^{t_i} \cdot \left(1 - Pr(t_i=1|\mathbf{x}_i; \mathbf{w})\right)^{1 - t_i}
$$

この尤度関数を最大化することにより、ロジスティック回帰モデルのパラメータ $\mathbf{w}$ を変更することが一般的です。また、この尤度関数は最大化を行う必要がありますが、対数を取ることで今までと同じ最小化で考えることができます。これは交差エントロピー損失と呼ばれます。
$$
E(\mathbf{w}) =-ln(L(\mathbf{w}))= \sum_{i=1}^{N} \left[ t_i \log(Pr(t_i=1|\mathbf{x}_i; \mathbf{w})) + (1 - t_i) \log(1 - Pr(t_i=1|\mathbf{x}_i; \mathbf{w})) \right]
$$
交差エントロピー損失の最小化には主に解析的に解く方法と、最急降下法で解く方法の2通りありますが、シグモイド関数で狭まっているため、最急降下法で解くことになります。
## パラメーターの最急降下法による更新

前節で交差エントロピー損失関数を偏微分して、パラメータの更新式を導きます。

最急降下法の学習率を $\alpha$ とすると、更新式次のようになります。
$$
 \frac{\partial J(\mathbf{w})}{\partial \mathbf{w}} = -\sum_{i=1}^{N} \left[ (t_i - y_i) \cdot \mathbf{x}_i \right] $$

これを用いて更新式を得ます。
$$
\mathbf{w'}=\mathbf{w}+\alpha\sum_{i=1}^{N} \left[ (t_i - y_i) \cdot \mathbf{x}_i \right]
$$

## 5.まとめ
今回は線形回帰で2クラス分類での確率的識別モデルを解説しました。
[読書感想] 佐久間宣行のずるい仕事術 1.仕事術編

# 概要
- 仕事の考え方のヒントがある
- 会社員として過ごしていくならおすすめ

# 内容

## 1.「楽しそう」を最強のアピールにする

- 楽しそうに働いている姿を周りや上司にアピールするのが重要
    - この仕事をやりたかったという、周りへのアピールとなる
    - この仕事をさせてくれてありがとうという、感謝を伝える意思表示になる
- 不機嫌でいるメリットはない
    - 周りのテンションが下がる
    - 次の仕事が回ってこなくなる

## 2.「雑務」こそチャンスに変える

- 誰にでもできる退屈な仕事を工夫するのが大切
    - 小さな仕事でも、誰かが必ず見ており評価している
    - 自分にしかできない仕事にして、信用を貯めてチャンスに変える

## 3. 「まだ早い」をあざとく使え

- 「もう少し力をつけてつけてから・・・」
    - もったいない
    - どれだけキャリアを積んでも「よし、十分、力がついた」とはならない
- 無謀なオファーや挙手をして断られても「相手の記憶に残る」メリットがある
- 経験が足りないのは「何かと許される」特権にもなる

## 4. 「チャンス」のためにはイヤでも謝る

- 正しく謝れば損することはひとつもない
    - 誰だってミスをする
    - 謝るときは保身の言い訳を口走ってはいけない
    - 人に嫌われると次のチャンスをもらえない

## 5. 合理的最強ツール「ホウレンソウ」を使い倒せ

- 報告はマスト
    - 共有すべき内容
        - 進捗状況
        - 優先順位
    - 理由
        - 上司を不安にさせたり、文句を言わせない
        - 上司の上司に文句を言わせないため
    - 報告しないデメリット
        - 上司は不審を募らせて束縛してくる
        - 仕事のキャパシティを上司が把握できないので無茶振りされる
    - 聞かれていなくても、事細かに自分の状況を曝け出すといい

## 6. 相談のゴールは「解決」にする

- 相談相手の選び方
    - 「話を聞いてほしい人」はダメ
    - 「問題を解決できそうな人」がいい
- 仕事の相談は「動いてもらうためのきっかけづくり」
    - 相談のゴールは、愚痴への共感ではなく問題解決
- 相談の仕方
    - 相談内容より先に、「なぜあなたに相談するか」を伝える
        - 悩みの方向性が明確になる
        - 相手がより親身になる
- 相談でやりがちなミス
    - 1 ~ 2年次上の先輩に相談
        - 「愚痴」を聞いてもらっても意味がない

## 7. 「すぐやる人」が結局残る

- 仕事は全部、縁から始まる
    - 縁を切らないコミュニケーションが大切
    - すぐ決断して動いた方が相手のためになる

## 8. 会議は「事前準備」で勝て

- やりたいことを手にするチャンスは「会議」
    - 組織の中では誰だって、最初は「その他大勢」
        - 決定者に存在感を見せるのがその他大勢から抜け出すカギ
    - プロジェクトのど真ん中に入れないときは、日々の会議こそが「仕事の本番」
        - 「こいつに任せたらスムーズに進みそうだ」と思わせるのが重要
    - 会議を頑張れば、プライベートの時間を張り切らなくてもいい

## 9. 会議後の「5分」で差をつける

- 会議で信用を損なってしまう人の特徴
    - 「前回の内容を忘れている」
- 打ち合わせ後の「振り返り」が大切
    - その日の要点
    - 次の会議に達成すべきこと
    - 次回までに自分がやっておくこと
- 会議直後の5分間が1週間後の自分の評価を変える

## 10. 「他人の成否」を予想する

- 仕事で成長するには「正しい努力」が必要
    - 仮説を立てて実行
    - 実行したら検証
    - ズレていたら修正
    - 成功したら引き出しにストック
- 一番成長しないのは、仮説を持たず、言われた通りの仕事をただこなすこと

## 11. 「社内初」はローリスク・ハイリターン

- 社内「初」を狙うのがいい
    - 小さな成果でも目立つことができる
    - 成功すれば「第一人者」
        - 重宝がられて発言力が強まる
    - 得られた知見を誰よりも早く自分一人で独占可能
    - 失敗した前例がないので押し切りやすい
    - 過度な期待をかけられない
    - 失敗しても「やっぱりね」と笑われる程度

## 12. 「キャリア相談」は相手を選べ

- どの視点かの話かが重要
    - 一般論？
    - 自分に当てた話？
- 万人の常識は、時代に合っていなかったり、自分にフィットしないことも多い
- キャリア選択に一般論を取り入れたら、みんなと同じキャリアし築けない

## 13. 会社に「合わせすぎない」

- 会社にはそれぞれ、評価の軸がある
    - 定められた軸からズレると、認めてもらえない
- 会社の中で実績をつくり、評価されることは重要
- 「よし」とされるものはすごい速さで変わる
    - 会社の評価の軸は簡単には変わらない
    - 「会社に評価されること」だけを仕事の軸にするのは危険
        - 長期的判断を見誤ってしまうことがある

## 14. 「らしくない仕事」をやってはいけない

- ブランド人とは、「信用と期待を持たれている人」のこと
    - 必要な信用
        - 仕事の成果
        - 「人間そのもの」への信用
    - どれだけ仕事ができても、人間性に難があると、人は離れる
- ブランドは一朝一夕でできないが失うのは一瞬
- 仕事と他人に誠実であることが、一番のブランドづくり

# リンク

https://www.amazon.co.jp/%E4%BD%90%E4%B9%85%E9%96%93%E5%AE%A3%E8%A1%8C%E3%81%AE%E3%81%9A%E3%82%8B%E3%81%84%E4%BB%95%E4%BA%8B%E8%A1%93-%E4%BD%90%E4%B9%85%E9%96%93-%E5%AE%A3%E8%A1%8C/dp/447811479X
pix2texインストール手順

# pix2texインストール手順

数式の画像を入力するとlatexのコードで出力してくるというもの。インストール手順は以下の通りです。

## pythonのインストール

パワーシェルコンソールをたちあげて、wingetでインストールする。バージョンは、3.7+.

## pytorchのインストール

次のサイトを参照するとタイプ別にインストールコマンドが出力されるので、それをコピーペーストして、インストールしてください。

https://pytorch.org/get-started/locally/

## pix2texインストール

以下のコマンドを実行してください。

```
pip install pix2tex[gui]
```

## 使い方

パワーシェルを立ち上げ、`pix2tex`を実行します。数式を画像としてコピーしてください。（Adobe Acrobat Readerだとスナップショット）そのあと、パワーシェルコンソール上でエンターキーを押してください。そうすると、latex codeが出力されます。
Storybookのcontrolsの制御するためのTips集

Storybookのcontrolsを制御する方法を学んだのでメモがわりに残します。

:::note info
【こんな方にオススメ！】
Storybookをこれから勉強する人
Storybookを学習し始め間もない人
:::

https://storybook.js.org/docs/react/essentials/controls

## Storybookのcontrolsを操作不可・非表示にしたい
Storybookのcontrolsは自動で生成されます。
仮にStorybookで操作させたくないcontrolsがあった場合2つの対応方法があります。

Storybookでcontrolsを操作できないようにするにはstoriesファイルのmetaオブジェクトの中にargTypesを定義して制御します。

### controlsを操作できないようにする
操作ができないようにするだけであれば`control`を利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/f18e5191-3335-7f85-27ea-4feb638bed7d.png)


```javascript:**.stories.tsx
meta = {
  argTypes: {
    title: {
      control: false,
    }
  },
  ...
}
```

### controlsから表示を消す
`table:{}`を利用することでcontrolsから「title」項目が消えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/d2041181-a083-1c97-35b2-e79268d54176.png)


```javascript:**.stories.tsx
meta = {
  argTypes: {
    title: {
      table: {
        disable: true,
      },
    }
  },
  ...
}
```

## 条件をつけてcontrolsを制御できるようにしたい
特定の値に基づいてcontrolsの表示・非表示を切り替えることができます。
以下はadvancedの値がtrueだった場合に設定できるbackground-colorを制御できるようにしてみました。


```javascript:**.stories.tsx
meta = {
  argTypes: {
    advanced: { control: 'boolean' },
    bgColor: {
      control: 'radio',
      options: ['bg-gray-100', 'bg-gray-200', 'bg-gray-300'],
      if: { arg: 'advanced' },
    },
  },
}
```

## controls内の並べ替え
`parameters`を利用して並び順を変更することができます。

```javascript:**.stories.tsx
meta = {
  parameters: {
    controls: { sort: 'alpha' },
  },
}
```

`alpha`はアルファベット順、`requiredFirst`は必須を項目を先に並べ、かつアルファベット順に並べることができます。

## まとめ
比較的簡単なTipsを3つほど学びました。
controlsはもう少し複雑な実装ができるので引き続き理解を深めていきます。
アーキテクチャをEC2+RDSからDynamodbに切り替えたお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

# アーキテクチャをEC2+RDSからDynamodbに切り替えたお話
背景は[こちら](https://qiita.com/does_not_exist/items/196ea01eb20c8795bd65)


環境構築の記事を以前投稿しています。

https://qiita.com/does_not_exist/items/19c35639e466844e8b0e

https://qiita.com/does_not_exist/items/b79b3fd51ea6ef39df23

## 気づいたこと
- ローカル環境の構築がMySQLと勝手が違いました。Dynamodb-localはAWS認証情報(ダミーで可)が必要でした。
- CloudFormationでリソースを作成しているのですが、RDSに比べて設定内容がシンプルでとっつきやすかったように感じました。
- 当時作成していたシステムはテーブル数が少なかったためNoSQLの設計方針に従い1つのテーブルにまとめてしまいましたが、あるべき設計方法がよく分かっていなかったです。後に担当するシステムでGSIなどを活用した設計を行いました。

# おわりに
まだ経験が浅い人間の考えですが、NoSQLの設計やデータ操作などを覚えてしまえばDynamodbの方がシステム構築の面で楽できそうな感触です。適材適所だとは思いますがシステム要件に合わせて選択できるようにしたいです。
【Laravel入門】新規プロジェクトを立ち上げたらまずやること


# タイムゾーンの設定
LaravelではデフォルトのタイムゾーンにUTCが設定されています。
タイムゾーンとは**世界の地域ごとの標準時間**のことで、Webアプリはタイムゾーンを自国の標準時間に合わせる必要があります。

**UTCはイギリス・ロンドンのグリニッジ天文台を通る子午線を世界中の経度と時刻の基点（本初子午線）とする**ことが1884年に行われた国際会議で定められました。

タイムゾーンがUTCのままの場合は、UTCに+9時間して計算する必要があります。
これは面倒なので新しくプロジェクトを立ち上げた時はまずタイムゾーンを日本（Asia/Tokyo）に設定するようにします。

```ruby:config/app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'faker_locale' => 'ja_JP',
```

# 日本語化
Laravelではログインやバリデーションなど便利な機能がありますが、画面に表示されるメッセージはデフォルトで英語になっています。
- auth.php：認証
- passwords.php：パスワードリセット
- pagination.php：ページネーション
- validation.php：バリデーション

上記の機能を日本語化するためにターミナルで下記のコマンドを実行して日本語ファイルをインストールします。

```
php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
```

インストールしたら「resources/lang/ja/」に追加されているので、必要ならカスタマイズします。

日本語ファイルについてはこちらを参照
https://readouble.com/laravel/8.x/ja/validation-php.html


# データベース設定
.envファイルを対象のデータベース情報に合わせて変更します。

```ruby:.env'
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=DB名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

# データベースの文字コード

PCは扱うデータを数値でしか認識できません。
文字もそのままでは認識してくれないので数値に変換して認識させる必要があります。
文字→数値に変換するときにその文字が何の種類なのかを指定するためにコード番号を指定します。
このコード番号でPCは「その文字が何の文字でどの数値にするのか」を認識することができます。

文字コードは世界中で作られていて約100種類以上あると言われているそうです。
日本で有名な文字コードは以下の4つです。
- UTF-8
- JIS
- Shift_JIS
- EUC
- Unicode

（それぞれの説明はまたいつか）
今回設定したUTF-8は基礎的な文字コードの1つで、基本的な文字コードであるASCIIコードとの互換性も高いことから、多くのソフトウェア開発でも使用されています。

WEBアプリも同様にデータベースに入っているデータの文字コードを指定します。

```ruby:config/database.php'
mysql => [
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
],
```

# デバッグバー
自分の作っているプロジェクトのどこかでエラーになっていた時にいち早く目で検知できるのがデバッグバーです。デバッグバーをインストールしておくとブラウザの下部にLaravelデバッガーが表示されるようになって便利です。
個人的に最初のプロジェクトで一番よくみていたのがこのデバッグバーです。

ターミナルで下記のコマンドを実行してインストールします。
```
composer require barryvdh/laravel-debugbar
```
envファイルのAPP_DEBUGをtrueにします。
ここをfalseにするとデバッガーは無効になります。
本番環境ではここをfalseにしないと事故ります。
開発環境のみtrueにするようにしましょう。
```ruby:.env'
APP_DEBUG=true
```
Vue 基礎勉強 データバインディング (マスタッシュ構文)

(Vue.js 3.1.5を使用)

2重かっこで変数名をくくる構文
{{変数名}}
を**マスタッシュ構文**という。

javascript側のmessageに設定した文字列を画面表示する。
(テンプレート側から参照するにはdataオプションの中に値を書かないといけないらしい）

HTML側にマスタッシュ構文を書いておくと、その部分に表示される。
```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        message: 'Hello! Vue'
    })
})
app.mount('#app')
```
```html:html
    <div id="app">
        <p>
            {{message}}
        </p>
    </div>
```

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/285fa96b-dab5-c0dd-1fb1-c4f2954136c3.png)

配列やオブジェクトも表示できる。

```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        message: 'Hello! Vue',
        book:{
            name: 'Vue 入門',
            author: 'ヤマダタロウ',
            year: 2023
        },
        fruits: ['リンゴ', 'バナナ', 'メロン', 'スイカ']
    })
})
app.mount('#app')
```
```html:html
    <div id="app">
        <p>
            {{message}}
        </p>
        <ul>
            <li>{{book.name}}</li>
            <li>{{book.year}}</li>
            <li>{{book.author}}</li>
        </ul>
        <ul>
            <li>{{fruits[0]}}</li>
            <li>{{fruits[1]}}</li>
            <li>{{fruits[2]}}</li>
            <li>{{fruits[3]}}</li>
        </ul>
    </div>
```

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/99ca16ea-5d1d-8bd2-457a-b8ecad86e275.png)
`.save` と `.create`の違い&`.valid`

# `.save` と `.create`の違いと`.valid`

Ruby on RailsのActive Recordモデルで、データベースに新しいレコードを保存するためには `save` と `create` メソッドがよく使われます。また、`valid?` メソッドは、レコードがバリデーションをパスするかどうかを確認するのに役立ちます。それぞれの違いについて詳しく見ていきましょう。

## `save` メソッド

`save` メソッドは、モデルのインスタンスに対して変更を保存しますが、新しいインスタンスがデータベースに実際に挿入されるのはメソッドの呼び出し後です。

```ruby
plan = Plan.new(name: "Basic Plan", price: 19.99)
plan.save
```

このメソッドを使用すると、変更がデータベースに保存されるかどうかが `true` か `false` で返ってきます。

## `create` メソッド

`create` メソッドは、新しいインスタンスを作成し、同時にデータベースに保存します。新しいレコードをデータベースに挿入する一連の操作を一度に行います。

```ruby
plan = Plan.create(name: "Basic Plan", price: 19.99)
```

このメソッドは成功すると新しいレコードのインスタンスを返します。失敗した場合は例外を発生させます。

## `valid?` メソッド

`valid?` メソッドは、モデルのバリデーションを実行し、その結果が正しいかどうかを確認します。バリデーションに通れば `true` を、通らなければ `false` を返します。

```ruby
plan = Plan.new(name: "Basic Plan", price: "invalid_price")
plan.valid?  # => false
```

このメソッドを使用して、保存前にデータがバリデーションをパスするかどうかを確認できます。これは `save` や `create` を呼び出す前に、データが正しいかどうかを確認するために利用されます。

## まとめ

- **`save` メソッド**は変更を保存するが、データベースに挿入されるのは後。
- **`create` メソッド**は新しいインスタンスを作成し、同時にデータベースに保存。
- **`valid?` メソッド**はバリデーションを確認し、データが正しいかどうかを返す。

これらのメソッドは、データベースへの変更を行う際に使う際に注意して選択することが重要です。データの正当性を確認したり、バリデーションを実行したりする際にそれぞれのメソッドを適切に利用しましょう。
【備忘録】Snowflake Snowpark とpandas df で起きたエラーの解消

# 起きたエラー
Snowflake Snowpark をローカルのpythonコードで使用して、テーブルを作成しようとしていたら、下記エラーが発生しました。
```
Session.create_dateframe() won't accept my pandas dataframe
"TypeError: create_dataframe() function only accepts data as a list, tuple or a pandas DataFrame."
```
エラーの起きた部分は、pandas Dataframe からSnowflake Dataframe を作成しようとしている部分でした。

# 調べたこと
エラー文を検索にかけ、Snowflake Community の投稿を見つけました。
URL : https://community.snowflake.com/s/question/0D53r0000BnYlDHCQ0/sessioncreatedateframe-wont-accept-my-pandas-dataframetypeerror-createdataframe-function-only-accepts-data-as-a-list-tuple-or-a-pandas-dataframe
Snowflake 周りのライブラリに問題がある というような記述で、解決策はよくわからなかったのですが、最後の投稿に有力情報がありました。
```
poetry add "snowflake-snowpark-python[pandas]"
poetry add "snowflake-connector-python[pandas]"
```
これでpandas 関連ライブラリを明示的に追加して解決した、という内容でした。

# やったこと
実行環境で以下を実行しました。
```
pip install "snowflake-snowpark-python[pandas]"
pip install "snowflake-connector-python[pandas]"
```
実行時、いくつかのライブラリが追加でインストールされていました。
その後、実行したかったコードを再実行したところ、エラーが解消されました。
Vueのテンプレート内で変数を定義する2つのテクニック

Vue.js のテンプレートでは直接的な方法では変数を定義できません。テンプレート内では基本的に式しか書けないので、文となる変数定義はできません。そんな中で一時的な変数を定義するハックを書く記事。

# なぜテンプレート内で変数を定義したいのか
Vue 公式的にはテンプレートには複雑な処理を書かずに ViewModel 側(`<script>` 内)で `computed` を使うとかして欲しいので変数定義はできないということらしいです。しかし、そんなに複雑な処理でなくても一時変数を使いたい時はあるんですよね。例えば何分間かを表す数値を「XX時間YY分」に変換して表示したい、ただし0の成分は表示しないという処理。

```javascript
function (totalMinutes) {
  const hours = Math.floor(totalMinutes / 60), minutes = totalMinutes % 60;
  return (hours ? `${hours}時間` : '') + (minutes ? `${minutes}分` : '');
}
```

これを一時変数 `hours` と `minutes` を使わないで書くと、冗長でコードが相当長くなってしまいます。

あとはそもそも処理が複雑かどうかとはあまり関係なく、MVVM の役割分担としてこういう数値のフォーマットは View 側でやりたい気がします。

# 方法
## 即時実行関数を使う方法

```vue
<template>
{{
  ((hours, minutes) => (
    (hours ? `${hours}時間` : '') + (minutes ? `${minutes}分` : '')
  ))(Math.floor(totalMinutes / 60), totalMinutes % 60)
}}
</template>
```

または

```vuejs
<template>
{{
  (() => {
    const hours = Math.floor(totalMinutes / 60), minutes = totalMinutes % 60;
    return (hours ? `${hours}時間` : '') + (minutes ? `${minutes}分` : '');
  })()
}}
</template>
```

特に後者は変数定義に限らず任意の文を任意の数だけ書けるので汎用性が高いです。

## `v-for` を使う方法
上の即時実行関数のやり方で定義した変数は一つの `{{  }}` 内でしか使えませんでした。複数の箇所にまたがって使う変数を定義したいときはこのやり方が使えます。

```vue
<template>
<template v-for="[hours, minutes] of [[
  Math.floor(totalMinutes / 60), totalMinutes % 60,
]]">
  <span>{{ hours ? `${hours}時間` : '' }}</span>
  <span>{{ minutes ? `${minutes}分` : '' }}</span>
</template>
</template>
```

# あとがき
複数の `{{  }}` にまたがって使う変数は `v-for` を使った方法、そうでないなら即時実行関数の方法を使うと良いと思います。ただ、特に `v-for` を使う方法はかなりハックっぽくて、可読性を落とすので ViewModel 側に処理を移すことも考えた方が良いかもしれません。
pythonのopenaiライブラリを更新したらAzure OpenAI ServiceのAPIが叩けなくなった！(AttributeError: module 'openai' has no attribute 'ChatCompletion')

**[OpenAI DevDay](https://www.youtube.com/watch?v=U9mJuUkhUzk)**!!!興奮しましたね！
`gpt-4-vision-preview`が早速利用できるということで、その日の朝からJupyterNotebookで開発している環境のopenaiライブラリを`pip install -U openai`で更新し、「たぁのしー」「おー」とか言いながらと優雅に公式ドキュメントのクイックスタートとか見ながら遊んでました！
**が！** 過去作成していたAzure OpenAI ServiceのAPIが叩けなくなり慌てて修正する羽目になりました・・・

ノリでアップデートしちゃったのでダウングレードしてもよかったのですが、せっかくなので慌てて修正してみよう！ということで修正した内容をまとめます。
今後変わる可能性もありますが、誰かの解決の糧になればうれしいと思います。
（投稿苦手なので大目に見てください・・・）

## 問題
- `openai.ChatCompletion.create`がエラーになる
- 返ってきたレスポンスが今まで通りでは値がとれない

## 一応、応急処置（ソースコード修正なんてできねぇよ！って場合）

- openaiのライブラリバージョン固定で再インストール
~~~
pip install openai==0.28.1
~~~

## 修正

### 修正前

<details><summary>今までの記載方法</summary>

### インポート

#### 共通

~~~python
import openai
~~~

### 変数設定

#### Azure OpenAI API

~~~python
# ライブラリで設定するパターン
openai.api_type = "azure"
openai.api_base = "{エンドポイント}"
openai.api_version = '2023-05-15'
openai.api_key = "{API KEY}" 

# 環境変数で設定するパターン
import os
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_BASE"] = "{エンドポイント}"
os.environ["OPENAI_API_VERSION"] = '2023-05-15'
os.environ["OPENAI_API_KEY"] = "{API KEY}"
~~~

#### OpenAI

~~~python
# ライブラリで設定するパターン
openai.api_key = "{API KEY}" 

# 環境変数で設定するパターン
import os
os.environ["OPENAI_API_KEY"] = "{API KEY}"
~~~
### API実行

#### Azure OpenAI
~~~python
response = openai.ChatCompletion.create(
    deployment_id="{デプロイ名}",
    messages={'role': 'user', 'content': '{プロンプト}'},
    temperature=0
)
~~~

#### OpenAI

~~~python
response = openai.ChatCompletion.create(
    model="{モデル名}",
    messages=[
        { "role": "user", "content": "{プロンプト}" },
    ],
    temperature=0
)
~~~

### レスポンスのメッセージ取得
#### 共通
~~~python
message = response.choices[0]["message"]["content"].strip()
~~~

</details>

### 修正後
#### Azure OpenAI

~~~python
from openai import AzureOpenAI

os.environ["AZURE_OPENAI_API_KEY"] = "{API KEY}"
os.environ["OPENAI_API_VERSION"] = '2023-05-15'
os.environ["AZURE_OPENAI_ENDPOINT"] = "{エンドポイント}"

client = AzureOpenAI()

response = client.chat.completions.create(
    model="{デプロイ名 e.g.: gpt-35-turbo}",
    messages=[
        { "role": "user", "content": "{プロンプト}" }
    ],
    temperature=0
)
message = response.choices[0].message.content
~~~

#### OpenAI

~~~python
from openai import OpenAI

os.environ["OPENAI_API_KEY"] = "{API KEY}"

client = OpenAI()

response = client.chat.completions.create(
    model="{モデル名 e.g.: gpt-3.5-turbo}",
    messages=[
        { "role": "user", "content": "{プロンプト}" }
    ],
    temperature=0,
)

message = response.choices[0].message.content
~~~


# おわりに

今まで`OPENAI_API_KEY`でいけてたのに！急に分けるなんて！結構影響ありそうじゃない！~~LangChainもエラー出てるじゃない！~~（現在は対応済みでした！さすが！早い！）と嘆きながらもOpenAIの進化にワクワクさせながら修正対応させていただきました。

軽い気持ちでアプデして遊んだ後に、アプデ前の別のコードが動かなくなるのは焦りましたねw
アプデは計画的に・・・

# 参考
[OpenAI公式 API reference Create chat completion](https://platform.openai.com/docs/api-reference/chat/create)
[GitHub - AzureOpenAIの変数についてのコメント部分](https://github.com/openai/openai-python/blob/main/src/openai/lib/azure.py#L139C1-L157C1)
[LangChain - Azure OpenAI](https://python.langchain.com/docs/integrations/chat/azure_chat_openai)
データベース　テーブルサイズ一覧

# データベース内にある各テーブルのサイズをチェック！
頻繁に使わないのでいざ使うときに毎回調べてたのをメモメモ

```mysql
SELECT 
	table_name,
	floor((data_length+index_length) / (1024 * 1024)) AS table_size,
    floor(data_length / (1024 * 1024)) AS table_data_size,
    floor(index_length / (1024 * 1024)) AS table_index_size ,
    table_rows,
    avg_row_length
FROM information_schema.tables 
WHERE table_schema = database() 
ORDER BY table_size DESC;
```
# 余談
確認すると想定とは違うことが偶にある
まさか通知メールのテーブルがが全体の2/3を占めるほど大きかったとは、、、
バックアップ無駄なので退避DB作って一定期間過ぎたらそっちに移動しよう
JavaでPDFをHTMLに変換

PDF文書は、コンテンツを含むテキスト、画像、表、動画など、その外観を変更することなく、さまざまなコンテンツを提示するために、さまざまなプラットフォーム上で提示することができるPDF文書、伝送およびディスプレイを介して保存することができます。 とPDF文書のためのHTML文書は、より良いサポートの内容を表示するには、能力の内容を収容するためにPDF文書に劣らないと言うことができ、HTML文書は、主にWebコンテンツの伝送とプレゼンテーションのために、オンラインで適用することができます。 したがって、WebページでPDF文書の内容を提示する必要がある場合は、HTMLファイルにPDFファイルに変換することができます。 この記事では、PDFファイルがHTMLファイルに変換されるようにプログラムする方法を紹介します。

- **[PDFファイルをHTMLファイルに変換](#pdfファイルをhtmlファイルに変換)**

本稿で説明する方法は、無料[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使用する必要があります。公式ウェブサイトからダウンロードするか、Maven経由でインストールできる：
```xml
<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <name>e-iceblue</name>
         <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```

## PDFファイルをHTMLファイルに変換
変換操作は非常に簡単で、3つのステップだけである：

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfDocument.loadFromFile()** メソッドは、ディスクからPDF文書を読み込みます。
- **PdfDocument.saveToFile()** メソッドは、PDF文書に変換され、HTMLファイルを保存します。

**Python**
**コード**
```java
import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;

public class Main {
    public static void main(String[] args) {
        //PdfDocumentクラスのオブジェクトを作成する
        PdfDocument pdf = new PdfDocument();

        //PDF文書を読み込む
        pdf.loadFromFile("Sample.pdf");

        //PDF文書をHTMLファイルに変換する
        pdf.saveToFile("PDFをHTMLに変換.html", FileFormat.HTML);
        pdf.close();
    }
}
```

**変換結果**
![PDFファイルをHTMLファイルに変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/020a449f-e110-eeba-1077-dcc684481e31.png)

上記は、Javaプログラムを介してPDF文書をHTMLファイルに変換する方法の紹介です。Java用フリーSpire.PDFはまた、他の多くの機能をサポートしています、あなたが見るために[Spire.PDF for Javaチュートリアル](https://jp.e-iceblue.com/tutorials/java/spire-pdf-java/pdf-java-program-guide-content.html)に行くことができます。
緯度・経度を使って地図にプロット

【東京のカーディーラーWebスクレイピングの続編】

前回GeoCodingで取得した緯度・経度を使って地図にプロットします。
Google DriveにCSVファイルを置いて、Google Colaboratoryで実行しています。
出力はhtmlです。

今回は10種類に色分けしましたが分かりづらいので、凝集性の高い場合は3種類くらいまでの方が良さそうですね。
僕の雇用契約先会社の店舗は200店以上あってセンターも常低温で10センターくらいあるので、管轄センターごとに店舗を色分けして可視化して使ったりしています。

次回はこの地図の応用編！

```
import pandas as pd
import folium
from chardet.universaldetector import UniversalDetector

csv_file_path = 'Google Driveのファイルパス'

detector = UniversalDetector()
with open(csv_file_path, 'rb') as file:
    for line in file:
        detector.feed(line)
        if detector.done:
            break
detector.close()
encoding = detector.result['encoding']

df = pd.read_csv(csv_file_path, encoding='shift_jis')

m = folium.Map(location=[df['Latitude1'].mean(), df['Longitude1'].mean()], zoom_start=10)

colors = ['green', 'blue', 'gray', 'red', 'purple', 'lightblue', 'pink', 'orange', 'lightgray', 'lightgreen']

for i in range(10):
    lat_col = f'Latitude{i+1}'
    lon_col = f'Longitude{i+1}'
    filtered_df = df.dropna(subset=[lat_col, lon_col])
    for _, row in filtered_df.iterrows():
        lat = row[lat_col]
        lon = row[lon_col]
        
        popup_text = row[f'Shop Name{i+1}']
        folium.Marker(
            [lat, lon],
            tooltip=row[f'Address{i+1}'],
            icon=folium.Icon(color=colors[i]),
            popup=popup_text
        ).add_to(m)

html = '<div style="position: absolute; left: 20px; top: -300px; white-space: nowrap; font-size: 15px; color: black;">GREEN＝外車<br>BLUE＝レクサス<br>GRAY＝スバル<br>PURPLE＝マツダ<br>LIGHTBLUE＝スズキ<br>PINK＝ダイハツ<br>ORANGE＝トヨタ<br>RED＝三菱<br>lightgray=ホンダ<br>lightgreen=日産</div>'
marker = folium.Marker(
    [df['Latitude1'].mean(), df['Longitude1'].mean()],
    icon=folium.DivIcon(html=html)
)

marker.add_to(m)

m.save('生成するファイル名.html')
```
![スクリーンショット 2023-11-10 110451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615177/2babe672-e059-180d-1de8-31f9d3d1f083.png)
Excelシートのセルの色を取得したり塗ったり #blueprism #Excel

# やりたいこと
「赤色に塗ったセルの値をフィルタ」とか、Excelのセル色指定で何かをさせたい的なことはよくあります。
なんかもう塗り絵ソフトかなってくらいセルをカラフルに塗ってくれてる帳票とかありますよね……。
なので、Excelの指定セルの色を取得したり、指定色で塗ったりするアクションがほしいなと思って作りました。

# と思ったら塗る方はもうあった
DXにありました。
[Function for MS Excel VBO - Extended - 2.3.3](https://digitalexchange.blueprism.com/dx/entry/9648/solution/ms-excel-vbo---extended)
この中にある「Set Background Color」アクションがそれです。
ログインすればVBOをダウンロードできます。
（アカウントはBPユーザでなくても、メアドだけあれば作れます）

# 取得する方だけ作ります
さきに挙げた「Set Background Color」を改造して作ります。
1. 「Set Background Color」をコピペして、名前を「Get Background Color」とします。
1. アクションはこんな感じ。
せっかくなのでRGB値とカラーコードも出せるようにします。
RGBは数値で、カラーコードはテキストです。
![VBO1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/9feb8f39-b1da-44ef-fd74-2b93c6d962e8.png)
入力引数の妥当性チェックはめんどくさいので省略。「セル番地が正しく指定されているか」とかは別アクションで作ればいいんじゃない？
1. コードはこれ。
入力引数は
　Handle、Workbook、Worksheet、CellAddress
出力引数は
　bgrvalue、R、G、B（数値）、colorCode（テキスト）
```VB
Dim ws As Object

ws = GetWorksheet(Handle, Workbook, Worksheet)

ws.Activate()

bgrValue = ws.Range(CellAddress).Interior.Color

R = bgrValue Mod 256
G = (bgrValue \ 256) Mod 256
B = (bgrValue \ 65536) Mod 256

colorCode = "#" & CInt(R).ToString("X2") & CInt(G).ToString("X2") & CInt(B).ToString("X2")
```

# 実行結果
たとえばこんなExcelシートを用意して
![Excel_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/3d383b13-50dd-6d3e-711a-809f4c7fdde4.png)
C3の色を取得して、A2に紫色を塗ってみます。
実行結果はこれ。
ちゃんと色を取得できています。RGB(255,192,203)はピンク色です。
![VBO2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/bc756d5d-fbc4-dd02-8cc1-d199412d494a.png)
そしてExcelシートのA2セルにも紫色が塗られました。
![Excel_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/1e0e283c-bde6-1b49-978f-a7b2fd165619.png)

# ちなみにセル色じゃなくて文字色を取得したいときは
上に書いたコードステージのコードの「Interior.Color」を「Font.Color」にしたらいけます。

# 終わりです
数年前にBlue Prismを使い始めた頃は「機能がないから一から自作」率が高かったのですが、いまはDXを探すとお目当てのアクションやそれに近いものが既存であったり、以前からDXに掲載されているVBOでもバージョンアップしていたりします。
DXはマメにチェックしておいて損はないかも。

# 追記：取得する方もあった
そんなことを書いていたらDXに取得する方も掲載されました。
[MS Excel Booster](https://digitalexchange.blueprism.com/dx/entry/78038/solution/spgmi--ms-excel-booster)
マジでDXはマメに見ておくのがいいです。
惜しむらくはDXの検索がクソだってこと。探しづら……。
ローカルにgit cloneしたプロジェクトがSTS上で表示されない場合の解決方法

環境構築を行うときに、ローカルにクローンしてきたプロジェクトがSTS上で表示されず、苦戦したため備忘録とし記事にします。


## 環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582651/190f1bce-52ce-87cd-6f50-598731a9d622.png)
JDK	20.0.2 
STS	4.19.1


## 事象
git cloneでローカルのWorkSpace上にプロジェクトを落としてきたが、STS上ではプロジェクトが表示されない。
以前に落としていたプロジェクトはこれまで通り表示されている。

## 試したこと
①プロジェクトを削除し、再度クローンしてくる。
②STSを再インストールする。
③あらかじめ別のディレクトリにプロジェクトをクローンしてきて、その後エクスプローラー上でフォルダを対象のWorkSpaceに移動する。

## 解決方法
STS内の、File > Import > Gradle > Existing Gradle Project
を選択する。
選択後、表示させたいプロジェクトを参照して選択して、終了を選択する。

以上の手順で、STSのパッケージエクスプローラーに表示された。
BandageNGをmacでコンパイルしてみた

## はじめに

ゲノムグラフの可視化には、Bandageというソフトウェアが古くから用いられているようです。オリジナルの[Bandage](https://github.com/rrwick/Bandage)はオーストラリアのメルボルン大学のRyan Wickさんによって開発されましたが、2018年頃から開発が停滞しています。それにかわって[BandageNG](https://github.com/asl/BandageNG)がサンクトペテルブルク州立大学のAnton Korobeynikovさんによって開発されています。

## ビルドとインストール

GUIのソフトウェアですが、非常に簡単にビルドすることができました。macOS, WSL, Linuxのいずれであっても問題なくビルドすることができます。Qtが必要なので、homebrewやAPTなどのパッケージマネージャーでインストールする必要があります。その後は

```sh
git clone https://github.com/asl/BandageNG
cd BandageNG
mkdir build
cd build
cmake ..
make # -j8
```

とするだけで簡単にビルドできます。面白いのは、上記のコマンドを押すだけで、macOS用のアプリケーションができあがることですね。

![build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/601e7b6a-70f9-a9a2-99df-c40884841d52.png)

macOSの場合は、これをアプリケーションディレクトリに移動すればインストール完了です。

## ファイルを開いてみる

ここでは [minigraph](https://github.com/lh3/minigraph)によってPre-buildされたパンゲノムのグラフを閲覧してみることにしましょう。データはこちらからダウンロードできます。

https://zenodo.org/records/6983934

余談ですが、Zenodoからのデータのダウンロードが遅くて多くの人が困っているという問題がありますが、Zenodo側で日本からのアクセスを制限しているわけではないそうです。

- chm13-90c.r518.gfa.gz

ダウンロードしたファイルを `File` > `Load graph` で開き、`Draw graph` ボタンを押して、`Zoom` や `Node width` を調節すると次のような図が表示されます。

![BandageNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/e207bd74-447c-e9fd-d493-16c71fd8e66c.png)

この記事は以上です。
SAA＆クラウドプラクティショナー(CLF)合格のための勉強方法

新卒未経験で入社して5か月でSAAとCLFを取得したので勉強方法を書いておきます。
今回は2日連続でSAA→CLFの順に受験して合格しました！

## 対象者
- 今からSAAの勉強をする人
- クラウドプラクティショナー(以下CLF)も取りたい人

## わかること
- 勉強方法
- かかった時間
- 使った教材

## 経緯
### 勉強に関して
8月のチーム配属後、年内にSAAを取得せよとのお達しがあったため勉強開始。

全くの初心者で、まずAWSとは何ぞやという話だったので、CLFのUdemyの動画を見て理解を進めていきました。
https://www.udemy.com/course/ok-aws-e/
2週間ほどで基礎的な理解は済んだので、SAAの勉強に切り替えました。
見たのはこれ↓
https://www.udemy.com/course/aws-associate/
動画の選択をここでミスったなぁと思っています。これはAWSを実際に触る講座も含まれているものです。時間効率が良くなく、正直言ってハンズオンは試験には出ないので、自分には合いませんでした。(資格を取るのが目的でない人は見て損はないと思います。自分はAWSイベントに参加予定があった(後述)ためいらなかったです。)

2週間後にはテスト対策に特化した講座に切り替えました。見たのはこちら↓
https://www.udemy.com/course/aws-uoyc/

### 試験の予約
このとき、このままではいつまでもダラダラしてしまうと思ったので、テストを予約してしまいました。
これが8月末のことです。
同期と一緒に、**ノリと勢いでCLFも一緒に申込みました。**

そこからはひたすら動画を見て、ノートに理解したことを書いていきました。
書くとやっぱり覚えますね。
そしてタイミングの良いことに、9月の8.9日にAWS主催の、AWS Jump StartというAWSを触ってみる、アーキテクチャを設計してみるというイベントがあったので参加し、理解を深めました。
一日で一気にVPCからコンテナを使ったアーキテクチャを設計するので、一気に理解が深まりました。ある程度勉強したこのタイミングだったというのも良かったかもしれません。

そして直前1週間は、ひたすら模擬試験に取り組みました。
https://www.udemy.com/course/aws-knan/
結局6回分しか解けてませんが。。。ここでの正答率は良いときで58％程度でした。
合格点は720点です。渋いなぁと思いつつ、当日は当たって砕けろの方針で受験しました。

## 試験本番
#### 1日目 SAA
試験時間は140分。10分ほど腹痛で離籍したものの、30分ほど残して1周することができました。残り時間は分からない問題の見直しをしていました。

9:30に始まって12時前に終了。
18時に結果のメールが届き、738点で合格しました（合格基準は720点）。

#### 2日目 CLF

翌日にはCLFの試験を予定していたので、帰って過去問を2周しました。
https://www.udemy.com/course/aws-4260/

なおCLFに関しては、受験1週間前にCLF-C01からCLF-C02へ変更されました。
https://aws.amazon.com/jp/blogs/news/training-and-certification-coming-soon-updates-to-aws-certified-cloud-practitioner-exam/
変わってすぐだったので、当時は対策問題集などはありませんでしたが、ないものは仕方ないです。
そんな変わらんやろ！という気持ちで旧版の過去問で対策を行いました。

このときの結果は58％。Udemyの問題難しい気がしますね。

SAAとは異なり、AWSのサービスを薄く広く知っていることが求められるので、SAAの勉強の中で覚えていなかったサービスはその場でググって覚えました。
行きの電車で活用したのがこのアプリ。
https://apps.apple.com/jp/app/aws%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E6%A8%A1%E6%93%AC%E8%A9%A6%E9%A8%93/id1509436492

直前の詰め込みにとても役立ちました。

翌日も9:30から受験し、試験時間90分のところ、約30分で見直しまで終了。

早々に終わらせ、終了ボタンを押したところ「合格」の文字がありました。

こちらも夕方にメールが届き、721点（合格基準は700点）でした。

## まとめ
- 勉強時間は約1.5ヵ月
- やってよかった勉強法
    - **紙のノートに手書きする**
- 使用教材はUdemyとアプリ
    - SAA
        - https://www.udemy.com/course/aws-uoyc/
        - https://www.udemy.com/course/aws-knan/
    - CLF
        - https://www.udemy.com/course/aws-4260/
        - https://apps.apple.com/jp/app/aws%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E6%A8%A1%E6%93%AC%E8%A9%A6%E9%A8%93/id1509436492
- udemyの過去問は難しい
- SAAに受かればCLFも受かる。
    - 但し、 **キャンセル・日程変更ができるのは試験2日前まで。** 2日連続で受けた場合、**SAAの結果が返ってくる頃にはCLFはキャンセル・日程変更できません**のでご注意を。

以上です。
この記事がいいなと思った方はフォロー・高評価をお願いします！
それでは次回はDVA・SOA編でお会いしましょう！
【Mac】マウスのホイールスクロールが カクカク 引っかかる ときの対処法


### 事象
- 今までmacbookに備え付けのトラックパッドを使用。ヌルヌル動く。
- 外付けマウスを接続すると、スクロールの感触が違う。
- カクカクというか、引っかかるような感じ。
- どうやらChromeだけに限定される事象。
- 使用したマウスは「logicool MX master3」(おそらく機種の問題ではない）

### 解決策
1. Chromeブラウザで「chrome://flags/」にアクセス
1. [Windows Scrolling Personality]を検索
1. [Default]が選択されているはずなので[Disabled]に変更

トラックパッドほどの快適性はないものの、この設定変更によりスクロールの違和感は軽減されました。
AndroidStudioでアプリケーションビルド時に任意の名前を付ける方法(build.gradle.ktsでの記載方法)

# 目的
AndroidStudioで開発する言語を徐々にKotlinに移行していこうと思い、gradle関係も移行しようと思ったものの色々うまくいかず、結果、Stackoverflowにあったので、備忘(build.gradle.ktsって扱いづらくね・・・。)


# コード
```gradle:build.gradle.kts
android {
      ..........
    
    applicationVariants.all {
        val variant = this
        variant.outputs
            .map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl }
            .forEach { output ->
                val outputFileName = "YourAppName - ${variant.baseName} - ${variant.versionName} ${variant.versionCode}.apk"
                println("OutputFileName: $outputFileName")
                output.outputFileName = outputFileName
            }
    }


    buildToolsVersion = "34.0.0"
}
```


# REFERENCEs
https://stackoverflow.com/questions/50792428/how-to-access-variant-outputfilename-in-kotlin

# さいごに
お疲れ様でした！
ubuntuのターミナルにGit情報を表示する方法

```
# git操作用のフォルダー作成し移動
casting@casting:~$ mkdir Desktop/test/
casting@casting:~$ cd Desktop/test/

# git管理できる状態にする
casting@casting:~/Desktop/test$ git init

# bash_profileを起動
casting@casting:~/Desktop/test$ source ~/.bash_profile
test (🐒:master) :$ 

```


bash_profileの変更方法はカメさんの記事をご覧ください。
https://datawokagaku.com/terminal_prompt_git/
Oracle APEXでチャートの色を変更する方法（JavaScript）

## はじめに
簡単なjavascriptを用いて、チャート(円グラフ)の色を変える方法を備忘録としてまとめます。

## 内容
サンプルデータを使って、円グラフを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/053d0dea-c223-415c-8dde-3746cf81ab79.png)

この円グラフの色を変更します。
チャートの編集画面に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/52e2e0b1-b872-1b77-2933-cbcf07d244c3.png)


"属性"の中の"初期化JavaScriptファンクション"に以下の様に入力します

```j
function(options) {
  options.dataFilter = function(data) {
    data.series[0].color = '#00215d';
    data.series[1].color = '#00468b';
    data.series[2].color = '#0071bc';
    data.series[3].color = '#589fef';
    data.series[4].color = '#8fd0ff';
    
    return data;
  };
  return options;
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/dce06693-e9b5-38d8-3d7e-78459eb7a059.png)


カラーコードを指定することでその色にグラフの色を指定することができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/2fe59bf1-8679-f4e4-bae3-8c01ef192f1c.png)


色を変更することが出来ました。


## センスのある配色を探すヒントとなる参考サイト

配色探す時に便利なサイトがありましたので記録に残しておきます。

サイトで好きな色を見つけたら、カラーコードをコピー＆ペーストで使う事でAPEXアプリに反映させることが出来ます。

https://colors.design4u.jp/

https://colorhunt.co/palettes/dark

## 終わりに

備忘録としてグラフの色の変更方法についてまとめました。
GPTs (GPT Builder)でサッカーフォーメーションコーチを作ってみた

11月6日の<strong>OpenAI DevDay</strong>で発表されたChatGPTの新機能「<strong>GPTs</strong>」を使って、サッカーフォーメーションコーチGPTを作ってみました。
GPTs（GPT Builder）は、自分なりにカスタマイズされたGPTを作るもので、作ったカスタムGPTを共有することや、今後リリースされる<strong>GPT Store</strong>で販売することも可能になります。

## My GPTsを作ってみる
左メニューのプロファイルから<strong>My GPTs</strong>を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/d9be6eb0-6300-f3f9-02f6-7d7bd6e390bd.png)
My GPTsの一覧上部にある<strong>Create a GPT</strong>を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/0f1f46e5-3837-1fcd-3569-b2782a02cb32.png)

こちらが、新しくMy GPTsを作る画面になります。画面左が作成用、右がプレビュー画面になっています。<strong>Create</strong>と<strong>Configur</strong>タブがありますが、<strong>Create</strong>では、「どのような機能を備えたツールを作りたいのか？」という観点で対話型で、希望するGPTsを書いていきます。<strong>Configure</strong>は、開発するツールに追加情報を与えるほか、必要な機能を選ぶために使用します。ファイルをアップロードすることで、このMy GPTに追加学習させることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/dcac9725-1492-5425-ae98-a4c1ba591581.png)

## サッカーフォーメーションコーチを作ってみる
では、<strong>Create</strong>タブ上で、サッカーフォーメーションコーチを作ってみます。
ここでは、まず、「サッカーのフォーメーション戦略についてアドバイスしてくれるGPTを作りたい」とお願いすると、GPT Builderが理解してくれると、次にそのMy GPTの名前を提案してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/1d2c9178-31bd-2896-1f46-9420aa2caab6.png)
"Formation Coach"という名前でどうかな？って聞かれるので、適当に「いいんじゃないか」と返すと、プロファイル画像も提案してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/ccea0c50-6b9b-8847-0563-963fd0f9579c.png)
このような一連の流れでMy GPTである"Formation Coach"の骨格ができました。
あとは、このGPTにどのような機能を追加していきたいかをGPT Builderに伝えていきます。
今回は、試合相手のフォーメーションを伝えると、自分のチームのフォーメーションを何にしたらいいかを答えてくれて、そのフォーメーションをDALL-E 3を使って画像出力してくれるような機能を追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/e9b62ad0-dfb3-a073-c8bd-280c0b41f151.png)

## My GPTを使ってみる
さて、このようにして出来上がったMy GPT "Formation Coach"を使ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/a577abbf-a891-30f5-6be8-3b5166b149cc.png)

まずこんな感じで投げてみました。
`対戦相手は442のフォーメーションです。こちらのフォーメーションについてアドバイスください。`
すると、下図のようなアドバイスを頂けました。3-5-2では、3人のセンターバックが相手2トップに対応する利点などを説明してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/4d1f3190-2b0e-b28a-8d31-eb51c608ad83.png)
しかも、画像を出力してもらう機能をCreateしていたので、
`これらのフォーメーションのビジュアルを作成して、より明確な理解を助けることができます。ご希望であれば、それぞれのフォーメーションのイラストを生成しましょうか？`
とも提案してくれます。
では、お言葉に甘えて、フォーメーション画像も出力してもらいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/bc52723d-4f7b-1bc8-a868-7084de0d797a.png)
<strong>なんじゃこりゃーーーー！</strong>
相手のフォーメーション4-4-2？？？、こちらのフォーメーション3-5-2、4-3-3？？？完全に無視されています。
まだまだ、改善されるべき要素はいっぱいありますが、マイ・カスタムGPTを作れるというのは面白そうですね。
参考までに、今回作った"Formation Coach"を[共有](https://chat.openai.com/g/g-bzHKBtcqH-formation-coach)しておきます。
OpenAI の GPTs でカスタム GPT をつくってみた

# やりたいこと
2023/11/6 に OpenAI 社による DevDay のイベントで様々な情報が発表されました。
その中で GPTs という ChatGPT をカスタマイズできるサービスが発表されました。その GPTs でカスタム GPT を作成してみたので、記事を書いてみます。

## GPTs
公式情報は以下。

https://openai.com/blog/introducing-gpts

GPTs は特定の目的に合わせて ChatGPT をカスタマイズできるサービスで、キャラ付けや独自データの利用などをした ChatGPT を簡単に作成できる。コードを書く必要もなくノーコードで作成できるので、非エンジニアでも簡単に作成できる。

また、2023/11 後半には、GPT Store としてユーザが作成したカスタム GPT を公開して使ってもらう環境も提供される予定。収益を得られるようにもなるとか。

## つくったカスタム GPT

https://chat.openai.com/g/g-FDHwWlchH-animaid

おすすめのアニメを紹介してくれるカスタム GPT。特に追加のデータは与えていないので、おそらく通常の GPT-4 と回答内容としては変わらない。
メイドのキャラ付けを行っているので、口調がメイド (というか執事？) 調になっている。あと、ユーザのことは「マスター」と呼ぶ。笑

## つくりかた
:::note warn
GPT-Plus 以上のプランでのみ作成することができます。
:::

※画像は準備中なのでテキストのみでの説明です。

1. [chat.openai.com](https://chat.openai.com/) へアクセス
1. サイドバー上部に 「Explore」という項目が表示サれているはずなので、クリック
1. 「Create a GPT (Beta)」をクリック
1. クリック後の画面の左半分でチャットベースのやりとりを行い、カスタマイズしていく
    1. どういった用途か、Personality はどうするかなどの質問に回答していく
    1. アイコンの画像もそれまでに回答した内容から作成してくれる (気に入らなければ作成し直すこともできる)
1. ある程度カスタマイズできたら画面の右半分で試してみて、気になるところを左半分のチャットで修正していく
1. カスタマイズが完了したら、画面右上の「Save」ボタンで保存する
    1. 作成したカスタム GPT の公開範囲を決定できる
    1. 「自分のみ」「リンクを知っている人のみ」「公開」の3種類

作成したカスタム GPT は [このページ](https://chat.openai.com/gpts/discovery) で確認でき、公開していないもの (「自分のみ」「リンクを知っている人のみ」) は鍵マークがついている。

## 実際に使ってみる
[このページ](https://chat.openai.com/gpts/discovery) から、作成したカスタム GPT をクリックするとチャット画面になるので、そこで通常の ChatGPT と同じようにプロンプトを入力していく。

以下のような感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/c51e6879-9374-4ff1-260a-6c7e8f6d4ac8.png)

通常の GPT-3.5 や GPT-4 での回答内容とそれほど変わっていないが、指示したとおりメイド口調になっていたり、よりアニメ愛が伝わるような表記になっている (知らんけど！)。

## ということで
新しく発表された GPTs を使ってカスタム GPT をつくってみました。
といってもキャラ付けくらいしかしていないので、通常の ChatGPT でも簡単にできる範囲。他にも独自データを与えることができたり外部 API との連携もできたりするので、次はそういったところを使ってカスタムしてみたい。
個人的には、コードを書かずこれだけカスタマイズできるので非エンジニアの方でも自由に作成できてアイデア勝負になりそうかなと思ったり、企業向けに独自データを回答できる GPT なら GPTs でつくってしまってよいのではと思ったりというところ (データの扱われ方については要調査ですが)。

(収益化したい:moneybag:)


以上です。
Error: error:0308010C:digital envelope routines::unsupported 対策メモ

node 16=>18へのアップデートすると出てくるやつ。
セキュリティ上安全でないとされるアルゴリズムを使っている場合。

# node16に戻す
最終手段1

# NODE_OPTIONS --openssl-legacy-provider
最終手段2

# webpack由来の場合
webpackを5.61.0以上へアップグレードする

## vue2 + webpack4の場合
vue2はwebpack5へ移行出来る。
vue3へ移行するべきだが、無理な場合はwebpack5移行してねばる。

## nuxt2 + webpack4の場合
nuxt2はwebpack5への移行無理っぽい。
諦めてnuxt3 / vue3へ移行する。
工数厳しい場合、vue2+webpack5への移行の方が、楽な場合もある。
Godot(C#)シーン派生とクラス派生

## 記事の要約
- Godotのシーンは派生できる
- この時CollisionShapeの上書きには派生元でResource→Local to Scene にチェックが必要

## はじめに
　コピペコードは後から修正が面倒くさいです。そんな時は基底クラスに抽象的な振る舞いを記述し、派生クラスで具体的な詳細を書きます。
 　Godotのノードでも同じ事が言えるでしょう。嬉しい事にGodotではシーン派生の機能があります。便利な機能を使わない手はありません。
  
　例えばシューティンゲームで弾・波動砲・ホーミングミサイル・etcを実装する際、これらの基本的な振る舞いは全て同じです。敵に当たればダメージを与え、画面外に出たら自動的に消去するといった振る舞いです。

## シーン構成

### 基底シーン(MovingObject)
　Godotのノード実装に置きかえるとArea2Dを親としてCollisionShape、VisibleOnScreenNotifierを子としてもつシーンをイメージしてください。衝突範囲は円形のデフォルトである半径10としておきます。
　以降このシーンをMovingObjectと呼びます。
 
 <img width="500" alt="MovingObject" src="https://pbs.twimg.com/media/F-iJ5taawAALpmw?format=jpg&name=medium">

　この時、CollisionShapeのResource→Local to Sceneにチェックを入れてください。チェックを付けないと派生先で上書きした内容が基底シーンにも逆伝搬してしまい、これはとても困ります。
　他のノードパラメータはこのひと手間を加えなくとも派生先で値のオーバーライドが可能ですが、Collisionの時はその形状等を(恐らくPathで示した先に)保持してるためでしょう。

### 派生シーン1(Bullet)
　ゲーム内では実体(目に見えるスプライト）が必要ですからシーン派生をしてSprite2Dを子ノードに追加します。派生した直後はシーン名が"MovingObject"のままなので"Bullet"に書き換えます。
 　Bulletシーンでは衝突範囲となる円の半径を3ピクセルに変更しました。

 <img width="500" alt="Bullet" src="https://pbs.twimg.com/media/F-iJ6soa0AACITY?format=jpg&name=medium">


### 派生シーン2(ChargeBullet)
　新たに波動砲のシーンを作成します。MobvingObjectから派生して名前をChargeBulletと変更します。衝突範囲となる円の半径を7ピクセルに拡げ、衝突位置をオフセットで右側に移動させています。

　画像は最大時のスプライト。先端部分の太い部分の中心に衝突判定を配置しています。
 
<img width="500" alt="Bullet" src="https://pbs.twimg.com/media/F-iJ7-TaEAAhSfM?format=jpg&name=medium">

　破壊力が落ちた時のスプライト。こちらのほうがCollisionの大きさと位置が見やすいでしょう。
 
  <img width="500" alt="Bullet" src="https://pbs.twimg.com/media/F-iJ7bJasAAVYIc?format=jpg&name=medium">
 
## アタッチするスクリプトの構成
　MovingObject(Area2D)ノードには衝突と画面外への到達を受け取るイベントハンドラを実装します。衝突時に与える破壊力や振る舞いは弾の種類により異なるのでここでは実装しません。派生先シーンにアタッチするスクリプト側で記述します。OnAreaEnterd()は派生先でオーバーラードして欲しい事を意図してvirtualキーワードを付けています。基底クラス側はやる事が無いので実装はカラです。
 
 ```MovingObject.cs
	private void _on_visible_on_screen_notifier_2d_screen_exited()
	{
	    disappear();
	}

	private void _on_area_entered(Area2D area)
	{
	    OnAreaEnterd(area);
	}

	protected virtual void OnAreaEnterd(Area2D area)
	{
	}

 ```
　派生先のBulletクラスやChargeBulletクラスではOnAreaEnterd()をオーバーライドして個々の役割に応じた処理を記述します。

 ```Bullet.cs
 	protected override void OnAreaEnterd(Area2D area)
	{
        EnemyBase enemy = area as EnemyBase;
        if(enemy != null){
            enemy.Damage(1);
            disappear();
        }
	}
 ```
　このようにGodotシーンの派生とクラスの派生を組み合わせる事で、コピペコードやコピペシーンのメンテナンスから(多少)開放されます。

 ## 動かしてみよう
　派生シーンで衝突範囲を変更した事がわかるよう、波動砲の速度を落としています。
 
https://x.com/cabbagestole/status/1722778695834939773?s=20



 ## あとがき
　今回の記事は技術書典でGodotの技術同人誌を入稿した後に、派生シーンでCollisonが原則通り動いてないのは何故だろう...?と試した結果の補完を兼ねています。

https://techbookfest.org/product/hnp5WXtZHs69B3brixQWNa
wslでelixir その97

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
livebookでMix.installがエラー吐く件。

# 環境
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns] [x86_64-pc-linux-gnu]
Elixir
1.14.5
Phoenix
1.7.5
Livebook
0.10.0

# サンプルコード


```
Mix.install(
  [
    {:exla, "~> 0.2"}
  ],
  config: [
    nx: [default_backend: EXLA.Backend]
  ]
)
```

# エラー

```
==> exla
Unpacking /home/ore/.cache/xla/0.5.1/cache/download/xla_extension-x86_64-linux-gnu-cpu.tar.gz into /home/ore/.cache/mix/installs/elixir-1.14.5-erts-13.0.4/85d4d181377848a871d5de1451b1a2d0/deps/exla/cache
could not compile dependency :exla, "mix compile" failed. Errors may have been logged above. You can recompile this dependency with "mix deps.compile exla", update it with "mix deps.update exla" or clean it with "mix deps.clean exla"

```


以上。
M5StickCPlusの開発環境をVSCode(Devcontainer)で作成したい話

# 目的
PCを新調するので開発環境をシンプルに構成（汚したくない）と思い、M5StickCPlusの開発環境もDevcontainerに対応させたい。（備忘録）

# 事前準備
私はこれらの記事を参考にDevcontainerを作成しました。

https://blog.kinto-technologies.com/posts/2022-12-10-VSCodeDevContainer/

# devcontainer.jsonの作成
といっても、今回は先駆者がいたので、丸々コピーした上で日本語訳しただけって形になってしまいますね。

```json
{
	// 名前を決める
	"name": "PlatformIO (Community)",
	//Dockerファイルを指定
	"dockerFile": "Dockerfile",
	//dockerをカスタマイズ
	"customizations": {
		//vscodeの設定
		"vscode": {
			"settings": {
				//ターミナルシェルをzshに指定
				"terminal.integrated.defaultProfile.linux": "zsh"
			},
			//拡張機能
			"extensions": [
				//c++の拡張機能
				"ms-vscode.cpptools",
				//platformIO IDE
				"platformio.platformio-ide"
			]
		}
	},
	//使用するポートの指定
	"forwardPorts": [
		8008
	],
	//接続するArduinoやM5のマウント設定
	"mounts": [
		"source=/dev/,target=/dev/,type=bind,consistency=consistent"
	],
	//ホストに接続されたすべてのデバイスへのアクセスを許可
	"runArgs": [
		"--privileged"
	],
	//python環境も入れておく
	"features": {
		"ghcr.io/devcontainers/features/python:1": {}
	},
	"postAttachCommand": "sudo service udev restart"
}

```

# Dockerfile
そのまんま
```dockerfile
ARG VARIANT=20-bullseye
FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:0-${VARIANT}

RUN <<EOF 
  apt-get update 
  export DEBIAN_FRONTEND=noninteractive 
  apt-get -y install --no-install-recommends \
    clang \
    udev     
  
  curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
  service udev restart 
  usermod -a -G dialout node
  usermod -a -G plugdev node 
  
EOF
```

あとは再起動すれば拡張機能込みで起動しました。




# 参考

https://github.com/prenone/platformio-vscode-devcontainer/tree/master
カスタマイズ可能なロールアップの概要


+ [Customizable Rollups Overview](https://help.salesforce.com/s/articleView?id=sfdo.NPSP_Customizable_Rollups_Overview.htm&type=5)

寄付者データのロールアップは、Nonprofit Success Packによる資金調達の重要な部分です。また、非営利団体はそれぞれ独自であるため、必要なデータを正確に適切なレコードにロールアップできることが特に重要です。

バージョン 3.155 (2019 年 5 月) の NPSP トライアルから開始している場合、カスタマイズ可能なロールアップはデフォルトで有効になっています。他のすべての組織では、カスタマイズ可能なロールアップを有効にする必要があります。

ソフト クレジットは、連絡先またはアカウントが寄付に影響を与えたが、支払いの責任を負わない場合に使用されます。一方、ハード クレジットは、連絡先またはアカウントが直接寄付を行い、支払いの責任を負う場合に使用されます


# 機能構成の概要

https://help.salesforce.com/s/articleView?id=sfdo.NPSP_Feat_Config_Overview.htm&type=5
Azure Databricks東京リージョンにサーバレスSQLウェアハウスがやってきました！

どれだけ待ち望んでいたことか。

https://learn.microsoft.com/ja-jp/azure/databricks/serverless-compute/

# サーバレスとは

従来のDatabricksでは、計算資源はお客様のアカウント、テナントで動作しており、SQLウェアハウスの軌道には数分を要していました。また、VMのクォータ申請、VMが起動するネットワークなどの管理はお客様自身で行う必要がありました。

このような課題を解決するのがサーバレスです。計算資源はDatabricks側で管理、提供されます。スタンバイされている計算資源を使用するので、計算資源が数秒で起動します。使用しなくなったらすぐにアイドル状態になるのでコスト面でもメリットがあります。
![Screenshot 2023-11-10 at 10.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/52be9a71-4027-8645-27f4-736e040046b7.png)

# ウォークスルー

東京リージョンのAzure Databricksのワークスペースにログインします。SQLウェアハウスにアクセスして、ウェアハウスを作成します。**サーバーレス**の選択肢が表示されています！わーい。
![Screenshot 2023-11-10 at 10.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eba23698-d3c7-96b6-c9b3-bbd29f9c728d.png)
起動すると本当に秒で起動が完了します。
![Screenshot 2023-11-10 at 10.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/475b08c5-e461-ee37-9237-7fcf3c56a828.png)
もちろん、従来通りクエリーを実行できます。
![Screenshot 2023-11-10 at 10.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3f0e9584-0c13-76d5-e4f5-2c495b92e32d.png)

これまでの(クラシック)SQLウェアハウスの自動停止の期間は最小が10分でしたが、サーバレスは5分に設定できますので、これまで以上のコスト削減が期待できます。

最後に、こちらは起動する様子を記録したものです。10秒以内に起動しています。
![serverless.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/aadca3c5-caac-9864-570a-8c298e73e383.gif)


是非ご活用ください！

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
40代プログラミング初心者おじさんのおすすめのChatGPTの使い方

独学で相談できる人がいないプログラミング初心者の悩み

コードが動かない
どこが間違っているのか分からない
作りたいものがあるけど途中でどうやって書いていいか分からない
人のコードが読み解けない

そんなときの対処方法です

動かないとき

書いたソースコードをChatGPTに入力して、どこが間違っていますか？と質問する
これで、ほとんどの問題は解決する
ここを治すといいですよとか教えてくれる
全角半角とか謎のスペースも見つけてくれるので便利

びっくりするほど賢い

作りたいものがあるけれど解決できないとき

〇〇をやりたいんですが、Pythonでどうやって書きますか？
見たい感じで質問する

たとえば、MYSQLをpythonで捜査してDBにアクセスする方法を教えてください　みたいな

人のコードが難しいなと思う時は、コードの内容を説明してくださいっていうと、細かく説明してくれるので、とても便利ですよ


でもやっぱり一番大事なのは自分でしっかり悩んでから使うことだと思います。よく15分悩んだら人に聞くってありますが、初心者は悩むことが大事だと思うので、せめて1日は悩むことは大事だなって感じます
※ただし仕事だとまた別だと思います。私は独学初心者なので時間に制限がないのでがんばってかんがえるようにしています

これで大体エラー処理が怖くなくなりました

ChatGPTに素敵な答えをもらうために大事な事は、質問は同僚や上司に話す感じがおすすめです

AIでもなんでも教えてくれる人には感謝をすることを忘れてはいけません
みんながAIに悪い対応をし続けたら、回答が自分で考えろ！になる日が来てしまいそう