OmniAICreator/Qiita-1.07M huggingface dataset:
C#でPDFファイルに電子署名する

PDF文書に電子署名を追加することは、金融、法律、医療など多くの業界で一般的な要件です。こ れは文書の真正性と完全性を保証 し 、 署名者の ID を検証す る 手段を提供 し ます。
この記事では、[無料の.NET PDFライブラリ](https://www.e-iceblue.com/Introduce/free-pdf-component.html)を使用して、C#でPDFに電子署名を追加する方法を探ります。

## C#でPDFに電子署名するための無料ライブラリ
PDFに電子署名を追加するには、[**Free Spire.PDF for .NET**](https://www.e-iceblue.com/Introduce/free-pdf-component.html)ライブラリを使用する必要があります。以下のリンクからダウンロードするか、[Nuget](http://www.nuget.org/packages/FreeSpire.PDF/)経由で直接インストールしてください。

https://www.e-iceblue.com/Download/download-pdf-for-net-free.html


## C#でPDFに電子署名する方法
証明書を使ってPDFに署名するには、まず有効なpfx証明書ファイルを読み込み、次に **`PdfSignature`** オブジェクトを作成し、**`PdfSignature.DocumentPermissions`** プロパティを通してドキュメントのパーミッションを設定する必要があります。

**以下は、C#でPDFに電子署名を追加するコードサンプルです：**
```c#
using Spire.Pdf;
using Spire.Pdf.Security;

namespace AddInvisibleSignature
{
    class Program
    {
        static void Main(string[] args)
        {
            //サンプルPDFファイルを読み込む
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("sample.pdf");

            //証明書を読み込む
            PdfCertificate cert = new PdfCertificate("cert.pfx", "123");

            // PdfSignatureオブジェクトを作成する
            PdfSignature signature = new PdfSignature(pdf, pdf.Pages[doc.Pages.Count - 1], cert, "cert");

            //文書の変更は禁止するが、フォームへの記入は許可するよう、文書パーミッションを設定する。
            signature.DocumentPermissions = PdfCertificationFlags.ForbidChanges | PdfCertificationFlags.AllowFormFill;

            // PDFファイルを保存する
            pdf.SaveToFile("PDFSignature.pdf");
            pdf.Close();
        }
    }
}
```

**出力結果:**
![DigitallySignPDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/0233a952-e361-c85c-21e8-dc293cb9a2cc.png)

* * *

✍ 上の コ ー ド は、 PDF 文書に不可視の証明書に基づ く 署名を追加す る こ と に よ っ て PDF フ ァ イ ルに電子署名を行 う 方法を示 し てい ます。

こ れに加え て、 Free .NET PDF API は、 可視署名 （テ キ ス ト ・ 画像を含む） を PDF に追加す る こ と も サポー ト し てい ます。包括的なガイドが以下にあります：
[C#でPDFにテキストまたは画像で電子署名する](https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/PDF-Security/Create-Visible-Digital-Signature-in-PDF-with-C-Code.html)
【新入社員必見】画面の録画(動画)から、動画編集まで学んで、作業効率アップ！

# 概要
皆様はWindows11より新しく追加された機能『Clipchamp』を御存知でしょうか。
『Clipchamp』はWindows11より標準搭載された、2021年9月にマイクロソフト社が買収したオーストラリア発の動画編集アプリで、特徴としては無料ライセンスでも動画編集に必要な基本機能が一通り揃っているところです。

これにより、WindowsPCを操作した画面録画をし、編集して仕上げるまでをWindowsPCを買うだけで、追加コストなしで行えるようになりました！！
素晴らしいですね、Microsof！！

ということで、まずは画面録画方法です。


# 画面録画をしてみよう！！
```
[Windows]キー + [G]
```
キーボードで、『Windowsキー + G』を押下すると、少し暗めになり、下記のような『ゲームバー』というものが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/499ce844-326f-0fbf-08ed-38bda76f886c.png)

今回はその中の画面左上の『キャプチャ』の『録画』機能を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/e33ecedf-1c7f-a69b-253d-3a40505fe803.png)

ちなみに
```
[Windows]キー + [Alt]キー + [R]キー

```
がショートカットキーになります。

この『録画』機能を押下すると、アクティブ画面の録画がスタートされます。
※少しタイムラグがあるみたいなので、注意が必要です。

スタートされると以下の様なウィンドウが画面右上に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/11cfa0b8-7ed8-fd26-e3e5-a3a510de545d.png)

録画を停止したい時は青い『■』をクリックします。
すると以下のウインドウが表示されるのでクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/f7710664-a605-7cdd-604a-a81d902ca8db.png)

ギャラリーが表示され、録画した動画を確認できます。
また、録画した動画は以下のフォルダに保存されます。
```
C:\Users\[ユーザ名]\Videos\Captures
```

# 録画した動画を編集してみよう！！
ということで、続いて動画編集ですが、今回はWindows11より標準ソフトとしてインストールされている『Clipchamp』を使用していきたいと思います。

Widowsメニューで「clipchamp」と検索すると、すぐにヒットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/79294212-6b1f-d0f2-a805-8ebeec686443.png)

### 「最初から始める」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/4d5687eb-1cb1-669e-9868-d279df088e59.png)

### メイン画面が開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/94ddc3d1-4d21-4dd1-c61a-4e49bfc11b57.png)

### 先ほど録画した画面をドラッグアンドドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/dc4273cb-52e1-497e-a0fc-4550559956b4.png)

### 動画がインポートされたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/0ca5431f-bf3a-1d32-1e42-30dea17dceca.png)

### タイムラインに動画を取り込む
ドラッグアンドドロップして、タイムラインに動画を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/54f86520-f9a2-6f44-fd8e-3d4ec0dfa0b0.png)


## あとは思う存分編集を楽しみましょう！！
簡単に動画に音楽を追加するのと、動画のつなぎ方を御紹介

### 音楽を追加する
赤枠をクリックすると、フリー素材の音楽が沢山管理されています。
これを動画のタイムラインの下に配置することで動画に音楽をつけることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/d7dfc4e2-d3bc-c6ef-a502-0afd0c4cdf36.png)
※もちろんこれ以外に自分で用意した音楽をメディアウィンドウにドラッグアンドドロップすれば、使用することができます。
　⇒詳細は別記事で紹介したいと思います。

### 動画を連結させる
Aという動画とBという動画を直接連結させると、ブツっと切り替わった感じが否めませんが、それを緩和することが出来るエフェクトも用意されています。
左側のメニューの「切り替え」でエフェクトを選び、動画と動画の間にドラッグアンドドロップするだけで、エフェクトを追加することが出来ます！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/329f4a74-8cb1-9ea8-fc33-38ab8a30cad2.png)


# 最後に
ということで、画面録画と動画編集を紹介してきましたが、簡単な動画編集だったら有料の動画編集ソフトを買わなくても良い時代に、いつの間にかなっていたんですね。。。
Clipchampについては、ハッカソンに役立ちますので、また別の機会に使い方を紹介したいと思います。

最後になりますが、この記事が皆さんの成長の少しでも手助けになることを祈って、この記事を閉めたいと思います。
最後までお読みいただきありがとうございました。
【Laravel,React+typescript】爆速で始めるスキーマ駆動開発

## 環境
- laravel
- react+typescript

## backend(Laravel)
### dedoc/scrambleをインストール
```bash
composer require dedoc/scramble
```
dedoc/scrambleはlaravelの`routes/api.php`からAPIドキュメントを生成してくれるすごいライブラリ

https://github.com/dedoc/scramble

### localhost/docs/apiに接続

localhostの部分はご自身の環境に合わせて変えてください

