[{"data":1,"prerenderedAt":12843},["ShallowReactive",2],{"article:\u002Farticles\u002F2026\u002Fsync-local-branch-after-stack-pr-rebase":3,"related-articles:\u002Farticles\u002F2026\u002Fsync-local-branch-after-stack-pr-rebase":724,"search:articles":7013,"search:books":12094},{"id":4,"title":5,"body":6,"description":711,"extension":712,"meta":713,"navigation":588,"path":714,"publishDate":715,"published":588,"seo":716,"stem":717,"tags":718,"thumbnail":721,"updated":722,"__hash__":723},"articles\u002Farticles\u002F2026\u002Fsync-local-branch-after-stack-pr-rebase.md","GitHub上でStack PRをrebaseしたあとにローカルブランチを同期する方法",{"type":7,"value":8,"toc":691},"minimark",[9,13,21,31,34,37,53,57,60,63,67,73,76,82,99,115,121,124,127,130,136,139,143,163,166,172,175,206,210,225,234,238,256,259,272,278,281,284,315,318,322,329,332,350,356,359,362,372,376,379,393,396,402,405,408,411,462,469,472,475,541,544,548,551,558,635,638,641,644,647,673,679,687],[10,11,12],"p",{},"こんにちは、Yuriです。",[10,14,15,16,20],{},"先日、GitHub上でStack PRをrebaseしたあと、ローカルブランチからpushしようとしたところ、",[17,18,19],"code",{},"non-fast-forward"," エラーが発生しました。",[22,23,29],"pre",{"className":24,"code":26,"language":27,"meta":28},[25],"language-text","! [rejected] branch-name -> branch-name (non-fast-forward)\nerror: failed to push some refs\n","text","",[17,30,26],{"__ignoreMap":28},[10,32,33],{},"rebaseによってコミット履歴がどう変わるかは理解していたものの、その結果をローカル環境へどう反映すればよいのか分かっていませんでした。",[10,35,36],{},"今回は、GitHub上でrebase済みのブランチを正として、ローカルブランチを安全に同期する方法を整理します。",[38,39,42],"article-callout",{"title":40,"type":41},"resetする前にローカルの変更を確認する","caution",[10,43,44,45,48,49,52],{},"この記事では ",[17,46,47],{},"git reset --hard"," を使用します。",[50,51],"br",{},"未コミットの変更やローカルにしかないコミットが不要であることを確認してから実行してください。",[54,55,56],"h2",{"id":56},"rebase後にpushできなくなる理由",[10,58,59],{},"rebaseは、既存コミットの親を付け替えて履歴を並べ直す処理です。",[10,61,62],{},"コミットの変更内容が同じでも、親コミットが変わるとコミットIDも変わります。",[64,65,66],"h3",{"id":66},"rebase前",[22,68,71],{"className":69,"code":70,"language":27,"meta":28},[25],"A---B---C       親ブランチ\n     \\\n      D---E     子ブランチ\n",[17,72,70],{"__ignoreMap":28},[64,74,75],{"id":75},"rebase後",[22,77,80],{"className":78,"code":79,"language":27,"meta":28},[25],"A---B---C---D'---E'\n",[17,81,79],{"__ignoreMap":28},[10,83,84,87,88,91,92,87,95,98],{},[17,85,86],{},"D"," と ",[17,89,90],{},"D'","、",[17,93,94],{},"E",[17,96,97],{},"E'"," は変更内容がほぼ同じでも、Git上では異なるコミットです。",[10,100,101,102,87,104,106,107,109,110,87,112,114],{},"GitHub上でrebaseした場合、リモートブランチは新しい ",[17,103,90],{},[17,105,97],{}," を参照します。",[50,108],{},"一方、ローカルブランチは古い ",[17,111,86],{},[17,113,94],{}," を参照したままです。",[22,116,119],{"className":117,"code":118,"language":27,"meta":28},[25],"              D---E       ローカル\n             \u002F\nA---B---C\n             \\\n              D'---E'     リモート\n",[17,120,118],{"__ignoreMap":28},[10,122,123],{},"ローカルの履歴がリモートの直接の続きではないため、通常のpushは拒否されます。コードの内容ではなく、コミット履歴が分岐していることが原因です。",[54,125,126],{"id":126},"ローカルブランチを同期する",[10,128,129],{},"ここでは、次のブランチにいる状態で同期するものとします。",[22,131,134],{"className":132,"code":133,"language":27,"meta":28},[25],"feature\u002Fsample-docs\n",[17,135,133],{"__ignoreMap":28},[10,137,138],{},"実行時は、自分が同期したいブランチ名へ置き換えてください。",[64,140,142],{"id":141},"_1-未コミットの変更を確認する","1. 未コミットの変更を確認する",[22,144,148],{"className":145,"code":146,"language":147,"meta":28,"style":28},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git status\n","bash",[17,149,150],{"__ignoreMap":28},[151,152,155,159],"span",{"class":153,"line":154},"line",1,[151,156,158],{"class":157},"sBMFI","git",[151,160,162],{"class":161},"sfazB"," status\n",[10,164,165],{},"次のように表示されれば、作業ツリーはクリーンです。",[22,167,170],{"className":168,"code":169,"language":27,"meta":28},[25],"nothing to commit, working tree clean\n",[17,171,169],{"__ignoreMap":28},[10,173,174],{},"変更を残したい場合は、先にコミットするか、未追跡ファイルも含めてstashします。",[22,176,178],{"className":145,"code":177,"language":147,"meta":28,"style":28},"git stash push -u -m \"rebase後の同期前に一時退避\"\n",[17,179,180],{"__ignoreMap":28},[151,181,182,184,187,190,193,196,200,203],{"class":153,"line":154},[151,183,158],{"class":157},[151,185,186],{"class":161}," stash",[151,188,189],{"class":161}," push",[151,191,192],{"class":161}," -u",[151,194,195],{"class":161}," -m",[151,197,199],{"class":198},"sMK4o"," \"",[151,201,202],{"class":161},"rebase後の同期前に一時退避",[151,204,205],{"class":198},"\"\n",[64,207,209],{"id":208},"_2-リモートの最新情報を取得する","2. リモートの最新情報を取得する",[22,211,213],{"className":145,"code":212,"language":147,"meta":28,"style":28},"git fetch origin\n",[17,214,215],{"__ignoreMap":28},[151,216,217,219,222],{"class":153,"line":154},[151,218,158],{"class":157},[151,220,221],{"class":161}," fetch",[151,223,224],{"class":161}," origin\n",[10,226,227,230,231,233],{},[17,228,229],{},"fetch"," は、リモートの最新コミットとブランチ情報を取得します。",[50,232],{},"この操作だけでは、現在のローカルブランチや作業中のファイルは変更されません。",[64,235,237],{"id":236},"_3-ローカルをリモートと同じ状態にする","3. ローカルをリモートと同じ状態にする",[22,239,241],{"className":145,"code":240,"language":147,"meta":28,"style":28},"git reset --hard origin\u002Ffeature\u002Fsample-docs\n",[17,242,243],{"__ignoreMap":28},[151,244,245,247,250,253],{"class":153,"line":154},[151,246,158],{"class":157},[151,248,249],{"class":161}," reset",[151,251,252],{"class":161}," --hard",[151,254,255],{"class":161}," origin\u002Ffeature\u002Fsample-docs\n",[10,257,258],{},"このコマンドによって、次の状態がリモートブランチにそろいます。",[260,261,262,266,269],"ul",{},[263,264,265],"li",{},"現在のローカルブランチが参照するコミット",[263,267,268],{},"ステージング領域",[263,270,271],{},"Gitが追跡している作業ツリー上のファイル",[10,273,274,275,277],{},"なお、",[17,276,47],{}," だけでは未追跡ファイルは削除されません。",[54,279,280],{"id":280},"実行コマンドのまとめ",[10,282,283],{},"未コミットの変更や残したいローカルコミットがない場合は、次の流れで同期できます。",[22,285,287],{"className":145,"code":286,"language":147,"meta":28,"style":28},"git status\ngit fetch origin\ngit reset --hard origin\u002Ffeature\u002Fsample-docs\n",[17,288,289,295,304],{"__ignoreMap":28},[151,290,291,293],{"class":153,"line":154},[151,292,158],{"class":157},[151,294,162],{"class":161},[151,296,298,300,302],{"class":153,"line":297},2,[151,299,158],{"class":157},[151,301,221],{"class":161},[151,303,224],{"class":161},[151,305,307,309,311,313],{"class":153,"line":306},3,[151,308,158],{"class":157},[151,310,249],{"class":161},[151,312,252],{"class":161},[151,314,255],{"class":161},[10,316,317],{},"ブランチ名は、実際に同期するブランチへ置き換えてください。",[54,319,321],{"id":320},"git-pullを使わない理由","git pullを使わない理由",[10,323,324,325,328],{},"GitHub上のブランチはrebase後の履歴、ローカルブランチはrebase前の履歴を参照している状態で ",[17,326,327],{},"git pull"," を実行すると、Gitはそれぞれの履歴を統合しようとします。",[10,330,331],{},"実際にpullしたところ、ローカルとリモートの履歴が分岐しているため、統合方法を指定するよう求められました。",[22,333,335],{"className":145,"code":334,"language":147,"meta":28,"style":28},"git pull origin feature\u002Fsample-docs\n",[17,336,337],{"__ignoreMap":28},[151,338,339,341,344,347],{"class":153,"line":154},[151,340,158],{"class":157},[151,342,343],{"class":161}," pull",[151,345,346],{"class":161}," origin",[151,348,349],{"class":161}," feature\u002Fsample-docs\n",[22,351,354],{"className":352,"code":353,"language":27,"meta":28},[25],"hint: You have divergent branches and need to specify how to reconcile them.\nhint: You can do so by running one of the following commands sometime before\nhint: your next pull:\nhint:\nhint:   git config pull.rebase false  # merge\nhint:   git config pull.rebase true   # rebase\nhint:   git config pull.ff only       # fast-forward only\nfatal: Need to specify how to reconcile divergent branches.\n",[17,355,353],{"__ignoreMap":28},[10,357,358],{},"Gitは、分岐した履歴をmergeするのか、rebaseするのか、fast-forwardだけを許可するのかを自動では判断できません。",[10,360,361],{},"GitHub上で完了したrebase結果を正とするのであれば、古いローカル履歴を統合する必要はありません。",[10,363,364,365,367,368,371],{},"そのため、",[17,366,229],{}," でリモートの状態を取得し、内容を確認してから ",[17,369,370],{},"reset --hard"," でローカルを合わせる方法が明確です。",[54,373,375],{"id":374},"force-pushを使わない理由","force pushを使わない理由",[10,377,378],{},"GitHub上でrebaseした直後に古いローカルブランチからforce pushすると、GitHubが作った新しい履歴を古い履歴で上書きする可能性があります。",[22,380,382],{"className":145,"code":381,"language":147,"meta":28,"style":28},"git push --force\n",[17,383,384],{"__ignoreMap":28},[151,385,386,388,390],{"class":153,"line":154},[151,387,158],{"class":157},[151,389,189],{"class":161},[151,391,392],{"class":161}," --force\n",[10,394,395],{},"この場面で必要なのは、リモートをローカルへ合わせることではなく、ローカルをrebase済みのリモートへ合わせることです。",[22,397,400],{"className":398,"code":399,"language":27,"meta":28},[25],"避けたい操作:\n古いローカル履歴 → リモートへforce push\n\n行いたい操作:\nrebase済みリモート履歴 → ローカルへ反映\n",[17,401,399],{"__ignoreMap":28},[54,403,404],{"id":404},"ローカルの変更を残したい場合",[64,406,407],{"id":407},"未コミットの変更がある場合",[10,409,410],{},"未コミットの変更は、同期前にstashできます。",[22,412,414],{"className":145,"code":413,"language":147,"meta":28,"style":28},"git stash push -u -m \"rebase後の同期前に一時退避\"\ngit fetch origin\ngit reset --hard origin\u002Ffeature\u002Fsample-docs\ngit stash pop\n",[17,415,416,434,442,452],{"__ignoreMap":28},[151,417,418,420,422,424,426,428,430,432],{"class":153,"line":154},[151,419,158],{"class":157},[151,421,186],{"class":161},[151,423,189],{"class":161},[151,425,192],{"class":161},[151,427,195],{"class":161},[151,429,199],{"class":198},[151,431,202],{"class":161},[151,433,205],{"class":198},[151,435,436,438,440],{"class":153,"line":297},[151,437,158],{"class":157},[151,439,221],{"class":161},[151,441,224],{"class":161},[151,443,444,446,448,450],{"class":153,"line":306},[151,445,158],{"class":157},[151,447,249],{"class":161},[151,449,252],{"class":161},[151,451,255],{"class":161},[151,453,455,457,459],{"class":153,"line":454},4,[151,456,158],{"class":157},[151,458,186],{"class":161},[151,460,461],{"class":161}," pop\n",[10,463,464,465,468],{},"ただし、rebase後のコードと変更箇所が重なっていると、",[17,466,467],{},"stash pop"," 時にコンフリクトする可能性があります。",[64,470,471],{"id":471},"未pushのコミットがある場合",[10,473,474],{},"ローカルに必要なコミットがある場合は、コミットIDを控えるか、退避用ブランチを作ってから同期します。その後、必要なコミットをcherry-pickします。",[22,476,478],{"className":145,"code":477,"language":147,"meta":28,"style":28},"git fetch origin\ngit log --oneline origin\u002Ffeature\u002Fsample-docs..HEAD\ngit branch backup\u002Fsample-docs-before-sync\ngit reset --hard origin\u002Ffeature\u002Fsample-docs\ngit cherry-pick \u003C残したいコミットID>\n",[17,479,480,488,501,511,521],{"__ignoreMap":28},[151,481,482,484,486],{"class":153,"line":154},[151,483,158],{"class":157},[151,485,221],{"class":161},[151,487,224],{"class":161},[151,489,490,492,495,498],{"class":153,"line":297},[151,491,158],{"class":157},[151,493,494],{"class":161}," log",[151,496,497],{"class":161}," --oneline",[151,499,500],{"class":161}," origin\u002Ffeature\u002Fsample-docs..HEAD\n",[151,502,503,505,508],{"class":153,"line":306},[151,504,158],{"class":157},[151,506,507],{"class":161}," branch",[151,509,510],{"class":161}," backup\u002Fsample-docs-before-sync\n",[151,512,513,515,517,519],{"class":153,"line":454},[151,514,158],{"class":157},[151,516,249],{"class":161},[151,518,252],{"class":161},[151,520,255],{"class":161},[151,522,524,526,529,532,535,538],{"class":153,"line":523},5,[151,525,158],{"class":157},[151,527,528],{"class":161}," cherry-pick",[151,530,531],{"class":198}," \u003C",[151,533,534],{"class":161},"残したいコミットI",[151,536,86],{"class":537},"sTEyZ",[151,539,540],{"class":198},">\n",[10,542,543],{},"cherry-pickでも、rebase後の変更と重なっている場合はコンフリクトの解消が必要です。",[54,545,547],{"id":546},"複数のstackブランチを同期する場合","複数のStackブランチを同期する場合",[10,549,550],{},"GitHubのStack rebaseでは、Stack内の複数ブランチが更新されます。",[10,552,553,554,557],{},"ローカルでも複数の子ブランチを使い続ける場合は、",[17,555,556],{},"git fetch origin"," を実行したあと、それぞれを対応するリモートブランチへ同期します。",[22,559,561],{"className":145,"code":560,"language":147,"meta":28,"style":28},"git switch feature\u002Fsample-api\ngit reset --hard origin\u002Ffeature\u002Fsample-api\n\ngit switch feature\u002Fsample-ui\ngit reset --hard origin\u002Ffeature\u002Fsample-ui\n\ngit switch feature\u002Fsample-docs\ngit reset --hard origin\u002Ffeature\u002Fsample-docs\n",[17,562,563,573,584,590,599,610,615,624],{"__ignoreMap":28},[151,564,565,567,570],{"class":153,"line":154},[151,566,158],{"class":157},[151,568,569],{"class":161}," switch",[151,571,572],{"class":161}," feature\u002Fsample-api\n",[151,574,575,577,579,581],{"class":153,"line":297},[151,576,158],{"class":157},[151,578,249],{"class":161},[151,580,252],{"class":161},[151,582,583],{"class":161}," origin\u002Ffeature\u002Fsample-api\n",[151,585,586],{"class":153,"line":306},[151,587,589],{"emptyLinePlaceholder":588},true,"\n",[151,591,592,594,596],{"class":153,"line":454},[151,593,158],{"class":157},[151,595,569],{"class":161},[151,597,598],{"class":161}," feature\u002Fsample-ui\n",[151,600,601,603,605,607],{"class":153,"line":523},[151,602,158],{"class":157},[151,604,249],{"class":161},[151,606,252],{"class":161},[151,608,609],{"class":161}," origin\u002Ffeature\u002Fsample-ui\n",[151,611,613],{"class":153,"line":612},6,[151,614,589],{"emptyLinePlaceholder":588},[151,616,618,620,622],{"class":153,"line":617},7,[151,619,158],{"class":157},[151,621,569],{"class":161},[151,623,349],{"class":161},[151,625,627,629,631,633],{"class":153,"line":626},8,[151,628,158],{"class":157},[151,630,249],{"class":161},[151,632,252],{"class":161},[151,634,255],{"class":161},[10,636,637],{},"作業を続ける最上位ブランチしか使わない場合は、ひとまずそのブランチだけ同期すれば作業を再開できます。あとから途中のブランチへ戻る場合は、その時点で同期が必要です。",[54,639,640],{"id":640},"まとめ",[10,642,643],{},"GitHub上でStack PRをrebaseすると、リモート側のコミットIDが作り直されます。そのため、古い履歴を参照しているローカルブランチから通常のpushはできなくなります。",[10,645,646],{},"同期するときの基本方針は次のとおりです。",[648,649,650,656,659,664,670],"ol",{},[263,651,652,655],{},[17,653,654],{},"git status"," で未コミットの変更を確認する",[263,657,658],{},"必要であればstashや退避用ブランチを作る",[263,660,661,663],{},[17,662,556],{}," でrebase後の履歴を取得する",[263,665,666,669],{},[17,667,668],{},"git reset --hard origin\u002F\u003Cブランチ名>"," で同期する",[263,671,672],{},"古いローカル履歴からforce pushしない",[10,674,675,676,678],{},"rebase後にpushできなくなるのは異常ではありません。",[50,677],{},"GitHubとローカルが異なるコミット履歴を参照しているために起きる、Gitとして正常な挙動です。",[10,680,681,682,686],{},"今回の経験を通して、rebaseによる履歴の変化だけでなく、",[683,684,685],"strong",{},"どちらの履歴を正として、どちらを合わせるのか"," を判断することが大切だと学びました。",[688,689,690],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":28,"searchDepth":297,"depth":297,"links":692},[693,697,702,703,704,705,709,710],{"id":56,"depth":297,"text":56,"children":694},[695,696],{"id":66,"depth":306,"text":66},{"id":75,"depth":306,"text":75},{"id":126,"depth":297,"text":126,"children":698},[699,700,701],{"id":141,"depth":306,"text":142},{"id":208,"depth":306,"text":209},{"id":236,"depth":306,"text":237},{"id":280,"depth":297,"text":280},{"id":320,"depth":297,"text":321},{"id":374,"depth":297,"text":375},{"id":404,"depth":297,"text":404,"children":706},[707,708],{"id":407,"depth":306,"text":407},{"id":471,"depth":306,"text":471},{"id":546,"depth":297,"text":547},{"id":640,"depth":297,"text":640},"GitHub上でStack PRをrebaseしたあと、古いコミット履歴が残るローカルブランチをrebase済みのリモートブランチへ安全に同期する手順を紹介します。","md",{},"\u002Farticles\u002F2026\u002Fsync-local-branch-after-stack-pr-rebase","2026-08-27",{"title":5,"description":711},"articles\u002F2026\u002Fsync-local-branch-after-stack-pr-rebase",[719,720],"Git","GitHub","\u002Fimages\u002Farticles\u002Fsync-local-branch-after-stack-pr-rebase.png","2026-08-29","dBjHJRNGHtkl1XTP0Qbhr3-DHoHrffQddWseIgn7_s0",[725,1249,1876,3152,4793,5283,5770,6198,6589],{"id":4,"title":5,"body":726,"description":711,"extension":712,"meta":1246,"navigation":588,"path":714,"publishDate":715,"published":588,"seo":1247,"stem":717,"tags":1248,"thumbnail":721,"updated":722,"__hash__":723},{"type":7,"value":727,"toc":1226},[728,730,734,739,741,743,751,753,755,757,759,764,766,771,781,793,798,800,802,804,809,811,813,823,825,830,832,854,856,868,874,876,890,892,900,904,906,908,936,938,940,944,946,960,965,967,969,975,977,979,991,993,998,1000,1002,1004,1052,1056,1058,1060,1114,1116,1118,1120,1124,1190,1192,1194,1196,1198,1216,1220,1224],[10,729,12],{},[10,731,15,732,20],{},[17,733,19],{},[22,735,737],{"className":736,"code":26,"language":27,"meta":28},[25],[17,738,26],{"__ignoreMap":28},[10,740,33],{},[10,742,36],{},[38,744,745],{"title":40,"type":41},[10,746,44,747,48,749,52],{},[17,748,47],{},[50,750],{},[54,752,56],{"id":56},[10,754,59],{},[10,756,62],{},[64,758,66],{"id":66},[22,760,762],{"className":761,"code":70,"language":27,"meta":28},[25],[17,763,70],{"__ignoreMap":28},[64,765,75],{"id":75},[22,767,769],{"className":768,"code":79,"language":27,"meta":28},[25],[17,770,79],{"__ignoreMap":28},[10,772,773,87,775,91,777,87,779,98],{},[17,774,86],{},[17,776,90],{},[17,778,94],{},[17,780,97],{},[10,782,101,783,87,785,106,787,109,789,87,791,114],{},[17,784,90],{},[17,786,97],{},[50,788],{},[17,790,86],{},[17,792,94],{},[22,794,796],{"className":795,"code":118,"language":27,"meta":28},[25],[17,797,118],{"__ignoreMap":28},[10,799,123],{},[54,801,126],{"id":126},[10,803,129],{},[22,805,807],{"className":806,"code":133,"language":27,"meta":28},[25],[17,808,133],{"__ignoreMap":28},[10,810,138],{},[64,812,142],{"id":141},[22,814,815],{"className":145,"code":146,"language":147,"meta":28,"style":28},[17,816,817],{"__ignoreMap":28},[151,818,819,821],{"class":153,"line":154},[151,820,158],{"class":157},[151,822,162],{"class":161},[10,824,165],{},[22,826,828],{"className":827,"code":169,"language":27,"meta":28},[25],[17,829,169],{"__ignoreMap":28},[10,831,174],{},[22,833,834],{"className":145,"code":177,"language":147,"meta":28,"style":28},[17,835,836],{"__ignoreMap":28},[151,837,838,840,842,844,846,848,850,852],{"class":153,"line":154},[151,839,158],{"class":157},[151,841,186],{"class":161},[151,843,189],{"class":161},[151,845,192],{"class":161},[151,847,195],{"class":161},[151,849,199],{"class":198},[151,851,202],{"class":161},[151,853,205],{"class":198},[64,855,209],{"id":208},[22,857,858],{"className":145,"code":212,"language":147,"meta":28,"style":28},[17,859,860],{"__ignoreMap":28},[151,861,862,864,866],{"class":153,"line":154},[151,863,158],{"class":157},[151,865,221],{"class":161},[151,867,224],{"class":161},[10,869,870,230,872,233],{},[17,871,229],{},[50,873],{},[64,875,237],{"id":236},[22,877,878],{"className":145,"code":240,"language":147,"meta":28,"style":28},[17,879,880],{"__ignoreMap":28},[151,881,882,884,886,888],{"class":153,"line":154},[151,883,158],{"class":157},[151,885,249],{"class":161},[151,887,252],{"class":161},[151,889,255],{"class":161},[10,891,258],{},[260,893,894,896,898],{},[263,895,265],{},[263,897,268],{},[263,899,271],{},[10,901,274,902,277],{},[17,903,47],{},[54,905,280],{"id":280},[10,907,283],{},[22,909,910],{"className":145,"code":286,"language":147,"meta":28,"style":28},[17,911,912,918,926],{"__ignoreMap":28},[151,913,914,916],{"class":153,"line":154},[151,915,158],{"class":157},[151,917,162],{"class":161},[151,919,920,922,924],{"class":153,"line":297},[151,921,158],{"class":157},[151,923,221],{"class":161},[151,925,224],{"class":161},[151,927,928,930,932,934],{"class":153,"line":306},[151,929,158],{"class":157},[151,931,249],{"class":161},[151,933,252],{"class":161},[151,935,255],{"class":161},[10,937,317],{},[54,939,321],{"id":320},[10,941,324,942,328],{},[17,943,327],{},[10,945,331],{},[22,947,948],{"className":145,"code":334,"language":147,"meta":28,"style":28},[17,949,950],{"__ignoreMap":28},[151,951,952,954,956,958],{"class":153,"line":154},[151,953,158],{"class":157},[151,955,343],{"class":161},[151,957,346],{"class":161},[151,959,349],{"class":161},[22,961,963],{"className":962,"code":353,"language":27,"meta":28},[25],[17,964,353],{"__ignoreMap":28},[10,966,358],{},[10,968,361],{},[10,970,364,971,367,973,371],{},[17,972,229],{},[17,974,370],{},[54,976,375],{"id":374},[10,978,378],{},[22,980,981],{"className":145,"code":381,"language":147,"meta":28,"style":28},[17,982,983],{"__ignoreMap":28},[151,984,985,987,989],{"class":153,"line":154},[151,986,158],{"class":157},[151,988,189],{"class":161},[151,990,392],{"class":161},[10,992,395],{},[22,994,996],{"className":995,"code":399,"language":27,"meta":28},[25],[17,997,399],{"__ignoreMap":28},[54,999,404],{"id":404},[64,1001,407],{"id":407},[10,1003,410],{},[22,1005,1006],{"className":145,"code":413,"language":147,"meta":28,"style":28},[17,1007,1008,1026,1034,1044],{"__ignoreMap":28},[151,1009,1010,1012,1014,1016,1018,1020,1022,1024],{"class":153,"line":154},[151,1011,158],{"class":157},[151,1013,186],{"class":161},[151,1015,189],{"class":161},[151,1017,192],{"class":161},[151,1019,195],{"class":161},[151,1021,199],{"class":198},[151,1023,202],{"class":161},[151,1025,205],{"class":198},[151,1027,1028,1030,1032],{"class":153,"line":297},[151,1029,158],{"class":157},[151,1031,221],{"class":161},[151,1033,224],{"class":161},[151,1035,1036,1038,1040,1042],{"class":153,"line":306},[151,1037,158],{"class":157},[151,1039,249],{"class":161},[151,1041,252],{"class":161},[151,1043,255],{"class":161},[151,1045,1046,1048,1050],{"class":153,"line":454},[151,1047,158],{"class":157},[151,1049,186],{"class":161},[151,1051,461],{"class":161},[10,1053,464,1054,468],{},[17,1055,467],{},[64,1057,471],{"id":471},[10,1059,474],{},[22,1061,1062],{"className":145,"code":477,"language":147,"meta":28,"style":28},[17,1063,1064,1072,1082,1090,1100],{"__ignoreMap":28},[151,1065,1066,1068,1070],{"class":153,"line":154},[151,1067,158],{"class":157},[151,1069,221],{"class":161},[151,1071,224],{"class":161},[151,1073,1074,1076,1078,1080],{"class":153,"line":297},[151,1075,158],{"class":157},[151,1077,494],{"class":161},[151,1079,497],{"class":161},[151,1081,500],{"class":161},[151,1083,1084,1086,1088],{"class":153,"line":306},[151,1085,158],{"class":157},[151,1087,507],{"class":161},[151,1089,510],{"class":161},[151,1091,1092,1094,1096,1098],{"class":153,"line":454},[151,1093,158],{"class":157},[151,1095,249],{"class":161},[151,1097,252],{"class":161},[151,1099,255],{"class":161},[151,1101,1102,1104,1106,1108,1110,1112],{"class":153,"line":523},[151,1103,158],{"class":157},[151,1105,528],{"class":161},[151,1107,531],{"class":198},[151,1109,534],{"class":161},[151,1111,86],{"class":537},[151,1113,540],{"class":198},[10,1115,543],{},[54,1117,547],{"id":546},[10,1119,550],{},[10,1121,553,1122,557],{},[17,1123,556],{},[22,1125,1126],{"className":145,"code":560,"language":147,"meta":28,"style":28},[17,1127,1128,1136,1146,1150,1158,1168,1172,1180],{"__ignoreMap":28},[151,1129,1130,1132,1134],{"class":153,"line":154},[151,1131,158],{"class":157},[151,1133,569],{"class":161},[151,1135,572],{"class":161},[151,1137,1138,1140,1142,1144],{"class":153,"line":297},[151,1139,158],{"class":157},[151,1141,249],{"class":161},[151,1143,252],{"class":161},[151,1145,583],{"class":161},[151,1147,1148],{"class":153,"line":306},[151,1149,589],{"emptyLinePlaceholder":588},[151,1151,1152,1154,1156],{"class":153,"line":454},[151,1153,158],{"class":157},[151,1155,569],{"class":161},[151,1157,598],{"class":161},[151,1159,1160,1162,1164,1166],{"class":153,"line":523},[151,1161,158],{"class":157},[151,1163,249],{"class":161},[151,1165,252],{"class":161},[151,1167,609],{"class":161},[151,1169,1170],{"class":153,"line":612},[151,1171,589],{"emptyLinePlaceholder":588},[151,1173,1174,1176,1178],{"class":153,"line":617},[151,1175,158],{"class":157},[151,1177,569],{"class":161},[151,1179,349],{"class":161},[151,1181,1182,1184,1186,1188],{"class":153,"line":626},[151,1183,158],{"class":157},[151,1185,249],{"class":161},[151,1187,252],{"class":161},[151,1189,255],{"class":161},[10,1191,637],{},[54,1193,640],{"id":640},[10,1195,643],{},[10,1197,646],{},[648,1199,1200,1204,1206,1210,1214],{},[263,1201,1202,655],{},[17,1203,654],{},[263,1205,658],{},[263,1207,1208,663],{},[17,1209,556],{},[263,1211,1212,669],{},[17,1213,668],{},[263,1215,672],{},[10,1217,675,1218,678],{},[50,1219],{},[10,1221,681,1222,686],{},[683,1223,685],{},[688,1225,690],{},{"title":28,"searchDepth":297,"depth":297,"links":1227},[1228,1232,1237,1238,1239,1240,1244,1245],{"id":56,"depth":297,"text":56,"children":1229},[1230,1231],{"id":66,"depth":306,"text":66},{"id":75,"depth":306,"text":75},{"id":126,"depth":297,"text":126,"children":1233},[1234,1235,1236],{"id":141,"depth":306,"text":142},{"id":208,"depth":306,"text":209},{"id":236,"depth":306,"text":237},{"id":280,"depth":297,"text":280},{"id":320,"depth":297,"text":321},{"id":374,"depth":297,"text":375},{"id":404,"depth":297,"text":404,"children":1241},[1242,1243],{"id":407,"depth":306,"text":407},{"id":471,"depth":306,"text":471},{"id":546,"depth":297,"text":547},{"id":640,"depth":297,"text":640},{},{"title":5,"description":711},[719,720],{"id":1250,"title":1251,"body":1252,"description":1865,"extension":712,"meta":1866,"navigation":588,"path":1867,"publishDate":1868,"published":588,"seo":1869,"stem":1870,"tags":1871,"thumbnail":1874,"updated":1868,"__hash__":1875},"articles\u002Farticles\u002F2026\u002Fresolve-mac-system-data-storage-shortage-with-docker.md","Macの「システムデータ」が267GBに増えた原因はDockerだった",{"type":7,"value":1253,"toc":1855},[1254,1256,1263,1266,1273,1276,1282,1286,1289,1295,1298,1304,1307,1310,1313,1351,1360,1367,1373,1379,1407,1414,1420,1426,1454,1457,1463,1466,1469,1473,1476,1492,1495,1501,1504,1549,1555,1559,1562,1580,1586,1589,1595,1598,1602,1605,1617,1620,1635,1638,1644,1651,1655,1658,1675,1678,1684,1687,1690,1701,1710,1713,1719,1722,1736,1739,1742,1745,1788,1791,1798,1800,1803,1831,1834,1837,1849,1852],[10,1255,12],{},[10,1257,1258,1259,1262],{},"Xcodeをインストールしてアプリ開発するため、一応MacBookのストレージを確認したところ、「システムデータ」が ",[683,1260,1261],{},"267GB"," まで増えていました、、",[10,1264,1265],{},"システムデータはmacOSがまとめて表示している領域で、ストレージ設定を見ただけでは、何に容量を使っているのか全然分かりませんでした。",[10,1267,1268,1269,1272],{},"そこでターミナルから使用量を調べた結果、主な原因は ",[683,1270,1271],{},"Docker Desktopのデータ"," でした。",[10,1274,1275],{},"今回は、原因を特定した手順と、DockerのBuild Cache、Image、Volumeを整理して空き容量を増やした方法を紹介します。",[38,1277,1279],{"title":1278,"type":41},"削除前に必要なデータを確認する",[10,1280,1281],{},"この記事にはDockerのデータを削除するコマンドが登場します。必要なImageやVolumeまで削除しないよう、各コマンドの対象を確認し、DBなどの重要なデータは事前にバックアップしてください。",[54,1283,1285],{"id":1284},"macのストレージ状況を確認する","Macのストレージ状況を確認する",[10,1287,1288],{},"macOSでは、次の順番でストレージの使用状況を確認できます。",[22,1290,1293],{"className":1291,"code":1292,"language":27,"meta":28},[25],"メニュー\n  ↓\nシステム設定\n  ↓\n一般\n  ↓\nストレージ\n",[17,1294,1292],{"__ignoreMap":28},[10,1296,1297],{},"今回確認したときは、システムデータだけで267GBを使用していました。",[22,1299,1302],{"className":1300,"code":1301,"language":27,"meta":28},[25],"システムデータ  267GB\n",[17,1303,1301],{"__ignoreMap":28},[10,1305,1306],{},"通常のファイル整理だけでは解消できそうになかったため、どのディレクトリが容量を使っているのか調べました。",[54,1308,1309],{"id":1309},"容量を使っているディレクトリを調べる",[10,1311,1312],{},"まず、ホームディレクトリ直下の使用量を確認します。",[22,1314,1316],{"className":145,"code":1315,"language":147,"meta":28,"style":28},"du -h -d 1 ~ 2>\u002Fdev\u002Fnull | sort -h\n",[17,1317,1318],{"__ignoreMap":28},[151,1319,1320,1323,1326,1329,1333,1336,1339,1342,1345,1348],{"class":153,"line":154},[151,1321,1322],{"class":157},"du",[151,1324,1325],{"class":161}," -h",[151,1327,1328],{"class":161}," -d",[151,1330,1332],{"class":1331},"sbssI"," 1",[151,1334,1335],{"class":161}," ~",[151,1337,1338],{"class":198}," 2>",[151,1340,1341],{"class":161},"\u002Fdev\u002Fnull",[151,1343,1344],{"class":198}," |",[151,1346,1347],{"class":157}," sort",[151,1349,1350],{"class":161}," -h\n",[10,1352,1353,1355,1356,1359],{},[17,1354,1322],{}," はディレクトリごとの使用量を表示するコマンドです。",[17,1357,1358],{},"-d 1"," を指定すると、1階層下までを集計できます。",[10,1361,1362,1363,1366],{},"結果を見ると、",[17,1364,1365],{},"~\u002FLibrary"," が約254GBを占めていました。",[22,1368,1371],{"className":1369,"code":1370,"language":27,"meta":28},[25],"254G  \u002FUsers\u002Fxxxxx\u002FLibrary\n",[17,1372,1370],{"__ignoreMap":28},[10,1374,1375,1376,1378],{},"次に、",[17,1377,1365],{}," の内訳を確認します。",[22,1380,1382],{"className":145,"code":1381,"language":147,"meta":28,"style":28},"du -h -d 1 ~\u002FLibrary 2>\u002Fdev\u002Fnull | sort -h\n",[17,1383,1384],{"__ignoreMap":28},[151,1385,1386,1388,1390,1392,1394,1397,1399,1401,1403,1405],{"class":153,"line":154},[151,1387,1322],{"class":157},[151,1389,1325],{"class":161},[151,1391,1328],{"class":161},[151,1393,1332],{"class":1331},[151,1395,1396],{"class":161}," ~\u002FLibrary",[151,1398,1338],{"class":198},[151,1400,1341],{"class":161},[151,1402,1344],{"class":198},[151,1404,1347],{"class":157},[151,1406,1350],{"class":161},[10,1408,1409,1410,1413],{},"ここでは、",[17,1411,1412],{},"Containers"," が約210GBを使用していました。",[22,1415,1418],{"className":1416,"code":1417,"language":27,"meta":28},[25],"210G  \u002FUsers\u002Fxxxxx\u002FLibrary\u002FContainers\n",[17,1419,1417],{"__ignoreMap":28},[10,1421,1422,1423,1425],{},"さらに、",[17,1424,1412],{}," の中を調べます。",[22,1427,1429],{"className":145,"code":1428,"language":147,"meta":28,"style":28},"du -h -d 1 ~\u002FLibrary\u002FContainers 2>\u002Fdev\u002Fnull | sort -h\n",[17,1430,1431],{"__ignoreMap":28},[151,1432,1433,1435,1437,1439,1441,1444,1446,1448,1450,1452],{"class":153,"line":154},[151,1434,1322],{"class":157},[151,1436,1325],{"class":161},[151,1438,1328],{"class":161},[151,1440,1332],{"class":1331},[151,1442,1443],{"class":161}," ~\u002FLibrary\u002FContainers",[151,1445,1338],{"class":198},[151,1447,1341],{"class":161},[151,1449,1344],{"class":198},[151,1451,1347],{"class":157},[151,1453,1350],{"class":161},[10,1455,1456],{},"すると、Docker Desktopのコンテナーディレクトリが約210GBを占めていることが分かりました。",[22,1458,1461],{"className":1459,"code":1460,"language":27,"meta":28},[25],"210G  \u002FUsers\u002Fxxxxx\u002FLibrary\u002FContainers\u002Fcom.docker.docker\n",[17,1462,1460],{"__ignoreMap":28},[10,1464,1465],{},"macOS版のDocker Desktopは、Linuxコンテナーを動かすための仮想ディスクをMac上に保存しています。",[10,1467,1468],{},"そのためDockerのImage、Volume、Build Cacheなどが増えると、macOSではシステムデータとして大きく表示されることがあります。",[54,1470,1472],{"id":1471},"dockerの使用量を確認する","Dockerの使用量を確認する",[10,1474,1475],{},"Docker側の内訳は、次のコマンドで確認できます。",[22,1477,1479],{"className":145,"code":1478,"language":147,"meta":28,"style":28},"docker system df\n",[17,1480,1481],{"__ignoreMap":28},[151,1482,1483,1486,1489],{"class":153,"line":154},[151,1484,1485],{"class":157},"docker",[151,1487,1488],{"class":161}," system",[151,1490,1491],{"class":161}," df\n",[10,1493,1494],{},"今回の主な結果は次のとおりでした。",[22,1496,1499],{"className":1497,"code":1498,"language":27,"meta":28},[25],"TYPE            TOTAL     SIZE\nImages          20        107.6GB\nContainers      12        526MB\nLocal Volumes   46        100.2GB\nBuild Cache     196       73GB\n",[17,1500,1498],{"__ignoreMap":28},[10,1502,1503],{},"特に容量が大きかったのは、次の3項目です。",[1505,1506,1507,1521],"table",{},[1508,1509,1510],"thead",{},[1511,1512,1513,1517],"tr",{},[1514,1515,1516],"th",{},"項目",[1514,1518,1520],{"align":1519},"right","容量",[1522,1523,1524,1533,1541],"tbody",{},[1511,1525,1526,1530],{},[1527,1528,1529],"td",{},"Images",[1527,1531,1532],{"align":1519},"107.6GB",[1511,1534,1535,1538],{},[1527,1536,1537],{},"Local Volumes",[1527,1539,1540],{"align":1519},"100.2GB",[1511,1542,1543,1546],{},[1527,1544,1545],{},"Build Cache",[1527,1547,1548],{"align":1519},"73GB",[10,1550,1551,1554],{},[17,1552,1553],{},"docker system df"," の数値には共有レイヤーなども含まれるため、表示された値の合計が、そのままMac上で解放できる容量になるとは限りません。ただし、どの種類のデータから調べるべきかを判断する目安になります。",[54,1556,1558],{"id":1557},"build-cacheを削除する","Build Cacheを削除する",[10,1560,1561],{},"まず、最も整理しやすいBuild Cacheを削除しました。",[22,1563,1565],{"className":145,"code":1564,"language":147,"meta":28,"style":28},"docker builder prune -a\n",[17,1566,1567],{"__ignoreMap":28},[151,1568,1569,1571,1574,1577],{"class":153,"line":154},[151,1570,1485],{"class":157},[151,1572,1573],{"class":161}," builder",[151,1575,1576],{"class":161}," prune",[151,1578,1579],{"class":161}," -a\n",[10,1581,1582,1585],{},[17,1583,1584],{},"-a"," を付けると、現在使われていないBuild Cacheがまとめて削除されます。実行前には削除対象と確認メッセージが表示されます。",[10,1587,1588],{},"今回、Build Cacheは73GBから0Bになりました。",[22,1590,1593],{"className":1591,"code":1592,"language":27,"meta":28},[25],"73GB → 0B\n",[17,1594,1592],{"__ignoreMap":28},[10,1596,1597],{},"Build CacheはDocker Imageをビルドするときに再利用される中間データです。削除しても必要に応じて再生成されますが、次回のビルドには時間がかかる場合があります。",[54,1599,1601],{"id":1600},"不要なimageを整理する","不要なImageを整理する",[10,1603,1604],{},"次に、保存されているImageを確認しました。",[22,1606,1608],{"className":145,"code":1607,"language":147,"meta":28,"style":28},"docker images\n",[17,1609,1610],{"__ignoreMap":28},[151,1611,1612,1614],{"class":153,"line":154},[151,1613,1485],{"class":157},[151,1615,1616],{"class":161}," images\n",[10,1618,1619],{},"まずは、タグがなく、コンテナーから参照されていないdangling imageを削除します。",[22,1621,1623],{"className":145,"code":1622,"language":147,"meta":28,"style":28},"docker image prune\n",[17,1624,1625],{"__ignoreMap":28},[151,1626,1627,1629,1632],{"class":153,"line":154},[151,1628,1485],{"class":157},[151,1630,1631],{"class":161}," image",[151,1633,1634],{"class":161}," prune\n",[10,1636,1637],{},"今回の削除量は約2.4GBでした。",[22,1639,1642],{"className":1640,"code":1641,"language":27,"meta":28},[25],"Total reclaimed space: 2.355GB\n",[17,1643,1641],{"__ignoreMap":28},[10,1645,1646,1647,1650],{},"すべての未使用Imageを対象にする ",[17,1648,1649],{},"docker image prune -a"," もありますが、次回の起動時に再取得が必要になるImageまで削除されます。今回は一覧を確認しながら、必要なImageを残して整理しました。",[54,1652,1654],{"id":1653},"大きなvolumeの中身を調べる","大きなVolumeの中身を調べる",[10,1656,1657],{},"Volumeごとの詳しい使用量は、次のコマンドで確認できます。",[22,1659,1661],{"className":145,"code":1660,"language":147,"meta":28,"style":28},"docker system df -v\n",[17,1662,1663],{"__ignoreMap":28},[151,1664,1665,1667,1669,1672],{"class":153,"line":154},[151,1666,1485],{"class":157},[151,1668,1488],{"class":161},[151,1670,1671],{"class":161}," df",[151,1673,1674],{"class":161}," -v\n",[10,1676,1677],{},"確認したところ、開発用DBのデータを保存しているVolumeが84.28GBを使用していました。",[22,1679,1682],{"className":1680,"code":1681,"language":27,"meta":28},[25],"xxxxxx_db-store  84.28GB\n",[17,1683,1681],{"__ignoreMap":28},[10,1685,1686],{},"このVolumeは現在利用しているプロジェクトのDBだったため、Volume自体は削除できません。そこで、DBの中に残っている不要な開発用スキーマを確認し、必要なデータではないことを確かめてから削除しました。",[10,1688,1689],{},"MySQLでは、次のSQLでスキーマを削除できます。",[22,1691,1695],{"className":1692,"code":1693,"language":1694,"meta":28,"style":28},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","DROP SCHEMA schema_name;\n","sql",[17,1696,1697],{"__ignoreMap":28},[151,1698,1699],{"class":153,"line":154},[151,1700,1693],{},[38,1702,1704],{"title":1703,"type":41},"DROP SCHEMAは元に戻せない",[10,1705,1706,1709],{},[17,1707,1708],{},"DROP SCHEMA"," を実行すると、スキーマ内のテーブルやデータも削除されます。対象名をよく確認し、必要に応じてバックアップを取得してから実行してください。",[10,1711,1712],{},"不要なスキーマを整理した結果、Local Volumesの使用量は100.2GBから53.89GBまで減りました。",[22,1714,1717],{"className":1715,"code":1716,"language":27,"meta":28},[25],"100.2GB → 53.89GB\n",[17,1718,1716],{"__ignoreMap":28},[10,1720,1721],{},"なお、使われていないVolumeをまとめて削除する場合は、次のコマンドを利用できます。",[22,1723,1725],{"className":145,"code":1724,"language":147,"meta":28,"style":28},"docker volume prune\n",[17,1726,1727],{"__ignoreMap":28},[151,1728,1729,1731,1734],{"class":153,"line":154},[151,1730,1485],{"class":157},[151,1732,1733],{"class":161}," volume",[151,1735,1634],{"class":161},[10,1737,1738],{},"VolumeにはDBなどの永続データが保存されていることがあります。名前や利用状況を確認せずに実行するのは避けたほうが安全です。",[54,1740,1741],{"id":1741},"整理後の結果",[10,1743,1744],{},"整理前と整理後のDocker使用量は、次のようになりました。",[1505,1746,1747,1759],{},[1508,1748,1749],{},[1511,1750,1751,1753,1756],{},[1514,1752,1516],{},[1514,1754,1755],{"align":1519},"整理前",[1514,1757,1758],{"align":1519},"整理後",[1522,1760,1761,1770,1779],{},[1511,1762,1763,1765,1767],{},[1527,1764,1529],{},[1527,1766,1532],{"align":1519},[1527,1768,1769],{"align":1519},"50.4GB",[1511,1771,1772,1774,1776],{},[1527,1773,1537],{},[1527,1775,1540],{"align":1519},[1527,1777,1778],{"align":1519},"53.89GB",[1511,1780,1781,1783,1785],{},[1527,1782,1545],{},[1527,1784,1548],{"align":1519},[1527,1786,1787],{"align":1519},"0B",[10,1789,1790],{},"Build Cacheの削除と、不要なImage、DBスキーマの整理によって、Docker関連のデータを100GB以上削減できました。",[10,1792,1793,1794,1797],{},"Docker Desktopの仮想ディスクはスパースファイルとして管理されるため、Docker上でデータを削除しても、ファイル自体の見かけの最大サイズがすぐに小さくならない場合があります。実際の空き容量はmacOSのストレージ画面や ",[17,1795,1796],{},"df -h"," でも確認すると確実です。",[54,1799,640],{"id":640},[10,1801,1802],{},"Macのシステムデータが異常に増えた場合は、次の順番で調べると原因を絞り込めます。",[648,1804,1805,1813,1819,1825,1828],{},[263,1806,1807,1809,1810,1812],{},[17,1808,1322],{}," で ",[17,1811,1365],{}," の使用量を確認する",[263,1814,1815,1818],{},[17,1816,1817],{},"~\u002FLibrary\u002FContainers"," に大きなディレクトリがないか確認する",[263,1820,1821,1822,1824],{},"Docker Desktopが大きい場合は ",[17,1823,1553],{}," で内訳を確認する",[263,1826,1827],{},"不要なBuild CacheやImageを整理する",[263,1829,1830],{},"大きなVolumeは削除せず、保存されているデータの中身まで確認する",[10,1832,1833],{},"特にDocker Desktopを長期間使っていると、過去のBuild CacheやImage、開発用DBのデータが蓄積します。",[10,1835,1836],{},"Macの容量不足に気づいてから慌てないよう、定期的に次のコマンドで使用量を確認しておくと安心です。",[22,1838,1839],{"className":145,"code":1478,"language":147,"meta":28,"style":28},[17,1840,1841],{"__ignoreMap":28},[151,1842,1843,1845,1847],{"class":153,"line":154},[151,1844,1485],{"class":157},[151,1846,1488],{"class":161},[151,1848,1491],{"class":161},[10,1850,1851],{},"Macのシステムデータが数百GBまで増えている場合は、Docker Desktopのデータが原因になっていないか確認してみてください。",[688,1853,1854],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":28,"searchDepth":297,"depth":297,"links":1856},[1857,1858,1859,1860,1861,1862,1863,1864],{"id":1284,"depth":297,"text":1285},{"id":1309,"depth":297,"text":1309},{"id":1471,"depth":297,"text":1472},{"id":1557,"depth":297,"text":1558},{"id":1600,"depth":297,"text":1601},{"id":1653,"depth":297,"text":1654},{"id":1741,"depth":297,"text":1741},{"id":640,"depth":297,"text":640},"Macの容量不足をきっかけに「システムデータ」が267GBまで肥大化した原因を調査し、DockerのBuild Cache、Image、DB Volumeを整理した手順を紹介します。",{},"\u002Farticles\u002F2026\u002Fresolve-mac-system-data-storage-shortage-with-docker","2026-08-10",{"title":1251,"description":1865},"articles\u002F2026\u002Fresolve-mac-system-data-storage-shortage-with-docker",[1872,1873],"Mac","Docker","\u002Fimages\u002Farticles\u002Fresolve-mac-system-data-storage-shortage-with-docker.png","KWp9gSbK5ytqT20G5ObWg3n5uQyKFKVp9aGSMNPqbgs",{"id":1877,"title":1878,"body":1879,"description":3142,"extension":712,"meta":3143,"navigation":588,"path":3144,"publishDate":3145,"published":588,"seo":3146,"stem":3147,"tags":3148,"thumbnail":3150,"updated":3145,"__hash__":3151},"articles\u002Farticles\u002F2024\u002Flately-learned-js-tip.md","最近学んだJavaScriptのTipsをアウトプット",{"type":7,"value":1880,"toc":3125},[1881,1883,1886,1889,1892,2023,2026,2029,2161,2179,2200,2215,2250,2253,2256,2333,2343,2351,2365,2426,2442,2445,2474,2477,2484,2636,2639,2646,2735,2745,2749,2758,2815,2818,2826,2912,2915,2966,2973,2979,2990,3059,3079,3082,3088,3091,3108,3110,3113,3122],[10,1882,12],{},[10,1884,1885],{},"今回は、最近学んだJavaScriptの小さなTipsとして、オブジェクトの分割代入とオプショナルチェーンを整理します。",[54,1887,1888],{"id":1888},"オブジェクトの分割代入",[10,1890,1891],{},"オブジェクトの分割代入を使うと、プロパティの値を取り出して変数へ代入できます。",[22,1893,1897],{"className":1894,"code":1895,"language":1896,"meta":28,"style":28},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const user = {\n  greeting: 'Hello',\n  farewell: 'Bye',\n}\n\nconst { greeting, farewell } = user\n\nconsole.log(greeting) \u002F\u002F 'Hello'\nconsole.log(farewell) \u002F\u002F 'Bye'\n","javascript",[17,1898,1899,1914,1935,1951,1956,1960,1985,1989,2008],{"__ignoreMap":28},[151,1900,1901,1905,1908,1911],{"class":153,"line":154},[151,1902,1904],{"class":1903},"spNyl","const",[151,1906,1907],{"class":537}," user ",[151,1909,1910],{"class":198},"=",[151,1912,1913],{"class":198}," {\n",[151,1915,1916,1920,1923,1926,1929,1932],{"class":153,"line":297},[151,1917,1919],{"class":1918},"swJcz","  greeting",[151,1921,1922],{"class":198},":",[151,1924,1925],{"class":198}," '",[151,1927,1928],{"class":161},"Hello",[151,1930,1931],{"class":198},"'",[151,1933,1934],{"class":198},",\n",[151,1936,1937,1940,1942,1944,1947,1949],{"class":153,"line":306},[151,1938,1939],{"class":1918},"  farewell",[151,1941,1922],{"class":198},[151,1943,1925],{"class":198},[151,1945,1946],{"class":161},"Bye",[151,1948,1931],{"class":198},[151,1950,1934],{"class":198},[151,1952,1953],{"class":153,"line":454},[151,1954,1955],{"class":198},"}\n",[151,1957,1958],{"class":153,"line":523},[151,1959,589],{"emptyLinePlaceholder":588},[151,1961,1962,1964,1967,1970,1973,1976,1979,1982],{"class":153,"line":612},[151,1963,1904],{"class":1903},[151,1965,1966],{"class":198}," {",[151,1968,1969],{"class":537}," greeting",[151,1971,1972],{"class":198},",",[151,1974,1975],{"class":537}," farewell ",[151,1977,1978],{"class":198},"}",[151,1980,1981],{"class":198}," =",[151,1983,1984],{"class":537}," user\n",[151,1986,1987],{"class":153,"line":617},[151,1988,589],{"emptyLinePlaceholder":588},[151,1990,1991,1994,1997,2001,2004],{"class":153,"line":626},[151,1992,1993],{"class":537},"console",[151,1995,1996],{"class":198},".",[151,1998,2000],{"class":1999},"s2Zo4","log",[151,2002,2003],{"class":537},"(greeting) ",[151,2005,2007],{"class":2006},"sHwdD","\u002F\u002F 'Hello'\n",[151,2009,2011,2013,2015,2017,2020],{"class":153,"line":2010},9,[151,2012,1993],{"class":537},[151,2014,1996],{"class":198},[151,2016,2000],{"class":1999},[151,2018,2019],{"class":537},"(farewell) ",[151,2021,2022],{"class":2006},"\u002F\u002F 'Bye'\n",[64,2024,2025],{"id":2025},"ネストしたプロパティを取り出す",[10,2027,2028],{},"オブジェクトの中にオブジェクトがある場合は、データの構造に合わせて分割代入のパターンもネストできます。",[22,2030,2032],{"className":1894,"code":2031,"language":1896,"meta":28,"style":28},"const user = {\n  greeting: 'Hello',\n  message: {\n    farewell: 'Bye',\n  },\n}\n\nconst {\n  greeting,\n  message: { farewell },\n} = user\n\nconsole.log(greeting) \u002F\u002F 'Hello'\nconsole.log(farewell) \u002F\u002F 'Bye'\n",[17,2033,2034,2044,2058,2067,2082,2087,2091,2095,2101,2107,2121,2130,2135,2148],{"__ignoreMap":28},[151,2035,2036,2038,2040,2042],{"class":153,"line":154},[151,2037,1904],{"class":1903},[151,2039,1907],{"class":537},[151,2041,1910],{"class":198},[151,2043,1913],{"class":198},[151,2045,2046,2048,2050,2052,2054,2056],{"class":153,"line":297},[151,2047,1919],{"class":1918},[151,2049,1922],{"class":198},[151,2051,1925],{"class":198},[151,2053,1928],{"class":161},[151,2055,1931],{"class":198},[151,2057,1934],{"class":198},[151,2059,2060,2063,2065],{"class":153,"line":306},[151,2061,2062],{"class":1918},"  message",[151,2064,1922],{"class":198},[151,2066,1913],{"class":198},[151,2068,2069,2072,2074,2076,2078,2080],{"class":153,"line":454},[151,2070,2071],{"class":1918},"    farewell",[151,2073,1922],{"class":198},[151,2075,1925],{"class":198},[151,2077,1946],{"class":161},[151,2079,1931],{"class":198},[151,2081,1934],{"class":198},[151,2083,2084],{"class":153,"line":523},[151,2085,2086],{"class":198},"  },\n",[151,2088,2089],{"class":153,"line":612},[151,2090,1955],{"class":198},[151,2092,2093],{"class":153,"line":617},[151,2094,589],{"emptyLinePlaceholder":588},[151,2096,2097,2099],{"class":153,"line":626},[151,2098,1904],{"class":1903},[151,2100,1913],{"class":198},[151,2102,2103,2105],{"class":153,"line":2010},[151,2104,1919],{"class":537},[151,2106,1934],{"class":198},[151,2108,2110,2112,2114,2116,2118],{"class":153,"line":2109},10,[151,2111,2062],{"class":1918},[151,2113,1922],{"class":198},[151,2115,1966],{"class":198},[151,2117,1975],{"class":537},[151,2119,2120],{"class":198},"},\n",[151,2122,2124,2126,2128],{"class":153,"line":2123},11,[151,2125,1978],{"class":198},[151,2127,1981],{"class":198},[151,2129,1984],{"class":537},[151,2131,2133],{"class":153,"line":2132},12,[151,2134,589],{"emptyLinePlaceholder":588},[151,2136,2138,2140,2142,2144,2146],{"class":153,"line":2137},13,[151,2139,1993],{"class":537},[151,2141,1996],{"class":198},[151,2143,2000],{"class":1999},[151,2145,2003],{"class":537},[151,2147,2007],{"class":2006},[151,2149,2151,2153,2155,2157,2159],{"class":153,"line":2150},14,[151,2152,1993],{"class":537},[151,2154,1996],{"class":198},[151,2156,2000],{"class":1999},[151,2158,2019],{"class":537},[151,2160,2022],{"class":2006},[10,2162,2163,2164,2167,2168,2171,2172,2175,2176,2178],{},"この例で作られる変数は",[17,2165,2166],{},"greeting","と",[17,2169,2170],{},"farewell","です。",[17,2173,2174],{},"message","は、内側の",[17,2177,2170],{},"へたどるためのパターンとして使われているだけなので、変数として宣言されません。",[22,2180,2182],{"className":1894,"code":2181,"language":1896,"meta":28,"style":28},"console.log(message)\n\u002F\u002F ReferenceError: message is not defined\n",[17,2183,2184,2195],{"__ignoreMap":28},[151,2185,2186,2188,2190,2192],{"class":153,"line":154},[151,2187,1993],{"class":537},[151,2189,1996],{"class":198},[151,2191,2000],{"class":1999},[151,2193,2194],{"class":537},"(message)\n",[151,2196,2197],{"class":153,"line":297},[151,2198,2199],{"class":2006},"\u002F\u002F ReferenceError: message is not defined\n",[38,2201,2204],{"title":2202,"type":2203},"親オブジェクトも使いたい場合","note",[10,2205,2206,2208,2209,2211,2212,2214],{},[17,2207,2174],{},"自体と、その中の",[17,2210,2170],{},"を両方使いたい場合は、分割代入を分けるか、先に",[17,2213,2174],{},"を取り出してから再度分割代入します。",[22,2216,2218],{"className":1894,"code":2217,"language":1896,"meta":28,"style":28},"const { message } = user\nconst { farewell } = message\n",[17,2219,2220,2235],{"__ignoreMap":28},[151,2221,2222,2224,2226,2229,2231,2233],{"class":153,"line":154},[151,2223,1904],{"class":1903},[151,2225,1966],{"class":198},[151,2227,2228],{"class":537}," message ",[151,2230,1978],{"class":198},[151,2232,1981],{"class":198},[151,2234,1984],{"class":537},[151,2236,2237,2239,2241,2243,2245,2247],{"class":153,"line":297},[151,2238,1904],{"class":1903},[151,2240,1966],{"class":198},[151,2242,1975],{"class":537},[151,2244,1978],{"class":198},[151,2246,1981],{"class":198},[151,2248,2249],{"class":537}," message\n",[64,2251,2252],{"id":2252},"プロパティ名とは異なる変数名で受け取る",[10,2254,2255],{},"コロンの右側へ名前を書くと、プロパティ名とは異なる変数名で値を受け取れます。",[22,2257,2259],{"className":1894,"code":2258,"language":1896,"meta":28,"style":28},"const user = {\n  name: 'Yuri',\n}\n\nconst { name: userName } = user\n\nconsole.log(userName) \u002F\u002F 'Yuri'\n",[17,2260,2261,2271,2287,2291,2295,2315,2319],{"__ignoreMap":28},[151,2262,2263,2265,2267,2269],{"class":153,"line":154},[151,2264,1904],{"class":1903},[151,2266,1907],{"class":537},[151,2268,1910],{"class":198},[151,2270,1913],{"class":198},[151,2272,2273,2276,2278,2280,2283,2285],{"class":153,"line":297},[151,2274,2275],{"class":1918},"  name",[151,2277,1922],{"class":198},[151,2279,1925],{"class":198},[151,2281,2282],{"class":161},"Yuri",[151,2284,1931],{"class":198},[151,2286,1934],{"class":198},[151,2288,2289],{"class":153,"line":306},[151,2290,1955],{"class":198},[151,2292,2293],{"class":153,"line":454},[151,2294,589],{"emptyLinePlaceholder":588},[151,2296,2297,2299,2301,2304,2306,2309,2311,2313],{"class":153,"line":523},[151,2298,1904],{"class":1903},[151,2300,1966],{"class":198},[151,2302,2303],{"class":1918}," name",[151,2305,1922],{"class":198},[151,2307,2308],{"class":537}," userName ",[151,2310,1978],{"class":198},[151,2312,1981],{"class":198},[151,2314,1984],{"class":537},[151,2316,2317],{"class":153,"line":612},[151,2318,589],{"emptyLinePlaceholder":588},[151,2320,2321,2323,2325,2327,2330],{"class":153,"line":617},[151,2322,1993],{"class":537},[151,2324,1996],{"class":198},[151,2326,2000],{"class":1999},[151,2328,2329],{"class":537},"(userName) ",[151,2331,2332],{"class":2006},"\u002F\u002F 'Yuri'\n",[10,2334,2335,2336,2339,2340,2171],{},"この場合も",[17,2337,2338],{},"name","という変数は作られず、作られるのは",[17,2341,2342],{},"userName",[54,2344,2346,2347,2350],{"id":2345},"オプショナルチェーン","オプショナルチェーン（",[17,2348,2349],{},"?.","）",[10,2352,2353,2354,2357,2358,2361,2362,2364],{},"オプショナルチェーンは、参照の途中にある値が",[17,2355,2356],{},"null","または",[17,2359,2360],{},"undefined","だった場合、エラーを発生させずに",[17,2363,2360],{},"を返す演算子です。",[22,2366,2368],{"className":1894,"code":2367,"language":1896,"meta":28,"style":28},"const user = {\n  name: 'Yuri',\n}\n\nconsole.log(user.profile?.hobby) \u002F\u002F undefined\n",[17,2369,2370,2380,2394,2398,2402],{"__ignoreMap":28},[151,2371,2372,2374,2376,2378],{"class":153,"line":154},[151,2373,1904],{"class":1903},[151,2375,1907],{"class":537},[151,2377,1910],{"class":198},[151,2379,1913],{"class":198},[151,2381,2382,2384,2386,2388,2390,2392],{"class":153,"line":297},[151,2383,2275],{"class":1918},[151,2385,1922],{"class":198},[151,2387,1925],{"class":198},[151,2389,2282],{"class":161},[151,2391,1931],{"class":198},[151,2393,1934],{"class":198},[151,2395,2396],{"class":153,"line":306},[151,2397,1955],{"class":198},[151,2399,2400],{"class":153,"line":454},[151,2401,589],{"emptyLinePlaceholder":588},[151,2403,2404,2406,2408,2410,2413,2415,2418,2420,2423],{"class":153,"line":523},[151,2405,1993],{"class":537},[151,2407,1996],{"class":198},[151,2409,2000],{"class":1999},[151,2411,2412],{"class":537},"(user",[151,2414,1996],{"class":198},[151,2416,2417],{"class":537},"profile",[151,2419,2349],{"class":198},[151,2421,2422],{"class":537},"hobby) ",[151,2424,2425],{"class":2006},"\u002F\u002F undefined\n",[10,2427,2428,2431,2432,2434,2435,2437,2438,2441],{},[17,2429,2430],{},"user.profile","は",[17,2433,2360],{},"ですが、",[17,2436,2349],{},"を使っているため、その先の",[17,2439,2440],{},"hobby","へアクセスせず評価を終了します。",[10,2443,2444],{},"通常のプロパティアクセスではエラーになります。",[22,2446,2448],{"className":1894,"code":2447,"language":1896,"meta":28,"style":28},"console.log(user.profile.hobby)\n\u002F\u002F TypeError: Cannot read properties of undefined\n",[17,2449,2450,2469],{"__ignoreMap":28},[151,2451,2452,2454,2456,2458,2460,2462,2464,2466],{"class":153,"line":154},[151,2453,1993],{"class":537},[151,2455,1996],{"class":198},[151,2457,2000],{"class":1999},[151,2459,2412],{"class":537},[151,2461,1996],{"class":198},[151,2463,2417],{"class":537},[151,2465,1996],{"class":198},[151,2467,2468],{"class":537},"hobby)\n",[151,2470,2471],{"class":153,"line":297},[151,2472,2473],{"class":2006},"\u002F\u002F TypeError: Cannot read properties of undefined\n",[64,2475,2476],{"id":2476},"配列の要素へアクセスする",[10,2478,2479,2480,2483],{},"角括弧によるアクセスでは、",[17,2481,2482],{},"?.[]","の形で使用します。",[22,2485,2487],{"className":1894,"code":2486,"language":1896,"meta":28,"style":28},"const items = [\n  { name: 'Item 1' },\n  { name: 'Item 2' },\n]\n\nconsole.log(items[1]?.name) \u002F\u002F 'Item 2'\nconsole.log(items[3]?.name) \u002F\u002F undefined\n\nconst emptyItems = undefined\n\nconsole.log(emptyItems?.[0]) \u002F\u002F undefined\n",[17,2488,2489,2501,2520,2537,2542,2546,2571,2592,2596,2608,2612],{"__ignoreMap":28},[151,2490,2491,2493,2496,2498],{"class":153,"line":154},[151,2492,1904],{"class":1903},[151,2494,2495],{"class":537}," items ",[151,2497,1910],{"class":198},[151,2499,2500],{"class":537}," [\n",[151,2502,2503,2506,2508,2510,2512,2515,2517],{"class":153,"line":297},[151,2504,2505],{"class":198},"  {",[151,2507,2303],{"class":1918},[151,2509,1922],{"class":198},[151,2511,1925],{"class":198},[151,2513,2514],{"class":161},"Item 1",[151,2516,1931],{"class":198},[151,2518,2519],{"class":198}," },\n",[151,2521,2522,2524,2526,2528,2530,2533,2535],{"class":153,"line":306},[151,2523,2505],{"class":198},[151,2525,2303],{"class":1918},[151,2527,1922],{"class":198},[151,2529,1925],{"class":198},[151,2531,2532],{"class":161},"Item 2",[151,2534,1931],{"class":198},[151,2536,2519],{"class":198},[151,2538,2539],{"class":153,"line":454},[151,2540,2541],{"class":537},"]\n",[151,2543,2544],{"class":153,"line":523},[151,2545,589],{"emptyLinePlaceholder":588},[151,2547,2548,2550,2552,2554,2557,2560,2563,2565,2568],{"class":153,"line":612},[151,2549,1993],{"class":537},[151,2551,1996],{"class":198},[151,2553,2000],{"class":1999},[151,2555,2556],{"class":537},"(items[",[151,2558,2559],{"class":1331},"1",[151,2561,2562],{"class":537},"]",[151,2564,2349],{"class":198},[151,2566,2567],{"class":537},"name) ",[151,2569,2570],{"class":2006},"\u002F\u002F 'Item 2'\n",[151,2572,2573,2575,2577,2579,2581,2584,2586,2588,2590],{"class":153,"line":617},[151,2574,1993],{"class":537},[151,2576,1996],{"class":198},[151,2578,2000],{"class":1999},[151,2580,2556],{"class":537},[151,2582,2583],{"class":1331},"3",[151,2585,2562],{"class":537},[151,2587,2349],{"class":198},[151,2589,2567],{"class":537},[151,2591,2425],{"class":2006},[151,2593,2594],{"class":153,"line":626},[151,2595,589],{"emptyLinePlaceholder":588},[151,2597,2598,2600,2603,2605],{"class":153,"line":2010},[151,2599,1904],{"class":1903},[151,2601,2602],{"class":537}," emptyItems ",[151,2604,1910],{"class":198},[151,2606,2607],{"class":198}," undefined\n",[151,2609,2610],{"class":153,"line":2109},[151,2611,589],{"emptyLinePlaceholder":588},[151,2613,2614,2616,2618,2620,2623,2625,2628,2631,2634],{"class":153,"line":2123},[151,2615,1993],{"class":537},[151,2617,1996],{"class":198},[151,2619,2000],{"class":1999},[151,2621,2622],{"class":537},"(emptyItems",[151,2624,2349],{"class":198},[151,2626,2627],{"class":537},"[",[151,2629,2630],{"class":1331},"0",[151,2632,2633],{"class":537},"]) ",[151,2635,2425],{"class":2006},[64,2637,2638],{"id":2638},"関数やメソッドを呼び出す",[10,2640,2641,2642,2645],{},"関数が存在するときだけ呼び出したい場合は、",[17,2643,2644],{},"?.()","を使用します。",[22,2647,2649],{"className":1894,"code":2648,"language":1896,"meta":28,"style":28},"const actions = {\n  greet: () => 'Hello',\n}\n\nconsole.log(actions.greet?.()) \u002F\u002F 'Hello'\nconsole.log(actions.sayGoodbye?.()) \u002F\u002F undefined\n",[17,2650,2651,2662,2683,2687,2691,2714],{"__ignoreMap":28},[151,2652,2653,2655,2658,2660],{"class":153,"line":154},[151,2654,1904],{"class":1903},[151,2656,2657],{"class":537}," actions ",[151,2659,1910],{"class":198},[151,2661,1913],{"class":198},[151,2663,2664,2667,2669,2672,2675,2677,2679,2681],{"class":153,"line":297},[151,2665,2666],{"class":1999},"  greet",[151,2668,1922],{"class":198},[151,2670,2671],{"class":198}," ()",[151,2673,2674],{"class":1903}," =>",[151,2676,1925],{"class":198},[151,2678,1928],{"class":161},[151,2680,1931],{"class":198},[151,2682,1934],{"class":198},[151,2684,2685],{"class":153,"line":306},[151,2686,1955],{"class":198},[151,2688,2689],{"class":153,"line":454},[151,2690,589],{"emptyLinePlaceholder":588},[151,2692,2693,2695,2697,2699,2702,2704,2707,2709,2712],{"class":153,"line":523},[151,2694,1993],{"class":537},[151,2696,1996],{"class":198},[151,2698,2000],{"class":1999},[151,2700,2701],{"class":537},"(actions",[151,2703,1996],{"class":198},[151,2705,2706],{"class":1999},"greet",[151,2708,2349],{"class":198},[151,2710,2711],{"class":537},"()) ",[151,2713,2007],{"class":2006},[151,2715,2716,2718,2720,2722,2724,2726,2729,2731,2733],{"class":153,"line":612},[151,2717,1993],{"class":537},[151,2719,1996],{"class":198},[151,2721,2000],{"class":1999},[151,2723,2701],{"class":537},[151,2725,1996],{"class":198},[151,2727,2728],{"class":1999},"sayGoodbye",[151,2730,2349],{"class":198},[151,2732,2711],{"class":537},[151,2734,2425],{"class":2006},[10,2736,2737,2738,2741,2742,2744],{},"プロパティが存在していても、その値が関数でなければ",[17,2739,2740],{},"TypeError","になります。",[17,2743,2644],{},"は「呼び出し可能かどうか」まで確認するものではありません。",[64,2746,2748],{"id":2747},"dom要素へアクセスする","DOM要素へアクセスする",[10,2750,2751,2754,2755,2757],{},[17,2752,2753],{},"querySelector","は対象が見つからなかった場合に",[17,2756,2356],{},"を返します。要素が存在するときだけプロパティを参照したい場合にも利用できます。",[22,2759,2761],{"className":1894,"code":2760,"language":1896,"meta":28,"style":28},"const button = document.querySelector('.sample-button')\n\nconsole.log(button?.textContent) \u002F\u002F 要素がなければundefined\n",[17,2762,2763,2792,2796],{"__ignoreMap":28},[151,2764,2765,2767,2770,2772,2775,2777,2779,2782,2784,2787,2789],{"class":153,"line":154},[151,2766,1904],{"class":1903},[151,2768,2769],{"class":537}," button ",[151,2771,1910],{"class":198},[151,2773,2774],{"class":537}," document",[151,2776,1996],{"class":198},[151,2778,2753],{"class":1999},[151,2780,2781],{"class":537},"(",[151,2783,1931],{"class":198},[151,2785,2786],{"class":161},".sample-button",[151,2788,1931],{"class":198},[151,2790,2791],{"class":537},")\n",[151,2793,2794],{"class":153,"line":297},[151,2795,589],{"emptyLinePlaceholder":588},[151,2797,2798,2800,2802,2804,2807,2809,2812],{"class":153,"line":306},[151,2799,1993],{"class":537},[151,2801,1996],{"class":198},[151,2803,2000],{"class":1999},[151,2805,2806],{"class":537},"(button",[151,2808,2349],{"class":198},[151,2810,2811],{"class":537},"textContent) ",[151,2813,2814],{"class":2006},"\u002F\u002F 要素がなければundefined\n",[64,2816,2817],{"id":2817},"短絡評価される範囲",[10,2819,2820,2821,2357,2823,2825],{},"オプショナルチェーンでは、左側が",[17,2822,2356],{},[17,2824,2360],{},"の場合、そのチェーンの残りは評価されません。",[22,2827,2829],{"className":1894,"code":2828,"language":1896,"meta":28,"style":28},"let index = 0\nconst items = null\n\nconst item = items?.[index++]\n\nconsole.log(item) \u002F\u002F undefined\nconsole.log(index) \u002F\u002F 0\n",[17,2830,2831,2844,2855,2859,2881,2885,2898],{"__ignoreMap":28},[151,2832,2833,2836,2839,2841],{"class":153,"line":154},[151,2834,2835],{"class":1903},"let",[151,2837,2838],{"class":537}," index ",[151,2840,1910],{"class":198},[151,2842,2843],{"class":1331}," 0\n",[151,2845,2846,2848,2850,2852],{"class":153,"line":297},[151,2847,1904],{"class":1903},[151,2849,2495],{"class":537},[151,2851,1910],{"class":198},[151,2853,2854],{"class":198}," null\n",[151,2856,2857],{"class":153,"line":306},[151,2858,589],{"emptyLinePlaceholder":588},[151,2860,2861,2863,2866,2868,2871,2873,2876,2879],{"class":153,"line":454},[151,2862,1904],{"class":1903},[151,2864,2865],{"class":537}," item ",[151,2867,1910],{"class":198},[151,2869,2870],{"class":537}," items",[151,2872,2349],{"class":198},[151,2874,2875],{"class":537},"[index",[151,2877,2878],{"class":198},"++",[151,2880,2541],{"class":537},[151,2882,2883],{"class":153,"line":523},[151,2884,589],{"emptyLinePlaceholder":588},[151,2886,2887,2889,2891,2893,2896],{"class":153,"line":612},[151,2888,1993],{"class":537},[151,2890,1996],{"class":198},[151,2892,2000],{"class":1999},[151,2894,2895],{"class":537},"(item) ",[151,2897,2425],{"class":2006},[151,2899,2900,2902,2904,2906,2909],{"class":153,"line":617},[151,2901,1993],{"class":537},[151,2903,1996],{"class":198},[151,2905,2000],{"class":1999},[151,2907,2908],{"class":537},"(index) ",[151,2910,2911],{"class":2006},"\u002F\u002F 0\n",[10,2913,2914],{},"ただし、オプショナルチェーンが途切れた後のアクセスは保護されません。",[22,2916,2918],{"className":1894,"code":2917,"language":1896,"meta":28,"style":28},"const user = null\n\nuser?.profile.name \u002F\u002F undefined\n(user?.profile).name \u002F\u002F TypeError\n",[17,2919,2920,2930,2934,2950],{"__ignoreMap":28},[151,2921,2922,2924,2926,2928],{"class":153,"line":154},[151,2923,1904],{"class":1903},[151,2925,1907],{"class":537},[151,2927,1910],{"class":198},[151,2929,2854],{"class":198},[151,2931,2932],{"class":153,"line":297},[151,2933,589],{"emptyLinePlaceholder":588},[151,2935,2936,2939,2941,2943,2945,2948],{"class":153,"line":306},[151,2937,2938],{"class":537},"user",[151,2940,2349],{"class":198},[151,2942,2417],{"class":537},[151,2944,1996],{"class":198},[151,2946,2947],{"class":537},"name ",[151,2949,2425],{"class":2006},[151,2951,2952,2954,2956,2959,2961,2963],{"class":153,"line":454},[151,2953,2412],{"class":537},[151,2955,2349],{"class":198},[151,2957,2958],{"class":537},"profile)",[151,2960,1996],{"class":198},[151,2962,2947],{"class":537},[151,2964,2965],{"class":2006},"\u002F\u002F TypeError\n",[10,2967,2968,2969,2972],{},"括弧で区切ると、その後の",[17,2970,2971],{},".name","は別のプロパティアクセスとして評価されます。",[54,2974,2976,2975],{"id":2975},"と組み合わせて既定値を設定する",[17,2977,2978],{},"??",[10,2980,2981,2982,2357,2984,2986,2987,2989],{},"オプショナルチェーンで取得した結果が",[17,2983,2356],{},[17,2985,2360],{},"だった場合、ヌル値合体演算子（",[17,2988,2978],{},"）で既定値を設定できます。",[22,2991,2993],{"className":1894,"code":2992,"language":1896,"meta":28,"style":28},"const user = {}\n\nconst hobby = user.profile?.hobby ?? '未設定'\n\nconsole.log(hobby) \u002F\u002F '未設定'\n",[17,2994,2995,3006,3010,3041,3045],{"__ignoreMap":28},[151,2996,2997,2999,3001,3003],{"class":153,"line":154},[151,2998,1904],{"class":1903},[151,3000,1907],{"class":537},[151,3002,1910],{"class":198},[151,3004,3005],{"class":198}," {}\n",[151,3007,3008],{"class":153,"line":297},[151,3009,589],{"emptyLinePlaceholder":588},[151,3011,3012,3014,3017,3019,3022,3024,3026,3028,3031,3033,3035,3038],{"class":153,"line":306},[151,3013,1904],{"class":1903},[151,3015,3016],{"class":537}," hobby ",[151,3018,1910],{"class":198},[151,3020,3021],{"class":537}," user",[151,3023,1996],{"class":198},[151,3025,2417],{"class":537},[151,3027,2349],{"class":198},[151,3029,3030],{"class":537},"hobby ",[151,3032,2978],{"class":198},[151,3034,1925],{"class":198},[151,3036,3037],{"class":161},"未設定",[151,3039,3040],{"class":198},"'\n",[151,3042,3043],{"class":153,"line":454},[151,3044,589],{"emptyLinePlaceholder":588},[151,3046,3047,3049,3051,3053,3056],{"class":153,"line":523},[151,3048,1993],{"class":537},[151,3050,1996],{"class":198},[151,3052,2000],{"class":1999},[151,3054,3055],{"class":537},"(hobby) ",[151,3057,3058],{"class":2006},"\u002F\u002F '未設定'\n",[10,3060,3061,2431,3064,3066,3067,3070,3071,3073,3074,2357,3076,3078],{},[17,3062,3063],{},"||",[17,3065,2630],{},"、空文字列、",[17,3068,3069],{},"false","も右側の値へ置き換えますが、",[17,3072,2978],{},"が右側を返すのは",[17,3075,2356],{},[17,3077,2360],{},"の場合だけです。",[54,3080,3081],{"id":3081},"オプショナルチェーンを使うときの注意点",[10,3083,3084,3085,3087],{},"オプショナルチェーンは条件分岐を簡潔にできますが、必須であるはずの値にまで使用すると、不具合を",[17,3086,2360],{},"として見逃す可能性があります。",[10,3089,3090],{},"次のように使い分けることが大切です。",[260,3092,3093,3099,3102],{},[263,3094,3095,3096,3098],{},"値が存在しないことを仕様として許容する場合は",[17,3097,2349],{},"を使う",[263,3100,3101],{},"値が必須の場合は明示的に確認し、存在しなければエラーとして扱う",[263,3103,3104,3105,3107],{},"取得結果に既定値が必要な場合は",[17,3106,2978],{},"を組み合わせる",[54,3109,640],{"id":640},[10,3111,3112],{},"ネストした分割代入を使うと、深い階層の値を簡潔に変数へ取り出せます。ただし、途中のプロパティ名がそのまま変数になるわけではありません。",[10,3114,3115,3116,3118,3119,3121],{},"オプショナルチェーンを使うと、",[17,3117,2356],{},"や",[17,3120,2360],{},"の可能性があるプロパティ、配列、関数へ安全にアクセスできます。便利さだけで多用せず、その値が本当に省略可能なのかを考えて使っていきたいです。",[688,3123,3124],{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":28,"searchDepth":297,"depth":297,"links":3126},[3127,3131,3138,3140,3141],{"id":1888,"depth":297,"text":1888,"children":3128},[3129,3130],{"id":2025,"depth":306,"text":2025},{"id":2252,"depth":306,"text":2252},{"id":2345,"depth":297,"text":3132,"children":3133},"オプショナルチェーン（?.）",[3134,3135,3136,3137],{"id":2476,"depth":306,"text":2476},{"id":2638,"depth":306,"text":2638},{"id":2747,"depth":306,"text":2748},{"id":2817,"depth":306,"text":2817},{"id":2975,"depth":297,"text":3139},"??と組み合わせて既定値を設定する",{"id":3081,"depth":297,"text":3081},{"id":640,"depth":297,"text":640},"JavaScriptのネストしたオブジェクトの分割代入とオプショナルチェーンについて、コード例と注意点を交えて整理します。",{},"\u002Farticles\u002F2024\u002Flately-learned-js-tip","2024-12-28",{"title":1878,"description":3142},"articles\u002F2024\u002Flately-learned-js-tip",[3149],"JavaScript","\u002Fimages\u002Farticles\u002Flately-learned-js-tip.png","ERxfW_ZAoLzFaC3Yj58hYaSySmu0hO_QLe-x8dgJYOo",{"id":3153,"title":3154,"body":3155,"description":4784,"extension":712,"meta":4785,"navigation":588,"path":4786,"publishDate":4787,"published":588,"seo":4788,"stem":4789,"tags":4790,"thumbnail":4791,"updated":4787,"__hash__":4792},"articles\u002Farticles\u002F2024\u002Forganize-learned-from-todo.md","Todoアプリのハンズオンで学んだことを整理する",{"type":7,"value":3156,"toc":4755},[3157,3159,3170,3183,3186,3193,3202,3233,3236,3242,3244,3247,3250,3292,3295,3299,3302,3312,3315,3318,3324,3333,3531,3542,3545,3548,3647,3650,3653,3740,3743,3746,3773,3776,3779,3790,3934,3937,3940,3943,3946,3949,3957,3969,4037,4043,4048,4054,4097,4102,4105,4108,4173,4180,4183,4190,4302,4311,4318,4323,4382,4385,4388,4391,4484,4487,4493,4512,4522,4525,4528,4607,4614,4617,4620,4741,4744,4746,4749,4752],[10,3158,12],{},[10,3160,3161,3162,3169],{},"今回は「",[3163,3164,3168],"a",{"href":3165,"rel":3166},"https:\u002F\u002Fzenn.dev\u002Fsprout2000\u002Fbooks\u002F76a279bb90c3f3",[3167],"nofollow","React Hooks と TypeScript でつくる Todo PWA ～入門 React ハンズオン～","」を進める中で学んだことを、次の4つに分けて整理します。",[260,3171,3172,3175,3177,3180],{},[263,3173,3174],{},"HTML",[263,3176,3149],{},[263,3178,3179],{},"React",[263,3181,3182],{},"TypeScript",[54,3184,3174],{"id":3185},"html",[64,3187,3189,3192],{"id":3188},"autofocus属性",[17,3190,3191],{},"autofocus","属性",[10,3194,3195,3197,3198,3201],{},[17,3196,3191],{},"は、ページの読み込み時や",[17,3199,3200],{},"dialog","要素の表示時に、指定した要素へ自動的にフォーカスするための属性です。",[22,3203,3206],{"className":3204,"code":3205,"language":3185,"meta":28,"style":28},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cinput type=\"text\" autofocus>\n",[17,3207,3208],{"__ignoreMap":28},[151,3209,3210,3213,3216,3219,3221,3224,3226,3228,3231],{"class":153,"line":154},[151,3211,3212],{"class":198},"\u003C",[151,3214,3215],{"class":1918},"input",[151,3217,3218],{"class":1903}," type",[151,3220,1910],{"class":198},[151,3222,3223],{"class":198},"\"",[151,3225,27],{"class":161},[151,3227,3223],{"class":198},[151,3229,3230],{"class":1903}," autofocus",[151,3232,540],{"class":198},[10,3234,3235],{},"1つの文書やダイアログ内では、複数の要素へ指定しないようにします。複数指定した場合、最初に見つかった要素がフォーカスされます。",[38,3237,3239],{"title":3238,"type":41},"アクセシビリティへの配慮",[10,3240,3241],{},"ページを開いた直後にフォーカスが移動すると、スクリーンリーダー利用者やモバイル利用者を混乱させる場合があります。本当に自動フォーカスが必要かを検討して使用しましょう。",[54,3243,3149],{"id":1896},[64,3245,3246],{"id":3246},"オブジェクトのプロパティ名を動的にする",[10,3248,3249],{},"オブジェクトリテラルのプロパティ名を角括弧で囲むと、式の評価結果をプロパティ名として使用できます。これは計算プロパティ名と呼ばれます。",[22,3251,3253],{"className":1894,"code":3252,"language":1896,"meta":28,"style":28},"const key = 'sampleKey'\n\nconst sample = {\n  [key]: 'sampleValue',\n}\n\nconsole.log(sample) \u002F\u002F { sampleKey: 'sampleValue' }\nconsole.log(sample[key]) \u002F\u002F 'sampleValue'\n",[17,3254,3255,3260,3264,3269,3274,3278,3282,3287],{"__ignoreMap":28},[151,3256,3257],{"class":153,"line":154},[151,3258,3259],{},"const key = 'sampleKey'\n",[151,3261,3262],{"class":153,"line":297},[151,3263,589],{"emptyLinePlaceholder":588},[151,3265,3266],{"class":153,"line":306},[151,3267,3268],{},"const sample = {\n",[151,3270,3271],{"class":153,"line":454},[151,3272,3273],{},"  [key]: 'sampleValue',\n",[151,3275,3276],{"class":153,"line":523},[151,3277,1955],{},[151,3279,3280],{"class":153,"line":612},[151,3281,589],{"emptyLinePlaceholder":588},[151,3283,3284],{"class":153,"line":617},[151,3285,3286],{},"console.log(sample) \u002F\u002F { sampleKey: 'sampleValue' }\n",[151,3288,3289],{"class":153,"line":626},[151,3290,3291],{},"console.log(sample[key]) \u002F\u002F 'sampleValue'\n",[10,3293,3294],{},"入力項目の名前をキーとしてオブジェクトを更新する場合などに利用できます。",[64,3296,3298],{"id":3297},"tree-shaking","Tree Shaking",[10,3300,3301],{},"Tree Shakingは、利用されていないコードをビルド結果から取り除く最適化です。",[10,3303,3304,3305,2167,3308,3311],{},"主にバンドラーがES Modulesの",[17,3306,3307],{},"import",[17,3309,3310],{},"export","を静的に解析し、参照されていないエクスポートを出力対象から除外します。",[10,3313,3314],{},"実際に削除できる範囲は、バンドラーの設定やコードに副作用があるかどうかによって変わります。",[54,3316,3179],{"id":3317},"react",[64,3319,3321],{"id":3320},"createroot",[17,3322,3323],{},"createRoot",[10,3325,3326,3328,3329,3332],{},[17,3327,3323],{},"は、Reactが管理するルートをブラウザのDOM要素へ作成するAPIです。作成したルートの",[17,3330,3331],{},"render","メソッドへReact要素を渡して表示します。",[22,3334,3338],{"className":3335,"code":3336,"language":3337,"meta":28,"style":28},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { StrictMode } from 'react'\nimport { createRoot } from 'react-dom\u002Fclient'\nimport App from '.\u002FApp'\n\nconst container = document.getElementById('root')\n\nif (!container) {\n  throw new Error('root要素が見つかりません')\n}\n\ncreateRoot(container).render(\n  \u003CStrictMode>\n    \u003CApp \u002F>\n  \u003C\u002FStrictMode>,\n)\n","tsx",[17,3339,3340,3362,3382,3399,3403,3430,3434,3451,3473,3477,3481,3495,3505,3516,3526],{"__ignoreMap":28},[151,3341,3342,3345,3347,3350,3353,3356,3358,3360],{"class":153,"line":154},[151,3343,3307],{"class":3344},"s7zQu",[151,3346,1966],{"class":198},[151,3348,3349],{"class":537}," StrictMode",[151,3351,3352],{"class":198}," }",[151,3354,3355],{"class":3344}," from",[151,3357,1925],{"class":198},[151,3359,3317],{"class":161},[151,3361,3040],{"class":198},[151,3363,3364,3366,3368,3371,3373,3375,3377,3380],{"class":153,"line":297},[151,3365,3307],{"class":3344},[151,3367,1966],{"class":198},[151,3369,3370],{"class":537}," createRoot",[151,3372,3352],{"class":198},[151,3374,3355],{"class":3344},[151,3376,1925],{"class":198},[151,3378,3379],{"class":161},"react-dom\u002Fclient",[151,3381,3040],{"class":198},[151,3383,3384,3386,3389,3392,3394,3397],{"class":153,"line":306},[151,3385,3307],{"class":3344},[151,3387,3388],{"class":537}," App ",[151,3390,3391],{"class":3344},"from",[151,3393,1925],{"class":198},[151,3395,3396],{"class":161},".\u002FApp",[151,3398,3040],{"class":198},[151,3400,3401],{"class":153,"line":454},[151,3402,589],{"emptyLinePlaceholder":588},[151,3404,3405,3407,3410,3412,3414,3416,3419,3421,3423,3426,3428],{"class":153,"line":523},[151,3406,1904],{"class":1903},[151,3408,3409],{"class":537}," container ",[151,3411,1910],{"class":198},[151,3413,2774],{"class":537},[151,3415,1996],{"class":198},[151,3417,3418],{"class":1999},"getElementById",[151,3420,2781],{"class":537},[151,3422,1931],{"class":198},[151,3424,3425],{"class":161},"root",[151,3427,1931],{"class":198},[151,3429,2791],{"class":537},[151,3431,3432],{"class":153,"line":612},[151,3433,589],{"emptyLinePlaceholder":588},[151,3435,3436,3439,3442,3445,3448],{"class":153,"line":617},[151,3437,3438],{"class":3344},"if",[151,3440,3441],{"class":537}," (",[151,3443,3444],{"class":198},"!",[151,3446,3447],{"class":537},"container) ",[151,3449,3450],{"class":198},"{\n",[151,3452,3453,3456,3459,3462,3464,3466,3469,3471],{"class":153,"line":626},[151,3454,3455],{"class":3344},"  throw",[151,3457,3458],{"class":198}," new",[151,3460,3461],{"class":1999}," Error",[151,3463,2781],{"class":1918},[151,3465,1931],{"class":198},[151,3467,3468],{"class":161},"root要素が見つかりません",[151,3470,1931],{"class":198},[151,3472,2791],{"class":1918},[151,3474,3475],{"class":153,"line":2010},[151,3476,1955],{"class":198},[151,3478,3479],{"class":153,"line":2109},[151,3480,589],{"emptyLinePlaceholder":588},[151,3482,3483,3485,3488,3490,3492],{"class":153,"line":2123},[151,3484,3323],{"class":1999},[151,3486,3487],{"class":537},"(container)",[151,3489,1996],{"class":198},[151,3491,3331],{"class":1999},[151,3493,3494],{"class":537},"(\n",[151,3496,3497,3500,3503],{"class":153,"line":2132},[151,3498,3499],{"class":198},"  \u003C",[151,3501,3502],{"class":157},"StrictMode",[151,3504,540],{"class":198},[151,3506,3507,3510,3513],{"class":153,"line":2137},[151,3508,3509],{"class":198},"    \u003C",[151,3511,3512],{"class":157},"App",[151,3514,3515],{"class":198}," \u002F>\n",[151,3517,3518,3521,3523],{"class":153,"line":2150},[151,3519,3520],{"class":198},"  \u003C\u002F",[151,3522,3502],{"class":157},[151,3524,3525],{"class":198},">,\n",[151,3527,3529],{"class":153,"line":3528},15,[151,3530,2791],{"class":537},[10,3532,3533,3535,3536,3538,3539,2645],{},[17,3534,3323],{},"へ渡したDOM要素の内側はReactが管理します。サーバー側でReactが生成したHTMLを再利用する場合は、",[17,3537,3323],{},"ではなく",[17,3540,3541],{},"hydrateRoot",[64,3543,3544],{"id":3544},"stateを直接変更しない",[10,3546,3547],{},"Reactのstateに保存したオブジェクトや配列は、読み取り専用として扱います。値を直接変更せず、新しい値を作ってset関数へ渡します。",[22,3549,3551],{"className":3335,"code":3550,"language":3337,"meta":28,"style":28},"setTodos(currentTodos =>\n  currentTodos.map(todo =>\n    todo.id === id\n      ? { ...todo, completed: true }\n      : todo,\n  ),\n)\n",[17,3552,3553,3567,3584,3600,3626,3636,3643],{"__ignoreMap":28},[151,3554,3555,3558,3560,3564],{"class":153,"line":154},[151,3556,3557],{"class":1999},"setTodos",[151,3559,2781],{"class":537},[151,3561,3563],{"class":3562},"sHdIc","currentTodos",[151,3565,3566],{"class":1903}," =>\n",[151,3568,3569,3572,3574,3577,3579,3582],{"class":153,"line":297},[151,3570,3571],{"class":537},"  currentTodos",[151,3573,1996],{"class":198},[151,3575,3576],{"class":1999},"map",[151,3578,2781],{"class":537},[151,3580,3581],{"class":3562},"todo",[151,3583,3566],{"class":1903},[151,3585,3586,3589,3591,3594,3597],{"class":153,"line":306},[151,3587,3588],{"class":537},"    todo",[151,3590,1996],{"class":198},[151,3592,3593],{"class":537},"id ",[151,3595,3596],{"class":198},"===",[151,3598,3599],{"class":537}," id\n",[151,3601,3602,3605,3607,3610,3612,3614,3617,3619,3623],{"class":153,"line":454},[151,3603,3604],{"class":198},"      ?",[151,3606,1966],{"class":198},[151,3608,3609],{"class":198}," ...",[151,3611,3581],{"class":537},[151,3613,1972],{"class":198},[151,3615,3616],{"class":1918}," completed",[151,3618,1922],{"class":198},[151,3620,3622],{"class":3621},"sfNiH"," true",[151,3624,3625],{"class":198}," }\n",[151,3627,3628,3631,3634],{"class":153,"line":523},[151,3629,3630],{"class":198},"      :",[151,3632,3633],{"class":537}," todo",[151,3635,1934],{"class":198},[151,3637,3638,3641],{"class":153,"line":612},[151,3639,3640],{"class":537},"  )",[151,3642,1934],{"class":198},[151,3644,3645],{"class":153,"line":617},[151,3646,2791],{"class":537},[10,3648,3649],{},"配列を新しく作っても、その中にあるオブジェクトまでは自動的に複製されません。更新対象のオブジェクトもスプレッド構文などで新しく作る必要があります。",[10,3651,3652],{},"配列を更新する際は、次のように破壊的な操作を避けます。",[1505,3654,3655,3668],{},[1508,3656,3657],{},[1511,3658,3659,3662,3665],{},[1514,3660,3661],{},"操作",[1514,3663,3664],{},"避けたい方法",[1514,3666,3667],{},"利用する方法",[1522,3669,3670,3689,3710,3724],{},[1511,3671,3672,3675,3683],{},[1527,3673,3674],{},"追加",[1527,3676,3677,91,3680],{},[17,3678,3679],{},"push",[17,3681,3682],{},"unshift",[1527,3684,3685,3686],{},"スプレッド構文、",[17,3687,3688],{},"concat",[1511,3690,3691,3694,3702],{},[1527,3692,3693],{},"削除",[1527,3695,3696,91,3699],{},[17,3697,3698],{},"pop",[17,3700,3701],{},"splice",[1527,3703,3704,91,3707],{},[17,3705,3706],{},"filter",[17,3708,3709],{},"slice",[1511,3711,3712,3715,3720],{},[1527,3713,3714],{},"置換",[1527,3716,3717,3718],{},"添字への代入、",[17,3719,3701],{},[1527,3721,3722],{},[17,3723,3576],{},[1511,3725,3726,3729,3735],{},[1527,3727,3728],{},"並び替え",[1527,3730,3731,3732],{},"元配列への",[17,3733,3734],{},"sort",[1527,3736,3737,3738],{},"コピー後に",[17,3739,3734],{},[64,3741,3742],{"id":3742},"直前のstateを基に更新する",[10,3744,3745],{},"更新後のstateが更新前の値に依存する場合は、set関数へ値ではなく更新用の関数を渡します。",[22,3747,3749],{"className":3335,"code":3748,"language":3337,"meta":28,"style":28},"setCount(currentCount => currentCount + 1)\n",[17,3750,3751],{"__ignoreMap":28},[151,3752,3753,3756,3758,3761,3763,3766,3769,3771],{"class":153,"line":154},[151,3754,3755],{"class":1999},"setCount",[151,3757,2781],{"class":537},[151,3759,3760],{"class":3562},"currentCount",[151,3762,2674],{"class":1903},[151,3764,3765],{"class":537}," currentCount ",[151,3767,3768],{"class":198},"+",[151,3770,1332],{"class":1331},[151,3772,2791],{"class":537},[10,3774,3775],{},"Reactはイベントハンドラーの処理をまとめてからstateを更新することがあります。更新用関数を使うことで、その時点の最新のstateを基に次の値を計算できます。",[64,3777,3778],{"id":3778},"イベントハンドラーの命名",[10,3780,3781,3782,3785,3786,3789],{},"イベントを処理する関数には",[17,3783,3784],{},"handle","、propsとして受け渡すイベントには",[17,3787,3788],{},"on","を付けると役割が伝わりやすくなります。",[22,3791,3793],{"className":3335,"code":3792,"language":3337,"meta":28,"style":28},"type TodoItemProps = {\n  onChange: (id: number) => void\n}\n\nfunction TodoItem({ onChange }: TodoItemProps) {\n  const handleChange = () => {\n    onChange(1)\n  }\n\n  return \u003Cinput type=\"checkbox\" onChange={handleChange} \u002F>\n}\n",[17,3794,3795,3807,3832,3836,3840,3863,3879,3890,3895,3899,3930],{"__ignoreMap":28},[151,3796,3797,3800,3803,3805],{"class":153,"line":154},[151,3798,3799],{"class":1903},"type",[151,3801,3802],{"class":157}," TodoItemProps",[151,3804,1981],{"class":198},[151,3806,1913],{"class":198},[151,3808,3809,3812,3814,3816,3819,3821,3824,3827,3829],{"class":153,"line":297},[151,3810,3811],{"class":1918},"  onChange",[151,3813,1922],{"class":198},[151,3815,3441],{"class":198},[151,3817,3818],{"class":3562},"id",[151,3820,1922],{"class":198},[151,3822,3823],{"class":157}," number",[151,3825,3826],{"class":198},")",[151,3828,2674],{"class":1903},[151,3830,3831],{"class":157}," void\n",[151,3833,3834],{"class":153,"line":306},[151,3835,1955],{"class":198},[151,3837,3838],{"class":153,"line":454},[151,3839,589],{"emptyLinePlaceholder":588},[151,3841,3842,3845,3848,3851,3854,3857,3859,3861],{"class":153,"line":523},[151,3843,3844],{"class":1903},"function",[151,3846,3847],{"class":1999}," TodoItem",[151,3849,3850],{"class":198},"({",[151,3852,3853],{"class":3562}," onChange",[151,3855,3856],{"class":198}," }:",[151,3858,3802],{"class":157},[151,3860,3826],{"class":198},[151,3862,1913],{"class":198},[151,3864,3865,3868,3871,3873,3875,3877],{"class":153,"line":612},[151,3866,3867],{"class":1903},"  const",[151,3869,3870],{"class":537}," handleChange",[151,3872,1981],{"class":198},[151,3874,2671],{"class":198},[151,3876,2674],{"class":1903},[151,3878,1913],{"class":198},[151,3880,3881,3884,3886,3888],{"class":153,"line":617},[151,3882,3883],{"class":1999},"    onChange",[151,3885,2781],{"class":1918},[151,3887,2559],{"class":1331},[151,3889,2791],{"class":1918},[151,3891,3892],{"class":153,"line":626},[151,3893,3894],{"class":198},"  }\n",[151,3896,3897],{"class":153,"line":2010},[151,3898,589],{"emptyLinePlaceholder":588},[151,3900,3901,3904,3906,3908,3910,3912,3914,3917,3919,3921,3924,3927],{"class":153,"line":2109},[151,3902,3903],{"class":3344},"  return",[151,3905,531],{"class":198},[151,3907,3215],{"class":1918},[151,3909,3218],{"class":1903},[151,3911,1910],{"class":198},[151,3913,3223],{"class":198},[151,3915,3916],{"class":161},"checkbox",[151,3918,3223],{"class":198},[151,3920,3853],{"class":1903},[151,3922,3923],{"class":198},"={",[151,3925,3926],{"class":537},"handleChange",[151,3928,3929],{"class":198},"} \u002F>\n",[151,3931,3932],{"class":153,"line":2123},[151,3933,1955],{"class":198},[10,3935,3936],{},"これはReactが強制する規則ではありませんが、一貫した命名はコードを読みやすくします。",[64,3938,3939],{"id":3939},"propsの分割代入",[10,3941,3942],{},"propsを分割代入すると記述は短くなりますが、変数がprops由来なのかコンポーネント内で定義されたものなのか分かりにくくなる場合があります。",[10,3944,3945],{},"コンポーネントが大きくなった場合は、変数名やコンポーネントの責務を見直し、値の出所を追いやすくすることが大切です。",[54,3947,3182],{"id":3948},"typescript",[64,3950,3952,2167,3955],{"id":3951},"documentgetelementbyidとnull",[17,3953,3954],{},"document.getElementById",[17,3956,2356],{},[10,3958,3959,3961,3962,3965,3966,3968],{},[17,3960,3954],{},"の戻り値は",[17,3963,3964],{},"HTMLElement | null","です。対象の要素が存在しない可能性があるため、利用前に",[17,3967,2356],{},"を確認します。",[22,3970,3973],{"className":3971,"code":3972,"language":3948,"meta":28,"style":28},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const container = document.getElementById('root')\n\nif (!container) {\n  throw new Error('root要素が見つかりません')\n}\n",[17,3974,3975,3999,4003,4015,4033],{"__ignoreMap":28},[151,3976,3977,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997],{"class":153,"line":154},[151,3978,1904],{"class":1903},[151,3980,3409],{"class":537},[151,3982,1910],{"class":198},[151,3984,2774],{"class":537},[151,3986,1996],{"class":198},[151,3988,3418],{"class":1999},[151,3990,2781],{"class":537},[151,3992,1931],{"class":198},[151,3994,3425],{"class":161},[151,3996,1931],{"class":198},[151,3998,2791],{"class":537},[151,4000,4001],{"class":153,"line":297},[151,4002,589],{"emptyLinePlaceholder":588},[151,4004,4005,4007,4009,4011,4013],{"class":153,"line":306},[151,4006,3438],{"class":3344},[151,4008,3441],{"class":537},[151,4010,3444],{"class":198},[151,4012,3447],{"class":537},[151,4014,3450],{"class":198},[151,4016,4017,4019,4021,4023,4025,4027,4029,4031],{"class":153,"line":454},[151,4018,3455],{"class":3344},[151,4020,3458],{"class":198},[151,4022,3461],{"class":1999},[151,4024,2781],{"class":1918},[151,4026,1931],{"class":198},[151,4028,3468],{"class":161},[151,4030,1931],{"class":198},[151,4032,2791],{"class":1918},[151,4034,4035],{"class":153,"line":523},[151,4036,1955],{"class":198},[10,4038,4039,4040,4042],{},"Non-nullアサーション演算子（",[17,4041,3444],{},"）で確認を省略することもできますが、実行時に要素が必ず存在することをTypeScriptが保証するわけではありません。",[64,4044,4046],{"id":4045},"readonly",[17,4047,4045],{},[10,4049,4050,4051,4053],{},"プロパティへ",[17,4052,4045],{},"を指定すると、そのプロパティへの再代入を型チェックで防げます。",[22,4055,4057],{"className":3971,"code":4056,"language":3948,"meta":28,"style":28},"type Todo = {\n  readonly id: number\n  title: string\n}\n",[17,4058,4059,4070,4083,4093],{"__ignoreMap":28},[151,4060,4061,4063,4066,4068],{"class":153,"line":154},[151,4062,3799],{"class":1903},[151,4064,4065],{"class":157}," Todo",[151,4067,1981],{"class":198},[151,4069,1913],{"class":198},[151,4071,4072,4075,4078,4080],{"class":153,"line":297},[151,4073,4074],{"class":1903},"  readonly",[151,4076,4077],{"class":1918}," id",[151,4079,1922],{"class":198},[151,4081,4082],{"class":157}," number\n",[151,4084,4085,4088,4090],{"class":153,"line":306},[151,4086,4087],{"class":1918},"  title",[151,4089,1922],{"class":198},[151,4091,4092],{"class":157}," string\n",[151,4094,4095],{"class":153,"line":454},[151,4096,1955],{"class":198},[10,4098,4099,4101],{},[17,4100,4045],{},"はコンパイル時の制約です。また、入れ子になったオブジェクトまで自動的に読み取り専用にするものではありません。",[64,4103,4104],{"id":4104},"イベントごとの型",[10,4106,4107],{},"Reactのイベントハンドラーでは、対象に応じたイベント型を利用できます。",[22,4109,4111],{"className":3335,"code":4110,"language":3337,"meta":28,"style":28},"function handleChange(event: React.ChangeEvent\u003CHTMLInputElement>) {\n  console.log(event.target.checked)\n}\n",[17,4112,4113,4144,4169],{"__ignoreMap":28},[151,4114,4115,4117,4119,4121,4124,4126,4129,4131,4134,4136,4139,4142],{"class":153,"line":154},[151,4116,3844],{"class":1903},[151,4118,3870],{"class":1999},[151,4120,2781],{"class":198},[151,4122,4123],{"class":3562},"event",[151,4125,1922],{"class":198},[151,4127,4128],{"class":157}," React",[151,4130,1996],{"class":198},[151,4132,4133],{"class":157},"ChangeEvent",[151,4135,3212],{"class":198},[151,4137,4138],{"class":157},"HTMLInputElement",[151,4140,4141],{"class":198},">)",[151,4143,1913],{"class":198},[151,4145,4146,4149,4151,4153,4155,4157,4159,4162,4164,4167],{"class":153,"line":297},[151,4147,4148],{"class":537},"  console",[151,4150,1996],{"class":198},[151,4152,2000],{"class":1999},[151,4154,2781],{"class":1918},[151,4156,4123],{"class":537},[151,4158,1996],{"class":198},[151,4160,4161],{"class":537},"target",[151,4163,1996],{"class":198},[151,4165,4166],{"class":537},"checked",[151,4168,2791],{"class":1918},[151,4170,4171],{"class":153,"line":306},[151,4172,1955],{"class":198},[10,4174,4175,4176,4179],{},"イベント型だけでなく、",[17,4177,4178],{},"ChangeEventHandler\u003CHTMLInputElement>","のようなハンドラー全体の型を付ける方法もあります。",[64,4181,4182],{"id":4182},"ジェネリクスの型引数へ制約を付ける",[10,4184,4185,4186,4189],{},"型引数に",[17,4187,4188],{},"extends","を指定すると、ジェネリクスで受け取れる型に必要なプロパティを保証できます。",[22,4191,4193],{"className":3971,"code":4192,"language":3948,"meta":28,"style":28},"type Identifiable = {\n  id: number\n}\n\nfunction findById\u003CT extends Identifiable>(items: T[], id: number) {\n  return items.find(item => item.id === id)\n}\n",[17,4194,4195,4206,4215,4219,4223,4266,4298],{"__ignoreMap":28},[151,4196,4197,4199,4202,4204],{"class":153,"line":154},[151,4198,3799],{"class":1903},[151,4200,4201],{"class":157}," Identifiable",[151,4203,1981],{"class":198},[151,4205,1913],{"class":198},[151,4207,4208,4211,4213],{"class":153,"line":297},[151,4209,4210],{"class":1918},"  id",[151,4212,1922],{"class":198},[151,4214,4082],{"class":157},[151,4216,4217],{"class":153,"line":306},[151,4218,1955],{"class":198},[151,4220,4221],{"class":153,"line":454},[151,4222,589],{"emptyLinePlaceholder":588},[151,4224,4225,4227,4230,4232,4235,4238,4240,4243,4246,4248,4251,4254,4256,4258,4260,4262,4264],{"class":153,"line":523},[151,4226,3844],{"class":1903},[151,4228,4229],{"class":1999}," findById",[151,4231,3212],{"class":198},[151,4233,4234],{"class":157},"T",[151,4236,4237],{"class":1903}," extends",[151,4239,4201],{"class":157},[151,4241,4242],{"class":198},">(",[151,4244,4245],{"class":3562},"items",[151,4247,1922],{"class":198},[151,4249,4250],{"class":157}," T",[151,4252,4253],{"class":537},"[]",[151,4255,1972],{"class":198},[151,4257,4077],{"class":3562},[151,4259,1922],{"class":198},[151,4261,3823],{"class":157},[151,4263,3826],{"class":198},[151,4265,1913],{"class":198},[151,4267,4268,4270,4272,4274,4277,4279,4282,4284,4287,4289,4291,4294,4296],{"class":153,"line":612},[151,4269,3903],{"class":3344},[151,4271,2870],{"class":537},[151,4273,1996],{"class":198},[151,4275,4276],{"class":1999},"find",[151,4278,2781],{"class":1918},[151,4280,4281],{"class":3562},"item",[151,4283,2674],{"class":1903},[151,4285,4286],{"class":537}," item",[151,4288,1996],{"class":198},[151,4290,3818],{"class":537},[151,4292,4293],{"class":198}," ===",[151,4295,4077],{"class":537},[151,4297,2791],{"class":1918},[151,4299,4300],{"class":153,"line":617},[151,4301,1955],{"class":198},[10,4303,4304,4305,4307,4308,4310],{},"制約がなければ",[17,4306,4234],{},"にどのような型が渡されるか分からないため、関数内で",[17,4309,3818],{},"へ安全にアクセスできません。",[64,4312,4314,4317],{"id":4313},"keyof型演算子",[17,4315,4316],{},"keyof","型演算子",[10,4319,4320,4322],{},[17,4321,4316],{},"は、オブジェクト型のプロパティ名からユニオン型を作る型演算子です。",[22,4324,4326],{"className":3971,"code":4325,"language":3948,"meta":28,"style":28},"type Todo = {\n  id: number\n  title: string\n}\n\ntype TodoKey = keyof Todo\n\u002F\u002F 'id' | 'title'\n",[17,4327,4328,4338,4346,4354,4358,4362,4377],{"__ignoreMap":28},[151,4329,4330,4332,4334,4336],{"class":153,"line":154},[151,4331,3799],{"class":1903},[151,4333,4065],{"class":157},[151,4335,1981],{"class":198},[151,4337,1913],{"class":198},[151,4339,4340,4342,4344],{"class":153,"line":297},[151,4341,4210],{"class":1918},[151,4343,1922],{"class":198},[151,4345,4082],{"class":157},[151,4347,4348,4350,4352],{"class":153,"line":306},[151,4349,4087],{"class":1918},[151,4351,1922],{"class":198},[151,4353,4092],{"class":157},[151,4355,4356],{"class":153,"line":454},[151,4357,1955],{"class":198},[151,4359,4360],{"class":153,"line":523},[151,4361,589],{"emptyLinePlaceholder":588},[151,4363,4364,4366,4369,4371,4374],{"class":153,"line":612},[151,4365,3799],{"class":1903},[151,4367,4368],{"class":157}," TodoKey",[151,4370,1981],{"class":198},[151,4372,4373],{"class":198}," keyof",[151,4375,4376],{"class":157}," Todo\n",[151,4378,4379],{"class":153,"line":617},[151,4380,4381],{"class":2006},"\u002F\u002F 'id' | 'title'\n",[10,4383,4384],{},"プロパティを追加・削除したときにユニオン型を手作業で更新する必要がなくなり、型定義との不整合を防ぎやすくなります。",[64,4386,4387],{"id":4387},"インデックスアクセス型",[10,4389,4390],{},"インデックスアクセス型を使うと、オブジェクト型から特定のプロパティの型を取り出せます。",[22,4392,4394],{"className":3971,"code":4393,"language":3948,"meta":28,"style":28},"type Todo = {\n  id: number\n  title: string\n}\n\ntype TodoId = Todo['id']\n\u002F\u002F number\n\ntype TodoValue = Todo[keyof Todo]\n\u002F\u002F number | string\n",[17,4395,4396,4406,4414,4422,4426,4430,4451,4456,4460,4479],{"__ignoreMap":28},[151,4397,4398,4400,4402,4404],{"class":153,"line":154},[151,4399,3799],{"class":1903},[151,4401,4065],{"class":157},[151,4403,1981],{"class":198},[151,4405,1913],{"class":198},[151,4407,4408,4410,4412],{"class":153,"line":297},[151,4409,4210],{"class":1918},[151,4411,1922],{"class":198},[151,4413,4082],{"class":157},[151,4415,4416,4418,4420],{"class":153,"line":306},[151,4417,4087],{"class":1918},[151,4419,1922],{"class":198},[151,4421,4092],{"class":157},[151,4423,4424],{"class":153,"line":454},[151,4425,1955],{"class":198},[151,4427,4428],{"class":153,"line":523},[151,4429,589],{"emptyLinePlaceholder":588},[151,4431,4432,4434,4437,4439,4441,4443,4445,4447,4449],{"class":153,"line":612},[151,4433,3799],{"class":1903},[151,4435,4436],{"class":157}," TodoId",[151,4438,1981],{"class":198},[151,4440,4065],{"class":157},[151,4442,2627],{"class":537},[151,4444,1931],{"class":198},[151,4446,3818],{"class":161},[151,4448,1931],{"class":198},[151,4450,2541],{"class":537},[151,4452,4453],{"class":153,"line":617},[151,4454,4455],{"class":2006},"\u002F\u002F number\n",[151,4457,4458],{"class":153,"line":626},[151,4459,589],{"emptyLinePlaceholder":588},[151,4461,4462,4464,4467,4469,4471,4473,4475,4477],{"class":153,"line":2010},[151,4463,3799],{"class":1903},[151,4465,4466],{"class":157}," TodoValue",[151,4468,1981],{"class":198},[151,4470,4065],{"class":157},[151,4472,2627],{"class":537},[151,4474,4316],{"class":198},[151,4476,4065],{"class":157},[151,4478,2541],{"class":537},[151,4480,4481],{"class":153,"line":2109},[151,4482,4483],{"class":2006},"\u002F\u002F number | string\n",[64,4485,4486],{"id":4486},"アンビエント宣言",[10,4488,4489,4492],{},[17,4490,4491],{},"declare","を使うと、実装が別の場所に存在する値や型をTypeScriptへ伝えられます。JavaScriptライブラリや実行環境が提供するグローバル変数の型を補う場合などに使用します。",[22,4494,4496],{"className":3971,"code":4495,"language":3948,"meta":28,"style":28},"declare const appVersion: string\n",[17,4497,4498],{"__ignoreMap":28},[151,4499,4500,4502,4505,4508,4510],{"class":153,"line":154},[151,4501,4491],{"class":1903},[151,4503,4504],{"class":1903}," const",[151,4506,4507],{"class":537}," appVersion",[151,4509,1922],{"class":198},[151,4511,4092],{"class":157},[10,4513,4514,4515,4518,4519,4521],{},"一般的には",[17,4516,4517],{},".d.ts","形式の型定義ファイルへ記述します。",[17,4520,4491],{},"は実行時の値を作成しないため、実体が存在しなければ実行時エラーになります。",[64,4523,4524],{"id":4524},"メソッドの型注釈",[10,4526,4527],{},"オブジェクト型のメソッドは、メソッド構文と関数プロパティ構文のどちらでも表現できます。",[22,4529,4531],{"className":3971,"code":4530,"language":3948,"meta":28,"style":28},"type Formatter = {\n  format(value: string): string\n}\n\ntype FormatterProperty = {\n  format: (value: string) => string\n}\n",[17,4532,4533,4544,4564,4568,4572,4583,4603],{"__ignoreMap":28},[151,4534,4535,4537,4540,4542],{"class":153,"line":154},[151,4536,3799],{"class":1903},[151,4538,4539],{"class":157}," Formatter",[151,4541,1981],{"class":198},[151,4543,1913],{"class":198},[151,4545,4546,4549,4551,4554,4556,4559,4562],{"class":153,"line":297},[151,4547,4548],{"class":1918},"  format",[151,4550,2781],{"class":198},[151,4552,4553],{"class":3562},"value",[151,4555,1922],{"class":198},[151,4557,4558],{"class":157}," string",[151,4560,4561],{"class":198},"):",[151,4563,4092],{"class":157},[151,4565,4566],{"class":153,"line":306},[151,4567,1955],{"class":198},[151,4569,4570],{"class":153,"line":454},[151,4571,589],{"emptyLinePlaceholder":588},[151,4573,4574,4576,4579,4581],{"class":153,"line":523},[151,4575,3799],{"class":1903},[151,4577,4578],{"class":157}," FormatterProperty",[151,4580,1981],{"class":198},[151,4582,1913],{"class":198},[151,4584,4585,4587,4589,4591,4593,4595,4597,4599,4601],{"class":153,"line":612},[151,4586,4548],{"class":1918},[151,4588,1922],{"class":198},[151,4590,3441],{"class":198},[151,4592,4553],{"class":3562},[151,4594,1922],{"class":198},[151,4596,4558],{"class":157},[151,4598,3826],{"class":198},[151,4600,2674],{"class":1903},[151,4602,4092],{"class":157},[151,4604,4605],{"class":153,"line":617},[151,4606,1955],{"class":198},[10,4608,4609,4610,4613],{},"両者には、継承や",[17,4611,4612],{},"strictFunctionTypes","における引数型の扱いなどで違いがあります。プロジェクト内で意図に合った書き方へ揃えることが大切です。",[64,4615,4616],{"id":4616},"型ガード",[10,4618,4619],{},"型ガードは、実行時の確認を通して変数の型を絞り込む仕組みです。ユーザー定義型ガードでは、戻り値の型に型述語を指定します。",[22,4621,4623],{"className":3971,"code":4622,"language":3948,"meta":28,"style":28},"function isNumber(value: unknown): value is number {\n  return typeof value === 'number'\n}\n\nconst value: unknown = 10\n\nif (isNumber(value)) {\n  console.log(value.toFixed(2))\n}\n",[17,4624,4625,4653,4671,4675,4679,4694,4698,4712,4737],{"__ignoreMap":28},[151,4626,4627,4629,4632,4634,4636,4638,4641,4643,4646,4649,4651],{"class":153,"line":154},[151,4628,3844],{"class":1903},[151,4630,4631],{"class":1999}," isNumber",[151,4633,2781],{"class":198},[151,4635,4553],{"class":3562},[151,4637,1922],{"class":198},[151,4639,4640],{"class":157}," unknown",[151,4642,4561],{"class":198},[151,4644,4645],{"class":3562}," value",[151,4647,4648],{"class":198}," is",[151,4650,3823],{"class":157},[151,4652,1913],{"class":198},[151,4654,4655,4657,4660,4662,4664,4666,4669],{"class":153,"line":297},[151,4656,3903],{"class":3344},[151,4658,4659],{"class":198}," typeof",[151,4661,4645],{"class":537},[151,4663,4293],{"class":198},[151,4665,1925],{"class":198},[151,4667,4668],{"class":161},"number",[151,4670,3040],{"class":198},[151,4672,4673],{"class":153,"line":306},[151,4674,1955],{"class":198},[151,4676,4677],{"class":153,"line":454},[151,4678,589],{"emptyLinePlaceholder":588},[151,4680,4681,4683,4685,4687,4689,4691],{"class":153,"line":523},[151,4682,1904],{"class":1903},[151,4684,4645],{"class":537},[151,4686,1922],{"class":198},[151,4688,4640],{"class":157},[151,4690,1981],{"class":198},[151,4692,4693],{"class":1331}," 10\n",[151,4695,4696],{"class":153,"line":612},[151,4697,589],{"emptyLinePlaceholder":588},[151,4699,4700,4702,4704,4707,4710],{"class":153,"line":617},[151,4701,3438],{"class":3344},[151,4703,3441],{"class":537},[151,4705,4706],{"class":1999},"isNumber",[151,4708,4709],{"class":537},"(value)) ",[151,4711,3450],{"class":198},[151,4713,4714,4716,4718,4720,4722,4724,4726,4729,4731,4734],{"class":153,"line":626},[151,4715,4148],{"class":537},[151,4717,1996],{"class":198},[151,4719,2000],{"class":1999},[151,4721,2781],{"class":1918},[151,4723,4553],{"class":537},[151,4725,1996],{"class":198},[151,4727,4728],{"class":1999},"toFixed",[151,4730,2781],{"class":1918},[151,4732,4733],{"class":1331},"2",[151,4735,4736],{"class":1918},"))\n",[151,4738,4739],{"class":153,"line":2010},[151,4740,1955],{"class":198},[10,4742,4743],{},"APIレスポンスなど外部から受け取った値は、型アサーションで決めつけるのではなく、実行時に検証してから利用すると安全です。",[54,4745,640],{"id":640},[10,4747,4748],{},"Todoアプリの実装を通して、HTML属性の使い方からReactのstate更新、TypeScriptの型操作まで、幅広い内容を学べました。",[10,4750,4751],{},"個々の構文を覚えるだけでなく、「なぜその書き方が必要なのか」を実際のアプリ開発と結び付けて理解することが大切だと感じました。",[688,4753,4754],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":28,"searchDepth":297,"depth":297,"links":4756},[4757,4760,4764,4771,4783],{"id":3185,"depth":297,"text":3174,"children":4758},[4759],{"id":3188,"depth":306,"text":3188},{"id":1896,"depth":297,"text":3149,"children":4761},[4762,4763],{"id":3246,"depth":306,"text":3246},{"id":3297,"depth":306,"text":3298},{"id":3317,"depth":297,"text":3179,"children":4765},[4766,4767,4768,4769,4770],{"id":3320,"depth":306,"text":3323},{"id":3544,"depth":306,"text":3544},{"id":3742,"depth":306,"text":3742},{"id":3778,"depth":306,"text":3778},{"id":3939,"depth":306,"text":3939},{"id":3948,"depth":297,"text":3182,"children":4772},[4773,4775,4776,4777,4778,4779,4780,4781,4782],{"id":3951,"depth":306,"text":4774},"document.getElementByIdとnull",{"id":4045,"depth":306,"text":4045},{"id":4104,"depth":306,"text":4104},{"id":4182,"depth":306,"text":4182},{"id":4313,"depth":306,"text":4313},{"id":4387,"depth":306,"text":4387},{"id":4486,"depth":306,"text":4486},{"id":4524,"depth":306,"text":4524},{"id":4616,"depth":306,"text":4616},{"id":640,"depth":297,"text":640},"React HooksとTypeScriptでTodoアプリを作るハンズオンを通して学んだ、HTML、JavaScript、React、TypeScriptのポイントを整理します。",{},"\u002Farticles\u002F2024\u002Forganize-learned-from-todo","2024-12-23",{"title":3154,"description":4784},"articles\u002F2024\u002Forganize-learned-from-todo",[3179,3182],"\u002Fimages\u002Farticles\u002Forganize-learned-from-todo.png","ic1Do2Gie9Gb4WmAmZ2IL55ETNgmySMOwEHT_s3q0bk",{"id":4794,"title":4795,"body":4796,"description":5273,"extension":712,"meta":5274,"navigation":588,"path":5275,"publishDate":5276,"published":588,"seo":5277,"stem":5278,"tags":5279,"thumbnail":5281,"updated":5276,"__hash__":5282},"articles\u002Farticles\u002F2024\u002Fdescribe-webstorage-indexeddb.md","Web StorageとIndexedDBについて整理する",{"type":7,"value":4797,"toc":5263},[4798,4800,4803,4813,4816,4819,4822,4825,4908,4911,4916,4919,4947,4958,5009,5012,5015,5023,5042,5045,5048,5051,5054,5057,5159,5162,5176,5179,5182,5185,5209,5215,5218,5221,5228,5231,5234,5249,5252,5254,5257,5260],[10,4799,12],{},[10,4801,4802],{},"Todoアプリを作った際にIndexedDBを利用したのですが、ブラウザにデータを保存する方法としてはWeb Storageもあります。",[10,4804,4805,4806,91,4809,4812],{},"今回は、",[17,4807,4808],{},"localStorage",[17,4810,4811],{},"sessionStorage","、IndexedDBの特徴と使い分けを整理します。",[54,4814,4815],{"id":4815},"ブラウザにデータを保存する仕組み",[10,4817,4818],{},"Web StorageとIndexedDBは、どちらもブラウザ側にデータを保存するためのWeb APIです。",[10,4820,4821],{},"保存したデータが自動的にサーバーへ送信されることはなく、同一オリジンの制約を受けます。ただし、保存容量やデータが削除される条件はブラウザや利用状況によって異なるため、永続性を前提にしすぎないことが大切です。",[10,4823,4824],{},"主な違いは次のとおりです。",[1505,4826,4827,4840],{},[1508,4828,4829],{},[1511,4830,4831,4833,4835,4837],{},[1514,4832,1516],{},[1514,4834,4808],{},[1514,4836,4811],{},[1514,4838,4839],{},"IndexedDB",[1522,4841,4842,4855,4868,4881,4894],{},[1511,4843,4844,4847,4850,4852],{},[1527,4845,4846],{},"保存形式",[1527,4848,4849],{},"文字列のキーバリュー",[1527,4851,4849],{},[1527,4853,4854],{},"オブジェクトやBlobなど",[1511,4856,4857,4860,4863,4865],{},[1527,4858,4859],{},"API",[1527,4861,4862],{},"同期",[1527,4864,4862],{},[1527,4866,4867],{},"非同期",[1511,4869,4870,4873,4876,4879],{},[1527,4871,4872],{},"データの範囲",[1527,4874,4875],{},"同一オリジン",[1527,4877,4878],{},"同一オリジンかつタブ単位",[1527,4880,4875],{},[1511,4882,4883,4886,4889,4892],{},[1527,4884,4885],{},"データの寿命",[1527,4887,4888],{},"明示的に削除されるまで",[1527,4890,4891],{},"タブを閉じるまで",[1527,4893,4888],{},[1511,4895,4896,4899,4902,4905],{},[1527,4897,4898],{},"得意な用途",[1527,4900,4901],{},"小さな設定値",[1527,4903,4904],{},"一時的な入力状態",[1527,4906,4907],{},"大量・構造化データ",[54,4909,4808],{"id":4910},"localstorage",[10,4912,4913,4915],{},[17,4914,4808],{},"は、文字列をキーバリュー形式で保存する同期APIです。",[10,4917,4918],{},"ブラウザやタブを閉じてもデータが残るため、テーマや表示設定など、小さく単純なデータの保存に向いています。",[22,4920,4922],{"className":1894,"code":4921,"language":1896,"meta":28,"style":28},"localStorage.setItem('theme', 'dark')\n\nconst theme = localStorage.getItem('theme')\n\nlocalStorage.removeItem('theme')\n",[17,4923,4924,4929,4933,4938,4942],{"__ignoreMap":28},[151,4925,4926],{"class":153,"line":154},[151,4927,4928],{},"localStorage.setItem('theme', 'dark')\n",[151,4930,4931],{"class":153,"line":297},[151,4932,589],{"emptyLinePlaceholder":588},[151,4934,4935],{"class":153,"line":306},[151,4936,4937],{},"const theme = localStorage.getItem('theme')\n",[151,4939,4940],{"class":153,"line":454},[151,4941,589],{"emptyLinePlaceholder":588},[151,4943,4944],{"class":153,"line":523},[151,4945,4946],{},"localStorage.removeItem('theme')\n",[10,4948,4949,4950,4953,4954,4957],{},"値は文字列として保存されます。オブジェクトを扱う場合は、保存時に",[17,4951,4952],{},"JSON.stringify()","、取得時に",[17,4955,4956],{},"JSON.parse()","が必要です。",[22,4959,4961],{"className":1894,"code":4960,"language":1896,"meta":28,"style":28},"const settings = {\n  theme: 'dark',\n  fontSize: 16,\n}\n\nlocalStorage.setItem('settings', JSON.stringify(settings))\n\nconst storedSettings = JSON.parse(\n  localStorage.getItem('settings') ?? '{}',\n)\n",[17,4962,4963,4968,4973,4978,4982,4986,4991,4995,5000,5005],{"__ignoreMap":28},[151,4964,4965],{"class":153,"line":154},[151,4966,4967],{},"const settings = {\n",[151,4969,4970],{"class":153,"line":297},[151,4971,4972],{},"  theme: 'dark',\n",[151,4974,4975],{"class":153,"line":306},[151,4976,4977],{},"  fontSize: 16,\n",[151,4979,4980],{"class":153,"line":454},[151,4981,1955],{},[151,4983,4984],{"class":153,"line":523},[151,4985,589],{"emptyLinePlaceholder":588},[151,4987,4988],{"class":153,"line":612},[151,4989,4990],{},"localStorage.setItem('settings', JSON.stringify(settings))\n",[151,4992,4993],{"class":153,"line":617},[151,4994,589],{"emptyLinePlaceholder":588},[151,4996,4997],{"class":153,"line":626},[151,4998,4999],{},"const storedSettings = JSON.parse(\n",[151,5001,5002],{"class":153,"line":2010},[151,5003,5004],{},"  localStorage.getItem('settings') ?? '{}',\n",[151,5006,5007],{"class":153,"line":2109},[151,5008,2791],{},[10,5010,5011],{},"同期APIのため、大きなデータを頻繁に読み書きするとメインスレッドを塞ぐ可能性があります。",[54,5013,4811],{"id":5014},"sessionstorage",[10,5016,5017,5019,5020,5022],{},[17,5018,4811],{},"も、文字列をキーバリュー形式で保存する同期APIです。基本的な操作方法は",[17,5021,4808],{},"と同じです。",[22,5024,5026],{"className":1894,"code":5025,"language":1896,"meta":28,"style":28},"sessionStorage.setItem('draft', '入力途中の内容')\n\nconst draft = sessionStorage.getItem('draft')\n",[17,5027,5028,5033,5037],{"__ignoreMap":28},[151,5029,5030],{"class":153,"line":154},[151,5031,5032],{},"sessionStorage.setItem('draft', '入力途中の内容')\n",[151,5034,5035],{"class":153,"line":297},[151,5036,589],{"emptyLinePlaceholder":588},[151,5038,5039],{"class":153,"line":306},[151,5040,5041],{},"const draft = sessionStorage.getItem('draft')\n",[10,5043,5044],{},"ページを再読み込みしてもデータは残りますが、保存領域はタブごとのページセッションに分かれ、タブを閉じるとデータも削除されます。",[10,5046,5047],{},"そのため、フォームの入力途中の状態や、画面遷移中だけ保持したい一時的な情報に向いています。",[54,5049,4839],{"id":5050},"indexeddb",[10,5052,5053],{},"IndexedDBは、大量の構造化データをブラウザへ保存するための非同期APIです。",[10,5055,5056],{},"JavaScriptのオブジェクトだけでなく、ファイルやBlobなども保存できます。また、オブジェクトストア、インデックス、トランザクションを利用できるため、検索や更新を伴うデータ管理に向いています。",[22,5058,5060],{"className":1894,"code":5059,"language":1896,"meta":28,"style":28},"const request = indexedDB.open('todo-app', 1)\n\nrequest.onupgradeneeded = () => {\n  const database = request.result\n\n  if (!database.objectStoreNames.contains('todos')) {\n    database.createObjectStore('todos', {\n      keyPath: 'id',\n      autoIncrement: true,\n    })\n  }\n}\n\nrequest.onsuccess = () => {\n  const database = request.result\n  const transaction = database.transaction('todos', 'readwrite')\n  const todos = transaction.objectStore('todos')\n\n  todos.add({ title: '記事を書く', completed: false })\n}\n",[17,5061,5062,5067,5071,5076,5081,5085,5090,5095,5100,5105,5110,5114,5118,5122,5127,5131,5137,5143,5148,5154],{"__ignoreMap":28},[151,5063,5064],{"class":153,"line":154},[151,5065,5066],{},"const request = indexedDB.open('todo-app', 1)\n",[151,5068,5069],{"class":153,"line":297},[151,5070,589],{"emptyLinePlaceholder":588},[151,5072,5073],{"class":153,"line":306},[151,5074,5075],{},"request.onupgradeneeded = () => {\n",[151,5077,5078],{"class":153,"line":454},[151,5079,5080],{},"  const database = request.result\n",[151,5082,5083],{"class":153,"line":523},[151,5084,589],{"emptyLinePlaceholder":588},[151,5086,5087],{"class":153,"line":612},[151,5088,5089],{},"  if (!database.objectStoreNames.contains('todos')) {\n",[151,5091,5092],{"class":153,"line":617},[151,5093,5094],{},"    database.createObjectStore('todos', {\n",[151,5096,5097],{"class":153,"line":626},[151,5098,5099],{},"      keyPath: 'id',\n",[151,5101,5102],{"class":153,"line":2010},[151,5103,5104],{},"      autoIncrement: true,\n",[151,5106,5107],{"class":153,"line":2109},[151,5108,5109],{},"    })\n",[151,5111,5112],{"class":153,"line":2123},[151,5113,3894],{},[151,5115,5116],{"class":153,"line":2132},[151,5117,1955],{},[151,5119,5120],{"class":153,"line":2137},[151,5121,589],{"emptyLinePlaceholder":588},[151,5123,5124],{"class":153,"line":2150},[151,5125,5126],{},"request.onsuccess = () => {\n",[151,5128,5129],{"class":153,"line":3528},[151,5130,5080],{},[151,5132,5134],{"class":153,"line":5133},16,[151,5135,5136],{},"  const transaction = database.transaction('todos', 'readwrite')\n",[151,5138,5140],{"class":153,"line":5139},17,[151,5141,5142],{},"  const todos = transaction.objectStore('todos')\n",[151,5144,5146],{"class":153,"line":5145},18,[151,5147,589],{"emptyLinePlaceholder":588},[151,5149,5151],{"class":153,"line":5150},19,[151,5152,5153],{},"  todos.add({ title: '記事を書く', completed: false })\n",[151,5155,5157],{"class":153,"line":5156},20,[151,5158,1955],{},[10,5160,5161],{},"Web Storageよりも扱う概念は多いものの、次のような用途で力を発揮します。",[260,5163,5164,5167,5170,5173],{},[263,5165,5166],{},"オフラインでも利用するアプリ",[263,5168,5169],{},"Todoやメモなど、件数が増えるデータ",[263,5171,5172],{},"検索や並び替えにインデックスを使いたいデータ",[263,5174,5175],{},"画像やファイルを含むデータ",[54,5177,5178],{"id":5178},"保存容量とデータの削除",[10,5180,5181],{},"ブラウザストレージの容量は、特定の数値をどの環境でも保証できるものではありません。ブラウザ、端末の空き容量、ユーザー設定などによって変わります。",[10,5183,5184],{},"利用状況はStorage APIから概算できます。",[22,5186,5188],{"className":1894,"code":5187,"language":1896,"meta":28,"style":28},"const estimate = await navigator.storage.estimate()\n\nconsole.log(estimate.usage)\nconsole.log(estimate.quota)\n",[17,5189,5190,5195,5199,5204],{"__ignoreMap":28},[151,5191,5192],{"class":153,"line":154},[151,5193,5194],{},"const estimate = await navigator.storage.estimate()\n",[151,5196,5197],{"class":153,"line":297},[151,5198,589],{"emptyLinePlaceholder":588},[151,5200,5201],{"class":153,"line":306},[151,5202,5203],{},"console.log(estimate.usage)\n",[151,5205,5206],{"class":153,"line":454},[151,5207,5208],{},"console.log(estimate.quota)\n",[38,5210,5212],{"title":5211,"type":41},"ブラウザストレージを唯一の保存先にしない",[10,5213,5214],{},"保存したデータは、ユーザーによるサイトデータの削除や、ブラウザのストレージ管理によって失われる場合があります。失われると困るデータはサーバーにも保存しましょう。",[54,5216,5217],{"id":5217},"セキュリティ上の注意",[10,5219,5220],{},"Web StorageとIndexedDBは、認証された同一オリジンのJavaScriptからアクセスできます。",[38,5222,5225],{"title":5223,"type":5224},"機密情報の保存に注意する","warning",[10,5226,5227],{},"クロスサイトスクリプティング（XSS）が発生すると、保存内容を読み取られる可能性があります。アクセストークンや個人情報などの機密情報を、安易に保存しないようにしましょう。",[54,5229,5230],{"id":5230},"どれを選ぶか",[10,5232,5233],{},"選び方を簡単にまとめると、次のようになります。",[260,5235,5236,5241,5246],{},[263,5237,5238,5239],{},"小さな設定をブラウザを閉じた後も残したい場合は",[17,5240,4808],{},[263,5242,5243,5244],{},"タブを開いている間だけ一時的に残したい場合は",[17,5245,4811],{},[263,5247,5248],{},"大量のデータや構造化データを非同期で扱いたい場合はIndexedDB",[10,5250,5251],{},"Web Storageは手軽ですが、同期APIであり文字列しか保存できません。データ量が増えるアプリや、検索・更新を伴うデータにはIndexedDBを検討するとよいでしょう。",[54,5253,640],{"id":640},[10,5255,5256],{},"Web StorageとIndexedDBは、どちらもブラウザ側へデータを保存できますが、得意な用途が異なります。",[10,5258,5259],{},"保存するデータの量や形式だけでなく、同期処理による影響、データを保持する期間、失われた場合の影響まで考えて選ぶことが大切です。",[688,5261,5262],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":28,"searchDepth":297,"depth":297,"links":5264},[5265,5266,5267,5268,5269,5270,5271,5272],{"id":4815,"depth":297,"text":4815},{"id":4910,"depth":297,"text":4808},{"id":5014,"depth":297,"text":4811},{"id":5050,"depth":297,"text":4839},{"id":5178,"depth":297,"text":5178},{"id":5217,"depth":297,"text":5217},{"id":5230,"depth":297,"text":5230},{"id":640,"depth":297,"text":640},"localStorage、sessionStorage、IndexedDBの違いを、保存形式、同期・非同期、データの寿命、用途から整理します。",{},"\u002Farticles\u002F2024\u002Fdescribe-webstorage-indexeddb","2024-12-22",{"title":4795,"description":5273},"articles\u002F2024\u002Fdescribe-webstorage-indexeddb",[5280,4839],"Web Storage","\u002Fimages\u002Farticles\u002Fdescribe-webstorage-indexeddb.png","3W_8UP01CjjLWIG3qOQhJB7e1YiLPuYONYyx_372v98",{"id":5284,"title":5285,"body":5286,"description":5761,"extension":712,"meta":5762,"navigation":588,"path":5763,"publishDate":5764,"published":588,"seo":5765,"stem":5766,"tags":5767,"thumbnail":5768,"updated":5764,"__hash__":5769},"articles\u002Farticles\u002F2024\u002Flearn-javascript-eventloop-from-runtime.md","JavaScriptのランタイム構成からイベントループを学ぶ",{"type":7,"value":5287,"toc":5751},[5288,5290,5299,5302,5306,5309,5312,5315,5332,5334,5337,5340,5404,5407,5440,5443,5446,5449,5452,5466,5469,5512,5515,5517,5520,5523,5537,5542,5545,5547,5550,5575,5578,5581,5583,5586,5589,5606,5609,5612,5687,5690,5696,5706,5715,5717,5737,5740,5749],[10,5289,12],{},[10,5291,5292,5293,5298],{},"今回は、JavaScriptのイベントループについて、動画「",[3163,5294,5297],{"href":5295,"rel":5296},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=eiC58R16hb8",[3167],"JavaScript Visualized - Event Loop, Web APIs, (Micro)task Queue","」で学んだ内容を整理します。",[10,5300,5301],{},"ブラウザでJavaScriptがどのように同期処理と非同期処理を扱っているのか、ランタイムを構成する要素から確認していきます。",[54,5303,5305],{"id":5304},"javascriptエンジンとホスト環境","JavaScriptエンジンとホスト環境",[10,5307,5308],{},"ブラウザでJavaScriptを実行するためには、JavaScriptエンジンとブラウザというホスト環境が連携します。",[10,5310,5311],{},"JavaScriptエンジンはコードを解析・実行し、ブラウザはタイマー、ネットワーク通信、DOMイベントなどの環境固有の機能を提供します。",[10,5313,5314],{},"イベントループを理解するうえでは、次の要素を押さえておくと全体像が見えやすくなります。",[260,5316,5317,5320,5323,5326,5329],{},[263,5318,5319],{},"コールスタック",[263,5321,5322],{},"Web APIs",[263,5324,5325],{},"タスクキュー",[263,5327,5328],{},"マイクロタスクキュー",[263,5330,5331],{},"イベントループ",[54,5333,5319],{"id":5319},[10,5335,5336],{},"コールスタックは、実行中の関数や実行コンテキストを管理するスタックです。",[10,5338,5339],{},"後から追加されたものが先に取り出される、後入れ先出し（LIFO）の構造になっています。",[22,5341,5343],{"className":1894,"code":5342,"language":1896,"meta":28,"style":28},"function a() {\n  console.log('a')\n}\n\nfunction b() {\n  a()\n}\n\nfunction c() {\n  b()\n}\n\nc()\n",[17,5344,5345,5350,5355,5359,5363,5368,5373,5377,5381,5386,5391,5395,5399],{"__ignoreMap":28},[151,5346,5347],{"class":153,"line":154},[151,5348,5349],{},"function a() {\n",[151,5351,5352],{"class":153,"line":297},[151,5353,5354],{},"  console.log('a')\n",[151,5356,5357],{"class":153,"line":306},[151,5358,1955],{},[151,5360,5361],{"class":153,"line":454},[151,5362,589],{"emptyLinePlaceholder":588},[151,5364,5365],{"class":153,"line":523},[151,5366,5367],{},"function b() {\n",[151,5369,5370],{"class":153,"line":612},[151,5371,5372],{},"  a()\n",[151,5374,5375],{"class":153,"line":617},[151,5376,1955],{},[151,5378,5379],{"class":153,"line":626},[151,5380,589],{"emptyLinePlaceholder":588},[151,5382,5383],{"class":153,"line":2010},[151,5384,5385],{},"function c() {\n",[151,5387,5388],{"class":153,"line":2109},[151,5389,5390],{},"  b()\n",[151,5392,5393],{"class":153,"line":2123},[151,5394,1955],{},[151,5396,5397],{"class":153,"line":2132},[151,5398,589],{"emptyLinePlaceholder":588},[151,5400,5401],{"class":153,"line":2137},[151,5402,5403],{},"c()\n",[10,5405,5406],{},"このコードは、次の流れで実行されます。",[648,5408,5409,5415,5424,5431],{},[263,5410,5411,5414],{},[17,5412,5413],{},"c()"," がスタックへ追加される",[263,5416,5417,5419,5420,5423],{},[17,5418,5413],{}," から呼ばれた ",[17,5421,5422],{},"b()"," が追加される",[263,5425,5426,5419,5428,5423],{},[17,5427,5422],{},[17,5429,5430],{},"a()",[263,5432,5433,91,5435,91,5437,5439],{},[17,5434,5430],{},[17,5436,5422],{},[17,5438,5413],{}," の順に処理を終えてスタックから取り除かれる",[10,5441,5442],{},"1つの長い同期処理がコールスタックを占有すると、その処理が終わるまでクリックや描画など、同じスレッド上のほかの処理を進められません。",[54,5444,5322],{"id":5445},"web-apis",[10,5447,5448],{},"Web APIsは、ブラウザというホスト環境が提供する機能です。",[10,5450,5451],{},"代表的なものには、次があります。",[260,5453,5454,5457,5460,5463],{},[263,5455,5456],{},"Fetch API",[263,5458,5459],{},"タイマー",[263,5461,5462],{},"Geolocation API",[263,5464,5465],{},"DOMイベント",[10,5467,5468],{},"JavaScriptからこれらの非同期APIを呼び出すと、ブラウザ側でタイマーの計測やネットワーク通信などが進みます。JavaScriptはその完了を待ってコールスタックを占有し続ける必要がないため、別のコードを実行できます。",[22,5470,5472],{"className":1894,"code":5471,"language":1896,"meta":28,"style":28},"navigator.geolocation.getCurrentPosition(\n  position => console.log(position),\n  error => console.error(error),\n)\n\nfetch('https:\u002F\u002Fexample.com\u002Fapi\u002Fdata')\n  .then(response => response.json())\n  .then(data => console.log(data))\n",[17,5473,5474,5479,5484,5489,5493,5497,5502,5507],{"__ignoreMap":28},[151,5475,5476],{"class":153,"line":154},[151,5477,5478],{},"navigator.geolocation.getCurrentPosition(\n",[151,5480,5481],{"class":153,"line":297},[151,5482,5483],{},"  position => console.log(position),\n",[151,5485,5486],{"class":153,"line":306},[151,5487,5488],{},"  error => console.error(error),\n",[151,5490,5491],{"class":153,"line":454},[151,5492,2791],{},[151,5494,5495],{"class":153,"line":523},[151,5496,589],{"emptyLinePlaceholder":588},[151,5498,5499],{"class":153,"line":612},[151,5500,5501],{},"fetch('https:\u002F\u002Fexample.com\u002Fapi\u002Fdata')\n",[151,5503,5504],{"class":153,"line":617},[151,5505,5506],{},"  .then(response => response.json())\n",[151,5508,5509],{"class":153,"line":626},[151,5510,5511],{},"  .then(data => console.log(data))\n",[10,5513,5514],{},"APIの処理が完了しても、コールバックがその場ですぐに実行されるとは限りません。実行可能になった処理は、タスクやマイクロタスクとしてキューへ登録されます。",[54,5516,5325],{"id":5325},[10,5518,5519],{},"タスクキューには、タイマーやイベントなどをきっかけに実行可能になったタスクが並びます。",[10,5521,5522],{},"代表的な例は次のとおりです。",[260,5524,5525,5531,5534],{},[263,5526,5527,5530],{},[17,5528,5529],{},"setTimeout()"," のコールバック",[263,5532,5533],{},"ユーザー操作のイベントハンドラー",[263,5535,5536],{},"メッセージイベント",[10,5538,5539,5541],{},[17,5540,5529],{}," に指定する時間は、コールバックが必ずその時間後に実行されるという意味ではありません。指定時間を経過したあとにタスクとして実行可能になるまでの最低待機時間です。",[10,5543,5544],{},"コールスタックや先に処理されるタスクが残っていれば、実際の実行はさらに遅くなります。",[54,5546,5328],{"id":5328},[10,5548,5549],{},"マイクロタスクキューには、主に次の処理が登録されます。",[260,5551,5552,5564,5570],{},[263,5553,5554,5555,91,5558,91,5561],{},"Promiseの ",[17,5556,5557],{},"then()",[17,5559,5560],{},"catch()",[17,5562,5563],{},"finally()",[263,5565,5566,5569],{},[17,5567,5568],{},"queueMicrotask()"," に渡したコールバック",[263,5571,5572,5530],{},[17,5573,5574],{},"MutationObserver",[10,5576,5577],{},"現在のタスクと同期処理が終わってコールスタックが空になると、次のタスクへ進む前にマイクロタスクキューが空になるまで処理されます。",[10,5579,5580],{},"マイクロタスクの実行中に新しいマイクロタスクが追加された場合も、同じタイミングで続けて処理されます。そのため、マイクロタスクを追加し続ける処理は、次のタスクや画面描画を遅らせる可能性があります。",[54,5582,5331],{"id":5331},[10,5584,5585],{},"イベントループは、コールスタックと各キューの状態を見ながら、実行する処理を選び続けます。",[10,5587,5588],{},"ブラウザ上の流れを単純化すると、次のようになります。",[648,5590,5591,5594,5597,5600,5603],{},[263,5592,5593],{},"1つのタスクを実行する",[263,5595,5596],{},"コールスタック上の同期処理を最後まで実行する",[263,5598,5599],{},"マイクロタスクキューを空になるまで処理する",[263,5601,5602],{},"必要に応じて画面を描画する",[263,5604,5605],{},"次のタスクへ進む",[54,5607,5608],{"id":5608},"コードで実行順を確認する",[10,5610,5611],{},"タスクとマイクロタスクの実行順を、コードで確認してみましょう。",[22,5613,5615],{"className":1894,"code":5614,"language":1896,"meta":28,"style":28},"console.log('start')\n\nsetTimeout(() => {\n  console.log('timeout')\n}, 0)\n\nPromise.resolve().then(() => {\n  console.log('promise')\n})\n\nqueueMicrotask(() => {\n  console.log('microtask')\n})\n\nconsole.log('end')\n",[17,5616,5617,5622,5626,5631,5636,5641,5645,5650,5655,5660,5664,5669,5674,5678,5682],{"__ignoreMap":28},[151,5618,5619],{"class":153,"line":154},[151,5620,5621],{},"console.log('start')\n",[151,5623,5624],{"class":153,"line":297},[151,5625,589],{"emptyLinePlaceholder":588},[151,5627,5628],{"class":153,"line":306},[151,5629,5630],{},"setTimeout(() => {\n",[151,5632,5633],{"class":153,"line":454},[151,5634,5635],{},"  console.log('timeout')\n",[151,5637,5638],{"class":153,"line":523},[151,5639,5640],{},"}, 0)\n",[151,5642,5643],{"class":153,"line":612},[151,5644,589],{"emptyLinePlaceholder":588},[151,5646,5647],{"class":153,"line":617},[151,5648,5649],{},"Promise.resolve().then(() => {\n",[151,5651,5652],{"class":153,"line":626},[151,5653,5654],{},"  console.log('promise')\n",[151,5656,5657],{"class":153,"line":2010},[151,5658,5659],{},"})\n",[151,5661,5662],{"class":153,"line":2109},[151,5663,589],{"emptyLinePlaceholder":588},[151,5665,5666],{"class":153,"line":2123},[151,5667,5668],{},"queueMicrotask(() => {\n",[151,5670,5671],{"class":153,"line":2132},[151,5672,5673],{},"  console.log('microtask')\n",[151,5675,5676],{"class":153,"line":2137},[151,5677,5659],{},[151,5679,5680],{"class":153,"line":2150},[151,5681,589],{"emptyLinePlaceholder":588},[151,5683,5684],{"class":153,"line":3528},[151,5685,5686],{},"console.log('end')\n",[10,5688,5689],{},"出力順は次のようになります。",[22,5691,5694],{"className":5692,"code":5693,"language":27,"meta":28},[25],"start\nend\npromise\nmicrotask\ntimeout\n",[17,5695,5693],{"__ignoreMap":28},[10,5697,5698,5699,87,5702,5705],{},"まず同期処理の ",[17,5700,5701],{},"start",[17,5703,5704],{},"end"," が出力されます。",[10,5707,5708,5709,5711,5712,5714],{},"続いて、登録された順にPromiseのコールバックと ",[17,5710,5568],{}," のコールバックがマイクロタスクとして実行されます。マイクロタスクキューが空になったあと、",[17,5713,5529],{}," のコールバックが次のタスクとして実行されます。",[54,5716,640],{"id":640},[260,5718,5719,5722,5725,5728,5731,5734],{},[263,5720,5721],{},"コールスタックは、実行中の関数をLIFOで管理する",[263,5723,5724],{},"ブラウザは、タイマーやネットワーク通信などのWeb APIsを提供する",[263,5726,5727],{},"タイマーやイベントのコールバックなどは、タスクとしてキューへ登録される",[263,5729,5730],{},"Promiseのコールバックなどは、マイクロタスクとして登録される",[263,5732,5733],{},"現在のタスクが完了すると、次のタスクより先にマイクロタスクが処理される",[263,5735,5736],{},"長い同期処理や増え続けるマイクロタスクは、画面の応答を遅らせる可能性がある",[10,5738,5739],{},"非同期処理の実行順で迷ったときは、「現在の同期処理」「マイクロタスク」「次のタスク」の順に分けて考えると整理しやすくなります。",[10,5741,5742,5743,5748],{},"より詳しい実行モデルは、",[3163,5744,5747],{"href":5745,"rel":5746},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fja\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FExecution_model",[3167],"MDNのJavaScript実行モデル","も参考になります。",[688,5750,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":5752},[5753,5754,5755,5756,5757,5758,5759,5760],{"id":5304,"depth":297,"text":5305},{"id":5319,"depth":297,"text":5319},{"id":5445,"depth":297,"text":5322},{"id":5325,"depth":297,"text":5325},{"id":5328,"depth":297,"text":5328},{"id":5331,"depth":297,"text":5331},{"id":5608,"depth":297,"text":5608},{"id":640,"depth":297,"text":640},"ブラウザのJavaScriptランタイムを構成するコールスタック、Web APIs、タスクキュー、マイクロタスクキューとイベントループの関係を整理します。",{},"\u002Farticles\u002F2024\u002Flearn-javascript-eventloop-from-runtime","2024-11-25",{"title":5285,"description":5761},"articles\u002F2024\u002Flearn-javascript-eventloop-from-runtime",[3149],"\u002Fimages\u002Farticles\u002Flearn-javascript-eventloop-from-runtime.png","BcnDDE_gLqK4tjYoVA9O89QF7-dNwS-6lyORZ07cH5g",{"id":5771,"title":5772,"body":5773,"description":6189,"extension":712,"meta":6190,"navigation":588,"path":6191,"publishDate":6192,"published":588,"seo":6193,"stem":6194,"tags":6195,"thumbnail":6196,"updated":6192,"__hash__":6197},"articles\u002Farticles\u002F2024\u002Fhow-to-use-javascript-built-in-objects.md","JavaScriptのビルトインオブジェクトのメソッドをどう使うか",{"type":7,"value":5774,"toc":6181},[5775,5777,5780,5783,5787,5790,5802,5811,5815,5825,5853,5870,5878,5881,5888,5928,5938,5946,5959,5983,5987,5994,6032,6038,6043,6064,6067,6076,6114,6124,6142,6144,6176,6179],[10,5776,12],{},[10,5778,5779],{},"今回は、プロジェクトで「なるほど」と思った、JavaScriptのビルトインオブジェクトのメソッドの使い方を紹介します。",[10,5781,5782],{},"具体的には、オブジェクトが自身のプロパティを持っているか、安全に確認する方法です。仕組みを知っておくと、オブジェクトに同名のメソッドが定義されている場合も意図した判定ができます。",[54,5784,5786],{"id":5785},"ビルトインオブジェクトってなに","「ビルトインオブジェクト」ってなに？",[10,5788,5789],{},"ビルトインオブジェクトは「組み込みオブジェクト」とも呼ばれ、JavaScriptの実行環境にあらかじめ用意されているオブジェクトです。",[10,5791,5792,91,5795,91,5798,5801],{},[17,5793,5794],{},"Object",[17,5796,5797],{},"Array",[17,5799,5800],{},"String"," など、さまざまな種類があります。",[10,5803,5804,5805,5810],{},"詳しくは、",[3163,5806,5809],{"href":5807,"rel":5808},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fja\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects",[3167],"MDNの標準組み込みオブジェクト","を参照してください。",[54,5812,5814],{"id":5813},"hasownpropertyをインスタンスから呼び出す","hasOwnPropertyをインスタンスから呼び出す",[10,5816,5817,5818,5820,5821,5824],{},"まずは、オブジェクト自身が ",[17,5819,2338],{}," プロパティを持っているか、",[17,5822,5823],{},"hasOwnProperty()"," で確認してみます。",[22,5826,5828],{"className":1894,"code":5827,"language":1896,"meta":28,"style":28},"const obj = {\n  name: 'Yuri',\n}\n\nobj.hasOwnProperty('name') \u002F\u002F true\n",[17,5829,5830,5835,5840,5844,5848],{"__ignoreMap":28},[151,5831,5832],{"class":153,"line":154},[151,5833,5834],{},"const obj = {\n",[151,5836,5837],{"class":153,"line":297},[151,5838,5839],{},"  name: 'Yuri',\n",[151,5841,5842],{"class":153,"line":306},[151,5843,1955],{},[151,5845,5846],{"class":153,"line":454},[151,5847,589],{"emptyLinePlaceholder":588},[151,5849,5850],{"class":153,"line":523},[151,5851,5852],{},"obj.hasOwnProperty('name') \u002F\u002F true\n",[10,5854,5855,5856,5859,5860,5863,5864,5866,5867,5869],{},"オブジェクトリテラルで作成した ",[17,5857,5858],{},"obj"," は、通常 ",[17,5861,5862],{},"Object.prototype"," を継承しています。そのため、",[17,5865,5862],{}," に定義されている ",[17,5868,5823],{}," を呼び出せます。",[10,5871,5872,5873,5748],{},"プロトタイプ継承については、",[3163,5874,5877],{"href":5875,"rel":5876},"https:\u002F\u002Fja.javascript.info\u002Fprototype-inheritance",[3167],"JavaScript.infoのプロトタイプ継承",[54,5879,5880],{"id":5880},"インスタンスから呼び出す場合の問題",[10,5882,5883,5884,5887],{},"では、オブジェクト自身が ",[17,5885,5886],{},"hasOwnProperty"," という同名のメソッドを持っていたらどうなるでしょうか。",[22,5889,5891],{"className":1894,"code":5890,"language":1896,"meta":28,"style":28},"const obj = {\n  name: 'Yuri',\n  hasOwnProperty() {\n    console.log('Hello')\n  },\n}\n\nobj.hasOwnProperty('name') \u002F\u002F 「Hello」と出力される\n",[17,5892,5893,5897,5901,5906,5911,5915,5919,5923],{"__ignoreMap":28},[151,5894,5895],{"class":153,"line":154},[151,5896,5834],{},[151,5898,5899],{"class":153,"line":297},[151,5900,5839],{},[151,5902,5903],{"class":153,"line":306},[151,5904,5905],{},"  hasOwnProperty() {\n",[151,5907,5908],{"class":153,"line":454},[151,5909,5910],{},"    console.log('Hello')\n",[151,5912,5913],{"class":153,"line":523},[151,5914,2086],{},[151,5916,5917],{"class":153,"line":612},[151,5918,1955],{},[151,5920,5921],{"class":153,"line":617},[151,5922,589],{"emptyLinePlaceholder":588},[151,5924,5925],{"class":153,"line":626},[151,5926,5927],{},"obj.hasOwnProperty('name') \u002F\u002F 「Hello」と出力される\n",[10,5929,5930,5931,5934,5935,5937],{},"先ほどは ",[17,5932,5933],{},"true"," を返していた呼び出しが、今度は ",[17,5936,1928],{}," を出力しました。",[10,5939,5940,5942,5943,5945],{},[17,5941,5858],{}," 自身の ",[17,5944,5886],{}," が、プロトタイプから継承した同名メソッドよりも優先されたためです。外部から受け取ったオブジェクトなど、自分で構造を完全に管理できない値では、インスタンスから直接呼び出す方法は意図しない結果につながる可能性があります。",[10,5947,5948,5949,5952,5953,5955,5956,5958],{},"また、",[17,5950,5951],{},"Object.create(null)"," で作ったオブジェクトは ",[17,5954,5862],{}," を継承しないため、そもそも ",[17,5957,5823],{}," を持っていません。",[22,5960,5962],{"className":1894,"code":5961,"language":1896,"meta":28,"style":28},"const obj = Object.create(null)\nobj.name = 'Yuri'\n\nobj.hasOwnProperty('name') \u002F\u002F TypeError\n",[17,5963,5964,5969,5974,5978],{"__ignoreMap":28},[151,5965,5966],{"class":153,"line":154},[151,5967,5968],{},"const obj = Object.create(null)\n",[151,5970,5971],{"class":153,"line":297},[151,5972,5973],{},"obj.name = 'Yuri'\n",[151,5975,5976],{"class":153,"line":306},[151,5977,589],{"emptyLinePlaceholder":588},[151,5979,5980],{"class":153,"line":454},[151,5981,5982],{},"obj.hasOwnProperty('name') \u002F\u002F TypeError\n",[54,5984,5986],{"id":5985},"objecthasownを使う","Object.hasOwnを使う",[10,5988,5989,5990,5993],{},"現在は、オブジェクト自身のプロパティを調べる場合、静的メソッドの ",[17,5991,5992],{},"Object.hasOwn()"," を使うと簡潔です。",[22,5995,5997],{"className":1894,"code":5996,"language":1896,"meta":28,"style":28},"const obj = {\n  name: 'Yuri',\n  hasOwnProperty() {\n    console.log('Hello')\n  },\n}\n\nObject.hasOwn(obj, 'name') \u002F\u002F true\n",[17,5998,5999,6003,6007,6011,6015,6019,6023,6027],{"__ignoreMap":28},[151,6000,6001],{"class":153,"line":154},[151,6002,5834],{},[151,6004,6005],{"class":153,"line":297},[151,6006,5839],{},[151,6008,6009],{"class":153,"line":306},[151,6010,5905],{},[151,6012,6013],{"class":153,"line":454},[151,6014,5910],{},[151,6016,6017],{"class":153,"line":523},[151,6018,2086],{},[151,6020,6021],{"class":153,"line":612},[151,6022,1955],{},[151,6024,6025],{"class":153,"line":617},[151,6026,589],{"emptyLinePlaceholder":588},[151,6028,6029],{"class":153,"line":626},[151,6030,6031],{},"Object.hasOwn(obj, 'name') \u002F\u002F true\n",[10,6033,6034,6035,6037],{},"第1引数に調べたいオブジェクト、第2引数にプロパティ名を渡します。対象のオブジェクトに同名の ",[17,6036,5886],{}," が定義されていても影響を受けません。",[10,6039,6040,6042],{},[17,6041,5951],{}," で作ったオブジェクトにも使用できます。",[22,6044,6046],{"className":1894,"code":6045,"language":1896,"meta":28,"style":28},"const obj = Object.create(null)\nobj.name = 'Yuri'\n\nObject.hasOwn(obj, 'name') \u002F\u002F true\n",[17,6047,6048,6052,6056,6060],{"__ignoreMap":28},[151,6049,6050],{"class":153,"line":154},[151,6051,5968],{},[151,6053,6054],{"class":153,"line":297},[151,6055,5973],{},[151,6057,6058],{"class":153,"line":306},[151,6059,589],{"emptyLinePlaceholder":588},[151,6061,6062],{"class":153,"line":454},[151,6063,6031],{},[54,6065,6066],{"id":6066},"古い実行環境も考慮する場合",[10,6068,6069,6071,6072,6075],{},[17,6070,5992],{}," を利用できない古い実行環境まで考慮する場合は、",[17,6073,6074],{},"Object.prototype.hasOwnProperty.call()"," という書き方もできます。",[22,6077,6079],{"className":1894,"code":6078,"language":1896,"meta":28,"style":28},"const obj = {\n  name: 'Yuri',\n  hasOwnProperty() {\n    console.log('Hello')\n  },\n}\n\nObject.prototype.hasOwnProperty.call(obj, 'name') \u002F\u002F true\n",[17,6080,6081,6085,6089,6093,6097,6101,6105,6109],{"__ignoreMap":28},[151,6082,6083],{"class":153,"line":154},[151,6084,5834],{},[151,6086,6087],{"class":153,"line":297},[151,6088,5839],{},[151,6090,6091],{"class":153,"line":306},[151,6092,5905],{},[151,6094,6095],{"class":153,"line":454},[151,6096,5910],{},[151,6098,6099],{"class":153,"line":523},[151,6100,2086],{},[151,6102,6103],{"class":153,"line":612},[151,6104,1955],{},[151,6106,6107],{"class":153,"line":617},[151,6108,589],{"emptyLinePlaceholder":588},[151,6110,6111],{"class":153,"line":626},[151,6112,6113],{},"Object.prototype.hasOwnProperty.call(obj, 'name') \u002F\u002F true\n",[10,6115,6116,6119,6120,6123],{},[17,6117,6118],{},"call()"," の第1引数に ",[17,6121,6122],{},"this"," として扱うオブジェクトを指定し、それ以降の引数を元のメソッドへ渡しています。",[10,6125,6126,6127,6129,6130,6132,6133,6135,6136,6138,6139,6141],{},"この例では ",[17,6128,5862],{}," が持つ本来の ",[17,6131,5823],{}," を直接取得し、",[17,6134,5858],{}," を ",[17,6137,6122],{}," として呼び出しています。そのため、",[17,6140,5858],{}," 自身に定義された同名メソッドの影響を受けません。",[54,6143,640],{"id":640},[260,6145,6146,6152,6155,6162,6169],{},[263,6147,6148,6149,6151],{},"オブジェクトリテラルは通常、",[17,6150,5862],{}," のメソッドを継承する",[263,6153,6154],{},"オブジェクト自身が同名メソッドを持つと、継承したメソッドは隠される",[263,6156,6157,5952,6159,6161],{},[17,6158,5951],{},[17,6160,5823],{}," を継承しない",[263,6163,6164,6165,6168],{},"自身のプロパティを確認する場合は、基本的に ",[17,6166,6167],{},"Object.hasOwn(obj, property)"," を使う",[263,6170,6171,6172,6175],{},"古い実行環境も考慮する場合は、",[17,6173,6174],{},"Object.prototype.hasOwnProperty.call(obj, property)"," を使える",[10,6177,6178],{},"オブジェクトの出所や構造を完全には把握できない場合も、インスタンスの同名メソッドに依存しない呼び出し方を選ぶと安全です。",[688,6180,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":6182},[6183,6184,6185,6186,6187,6188],{"id":5785,"depth":297,"text":5786},{"id":5813,"depth":297,"text":5814},{"id":5880,"depth":297,"text":5880},{"id":5985,"depth":297,"text":5986},{"id":6066,"depth":297,"text":6066},{"id":640,"depth":297,"text":640},"JavaScriptでオブジェクト自身のプロパティを安全に確認する方法を、hasOwnPropertyとObject.hasOwnの違いから整理します。",{},"\u002Farticles\u002F2024\u002Fhow-to-use-javascript-built-in-objects","2024-11-24",{"title":5772,"description":6189},"articles\u002F2024\u002Fhow-to-use-javascript-built-in-objects",[3149],"\u002Fimages\u002Farticles\u002Fhow-to-use-javascript-built-in-objects.png","nujvvO9Kj5xXhtbuHUxO1l6JeNtgWjuj3S4rljZKkdU",{"id":6199,"title":6200,"body":6201,"description":6580,"extension":712,"meta":6581,"navigation":588,"path":6582,"publishDate":6583,"published":588,"seo":6584,"stem":6585,"tags":6586,"thumbnail":6587,"updated":6583,"__hash__":6588},"articles\u002Farticles\u002F2024\u002Fdescribe-javascript-deepcopy.md","JavaScriptのディープコピーとは？",{"type":7,"value":6202,"toc":6573},[6203,6205,6208,6211,6215,6218,6221,6230,6233,6240,6291,6304,6319,6322,6346,6349,6358,6362,6369,6415,6420,6435,6438,6462,6477,6484,6493,6497,6500,6509,6512,6537,6543,6545,6568,6571],[10,6204,12],{},[10,6206,6207],{},"今回は、JavaScriptにおけるオブジェクトのディープコピーについて紹介します。",[10,6209,6210],{},"シャローコピーとの違いや実装方法を理解しておくと、コピー先の変更が意図せずコピー元へ影響する問題を避けられます。",[54,6212,6214],{"id":6213},"ディープコピーとは","ディープコピーとは？",[10,6216,6217],{},"ディープコピーとは、コピー元とコピー先が、内部にあるオブジェクトの参照を共有しないコピーのことです。",[10,6219,6220],{},"たとえば、入れ子になったオブジェクトをコピーしたあと、コピー先の内側にある値を変更しても、コピー元の値には影響しません。",[10,6222,6223,6224,6229],{},"詳しい定義は、",[3163,6225,6228],{"href":6226,"rel":6227},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fja\u002Fdocs\u002FGlossary\u002FDeep_copy",[3167],"MDNのディープコピー","も参照してください。",[54,6231,6232],{"id":6232},"シャローコピーでは参照が共有される",[10,6234,6235,6236,6239],{},"まずは、",[17,6237,6238],{},"Object.assign()"," を使ったシャローコピーを確認します。",[22,6241,6243],{"className":1894,"code":6242,"language":1896,"meta":28,"style":28},"const original = {\n  user: {\n    name: 'Yuri',\n  },\n  settings: {\n    theme: 'light',\n  },\n}\n\nconst shallowCopy = Object.assign({}, original)\n",[17,6244,6245,6250,6255,6260,6264,6269,6274,6278,6282,6286],{"__ignoreMap":28},[151,6246,6247],{"class":153,"line":154},[151,6248,6249],{},"const original = {\n",[151,6251,6252],{"class":153,"line":297},[151,6253,6254],{},"  user: {\n",[151,6256,6257],{"class":153,"line":306},[151,6258,6259],{},"    name: 'Yuri',\n",[151,6261,6262],{"class":153,"line":454},[151,6263,2086],{},[151,6265,6266],{"class":153,"line":523},[151,6267,6268],{},"  settings: {\n",[151,6270,6271],{"class":153,"line":612},[151,6272,6273],{},"    theme: 'light',\n",[151,6275,6276],{"class":153,"line":617},[151,6277,2086],{},[151,6279,6280],{"class":153,"line":626},[151,6281,1955],{},[151,6283,6284],{"class":153,"line":2010},[151,6285,589],{"emptyLinePlaceholder":588},[151,6287,6288],{"class":153,"line":2109},[151,6289,6290],{},"const shallowCopy = Object.assign({}, original)\n",[10,6292,6293,6296,6297,6299,6300,6303],{},[17,6294,6295],{},"Object.assign({}, original)"," で新しい外側のオブジェクトは作られますが、",[17,6298,2938],{}," や ",[17,6301,6302],{},"settings"," はコピー元と同じオブジェクトを参照しています。",[22,6305,6307],{"className":1894,"code":6306,"language":1896,"meta":28,"style":28},"console.log(original === shallowCopy) \u002F\u002F false\nconsole.log(original.user === shallowCopy.user) \u002F\u002F true\n",[17,6308,6309,6314],{"__ignoreMap":28},[151,6310,6311],{"class":153,"line":154},[151,6312,6313],{},"console.log(original === shallowCopy) \u002F\u002F false\n",[151,6315,6316],{"class":153,"line":297},[151,6317,6318],{},"console.log(original.user === shallowCopy.user) \u002F\u002F true\n",[10,6320,6321],{},"そのため、コピー先にある入れ子の値を変更すると、コピー元にも影響します。",[22,6323,6325],{"className":1894,"code":6324,"language":1896,"meta":28,"style":28},"shallowCopy.user.name = 'Kohei'\n\nconsole.log(original.user.name) \u002F\u002F 「Kohei」\nconsole.log(shallowCopy.user.name) \u002F\u002F 「Kohei」\n",[17,6326,6327,6332,6336,6341],{"__ignoreMap":28},[151,6328,6329],{"class":153,"line":154},[151,6330,6331],{},"shallowCopy.user.name = 'Kohei'\n",[151,6333,6334],{"class":153,"line":297},[151,6335,589],{"emptyLinePlaceholder":588},[151,6337,6338],{"class":153,"line":306},[151,6339,6340],{},"console.log(original.user.name) \u002F\u002F 「Kohei」\n",[151,6342,6343],{"class":153,"line":454},[151,6344,6345],{},"console.log(shallowCopy.user.name) \u002F\u002F 「Kohei」\n",[10,6347,6348],{},"オブジェクトスプレッド構文も、同様にシャローコピーです。",[22,6350,6352],{"className":1894,"code":6351,"language":1896,"meta":28,"style":28},"const shallowCopy = { ...original }\n",[17,6353,6354],{"__ignoreMap":28},[151,6355,6356],{"class":153,"line":154},[151,6357,6351],{},[54,6359,6361],{"id":6360},"structuredcloneでディープコピーする","structuredCloneでディープコピーする",[10,6363,6364,6365,6368],{},"ディープコピーには、",[17,6366,6367],{},"structuredClone()"," を利用できます。",[22,6370,6372],{"className":1894,"code":6371,"language":1896,"meta":28,"style":28},"const original = {\n  user: {\n    name: 'Yuri',\n  },\n  settings: {\n    theme: 'light',\n  },\n}\n\nconst deepCopy = structuredClone(original)\n",[17,6373,6374,6378,6382,6386,6390,6394,6398,6402,6406,6410],{"__ignoreMap":28},[151,6375,6376],{"class":153,"line":154},[151,6377,6249],{},[151,6379,6380],{"class":153,"line":297},[151,6381,6254],{},[151,6383,6384],{"class":153,"line":306},[151,6385,6259],{},[151,6387,6388],{"class":153,"line":454},[151,6389,2086],{},[151,6391,6392],{"class":153,"line":523},[151,6393,6268],{},[151,6395,6396],{"class":153,"line":612},[151,6397,6273],{},[151,6399,6400],{"class":153,"line":617},[151,6401,2086],{},[151,6403,6404],{"class":153,"line":626},[151,6405,1955],{},[151,6407,6408],{"class":153,"line":2010},[151,6409,589],{"emptyLinePlaceholder":588},[151,6411,6412],{"class":153,"line":2109},[151,6413,6414],{},"const deepCopy = structuredClone(original)\n",[10,6416,6417,6419],{},[17,6418,6367],{}," で作ったコピーは、入れ子のオブジェクトもコピー元とは異なる参照になります。",[22,6421,6423],{"className":1894,"code":6422,"language":1896,"meta":28,"style":28},"console.log(original === deepCopy) \u002F\u002F false\nconsole.log(original.user === deepCopy.user) \u002F\u002F false\n",[17,6424,6425,6430],{"__ignoreMap":28},[151,6426,6427],{"class":153,"line":154},[151,6428,6429],{},"console.log(original === deepCopy) \u002F\u002F false\n",[151,6431,6432],{"class":153,"line":297},[151,6433,6434],{},"console.log(original.user === deepCopy.user) \u002F\u002F false\n",[10,6436,6437],{},"コピー先を変更しても、コピー元には影響しません。",[22,6439,6441],{"className":1894,"code":6440,"language":1896,"meta":28,"style":28},"deepCopy.user.name = 'Kohei'\n\nconsole.log(original.user.name) \u002F\u002F 「Yuri」\nconsole.log(deepCopy.user.name) \u002F\u002F 「Kohei」\n",[17,6442,6443,6448,6452,6457],{"__ignoreMap":28},[151,6444,6445],{"class":153,"line":154},[151,6446,6447],{},"deepCopy.user.name = 'Kohei'\n",[151,6449,6450],{"class":153,"line":297},[151,6451,589],{"emptyLinePlaceholder":588},[151,6453,6454],{"class":153,"line":306},[151,6455,6456],{},"console.log(original.user.name) \u002F\u002F 「Yuri」\n",[151,6458,6459],{"class":153,"line":454},[151,6460,6461],{},"console.log(deepCopy.user.name) \u002F\u002F 「Kohei」\n",[10,6463,6464,6466,6467,91,6470,91,6473,6476],{},[17,6465,6367],{}," は通常のオブジェクトや配列だけでなく、",[17,6468,6469],{},"Date",[17,6471,6472],{},"Map",[17,6474,6475],{},"Set"," など、構造化複製アルゴリズムが対応している型をコピーできます。また、循環参照を持つオブジェクトにも対応しています。",[10,6478,6479,6480,6483],{},"ただし、関数など構造化複製できない値が含まれている場合は ",[17,6481,6482],{},"DataCloneError"," が発生します。すべてのJavaScriptの値を無条件にコピーできるわけではありません。",[10,6485,6486,6487,6492],{},"詳しい対応範囲は、",[3163,6488,6491],{"href":6489,"rel":6490},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fja\u002Fdocs\u002FWeb\u002FAPI\u002FWindow\u002FstructuredClone",[3167],"MDNのstructuredClone()","を確認してください。",[54,6494,6496],{"id":6495},"jsonを使ったディープコピーの注意点","JSONを使ったディープコピーの注意点",[10,6498,6499],{},"単純なデータだけを扱う場合、JSONへ変換して戻す方法もあります。",[22,6501,6503],{"className":1894,"code":6502,"language":1896,"meta":28,"style":28},"const deepCopy = JSON.parse(JSON.stringify(original))\n",[17,6504,6505],{"__ignoreMap":28},[151,6506,6507],{"class":153,"line":154},[151,6508,6502],{},[10,6510,6511],{},"ただし、この方法はJSONとして表現できる値に限られます。",[260,6513,6514,6519,6528,6534],{},[263,6515,6516,6518],{},[17,6517,6469],{}," は文字列へ変換される",[263,6520,6521,6523,6524,6527],{},[17,6522,2360],{},"、関数、",[17,6525,6526],{},"Symbol"," などは正しく保持できない",[263,6529,6530,6533],{},[17,6531,6532],{},"BigInt"," を含むと例外が発生する",[263,6535,6536],{},"循環参照を持つオブジェクトは変換できない",[10,6538,6539,6540,6542],{},"対象がJSON互換のデータだと分かっている場合には使えますが、一般的なディープコピーとしては ",[17,6541,6367],{}," の方が意図を表しやすく、扱える型も多くなります。",[54,6544,640],{"id":640},[260,6546,6547,6552,6555,6560,6565],{},[263,6548,6549,6551],{},[17,6550,6238],{}," とオブジェクトスプレッド構文はシャローコピーになる",[263,6553,6554],{},"シャローコピーでは、入れ子のオブジェクトの参照がコピー元と共有される",[263,6556,6557,6559],{},[17,6558,6367],{}," を使うと、対応している値をディープコピーできる",[263,6561,6562,6564],{},[17,6563,6367],{}," でも、関数などコピーできない値がある",[263,6566,6567],{},"JSONによるコピーは、JSON互換データだけに限定して使う",[10,6569,6570],{},"コピー方法を選ぶときは、対象のデータ構造と、コピー後にどの階層まで独立して変更したいかを確認することが大切です。",[688,6572,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":6574},[6575,6576,6577,6578,6579],{"id":6213,"depth":297,"text":6214},{"id":6232,"depth":297,"text":6232},{"id":6360,"depth":297,"text":6361},{"id":6495,"depth":297,"text":6496},{"id":640,"depth":297,"text":640},"JavaScriptのシャローコピーとディープコピーの違いを確認し、structuredCloneを使った実装方法と注意点を整理します。",{},"\u002Farticles\u002F2024\u002Fdescribe-javascript-deepcopy","2024-11-23",{"title":6200,"description":6580},"articles\u002F2024\u002Fdescribe-javascript-deepcopy",[3149],"\u002Fimages\u002Farticles\u002Fdescribe-javascript-deepcopy.png","dtSQ5LrS1Kfo1hFYE2MzMKOvrhU_5JGE1X1eQ9eHhIY",{"id":6590,"title":6591,"body":6592,"description":7003,"extension":712,"meta":7004,"navigation":588,"path":7005,"publishDate":7006,"published":588,"seo":7007,"stem":7008,"tags":7009,"thumbnail":7010,"updated":7011,"__hash__":7012},"articles\u002Farticles\u002F2024\u002Fdescribe-behavior-javascript-this.md","JavaScriptのthisの挙動について呼び出し元で整理する",{"type":7,"value":6593,"toc":6995},[6594,6596,6602,6606,6611,6617,6620,6623,6629,6637,6639,6645,6651,6660,6663,6703,6710,6729,6731,6737,6757,6760,6797,6809,6829,6835,6838,6841,6883,6901,6910,6924,6934,6949,6951,6956,6988,6993],[10,6595,12],{},[10,6597,6598,6599,6601],{},"今回は、プロジェクトや個人開発で振り回されることが多かったJavaScriptの ",[17,6600,6122],{}," の挙動について、あらためて振り返ります。自分をはじめ、初学者の方も知っておくと開発が楽になるかと思います。",[54,6603,6605],{"id":6604},"そもそもthisってなんだ","そもそも「this」ってなんだ？",[10,6607,6608,6610],{},[17,6609,6122],{}," は、関数が実行されたときのコンテキストを参照するためのキーワードです。",[10,6612,6613,6614,6616],{},"同じ関数であっても、どのように呼び出されたかによって ",[17,6615,6122],{}," が参照する値は変わります。この特徴が便利なところでもあり、難しいところでもあります。",[10,6618,6619],{},"それでは、呼び出し方によって参照先がどう変わるのか見てみましょう。",[54,6621,6622],{"id":6622},"使用する場所ごとのthis",[10,6624,6625,6626,6628],{},"この記事では、",[17,6627,6122],{}," を使用するケースを次の2つに分けて確認します。",[260,6630,6631,6634],{},[263,6632,6633],{},"オブジェクトのメソッドとして呼び出す場合",[263,6635,6636],{},"通常の関数として呼び出す場合",[54,6638,6633],{"id":6633},[10,6640,6641,6642,6644],{},"オブジェクトのメソッドとして呼び出した場合、",[17,6643,6122],{}," は基本的に呼び出し元のオブジェクトを参照します。",[10,6646,6647,6648,6650],{},"ここでいう呼び出し元のオブジェクトとは、次の例では ",[17,6649,5858],{}," のことです。",[22,6652,6654],{"className":1894,"code":6653,"language":1896,"meta":28,"style":28},"const obj = {}\n",[17,6655,6656],{"__ignoreMap":28},[151,6657,6658],{"class":153,"line":154},[151,6659,6653],{},[10,6661,6662],{},"実際に挙動を見てみましょう。",[22,6664,6666],{"className":1894,"code":6665,"language":1896,"meta":28,"style":28},"const obj = {\n  name: 'Yuri',\n  message: function () {\n    console.log('Hello ' + this.name)\n  },\n}\n\nobj.message()\n",[17,6667,6668,6672,6676,6681,6686,6690,6694,6698],{"__ignoreMap":28},[151,6669,6670],{"class":153,"line":154},[151,6671,5834],{},[151,6673,6674],{"class":153,"line":297},[151,6675,5839],{},[151,6677,6678],{"class":153,"line":306},[151,6679,6680],{},"  message: function () {\n",[151,6682,6683],{"class":153,"line":454},[151,6684,6685],{},"    console.log('Hello ' + this.name)\n",[151,6687,6688],{"class":153,"line":523},[151,6689,2086],{},[151,6691,6692],{"class":153,"line":612},[151,6693,1955],{},[151,6695,6696],{"class":153,"line":617},[151,6697,589],{"emptyLinePlaceholder":588},[151,6699,6700],{"class":153,"line":626},[151,6701,6702],{},"obj.message()\n",[10,6704,6705,6706,6709],{},"この例では、",[17,6707,6708],{},"Hello Yuri"," と出力されます。",[10,6711,6712,6715,6716,6718,6719,6721,6722,6718,6725,6728],{},[17,6713,6714],{},"obj.message()"," という形で呼び出しているため、メソッド内の ",[17,6717,6122],{}," は ",[17,6720,5858],{}," を参照します。したがって、",[17,6723,6724],{},"this.name",[17,6726,6727],{},"obj.name"," として評価されます。",[54,6730,6636],{"id":6636},[10,6732,6733,6734,6736],{},"通常の関数として呼び出した場合、",[17,6735,6122],{}," の値は実行モードによって異なります。",[260,6738,6739,6749],{},[263,6740,6741,6742,6744,6745,6748],{},"非厳格モードのブラウザでは、",[17,6743,6122],{}," はグローバルオブジェクトの ",[17,6746,6747],{},"window"," を参照する",[263,6750,6751,6752,6718,6754,6756],{},"厳格モードやES Modulesでは、",[17,6753,6122],{},[17,6755,2360],{}," になる",[10,6758,6759],{},"次のコードは、ブラウザの非厳格モードで実行する例です。",[22,6761,6763],{"className":1894,"code":6762,"language":1896,"meta":28,"style":28},"window.name = 'Yuri'\n\nfunction message() {\n  console.log('Hello ' + this.name)\n}\n\nmessage()\n",[17,6764,6765,6770,6774,6779,6784,6788,6792],{"__ignoreMap":28},[151,6766,6767],{"class":153,"line":154},[151,6768,6769],{},"window.name = 'Yuri'\n",[151,6771,6772],{"class":153,"line":297},[151,6773,589],{"emptyLinePlaceholder":588},[151,6775,6776],{"class":153,"line":306},[151,6777,6778],{},"function message() {\n",[151,6780,6781],{"class":153,"line":454},[151,6782,6783],{},"  console.log('Hello ' + this.name)\n",[151,6785,6786],{"class":153,"line":523},[151,6787,1955],{},[151,6789,6790],{"class":153,"line":612},[151,6791,589],{"emptyLinePlaceholder":588},[151,6793,6794],{"class":153,"line":617},[151,6795,6796],{},"message()\n",[10,6798,6799,6800,6802,6803,6806,6807,6709],{},"非厳格モードでは ",[17,6801,6724],{}," が ",[17,6804,6805],{},"window.name"," として評価されるため、",[17,6808,6708],{},[6810,6811,6812],"blockquote",{},[10,6813,6814,6299,6816,6818,6819,6821,6822,6825,6826,6828],{},[17,6815,2835],{},[17,6817,1904],{}," で宣言した変数は、",[17,6820,6747],{}," オブジェクトのプロパティとして追加されません。一方、ブラウザでトップレベルに ",[17,6823,6824],{},"var"," を使って宣言した変数は、",[17,6827,6747],{}," のプロパティになります。",[10,6830,6831,6832,6834],{},"現在のフロントエンド開発ではES Modulesが広く使われています。ES Modulesは自動的に厳格モードとして扱われるため、通常の関数呼び出しで ",[17,6833,6122],{}," に依存する実装は避けた方が安全です。",[54,6836,6837],{"id":6837},"オブジェクトのメソッドを変数へ代入した場合",[10,6839,6840],{},"ここまでを踏まえて、オブジェクトのメソッドを変数へ代入した場合の挙動を見てみましょう。",[22,6842,6844],{"className":1894,"code":6843,"language":1896,"meta":28,"style":28},"const obj = {\n  name: 'Yuri',\n  message: function () {\n    console.log('Hello ' + this.name)\n  },\n}\n\nconst message = obj.message\nmessage()\n",[17,6845,6846,6850,6854,6858,6862,6866,6870,6874,6879],{"__ignoreMap":28},[151,6847,6848],{"class":153,"line":154},[151,6849,5834],{},[151,6851,6852],{"class":153,"line":297},[151,6853,5839],{},[151,6855,6856],{"class":153,"line":306},[151,6857,6680],{},[151,6859,6860],{"class":153,"line":454},[151,6861,6685],{},[151,6863,6864],{"class":153,"line":523},[151,6865,2086],{},[151,6867,6868],{"class":153,"line":612},[151,6869,1955],{},[151,6871,6872],{"class":153,"line":617},[151,6873,589],{"emptyLinePlaceholder":588},[151,6875,6876],{"class":153,"line":626},[151,6877,6878],{},"const message = obj.message\n",[151,6880,6881],{"class":153,"line":2010},[151,6882,6796],{},[10,6884,6885,6888,6889,6891,6892,6895,6896,87,6898,6900],{},[17,6886,6887],{},"const message = obj.message"," では、関数そのものを変数へ代入しています。その後は ",[17,6890,6714],{}," ではなく ",[17,6893,6894],{},"message()"," として呼び出しているため、",[17,6897,6122],{},[17,6899,5858],{}," の結び付きは失われます。",[10,6902,6799,6903,6802,6905,106,6907,6909],{},[17,6904,6122],{},[17,6906,6747],{},[17,6908,6805],{}," が設定されていなければ、実行環境に応じて空文字などが返ります。",[10,6911,6912,6913,6802,6915,6917,6918,6920,6921,6923],{},"厳格モードやES Modulesでは ",[17,6914,6122],{},[17,6916,2360],{}," になるため、",[17,6919,6724],{}," を読み取ろうとすると ",[17,6922,2740],{}," が発生します。",[10,6925,6926,6927,6930,6931,6933],{},"このような場合は、",[17,6928,6929],{},"bind()"," を使って ",[17,6932,6122],{}," の参照先を固定できます。",[22,6935,6937],{"className":1894,"code":6936,"language":1896,"meta":28,"style":28},"const message = obj.message.bind(obj)\nmessage() \u002F\u002F 「Hello Yuri」と出力される\n",[17,6938,6939,6944],{"__ignoreMap":28},[151,6940,6941],{"class":153,"line":154},[151,6942,6943],{},"const message = obj.message.bind(obj)\n",[151,6945,6946],{"class":153,"line":297},[151,6947,6948],{},"message() \u002F\u002F 「Hello Yuri」と出力される\n",[54,6950,640],{"id":640},[10,6952,6953,6955],{},[17,6954,6122],{}," の参照先は、関数を定義した場所だけではなく、主に関数の呼び出し方によって決まります。",[260,6957,6958,6967,6977,6980],{},[263,6959,6960,6962,6963,6718,6965,6748],{},[17,6961,6714],{}," のようなメソッド呼び出しでは、",[17,6964,6122],{},[17,6966,5858],{},[263,6968,6969,6971,6972,6974,6975,6756],{},[17,6970,6894],{}," のような通常の関数呼び出しでは、非厳格モードのブラウザなら ",[17,6973,6747],{},"、厳格モードやES Modulesなら ",[17,6976,2360],{},[263,6978,6979],{},"メソッドを変数へ代入すると、元のオブジェクトとの結び付きは失われる",[263,6981,6982,6983,1809,6985,6987],{},"元のオブジェクトを参照させたい場合は、",[17,6984,6929],{},[17,6986,6122],{}," を固定できる",[10,6989,6990,6992],{},[17,6991,6122],{}," で迷ったときは「この関数はどのような形で呼び出されているか」を確認すると、参照先を判断しやすくなります。",[688,6994,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":6996},[6997,6998,6999,7000,7001,7002],{"id":6604,"depth":297,"text":6605},{"id":6622,"depth":297,"text":6622},{"id":6633,"depth":297,"text":6633},{"id":6636,"depth":297,"text":6636},{"id":6837,"depth":297,"text":6837},{"id":640,"depth":297,"text":640},"JavaScriptのthisが何を参照するのか、メソッド呼び出しと関数呼び出しの違いから整理します。",{},"\u002Farticles\u002F2024\u002Fdescribe-behavior-javascript-this","2024-11-20",{"title":6591,"description":7003},"articles\u002F2024\u002Fdescribe-behavior-javascript-this",[3149],"\u002Fimages\u002Farticles\u002Fdescribe-behavior-javascript-this.png","2025-03-21","Kay_1TeIK8YsouKEwYLRPzbQMnabHxZ_GWvHciKSZBs",[7014,7538,8002,9047,10394,10772,11143,11469,11768],{"id":4,"title":5,"body":7015,"description":711,"extension":712,"meta":7535,"navigation":588,"path":714,"publishDate":715,"published":588,"seo":7536,"stem":717,"tags":7537,"thumbnail":721,"updated":722,"__hash__":723},{"type":7,"value":7016,"toc":7515},[7017,7019,7023,7028,7030,7032,7040,7042,7044,7046,7048,7053,7055,7060,7070,7082,7087,7089,7091,7093,7098,7100,7102,7112,7114,7119,7121,7143,7145,7157,7163,7165,7179,7181,7189,7193,7195,7197,7225,7227,7229,7233,7235,7249,7254,7256,7258,7264,7266,7268,7280,7282,7287,7289,7291,7293,7341,7345,7347,7349,7403,7405,7407,7409,7413,7479,7481,7483,7485,7487,7505,7509,7513],[10,7018,12],{},[10,7020,15,7021,20],{},[17,7022,19],{},[22,7024,7026],{"className":7025,"code":26,"language":27,"meta":28},[25],[17,7027,26],{"__ignoreMap":28},[10,7029,33],{},[10,7031,36],{},[38,7033,7034],{"title":40,"type":41},[10,7035,44,7036,48,7038,52],{},[17,7037,47],{},[50,7039],{},[54,7041,56],{"id":56},[10,7043,59],{},[10,7045,62],{},[64,7047,66],{"id":66},[22,7049,7051],{"className":7050,"code":70,"language":27,"meta":28},[25],[17,7052,70],{"__ignoreMap":28},[64,7054,75],{"id":75},[22,7056,7058],{"className":7057,"code":79,"language":27,"meta":28},[25],[17,7059,79],{"__ignoreMap":28},[10,7061,7062,87,7064,91,7066,87,7068,98],{},[17,7063,86],{},[17,7065,90],{},[17,7067,94],{},[17,7069,97],{},[10,7071,101,7072,87,7074,106,7076,109,7078,87,7080,114],{},[17,7073,90],{},[17,7075,97],{},[50,7077],{},[17,7079,86],{},[17,7081,94],{},[22,7083,7085],{"className":7084,"code":118,"language":27,"meta":28},[25],[17,7086,118],{"__ignoreMap":28},[10,7088,123],{},[54,7090,126],{"id":126},[10,7092,129],{},[22,7094,7096],{"className":7095,"code":133,"language":27,"meta":28},[25],[17,7097,133],{"__ignoreMap":28},[10,7099,138],{},[64,7101,142],{"id":141},[22,7103,7104],{"className":145,"code":146,"language":147,"meta":28,"style":28},[17,7105,7106],{"__ignoreMap":28},[151,7107,7108,7110],{"class":153,"line":154},[151,7109,158],{"class":157},[151,7111,162],{"class":161},[10,7113,165],{},[22,7115,7117],{"className":7116,"code":169,"language":27,"meta":28},[25],[17,7118,169],{"__ignoreMap":28},[10,7120,174],{},[22,7122,7123],{"className":145,"code":177,"language":147,"meta":28,"style":28},[17,7124,7125],{"__ignoreMap":28},[151,7126,7127,7129,7131,7133,7135,7137,7139,7141],{"class":153,"line":154},[151,7128,158],{"class":157},[151,7130,186],{"class":161},[151,7132,189],{"class":161},[151,7134,192],{"class":161},[151,7136,195],{"class":161},[151,7138,199],{"class":198},[151,7140,202],{"class":161},[151,7142,205],{"class":198},[64,7144,209],{"id":208},[22,7146,7147],{"className":145,"code":212,"language":147,"meta":28,"style":28},[17,7148,7149],{"__ignoreMap":28},[151,7150,7151,7153,7155],{"class":153,"line":154},[151,7152,158],{"class":157},[151,7154,221],{"class":161},[151,7156,224],{"class":161},[10,7158,7159,230,7161,233],{},[17,7160,229],{},[50,7162],{},[64,7164,237],{"id":236},[22,7166,7167],{"className":145,"code":240,"language":147,"meta":28,"style":28},[17,7168,7169],{"__ignoreMap":28},[151,7170,7171,7173,7175,7177],{"class":153,"line":154},[151,7172,158],{"class":157},[151,7174,249],{"class":161},[151,7176,252],{"class":161},[151,7178,255],{"class":161},[10,7180,258],{},[260,7182,7183,7185,7187],{},[263,7184,265],{},[263,7186,268],{},[263,7188,271],{},[10,7190,274,7191,277],{},[17,7192,47],{},[54,7194,280],{"id":280},[10,7196,283],{},[22,7198,7199],{"className":145,"code":286,"language":147,"meta":28,"style":28},[17,7200,7201,7207,7215],{"__ignoreMap":28},[151,7202,7203,7205],{"class":153,"line":154},[151,7204,158],{"class":157},[151,7206,162],{"class":161},[151,7208,7209,7211,7213],{"class":153,"line":297},[151,7210,158],{"class":157},[151,7212,221],{"class":161},[151,7214,224],{"class":161},[151,7216,7217,7219,7221,7223],{"class":153,"line":306},[151,7218,158],{"class":157},[151,7220,249],{"class":161},[151,7222,252],{"class":161},[151,7224,255],{"class":161},[10,7226,317],{},[54,7228,321],{"id":320},[10,7230,324,7231,328],{},[17,7232,327],{},[10,7234,331],{},[22,7236,7237],{"className":145,"code":334,"language":147,"meta":28,"style":28},[17,7238,7239],{"__ignoreMap":28},[151,7240,7241,7243,7245,7247],{"class":153,"line":154},[151,7242,158],{"class":157},[151,7244,343],{"class":161},[151,7246,346],{"class":161},[151,7248,349],{"class":161},[22,7250,7252],{"className":7251,"code":353,"language":27,"meta":28},[25],[17,7253,353],{"__ignoreMap":28},[10,7255,358],{},[10,7257,361],{},[10,7259,364,7260,367,7262,371],{},[17,7261,229],{},[17,7263,370],{},[54,7265,375],{"id":374},[10,7267,378],{},[22,7269,7270],{"className":145,"code":381,"language":147,"meta":28,"style":28},[17,7271,7272],{"__ignoreMap":28},[151,7273,7274,7276,7278],{"class":153,"line":154},[151,7275,158],{"class":157},[151,7277,189],{"class":161},[151,7279,392],{"class":161},[10,7281,395],{},[22,7283,7285],{"className":7284,"code":399,"language":27,"meta":28},[25],[17,7286,399],{"__ignoreMap":28},[54,7288,404],{"id":404},[64,7290,407],{"id":407},[10,7292,410],{},[22,7294,7295],{"className":145,"code":413,"language":147,"meta":28,"style":28},[17,7296,7297,7315,7323,7333],{"__ignoreMap":28},[151,7298,7299,7301,7303,7305,7307,7309,7311,7313],{"class":153,"line":154},[151,7300,158],{"class":157},[151,7302,186],{"class":161},[151,7304,189],{"class":161},[151,7306,192],{"class":161},[151,7308,195],{"class":161},[151,7310,199],{"class":198},[151,7312,202],{"class":161},[151,7314,205],{"class":198},[151,7316,7317,7319,7321],{"class":153,"line":297},[151,7318,158],{"class":157},[151,7320,221],{"class":161},[151,7322,224],{"class":161},[151,7324,7325,7327,7329,7331],{"class":153,"line":306},[151,7326,158],{"class":157},[151,7328,249],{"class":161},[151,7330,252],{"class":161},[151,7332,255],{"class":161},[151,7334,7335,7337,7339],{"class":153,"line":454},[151,7336,158],{"class":157},[151,7338,186],{"class":161},[151,7340,461],{"class":161},[10,7342,464,7343,468],{},[17,7344,467],{},[64,7346,471],{"id":471},[10,7348,474],{},[22,7350,7351],{"className":145,"code":477,"language":147,"meta":28,"style":28},[17,7352,7353,7361,7371,7379,7389],{"__ignoreMap":28},[151,7354,7355,7357,7359],{"class":153,"line":154},[151,7356,158],{"class":157},[151,7358,221],{"class":161},[151,7360,224],{"class":161},[151,7362,7363,7365,7367,7369],{"class":153,"line":297},[151,7364,158],{"class":157},[151,7366,494],{"class":161},[151,7368,497],{"class":161},[151,7370,500],{"class":161},[151,7372,7373,7375,7377],{"class":153,"line":306},[151,7374,158],{"class":157},[151,7376,507],{"class":161},[151,7378,510],{"class":161},[151,7380,7381,7383,7385,7387],{"class":153,"line":454},[151,7382,158],{"class":157},[151,7384,249],{"class":161},[151,7386,252],{"class":161},[151,7388,255],{"class":161},[151,7390,7391,7393,7395,7397,7399,7401],{"class":153,"line":523},[151,7392,158],{"class":157},[151,7394,528],{"class":161},[151,7396,531],{"class":198},[151,7398,534],{"class":161},[151,7400,86],{"class":537},[151,7402,540],{"class":198},[10,7404,543],{},[54,7406,547],{"id":546},[10,7408,550],{},[10,7410,553,7411,557],{},[17,7412,556],{},[22,7414,7415],{"className":145,"code":560,"language":147,"meta":28,"style":28},[17,7416,7417,7425,7435,7439,7447,7457,7461,7469],{"__ignoreMap":28},[151,7418,7419,7421,7423],{"class":153,"line":154},[151,7420,158],{"class":157},[151,7422,569],{"class":161},[151,7424,572],{"class":161},[151,7426,7427,7429,7431,7433],{"class":153,"line":297},[151,7428,158],{"class":157},[151,7430,249],{"class":161},[151,7432,252],{"class":161},[151,7434,583],{"class":161},[151,7436,7437],{"class":153,"line":306},[151,7438,589],{"emptyLinePlaceholder":588},[151,7440,7441,7443,7445],{"class":153,"line":454},[151,7442,158],{"class":157},[151,7444,569],{"class":161},[151,7446,598],{"class":161},[151,7448,7449,7451,7453,7455],{"class":153,"line":523},[151,7450,158],{"class":157},[151,7452,249],{"class":161},[151,7454,252],{"class":161},[151,7456,609],{"class":161},[151,7458,7459],{"class":153,"line":612},[151,7460,589],{"emptyLinePlaceholder":588},[151,7462,7463,7465,7467],{"class":153,"line":617},[151,7464,158],{"class":157},[151,7466,569],{"class":161},[151,7468,349],{"class":161},[151,7470,7471,7473,7475,7477],{"class":153,"line":626},[151,7472,158],{"class":157},[151,7474,249],{"class":161},[151,7476,252],{"class":161},[151,7478,255],{"class":161},[10,7480,637],{},[54,7482,640],{"id":640},[10,7484,643],{},[10,7486,646],{},[648,7488,7489,7493,7495,7499,7503],{},[263,7490,7491,655],{},[17,7492,654],{},[263,7494,658],{},[263,7496,7497,663],{},[17,7498,556],{},[263,7500,7501,669],{},[17,7502,668],{},[263,7504,672],{},[10,7506,675,7507,678],{},[50,7508],{},[10,7510,681,7511,686],{},[683,7512,685],{},[688,7514,690],{},{"title":28,"searchDepth":297,"depth":297,"links":7516},[7517,7521,7526,7527,7528,7529,7533,7534],{"id":56,"depth":297,"text":56,"children":7518},[7519,7520],{"id":66,"depth":306,"text":66},{"id":75,"depth":306,"text":75},{"id":126,"depth":297,"text":126,"children":7522},[7523,7524,7525],{"id":141,"depth":306,"text":142},{"id":208,"depth":306,"text":209},{"id":236,"depth":306,"text":237},{"id":280,"depth":297,"text":280},{"id":320,"depth":297,"text":321},{"id":374,"depth":297,"text":375},{"id":404,"depth":297,"text":404,"children":7530},[7531,7532],{"id":407,"depth":306,"text":407},{"id":471,"depth":306,"text":471},{"id":546,"depth":297,"text":547},{"id":640,"depth":297,"text":640},{},{"title":5,"description":711},[719,720],{"id":1250,"title":1251,"body":7539,"description":1865,"extension":712,"meta":7999,"navigation":588,"path":1867,"publishDate":1868,"published":588,"seo":8000,"stem":1870,"tags":8001,"thumbnail":1874,"updated":1868,"__hash__":1875},{"type":7,"value":7540,"toc":7989},[7541,7543,7547,7549,7553,7555,7559,7561,7563,7568,7570,7575,7577,7579,7581,7607,7613,7617,7622,7626,7652,7656,7661,7665,7691,7693,7698,7700,7702,7704,7706,7718,7720,7725,7727,7757,7761,7763,7765,7779,7783,7785,7790,7792,7794,7796,7806,7808,7820,7822,7827,7831,7833,7835,7849,7851,7856,7858,7860,7868,7874,7876,7881,7883,7895,7897,7899,7901,7939,7941,7945,7947,7949,7969,7971,7973,7985,7987],[10,7542,12],{},[10,7544,1258,7545,1262],{},[683,7546,1261],{},[10,7548,1265],{},[10,7550,1268,7551,1272],{},[683,7552,1271],{},[10,7554,1275],{},[38,7556,7557],{"title":1278,"type":41},[10,7558,1281],{},[54,7560,1285],{"id":1284},[10,7562,1288],{},[22,7564,7566],{"className":7565,"code":1292,"language":27,"meta":28},[25],[17,7567,1292],{"__ignoreMap":28},[10,7569,1297],{},[22,7571,7573],{"className":7572,"code":1301,"language":27,"meta":28},[25],[17,7574,1301],{"__ignoreMap":28},[10,7576,1306],{},[54,7578,1309],{"id":1309},[10,7580,1312],{},[22,7582,7583],{"className":145,"code":1315,"language":147,"meta":28,"style":28},[17,7584,7585],{"__ignoreMap":28},[151,7586,7587,7589,7591,7593,7595,7597,7599,7601,7603,7605],{"class":153,"line":154},[151,7588,1322],{"class":157},[151,7590,1325],{"class":161},[151,7592,1328],{"class":161},[151,7594,1332],{"class":1331},[151,7596,1335],{"class":161},[151,7598,1338],{"class":198},[151,7600,1341],{"class":161},[151,7602,1344],{"class":198},[151,7604,1347],{"class":157},[151,7606,1350],{"class":161},[10,7608,7609,1355,7611,1359],{},[17,7610,1322],{},[17,7612,1358],{},[10,7614,1362,7615,1366],{},[17,7616,1365],{},[22,7618,7620],{"className":7619,"code":1370,"language":27,"meta":28},[25],[17,7621,1370],{"__ignoreMap":28},[10,7623,1375,7624,1378],{},[17,7625,1365],{},[22,7627,7628],{"className":145,"code":1381,"language":147,"meta":28,"style":28},[17,7629,7630],{"__ignoreMap":28},[151,7631,7632,7634,7636,7638,7640,7642,7644,7646,7648,7650],{"class":153,"line":154},[151,7633,1322],{"class":157},[151,7635,1325],{"class":161},[151,7637,1328],{"class":161},[151,7639,1332],{"class":1331},[151,7641,1396],{"class":161},[151,7643,1338],{"class":198},[151,7645,1341],{"class":161},[151,7647,1344],{"class":198},[151,7649,1347],{"class":157},[151,7651,1350],{"class":161},[10,7653,1409,7654,1413],{},[17,7655,1412],{},[22,7657,7659],{"className":7658,"code":1417,"language":27,"meta":28},[25],[17,7660,1417],{"__ignoreMap":28},[10,7662,1422,7663,1425],{},[17,7664,1412],{},[22,7666,7667],{"className":145,"code":1428,"language":147,"meta":28,"style":28},[17,7668,7669],{"__ignoreMap":28},[151,7670,7671,7673,7675,7677,7679,7681,7683,7685,7687,7689],{"class":153,"line":154},[151,7672,1322],{"class":157},[151,7674,1325],{"class":161},[151,7676,1328],{"class":161},[151,7678,1332],{"class":1331},[151,7680,1443],{"class":161},[151,7682,1338],{"class":198},[151,7684,1341],{"class":161},[151,7686,1344],{"class":198},[151,7688,1347],{"class":157},[151,7690,1350],{"class":161},[10,7692,1456],{},[22,7694,7696],{"className":7695,"code":1460,"language":27,"meta":28},[25],[17,7697,1460],{"__ignoreMap":28},[10,7699,1465],{},[10,7701,1468],{},[54,7703,1472],{"id":1471},[10,7705,1475],{},[22,7707,7708],{"className":145,"code":1478,"language":147,"meta":28,"style":28},[17,7709,7710],{"__ignoreMap":28},[151,7711,7712,7714,7716],{"class":153,"line":154},[151,7713,1485],{"class":157},[151,7715,1488],{"class":161},[151,7717,1491],{"class":161},[10,7719,1494],{},[22,7721,7723],{"className":7722,"code":1498,"language":27,"meta":28},[25],[17,7724,1498],{"__ignoreMap":28},[10,7726,1503],{},[1505,7728,7729,7737],{},[1508,7730,7731],{},[1511,7732,7733,7735],{},[1514,7734,1516],{},[1514,7736,1520],{"align":1519},[1522,7738,7739,7745,7751],{},[1511,7740,7741,7743],{},[1527,7742,1529],{},[1527,7744,1532],{"align":1519},[1511,7746,7747,7749],{},[1527,7748,1537],{},[1527,7750,1540],{"align":1519},[1511,7752,7753,7755],{},[1527,7754,1545],{},[1527,7756,1548],{"align":1519},[10,7758,7759,1554],{},[17,7760,1553],{},[54,7762,1558],{"id":1557},[10,7764,1561],{},[22,7766,7767],{"className":145,"code":1564,"language":147,"meta":28,"style":28},[17,7768,7769],{"__ignoreMap":28},[151,7770,7771,7773,7775,7777],{"class":153,"line":154},[151,7772,1485],{"class":157},[151,7774,1573],{"class":161},[151,7776,1576],{"class":161},[151,7778,1579],{"class":161},[10,7780,7781,1585],{},[17,7782,1584],{},[10,7784,1588],{},[22,7786,7788],{"className":7787,"code":1592,"language":27,"meta":28},[25],[17,7789,1592],{"__ignoreMap":28},[10,7791,1597],{},[54,7793,1601],{"id":1600},[10,7795,1604],{},[22,7797,7798],{"className":145,"code":1607,"language":147,"meta":28,"style":28},[17,7799,7800],{"__ignoreMap":28},[151,7801,7802,7804],{"class":153,"line":154},[151,7803,1485],{"class":157},[151,7805,1616],{"class":161},[10,7807,1619],{},[22,7809,7810],{"className":145,"code":1622,"language":147,"meta":28,"style":28},[17,7811,7812],{"__ignoreMap":28},[151,7813,7814,7816,7818],{"class":153,"line":154},[151,7815,1485],{"class":157},[151,7817,1631],{"class":161},[151,7819,1634],{"class":161},[10,7821,1637],{},[22,7823,7825],{"className":7824,"code":1641,"language":27,"meta":28},[25],[17,7826,1641],{"__ignoreMap":28},[10,7828,1646,7829,1650],{},[17,7830,1649],{},[54,7832,1654],{"id":1653},[10,7834,1657],{},[22,7836,7837],{"className":145,"code":1660,"language":147,"meta":28,"style":28},[17,7838,7839],{"__ignoreMap":28},[151,7840,7841,7843,7845,7847],{"class":153,"line":154},[151,7842,1485],{"class":157},[151,7844,1488],{"class":161},[151,7846,1671],{"class":161},[151,7848,1674],{"class":161},[10,7850,1677],{},[22,7852,7854],{"className":7853,"code":1681,"language":27,"meta":28},[25],[17,7855,1681],{"__ignoreMap":28},[10,7857,1686],{},[10,7859,1689],{},[22,7861,7862],{"className":1692,"code":1693,"language":1694,"meta":28,"style":28},[17,7863,7864],{"__ignoreMap":28},[151,7865,7866],{"class":153,"line":154},[151,7867,1693],{},[38,7869,7870],{"title":1703,"type":41},[10,7871,7872,1709],{},[17,7873,1708],{},[10,7875,1712],{},[22,7877,7879],{"className":7878,"code":1716,"language":27,"meta":28},[25],[17,7880,1716],{"__ignoreMap":28},[10,7882,1721],{},[22,7884,7885],{"className":145,"code":1724,"language":147,"meta":28,"style":28},[17,7886,7887],{"__ignoreMap":28},[151,7888,7889,7891,7893],{"class":153,"line":154},[151,7890,1485],{"class":157},[151,7892,1733],{"class":161},[151,7894,1634],{"class":161},[10,7896,1738],{},[54,7898,1741],{"id":1741},[10,7900,1744],{},[1505,7902,7903,7913],{},[1508,7904,7905],{},[1511,7906,7907,7909,7911],{},[1514,7908,1516],{},[1514,7910,1755],{"align":1519},[1514,7912,1758],{"align":1519},[1522,7914,7915,7923,7931],{},[1511,7916,7917,7919,7921],{},[1527,7918,1529],{},[1527,7920,1532],{"align":1519},[1527,7922,1769],{"align":1519},[1511,7924,7925,7927,7929],{},[1527,7926,1537],{},[1527,7928,1540],{"align":1519},[1527,7930,1778],{"align":1519},[1511,7932,7933,7935,7937],{},[1527,7934,1545],{},[1527,7936,1548],{"align":1519},[1527,7938,1787],{"align":1519},[10,7940,1790],{},[10,7942,1793,7943,1797],{},[17,7944,1796],{},[54,7946,640],{"id":640},[10,7948,1802],{},[648,7950,7951,7957,7961,7965,7967],{},[263,7952,7953,1809,7955,1812],{},[17,7954,1322],{},[17,7956,1365],{},[263,7958,7959,1818],{},[17,7960,1817],{},[263,7962,1821,7963,1824],{},[17,7964,1553],{},[263,7966,1827],{},[263,7968,1830],{},[10,7970,1833],{},[10,7972,1836],{},[22,7974,7975],{"className":145,"code":1478,"language":147,"meta":28,"style":28},[17,7976,7977],{"__ignoreMap":28},[151,7978,7979,7981,7983],{"class":153,"line":154},[151,7980,1485],{"class":157},[151,7982,1488],{"class":161},[151,7984,1491],{"class":161},[10,7986,1851],{},[688,7988,1854],{},{"title":28,"searchDepth":297,"depth":297,"links":7990},[7991,7992,7993,7994,7995,7996,7997,7998],{"id":1284,"depth":297,"text":1285},{"id":1309,"depth":297,"text":1309},{"id":1471,"depth":297,"text":1472},{"id":1557,"depth":297,"text":1558},{"id":1600,"depth":297,"text":1601},{"id":1653,"depth":297,"text":1654},{"id":1741,"depth":297,"text":1741},{"id":640,"depth":297,"text":640},{},{"title":1251,"description":1865},[1872,1873],{"id":1877,"title":1878,"body":8003,"description":3142,"extension":712,"meta":9044,"navigation":588,"path":3144,"publishDate":3145,"published":588,"seo":9045,"stem":3147,"tags":9046,"thumbnail":3150,"updated":3145,"__hash__":3151},{"type":7,"value":8004,"toc":9029},[8005,8007,8009,8011,8013,8109,8111,8113,8235,8245,8263,8273,8305,8307,8309,8379,8385,8389,8397,8453,8463,8465,8491,8493,8497,8629,8631,8635,8715,8721,8723,8729,8777,8779,8785,8859,8861,8907,8911,8915,8923,8983,8997,8999,9003,9005,9017,9019,9021,9027],[10,8006,12],{},[10,8008,1885],{},[54,8010,1888],{"id":1888},[10,8012,1891],{},[22,8014,8015],{"className":1894,"code":1895,"language":1896,"meta":28,"style":28},[17,8016,8017,8027,8041,8055,8059,8063,8081,8085,8097],{"__ignoreMap":28},[151,8018,8019,8021,8023,8025],{"class":153,"line":154},[151,8020,1904],{"class":1903},[151,8022,1907],{"class":537},[151,8024,1910],{"class":198},[151,8026,1913],{"class":198},[151,8028,8029,8031,8033,8035,8037,8039],{"class":153,"line":297},[151,8030,1919],{"class":1918},[151,8032,1922],{"class":198},[151,8034,1925],{"class":198},[151,8036,1928],{"class":161},[151,8038,1931],{"class":198},[151,8040,1934],{"class":198},[151,8042,8043,8045,8047,8049,8051,8053],{"class":153,"line":306},[151,8044,1939],{"class":1918},[151,8046,1922],{"class":198},[151,8048,1925],{"class":198},[151,8050,1946],{"class":161},[151,8052,1931],{"class":198},[151,8054,1934],{"class":198},[151,8056,8057],{"class":153,"line":454},[151,8058,1955],{"class":198},[151,8060,8061],{"class":153,"line":523},[151,8062,589],{"emptyLinePlaceholder":588},[151,8064,8065,8067,8069,8071,8073,8075,8077,8079],{"class":153,"line":612},[151,8066,1904],{"class":1903},[151,8068,1966],{"class":198},[151,8070,1969],{"class":537},[151,8072,1972],{"class":198},[151,8074,1975],{"class":537},[151,8076,1978],{"class":198},[151,8078,1981],{"class":198},[151,8080,1984],{"class":537},[151,8082,8083],{"class":153,"line":617},[151,8084,589],{"emptyLinePlaceholder":588},[151,8086,8087,8089,8091,8093,8095],{"class":153,"line":626},[151,8088,1993],{"class":537},[151,8090,1996],{"class":198},[151,8092,2000],{"class":1999},[151,8094,2003],{"class":537},[151,8096,2007],{"class":2006},[151,8098,8099,8101,8103,8105,8107],{"class":153,"line":2010},[151,8100,1993],{"class":537},[151,8102,1996],{"class":198},[151,8104,2000],{"class":1999},[151,8106,2019],{"class":537},[151,8108,2022],{"class":2006},[64,8110,2025],{"id":2025},[10,8112,2028],{},[22,8114,8115],{"className":1894,"code":2031,"language":1896,"meta":28,"style":28},[17,8116,8117,8127,8141,8149,8163,8167,8171,8175,8181,8187,8199,8207,8211,8223],{"__ignoreMap":28},[151,8118,8119,8121,8123,8125],{"class":153,"line":154},[151,8120,1904],{"class":1903},[151,8122,1907],{"class":537},[151,8124,1910],{"class":198},[151,8126,1913],{"class":198},[151,8128,8129,8131,8133,8135,8137,8139],{"class":153,"line":297},[151,8130,1919],{"class":1918},[151,8132,1922],{"class":198},[151,8134,1925],{"class":198},[151,8136,1928],{"class":161},[151,8138,1931],{"class":198},[151,8140,1934],{"class":198},[151,8142,8143,8145,8147],{"class":153,"line":306},[151,8144,2062],{"class":1918},[151,8146,1922],{"class":198},[151,8148,1913],{"class":198},[151,8150,8151,8153,8155,8157,8159,8161],{"class":153,"line":454},[151,8152,2071],{"class":1918},[151,8154,1922],{"class":198},[151,8156,1925],{"class":198},[151,8158,1946],{"class":161},[151,8160,1931],{"class":198},[151,8162,1934],{"class":198},[151,8164,8165],{"class":153,"line":523},[151,8166,2086],{"class":198},[151,8168,8169],{"class":153,"line":612},[151,8170,1955],{"class":198},[151,8172,8173],{"class":153,"line":617},[151,8174,589],{"emptyLinePlaceholder":588},[151,8176,8177,8179],{"class":153,"line":626},[151,8178,1904],{"class":1903},[151,8180,1913],{"class":198},[151,8182,8183,8185],{"class":153,"line":2010},[151,8184,1919],{"class":537},[151,8186,1934],{"class":198},[151,8188,8189,8191,8193,8195,8197],{"class":153,"line":2109},[151,8190,2062],{"class":1918},[151,8192,1922],{"class":198},[151,8194,1966],{"class":198},[151,8196,1975],{"class":537},[151,8198,2120],{"class":198},[151,8200,8201,8203,8205],{"class":153,"line":2123},[151,8202,1978],{"class":198},[151,8204,1981],{"class":198},[151,8206,1984],{"class":537},[151,8208,8209],{"class":153,"line":2132},[151,8210,589],{"emptyLinePlaceholder":588},[151,8212,8213,8215,8217,8219,8221],{"class":153,"line":2137},[151,8214,1993],{"class":537},[151,8216,1996],{"class":198},[151,8218,2000],{"class":1999},[151,8220,2003],{"class":537},[151,8222,2007],{"class":2006},[151,8224,8225,8227,8229,8231,8233],{"class":153,"line":2150},[151,8226,1993],{"class":537},[151,8228,1996],{"class":198},[151,8230,2000],{"class":1999},[151,8232,2019],{"class":537},[151,8234,2022],{"class":2006},[10,8236,2163,8237,2167,8239,2171,8241,2175,8243,2178],{},[17,8238,2166],{},[17,8240,2170],{},[17,8242,2174],{},[17,8244,2170],{},[22,8246,8247],{"className":1894,"code":2181,"language":1896,"meta":28,"style":28},[17,8248,8249,8259],{"__ignoreMap":28},[151,8250,8251,8253,8255,8257],{"class":153,"line":154},[151,8252,1993],{"class":537},[151,8254,1996],{"class":198},[151,8256,2000],{"class":1999},[151,8258,2194],{"class":537},[151,8260,8261],{"class":153,"line":297},[151,8262,2199],{"class":2006},[38,8264,8265],{"title":2202,"type":2203},[10,8266,8267,2208,8269,2211,8271,2214],{},[17,8268,2174],{},[17,8270,2170],{},[17,8272,2174],{},[22,8274,8275],{"className":1894,"code":2217,"language":1896,"meta":28,"style":28},[17,8276,8277,8291],{"__ignoreMap":28},[151,8278,8279,8281,8283,8285,8287,8289],{"class":153,"line":154},[151,8280,1904],{"class":1903},[151,8282,1966],{"class":198},[151,8284,2228],{"class":537},[151,8286,1978],{"class":198},[151,8288,1981],{"class":198},[151,8290,1984],{"class":537},[151,8292,8293,8295,8297,8299,8301,8303],{"class":153,"line":297},[151,8294,1904],{"class":1903},[151,8296,1966],{"class":198},[151,8298,1975],{"class":537},[151,8300,1978],{"class":198},[151,8302,1981],{"class":198},[151,8304,2249],{"class":537},[64,8306,2252],{"id":2252},[10,8308,2255],{},[22,8310,8311],{"className":1894,"code":2258,"language":1896,"meta":28,"style":28},[17,8312,8313,8323,8337,8341,8345,8363,8367],{"__ignoreMap":28},[151,8314,8315,8317,8319,8321],{"class":153,"line":154},[151,8316,1904],{"class":1903},[151,8318,1907],{"class":537},[151,8320,1910],{"class":198},[151,8322,1913],{"class":198},[151,8324,8325,8327,8329,8331,8333,8335],{"class":153,"line":297},[151,8326,2275],{"class":1918},[151,8328,1922],{"class":198},[151,8330,1925],{"class":198},[151,8332,2282],{"class":161},[151,8334,1931],{"class":198},[151,8336,1934],{"class":198},[151,8338,8339],{"class":153,"line":306},[151,8340,1955],{"class":198},[151,8342,8343],{"class":153,"line":454},[151,8344,589],{"emptyLinePlaceholder":588},[151,8346,8347,8349,8351,8353,8355,8357,8359,8361],{"class":153,"line":523},[151,8348,1904],{"class":1903},[151,8350,1966],{"class":198},[151,8352,2303],{"class":1918},[151,8354,1922],{"class":198},[151,8356,2308],{"class":537},[151,8358,1978],{"class":198},[151,8360,1981],{"class":198},[151,8362,1984],{"class":537},[151,8364,8365],{"class":153,"line":612},[151,8366,589],{"emptyLinePlaceholder":588},[151,8368,8369,8371,8373,8375,8377],{"class":153,"line":617},[151,8370,1993],{"class":537},[151,8372,1996],{"class":198},[151,8374,2000],{"class":1999},[151,8376,2329],{"class":537},[151,8378,2332],{"class":2006},[10,8380,2335,8381,2339,8383,2171],{},[17,8382,2338],{},[17,8384,2342],{},[54,8386,2346,8387,2350],{"id":2345},[17,8388,2349],{},[10,8390,2353,8391,2357,8393,2361,8395,2364],{},[17,8392,2356],{},[17,8394,2360],{},[17,8396,2360],{},[22,8398,8399],{"className":1894,"code":2367,"language":1896,"meta":28,"style":28},[17,8400,8401,8411,8425,8429,8433],{"__ignoreMap":28},[151,8402,8403,8405,8407,8409],{"class":153,"line":154},[151,8404,1904],{"class":1903},[151,8406,1907],{"class":537},[151,8408,1910],{"class":198},[151,8410,1913],{"class":198},[151,8412,8413,8415,8417,8419,8421,8423],{"class":153,"line":297},[151,8414,2275],{"class":1918},[151,8416,1922],{"class":198},[151,8418,1925],{"class":198},[151,8420,2282],{"class":161},[151,8422,1931],{"class":198},[151,8424,1934],{"class":198},[151,8426,8427],{"class":153,"line":306},[151,8428,1955],{"class":198},[151,8430,8431],{"class":153,"line":454},[151,8432,589],{"emptyLinePlaceholder":588},[151,8434,8435,8437,8439,8441,8443,8445,8447,8449,8451],{"class":153,"line":523},[151,8436,1993],{"class":537},[151,8438,1996],{"class":198},[151,8440,2000],{"class":1999},[151,8442,2412],{"class":537},[151,8444,1996],{"class":198},[151,8446,2417],{"class":537},[151,8448,2349],{"class":198},[151,8450,2422],{"class":537},[151,8452,2425],{"class":2006},[10,8454,8455,2431,8457,2434,8459,2437,8461,2441],{},[17,8456,2430],{},[17,8458,2360],{},[17,8460,2349],{},[17,8462,2440],{},[10,8464,2444],{},[22,8466,8467],{"className":1894,"code":2447,"language":1896,"meta":28,"style":28},[17,8468,8469,8487],{"__ignoreMap":28},[151,8470,8471,8473,8475,8477,8479,8481,8483,8485],{"class":153,"line":154},[151,8472,1993],{"class":537},[151,8474,1996],{"class":198},[151,8476,2000],{"class":1999},[151,8478,2412],{"class":537},[151,8480,1996],{"class":198},[151,8482,2417],{"class":537},[151,8484,1996],{"class":198},[151,8486,2468],{"class":537},[151,8488,8489],{"class":153,"line":297},[151,8490,2473],{"class":2006},[64,8492,2476],{"id":2476},[10,8494,2479,8495,2483],{},[17,8496,2482],{},[22,8498,8499],{"className":1894,"code":2486,"language":1896,"meta":28,"style":28},[17,8500,8501,8511,8527,8543,8547,8551,8571,8591,8595,8605,8609],{"__ignoreMap":28},[151,8502,8503,8505,8507,8509],{"class":153,"line":154},[151,8504,1904],{"class":1903},[151,8506,2495],{"class":537},[151,8508,1910],{"class":198},[151,8510,2500],{"class":537},[151,8512,8513,8515,8517,8519,8521,8523,8525],{"class":153,"line":297},[151,8514,2505],{"class":198},[151,8516,2303],{"class":1918},[151,8518,1922],{"class":198},[151,8520,1925],{"class":198},[151,8522,2514],{"class":161},[151,8524,1931],{"class":198},[151,8526,2519],{"class":198},[151,8528,8529,8531,8533,8535,8537,8539,8541],{"class":153,"line":306},[151,8530,2505],{"class":198},[151,8532,2303],{"class":1918},[151,8534,1922],{"class":198},[151,8536,1925],{"class":198},[151,8538,2532],{"class":161},[151,8540,1931],{"class":198},[151,8542,2519],{"class":198},[151,8544,8545],{"class":153,"line":454},[151,8546,2541],{"class":537},[151,8548,8549],{"class":153,"line":523},[151,8550,589],{"emptyLinePlaceholder":588},[151,8552,8553,8555,8557,8559,8561,8563,8565,8567,8569],{"class":153,"line":612},[151,8554,1993],{"class":537},[151,8556,1996],{"class":198},[151,8558,2000],{"class":1999},[151,8560,2556],{"class":537},[151,8562,2559],{"class":1331},[151,8564,2562],{"class":537},[151,8566,2349],{"class":198},[151,8568,2567],{"class":537},[151,8570,2570],{"class":2006},[151,8572,8573,8575,8577,8579,8581,8583,8585,8587,8589],{"class":153,"line":617},[151,8574,1993],{"class":537},[151,8576,1996],{"class":198},[151,8578,2000],{"class":1999},[151,8580,2556],{"class":537},[151,8582,2583],{"class":1331},[151,8584,2562],{"class":537},[151,8586,2349],{"class":198},[151,8588,2567],{"class":537},[151,8590,2425],{"class":2006},[151,8592,8593],{"class":153,"line":626},[151,8594,589],{"emptyLinePlaceholder":588},[151,8596,8597,8599,8601,8603],{"class":153,"line":2010},[151,8598,1904],{"class":1903},[151,8600,2602],{"class":537},[151,8602,1910],{"class":198},[151,8604,2607],{"class":198},[151,8606,8607],{"class":153,"line":2109},[151,8608,589],{"emptyLinePlaceholder":588},[151,8610,8611,8613,8615,8617,8619,8621,8623,8625,8627],{"class":153,"line":2123},[151,8612,1993],{"class":537},[151,8614,1996],{"class":198},[151,8616,2000],{"class":1999},[151,8618,2622],{"class":537},[151,8620,2349],{"class":198},[151,8622,2627],{"class":537},[151,8624,2630],{"class":1331},[151,8626,2633],{"class":537},[151,8628,2425],{"class":2006},[64,8630,2638],{"id":2638},[10,8632,2641,8633,2645],{},[17,8634,2644],{},[22,8636,8637],{"className":1894,"code":2648,"language":1896,"meta":28,"style":28},[17,8638,8639,8649,8667,8671,8675,8695],{"__ignoreMap":28},[151,8640,8641,8643,8645,8647],{"class":153,"line":154},[151,8642,1904],{"class":1903},[151,8644,2657],{"class":537},[151,8646,1910],{"class":198},[151,8648,1913],{"class":198},[151,8650,8651,8653,8655,8657,8659,8661,8663,8665],{"class":153,"line":297},[151,8652,2666],{"class":1999},[151,8654,1922],{"class":198},[151,8656,2671],{"class":198},[151,8658,2674],{"class":1903},[151,8660,1925],{"class":198},[151,8662,1928],{"class":161},[151,8664,1931],{"class":198},[151,8666,1934],{"class":198},[151,8668,8669],{"class":153,"line":306},[151,8670,1955],{"class":198},[151,8672,8673],{"class":153,"line":454},[151,8674,589],{"emptyLinePlaceholder":588},[151,8676,8677,8679,8681,8683,8685,8687,8689,8691,8693],{"class":153,"line":523},[151,8678,1993],{"class":537},[151,8680,1996],{"class":198},[151,8682,2000],{"class":1999},[151,8684,2701],{"class":537},[151,8686,1996],{"class":198},[151,8688,2706],{"class":1999},[151,8690,2349],{"class":198},[151,8692,2711],{"class":537},[151,8694,2007],{"class":2006},[151,8696,8697,8699,8701,8703,8705,8707,8709,8711,8713],{"class":153,"line":612},[151,8698,1993],{"class":537},[151,8700,1996],{"class":198},[151,8702,2000],{"class":1999},[151,8704,2701],{"class":537},[151,8706,1996],{"class":198},[151,8708,2728],{"class":1999},[151,8710,2349],{"class":198},[151,8712,2711],{"class":537},[151,8714,2425],{"class":2006},[10,8716,2737,8717,2741,8719,2744],{},[17,8718,2740],{},[17,8720,2644],{},[64,8722,2748],{"id":2747},[10,8724,8725,2754,8727,2757],{},[17,8726,2753],{},[17,8728,2356],{},[22,8730,8731],{"className":1894,"code":2760,"language":1896,"meta":28,"style":28},[17,8732,8733,8757,8761],{"__ignoreMap":28},[151,8734,8735,8737,8739,8741,8743,8745,8747,8749,8751,8753,8755],{"class":153,"line":154},[151,8736,1904],{"class":1903},[151,8738,2769],{"class":537},[151,8740,1910],{"class":198},[151,8742,2774],{"class":537},[151,8744,1996],{"class":198},[151,8746,2753],{"class":1999},[151,8748,2781],{"class":537},[151,8750,1931],{"class":198},[151,8752,2786],{"class":161},[151,8754,1931],{"class":198},[151,8756,2791],{"class":537},[151,8758,8759],{"class":153,"line":297},[151,8760,589],{"emptyLinePlaceholder":588},[151,8762,8763,8765,8767,8769,8771,8773,8775],{"class":153,"line":306},[151,8764,1993],{"class":537},[151,8766,1996],{"class":198},[151,8768,2000],{"class":1999},[151,8770,2806],{"class":537},[151,8772,2349],{"class":198},[151,8774,2811],{"class":537},[151,8776,2814],{"class":2006},[64,8778,2817],{"id":2817},[10,8780,2820,8781,2357,8783,2825],{},[17,8782,2356],{},[17,8784,2360],{},[22,8786,8787],{"className":1894,"code":2828,"language":1896,"meta":28,"style":28},[17,8788,8789,8799,8809,8813,8831,8835,8847],{"__ignoreMap":28},[151,8790,8791,8793,8795,8797],{"class":153,"line":154},[151,8792,2835],{"class":1903},[151,8794,2838],{"class":537},[151,8796,1910],{"class":198},[151,8798,2843],{"class":1331},[151,8800,8801,8803,8805,8807],{"class":153,"line":297},[151,8802,1904],{"class":1903},[151,8804,2495],{"class":537},[151,8806,1910],{"class":198},[151,8808,2854],{"class":198},[151,8810,8811],{"class":153,"line":306},[151,8812,589],{"emptyLinePlaceholder":588},[151,8814,8815,8817,8819,8821,8823,8825,8827,8829],{"class":153,"line":454},[151,8816,1904],{"class":1903},[151,8818,2865],{"class":537},[151,8820,1910],{"class":198},[151,8822,2870],{"class":537},[151,8824,2349],{"class":198},[151,8826,2875],{"class":537},[151,8828,2878],{"class":198},[151,8830,2541],{"class":537},[151,8832,8833],{"class":153,"line":523},[151,8834,589],{"emptyLinePlaceholder":588},[151,8836,8837,8839,8841,8843,8845],{"class":153,"line":612},[151,8838,1993],{"class":537},[151,8840,1996],{"class":198},[151,8842,2000],{"class":1999},[151,8844,2895],{"class":537},[151,8846,2425],{"class":2006},[151,8848,8849,8851,8853,8855,8857],{"class":153,"line":617},[151,8850,1993],{"class":537},[151,8852,1996],{"class":198},[151,8854,2000],{"class":1999},[151,8856,2908],{"class":537},[151,8858,2911],{"class":2006},[10,8860,2914],{},[22,8862,8863],{"className":1894,"code":2917,"language":1896,"meta":28,"style":28},[17,8864,8865,8875,8879,8893],{"__ignoreMap":28},[151,8866,8867,8869,8871,8873],{"class":153,"line":154},[151,8868,1904],{"class":1903},[151,8870,1907],{"class":537},[151,8872,1910],{"class":198},[151,8874,2854],{"class":198},[151,8876,8877],{"class":153,"line":297},[151,8878,589],{"emptyLinePlaceholder":588},[151,8880,8881,8883,8885,8887,8889,8891],{"class":153,"line":306},[151,8882,2938],{"class":537},[151,8884,2349],{"class":198},[151,8886,2417],{"class":537},[151,8888,1996],{"class":198},[151,8890,2947],{"class":537},[151,8892,2425],{"class":2006},[151,8894,8895,8897,8899,8901,8903,8905],{"class":153,"line":454},[151,8896,2412],{"class":537},[151,8898,2349],{"class":198},[151,8900,2958],{"class":537},[151,8902,1996],{"class":198},[151,8904,2947],{"class":537},[151,8906,2965],{"class":2006},[10,8908,2968,8909,2972],{},[17,8910,2971],{},[54,8912,8913,2975],{"id":2975},[17,8914,2978],{},[10,8916,2981,8917,2357,8919,2986,8921,2989],{},[17,8918,2356],{},[17,8920,2360],{},[17,8922,2978],{},[22,8924,8925],{"className":1894,"code":2992,"language":1896,"meta":28,"style":28},[17,8926,8927,8937,8941,8967,8971],{"__ignoreMap":28},[151,8928,8929,8931,8933,8935],{"class":153,"line":154},[151,8930,1904],{"class":1903},[151,8932,1907],{"class":537},[151,8934,1910],{"class":198},[151,8936,3005],{"class":198},[151,8938,8939],{"class":153,"line":297},[151,8940,589],{"emptyLinePlaceholder":588},[151,8942,8943,8945,8947,8949,8951,8953,8955,8957,8959,8961,8963,8965],{"class":153,"line":306},[151,8944,1904],{"class":1903},[151,8946,3016],{"class":537},[151,8948,1910],{"class":198},[151,8950,3021],{"class":537},[151,8952,1996],{"class":198},[151,8954,2417],{"class":537},[151,8956,2349],{"class":198},[151,8958,3030],{"class":537},[151,8960,2978],{"class":198},[151,8962,1925],{"class":198},[151,8964,3037],{"class":161},[151,8966,3040],{"class":198},[151,8968,8969],{"class":153,"line":454},[151,8970,589],{"emptyLinePlaceholder":588},[151,8972,8973,8975,8977,8979,8981],{"class":153,"line":523},[151,8974,1993],{"class":537},[151,8976,1996],{"class":198},[151,8978,2000],{"class":1999},[151,8980,3055],{"class":537},[151,8982,3058],{"class":2006},[10,8984,8985,2431,8987,3066,8989,3070,8991,3073,8993,2357,8995,3078],{},[17,8986,3063],{},[17,8988,2630],{},[17,8990,3069],{},[17,8992,2978],{},[17,8994,2356],{},[17,8996,2360],{},[54,8998,3081],{"id":3081},[10,9000,3084,9001,3087],{},[17,9002,2360],{},[10,9004,3090],{},[260,9006,9007,9011,9013],{},[263,9008,3095,9009,3098],{},[17,9010,2349],{},[263,9012,3101],{},[263,9014,3104,9015,3107],{},[17,9016,2978],{},[54,9018,640],{"id":640},[10,9020,3112],{},[10,9022,3115,9023,3118,9025,3121],{},[17,9024,2356],{},[17,9026,2360],{},[688,9028,3124],{},{"title":28,"searchDepth":297,"depth":297,"links":9030},[9031,9035,9041,9042,9043],{"id":1888,"depth":297,"text":1888,"children":9032},[9033,9034],{"id":2025,"depth":306,"text":2025},{"id":2252,"depth":306,"text":2252},{"id":2345,"depth":297,"text":3132,"children":9036},[9037,9038,9039,9040],{"id":2476,"depth":306,"text":2476},{"id":2638,"depth":306,"text":2638},{"id":2747,"depth":306,"text":2748},{"id":2817,"depth":306,"text":2817},{"id":2975,"depth":297,"text":3139},{"id":3081,"depth":297,"text":3081},{"id":640,"depth":297,"text":640},{},{"title":1878,"description":3142},[3149],{"id":3153,"title":3154,"body":9048,"description":4784,"extension":712,"meta":10391,"navigation":588,"path":4786,"publishDate":4787,"published":588,"seo":10392,"stem":4789,"tags":10393,"thumbnail":4791,"updated":4787,"__hash__":4792},{"type":7,"value":9049,"toc":10363},[9050,9052,9057,9067,9069,9073,9079,9103,9105,9109,9111,9113,9115,9151,9153,9155,9157,9163,9165,9167,9171,9177,9341,9349,9351,9353,9431,9433,9435,9503,9505,9507,9529,9531,9533,9539,9661,9663,9665,9667,9669,9671,9677,9685,9751,9755,9759,9763,9799,9803,9805,9807,9863,9867,9869,9873,9971,9977,9981,9985,10039,10041,10043,10045,10133,10135,10139,10155,10161,10163,10165,10237,10241,10243,10245,10353,10355,10357,10359,10361],[10,9051,12],{},[10,9053,3161,9054,3169],{},[3163,9055,3168],{"href":3165,"rel":9056},[3167],[260,9058,9059,9061,9063,9065],{},[263,9060,3174],{},[263,9062,3149],{},[263,9064,3179],{},[263,9066,3182],{},[54,9068,3174],{"id":3185},[64,9070,9071,3192],{"id":3188},[17,9072,3191],{},[10,9074,9075,3197,9077,3201],{},[17,9076,3191],{},[17,9078,3200],{},[22,9080,9081],{"className":3204,"code":3205,"language":3185,"meta":28,"style":28},[17,9082,9083],{"__ignoreMap":28},[151,9084,9085,9087,9089,9091,9093,9095,9097,9099,9101],{"class":153,"line":154},[151,9086,3212],{"class":198},[151,9088,3215],{"class":1918},[151,9090,3218],{"class":1903},[151,9092,1910],{"class":198},[151,9094,3223],{"class":198},[151,9096,27],{"class":161},[151,9098,3223],{"class":198},[151,9100,3230],{"class":1903},[151,9102,540],{"class":198},[10,9104,3235],{},[38,9106,9107],{"title":3238,"type":41},[10,9108,3241],{},[54,9110,3149],{"id":1896},[64,9112,3246],{"id":3246},[10,9114,3249],{},[22,9116,9117],{"className":1894,"code":3252,"language":1896,"meta":28,"style":28},[17,9118,9119,9123,9127,9131,9135,9139,9143,9147],{"__ignoreMap":28},[151,9120,9121],{"class":153,"line":154},[151,9122,3259],{},[151,9124,9125],{"class":153,"line":297},[151,9126,589],{"emptyLinePlaceholder":588},[151,9128,9129],{"class":153,"line":306},[151,9130,3268],{},[151,9132,9133],{"class":153,"line":454},[151,9134,3273],{},[151,9136,9137],{"class":153,"line":523},[151,9138,1955],{},[151,9140,9141],{"class":153,"line":612},[151,9142,589],{"emptyLinePlaceholder":588},[151,9144,9145],{"class":153,"line":617},[151,9146,3286],{},[151,9148,9149],{"class":153,"line":626},[151,9150,3291],{},[10,9152,3294],{},[64,9154,3298],{"id":3297},[10,9156,3301],{},[10,9158,3304,9159,2167,9161,3311],{},[17,9160,3307],{},[17,9162,3310],{},[10,9164,3314],{},[54,9166,3179],{"id":3317},[64,9168,9169],{"id":3320},[17,9170,3323],{},[10,9172,9173,3328,9175,3332],{},[17,9174,3323],{},[17,9176,3331],{},[22,9178,9179],{"className":3335,"code":3336,"language":3337,"meta":28,"style":28},[17,9180,9181,9199,9217,9231,9235,9259,9263,9275,9293,9297,9301,9313,9321,9329,9337],{"__ignoreMap":28},[151,9182,9183,9185,9187,9189,9191,9193,9195,9197],{"class":153,"line":154},[151,9184,3307],{"class":3344},[151,9186,1966],{"class":198},[151,9188,3349],{"class":537},[151,9190,3352],{"class":198},[151,9192,3355],{"class":3344},[151,9194,1925],{"class":198},[151,9196,3317],{"class":161},[151,9198,3040],{"class":198},[151,9200,9201,9203,9205,9207,9209,9211,9213,9215],{"class":153,"line":297},[151,9202,3307],{"class":3344},[151,9204,1966],{"class":198},[151,9206,3370],{"class":537},[151,9208,3352],{"class":198},[151,9210,3355],{"class":3344},[151,9212,1925],{"class":198},[151,9214,3379],{"class":161},[151,9216,3040],{"class":198},[151,9218,9219,9221,9223,9225,9227,9229],{"class":153,"line":306},[151,9220,3307],{"class":3344},[151,9222,3388],{"class":537},[151,9224,3391],{"class":3344},[151,9226,1925],{"class":198},[151,9228,3396],{"class":161},[151,9230,3040],{"class":198},[151,9232,9233],{"class":153,"line":454},[151,9234,589],{"emptyLinePlaceholder":588},[151,9236,9237,9239,9241,9243,9245,9247,9249,9251,9253,9255,9257],{"class":153,"line":523},[151,9238,1904],{"class":1903},[151,9240,3409],{"class":537},[151,9242,1910],{"class":198},[151,9244,2774],{"class":537},[151,9246,1996],{"class":198},[151,9248,3418],{"class":1999},[151,9250,2781],{"class":537},[151,9252,1931],{"class":198},[151,9254,3425],{"class":161},[151,9256,1931],{"class":198},[151,9258,2791],{"class":537},[151,9260,9261],{"class":153,"line":612},[151,9262,589],{"emptyLinePlaceholder":588},[151,9264,9265,9267,9269,9271,9273],{"class":153,"line":617},[151,9266,3438],{"class":3344},[151,9268,3441],{"class":537},[151,9270,3444],{"class":198},[151,9272,3447],{"class":537},[151,9274,3450],{"class":198},[151,9276,9277,9279,9281,9283,9285,9287,9289,9291],{"class":153,"line":626},[151,9278,3455],{"class":3344},[151,9280,3458],{"class":198},[151,9282,3461],{"class":1999},[151,9284,2781],{"class":1918},[151,9286,1931],{"class":198},[151,9288,3468],{"class":161},[151,9290,1931],{"class":198},[151,9292,2791],{"class":1918},[151,9294,9295],{"class":153,"line":2010},[151,9296,1955],{"class":198},[151,9298,9299],{"class":153,"line":2109},[151,9300,589],{"emptyLinePlaceholder":588},[151,9302,9303,9305,9307,9309,9311],{"class":153,"line":2123},[151,9304,3323],{"class":1999},[151,9306,3487],{"class":537},[151,9308,1996],{"class":198},[151,9310,3331],{"class":1999},[151,9312,3494],{"class":537},[151,9314,9315,9317,9319],{"class":153,"line":2132},[151,9316,3499],{"class":198},[151,9318,3502],{"class":157},[151,9320,540],{"class":198},[151,9322,9323,9325,9327],{"class":153,"line":2137},[151,9324,3509],{"class":198},[151,9326,3512],{"class":157},[151,9328,3515],{"class":198},[151,9330,9331,9333,9335],{"class":153,"line":2150},[151,9332,3520],{"class":198},[151,9334,3502],{"class":157},[151,9336,3525],{"class":198},[151,9338,9339],{"class":153,"line":3528},[151,9340,2791],{"class":537},[10,9342,9343,3535,9345,3538,9347,2645],{},[17,9344,3323],{},[17,9346,3323],{},[17,9348,3541],{},[64,9350,3544],{"id":3544},[10,9352,3547],{},[22,9354,9355],{"className":3335,"code":3550,"language":3337,"meta":28,"style":28},[17,9356,9357,9367,9381,9393,9413,9421,9427],{"__ignoreMap":28},[151,9358,9359,9361,9363,9365],{"class":153,"line":154},[151,9360,3557],{"class":1999},[151,9362,2781],{"class":537},[151,9364,3563],{"class":3562},[151,9366,3566],{"class":1903},[151,9368,9369,9371,9373,9375,9377,9379],{"class":153,"line":297},[151,9370,3571],{"class":537},[151,9372,1996],{"class":198},[151,9374,3576],{"class":1999},[151,9376,2781],{"class":537},[151,9378,3581],{"class":3562},[151,9380,3566],{"class":1903},[151,9382,9383,9385,9387,9389,9391],{"class":153,"line":306},[151,9384,3588],{"class":537},[151,9386,1996],{"class":198},[151,9388,3593],{"class":537},[151,9390,3596],{"class":198},[151,9392,3599],{"class":537},[151,9394,9395,9397,9399,9401,9403,9405,9407,9409,9411],{"class":153,"line":454},[151,9396,3604],{"class":198},[151,9398,1966],{"class":198},[151,9400,3609],{"class":198},[151,9402,3581],{"class":537},[151,9404,1972],{"class":198},[151,9406,3616],{"class":1918},[151,9408,1922],{"class":198},[151,9410,3622],{"class":3621},[151,9412,3625],{"class":198},[151,9414,9415,9417,9419],{"class":153,"line":523},[151,9416,3630],{"class":198},[151,9418,3633],{"class":537},[151,9420,1934],{"class":198},[151,9422,9423,9425],{"class":153,"line":612},[151,9424,3640],{"class":537},[151,9426,1934],{"class":198},[151,9428,9429],{"class":153,"line":617},[151,9430,2791],{"class":537},[10,9432,3649],{},[10,9434,3652],{},[1505,9436,9437,9447],{},[1508,9438,9439],{},[1511,9440,9441,9443,9445],{},[1514,9442,3661],{},[1514,9444,3664],{},[1514,9446,3667],{},[1522,9448,9449,9463,9479,9491],{},[1511,9450,9451,9453,9459],{},[1527,9452,3674],{},[1527,9454,9455,91,9457],{},[17,9456,3679],{},[17,9458,3682],{},[1527,9460,3685,9461],{},[17,9462,3688],{},[1511,9464,9465,9467,9473],{},[1527,9466,3693],{},[1527,9468,9469,91,9471],{},[17,9470,3698],{},[17,9472,3701],{},[1527,9474,9475,91,9477],{},[17,9476,3706],{},[17,9478,3709],{},[1511,9480,9481,9483,9487],{},[1527,9482,3714],{},[1527,9484,3717,9485],{},[17,9486,3701],{},[1527,9488,9489],{},[17,9490,3576],{},[1511,9492,9493,9495,9499],{},[1527,9494,3728],{},[1527,9496,3731,9497],{},[17,9498,3734],{},[1527,9500,3737,9501],{},[17,9502,3734],{},[64,9504,3742],{"id":3742},[10,9506,3745],{},[22,9508,9509],{"className":3335,"code":3748,"language":3337,"meta":28,"style":28},[17,9510,9511],{"__ignoreMap":28},[151,9512,9513,9515,9517,9519,9521,9523,9525,9527],{"class":153,"line":154},[151,9514,3755],{"class":1999},[151,9516,2781],{"class":537},[151,9518,3760],{"class":3562},[151,9520,2674],{"class":1903},[151,9522,3765],{"class":537},[151,9524,3768],{"class":198},[151,9526,1332],{"class":1331},[151,9528,2791],{"class":537},[10,9530,3775],{},[64,9532,3778],{"id":3778},[10,9534,3781,9535,3785,9537,3789],{},[17,9536,3784],{},[17,9538,3788],{},[22,9540,9541],{"className":3335,"code":3792,"language":3337,"meta":28,"style":28},[17,9542,9543,9553,9573,9577,9581,9599,9613,9623,9627,9631,9657],{"__ignoreMap":28},[151,9544,9545,9547,9549,9551],{"class":153,"line":154},[151,9546,3799],{"class":1903},[151,9548,3802],{"class":157},[151,9550,1981],{"class":198},[151,9552,1913],{"class":198},[151,9554,9555,9557,9559,9561,9563,9565,9567,9569,9571],{"class":153,"line":297},[151,9556,3811],{"class":1918},[151,9558,1922],{"class":198},[151,9560,3441],{"class":198},[151,9562,3818],{"class":3562},[151,9564,1922],{"class":198},[151,9566,3823],{"class":157},[151,9568,3826],{"class":198},[151,9570,2674],{"class":1903},[151,9572,3831],{"class":157},[151,9574,9575],{"class":153,"line":306},[151,9576,1955],{"class":198},[151,9578,9579],{"class":153,"line":454},[151,9580,589],{"emptyLinePlaceholder":588},[151,9582,9583,9585,9587,9589,9591,9593,9595,9597],{"class":153,"line":523},[151,9584,3844],{"class":1903},[151,9586,3847],{"class":1999},[151,9588,3850],{"class":198},[151,9590,3853],{"class":3562},[151,9592,3856],{"class":198},[151,9594,3802],{"class":157},[151,9596,3826],{"class":198},[151,9598,1913],{"class":198},[151,9600,9601,9603,9605,9607,9609,9611],{"class":153,"line":612},[151,9602,3867],{"class":1903},[151,9604,3870],{"class":537},[151,9606,1981],{"class":198},[151,9608,2671],{"class":198},[151,9610,2674],{"class":1903},[151,9612,1913],{"class":198},[151,9614,9615,9617,9619,9621],{"class":153,"line":617},[151,9616,3883],{"class":1999},[151,9618,2781],{"class":1918},[151,9620,2559],{"class":1331},[151,9622,2791],{"class":1918},[151,9624,9625],{"class":153,"line":626},[151,9626,3894],{"class":198},[151,9628,9629],{"class":153,"line":2010},[151,9630,589],{"emptyLinePlaceholder":588},[151,9632,9633,9635,9637,9639,9641,9643,9645,9647,9649,9651,9653,9655],{"class":153,"line":2109},[151,9634,3903],{"class":3344},[151,9636,531],{"class":198},[151,9638,3215],{"class":1918},[151,9640,3218],{"class":1903},[151,9642,1910],{"class":198},[151,9644,3223],{"class":198},[151,9646,3916],{"class":161},[151,9648,3223],{"class":198},[151,9650,3853],{"class":1903},[151,9652,3923],{"class":198},[151,9654,3926],{"class":537},[151,9656,3929],{"class":198},[151,9658,9659],{"class":153,"line":2123},[151,9660,1955],{"class":198},[10,9662,3936],{},[64,9664,3939],{"id":3939},[10,9666,3942],{},[10,9668,3945],{},[54,9670,3182],{"id":3948},[64,9672,9673,2167,9675],{"id":3951},[17,9674,3954],{},[17,9676,2356],{},[10,9678,9679,3961,9681,3965,9683,3968],{},[17,9680,3954],{},[17,9682,3964],{},[17,9684,2356],{},[22,9686,9687],{"className":3971,"code":3972,"language":3948,"meta":28,"style":28},[17,9688,9689,9713,9717,9729,9747],{"__ignoreMap":28},[151,9690,9691,9693,9695,9697,9699,9701,9703,9705,9707,9709,9711],{"class":153,"line":154},[151,9692,1904],{"class":1903},[151,9694,3409],{"class":537},[151,9696,1910],{"class":198},[151,9698,2774],{"class":537},[151,9700,1996],{"class":198},[151,9702,3418],{"class":1999},[151,9704,2781],{"class":537},[151,9706,1931],{"class":198},[151,9708,3425],{"class":161},[151,9710,1931],{"class":198},[151,9712,2791],{"class":537},[151,9714,9715],{"class":153,"line":297},[151,9716,589],{"emptyLinePlaceholder":588},[151,9718,9719,9721,9723,9725,9727],{"class":153,"line":306},[151,9720,3438],{"class":3344},[151,9722,3441],{"class":537},[151,9724,3444],{"class":198},[151,9726,3447],{"class":537},[151,9728,3450],{"class":198},[151,9730,9731,9733,9735,9737,9739,9741,9743,9745],{"class":153,"line":454},[151,9732,3455],{"class":3344},[151,9734,3458],{"class":198},[151,9736,3461],{"class":1999},[151,9738,2781],{"class":1918},[151,9740,1931],{"class":198},[151,9742,3468],{"class":161},[151,9744,1931],{"class":198},[151,9746,2791],{"class":1918},[151,9748,9749],{"class":153,"line":523},[151,9750,1955],{"class":198},[10,9752,4039,9753,4042],{},[17,9754,3444],{},[64,9756,9757],{"id":4045},[17,9758,4045],{},[10,9760,4050,9761,4053],{},[17,9762,4045],{},[22,9764,9765],{"className":3971,"code":4056,"language":3948,"meta":28,"style":28},[17,9766,9767,9777,9787,9795],{"__ignoreMap":28},[151,9768,9769,9771,9773,9775],{"class":153,"line":154},[151,9770,3799],{"class":1903},[151,9772,4065],{"class":157},[151,9774,1981],{"class":198},[151,9776,1913],{"class":198},[151,9778,9779,9781,9783,9785],{"class":153,"line":297},[151,9780,4074],{"class":1903},[151,9782,4077],{"class":1918},[151,9784,1922],{"class":198},[151,9786,4082],{"class":157},[151,9788,9789,9791,9793],{"class":153,"line":306},[151,9790,4087],{"class":1918},[151,9792,1922],{"class":198},[151,9794,4092],{"class":157},[151,9796,9797],{"class":153,"line":454},[151,9798,1955],{"class":198},[10,9800,9801,4101],{},[17,9802,4045],{},[64,9804,4104],{"id":4104},[10,9806,4107],{},[22,9808,9809],{"className":3335,"code":4110,"language":3337,"meta":28,"style":28},[17,9810,9811,9837,9859],{"__ignoreMap":28},[151,9812,9813,9815,9817,9819,9821,9823,9825,9827,9829,9831,9833,9835],{"class":153,"line":154},[151,9814,3844],{"class":1903},[151,9816,3870],{"class":1999},[151,9818,2781],{"class":198},[151,9820,4123],{"class":3562},[151,9822,1922],{"class":198},[151,9824,4128],{"class":157},[151,9826,1996],{"class":198},[151,9828,4133],{"class":157},[151,9830,3212],{"class":198},[151,9832,4138],{"class":157},[151,9834,4141],{"class":198},[151,9836,1913],{"class":198},[151,9838,9839,9841,9843,9845,9847,9849,9851,9853,9855,9857],{"class":153,"line":297},[151,9840,4148],{"class":537},[151,9842,1996],{"class":198},[151,9844,2000],{"class":1999},[151,9846,2781],{"class":1918},[151,9848,4123],{"class":537},[151,9850,1996],{"class":198},[151,9852,4161],{"class":537},[151,9854,1996],{"class":198},[151,9856,4166],{"class":537},[151,9858,2791],{"class":1918},[151,9860,9861],{"class":153,"line":306},[151,9862,1955],{"class":198},[10,9864,4175,9865,4179],{},[17,9866,4178],{},[64,9868,4182],{"id":4182},[10,9870,4185,9871,4189],{},[17,9872,4188],{},[22,9874,9875],{"className":3971,"code":4192,"language":3948,"meta":28,"style":28},[17,9876,9877,9887,9895,9899,9903,9939,9967],{"__ignoreMap":28},[151,9878,9879,9881,9883,9885],{"class":153,"line":154},[151,9880,3799],{"class":1903},[151,9882,4201],{"class":157},[151,9884,1981],{"class":198},[151,9886,1913],{"class":198},[151,9888,9889,9891,9893],{"class":153,"line":297},[151,9890,4210],{"class":1918},[151,9892,1922],{"class":198},[151,9894,4082],{"class":157},[151,9896,9897],{"class":153,"line":306},[151,9898,1955],{"class":198},[151,9900,9901],{"class":153,"line":454},[151,9902,589],{"emptyLinePlaceholder":588},[151,9904,9905,9907,9909,9911,9913,9915,9917,9919,9921,9923,9925,9927,9929,9931,9933,9935,9937],{"class":153,"line":523},[151,9906,3844],{"class":1903},[151,9908,4229],{"class":1999},[151,9910,3212],{"class":198},[151,9912,4234],{"class":157},[151,9914,4237],{"class":1903},[151,9916,4201],{"class":157},[151,9918,4242],{"class":198},[151,9920,4245],{"class":3562},[151,9922,1922],{"class":198},[151,9924,4250],{"class":157},[151,9926,4253],{"class":537},[151,9928,1972],{"class":198},[151,9930,4077],{"class":3562},[151,9932,1922],{"class":198},[151,9934,3823],{"class":157},[151,9936,3826],{"class":198},[151,9938,1913],{"class":198},[151,9940,9941,9943,9945,9947,9949,9951,9953,9955,9957,9959,9961,9963,9965],{"class":153,"line":612},[151,9942,3903],{"class":3344},[151,9944,2870],{"class":537},[151,9946,1996],{"class":198},[151,9948,4276],{"class":1999},[151,9950,2781],{"class":1918},[151,9952,4281],{"class":3562},[151,9954,2674],{"class":1903},[151,9956,4286],{"class":537},[151,9958,1996],{"class":198},[151,9960,3818],{"class":537},[151,9962,4293],{"class":198},[151,9964,4077],{"class":537},[151,9966,2791],{"class":1918},[151,9968,9969],{"class":153,"line":617},[151,9970,1955],{"class":198},[10,9972,4304,9973,4307,9975,4310],{},[17,9974,4234],{},[17,9976,3818],{},[64,9978,9979,4317],{"id":4313},[17,9980,4316],{},[10,9982,9983,4322],{},[17,9984,4316],{},[22,9986,9987],{"className":3971,"code":4325,"language":3948,"meta":28,"style":28},[17,9988,9989,9999,10007,10015,10019,10023,10035],{"__ignoreMap":28},[151,9990,9991,9993,9995,9997],{"class":153,"line":154},[151,9992,3799],{"class":1903},[151,9994,4065],{"class":157},[151,9996,1981],{"class":198},[151,9998,1913],{"class":198},[151,10000,10001,10003,10005],{"class":153,"line":297},[151,10002,4210],{"class":1918},[151,10004,1922],{"class":198},[151,10006,4082],{"class":157},[151,10008,10009,10011,10013],{"class":153,"line":306},[151,10010,4087],{"class":1918},[151,10012,1922],{"class":198},[151,10014,4092],{"class":157},[151,10016,10017],{"class":153,"line":454},[151,10018,1955],{"class":198},[151,10020,10021],{"class":153,"line":523},[151,10022,589],{"emptyLinePlaceholder":588},[151,10024,10025,10027,10029,10031,10033],{"class":153,"line":612},[151,10026,3799],{"class":1903},[151,10028,4368],{"class":157},[151,10030,1981],{"class":198},[151,10032,4373],{"class":198},[151,10034,4376],{"class":157},[151,10036,10037],{"class":153,"line":617},[151,10038,4381],{"class":2006},[10,10040,4384],{},[64,10042,4387],{"id":4387},[10,10044,4390],{},[22,10046,10047],{"className":3971,"code":4393,"language":3948,"meta":28,"style":28},[17,10048,10049,10059,10067,10075,10079,10083,10103,10107,10111,10129],{"__ignoreMap":28},[151,10050,10051,10053,10055,10057],{"class":153,"line":154},[151,10052,3799],{"class":1903},[151,10054,4065],{"class":157},[151,10056,1981],{"class":198},[151,10058,1913],{"class":198},[151,10060,10061,10063,10065],{"class":153,"line":297},[151,10062,4210],{"class":1918},[151,10064,1922],{"class":198},[151,10066,4082],{"class":157},[151,10068,10069,10071,10073],{"class":153,"line":306},[151,10070,4087],{"class":1918},[151,10072,1922],{"class":198},[151,10074,4092],{"class":157},[151,10076,10077],{"class":153,"line":454},[151,10078,1955],{"class":198},[151,10080,10081],{"class":153,"line":523},[151,10082,589],{"emptyLinePlaceholder":588},[151,10084,10085,10087,10089,10091,10093,10095,10097,10099,10101],{"class":153,"line":612},[151,10086,3799],{"class":1903},[151,10088,4436],{"class":157},[151,10090,1981],{"class":198},[151,10092,4065],{"class":157},[151,10094,2627],{"class":537},[151,10096,1931],{"class":198},[151,10098,3818],{"class":161},[151,10100,1931],{"class":198},[151,10102,2541],{"class":537},[151,10104,10105],{"class":153,"line":617},[151,10106,4455],{"class":2006},[151,10108,10109],{"class":153,"line":626},[151,10110,589],{"emptyLinePlaceholder":588},[151,10112,10113,10115,10117,10119,10121,10123,10125,10127],{"class":153,"line":2010},[151,10114,3799],{"class":1903},[151,10116,4466],{"class":157},[151,10118,1981],{"class":198},[151,10120,4065],{"class":157},[151,10122,2627],{"class":537},[151,10124,4316],{"class":198},[151,10126,4065],{"class":157},[151,10128,2541],{"class":537},[151,10130,10131],{"class":153,"line":2109},[151,10132,4483],{"class":2006},[64,10134,4486],{"id":4486},[10,10136,10137,4492],{},[17,10138,4491],{},[22,10140,10141],{"className":3971,"code":4495,"language":3948,"meta":28,"style":28},[17,10142,10143],{"__ignoreMap":28},[151,10144,10145,10147,10149,10151,10153],{"class":153,"line":154},[151,10146,4491],{"class":1903},[151,10148,4504],{"class":1903},[151,10150,4507],{"class":537},[151,10152,1922],{"class":198},[151,10154,4092],{"class":157},[10,10156,4514,10157,4518,10159,4521],{},[17,10158,4517],{},[17,10160,4491],{},[64,10162,4524],{"id":4524},[10,10164,4527],{},[22,10166,10167],{"className":3971,"code":4530,"language":3948,"meta":28,"style":28},[17,10168,10169,10179,10195,10199,10203,10213,10233],{"__ignoreMap":28},[151,10170,10171,10173,10175,10177],{"class":153,"line":154},[151,10172,3799],{"class":1903},[151,10174,4539],{"class":157},[151,10176,1981],{"class":198},[151,10178,1913],{"class":198},[151,10180,10181,10183,10185,10187,10189,10191,10193],{"class":153,"line":297},[151,10182,4548],{"class":1918},[151,10184,2781],{"class":198},[151,10186,4553],{"class":3562},[151,10188,1922],{"class":198},[151,10190,4558],{"class":157},[151,10192,4561],{"class":198},[151,10194,4092],{"class":157},[151,10196,10197],{"class":153,"line":306},[151,10198,1955],{"class":198},[151,10200,10201],{"class":153,"line":454},[151,10202,589],{"emptyLinePlaceholder":588},[151,10204,10205,10207,10209,10211],{"class":153,"line":523},[151,10206,3799],{"class":1903},[151,10208,4578],{"class":157},[151,10210,1981],{"class":198},[151,10212,1913],{"class":198},[151,10214,10215,10217,10219,10221,10223,10225,10227,10229,10231],{"class":153,"line":612},[151,10216,4548],{"class":1918},[151,10218,1922],{"class":198},[151,10220,3441],{"class":198},[151,10222,4553],{"class":3562},[151,10224,1922],{"class":198},[151,10226,4558],{"class":157},[151,10228,3826],{"class":198},[151,10230,2674],{"class":1903},[151,10232,4092],{"class":157},[151,10234,10235],{"class":153,"line":617},[151,10236,1955],{"class":198},[10,10238,4609,10239,4613],{},[17,10240,4612],{},[64,10242,4616],{"id":4616},[10,10244,4619],{},[22,10246,10247],{"className":3971,"code":4622,"language":3948,"meta":28,"style":28},[17,10248,10249,10273,10289,10293,10297,10311,10315,10327,10349],{"__ignoreMap":28},[151,10250,10251,10253,10255,10257,10259,10261,10263,10265,10267,10269,10271],{"class":153,"line":154},[151,10252,3844],{"class":1903},[151,10254,4631],{"class":1999},[151,10256,2781],{"class":198},[151,10258,4553],{"class":3562},[151,10260,1922],{"class":198},[151,10262,4640],{"class":157},[151,10264,4561],{"class":198},[151,10266,4645],{"class":3562},[151,10268,4648],{"class":198},[151,10270,3823],{"class":157},[151,10272,1913],{"class":198},[151,10274,10275,10277,10279,10281,10283,10285,10287],{"class":153,"line":297},[151,10276,3903],{"class":3344},[151,10278,4659],{"class":198},[151,10280,4645],{"class":537},[151,10282,4293],{"class":198},[151,10284,1925],{"class":198},[151,10286,4668],{"class":161},[151,10288,3040],{"class":198},[151,10290,10291],{"class":153,"line":306},[151,10292,1955],{"class":198},[151,10294,10295],{"class":153,"line":454},[151,10296,589],{"emptyLinePlaceholder":588},[151,10298,10299,10301,10303,10305,10307,10309],{"class":153,"line":523},[151,10300,1904],{"class":1903},[151,10302,4645],{"class":537},[151,10304,1922],{"class":198},[151,10306,4640],{"class":157},[151,10308,1981],{"class":198},[151,10310,4693],{"class":1331},[151,10312,10313],{"class":153,"line":612},[151,10314,589],{"emptyLinePlaceholder":588},[151,10316,10317,10319,10321,10323,10325],{"class":153,"line":617},[151,10318,3438],{"class":3344},[151,10320,3441],{"class":537},[151,10322,4706],{"class":1999},[151,10324,4709],{"class":537},[151,10326,3450],{"class":198},[151,10328,10329,10331,10333,10335,10337,10339,10341,10343,10345,10347],{"class":153,"line":626},[151,10330,4148],{"class":537},[151,10332,1996],{"class":198},[151,10334,2000],{"class":1999},[151,10336,2781],{"class":1918},[151,10338,4553],{"class":537},[151,10340,1996],{"class":198},[151,10342,4728],{"class":1999},[151,10344,2781],{"class":1918},[151,10346,4733],{"class":1331},[151,10348,4736],{"class":1918},[151,10350,10351],{"class":153,"line":2010},[151,10352,1955],{"class":198},[10,10354,4743],{},[54,10356,640],{"id":640},[10,10358,4748],{},[10,10360,4751],{},[688,10362,4754],{},{"title":28,"searchDepth":297,"depth":297,"links":10364},[10365,10368,10372,10379,10390],{"id":3185,"depth":297,"text":3174,"children":10366},[10367],{"id":3188,"depth":306,"text":3188},{"id":1896,"depth":297,"text":3149,"children":10369},[10370,10371],{"id":3246,"depth":306,"text":3246},{"id":3297,"depth":306,"text":3298},{"id":3317,"depth":297,"text":3179,"children":10373},[10374,10375,10376,10377,10378],{"id":3320,"depth":306,"text":3323},{"id":3544,"depth":306,"text":3544},{"id":3742,"depth":306,"text":3742},{"id":3778,"depth":306,"text":3778},{"id":3939,"depth":306,"text":3939},{"id":3948,"depth":297,"text":3182,"children":10380},[10381,10382,10383,10384,10385,10386,10387,10388,10389],{"id":3951,"depth":306,"text":4774},{"id":4045,"depth":306,"text":4045},{"id":4104,"depth":306,"text":4104},{"id":4182,"depth":306,"text":4182},{"id":4313,"depth":306,"text":4313},{"id":4387,"depth":306,"text":4387},{"id":4486,"depth":306,"text":4486},{"id":4524,"depth":306,"text":4524},{"id":4616,"depth":306,"text":4616},{"id":640,"depth":297,"text":640},{},{"title":3154,"description":4784},[3179,3182],{"id":4794,"title":4795,"body":10395,"description":5273,"extension":712,"meta":10769,"navigation":588,"path":5275,"publishDate":5276,"published":588,"seo":10770,"stem":5278,"tags":10771,"thumbnail":5281,"updated":5276,"__hash__":5282},{"type":7,"value":10396,"toc":10759},[10397,10399,10401,10407,10409,10411,10413,10415,10481,10483,10487,10489,10513,10519,10563,10565,10567,10573,10589,10591,10593,10595,10597,10599,10683,10685,10695,10697,10699,10701,10721,10725,10727,10729,10733,10735,10737,10749,10751,10753,10755,10757],[10,10398,12],{},[10,10400,4802],{},[10,10402,4805,10403,91,10405,4812],{},[17,10404,4808],{},[17,10406,4811],{},[54,10408,4815],{"id":4815},[10,10410,4818],{},[10,10412,4821],{},[10,10414,4824],{},[1505,10416,10417,10429],{},[1508,10418,10419],{},[1511,10420,10421,10423,10425,10427],{},[1514,10422,1516],{},[1514,10424,4808],{},[1514,10426,4811],{},[1514,10428,4839],{},[1522,10430,10431,10441,10451,10461,10471],{},[1511,10432,10433,10435,10437,10439],{},[1527,10434,4846],{},[1527,10436,4849],{},[1527,10438,4849],{},[1527,10440,4854],{},[1511,10442,10443,10445,10447,10449],{},[1527,10444,4859],{},[1527,10446,4862],{},[1527,10448,4862],{},[1527,10450,4867],{},[1511,10452,10453,10455,10457,10459],{},[1527,10454,4872],{},[1527,10456,4875],{},[1527,10458,4878],{},[1527,10460,4875],{},[1511,10462,10463,10465,10467,10469],{},[1527,10464,4885],{},[1527,10466,4888],{},[1527,10468,4891],{},[1527,10470,4888],{},[1511,10472,10473,10475,10477,10479],{},[1527,10474,4898],{},[1527,10476,4901],{},[1527,10478,4904],{},[1527,10480,4907],{},[54,10482,4808],{"id":4910},[10,10484,10485,4915],{},[17,10486,4808],{},[10,10488,4918],{},[22,10490,10491],{"className":1894,"code":4921,"language":1896,"meta":28,"style":28},[17,10492,10493,10497,10501,10505,10509],{"__ignoreMap":28},[151,10494,10495],{"class":153,"line":154},[151,10496,4928],{},[151,10498,10499],{"class":153,"line":297},[151,10500,589],{"emptyLinePlaceholder":588},[151,10502,10503],{"class":153,"line":306},[151,10504,4937],{},[151,10506,10507],{"class":153,"line":454},[151,10508,589],{"emptyLinePlaceholder":588},[151,10510,10511],{"class":153,"line":523},[151,10512,4946],{},[10,10514,4949,10515,4953,10517,4957],{},[17,10516,4952],{},[17,10518,4956],{},[22,10520,10521],{"className":1894,"code":4960,"language":1896,"meta":28,"style":28},[17,10522,10523,10527,10531,10535,10539,10543,10547,10551,10555,10559],{"__ignoreMap":28},[151,10524,10525],{"class":153,"line":154},[151,10526,4967],{},[151,10528,10529],{"class":153,"line":297},[151,10530,4972],{},[151,10532,10533],{"class":153,"line":306},[151,10534,4977],{},[151,10536,10537],{"class":153,"line":454},[151,10538,1955],{},[151,10540,10541],{"class":153,"line":523},[151,10542,589],{"emptyLinePlaceholder":588},[151,10544,10545],{"class":153,"line":612},[151,10546,4990],{},[151,10548,10549],{"class":153,"line":617},[151,10550,589],{"emptyLinePlaceholder":588},[151,10552,10553],{"class":153,"line":626},[151,10554,4999],{},[151,10556,10557],{"class":153,"line":2010},[151,10558,5004],{},[151,10560,10561],{"class":153,"line":2109},[151,10562,2791],{},[10,10564,5011],{},[54,10566,4811],{"id":5014},[10,10568,10569,5019,10571,5022],{},[17,10570,4811],{},[17,10572,4808],{},[22,10574,10575],{"className":1894,"code":5025,"language":1896,"meta":28,"style":28},[17,10576,10577,10581,10585],{"__ignoreMap":28},[151,10578,10579],{"class":153,"line":154},[151,10580,5032],{},[151,10582,10583],{"class":153,"line":297},[151,10584,589],{"emptyLinePlaceholder":588},[151,10586,10587],{"class":153,"line":306},[151,10588,5041],{},[10,10590,5044],{},[10,10592,5047],{},[54,10594,4839],{"id":5050},[10,10596,5053],{},[10,10598,5056],{},[22,10600,10601],{"className":1894,"code":5059,"language":1896,"meta":28,"style":28},[17,10602,10603,10607,10611,10615,10619,10623,10627,10631,10635,10639,10643,10647,10651,10655,10659,10663,10667,10671,10675,10679],{"__ignoreMap":28},[151,10604,10605],{"class":153,"line":154},[151,10606,5066],{},[151,10608,10609],{"class":153,"line":297},[151,10610,589],{"emptyLinePlaceholder":588},[151,10612,10613],{"class":153,"line":306},[151,10614,5075],{},[151,10616,10617],{"class":153,"line":454},[151,10618,5080],{},[151,10620,10621],{"class":153,"line":523},[151,10622,589],{"emptyLinePlaceholder":588},[151,10624,10625],{"class":153,"line":612},[151,10626,5089],{},[151,10628,10629],{"class":153,"line":617},[151,10630,5094],{},[151,10632,10633],{"class":153,"line":626},[151,10634,5099],{},[151,10636,10637],{"class":153,"line":2010},[151,10638,5104],{},[151,10640,10641],{"class":153,"line":2109},[151,10642,5109],{},[151,10644,10645],{"class":153,"line":2123},[151,10646,3894],{},[151,10648,10649],{"class":153,"line":2132},[151,10650,1955],{},[151,10652,10653],{"class":153,"line":2137},[151,10654,589],{"emptyLinePlaceholder":588},[151,10656,10657],{"class":153,"line":2150},[151,10658,5126],{},[151,10660,10661],{"class":153,"line":3528},[151,10662,5080],{},[151,10664,10665],{"class":153,"line":5133},[151,10666,5136],{},[151,10668,10669],{"class":153,"line":5139},[151,10670,5142],{},[151,10672,10673],{"class":153,"line":5145},[151,10674,589],{"emptyLinePlaceholder":588},[151,10676,10677],{"class":153,"line":5150},[151,10678,5153],{},[151,10680,10681],{"class":153,"line":5156},[151,10682,1955],{},[10,10684,5161],{},[260,10686,10687,10689,10691,10693],{},[263,10688,5166],{},[263,10690,5169],{},[263,10692,5172],{},[263,10694,5175],{},[54,10696,5178],{"id":5178},[10,10698,5181],{},[10,10700,5184],{},[22,10702,10703],{"className":1894,"code":5187,"language":1896,"meta":28,"style":28},[17,10704,10705,10709,10713,10717],{"__ignoreMap":28},[151,10706,10707],{"class":153,"line":154},[151,10708,5194],{},[151,10710,10711],{"class":153,"line":297},[151,10712,589],{"emptyLinePlaceholder":588},[151,10714,10715],{"class":153,"line":306},[151,10716,5203],{},[151,10718,10719],{"class":153,"line":454},[151,10720,5208],{},[38,10722,10723],{"title":5211,"type":41},[10,10724,5214],{},[54,10726,5217],{"id":5217},[10,10728,5220],{},[38,10730,10731],{"title":5223,"type":5224},[10,10732,5227],{},[54,10734,5230],{"id":5230},[10,10736,5233],{},[260,10738,10739,10743,10747],{},[263,10740,5238,10741],{},[17,10742,4808],{},[263,10744,5243,10745],{},[17,10746,4811],{},[263,10748,5248],{},[10,10750,5251],{},[54,10752,640],{"id":640},[10,10754,5256],{},[10,10756,5259],{},[688,10758,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":10760},[10761,10762,10763,10764,10765,10766,10767,10768],{"id":4815,"depth":297,"text":4815},{"id":4910,"depth":297,"text":4808},{"id":5014,"depth":297,"text":4811},{"id":5050,"depth":297,"text":4839},{"id":5178,"depth":297,"text":5178},{"id":5217,"depth":297,"text":5217},{"id":5230,"depth":297,"text":5230},{"id":640,"depth":297,"text":640},{},{"title":4795,"description":5273},[5280,4839],{"id":5284,"title":5285,"body":10773,"description":5761,"extension":712,"meta":11140,"navigation":588,"path":5763,"publishDate":5764,"published":588,"seo":11141,"stem":5766,"tags":11142,"thumbnail":5768,"updated":5764,"__hash__":5769},{"type":7,"value":10774,"toc":11130},[10775,10777,10782,10784,10786,10788,10790,10792,10804,10806,10808,10810,10866,10868,10894,10896,10898,10900,10902,10912,10914,10950,10952,10954,10956,10958,10968,10972,10974,10976,10978,10996,10998,11000,11002,11004,11006,11018,11020,11022,11086,11088,11093,11099,11105,11107,11121,11123,11128],[10,10776,12],{},[10,10778,5292,10779,5298],{},[3163,10780,5297],{"href":5295,"rel":10781},[3167],[10,10783,5301],{},[54,10785,5305],{"id":5304},[10,10787,5308],{},[10,10789,5311],{},[10,10791,5314],{},[260,10793,10794,10796,10798,10800,10802],{},[263,10795,5319],{},[263,10797,5322],{},[263,10799,5325],{},[263,10801,5328],{},[263,10803,5331],{},[54,10805,5319],{"id":5319},[10,10807,5336],{},[10,10809,5339],{},[22,10811,10812],{"className":1894,"code":5342,"language":1896,"meta":28,"style":28},[17,10813,10814,10818,10822,10826,10830,10834,10838,10842,10846,10850,10854,10858,10862],{"__ignoreMap":28},[151,10815,10816],{"class":153,"line":154},[151,10817,5349],{},[151,10819,10820],{"class":153,"line":297},[151,10821,5354],{},[151,10823,10824],{"class":153,"line":306},[151,10825,1955],{},[151,10827,10828],{"class":153,"line":454},[151,10829,589],{"emptyLinePlaceholder":588},[151,10831,10832],{"class":153,"line":523},[151,10833,5367],{},[151,10835,10836],{"class":153,"line":612},[151,10837,5372],{},[151,10839,10840],{"class":153,"line":617},[151,10841,1955],{},[151,10843,10844],{"class":153,"line":626},[151,10845,589],{"emptyLinePlaceholder":588},[151,10847,10848],{"class":153,"line":2010},[151,10849,5385],{},[151,10851,10852],{"class":153,"line":2109},[151,10853,5390],{},[151,10855,10856],{"class":153,"line":2123},[151,10857,1955],{},[151,10859,10860],{"class":153,"line":2132},[151,10861,589],{"emptyLinePlaceholder":588},[151,10863,10864],{"class":153,"line":2137},[151,10865,5403],{},[10,10867,5406],{},[648,10869,10870,10874,10880,10886],{},[263,10871,10872,5414],{},[17,10873,5413],{},[263,10875,10876,5419,10878,5423],{},[17,10877,5413],{},[17,10879,5422],{},[263,10881,10882,5419,10884,5423],{},[17,10883,5422],{},[17,10885,5430],{},[263,10887,10888,91,10890,91,10892,5439],{},[17,10889,5430],{},[17,10891,5422],{},[17,10893,5413],{},[10,10895,5442],{},[54,10897,5322],{"id":5445},[10,10899,5448],{},[10,10901,5451],{},[260,10903,10904,10906,10908,10910],{},[263,10905,5456],{},[263,10907,5459],{},[263,10909,5462],{},[263,10911,5465],{},[10,10913,5468],{},[22,10915,10916],{"className":1894,"code":5471,"language":1896,"meta":28,"style":28},[17,10917,10918,10922,10926,10930,10934,10938,10942,10946],{"__ignoreMap":28},[151,10919,10920],{"class":153,"line":154},[151,10921,5478],{},[151,10923,10924],{"class":153,"line":297},[151,10925,5483],{},[151,10927,10928],{"class":153,"line":306},[151,10929,5488],{},[151,10931,10932],{"class":153,"line":454},[151,10933,2791],{},[151,10935,10936],{"class":153,"line":523},[151,10937,589],{"emptyLinePlaceholder":588},[151,10939,10940],{"class":153,"line":612},[151,10941,5501],{},[151,10943,10944],{"class":153,"line":617},[151,10945,5506],{},[151,10947,10948],{"class":153,"line":626},[151,10949,5511],{},[10,10951,5514],{},[54,10953,5325],{"id":5325},[10,10955,5519],{},[10,10957,5522],{},[260,10959,10960,10964,10966],{},[263,10961,10962,5530],{},[17,10963,5529],{},[263,10965,5533],{},[263,10967,5536],{},[10,10969,10970,5541],{},[17,10971,5529],{},[10,10973,5544],{},[54,10975,5328],{"id":5328},[10,10977,5549],{},[260,10979,10980,10988,10992],{},[263,10981,5554,10982,91,10984,91,10986],{},[17,10983,5557],{},[17,10985,5560],{},[17,10987,5563],{},[263,10989,10990,5569],{},[17,10991,5568],{},[263,10993,10994,5530],{},[17,10995,5574],{},[10,10997,5577],{},[10,10999,5580],{},[54,11001,5331],{"id":5331},[10,11003,5585],{},[10,11005,5588],{},[648,11007,11008,11010,11012,11014,11016],{},[263,11009,5593],{},[263,11011,5596],{},[263,11013,5599],{},[263,11015,5602],{},[263,11017,5605],{},[54,11019,5608],{"id":5608},[10,11021,5611],{},[22,11023,11024],{"className":1894,"code":5614,"language":1896,"meta":28,"style":28},[17,11025,11026,11030,11034,11038,11042,11046,11050,11054,11058,11062,11066,11070,11074,11078,11082],{"__ignoreMap":28},[151,11027,11028],{"class":153,"line":154},[151,11029,5621],{},[151,11031,11032],{"class":153,"line":297},[151,11033,589],{"emptyLinePlaceholder":588},[151,11035,11036],{"class":153,"line":306},[151,11037,5630],{},[151,11039,11040],{"class":153,"line":454},[151,11041,5635],{},[151,11043,11044],{"class":153,"line":523},[151,11045,5640],{},[151,11047,11048],{"class":153,"line":612},[151,11049,589],{"emptyLinePlaceholder":588},[151,11051,11052],{"class":153,"line":617},[151,11053,5649],{},[151,11055,11056],{"class":153,"line":626},[151,11057,5654],{},[151,11059,11060],{"class":153,"line":2010},[151,11061,5659],{},[151,11063,11064],{"class":153,"line":2109},[151,11065,589],{"emptyLinePlaceholder":588},[151,11067,11068],{"class":153,"line":2123},[151,11069,5668],{},[151,11071,11072],{"class":153,"line":2132},[151,11073,5673],{},[151,11075,11076],{"class":153,"line":2137},[151,11077,5659],{},[151,11079,11080],{"class":153,"line":2150},[151,11081,589],{"emptyLinePlaceholder":588},[151,11083,11084],{"class":153,"line":3528},[151,11085,5686],{},[10,11087,5689],{},[22,11089,11091],{"className":11090,"code":5693,"language":27,"meta":28},[25],[17,11092,5693],{"__ignoreMap":28},[10,11094,5698,11095,87,11097,5705],{},[17,11096,5701],{},[17,11098,5704],{},[10,11100,5708,11101,5711,11103,5714],{},[17,11102,5568],{},[17,11104,5529],{},[54,11106,640],{"id":640},[260,11108,11109,11111,11113,11115,11117,11119],{},[263,11110,5721],{},[263,11112,5724],{},[263,11114,5727],{},[263,11116,5730],{},[263,11118,5733],{},[263,11120,5736],{},[10,11122,5739],{},[10,11124,5742,11125,5748],{},[3163,11126,5747],{"href":5745,"rel":11127},[3167],[688,11129,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":11131},[11132,11133,11134,11135,11136,11137,11138,11139],{"id":5304,"depth":297,"text":5305},{"id":5319,"depth":297,"text":5319},{"id":5445,"depth":297,"text":5322},{"id":5325,"depth":297,"text":5325},{"id":5328,"depth":297,"text":5328},{"id":5331,"depth":297,"text":5331},{"id":5608,"depth":297,"text":5608},{"id":640,"depth":297,"text":640},{},{"title":5285,"description":5761},[3149],{"id":5771,"title":5772,"body":11144,"description":6189,"extension":712,"meta":11466,"navigation":588,"path":6191,"publishDate":6192,"published":588,"seo":11467,"stem":6194,"tags":11468,"thumbnail":6196,"updated":6192,"__hash__":6197},{"type":7,"value":11145,"toc":11458},[11146,11148,11150,11152,11154,11156,11164,11169,11171,11177,11201,11211,11216,11218,11222,11258,11264,11270,11278,11298,11300,11304,11340,11344,11348,11368,11370,11376,11412,11418,11430,11432,11454,11456],[10,11147,12],{},[10,11149,5779],{},[10,11151,5782],{},[54,11153,5786],{"id":5785},[10,11155,5789],{},[10,11157,11158,91,11160,91,11162,5801],{},[17,11159,5794],{},[17,11161,5797],{},[17,11163,5800],{},[10,11165,5804,11166,5810],{},[3163,11167,5809],{"href":5807,"rel":11168},[3167],[54,11170,5814],{"id":5813},[10,11172,5817,11173,5820,11175,5824],{},[17,11174,2338],{},[17,11176,5823],{},[22,11178,11179],{"className":1894,"code":5827,"language":1896,"meta":28,"style":28},[17,11180,11181,11185,11189,11193,11197],{"__ignoreMap":28},[151,11182,11183],{"class":153,"line":154},[151,11184,5834],{},[151,11186,11187],{"class":153,"line":297},[151,11188,5839],{},[151,11190,11191],{"class":153,"line":306},[151,11192,1955],{},[151,11194,11195],{"class":153,"line":454},[151,11196,589],{"emptyLinePlaceholder":588},[151,11198,11199],{"class":153,"line":523},[151,11200,5852],{},[10,11202,5855,11203,5859,11205,5863,11207,5866,11209,5869],{},[17,11204,5858],{},[17,11206,5862],{},[17,11208,5862],{},[17,11210,5823],{},[10,11212,5872,11213,5748],{},[3163,11214,5877],{"href":5875,"rel":11215},[3167],[54,11217,5880],{"id":5880},[10,11219,5883,11220,5887],{},[17,11221,5886],{},[22,11223,11224],{"className":1894,"code":5890,"language":1896,"meta":28,"style":28},[17,11225,11226,11230,11234,11238,11242,11246,11250,11254],{"__ignoreMap":28},[151,11227,11228],{"class":153,"line":154},[151,11229,5834],{},[151,11231,11232],{"class":153,"line":297},[151,11233,5839],{},[151,11235,11236],{"class":153,"line":306},[151,11237,5905],{},[151,11239,11240],{"class":153,"line":454},[151,11241,5910],{},[151,11243,11244],{"class":153,"line":523},[151,11245,2086],{},[151,11247,11248],{"class":153,"line":612},[151,11249,1955],{},[151,11251,11252],{"class":153,"line":617},[151,11253,589],{"emptyLinePlaceholder":588},[151,11255,11256],{"class":153,"line":626},[151,11257,5927],{},[10,11259,5930,11260,5934,11262,5937],{},[17,11261,5933],{},[17,11263,1928],{},[10,11265,11266,5942,11268,5945],{},[17,11267,5858],{},[17,11269,5886],{},[10,11271,5948,11272,5952,11274,5955,11276,5958],{},[17,11273,5951],{},[17,11275,5862],{},[17,11277,5823],{},[22,11279,11280],{"className":1894,"code":5961,"language":1896,"meta":28,"style":28},[17,11281,11282,11286,11290,11294],{"__ignoreMap":28},[151,11283,11284],{"class":153,"line":154},[151,11285,5968],{},[151,11287,11288],{"class":153,"line":297},[151,11289,5973],{},[151,11291,11292],{"class":153,"line":306},[151,11293,589],{"emptyLinePlaceholder":588},[151,11295,11296],{"class":153,"line":454},[151,11297,5982],{},[54,11299,5986],{"id":5985},[10,11301,5989,11302,5993],{},[17,11303,5992],{},[22,11305,11306],{"className":1894,"code":5996,"language":1896,"meta":28,"style":28},[17,11307,11308,11312,11316,11320,11324,11328,11332,11336],{"__ignoreMap":28},[151,11309,11310],{"class":153,"line":154},[151,11311,5834],{},[151,11313,11314],{"class":153,"line":297},[151,11315,5839],{},[151,11317,11318],{"class":153,"line":306},[151,11319,5905],{},[151,11321,11322],{"class":153,"line":454},[151,11323,5910],{},[151,11325,11326],{"class":153,"line":523},[151,11327,2086],{},[151,11329,11330],{"class":153,"line":612},[151,11331,1955],{},[151,11333,11334],{"class":153,"line":617},[151,11335,589],{"emptyLinePlaceholder":588},[151,11337,11338],{"class":153,"line":626},[151,11339,6031],{},[10,11341,6034,11342,6037],{},[17,11343,5886],{},[10,11345,11346,6042],{},[17,11347,5951],{},[22,11349,11350],{"className":1894,"code":6045,"language":1896,"meta":28,"style":28},[17,11351,11352,11356,11360,11364],{"__ignoreMap":28},[151,11353,11354],{"class":153,"line":154},[151,11355,5968],{},[151,11357,11358],{"class":153,"line":297},[151,11359,5973],{},[151,11361,11362],{"class":153,"line":306},[151,11363,589],{"emptyLinePlaceholder":588},[151,11365,11366],{"class":153,"line":454},[151,11367,6031],{},[54,11369,6066],{"id":6066},[10,11371,11372,6071,11374,6075],{},[17,11373,5992],{},[17,11375,6074],{},[22,11377,11378],{"className":1894,"code":6078,"language":1896,"meta":28,"style":28},[17,11379,11380,11384,11388,11392,11396,11400,11404,11408],{"__ignoreMap":28},[151,11381,11382],{"class":153,"line":154},[151,11383,5834],{},[151,11385,11386],{"class":153,"line":297},[151,11387,5839],{},[151,11389,11390],{"class":153,"line":306},[151,11391,5905],{},[151,11393,11394],{"class":153,"line":454},[151,11395,5910],{},[151,11397,11398],{"class":153,"line":523},[151,11399,2086],{},[151,11401,11402],{"class":153,"line":612},[151,11403,1955],{},[151,11405,11406],{"class":153,"line":617},[151,11407,589],{"emptyLinePlaceholder":588},[151,11409,11410],{"class":153,"line":626},[151,11411,6113],{},[10,11413,11414,6119,11416,6123],{},[17,11415,6118],{},[17,11417,6122],{},[10,11419,6126,11420,6129,11422,6132,11424,6135,11426,6138,11428,6141],{},[17,11421,5862],{},[17,11423,5823],{},[17,11425,5858],{},[17,11427,6122],{},[17,11429,5858],{},[54,11431,640],{"id":640},[260,11433,11434,11438,11440,11446,11450],{},[263,11435,6148,11436,6151],{},[17,11437,5862],{},[263,11439,6154],{},[263,11441,11442,5952,11444,6161],{},[17,11443,5951],{},[17,11445,5823],{},[263,11447,6164,11448,6168],{},[17,11449,6167],{},[263,11451,6171,11452,6175],{},[17,11453,6174],{},[10,11455,6178],{},[688,11457,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":11459},[11460,11461,11462,11463,11464,11465],{"id":5785,"depth":297,"text":5786},{"id":5813,"depth":297,"text":5814},{"id":5880,"depth":297,"text":5880},{"id":5985,"depth":297,"text":5986},{"id":6066,"depth":297,"text":6066},{"id":640,"depth":297,"text":640},{},{"title":5772,"description":6189},[3149],{"id":6199,"title":6200,"body":11470,"description":6580,"extension":712,"meta":11765,"navigation":588,"path":6582,"publishDate":6583,"published":588,"seo":11766,"stem":6585,"tags":11767,"thumbnail":6587,"updated":6583,"__hash__":6588},{"type":7,"value":11471,"toc":11758},[11472,11474,11476,11478,11480,11482,11484,11489,11491,11495,11539,11547,11559,11561,11581,11583,11591,11593,11597,11641,11645,11657,11659,11679,11689,11693,11698,11700,11702,11710,11712,11730,11734,11736,11754,11756],[10,11473,12],{},[10,11475,6207],{},[10,11477,6210],{},[54,11479,6214],{"id":6213},[10,11481,6217],{},[10,11483,6220],{},[10,11485,6223,11486,6229],{},[3163,11487,6228],{"href":6226,"rel":11488},[3167],[54,11490,6232],{"id":6232},[10,11492,6235,11493,6239],{},[17,11494,6238],{},[22,11496,11497],{"className":1894,"code":6242,"language":1896,"meta":28,"style":28},[17,11498,11499,11503,11507,11511,11515,11519,11523,11527,11531,11535],{"__ignoreMap":28},[151,11500,11501],{"class":153,"line":154},[151,11502,6249],{},[151,11504,11505],{"class":153,"line":297},[151,11506,6254],{},[151,11508,11509],{"class":153,"line":306},[151,11510,6259],{},[151,11512,11513],{"class":153,"line":454},[151,11514,2086],{},[151,11516,11517],{"class":153,"line":523},[151,11518,6268],{},[151,11520,11521],{"class":153,"line":612},[151,11522,6273],{},[151,11524,11525],{"class":153,"line":617},[151,11526,2086],{},[151,11528,11529],{"class":153,"line":626},[151,11530,1955],{},[151,11532,11533],{"class":153,"line":2010},[151,11534,589],{"emptyLinePlaceholder":588},[151,11536,11537],{"class":153,"line":2109},[151,11538,6290],{},[10,11540,11541,6296,11543,6299,11545,6303],{},[17,11542,6295],{},[17,11544,2938],{},[17,11546,6302],{},[22,11548,11549],{"className":1894,"code":6306,"language":1896,"meta":28,"style":28},[17,11550,11551,11555],{"__ignoreMap":28},[151,11552,11553],{"class":153,"line":154},[151,11554,6313],{},[151,11556,11557],{"class":153,"line":297},[151,11558,6318],{},[10,11560,6321],{},[22,11562,11563],{"className":1894,"code":6324,"language":1896,"meta":28,"style":28},[17,11564,11565,11569,11573,11577],{"__ignoreMap":28},[151,11566,11567],{"class":153,"line":154},[151,11568,6331],{},[151,11570,11571],{"class":153,"line":297},[151,11572,589],{"emptyLinePlaceholder":588},[151,11574,11575],{"class":153,"line":306},[151,11576,6340],{},[151,11578,11579],{"class":153,"line":454},[151,11580,6345],{},[10,11582,6348],{},[22,11584,11585],{"className":1894,"code":6351,"language":1896,"meta":28,"style":28},[17,11586,11587],{"__ignoreMap":28},[151,11588,11589],{"class":153,"line":154},[151,11590,6351],{},[54,11592,6361],{"id":6360},[10,11594,6364,11595,6368],{},[17,11596,6367],{},[22,11598,11599],{"className":1894,"code":6371,"language":1896,"meta":28,"style":28},[17,11600,11601,11605,11609,11613,11617,11621,11625,11629,11633,11637],{"__ignoreMap":28},[151,11602,11603],{"class":153,"line":154},[151,11604,6249],{},[151,11606,11607],{"class":153,"line":297},[151,11608,6254],{},[151,11610,11611],{"class":153,"line":306},[151,11612,6259],{},[151,11614,11615],{"class":153,"line":454},[151,11616,2086],{},[151,11618,11619],{"class":153,"line":523},[151,11620,6268],{},[151,11622,11623],{"class":153,"line":612},[151,11624,6273],{},[151,11626,11627],{"class":153,"line":617},[151,11628,2086],{},[151,11630,11631],{"class":153,"line":626},[151,11632,1955],{},[151,11634,11635],{"class":153,"line":2010},[151,11636,589],{"emptyLinePlaceholder":588},[151,11638,11639],{"class":153,"line":2109},[151,11640,6414],{},[10,11642,11643,6419],{},[17,11644,6367],{},[22,11646,11647],{"className":1894,"code":6422,"language":1896,"meta":28,"style":28},[17,11648,11649,11653],{"__ignoreMap":28},[151,11650,11651],{"class":153,"line":154},[151,11652,6429],{},[151,11654,11655],{"class":153,"line":297},[151,11656,6434],{},[10,11658,6437],{},[22,11660,11661],{"className":1894,"code":6440,"language":1896,"meta":28,"style":28},[17,11662,11663,11667,11671,11675],{"__ignoreMap":28},[151,11664,11665],{"class":153,"line":154},[151,11666,6447],{},[151,11668,11669],{"class":153,"line":297},[151,11670,589],{"emptyLinePlaceholder":588},[151,11672,11673],{"class":153,"line":306},[151,11674,6456],{},[151,11676,11677],{"class":153,"line":454},[151,11678,6461],{},[10,11680,11681,6466,11683,91,11685,91,11687,6476],{},[17,11682,6367],{},[17,11684,6469],{},[17,11686,6472],{},[17,11688,6475],{},[10,11690,6479,11691,6483],{},[17,11692,6482],{},[10,11694,6486,11695,6492],{},[3163,11696,6491],{"href":6489,"rel":11697},[3167],[54,11699,6496],{"id":6495},[10,11701,6499],{},[22,11703,11704],{"className":1894,"code":6502,"language":1896,"meta":28,"style":28},[17,11705,11706],{"__ignoreMap":28},[151,11707,11708],{"class":153,"line":154},[151,11709,6502],{},[10,11711,6511],{},[260,11713,11714,11718,11724,11728],{},[263,11715,11716,6518],{},[17,11717,6469],{},[263,11719,11720,6523,11722,6527],{},[17,11721,2360],{},[17,11723,6526],{},[263,11725,11726,6533],{},[17,11727,6532],{},[263,11729,6536],{},[10,11731,6539,11732,6542],{},[17,11733,6367],{},[54,11735,640],{"id":640},[260,11737,11738,11742,11744,11748,11752],{},[263,11739,11740,6551],{},[17,11741,6238],{},[263,11743,6554],{},[263,11745,11746,6559],{},[17,11747,6367],{},[263,11749,11750,6564],{},[17,11751,6367],{},[263,11753,6567],{},[10,11755,6570],{},[688,11757,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":11759},[11760,11761,11762,11763,11764],{"id":6213,"depth":297,"text":6214},{"id":6232,"depth":297,"text":6232},{"id":6360,"depth":297,"text":6361},{"id":6495,"depth":297,"text":6496},{"id":640,"depth":297,"text":640},{},{"title":6200,"description":6580},[3149],{"id":6590,"title":6591,"body":11769,"description":7003,"extension":712,"meta":12091,"navigation":588,"path":7005,"publishDate":7006,"published":588,"seo":12092,"stem":7008,"tags":12093,"thumbnail":7010,"updated":7011,"__hash__":7012},{"type":7,"value":11770,"toc":12083},[11771,11773,11777,11779,11783,11787,11789,11791,11795,11801,11803,11807,11811,11819,11821,11857,11861,11873,11875,11879,11893,11895,11927,11935,11949,11953,11955,11957,11997,12009,12017,12027,12033,12045,12047,12051,12077,12081],[10,11772,12],{},[10,11774,6598,11775,6601],{},[17,11776,6122],{},[54,11778,6605],{"id":6604},[10,11780,11781,6610],{},[17,11782,6122],{},[10,11784,6613,11785,6616],{},[17,11786,6122],{},[10,11788,6619],{},[54,11790,6622],{"id":6622},[10,11792,6625,11793,6628],{},[17,11794,6122],{},[260,11796,11797,11799],{},[263,11798,6633],{},[263,11800,6636],{},[54,11802,6633],{"id":6633},[10,11804,6641,11805,6644],{},[17,11806,6122],{},[10,11808,6647,11809,6650],{},[17,11810,5858],{},[22,11812,11813],{"className":1894,"code":6653,"language":1896,"meta":28,"style":28},[17,11814,11815],{"__ignoreMap":28},[151,11816,11817],{"class":153,"line":154},[151,11818,6653],{},[10,11820,6662],{},[22,11822,11823],{"className":1894,"code":6665,"language":1896,"meta":28,"style":28},[17,11824,11825,11829,11833,11837,11841,11845,11849,11853],{"__ignoreMap":28},[151,11826,11827],{"class":153,"line":154},[151,11828,5834],{},[151,11830,11831],{"class":153,"line":297},[151,11832,5839],{},[151,11834,11835],{"class":153,"line":306},[151,11836,6680],{},[151,11838,11839],{"class":153,"line":454},[151,11840,6685],{},[151,11842,11843],{"class":153,"line":523},[151,11844,2086],{},[151,11846,11847],{"class":153,"line":612},[151,11848,1955],{},[151,11850,11851],{"class":153,"line":617},[151,11852,589],{"emptyLinePlaceholder":588},[151,11854,11855],{"class":153,"line":626},[151,11856,6702],{},[10,11858,6705,11859,6709],{},[17,11860,6708],{},[10,11862,11863,6715,11865,6718,11867,6721,11869,6718,11871,6728],{},[17,11864,6714],{},[17,11866,6122],{},[17,11868,5858],{},[17,11870,6724],{},[17,11872,6727],{},[54,11874,6636],{"id":6636},[10,11876,6733,11877,6736],{},[17,11878,6122],{},[260,11880,11881,11887],{},[263,11882,6741,11883,6744,11885,6748],{},[17,11884,6122],{},[17,11886,6747],{},[263,11888,6751,11889,6718,11891,6756],{},[17,11890,6122],{},[17,11892,2360],{},[10,11894,6759],{},[22,11896,11897],{"className":1894,"code":6762,"language":1896,"meta":28,"style":28},[17,11898,11899,11903,11907,11911,11915,11919,11923],{"__ignoreMap":28},[151,11900,11901],{"class":153,"line":154},[151,11902,6769],{},[151,11904,11905],{"class":153,"line":297},[151,11906,589],{"emptyLinePlaceholder":588},[151,11908,11909],{"class":153,"line":306},[151,11910,6778],{},[151,11912,11913],{"class":153,"line":454},[151,11914,6783],{},[151,11916,11917],{"class":153,"line":523},[151,11918,1955],{},[151,11920,11921],{"class":153,"line":612},[151,11922,589],{"emptyLinePlaceholder":588},[151,11924,11925],{"class":153,"line":617},[151,11926,6796],{},[10,11928,6799,11929,6802,11931,6806,11933,6709],{},[17,11930,6724],{},[17,11932,6805],{},[17,11934,6708],{},[6810,11936,11937],{},[10,11938,11939,6299,11941,6818,11943,6821,11945,6825,11947,6828],{},[17,11940,2835],{},[17,11942,1904],{},[17,11944,6747],{},[17,11946,6824],{},[17,11948,6747],{},[10,11950,6831,11951,6834],{},[17,11952,6122],{},[54,11954,6837],{"id":6837},[10,11956,6840],{},[22,11958,11959],{"className":1894,"code":6843,"language":1896,"meta":28,"style":28},[17,11960,11961,11965,11969,11973,11977,11981,11985,11989,11993],{"__ignoreMap":28},[151,11962,11963],{"class":153,"line":154},[151,11964,5834],{},[151,11966,11967],{"class":153,"line":297},[151,11968,5839],{},[151,11970,11971],{"class":153,"line":306},[151,11972,6680],{},[151,11974,11975],{"class":153,"line":454},[151,11976,6685],{},[151,11978,11979],{"class":153,"line":523},[151,11980,2086],{},[151,11982,11983],{"class":153,"line":612},[151,11984,1955],{},[151,11986,11987],{"class":153,"line":617},[151,11988,589],{"emptyLinePlaceholder":588},[151,11990,11991],{"class":153,"line":626},[151,11992,6878],{},[151,11994,11995],{"class":153,"line":2010},[151,11996,6796],{},[10,11998,11999,6888,12001,6891,12003,6895,12005,87,12007,6900],{},[17,12000,6887],{},[17,12002,6714],{},[17,12004,6894],{},[17,12006,6122],{},[17,12008,5858],{},[10,12010,6799,12011,6802,12013,106,12015,6909],{},[17,12012,6122],{},[17,12014,6747],{},[17,12016,6805],{},[10,12018,6912,12019,6802,12021,6917,12023,6920,12025,6923],{},[17,12020,6122],{},[17,12022,2360],{},[17,12024,6724],{},[17,12026,2740],{},[10,12028,6926,12029,6930,12031,6933],{},[17,12030,6929],{},[17,12032,6122],{},[22,12034,12035],{"className":1894,"code":6936,"language":1896,"meta":28,"style":28},[17,12036,12037,12041],{"__ignoreMap":28},[151,12038,12039],{"class":153,"line":154},[151,12040,6943],{},[151,12042,12043],{"class":153,"line":297},[151,12044,6948],{},[54,12046,640],{"id":640},[10,12048,12049,6955],{},[17,12050,6122],{},[260,12052,12053,12061,12069,12071],{},[263,12054,12055,6962,12057,6718,12059,6748],{},[17,12056,6714],{},[17,12058,6122],{},[17,12060,5858],{},[263,12062,12063,6971,12065,6974,12067,6756],{},[17,12064,6894],{},[17,12066,6747],{},[17,12068,2360],{},[263,12070,6979],{},[263,12072,6982,12073,1809,12075,6987],{},[17,12074,6929],{},[17,12076,6122],{},[10,12078,12079,6992],{},[17,12080,6122],{},[688,12082,5262],{},{"title":28,"searchDepth":297,"depth":297,"links":12084},[12085,12086,12087,12088,12089,12090],{"id":6604,"depth":297,"text":6605},{"id":6622,"depth":297,"text":6622},{"id":6633,"depth":297,"text":6633},{"id":6636,"depth":297,"text":6636},{"id":6837,"depth":297,"text":6837},{"id":640,"depth":297,"text":640},{},{"title":6591,"description":7003},[3149],[12095,12111,12129,12146,12162,12179,12827],{"id":12096,"title":12097,"author":12098,"body":12099,"description":28,"extension":712,"meta":12103,"navigation":588,"path":12104,"publishDate":715,"published":588,"publisher":12105,"seo":12106,"stem":12107,"tags":12108,"__hash__":12110},"books\u002Fbooks\u002F2026\u002Fnetwork-and-tcp-ip-basics-third-edition.md","スラスラわかるネットワーク＆TCP\u002FIPのきほん","リブロワークス",{"type":7,"value":12100,"toc":12101},[],{"title":28,"searchDepth":297,"depth":297,"links":12102},[],{},"\u002Fbooks\u002F2026\u002Fnetwork-and-tcp-ip-basics-third-edition","SBクリエイティブ",{"title":12097,"description":28},"books\u002F2026\u002Fnetwork-and-tcp-ip-basics-third-edition",[12109],"ネットワーク","xbhb-FmdB9ZUXSWhb6ZiW-gZhC-vBAHVIBUepRuVli8",{"id":12112,"title":12113,"author":12114,"body":12115,"description":28,"extension":712,"meta":12119,"navigation":588,"path":12120,"publishDate":12121,"published":588,"publisher":12122,"seo":12123,"stem":12124,"tags":12125,"__hash__":12128},"books\u002Fbooks\u002F2026\u002Fcodex-cli-story-guide.md","ストーリーで覚えるCodex CLI入門","多佳宮崇志",{"type":7,"value":12116,"toc":12117},[],{"title":28,"searchDepth":297,"depth":297,"links":12118},[],{},"\u002Fbooks\u002F2026\u002Fcodex-cli-story-guide","2026-07-01",null,{"title":12113,"description":28},"books\u002F2026\u002Fcodex-cli-story-guide",[12126,12127],"AI","Codex","PEgEg4PTkrDoxH9hQrqXYiZBJ67uDkx0IWREiaDBKPs",{"id":12130,"title":12131,"author":12132,"body":12133,"description":28,"extension":712,"meta":12137,"navigation":588,"path":12138,"publishDate":12139,"published":588,"publisher":12140,"seo":12141,"stem":12142,"tags":12143,"__hash__":12145},"books\u002Fbooks\u002F2026\u002Fdatabase-design-guide.md","達人に学ぶDB設計徹底指南書","ミック",{"type":7,"value":12134,"toc":12135},[],{"title":28,"searchDepth":297,"depth":297,"links":12136},[],{},"\u002Fbooks\u002F2026\u002Fdatabase-design-guide","2026-05-01","翔泳社",{"title":12131,"description":28},"books\u002F2026\u002Fdatabase-design-guide",[12144],"DB設計","OZjkZ3_sun4Iebo7nv_yIq3e-mN3Q4enB_x548F2n6E",{"id":12147,"title":12148,"author":12149,"body":12150,"description":28,"extension":712,"meta":12154,"navigation":588,"path":12155,"publishDate":12156,"published":588,"publisher":12122,"seo":12157,"stem":12158,"tags":12159,"__hash__":12161},"books\u002Fbooks\u002F2025\u002Fdjango-rest-framework-textbook.md","現場で使える Django REST Framework の教科書［3.2 LTS 対応版］","横瀬明仁",{"type":7,"value":12151,"toc":12152},[],{"title":28,"searchDepth":297,"depth":297,"links":12153},[],{},"\u002Fbooks\u002F2025\u002Fdjango-rest-framework-textbook","2025-04-30",{"title":12148,"description":28},"books\u002F2025\u002Fdjango-rest-framework-textbook",[12160],"Django","PHo1FMxCs3EYdWF_zT1YpG5RxgBt1hTaxX5W8cHSb7Y",{"id":12163,"title":12164,"author":12165,"body":12166,"description":28,"extension":712,"meta":12170,"navigation":588,"path":12171,"publishDate":12172,"published":588,"publisher":12173,"seo":12174,"stem":12175,"tags":12176,"__hash__":12178},"books\u002Fbooks\u002F2025\u002Fweb-technology-for-professionals-revised-edition.md","［改訂新版］プロになるためのWeb技術入門","小森裕介",{"type":7,"value":12167,"toc":12168},[],{"title":28,"searchDepth":297,"depth":297,"links":12169},[],{},"\u002Fbooks\u002F2025\u002Fweb-technology-for-professionals-revised-edition","2025-03-31","技術評論社",{"title":12164,"description":28},"books\u002F2025\u002Fweb-technology-for-professionals-revised-edition",[12177],"Web","LNFLOzGXkq9b6hCTxytQFYlJnlvvorYY8OPjICfte9g",{"id":12180,"title":12181,"author":12098,"body":12182,"description":12818,"extension":712,"meta":12819,"navigation":588,"path":12820,"publishDate":12821,"published":588,"publisher":12822,"seo":12823,"stem":12824,"tags":12825,"__hash__":12826},"books\u002Fbooks\u002F2025\u002Forganize-learned-from-docker.md","Docker&仮想サーバー完全入門",{"type":7,"value":12183,"toc":12805},[12184,12192,12195,12199,12202,12205,12211,12215,12218,12264,12279,12282,12303,12306,12310,12316,12340,12350,12357,12362,12368,12381,12387,12395,12401,12448,12454,12479,12483,12490,12525,12531,12534,12537,12590,12593,12600,12614,12617,12634,12644,12668,12671,12678,12692,12703,12723,12735,12739,12742,12749,12755,12758,12761,12763,12766,12769,12799,12802],[10,12185,12186,12187,12191],{},"『",[3163,12188,12181],{"href":12189,"rel":12190},"https:\u002F\u002Fbook.impress.co.jp\u002Fbooks\u002F1121101138",[3167],"』を読了したため、本書を通して学んだことをまとめます。",[10,12193,12194],{},"まだ1周目で理解が浅い部分もあるため、Dockerを実際に使いながら必要に応じて追記していきます。",[54,12196,12198],{"id":12197},"dockerでホスト環境への影響を抑える","Dockerでホスト環境への影響を抑える",[10,12200,12201],{},"Dockerを利用すると、アプリケーションに必要なランタイムやライブラリをコンテナ内にまとめられます。",[10,12203,12204],{},"ホストOSへ依存関係を直接インストールする場面を減らせるため、開発環境を整理しやすくなります。また、DockerfileやComposeファイルを共有することで、チーム内で環境を再現しやすくなります。",[38,12206,12208],{"title":12207,"type":2203},"ホストOSから完全に独立するわけではない",[10,12209,12210],{},"コンテナはホストのカーネルやDocker Engineを利用します。ボリューム、ポート、CPUアーキテクチャなど、ホスト環境との接点がなくなるわけではありません。",[54,12212,12214],{"id":12213},"dockerコマンドで操作対象を明示する","Dockerコマンドで操作対象を明示する",[10,12216,12217],{},"Docker CLIには、操作対象を含めて記述するコマンドがあります。",[22,12219,12221],{"className":145,"code":12220,"language":147,"meta":28,"style":28},"docker container run nginx\ndocker image pull nginx\ndocker volume ls\ndocker network ls\n",[17,12222,12223,12236,12246,12255],{"__ignoreMap":28},[151,12224,12225,12227,12230,12233],{"class":153,"line":154},[151,12226,1485],{"class":157},[151,12228,12229],{"class":161}," container",[151,12231,12232],{"class":161}," run",[151,12234,12235],{"class":161}," nginx\n",[151,12237,12238,12240,12242,12244],{"class":153,"line":297},[151,12239,1485],{"class":157},[151,12241,1631],{"class":161},[151,12243,343],{"class":161},[151,12245,12235],{"class":161},[151,12247,12248,12250,12252],{"class":153,"line":306},[151,12249,1485],{"class":157},[151,12251,1733],{"class":161},[151,12253,12254],{"class":161}," ls\n",[151,12256,12257,12259,12262],{"class":153,"line":454},[151,12258,1485],{"class":157},[151,12260,12261],{"class":161}," network",[151,12263,12254],{"class":161},[10,12265,12266,91,12269,91,12272,91,12275,12278],{},[17,12267,12268],{},"container",[17,12270,12271],{},"image",[17,12273,12274],{},"volume",[17,12276,12277],{},"network","のように対象が明示されるため、何を操作するコマンドなのか把握しやすくなります。",[10,12280,12281],{},"一方で、次の短い形式も現在利用できます。",[22,12283,12285],{"className":145,"code":12284,"language":147,"meta":28,"style":28},"docker run nginx\ndocker pull nginx\n",[17,12286,12287,12295],{"__ignoreMap":28},[151,12288,12289,12291,12293],{"class":153,"line":154},[151,12290,1485],{"class":157},[151,12292,12232],{"class":161},[151,12294,12235],{"class":161},[151,12296,12297,12299,12301],{"class":153,"line":297},[151,12298,1485],{"class":157},[151,12300,343],{"class":161},[151,12302,12235],{"class":161},[10,12304,12305],{},"短い形式を古いという理由だけで避ける必要はありません。学習時には対象を含む形式も知っておくと、CLIの構造を理解しやすいと感じました。",[54,12307,12309],{"id":12308},"docker-compose-v2を利用する","Docker Compose V2を利用する",[10,12311,12312,12313,2645],{},"現在のCompose CLIでは、ハイフンのない",[17,12314,12315],{},"docker compose",[22,12317,12319],{"className":145,"code":12318,"language":147,"meta":28,"style":28},"docker compose up\ndocker compose down\n",[17,12320,12321,12331],{"__ignoreMap":28},[151,12322,12323,12325,12328],{"class":153,"line":154},[151,12324,1485],{"class":157},[151,12326,12327],{"class":161}," compose",[151,12329,12330],{"class":161}," up\n",[151,12332,12333,12335,12337],{"class":153,"line":297},[151,12334,1485],{"class":157},[151,12336,12327],{"class":161},[151,12338,12339],{"class":161}," down\n",[10,12341,12342,12343,12346,12347,12349],{},"旧Compose V1で使われていた",[17,12344,12345],{},"docker-compose","とはコマンド形式が異なります。Docker DesktopにはCompose CLIが含まれているため、基本的には",[17,12348,12315],{},"を利用します。",[54,12351,12353,12354,3098],{"id":12352},"composeファイルはcomposeyamlを使う","Composeファイルは",[17,12355,12356],{},"compose.yaml",[10,12358,12359,12360,2171],{},"Composeファイルの推奨ファイル名は",[17,12361,12356],{},[22,12363,12366],{"className":12364,"code":12365,"language":27,"meta":28},[25],"compose.yaml\n",[17,12367,12365],{"__ignoreMap":28},[10,12369,12370,12373,12374,2167,12377,12380],{},[17,12371,12372],{},"compose.yml","も利用できます。また、",[17,12375,12376],{},"docker-compose.yaml",[17,12378,12379],{},"docker-compose.yml","も後方互換性のためサポートされています。",[10,12382,12383,12384,12386],{},"複数の候補が同じ場所にある場合は",[17,12385,12356],{},"が優先されるため、新しく作る場合はこの名前へ揃えると分かりやすくなります。",[54,12388,12390,12391,12394],{"id":12389},"トップレベルのversionは不要","トップレベルの",[17,12392,12393],{},"version","は不要",[10,12396,12397,12398,12400],{},"以前のComposeファイルでは、先頭に次のような",[17,12399,12393],{},"を書く例がありました。",[22,12402,12406],{"className":12403,"code":12404,"language":12405,"meta":28,"style":28},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","version: '3'\n\nservices:\n  web:\n    image: nginx\n","yaml",[17,12407,12408,12420,12424,12432,12439],{"__ignoreMap":28},[151,12409,12410,12412,12414,12416,12418],{"class":153,"line":154},[151,12411,12393],{"class":1918},[151,12413,1922],{"class":198},[151,12415,1925],{"class":198},[151,12417,2583],{"class":161},[151,12419,3040],{"class":198},[151,12421,12422],{"class":153,"line":297},[151,12423,589],{"emptyLinePlaceholder":588},[151,12425,12426,12429],{"class":153,"line":306},[151,12427,12428],{"class":1918},"services",[151,12430,12431],{"class":198},":\n",[151,12433,12434,12437],{"class":153,"line":454},[151,12435,12436],{"class":1918},"  web",[151,12438,12431],{"class":198},[151,12440,12441,12444,12446],{"class":153,"line":523},[151,12442,12443],{"class":1918},"    image",[151,12445,1922],{"class":198},[151,12447,12235],{"class":161},[10,12449,12450,12451,12453],{},"現在、トップレベルの",[17,12452,12393],{},"は後方互換性のために残されたobsoleteな項目です。指定してもComposeは最新のスキーマでファイルを検証するため、新しいComposeファイルでは省略します。",[22,12455,12457],{"className":12403,"code":12456,"language":12405,"meta":28,"style":28},"services:\n  web:\n    image: nginx\n",[17,12458,12459,12465,12471],{"__ignoreMap":28},[151,12460,12461,12463],{"class":153,"line":154},[151,12462,12428],{"class":1918},[151,12464,12431],{"class":198},[151,12466,12467,12469],{"class":153,"line":297},[151,12468,12436],{"class":1918},[151,12470,12431],{"class":198},[151,12472,12473,12475,12477],{"class":153,"line":306},[151,12474,12443],{"class":1918},[151,12476,1922],{"class":198},[151,12478,12235],{"class":161},[54,12480,12482],{"id":12481},"restart-policyは用途に合わせて設定する","restart policyは用途に合わせて設定する",[10,12484,12485,12486,12489],{},"Composeのサービスには、コンテナを再起動する条件を",[17,12487,12488],{},"restart","で設定できます。",[22,12491,12493],{"className":12403,"code":12492,"language":12405,"meta":28,"style":28},"services:\n  web:\n    image: nginx\n    restart: always\n",[17,12494,12495,12501,12507,12515],{"__ignoreMap":28},[151,12496,12497,12499],{"class":153,"line":154},[151,12498,12428],{"class":1918},[151,12500,12431],{"class":198},[151,12502,12503,12505],{"class":153,"line":297},[151,12504,12436],{"class":1918},[151,12506,12431],{"class":198},[151,12508,12509,12511,12513],{"class":153,"line":306},[151,12510,12443],{"class":1918},[151,12512,1922],{"class":198},[151,12514,12235],{"class":161},[151,12516,12517,12520,12522],{"class":153,"line":454},[151,12518,12519],{"class":1918},"    restart",[151,12521,1922],{"class":198},[151,12523,12524],{"class":161}," always\n",[10,12526,12527,12530],{},[17,12528,12529],{},"always","を指定したコンテナは、停止した場合やDockerデーモンが再起動した場合に再起動されます。",[10,12532,12533],{},"常時稼働が必要なサービスでは便利ですが、学習用コンテナへ一律に指定すると、Docker起動時に意図しないコンテナまで立ち上がることがあります。必要性を考えて設定することが大切です。",[10,12535,12536],{},"主なrestart policyには次があります。",[1505,12538,12539,12549],{},[1508,12540,12541],{},[1511,12542,12543,12546],{},[1514,12544,12545],{},"値",[1514,12547,12548],{},"動作",[1522,12550,12551,12561,12571,12580],{},[1511,12552,12553,12558],{},[1527,12554,12555],{},[17,12556,12557],{},"no",[1527,12559,12560],{},"自動的に再起動しない",[1511,12562,12563,12568],{},[1527,12564,12565],{},[17,12566,12567],{},"on-failure",[1527,12569,12570],{},"エラー終了した場合に再起動する",[1511,12572,12573,12577],{},[1527,12574,12575],{},[17,12576,12529],{},[1527,12578,12579],{},"停止した場合に常に再起動する",[1511,12581,12582,12587],{},[1527,12583,12584],{},[17,12585,12586],{},"unless-stopped",[1527,12588,12589],{},"明示的に停止されていない限り再起動する",[54,12591,12592],{"id":12592},"コンテナのログを確認する",[10,12594,12595,12596,12599],{},"Composeで起動したサービスのログは",[17,12597,12598],{},"docker compose logs","で確認できます。",[22,12601,12603],{"className":145,"code":12602,"language":147,"meta":28,"style":28},"docker compose logs\n",[17,12604,12605],{"__ignoreMap":28},[151,12606,12607,12609,12611],{"class":153,"line":154},[151,12608,1485],{"class":157},[151,12610,12327],{"class":161},[151,12612,12613],{"class":161}," logs\n",[10,12615,12616],{},"サービスを指定すると、対象のログだけを表示できます。",[22,12618,12620],{"className":145,"code":12619,"language":147,"meta":28,"style":28},"docker compose logs web\n",[17,12621,12622],{"__ignoreMap":28},[151,12623,12624,12626,12628,12631],{"class":153,"line":154},[151,12625,1485],{"class":157},[151,12627,12327],{"class":161},[151,12629,12630],{"class":161}," logs",[151,12632,12633],{"class":161}," web\n",[10,12635,12636,12637,12640,12641,2645],{},"ログを継続して追いかける場合は",[17,12638,12639],{},"--follow","、末尾の行数を限定する場合は",[17,12642,12643],{},"--tail",[22,12645,12647],{"className":145,"code":12646,"language":147,"meta":28,"style":28},"docker compose logs --follow --tail 100 web\n",[17,12648,12649],{"__ignoreMap":28},[151,12650,12651,12653,12655,12657,12660,12663,12666],{"class":153,"line":154},[151,12652,1485],{"class":157},[151,12654,12327],{"class":161},[151,12656,12630],{"class":161},[151,12658,12659],{"class":161}," --follow",[151,12661,12662],{"class":161}," --tail",[151,12664,12665],{"class":1331}," 100",[151,12667,12633],{"class":161},[54,12669,12670],{"id":12670},"イメージを再ビルドする",[10,12672,12673,12674,12677],{},"Composeでイメージをビルドするには",[17,12675,12676],{},"docker compose build","を使います。",[22,12679,12681],{"className":145,"code":12680,"language":147,"meta":28,"style":28},"docker compose build\n",[17,12682,12683],{"__ignoreMap":28},[151,12684,12685,12687,12689],{"class":153,"line":154},[151,12686,1485],{"class":157},[151,12688,12327],{"class":161},[151,12690,12691],{"class":161}," build\n",[10,12693,12694,12695,12698,12699,12702],{},"コンテナの起動前にビルドも実行したい場合は、",[17,12696,12697],{},"docker compose up","へ",[17,12700,12701],{},"--build","を付けられます。",[22,12704,12706],{"className":145,"code":12705,"language":147,"meta":28,"style":28},"docker compose up --detach --build\n",[17,12707,12708],{"__ignoreMap":28},[151,12709,12710,12712,12714,12717,12720],{"class":153,"line":154},[151,12711,1485],{"class":157},[151,12713,12327],{"class":161},[151,12715,12716],{"class":161}," up",[151,12718,12719],{"class":161}," --detach",[151,12721,12722],{"class":161}," --build\n",[10,12724,12725,12727,12728,2357,12731,12734],{},[17,12726,12697],{},"は、サービスの設定やイメージが変更されている場合にコンテナを再作成します。ただし、Dockerfileやビルド対象を確実に再ビルドしてから起動したい場合は、",[17,12729,12730],{},"build",[17,12732,12733],{},"up --build","を明示すると意図が分かりやすくなります。",[54,12736,12738],{"id":12737},"dev-containerで開発環境をコンテナ化する","Dev Containerで開発環境をコンテナ化する",[10,12740,12741],{},"VS CodeのDev Containers拡張機能を使うと、コンテナを開発環境として利用できます。",[10,12743,12744,12745,12748],{},"プロジェクト内の",[17,12746,12747],{},".devcontainer\u002Fdevcontainer.json","へ設定を記述し、コンテナ内のランタイム、ツール、VS Code拡張機能などを揃えられます。",[22,12750,12753],{"className":12751,"code":12752,"language":27,"meta":28},[25],".devcontainer\u002F\n  devcontainer.json\n",[17,12754,12752],{"__ignoreMap":28},[10,12756,12757],{},"ソースコードをコンテナへマウントし、ターミナル、補完、コードナビゲーション、デバッグなどを普段のVS Codeと近い操作感で利用できます。",[10,12759,12760],{},"環境構築手順を文章だけで共有するよりも、実行環境そのものを設定として共有できる点が便利だと感じました。",[54,12762,640],{"id":640},[10,12764,12765],{},"本書を通して、Dockerの基本操作だけでなく、Composeによる複数コンテナの管理や、開発環境をコンテナ化する考え方を学べました。",[10,12767,12768],{},"特に、次の点を今後の開発でも意識したいです。",[260,12770,12771,12774,12779,12784,12790,12793,12796],{},[263,12772,12773],{},"Docker CLIで何を操作しているか理解する",[263,12775,12776,12777,3098],{},"Compose V2の",[17,12778,12315],{},[263,12780,12353,12781,12783],{},[17,12782,12356],{},"へ揃える",[263,12785,12786,12787,12789],{},"不要な",[17,12788,12393],{},"を記述しない",[263,12791,12792],{},"restart policyを用途に合わせて設定する",[263,12794,12795],{},"ログ確認と再ビルドのコマンドを使い分ける",[263,12797,12798],{},"Dev Containerで再現可能な開発環境を試す",[10,12800,12801],{},"Dockerはコマンドを覚えるだけでなく、イメージ、コンテナ、ボリューム、ネットワークの関係を実際に操作しながら理解していきたいです。",[688,12803,12804],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":28,"searchDepth":297,"depth":297,"links":12806},[12807,12808,12809,12810,12812,12813,12814,12815,12816,12817],{"id":12197,"depth":297,"text":12198},{"id":12213,"depth":297,"text":12214},{"id":12308,"depth":297,"text":12309},{"id":12352,"depth":297,"text":12811},"Composeファイルはcompose.yamlを使う",{"id":12389,"depth":297,"text":12389},{"id":12481,"depth":297,"text":12482},{"id":12592,"depth":297,"text":12592},{"id":12670,"depth":297,"text":12670},{"id":12737,"depth":297,"text":12738},{"id":640,"depth":297,"text":640},"『Docker&仮想サーバー完全入門』を読了したため、本書を通して学んだことをまとめます。",{},"\u002Fbooks\u002F2025\u002Forganize-learned-from-docker","2025-02-22","インプレス",{"title":12181,"description":12818},"books\u002F2025\u002Forganize-learned-from-docker",[1873],"4hv6HyIEs4h6TVsIp3e5GZVdKj-xdL2YemAEAK3SW10",{"id":12828,"title":12829,"author":12830,"body":12831,"description":28,"extension":712,"meta":12835,"navigation":588,"path":12836,"publishDate":12837,"published":588,"publisher":12838,"seo":12839,"stem":12840,"tags":12841,"__hash__":12842},"books\u002Fbooks\u002F2024\u002Fhow-networks-connect-second-edition.md","ネットワークはなぜつながるのか　第２版","戸根勤",{"type":7,"value":12832,"toc":12833},[],{"title":28,"searchDepth":297,"depth":297,"links":12834},[],{},"\u002Fbooks\u002F2024\u002Fhow-networks-connect-second-edition","2024-05-31","日経BP",{"title":12829,"description":28},"books\u002F2024\u002Fhow-networks-connect-second-edition",[12109],"SIuIZbtr-w2AzFZh6gTb7u043lu97IMLINksxROAke0",1787992911112]