<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DBILITY</title>
    <link>https://hyperrookie.tistory.com/</link>
    <description>필요한 것들을 기록한다.</description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 16:18:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>DBILITY</managingEditor>
    <item>
      <title>Draw.io Diagram</title>
      <link>https://hyperrookie.tistory.com/entry/Drawio-Diagram</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://app.diagrams.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://app.diagrams.net/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773286819086&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Flowchart Maker &amp;amp; Online Diagram Software&quot; data-og-description=&quot;Flowchart Maker and Online Diagram Software draw.io is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPMN online, as a circuit d&quot; data-og-host=&quot;app.diagrams.net&quot; data-og-source-url=&quot;https://app.diagrams.net/&quot; data-og-url=&quot;https://app.diagrams.net/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://app.diagrams.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://app.diagrams.net/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Flowchart Maker &amp;amp; Online Diagram Software&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Flowchart Maker and Online Diagram Software draw.io is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPMN online, as a circuit d&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;app.diagrams.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상당히 편리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 작성하고 저장&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/830</guid>
      <comments>https://hyperrookie.tistory.com/entry/Drawio-Diagram#entry830comment</comments>
      <pubDate>Thu, 12 Mar 2026 12:40:50 +0900</pubDate>
    </item>
    <item>
      <title>mssql 2014 작업 등록 시 오류 - c0010014</title>
      <link>https://hyperrookie.tistory.com/entry/mssql-2014-%EC%9E%91%EC%97%85-%EB%93%B1%EB%A1%9D-%EC%8B%9C-%EC%98%A4%EB%A5%98-c0010014</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SQLServer에서 Job을 등록하기 위해 SQL Server Agent서비스를 실행하고 SSMS에서 작업을 등록하는데 작업단계 새로만들기를 클릭하면 다음과 같은 오류가 발생했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;c0010014&amp;nbsp;예외가&amp;nbsp;발생한&amp;nbsp;HRESULT:&amp;nbsp;0xC0010014&amp;nbsp;오류로&amp;nbsp;인해&amp;nbsp;IClassFactory에서&amp;nbsp;CLSID가&amp;nbsp;{B5F5B1CF-7950-436C-B3BD-E193B1F5E5A5}인&amp;nbsp;COM&amp;nbsp;구성&amp;nbsp;요소의&amp;nbsp;인스턴스를&amp;nbsp;만들지&amp;nbsp;못했습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 관리자권한으로 실행된 명령프롬프트에서 실행하고 등록완료 메시지가 나오면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1770964398689&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;regsvr32 &quot;C:\Program Files\Microsoft SQL Server\120\DTS\Binn\dts.dll&quot;
regsvr32 &quot;C:\Program Files (x86)\Microsoft SQL Server\120\DTS\Binn\dts.dll&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>database/mssql</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/829</guid>
      <comments>https://hyperrookie.tistory.com/entry/mssql-2014-%EC%9E%91%EC%97%85-%EB%93%B1%EB%A1%9D-%EC%8B%9C-%EC%98%A4%EB%A5%98-c0010014#entry829comment</comments>
      <pubDate>Fri, 13 Feb 2026 15:36:14 +0900</pubDate>
    </item>
    <item>
      <title>Back Button Capture</title>
      <link>https://hyperrookie.tistory.com/entry/Back-Button-Capture</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/back-button-capture/ihakaknaicnhacoohjjacdjjjkpnlehp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chromewebstore.google.com/detail/back-button-capture/ihakaknaicnhacoohjjacdjjjkpnlehp&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1770950521315&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Back Button Capture - Chrome 웹 스토어&quot; data-og-description=&quot;마우스 뒤로가기 버튼 더블클릭으로 현재 크롬 화면을 캡쳐해 지정한 폴더에 저장합니다.&quot; data-og-host=&quot;chromewebstore.google.com&quot; data-og-source-url=&quot;https://chromewebstore.google.com/detail/back-button-capture/ihakaknaicnhacoohjjacdjjjkpnlehp&quot; data-og-url=&quot;https://chromewebstore.google.com/detail/back-button-capture/ihakaknaicnhacoohjjacdjjjkpnlehp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dEJ79w/dJMb8UHLhzD/KKdmtzj8YUTR3plNskQQWk/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/back-button-capture/ihakaknaicnhacoohjjacdjjjkpnlehp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chromewebstore.google.com/detail/back-button-capture/ihakaknaicnhacoohjjacdjjjkpnlehp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dEJ79w/dJMb8UHLhzD/KKdmtzj8YUTR3plNskQQWk/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Back Button Capture - Chrome 웹 스토어&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마우스 뒤로가기 버튼 더블클릭으로 현재 크롬 화면을 캡쳐해 지정한 폴더에 저장합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chromewebstore.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스의 백버튼을 더블클릭하면 캡쳐가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장폴더는 한번만 지정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매뉴얼, 안내서 등에 필요한 웹페이지 캡쳐에 사용했다.&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/828</guid>
      <comments>https://hyperrookie.tistory.com/entry/Back-Button-Capture#entry828comment</comments>
      <pubDate>Fri, 13 Feb 2026 11:43:17 +0900</pubDate>
    </item>
    <item>
      <title>Zebra Programming Language 정리</title>
      <link>https://hyperrookie.tistory.com/entry/Zebra-Programming-Language-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.zebra.com/us/en/printers/software/zpl-pg/c-sgd-introduction.html&quot;&gt;https://docs.zebra.com/us/en/printers/software/zpl-pg/c-sgd-introduction.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1765414652398&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Introduction&quot; data-og-description=&quot;Who Should Use This Document&quot; data-og-host=&quot;docs.zebra.com&quot; data-og-source-url=&quot;https://docs.zebra.com/us/en/printers/software/zpl-pg/c-sgd-introduction.html&quot; data-og-url=&quot;https://docs.zebra.com/us/en/printers/software/zpl-pg/c-sgd-introduction.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.zebra.com/us/en/printers/software/zpl-pg/c-sgd-introduction.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.zebra.com/us/en/printers/software/zpl-pg/c-sgd-introduction.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Introduction&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Who Should Use This Document&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.zebra.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;라벨 형식 및 제어 명령어&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-sheets-baot=&quot;1&quot; data-sheets-root=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;width: 8.69565%; text-align: center;&quot;&gt;형식&lt;/td&gt;
&lt;td style=&quot;width: 61.9564%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 21.2561%; text-align: center;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^XA&lt;/td&gt;
&lt;td style=&quot;width: 8.69565%; text-align: center;&quot;&gt;^XA&lt;/td&gt;
&lt;td style=&quot;width: 61.9564%;&quot;&gt;Start Format (라벨 형식 시작). 모든 ZPL 코드는 이 명령어로 시작해야 합니다.&lt;/td&gt;
&lt;td style=&quot;width: 21.2561%;&quot;&gt;^XA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^XZ&lt;/td&gt;
&lt;td style=&quot;width: 8.69565%; text-align: center;&quot;&gt;^XZ&lt;/td&gt;
&lt;td style=&quot;width: 61.9564%;&quot;&gt;End Format (라벨 형식 끝). 모든 ZPL 코드는 이 명령어로 끝나야 합니다.&lt;/td&gt;
&lt;td style=&quot;width: 21.2561%;&quot;&gt;^XZ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^MM&lt;/td&gt;
&lt;td style=&quot;width: 8.69565%; text-align: center;&quot;&gt;^MMa&lt;/td&gt;
&lt;td style=&quot;width: 61.9564%;&quot;&gt;Print Mode (인쇄 모드 설정).&lt;/td&gt;
&lt;td style=&quot;width: 21.2561%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^MMT (Tear Off 모드)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^PW&lt;/td&gt;
&lt;td style=&quot;width: 8.69565%; text-align: center;&quot;&gt;^PWw&lt;/td&gt;
&lt;td style=&quot;width: 61.9564%;&quot;&gt;Print Width (인쇄 폭 설정). 인쇄 영역의 최대 폭을 도트(Dot) 단위로 지정합니다.&lt;/td&gt;
&lt;td style=&quot;width: 21.2561%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^PW826 (826 도트 폭)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^LL&lt;/td&gt;
&lt;td style=&quot;width: 8.69565%; text-align: center;&quot;&gt;^LLl&lt;/td&gt;
&lt;td style=&quot;width: 61.9564%;&quot;&gt;Label Length (라벨 길이 설정). 라벨의 총 길이를 도트 단위로 지정합니다.&lt;/td&gt;
&lt;td style=&quot;width: 21.2561%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^LL354 (354 도트 길이)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^LH&lt;/td&gt;
&lt;td style=&quot;width: 8.69565%; text-align: center;&quot;&gt;^LHx,y&lt;/td&gt;
&lt;td style=&quot;width: 61.9564%;&quot;&gt;Label Home (라벨 시작 위치). 라벨의 'Home' 위치(기준점)를 설정합니다. 기본값은 (0, 0)입니다.&lt;/td&gt;
&lt;td style=&quot;width: 21.2561%;&quot;&gt;^LH0,0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;필드 정의 및 데이터 명령어&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-sheets-baot=&quot;1&quot; data-sheets-root=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;width: 11.8357%; text-align: center;&quot;&gt;형식&lt;/td&gt;
&lt;td style=&quot;width: 49.7584%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 30.4348%; text-align: center;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^FO&lt;/td&gt;
&lt;td style=&quot;width: 11.8357%; text-align: center;&quot;&gt;^FOx,y&lt;/td&gt;
&lt;td style=&quot;width: 49.7584%;&quot;&gt;Field Origin (필드 시작 위치). 다음 필드의 좌상단 위치를 설정합니다. ^LH 기준 상대 좌표입니다.&lt;/td&gt;
&lt;td style=&quot;width: 30.4348%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^FO0,79 (X=0, Y=79에서 시작)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^A&lt;/td&gt;
&lt;td style=&quot;width: 11.8357%; text-align: center;&quot;&gt;^A[o]n,h,w&lt;/td&gt;
&lt;td style=&quot;width: 49.7584%;&quot;&gt;Font (폰트 설정). 폰트, 방향, 높이, 폭을 설정합니다.&lt;/td&gt;
&lt;td style=&quot;width: 30.4348%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^A0N,100,100 (폰트 A, Normal, 높이 100, 폭 100)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^FB&lt;/td&gt;
&lt;td style=&quot;width: 11.8357%; text-align: center;&quot;&gt;^FBa,l,h,t,s&lt;/td&gt;
&lt;td style=&quot;width: 49.7584%;&quot;&gt;Field Block (텍스트 블록 설정). 텍스트를 특정 영역에 강제로 맞춥니다 (줄 바꿈 및 정렬).&lt;/td&gt;
&lt;td style=&quot;width: 30.4348%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^FB826,1,0,C,0 (폭 826, 1줄, 0칸, 가운데(C) 정렬)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^FD&lt;/td&gt;
&lt;td style=&quot;width: 11.8357%; text-align: center;&quot;&gt;^FDdata&lt;/td&gt;
&lt;td style=&quot;width: 49.7584%;&quot;&gt;Field Data (필드 데이터). 필드에 인쇄할 실제 데이터를 정의합니다. ^FS로 종료합니다.&lt;/td&gt;
&lt;td style=&quot;width: 30.4348%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^FDDB1323\&amp;amp; (인쇄할 텍스트)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.85024%; text-align: center;&quot;&gt;^FS&lt;/td&gt;
&lt;td style=&quot;width: 11.8357%; text-align: center;&quot;&gt;^FS&lt;/td&gt;
&lt;td style=&quot;width: 49.7584%;&quot;&gt;Field Separator (필드 종료). 현재 필드 정의를 종료하고 다음 필드를 준비합니다.&lt;/td&gt;
&lt;td style=&quot;width: 30.4348%;&quot;&gt;^FS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;RFID 명령어 ( ZT411R )&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-sheets-baot=&quot;1&quot; data-sheets-root=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;형식&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 56.401%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 23.43%;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;^RFW&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;^RFWa,b,c,d,e&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;RFID Write (RFID 쓰기). RFID 태그의 특정 뱅크에 데이터를 인코딩합니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;^RFW,H,1,2,E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;a: 데이터 형식 (H=Hex)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;b: 메모리 뱅크 (1=EPC, 2=TID...)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;c: 시작 블록 번호&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;d: 쓰기 길이 또는 옵션 (E=Erase &amp;amp; Write)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;^RFR&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;^RFRa,b&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;RFID Read (RFID 읽기). 인코딩 후 데이터를 검증하기 위해 읽습니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;^RFR,H,6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;a: 데이터 형식 (H=Hex)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;b: 읽을 블록 수&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;^FN&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;^FNn&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;Field Number (필드 번호). 읽은 RFID 데이터를 출력할 필드에 번호를 할당합니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^FN1 (Field 1에 RFID 데이터 할당)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.09179%;&quot;&gt;^HV&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;^HVn,x,y,f,d&lt;/td&gt;
&lt;td style=&quot;width: 56.401%;&quot;&gt;Host Verification (호스트 검증). 인코딩 성공/실패 여부 등을 호스트 PC로 반환하도록 설정합니다.&lt;/td&gt;
&lt;td style=&quot;width: 23.43%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^HV1,,ENCODED_EPC:&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;바코드 및 그래픽 명령어&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-sheets-baot=&quot;1&quot; data-sheets-root=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 8.33333%;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 11.9565%;&quot;&gt;형식&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 49.6376%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 29.9517%;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.33333%; text-align: center;&quot;&gt;^BC&lt;/td&gt;
&lt;td style=&quot;width: 11.9565%; text-align: center;&quot;&gt;^BCo,h,f,y,z&lt;/td&gt;
&lt;td style=&quot;width: 49.6376%;&quot;&gt;Barcode 128 (코드 128 바코드). 가장 널리 사용되는 바코드 명령어 중 하나입니다.&lt;/td&gt;
&lt;td style=&quot;width: 29.9517%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^BCN,100,N,N,N (Normal 방향, 높이 100)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.33333%; text-align: center;&quot;&gt;^BQ&lt;/td&gt;
&lt;td style=&quot;width: 11.9565%; text-align: center;&quot;&gt;^BQo,c,i&lt;/td&gt;
&lt;td style=&quot;width: 49.6376%;&quot;&gt;QR Code (QR 코드). 2차원 바코드를 생성합니다.&lt;/td&gt;
&lt;td style=&quot;width: 29.9517%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^BQN,2,7,M (Normal 방향, 모델 2, 크기 7, 마스크 M)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.33333%; text-align: center;&quot;&gt;^GB&lt;/td&gt;
&lt;td style=&quot;width: 11.9565%; text-align: center;&quot;&gt;^GBw,h,t&lt;/td&gt;
&lt;td style=&quot;width: 49.6376%;&quot;&gt;Graphic Box (사각형 박스). 라벨에 사각형 또는 선을 그립니다.&lt;/td&gt;
&lt;td style=&quot;width: 29.9517%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;^GB500,5,3 (폭 500, 높이 5, 두께 3인 박스)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.33333%; text-align: center;&quot;&gt;^BY&lt;/td&gt;
&lt;td style=&quot;width: 11.9565%; text-align: center;&quot;&gt;&lt;span data-math=&quot;\text{\^BY}w,r,h&quot;&gt;^BYw,r,h&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.6376%;&quot;&gt;Barcode Defaults (바코드 기본 설정): 바코드의 모듈 폭(w), 광폭/협폭 비율(r), 높이(h)를 설정합니다.&lt;br /&gt;&lt;br /&gt;모듈 폭과 비율은 생략하고(기본값 사용), 높이를 0으로 설정했습니다. QR 코드는 높이 설정이 무시되므로 관례상 0이 자주 사용됩니다.&lt;/td&gt;
&lt;td style=&quot;width: 29.9517%;&quot;&gt;
&lt;div&gt;
&lt;div&gt;BY3,3.0,100&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;^BY,,0&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;기타 명령어&lt;br /&gt;&lt;b&gt;^JZ&lt;/b&gt;: &lt;b&gt;Zebra Default&lt;/b&gt; (공장 초기값). 프린터 설정을 공장 기본값으로 재설정합니다.&lt;br /&gt;&lt;b&gt;^BY&lt;/b&gt;: &lt;b&gt;Barcode Field Defaults&lt;/b&gt; (바코드 기본값). 다음 바코드의 모듈 폭, 비율, 높이 기본값을 설정합니다.&lt;br /&gt;&lt;b&gt;^FX&lt;/b&gt;: &lt;b&gt;Comment&lt;/b&gt; (주석). ZPL 코드로 인식되지 않고 프린터에 의해 무시됩니다. 코드 가독성을 높이는 데 유용합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 예시 ZPL이다&lt;/p&gt;
&lt;pre id=&quot;code_1765341052612&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;^XA
^MMT
^PW826
^LL354
^LH0,0
^RFW,H,1,2,E,^FD303631ADB800033FFFFFFFF7^FS
^RFR,H,6^FN1^FS
^HV1,,ENCODED_EPC:^FS
^BY,,0^FO40,85^BQN,2,7,M^FDMA,303631ADB800033FFFFFFFF7^FS
^FO110,85^A0N,80,80^FB826,1,0,C,0^FDN326 (HALF-LS)\&amp;amp;^FS
^FO110,210^A0N,70,70^FB826,1,0,C,0^FDFFFFFFFF7\&amp;amp;^FS
^XZ&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인에서 ZPL을 시험 할 수 있는 사이트는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://labelary.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://labelary.com/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1765341157069&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Labelary&quot; data-og-description=&quot;Use our advanced online barcode generator to create barcodes and explore different types of symbologies. Supports QR Code, Data Matrix, Code 128, Code 39, PDF417, MaxiCode, EAN, UPC and many more.&quot; data-og-host=&quot;labelary.com&quot; data-og-source-url=&quot;https://labelary.com/&quot; data-og-url=&quot;https://labelary.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://labelary.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://labelary.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Labelary&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use our advanced online barcode generator to create barcodes and explore different types of symbologies. Supports QR Code, Data Matrix, Code 128, Code 39, PDF417, MaxiCode, EAN, UPC and many more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;labelary.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zplpreview.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://zplpreview.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1765341148691&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ZPL Viewer - Free Online ZPL Editor, Preview &amp;amp; Export Tool&quot; data-og-description=&quot;A professional, free ZPL (Zebra Programming Language) viewer that allows you to upload, edit, and preview label templates in real-time. Export your labels as images or PDFs with just one click.&quot; data-og-host=&quot;zplpreview.com&quot; data-og-source-url=&quot;https://zplpreview.com/&quot; data-og-url=&quot;https://zplpreview.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JAKMR/hyZO8DTDOv/LGoQRvcirRhpY93K16OsH0/img.png?width=505&amp;amp;height=494&amp;amp;face=0_0_505_494&quot;&gt;&lt;a href=&quot;https://zplpreview.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zplpreview.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JAKMR/hyZO8DTDOv/LGoQRvcirRhpY93K16OsH0/img.png?width=505&amp;amp;height=494&amp;amp;face=0_0_505_494');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ZPL Viewer - Free Online ZPL Editor, Preview &amp;amp; Export Tool&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A professional, free ZPL (Zebra Programming Language) viewer that allows you to upload, edit, and preview label templates in real-time. Export your labels as images or PDFs with just one click.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zplpreview.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.labelzoom.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.labelzoom.net/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1765341293325&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;LabelZoom&quot; data-og-description=&quot;LabelZoom is an online barcode label conversion service and label design platform&quot; data-og-host=&quot;www.labelzoom.net&quot; data-og-source-url=&quot;https://www.labelzoom.net/&quot; data-og-url=&quot;https://www.labelzoom.net/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RTzBm/hyZOIyDty4/UKvMgkPD1aG933itauRbp0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.labelzoom.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.labelzoom.net/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RTzBm/hyZOIyDty4/UKvMgkPD1aG933itauRbp0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;LabelZoom&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LabelZoom is an online barcode label conversion service and label design platform&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.labelzoom.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인에서는 정확히 되는데 실제 프린터에서는 약간 밀리는데 왜 이러는 걸까..40dot가량 넓게 잡으면 정중앙이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 말인즉..전체 넓이 인식에 문제가 있는 듯하다. 공장 초기화 후 드라이버도 초기화하고 시험해 봐야겠다.&lt;/p&gt;</description>
      <category>C#</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/824</guid>
      <comments>https://hyperrookie.tistory.com/entry/Zebra-Programming-Language-%EC%A0%95%EB%A6%AC#entry824comment</comments>
      <pubDate>Wed, 10 Dec 2025 13:23:23 +0900</pubDate>
    </item>
    <item>
      <title>mariadb truncate table , foreign key 제약 조건 해제</title>
      <link>https://hyperrookie.tistory.com/entry/mariadb-truncate-table-foreign-key-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4-%ED%95%B4%EC%A0%9C</link>
      <description>&lt;div style=&quot;background-color: #1e1f22; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;set FOREIGN_KEY_CHECKS = 0;
truncate table [table_name];
set FOREIGN_KEY_CHECKS = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>database/mariadb</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/823</guid>
      <comments>https://hyperrookie.tistory.com/entry/mariadb-truncate-table-foreign-key-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4-%ED%95%B4%EC%A0%9C#entry823comment</comments>
      <pubDate>Mon, 3 Nov 2025 10:31:10 +0900</pubDate>
    </item>
    <item>
      <title>mssql sql로 database, user 생성 방법</title>
      <link>https://hyperrookie.tistory.com/entry/mssql-sql%EB%A1%9C-database-user-%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;pre id=&quot;code_1761542586866&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;USE MASTER
