{"generator":"Jekyll","link":[{"@attributes":{"href":"https:\/\/piruin.github.io\/feed.xml","rel":"self","type":"application\/atom+xml"}},{"@attributes":{"href":"https:\/\/piruin.github.io\/","rel":"alternate","type":"text\/html"}}],"updated":"2021-10-06T10:36:28+07:00","id":"https:\/\/piruin.github.io\/feed.xml","title":"Blast Piruin Panichphol","subtitle":"Piruin Panichphol or Blast is Software Engineer, Scrum Master, Technical Coach. This is Piruin's personal website.\n","author":{"name":"Blast Piruin Panichphol"},"entry":[{"title":"Implement Jersey security without web.xml","link":{"@attributes":{"href":"https:\/\/piruin.github.io\/blog\/implement-jersey-security-without-config-xml\/","rel":"alternate","type":"text\/html","title":"Implement Jersey security without web.xml"}},"published":"2016-11-02T00:00:00+07:00","updated":"2016-11-02T00:00:00+07:00","id":"https:\/\/piruin.github.io\/blog\/implement-jersey-security-without-config-xml","content":"<p>\u0e01\u0e32\u0e23\u0e08\u0e30 Implement Security \u0e14\u0e49\u0e27\u0e22 Annotation \u0e15\u0e32\u0e21\u0e21\u0e32\u0e15\u0e23\u0e10\u0e32\u0e19 JAX-RS 2.0 \u0e1a\u0e19 Jersey \u0e43\u0e19 Document \u0e1a\u0e2d\u0e01\u0e43\u0e2b\u0e49\u0e17\u0e33 config \u0e17\u0e35\u0e48 web.xml\n\u0e41\u0e15\u0e48\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01\u0e1c\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e21\u0e37\u0e2d\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 Java Web Server \u0e1a\u0e2d\u0e01\u0e40\u0e25\u0e22\u0e27\u0e48\u0e32\u0e43\u0e0a\u0e49 web.xml \u0e44\u0e21\u0e48\u0e40\u0e1b\u0e47\u0e19 \u0e15\u0e31\u0e27 api \u0e17\u0e35\u0e48\u0e17\u0e33\u0e2d\u0e22\u0e39\u0e48\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e01\u0e47\u0e40\u0e1b\u0e47\u0e19 Jetty Embedded\n\u0e41\u0e25\u0e30\u0e14\u0e39\u0e41\u0e25\u0e49\u0e27\u0e01\u0e47\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e0a\u0e2d\u0e1a\u0e01\u0e32\u0e23 Config \u0e14\u0e49\u0e27\u0e22 code \u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 \u0e40\u0e25\u0e22\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e15\u0e49\u0e2d\u0e07\u0e27\u0e34\u0e18\u0e35\u0e40\u0e2d\u0e07 \u0e07\u0e07\u0e1a\u0e31\u0e04\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e15\u0e31\u0e49\u0e07\u0e19\u0e32\u0e19 \u0e2b\u0e38\u0e2b\u0e38<\/p>\n\n<blockquote>\n  <p>\u0e22\u0e31\u0e07\u0e04\u0e07\u0e21\u0e35\u0e41\u0e15\u0e48\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 Api \u0e43\u0e2b\u0e49\u0e40\u0e02\u0e35\u0e22\u0e19\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01 Android \u0e21\u0e35\u0e04\u0e19\u0e17\u0e33\u0e41\u0e17\u0e19\u0e41\u0e25\u0e49\u0e27 \u0e44\u0e25\u0e48\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e21\u0e32\u0e17\u0e33 Api \u0e41\u0e17\u0e19<\/p>\n<\/blockquote>\n\n<p>\u0e21\u0e32\u0e14\u0e39\u0e42\u0e08\u0e17\u0e22\u0e4c\u0e01\u0e31\u0e19<\/p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nd\">@Path<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/resource\"<\/span><span class=\"o\">)<\/span>\n<span class=\"kd\">public<\/span> <span class=\"nc\">Resource<\/span><span class=\"o\">{<\/span>\n\n   <span class=\"nd\">@RoleAllow<\/span><span class=\"o\">(<\/span><span class=\"s\">\"user\"<\/span><span class=\"o\">)<\/span>\n   <span class=\"nd\">@Path<\/span><span class=\"o\">(\/<\/span><span class=\"kd\">private<\/span><span class=\"o\">)<\/span>\n   <span class=\"kd\">public<\/span> <span class=\"nc\">Response<\/span> <span class=\"nf\">privateRes<\/span><span class=\"o\">(){<\/span>\n     <span class=\"o\">...<\/span>\n   <span class=\"o\">}<\/span>\n\n   <span class=\"nd\">@PermitAll<\/span>\n   <span class=\"nd\">@Path<\/span><span class=\"o\">(\/<\/span><span class=\"kd\">public<\/span><span class=\"o\">)<\/span>\n   <span class=\"kd\">public<\/span> <span class=\"nc\">Response<\/span> <span class=\"nf\">publicRes<\/span><span class=\"o\">(){<\/span>\n     <span class=\"o\">...<\/span>\n   <span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e1c\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e17\u0e38\u0e01\u0e04\u0e19\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07 <code class=\"language-plaintext highlighter-rouge\">resource\/public<\/code> \u0e44\u0e14\u0e49 \u0e41\u0e15\u0e48\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">resource\/private<\/code> \u0e2d\u0e22\u0e32\u0e01\u0e43\u0e2b\u0e49\u0e40\u0e09\u0e1e\u0e32\u0e30 user\n\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19\u0e17\u0e35\u0e48\u0e40\u0e02\u0e49\u0e32\u0e44\u0e14\u0e49 \u0e14\u0e49\u0e27\u0e22 Security Annotation<\/p>\n\n<p>\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e04\u0e37\u0e2d<\/p>\n\n<ul>\n  <li>\n    <p>\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 <strong>Security Annotation<\/strong> \u0e15\u0e32\u0e21\u0e21\u0e32\u0e15\u0e23\u0e10\u0e32\u0e19 JAX-RS 2.0 \u0e0b\u0e30\u0e01\u0e48\u0e2d\u0e19  \u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01 Jersey\n\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 Feature \u0e19\u0e35\u0e49\u0e42\u0e14\u0e22 default \u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e2d\u0e07\u0e16\u0e36\u0e07\u0e08\u0e30\u0e43\u0e0a\u0e49 annotation \u0e40\u0e0a\u0e48\u0e19  <code class=\"language-plaintext highlighter-rouge\">@PermitAll<\/code>, <code class=\"language-plaintext highlighter-rouge\">@DenyAll<\/code>\n\u0e41\u0e25\u0e30 <code class=\"language-plaintext highlighter-rouge\">@RoleAllow<\/code> \u0e44\u0e14\u0e49<\/p>\n  <\/li>\n  <li>\n    <p>implement <code class=\"language-plaintext highlighter-rouge\">SecurityContext<\/code> \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e40\u0e2d\u0e07 \u0e0b\u0e36\u0e48\u0e07\u0e08\u0e30\u0e40\u0e01\u0e47\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22 \u0e44\u0e14\u0e49\u0e41\u0e01\u0e48 User \u0e17\u0e35\u0e48 connect \u0e21\u0e32\u0e0a\u0e37\u0e48\u0e2d\u0e2d\u0e30\u0e44\u0e23\n\u0e1a\u0e17\u0e1a\u0e32\u0e17\u0e2d\u0e30\u0e44\u0e23 (Role) Connect \u0e21\u0e32\u0e41\u0e1a\u0e1a\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22\u0e2b\u0e23\u0e2d\u0e44\u0e21\u0e48 \u0e43\u0e19\u0e17\u0e35\u0e48\u0e19\u0e35\u0e49\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e43\u0e0a\u0e49 web.xml \u0e41\u0e25\u0e30 config \u0e40\u0e1b\u0e47\u0e19\u0e40\u0e23\u0e32\u0e01\u0e47\u0e08\u0e30\u0e44\u0e14\u0e49\u0e04\u0e48\u0e32\u0e1e\u0e27\u0e01\u0e19\u0e35\u0e49\u0e21\u0e32\u0e40\u0e25\u0e22\n\u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e49\u0e2b\u0e25\u0e30\u0e01\u0e47 <code class=\"language-plaintext highlighter-rouge\">SecurityContext<\/code> \u0e08\u0e30\u0e44\u0e21\u0e48\u0e21\u0e35\u0e04\u0e48\u0e32\u0e2d\u0e30\u0e44\u0e23\u0e1e\u0e27\u0e01\u0e19\u0e35\u0e49\u0e40\u0e25\u0e22 return false \u0e15\u0e25\u0e2d\u0e14\u0e01\u0e32\u0e23<\/p>\n  <\/li>\n<\/ul>\n\n<h2 id=\"\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49-security-annotation\">\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49 Security Annotation<\/h2>\n\n<p>\u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23 register <code class=\"language-plaintext highlighter-rouge\">RolesAllowedDynamicFeature<\/code> class \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a <code class=\"language-plaintext highlighter-rouge\">ResourceConfig<\/code> \u0e0b\u0e30\u0e01\u0e48\u0e2d\u0e19<\/p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ApplicationConfig<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">ResourceConfig<\/span><span class=\"o\">{<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nf\">ApplicationConfig<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">packages<\/span><span class=\"o\">(<\/span><span class=\"s\">\"com.awesome.api\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">register<\/span><span class=\"o\">(<\/span><span class=\"nc\">JacksonFeature<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">register<\/span><span class=\"o\">(<\/span><span class=\"nc\">RolesAllowedDynamicFeature<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e17\u0e33\u0e01\u0e32\u0e23 Regis <code class=\"language-plaintext highlighter-rouge\">RolesAllowedDynamicFeature<\/code>  \u0e08\u0e30\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e1a\u0e27\u0e48\u0e32\u0e40\u0e23\u0e32\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 Security Annotation \u0e41\u0e25\u0e49\u0e27\n\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e21\u0e35 Request \u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">\/resource\/private<\/code> server \u0e08\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e23\u0e35\u0e22\u0e01<code class=\"language-plaintext highlighter-rouge\">isUserRole(user)<\/code> \u0e02\u0e2d\u0e07 SecurityContext\n\u0e16\u0e49\u0e32 Method \u0e19\u0e35\u0e49 return <code class=\"language-plaintext highlighter-rouge\">true<\/code> \u0e01\u0e47\u0e08\u0e30\u0e44\u0e14\u0e49\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e44\u0e1b  \u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e40\u0e1b\u0e47\u0e19 false \u0e08\u0e30\u0e40\u0e08\u0e2d 403 Fobidden \u0e41\u0e17\u0e19<\/p>\n\n<p>\u0e0b\u0e36\u0e48\u0e07\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 <code class=\"language-plaintext highlighter-rouge\">SecurityContext<\/code> \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e04\u0e48\u0e32\u0e2d\u0e30\u0e44\u0e23\u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19 Request \u0e2d\u0e30\u0e44\u0e23\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e01\u0e47\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19 Private \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e41\u0e19\u0e48\u0e19\u0e2d\u0e19<\/p>\n\n<h2 id=\"implement-securitycontext\">Implement SecurityContext<\/h2>\n\n<p>\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07 Filter \u0e17\u0e35\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e22\u0e37\u0e22\u0e19\u0e22\u0e31\u0e19\u0e15\u0e31\u0e27\u0e15\u0e19\u0e17\u0e38\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e21\u0e35 Request \u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e17\u0e35\u0e48 api  \u0e40\u0e0a\u0e48\u0e19\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e19\u0e35\u0e49<\/p>\n\n<h3 id=\"authentication-filter\">Authentication Filter<\/h3>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nd\">@Priority<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">)<\/span>\n<span class=\"nd\">@Provider<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AuthenticationFilter<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">ContainerRequestFilter<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">ErrorMessage<\/span> <span class=\"no\">UNAUTHORIZED<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ErrorMessage<\/span><span class=\"o\">(<\/span><span class=\"mi\">401<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\u0e0a\u0e37\u0e48\u0e2d \u0e2b\u0e23\u0e37\u0e2d \u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">ErrorMessage<\/span> <span class=\"no\">FORBIDDEN<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ErrorMessage<\/span><span class=\"o\">(<\/span><span class=\"mi\">403<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e40\u0e02\u0e49\u0e32\u0e43\u0e02\u0e49\u0e07\u0e32\u0e19\"<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">filter<\/span><span class=\"o\">(<\/span><span class=\"nc\">ContainerRequestContext<\/span> <span class=\"n\">requestContext<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"nc\">BasicAuthenticationInfo<\/span><span class=\"o\">.<\/span><span class=\"na\">hasAuthorizeProperty<\/span><span class=\"o\">(<\/span><span class=\"n\">requestContext<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span> <span class=\"c1\">\/\/[1]<\/span>\n            <span class=\"k\">return<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"nc\">BasicAuthenticationInfo<\/span> <span class=\"n\">authenInfo<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">BasicAuthenticationInfo<\/span><span class=\"o\">(<\/span><span class=\"n\">requestContext<\/span><span class=\"o\">);<\/span> <span class=\"c1\">\/\/[2]<\/span>\n        <span class=\"nc\">UserDao<\/span> <span class=\"n\">userDao<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"no\">DBI<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">ConfigurationDB<\/span><span class=\"o\">().<\/span><span class=\"na\">getDatasource<\/span><span class=\"o\">()).<\/span><span class=\"na\">onDemand<\/span><span class=\"o\">(<\/span><span class=\"nc\">UserDao<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n        <span class=\"nc\">User<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userDao<\/span><span class=\"o\">.<\/span><span class=\"na\">find<\/span><span class=\"o\">(<\/span><span class=\"n\">authenInfo<\/span><span class=\"o\">.<\/span><span class=\"na\">getUsername<\/span><span class=\"o\">(),<\/span> <span class=\"n\">authenInfo<\/span><span class=\"o\">.<\/span><span class=\"na\">getPassword<\/span><span class=\"o\">());<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">user<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">FaarmisException<\/span><span class=\"o\">(<\/span><span class=\"mi\">401<\/span><span class=\"o\">,<\/span> <span class=\"no\">UNAUTHORIZED<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">isAllow<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">FaarmisException<\/span><span class=\"o\">(<\/span><span class=\"mi\">403<\/span><span class=\"o\">,<\/span> <span class=\"no\">FORBIDDEN<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n       <span class=\"nc\">String<\/span> <span class=\"n\">urlScheme<\/span> <span class=\"o\">=<\/span> <span class=\"n\">requestContext<\/span><span class=\"o\">.<\/span><span class=\"na\">getUriInfo<\/span><span class=\"o\">().<\/span><span class=\"na\">getBaseUri<\/span><span class=\"o\">().<\/span><span class=\"na\">getScheme<\/span><span class=\"o\">();<\/span> <span class=\"c1\">\/\/[3]<\/span>\n        <span class=\"nc\">AuthenticationContext<\/span> <span class=\"n\">authenticationContext<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">AuthenticationContext<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">,<\/span> <span class=\"n\">urlScheme<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">requestContext<\/span><span class=\"o\">.<\/span><span class=\"na\">setSecurityContext<\/span><span class=\"o\">(<\/span><span class=\"n\">authenticationContext<\/span><span class=\"o\">);<\/span>  <span class=\"c1\">\/\/[4]<\/span>\n   <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n\n<\/code><\/pre><\/div><\/div>\n\n<blockquote>\n  <p>\u0e42\u0e04\u0e49\u0e14\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e43\u0e2b\u0e49\u0e1e\u0e2d\u0e40\u0e2b\u0e47\u0e19 Concept \u0e19\u0e30\u0e04\u0e23\u0e31\u0e1a  Copy \u0e44\u0e1b\u0e43\u0e0a\u0e49\u0e40\u0e25\u0e22\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e19\u0e30<\/p>\n<\/blockquote>\n\n<p>\u0e21\u0e32\u0e14\u0e39\u0e01\u0e31\u0e19\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e1a\u0e49\u0e32\u0e07<\/p>\n\n<ol>\n  <li>\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e01\u0e48\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e21\u0e35\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e01\u0e32\u0e23\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e15\u0e31\u0e27\u0e15\u0e19\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e2b\u0e23\u0e37\u0e2d\u0e1b\u0e48\u0e32\u0e27 \u0e43\u0e19\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u0e43\u0e0a\u0e49 Basic Authentication  \u0e16\u0e49\u0e32\u0e44\u0e21\u0e48\u0e21\u0e35 filter \u0e2b\u0e22\u0e38\u0e14\u0e17\u0e33\u0e07\u0e32\u0e19\u0e40\u0e25\u0e22 \u0e0b\u0e36\u0e48\u0e07\u0e08\u0e30\u0e21\u0e35\u0e1c\u0e25\u0e43\u0e2b\u0e49 SecurityContext\n\u0e44\u0e21\u0e48\u0e21\u0e35\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2d\u0e30\u0e44\u0e23 Request \u0e19\u0e31\u0e49\u0e19\u0e01\u0e47\u0e08\u0e30\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e44\u0e14\u0e49\u0e41\u0e15\u0e48 endpoint \u0e44\u0e1b\u0e40\u0e1b\u0e47\u0e19 <code class=\"language-plaintext highlighter-rouge\">@PermitAll<\/code><\/li>\n  <li>\u0e40\u0e2d\u0e32\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e01\u0e32\u0e23\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e15\u0e31\u0e27\u0e15\u0e19\u0e44\u0e1b\u0e25\u0e2d\u0e07\u0e2b\u0e32\u0e43\u0e19\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e14\u0e39\u0e27\u0e48\u0e32\u0e40\u0e08\u0e2d\u0e44\u0e2b\u0e21 \u0e16\u0e49\u0e32\u0e44\u0e21\u0e48\u0e40\u0e08\u0e2d\u0e01\u0e47 Return 401 \u0e44\u0e1b\u0e40\u0e25\u0e22 \u0e2b\u0e23\u0e37\u0e2d\u0e16\u0e49\u0e32\u0e40\u0e08\u0e2d\u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48 user \u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e2d\u0e22\u0e32\u0e01\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e44\u0e14\u0e49\u0e40\u0e0a\u0e48\u0e19\u0e40\u0e1b\u0e47\u0e19 Blacklist\n\u0e40\u0e23\u0e32\u0e01\u0e47 return 403 \u0e44\u0e1b\u0e41\u0e17\u0e19<\/li>\n  <li>\u0e16\u0e49\u0e32\u0e1c\u0e48\u0e32\u0e19\u0e02\u0e49\u0e2d 2 \u0e21\u0e32\u0e01\u0e44\u0e14\u0e49 \u0e40\u0e23\u0e32\u0e08\u0e30\u0e40\u0e2d\u0e32\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e21\u0e32\u0e2a\u0e23\u0e49\u0e32\u0e07 <code class=\"language-plaintext highlighter-rouge\">SecurityContext<\/code><\/li>\n  <li>\u0e17\u0e33\u0e01\u0e32\u0e23 set \u0e04\u0e48\u0e32 <code class=\"language-plaintext highlighter-rouge\">SecurityContext<\/code> \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a Request \u0e19\u0e31\u0e49\u0e19 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e0a\u0e49\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e01\u0e31\u0e1a Security Annotation \u0e15\u0e48\u0e2d\u0e44\u0e1b<\/li>\n<\/ol>\n\n<p>\u0e2a\u0e31\u0e07\u0e40\u0e01\u0e15\u0e38 <code class=\"language-plaintext highlighter-rouge\">@Priority(1)<\/code> \u0e19\u0e30\u0e04\u0e23\u0e31\u0e1a \u0e40\u0e1b\u0e47\u0e19\u0e08\u0e38\u0e14\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e21\u0e32\u0e01\u0e46 \u0e16\u0e49\u0e32\u0e44\u0e21\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e44\u0e27\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e15\u0e48\u0e33\u0e46 filter \u0e19\u0e35\u0e49\u0e2d\u0e32\u0e08\u0e08\u0e30\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2b\u0e25\u0e31\u0e07 filter \u0e02\u0e2d\u0e07 Security Annotation\n\u0e0b\u0e36\u0e48\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e04\u0e27\u0e32\u0e21\u0e27\u0e48\u0e32\u0e15\u0e2d\u0e19\u0e19\u0e31\u0e49\u0e19\u0e08\u0e30\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35 <code class=\"language-plaintext highlighter-rouge\">SecurityContex<\/code> \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e21\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23  \u0e2a\u0e48\u0e27\u0e19 <code class=\"language-plaintext highlighter-rouge\">@Provider<\/code> \u0e08\u0e30\u0e0a\u0e48\u0e27\u0e22 Register filter \u0e19\u0e35\u0e49\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e43\u0e19\n<code class=\"language-plaintext highlighter-rouge\">ResourceConfig<\/code> \u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e17\u0e33\u0e44\u0e1b\u0e01\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e2d\u0e31\u0e15\u0e34\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34\u0e40\u0e25\u0e22 \u0e16\u0e49\u0e32\u0e2b\u0e32\u0e01\u0e2d\u0e22\u0e39\u0e48\u0e20\u0e32\u0e22\u0e43\u0e15\u0e49 package \u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e44\u0e27\u0e49\u0e43\u0e19 resource Config<\/p>\n\n<p>\u0e17\u0e35\u0e48\u0e19\u0e35\u0e49\u0e21\u0e32\u0e14\u0e39\u0e01\u0e32\u0e23\u0e2a\u0e23\u0e49\u0e32\u0e07 <code class=\"language-plaintext highlighter-rouge\">SecurityContext<\/code> \u0e01\u0e31\u0e19<\/p>\n\n<h3 id=\"security-context\">Security Context<\/h3>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AuthenticationContext<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">SecurityContext<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">HTTPS<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"https:\/\/\"<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">Principal<\/span> <span class=\"n\">userPrincipal<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">scheme<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">AuthenticationContext<\/span><span class=\"o\">(<\/span><span class=\"kd\">final<\/span> <span class=\"nc\">User<\/span> <span class=\"n\">user<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">scheme<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">userPrincipal<\/span> <span class=\"o\">=<\/span> <span class=\"o\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">getUsername<\/span><span class=\"o\">();<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">scheme<\/span> <span class=\"o\">=<\/span> <span class=\"n\">scheme<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n    <span class=\"nd\">@Override<\/span> <span class=\"kd\">public<\/span> <span class=\"nc\">Principal<\/span> <span class=\"nf\">getUserPrincipal<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">userPrincipal<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n    <span class=\"nd\">@Override<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isUserInRole<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">role<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"user\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">role<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n    <span class=\"nd\">@Override<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isSecure<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">scheme<\/span><span class=\"o\">.<\/span><span class=\"na\">startsWith<\/span><span class=\"o\">(<\/span><span class=\"no\">HTTPS<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n    <span class=\"nd\">@Override<\/span> <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">getAuthenticationScheme<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">BASIC_AUTH<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e40\u0e23\u0e32\u0e17\u0e33\u0e01\u0e32\u0e23\u0e2a\u0e23\u0e49\u0e32\u0e07 class \u0e17\u0e35\u0e48 implement interface <code class=\"language-plaintext highlighter-rouge\">SecurityContext<\/code> \u0e0b\u0e36\u0e48\u0e07\u0e08\u0e30\u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48 4 method \u0e14\u0e49\u0e27\u0e22\u0e01\u0e31\u0e19\u0e44\u0e14\u0e49\u0e41\u0e01\u0e48<\/p>\n\n<ul>\n  <li><code class=\"language-plaintext highlighter-rouge\">getUserPrincipal()<\/code> \u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32\u0e17\u0e33\u0e01\u0e32\u0e23 implement interface <code class=\"language-plaintext highlighter-rouge\">Principal<\/code> \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e04\u0e37\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e02\u0e2d\u0e07 user\n\u0e17\u0e35\u0e48 Request api \u0e40\u0e02\u0e49\u0e32\u0e21\u0e32 \u0e43\u0e19\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e1c\u0e21\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e08\u0e32\u0e01 <code class=\"language-plaintext highlighter-rouge\">getUsername()<\/code> \u0e02\u0e2d\u0e07 <code class=\"language-plaintext highlighter-rouge\">User<\/code><\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">isUserInRole(role)<\/code> \u0e19\u0e35\u0e49\u0e2b\u0e25\u0e30\u0e08\u0e38\u0e14\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e02\u0e2d\u0e07\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21\u0e19\u0e35\u0e49 \u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e2a\u0e48\u0e07\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e43\u0e19 method \u0e19\u0e35\u0e49\u0e08\u0e30\u0e44\u0e1b\u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19\nparameter \u0e02\u0e2d\u0e07 @RoleAllows \u0e16\u0e49\u0e32\u0e40\u0e23\u0e32 return true  Request \u0e01\u0e47\u0e08\u0e30\u0e44\u0e21\u0e48\u0e42\u0e14\u0e19\u0e41\u0e15\u0e30\u0e2d\u0e2d\u0e01<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">isSecure()<\/code> \u0e2d\u0e31\u0e19\u0e19\u0e35\u0e49 implement \u0e07\u0e48\u0e32\u0e22\u0e04\u0e23\u0e31\u0e1a \u0e40\u0e0a\u0e47\u0e04\u0e41\u0e04\u0e48\u0e27\u0e48\u0e32\u0e40\u0e1b\u0e47\u0e19 HTTPS \u0e23\u0e36\u0e40\u0e1b\u0e25\u0e48\u0e32\u0e1e\u0e2d<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">getAuthenticationScheme()<\/code> \u0e40\u0e23\u0e32\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e15\u0e31\u0e27\u0e15\u0e19\u0e14\u0e49\u0e27\u0e22\u0e27\u0e34\u0e18\u0e35\u0e44\u0e2b\u0e19\u0e01\u0e47\u0e23\u0e30\u0e1a\u0e38\u0e44\u0e1b \u0e40\u0e0a\u0e48\u0e19 BASIC OAUTH<\/li>\n<\/ul>\n\n<p>\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e01\u0e47\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 Security Annotation \u0e44\u0e14\u0e49 100% \u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49 Web.xml \u0e40\u0e25\u0e22\u0e04\u0e23\u0e31\u0e1a\n\u0e19\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e19\u0e31\u0e49\u0e19\u0e40\u0e23\u0e32\u0e22\u0e31\u0e07\u0e21\u0e35 SecurityContext \u0e44\u0e27\u0e49\u0e43\u0e0a\u0e49\u0e1b\u0e23\u0e30\u0e42\u0e22\u0e0a\u0e19\u0e4c\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e43\u0e19\u0e20\u0e32\u0e22\u0e2b\u0e25\u0e31\u0e07\u0e44\u0e14\u0e49\u0e19\u0e30 \u0e14\u0e39\u0e41\u0e25\u0e49\u0e27\u0e2d\u0e35\u0e01\u0e04\u0e38\u0e49\u0e21\u0e23\u0e36\u0e40\u0e1b\u0e25\u0e48\u0e32\u0e19\u0e49\u0e32\u0e32\u0e32~\n\u0e16\u0e49\u0e32\u0e21\u0e35\u0e2d\u0e30\u0e44\u0e23\u0e41\u0e19\u0e30\u0e19\u0e33 \u0e2d\u0e30\u0e44\u0e23\u0e1c\u0e34\u0e14 \u0e23\u0e39\u0e49\u0e27\u0e34\u0e18\u0e35\u0e17\u0e35\u0e48\u0e14\u0e35\u0e01\u0e27\u0e48\u0e32\u0e19\u0e35\u0e49 \u0e2b\u0e23\u0e37\u0e2d\u0e21\u0e35\u0e17\u0e32\u0e07\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e2d\u0e37\u0e48\u0e19\u0e01\u0e47\u0e21\u0e32\u0e41\u0e0a\u0e23\u0e4c\u0e01\u0e31\u0e19\u0e19\u0e30\u0e04\u0e23\u0e31\u0e1a<\/p>","author":{"name":"Blast Piruin Panichphol"},"category":[{"@attributes":{"term":"java"}},{"@attributes":{"term":"Jersey"}},{"@attributes":{"term":"Jetty"}},{"@attributes":{"term":"RESTful"}},{"@attributes":{"term":"jax-rs"}}],"summary":"\u0e01\u0e32\u0e23\u0e08\u0e30 Implement Security \u0e14\u0e49\u0e27\u0e22 Annotation \u0e15\u0e32\u0e21\u0e21\u0e32\u0e15\u0e23\u0e10\u0e32\u0e19 JAX-RS 2.0 \u0e1a\u0e19 Jersey \u0e43\u0e19 Document \u0e1a\u0e2d\u0e01\u0e43\u0e2b\u0e49\u0e17\u0e33 config \u0e17\u0e35\u0e48 web.xml \u0e41\u0e15\u0e48\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01\u0e1c\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e21\u0e37\u0e2d\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 Java Web Server \u0e1a\u0e2d\u0e01\u0e40\u0e25\u0e22\u0e27\u0e48\u0e32\u0e43\u0e0a\u0e49 web.xml \u0e44\u0e21\u0e48\u0e40\u0e1b\u0e47\u0e19 \u0e15\u0e31\u0e27 api \u0e17\u0e35\u0e48\u0e17\u0e33\u0e2d\u0e22\u0e39\u0e48\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e01\u0e47\u0e40\u0e1b\u0e47\u0e19 Jetty Embedded \u0e41\u0e25\u0e30\u0e14\u0e39\u0e41\u0e25\u0e49\u0e27\u0e01\u0e47\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e0a\u0e2d\u0e1a\u0e01\u0e32\u0e23 Config \u0e14\u0e49\u0e27\u0e22 code \u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 \u0e40\u0e25\u0e22\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e15\u0e49\u0e2d\u0e07\u0e27\u0e34\u0e18\u0e35\u0e40\u0e2d\u0e07 \u0e07\u0e07\u0e1a\u0e31\u0e04\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e15\u0e31\u0e49\u0e07\u0e19\u0e32\u0e19 \u0e2b\u0e38\u0e2b\u0e38"},{"title":"\u0e2a\u0e23\u0e38\u0e1b\u0e1c\u0e25\u0e01\u0e32\u0e23\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e40\u0e2d\u0e32\u0e0a\u0e19\u0e30 Page Insight \u0e41\u0e25\u0e30 Web Page Test","link":{"@attributes":{"href":"https:\/\/piruin.github.io\/blog\/how-to-win-google-page-insight\/","rel":"alternate","type":"text\/html","title":"\u0e2a\u0e23\u0e38\u0e1b\u0e1c\u0e25\u0e01\u0e32\u0e23\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e40\u0e2d\u0e32\u0e0a\u0e19\u0e30 Page Insight \u0e41\u0e25\u0e30 Web Page Test"}},"published":"2016-10-24T00:00:00+07:00","updated":"2016-10-24T00:00:00+07:00","id":"https:\/\/piruin.github.io\/blog\/how-to-win-google-page-insight","content":"<p>\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48\u0e40\u0e27\u0e47\u0e1b\u0e19\u0e35\u0e49\u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e39\u0e1b\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e48\u0e32\u0e07 \u0e1c\u0e21\u0e01\u0e47\u0e15\u0e31\u0e49\u0e07\u0e43\u0e08\u0e27\u0e48\u0e32\u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49 Performance \u0e14\u0e35\u0e46\u0e14\u0e49\u0e27\u0e22 \u0e40\u0e25\u0e22\u0e25\u0e2d\u0e07\u0e17\u0e14\u0e2a\u0e2d\u0e1a\u0e01\u0e31\u0e1a\nPage Insight \u0e41\u0e25\u0e30 Web Page Test \u0e14\u0e39 \u0e1b\u0e23\u0e32\u0e01\u0e0e\u0e27\u0e48\u0e32\u0e04\u0e30\u0e41\u0e19\u0e19\u0e44\u0e21\u0e48\u0e04\u0e48\u0e2d\u0e22\u0e19\u0e48\u0e32\u0e1e\u0e2d\u0e43\u0e08\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e01\u0e47\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e01\u0e49\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46\u0e08\u0e19\u0e44\u0e14\u0e49\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e19\u0e36\u0e07\n\u0e40\u0e25\u0e22\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e44\u0e27\u0e49\u0e01\u0e48\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e17\u0e33\u0e44\u0e1b\u0e1a\u0e49\u0e32\u0e07 \u0e41\u0e25\u0e30\u0e04\u0e27\u0e23\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e15\u0e48\u0e2d<\/p>\n\n<h2 id=\"cloudfare\">Cloudfare<\/h2>\n<p>\u0e21\u0e31\u0e19\u0e0a\u0e48\u0e27\u0e22\u0e44\u0e14\u0e49\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 Cache control \u0e44\u0e14\u0e49\u0e14\u0e35\u0e40\u0e25\u0e22 \u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e40\u0e2d\u0e07\u0e40\u0e25\u0e22\u0e04\u0e23\u0e31\u0e1a \u0e02\u0e2d\u0e07\u0e40\u0e04\u0e49\u0e32\u0e14\u0e35\u0e08\u0e23\u0e34\u0e07 \u0e41\u0e16\u0e21\u0e22\u0e31\u0e07\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e27\u0e47\u0e1b\u0e40\u0e1b\u0e47\u0e19\nhttps \u0e41\u0e1a\u0e1a\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e2a\u0e35\u0e22\u0e15\u0e31\u0e07\u0e04\u0e4c\u0e40\u0e25\u0e22 (\u0e2d\u0e30\u0e44\u0e23\u0e08\u0e30\u0e43\u0e08\u0e14\u0e35\u0e1b\u0e32\u0e19\u0e19\u0e31\u0e49\u0e19) \u0e19\u0e48\u0e32\u0e40\u0e2a\u0e35\u0e22\u0e44\u0e14\u0e49\u0e27\u0e48\u0e32\u0e25\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14 Feature minify html, css \u0e41\u0e25\u0e30 js\n\u0e41\u0e25\u0e49\u0e27\u0e44\u0e21\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e1c\u0e25\u0e01\u0e31\u0e1a Web \u0e17\u0e35\u0e48 Host \u0e1a\u0e19 Github Pages \u0e41\u0e2e\u0e30 \u0e44\u0e21\u0e48\u0e23\u0e39\u0e49\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e1c\u0e34\u0e14\u0e23\u0e36\u0e40\u0e1b\u0e25\u0e48\u0e32 \u0e41\u0e15\u0e48\u0e41\u0e04\u0e48\u0e19\u0e35\u0e49\u0e01\u0e47\u0e23\u0e31\u0e01\u0e41\u0e25\u0e49\u0e27\u0e2b\u0e25\u0e30\n\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e30\u0e41\u0e19\u0e19\u0e43\u0e2b\u0e49\u0e1c\u0e21\u0e44\u0e1b\u0e44\u0e14\u0e49\u0e40\u0e22\u0e2d\u0e30\u0e40\u0e25\u0e22<\/p>\n\n<p>\u0e41\u0e15\u0e48\u0e01\u0e32\u0e23\u0e15\u0e49\u0e2d\u0e07\u0e1e\u0e36\u0e48\u0e07\u0e1e\u0e32 Css Framework \u0e41\u0e25\u0e30 jQuery \u0e19\u0e35\u0e49\u0e2b\u0e25\u0e30\u0e1b\u0e31\u0e0d\u0e2b\u0e32<\/p>\n\n<h2 id=\"css\">CSS<\/h2>\n<p>\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 CSS \u0e17\u0e35\u0e48\u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e27\u0e47\u0e1b\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e\u0e14\u0e35\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e04\u0e37\u0e2d\u0e01\u0e32\u0e23 Inline style\n\u0e43\u0e0a\u0e48\u0e41\u0e25\u0e49\u0e27\u0e22\u0e31\u0e14\u0e44\u0e1b\u0e43\u0e19 tag style \u0e20\u0e32\u0e22\u0e43\u0e15\u0e49\u0e0a\u0e48\u0e27\u0e07 head \u0e40\u0e25\u0e22\n\u0e41\u0e15\u0e48 Bootstrap \u0e21\u0e31\u0e19\u0e43\u0e2b\u0e0d\u0e48\u0e21\u0e32\u0e01\u0e40\u0e25\u0e22\u0e19\u0e30\u0e08\u0e30\u0e22\u0e31\u0e14\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e43\u0e19 Head \u0e08\u0e23\u0e34\u0e07\u0e46\u0e2b\u0e23\u0e2d\n\u0e19\u0e31\u0e49\u0e19\u0e2b\u0e25\u0e30\u0e04\u0e23\u0e31\u0e1a\u0e1b\u0e31\u0e0d\u0e2b\u0e32  CSS Framework \u0e2a\u0e48\u0e27\u0e19\u0e43\u0e2b\u0e0d\u0e48\u0e21\u0e31\u0e01\u0e40\u0e22\u0e2d\u0e30\u0e40\u0e01\u0e34\u0e19\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32<\/p>\n\n<p>\u0e27\u0e34\u0e18\u0e35\u0e41\u0e01\u0e49\u0e04\u0e37\u0e2d<\/p>\n\n<h3 id=\"1-\u0e42\u0e2b\u0e25\u0e14\u0e41\u0e1a\u0e1a-css-async\">1. \u0e42\u0e2b\u0e25\u0e14\u0e41\u0e1a\u0e1a CSS Async<\/h3>\n\n<p>\u0e27\u0e34\u0e18\u0e35\u0e19\u0e35\u0e49\u0e0a\u0e48\u0e27\u0e22\u0e43\u0e2b\u0e49 PageInsight \u0e41\u0e25\u0e30 WebPageTest \u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e40\u0e23\u0e32\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 block \u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\n\u0e41\u0e15\u0e48\u0e41\u0e25\u0e01\u0e21\u0e32\u0e14\u0e49\u0e27\u0e22 user \u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e23\u0e32\u0e41\u0e1a\u0e1a Plain\u0e46 \u0e44\u0e21\u0e48\u0e21\u0e35 style \u0e01\u0e48\u0e2d\u0e19\u0e41\u0e1b\u0e4a\u0e1a\u0e19\u0e36\u0e07\n\u0e41\u0e15\u0e48\u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e17\u0e35\u0e48\u0e40\u0e02\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a\u0e40\u0e23\u0e32\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e23\u0e01 \u0e27\u0e34\u0e18\u0e35\u0e19\u0e35\u0e49\u0e07\u0e48\u0e32\u0e22\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e30<\/p>\n\n<h3 id=\"2-inline-ccs-style-\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\">2. Inline CCS Style \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14<\/h3>\n\n<p>\u0e1d\u0e31\u0e07\u0e2a\u0e44\u0e04\u0e25\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e44\u0e1b\u0e40\u0e25\u0e22 \u0e27\u0e34\u0e18\u0e35\u0e19\u0e35\u0e49 User \u0e08\u0e30\u0e44\u0e21\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e0a\u0e48\u0e27\u0e07\u0e17\u0e35\u0e48\u0e40\u0e27\u0e47\u0e1b\u0e40\u0e23\u0e32\u0e44\u0e21\u0e48\u0e2a\u0e27\u0e22\u0e40\u0e25\u0e22\n\u0e44\u0e21\u0e48\u0e42\u0e14\u0e19\u0e27\u0e48\u0e32\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 CSS \u0e44\u0e1b Block \u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\u0e40\u0e0a\u0e48\u0e19\u0e01\u0e31\u0e19 \u0e41\u0e15\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e30\u0e27\u0e31\u0e07\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e02\u0e19\u0e32\u0e14\u0e02\u0e2d\u0e07 Html\n\u0e01\u0e32\u0e23\u0e08\u0e30\u0e22\u0e31\u0e14\u0e17\u0e31\u0e49\u0e07 Bootstrap \u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e43\u0e19 &lt;head&gt; \u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e17\u0e38\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1b\u0e0a\u0e49\u0e32\u0e41\u0e17\u0e19<\/p>\n\n<p>\u0e16\u0e49\u0e32\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e27\u0e34\u0e18\u0e35\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e08\u0e30\u0e04\u0e31\u0e14\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e1a\u0e32\u0e07\u0e2a\u0e48\u0e27\u0e19\u0e02\u0e2d\u0e07 Framework \u0e40\u0e2d\u0e32\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e43\u0e0a\u0e49\n\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e21\u0e31\u0e19\u0e40\u0e25\u0e47\u0e01\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e2d\u0e32\u0e44\u0e1b\u0e22\u0e31\u0e14\u0e41\u0e1a\u0e1a inline \u0e2b\u0e23\u0e37\u0e2d\n\u0e04\u0e38\u0e13\u0e2d\u0e32\u0e08\u0e08\u0e30\u0e2b\u0e32 CSS Framework \u0e40\u0e08\u0e49\u0e32\u0e43\u0e2b\u0e21\u0e48\u0e17\u0e35\u0e48\u0e40\u0e25\u0e47\u0e01\u0e2b\u0e19\u0e48\u0e2d\u0e22\u0e21\u0e35\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e43\u0e0a\u0e49 \u0e21\u0e32\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e40\u0e25\u0e22<\/p>\n\n<h3 id=\"3-inline-\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e25\u0e31\u0e01-\u0e41\u0e25\u0e30\u0e42\u0e2b\u0e25\u0e14-css-\u0e2b\u0e25\u0e31\u0e01\u0e41\u0e1a\u0e1a-async\">3. Inline \u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e25\u0e31\u0e01 \u0e41\u0e25\u0e30\u0e42\u0e2b\u0e25\u0e14 CSS \u0e2b\u0e25\u0e31\u0e01\u0e41\u0e1a\u0e1a Async<\/h3>\n\n<p>\u0e04\u0e31\u0e14\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e2a\u0e48\u0e27\u0e19\u0e40\u0e25\u0e47\u0e01\u0e43\u0e2b\u0e49\u0e40\u0e27\u0e47\u0e1b\u0e44\u0e21\u0e48\u0e14\u0e39\u0e19\u0e48\u0e32\u0e40\u0e01\u0e25\u0e35\u0e22\u0e14 \u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e23\u0e2d CSS \u0e02\u0e2d\u0e07\u0e08\u0e23\u0e34\u0e07\u0e42\u0e2b\u0e25\u0e14\n\u0e22\u0e31\u0e07\u0e01\u0e47\u0e2d\u0e22\u0e48\u0e32\u0e25\u0e37\u0e21\u0e25\u0e14\u0e02\u0e19\u0e32\u0e14 CSS \u0e2b\u0e25\u0e31\u0e01\u0e43\u0e2b\u0e49\u0e40\u0e25\u0e47\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e14\u0e49\u0e27\u0e22\u0e19\u0e30\u0e04\u0e23\u0e31\u0e1a \u0e43\u0e0a\u0e49\u0e41\u0e23\u0e07\u0e40\u0e22\u0e2d\u0e30\u0e2b\u0e19\u0e48\u0e2d\u0e22\u0e44\u0e14\u0e49\u0e44\u0e14\u0e49\u0e1c\u0e25\u0e14\u0e35\u0e19\u0e30<\/p>\n\n<blockquote>\n  <p>\u0e25\u0e2d\u0e07\u0e14\u0e39\u0e27\u0e48\u0e32\u0e41\u0e1a\u0e1a\u0e44\u0e2b\u0e19\u0e08\u0e30\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e01\u0e31\u0e1a\u0e07\u0e32\u0e19 \u0e41\u0e25\u0e30\u0e04\u0e27\u0e32\u0e21\u0e02\u0e22\u0e31\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14<\/p>\n<\/blockquote>\n\n<h2 id=\"javascript\">JavaScript<\/h2>\n\n<p>\u0e16\u0e49\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1b\u0e44\u0e14\u0e49\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e2d\u0e22\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e40\u0e22\u0e2d\u0e30 \u0e42\u0e14\u0e19\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e01\u0e31\u0e1a\u0e40\u0e27\u0e47\u0e1b Blog \u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b \u0e2b\u0e23\u0e37\u0e2d\u0e16\u0e49\u0e32\u0e08\u0e30\u0e43\u0e0a\u0e49\n\u0e43\u0e2b\u0e49\u0e42\u0e2b\u0e25\u0e14\u0e41\u0e1a\u0e1a Async \u0e41\u0e15\u0e48\u0e23\u0e30\u0e27\u0e31\u0e07\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 Dependency \u0e02\u0e2d\u0e07 JS \u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01\n\u0e2a\u0e48\u0e27\u0e19\u0e43\u0e2b\u0e0d\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49 JQuery \u0e41\u0e15\u0e48\u0e21\u0e31\u0e19\u0e43\u0e2b\u0e0d\u0e48\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e42\u0e2b\u0e25\u0e14 Async \u0e41\u0e25\u0e49\u0e27\u0e21\u0e35\u0e2d\u0e35\u0e01 Script \u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\n\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49 jQuery \u0e07\u0e32\u0e19\u0e08\u0e30\u0e07\u0e2d\u0e01\u0e17\u0e31\u0e19\u0e17\u0e35<\/p>\n\n<h3 id=\"\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49-js-\u0e08\u0e23\u0e34\u0e07\u0e23\u0e36\u0e40\u0e1b\u0e25\u0e48\u0e32\">\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49 JS \u0e08\u0e23\u0e34\u0e07\u0e23\u0e36\u0e40\u0e1b\u0e25\u0e48\u0e32?<\/h3>\n\n<p>\u0e15\u0e2d\u0e1a\u0e04\u0e33\u0e16\u0e32\u0e21\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e49\u0e44\u0e14\u0e49\u0e01\u0e48\u0e2d\u0e19 \u0e04\u0e48\u0e2d\u0e22\u0e17\u0e33\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2d\u0e37\u0e48\u0e19\u0e46 \u0e16\u0e49\u0e32\u0e04\u0e33\u0e15\u0e2d\u0e1a\u0e04\u0e37\u0e2d\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e47\u0e2a\u0e1a\u0e32\u0e22\u0e40\u0e25\u0e22 \u0e25\u0e1a\u0e2d\u0e2d\u0e01\u0e43\u0e2b\u0e49\u0e2b\u0e21\u0e14\u0e42\u0e25\u0e49\u0e14<\/p>\n\n<h3 id=\"\u0e42\u0e2b\u0e25\u0e14-async-\u0e43\u0e2b\u0e49\u0e2b\u0e21\u0e14\">\u0e42\u0e2b\u0e25\u0e14 Async \u0e43\u0e2b\u0e49\u0e2b\u0e21\u0e14<\/h3>\n\n<p>\u0e21\u0e35 Snippet \u0e17\u0e35\u0e48\u0e0a\u0e48\u0e27\u0e22\u0e43\u0e2b\u0e49\u0e42\u0e2b\u0e25\u0e14 js \u0e41\u0e1a\u0e1a Async \u0e42\u0e14\u0e22\u0e17\u0e35\u0e48\u0e22\u0e31\u0e07\u0e17\u0e33\u0e07\u0e32\u0e19\u0e15\u0e32\u0e21\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48 \u0e25\u0e2d\u0e07\u0e2b\u0e32\u0e14\u0e39\u0e04\u0e23\u0e31\u0e1a\n\u0e08\u0e23\u0e34\u0e07\u0e46\u0e1c\u0e21\u0e2b\u0e32\u0e40\u0e08\u0e2d\u0e41\u0e25\u0e49\u0e27\u0e41\u0e15\u0e48\u0e1c\u0e21\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49 Save \u0e44\u0e27\u0e49 \u0e15\u0e49\u0e2d\u0e07\u0e44\u0e27\u0e49\u0e02\u0e2d\u0e2d\u0e20\u0e31\u0e22\u0e15\u0e48\u0e2d\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e41\u0e25\u0e30\u0e1c\u0e39\u0e49\u0e2d\u0e48\u0e32\u0e19\u0e14\u0e49\u0e27\u0e22 \u0e43\u0e04\u0e23\u0e2b\u0e32\u0e40\u0e08\u0e2d\u0e1a\u0e2d\u0e01\u0e14\u0e49\u0e27\u0e22\u0e19\u0e30<\/p>\n\n<h2 id=\"\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e\">\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e<\/h2>\n<p>\u0e15\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e25\u0e14\u0e02\u0e19\u0e32\u0e14 Css Js \u0e43\u0e2b\u0e49\u0e15\u0e32\u0e22\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e22\u0e31\u0e07\u0e21\u0e31\u0e19\u0e01\u0e47\u0e44\u0e21\u0e48\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e42\u0e2b\u0e25\u0e14\u0e20\u0e32\u0e1e 1 \u0e20\u0e32\u0e1e\u0e40\u0e25\u0e22\u0e04\u0e23\u0e31\u0e1a \u0e09\u0e30\u0e19\u0e31\u0e49\u0e19\u0e2d\u0e22\u0e48\u0e32\u0e25\u0e37\u0e2d\u0e27\u0e48\u0e32\n\u0e01\u0e32\u0e23 Optimize \u0e20\u0e32\u0e1e\u0e40\u0e1b\u0e47\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e21\u0e32\u0e01\u0e46\u0e46\u0e46 \u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49\u0e20\u0e32\u0e1e\u0e17\u0e35\u0e48 Resolution \u0e40\u0e2b\u0e21\u0e32\u0e30\u0e01\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e08\u0e23\u0e34\u0e07 \u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e43\u0e2b\u0e0d\u0e48\u0e40\u0e27\u0e48\u0e2d\u0e23\u0e4c\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\n\u0e41\u0e25\u0e30\u0e01\u0e47 Compress \u0e43\u0e2b\u0e44\u0e14\u0e49\u0e44\u0e1f\u0e25\u0e4c\u0e17\u0e35\u0e48\u0e40\u0e25\u0e47\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e40\u0e2a\u0e35\u0e22\u0e25\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e44\u0e1b \u0e25\u0e2d\u0e07\u0e43\u0e0a\u0e49 Online Tool \u0e07\u0e48\u0e32\u0e22\u0e46\u0e2d\u0e22\u0e48\u0e32\u0e07 TinyPNG \u0e14\u0e39\u0e01\u0e47\u0e44\u0e14\u0e49\u0e04\u0e23\u0e31\u0e1a<\/p>\n\n<p>\u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e02\u0e35\u0e49\u0e40\u0e01\u0e35\u0e22\u0e08\u0e41\u0e15\u0e48\u0e2d\u0e22\u0e32\u0e01\u0e44\u0e14\u0e49\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e17\u0e35\u0e48\u0e14\u0e35 \u0e17\u0e32\u0e07\u0e2d\u0e2d\u0e01\u0e17\u0e35\u0e48\u0e14\u0e35\u0e2d\u0e35\u0e01\u0e17\u0e32\u0e07\u0e04\u0e37\u0e2d\u0e43\u0e0a\u0e49 Tool \u0e17\u0e35\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e0a\u0e48\u0e27\u0e22 Optimize \u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e20\u0e32\u0e1e\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e44\u0e14\u0e49\u0e41\u0e1a\u0e1a Automate\n\u0e2d\u0e22\u0e48\u0e32\u0e07 Grunt \u0e2b\u0e23\u0e37\u0e2d Gulp \u0e01\u0e47\u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e0a\u0e35\u0e27\u0e34\u0e15\u0e07\u0e48\u0e32\u0e22\u0e02\u0e36\u0e49\u0e19 (\u0e23\u0e27\u0e21\u0e44\u0e1b\u0e16\u0e36\u0e07 minify css js \u0e40\u0e25\u0e22\u0e19\u0e30)<\/p>\n\n<h2 id=\"\u0e2a\u0e23\u0e38\u0e1b\">\u0e2a\u0e23\u0e38\u0e1b<\/h2>\n\n<p>\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e2d\u0e2d\u0e01\u0e41\u0e1a\u0e1a\u0e40\u0e27\u0e47\u0e1b\u0e43\u0e2b\u0e49\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e07\u0e48\u0e32\u0e22\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14 \u0e08\u0e30\u0e25\u0e14\u0e07\u0e32\u0e19\u0e04\u0e38\u0e13\u0e44\u0e1b\u0e44\u0e14\u0e49\u0e21\u0e32\u0e01\n\u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e44\u0e21\u0e48\u0e0a\u0e2d\u0e1a\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e2b\u0e32\u0e27\u0e34\u0e18\u0e35\u0e41\u0e01\u0e49\u0e01\u0e31\u0e19\u0e15\u0e48\u0e2d\u0e44\u0e1b \u0e2b\u0e23\u0e37\u0e2d\u0e08\u0e30\u0e44\u0e21\u0e48\u0e41\u0e01\u0e49\u0e01\u0e47\u0e44\u0e14\u0e49\u0e19\u0e30<\/p>\n\n<p>\u0e22\u0e31\u0e07\u0e44\u0e07\u0e0b\u0e30 User \u0e44\u0e21\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e02\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1b\u0e40\u0e23\u0e32\u0e08\u0e32\u0e01\u0e04\u0e30\u0e41\u0e19\u0e19\u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e08\u0e32\u0e01 Page Insight \u0e2b\u0e23\u0e2d\u0e01 (\u0e41\u0e15\u0e48 Google \u0e40\u0e25\u0e37\u0e2d\u0e01\u0e21\u0e35\u0e48\u0e08\u0e30\u0e41\u0e19\u0e30\u0e19\u0e33\u0e04\u0e38\u0e13\u0e08\u0e32\u0e01\u0e04\u0e30\u0e41\u0e19\u0e19\u0e19\u0e30)<\/p>","author":{"name":"Blast Piruin Panichphol"},"category":{"@attributes":{"term":"general"}},"summary":"\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48\u0e40\u0e27\u0e47\u0e1b\u0e19\u0e35\u0e49\u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e39\u0e1b\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e48\u0e32\u0e07 \u0e1c\u0e21\u0e01\u0e47\u0e15\u0e31\u0e49\u0e07\u0e43\u0e08\u0e27\u0e48\u0e32\u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49 Performance \u0e14\u0e35\u0e46\u0e14\u0e49\u0e27\u0e22 \u0e40\u0e25\u0e22\u0e25\u0e2d\u0e07\u0e17\u0e14\u0e2a\u0e2d\u0e1a\u0e01\u0e31\u0e1a Page Insight \u0e41\u0e25\u0e30 Web Page Test \u0e14\u0e39 \u0e1b\u0e23\u0e32\u0e01\u0e0e\u0e27\u0e48\u0e32\u0e04\u0e30\u0e41\u0e19\u0e19\u0e44\u0e21\u0e48\u0e04\u0e48\u0e2d\u0e22\u0e19\u0e48\u0e32\u0e1e\u0e2d\u0e43\u0e08\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e01\u0e47\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e01\u0e49\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46\u0e08\u0e19\u0e44\u0e14\u0e49\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e19\u0e36\u0e07 \u0e40\u0e25\u0e22\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e44\u0e27\u0e49\u0e01\u0e48\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e17\u0e33\u0e44\u0e1b\u0e1a\u0e49\u0e32\u0e07 \u0e41\u0e25\u0e30\u0e04\u0e27\u0e23\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e15\u0e48\u0e2d"},{"title":"Tutorial RESTFul Service by Jersey and Jetty Embedding","link":{"@attributes":{"href":"https:\/\/piruin.github.io\/blog\/jersey-jetty-tutorial\/","rel":"alternate","type":"text\/html","title":"Tutorial RESTFul Service by Jersey and Jetty Embedding"}},"published":"2016-10-14T00:00:00+07:00","updated":"2016-10-14T00:00:00+07:00","id":"https:\/\/piruin.github.io\/blog\/jersey-jetty-tutorial","content":"<p>\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e08\u0e30 setup RESTFul service \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 Jersey \u0e41\u0e25\u0e30 Jetty \u0e41\u0e1a\u0e1a Embedded \u0e01\u0e31\u0e19\u0e41\u0e1a\u0e1a\u0e07\u0e48\u0e32\u0e22\u0e46 \u0e42\u0e14\u0e22 Service \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e04\u0e37\u0e19 POJO \u0e40\u0e1b\u0e47\u0e19 \u0e40\u0e1b\u0e47\u0e19 JSON \u0e2d\u0e31\u0e1e\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34\u0e14\u0e49\u0e27\u0e22 Jackson \u0e44\u0e14\u0e49\u0e14\u0e49\u0e27\u0e22<\/p>\n\n<blockquote>\n  <p>Project \u0e19\u0e35\u0e49\u0e1c\u0e21\u0e43\u0e0a\u0e49 Gradle \u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27 Build \u0e19\u0e30\u0e04\u0e23\u0e31\u0e1a \u0e16\u0e49\u0e32\u0e43\u0e0a\u0e49 Maven \u0e01\u0e47\u0e25\u0e2d\u0e07\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e14\u0e39\u0e04\u0e23\u0e31\u0e1a \u0e15\u0e48\u0e32\u0e07\u0e01\u0e31\u0e19\u0e41\u0e04\u0e48\u0e15\u0e23\u0e07\u0e1b\u0e23\u0e30\u0e01\u0e32\u0e28 dependency<\/p>\n<\/blockquote>\n\n<h2 id=\"\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e41\u0e1a\u0e1a-basic\">\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e41\u0e1a\u0e1a Basic<\/h2>\n\n<p>\u0e40\u0e23\u0e34\u0e48\u0e21\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e01\u0e33\u0e2b\u0e19\u0e14 Dependency \u0e43\u0e19 <code class=\"language-plaintext highlighter-rouge\">build.gradle<\/code> \u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e32\u0e21\u0e19\u0e35\u0e49<\/p>\n\n<div class=\"language-groovy highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">dependencies<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kt\">def<\/span> <span class=\"n\">jettyVersion<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"9.3.12.v20160915\"<\/span>\n    <span class=\"kt\">def<\/span> <span class=\"n\">jerseyVersion<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"2.23.2\"<\/span>\n\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.eclipse.jetty:jetty-server:$jettyVersion\"<\/span>\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.eclipse.jetty:jetty-servlet:$jettyVersion\"<\/span>\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.eclipse.jetty:jetty-http:$jettyVersion\"<\/span>\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.glassfish.jersey.containers:jersey-container-servlet-core:$jerseyVersion\"<\/span>\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.glassfish.jersey.containers:jersey-container-jetty-servlet:$jerseyVersion\"<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e01\u0e33\u0e2b\u0e19\u0e14 Dependency \u0e41\u0e25\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23 Sync Gradle \u0e43\u0e2b\u0e21\u0e48\u0e41\u0e25\u0e49\u0e27  \u0e40\u0e23\u0e32\u0e08\u0e30\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e2d\u0e49\u0e32\u0e07\u0e16\u0e36\u0e07 Class \u0e15\u0e48\u0e32\u0e07\u0e46\u0e02\u0e2d\u0e07 Jetty \u0e41\u0e25\u0e30 Jersey \u0e44\u0e14\u0e49\u0e41\u0e25\u0e49\u0e27<\/p>\n\n<p>\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e40\u0e23\u0e32\u0e08\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32 start server \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e17\u0e33\u0e01\u0e32\u0e23 execute .jar<\/p>\n\n<p>\u0e17\u0e35\u0e48 Class \u0e2b\u0e25\u0e31\u0e01\u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32 \u0e2b\u0e23\u0e37\u0e2d\u0e01\u0e47\u0e04\u0e37\u0e2d class \u0e17\u0e35\u0e48\u0e21\u0e35 <code class=\"language-plaintext highlighter-rouge\">public void main(String[] args)<\/code> \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e04\u0e49\u0e14\u0e14\u0e31\u0e07\u0e19\u0e35\u0e49<\/p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">){<\/span>\n    <span class=\"nc\">Server<\/span> <span class=\"n\">server<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Server<\/span><span class=\"o\">(<\/span><span class=\"mi\">2222<\/span><span class=\"o\">);<\/span>\n    <span class=\"nc\">ServletContextHandler<\/span> <span class=\"n\">context<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ServletContextHandler<\/span><span class=\"o\">(<\/span><span class=\"n\">server<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\/*\"<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"nc\">ServletHolder<\/span> <span class=\"n\">jersey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ServletHolder<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">ServletContainer<\/span><span class=\"o\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">));<\/span>\n    <span class=\"n\">jersey<\/span><span class=\"o\">.<\/span><span class=\"na\">setInitOrder<\/span><span class=\"o\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">);<\/span>\n    <span class=\"n\">jersey<\/span><span class=\"o\">.<\/span><span class=\"na\">setInitParameter<\/span><span class=\"o\">(<\/span><span class=\"s\">\"jersey.config.server.provider.classnames\"<\/span><span class=\"o\">,<\/span>\n        <span class=\"nc\">SayHello<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">.<\/span><span class=\"na\">getCanonicalName<\/span><span class=\"o\">());<\/span>\n    <span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"na\">addServlet<\/span><span class=\"o\">(<\/span><span class=\"n\">jersey<\/span> <span class=\"o\">,<\/span> <span class=\"s\">\"\/*\"<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"na\">join<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span> <span class=\"n\">finnaly<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"na\">destroy<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e41\u0e25\u0e30\u0e40\u0e1e\u0e34\u0e48\u0e21 class \u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27 Service \u0e08\u0e23\u0e34\u0e07\u0e46 \u0e43\u0e19\u0e17\u0e35\u0e48\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e08\u0e30\u0e2a\u0e23\u0e49\u0e32\u0e07 <code class=\"language-plaintext highlighter-rouge\">SayHello.class<\/code> \u0e21\u0e35\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e32\u0e14\u0e31\u0e07\u0e19\u0e35\u0e49<\/p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SayHello<\/span><span class=\"o\">{<\/span>\n\n     <span class=\"nd\">@GET<\/span>\n     <span class=\"nd\">@Path<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/say\"<\/span><span class=\"o\">)<\/span>\n     <span class=\"nd\">@Produces<\/span><span class=\"o\">(<\/span><span class=\"s\">\"text\/plain\"<\/span><span class=\"o\">)<\/span>\n     <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">say<\/span><span class=\"o\">(){<\/span>\n          <span class=\"k\">return<\/span> <span class=\"s\">\"Hello\"<\/span>\n     <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e17\u0e35\u0e48\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e01\u0e47 Start server \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e44\u0e14\u0e49\u0e40\u0e25\u0e22 \u0e25\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14 Browser \u0e41\u0e25\u0e49\u0e27\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">localhost:2222\/say<\/code> \u0e40\u0e23\u0e32\u0e08\u0e30\u0e40\u0e08\u0e2d\u0e02\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e27\u0e48\u0e32 <code class=\"language-plaintext highlighter-rouge\">hello<\/code><\/p>\n\n<h2 id=\"\u0e21\u0e35-servlet-\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32-1-class\">\u0e21\u0e35 Servlet \u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 1 class<\/h2>\n<p>\u0e43\u0e19\u0e0a\u0e35\u0e27\u0e34\u0e15\u0e08\u0e23\u0e34\u0e07 Service \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 1 class \u0e41\u0e19\u0e48\u0e19\u0e2d\u0e19 \u0e04\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e43\u0e04\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19 Service \u0e08\u0e23\u0e34\u0e07\u0e46 \u0e43\u0e2b\u0e49\u0e08\u0e1a\u0e43\u0e19 Class \u0e40\u0e14\u0e35\u0e22\u0e27\u0e08\u0e23\u0e34\u0e07\u0e44\u0e2b\u0e21? \u0e2b\u0e23\u0e37\u0e2d\u0e27\u0e48\u0e32\u0e21\u0e35?<\/p>\n\n<p>\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e04\u0e37\u0e2d\u0e44\u0e1b\u0e17\u0e35\u0e48 Main Class \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e41\u0e25\u0e49\u0e27\u0e41\u0e01\u0e49\u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e14\u0e31\u0e07\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e19\u0e35\u0e49<\/p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">){<\/span>\n    <span class=\"nc\">Server<\/span> <span class=\"n\">server<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Server<\/span><span class=\"o\">(<\/span><span class=\"mi\">2222<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"nc\">ServletHolder<\/span> <span class=\"n\">jersey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ServletHolder<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">ServletContainer<\/span><span class=\"o\">());<\/span>\n    <span class=\"n\">jersey<\/span><span class=\"o\">.<\/span><span class=\"na\">setInitOrder<\/span><span class=\"o\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">);<\/span>\n    <span class=\"n\">jersey<\/span><span class=\"o\">.<\/span><span class=\"na\">setInitParameter<\/span><span class=\"o\">(<\/span><span class=\"s\">\"jersey.config.server.provider.classnames\"<\/span><span class=\"o\">,<\/span>\n        <span class=\"nc\">String<\/span><span class=\"o\">.<\/span><span class=\"na\">join<\/span><span class=\"o\">(<\/span><span class=\"s\">\", \"<\/span><span class=\"o\">,<\/span>\n              <span class=\"nc\">SayHello<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">.<\/span><span class=\"na\">getCanonicalName<\/span><span class=\"o\">(),<\/span>\n              <span class=\"nc\">Second<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">.<\/span><span class=\"na\">getConicalName<\/span><span class=\"o\">(),<\/span>\n              <span class=\"nc\">Third<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">.<\/span><span class=\"na\">getConicalName<\/span><span class=\"o\">())<\/span>\n        <span class=\"o\">);<\/span>\n\n    <span class=\"nc\">ServletContextHandler<\/span> <span class=\"n\">context<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ServletContextHandler<\/span><span class=\"o\">(<\/span><span class=\"n\">server<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\/*\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"na\">addServlet<\/span><span class=\"o\">(<\/span><span class=\"n\">jersey<\/span> <span class=\"o\">,<\/span> <span class=\"s\">\"\/*\"<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"na\">join<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span> <span class=\"n\">finnaly<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"na\">destroy<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e2a\u0e31\u0e07\u0e40\u0e01\u0e15\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07\u0e43\u0e19\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e17\u0e35\u0e48 7-11 \u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e08\u0e30\u0e2a\u0e48\u0e07\u0e0a\u0e37\u0e48\u0e2d class \u0e44\u0e1b class \u0e40\u0e14\u0e35\u0e22\u0e27 \u0e40\u0e23\u0e32\u0e40\u0e2d\u0e32\u0e21\u0e31\u0e19\u0e21\u0e32\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e01\u0e31\u0e19\u0e42\u0e14\u0e22\u0e02\u0e31\u0e49\u0e19\u0e14\u0e49\u0e27\u0e22 <code class=\"language-plaintext highlighter-rouge\">,<\/code> \u0e41\u0e17\u0e19\n\u0e17\u0e35\u0e19\u0e35\u0e49\u0e08\u0e30\u0e21\u0e35\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e01\u0e35\u0e48 class \u0e01\u0e47 comma \u0e41\u0e25\u0e49\u0e27\u0e43\u0e2a\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46\u0e44\u0e14\u0e49\u0e40\u0e25\u0e22<\/p>\n\n<h2 id=\"return-\u0e40\u0e1b\u0e47\u0e19-json-\u0e14\u0e49\u0e27\u0e22-jackson-media\">Return \u0e40\u0e1b\u0e47\u0e19 JSON \u0e14\u0e49\u0e27\u0e22 Jackson Media<\/h2>\n<p>\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 Response \u0e41\u0e1a\u0e1a <code class=\"language-plaintext highlighter-rouge\">application\/json<\/code> \u0e08\u0e32\u0e01 POJO \u0e40\u0e23\u0e32\u0e01\u0e47\u0e17\u0e33\u0e14\u0e31\u0e07\u0e19\u0e35\u0e49<\/p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">JsonResource<\/span><span class=\"o\">{<\/span>\n\n     <span class=\"nd\">@GET<\/span>\n     <span class=\"nd\">@Path<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/josn\"<\/span><span class=\"o\">)<\/span>\n     <span class=\"nd\">@Produces<\/span><span class=\"o\">(<\/span><span class=\"s\">\"application\/json\"<\/span><span class=\"o\">)<\/span>\n     <span class=\"kd\">public<\/span> <span class=\"nc\">Entity<\/span> <span class=\"nf\">fromPojo<\/span><span class=\"o\">(){<\/span>\n          <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">Entity<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Say hi, Json\"<\/span><span class=\"o\">);<\/span>\n     <span class=\"o\">}<\/span>\n\n     <span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Entity<\/span><span class=\"o\">{<\/span>\n          <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">message<\/span><span class=\"o\">;<\/span>\n\n          <span class=\"kd\">public<\/span> <span class=\"nf\">Entity<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">msg<\/span><span class=\"o\">){<\/span>\n              <span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"o\">;<\/span>\n          <span class=\"o\">}<\/span>\n     <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e08\u0e23\u0e34\u0e07\u0e46\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e31\u0e19\u0e04\u0e27\u0e23\u0e08\u0e1a\u0e07\u0e48\u0e32\u0e22\u0e46\u0e41\u0e04\u0e48\u0e19\u0e35\u0e49 \u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e25\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e01 Service \u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e08\u0e30\u0e1e\u0e1a Internal Server Error\n\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e0a\u0e48\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e1b\u0e47\u0e19\u0e40\u0e1e\u0e23\u0e32\u0e30\u0e27\u0e48\u0e32\u0e40\u0e23\u0e32\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07 Register Feature \u0e01\u0e32\u0e23\u0e41\u0e1b\u0e25\u0e07 POJO \u0e40\u0e1b\u0e47\u0e19 Json \u0e43\u0e2b\u0e49\u0e15\u0e31\u0e27 Jersey \u0e23\u0e39\u0e49\u0e01\u0e48\u0e2d\u0e19 \u0e14\u0e31\u0e07\u0e19\u0e35\u0e49<\/p>\n\n<p>\u0e17\u0e35\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e21 Depdency <code class=\"language-plaintext highlighter-rouge\">jersey-media-json-jackson<\/code> \u0e17\u0e35\u0e48 build.gradle<\/p>\n\n<div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>compile \"org.glassfish.jersey.media:jersey-media-json-jackson:$jerseyVersion\"\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e41\u0e25\u0e30\u0e17\u0e35\u0e48 main \u0e01\u0e48\u0e2d\u0e19 start server \u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e14\u0e31\u0e07\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e19\u0e35\u0e49<\/p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">...<\/span>\n<span class=\"nc\">ResourceConfig<\/span> <span class=\"n\">config<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ResourceConfig<\/span><span class=\"o\">();<\/span>\n<span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">packages<\/span><span class=\"o\">(<\/span><span class=\"s\">\"your.package.name\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">register<\/span><span class=\"o\">(<\/span><span class=\"nc\">JacksonFeature<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n\n<span class=\"nc\">ServletHolder<\/span> <span class=\"n\">jersey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ServletHolder<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">ServletContainer<\/span><span class=\"o\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">));<\/span>\n<span class=\"o\">...<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e35\u0e49 \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">localhost:2222\/json<\/code> \u0e01\u0e47\u0e08\u0e30\u0e44\u0e14\u0e49 Response \u0e40\u0e1b\u0e47\u0e19 JSON \u0e15\u0e32\u0e21\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27<\/p>","author":{"name":"Blast Piruin Panichphol"},"category":[{"@attributes":{"term":"java"}},{"@attributes":{"term":"Jersey"}},{"@attributes":{"term":"Jetty"}},{"@attributes":{"term":"RESTful"}}],"summary":"\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e08\u0e30 setup RESTFul service \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 Jersey \u0e41\u0e25\u0e30 Jetty \u0e41\u0e1a\u0e1a Embedded \u0e01\u0e31\u0e19\u0e41\u0e1a\u0e1a\u0e07\u0e48\u0e32\u0e22\u0e46 \u0e42\u0e14\u0e22 Service \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e04\u0e37\u0e19 POJO \u0e40\u0e1b\u0e47\u0e19 \u0e40\u0e1b\u0e47\u0e19 JSON \u0e2d\u0e31\u0e1e\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34\u0e14\u0e49\u0e27\u0e22 Jackson \u0e44\u0e14\u0e49\u0e14\u0e49\u0e27\u0e22"},{"title":"\u0e01\u0e33\u0e2b\u0e19\u0e14 Custom domain \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a Web \u0e1a\u0e19 Github Pages","link":{"@attributes":{"href":"https:\/\/piruin.github.io\/blog\/github-pages-custom-domain\/","rel":"alternate","type":"text\/html","title":"\u0e01\u0e33\u0e2b\u0e19\u0e14 Custom domain \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a Web \u0e1a\u0e19 Github Pages"}},"published":"2016-09-29T00:00:00+07:00","updated":"2016-09-29T00:00:00+07:00","id":"https:\/\/piruin.github.io\/blog\/github-pages-custom-domain","content":"<p>\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e17\u0e33\u0e42\u0e04\u0e23\u0e07 Web \u0e1a\u0e19 Github Pages \u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e39\u0e1b\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e48\u0e32\u0e07\u0e41\u0e25\u0e49\u0e27 \u0e08\u0e30\u0e40\u0e02\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1b\u0e1c\u0e48\u0e32\u0e19 <code class=\"language-plaintext highlighter-rouge\">piruin.github.io<\/code> \u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e01\u0e47\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e31\u0e19\u0e44\u0e21\u0e48\u0e40\u0e17\u0e48\u0e2a\u0e31\u0e01\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e40\u0e25\u0e22\u0e15\u0e31\u0e14\u0e2a\u0e34\u0e19\u0e43\u0e08\u0e40\u0e0a\u0e48\u0e32 Domain <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e41\u0e25\u0e30\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e17\u0e33 Custom Domain \u0e01\u0e31\u0e19\u0e2a\u0e31\u0e01\u0e2b\u0e19\u0e48\u0e2d\u0e22<\/p>\n\n<blockquote>\n  <p>\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e35\u0e49\u0e43\u0e0a\u0e49\u0e40\u0e27\u0e25\u0e32\u0e41\u0e1b\u0e4a\u0e1a\u0e40\u0e14\u0e35\u0e22\u0e27\u0e41\u0e25\u0e30\u0e44\u0e21\u0e48\u0e22\u0e32\u0e01\u0e04\u0e23\u0e31\u0e1a \u0e41\u0e21\u0e49\u0e41\u0e15\u0e48\u0e21\u0e37\u0e2d\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e07\u0e21\u0e35\u0e40\u0e27\u0e47\u0e1b\u0e17\u0e35\u0e48\u0e08\u0e14\u0e42\u0e14\u0e40\u0e21\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e02\u0e2d\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e23\u0e01\u0e41\u0e1a\u0e1a\u0e1c\u0e21\u0e22\u0e31\u0e07\u0e17\u0e33\u0e44\u0e14\u0e49\u0e20\u0e32\u0e22\u0e43\u0e19\u0e04\u0e23\u0e36\u0e48\u0e07\u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07<\/p>\n<\/blockquote>\n\n<h2 id=\"\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e0b\u0e34\u0e04\u0e23\u0e31\u0e1a-\u0e23\u0e2d\u0e2d\u0e30\u0e44\u0e23\">\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e0b\u0e34\u0e04\u0e23\u0e31\u0e1a! \u0e23\u0e2d\u0e2d\u0e30\u0e44\u0e23?<\/h2>\n<p>\u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e43\u0e19\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e02\u0e2d\u0e07\u0e08\u0e23\u0e34\u0e07\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48\u0e1c\u0e21\u0e17\u0e33\u0e40\u0e27\u0e47\u0e1b\u0e19\u0e35\u0e49\u0e40\u0e25\u0e22  \u0e0b\u0e36\u0e48\u0e07 Requirement \u0e02\u0e2d\u0e07\u0e1c\u0e21\u0e04\u0e37\u0e2d \u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e02\u0e49\u0e32\u0e1c\u0e48\u0e32\u0e19 <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e25\u0e31\u0e01 \u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e27\u0e48\u0e32 <code class=\"language-plaintext highlighter-rouge\">www.piruin.me<\/code> \u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e01\u0e47\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e44\u0e14\u0e49\u0e40\u0e0a\u0e48\u0e19\u0e01\u0e31\u0e19 \u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e40\u0e08\u0e2d\u0e2b\u0e19\u0e49\u0e32 404<\/p>\n\n<h3 id=\"github\">GitHub<\/h3>\n<p>\u0e01\u0e48\u0e2d\u0e19\u0e2d\u0e37\u0e48\u0e19\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e1a\u0e2d\u0e01 GitHub \u0e01\u0e48\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e40\u0e23\u0e32\u0e08\u0e30\u0e43\u0e0a\u0e49 <code class=\"language-plaintext highlighter-rouge\">Custom Domain<\/code> \u0e41\u0e25\u0e49\u0e27\u0e19\u0e30 \u0e42\u0e14\u0e22\u0e17\u0e33\u0e15\u0e32\u0e21\u0e19\u0e35\u0e49<\/p>\n\n<ol>\n  <li>\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">setting<\/code> \u0e02\u0e2d\u0e07 Project \u0e02\u0e2d\u0e07 Website \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32<\/li>\n  <li>\u0e17\u0e35\u0e48\u0e2b\u0e31\u0e27\u0e02\u0e49\u0e2d <code class=\"language-plaintext highlighter-rouge\">Custom Domain<\/code> \u0e43\u0e2a\u0e48\u0e0a\u0e37\u0e48\u0e2d\u0e42\u0e14\u0e40\u0e21\u0e19\u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32 \u0e40\u0e0a\u0e48\u0e19 piruin.me \u0e41\u0e25\u0e49\u0e27\u0e01\u0e14 <code class=\"language-plaintext highlighter-rouge\">save<\/code><\/li>\n<\/ol>\n\n<p>\u0e08\u0e32\u0e01\u0e19\u0e31\u0e49\u0e19 github \u0e08\u0e30\u0e17\u0e33 <strong>commit<\/strong> \u0e44\u0e1f\u0e25\u0e4c\u0e0a\u0e37\u0e48\u0e2d <code class=\"language-plaintext highlighter-rouge\">CNAME<\/code> \u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32\u0e42\u0e14\u0e22\u0e21\u0e35\u0e0a\u0e37\u0e48\u0e2d\u0e42\u0e14\u0e40\u0e21\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e43\u0e2a\u0e48\u0e44\u0e1b\u0e43\u0e2b\u0e49\u0e42\u0e14\u0e22\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 \u0e40\u0e17\u0e48\u0e32\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e31\u0e19\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e48\u0e27\u0e19\u0e41\u0e23\u0e01<\/p>\n\n<h3 id=\"\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32-dns\">\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 DNS<\/h3>\n<p>\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e40\u0e23\u0e32\u0e08\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e1a\u0e2d\u0e01\u0e43\u0e2b\u0e49 DNS \u0e23\u0e39\u0e49\u0e27\u0e48\u0e32 \u0e16\u0e49\u0e32\u0e21\u0e35\u0e04\u0e19\u0e1e\u0e34\u0e21\u0e1e\u0e4c <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e43\u0e2b\u0e49\u0e1e\u0e32\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07 server \u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e44\u0e2b\u0e19 Ip \u0e2d\u0e30\u0e44\u0e23 \u0e2b\u0e23\u0e37\u0e2d\u0e16\u0e49\u0e32\u0e1e\u0e34\u0e21\u0e1e\u0e4c <code class=\"language-plaintext highlighter-rouge\">www.piruin.me<\/code> \u0e08\u0e30\u0e43\u0e2b\u0e49 Reirect \u0e44\u0e1b\u0e44\u0e2b\u0e19<\/p>\n\n<ol>\n  <li>\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b Website \u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e08\u0e14\u0e42\u0e14\u0e40\u0e21\u0e19\u0e44\u0e27\u0e49 \u0e40\u0e0a\u0e48\u0e19 GoDaddy Namecheap 9\u0e259<\/li>\n  <li>\u0e2b\u0e32\u0e40\u0e21\u0e19\u0e39\u0e17\u0e35\u0e48\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 DNS \u0e02\u0e2d\u0e07\u0e40\u0e08\u0e49\u0e32\u0e19\u0e31\u0e49\u0e19 (\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e02\u0e31\u0e49\u0e19\u0e17\u0e35\u0e48\u0e22\u0e32\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27)<\/li>\n  <li>\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21 Record \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 3 \u0e2d\u0e31\u0e19\u0e14\u0e31\u0e07\u0e19\u0e35\u0e49\n    <ul>\n      <li>\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 <code class=\"language-plaintext highlighter-rouge\">A<\/code>, Host <code class=\"language-plaintext highlighter-rouge\">@<\/code>, IP <code class=\"language-plaintext highlighter-rouge\">192.30.252.153<\/code><\/li>\n      <li>\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 <code class=\"language-plaintext highlighter-rouge\">A<\/code>, Host <code class=\"language-plaintext highlighter-rouge\">@<\/code>, IP <code class=\"language-plaintext highlighter-rouge\">192.30.252.154<\/code><\/li>\n      <li>\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 <code class=\"language-plaintext highlighter-rouge\">CNAME<\/code>, Host <code class=\"language-plaintext highlighter-rouge\">www<\/code>, \u0e43\u0e2a\u0e48 domain \u0e40\u0e14\u0e34\u0e21\u0e02\u0e2d\u0e07 github page \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32 \u0e40\u0e0a\u0e48\u0e19 <code class=\"language-plaintext highlighter-rouge\">piruin.github.io<\/code> \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a website \u0e02\u0e2d\u0e07\u0e1c\u0e21<\/li>\n    <\/ul>\n  <\/li>\n  <li>\u0e01\u0e14 <code class=\"language-plaintext highlighter-rouge\">Save<\/code> \u0e16\u0e49\u0e32\u0e21\u0e35\u0e43\u0e2b\u0e49\u0e01\u0e14 \u0e41\u0e25\u0e49\u0e27\u0e23\u0e2d<\/li>\n<\/ol>\n\n<blockquote>\n  <p>\u0e16\u0e49\u0e32\u0e2d\u0e22\u0e32\u0e01\u0e40\u0e2b\u0e47\u0e19\u0e1c\u0e25\u0e40\u0e23\u0e47\u0e27\u0e46 \u0e15\u0e2d\u0e19\u0e40\u0e1e\u0e34\u0e48\u0e21 Record \u0e43\u0e2b\u0e49\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e04\u0e48\u0e32 TTL \u0e43\u0e2b\u0e49\u0e21\u0e35\u0e04\u0e48\u0e32\u0e19\u0e49\u0e2d\u0e22\u0e46\u0e40\u0e02\u0e49\u0e32\u0e44\u0e27\u0e49<\/p>\n<\/blockquote>\n\n<h3 id=\"\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\">\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c<\/h3>\n<p>\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e1b \u0e44\u0e21\u0e48\u0e19\u0e48\u0e32\u0e08\u0e30\u0e40\u0e01\u0e34\u0e19\u0e04\u0e23\u0e36\u0e48\u0e07\u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07 \u0e40\u0e23\u0e32\u0e08\u0e30\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e02\u0e49\u0e32 Website \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e44\u0e1b\u0e14\u0e49\u0e27\u0e22 <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e2b\u0e23\u0e37\u0e2d\u0e08\u0e30\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e27\u0e48\u0e32 <code class=\"language-plaintext highlighter-rouge\">www.piruin.me<\/code> \u0e01\u0e47\u0e44\u0e14\u0e49\u0e40\u0e0a\u0e48\u0e19 \u0e0b\u0e36\u0e48\u0e07\u0e08\u0e30 Redirect \u0e44\u0e1b\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e41\u0e17\u0e19<\/p>\n\n<h2 id=\"\u0e40\u0e23\u0e32\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e25\u0e07\u0e44\u0e1b\">\u0e40\u0e23\u0e32\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e25\u0e07\u0e44\u0e1b<\/h2>\n<p>\u0e15\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e40\u0e1e\u0e34\u0e48\u0e21 DNS Record \u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 <code class=\"language-plaintext highlighter-rouge\">A<\/code> \u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e1a\u0e2d\u0e01\u0e27\u0e48\u0e32 \u0e16\u0e49\u0e32\u0e21\u0e35\u0e04\u0e19\u0e1e\u0e34\u0e1e\u0e21\u0e4c Apex Name (piruin.me) \u0e43\u0e2b\u0e49\u0e0a\u0e35\u0e49\u0e44\u0e1b\u0e17\u0e35\u0e48 IP 192.30.252.153 \u0e2b\u0e23\u0e37\u0e2d .154 \u0e0b\u0e36\u0e48\u0e07\u0e40\u0e1b\u0e47\u0e19 IP \u0e02\u0e2d\u0e07 Github Pages\n\u0e2a\u0e48\u0e27\u0e19\u0e15\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 <code class=\"language-plaintext highlighter-rouge\">CNAME<\/code> \u0e40\u0e23\u0e32\u0e43\u0e2a\u0e48 host \u0e40\u0e1b\u0e47\u0e19 Subdomain (www) \u0e41\u0e25\u0e49\u0e27\u0e43\u0e2b\u0e49\u0e0a\u0e35\u0e49\u0e44\u0e1b\u0e17\u0e35\u0e48 domain default \u0e02\u0e2d\u0e07 Github Pages \u0e40\u0e14\u0e34\u0e21\u0e02\u0e2d\u0e07\u0e0b\u0e36\u0e48\u0e07\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 <code class=\"language-plaintext highlighter-rouge\">CNAME<\/code> \u0e17\u0e35\u0e48 Project \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19 apex name \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e27\u0e48\u0e32 <code class=\"language-plaintext highlighter-rouge\">www.piruin.me<\/code> \u0e08\u0e30\u0e16\u0e39\u0e01 Redirect \u0e44\u0e1b\u0e17\u0e35\u0e48 <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e41\u0e17\u0e19<\/p>\n\n<h2 id=\"\u0e17\u0e34\u0e49\u0e07\u0e17\u0e49\u0e32\u0e22\">\u0e17\u0e34\u0e49\u0e07\u0e17\u0e49\u0e32\u0e22<\/h2>\n<p>\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e2d\u0e22\u0e32\u0e01\u0e43\u0e2b\u0e49\u0e04\u0e19\u0e40\u0e02\u0e49\u0e32 Web \u0e40\u0e23\u0e32\u0e14\u0e49\u0e27\u0e22 Subdomain <code class=\"language-plaintext highlighter-rouge\">www.<\/code> \u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e25\u0e31\u0e01\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19 Apex Name \u0e2b\u0e25\u0e30  \u0e04\u0e34\u0e14\u0e27\u0e48\u0e32\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e15\u0e23\u0e07\u0e44\u0e2b\u0e19\u0e1a\u0e49\u0e32\u0e07\u0e04\u0e23\u0e31\u0e1a?<\/p>","author":{"name":"Blast Piruin Panichphol"},"category":[{"@attributes":{"term":"jekyll"}},{"@attributes":{"term":"github-pages"}}],"summary":"\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e17\u0e33\u0e42\u0e04\u0e23\u0e07 Web \u0e1a\u0e19 Github Pages \u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e39\u0e1b\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e48\u0e32\u0e07\u0e41\u0e25\u0e49\u0e27 \u0e08\u0e30\u0e40\u0e02\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1b\u0e1c\u0e48\u0e32\u0e19 piruin.github.io \u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e01\u0e47\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e31\u0e19\u0e44\u0e21\u0e48\u0e40\u0e17\u0e48\u0e2a\u0e31\u0e01\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e40\u0e25\u0e22\u0e15\u0e31\u0e14\u0e2a\u0e34\u0e19\u0e43\u0e08\u0e40\u0e0a\u0e48\u0e32 Domain piruin.me \u0e41\u0e25\u0e30\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e17\u0e33 Custom Domain \u0e01\u0e31\u0e19\u0e2a\u0e31\u0e01\u0e2b\u0e19\u0e48\u0e2d\u0e22"},{"title":"Hello World - I\u2019am Blast Piruin","link":{"@attributes":{"href":"https:\/\/piruin.github.io\/blog\/hello-world\/","rel":"alternate","type":"text\/html","title":"Hello World - I\u2019am Blast Piruin"}},"published":"2016-09-04T00:00:00+07:00","updated":"2016-09-04T00:00:00+07:00","id":"https:\/\/piruin.github.io\/blog\/hello-world","content":"<h2 id=\"\u0e43\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e1c\u0e21\u0e01\u0e47\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e17\u0e33\u0e40\u0e27\u0e47\u0e1b\u0e2a\u0e31\u0e01\u0e17\u0e35\">\u0e43\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e1c\u0e21\u0e01\u0e47\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e17\u0e33\u0e40\u0e27\u0e47\u0e1b\u0e2a\u0e31\u0e01\u0e17\u0e35<\/h2>\n<p>\u0e08\u0e23\u0e34\u0e07\u0e46\u0e1c\u0e21\u0e01\u0e47\u0e40\u0e04\u0e22\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e08\u0e30\u0e17\u0e33\u0e21\u0e32\u0e2b\u0e25\u0e32\u0e22\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e25\u0e49\u0e27\u0e2b\u0e25\u0e30 \u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08\u0e2a\u0e31\u0e01\u0e17\u0e35 \u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01 Requirement \u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e04\u0e48\u0e2d\u0e22\u0e02\u0e49\u0e32\u0e07\u0e08\u0e30\u0e40\u0e22\u0e2d\u0e30 \u0e40\u0e0a\u0e48\u0e19 \u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e14\u0e39 Server \u0e40\u0e2d\u0e07, \u0e23\u0e2d\u0e07\u0e23\u0e31\u0e1a\u0e2a\u0e2d\u0e07\u0e20\u0e32\u0e29\u0e32 (\u0e17\u0e33\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e01\u0e30\u0e27\u0e48\u0e32\u0e08\u0e30\u0e02\u0e22\u0e31\u0e19\u0e40\u0e02\u0e35\u0e22\u0e19\u0e20\u0e32\u0e29\u0e32\u0e2d\u0e31\u0e07\u0e01\u0e24\u0e29), \u0e16\u0e49\u0e32 Blog \u0e40\u0e02\u0e35\u0e22\u0e19\u0e14\u0e49\u0e27\u0e22 Markdown \u0e44\u0e14\u0e49\u0e01\u0e47\u0e22\u0e34\u0e48\u0e07\u0e14\u0e35 \u0e41\u0e25\u0e30\u0e17\u0e35\u0e48\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e15\u0e49\u0e2d\u0e07 Customize \u0e2b\u0e19\u0e49\u0e32\u0e15\u0e32\u0e43\u0e2b\u0e49\u0e16\u0e39\u0e01\u0e43\u0e08\u0e44\u0e14\u0e49\u0e07\u0e48\u0e32\u0e22\u0e46\u0e41\u0e25\u0e30\u0e44\u0e21\u0e48\u0e40\u0e2a\u0e35\u0e22\u0e15\u0e31\u0e07\u0e04\u0e4c(\u0e07\u0e01\u0e2d\u0e48\u0e30) \u0e01\u0e47\u0e40\u0e04\u0e22\u0e44\u0e1b\u0e25\u0e2d\u0e07\u0e43\u0e0a\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e08\u0e32\u0e01\u0e40\u0e08\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e46 \u0e40\u0e0a\u0e48\u0e19 WordPress Postach.io \u0e2b\u0e25\u0e32\u0e22\u0e40\u0e08\u0e49\u0e32\u0e2d\u0e22\u0e39\u0e48\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e01\u0e31\u0e19 \u0e0b\u0e36\u0e48\u0e07\u0e01\u0e47\u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e08\u0e49\u0e32\u0e44\u0e2b\u0e19\u0e1c\u0e48\u0e32\u0e19\u0e17\u0e38\u0e01\u0e02\u0e49\u0e2d \u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22\u0e40\u0e25\u0e22\u0e25\u0e49\u0e21\u0e40\u0e25\u0e34\u0e01\u0e44\u0e1b \u0e01\u0e25\u0e31\u0e1a\u0e19\u0e31\u0e48\u0e07\u0e40\u0e02\u0e35\u0e22\u0e19 Android \u0e15\u0e48\u0e2d\u0e14\u0e35\u0e01\u0e27\u0e48\u0e32<\/p>\n\n<p>\u0e08\u0e19\u0e01\u0e23\u0e30\u0e17\u0e31\u0e48\u0e07\u0e17\u0e35\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19\u0e21\u0e35\u0e42\u0e08\u0e17\u0e22\u0e4c\u0e27\u0e48\u0e32\u0e2d\u0e22\u0e32\u0e01\u0e44\u0e14\u0e49 Website \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a Product \u0e17\u0e35\u0e48\u0e17\u0e33\u0e2d\u0e22\u0e39\u0e48 \u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e2d\u0e22\u0e32\u0e01\u0e14\u0e39\u0e41\u0e25 Server \u0e40\u0e2d\u0e07 \u0e1c\u0e21\u0e40\u0e25\u0e22\u0e40\u0e2a\u0e19\u0e2d\u0e43\u0e2b\u0e49\u0e19\u0e49\u0e2d\u0e07\u0e46\u0e17\u0e35\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19\u0e25\u0e2d\u0e07\u0e43\u0e0a\u0e49 Github Pages \u0e14\u0e39 \u0e41\u0e15\u0e48\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e01\u0e47\u0e44\u0e21\u0e48\u0e40\u0e04\u0e22\u0e43\u0e0a\u0e49\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e01\u0e31\u0e19 \u0e41\u0e04\u0e48\u0e40\u0e04\u0e22\u0e2d\u0e48\u0e32\u0e19\u0e1c\u0e48\u0e32\u0e19\u0e46\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e43\u0e0a\u0e49\u0e04\u0e39\u0e49\u0e01\u0e31\u0e1a Jekyll \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e17\u0e33 Blog \u0e44\u0e14\u0e49  \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e41\u0e19\u0e30\u0e19\u0e33\u0e40\u0e04\u0e49\u0e32\u0e44\u0e1b\u0e41\u0e25\u0e49\u0e27\u0e01\u0e47\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e01\u0e47\u0e04\u0e27\u0e23\u0e08\u0e30\u0e23\u0e39\u0e49\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2a\u0e31\u0e01\u0e2b\u0e19\u0e48\u0e2d\u0e22\u0e2b\u0e25\u0e30\u0e21\u0e31\u0e49\u0e07 \u2013\u201d \u0e40\u0e25\u0e22\u0e01\u0e25\u0e31\u0e1a\u0e21\u0e32\u0e19\u0e31\u0e48\u0e07\u0e28\u0e36\u0e01\u0e29\u0e32\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e25\u0e34\u0e01\u0e07\u0e32\u0e19\u0e14\u0e39 \u0e17\u0e33\u0e44\u0e1b\u0e17\u0e33\u0e21\u0e32\u0e40\u0e1e\u0e25\u0e34\u0e19\u0e14\u0e35 \u0e40\u0e25\u0e22\u0e15\u0e31\u0e49\u0e07\u0e42\u0e08\u0e17\u0e22\u0e4c\u0e40\u0e1b\u0e47\u0e19\u0e17\u0e33 Web Blog \u0e02\u0e2d\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e28\u0e36\u0e01\u0e29\u0e32\u0e27\u0e34\u0e18\u0e35\u0e43\u0e0a\u0e49\u0e17\u0e33 Web \u0e1a\u0e19 Github Pages \u0e14\u0e49\u0e27\u0e22 Jekyll \u0e44\u0e1b\u0e40\u0e25\u0e22\u0e0b\u0e30\u0e40\u0e25\u0e22<\/p>\n\n<h3 id=\"\u0e17\u0e33-backlog-\u0e41\u0e25\u0e49\u0e27\u0e08\u0e30\u0e44\u0e14\u0e49\u0e07\u0e32\u0e19\">\u0e17\u0e33 Backlog \u0e41\u0e25\u0e49\u0e27\u0e08\u0e30\u0e44\u0e14\u0e49\u0e07\u0e32\u0e19<\/h3>\n<p>\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e21\u0e35\u0e42\u0e08\u0e17\u0e22\u0e4c\u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e21\u0e35\u0e01\u0e23\u0e2d\u0e01 \u0e1a\u0e27\u0e01\u0e01\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e44\u0e21\u0e48\u0e23\u0e39\u0e49\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e17\u0e33 Web \u0e43\u0e14\u0e46\u0e17\u0e31\u0e49\u0e07\u0e2a\u0e34\u0e49\u0e19 (html css \u0e01\u0e47\u0e1e\u0e36\u0e48\u0e07\u0e28\u0e36\u0e01\u0e29\u0e32\u0e01\u0e31\u0e19\u0e07\u0e32\u0e19\u0e19\u0e35\u0e49\u0e2b\u0e25\u0e30) \u0e1e\u0e2d\u0e28\u0e36\u0e01\u0e29\u0e32\u0e2d\u0e30\u0e44\u0e23 \u0e01\u0e47\u0e21\u0e31\u0e01\u0e08\u0e30\u0e21\u0e35\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e23\u0e39\u0e49\u0e43\u0e2b\u0e49\u0e28\u0e36\u0e01\u0e29\u0e32\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46\u0e44\u0e21\u0e48\u0e08\u0e1a\u0e2a\u0e31\u0e01\u0e17\u0e35 \u0e41\u0e04\u0e48\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07 favicon \u0e40\u0e25\u0e47\u0e01\u0e46\u0e01\u0e47\u0e14\u0e39\u0e08\u0e30\u0e44\u0e21\u0e48\u0e40\u0e25\u0e47\u0e01\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e17\u0e35\u0e48\u0e04\u0e34\u0e14 \u0e08\u0e19\u0e01\u0e25\u0e32\u0e22\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e40\u0e02\u0e35\u0e22\u0e19\u0e0b\u0e30\u0e17\u0e35  \u0e40\u0e25\u0e22\u0e15\u0e31\u0e14\u0e2a\u0e34\u0e19\u0e43\u0e08\u0e40\u0e2d\u0e32\u0e27\u0e34\u0e0d\u0e0d\u0e32\u0e13 Scrum Master \u0e40\u0e02\u0e49\u0e32\u0e2a\u0e34\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07 \u0e2a\u0e31\u0e48\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e17\u0e33 Backlog \u0e0b\u0e30 \u0e04\u0e48\u0e2d\u0e22\u0e17\u0e33\u0e43\u0e2b\u0e49 Focus \u0e40\u0e1b\u0e47\u0e19\u0e2a\u0e48\u0e27\u0e19\u0e46\u0e41\u0e25\u0e49\u0e27\u0e1c\u0e48\u0e32\u0e19\u0e21\u0e32\u0e08\u0e19\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e43\u0e19\u0e40\u0e27\u0e47\u0e1b\u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e39\u0e1b\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e48\u0e32\u0e07\u0e41\u0e25\u0e49\u0e27\u0e21\u0e32\u0e19\u0e31\u0e48\u0e07\u0e40\u0e02\u0e35\u0e22\u0e19\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21\u0e19\u0e35\u0e49<\/p>\n\n<h3 id=\"web-\u0e19\u0e35\u0e49\u0e41\u0e04\u0e23\u0e4c\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2d\u0e30\u0e44\u0e23\u0e1a\u0e49\u0e32\u0e07\">Web \u0e19\u0e35\u0e49\u0e41\u0e04\u0e23\u0e4c\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2d\u0e30\u0e44\u0e23\u0e1a\u0e49\u0e32\u0e07<\/h3>\n<ul>\n  <li><strong>W3C Markup Standard<\/strong> \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e40\u0e27\u0e47\u0e1a\u0e21\u0e35\u0e04\u0e38\u0e13\u0e20\u0e32\u0e1e\u0e1c\u0e48\u0e32\u0e19\u0e21\u0e32\u0e15\u0e23\u0e10\u0e32\u0e19\u0e15\u0e32\u0e21\u0e2a\u0e44\u0e15\u0e25\u0e4c Agile developer \u0e40\u0e25\u0e22\u0e15\u0e49\u0e2d\u0e07\u0e15\u0e23\u0e27\u0e08\u0e40\u0e2a\u0e21\u0e2d\u0e27\u0e48\u0e32\u0e43\u0e0a\u0e49 Tag \u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07, \u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e1b\u0e34\u0e14 Tag \u0e41\u0e25\u0e49\u0e27\u0e25\u0e37\u0e21\u0e1b\u0e34\u0e14, \u0e44\u0e21\u0e48\u0e21\u0e35 Link \u0e15\u0e32\u0e22 \u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e1e\u0e27\u0e01\u0e19\u0e35\u0e49\u0e15\u0e23\u0e27\u0e08\u0e14\u0e49\u0e27\u0e22 CI \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14<\/li>\n  <li><strong>Web Accessibility<\/strong> \u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e35\u0e49\u0e1c\u0e21\u0e04\u0e34\u0e14\u0e27\u0e48\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e04\u0e27\u0e23\u0e17\u0e33 \u0e41\u0e25\u0e30\u0e40\u0e17\u0e48\u0e32\u0e17\u0e35\u0e48\u0e28\u0e36\u0e01\u0e29\u0e32\u0e14\u0e39\u0e1e\u0e1a\u0e27\u0e48\u0e32\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e17\u0e33\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e40\u0e27\u0e47\u0e1a\u0e15\u0e32\u0e21\u0e21\u0e32\u0e15\u0e23\u0e10\u0e32\u0e19 \u0e01\u0e47\u0e08\u0e30\u0e1c\u0e48\u0e32\u0e19\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e46\u0e43\u0e19\u0e2b\u0e31\u0e27\u0e02\u0e49\u0e2d\u0e19\u0e35\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27<\/li>\n  <li><strong>UX<\/strong> \u0e40\u0e1e\u0e34\u0e48\u0e07\u0e2d\u0e48\u0e32\u0e19\u0e17\u0e1a\u0e17\u0e27\u0e19 Don\u2019t Make Me Think \u0e08\u0e1a\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e23\u0e34\u0e48\u0e21\u0e17\u0e33\u0e1e\u0e2d\u0e40\u0e25\u0e22 \u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19 Web \u0e19\u0e35\u0e49\u0e2b\u0e25\u0e30\u0e17\u0e35\u0e48\u0e25\u0e2d\u0e07\u0e02\u0e2d\u0e07<\/li>\n<\/ul>\n\n<p>\u0e2a\u0e23\u0e38\u0e1b\u0e04\u0e37\u0e2d\u0e21\u0e31\u0e19\u0e15\u0e49\u0e2d\u0e07 <strong>\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e32\u0e16\u0e39\u0e01\u0e43\u0e08 UX\u0e14\u0e35 \u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e44\u0e14\u0e49\u0e21\u0e32\u0e15\u0e23\u0e10\u0e32\u0e19<\/strong><\/p>\n\n<h3 id=\"\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19-blog\">\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19 Blog<\/h3>\n<p>\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e41\u0e19\u0e48\u0e43\u0e08\u0e27\u0e48\u0e32\u0e08\u0e30\u0e40\u0e02\u0e35\u0e22\u0e19\u0e44\u0e1b\u0e44\u0e14\u0e49\u0e16\u0e36\u0e07\u0e44\u0e2b\u0e19 \u0e04\u0e19\u0e2d\u0e37\u0e48\u0e19\u0e08\u0e30\u0e2d\u0e48\u0e32\u0e19\u0e23\u0e39\u0e49\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e23\u0e36\u0e40\u0e1b\u0e25\u0e48\u0e32\u0e01\u0e47\u0e44\u0e21\u0e48\u0e23\u0e39\u0e49 \u0e41\u0e15\u0e48\u0e08\u0e30\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e40\u0e02\u0e35\u0e22\u0e19\u0e1a\u0e48\u0e2d\u0e22\u0e46\u0e40\u0e1c\u0e37\u0e48\u0e2d\u0e08\u0e30\u0e40\u0e02\u0e35\u0e22\u0e19\u0e14\u0e35\u0e02\u0e36\u0e49\u0e19  \u0e40\u0e27\u0e25\u0e32\u0e08\u0e30 Note \u0e2d\u0e30\u0e44\u0e23\u0e08\u0e32\u0e01\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e01\u0e48\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e40\u0e02\u0e35\u0e22\u0e19\u0e25\u0e07 Evernote \u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27 \u0e08\u0e30\u0e01\u0e4a\u0e2d\u0e1b\u0e21\u0e32\u0e25\u0e07\u0e19\u0e35\u0e49\u0e44\u0e1b\u0e14\u0e49\u0e27\u0e22 \u0e41\u0e15\u0e48\u0e02\u0e35\u0e49\u0e40\u0e01\u0e35\u0e22\u0e08\u0e17\u0e33\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e23\u0e39\u0e1b\u0e41\u0e2e\u0e30 :(  \u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48\u0e04\u0e34\u0e14\u0e27\u0e48\u0e32\u0e08\u0e30\u0e40\u0e02\u0e35\u0e22\u0e19\u0e19\u0e48\u0e32\u0e08\u0e30\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e14\u0e31\u0e07\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e19\u0e35\u0e49<\/p>\n\n<ul>\n  <li>Android \u0e2d\u0e32\u0e0a\u0e35\u0e1e\u0e2b\u0e25\u0e31\u0e01\u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e02\u0e35\u0e22\u0e19\u0e1a\u0e49\u0e32\u0e07 (\u0e16\u0e49\u0e32\u0e40\u0e02\u0e35\u0e22\u0e19\u0e17\u0e31\u0e19\u0e0a\u0e32\u0e27\u0e1a\u0e49\u0e32\u0e19\u0e40\u0e04\u0e49\u0e32\u0e19\u0e30)<\/li>\n  <li>Java<\/li>\n  <li>Agile Scrum<\/li>\n  <li>\u0e01\u0e32\u0e23\u0e2d\u0e2d\u0e01\u0e41\u0e1a\u0e1a\u0e23\u0e30\u0e1a\u0e1a<\/li>\n  <li>Jekyll Github Pages<\/li>\n<\/ul>\n\n<h2 id=\"\u0e40\u0e02\u0e35\u0e22\u0e19\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21\u0e19\u0e35\u0e49\u0e17\u0e33\u0e44\u0e21\">\u0e40\u0e02\u0e35\u0e22\u0e19\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21\u0e19\u0e35\u0e49\u0e17\u0e33\u0e44\u0e21<\/h2>\n<p>\u0e40\u0e1e\u0e23\u0e32\u0e30\u0e27\u0e48\u0e32\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e19\u0e35\u0e49\u0e08\u0e30\u0e16\u0e37\u0e2d\u0e27\u0e48\u0e32\u0e40\u0e1b\u0e34\u0e14\u0e15\u0e31\u0e27 <code class=\"language-plaintext highlighter-rouge\">piruin.me<\/code> \u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e17\u0e32\u0e07\u0e01\u0e32\u0e23 \u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21 Dummy \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e2d\u0e32\u0e2d\u0e2d\u0e01 \u0e40\u0e25\u0e22\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e1a\u0e17\u0e14\u0e04\u0e27\u0e32\u0e21\u0e44\u0e27\u0e49\u0e0b\u0e30\u0e2b\u0e19\u0e48\u0e2d\u0e22 Website \u0e08\u0e30\u0e44\u0e14\u0e49\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07\u0e41\u0e04\u0e48\u0e19\u0e31\u0e49\u0e19\u0e2b\u0e25\u0e30 \u0e1a\u0e32\u0e22<\/p>","author":{"name":"Blast Piruin Panichphol"},"category":[{"@attributes":{"term":"general"}},{"@attributes":{"term":"\u0e44\u0e23\u0e49\u0e2a\u0e32\u0e23\u0e30"}}],"summary":"\u0e43\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e1c\u0e21\u0e01\u0e47\u0e25\u0e07\u0e21\u0e37\u0e2d\u0e17\u0e33\u0e40\u0e27\u0e47\u0e1b\u0e2a\u0e31\u0e01\u0e17\u0e35 \u0e08\u0e23\u0e34\u0e07\u0e46\u0e1c\u0e21\u0e01\u0e47\u0e40\u0e04\u0e22\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e08\u0e30\u0e17\u0e33\u0e21\u0e32\u0e2b\u0e25\u0e32\u0e22\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e25\u0e49\u0e27\u0e2b\u0e25\u0e30 \u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08\u0e2a\u0e31\u0e01\u0e17\u0e35 \u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01 Requirement \u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e04\u0e48\u0e2d\u0e22\u0e02\u0e49\u0e32\u0e07\u0e08\u0e30\u0e40\u0e22\u0e2d\u0e30 \u0e40\u0e0a\u0e48\u0e19 \u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e14\u0e39 Server \u0e40\u0e2d\u0e07, \u0e23\u0e2d\u0e07\u0e23\u0e31\u0e1a\u0e2a\u0e2d\u0e07\u0e20\u0e32\u0e29\u0e32 (\u0e17\u0e33\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e01\u0e30\u0e27\u0e48\u0e32\u0e08\u0e30\u0e02\u0e22\u0e31\u0e19\u0e40\u0e02\u0e35\u0e22\u0e19\u0e20\u0e32\u0e29\u0e32\u0e2d\u0e31\u0e07\u0e01\u0e24\u0e29), \u0e16\u0e49\u0e32 Blog \u0e40\u0e02\u0e35\u0e22\u0e19\u0e14\u0e49\u0e27\u0e22 Markdown \u0e44\u0e14\u0e49\u0e01\u0e47\u0e22\u0e34\u0e48\u0e07\u0e14\u0e35 \u0e41\u0e25\u0e30\u0e17\u0e35\u0e48\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e15\u0e49\u0e2d\u0e07 Customize \u0e2b\u0e19\u0e49\u0e32\u0e15\u0e32\u0e43\u0e2b\u0e49\u0e16\u0e39\u0e01\u0e43\u0e08\u0e44\u0e14\u0e49\u0e07\u0e48\u0e32\u0e22\u0e46\u0e41\u0e25\u0e30\u0e44\u0e21\u0e48\u0e40\u0e2a\u0e35\u0e22\u0e15\u0e31\u0e07\u0e04\u0e4c(\u0e07\u0e01\u0e2d\u0e48\u0e30) \u0e01\u0e47\u0e40\u0e04\u0e22\u0e44\u0e1b\u0e25\u0e2d\u0e07\u0e43\u0e0a\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e08\u0e32\u0e01\u0e40\u0e08\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e46 \u0e40\u0e0a\u0e48\u0e19 WordPress Postach.io \u0e2b\u0e25\u0e32\u0e22\u0e40\u0e08\u0e49\u0e32\u0e2d\u0e22\u0e39\u0e48\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e01\u0e31\u0e19 \u0e0b\u0e36\u0e48\u0e07\u0e01\u0e47\u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e08\u0e49\u0e32\u0e44\u0e2b\u0e19\u0e1c\u0e48\u0e32\u0e19\u0e17\u0e38\u0e01\u0e02\u0e49\u0e2d \u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22\u0e40\u0e25\u0e22\u0e25\u0e49\u0e21\u0e40\u0e25\u0e34\u0e01\u0e44\u0e1b \u0e01\u0e25\u0e31\u0e1a\u0e19\u0e31\u0e48\u0e07\u0e40\u0e02\u0e35\u0e22\u0e19 Android \u0e15\u0e48\u0e2d\u0e14\u0e35\u0e01\u0e27\u0e48\u0e32"}]}