Help
RSS
API
Feed
Maltego
Contact
Domain > dnskimox.hateblo.jp
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-11-03
99.86.114.123
(
ClassC
)
2026-01-31
3.175.34.33
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Sat, 31 Jan 2026 12:23:48 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://dnskimox.hateblo.jp/X-Cache: Redirect from cloudfrontVia: 1.1 376563e3c1f1885f8c4a0f76c81f4b16.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P3X-Amz-Cf-Id: quuQwXnCG2O2--kLrjvcCieoL4gxus1Wy8GuAUyQ52M31vtszcND2Q html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveServer: nginxDate: Sat, 31 Jan 2026 12:23:49 GMTCache-Control: privateX-Proxy-Revision: 290ad662750024ea17472b9c1b7e66a0f3e85678Vary: Accept-EncodingVary: X-Epic-Device-Type,X-Epic-Flag-Variants,Accept-EncodingAccess-Control-Allow-Origin: *Content-Security-Policy: frame-ancestors none; upgrade-insecure-requestsContent-Security-Policy-Report-Only: block-all-mixed-content; report-uri https://blog.hatena.ne.jp/api/csp_reportP3P: CPOTI CUR OUR BUS STAX-Cache-Only-Varnish: 1X-Content-Type-Options: nosniffX-Dispatch: Hatena::Epic::Web::Blogs::Index#indexX-Frame-Options: DENYX-Revision: 290ad662750024ea17472b9c1b7e66X-XSS-Protection: 1X-Runtime: 0.097893X-Varnish: 8896803 19071998Via: 1.1 ip-10-1-13-30.ap-northeast-1.compute.internal (Varnish/7.6), 1.1 e3de3342d71bbdf1f2c9c88468a73486.cloudfront.net (CloudFront)Strict-Transport-Security: max-age2592000;X-Cache: Miss from cloudfrontX-Amz-Cf-Pop: HIO52-P3X-Amz-Cf-Id: yofMEM2quq2otXzGz6CD2jb1u_ohfjctIejrndC-lBbn9dxQgIiAtwAge: 1849 !DOCTYPE html>html langjadata-admin-domain//blog.hatena.ne.jpdata-admin-originhttps://blog.hatena.ne.jpdata-authordnskimoxdata-avail-langsja endata-blogdnskimox.hateblo.jpdata-blog-hostdnskimox.hateblo.jpdata-blog-is-public1data-blog-name男爵が書くdata-blog-ownerdnskimoxdata-blog-show-ads1data-blog-show-sleeping-ads1data-blog-urihttps://dnskimox.hateblo.jp/data-blog-uuid10257846132673856732data-blogs-uri-basehttps://dnskimox.hateblo.jpdata-brandhatenablogdata-data-layer{"hatenablog":{"admin":{},"analytics":{"brand_property_id":"","measurement_id":"","non_sampling_property_id":"","property_id":"","separated_property_id":"UA-29716941-23"},"blog":{"blog_id":"10257846132673856732","content_seems_japanese":"true","disable_ads":"","enable_ads":"true","enable_keyword_link":"true","entry_show_footer_related_entries":"true","force_pc_view":"false","is_public":"true","is_responsive_view":"false","is_sleeping":"true","lang":"ja","name":"\u7537\u7235\u304c\u66f8\u304f","owner_name":"dnskimox","uri":"https://dnskimox.hateblo.jp/"},"brand":"hatenablog","page_id":"index","permalink_entry":null,"pro":"free","router_type":"blogs"}}data-devicepcdata-dont-recommend-profalsedata-global-domainhttps://hatena.blogdata-globalheader-colorbdata-globalheader-typepcdata-has-touch-view1data-help-urlhttps://help.hatenablog.comdata-pageindexdata-parts-domainhttps://hatenablog-parts.comdata-plus-availabledata-profalsedata-router-typeblogsdata-sentry-dsnhttps://03a33e4781a24cf2885099fed222b56d@sentry.io/1195218data-sentry-environmentproductiondata-sentry-sample-rate0.1data-static-domainhttps://cdn.blog.st-hatena.comdata-version290ad662750024ea17472b9c1b7e66 data-initial-state{} > head prefixog: http://ogp.me/ns# fb: http://ogp.me/ns/fb#> meta nameviewport contentwidthdevice-width, initial-scale1.0 /> meta namerobots contentmax-image-preview:large /> meta charsetutf-8/> meta http-equivX-UA-Compatible contentIE7; IE9; IE10; IE11 /> title>男爵が書く/title> link relcanonical hrefhttps://dnskimox.hateblo.jp//> meta itempropname content男爵が書く/> meta itempropimage contenthttps://cdn.blog.st-hatena.com/images/theme/og-image-1500.png/> meta propertyog:title content男爵が書く/>meta propertyog:type contentblog/> meta propertyog:url contenthttps://dnskimox.hateblo.jp//> meta propertyog:image contenthttps://cdn.blog.st-hatena.com/images/theme/og-image-1500.png/>meta propertyog:image:alt content男爵が書く/> meta propertyog:description contentDDD、オブジェクト指向、技術書の感想など />meta propertyog:site_name content男爵が書く/> meta nametwitter:card contentsummary_large_image /> meta nametwitter:image contenthttps://cdn.blog.st-hatena.com/images/theme/og-image-1500.png /> meta nametwitter:title content男爵が書く /> meta nametwitter:description contentDDD、オブジェクト指向、技術書の感想など /> meta nametwitter:app:name:iphone contentはてなブログアプリ /> meta nametwitter:app:id:iphone content583299321 /> meta nametwitter:app:url:iphone contenthatenablog:///open?urihttps%3A%2F%2Fdnskimox.hateblo.jp%2F /> meta nametwitter:site content@dnskimox /> script idembed-gtm-data-layer-loader data-data-layer-page-specific>(function() { function loadDataLayer(elem, attrName) { if (!elem) { return {}; } var json elem.getAttribute(attrName); if (!json) { return {}; } return JSON.parse(json); } var globalVariables loadDataLayer( document.documentElement, data-data-layer ); var pageSpecificVariables loadDataLayer( document.getElementById(embed-gtm-data-layer-loader), data-data-layer-page-specific ); var variables globalVariables, pageSpecificVariables; if (!window.dataLayer) { window.dataLayer ; } for (var i 0; i variables.length; i++) { window.dataLayer.push(variablesi); }})();/script>!-- Google Tag Manager -->script>(function(w,d,s,l,i){wlwl||;wl.push({gtm.start:new Date().getTime(),event:gtm.js});var fd.getElementsByTagName(s)0,jd.createElement(s),dll!dataLayer?&l+l:;j.asynctrue;j.srchttps://www.googletagmanager.com/gtm.js?id+i+dl;f.parentNode.insertBefore(j,f);})(window,document,script,dataLayer,GTM-P4CXTW);/script>!-- End Google Tag Manager --> link relshortcut icon hrefhttps://dnskimox.hateblo.jp/icon/favicon>link relapple-touch-icon hrefhttps://dnskimox.hateblo.jp/icon/touch>link relicon sizes192x192 hrefhttps://dnskimox.hateblo.jp/icon/link> link relalternate typeapplication/atom+xml titleAtom hrefhttps://dnskimox.hateblo.jp/feed/>link relalternate typeapplication/rss+xml titleRSS2.0 hrefhttps://dnskimox.hateblo.jp/rss/> link relauthor hrefhttp://www.hatena.ne.jp/dnskimox/> link relstylesheet typetext/css hrefhttps://cdn.blog.st-hatena.com/css/blog.css?version290ad662750024ea17472b9c1b7e66/> link relstylesheet typetext/css hrefhttps://usercss.blog.st-hatena.com/blog_style/10257846132673856732/64a2c6e71e2646636ee8f90eb37e830c4d0eb1d2/> script> /script> style> div#google_afc_user, div.google-afc-user-container, div.google_afc_image, div.google_afc_blocklink { display: block !important; }/style> script srchttps://cdn.pool.st-hatena.com/valve/valve.js async>/script>script idtest-valve-definition> var valve window.valve || ; valve.push(function(v) { v.config({ service: blog, content: { result: adtrust, documentIds: blog:entry:13574176438023006105,blog:entry:26006613724118351,blog:entry:26006613664573673,blog:entry:26006613644694574,blog:entry:26006613517039504,blog:entry:17680117127218002863,blog:entry:26006613471485675 } }); v.defineDFPSlot({sizes:300,250,336,280,slotId:google_afc_user_container_0,unit:/4374287/blo_pc_com_6_3328_0_no}); v.defineDFPSlot({lazy:1,sizes:{mappings:320,568,336,280,300,250,fluid,0,0,300,250},slotId:sleeping-ad-in-entry,unit:/4374287/blog_pc_entry_sleep_in-article}); v.defineDFPSlot({lazy:,sizes:300,250,336,280,468,60,fluid,slotId:google_afc_user_container_1,unit:/4374287/blog_user}); v.defineDFPSlot({lazy:,sizes:300,250,336,280,468,60,fluid,slotId:google_afc_user_container_2,unit:/4374287/blog_user_2nd}); v.defineDFPSlot({lazy:,sizes:300,250,336,280,468,60,fluid,slotId:google_afc_user_container_3,unit:/4374287/blog_user_2nd}); v.defineDFPSlot({lazy:1,sizes:300,250,336,280,468,60,fluid,slotId:google_afc_user_container_4,unit:/4374287/blog_user_2nd}); v.defineDFPSlot({lazy:1,sizes:300,250,336,280,468,60,fluid,slotId:google_afc_user_container_5,unit:/4374287/blog_user_2nd}); v.defineDFPSlot({lazy:1,sizes:300,250,336,280,468,60,fluid,slotId:google_afc_user_container_6,unit:/4374287/blog_user_2nd}); v.defineDFPSlot({lazy:1,sizes:300,250,336,280,468,60,fluid,slotId:google_afc_user_container_7,unit:/4374287/blog_user_2nd}); v.sealDFPSlots(); });/script> script typeapplication/ld+json>{@context:https://schema.org,@type:WebSite,name:男爵が書く,url:https://dnskimox.hateblo.jp/}/script> /head> body classpage-index globalheader-ng-enabled> div idglobalheader-container data-brandhatenablog > iframe idglobalheader height37 frameborder0 allowTransparencytrue>/iframe>/div> nav class blog-controlls > div classblog-controlls-blog-icon> a hrefhttps://dnskimox.hateblo.jp/> img srchttps://cdn.image.st-hatena.com/image/square/76ca21b81e9b25bc6d3af46f297d779690bbe8d4/backendimagemagick;height128;version1;width128/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fblog_custom_icon%2F133567865%2F1542813754773300 alt男爵が書く/> /a> /div> div classblog-controlls-title> a hrefhttps://dnskimox.hateblo.jp/>男爵が書く/a> /div> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_campaignsubscribe_blog&utm_mediumbutton&utm_sourceblogs_topright_button classblog-controlls-subscribe-btn test-blog-header-controlls-subscribe> 読者になる /a> /nav> div idcontainer> div idcontainer-inner> header idblog-title data-brandhatenablog> div idblog-title-inner > div idblog-title-content> h1 idtitle>a hrefhttps://dnskimox.hateblo.jp/>男爵が書く/a>/h1> h2 idblog-description>DDD、オブジェクト指向、技術書の感想など/h2> /div> /div>/header> div idcontent classhfeed > div idcontent-inner> div idwrapper> div idmain> div idmain-inner> article classentry no-entry sleeping-ads styledisplay: block !important;> div classentry-inner> div classentry-content> div classvariable-mobileWeb-ad> div idgoogle_afc_user_container_0 classsleeping-ad styledisplay: block !important;>/div> /div> p classsleeping-ads-notice styledisplay: none;>この広告は、90日以上更新していないブログに表示しています。/p> /div> /div> /article> !-- google_ad_section_start --> !-- rakuten_ad_target_begin --> article classentry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-800 words-100 mode-markdown entry-odd identry-13574176438023006105 data-keyword-campaign data-uuid13574176438023006105 data-publication-typeentry> div classentry-inner> header classentry-header> div classdate entry-date first> a hrefhttps://dnskimox.hateblo.jp/archive/2022/01/30 relnofollow> time datetime2022-01-30T07:32:59Z title2022-01-30T07:32:59Z> span classdate-year>2022/span>span classhyphen>-/span>span classdate-month>01/span>span classhyphen>-/span>span classdate-day>30/span> /time> /a> /div> h1 classentry-title> a hrefhttps://dnskimox.hateblo.jp/entry/2022/01/30/163259 classentry-title-link bookmark>XP祭り2021でカンバンとJIRAの話をしました/a>/h1> div classentry-categories categories> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-category-link category-カンファレンス>カンファレンス/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB classentry-category-link category-アジャイル>アジャイル/a> /div> /header> div classentry-content hatenablog-entry> p>かれこれ4ヶ月ほど前のことになりますが、a classkeyword hrefhttp://d.hatena.ne.jp/keyword/XP%BA%D7%A4%EA>XP祭り/a>2021にオンラインで参加していました。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A2%A5%B8%A5%E3%A5%A4%A5%EB>アジャイル/a>開発の本を読んだり現場での実践は数年前からやっていたのですが、このジャンルのカンファレンスに参加するのは初めてでした。/p>p>iframe srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fconfengine.com%2Fconferences%2Fxp2021 titleXP祭り2021 classembed-card embed-webcard scrollingno frameborder0 styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;>/iframe>cite classhatena-citation>a hrefhttps://confengine.com/conferences/xp2021>confengine.com/a>/cite>/p>p>自分が最初にa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A2%A5%B8%A5%E3%A5%A4%A5%EB>アジャイル/a>に触れたのは、同僚の勧めで『a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A2%A5%B8%A5%E3%A5%A4%A5%EB>アジャイル/a>サムライ』を読んだのがきっかけだったと記憶しています。それまでの現場ではなんとなーく見積もりをして計画を立て、要求が膨らんだり作業が思うように進まなくて炎上するということを繰り返していました。そんな中、「スコープ・予算・時間・品質のa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5>トレードオフ/a>・スライダー」や「ベロシティを計測して根拠のある計画を立てる」といった考え方に感銘を受けたのを覚えています。/p>p>その後はトム・デマルコの『デッドライン』や『ピープルウェア』、『熊とワルツを』、スa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A1%BC>ティー/a>ブ・マコネルの『ソフトウェア見積もり』など、どちらかというと古典的なプロジェクトマネジメントの本を好んで読んでいました。この頃になると、プロジェクトマネジメントにも見積もりにもstrong>ソフトウェア開発の歴史の中で蓄積されてきた技術/strong>が確かに存在していることがわかってきました。と同時に、なぜ世の開発現場はそのような技術や知見を無視した運営がなされているのかという、ある種怒りにも近い感情が湧き上がってきました。せめて自分の周りの状況だけでも変えるためには、自ら学び、チームを巻き込んで実践していく他ありません。/p> a classentry-see-more hrefhttps://dnskimox.hateblo.jp/entry/2022/01/30/163259>続きを読む/a> /div> footer classentry-footer> div classentry-tags-wrapper> div classentry-tags> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>カンファレンス/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>アジャイル/span> /a> /span> /div>/div> p classentry-footer-section track-inview-by-gtm data-gtm-track-json{"area": "finish_reading"}> span classauthor vcard>span classfn data-load-nickname1 data-user-namednskimox >dnskimox/span>/span> span classentry-footer-time>a hrefhttps://dnskimox.hateblo.jp/entry/2022/01/30/163259>time data-relative datetime2022-01-30T07:32:59Z title2022-01-30T07:32:59Z classupdated>2022-01-30 16:32/time>/a>/span> span class entry-footer-subscribe data-test-blog-controlls-subscribe> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_sourceblogs_entry_footer&utm_mediumbutton&utm_campaignsubscribe_blog> 読者になる /a> /span> /p> div classhatena-star-container data-hatena-star-container data-hatena-star-urlhttps://dnskimox.hateblo.jp/entry/2022/01/30/163259 data-hatena-star-titleXP祭り2021でカンバンとJIRAの話をしました data-hatena-star-variantprofile-icon data-hatena-star-profile-url-templatehttps://blog.hatena.ne.jp/{username}/ >/div> div classsocial-buttons> div classsocial-button-item> a hrefhttps://b.hatena.ne.jp/entry/s/dnskimox.hateblo.jp/entry/2022/01/30/163259 classhatena-bookmark-button data-hatena-bookmark-urlhttps://dnskimox.hateblo.jp/entry/2022/01/30/163259 data-hatena-bookmark-layoutvertical-balloon data-hatena-bookmark-langja titleこの記事をはてなブックマークに追加>img srchttps://b.st-hatena.com/images/entry-button/button-only.gif altこの記事をはてなブックマークに追加 width20 height20 styleborder: none; />/a> /div> div classsocial-button-item> div classfb-share-button data-layoutbox_count data-hrefhttps://dnskimox.hateblo.jp/entry/2022/01/30/163259>/div> /div> div classsocial-button-item> a classentry-share-button entry-share-button-twitter test-share-button-twitter hrefhttps://x.com/intent/tweet?hashtags%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9&hashtags%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB&textXP%E7%A5%AD%E3%82%8A2021%E3%81%A7%E3%82%AB%E3%83%B3%E3%83%90%E3%83%B3%E3%81%A8JIRA%E3%81%AE%E8%A9%B1%E3%82%92%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F+-+%E7%94%B7%E7%88%B5%E3%81%8C%E6%9B%B8%E3%81%8F&urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2Fentry%2F2022%2F01%2F30%2F163259 titleX(Twitter)で投稿する >/a> /div> /div> div classgoogle-afc-image test-google-rectangle-ads> div idgoogle_afc_user_container_1 classgoogle-afc-user-container google_afc_blocklink2_5 google_afc_boder data-test-unit/4374287/blog_user>/div> a hrefhttp://blog.hatena.ne.jp/guide/pro classopen-pro-modal data-guide-pro-modal-ad-urlhttps://hatena.blog/guide/pro/modal/ad>広告を非表示にする/a> /div> div classcustomized-footer> /div> div classcomment-box js-comment-box> ul classcomment js-comment> li classread-more-comments styledisplay: none;>a>もっと読む/a>/li> /ul> a classleave-comment-title js-leave-comment-title>コメントを書く/a> /div> /footer> /div>/article> article classentry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-800 words-100 mode-html entry-even identry-26006613724118351 data-keyword-campaign data-uuid26006613724118351 data-publication-typeentry> div classentry-inner> header classentry-header> div classdate entry-date first> a hrefhttps://dnskimox.hateblo.jp/archive/2021/09/17 relnofollow> time datetime2021-09-16T22:13:26Z title2021-09-16T22:13:26Z> span classdate-year>2021/span>span classhyphen>-/span>span classdate-month>09/span>span classhyphen>-/span>span classdate-day>17/span> /time> /a> /div> h1 classentry-title> a hrefhttps://dnskimox.hateblo.jp/entry/2021/09/17/071326 classentry-title-link bookmark>PHPerKaigi2021でユースケースシナリオについて話したことを半年後にふりかえる/a>/h1> div classentry-categories categories> a hrefhttps://dnskimox.hateblo.jp/archive/category/PHP classentry-category-link category-PHP>PHP/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-category-link category-カンファレンス>カンファレンス/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-category-link category-オブジェクト指向>オブジェクト指向/a> /div> /header> div classentry-content hatenablog-entry> p>早半年前になりますが、PHPerKaigi 2021に登壇者として参加していました。今更ながら記録のために書いておきます。/p>p>iframe classembed-card embed-webcard styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px; titlePHPerKaigi 2021 srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fphperkaigi.jp%2F2021%2F frameborder0 scrollingno>/iframe>cite classhatena-citation>a hrefhttps://phperkaigi.jp/2021/>phperkaigi.jp/a>/cite>/p>p> PHPerKaigiには第一回の2018年に一般参加していて、カンファレンス初体験にしてどっぷりとその楽しさの虜になってしまったという経緯があります。それ以降の2年間はスケジュールが合わず不参加だったのですが、今回ようやく再び参加することができました。オンライン開催だったので札幌在住の自分には参加しやすかったというのもあります。/p>p>iframe classembed-card embed-webcard styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px; titlePHPerKaigi 2018に行ってきました | 株式会社インフィニットループ技術ブログ srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fwww.infiniteloop.co.jp%2Fblog%2F2018%2F03%2Fphperkaigi-2018%2F frameborder0 scrollingno>/iframe>cite classhatena-citation>a hrefhttps://www.infiniteloop.co.jp/blog/2018/03/phperkaigi-2018/>www.infiniteloop.co.jp/a>/cite>/p>p>CfPはこの2年ほど自分が現場で活用してきたa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>という道具について、ざっくりと20分で話すという内容にしました。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>の本来の意味の探求と、a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>シナリオを書く際に押さえたいポイント、そこから実際のクラス設計に落とし込むまでの流れを解説してみました。a hrefhttps://ja.wikipedia.org/wiki/ICONIX>ICONIX/a>についてもしばらく実践してはみたのですが、今の所本格的に取り入れるに至っていないので割愛しました。 /p>p>iframe idtalk_frame_719087 styleborder: 0; padding: 0; margin: 0; background: transparent; src//speakerdeck.com/player/5ad9a33196b6452fbd315234e41f452e width710 height399 frameborder0 allowfullscreenallowfullscreen>/iframe> cite classhatena-citation>a hrefhttps://speakerdeck.com/dnskimo/yusukesusinariofalsesusume>speakerdeck.com/a>/cite>/p> a classentry-see-more hrefhttps://dnskimox.hateblo.jp/entry/2021/09/17/071326>続きを読む/a> /div> footer classentry-footer> div classentry-tags-wrapper> div classentry-tags> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>オブジェクト指向/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>カンファレンス/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/PHP classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>PHP/span> /a> /span> /div>/div> p classentry-footer-section track-inview-by-gtm data-gtm-track-json{"area": "finish_reading"}> span classauthor vcard>span classfn data-load-nickname1 data-user-namednskimox >dnskimox/span>/span> span classentry-footer-time>a hrefhttps://dnskimox.hateblo.jp/entry/2021/09/17/071326>time data-relative datetime2021-09-16T22:13:26Z title2021-09-16T22:13:26Z classupdated>2021-09-17 07:13/time>/a>/span> span class entry-footer-subscribe data-test-blog-controlls-subscribe> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_mediumbutton&utm_sourceblogs_entry_footer&utm_campaignsubscribe_blog> 読者になる /a> /span> /p> div classhatena-star-container data-hatena-star-container data-hatena-star-urlhttps://dnskimox.hateblo.jp/entry/2021/09/17/071326 data-hatena-star-titlePHPerKaigi2021でユースケースシナリオについて話したことを半年後にふりかえる data-hatena-star-variantprofile-icon data-hatena-star-profile-url-templatehttps://blog.hatena.ne.jp/{username}/ >/div> div classsocial-buttons> div classsocial-button-item> a hrefhttps://b.hatena.ne.jp/entry/s/dnskimox.hateblo.jp/entry/2021/09/17/071326 classhatena-bookmark-button data-hatena-bookmark-urlhttps://dnskimox.hateblo.jp/entry/2021/09/17/071326 data-hatena-bookmark-layoutvertical-balloon data-hatena-bookmark-langja titleこの記事をはてなブックマークに追加>img srchttps://b.st-hatena.com/images/entry-button/button-only.gif altこの記事をはてなブックマークに追加 width20 height20 styleborder: none; />/a> /div> div classsocial-button-item> div classfb-share-button data-layoutbox_count data-hrefhttps://dnskimox.hateblo.jp/entry/2021/09/17/071326>/div> /div> div classsocial-button-item> a classentry-share-button entry-share-button-twitter test-share-button-twitter hrefhttps://x.com/intent/tweet?hashtags%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&hashtags%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9&hashtagsPHP&textPHPerKaigi2021%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A9%B1%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%E3%82%92%E5%8D%8A%E5%B9%B4%E5%BE%8C%E3%81%AB%E3%81%B5%E3%82%8A%E3%81%8B%E3%81%88%E3%82%8B+-+%E7%94%B7%E7%88%B5%E3%81%8C%E6%9B%B8%E3%81%8F&urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2Fentry%2F2021%2F09%2F17%2F071326 titleX(Twitter)で投稿する >/a> /div> /div> div classgoogle-afc-image test-google-rectangle-ads> div idgoogle_afc_user_container_2 classgoogle-afc-user-container google_afc_blocklink2_5 google_afc_boder data-test-unit/4374287/blog_user_2nd>/div> a hrefhttp://blog.hatena.ne.jp/guide/pro classopen-pro-modal data-guide-pro-modal-ad-urlhttps://hatena.blog/guide/pro/modal/ad>広告を非表示にする/a> /div> div classcustomized-footer> /div> div classcomment-box js-comment-box> ul classcomment js-comment> li classread-more-comments styledisplay: none;>a>もっと読む/a>/li> /ul> a classleave-comment-title js-leave-comment-title>コメントを書く/a> /div> /footer> /div>/article> article classentry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-1200 words-100 mode-markdown entry-odd identry-26006613664573673 data-keyword-campaign data-uuid26006613664573673 data-publication-typeentry> div classentry-inner> header classentry-header> div classdate entry-date first> a hrefhttps://dnskimox.hateblo.jp/archive/2020/12/19 relnofollow> time datetime2020-12-19T09:41:01Z title2020-12-19T09:41:01Z> span classdate-year>2020/span>span classhyphen>-/span>span classdate-month>12/span>span classhyphen>-/span>span classdate-day>19/span> /time> /a> /div> h1 classentry-title> a hrefhttps://dnskimox.hateblo.jp/entry/2020/12/19/184101 classentry-title-link bookmark>ユースケースシナリオを中心に据えたドメインモデルの育て方/a>/h1> div classentry-categories categories> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-category-link category-オブジェクト指向>オブジェクト指向/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88 classentry-category-link category-ドメイン駆動設計>ドメイン駆動設計/a> /div> /header> div classentry-content hatenablog-entry> p>この記事はa hrefhttps://qiita.com/advent-calendar/2020/ddd>ドメイン駆動設計 Advent Calendar 2020 - Qiita/a>の19日目です。 昨日はa hrefhttps://twitter.com/Tanaka9230>たなかこういち (@Tanaka9230) | Twitter/a>さんの『a hrefhttps://qiita.com/tanaka9230/items/dd3ff0663a0295a47674>DDDに関する論の主戦軸を整理してみた(2020年版) - Qiita/a>』でした。/p>p>今日はa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計における主要な関心事の一つである「いかにa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>モデルを作って、育てていくか」という話を書きたいと思います。/p>p>エリック・a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A8%A5%F4%A5%A1>エヴァ/a>ンスの『a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計』やヴォーン・ヴァーノンの『実践a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計』には、ソフトウェアが扱う問題領域に存在する知識やルールをソフトウェアの要素(クラスなど)で直接表現することの価値とその実践方法が書かれています。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>モデルは問題領域に対する理解を表現したものであり、まずこれがなければa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計のプa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E9%A5%AF>ラク/a>ティスは実践できません。では開発チームがa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>モデルに到達するためのプa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E9%A5%AF>ラク/a>ティスにはどのようなものがあるのでしょうか?/p>p>その答えは世の中にいくつもあると思いますが、今回紹介するのは「a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>」を中心に据えた方法論です。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>と聞いて多くの人が思い浮かべるのはa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>図かもしれませんが、ここで重要となるのはstrong>a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>シナリオ(a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>記述)/strong>と呼ばれる文章表現のほうです。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計はa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A5%D3%A5%AD%A5%BF%A5%B9>ユビキタス/a>言語を認識して言葉を大事にする設計手法です。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>シナリオはa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC>自然言語/a>で書かれるので、a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A5%D3%A5%AD%A5%BF%A5%B9>ユビキタス/a>言語を直接用いてシステムの仕様を表現することができます。/p>p>a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC>自然言語/a>で書かれているので、エンジニア以外でもほとんど予備知識無しに読み解くことが可能です。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計が開発者の中で完結した手法ではなく、顧客やプロダクトオーナー、ビジネスメンバーを巻き込んで行う必要がある以上、設計ドキュメントが誰にでも理解できる形式になっていることが非常に大きな意味を持ちます。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B9%A5%B1%A1%BC%A5%B9>ユースケース/a>シナリオを中心に据えた手法は、ソフトウェアに関わる全ての人を設計の深いところまで連れて行くことができるのです。この性質はビジネス領域とテクa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%CE%A5%ED>ノロ/a>a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%B8%A1%BC>ジー/a>領域を行き来して進化していくa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計をスムーズに回していく助けとなるはずです。/p>p>それでは、筆者が自分の現場でどのように実践しているのかを順を追って説明していきます。/p> a classentry-see-more hrefhttps://dnskimox.hateblo.jp/entry/2020/12/19/184101>続きを読む/a> /div> footer classentry-footer> div classentry-tags-wrapper> div classentry-tags> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>オブジェクト指向/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>ドメイン駆動設計/span> /a> /span> /div>/div> p classentry-footer-section track-inview-by-gtm data-gtm-track-json{"area": "finish_reading"}> span classauthor vcard>span classfn data-load-nickname1 data-user-namednskimox >dnskimox/span>/span> span classentry-footer-time>a hrefhttps://dnskimox.hateblo.jp/entry/2020/12/19/184101>time data-relative datetime2020-12-19T09:41:01Z title2020-12-19T09:41:01Z classupdated>2020-12-19 18:41/time>/a>/span> span class entry-footer-subscribe data-test-blog-controlls-subscribe> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_sourceblogs_entry_footer&utm_mediumbutton&utm_campaignsubscribe_blog> 読者になる /a> /span> /p> div classhatena-star-container data-hatena-star-container data-hatena-star-urlhttps://dnskimox.hateblo.jp/entry/2020/12/19/184101 data-hatena-star-titleユースケースシナリオを中心に据えたドメインモデルの育て方 data-hatena-star-variantprofile-icon data-hatena-star-profile-url-templatehttps://blog.hatena.ne.jp/{username}/ >/div> div classsocial-buttons> div classsocial-button-item> a hrefhttps://b.hatena.ne.jp/entry/s/dnskimox.hateblo.jp/entry/2020/12/19/184101 classhatena-bookmark-button data-hatena-bookmark-urlhttps://dnskimox.hateblo.jp/entry/2020/12/19/184101 data-hatena-bookmark-layoutvertical-balloon data-hatena-bookmark-langja titleこの記事をはてなブックマークに追加>img srchttps://b.st-hatena.com/images/entry-button/button-only.gif altこの記事をはてなブックマークに追加 width20 height20 styleborder: none; />/a> /div> div classsocial-button-item> div classfb-share-button data-layoutbox_count data-hrefhttps://dnskimox.hateblo.jp/entry/2020/12/19/184101>/div> /div> div classsocial-button-item> a classentry-share-button entry-share-button-twitter test-share-button-twitter hrefhttps://x.com/intent/tweet?hashtags%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&hashtags%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&text%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E3%82%92%E4%B8%AD%E5%BF%83%E3%81%AB%E6%8D%AE%E3%81%88%E3%81%9F%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%82%B2%E3%81%A6%E6%96%B9+-+%E7%94%B7%E7%88%B5%E3%81%8C%E6%9B%B8%E3%81%8F&urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2Fentry%2F2020%2F12%2F19%2F184101 titleX(Twitter)で投稿する >/a> /div> /div> div classgoogle-afc-image test-google-rectangle-ads> div idgoogle_afc_user_container_3 classgoogle-afc-user-container google_afc_blocklink2_5 google_afc_boder data-test-unit/4374287/blog_user_2nd>/div> a hrefhttp://blog.hatena.ne.jp/guide/pro classopen-pro-modal data-guide-pro-modal-ad-urlhttps://hatena.blog/guide/pro/modal/ad>広告を非表示にする/a> /div> div classcustomized-footer> /div> div classcomment-box js-comment-box> ul classcomment js-comment> li classread-more-comments styledisplay: none;>a>もっと読む/a>/li> /ul> a classleave-comment-title js-leave-comment-title>コメントを書く/a> /div> /footer> /div>/article> article classentry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-1200 words-100 mode-markdown entry-even identry-26006613644694574 data-keyword-campaign data-uuid26006613644694574 data-publication-typeentry> div classentry-inner> header classentry-header> div classdate entry-date first> a hrefhttps://dnskimox.hateblo.jp/archive/2020/10/26 relnofollow> time datetime2020-10-26T01:10:55Z title2020-10-26T01:10:55Z> span classdate-year>2020/span>span classhyphen>-/span>span classdate-month>10/span>span classhyphen>-/span>span classdate-day>26/span> /time> /a> /div> h1 classentry-title> a hrefhttps://dnskimox.hateblo.jp/entry/2020/10/26/101055 classentry-title-link bookmark>ScalaMatsuri 2020でPofEAAについて話しました/a>/h1> div classentry-categories categories> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-category-link category-オブジェクト指向>オブジェクト指向/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-category-link category-カンファレンス>カンファレンス/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/Scala classentry-category-link category-Scala>Scala/a> /div> /header> div classentry-content hatenablog-entry> p>去る10月の17日、ScalaMatsuri 2020で登壇しました。今年はオンライン開催だったため、自宅とa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%B3%A5%EF%A1%BC%A5%AD%A5%F3%A5%B0%A5%B9%A5%DA%A1%BC%A5%B9>コワーキングスペース/a>からZoomとDiscordでの参加。オンラインでの大型カンファレンスは参加するのも登壇するのも初めてだったのですが、オンラインならでは工夫が随所に凝らされていて存分に楽しめました。/p>p>iframe srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fscalamatsuri.org%2Fja%2F titleScalaMatsuri 2022 | アジア最大級の Scala のカンファレンス classembed-card embed-webcard scrollingno frameborder0 styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;>/iframe>cite classhatena-citation>a hrefhttps://scalamatsuri.org/ja/>scalamatsuri.org/a>/cite>/p>p>CfPが採択されたのが今年の3月末で、そこから登壇資料の作成やスタッフの方との接続テストを行ってから当日を迎えました。会場までの移動時間がかからないので、開会の挨拶にも余裕を持って参加できました。/p>p>お昼は近場の行きつけのカフェでランチ。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB>スマホ/a>でa hrefhttps://scalamatsuri.org/ja/proposals/J6>かとじゅんさんのセッション/a>を視聴しながら食事を摂れるのも、オンライン開催ならではですね。/p>p>span itemscope itemtypehttp://schema.org/Photograph>a hrefhttp://f.hatena.ne.jp/dnskimox/20201025135840 classhatena-fotolife itempropurl>img srchttps://cdn-ak.f.st-hatena.com/images/fotolife/d/dnskimox/20201025/20201025135840.jpg altf:id:dnskimox:20201025135840j:image:w400 width1024 height1024 loadinglazy title classhatena-fotolife stylewidth:400px itempropimage>/a>/span>/p>p>自分は15時からの40分枠で、『PofEAAで考えるa classkeyword hrefhttp://d.hatena.ne.jp/keyword/SaaS>SaaS/a>バックエンドの作り方』と題して発表させていただきました。ScalaMatsuriは海外からの参加者も多い国際カンファレンスなので、拙い英語でなんとか資料を作りました。最初から英語で考えて、後から日本語訳をつけるほうが案外スムーズに進みました。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/Google%CB%DD%CC%F5>Google翻訳/a>で「英語→日本語」の変換をチェックしながらの作業でした。/p>p>iframe idtalk_frame_674444 classspeakerdeck-iframe src//speakerdeck.com/player/e1a89af9f06447ce9788c3837ea0b416 width710 height532 styleaspect-ratio:710/532; border:0; padding:0; margin:0; background:transparent; frameborder0 allowtransparencytrue allowfullscreenallowfullscreen mozallowfullscreentrue webkitallowfullscreentrue>/iframe> cite classhatena-citation>a hrefhttps://speakerdeck.com/dnskimo/pofeaadekao-erusaasbatukuendofalsezuo-rifang>speakerdeck.com/a>/cite>/p>p>PofEAAネタはa classkeyword hrefhttp://d.hatena.ne.jp/keyword/PHP%A5%AB%A5%F3%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9>PHPカンファレンス/a>福岡2018でDoctrine2の話をして以来です。今回はORMだけでなく、アプリケーション全体に様々なパターンを適用するお話です。ほとんどがAlpで実践した内容となっております。オフラインのカンファレンスのようなダイレクトな反応は味わえなかったのですが、Discordに質問用と雑談用のルームが用意されており、話しながらリアクションを確認できるのは良かったです。/p>p>お楽しみの懇親会では、日頃ScalikeJDBCでお世話になっているa hrefhttps://twitter.com/seratch_ja>@seratch_ja/a>さんや、最近何かとご縁のあるa hrefhttps://twitter.com/todokr>@todokr/a>さんなど、a classkeyword hrefhttp://d.hatena.ne.jp/keyword/Scala>Scala/a>界隈で活躍する方々のお話が聴けて貴重な時間でした(ほぼ聴き専と化していました)。Discordの部屋を大量に作って任意のところにいって会話するというやり方は、懇親会会場で「輪」に入っていくあの感覚に近いものがあったと思います。/p>p>今回は準備期間中に大きな方針転換を迫られ、スタッフやスポンサーの方々も色々と大変だったと思います。それでも開催に漕ぎ着けてくれたことに感謝しつつ、来年もまたこの祭りに参加できることを楽しみにしています。/p> /div> footer classentry-footer> div classentry-tags-wrapper> div classentry-tags> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>カンファレンス/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/Scala classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>Scala/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>オブジェクト指向/span> /a> /span> /div>/div> p classentry-footer-section track-inview-by-gtm data-gtm-track-json{"area": "finish_reading"}> span classauthor vcard>span classfn data-load-nickname1 data-user-namednskimox >dnskimox/span>/span> span classentry-footer-time>a hrefhttps://dnskimox.hateblo.jp/entry/2020/10/26/101055>time data-relative datetime2020-10-26T01:10:55Z title2020-10-26T01:10:55Z classupdated>2020-10-26 10:10/time>/a>/span> span class entry-footer-subscribe data-test-blog-controlls-subscribe> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_mediumbutton&utm_sourceblogs_entry_footer&utm_campaignsubscribe_blog> 読者になる /a> /span> /p> div classhatena-star-container data-hatena-star-container data-hatena-star-urlhttps://dnskimox.hateblo.jp/entry/2020/10/26/101055 data-hatena-star-titleScalaMatsuri 2020でPofEAAについて話しました data-hatena-star-variantprofile-icon data-hatena-star-profile-url-templatehttps://blog.hatena.ne.jp/{username}/ >/div> div classsocial-buttons> div classsocial-button-item> a hrefhttps://b.hatena.ne.jp/entry/s/dnskimox.hateblo.jp/entry/2020/10/26/101055 classhatena-bookmark-button data-hatena-bookmark-urlhttps://dnskimox.hateblo.jp/entry/2020/10/26/101055 data-hatena-bookmark-layoutvertical-balloon data-hatena-bookmark-langja titleこの記事をはてなブックマークに追加>img srchttps://b.st-hatena.com/images/entry-button/button-only.gif altこの記事をはてなブックマークに追加 width20 height20 styleborder: none; />/a> /div> div classsocial-button-item> div classfb-share-button data-layoutbox_count data-hrefhttps://dnskimox.hateblo.jp/entry/2020/10/26/101055>/div> /div> div classsocial-button-item> a classentry-share-button entry-share-button-twitter test-share-button-twitter hrefhttps://x.com/intent/tweet?hashtags%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9&hashtagsScala&hashtags%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&textScalaMatsuri+2020%E3%81%A7PofEAA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A9%B1%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F+-+%E7%94%B7%E7%88%B5%E3%81%8C%E6%9B%B8%E3%81%8F&urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2Fentry%2F2020%2F10%2F26%2F101055 titleX(Twitter)で投稿する >/a> /div> /div> div classgoogle-afc-image test-google-rectangle-ads> script> (valve window.valve || ).push(function(v) { v.displayDFPSlot(google_afc_user_container_4); }); /script> div idgoogle_afc_user_container_4 classgoogle-afc-user-container google_afc_blocklink2_5 google_afc_boder data-test-unit/4374287/blog_user_2nd>/div> a hrefhttp://blog.hatena.ne.jp/guide/pro classopen-pro-modal data-guide-pro-modal-ad-urlhttps://hatena.blog/guide/pro/modal/ad>広告を非表示にする/a> /div> div classcustomized-footer> /div> div classcomment-box js-comment-box> ul classcomment js-comment> li classread-more-comments styledisplay: none;>a>もっと読む/a>/li> /ul> a classleave-comment-title js-leave-comment-title>コメントを書く/a> /div> /footer> /div>/article> article classentry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-800 words-100 mode-markdown entry-odd identry-26006613517039504 data-keyword-campaign data-uuid26006613517039504 data-publication-typeentry> div classentry-inner> header classentry-header> div classdate entry-date first> a hrefhttps://dnskimox.hateblo.jp/archive/2020/02/22 relnofollow> time datetime2020-02-22T01:43:42Z title2020-02-22T01:43:42Z> span classdate-year>2020/span>span classhyphen>-/span>span classdate-month>02/span>span classhyphen>-/span>span classdate-day>22/span> /time> /a> /div> h1 classentry-title> a hrefhttps://dnskimox.hateblo.jp/entry/2020/02/22/104342 classentry-title-link bookmark>Object-Oriented Conferenceで契約による設計について話してきました/a>/h1> div classentry-categories categories> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-category-link category-オブジェクト指向>オブジェクト指向/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-category-link category-カンファレンス>カンファレンス/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/Scala classentry-category-link category-Scala>Scala/a> /div> /header> div classentry-content hatenablog-entry> p>去る先週の日曜日、Object-Oriented Conferenceに参加してきました。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE>オブジェクト指向/a>好きとしてはド直球なテーマで、去年名前を聞いてからずっと楽しみにしていました。/p>p>iframe srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fooc.dev%2F titleObject Oriented Conference classembed-card embed-webcard scrollingno frameborder0 styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;>/iframe>cite classhatena-citation>a hrefhttps://ooc.dev/>ooc.dev/a>/cite>/p>p>今の時代にあえてa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE>オブジェクト指向/a>をメインテーマにするというのは、とても意義のあることだと思います。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計やマイクロサービスa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3>アーキテクチャ/a>がブームになる中で、そこに至るまでに先人達が歩んできた道筋を理解することなく、新しい概念や道具を使いこなすことは困難です。「何故」a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計なのか、「何故」マイクロサービスなのか。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE>オブジェクト指向/a>を探求していけば、自然とその動機が見えてきます。/p>p>「時代の流れだから◯◯を使うべき」と言う人もいるでしょう。しかし、大抵の開発現場に必要なのは全く新しい何かではなく、これまで使いこなせていなかった道具に立ち返ることだと常々思います。それができて初めて、次のステップに進めるはずです。そうでなければ、新しいものにすぐに飛びついては失敗するというループを永遠に繰り返すことになります。/p>p>昨今、a classkeyword hrefhttp://d.hatena.ne.jp/keyword/PHP>PHP/a>界隈でもa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE>オブジェクト指向/a>の話題が目立つようになってきました。関数型の要素が話題になりがちなa classkeyword hrefhttp://d.hatena.ne.jp/keyword/Scala>Scala/a>も、本格的なa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE>オブジェクト指向/a>の機能を備えています。今a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE>オブジェクト指向/a>を学ぶことは、ただ古い時代に思いを馳せることではなく、明日から使える古くて新しい道具を発掘することになるのです。/p> a classentry-see-more hrefhttps://dnskimox.hateblo.jp/entry/2020/02/22/104342>続きを読む/a> /div> footer classentry-footer> div classentry-tags-wrapper> div classentry-tags> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>オブジェクト指向/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>カンファレンス/span> /a> /span> /div>/div> p classentry-footer-section track-inview-by-gtm data-gtm-track-json{"area": "finish_reading"}> span classauthor vcard>span classfn data-load-nickname1 data-user-namednskimox >dnskimox/span>/span> span classentry-footer-time>a hrefhttps://dnskimox.hateblo.jp/entry/2020/02/22/104342>time data-relative datetime2020-02-22T01:43:42Z title2020-02-22T01:43:42Z classupdated>2020-02-22 10:43/time>/a>/span> span class entry-footer-subscribe data-test-blog-controlls-subscribe> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_sourceblogs_entry_footer&utm_mediumbutton&utm_campaignsubscribe_blog> 読者になる /a> /span> /p> div classhatena-star-container data-hatena-star-container data-hatena-star-urlhttps://dnskimox.hateblo.jp/entry/2020/02/22/104342 data-hatena-star-titleObject-Oriented Conferenceで契約による設計について話してきました data-hatena-star-variantprofile-icon data-hatena-star-profile-url-templatehttps://blog.hatena.ne.jp/{username}/ >/div> div classsocial-buttons> div classsocial-button-item> a hrefhttps://b.hatena.ne.jp/entry/s/dnskimox.hateblo.jp/entry/2020/02/22/104342 classhatena-bookmark-button data-hatena-bookmark-urlhttps://dnskimox.hateblo.jp/entry/2020/02/22/104342 data-hatena-bookmark-layoutvertical-balloon data-hatena-bookmark-langja titleこの記事をはてなブックマークに追加>img srchttps://b.st-hatena.com/images/entry-button/button-only.gif altこの記事をはてなブックマークに追加 width20 height20 styleborder: none; />/a> /div> div classsocial-button-item> div classfb-share-button data-layoutbox_count data-hrefhttps://dnskimox.hateblo.jp/entry/2020/02/22/104342>/div> /div> div classsocial-button-item> a classentry-share-button entry-share-button-twitter test-share-button-twitter hrefhttps://x.com/intent/tweet?hashtags%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&hashtags%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9&textObject-Oriented+Conference%E3%81%A7%E5%A5%91%E7%B4%84%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%AD%E8%A8%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A9%B1%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F+-+%E7%94%B7%E7%88%B5%E3%81%8C%E6%9B%B8%E3%81%8F&urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2Fentry%2F2020%2F02%2F22%2F104342 titleX(Twitter)で投稿する >/a> /div> /div> div classgoogle-afc-image test-google-rectangle-ads> script> (valve window.valve || ).push(function(v) { v.displayDFPSlot(google_afc_user_container_5); }); /script> div idgoogle_afc_user_container_5 classgoogle-afc-user-container google_afc_blocklink2_5 google_afc_boder data-test-unit/4374287/blog_user_2nd>/div> a hrefhttp://blog.hatena.ne.jp/guide/pro classopen-pro-modal data-guide-pro-modal-ad-urlhttps://hatena.blog/guide/pro/modal/ad>広告を非表示にする/a> /div> div classcustomized-footer> /div> div classcomment-box js-comment-box> ul classcomment js-comment> li classread-more-comments styledisplay: none;>a>もっと読む/a>/li> /ul> a classleave-comment-title js-leave-comment-title>コメントを書く/a> /div> /footer> /div>/article> article classentry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-2800 words-200 mode-markdown entry-even identry-17680117127218002863 data-keyword-campaign data-uuid17680117127218002863 data-publication-typeentry> div classentry-inner> header classentry-header> div classdate entry-date first> a hrefhttps://dnskimox.hateblo.jp/archive/2019/12/13 relnofollow> time datetime2019-12-13T12:27:42Z title2019-12-13T12:27:42Z> span classdate-year>2019/span>span classhyphen>-/span>span classdate-month>12/span>span classhyphen>-/span>span classdate-day>13/span> /time> /a> /div> h1 classentry-title> a hrefhttps://dnskimox.hateblo.jp/entry/2019/12/13/212742 classentry-title-link bookmark>Scalaでイミュータブルなエンティティを実装する/a>/h1> div classentry-categories categories> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-category-link category-オブジェクト指向>オブジェクト指向/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/Scala classentry-category-link category-Scala>Scala/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88 classentry-category-link category-ドメイン駆動設計>ドメイン駆動設計/a> /div> /header> div classentry-content hatenablog-entry> p>この記事はa hrefhttps://qiita.com/advent-calendar/2019/scala>Scala Advent Calendar 2019 - Qiita/a>の13日目の記事です。/p>p>a classkeyword hrefhttp://d.hatena.ne.jp/keyword/Scala>Scala/a>界隈にはa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計を実践されている、または導入を検討されている方が多いかと思います。筆者が携わっているScalebaseプロジェクトでも、バックエンドa classkeyword hrefhttp://d.hatena.ne.jp/keyword/API>API/a>の実装にa classkeyword hrefhttp://d.hatena.ne.jp/keyword/Scala>Scala/a>を採用しつつa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計を念頭に開発を進めています。/p>p>iframe srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fwww.scalebase.com%2F titleScalebase(スケールベース) | クラウド販売・請求管理システム classembed-card embed-webcard scrollingno frameborder0 styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;>/iframe>cite classhatena-citation>a hrefhttps://www.scalebase.com/>www.scalebase.com/a>/cite>/p>p>今回はその試行錯誤の経験の中から、Case Classを用いたイミュータブルなエンティティの特性について、感じたことを共有したいと思います。/p>h2>ミュータブルなエンティティ/h2>p>『a hrefhttps://www.shoeisha.co.jp/book/detail/9784798121963>エリック・エヴァンスのドメイン駆動設計/a>』では、システムが同一性を考慮しなければならないb>エンティティ/b>と、同一性を考慮しなくてよいb>値オブジェクト/b>を区別して設計することが強調されています。エンティティは概念的に「変化するもの(ミュータブル)」であり、値オブジェクトは一度生まれたら「変化しないもの(イミュータブル)」です。/p>p>同一性を考慮する必要があるというのは、例えば現実世界の人間のように、身長、体重、年齢、健康状態、あるいは名前が変わったとしても、「同一の人間である」と捉えるべき存在であるということです。しかし、システム上は必ずしも人間がエンティティであるとは限りません。例えば映画館の来場者の数や属性を記録するだけのシステムでは、人間を表す値オブジェクトを設計するのが妥当な判断になるかもしれません。何をエンティティとして扱うべきかは、作っているアプリケーションによって異なるのです。/p>p>別の例としては、「銀行口座」もシステム上でエンティティとして扱われることが多い概念でしょう。今あなたは「口座管理システム」の設計を任されているとします。このシステムでは各口座の同一性を認識し、どの口座に、どの通貨が、いくら預けられているかを記録しておく必要があります。/p>p>span itemscope itemtypehttp://schema.org/Photograph>img srchttps://cdn-ak.f.st-hatena.com/images/fotolife/d/dnskimox/20191213/20191213020903.png altf:id:dnskimox:20191213020903p:plain width457 height302 loadinglazy title classhatena-fotolife itempropimage>/span>/p>p>一般的には同一性を確認するために一意な識別子(ID)を設け、データベースのユニーク制約などを用いて、システム内に同一のIDを持つエンティティがただ一つであることを保証することになるでしょう。上のa classkeyword hrefhttp://d.hatena.ne.jp/keyword/UML>UML/a>は「名前」と「金額」を表す値のグループを、それぞれ値オブジェクトとして定義することを示しています。また、口座IDも専用のクラスを設けて値オブジェクトにしています。まずはこれをa classkeyword hrefhttp://d.hatena.ne.jp/keyword/Scala>Scala/a>のクラスで表現してみましょう。/p>pre classcode lang-scala data-langscala data-unlink>span classsynType>class/span> Account( span classsynType>val/span> id: AccountId, span classsynComment>// 口座のID/span> span classsynType>private/span> span classsynType>var/span> ownerName: Name, span classsynComment>// 名義人名/span> span classsynType>private/span> span classsynType>var/span> balances: Mapspan classsynConstant>String/span>, Money Map() span classsynComment>// 通貨毎の口座の残高/span>) { assert(balances.forall(_._2.value > span classsynConstant>0/span>), span classsynConstant>"残高が0未満になることはない"/span>)span classsynIdentifier> def/span> getOwnerName: Name ownerNamespan classsynIdentifier> def/span> getBalances: Mapspan classsynConstant>String/span>, Money balancesspan classsynIdentifier> def/span> changeOwnerName(newName: Name): Unit { ownerName newName }span classsynIdentifier> def/span> addMoney(newMoney: Money): Unit { span classsynType>val/span> existingMoney balances.getOrElse(newMoney.code, Money(newMoney.code, span classsynConstant>0/span>)) balances balances + (newMoney.code -> existingMoney.plus(newMoney)) }}span classsynType>case/span> span classsynType>class/span> AccountId(value: Int) span classsynComment>// 口座IDを表すVO/span>span classsynType>case/span> span classsynType>class/span> Name(firstName: span classsynConstant>String/span>, lastName: span classsynConstant>String/span>) span classsynComment>// 名前を表すVO/span>span classsynType>case/span> span classsynType>class/span> Money(code: span classsynConstant>String/span>, value: Double) { span classsynComment>// 金額を表すVO/span>span classsynIdentifier> def/span> plus(other: Money): Money { require(other.code code, span classsynConstant>"同じ通貨のみ加算できる"/span>) copy(value value + other.value) }}/pre>p>IDが変化してしまうと同一性を認識できなくなるので、そこだけは定数とし、他のプロパティは全て変数としています。この形は「概念的に」ミュータブルであるエンティティを、コード上でもミュータブルなものとして表現しています。a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9>インスタンス/a>を作り、a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA>リポジトリ/a>に永続化するコードは以下のようなイメージです。/p>pre classcode lang-scala data-langscala data-unlink>span classsynType>val/span> account1 span classsynStatement>new/span> Account(AccountId(span classsynConstant>1/span>), Name(span classsynConstant>"太郎"/span>, span classsynConstant>"山田"/span>), List())account1.addMoney(Money(span classsynConstant>"JPY"/span>, span classsynConstant>100.0/span>))accountRepository.store(account1)/pre>p>ミュータブルな実装であれば、復元したエンティティに対して変更を加え、再度保存するというようなコードが素直に書けます。/p>pre classcode lang-scala data-langscala data-unlink>span classsynType>val/span> account1 accountRepository.findById(AccountId(span classsynConstant>1/span>))account1.changeOwnerName(Name(span classsynConstant>"次郎"/span>, span classsynConstant>"山田"/span>))account1.addMoney(Money(span classsynConstant>"USD"/span>, span classsynConstant>1.0/span>))account1.addMoney(Money(span classsynConstant>"EUR"/span>, span classsynConstant>2.0/span>))accountRepository.store(account1)/pre>p>さらにa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA>リポジトリ/a>にb>Identity Map/b>パターンを組み込めば、同一のIDのエンティティがスコープの中にただ一つしか存在しないように保証することも可能です。もし同一のIDのエンティティが複数同時に存在するようなコードを書いてしまった場合、どれを保存すれば最新の状態が記録されるか判別が困難になるため、これは重要なポイントです。/p>p>iframe srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fwww.martinfowler.com%2FeaaCatalog%2FidentityMap.html titleP of EAA: Identity Map classembed-card embed-webcard scrollingno frameborder0 styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;>/iframe>cite classhatena-citation>a hrefhttps://www.martinfowler.com/eaaCatalog/identityMap.html>www.martinfowler.com/a>/cite>/p> a classentry-see-more hrefhttps://dnskimox.hateblo.jp/entry/2019/12/13/212742>続きを読む/a> /div> footer classentry-footer> div classentry-tags-wrapper> div classentry-tags> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/Scala classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>Scala/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>オブジェクト指向/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>ドメイン駆動設計/span> /a> /span> /div>/div> p classentry-footer-section track-inview-by-gtm data-gtm-track-json{"area": "finish_reading"}> span classauthor vcard>span classfn data-load-nickname1 data-user-namednskimox >dnskimox/span>/span> span classentry-footer-time>a hrefhttps://dnskimox.hateblo.jp/entry/2019/12/13/212742>time data-relative datetime2019-12-13T12:27:42Z title2019-12-13T12:27:42Z classupdated>2019-12-13 21:27/time>/a>/span> span class entry-footer-subscribe data-test-blog-controlls-subscribe> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_sourceblogs_entry_footer&utm_mediumbutton&utm_campaignsubscribe_blog> 読者になる /a> /span> /p> div classhatena-star-container data-hatena-star-container data-hatena-star-urlhttps://dnskimox.hateblo.jp/entry/2019/12/13/212742 data-hatena-star-titleScalaでイミュータブルなエンティティを実装する data-hatena-star-variantprofile-icon data-hatena-star-profile-url-templatehttps://blog.hatena.ne.jp/{username}/ >/div> div classsocial-buttons> div classsocial-button-item> a hrefhttps://b.hatena.ne.jp/entry/s/dnskimox.hateblo.jp/entry/2019/12/13/212742 classhatena-bookmark-button data-hatena-bookmark-urlhttps://dnskimox.hateblo.jp/entry/2019/12/13/212742 data-hatena-bookmark-layoutvertical-balloon data-hatena-bookmark-langja titleこの記事をはてなブックマークに追加>img srchttps://b.st-hatena.com/images/entry-button/button-only.gif altこの記事をはてなブックマークに追加 width20 height20 styleborder: none; />/a> /div> div classsocial-button-item> div classfb-share-button data-layoutbox_count data-hrefhttps://dnskimox.hateblo.jp/entry/2019/12/13/212742>/div> /div> div classsocial-button-item> a classentry-share-button entry-share-button-twitter test-share-button-twitter hrefhttps://x.com/intent/tweet?hashtagsScala&hashtags%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&hashtags%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&textScala%E3%81%A7%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%81%AA%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B+-+%E7%94%B7%E7%88%B5%E3%81%8C%E6%9B%B8%E3%81%8F&urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2Fentry%2F2019%2F12%2F13%2F212742 titleX(Twitter)で投稿する >/a> /div> /div> div classgoogle-afc-image test-google-rectangle-ads> script> (valve window.valve || ).push(function(v) { v.displayDFPSlot(google_afc_user_container_6); }); /script> div idgoogle_afc_user_container_6 classgoogle-afc-user-container google_afc_blocklink2_5 google_afc_boder data-test-unit/4374287/blog_user_2nd>/div> a hrefhttp://blog.hatena.ne.jp/guide/pro classopen-pro-modal data-guide-pro-modal-ad-urlhttps://hatena.blog/guide/pro/modal/ad>広告を非表示にする/a> /div> div classcustomized-footer> /div> div classcomment-box js-comment-box> ul classcomment js-comment> li classread-more-comments styledisplay: none;>a>もっと読む/a>/li> /ul> a classleave-comment-title js-leave-comment-title>コメントを書く/a> /div> /footer> /div>/article> article classentry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-2000 words-100 mode-markdown entry-odd identry-26006613471485675 data-keyword-campaign data-uuid26006613471485675 data-publication-typeentry> div classentry-inner> header classentry-header> div classdate entry-date first> a hrefhttps://dnskimox.hateblo.jp/archive/2019/12/03 relnofollow> time datetime2019-12-03T04:00:24Z title2019-12-03T04:00:24Z> span classdate-year>2019/span>span classhyphen>-/span>span classdate-month>12/span>span classhyphen>-/span>span classdate-day>03/span> /time> /a> /div> h1 classentry-title> a hrefhttps://dnskimox.hateblo.jp/entry/2019/12/03/130024 classentry-title-link bookmark>PofEAAで考える値オブジェクトの永続化あれこれ/a>/h1> div classentry-categories categories> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-category-link category-オブジェクト指向>オブジェクト指向/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9 classentry-category-link category-データベース>データベース/a> a hrefhttps://dnskimox.hateblo.jp/archive/category/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88 classentry-category-link category-ドメイン駆動設計>ドメイン駆動設計/a> /div> /header> div classentry-content hatenablog-entry> p>この記事はa hrefhttps://qiita.com/advent-calendar/2019/ddd-1>ドメイン駆動設計#1 Advent Calendar 2019 - Qiita/a>の3日目の記事です。/p>p>エリック・a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A8%A5%F4%A5%A1>エヴァ/a>ンス氏の『a hrefhttps://www.shoeisha.co.jp/book/detail/9784798121963>ドメイン駆動設計/a>』に端を発したDDDの設計哲学では、システムが同一性を認識しなければならないb>エンティティ/b>と、同一性を認識しなくて良いb>値オブジェクト/b>を区別して設計することが重要であるとされています。例としてよく使われるのが「貨幣オブジェクト」です。/p>pre classcode lang-java data-langjava data-unlink>span classsynComment>// 貨幣/span>span classsynType>class/span> Money { String code; span classsynComment>// 通貨コード/span> Double value; span classsynComment>// いくらかを表す数値/span>}/pre>p>疑似コードなので雰囲気で読んでください。このMoneyクラスを使って「100円」というa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9>インスタンス/a>を2つ作ったとします。システムはこれらのa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9>インスタンス/a>が同一の貨幣を指しているのか、それとも偶然値が一致している(等価である)だけなのかをどのように判別すれば良いでしょうか? ここで「判別しなくて良い」と言えるシステムなら、貨幣オブジェクトを値オブジェクトとして扱うことが出来ます。極端な例として、日本中の貨幣にIDを振って管理する「貨幣流通管理システム」のようなものであれば、そうはいかないでしょう。/p>p>貨幣のようなものは、道端にポンと置かれていることはあまりありません。道端に落ちている貨幣は、誰のものかわからなくなります。システム内でも同様で、永続化対象となる値オブジェクトは何らかのエンティティの中に入っているはずです。IDを持ったエンティティの中に入っていなければ、永続化した値オブジェクトを再度取り出す手がかりが無くなってしまうためです。/p>pre classcode lang-java data-langjava data-unlink>span classsynComment>// 財布/span>span classsynType>class/span> Wallet { String id; span classsynComment>// 財布のID/span> Money money; span classsynComment>// 財布の中身/span>}/pre>p>では、このエンティティ内の値オブジェクトはどのようにデーターベースに永続化されるのでしょうか? オブジェクトをデーターベース、特にリレーショナル・データベースに永続化する際には、オブジェクトの形とテーブル構造を必ずしも一致させられないという問題があります(a hrefhttps://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%94%E3%83%BC%E3%83%80%E3%83%B3%E3%82%B9%E3%83%9F%E3%82%B9%E3%83%9E%E3%83%83%E3%83%81>インピーダンスミスマッチ/a>)。Walletのような複合的なオブジェクトを保存するには、何らかの実装方針を選択しなければなりません。/p>p>これついてはa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%DE%A1%BC%A5%C6%A5%A3%A5%F3%A1%A6%A5%D5%A5%A1%A5%A6%A5%E9%A1%BC>マーティン・ファウラー/a>氏が『a hrefhttps://www.shoeisha.co.jp/book/detail/9784798105536>エンタープライズアプリケーションアーキテクチャパターン/a>』(PofEAA)の中で答えてくれています。『a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3>ドメイン/a>駆動設計』の出版より少し前の本ですが、値オブジェクトというアa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%A4%A5%C7%A5%A2>イデア/a>自体はa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE>オブジェクト指向/a>界隈にそれ以前からあったものなのです。PofEAAは実装上の課題一つに対していくつかの解決策を挙げ、それぞれどのような長所・短所があるのかを解説するというスタイルで書かれています。値オブジェクトの永続化に関しても、3つのa classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%C7%A5%B6%A5%A4%A5%F3%A5%D1%A5%BF%A1%BC%A5%F3>デザインパターン/a>が紹介されています。/p>h2>小さなオブジェクトを一つだけ/h2>p>まず上記に挙げたようにWalletオブジェクトの中に一つだけMoneyオブジェクトが入っているようなケースでは、b>Embedded a classkeyword hrefhttp://d.hatena.ne.jp/keyword/Value>Value/a>/b>パターンが有力な候補になるでしょう。/p>p>iframe srchttps://hatenablog-parts.com/embed?urlhttps%3A%2F%2Fwww.martinfowler.com%2FeaaCatalog%2FembeddedValue.html titleP of EAA: Embedded Value classembed-card embed-webcard scrollingno frameborder0 styledisplay: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;>/iframe>cite classhatena-citation>a hrefhttps://www.martinfowler.com/eaaCatalog/embeddedValue.html>www.martinfowler.com/a>/cite>/p>p>Embedded a classkeyword hrefhttp://d.hatena.ne.jp/keyword/Value>Value/a>パターンは、親となるエンティティを永続化するテーブルに、値オブジェクトの各プロパティを分解して入れてしまうという方法です。例えば、walletsテーブルは以下のような定義になります。/p>pre classcode lang-sql data-langsql data-unlink>span classsynStatement>CREATE/span> span classsynSpecial>TABLE/span> wallets ( id span classsynType>VARCHAR/span>(span classsynConstant>32/span>) PRIMARY KEY span classsynStatement>COMMENT/span> span classsynSpecial>/span>span classsynConstant>財布のID/span>span classsynSpecial>/span>, money_code span classsynType>CHAR/span>(span classsynConstant>3/span>) span classsynStatement>COMMENT/span> span classsynSpecial>/span>span classsynConstant>通貨コード/span>span classsynSpecial>/span>, money_value span classsynType>FLOAT/span> span classsynStatement>COMMENT/span> span classsynSpecial>/span>span classsynConstant>いくらかを表す数値/span>span classsynSpecial>/span>);/pre>p>永続化する際にはWalletオブジェクトの各プロパティと、Moneyオブジェクトの各プロパティをそれぞれ対応するカラムに入れます。そして復元する際には、まずMoneyオブジェクトのプロパティを取り出して組み立て、次にWalletオブジェクトのプロパティを取り出して、先に作っておいたMoneyオブジェクトの参照を持たせれば、元通りのWalletオブジェクトが手に入ります。この辺りの具体的な実装方法は、DDD界隈ではb>a classkeyword hrefhttp://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA>リポジトリ/a>/b>の話題として扱われます。PofEAAの中でも様々なパターンが紹介されているので、気になる方はぜひ読んでみてください。/p>p>Embedded a classkeyword hrefhttp://d.hatena.ne.jp/keyword/Value>Value/a>のメリットは、エンティティの中にある小さな値オブジェクトのために個別のテーブルを作らなくて良くなる点にあります。また、エンティティを取得する際にテーブルのJOINが不要になるため、パフォーマンスにもいい影響を与えるでしょう。/p> a classentry-see-more hrefhttps://dnskimox.hateblo.jp/entry/2019/12/03/130024>続きを読む/a> /div> footer classentry-footer> div classentry-tags-wrapper> div classentry-tags> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>オブジェクト指向/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>ドメイン駆動設計/span> /a> /span> span classentry-tag> a hrefhttps://d.hatena.ne.jp/keyword/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9 classentry-tag-link> span classentry-tag-icon>#/span>span classentry-tag-label>データベース/span> /a> /span> /div>/div> p classentry-footer-section track-inview-by-gtm data-gtm-track-json{"area": "finish_reading"}> span classauthor vcard>span classfn data-load-nickname1 data-user-namednskimox >dnskimox/span>/span> span classentry-footer-time>a hrefhttps://dnskimox.hateblo.jp/entry/2019/12/03/130024>time data-relative datetime2019-12-03T04:00:24Z title2019-12-03T04:00:24Z classupdated>2019-12-03 13:00/time>/a>/span> span class entry-footer-subscribe data-test-blog-controlls-subscribe> a hrefhttps://blog.hatena.ne.jp/dnskimox/dnskimox.hateblo.jp/subscribe?utm_campaignsubscribe_blog&utm_mediumbutton&utm_sourceblogs_entry_footer> 読者になる /a> /span> /p> div classhatena-star-container data-hatena-star-container data-hatena-star-urlhttps://dnskimox.hateblo.jp/entry/2019/12/03/130024 data-hatena-star-titlePofEAAで考える値オブジェクトの永続化あれこれ data-hatena-star-variantprofile-icon data-hatena-star-profile-url-templatehttps://blog.hatena.ne.jp/{username}/ >/div> div classsocial-buttons> div classsocial-button-item> a hrefhttps://b.hatena.ne.jp/entry/s/dnskimox.hateblo.jp/entry/2019/12/03/130024 classhatena-bookmark-button data-hatena-bookmark-urlhttps://dnskimox.hateblo.jp/entry/2019/12/03/130024 data-hatena-bookmark-layoutvertical-balloon data-hatena-bookmark-langja titleこの記事をはてなブックマークに追加>img srchttps://b.st-hatena.com/images/entry-button/button-only.gif altこの記事をはてなブックマークに追加 width20 height20 styleborder: none; />/a> /div> div classsocial-button-item> div classfb-share-button data-layoutbox_count data-hrefhttps://dnskimox.hateblo.jp/entry/2019/12/03/130024>/div> /div> div classsocial-button-item> a classentry-share-button entry-share-button-twitter test-share-button-twitter hrefhttps://x.com/intent/tweet?hashtags%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&hashtags%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&hashtags%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9&textPofEAA%E3%81%A7%E8%80%83%E3%81%88%E3%82%8B%E5%80%A4%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E6%B0%B8%E7%B6%9A%E5%8C%96%E3%81%82%E3%82%8C%E3%81%93%E3%82%8C+-+%E7%94%B7%E7%88%B5%E3%81%8C%E6%9B%B8%E3%81%8F&urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2Fentry%2F2019%2F12%2F03%2F130024 titleX(Twitter)で投稿する >/a> /div> /div> div classgoogle-afc-image test-google-rectangle-ads> script> (valve window.valve || ).push(function(v) { v.displayDFPSlot(google_afc_user_container_7); }); /script> div idgoogle_afc_user_container_7 classgoogle-afc-user-container google_afc_blocklink2_5 google_afc_boder data-test-unit/4374287/blog_user_2nd>/div> a hrefhttp://blog.hatena.ne.jp/guide/pro classopen-pro-modal data-guide-pro-modal-ad-urlhttps://hatena.blog/guide/pro/modal/ad>広告を非表示にする/a> /div> div classcustomized-footer> /div> div classcomment-box js-comment-box> ul classcomment js-comment> li classread-more-comments styledisplay: none;>a>もっと読む/a>/li> /ul> a classleave-comment-title js-leave-comment-title>コメントを書く/a> /div> /footer> /div>/article> !-- rakuten_ad_target_end --> !-- google_ad_section_end --> div classpager autopagerize_insert_before> span classpager-next> a hrefhttps://dnskimox.hateblo.jp/?page1575345624 relnext>次のページ/a> /span> /div> /div> /div> aside idbox1> div idbox1-inner> /div>/aside> /div>!-- #wrapper --> aside idbox2> div idbox2-inner> div classhatena-module hatena-module-profile> div classhatena-module-title> プロフィール /div> div classhatena-module-body> a hrefhttps://dnskimox.hateblo.jp/about classprofile-icon-link> img srchttps://cdn.profile-image.st-hatena.com/users/dnskimox/profile.png?1542813015 altid:dnskimox classprofile-icon /> /a> span classid> a hrefhttps://dnskimox.hateblo.jp/about classhatena-id-link>span data-load-nickname1 data-user-namednskimox>id:dnskimox/span>/a> /span> div classprofile-description> p>男爵が色々書きます/p> /div> div classhatena-follow-button-box btn-subscribe js-hatena-follow-button-box > a href# classhatena-follow-button js-hatena-follow-button> span classsubscribing> span classforeground>読者です/span> span classbackground>読者をやめる/span> /span> span classunsubscribing data-track-nameprofile-widget-subscribe-button data-track-once> span classforeground>読者になる/span> span classbackground>読者になる/span> /span> /a> div classsubscription-count-box js-subscription-count-box> i>/i> u>/u> span classsubscription-count js-subscription-count> /span> /div>/div> div classprofile-about> a hrefhttps://dnskimox.hateblo.jp/about>このブログについて/a> /div> /div>/div> div classhatena-module hatena-module-recent-entries > div classhatena-module-title> a hrefhttps://dnskimox.hateblo.jp/archive> 最新記事 /a> /div> div classhatena-module-body> ul classrecent-entries hatena-urllist > li classurllist-item recent-entries-item> div classurllist-item-inner recent-entries-item-inner> a hrefhttps://dnskimox.hateblo.jp/entry/2022/01/30/163259 classurllist-title-link recent-entries-title-link urllist-title recent-entries-title>XP祭り2021でカンバンとJIRAの話をしました/a> /div> /li> li classurllist-item recent-entries-item> div classurllist-item-inner recent-entries-item-inner> a hrefhttps://dnskimox.hateblo.jp/entry/2021/09/17/071326 classurllist-title-link recent-entries-title-link urllist-title recent-entries-title>PHPerKaigi2021でユースケースシナリオについて話したことを半年後にふりかえる/a> /div> /li> li classurllist-item recent-entries-item> div classurllist-item-inner recent-entries-item-inner> a hrefhttps://dnskimox.hateblo.jp/entry/2020/12/19/184101 classurllist-title-link recent-entries-title-link urllist-title recent-entries-title>ユースケースシナリオを中心に据えたドメインモデルの育て方/a> /div> /li> li classurllist-item recent-entries-item> div classurllist-item-inner recent-entries-item-inner> a hrefhttps://dnskimox.hateblo.jp/entry/2020/10/26/101055 classurllist-title-link recent-entries-title-link urllist-title recent-entries-title>ScalaMatsuri 2020でPofEAAについて話しました/a> /div> /li> li classurllist-item recent-entries-item> div classurllist-item-inner recent-entries-item-inner> a hrefhttps://dnskimox.hateblo.jp/entry/2020/02/22/104342 classurllist-title-link recent-entries-title-link urllist-title recent-entries-title>Object-Oriented Conferenceで契約による設計について話してきました/a> /div> /li> /ul> /div>/div> div classhatena-module hatena-module-archive data-archive-typedefault data-archive-urlhttps://dnskimox.hateblo.jp/archive> div classhatena-module-title> a hrefhttps://dnskimox.hateblo.jp/archive>月別アーカイブ/a> /div> div classhatena-module-body> ul classhatena-urllist> li classarchive-module-year archive-module-year-hidden data-year2022> div classarchive-module-button> span classarchive-module-hide-button>▼/span> span classarchive-module-show-button>▶/span> /div> a hrefhttps://dnskimox.hateblo.jp/archive/2022 classarchive-module-year-title archive-module-year-2022> 2022 /a> ul classarchive-module-months> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2022/01 classarchive-module-month-title archive-module-month-2022-1> 2022 / 1 /a> /li> /ul> /li> li classarchive-module-year archive-module-year-hidden data-year2021> div classarchive-module-button> span classarchive-module-hide-button>▼/span> span classarchive-module-show-button>▶/span> /div> a hrefhttps://dnskimox.hateblo.jp/archive/2021 classarchive-module-year-title archive-module-year-2021> 2021 /a> ul classarchive-module-months> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2021/09 classarchive-module-month-title archive-module-month-2021-9> 2021 / 9 /a> /li> /ul> /li> li classarchive-module-year archive-module-year-hidden data-year2020> div classarchive-module-button> span classarchive-module-hide-button>▼/span> span classarchive-module-show-button>▶/span> /div> a hrefhttps://dnskimox.hateblo.jp/archive/2020 classarchive-module-year-title archive-module-year-2020> 2020 /a> ul classarchive-module-months> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2020/12 classarchive-module-month-title archive-module-month-2020-12> 2020 / 12 /a> /li> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2020/10 classarchive-module-month-title archive-module-month-2020-10> 2020 / 10 /a> /li> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2020/02 classarchive-module-month-title archive-module-month-2020-2> 2020 / 2 /a> /li> /ul> /li> li classarchive-module-year archive-module-year-hidden data-year2019> div classarchive-module-button> span classarchive-module-hide-button>▼/span> span classarchive-module-show-button>▶/span> /div> a hrefhttps://dnskimox.hateblo.jp/archive/2019 classarchive-module-year-title archive-module-year-2019> 2019 /a> ul classarchive-module-months> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2019/12 classarchive-module-month-title archive-module-month-2019-12> 2019 / 12 /a> /li> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2019/10 classarchive-module-month-title archive-module-month-2019-10> 2019 / 10 /a> /li> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2019/02 classarchive-module-month-title archive-module-month-2019-2> 2019 / 2 /a> /li> /ul> /li> li classarchive-module-year archive-module-year-hidden data-year2018> div classarchive-module-button> span classarchive-module-hide-button>▼/span> span classarchive-module-show-button>▶/span> /div> a hrefhttps://dnskimox.hateblo.jp/archive/2018 classarchive-module-year-title archive-module-year-2018> 2018 /a> ul classarchive-module-months> li classarchive-module-month> a hrefhttps://dnskimox.hateblo.jp/archive/2018/12 classarchive-module-month-title archive-module-month-2018-12> 2018 / 12 /a> /li> /ul> /li> /ul> /div>/div> div classhatena-module hatena-module-search-box> div classhatena-module-title> 検索 /div> div classhatena-module-body> form classsearch-form rolesearch actionhttps://dnskimox.hateblo.jp/search methodget> input typetext nameq classsearch-module-input value placeholder記事を検索 required> input typesubmit value検索 classsearch-module-button />/form> /div>/div> div classhatena-module hatena-module-links> div classhatena-module-title> リンク /div> div classhatena-module-body> ul classhatena-urllist> li> a hrefhttps://note.com/dnskimo/m/m3336bb444dc0>『オブジェクト指向入門』ガイド/a> /li> li> a hrefhttps://speakerdeck.com/dnskimo>過去の登壇資料/a> /li> /ul> /div>/div> /div>/aside> /div>/div> /div> /div> footer idfooter data-brandhatenablog> div idfooter-inner> address classfooter-address> a hrefhttps://dnskimox.hateblo.jp/> img srchttps://cdn.image.st-hatena.com/image/square/76ca21b81e9b25bc6d3af46f297d779690bbe8d4/backendimagemagick;height128;version1;width128/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fblog_custom_icon%2F133567865%2F1542813754773300 width16 height16 alt男爵が書く/> span classfooter-address-name>男爵が書く/span> /a> /address> p classservices> Powered by a hrefhttps://hatena.blog/>Hatena Blog/a> | a hrefhttps://blog.hatena.ne.jp/-/abuse_report?target_urlhttps%3A%2F%2Fdnskimox.hateblo.jp%2F classreport-abuse-link test-report-abuse-link target_blank>ブログを報告する/a> /p> /div>/footer> script async srchttps://s.hatena.ne.jp/js/widget/star.js>/script> script> if (typeof window.Hatena undefined) { window.Hatena {}; } if (!Hatena.hasOwnProperty(Star)) { Hatena.Star { VERSION: 2, }; } /script> div idfb-root>/div>script>(function(d, s, id) { var js, fjs d.getElementsByTagName(s)0; if (d.getElementById(id)) return; js d.createElement(s); js.id id; js.src //connect.facebook.net/ja_JP/sdk.js#xfbml1&appId719729204785177&versionv17.0; fjs.parentNode.insertBefore(js, fjs);}(document, script, facebook-jssdk));/script> div classquote-box> div classtooltip-quote tooltip-quote-stock> i classblogicon-quote title引用をストック>/i> /div> div classtooltip-quote tooltip-quote-tweet js-tooltip-quote-tweet> a classjs-tweet-quote target_blank data-track-namequote-tweet data-track-once> img srchttps://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version290ad662750024ea17472b9c1b7e66 title引用して投稿する > /a> /div>/div>div classquote-stock-panel idquote-stock-message-box styleposition: absolute; z-index: 3000> div classmessage-box idquote-stock-succeeded-message styledisplay: none> p>引用をストックしました/p> button classbtn btn-primary idquote-stock-show-editor-button data-track-namecuration-quote-edit-button>ストック一覧を見る/button> button classbtn quote-stock-close-message-button>閉じる/button> /div> div classmessage-box idquote-login-required-message styledisplay: none> p>引用するにはまずログインしてください/p> button classbtn btn-primary idquote-login-button>ログイン/button> button classbtn quote-stock-close-message-button>閉じる/button> /div> div classerror-box idquote-stock-failed-message styledisplay: none> p>引用をストックできませんでした。再度お試しください/p> button classbtn quote-stock-close-message-button>閉じる/button> /div> div classerror-box idunstockable-quote-message-box styledisplay: none; position: absolute; z-index: 3000;> p>限定公開記事のため引用できません。/p> /div>/div>script typex-underscore-template idjs-requote-button-template> div classrequote-button js-requote-button> button classrequote-button-btn tipsy-top title引用する>i classblogicon-quote>/i>/button> /div>/script> div idhidden-subscribe-button styledisplay: none;> div classhatena-follow-button-box btn-subscribe js-hatena-follow-button-box > a href# classhatena-follow-button js-hatena-follow-button> span classsubscribing> span classforeground>読者です/span> span classbackground>読者をやめる/span> /span> span classunsubscribing data-track-nameprofile-widget-subscribe-button data-track-once> span classforeground>読者になる/span> span classbackground>読者になる/span> /span> /a> div classsubscription-count-box js-subscription-count-box> i>/i> u>/u> span classsubscription-count js-subscription-count> /span> /div>/div> /div> script async srchttps://platform.twitter.com/widgets.js charsetutf-8>/script>script srchttps://b.st-hatena.com/js/bookmark_button.js charsetutf-8 asyncasync>/script>script typetext/javascript srchttps://cdn.blog.st-hatena.com/js/external/jquery.min.js?v1.12.4&version290ad662750024ea17472b9c1b7e66>/script>script srchttps://cdn.blog.st-hatena.com/js/texts-ja.js?version290ad662750024ea17472b9c1b7e66>/script> script idvendors-js data-envproduction srchttps://cdn.blog.st-hatena.com/js/vendors.js?version290ad662750024ea17472b9c1b7e66 crossoriginanonymous>/script>script idhatenablog-js data-envproduction srchttps://cdn.blog.st-hatena.com/js/hatenablog.js?version290ad662750024ea17472b9c1b7e66 crossoriginanonymous data-page-idindex>/script> script>Hatena.Diary.GlobalHeader.init()/script> script idvalve-dmp data-serviceblog srchttps://cdn.pool.st-hatena.com/valve/dmp.js data-test-iddmpjs async>/script> /body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]