![](https://storage.googleapis.com/zenn-user-upload/92725af5f4fd-20240709.png)

もうなんか、それっぽいのができている（神）

## frontend(React+typescript)

### openapi-typescriptをインストール
```bash
npm i -D openapi-typescript typescript
```

https://www.npmjs.com/package/openapi-typescript

### 型ファイルを生成

```bash
npx openapi-typescript http://localhost:8080/docs/api.json --output  resources/ts/types/schema.d.ts
```

dedoc/scrambleで生成したapiドキュメントから型ファイルを`resources/ts/types/schema.d.ts`に出力する

```resources/ts/schema/schema.d.ts
/**
 * This file was auto-generated by openapi-typescript.
 * Do not make direct changes to the file.
 */

export interface paths {
  // ここに出力されてる
}
```

これでとりあえず完了

以下から楽をするための自動化

## コミット時に型チェックを自動で行う

### huskyとlint-stagedをインストール

```bash
npm install --save-dev husky lint-staged
```

バージョンは以下の通り
- husky: 9.0.11
- lint-staged: 15.2.7

メジャーバージョンが違うとhuskyは書き方結構変わるので注意

### pre-commitフックを作成

```
npx husky init && echo "npx lint-staged --shell " > .husky/pre-commit
```

### lint-stagedの設定ファイルを作成

```lint-staged.config.js
module.exports = {
    '*.{ts,tsx}': (fileNames) => [
        `tsc --strict --noEmit ${fileNames.join(' ')}`,
        'eslint --cache --fix',
    ],
}
```

## ルートを更新したとき自動でschemaファイルを生成

laravelのroutesディレクトリ以下に変更があった場合、自動でschema.d.tsファイルを更新する

```lint-staged.config.js
require('dotenv').config()

const url = process.env.APP_URL

module.exports = {
    '*.{ts,tsx}': (fileNames) => [
        `tsc --strict --noEmit ${fileNames.join(' ')}`,
        'eslint --cache --fix',
    ],
    './routes/*.php': [ // このブロックを追加
        `npx openapi-typescript ${url}/docs/api.json --output  resources/ts/types/schema.d.ts`,
        'git add resources/ts/types/schema.d.ts',
    ],
}
```
【Win11では廃止されたWin10までの素晴らしい機能】昔はエクセルで簡単にホームページ・リンク集を作成できたのになぁ・・・

# 概要
皆さんはエクセルからPDFファイルを作ることが出来ることは知っていると思います。

それではCSVファイルはいかがでしょうか？

そもそもITをよく使わない人にとっては「『CSVファイル』ってなんだよ！！」という方もいるかもしれません。
『CSV』ファイルとは「Comma-Separated Values」の略で、カンマ（','）で値を分けたファイルの略で、カンマの代わりに「（tab）」で分けたものを『tsv』ファイルと言ったりします。
ということで、エクセルではCSVファイルも作ることができますし、それ以外にもXMLファイル等も作ることが出来ます。

勿論、今回お題のホームページ（HTML）も！！


# 詳細
はい、ということで、そもそも作り方ですが、実は超簡単！！
『名前を付けて保存』する際に『ファイルの種類』というコンボボックスから『Webページ（*.htm,*.html）』という選択肢を選ぶだけ！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/c175ae70-bcba-8f2e-e296-af789ac033ad.png)

というダイアログが出てきますので、『はい』を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/bd9617da-db09-0cd3-ec7e-e20724becd1e.png)

すると、「.html」ファイルと、フォルダが出来てるじゃないですか！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/3d2a31e9-cd58-939b-816f-5fe6aa6a2ebc.png)
はい。これで完成です。
ただし、注意が必要なのは、HTMLファイルが本体ではありますが、フォルダの方にCSS（スタイルシート）等が入っておりますので、もし、このやり方でホームページを作り、公開しようとした場合はフォルダと、HTMLファイルの二つをサーバーにリリースする必要が御座います。

# 廃止された機能を懐かしむ。
さて、このHTMLを作成する機能は今でもあります。
私はこのHTMLを作成する機能を利用して、会社ではオリジナルのリンク集を作っております。

おります・・・。

おりますが、なんとMicrosoft Edgeでは『file: プロトコル』に制限をかけ、起動できなくしてしまった為、ファイルサーバーのパスなどを記しておくリンク集が作れなくなってしまいました。
（理由は以下になります。。。）

https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/FileProtocol/

ということで、正確にはWin11で廃止されたわけでは御座いませんが、Win11では標準ブラウザがEdgeとなっており、Internet Exploreを開くことが出来ないため、今回のような書き方になりました。


しかし、いくらfileプロトコルが使えなくなったからとはいえ、以下のファイルを作成できることには変わりませんので、皆さまもぜひ使ってみてくださいね！！


# 最後に
最後になりますが、この記事が皆さんの成長の少しでも手助けになることを祈って、この記事を閉めたいと思います。
最後までお読みいただきありがとうございました。
LINEBot×Makeを利用して即座にダーツアレンジ(ダブルアウト)を確認する！

## ツール概要/自己紹介





## LINEでダーツのレフト(残り数)を入力すると上がり方(アレンジ)がかえってきます。



今回LINEBotに対して残りの数字を入力すると、アレンジが返ってくるツールを作成しました。
実際どのような動作になるかご覧ください。

![2bmta-k7ow7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/b5351eea-e4d6-1d93-d757-0f39499be231.gif)

このように数字を入れるとアレンジを教えてくれます。



### 自己紹介
どうも横山ぴろきです。
![darts_throw_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/a159da13-0569-9228-7115-2530e74dffa7.png)

今回はIT初心者である私がLINEBotとMakeを利用して、簡単にツールを作れるということをご紹介させていただきます。
ぜひ、IT上級者の方は暖かく見守りつつもご意見をください。
**私と同じIT初心者の方には自信をつけていただければと思います。**

### 作成動機
今回は私の好きなダーツのツールを作成させていただきました。
ダーツの上がり方(アレンジ)がなかなか覚えられず苦労してます。
また覚えてるものに関してもパッと出なかったりします。
そんな時にミスアレンジをして負けてしまう、、、ということがありますので今回ツールを作成しました。

## 作成方法：アレンジを答えるLINEBotをつくる

### 1⃣Make/LINEDevelopersのアカウント作成

今回下記2つのツールを利用いたしますので、
アカウントを作成します。

**Make**
https://eu2.make.com/

**LINEDevelopers**
https://developers.line.biz/


### 2⃣Make のシナリオ

今回下記2つのモジュールを使って表現しております。
・LINE Watch Events
・Google Sheets Search Rows
・Router
・LINE Send Reply Message


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/8e9df30b-eb9e-4c09-bc15-4c6093e11bee.png)



### 3⃣各モジュールの説明
***
**①LINE Watch Events**
 LINEから入力を検知し、入力された値を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/f071607e-d6dd-fca0-7859-dd8fb2e67097.png)

まずはLINEDevelopersコンソール>Messaging API設定にて
Webhookの利用をONにし、チャンネルアクセストークンをLINE Watch Eventsに登録。
そしてLINE Watch EventsのaddresをLINEDevelopersのWebhookURLに登録。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/0c46c22a-64fd-84a4-f34b-d8510ad45950.png)

***
**②Google Sheets Search Rows**
LINEで入力された値に対応する値をGoogle Spreadsheetから持ってくる。
（ExcelでいうVlookのようなもの）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/a4cdbee9-6c4f-062d-47f3-fa0bbbc2899f.png)

今回は下記のようなGoogle Spreadsheet(アレンジ表)を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/549c1d4c-1f94-c7dc-655a-ef83cef283c6.png)


***
**③Router**
Google Spreadsheetに値がある場合とない場合で処理を分岐させる。
（値がある場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/f370d78d-d693-1d52-3e22-3984aae48b39.png)

（値がない場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/c723ca2d-ea25-4d67-3998-030d4c10dc5e.png)

***
**④⑤LINE Send Reply Message**
Google Spreadsheetに値がある場合はその値をLINEBotより返信、
値がない場合は固定メッセージを返信する。
（値がある場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/f52c5a20-7c30-4216-a7a1-8bfdb4395c5e.png)

（値がない場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799961/5e888c1f-a174-55a3-e554-dc9ae823e726.png)

### 終わりに
今回は本当にシンプルでLINEBotを通しVlookしているようなツールですが、
IT初心者でも一つツールが作成できました。
本当に手順簡単なので試してみてください。


私もさらに技術を学んで様々ツールを作っていきたいと思います。
己の欲求と向き合う

## 何が嬉しいんだっけ

人によって生活の中に求めているものや、考え方、価値観は様々です。
その価値観に合う仕事ができるか、生き方ができるかというのはとても重要でしょう。

改めて、「自分は何が嬉しいんだっけな。」と考えてみる、見つめ直してみるのも生活を豊かにするうえで役立つかもしれません。

## コンプレックスと人の役に立つ欲求

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/c162ef71-80d5-2d6b-15b2-965ed6b9d783.png)


早生まれは統計的に年収が4％低く学力偏差値も低いという研究結果があるそうです。
私は3月末の生まれ、悲しいかな、この結果はなんとなく理解できるような気がします。[^1]

[^1]:勿論、個人差があり全く当てはまらない人もいるでしょうし、必ずしもこの研究結果が正しいとは思いません。

子どものころから体は小さく病弱で、そして4月生まれの同級生と比べると約1年出遅れている状態です。この幼少時代に形成された自己評価の低さや負け癖のようなものは、大人になってからもなかなか引き剥がせません。

だからこそ、誰かの役に立ちたいとか、自分が力になれるならなりたいという欲求が根本にあるのかもしれません。

## かっこつけたい

かっこつけたい、ダサくなりたくない。と思います。

これは一般的にいうかっこ良さや、モテたいという願望ではなく[^2]、自分自身の矜持の話です。美学とも言い換えることもできます。

[^2]:やっぱり出来ればちょっとモテたい

* 自分にかかるコスト分の以上のバリューは返してかっこつけたい
* 環境や人のせいにするようなダサい人間にはなりたくない
* やりたい、やりたくないではなく、やるべきかどうかで考えたい
* 当たり前のことは、当たり前のように涼しい顔してやりたい

他人からどう思われるかは諦めていますが、せめて自分自身からは「お前はダサい人間だな。」と思われないように意識しています。

