[{"data":1,"prerenderedAt":213},["ShallowReactive",2],{"pqWMxGXzB0":3,"BsJYbO1tvf":57,"tagCnt-wakatta-tsumori":107,"posts_wakatta-tsumori_0":133,"tags_wakatta-tsumori":212},{"createdAt":4,"updatedAt":5,"publishedAt":4,"revisedAt":5,"title":6,"subTitle":7,"author":8,"portalEyecatch":9,"portalEyecatchCom":13,"pickupEntry":14,"topLink1":38,"topLink2":44,"topLink3":52},"2021-11-13T07:20:45.441Z","2025-06-01T04:12:21.773Z","fragmentary notes","ITエンジニアの気まぐれメモ","shunya_wisteria",{"url":10,"height":11,"width":12},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/7867e0be54e544d7a486f665ca8877df/chojuji.webp",1600,2400,"休日コーディングの嗜み",{"id":15,"createdAt":16,"updatedAt":17,"publishedAt":18,"revisedAt":17,"title":19,"abstract":20,"eyecatch":21,"toc":25,"body":26,"category":27,"tags":29},"architect2506","2025-06-01T04:09:39.256Z","2026-05-11T11:42:59.454Z","2025-06-01T04:12:27.705Z","ブログアーキテクチャ ver.202506 - LLM本文要約機能の追加","LLM（生成AI）を用いた本文要約機能を実装してみたので、それを踏まえたブログシステムアーキテクチャをまとめてみます。",{"url":22,"height":23,"width":24},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/bea3c1bfe18d49609b7c8404f7cf604b/237A6184.webp",800,1200,true,"\u003Ch2 id=\"h8d027c8ed3\">はじめに\u003C/h2>\u003Cp style=\"text-align: start\">変化の流れがはやすぎて、ついていけていない生成AI事情。とはいえ何かしら活用してみたいなと思い、今更ながらAPI経由でのLLM callを試しながら、当ブログに本文要約機能を実装してみる。\u003C/p>\u003Cp style=\"text-align: start\">併せて、ここ最近でいろいろと組み替えた部分も踏まえて、改めて2025/6時点のシステムアーキテクチャをまとめてみました。\u003C/p>\u003Ch2 id=\"h7c8e70c948\">LLM本文要約機能\u003C/h2>\u003Cp style=\"text-align: start\">LLM本文要約機能は、Cloudflare Workers上にWEB APIとして実装。リクエストされたブログ本文をプロンプトとともにLLMに渡して本文要約、要約結果をレスポンスする作りとしています。\u003C/p>\u003Cp style=\"text-align: start\">呼び出し側（Nuxt3のフロントエンド）は、ビルド時にこのAPIをcallし得られた要約文をページに埋め込んで静的生成しています。この流れは、ブログのコンテンツをmicroCMSからビルド時に引っ張っている動きと同様。\u003C/p>\u003Cp style=\"text-align: start\">LLMのモデルは、GoogleのGemini\u003Cs> 2.0 Flash\u003C/s> 2.5 Flash-Liteを採用（2025/12/9 モデルを変更）。\u003C/p>\u003Cul>\u003Cli>APIが無料である程度のボリューム使用できること\u003C/li>\u003Cli>本文要約自体はそれほど難しいタスクではないと思うので、\u003Cs>最新の2.5でなくても十分\u003C/s>\u003Cbr>→ いつの間にかGemini 2.0 Flashが利用できなくなっているようなので、2.5 Flash-Lite に変更（2025/12/9）\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">というの採用の理由、あまり深い意味はありません。\u003C/p>\u003Cp style=\"text-align: start\">要約結果は、Cloudflare KV上にキャッシュさせ、LLMへのリクエストは初回のみ、以降はキャッシュされた結果を利用するようにもしています。これは\u003C/p>\u003Cul>\u003Cli>LLMへのリクエスト回数を絞ること\u003C/li>\u003Cli>要約結果の変動を防ぐこと\u003C/li>\u003Cli>必要に応じて要約結果を人が修正できるようにすること\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">を目的としたもの。\u003C/p>\u003Cp style=\"text-align: start\">特に3つ目にも記載しましたが、LLMによる要約を完全に信頼してはいないため、必ず要約結果を確認し必要に応じて修正できる仕組みであることを重視しました。\u003C/p>\u003Cfigure>\u003Cimg src=\"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/7c67f43cc795444293c03407ccbc7504/blog-abstract-sequence.webp\" alt=\"\" width=\"1215\" height=\"822\">\u003C/figure>\u003Cp style=\"text-align: start\">動かし始めてまだ日が浅いですが、今のところはよい感じで動いてくれてそう。\u003C/p>\u003Ch2 id=\"h1331c56b22\">作ってみた感想\u003C/h2>\u003Cp style=\"text-align: start\">仕組み自体はWEB API callをしているだけなので、大して難しいわけでもなく、すんなり作れたのですが。。。ちょっと苦戦したのはプロンプトの作成。\u003C/p>\u003Cp style=\"text-align: start\">要約結果がなかなか思うようにならずに、LLMに指示する表現を色々変えながらTry &amp; Errorを繰り返しました。特に、今回出力されたものをそのままページに埋め込む仕組みにしていますが、LLMがMarkdownのCode Block形式で出力してくる点が面倒でした。これをそのまま埋め込むとCode Blockとして表示されてしまうため、色々な言い回しを試し、何とかCode Block形式にしない出力が得られるようになりました。このあたりが自然言語をInputとするプロンプトの難しさね。AIを使いこなすにはプロンプト力が試されるわけか。\u003C/p>\u003Cp style=\"text-align: start\">また要約結果を眺めていると、自分視点の要約結果と、第三者視点の要約結果（「筆者は〇〇と述べている」みたいな表現）が混在している点も気になっています。このあたりもゆくゆくはプロンプトを修正してどちらかに統一するようにしてみたいなと思います。\u003C/p>\u003Ch2 id=\"h18ae72303e\">ブログシステムアーキテクチャ ver.202506\u003C/h2>\u003Cp style=\"text-align: start\">以上を踏まえた上で、2025/6時点のJamstackブログのシステムアーキテクチャは次の通り。 \u003C/p>\u003Cfigure>\u003Cimg src=\"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/d8b74c8be1d541b9a31ef04f0f18051a/blog-architect-202506.webp\" alt=\"\" width=\"1368\" height=\"831\">\u003C/figure>\u003Cp style=\"text-align: start\">最近 Cloudflare領域が拡大していますね。これなら静的ページのホスティング自体もnetlifyからCloudflare Pagesに移管してしまってもよいのでは？と思うこともありますが、1プラットフォームに依存・固めすぎるのも面白くないという理由でしばらくはこの構成で行こうかと（単純に移行するのが面倒でもあり）。\u003C/p>",{"id":28},"tech-tips",[30,32,34,36],{"id":31},"llm",{"id":33},"jamstack",{"id":35},"cloudflare",{"id":37},"blog-mng",{"fieldId":39,"title":40,"url":41,"photo":42,"external":25},"toplink","Photo Blog","https://amaoto.swisteria.com",{"url":43,"height":23,"width":24},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/cfff2880c38d48829e729bfef255d29a/IMG_0683s.webp",{"fieldId":39,"title":45,"url":46,"photo":47,"external":51},"My TIPS","categories/tech-tips/",{"url":48,"height":49,"width":50},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/23d28881bd10453ea89ecc024e64a4c1/technology-g25b3232d5_1280.webp",720,1280,false,{"fieldId":39,"title":53,"url":54,"photo":55,"external":51},"About Me","about/",{"url":56,"height":23,"width":24},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/f41c2daad68f40cc8ad394ae591d4ffe/IMG_2691s.webp",{"createdAt":58,"updatedAt":59,"revisedAt":59,"about":60,"author":61,"desc":62,"prof":63,"sns":66},"2019-10-06T13:13:55.050Z","2026-07-05T10:23:36.330Z","\u003Cp>仕事や趣味、何気ない日常の中で気になったこと/気に入ったこと（IT・業務知識、プログラム関係の覚書、行ってみたい/行ってみた場所、使ってみたい/使ってみたガジェットやWEBサービスetc）に触れながら、感想・気づき・ボヤキ等を、忘備録的に綴る楽描ノート。\u003C/p>","shunya","\u003Cp>平成初期生まれ、 岐阜県出身 東京都内在住のITエンジニア。\u003Cbr>\u003Cbr>根っからの新しい物好き / 飽きっぽい性格と、なんやかんやあり、広く（浅く）いろんなことを経験しながら引き出しと視野を広げるキャリアを疾走中。\u003Cbr>\u003Cbr>休日は、部屋に引きこもりPCと戯れる or ふらっとどこかに出かけ散歩しながら写真撮影を楽しむ。お城や寺社仏閣、古い街並みあたりをキーワードに次の目的地を探す日々。自己満足写真は、\u003Ca href=\"https://shunya-wisteria.tumblr.com\" target=\"_blank\" rel=\"noopener noreferrer\">tumblrブログ\u003C/a>参照。\u003C/p>",{"url":64,"height":65,"width":65},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/de44ebfd86294d01a7994ffae55b09f2/PXL_20230625_040816231.jpg",1000,[67,73,77,82,87,92,97,102],{"fieldId":68,"type":69,"text":70,"url":71,"mdicon":72},"sns","github","GitHub","https://github.com/shunya-wisteria","mdi-github",{"fieldId":68,"type":74,"text":8,"url":75,"mdicon":76},"twitter","https://twitter.com/shunya_wisteria","mdi-twitter",{"fieldId":68,"type":78,"text":79,"url":80,"mdicon":81},"mastodon","@wisteriaWithS@vivaldi.net","https://social.vivaldi.net/@wisteriaWithS","mdi-mastodon",{"fieldId":68,"type":83,"text":84,"url":85,"mdicon":86},"contact","Mail","https://www.swisteria.com/contact/","mdi-email-outline",{"fieldId":68,"type":88,"text":89,"url":90,"mdicon":91},"instagram","Instagram","https://www.instagram.com/wisteria.shunya/","mdi-instagram",{"fieldId":68,"type":93,"text":94,"url":95,"mdicon":96},"tumblr","雨音日録 - Photo Blog","https://shunya-wisteria.tumblr.com","mdi-alpha-t-box-outline",{"fieldId":68,"type":98,"text":99,"url":100,"mdicon":101},"bluesky","@swisteria.bsky.social","https://bsky.app/profile/swisteria.bsky.social","mdi-butterfly-outline",{"fieldId":68,"type":103,"text":104,"url":105,"mdicon":106},"threads","@wisteria.shunya@threads.net","https://www.threads.net/@wisteria.shunya","mdi-message-outline",{"contents":108,"totalCount":130,"offset":131,"limit":132},[109],{"id":110,"createdAt":111,"updatedAt":112,"publishedAt":113,"revisedAt":112,"title":114,"abstract":115,"eyecatch":116,"toc":25,"body":118,"category":119,"tags":124},"aimai-word","2026-07-05T10:33:01.333Z","2026-07-05T13:18:22.832Z","2026-07-05T10:37:09.366Z","分かったようでよく分からない言葉に要注意 - ITエンジニアの気づき","当たり前のように使っている言葉でも、時と場合・人によって意味や解釈が異なる危険性について、備忘と自戒の意味も込めてまとめてみました。",{"url":117,"height":23,"width":24},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/95d796b3d9254d2e925f7d00e92546ea/suiren-hasu.jpg","\u003Ch2 id=\"h8d027c8ed3\">はじめに\u003C/h2>\u003Cp style=\"text-align: start\">単語・用語の意味・解釈を取り違えてトラブルになったこと、ありませんか？\u003C/p>\u003Cp style=\"text-align: start\">当ブログを始めた初期の頃に、\u003Ca href=\"https://www.swisteria.com/posts/shift-jis_ms932/\" target=\"_blank\" rel=\"noopener noreferrer\">Shift_JISとMS932にハマったときの話\u003C/a>というエントリを公開しました。業務システム系ITエンジニアを生業とする私が、Shift_JISという単語に惑わされ直面したトラブルについて、なぜそんなことが起きたのか背景を含めて語ったものです。 その末尾では、知っているつもり・理解しているつもりの事柄であっても、実際には不足や誤った理解をしていることが往々にしてあり、そこに足元を掬われないよう確認を怠らぬべきだ、というニュアンスで締めくくっていました。\u003C/p>\u003Cp style=\"text-align: start\">あれから4年ほど経ち、最近、いくつか新しい案件に携わる中で、改めて気づいたのは、自分が何気なく使っている単語・用語であっても、人によって解釈や理解が異なるケースが少なくないということ。そして、関係者間で言葉の意味や認識を揃えておかないと、大騒ぎの火種になることもあります。。。\u003C/p>\u003Cp style=\"text-align: start\">備忘と自戒の意味も込めて、最近気になったものから、過去の記憶も含め、個人的に&quot;紛らわしいな、気を付けないと危ないな&quot; と思える単語・用語について実際に発生したエピソードを交えて紹介します。\u003C/p>\u003Ch2 id=\"h40917a86e0\">このエントリで扱う内容の注意点\u003C/h2>\u003Cp style=\"text-align: start\">ここで記載する単語・用語の定義は私の理解に則ったものであり、必ずしも正しいとは限りません。実務では個別PJや顧客によって定義される意味合いを正としてください。 このエントリは「正解の定義を提示する」ことではなく、分かったつもりでいる、よく聞く単語・用語であってもその場で意味を確認・認識合わせすることが大切、という点を共有することを目的としています。\u003C/p>\u003Ch2 id=\"hd532c5fb73\">定義があいまいな単語 - 品目の分類\u003C/h2>\u003Cp style=\"text-align: start\">品目・モノを定義・分類する単語として、製品・商品・半製品・仕掛品・原料・資材等をよくきくことがあります。これらの言葉には明確な定義があるのかもしれませんが、企業や人によってブレていることが得てして多くあります。\u003C/p>\u003Cp style=\"text-align: start\">例えば、製品・商品・仕掛品を例に見てみましょう。この3つの私の理解は次の通り。\u003C/p>\u003Cul>\u003Cli>製品：自社で製造し、販売する最終的な形のモノ\u003C/li>\u003Cli>商品：自社では製造せず、外部の仕入先から仕入れて販売するモノ\u003C/li>\u003Cli>仕掛品：自社で製造するモノのうち、まだ完成していない途中段階であり、このままでは販売できないモノ\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">一方、これを営業さんの視点で見てみましょう。モノを売ることを本業とする営業さんからすると自社で製造する製品 / 外部の仕入れ先から仕入れた商品 を区別する必要性が薄く、「売るためのモノ」という意味で、製品も含めて一括りに「商品」として扱うケースも少なくありません。\u003Cbr>このことを理解していない状態でこの営業さんと会話すると、こんなことになるかも。。。\u003C/p>\u003Cul>\u003Cli>営業担当者：商品について教えてほしいんだけれど、（製品のつもりで）工場の製造リードタイムってどうやって決まるの？\u003C/li>\u003Cli>ベンダー担当者：（商品の工場だから仕入先さんの納品リードタイムと勝手にとらえ）リードタイムですね、それは仕入先と品目ごとに計算式を定義できますよ\u003C/li>\u003Cli>営業担当者：何で仕入先？工場で作っているんだから仕入先関係ないでしょ\u003C/li>\u003Cli>ベンダー担当者：いや、商品なので（仕入先の）工場で作っていますから、仕入先さんが関係しますよね。\u003C/li>\u003Cli>営業担当者：え？？？\u003C/li>\u003Cli>ベンダー担当者：え？？？ \u003C/li>\u003C/ul>\u003Cp>コントみたいなやり取りにみえますが、お互いが間違ったことを言っているわけではありません。それぞれ別の意味で「商品」という言葉を使っているだけ。だからこそ、リアルな現場でも十分起こり得るのが怖いところです。\u003C/p>\u003Cp style=\"text-align: start\">類似ケースとして、工場側の人は、完成した製品であっても工場の敷地にあるうち（製造部門が管理している間）は（最終）仕掛品と呼び、製品といっても通じない なんてこともありました。\u003Cbr>このケースでも工場担当者の「仕掛品」というなの「製品」に惑わされて話がかみ合わず空中戦に突入する可能性があります。\u003C/p>\u003Cul>\u003Cli>工場担当者：完成した仕掛品について教えてほしい\u003C/li>\u003Cli>ベンダー担当者：（完成した…仕掛品？完成したのに仕掛品？？）\u003C/li>\u003Cli>工場担当者：営業に渡す流れを確認したいのですが\u003C/li>\u003Cli>ベンダー担当者：営業に渡す目的はなんですか？\u003C/li>\u003Cli>工場担当者：（何言ってるんだ？こいつは）販売してもらうからに決まってるだろ\u003C/li>\u003Cli>ベンダー担当者：仕掛品ですよね？未完成のモノを売るんですか？\u003C/li>\u003Cli>営業担当者：え？？？\u003C/li>\u003Cli>ベンダー担当者：え？？？\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">このように、同じ「製品」「商品」「仕掛品」という単語でも、人によって思い浮かべるものは全く違うことがあります。大事なのは正しい定義を知っていることではなく、「ここでいう商品とは何を指していますか？」と最初に確認すること。分かったつもりになっている言葉ほど、一度立ち止まって認識合わせをする価値があるのだと思います。\u003C/p>\u003Ch2 id=\"h06f5d76b84\">主語・視点によって意味が逆転する単語 - 出荷 / 入荷、送信 / 受信\u003C/h2>\u003Cp style=\"text-align: start\">出荷 / 入荷なんてごく当たり前に使っているし、一見 間違えることがないように見えますよね。でも結構危うい言葉だと思っています。なぜなら、誰からみて・どこからどこへの出荷/入荷なのかを省いてしまうと途端に向き先が曖昧になってしまうからです。\u003C/p>\u003Cp style=\"text-align: start\">例を見てみましょう。工場で出来上がった製品を倉庫に納める、という業務があるとします。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>工場\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>倉庫\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>工場出荷\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>→（製品）→\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>倉庫入荷\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>2\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>工場入荷\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>←（製品返品）←\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>倉庫出荷\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">このモノのやり取りを工場視点で語る場合、1の動きは「出荷」、2の動きは「入荷」になります。\u003Cbr>一方でこれを倉庫視点で語る場合は、1の動きは「入荷」、2の動きは「出荷」にあたります。\u003C/p>\u003Cp style=\"text-align: start\">もし誰視点で語っているのかが明確でない、もしくは「工場出荷」「倉庫入荷」から「工場」「倉庫」という単語を省略して語ってしまうとどうなるでしょうか？単に「出荷」「入荷」とだけ言われても、どちらからどちらにモノが動くのか分からなくなりますよね。\u003Cbr>得てして工場担当者は誰視点で語るかお互い分かっているため、単に「出荷」「入荷」で済ませてしまうことが多くあります。\u003C/p>\u003Cp style=\"text-align: start\">例えば慣習的に倉庫視点で語る会社さんとのやり取りではこんなシチュエーションが起こらないとも言い切れません。\u003C/p>\u003Cul>\u003Cli>工場担当者：（倉庫）入荷処理で障害が発生したからすぐに調べてほしい\u003C/li>\u003Cli>ベンダー担当者：（工場からの問い合わせだから工場入荷かな）何を入荷しようとしていますか？仕入品ですか？\u003C/li>\u003Cli>工場担当者：何言ってるんだ、（倉庫）入荷なんだから製品に決まっているだろう\u003C/li>\u003Cli>ベンダー担当者：え？製品の入荷？返品ですか？\u003C/li>\u003Cli>工場担当者：違う、（倉庫）出荷の話はしていない、（倉庫）入荷だって\u003C/li>\u003Cli>ベンダー担当者：え？？？\u003C/li>\u003Cli>工場担当者：え？？？\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">この例のような入と出が発生する言葉のペアは、主語が何か、誰視点で語っているのかを確認しないと話はかみ合いません。\u003C/p>\u003Cp style=\"text-align: start\">同じようなものに、送信 / 受信 があります。こちらも誰から誰への送信 / 受信 なのかに言及しないと向き先を勘違いしやすいものの代表といえるでしょう。\u003Cbr>「送信でエラーが起きました」とだけ言われても\u003C/p>\u003Cul>\u003Cli>AシステムからBシステムへの送信なのか？\u003C/li>\u003Cli>BシステムからAシステムへの送信なのか？\u003C/li>\u003Cli>はたまたユーザーのPCからサーバーへの送信なのか？\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">が分からなければ調査のスタート地点にも立てません。\u003C/p>\u003Cp style=\"text-align: start\">こういう認識違いは、平常時よりも障害対応中のような&quot;急いでいる場面&quot;ほど起こりやすいものです。焦るほど主語が省略され、「入荷が失敗した」「送信できない」といった断片的な言葉だけが飛び交います。\u003Cbr>だからこそ、「誰から誰への話ですか？」「どのシステム視点ですか？」と一度立ち止まって確認することが、結果的には復旧への近道だったりします。その確認をせず先走った結果、原因とは全く別の場所を調べ、誤ったデータ更新してしまう等の二次災害も十分に起こりえます、恐ろしや。。。\u003C/p>\u003Ch2 id=\"h7803ce361a\">似ているが対象となるレイヤーが異なる単語 - ビジネス / 業務\u003C/h2>\u003Cp style=\"text-align: start\">最後に今回語る中で最も説明・整理が難しいトピック、同じ対象を見ているけれど、見ているレイヤーが違うというお話。\u003C/p>\u003Cp style=\"text-align: start\">ここでは、最近まで（今でも若干）私を混乱させた「ビジネス」と「業務」を例に取り上げたいと思います。というのも同じ仕事をしながら話していた際に、「それは業務の話ですね」「ビジネスの話をしましょう」と言われたことがあります。この時点では業務とビジネスって何が違うんだろう？（「ビジネス要件」と「業務要件」を同じような意味で使っていた自分がいたため）やや混乱していました。\u003C/p>\u003Cp style=\"text-align: start\">改めて話を聴き、理解した内容を自分なりに整理してみると、この2つの言葉は、指し示すレイヤーが異なるのでは、という点に気づきました。\u003Cbr>「業務」が「企業活動を維持するための取り組み（バックオフィス等、必ずしも直接利益につながるもの以外も含め）」を指すのに対し、\u003Cbr>「ビジネス」はより上位のレイヤー、「企業に利益をもたらすもの、企業が成長する上で必要となる取り組み」のようなニュアンスに受け止めました。\u003C/p>\u003Cp style=\"text-align: start\">その理解で考えてみると見える世界が変わってきました。例えばAIやシステムを用いて業務負荷を下げる、業務を30%効率化する、は「業務」の改善としては◎ですが、\u003Cbr>「それによって会社がどう成長するか？」という点には言及できていません、そこまで言及することが「ビジネス」の話になると感じました。\u003C/p>\u003Cp style=\"text-align: start\">ここでいつものたとえ話を。\u003C/p>\u003Cul>\u003Cli>顧客担当者：会社として新しいビジネスを考えたいんです。\u003C/li>\u003Cli>ベンダー担当者：では、まず受注業務の課題を整理しましょう。\u003C/li>\u003Cli>顧客担当者：もちろんそれも大事なんだけど、その前に&quot;何で稼ぐ会社になるか&quot;を考える、ビジネスの話をしたいんです。\u003C/li>\u003Cli>ベンダー担当者：あ、業務改善の話ではなく、もっと上位の話ですね。\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">「ビジネス」と「業務」は、どちらも仕事に関わる言葉なので、つい同じような意味で使ってしまいがちです。しかし実際には、会社の将来や価値を考えるレイヤーと、それを実現するための日々の活動というレイヤーでは、話している内容が全く異なります。\u003C/p>\u003Cp style=\"text-align: start\">カウンターとなる相手がどのレイヤー視点で語るか、どのレイヤーに興味を示しているか、それを意識するだけでも、会話のかみ合い方は大きく変わるように感じています。\u003C/p>\u003Cp style=\"text-align: start\">私自身、相手が業務の視点で語っているのか、ビジネスの視点で語っているのか、少しずつ意識することを心がけるようになりました。それによって、見える景色が少しずつ変わってきたような気がしています（気のせいかもしれませんが。。。）\u003C/p>\u003Ch2 id=\"h08c28aa3f6\">結び\u003C/h2>\u003Cp style=\"text-align: start\">今回は、「分かったようでよく分からない言葉」の曖昧さについて、定義・視点・レイヤーという3つの切り口から、実際に私の身の回りで起きた出来事を交えて紹介してみました。同じ言葉を使っていても、実は全く違うものを思い浮かべていたり、違うレイヤーで話をしていたりすることが少なくありません。\u003C/p>\u003Cp style=\"text-align: start\">実のところ異なる業種・地域・文化で育ってきた人たちが一堂に会するPJでは、言葉の掛け違いや認識のズレは、ある意味では日常茶飯事です。\u003C/p>\u003Cp style=\"text-align: start\">でも私は、そこに面白さがあると思っています。\u003Cbr>背景も価値観も違う人たちが一つの目的に向かって歩み寄り、コミュニケーションを重ね、ときに笑いながら、少しずつ認識をそろえ、同じ目標にむかっていく。その過程こそが、プロジェクトを成功に導く大きな力になっている気がします。\u003C/p>\u003Ch2 id=\"h25d0e20685\">おまけ\u003C/h2>\u003Cp>今回のアイキャッチは、「似ているけれど違う」夏の花ということでスイレンと蓮の写真を添えてみました。\u003C/p>",{"id":28,"createdAt":120,"updatedAt":121,"publishedAt":120,"revisedAt":122,"cat_name":123},"2021-11-03T11:59:30.255Z","2021-12-04T15:57:56.241Z","2021-12-04T15:57:46.597Z","Tech-TIPS",[125],{"id":126,"createdAt":127,"updatedAt":128,"publishedAt":127,"revisedAt":127,"name":129},"wakatta-tsumori","2026-07-05T10:24:58.140Z","2026-07-05T10:25:21.954Z","分かったつもり",5,0,1,{"contents":134,"totalCount":130,"offset":131,"limit":211},[135,140,159,177,192],{"id":110,"createdAt":111,"updatedAt":112,"publishedAt":113,"revisedAt":112,"title":114,"abstract":115,"eyecatch":136,"toc":25,"body":118,"category":137,"tags":138},{"url":117,"height":23,"width":24},{"id":28,"createdAt":120,"updatedAt":121,"publishedAt":120,"revisedAt":122,"cat_name":123},[139],{"id":126,"createdAt":127,"updatedAt":128,"publishedAt":127,"revisedAt":127,"name":129},{"id":141,"createdAt":142,"updatedAt":143,"publishedAt":144,"revisedAt":143,"title":145,"abstract":146,"eyecatch":147,"toc":25,"body":150,"category":151,"tags":152},"passkey","2026-06-28T15:27:58.839Z","2026-07-05T10:25:45.898Z","2026-06-28T15:28:43.783Z","分かったようでよく分からないパスキー認証の仕組み - なぜ注目される？","パスワード認証に変わる認証方法として期待されるパスキー認証の仕組みについて、調べてみた理解をまとめてみた。",{"url":148,"height":24,"width":149},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/05100073c6254dccb2faf408a3d11614/hanagasa.jpg",1800,"\u003Ch2 id=\"hef725b6a43\">Introduction\u003C/h2>\u003Cp style=\"text-align: start\">WEBの世界では、ユーザーを認証する仕組みとしてパスワード認証が長らく主流となっています。これはクライアント（PC・スマートフォン等の端末）がユーザーIDとパスワードを認証先のサービス（Google、Apple、MS、Amazon、etc）に送信し、サービス側はあらかじめ登録されているユーザーIDとパスワード（通常はハッシュ化され元の文字列が分からない状態のもの）の組み合わせと比較、合致した場合は認証を成功とするものです。すなわち、パスワードという秘密の合言葉を知っている=本人であるとみなすシンプルな仕組み、一見極めて効率的なものと考えられていました。\u003C/p>\u003Cp style=\"text-align: start\">ところが、ひとたびパスワードが第三者に知れ渡ってしまえば、いとも簡単になりすますことが可能な仕組みとも言えます。昨今 正規のログインページを模した偽のページにパスワードを入力させることでだまし取る手口が蔓延したり、パスワードを保持するサービス側が攻撃を受け情報を流出する等、パスワードの安全性は日々侵され続けています。直近でも\u003Ca href=\"https://www.kddi-webcommunications.co.jp/news/emergency/20260623a.html\" target=\"_blank\" rel=\"noopener noreferrer\">大手ISPが提供するメールサービスが攻撃を受け、パスワードを含む顧客情報が流出した可能性がある\u003C/a>というニュースが世間に衝撃を与えました。もはやパスワードのみに頼った認証では十分とは言い切れず、二段階認証等のパスワード認証を補完する仕組みも提案されていますが、パスワード自体は廃することはできていません。\u003C/p>\u003Cp style=\"text-align: start\">そんな今日、パスワード自体を使わない新しい認証方式として注目されているものがパスキー認証です。Google、Apple、MS、Amazonといった大手プラットフォーマーから始まり、徐々に各種サービスでも採用する動きが広がってきています。\u003C/p>\u003Cp style=\"text-align: start\">「パスキーは安全！」という一言で片づけられがちですが、何で安全・安心といえるのか？そもそもどんな仕組みなのか？利用者の視点でみたときに穴はないのか？\u003C/p>\u003Cp style=\"text-align: start\">何となくは分かっているつもりでも、ちゃんとは説明できない、いつもの状態に陥っていたので、改めて自分なりに調べてみました。\u003C/p>\u003Cp style=\"text-align: start\">このエントリーでは私の理解をもとに、パスキーについてまとめてみますが、「パスキーは安全だから使いましょう」という話ではなく、「なぜ安全と言われるのか」「どこまで安全で、どこに限界があるのか」を、できるだけ仕組みから整理してみます。\u003C/p>\u003Ch2 id=\"h0175a1252c\">パスキーとは？\u003C/h2>\u003Cp style=\"text-align: start\">パスキーとは、FIDO（Fast IDentity Online）で標準化された技術を利用した認証方式で、パスワードに代わり安全かつ便利な認証方法を目指して作られた仕組みです。\u003C/p>\u003Cp style=\"text-align: start\">パスワード認証では「秘密の合言葉（パスワード）を知っていること」を本人確認に利用します。一方、パスキー認証では、パスワードをサーバーへ送ることなく、「秘密鍵を持っていること（もちろん秘密鍵自体も送らず）」を証明することで本人確認を行います。\u003C/p>\u003Cp style=\"text-align: start\">利用者から見れば、生体認証やPINを入力するだけでログインできますが、その裏では公開鍵暗号方式を利用した認証が行われています。\u003C/p>\u003Cp style=\"text-align: start\">具体的な認証の流れを例え話を用いて説明してみます。\u003C/p>\u003Ch2 id=\"h367430e0da\">認証フロー\u003C/h2>\u003Cfigure>\u003Cimg src=\"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/f24e8adabffd4a2c8db03881e02a002c/passkey.webp\" alt=\"\" width=\"1408\" height=\"768\">\u003C/figure>\u003Cp style=\"text-align: start\">最初におさらいもかねてパスワード認証の仕組みを見てみましょう。\u003Cbr>パスワード認証はあなたがユーザIDとパスワードをサーバーに送り、サーバーがその情報の正しさを検証することで、あなた本人からの正規の要求と判断するものです（パスワードを知っている=本人である）。\u003C/p>\u003Cp style=\"text-align: start\">次にパスキーの仕組みは次の通りです。\u003Cbr>あなたが認証をしたいページを訪れた際、サーバーはあなた宛にチャレンジと呼ばれる文書を送ってきます。あなたはその文書に押印し、サーバーへ返送します。このとき使用する印鑑は端末上の番人によって厳重に管理され、生体情報やPINからあなたからの依頼と判断された場合のみ押印してくれます。サーバー側は押印されたチャレンジと事前に提出された印鑑証明を照合し、合致すれば本人からの正規の要求と判断するものです（チャレンジに押印できる人=本人である）。\u003C/p>\u003Cp style=\"text-align: start\">パスワード認証とパスキー認証の最も大きな違いは、パスワード認証が「パスワード」という本人であることを証明するもの自体をサーバーに送るのに対し、パスキーは本人であることを証明する「印鑑」は端末から出ていくことはなく、それによって押印された文書（チャレンジ）のみがサーバーに送られること。パスワードと違い、押印された文書（チャレンジ）はそのサーバーに対する、その時限りの要求にしか使えません、仮に流失しても悪用できません、第三者があなたになりすますための情報としては価値がありません。これがパスワードとパスキーの最も大きな違いであり、その強みとも言えます。\u003C/p>\u003Cp style=\"text-align: start\">もう少しシステマチックに表現すると、サーバーから受け取ったチャレンジに対しクライアント上の認証器（生体認証やPINを確認し、秘密鍵を管理する端末内の仕組み）がユーザー本人からの要求であることを確認した上で、秘密鍵を用いてチャレンジに電子署名を付与する。電子署名が付与されたチャレンジを受け取ったサーバー側は公開鍵を用いて電子署名の正当性を検証、成功したら本人からの正規の要求と判断するものです。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>パスワード認証\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>パスキー認証\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>本人確認に使うもの\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>パスワード（合言葉）\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>秘密鍵（印鑑）\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>サーバーが保持するもの\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>パスワード（元の文字列は分からない形）\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>公開鍵（印鑑証明）\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>サーバーへ送るもの\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>パスワードそのもの\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>電子署名（押印）されたチャレンジ\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>盗まれた場合\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>何度でも悪用できる\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>その認証以外では使えない\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">パスキーのこの仕組みは公開鍵暗号と呼ばれる現在最もポピュラーで安全性の高いといわれる仕組みの上で成り立ち（公開鍵暗号の仕組みについては後述）、印鑑は「秘密鍵」、印鑑証明は「公開鍵」と呼ばれます。\u003C/p>\u003Cp style=\"text-align: start\">パスキーがどんなものか、少しイメージはついてきたでしょうか？次にここまで理解した中で私が疑問に思ったポイントについて紐解いていこうと思います。\u003C/p>\u003Ch2 id=\"h07dccf862c\">よくある疑問\u003C/h2>\u003Ch3 id=\"hb06eab062f\">PINや生体認証情報はサーバーに送られない？\u003C/h3>\u003Cp style=\"text-align: start\">送られません。PINや生体情報は電子署名を付与する際、認証器が本人確認するためだけに使用するものであり、サーバー側に送られることはありません。サーバー側で持っておくメリットがそもそもありません。\u003C/p>\u003Ch3 id=\"h4ef1e81e00\">秘密鍵は端末内で厳重管理、端末を紛失したり機種交換したらどうなる？\u003C/h3>\u003Cp style=\"text-align: start\">ここがパスキーを理解する上で一番混乱したポイントでした。パスキーには2つの運用形態があります。\u003C/p>\u003Cul>\u003Cli>デバイス固定パスキー\u003C/li>\u003Cli>同期パスキー\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">前者は完全に端末内で閉じたものとなり、もし端末を紛失したり機種変更した場合は再度パスキーの設定が必要になります。一方の後者は大手プラットフォーマー（Google、Apple、MS）が提供するアカウントに紐づけられ、同じアカウントでログインした端末間では相互利用できる仕組みとなっています。故に新しい端末が増えたケースであっても同じアカウントでログインすればパスキーも引き継がれ、これまでと同じように利用することができます。\u003C/p>\u003Cp style=\"text-align: start\">セキュリティ的な観点で見たとき、一見するとデバイス固有パスキーの方が安全に思えますが（秘密鍵を外部に置かないため）、そこは利便性とのトレードオフなのかなと。\u003C/p>\u003Cp style=\"text-align: start\">今回調べるまでデバイス間で同期されるタイプのパスキーが存在することを知らなかったので、ちょっと新鮮。\u003C/p>\u003Ch3 id=\"he25938236b\">偽のサイトがチャレンジを送ってきたらどうなる？\u003C/h3>\u003Cp style=\"text-align: start\">チャレンジや電子署名に使用する鍵にはRP ID（Relying Party Identifier）と呼ばれる認証先のサービスを識別する情報が付与されています。ここにはパスキーをリクエストするドメイン名が当てられるため、仮に偽のサイトがチャレンジを送ったとしても正規のRP IDは設定されないため（偽サイトと正規のサイトではドメインが異なるため）、クライアント側は該当する（偽サイトの）RP IDの鍵がなくチャレンジは成功しません。よって偽サイトがチャレンジを送ってきたとしても何もできません。\u003C/p>\u003Cp style=\"text-align: start\">仮に偽サイト用のパスキーが作成されたとしても、それはあくまで偽サイト専用です。正規サイトに対する認証には利用できません。\u003C/p>\u003Ch3 id=\"hd73812f8cd\">サーバー側が公開鍵を漏洩したらどうなる？\u003C/h3>\u003Cp style=\"text-align: start\">公開鍵はその名の通り「公開されること」を前提とした鍵です。公開鍵は電子署名を検証するためにしか利用できないため、仮に漏洩したとしても何の害もありません。\u003C/p>\u003Cp style=\"text-align: start\">公開鍵から秘密鍵（電子署名する際に使用する鍵）をリバースすることは理論上 不可能ではありませんが、現代最高峰のコンピューターを駆使したとしても。。。現実的な時間では解読できないといわれています。\u003C/p>\u003Ch3 id=\"h4236273470\">もし電子署名付チャレンジが盗まれたら？\u003C/h3>\u003Cp style=\"text-align: start\">前述した通り、チャレンジはあるタイミングのリクエストに対して1回限りしか利用できません。またチャレンジの有効期間は長くて数分と短いものです。それ故に仮に盗んだとしてもパスワードのように1度入手すれば何度も使うことができるような代物ではありません。\u003C/p>\u003Cp style=\"text-align: start\">さらに現実には通信自体もTLSで暗号化されているため、チャレンジを盗み見ること自体も容易ではありません。（もしそれができれば、チャレンジやパスワードを盗まなくてもやりたい放題できちゃう。。。）。\u003C/p>\u003Ch3 id=\"h4b5b7ac737\">パスキーなら絶対安全？\u003C/h3>\u003Cp style=\"text-align: start\">パスキー認証は確かにパスワード認証と比べリスクの小さい方式ではありますが、だからと言って絶対安全、盲目的に信用してよいもではありません。セキュリティの世界に「絶対」は存在しません。\u003C/p>\u003Cp style=\"text-align: start\">パスキーを導入した認証システム全体の問題の1つにパスワード認証が並行し残っている現実があります。現在パスキーは過渡期といえ、パスキーだけですべての認証が賄える状態に至ってはいません。設定したパスキーが正しく動かないケースや予期せぬ端末の故障等に備え、多くのサービスがパスワードによる認証を残しています。つまりそのパスワード使った認証が残っている以上、パスキーを使っていても絶対安全とは言えないのです。\u003C/p>\u003Cp style=\"text-align: start\">例えば、悪意のある第三者が「パスキーの再設定が必要になりました、パスワードを入力し再設定してください」とメールを送ってきたらどうなるでしょう？ユーザー目線ではパスキーの再設定なのでパスキーは使えない→バックアップ用のパスワードの入力を求められることは至極自然なことに感じてしまいます。そうしてパスワードを盗まれてしまうと、そのパスワード認証が残っている限り、アカウントへの不正アクセスにつながるおそれがあります。\u003C/p>\u003Cp style=\"text-align: start\">パスキーによって玄関の防御をいくら高めても、裏口（パスワード認証）が今まで通り残っていればそこを突かれてしまう、パスキーを使っていれば絶対安全とは言えない一例にあたります。\u003C/p>\u003Cp style=\"text-align: start\">パスキーは、パスワード認証が抱えていた多くの問題を解決してくれる、とても優れた技術です。しかし、セキュリティは認証方式ひとつで決まるものではありません。アカウント復旧や例外時の運用を含めた「認証システム全体」で考える必要があります。\u003C/p>\u003Cp style=\"text-align: start\">「パスキーだから安全」ではなく、「どこまで攻撃の余地を減らせるか」。その積み重ねこそが、現実のセキュリティ設計なのだと思います。\u003C/p>\u003Ch2 id=\"h8aaba2f937\">パスキーを支える公開鍵暗号とは\u003C/h2>\u003Cp style=\"text-align: start\">最後にパスキーを支える公開鍵暗号方式について簡単に説明したいと思います、興味がある方はぜひ。\u003C/p>\u003Cp style=\"text-align: start\">この方式は現代において最も普及している方式で、情報を暗号化して安全に送る用途だけでなく、電子署名によって送信者が本人であることを証明する用途にも利用されています。\u003C/p>\u003Cp style=\"text-align: start\">大きな特徴として、公開鍵と秘密鍵という鍵のペアが作られる点が挙げられます。この2つの鍵は対になる関係にあり、それぞれ役割が決まっています。例えば、秘密鍵でしかできない処理や、公開鍵でしかできない処理があります。\u003C/p>\u003Cp style=\"text-align: start\">パスキーで利用される電子署名では、秘密鍵を持つ人だけが文書に電子署名を付与できます。一方、その電子署名が本物かどうかは、誰でも公開鍵を使って検証できます。\u003C/p>\u003Cp style=\"text-align: start\">つまり、\u003C/p>\u003Cul>\u003Cli>電子署名を作成できるのは秘密鍵を持つ本人だけ\u003C/li>\u003Cli>電子署名が正しいかどうかは公開鍵で誰でも確認できる\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">という役割分担になっています。\u003C/p>\u003Cp style=\"text-align: start\">パスキー認証では、この性質を利用してサーバーが送ったチャレンジに対し、クライアントが秘密鍵で電子署名を付与します。サーバーはあらかじめ登録されている公開鍵を使ってその電子署名を検証し、正しいことが確認できれば「秘密鍵を持つ本人からの要求」であると判断します。\u003C/p>\u003Cp style=\"text-align: start\">重要なのは、秘密鍵は認証時であっても端末の外へ送られないという点です。サーバーへ送られるのは電子署名が付与されたチャレンジだけであり、秘密鍵そのものが漏えいすることはありません。\u003C/p>\u003Cp style=\"text-align: start\">もちろん、公開鍵から秘密鍵を求めることは理論上不可能ではありません。しかし公開鍵暗号方式は、現在知られている計算方法では現実的な時間で解くことが極めて困難な数学的性質を利用しています。そのため、現代の計算能力では十分に安全な方式として、パスキーだけでなくインターネット上の暗号通信や電子証明書など、さまざまな場面で利用されています。\u003C/p>\u003Ch2 id=\"ha214098e44\">まとめ\u003C/h2>\u003Cp style=\"text-align: start\">パスキーという何だか掴みどころのないものについて、その仕組みやぱっと思いつく疑問点、パスワード認証との比較についてまとめてみました。\u003C/p>\u003Cp style=\"text-align: start\">パスキーの仕組み、パスワードに比べた優位性は腹落ちしたものの、パスワード認証がバックアップ的に残っている現状等も加味すると、それ単独で導入したから絶対安全といえるものではない、という点も改めて理解できました。\u003C/p>\u003Cp style=\"text-align: start\">セキュリティ対策は、個々の技術だけを見て評価するものではなく、アカウント復旧や例外時の運用も含めた「認証システム全体」で考え、リスクと利便性のトレードオフを見極めることが大切と改めて感じました。\u003C/p>\u003Ch2 id=\"h7605dc6208\">参考文献\u003C/h2>\u003Cblockquote>\u003Cp>\u003Ca href=\"https://techblog.yahoo.co.jp/entry/2023080730431354/\" target=\"_blank\" rel=\"noopener noreferrer\">FIDO認証＆パスキー総復習（認証の仕組みやパスキー登場までの経緯）- Yahoo! JAPAN Tech Blog\u003C/a>\u003C/p>\u003C/blockquote>",{"id":28,"createdAt":120,"updatedAt":121,"publishedAt":120,"revisedAt":122,"cat_name":123},[153,158],{"id":154,"createdAt":155,"updatedAt":156,"publishedAt":155,"revisedAt":155,"name":157},"ittips","2024-04-14T14:36:01.704Z","2024-05-07T13:58:58.11Z","IT知識",{"id":126,"createdAt":127,"updatedAt":128,"publishedAt":127,"revisedAt":127,"name":129},{"id":160,"createdAt":161,"updatedAt":162,"publishedAt":163,"revisedAt":162,"title":164,"abstract":165,"eyecatch":166,"toc":25,"body":168,"category":169,"tags":170},"outsourced-supplies","2026-05-03T07:16:00.751Z","2026-07-05T10:26:00.129Z","2026-05-03T07:20:22.400Z","有償支給と無償支給の違いはどこにある？ - 自作PCで理解する外注加工","製造業向けのシステム導入のお仕事をしていると避けては通れない、外注加工とそれに付随する支給行為。有償支給/無償支給の違いを自作PC組み立てを例にまとめてみた。",{"url":167,"height":23,"width":24},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/b9266622e79849458863d35e8b4da845/desktop_pc.jpg","\u003Ch2 id=\"hef725b6a43\">Introduction\u003C/h2>\u003Cp style=\"text-align: start\">製造業向けのシステム導入のお仕事をしていると避けては通れないのが外注加工とそれに付随する支給行為。何となく理解したつもりで話しているものの、実はお金のやり取り周りなど、ちゃんと腹落ちしていない部分が多々あり。。。\u003C/p>\u003Cp style=\"text-align: start\">改めて自分で調べたり、生成AIと壁打ちしながら自分の理解を深め、腹落ちするたとえ話を考えてみました。\u003C/p>\u003Cp style=\"text-align: start\">「分かったようでよくわからない」シリーズ第三弾（\u003Ca href=\"https://www.swisteria.com/posts/uuid/\" target=\"_blank\" rel=\"noopener noreferrer\">前回\u003C/a>、\u003Ca href=\"https://www.swisteria.com/posts/float-on-excel/\" target=\"_blank\" rel=\"noopener noreferrer\">前々回\u003C/a>はこちら）、今回は有償支給/無償支給の違いを取り上げてみます。\u003C/p>\u003Ch2 id=\"h3a8425c90a\">外注加工、支給とは\u003C/h2>\u003Cp style=\"text-align: start\">「外注加工」とはざっくりいうと、主に製造業において、製造工程の一部、もしくは全てを別の企業（外注先）に委託し、自社に代わって製造してもらう行為です。自社では対応できない専門性の高い加工を、その道のプロフェッショナルに依頼する、いわゆる「餅は餅屋」の考え方。\u003C/p>\u003Cp style=\"text-align: start\">このとき、自社から外注先に製造に必要な部材や、加工前の中間状態のモノ（「仕掛品」＝まだ完成していない途中の製品）を引き渡すことを「支給」と呼びます。\u003C/p>\u003Cp style=\"text-align: start\">ここが、一般的な購買（完成品を外部から仕入れる行為）との大きな違いです。 購買の場合は「完成したモノ」を買うだけですが、外注加工では「途中の状態のモノや材料を預けて、加工してもらう」という関係になります。\u003C/p>\u003Cp style=\"text-align: start\">なお、外注加工の定義は会社によって多少異なり、必ずしも支給があるケースだけを指すわけではありませんが、「モノを預けて加工してもらう」という点が特徴的なパターンです。\u003C/p>\u003Ch2 id=\"he7068abfd4\">有償支給 / 無償支給\u003C/h2>\u003Cp style=\"text-align: start\">支給には、「有償支給」と「無償支給」の2つのパターンが存在します。何となく「お金のやり取りがあるか / ないか」という違いと認識できるかと思いますが、どちらの場合でも外注先への加工賃自体は発生する点には注意が必要です。\u003C/p>\u003Cp style=\"text-align: start\">それぞれの違いを表にまとめてみましょう。\u003Cbr>……とはいえ、これだけでは少しイメージしづらいですよね。\u003C/p>\u003Cp style=\"text-align: start\">ここから、私がこの2つの違いを理解する上でしっくりきたたとえ話、\u003Cbr>\u003Cstrong>「能力はあるが少し信用ならん友人にパーツを渡して自作PCを作ってもらう」\u003C/strong>\u003Cbr>について見ていきます。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>有償支給\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>無償支給\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>一言でいうと\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>一度 &quot;売って&quot; から、作ってもらい、&quot;買い戻す&quot;\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>自分のモノを &quot;預けて&quot; 作ってもらう\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>支給品引き渡し\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>外注先に対する売却\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>外注先に対する貸与（預ける）\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>支給品の資産管理先（＝所有権）\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>外注先\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>自社\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>支給品の管理責任\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>外注先\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>自社（外注先にも一定の管理義務はある）\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>棚卸対象\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>外注先\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>自社（外注先に貸与している自社在庫扱い）\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>加工後のモノの引き取り\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>加工賃 + 支給品の金額（支給品を買い戻す）\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>加工賃のみ\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Ch2 id=\"h754ab966cd\">自作PCの製造依頼、あなたならどちらを選ぶ？\u003C/h2>\u003Cp style=\"text-align: start\">あなたは、自身でパーツ選びにこだわった構成のデスクトップPCを購入したいと思っています。パーツを取りそろえるところと、組みあがったPCにOS等のソフトウェアをインストールすることはできますが、手先が不器用で組み立てに不安が残ります。そこで、自作PCが得意な友人に組み立てを依頼することにしました。\u003C/p>\u003Cp style=\"text-align: start\">ここまでの状況を製造行為としてとらえると次のように整理でき、PCの組み立てを友人に依頼することが、「外注加工」に該当します。\u003C/p>\u003Col>\u003Cli>購買行為：パーツの調達 = 自社で実施\u003C/li>\u003Cli>製造工程①：PCの組み立て = 外注先に委託\u003C/li>\u003Cli>製造工程②：OSのインストール・セットアップ = 自社で実施\u003C/li>\u003C/ol>\u003Cp style=\"text-align: start\">実際にPCを組み立ててもらうためには自身が調達したパーツを友人に預ける必要がありますが、さて、この友人にパーツを渡すとき、あなたなら「そのまま預ける」か、それとも「一度売る」か、どちらを選ぶでしょうか？\u003C/p>\u003Ch3 id=\"h36d439b0de\">パーツを友人に売却し、完成後にパーツ代 + 組み立ててくれたお礼代を支払う（＝有償支給）\u003C/h3>\u003Cp style=\"text-align: start\">一度パーツを友人に売却し、友人の持ち物として扱ってもらいましょう。友人はそのパーツを使いPCを組み立て、完成後、組み立て代（＝加工賃）にパーツ代を加えた金額をあなたに請求します。これが有償支給です。\u003C/p>\u003Cp style=\"text-align: start\">このケースでのお金の流れは、次の通りとなります。\u003C/p>\u003Col>\u003Cli>発注者（あなた）がパーツを販売、パーツ代を受け取る\u003C/li>\u003Cli>外注先（友人）は、パーツ代+組み立て代を、完成品として請求\u003C/li>\u003Cli>発注者（あなた）がパーツ代+組み立て代の総額を支払う（見かけ上はパーツ代も支払っていますが、最初にパーツを売却しているため、差し引きすると実質的に支払っているのは組み立て代のみです）\u003C/li>\u003C/ol>\u003Cp style=\"text-align: start\">ここで、この友人についてもう少しだけ補足します。彼は腕は確かですが、少し雑なところがあります。静電気対策も「まあ大丈夫でしょ」と言いがちなタイプです。もし、組み立て中にパーツを破損してしまったらどうなるでしょうか？友人は自身の所有物を壊したことになるので、その損害は外注先（友人）が被ることになります。\u003C/p>\u003Cp style=\"text-align: start\">つまり、有償支給のポイントは「支給したモノに関するリスクと責任を外注先側に移すための仕組み」、要は「壊したらそっちの責任ね」と言えるようにするものなんですよね。\u003Cbr>※この“リスクの置き場所”が、もう一つの方法との大きな違いになります\u003C/p>\u003Cp style=\"text-align: start\">もちろん、有償支給は必ずしも「この人ちょっと信用ならんな…」と思って選ぶもの、というわけではありません。 実際には、信頼している相手であっても、万が一のときの責任の置き場所をはっきりさせるために使われることが多いです。\u003C/p>\u003Cp style=\"text-align: start\">反面 お金の流れが複雑で、売買として処理する必要があるため、請求や仕訳などの会計処理が増える点がデメリットです。\u003C/p>\u003Ch3 id=\"hbc4f77557d\">パーツを友人に預け、完成後に組み立ててくれたお礼代を支払う（＝無償支給）\u003C/h3>\u003Cp style=\"text-align: start\">これに対し、あくまでパーツを友人に預けるだけにする方法が無償支給です。パーツを渡した際にお金のやり取りは発生せず、完成後に、あなたが組み立て代（＝加工賃）を支払うだけとなります。有償支給に比べると、お金の流れがシンプルで分かりやすい方法です。信頼できる友人間のやり取りであれば、こちらの方法を選ぶケースも多いでしょう。\u003C/p>\u003Cp style=\"text-align: start\">ただし、この方法には注意すべき点もあります。\u003C/p>\u003Cp style=\"text-align: start\">パーツはあくまであなたの持ち物なので、組み立て時に破損してしまった場合、その損害を負うのはあなたです。友人がその保証を申し出てくれるケースもあるかもしれませんが、そうした対応はあくまで善意によるもので、最初から保証されているわけではありません。\u003C/p>\u003Cp style=\"text-align: start\">このようにリスクと責任が発注者側に残る点が有償支給との大きな違いとなります。\u003C/p>\u003Ch2 id=\"ha214098e44\">まとめ\u003C/h2>\u003Cp style=\"text-align: start\">あなた（自社）が友人（外注先）に支払うのは「加工賃」だけという点は、有償支給/無償支給とも違いはありません。結局のところ、有償支給と無償支給の違いは「コスト」ではなく、「リスクと責任をどちらが持つか」という点にあります。どちらを選ぶかは、外注先との関係性や信頼度によって変わってくると言えそうです。\u003C/p>\u003Cp style=\"text-align: start\">ちなみに、必ずしも有償支給は「信用できないから選ぶもの」というわけではありません。信頼している相手であっても、万が一のときに揉めないようにしておくための仕組みとしても活用されています。\u003C/p>\u003Cp style=\"text-align: start\">ここまでが、私が外注における有償支給/無償支給について理解した内容のまとめになります。が、私自身 経験が少なく視野・視座の狭い中で語っているため、実務の中ではまた違った見え方もあると思います。そのあたりも含めて考えていけると面白そうですね。\u003C/p>",{"id":28,"createdAt":120,"updatedAt":121,"publishedAt":120,"revisedAt":122,"cat_name":123},[171,176],{"id":172,"createdAt":173,"updatedAt":174,"publishedAt":173,"revisedAt":173,"name":175},"business-tips","2026-05-03T07:16:33.629Z","2026-05-11T11:40:15.224Z","業務知識",{"id":126,"createdAt":127,"updatedAt":128,"publishedAt":127,"revisedAt":127,"name":129},{"id":178,"createdAt":179,"updatedAt":180,"publishedAt":181,"revisedAt":180,"title":182,"abstract":183,"eyecatch":184,"toc":25,"body":187,"category":188,"tags":189},"uuid","2024-06-23T05:36:21.998Z","2026-07-05T10:26:26.423Z","2024-06-23T05:59:41.278Z","分かったようでよくわからないUUID（GUID） - なぜ重複しないの？","必ず（？）ユニークになるといわれているUUID（GUID）。でもどういった理屈で発番され、重複しないといえるのか？気になり調べてみた理解をまとめてみた。",{"url":185,"height":186,"width":50},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/7e79686b3e59477a8453802238d74295/ball-63527_1280.jpg",904,"\u003Ch2 id=\"hef725b6a43\">Introduction\u003C/h2>\u003Cp style=\"text-align: start\">難しいことを考えず手軽にユニークなIDがほしいときに利用しがちなUUID（Universally Unique Identifier）、またはGUID（Globally Unique Identifier、マイクロソフトによるUUIDの実装）。利用する側で特にルール等を設けなくても、分散環境（直接つながっていない、依存しあっていないシステム間）であっても、世界中どこでも、まず重複することがないといわれているこのUUID、でも何で重複しないのか？どういった理屈なのか？\u003C/p>\u003Cp style=\"text-align: start\">疑問を持ちつつも、まあみんなが重複しないといっているのだからよいか、とダメ思考になりがちでしたが。。。雨の休日、特にすることもないので調べてOutputしてみようと思います。\u003C/p>\u003Ch2 id=\"hf7e9ec3edc\">ざっくり結論\u003C/h2>\u003Cul>\u003Cli>UUIDはRFCで仕様が規定されていて、生成方法の違いによりいくつかのバージョンが存在する\u003C/li>\u003Cli>今日、よく使用されるUUID バージョン4は、乱数によって生成されている\u003C/li>\u003Cli>UUID バージョン4は、128bit（16進数 32桁）中、バージョンとバリアントを示すために6bit（16進数2桁）が固定されているため実質122bitの乱数である\u003C/li>\u003Cli>一様な（偏りのない）乱数が生成される前提であれば、122bitの乱数が重複する確率は極めて小さい\u003Cul>\u003Cli>毎秒1億個のUUID生成を100年間繰り返して、ようやく重複する確率が50%に達する\u003C/li>\u003C/ul>\u003C/li>\u003Cli>それ故に、現在のコンピューター環境においてはUUIDの重複はほぼ起こりえないと考えられる\u003Cul>\u003Cli>コンピューターで扱われている事象に絶対はなく、限りなく発生しない・発生させようとしたら途方もない時間がかかる状態を作り出すことによって安全性を担保している（計算量的安全性）\u003C/li>\u003Cli>UUIDの重複が絶対に発生しないと疑われるような状況になると、現在の暗号セキュリティの信頼性そのものまで疑う必要がでてくる\u003C/li>\u003C/ul>\u003C/li>\u003C/ul>\u003Ch2 id=\"h4ef0c86363\">UUIDの概要と利用用途\u003C/h2>\u003Cp style=\"text-align: start\">UUID・GUIDは、コンピューターシステム上で、オブジェクトを一意に識別するための128bitの識別子であり、16進数で下記のように表記されます。\u003C/p>\u003Cpre>\u003Ccode>66775723-f019-418c-884a-787724643d06\n\u003C/code>\u003C/pre>\u003Cp style=\"text-align: start\">そのユニーク性から、DBの主キーやユーザ識別子、トランザクション処理のIDといったアプリケーション層から、ファイルシステムやプロセス管理といったOS層まで幅広く活用されています。\u003C/p>\u003Cp style=\"text-align: start\">UUIDには生成方法の違いによっていくつかのバージョンがあります。生成ハードのMACアドレスとタイムスタンプを使用したものやハッシュ関数を使用したもの、純粋に乱数のみを使用したもの等。\u003C/p>\u003Cp style=\"text-align: start\">ここでは、今日使用頻度の高い、乱数によって生成されるバージョン4に着目していきたいと思います。\u003C/p>\u003Ch2 id=\"h4807440640\">UUID バージョン4の桁数とパターン数\u003C/h2>\u003Cp style=\"text-align: start\">UUIDバージョン4は、あらかじめ固定された6bit（バージョンとバリアントを示すため）を除く122bitで構成される乱数、すなわちランダムな数字列です。ランダムな数字列というと何だか重複しそうな気がしなくもないですよね。そこで、122bitで表現可能な数字列は一体 何パターンあるのか計算してみましょう。2進数で表現可能な数字列のパターンは、\u003C/p>\u003Cul>\u003Cli>1bit であれば、2^1 = 2パターン（0 と 1）\u003C/li>\u003Cli>2bit であれば、2^2 = 4パターン（00 と 01 と 10 と 11）\u003C/li>\u003Cli>122bit は、2^122 = 1125899906842624^2 、桁が大きすぎるので近似します。\u003Cbr>2^122 = 1125899906842624^2 ≒ (10^15)^2 = 10^30パターン\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">10^30とはいったいどんな桁でしょうか。参考までに\u003C/p>\u003Cul>\u003Cli>億：10^8\u003C/li>\u003Cli>兆：10^12\u003C/li>\u003Cli>京：10^16\u003C/li>\u003Cli>垓（がい）：10^20\u003C/li>\u003Cli>澗（かん）：10^24\u003C/li>\u003Cli>正（せい）：10^28\u003C/li>\u003Cli>溝（こう）：10^32\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">だそうです。膨大な桁のパターン数ですよね。。。このオーダーの数字が運悪く偶然重複してしまうなんて、感覚的には非常に考え辛いと思います。\u003C/p>\u003Ch2 id=\"h6857d61218\">UUID重複確率\u003C/h2>\u003Cp style=\"text-align: start\">では、感覚ではなく数学的に、実際に重複・衝突する確率はどんなものなのか、調べてみました。\u003C/p>\u003Cp style=\"text-align: start\">考え方として、n回試行するとしたとき、\u003C/p>\u003Cul>\u003Cli>1回目：衝突対象がいないので、衝突しない確率は1（100%）\u003C/li>\u003Cli>2回目：1回目と同じものがでれば衝突なので、1/パターン数の確率で衝突する、すなわち衝突しない確率は、1-(1/パターン数)\u003C/li>\u003Cli>3回目：1回目と2回目ででた2つと同じものがでれば衝突なので、2/パターン数の確率で衝突する、すなわち衝突しない確率は、1-(1/パターン数)\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">・・・\u003C/p>\u003Cul>\u003Cli>n回目：1回目からn-1回目と同じものがでれば衝突なので、(n-1)/パターン数の確率で衝突する、すなわち衝突しない確率は、1-((n-1)/パターン数)\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">となり、n回試行したときに一切衝突しない確率は、それぞれの積によって求められます。\u003C/p>\u003Cfigure>\u003Cimg src=\"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/a4a12aff57f6406f8db632eb2e7dfa17/uuid_01.jpg\" alt=\"\" width=\"939\" height=\"111\">\u003C/figure>\u003Cp style=\"text-align: start\">1回でも衝突が発生する確率はこの背反なので、\u003C/p>\u003Cfigure>\u003Cimg src=\"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/252ecde638bc492c88ae4d0aa250bcc8/uuid-02.jpg\" alt=\"\" width=\"940\" height=\"88\">\u003C/figure>\u003Cp style=\"text-align: start\">となりました。今回 パターン数は、先に述べた通り2^122なのでこうなります。\u003C/p>\u003Cp style=\"text-align: start\">これもう少し計算しやすいよう近似すると…\u003Cbr>（このあたりから大学での高等数学が苦手だった私にはついていけませんが）\u003C/p>\u003Cfigure>\u003Cimg src=\"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/e7b77876b17c4dc1b8557a2f0576740c/uuid-03.jpg\" alt=\"\" width=\"937\" height=\"73\">\u003C/figure>\u003Cp style=\"text-align: start\">P=0.01、1%の確率で衝突を発生させようとした場合、約3*10^17回の生成、つまり京を超えるオーダーの回数繰り返して初めて1%の確率で衝突するとのことでした。やっぱり途方もない数字ですね。これだけ見てもまず重複することはないだろうと思えてきます。\u003C/p>\u003Cp style=\"text-align: start\">もう少し詳しい数式の解説は、下記 参考文献参照。\u003C/p>\u003Cblockquote>\u003Cp>\u003Ca href=\"https://qiita.com/kiririmode/items/9ddf7f2aec6e8ba4dc7f\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">UUIDの衝突確率 - Qiita\u003C/a>\u003C/p>\u003C/blockquote>\u003Ch2 id=\"hcbec2bf0d9\">終わりに\u003C/h2>\u003Cp style=\"text-align: start\">UUIDバージョン4は、乱数によって構成されるため、理論上の重複が絶対に発生しないとは言えないものの、122bitの乱数の膨大な組み合わせの上に成り立っていることから、事実上 重複することが起こりえないといえるでしょう。重複確率を1%にするのでさえ京を超えるオーダーの回数試行する必要があり、別の視点でみると毎秒1億個のUUID生成を100年間繰り返して、ようやく重複する確率が50%に達するとか。\u003C/p>\u003Cp style=\"text-align: start\">ただしこれは発生させる乱数に偏りがないこと（一様であること）が前提となります。乱数に偏りがありどこかによく発生する領域があるようだと、重複は起こりやすくなってしまいます。この前提は、コンピューター上で一様な疑似乱数をいかに発生させるかという別のテーマになるので、ここでは割愛させていただきます（気が向いたらまた取り上げるかも）。\u003C/p>\u003Cp style=\"text-align: start\">現代のコンピューターシステムでは、このように理論上 絶対ではないが、現実にはまず発生しない、発生させようとしたら途方もない時間がかかる状態を作り上げることによって、「発生しない」とみなす考え方が広く取り入れられています。\u003C/p>\u003Cp style=\"text-align: start\">このような考え方は計算量的安全性と呼ばれ、現代の暗号セキュリティもこれに則り構築されています。数学的には暗号は必ず解読（復号）できる、等式の左辺（暗号化する前の平文）から右辺（暗号文）が作られている以上は、必ず右辺（暗号文）から左辺（暗号化する前の平文）は求めることができる。ただし右辺（暗号文）から左辺（暗号化する前の平文）を求めるにはtry and errorを繰り返す必要があり、そこにかかる試行回数・時間が途方もないものであるが故に、現実的は誰も解読できないという理屈で成り立っています。\u003C/p>\u003Cp style=\"text-align: start\">よって、UUIDの重複を疑い始めてしまうと、現代の暗号セキュリティも信用できなくなり、現代社会が成立しません。でも現実はそうでないですよね、故にUUIDが重複することも現実的には起こりえないということになるでしょう（かなり乱暴な論理）。\u003C/p>\u003Ch2 id=\"h7605dc6208\">参考文献\u003C/h2>\u003Cblockquote>\u003Cp>\u003Ca href=\"https://tex2e.github.io/blog/protocol/uuid-and-guid\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">UUID(GUID)とは - 晴耕雨読\u003C/a>\u003C/p>\u003C/blockquote>\u003Cp>\u003C/p>\u003Cblockquote>\u003Cp style=\"text-align: start\">\u003Ca href=\"https://qiita.com/kiririmode/items/9ddf7f2aec6e8ba4dc7f\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">UUIDの衝突確率 - Qiita\u003C/a>\u003C/p>\u003C/blockquote>\u003Cp style=\"text-align: start\">\u003C/p>\u003Cblockquote>\u003Cp style=\"text-align: start\">\u003Ca href=\"https://ja.wikipedia.org/wiki/UUID\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">UUID - Wikipedia\u003C/a>\u003C/p>\u003C/blockquote>",{"id":28,"createdAt":120,"updatedAt":121,"publishedAt":120,"revisedAt":122,"cat_name":123},[190,191],{"id":154,"createdAt":155,"updatedAt":156,"publishedAt":155,"revisedAt":155,"name":157},{"id":126,"createdAt":127,"updatedAt":128,"publishedAt":127,"revisedAt":127,"name":129},{"id":193,"createdAt":194,"updatedAt":195,"publishedAt":196,"revisedAt":195,"title":197,"abstract":198,"eyecatch":199,"toc":25,"body":202,"category":203,"tags":204},"float-on-excel","2024-04-14T14:38:19.821Z","2026-07-05T10:26:47.616Z","2024-04-14T14:46:26.381Z","分かったようでよく分からない浮動小数点演算の誤差 with Excel","Excelで小数を含む計算をした際に期待した値にならないような、現代コンピューターにおける浮動小数点演算の誤差について、自分の理解をまとめてみた。",{"url":200,"height":201,"width":50},"https://images.microcms-assets.io/assets/16526c12b52b4a198b9cd25f4e1f803e/b539b540243246969a5d927905bed684/binary.jpg",721,"\u003Ch2 id=\"hef725b6a43\">Introduction\u003C/h2>\u003Cp style=\"text-align: start\">日々の生活や仕事の中で得られたことを次に活かせるようなOutputにまとめる、とこのブログを始めたときに宣ったものの、遅々として進んでいませんね。。。なので今回は気を取り直して、最近 お目にかかった浮動小数点誤差についてまとめてみようと思います。この言葉自体、知ってはいたものの、ちゃんと理解していたわけではなく人にうまく説明もできず、浮動小数点の誤差だから仕方がないで済ませ気味の自分にそろそろ嫌気がさし。改めて調べてみましたが、やっぱり分かったようでよく分からないところも。。。\u003C/p>\u003Cp style=\"text-align: start\">というわけで、浮動小数点演算の誤差について、自分の理解内容をもとに分かる範囲で分かりやすさ優先でまとめた見ました。拙い理解のもと書いているので、数学的・情報工学的に正確でない箇所が含まれている可能性がある旨、ご了承くださいませ。\u003C/p>\u003Ch2 id=\"h82a9f2e712\">What&apos;s Happened??\u003C/h2>\u003Cp style=\"text-align: start\">ことの発端は、本業のシステム導入にてExcelからのインポート機能を使用してデータをアプリケーションに取り込もうとした際に、Excel上の値とアプリケーション上に取り込まれた値が異なるというもの。Excel上では 0.1 だったものが、アプリケーション上は 0.0999999999999999 と表示されたというもの。この時点で浮動小数点演算のあるあるだな、と察しはしました。\u003C/p>\u003Cp style=\"text-align: start\">よくある例をもとにこの問題を見てみましょう。Excel上で下記のように 1.4 - 1.3 を計算します。一見 0.1という結果が得られます。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>A\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>B\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>C\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>D\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>E\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1.4\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>-1.3\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>= A1 + B1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">↓\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>A\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>B\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>C\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>D\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>E\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1.4\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>-1.3\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">次に、D1セルに直接0.1と入力し、E1上でC1とD1の比較結果を出してみましょう。同じ0.1同士の比較なのでTRUEが期待されますが、結果はFALSE 不一致になる挙動をみせます。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>A\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>B\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>C\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>D\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>E\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1.4\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>-1.3\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>= A1 + B1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>= C1=E1\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">↓\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>A\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>B\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>C\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>D\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>E\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1.4\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>-1.3\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>FALSE\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">この挙動が、浮動小数点演算を起因としたものになります。 実はC1の演算結果はExcelの表示上は0.1になっていますが、実際には0.1ではないのです。C1セルに対して「小数点以下の表示桁数を増やす」を繰り返していくとあるタイミングで、0.0999999999999999 と表示されると思います。本当の計算結果はこれであり、0.1 は見栄えをよくしたかりそめの姿だったので。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>A\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>B\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>C\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>D\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>E\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1.4\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>-1.3\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.0999999999999999\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>FALSE\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">故に、最初に述べたようなアプリケーションに取り込んでみると0.1ではない値が表示されるという事象が発生しました。では、なぜこんなことが起きるのか。浮動小数点演算の誤差とは何者なのか？\u003C/p>\u003Cp style=\"text-align: start\">そのことをユーザにうまく説明できず、結局はアプリケーションの開発元に問い合わせして回答をもってその場をおさめるという逃げの一手にでてしまいました。情けない。\u003C/p>\u003Cp style=\"text-align: start\">ということで今回、ちゃんと調べて理解を試みました。\u003C/p>\u003Ch2 id=\"h9f58430deb\">ざっくりした結論\u003C/h2>\u003Cp style=\"text-align: start\">先に結論をざっくり書いてみます。\u003C/p>\u003Cul>\u003Cli>コンピューターは小数の扱いが得意でなく、全ての小数を正確に表現することができない\u003C/li>\u003Cli>一定の精度を保ちつつ現実的なリソースの範囲内で近似的に小数演算するための規格がIEEEによって制定され（IEEE754）、現代のコンピューターはそれに則り実装されている\u003C/li>\u003Cli>それ故にExcelを含めたコンピューター上での小数演算は近似値的な計算となり、期待した結果にならないことがある\u003C/li>\u003Cli>Excelは、表に見えている表示上の表現と、裏に持っている実際の演算結果が必ずしも一致しない、表示上は見えやすい形に丸めているから\u003C/li>\u003Cli>そのため、Excelの計算結果をアプリケーション等のプログラムに取り込むと、計算結果がExcel画面上と違って見えることがある\u003C/li>\u003C/ul>\u003Ch2 id=\"h7fbb3fb297\">2進数での小数表現方法\u003C/h2>\u003Cp style=\"text-align: start\">ご存じのとおり、現代のディジタルなコンピューター上では、数字は0と1の2進数で表現される。具体例を見てみよう。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>2進数表現\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>2進数 → 10進数変換\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>10進数表現\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>111\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^2 + 1 * 2^1 + 1 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>7\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>110\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^2 + 1 * 2^1 + 0 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>6\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>101\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^2 + 0 * 2^1 + 1 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>5\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>100\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^2 + 0 * 2^1 + 0 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>4\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>11\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^1 + 1 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>3\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>10\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^1 + 0 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>2\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>0 * 2^0\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>0 * 2^0 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.5\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1001\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^-4 + 0 * 2^-3 + 0 * 2^-2 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.5625\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1010\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>0 * 2^-4 + 1 * 2^-3 + 0 * 2^-2 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.625\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1011\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^-4 + 1 * 2^-3 + 0 * 2^-2 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.6875\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.11\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^-2 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.75\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1101\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^-4 + 1 * 2^-3 + 0 * 2^-2 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.8125\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.111\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^-3 + 1 * 2^-2 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.875\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1111\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>1 * 2^-4 + 1 * 2^-3 + 1 * 2^-2 + 1 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.9375\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">この例からわかるように整数値は10進数表現の順に（1,2,3,4,5...）2進数でも表現できるが、小数値は整数値のような綺麗な並びになっていないことがわかる。2進数で広い範囲の小数値を表現するには、小数点以下の桁数を増やして必要があるが、コンピューターのリソースには限界がある。また無限小数と呼ばれる演算結果が循環し無限の桁数をもっても2進数では表現できない10進数の小数も存在する（例えば0.1は2進数では無限の桁数を持っても表現することができず、0.1に極めて近い近似値で代用されている）。\u003C/p>\u003Cp style=\"text-align: start\">このように\u003C/p>\u003Cul>\u003Cli>広い範囲の小数値を2進数で表現するためには、小数点以下に巨大な桁数が必要になる\u003C/li>\u003Cli>無限の桁数を持っても表現しきれない小数値が存在する\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">ことが、コンピューターが小数の扱いを得意としない理由にあり、小数点演算誤差の原因の根っことなる。\u003C/p>\u003Ch2 id=\"h0f533e2ab3\">浮動小数点にかかわる誤差\u003C/h2>\u003Cp style=\"text-align: start\">上記のような2進数の小数を表現する際に、値によって桁数が変動してしまうが、これはコンピューター上では扱いにくい。そこでコンピューター上では、2進数の小数を、\u003C/p>\u003Cul>\u003Cli>符号 仮数 * 基数^指数\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">という形の指数表記する。具体的には 0.1001 であれば、\u003C/p>\u003Cul>\u003Cli>\u003Ccode>+ 1.001 * 2^-1\u003C/code>\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">のようになる。このような表現によって整数桁数・小数桁数を固定して表現できるようにしている（この例であれば整数1桁、小数3桁）。先の例にも当てはめるとこうなる。\u003C/p>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>2進数表現\u003C/p>\u003C/th>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>指数表現\u003C/p>\u003C/th>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.000 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1001\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.001 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1010\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.010 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1011\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.011 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.11\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.100 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1101\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.101 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.111\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.110 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>0.1111\u003C/p>\u003C/td>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>\u003Ccode>+ 1.111 * 2^-1\u003C/code>\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp style=\"text-align: start\">このように小数点の位置を移動させることで決められた桁数の範囲内であっても幅広い小数値を表現可能にする仕組みを\u003Cstrong>浮動小数点\u003C/strong>と呼んでいる。\u003C/p>\u003Cp style=\"text-align: start\">一方でこの表現方法にも誤差を生み出す要因が存在する。主な誤差について記載する\u003C/p>\u003Ch3 id=\"h8a5cffa269\">丸め誤差・打切り誤差\u003C/h3>\u003Cp style=\"text-align: start\">浮動小数点は、事前に桁数の範囲が決められているため、小数点の位置のスライドだけでは表現できない範囲の切り捨てが発生する。例えば次の2つの2進数小数を整数1桁、小数3桁で表現してみる。\u003C/p>\u003Cul>\u003Cli>0.00001\u003C/li>\u003Cli>0.10011\u003C/li>\u003C/ul>\u003Cp style=\"text-align: start\">1つ目の0.00001 は、小数点を5つ動かし、1.000 * 2-^5 と表現することができる。一方の0.10011は小数点以下に数字が5桁以上存在し小数点をスライドしたとしても整数1桁、小数3桁の範囲内では表現できない。結果 最下位桁の1が切り捨てられ 1.001 * 2-1 と表現せざるを得なくなる。このように、表現しきれない桁の切り捨てによって発生する計算誤差は、\u003Cstrong>丸め誤差\u003C/strong>と呼ばれる。\u003C/p>\u003Cp style=\"text-align: start\">丸め誤差に似たものとして\u003Cstrong>打切り誤差\u003C/strong>が存在する。これは無限の桁数を持っても表現しきれない無限小数について、規定された桁数まで計算したのち、後続の桁の計算を打ち切り丸めたことが発生するものである。\u003C/p>\u003Cp style=\"text-align: start\">代表的なものとして、10進数の0.1は、2進数では0.000110011001100110011001... と1001が永遠に繰り返される無限小数だが、 今回の例のように整数1桁、小数3桁内で表現しようとすると、0.0001100 → 1.100 * 2^-4 となる。この2進数を10進数に戻すと0.09375 と打ち切った分 ズレが発生していることがわかる。これが\u003Cstrong>打切り誤差\u003C/strong>である。\u003C/p>\u003Ch3 id=\"h582c113245\">情報落ち誤差・桁落ち誤差\u003C/h3>\u003Cp style=\"text-align: start\">大きな値と小さい値の加減算をする際、小さい側の値が桁数調整の結果消失し、無視されてしまう結果発生する誤差を、\u003Cstrong>情報落ち誤差\u003C/strong>呼ぶ。\u003C/p>\u003Cp style=\"text-align: start\">限りなく近い値の小数同士で引き算をした際、仮数武の有効桁数が減って情報を消失することで発生する誤差を、\u003Cstrong>桁落ち誤差\u003C/strong>と呼ぶ。\u003C/p>\u003Cp style=\"text-align: start\">具体例は。。。後々記載します。。。\u003C/p>\u003Ch2 id=\"hee4010482a\">Excelの面倒・お節介の点\u003C/h2>\u003Cp style=\"text-align: start\">このようにコンピューター上での小数、すなわち浮動小数点で表現された2進数の小数値の演算には、様々な誤差の要因が含まれるため、簡単な演算であっても、机上での結果・期待値と一致しないケースが珍しくない。最初に述べたExcel上での 1.4-1.3 がその典型例である。\u003C/p>\u003Cp style=\"text-align: start\">一方で今回、話をより複雑にした要因に、Excelの面倒かつお節介な仕様も含まれている。というのもExcelが1.4-1.3の計算結果をそのまま表示してくれていればよかった。にもかかわらず表面上は 0.1 という直感上 正しいが実際の計算結果とは一致しない値を出力したがために、見る人を混乱させた。\u003C/p>\u003Cp style=\"text-align: start\">これ自体はExcelの仕様であり、計算結果が無限小数になってしまったがために、表示上は打切りがされた結果、0.1 と出力されてしまったわけである。ただし実態としては0.1とは等しくない、0.1に限りなく近い小数値であるために、後続でおかしなことが発生していた。本当にExcelは便利なようで余計なお節介、忖度がトラブルを引き起こすことの多いツールだね。。。\u003C/p>\u003Ch2 id=\"hcbec2bf0d9\">終わりに\u003C/h2>\u003Cp style=\"text-align: start\">今回は、浮動小数点演算の誤差について、コンピューター上での小数表現方法とそれに起因する誤差についてまとめてみました。また、その誤差を忖度して表に出さないExcelの仕様について愚痴ってみました。一部分かりにくい部分や書きかけ・情報が不足している部分、誤っている・誤りを誘発しそうな部分もあると思うので、必要に応じて情報をupdateしていこうと思います。\u003C/p>\u003Cp style=\"text-align: start\">でも、こうやってまとめてみたものの。。。やっぱり分かったようでよく分からないのよね、この問題。\u003C/p>\u003Cp style=\"text-align: start\">ちなみに、Excel上での問題を回避する方法はいくつかあり、下記動画等でも解説されているので参考までに。\u003C/p>\u003Cblockquote>\u003Cp>\u003Ca href=\"https://www.youtube.com/watch?v=lwAepo3CPhY\">EXCELの計算結果が『0.099999……』みたいになる現象 - ExcelドカタCH\u003C/a>\u003C/p>\u003C/blockquote>",{"id":28,"createdAt":120,"updatedAt":121,"publishedAt":120,"revisedAt":122,"cat_name":123},[205,206,207],{"id":154,"createdAt":155,"updatedAt":156,"publishedAt":155,"revisedAt":155,"name":157},{"id":126,"createdAt":127,"updatedAt":128,"publishedAt":127,"revisedAt":127,"name":129},{"id":208,"createdAt":209,"updatedAt":209,"publishedAt":209,"revisedAt":209,"name":210},"excel","2024-04-14T14:35:30.088Z","Excel",6,{"id":126,"createdAt":127,"updatedAt":128,"publishedAt":127,"revisedAt":127,"name":129},1783257578699]