OmniAICreator/Qiita-1.07M huggingface dataset:
[Python]コンストラクタとメソッドの引数

今年は開発もして、業務改善活動を行いました。むかーし、新人研修で学んだコンストラクタとかそういうのが出てきたので、学び直ししました。

## コンストラクタとは？
オブジェクト生成時に最初に実行される、「初期化用の特殊な関数」のことです。Pythonでは、コンストラクタは、「`__init__()`」という名前で定義するのがルールです。
https://xtech.nikkei.com/atcl/learning/lecture/19/00108/00005/

## メソッドとは？
処理のまとまりに名前を付けたもの
https://xtech.nikkei.com/atcl/learning/lecture/19/00108/00005/?P=2



## 理解するためのコード例

```python
class Dog:
    def __init__(self, name, age):
        # コンストラクタ：オブジェクトが作成される際に自動的に呼び出される
        # オブジェクトの属性を初期化する
        self.name = name
        self.age = age

    def bark(self):
        # 通常のメソッド：明示的に呼び出さない限り実行されない
        # オブジェクトの振る舞いを定義する
        message = f"{self.name}, {self.age} years old, says woof!"
        return message

def main():
    # オブジェクトを作成（コンストラクタが呼び出される）
    my_dog = Dog("Pochi", 2)
    # メソッドを呼び出す
    message = my_dog.bark()
    #2歳のポチが吠える！
    print(message)
    
    #太郎ちゃんも吠えたい。
    my_dog.name = "Taro"
    #名前が変更されたことを確認
    print(my_dog.name)
    #2歳の太郎が吠える！
    message = my_dog.bark()
    print(message)
    
if __name__ == "__main__":
    main()

(実行結果)
Pochi, 2 years old, says woof!
Taro
Taro, 2 years old, says woof!

```
## 流れを追ってみましょう

(1) コンストラクタは下記で呼び出されます。
```python
my_dog = Dog("Pochi", 2)
```
NEWするときに自動的にコンストラクタが呼び出されます(とJava研修のときに習った記憶がある)
指定した値に代入されます。

name = Pochi
age = 2

(2)my_dogをbarkメソッドに渡して処理をさせます。戻り値は変数messageで受けます。
　 my_dogに名前と年齢が入っているので個別で引数に渡す必要はありません。

```python
message = my_dog.bark() 
```
メソッドで定義している処理はこちら。値はmy_dogにセットされています(name = Pochi,age = 2)。
処理結果はreturnで呼び出し元(mainメソッド)へ返されます。

```python
message = f"{self.name}, {self.age} years old, says woof!"
return message
```
(3) 戻り値を出力します。

```python
print(message)
```

(4)Dog()はいわば金物の型。格納する変数は自由に変更にできます。

```python
    #太郎ちゃんも吠えたい。
    my_dog.name = "Taro"
    #名前が変更されたことを確認
    print(my_dog.name)
    #2歳の太郎が吠える！
    message = my_dog.bark()
    print(message)
```
KPIとKGI

# １．KPIとは？
KPI（Key Performance Indicator）
企業やプロジェクトのパフォーマンスを評価するための具体的な指標KPIは、目標達成に向けた進捗状況を定量的に測定するために使用される。
(例)売上高、ウェブサイトのトラフィックなど

# ２．KPIの特徴
具体的: KPIは具体的な数値で表されるため、進捗状況を明確に把握する。
測定可能: KPIは定量的に測定できる指標である必要がある。

# ３．KGIとは？
KGI（Key Goal Indicator）
企業やプロジェクトの最終的な目標を示す指標
KGIは、ビジネスの成功を評価するための最終的な成果を測定する。
(例)年間売上目標、マーケットシェアの拡大、特定のプロジェクトの完了など

# ３．KGIの特徴
最終目標: KGIは最終的な成果を示す指標
長期的: KGIは通常、長期的な目標を設定する。
戦略的: 企業の全体的な戦略に基づいて設定される。
包括的: KGIは複数のKPIを統合して達成されることが多い。

# ４．KPIとKGIの関係
KGIは最終的な目標を示し、KPIはその目標に向かって進捗を測定するための指標。
KPIを適切に設定し、追跡することで、KGIの達成に向けた具体的なアクションを取ることができる。

例
KGI: 年間売上を1億円にする。
KPI: 月間売上を800万円にする、新規顧客を毎月100人獲得する、顧客満足度を90%以上に維持する。

# ５．KPIとKGIの設定方法
| STEP | やること | 説明 |
|:-----------:|:------------:|:------------:|
| 1       | 目標の明確化      | 企業やプロジェクトの最終目標（KGI）を明確に        |
| 2       |KPIの選定       |  KGIを達成するために必要な具体的な指標（KPI）を選定       |
| 3       |測定方法の決定       | KPIをどのように測定するかを決定        |
| 4       | データ収集と分析      | 定期的にデータを収集し、KPIの進捗状況を分析        |
| 5       | フィードバックと改善      | KPIの結果を基に、必要に応じて戦略やアクションを見直し、改善        |
GoogleドキュメントでMarkdownファイルを作る話

## はじめに
　秋葉原ロボット部の「一般相対性理論を一歩一歩数式で理解する」 読書会では、1年間の勉強の成果を。参加者が原稿を持ち寄って冊子の形で公開しています。
　様々な環境で予習・復習の資料を作成しているのですが、冊子にする前にMarkdown形式のファイルに変換する必要があります。
　ここでは、Googleドキュメントで作成した文章をMarkdownに変換する方法を説明します。

## Markdown変換の結果

見出しにしたい部分を選択してから、
　表示形式ー＞段落スタイル
の順にたどっていくと、見出しの選択ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/7f7f69bb-f8b3-f66d-76a8-bbfa49d2e7c8.png)


 ここでは、「はじめに」を選択して、「見出し2」を適用しました。
 さらに、以下のような文字の種類を作成しました。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/e74fd3a8-cb7b-d1c0-6a57-09ba0a7c8317.png)

**太字 bold**
*斜体 Intalic*
<INS>下線</INS>
~~取り消し線~~
上付き<sup>文字</sup>
下付き<sub>文字</sub>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/01e603c1-5ab1-b83f-b9d2-b038d9ad0435.png)

計算式の例
$$e_{p}=\frac{\partial x}{\partial p}$$

　文章を作成したのち、ファイルー＞ダウンロードー＞マークダウン(.md)を選択すると、パソコン上にマークダウンに変換されたファイルが保存されます。
 「メモ帳」などで開くと、Googleドキュメントの適用がどのように変換されたかわかります。

- 見出し2を適用した「はじめに」は、「## はじめに」
- 太字を適用した「**太字 bold**」は「\*\*太字 bold**」  
- 斜体を適用した「*斜体 Italic*」は「\*斜体 Italic\*」  
- 下線を適用した「<INS>下線</INS>」は「下線」  
- 取り消し線を適用した「~~取り消し線~~」は「\~~取り消し線~~」  
- 上付き文字を適用した「上付き<sup>文字</sup>」は「上付き文字」  
- 下付き文字を適用した「下付き<sub>文字</sub>」は「下付き文字」
と表示されます。
計算式の例は、「ep=xp」と表示されます。

 図のあったところには、「![][ image1]」と表示され、下の方にあるように「[image1]: <data:image/png:base64, 」からはじまる、文字情報に変換されていることがわかります。
　「見出し」、「太字」、「取り消し線」はMarkdownに変換されますが、それ以外の書体や数式、図はすぐ利用できる形式に変換されないようです。
　数式で多用される、「上付き文字」、「下付き文字」が使えないのは、少し不便です。

## おわりに
　Googleドキュメントで作成した原稿をMarkdownに変更する場合、文字種の一部のみが変換されるだけで、数式はTeX形式のものに図は別途用意して張り込む必要があります。
　ワープロソフトで作成したファイルをMarkdownに変換できると、過去の資産が活用できて便利なのですが、なかなか良い方法はないようです。
最新のセンサーの値を取得する

:::note info
「Tanium Cloud」の機能を1つずつ勉強していきます。
:::

# ０．はじめに
Deploy Actionで設定を変更したのに、Questionの結果が変わらない・・・
ということがありました。
これは、Questionを投げる＝エンドポイントに聞きにいってくれてる、
ではないからです(TDSをみにいってます)。
最新の値を取得したい！な時の話です。


# １．仕様のポイント
・Questionを投げた後、その情報はTaniumサーバ側でキャッシュに保管されている。
　(連続してQuestionを投げたときに、毎回エンドポイントに問い合わせすることを防ぐ)
・センサーごとにキャッシュの時間がかわる。
　端末名、MACアドレスなど端末運用上、なかなか変わらないと想定されるものは長め、そうではないものは短め。
 例えば・・・
 デフォルトでは「Last Logged In User(最終ログインユーザー)」は10分ごとに更新される。
 Deploymentの結果は2分ごと。

# ２．変更方法
１．Interactから[Question Builder]をクリックする。
センサーを選択し、[Advanced Senor Options]をクリック。
Maximum Data Ageを編集する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/d5765bb8-af36-501a-7413-93ce206370ae.png)