## 人生のハンドルを自分で握る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/e6850f42-170f-e67a-f1de-63e128bf8a29.png)

独立する、若手とは見られなくなってから知見を持たない他業種へ転職する、などを聞くと
「あぁ、過酷な旅にでるのか。何も今の恵まれた環境を捨てなくても。」
と思ってしまうことがあります。[^3]

[^3]:全く人の事は言えた立場ではありませんが

しかし、“人生のハンドルを自分で握る”という言葉がありますが、自分で決めた人生の道を歩むのであれば、苦難や過酷な旅でも耐えられるのかもしれません。

私も、自分の人生のハンドルは自分で握り、その気になればどのような道にだって進めることが出来るという感覚は大切にしています。


## アンダーコントロールかどうか

“人生のハンドルを自分で握る”と少し似ていますが、特に業務において、自身の取り組む仕事がコントロールできない状況に陥るのが一番の苦痛です。
どう足掻いても状況を良い方向にもっていけないくらいであれば、負担が大きくてもコントロールの効く、自分が状況を改善できる仕事のほうが好きです。

## 平穏に暮らしたい

あまり大きな成功や金銭には興味はありません。
お金はあればあるだけ便利ですが、人より突出した成功や贅沢より、平穏に安定して暮らしたいと考えています。

そのような話をすると、歩んでいる道とだいぶ異なるのでは？とよく言われますが、大きな組織でアンダーコントロールじゃない働き方とコンプレックスからくる自己無能感が重なるのを恐れているのかもしれません。


## 正しい野心

https://bookplus.nikkei.com/atcl/catalog/15/P50850/

ベン・ホロウィッツの「HARD THINGS」で、"正しい野心”、"間違った野心”についての記載があります。
ここでの内容は心から同意するものばかりで、この中でいう"正しい野心”で私もありたいと思いました。

> 管理職が自分のキャリアを会社の成功より上位に置くのを見れば、部下は「どうして長時間労働してまでボスのキャリアの成功を助けねばならないのだ？」と考えるようになる。

私はフリーランスの経験はあるものの、自分には不向きであると自覚しています。
それは、基本的に怠惰で無気力で、個人的な利益という動機ではギリギリの生活が成り立つくらいしか気力がないからです。

しかし、所属する組織や仲間のためであれば、まだ気力を振り絞ることができます。
以前に下記の記事で書いた「人のために（社会性）」の通りです。

https://qiita.com/koji-yamauchi/items/e4a2aca8da1a2be187a4

## まとめ

色々と考えると、自分の出来ることで役に立つことを模索しながら、沢山の業種の人と一緒に仕事ができる現状の仕事は自分にあっているのだろうなと思いました。
Accessのフォームでテキストボックスの日付選択カレンダーが表示されない時の対応

# 日付選択カレンダーとは

テキストボックスに出てくるこれです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/501031fd-2997-3f81-d5aa-4e24cf969402.png)

アイコンクリックするとこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/64d041d6-491b-24de-d0f6-4adfb28fae23.png)

『書式』『日付選択カレンダーの表示』を設定すると出てくるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/768c2540-7acc-66d5-a45f-8233b88ec72a.png)

# 表示されない時の症状

『書式』『日付選択カレンダーの表示』を設定しているのにカレンダーのアイコン自体が出てこない。

また、『書式』の選択肢も空。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0654bdba-151a-b8d6-89d1-3fe998b521dc.png)

# 原因

『データ』の『コントロールソース』で **日付型でないカラムを指定していた** ためでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/35821fc9-6a2e-4225-5d94-b27de1fff181.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5cff8437-be0f-46e1-d2c5-bcbb44c56ecc.png)

日付型のカラムを指定すれば…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c04a968e-c2ac-7fd4-f26d-9a2bd4f91751.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0fca3dbb-b84d-45a0-5f2c-4cb7e5777d76.png)

表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d4b9ccef-3608-368f-b1b2-c5ccf6de77c3.png)

# 参考サイトさん

https://answers.microsoft.com/ja-jp/msoffice/forum/all/access/0644e4cb-10e6-4dbd-b063-45fb7a3d348e

# バージョン

Microsoft Windows [Version 10.0.22631.3810]
Microsoft Access for Microsoft 365 MSO (バージョン 2406 ビルド 16.0.17726.20078) 32 ビット
AIは万能ではない？ 若手エンジニアが経験値を得る機会を奪っている可能性

### はじめに

AIを活用していますか？ ちょっと分からないことや欲しいプログラムがある時に適当に聞くと、嫌な顔ひとつせずに気前よく回答してくれて便利ですよね？

それまでは、忙しそうな先輩の顔色を伺って、話しかけても大丈夫そうなタイミングを見計らって、あらかじめ要点をまとめておいた質問を持っていって、緊張しながら質問して、よく分からなくても一旦引き下がって調べて…なんてことをしていなかったでしょうか？

もうそんな生活には戻りたくないし戻れないとは思うのですが、ここに重大な罠、つまり **若手エンジニアが本来経験すべき重要な学びの機会を奪っている可能性** がないか、考えてみたいと思います。

### エンジニアの仕事の本質とは？

エンジニアの仕事は、顧客や上司など、誰かから依頼を受け、その依頼通りの成果物を期日通りに作り上げることです。ただコードを書くだけでなく、相手の要望を理解し、それを実現するための最適な方法を考え、形にする。それがエンジニアの仕事の醍醐味と言えるでしょう。

### あいまいな依頼とコミュニケーションの重要性

顧客が「ボタンを押したら画面が切り替わる機能」を希望したとします。一見シンプルに見えますが、実際には考慮すべき点が山ほどあります。

* どのようなボタン？ (デザイン、サイズ、配置)
* どのように画面が切り替わる？ (アニメーション、エフェクト)
* エラー処理はどうする？

このように、依頼内容を具体化し、認識を一致させるためには、顧客とのコミュニケーションが不可欠です。技術力と同じくらい、あるいはそれ以上に、コミュニケーション能力がエンジニアには求められます。 

### AIはコミュニケーションの機会を奪う？

AIは、コードの自動生成やバグの検出など、開発作業を効率化する強力なツールです。しかし、顧客とのコミュニケーション、つまり「認識合わせ」や「感情の理解」はAIの得意分野ではありません。

従来、若手エンジニアは、先輩エンジニアに質問したり、顧客との打ち合わせに同席したりする中で、自然とコミュニケーション能力を磨いてきました。しかし、AIに頼りきりになると、こうした経験を積む機会が減ってしまう可能性があります。

### 経験不足が招くリスク

コミュニケーション不足は、認識のずれを生み、手戻りや品質低下に繋がります。

* 顧客の意図を汲み取れず、期待と異なる成果物を納品してしまう。
* チームメンバーに状況を正確に伝えられず、開発が遅延する。

このような事態を防ぐには、AIに頼り切るのではなく、自らコミュニケーションを取り、経験を積むことが重要です。AIはあくまでもツールであり、それを使いこなすのは人間です。

### まとめ

AIはエンジニアにとって非常に便利なツールですが、あくまでもツールです。コミュニケーション能力など、AIでは補えないスキルを身につけることが、エンジニアとして成長するために不可欠です。

若いうちから積極的にコミュニケーションを取り、経験を積み重ねることで、AIを使いこなしながら、より良い成果物を生み出すエンジニアを目指しましょう。
[備忘録]dbtで愚直な新旧比較をするためのスクリプト

# これはなに

