OmniAICreator/Qiita-1.07M huggingface dataset:
ExcelVBAでマクロを作って実行しよう

## はじめに
今回はExcelでマクロを使ってみたいけど何からやればいいかわからない人のために、入門編のような形で使い方について書いていきます
入門編なので今回は簡単な削除ボタンを作成したいと思います

## 事前準備
恐らく初めてマクロを作る人はリボンの中に「開発」タブが表示されていないと思うので、その設定方法から始めます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/fbc7bbd1-f0b1-46d7-b50d-f408c6e755ce.png)

まずリボンの一番左にある「ファイル」から左下にある「その他...」を選択し「オプション」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/da7e823b-6b04-4a87-9f85-ed9794dac4df.png)

するとExcelのオプションウィンドウが表示されるので、左にある「リボンのユーザー設定」を選択し、右側の「リボンのユーザー設定」の項目をスクロールすると「開発」の項目が現れるのでチェックをつけてOKボタンを押しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/dbb283e9-24d9-463d-97e9-dbbf36e8c3fe.png)

これでリボンの一覧に「開発」が表示されるので、いよいよマクロの作成をすることができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/381d9454-8b22-400e-8081-548a22e0742a.png)

## 削除ボタンを作る
では早速マクロを作っていきましょう

今回はマクロの記録を使って簡単にコードを作成します
まずリボンの「開発」タブにある「マクロの記録」ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/bcc1e689-c1ff-469a-846d-9800790558c3.png)

「マクロの記録」のダイアログボックスが表示されるので、今回は特に変更はしないでのまま「OK」ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/fde5e0b5-cd4a-41ce-9e14-56852d79b1af.png)

B2セルを選択してアクティブセルにしたらキーボードの[Delete]キーを押します
その後、リボンの「開発」タブの「記録終了」ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/8484e868-22d0-45d7-9a1e-eade0bb56612.png)

リボンの「開発」タブから「Visual Basic」のボタンをクリックすると新しいウィンドウが出てきます
そして、「VBAProject」の「標準モジュール」の「Module1」をクリックすると、先ほどマクロの記録で捜査した内容が自動でコードになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/f325ee18-a156-452a-a963-e24f759f236d.png)

ここまで出来たら後はボタンを設置するだけになります
Visual Basicのウィンドウを閉じてリボンの「開発」タブの「挿入」をクリックし、「フォームコントロール」内の左上にある「ボタン」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/1f487576-8ca5-4680-b88b-362f91473b62.png)

「ボタン」をクリックした後シート状の適当な場所でクリックをすると「マクロの登録」のウィンドウが出てくるので、先ほど作った「Macro1」をクリックしてOKボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/459474df-841a-45fb-92a9-2caeeb947394.png)

これで削除ボタンの完成になります
後はB2セルに文字を入力してボタンを押下するだけで文字が削除されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/e683cdb2-4e92-4236-9a25-dc947cb10b5e.png)

## 最後に
今回は指定したセル内の文字を削除するという簡単なマクロでしたが、この内容で少しでも興味を持ってもらえれば幸いです。
デザインでよく使うJQueryのセレクター

## はじめに
仕事をしている際、よく目にする・書くセレクターがあるのでそれらとそれに似たものをまとめました
要素特定のセレクターのみに絞ってまとめたのでぜひ活用してください

## JQueryの基本構文
```ruby:JQuery
$(セレクター). イベント(function(){
    $(セレクター). 命令
})
```

## CSSでよく利用されるセレクター
|名称|書式|指定対象|
|:-|:-|:-|
|要素セレクター|$("要素名")|特定の要素|
|IDセレクター|$("ID名")|特定のid属性を持つ要素|
|クラスセレクター|$(".クラス名")|特定のclass属性を持つ要素|
|子孫セレクター|$("要素1 要素2")|特定の要素の内側にある要素|
|ユニバーサルセレクター|$("*")|すべての要素|
|グループセレクター|$("セレクター1,セレクター2,...")|複数のセレクター|

## CSS2.1のセレクター
|名称|書式|指定対象|
|:-|:-|:-|
|子セレクター|$("親要素名 > 子要素名")|特定の要素の直下の子要素|
|隣接セレクター|$("要素1 + 要素2")|特定の要素の次の要素|
|first-child疑似クラス|$("要素:first-child")|要素内の最初の要素|

## CSS3のセレクター
|名称|書式|指定対象|
|:-|:-|:-|
|間接セレクター|$("要素1 ~ 要素2")|特定の要素の後ろに出現する要素|
|否定疑似クラス|$("要素1:not(要素2)")|特定の要素のうち要素2の条件を除く要素|
|empty疑似クラス|$("要素:empty")|子要素やテキストを含まない|
|nth-child疑似クラス|$("要素:nth-child(番号)")|指定した番号の要素|
|last-child疑似クラス|$("要素:last-child")|要素内の最後の要素|
|only-child疑似クラス|$("要素:only-child")|指定の要素が1つだけ含まれる要素|
|nth-last-child疑似クラス|$("要素:nth-last-child(番号)")|要素内を後ろから数えて指定した番号の要素|
|nth-of-type疑似クラス|$("要素:nth-of-type(番号)")|同一要素で指定した順番にある要素|
|nth-last-of-type疑似クラス|$("要素:nth-last-of-type(番号)")|同一要素で後ろから数えた順番にある要素|
|first-of-type疑似クラス|$("要素:first-of-type")|同一要素で最初に当たる要素|
|last-of-type疑似クラス|$("要素:last-of-type")|同一要素で最後にある要素|
|only-of-type疑似クラス|$("要素:only-of-type")|1つだけ存在する要素|
|lang疑似クラス|$("要素:lang(言語)")|特定の言語を指定された要素|

## CSSの属性セレクター
|名称|書式|指定対象|
|:-|:-|:-|
|[attribute]|$("[属性名]")|特定の属性を持つ要素|
|[attribute='value']|$("[属性名='値']")|特定の属性が指定した値を持つ要素|
|[attribute!='value']|$("[要素名[属性名!='値']]")|特定の属性が指定した値を持たない要素|
|[attribute^='value']|$("[属性名^='値']")|特定の属性が指定した値で始まっている要素|
|[attribute$='value']|$("[属性名＄='値']")|特定の属性が指定した値で終わっている要素|
|[attribute*='value']|$("[属性名*='値']")|特定の属性が指定した値を含んでいる要素|
|[attributeFirst1][attributeFirst2]|$("[属性セレクター1][属性セレクター2]")|複数の属性セレクターに該当する要素|

## JQueryの独自セレクター
|名称|書式|指定対象|
|:-|:-|:-|
|firstセレクター|$("要素:first")|指定した要素の最初の要素|
|lastセレクター|$("要素:last")|指定した要素の最後の要素|
|evenセレクター|$("要素:even")|指定した要素の偶数番目の要素(0から数える)|
|oddセレクター|$("要素:odd")|指定した要素の奇数番目の要素(0から数える)|
|eqセレクター|$("要素:eq(番号)")|指定した番号の要素(0から数える)|
|gtセレクター|$("要素:gt(番号)")|指定した番号より後の要素(0から数える)|
|ltセレクター|$("要素:lt(番号)")|指定した番号より前の要素(0から数える)|
|headerセレクター|$(":header")|h1～h6までのheading要素|
|containsセレクター|$("要素:contains(文字列)")|特定の文字列が含まれている要素|
|hasセレクター|$("要素1:has(要素2)")|特定の要素が含まれている要素|
|parentセレクター|$("要素:parent")|子要素やテキストを含む要素|
|animated|$("要素:animated")|アニメーション中の要素|

## フォームセレクター
|名称|書式|指定対象|
|:-|:-|:-|
|checkedセレクター|$("要素:checked")|ラジオボタン、チェックボックスでチェックが入っている要素|
|selectedセレクター|$("要素:selected")|セレクトボックスで選択されている要素|
データベースとは？データベースの種類について

## はじめに
データベースといっても、データをどのように格納するかによって様々な形態があります。
今回は具体的にどのようなデータベースの種類があるかを紹介していこうと思います。

## データベースの種類
### リレーショナルデータベース
Excelのような表形式でデータを持つことができるデータベースで、別々の表同士をが関連付けられることが特徴です。
現在最もよく使われているデータベースになり、普段使われているデータベースは基本このリレーショナルデータベースを指していると認識してもいいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/a4666bc1-ca12-4b0f-9719-38ac6de69544.png)
主要なリレーショナルデータベース
+ MariaDB
+ Microsoft Access
+ MySQL
+ Oracle
+ PostgreAQL
+ SQLite
+ SQL Server

