CINXE.COM

HazelcastでCache(JCache)の設定をする - CLOVER🍀

<!DOCTYPE html> <html lang="ja" data-admin-domain="//blog.hatena.ne.jp" data-admin-origin="https://blog.hatena.ne.jp" data-author="Kazuhira" data-avail-langs="ja en" data-blog="kazuhira-r.hatenablog.com" data-blog-host="kazuhira-r.hatenablog.com" data-blog-is-public="1" data-blog-name="CLOVER🍀" data-blog-owner="Kazuhira" data-blog-show-ads="1" data-blog-show-sleeping-ads="" data-blog-uri="https://kazuhira-r.hatenablog.com/" data-blog-uuid="10257846132617921657" data-blogs-uri-base="https://kazuhira-r.hatenablog.com" data-brand="hatenablog" data-data-layer="{&quot;hatenablog&quot;:{&quot;admin&quot;:{},&quot;analytics&quot;:{&quot;brand_property_id&quot;:&quot;&quot;,&quot;measurement_id&quot;:&quot;G-VZ4P54MK8T&quot;,&quot;non_sampling_property_id&quot;:&quot;&quot;,&quot;property_id&quot;:&quot;&quot;,&quot;separated_property_id&quot;:&quot;UA-29716941-26&quot;},&quot;blog&quot;:{&quot;blog_id&quot;:&quot;10257846132617921657&quot;,&quot;content_seems_japanese&quot;:&quot;true&quot;,&quot;disable_ads&quot;:&quot;&quot;,&quot;enable_ads&quot;:&quot;true&quot;,&quot;enable_keyword_link&quot;:&quot;true&quot;,&quot;entry_show_footer_related_entries&quot;:&quot;true&quot;,&quot;force_pc_view&quot;:&quot;false&quot;,&quot;is_public&quot;:&quot;true&quot;,&quot;is_responsive_view&quot;:&quot;false&quot;,&quot;is_sleeping&quot;:&quot;false&quot;,&quot;lang&quot;:&quot;ja&quot;,&quot;name&quot;:&quot;CLOVER\ud83c\udf40&quot;,&quot;owner_name&quot;:&quot;Kazuhira&quot;,&quot;uri&quot;:&quot;https://kazuhira-r.hatenablog.com/&quot;},&quot;brand&quot;:&quot;hatenablog&quot;,&quot;page_id&quot;:&quot;entry&quot;,&quot;permalink_entry&quot;:{&quot;author_name&quot;:&quot;Kazuhira&quot;,&quot;categories&quot;:&quot;Hazelcast\tJCache&quot;,&quot;character_count&quot;:11917,&quot;date&quot;:&quot;2015-02-28&quot;,&quot;entry_id&quot;:&quot;10257846132620567460&quot;,&quot;first_category&quot;:&quot;Hazelcast&quot;,&quot;hour&quot;:&quot;13&quot;,&quot;title&quot;:&quot;Hazelcast\u3067Cache\uff08JCache\uff09\u306e\u8a2d\u5b9a\u3092\u3059\u308b&quot;,&quot;uri&quot;:&quot;https://kazuhira-r.hatenablog.com/entry/20150228/1425098946&quot;},&quot;pro&quot;:&quot;free&quot;,&quot;router_type&quot;:&quot;blogs&quot;}}" data-device="pc" data-dont-recommend-pro="false" data-global-domain="https://hatena.blog" data-globalheader-color="b" data-globalheader-type="pc" data-has-touch-view="1" data-help-url="https://help.hatenablog.com" data-page="entry" data-parts-domain="https://hatenablog-parts.com" data-plus-available="" data-pro="false" data-router-type="blogs" data-sentry-dsn="https://03a33e4781a24cf2885099fed222b56d@sentry.io/1195218" data-sentry-environment="production" data-sentry-sample-rate="0.1" data-static-domain="https://cdn.blog.st-hatena.com" data-version="1ca111bc9f0112690b12e1842a1ce8" data-initial-state="{}" > <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#"> <meta name="robots" content="max-image-preview:large" /> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=7; IE=9; IE=10; IE=11" /> <title>HazelcastでCache(JCache)の設定をする - CLOVER🍀</title> <link rel="canonical" href="https://kazuhira-r.hatenablog.com/entry/20150228/1425098946"/> <meta itemprop="name" content="HazelcastでCache(JCache)の設定をする - CLOVER🍀"/> <meta itemprop="image" content="https://ogimage.blog.st-hatena.com/10257846132617921657/10257846132620567460/1536086482"/> <meta property="og:title" content="HazelcastでCache(JCache)の設定をする - CLOVER🍀"/> <meta property="og:type" content="article"/> <meta property="og:url" content="https://kazuhira-r.hatenablog.com/entry/20150228/1425098946"/> <meta property="og:image" content="https://ogimage.blog.st-hatena.com/10257846132617921657/10257846132620567460/1536086482"/> <meta property="og:image:alt" content="HazelcastでCache(JCache)の設定をする - CLOVER🍀"/> <meta property="og:description" content="Hazelcast 3.4から、設定ファイルでCacheの設定ができるようになりました。これにより、JCacheの設定がJCacheのMutableConfigurationではなく、Hazelcastの設定ファイルで定義できるようになります。JCache Configuration http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#jcache-configuration設定できるのは、このあたりです。 定義するCacheの名前 キーのClass名 値のClass名 JMX統計…" /> <meta property="og:site_name" content="CLOVER🍀"/> <meta property="article:published_time" content="2015-02-28T04:49:06Z" /> <meta property="article:tag" content="Hazelcast" /> <meta property="article:tag" content="JCache" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://ogimage.blog.st-hatena.com/10257846132617921657/10257846132620567460/1536086482" /> <meta name="twitter:title" content="HazelcastでCache(JCache)の設定をする - CLOVER🍀" /> <meta name="twitter:description" content="Hazelcast 3.4から、設定ファイルでCacheの設定ができるようになりました。これにより、JCacheの設定がJCacheのMutableConfigurationではなく、Hazelcastの設定ファイルで定義できるようになります。JCache Configuration http://docs.hazel…" /> <meta name="twitter:app:name:iphone" content="はてなブログアプリ" /> <meta name="twitter:app:id:iphone" content="583299321" /> <meta name="twitter:app:url:iphone" content="hatenablog:///open?uri=https%3A%2F%2Fkazuhira-r.hatenablog.com%2Fentry%2F20150228%2F1425098946" /> <meta name="twitter:site" content="@kazuhira_r" /> <meta name="description" content="Hazelcast 3.4から、設定ファイルでCacheの設定ができるようになりました。これにより、JCacheの設定がJCacheのMutableConfigurationではなく、Hazelcastの設定ファイルで定義できるようになります。JCache Configuration http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#jcache-configuration設定できるのは、このあたりです。 定義するCacheの名前 キーのClass名 値のClass名 JMX統計…" /> <script id="embed-gtm-data-layer-loader" data-data-layer-page-specific="{&quot;hatenablog&quot;:{&quot;blogs_permalink&quot;:{&quot;has_related_entries_with_elasticsearch&quot;:&quot;true&quot;,&quot;is_blog_sleeping&quot;:&quot;false&quot;,&quot;entry_afc_issued&quot;:&quot;false&quot;,&quot;blog_afc_issued&quot;:&quot;false&quot;,&quot;is_author_pro&quot;:&quot;false&quot;}}}" > (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(variables[i]); } })(); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://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 rel="shortcut icon" href="https://kazuhira-r.hatenablog.com/icon/favicon"> <link rel="apple-touch-icon" href="https://kazuhira-r.hatenablog.com/icon/touch"> <link rel="icon" sizes="192x192" href="https://kazuhira-r.hatenablog.com/icon/link"> <link rel="alternate" type="application/atom+xml" title="Atom" href="https://kazuhira-r.hatenablog.com/feed"/> <link rel="alternate" type="application/rss+xml" title="RSS2.0" href="https://kazuhira-r.hatenablog.com/rss"/> <link rel="alternate" type="application/json+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fkazuhira-r.hatenablog.com%2Fentry%2F20150228%2F1425098946&amp;format=json" title="oEmbed Profile of HazelcastでCache(JCache)の設定をする"/> <link rel="alternate" type="text/xml+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fkazuhira-r.hatenablog.com%2Fentry%2F20150228%2F1425098946&amp;format=xml" title="oEmbed Profile of HazelcastでCache(JCache)の設定をする"/> <link rel="author" href="http://www.hatena.ne.jp/Kazuhira/"> <link rel="stylesheet" type="text/css" href="https://cdn.blog.st-hatena.com/css/blog.css?version=1ca111bc9f0112690b12e1842a1ce8"/> <link rel="stylesheet" type="text/css" href="https://usercss.blog.st-hatena.com/blog_style/10257846132617921657/5928031aba258eacad1db5cbcd5d9221b178f564"/> <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 src="https://cdn.pool.st-hatena.com/valve/valve.js" async></script> <script id="test-valve-definition"> var valve = window.valve || []; valve.push(function(v) { v.config({ service: 'blog', content: { result: 'adtrust', documentIds: ["blog:entry:10257846132620567460"] } }); v.defineDFPSlot({"lazy":1,"sizes":{"mappings":[[[320,568],[[336,280],[300,250],"fluid"]],[[0,0],[[300,250]]]]},"slotId":"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_0","unit":"/4374287/blog_user"}); v.sealDFPSlots(); }); </script> <script type="application/ld+json">{"@context":"http://schema.org","@type":"Article","dateModified":"2018-09-05T03:41:22+09:00","datePublished":"2015-02-28T13:49:06+09:00","headline":"HazelcastでCache(JCache)の設定をする","image":["https://cdn.blog.st-hatena.com/images/theme/og-image-1500.png"]}</script> <script type="module"> import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11.2.1/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true }); </script> </head> <body class="page-entry category-Hazelcast category-JCache globalheader-ng-enabled"> <div id="globalheader-container" data-brand="hatenablog" > <iframe id="globalheader" height="37" frameborder="0" allowTransparency="true"></iframe> </div> <nav class=" blog-controlls "> <div class="blog-controlls-blog-icon"> <a href="https://kazuhira-r.hatenablog.com/"> <img src="https://cdn.blog.st-hatena.com/images/admin/blog-icon-noimage.png" alt="CLOVER🍀"/> </a> </div> <div class="blog-controlls-title"> <a href="https://kazuhira-r.hatenablog.com/">CLOVER🍀</a> </div> <a href="https://blog.hatena.ne.jp/Kazuhira/kazuhira-r.hatenablog.com/subscribe?utm_source=blogs_topright_button&amp;utm_campaign=subscribe_blog&amp;utm_medium=button" class="blog-controlls-subscribe-btn test-blog-header-controlls-subscribe"> 読者になる </a> </nav> <div id="container"> <div id="container-inner"> <header id="blog-title" data-brand="hatenablog"> <div id="blog-title-inner" > <div id="blog-title-content"> <h1 id="title"><a href="https://kazuhira-r.hatenablog.com/">CLOVER🍀</a></h1> <h2 id="blog-description">That was when it all began.</h2> </div> </div> </header> <div id="content" class="hfeed" > <div id="content-inner"> <div id="wrapper"> <div id="main"> <div id="main-inner"> <!-- google_ad_section_start --> <!-- rakuten_ad_target_begin --> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-12000 words-600 mode-hatena entry-odd" id="entry-10257846132620567460" data-keyword-campaign="" data-uuid="10257846132620567460" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date first"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/02/28" rel="nofollow"> <time datetime="2015-02-28T04:49:06Z" title="2015-02-28T04:49:06Z"> <span class="date-year">2015</span><span class="hyphen">-</span><span class="date-month">02</span><span class="hyphen">-</span><span class="date-day">28</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://kazuhira-r.hatenablog.com/entry/20150228/1425098946" class="entry-title-link bookmark">HazelcastでCache(JCache)の設定をする</a> </h1> <div class="entry-categories categories"> <a href="https://kazuhira-r.hatenablog.com/archive/category/Hazelcast" class="entry-category-link category-Hazelcast">Hazelcast</a> <a href="https://kazuhira-r.hatenablog.com/archive/category/JCache" class="entry-category-link category-JCache">JCache</a> </div> </header> <div class="entry-content hatenablog-entry"> <p>Hazelcast 3.4から、設定ファイルでCacheの設定ができるようになりました。これにより、JCacheの設定がJCacheのMutableConfigurationではなく、Hazelcastの設定ファイルで定義できるようになります。</p><p>JCache Configuration<br /> <a href="http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#jcache-configuration">http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#jcache-configuration</a></p><p>設定できるのは、このあたりです。</p> <ul> <li>定義するCacheの名前</li> <li>キーのClass名</li> <li>値のClass名</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/JMX">JMX</a>統計情報収集、提供の有効/無効</li> <li>Read-Through、Write-Throughの有効/無効</li> <li>CacheLoader、CacheWriter、ExpirePolicyに対するファクトリの設定</li> <li>EntryListenerの設定</li> </ul><p>また、HazelcastのCacheの設定として、以下も可能なようです。</p><p>ICache Configuration<br /> <a href="http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#icache-configuration">http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#icache-configuration</a></p><p>こっちは、「I」Cacheですね。バックアップ数や、メモリ内でのエントリの持ち方(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%A2%A5%E9%A5%A4%A5%BA">シリアライズ</a> or 参照)、Evictionを設定します。</p><p>で、これらの一部をHazelcast 3.4で軽く試そうと思っていたのですが、バグがあったりしてうまく動かなかったので、最近リリースされた3.4.1まで待っていました。</p><p>まあ、これでも不思議なところはありますが。</p><p>では、使っていってみましょう。</p> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Maven">Maven</a>依存関係</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Maven">Maven</a>依存関係の定義で必要なのは、JCacheとHazelcast自身ですね。</p> <pre class="code lang-xml" data-lang="xml" data-unlink> <span class="synIdentifier">&lt;dependency&gt;</span> <span class="synIdentifier">&lt;groupId&gt;</span>javax.cache<span class="synIdentifier">&lt;/groupId&gt;</span> <span class="synIdentifier">&lt;artifactId&gt;</span>cache-api<span class="synIdentifier">&lt;/artifactId&gt;</span> <span class="synIdentifier">&lt;version&gt;</span>1.0.0<span class="synIdentifier">&lt;/version&gt;</span> <span class="synIdentifier">&lt;/dependency&gt;</span> <span class="synIdentifier">&lt;dependency&gt;</span> <span class="synIdentifier">&lt;groupId&gt;</span>com.hazelcast<span class="synIdentifier">&lt;/groupId&gt;</span> <span class="synIdentifier">&lt;artifactId&gt;</span>hazelcast<span class="synIdentifier">&lt;/artifactId&gt;</span> <span class="synIdentifier">&lt;version&gt;</span>3.4.1<span class="synIdentifier">&lt;/version&gt;</span> <span class="synIdentifier">&lt;/dependency&gt;</span> </pre><p>今回は、Server Providerを使用します。</p> </div> <div class="section"> <h4>Hazelcastの設定ファイルで、JCacheの設定をする</h4> <div class="section"> <h5>設定ファイルの用意</h5> <p>それでは、Hazelcastの設定ファイルを作成します。<br /> src/test/resources/hazelcast.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a></p> <pre class="code lang-xml" data-lang="xml" data-unlink><span class="synComment">&lt;?</span><span class="synType">xml version</span>=<span class="synConstant">&quot;1.0&quot;</span><span class="synType"> encoding</span>=<span class="synConstant">&quot;UTF-8&quot;</span><span class="synComment">?&gt;</span> <span class="synIdentifier">&lt;hazelcast </span><span class="synType">xsi</span><span class="synComment">:</span><span class="synType">schemaLocation</span>=<span class="synConstant">&quot;http://www.hazelcast.com/schema/config hazelcast-config-3.4.xsd&quot;</span> <span class="synIdentifier"> </span><span class="synType">xmlns</span>=<span class="synConstant">&quot;http://www.hazelcast.com/schema/config&quot;</span> <span class="synIdentifier"> </span><span class="synType">xmlns</span><span class="synComment">:</span><span class="synType">xsi</span>=<span class="synConstant">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;group&gt;</span> <span class="synIdentifier">&lt;name&gt;</span>my-cluster<span class="synIdentifier">&lt;/name&gt;</span> <span class="synIdentifier">&lt;password&gt;</span>my-cluster-password<span class="synIdentifier">&lt;/password&gt;</span> <span class="synIdentifier">&lt;/group&gt;</span> <span class="synIdentifier">&lt;network&gt;</span> <span class="synIdentifier">&lt;port </span><span class="synType">auto-increment</span>=<span class="synConstant">&quot;true&quot;</span><span class="synIdentifier"> </span><span class="synType">port-count</span>=<span class="synConstant">&quot;100&quot;</span><span class="synIdentifier">&gt;</span>5701<span class="synIdentifier">&lt;/port&gt;</span> <span class="synIdentifier">&lt;join&gt;</span> <span class="synIdentifier">&lt;multicast </span><span class="synType">enabled</span>=<span class="synConstant">&quot;true&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;multicast-group&gt;</span>224.2.2.3<span class="synIdentifier">&lt;/multicast-group&gt;</span> <span class="synIdentifier">&lt;multicast-port&gt;</span>54327<span class="synIdentifier">&lt;/multicast-port&gt;</span> <span class="synIdentifier">&lt;/multicast&gt;</span> <span class="synIdentifier">&lt;tcp-ip </span><span class="synType">enabled</span>=<span class="synConstant">&quot;false&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/join&gt;</span> <span class="synIdentifier">&lt;/network&gt;</span> <span class="synIdentifier">&lt;cache </span><span class="synType">name</span>=<span class="synConstant">&quot;simple-cache&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;key-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;value-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/cache&gt;</span> <span class="synIdentifier">&lt;cache </span><span class="synType">name</span>=<span class="synConstant">&quot;with-eviction-cache&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;key-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;value-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;eviction </span><span class="synType">size</span>=<span class="synConstant">&quot;5&quot;</span><span class="synIdentifier"> </span><span class="synType">max-size-policy</span>=<span class="synConstant">&quot;ENTRY_COUNT&quot;</span><span class="synIdentifier"> </span><span class="synType">eviction-policy</span>=<span class="synConstant">&quot;LRU&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/cache&gt;</span> <span class="synIdentifier">&lt;cache </span><span class="synType">name</span>=<span class="synConstant">&quot;with-expire-cache&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;key-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;value-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;eviction </span><span class="synType">size</span>=<span class="synConstant">&quot;5&quot;</span><span class="synIdentifier"> </span><span class="synType">max-size-policy</span>=<span class="synConstant">&quot;ENTRY_COUNT&quot;</span><span class="synIdentifier"> </span><span class="synType">eviction-policy</span>=<span class="synConstant">&quot;LRU&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;expiry-policy-factory </span><span class="synType">class-name</span>=<span class="synConstant">&quot;org.littlewings.hazelcast.jcache.MyExpiryFactory&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/cache&gt;</span> <span class="synIdentifier">&lt;/hazelcast&gt;</span> </pre><p>簡単ですが、キーと値のClassだけを定義したCache、Evictionの設定をしたCache、EvictionとExpireの設定をしたCacheの3つを用意しました。</p><p>注)<br /> max-size-policyはドキュメントの<a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a>例はENTRY-COUNTですが、正しいのはENTRY_COUNTです。Pull Req送ったりしたり、開発者に指摘して<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a> master上は直っているので、そのうち反映されるでしょう。</p><p>このファイルですが、「hazelcast.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>」という名前でクラスパス上にあることが重要です(ClientProviderの場合は、hazelcast-client.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>)。要はHazelcastの設定ファイルのデフォルトの名前なのですが。</p><p>なお、ExpiryFactoryは自分で実装しました。このようなものを用意しています。<br /> src/main/<a class="keyword" href="http://d.hatena.ne.jp/keyword/java">java</a>/org/littlewings/hazelcast/jcache/MyExpiryFactory.<a class="keyword" href="http://d.hatena.ne.jp/keyword/java">java</a></p> <pre class="code lang-java" data-lang="java" data-unlink><span class="synPreProc">package</span> org.littlewings.hazelcast.jcache; <span class="synPreProc">import</span> java.util.concurrent.TimeUnit; <span class="synPreProc">import</span> javax.cache.configuration.Factory; <span class="synPreProc">import</span> javax.cache.expiry.Duration; <span class="synPreProc">import</span> javax.cache.expiry.ExpiryPolicy; <span class="synPreProc">import</span> javax.cache.expiry.TouchedExpiryPolicy; <span class="synType">public</span> <span class="synType">class</span> MyExpiryFactory <span class="synType">implements</span> Factory&lt;ExpiryPolicy&gt; { <span class="synPreProc">@Override</span> <span class="synType">public</span> ExpiryPolicy create() { <span class="synStatement">return</span> <span class="synStatement">new</span> TouchedExpiryPolicy(<span class="synStatement">new</span> Duration(TimeUnit.SECONDS, <span class="synConstant">5</span>)); } } </pre><p>JCacheのFactoryを実装したクラスで、ここではExpiryPolicyを返すようにしています。PolicyはTouched(Cacheへのアクセス、エントリの更新で有効期限が延びる)、有効期限は5秒としました。</p> </div> <div class="section"> <h5>使ってみる</h5> <p>それでは、テストコードを書いて試していってみましょう。ここからのコードは、以下のimport文が書かれているものとします。</p> <pre class="code lang-java" data-lang="java" data-unlink><span class="synPreProc">import static</span> org.assertj.core.api.Assertions.*; <span class="synPreProc">import</span> java.util.concurrent.TimeUnit; <span class="synPreProc">import</span> java.util.stream.IntStream; <span class="synPreProc">import</span> javax.cache.Cache; <span class="synPreProc">import</span> javax.cache.CacheManager; <span class="synPreProc">import</span> javax.cache.Caching; <span class="synPreProc">import</span> javax.cache.spi.CachingProvider; <span class="synPreProc">import</span> org.junit.Test; </pre><p>キーと値のClassクラスを定義したCacheの利用。</p> <pre class="code lang-java" data-lang="java" data-unlink> CachingProvider provider = Caching.getCachingProvider(); CacheManager manager = provider.getCacheManager(); Cache&lt;String, String&gt; cache = manager.getCache(<span class="synConstant">&quot;simple-cache&quot;</span>, String.<span class="synType">class</span>, String.<span class="synType">class</span>); IntStream.rangeClosed(<span class="synConstant">1</span>, <span class="synConstant">5</span>).forEach(i<span class="synError"> -&gt;</span> cache.put(<span class="synConstant">&quot;key&quot;</span> + i, <span class="synConstant">&quot;value&quot;</span> + i)); assertThat(cache.get(<span class="synConstant">&quot;key1&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value1&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key5&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value5&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key10&quot;</span>)) .isNull(); cache.close(); manager.close(); provider.close(); </pre><p>通常、JCacheを使う時はMutableConfigurationを使ってCacheManager#createCacheしてCacheを定義するのですが、ここでは事前定義済みのCacheを取得できています。</p> <pre class="code lang-java" data-lang="java" data-unlink> Cache&lt;String, String&gt; cache = manager.getCache(<span class="synConstant">&quot;simple-cache&quot;</span>, String.<span class="synType">class</span>, String.<span class="synType">class</span>); </pre><p>もしも定義できていなかった場合は、ここでの戻り値はnullになります。キーと値の型を特定しなかったりすると、例外が飛ぶようですが…。</p><p>Evictionの確認。</p> <pre class="code lang-java" data-lang="java" data-unlink> CachingProvider provider = Caching.getCachingProvider(); CacheManager manager = provider.getCacheManager(); Cache&lt;String, String&gt; cache = manager.getCache(<span class="synConstant">&quot;with-eviction-cache&quot;</span>, String.<span class="synType">class</span>, String.<span class="synType">class</span>); com.hazelcast.cache.ICache&lt;String, String&gt; icache = cache.unwrap(com.hazelcast.cache.ICache.<span class="synType">class</span>); com.hazelcast.config.CacheConfig config = icache.getConfiguration(com.hazelcast.config.CacheConfig.<span class="synType">class</span>); assertThat(config.getEvictionConfig().getSize()) .isEqualTo(<span class="synConstant">5</span>); <span class="synComment">// right</span> IntStream.rangeClosed(<span class="synConstant">1</span>, <span class="synConstant">30</span>).forEach(i<span class="synError"> -&gt;</span> cache.put(<span class="synConstant">&quot;key&quot;</span> + i, <span class="synConstant">&quot;value&quot;</span> + i)); <span class="synType">int</span> count = <span class="synConstant">0</span>; <span class="synStatement">for</span> (Cache.Entry&lt;String, String&gt; entry : cache) { count++; } assertThat(count) .isGreaterThan(<span class="synConstant">25</span>); <span class="synComment">// much larger than ENTRY_COUNT??</span> cache.close(); manager.close(); provider.close(); </pre><p>なんか、普通に要<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%C7%BF%F4">素数</a>がオー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>していますね…。なんか使い方悪いのかなぁ…。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B7%A4%AD%A4%A4%C3%CD">しきい値</a>から多少ブレるくらいだったら、そんなものかなぁと思うのですが。これはちょっとまた後で。</p><p>続いて、Expireの確認。</p> <pre class="code lang-java" data-lang="java" data-unlink> CachingProvider provider = Caching.getCachingProvider(); CacheManager manager = provider.getCacheManager(); Cache&lt;String, String&gt; cache = manager.getCache(<span class="synConstant">&quot;with-expire-cache&quot;</span>, String.<span class="synType">class</span>, String.<span class="synType">class</span>); IntStream.rangeClosed(<span class="synConstant">1</span>, <span class="synConstant">5</span>).forEach(i<span class="synError"> -&gt;</span> cache.put(<span class="synConstant">&quot;key&quot;</span> + i, <span class="synConstant">&quot;value&quot;</span> + i)); TimeUnit.SECONDS.sleep(<span class="synConstant">3</span>); cache.get(<span class="synConstant">&quot;key1&quot;</span>); cache.get(<span class="synConstant">&quot;key3&quot;</span>); TimeUnit.SECONDS.sleep(<span class="synConstant">3</span>); assertThat(cache.get(<span class="synConstant">&quot;key1&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value1&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key3&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value3&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key2&quot;</span>)) .isNull(); assertThat(cache.get(<span class="synConstant">&quot;key4&quot;</span>)) .isNull(); TimeUnit.SECONDS.sleep(<span class="synConstant">6</span>); assertThat(cache.get(<span class="synConstant">&quot;key1&quot;</span>)) .isNull(); assertThat(cache.get(<span class="synConstant">&quot;key3&quot;</span>)) .isNull(); cache.close(); manager.close(); provider.close(); </pre><p>こちらは、違和感なく使えてそうです。</p><p>で、先ほどのEvictionなのですが、ここを見る限りExpireと組み合わせた方がわかりやすい動きするのかなぁと思って試してみたのですが。</p><p>JCache Eviction<br /> <a href="http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#jcache-eviction">http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#jcache-eviction</a></p><p>Expireと組み合わせて確認。</p> <pre class="code lang-java" data-lang="java" data-unlink> CachingProvider provider = Caching.getCachingProvider(); CacheManager manager = provider.getCacheManager(); Cache&lt;String, String&gt; cache = manager.getCache(<span class="synConstant">&quot;with-expire-cache&quot;</span>, String.<span class="synType">class</span>, String.<span class="synType">class</span>); IntStream.rangeClosed(<span class="synConstant">1</span>, <span class="synConstant">30</span>).forEach(i<span class="synError"> -&gt;</span> cache.put(<span class="synConstant">&quot;key&quot;</span> + i, <span class="synConstant">&quot;value&quot;</span> + i)); TimeUnit.SECONDS.sleep(<span class="synConstant">3</span>); cache.get(<span class="synConstant">&quot;key1&quot;</span>); cache.get(<span class="synConstant">&quot;key3&quot;</span>); cache.get(<span class="synConstant">&quot;key5&quot;</span>); cache.get(<span class="synConstant">&quot;key10&quot;</span>); cache.get(<span class="synConstant">&quot;key13&quot;</span>); cache.get(<span class="synConstant">&quot;key15&quot;</span>); cache.get(<span class="synConstant">&quot;key20&quot;</span>); cache.get(<span class="synConstant">&quot;key25&quot;</span>); TimeUnit.SECONDS.sleep(<span class="synConstant">3</span>); <span class="synType">int</span> count = <span class="synConstant">0</span>; <span class="synStatement">for</span> (Cache.Entry&lt;String, String&gt; entry : cache) { count++; } assertThat(count) .isLessThanOrEqualTo(<span class="synConstant">8</span>); cache.close(); manager.close(); provider.close(); </pre><p>そんなに動きが変わった気がしません…。どうなのだろう??</p> </div> </div> <div class="section"> <h4>「hazelcast.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>」以外の名前で設定ファイルを指定する</h4> <p>上記までのコードでは、デフォルトのHazelcastの設定ファイルを読むため、「hazelcast.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>」(ClientProviderの場合は「hazelcast-client.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>」)の設定ファイル名がどこにも登場しませんが、これを設定することもできるようです。</p><p>Scopes and Namespaces<br /> <a href="http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#scopes-and-namespaces">http://docs.hazelcast.org/docs/3.4/manual/html-single/hazelcast-documentation.html#scopes-and-namespaces</a></p><p>3.3.1の時から、ホントにだいぶ変わりましたねぇ。</p><p>Hazelcastの設定ファイル名をデフォルト以外の名前にするには、<a class="keyword" href="http://d.hatena.ne.jp/keyword/java">java</a>.util.Propertiesを使うようです。</p><p>今度は、先ほどと同じ設定ファイルを、「my-hazelcast.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>」という名前で作ってみます。<br /> src/test/resources/my-hazelcast.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a></p> <pre class="code lang-xml" data-lang="xml" data-unlink><span class="synComment">&lt;?</span><span class="synType">xml version</span>=<span class="synConstant">&quot;1.0&quot;</span><span class="synType"> encoding</span>=<span class="synConstant">&quot;UTF-8&quot;</span><span class="synComment">?&gt;</span> <span class="synIdentifier">&lt;hazelcast </span><span class="synType">xsi</span><span class="synComment">:</span><span class="synType">schemaLocation</span>=<span class="synConstant">&quot;http://www.hazelcast.com/schema/config hazelcast-config-3.4.xsd&quot;</span> <span class="synIdentifier"> </span><span class="synType">xmlns</span>=<span class="synConstant">&quot;http://www.hazelcast.com/schema/config&quot;</span> <span class="synIdentifier"> </span><span class="synType">xmlns</span><span class="synComment">:</span><span class="synType">xsi</span>=<span class="synConstant">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;group&gt;</span> <span class="synIdentifier">&lt;name&gt;</span>my-cluster<span class="synIdentifier">&lt;/name&gt;</span> <span class="synIdentifier">&lt;password&gt;</span>my-cluster-password<span class="synIdentifier">&lt;/password&gt;</span> <span class="synIdentifier">&lt;/group&gt;</span> <span class="synIdentifier">&lt;network&gt;</span> <span class="synIdentifier">&lt;port </span><span class="synType">auto-increment</span>=<span class="synConstant">&quot;true&quot;</span><span class="synIdentifier"> </span><span class="synType">port-count</span>=<span class="synConstant">&quot;100&quot;</span><span class="synIdentifier">&gt;</span>5701<span class="synIdentifier">&lt;/port&gt;</span> <span class="synIdentifier">&lt;join&gt;</span> <span class="synIdentifier">&lt;multicast </span><span class="synType">enabled</span>=<span class="synConstant">&quot;true&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;multicast-group&gt;</span>224.2.2.3<span class="synIdentifier">&lt;/multicast-group&gt;</span> <span class="synIdentifier">&lt;multicast-port&gt;</span>54327<span class="synIdentifier">&lt;/multicast-port&gt;</span> <span class="synIdentifier">&lt;/multicast&gt;</span> <span class="synIdentifier">&lt;tcp-ip </span><span class="synType">enabled</span>=<span class="synConstant">&quot;false&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/join&gt;</span> <span class="synIdentifier">&lt;/network&gt;</span> <span class="synIdentifier">&lt;cache </span><span class="synType">name</span>=<span class="synConstant">&quot;simple-cache&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;key-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;value-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/cache&gt;</span> <span class="synIdentifier">&lt;cache </span><span class="synType">name</span>=<span class="synConstant">&quot;with-eviction-cache&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;key-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;value-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;eviction </span><span class="synType">size</span>=<span class="synConstant">&quot;5&quot;</span><span class="synIdentifier"> </span><span class="synType">max-size-policy</span>=<span class="synConstant">&quot;ENTRY_COUNT&quot;</span><span class="synIdentifier"> </span><span class="synType">eviction-policy</span>=<span class="synConstant">&quot;LRU&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/cache&gt;</span> <span class="synIdentifier">&lt;cache </span><span class="synType">name</span>=<span class="synConstant">&quot;with-expire-cache&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;key-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;value-type </span><span class="synType">class-name</span>=<span class="synConstant">&quot;java.lang.String&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;eviction </span><span class="synType">size</span>=<span class="synConstant">&quot;5&quot;</span><span class="synIdentifier"> </span><span class="synType">max-size-policy</span>=<span class="synConstant">&quot;ENTRY_COUNT&quot;</span><span class="synIdentifier"> </span><span class="synType">eviction-policy</span>=<span class="synConstant">&quot;LRU&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;expiry-policy-factory </span><span class="synType">class-name</span>=<span class="synConstant">&quot;org.littlewings.hazelcast.jcache.MyExpiryFactory&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/cache&gt;</span> <span class="synIdentifier">&lt;/hazelcast&gt;</span> </pre><p>また、テストコードのimport文には以下を追加します。</p> <pre class="code lang-java" data-lang="java" data-unlink><span class="synPreProc">import</span> com.hazelcast.cache.HazelcastCachingProvider; </pre><p>先ほどのテストコードから変わるところですが、まずHazelcastCachingProvider.HAZELCAST_CONFIG_LOCATIONをキーに、設定ファイルの場所を値にしたPropertiesを作成します。</p> <pre class="code lang-java" data-lang="java" data-unlink> Properties properties = <span class="synStatement">new</span> Properties(); properties.setProperty(HazelcastCachingProvider.HAZELCAST_CONFIG_LOCATION, <span class="synConstant">&quot;classpath:my-hazelcast.xml&quot;</span>); </pre><p>設定ファイルの場所の指定は、クラスパス(<a class="keyword" href="http://d.hatena.ne.jp/keyword/classpath">classpath</a>)、そして<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>(file:///)のように<a class="keyword" href="http://d.hatena.ne.jp/keyword/URI">URI</a>として渡せるものが利用できます。</p><p>クラスパスの指定ですが、ドキュメント上は「<a class="keyword" href="http://d.hatena.ne.jp/keyword/classpath">classpath</a>://」と書かれていますが、「//」があると動きませんでしたけれど…。</p><p>また、これの省略形として以下の記述もOKです。</p> <pre class="code lang-java" data-lang="java" data-unlink> Properties properties = HazelcastCachingProvider.propertiesByLocation(<span class="synConstant">&quot;classpath:my-hazelcast.xml&quot;</span>); </pre><p>次に、CacheManagerの取得方法が変わります。作成したPropertiesを、CachingProvider#getCacheCacheManagerの第3引数に渡します。</p> <pre class="code lang-java" data-lang="java" data-unlink> CachingProvider provider = Caching.getCachingProvider(); CacheManager manager = provider.getCacheManager(URI.create(<span class="synConstant">&quot;my-cache-manager&quot;</span>), <span class="synConstant">null</span>, properties); </pre><p>ここで、CachingProvider#getCacheCacheManagerの第1引数はCacheManagerの管理スコープを分けるための<a class="keyword" href="http://d.hatena.ne.jp/keyword/URI">URI</a>、第2引数はClassLoaderで、それぞれnullを指定するとデフォルトのものを使おうとします。</p><p>ただ、このように設定ファイルを自分で指定する使い方の場合は、<span class="deco" style="font-weight:bold;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/URI">URI</a>を指定することがすごく重要で</span>これを指定しないと指定した設定ファイルそのものは認識するのですが、その後でデフォルト設定のHazelcast<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を起動しようとします…。</p><p>同一JavaVMにHazelcast<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が2つ起動しようとする状態になって、さらにCacheManager#getCacheする時は自分が指定された設定ファイルで構築されたHazelcast<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>は使われません。ここ、最初にハマりました…。なお、CachingProvider#getDefaultURIで取得できる値を渡しても、たぶんHazelcast<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が2つ起動する結果になる(nullを渡した時と同じになる)と思います。</p><p>ここまで書いておいて注意ですが、この話は「HazelcastのJCache実装での挙動」のみに言及しています。他のJCacheの実装では、事情が異なると思います。</p><p>あとは、普通に使うだけです。</p><p>Propertiesから作成する例。</p> <pre class="code lang-java" data-lang="java" data-unlink> Properties properties = <span class="synStatement">new</span> Properties(); properties.setProperty(HazelcastCachingProvider.HAZELCAST_CONFIG_LOCATION, <span class="synConstant">&quot;classpath:my-hazelcast.xml&quot;</span>); CachingProvider provider = Caching.getCachingProvider(); CacheManager manager = provider.getCacheManager(URI.create(<span class="synConstant">&quot;my-cache-manager&quot;</span>), <span class="synConstant">null</span>, properties); Cache&lt;String, String&gt; cache = manager.getCache(<span class="synConstant">&quot;simple-cache&quot;</span>, String.<span class="synType">class</span>, String.<span class="synType">class</span>); IntStream.rangeClosed(<span class="synConstant">1</span>, <span class="synConstant">5</span>).forEach(i<span class="synError"> -&gt;</span> cache.put(<span class="synConstant">&quot;key&quot;</span> + i, <span class="synConstant">&quot;value&quot;</span> + i)); assertThat(cache.get(<span class="synConstant">&quot;key1&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value1&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key5&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value5&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key10&quot;</span>)) .isNull(); cache.close(); manager.close(); provider.close(); </pre><p>HazelcastCachingProvider#propertiesByLocationを使用した例。</p> <pre class="code lang-java" data-lang="java" data-unlink> Properties properties = HazelcastCachingProvider.propertiesByLocation(<span class="synConstant">&quot;classpath:my-hazelcast.xml&quot;</span>); CachingProvider provider = Caching.getCachingProvider(); CacheManager manager = provider.getCacheManager(URI.create(<span class="synConstant">&quot;my-cache-manager&quot;</span>), <span class="synConstant">null</span>, properties); Cache&lt;String, String&gt; cache = manager.getCache(<span class="synConstant">&quot;with-expire-cache&quot;</span>, String.<span class="synType">class</span>, String.<span class="synType">class</span>); IntStream.rangeClosed(<span class="synConstant">1</span>, <span class="synConstant">5</span>).forEach(i<span class="synError"> -&gt;</span> cache.put(<span class="synConstant">&quot;key&quot;</span> + i, <span class="synConstant">&quot;value&quot;</span> + i)); TimeUnit.SECONDS.sleep(<span class="synConstant">3</span>); cache.get(<span class="synConstant">&quot;key1&quot;</span>); cache.get(<span class="synConstant">&quot;key3&quot;</span>); TimeUnit.SECONDS.sleep(<span class="synConstant">3</span>); assertThat(cache.get(<span class="synConstant">&quot;key1&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value1&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key3&quot;</span>)) .isEqualTo(<span class="synConstant">&quot;value3&quot;</span>); assertThat(cache.get(<span class="synConstant">&quot;key2&quot;</span>)) .isNull(); assertThat(cache.get(<span class="synConstant">&quot;key4&quot;</span>)) .isNull(); TimeUnit.SECONDS.sleep(<span class="synConstant">6</span>); assertThat(cache.get(<span class="synConstant">&quot;key1&quot;</span>)) .isNull(); assertThat(cache.get(<span class="synConstant">&quot;key3&quot;</span>)) .isNull(); cache.close(); manager.close(); provider.close(); </pre><p>今回のコード例では、CacheManagerを取得しているところを変えれば「hazelcast.<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>」を使っていた時のコードがそのまま動きます。設定ファイルの置き場所を変えただけなので、そりゃあそうだという話ですが。</p><p>ただ、挙動がわかりにくかったりするのですが…どうなんでしょう?</p><p>今回作成したコードは、こちらに置いています。</p><p><a href="https://github.com/kazuhira-r/hazelcast-examples/tree/master/hazelcast-jcache-configuration">https://github.com/kazuhira-r/hazelcast-examples/tree/master/hazelcast-jcache-configuration</a></p> </div> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="Kazuhira" >Kazuhira</span></span> <span class="entry-footer-time"><a href="https://kazuhira-r.hatenablog.com/entry/20150228/1425098946"><time data-relative datetime="2015-02-28T04:49:06Z" title="2015-02-28T04:49:06Z" class="updated">2015-02-28 13:49</time></a></span> <span class=" entry-footer-subscribe " data-test-blog-controlls-subscribe> <a href="https://blog.hatena.ne.jp/Kazuhira/kazuhira-r.hatenablog.com/subscribe?utm_source=blogs_entry_footer&amp;utm_campaign=subscribe_blog&amp;utm_medium=button"> 読者になる </a> </span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://kazuhira-r.hatenablog.com/entry/20150228/1425098946" data-hatena-star-title="HazelcastでCache(JCache)の設定をする" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> <div class="social-button-item"> <a href="https://b.hatena.ne.jp/entry/s/kazuhira-r.hatenablog.com/entry/20150228/1425098946" class="hatena-bookmark-button" data-hatena-bookmark-url="https://kazuhira-r.hatenablog.com/entry/20150228/1425098946" data-hatena-bookmark-layout="vertical-balloon" data-hatena-bookmark-lang="ja" title="この記事をはてなブックマークに追加"><img src="https://b.st-hatena.com/images/entry-button/button-only.gif" alt="この記事をはてなブックマークに追加" width="20" height="20" style="border: none;" /></a> </div> <div class="social-button-item"> <div class="fb-share-button" data-layout="box_count" data-href="https://kazuhira-r.hatenablog.com/entry/20150228/1425098946"></div> </div> <div class="social-button-item"> <a class="entry-share-button entry-share-button-twitter test-share-button-twitter" href="https://x.com/intent/tweet?text=Hazelcast%E3%81%A7Cache%EF%BC%88JCache%EF%BC%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B+-+CLOVER%F0%9F%8D%80&amp;url=https%3A%2F%2Fkazuhira-r.hatenablog.com%2Fentry%2F20150228%2F1425098946" title="X(Twitter)で投稿する" ></a> </div> </div> <div class="google-afc-image test-google-rectangle-ads"> <div id="google_afc_user_container_0" class="google-afc-user-container google_afc_blocklink2_5 google_afc_boder" data-test-unit="/4374287/blog_user"></div> <a href="http://blog.hatena.ne.jp/guide/pro" class="open-pro-modal" data-guide-pro-modal-ad-url="https://hatena.blog/guide/pro/modal/ad">広告を非表示にする</a> </div> <div class="customized-footer"> <div class="entry-footer-modules" id="entry-footer-secondary-modules"> <div class="hatena-module hatena-module-related-entries" > <!-- Hatena-Epic-has-related-entries-with-elasticsearch:true --> <div class="hatena-module-title"> 関連記事 </div> <div class="hatena-module-body"> <ul class="related-entries hatena-urllist urllist-with-thumbnails"> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <div class="urllist-date-link related-entries-date-link"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/04/02" rel="nofollow"> <time datetime="2023-04-02T11:56:16Z" title="2023年4月2日"> 2023-04-02 </time> </a> </div> <a href="https://kazuhira-r.hatenablog.com/entry/2023/04/02/205616" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">Infinispan Server+Hot Rod ClientのNear Cacheを試す</a> <div class="urllist-entry-body related-entries-entry-body">これは、なにをしたくて書いたもの? Infinispan ServerにHot R…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <div class="urllist-date-link related-entries-date-link"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/05/19" rel="nofollow"> <time datetime="2016-05-19T13:40:52Z" title="2016年5月19日"> 2016-05-19 </time> </a> </div> <a href="https://kazuhira-r.hatenablog.com/entry/20160519/1463665252" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">JCache(Hazelcast Client)で、独自のクラスをCacheに突っ込むとClassN…</a> <div class="urllist-entry-body related-entries-entry-body">今日、JCacheについて、こんな質問を受けまして。「Hazelcast C…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <div class="urllist-date-link related-entries-date-link"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/01/24" rel="nofollow"> <time datetime="2016-01-24T12:25:42Z" title="2016年1月24日"> 2016-01-24 </time> </a> </div> <a href="https://kazuhira-r.hatenablog.com/entry/20160124/1453638342" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">Ehcache 3のUserManagedCacheを試す</a> <div class="urllist-entry-body related-entries-entry-body">Ehcache 3のドキュメントを見ていて、新しいキーワードが増えて…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <div class="urllist-date-link related-entries-date-link"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/12/19" rel="nofollow"> <time datetime="2015-12-19T09:35:27Z" title="2015年12月19日"> 2015-12-19 </time> </a> </div> <a href="https://kazuhira-r.hatenablog.com/entry/20151219/1450517727" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">Spring BootのCache auto-configuration×JCache(Hazelc…</a> <div class="urllist-entry-body related-entries-entry-body">Spring Boot 1.3から、Cacheのauto-configurationが入ったとい…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <div class="urllist-date-link related-entries-date-link"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/07/23" rel="nofollow"> <time datetime="2015-07-23T14:19:35Z" title="2015年7月23日"> 2015-07-23 </time> </a> </div> <a href="https://kazuhira-r.hatenablog.com/entry/20150723/1437661175" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">HazelcastCacheManager or JCacheCacheManager</a> <div class="urllist-entry-body related-entries-entry-body">最近、SpringのCache機能とライブラリ側で提供しているCacheMan…</div> </div> </li> </ul> </div> </div> </div> </div> <div class="comment-box js-comment-box"> <ul class="comment js-comment"> <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li> </ul> <a class="leave-comment-title js-leave-comment-title">コメントを書く</a> </div> </footer> </div> </article> <!-- rakuten_ad_target_end --> <!-- google_ad_section_end --> <div class="pager pager-permalink permalink"> <span class="pager-prev"> <a href="https://kazuhira-r.hatenablog.com/entry/20150301/1425200953" rel="prev"> <span class="pager-arrow">&laquo; </span> Groovy(Geb)とScala(ScalaTest)を使っ… </a> </span> <span class="pager-next"> <a href="https://kazuhira-r.hatenablog.com/entry/20150211/1423650380" rel="next"> Hibernate SearchでExplanation(スコアの… <span class="pager-arrow"> &raquo;</span> </a> </span> </div> </div> </div> <aside id="box1"> <div id="box1-inner"> </div> </aside> </div><!-- #wrapper --> <aside id="box2"> <div id="box2-inner"> <div class="hatena-module hatena-module-profile"> <div class="hatena-module-title"> プロフィール </div> <div class="hatena-module-body"> <a href="https://kazuhira-r.hatenablog.com/about" class="profile-icon-link"> <img src="https://cdn.profile-image.st-hatena.com/users/Kazuhira/profile.png?1356877606" alt="id:Kazuhira" class="profile-icon" /> </a> <span class="id"> <a href="https://kazuhira-r.hatenablog.com/about" class="hatena-id-link"><span data-load-nickname="1" data-user-name="Kazuhira">id:Kazuhira</span></a> </span> <div class="profile-description"> <p>Sunday Programmer's Diary</p> </div> <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box" > <a href="#" class="hatena-follow-button js-hatena-follow-button"> <span class="subscribing"> <span class="foreground">読者です</span> <span class="background">読者をやめる</span> </span> <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once> <span class="foreground">読者になる</span> <span class="background">読者になる</span> </span> </a> <div class="subscription-count-box js-subscription-count-box"> <i></i> <u></u> <span class="subscription-count js-subscription-count"> </span> </div> </div> <div class="profile-about"> <a href="https://kazuhira-r.hatenablog.com/about">このブログについて</a> </div> </div> </div> <div class="hatena-module hatena-module-search-box"> <div class="hatena-module-title"> 検索 </div> <div class="hatena-module-body"> <form class="search-form" role="search" action="https://kazuhira-r.hatenablog.com/search" method="get"> <input type="text" name="q" class="search-module-input" value="" placeholder="記事を検索" required> <input type="submit" value="検索" class="search-module-button" /> </form> </div> </div> <div class="hatena-module hatena-module-links"> <div class="hatena-module-title"> リンク </div> <div class="hatena-module-body"> <ul class="hatena-urllist"> <li> <a href="https://hatena.blog/">はてなブログ</a> </li> <li> <a href="https://hatena.blog/guide?via=200109">ブログをはじめる</a> </li> <li> <a href="http://blog.hatenablog.com">週刊はてなブログ</a> </li> <li> <a href="https://hatena.blog/guide/pro">はてなブログPro</a> </li> </ul> </div> </div> <div class="hatena-module hatena-module-archive" data-archive-type="default" data-archive-url="https://kazuhira-r.hatenablog.com/archive"> <div class="hatena-module-title"> <a href="https://kazuhira-r.hatenablog.com/archive">月別アーカイブ</a> </div> <div class="hatena-module-body"> <ul class="hatena-urllist"> <li class="archive-module-year archive-module-year-hidden" data-year="2025"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2025" class="archive-module-year-title archive-module-year-2025"> 2025 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2025/03" class="archive-module-month-title archive-module-month-2025-3"> 2025 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2025/02" class="archive-module-month-title archive-module-month-2025-2"> 2025 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2025/01" class="archive-module-month-title archive-module-month-2025-1"> 2025 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2024"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2024" class="archive-module-year-title archive-module-year-2024"> 2024 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/12" class="archive-module-month-title archive-module-month-2024-12"> 2024 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/11" class="archive-module-month-title archive-module-month-2024-11"> 2024 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/10" class="archive-module-month-title archive-module-month-2024-10"> 2024 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/09" class="archive-module-month-title archive-module-month-2024-9"> 2024 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/08" class="archive-module-month-title archive-module-month-2024-8"> 2024 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/07" class="archive-module-month-title archive-module-month-2024-7"> 2024 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/06" class="archive-module-month-title archive-module-month-2024-6"> 2024 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/05" class="archive-module-month-title archive-module-month-2024-5"> 2024 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/04" class="archive-module-month-title archive-module-month-2024-4"> 2024 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/03" class="archive-module-month-title archive-module-month-2024-3"> 2024 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/02" class="archive-module-month-title archive-module-month-2024-2"> 2024 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2024/01" class="archive-module-month-title archive-module-month-2024-1"> 2024 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2023"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2023" class="archive-module-year-title archive-module-year-2023"> 2023 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/12" class="archive-module-month-title archive-module-month-2023-12"> 2023 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/11" class="archive-module-month-title archive-module-month-2023-11"> 2023 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/10" class="archive-module-month-title archive-module-month-2023-10"> 2023 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/09" class="archive-module-month-title archive-module-month-2023-9"> 2023 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/08" class="archive-module-month-title archive-module-month-2023-8"> 2023 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/07" class="archive-module-month-title archive-module-month-2023-7"> 2023 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/06" class="archive-module-month-title archive-module-month-2023-6"> 2023 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/05" class="archive-module-month-title archive-module-month-2023-5"> 2023 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/04" class="archive-module-month-title archive-module-month-2023-4"> 2023 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/03" class="archive-module-month-title archive-module-month-2023-3"> 2023 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/02" class="archive-module-month-title archive-module-month-2023-2"> 2023 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2023/01" class="archive-module-month-title archive-module-month-2023-1"> 2023 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2022"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2022" class="archive-module-year-title archive-module-year-2022"> 2022 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/12" class="archive-module-month-title archive-module-month-2022-12"> 2022 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/11" class="archive-module-month-title archive-module-month-2022-11"> 2022 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/10" class="archive-module-month-title archive-module-month-2022-10"> 2022 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/09" class="archive-module-month-title archive-module-month-2022-9"> 2022 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/08" class="archive-module-month-title archive-module-month-2022-8"> 2022 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/07" class="archive-module-month-title archive-module-month-2022-7"> 2022 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/06" class="archive-module-month-title archive-module-month-2022-6"> 2022 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/05" class="archive-module-month-title archive-module-month-2022-5"> 2022 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/04" class="archive-module-month-title archive-module-month-2022-4"> 2022 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/03" class="archive-module-month-title archive-module-month-2022-3"> 2022 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/02" class="archive-module-month-title archive-module-month-2022-2"> 2022 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2022/01" class="archive-module-month-title archive-module-month-2022-1"> 2022 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2021"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2021" class="archive-module-year-title archive-module-year-2021"> 2021 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/12" class="archive-module-month-title archive-module-month-2021-12"> 2021 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/11" class="archive-module-month-title archive-module-month-2021-11"> 2021 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/10" class="archive-module-month-title archive-module-month-2021-10"> 2021 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/09" class="archive-module-month-title archive-module-month-2021-9"> 2021 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/08" class="archive-module-month-title archive-module-month-2021-8"> 2021 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/07" class="archive-module-month-title archive-module-month-2021-7"> 2021 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/06" class="archive-module-month-title archive-module-month-2021-6"> 2021 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/05" class="archive-module-month-title archive-module-month-2021-5"> 2021 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/04" class="archive-module-month-title archive-module-month-2021-4"> 2021 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/03" class="archive-module-month-title archive-module-month-2021-3"> 2021 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/02" class="archive-module-month-title archive-module-month-2021-2"> 2021 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2021/01" class="archive-module-month-title archive-module-month-2021-1"> 2021 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2020"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2020" class="archive-module-year-title archive-module-year-2020"> 2020 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/12" class="archive-module-month-title archive-module-month-2020-12"> 2020 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/11" class="archive-module-month-title archive-module-month-2020-11"> 2020 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/10" class="archive-module-month-title archive-module-month-2020-10"> 2020 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/09" class="archive-module-month-title archive-module-month-2020-9"> 2020 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/08" class="archive-module-month-title archive-module-month-2020-8"> 2020 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/07" class="archive-module-month-title archive-module-month-2020-7"> 2020 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/06" class="archive-module-month-title archive-module-month-2020-6"> 2020 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/05" class="archive-module-month-title archive-module-month-2020-5"> 2020 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/04" class="archive-module-month-title archive-module-month-2020-4"> 2020 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/03" class="archive-module-month-title archive-module-month-2020-3"> 2020 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/02" class="archive-module-month-title archive-module-month-2020-2"> 2020 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2020/01" class="archive-module-month-title archive-module-month-2020-1"> 2020 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2019"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2019" class="archive-module-year-title archive-module-year-2019"> 2019 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/12" class="archive-module-month-title archive-module-month-2019-12"> 2019 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/11" class="archive-module-month-title archive-module-month-2019-11"> 2019 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/10" class="archive-module-month-title archive-module-month-2019-10"> 2019 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/09" class="archive-module-month-title archive-module-month-2019-9"> 2019 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/08" class="archive-module-month-title archive-module-month-2019-8"> 2019 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/07" class="archive-module-month-title archive-module-month-2019-7"> 2019 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/06" class="archive-module-month-title archive-module-month-2019-6"> 2019 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/05" class="archive-module-month-title archive-module-month-2019-5"> 2019 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/04" class="archive-module-month-title archive-module-month-2019-4"> 2019 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/03" class="archive-module-month-title archive-module-month-2019-3"> 2019 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/02" class="archive-module-month-title archive-module-month-2019-2"> 2019 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2019/01" class="archive-module-month-title archive-module-month-2019-1"> 2019 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2018"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2018" class="archive-module-year-title archive-module-year-2018"> 2018 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/12" class="archive-module-month-title archive-module-month-2018-12"> 2018 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/11" class="archive-module-month-title archive-module-month-2018-11"> 2018 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/10" class="archive-module-month-title archive-module-month-2018-10"> 2018 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/09" class="archive-module-month-title archive-module-month-2018-9"> 2018 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/08" class="archive-module-month-title archive-module-month-2018-8"> 2018 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/07" class="archive-module-month-title archive-module-month-2018-7"> 2018 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/06" class="archive-module-month-title archive-module-month-2018-6"> 2018 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/05" class="archive-module-month-title archive-module-month-2018-5"> 2018 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/04" class="archive-module-month-title archive-module-month-2018-4"> 2018 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/03" class="archive-module-month-title archive-module-month-2018-3"> 2018 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/02" class="archive-module-month-title archive-module-month-2018-2"> 2018 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2018/01" class="archive-module-month-title archive-module-month-2018-1"> 2018 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2017"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2017" class="archive-module-year-title archive-module-year-2017"> 2017 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/12" class="archive-module-month-title archive-module-month-2017-12"> 2017 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/11" class="archive-module-month-title archive-module-month-2017-11"> 2017 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/10" class="archive-module-month-title archive-module-month-2017-10"> 2017 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/09" class="archive-module-month-title archive-module-month-2017-9"> 2017 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/08" class="archive-module-month-title archive-module-month-2017-8"> 2017 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/07" class="archive-module-month-title archive-module-month-2017-7"> 2017 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/06" class="archive-module-month-title archive-module-month-2017-6"> 2017 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/05" class="archive-module-month-title archive-module-month-2017-5"> 2017 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/04" class="archive-module-month-title archive-module-month-2017-4"> 2017 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/03" class="archive-module-month-title archive-module-month-2017-3"> 2017 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/02" class="archive-module-month-title archive-module-month-2017-2"> 2017 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2017/01" class="archive-module-month-title archive-module-month-2017-1"> 2017 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2016"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2016" class="archive-module-year-title archive-module-year-2016"> 2016 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/12" class="archive-module-month-title archive-module-month-2016-12"> 2016 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/11" class="archive-module-month-title archive-module-month-2016-11"> 2016 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/10" class="archive-module-month-title archive-module-month-2016-10"> 2016 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/09" class="archive-module-month-title archive-module-month-2016-9"> 2016 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/08" class="archive-module-month-title archive-module-month-2016-8"> 2016 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/07" class="archive-module-month-title archive-module-month-2016-7"> 2016 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/06" class="archive-module-month-title archive-module-month-2016-6"> 2016 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/05" class="archive-module-month-title archive-module-month-2016-5"> 2016 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/04" class="archive-module-month-title archive-module-month-2016-4"> 2016 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/03" class="archive-module-month-title archive-module-month-2016-3"> 2016 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/02" class="archive-module-month-title archive-module-month-2016-2"> 2016 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2016/01" class="archive-module-month-title archive-module-month-2016-1"> 2016 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2015"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2015" class="archive-module-year-title archive-module-year-2015"> 2015 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/12" class="archive-module-month-title archive-module-month-2015-12"> 2015 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/11" class="archive-module-month-title archive-module-month-2015-11"> 2015 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/10" class="archive-module-month-title archive-module-month-2015-10"> 2015 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/09" class="archive-module-month-title archive-module-month-2015-9"> 2015 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/08" class="archive-module-month-title archive-module-month-2015-8"> 2015 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/07" class="archive-module-month-title archive-module-month-2015-7"> 2015 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/06" class="archive-module-month-title archive-module-month-2015-6"> 2015 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/05" class="archive-module-month-title archive-module-month-2015-5"> 2015 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/04" class="archive-module-month-title archive-module-month-2015-4"> 2015 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/03" class="archive-module-month-title archive-module-month-2015-3"> 2015 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/02" class="archive-module-month-title archive-module-month-2015-2"> 2015 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2015/01" class="archive-module-month-title archive-module-month-2015-1"> 2015 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2014"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2014" class="archive-module-year-title archive-module-year-2014"> 2014 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/12" class="archive-module-month-title archive-module-month-2014-12"> 2014 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/11" class="archive-module-month-title archive-module-month-2014-11"> 2014 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/10" class="archive-module-month-title archive-module-month-2014-10"> 2014 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/09" class="archive-module-month-title archive-module-month-2014-9"> 2014 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/08" class="archive-module-month-title archive-module-month-2014-8"> 2014 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/07" class="archive-module-month-title archive-module-month-2014-7"> 2014 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/06" class="archive-module-month-title archive-module-month-2014-6"> 2014 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/05" class="archive-module-month-title archive-module-month-2014-5"> 2014 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/04" class="archive-module-month-title archive-module-month-2014-4"> 2014 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/03" class="archive-module-month-title archive-module-month-2014-3"> 2014 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/02" class="archive-module-month-title archive-module-month-2014-2"> 2014 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2014/01" class="archive-module-month-title archive-module-month-2014-1"> 2014 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2013"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2013" class="archive-module-year-title archive-module-year-2013"> 2013 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/12" class="archive-module-month-title archive-module-month-2013-12"> 2013 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/11" class="archive-module-month-title archive-module-month-2013-11"> 2013 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/10" class="archive-module-month-title archive-module-month-2013-10"> 2013 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/09" class="archive-module-month-title archive-module-month-2013-9"> 2013 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/08" class="archive-module-month-title archive-module-month-2013-8"> 2013 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/07" class="archive-module-month-title archive-module-month-2013-7"> 2013 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/06" class="archive-module-month-title archive-module-month-2013-6"> 2013 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/05" class="archive-module-month-title archive-module-month-2013-5"> 2013 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/04" class="archive-module-month-title archive-module-month-2013-4"> 2013 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/03" class="archive-module-month-title archive-module-month-2013-3"> 2013 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/02" class="archive-module-month-title archive-module-month-2013-2"> 2013 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2013/01" class="archive-module-month-title archive-module-month-2013-1"> 2013 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2012"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2012" class="archive-module-year-title archive-module-year-2012"> 2012 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/12" class="archive-module-month-title archive-module-month-2012-12"> 2012 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/11" class="archive-module-month-title archive-module-month-2012-11"> 2012 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/10" class="archive-module-month-title archive-module-month-2012-10"> 2012 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/09" class="archive-module-month-title archive-module-month-2012-9"> 2012 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/08" class="archive-module-month-title archive-module-month-2012-8"> 2012 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/07" class="archive-module-month-title archive-module-month-2012-7"> 2012 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/06" class="archive-module-month-title archive-module-month-2012-6"> 2012 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/05" class="archive-module-month-title archive-module-month-2012-5"> 2012 / 5 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/04" class="archive-module-month-title archive-module-month-2012-4"> 2012 / 4 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/03" class="archive-module-month-title archive-module-month-2012-3"> 2012 / 3 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/02" class="archive-module-month-title archive-module-month-2012-2"> 2012 / 2 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2012/01" class="archive-module-month-title archive-module-month-2012-1"> 2012 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2011"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://kazuhira-r.hatenablog.com/archive/2011" class="archive-module-year-title archive-module-year-2011"> 2011 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/12" class="archive-module-month-title archive-module-month-2011-12"> 2011 / 12 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/11" class="archive-module-month-title archive-module-month-2011-11"> 2011 / 11 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/10" class="archive-module-month-title archive-module-month-2011-10"> 2011 / 10 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/09" class="archive-module-month-title archive-module-month-2011-9"> 2011 / 9 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/08" class="archive-module-month-title archive-module-month-2011-8"> 2011 / 8 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/07" class="archive-module-month-title archive-module-month-2011-7"> 2011 / 7 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/06" class="archive-module-month-title archive-module-month-2011-6"> 2011 / 6 </a> </li> <li class="archive-module-month"> <a href="https://kazuhira-r.hatenablog.com/archive/2011/05" class="archive-module-month-title archive-module-month-2011-5"> 2011 / 5 </a> </li> </ul> </li> </ul> </div> </div> </div> </aside> </div> </div> </div> </div> <footer id="footer" data-brand="hatenablog"> <div id="footer-inner"> <div style="display:none !important" class="guest-footer js-guide-register test-blogs-register-guide" data-action="guide-register"> <div class="guest-footer-content"> <h3>はてなブログをはじめよう!</h3> <p>Kazuhiraさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?</p> <div class="guest-footer-btn-container"> <div class="guest-footer-btn"> <a class="btn btn-register js-inherit-ga" href="https://blog.hatena.ne.jp/register?via=200227" target="_blank">はてなブログをはじめる(無料)</a> </div> <div class="guest-footer-btn"> <a href="https://hatena.blog/guide" target="_blank">はてなブログとは</a> </div> </div> </div> </div> <address class="footer-address"> <a href="https://kazuhira-r.hatenablog.com/"> <img src="https://cdn.blog.st-hatena.com/images/admin/blog-icon-noimage.png" width="16" height="16" alt="CLOVER🍀"/> <span class="footer-address-name">CLOVER🍀</span> </a> </address> <p class="services"> Powered by <a href="https://hatena.blog/">Hatena Blog</a> | <a href="https://blog.hatena.ne.jp/-/abuse_report?target_url=https%3A%2F%2Fkazuhira-r.hatenablog.com%2Fentry%2F20150228%2F1425098946" class="report-abuse-link test-report-abuse-link" target="_blank">ブログを報告する</a> </p> </div> </footer> <script async src="https://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 id="fb-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#xfbml=1&appId=719729204785177&version=v17.0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <div class="quote-box"> <div class="tooltip-quote tooltip-quote-stock"> <i class="blogicon-quote" title="引用をストック"></i> </div> <div class="tooltip-quote tooltip-quote-tweet js-tooltip-quote-tweet"> <a class="js-tweet-quote" target="_blank" data-track-name="quote-tweet" data-track-once> <img src="https://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version=1ca111bc9f0112690b12e1842a1ce8" title="引用して投稿する" > </a> </div> </div> <div class="quote-stock-panel" id="quote-stock-message-box" style="position: absolute; z-index: 3000"> <div class="message-box" id="quote-stock-succeeded-message" style="display: none"> <p>引用をストックしました</p> <button class="btn btn-primary" id="quote-stock-show-editor-button" data-track-name="curation-quote-edit-button">ストック一覧を見る</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="message-box" id="quote-login-required-message" style="display: none"> <p>引用するにはまずログインしてください</p> <button class="btn btn-primary" id="quote-login-button">ログイン</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="quote-stock-failed-message" style="display: none"> <p>引用をストックできませんでした。再度お試しください</p> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="unstockable-quote-message-box" style="display: none; position: absolute; z-index: 3000;"> <p>限定公開記事のため引用できません。</p> </div> </div> <script type="x-underscore-template" id="js-requote-button-template"> <div class="requote-button js-requote-button"> <button class="requote-button-btn tipsy-top" title="引用する"><i class="blogicon-quote"></i></button> </div> </script> <div id="hidden-subscribe-button" style="display: none;"> <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box" > <a href="#" class="hatena-follow-button js-hatena-follow-button"> <span class="subscribing"> <span class="foreground">読者です</span> <span class="background">読者をやめる</span> </span> <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once> <span class="foreground">読者になる</span> <span class="background">読者になる</span> </span> </a> <div class="subscription-count-box js-subscription-count-box"> <i></i> <u></u> <span class="subscription-count js-subscription-count"> </span> </div> </div> </div> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <script src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> <script type="text/javascript" src="https://cdn.blog.st-hatena.com/js/external/jquery.min.js?v=1.12.4&amp;version=1ca111bc9f0112690b12e1842a1ce8"></script> <script src="https://cdn.blog.st-hatena.com/js/texts-ja.js?version=1ca111bc9f0112690b12e1842a1ce8"></script> <script id="vendors-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/vendors.js?version=1ca111bc9f0112690b12e1842a1ce8" crossorigin="anonymous"></script> <script id="hatenablog-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/hatenablog.js?version=1ca111bc9f0112690b12e1842a1ce8" crossorigin="anonymous" data-page-id="entry"></script> <script>Hatena.Diary.GlobalHeader.init()</script> <script id="valve-dmp" data-service="blog" src="https://cdn.pool.st-hatena.com/valve/dmp.js" data-test-id="dmpjs" async></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10