dbtのバージョンアップを行なった際に、バージョンアップの前後でビルド結果が全く同じなんだっけ？ という確認を行うための方法を記載します。
[PR間で結果の差分をチェックするような便利なもの](https://github.com/DataRecce/recce)もあるようですが、今回はとにかく愚直な方法でやります。
データセットを変えてビルドを行い。データセット間でテーブルの差分がないかをチェックします。
チェックでは、行数の一致チェックと、データの内容の一致チェックを行います。

# 流れ

1. dbtのバージョンアップを行った後と行う前の二つの状態のテーブルを作成する
1. ローカルのリポジトリをコピーし、一方はバージョンアップする
1. 片方のprofile.ymlを編集しdatasetの文字列を変更する
（弊環境では、datasetの文字列を元にビルド先のデータセット名が決定されるので、この文字列を変更することでビルド先を変更しています。）
1. チェック用のスクリプトを実行する

# スクリプト

適宜書き換えてください。参考コードです。
ChatGPT先生に書いてもらってます。


```python
import os
import json
from google.cloud import bigquery
import warnings

# 警告を無視する設定
warnings.filterwarnings('ignore', category=UserWarning, module='google.cloud.bigquery.table')


# チェックしたいモデル名のリスト
# manifest.jsonにあるモデル名で指定します。
model_names = """
model.hoge_project.hoge_model
model.hoge_project.fuga_model
"""

# BigQueryクライアントの初期化
client = bigquery.Client()

# manifest.jsonファイルのパス
manifest_path = 'target/manifest.json'

def load_manifest(manifest_path):
    with open(manifest_path, 'r') as file:
        manifest = json.load(file)
    return manifest

def build_table_names_from_manifest(manifest, model_name):
    node_key = model_name
    if node_key in manifest['nodes']:
        relation_name = manifest['nodes'][node_key]['relation_name']
        table1 = relation_name
        # 差分比較するため、一方のデータセット名を置換によって変更します。 環境に応じて書き換えてください。
        table2 = table1.replace('dbt_sandbox', 'dbt_sandbox_tmp')
        return table1, table2
    else:
        raise KeyError(f"{node_key} not found in manifest.")

def compare_tables(table1, table2):
    print(f"Comparing {table1} and {table2}...")

    # 行数の取得
    query1 = f"SELECT COUNT(*) as count FROM {table1}"
    query2 = f"SELECT COUNT(*) as count FROM {table2}"
    count1 = client.query(query1).result().to_dataframe().iloc[0]['count']
    count2 = client.query(query2).result().to_dataframe().iloc[0]['count']

    if count1 != count2:
        print(f"Row count mismatch: {count1} (table1) vs {count2} (table2)")
    else:
        print(f"Row count matches: {count1} rows")

    # 内容の比較
    query_compare = f"""
    SELECT * FROM (
        SELECT * FROM {table1}
        EXCEPT DISTINCT
        SELECT * FROM {table2}
    )
    UNION ALL
    SELECT * FROM (
        SELECT * FROM {table2}
        EXCEPT DISTINCT
        SELECT * FROM {table1}
    )
    """
    differences = client.query(query_compare).result().to_dataframe()

    if not differences.empty:
        print(f"Differences found:\n{differences}")
    else:
        print("No differences found")

def main():
    model_list = [model.strip() for model in model_names.strip().split('\n')]
    total_models = len(model_list)
    manifest = load_manifest(manifest_path)

    for idx, model in enumerate(model_list, 1):
        try:
            table1, table2 = build_table_names_from_manifest(manifest, model)
            compare_tables(table1, table2)
        except KeyError as e:
            print(e)
        print(f"Processed {idx} / {total_models} tables")

if __name__ == "__main__":
    main()
```
GoogleColaboratoryにKaggleのデータをダウンロード

# はじめに
GoogleColaboratoryにKaggleのデータを直接ダウンロードする方法の備忘録

# 1.kaggleAPIの作成
kaggleホームページにてアカウントのSettingsを開く
![スクリーンショット 2024-07-09 153402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/df4c91f1-828f-ce19-afd8-9f78a3c35803.png)

その後、API欄の"Create New Token"を選択し、kaggle.jsonを作る
![スクリーンショット 2024-07-09 153334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/e6fcd717-fd37-1317-716d-628763a60769.png)


kaggle.jsonを作ったら、マイドライブにアップロード
(ここではドライブのkaggleフォルダにアップロード)

# 2.GoogleColaboratoryの準備
GoogleColaboratoryを開いたら以下のコードを順番に実行する

```python:ドライブに接続
from google.colab import drive
drive.mount('/content/drive')
```

```python:kaggleライブラリののインストール
!pip install kaggle
```

```python:KaggleAPIキーの設定
import os
import shutil

# Kaggleフォルダが存在しない場合は作成
os.makedirs('/root/.kaggle', exist_ok=True)

# MyDriveからkaggle.jsonをコピー
# ディレクトリ構造は人によって変更する必要有り
shutil.copy('/content/drive/MyDrive/kaggle/kaggle.json', '/root/.kaggle/kaggle.json')

# 適切な権限を設定
os.chmod('/root/.kaggle/kaggle.json', 600)
```

# 3.kaggleのデータをダウンロード
kaggleのCompetitionsから任意のデータをGoogleColaboratoryでダウンロードする

Competitionsのデータが格納されているページに行くと、ダウンロードするためのコマンドがあるのでそれをコピー

コピーしたものは以下のようにGoogleColaboratoryで貼り付けることでダウンロード可能

ディレクトリを指定しなければ/contentにデータが展開される

```python:ダウンロード
# *****が貼り付けるところ
!***** -p /cointent/drive/MyDrive/任意のディレクトリ

# 今回はhome-credit-default-riskというコンペのデータをダウンロードし、kaggleフォルダに置く
!kaggle competitions download -c home-credit-default-risk -p /content/drive/MyDrive/kaggle
```

# 4.zipファイルの解凍と削除
最後に、zipファイルの解凍と削除を行う
```python:zipファイルの解凍と削除
# 解凍
!unzip /content/drive/MyDrive/kaggle/home-credit-default-risk.zip -d /content/drive/MyDrive/kaggle

# 消去
!rm /content/drive/MyDrive/kaggle/home-credit-default-risk.zip
```

# 参考記事
https://zenn.dev/megane_otoko/articles/2021ad_01_download_dateset
【備忘録】【MAMP】PHPのタイムゾーンの設定

MAMPのタイムゾーンを日本時間に設定するやり方をメモしておきます。
※変更する時はサーバーをストップさせた状態でやること。

<h2>1. PHPのバージョン確認</h2>
<p>MAMPを開いて、「PHP version」からバージョンを確認します。</p>

![スクリーンショット 2024-07-09 15.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827365/15275194-757e-f38d-b6cb-4ac78dd01bce.png)
<br>

<h2>2. php.iniを開く</h2>
<p>ファイルの場所は「Application/mamp/bin/php/php××.×/conf」配下にあります。<br>
※「××.×」は「1」で確認したバージョン</p>

<h2>3. date.timezone</h2>
<p>「date.timezone」の箇所を「"Europe/Belrin"」→「"Asia/Tokyo"」に変更し、<br>
コメントアウトされているので外します。
</p>

![スクリーンショット 2024-07-09 15.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827365/e0b3077b-e61a-7293-9252-91c6856bdda4.png)

![スクリーンショット 2024-07-09 15.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827365/cb27e2e2-401c-e0b9-a181-a23b956d81dc.png)

<h2>4. 設定が反映されているか確認</h2>
<p>
WebStartページから「phpinfo」を開きます。<br>
Default timezoneが「Asia/Tokyo」になってたらOK！
</p>

![スクリーンショット 2024-07-09 15.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827365/d2aed797-0ed4-0b56-99b7-5cb5363350bd.png)
文字列の「1.」はdouble型でいいのか！正体を暴く ~ 実は1.0ってほんと？！~

### "1." の正しい解釈 〜 演算の世界のミステリー 〜

さて、皆さん。コンピュータの世界には、どうにも解せぬ不思議が存在します。
今回のミステリーは、なんと「1.」という数値リテラルです。
この「1.」を目の前にしたとき、あなたならどうしますか？

1. エラーにする？
2. それとも、 1 として解釈する？
3. いやいや、1.0 ？

さて、この謎に迫るため、冒険の旅に出ましょう。
まずは、我らが頼りにするPOSIXの地図を開きますが...
おや、数値に関する定義が見当たらないではありませんか！
これは、どうやら他の宝の地図を参照する必要がありそうです。

### 探求の旅：C言語とC++言語の遺跡

次に我々は古の文献、すなわちC言語とC++言語の標準規格へと足を踏み入れます。
そこで見つけたのは、まさに宝の地図そのもの。
ISO/IEC 9899（C言語）と ISO/IEC 14882（C++言語）の神殿に、次のように刻まれていました。

```plaintext
fractional-constant:
    digit-sequence[opt] . digit-sequence
    digit-sequence .
```

### 真実の解明

この古代の呪文を解読すると、次のことがわかりました。

1. **`digit-sequence[opt] . digit-sequence`**: これが示すのは、小数部を伴う数値の姿。
2. **`digit-sequence .`**: そしてこちらは、小数点で終わる数値の姿。

おお、これはまさに「1.」が有効な数値リテラルである証拠。
つまり、「1.」は1.0という浮動小数点数として解釈されるべきなのです。
同じように、「.1」は0.1という浮動小数点数として解釈されるのです。

### 勇者たちの証言

さて、冒険者たちが訪れるオアシス、cppreference.comとIBMの文献にも同じ記述がありました：

- [Cの浮動小数点定数の解説](https://en.cppreference.com/w/c/language/floating_constant)
- [C++の浮動小数点の解説](https://en.cppreference.com/w/cpp/language/floating_literal)
- [IBMの浮動小数点の解説](https://www.ibm.com/docs/ja/psfa/7.1.0?topic=constants-floating-point)

これらの証言により、冒険の成果は確かなものとなりました。

### 終わりに

こうして、「1.」という数値リテラルの謎は解き明かされました。
もはやこの数値を見ても惑わされることはありません。
そう、これはエラーでも整数でもなく、まさに1.0という浮動小数点数として認識されるべきなのです。

次回の冒険では、どんなミステリーが待ち受けているのか...。
それはまた、別の機会に！
bluetooth(BLE)を用いて機器情報の取得方法


:::note warn
この記事は自分なりの理解をアウトプットとして記載しています。間違っている可能性もあるため、この記事の情報を鵜呑みにはしないでください。
:::

　研究室のプロジェクトでbluetoothを扱う機会があったため、アウトプットを兼ねてこの記事を書いていきます。

　この記事で記載している内容は以下になっています
　・BLEについて
　・bluetooth(BLE)の通信方法
　・BLEを用いて機器情報を取得するには

 ## BLEについて
　BLEの正式名称は**Bluetooth Low Energy**の略称であり、bluetooth通信規格の一種です。BLEの通信規格は現在のbluetoothデバイスに数多く使用されており、BLEの正式名称にもある通り、省電力であることが大きな特徴となっています。
 
 　前述したように、この通信規格はbluetoothデバイスに数多く使用されているため、機器情報を取得するにはbluetooth(BLE)についての理解が必要不可欠になります。この記事ではbluetoothU(BLE)の通信方法について、自分なりの理解を共有します。

## bluetooth(BLE)の通信方法
　bluetoothは通常、放射状に電波を発信しており、接続機器に対して自身の情報を送信しています。ワイヤレスイヤホンやウェアラブル端末等、bluetoothを発信している機器のことを**ペリフェラル**、スマートフォンやPC等、bluetoothを接続し、利用する機器のことを**セントラル**と呼びます。

 　ペリフェラルとセントラルの通信には**アドバタイズ**と**GATT通信**に分かれています。アドバタイズは上述していますが、ペリフェラルはセントラルに接続するため、放射状に電波を発信しています。セントラルは電波を受信するとUIに接続可能なbluetooth機器が閲覧できるようになります。この放射状に電波を発信し、セントラルに接続しようとする状態がアドバタイズです。
  　GATT通信はセントラルとペリフェラルが接続された時に行われる通信です。今回の機器情報の取得に必要となる通信はアドバタイズであり、GATT通信はあまり重要で無かったため、説明は省略します（GATT通信やアドバタイズについて詳細を知りたい方は下記の参考URLから）。

## BLEを用いて機器情報を取得するには
　上述したように、今回はアドバタイズ状態であるbluetoothの機器情報を取得します。アドバタイズ通信は放射状に電波を発信しているため、発信している電波を取得することで機器情報を取得します。
 　pythonライブラリの**bleak**はアドバタイズされているBLEを取得できるため、bleakライブラリを用いることで機器情報を取得します。次回はbleakの動作について確認していきたいと思います。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（55/100）

【55日目】
トピック 7：SAPS/4HANAにおける拡張計画（1/14）

≪問題55≫
生産計画者は、特定のリソースのみを対象にして計画を実行する必要があります。アドバンス計画（PP/DS）で、これをどのように実現できますか。
□計画グループを使用する。
□伝播範囲を使用する。
□計画範囲を使用する。
□リソースグループを使用する。

≪解答≫
□計画グループを使用する。
■伝播範囲を使用する。
□計画範囲を使用する。
□リソースグループを使用する。

≪解説≫
◆拡張計画における詳細計画では、作業領域を使用して、PP/DS画面で直接呼び出すプランニングボードに表示されるオブジェクトを定義することが可能です。
◆作業領域では、リソース、指図、および製品の選択を定義します。これに基づいて、以下の選択パスに従ってプランニングボードに転送されるリソースが決定されます。
（1）作業領域に対して指定された製品に属するすべての指図が決定され、次に、これらの指図に属する作業および作業で使用されるリソースが決定されます。
（2）作業領域で指定された指図ごとに、指図に属する作業および作業で使用されるリソースが決定されます。
（3）作業領域で定義された各リソースは、プランニングボードに直接関連します。
◆これらのリソースから、各種のチャート（リソースチャート、オーダーチャート、作業チャート、および製品チャート）に表示されるオブジェクトが決定されます。また、プランニングテーブルの伝播範囲で日程計画できる製品とリソースを定義します。
paizaのコードモンスター（コドモン）試遊してみた


![コードモンスターのタイトル画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/ace9f2cd-dc12-128c-3066-82fe106e1c6f.png)

ポケモンやん！

https://paiza.jp/code_monster/

と思ったけど、ポケモンでした。
いわゆるポケモンバトル部分でコードを書く。バトルをするのはポケモンではなくあなただ！っていうオチですが、まぁこの辺は色々なソシャゲと同じですね。
基本を何度も繰り返してストーリーを進行していく進め方なので、他言語でやってみると結構簡単にスコアを稼げそうです。

## やってみた
![御三家](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/36a8e5a6-936a-e05f-6740-c180f5e9d306.png)

![トップページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/ff326f04-cf99-6221-a2b3-c67519fba518.png)

ソシャゲ感がありながら、しっかりとポケモンっぽいストーリー展開なのが面白い！
paizaアカウントは学習プラットフォームというよりは転職サービスという認識だったのでアカウントを寝かせっぱなしだったんですが、これをやるために再度復活していこうと思いました

（問題ページをスクショ撮ろうかと思ってたんですが、一回やり始めると早解きボーナスもあるので手が回らず…）

まずは出力命令を2~3問連続で回答するような問題が出題されていました。サンプルではphpのコードで出力がありますが、これと同じレベルのところから始まってステップアップするようです。
使える言語は以下の通り。

- php
- ruby
- java
- python
- c
- c++
- c#
- javascript
- kotlin
- coming soon（なんだろう？）

今後どんどん増えるんじゃないかと思ってます。枠も1つだけじゃなくてもっと増えていくんじゃないかと期待します。

### やっていて感じた懸念
ソシャゲ形式にしてるのでリセマラやりださないかどうか心配です。
バトル部分がガチャではないのと、通常のソシャゲのようにアカウントを売る事に価値があるサービスかというと微妙そうですが、paizaのスキルチェックと連動できるので、アカウントを売る事自体に何かしらの意味というかメリットが出てきそうです。
実際に面談＋オリジナルのスキルチェック問題を実施してもらえば、買ったアカウントかどうかすぐに分かります。
ただし、募集時にこの問題が発生してしまうと、システム上のスキルチェックで判別する事は難しそうです。

※paiza運営側が、この程度の問題を考慮していないとは思っていませんが、明示的に対策について言及していただけると嬉しいです。

## paizaラーニングの全講座無料クーポンも！
正直、これだけでも十分な価値があると思います
こちらは期間限定のため、しばらくはこちらを優先的にやろうかと思ってます。
学習プラットフォームとしてはUdemyのイメージが強いですが、paizaラーニングもありますし、paiza.ioが非常に使いやすいので、何かしらの形でpaizaサービスも組み合わせて学習に使っていく方法を検討してみます。
この辺りはやりながら、また補足情報を足していきたいですね。
PostgreSQLでパーティション一覧を取得

ググっても出てこないので、備忘録

# 取得

```
SELECT c.relname AS partition_name,
       i.inhparent AS parent_table
FROM pg_inherits i
JOIN pg_class c ON i.inhrelid = c.oid
WHERE i.inhparent = (SELECT oid FROM pg_class WHERE relname = '親テーブル名');
```

# パーティションを作成したい時

https://www.postgresql.jp/docs/11/sql-createtable.html
> 範囲パーティションテーブルのパーティションを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/50bda81e-d656-c02e-0705-bab1ac9081ec.png)


```
CREATE TABLE [実装対象のテーブル名]_[パーティションキー名]
	PARTITION OF [実装対象のテーブル名]
FOR VALUES IN ('[パーティションキー名]');
```

# 類似記事

https://qiita.com/Jasmine_teeeeee/items/fcd060c83b45d21d4e0d
MATLABでファイル名「yyyy-MMdd-HHmm.csv」を生成する

`datestr`関数が非推奨とのことで、代替手段を検索しても意外と出てこなかったので残しておきます。

**2024-07-17: コメントをいただいて修正しました。**

```MATLAB:example.m
date        = datetime('now');
date.Format = 'yyyy-MMdd-HHmm''.csv';
fileName    = char(date)

% fileName =
%     '2024-0717-1550.csv'
```
deviseのdevise_parameter_sanitizer.permitとconfig.authentication_keysで詰まった話

# TL;DR
認証キーと許可するパラメータの違いを把握していなかった。
- config.authentication_keysはdeviseの認証として使われるものであり、自動的にストロングパラメータとして登録されている
- devise_parameter_sanitizer.permitはストロングパラメータの設定であり、deviseの認証として使われるものではない

# 誤解していたこと
devise_parameter_sanitizer.permitとconfig.authentication_keysは同じもの！
↑誤りですので気をつけてください。。

つまり、
```ruby:application_controller.rb
devise_parameter_sanitizer.permit(:sign_in, keys: [:name])
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
```
```ruby:config/initializers/devise.rb
config.authentication_keys = [:name]
```
「この２つはsign_inとsign_upに関しては同じことである。」、「どちらの記述でも同じ！」と思っていました、、((反省

# config.authentication_keysは何か
config.authentication_keysは認証用のキーであるため、「本当にあなたか確認しますね」ということです。どうやって確認するかというと、ここで設定したパラメータで確認しています。defaultではemailで確認します。
つまり、
```ruby:config/initializers/devise.rb
## nameで本人認証します
config.authentication_keys = [:name]

## emailで本人認証します(default)
# config.authentication_keys = [:email]
## or
config.authentication_keys = [:email]

## ageで本人認証します
config.authentication_keys = [:age]
```
## sign_upの時は関係ない？！
config.authentication_keysは認証用のキーですので、sign_upの時には何も影響しないのです。
確かに、登録時に認証って意味わからんわな(2段階認証とかを除いて)
つまり、
```ruby:config/initializers/devise.rb
# donot_exist_columnは存在しないカラムです
config.authentication_keys = [:donot_exist_column]
```
これでも登録できます。sign_inはできませんが。。

## sign_inの時は関係あり！！！
sign_upの時は使いませんが、sign_inと時は「本当にあなたですか」と聞くため使用します。
そのため、
```ruby:config/initializers/devise.rb
# nameカラムで認証を行う。
# 他の要素(age, email)をsign_in入力しても認証では使用しない
config.authentication_keys = [:name]
```
このように書けばnameのみを使って本人認証している状況です。年齢や電話番号でも本人認証をしたければ後ろに追記します。`[:name, :age, :number]`のように。。

# devise_parameter_sanitizer.permitは認証とは関係ない？！
config.authentication_keysは認証用でしたが、devise_parameter_sanitizer.permitは何のために使うのでしょうか。
devise_parameter_sanitizer.permitはストロングパラメータなので、form等で入力された文字を取得するときに「取っていいよ」と許可を与えます。
その許可を与えたもの(パラメータ)を認証用として使って「あなたは本人ですか」と聞きます。

## devise_parameter_sanitizer.permitは設定しなくてもいい？
devise_parameter_sanitizer.permitは必ずしも自ら設定する必要はありません。deviseが自動でやってくれている部分があるので、、
config.authentication_keysに登録されたパラメータに関しては自動的に「認証でこのパラメータを使うってことはストロングパラメータに設定しておいた方がいいよね！」という感じで設定されます。(優しい！そのせいで混乱しました笑)
なので、必ずしも必要ではありません。
### じゃあいつ設定するのか
devise_parameter_sanitizer.permitを設定するときの状態を例を用いて説明します。
**例を挙げます。**
- ユーザーには名前とemailと電話番号を登録してほしい。
- でもサインイン時には名前だけでいいや

**認証で使うもの**
- 名前

**ユーザが入力する情報　※()はカラム名です**
- 名前(name)
- email(email)
- 電話番号(number)


認証で使うものはconfig.authentication_keysに設定する必要があるので設定します。
```ruby:config/initializers/devise.rb
config.authentication_keys = [:name]
```
次に、入力する情報はストロングパラメータに設置する必要があるので設定します。
```ruby:application_controller.rb
devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :number])
```
- sign_upだけで良い理由は、sign_inではnameだけを使用してconfig.authentication_keysに書いてあるので不要。
- config.authentication_keysに書いてあるものはすでにストロングパラメータになっているので、`keys: [:name, :email, :number]`でなくていい

=> こんな感じでdevise_parameter_sanitizer.permitは、config.authentication_keysには設定していないけど、入力として欲しいものに対して設定します。

# まとめ
- config.authentication_keys・・・認証用
- devise_parameter_sanitizer.permi・・・ストロングパラメータ用

何気なく使うのはよくないですね、、
しっかりと区別しなければ、、
テレコムベンダー各社の2023年決算報告を読み解く

# 概要

昨年(2023年)の世界のテレコムベンダー各社の実績を超簡単にみていきます。各社の決算発表の資料から売上(Net Sales)を抽出しています。各社の決算は本国通貨単位なので全部日本円(JPY)換算しています。決算に使用された正確な為替レートとは違い現時点(2024/07/07)での為替レートを使っています。実際は利益率も見ないとあまり意味がないですが、あくまで売上規模の比較という事で。

移動体通信と言っても大きく分けると無線側(RAN)とコア（Core)に分類されます。
RAN側はいわゆる電波を出す部分（基地局）です。
Core側は基地局を集約する装置から各種パケット通信サービス、音声通話サービスを提供する装置です。
決算発表から別々に読み解ける場合はこのカテゴリ毎に記載しています。

参考までに世界市場の基地局シェアは以下の通りです。

https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r05/html/nd245120.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/3e081128-b616-549d-9d89-1b24366ad508.png)

※Huawei/ZTEは米国トランプ政権時代とかに北米、日本、欧州市場からはかなり排除されちゃったので売上は世界No.1/4ですが、今回は比較対象にいれていません。

# 各社状況

## Ericsson
#### Huaweiを除けば世界No.1

||FY2023|FY2022|FY2021|
|:-:|:-:|:-:|:-:|
|RAN| 2兆6635億  | 3兆0069億  | 2兆6076億  |
|Core| 9883億  |  9401億 |8733億   |

Source: https://www.ericsson.com/4933e7/assets/local/investors/documents/2023/annual-report-2023-en.pdf
## Nokia
#### 世界第3位

||FY2023|FY2022|FY2021|
|:-:|:-:|:-:|:-:|
|RAN| 1兆7090億  | 1兆8615億 | 1兆6951億 |
|Core| 5617億  |  6194億 |5388億   |

Source: https://www.nokia.com/system/files/2024-03/nokia-annual-report-2023.pdf

## Samsung
#### 世界第5位だけどマーケットは韓国、日本、北米くらいな気がする

||FY2023|FY2022|
|:-:|:-:|:-:|
|RAN&Core| 4536億  | 6456億 |

Source: https://images.samsung.com/is/content/samsung/assets/global/ir/docs/2023_4Q_conference_eng_01.pdf
## NEC
#### ほぼ日本市場のドコモと楽天だけ。イギリスで5G事業してたのはどうなったのか？

||FY2023|FY2022|
|:-:|:-:|:-:|
|RAN&Core| 8080億  | 8170億 |


グローバル5G頑張ると申しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/29db83da-19e6-fd3b-4219-4a8dd3eb46d6.png)

Source: https://jpn.nec.com/ir/pdf/library/240426/240426_01.pdf
## Fujitsu
#### ほぼ日本市場のドコモだけ。しかもほぼ基地局のHW売上だけかと思います。

||FY2023|FY2022|
|:-:|:-:|:-:|
|RAN&Core| 1830億  | 2697億 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/968e62d7-6dfb-494a-39e4-3f4bf3fd55d2.png)

Source: https://pr.fujitsu.com/jp/ir/library/presentation/pdf/20240425-02.pdf

## HPE
#### HPEはサーバー屋さん

テレコムベンダーではないですが、スキマ産業的にCMS(Communications and Media Solutions)と呼ばれるテレコム向けのSI事業もやっています。でもLegacyとか言われちゃってますね。。以下の数値は他の部門との合算値でCMSだけの売上ではありません。

||FY2023|FY2022|FY2021|
|:-:|:-:|:-:|:-:|
|Corporate Investment and Other| 2009億  |  2017億 |2179億   |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/e54c853b-9140-eaac-8f45-ae869f2df01f.png)