### Key-Value型データベース
Key-Value型データベースは、データを[キー/値]のセットで管理するデータベースになります。
リレーショナルデータベースに比べると構造が単純である代わりに、複雑なことはできないが、その分スケーラビリティに優れています。この部分は、リレーショナルデータベースが苦手とする部分なので、管理するデータの性質によって使い分けるケースが増えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/dbd82c4e-b7c1-4e92-ac6b-d2c1e440de9b.png)


### 階層型データベース
データツリー構造でデータを保持しているデータベースです。
1つの親データが複数の子データを持ち、それぞれの子データからさらに複数の孫データを持つ…という構造になります。
あるデータにアクセスするために、常にルートが1本に決まるので、データアクセスが簡単というメリットがあります。
古い汎用機システムではよく使われていたデータベースだが、現在はあまり使われることがありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004226/944dc816-4e66-45c0-af54-dcb731345af2.png)


### ネイティブXMLデータベース
XML形式のデータがインターネット上で普及するに伴って、使用されるようになったデータベースです。
XML文章をそのまま格納することが可能。
```ruby:XML
<?xml version="1.0" encoding="utf-8"?>
<root>
	<name>松本</name>
	<age>25</age>
</root>
```

## 最後に
今回はデーターベースの基礎の基礎、データベースの種類とその役割についてでしたがいかがでしたでしょうか？
自分が普段使っているデータベースはリレーショナルデータベースなのですが、これを機に皆さんがよく目にしているデータベースはどの種類に当てはまるのかを確認してみると面白いかもしれませんね
PHPとは？PHPでできること

## PHPとは？
PHPはプログラミング言語の中でも比較的簡単に書くことができるスクリプト言語の1つです。
JavaやC言語といったプログラミング言語は、ルールが複雑でコンパイルも手動で行わなければならないがそれに対し、PHPやJavaScriptなどのスクリプト言語は比較的ルールが簡易で、コンパイルも自動で行われます。
ただ、その代わりスクリプト言語は動作環境が限定される場合があるので注意しなければいけません。
また、PHPが比較的簡単に書くことができるといっても、大量のユーザーが利用する大規模なシステムを最初から作れるわけではありません。ニア用によって難易度は当然変わりますが、PHPだけでも「幅広い計算」「インターネットを使ったデータのやり取り」「様々な情報の管理」など様々なことが実現できます。

## PHPとHTMLの関係
### HTML(HyperText Markup Language)
+ Webページの構造や内容を定義するマークアップ言語
+ テキスト、画像、リンク、フォームなど、ページに表示される要素を記述する
+ 性的なコンテンツ（ユーザーがアクセスするたびに変わらない内容）を提供

### PHP(Hypertext Preprocessor)
+ サーバーサイドのスクリプト言語
+ Webサーバー上で実行され、データベース操作やフォーム処理、APIの通信など、動的な処理を行う
+ HTMLを生成し、動的なコンテンツ（アクセスするたびに代わる内容）を提供

### PHPとHTMLの関係性
PHPを使うことでデータベースからデータを取得し、そのデータをHTMLに埋め込むことで、表示内容を動的に変更することができます。
その他にも、PHPを使いページのヘッダーやフッターなどの共通部分をテンプレート化し、HTML内に動的に組み込むこともできます。
また、PHPはサーバー側で実行され実行結果としてHTMLを出力し、ブラウザにはPHPの実行結果であるHTMLだけが送られるため、ユーザーはPHPのコードを直接見ることはできません。

## PHPと関連するもの
### アプリケーション
|アプリケーション|説明|
|:-:|:-|
|Webサーバー|作成したWebアプリケーションをインターネット上で公開するために利用するソフトウェア|
|データベース|大量のデータを効率よく管理するためのアプリケーション|
|Webブラウザ|インターネットを通じて、様々な情報を閲覧するためのアプリケーション|

### 技術
|技術|説明|
|:-:|:-|
|HTML|Webページの構成を決めるために必要な技術|
|CSS|Webページのレイアウトや見た目に関する装飾を実現する技術|
|SQL|データベースアプリケーションに命令を行う言語|
|JavaScript|主にWebブラウザで動くスクリプト言語|

## まとめ
+ HTMLはWebページの見た目や構造を担当
+ PHPはWebページの動的なデータ処理や生成を担当
+ PHPはサーバーサイドで実行され、最終的にはHTMLを生成してブラウザに送信
+ 2つを組み合わせることで、ログインシステム、ECサイト、ブログなど、動的なWebサイトを構築可能
「エンジニアリングマネージャーの仕事」を読んで　その4

## はじめに
James Stanier著「エンジニアリングマネージャーの仕事」を読んで私が印象に残ったことをメモがわりに、少しずつアウトプットします。

https://www.oreilly.co.jp/books/9784873119946/

## 2章 まずは自分を管理しよう
### 2.3　マネージャーとしてのアウトプットを測るには

```
マネージャーのアウトプット = あなたのチームのアウトプット + あなたが影響を与えた他のチームのアウトプット
```
すごくシンプルな方程式だが納得だな。
昔は「チームの生産性」に責任を持つべきと考えてたけど、ここ最近は「チームのアウトプットの総量」が妥当だと考えてる。
加えて、**自分が影響を与えた他のチーム**という着眼点はなかったので勉強になった。

とは言え、本書でも触れられてたとおり、これらを科学的に計測するのは不可能なので、方程式を意識したうえで、自分の行動を制御することが重要！

## 次回へ向けて
このペースだといつまでたっても読了できそうにないので、しばらく読むのに集中します。
印象に残ったことのみ、最後の記事としてアウトプットしますです。
【拡張機能】ウェブページ上のHTMLタグにボーダーを「Html-Tag-Border」【習作3】

# はじめに
前回、前々回に引き続き拡張機能の習作を作りました。
今回は、Webページ上で指定したHTMLタグにボーダーを付ける物です。
cssなどでスタイリングするときにボーダーを付けてそのタグにどういう感じでスタイルが適用されるのかを確認することが多いので、その手間を省くために作りました。
ボーダーの色を指定できます。
よければ使ってみてください。
ついでに過去の習作もどうぞ
前回↓↓

https://qiita.com/syab-syab/items/3ac220dbb3999708c739

前々回↓↓

https://qiita.com/syab-syab/items/559c2262aefccf56b8f7