２． Questionでやるには？
```
Get Computer Name?maxAge={秒} from all machines
```
例) 12時間の場合　※こんな設定は普通はしません。

```
Get Computer Name?maxAge=43200 from all machines
```
ベンチマーキング

# １．ベンチマーキングとは
主な経営指標を測定し、結果を社内の他の部署や競合他社と比較する手法

# ２．ベンチマーキングの種類

| 名前 | 説明 | 
|:-----------|:------------|
| 業績ベンチマーキング     | 重要業績評価指標（KPI）を測定し、業績予想と業績目標の差を明らかにする手法        | 
| 社内ベンチマーキング     |社内の複数の部署から集めたデータを比較する手法<br>関連会社を対象にすることもある。|
| 社外ベンチマーキング     |自社のデータを競合他社のデータと比較する手法| 
| プロセスベンチマーキング     |特定の業務プロセスに関する質的データを集める手法| 
| 競合ベンチマーキング     |自社と競合する優良企業を分析し、その企業と同じ水準のサービスやプロセスを目指そうとする手法<br>同質的なやり方になる可能性があり、機能ベンチマーキングやプロセスベンチマーキングと一緒に行われる。        |
|機能ベンチマーキング||
GitHubのPull Requestを完全に削除する方法



# はじめに

Pull Requestを作成した際、含まれてはいけない内容が含まれてしまい、PR自体の記録を削除したい場合があります。  
（誤ったブランチを選択した場合や、機密情報が含まれる場合など）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/9640abdd-cd94-7c04-ab6b-bc4376b67dca.png)


特に、私が最近進めていたプロジェクトでは、PRの記録そのものを削除しなければならない状況が発生しました。  
そのため、削除方法をまとめてみたいと思います。

以下のURLにアクセスします。

https://support.github.com/request


（私は韓国アカウント・IPなので韓国語が表示されていますが、日本からアクセスした場合は日本語や英語で表示されると思います）


![2117F7E7-E03B-4A7B-A043-D182BED43C21.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/f6763c9c-4bc3-e862-0caa-26d55ab5c6a2.jpeg)

本の形をしたアイコン（リポジトリからデータを削除する）というボタンをクリックします。


![5D85E7D3-731A-4B81-805F-778A8BDB774F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/ce18b370-5dbb-9eab-120e-040845d70ea6.jpeg)


次に、Pull Requestアイコン（Pull Requestリクエスト削除）をクリックします。

![F2A8D0F3-C838-4B62-8537-094C33D24F8C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/29d9af3d-1fea-eae7-c6c8-df9b8d631a6c.jpeg)


チャットボットを通じて現在の条件を確認します。


![F22E4B17-C61A-44F2-ABFF-DB6322FC7AB4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/520ac61b-9640-62df-7048-ebc57fe76fbe.jpeg)


3時間ほど経った後、Pull Requestの記録が完全に削除されていることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/7d3e20e9-dba9-6eed-2e14-2cf3406b5516.png)

スムーズに完了して良かったです！
GNU gforth 超初心者が説明を試みる 〜古典的FORTHとの違いをいくつか〜

# はじめに
古典的なFORTH と GNU gforth との違いについてなんとなく思いつくままにつまみ食いしていきます。

# GNU gforth は OS 上で動くようデザインされている
まぁ、いまどきだと OS 上で動くほうが当たり前ですが、 昔のFORTHはOSを介さず直接FORTHが走るスタンドアロンなタイプもあり、今でも組み込み用のはOSを介さないものが多いです。

そのために、フロッピーディスク I/O もFORTHからフロッピーディスクコントローラーを叩いて直接入出力する仕組みとして、 スクリーン/ブロックモードを備えています。 このスクリーン/ブロックモードはGNU gforth 上でもエミュレートされています。

# 文字列の扱いがマシになった機能が追加された
## counted string
古典的なFORTHの文字列(string)は counted string と言います。長さ用に1バイト、続けて長さ分のバイト領域が続くものです。

例えば "counted" (7文字)  を C言語風に書くと
````C
unsigned char cstr[8] = { 7,'c','o','u','n','t','e','d'}
````

で、注意して欲しいのは C言語と違って \0 で終端しないことです。

また、 スタックに積む場合は cstr[1] 文字列本体へのポインタと、長さ cstr[0] を積みます。 スタック効果としては ( -- c-addr u ) です。

文字列処理するときは最初に文字数が分かるので処理しやすいという利点はあります。

しかし、 unsigned char にしても文字列の最大長は255文字までなので、 大変つかいにくいものでした。
## gforth の $tring

gforth では改良した 文字列が追加されています(昔からの counted string も依然として使用可能)

````text
s" GNU gforth manual"  ok 2
.s <2> 108942773656848 17  ok 2
drop 32 dump 
631537531D10: 47 4E 55 20  67 66 6F 72 - 74 68 20 6D  61 6E 75 61  GNU gforth manua
631537531D20: 6C 63 72 65  61 74 65 5F - 31 00 00 00  00 00 00 00  lcreate_1.......

````

文字列本体をヒープに自動で取得した領域に格納し、 そのアドレスと文字数(セル単位なのでそこそこの長さまでOK)

## $tring
$tring (なんと読むのか知らん) は 1クッション置く感じで間接的に扱うものです。

文字列の長さと文字列本体を置いたヒープのエリアへのアドレスだけをスタックに積みます。$tring 専用の \$hogehoge なワード群が用意されています。

````text
s\" GNU\ngforth\nmanual\n" 
````

C言語風のエスケープシーケンスが使えるワード。 printf みたいに置換とかできないのでいまいち。

# Recognizer(認識器)
※実験的機能です。

テキスト・インタープリター(外部インタープリター)を拡張し Recognizer 群を組み込んであるので、シンタックス・シュガーっぽい機能が使えます。

使い始めると古典的FORTHの「ワードは空白で区切って書く」から少々外れてきます。

ワードを切り出し、当該ワードを実行する時の前処理として走るので、
ワード自体を(空白をあけずに)装飾することが可能になっています。

- s" hogehoge" は "hogehoge" と書けます。 区切りの空白不要
- ' hoge は `hoge
- 環境変数へのアクセス ${HOME}
- etc.

# ヘッダー構造の大幅拡張
オブジェクト指向を意識したヘッダー構造に変わっています。

# ローカル変数
ワードの先頭で引数プロトタイプのようにして使うこともできますし、単純にローカル変数を定義して使うこともできます。

他の言語で慣れ親しんだローカル変数使いまくりな記述も可能にではあります。

# オブジェクト指向
オブジェクト指向化するパッケージは数種類あって統一されていません。目的に応じて使い分ける形になります。

# 正規表現
一応サポートしてるけど日本語対応してないっぽい。

# C Interface
GNU gforth の大部分は C言語 (gcc) で記述されているのでワードのクリティカルな部分は C言語で書くことも可能です。
クリティカルな部分を知るためにはプロファイラが役に立つでしょう。

# アセンブラ・逆アセンブラ
アセンブラと逆アセンブラを装備しています。プリミティブ・ワードがどのように実行されているか確認できる(が、 その多くはC言語で書かれているので対応するC言語のソース探した方がいいかも)

# エンジン
エンジン名＝実行ファイル名になっています。 通常は gforth で開発します。 gforth-fast はゼロ割とかのエラー処理を省略して高速化を図ったもの、 gforth-itc は内部インタプリタ動作を古典的FORTHに合わせたものです。 デバッグなど用途に応じてエンジンを使い分けます。

# vmgen
別途 vmgen というアプリが付属しています。これは gforth のVM(Virtual Machine)を生成するためのツールです。
既に生成済の gforth 等は vmgen で生成した VM の上に構築されています(たぶん)。

今回はここまで。
カスタムタグ削除方法

:::note info
「Tanium Cloud」の機能を1つずつ勉強していきます。
:::

# １．この記事で書くこと
・Taniumコンソールからカスタムタグを削除する方法
　(変更そのものはできないので、削除＆追加(逆も可)で対応する必要があります)
 
# ２．手順

(1) Questionで対象を抽出する。

```
例) 
get computer name and custom tags from all machines with...
```

(2) [Deploy Action]をクリック。


(3) 下記を設定する。
・Package ：　Removing Tags を選択
・Name ：わかりやすい名前にする。
・スケジュール設定(1回限りか継続実行か)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/30c0628f-590b-15df-a659-e797ebbb7a1c.png)

(4)プレビューして、デプロイ！

:::note warn
Packageの選択肢に出ないんだけど？
例えばQuestionで get computer name from all machines with...みたいに、カスタムタグを出してないと、カスタムタグを明示的に選択できてないので表示されない仕様になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/4f6a3043-48b2-7b10-6723-354b21cb5e09.png)

(正)　get computer name and custom tags from all machines with...

:::
24/12/24 読書記録 ~土台からしっかり学ぶソフトウェアテストのセオリー~

