<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>1D1C</title>
    <link>https://1d1cblog.tistory.com/</link>
    <description>개인공부 정리 블로그
</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 14:33:09 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_SYPark</managingEditor>
    <image>
      <title>1D1C</title>
      <url>https://tistory1.daumcdn.net/tistory/3181187/attach/c873ea5c60344d69b50805c6a1c854ae</url>
      <link>https://1d1cblog.tistory.com</link>
    </image>
    <item>
      <title>[Qt] Qt Database PostgreSQL 사용 시 driver not loaded 에러</title>
      <link>https://1d1cblog.tistory.com/534</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Qt로 Database에 접속하려고 하면 QSqlDatabase를 사용해야 합니다. 그 중 사용할 데이터베이스가 PostgreSQL일 경우 addDatabase(&quot;QPSQL&quot;)을 사용합니다.&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;/p&gt;
&lt;pre id=&quot;code_1770788729165&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m_serverDB = QSqlDatabase::addDatabase(&quot;QPSQL&quot;);      // PostgreSQL Driver

m_serverDB.setHostName(m_connectionInfo.host);
m_serverDB.setPort(m_connectionInfo.port);
m_serverDB.setDatabaseName(m_connectionInfo.dbName);
m_serverDB.setUserName(m_connectionInfo.user);
m_serverDB.setPassword(m_connectionInfo.pass);