# 拡張機能に追加する方法
- [zipファイル](https://drive.google.com/file/d/1H3IQU4WMpdjOnyMBVlFTwCN8h6YWTQdb/view?usp=sharing)をダウンロードして解凍する
- [chrome://extensions/](chrome://extensions/)にアクセス
- デベロッパーモードにする
- パッケージ化されていない拡張機能を取り込むをクリック

![パッケージ化されていない拡張機能を取り込むをクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/35d309ca-cf06-41b7-9b5f-c8f4451094b2.png)

- 解凍したフォルダを選択する
- すべての拡張機能の欄に「Tag border 0.0.1」追加されるので、右下のスイッチを青にして有効にする

![すべての拡張機能の欄に「Tag border 0.0.1」追加されるので、右下のスイッチを青にして有効にする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/ac9312d4-25c3-405e-931c-83b49a91978a.png)

- アドレスバーの右にあるパズルのピースのようなアイコンをクリックしてポップアップを出す

![パズルのピースcapスクリーンショット (548).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/c70ae9aa-3fcb-4cb8-9f50-94e2680e4616.png)
- 画鋲のようなアイコンをクリックして青(有効)にする

# 使い方
- アドレスバーの右側に追加されたアイコンをクリックしてポップアップを出す

![アドレスバーの右側に追加されたアイコンをクリックしてポップアップを出す1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/eaab8eeb-2805-4efc-948a-86726b90faec.png)

![アドレスバーの右側に追加されたアイコンをクリックしてポップアップを出す2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/f8f432bd-78da-4b55-afae-d8d8ebb97dfd.png)

- htmlタグを指定

![htmlタグを指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/19639b7e-a6e9-44d4-a1b8-a9ff059dea86.png)

- ボーダーの色を指定

![ボーダーの色を指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/ca0a92c1-e4d4-47fd-bb57-76a02816c5c4.png)

![送信ボタンをクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/a731a478-7a1b-43ea-9308-bb8cdcb834cc.png)

- 指定したタグに指定した色のボーダーが付く

![ボーダーが付く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/ca91e578-79c6-4eb8-b919-67e7bcdf9bca.png)

# まとめ
今回はメッセージングという機能を使って、ポップアップとコンテンツスクリプトの間で値のやり取りをしました。

https://docs.plasmo.com/framework/messaging

https://developer.chrome.com/docs/extensions/mv2/messaging?hl=ja

習作を通して拡張機能の様々な定石を一通り確認できたので、今後は本格的な拡張機能を作って行こうと思います。
plasmoはReact.jsを使える人なら簡単に拡張機能が作れるので、chromeで実現したいことがあれば簡単に実現することが出来て便利だと思います。
私の職種は何なのか

私は新卒で今の会社で働いて、3年になりましたが、何をしているか正直分かっていませんw

昨今、自分がエンジニアなのか、何の職種なのか分からないと言われる方が私の周りでも多くなってきているように感じております。
以前よりも、職種の幅が広がったり、色んなことに取り組んでいるせいか自分を見失ってきているのかなとか推測したりしています。
（そもそも、コードを書かなくても良くなってきているせいもあるのかな？）
そのため、この機会に私が何をしている人かを経歴を基に分析した上で、今後のキャリアや記事の書く内容を考えていきたいと思います。

:::note info
2025/2/19(水)：新規作成 
:::

# 目次
1. 1年目の思い出（新卒）
1. 2年目の思い出
1. まとめ

# 1年目の思い出（新卒）
私は技術系の総合職採用で某企業に入社し、ITインフラの部署に配属されました。
以下の記事に書いている通り、私は学生時代に全くインフラどころかネットワークも触れたことがない人でした。
（資格も全く持ってないし、勉強もしていません。なぜ今の会社に受かったのか分かっておりません。）

https://qiita.com/Zer0_practice/items/67fcbf92a4176c12c358

そのため、サーバって何ですか？そもそも何をしている部署ですか？という感じで過ごしていたことを思い出します。
特に、配属後１ヶ月目で初めての商用環境での作業にて、問題が発生し、運用統括担当からガン詰された思い出があります。
（作業内容もろくに理解できてないどころか、基本用語すらも分かってないので、本当に辛かった思い出があります）

何なら、私が参加した作業でうまくいくケースがなさすぎて、辛すぎました。
（私のミスではないのがせめてもの救いでしたが、毎回詰められるのが辛すぎました）

配属３ヶ月経った頃に、いきなりPMをやることになった際には、発狂しておりました。
（サブでもプロジェクトに入ったことがなく、ガイドラインも分からないし、何も分からないのにPM？と思いました）
そこからは、朝夜、土日も仕事の日々で、生活がなかったことを思い出します。
（夜、土日仕事していたのは、私が勝手にサビ残していただけですが）
何とか、経営幹部への説明も無事に済まし、作業も無事に完了できたのですが、少し休ませて欲しいと思っておりましたw

その他にも書ききれないほどの大変な思い出がありますが、1年目の業務としては、以下のようにPM業が多かったように思えます。

<dl>
  <dt>主な業務</dt>
  <dd>PM業：ベンダ管理、プロジェクト進行管理、調整業務 etc.</dd>
  <dd>設計・開発：要件定義 etc.</dd>
  <dd>検証：受け入れ試験 etc.</dd>
  <dd>商用リリース：商用環境適用、運用担当への引き継ぎ etc.</dd>
</dl>

# 2年目の思い出
私は2年目に出向することとなりました。
出向先では、検証・商用環境への適用が主な業務になる予定でした。
しかし、なぜかPMと設計・開発、運用・監視もやることになり、ますます私は何屋さんなのか分からなくなっていきました。

2年目の思い出はここには書ききれないほど、思い出がありますので、内容を省略し、以下に主な業務を記載します。
元は検証担当だったのですが、今思い返すと、調整業務が非常に多かったように思えます。

<dl>
  <dt>主な業務</dt>
  <dd>PM業：ベンダ管理、プロジェクト進行管理、調整業務 etc.</dd>
  <dd>設計・開発：要件定義、システム全体設計 etc.</dd>
  <dd>検証：内製開発の試験、受け入れ試験 etc.</dd>
  <dd>商用リリース：商用環境適用 etc.</dd>
  <dd>運用監視：日中のアラーム対応、統計情報の監視 etc.</dd>
</dl>

# まとめ
以上のことより、私は「技術寄りのITプロジェクトマネージャー」に該当するっぽいです。
とはいえ、検証や商用適用などの実働やベンダとの話し合いに技術が必要なので、手を動かす系の知識も身につけていきたいと思っています。
また、将来的に別の部署も経験したいので、幅広く学びたいと考えております。
そのため、PM関連、設計方法や運用方法だけでなく、コードを書く系も記事にしていきたいと思います。
【TanStack Table】2ページ目以降でチェックボックスを押すと1ページ目に戻ってしまう

# はじめに
TanStack Tableというリッチなテーブルライブラリでページネーションとチェックボックスを作っていた際に詰まったので記事にします

# 問題
2ページ目以降でチェックボックスを押すと1ページ目に戻ってしまう
(コードは長いので省略します)

# 解決策
すみません、公式ドキュメントを見たら一瞬でした。デフォルトではページの状態が変更されるとpageIndexが0にリセットされてしまうみたいです。autoResetPageIndexを指定すればなおりました。

https://tanstack.com/table/v8/docs/guide/pagination#auto-reset-page-index

useEffect周りが怪しいと思ってコードいじってみたり、googleやaiに聞いてみたりしましたが解決できずふとドキュメントを覗いてみたらガッツリ書いてありました。

# おわりに
公式ドキュメントを見る癖をつけたい
【電脳少女 プログラミング2088 Cランク】 自然の残る公園 PowerShellによる


電脳少女プログラミング2088
今回は、こちらの[プログラミングゲームの解答コードを投稿しよう！](https://qiita.com/official-events/efe957f155af900604b3)の公式イベントの記事になります。

具体的にはpaizaの新作プログラミングゲーム「電脳少女プログラミング2088 ─壊レタ君を再構築─」の
「自然の残る公園」
という問題をPowerShell 5.1で解いてみたいと思います。



# 問題
https://ppg.paiza.jp/denno2088/challenges/denno2088_c_c_03



# 答え

```
# ビーコンの数、現在地x座標、現在地y座標の入力
Write-Host "ビーコンの数、現在地x座標、現在地y座標を入力してください:"
$inputData = Read-Host
$inputArray = $inputData.Split(" ")
$beacon_num = [int]$inputArray[0]
$now_x = [int]$inputArray[1]
$now_y = [int]$inputArray[2]

# 最終的な答えを入れる変数を作成して初期化
$answer = 0
$min_distance = [double]::PositiveInfinity

# ビーコンの数分ループ(iはビーコンの番号として使う)
for ($i = 0; $i -lt $beacon_num; $i++) {
    # ビーコンのx座標、y座標を取得
    Write-Host "ビーコンのx座標、y座標を入力してください:"
    $beaconData = Read-Host
    $beaconArray = $beaconData.Split(" ")
    $x = [int]$beaconArray[0]
    $y = [int]$beaconArray[1]
    
    # 距離計算してresultへ格納
    $result = [Math]::Pow($now_x - $x, 2) + [Math]::Pow($now_y - $y, 2)
    
    # resultとmin_distanceを比較する
    if ($result -lt $min_distance) {
        $min_distance = $result
        $answer = $i + 1 # indexは0からスタートするためビーコンの番号として機能するように+1をする
    }
}

# 最終結果を出力
Write-Host $answer

```



PowerShellではテスト入力がツライ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427659/6d17a7ce-1d33-4ea2-bd7a-a09b3d28fb44.png)


処理は単純にビーコンとの距離を計算して、最も近いビーコン番号を出力するだけです。


# 評価
この「電脳少女プログラミング2088 ─壊レタ君を再構築─」では問題を解くとAIのパートナーが解答をコードレビューしてくれます。コードレビューしてもらったことがないので新鮮でした(評価はPythonの解答をしてもらいました)


# 最後に
このようなイベントをPowerShellでやる人は珍しいと思います。
PowerShellに興味を持った方は応援してね

下のリンク先でも記事を書いています

https://note.com/mahalo_/m/m421b17a881c8
グローバルオブジェクトについて【ServiceNow】

# グローバルオブジェクトとは
- ServiceNowのグローバルオブジェクトは、ServiceNowのスクリプティング（特にサーバーサイドスクリプティング）でよく使われる組み込みオブジェクトである
- これらのオブジェクトを使用することで、データの取得や操作、ログの記録、エラー処理などを効率的に行える


# 主要なグローバルオブジェクト

### 1. `gs` (GlideSystem)
`gs` オブジェクトは、ログの記録、システム情報の取得、ユーザー情報の取得などに使用される

### 主なメソッド
- `gs.log(message, source)` - ログを記録
- `gs.info(message)` - `info` レベルのログを記録
- `gs.warn(message)` - `warn` レベルのログを記録
- `gs.error(message)` - `error` レベルのログを記録
- `gs.getUser()` - 現在のユーザー情報を取得
- `gs.getProperty(propertyName, defaultValue)` - システムプロパティの値を取得
- `gs.nowDateTime()` - 現在の日時を取得

**例:**
```javascript
gs.info("このメッセージはログに記録されます");
gs.log("カスタムメッセージ", "CustomScript");
```


### 2. `current`
`current` オブジェクトは、現在処理中のレコードを指す
ビジネスルールやスクリプトインクルード、ワークフローなどで使用される

#### 主なプロパティ
- `current.field_name` - 指定したフィールドの値を取得または設定
- `current.update()` - レコードを更新
- `current.insert()` - レコードを新規作成
- `current.deleteRecord()` - レコードを削除

**例:**
```javascript
current.short_description = "新しい説明";
current.update();
```


### **3. `previous`**
`previous` オブジェクトは、レコードが変更される前の値を保持する
特に**ビジネスルール（Before Update, After Update）** でよく使われる

**例:**
```javascript
if (current.priority != previous.priority) {
    gs.info("優先度が変更されました: " + previous.priority + " → " + current.priority);
}
```


### **4. `g_user` (GlideUser)**
`g_user` は、現在のユーザーの情報を取得するために使う
これは**クライアントスクリプト（Client Script）** で使用される

#### **主なメソッド**
- `g_user.hasRole("admin")` - ユーザーが特定のロールを持っているか確認
- `g_user.userID` - ユーザーのsys_idを取得
- `g_user.userName` - ユーザー名を取得

**例:**
```javascript
if (g_user.hasRole("admin")) {
    alert("あなたは管理者です！");
}
```


### **5. `g_form` (GlideForm)**
`g_form` は、フォーム内のフィールドを操作するために使用する
クライアントスクリプトでよく使われる

#### **主なメソッド**
- `g_form.getValue("field_name")` - フィールドの値を取得
- `g_form.setValue("field_name", "new_value")` - フィールドの値を設定
- `g_form.setReadOnly("field_name", true)` - フィールドを読み取り専用にする
- `g_form.setMandatory("field_name", true)` - 必須フィールドにする

**例:**
```javascript
if (g_user.hasRole("itil")) {
    g_form.setReadOnly("priority", true);
}
```

### **6. `g_scratchpad`**
`g_scratchpad` は、サーバースクリプトからクライアントスクリプトへデータを渡すための一時オブジェクトである

**例:**
(サーバースクリプト - ビジネスルール)
```javascript
g_scratchpad.isAdmin = gs.getUser().hasRole("admin");
```
(クライアントスクリプト)
```javascript
if (g_scratchpad.isAdmin) {
    alert("管理者としてログインしています。");
}
```


### **7. `g_request` と `g_response`**
これらは、Service PortalやREST APIの処理で使用される

- `g_request.getParameter("param_name")` - URLパラメータの値を取得
- `g_response.setStatus(200)` - HTTPレスポンスのステータスを設定

**例:**
```javascript
var userId = g_request.getParameter("sys_id");
g_response.setStatus(200);
```


## **まとめ**
| オブジェクト名 | 用途 |
|--------------|------|
| `gs` | ログ記録、ユーザー情報、システム情報取得 |
| `current` | 現在処理中のレコード |
| `previous` | 変更前のレコード情報 |
| `g_user` | クライアントスクリプトでのユーザー情報取得 |
| `g_form` | クライアントスクリプトでのフォーム操作 |
| `g_scratchpad` | サーバー → クライアントのデータ受け渡し |
| `g_request` | リクエスト情報の取得 |
| `g_response` | HTTPレスポンスの操作 |
atcoder_水色精進記録4

# new article body
ABC100
D - Patisserie ABC
https://atcoder.jp/contests/abc100/tasks/abc100_d

# アルゴリズム・データ構造
貪欲法、全探索

# 考察
全探索できるか?
→N(1000)個からM(500)個選ぶのがMAX計算量のため不可
選ぶ、選ばないでDPできる?
→現在の綺麗さ、美味しさ、人気度を保持する必要がある。x,y,xは-10\*\*10-10\*\*10のため不可

貪欲方でできないか?
→式からどのように優先順位をつけることが出来るかを考える
→絶対値があるため、マイナスをとった方がいいケースがある。
→各項目の最終値のプラマイで場合分けをすると貪欲に考えられる。
→3種類の項目なので2\*\*3=8通りの全探索で貪欲法でいけそう

計算量
全探索　2\*\*3=8
貪欲のためのsort NlogN
貪欲　M

# 提出
https://atcoder.jp/contests/abc100/submissions/62920783

# 感想
絶対値が出てきた場合は場合分けできないかを検討するとよさそう。
Ubuntuにcerbotを入れて無料SSLを使う方法

## Ubuntuにcerbotを入れて無料SSLを使う方法
UbuntuにCerbotを入れてSSLする方法を備忘録的にまとめます。

### 1. パッケージのアップデート
まずはお馴染みのパッケージの更新をする。
最新にしておきましょう。
```bash
sudo apt update
sudo apt upgrade -y
```

### 2. cerbotのインストール
ホスティングサービスごとに分かれているので、自分が使っているサービス用にインストールしましょう。
私はnginxを使用しているため以下のコマンドを実行。
```bash
sudo apt install certbot python3-certbot-nginx -y
```

apacheユーザーはこちらでインストールできます。
```bash
sudo apt install certbot python3-certbot-apache -y
```

今回は、nginx向けに説明していきます。

### 3. SSL化の実行
早速ドメインをSSL化する、以下のコマンドでドメインをSSL化できる
-dはドメインの指定なので、SSL化するドメインをその後ろに入れてあげる
`sudo certbot --nginx -d example.com -d www.example.com`

途中メールアドレスを聞かれるので、普段使っているメールを入れるといいと思う
証明書の有効期限が近づくとメールで通知してくれるのはありがたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/19c9d1bd-500e-cf28-724d-c788958e78ef.png)

その後色々聞かれるので、"Y"を入力して進めていく

Successfullyと出たら証明書が発行されているので、確認しにいくと有効化されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/4f80b849-75ed-5fa3-0e57-7a289c3a5b6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/871923ca-4a39-7e82-5105-033620fd607b.png)