# 書籍
[土台からしっかり学ぶソフトウェアテストのセオリー](https://amzn.asia/d/hvYdYEd)


# 第1章 ソフトウェアテストの目的

## 1-1 ソフトウェアテストの目的

1. テストで欠陥を防ぐ
テストと言えば、こちらのイメージがある。他にも目的があるのか。

2. テストで品質を知る
ソフトウェアの品質を確証し、品質リスクを軽減し、品質レベルを説明する。
客観的に品質が担保されていることの証明としても必要ということだと思う。

3. テストで期待に応じる
決めたことが守られているかの確認：Verification(検証)
出来上がったものが期待を満たしているかの確認：Validation（妥当性確認）

4. テストで標準への遵守を示す
法律や標準などの評価基準が、ソフトウェアの外にある。
標準で規定されたテストを実施する側面と、標準を守っていることを確認するテストの両面を持っている。

## 1-2 VerificationとValidation
仕様・設計通りの成果物となっているか？と、成果物かステークホルダーの期待を満足できているか？の観点
ソフトウェアテストの教科書でも記載されていたが、改めて学びになる。
カスタムタグを付与する方法

:::note info
「Tanium Cloud」の機能を1つずつ勉強していきます。
:::

# １．手順
(1) Questionで対象を選択し、[Deploy Action]をクリック。

```
(例)
Get Computer Name from all machines with...
```

(2) 下記を設定する。
・パッケージ：Add Tags
・Add tags：タグ名を入力
・Name　：わかりやすいジョブ名
・スケジュール設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/9a7050ce-b990-081e-e0d9-c97c502f19a7.png)

(3) プレビューして、デプロイ。結果を確認！
【Power Apps】Text関数とは、使い方

# Text関数の概要と活用例

数値フォーマットや日付フォーマットの活用例を含むText関数の解説です。

この記事は [Microsoft Power Apps Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerapps) シリーズ3 12月8日の記事です。

## 関数説明・構文

> 数値や日付/時刻の値を、指定した形式の文字列に変換します。

[公式より引用](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-text)

```
Text(値, 形式 [, 言語])
```

## 使い方

### 数値フォーマット

数値を通貨や割合など、様々な形式で表示できます。0埋め(ゼロパディング)や3桁ごとにカンマ区切りして見やすい形式にできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f7a113c9-3aef-d15e-8063-e0d11c16359b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/83e8794c-21d2-8951-8a8e-8a0c036d14c4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/54a10633-0d97-b4bd-829c-6fd321c67df9.png)

数値フォーマットで使用できる主な書式指定文字:

```
0: 数値がない場合は0を表示
#: 数値がない場合は表示しない
.: 小数点
,: 桁区切り
```

### 日付フォーマット

日付や日時の値を年月日や曜日の表示形式をフォーマットできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/44b8a381-ad39-a809-e43e-57b2c5f321e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/4543b5b5-8a3d-ab8d-252b-cff0ed10fb95.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/59b5653d-9140-155b-bc0c-674b1704e999.png)

日付フォーマットで使用できる主な書式指定文字:

```
d: 日（1-31）
dd: 日（01-31）
m: 月（1-12）
mm: 月（01-12）
mmm: 月（Jan-Dec）
mmmm: 月（January-December）
yy: 年（00-99）
yyyy: 年（2000-2099）
h: 時（1-12）
hh: 時（01-12）
n: 分（0-59）
nn: 分（00-59）
s: 秒（0-59）
ss: 秒（00-59）
```

## 元記事

https://powerplatformnikki.com/text
コンソール上で表示/未表示の時差をまとめてみた

:::note info
「Tanium Cloud」の機能を1つずつ勉強していきます。
:::

# １．Asset
・各エンドポイントにおいて過去180日間で直近の返答を表示。(180日を超えてオフラインだとレポートの一覧からも消える)
・Reportの対象となっているAttributeが1時間ごと更新される。
　→この情報の更新はTDS(Tanium Data Service)と呼ばれるデータベースから情報を取得することで行われる。

#  ２．Direct Connectで接続するときの検索窓の表示
 ・過去30日間でTaniumサーバと通信してきたものは、検索窓に入力するとヒットする。
 ・検索した時点でオフラインでもリストにあがる。(ただしDirect Connectの接続はできない)


# ３．Saved Question
 「Recent」は過去7日間で直近の値を返す(TDSを参照する)

# ４．Deploy設定時のプレビューに表示されるターゲット
 ・Interactと同じ(そのときオンラインになっている端末)
 ・実行スケジュールを「Recurring」にすると、都度Interactと同じ動きで対象が検索される

# ５．その他
　TDS(Tanium Database Service)は30日間保持。
Chrome デベロッパーツールの便利な機能を紹介

### 初めに
最近勉強会に参加して、Chromeデベロッパーツールのかなり役に立ちそうな機能を紹介してもらって感動して、活用しそびれている機能が他にないか調べた。で実はいくつかあったのでこの記事で全部紹介する。
デベロッパーツール（以下DevTools)は Ctrl+Shift+I で表示できる。

### 目次
1. GeminiがすでにDevToolsに導入されている
1. 3Dでページのレイアウトを確認できる
1. ページ全体のスクショやスマホ画面のスクショが撮れる
1. その他

#### 1. GeminiがすでにDevToolsに導入されている
コンソールに出ているエラーをホバーすると電球アイコンが表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923736/dd893c65-7011-f2f9-c7bd-047a24ad242f.png)

それをホバーすると「Understand this error」が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923736/f8077965-2682-d9f5-a773-f253dbfd38bc.png)

それを押すとGeminiがエラーを読み込んでエラーの分析を生成してくれる。なお、DevToolsの設定でAI innovationsのConsole insightsをオンにする必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923736/35c71ba1-183e-8e23-3f2c-54e6f5be2ddf.png)

※ただし***言語を英語に設定する必要がある***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923736/e113d6bd-5538-5b4e-f64c-7c679b656bda.png)

#### 2. 3Dでページのレイアウトを確認できる
要素が重なっていてめちゃくちゃになることが全然よくあるのでこのLayersという機能がかなり助かる！
DevToolsを開いたまま(Ctrl+Shift+I)、Ctrl+Shift+Pを押すとRunメニューが出てきたそこにLayersと打ってエンターを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923736/9b583d98-6839-3ca7-830a-15faecfb0ecb.png)

そうするとこのLayersのタブが開いて色々操作できる。まずPaintsにチェックを入れて、Shows scroll rectsにチェックを外すと見やすくなる。さらに、左から2番目のボタンを押してRotate modeに入る(ショートカットキーがV)とマウスをドラッグすると、ページの要素が投影されて3次元に見える。この機能を使うと何かの後ろに隠れている要素も見れて、z-indexでのデバッグをもうしなくてもいい笑
[Apple.com](https://www.apple.com)で使うとこうなるけど、自分で遊んでみたら面白さが伝わると思う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923736/3ffdc02d-9edb-9ca8-9715-c21d1bfdedc4.png)

#### 3. ページ全体のスクショやスマホ画面のスクショが撮れる
ページ全体のスクショをとるには方法がいくつかあるが、一番楽のがRunメニューから(Ctrl+Shift+I → Ctrl+Shift+P) full size screenshotを使うことかな。だが、スクショが撮られて勝手にファイルに保存されるのが個人的に嫌だ。クリップボードに保存したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923736/6575d45c-5496-deb3-4bcf-e91cc9f731ac.png)

スマホ画面のスクショを撮るには、まずDevToolsからノートパソコンとスマホのアイコンを押してDevice toolbarを開く。Ctrl+Shift+Mでもできる。そこからデバイスを選ぶかRespnsiveを選んで自分で解像度を設定する。スクショを撮るには右上の ***⋮*** メニューからCapture screenshotで現在見えてる内容をスクショをとるか、Capture full size screenshotでページ全体のスクショを撮る。これも勝手にファイルに保存される


### 終わりに
今回は上記の機能だけを紹介させていただいたが、他にたくさんある。Runメニューが特に面白いが、Networkパネルとパフォーマンスモニターパネルもかなり便利。