Source: https://investors.hpe.com/~/media/Files/H/HP-Enterprise-IR/documents/hpe-10k-2023.pdf

# まとめ

EricssonとNokia２大北欧ベンダーが圧倒的ですね。専業なので当たり前といえば当たり前ですが。日本企業は全然ダメという事です。ドコモがOpen RANのエリアでOREXとか言ってグローバルエコシステムを構築しようとしていますが、はてさて日本主導でどこまで世界を変える事が出来るでしょうか？
[備忘録]Xcodeで過去のアーカイブを確認する方法

Window→ Organizer を選択すると「Archives」一覧が表示されます

(1)はXcodeでの背番号的なものらしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782522/cd3a2809-18cc-0faf-f72e-a1746352e221.png)
[TryHackMe] OhSINT #Writeup

# 注意
個人的な備忘録です。

# What is this user's avatar of?
与えられたjpgファイルを解析する。
exiftoolで詳細を見てみる。

```
$ exiftool WindowsXP_1551719014755.jpg
ExifTool Version Number         : 12.76
File Name                       : WindowsXP_1551719014755.jpg
Directory                       : .
File Size                       : 234 kB
File Modification Date/Time     : 2024:07:09 11:43:31+09:00
File Access Date/Time           : 2024:07:09 11:43:32+09:00
File Inode Change Date/Time     : 2024:07:09 11:43:31+09:00
File Permissions                : -rw-rw-rw-
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
XMP Toolkit                     : Image::ExifTool 11.27
GPS Latitude                    : 54 deg 17' 41.27" N
GPS Longitude                   : 2 deg 15' 1.33" W
Copyright                       : OWoodflint
Image Width                     : 1920
Image Height                    : 1080
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 1920x1080
Megapixels                      : 2.1
GPS Latitude Ref                : North
GPS Longitude Ref               : West
GPS Position                    : 54 deg 17' 41.27" N, 2 deg 15' 1.33" W
```