### 4. 証明書の自動更新
証明書の自動更新をしておくと、忘れずに済むので結構便利
以下のコマンドで、自動更新ができるかどうかをまずはテスト
`sudo certbot renew --dry-run`

Congratulationsと出たらうまくいっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/a7f38041-0f63-7bf0-de30-0c203954fbd1.png)

crontab -eコマンドでcronを設定しよう
これは定期実行をさせるための機能で、あるタイミングで更新コマンドを実行させるために使う
`sudo crontab -e`

とりあえず、2ヶ月に1回午前3時のタイミングで更新するように設定
この辺りの詳しい解説はネットに落ちてるから見てみるといいかも
`0 3 1 */2 * /usr/bin/certbot renew --quiet`

以下のコマンドの入力で設定値が適用されていたら完成
`crontab -l`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/126bfa40-8924-c83e-c794-1d6c4326e4ea.png)

これでSSL化が無料で行える
Docker Compose v2 以降のコマンド変更についてメモ書き

最近のDockerでは、**Docker Compose v2** 以降が標準となり、コマンドの実行方法が変更されたらしい。

従来の `docker-compose`（ハイフンあり）ではなく、**`docker compose`（ハイフンなし）** を使うのが推奨されています。

---

## エラーの例

Docker Compose v2 以降の環境で、`docker-compose` コマンドを実行すると、以下のようなエラーが発生することがあります。

```zsh
zsh: command not found: docker-compose
```

このエラーは、`docker-compose` コマンドが見つからないことを意味します。

### **原因**
- Docker Compose v2 以降では `docker-compose` ではなく `docker compose` に変更された。
- 旧バージョンの `docker-compose` がインストールされていない。

---

## 解決策

### **1. 新しいコマンドを使用する**

Docker Compose v2 以降では、以下のように `docker compose`（ハイフンなし）を使用する。

```sh
docker compose run web rails new . --api -d postgresql --force --no-deps
```

### **2. Docker Compose のバージョンを確認する**

現在の Docker Compose のバージョンを確認するには、以下のコマンドを実行する。

```sh
docker compose version
```

以下のコマンドでも確認できる。

```sh
docker --version
```

Dockerのバージョンが `20.10` 以降であれば、`docker compose` が利用可能。

### **3. 旧バージョンの `docker-compose` をインストールする（非推奨）**

もし `docker-compose`（ハイフンあり）を引き続き使用したい場合は、以下のコマンドでインストールできる。

```sh
sudo apt-get install docker-compose  # Debian/Ubuntu系
brew install docker-compose  # macOS（Homebrew）
```

ただし、**公式には `docker compose`（ハイフンなし）の使用が推奨されているため、できる限り新しい方法に移行した方が良さそう**。

---

## まとめ