役に立つリンクをいくつか貼っとく
[DevTools公式ドキュメンテーション](https://developer.chrome.com/docs/devtools)
・[AI assistant](https://developer.chrome.com/docs/devtools/ai-assistance/quickstart)
・[Layers](https://developer.chrome.com/docs/devtools/layers)
・[パフォーマンス モニター パネル](https://developer.chrome.com/docs/devtools/performance-monitor?hl=ja)
スマートロック自作のためのサーボモータ選び

スマートフォンで操作できる錠を自作するにあたり、最も重要なパーツとなるサーボモータの選定について学習したことをまとめておきます。

## サーボモータ選定の3大ポイント

モータを選ぶ際の重要な指標は以下の3点です：

1. トルク（回転力）
2. 動作速度
3. 動作角度

## トルクについて詳しく解説

### 単位の理解
トルクの単位には主に「kgf・cm」（キログラムフォース・センチメートル）と「N・m」（ニュートン・メートル）が使われます。

例えば、1.5kgf・cmのトルクは、モータの回転軸から1cm離れた位置で1.5kgの重さに相当する力を発生できることを意味します。

### 重要な用語の整理
- **kgf（キログラム力）**: 1kgの質量に地球の重力加速度（約9.807 m/s²）が作用したときに生じる力
- **kg（キログラム）**: 純粋な質量の単位
- **ストールトルク**: モータが完全に停止した状態での最大トルク（カタログ値）
- **定格トルク**: 継続的に使用可能なトルク（一般的にストールトルクの約40%）

## 動作速度の理解

サーボモータの動作速度は、60度回転するのに要する時間（秒）で表現されます。これは「秒/60°」という形式で記載されることが一般的です。

## 動作角度の重要性

動作角度はサーボモータの最大回転範囲を示します。用途に応じて必要な角度が変わってくるため、余裕を持った選定が重要です。

## 実際に購入したサーボモータのスペック分析

https://amzn.asia/d/jaE2z1X
### 主要スペック
- **ストールトルク**: 
  - 4.8V時: 2.0±0.20kg・cm
  - 6.0V時: 2.2±0.20kg・cm
- **動作速度**（無負荷時）:
  - 4.8V時: 0.09±0.01秒/60°
  - 6.0V時: 0.08±0.01秒/60°
- **動作角度**: 200°±1°

### スペック評価
1. **トルク面**: 定格トルクは約0.8kg・cm（ストールトルクの40%）となり、鍵の操作に十分な力を確保
2. **速度面**: 90度の回転に約0.15秒という高速性能。実用上は問題なし
3. **角度面**: 目標の180°を上回る200°の動作範囲を確保

## まとめ

選定したサーボモータは、スマートロックの要件を十分に満たすスペックを持っています。特に動作角度に余裕があるため、様々な鍵のタイプに対応できる柔軟性を確保できました。
最終通信日を確認する方法

:::note info
Tanium Cloud製品の機能を1つずつ勉強していきます。
:::

# １．この記事で書くこと
・直近でいつTaniumサーバと通信したかを確認する方法。
　現在オフラインだったり、Assetに表示されない端末についての調査のときに使う。

# ２．手順

(1)「Administration」＞「Configuration」 > 「Client Health」をクリック

(2)リストが表示される。Last Registration列で確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/5a05a31b-7ed5-7f8c-eaad-225353232933.png)


「Show system that have...」のチェックを外すと、いまいまのオンライン/オフライン問わず、端末が一覧化される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/95f41a60-e4fa-d948-8644-20d48be76d59.png)


(3)エクスポートも可能！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/9dad08f8-b6da-0376-9849-ec622302a45b.png)
Microsoft公式アイコン画像(VisualStudioイメージライブラリ)

# はじめに
ソフトで使うアイコンをデザインするのはちょっとハードルが高いですよね？
例えばファイルアイコンやディレクトリアイコンなど、ちょっとしたアイコンでも実際に自分で作るとなると思ったより時間がかかったりします。
Material Designのアイコンもいいですが、マイクロソフトが提供しているVisual Studioのイメージライブラリもどうでしょうか。

![AutoThumbnail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/68d5e99d-3798-c105-3139-5cacf1f36fc7.png)
![AddToDependancyGraphAncestor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/6f7087f4-60e9-3bd8-c2f7-94059454ba33.png)
![Accessibility.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/8bcf53e3-b5c7-d192-50ee-9c0e3ef55363.png)

# Visual Studioのイメージライブラリとは
Visual Studioのイメージライブラリは、マイクロソフトが開発者向けに提供している、フリーで使える画像やアイコンのセットです。このライブラリには、次のような素材が含まれています：
- アイコン: 一般的なボタンや機能(保存、印刷、検索など)に対応したデザイン
- 画像: ヘッダーや装飾に使える
- ファイル形式: PNG、SVG、ICOなど

WindowsOSやMicrosoft製品でよく見るデザインのアイコンや画像が揃っています。

# Visual Studioイメージライブラリの取得方法
Visual Studioイメージライブラリの取得方法は以下の方法があります。
- サイトからzipファイルをダウンロードして展開
- Visual Studioのインストールフォルダ内を探す

ダウンロードする場合は「Visual Studioイメージフォルダ」と検索するか、以下のリンクからどうぞ。
[Visual Studio Image Library](https://www.microsoft.com/en-us/download/details.aspx?id=35825)

https://www.microsoft.com/en-us/download/details.aspx?id=35825

適切なサイズのアイコンを使うことで、UIの見た目がより整います。イメージライブラリには複数の解像度が用意されているので、必要に応じて選びましょう。

# 注意
どんな素材を使用する時も注意すべきなのが、__ライセンス__ です。
特に商用利用する場合は自分でご確認下さい。

# まとめ
Visual Studioのイメージライブラリは、ダウンロードするだけで使用できるので初心者でも簡単に使えます。
UIデザインの手間を省きながら、統一感のあるアプリケーションを作成するのに役立つツールです。ぜひ活用して、かっこいいプロジェクトを作りましょう！

# 余談
Micorosoftのアイコンのデザインのポイントをまとめた公式ページがあり、とてもデザインの勉強になったので共有します。
[Visual Studio のイメージとアイコン](https://learn.microsoft.com/ja-jp/visualstudio/extensibility/ux-guidelines/images-and-icons-for-visual-studio?view=vs-2022)

https://learn.microsoft.com/ja-jp/visualstudio/extensibility/ux-guidelines/images-and-icons-for-visual-studio?view=vs-2022
競技プログラミングなんでもカレンダー振り返り


競技プログラミングなんでもカレンダーを作り、
この記事で無事25記事目（完走賞🎉）

https://qiita.com/advent-calendar/2024/any-competitive-programming

学んだこと等を振り返る。

# 目次

- 学んだこと
- 投稿した記事
- 総括

# 学んだこと

期間中の新しく覚えたテクニックは以下のもの

- メモ化再帰
- mod998244353の逆数
- sortedset
- 他の配列をkeyにしてソートする

## メモ化再帰

再帰関数で何度も使う値を配列などで保存するテクニック。

defaultdict君が役に立つ

```python
from collections import defaultdict

memo = defaultdict(lambda: None)

def factorial(n):
    if n == 0:
        return 1
    if memo[n] is None:
        memo[n] = n * factorial(n-1)
    return memo[n]

print(factorial(5))  # 120
print(factorial(10)) # 3628800

```

Pythonではデコレーターもあるので便利
```python
from functools import lru_cache

@lru_cache
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)

print(factorial(5))  # 120
print(factorial(10)) # 3628800
```

## mod998244353 の逆数

確率を mod で表現するときにこのようなテクニックが必要になる。
Pythonにはpow関数でmodを使えるのでそこで-1乗を求めるだけ

```python
mod = 998244353 
inv = lambda x: pow(x, -1, mod)
```

VSCodeにスニペットを登録すると便利

```json
    "Modular Inverse": {
        "prefix": "::mod_inv",
        "body": [
            "mod = ${1|998244353,1000000007|}",
            "inv = lambda x: pow(x, -1, mod)"
        ],
        "description": "モジュラ逆数を計算する"
    },
```

## SortedSet
sortedcontainersのライブラリをインストールして使えるモジュール

setのように、同じ要素を1つだけいれることができるが、
内部は昇順に並んでいるため、先頭を取れば最小値、最後尾を取れば最大値を取得できる。

```python
from sortedcontainers import SortedSet

# SortedSetの作成
sset = SortedSet([5, 1, 3, 2, 4])

# 要素の追加
sset.add(6)
print(sset)  # 出力: SortedSet([1, 2, 3, 4, 5, 6])

# 要素の削除
sset.remove(3)
print(sset)  # 出力: SortedSet([1, 2, 4, 5, 6])

# 要素の存在確認
print(4 in sset)  # 出力: True
print(3 in sset)  # 出力: False

# 最小値と最大値の取得
print(sset[0])  # 出力: 1
print(sset[-1])  # 出力: 6
```

## 他の配列をkeyにしてソートする

同じ大きさのリストA,Bに対してAの昇順でBをソートすることもできるよねって話。
考えれば特になんでもないテクニックだが、個人的には全く思いつかなかったのでメモ。

```python
A = [3, 1, 2]
B = ['a', 'b', 'c']

# Aの順序でBをソート
sorted_B = [x for _, x in sorted(zip(A, B))]

print(sorted_B)  # 出力: ['b', 'c', 'a']
```



# 投稿した記事

種類ごとにカウント
- E問題を解いた記事: 12記事
- D問題を解いた記事: 5記事
- F問題を解いた記事: 2記事
- ABC振り返り記事: 4記事
- その他: 2記事

アドベントカレンダー開始前に
E問題を多く解くことを目標としていたが、12問と
投稿した記事の割合としては半分ぐらいの結果となった。

とりあえず目標としては達成(?)

# 期間内のABC振り返り

アドベントカレンダー期間と直前に開催されたABCの結果を軽く振り返る
- [ABC372](https://qiita.com/comet725/items/2c0a50c9add58a1cdefc): A,B,C 3完
- [ABC373](https://qiita.com/comet725/items/fa47a91b81dca6e0d15b): A,B,D 3完
- [ABC374](https://qiita.com/comet725/items/fb8746ef03651b25cc8d): A,B,C 3完
- [ABC375](https://qiita.com/comet725/items/94f09da688c4c40e23e1): A,B 2完

4完できた回がなく、それどころか最近は2完という体たらく
特に直近2回はちょっとした誤字でWA喰らっているので気をつけたい

# 総括

当初の予定通りE問題を多く解くことができたが、
ABCの結果が振るわないのでそこは残念だったところ。

まだまだ精進が必要だと思った
ゼロからのＯＳ自作入門 メモ #2

# 前置き
本記事は「ゼロからのOS自作入門」のメモになります。
仕事上OSの知識があってもいいなと思って、取り組むことにしました。
各章に対し、1記事をOutputする予定です。
前の章はこちら
https://qiita.com/fuji3195/items/1495df96a164b23a9007

## EDKとは
EDKⅡ：UEFI BIOS本体および、UEFI BIOS上で動くアプリケーションを開発するための開発キット
もともとIntelが実装したものをオープンソースにした。

## Mikan OSを取得
```
git clone https://github.com/uchan-nos/mikanos.git
# EDKⅡのディレクトリににMikanOSのブートローダディレクトリをリンク
cd $HOME/edk2
ln -s $HOME/'workspace'/mikanos/MikanLoaderPkg ./
source edksetup.sh
```
`workspace`にはgitでcloneしたワークスペースのパスを入れる。
`Conf/target.txt`が生成されるので、中身のうち以下の項目を書き換える。
|          設定項目 | 設定値 |
|:----------------:|:------:|
| ACTIVE_PLATFORM  | MikanLoaderPkg/MikanLoaderPkg.dsc |
| TARGET           | DEBUG |
| TARGET_ARCH      | X64  |
| TOOL_CHAIN_TAG   | CLANG38  |

`build`でビルドすると、何かがビルドされる。

## ハローワールド
通常のC/C++では,main()がスタートになるが、EDK2では、自由にスタート地点を決められる。
その際に、Loader.infにある、ENTRY_POINTを参照する。
buildを行おうとすると、そのままではうまくいかず、以下のエラーが出て失敗する。
```
/home/user/edk2/MikanLoaderPkg/MikanLoaderPkg.dsc(...): error 4000: Instance of library class [RegisterFilterLib] is not found
        in [/home/user/edk2/MdePkg/Library/BaseLib/BaseLib.inf] [X64]
        consumed by module [/home/user/edk2/MikanLoaderPkg/Loader.inf]
```
これは新しいEDKでエラーの原因が追加されたためらしい。
そこで, gitからcheckoutするとうまくいく。古いバージョンをインストールしているイメージ。
```
cd $HOME/edk2
git checkout 38c8be123aced4cc8ad5c7e0da9121a181b94251
```

## メモリマップ
git checkoutで02bに変更する。
GetMemoryMap()について解説。
```
gs->GetMemoryMap(
    IN OUT UINTN *MemoryMapSize, // 入力：メモリマップ書き込み用のメモリ領域の大きさ。出力：実際のメモリマップの大きさ。
    IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, // メモリマップ書き込み用のメモリ領域の先頭ポインタ。後ほど紹介。
    OUT UINTN *MapKey, // メモリマップを識別するための値を書き込む変数。後で使う。
    OUT UINTN *DescriptorSize, // メモリマップの個々の行を表すメモリディスクリプタのバイト数を表す。UEFIの実装によっては構造体が拡張されていたりしてByte数が異なる可能性があるため。
    OUT UINT32 *DescriptorVersion // メモリディスクリプタの構造体のバージョン。
);
```
メモリ領域に書き込まれるデータの構造は、EFI_MEMORY_DESCRIPTOR構造体の配列になっている。
EFI_MEMORY_DESCRIPTOR配列は以下の構造
| フィールド名 | 型 | 概要 |
|:-|:-|:-:|
|Type           | UINT32                | メモリ領域の種別  |
|PhysicalStart  | EFI_PHYSICAL_ADDRESS  | メモリ領域の先頭の物理メモリアドレス  |
|VirtualStart   | EFI_VIRTUAL_ADDRESS   | メモリ領域の先頭の仮想メモリアドレス  |
|NumberOfPages  | UINT64                | メモリ領域の大きさ(4KiBページ単位)  |
|Attribute      | UINT64                | メモリ領域が使える用途を示すbit集合  |

メモリマップは`UefiMain()`でファイル保存する。
指定されたプログラムを実行すると、下のような情報が手に入る。

Memory Mapはファイルへ保存する。
その際に`SaveMemoryMap()`で行う。
printは`Print(L"...", format)`を使っている。ここは通常のprintf文とは異なる。
AsciiPrintでそれぞれの要素をAsciiで出力する。
出力する要素は，`itr num, Descriptor Type, GetMemoryType, 物理Startアドレス, Page数, Attribute&0xFFFFF`の順で並べている．

Buildすると，Loader.efiが作成される．
これを実行した後，mountし下にあるmemmapを除くと，Memory Mapの中身を確認できる．
ここら辺は指示通りに行えば問題ない．

ポインタに関しては基本なので省略．

# 感想
まだ何をやっているかわかっていない，という感じ．
EDK2を使っているのに，EDK2の全貌が見えない．
今後EDK2を理解できるようになるのか，それともそんなに使わないのかで，ここの理解度も変わってきそう．
初心者が考える APIとは？

# 初心者が考えるAPIとは

## はじめに
こんにちは。この記事では、まだ学び始めたばかりである自分なりの解釈でAPIとは何なのか？どのように使うのかなどを調べてまとめました。プログラミングやITに興味を持っているなら、この言葉を一度は耳にしたことがあるのではないでしょうか？APIは、実は日常の中ですでに使われている便利な仕組みです。まずはじめにAPIの意味などについて紹介します。
## APIとは？

### APIの意味
APIは「Application Programming Interface」の略で、ソフトウェア同士がデータや機能をやり取りするための「窓口」のようなものです。例えば、天気情報アプリが気象情報を取得する際にAPIが利用されています。

### APIの近しい例
- **天気予報アプリ**：気象情報APIを利用して最新の天気を表示。
- **SNSのシェアボタン**：TwitterやInstagramのAPIを使って投稿を簡単にシェア。
- **地図アプリ**：Google Maps APIでルート案内や地図を他のアプリに組み込み。

このようなAPIの存在により、私たちは便利なサービスを日常的に利用できているのです。

## APIの仕組み

APIの基本的な仕組みは、下記の2つのステップで成り立っています：

1. **リクエスト**
   クライアント（利用者）がサーバー（提供者）に「データをください！」とリクエストを送ります。
2. **レスポンス**
   サーバーがリクエストに応じて「はい、どうぞ！」とデータを返します。
```mermaid
graph LR;
    天気情報アプリ-->|〇〇県の天気が知りたい|API;
    API-->|〇〇県の天気を探す|気象情報の保存先;
    気象情報の保存先-->|〇〇県「晴れ」|API
    API-->|〇〇県の天気は「晴れ」です。|天気情報アプリ
```
### HTTPメソッド
APIは主にHTTPを使ってやり取りします。以下は代表的なHTTPメソッドです：
- **GET**: データを取得する（例：天気情報を取得）
- **POST**: データを送信する（例：新しい投稿を追加）
- **PUT**: データを更新する（例：プロフィール情報を変更）
- **DELETE**: データを削除する（例：投稿を削除）

これらを使って、クライアントとサーバーが「会話」するのがAPIの仕組みです。

## 初心者でも試せるAPI

実際にAPIを使ってみると、理解が深まります。以下は初心者におすすめの無料APIです。

### 1. OpenWeatherMap API
- **概要**：天気情報を取得できるAPI。
- **URL**：[OpenWeatherMap](https://openweathermap.org/)
- **使い方**：APIキーを取得して、都市名を指定すると天気情報が取得可能。

### 2. ポケモンAPI
- **概要**：ポケモンのデータを提供。
- **URL**：[PokeAPI](https://pokeapi.co/)
- **使い方**：ポケモンの名前や特性、ステータスなどを取得可能。

### 3. Google Map API
- **概要**：Google Mapのデータを提供。
- **URL**：[Google map API](https://cloud.google.com/)
- **使い方**：Google Mapの地図情報、経路情報などを取得可能。
## APIを学ぶメリット

- **実際の開発に応用できる**
  APIを使えば、他のサービスやデータを簡単に活用できます。
- **プログラミングスキルが向上する**
  リクエストとレスポンスのやり取りを学ぶことで、知識が身につきます。
- **創造性が広がる**
  APIを使えば、自分のアイデアを形にする可能性が広がります。

## まとめ
APIは、ソフトウェア同士が効率的に「会話」できるための仕組みであり、現代のIT技術やサービスの基盤を支える重要な技術だと考えます。これを学ぶことで、他のサービスとの連携やデータ活用が可能となり、自身のスキルや可能性を広げる一歩となります。
初心者として、この記事を書くことで自分自身の理解を深めることができました。そして、APIを活用することで、プログラミングの楽しさや、ITがもたらす便利さを改めて実感しました。この記事が、皆さんのAPI学習への一助となれば幸いです。最後までご覧いただきありがとうございました。

参考資料
ビジネス+IT APIとは何か？ API連携ってどういうこと？ 図解で仕組みをやさしく解説
https://www.sbbit.jp/article/cont1/62752?page=2
kwcplus 今さら聞けない「API」とは？初心者にもわかりやすく解説
https://kwcplus.kddi-web.com/blog/what-is-api
【愛すべきポンコツたちへ】会議招集した日が祝日だった時に自分に知らせるPower Automateフロー

この記事は [Microsoft Power Automate Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerautomate) 12月23日 担当分です。

## こんな経験、ありませんか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/df38b265-7394-e63d-2793-5abbf69a92cf.png)

「おっ、この日ならみんな割と予定空いてるやん」と思って会議招集したら、直後に「その日は祝日だよ(笑)」と言われた経験はありませんか？参加者が多い会議だとより恥ずかしいものです。

## すぐに証拠隠滅するためのフロー

祝日にメールを送ってしまったときに、素早く気付くためのPower Automateフローを作ります。

### フローの全体

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f510314e-8b9f-5aa0-5733-cd873cad824b.png)

### 作り方

1. トリガー：「新しいイベントが作成されたとき (V3)」で会議作成を検知
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/1acab614-3a28-5f5b-3be0-9043d2686aa5.png)

2. 「作成」で自分のメールアドレスを定数として保持
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/82c0ec29-51ae-d8dc-a38a-b94279c5c16c.png)

3. 「イベントのカレンダー ビューの取得 (V3)」で日本の休日を取得
- 開始時刻と終了時刻はトリガーの出力から選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/4fa32118-a838-c02e-78da-1e83ba921f69.png)

4. 「条件」設定：
- 日本の休日の出力件数が0でない
- 開催者が自分である
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/302aabb0-fb2f-adb6-b06a-101ce6bd69b4.png)

5. trueの場合、「チャットまたはチャネルでメッセージを投稿する」で自分にメール送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/fd07e281-3751-437e-038b-0a037da1d43f.png)

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/a3b25dec-4e45-7bb7-a1eb-748e4a879814.png)

休日の場合、WorkflowsからTeamsでチャットが送られます。会議名の付記やアダプティブカードでのキャンセル機能追加なども検討可能です。

## 元記事

https://powerplatformnikki.com/holidaycheck/
Snowflakeで巡回セールスマン問題を解いてみる

# やること
　[Snowflakeで数理最適化の問題（整数計画問題）を解いてみる](https://qiita.com/mshdtksk/items/686b10ad62e81a17c04c)で解いた最適化問題の中でも難しい組合せ最適化問題をSnowflake を用いて解いてみる．少し難しい理由は，こちら[明日から役立つ「オペレーションズ・リサーチ概論」](https://www.udemy.com/course/ortkskmshd/?referralCode=A2AABFA1B0E9C5C980C7)を視聴いただければ幸いである．
　今回は，巡回セールスマン問題と呼ばれる問題を解いてみる．都市の集合と各2都市間の移動コスト（たとえば距離）が与えられたとき，**全ての都市をちょうど一度ずつ**巡り出発地に戻る巡回路のうちで総移動コストが最小のものを求める（セールスマンが所定の複数の都市を1回だけ巡回する場合の最短経路を求める）組合せ最適化問題である．この問題は，NP困難と呼ばれる問題のクラスに属する．
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/f111523e-aaed-9a33-8896-ef9ed2255068.png)


 # サンプルコード
以下，Python on Snowflake で動作するサンプルコードである．特に何の工夫もせず，全列挙で最適解を求めているため，少しでも規模が大きくなると厳密な最適解が得られなくなる，または，計算時間が大きくなる．
Snowflake のデータベースへのアクセスは行っていないが，応用すれば，Snowflake のデータベースからデータを入力し，結果を書き込むことも可能である．
```Python
import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col
import pandas as pd
import itertools

def main(session: snowpark.Session): 

    # 距離行列 (都市間距離)
    distances = [
        [0, 10, 15, 20],
        [10, 0, 35, 25],
        [15, 35, 0, 30],
        [20, 25, 30, 0]
    ]
    city_names = ["x1", "x2", "x3", "x4"]

    # 実行
    df_result = solve_tsp_bruteforce_with_df(distances, city_names)
    print(df_result)

    dataframe = session.create_dataframe(df_result)
    
    return dataframe

def calculate_distance(path, distances):
    """パスの総距離を計算"""
    total_distance = 0
    for i in range(len(path) - 1):
        total_distance += distances[path[i]][path[i + 1]]
    # 戻ってくる距離を加える
    total_distance += distances[path[-1]][path[0]]
    return total_distance

def solve_tsp_bruteforce_with_df(distances, city_names):
    """TSPを網羅的探索で解き、結果をデータフレームで出力"""
    n = len(distances)
    cities = list(range(n))  # 都市のインデックス
    min_path = None
    min_distance = float('inf')

    # 全ての経路を探索
    for perm in itertools.permutations(cities):
        current_distance = calculate_distance(perm, distances)
        if current_distance < min_distance:
            min_distance = current_distance
            min_path = perm

    # 最短経路をデータフレームに変換
    records = []
    for i in range(len(min_path)):
        var1 = city_names[min_path[i]]
        var2 = city_names[min_path[(i + 1) % len(min_path)]]
        val = distances[min_path[i]][min_path[(i + 1) % len(min_path)]]
        records.append([var1, var2, val])

    # 合計距離の行を追加
    records.append(["opt", "opt", min_distance])

    # データフレームに変換
    df = pd.DataFrame(records, columns=["var1", "var2", "val"])
    return df
```
【TypeScript】カレー作りで理解するany型とunknown型の違い

## はじめに
TypeScriptの`any`型と`unknown`型は、どちらも「任意の値を受け入れる」という特性を持っていますが、それぞれ異なる使い方が求められます。今回は私の好物であるカレー作りを例にとって、両者の違いをわかりやすく解説します！

## プログラミングは料理と同じ

料理をしたことがない人に、いきなり「フランス料理を作って」と言われても、それを実現するのはとても難しいでしょう。料理では、まず基本的な技術や知識を学ぶことが大切です。食材の切り方、調味料の使い方、火加減の調整など、一つひとつの要素を理解していくことで、徐々に複雑な料理にも挑戦できるようになります。

プログラミングも同じです。クラスや関数など、多くの概念を一度に理解するのは難しく感じるかもしれません。しかし、基本的な構文やロジック、ツールの使い方などを少しずつ学んでいくことで、次第に複雑なアプリケーションやシステムを構築できるようになります。

料理もプログラミングも、基礎を積み重ねることが成功の鍵です。一つひとつの要素を丁寧に学び、経験を積むことで、自分の手で創造的な成果を生み出せるようになるのです。焦らず、着実に取り組んでいきましょう！

## any型
`any`型は、TypeScriptにおける「何でもあり」の型です。  
この型を使うと、どんな値でも格納できるうえに、どんな操作も許容されます。しかし、自由すぎるため、予期せぬエラーやバグを引き起こす可能性があります。  
言い換えれば、`any`型は「冷蔵庫にあるものをすべて使って何か作ってみよう」というスタイルです。結果として、カレーのつもりが謎の料理になってしまうかもしれません。

```typescript
let ingredient: any;
ingredient = "じゃがいも";
ingredient = 42; // エラーにならない
console.log(ingredient.toUpperCase()); // 実行時エラーになる可能性
```

## unknown型
一方、unknown型は「安全なany型」と呼ばれます。
どんな値でも代入できますが、具体的な操作を行う前に、その値の型を明示的にチェックする必要があります。これにより、不適切な操作を防ぐことができます。
つまり、unknown型は「この食材がカレーに使えるかどうか、まず確認してから調理しよう」というスタイルです。

```typescript
let ingredient: unknown;
ingredient = "にんじん";
if (typeof ingredient === "string") {
  console.log(ingredient.toUpperCase()); // 型が確認されているので安全
}
```
## カレーで例えると・・・
カレー作りにany型とunknown型を当てはめてみましょう。

### any型のカレー作り
冷蔵庫にあるものを何でも放り込む。キムチやチョコレート、牛乳、果ては炭酸飲料まで入れることも許されます。結果として「カレー」と呼べないものが完成する可能性があります。

### unknown型のカレー作り
冷蔵庫から取り出した食材をまず確認。「これは具材として適切か？」を一つ一つチェックし、合格したものだけを使います。安全でおいしいカレーが完成するでしょう。

## まとめ
any型とunknown型の違いをカレー作りで例えると以下のようにまとめられます。

- any型：自由すぎるが、結果が予測できない危険性がある。
- unknown型：明示的な型チェックを求められるが、安全性が高い。

プログラムでもカレー作りでも、安全で確実な結果を求めるならunknown型を使いこなしましょう。TypeScriptの型を正しく理解し、思い通りのコードを書けるようになりましょう！
【Power Apps】DateDiff関数とは、使い方

# DateDiff関数の使い方と活用例

この記事では、DateDiff関数の概要と基本的な使い方、活用例を紹介します。

この記事は [Microsoft Power Apps Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerapps) シリーズ3 12月4日 担当分の記事です。

## 関数説明・構文

> 2 つの日付/時刻値の差を返します。 この結果は、単位の整数です。

引用元: [Microsoft公式ドキュメント](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-dateadd-datediff)

```
DateDiff(StartDate, EndDate, TimeUnit)
StartDate：差を計算する開始日
EndDate：差を計算する終了日
TimeUnit：差を計算する単位（Days、Months、Years、Hours、Minutes、Seconds）
```

## 使い方

二つの日時の差を算出します。日や時間の差分計算でよく使います。

### 日単位での計算

1582年10月4日から1582年10月15日までの日数を計算する例です。

```
DateDiff(DateValue("1582/10/4"), DateValue("1582/10/15"), TimeUnit.Days)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/8b3b3292-fd81-2263-7d88-6432df77b279.png)

結果は11となります。

### 年単位での計算

1978年9月17日から本日(2024年12月19日)までの年数を計算します。

```
DateDiff(DateValue("1978年9月17日"), Today(), TimeUnit.Years)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/067f7724-fa22-f8da-4091-8e9c4cbb2cbd.png)

結果は46となります。

### 時間単位での計算

1969/7/20 20:17:00から1969/7/21 17:54:00までの時間差を計算する例です。

```
DateDiff(
    DateTimeValue("1969-07-20 20:17:00"),
    DateTimeValue("1969-07-21 17:54:00"),
    TimeUnit.Hours
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/ffee596f-843c-127d-3c4c-f71d48ccf729.png)

結果は21となります。

## 元記事

https://powerplatformnikki.com/datediff
【Linux Tips】2つのビデオデバイスが存在するUSBカメラをudevで名前を固定する方法

# はじめに
　USBカメラが2つのビデオデバイスを持っている場合に、udevで名前を固定する方法を紹介する。

# 動作確認環境
* Ubuntu 20.04

# 前提

　USBカメラが2つのビデオデバイスを認識する場合は以下のようになっている。

ビデオデバイスを確認する。
 ```bash
 $ ls /dev | grep video
 ```

　結果が以下のようになっている場合の固定方法を紹介する。
 ```bash
 /dev/video0
 /dev/video1
 ```

# 方法

 基本的なudevでUSBデバイスを固定する方法は、[こちらの記事](https://qiita.com/porizou1/items/f8e23e32ed8e1be85c65)を参照。
 基本の設定に加えて、ビデオデバイスの順番を決めている```ATTR{index}```を追加する。rulesファイルは以下のようになる。
```bash: /etc/udev/rules.d/99-some-usb-camera.rules
KERNEL=="video*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="YYYY", ATTR{index}=="0", SYMLINK+="some-usb-camera-video0", GROUP="video", MODE="0666"
KERNEL=="video*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="YYYY", ATTR{index}=="1", SYMLINK+="some-usb-camera-video1", GROUP="video", MODE="0666"
```
* ```ATTRS{idVendor}```、```ATTRS{idProduct}```：　デバイスに応じて適宜設定する
* ```SYMLINK```：　固定したい名称


　rulesファイルは、```/etc/udev/rules.d```ディレクトリ内に保存する。以下のコマンドで設定を反映する。

```bash
$ sudo udevadm control --reload-rules && sudo udevadm trigger
```

```bash
$ ls /dev | grep video
```
　結果が以下のようになっていれば成功。
```bash
/dev/some-usb-camera-video0
/dev/some-usb-camera-video1
/dev/video0
/dev/video1
```


# まとめ

　USBカメラが2つのビデオデバイスを持っている場合に、udevで名前を固定する方法を紹介した。複数のビデオデバイスを持っているUSBカメラの名前を固定したい場合に有用。


# 参考

https://qiita.com/porizou1/items/f8e23e32ed8e1be85c65

https://askubuntu.com/questions/1171192/multiple-dev-video-devices-for-1-camera-causing-issue-with-udev-rules

https://askubuntu.com/questions/49910/how-to-distinguish-between-identical-usb-to-serial-adapters
【Power Automate】平日のみカウントしたn日前を取得する方法

この記事では、Power Automateで平日（月曜日から金曜日）のみをカウントしてn日前の日付を取得する方法を説明します。
ExcelのWORKDAY関数のような計算をやります。

祝日カウントを行うと煩雑になるので、土日のみを除外してカウントする方法を紹介します。

※ この記事は、[Microsoft Power Automate Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerautomate) 12月21日 担当分の記事です。

## 概要

### カウント例

今日が12/18の場合、単純に7日前を計算すると12/11となりますが、平日のみカウントして7日前を計算すると12/9となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/622f5aab-35b5-f9ca-1efc-c7c2a7ac6c03.png)

他にも10日前をカウントすると平日のみカウントの場合は12/4となります。

### この計算を行う数式

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/60448c27-ff7c-e1a7-a42f-83822acc0e18.png)
n：日数
m：今日の曜日インデックス（dayOfWeek関数の出力：日=0, 月=1, 火=2, 水=3, 木=4, 金=5, 土=6）

平日のみのカウントは、通常のカウント(n)に週の数分の土日を追加することで総日数を算出でき、今日から総日数を引くことで計算できます。

## 実装方法

### フローの作成・トリガーの設定

1. Power Automateで新しい「インスタント フロー」を作成します
2. トリガーとして「フローを手動でトリガーする」を選択します
3. 入力として「n」（n日前）を受け取るように設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/0960b2e0-04a5-f516-4955-f4bb15013720.png)

### 総日数を計算

「作成」アクションを追加し、以下の数式を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/2f3b8f94-3617-4fdd-c09c-298f052b070e.png)

```
add(
    triggerBody()?['number'], 
    mul(
        div(
            add(
                add(triggerBody()?['text'], 5), 
                mul(dayOfWeek(utcNow()), -1)
            ), 
            5
        ), 
        2
    )
)
```

この式の各部分の説明：

* `triggerBody()?['text']`: 入力された平日数
* `dayOfWeek(utcNow())`: 現在の曜日（0=日曜, 1=月曜, …, 6=土曜）
* `add`, `mul`, `div`: それぞれ加算、乗算、除算を行う関数

### 日付計算の実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/4b92b869-9392-d018-0e61-059d5bd5d868.png)

```
formatDateTime(
    addDays(
        utcNow(), 
        mul(
            -1, 
            outputs('作成')
        )
    ), 
    'yyyy-MM-dd'
)
```

## 実行結果

nに7を入力して実行すると、9日前、12/9が出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/112c8a04-3629-2ecf-8e6f-ad8d4236fb89.png)

同様に10日前を実行すると、9日前、12/9が出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/15e49efa-f283-20d6-5e35-b690ddf94c7a.png)

## 関連記事

https://powerplatformnikki.com/businessdaycalendartemplate

## 元記事

https://powerplatformnikki.com/workdaycount
【Git】古いコミットのコミットメッセージを変更する方法

古いコミットは以下の手順でコミットメッセージを変更できます。

1. 対象のコミットがあるブランチに移動する
2. ターミナルで `git rebase -i HEAD~n` コマンドを実行する
	 最後から3つのコミットを変更したい場合には `git rebase -i HEAD~3` を実行する
1. 変更したいコミットメッセージの先頭の `pick` を `reword` に書き換える
2. エディタを閉じる
3. 開いたエディタでコミットメッセージを変更する
4. エディタを閉じる
5. ターミナルで `git rebase --continue` を実行する（エラーが発生する場合）

既にプッシュしている場合には上記に加えて強制プッシュする必要があります。

```shell
git push --force-with-lease origin EXAMPLE-BRANCH
```

## 参考

https://docs.github.com/ja/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/changing-a-commit-message
【競技プログラミング】AtCoder Beginner Contest 307_D問題

# 問題
https://atcoder.jp/contests/abc307/tasks/abc307_d

## 要約
1. 長さNの文字列Sが与えられる。
2. Sは英小文字と括弧 ( ) で構成されている。
3. 以下の操作を可能な限り繰り返す：
   - Sの連続部分文字列で、以下の条件を満たすものを1つ選んで削除する
     * 最初の文字が (
     * 最後の文字が )
     * 最初と最後以外に ( や ) を含まない
4. 操作を繰り返した後の最終的なSを出力します。

- N: 文字列Sの長さ
- S: 与えられる文字列

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)


# アプローチ

スタックを使用して、括弧で囲まれた部分を処理する。
文字列を左から右へ走査し、開き括弧 "(" に遭遇したら新しいグループをスタックに追加する。
閉じ括弧 ")" に遭遇したら、対応する開き括弧があればそのグループを削除し、なければ結果に追加する。
英小文字はスタックの最上位のグループに追加するか、スタックが空の場合は結果に直接追加する。
最後に、スタックに残っているグループを結果に追加して最終的な文字列を得る。

# 解法手順

1. 入力を受け取り、文字列Sを1文字ずつ処理する準備をする。
2. 空のスタックと結果リストを用意する。
3. Sの各文字に対して以下の処理を行う：
   - 文字が "(" の場合、新しいグループとしてスタックに追加する。
   - 文字が ")" の場合：
     * スタックが空でなければ、最後のグループを削除（対応する括弧を削除）。
     * スタックが空なら、結果リストに ")" を追加。
   - それ以外の文字（英小文字）の場合：
     * スタックが空でなければ、最後のグループに文字を追加。
     * スタックが空なら、結果リストに文字を追加。
4. スタックに残っているグループがあれば、それらを順番に結果リストに追加する。
5. 結果リストの文字を連結して最終的な文字列を作成し、出力する。

# ACコード
```python:ac.py
def io_func():
    # 入力を受け取る
    N = int(input())  # 文字列の長さ（この問題では使用しない）
    S = input()  # 処理する文字列
    return S

def solve(S):
    stack = []  # 括弧のグループを管理するスタック
    ans = []  # 結果を格納するリスト

    for s in S:
        if s == "(":
            # 開き括弧の場合、新しいグループをスタックに追加
            stack.append(["("])
        elif s == ")":
            if stack:
                # 閉じ括弧で、対応する開き括弧がある場合、グループを削除
                stack.pop()
            else:
                # 対応する開き括弧がない場合、結果に追加
                ans.append(s)
        else:
            if stack:
                # スタックが空でない場合、最後のグループに文字を追加
                stack[-1].append(s)
            else:
                # スタックが空の場合、結果に直接追加
                ans.append(s)

    # スタックに残っているグループを結果に追加
    for s in stack:
        ans += s

    # 結果のリストを文字列に変換して返す
    return "".join(ans)

if __name__=="__main__":
    # メイン処理
    S = io_func()
    result = solve(S)
    print(result)

###
# - N: 入力文字列の長さ（この問題では使用しない）
# - S: 処理する入力文字列
# - stack: 括弧のグループを管理するスタック
# - ans: 結果を格納するリスト
# - s: 文字列Sの各文字

# 1. io_func関数:
#    - 標準入力から文字列の長さNと文字列Sを読み取る
#    - 文字列Sを返す
# 2. solve関数:
#    - 入力文字列Sを受け取り、処理を行う
#    - スタック(stack)と結果リスト(ans)を初期化
#    - 文字列Sの各文字に対して以下の処理を行う:
#      a. 開き括弧"("の場合、新しいグループをスタックに追加
#      b. 閉じ括弧")"の場合:
#         - スタックが空でなければ、最後のグループを削除
#         - スタックが空なら、結果リストに")"を追加
#      c. それ以外の文字（英小文字）の場合:
#         - スタックが空でなければ、最後のグループに文字を追加
#         - スタックが空なら、結果リストに文字を追加
#    - スタックに残っているグループを結果リストに追加
#    - 結果リストを文字列に変換して返す
# 3. メイン処理:
#    - io_func関数を呼び出して入力を取得
#    - solve関数を呼び出して結果を得る
#    - 結果を出力する```
GASを使ってPageSpeed InsightsのAPIにアクセスしてパフォーマンススコアを取得してみる（APIキー使用）

## 概要

GASを使ってAPIキーを使わず、PageSpeed InsightsのAPIにアクセスしパフォーマンススコアを取得し、ログに出力してみる。

## 前提

下記、または下記に準ずる方法でGoogle CloudにてAPIキーが作成されていること。

https://qiita.com/miriwo/items/efa265ba8e38e914591a

## 内容

1. Google Cloudのサイドバーの「APIとサービス」をクリック
1. サイドバーの「ライブラリ」をクリック
1. PageSpeed Insights APIと検索しヒットした内容をクリック
1. 有効化をクリック
1. 任意の名前でGASを作成し、下記のコードをそのまま記載

    ```js
    function getPageSpeedInsightPerformanceScore() {
    //const url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=スピードを知りたいページのURL&key=APIキー&strategy=desktop';
    const url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=スピードを知りたいページのURL&key=APIキー&strategy=mobile';
    
      try {
        const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
        
        const content = response.getContentText();
        const json = JSON.parse(content);
      
        if (json.lighthouseResult && json.lighthouseResult.categories) {
          const categories = json.lighthouseResult.categories;
          Logger.log('情報取得時間（UTC）: ' + json.lighthouseResult.fetchTime);
          Logger.log(categories.performance.score * 100);
        } else {
          Logger.log('Categories not found in response.');
        }
      } catch (e) {
        Logger.log('Error: ' + e.toString());
      }
    }
    ```

1. そのまま上記を実行

情報をフェッチした時間（UTC）とパフォーマンススコアが取得できる。

## 参考文献

https://qiita.com/miriwo/items/8c5fa65d47e1779a0081
2025年のトレンド: 自分で作るブレイドとバンダナヘアスタイル


2025年は、ヘアスタイルにおいて自分で簡単に作れるブレイドとバンダナの素晴らしさが高く評価される年になりそうです。この記事では、バンダナを使ったブレイドヘアスタイルをDIYで楽しむためのアイデアやテクニックをご紹介します。

ファッションブレイドとバンダナ

ファッションブレイドは、今でも盛んに流行しているヘアスタイルですが、これにバンダナを組み合わせることでより個性が充実します。

準備物

何色もあるバンダナ

ヘアピン

スプレーブラシを使った垢制作グッズ

作り方

髪の中央を垢を作り、そこにバンダナを織り込むようにブレイドを作ります。

髪の穴間からバンダナをループし、既存の髪と織り合わせます。

最後に、ブレイドの先にバンダナを繋ぐと素敵な完成形が実現できます。

![collage-different-hairstyles-different-hair-styles_981385-11569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890671/32e19ff4-7f78-5b19-13e1-6ca90f23fdd3.jpeg)
ローポニーテールブレイド

ローポニーは2025年のヘアスタイルの中でも特に流行すると予測されています。ローポニーブレイドにバンダナを加えることで、清潔感と新しさを持たせるでしょう。

準備物

長さのあるバンダナ

髪を固めるためのゴム

作り方

髪を固める前にバンダナをローポニーに適切にファッションしてください。

髪を重ねながらゴムを使い、髪とバンダナを一つにします。

スティックで完成させると、とてもシンプルなヘアスタイルが実現できます。

2025年は、自分で作るブレイドヘアスタイルを大いに楽しむのに最適な年です。バンダナを加えるだけで、普通のヘアスタイルがまた新しい魅力を持つようになるので、ぜひお試しください。
強制的にqiitaを開く

# 今日はいいや
は言わせません。朝9:00にqiitaのサイトとPOPUPしてくれるタスクスケジューラを設定しました
「強制的」がキーワード！アウトプットしていきましょ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/178f3034-f570-15ff-bf7f-3ea912e61bb1.png" width=80%>



# 設定方法

![スクリーンショット 2024-12-24 224118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/8679cb61-097d-a89b-1432-f51b9073096f.png)


## VBSファイル作成（Msg用）

メモ帳　＞　Txtファイルで以下のコードを書く
```
MsgBox "qiita投稿時間だよ！がんばれーー" ,vbSystemModal + vbExclamation
```

![スクリーンショット 2024-12-24 225019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/7be46b29-9107-57a5-0a31-bce9ef7d8179.png)


この設定にしてください！

## batファイル作成(URL用)
メモ帳　＞　Txtファイルで以下のコードを書く
```
@echo off 
start Chrome.exe "自分のqiitaURL"
```
![スクリーンショット 2024-12-24 224928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/a8cf8fca-40e2-224b-a812-4af0afdbe598.png)






# タスクスケジューラー設定
.batファイル、.vbsファイル　両方同じ操作してください

![スクリーンショット 2024-12-24 225230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/8da4180a-9e7c-709c-9ca2-572d1c3fba21.png)
２つ設定します

①　トリガーの設定
![スクリーンショット 2024-12-24 225447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d7e1b5a6-0bd0-d70b-2f34-7724fbaa1d00.png)

②　操作設定

![スクリーンショット 2024-12-24 225938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d3df0b2e-ab71-bd5f-2307-18b15e2634d8.png)

PCがアクティブの状態なら9:00に起動します！


# まとめ

強制的にアウトプットを促す仕組みを作ることで、日々の習慣化が進みます。「今日はいいや」を封じ込め、9時にQiitaを開いて一歩ずつ成長していきましょう！

この設定で、毎朝のQiita活動があなたの習慣となることを願っています。アウトプットしていきましょう！
お昼ご飯食べること忘れないで！

# お昼の12:00気づきますか？
PC作業しているとついつい忘れてしまう
気づけば午後4:00、、、
夕飯もあるしいいやってなっちゃいますよね
若ければまだなんとかなりますが、年々身体を痛めつけています〜

# 強制的にPOPUPしてもらおう

タスクスケジューラで解決

※12:00になったら、pc画面にpopupされます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/71ac48c2-7ca4-b850-5932-2220ad9d92ce.png" width=80%>

# 設定方法


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/94187365-ff44-2b21-2d08-cefe6e5b368a.png)


メモ帳　＞　Txtファイルで以下のコードを書く
```
MsgBox "お昼の時間だよ～ご飯食べて！" ,vbSystemModal + vbExclamation
```

必ずこの設定にしてください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/150525a3-63b3-e2c3-e2b8-018d8124b06e.png)

# タスクスケジューラー設定
①　トリガーの設定
平日の12:00に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/2f3601e7-d85d-ce37-87a3-578e2daddb42.png)



②　操作設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/2275ac48-903e-ea5a-1ffa-9532243d7265.png)

平日12:00にメッセージきます!
そこでちゃんとキッチンへ向かいましょう

# 強制的に時間を知らせてもらう
チャイムのならない職場や、テレワークの環境だとなおさら強制的に時間を知らせてもらわないといけません！
プログラマーの集中力はとてもすごいですが、健康が第一です！