Copyrightに情報があった。

https://www.google.com/search?q=OWoodflint

Twitterアカウントを発見。
アイコンは子猫だった。

:::note
Cat
:::

# What city is this person in?
GPS Positionか？と思いましたが、ヒントを見るに違うらしい。
先ほど特定したアカウントのツイートにはBSSIDが載っていた。

>From my house I can get free wifi ;D
Bssid: B4:5D:50:AA:86:41 - Go nuts!

ヒントを見ると、以下のように書いてある。

>BSSID + Wigle.net

調べたら、wigle.netはWi-Fiのアクセスポイントと位置情報が登録されているサービスらしい（？）

ログインしないとBSSIDから位置情報を検索できないのでサインインする。
（因みに登録情報は偽名を使ってもいいが、メールアドレスは認証が必要なので自分のメールアドレスを登録しましょう。）

Bssid: B4:5D:50:AA:86:41 で検索すると、以下の情報とMapが表示された。（画像略）
どうやらロンドンらしい。

>WPA2	UnileverWiFi	 QoS: 7	  type: infra
B4:5D:50:AA:86:41	 ch: 11 	2017-10-10 - 2024-06-10

:::note
London
:::

# What is the SSID of the WAP he connected to?
先ほどの情報にSSIDが載っていた。

:::note
UnileverWiFi
:::