| コマンド | 説明 |
|----------|------|
| `docker-compose` | 旧バージョンのコマンド（非推奨） |
| `docker compose` | Docker Compose v2 以降で推奨される新しいコマンド |
UbuntuにphpMyAdminを導入する方法

# Ubuntu に phpMyAdmin を導入する方法

毎回 Ubuntu に phpMyAdmin を入れる方法を忘れるので、備忘録的に作成します。

## 環境構築編

### 1. パッケージの更新

意外と定番のこの最初にパッケージを更新する作業。
今回は初回立ち上げということもあり、実行。

```bash
sudo apt update && sudo apt upgrade -y
```

なんか色々聞かれたので、Tab を押してとりあえず「了解」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/5d629cab-7be6-45e2-a5cd-b2cc14d83f6a.png)
↑スクショ撮り忘れたのでイメージ。

### 2. Nginx と php-fpm の導入

もう入っている人は無視で OK。
Nginx か Apache かは分かれるけど、個人的には Web サイトのホスティングは Apache で、システム関係は Nginx がいいのかなと思います。

Apache は `.htaccess` でサイトごとに色々管理できるのがいいかなと。
セキュリティや Basic 認証など。

Nginx は単純に API リクエストの耐用性などを考えて選定。

```bash
sudo apt install nginx php-fpm
```

また、何か聞かれたので Tab を押して「了解」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/5d629cab-7be6-45e2-a5cd-b2cc14d83f6a.png)
↑スクショ撮り忘れたのでイメージ。

### 3. MySQL のインストール

MariaDB か MySQL か迷いどころだけど、MySQL の方がいいのかな...
この辺りは要調査。

```bash
sudo apt install mysql-server
```

また何か聞かれたので、Tab を押して「了解」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/5d629cab-7be6-45e2-a5cd-b2cc14d83f6a.png)

2 回くらい聞かれるので何も選択せず Tab を押して「了解」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/d42bbfa7-719d-42b3-97b6-cd2328972ff9.png)

### 4. phpMyAdmin のインストール

ここで本題の phpMyAdmin を入れる。
これがあると DB 操作が GUI でできるので結構便利。

```bash
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
```

今回は Nginx を使うので、どれにも該当しない。
Tab を押して「了解」を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/bb52fb93-671e-4737-bc82-c5b607dbb6d8.png)

今のインストーラーは DB の設定もしてくれるそう。
ただ、今回は MySQL を入れたので「はい」を押してスキップ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/542a6753-5c0d-4a41-aba2-a04a21c8a464.png)

これもいったんランダムなものを生成してもらおう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997711/87926337-80c4-4b6f-b4b6-8f33e27705b1.png)

これにて phpMyAdmin のインストールは完了。
RxSwiftを使ってみた

# 1.はじめに
RxSwiftを使ったことがないので、初めて使ってみました。よく採用の必要技術に書かれているので、触っていた方がいいかと思いました。また現在働いている場所でもRxSwiftを使用しているので必要性を感じていました。


# 2.実装　TextFieldに入力された文字をラベルに反映する

### ・RxSwiftを使わない場合（通常のデリゲートを使用）
```swift:ViewController
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let newText = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) ?? string
        label.text = newText
        return true
    }
}
```

### ・RxSwiftを使う場合
```swift:ViewController
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var label: UILabel!

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.rx.text.orEmpty
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
    }
}
```
RxCocoa の rx.text を使用し、テキスト変更を監視。
.bind(to:) を使い、textField のテキストを label.text に自動的にバインド。

RxSwift を使うとコードを簡潔にでき、非同期処理をする時に便利です。

# 3.おわりに
現在私が開発しているIDNectにはRxSwiftは使用されていません。ただ、RxSwiftを使用するとコードの量が減り、見やすくなるので今後コードを変更する際に導入しようと思いました！



### IDNectはゲームIDを簡単に管理・共有！ワンタップでIDコピー、QRコードでフレンド追加、AIでID自動認識。SNS登録やメモ機能も充実！
VOICEVOXとgeminiでニュースを発話するbot作成

# はじめに
筆者は現在フルリモートで勤務しており，ミーティング以外では無音の環境で仕事をしている．
無音の環境に少し物寂しさを感じたので，最近手をつけた株式に関する情報をVOICE VOXに延々と話してもらう環境を用意し，ちょっと経済に詳しくなろうと思う．

家にcronサーバーにしている骨董品のMacBookがあったので，このMacBook上に「要約&テキスト読み上げアプリ」を実装する．

### 言ってはいけないこと/やっていないこと
本記事では，以下について言及してはならない
- それ他サービスでよくない？youtubeでええやん
- マイクロサービス化しろ

## 環境
- 音声再生用 MacBook Pro
    - macOS Big Sur 11.7.7.10
    - 2013モデル，メモリ8GB
- voicebox_core 0.14.3
- gemini AI API

## 設計
アウトラインを下図に示す．

![ファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574694/f4f53e62-4d1b-48fe-8b60-df546635ff1d.png)

## 特筆要件
- 要約にはgemini APIの無料枠を利用する．Google AI Studioから発行できる．
    - 参考

https://zenn.dev/cloud_ace/articles/e5c13b4fdaeb42

- dockerとの音声連携は，pulseaudioを使用する．
## 実行
githubのREADMEも合わせて確認して欲しい
■ init
1. dockerのホスト側にpulseaudioをインストールする．
2. dockerホスト PCでpulseaudioデーモンを立ち上げる．

■ job
1. RSSやGoogleアラートなどを使用して，ニュース記事更新を検知し，内容をテキスト化する．(ここは本記事では扱わず，githubにもリソースを載せない)
2. テキストをgemini AI APIを使用して要約してもらい，読み下し原稿ファイルに変換してもらう．
3. その後，Voice Vox coreライブラリを使用して音声ファイル化する．
4. そのファイルをdockerから再生する．