GO

CREATE DATABASE [DB명]
GO

CREATE LOGIN [LOGIN명] WITH PASSWORD='비밀번호'
GO

ALTER LOGIN [LOGIN명] Enable
GO

USE [DB명]
GO

CREATE USER [USER명] FOR LOGIN [LOGIN명] WITH DEFAULT_SCHEMA = dbo
GO

EXEC sp_addrolemember db_owner, [USER명]
GO

--GRANT ALL TO [USER명]
--GO&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억은 못하겠고 적어 두자.&lt;/p&gt;</description>
      <category>database/mssql</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/822</guid>
      <comments>https://hyperrookie.tistory.com/entry/mssql-sql%EB%A1%9C-database-user-%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95#entry822comment</comments>
      <pubDate>Mon, 27 Oct 2025 14:23:29 +0900</pubDate>
    </item>
    <item>
      <title>C# Excel Data To DataGridView Using ExcelDataReader</title>
      <link>https://hyperrookie.tistory.com/entry/C-Excel-Data-To-DataGridView-Using-ExcelDataReader</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VS2017. Nuget Manager에서 ExcelDataReader,&amp;nbsp;&amp;nbsp;ExcelDataReader.DataSet&amp;nbsp;&amp;nbsp;버전 3.8.0 을 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI는 코드보고 그냥 그리고, 코딩하고 실행해 보면 그리드에 잘 표시된다.&lt;/p&gt;
&lt;pre id=&quot;code_1759968570788&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ExcelDataReader;

namespace CSharpTest
{
    public partial class FrmExcelOpen : Form
    {
        private OpenFileDialog fileDialog;
        private DataTable dt;

        public FrmExcelOpen()
        {
            InitializeComponent();

            fileDialog = new OpenFileDialog
            {
                Multiselect = false,
                AddExtension = true,
                CheckFileExists = true,
                Filter = &quot;All Excel File(*.xls;*.xlsx)|*.xls;*.xlsx|Microsoft Excel 97-2003 Workbook (*.xls)|*.xls|Microsoft Excel Workbook (*.xlsx)|*.xlsx&quot;,
                FilterIndex = 3
            };

            dgv1.MultiSelect = false;
            dgv1.ReadOnly = true;
            dgv1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

        }