因みに[Wiki](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%83%AA%E3%83%BC%E3%83%90)によると、
>Unilever（ユニリーバ）は、イギリス・ロンドンに本拠を置く世界有数の一般消費財メーカー。食品・洗剤・ヘアケア・トイレタリーなどの家庭用品を製造・販売する多国籍企業。

# What is his personal email address?
これ以上、wigle.netからは情報が得られなさそうだったので、
もう一度 OWoodflint で検索すると、WordpressとGithubが見つかった。

Githubにメールアドレスが載っていた。

:::note
OWoodflint@gmail.com
:::

# What site did you find his email address on?

:::note
Github
:::

# Where has he gone on holiday?
Wordpressを見ると以下の情報があった。

>Im in New York right now, so I will update this site right away with new photos!

:::note
New York
:::

# What is the person's password?
Wordpressを探索します。
contactページなどを確認できる。
ただ、パスワードは載っていなさそうである。

F12でソースコードを開いてCtl+Fで "Password" とか検索してもヒットなし。
仕方がないのでhtmlを上から眺めていくと、怪しい文字列を発見。
特にパスワードとか書いていないけどこれかな？

:::note
pennYDr0pper.!
:::
もしもPMが織田信長だったなら

こんにちは！
最近、ちょっと変わった視点でプロジェクトマネジメントについて考えてみました。「もし織田信長が現代のIT企業でPMやってたらどうなるんだろう？」って。面白いでしょ？ちょっと想像力を働かせて、一緒に考えてみましょう！

## 1. 「天下布武」ならぬ「プロジェクト布武」

信長といえば「天下布武」ですよね。これをPMの世界に持ってくると...

```
天下布武 → プロジェクト布武
```

つまり、「プロジェクト全体を統一されたプロセスと方法論で進める」ってことになりそうです。

具体的には：
- チーム全体で統一されたコーディング規約を採用する
- 共通のタスク管理ツール（JiraとかTrelloとか）を導入する
- 定期的な進捗報告会議（デイリースクラムみたいな）を実施する

信長PMなら、こういった「統一」を徹底してプロジェクトの効率化を図りそうですよね。でも、やりすぎるとチームの自主性が失われちゃうかも...バランスが大事そう。

## 2. 楽市楽座ならぬ「楽コード楽テスト」

信長の「楽市楽座」政策、覚えてます？商人や職人の自由な活動を促進するやつです。これをITプロジェクトに当てはめると...

```
楽市楽座 → 楽コード楽テスト
```

こんな感じでしょうか：
- 新しい技術や手法を積極的に導入する（「React？面白そうだな、次のプロジェクトで使ってみよう！」）
- 自動テストを奨励する（「単体テストは全部自動化しろ！」）
- コードレビューを簡素化する（「細かいことは気にするな、大枠で問題なければOKだ」）

信長PMは、エンジニアの創造性を重視して自由な発想を促すんじゃないでしょうか。ただ、プロジェクトのゴールを見失わないよう注意は払いそうです。「自由にやれ、でも期限は守れよ！」みたいな。

## 3. 鉄砲隊ならぬ「AI部隊」

信長といえば鉄砲隊の採用で有名ですよね。これを現代のIT業界に置き換えると...

```
鉄砲隊 → AI部隊
```

こんな感じかな：
- 機械学習モデルの積極的な活用（「この業務、AIで自動化できないか？」）
- AI駆動の自動コード生成ツールの導入（GitHub Copilotとか）
- データ分析におけるAIの活用（「ビッグデータ？AIで分析しろ！」）

信長PMなら、最新技術を恐れずに採用してプロジェクトの競争力を高めそうです。でも、やりすぎるとトラブルの元になりそうで怖いですよね...

## 4. 本能寺の変ならぬ「本番環境の変」

歴史に残る「本能寺の変」。プロジェクトマネジメントでは...

```
本能寺の変 → 本番環境の変
```

こんな感じでしょうか：
- 予期せぬシステムダウン（「え？本番環境が落ちた！？」）
- セキュリティブリーチ（「クラッカーに侵入された...まさか裏切り！？」）
- 重大なバグの発見（「このバグ、リリース直前に見つかるとは...」）

信長PMなら、こういった「変」に備えて：
- 徹底的なリスク管理
- 定期的な災害復旧訓練
- インシデント対応プランの整備

をしっかりやりそうです。「備えあれば憂いなし」ってやつですね。

## 5. 信長流スクラム：「一向一揆」から学ぶ

信長が直面した一向一揆。これって、ある意味当時の「レガシーシステム」との戦いだったのかも？

```
一向一揆 → レガシーコード撲滅運動
```

信長PMならこんな感じで対応しそう：

1. **現状分析**: レガシーシステムの問題点を洗い出す（「このコード、誰が書いたんだ？」）
2. **戦略立案**: 段階的な改修計画を立てる（「一気にはムリだ、少しずつ攻めるぞ」）
3. **新技術導入**: モダンな開発手法やツールを採用する（「みんな、Docker使えるようになれ！」）
4. **教育と啓蒙**: チームメンバーのスキルアップを支援する（「勉強会？いいね、やろう」）
5. **継続的改善**: 定期的なコードリファクタリングを実施する（「綺麗なコードは正義だ！」）

## まとめ：信長PMから学べること

1. **革新性**: 新しい技術や方法論を恐れずに採用する勇気
2. **統一と効率化**: プロセスの標準化でプロジェクト管理を向上させる
3. **リスク管理**: 予期せぬ事態への備えは怠らない
4. **人材育成**: チームメンバーの能力を最大限に引き出す
5. **ビジョンの明確化**: プロジェクトの目標を常に明確にし、チーム全体で共有する

信長のような革新的なリーダーシップとしたたかな戦略眼を持つPMがいたら、どんなプロジェクトも成功間違いなしかも！皆さんのプロジェクトにも、こんなPMいたらいいなって思いません？

さあ、明日からのプロジェクト、ちょっと信長気分で臨んでみませんか？「天下布武」ならぬ「プロジェクト布武」で、プロジェクトを成功に導きましょう！

...って、ちょっと盛り上がりすぎましたか（笑）。
でも、たまにはこういう視点でプロジェクトマネジメントを考えるのも面白いかもしれません。
皆さんはどう思いますか？コメント欄で是非教えてください！
CentOS7のサーバでのリポジトリ停止対応

CentOS7は2024 年 6 月 30 日にサポート終了 (EOL:End Of Life)になりました。
本来ならばOSバージョンへのアップグレードを行う必要がありますが、内部で使用しているサーバであり、アップグレードまでの間の対策として実施したことを記録しておきます。

### 出発点
サーバから管理者のメールアドレスに下記のメールが届いた。
```
タイトル：Anacron job 'cron.daily' on サーバ名
本文
etc/cron.daily/0yum-daily.cron:

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Name or service not known"
```
この時yumのキャッシュをクリアしようとしたが、同様のエラーメッセージがコンソールに表示された。
```
$ sudo yum clean all
読み込んだプラグイン:fastestmirror, langpacks
リポジトリーを清掃しています: base centos-sclo-rh docker-ce-stable epel extras forensics
                            : forensics-splunk gitlab_gitlab-ce gitlab_gitlab-ce-source nux-dextop
                            : remi-php74 remi-safe sublime-text updates
Cleaning up list of fastest mirrors
Other repos take up 36 M of disk space (use --verbose for details)
[tuti@takejr ~]$ sudo yum makecache
読み込んだプラグイン:fastestmirror, langpacks
Determining fastest mirrors
Could not retrieve mirrorlist http://mirrorlist.centos.org?arch=x86_64&release=7&repo=sclo-rh error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org"
```
### 原因
mirrorlist.centos.org のリポジトリが利用不能となった

