{"status":"ok","count":10,"count_total":465,"pages":47,"posts":[{"id":6664,"type":"post","slug":"cong-tac-thong-minh-hunonic","url":"https:\/\/cachhoc.net\/2020\/08\/08\/cong-tac-thong-minh-hunonic\/","status":"publish","title":"C\u00f4ng t\u1eafc th\u00f4ng minh Hunonic","title_plain":"C\u00f4ng t\u1eafc th\u00f4ng minh Hunonic","content":"\n<p>Ch\u00e0o c\u00e1c b\u1ea1n, hi\u1ec7n t\u1ea1i m\u00ecnh \u0111ang l\u00e0m c\u00e1c lo\u1ea1i <strong><a href=\"https:\/\/hunonic.com\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"c\u00f4ng t\u1eafc th\u00f4ng minh Hunonic (opens in a new tab)\">c\u00f4ng t\u1eafc th\u00f4ng minh<\/a><\/strong><a href=\"https:\/\/hunonic.com\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"c\u00f4ng t\u1eafc th\u00f4ng minh Hunonic (opens in a new tab)\"> <\/a><strong><a href=\"https:\/\/hunonic.com\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"c\u00f4ng t\u1eafc th\u00f4ng minh Hunonic (opens in a new tab)\">Hunonic<\/a><\/strong>, \u0111\u00e2y l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u trong chu\u1ed7i d\u1ef1 \u00e1n <strong>nh\u00e0 th\u00f4ng minh c\u1ee7a ng\u01b0\u1eddi Vi\u1ec7t<\/strong>.<\/p>\n\n\n\n<p>C\u00f4ng t\u1eafc th\u00f4ng minh Hunonic cho ph\u00e9p c\u00e1c b\u1ea1n \u0111i\u1ec1u <strong>khi\u1ec3n tr\u00ean \u0111i\u1ec7n tho\u1ea1i th\u00f4ng minh<\/strong> v\u00e0 c\u1ea3 tr\u00ean m\u1eb7t c\u1ea3m \u1ee9ng sang tr\u1ecdng. Vi\u1ec7c \u0111i\u1ec1u khi\u1ec3n tr\u00ean \u0111i\u1ec7n tho\u1ea1i th\u00f4ng minh s\u1ebd gi\u00fap \u00edch cho ch\u00fang ta r\u1ea5t nhi\u1ec1u, nh\u1ea5t l\u00e0 khi ch\u00fang ta mu\u1ed1n \u0111i\u1ec1u khi\u1ec3n t\u1eeb xa (b\u1eadt t\u1eaft \u0111\u00e8n, qu\u1ea1t, b\u00ecnh n\u00f3ng l\u1ea1nh tr\u01b0\u1edbc khi v\u1ec1 nh\u00e0). M\u1eb7t k\u00ednh c\u01b0\u1eddng l\u1ef1c c\u1ea3m \u1ee9ng gi\u00fap b\u1ea1n \u1ea5n b\u1eadt t\u1eaft tr\u1ef1c ti\u1ebfp \u0111\u1ed3ng th\u1eddi gi\u00fap ng\u1ed3i nh\u00e0 sang tr\u1ecdng h\u01a1n r\u1ea5t nhi\u1ec1u.<\/p>\n\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe class='youtube-player' type='text\/html' width='780' height='439' src='https:\/\/www.youtube.com\/embed\/kX0gVJkMTwY?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'><\/iframe><\/span>\n<\/div><\/figure>\n\n\n\n<p>Ngo\u00e0i ra, c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 <strong>\u0111i\u1ec1u khi\u1ec3n qua gi\u1ecdng n\u00f3i v\u1edbi Google Assistant<\/strong>,  nay v\u00e0 t\u01b0\u01a1ng lai s\u1ebd l\u00e0 xu h\u01b0\u1edbng r\u1ea5t ph\u1ed5 bi\u1ebfn. H\u00e3y t\u01b0\u1edfng t\u01b0\u1ee3ng, c\u00e1c b\u1ea1n ch\u1ec9 c\u1ea7n ra l\u1ec7nh &#8220;Hey Google, Turn on Light&#8221;, l\u1eadp t\u1ee9c \u0111\u00e8n s\u00e1ng, c\u1ea3m gi\u00e1c th\u00f4ng minh s\u1ebd th\u1ef1c s\u1ef1 \u0111\u1ebfn v\u1edbi ng\u00f4i nh\u00e0 c\u1ee7a b\u1ea1n l\u00fac n\u00e0y. (Hi\u1ec7n t\u1ea1i th\u1eddi \u0111i\u1ec3m n\u00e0y Google ch\u01b0a h\u1ed7 tr\u1ee3 ti\u1ebfng Vi\u1ec7t, sau n\u00e0y h\u1ed7 tr\u1ee3 r\u1ed3i th\u00ec ai c\u0169ng ra l\u1ec7nh \u0111\u01b0\u1ee3c \u0111\u01a1n gi\u1ea3n h\u01a1n r\u1ea5t nhi\u1ec1u).<\/p>\n\n\n\n<p>M\u1ed9t s\u1ed1 m\u1eabu c\u00f4ng t\u1eafc \u0111\u00e3 s\u1ea3n xu\u1ea5t v\u00e0 \u0111ang b\u00e1n tr\u00ean th\u1ecb tr\u01b0\u1eddng:<\/p>\n\n\n\n<p><strong>C\u00f4ng t\u1eafc th\u00f4ng minh Hunonic \u00e2m t\u01b0\u1eddng<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-attachment-id=\"6665\" data-permalink=\"https:\/\/cachhoc.net\/2020\/08\/08\/cong-tac-thong-minh-hunonic\/image\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?fit=2272%2C808&amp;ssl=1\" data-orig-size=\"2272,808\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?fit=300%2C107&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?fit=780%2C277&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?fit=780%2C277&amp;ssl=1\" alt=\"\" class=\"wp-image-6665\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?w=2272&amp;ssl=1 2272w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?resize=300%2C107&amp;ssl=1 300w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?resize=1024%2C364&amp;ssl=1 1024w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?resize=250%2C89&amp;ssl=1 250w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png?w=1560&amp;ssl=1 1560w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/figure><\/div>\n\n\n\n<p><strong>C\u00f4ng t\u1eafc th\u00f4ng minh Hunonic Lahu ( c\u00f4ng t\u1eafc g\u1eafn n\u1ed5i )<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6667\" data-permalink=\"https:\/\/cachhoc.net\/2020\/08\/08\/cong-tac-thong-minh-hunonic\/image-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?fit=2310%2C1136&amp;ssl=1\" data-orig-size=\"2310,1136\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-2\" data-image-description=\"\" data-medium-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?fit=300%2C148&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?fit=780%2C384&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?fit=780%2C384&amp;ssl=1\" alt=\"\" class=\"wp-image-6667\" srcset=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?w=2310&amp;ssl=1 2310w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?resize=300%2C148&amp;ssl=1 300w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?resize=1024%2C504&amp;ssl=1 1024w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?resize=250%2C123&amp;ssl=1 250w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png?w=1560&amp;ssl=1 1560w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/figure>\n\n\n\n<p>C\u00e1c b\u1ea1n quan t\u00e2m c\u00f3 th\u1ec3 gh\u00e9 qua website \u0111\u1ec3 xem th\u00eam chi ti\u1ebft nh\u00e9: <a rel=\"noreferrer noopener\" aria-label=\"https:\/\/hunonic.com (opens in a new tab)\" href=\"https:\/\/hunonic.com\" target=\"_blank\">https:\/\/hunonic.com<\/a><\/p>\n","excerpt":"<p>Ch\u00e0o c\u00e1c b\u1ea1n, hi\u1ec7n t\u1ea1i m\u00ecnh \u0111ang l\u00e0m c\u00e1c lo\u1ea1i c\u00f4ng t\u1eafc th\u00f4ng minh Hunonic, \u0111\u00e2y l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u trong chu\u1ed7i d\u1ef1 \u00e1n nh\u00e0 th\u00f4ng minh c\u1ee7a ng\u01b0\u1eddi Vi\u1ec7t. C\u00f4ng t\u1eafc th\u00f4ng minh Hunonic cho ph\u00e9p c\u00e1c b\u1ea1n \u0111i\u1ec1u khi\u1ec3n tr\u00ean \u0111i\u1ec7n tho\u1ea1i th\u00f4ng minh v\u00e0 c\u1ea3 tr\u00ean m\u1eb7t c\u1ea3m \u1ee9ng sang tr\u1ecdng. Vi\u1ec7c \u0111i\u1ec1u khi\u1ec3n tr\u00ean \u0111i\u1ec7n tho\u1ea1i th\u00f4ng minh s\u1ebd gi\u00fap \u00edch cho ch\u00fang ta r\u1ea5t nhi\u1ec1u, nh\u1ea5t l\u00e0 khi ch\u00fang ta mu\u1ed1n [&hellip;]<\/p>\n","date":"2020-08-08 21:58:02","modified":"2020-08-08 21:58:04","categories":[],"tags":[{"id":2386,"slug":"cong-tac-thong-minh","title":"c\u00f4ng t\u1eafc th\u00f4ng minh","description":"","post_count":1},{"id":2385,"slug":"hunonic","title":"hunonic","description":"","post_count":1}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[{"id":6665,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image.png","slug":"image","title":"image","description":"","caption":"","parent":6664,"mime_type":"image\/png","images":[]},{"id":6666,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-1.png","slug":"image-1","title":"image-1","description":"","caption":"","parent":6664,"mime_type":"image\/png","images":[]},{"id":6667,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2020\/08\/image-2.png","slug":"image-2","title":"image-2","description":"","caption":"","parent":6664,"mime_type":"image\/png","images":[]},{"id":6669,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2020\/08\/cong-tac-thong-minh-hunonic.jpg","slug":"cong-tac-thong-minh-hunonic","title":"cong-tac-thong-minh-hunonic","description":"","caption":"","parent":6664,"mime_type":"image\/jpeg","images":[]}],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6658,"type":"post","slug":"android-studio-terminal-adb-on-mac","url":"https:\/\/cachhoc.net\/2019\/12\/18\/android-studio-terminal-adb-on-mac\/","status":"publish","title":"Android studio terminal adb on mac","title_plain":"Android studio terminal adb on mac","content":"\n<p>I was try many, it run when setup, but after restart Android studio, terminal error adb command not found and I must setup again. Now I found way to make it run forever.<\/p>\n\n\n\n<p>Step 1: Open terminal<br>Step 2: Create ~\/.zshrc file by command: <\/p>\n\n\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\necho &quot;&quot; &gt; ~\/.zshrc\n<\/pre>\n\n\n<p>Step 3: Open this file and paste 2 lines, save and now it work forever.<\/p>\n\n\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nexport ANDROID_HOME=\/Applications\/Android\\ Studio.app\/sdk\nexport PATH=&quot;$ANDROID_HOME\/platform-tools:$ANDROID_HOME\/tools:$PATH&quot;\n<\/pre>","excerpt":"<p>I was try many, it run when setup, but after restart Android studio, terminal error adb command not found and I must setup again. Now I found way to make it run forever. Step 1: Open terminalStep 2: Create ~\/.zshrc file by command: Step 3: Open this file and paste 2 lines, save and now it work forever.<\/p>\n","date":"2019-12-18 15:46:51","modified":"2019-12-18 15:46:59","categories":[],"tags":[],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[{"id":6660,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/12\/mac-adb-terminal.jpg","slug":"mac-adb-terminal","title":"mac-adb-terminal","description":"","caption":"","parent":6658,"mime_type":"image\/jpeg","images":[]}],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6639,"type":"post","slug":"tu-van-kinh-nghiem-hoc-lap-trinh","url":"https:\/\/cachhoc.net\/2019\/11\/23\/tu-van-kinh-nghiem-hoc-lap-trinh\/","status":"publish","title":"T\u01b0 v\u1ea5n kinh nghi\u1ec7m h\u1ecdc l\u1eadp tr\u00ecnh","title_plain":"T\u01b0 v\u1ea5n kinh nghi\u1ec7m h\u1ecdc l\u1eadp tr\u00ecnh","content":"\n<p>Khi m\u1edbi b\u1eaft \u0111\u1ea7u h\u1ecdc l\u1eadp tr\u00ecnh, nh\u1ea5t l\u00e0 c\u00e1c b\u1ea1n sinh vi\u00ean n\u0103m nh\u1ea5t, c\u00e1c b\u1ea1n hay h\u1ecfi: anh ch\u1ec9 em c\u00e1ch h\u1ecdc l\u1eadp tr\u00ecnh, anh cho em xin \u00edt kinh nghi\u1ec7m h\u1ecdc l\u1eadp tr\u00ecnh. Hi v\u1ecdng s\u1ebd gi\u00fap \u00edch cho m\u1ed9t s\u1ed1 b\u1ea1n c\u00f3 th\u1eafc m\u1eafc t\u01b0\u01a1ng t\u1ef1 v\u1edbi \u0111o\u1ea1n h\u1ed9i tho\u1ea1i gi\u1eefa m\u00ecnh (b\u00ean ph\u1ea3i) v\u00e0 m\u1ed9t b\u1ea1n g\u00e1i xinh \u0111\u1eb9p h\u1ecdc n\u0103m nh\u1ea5t (b\u00ean tr\u00e1i).<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-left\">e ch\u00e0o a Qu\u00e2n<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">Alo e<\/p>\n\n\n\n<p class=\"chat-left\">k bi\u1ebft l\u00e0 a c\u00f3 phi\u1ec1n k cho e h\u1ecfi ch\u00fat \u1ea1<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">em c\u1ee9 h\u1ecfi l\u1eb1ng nh\u1eb1ng m\u00e0 ko v\u00e0o v\u1ea5n \u0111\u1ec1 ch\u00ednh l\u00e0 kh\u00e1 phi\u1ec1n. \ud83d\ude1b<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-left\">Hi\u1ec7n t\u1ea1i e \u0111ang theo h\u1ecdc ng\u00e0nh cntt  nh\u01b0ng m\u00f4n l\u1eadp tr\u00ecnh th\u1ef1c s\u1ef1 g\u00e2y kh\u00f3 kh\u0103n cho e. \u0111\u1ebfn vi\u1ebft m\u00e3 code e c\u0169ng k vi\u1ebft \u0111\u01b0\u1ee3c. n\u00ean e mu\u1ed1n tham kh\u1ea3o a c\u00e1ch hk l\u1eadp tr\u00ecnh ^^<br>b\u1ecdn e c\u00f3 quy\u1ec3n b\u00ed k\u00edp luy\u1ec7n r\u1ed3ng v\u00e0 th\u1ea7y e b\u1ea3o l\u00ean m\u1ea1ng tham kh\u1ea3o trang c\u1ee7a a r t\u1ef1 h\u1ecdc. l\u00ean l\u1edbp th\u1ea7y ch\u1ec9 ch\u1eefa b\u00e0i n\u00e0o kh\u00f3 th\u00f4i ^^<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">em h\u1ecdc tr\u01b0\u1eddng n\u00e0o, n\u0103m m\u1ea5y?<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-left\">e h\u1ecdc \u0111h \bxxx. ti\u1ec1n th\u00e2n l\u00e0 yyy\u001d \u1ea1. e m\u1edbi n\u0103m nh\u1ea5t :3 (\u0110o\u1ea1n n\u00e0y m\u00ecnh xin gi\u1ea5u th\u00f4ng tin nh\u00e9, ch\u1ec9 ti\u1ebft l\u1ed9 l\u00e0 \u1edf H\u00e0 N\u1ed9i)<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">ukm, n\u0103m nh\u1ea5t h\u1ecdc th\u00ec c\u0169ng h\u01a1i v\u1ea5t v\u1ea3 1 t\u00fd khi l\u00ean \u0111\u1ea1i h\u1ecdc, h\u1ecdc n\u00f3 ko nh\u01b0 c\u1ea5p 3.<br>c\u00e1c th\u1ea7y c\u00f4 ch\u1ec9 h\u01b0\u1edbng d\u1eabn l\u00e0 ch\u00ednh, vi\u1ec7c h\u1ecdc e ph\u1ea3i t\u1ef1 h\u1ecdc.<br>\u0111\u1ea1i h\u1ecdc = h\u1ecdc \u0111\u1ea1i -&gt; t\u1ef1 h\u1ecdc.<\/p>\n\n\n\n<p class=\"chat-left\">\ud83d\ude00 \ud83d\ude00 (C\u01b0\u1eddi tr\u1eeb)<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">\u0111\u1ec3 theo h\u1ecdc l\u1eadp tr\u00ecnh th\u00ec con g\u00e1i h\u01a1i kh\u00f3 kh\u0103n h\u01a1n con trai, nh\u01b0ng ko ph\u1ea3i ko \u0111k, n\u1ebfu c\u1ed1 g\u1eafng theo \u0111\u01b0\u1ee3c th\u00ec s\u1ebd gi\u1ecfi h\u01a1n con trai l\u00e0 kh\u00e1c.<br>e c\u00f3 m\u00e1y t\u00ednh ch\u01b0a. n\u1ebfu ch\u01b0a c\u00f3 th\u00ec n\u00ean ra th\u01b0 vi\u1ec7n hay n\u01a1i n\u00e0o c\u00f3 m\u00e1y t\u00ednh, ho\u1eb7c n\u00ean mua 1 c\u00e1i v\u00e0 t\u00ecm n\u01a1i y\u00ean t\u0129nh \u0111\u1ec3 t\u1eadp trung h\u1ecdc.<br>T\u00e0i li\u1ec7u th\u00ec n\u00ean l\u1ea5y gi\u00e1o tr\u00ecnh c\u1ee7a th\u1ea7y, tham kh\u1ea3o tr\u00ean m\u1ea1ng ho\u1eb7c blog c\u1ee7a a.<br><\/p>\n\n\n\n<p class=\"chat-left\">hi\u1ec7n t\u1ea1i a c\u00f3 \u1edf hn k \u1ea1e mua m\u00e1y r.  v\u00ec n\u0103m nh\u1ea5t b\u1ecdn e hk h\u1ea7u h\u1ebft l\u00e0 ng\u1ed3i m\u00e1y \u1ea1<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">Trong l\u00fac h\u1ecdc th\u00ec l\u00e0m theo c\u00e1c b\u01b0\u1edbc:  <br>1. \u0111\u1ecdc qua l\u00fd thuy\u1ebft m\u1ed9t t\u00fd. hi\u1ec3u hay ko c\u0169ng ko sao. <br>2. \u0110\u1ecdc v\u00ed d\u1ee5 trong s\u00e1ch ho\u1eb7c tr\u00ean blog <br>3. D\u1ef1 \u0111o\u00e1n xem ch\u01b0\u01a1ng tr\u00ecnh n\u00f3 l\u00e0m c\u00f4ng vi\u1ec7c g\u00ec, k\u1ebft qu\u1ea3 nh\u01b0 n\u00e0o (c\u00f3 th\u1ec3 m\u1edbi h\u1ecdc s\u1ebd kh\u00f3 d\u1ef1 \u0111o\u00e1n nh\u01b0ng c\u1ee9 th\u1eed) <br>4. Ch\u00e9p code \u0111\u00f3 v\u00e0o m\u00e1y ch\u1ea1y th\u1eed, so s\u00e1nh k\u1ebft qu\u1ea3 vs d\u1ef1 \u0111o\u00e1n xem <br>5. T\u1ef1 code l\u1ea1i l\u1ea7n n\u1eefa theo \u00fd hi\u1ec3u, theo c\u00e1ch l\u00e0m c\u1ee7a minh <br>6. T\u1ef1 ngh\u0129 ra b\u00e0i t\u01b0\u01a1ng t\u1ef1 ho\u1eb7c s\u1eeda m\u1ed9t ch\u00fat (vd n\u00f3 in ra t\u00ean ng\u01b0\u1eddi ta th\u00ec m\u00ecnh in ra t\u00ean m\u00ecnh&#8230;) <br>N\u1ebfu c\u00f3 l\u1ed7i, th\u00ec \u0111\u1ecdc xem l\u1ed7i \u0111\u00f3 l\u00e0 g\u00ec (ko \u0111\u1ecdc \u0111\u01b0\u1ee3c th\u00ec copy l\u00ean google d\u1ecbch) sau d\u1ea7n s\u1ebd quen.<br>&#8211; N\u00f3i l\u00e0 th\u1ebf nh\u01b0ng quan tr\u1ecdng ph\u1ea3i d\u00e0nh th\u1eddi gian h\u1ecdc cho n\u00f3 \u0111\u1ee7 nhi\u1ec1u. n\u1ebfu ko h\u1ecdc s\u1ebd kh\u00f3 v\u00e0 nhanh n\u1ea3n.l\u00fac h\u1ecdc th\u00ec t\u1eaft h\u1ebft fb hay linh tinh \u0111i, l\u00fac n\u00e0o ko h\u1ecdc th\u00ec m\u1edf ho\u1eb7c c\u1ea7n h\u1ecfi ai \u0111\u00f3 c\u00e1i g\u00ec \u0111\u00f3 th\u00ec m\u1edf.<br>&#8211; a \u1edf t\u1eadn Th\u00e1i c\u01a1. \ud83d\ude1b<\/p>\n\n\n\n<p class=\"chat-left\">(Nghi\u1ebfn r\u0103ng, ch\u1eafc t\u01b0\u1edfng \u1edf Th\u00e1i Lan, th\u1ef1c ra t\u1edb \u0111ang \u1edf Th\u00e1i Nguy\u00ean :v )<\/p>\n\n\n\n<figure class=\"wp-block-image chat-left\"><img src=\"https:\/\/static.xx.fbcdn.net\/images\/emoji.php\/v9\/t79\/1\/32\/1f62c.png\" alt=\"\ud83d\ude2c\"\/><\/figure>\n\n\n\n<p class=\"chat-left\">&#8211; Th\u01b0\u1eddng th\u01b0\u1eddng b\u1ecdn e l\u00e0m bt ntn n\u00ec a. A demo cho e b\u00e0i n\u00e0y t\u00fd t\u00fd \u0111\u01b0\u1ee3c hem<\/p>\n\n\n\n<figure class=\"wp-block-image chat-left\"><img data-attachment-id=\"6640\" data-permalink=\"https:\/\/cachhoc.net\/2019\/11\/23\/tu-van-kinh-nghiem-hoc-lap-trinh\/76899300_1006370966373228_978233498072514560_n\/\" data-orig-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg?fit=384%2C640&amp;ssl=1\" data-orig-size=\"384,640\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"76899300_1006370966373228_978233498072514560_n\" data-image-description=\"\" data-medium-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg?fit=180%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg?fit=384%2C640&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6640\" srcset=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg?w=384&amp;ssl=1 384w, https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg?resize=180%2C300&amp;ssl=1 180w, https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg?resize=150%2C250&amp;ssl=1 150w\" sizes=\"(max-width: 384px) 100vw, 384px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">ko demo dk. (\u0110\u1ebfn \u0111\u00e2y ngh\u0129 \bch\u1eb3ng l\u1ebd m\u1ee5c \u0111\u00edch ch\u1ec9 l\u00e0 b\u1ea3o gi\u1ea3i b\u00e0i t\u1eadp h\u1ed9 sao :v )<\/p>\n\n\n\n<p class=\"chat-left\">kh\u00f3 b\u1ecf x\u1eeb \u1ea5y. e \u0111\u1ecdc m\u00e3i m\u00e0 k hi\u1ec3u d\u1ed1t v\u00f4 ph\u01b0\u01a1ng c\u1ee9u ch\u1eefa \u00e0 (icon bi\u1ec3u c\u1ea3m cho\u00e1ng v\u00e1ng)<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">\u0111\u00e2y l\u00e0 b\u00e0i t\u1eadp ch\u1ee9 ko ph\u1ea3i b\u00e0i h\u1ecdc, n\u00ean e c\u1ea7n t\u1ef1 suy ngh\u0129 c\u00e1ch l\u00e0m, v\u1eadn d\u1ee5ng nh\u1eefng g\u00ec \u0111\u00e3 h\u1ecdc \u0111\u1ec3 code theo c\u00e1ch l\u00e0m \u0111\u00f3. Tr\u01b0\u1edbc ti\u00ean ph\u1ea3i ngh\u0129 ra c\u00e1ch l\u00e0m. Ngh\u0129 c\u00e1ch l\u00e0m c\u1ee7a 1 b\u00e0i th\u00ec ph\u1ea3i ngh\u0129 t\u1eeb y\u00eau c\u1ea7u \u0111\u1ebfn nh\u1eefng g\u00ec \u0111\u00e3 h\u1ecdc. <br>vd: y\u00eau c\u1ea7u l\u00e0 t\u00ecm kho\u1ea3ng c\u00e1ch l\u1edbn nh\u1ea5t gi\u1eefa 2 ph\u1ea7n t\u1eed li\u00ean ti\u1ebfp. <br>-&gt; t\u1ee9c l\u00e0 t\u00ecm 2 s\u1ed1 li\u00ean ti\u1ebfp m\u00e0 |a-b| l\u00e0 l\u1edbn nh\u1ea5t. <br>-&gt; quy v\u1ec1 t\u00ecm max  <br>-&gt; 2 s\u1ed1 li\u00ean ti\u1ebfp trong d\u00e3y th\u00ec ph\u1ea3i duy\u1ec7t h\u1ebft d\u00e3y, t\u1eebng s\u1ed1 m\u1ed9t <br>-&gt; duy\u1ec7t \u0111\u1ebfn s\u1ed1 th\u1ee9 i l\u00e0 a[i] th\u00ec x\u00e9t | a[i] &#8211; a[i+1] | xem c\u00f3 l\u00e0 max ko <br>-&gt; duy\u1ec7t d\u00e3y th\u00ec ph\u1ea3i d\u00f9ng v\u00f2ng l\u0103p &#8230; v\u00e2n v\u00e2n v\u00e0 m\u00e2y m\u00e2y&#8230;<br><br>&#8211; \bGi\u1edd ch\u1ec9 vi\u1ec7c code theo c\u00e1ch l\u00e0m <br>code th\u00ec l\u1ea1i \u0111i t\u1eeb d\u01b0\u1edbi l\u00ean tr\u00ean <br>&#8211; duy\u1ec7t d\u00e3y d\u00f9ng v\u00f2ng l\u1eb7p th\u00ec ph\u1ea3i bi\u1ebft d\u00f9ng v\u00f2ng l\u1eb7p n\u00e0o, for, while hay l\u00e0 do..while.  <br>&#8211; ch\u1ecdn \u0111\u01b0\u1ee3c v\u00f2ng l\u1eb7p ph\u00f9 h\u1ee3p th\u00ec ph\u1ea3i hi\u1ec3u nguy\u00ean t\u1eafc ho\u1ea1t \u0111\u1ed9ng c\u1ee7a v\u00f2ng l\u1eb7p (hi\u1ec3u l\u00e0 trong qu\u00e1 tr\u00ecnh h\u1ecdc) <br>&#8211; ch\u1ecdn xong th\u00ec code v\u00f2ng l\u1eb7p \u0111\u00f3 ra <br>&#8211; \u0111\u00ean b\u01b0\u1edbc t\u00ecm | a[i] &#8211; a[i+1] | l\u1edbn nh\u00e2t b\u1eb1ng c\u00e1ch so s\u00e1nh max v\u1edbi | a[i] &#8211; a[i+1] |, n\u1ebfu max &gt; | a[i] &#8211; a[i+1] | th\u00ec l\u01b0u l\u1ea1i gi\u00e1 tr\u1ecb \u0111\u00f3 v\u00e0o max. <br>&#8211; duy\u1ec7t xong c\u0169ng l\u00e0 l\u00fac t\u00ecm xong max &#8211; in k\u1ebft qu\u1ea3 ra.<br>&#8211; Th\u1ebf n\u00e0y l\u00e0 g\u1ee3i \u00fd t\u1eadn r\u0103ng r\u1ed3i, ch\u1ec9 vi\u1ec7c nhai th\u00f4i.<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-left\">ai tr\u1ea3 cho t\u00f4i c\u00e1i \u0111\u0129a bay n\u00e0o (icon c\u01b0\u1eddi ra n\u01b0\u1edbc m\u1eaft sau m\u1ed9t lo\u1ea1t nh\u1eefng ph\u00e2n t\u00edch \u1edf h\u00e0nh tinh tr\u00e1i \u0111\u1ea5t th\u00ec em mu\u1ed1n bay v\u1ec1 sao ho\u1ea3 s\u1ed1ng :v)<br>th\u1ef1c s\u1ef1 lu\u00f4n. n\u1ec3 m\u1ea5y \u00f4ng l\u1eadp tr\u00ecnh th\u1ef1c s\u1ef1<br>m\u00e0 n\u00e3y qu\u00ean h\u1ecfi a sinh n\u0103m bn \u1ea1<\/p>\n\n\n\n<p style=\"text-align:left\" class=\"chat-right\">n\u00f3 gi\u1ed1ng nh\u01b0 n\u1ea5u c\u01a1m th\u00f4i m\u00e0. mu\u1ed1n n\u1ea5u c\u01a1m ph\u1ea3i bi\u1ebft c\u00e1ch n\u1ea5u c\u01a1m.<br>h\u1ecfi l\u00e0m gi? (\u00fd l\u00e0 h\u1ecfi tu\u1ed5i l\u00e0m g\u00ec)<br>li\u00ean quan t\u1edbi b\u00e0i t\u1eadp hay c\u00e1ch h\u1ecdc l\u1eadp tr\u00ecnh?<br>(\u0110\u1ebfn \u0111\u00e2y th\u00ec t\u00f4i bi\u1ebft em kh\u00f4ng mu\u1ed1n nghe c\u00e1ch h\u1ecdc hay kinh nghi\u1ec7m l\u1eadp tr\u00ecnh l\u00e0m g\u00ec n\u1eefa   :v.)<br><\/p>\n\n\n\n<p style=\"text-align:center\"><em>V\u00e0 cu\u1ed9c n\u00f3i chuy\u1ec7n c\u0169ng k\u1ebft th\u00fac s\u1edbm \u001db\u1eb1ng v\u00e0i l\u1eddi ch\u00e0o sau \u0111\u00f3.<\/em><\/p>\n\n\n\n<p><\/p>\n","excerpt":"<p>Khi m\u1edbi b\u1eaft \u0111\u1ea7u h\u1ecdc l\u1eadp tr\u00ecnh, nh\u1ea5t l\u00e0 c\u00e1c b\u1ea1n sinh vi\u00ean n\u0103m nh\u1ea5t, c\u00e1c b\u1ea1n hay h\u1ecfi: anh ch\u1ec9 em c\u00e1ch h\u1ecdc l\u1eadp tr\u00ecnh, anh cho em xin \u00edt kinh nghi\u1ec7m h\u1ecdc l\u1eadp tr\u00ecnh. Hi v\u1ecdng s\u1ebd gi\u00fap \u00edch cho m\u1ed9t s\u1ed1 b\u1ea1n c\u00f3 th\u1eafc m\u1eafc t\u01b0\u01a1ng t\u1ef1 v\u1edbi \u0111o\u1ea1n h\u1ed9i tho\u1ea1i gi\u1eefa m\u00ecnh (b\u00ean ph\u1ea3i) v\u00e0 m\u1ed9t b\u1ea1n g\u00e1i xinh \u0111\u1eb9p h\u1ecdc n\u0103m nh\u1ea5t (b\u00ean tr\u00e1i). e ch\u00e0o a Qu\u00e2n Alo e [&hellip;]<\/p>\n","date":"2019-11-23 09:17:54","modified":"2019-11-23 09:30:15","categories":[],"tags":[{"id":1203,"slug":"cach-hoc-lap-trinh","title":"c\u00e1ch h\u1ecdc l\u1eadp tr\u00ecnh","description":"","post_count":2},{"id":2384,"slug":"sinh-vien-moi-hoc-lap-trinh","title":"sinh vi\u00ean m\u1edbi h\u1ecdc l\u1eadp tr\u00ecnh","description":"","post_count":1},{"id":2383,"slug":"tu-van-lap-trinh","title":"t\u1ef1 v\u1ea5n l\u1eadp tr\u00ecnh","description":"","post_count":1}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[{"id":35337,"name":"Dao Luong Duy (K12_HN)","url":"","date":"2020-04-05 15:53:16","content":"<p>Em ch\u00e0o anh \u1ea1. Hi\u1ec7n t\u1ea1i em \u0111ang mu\u1ed1n vi\u1ebft 1 b\u00e0i h\u01b0\u1edbng d\u1eabn v\u1ec1 l\u1eadp tr\u00ecnh game cho c\u00e1c b\u1ea1n y\u00eau th\u00edch code Java, e \u0111\u1ecbnh l\u1ef1a ch\u1ecdn game Pikachu v\u00e0 r\u1ea5t may m\u1eafn khi anh c\u00f3 1 b\u00e0i vi\u1ebft h\u01b0\u1edbng d\u1eabn v\u1ec1 thu\u1eadt to\u00e1n c\u0169ng nh\u01b0 v\u1ec1 game r\u1ea5t tuy\u1ec7t v\u1eddi. Em mu\u1ed1n xin ph\u00e9p anh cho ph\u00e9p em \u0111\u01b0\u1ee3c l\u1ea5y \u00fd t\u01b0\u1edfng \u1ea5y v\u1ec1 h\u1ecdc, nghi\u00ean c\u1ee9u v\u00e0 vi\u1ebft b\u00e0i h\u01b0\u1edbng d\u1eabn cho c\u00e1c b\u1ea1n kh\u00e1c \u0111\u01b0\u1ee3c kh\u00f4ng \u1ea1? Em s\u1ebd ghi l\u1ea1i ngu\u1ed3n tham kh\u1ea3o \u1ea1! Em hy v\u1ecdng l\u00e0 c\u00f3 th\u1ec3 truy\u1ec1n \u0111\u01b0\u1ee3c nhi\u1ec1u l\u1eeda \u0111am m\u00ea cho c\u00e1c b\u1ea1n y\u00eau th\u00edch l\u1eadp tr\u00ecnh n\u00f3i chung, v\u00e0 c\u00e1c b\u1ea1n y\u00eau th\u00edch l\u1eadp tr\u00ecnh Java n\u00f3i ri\u00eang \u1ea1!<br \/>\nMong nh\u1eadn \u0111\u01b0\u1ee3c ph\u1ea3n h\u1ed3i t\u1eeb anh! Em c\u1ea3m \u01a1n anh r\u1ea5t nhi\u1ec1u \u1ea1!<\/p>\n","parent":0},{"id":35338,"name":"nguyenvanquan7826","url":"","date":"2020-04-05 16:01:45","content":"<p>Ok, b\u1ea1n c\u1ee9 d\u00f9ng v\u00e0 chia s\u1ebb, ghi ngu\u1ed3n l\u00e0 \u0111\u01b0\u1ee3c. ^^<\/p>\n","parent":35337,"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"}}],"attachments":[{"id":6640,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/11\/76899300_1006370966373228_978233498072514560_n.jpg","slug":"76899300_1006370966373228_978233498072514560_n","title":"76899300_1006370966373228_978233498072514560_n","description":"","caption":"","parent":6639,"mime_type":"image\/jpeg","images":[]},{"id":6654,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/11\/Screen-Shot-2019-11-23-at-9.16.50-AM.png","slug":"screen-shot-2019-11-23-at-9-16-50-am","title":"Screen Shot 2019-11-23 at 9.16.50 AM","description":"","caption":"","parent":6639,"mime_type":"image\/png","images":[]}],"comment_count":2,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6612,"type":"post","slug":"cach-tao-thu-vien-android-cho-nguoi-khac-dung","url":"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/","status":"publish","title":"C\u00e1ch t\u1ea1o th\u01b0 vi\u1ec7n Android cho ng\u01b0\u1eddi kh\u00e1c d\u00f9ng","title_plain":"C\u00e1ch t\u1ea1o th\u01b0 vi\u1ec7n Android cho ng\u01b0\u1eddi kh\u00e1c d\u00f9ng","content":"\n<!--TOC-->\n\n\n\n<p>Ch\u00e0o c\u00e1c b\u1ea1n, c\u00f3 bao gi\u1edd b\u1ea1n h\u1ecfi nh\u1eefng th\u01b0 vi\u1ec7n c\u1ee7a android trong <strong>dependencies<\/strong> m\u00e0 c\u00e1c b\u1ea1n d\u00f9ng c\u1ee7a ng\u01b0\u1eddi kh\u00e1c, h\u1ecd t\u1ea1o ra ch\u00fang nh\u01b0 th\u1ebf n\u00e0o? H\u00f4m nay m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1c b\u1ea1n <strong>c\u00e1ch t\u1ea1o th\u01b0 vi\u1ec7n android v\u00e0 c\u00f4ng b\u1ed1 cho ng\u01b0\u1eddi kh\u00e1c d\u00f9ng<\/strong>. V\u00e0 t\u1ea5t nhi\u00ean t\u1ed1i thi\u1ec3u th\u00ec b\u1ea1n c\u0169ng c\u00f3 th\u01b0 vi\u1ec7n cho nhi\u1ec1u project c\u1ee7a m\u00ecnh d\u00f9ng chung, \u0111\u1ee1 ph\u1ea3i vi\u1ebft l\u1ea1i ho\u1eb7c copy d\u1eabn \u0111\u1ebfn kh\u00f4ng \u0111\u1ed3ng nh\u1ea5t th\u01b0 vi\u1ec7n gi\u1eefa c\u00e1c project.<\/p>\n\n\n\n<h2>T\u1ea1o \u1ee9ng d\u1ee5ng v\u00e0 th\u01b0 vi\u1ec7n\n\n\n\n<p>\u0110\u1ea7u ti\u00ean c\u00e1c b\u1ea1n t\u1ea1o ra m\u1ed9t Project Android nh\u01b0 b\u00ecnh th\u01b0\u1eddng b\u1eb1ng Android Studio. Ti\u1ebfp theo b\u1ea1n v\u00e0o ch\u1ecdn <strong>Menu File -&gt; New -&gt; New Module<\/strong><\/p>\n\n\n\n<p>T\u1ea1i \u0111\u00e2y c\u00e1c b\u1ea1n ch\u1ecdn Android Library.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-attachment-id=\"6613\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/cach-tao-thu-vien-android\/\" data-orig-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png?fit=880%2C625&amp;ssl=1\" data-orig-size=\"880,625\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"cach-tao-thu-vien-android\" data-image-description=\"\" data-medium-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png?fit=300%2C213&amp;ssl=1\" data-large-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png?fit=780%2C554&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6613\" srcset=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png?w=880&amp;ssl=1 880w, https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png?resize=300%2C213&amp;ssl=1 300w, https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png?resize=250%2C178&amp;ssl=1 250w\" sizes=\"(max-width: 780px) 100vw, 780px\" data-recalc-dims=\"1\" \/><\/figure><\/div>\n\n\n\n<p>Ti\u1ebfp theo c\u00e1c b\u1ea1n nh\u1eadp c\u00e1c th\u00f4ng tin c\u1ee7a th\u01b0 vi\u1ec7n v\u00e0o (n\u00f3 g\u1ea7n gi\u1ed1ng nh\u01b0 1 Project v\u1eady). \u1ede \u0111\u00e2y m\u00ecnh demo v\u1ec1 m\u1ed9t th\u01b0 vi\u1ec7n hi\u1ec3n th\u1ecb toast. C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o th\u01b0 vi\u00ean ri\u00eang tu\u1ef3 m\u1ee5c \u0111\u00edch c\u1ee7a m\u00ecnh<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-attachment-id=\"6614\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/publish-library-android\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png?fit=896%2C636&amp;ssl=1\" data-orig-size=\"896,636\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"publish-library-android\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png?fit=300%2C213&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png?fit=780%2C554&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6614\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png?w=896&amp;ssl=1 896w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png?resize=300%2C213&amp;ssl=1 300w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png?resize=250%2C177&amp;ssl=1 250w\" sizes=\"(max-width: 780px) 100vw, 780px\" data-recalc-dims=\"1\" \/><\/figure><\/div>\n\n\n\n<p>C\u00e1c b\u1ea1n click finish v\u00e0 \u0111\u1ee3i m\u1ed9t ch\u00fat cho project load module m\u1edbi c\u1ee7a ch\u00fang ta. Sau khi load xong c\u00e1c b\u1ea1n s\u1ebd th\u1ea5y trong ch\u1ebf \u0111\u1ed9 xem Android, ch\u00fang ta c\u00f3 1 folder ngang h\u00e0ng folder app l\u00e0 toastlib. N\u00f3 c\u00f3 k\u00e8m icon bi\u1ec3u t\u01b0\u1ee3ng c\u1ee7a th\u01b0 vi\u1ec7n (library) v\u00e0 c\u00f3 c\u1ea5u tr\u00fac nh\u01b0 folder app c\u1ee7a ch\u00fang ta.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-attachment-id=\"6615\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/android-library-publish\/\" data-orig-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-library-publish.png?fit=222%2C245&amp;ssl=1\" data-orig-size=\"222,245\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"android-library-publish\" data-image-description=\"\" data-medium-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-library-publish.png?fit=222%2C245&amp;ssl=1\" data-large-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-library-publish.png?fit=222%2C245&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-library-publish.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6615\" data-recalc-dims=\"1\"\/><\/figure><\/div>\n\n\n\n<p>B\u00e2y gi\u1edd c\u00e1c b\u1ea1n m\u1edf file build.gradle (app) c\u1ee7a module app ra, th\u00eam d\u00f2ng sau v\u00e0o \u0111\u1ec3 project c\u1ee7a ch\u00fang ta load th\u01b0 vi\u1ec7n v\u00e0o. v\u00e0 nh\u1edb click Sync Now \u0111\u1ec3 \u0111\u1ed3ng b\u1ed9 l\u1ea1i.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>implementation project(&#8216;:libstoast&#8217;)<\/p><\/blockquote>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6616\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/create-android-libs\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png?fit=894%2C564&amp;ssl=1\" data-orig-size=\"894,564\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"create-android-libs\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png?fit=300%2C189&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png?fit=780%2C492&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6616\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png?w=894&amp;ssl=1 894w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png?resize=300%2C189&amp;ssl=1 300w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png?resize=250%2C158&amp;ssl=1 250w\" sizes=\"(max-width: 780px) 100vw, 780px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<h2>B\u1eaft \u0111\u1ea7u vi\u1ebft th\u01b0 vi\u1ec7n\n\n\n\n<p>Trong libstoas, ch\u00fang ta t\u1ea1o ra 1 file java l\u00e0 MToast \u0111\u1ec3 th\u1ef1c hi\u1ec7n hi\u1ec3n th\u1ecb m\u1ed9t Toast ri\u00eang c\u1ee7a ch\u00fang ta.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-attachment-id=\"6617\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/android-create-library\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png?fit=306%2C180&amp;ssl=1\" data-orig-size=\"306,180\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"android-create-library\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png?fit=300%2C176&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png?fit=306%2C180&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6617\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png?w=306&amp;ssl=1 306w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png?resize=300%2C176&amp;ssl=1 300w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png?resize=250%2C147&amp;ssl=1 250w\" sizes=\"(max-width: 306px) 100vw, 306px\" data-recalc-dims=\"1\" \/><\/figure><\/div>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage com.nguyenvanquan7826.libstoast;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.view.View;\nimport android.widget.Toast;\n\npublic class MToast {\n    public static void show(Context context, String message) {\n        Toast toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);\n        View view = toast.getView();\n        view.setBackgroundColor(Color.BLUE);\n        toast.show();\n    }\n}\n<\/pre>\n\n\n<p>V\u1eady l\u00e0 ch\u00fang ta \u0111\u00e3 vi\u1ebft xong th\u01b0 vi\u1ec7n ri\u00eang c\u1ee7a ch\u00fang ta. Ngo\u00e0i ra trong th\u01b0 vi\u1ec7n, c\u00e1c b\u1ea1n ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 t\u1ea1o Fragment, Activity,&#8230; k\u00e8m giao di\u1ec7n \u0111\u1ec3 ph\u1ee5c v\u1ee5 cho c\u00e1c project kh\u00e1c nhau.<\/p>\n\n\n\n<p>B\u00e2y gi\u1edd ch\u00fang ta tr\u1edf l\u1ea1i module app ch\u00ednh l\u00e0 project g\u1ed1c c\u1ee7a ch\u00fang ta \u0111\u1ec3 s\u1eed d\u1ee5ng th\u01b0 vi\u1ec7n v\u1eeba t\u1ea1o ra.<\/p>\n\n\n\n<p>Trong file MainActivity ch\u00fang ta thay s\u1ef1 ki\u1ec7n m\u1eb7c \u0111\u1ecbnh c\u1ee7a FAB b\u1eb1ng vi\u1ec7c hi\u1ec3n th\u1ecb MToast<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage com.nguyenvanquan7826.demolibs;\n\nimport android.os.Bundle;\nimport android.view.View;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\n\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\nimport com.nguyenvanquan7826.libstoast.MToast;\n\npublic class MainActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        Toolbar toolbar = findViewById(R.id.toolbar);\n        setSupportActionBar(toolbar);\n\n        FloatingActionButton fab = findViewById(R.id.fab);\n        fab.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                MToast.show(MainActivity.this, &quot;This is MToast&quot;);\n            }\n        });\n    }\n}\n<\/pre>\n\n\n<p>K\u1ebft qu\u1ea3:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img data-attachment-id=\"6618\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/android-tao-thu-vien\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?fit=1080%2C1920&amp;ssl=1\" data-orig-size=\"1080,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"android-tao-thu-vien\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?fit=169%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?fit=576%2C1024&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?fit=576%2C1024&amp;ssl=1\" alt=\"\" class=\"wp-image-6618\" width=\"196\" height=\"348\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?w=1080&amp;ssl=1 1080w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?resize=169%2C300&amp;ssl=1 169w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?resize=576%2C1024&amp;ssl=1 576w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg?resize=141%2C250&amp;ssl=1 141w\" sizes=\"(max-width: 196px) 100vw, 196px\" \/><\/figure><\/div>\n\n\n\n<h2>Publish th\u01b0 vi\u1ec7n cho m\u1ecdi ng\u01b0\u1eddi dung\n\n\n\n<p>\u0110\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u01b0a th\u01b0 vi\u1ec7n l\u00ean to\u00e0n c\u1ea7u cho m\u1ecdi ng\u01b0\u1eddi d\u00f9ng, tr\u01b0\u1edbc h\u1ebft c\u00e1c b\u1ea1n c\u1ea7n c\u00e0i \u0111\u1eb7t git v\u00e0o m\u00e1y. Sau \u0111\u00f3 t\u1ea1o m\u1ed9t t\u00e0i kho\u1ea3n tr\u00ean github. Nh\u1eefng vi\u1ec7c n\u00e0y c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 t\u00ecm h\u01b0\u1edbng d\u1eabn tr\u00ean google r\u1ea5t nhi\u1ec1u.<\/p>\n\n\n\n<p>Ti\u1ebfp theo c\u00e1c b\u1ea1n t\u1ea1o 1 repository tr\u00ean gihub \u0111\u1ec3 ch\u1ebf \u0111\u1ed9 pubic<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-attachment-id=\"6619\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/android-libs-create-github-respontory\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png?fit=763%2C650&amp;ssl=1\" data-orig-size=\"763,650\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"android-libs-create-github-respontory\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png?fit=300%2C256&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png?fit=763%2C650&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6619\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png?w=763&amp;ssl=1 763w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png?resize=300%2C256&amp;ssl=1 300w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png?resize=250%2C213&amp;ssl=1 250w\" sizes=\"(max-width: 763px) 100vw, 763px\" data-recalc-dims=\"1\" \/><\/figure><\/div>\n\n\n\n<p>Ti\u1ebfp theo, github s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1c b\u1ea1n \u0111\u01b0a code l\u00ean b\u1eb1ng m\u1ed9t s\u1ed1 c\u00e2u l\u1ec7nh.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6620\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/screen-shot-2019-08-20-at-5-11-36-pm\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png?fit=975%2C362&amp;ssl=1\" data-orig-size=\"975,362\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screen-Shot-2019-08-20-at-5.11.36-PM\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png?fit=300%2C111&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png?fit=780%2C290&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6620\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png?w=975&amp;ssl=1 975w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png?resize=300%2C111&amp;ssl=1 300w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png?resize=250%2C93&amp;ssl=1 250w\" sizes=\"(max-width: 780px) 100vw, 780px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>C\u00e1c b\u1ea1n m\u1edf terminal c\u1ee7a android studio l\u00ean (\u1edf b\u00ean thanh tr\u1ea1ng th\u00e1i b\u00ean d\u01b0\u1edbi) v\u00e0 l\u1ea7n l\u01b0\u1ee3t ch\u1ea1y c\u00e1c l\u1ec7nh nh\u01b0 github h\u01b0\u1edbng d\u1eabn (link repository c\u1ee7a b\u1ea1n s\u1ebd kh\u00e1c c\u1ee7a m\u00ecnh nh\u00e9).<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>git init<\/p><p>git remote add origin https:\/\/github.com\/nguyenvanquan7826\/androiddemolibs.git<\/p><p>git add .<\/p><p>git commit -m &#8220;init&#8221;<\/p><p>git push origin master<\/p><\/blockquote>\n\n\n\n<p>L\u1ec7nh push cu\u1ed1i c\u00f9ng, c\u00f3 th\u1ec3 b\u1ea1n s\u1ebd ph\u1ea3i nh\u1eadp email v\u00e0 password t\u00e0i kho\u1ea3n github c\u1ee7a b\u1ea1n nh\u00e9. Sau khi push xong th\u00ec tr\u00ean github c\u1ee7a b\u1ea1n s\u1ebd c\u00f3 code nh\u01b0 n\u00e0y:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6621\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/screen-shot-2019-08-20-at-5-17-25-pm\/\" data-orig-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png?fit=999%2C569&amp;ssl=1\" data-orig-size=\"999,569\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screen-Shot-2019-08-20-at-5.17.25-PM\" data-image-description=\"\" data-medium-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png?fit=300%2C171&amp;ssl=1\" data-large-file=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png?fit=780%2C444&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6621\" srcset=\"https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png?w=999&amp;ssl=1 999w, https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png?resize=300%2C171&amp;ssl=1 300w, https:\/\/i1.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png?resize=250%2C142&amp;ssl=1 250w\" sizes=\"(max-width: 780px) 100vw, 780px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>C\u00e1c b\u1ea1n click v\u00e0o menu releases v\u00e0 t\u1ea1o m\u1edbi releases \u0111\u1ec3 t\u1ea1o &#8220;xu\u1ea5t b\u1ea3n&#8221; cho th\u01b0 vi\u1ec7n.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6623\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/screen-shot-2019-08-20-at-5-18-53-pm\/\" data-orig-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png?fit=986%2C471&amp;ssl=1\" data-orig-size=\"986,471\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screen-Shot-2019-08-20-at-5.18.53-PM\" data-image-description=\"\" data-medium-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png?fit=300%2C143&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png?fit=780%2C373&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6623\" srcset=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png?w=986&amp;ssl=1 986w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png?resize=300%2C143&amp;ssl=1 300w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png?resize=250%2C119&amp;ssl=1 250w\" sizes=\"(max-width: 780px) 100vw, 780px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6626\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/screen-shot-2019-08-20-at-5-23-14-pm\/\" data-orig-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png?fit=485%2C674&amp;ssl=1\" data-orig-size=\"485,674\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screen-Shot-2019-08-20-at-5.23.14-PM\" data-image-description=\"\" data-medium-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png?fit=216%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png?fit=485%2C674&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6626\" srcset=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png?w=485&amp;ssl=1 485w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png?resize=216%2C300&amp;ssl=1 216w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png?resize=180%2C250&amp;ssl=1 180w\" sizes=\"(max-width: 485px) 100vw, 485px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>\u0110\u1ebfn \u0111\u00e2y coi nh\u01b0 xong r\u1ed3i. Gi\u1edd b\u1ea1n v\u00e0o <a href=\"https:\/\/jitpack.io\/\">https:\/\/jitpack.io\/<\/a> , \u0111\u0103ng nh\u1eadp b\u1eb1ng github v\u00e0 t\u00ecm nh\u1eadp \u0111\u01b0\u1eddng d\u1eabn repository c\u1ee7a m\u00ecnh v\u00e0o s\u1ebd th\u1ea5y.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6627\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/screen-shot-2019-08-20-at-5-38-44-pm\/\" data-orig-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png?fit=644%2C393&amp;ssl=1\" data-orig-size=\"644,393\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screen-Shot-2019-08-20-at-5.38.44-PM\" data-image-description=\"\" data-medium-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png?fit=300%2C183&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png?fit=644%2C393&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6627\" srcset=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png?w=644&amp;ssl=1 644w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png?resize=300%2C183&amp;ssl=1 300w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png?resize=250%2C153&amp;ssl=1 250w\" sizes=\"(max-width: 644px) 100vw, 644px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>K\u00e9o xu\u1ed1ng b\u00ean d\u01b0\u1edbi s\u1ebd th\u1ea5y nh\u01b0 n\u00e0y l\u00e0 b\u1ea1n v\u00e0 m\u1ecdi ng\u01b0\u1eddi c\u00f3 th\u1ec3 d\u00f9ng th\u01b0 vi\u1ec7n c\u1ee7a b\u1ea1n b\u1eb1ng 2 b\u01b0\u1edbc nh\u01b0 h\u01b0\u1edbng d\u1eabn \u1edf \u0111\u00e2y: 1. th\u00eam <strong>maven { url &#8216;https:\/\/jitpack.io&#8217; }<\/strong> v\u00e0o build.gradle c\u1ee7a project v\u00e0 2 l\u00e0 \u0111\u01b0a th\u01b0 vi\u1ec7n c\u1ee7a m\u00ecnh v\u00e0o, thay tag b\u1eb1ng version m\u00e0 b\u1ea1n \u0111\u00e3 t\u1ea1o (1.0.0)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6628\" data-permalink=\"https:\/\/cachhoc.net\/2019\/08\/20\/cach-tao-thu-vien-android-cho-nguoi-khac-dung\/screen-shot-2019-08-20-at-5-40-55-pm\/\" data-orig-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png?fit=730%2C459&amp;ssl=1\" data-orig-size=\"730,459\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screen-Shot-2019-08-20-at-5.40.55-PM\" data-image-description=\"\" data-medium-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png?fit=300%2C189&amp;ssl=1\" data-large-file=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png?fit=730%2C459&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6628\" srcset=\"https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png?w=730&amp;ssl=1 730w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png?resize=300%2C189&amp;ssl=1 300w, https:\/\/i2.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png?resize=250%2C157&amp;ssl=1 250w\" sizes=\"(max-width: 730px) 100vw, 730px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>C\u00fa ph\u00e1p chung l\u00e0:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>com.github.<strong>user:repository<\/strong>:version<\/p><\/blockquote>\n\n\n\n<p>M\u00e3 ngu\u1ed3n demo c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 <a href=\"https:\/\/github.com\/nguyenvanquan7826\/androiddemolibs\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"xem, download t\u1ea1i \u0111\u00e2y (opens in a new tab)\">xem, download t\u1ea1i \u0111\u00e2y<\/a><\/p>\n\n\n\n<h2>T\u1ea1o nhi\u1ec1u th\u01b0 vi\u1ec7n trong c\u00f9ng project\n\n\n\n<p>C\u00f3 th\u1ec3 b\u1ea1n c\u1ea7n t\u1ea1o ra nhi\u1ec1u th\u01b0 vi\u1ec7n nh\u01b0ng kh\u00f4ng mu\u1ed1n d\u00f9ng nhi\u1ec1u project \u0111\u1ec3 t\u1ea1o t\u1eebng th\u01b0 vi\u1ec7n, v\u1eady th\u00ec b\u1ea1n c\u1ee9 vi\u1ebft h\u1ebf v\u00e0o m\u1ed9t project nh\u01b0 tr\u00ean, t\u1ea1o nhi\u1ec1u module library sau \u0111\u00f3  khi d\u00f9ng ch\u1ec9 vi\u1ec7c ch\u1ec9 r\u00f5 t\u1eebng th\u01b0 vi\u1ec7n th\u00f4i. V\u00ed d\u1ee5 trong project <a rel=\"noreferrer noopener\" aria-label=\"AndroidLibs  (opens in a new tab)\" href=\"https:\/\/github.com\/nguyenvanquan7826\/AndroidLibs\" target=\"_blank\">AndroidLibs <\/a> m\u00ecnh c\u00f3 2 th\u01b0 vi\u1ec7n l\u00e0 <strong>appbase<\/strong> v\u00e0 <strong>textviewtwoline<\/strong>, \u0111\u1ec3 s\u1eed d\u1ee5ng t\u1eebng th\u01b0 vi\u1ec7n m\u00ecnh s\u1ebd vi\u1ebft nh\u01b0 sau:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>implementation &#8220;com.github.nguyenvanquan7826.AndroidLibs:appbase:1.0.5&#8221;   <\/p><p>implementation &#8220;com.github.nguyenvanquan7826.AndroidLibs:textviewtwoline:1.0.5&#8221; <\/p><\/blockquote>\n\n\n\n<p>C\u00fa ph\u00e1p s\u1ebd l\u00e0: <\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>com.github.<strong>user.repository<\/strong>:libsname:version<\/p><\/blockquote>\n\n\n\n<p>N\u1ebfu mu\u1ed1n d\u00f9ng t\u1ea5t c\u1ea3 c\u00e1c th\u01b0 vi\u1ec7n m\u00e0 kh\u00f4ng c\u1ea7n vi\u1ebft chi ti\u1ebft ra, c\u00e1c b\u1ea1n ch\u1ec9 c\u1ea7n vi\u1ebft nh\u01b0 v\u1edbi 1 th\u01b0 vi\u1ec7n theo c\u00fa ph\u00e1p<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>com.github.<strong>user:repository<\/strong>:version<\/p><\/blockquote>\n","excerpt":"<p>Ch\u00e0o c\u00e1c b\u1ea1n, c\u00f3 bao gi\u1edd b\u1ea1n h\u1ecfi nh\u1eefng th\u01b0 vi\u1ec7n c\u1ee7a android trong dependencies m\u00e0 c\u00e1c b\u1ea1n d\u00f9ng c\u1ee7a ng\u01b0\u1eddi kh\u00e1c, h\u1ecd t\u1ea1o ra ch\u00fang nh\u01b0 th\u1ebf n\u00e0o? H\u00f4m nay m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1c b\u1ea1n c\u00e1ch t\u1ea1o th\u01b0 vi\u1ec7n android v\u00e0 c\u00f4ng b\u1ed1 cho ng\u01b0\u1eddi kh\u00e1c d\u00f9ng. V\u00e0 t\u1ea5t nhi\u00ean t\u1ed1i thi\u1ec3u th\u00ec b\u1ea1n c\u0169ng c\u00f3 th\u01b0 vi\u1ec7n cho nhi\u1ec1u project c\u1ee7a m\u00ecnh d\u00f9ng chung, \u0111\u1ee1 ph\u1ea3i vi\u1ebft l\u1ea1i ho\u1eb7c copy d\u1eabn \u0111\u1ebfn [&hellip;]<\/p>\n","date":"2019-08-20 17:43:01","modified":"2019-08-21 09:16:58","categories":[{"id":1087,"slug":"android","title":"LT Android","description":"","parent":1073,"post_count":36}],"tags":[{"id":2381,"slug":"tao-thu-vien-android","title":"t\u1ea1o th\u01b0 vi\u00ean android","description":"","post_count":1}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[{"id":6613,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/cach-tao-thu-vien-android.png","slug":"cach-tao-thu-vien-android","title":"cach-tao-thu-vien-android","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6614,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/publish-library-android.png","slug":"publish-library-android","title":"publish-library-android","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6615,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-library-publish.png","slug":"android-library-publish","title":"android-library-publish","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6616,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/create-android-libs.png","slug":"create-android-libs","title":"create-android-libs","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6617,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-create-library.png","slug":"android-create-library","title":"android-create-library","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6618,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-tao-thu-vien.jpg","slug":"android-tao-thu-vien","title":"android-tao-thu-vien","description":"","caption":"","parent":6612,"mime_type":"image\/jpeg","images":[]},{"id":6619,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-libs-create-github-respontory.png","slug":"android-libs-create-github-respontory","title":"android-libs-create-github-respontory","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6620,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.11.36-PM.png","slug":"screen-shot-2019-08-20-at-5-11-36-pm","title":"Screen-Shot-2019-08-20-at-5.11.36-PM","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6621,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM.png","slug":"screen-shot-2019-08-20-at-5-17-25-pm","title":"Screen-Shot-2019-08-20-at-5.17.25-PM","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6623,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM.png","slug":"screen-shot-2019-08-20-at-5-18-53-pm","title":"Screen-Shot-2019-08-20-at-5.18.53-PM","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6624,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.17.25-PM-1.png","slug":"screen-shot-2019-08-20-at-5-17-25-pm-1","title":"Screen-Shot-2019-08-20-at-5.17.25-PM-1","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6625,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.18.53-PM-1.png","slug":"screen-shot-2019-08-20-at-5-18-53-pm-1","title":"Screen-Shot-2019-08-20-at-5.18.53-PM-1","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6626,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.23.14-PM.png","slug":"screen-shot-2019-08-20-at-5-23-14-pm","title":"Screen-Shot-2019-08-20-at-5.23.14-PM","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6627,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.38.44-PM.png","slug":"screen-shot-2019-08-20-at-5-38-44-pm","title":"Screen-Shot-2019-08-20-at-5.38.44-PM","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]},{"id":6628,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/Screen-Shot-2019-08-20-at-5.40.55-PM.png","slug":"screen-shot-2019-08-20-at-5-40-55-pm","title":"Screen-Shot-2019-08-20-at-5.40.55-PM","description":"","caption":"","parent":6612,"mime_type":"image\/png","images":[]}],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""],"transposh_can_translate":["true"]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6605,"type":"post","slug":"fix-drawablestart-resource-not-found-api-19","url":"https:\/\/cachhoc.net\/2019\/08\/08\/fix-drawablestart-resource-not-found-api-19\/","status":"publish","title":"Fix drawableStart resource not found API 19","title_plain":"Fix drawableStart resource not found API 19","content":"\n<p>H\u00f4m nay th\u1eed ch\u1ea1y tr\u00ean m\u00e1y Android 4.4 (api 19) th\u00ec b\u1ecb l\u1ed7i <strong>drawableStart resource not found<\/strong> API 19 khi d\u00f9ng drawableStart cho TextView:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>android.content.res.Resources$NotFoundException: File res\/drawable\/ic_add.xml from drawable resource ID #0x7f020<\/p><\/blockquote>\n\n\n\n<p>M\u00ecnh \u0111\u00e3 ki\u1ec3m tra l\u1ea1i trong file build.gradle \u0111\u00e3 c\u00f3 h\u1ed7 tr\u1ee3 vector nh\u01b0 d\u01b0\u1edbi \u0111\u00e2y nh\u01b0ng v\u1eabn l\u00f4i:<\/p>\n\n\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nandroid {\n  defaultConfig {\n    vectorDrawables.useSupportLibrary = true\n  }\n}\n<\/pre>\n\n\n<p>Cu\u1ed1i c\u00f9ng m\u00ecnh \u0111\u00e3 kh\u1eafc ph\u1ee5c b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng th\u01b0 vi\u1ec7n appcompat version 1.1.0-alpha01 (ho\u1eb7c m\u1edbi h\u01a1n)<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>implementation &#8220;androidx.appcompat:appcompat:1.1.0-alpha01&#8221;<\/p><\/blockquote>\n\n\n\n<p>Sau \u0111\u00f3 thay TextView b\u1eb1ng <strong>AppCompatTextView<\/strong>, v\u00e0 thay drawableStart b\u1eb1ng <strong>drawableStartCompat<\/strong><\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;androidx.appcompat.widget.AppCompatTextView\n    android:id=&quot;@+id\/tvIconSearch&quot;\n    android:layout_width=&quot;wrap_content&quot;\n    android:layout_height=&quot;22dp&quot;\n    android:background=&quot;@drawable\/home_header_search_icon_bg_style&quot;\n    android:padding=&quot;6dp&quot;\n    app:drawableStartCompat=&quot;@drawable\/ic_add&quot; \/&gt;\n<\/pre>","excerpt":"<p>H\u00f4m nay th\u1eed ch\u1ea1y tr\u00ean m\u00e1y Android 4.4 (api 19) th\u00ec b\u1ecb l\u1ed7i drawableStart resource not found API 19 khi d\u00f9ng drawableStart cho TextView: android.content.res.Resources$NotFoundException: File res\/drawable\/ic_add.xml from drawable resource ID #0x7f020 M\u00ecnh \u0111\u00e3 ki\u1ec3m tra l\u1ea1i trong file build.gradle \u0111\u00e3 c\u00f3 h\u1ed7 tr\u1ee3 vector nh\u01b0 d\u01b0\u1edbi \u0111\u00e2y nh\u01b0ng v\u1eabn l\u00f4i: Cu\u1ed1i c\u00f9ng m\u00ecnh \u0111\u00e3 kh\u1eafc ph\u1ee5c b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng th\u01b0 vi\u1ec7n appcompat version 1.1.0-alpha01 (ho\u1eb7c m\u1edbi h\u01a1n) implementation &#8220;androidx.appcompat:appcompat:1.1.0-alpha01&#8221; Sau \u0111\u00f3 thay TextView [&hellip;]<\/p>\n","date":"2019-08-08 11:13:56","modified":"2019-08-08 11:14:39","categories":[{"id":1087,"slug":"android","title":"LT Android","description":"","parent":1073,"post_count":36}],"tags":[],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[{"id":6607,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/08\/android-fix-bug.png","slug":"android-fix-bug","title":"android-fix-bug","description":"","caption":"","parent":6605,"mime_type":"image\/png","images":[]}],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""],"transposh_can_translate":["true"]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6603,"type":"post","slug":"java-log-p3-ghi-log-bat-dong-bo-vao-database-su-dung-executorservice","url":"https:\/\/cachhoc.net\/2019\/08\/02\/java-log-p3-ghi-log-bat-dong-bo-vao-database-su-dung-executorservice\/","status":"publish","title":"[Java log] P3: Ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9 v\u00e0o Database s\u1eed d\u1ee5ng ExecutorService","title_plain":"[Java log] P3: Ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9 v\u00e0o Database s\u1eed d\u1ee5ng ExecutorService","content":"\n<p><a rel=\"noreferrer noopener\" aria-label=\"B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3.\u00a0 (opens in a new tab)\" href=\"http:\/\/tunghuynh.net\/programer\/java\/2265\/java-phan-14-log-3-ghi-log-bat-dong-bo-vao-database-su-dung-executorservice\/\" target=\"_blank\">B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3.\u00a0<\/a><\/p>\n\n\n\n<p>Ch\u00e0o c\u00e1c b\u1ea1n, \u1edf 2 ph\u1ea7n tr\u01b0\u1edbc v\u1ec1 ghi log<br><a href=\"https:\/\/cachhoc.net\/2019\/07\/29\/java-log-p1-tam-quan-trong-cua-ghi-log-trong-phat-trien-phan-mem\/\">[Java log] P1: T\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m<\/a><br><a href=\"https:\/\/cachhoc.net\/2019\/07\/31\/java-log-p2-tich-hop-log4j-vao-phan-mem\/\">[Java log] P2: T\u00edch h\u1ee3p log4j v\u00e0o ph\u1ea7n m\u1ec1m<\/a><br>m\u00ecnh \u0111\u00e3 \u0111\u1ec1 c\u1eadp v\u1ec1 t\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log, m\u1ed9t s\u1ed1 nguy\u00ean t\u1eafc khi ghi log, v\u00e0 h\u01b0\u1edbng d\u1eabn c\u00e1ch t\u00edch h\u1ee3p\u00a0<strong>log4j<\/strong>\u00a0v\u00e0o m\u1ed9t ch\u01b0\u01a1ng tr\u00ecnh java.<br>B\u00e0i n\u00e0y m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1c b\u1ea1n t\u1ef1 t\u1ea1o m\u1ed9t t\u00ednh n\u0103ng\u00a0<strong>ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9<\/strong>\u00a0v\u00e0o\u00a0<strong>database<\/strong>.<br>\u0110\u1ec3 l\u00e0m \u0111\u01b0\u1ee3c t\u00ednh n\u0103ng ghi log v\u00e0o database th\u00ec\u00a0<code>Log4j<\/code>\u00a0ho\u00e0n to\u00e0n c\u00f3 kh\u1ea3 n\u0103ng \u0111\u00e1p \u1ee9ng s\u1eb5n vi\u1ec7c n\u00e0y. Nh\u01b0ng \u1edf ph\u1ea7n n\u00e0y m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1ch t\u1ef1 t\u1ea1o m\u1ed9t module ghi log v\u00e0o database \u0111\u1ec3 c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 hi\u1ec3u r\u00f5 h\u01a1n v\u1ec1\u00a0<strong>c\u01a1 ch\u1ebf ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9.<\/strong><br>Tr\u01b0\u1edbc ti\u00ean, \u0111\u1ec3 ghi log v\u00e0o\u00a0<strong>database<\/strong>\u00a0th\u00ec c\u1ea7n ph\u1ea3i c\u00f3\u00a0<strong>table<\/strong>\u00a0l\u01b0u log, v\u00e0 t\u1ea1o m\u1ed9t\u00a0<strong>sequence<\/strong>\u00a0\u0111\u1ec3 l\u1ea5y value cho tr\u01b0\u1eddng ID c\u1ee7a b\u1ea3ng log<\/p>\n\n\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE TABLE LOGS\n( \n  LOGS_ID               NUMBER NOT NULL PRIMARY KEY,\n  LEVEL_LOG             VARCHAR2(10),\n  CREATE_TIME           DATE,\n  CONTENT               CLOB\n);\n\/\nCREATE SEQUENCE LOGS_SEQ;\n<\/pre>\n\n\n<p>Tr\u00ean \u1ee9ng d\u1ee5ng, ta s\u1ebd t\u1ea1o m\u1ed9t\u00a0<strong>entity<\/strong>\u00a0t\u01b0\u01a1ng \u1ee9ng v\u1edbi\u00a0<strong>table<\/strong>\u00a0\u0111\u00e3 t\u1ea1o \u0111\u1ec3 thu\u1eadn ti\u1ec7n cho vi\u1ec7c\u00a0<strong>insert<\/strong>\u00a0d\u1eef li\u1ec7u v\u00e0o b\u1ea3ng\u00a0<strong>log<\/strong>.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage net.tunghuynh.logging.core;\n \npublic class Logs {\n    private Integer logsId;\n    private String levelLog;\n    private String content;\n \n    public Integer getLogsId(){\n        return logsId;\n    }\n    \n    public void setLogsId(Integer logsId){\n        this.logsId = logsId;\n    }\n    \n    public String getLevelLog() {\n        return levelLog;\n    }\n \n    public void setLevelLog(String levelLog) {\n        this.levelLog = levelLog;\n    }\n \n    public String getContent() {\n        return content;\n    }\n \n    public void setContent(String content) {\n        this.content = content;\n    }\n}\n<\/pre>\n\n\n<p>N\u1ebfu b\u00ecnh th\u01b0\u1eddng ch\u1ec9 nh\u1eafm m\u1ee5c \u0111\u00edch ghi log th\u00e0nh c\u00f4ng th\u00ec c\u00e1c b\u1ea1n ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n tr\u1ef1c ti\u1ebfp c\u00e2u l\u1ec7nh\u00a0<code>insert into<\/code>\u00a0d\u1eef li\u1ec7u v\u00e0o b\u1ea3ng log theo c\u00e1ch nh\u01b0 sau<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic static void main(String[] args) {\n    Logs logs = new Logs();\n    logs.setLevelLog(&quot;INFO&quot;);\n    logs.setContent(&quot;Log by insert into database&quot;);\n    new Main().save(logs);\n}\npublic void save(Logs item) {\n    PreparedStatement stmt = null;\n    Connection con = null;\n    try {\n        con = DatabaseUtils.getConnection();\n        stmt = con.prepareStatement(&quot;INSERT INTO LOGS (LOGS_ID, LEVEL_LOG, CONTENT, CREATE_TIME)&quot; +\n                &quot; VALUES(LOGS_SEQ.NEXTVAL, ?, ?, SYSDATE)&quot;);\n        stmt.setString(1, item.getLevelLog());\n        stmt.setString(2, item.getContent());\n        stmt.execute();\n    } catch (Exception ex) {\n        logger.error(ex.getMessage(), ex);\n    } finally {\n        DatabaseUtils.closeObject(stmt);\n        DatabaseUtils.closeObject(con);\n    }\n}\n<\/pre>\n\n\n<p>T\u01b0 t\u01b0\u1edfng l\u00e0 nh\u01b0 v\u1eady, \u0111o\u1ea1n code tr\u00ean m\u00ecnh \u0111\u00e3 t\u00e1ch c\u00e1c x\u1eed l\u00fd ngo\u00e0i ph\u1ea1m vi b\u00e0i vi\u1ebft nh\u01b0 vi\u1ec7c\u00a0<strong>k\u1ebft n\u1ed1i database, \u0111\u00f3ng connection,..<\/strong>. v\u00e0o 1 class kh\u00e1c \u0111\u1eb7t t\u00ean\u00a0<code>DatabaseUtils<\/code>\u00a0\u0111\u1ec3 tr\u00e1nh l\u00e0m lo\u00e3ng b\u00e0i vi\u1ebft. C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 xem chi ti\u1ebft c\u00e1c ph\u1ea7n \u0111\u00f3 trong\u00a0<strong>source full<\/strong>\u00a0\u1edf cu\u1ed1i b\u00e0i.<br>Nh\u01b0ng nh\u01b0 b\u00e0i tr\u01b0\u1edbc m\u00ecnh \u0111\u00e3 \u0111\u1ec1 c\u1eadp \u0111\u1ebfn nguy\u00ean t\u1eafc khi ghi log l\u00e0\u00a0<strong>kh\u00f4ng \u0111\u01b0\u1ee3c l\u00e0m \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn th\u1eddi gian<\/strong>\u00a0x\u1eed l\u00fd c\u1ee7a nghi\u1ec7p v\u1ee5 ch\u00ednh. Nh\u01b0 v\u1eady \u0111o\u1ea1n code tr\u00ean \u0111\u00e3 ph\u1ea1m ph\u1ea3i nguy\u00ean t\u1eafc n\u00e0y, v\u00ec c\u00f3 th\u1ec3 vi\u1ec7c\u00a0<strong>connect database<\/strong>\u00a0v\u00e0\u00a0<strong>execute<\/strong>\u00a0l\u1ec7nh\u00a0<strong>insert<\/strong>\u00a0kia s\u1ebd chi\u1ebfm 1 ph\u1ea7n th\u1eddi gian nh\u1ea5t \u0111\u1ecbnh.<br>\u0110\u1ec3 kh\u1eafc ph\u1ee5c vi\u1ec7c n\u00e0y ta c\u1ea7n x\u1eed l\u00fd vi\u1ec7c connect database v\u00e0 execute insert trong 1\u00a0<strong>thread<\/strong>\u00a0ri\u00eang. \u0110\u01a1n gi\u1ea3n nh\u1ea5t l\u00e0\u00a0<code>new Thread<\/code>\u00a0m\u1edbi \u0111\u1ec3 th\u1ef1c thi\u00a0<code>Runnable<\/code>.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nThread saveLog = new Thread(new Runnable() {\n    @Override\n    public void run() {\n        new Main().save(item);\n    }\n});\nsaveLog.start();\n<\/pre>\n\n\n<p>Nh\u01b0ng c\u00e1ch n\u00e0y s\u1ebd g\u1eb7p m\u1ed9t v\u1ea5n \u0111\u1ec1 kh\u00e1\u00a0<strong>nguy hi\u1ec3m<\/strong>\u00a0\u0111\u00f3 l\u00e0 khi ch\u1ee9c n\u0103ng nghi\u1ec7p v\u1ee5 b\u1ecb g\u1ecdi li\u00ean t\u1ee5c, d\u1eabn \u0111\u1ebfn vi\u1ec7c ph\u1ea3i t\u1ea1o qu\u00e1\u00a0<strong>nhi\u1ec1u Thread<\/strong>\u00a0trong \u1ee9ng d\u1ee5ng m\u00e0\u00a0<strong>kh\u00f4ng gi\u1ea3i ph\u00f3ng<\/strong>\u00a0\u0111\u01b0\u1ee3c, vi\u1ec7c n\u00e0y s\u1ebd l\u00e0m \u1ea3nh h\u01b0\u1edfng r\u1ea5t nhi\u1ec1u \u0111\u1ebfn\u00a0<strong>hi\u1ec7u n\u0103ng<\/strong>\u00a0c\u1ee7a \u1ee9ng d\u1ee5ng v\u00e0 \u1ea3nh h\u01b0\u1edfng c\u1ea3 \u0111\u1ebfn server. Do v\u1eady c\u00e1c b\u1ea1n n\u00ean s\u1eed d\u1ee5ng m\u1ed9t d\u1ea1ng\u00a0<strong>pool<\/strong>\u00a0\u0111\u1ec3 qu\u1ea3n l\u00fd v\u00e0\u00a0<strong>h\u1ea1n ch\u1ebf<\/strong>\u00a0vi\u1ec7c sinh\u00a0<code>Thread<\/code>\u00a0v\u00f4 t\u1ed9i v\u1ea1 nh\u01b0 tr\u00ean. \u1ede \u0111\u00e2y m\u00ecnh th\u01b0\u1eddng s\u1eed d\u1ee5ng\u00a0<code>ExecutorService<\/code>\u00a0\u0111\u1ec3 \u0111\u1ea3m nhi\u1ec7m c\u00f4ng vi\u1ec7c n\u00e0y, khi n\u00e0o hay \u1edf ch\u1ed7 n\u00e0o c\u1ea7n ghi log th\u00ec ch\u1ec9 c\u1ea7n\u00a0<strong>submit log<\/strong>v\u00e0o r\u1ed3i k\u1ec7 cho th\u1eb1ng\u00a0<code>ExecutorService<\/code>\u00a0x\u1eed l\u00fd ghi log d\u1ea7n d\u1ea7n, nh\u01b0 v\u1eady s\u1ebd kh\u00f4ng l\u00e0m \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn th\u1eddi gian x\u1eed l\u00fd c\u1ee7a nghi\u1ec7p v\u1ee5 ch\u00ednh.<br>\u0110\u1ea7u ti\u00ean m\u00ecnh t\u1ea1o m\u1ed9t\u00a0<code>abstract class Task<\/code>\u00a0\u0111\u1ec3 qu\u1ea3n l\u00fd\u00a0<strong>danh s\u00e1ch c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng log<\/strong>\u00a0c\u1ea7n\u00a0<strong>save<\/strong>\u00a0v\u00e0o\u00a0<strong>database<\/strong>,\u00a0<code>abstract class Task<\/code>\u00a0\u0111\u01b0\u1ee3c\u00a0<code>implements Callable<\/code>\u00a0\u0111\u1ec3\u00a0<strong>execute<\/strong>\u00a0nghi\u1ec7p v\u1ee5.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage net.tunghuynh.logging.core;\n \nimport java.util.List;\nimport java.util.concurrent.Callable;\n \npublic abstract class Task&lt;E&gt; implements Callable&lt;Integer&gt; {\n    private List&lt;E&gt; items;\n    public void setItems(List&lt;E&gt; items){\n        this.items = items;\n    }\n    public List&lt;E&gt; getItems(){\n        return items;\n    }\n}\n<\/pre>\n\n\n<p>Sau \u0111\u00f3 m\u00ecnh t\u1ea1o m\u1ed9t\u00a0<code>abstract class ThreadManager<\/code>\u00a0\u0111\u1ec3 khai b\u00e1o v\u00e0 \u0111\u1ecbnh ngh\u0129a khung l\u00e0m vi\u1ec7c cho qu\u00e1 tr\u00ecnh ghi log.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage net.tunghuynh.logging.core;\n \nimport org.apache.logging.log4j.Logger;\n \nimport java.util.ArrayList;\nimport java.util.concurrent.*;\nimport java.util.concurrent.atomic.AtomicBoolean;\n \npublic abstract class ThreadManager {\n    public final int BATCH_SIZE = 10;\/\/Ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd th\u1ef1c hi\u1ec7n doProcess khi h\u00e0ng \u0111\u1ee3i v\u01b0\u1ee3t qu\u00e1 10 ph\u1ea7n t\u1eed\n    public final long WAIT_TIME_OUT = 1000; \/\/ms\n    public final long TIME_OUT = 2 * 1000; \/\/ms. Ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd th\u1ef1c hi\u1ec7n doProcess v\u1edbi chu k\u1ef3 2 gi\u00e2y \n    private final Logger logger = org.apache.logging.log4j.LogManager.getLogger(ThreadManager.class);\n    private final BlockingQueue sourceQueue = new LinkedBlockingQueue();\n    protected ArrayList items = new ArrayList(BATCH_SIZE);\n    protected AtomicBoolean shouldWork = new AtomicBoolean(true);\n    protected AtomicBoolean isRunning = new AtomicBoolean(true);\n    private boolean listening = false;\n    private String name = &quot;DB LOGGER&quot;;\n    protected ExecutorService executorService = Executors.newFixedThreadPool(5);\n    private Thread mainThread;\n \n    public ThreadManager() {\n        logger.debug(&quot;Start task manager named: &quot; + name);\n        mainThread = new Thread(new Runnable() {\n            @Override\n            public void run() {\n                logger.info(&quot;Queued job manager &quot; + name + &quot; is running and watching for queue... &quot;);\n                isRunning.set(true);\n                int recNum = 0;\n                long lgnStart = System.currentTimeMillis();\n                while (shouldWork.get()) {\n                    try {\n                        Object item = sourceQueue.poll(WAIT_TIME_OUT, TimeUnit.MILLISECONDS);\n                        if (item != null) {\n                            items.add(item);\n                            recNum++;\n                        }\n \n                        if (recNum &gt;= BATCH_SIZE || timedOut(lgnStart)) {\n                            if (items.size() &gt; 0) {\n                                logger.info(String.format(&quot;Thread %s: %s submits %d item(s)&quot;,\n                                        Thread.currentThread().getName(), name, items.size()));\n                                doProcess(items);\n                                items = new ArrayList(BATCH_SIZE);\n                                lgnStart = System.currentTimeMillis();\n                                recNum = 0;\n                            }\n                        }\n                    } catch (Exception e) {\n                        logger.error(e.getMessage());\n                    }\n                    isRunning.set(false);\n                }\n                logger.info(&quot;Taskmanager &quot; + name + &quot; is stopped!!&quot;);\n            }\n \n            private boolean timedOut(Long startTime) {\n                return System.currentTimeMillis() - startTime &gt; TIME_OUT;\n            }\n        });\n \n    }\n \n    \/**\n     * abstract method x\u1eed l\u00fd nghi\u1ec7p v\u1ee5\n     * @param items\n     *\/\n    public abstract void doProcess(ArrayList items);\n \n    \/**\n     * B\u1eaft \u0111\u1ea7u l\u1eafng nghe d\u1eef li\u1ec7u c\u1ea7n x\u1eed l\u00fd t\u1eeb h\u00e0ng \u0111\u1ee3i\n     *\/\n    public synchronized void listen() {\n        if (!listening) {\n            mainThread.start();\n            listening = true;\n        }\n    }\n \n    public BlockingQueue getSourceQueue() {\n        return sourceQueue;\n    }\n \n    public void stop() {\n        logger.info(String.format(&quot;%s received a termination signal, stopping ... &quot;, name));\n        this.shouldWork.set(false);\n        int tryTime = 0;\n        while (isRunning.get() &amp;amp;&amp;amp; tryTime &lt; 50) {\n            try {\n                Thread.currentThread().sleep(50L);\n            } catch (Exception ex) {\n \n            }\n            tryTime++;\n        }\n    }\n \n    \/**\n     * Submit m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng c\u1ea7n x\u1eed l\u00fd v\u00e0o h\u00e0ng \u0111\u1ee3i\n     * @param item\n     *\/\n    public void submit(Object item) {\n        sourceQueue.offer(item);\n    }\n}\n<\/pre>\n\n\n<p>Ph\u1ea7n n\u00e0y s\u1ebd t\u01b0\u01a1ng \u0111\u1ed1i ph\u1ee9c t\u1ea1p \u0111\u1ed1i v\u1edbi b\u1ea1n n\u00e0o ch\u01b0a \u0111\u01b0\u1ee3c ti\u1ebfp x\u00fac nhi\u1ec1u v\u1edbi x\u1eed l\u00fd&nbsp;<strong>\u0111a lu\u1ed3ng<\/strong>&nbsp;trong&nbsp;<strong>Java Core<\/strong>. M\u00ecnh s\u1ebd m\u00f4 t\u1ea3 qua nh\u01b0 sau:<br>\u2013&nbsp;<code>BlockingQueue sourceQueue<\/code>: h\u00e0ng \u0111\u1ee3i l\u01b0u c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng&nbsp;<strong>log<\/strong>&nbsp;c\u1ea7n&nbsp;<strong>insert<\/strong>, b\u00ean ngo\u00e0i th\u00eam ph\u1ea7n t\u1eed v\u00e0o h\u00e0ng \u0111\u1ee3i th\u00f4ng qua method&nbsp;<code>submit()<\/code><br>\u2013&nbsp;<code>ExecutorService executorService<\/code>: Service th\u1ef1c thi, \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh c\u1ed1 \u0111\u1ecbnh ch\u1ec9 cho ph\u00e9p t\u1ea1o ra&nbsp;<strong>5 Thread<\/strong>\u0111\u1ed3ng th\u1eddi, d\u00f9 c\u00f3 b\u1ecb g\u1ecdi nhi\u1ec1u l\u1ea7n th\u00ec c\u0169ng ch\u1ec9 t\u1ed1i \u0111a 5 thread \u0111\u01b0\u1ee3c t\u1ea1o ra, tr\u00e1nh vi\u1ec7c t\u1ea1o qu\u00e1 nhi\u1ec1u thread \u1ea3nh h\u01b0\u1edfng&nbsp;<strong>hi\u1ec7u n\u0103ng server<\/strong><br>\u2013&nbsp;<code>ArrayList items<\/code>: danh s\u00e1ch l\u01b0u c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c l\u1ea5y ra t\u1eeb h\u00e0ng \u0111\u1ee3i&nbsp;<strong>sourceQueue<\/strong>&nbsp;truy\u1ec1n cho&nbsp;<code>doProcess<\/code>&nbsp;\u0111\u1ec3&nbsp;<strong>insert<\/strong>&nbsp;v\u00e0o&nbsp;<strong>database<\/strong><br>\u2013&nbsp;<strong>Lu\u1ed3ng x\u1eed l\u00fd<\/strong>: \u1edf \u0111\u00e2y m\u00ecnh c\u00f3 1&nbsp;<strong>thread<\/strong>&nbsp;\u0111\u01b0\u1ee3c t\u1ea1o ra v\u00e0&nbsp;<strong>start<\/strong>&nbsp;1 l\u1ea7n duy nh\u1ea5t b\u1eb1ng method&nbsp;<code>listen()<\/code>, thread n\u00e0y s\u1ebd t\u1ed3n t\u1ea1i trong su\u1ed1t qu\u00e1 tr\u00ecnh ch\u1ea1y c\u1ee7a \u1ee9ng d\u1ee5ng. B\u00ean trong thread x\u1eed l\u00fd vi\u1ec7c li\u00ean t\u1ee5c&nbsp;<strong>\u0111\u1ecdc d\u1eef li\u1ec7u<\/strong>&nbsp;t\u1eeb h\u00e0ng \u0111\u1ee3i&nbsp;<strong>sourceQueue<\/strong>&nbsp;\u0111\u1ec3 add v\u00e0o danh s\u00e1ch&nbsp;<strong>items<\/strong>. \u0110i\u1ec1u quan tr\u1ecdng \u1edf \u0111\u00e2y l\u00e0 khi tho\u1ea3 m\u00e3n 1 trong 2 \u0111i\u1ec1u ki\u1ec7n: danh s\u00e1ch&nbsp;<strong>items<\/strong>&nbsp;v\u01b0\u1ee3t qu\u00e1&nbsp;<code>BATCH_SIZE<\/code>&nbsp;ho\u1eb7c c\u00e1c ph\u1ea7n t\u1eed \u0111\u01b0\u1ee3c l\u01b0u trong danh s\u00e1ch items qu\u00e1&nbsp;<code>TIME_OUT<\/code>&nbsp;th\u00ec s\u1ebd \u0111\u1ea9y&nbsp;<strong>items<\/strong>&nbsp;\u0111i&nbsp;<strong>insert<\/strong>. \u0110i\u1ec1u ki\u1ec7n n\u00e0y \u0111\u1ec3&nbsp;<strong>tr\u00e1nh<\/strong>&nbsp;vi\u1ec7c insert qu\u00e1 nhi\u1ec1u&nbsp;<strong>b\u1ea3n ghi 1 l\u00fac<\/strong>, v\u00e0&nbsp;<strong>tr\u00e1nh<\/strong>vi\u1ec7c l\u01b0u d\u1eef li\u1ec7u trong items&nbsp;<strong>qu\u00e1 l\u00e2u<\/strong>&nbsp;m\u00e0 kh\u00f4ng \u0111\u01b0\u1ee3c insert. Sau khi \u0111\u00e3 g\u1eedi \u0111i&nbsp;<code>doProcess<\/code>&nbsp;th\u00ec ph\u1ea3i&nbsp;<strong>clear<\/strong>danh s\u00e1ch&nbsp;<strong>items<\/strong>&nbsp;v\u00e0&nbsp;<strong>reset<\/strong>&nbsp;bi\u1ebfn \u0111\u1ebfm th\u1eddi gian&nbsp;<strong>timeout<\/strong>. C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 xem \u1ea3nh d\u01b0\u1edbi \u0111\u1ec3 h\u00ecnh dung d\u1ec5 h\u01a1n.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img src=\"https:\/\/i2.wp.com\/tunghuynh.net\/wp-content\/uploads\/2019\/07\/java14_2.png?resize=640%2C326\" alt=\"\" class=\"wp-image-2276\"\/><\/figure><\/div>\n\n\n\n<p>Sau khi t\u1ea1o xong 2\u00a0<strong>abstract<\/strong>\u00a0t\u1ed5ng qu\u00e1t \u1edf tr\u00ean, m\u00ecnh s\u1ebd t\u1ea1o c\u00e1c class x\u1eed l\u00fd vi\u1ec7c\u00a0<strong>ghi log.<\/strong><br>\u0110\u1ea7u ti\u00ean l\u00e0\u00a0<code>class LogThread<\/code>\u00a0\u0111\u01b0\u1ee3c\u00a0<code>extends Task<\/code>, c\u00f3 nhi\u1ec7m v\u1ee5\u00a0<strong>insert<\/strong>\u00a01\u00a0<strong>List<\/strong>\u00a0\u0111\u1ed1i t\u01b0\u1ee3ng\u00a0<strong>Logs<\/strong>\u00a0v\u00e0o\u00a0<strong>database<\/strong>. Ph\u1ea7n n\u00e0y t\u01b0\u01a1ng t\u1ef1 nh\u01b0 v\u00ed d\u1ee5 tr\u00ean nh\u01b0ng kh\u00e1c l\u00e0 insert 1 list th\u00f4i.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage net.tunghuynh.logging.core;\n \nimport net.tunghuynh.preparestatement.DatabaseUtils;\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n \nimport java.sql.Connection;\nimport java.sql.PreparedStatement;\nimport java.util.List;\n \npublic class LogThread extends Task {\n    private final Logger logger = LogManager.getLogger(LogThread.class);\n \n    @Override\n    public Integer call() throws Exception {\n        List lstLog = getItems();\n        try {\n            if (lstLog != null &amp;amp;&amp;amp; !lstLog.isEmpty()) {\n                save(lstLog);\n            }\n        } catch (Exception e) {\n            logger.error(e.toString(), e);\n            return 0;\n        }\n        return 1;\n    }\n \n    public void save(List&lt;Logs&gt; lst) {\n        PreparedStatement stmt = null;\n        Connection con = null;\n        try {\n            con = DatabaseUtils.getConnection();\n            stmt = con.prepareStatement(&quot;INSERT INTO AD_SCHEDULE_LOG &quot; +\n                    &quot; (LOGS_ID, LEVEL_LOG, CONTENT, CREATE_TIME)&quot; +\n                    &quot; VALUES(LOGS_SEQ.NEXTVAL, ?, ?, SYSDATE)&quot;);\n            for(Logs item : lst){\n                stmt.setString(1, item.getLevelLog());\n                stmt.setString(2, item.getContent());\n                stmt.execute();\n            }\n        } catch (Exception ex) {\n            logger.error(ex.getMessage(), ex);\n        } finally {\n            DatabaseUtils.closeObject(stmt);\n            DatabaseUtils.closeObject(con);\n        }\n    }\n}\n<\/pre>\n\n\n<p>Ti\u1ebfp theo m\u00ecnh s\u1ebd t\u1ea1o\u00a0<code>class LogManager<\/code>\u00a0\u0111\u01b0\u1ee3c\u00a0<code>extends ThreadManager<\/code>, nhi\u1ec7m v\u1ee5 l\u00e0 nh\u1eadn danh s\u00e1ch \u0111\u1ed1i t\u01b0\u1ee3ng c\u1ea7n ghi log t\u1eeb\u00a0<strong>h\u00e0ng \u0111\u1ee3i<\/strong>\u00a0trong\u00a0<code>ThreadManager<\/code>\u00a0\u0111\u1ec3\u00a0<strong>submit<\/strong>\u00a0v\u00e0o\u00a0<code>ExecutorService<\/code>.<br>\u0110o\u1ea1n n\u00e0y c\u00f3 th\u1ec3 s\u1ebd c\u00f3 1 s\u1ed1 b\u1ea1n th\u1eafc m\u1eafc t\u1ea1i sao kh\u00f4ng d\u00f9ng\u00a0<strong>insert theo l\u00f4.<\/strong>\u00a0B\u1edfi v\u00ec \u1edf\u00a0<code>ThreadManager<\/code>\u00a0\u0111\u00e3 \u0111\u1ecdc t\u1eeb h\u00e0ng \u0111\u1ee3i ra, v\u00e0 t\u1ed1i \u0111a c\u0169ng ch\u1ec9 c\u00f3\u00a0<strong>10 ph\u1ea7n t\u1eed<\/strong>\u00a0\u0111\u01b0\u1ee3c \u0111\u1ea9y v\u00e0o list \u0111\u1ec3\u00a0<code>doProcess<\/code>, ngh\u0129a l\u00e0 b\u1ea3n ch\u1ea5t \u0111\u00e3 l\u00e0\u00a0<strong>batch<\/strong>\u00a0r\u1ed3i kh\u00f4ng c\u1ea7n x\u1eed l\u00fd \u1edf \u0111\u00e2y n\u1eefa.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage net.tunghuynh.logging.core;\n \nimport java.util.ArrayList;\n \npublic class LogManager extends ThreadManager {\n    @Override\n    public void doProcess(ArrayList items) {\n        LogThread logThread = new LogThread();\n        logThread.setItems(items);\n        executorService.submit(logThread);\n    }\n}\n<\/pre>\n\n\n<p>\u0110\u1ebfn \u0111\u00e2y ch\u1eafc c\u00e1c b\u1ea1n c\u0169ng m\u01b0\u1eddng t\u01b0\u1ee3ng ra, khi ph\u00e1t sinh th\u00eam nhi\u1ec1u lo\u1ea1i log kh\u00e1c c\u1ea7n ghi v\u00e0o\u00a0<strong>table kh\u00e1c<\/strong>, ho\u1eb7c\u00a0<strong>send qua FTP<\/strong>,\u2026 ho\u1eb7c b\u1ea5t k\u1ef3 task v\u1ee5 g\u00ec kh\u00e1c c\u1ea7n x\u1eed l\u00fd\u00a0<strong>b\u1ea5t \u0111\u1ed3ng b\u1ed9<\/strong>\u00a0th\u00ec \u0111\u1ec1u c\u00f3 th\u1ec3 t\u00e1i s\u1eed d\u1ee5ng\u00a0<code>abstract class ThreadManager<\/code>\u00a0l\u00e0m khung, ch\u1ec9 c\u1ea7n \u0111\u1ecbnh ngh\u0129a l\u1ea1i c\u00e1c class kh\u00e1c t\u01b0\u01a1ng t\u1ef1 nh\u01b0\u00a0<code>LogThread<\/code>\u00a0\u0111\u1ec3 x\u1eed l\u00fd nghi\u1ec7p v\u1ee5 ch\u00ednh v\u00e0\u00a0<code>LogManager<\/code>\u00a0\u0111\u1ec3 \u0111\u1ecdc d\u1eef li\u1ec7u t\u1eeb h\u00e0ng \u0111\u1ee3i. Nh\u01b0 v\u1eady c\u00e1c b\u1ea1n \u0111\u00e3 c\u00f3 \u0111\u01b0\u1ee3c m\u1ed9t khung ti\u1ebfn tr\u00ecnh c\u01a1 b\u1ea3n.<br>Cu\u1ed1i c\u00f9ng \u0111\u1ec3 s\u1eed d\u1ee5ng \u0111\u01b0\u1ee3c b\u1ed9 ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9 v\u00e0o database \u0111\u00e3 t\u1ea1o \u1edf tr\u00ean th\u00ec m\u00ecnh vi\u1ebft 1 \u0111o\u1ea1n\u00a0<strong>test<\/strong>trong\u00a0<code>Main.java<\/code><\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage net.tunghuynh.logging;\n \nimport net.tunghuynh.logging.core.Logs;\nimport net.tunghuynh.preparestatement.DatabaseUtils;\nimport org.apache.logging.log4j.Level;\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n \nimport java.sql.Connection;\nimport java.sql.PreparedStatement;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n \npublic class Main {\n    static Logger logger = LogManager.getLogger(Main.class);\n    public static void main(String[] args) {\n        \/\/T\u1ea1o \u0111\u1ed1i t\u01b0\u1ee3ng test \u0111\u1ec3 ghi log\n        Logs logs = new Logs();\n        logs.setLevelLog(&quot;INFO&quot;);\n        logs.setContent(&quot;Content&quot;);\n        long start = new Date().getTime();\n        \/\/Kh\u1edfi t\u1ea1o LogManager \u0111\u1ec3 ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9\n        net.tunghuynh.logging.core.LogManager logManager = new net.tunghuynh.logging.core.LogManager();\n        logManager.listen();\n        \/\/Submit v\u00e0o h\u00e0ng \u0111\u1ee3i\n        logManager.submit(logs);\n        logger.info(&quot;Async: &quot; + (new Date().getTime()-start) + &quot;ms&quot;);\n        start = new Date().getTime();\n        \/\/Ghi log kh\u00f4ng d\u00f9ng thread\n        new Main().save(logs);\n        logger.info(&quot;No-async: &quot; + (new Date().getTime()-start) + &quot;ms&quot;);\n    }\n    public void save(Logs item) {\n        PreparedStatement stmt = null;\n        Connection con = null;\n        try {\n            con = DatabaseUtils.getConnection();\n            stmt = con.prepareStatement(&quot;INSERT INTO LOGS (LOGS_ID, LEVEL_LOG, CONTENT, CREATE_TIME)&quot; +\n                    &quot; VALUES(LOGS_SEQ.NEXTVAL, ?, ?, SYSDATE)&quot;);\n            stmt.setString(1, item.getLevelLog());\n            stmt.setString(2, item.getContent());\n            stmt.execute();\n        } catch (Exception ex) {\n            logger.error(ex.getMessage(), ex);\n        } finally {\n            DatabaseUtils.closeObject(stmt);\n            DatabaseUtils.closeObject(con);\n        }\n    }\n}\n<\/pre>\n\n\n<p>\u1ede \u0111o\u1ea1n test n\u00e0y m\u00ecnh k\u1ebft h\u1ee3p c\u1ea3 c\u00e1ch ghi\u00a0<strong>kh\u00f4ng d\u00f9ng thread<\/strong>\u00a0ban \u0111\u1ea7u v\u00e0 c\u00e1ch ghi\u00a0<strong>b\u1ea5t \u0111\u1ed3ng b\u1ed9<\/strong>\u00a0m\u1edbi d\u1ef1ng \u0111\u1ec3 \u0111o th\u1eddi gian x\u1eed l\u00fd<br>Th\u1eed ch\u1ea1y v\u00e0 xem k\u1ebft qu\u1ea3<\/p>\n\n\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n2019-07-12 16:34:58 PM INFO  [Thread-1] net.tunghuynh.logging.core.ThreadManager.run : Queued job manager ACTION\/API LOGGER is running and watching for queue... \n2019-07-12 16:34:58 PM INFO  [main] net.tunghuynh.logging.Main.main : Async: 4ms\n2019-07-12 16:35:00 PM INFO  [main] net.tunghuynh.logging.Main.main : No-async: 1898ms\n2019-07-12 16:35:00 PM INFO  [Thread-1] net.tunghuynh.logging.core.ThreadManager.run : Thread Thread-1: ACTION\/API LOGGER submits 1 item(s)\n2019-07-12 16:35:29 PM INFO  [Thread-1] net.tunghuynh.logging.core.ThreadManager.run : Queued job manager ACTION\/API LOGGER is running and watching for queue... \n2019-07-12 16:35:29 PM INFO  [main] net.tunghuynh.logging.Main.main : Async: 7ms\n2019-07-12 16:35:31 PM INFO  [main] net.tunghuynh.logging.Main.main : No-async: 1519ms\n2019-07-12 16:35:31 PM INFO  [Thread-1] net.tunghuynh.logging.core.ThreadManager.run : Thread Thread-1: ACTION\/API LOGGER submits 1 item(s)\n<\/pre>\n\n\n<p>Nh\u00ecn k\u1ebft qu\u1ea3 ta th\u1ea5y s\u1ef1\u00a0<strong>kh\u00e1c bi\u1ec7t<\/strong>\u00a0r\u1ea5t l\u1edbn. V\u1edbi ghi log\u00a0<strong>b\u1ea5t \u0111\u1ed3ng b\u1ed9<\/strong>\u00a0th\u00ec th\u1eddi gian x\u1eed l\u00fd ch\u1ec9\u00a0<strong>d\u01b0\u1edbi 10 mili gi\u00e2y<\/strong>, b\u1edfi v\u00ec c\u00e1i g\u00ec ch\u1ea1y l\u00e2u th\u00ec n\u00f3 \u0111\u1ec3 cho th\u1eb1ng kh\u00e1c x\u1eed l\u00fd r\u1ed3i. C\u00f2n\u00a0<strong>insert th\u00f4ng th\u01b0\u1eddng<\/strong>\u00a0th\u00ec ph\u1ea3i m\u1ea5t\u00a0<strong>1.5 \u0111\u1ebfn 2 gi\u00e2y<\/strong>\u00a0(l\u00e2u g\u1ea5p 500 l\u1ea7n), r\u1ea5t \u0111\u00e1ng k\u1ec3 \u0111\u1ec3 s\u1eed d\u1ee5ng.<br>\u1ede \u0111o\u1ea1n test tr\u00ean m\u00ecnh ch\u1ec9 \u0111\u01b0a h\u1ebft v\u00e0o h\u00e0m main \u0111\u1ec3 test cho d\u1ec5, c\u00e1c b\u1ea1n c\u00f3 th\u1ec3\u00a0<strong>init<\/strong>\u00a0c\u00e1i\u00a0<code>ThreadManager<\/code>trong 1 kh\u1ed1i\u00a0<code>static<\/code>\u00a0\u0111\u1ec3 s\u1eed d\u1ee5ng lu\u00f4n h\u00e0m\u00a0<strong>submit<\/strong>\u00a0m\u00e0 kh\u00f4ng ph\u1ea3i kh\u1edfi t\u1ea1o l\u1ea1i nhi\u1ec1u l\u1ea7n, ho\u1eb7c n\u1ebfu c\u00e1c b\u1ea1n d\u00f9ng\u00a0<strong>Spring<\/strong>\u00a0th\u00ec n\u00ean t\u1ea1o 1\u00a0<strong>Bean<\/strong>\u00a0cho\u00a0<code>LogManager<\/code>\u00a0v\u1edbi\u00a0<strong>h\u00e0m kh\u1edfi t\u1ea1o<\/strong>\u00a0l\u00e0\u00a0<code>listen()<\/code>\u00a0v\u00e0\u00a0<strong>destroy<\/strong>\u00a0l\u00e0\u00a0<code>stop()<\/code>\u00a0\u0111\u1ec3 s\u1eed d\u1ee5ng<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n@Bean(name = &quot;logManager&quot;, initMethod = &quot;listen&quot;, destroyMethod = &quot;stop&quot;)\npublic LogManager getLogManager() {\n    return new LogManager();\n}\n<\/pre>\n\n\n<p>Khi c\u1ea7n d\u00f9ng\u00a0<strong>Bean logManager<\/strong>\u00a0n\u00e0y \u1edf \u0111\u00e2u th\u00ec ch\u1ec9 c\u1ea7n\u00a0<code>Autowired<\/code>\u00a0nh\u01b0 m\u1ecdi\u00a0<strong>Bean<\/strong>\u00a0kh\u00e1c l\u00e0 c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng \u0111\u01b0\u1ee3c.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n@Autowired\nLogManager logManager;\n<\/pre>\n\n\n<p>T\u1edbi demo n\u00e0y th\u00ec c\u00e1c b\u1ea1n \u0111\u00e3 t\u1ea1o \u0111\u01b0\u1ee3c m\u1ed9t module\u00a0<strong>ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9<\/strong>\u00a0v\u00e0o\u00a0<strong>database<\/strong>\u00a0\u0111\u1ee7 d\u00f9ng v\u00e0 an to\u00e0n. C\u00e1c b\u1ea1n ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 b\u1ed5 sung c\u00e1c t\u00ednh n\u0103ng ghi log b\u1eb1ng c\u00e1ch g\u1ecdi m\u1ed9t\u00a0<strong>API l\u01b0u log<\/strong>\u00a0kh\u00e1c,\u00a0<strong>g\u1eedi log<\/strong>\u00a0sang\u00a0<strong>server<\/strong>\u00a0kh\u00e1c qua\u00a0<strong>FTP<\/strong>,\u2026. thay v\u00ec ch\u1ec9 ghi v\u00e0o\u00a0<strong>database<\/strong>, t\u00f9y theo m\u1ee5c \u0111\u00edch s\u1eed d\u1ee5ng m\u00e0 kh\u00f4ng \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn \u1ee9ng d\u1ee5ng ch\u00ednh.<br><strong><em>Ch\u00fac c\u00e1c b\u1ea1n th\u00e0nh c\u00f4ng<\/em><\/strong><\/p>\n\n\n\n<p><a href=\"http:\/\/tunghuynh.net\/download\/logdbexample-zip\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Download code LogDBExample.zip (opens in a new tab)\">Download code LogDBExample.zip<\/a><\/p>\n","excerpt":"<p>B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3.\u00a0 Ch\u00e0o c\u00e1c b\u1ea1n, \u1edf 2 ph\u1ea7n tr\u01b0\u1edbc v\u1ec1 ghi log[Java log] P1: T\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m[Java log] P2: T\u00edch h\u1ee3p log4j v\u00e0o ph\u1ea7n m\u1ec1mm\u00ecnh \u0111\u00e3 \u0111\u1ec1 c\u1eadp v\u1ec1 t\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log, m\u1ed9t s\u1ed1 nguy\u00ean t\u1eafc khi ghi log, v\u00e0 h\u01b0\u1edbng d\u1eabn c\u00e1ch t\u00edch h\u1ee3p\u00a0log4j\u00a0v\u00e0o m\u1ed9t ch\u01b0\u01a1ng tr\u00ecnh [&hellip;]<\/p>\n","date":"2019-08-02 11:23:14","modified":"2019-08-02 11:23:21","categories":[{"id":2377,"slug":"tut-java-log","title":"TUT Java Log","description":"","parent":1093,"post_count":3}],"tags":[{"id":2380,"slug":"java-log","title":"java log","description":"","post_count":3}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6596,"type":"post","slug":"java-log-p2-tich-hop-log4j-vao-phan-mem","url":"https:\/\/cachhoc.net\/2019\/07\/31\/java-log-p2-tich-hop-log4j-vao-phan-mem\/","status":"publish","title":"[Java log] P2: T\u00edch h\u1ee3p log4j v\u00e0o ph\u1ea7n m\u1ec1m","title_plain":"[Java log] P2: T\u00edch h\u1ee3p log4j v\u00e0o ph\u1ea7n m\u1ec1m","content":"\n<p><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"http:\/\/tunghuynh.net\/programer\/java\/2258\/java-phan-13-log-2-tich-hop-log4j-vao-phan-mem\/\" target=\"_blank\">B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3.<\/a><br><br>Ch\u00e0o m\u1ecdi ng\u01b0\u1eddi, \u1edf b\u00e0i tr\u01b0\u1edbc (<a href=\"https:\/\/cachhoc.net\/2019\/07\/29\/java-log-p1-tam-quan-trong-cua-ghi-log-trong-phat-trien-phan-mem\/\">[Java log] P1: T\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m<\/a>) m\u00ecnh \u0111\u00e3 chia s\u1ebb v\u1ec1\u00a0<strong>t\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log<\/strong>\u00a0v\u00e0 m\u1ed9t s\u1ed1\u00a0<strong>nguy\u00ean t\u1eafc<\/strong>\u00a0khi ghi log. B\u00e0i n\u00e0y m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn\u00a0<strong>c\u00e1ch t\u00edch h\u1ee3p m\u1ed9t module log c\u01a1 b\u1ea3n v\u00e0o \u1ee9ng d\u1ee5ng<\/strong>. C\u00e1c b\u1ea1n n\u00ean t\u1eadp th\u00f3i quen t\u00edch h\u1ee3p ghi log v\u00e0o m\u1ecdi ph\u1ea7n m\u1ec1m t\u1eeb nh\u1ecf nh\u1ea5t c\u1ee7a c\u00e1 nh\u00e2n, s\u1ebd th\u1ea5y s\u1ef1 ti\u1ec7n l\u1ee3i c\u1ee7a n\u00f3 v\u00e0 ph\u1ea7n m\u1ec1m tr\u1edf n\u00ean chuy\u00ean nghi\u1ec7p h\u01a1n, khi l\u00e0m c\u00e1c ph\u1ea7n m\u1ec1m l\u1edbn c\u0169ng s\u1ebd th\u1ea5y quen thu\u1ed9c v\u00e0 d\u1ec5 d\u00e0ng h\u01a1n nhi\u1ec1u.<br>M\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u00e1ch t\u00edch h\u1ee3p\u00a0<strong>Log4j<\/strong>\u00a0v\u00e0o m\u1ed9t ch\u01b0\u01a1ng tr\u00ecnh\u00a0<strong>Java<\/strong>\u00a0nh\u1ecf. Trong b\u00e0i n\u00e0y m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn c\u1ea5u h\u00ecnh b\u1eb1ng file\u00a0<strong>XML<\/strong>, c\u00e1c b\u1ea1n ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 t\u00ecm hi\u1ec3u v\u00e0 th\u1eed c\u1ea5u h\u00ecnh b\u1eb1ng\u00a0<strong>JSON, YAML, Properties<\/strong>\u00a0c\u0169ng v\u1edbi c\u1ea5u tr\u00fac t\u01b0\u01a1ng t\u1ef1. Trong ph\u1ea1m vi b\u00e0i vi\u1ebft n\u00e0y, \u0111\u1ec3 \u0111\u01a1n gi\u1ea3n nh\u1ea5t c\u00f3 th\u1ec3 n\u00ean m\u00ecnh s\u1ebd kh\u00f4ng s\u1eed d\u1ee5ng\u00a0<strong>maven<\/strong>, thay v\u00e0o \u0111\u00f3 s\u1ebd d\u00f9ng c\u00e1ch\u00a0<strong>add lib<\/strong>\u00a0v\u00e0o project th\u00f4ng th\u01b0\u1eddng\u00a0 \ud83d\ude00<\/p>\n\n\n\n<p>Tr\u01b0\u1edbc ti\u00ean c\u00e1c b\u1ea1n c\u1ea7n t\u1ea3i g\u00f3i\u00a0<strong>jar log4j<\/strong>, \u1edf \u0111\u00e2y m\u00ecnh s\u1ebd s\u1eed d\u1ee5ng phi\u00ean b\u1ea3n\u00a0<strong>log4j 2.7<\/strong>.<br>Link download:\u00a0<a href=\"http:\/\/archive.apache.org\/dist\/logging\/log4j\/2.7\/apache-log4j-2.7-bin.zip\">http:\/\/archive.apache.org\/dist\/logging\/log4j\/2.7\/apache-log4j-2.7-bin.zip<\/a><br>Trong file n\u00e9n n\u00e0y c\u00f3 r\u1ea5t nhi\u1ec1u g\u00f3i jar, nh\u01b0ng \u0111\u1ec3 ghi \u0111\u01b0\u1ee3c log th\u00ec ch\u1ec9 c\u1ea7n 2 g\u00f3i\u00a0<strong>core<\/strong>\u00a0v\u00e0\u00a0<strong>api<\/strong>\u00a0l\u00e0 \u0111\u1ee7.<br>Sau khi c\u00f3 2 g\u00f3i jar tr\u00ean, c\u00e1c b\u1ea1n add v\u00e0o project v\u00e0 b\u1eaft \u0111\u1ea7u code. N\u1ebfu ai ch\u01b0a bi\u1ebft c\u00e1c add lib\u00a0<strong>.jar<\/strong>\u00a0v\u00e0o project th\u00ec t\u1ef1 google nh\u00e9, \u0111\u00e2y l\u00e0 ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n\u00a0\ud83d\ude42<\/p>\n\n\n\n<p>Tr\u01b0\u1edbc ti\u00ean m\u00ecnh t\u1ea1o 1 file\u00a0<strong>Main.java<\/strong>\u00a0cho v\u00ed d\u1ee5 n\u00e0y v\u00e0 khai b\u00e1o m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng\u00a0<strong>logger<\/strong>\u00a0nh\u01b0 \u0111o\u1ea1n code d\u01b0\u1edbi.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n \npublic class Main {\n    static Logger logger = LogManager.getLogger(Main.class);\n    public static void main(String[] args) {\n        logger.info(&quot;info&quot;);\n        logger.warn(&quot;warn&quot;);\n        logger.error(&quot;error&quot;);\n    }\n}\n<\/pre>\n\n\n<p>Sau \u0111\u00f3 t\u1ea1o 1 file&nbsp;<strong>log4j2.xml<\/strong>&nbsp;v\u00e0 \u0111\u1eb7t v\u00e0o th\u01b0 m\u1ee5c&nbsp;<strong>resources<\/strong>&nbsp;c\u1ee7a project (ph\u1ea3i ch\u00ednh x\u00e1c t\u00ean file v\u00e0 th\u01b0 m\u1ee5c nh\u00e9). \u0110\u00e2y s\u1ebd l\u00e0 file c\u1ea5u h\u00ecnh cho vi\u1ec7c ghi log.<br>C\u1ea5u tr\u00fac c\u00e1c file nh\u01b0 \u1ea3nh<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img src=\"https:\/\/i0.wp.com\/tunghuynh.net\/wp-content\/uploads\/2019\/07\/log4j_1.png?resize=245%2C175\" alt=\"\" class=\"wp-image-2259\"\/><\/figure><\/div>\n\n\n\n<p>Tr\u01b0\u1edbc m\u1eaft m\u00ecnh s\u1ebd c\u1ea5u h\u00ecnh m\u1ed9t\u00a0<strong>appender<\/strong>\u00a0log \u0111\u01a1n gi\u1ea3n nh\u1ea5t \u0111\u1ec3 ghi ra m\u00e0n h\u00ecnh\u00a0<strong>console<\/strong><\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;Configuration&gt;\n    &lt;Appenders&gt;\n        &lt;Console name=&quot;Console&quot; target=&quot;SYSTEM_OUT&quot;&gt;\n            &lt;PatternLayout\n                    pattern=&quot;%d{yyyy-MM-dd HH:mm:ss a} %highlight{%-5level} [%15.15t] %style{%40C{1.}.%-20M}{cyan} : %msg%n&quot;\/&gt;\n        &lt;\/Console&gt;\n    &lt;\/Appenders&gt;\n \n    &lt;Loggers&gt;\n        &lt;Root level=&quot;debug&quot;&gt;\n            &lt;AppenderRef ref=&quot;Console&quot;\/&gt;\n        &lt;\/Root&gt;\n    &lt;\/Loggers&gt;\n&lt;\/Configuration&gt;\n<\/pre>\n\n\n<p><strong>Appenders<\/strong>\u00a0\u0111\u1ec3 khai b\u00e1o c\u00e1c b\u1ed9 k\u1ebft n\u1ed1i gi\u00fap \u0111\u1ecbnh ngh\u0129a ra c\u00e1c c\u1ea5u h\u00ecnh l\u01b0u log \u1edf \u0111\u00e2u, \u0111\u1ecbnh d\u1ea1ng log ra sao.<br>\u1ede tr\u00ean m\u00ecnh \u0111\u00e3 khai b\u00e1o 1 appender ki\u1ec3u\u00a0<code>Console<\/code>, \u0111\u1eb7t t\u00ean l\u00e0\u00a0<code>Console<\/code>\u00a0v\u1edbi \u0111\u00edch xu\u1ea5t ra l\u00e0\u00a0<code>SYSTEM_OUT<\/code>ngh\u0129a l\u00e0 m\u00e0n h\u00ecnh d\u00f2ng l\u1ec7nh. Trong \u0111\u00f3 m\u00ecnh c\u00f3 \u0111\u1ecbnh ngh\u0129a th\u00eam \u0111\u1ecbnh d\u1ea1ng 1 d\u00f2ng log khi xu\u1ea5t ra s\u1ebd bao g\u1ed3m c\u00e1c th\u00f4ng tin g\u00ec.<br>C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 xem chi ti\u1ebft h\u01a1n v\u1ec1 c\u00e1c \u0111\u1ecbnh d\u1ea1ng n\u00e0y t\u1ea1i\u00a0<strong>docs<\/strong>\u00a0c\u1ee7a\u00a0<strong>log4j<\/strong><br><a href=\"https:\/\/logging.apache.org\/log4j\/2.x\/manual\/layouts.html#PatternLayout\">https:\/\/logging.apache.org\/log4j\/2.x\/manual\/layouts.html#PatternLayout<\/a><br><strong>Loggers<\/strong>\u00a0\u0111\u1ec3 khai b\u00e1o c\u00e1c \u0111i\u1ec1u ki\u1ec7n s\u1eed d\u1ee5ng\u00a0<strong>appender<\/strong>. Nh\u01b0 tr\u00ean m\u00ecnh \u0111ang \u0111\u1ec3 \u0111i\u1ec1u ki\u1ec7n l\u00e0 log m\u1ecdi\u00a0<strong>level log<\/strong>\u00a0t\u1eeb\u00a0<strong>Debug<\/strong>\u00a0tr\u1edf \u0111i s\u1ebd ghi ra\u00a0<strong>Console<\/strong><br>Ch\u1ea1y th\u1eed ch\u01b0\u01a1ng tr\u00ecnh v\u00e0 xem k\u1ebft qu\u1ea3<\/p>\n\n\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n2019-07-12 22:56:33 PM INFO  [           main]                               n.t.l.Main.main                 : info\n2019-07-12 22:56:33 PM WARN  [           main]                               n.t.l.Main.main                 : warn\n2019-07-12 22:56:33 PM ERROR [           main]                               n.t.l.Main.main                 : error\n\n<\/pre>\n\n\n<p>M\u1eb7c d\u00f9 code trong file\u00a0<strong>Main.java<\/strong>\u00a0m\u00ecnh ch\u1ec9 g\u1ecdi h\u00e0m ghi log v\u1edbi c\u00e1c text nh\u01b0\u00a0<strong>\u201cinfo\u201d, \u201cwarn\u201d, \u201cerror\u201d<\/strong>. Nh\u01b0ng log hi\u1ec3n th\u1ecb ra th\u00ec \u0111\u1ea7y \u0111\u1ee7 c\u1ea3\u00a0<strong>th\u1eddi gian th\u1ef1c thi,log level (INFO, WARN, ERROR), package class, method<\/strong>, kh\u00e1 ti\u1ec7n cho vi\u1ec7c xem log. \u0110\u00f3 l\u00e0 do c\u1ea5u h\u00ecnh trong ph\u1ea7n\u00a0<code>PatternLayout<\/code><br>T\u01b0\u01a1ng t\u1ef1 m\u00ecnh s\u1ebd c\u1ea5u h\u00ecnh th\u00eam 1\u00a0<strong>appender<\/strong>\u00a0ghi log ra\u00a0<strong>file<\/strong>\u00a0b\u1eb1ng c\u00e1ch b\u1ed5 sung th\u00eam appender d\u01b0\u1edbi<\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;RollingFile name=&quot;File&quot; fileName=&quot;logs\/server.log&quot;\n             filePattern=&quot;logs\/$${date:yyyy-MM}\/%d{dd}\/server.%i.log&quot;&gt;\n    &lt;PatternLayout pattern=&quot;%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n&quot;\/&gt;\n    &lt;Policies \/&gt;\n&lt;\/RollingFile&gt;\n<\/pre>\n\n\n<p>K\u1ebft qu\u1ea3, v\u1edbi c\u00e1c log ghi ra file th\u00ec th\u01b0\u1eddng m\u00ecnh \u0111\u1ec3 hi\u1ec3n th\u1ecb \u0111\u1ea7y \u0111\u1ee7\u00a0<strong>package class<\/strong>\u00a0v\u00e0 kh\u00f4ng c\u0103n ch\u1ec9nh kho\u1ea3ng tr\u1eafng \u0111\u1ec3 tr\u00e1nh t\u0103ng dung l\u01b0\u1ee3ng th\u1eeba<\/p>\n\n\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n2019-07-12 23:08:58 PM INFO [main] net.tunghuynh.logging.Main.main : info\n2019-07-12 23:08:58 PM WARN [main] net.tunghuynh.logging.Main.main : warn\n2019-07-12 23:08:58 PM ERROR [main] net.tunghuynh.logging.Main.main : error\n<\/pre>\n\n\n<p>\u1ede appender d\u00e0nh cho log file tr\u00ean, m\u00ecnh \u0111\u00e3 c\u1ea5u h\u00ecnh th\u00eam\u00a0filePattern\u00a0\u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng\u00a0<strong>c\u1eaft file log theo ng\u00e0y<\/strong><br>Nh\u01b0 v\u1eady ch\u1ec9 c\u1ea7n m\u1ed9t v\u00e0i b\u01b0\u1edbc ng\u1eafn g\u1ecdn, b\u1ea1n \u0111\u00e3 c\u00f3 th\u1ec3\u00a0<strong>ghi log<\/strong>\u00a0theo chu\u1ea9n cho ch\u01b0\u01a1ng tr\u00ecnh c\u1ee7a m\u00ecnh. N\u1ebfu mu\u1ed1n r\u00f5 r\u00e0ng h\u01a1n, c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 c\u1ea5u h\u00ecnh th\u00eam c\u00e1c\u00a0<strong>appender<\/strong>\u00a0\u0111\u1ec3 chia ra th\u00e0nh c\u00e1c file\u00a0<strong>log info, log error, log debug<\/strong>\u00a0ri\u00eang cho d\u1ec5 ki\u1ec3m so\u00e1t v\u00e0 thay th\u1ebf cho log chung \u1edf tr\u00ean.<\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;RollingFile name=&quot;FileInfo&quot; fileName=&quot;logs\/info.log&quot;\n             filePattern=&quot;logs\/$${date:yyyy-MM}\/%d{dd}\/info.%i.log&quot;&gt;\n    &lt;PatternLayout pattern=&quot;%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n&quot;\/&gt;\n    &lt;LevelRangeFilter minLevel=&quot;INFO&quot; maxLevel=&quot;INFO&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;\/&gt;\n    &lt;Policies \/&gt;\n&lt;RollingFile name=&quot;FileWarn&quot; fileName=&quot;logs\/warn.log&quot;\n             filePattern=&quot;logs\/$${date:yyyy-MM}\/%d{dd}\/warn.%i.log&quot;&gt;\n    &lt;PatternLayout pattern=&quot;%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n&quot;\/&gt;\n    &lt;LevelRangeFilter minLevel=&quot;WARN&quot; maxLevel=&quot;WARN&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;\/&gt;\n    &lt;Policies \/&gt;\n&lt;RollingFile name=&quot;FileError&quot; fileName=&quot;logs\/error.log&quot;\n             filePattern=&quot;logs\/$${date:yyyy-MM}\/%d{dd}\/error.%i.log&quot;&gt;\n    &lt;PatternLayout pattern=&quot;%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n&quot;\/&gt;\n    &lt;LevelRangeFilter minLevel=&quot;ERROR&quot; maxLevel=&quot;ERROR&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;\/&gt;\n    &lt;Policies \/&gt;\n&lt;\/RollingFile&gt;\n\n<\/pre>\n\n\n<p>\u0110\u1ebfn \u0111\u00e2y, b\u1eaft \u0111\u1ea7u th\u1ea5y c\u00e1c\u00a0<strong>appender<\/strong>\u00a0c\u00f3 c\u00e1c c\u1ea5u h\u00ecnh t\u01b0\u01a1ng t\u1ef1 nhau v\u00ed d\u1ee5 nh\u01b0 \u0111\u01b0\u1eddng d\u1eabn l\u01b0u\u00a0<strong>log, pattern layout<\/strong>, n\u1ebfu gi\u1edd c\u1ea7n s\u1eeda s\u1ebd ph\u1ea3i s\u1eeda t\u1eebng\u00a0<strong>appender<\/strong>, n\u00ean ta c\u00f3 th\u1ec3 khai b\u00e1o c\u00e1c\u00a0<strong>property<\/strong>\u00a0\u0111\u1ecbnh ngh\u0129a gi\u00e1 tr\u1ecb v\u00e0 t\u00e1i s\u1eed d\u1ee5ng trong c\u00e1c\u00a0<strong>appender<\/strong><\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;Configuration&gt;\n    &lt;Properties&gt;\n        &lt;Property name=&quot;patternLayout&quot;&gt;%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n&lt;\/Property&gt;\n        &lt;Property name=&quot;logPath&quot;&gt;logs&lt;\/Property&gt;\n    &lt;\/Properties&gt;\n    &lt;Appenders&gt;\n        &lt;Console name=&quot;Console&quot; target=&quot;SYSTEM_OUT&quot;&gt;\n            &lt;PatternLayout\n                    pattern=&quot;%d{yyyy-MM-dd HH:mm:ss a} %highlight{%-5level} [%15.15t] %style{%40C{1.}.%-20M}{cyan} : %msg%n&quot;\/&gt;\n        &lt;\/Console&gt;\n        &lt;RollingFile name=&quot;FileInfo&quot; fileName=&quot;${logPath}\/info.log&quot;\n                     filePattern=&quot;${logPath}\/$${date:yyyy-MM}\/%d{dd}\/info.%i.log&quot;&gt;\n            &lt;PatternLayout pattern=&quot;${patternLayout}&quot;\/&gt;\n            &lt;LevelRangeFilter minLevel=&quot;INFO&quot; maxLevel=&quot;INFO&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;\/&gt;\n            &lt;Policies \/&gt;\n        &lt;\/RollingFile&gt;\n        &lt;RollingFile name=&quot;FileWarn&quot; fileName=&quot;${logPath}\/warn.log&quot;\n                     filePattern=&quot;${logPath}\/$${date:yyyy-MM}\/%d{dd}\/warn.%i.log&quot;&gt;\n            &lt;PatternLayout pattern=&quot;${patternLayout}&quot;\/&gt;\n            &lt;LevelRangeFilter minLevel=&quot;WARN&quot; maxLevel=&quot;WARN&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;\/&gt;\n            &lt;Policies \/&gt;\n        &lt;\/RollingFile&gt;\n        &lt;RollingFile name=&quot;FileError&quot; fileName=&quot;${logPath}\/error.log&quot;\n                     filePattern=&quot;${logPath}\/$${date:yyyy-MM}\/%d{dd}\/error.%i.log&quot;&gt;\n            &lt;PatternLayout pattern=&quot;${patternLayout}&quot;\/&gt;\n            &lt;LevelRangeFilter minLevel=&quot;ERROR&quot; maxLevel=&quot;ERROR&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;\/&gt;\n            &lt;Policies \/&gt;\n        &lt;\/RollingFile&gt;\n    &lt;\/Appenders&gt;\n    .......\n&lt;\/Configuration&gt;\n<\/pre>\n\n\n<p>V\u1eady gi\u1edd khi ch\u01b0\u01a1ng tr\u00ecnh\u00a0<strong>ph\u00e1t tri\u1ec3n l\u1edbn<\/strong>\u00a0l\u00ean, s\u1ed1 l\u01b0\u1ee3ng ch\u1ee9c n\u0103ng\u00a0<strong>nghi\u1ec7p v\u1ee5 t\u0103ng l\u00ean<\/strong>, n\u1ebfu t\u1ea5t c\u1ea3 log v\u1eabn ghi chung v\u00e0o m\u1ed9t file th\u00ec s\u1ebd r\u1ea5t\u00a0<strong>kh\u00f3 ki\u1ec3m so\u00e1t<\/strong>, \u0111\u00f3 l\u00e0 l\u00fac ta c\u1ea7n\u00a0<strong>chia log<\/strong>\u00a0theo c\u00e1c\u00a0<strong>nghi\u1ec7p v\u1ee5<\/strong>\u00a0c\u1ee5 th\u1ec3.<br>Nh\u01b0ng kh\u00f4ng ph\u1ea3i m\u1ecdi nghi\u1ec7p v\u1ee5 \u0111\u1ec1u c\u1ea7n t\u00e1ch ra file log ri\u00eang, nh\u01b0 \u1edf b\u00e0i tr\u01b0\u1edbc m\u00ecnh \u0111\u00e3 \u0111\u1ec1 c\u1eadp \u0111\u1ebfn ta s\u1ebd t\u00e1ch c\u00e1c log\u00a0<strong>nghi\u1ec7p v\u1ee5 quan tr\u1ecdng<\/strong>\u00a0ho\u1eb7c\u00a0<strong>x\u1eed l\u00fd nhi\u1ec1u<\/strong>\u00a0ra \u0111\u1ec3 d\u1ec5 ki\u1ec3m so\u00e1t. \u1ede \u0111\u00e2y m\u00ecnh t\u1ea1o th\u00eam\u00a0<strong>3 class<\/strong>\u00a0m\u1edbi m\u00f4 ph\u1ecfng\u00a0<strong>3 nghi\u1ec7p v\u1ee5<\/strong>\u00a0ph\u00e1t sinh, v\u00e0 s\u1ebd\u00a0<strong>ghi log 1 class<\/strong>\u00a0nghi\u1ec7p v\u1ee5 l\u00e0m v\u00ed d\u1ee5.<\/p>\n\n\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class BusinessA {\n    Logger logger = LogManager.getLogger(getClass());\n    public BusinessA(){\n        logger.info(&quot;Info From BusinessA&quot;);\n        logger.warn(&quot;Warn From BusinessA&quot;);\n        logger.error(&quot;Error From BusinessA&quot;);\n    }\n}\npublic class BusinessB {\n    Logger logger = LogManager.getLogger(getClass());\n    public BusinessB(){\n        logger.info(&quot;Info From BusinessB&quot;);\n        logger.warn(&quot;Warn From BusinessB&quot;);\n        logger.error(&quot;Error From BusinessB&quot;);\n    }\n}\npublic class BusinessC {\n    Logger logger = LogManager.getLogger(getClass());\n    public BusinessC(){\n        logger.info(&quot;Info From BusinessC&quot;);\n        logger.warn(&quot;Warn From BusinessC&quot;);\n        logger.error(&quot;Error From BusinessC&quot;);\n    }\n}\n<\/pre>\n\n\n<p>Sau \u0111\u00f3 b\u1ed5 sung\u00a0<strong>appender<\/strong>\u00a0ghi log ri\u00eang cho class\u00a0<strong>BusinessA<\/strong>\u00a0v\u00e0 khai b\u00e1o class s\u1eed d\u1ee5ng appender m\u1edbi t\u1ea1o<\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n.....\n    &lt;RollingFile name=&quot;LogBusinessA&quot; fileName=&quot;${logPath}\/business-a.log&quot;\n                 filePattern=&quot;${logPath}\/$${date:yyyy-MM}\/%d{dd}\/business-a.%i.log&quot;&gt;\n        &lt;PatternLayout pattern=&quot;${patternLayout}&quot;\/&gt;\n        &lt;Policies \/&gt;\n    &lt;\/RollingFile&gt;\n.....\n&lt;Loggers&gt;\n        &lt;Logger name=&quot;net.tunghuynh.logging.BusinessA&quot; level=&quot;debug&quot; additivity=&quot;false&quot;&gt;\n            &lt;AppenderRef ref=&quot;LogBusinessA&quot;\/&gt;\n            &lt;AppenderRef ref=&quot;Console&quot;\/&gt;\n        &lt;\/Logger&gt;\n        ........\n    &lt;\/Loggers&gt;\n\n<\/pre>\n\n\n<p>\u1ede\u00a0<strong>BusinessA<\/strong>\u00a0n\u00e0y m\u00ecnh s\u1ebd v\u1eeba ghi ra 1\u00a0<strong>file<\/strong>\u00a0log ri\u00eang v\u00e0 ghi ra m\u00e0n h\u00ecnh\u00a0<strong>console<\/strong>\u00a0v\u1edbi level log t\u1eeb\u00a0<strong>debug<\/strong>\u00a0tr\u1edf \u0111i<br>K\u00eat qu\u1ea3 s\u1ebd v\u1eabn ghi \u0111\u1ea7y \u0111\u1ee7 log c\u1ee7a c\u1ea3\u00a0<strong>3 nghi\u1ec7p v\u1ee5<\/strong>\u00a0m\u1edbi th\u00eam tr\u00ean m\u00e0n h\u00ecnh\u00a0<strong>console<\/strong>, nh\u01b0ng log c\u1ee7a\u00a0<strong>BusinessA<\/strong>\u00a0ch\u1ec9 \u0111\u01b0\u1ee3c ghi v\u00e0o file\u00a0<code>business-a.log<\/code>\u00a0ch\u1ee9 kh\u00f4ng xu\u1ea5t hi\u1ec7n trong c\u00e1c file log chung nh\u01b0\u00a0<code>info.log, warn.log, error.log<\/code><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img src=\"https:\/\/i2.wp.com\/tunghuynh.net\/wp-content\/uploads\/2019\/07\/log4j_2.png?resize=640%2C420\" alt=\"\" class=\"wp-image-2260\"\/><\/figure><\/div>\n\n\n\n<p>N\u1ebfu nghi\u1ec7p v\u1ee5 c\u1ee7a b\u1ea1n x\u1eed l\u00fd trong\u00a0<strong>nhi\u1ec1u class<\/strong>\u00a0th\u00ec n\u00ean\u00a0<strong>gom nghi\u1ec7p v\u1ee5 theo package<\/strong>\u00a0v\u00e0 ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 c\u1ea5u h\u00ecnh log ch\u1ec9 \u0111\u1ebfn t\u00ean package \u0111\u1ec3\u00a0<strong>ghi log to\u00e0n b\u1ed9 class trong package<\/strong>\u00a0\u0111\u00f3<br>M\u1ecdi chuy\u1ec7n c\u0169ng kh\u00f4ng \u0111\u01a1n gi\u1ea3n nh\u01b0 v\u1eady, khi ch\u01b0\u01a1ng tr\u00ecnh \u0111\u00e3 tr\u1edf th\u00e0nh 1 ph\u1ea7n m\u1ec1m hay \u1ee9ng d\u1ee5ng l\u1edbn,\u00a0<strong>s\u1ed1 l\u01b0\u1ee3ng x\u1eed l\u00fd t\u0103ng<\/strong>\u00a0l\u00ean d\u1eabn \u0111\u1ebfn c\u00e1c file log c\u1ee7a t\u1eebng nghi\u1ec7p v\u1ee5 c\u0169ng ph\u1ea3i ghi nhi\u1ec1u h\u01a1n l\u00e0m cho dung l\u01b0\u1ee3ng ng\u00e0y c\u00e0ng l\u1edbn, n\u1ebfu x\u00f3a \u0111i th\u00ec s\u1ebd m\u1ea5t log, n\u1ebfu kh\u00f4ng x\u00f3a th\u00ec c\u0169ng kh\u00f3 kh\u0103n trong vi\u1ec7c \u0111\u1ecdc file hay trace log, l\u00fac n\u00e0y ta l\u1ea1i c\u1ea7n ph\u1ea3i\u00a0<strong>c\u1eaft log<\/strong>.<br>\u0110\u1ec3 c\u1eaft file log th\u00ec c\u00f3\u00a0<strong>2 c\u00e1ch<\/strong>\u00a0c\u1eaft th\u00f4ng d\u1ee5ng \u0111\u00f3 l\u00e0 theo\u00a0<strong>dung l\u01b0\u1ee3ng<\/strong>\u00a0ho\u1eb7c\u00a0<strong>theo th\u1eddi gian<\/strong>, m\u00ecnh th\u01b0\u1eddng\u00a0<strong>k\u1ebft h\u1ee3p<\/strong>\u00a0c\u1ea3 2 c\u00e1ch n\u00e0y. V\u00ed d\u1ee5 c\u1eaft log khi\u00a0<strong>dung l\u01b0\u1ee3ng v\u01b0\u1ee3t qu\u00e1 10Mb<\/strong>\u00a0v\u00e0\u00a0<strong>c\u1eaft log theo ng\u00e0y<\/strong>, m\u1ed7i ng\u00e0y s\u1ebd c\u1eaft log 1 l\u1ea7n v\u00e0o cu\u1ed1i ng\u00e0y r\u1ed3i\u00a0<strong>l\u01b0u v\u00e0o th\u01b0 m\u1ee5c ri\u00eang<\/strong>, v\u1edbi c\u00e1c nghi\u1ec7p v\u1ee5 c\u00f3 s\u1ed1 l\u01b0\u1ee3ng x\u1eed l\u00fd qu\u00e1 l\u1edbn th\u00ec c\u00f3 th\u1ec3 c\u1eaft log theo gi\u1edd. V\u00ed d\u1ee5 m\u1ed9t\u00a0<strong>appender<\/strong>\u00a0c\u1ea5u h\u00ecnh c\u1eaft log theo ng\u00e0y v\u00e0 dung l\u01b0\u1ee3ng nh\u01b0 sau<\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;RollingFile name=&quot;LogBusinessA&quot; fileName=&quot;${logPath}\/business-a.log&quot;\n             filePattern=&quot;${logPath}\/$${date:yyyy-MM}\/%d{dd}\/business-a.%i.log&quot;&gt;\n    &lt;PatternLayout pattern=&quot;${patternLayout}&quot;\/&gt;\n    &lt;Policies&gt;\n        &lt;TimeBasedTriggeringPolicy\/&gt;\n        &lt;SizeBasedTriggeringPolicy size=&quot;10 MB&quot;\/&gt;\n    &lt;\/Policies&gt;\n    &lt;DefaultRolloverStrategy max=&quot;10&quot;\/&gt;\n&lt;\/RollingFile&gt;\n<\/pre>\n\n\n<p>Ngo\u00e0i ra c\u0169ng kh\u00f4ng th\u1ec3 tr\u00e1nh kh\u1ecfi tr\u01b0\u1eddng h\u1ee3p h\u1ec7 th\u1ed1ng b\u1ecb spam, ho\u1eb7c b\u1ecb 1 l\u1ed7i g\u00ec \u0111\u00f3 retry li\u00ean t\u1ee5c d\u1eabn \u0111\u1ebfn m\u1eb7c d\u00f9 \u0111\u00e3 c\u1eaft log th\u00e0nh nhi\u1ec1u file nh\u01b0ng&nbsp;<strong>s\u1ed1 l\u01b0\u1ee3ng file<\/strong>&nbsp;v\u1eabn&nbsp;<strong>sinh ra qu\u00e1 nhi\u1ec1u<\/strong>&nbsp;d\u1eabn \u0111\u1ebfn vi\u1ec7c \u0111\u1ea7y \u1ed5 c\u1ee9ng treo m\u00e1y ch\u1ee7. V\u1eady n\u00ean \u1edf tr\u00ean m\u00ecnh \u0111\u00e3 b\u1ed5 sung th\u00eam c\u1ea3 c\u1ea5u h\u00ecnh&nbsp;<code>DefaultRolloverStrategy<\/code>&nbsp;\u0111\u1ec3 ch\u1ec9 cho ph\u00e9p l\u01b0u&nbsp;<strong>10 file<\/strong>&nbsp;trong&nbsp;<strong>1 chu\u1ed7i log<\/strong>, n\u1ebfu v\u01b0\u1ee3t qu\u00e1 s\u1ed1 l\u01b0\u1ee3ng file th\u00ec s\u1ebd t\u1ef1 \u0111\u1ed9ng x\u00f3a d\u1ea7n c\u00e1c file c\u0169.<br>C\u00e1c gi\u00e1 tr\u1ecb c\u1ea5u h\u00ecnh n\u00e0y c\u0169ng c\u1ea7n s\u1eed d\u1ee5ng l\u1ea1i trong c\u00e1c appender kh\u00e1c n\u00ean c\u00e1c b\u1ea1n c\u0169ng c\u00f3 th\u1ec3 \u0111\u01b0a ra&nbsp;<strong>property<\/strong>&nbsp;nh\u01b0 \u1edf ph\u1ea7n tr\u00ean.<\/p>\n\n\n\n<p>Nh\u01b0 v\u1eady ch\u01b0\u01a1ng tr\u00ecnh c\u1ee7a c\u00e1c b\u1ea1n \u0111\u00e3 \u0111\u01b0\u1ee3c\u00a0<strong>t\u00edch h\u1ee3p module log ti\u00eau chu\u1ea9n c\u01a1 b\u1ea3n<\/strong>\u00a0nh\u1ea5t \u0111\u1ee7 d\u00f9ng v\u00e0 nh\u00ecn\u00a0<strong>chuy\u00ean nghi\u1ec7p<\/strong>\u00a0h\u01a1n r\u1ea5t nhi\u1ec1u. \ud83d\ude42<\/p>\n\n\n\n<p>\u0110\u00e2y l\u00e0 b\u00e0i h\u01b0\u1edbng d\u1eabn t\u00edch h\u1ee3p n\u00ean m\u00ecnh upload lu\u00f4n source cho c\u00e1c b\u1ea1n ti\u1ec7n t\u00ecm hi\u1ec3u. Ai d\u00f9ng&nbsp;<strong>IntelliJ IDE<\/strong>th\u00ec c\u00f3 th\u1ec3 open project l\u00e0 c\u00f3 lu\u00f4n c\u1ea5u h\u00ecnh lib trong project&nbsp;&nbsp;C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 download source \u1edf cu\u1ed1i b\u00e0i nh\u00e9.<\/p>\n\n\n\n<p>Nh\u01b0ng \u0111\u00f3 m\u1edbi ch\u1ec9 \u0111\u00e1p \u1ee9ng \u0111\u01b0\u1ee3c vi\u1ec7c<strong>\u00a0ghi log ra file,<\/strong>\u00a0\u0111\u00f4i khi vi\u1ec7c \u0111\u1ecdc log trong file c\u0169ng g\u1eb7p kh\u00f4ng \u00edt b\u1ea5t ti\u1ec7n. V\u00ed d\u1ee5 khi c\u1ea7n\u00a0<strong>ki\u1ec3m so\u00e1t c\u00e1c thao t\u00e1c c\u1ee7a user \u0111\u0103ng nh\u1eadp<\/strong>\u00a0ph\u1ea7n m\u1ec1m, s\u1eed d\u1ee5ng c\u00e1c ch\u1ee9c n\u0103ng g\u00ec, thao t\u00e1c d\u1eef li\u1ec7u g\u00ec tr\u00ean ph\u1ea7n m\u1ec1m, n\u00f3i chung c\u1ea7n c\u00e1c d\u1eef li\u1ec7u mang t\u00ednh\u00a0<strong>li\u00ean k\u1ebft c\u00f3 x\u00e2u chu\u1ed7i<\/strong>\u00a0\u0111i theo c\u00e1c\u00a0<strong>session \u0111\u0103ng nh\u1eadp<\/strong>\u00a0hay lu\u1ed3ng nghi\u1ec7p v\u1ee5 c\u1ee5 th\u1ec3 th\u00ec s\u1ebd c\u1ea7n l\u01b0u log v\u00e0o m\u1ed9t\u00a0<strong>database<\/strong>\u00a0ho\u1eb7c m\u1ed9t ki\u1ebfn tr\u00fac t\u01b0\u01a1ng t\u1ef1 \u0111\u1ec3 thu\u1eadn ti\u1ec7n cho vi\u1ec7c\u00a0<strong>truy v\u1ea5n d\u1eef li\u1ec7u.<\/strong><br>B\u00e0i n\u00e0y \u0111\u00e3 kh\u00e1 d\u00e0i r\u1ed3i n\u00ean m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn\u00a0<strong>ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9 v\u00e0o database<\/strong>\u00a0\u1edf ph\u1ea7n ti\u1ebfp theo<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" aria-label=\"Download code (opens in a new tab)\" href=\"http:\/\/tunghuynh.net\/download\/log4jexample-zip\/\" target=\"_blank\">Download code <\/a><a href=\"http:\/\/tunghuynh.net\/download\/log4jexample-zip\/\">Log4JExample.zip<\/a><\/p>\n","excerpt":"<p>B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3. Ch\u00e0o m\u1ecdi ng\u01b0\u1eddi, \u1edf b\u00e0i tr\u01b0\u1edbc ([Java log] P1: T\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m) m\u00ecnh \u0111\u00e3 chia s\u1ebb v\u1ec1\u00a0t\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log\u00a0v\u00e0 m\u1ed9t s\u1ed1\u00a0nguy\u00ean t\u1eafc\u00a0khi ghi log. B\u00e0i n\u00e0y m\u00ecnh s\u1ebd h\u01b0\u1edbng d\u1eabn\u00a0c\u00e1ch t\u00edch h\u1ee3p m\u1ed9t module log c\u01a1 b\u1ea3n v\u00e0o \u1ee9ng d\u1ee5ng. C\u00e1c b\u1ea1n n\u00ean t\u1eadp th\u00f3i quen [&hellip;]<\/p>\n","date":"2019-07-31 10:00:05","modified":"2019-07-31 10:00:19","categories":[{"id":2377,"slug":"tut-java-log","title":"TUT Java Log","description":"","parent":1093,"post_count":3}],"tags":[{"id":2380,"slug":"java-log","title":"java log","description":"","post_count":3}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6589,"type":"post","slug":"java-log-p1-tam-quan-trong-cua-ghi-log-trong-phat-trien-phan-mem","url":"https:\/\/cachhoc.net\/2019\/07\/29\/java-log-p1-tam-quan-trong-cua-ghi-log-trong-phat-trien-phan-mem\/","status":"publish","title":"[Java log] P1: T\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m","title_plain":"[Java log] P1: T\u1ea7m quan tr\u1ecdng c\u1ee7a ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m","content":"\n<!--TOC-->\n\n\n\n<p><a href=\"http:\/\/tunghuynh.net\/programer\/java\/2254\/java-phan-12-log-1-tam-quan-trong-cua-ghi-log-trong-phat-trien-phan-mem\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3. (opens in a new tab)\">B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3.<\/a><\/p>\n\n\n\n<p>Ch\u00e0o m\u1ecdi ng\u01b0\u1eddi. D\u1ea1o n\u00e0y b\u1eadn vi\u1ec7c qu\u00e1, tranh th\u1ee7 m\u00e3i m\u1edbi ng\u1ed3i vi\u1ebft b\u00e0i \u0111\u01b0\u1ee3c. H\u00f4m nay m\u00ecnh s\u1ebd chia s\u1ebb kinh nghi\u1ec7m c\u1ee7a m\u00ecnh li\u00ean quan \u0111\u1ebfn v\u1ea5n \u0111\u1ec1 ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m.<\/p>\n\n\n\n<h2><strong>Ghi log l\u00e0 g\u00ec?<\/strong>\n\n\n\n<p>N\u00f3i \u0111\u1ebfn ghi log th\u00ec ch\u1eafc \u0111\u00e3 nhi\u1ec1u b\u1ea1n bi\u1ebft \u0111\u00e2y l\u00e0 m\u1ed9t c\u00f4ng vi\u1ec7c&nbsp;<strong>l\u01b0u v\u1ebft l\u1ea1i qu\u00e1 tr\u00ecnh x\u1eed l\u00fd&nbsp;<\/strong>c\u1ee7a 1 \u0111o\u1ea1n code\/ch\u1ee9c n\u0103ng\/\u1ee9ng d\u1ee5ng, ho\u1eb7c ghi l\u1ea1i l\u1ed7i x\u1ea3y ra (n\u1ebfu c\u00f3)<br>M\u1ecdi h\u1ec7 th\u1ed1ng l\u1edbn nh\u01b0 h\u1ec7 qu\u1ea3n tr\u1ecb c\u01a1 s\u1edf d\u1eef li\u1ec7u \u0111\u1ec1u ghi log chi ti\u1ebft user n\u00e0o&nbsp;<strong>execute query<\/strong>&nbsp;g\u00ec tr\u00ean&nbsp;<strong>session<\/strong>n\u00e0o v\u00e0o th\u1eddi gian n\u00e0o. Hay Microsoft, web browser, adobe,\u2026 \u0111\u1ec1u c\u00f3 ch\u1ee9c n\u0103ng ghi l\u1ea1i log v\u00e0 hi\u1ec3n th\u1ecb c\u1eeda s\u1ed5&nbsp;<strong>Send report&nbsp;<\/strong>cho nh\u00e0 ph\u00e1t tri\u1ec3n khi ph\u1ea7n m\u1ec1m c\u00f3 l\u1ed7i x\u1ea3y ra.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img src=\"https:\/\/i0.wp.com\/support.hp.com\/doc-images\/172\/c00307698.gif?w=640&amp;ssl=1\" alt=\"K\u00e1\u00ba\u00bft qu\u00e1\u00ba\u00a3 h\u00c3\u00acnh \u00e1\u00ba\u00a3nh cho send report window\"\/><\/figure><\/div>\n\n\n\n<h2><strong>Ghi log \u0111\u1ec3 l\u00e0m g\u00ec?<\/strong>\n\n\n\n<p><strong>V\u1eady l\u01b0u v\u1ebft xong th\u00ec \u0111\u1ec3 l\u00e0m g\u00ec?<\/strong>\u00a0T\u1ea5t nhi\u00ean l\u00e0 ph\u1ee5c v\u1ee5 vi\u1ec7c\u00a0<strong>truy v\u1ebft\u00a0<\/strong>r\u1ed3i.\u00a0<br>N\u1ebfu b\u1ea1n ghi log l\u1ed7i th\u00ec\u00a0<strong>khi ch\u01b0\u01a1ng tr\u00ecnh c\u00f3 l\u1ed7i\u00a0<\/strong>b\u1ea1n c\u00f3 th\u1ec3 nh\u00ecn \u0111\u01b0\u1ee3c l\u1ed7i g\u00ec, \u1edf \u0111o\u1ea1n code n\u00e0o v\u00e0 d\u1ec5 d\u00e0ng trong vi\u1ec7c t\u00ecm\u00a0<strong>ph\u01b0\u01a1ng \u00e1n x\u1eed l\u00fd<\/strong>. Nhi\u1ec1u tr\u01b0\u1eddng h\u1ee3p ch\u01b0\u01a1ng tr\u00ecnh g\u1eb7p l\u1ed7i tr\u00ean m\u00f4i tr\u01b0\u1eddng production m\u00e0\u00a0<strong>kh\u00f4ng th\u1ec3 t\u00e1i hi\u1ec7n<\/strong>\u00a0l\u1ea1i \u0111\u01b0\u1ee3c, \u0111\u00f3 l\u00e0 khi c\u1ea7n \u0111\u1ebfn log \u0111\u1ec3 t\u00ecm nguy\u00ean nh\u00e2n.<br>N\u1ebfu b\u1ea1n ghi\u00a0<strong>log s\u1eed d\u1ee5ng\u00a0<\/strong>\u1ee9ng d\u1ee5ng, b\u1ea1n s\u1ebd bi\u1ebft user n\u00e0o v\u00e0o\u00a0<strong>truy c\u1eadp<\/strong>\u00a0v\u00e0o \u1ee9ng d\u1ee5ng v\u00e0\u00a0<strong>thao t\u00e1c<\/strong>\u00a0g\u00ec, t\u1eeb \u0111\u00f3 t\u00ecm \u0111\u01b0\u1ee3c th\u1ee7 ph\u1ea1m c\u1ee7a nh\u1eefng v\u1ee5 ph\u00e1 ho\u1ea1i.<br>N\u1ebfu ghi log \u1edf c\u00e1c\u00a0<strong>\u0111o\u1ea1n code ph\u1ee9c t\u1ea1p<\/strong>, c\u00e1c\u00a0<strong>ti\u1ebfn tr\u00ecnh ch\u1ea1y ng\u1ea7m<\/strong>, b\u1ea1n s\u1ebd bi\u1ebft \u0111\u01b0\u1ee3c\u00a0<strong>tr\u1ea1ng th\u00e1i<\/strong>\u00a0c\u1ee7a ti\u1ebfn tr\u00ecnh \u0111\u00f3 \u0111ang ch\u1ea1y nh\u01b0 th\u1ebf n\u00e0o, bi\u1ebft \u0111\u01b0\u1ee3c\u00a0<strong>t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd\u00a0<\/strong>c\u1ee7a c\u00e1c nghi\u1ec7p v\u1ee5 ph\u1ee9c t\u1ea1p, c\u00f3 c\u01a1 s\u1edf \u0111\u1ec3 t\u00ecm ra c\u00e1c \u0111o\u1ea1n code g\u00e2y\u00a0<strong>cao t\u1ea3i<\/strong>\u00a0cho h\u1ec7 th\u1ed1ng.<br>V\u00e0 r\u1ea5t nhi\u1ec1u l\u1ee3i \u00edch kh\u00e1c \ud83d\ude42<\/p>\n\n\n\n<h2><strong>C\u00f3 nh\u1eefng c\u00e1ch ghi log n\u00e0o?<\/strong>\n\n\n\n<ul><li>Print ra m\u00e0n h\u00ecnh\u00a0<\/li><li>Ghi ra file l\u01b0u tr\u00ean \u1ed5 c\u1ee9ng<\/li><li>K\u1ebft n\u1ed1i ftp \u0111\u1ebfn server kh\u00e1c \u0111\u1ec3 l\u01b0u file v\u00e0 truy\u1ec1n file sang server l\u01b0u log, ho\u1eb7c g\u1eedi qua service, email \u0111\u1ebfn nh\u00e0 ph\u00e1t tri\u1ec3n.<\/li><li>Insert log v\u00e0o 1 b\u1ea3ng trong c\u01a1 s\u1edf d\u1eef li\u1ec7u<\/li><li>&#8230;<\/li><\/ul>\n\n\n\n<h2><strong>Ghi log b\u1eb1ng g\u00ec?<\/strong>\n\n\n\n<ul><li>D\u00f9ng l\u1ec7nh print ra m\u00e0n h\u00ecnh<\/li><li>D\u00f9ng th\u01b0 vi\u1ec7n log4j, slf4j trong java<\/li><li>Insert log v\u00e0o c\u01a1 s\u1edf d\u1eef li\u1ec7u b\u1eb1ng c\u00e1ch execute l\u1ec7nh SQL ho\u1eb7c d\u00f9ng ORM nh\u01b0 Hibernate,\u2026<\/li><li>T\u1ef1 x\u00e2y d\u1ef1ng module ghi log c\u1ee7a ri\u00eang m\u00ecnh\u00a0<\/li><\/ul>\n\n\n\n<h2><strong>Ghi log nh\u1eefng c\u00e1i g\u00ec?<\/strong>\n\n\n\n<p>Kh\u00f4ng ph\u1ea3i\u00a0<strong>ghi nhi\u1ec1u qu\u00e1<\/strong>\u00a0c\u0169ng t\u1ed1t, ghi nhi\u1ec1u qu\u00e1 s\u1ebd l\u00e0m\u00a0<strong>th\u1eeba log<\/strong>\u00a0kh\u00f3 ki\u1ec3m so\u00e1t v\u00e0 trace log,\u00a0<strong>t\u1ed1n dung l\u01b0\u1ee3ng\u00a0<\/strong>\u0111\u1ec3 l\u01b0u tr\u1eef, ho\u1eb7c l\u00e0m tr\u00f4i \u0111i c\u00e1c log c\u1ea7n thi\u1ebft<br>C\u0169ng kh\u00f4ng th\u1ec3\u00a0<strong>ghi qu\u00e1 \u00edt<\/strong>\u00a0d\u1eabn \u0111\u1ebfn vi\u1ec7c\u00a0<strong>kh\u00f4ng c\u00f3 log<\/strong>\u00a0\u0111\u1ec3 x\u1eed l\u00fd<br>\u0110\u1ec3\u00a0<strong>ghi \u0111\u1ee7 log<\/strong>\u00a0th\u00ec m\u00ecnh \u0111\u01b0a ra m\u1ed9t s\u1ed1 v\u1ecb tr\u00ed nh\u01b0 sau:<\/p>\n\n\n\n<ul><li>Trong c\u00e1c kh\u1ed1i\u00a0<strong>catch exception<\/strong>, c\u1ea7n ph\u1ea3i ghi log \u0111\u1ec3 t\u00ecm ra \u0111\u01b0\u1ee3c\u00a0<strong>v\u1ecb tr\u00ed g\u00e2y l\u1ed7i\u00a0<\/strong>trong \u1ee9ng d\u1ee5ng khi c\u00f3 v\u1ea5n \u0111\u1ec1 x\u1ea3y ra.<\/li><li>C\u00e1c\u00a0<strong>ch\u1ee9c n\u0103ng s\u1eed d\u1ee5ng nhi\u1ec1u<\/strong>, c\u00f3 kh\u1ea3 n\u0103ng\u00a0<strong>g\u00e2y cao t\u1ea3i<\/strong>\u00a0h\u1ec7 th\u1ed1ng, c\u00e1c ch\u1ee9c n\u0103ng quan tr\u1ecdng c\u1ea7n ghi log \u0111\u1ec3\u00a0<strong>gi\u00e1m s\u00e1t th\u01b0\u1eddng xuy\u00ean<\/strong>, \u0111\u1ea3m b\u1ea3o h\u1ec7 th\u1ed1ng v\u1eabn \u0111ang ch\u1ea1y \u1ed5n \u0111\u1ecbnh.<\/li><li>V\u1edbi c\u00e1c\u00a0<strong>ti\u1ebfn tr\u00ecnh ch\u1ea1y ng\u1ea7m<\/strong>, t\u1ed1i thi\u1ec3u c\u1ea7n ph\u1ea3i ghi log m\u1ed7i khi\u00a0<strong>start v\u00e0 finish<\/strong>\u00a0k\u00e8m theo t\u1ed5ng\u00a0<strong>th\u1eddi gian x\u1eed l\u00fd\u00a0<\/strong>\u0111\u1ec3 bi\u1ebft \u0111\u01b0\u1ee3c ti\u1ebfn tr\u00ecnh c\u00f3 ch\u1ea1y \u0111\u00fang l\u1ecbch \u0111\u00e3 \u0111\u1eb7t hay kh\u00f4ng, t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd nhanh hay ch\u1eadm. V\u1edbi c\u00e1c ti\u1ebfn tr\u00ecnh l\u1edbn ch\u1ea1y l\u00e2u c\u00f3 nhi\u1ec1u b\u01b0\u1edbc th\u00ec c\u1ea7n ghi log m\u1ed7i khi\u00a0<strong>b\u1eaft \u0111\u1ea7u ho\u1eb7c ho\u00e0n th\u00e0nh 1 b\u01b0\u1edbc\u00a0<\/strong>\u0111\u1ec3 gi\u00e1m s\u00e1t \u0111\u01b0\u1ee3c ti\u1ebfn tr\u00ecnh \u0111ang x\u1eed l\u00fd \u1edf b\u01b0\u1edbc n\u00e0o, g\u1eb7p l\u1ed7i ho\u1eb7c rollback \u1edf b\u01b0\u1edbc n\u00e0o. N\u1ebfu c\u1ea7n thi\u1ebft th\u00ec c\u00f3 th\u1ec3 ghi th\u00eam th\u00f4ng tin t\u00ecnh tr\u1ea1ng server hi\u1ec7n t\u1ea1i nh\u01b0\u00a0<strong>Ram, CPU, Disk IO,\u2026<\/strong>\u00a0\u0111\u1ec3 c\u00f3 c\u01a1 s\u1edf \u0111\u00e1nh gi\u00e1 nguy c\u01a1 cao t\u1ea3i h\u1ec7 th\u1ed1ng, c\u00f3 ph\u01b0\u01a1ng \u00e1n s\u1eafp l\u1ecbch l\u1ea1i ti\u1ebfn tr\u00ecnh h\u1ea1n ch\u1ebf vi\u1ec7c nhi\u1ec1u ti\u1ebfn tr\u00ecnh c\u00f9ng ch\u1ea1y \u0111\u1ed3ng th\u1eddi.<\/li><li>Trong c\u00e1c nghi\u1ec7p v\u1ee5 ph\u1ee9c t\u1ea1p c\u00f3 nhi\u1ec1u b\u01b0\u1edbc x\u1eed l\u00fd c\u0169ng n\u00ean ghi log\u00a0<strong>t\u1eebng b\u01b0\u1edbc\u00a0<\/strong>t\u01b0\u01a1ng t\u1ef1 ti\u1ebfn tr\u00ecnh. Hay c\u00e1c \u0111o\u1ea1n code\u00a0<strong>ti\u1ec1m \u1ea9n r\u1ee7i ro<\/strong>\u00a0v\u00ed d\u1ee5 nh\u01b0 ch\u1ee9c n\u0103ng kh\u00f4ng qu\u00e1 quan tr\u1ecdng \u0111ang ph\u1ea3i x\u1eed l\u00fd t\u1ea1m th\u1eddi do ch\u01b0a t\u00ecm \u0111\u01b0\u1ee3c ph\u01b0\u01a1ng \u00e1n t\u1ed1i \u01b0u, ho\u1eb7c th\u1eddi gian release qu\u00e1 g\u1ea5p th\u00ec n\u00ean ghi log gi\u00e1m s\u00e1t logic c\u00f3 b\u1ea5t th\u01b0\u1eddng hay kh\u00f4ng \u0111\u1ec3 x\u1eed l\u00fd t\u1ee9c th\u1eddi.<\/li><li>Log khi\u00a0<strong>giao ti\u1ebfp v\u1edbi h\u1ec7 th\u1ed1ng kh\u00e1c<\/strong>. \u1ede \u0111\u00e2y c\u00f3 2 chi\u1ec1u giao ti\u1ebfp \u0111\u00f3 l\u00e0 c\u00e1c api\/service public cho h\u1ec7 th\u1ed1ng kh\u00e1c\u00a0<strong>k\u1ebft n\u1ed1i v\u00e0o<\/strong>, ho\u1eb7c c\u00e1c \u0111o\u1ea1n g\u1ecdi sang api\/service c\u1ee7a h\u1ec7 th\u1ed1ng kh\u00e1c, ho\u1eb7c b\u1ea5t k\u1ef3 k\u1ebft n\u1ed1i n\u00e0o kh\u00e1c ph\u1ea3i tri\u1ec3n khai b\u1eb1ng vi\u1ebft code. T\u1ea5t c\u1ea3 \u0111\u1ec1u c\u1ea7n ghi log g\u1ed3m m\u1ed9t s\u1ed1\u00a0<strong>th\u00f4ng tin c\u01a1 b\u1ea3n<\/strong>\u00a0nh\u01b0:\u00a0<strong>Link Api, path\/method x\u1eed l\u00fd, b\u1ea3n tin request, b\u1ea3n tin response, th\u1eddi gian x\u1eed l\u00fd.<\/strong>\u00a0V\u00e0 t\u1ed1t h\u01a1n h\u1ebft l\u00e0 n\u00ean ghi log n\u00e0y v\u00e0o\u00a0<strong>b\u1ea3ng<\/strong>\u00a0trong\u00a0<strong>c\u01a1 s\u1edf d\u1eef li\u1ec7u<\/strong>\u00a0\u0111\u1ec3 thu\u1eadn ti\u1ec7n nh\u1ea5t khi c\u1ea7n trace log. B\u1edfi v\u00ec vi\u1ec7c t\u00edch h\u1ee3p gi\u1eefa c\u00e1c h\u1ec7 th\u1ed1ng th\u01b0\u1eddng s\u1ebd x\u1ea3y ra r\u1ea5t nhi\u1ec1u v\u1ea5n \u0111\u1ec1, n\u1ebfu kh\u00f4ng c\u00f3 log c\u1ee5 th\u1ec3 s\u1ebd kh\u00f3 x\u00e1c \u0111\u1ecbnh \u0111\u01b0\u1ee3c l\u1ed7i do b\u00ean n\u00e0o, d\u1eabn \u0111\u1ebfn t\u00ecnh tr\u1ea1ng\u00a0<strong>\u0111\u1ed5 tr\u00e1ch nhi\u1ec7m\u00a0<\/strong>cho nhau v\u00e0 kh\u00f4ng gi\u1ea3i quy\u1ebft \u0111\u01b0\u1ee3c v\u1ea5n \u0111\u1ec1.<\/li><li>Ngo\u00e0i ra m\u1ed9t s\u1ed1 h\u1ec7 th\u1ed1ng ho\u1eb7c\u00a0<strong>ch\u1ee9c n\u0103ng quan tr\u1ecdng,<\/strong>\u00a0c\u1ea7n ph\u1ea3i ghi log c\u1ee5 th\u1ec3 v\u1ec1\u00a0<strong>t\u00e1c \u0111\u1ed9ng thay \u0111\u1ed5i d\u1eef li\u1ec7u<\/strong>\u00a0trong\u00a0<strong>c\u01a1 s\u1edf d\u1eef li\u1ec7u<\/strong>. Insert\/update\/delete\/select \u0111\u1ebfn b\u1ea3n ghi n\u00e0o, d\u1eef li\u1ec7u tr\u01b0\u1edbc v\u00e0 sau khi thay \u0111\u1ed5i. \u0110\u1ec3 ki\u1ec3m so\u00e1t t\u00e1c \u0111\u1ed9ng v\u00e0o d\u1eef li\u1ec7u v\u00e0 rollback d\u1eef li\u1ec7u khi c\u1ea7n thi\u1ebft.<\/li><li>Hay tr\u01b0\u1eddng h\u1ee3p g\u1eb7p l\u1ed7i tr\u00ean server,\u00a0<strong>kh\u00f4ng t\u00e1i hi\u1ec7n<\/strong>\u00a0\u0111\u01b0\u1ee3c tr\u00ean local, c\u0169ng kh\u00f4ng debug \u0111\u01b0\u1ee3c tr\u00ean server th\u00ec ch\u1ec9 c\u00f3 b\u1ed5 sung log v\u00e0o c\u00e1c v\u1ecb tr\u00ed nghi ng\u1edd \u0111\u1ec3 t\u00ecm l\u1ed7i<\/li><\/ul>\n\n\n\n<h2><strong>Ghi log nh\u01b0 th\u1ebf n\u00e0o?<\/strong>\n\n\n\n<p>Khi ghi log c\u1ea7n ph\u1ea3i \u0111\u1ea3m b\u1ea3o \u0111\u01b0\u1ee3c m\u1ed9t s\u1ed1\u00a0<strong>nguy\u00ean t\u1eafc<\/strong>\u00a0nh\u01b0 sau:<br>\u2013\u00a0<strong><em>N\u1ebfu qu\u00e1 tr\u00ecnh ghi log x\u1ea3y ra l\u1ed7i th\u00ec \u1ee9ng d\u1ee5ng v\u1eabn ph\u1ea3i ch\u1ea1y b\u00ecnh th\u01b0\u1eddng<\/em><\/strong>. M\u1eb7c d\u00f9 ph\u1ea7n tr\u00ean m\u00ecnh \u0111\u1ec1 c\u1eadp \u0111\u1ebfn r\u1ea5t nhi\u1ec1u v\u1ea5n \u0111\u1ec1 th\u1ec3 hi\u1ec7n t\u1ea7m quan tr\u1ecdng c\u1ee7a vi\u1ec7c ghi log, nh\u01b0ng m\u1ee5c \u0111\u00edch ch\u00ednh v\u1eabn ch\u1ec9 gi\u00fap \u00edch cho ng\u01b0\u1eddi v\u1eadn h\u00e0nh h\u1ec7 th\u1ed1ng, c\u00f2n \u0111\u1ed1i v\u1edbi\u00a0<strong>end-user<\/strong>\u00a0th\u00ec\u00a0<strong>ch\u1ea3 c\u00f3 \u00fd ngh\u0129a g\u00ec<\/strong>. V\u1eady n\u00ean n\u1ebfu ghi log l\u1ed7i m\u00e0 l\u00e0m l\u1ed7i c\u1ea3 nghi\u1ec7p v\u1ee5 ch\u00ednh n\u00ean t\u1ed1t nh\u1ea5t \u0111\u1eebng ghi log.<br>\u2013\u00a0<strong><em>Th\u1eddi gian x\u1eed l\u00fd ghi log kh\u00f4ng \u0111\u01b0\u1ee3c l\u00e0m \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn th\u1eddi gian x\u1eed l\u00fd nghi\u1ec7p v\u1ee5<\/em><\/strong>. D\u00f9 ghi log ra file hay insert v\u00e0o c\u01a1 s\u1edf d\u1eef li\u1ec7u ho\u1eb7c l\u01b0u v\u00e0o b\u1ea5t k\u1ef3 \u0111\u00e2u th\u00ec c\u0169ng s\u1ebd t\u1ed1n 1 th\u1eddi gian n\u00e0o \u0111\u00f3 \u0111\u1ec3 x\u1eed l\u00fd, nh\u01b0ng d\u00f9 c\u00f3 t\u1ed1n v\u00e0i ph\u00fat hay ch\u1ec9 v\u00e0i mili gi\u00e2y th\u00ec c\u0169ng kh\u00f4ng n\u00ean \u0111\u1ec3 n\u00f3 l\u00e0m \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn t\u1ed5ng th\u1eddi gian x\u1eed l\u00fd c\u1ee7a nghi\u1ec7p v\u1ee5. V\u00ec khi g\u1eb7p ph\u1ea3i nghi\u1ec7p v\u1ee5 l\u1edbn giao d\u1ecbch li\u00ean t\u1ee5c th\u00ec c\u00e1i gi\u00e1 ph\u1ea3i tr\u1ea3 cho th\u1eddi gian ghi log nh\u00e2n l\u00ean kh\u00f4ng h\u1ec1 nh\u1ecf<br>T\u1eeb c\u00e1c nguy\u00ean t\u1eafc tr\u00ean m\u00ecnh c\u00f3 m\u1ed9t s\u1ed1\u00a0<strong>l\u1eddi khuy\u00ean<\/strong>\u00a0t\u01b0\u01a1ng \u1ee9ng khi ghi log:<br>\u2013\u00a0<strong>Lu\u00f4n catch m\u1ecdi exception<\/strong>\u00a0c\u1ee7a c\u00e1c \u0111o\u1ea1n code ghi log khi nh\u00fang v\u00e0o nghi\u1ec7p v\u1ee5 ch\u1ee9c n\u0103ng c\u1ee7a ph\u1ea7n m\u1ec1m, \u0111\u1ea3m b\u1ea3o kh\u00f4ng c\u00f3 l\u1ed7i n\u00e0o c\u00f3 th\u1ec3 throw t\u1eeb x\u1eed l\u00fd ghi log ra nghi\u1ec7p v\u1ee5 ch\u00ednh.<br>\u2013\u00a0<strong>Ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9\u00a0<\/strong>b\u1eb1ng 1 ti\u1ebfn tr\u00ecnh kh\u00e1c, \u0111\u01a1n gi\u1ea3n nh\u1ea5t l\u00e0 ch\u1ea1y n\u00f3 \u1edf 1 thread ri\u00eang.\u00a0<br>+ Tr\u00e1nh d\u00f9ng l\u1ec7nh\u00a0<code>System.out.print\u00a0<\/code>(ho\u1eb7c t\u01b0\u01a1ng t\u1ef1) \u0111\u1ec3 in log ra m\u00e0n h\u00ecnh v\u00ec in ra m\u00e0n h\u00ecnh l\u00e0 m\u1ed9t thao t\u00e1c th\u1ef1c hi\u1ec7n tu\u1ea7n t\u1ef1 r\u1ea5t ch\u1eadm<br>+ Tr\u00e1nh d\u00f9ng\u00a0<code>e.printStackTrace()<\/code>\u00a0\u0111\u1ec3 in log ra m\u00e0n h\u00ecnh, c\u0169ng v\u00ec l\u00fd do tr\u00ean<br>+ N\u00ean\u00a0<strong>s\u1eed d\u1ee5ng c\u00e1c th\u01b0 vi\u1ec7n ghi log b\u1ea5t \u0111\u1ed3ng b\u1ed9\u00a0<\/strong>nh\u01b0\u00a0<strong>log4j<\/strong>\u00a0trong\u00a0<strong>java<\/strong>. Nh\u00ecn qua th\u00ec log4j v\u1eabn ch\u1ec9 l\u00e0 1 l\u1ec7nh\u00a0<code>logger.infor(\"N\u1ed9i dung\")<\/code>nh\u01b0ng th\u1ef1c ch\u1ea5t b\u00ean trong \u0111\u00f3 l\u00e0 c\u1ea3 1 h\u1ec7 th\u1ed1ng x\u1eed l\u00fd. N\u1ed9i dung c\u1ea7n ghi log s\u1ebd \u0111\u01b0\u1ee3c s<strong>ubmit v\u00e0o 1 h\u00e0ng \u0111\u1ee3i,\u00a0<\/strong>b\u00ean c\u1ea1nh \u0111\u00f3 s\u1ebd c\u00f3 1\u00a0<strong>ti\u1ebfn tr\u00ecnh ch\u1ea1y ng\u1ea7m<\/strong>\u00a0qu\u00e9t h\u00e0ng \u0111\u1ee3i \u0111\u1ec3 l\u1ea5y n\u1ed9i dung th\u1ef1c hi\u1ec7n vi\u1ec7c ghi log, nh\u01b0 v\u1eady \u0111\u00e3 \u0111\u1ea3m b\u1ea3o \u0111\u01b0\u1ee3c vi\u1ec7c ghi log kh\u00f4ng \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn th\u1eddi gian x\u1eed l\u00fd nghi\u1ec7p v\u1ee5.<\/p>\n\n\n\n<h2><strong>Gi\u00e1m s\u00e1t log?<\/strong>\n\n\n\n<p>Gi\u1edd khi m\u00e0 ph\u1ea7n m\u1ec1m \u0111\u00e3 c\u00f3 log th\u00ec vi\u1ec7c ti\u1ebfp theo l\u00e0 s\u1eed d\u1ee5ng d\u1eef li\u1ec7u log \u0111\u00f3 cho nhi\u1ec7m v\u1ee5 gi\u00e1m s\u00e1t h\u1ec7 th\u1ed1ng. C\u00f3 r\u1ea5t nhi\u1ec1u c\u00e1ch gi\u00e1m s\u00e1t h\u1ec7 th\u1ed1ng qua log nh\u01b0<br>\u2013\u00a0<strong>M\u1edf file log b\u1eb1ng tay<\/strong>, g\u00f5 l\u1ec7nh select b\u1ea3ng log b\u1eb1ng tay, v\u00e0\u00a0<strong>\u0111\u1ecdc th\u00f4ng tin log b\u1eb1ng m\u1eaft<\/strong>\u00a0\u00a0Vi\u1ec7c n\u00e0y \u0111\u00f2i h\u1ecfi ng\u01b0\u1eddi gi\u00e1m s\u00e1t ph\u1ea3i c\u00f3 ki\u1ebfn th\u1ee9c v\u1ec1 ph\u1ea7n m\u1ec1m v\u00e0 c\u01a1 s\u1edf d\u1eef li\u1ec7u c\u0169ng nh\u01b0 n\u1eafm quy\u1ec1n truy c\u1eadp v\u00e0o c\u00e1c t\u00e0i nguy\u00ean k\u1ec3 tr\u00ean \u0111\u1ec3 xem th\u00f4ng tin log. C\u00e1ch n\u00e0y kh\u00e1 th\u00f4ng d\u1ee5ng trong m\u00f4i tr\u01b0\u1eddng development v\u00ec kh\u1ea3 n\u0103ng \u0111\u1ecdc log t\u1ee9c th\u1eddi, g\u1ecdn nh\u1eb9 nhanh ch\u00f3ng.<br>\u2013 C\u00f2n tr\u00ean m\u00f4i tr\u01b0\u1eddng\u00a0<strong>production<\/strong>, ng\u01b0\u1eddi gi\u00e1m s\u00e1t c\u00f3 th\u1ec3 kh\u00f4ng c\u00f3 ki\u1ebfn th\u1ee9c v\u1ec1 ph\u1ea7n m\u1ec1m, h\u1ecd ch\u1ec9 ng\u1ed3i tr\u1ef1c h\u1ec7 th\u1ed1ng v\u00e0 b\u00e1o cho \u0111\u1ed9i k\u1ef9 thu\u1eadt khi c\u00f3 s\u1ef1 c\u1ed1. V\u1eady n\u00ean l\u00fac n\u00e0y ph\u1ea7n m\u1ec1m c\u1ea7n c\u00f3 th\u00eam\u00a0<strong>ch\u1ee9c n\u0103ng gi\u00e1m s\u00e1t<\/strong>\u00a0h\u1ec7 th\u1ed1ng m\u1ed9t c\u00e1ch tr\u1ef1c quan b\u1eb1ng\u00a0<strong>h\u00ecnh \u1ea3nh, m\u00e0u s\u1eafc<\/strong>, d\u1eef li\u1ec7u nhi\u1ec1u th\u00f4ng tin c\u1ea7n \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb d\u01b0\u1edbi d\u1ea1ng b\u1ea3ng c\u00f3 h\u00e0ng v\u00e0 c\u1ed9t t\u01b0\u1eddng minh. \u0110\u1ec3 l\u00e0m \u0111\u01b0\u1ee3c vi\u1ec7c n\u00e0y c\u0169ng c\u00f3 nhi\u1ec1u c\u00e1ch x\u1eed l\u00fd<br>+\u00a0<strong>T\u00edch h\u1ee3p\u00a0<\/strong>c\u00e1c h\u1ec7 th\u1ed1ng\u00a0<strong>gi\u00e1m s\u00e1t<\/strong>\u00a0log c\u00f3 s\u1eb5n nh\u01b0\u00a0<strong>JMX Remote<\/strong>,\u00a0<strong>Java Profiler, Nagios, Spring Boot Actuator<\/strong>\u00a0hay m\u1ed9t b\u1ed9 ho\u00e0n ch\u1ec9nh nh\u01b0\u00a0<strong>Logstash<\/strong>\u00a0(<em>thu th\u1eadp d\u1eef li\u1ec7u log realtime<\/em>) +\u00a0<strong>ElasticSearch\/Solr<\/strong>\u00a0(<em>ph\u00e2n t\u00edch d\u1eef li\u1ec7u log, full text search nhanh ch\u00f3ng v\u00e0o t\u1ed1i \u01b0u<\/em>) +\u00a0<strong>Kibana<\/strong>\u00a0(<em>giao di\u1ec7n hi\u1ec3n th\u1ecb th\u00f4ng tin d\u1eef li\u1ec7u log 1 c\u00e1ch tr\u1ef1c quan t\u1eeb ElasticSearch<\/em>)<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img src=\"https:\/\/toidicodedao.files.wordpress.com\/2018\/02\/12.png?w=780\" alt=\"K\u00e1\u00ba\u00bft qu\u00e1\u00ba\u00a3 h\u00c3\u00acnh \u00e1\u00ba\u00a3nh cho kibana elasticsearch logstash\" data-recalc-dims=\"1\"\/><\/figure><\/div>\n\n\n\n<p>+&nbsp;<strong>T\u1ef1 x\u00e2y d\u1ef1ng&nbsp;<\/strong>m\u1ed9t tool (\u0111\u01a1n gi\u1ea3n hay ph\u1ee9c t\u1ea1p t\u00f9y nhu c\u1ea7u) \u0111\u1ec3 \u0111\u1ecdc d\u1eef li\u1ec7u file log, ph\u00e2n t\u00edch v\u00e0 hi\u1ec3n th\u1ecb c\u1ea3nh b\u00e1o l\u00ean giao di\u1ec7n&nbsp;&nbsp;C\u00e1ch n\u00e0y th\u00ec kh\u00f4ng khuy\u00ean d\u00f9ng v\u00ec r\u1ea5t nhi\u1ec1u h\u1ec7 th\u1ed1ng c\u00f3 s\u1eb5n k\u1ec3 tr\u00ean \u0111\u00e3 l\u00e0m r\u1ea5t t\u1ed1t, kh\u1ea3 n\u0103ng t\u01b0\u01a1ng th\u00edch cao m\u00e0 l\u1ea1i mi\u1ec5n ph\u00ed&nbsp;<\/p>\n\n\n\n<p>Qua b\u00e0i n\u00e0y c\u00e1c b\u1ea1n \u0111\u00e3 n\u1eafm \u0111\u01b0\u1ee3c c\u01a1 b\u1ea3n v\u1ec1&nbsp;<strong>t\u1ea7m quan tr\u1ecdng<\/strong>&nbsp;c\u1ee7a vi\u1ec7c ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m, v\u00e0 m\u1ed9t s\u1ed1&nbsp;<strong>nguy\u00ean t\u1eafc&nbsp;<\/strong>c\u1ea7n n\u1eafm \u0111\u01b0\u1ee3c khi ghi log. \u1ede b\u00e0i sau m\u00ecnh s\u1ebd tr\u00ecnh b\u00e0y c\u00e1c v\u00ed d\u1ee5 c\u1ee5 th\u1ec3 \u0111\u1ec3 t\u00edch h\u1ee3p \u0111\u01b0\u1ee3c&nbsp;<strong>module<\/strong>&nbsp;ghi log&nbsp;<strong>ti\u00eau chu\u1ea9n c\u01a1 b\u1ea3n<\/strong>&nbsp;nh\u1ea5t v\u00e0o&nbsp;<strong>ph\u1ea7n m\u1ec1m<\/strong>.<\/p>\n","excerpt":"<p>B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c \u0111\u0103ng l\u1ea1i t\u1eeb blog c\u1ee7a T\u00f9ng Huynh, \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1ef1 \u0111\u1ed3ng \u00fd c\u1ee7a t\u00e1c gi\u1ea3. Ch\u00e0o m\u1ecdi ng\u01b0\u1eddi. D\u1ea1o n\u00e0y b\u1eadn vi\u1ec7c qu\u00e1, tranh th\u1ee7 m\u00e3i m\u1edbi ng\u1ed3i vi\u1ebft b\u00e0i \u0111\u01b0\u1ee3c. H\u00f4m nay m\u00ecnh s\u1ebd chia s\u1ebb kinh nghi\u1ec7m c\u1ee7a m\u00ecnh li\u00ean quan \u0111\u1ebfn v\u1ea5n \u0111\u1ec1 ghi log trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m. Ghi log l\u00e0 g\u00ec? N\u00f3i \u0111\u1ebfn ghi log th\u00ec ch\u1eafc \u0111\u00e3 nhi\u1ec1u b\u1ea1n bi\u1ebft \u0111\u00e2y l\u00e0 m\u1ed9t c\u00f4ng vi\u1ec7c&nbsp;l\u01b0u [&hellip;]<\/p>\n","date":"2019-07-29 10:49:16","modified":"2019-07-29 10:54:20","categories":[{"id":2377,"slug":"tut-java-log","title":"TUT Java Log","description":"","parent":1093,"post_count":3}],"tags":[{"id":2378,"slug":"ghi-log","title":"ghi log","description":"","post_count":1},{"id":2380,"slug":"java-log","title":"java log","description":"","post_count":3},{"id":2379,"slug":"log-in-java","title":"log in java","description":"","post_count":1}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[{"id":32095,"name":"Hi\u1ebfu r\u00e2n ch\u01a1i","url":"https:\/\/usheath.com\/","date":"2019-07-29 21:34:58","content":"<p>Hnay l\u1ea1i vi\u1ebft blog c\u01a1 \u00e0 s\u1ebfp<\/p>\n","parent":0},{"id":32096,"name":"nguyenvanquan7826","url":"","date":"2019-07-29 22:25:06","content":"<p>\u0110\u0103ng l\u1ea1i b\u00e0i th\u00f4i :v<\/p>\n","parent":32095,"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"}}],"attachments":[{"id":6593,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/07\/Java-Logging.png","slug":"java-logging","title":"Java-Logging","description":"","caption":"","parent":6589,"mime_type":"image\/png","images":[]}],"comment_count":2,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6583,"type":"post","slug":"git-mot-so-lenh-hay-dung","url":"https:\/\/cachhoc.net\/2019\/07\/04\/git-mot-so-lenh-hay-dung\/","status":"publish","title":"Git &#8211; M\u1ed9t s\u1ed1 l\u1ec7nh hay d\u00f9ng","title_plain":"Git &#8211; M\u1ed9t s\u1ed1 l\u1ec7nh hay d\u00f9ng","content":"\n<h2>X\u00f3a branch local\n\n\n\n<p>D\u00f9ng m\u1ed9t trong 2 l\u1ec7nh sau:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>git branch -d branch_name<br>git branch -D branch_name<\/p><\/blockquote>\n\n\n\n<p>T\u00f9y ch\u1ecdn -d l\u00e0 vi\u1ebft t\u1eaft c\u1ee7a &#8211;delete, s\u1ebd x\u00f3a nh\u00e1nh, ch\u1ec9 khi b\u1ea1n \u0111\u00e3 push v\u00e0 merger n\u00f3 v\u1edbi c\u00e1c remote branch (tr\u00ean server). c\u1ee7a b\u1ea1n.<\/p>\n\n\n\n<p>T\u00f9y ch\u1ecdn -D l\u00e0 vi\u1ebft t\u1eaft c\u1ee7a &#8211;delete &#8211;force, x\u00f3a chi nh\u00e1nh d\u00f9 tr\u1ea1ng th\u00e1i push v\u00e0  merger \u0111\u00e3 l\u00e0m hay ch\u01b0a, v\u00ec v\u1eady h\u00e3y c\u1ea9n th\u1eadn khi s\u1eed d\u1ee5ng c\u00e1i n\u00e0y!<\/p>\n\n\n\n<h2>Thay th\u1ebf to\u00e0n b\u1ed9 branch2 v\u00e0o branch1\n\n\n\n<p>\u0110\u00f4i khi b\u1ea1n t\u00e1ch branch v\u00e0 ph\u00e1t tri\u1ec3n n\u00f3 sau m\u1ed9t th\u1eddi gian, s\u1ef1 kh\u00e1c nhau \u0111\u00e3 qu\u00e1 nhi\u1ec1u, b\u1ea1n mu\u1ed1n thay th\u1ebf ho\u00e0n to\u00e0n branch m\u1edbi (branch2) cho branch c\u0169 (branch1).<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><code>git checkout branch2 <\/code><br><code>git merge -s ours branch1<\/code><br><code>git checkout branch1<\/code><br><code>git merge branch2<\/code><\/p><\/blockquote>\n","excerpt":"<p>X\u00f3a branch local D\u00f9ng m\u1ed9t trong 2 l\u1ec7nh sau: git branch -d branch_namegit branch -D branch_name T\u00f9y ch\u1ecdn -d l\u00e0 vi\u1ebft t\u1eaft c\u1ee7a &#8211;delete, s\u1ebd x\u00f3a nh\u00e1nh, ch\u1ec9 khi b\u1ea1n \u0111\u00e3 push v\u00e0 merger n\u00f3 v\u1edbi c\u00e1c remote branch (tr\u00ean server). c\u1ee7a b\u1ea1n. T\u00f9y ch\u1ecdn -D l\u00e0 vi\u1ebft t\u1eaft c\u1ee7a &#8211;delete &#8211;force, x\u00f3a chi nh\u00e1nh d\u00f9 tr\u1ea1ng th\u00e1i push v\u00e0 merger \u0111\u00e3 l\u00e0m hay ch\u01b0a, v\u00ec v\u1eady h\u00e3y c\u1ea9n th\u1eadn khi s\u1eed d\u1ee5ng c\u00e1i n\u00e0y! [&hellip;]<\/p>\n","date":"2019-07-04 13:55:29","modified":"2019-07-04 14:06:40","categories":[{"id":2376,"slug":"git","title":"git","description":"","parent":1073,"post_count":1}],"tags":[{"id":2375,"slug":"cac-lenh-git","title":"c\u00e1c l\u1ec7nh git","description":"","post_count":1},{"id":2374,"slug":"git","title":"git","description":"","post_count":1}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[{"id":6584,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/07\/git.png","slug":"git","title":"git","description":"","caption":"","parent":6583,"mime_type":"image\/png","images":[]}],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]},{"id":6566,"type":"post","slug":"tim-hieu-ve-pathdata-cua-vectordrawable-trong-android","url":"https:\/\/cachhoc.net\/2019\/06\/28\/tim-hieu-ve-pathdata-cua-vectordrawable-trong-android\/","status":"publish","title":"T\u00ecm hi\u1ec3u v\u1ec1 pathData c\u1ee7a VectorDrawable trong Android","title_plain":"T\u00ecm hi\u1ec3u v\u1ec1 pathData c\u1ee7a VectorDrawable trong Android","content":"\n<p><strong>B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c d\u1ecbch v\u00e0 s\u1eeda t\u1eeb: <\/strong><a href=\"https:\/\/medium.com\/@ali.muzaffar\/understanding-vectordrawable-pathdata-commands-in-android-d56a6054610e\"><strong>medium.com c\u1ee7a t\u00e1c gi\u1ea3<\/strong> <\/a><a href=\"https:\/\/medium.com\/@ali.muzaffar\"><strong>Ali Muzaffar<\/strong><\/a> <\/p>\n\n\n\n<p>M\u1edf b\u1ea5t k\u1ef3 m\u1ed9t file xml VectorDrawable n\u00e0o b\u1ea1n s\u1ebd th\u1ea5y m\u1ed9t s\u1ed1 k\u00fd t\u1ef1 kh\u00f3 hi\u1ec3u trong thu\u1ed9c t\u00ednh <strong>pathData<\/strong>. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-attachment-id=\"6579\" data-permalink=\"https:\/\/cachhoc.net\/2019\/06\/28\/tim-hieu-ve-pathdata-cua-vectordrawable-trong-android\/android-vectordrawable\/\" data-orig-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png?fit=869%2C382&amp;ssl=1\" data-orig-size=\"869,382\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Android-VectorDrawable\" data-image-description=\"\" data-medium-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png?fit=300%2C132&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png?fit=780%2C343&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png?w=780&#038;ssl=1\" alt=\"\" class=\"wp-image-6579\" srcset=\"https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png?w=869&amp;ssl=1 869w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png?resize=300%2C132&amp;ssl=1 300w, https:\/\/i0.wp.com\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png?resize=250%2C110&amp;ssl=1 250w\" sizes=\"(max-width: 780px) 100vw, 780px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n<pre class=\"brush: xml; highlight: [14]; title: ; notranslate\" title=\"\">\n&lt;vector xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    android:width=&quot;24dp&quot;\n    android:height=&quot;24dp&quot;\n    android:tint=&quot;#FF0000&quot;\n    android:viewportWidth=&quot;24.0&quot;\n    android:viewportHeight=&quot;24.0&quot;&gt;\n    &lt;path\n        android:fillColor=&quot;#FF000000&quot;\n        android:pathData=&quot;M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z&quot; \/&gt;\n&lt;\/vector&gt;\n<\/pre>\n\n\n<p>Nh\u1eefng ng\u01b0\u1eddi l\u00e0m vi\u1ec7c th\u01b0\u1eddng xuy\u00ean v\u1edbi paths c\u00f3 th\u1ec3 hi\u1ec3u \u0111\u01b0\u1ee3c n\u00f3 v\u00e0 gi\u1ea3i th\u00edch cho b\u1ea1n bi\u1ebft n\u00f3 v\u1ebd c\u00e1i g\u00ec. C\u00f2n nh\u1eefng ng\u01b0\u1eddi kh\u00f4ng l\u00e0m nhi\u1ec1u th\u00ec n\u00f3 s\u1ebd l\u00e0 m\u1ed9t b\u00ed \u1ea9n.<\/p>\n\n\n\n<h2>VectorDrawable l\u00e0 g\u00ec\n\n\n\n<p><strong>VectorDrawable<\/strong> l\u00e0 m\u1ed9t s\u1ef1 di\u1ec5n t\u1ea3 b\u1eb1ng XML c\u1ee7a Vector. Kh\u00f4ng gi\u1ed1ng nh\u01b0 c\u00e1c \u0111\u1ecbnh d\u1ea1ng h\u00ecnh \u1ea3nh ph\u1ed5 bi\u1ebfn nh\u01b0 Bitmap, JPEG, GIF v\u00e0 PNG, Vector kh\u00f4ng l\u00e0m gi\u1ea3m ch\u1ea5t l\u01b0\u1ee3ng khi ch\u00fang \u0111\u01b0\u1ee3c thu nh\u1ecf l\u00ean ho\u1eb7c xu\u1ed1ng. \u0110i\u1ec1u n\u00e0y l\u00e0m cho vi\u1ec7c d\u00f9ng c\u00e1c h\u00ecnh \u1ea3nh v\u1edbi ch\u1ea5t l\u01b0\u1ee3ng ho\u1eb7c k\u00edch th\u01b0\u1edbc kh\u00e1c nhau l\u00e0 kh\u00f4ng c\u1ea7n thi\u1ebft, do \u0111\u00f3 gi\u00fap b\u1ea1n gi\u1ea3m dung l\u01b0\u1ee3ng file apk. Tr\u00ean th\u1ef1c t\u1ebf, VectorDrawables ch\u1ee9a c\u00e1c l\u1ec7nh Path (c\u00e1ch v\u1ebd \u0111\u01b0\u1eddng v\u00e0 cung) v\u00e0 gi\u1ed1ng nh\u01b0 c\u00e1c l\u1ec7nh Path khi l\u00e0m vi\u1ec7c v\u1edbi Canvas, v\u1ebd v\u00e0 k\u1ebft xu\u1ea5t VectorDrawables l\u00e0 qu\u00e1 tr\u00ecnh ti\u00eau t\u1ed1n th\u1eddi gian v\u00e0 b\u1ed9 nh\u1edb, \u0111\u00f3 l\u00e0 l\u00fd do t\u1ea1i sao VectorDrawable, \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng t\u1ed1t nh\u1ea5t cho \u0111\u1ed3 h\u1ecda ph\u1eb3ng \u0111\u01a1n gi\u1ea3n.<\/p>\n\n\n\n<h2>T\u1ea1i sao ph\u1ea3i hi\u1ec3u nh\u1eefng l\u1ec7nh n\u00e0y? T\u00f4i ch\u1ec9 c\u1ea7n l\u1ea5y t\u1eeb SVG?\n\n\n\n<p>N\u1ebfu b\u1ea1n mu\u1ed1n t\u1ea1o hi\u1ec7u \u1ee9ng cho VectorDrawable, nh\u01b0 m\u1ecdi tr\u00e0o l\u01b0u ng\u00e0y nay, m\u1ed9t trong nh\u1eefng y\u00eau c\u1ea7u l\u00e0 VectorDrawable m\u00e0 b\u1ea1n \u0111ang l\u00e0m hi\u1ec7u \u1ee9ng \u001d\u0111\u1ea7u v\u00e0 cu\u1ed1i ph\u1ea3i c\u00f3 l\u1ec7nh h\u1ee3p l\u00fd. Ngo\u00e0i ra, b\u1ea1n s\u1ebd bi\u1ebft l\u00e0m th\u1ebf n\u00e0o c\u00e1c l\u1ec7nh n\u00e0y l\u00e0m \u1ea3nh chuy\u1ec3n \u0111\u1ed9ng\/thay \u0111\u1ed5i \u0111\u1ec3 l\u00e0m \u1ea3nh \u0111\u1ed9ng. V\u00e0 t\u1ea5t nhi\u00ean hi\u1ec3u \u0111\u01b0\u1ee3c \u00fd ngh\u0129a c\u1ee7a c\u00e1c l\u1ec7nh \u001dPathData c\u00f3 th\u1ec3 gi\u00fap \u00edch r\u1ea5t nhi\u1ec1u nh\u01b0 vi\u1ec7c t\u1ef1 t\u1ea1o ra VectorDrawable c\u1ee7a ri\u00eang b\u1ea1n,&#8230;<\/p>\n\n\n\n<h2>Hi\u1ec3u v\u1ec1 c\u00e1c l\u1ec7nh trong pathData\n\n\n\n<p>H\u00e3y \u0111\u1ec3 t\u00f4i b\u1eaft \u0111\u1ea7u b\u1eb1ng c\u00e1ch n\u00f3i r\u1eb1ng cho d\u00f9 b\u1ea1n h\u1ecdc c\u00e1c l\u1ec7nh \u0111\u01b0\u1eddng d\u1eabn bao nhi\u00eau, tr\u1eeb khi b\u1ea1n l\u00e0 m\u1ed9t thi\u00ean t\u00e0i, s\u1ebd c\u00f3 gi\u1edbi h\u1ea1n cho nh\u1eefng g\u00ec b\u1ea1n c\u00f3 th\u1ec3 hi\u1ec3u. C\u00e1c ch\u01b0\u01a1ng tr\u00ecnh \u0111\u1ed3 h\u1ecda vector kh\u00f4ng th\u1ef1c s\u1ef1 &#8220;clean code&#8221; v\u00e0 d\u1ec5 \u0111\u1ecdc \u001dv\u1edbi con ng\u01b0\u1eddi. Sau khi c\u00e1c t\u1ec7p \u0111\u1ed3 h\u1ecda vector nh\u01b0 SVG \u0111\u01b0\u1ee3c chuy\u1ec3n qua tr\u00ecnh t\u1ea1o VectorDrawable c\u1ee7a Android Studios, ch\u00fang tr\u1edf n\u00ean g\u1ecdn g\u00e0ng v\u00e0 d\u1ec5 \u0111\u1ecdc h\u01a1n, tuy nhi\u00ean, t\u00f4i \u0111\u00e3 nh\u1eadn th\u1ea5y r\u1eb1ng r\u1ea5t nhi\u1ec1u l\u1ec7nh v\u1eabn c\u00f3 th\u1ec3 ph\u1ee9c t\u1ea1p h\u01a1n nhi\u1ec1u so v\u1edbi nh\u1eefng g\u00ec b\u1ea1n c\u1ea7n. \bTi\u1ebfp \u0111\u00f3, \u0111\u1ec3 hi\u1ec3u c\u00e1c v\u00f2ng tr\u00f2n v\u00e0 v\u00f2ng cung ch\u1ec9 \u0111\u00f2i h\u1ecfi b\u1ea1n ph\u1ea3i c\u00f3 nhi\u1ec1u tr\u00ed t\u01b0\u1edfng t\u01b0\u1ee3ng ho\u1eb7c n\u0103ng l\u1ef1c to\u00e1n h\u1ecdc \u001dt\u1ed1t.<\/p>\n\n\n\n<h3 id=\"2715\">C\u01a1 b\u1ea3n<\/h3>\n\n\n\n<p>C\u00e1c l\u1ec7nh \u0111\u01b0\u1eddng d\u1eabn c\u01a1 b\u1ea3n bao g\u1ed3m b\u1ea3ng ch\u1eef c\u00e1i theo sau l\u00e0 m\u1ed9t ho\u1eb7c nhi\u1ec1u s\u1ed1. C\u00e1c s\u1ed1 th\u01b0\u1eddng \u0111\u01b0\u1ee3c ph\u00e2n t\u00e1ch b\u1eb1ng d\u1ea5u ph\u1ea9y nh\u01b0ng \u0111\u00f4i khi c\u00f3 th\u1ec3 l\u00e0 d\u1ea5u c\u00e1ch. V\u00ed d\u1ee5:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>M100,100 L300,100 L200,300 z<br> \/\/or<br> M 100 100 L 300 100 L 200 300 z<br> \/\/or <br> M1100,100L300,100L200,300z<\/p><\/blockquote>\n\n\n\n<p>B\u1ea3ng ch\u1eef c\u00e1i c\u00f3 th\u1ec3 l\u00e0 ch\u1eef hoa ho\u1eb7c ch\u1eef th\u01b0\u1eddng. <strong>Ch\u1eef hoa c\u00f3 ngh\u0129a l\u00e0 v\u1ecb tr\u00ed tuy\u1ec7t \u0111\u1ed1i, ch\u1eef th\u01b0\u1eddng c\u00f3 ngh\u0129a l\u00e0 v\u1ecb tr\u00ed t\u01b0\u01a1ng \u0111\u1ed1i.<\/strong><\/p>\n\n\n\n<h3>C\u00e1c l\u1ec7nh<\/h3>\n\n\n\n<h4><strong>M ho\u1eb7c m (X, Y) +<\/strong><\/h4>\n\n\n\n<p>Moveto: Di chuy\u1ec3n con tr\u1ecf \u0111\u1ebfn v\u1ecb tr\u00ed, ch\u1eef hoa l\u00e0 tuy\u1ec7t \u0111\u1ed1i, ch\u1eef th\u01b0\u1eddng l\u00e0 t\u01b0\u01a1ng \u0111\u1ed1i. C\u00e1c l\u1ec7nh Moveto \u0111\u01b0\u1ee3c theo sau b\u1edfi t\u1ecda \u0111\u1ed9 X, Y. C\u00f3 th\u1ec3 c\u00f3 nhi\u1ec1u h\u01a1n m\u1ed9t b\u1ed9 t\u1ecda \u0111\u1ed9 theo l\u1ec7nh M, ch\u00fang \u0111\u01b0\u1ee3c coi l\u00e0 c\u00e1c l\u1ec7nh <strong>lineto<\/strong> ng\u1ea7m.<\/p>\n\n\n\n<h4><strong>Z ho\u1eb7c z<\/strong><\/h4>\n\n\n\n<p>closepath: V\u1ebd m\u1ed9t \u0111\u01b0\u1eddng t\u1eeb v\u1ecb tr\u00ed hi\u1ec7n t\u1ea1i c\u1ee7a con tr\u1ecf \u0111\u1ebfn v\u1ecb tr\u00ed b\u1eaft \u0111\u1ea7u c\u1ee7a \u0111\u01b0\u1eddng d\u1eabn. Kh\u00f4ng c\u00f3 b\u1ea5t k\u1ef3 tham s\u1ed1 n\u00e0o k\u00e8m theo.<\/p>\n\n\n\n<h4><strong>L ho\u1eb7c l (X, Y) +<\/strong><\/h4>\n\n\n\n<p>Lineto: V\u1ebd m\u1ed9t \u0111\u01b0\u1eddng th\u1eb3ng t\u1eeb v\u1ecb tr\u00ed hi\u1ec7n t\u1ea1i \u0111\u1ebfn v\u1ecb tr\u00ed \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh b\u1edfi X, Y. Ch\u1eef hoa c\u00f3 ngh\u0129a l\u00e0 t\u1ecda \u0111\u1ed9 tuy\u1ec7t \u0111\u1ed1i, ch\u1eef th\u01b0\u1eddng c\u00f3 ngh\u0129a l\u00e0 t\u1ecda \u0111\u1ed9 t\u01b0\u01a1ng \u0111\u1ed1i. B\u1ea1n c\u00f3 th\u1ec3 c\u00f3 nhi\u1ec1u b\u1ed9 t\u1ecda \u0111\u1ed9 theo l\u1ec7nh lineto. N\u1ebfu b\u1ea1n mu\u1ed1n ch\u1ec9 \u0111\u1ecbnh nhi\u1ec1u h\u01a1n m\u1ed9t b\u1ed9 t\u1ecda \u0111\u1ed9, \u0111i\u1ec1u \u0111\u00f3 c\u00f3 ngh\u0129a l\u00e0 b\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t \u0111a tuy\u1ebfn (Nhi\u1ec1u \u0111\u01b0\u1eddng li\u00ean ti\u1ebfp).<\/p>\n\n\n\n<h4><strong>H ho\u1eb7c h (X) +<\/strong><\/h4>\n\n\n\n<p>Horizontal Lineto: v\u1ebd m\u1ed9t \u0111\u01b0\u1eddng ngang t\u1eeb v\u1ecb tr\u00ed con tr\u1ecf hi\u1ec7n t\u1ea1i \u0111\u1ebfn v\u1ecb tr\u00ed \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh b\u1edfi X. N\u1ebfu c\u00f3 nhi\u1ec1u t\u1ecda \u0111\u1ed9 X theo l\u1ec7nh, \u0111i\u1ec1u n\u00e0y \u0111\u01b0\u1ee3c coi l\u00e0 m\u1ed9t \u0111a tuy\u1ebfn. T\u1ecda \u0111\u1ed9 Y kh\u00f4ng thay \u0111\u1ed5i. Ch\u1eef hoa H l\u00e0 t\u1ecda \u0111\u1ed9 tuy\u1ec7t \u0111\u1ed1i, ch\u1eef th\u01b0\u1eddng h l\u00e0 t\u1ecda \u0111\u1ed9 t\u01b0\u01a1ng \u0111\u1ed1i.<\/p>\n\n\n\n<h4><strong>V ho\u1eb7c v (Y) +<\/strong><\/h4>\n\n\n\n<p>Vertical Lineto: v\u1ebd m\u1ed9t \u0111\u01b0\u1eddng th\u1eb3ng \u0111\u1ee9ng t\u1eeb v\u1ecb tr\u00ed con tr\u1ecf hi\u1ec7n t\u1ea1i \u0111\u1ebfn v\u1ecb tr\u00ed \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh b\u1edfi Y. N\u1ebfu c\u00f3 nhi\u1ec1u t\u1ecda \u0111\u1ed9 Y theo l\u1ec7nh, \u0111i\u1ec1u n\u00e0y \u0111\u01b0\u1ee3c coi l\u00e0 m\u1ed9t \u0111a tuy\u1ebfn. T\u1ecda \u0111\u1ed9 X kh\u00f4ng thay \u0111\u1ed5i. Uppercase V l\u00e0 t\u1ecda \u0111\u1ed9 tuy\u1ec7t \u0111\u1ed1i, ch\u1eef th\u01b0\u1eddng v l\u00e0 t\u1ecda \u0111\u1ed9 t\u01b0\u01a1ng \u0111\u1ed1i.<\/p>\n\n\n\n<p>V\u1edbi c\u00e1c l\u1ec7nh c\u01a1 b\u1ea3n \u0111\u00e3 n\u00eau, ch\u00fang ta c\u00f9ng gi\u1ea3i th\u00edch l\u1ec7nh \u1edf v\u00ed d\u1ee5 tr\u00ean:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>M100,100 L300,100 L200,300 z<\/p><\/blockquote>\n\n\n\n<p>M100,100: Di chuy\u1ec3n con tr\u1ecf \u0111\u1ebfn t\u1ecda \u0111\u1ed9 tuy\u1ec7t \u0111\u1ed1i X = 100 Y = 100px.<br>L300,100: V\u1ebd m\u1ed9t \u0111\u01b0\u1eddng th\u1eb3ng th\u00e0nh X = 300 Y = 100 (v\u1ecb tr\u00ed b\u1eaft \u0111\u1ea7u l\u00e0 100.100).<br>L200.300: V\u1ebd m\u1ed9t \u0111\u01b0\u1eddng th\u1eb3ng th\u00e0nh X = 200 Y = 300 (v\u1ecb tr\u00ed b\u1eaft \u0111\u1ea7u l\u00e0 300.100).<br>z: \u0110\u00f3ng \u0111\u01b0\u1eddng d\u1eabn, v\u1ebd \u0111\u01b0\u1eddng th\u1eb3ng t\u1eeb v\u1ecb tr\u00ed hi\u1ec7n t\u1ea1i \u0111\u1ebfn 100.100. Khi b\u1ea1n \u0111\u00f3ng \u0111\u01b0\u1eddng d\u1eabn t\u1ee9c l\u00e0 b\u1ea1n v\u1ebd m\u1ed9t \u0111\u01b0\u1eddng t\u1eeb \u0111i\u1ec3m cu\u1ed1i c\u00f9ng v\u1ec1 \u0111i\u1ec3m \u0111\u1ea7u ti\u00ean. B\u1ea1n c\u00f3 th\u1ec3 lo\u1ea1i b\u1ecf \u0111i\u1ec1u n\u00e0y n\u1ebfu b\u1ea1n kh\u00f4ng c\u1ea7n \u0111\u00f3ng v\u00ed d\u1ee5 nh\u01b0 khi v\u1ebd d\u1ea5u c\u1ed9ng (+).<\/p>\n\n\n\n<p>N\u1ebfu ch\u00fang ta \u0111\u1eb7t n\u00f3 b\u00ean trong pathData c\u1ee7a file XML VectorDrawable \u0111\u01a1n gi\u1ea3n, ch\u00fang ta c\u00f3 th\u1ec3 th\u1ea5y k\u1ebft qu\u1ea3:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/i2.wp.com\/cdn-images-1.medium.com\/max\/800\/1*VqVwZg20dWFj1Ix2vapUAA.png?w=780&#038;ssl=1\" alt=\"\" data-recalc-dims=\"1\"\/><\/figure>\n\n\n<pre class=\"brush: xml; highlight: [8,9,10,11,12]; title: ; notranslate\" title=\"\">\n&lt;vector xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    &lt;!-- intrinsic size of the drawable --&gt;\n        android:width=&quot;400px&quot;\n        android:height=&quot;400px&quot;\n    &lt;!-- size of the virtual canvas --&gt;\n        android:viewportWidth=&quot;400.0&quot;\n        android:viewportHeight=&quot;400.0&quot;&gt;\n    &lt;path\n        android:fillColor=&quot;#0000FF&quot;\n        android:strokeColor=&quot;#FFFFFF&quot;\n        android:strokeWidth=&quot;4&quot;\n        android:pathData=&quot;M100,100 L300,100 L200,300 z&quot;\/&gt;\n&lt;\/vector&gt;\n<\/pre>\n\n\n<p>\u0110\u1ebfn \u0111\u00e2y c\u01a1 b\u1ea3n c\u00e1c b\u1ea1n \u0111\u00e3 hi\u1ec3u v\u1ec1 pathData v\u00e0 c\u00f3 th\u1ec3 t\u1ef1 t\u1ea1o c\u00e1c VectorDrawable \u0111\u01a1n gi\u1ea3n. C\u00f2n m\u1ed9t v\u00e0i v\u00ed d\u1ee5 \u1edf cu\u00f4i b\u00e0i vi\u1ebft g\u1ed1c (xem link tr\u00ean \u0111\u1ea7u) c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 tham kh\u1ea3o.<\/p>\n","excerpt":"<p>B\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c d\u1ecbch v\u00e0 s\u1eeda t\u1eeb: medium.com c\u1ee7a t\u00e1c gi\u1ea3 Ali Muzaffar M\u1edf b\u1ea5t k\u1ef3 m\u1ed9t file xml VectorDrawable n\u00e0o b\u1ea1n s\u1ebd th\u1ea5y m\u1ed9t s\u1ed1 k\u00fd t\u1ef1 kh\u00f3 hi\u1ec3u trong thu\u1ed9c t\u00ednh pathData. Nh\u1eefng ng\u01b0\u1eddi l\u00e0m vi\u1ec7c th\u01b0\u1eddng xuy\u00ean v\u1edbi paths c\u00f3 th\u1ec3 hi\u1ec3u \u0111\u01b0\u1ee3c n\u00f3 v\u00e0 gi\u1ea3i th\u00edch cho b\u1ea1n bi\u1ebft n\u00f3 v\u1ebd c\u00e1i g\u00ec. C\u00f2n nh\u1eefng ng\u01b0\u1eddi kh\u00f4ng l\u00e0m nhi\u1ec1u th\u00ec n\u00f3 s\u1ebd l\u00e0 m\u1ed9t b\u00ed \u1ea9n. VectorDrawable l\u00e0 g\u00ec VectorDrawable l\u00e0 [&hellip;]<\/p>\n","date":"2019-06-28 21:42:41","modified":"2019-06-28 21:49:35","categories":[{"id":1087,"slug":"android","title":"LT Android","description":"","parent":1073,"post_count":36}],"tags":[{"id":2373,"slug":"pathdata","title":"pathdata","description":"","post_count":1},{"id":2372,"slug":"vector-drawable-android","title":"vector drawable android","description":"","post_count":1}],"author":{"id":1,"slug":"admin","name":"nguyenvanquan7826","first_name":"","last_name":"","nickname":"nguyenvanquan7826","url":"","description":"M\u00ecnh l\u00e0 m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Android, Java, PHP, IOS. Th\u00edch vi\u1ebft l\u00e1ch t\u00e0o lao c\u0169ng nh\u01b0 code d\u1ea1o. N\u1ebfu c\u00e1c b\u1ea1n th\u1ea5y nh\u1eefng b\u00e0i vi\u1ebft tr\u00ean blog hay v\u00e0 c\u00f3 \u00edch v\u1edbi b\u1ea1n ho\u1eb7c v\u1edbi nh\u1eefng ng\u01b0\u1eddi b\u1ea1n c\u1ee7a b\u1ea1n, h\u00e3y chia s\u1ebb cho m\u1ecdi ng\u01b0\u1eddi c\u00f9ng \u0111\u1ecdc. \r\nCh\u00e2n th\u00e0nh c\u1ea3m \u01a1n c\u00e1c b\u1ea1n!"},"comments":[],"attachments":[{"id":6572,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/06\/VectorDrawable-in-android.png","slug":"vectordrawable-in-android","title":"VectorDrawable in android","description":"","caption":"","parent":6566,"mime_type":"image\/png","images":[]},{"id":6577,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Screen-Shot-2019-06-28-at-9.45.27-PM.png","slug":"screen-shot-2019-06-28-at-9-45-27-pm","title":"Screen-Shot-2019-06-28-at-9.45.27-PM","description":"","caption":"","parent":6566,"mime_type":"image\/png","images":[]},{"id":6579,"url":"https:\/\/cachhoc.net\/wp-content\/uploads\/2019\/06\/Android-VectorDrawable.png","slug":"android-vectordrawable","title":"Android-VectorDrawable","description":"","caption":"","parent":6566,"mime_type":"image\/png","images":[]}],"comment_count":0,"comment_status":"open","thumbnail":null,"custom_fields":{"s4_url2s":[""],"s4_image2s":[""],"s4_ctitle":[""],"s4_cdes":[""]},"thumbnail_size":"post-thumbnail","thumbnail_images":[]}],"query":{"ignore_sticky_posts":true}}