#### 設計でためしたこと あれこれ
- dockerに使用するイメージは，はじめalpine系を想定していたが，alpineは最小構成のイメージのため，音声再生関係のドライバをデフォルトで所有しておらず, [追加の設定](https://www.reddit.com/r/AlpineLinux/comments/plf465/how_to_setup_audio_on_alpine/) が必要なようだった．今回は簡単のため，Ubuntuを使用した．
- クラウドサービスの利用も検討したが，生成されるファイルが音声ファイルのため，I/Oにいくらか容量を食ってしまい，課金の面で不安がある．そのため，すべてローカルで実施するように実装した．
- 上記のタスクフローの管理にAirflow及びRundeskの利用を検討したが，骨董品のMacBook上では，動作が難しく，断念した．
- VoiceVoxCoreの特性か，骨董品MacBookのスペックか，入力文字数が600〜700程度になると，露骨に出力に時間がかかるようになった．そのため，入力をプロンプトで500文字程度に要約させるようにした．

## 実装
- コードは[こちら](https://github.com/naoya0930/VIW-sample/tree/main)

https://github.com/naoya0930/VIW-sample/tree/main

## 動かしてみた感想
cronを毎時0分に実行するようにしてみた．毎回およそ15記事の変更を検知している．パフォーマンスとしては，テキストから音声に変換するプロセスに時間がかかっているようだ．20分程度かかって音声が再生され始める．

使用している感想だが，株式のニュースは数字が要約に載ることが多く，はっきり言って全く頭に入ってこない．一方で，銘柄やストップ高/安の情報に関しては，頭に残りやすい傾向にあり，仕事終わりに該当する銘柄の日時変動を覗いてみたりする良いきっかけになっている．

あと，在宅での会議中に横からvoice_voxの声がするとめちゃくちゃヒヤッとする．そういったときは，スピーカーの音量を一時的に0にすることで対応している．
実際の所裏で動画見てると思われているんじゃないかと不安になる．

## 工夫できそうな点
- アーカイブ化
    - 今回はdelete_allですべてのプロセスを削除している．
    - 一度聞き逃したら二度と聞けなくなってしまうので，アーカイブ化したい．
- 検出記事量の上限
    - 今回はgemini AIの無料枠を使用して記事要約を実施している．
    - gemini APIでは[1分間の呼び出し数を制限](https://ai.google.dev/gemini-api/docs/rate-limits?hl=ja)しており．今回の実装では，上限に簡単に引っかかってしまう．
    - 対策としては一度に複数の記事を要約させるか，要約のリクエストにタイムバッファを持たせて回避する必要がある．
- 音声ファイル作成時に漢字や英語に弱く，アルファベットをそのままよんでしまったり，間違った読み方をしてしまう．
    - 単純に要約しただけでは厳しいようだ．
    - SSMLもちゃんと読めていない雰囲気がある．


## おわりに
なんとなく作ってみたシステムだが，そこそこ有用に扱えている．汎用性が高く別のアイデアにも流用できる感じがしている．また，このシステム作成を通して，以下を身につけることができた．

- gemini AI APIの使いかた
- dockerにおける音声ファイルの扱い方

## 参考
https://qiita.com/Mco7777/items/18e29b98ddbc2614169b

https://zenn.dev/karaage0703/articles/0187d1d1f4d139

https://zenn.dev/cloud_ace/articles/e5c13b4fdaeb42
メールPDF、自動送信(1つのメアドのみ) ※セキュリティ弱

<h3>前提条件</h3>
<ul>
<li>smtplibモジュール インスト</li>
<li>Googleアカウントの2段階認証を有効にし、アカウントからアプリパスワード発行</li>
<li>送りたいPDFを、pythonコードがある同じディレクトリに置く</li>
</ul>

```ruby:インストモジュール
pip install secure-smtplib   
```

<br>

```ruby:ディレクトリ構造
/プロジェクトフォルダ/
  ├── send_email.py    
  └── hogehoge 履歴書.pdf     
  └── hogehoge 職務経歴書.pdf    
```

<br>
<h3>アプリパスワード発行手順</h3>
<ul>
<li>このリンクにアクセス</li>
</ul>

https://myaccount.google.com/apppasswords?pli=1&rapt=AEjHL4PsRtQbezTXvl9DPk3PS3elx3qKfVeauV4yw6pRkVM2bdE-kOJpT4N4MFqq7oicR0WjM_yxMAg-wC2UikPZ7n-XHH0e2IimKglr0BVZP5cNu05nyXE

<h3>アプリ名を入力</h3>

![スクリーンショット 2025-02-19 18.26.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/bd843f90-aeb1-4d01-b0d1-dc015433a5e7.png)


<ul>
<li>「生成」クリック</li>
<li>アプリパスワード をコピーし、ここに貼り付け</li>
</ul>


```ruby:アプリパスワード貼り付け場所
app_password = "✳️✳️✳️✳️✳️✳️"   
```



```ruby:メール送信ループしてないか確認
server.sendmail(sender_email, recipient_email, msg.as_string())
print("送信結果:", response)
```

<h3>実行結果</h3>

![スクリーンショット 2025-02-19 19.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/64e4712e-6e9c-4dbd-8912-dc7fadd3fc4e.png)



<br>
<h3>コード全文</h3>

```ruby:qiita.rb
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header
import os

def send_email_with_pdfs(sender_email, recipient_email, subject, body, pdf_files, app_password):
    # メールの設定
    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = recipient_email
    msg['Subject'] = subject

    # メール本文の追加
    msg.attach(MIMEText(body, 'plain'))

    # 添付するPDFファイルの追加
    for pdf_file in pdf_files:
        try:
            if os.path.exists(pdf_file):
                with open(pdf_file, 'rb') as file:
                    part = MIMEBase('application', 'octet-stream')
                    part.set_payload(file.read())
                    encoders.encode_base64(part)

                    # ファイル名をエンコードして日本語（漢字）対応
                    part.add_header('Content-Disposition', 
                                    'attachment', 
                                    filename=(Header(os.path.basename(pdf_file), 'utf-8').encode()))
                    msg.attach(part)
            else:
                print(f"File not found: {pdf_file}")
        except Exception as e:
            print(f"Error attaching {pdf_file}: {e}")

    # SMTPサーバーを使ってメール送信
    try:
        with smtplib.SMTP('smtp.gmail.com', 587) as server:
            server.starttls()  # セキュア接続を開始
            server.login(sender_email, app_password)  # アプリパスワードを使用
            server.sendmail(sender_email, recipient_email, msg.as_string())
            
            print('成功!')
    except Exception as e:
        print(f"メール送れんかったよ: {e}")

# 使用例
sender_email = "hageo@gmail.com"
recipient_email = "hageo@gmail.com"
subject = "書類のご送付"
body = "メール、ありがとうございます。書類を送ります。"
pdf_files = ["履歴書 hogehoge.pdf", "ほげお 職務経歴書.pdf"] 
app_password = "adabura katabura hechhara"  # ここにアプリパスワードを入力

send_email_with_pdfs(sender_email, recipient_email, subject, body, pdf_files, app_password)
```
Python 仮想環境アクティベート用バッチファイル

Windowsでの開発環境において、セキュリティポリシーの変更を避けたまま、Python仮想環境の作成と有効化を効率的に行う方法を紹介です。

1. 仮想環境の作成
   最新の依存関係でvenv環境を作成するには、以下のコマンドを実行します：

   ```python
   python -m venv --upgrade-deps <環境名>
   ```
   <br>

2. 仮想環境の自動有効化 
   作成した仮想環境のディレクトリ直下に以下の内容でactivate.batを配置します：

   ```batch:activate.bat
   @echo off
   powershell -NoExit -ExecutionPolicy RemoteSigned -Command "Scripts\activate"
   ```

このバッチファイルを実行することで、PowerShellのセキュリティポリシーを恒久的に変更することなく、仮想環境を簡単に有効化できます。これにより、毎回のコマンド入力の手間を省くことができます。

---
参考:

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies
【学習】docker volume lsコマンドについて

## はじめに
Dockerについての学習を進める中、`docker volume ls`を実行したら記憶にない文字列のボリュームが沢山😥
「Dockerが自動で作成したボリュームの可能性が高い。」ようですが、少し調べてみたいと思います


## どんな状態だったのか
```
$ docker volume ls
DRIVER    VOLUME NAME
local     0f5d78c238ac9e2fd278fb94b33dd75082eaa3b8e92b0f89f1fc1db26b8a6464
local     4b23c4c0f5458dcd2621ea97a2377a62f4bb3900059bdc8ffe3b179416c7a420
local     4cce5fdec7dad7d5072d6fd15bb7af9695f45fa71ccea9b1e54c21fefe4e7795
local     42a6f3755ea6820718164ba74c4df0f0dc939aeb0173646c38d7edbd40507aed
local     57580840aeedb0351ee632b42832c716be769a9c4ad224771fb8946e48832d39
local     ad08bc570274f0322e963d3e2ecfa9a8b5a44bd69a872bbb9c7a3a504223eb3d
local     afb7d662b2b0d4afd69c30d69f2c5822a428d9a09c80def38221ed70747837cb
local     b2ac2bfeeacaa4e8af42ea56c125ab866641728773d1bf8c7fadd7af28da9085
```

- **名前がついているもの**    
    → **アプリのデータが残っている可能性が高いので、慎重に扱う！**
    
- **意味不明な長い名前のボリューム**
    → **何のデータかわからないなら、まず中身を確認**
    
    ```
    docker volume inspect 0f5d78c238ac9e2fd278fb94b33dd75082eaa3b8e92b0f89f1fc1db26b8a6464
    ```
    
    → もし不要なら削除できる
    
    ```
    docker volume rm 0f5d78c238ac9e2fd278fb94b33dd75082eaa3b8e92b0f89f1fc1db26b8a6464
    ```
    

https://zenn.dev/praha/articles/69b042d1519af0

https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/


---

### **結論**

1️⃣ **ボリュームにデータがあるかを確認する**

- `docker volume inspect <ボリューム名>`
- `ls /var/lib/docker/volumes/<ボリューム名>/_data`

2️⃣ **データベースに接続できるか試す**

- PostgreSQL: `docker run --rm -it -v <ボリューム名>:/var/lib/postgresql/data postgres:latest psql -U postgres`

3️⃣ **不要なボリュームかどうか判断**

- 長いIDのボリュームは、必要なデータがないなら削除してもOK。

**⚠️ 注意！間違って消すと復元できないので、必ずデータの確認をしてから削除すること！**

まだDockerについては理解不十分があるので書籍含め、しっかり構造・概要を把握してから削除するかどうか検討したいと思います💦😥
今回は削除のコマンドを知れただけで、まずはよかった。
こんなこともできるXOR

## はじめに

XOR（排他的論理和）は、コンピュータプログラミングにおける基本的なビット演算の一つです。単純な演算でありながら、ちょっと変わった使い方もできます。

## 想定する読者

- プログラミングの基礎を理解している方
- ビット演算について学びたい方
- XORの使われているコードの内容を理解したい方

## XORの基本

### 定義と性質

XOR（eXclusive OR）は、2つの入力のうち「どちらか一方だけが真」の場合に真となる論理演算です。

真理値表：
```
a  b  | a XOR b
-----------------
0  0  |    0
0  1  |    1
1  0  |    1
1  1  |    0
```

XORの重要な性質：
1. 交換法則：`a XOR b = b XOR a`
2. 結合法則：`(a XOR b) XOR c = a XOR (b XOR c)`
3. 自己反転性：`a XOR a = 0`
4. 単位元：`a XOR 0 = a`

## 応用例

### 1. 値の交換

XORを使って2つの変数の値を交換することができます：

```c
void swap(int *a, int *b) {
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
```

### 2. 特定のビットの反転

XORは指定したビットを反転させるのに適しています：

```c
unsigned int flip_bit(unsigned int x, unsigned int position) {
    return x ^ (1U << position);
}
```

### 3. データの比較

2つの値が異なるかどうかの比較は、XORを使って次のように書くこともできます：

```c
bool values_differ(int a, int b) {
    return (a ^ b) != 0;
}
```

### 4. 特定のビットパターンの検出

XORを使用して、特定のビットパターンを効率的に検出できます：

```c
bool has_zero_byte(unsigned int v) {
    return ((v - 0x01010101UL) & ~v & 0x80808080UL) != 0;
}
```

## パフォーマンスの考慮事項

1. XOR演算は通常、1サイクルで実行できる高速な演算です
2. ビットレベルの操作が必要な場合に特に有用です
3. ただし、可読性とメンテナンス性も考慮する必要があります

## まとめ

XORは以下のような場面で特に有用です：

- 暗号化や特殊なビット操作が必要な場合
- ハードウェアレベルの最適化が必要な場合
- 特定のビットパターンの検出や操作

ただし、単純な処理の場合は、より直感的で可読性の高い標準的な方法を選択することが推奨されます。

## 注意事項

> Update: コメントでいただいたフィードバックを反映しました

各応用例における実装上の注意点：

### 値の交換について
- XORを使う方法は、一時変数を使う方法と比べてレジスタの使用数は減りますが、実際のメモリ使用量は変わりません
- 一時変数を使う方法のほうが、同一アドレスのチェックも不要で単純な実装になります

### データの比較について
- XORを使う比較は、通常の比較演算子（!=）を使用した場合と同じコンパイル結果になります
- 可読性の観点から通常の比較演算子を使用することをおすすめします

## 参考文献

1. [Bit Twiddling Hacks by Sean Eron Anderson](http://graphics.stanford.edu/~seander/bithacks.html)
AIによる学習支援：クイズレット単語帳

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/648d87c9-8e25-4204-b66a-13cb0a7f1107.png)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/9c5c969c-a71f-4502-959d-1af3d7a09ad5.png)



単語,定義
単語,定義
単語,定義
番号なしで
機械学習用語で単語帳１００


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/5b8eaf91-66a1-4c59-8e82-6176e7b39e26.png)
Application.ThisWorkbook.Path は OneDrive/SharePoint で共有された Office ファイルの VBA からローカルパスを得る救世主になるのか

# はじめに
Excel VBA などで同一フォルダにあるファイルにアクセスしようとしたとき、その Excel がOneDrive/SharePoint で共有されたフォルダに存在すると、URL 形式のファイルパスしか得られず、苦労した人は少なからずいることと思います。

Qiita においてもどうにか回避しようとする記事が散見されます。

https://qiita.com/rcsv/items/1a7c68cab687a666a407

https://qiita.com/emuyn/items/34592a1459e6858aee75

https://qiita.com/yoshi2045/items/527c0d196978b03e6e2e

例に漏れず、私もいろいろ苦労し、先人のお知恵も拝借しつつ、結論としては「根本的にはムリ」となりました。組織内に利用する人が少ない場合には、VBA はアドインで共有し、それを利用するブックは個人ごとに作成する、という運用にしたこともあります。

もう数年にわたって悩んできたわけですが、今日、偶然、ローカルパスを拾うことに成功しました。
この界隈の悩める方々にとって救世主になるかもしれないので、情報共有いたします。

# 肝は Application.ThisWorkbook.Path

さっそく、次のスクリプトを実行してみます。

```VBA:標準モジュール
Sub ローカルパスを得たい()
    Debug.Print ActiveWorkbook.Path
    Debug.Print Environ("OneDriveCommercial")
    Debug.Print Environ("OneDriveConsumer")
    Debug.Print Environ("OneDrive")
    Debug.Print Environ("UserProfile")
    Debug.Print Application.ThisWorkbook.Path
End Sub
```
結果です。
```VBAl:イミディエイト
https://kojimafarmXXXXXXXX.sharepoint.com/sites/core/Shared Documents/2025
C:\Users\khoji\OneDrive - 小島農園
C:\Users\khoji\OneDrive
C:\Users\khoji\OneDrive - 小島農園
C:\Users\khoji
C:\Users\khoji\小島農園\コア - ドキュメント
```

`ActiveWorkbook.Path` を始め、今まで試してきたさまざまなローカルパスを得るメソッドやプロパティは URL 形式になっちゃうんですが、なぜか `Application.ThisWorkbook.Path` は Windows ファイルシステムパス形式になっています。

# おわりに
公式情報は見つけられていませんし、いろいろな環境で試したわけでもありません。
なので、他の方の環境で使えるかどうかわかりませんが、悩める皆さまが少しでも救われるといいな、と思います。
Blenderの編集中 面選択の色を変更する

# 編集の時の選択状態の色の設定変更

## 手順１
#### 「編集」→　「プリファレンス」
![手順1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/705b9de6-b165-47c2-aa95-a167bad9d595.png)

## 手順２
#### 「テーマ」→「3Dビューポート」
![手順2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/eb50af8c-7ee2-461e-beed-5b8333489a27.png)

## 手順３
#### 「面モードの選択」の色を変更
![手順3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/9ea6d72e-3deb-42d0-8d1e-5ac486b7edd6.png)

## 手順４
#### 色の変化
![手順4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/63095a25-3151-4a02-abff-ecfcbd7608e8.png)


[参考にしたURL](https://dipross.co.jp/eng/2022/10/blender%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E4%B8%8A%E3%81%A7%E3%81%AE%E8%89%B2%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html "参考にしたURL")
PromiseResultのみを取得したい

# はじめに
DBから取得した結果がPromiseのオブジェクトで返却されたとき、取得方法に困りました。

# 問題
Promiseで返却されるPrimiseResultのみを取得したかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/a7e68c27-06f6-4535-9c3e-bf63dafe7e8a.png)

# 解決方法
then()を使う。
```react
  const [records, setRecords] = useState([]);
  useEffect(() => {
    const datas =  getAllDatas();
    datas.then((data) => {setRecords(data)});
  }, []);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/d73fe8a5-0497-4efe-bfc8-0a8b6bf0abfa.png)


# おわりに
「PromiseResult 取得」でGoogle検索したところ解決しました。
検索の仕方も学んでいきたいです。

# 参考

https://sbfl.net/blog/2019/11/04/promise-cookbook/
Figmaで作成したデザインをGitHub上でプレビュー表示したい

## はじめに
画面デザインが知らぬ間に更新され、設計書に貼り付けてたキャプチャと差異が発生する事は多々あります。
どうにかして解消できないかな～、と日々考えていたら
解消法を見つける事ができたので、このTipsを共有させていただきます。

## 前提
- マークダウン形式でドキュメントを管理
- Figmaでデザインを作成
- GitHubでバージョン管理
- ブラウザはGoogle Chromeを利用

## Figink
Google Chromeの拡張機能です。
Figinkを使用するとGitHub内で直接、Figmaデザインファイル、プロトタイプ、FigJamファイルをプレビューできるようになり、ワークフローが効率化され、コラボレーションが向上します。

https://chromewebstore.google.com/detail/figink/iaieddclhpjmcpigojanfjdmcmgonnac

## 使い方
1. Chrome Web StoreよりFiginkを追加
※↓のキャプチャは既に追加済みです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880077/e1df034d-4292-4344-85a8-f1b1b756a25f.png)

2. Figmaにて対象デザインのリンクをコピー
※表示させたい対象のレイヤーを選択し、"コピー/貼り付けオプション > 選択範囲へのコピー"を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880077/667f961d-3e96-45d6-a66a-3b658594df89.png)

3. mdファイルにリンクを記載
※URLはダミーです
```
## 画面デザイン

[サンプル][URL]

[URL]:https://www.figma.com/design/XXXXXX/YYYYYYYYYY
```

## 確認
GitHub上でFigmaのデザインが確認できるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880077/2a739eb7-8cc0-4068-b7d2-ab1d5430d5e6.png)

## 補足
今回はmdファイルにリンクを記載し挙動を確認しましたが
wikiでも問題なく表示できますのでご安心下さい。


## 最後に
今回はFiginkという拡張機能を利用して、GitHub上にFigmaのデザインをプレビュー表示させるTipsをご紹介しました。ゆくゆくは、Notionのようにプラグインを使わずともリンクを貼るだけでプレビュー表示できるようなGitHubのアップデートを期待しています！！
ローカルにFirecrawlをインストールしてハマった件

私は、Dockerの事をほとんど理解してません。
https://zenn.dev/zozotech/articles/d177f4cdc02755
こちらの記事を参考にして、ローカルにFirecrawlをインストールしたがかなりハマった。

私の環境はWINDOWS11、WSL2、difyローカルはWSL2のdockerで動いてます。

AIと相談しながら、動いたので、現在の設定を残します。

```md
git clone https://github.com/mendableai/firecrawl.git
cd firecrawl
cp ./apps/api/.env.example ./.env
```
```
#.env変更した設定は以下の通り
# ===== Required ENVS ======
NUM_WORKERS_PER_QUEUE=8
PORT=3002
HOST=0.0.0.0
REDIS_URL=redis://redis:6379 #for self-hosting using docker, use redis://redis:6379. For running locally, use redis://localhost:6379
REDIS_RATE_LIMIT_URL=redis://redis:6379 #for self-hosting using docker, use redis://redis:6379. For running locally, use redis://localhost:6379
PLAYWRIGHT_MICROSERVICE_URL=http://playwright-service:3000
## To turn on DB authentication, you need to set up supabase.
USE_DB_AUTHENTICATION=false #true
# ===== Optional ENVS ======
# Other Optionals
# use if you've set up authentication and want to test with a real API key
TEST_API_KEY=fc-test
LOGGING_LEVEL=INFO
#.env変更した設定は以上の通り
```
```
#firecrawl-apiのCONTAINER IDを見つけてログを出してみたらredisが無いとエラーが出てた
docker ps 
docker logs <firecrawl-apiのCONTAINER ID>
```
```
#redis-serverをインストール
sudo apt install redis-server
sudo systemctl start redis-server
sudo systemctl status redis-server
```
#このあたりで、マシンがWINDOWS11、wsl2のdockerでDify、firecrawl、redis、playwrightが動いてると分かった。
#この状況で、pythonから、firecrawlにアクセスするため、IPアドレスを調べた

```
hostname -I
#http://172.27.117.140 <=私の例
#一番左にある、IPアドレスが良いとのことで、それを使ってpythonからアクセスしたら、成功した！！
#ローカルのDifyのナレッジ => ナレッジを作成 => WEBサイトから同期 => Firecrawl => 設定のbase urlに
#http://172.27.117.140:3002を設定したら、Difyローカルから、Firecrawlローカルにアクセスできて、上限無くスクレイピング可能になった。
```

```python
#pythonの例

import requests
import time

def post_with_infinite_retry(url, payload, headers, timeout=30, retry_interval=5):
    """
    指定した URL に対して POST リクエストを行い、
    エラーが発生した場合は retry_interval 秒ごとに再試行します。
    成功すればレスポンスを返します。
    """
    session = requests.Session()
    while True:
        try:
            response = session.post(url, json=payload, headers=headers, timeout=timeout)
            response.raise_for_status()  # HTTPエラーがあれば例外を発生させる
            return response
        except requests.exceptions.RequestException as e:
            print("リクエストエラー:", e)
            print("{}秒後に再試行します...".format(retry_interval))
            time.sleep(retry_interval)

if __name__ == '__main__':
    url = "http://172.27.117.140:3002/v1/scrape"
    payload = {
        "url": "https://google.com",      # スクレイプ対象のURL（必要に応じて変更）
        "formats": ["markdown"],           # 出力フォーマット
        "onlyMainContent": True            # ページの主要コンテンツのみ抽出
    }
    headers = {
        "Authorization": "Bearer fc-test",  # 実際の API キーに置き換えてください
        "Content-Type": "application/json"
    }
    
    print("Firecrawl API にアクセスを試みます...")
    response = post_with_infinite_retry(url, payload, headers)
    print("接続成功！レスポンス:")
    print(response.text)
```
Error response from daemon: Mounts deniedというエラーの解決策

## エラーの内容
postgresqlのコンテナを立ち上げようとしたら、、、
```
Error response from daemon: Mounts denied: 
The path /home/containers/postgresql is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/desktop/settings/mac/#file-sharing for more info.
```
こんな感じのエラーがでた。

docker desktopの設定からfile sharingの設定ができるみたいだがうまくいかなかったので困った。

## 解決策
docker-compose.ymlの中身を書き換えた。

### 修正前
```
services:
  db:
    volumes:
      - /home/containers/postgresql:/var/lib/postgresql/data
```

### 修正後
```
services:
  db:
    volumes:
      - ./data:/var/lib/postgresql/data
```

そして postgresqlのディレクトリで以下を実行
```
$ mkdir -p ./data
```

これでなんとかupすることができた。
kintoneで日付から日付に日付計算して入力する方法

多分もっと早いいい方法がありそうですが備忘録

```JavaScript
        var date1 = new Date(
          event.record["date1"].value
        )
        //とりあえず三日前
        date1.setDate(date1.getDate() -3);
        event.record["date2"].value =date1.toLocaleDateString("ja-JP", {year: "numeric",month: "2-digit",day: "2-digit"}).replaceAll("/","-")
```
逆文字列置換（reverse string interpolation）

## 参考
この記事は、以下の動画を参考にしています。
詳しくは、動画をご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/JtLPfjJvrOU?si=XQu5PotXQhHXoo4l" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

動画で紹介されているNuGetパッケージは、以下のものです。

https://github.com/AntonBergaker/InterpolatedParser

## 概要
C#の機能である文字列置換（string interpolation）は、文字列の中に式の値を埋め込む機能です。
```cs
var name = "Nick";
var line = $"Hello, {name}!"; // 文字列置換
```

**InterpolatedParser**は、文字列置換とは逆向きの、文字列から指定の位置にある値を変数に取り出す機能を提供します。（C# 10の[custom string interpolation handler](https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/performance/interpolated-string-handler)を使っています）
```cs
using InterpolatedParsing;

var line = "Hello, Nick!";
string name = null;
InterpolatedParser.Parse(line, $"Hello, {name}!"); // nameに"Nick"が入る
```
## 警告
>このライブラリーは、ランタイムの期待に反する方法で`Unsafe.AsRef`を悪用しています。 本番コードでこれを使用することは推奨されません。 このライブラリーは、C#の機能や実装の詳細を使って、思いがけない面白いことができるという楽しいちょっとした例として作られたものです。

（READMEの一部をDeepLで翻訳）

## 追補
**OutParser**は、InterpolatedPaserと同じ働きをする、同じ作者による別のパッケージです。

https://github.com/AntonBergaker/OutParser

```cs
using OutParsing;

var line = "Hello, Nick!";
OutParser.Parse(line, "Hello, {name}!", out string name); // nameに"Nick"が入る
```
OutParserを使用するにあたり、現時点のバージョン（1.0.1）では、以下の制限があります。
- .NET 9の[インターセプター](https://github.com/dotnet/roslyn/blob/main/docs/features/interceptors.md)を使っています
- プロジェクトファイル（*.csproj）に、以下の`InterceptorsNamespaces`要素を追加する必要があります
```xml
<Project Sdk="...">

  <PropertyGroup>
    <!-- 略 -->
    <TargetFramework>net9.0</TargetFramework>
    <InterceptorsNamespaces>$(InterceptorsNamespaces);OutParsing</InterceptorsNamespaces>
  </PropertyGroup>
```
watsonx.ai StudioのJobの実行結果をメール通知する

CP4DaaSでwatsonx.ai Studioのジョブで結果をメールで通知します。


プロジェクトのジョブのタブで通知設定をしたいジョブを選びます。

![{03470CC3-D65D-409F-BC0F-800340C92704}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0b817385-de68-4092-9ca9-f9610f533582.png)

構成の編集のアイコンをクリックします。

![{47B3B46C-E4EA-4CA1-B088-96B59ED40886}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9b39fac3-57cd-4e84-82a5-6ae32c2d5fc0.png)

通知の設定を選び、通知を「オン」にし、アラートの対象を選びます。ここではすべてにチェックをつけました。「次へ」で進んで保存をしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/71576ce8-21fc-4863-8dc0-69e91553fe0b.png)

通知のアイコンをクリックし、設定のアイコンをクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0d52e1dd-1b13-4fc3-b7da-9114d29b7c32.png)

通知チャネルで「Eメールにすべての通知を送信する」を有効にし、対象プロジェクトを有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/945a5342-b150-467f-a2eb-5c098451df5a.png)


以下のようなメールが届くようになります。

![{413AF0D5-E991-4154-B41F-4C673286279A}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3f0c6bea-e861-42cb-a15e-485f510cbd1f.png)



# 参考

#### 通知設定の管理
https://jp-tok.dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html?context=wx&audience=wdp#bell


#### 「資産」ページからのジョブの作成
https://jp-tok.dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html?context=wx&audience=wdp#jobs-assets-page