if ( !m_serverDB.open() ) {
    sErrMsg = m_serverDB.lastError().text();
    sErrMsg.prepend(SERVERDB_ERROR_MSG);
    return bResult;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이 때 에러 메시지로 &quot;Driver not loaded&quot;가 나오는 경우가 있는데 이때는 아래의 내용을 확인해봐야 합니다.&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;1. exe가 있는 폴더 혹은 library path에 아래의 dll이 있는지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;libcrypto-3-x64.dll&lt;/li&gt;
&lt;li&gt;libiconv-2.dll&lt;/li&gt;
&lt;li&gt;libintl-9.dll&lt;/li&gt;
&lt;li&gt;libpq.dll&lt;/li&gt;
&lt;li&gt;libssl-3-x64.dll&lt;/li&gt;
&lt;li&gt;libwinpthread-1.dll&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한건 libwinpthread-1.dll 입니다. GPT나 Gemini한테 물어보면 libwinpthread-1.dll를 제외한 나머지 파일들의 유무를 많이 얘기하는데 PostgreSQL은 mingw/gcc로 빌드 하였고 만약 Qt build를 msvc로 했을 경우 문제가 발생할 수 있습니다.&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;2. exe가 있는 폴더에 sqldriver 폴더 생성 후 qsqlpsql.dll, qsqlodbc.dll 있는지&amp;nbsp;&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;저도 이 문제 때문에 꽤 애를 먹었는데 [libwinpthread-1.dll] 파일을 exe에 추가하여 배포하였더니 사용자 PC에서도 문제가 없었습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Qt</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/534</guid>
      <comments>https://1d1cblog.tistory.com/534#entry534comment</comments>
      <pubDate>Wed, 11 Feb 2026 14:49:51 +0900</pubDate>
    </item>
    <item>
      <title>[Qt] QXlsx 사용 시 Cell Hyperlink 걸기</title>
      <link>https://1d1cblog.tistory.com/533</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘에 QXlsx를 이용해서 프로그램의 실행 결과를 자동으로 엑셀로 만들어주는 기능을 작업하고 있습니다.&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;이때 Summary 시트의 결과 셀을 누르면 Log 시트의 특정 Cell로 이동하게 만들고 싶어서 Hyperlink 코드 추가했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Url을 &quot;#시트이름!셀&quot;로 넣고 마지막 &quot;text&quot; 부분에 실제 표시할 텍스트를 넣어주시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1748238346183&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;xlsxdocument.h&amp;gt;
#include &amp;lt;xlsxworksheet.h&amp;gt;

{
    ...;
    
    auto currentSheet = reportFile.currentWorksheet();
    
    QXlsx::Format linkFormat;
    linkFormat.setFontColor(Qt::blue);
    linkFormat.setFontUnderline(QXlsx::Format::FontUnderlineSingle);
    
    QString sLogCellUrl = QString(&quot;#%1!A%2&quot;).arg(&quot;Log&quot;, QString::number(Row));
    currentSheet-&amp;gt;writeHyperlink(nRow, nColumn++, QUrl(sLogCellUrl), linkFormat, &quot;text&quot;);
    ...;
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Qt</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/533</guid>
      <comments>https://1d1cblog.tistory.com/533#entry533comment</comments>
      <pubDate>Mon, 26 May 2025 14:59:59 +0900</pubDate>
    </item>
    <item>
      <title>[Confluence] ScriptRunner 이용하여 버전 댓글 없이 업데이트 시 이메일로 알림</title>
      <link>https://1d1cblog.tistory.com/532</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Confluence에서 페이지를 업데이트할 때 두 가지 옵션이 있습니다. 그냥 [업데이트]와 [업데이트 설정 조정을 통해 버전 댓글을 남겨 업데이트]가 있습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yVSnZ/btsMRi6e5vF/i6s0WTyXz3R1ztJmLUsGE1/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yVSnZ/btsMRi6e5vF/i6s0WTyXz3R1ztJmLUsGE1/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yVSnZ/btsMRi6e5vF/i6s0WTyXz3R1ztJmLUsGE1/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyVSnZ%2FbtsMRi6e5vF%2Fi6s0WTyXz3R1ztJmLUsGE1%2Ftfile.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;249&quot; height=&quot;81&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;버전 댓글을 남기게 된다면 Git에서 Commit 같이 어떤 내용이 변경되었는지 버전 별로 간단하게 메시지를 남길 수 있어 필요한 기능이라고 생각이 되는데 이를 강제할 수 있는 방법은 현재 없는 것으로 보입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YnmN7/btsMPj68ouI/ngn6dYcZyX4mcctwBurib0/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YnmN7/btsMPj68ouI/ngn6dYcZyX4mcctwBurib0/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YnmN7/btsMPj68ouI/ngn6dYcZyX4mcctwBurib0/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYnmN7%2FbtsMPj68ouI%2Fngn6dYcZyX4mcctwBurib0%2Ftfile.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;585&quot; height=&quot;297&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ylhhj/btsMQqqpFZM/mgEvkhIvpGP4vVlJaLjdK1/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ylhhj/btsMQqqpFZM/mgEvkhIvpGP4vVlJaLjdK1/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ylhhj/btsMQqqpFZM/mgEvkhIvpGP4vVlJaLjdK1/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fylhhj%2FbtsMQqqpFZM%2FmgEvkhIvpGP4vVlJaLjdK1%2Ftfile.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;1515&quot; height=&quot;171&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;그래서 사용자가 버전 댓글을 남기지 않고 그냥 업데이트 했을 때 관리자에게 메일을 통해 알려서 버전 댓글을 달 수 있게 하는 방법에 대해 소개하려고 합니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;먼저 gmail의 smtp를 이용하기 위해서 Google [앱 비밀번호]를 먼저 발급받아야 합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJV0G/btsMQclAMWy/grxXakrrTxbziagsBUtijk/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJV0G/btsMQclAMWy/grxXakrrTxbziagsBUtijk/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJV0G/btsMQclAMWy/grxXakrrTxbziagsBUtijk/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJV0G%2FbtsMQclAMWy%2FgrxXakrrTxbziagsBUtijk%2Ftfile.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;381&quot; height=&quot;198&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZYZfw/btsMPI6qyCu/lxZkaCIWizZIRfExsZS64K/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZYZfw/btsMPI6qyCu/lxZkaCIWizZIRfExsZS64K/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZYZfw/btsMPI6qyCu/lxZkaCIWizZIRfExsZS64K/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZYZfw%2FbtsMPI6qyCu%2FlxZkaCIWizZIRfExsZS64K%2Ftfile.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;912&quot; height=&quot;160&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;발급된 [기기용 앱 비밀번호]를 따로 복사 해둡니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caP4IT/btsMP1dBzcL/igYbYqKacqejzWYBsqIen1/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caP4IT/btsMP1dBzcL/igYbYqKacqejzWYBsqIen1/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caP4IT/btsMP1dBzcL/igYbYqKacqejzWYBsqIen1/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaP4IT%2FbtsMP1dBzcL%2FigYbYqKacqejzWYBsqIen1%2Ftfile.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;588&quot; height=&quot;468&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;[ScriptRunner] &amp;gt; [Script Listeners]에서 [Add Listener]를 눌러줍니다. Called에 간단히 제목이나 설명을 추가하고 [On these events]에 우리는 버전 댓글 없이 업데이트 됐을 때니 [Page updated]를 선택합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그리고 Code to Run에 아래 코드를 입력 후 [Save] 합니다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import javax.mail.internet.*
import javax.mail.*

def pageID = page[&quot;id&quot;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 현재 업데이트 된 페이지 ID
def curVerID = page[&quot;version&quot;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 업데이트 된 페이지 현재 버전

def res = get(&quot;/wiki/api/v2/pages/${pageID}/versions&quot;).asObject(Map).body
def value = get(&quot;/wiki/api/v2/pages/${pageID}?expand=body.storage&quot;).asObject(Map).body

def lastVersionRes = res[&quot;results&quot;].find { ver -&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ver[&quot;number&quot;] == curVerID
} // 마지막으로 update 된 버전의 정보

if ( lastVersionRes[&quot;message&quot;] == &quot;&quot; ) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties prop = new Properties()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Enter the details of your SMTP server
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prop.put(&quot;mail.smtp.auth&quot;, true)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prop.put(&quot;mail.smtp.host&quot;, &quot;smtp.gmail.com&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prop.put(&quot;mail.smtp.port&quot;, &quot;587&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prop.put(&quot;mail.smtp.starttls.enable&quot;, &quot;true&quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String emailId = &quot;Gmail ID&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String password = &quot;App Password&quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Session session = Session.getInstance(prop, new Authenticator() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected PasswordAuthentication getPasswordAuthentication() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new PasswordAuthentication(emailId, password)
&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;MimeMessage msg = new MimeMessage(session)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.setFrom(new InternetAddress(emailId, &quot;Confluence Alert&quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.setSubject(&quot;[Confluence] 페이지 업데이트 버전 댓글이 제대로 기록되지 않았습니다.&quot;, &quot;UTF-8&quot;)
	
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String htmlBody = &quot;&quot;&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;html&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;
&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;lt;p&amp;gt;&amp;lt;strong&amp;gt; 업데이트 한 ${page[&quot;title&quot;]}에 버전 댓글이 입력되지 않았습니다.&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
&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;lt;p&amp;gt;&amp;lt;strong&amp;gt; Url = &amp;lt;a href=&quot;${page[&quot;self&quot;]}&quot;&amp;gt;${page[&quot;self&quot;]}&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/html&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&quot;&quot;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.setContent(htmlBody, &quot;text/html; charset=UTF-8&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(&quot;Admin Email&quot;, false))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Transport.send(msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&quot;Email Sent Successfully!!&quot;)
} // 버전 정보가 비어져 있으면 버전 메시지를 추가해서 다시 업데이트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제 Listener를 등록해 놨으니 버전 댓글 없이 업데이트 시 아래처럼 메일이 오게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTMxV/btsMPLvg0xw/IesO2NpqK6HI9SXD6SkfGk/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTMxV/btsMPLvg0xw/IesO2NpqK6HI9SXD6SkfGk/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTMxV/btsMPLvg0xw/IesO2NpqK6HI9SXD6SkfGk/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTMxV%2FbtsMPLvg0xw%2FIesO2NpqK6HI9SXD6SkfGk%2Ftfile.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;635&quot; height=&quot;181&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;그리고 만약에 버전 댓글을 기록하지 않은 버전을 지우고 싶다면 먼저 버전 댓글이 입력되지 않은 상태에서 업데이트 버튼을 누른 후 글의 내용은 일절 수정하지 않고 버전 기록만 남긴 후 업데이트 합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u183O/btsMQm9kGuP/UDdqpFfKNi8p0jFUCR9kk1/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u183O/btsMQm9kGuP/UDdqpFfKNi8p0jFUCR9kk1/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u183O/btsMQm9kGuP/UDdqpFfKNi8p0jFUCR9kk1/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu183O%2FbtsMQm9kGuP%2FUDdqpFfKNi8p0jFUCR9kk1%2Ftfile.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;594&quot; height=&quot;254&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;다음으로 [버전 이력]으로 들어가 버전 이력을 남기지 않은 버전을 삭제합니다.&lt;b&gt;(관리자 계정으로만 가능)&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1517&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IZMmo/btsMQo69L2M/BfazXLnOaJaGqyM3EQTXP1/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IZMmo/btsMQo69L2M/BfazXLnOaJaGqyM3EQTXP1/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IZMmo/btsMQo69L2M/BfazXLnOaJaGqyM3EQTXP1/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIZMmo%2FbtsMQo69L2M%2FBfazXLnOaJaGqyM3EQTXP1%2Ftfile.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;1517&quot; height=&quot;201&quot; data-origin-width=&quot;1517&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;그렇게 되면 버전 이력이 추가된 버전과 그 이전 버전만 남게 되게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBnbJS/btsMRjYn9Bt/5wYpNWtg5Shmn0kp0saDb0/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBnbJS/btsMRjYn9Bt/5wYpNWtg5Shmn0kp0saDb0/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBnbJS/btsMRjYn9Bt/5wYpNWtg5Shmn0kp0saDb0/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBnbJS%2FbtsMRjYn9Bt%2F5wYpNWtg5Shmn0kp0saDb0%2Ftfile.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;1534&quot; height=&quot;237&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Jira&amp;amp;Confluence</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/532</guid>
      <comments>https://1d1cblog.tistory.com/532#entry532comment</comments>
      <pubDate>Thu, 20 Mar 2025 10:52:29 +0900</pubDate>
    </item>
    <item>
      <title>[Jira] ScriptRunner를 이용하여 이슈 상태 바꾸기, 버전 수정하기</title>
      <link>https://1d1cblog.tistory.com/531</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전 ScriptRunner 게시글에서 사용했던것처럼 ScriptRunner를 이용하여 Jira의 상태를 자동으로 변경하고 버전 정보를 넣는 간단한 코드입니다.&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;ScriptRunner &amp;gt; Script Console에서 사용하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1742198103152&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이슈 상태 바꾸고 version 픽스하기
def trans = '이슈 다시 열기'     // 이슈 닫기 or 이슈 다시 열기
def type = 'issue'

Issues.search(&quot;type = &quot; + type).each { issue-&amp;gt;

    if ( issue.getTransitions()['name'].contains(trans) ) {
        logger.warn('Issue = ' + issue.getKey())
        issue.transition(trans)

    }

    if ( issue.getStatus()['name'] == '다시 열림' ) {
        issue.update { 
            setFixVersions {
                add('ver2')
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Jira&amp;amp;Confluence</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/531</guid>
      <comments>https://1d1cblog.tistory.com/531#entry531comment</comments>
      <pubDate>Mon, 17 Mar 2025 16:56:11 +0900</pubDate>
    </item>
    <item>
      <title>[Confluence] 페이지 상태 사용하기</title>
      <link>https://1d1cblog.tistory.com/530</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Confluence 페이지에 특정 상태를 지정해주는 방법입니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;[스페이스 설정]으로 들어간 후 [콘텐츠 상태]로 들어갑니다.&amp;nbsp;&lt;br&gt;여기서 콘텐츠 상태를 활성화 하고 상태를 지정해줍니다.(최대 5개)&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTBmdc/btsMght2Csi/qPsWUsBWU1ommGcrZ68CZ0/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTBmdc/btsMght2Csi/qPsWUsBWU1ommGcrZ68CZ0/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTBmdc/btsMght2Csi/qPsWUsBWU1ommGcrZ68CZ0/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTBmdc%2FbtsMght2Csi%2FqPsWUsBWU1ommGcrZ68CZ0%2Ftfile.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;502&quot; height=&quot;422&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;상태를 지정한 후에는 페이지 편집 화면에서 제목 영역부분으로 커서를 올린 후 [상태]를 통해 지정을 해줄 수 있습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF8NGM/btsMfOME5b8/DHYYKwEhgAnhzavHMiOLgk/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF8NGM/btsMfOME5b8/DHYYKwEhgAnhzavHMiOLgk/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF8NGM/btsMfOME5b8/DHYYKwEhgAnhzavHMiOLgk/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF8NGM%2FbtsMfOME5b8%2FDHYYKwEhgAnhzavHMiOLgk%2Ftfile.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;477&quot; height=&quot;394&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;여기서 만약에 페이지를 만든 후 자동으로 상태를 지정하게 하고 싶다면 [자동화]를 통해 작업이 가능합니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;[자동화] &amp;gt; [규칙 만들기]를 통해 규칙을 생성합니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;여기서 페이지 게시할 때 만약 페이지 상태가 지정되어 있지 않다면 자동으로 기본 상태를 지정하게 됩니다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1457&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DhZ7k/btsMfctLoVh/L397Ep2pru4Q5m9mPQn9m1/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DhZ7k/btsMfctLoVh/L397Ep2pru4Q5m9mPQn9m1/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DhZ7k/btsMfctLoVh/L397Ep2pru4Q5m9mPQn9m1/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDhZ7k%2FbtsMfctLoVh%2FL397Ep2pru4Q5m9mPQn9m1%2Ftfile.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;1457&quot; height=&quot;485&quot; data-origin-width=&quot;1457&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Jira&amp;amp;Confluence</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/530</guid>
      <comments>https://1d1cblog.tistory.com/530#entry530comment</comments>
      <pubDate>Wed, 12 Feb 2025 15:00:48 +0900</pubDate>
    </item>
    <item>
      <title>[Confluence] ScriptRunner를 이용하여 Jira Issue 정보 파싱하기</title>
      <link>https://1d1cblog.tistory.com/529</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Confluence에 기본적으로 매크로들이 많이 제공되지만 ScriptRunner라는 App을 사용하면 REST API를 통해 Jira의 정보들을 사용할 수 있습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;Confluence에서 [앱] &amp;gt; [새 앱 찾기]를 들어가 [ScriptRunner for Confluence]를 설치합니다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;설치가 완료됐으면 [Get Started] 옆에 있는 점 세개 버튼을 눌러 [Configure]로 들어갑니다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dsm5Z/btsMbtORzJq/LX4akHWzfAsNWCi7pJvkD0/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dsm5Z/btsMbtORzJq/LX4akHWzfAsNWCi7pJvkD0/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dsm5Z/btsMbtORzJq/LX4akHWzfAsNWCi7pJvkD0/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDsm5Z%2FbtsMbtORzJq%2FLX4akHWzfAsNWCi7pJvkD0%2Ftfile.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;1281&quot; height=&quot;360&quot; data-origin-width=&quot;1281&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;초기 화면으로 들어오면 여러 탭이 있지만 일단 여기서는 [Script Console]과 [Macros]를 사용해보려고 합니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;[Script Console]을 통해 Jira의 정보를 가져올 REST API 호출문을 먼저 실행해볼 수 있고 원하는 결과가 나왔으면 이제 그 코드로 [Macro]로 만들어줄 예정입니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;[Script Console]에서 아래 코드 입력 화면에 먼저 특정 이슈에 대한 정보를 가져올 수 있는 코드를 실행해보겠습니다.&lt;br&gt;여기서 우리가 필요한것은 Jira의 API Token인데 파싱할 Jira 페이지로 이동합니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;Jira 프로필 사진을 누른 후 [계정 관리]로 들어갑니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;상단 메뉴에서 [보안]으로 이동한 후 하단 [API 토큰]에서 [API 토큰 만들기 및 관리]로 들어갑니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ISu3p/btsMaNAktVR/usuMI3wArKiRDx4tkCCuW0/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ISu3p/btsMaNAktVR/usuMI3wArKiRDx4tkCCuW0/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ISu3p/btsMaNAktVR/usuMI3wArKiRDx4tkCCuW0/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FISu3p%2FbtsMaNAktVR%2FusuMI3wArKiRDx4tkCCuW0%2Ftfile.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;1276&quot; height=&quot;871&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;871&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;[API 토큰 만들기]를 눌러 만들기 후 생성된 토큰 값을 복사해줍니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dco5y/btsL9LpVbQF/y9eXgehlxgSAzRBk9eb1P1/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dco5y/btsL9LpVbQF/y9eXgehlxgSAzRBk9eb1P1/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dco5y/btsL9LpVbQF/y9eXgehlxgSAzRBk9eb1P1/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDco5y%2FbtsL9LpVbQF%2Fy9eXgehlxgSAzRBk9eb1P1%2Ftfile.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;614&quot; height=&quot;419&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDiU8/btsMad0wXum/CFu47yzflDfuvXsioA0Ji0/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDiU8/btsMad0wXum/CFu47yzflDfuvXsioA0Ji0/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDiU8/btsMad0wXum/CFu47yzflDfuvXsioA0Ji0/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDiU8%2FbtsMad0wXum%2FCFu47yzflDfuvXsioA0Ji0%2Ftfile.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;614&quot; height=&quot;279&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;이제 다시 [ScriptRunner for Confluence]의 [Script Console]로 넘어와서 아래 코드 입력 창에 아래와 같이 입력합니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;def issue = get(&quot;https://[도메인].atlassian.net/rest/api/3/issue/[Issue Key]&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.basicAuth(&quot;[아이디]&quot;, &quot;[API Token]&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.header(&quot;Accept&quot;, &quot;application/json&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.asObject(Map).body

return issue.key&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 코드를 각자에 맞게 넣어주신 후 [Run]을 누르면 하단에 해당 Issue의 Key가 출력되게 됩니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;이를 이용해서 매크로를 만들어주려 합니다. [Macros] 탭으로 이동합니다. [Create Custom Macro]를 눌러줍니다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2055&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj947o/btsL9KEyie1/TCyP7kYPDPDKkhhL6ckQeK/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj947o/btsL9KEyie1/TCyP7kYPDPDKkhhL6ckQeK/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj947o/btsL9KEyie1/TCyP7kYPDPDKkhhL6ckQeK/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj947o%2FbtsL9KEyie1%2FTCyP7kYPDPDKkhhL6ckQeK%2Ftfile.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;2055&quot; height=&quot;395&quot; data-origin-width=&quot;2055&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;매크로 이름과 설명을 간단히 작성 후 아래 [parameters]로 이동하여 [Add Parameter]를 선택합니다. 그리고 파라미터로 받을 issueID를 생성 후 [Add]를 눌러줍니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl4kQG/btsL9Lcq5DX/2mchQBOaSDt4botQvT0ONk/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl4kQG/btsL9Lcq5DX/2mchQBOaSDt4botQvT0ONk/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl4kQG/btsL9Lcq5DX/2mchQBOaSDt4botQvT0ONk/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl4kQG%2FbtsL9Lcq5DX%2F2mchQBOaSDt4botQvT0ONk%2Ftfile.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;874&quot; height=&quot;582&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EViEN/btsMbCSjz68/zlWhvy6ikkQObVvFtHaTlk/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EViEN/btsMbCSjz68/zlWhvy6ikkQObVvFtHaTlk/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EViEN/btsMbCSjz68/zlWhvy6ikkQObVvFtHaTlk/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEViEN%2FbtsMbCSjz68%2FzlWhvy6ikkQObVvFtHaTlk%2Ftfile.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;613&quot; height=&quot;667&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;이제 우리는 아까 [Issue Key] 부분을 우리가 전달한 parameter로 대체하게 되는데 [Script to execute]에 아래 코드를 넣어줍니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;def issue = get(&quot;https://[도메인].atlassian.net/rest/api/3/issue/${parameters.issueID}&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.basicAuth(&quot;[아이디]&quot;, &quot;[API Token]&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.header(&quot;Accept&quot;, &quot;application/json&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.asObject(Map).body

return issue.key&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이제 [Save]로 매크로를 저장해주고 Confluence Page를 하나 생성한 후 &quot;/만든 매크로 이름&quot;을 선택 하고 설정한 파라미터에 원하는 키를 입력하면 됩니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coegOF/btsMaOeUWPm/uFrbe9nT7MLXoaGIedY200/tfile.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coegOF/btsMaOeUWPm/uFrbe9nT7MLXoaGIedY200/tfile.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coegOF/btsMaOeUWPm/uFrbe9nT7MLXoaGIedY200/tfile.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoegOF%2FbtsMaOeUWPm%2FuFrbe9nT7MLXoaGIedY200%2Ftfile.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;1640&quot; height=&quot;269&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Jira&amp;amp;Confluence</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/529</guid>
      <comments>https://1d1cblog.tistory.com/529#entry529comment</comments>
      <pubDate>Fri, 7 Feb 2025 15:24:10 +0900</pubDate>
    </item>
    <item>
      <title>[C++] enum 값 증가 연산자 사용하기</title>
      <link>https://1d1cblog.tistory.com/528</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;enum 값을 사용할 때 for 문으로 enum 값을 증가시키면서 사용하는 방식을 사용할 수도 있습니다. 이럴 때 enum을 정의한 후 바로 증가 연산자를 사용할 수 없고 operator++를 재정의 해주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733724126119&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum fruit {
	frApple,
    frOrange,
    
    num_of_fruit
};

fruit&amp;amp; operator++(fruit&amp;amp; fr) {
    fr = static_cast&amp;lt;fruit&amp;gt;(static_cast&amp;lt;int&amp;gt;(fr) + 1);
    return fr;
}

fruit operator++(fruit&amp;amp; fr, int) {
    fruit temp = fr;
    fr = static_cast&amp;lt;fruit&amp;gt;(static_cast&amp;lt;int&amp;gt;(fr) + 1);
    if (fr &amp;gt; num_of_fruit) {
        fr = num_of_fruit;  
    }
    return temp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 operator++는 전위 증가 연산자를 위한 재정의, 두 번째 operator++는 후위 증가 연산자를 위한 재정의 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/C++</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/528</guid>
      <comments>https://1d1cblog.tistory.com/528#entry528comment</comments>
      <pubDate>Mon, 9 Dec 2024 15:02:55 +0900</pubDate>
    </item>
    <item>
      <title>[Qt] QTreewidget 메모리 해제 없이 비우기</title>
      <link>https://1d1cblog.tistory.com/527</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 QTreeWidget에서 아이템을 싹 비우려고 할 때 Clear() 함수를 많이 사용합니다. 하지만 이 함수의 경우 QTreeWidget에 가지고 있는 아이템들의 메모리를 해제시키기 때문에 아래와 같이 아이템을 다시 불러오려고 할 때 문제가 생기게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732689588426&quot; class=&quot;cpp&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;class Test {
    Test(uchar nItemCount) {
    	for ( int i=0; i &amp;lt; nItemCount; i++ ) {
    		QTreeWidgetItem* it = new QTreeWidgetItem;
        	items.append(it);
        }
    }
    QList&amp;lt;QTreeWidgetItem*&amp;gt; getItems() { return Items; }
    
	QList&amp;lt;QTreeWidgetItem*&amp;gt; Items;
};

int main() {
    Test* t1 = new Test(3);
    Test* t2 = new Test(10);
    
    auto items = t1-&amp;gt;getItems();
    for ( auto i : items ) {
    	ui-&amp;gt;tree-&amp;gt;addTopLevelCount(i);
    }
    
    ui-&amp;gt;tree-&amp;gt;clear();		// t1이 갖고 있는 item들 delete 됨
    
    auto items = t2-&amp;gt;getItems();
    for ( auto i : items ) {
    	ui-&amp;gt;tree-&amp;gt;addTopLevelCount(i);
    }
    
    ui-&amp;gt;tree-&amp;gt;clear();		// t2이 갖고 있는 item들 delete 됨
    
    auto items = t1-&amp;gt;getItems();
    for ( auto i : items ) {
    	ui-&amp;gt;tree-&amp;gt;addTopLevelCount(i);		// i는 쓰레기 값
    }
    
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴때는 clear를 사용하는 것이 아닌 takeTopLevelItem을 통해 단순히 트리에서 제거해주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732689812367&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (topLevelItemCount() &amp;gt; 0) {
    takeTopLevelItem(0);
} // clear but not delete items&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Qt</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/527</guid>
      <comments>https://1d1cblog.tistory.com/527#entry527comment</comments>
      <pubDate>Wed, 27 Nov 2024 15:43:47 +0900</pubDate>
    </item>
    <item>
      <title>[Excel] 엑셀 파란 새로 점선이 갑자기 나오는 경우</title>
      <link>https://1d1cblog.tistory.com/526</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;엑셀을 잘 사용하다가 갑자기 아래 사진과 같이 파란색 굵은 점선이 보이는 경우가 있을 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmutq/btsKRm5M7rS/rhPAuyGkSpTwmsklH2khuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmutq/btsKRm5M7rS/rhPAuyGkSpTwmsklH2khuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmutq/btsKRm5M7rS/rhPAuyGkSpTwmsklH2khuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqmutq%2FbtsKRm5M7rS%2FrhPAuyGkSpTwmsklH2khuk%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;1089&quot; height=&quot;831&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이럴때 [보기] &amp;gt; [페이지 나누기 미리 보기]를 [기본]으로 선택하면 파란 선은 나오지 않습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2ylP/btsKSH8E9Kj/4eJyq19ebBtRiUoS5kkrUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2ylP/btsKSH8E9Kj/4eJyq19ebBtRiUoS5kkrUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2ylP/btsKSH8E9Kj/4eJyq19ebBtRiUoS5kkrUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2ylP%2FbtsKSH8E9Kj%2F4eJyq19ebBtRiUoS5kkrUK%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;995&quot; height=&quot;639&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;하지만 이렇게 해도 점선은 보이게 되는데 이 영역은 결국 페이지 미리보기 즉 인쇄됐을 때 한 페이지 당 출력되는 내용을 미리 볼 수 있는 건데 이렇게 작은 단위로 잘게 쪼개져 있다면 용지 크기를 한번 확인해 볼 필요가 있습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;확인해보니 A4와 같은 일반적인 페이지 크기가 아닌 다른 유형이 있는 것을 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyIf98/btsKRx0wMZe/dKOXFeZ2qmByQMXWWQCT10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyIf98/btsKRx0wMZe/dKOXFeZ2qmByQMXWWQCT10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyIf98/btsKRx0wMZe/dKOXFeZ2qmByQMXWWQCT10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyIf98%2FbtsKRx0wMZe%2FdKOXFeZ2qmByQMXWWQCT10%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;350&quot; height=&quot;917&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;이 경우는 라벨 프린터기나 다른 프린터 제품을 사용할 때 볼 수 있는데 이럴때는 [파일] &amp;gt; [인쇄]를 클릭해서 프린터를 변경해보시면 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0xx08/btsKR7twpxQ/nqs3Sjk2oBtJdGQQfW1ha1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0xx08/btsKR7twpxQ/nqs3Sjk2oBtJdGQQfW1ha1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0xx08/btsKR7twpxQ/nqs3Sjk2oBtJdGQQfW1ha1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0xx08%2FbtsKR7twpxQ%2Fnqs3Sjk2oBtJdGQQfW1ha1%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;496&quot; height=&quot;449&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;변경이 완료됐다면 [보기] &amp;gt; [페이지 나누기 미리 보기]를 선택해도 정상적으로 보이게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfsRYf/btsKRcvv8eD/ktjonhc1f9xvS54fUrClP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfsRYf/btsKRcvv8eD/ktjonhc1f9xvS54fUrClP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfsRYf/btsKRcvv8eD/ktjonhc1f9xvS54fUrClP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfsRYf%2FbtsKRcvv8eD%2Fktjonhc1f9xvS54fUrClP0%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;1079&quot; height=&quot;710&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9zf0y/btsKQ6PFhJj/kJVqBbUFKCOqtPLcmZd5z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9zf0y/btsKQ6PFhJj/kJVqBbUFKCOqtPLcmZd5z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9zf0y/btsKQ6PFhJj/kJVqBbUFKCOqtPLcmZd5z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9zf0y%2FbtsKQ6PFhJj%2FkJVqBbUFKCOqtPLcmZd5z1%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;1082&quot; height=&quot;847&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/526</guid>
      <comments>https://1d1cblog.tistory.com/526#entry526comment</comments>
      <pubDate>Fri, 22 Nov 2024 13:31:55 +0900</pubDate>
    </item>
    <item>
      <title>[Qt] QtConcurrent mappedReduced 사용하기</title>
      <link>https://1d1cblog.tistory.com/525</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;예전 포스팅에서 소개했던 QtConcurrent를 사용하면 간단하고 Qt Event에 특화된 비동기 처리가 가능합니다. 이 QtConcorruent에서 제공하는 map-reduce 패턴을 사용할 수 있습니다.&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;map-reduce 패턴을 간단히 설명하자면 수행할 작업을 분산하여 처리하고 하나로 모은다고 생각하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QtConcurrent::mappedReuced 함수 원형입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731031108944&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;typename Sequence, typename MapFunction, typename ReduceFunction&amp;gt;
QFuture&amp;lt;typename QtPrivate::MapResultType&amp;lt;MapFunction, Sequence&amp;gt;::ResultType&amp;gt;
mappedReduced(const Sequence &amp;amp;sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions options = QtConcurrent::SequentialReduce);&lt;/code&gt;&lt;/pre&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sequence : 처리할 데이터 셋(QList, QVector)&lt;/li&gt;
&lt;li&gt;mapFunction : 데이터가 처리될 함수 전달&lt;/li&gt;
&lt;li&gt;reduceFunction : 각각 분산되어 처리된 데이터를 하나로 모으는 함수 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환 값은 QFuture 데이터가 반환되며 비동기 상태를 관리하는 객체입니다. waitForResult 함수로 처리가 끝날때까지 대기가 가능하며 result 함수로 처리 결과를 받을 수 있습니다.&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;아래 코드는 QtConcurrent::mappedReduced를 사용하는 간단한 예제입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 .pro에 concurrent 모듈을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731031941201&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;QT = core concurrent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달되는 Function을 람다로 처리하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731031265389&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;QtConcurrent&amp;gt;
#include &amp;lt;QFuture&amp;gt;
#include &amp;lt;QList&amp;gt;
#include &amp;lt;iostream&amp;gt;


int main() {
    QList&amp;lt;int&amp;gt; data;
    for ( int i=0; i&amp;lt;= 100; i++ ) {
        data.append(i);
    }

    auto mapFunction = [&amp;amp;] ( int value ) -&amp;gt; int {
        qDebug() &amp;lt;&amp;lt; &quot;Map : &quot; &amp;lt;&amp;lt; &quot;value = &quot; &amp;lt;&amp;lt; value;
        return value * 2;
    };

    auto reduceFunction = [&amp;amp;] ( int &amp;amp;result, int value ) {
        result += value;
        qDebug() &amp;lt;&amp;lt; &quot;Reduce : &quot; &amp;lt;&amp;lt; &quot;Origin Value = &quot; &amp;lt;&amp;lt; value / 2 &amp;lt;&amp;lt; &quot;Value = &quot; &amp;lt;&amp;lt; value &amp;lt;&amp;lt; &quot; Result = &quot; &amp;lt;&amp;lt; result;
    };

    // mappedReduced 호출
    QFuture&amp;lt;int&amp;gt; future = QtConcurrent::mappedReduced(data, mapFunction, reduceFunction, QtConcurrent::SequentialReduce);

    // 작업 완료 대기 및 결과 출력
    future.waitForFinished();
    int result = future.result();
    std::cout &amp;lt;&amp;lt; &quot;Result: &quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; std::endl; // 출력 예시: 30

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1731031705592&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 실행 결과
Map :  value =  0
Map :  value =  1
Map :  value =  2
Map :  value =  3
Map :  value =  4
Map :  value =  5
Map :  value =  7
Map :  value =  6
Map :  value =  8
Map :  value =  10
Map :  value =  9
/* 중략 */
Reduce :  Origin Value =  91 Value =  182  Result =  8372
Reduce :  Origin Value =  92 Value =  184  Result =  8556
Reduce :  Origin Value =  93 Value =  186  Result =  8742
Reduce :  Origin Value =  94 Value =  188  Result =  8930
Reduce :  Origin Value =  95 Value =  190  Result =  9120
Reduce :  Origin Value =  96 Value =  192  Result =  9312
Reduce :  Origin Value =  97 Value =  194  Result =  9506
Reduce :  Origin Value =  98 Value =  196  Result =  9702
Reduce :  Origin Value =  99 Value =  198  Result =  9900
Reduce :  Origin Value =  100 Value =  200  Result =  10100
Result: 10100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Qt</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>_SYPark</author>
      <guid isPermaLink="true">https://1d1cblog.tistory.com/525</guid>
      <comments>https://1d1cblog.tistory.com/525#entry525comment</comments>
      <pubDate>Fri, 8 Nov 2024 13:08:29 +0900</pubDate>
    </item>
  </channel>
</rss>