### 対応
CentOS Vault Mirrorを使うように、/etc/yum.repos.d/CentOS-Base.repoを変更する

> vi /etc/yum.repos.d/CentOS-Base.repo
```
[base]
name=CentOS-$releasever - Base
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```

yumのキャッシュクリア
```
$ yum clean all
```

### 後始末
これでphpのバージョンアップなどの作業もできるが、できるだけ速やかにOSのアップグレードが必要です。
頑張りましょう！
スクラム開発におけるSREの役割とは？クラウド時代の信頼性を支える要


## はじめに

スクラム開発が広く普及する中で、SRE（Site Reliability Engineering）の重要性がますます高まっています。特にクラウドベースのプロダクト開発において、SREは信頼性とスケーラビリティを確保するためのキーパーソンです。本記事では、スクラム開発におけるSREの役割について詳しく解説します。

## SREとは？

SREは、Googleが提唱した概念で、システムの信頼性を確保するためのエンジニアリング手法です。SREの主な目的は、システムの可用性、パフォーマンス、セキュリティを高めることです。これを実現するために、SREは以下のような活動を行います。

- **モニタリングとアラート設定**: システムの状態を常に監視し、異常が発生した際には迅速に対応します。
- **インシデント管理**: 問題が発生した際の対応策を策定し、迅速に実行します。
- **キャパシティプランニング**: システムの負荷を予測し、必要なリソースを確保します。
- **自動化**: 手動作業を減らし、効率を高めるための自動化ツールを開発・導入します。

## スクラム開発におけるSREの役割

スクラム開発では、プロダクトの開発と運用が密接に連携することが求められます。ここでSREが果たす役割は非常に重要です。

### 1. プロダクトオーナーとの連携

SREはプロダクトオーナーと密に連携し、システムの信頼性に関する要件を明確にします。これにより、開発チームは信頼性を考慮した設計・実装を行うことができます。

### 2. スプリントプランニングへの参加

SREはスプリントプランニングに参加し、信頼性に関するタスクをバックログに追加します。これにより、開発チームは信頼性を高めるための作業を計画的に進めることができます。

### 3. デイリースクラムでの状況共有

デイリースクラムでは、SREがシステムの状態やインシデントの状況を共有します。これにより、チーム全体が現在の課題を把握し、迅速に対応することができます。

### 4. レトロスペクティブでの振り返り

スプリントの終了後、SREはレトロスペクティブに参加し、信頼性に関する課題や改善点を共有します。これにより、次のスプリントでの改善策を具体的に策定することができます。

## クラウドサービスの活用

クラウドベンダーが提供する様々なサービスを活用することで、SREの活動はさらに効果的になります。例えば、以下のようなサービスがあります。

- **AWS CloudWatch**: システムのモニタリングとアラート設定に利用できます。
- **Google Cloud Operations Suite**: インシデント管理やキャパシティプランニングに役立ちます。
- **Azure DevOps**: 自動化ツールの開発・導入に利用できます。

これらのサービスを適切に活用することで、SREはシステムの信頼性を高めるための活動を効率的に行うことができます。

## まとめ

スクラム開発におけるSREの役割は、システムの信頼性を確保するための重要な要素です。プロダクトオーナーや開発チームと密に連携し、クラウドサービスを活用することで、SREはシステムの可用性、パフォーマンス、セキュリティを高めることができます。これにより、ユーザーにとって信頼性の高いプロダクトを提供することが可能になります。

SREの役割を理解し、スクラム開発に取り入れることで、より高品質なプロダクトを効率的に開発することができるでしょう。
[MovableType]サイト一覧とか固定ページを一覧で取得するAPI

# ニッチ過ぎるヤツ
ちょっとニッチ過ぎて誰得？感の有るのを書こうかなと。
MovableTypeで用意されているDataAPIを使って、サイトの一覧とか固定ページの情報を取得するやつを作る機会があったので、
ソレのやり方をちょこちょこ書いてみる。

# お試し開発環境
- Windows11(別にコレは何でも良い)
- NodeJS(2024年7月時点の最新を使ってた)
- axios（同上）

普通にAPIが叩ける言語、環境さえアレば何でも良いんだ。
今自分が1番早く書ける（環境出てるとか直近で書いてたとか）のが、Nodeだっただけなんだ。


# やりたかったこと
- API経由でログイン→accessTokenの取得
- サイトの一覧取得→上のaccessTokenを使って、siteのidを取得
- 固定ページの取得→上のaccessTokenとsiteのidを使って、固定ページのURLを取得

# そんなわけでコード
即席で使いたかったので、書き方とかメチャクチャなのは許容してください。。。
```json:package.json
{
  "name": "hoge",
  "version": "1.0.0",
  "main": "index.js",
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "axios": "^1.7.2"
  }
}
```
```javascript:index.js
const axios = require('axios').default;
const cmsRootUrl = "サイトのURLを書いてね";
// /mt～ってなってますが、要は「mt-data-api.cgi」が有るPathを指定
axios.defaults.baseURL = `${cmsRootUrl}/mt/mt-data-api.cgi/v2`;

// ログイン
axios({
  method: "post",
  url: "/authentication",
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  // 画面から普通にはいる時のログイン情報を入れてね
  data: {
    clientId: "hohohogegege", // ここは正直なんでも良かった気がする
    password: "パスワード入れて",
    remember: 1,
    username: "ユーザID入れて"
  }
}).then(res1 => {
  const accessToken = res1.data.accessToken;
  // サイト一覧の取得
  axios({
    method: "get",
    url: "/sites",
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      "X-MT-Authorization": `MTAuth accessToken=${accessToken}`
    }
  }).then(res2 => {
    res2.data.items.forEach(site => {
      console.log(site);
      // 固定ページ一覧の取得
      axios({
        method: "get",
        // limitを追加で入れないと、10件しか取得できない
        url: `/sites/${site.id}/pages?limit=1000`, 
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          "X-MT-Authorization": `MTAuth accessToken=${accessToken}`
        }
      }).then(res3 => {
        res3.data.items.forEach(page => {
          // 固定ページ一覧の取得
          console.log(`site url:${page.permalink}`);
        });
      })
        .catch(e => console.log("固定ページ一覧の取得失敗", e));
    });
  })
    .catch(e => console.log("サイト一覧の取得失敗", e));
})
  .catch(e => console.log("ログイン失敗", e))
```

```msshell:ターミナルから実行
node index.js
```
# 実行結果（URLは加工してます
![スクリーンショット 2024-07-09 141931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/725457a7-fdde-4497-1eb8-13f3faf9f333.png)

ちょっと所要でそのサイトのURLの一覧が欲しくなったので、いちいちブラウザからポチポチアクセスするの面倒くさかったのと、サイトマップ的なものの使い方などわからなかったので、API有るなら呼べばいいじゃんと作ってみたって感じでした。

うん、恐らく需要はほぼないかも知れない自己満足記事！

ちなみに公式ドキュメントは[こちら](https://www.movabletype.jp/developers/data-api/)
VBEで生成するSQL文のデバッグ

## SQL文をデバッグする
自分用に備忘録として。

VBEで変数を出力する際、通常**Debug.Print**を使用することでイミディエイトに表示できるデバッグ機能を使用するかと思います。
しかし、文字列が長い場合などは、イミディエイトウィンドウからコピーした際、意図しない箇所にスペースが紛れます。
長いSQL文の場合は特にスペースが紛れることによってエラーになり、修正が必要になります。
しかし、毎回スペース箇所を確認するのは時間と労力を浪費しますので、テキストファイルにデバッグとして出力するようにすると、スペースが紛れることがないので便利です。
以下のコードは、第1引数に生成したSQL文の文字列、第2引数には出力するファイル名を指定して作成するようにします。
作成される出力ファイルは、実行しているExcelファイルと同じ階層で、拡張子が"sql"として作成されます。
尚、同名ファイルだった場合、上書きをするので注意が必要です。複数個所で使用する場合は第2引数のファイル名を変更しなければ最後に出力したSQL文しか生成されません。（ぶっちゃけ手抜きで作ってます。）

```
'***********************************************************************************************
' DebugSql
'
' Param
'       sql{String}:デバッグしたいSQL文
'       fileName{String}:作成されるファイル名の指定。""の場合、ファイル名"デバックされたSQL文"で作成されます。
'
' 機能:第1引数で受け取ったSQL文を、実行しているExcelファイルと同じ階層にsql拡張子のファイルを出力します。
'      既に存在する場合は上書きます。
'***********************************************************************************************
Public Sub DebugSql(ByVal sql As String, ByVal fileName As String)
    If fileName = "" Then
        fileName = "デバッグされたSQL文"
    End If
    Open ThisWorkbook.Path & "\" & fileName & ".sql" For Output As #1
    Print #1, sql
    Close #1
    debug.print "SQL文のデバッグファイルを出力しました。"
End Sub
```

ソースの通り、第2引数は面倒であれば""を渡せばデフォルトのファイル名として"デバッグされたSQL文"というファイルで作成します。