        private void btnOpenExcelFile_Click(object sender, EventArgs e)
        {
            
            if (fileDialog.ShowDialog() == DialogResult.OK) {
                using(var stream = File.Open(fileDialog.FileName,FileMode.Open, FileAccess.Read))
                {
                    if(Path.GetExtension(fileDialog.FileName).ToUpper() == &quot;.XLSX&quot; 
                        || Path.GetExtension(fileDialog.FileName).ToUpper() == &quot;.XLS&quot;)
                    {
                        using (var reader = ExcelReaderFactory.CreateReader(stream))
                        {
                            var result = reader.AsDataSet(new ExcelDataSetConfiguration() {
                                ConfigureDataTable = (_) =&amp;gt; new ExcelDataTableConfiguration
                                {
                                    EmptyColumnNamePrefix = &quot;Column&quot;,
                                    UseHeaderRow = false
                                }
                            });
                            dt = result.Tables[0];
                            dgv1.DataSource = dt;

                        }
                    }
                }
            }

        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/821</guid>
      <comments>https://hyperrookie.tistory.com/entry/C-Excel-Data-To-DataGridView-Using-ExcelDataReader#entry821comment</comments>
      <pubDate>Thu, 9 Oct 2025 09:09:57 +0900</pubDate>
    </item>
    <item>
      <title>C# 독립실행파일 생성</title>
      <link>https://hyperrookie.tistory.com/entry/C-%EB%8F%85%EB%A6%BD%EC%8B%A4%ED%96%89%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VS2017에서 Nuget Manager에서 Fody 4.2.1, Costura.Fody 3.3.3를 설치하고 재시작,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Build를 해보면 exe의 용량이 늘어나 있음&lt;/p&gt;</description>
      <category>C#</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/820</guid>
      <comments>https://hyperrookie.tistory.com/entry/C-%EB%8F%85%EB%A6%BD%EC%8B%A4%ED%96%89%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1#entry820comment</comments>
      <pubDate>Thu, 9 Oct 2025 09:05:32 +0900</pubDate>
    </item>
    <item>
      <title>pymssql을 사용한 SQL Server 접속 테스트</title>
      <link>https://hyperrookie.tistory.com/entry/pymssql%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-SQL-Server-%EC%A0%91%EC%86%8D-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;driver가 필요하니 pymssql install&lt;/p&gt;
&lt;pre id=&quot;code_1758609687723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install pymssql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db_test.py&lt;/p&gt;
&lt;pre id=&quot;code_1758609726701&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pymssql

server = &quot;localhost&quot;
user = &quot;사용자&quot;
password = &quot;비밀번호&quot;
database = &quot;대상 데이터베이스명&quot;

try:
    conn = pymssql.connect(server=server, user=user, password=password, database=database)
    cursor = conn.cursor()
    sql = &quot;&quot;&quot;
    	SELECT A, B, C, D FROM DUMMY_TABLE
    &quot;&quot;&quot;
    cursor.execute(sql)
    rows = cursor.fetchall()
    for row in rows:
        print(row)

    cursor.close()
    conn.close()

except Exception as e:
    print(f&quot;Error Connecting To SQL Server: {e}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch된 row의 type을 확인해 보니 Tuple이다. 당연한 것인가?. 불변이어야 하니.&lt;/p&gt;</description>
      <category>python</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/817</guid>
      <comments>https://hyperrookie.tistory.com/entry/pymssql%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-SQL-Server-%EC%A0%91%EC%86%8D-%ED%85%8C%EC%8A%A4%ED%8A%B8#entry817comment</comments>
      <pubDate>Wed, 24 Sep 2025 10:57:46 +0900</pubDate>
    </item>
    <item>
      <title>pip를 통한 package install 등..</title>
      <link>https://hyperrookie.tistory.com/entry/pip%EB%A5%BC-%ED%86%B5%ED%95%9C-package-install-%EB%93%B1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pip = package installer for python&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;install&lt;/p&gt;
&lt;pre id=&quot;code_1758609687723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install package_name
or
python.exe -m pip install package_name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upgrade&lt;/p&gt;
&lt;pre id=&quot;code_1758609726701&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install --upgrade package_name
or
python.exe -m pip install --upgrade package_name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uninstall&lt;/p&gt;
&lt;pre id=&quot;code_1758609922148&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip uninstall package_name&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1758611359861&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Python\Python313&amp;gt;pip list
Package Version
------- -------
pip     25.2

C:\Python\Python313&amp;gt;pip install tensorflow
Collecting tensorflow
  Using cached tensorflow-2.20.0-cp313-cp313-win_amd64.whl.metadata (4.6 kB)
Collecting absl-py&amp;gt;=1.0.0 (from tensorflow)
  Using cached absl_py-2.3.1-py3-none-any.whl.metadata (3.3 kB)
Collecting astunparse&amp;gt;=1.6.0 (from tensorflow)
  Using cached astunparse-1.6.3-py2.py3-none-any.whl.metadata (4.4 kB)
Collecting flatbuffers&amp;gt;=24.3.25 (from tensorflow)
  Using cached flatbuffers-25.2.10-py2.py3-none-any.whl.metadata (875 bytes)
Collecting gast!=0.5.0,!=0.5.1,!=0.5.2,&amp;gt;=0.2.1 (from tensorflow)
  Using cached gast-0.6.0-py3-none-any.whl.metadata (1.3 kB)
Collecting google_pasta&amp;gt;=0.1.1 (from tensorflow)
  Using cached google_pasta-0.2.0-py3-none-any.whl.metadata (814 bytes)
Collecting libclang&amp;gt;=13.0.0 (from tensorflow)
  Using cached libclang-18.1.1-py2.py3-none-win_amd64.whl.metadata (5.3 kB)
Collecting opt_einsum&amp;gt;=2.3.2 (from tensorflow)
  Using cached opt_einsum-3.4.0-py3-none-any.whl.metadata (6.3 kB)
Collecting packaging (from tensorflow)
  Using cached packaging-25.0-py3-none-any.whl.metadata (3.3 kB)
Collecting protobuf&amp;gt;=5.28.0 (from tensorflow)
  Using cached protobuf-6.32.1-cp310-abi3-win_amd64.whl.metadata (593 bytes)
Collecting requests&amp;lt;3,&amp;gt;=2.21.0 (from tensorflow)
  Using cached requests-2.32.5-py3-none-any.whl.metadata (4.9 kB)
Collecting setuptools (from tensorflow)
  Using cached setuptools-80.9.0-py3-none-any.whl.metadata (6.6 kB)
Collecting six&amp;gt;=1.12.0 (from tensorflow)
  Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting termcolor&amp;gt;=1.1.0 (from tensorflow)
  Using cached termcolor-3.1.0-py3-none-any.whl.metadata (6.4 kB)
Collecting typing_extensions&amp;gt;=3.6.6 (from tensorflow)
  Using cached typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB)
Collecting wrapt&amp;gt;=1.11.0 (from tensorflow)
  Using cached wrapt-1.17.3-cp313-cp313-win_amd64.whl.metadata (6.5 kB)
Collecting grpcio&amp;lt;2.0,&amp;gt;=1.24.3 (from tensorflow)
  Using cached grpcio-1.75.0-cp313-cp313-win_amd64.whl.metadata (3.8 kB)
Collecting tensorboard~=2.20.0 (from tensorflow)
  Using cached tensorboard-2.20.0-py3-none-any.whl.metadata (1.8 kB)
Collecting keras&amp;gt;=3.10.0 (from tensorflow)
  Using cached keras-3.11.3-py3-none-any.whl.metadata (5.9 kB)
Collecting numpy&amp;gt;=1.26.0 (from tensorflow)
  Using cached numpy-2.3.3-cp313-cp313-win_amd64.whl.metadata (60 kB)
Collecting h5py&amp;gt;=3.11.0 (from tensorflow)
  Using cached h5py-3.14.0-cp313-cp313-win_amd64.whl.metadata (2.7 kB)
Collecting ml_dtypes&amp;lt;1.0.0,&amp;gt;=0.5.1 (from tensorflow)
  Using cached ml_dtypes-0.5.3-cp313-cp313-win_amd64.whl.metadata (9.2 kB)
Collecting charset_normalizer&amp;lt;4,&amp;gt;=2 (from requests&amp;lt;3,&amp;gt;=2.21.0-&amp;gt;tensorflow)
  Using cached charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl.metadata (37 kB)
Collecting idna&amp;lt;4,&amp;gt;=2.5 (from requests&amp;lt;3,&amp;gt;=2.21.0-&amp;gt;tensorflow)
  Using cached idna-3.10-py3-none-any.whl.metadata (10 kB)
Collecting urllib3&amp;lt;3,&amp;gt;=1.21.1 (from requests&amp;lt;3,&amp;gt;=2.21.0-&amp;gt;tensorflow)
  Using cached urllib3-2.5.0-py3-none-any.whl.metadata (6.5 kB)
Collecting certifi&amp;gt;=2017.4.17 (from requests&amp;lt;3,&amp;gt;=2.21.0-&amp;gt;tensorflow)
  Using cached certifi-2025.8.3-py3-none-any.whl.metadata (2.4 kB)
Collecting markdown&amp;gt;=2.6.8 (from tensorboard~=2.20.0-&amp;gt;tensorflow)
  Using cached markdown-3.9-py3-none-any.whl.metadata (5.1 kB)
Collecting pillow (from tensorboard~=2.20.0-&amp;gt;tensorflow)
  Using cached pillow-11.3.0-cp313-cp313-win_amd64.whl.metadata (9.2 kB)
Collecting tensorboard-data-server&amp;lt;0.8.0,&amp;gt;=0.7.0 (from tensorboard~=2.20.0-&amp;gt;tensorflow)
  Using cached tensorboard_data_server-0.7.2-py3-none-any.whl.metadata (1.1 kB)
Collecting werkzeug&amp;gt;=1.0.1 (from tensorboard~=2.20.0-&amp;gt;tensorflow)
  Using cached werkzeug-3.1.3-py3-none-any.whl.metadata (3.7 kB)
Collecting wheel&amp;lt;1.0,&amp;gt;=0.23.0 (from astunparse&amp;gt;=1.6.0-&amp;gt;tensorflow)
  Using cached wheel-0.45.1-py3-none-any.whl.metadata (2.3 kB)
Collecting rich (from keras&amp;gt;=3.10.0-&amp;gt;tensorflow)
  Using cached rich-14.1.0-py3-none-any.whl.metadata (18 kB)
Collecting namex (from keras&amp;gt;=3.10.0-&amp;gt;tensorflow)
  Using cached namex-0.1.0-py3-none-any.whl.metadata (322 bytes)
Collecting optree (from keras&amp;gt;=3.10.0-&amp;gt;tensorflow)
  Using cached optree-0.17.0-cp313-cp313-win_amd64.whl.metadata (34 kB)
Collecting MarkupSafe&amp;gt;=2.1.1 (from werkzeug&amp;gt;=1.0.1-&amp;gt;tensorboard~=2.20.0-&amp;gt;tensorflow)
  Using cached MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl.metadata (4.1 kB)
Collecting markdown-it-py&amp;gt;=2.2.0 (from rich-&amp;gt;keras&amp;gt;=3.10.0-&amp;gt;tensorflow)
  Using cached markdown_it_py-4.0.0-py3-none-any.whl.metadata (7.3 kB)
Collecting pygments&amp;lt;3.0.0,&amp;gt;=2.13.0 (from rich-&amp;gt;keras&amp;gt;=3.10.0-&amp;gt;tensorflow)
  Using cached pygments-2.19.2-py3-none-any.whl.metadata (2.5 kB)
Collecting mdurl~=0.1 (from markdown-it-py&amp;gt;=2.2.0-&amp;gt;rich-&amp;gt;keras&amp;gt;=3.10.0-&amp;gt;tensorflow)
  Using cached mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB)
Using cached tensorflow-2.20.0-cp313-cp313-win_amd64.whl (332.0 MB)
Using cached grpcio-1.75.0-cp313-cp313-win_amd64.whl (4.6 MB)
Using cached ml_dtypes-0.5.3-cp313-cp313-win_amd64.whl (208 kB)
Using cached requests-2.32.5-py3-none-any.whl (64 kB)
Using cached charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl (107 kB)
Using cached idna-3.10-py3-none-any.whl (70 kB)
Using cached tensorboard-2.20.0-py3-none-any.whl (5.5 MB)
Using cached tensorboard_data_server-0.7.2-py3-none-any.whl (2.4 kB)
Using cached typing_extensions-4.15.0-py3-none-any.whl (44 kB)
Using cached urllib3-2.5.0-py3-none-any.whl (129 kB)
Using cached absl_py-2.3.1-py3-none-any.whl (135 kB)
Using cached astunparse-1.6.3-py2.py3-none-any.whl (12 kB)
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Using cached wheel-0.45.1-py3-none-any.whl (72 kB)
Using cached certifi-2025.8.3-py3-none-any.whl (161 kB)
Using cached flatbuffers-25.2.10-py2.py3-none-any.whl (30 kB)
Using cached gast-0.6.0-py3-none-any.whl (21 kB)
Using cached google_pasta-0.2.0-py3-none-any.whl (57 kB)
Using cached h5py-3.14.0-cp313-cp313-win_amd64.whl (2.9 MB)
Using cached keras-3.11.3-py3-none-any.whl (1.4 MB)
Using cached libclang-18.1.1-py2.py3-none-win_amd64.whl (26.4 MB)
Using cached markdown-3.9-py3-none-any.whl (107 kB)
Using cached numpy-2.3.3-cp313-cp313-win_amd64.whl (12.8 MB)
Using cached opt_einsum-3.4.0-py3-none-any.whl (71 kB)
Using cached protobuf-6.32.1-cp310-abi3-win_amd64.whl (435 kB)
Using cached setuptools-80.9.0-py3-none-any.whl (1.2 MB)
Using cached termcolor-3.1.0-py3-none-any.whl (7.7 kB)
Using cached werkzeug-3.1.3-py3-none-any.whl (224 kB)
Using cached MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl (15 kB)
Using cached wrapt-1.17.3-cp313-cp313-win_amd64.whl (38 kB)
Using cached namex-0.1.0-py3-none-any.whl (5.9 kB)
Using cached optree-0.17.0-cp313-cp313-win_amd64.whl (316 kB)
Using cached packaging-25.0-py3-none-any.whl (66 kB)
Using cached pillow-11.3.0-cp313-cp313-win_amd64.whl (7.0 MB)
Using cached rich-14.1.0-py3-none-any.whl (243 kB)
Using cached pygments-2.19.2-py3-none-any.whl (1.2 MB)
Using cached markdown_it_py-4.0.0-py3-none-any.whl (87 kB)
Using cached mdurl-0.1.2-py3-none-any.whl (10.0 kB)
Installing collected packages: namex, libclang, flatbuffers, wrapt, wheel, urllib3, typing_extensions, termcolor, tensorboard-data-server, six, setuptools, pygments, protobuf, pillow, packaging, opt_einsum, numpy, mdurl, MarkupSafe, markdown, idna, gast, charset_normalizer, certifi, absl-py, werkzeug, requests, optree, ml_dtypes, markdown-it-py, h5py, grpcio, google_pasta, astunparse, tensorboard, rich, keras, tensorflow
Successfully installed MarkupSafe-3.0.2 absl-py-2.3.1 astunparse-1.6.3 certifi-2025.8.3 charset_normalizer-3.4.3 flatbuffers-25.2.10 gast-0.6.0 google_pasta-0.2.0 grpcio-1.75.0 h5py-3.14.0 idna-3.10 keras-3.11.3 libclang-18.1.1 markdown-3.9 markdown-it-py-4.0.0 mdurl-0.1.2 ml_dtypes-0.5.3 namex-0.1.0 numpy-2.3.3 opt_einsum-3.4.0 optree-0.17.0 packaging-25.0 pillow-11.3.0 protobuf-6.32.1 pygments-2.19.2 requests-2.32.5 rich-14.1.0 setuptools-80.9.0 six-1.17.0 tensorboard-2.20.0 tensorboard-data-server-0.7.2 tensorflow-2.20.0 termcolor-3.1.0 typing_extensions-4.15.0 urllib3-2.5.0 werkzeug-3.1.3 wheel-0.45.1 wrapt-1.17.3

C:\Python\Python313&amp;gt;pip list
Package                 Version
----------------------- --------
absl-py                 2.3.1
astunparse              1.6.3
certifi                 2025.8.3
charset-normalizer      3.4.3
flatbuffers             25.2.10
gast                    0.6.0
google-pasta            0.2.0
grpcio                  1.75.0
h5py                    3.14.0
idna                    3.10
keras                   3.11.3
libclang                18.1.1
Markdown                3.9
markdown-it-py          4.0.0
MarkupSafe              3.0.2
mdurl                   0.1.2
ml_dtypes               0.5.3
namex                   0.1.0
numpy                   2.3.3
opt_einsum              3.4.0
optree                  0.17.0
packaging               25.0
pillow                  11.3.0
pip                     25.2
protobuf                6.32.1
Pygments                2.19.2
requests                2.32.5
rich                    14.1.0
setuptools              80.9.0
six                     1.17.0
tensorboard             2.20.0
tensorboard-data-server 0.7.2
tensorflow              2.20.0
termcolor               3.1.0
typing_extensions       4.15.0
urllib3                 2.5.0
Werkzeug                3.1.3
wheel                   0.45.1
wrapt                   1.17.3

C:\Python\Python313&amp;gt;pip install pandas
Collecting pandas
  Downloading pandas-2.3.2-cp313-cp313-win_amd64.whl.metadata (19 kB)
Requirement already satisfied: numpy&amp;gt;=1.26.0 in c:\python\python313\lib\site-packages (from pandas) (2.3.3)
Collecting python-dateutil&amp;gt;=2.8.2 (from pandas)
  Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting pytz&amp;gt;=2020.1 (from pandas)
  Downloading pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB)
Collecting tzdata&amp;gt;=2022.7 (from pandas)
  Downloading tzdata-2025.2-py2.py3-none-any.whl.metadata (1.4 kB)
Requirement already satisfied: six&amp;gt;=1.5 in c:\python\python313\lib\site-packages (from python-dateutil&amp;gt;=2.8.2-&amp;gt;pandas) (1.17.0)
Downloading pandas-2.3.2-cp313-cp313-win_amd64.whl (11.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.0/11.0 MB 5.4 MB/s  0:00:02
Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Downloading pytz-2025.2-py2.py3-none-any.whl (509 kB)
Downloading tzdata-2025.2-py2.py3-none-any.whl (347 kB)
Installing collected packages: pytz, tzdata, python-dateutil, pandas
Successfully installed pandas-2.3.2 python-dateutil-2.9.0.post0 pytz-2025.2 tzdata-2025.2

C:\Python\Python313&amp;gt;pip install matplotlib                                                                                                                                              
Collecting matplotlib
  Downloading matplotlib-3.10.6-cp313-cp313-win_amd64.whl.metadata (11 kB)
Collecting contourpy&amp;gt;=1.0.1 (from matplotlib)
  Downloading contourpy-1.3.3-cp313-cp313-win_amd64.whl.metadata (5.5 kB)
Collecting cycler&amp;gt;=0.10 (from matplotlib)
  Downloading cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)
Collecting fonttools&amp;gt;=4.22.0 (from matplotlib)
  Downloading fonttools-4.60.0-cp313-cp313-win_amd64.whl.metadata (113 kB)
Collecting kiwisolver&amp;gt;=1.3.1 (from matplotlib)
  Downloading kiwisolver-1.4.9-cp313-cp313-win_amd64.whl.metadata (6.4 kB)
Requirement already satisfied: numpy&amp;gt;=1.23 in c:\python\python313\lib\site-packages (from matplotlib) (2.3.3)
Requirement already satisfied: packaging&amp;gt;=20.0 in c:\python\python313\lib\site-packages (from matplotlib) (25.0)
Requirement already satisfied: pillow&amp;gt;=8 in c:\python\python313\lib\site-packages (from matplotlib) (11.3.0)
Collecting pyparsing&amp;gt;=2.3.1 (from matplotlib)
  Downloading pyparsing-3.2.5-py3-none-any.whl.metadata (5.0 kB)
Requirement already satisfied: python-dateutil&amp;gt;=2.7 in c:\python\python313\lib\site-packages (from matplotlib) (2.9.0.post0)
Requirement already satisfied: six&amp;gt;=1.5 in c:\python\python313\lib\site-packages (from python-dateutil&amp;gt;=2.7-&amp;gt;matplotlib) (1.17.0)
Downloading matplotlib-3.10.6-cp313-cp313-win_amd64.whl (8.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1/8.1 MB 5.2 MB/s  0:00:01
Downloading contourpy-1.3.3-cp313-cp313-win_amd64.whl (226 kB)
Downloading cycler-0.12.1-py3-none-any.whl (8.3 kB)
Downloading fonttools-4.60.0-cp313-cp313-win_amd64.whl (2.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3/2.3 MB 2.9 MB/s  0:00:00
Downloading kiwisolver-1.4.9-cp313-cp313-win_amd64.whl (73 kB)
Downloading pyparsing-3.2.5-py3-none-any.whl (113 kB)
Installing collected packages: pyparsing, kiwisolver, fonttools, cycler, contourpy, matplotlib
Successfully installed contourpy-1.3.3 cycler-0.12.1 fonttools-4.60.0 kiwisolver-1.4.9 matplotlib-3.10.6 pyparsing-3.2.5&lt;/code&gt;&lt;/pre&gt;</description>
      <category>python</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/816</guid>
      <comments>https://hyperrookie.tistory.com/entry/pip%EB%A5%BC-%ED%86%B5%ED%95%9C-package-install-%EB%93%B1#entry816comment</comments>
      <pubDate>Tue, 23 Sep 2025 15:43:15 +0900</pubDate>
    </item>
    <item>
      <title>글쓰기 연습장</title>
      <link>https://hyperrookie.tistory.com/entry/%EA%B8%80%EC%93%B0%EA%B8%B0-%EC%97%B0%EC%8A%B5%EC%9E%A5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ddooddoo.com/ko/games/transcription/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ddooddoo.com/ko/games/transcription/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1753416075637&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;커스텀 글씨 쓰기 연습장 만들기 - 모두의 테스트, 뚜뚜닷컴&quot; data-og-description=&quot;가장 빠르게 나만의 글씨 쓰기 연습장 만들기!&quot; data-og-host=&quot;ddooddoo.com&quot; data-og-source-url=&quot;https://ddooddoo.com/ko/games/transcription/&quot; data-og-url=&quot;https://ddooddoo.com/ko/games/transcription/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhkT9r/hyZm68alLb/K5ymsBYWUfvucvOdYBBSvk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/nGcKN/hyZm8ETLOy/zjr46k4VbwwzyBeQlY8iqk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot;&gt;&lt;a href=&quot;https://ddooddoo.com/ko/games/transcription/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ddooddoo.com/ko/games/transcription/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhkT9r/hyZm68alLb/K5ymsBYWUfvucvOdYBBSvk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/nGcKN/hyZm8ETLOy/zjr46k4VbwwzyBeQlY8iqk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;커스텀 글씨 쓰기 연습장 만들기 - 모두의 테스트, 뚜뚜닷컴&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;가장 빠르게 나만의 글씨 쓰기 연습장 만들기!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ddooddoo.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/815</guid>
      <comments>https://hyperrookie.tistory.com/entry/%EA%B8%80%EC%93%B0%EA%B8%B0-%EC%97%B0%EC%8A%B5%EC%9E%A5#entry815comment</comments>
      <pubDate>Fri, 25 Jul 2025 13:01:38 +0900</pubDate>
    </item>
    <item>
      <title>비디오, 오디오, PDF 및 파일 변환을 위한 온라인 도구</title>
      <link>https://hyperrookie.tistory.com/entry/%EB%B9%84%EB%94%94%EC%98%A4-%EC%98%A4%EB%94%94%EC%98%A4-PDF-%EB%B0%8F-%ED%8C%8C%EC%9D%BC-%EB%B3%80%ED%99%98%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EB%8F%84%EA%B5%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://123apps.com/ko/#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://123apps.com/ko/#google_vignette&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748481776823&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;123apps의 웹 앱 - 편집, 변환, 생성&quot; data-og-description=&quot;Subscription Paused 메시지가 성공적으로 전송되었습니다. 해당 메시지를 분석하여 제공하신 이메일에 연결된 구독을 일시 중지했습니다. 더 이상 비용이 청구되지 않습니다. 계정 페이지에서 언제&quot; data-og-host=&quot;123apps.com&quot; data-og-source-url=&quot;https://123apps.com/ko/#google_vignette&quot; data-og-url=&quot;https://123apps.com/ko/#google_vignette&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://123apps.com/ko/#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://123apps.com/ko/#google_vignette&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;123apps의 웹 앱 - 편집, 변환, 생성&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Subscription Paused 메시지가 성공적으로 전송되었습니다. 해당 메시지를 분석하여 제공하신 이메일에 연결된 구독을 일시 중지했습니다. 더 이상 비용이 청구되지 않습니다. 계정 페이지에서 언제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;123apps.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/812</guid>
      <comments>https://hyperrookie.tistory.com/entry/%EB%B9%84%EB%94%94%EC%98%A4-%EC%98%A4%EB%94%94%EC%98%A4-PDF-%EB%B0%8F-%ED%8C%8C%EC%9D%BC-%EB%B3%80%ED%99%98%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EB%8F%84%EA%B5%AC#entry812comment</comments>
      <pubDate>Thu, 29 May 2025 10:23:05 +0900</pubDate>
    </item>
    <item>
      <title>텍스트 음성 변환기</title>
      <link>https://hyperrookie.tistory.com/entry/%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%9D%8C%EC%84%B1-%EB%B3%80%ED%99%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://speechgen.io/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://speechgen.io/ko/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748481742854&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;실감 나는 텍스트 음성 변환기 및 AI 음성 생성기&quot; data-og-description=&quot;온라인에서 현실적인 음성 더빙을 생성하세요! 텍스트를 입력하여 음성을 생성하고 오디오 mp3/wav를 다운로드하세요. AI 기반 음성으로 텍스트를 읽어보세요.&quot; data-og-host=&quot;speechgen.io&quot; data-og-source-url=&quot;https://speechgen.io/ko/&quot; data-og-url=&quot;https://speechgen.io/ko/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dFRqg0/hyY1eqzqce/WvjlXms4jWucV6KnS1YNh1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bpckBL/hyYYHHW6td/L2hM4yK58P7YppHOCeCXeK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://speechgen.io/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://speechgen.io/ko/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dFRqg0/hyY1eqzqce/WvjlXms4jWucV6KnS1YNh1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bpckBL/hyYYHHW6td/L2hM4yK58P7YppHOCeCXeK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;실감 나는 텍스트 음성 변환기 및 AI 음성 생성기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;온라인에서 현실적인 음성 더빙을 생성하세요! 텍스트를 입력하여 음성을 생성하고 오디오 mp3/wav를 다운로드하세요. AI 기반 음성으로 텍스트를 읽어보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;speechgen.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/811</guid>
      <comments>https://hyperrookie.tistory.com/entry/%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%9D%8C%EC%84%B1-%EB%B3%80%ED%99%98%EA%B8%B0#entry811comment</comments>
      <pubDate>Thu, 29 May 2025 10:22:35 +0900</pubDate>
    </item>
    <item>
      <title>Erd,Schema 생성 AI</title>
      <link>https://hyperrookie.tistory.com/entry/ErdSchema-%EC%83%9D%EC%84%B1-AI</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://workik.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://workik.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1747789060658&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;AI for Backend &amp;amp; Frontend Code Development | Predefine Context and Generate Code with AI&quot; data-og-description=&quot;Join our community to see how developers are using Workik AI everyday.&quot; data-og-host=&quot;workik.com&quot; data-og-source-url=&quot;https://workik.com/&quot; data-og-url=&quot;https://workik.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gRIgs/hyYWYajWbx/yFFEqwDIpKeKYwaePR0h7k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bRnAiM/hyYTnCP6uk/XcEAhrhs9kik3XUDofxqXk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://workik.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://workik.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gRIgs/hyYWYajWbx/yFFEqwDIpKeKYwaePR0h7k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bRnAiM/hyYTnCP6uk/XcEAhrhs9kik3XUDofxqXk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AI for Backend &amp;amp; Frontend Code Development | Predefine Context and Generate Code with AI&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Join our community to see how developers are using Workik AI everyday.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;workik.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/810</guid>
      <comments>https://hyperrookie.tistory.com/entry/ErdSchema-%EC%83%9D%EC%84%B1-AI#entry810comment</comments>
      <pubDate>Wed, 21 May 2025 10:03:38 +0900</pubDate>
    </item>
    <item>
      <title>best mock api Mockoon, data bucket search sample</title>
      <link>https://hyperrookie.tistory.com/entry/best-mock-api-Mockoon</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mockoon.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mockoon.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1746002258390&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Mockoon - Create mock APIs in seconds with Mockoon&quot; data-og-description=&quot;Mockoon is the easiest and quickest way to run mock REST API servers. No remote deployment, no account required, free, open source and cross-platform.&quot; data-og-host=&quot;mockoon.com&quot; data-og-source-url=&quot;https://mockoon.com/&quot; data-og-url=&quot;https://mockoon.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dvQM5V/hyYMRoSqbP/s7CNNmz4c3AtKKKuphJzdk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/PrDVM/hyYIeTmfdI/W2VuA7UqJAYc0YWY4u3z6K/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/uD7Gy/hyYMVEN3hW/snclzahLKtzl1gm5zgj2i0/img.png?width=1200&amp;amp;height=783&amp;amp;face=0_0_1200_783&quot;&gt;&lt;a href=&quot;https://mockoon.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mockoon.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dvQM5V/hyYMRoSqbP/s7CNNmz4c3AtKKKuphJzdk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/PrDVM/hyYIeTmfdI/W2VuA7UqJAYc0YWY4u3z6K/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/uD7Gy/hyYMVEN3hW/snclzahLKtzl1gm5zgj2i0/img.png?width=1200&amp;amp;height=783&amp;amp;face=0_0_1200_783');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mockoon - Create mock APIs in seconds with Mockoon&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Mockoon is the easiest and quickest way to run mock REST API servers. No remote deployment, no account required, free, open source and cross-platform.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mockoon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data bucket을 만들고, GET방식 url param으로 조회해서 json 반환하는 예다. AI님의 샘플이 안되서 공식사이트 templating/mockoon-helpers를 참고해서 테스트 했다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Data Tab에서 items라는 이름으로 data buket을 추가한다.&lt;br /&gt;
&lt;pre id=&quot;code_1747968392984&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[
  { &quot;id&quot;: &quot;1&quot;, &quot;name&quot;: &quot;Item A&quot;, &quot;value&quot;: 100 },
  { &quot;id&quot;: &quot;2&quot;, &quot;name&quot;: &quot;Item B&quot;, &quot;value&quot;: 200 },
  { &quot;id&quot;: &quot;3&quot;, &quot;name&quot;: &quot;Item C&quot;, &quot;value&quot;: 300 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Route Tab에서 HTTP route를 추가한다&lt;br /&gt;GET방식의 /items/:id로 param을 포함한 path를 입력한다&lt;/li&gt;
&lt;li&gt;하단에 Status &amp;amp; Body Tab에서 inline, File, Data 중 Inline이 기본 값으로 여기에 다음과 같이 template helper를 입력한다&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1747968570168&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{#each (dataRaw 'items')}}
  {{#if (eq this.id (urlParam 'id'))}}
      {{{stringify this}}}
  {{/if}}  
{{/each}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료AP검색에서 {{json this}}라고 json helper가 있다는데 찾기 귀찮아 못찾는 건지 영어가 달린건지 공식사이트 현재버전에 없다. 대신 stringify가 있다. 잘된다...몇 시간을 날린 것인가..&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/808</guid>
      <comments>https://hyperrookie.tistory.com/entry/best-mock-api-Mockoon#entry808comment</comments>
      <pubDate>Wed, 30 Apr 2025 17:38:04 +0900</pubDate>
    </item>
    <item>
      <title>logger 설정하기</title>
      <link>https://hyperrookie.tistory.com/entry/httpsgithubcomorhanobutlogger</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/orhanobut/logger&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/orhanobut/logger&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744778804589&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - orhanobut/logger: ✔️ Simple, pretty and powerful logger for android&quot; data-og-description=&quot;✔️ Simple, pretty and powerful logger for android. Contribute to orhanobut/logger development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/orhanobut/logger&quot; data-og-url=&quot;https://github.com/orhanobut/logger&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/orhanobut/logger&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/orhanobut/logger&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - orhanobut/logger: ✔️ Simple, pretty and powerful logger for android&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;✔️ Simple, pretty and powerful logger for android. Contribute to orhanobut/logger development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onCreate에 다음과 같이&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;Logger.addLogAdapter(new AndroidLogAdapter() {
    //Release시 제거되도록
    @Override
    public boolean isLoggable(int priority, @android.support.annotation.Nullable @Nullable String tag) {
        return BuildConfig.DEBUG;
        //return Settings.DEBUG;
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;Logger.t(TAG).d(&quot;Exception: &quot;, e.getMessage());&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드의 기본 로그 자동완성 ( logd+TAB ) 을 변경하면 편하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0VU75/btsNnSt7Td3/nJcKLzeYKKiQik3KfKickk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0VU75/btsNnSt7Td3/nJcKLzeYKKiQik3KfKickk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0VU75/btsNnSt7Td3/nJcKLzeYKKiQik3KfKickk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0VU75%2FbtsNnSt7Td3%2FnJcKLzeYKKiQik3KfKickk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;559&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/805</guid>
      <comments>https://hyperrookie.tistory.com/entry/httpsgithubcomorhanobutlogger#entry805comment</comments>
      <pubDate>Wed, 16 Apr 2025 14:00:32 +0900</pubDate>
    </item>
    <item>
      <title>avd의 화면 크기, 해상도 변경하기</title>
      <link>https://hyperrookie.tistory.com/entry/avd%EC%9D%98-%ED%99%94%EB%A9%B4-%ED%81%AC%EA%B8%B0-%ED%95%B4%EC%83%81%EB%8F%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;전문가야 다들 알겠지만, 물리 디바이스(5.5inch)와 동일하게 만들고 싶어 해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2025-04-14 170243.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lkyxd/btsNkvr7qdx/FsjEMjUYI26xPCsXITpybk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lkyxd/btsNkvr7qdx/FsjEMjUYI26xPCsXITpybk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lkyxd/btsNkvr7qdx/FsjEMjUYI26xPCsXITpybk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flkyxd%2FbtsNkvr7qdx%2FFsjEMjUYI26xPCsXITpybk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;354&quot; data-filename=&quot;화면 캡처 2025-04-14 170243.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. avd가 실행된 상태에서 sdk아래에 platform-tools로 이동 후&amp;nbsp; window manager 확인&lt;/p&gt;
&lt;pre id=&quot;code_1744617521329&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS C:\Dev64\tools\AndroidSDK\platform-tools&amp;gt; .\adb.exe shell wm
Window manager (window) commands:
  help
      Print this help text.
  size [reset|WxH|WdpxHdp] [-d DISPLAY_ID]
    Return or override display size.
    width and height in pixels unless suffixed with 'dp'.
  density [reset|DENSITY] [-d DISPLAY_ID]
    Return or override display density.
  folded-area [reset|LEFT,TOP,RIGHT,BOTTOM]
    Return or override folded area.
  overscan [reset|LEFT,TOP,RIGHT,BOTTOM] [-d DISPLAY ID]
    Set overscan area for display.
  scaling [off|auto] [-d DISPLAY_ID]
    Set display scaling mode.
  dismiss-keyguard
    Dismiss the keyguard, prompting user for auth if&amp;nbsp;necessary.
  set-user-rotation [free|lock] [-d DISPLAY_ID] [rotation]
    Set user rotation mode and user rotation.
  set-fix-to-user-rotation [-d DISPLAY_ID] [enabled|disabled]
    Enable or disable rotating display for app requested orientation.
  tracing (start | stop)
    Start or stop window tracing.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1744617672212&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS C:\Dev64\tools\AndroidSDK\platform-tools&amp;gt; .\adb.exe shell wm size
Physical size: 720x1280
PS C:\Dev64\tools\AndroidSDK\platform-tools&amp;gt; .\adb.exe shell wm size 720x1440
PS C:\Dev64\tools\AndroidSDK\platform-tools&amp;gt; .\adb.exe shell wm size         
Physical size: 720x1280
Override size: 720x1440


PS C:\Dev64\tools\AndroidSDK\platform-tools&amp;gt; .\adb.exe shell wm density
Physical density: 320
PS C:\Dev64\tools\AndroidSDK\platform-tools&amp;gt; .\adb.exe shell wm density 280
PS C:\Dev64\tools\AndroidSDK\platform-tools&amp;gt; .\adb.exe shell wm density    
Physical density: 320
Override density: 280&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. C:\Users\~\.android\avd\AVD_NAME.avd 안의 config.ini에서 수정 가능함, AVD의 속성을 보면 Physical 값이 변경되어 보임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dA1b7g/btsNkjMnKHS/NoCBhPPWaWlBJu020UKGhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dA1b7g/btsNkjMnKHS/NoCBhPPWaWlBJu020UKGhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dA1b7g/btsNkjMnKHS/NoCBhPPWaWlBJu020UKGhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdA1b7g%2FbtsNkjMnKHS%2FNoCBhPPWaWlBJu020UKGhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;230&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/803</guid>
      <comments>https://hyperrookie.tistory.com/entry/avd%EC%9D%98-%ED%99%94%EB%A9%B4-%ED%81%AC%EA%B8%B0-%ED%95%B4%EC%83%81%EB%8F%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0#entry803comment</comments>
      <pubDate>Mon, 14 Apr 2025 17:05:40 +0900</pubDate>
    </item>
    <item>
      <title>Gradle user home 설정을 override 하지말고 환경변수에 설정하면 된다</title>
      <link>https://hyperrookie.tistory.com/entry/Gradle-user-home-%EC%84%A4%EC%A0%95%EC%9D%84-override-%ED%95%98%EC%A7%80%EB%A7%90%EA%B3%A0-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98%EC%97%90-%EC%84%A4%EC%A0%95%ED%95%98%EB%A9%B4-%EB%90%9C%EB%8B%A4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdys7e/btsMJrCVJnC/x3mHbYEVxi8k54iOn4ymK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdys7e/btsMJrCVJnC/x3mHbYEVxi8k54iOn4ymK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdys7e/btsMJrCVJnC/x3mHbYEVxi8k54iOn4ymK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdys7e%2FbtsMJrCVJnC%2Fx3mHbYEVxi8k54iOn4ymK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;177&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스튜디오를 재시작하고 Settings를 보면 다음과 같이 자동으로 선택되어 있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PsohK/btsMJqKLlmA/XTQKHXkmWFK7EmqY6VFzj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PsohK/btsMJqKLlmA/XTQKHXkmWFK7EmqY6VFzj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PsohK/btsMJqKLlmA/XTQKHXkmWFK7EmqY6VFzj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPsohK%2FbtsMJqKLlmA%2FXTQKHXkmWFK7EmqY6VFzj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;217&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/801</guid>
      <comments>https://hyperrookie.tistory.com/entry/Gradle-user-home-%EC%84%A4%EC%A0%95%EC%9D%84-override-%ED%95%98%EC%A7%80%EB%A7%90%EA%B3%A0-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98%EC%97%90-%EC%84%A4%EC%A0%95%ED%95%98%EB%A9%B4-%EB%90%9C%EB%8B%A4#entry801comment</comments>
      <pubDate>Thu, 13 Mar 2025 11:26:54 +0900</pubDate>
    </item>
    <item>
      <title>android theme에 대한 요약</title>
      <link>https://hyperrookie.tistory.com/entry/android-theme%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9A%94%EC%95%BD</link>
      <description>&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://www.logicui.com/colorgenerator&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.logicui.com/colorgenerator&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1746777494516&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Material 3 Color Generator | LogicUI&quot; data-og-description=&quot;Color generator for Material Design 3&quot; data-og-host=&quot;www.logicui.com&quot; data-og-source-url=&quot;https://www.logicui.com/colorgenerator&quot; data-og-url=&quot;https://www.logicui.com/colorgenerator&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0xEZc/hyYTm9ChPW/r85JNm6Km0UFVKUwu05WV0/img.jpg?width=1024&amp;amp;height=500&amp;amp;face=0_0_1024_500&quot;&gt;&lt;a href=&quot;https://www.logicui.com/colorgenerator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.logicui.com/colorgenerator&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0xEZc/hyYTm9ChPW/r85JNm6Km0UFVKUwu05WV0/img.jpg?width=1024&amp;amp;height=500&amp;amp;face=0_0_1024_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Material 3 Color Generator | LogicUI&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Color generator for Material Design 3&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.logicui.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://material-foundation.github.io/material-theme-builder/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://material-foundation.github.io/material-theme-builder/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1746777508853&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Material Theme Builder&quot; data-og-description=&quot;&quot; data-og-host=&quot;material-foundation.github.io&quot; data-og-source-url=&quot;https://material-foundation.github.io/material-theme-builder/&quot; data-og-url=&quot;https://material-foundation.github.io/material-theme-builder/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://material-foundation.github.io/material-theme-builder/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://material-foundation.github.io/material-theme-builder/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Material Theme Builder&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;material-foundation.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;스타일은 하나의 View의 외관을 정의하는 속성&lt;/u&gt;들의 모음이다.&amp;nbsp;&lt;br /&gt;스타일은 폰트 컬러, 폰트 사이즈, 백그라운드 컬러 등과 같은 속성을 정의할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;테마는 앱 전체 , 액티비티, 뷰 계층에 적용되는 속성&lt;/u&gt;들의 모음이다- 하나의 뷰에서만 적용되는 것이 아니다.&lt;br /&gt;테마를 적용하게 되면 , 앱의 모든 view, 액티비티가 테마에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;제공하는 속성들을 사용한다.&lt;br /&gt;테마는&lt;span&gt;&amp;nbsp;&lt;/span&gt;status bar나 window background 같은 view가 아닌 엘리먼트까지 스타일을 적용할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;스타일과 테마는 모두 style 리소스 파일에 정의한다.&amp;nbsp;&lt;br /&gt;스타일 리소스는 파일 안의 &amp;lt;resource&amp;gt;태그의 자식 태그인 &amp;lt;style&amp;gt;태그의 name속성으로 참조하기 때문에&amp;nbsp;&lt;br /&gt;res/values폴더 하위에 어디에서 만들든 상관없다. 보통 파일 이름은 styles.xml을 사용한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4e5256; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Android 앱은 UI별로 서로 다른 색상을 사용합니다. 테마 시스템은 앱에 의미 있는 방식으로 색상을 사용하고 전체적으로 일관성 있게 적용할 수 있도록 텍스트, 아이콘 등에서 사용하는 색상과 관련된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #1a73e8;&quot; href=&quot;https://material.io/design/material-theming/implementing-your-theme.html#color&quot;&gt;12개의 속성에 이름을 지정&lt;/a&gt;하여 색상을 그룹화합니다. 테마에 이러한 항목을 모두 지정할 필요는 없습니다. 기본 색상과 보조 색상을 선택하고, 이러한 색상 위에 표시되는 텍스트 및 아이콘의 색상을 선택하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;af6c8e0d93135130_856.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MwjaO/btsMIwqtNdZ/tDelqBKOS45hKY3bg8qcf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MwjaO/btsMIwqtNdZ/tDelqBKOS45hKY3bg8qcf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MwjaO/btsMIwqtNdZ/tDelqBKOS45hKY3bg8qcf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwjaO%2FbtsMIwqtNdZ%2FtDelqBKOS45hKY3bg8qcf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;856&quot; height=&quot;774&quot; data-filename=&quot;af6c8e0d93135130_856.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;?attr/colorPrimary&amp;nbsp; 앱의 기본 브랜드 색상입니다.&lt;br /&gt;?attr/colorSecondary&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱의 보조 브랜드 색상으로, 일반적으로 기본 브랜딩&lt;span&gt;&amp;nbsp;&lt;/span&gt;색상을 밝게 보완합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 위 두개의 색은 브랜드를 나타내는 색상이다.&lt;br /&gt;?attr/colorOn[Primary,&amp;nbsp;Secondary,&amp;nbsp;Surface&amp;nbsp;etc]&amp;nbsp;명명된&amp;nbsp;색상과&amp;nbsp;대비되는&amp;nbsp;색상입니다.&lt;br /&gt;?attr/color[Primary,&amp;nbsp;Secondary]Variant&amp;nbsp;주어진&amp;nbsp;색상의&amp;nbsp;대체&amp;nbsp;음영.&lt;br /&gt;?attr/colorSurface&amp;nbsp; 카드, 시트 및 메뉴와 같은 구성 요소의 표면에 대한 색상입니다.&lt;br /&gt;?android:attr/colorBackground&amp;nbsp;화면의&amp;nbsp;배경입니다.&lt;br /&gt;?attr/colorPrimarySurface는&amp;nbsp;밝은&amp;nbsp;테마의&amp;nbsp;colorPrimary와&amp;nbsp;어두운&amp;nbsp;테마의&amp;nbsp;colorSurface&amp;nbsp;간에&amp;nbsp;전환합니다.&lt;br /&gt;?attr/colorError&amp;nbsp;오류를&amp;nbsp;표시하기&amp;nbsp;위한&amp;nbsp;색상입니다.&lt;br /&gt;?attr/colorControlNormal 정상 상태에서 아이콘/컨트롤에 적용되는 색상입니다.&lt;br /&gt;?attr/colorControlActivated&amp;nbsp;활성화된&amp;nbsp;상태(예:&amp;nbsp;체크됨)에서&amp;nbsp;아이콘/컨트롤에&amp;nbsp;적용되는&amp;nbsp;색상입니다.&lt;br /&gt;?attr/colorControlHighlight 하이라이트 제어에 적용되는 색상(예: 잔물결, List 선택될 때.).&lt;br /&gt;?android:attr/textColorPrimary&amp;nbsp;&lt;b&gt;가장 눈에 띄는 텍스트 색상&lt;br /&gt;&lt;/b&gt;?android:attr/textColorSecondary&amp;nbsp;&lt;b&gt;보조 텍스트 색상&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4e5256; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'대비' 색상은 다양한 표면에 그려지는 텍스트와 아이콘에 사용됩니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #4e5256; text-align: start;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;#&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;이름&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;테마 속성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;기본&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorPrimary&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;기본 변형&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorPrimaryVariant&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;보조&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorSecondary&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;보조 변형&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorSecondaryVariant&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;배경&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorBackground&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;6&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;표면&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorSurface&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;7&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;오류&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorError&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;8&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;기본(대비)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorOnPrimary&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;9&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;보조(대비)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorOnSecondary&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;10&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;배경(대비)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorOnBackground&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;11&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;표면(대비)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorOnSurface&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;12&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;오류(대비)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;colorOnError&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;e18489e185b3e1848fe185b3e18485e185b5e186abe18489e185a3e186ba-2017-09-22-e1848be185a9e1848ce185a5e186ab-12-41-02.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhdENf/btsMItAx879/1Op7tRJJvkVzGIDvXzQr00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhdENf/btsMItAx879/1Op7tRJJvkVzGIDvXzQr00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhdENf/btsMItAx879/1Op7tRJJvkVzGIDvXzQr00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhdENf%2FbtsMItAx879%2F1Op7tRJJvkVzGIDvXzQr00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;247&quot; height=&quot;442&quot; data-filename=&quot;e18489e185b3e1848fe185b3e18485e185b5e186abe18489e185a3e186ba-2017-09-22-e1848be185a9e1848ce185a5e186ab-12-41-02.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;colorPrimaryDark&lt;/td&gt;
&lt;td style=&quot;width: 71.5116%;&quot;&gt;대표 색상 중 조금 더 어두운 색, 상태바가 없으시 적용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;colorAccent&lt;/td&gt;
&lt;td style=&quot;width: 71.5116%;&quot;&gt;강조색으로 주 색상과 대비되는 색상을 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;colorControlNormal&lt;/td&gt;
&lt;td style=&quot;width: 71.5116%;&quot;&gt;컨트롤 ( EditText, Checkbox, radio, progressBar 등), 비활성/선택상태가 아닌 일반상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;colorControlHighlight&lt;/td&gt;
&lt;td style=&quot;width: 71.5116%;&quot;&gt;위젯을 터치하거나 액션이 일어날&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;res/values/colors.xml&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;resources&amp;gt;
    &amp;lt;color name=&quot;black&quot;&amp;gt;#FF000000&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;white&quot;&amp;gt;#FFFFFFFF&amp;lt;/color&amp;gt;
    &amp;lt;!-- 회색 --&amp;gt;
    &amp;lt;color name=&quot;gray&quot;&amp;gt;#808080&amp;lt;/color&amp;gt;
    &amp;lt;!-- 연한 회색 --&amp;gt;
    &amp;lt;color name=&quot;lightGray&quot;&amp;gt;#D3D3D3&amp;lt;/color&amp;gt;
    &amp;lt;!-- 진한 회색 --&amp;gt;
    &amp;lt;color name=&quot;darkGray&quot;&amp;gt;#A9A9A9&amp;lt;/color&amp;gt;

    &amp;lt;!-- 빨강 --&amp;gt;
    &amp;lt;color name=&quot;red&quot;&amp;gt;#FF0000&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;lightRed&quot;&amp;gt;#FF6666&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;darkRed&quot;&amp;gt;#990000&amp;lt;/color&amp;gt;

    &amp;lt;!-- 주황 --&amp;gt;
    &amp;lt;color name=&quot;orange&quot;&amp;gt;#FFA500&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;lightOrange&quot;&amp;gt;#FFC266&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;darkOrange&quot;&amp;gt;#CC8400&amp;lt;/color&amp;gt;

    &amp;lt;!-- 노랑 --&amp;gt;
    &amp;lt;color name=&quot;yellow&quot;&amp;gt;#FFFF00&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;lightYellow&quot;&amp;gt;#FFFF66&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;darkYellow&quot;&amp;gt;#CCCC00&amp;lt;/color&amp;gt;

    &amp;lt;!-- 초록 --&amp;gt;
    &amp;lt;color name=&quot;green&quot;&amp;gt;#00CC00&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;green80&quot;&amp;gt;#008000&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;lightGreen&quot;&amp;gt;#66CC66&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;darkGreen&quot;&amp;gt;#005900&amp;lt;/color&amp;gt;

    &amp;lt;color name=&quot;green01&quot;&amp;gt;#1B5E20&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;greenDark01&quot;&amp;gt;#003300&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;greenLight01&quot;&amp;gt;#A5D6A7&amp;lt;/color&amp;gt;

    &amp;lt;color name=&quot;jade&quot;&amp;gt;#009999&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;sky&quot;&amp;gt;#0099FF&amp;lt;/color&amp;gt;

    &amp;lt;!-- 파랑 --&amp;gt;
    &amp;lt;color name=&quot;blue&quot;&amp;gt;#0000FF&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;lightBlue&quot;&amp;gt;#6666FF&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;darkBlue&quot;&amp;gt;#000099&amp;lt;/color&amp;gt;

    &amp;lt;color name=&quot;blue01&quot;&amp;gt;#0288D1&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;blueDark01&quot;&amp;gt;#005B9F&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;blueLight01&quot;&amp;gt;#81D4FA&amp;lt;/color&amp;gt;

    &amp;lt;!-- 남색 --&amp;gt;
    &amp;lt;color name=&quot;indigo&quot;&amp;gt;#4B0082&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;lightIndigo&quot;&amp;gt;#9673B9&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;darkIndigo&quot;&amp;gt;#2E004F&amp;lt;/color&amp;gt;

    &amp;lt;!-- 보라 --&amp;gt;
    &amp;lt;color name=&quot;violet&quot;&amp;gt;#8B00FF&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;lightViolet&quot;&amp;gt;#B266FF&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;darkViolet&quot;&amp;gt;#5A009D&amp;lt;/color&amp;gt;

    &amp;lt;!-- 기본 --&amp;gt;
    &amp;lt;color name=&quot;purple_200&quot;&amp;gt;#FFBB86FC&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;purple_500&quot;&amp;gt;#FF6200EE&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;purple_700&quot;&amp;gt;#FF3700B3&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;teal_200&quot;&amp;gt;#FF03DAC5&amp;lt;/color&amp;gt;
    &amp;lt;color name=&quot;teal_700&quot;&amp;gt;#FF018786&amp;lt;/color&amp;gt;

&amp;lt;/resources&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;res/values/themes.xml&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;resources xmlns:tools=&quot;http://schemas.android.com/tools&quot;&amp;gt;
    &amp;lt;!-- Base application theme. --&amp;gt;
    &amp;lt;style name=&quot;Base.Theme.Test202503110945&quot; parent=&quot;Theme.MaterialComponents.DayNight.DarkActionBar&quot;&amp;gt;
        &amp;lt;!-- Primary brand color. --&amp;gt;
        &amp;lt;item name=&quot;colorPrimary&quot;&amp;gt;@color/green01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorPrimaryVariant&quot;&amp;gt;@color/greenDark01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorOnPrimary&quot;&amp;gt;@color/white&amp;lt;/item&amp;gt;
        &amp;lt;!-- Secondary brand color. --&amp;gt;
        &amp;lt;item name=&quot;colorSecondary&quot;&amp;gt;@color/blue01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorSecondaryVariant&quot;&amp;gt;@color/blueDark01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorOnSecondary&quot;&amp;gt;@color/black&amp;lt;/item&amp;gt;
        &amp;lt;!-- Status bar color. --&amp;gt;
        &amp;lt;item name=&quot;android:statusBarColor&quot;&amp;gt;?attr/colorPrimaryVariant&amp;lt;/item&amp;gt;
        &amp;lt;!-- Customize your theme here. --&amp;gt;
        &amp;lt;item name=&quot;colorAccent&quot;&amp;gt;@color/lightRed&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorControlNormal&quot;&amp;gt;@color/indigo&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorControlHighlight&quot;&amp;gt;@color/lightIndigo&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorControlActivated&quot;&amp;gt;@color/darkIndigo&amp;lt;/item&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;style name=&quot;Theme.Test202503110945&quot; parent=&quot;Base.Theme.Test202503110945&quot; /&amp;gt;

&amp;lt;/resources&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;res/values-night/themes.xml&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;resources xmlns:tools=&quot;http://schemas.android.com/tools&quot;&amp;gt;
    &amp;lt;!-- Base application theme. --&amp;gt;
    &amp;lt;style name=&quot;Base.Theme.Test202503110945&quot; parent=&quot;Theme.MaterialComponents.DayNight.DarkActionBar&quot;&amp;gt;
        &amp;lt;!-- Primary brand color. --&amp;gt;
        &amp;lt;item name=&quot;colorPrimary&quot;&amp;gt;@color/greenLight01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorPrimaryVariant&quot;&amp;gt;@color/green01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorOnPrimary&quot;&amp;gt;@color/black&amp;lt;/item&amp;gt;
        &amp;lt;!-- Secondary brand color. --&amp;gt;
        &amp;lt;item name=&quot;colorSecondary&quot;&amp;gt;@color/blueLight01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorSecondaryVariant&quot;&amp;gt;@color/blueLight01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorOnSecondary&quot;&amp;gt;@color/black&amp;lt;/item&amp;gt;
        &amp;lt;!-- Status bar color. --&amp;gt;
        &amp;lt;item name=&quot;android:statusBarColor&quot;&amp;gt;?attr/colorPrimaryVariant&amp;lt;/item&amp;gt;
        &amp;lt;!-- Customize your theme here. --&amp;gt;
        &amp;lt;item name=&quot;colorAccent&quot;&amp;gt;@color/lightRed&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorControlNormal&quot;&amp;gt;@color/blueLight01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorControlHighlight&quot;&amp;gt;@color/blueLight01&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorControlActivated&quot;&amp;gt;@color/blueLight01&amp;lt;/item&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;style name=&quot;Theme.Test202503110945&quot; parent=&quot;Base.Theme.Test202503110945&quot; /&amp;gt;
&amp;lt;/resources&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;res/layout/activity_theme_apply.xml&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:id=&quot;@+id/main&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:layout_margin=&quot;@dimen/layout_margin&quot;
    android:orientation=&quot;vertical&quot;
    tools:context=&quot;.ThemeApplyActivity&quot;&amp;gt;

    &amp;lt;TextView
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;@dimen/height_48dp&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:gravity=&quot;center_vertical&quot;
        android:text=&quot;@string/primary_color&quot;
        android:textAllCaps=&quot;true&quot;
        android:textSize=&quot;@dimen/text_size_12sp&quot; /&amp;gt;

    &amp;lt;Button
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;@dimen/height_48dp&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:text=&quot;@string/button&quot; /&amp;gt;

    &amp;lt;TextView
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;48dp&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:layout_marginTop=&quot;8dp&quot;
        android:gravity=&quot;center_vertical&quot;
        android:text=&quot;@string/secondary_color&quot;
        android:textAllCaps=&quot;true&quot;
        android:textSize=&quot;12sp&quot; /&amp;gt;

    &amp;lt;com.google.android.material.floatingactionbutton.FloatingActionButton
        android:src=&quot;@android:drawable/ic_dialog_email&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:contentDescription=&quot;@string/email_icon&quot; /&amp;gt;

    &amp;lt;Switch
        android:id=&quot;@+id/switch1&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:text=&quot;Switch&quot; /&amp;gt;

    &amp;lt;EditText
        android:id=&quot;@+id/editTextText&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:ems=&quot;10&quot;
        android:inputType=&quot;text&quot;
        android:text=&quot;Name&quot; /&amp;gt;

    &amp;lt;CheckBox
        android:id=&quot;@+id/checkBox&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:text=&quot;CheckBox&quot; /&amp;gt;

    &amp;lt;RadioButton
        android:id=&quot;@+id/radioButton&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:text=&quot;RadioButton&quot; /&amp;gt;

    &amp;lt;ToggleButton
        android:id=&quot;@+id/toggleButton&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot;
        android:text=&quot;ToggleButton&quot; /&amp;gt;

    &amp;lt;ProgressBar
        android:id=&quot;@+id/progressBar&quot;
        style=&quot;?android:attr/progressBarStyleHorizontal&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:max=&quot;100&quot;
        android:progress=&quot;50&quot; /&amp;gt;

    &amp;lt;SeekBar
        android:id=&quot;@+id/seekBar&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot; /&amp;gt;

    &amp;lt;Spinner
        android:id=&quot;@+id/spinner&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_gravity=&quot;center_horizontal&quot; /&amp;gt;

    &amp;lt;com.google.android.material.tabs.TabLayout
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;&amp;gt;

        &amp;lt;com.google.android.material.tabs.TabItem
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:text=&quot;Monday&quot; /&amp;gt;

        &amp;lt;com.google.android.material.tabs.TabItem
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:text=&quot;Tuesday&quot; /&amp;gt;

        &amp;lt;com.google.android.material.tabs.TabItem
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:text=&quot;Wednesday&quot; /&amp;gt;
    &amp;lt;/com.google.android.material.tabs.TabLayout&amp;gt;

&amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 52.5563%; height: 384px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u5lms/btsMIDpT4sf/u9JKdSfLIhBJOcLuFcjep0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u5lms/btsMIDpT4sf/u9JKdSfLIhBJOcLuFcjep0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u5lms/btsMIDpT4sf/u9JKdSfLIhBJOcLuFcjep0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu5lms%2FbtsMIDpT4sf%2Fu9JKdSfLIhBJOcLuFcjep0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2280&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 56.8558%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSdntb/btsMHqE5TRD/tmVmsbuI5IbcgNdczUITA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSdntb/btsMHqE5TRD/tmVmsbuI5IbcgNdczUITA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSdntb/btsMHqE5TRD/tmVmsbuI5IbcgNdczUITA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSdntb%2FbtsMHqE5TRD%2FtmVmsbuI5IbcgNdczUITA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2280&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/800</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-theme%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9A%94%EC%95%BD#entry800comment</comments>
      <pubDate>Wed, 12 Mar 2025 12:29:56 +0900</pubDate>
    </item>
    <item>
      <title>compileSdk, targetSdk,targetApi</title>
      <link>https://hyperrookie.tistory.com/entry/compileSdk-targetSdktargetApi</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;compileSdk는 애플리케이션이 컴파일될 때 사용할 SDK 버전을 지정합니다. 이 값은 개발자가 사용하는 API의 기능과 클래스에 영향을 미칩니다. 예를 들어, compileSdk를 최신 버전으로 설정하면 최신 API 기능을 사용할 수 있지만, 실제로 앱이 실행되는 기기에서 지원되는 API는 다를 수 있습니다.&lt;br /&gt;&lt;br /&gt;targetSdk는&amp;nbsp;애플리케이션이&amp;nbsp;테스트되고&amp;nbsp;최적화된&amp;nbsp;SDK&amp;nbsp;버전을&amp;nbsp;지정합니다.&amp;nbsp;이&amp;nbsp;값은&amp;nbsp;앱이&amp;nbsp;특정&amp;nbsp;Android&amp;nbsp;버전에서&amp;nbsp;어떻게&amp;nbsp;동작할지를&amp;nbsp;결정합니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;targetSdk가&amp;nbsp;최신&amp;nbsp;버전으로&amp;nbsp;설정되어&amp;nbsp;있으면,&amp;nbsp;해당&amp;nbsp;버전의&amp;nbsp;새로운&amp;nbsp;기능을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;이전&amp;nbsp;버전의&amp;nbsp;동작&amp;nbsp;방식과&amp;nbsp;호환성을&amp;nbsp;유지하기&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;조치를&amp;nbsp;취할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;만약&amp;nbsp;targetSdk가&amp;nbsp;낮은&amp;nbsp;버전으로&amp;nbsp;설정되어&amp;nbsp;있다면,&amp;nbsp;새로운&amp;nbsp;Android&amp;nbsp;버전에서&amp;nbsp;앱이&amp;nbsp;동작할&amp;nbsp;때&amp;nbsp;이전&amp;nbsp;버전의&amp;nbsp;동작&amp;nbsp;방식을&amp;nbsp;따르게&amp;nbsp;됩니다.&lt;br /&gt;&lt;br /&gt;@targetApi는 특정 코드 블록이 특정 API 레벨에서만 실행될 것임을 나타내는 주석입니다. 이는 주로 코드에서 조건부로 API를 사용할 때 사용됩니다. 예를 들어, 특정 API가 API 레벨 21에서 도입되었다면, 해당 API를 사용하는 코드 블록에 @TargetApi(21) 주석을 추가하여 이 코드가 API 레벨 21 이상에서만 실행된다는 것을 명시할 수 있습니다. 이는 코드의 가독성을 높이고, 컴파일러가 경고를 발생시키지 않도록 도와줍니다.&lt;br /&gt;이렇게&amp;nbsp;compileSdk,&amp;nbsp;targetSdk,&amp;nbsp;targetApi는&amp;nbsp;각각의&amp;nbsp;역할이&amp;nbsp;있으며,&amp;nbsp;안드로이드&amp;nbsp;애플리케이션의&amp;nbsp;호환성과&amp;nbsp;기능성을&amp;nbsp;관리하는&amp;nbsp;데&amp;nbsp;중요한&amp;nbsp;요소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AndroidManifest.xml의 tools:targetApi는 &amp;nbsp;특정&amp;nbsp;API&amp;nbsp;레벨에서의&amp;nbsp;동작을&amp;nbsp;명시적으로&amp;nbsp;지정하는&amp;nbsp;데&amp;nbsp;사용됩니다.&amp;nbsp;이&amp;nbsp;속성은&amp;nbsp;주로&amp;nbsp;Lint&amp;nbsp;도구와&amp;nbsp;관련이&amp;nbsp;있으며,&amp;nbsp;코드에서&amp;nbsp;특정&amp;nbsp;API를&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;경고를&amp;nbsp;제어하는&amp;nbsp;데&amp;nbsp;도움을&amp;nbsp;줍니다.&lt;br /&gt;&lt;br /&gt;주요&amp;nbsp;기능:&lt;br /&gt;Lint&amp;nbsp;경고&amp;nbsp;제어:&amp;nbsp;tools:targetApi를&amp;nbsp;사용하면&amp;nbsp;특정&amp;nbsp;API&amp;nbsp;레벨에서&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;메서드나&amp;nbsp;속성을&amp;nbsp;명시할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;Lint&amp;nbsp;도구가&amp;nbsp;해당&amp;nbsp;API를&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;경고를&amp;nbsp;무시하도록&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;코드&amp;nbsp;문서화:&amp;nbsp;이&amp;nbsp;속성을&amp;nbsp;사용하면&amp;nbsp;코드에서&amp;nbsp;어떤&amp;nbsp;API&amp;nbsp;레벨을&amp;nbsp;대상으로&amp;nbsp;하고&amp;nbsp;있는지를&amp;nbsp;명확히&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있어,&amp;nbsp;다른&amp;nbsp;개발자들이&amp;nbsp;코드를&amp;nbsp;이해하는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;됩니다.&lt;br /&gt;&lt;br /&gt;조건부&amp;nbsp;코드&amp;nbsp;실행:&amp;nbsp;tools:targetApi는&amp;nbsp;주로&amp;nbsp;XML에서&amp;nbsp;사용되며,&amp;nbsp;특정&amp;nbsp;API&amp;nbsp;레벨에&amp;nbsp;따라&amp;nbsp;다른&amp;nbsp;동작을&amp;nbsp;정의할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;특정&amp;nbsp;API&amp;nbsp;레벨에서만&amp;nbsp;적용되는&amp;nbsp;속성을&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/798</guid>
      <comments>https://hyperrookie.tistory.com/entry/compileSdk-targetSdktargetApi#entry798comment</comments>
      <pubDate>Tue, 11 Mar 2025 10:19:30 +0900</pubDate>
    </item>
    <item>
      <title>https://jsonplaceholder.typicode.com/</title>
      <link>https://hyperrookie.tistory.com/entry/httpsjsonplaceholdertypicodecom</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741595322323&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JSONPlaceholder - Free Fake REST API&quot; data-og-description=&quot;{JSON} Placeholder Free fake and reliable API for testing and prototyping. Powered by JSON Server + LowDB. Serving ~3 billion requests each month.&quot; data-og-host=&quot;jsonplaceholder.typicode.com&quot; data-og-source-url=&quot;https://jsonplaceholder.typicode.com/&quot; data-og-url=&quot;https://jsonplaceholder.typicode.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jsonplaceholder.typicode.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JSONPlaceholder - Free Fake REST API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;{JSON} Placeholder Free fake and reliable API for testing and prototyping. Powered by JSON Server + LowDB. Serving ~3 billion requests each month.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jsonplaceholder.typicode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/797</guid>
      <comments>https://hyperrookie.tistory.com/entry/httpsjsonplaceholdertypicodecom#entry797comment</comments>
      <pubDate>Mon, 10 Mar 2025 17:28:56 +0900</pubDate>
    </item>
    <item>
      <title>android glide image load</title>
      <link>https://hyperrookie.tistory.com/entry/android-glide-image-load</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;libs.versions.toml&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;[versions]
glide = &quot;4.16.0&quot;
glidecompiler = &quot;4.16.0&quot;

[libraries]
glide = { group = &quot;com.github.bumptech.glide&quot;, name = &quot;glide&quot;, version.ref = &quot;glide&quot; }
glidecompiler = { group = &quot;com.github.bumptech.glide&quot;, name = &quot;compiler&quot;, version.ref = &quot;glidecompiler&quot; }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;dependencies {

    implementation libs.glide        
    annotationProcessor libs.glidecompiler    
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GlideModule.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import com.bumptech.glide.module.AppGlideModule;

@com.bumptech.glide.annotation.GlideModule
public class GlideModule extends AppGlideModule {
    public GlideModule() {
        super();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activity.java&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Glide.with(this).load(uri).diskCacheStrategy(DiskCacheStrategy.ALL).
      timeout(10000).into(popupLayoutBinding.imageView);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/796</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-glide-image-load#entry796comment</comments>
      <pubDate>Mon, 6 Jan 2025 10:26:45 +0900</pubDate>
    </item>
    <item>
      <title>https://dummyapi.online/</title>
      <link>https://hyperrookie.tistory.com/entry/httpsdummyapionline</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dummyapi.online/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dummyapi.online/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>reference</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/795</guid>
      <comments>https://hyperrookie.tistory.com/entry/httpsdummyapionline#entry795comment</comments>
      <pubDate>Wed, 18 Dec 2024 10:40:27 +0900</pubDate>
    </item>
    <item>
      <title>java 난수 생성</title>
      <link>https://hyperrookie.tistory.com/entry/java-%EB%82%9C%EC%88%98-%EC%83%9D%EC%84%B1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Math클래스의 random() 메소드와 Random클래스를 통해 난수를 생성한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Math.random()&lt;br /&gt;0~1사이(1제외)의 난수를 생성하고 반환하며, 반환값은 double이다.&lt;br /&gt;확률계산이나 간단한 난수생성에 적합하다&lt;br /&gt;스레드 안정성을 보장한다&lt;/li&gt;
&lt;li&gt;Random Class&lt;br /&gt;nextInt(), nextDouble(), nextBoolean() 등의 메소드를 통해 다양한 타입을 생성할 수 있으며, 더 많은 유연성을 제공한다&lt;br /&gt;기본적으로 스레드에 안전하지 않다 필요한 경우 ThreadLocalRandom을 사용해야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/793</guid>
      <comments>https://hyperrookie.tistory.com/entry/java-%EB%82%9C%EC%88%98-%EC%83%9D%EC%84%B1#entry793comment</comments>
      <pubDate>Tue, 10 Dec 2024 13:39:54 +0900</pubDate>
    </item>
    <item>
      <title>android Missing required view with ID</title>
      <link>https://hyperrookie.tistory.com/entry/android-Missing-required-view-with-ID</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;TabLayout TabItem에 id값을 줘서 문제가 되었다..&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/791</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-Missing-required-view-with-ID#entry791comment</comments>
      <pubDate>Thu, 21 Nov 2024 14:41:38 +0900</pubDate>
    </item>
    <item>
      <title>android ViewPager2</title>
      <link>https://hyperrookie.tistory.com/entry/android-ViewPager2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ViewPager2는 여러 페이지를 수평으로 스와이프하여 보여주는 콤포넌트로 RecyclerView를 기반으로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지는 Fragment나 TabLayout으로 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FragmentStateAdapter를 상속받은 Adapter를 구현해서 스와프로 보여줄 맴버 Fragment를 할당하고,ViewPager2에 adapter를 연결만 해주면 된다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;public class ViewPager2Adapter extends FragmentStateAdapter {

    private ArrayList&amp;lt;Fragment&amp;gt; fragments;

    public ViewPager2Adapter(@NonNull FragmentActivity fragmentActivity, ArrayList list) {
        super(fragmentActivity);
        this.fragments = list;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragments.get(position);
    }

    @Override
    public int getItemCount() {
        return fragments.size();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private ViewPager2Adapter viewPager2Adapter = null;

ArrayList&amp;lt;Fragment&amp;gt; fragments = new ArrayList&amp;lt;&amp;gt;();
fragments.add(ThirdFragment.newInstance(&quot;hong&quot;,&quot;gildong&quot;));
fragments.add(FourthFragment.newInstance(&quot;hong&quot;,&quot;gildong&quot;));

viewPager2Adapter = new ViewPager2Adapter(this, fragments);

binding.viewPager2.setAdapter(viewPager2Adapter);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/790</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-ViewPager2#entry790comment</comments>
      <pubDate>Tue, 19 Nov 2024 18:26:52 +0900</pubDate>
    </item>
    <item>
      <title>android WindowInsets Insets</title>
      <link>https://hyperrookie.tistory.com/entry/android-insets</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;View Inset은 UI 요소가 화면의 가장자리와 겹치는 부분을 조정하는 데 사용되는 개념.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 시스템 UI(예: 상태 표시줄, 내비게이션 바)와 앱 콘텐츠 간의 겹침을 관리하기 위해 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WindowInsets은 안드로이드에서 제공하는 클래스이며, 뷰의 네 모서리에서의 여백을 정의다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 클래스는 상태 표시줄, 내비게이션 바, 키보드 등 다양한 시스템 UI 요소에 대한 정보를 포함한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;ViewCompat.setOnApplyWindowInsetsListener(binding.getRoot(), (v, insets) -&amp;gt; {
    Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
    v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
    return insets;
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 WindowInset이 적용될때 Activity의 최상위 View에 System Bar ( Status/Navigation bar 등 ) inset으로 padding을 적용하여 겹치지 않게 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EdgeToEdge로 전체화면을 설정하게 되면 SystemBar 아래(뒤)까지 View화면이 표시되게 되는데 이때 SystemBar이벤트와 View이벤트 발생이 겹치게 될 수 있으니 SystemBar가 차지하는 영역만큼 View에 Padding을 넣는다고 이해하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/views/layout/immersive?hl=ko#java&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/develop/ui/views/layout/immersive?hl=ko#java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731980562781&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;몰입형 모드를 위한 시스템 표시줄 숨기기 &amp;nbsp;|&amp;nbsp; Views &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. 몰입형 모드를 위한 시스템 표시줄 숨기기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 상태 표시&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/develop/ui/views/layout/immersive?hl=ko#java&quot; data-og-url=&quot;https://developer.android.com/develop/ui/views/layout/immersive?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bUecoZ/hyXzToDUV3/vJmLKDhlI8LPKkmwmPchP0/img.png?width=698&amp;amp;height=346&amp;amp;face=0_0_698_346,https://scrap.kakaocdn.net/dn/6Fhku/hyXzN9LR7q/jyKauGdQDkhLOSUq3z5Za0/img.png?width=578&amp;amp;height=352&amp;amp;face=0_0_578_352&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/views/layout/immersive?hl=ko#java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/develop/ui/views/layout/immersive?hl=ko#java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bUecoZ/hyXzToDUV3/vJmLKDhlI8LPKkmwmPchP0/img.png?width=698&amp;amp;height=346&amp;amp;face=0_0_698_346,https://scrap.kakaocdn.net/dn/6Fhku/hyXzN9LR7q/jyKauGdQDkhLOSUq3z5Za0/img.png?width=578&amp;amp;height=352&amp;amp;face=0_0_578_352');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;몰입형 모드를 위한 시스템 표시줄 숨기기 &amp;nbsp;|&amp;nbsp; Views &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. 몰입형 모드를 위한 시스템 표시줄 숨기기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 상태 표시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/788</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-insets#entry788comment</comments>
      <pubDate>Tue, 19 Nov 2024 10:51:57 +0900</pubDate>
    </item>
    <item>
      <title>android java ScrollView scroll</title>
      <link>https://hyperrookie.tistory.com/entry/android-java-scrollview-scroll</link>
      <description>&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;binding.scrollViewHistory.post(new Runnable() {
    @Override
    public void run() {
        //binding.scrollViewHistory.setScrollY(textView.getBottom());
        binding.scrollViewHistory.setScrollY(binding.bmiHistory.getBottom());
    }
});
/*if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.Q)
    binding.scrollViewHistory.scrollToDescendant(textView);
else
    binding.scrollViewHistory.fullScroll(ScrollView.FOCUS_DOWN);*/
    
InputMethodManager inputMethodManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);    
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kotlin에서 할때는 주석처리된 것처럼 해서 잘되었던지 기억이 안난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/787</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-java-scrollview-scroll#entry787comment</comments>
      <pubDate>Mon, 18 Nov 2024 11:22:43 +0900</pubDate>
    </item>
    <item>
      <title>android java interface lambda vs anonymous reference 'this' meaning</title>
      <link>https://hyperrookie.tistory.com/entry/android-java-interface-lambda-vs-anonymous-reference-this-meaning</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;여러 언어를 사용하다 보면 기본을 잊어 버리고(손가락만 기억하는) 코딩이 자주 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거기다 안드로이드 같은 경우라면 eventHandler구현 시 그러한 경우들이 잦다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;람다 표현식 내에서 this는 람다 표현식이 정의된 외부 클래스의 인스턴스를 참조하며, 익명 클래스와의 주요 차이다.&lt;br /&gt;익명 클래스에서는 this가 해당 클래스의 인스턴스를 참조하지만, 람다 표현식에서는 외부 클래스의 인스턴스를 참조합니다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1731551305999&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Outer {
    private String name = &quot;Outer&quot;;

    void lambdaClass() {
        // 람다 표현식 생성
        Runnable r = () -&amp;gt; {
            System.out.println(this.name); // Outer 클래스의 name을 참조
        };
        r.run();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1731551344133&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Outer {
    private String name = &quot;Outer&quot;;

    void anonymousClass() {
        // 익명 클래스 생성
        Runnable r = new Runnable() {
            private String name = &quot;Anonymous&quot;;

            @Override
            public void run() {
                System.out.println(this.name); // 익명 클래스의 name을 참조
                System.out.println(Outer.this.name); // Outer 클래스의 name을 참조
            }
        };
        r.run();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/786</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-java-interface-lambda-vs-anonymous-reference-this-meaning#entry786comment</comments>
      <pubDate>Thu, 14 Nov 2024 11:34:18 +0900</pubDate>
    </item>
    <item>
      <title>Caused by: org.gradle.api.internal.artifacts.ivyservice.TypedResolveException: Could not resolve all files for configuration ':app:debugCompileClasspath'.</title>
      <link>https://hyperrookie.tistory.com/entry/Caused-by-orggradleapiinternalartifactsivyserviceTypedResolveException-Could-not-resolve-all-files-for-configuration-appdebugCompileClasspath</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;음... libs.versions.toml에 오타가 있다 보니 maven library&amp;nbsp; 문제가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 repository에 없다거나 그런 경우다&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/785</guid>
      <comments>https://hyperrookie.tistory.com/entry/Caused-by-orggradleapiinternalartifactsivyserviceTypedResolveException-Could-not-resolve-all-files-for-configuration-appdebugCompileClasspath#entry785comment</comments>
      <pubDate>Wed, 13 Nov 2024 17:37:48 +0900</pubDate>
    </item>
    <item>
      <title>kendo window vertical align middle</title>
      <link>https://hyperrookie.tistory.com/entry/kendo-window-vertical-align-middle</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 해보니 되었다&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;.k-window {
    position: absolute !important;
    top: 50% !important;
    left: 50% !important;
    transform: translate(-50%, -50%) !important; /* 중앙 정렬 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;$(&quot;#kendoWindow&quot;).kendoWindow({
    width: '800px',
    size:&quot;auto&quot;,
    resizable: false,
    title: &quot;KendoWindow&quot;,
    visible: false,
    modal: true
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>front-end &amp;amp; ui/javascript</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/784</guid>
      <comments>https://hyperrookie.tistory.com/entry/kendo-window-vertical-align-middle#entry784comment</comments>
      <pubDate>Thu, 31 Oct 2024 15:16:22 +0900</pubDate>
    </item>
    <item>
      <title>MSSQL Foreign key TRUNCATE</title>
      <link>https://hyperrookie.tistory.com/entry/MSSQL-Foreign-key-TRUNCATE</link>
      <description>&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;DELETE FROM  T_SU_POLL_REQUEST_ITEM

DELETE FROM T_SU_POLL_REQUEST

DBCC CHECKIDENT (T_SU_POLL_REQUEST_ITEM, RESEED, 0)

DBCC CHECKIDENT (T_SU_POLL_REQUEST, RESEED, 0)


&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FK가 존재하는 경우 TRUNCATE이 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 삭제 후 IDENTITY의 시작 값을 0으로 RESET하면 된다.&lt;/p&gt;</description>
      <category>database/mssql</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/783</guid>
      <comments>https://hyperrookie.tistory.com/entry/MSSQL-Foreign-key-TRUNCATE#entry783comment</comments>
      <pubDate>Tue, 22 Oct 2024 17:35:05 +0900</pubDate>
    </item>
    <item>
      <title>한글 로마자표기 변환표 엑셀 다운로드</title>
      <link>https://hyperrookie.tistory.com/entry/%ED%95%9C%EA%B8%80-%EB%A1%9C%EB%A7%88%EC%9E%90%ED%91%9C%EA%B8%B0-%EB%B3%80%ED%99%98%ED%91%9C-%EC%97%91%EC%85%80-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/lzBF6/btsJZrk9sC8/jsEK0xlGviQBvkLBrsqOW0/%ED%95%9C%EA%B8%80%EB%A1%9C%EB%A7%88%EC%9E%90%ED%91%9C%EA%B8%B0%EB%B3%80%ED%99%98_%EC%A0%95%EB%A6%AC%ED%91%9C.xlsx?attach=1&amp;amp;knm=tfile.xlsx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;한글로마자표기변환_정리표.xlsx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/782</guid>
      <comments>https://hyperrookie.tistory.com/entry/%ED%95%9C%EA%B8%80-%EB%A1%9C%EB%A7%88%EC%9E%90%ED%91%9C%EA%B8%B0-%EB%B3%80%ED%99%98%ED%91%9C-%EC%97%91%EC%85%80-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C#entry782comment</comments>
      <pubDate>Tue, 8 Oct 2024 16:25:06 +0900</pubDate>
    </item>
    <item>
      <title>sqlserver 사용자 권한 조회</title>
      <link>https://hyperrookie.tistory.com/entry/sqlserver-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B6%8C%ED%95%9C-%EC%A1%B0%ED%9A%8C</link>
      <description>&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;SELECT T1.[NAME] AS USER_NM
     , T3.[NAME] AS OBJECT_NM
     , T3.[TYPE_DESC]
     , T2.[PERMISSION_NAME]
     , T2.STATE_DESC
FROM sys.DATABASE_PRINCIPALS AS T1 WITH (NOLOCK)
         INNER JOIN sys.DATABASE_PERMISSIONS AS T2 WITH (NOLOCK)
                    ON T2.GRANTEE_PRINCIPAL_ID = T1.PRINCIPAL_ID
         INNER JOIN sys.OBJECTS AS T3 WITH (NOLOCK)
                    ON T3.[OBJECT_ID] = T2.MAJOR_ID
WHERE T1.[NAME] = N'userId'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>database/mssql</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/781</guid>
      <comments>https://hyperrookie.tistory.com/entry/sqlserver-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B6%8C%ED%95%9C-%EC%A1%B0%ED%9A%8C#entry781comment</comments>
      <pubDate>Fri, 27 Sep 2024 14:26:09 +0900</pubDate>
    </item>
    <item>
      <title>intellij update check SSL error ... disabled SNI</title>
      <link>https://hyperrookie.tistory.com/entry/intellij-update-check-SSL-error-disabled-SNI</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mwc1Q/btsI3biU6ea/Tze2IfwEuOkNRW8ZXl47F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mwc1Q/btsI3biU6ea/Tze2IfwEuOkNRW8ZXl47F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mwc1Q/btsI3biU6ea/Tze2IfwEuOkNRW8ZXl47F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwc1Q%2FbtsI3biU6ea%2FTze2IfwEuOkNRW8ZXl47F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;80&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;intellij IDEA자체 update건 plugin update건 위와 같은 메시지를 보이면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 vm options에 -Djsse.enableSNIExtension=false이 들어 있다면 제거&lt;/p&gt;</description>
      <category>intellij</category>
      <category>intellj</category>
      <category>plugin</category>
      <category>SNI</category>
      <category>SSL</category>
      <category>Update</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/780</guid>
      <comments>https://hyperrookie.tistory.com/entry/intellij-update-check-SSL-error-disabled-SNI#entry780comment</comments>
      <pubDate>Tue, 13 Aug 2024 10:06:39 +0900</pubDate>
    </item>
    <item>
      <title>linux 환경 java Graphics2D 생성이 안될 때</title>
      <link>https://hyperrookie.tistory.com/entry/linux-%ED%99%98%EA%B2%BD-java-Graphics2D-%EC%83%9D%EC%84%B1%EC%9D%B4-%EC%95%88%EB%90%A0-%EB%95%8C</link>
      <description>&lt;pre id=&quot;code_1719467812586&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export CATALINA_OPTS=&quot;$CATALINA_OPTS -Djava.awt.headless=true&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우환경에서 개발하고 시험할때는 잘 돌아갔으나 리눅스 배포 후 아무런 일도 일어나지 않는 현상이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;awt 모드는 기본적(윈도우모드)으로 api를 사용하여 창이나 프레임, 대화상자를 사용하는 경우다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤드리스모드는 이미지 등을 표시하지 않고 작성/조작하는 경우에 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JFreeChart를 서버에서 사용할 경우에도 포함되겠다.&lt;/p&gt;</description>
      <category>java/basic</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/779</guid>
      <comments>https://hyperrookie.tistory.com/entry/linux-%ED%99%98%EA%B2%BD-java-Graphics2D-%EC%83%9D%EC%84%B1%EC%9D%B4-%EC%95%88%EB%90%A0-%EB%95%8C#entry779comment</comments>
      <pubDate>Thu, 27 Jun 2024 14:58:33 +0900</pubDate>
    </item>
    <item>
      <title>e-Government Standard Framework Center</title>
      <link>https://hyperrookie.tistory.com/entry/e-Government-Standard-Framework-Center</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/egovframework&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/egovframework&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717463184040&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;e-Government Standard Framework Center&quot; data-og-description=&quot;Korean e-Government Standard Framework Center. e-Government Standard Framework Center has 14 repositories available. Follow their code on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/egovframework&quot; data-og-url=&quot;https://github.com/eGovFramework&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LzQJy/hyWdpQKfla/mKerPNTt4ipkteOltszFkk/img.png?width=201&amp;amp;height=201&amp;amp;face=0_0_201_201&quot;&gt;&lt;a href=&quot;https://github.com/egovframework&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/egovframework&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LzQJy/hyWdpQKfla/mKerPNTt4ipkteOltszFkk/img.png?width=201&amp;amp;height=201&amp;amp;face=0_0_201_201');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;e-Government Standard Framework Center&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Korean e-Government Standard Framework Center. e-Government Standard Framework Center has 14 repositories available. Follow their code on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>java/spring</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/777</guid>
      <comments>https://hyperrookie.tistory.com/entry/e-Government-Standard-Framework-Center#entry777comment</comments>
      <pubDate>Tue, 4 Jun 2024 10:07:42 +0900</pubDate>
    </item>
    <item>
      <title>java @SuppressWarnings</title>
      <link>https://hyperrookie.tistory.com/entry/java-SuppressWarnings</link>
      <description>&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;all : 모든 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;boxing boxing/unboxing : 오퍼레이션과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;cast : 캐스트 오퍼레이션과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;dep-ann : 권장되지 않는 어노테이션과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;deprecation : 권장되지 않는 기능과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;fallthrough switch : 문에서 누락된 break 문과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;finally : 리턴되지 않는 마지막 블록과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;hiding : 변수를 숨기는 로컬과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;incomplete-switch : switch 문에서 누락된 항목과 관련된 경고를 억제합니다(enum case).&lt;/li&gt;
&lt;li&gt;javadoc : javadoc 경고와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;nls : 비nls 문자열 리터럴과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;null : 널(null) 분석과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;rawtypes : 원시 유형 사용법과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;resource : 닫기 가능 유형의 자원 사용에 관련된 경고 억제&lt;/li&gt;
&lt;li&gt;restriction : 올바르지 않거나 금지된 참조 사용법과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;serial : 직렬화 가능 클래스에 대한 누락된 serialVersionUID 필드와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;static-access : 잘못된 정적 액세스와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;static-method : static으로 선언될 수 있는 메소드와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;super : 수퍼 호출을 사용하지 않는 메소드 겹쳐쓰기와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;synthetic-access : 내부 클래스로부터의 최적화되지 않은 액세스와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;sync-override : 동기화된 메소드를 오버라이드하는 경우 누락된 동기화로 인한 경고 억제&lt;/li&gt;
&lt;li&gt;unchecked : 미확인 오퍼레이션과 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;unqualified-field-access : 규정되지 않은 필드 액세스와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;li&gt;unused : 사용하지 않은 코드 및 불필요한 코드와 관련된 경고를 억제합니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/776</guid>
      <comments>https://hyperrookie.tistory.com/entry/java-SuppressWarnings#entry776comment</comments>
      <pubDate>Thu, 23 May 2024 23:26:21 +0900</pubDate>
    </item>
    <item>
      <title>android ANR, Thread, Handler, runOnUiThread, View Handler, AsyncTask, RxJava, Callback Interface</title>
      <link>https://hyperrookie.tistory.com/entry/android-thread</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;ANR ( Application Not Response )&lt;br /&gt;Main Thread Blocking 상태로 사용자 키입력 , 터치 등에 반응을 할 수 없게 된다.&lt;br /&gt;판단하는 시간은 다음과 같다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1716456443206&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// How long we allow a receiver to run before giving up on it.
static final int BROADCAST_FG_TIMEOUT = 10*1000;
static final int BROADCAST_BG_TIMEOUT = 60*1000;
    
// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Main Thread ( UI Thread, Foregroud Thread )&lt;br /&gt;UI갱신 등 눈에 보이는 작업은 Main Thread에서 실행&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Worker Thread ( Background Thread )&lt;br /&gt;눈에 보이지 않는 작업. 즉, 시간이 오래 걸리는 네크워크를 통한 파일다운로드, 파일저장, DB Transaction 등&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Worker Thread가&amp;nbsp; UI갱신을 처리하지 못하도록 하는 안드로이드 제약이 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/topic/performance/vitals/anr?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/topic/performance/vitals/anr?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716686427862&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ANR &amp;nbsp;|&amp;nbsp; App quality &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. ANR 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 앱의 UI 스레드가 너무 오랫동안 차단되면 'ANR&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/topic/performance/vitals/anr?hl=ko&quot; data-og-url=&quot;https://developer.android.com/topic/performance/vitals/anr?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnk10h/hyWdnwCqYp/pWOvk4PEdK5MzWjbImuFU0/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/ydlRN/hyV9Y6jObP/JVOTjudogF2LuHZlLK9H00/img.png?width=700&amp;amp;height=313&amp;amp;face=0_0_700_313,https://scrap.kakaocdn.net/dn/hLwlw/hyV9Nqcu8c/4uGVaBJkNdR9fGwyqPDB50/img.png?width=345&amp;amp;height=591&amp;amp;face=0_0_345_591&quot;&gt;&lt;a href=&quot;https://developer.android.com/topic/performance/vitals/anr?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/topic/performance/vitals/anr?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnk10h/hyWdnwCqYp/pWOvk4PEdK5MzWjbImuFU0/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/ydlRN/hyV9Y6jObP/JVOTjudogF2LuHZlLK9H00/img.png?width=700&amp;amp;height=313&amp;amp;face=0_0_700_313,https://scrap.kakaocdn.net/dn/hLwlw/hyV9Nqcu8c/4uGVaBJkNdR9fGwyqPDB50/img.png?width=345&amp;amp;height=591&amp;amp;face=0_0_345_591');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ANR &amp;nbsp;|&amp;nbsp; App quality &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. ANR 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 앱의 UI 스레드가 너무 오랫동안 차단되면 'ANR&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험삼아 Main Thread에서&amp;nbsp; 100번 loop를 돌려 Thread.sleep(100L)으로 0.1마다 멈추고 TextView에 loop횟수를 표시하는&amp;nbsp; 코드를 실행 버튼(&lt;b&gt;Shift+F10&lt;/b&gt;)을 누르고 난 후 다시 열심히 클릭해도 클릭이 되지 않는다. 그후 다음과 같은 오류가 발생한다. 맨 앞줄 ANR이 보인다. Reason을 읽어보면 Wait queue head age: 5526.0ms&lt;br /&gt;&lt;u&gt;최소한 버튼의 클릭 등 사용자 화면 작업은 두번 이상이어야 오류가 발생한다.&lt;/u&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;
..............   

private void loop(View v) {
  for (int i = 1; i &amp;lt;= 100; i++) {
     try {
         Thread.sleep(100);
         binding.tvProgress.setText(i + &quot;&quot;);
     } catch (InterruptedException e) {
         throw new RuntimeException(e);
     }       
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1716458201882&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ANR in com.dbility.android.threadexam (com.dbility.android.threadexam/.MainActivity)
 PID: 9896
 Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 6.  Wait queue head age: 5526.0ms.)
 Parent: com.dbility.android.threadexam/.MainActivity
 Load: 0.38 / 0.25 / 0.22
 CPU usage from 72503ms to 0ms ago (2024-05-23 18:50:59.580 to 2024-05-23 18:52:12.083):
   5.8% 1793/surfaceflinger: 0.9% user + 4.9% kernel / faults: 55 minor
   5.3% 2023/system_server: 1.8% user + 3.5% kernel / faults: 6028 minor 7 major
   3.3% 2212/com.android.systemui: 0.8% user + 2.5% kernel / faults: 594 minor
   0.9% 8084/com.google.android.gms.persistent: 0.4% user + 0.5% kernel / faults: 3258 minor
   0.7% 1782/android.hardware.sensors@1.0-service: 0% user + 0.7% kernel
   0.7% 3349/com.google.android.googlequicksearchbox:search: 0.3% user + 0.3% kernel / faults: 4595 minor 11 major
   0.6% 1766/android.hardware.graphics.composer@2.1-service: 0% user + 0.6% kernel / faults: 7 minor
   0.6% 8162/com.google.android.gms: 0.4% user + 0.2% kernel / faults: 7398 minor
   0.4% 1751/android.system.suspend@1.0-service: 0.2% user + 0.2% kernel
   0% 1753/android.hardware.audio@2.0-service: 0% user + 0% kernel
   0.2% 1801/adbd: 0% user + 0.2% kernel / faults: 794 minor
   0% 1788/audioserver: 0% user + 0% kernel
   0.2% 2594/com.android.phone: 0% user + 0.1% kernel / faults: 373 minor
   0.1% 2821/com.google.android.apps.nexuslauncher: 0% user + 0% kernel / faults: 775 minor 3 major
   0% 3425/com.google.process.gapps: 0% user + 0% kernel / faults: 773 minor
   0% 1765/android.hardware.graphics.allocator@2.0-service: 0% user + 0% kernel / faults: 10 minor
   0% 1845/llkd: 0% user + 0% kernel
   0% 9118/installer: 0% user + 0% kernel / faults: 642 minor
   0% 1996/process-tracker: 0% user + 0% kernel / faults: 2 minor
   0% 1646/logd: 0% user + 0% kernel / faults: 5 minor
   0% 1822/statsd: 0% user + 0% kernel
   0% 9452/kworker/u8:1: 0% user + 0% kernel
   0% 1764/android.hardware.gnss@1.0-service: 0% user + 0% kernel
   0% 1812/idmap2d: 0% user + 0% kernel / faults: 2959 minor
   0% 1815/installd: 0% user + 0% kernel / faults: 22 minor
   0% 9066/kworker/u8:0: 0% user + 0% kernel
   0% 1791/lmkd: 0% user + 0% kernel
   0% 1794/logcat: 0% user + 0% kernel
   0% 3702/android.process.acore: 0% user + 0% kernel / faults: 21 minor
   0% 7691/com.google.android.gms.unstable: 0% user + 0% kernel / faults: 9 minor
   0% 8/rcu_preempt: 0% user + 0% kernel
   0% 9/rcu_sched: 0% user + 0% kernel
   0% 12/watchdog/0: 0% user + 0% kernel
   0% 27/watchdog/3: 0% user + 0% kernel
   0% 841/kworker/0:1H: 0% user + 0% kernel
   0% 1647/servicemanager: 0% user + 0% kernel
   0% 1655/vold: 0% user + 0% kernel
   0% 1669/jbd2/vdc-8: 0% user + 0% kernel
   0% 1747/zygote: 0% user + 0% kernel / faults: 164 minor
   0% 1758/android.hardware.configstore@1.1-service: 0% user + 0% kernel / faults: 27 minor 34 major
   0% 1787/ashmemd: 0% user + 0% kernel
   0% 1826/wificond: 0% user + 0% kernel / faults: 1 minor
   0% 2780/com.google.android.inputmethod.latin: 0% user + 0% kernel
   0% 3032/com.google.process.gservices: 0% user + 0% kernel / faults: 374 minor
   0% 4539/logcat: 0% user + 0% kernel
   0% 6241/com.google.android.inputmethod.korean: 0% user + 0% kernel / faults: 1 minor
   0% 9302/com.android.keychain: 0% user + 0% kernel / faults: 20 minor
  +0% 9896/com.dbility.android.threadexam: 0% user + 0% kernel
  +0% 9937/kworker/u8:3: 0% user + 0% kernel
  +0% 9938/kworker/u8:4: 0% user + 0% kernel
 3.7% TOTAL: 1.3% user + 2.3% kernel + 0% iowait + 0% softirq
 CPU usage from 11ms to 306ms later (2024-05-23 18:52:12.094 to 2024-05-23 18:52:12.389):
   33% 2023/system_server: 29% user + 3.7% kernel / faults: 580 minor
     22% 2140/InputDispatcher: 11% user + 11% kernel
     7.4% 2038/HeapTaskDaemon: 7.4% user + 0% kernel
     7.4% 2141/InputReader: 3.7% user + 3.7% kernel
     3.7% 2039/ReferenceQueueD: 3.7% user + 0% kernel
   7.1% 1793/surfa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activity는 물론이고, 많이 사용하는 BroadcastReceiver, Service 조차도 모두 ANR이 발생할 수 있다.&amp;nbsp; 아마도 모바일 기기의 물리적, 환경적 요인으로 인한 제약을 피하기 위해 그렇게 설계가 되었을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716786324328&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ANR 진단 및 해결 &amp;nbsp;|&amp;nbsp; App quality &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. ANR 진단 및 해결 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 앱의 UI 스레드가 너무 오랫동안&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs?hl=ko&quot; data-og-url=&quot;https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/o4QXn/hyV9NKGnrV/eWlOH8WbwmlKxRKxYna7aK/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/pZuKz/hyV9ZRTrad/Tk3IGPcyzWpUbrtkjpKoqk/img.png?width=1317&amp;amp;height=1600&amp;amp;face=0_0_1317_1600,https://scrap.kakaocdn.net/dn/v3JjK/hyWdq1oBbt/hZ6EGXzMrcop9znaghH3mK/img.png?width=948&amp;amp;height=1600&amp;amp;face=0_0_948_1600&quot;&gt;&lt;a href=&quot;https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/o4QXn/hyV9NKGnrV/eWlOH8WbwmlKxRKxYna7aK/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/pZuKz/hyV9ZRTrad/Tk3IGPcyzWpUbrtkjpKoqk/img.png?width=1317&amp;amp;height=1600&amp;amp;face=0_0_1317_1600,https://scrap.kakaocdn.net/dn/v3JjK/hyWdq1oBbt/hZ6EGXzMrcop9znaghH3mK/img.png?width=948&amp;amp;height=1600&amp;amp;face=0_0_948_1600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ANR 진단 및 해결 &amp;nbsp;|&amp;nbsp; App quality &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. ANR 진단 및 해결 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 앱의 UI 스레드가 너무 오랫동안&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 발생을 피하기 위해 Main Thread가 아닌 별도의 Worker new Thread(new Runnable(){.................}).start()로 감싸서 실행했다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;
..............   

private void loop(View v) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i &amp;lt;= 100; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                binding.tvProgress.setText(i + &quot;&quot;);
            }
        }
    }).start();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 오류가 발생했다. &lt;u&gt;Only the original thread that created a view hierarchy can touch its views&lt;br /&gt;&lt;/u&gt;대충 이해해 보자면 UI인 tvProgress(TextView)를 생성한 Main Thread가 아닌 Worker Thread에서 접근했다는 것.&lt;br /&gt;&lt;u&gt;오직 Main Thread에서만 View에 접근하고 갱신 할 수 있다&lt;/u&gt;.&lt;u&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716459745833&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FATAL EXCEPTION: Thread-2 (Ask Gemini)
 Process: com.dbility.android.threadexam, PID: 10385
 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
 	at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8191)
 	at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1420)
 	at android.view.View.requestLayout(View.java:24454)
 	at android.view.View.requestLayout(View.java:24454)
 	at android.view.View.requestLayout(View.java:24454)
 	at android.view.View.requestLayout(View.java:24454)
 	at android.view.View.requestLayout(View.java:24454)
 	at android.view.View.requestLayout(View.java:24454)
 	at androidx.constraintlayout.widget.ConstraintLayout.requestLayout(ConstraintLayout.java:3605)
 	at android.view.View.requestLayout(View.java:24454)
 	at android.widget.TextView.checkForRelayout(TextView.java:9681)
 	at android.widget.TextView.setText(TextView.java:6269)
 	at android.widget.TextView.setText(TextView.java:6097)
 	at android.widget.TextView.setText(TextView.java:6049)
 	at com.dbility.android.threadexam.MainActivity$1.run(MainActivity.java:61)
 	at java.lang.Thread.run(Thread.java:919)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째로 다음과 같이 &lt;b&gt;Handler&lt;/b&gt;를 통해 해결 할 수 있다.&lt;br /&gt;Handler는 Main Thread로 동작하므로 TextView가 변경이 된다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;
private Thread mThread;
private Handler mHandler = new Handler();
private final AtomicBoolean isRunning = new AtomicBoolean(false);
..............    

private void loop(View v) {
    mThread = new Thread(new Runnable() {
        @Override
        public void run() {
        	isRunning.set(true);
            for (int i = 1; i &amp;lt;= 100; i++) {
                try {
                    Thread.sleep(100);
                    
                    Log.d(TAG, Thread.currentThread().getName() + &quot; : &quot; + i + &quot;&quot;);
                    final int finalI = i;
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            binding.tvProgress.setText(finalI + &quot;&quot;);
                        }
                	});
                
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } finally {
                    isRunning.set(false);
                }               

            }
        }
    });
    if (!isRunning.get())
    	mThread.start();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Handler의 대표 메서드는 다음과 같다. 이름으로 유추 가능하다.&lt;br /&gt;post(Runnable) , postAtTime(Runnable, long) ,&amp;nbsp; postDelayed(Runnable , long)&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;sendEmptyMessage(int) , sendMessage(Message) ,&lt;br /&gt;sendMessageAtTime(Message, long), sendMessageDelayed(Message, Long)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;send시작하는 메서드에서 사용하는 Message Object는 다음과 같이 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1716462055445&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Message message= Message.obtain();
message.what = 1;
message.arg1 = 2;
message.arg2 = 3;
message.obj = &quot;hello android&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Handler.sendMessage(Message)형태로 전달하면 Handler의 handlerMessage(Message) 메서드가 실행된다.&lt;br /&gt;여기에서 Message를 이용해 UI를 갱신 할 수 있다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;

private final int PROGRESS = 2024;
private final int COMPLETE = 2023;

private Handler mHandler = new Handler(Looper.getMainLooper()){
    @Override
    public void handleMessage(@NonNull Message msg) {
        binding.tvProgress.setText(msg.arg1+&quot;&quot;);
        binding.progressBar.setProgress(msg.arg1);
    }
};

private Handler cHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
    @Override
    public boolean handleMessage(@NonNull Message msg) {
        switch (msg.what) {
            case PROGRESS:
                binding.tvProgress.setText(msg.arg1 + &quot;%&quot;);
                binding.progressBar.setProgress(msg.arg1);
                break;
            case COMPLETE:
                Toast.makeText(MainActivity.this,&quot;완료&quot;,Toast.LENGTH_SHORT).show();
                break;
        }
        return false; // True if no further handling is desired
    }
});
..............

private void loop(View v) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i &amp;lt;= 100; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                Log.d(TAG, Thread.currentThread().getName() + &quot; : &quot; + i );
                
//                Message message = Message.obtain();
                Message message = cHandler.obtainMessage(); //recommended usage              
                message.what = i &amp;lt; 100 ? PROGRESS : COMPLETE;
                message.arg1 = i;
                //pHandler.sendMessage(message);
                cHandler.sendMessage(message);
            }
        }
    }).start();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activity에는 &lt;b&gt;runOnUiThread&lt;/b&gt;가 있다. Main Thread에서 동작한다. Activity가 Main Thread에서 동작하니 당연한 것이겠다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;
..............

private void loop(View v) {

    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i &amp;lt;= 100; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                Log.d(TAG, Thread.currentThread().getName() + &quot; : &quot; + i);
                final int finalI = i;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        binding.tvProgress.setText(finalI + &quot;&quot;);
                    }
                });
            }
        }
    }).start();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 &lt;b&gt;View는 Handler를 내장&lt;/b&gt;하고 있다. 알고 있으면 사용처도 생기겠다.&lt;/p&gt;
&lt;pre id=&quot;code_1716468331588&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;
..............

private void loop(View v) {

    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i &amp;lt;= 100; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                Log.d(TAG, Thread.currentThread().getName() + &quot; : &quot; + i);
                final int finalI = i;
                
                v.post(new Runnable() {
                    @Override
                    public void run() {
                        binding.tvProgress.setText(finalI + &quot;&quot;);
                    }
                });
            }
        }
    }).start();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 개발에 자바를 쓰게 되면 Thread, Runnable을 통해 Worker를 구현한다. 제일 싫은 것은 너무나 많은 block brace..코드 가독성이 극혐이다.&lt;br /&gt;이러한 작업을 하나의 Task로 처리하게 해주는 &lt;b&gt;AsyncTask를 제공&lt;/b&gt;하고 있다.&amp;nbsp;&lt;br /&gt;&lt;u&gt;API level 30 (Android 11)부터 Deprecated&lt;/u&gt;. memory leak, 예외처리 없음, 순서보장없음 등등의 사유라고..그러나 알아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AsyncTask는 Main Thread에서 시작할 수 있고, Worker Thread로 하던 Long Time, Heavy Task를 처리. Thread와 Handler없이도 UI를 갱신할 수 있다. 이보다 더 좋을 순 없었다....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AsyncTask를 상속 받아 작성해야 한다. 3가지 Generic Type을 정의 해야한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AsyncTask&amp;lt;Params, Progress, Result&amp;gt; 형태로 &lt;br /&gt;Params는 입력값, Progress는 Background Worker가 수행되는 동안 발행되는 Progress type(진행률 등 )&lt;br /&gt;Result는 Background Working의 결과 Type이다.&lt;br /&gt;사용할 필요가 없는 Generic은 Void로 입력하면 된다.&lt;br /&gt;그냥 입으로 먹고, 소화되는 과정을 나타내며 응가가 나온다로 이해하니 쉽다. 응가가 Void라는 건 완벽한 에너지 효율이겠다. 나는 원초적이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;AsyncTask는 다음의 4가지 Callback Method를 작성한다. 명칭 그대로 이해하면 된다. 실행 Thread만 구분하면 된다.&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;onPreExecute()&lt;/b&gt;&amp;nbsp;&lt;br /&gt;Main Thread에서 실행되고 Task실행 직후에 호출된다. 초기화에 적절하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;doInBackground(Params...)&lt;/b&gt;&lt;br /&gt;Worker Thread에서 실행되고, 1번 직후에 호출된다.&lt;br /&gt;Long Time, Heavy Task를 여기서 처리한다. &lt;br /&gt;UI갱신이 필요할 때 publishProgress(Progress...)를 호출하면 &lt;br /&gt;3번 onProgressUpdate(Progress...) 이 호출된다. 3번을 직접 호출하면 안된다.&lt;br /&gt;return value는 4번 onPostExecute(Result)로 전달된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;onProgressUpdate(Progress...)&lt;/b&gt;&lt;br /&gt;Main Thread에서 실행되며 , 2번에서 publishProgress(Progress...)가 실행되면 호출된다.&lt;br /&gt;2번 실행 중 UI를 변경하고 싶을 때 여기서 처리하면 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;onPostExecute(Result)&lt;/b&gt;&lt;br /&gt;Main Thread에서 실행되며 2번 doInBackground가 종료된 직후에 호출된다.&lt;br /&gt;Task종료에 대한 처리는 여기서 작성한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AsyncTask는 다음과 같은 Threading 규칙을 따라야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;AsyncTask instance는 Main Thread에서 생성&lt;/li&gt;
&lt;li&gt;execute메서드는 Main Tread에서 생성&lt;/li&gt;
&lt;li&gt;위 1~4 callback method는 직접 호출하면 안됨&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;AysncTask instance는 한번만 실행할 수 있다. 다시 생성하고 실행하면 된다.&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;java.lang.IllegalStateException:&amp;nbsp;Cannot&amp;nbsp;execute&amp;nbsp;task:&amp;nbsp;the&amp;nbsp;task&amp;nbsp;has&amp;nbsp;already&amp;nbsp;been&amp;nbsp;executed&amp;nbsp;(a&amp;nbsp;task&amp;nbsp;can&amp;nbsp;be&amp;nbsp;executed&amp;nbsp;only&amp;nbsp;once)&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속을 받아 작성된 AsyncTask는 AsyncTask.execute(Params..)로 실행하면 된다. &lt;br /&gt;deprecated되어서 경고가 뜨게 된다.@SuppressWarnings(&quot;deprecation&quot;)로 제거해야 보기 좋다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;...........
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;
private AsyncLoop asyncLoop;
..............

@SuppressWarnings(&quot;deprecation&quot;)
private void loop(View v) {
   asyncLoop = new AsyncLoop();
   asyncLoop.execute();
}

@SuppressWarnings(&quot;deprecation&quot;)
class AsyncLoop extends AsyncTask &amp;lt;Void, Integer, Void&amp;gt; {
    @Override
    protected void onPreExecute() {
        Log.e(TAG, Thread.currentThread().getName()+&quot; onPreExecute&quot;);
    }

    @Override
    protected Void doInBackground(Void... voids) {
        for (int i = 0; i &amp;lt;= 100; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Log.e(TAG, Thread.currentThread().getName()+&quot; doInBackground : &quot;+ i + &quot;%&quot;);
            final int finalI = i;
            publishProgress(finalI);
            
            if(isCancelled())
               break;
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        Log.e(TAG, Thread.currentThread().getName()+&quot; onProgressUpdate&quot;);
        binding.tvProgress.setText(values[0] + &quot;%&quot;);
    }

    @Override
    protected void onPostExecute(Void unused) {
        Log.e(TAG, Thread.currentThread().getName()+&quot; onPostExecute&quot;);
    }
    
    @Override
    protected void onCancelled(Void unused) {
        Log.e(TAG, Thread.currentThread().getName()+&quot; onCancelled&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AsyncTask는 호출 순서대로 실행이 된다. 동시(병렬) 실행이 필요한 경우 execute()대신 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)를 사용해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;RxJava ( Reactive Extensions for the JVM )&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reactive programming을 java에서 지원하는 library다. 반응형 프로그래밍은 asynchronous data stream을 이용하는 방식이라고 한다. observable, observer로 구분된다니 Observer Pattern이다. (경제공황처럼) Data Stream의 Produce(생산)를 Consuming(소비)이 따라 가지 못해 OOM(Out Of Memory)이 발생하게 되는(Backpressure) 문제를 해결하는 Flowable도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ReactiveX/RxJava&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ReactiveX/RxJava&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716506355085&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ReactiveX/RxJava: RxJava &amp;ndash; Reactive Extensions for the JVM &amp;ndash; a library for composing asynchronous and event-based p&quot; data-og-description=&quot;RxJava &amp;ndash; Reactive Extensions for the JVM &amp;ndash; a library for composing asynchronous and event-based programs using observable sequences for the Java VM. - ReactiveX/RxJava&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ReactiveX/RxJava&quot; data-og-url=&quot;https://github.com/ReactiveX/RxJava&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPlZbo/hyV9XeJZTS/tFKyU9dBMi30Uirmm8OeUk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ReactiveX/RxJava&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ReactiveX/RxJava&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPlZbo/hyV9XeJZTS/tFKyU9dBMi30Uirmm8OeUk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - ReactiveX/RxJava: RxJava &amp;ndash; Reactive Extensions for the JVM &amp;ndash; a library for composing asynchronous and event-based p&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;RxJava &amp;ndash; Reactive Extensions for the JVM &amp;ndash; a library for composing asynchronous and event-based programs using observable sequences for the Java VM. - ReactiveX/RxJava&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dependency를 추가한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;[versions]
~~~~
rxjava = &quot;3.1.8&quot;
rxAndroid = &quot;3.0.2&quot;

[libraries]
~~~~
rxjava = { group = &quot;io.reactivex.rxjava3&quot;, name = &quot;rxjava&quot;, version.ref = &quot;rxjava&quot; }
rxandroid = { group = &quot;io.reactivex.rxjava3&quot;, name = &quot;rxandroid&quot;, version.ref = &quot;rxAndroid&quot; }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;dependencies {
~~~~
    implementation libs.rxandroid
    implementation libs.rxjava
~~~~
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;RxJava는 method chaining을 사용&lt;/b&gt;할 수 있다. 너무 좋다.&lt;br /&gt;Observable(publish)에는 subscribeOn, observeOn이 있는데,&lt;br /&gt;&lt;b&gt;subScribeOn&lt;/b&gt;은 &lt;u&gt;Observable 동작을 시작하는 Thread&lt;/u&gt;이고,&lt;br /&gt;&lt;b&gt;observeOn&lt;/b&gt;은 &lt;u&gt;Observable이 Observer에게 알림을 보내는 스레드(&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;다음 처리를 진행할 때 사용할 Thread&lt;/span&gt; )를 지정하는 것&lt;/u&gt;이다.&lt;br /&gt;subscribeOn은 여러번 호출되더라도 맨 처음의 호출만 영향을 주며 어디에 위치하든 상관없다. &lt;br /&gt;지금 생각에는 가독성 차원에서 chaining의 첫번째에 하는게 좋겠다.&lt;br /&gt;observeOn은 여러개가 호출될 수 있으며 이후에 실행되는 연산에 영향을 주기 때문에 위치가 중요하다.&lt;br /&gt;observer(subscribe)는 observable이 발행한 이벤트를 구독(수신)하는 객체다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;observeOn에 지정할 Schedulers 종류와 용도는 다음과 같다.&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Schedulers.computation()&amp;nbsp; :&amp;nbsp; Event Loop에서 간단한 연산이나 콜백 처리를 위해 사용하며, I/O 처리는 하면 안됨&lt;/li&gt;
&lt;li&gt;Schedulers.from(executor) : 특정 Executor를 Scheduler로 지정&lt;/li&gt;
&lt;li&gt;Schedulers.immediate()&amp;nbsp; : Current Thread에서 즉시 수행&lt;/li&gt;
&lt;li&gt;Schedulers.io()&amp;nbsp; :&amp;nbsp; Synchronous I/O를 별도로 처리시켜 Asynchronous 효율을 얻기 위한 Scheduler로 자체적인 ThreadPool에 의존&lt;/li&gt;
&lt;li&gt;Schedulers.newThread() : 항상 새로운 Thread를 만드는 Scheduler&lt;/li&gt;
&lt;li&gt;Schedulers.trampoline() :&amp;nbsp; Queue에 있는 Job이 끝나면 이어서 Current Thread에서 수행하는 Scheduler&lt;/li&gt;
&lt;li&gt;AndroidSchedulers.mainThread() : Android Main Thread ( UI Thread )에서 수행&lt;/li&gt;
&lt;li&gt;HandlerScheduler.from(handler)&amp;nbsp; : 특정 핸들러 handler에 의존하여 동작.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;
..............

private final Observable observable = Observable.create(new ObservableOnSubscribe&amp;lt;Integer&amp;gt;() {
        @Override
        public void subscribe(@io.reactivex.rxjava3.annotations.NonNull ObservableEmitter&amp;lt;Integer&amp;gt; emitter) throws Throwable {

            for (int i = 1; i &amp;lt;= 20; i++) {
                try {
                    Thread.sleep(100);
                    if (i == 10) { // force stop condition
                        emitter.onComplete();//1
                        //Thread.currentThread().interrupt();//2
                    }
                    if (i &amp;lt;= 100) {
                        emitter.onNext(i);
                        if (i == 100)
                            emitter.onComplete();
                    }
                    Log.d(TAG, &quot;Observable &quot; + Thread.currentThread().getName() + &quot; : emitter.onNext  &quot; + i + &quot;&quot;);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e); //2                  
                }
            }
        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
    
    private final Observer&amp;lt;Integer&amp;gt; observer = new Observer&amp;lt;Integer&amp;gt;() {
        @Override
        public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
            Log.d(TAG, &quot;Observer onSubscribe : &quot; + Thread.currentThread().getName());
        }

        @Override
        public void onNext(@io.reactivex.rxjava3.annotations.NonNull Integer integer) {
            Log.d(TAG, &quot;Observer onNext : &quot; + Thread.currentThread().getName() + &quot; , &quot; + integer.toString());
            binding.tvProgress.setText(integer + &quot;&quot;);
        }

        @Override
        public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
            Log.d(TAG, &quot;Observer onError : &quot; + Thread.currentThread().getName() + &quot;, &quot; + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.d(TAG, &quot;Observer onComplete : &quot; + Thread.currentThread().getName());
        }
    };
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                Log.d(TAG, &quot;onClick &quot; + Thread.currentThread().getName());
                observable.subscribe(observer);
                break;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Logcat 결과&lt;/p&gt;
&lt;pre id=&quot;code_1716520654092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--------- beginning of main
12:16:49.399 MainActivity             D  onClick main
12:16:49.401 MainActivity             D  Observer onSubscribe : main
12:16:49.504 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  1%
12:16:49.507 MainActivity             D  Observer onNext : main , 1
12:16:49.607 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  2%
12:16:49.607 MainActivity             D  Observer onNext : main , 2
12:16:49.708 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  3%
12:16:49.708 MainActivity             D  Observer onNext : main , 3
12:16:49.810 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  4%
12:16:49.810 MainActivity             D  Observer onNext : main , 4
12:16:49.911 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  5%
12:16:49.911 MainActivity             D  Observer onNext : main , 5
12:16:50.012 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  6%
12:16:50.012 MainActivity             D  Observer onNext : main , 6
12:16:50.113 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  7%
12:16:50.113 MainActivity             D  Observer onNext : main , 7
12:16:50.214 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  8%
12:16:50.214 MainActivity             D  Observer onNext : main , 8
12:16:50.316 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  9%
12:16:50.316 MainActivity             D  Observer onNext : main , 9
12:16:50.417 MainActivity             D  Observable RxCachedThreadScheduler-3 : emitter.onNext  10%
12:16:50.417 MainActivity             D  Observer onNext : main , 10
12:16:50.419 MainActivity             D  Observer onError : main, java.lang.InterruptedException&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;traditional? callback interface를 써보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 헷갈리지 않게 다음과 같이 정리된다. call by reference는 알고 있어야 함&lt;br /&gt;1) Callback : event가 발생했을때 특정 메서드를 호출하는 개념 ( 1개 )&lt;br /&gt;2) Listener : event가 발생했을때 연결된 event listener(event handler)에 event를 전달 ( N개 가능 )&lt;br /&gt;3) Observer : property나 data value의 변경을 감지하고 subscriber에 변경 사항 전달&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;..............
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding binding;

public interface ICallback {
    public void success();
    public void progress(int progress);
    public void failure();
}
..............

public void fn_loop (View v, ICallback callback) {
     new Thread(new Runnable() {
         @Override
         public void run() {
             for (int i = 1; i &amp;lt;= 10; i++) {
                 try {
                     Thread.sleep(100);
                     Log.d(TAG, Thread.currentThread().getName() + &quot; : &quot; + i + &quot;%&quot;);
                     final int finalI = i;
                     callback.progress(i);
                     if (i == 10)
                         callback.success();
                     if (i == 5)
                         throw new InterruptedException(&quot;cancel&quot;);
                 } catch (InterruptedException ie) {
                     //ie.printStackTrace();
                     Log.e(TAG, ie.getMessage()+&quot;&quot;);
                     callback.failure();
                     break;
                 }
             }
         }
     }).start();
 }
 
 @Override
 public void onClick(View v) {
     switch (v.getId()) {
         case R.id.btn_start:
             Log.d(TAG, &quot;onClick &quot; + Thread.currentThread().getName());
             fn_loop(v, new ICallback() {
                 @Override
                 public void success() {
                     Log.d(TAG, Thread.currentThread().getName() + &quot; ICallback.success()&quot;);
                 }

                 @Override
                 public void progress(int progress) {
                     Log.d(TAG, Thread.currentThread().getName() + &quot; ICallback.progress() &quot; + progress);
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
                             binding.tvProgress.setText(progress + &quot;%&quot;);
                         }
                     });

                 }

                 @Override
                 public void failure() {
                     Log.d(TAG, Thread.currentThread().getName() + &quot; ICallback.failure()&quot;);
                 }
             });
             break;           
     }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/775</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-thread#entry775comment</comments>
      <pubDate>Thu, 23 May 2024 18:33:29 +0900</pubDate>
    </item>
    <item>
      <title>android downloded apk file version check and install</title>
      <link>https://hyperrookie.tistory.com/entry/android-downloded-apk-file-version-check-and-install</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;res/xml/path.xml&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;paths xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&amp;gt;
    &amp;lt;external-path
        name=&quot;external_files&quot;
        path=&quot;.&quot; /&amp;gt;
&amp;lt;/paths&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AndroidManifest.xml&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.REQUEST_INSTALL_PACKAGES&quot; /&amp;gt;
......
&amp;lt;provider
    android:name=&quot;androidx.core.content.FileProvider&quot;
    android:authorities=&quot;${applicationId}.provider&quot;
    android:exported=&quot;false&quot;
    android:grantUriPermissions=&quot;true&quot;&amp;gt;
    &amp;lt;meta-data
        android:name=&quot;android.support.FILE_PROVIDER_PATHS&quot;
        android:resource=&quot;@xml/path&quot; /&amp;gt;
&amp;lt;/provider&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;//출처를 알 수 없는 앱 설치 권한
if (!getPackageManager().canRequestPackageInstalls()) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
    intent.setData(Uri.parse(String.format(&quot;package:%s&quot;, getPackageName())));
    if (intent.resolveActivity(getPackageManager()) != null) {        
        startActivity(intent);
    }
}

//build.gradle
buildConfigField(&quot;String&quot;, &quot;APP_DOWN_FULL_PATH&quot;, '&quot;http://........../app-debug.apk&quot;')
//java code
private String apkFile = BuildConfig.APP_DOWN_FULL_PATH.substring(BuildConfig.APP_DOWN_FULL_PATH.lastIndexOf(&quot;/&quot;) + 1);
private String outputFilePath = this.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS.concat(&quot;/app/&quot;).concat(apkFile)).toString();

File file = new File(outputFilePath);
Uri apkUri = FileProvider.getUriForFile(LoginActivity.this, BuildConfig.APPLICATION_ID + &quot;.provider&quot;, file);
                            
PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo(outputFilePath, 0);

String downloadVersion = (packageInfo.versionName + &quot;&quot; + packageInfo.getLongVersionCode()).replace(&quot;.&quot;, &quot;&quot;);
String currentVersion = BuildConfig.VERSION_NAME.replace(&quot;.&quot;, &quot;&quot;).concat(String.valueOf(BuildConfig.VERSION_CODE));

if (downloadVersion.compareTo(currentVersion) &amp;gt; 0) {
    if (DEBUG) {
        Log.e(TAG, &quot;UPDATE&quot;);
    }
    Intent intent = new Intent(Intent.ACTION_VIEW);
    //intent.setDataAndType(apkUri, &quot;application/vnd.android.package-archive&quot;);
    intent.setData(apkUri);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
    startActivity(intent);
    finish();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/773</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-downloded-apk-file-version-check-and-install#entry773comment</comments>
      <pubDate>Thu, 9 May 2024 12:16:12 +0900</pubDate>
    </item>
    <item>
      <title>android loading indicator example</title>
      <link>https://hyperrookie.tistory.com/entry/android-progress-bar-color-change-programmatic</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;ProgressBar progressBar = new ProgressBar(this);
progressBar.getIndeterminateDrawable().mutate().setTintList(ColorStateList.valueOf(Color.RED));

Dialog progressDialog = new Dialog(this);
progressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
progressDialog.setContentView(progressBar);
progressDialog.setCanceledOnTouchOutside(false);

progressDialog.setOnCancelListener(
new DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        dialog.dismiss();
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ContentLoadingProgressBar 사용시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE0Nk9/btsLAbujQeR/pickLyrtuKbJIEtK1WdgU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE0Nk9/btsLAbujQeR/pickLyrtuKbJIEtK1WdgU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE0Nk9/btsLAbujQeR/pickLyrtuKbJIEtK1WdgU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE0Nk9%2FbtsLAbujQeR%2FpickLyrtuKbJIEtK1WdgU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;267&quot; height=&quot;470&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;&amp;gt;

    &amp;lt;androidx.core.widget.ContentLoadingProgressBar
        android:id=&quot;@+id/pb_loading&quot;
        style=&quot;?android:attr/progressBarStyleLarge&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:indeterminate=&quot;true&quot;
        android:indeterminateTint=&quot;#E91E63&quot;
        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
        app:layout_constraintEnd_toEndOf=&quot;parent&quot;
        app:layout_constraintStart_toStartOf=&quot;parent&quot;
        app:layout_constraintTop_toTopOf=&quot;parent&quot; /&amp;gt;

&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class LoadingDialog {
    private static Dialog dialog;

    public static void show(@NonNull Context context) {
        dialog = new Dialog(context);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setContentView(R.layout.dialog_loading);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }

    public static synchronized void hide() {
        if (dialog != null) {
            dialog.dismiss();
            dialog = null;
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;stephow-hover-overlay&quot; style=&quot;opacity: 0;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;guideflo-extension-unique-identifier&quot; style=&quot;display: none;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ProgressIndicator 사용시 layout&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;&amp;gt;

    &amp;lt;com.google.android.material.progressindicator.CircularProgressIndicator
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:indeterminate=&quot;true&quot;
        app:indicatorColor=&quot;#FF0000&quot;
        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
        app:layout_constraintEnd_toEndOf=&quot;parent&quot;
        app:layout_constraintStart_toStartOf=&quot;parent&quot;
        app:layout_constraintTop_toTopOf=&quot;parent&quot; /&amp;gt;

&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/772</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-progress-bar-color-change-programmatic#entry772comment</comments>
      <pubDate>Wed, 8 May 2024 07:21:00 +0900</pubDate>
    </item>
    <item>
      <title>WindowMetrics 화면 크기 등</title>
      <link>https://hyperrookie.tistory.com/entry/WindowMetrics-%ED%99%94%EB%A9%B4-%ED%81%AC%EA%B8%B0-%EB%93%B1</link>
      <description>&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.R) {
    WindowMetrics windowMetrics = getWindowManager().getCurrentWindowMetrics();
    Log.e(TAG, windowMetrics.getBounds().width() + &quot; : &quot; + windowMetrics.getBounds().height());
} else {
    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getRealMetrics(displayMetrics);
    Log.e(TAG, displayMetrics.widthPixels + &quot; : &quot; + displayMetrics.heightPixels);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/771</guid>
      <comments>https://hyperrookie.tistory.com/entry/WindowMetrics-%ED%99%94%EB%A9%B4-%ED%81%AC%EA%B8%B0-%EB%93%B1#entry771comment</comments>
      <pubDate>Sat, 4 May 2024 22:07:31 +0900</pubDate>
    </item>
    <item>
      <title>theme</title>
      <link>https://hyperrookie.tistory.com/entry/theme</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;style은 View에 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Theme은 앱 전체에 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;colorPrimary와 colorSecondary는 앱의 브랜드를 표현하기 위한 색상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;colorPrimary는 툴바와 버튼의 백그라운드 색상으로 적용되며, colorOnPrimary는 포그라운드 색상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;colorSecondary는 체크박스,라디오버튼, 스위치 등의 활성상태 색상이고, colorOnSecondary는 포그라운드 색상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;statusBarColor는 상태바의 백그라운드 색상으로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;colorPrimaryVariant,colorSecondaryVariant는 그림자 색상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 statusBar를 사라지게 하는데 parent 테마에 따라 다르다&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;item name=&quot;android:windowFullscreen&quot;&amp;gt;true&amp;lt;/item&amp;gt;
&amp;lt;item name=&quot;android:windowNoTitle&quot;&amp;gt;true&amp;lt;/item&amp;gt;
&amp;lt;item name=&quot;android:windowActionBar&quot;&amp;gt;false&amp;lt;/item&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m2.material.io/develop/android/theming/color&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://m2.material.io/develop/android/theming/color&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714914823495&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Material Design&quot; data-og-description=&quot;Build beautiful, usable products faster. Material Design is an adaptable system&amp;mdash;backed by open-source code&amp;mdash;that helps teams build high quality digital experiences.&quot; data-og-host=&quot;m3.material.io&quot; data-og-source-url=&quot;https://m2.material.io/develop/android/theming/color&quot; data-og-url=&quot;https://material.io&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/im1g8/hyVZf1lPIx/reYdreqJvA3i5kpBpfuG01/img.jpg?width=1024&amp;amp;height=535&amp;amp;face=0_0_1024_535&quot;&gt;&lt;a href=&quot;https://m2.material.io/develop/android/theming/color&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m2.material.io/develop/android/theming/color&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/im1g8/hyVZf1lPIx/reYdreqJvA3i5kpBpfuG01/img.jpg?width=1024&amp;amp;height=535&amp;amp;face=0_0_1024_535');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Material Design&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Build beautiful, usable products faster. Material Design is an adaptable system&amp;mdash;backed by open-source code&amp;mdash;that helps teams build high quality digital experiences.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;m3.material.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/770</guid>
      <comments>https://hyperrookie.tistory.com/entry/theme#entry770comment</comments>
      <pubDate>Sat, 4 May 2024 21:25:23 +0900</pubDate>
    </item>
    <item>
      <title>android shortcut</title>
      <link>https://hyperrookie.tistory.com/entry/android-shortcut</link>
      <description>&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.INSTALL_SHORTCUT&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼미션은 없어도 되는 것 같은데&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;SharedPreferences sharedPreferences = getSharedPreferences(&quot;FIRST_LAUNCH&quot;, Context.MODE_PRIVATE);
if (sharedPreferences.getBoolean(&quot;FIRST_LAUNCH&quot;, true)) {
    sharedPreferences.edit().putBoolean(&quot;FIRST_LAUNCH&quot;, false).commit();
    if (ShortcutManagerCompat.isRequestPinShortcutSupported(this)) {
        ShortcutInfoCompat shortcutInfoCompat = new ShortcutInfoCompat.Builder(this, &quot;#0&quot;)
                .setIntent(new Intent(this, RetrofitActivity.class)
                        .setAction(Intent.ACTION_MAIN))
                .setShortLabel(getString(R.string.app_name))
                .setIcon(IconCompat.createWithResource(this, R.drawable.icon))
                .build();
        ShortcutManagerCompat.requestPinShortcut(this, shortcutInfoCompat, null);
        Toast.makeText(this, &quot;바로가기가 생성되었습니다&quot;, Toast.LENGTH_SHORT).show();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/769</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-shortcut#entry769comment</comments>
      <pubDate>Thu, 2 May 2024 20:38:57 +0900</pubDate>
    </item>
    <item>
      <title>android avd localhost</title>
      <link>https://hyperrookie.tistory.com/entry/android-avd-localhost</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Retrofit2로 작성된 것 테스트 해보려고 spring web으로 작성된 localhost에 Rest API를 호출하는데,&lt;/p&gt;
&lt;pre id=&quot;code_1714552011150&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Failed to connect to localhost/127.0.0.1:8080&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localhost:8080&lt;/li&gt;
&lt;li&gt;127.0.0.1:8080&lt;br /&gt;둘다 접근이 안된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;물론 웹브라우저에선 잘된다. 그렇다는건 음...에뮬레이터라 그런가..&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;dev doc에는 다음과 같다.&lt;/p&gt;
&lt;h2 id=&quot;networkaddresses&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-text=&quot;네트워크 주소 공간&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;네트워크 주소 공간&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;에뮬레이터의 각 인스턴스는 가상 라우터나 방화벽 서비스 뒤에서 실행되어 개발 머신 네트워크 인터페이스 및 설정과 인터넷에서 분리됩니다. 에뮬레이션된 기기는 네트워크에서 개발 머신이나 다른 에뮬레이터 인스턴스를 감지할 수 없습니다. 이더넷을 통해 라우터나 방화벽에 연결되었다는 것만 감지합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 인스턴스의 가상 라우터는 10.0.2/24 네트워크 주소 공간을 관리합니다. 라우터가 관리하는 모든 주소는 10.0.2.xx&lt;span&gt;&amp;nbsp;&lt;/span&gt;형식이며 여기서&lt;span&gt;&amp;nbsp;&lt;/span&gt;xx는 숫자입니다. 이 공간 내의 주소는 다음과 같이 에뮬레이터나 라우터에 의해 미리 할당됩니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;네트워크 주소설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10.0.2.1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;라우터 또는 게이트웨이 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10.0.2.2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;호스트 루프백 인터페이스의 특수 별칭(개발 머신의 127.0.0.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10.0.2.3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;첫 번째 DNS 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10.0.2.4/10.0.2.5/10.0.2.6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;두 번째, 세 번째, 네 번째 DNS 서버(선택사항)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10.0.2.15&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;이더넷을 사용하여 연결된 경우 에뮬레이션된 기기 네트워크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10.0.2.16&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Wi-Fi를 사용하여 연결된 경우 에뮬레이션된 기기 네트워크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;127.0.0.1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;에뮬레이션된 기기 루프백 인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/run/emulator-networking?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/studio/run/emulator-networking?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714552169755&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Android Emulator 네트워킹 설정 &amp;nbsp;|&amp;nbsp; Android Studio &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;에뮬레이터는 앱에 복잡한 모델링 및 테스트 환경을 설정하는 데 사용할 수 있는 다목적 네트워킹 기능을 제공합니다.&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/studio/run/emulator-networking?hl=ko&quot; data-og-url=&quot;https://developer.android.com/studio/run/emulator-networking?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IAmha/hyVZgkvCDh/S091TFScf8Kk4lpkxIsyUk/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/RHoOC/hyVVFMZHdi/rq9BUMKiqcZR5qKkpcB8OK/img.png?width=1640&amp;amp;height=898&amp;amp;face=0_0_1640_898&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/run/emulator-networking?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/studio/run/emulator-networking?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IAmha/hyVZgkvCDh/S091TFScf8Kk4lpkxIsyUk/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/RHoOC/hyVVFMZHdi/rq9BUMKiqcZR5qKkpcB8OK/img.png?width=1640&amp;amp;height=898&amp;amp;face=0_0_1640_898');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Android Emulator 네트워킹 설정 &amp;nbsp;|&amp;nbsp; Android Studio &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;에뮬레이터는 앱에 복잡한 모델링 및 테스트 환경을 설정하는 데 사용할 수 있는 다목적 네트워킹 기능을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10.0.2.2가 호스트 루프백 인터페이스의 특수 별칭(개발 머신의 127.0.0.1)이라고 나온다.&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/768</guid>
      <comments>https://hyperrookie.tistory.com/entry/android-avd-localhost#entry768comment</comments>
      <pubDate>Wed, 1 May 2024 17:30:57 +0900</pubDate>
    </item>
    <item>
      <title>tomcat version 확인</title>
      <link>https://hyperrookie.tistory.com/entry/tomcat-version-%ED%99%95%EC%9D%B8</link>
      <description>&lt;pre id=&quot;code_1713953294851&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -cp catalina.jar org.apache.catalina.util.ServerInfo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;op_version.png&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXwbG8/btsGTjxTmpo/rxievJLrK1mZAxRT3FDqgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXwbG8/btsGTjxTmpo/rxievJLrK1mZAxRT3FDqgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXwbG8/btsGTjxTmpo/rxievJLrK1mZAxRT3FDqgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXwbG8%2FbtsGTjxTmpo%2FrxievJLrK1mZAxRT3FDqgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;138&quot; data-filename=&quot;op_version.png&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>was</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/766</guid>
      <comments>https://hyperrookie.tistory.com/entry/tomcat-version-%ED%99%95%EC%9D%B8#entry766comment</comments>
      <pubDate>Wed, 24 Apr 2024 19:08:37 +0900</pubDate>
    </item>
    <item>
      <title>singleton의 최적?</title>
      <link>https://hyperrookie.tistory.com/entry/singleton</link>
      <description>&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class DataStore {

    private final String TAG = DataStore.class.getSimpleName();
    
    private DataStore() {
        Log.e(TAG, &quot;Init&quot;);
    }

    public static DataStore getInstance() {
        return LazyDataStore.instance;
    }

    private static class LazyDataStore {
        private static final DataStore instance = new DataStore();
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>java/basic</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/763</guid>
      <comments>https://hyperrookie.tistory.com/entry/singleton#entry763comment</comments>
      <pubDate>Thu, 18 Apr 2024 15:12:56 +0900</pubDate>
    </item>
    <item>
      <title>android.nonFinalResIds=false</title>
      <link>https://hyperrookie.tistory.com/entry/androidnonFinalResIdsfalse</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;switch에서 case R.id.식별자 하면 오류가 남. R.id가 final이 아니라 그렇다고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gradle 8.0부터 그렇게 되었다고 하니 gradle.properties에 추가&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;android.nonFinalResIds=false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/762</guid>
      <comments>https://hyperrookie.tistory.com/entry/androidnonFinalResIdsfalse#entry762comment</comments>
      <pubDate>Wed, 17 Apr 2024 13:00:26 +0900</pubDate>
    </item>
    <item>
      <title>Didn't find class &amp;quot;androidx.core.app.CoreComponentFactory&amp;quot;</title>
      <link>https://hyperrookie.tistory.com/entry/Didnt-find-class-androidxcoreappCoreComponentFactory</link>
      <description>&lt;pre id=&quot;code_1713235163624&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Unable to instantiate appComponentFactory

java.lang.ClassNotFoundException: Didn't find class &quot;androidx.core.app.CoreComponentFactory&quot; on path: DexPathList[[],nativeLibraryDirectories=[/data/app/com.dbility.android.myapplication-zXQF53q8EDh0JWjB7uEqzA==/lib/x86, /system/lib, /system/product/lib]]
	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
	at android.app.LoadedApk.createAppFactory(LoadedApk.java:256)
	at android.app.LoadedApk.updateApplicationInfo(LoadedApk.java:370)
	at android.app.ActivityThread.handleDispatchPackageBroadcast(ActivityThread.java:5951)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1941)
	at android.os.Handler.dispatchMessage(Handler.java:107)
	at android.os.Looper.loop(Looper.java:214)
	at com.android.server.SystemServer.run(SystemServer.java:541)
	at com.android.server.SystemServer.main(SystemServer.java:349)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:908)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proguard-rules.pro에 추가&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;-keep class androidx.core.app.CoreComponentFactory { *; }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>android/java</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/761</guid>
      <comments>https://hyperrookie.tistory.com/entry/Didnt-find-class-androidxcoreappCoreComponentFactory#entry761comment</comments>
      <pubDate>Tue, 16 Apr 2024 11:40:22 +0900</pubDate>
    </item>
    <item>
      <title>AVD network speed</title>
      <link>https://hyperrookie.tistory.com/entry/AVD-network-speed</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;For Mobile Data Link I am afraid that you can only check TelefonyManager.getNetworkType() to determine the current Mobile Data Link type. You should then aproximate to actual speed by link type (i.e. for GPRS up to 128 kbps, for EDGE up to 236.8 kpbs, for 3G up to 2 Mbps, for HSDPA up to 7.2 Mbps). Take into consideration that this is only an aproximation. Your could be conneting using HSDPA but your carrier limiting the top speed to 2 Mbps&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Theoretical maximum speeds of 4G&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #1d4d70; text-align: left;&quot; href=&quot;https://www.speedguide.net/_iframe_term.php?seek=LTE&quot;&gt;LTE&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reach 100Mbps... However, actual performance of mobile data is much lower, considering signal strength, frequencies used, congestion, etc.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Here are the real-life speed ranges of the various mobile wireless strandards commonly used in the US today:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;GSM (Global System for Mobile Communications) 2G -- 9.6Kbps&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;GPRS (General&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #1d4d70; text-align: left;&quot; href=&quot;https://www.speedguide.net/_iframe_term.php?seek=PACKET&quot;&gt;packet&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;radio services) 2.5G -- 35Kbps to 171kbps&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;EDGE (Enhanced Data rates for GSM Evolution) 2.75G -- 120Kbps to 384Kbps&lt;/span&gt;&lt;br /&gt;&lt;a style=&quot;background-color: #ffffff; color: #1d4d70; text-align: left;&quot; href=&quot;https://www.speedguide.net/_iframe_term.php?seek=UMTS&quot;&gt;UMTS&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Universal Mobile Telecommunications System) 3G -- 384Kbps to 2Mbps&lt;/span&gt;&lt;br /&gt;&lt;a style=&quot;background-color: #ffffff; color: #1d4d70; text-align: left;&quot; href=&quot;https://www.speedguide.net/_iframe_term.php?seek=HSPA&quot;&gt;HSPA&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(software upgrade to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #1d4d70; text-align: left;&quot; href=&quot;https://www.speedguide.net/_iframe_term.php?seek=UMTS&quot;&gt;UMTS&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;, theoretical 42Mbps) 3.5G -- 600Kbps to 10Mbps, averages 1-3Mbps&lt;/span&gt;&lt;br /&gt;&lt;a style=&quot;background-color: #ffffff; color: #1d4d70; text-align: left;&quot; href=&quot;https://www.speedguide.net/_iframe_term.php?seek=WIMAX&quot;&gt;WiMAX&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;/LTE &quot;4G&quot; (theoretical 100Mbps) -- 3Mbps to 10Mbps average, 20Mbps+ peak download speeds.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;a href=&quot;https://www.speedguide.net/faq/what-are-the-actual-speeds-of-gprs-edge-umts-hspa-366&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.speedguide.net/faq/what-are-the-actual-speeds-of-gprs-edge-umts-hspa-366&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713158229220&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;What are the actual speeds of GPRS, EDGE, UMTS, HSPA, etc ?&quot; data-og-description=&quot;Theoretical maximum speeds of 4G LTE reach 100Mbps...&quot; data-og-host=&quot;www.speedguide.net&quot; data-og-source-url=&quot;https://www.speedguide.net/faq/what-are-the-actual-speeds-of-gprs-edge-umts-hspa-366&quot; data-og-url=&quot;https://www.speedguide.net/faq/what-are-the-actual-speeds-of-gprs-edge-umts-hspa-366&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.speedguide.net/faq/what-are-the-actual-speeds-of-gprs-edge-umts-hspa-366&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.speedguide.net/faq/what-are-the-actual-speeds-of-gprs-edge-umts-hspa-366&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What are the actual speeds of GPRS, EDGE, UMTS, HSPA, etc ?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Theoretical maximum speeds of 4G LTE reach 100Mbps...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.speedguide.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/hymp9800/222167492864&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/hymp9800/222167492864&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713158741439&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Kbps K/Bs 차이점 계산 공식, Mbps MB/s 차이점 계산 공식! 그리고 Kbps, Mbps 자동 엑셀 변환기&quot; data-og-description=&quot;가끔 속력이 10Mbps라고 표시되었는데 초당 10MB의 다운 속도가 나오지 않고 초당 2MB 정도밖에 나오...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/hymp9800/222167492864&quot; data-og-url=&quot;https://blog.naver.com/hymp9800/222167492864&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mPzbA/hyVPJOwwPC/ZXYrZSoiXgsh9FXKAMR4Vk/img.gif?width=743&amp;amp;height=293&amp;amp;face=0_0_743_293&quot;&gt;&lt;a href=&quot;https://blog.naver.com/hymp9800/222167492864&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/hymp9800/222167492864&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mPzbA/hyVPJOwwPC/ZXYrZSoiXgsh9FXKAMR4Vk/img.gif?width=743&amp;amp;height=293&amp;amp;face=0_0_743_293');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Kbps K/Bs 차이점 계산 공식, Mbps MB/s 차이점 계산 공식! 그리고 Kbps, Mbps 자동 엑셀 변환기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;가끔 속력이 10Mbps라고 표시되었는데 초당 10MB의 다운 속도가 나오지 않고 초당 2MB 정도밖에 나오...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cuofjk/btsGC1X8OA3/HaE4tfBV3OTD3Nesbp9pS0/%EC%9D%B8%ED%84%B0%EB%84%B7%20%EC%86%8D%EB%8F%84%20%EA%B3%84%EC%82%B0%EA%B8%B0%20Kbps%20KBs%28%EB%B0%B0%ED%8F%AC%EC%9A%A9%29.xlsx?attach=1&amp;amp;knm=tfile.xlsx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;인터넷 속도 계산기 Kbps KBs(배포용).xlsx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 블로그에서 다운받은 것임.&lt;/p&gt;</description>
      <category>android</category>
      <author>DBILITY</author>
      <guid isPermaLink="true">https://hyperrookie.tistory.com/760</guid>
      <comments>https://hyperrookie.tistory.com/entry/AVD-network-speed#entry760comment</comments>
      <pubDate>Mon, 15 Apr 2024 14:14:14 +0900</pubDate>
    </item>
  </channel>
</rss>