<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>yellowcard</title>
    <link>https://yellowcard.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 24 Aug 2026 08:25:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yellowcard</managingEditor>
    <item>
      <title>데이터베이스 엔진 복구 핸들에서 대기하지 못했습니다.SQL Server 오류 로그에서 잠재적 원인 확인</title>
      <link>https://yellowcard.tistory.com/675</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스 엔진 복구 핸들에서 대기하지 못했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 오류 로그에서 잠재적 원인 확인&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 2012 Developer Edition을 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 2012 Express and Enterprise 에디션을 사용해 보았지만 모두 동일한 오류가 발생했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택 오버플로우에 대한 게시물이 거의 없을 뿐만 아니라 msdn 블로그도 찾아 보았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 아무것도 도움이 되지 않았답니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/Zuc4C.jpg&quot; alt=&quot;Error Details&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/P58q1.jpg&quot; alt=&quot;Installation failed&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류 로그 상세 내역입니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Overall summary:
Final result:                  Failed: see details below
Exit code (Decimal):           -2061893606
Start time:                    2013-10-21 12:58:05
End time:                      2013-10-21 13:52:30
Requested action:              Install

Setup completed with required actions for features.
Troubleshooting information for those features:
Next step for RS:              Use the following information to resolve the error,  uninstall this feature, and then run the setup process again.
Next step for SQLEngine:       Use the following information to resolve the error,  uninstall this feature, and then run the setup process again.
Next step for DQ:              Use the following information to resolve the error, uninstall this feature, and then run the setup process again.
Next step for FullText:        Use the following information to resolve the error, uninstall this feature, and then run the setup process again.
Next step for Replication:     Use the following information to resolve the error, uninstall this feature, and then run the setup process again.


Machine Properties:
  Machine name:                  CROY-TOSH
  Machine processor count:       4
  OS version:                    Windows 7
  OS service pack:               Service Pack 1
  OS region:                     United States
  OS language:                   English (United States)
  OS architecture:               x64
  Process architecture:          64 Bit
  OS clustered:                  No

Product features discovered:
  Product              Instance             Instance ID                    Feature                                       Language             Edition              Version         Clustered 

 Package properties:
   Description:                   Microsoft SQL Server 2012 Service Pack 1
   ProductName:                   SQL Server 2012
   Type:                          RTM
   Version:                       11
   SPLevel:                       0
   Installation location:         C:\Users\CRoy\Downloads\SQL Server 2012 Developer  Edition (x86 and x64) - DVD (English)\x64\setup\
   Installation edition:          Developer

 Product Update Status:
  None discovered.

User Input Settings:
 ACTION:                        Install
 ADDCURRENTUSERASSQLADMIN:      false
 AGTSVCACCOUNT:                 NT Service\SQLSERVERAGENT
 AGTSVCPASSWORD:                *****
 AGTSVCSTARTUPTYPE:             Manual
 ASBACKUPDIR:                   C:\Program Files\Microsoft SQL     Server\MSAS11.MSSQLSERVER\OLAP\Backup
 ASCOLLATION:                   Latin1_General_CI_AI
 ASCONFIGDIR:                   C:\Program Files\Microsoft SQL     Server\MSAS11.MSSQLSERVER\OLAP\Config
 ASDATADIR:                     C:\Program Files\Microsoft SQL  Server\MSAS11.MSSQLSERVER\OLAP\Data
 ASLOGDIR:                      C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Log
ASPROVIDERMSOLAP:              1
ASSERVERMODE:                  MULTIDIMENSIONAL
ASSVCACCOUNT:                  NT Service\MSSQLServerOLAPService
ASSVCPASSWORD:                 &amp;lt;empty&amp;gt;
ASSVCSTARTUPTYPE:              Automatic
ASSYSADMINACCOUNTS:            CRoy-TOSH\CRoy
ASTEMPDIR:                     C:\Program Files\Microsoft SQL   Server\MSAS11.MSSQLSERVER\OLAP\Temp
BROWSERSVCSTARTUPTYPE:         Disabled
CLTCTLRNAME:                   ROY
CLTRESULTDIR:                  C:\Program Files (x86)\Microsoft SQL  Server\DReplayClient\ResultDir\
CLTSTARTUPTYPE:                Manual
CLTSVCACCOUNT:                 NT Service\SQL Server Distributed Replay Client
CLTSVCPASSWORD:                &amp;lt;empty&amp;gt;
CLTWORKINGDIR:                 C:\Program Files (x86)\Microsoft SQL Server\DReplayClient\WorkingDir\
COMMFABRICENCRYPTION:          0
COMMFABRICNETWORKLEVEL:        0
COMMFABRICPORT:                0
CONFIGURATIONFILE:             C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Log\20131021_125116\ConfigurationFile.ini
CTLRSTARTUPTYPE:               Manual
CTLRSVCACCOUNT:                NT Service\SQL Server Distributed Replay Controller
CTLRSVCPASSWORD:               &amp;lt;empty&amp;gt;
CTLRUSERS:                     CRoy-TOSH\CRoy
ENABLERANU:                    false
ENU:                           true
ERRORREPORTING:                true
FEATURES:                      SQLENGINE, REPLICATION, FULLTEXT, DQ, AS, RS, RS_SHP,  RS_SHPWFE, DQC, BIDS, CONN, IS, BC, SDK, BOL, SSMS, ADV_SSMS, DREPLAY_CTLR, DREPLAY_CLT,  SNAC_SDK, MDS
FILESTREAMLEVEL:               2
FILESTREAMSHARENAME:           MSSQLSERVER
FTSVCACCOUNT:                  NT Service\MSSQLFDLauncher
FTSVCPASSWORD:                 &amp;lt;empty&amp;gt;
HELP:                          false
IACCEPTSQLSERVERLICENSETERMS:  false
INDICATEPROGRESS:              false
INSTALLSHAREDDIR:              C:\Program Files\Microsoft SQL Server\
INSTALLSHAREDWOWDIR:           C:\Program Files (x86)\Microsoft SQL Server\
INSTALLSQLDATADIR:             &amp;lt;empty&amp;gt;
INSTANCEDIR:                   C:\Program Files\Microsoft SQL Server\
INSTANCEID:                    MSSQLSERVER
INSTANCENAME:                  MSSQLSERVER
ISSVCACCOUNT:                  NT Service\MsDtsServer110
ISSVCPASSWORD:                 &amp;lt;empty&amp;gt;
ISSVCSTARTUPTYPE:              Automatic
MATRIXCMBRICKCOMMPORT:         0
MATRIXCMSERVERNAME:            &amp;lt;empty&amp;gt;
MATRIXNAME:                    &amp;lt;empty&amp;gt;
NPENABLED:                     0
PID:                           *****
QUIET:                         false
QUIETSIMPLE:                   false
ROLE:                          &amp;lt;empty&amp;gt;
RSINSTALLMODE:                 DefaultNativeMode
RSSHPINSTALLMODE:              SharePointFilesOnlyMode
RSSVCACCOUNT:                  NT Service\ReportServer
RSSVCPASSWORD:                 &amp;lt;empty&amp;gt;
RSSVCSTARTUPTYPE:              Automatic
SAPWD:                         *****
SECURITYMODE:                  SQL
SQLBACKUPDIR:                  &amp;lt;empty&amp;gt;
SQLCOLLATION:                  Latin1_General_CI_AI
SQLSVCACCOUNT:                 NT Service\MSSQLSERVER
 SQLSVCPASSWORD:                *****
 SQLSVCSTARTUPTYPE:             Automatic
 SQLSYSADMINACCOUNTS:           CRoy-TOSH\CRoy
 SQLTEMPDBDIR:                  &amp;lt;empty&amp;gt;
 SQLTEMPDBLOGDIR:               &amp;lt;empty&amp;gt;
 SQLUSERDBDIR:                  &amp;lt;empty&amp;gt;
 SQLUSERDBLOGDIR:               &amp;lt;empty&amp;gt;
 SQMREPORTING:                  false
 TCPENABLED:                    0
 UIMODE:                        Normal
 UpdateEnabled:                 true
 UpdateSource:                  MU
 X86:                           false

 Configuration file:            C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Log\20131021_125116\ConfigurationFile.ini

Detailed results:
Feature:                       Management Tools - Complete
Status:                        Passed

Feature:                       Client Tools Connectivity
Status:                        Passed

 Feature:                       Client Tools SDK
 Status:                        Passed

Feature:                       Client Tools Backwards Compatibility
Status:                        Passed

Feature:                       Management Tools - Basic
Status:                        Passed

Feature:                       SQL Server Data Tools
Status:                        Passed

Feature:                       Reporting Services - Native
Status:                        Failed: see logs for details
Reason for failure:            An error occurred for a dependency of the feature causing the setup process for the feature to fail.
Next Step:                     Use the following information to resolve the error, uninstall this feature, and then run the setup process again.
 Component name:                SQL Server Database Engine Services Instance Features
 Component error code:          0x851A001A
 Error description:             Wait on the Database Engine recovery handle failed. Check the SQL Server error log for potential causes.
 Error help link:               http://go.microsoft.com/fwlink?LinkId=20476&amp;amp;ProdName=Microsoft+SQL+Server&amp;amp;EvtSrc=setup.rll&amp;amp;EvtID=50000&amp;amp;ProdVer=11.0.3128.0&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026

 Feature:                       Database Engine Services
 Status:                        Failed: see logs for details
  Reason for failure:            An error occurred during the setup process of the feature.
 Next Step:                     Use the following information to resolve the error,  uninstall this feature, and then run the setup process again.
 Component name:                SQL Server Database Engine Services Instance Features
 Component error code:          0x851A001A
 Error description:             Wait on the Database Engine recovery handle failed. Check the SQL Server error log for potential causes.
 Error help link:               http://go.microsoft.com/fwlink?LinkId=20476&amp;amp;ProdName=Microsoft+SQL+Server&amp;amp;EvtSrc=setup.rll&amp;amp;EvtID=50000&amp;amp;ProdVer=11.0.3128.0&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026

 Feature:                       Data Quality Services
 Status:                        Failed: see logs for details
 Reason for failure:            An error occurred for a dependency of the feature causing the setup process for the feature to fail.
 Next Step:                     Use the following information to resolve the error, uninstall this feature, and then run the setup process again.
 Component name:                SQL Server Database Engine Services Instance Features
 Component error code:          0x851A001A
 Error description:             Wait on the Database Engine recovery handle failed. Check the SQL Server error log for potential causes.
 Error help link:               http://go.microsoft.com/fwlink?LinkId=20476&amp;amp;ProdName=Microsoft+SQL+Server&amp;amp;EvtSrc=setup.rll&amp;amp;EvtID=50000&amp;amp;ProdVer=11.0.3128.0&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026

 Feature:                       Full-Text and Semantic Extractions for Search
 Status:                        Failed: see logs for details
 Reason for failure:            An error occurred for a dependency of the feature causing the setup process for the feature to fail.
  Next Step:                     Use the following information to resolve the error,  uninstall this feature, and then run the setup process again.
  Component name:                SQL Server Database Engine Services Instance Features
  Component error code:          0x851A001A
  Error description:             Wait on the Database Engine recovery handle failed. Check the SQL Server error log for potential causes.
  Error help link:               http://go.microsoft.com/fwlink?LinkId=20476&amp;amp;ProdName=Microsoft+SQL+Server&amp;amp;EvtSrc=setup.rll&amp;amp;EvtID=50000&amp;amp;ProdVer=11.0.3128.0&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026

 Feature:                       SQL Server Replication
 Status:                        Failed: see logs for details
 Reason for failure:            An error occurred for a dependency of the feature causing the setup process for the feature to fail.
 Next Step:                     Use the following information to resolve the error,  uninstall this feature, and then run the setup process again.
 Component name:                SQL Server Database Engine Services Instance Features
 Component error code:          0x851A001A
 Error description:             Wait on the Database Engine recovery handle failed. Check the SQL Server error log for potential causes.
 Error help link:               http://go.microsoft.com/fwlink?LinkId=20476&amp;amp;ProdName=Microsoft+SQL+Server&amp;amp;EvtSrc=setup.rll&amp;amp;EvtID=50000&amp;amp;ProdVer=11.0.3128.0&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026&amp;amp;EvtType=0xD15B4EB2%400x4BDAF9BA%401306%4026

 Feature:                       Master Data Services
 Status:                        Passed

 Feature:                       Distributed Replay Client
 Status:                        Passed

  Feature:                       Distributed Replay Controller
  Status:                        Passed

 Feature:                       Integration Services
 Status:                        Passed

 Feature:                       Data Quality Client
 Status:                        Passed

 Feature:                       Analysis Services
 Status:                        Passed

 Feature:                       Reporting Services - SharePoint
 Status:                        Passed

 Feature:                       Reporting Services Add-in for SharePoint Products
 Status:                        Passed

 Feature:                       SQL Browser
 Status:                        Passed

 Feature:                       Documentation Components
 Status:                        Passed

 Feature:                       SQL Writer
 Status:                        Passed

 Feature:                       SQL Client Connectivity
 Status:                        Passed

 Feature:                       SQL Client Connectivity SDK
 Status:                        Passed

 Rules with failures:

 Global rules:

 Scenario specific rules:

 Rules report file:               C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Log\20131021_125116\SystemConfigurationCheck_Report.htm
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 링크 몇 개가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/b/sqljourney/archive/2012/03/16/sql-2008-r2-setup-fails-with-quot-wait-on-the-database-engine-recovery-handle-failed-quot.aspx&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블로그 MSDN&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/17613094/wait-on-the-database-engine-recovery-handle-failed-sql-server-2012-installatio&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택 오버플로1&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/12195300/wait-on-the-database-engine-recovery-handle-failed&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택 오버플로2&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래가 저에게 도움이 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버 구성 화면에서 Database Engine Service의 계정 이름을 NT AURTH\NETWORK SERVICE로 변경하고 설치를 계속하면 오류 없이 모든 구성 요소를 성공적으로 설치할 수 있습니다. - 자세한 내용은 다음 사이트를 참조하십시오. https://superpctricks.com/sql-install-error-database-engine-recovery-handle-failed/&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows 11(윈도우 11) 이상의 디스크에서 이 오류가 발생하는 새로운 원인이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 새 디스크의 섹터 크기가 4KB를 초과하여 SQL 서버에서 처리할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/troubleshoot/sql/admin/troubleshoot-os-4kb-disk-sector-size&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마이크로소프트 문서&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원인&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스를 시작하는 동안 SQL Server는 데이터베이스 일관성을 보장하기 위해 데이터베이스 복구 프로세스를 시작합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 데이터베이스 복구 프로세스의 일부에는 시스템 및 사용자 데이터베이스 파일을 열기 위한 작업을 시도하기 전에 기본 파일 시스템에 대한 일관성 검사가 포함됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows 11을 실행하는 시스템에서 일부 새 스토리지 장치와 장치 드라이버는 지원되는 4KB 섹터 크기보다 큰 디스크 섹터 크기를 노출합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 SQL Server가 현재 512바이트 및 4KB의 섹터 스토리지 크기를 지원하므로 지원되지 않는 파일 시스템으로 인해 SQL Server를 시작할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 명령을 실행하면 이 특정 문제가 발생했음을 확인할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콘솔&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fsutil fsinfo sectorinfo &amp;lt;volume pathname&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바이트 단위로 반환된 PhysicalBytesPerSectorForAtomicity 값을 찾습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;4096 값은 섹터 스토리지 크기가 4KB임을 나타내며 이 문제를 발생시킬 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트 해상도&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리자로서 명령 프롬프트&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REG ADD &quot;HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device&quot; /v &quot;ForcedPhysicalSectorSizeInBytes&quot; /t   REG_MULTI_SZ /d &quot;* 4095&quot; /f
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키가 성공적으로 추가되었는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REG QUERY &quot;HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device&quot; /v &quot;ForcedPhysicalSectorSizeInBytes&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 설치할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SQL SERVER&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;거래처를 바꾸지 않고 평소처럼 말입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성공적으로 설치하려면 컴퓨터를 다시 시작해야 할 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 &lt;strong&gt;경우 SQL&lt;/strong&gt; Server &lt;strong&gt;Database Engine 서비스&lt;/strong&gt; 시작 &lt;strong&gt;계정&lt;/strong&gt;을 NT &lt;strong&gt;AUTURE\NETWORK SERVICE&lt;/strong&gt;로 설정하지 못했지만 &lt;strong&gt;NT AUTURE&lt;/strong&gt;&lt;strong&gt;\&lt;/strong&gt;로 설정했습니다&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;시스템&lt;/strong&gt;을 통해 SQL Server 2016 STD 인스턴스를 성공적으로 설치할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 스냅샷만 확인하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/JIIGh.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/JIIGh.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 https://dba.stackexchange.com/a/71798/66179 에서 @Shanky의 답변을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;setup의 &lt;a href=&quot;https://superuser.com/a/863738/56033&quot;&gt;SkipRules&lt;/a&gt; 스위치를 사용하면 서버 재부팅을 피할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;setup.exe /ACTION=INSTALL /SkipRules=RebootRequiredCheck

setup.exe /ACTION=UNINSTALL /SkipRules=RebootRequiredCheck
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단한 단계&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오픈 SQL 서버 구성 관리자 1명&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server Services 아래에서 서버 선택&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마우스 오른쪽 단추를 누른 후 속성 선택&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로그온 탭 변경 내장 계정 체크 표시&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;드롭다운 목록에서 네트워크 서비스를 선택합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스 적용 및 시작&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 게시물은 SQL Server 2017 Express에 보안 패치 KB4505224를 설치할 때 받은 오류 메시지를 구글에 검색하면 표시됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 것들 중 어떤 것도 저에게 효과가 없었지만, 노력하는 데 몇 시간이 걸렸습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://dba.stackexchange.com/a/217762/186591&quot;&gt;여기&lt;/a&gt;서 부분적으로 제게 해결책은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 서버 제거&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지역 설정 / 관리 / 시스템 로케일에서 &quot;Beta: UTF-8 지원&quot;은 꺼져 있어야 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 다시 설치&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows(윈도우)에서 패치를 설치하도록 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 모든 것이 잘 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://dba.stackexchange.com/a/217762/186591&quot;&gt;이것&lt;/a&gt;에 대해서 더 알아보겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;근본 원인:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스를 시작하는 데 사용된 사용자 계정의 사용자 프로파일이 손상되었습니다.&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기의 주 스레드는 DB 엔진을 시작하는 데 사용되는 계정에 대한 손상된 사용자 계정 프로파일인 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치 중에 &quot;SQL Server Database&quot; 엔진에 대해 지정된 계정입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;setup event log에는 다음 항목으로도 표시됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQLSVCACCOUNT:                 NT AUTHORITY\SYSTEM
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/19791056/3063884&quot;&gt;@royki&lt;/a&gt;에서 제공한 링크에 따르면:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 경우 이 문제의 근본 원인은 서비스 계정(로컬 시스템의 경우)에 사용되는 사용자의 프로필이 손상되었기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 다른 응답자들이 다른 계정으로 변경한 후 성공한 이유를 설명해 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/29738200/3063884&quot;&gt;bmjjjr&lt;/a&gt;는 &quot;NT AUTHEROUTH\NETWORK SERVICE&quot;로 변경할 것을 제안합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@bmjjr에 대한 코멘트는 &quot;&lt;em&gt;NT AUTHEROUTH\LOCAL SERVICE를 사용했습니다.&lt;/em&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt; 그것도 도움이 됐습니다.&quot;&lt;/em&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/44009608/3063884&quot;&gt;@줄리오 노브레&lt;/a&gt;는 &quot;NT Authority&quot;로 성공을 거두었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템 &quot;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수정: 손상된 사용자 프로파일을 재설정합니다.&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류의 원인이 되는 사용자 프로파일을 수정하려면 &lt;a href=&quot;https://support.microsoft.com/en-us/help/947215/you-receive-a-the-user-profile-service-failed-the-logon-error-message#letmefixit&quot; rel=&quot;noreferrer&quot;&gt;KB947215&lt;/a&gt;에 나열된 단계를 따릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;KB947215의 주요 단계는 다음과 같이 요약됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;regedit&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음으로 이동&lt;/font&gt;&lt;/font&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;손상된 프로파일에 대해 SID로 이동합니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SID를 찾으려면 각 SID GUID를 클릭하고 해당 값을 검토합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ProfileImagePath&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가치를 평가하고 정확한 계정인지 확인합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템 계정의 경우 장애가 발생한 계정의 SID를 알 수 있는 다른 방법이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주요 &lt;em&gt;시스템&lt;/em&gt; 계정 SID는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SID          Name               Also Known As
S-1-5-18     Local System       NT AUTHORITY\SYSTEM
S-1-5-19     LocalService       NT AUTHORITY\LOCAL SERVICE
S-1-5-20     NetworkService     NT AUTHORITY\NETWORK SERVICE
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가 SID에 대한 자세한 내용은 &lt;em&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/help/243330/well-known-security-identifiers-in-windows-operating-systems&quot; rel=&quot;noreferrer&quot;&gt;Windows 운영 체제&lt;/a&gt;&lt;/em&gt;의 잘 &lt;em&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/help/243330/well-known-security-identifiers-in-windows-operating-systems&quot; rel=&quot;noreferrer&quot;&gt;알려진 보안 식별자&lt;/a&gt;&lt;/em&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;ol start=&quot;4&quot;&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 SID의 끝에 두 개의 항목(예: .bak)이 있거나 문제의 SID가 .bak로 끝나는 경우 &lt;a href=&quot;https://support.microsoft.com/en-us/help/947215/you-receive-a-the-user-profile-service-failed-the-logon-error-message#letmefixit&quot; rel=&quot;noreferrer&quot;&gt;KB947215&lt;/a&gt; 문서의 단계를 주의 깊게 따라야 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음에 대한 값 재설정&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RefCount&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;State&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;되려고&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재부팅.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Server 설치를 다시 시도합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 같은 문제에 직면해 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 버전(2019, 2022 dev 및 exp)을 몇 번이고 다시 설치하려고 했지만 처음에는 아무 도움이 되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;계좌번호 NT AURTHERIUS\NETWORK SERVICE &amp;amp; NT AURTHERIUS\LOCAL SYSTEM 설정을 시도했습니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나중에 명령을 실행했습니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;REG 추가 &quot;HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters&quot;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치&quot; /v &quot;강제 물리적 섹터 크기&quot;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;InBytes&quot; /tREG_MULTI_SZ /d &quot;* 4095&quot; /f&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나중에 비슷한 단계로 성공적으로 설치할 수 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 설치에 실패했고 시스템에 일부 흔적이 남아 있을 수 있다는 점만 기억하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전에 설치된 버전의 각 인스턴스를 제거합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 가능한 모든 위치(C:\Program Files\Microsoft SQL Server 및 C:\Program Files(x86)\Microsoft SQL Server)를 삭제합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 &lt;strong&gt;Revo Uninstaller&lt;/strong&gt;(http://www.revouninstaller.com/start_freeware_download.html) 를 사용하여 완전히 제거합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관리자 모드에서 명령을 실행합니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;REG 추가 &quot;HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters&quot;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;장치&quot; /v &quot;강제 물리적 섹터 크기&quot;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;InBytes&quot; /tREG_MULTI_SZ /d &quot;* 4095&quot; /f&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새로 설치하는 동안 계정을 &lt;strong&gt;NT AUTURE\NETWORK SERVICE&lt;/strong&gt;로 설정합니다&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;가장 중요:&lt;/strong&gt; 정리 및 제거 프로세스 후 시스템을 다시 시작합니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;윈도우 11에서 발생한 오류입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 나와 있는 지침을 따랐더니 효과가 있었습니다. https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/database-file-operations/troubleshoot-os-4kb-disk-sector-size&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 후에는 컴퓨터를 다시 시작해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;계정도 NT AUTHEROUTH\NETWORK SERVICE로 설정했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 어떤 것도 나에게 맞지 않지만, 다른 해결책을 찾았습니다 - 2019년 설치와 2022년 업그레이드.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;잘 되네요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/19538089/wait-on-the-database-engine-recovery-handle-failed-check-the-sql-server-error-l&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>sql-server</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/675</guid>
      <comments>https://yellowcard.tistory.com/675#entry675comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:45:35 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 데이터베이스에서 특정 열 이름을 검색하려면 어떻게 해야 합니까?</title>
      <link>https://yellowcard.tistory.com/674</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 데이터베이스에서 특정 열 이름을 검색하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문에는 이미 다음&lt;/b&gt;과 같은 &lt;b&gt;답변이 있습니다&lt;/b&gt;.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt4&quot;&gt; 
    &lt;a href=&quot;/questions/193780/how-can-i-find-all-the-tables-in-mysql-with-specific-column-names-in-them&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL에서 특정 열 이름을 가진 모든 테이블을 어떻게 찾을 수 있습니까?&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(11개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;닫힘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2015-11-120 03:44:33Z&quot; papago-attr-id=&quot;1&quot;&gt;7년 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스에 다음 이름의 열이 있는지 확인하는 중입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sort_method&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 포럼들을 둘러봤지만 정답을 찾지 못하는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 데이터베이스에는 300개가 넘는 테이블이 있으므로 수동으로 찾는 것은 옵션이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;https://en.wikipedia.org/wiki/PhpMyAdmin&quot; rel=&quot;nofollow noreferrer&quot;&gt;phpMyAdmin&lt;/a&gt;의 SQL 쿼리를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;SELECT table_name,table_schema
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name='sort_method'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT DISTINCT TABLE_NAME 
 &amp;nbsp; &amp;nbsp; FROM INFORMATION_SCHEMA.COLUMNS
&amp;nbsp; &amp;nbsp; WHERE COLUMN_NAME = 'columnName'
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND TABLE_SCHEMA='YourDatabase';
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조회할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;INFORMATION_SCHEMA.COLUMNS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템 테이블:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT COLUMN_NAME, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE COLUMN_NAME = 'sort_method'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 http://dev.mysql.com/doc/refman/5.0/en/columns-table.html 에서 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/12009961/how-do-i-search-a-mysql-database-for-a-specific-column-name&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/674</guid>
      <comments>https://yellowcard.tistory.com/674#entry674comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:45:21 +0900</pubDate>
    </item>
    <item>
      <title>옵션 페이지에 메타박스 이미지 업로드 옵션 추가</title>
      <link>https://yellowcard.tistory.com/673</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옵션 페이지에 메타박스 이미지 업로드 옵션 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반 게시물 아래 사용자 정의 메타박스 이미지 업로드 옵션입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 아래와 같은 옵션을 원합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add_options_page&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;add_menu_page&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 어떻게 할까요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  &amp;lt;?php
    /**
     * Adds a meta box to the post editing screen
     */
    function prfx_custom_meta() {
        add_meta_box( 'prfx_meta', __( 'Meta Box Title', 'prfx-textdomain' ), 'prfx_meta_callback', 'post' );
    }
    add_action( 'add_meta_boxes', 'prfx_custom_meta' );

    /**
     * Outputs the content of the meta box
     */
    function prfx_meta_callback( $post ) {
        wp_nonce_field( basename( __FILE__ ), 'prfx_nonce' );
        $prfx_stored_meta = get_post_meta( $post-&amp;gt;ID );
        ?&amp;gt;

        &amp;lt;p&amp;gt;
            &amp;lt;label for=&quot;meta-image&quot; class=&quot;prfx-row-title&quot;&amp;gt;&amp;lt;?php _e( 'Example File Upload', 'prfx-textdomain' )?&amp;gt;&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; name=&quot;meta-image&quot; id=&quot;meta-image&quot; value=&quot;&amp;lt;?php if ( isset ( $prfx_stored_meta['meta-image'] ) ) echo $prfx_stored_meta['meta-image'][0]; ?&amp;gt;&quot; /&amp;gt;
            &amp;lt;input type=&quot;button&quot; id=&quot;meta-image-button&quot; class=&quot;button&quot; value=&quot;&amp;lt;?php _e( 'Choose or Upload an Image', 'prfx-textdomain' )?&amp;gt;&quot; /&amp;gt;
        &amp;lt;/p&amp;gt;


        &amp;lt;?php
    }     
    /**
     * Saves the custom meta input
     */
    function prfx_meta_save( $post_id ) {

        // Checks save status
        $is_autosave = wp_is_post_autosave( $post_id );
        $is_revision = wp_is_post_revision( $post_id );
        $is_valid_nonce = ( isset( $_POST[ 'prfx_nonce' ] ) &amp;amp;&amp;amp; wp_verify_nonce( $_POST[ 'prfx_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

        // Exits script depending on save status
        if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
            return;
        }

        // Checks for input and sanitizes/saves if needed
        if( isset( $_POST[ 'meta-text' ] ) ) {
            update_post_meta( $post_id, 'meta-text', sanitize_text_field( $_POST[ 'meta-text' ] ) );
        }

        // Checks for input and saves if needed
        if( isset( $_POST[ 'meta-image' ] ) ) {
            update_post_meta( $post_id, 'meta-image', $_POST[ 'meta-image' ] );
        }

    }
    add_action( 'save_post', 'prfx_meta_save' );


    /**
     * Adds the meta box stylesheet when appropriate
     */
    function prfx_admin_styles(){
        global $typenow;
        if( $typenow == 'post' ) {
            wp_enqueue_style( 'prfx_meta_box_styles', plugin_dir_url( __FILE__ ) . 'meta-box-styles.css' );
        }
    }
    add_action( 'admin_print_styles', 'prfx_admin_styles' );


    /**
     * Loads the color picker javascript
     */
    function prfx_color_enqueue() {
        global $typenow;
        if( $typenow == 'post' ) {
            wp_enqueue_style( 'wp-color-picker' );
            wp_enqueue_script( 'meta-box-color-js', plugin_dir_url( __FILE__ ) . 'meta-box-color.js', array( 'wp-color-picker' ) );
        }
    }
    add_action( 'admin_enqueue_scripts', 'prfx_color_enqueue' );

    /**
     * Loads the image management javascript
     */
    function prfx_image_enqueue() {
        global $typenow;
        if( $typenow == 'post' ) {
            wp_enqueue_media();

            // Registers and enqueues the required javascript.
            wp_register_script( 'meta-box-image', plugin_dir_url( __FILE__ ) . 'meta-box-image.js', array( 'jquery' ) );
            wp_localize_script( 'meta-box-image', 'meta_image',
                array(
                    'title' =&amp;gt; __( 'Choose or Upload an Image', 'prfx-textdomain' ),
                    'button' =&amp;gt; __( 'Use this image', 'prfx-textdomain' ),
                )
            );
            wp_enqueue_script( 'meta-box-image' );
        }
    }
    add_action( 'admin_enqueue_scripts', 'prfx_image_enqueue' );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업로드 옵션 아래에 옵션 페이지를 설정하고 싶습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 업로드 이미지에 대한 옵션 페이지 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP 코드:&lt;/font&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function your_enqueue_scripts(){
    wp_enqueue_script('media-upload');
    wp_enqueue_script('thickbox');
    wp_enqueue_style('thickbox');   
}
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery(document).ready(function($){
        //upload image                      
         $(&quot;#upload_image_button&quot;).click(function(event) {                          
             formfield = jQuery('#your_image').attr('name');                                                         
             tb_show('', 'media-upload.php?type=image&amp;amp;amp;TB_iframe=true');                          
             return false;
        });
        window.send_to_editor = function(html) {
            if(formfield) {
                jQuery('#your_image').replaceWith('&amp;lt;input id=&quot;your_image&quot;  type=&quot;text&quot;  name=&quot;your_image&quot;  value=&quot;&quot; style=&quot;width:500px&quot;   /&amp;gt;');
                fileurl = jQuery('img','&amp;lt;div&amp;gt;'+html+'&amp;lt;/div&amp;gt;').attr('src');                      
                jQuery('#your_image').val(fileurl);
                jQuery('#your_image_hidden').attr('value',fileurl);
            }
            tb_remove();
        }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 렌더링:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if(get_option('your_image')!='')
        {   
        ?&amp;gt;
        &amp;lt;img src=&quot;&amp;lt;?php echo get_option('your_image');?&amp;gt;&quot; name=&quot;your_image&quot; id=&quot;your_image&quot; height=&quot;100&quot; width=&quot;100&quot; /&amp;gt;
        &amp;lt;input id=&quot;bos_logo_hidden&quot;  type=&quot;hidden&quot;  name=&quot;your_image&quot; value=&quot;&amp;lt;?php echo get_option('your_image');?&amp;gt;&quot; style=&quot;width:500px&quot;  /&amp;gt;
        &amp;lt;?php
        }
        else
        {
        ?&amp;gt;
        &amp;lt;input id=&quot;your_image&quot;  type=&quot;text&quot;  name=&quot;your_image&quot; value=&quot;&quot; style=&quot;width:500px&quot;  /&amp;gt;
        &amp;lt;?php
        }   
    ?&amp;gt;
    &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;
    &amp;lt;input id=&quot;upload_image_id&quot;  type=&quot;hidden&quot; name=&quot;upload_image_id&quot; value=&quot;&quot; readonly=&quot;readonly&quot; /&amp;gt;
    &amp;lt;?php
    if(get_option('your_image')!='')
        {
            ?&amp;gt;
            &amp;lt;input id=&quot;upload_image_button&quot;  type=&quot;button&quot;  value=&quot;Change Image&quot;  class=&quot;button-primary &quot; /&amp;gt;
            &amp;lt;?php
        }
        else
        {
            ?&amp;gt;
            &amp;lt;input id=&quot;upload_image_button&quot;  type=&quot;button&quot; value=&quot;Upload Image&quot; class=&quot;button-primary&quot; /&amp;gt;
            &amp;lt;?php
        }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/39381072/add-meta-box-image-upload-option-into-options-page&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/673</guid>
      <comments>https://yellowcard.tistory.com/673#entry673comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:45:15 +0900</pubDate>
    </item>
    <item>
      <title>어떤 립을 쓸까요?libmariadbc 클라이언트 또는 libmysql 클라이언트?</title>
      <link>https://yellowcard.tistory.com/672</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 립을 쓸까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;libmariadbc 클라이언트 또는 libmysql 클라이언트?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알 수 없는 이유로 내 centOS 7에서 libmysqlclient.a가 사라졌습니다. 그리고 나서 내 프로그램이 libmysqlclient를 찾을 수 없다고 말하는 링커 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러다 내 mysql-devel 패키지가 없어진 걸 알게 됐어요&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;yum info mysql-devel
yum install mysql-devel
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;응답 내용은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: repo.virtualhosting.hk
 * epel: mirror.pregi.net
 * extras: repo.virtualhosting.hk
 * updates: repo.virtualhosting.hk
Package MariaDB-devel-10.2.5-1.el7.centos.x86_64 already installed and latest version
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 저는 대신 libmariadbclient를 사용해야 한다고 생각합니다. 하지만 제 프로그램을 libmariadbcclient와 연결하면 연결 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x191): undefined reference to `CRYPTO_num_locks'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1aa): undefined reference to `CRYPTO_THREADID_set_callback'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1b6): undefined reference to `CRYPTO_set_locking_callback'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1bb): undefined reference to `SSL_library_init'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1c7): undefined reference to `SSL_load_error_strings'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1cc): undefined reference to `OPENSSL_add_all_algorithms_noconf'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x2b4): undefined reference to `CRYPTO_set_locking_callback'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x2bb): undefined reference to `CRYPTO_set_id_callback'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x2df): undefined reference to `CRYPTO_num_locks'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x340): undefined reference to `EVP_cleanup'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x345): undefined reference to `CRYPTO_cleanup_all_ex_data'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x34a): undefined reference to `ERR_free_strings'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x351): undefined reference to `CONF_modules_free'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `ma_tls_init':
(.text+0x3e1): undefined reference to `SSLv23_client_method'
/usr/lib64//libmariadbclient.a(openssl.c.o): In function `my_cb_threadid':
(.text+0x1e): undefined reference to `CRYPTO_THREADID_set_numeric'
/usr/lib64//libmariadbclient.a(ma_compress.c.o): In function `_mariadb_compress_alloc':
(.text+0x5d): undefined reference to `compress'
/usr/lib64//libmariadbclient.a(ma_compress.c.o): In function `_mariadb_uncompress':
(.text+0x191): undefined reference to `uncompress'
collect2: error: ld returned 1 exit status
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;libmysqlclient를 사용하여 MariaDB 10.1에 연결하고 최근 소스에서 빌드하려고 했지만 OpenSSL 1.1 버전의 문제로 실패했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 제 게시물이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/44012487/error-incomplete-type-md5-context-with-mariadb-10-2-and-openssl-1-1-0e?noredirect=1#comment75087110_44012487&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB 10.2 및 Opensl 1.1.0e의 &quot;불완전한 유형 MD5_CONTEXT&quot; 오류&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 mysqlclient.a가 사라진 이유와 어떤 lib를 사용해야 하는지 혼란스럽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누가 도와줄 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;-&lt;strong&gt;lmariadbclient&lt;/strong&gt;&quot;로 프로그램을 컴파일하려고 했을 때도 비슷한 문제가 있었습니다(apt-get update &lt;strong&gt;-lmysqlclient&lt;/strong&gt;가 작동을 멈춘 후).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 사용한 Makefile은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;g++ -std=c++11 *.cpp ../common/*.cpp ../common/*.c -o myprogram -I.. -ldl -Wstack-protector -fstack-protector-all -pthread -ggdb -lssl -lcrypto -lz -lmariadbclient -Wwrite-strings  -fPIC 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류를 수정하려면 &quot;-&lt;strong&gt;lssl -lcrypto -lz&lt;/strong&gt;&quot; 명령어를 추가해야 한다고 읽었는데, (lmariadbc 클라이언트 앞에) 잘못 입력했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;-&lt;strong&gt;lmariadbclient&lt;/strong&gt;&quot; 뒤에 추가했을 때 마침내 프로그램을 컴파일할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;g++ -std=c++11 *.cpp ../common/*.cpp ../common/*.c -o myprogram -I.. -ldl -Wstack-protector -fstack-protector-all -pthread -ggdb -lmariadbclient -Wwrite-strings -lssl -lcrypto -lz -fPIC 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트 22.07.2017:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 최근에 새로운 리눅스 민트 18.2에 제 프로그램을 컴파일하려고 했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불행히도 동일한 컴파일 오류가 발생하여 이전 방법으로는 수정할 수 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB 버전:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; mysql --version
 mysql  Ver 15.1 Distrib 10.2.7-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일 오류:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x189): undefined reference to `CRYPTO_num_locks'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1a4): undefined reference to `CRYPTO_THREADID_set_callback'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1b0): undefined reference to `CRYPTO_set_locking_callback'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1b5): undefined reference to `SSL_library_init'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1c1): undefined reference to `SSL_load_error_strings'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_start':
(.text+0x1c6): undefined reference to `OPENSSL_add_all_algorithms_noconf'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x2a4): undefined reference to `CRYPTO_set_locking_callback'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x2ab): undefined reference to `CRYPTO_set_id_callback'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x2cf): undefined reference to `CRYPTO_num_locks'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x330): undefined reference to `EVP_cleanup'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x335): undefined reference to `CRYPTO_cleanup_all_ex_data'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x33a): undefined reference to `ERR_free_strings'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_end':
(.text+0x33f): undefined reference to `CONF_modules_free'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `ma_tls_init':
(.text+0x3c1): undefined reference to `SSLv23_client_method'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libmariadbclient.a(openssl.c.o): In function `my_cb_threadid':
(.text+0x1e): undefined reference to `CRYPTO_THREADID_set_numeric'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;-&lt;strong&gt;lmariadbclient&lt;/strong&gt;&quot;를 &quot;-&lt;strong&gt;lmariadb&lt;/strong&gt;&quot;로 변경하여 수정할 수 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 후 저는 오류 없이 제 프로그램을 컴파일 할 수 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 솔루션이 모두에게 효과가 있을지는 모르겠지만 시도해 볼 가치가 있습니다 :)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막 Makefile은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;g++ -std=c++11 *.cpp ../common/*.cpp ../common/*.c -o myprogram -I.. -ldl -Wstack-protector -fstack-protector-all -pthread -ggdb -lmariadb -Wwrite-strings -lssl -lcrypto -lz -fPIC 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;행운을 빕니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/44030382/which-lib-to-use-libmariadbclient-or-libmysqlclient&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MariaDB</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/672</guid>
      <comments>https://yellowcard.tistory.com/672#entry672comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:45:07 +0900</pubDate>
    </item>
    <item>
      <title>MySQLDB Python 삽입 %d 및 %s</title>
      <link>https://yellowcard.tistory.com/671</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQLDB Python 삽입 %d 및 %s&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전구체:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;MySQL Table created via:
CREATE TABLE table(Id INT PRIMARY KEY NOT NULL, Param1 VARCHAR(50))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.execute(&quot;INSERT INTO table VALUES(%d,%s)&quot;, (int(id), string)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;TypeError: %d format: a number is required, not a str
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무슨 일인지, 왜 명령을 실행할 수 없는지 잘 모르겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 파이썬에서 MySQLdb를 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.execute&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;커서 개체에서 수행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/5785154/python-mysqldb-issues&quot;&gt;Python MySQLdb 문제(TypeError: %&lt;/a&gt;d&lt;a href=&quot;https://stackoverflow.com/questions/5785154/python-mysqldb-issues&quot;&gt; 형식: str이 아닌 숫자가 필요함)&lt;/a&gt;에서 다음을 사용해야 한다고 말합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%s&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 분야에 대하여&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이게 왜 일까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 명령이 작동하는 이유는 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.execute(&quot;INSERT INTO table VALUES(%s,%s)&quot;, (int(id), string)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리를 실행하는 동안 전체 쿼리가 문자열 형식이어야 하므로,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%s&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용해야 할...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리가 실행되면 정수 값이 유지됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러니까 대사가.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.execute(&quot;INSERT INTO table VALUES(%s,%s)&quot;, (int(id), string))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설명은 &lt;a href=&quot;http://mysql-python.sourceforge.net/MySQLdb.html#some-examples&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt; 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;형식 문자열은 일반적인 Python 형식 문자열이 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 모든 필드에 %s을(를) 사용해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 dev.mysql.com 에서 해결책을 찾았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단히 말해서, a를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dict&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 한푼도&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tuple&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 두 번째 매개변수에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.execute()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;add_salary = (&quot;INSERT INTO salaries &quot;
              &quot;(emp_no, salary, from_date, to_date) &quot;
              &quot;VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)&quot;)

data_salary = {
  'emp_no': emp_no,
  'salary': 50000,
  'from_date': tomorrow,
  'to_date': date(9999, 1, 1),
}

cursor.execute(add_salary, data_salary)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 놓쳤군요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'%'&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열 형식으로&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;(INSERT INTO table VALUES(%d,%s)&quot;%(int(id), string))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/20463333/mysqldb-python-insert-d-and-s&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/671</guid>
      <comments>https://yellowcard.tistory.com/671#entry671comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:59 +0900</pubDate>
    </item>
    <item>
      <title>왜 git가 post-pull merge commit 메시지를 표시합니까?</title>
      <link>https://yellowcard.tistory.com/670</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 git가 post-pull merge commit 메시지를 표시합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최근에, 아무 것이나 따라다니면서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, git은 내 텍스트 편집기를 산란하고 병합 커밋 메시지를 요청하기 시작했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;커밋 메시지는 이미 미리 입력되어 있고, 풀을 완료하기 위해 창을 저장하고 닫기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;과거에는 표준 커밋 메시지를 사용하여 묵묵히 병합을 수행했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Merge branch 'dev' of remote.com:/repo into dev&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최근에 git를 (홈브루를 통해) 버전 1.7.11.3으로 업데이트했지만 이 동작을 변경하기 위해 수행했을 수 있는 다른 작업을 생각할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 설정입니까, 아니면 원래대로 돌아갈 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;git 1.7.10에서 git 개발자들은 병합 커밋이 너무 쉽게 이루어질 수 있다고 결정했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;http://git-blame.blogspot.com/2012/02/anticipating-git-1710.html&quot; rel=&quot;noreferrer&quot;&gt;블로그 게시물&lt;/a&gt;에서 설명한&lt;a href=&quot;http://git-blame.blogspot.com/2012/02/anticipating-git-1710.html&quot; rel=&quot;noreferrer&quot;&gt; &lt;/a&gt;바와 같이 대화형 커밋 메시지 동작을 강제하는 것은 그러한 커밋 메시지를 더 상세하게 만들고 불필요한 병합의 전체 빈도를 줄일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--no-edit&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이런 행동을 피하기 위해 깃발을 꽂아야 하지만, 그러지 마세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;병합 커밋은 이력에 대한 커밋과 마찬가지로 잘 구성되어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신의 역사는 그저 유용할 뿐입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나중에 사용할 바로 가기를 만들려면 다음 중 하나를 선택합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/.gitconfig&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 함께:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[core]
    mergeoptions = --no-edit
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 터미널에서 다음을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;git config --global core.mergeoptions --no-edit&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저, 위의 크리스토퍼의 대답에 있는 경고에 주의하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 자동 병합 커밋 메시지 편집을 실행 중지하려면 다음 환경 변수를 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    GIT_MERGE_AUTOEDIT=no
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 환경 변수와 &quot;아니오&quot; 설정은 깃&lt;a href=&quot;https://git-scm.com/docs/git-merge&quot; rel=&quot;noreferrer&quot;&gt; 병합&lt;/a&gt; 문서 페이지에 문서화되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;상호 작용 없이 병합해야 하는 스크립트에서만 사용하는 것이 좋으나, 물론 셸 환경의 일부로 설정하여 효과를 보다 영구적으로 만들 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/11744081/why-is-git-prompting-me-for-a-post-pull-merge-commit-message&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>git</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/670</guid>
      <comments>https://yellowcard.tistory.com/670#entry670comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:53 +0900</pubDate>
    </item>
    <item>
      <title>평균 스택: 각도 라우팅 대 급행 라우팅</title>
      <link>https://yellowcard.tistory.com/669</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;평균 스택: 각도 라우팅 대 급행 라우팅&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;문&lt;/b&gt; 닫았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문은&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/help/closed-questions&quot;&gt;의견&lt;/a&gt;에 입각한&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 답변을 받지 않고 있습니다.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;hr class=&quot;my12 outline-none baw0 bb bc-powder-400&quot;&gt; 
  &lt;div class=&quot;fw-nowrap fc-black-600&quot;&gt; 
   &lt;div class=&quot;d-flex fd-column lh-md&quot;&gt; 
    &lt;div class=&quot;mb0 d-flex&quot;&gt; 
     &lt;div class=&quot;flex--item mr8&quot;&gt; 
      &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
       &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
      &lt;/svg&gt; 
     &lt;/div&gt; 
     &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문을 개선하고 싶으십니까?&lt;/b&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;/posts/28459975/edit&quot;&gt;이 게시물을 편집&lt;/a&gt;하여 사실과 인용으로 답변할 수 있도록 질문을 업데이트합니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;mb0 mt6 d-flex&quot;&gt; 
     &lt;p class=&quot;ml24 pl2&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2015-02-120 01:31:19Z&quot; papago-attr-id=&quot;1&quot;&gt;8년 전&lt;/span&gt;에 문을 닫았습니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;ml24 pl2&quot;&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;div class=&quot;mt24 d-flex gsx gs8&quot;&gt; 
   &lt;a class=&quot;s-btn s-btn__outlined flex--item js-post-notice-edit-post&quot; href=&quot;/posts/28459975/edit&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문을 개선합니다.&lt;/font&gt;&lt;/a&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 제 급행 생성 프로젝트에서 각선미를 사용하기 시작했고 그것이 마음에 듭니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최근에 테스트 프로젝트 중 하나에 각도 라우팅을 구현했는데 순수 급행/노드 라우팅에 비해 각도 라우팅을 사용하면 어떤 장점과 단점이 있는지 궁금합니다(예: 이 방식에 기술적인 문제가 있거나 SEO일 수 있거나 전혀 불필요한 것입니까).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 설정에 대한 참고:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 인덱스 템플릿을 익스프레스 렌더링하고 기본 인덱스 템플릿에 모든 요청(모두 잡기)을 라우팅한 다음 기본 인덱스 템플릿 내에서 부분 템플릿으로 라우팅하는 각도를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;평균 스택(몽고, 급행, 각도)을 사용하면 양쪽 끝에 라우팅이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Express는 당신의 static index.html과 css/js/images와 당신의 api를 제공할 것이고, angular는 mongo로부터 데이터를 얻기 위해 api와 상호작용할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;express를 사용한 라우팅은 주로 API에 대해 수행되며, 각진 라우팅은 응용 프로그램의 프론트엔드를 처리하기 위해 수행됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Express는 index.html 이외의 html 및 각도에 대해 작성한 템플릿 부분을 반환하지 않지만 gulp/grunt와 같은 빌드 도구를 사용하여 모든 템플릿을 js 파일로 직접 컴파일하여 제거할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확실히 한 쪽으로 100% 가는 것은 가능하지만, 한 쪽으로 또 다른 쪽으로 비효율적으로 가게 되어 버리기 때문에 현실적으로 불가능합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 각 페이지에 대해 express 및 used angular를 사용하여 모든 라우팅을 수행했다면, angularjs의 단일 페이지 앱 기능과 라우팅을 모두 무시하고 express 및 jade(또는 다른 템플릿 엔진)로 더 효과적으로 수행할 수 있는 페이지를 만드는 것이 유일한 목적이 될 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;angular는 데이터를 얻기 위해 api가 필요하기 때문에 다른 방향으로 가서 angular와 함께 모든 라우팅을 하는 것은 실제로 가능하지 않습니다. html에 모든 데이터를 인라인으로 포함하지 않는 한, angular는 데이터를 얻기 위해 api를 필요로 하기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(또한 그 시점에서 몽고를 제거합니다.)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그들은 두 가지 다른 문제를 해결하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도 라우팅(ui-router)은 올바른 ui-뷰를 로드하는 클라이언트 측입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;익스프레스 라우팅은 사용자가 노출하는 REST API인 서버측입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/28459975/mean-stack-angular-routing-vs-express-routing&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>AngularJS</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/669</guid>
      <comments>https://yellowcard.tistory.com/669#entry669comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:47 +0900</pubDate>
    </item>
    <item>
      <title>HTML로 전화를 걸기 위해 아이폰이나 안드로이드 폰에서 전화번호를 클릭할 수 있도록 하는 방법이 있습니까?</title>
      <link>https://yellowcard.tistory.com/668</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML로 전화를 걸기 위해 아이폰이나 안드로이드 폰에서 전화번호를 클릭할 수 있도록 하는 방법이 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 전화번호를 클릭할 때 호출되는 전화번호를 HTML로 클릭할 수 있도록 할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와 같은 것이 효과가 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;tel:+1-800-555-5555&quot;&amp;gt;Call 1-800-555-5555&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 정보:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/URI_scheme#tel&quot; rel=&quot;nofollow noreferrer&quot;&gt;http://en.wikipedia.org/wiki/URI_scheme#tel&lt;/a&gt; :&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc3966&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://www.rfc-editor.org/rfc/rfc3966&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;iOS에서 다음을 사용하여 전화 번호를 탐지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;i&amp;gt;web_view.dataDetectorTypes=UIDataDetectorTypePhoneNumber;&amp;lt;i&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/4572297/is-there-a-way-to-make-a-phone-number-clickable-on-an-iphone-or-android-phone-to&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>iPhone</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/668</guid>
      <comments>https://yellowcard.tistory.com/668#entry668comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:41 +0900</pubDate>
    </item>
    <item>
      <title>CFStringRef를 NSstring으로 변환하는 방법은?</title>
      <link>https://yellowcard.tistory.com/667</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CFStringRef를 NSstring으로 변환하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새것을 구하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSString&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;aCFString&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NSSstring과 CFStringRef는 &quot;Toll free bridged&quot;로 둘 사이에 간단히 캐스트를 입력할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CFStringRef aCFString = (CFStringRef)aNSString;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;완벽하고 투명하게 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마찬가지로:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *aNSString = (NSString *)aCFString;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전 구문은 MRC에 대한 것이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARC를 사용하는 경우 새로운 캐스팅 구문은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *aNSString = (__bridge NSString *)aCFString;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;효과도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;핵심 사항은 코어 파운데이션이 +1개의 참조 개수를 가진 객체를 종종 반환한다는 것이며, 이는 객체를 해제해야 한다는 것을 의미합니다(모든 CF[Type]Create format 기능이 이 작업을 수행함).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좋은 점은 코코아에서 자동 해제 또는 해제를 안전하게 사용하여 자유롭게 할 수 있다는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mac OS X/Objective C의 최신 버전에서 ARC를 사용하는 경우, 이는 &lt;i&gt;매우&lt;/i&gt; 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *happyString = (NSString *)CFBridgingRelease(sadString);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 Xcode는 NSSstring에 무료 브리지 CFString을 허용하고 CFBridging Release()에 자동으로 포장을 제안할 때 기쁜 마음으로 경고합니다. CFBridging Release()는 이 옵션을 클릭하면 수락할 수 있으며 포장지를 자동으로 삽입할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이들은 동등하므로 CFStringRef를 캐스팅만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *aNSString = (NSString*)aCFString;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 &lt;a href=&quot;https://developer.apple.com/library/ios/documentation/corefoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;수신자&lt;/a&gt; 부담 &lt;a href=&quot;https://developer.apple.com/library/ios/documentation/corefoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;브리지 유형&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제로 일반적으로 Core Foundation 객체에 대해 Cocoa retain, release, auto release를 사용해서는 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Garbage Collection(지금은 Mac OS X에서만)을 사용하는 경우 유지, 해제, 자동 해제 통화는 모두 금지됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 메모리가 누출됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html 에서:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코어 파운데이션과 코코아 사이의 비대칭성을 이해하는 것이 중요합니다. 코어 파운데이션은 유지, 해제 및 자동 해제가 불가능합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 CFCreate…를 릴리스 또는 자동 릴리스와 균형을 맞춘 경우 가비지 수집 환경에서 개체가 누출됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반대로 CFRelease를 사용하여 이전에 보존한 개체를 릴리스하면 참조 카운트 언더플로우 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추신: 피터 호시의 대답에 대해 언급할 수 없는 것 같습니다. 불필요하게 제 것을 추가해서 죄송합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Type-cast만으로 CFString에서 NSSstring으로 이동할 수 있을 뿐만 아니라 반대로 동작할 수도 있다는 점을 덧붙이겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;드랍하시면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CFStringCreateWithCString&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나중에 릴리스해야 하는 메시지가 하나 더 적습니다. (CF는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Create&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코코아가 사용하는 곳&lt;/font&gt;&lt;/font&gt;&lt;code&gt;alloc&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그래서 어느 쪽이든, 당신은 그것을 풀어줘야만 했을 것입니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ARC와 CFS 문자열의 리텐션 카운트에 문제가 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NilObjects의 답변을 약간 수정해서 사용하는 것은 저에게 완벽하게 효과적이었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그냥 남은 달걀을 넣었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캐스팅해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CFStringRefidc 포함;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *sId = [NSString stringWithFormat:@&quot;%@&quot;, (NSString*)idc];
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/640367/how-to-convert-cfstringref-to-nsstring&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>string</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/667</guid>
      <comments>https://yellowcard.tistory.com/667#entry667comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:35 +0900</pubDate>
    </item>
    <item>
      <title>Remove Wordpress Body Classes</title>
      <link>https://yellowcard.tistory.com/666</link>
      <description>&lt;h2&gt;Remove Wordpress Body Classes&lt;/h2&gt;
&lt;p&gt;How could I remove classes from the body element in Wordpress?&lt;/p&gt; 
&lt;p&gt;Default: body class=&quot;page page-id-7 page-template-default logged-in&quot;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;What I'm looking for: body class=&quot;page-id-7&quot;&lt;/p&gt; 
&lt;p&gt;On Post's: body class=&quot;postid-40&quot;&lt;/p&gt;&lt;p&gt;This is how you find something like this out:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;Find the relevant function by looking in a theme file, in this case header.php&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;Look this function up in the Wordpress Codex (&lt;a href=&quot;http://codex.wordpress.org/Function_Reference/body_class&quot; rel=&quot;noreferrer&quot;&gt;http://codex.wordpress.org/Function_Reference/body_class&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;Is there any examples that look similar to what I want to do? Yes:&lt;/p&gt; &lt;p&gt;// Add specific CSS class by filter add_filter('body_class','my_class_names'); function my_class_names($classes) { // add 'class-name' to the $classes array $classes[] = 'class-name'; // return the $classes array return $classes; }&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;So basically, to remove all classes, just add this to functions.php:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_filter('body_class','my_class_names');
function my_class_names($classes) {
    return array();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;t 4. But I want to keep page id and post id - how can I do that? Because you don't know on what index in the array that you can find this information on, and searching through the array is lame, you need to first empty the array like we did above, and then add the stuff you really want. How do you get the right information, that is, page id and post id? This is step five.&lt;/p&gt; 
&lt;p&gt;(5) At the bottom of the codex page you will find a link to the source code. This is the link you'll find: &lt;a href=&quot;http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post-template.php&quot; rel=&quot;noreferrer&quot;&gt;http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post-template.php&lt;/a&gt; If you look at the function, you'll see it uses a function which simply populates the same array that we can manipulate with aforementioned filter. By looking how they do it, you can do it too.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_filter('body_class','my_class_names');
function my_class_names($classes) {
    global $wp_query;

    $arr = array();

    if(is_page()) {
    $page_id = $wp_query-&amp;gt;get_queried_object_id();
    $arr[] = 'page-id-' . $page_id;
    }

    if(is_single()) {
    $post_id = $wp_query-&amp;gt;get_queried_object_id();
    $arr[] = 'postid-' . $post_id;
    }

    return $arr;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Hopefully this code works. If it does not, try to figure out what's wrong by following the steps above. I hope I helped at least a little bit :)&lt;/p&gt;&lt;p&gt;currently working code to remove and add a class &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//remove body class

add_filter('body_class', function (array $classes) {
    if (in_array('class_name', $classes)) {
      unset( $classes[array_search('class_name', $classes)] );
    }
  return $classes;
});

// Add specific CSS class by body.
 add_filter( 'body_class', function( $classes ) {
    return array_merge( $classes, array( 'class-name' ) );
} );
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ReferenceURL : &lt;a href=&quot;https://stackoverflow.com/questions/7799089/remove-wordpress-body-classes&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/7799089/remove-wordpress-body-classes&lt;/a&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/666</guid>
      <comments>https://yellowcard.tistory.com/666#entry666comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:28 +0900</pubDate>
    </item>
    <item>
      <title>Apache POI를 사용하는 Excel에서 구분자 수가 수천 개인 형식 번호</title>
      <link>https://yellowcard.tistory.com/665</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Apache POI를 사용하는 Excel에서 구분자 수가 수천 개인 형식 번호&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 숫자 셀을 몇 천 개의 구분자로 쉼표를 사용하여 포맷하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;12        -&amp;gt; 12
1200      -&amp;gt; 1,200
12000     -&amp;gt; 12,000
12000000  -&amp;gt; 12,000,000
120000000 -&amp;gt; 120,000,000
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다음과 같은 코드를 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무엇으로 사용해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;formatStr&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;? 쉬운 방법이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 이런 것을 만들기 위해서 0의 개수를 감지해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#,###,###&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;String formatStr = &quot;&quot;;
HSSFCellStyle style = workbook.createCellStyle();
HSSFDataFormat format = workbook.createDataFormat();
style.setDataFormat(format.getFormat(formatStr));
cell.setCellStyle(style);
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 숫자를 다루고 있다는 것을 명심하세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;셀 유형은 문자열이 아닌 숫자입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;갱신하다&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/YCIP7.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;style.setDataFormat(HSSFDataFormat.getBuiltinFormat(&quot;#,##0.00&quot;));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원하는 형식을 따를 겁니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그저.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#,###&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#,##0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;충분할 것입니다&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Excel은 이를 세 자리마다 수천 개의 구분자가 있는 것으로 해석합니다(마지막 세 자리 직전이 아니라).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/zSBNk.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사람에게 낚시를 가르친다는 정신으로, 이렇게 하면 여러분은 스스로 알게 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;형식은 숫자, 소수점 0자리, 구분 기호 1000개 포함:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/TVqFg.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확인을 클릭한 다음 숫자 형식 대화상자를 다시 열고 사용자 정의로 이동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포맷 코드(&quot;Type&quot;)를 살펴봅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라고 써있네요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#,##0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 제게 있어서는 그 결과와 정확히 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#,###&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/7RFst.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/27400825/format-number-with-thousands-separator-in-excel-using-apache-poi&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Excel</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/665</guid>
      <comments>https://yellowcard.tistory.com/665#entry665comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:21 +0900</pubDate>
    </item>
    <item>
      <title>호스트 요소 참조를 가져오는 방법은?</title>
      <link>https://yellowcard.tistory.com/664</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호스트 요소 참조를 가져오는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular 2에서 호스트 요소 참조를 얻으려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저 같은 경우에는 제 부품에 초점이 있는지 없는지 알고 싶습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용하여 호스트 요소 참조를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyComponent {
  constructor(private elRef:ElementRef) {
    console.log(this.elRef.nativeElement);
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 가입할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;focus&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이벤트성&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyComponent {
  @HostBinding() tabindex = 0;
  @HostListener('focus', ['$event'])
  onFocus(event) {
    console.log(event);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나 이상의 보기를 구성요소에 첨부할 수 있는 컨테이너를 나타내는 &lt;a href=&quot;https://angular.io/api/core/ViewContainerRef&quot; rel=&quot;nofollow noreferrer&quot;&gt;ViewContainerRef&lt;/a&gt;를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;constructor(private readonly viewRef: ViewContainerRef) {

    console.log(this.viewRef.element.nativeElement);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/37383669/how-to-get-host-element-reference&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Angular</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/664</guid>
      <comments>https://yellowcard.tistory.com/664#entry664comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:13 +0900</pubDate>
    </item>
    <item>
      <title>C 프로젝트 기본 디렉토리 레이아웃이 있습니까?</title>
      <link>https://yellowcard.tistory.com/663</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 프로젝트 기본 디렉토리 레이아웃이 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 프로젝트의 기본 디렉토리 레이아웃이 있는지 항상 알고 싶었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 폴더에 어떤 파일 등을 넣어야 하는지 알고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 &lt;a href=&quot;http://sourceforge.net/&quot; rel=&quot;noreferrer&quot;&gt;SourceForge&lt;/a&gt;에서 프로젝트의 소스코드를 많이 다운받았는데 모두가 서로 달랐습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 다음과 같은 구조를 발견했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    /project         (root project folder, has project name)
    |
    |____/bin        (the final executable file)
    |
    |
    |____/doc        (project documentation)
    |    |
    |    |____/html  (documentation on html)
    |    |
    |    |____/latex (documentation on latex)
    |
    |
    |____/src        (every source file, .c and .c)
    |    |
    |    |____/test  (unit testing files)
    |
    |
    |____/obj        (where the generated .o files will be)
    |
    |
    |____/lib        (any library dependences)
    |
    |
    |____BUGS        (known bugs)
    |
    |____ChangeLog   (list of changes and such)
    |
    |____COPYING     (project license and warranty info)
    |
    |____Doxyfile    (Doxygen instructions file)
    |
    |____INSTALL     (install instructions)
    |        |
    |____Makefile    (make instructions file)
    |
    |____README      (general readme of the project)
    |
    |____TODO        (todo list)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어딘가에 기본 기준이 있나요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 죄송합니다. 정말입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추천하는 C 프로젝트 디렉토리 파일에 대해서도 비슷한 질문이 많다는 것을 알았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 저는 사람들이 자신이 생각하는 것이 최선이라고 말하는 것을 봤습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 사람들이 주로 따르는 기준을 찾고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관련 질문:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2410243/c-starting-a-big-project-file-directory-structure-and-names-good-example-req&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C - 큰 프로젝트를 시작합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일/디렉토리 구조 및 이름.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우수한 예제가 필요합니다.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/1451086/folder-structure-for-a-c-project&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 프로젝트의 폴더 구조&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2407668/file-and-folder-structure-of-a-app-project-based-in-c&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 기반 앱/프로젝트의 파일 및 폴더 구조&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/742391/project-organization-in-c-best-practices&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C Best Practice 프로젝트 조직&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &quot;아니오&quot;라고 말할 것이고, 당신의 경험적 증거는 그것을 뒷받침하는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 보통 둘 중 하나를 결정해야 할 때 바로 혼란스러워 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;doc/&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docs/&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자, 일반적인 관행을 보여주는 &lt;a href=&quot;http://lwn.net/Articles/465093/&quot; rel=&quot;noreferrer&quot;&gt;&quot;libabc&quot;&lt;/a&gt;가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/8523078/is-there-a-c-project-default-directory-layout&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/663</guid>
      <comments>https://yellowcard.tistory.com/663#entry663comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:07 +0900</pubDate>
    </item>
    <item>
      <title>SQL 명령이 제대로 종료되지 않았습니까?</title>
      <link>https://yellowcard.tistory.com/662</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 명령이 제대로 종료되지 않았습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;임시 관계를 가진 SQL 문을 사용하고 있는데 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ORA-009933: SQL command not properly ended&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 진술서에 아무런 문제가 없다고 생각하니, 어떤 도움이라도 주신다면 대단히 감사하겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성명은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT Temp.name,
       Temp.AvgSalary
FROM   (SELECT A.aid,
               A.aname       AS name,
               AVG(E.salary) AS AvgSalary
        FROM   Aircraft A,
               Certified C,
               Employees E) AS Temp; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle이 지원하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;as&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블 별칭의 경우, 열 별칭에 대해서만 해당되며 =&amp;gt; 모두 삭제를 사용하는 경우에는 선택 사항입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;as&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드 ;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;AS 온도를 맞추면 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테이블(또는 하위 쿼리)에 별칭을 넣을 때는 별칭만 적어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT Temp.name, Temp.AvgSalary 
FROM ( SELECT A.aid, A.aname AS name, AVG(E.salary) AS AvgSalary 
       FROM Aircraft A, Certified C, Employees E)  Temp;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안부 전합니다,&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/9811711/sql-command-not-properly-ended&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/662</guid>
      <comments>https://yellowcard.tistory.com/662#entry662comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:44:00 +0900</pubDate>
    </item>
    <item>
      <title>jquery 작업 후 URL 가져오기</title>
      <link>https://yellowcard.tistory.com/661</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jquery 작업 후 URL 가져오기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jquery 기능으로 post target action에 접속하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;form action=&quot;/page/users&quot; id=&quot;signup&quot; method=&quot;post&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 &quot;action&quot; 부분 - &quot;/page/users&quot;에 접속하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#signup').live(&quot;submit&quot;, function(event) {
    // get this submitted action
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아주 간단한 걸 놓치고 있는 것 같아요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;돔에 있는 가치는 보이는데 jquery에 어디에 저장되어 있는지 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$('#signup').on(&quot;submit&quot;, function(event) {
    $form = $(this); //wrap this in jQuery

    alert('the action is: ' + $form.attr('action'));
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 ocode를 사용해 보십시오;;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var formAction = $(&quot;#signup&quot;).attr('action');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;깔끔하고 간단합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#signup').submit(function(event) {

      alert(this.action);
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2550620/jquery-getting-post-action-url&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/661</guid>
      <comments>https://yellowcard.tistory.com/661#entry661comment</comments>
      <pubDate>Mon, 6 Nov 2023 21:43:54 +0900</pubDate>
    </item>
    <item>
      <title>constint main = 195는 작동 프로그램을 생성하지만 constint가 없으면 segmentation fault로 끝나는 이유는 무엇입니까?</title>
      <link>https://yellowcard.tistory.com/660</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;constint main = 195는 작동 프로그램을 생성하지만 constint가 없으면 segmentation fault로 끝나는 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 프로그램을 따르는 것을 고려합니다(여기 &lt;a href=&quot;http://melpon.org/wandbox/permlink/556rmrO8S41o2Ul0&quot; rel=&quot;noreferrer&quot;&gt;라이브&lt;/a&gt; 데모 참조).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const int main = 195;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현실 세계에서 이런 코드를 쓰는 프로그래머는 없다는 것을 알고 있습니다. 유용한 목적도 없고 말도 안 되기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 내가 제거할 때는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로그램 위에서 키워드를 입력하면 바로 &lt;a href=&quot;http://en.wikipedia.org/wiki/Segmentation_fault&quot; rel=&quot;noreferrer&quot;&gt;세그멘테이션 오류&lt;/a&gt;가 발생합니다. 왜죠?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것의 배후에 있는 이유를 알고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GCC 4.8.2는 이를 컴파일할 때 다음과 같은 경고를 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;경고: 'main'은 일반적으로 [-Wmain] 함수입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;const int main = 195;
          ^
&lt;/code&gt;&lt;/pre&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;존재와 부재가 왜&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드가 프로그램의 행동에 영향을 주나요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;값 195가 어떻게 대응되는지 관찰합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ret&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(기능에서 복귀) 8086 호환성에 대한 지침.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 이 정의는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 마치 당신이 그것을 정의한 것처럼 행동합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int main() {}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;처형시에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 플랫폼에서는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터는 실행 가능하지만 쓰기 가능하지 않은 메모리 영역에 로드되는 반면, 변이 가능한 데이터(즉, 데이터가 자격이 없음)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)가 쓰기 가능하지만 실행 가능하지 않은 메모리 영역에 로드됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 이유로, 프로그램은 당신이 선언할 때 &quot;작동&quot;합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;~하듯이&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 당신이 그 일을 그만둘 때는 안 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한정자&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전통적으로 쌍성은 세 개의 &lt;em&gt;세그먼트&lt;/em&gt;로 구성되어 있었습니다&lt;em&gt;.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세그먼트는 (아키텍처에서 지원하는 경우) 쓰기 방지되고 실행 가능하며, 실행 코드를 포함하고 있으며, 정적 &lt;em&gt;스토리지&lt;/em&gt; 기간 변수가 한정됨&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그리고 현악기 리터럴.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세그먼트는 쓸 수 있으므로 실행할 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한정되지 않은 변수가 포함되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;정적&lt;/em&gt; 저장 기간 및 &lt;em&gt;할당&lt;/em&gt;된 저장 기간을 가진 (실행 시) 개체&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bss&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세그먼트는 다음과 유사합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;segment(세그먼트)이지만 모든 0으로 초기화됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;정적&lt;/em&gt; 저장 기간 변수가 한정되지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이니셜라이저 없이 선언된 것들.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;stack&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세그먼트가 이진에 없으며 자동 &lt;em&gt;저장&lt;/em&gt; 기간을 가진 변수를 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제거하기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변수의 한정자&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이동을 유발합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에게&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;segment(세그먼트), 실행할 수 없는 segment(세그먼트), 관찰하는 segmentation(세그먼트) 위반을 야기합니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현대적인 플랫폼은 종종 추가적인 세그먼트(segment가 있습니다(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;rodata&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쓰기 가능하지도 실행 가능하지도 않은 데이터에 대한 세그먼트(segment)를 제공하므로 플랫폼별 설명서를 참조하지 않고 플랫폼에 대한 정확한 설명으로 간주하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만들지 않는 것을 이해해 주시기 바랍니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수는 일반적으로 틀리지만, 기술적으로 플랫폼이 허용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변수로 선언됩니다. cf.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ISO 9899:2011 §5.1.2.2.11, 강조사항:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1 프로그램 시작시 호출되는 함수의 이름은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 구현에서 이 기능에 대한 프로토타입이 없음을 선언합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 반환 유형으로 정의되어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개변수가 없거나(...), 두 개의 매개변수가 있거나(...), 또는 이와 동등한 &lt;em&gt;방식으로 또는 다른 구현 정의&lt;/em&gt; 방식으로 정의할 수 있습니다&lt;em&gt;.&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주식회사,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세계적인 범위에서 거의 항상 함수입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용방법&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전역 범위의 변수로 인해 프로그램의 동작이 정의되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(당신이 글을 쓸 때가 그럴 수도 &lt;em&gt;있습니다&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일러는 변수를 상수로 최적화하므로 프로그램 동작이 다릅니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 프로그램 동작은 &lt;em&gt;여전히&lt;/em&gt; 정의되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/33305574/why-does-const-int-main-195-result-in-a-working-program-but-without-the-const&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/660</guid>
      <comments>https://yellowcard.tistory.com/660#entry660comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:59 +0900</pubDate>
    </item>
    <item>
      <title>JDBC - Oracle ArrayIndexOutOfBounds 예외</title>
      <link>https://yellowcard.tistory.com/659</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JDBC - Oracle ArrayIndexOutOfBounds 예외&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 테이블에 행을 삽입하려고 하면 예외가 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 11에 ojdbc5.jar를 사용하고 있습니다. 이것이 제가 시도하고 있는 sql입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO rule_definitions(RULE_DEFINITION_SYS,rule_definition_type,
rule_name,rule_text,rule_comment,rule_message,rule_condition,rule_active,
rule_type,current_value,last_modified_by,last_modified_dttm,
rule_category_sys,recheck_unit,recheck_period,trackable)
VALUES(RULE_DEFINITIONS_SEQ.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 나는 예외를 따르게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 도움이라도 주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바, lj아바, lang.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ArrayIndexOutOfBounds예외: 15&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OracleSql.computeBasicInfo(OracleSql.java:950)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OracleSql.getSqlKind(OracleSql.java:623)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle Prepared Statement.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(오라클 준비문.java:1212)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;T4C 준비 상태.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(T4C 준비 상태.java:28)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;T4C 드라이버 확장.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;allocatePrepared Statement(T4C driverExtension.java:68)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물리적 연결.prepareStatement(물리적 연결.java:3059)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물리적 연결.prepareStatement(물리적 연결.java:2961)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 jdbc.driver.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물리적 연결.prepareStatement(물리적 연결.java:5874)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;조직.jboss.자원.adapter.jdbc.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WrapedConnection.prepareStatement(WrapedConnection.java:232)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;com에서&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;gehcit.platform. cds.common. util.db.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DBWrapper.execute&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클 리턴PK 삽입(DBWrapper.java:605)&lt;/font&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle Metalink(Oracle의 지원 사이트 - Note ID 736273.1)에서 이 오류가 JDBC 어댑터(버전 10.2.0.0.0~11.1.0.7.0)의 버그임을 발견했습니다. 7개 이상의 위치 매개 변수로 preparedStatement를 호출하면 JDBC가 이 오류를 발생시킵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle Metalink에 액세스할 수 있는 경우 한 가지 옵션은 해당 사이트에 가서 언급된 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 해결 방법은 다음과 같습니다. 위치 매개 변수 대신 명명된 매개 변수를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;INSERT INTO rule_definitions(RULE_DEFINITION_SYS,rule_definition_type,
rule_name,rule_text,rule_comment,rule_message,rule_condition,rule_active,
rule_type,current_value,last_modified_by,last_modified_dttm,
rule_category_sys,recheck_unit,recheck_period,trackable)
VALUES(RULE_DEFINITIONS_SEQ.NEXTVAL,:rule_definition_type,
:rule_name,:rule_text,:rule_comment,:rule_message,:rule_condition,:rule_active,
:rule_type,:current_value,:last_modified_by,:last_modified_dttm,
:rule_category_sys,:recheck_unit,:recheck_period,:trackable)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 다음에 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;preparedStatement.setStringAtName(&quot;rule_definition_type&quot;, ...)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;등: 이 쿼리에 대해 명명된 바인딩 변수를 설정합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 batis + oracle + spring + maven을 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수가 8개 이상인 경우 동일한 오류 &quot;array index out of bounds exception&quot;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폼 버전 ojdbc6에서 ojdbc14로 변경된 경우,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;com.oracle&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;ojdbc14&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;10.2.0.3.0&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;됐습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코드를 보지 않고 각 연결이 스레드 안전 방식으로 액세스되고 있는지 확인하는 것만 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 드라이버는 일반적으로 상당히 견고합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 개 이상의 스레드가 동일한 연결 인스턴스에 액세스하여 이상한 작업을 수행할 때와 같은 이상한 내부 오류를 본 적이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나사산은 안전하지 않으므로 나사산마다 하나씩 보관해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개변수 수를 잘못 입력한 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;15분 안에 지나가셔야 하는데 16분이나 14분을 보내시는 겁니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네, 제 마우스 커서 계산이 꺼지지 않는 한, 15개의 열에 16개의 값을 삽입하려고 하는 겁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQLPlus*와 동일한 작업을 수행해 보십시오. ORA-00913: 값이 너무 많습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 이해하는 바가 맞다면, 당신은 15명의 자리 표시자와 함께 준비된 진술서를 작성합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 15개의 파라미터 값을 가진 배열을 호출에 전달해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나를 놓쳤거나 남은 것을 추가한 것은 아닐까요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle.jdbc에 액세스할 수 없는 경우.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PreparedStatement 클래스(및 강제로 java.sql을 사용합니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;#setXXXAtName() 메서드를 지원하지 않는 PreparedStatement는 명명된 매개 변수를 사용하는 제안된 솔루션은 옵션이 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;준비된 문 및 생성된 키를 사용했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필수 값을 전달하기 위한 홀더 접근 방식(운 좋게도 7보다 작음)을 사용하고 생성된 기본 키를 사용하여 나머지 값에 대한 간단한 SQL 업데이트를 실행했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/277744/jdbc-oracle-arrayindexoutofboundsexception&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/659</guid>
      <comments>https://yellowcard.tistory.com/659#entry659comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:52 +0900</pubDate>
    </item>
    <item>
      <title>powershell: invoke-sqlcmd에 의한 오류 원인을 잡는 방법?</title>
      <link>https://yellowcard.tistory.com/658</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;powershell: invoke-sqlcmd에 의한 오류 원인을 잡는 방법?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;invoke-sql에 이상이 있으면 잡고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 다음 명령을 실행하면 $sql이 잘못되면 잡을 수 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 예외를 어떻게 잡습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; try {
     Invoke-Sqlcmd -Query $sql -ServerInstance t1 -database db -QueryTimeout 65535 -ErrorAction 'Stop'
   } catch{
      &quot;error when running sql $sql&quot;
   }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;test.ps1이라는 스크립트를 사용하면 문제가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add-pssnapin SqlServerCmdletSnapin100
get-host
$sql = &quot;selects * from syscomments&quot;
$server = &quot;&quot;
$database = &quot;&quot;
$username = &quot;&quot;
$password = &quot;&quot;
try {
    Invoke-Sqlcmd -Query $sql -ServerInstance $server -database $database -QueryTimeout 65535 -ErrorAction 'Stop' -username $username -password $password
} catch {
  &quot;error when running sql $sql&quot;
  Write-Host($error)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 출력은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;PS C:\&amp;gt; .\test.ps1
Name             : ConsoleHost
Version          : 2.0
InstanceId       : 9ac019da-97bd-45d1-bfa5-65fb4d376dc6
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-AU
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

error when running sql selects * from syscomments

Incorrect syntax near '*'.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 입력 파라미터를 사용하고 있습니까? 파워셸 1 또는 2를 사용하고 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/4766250/powershellhow-to-catch-the-error-cause-by-invoke-sqlcmd&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>powershell</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/658</guid>
      <comments>https://yellowcard.tistory.com/658#entry658comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:46 +0900</pubDate>
    </item>
    <item>
      <title>CSS를 사용하면 캔버스가 늘어나지만 '너비'와 '높이' 속성은 정상입니다.</title>
      <link>https://yellowcard.tistory.com/657</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS를 사용하면 캔버스가 늘어나지만 '너비'와 '높이' 속성은 정상입니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2개의 캔버스가 있는데, 하나는 HTML 속성을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크기를 맞추기 위해 다른 하나는 CSS를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;compteur1&quot; width=&quot;300&quot; height=&quot;300&quot; onmousedown=&quot;compteurClick(this.id);&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&quot;compteur2&quot; style=&quot;width: 300px; height: 300px;&quot; onmousedown=&quot;compteurClick(this.id);&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Competeur1은 표시해야 하지만 Competeur2는 표시되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콘텐츠는 300x300 캔버스에 자바스크립트를 이용하여 그려집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;디스플레이 차이가 나는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/2jpjv.jpg&quot; alt=&quot;alt text&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아무래도.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성은 캔버스의 좌표계의 너비 또는 높이를 결정하는 반면 CSS 속성은 표시될 상자의 크기만 결정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 &lt;a href=&quot;https://html.spec.whatwg.org/multipage/canvas.html#attr-canvas-width&quot; rel=&quot;noreferrer&quot;&gt;HTML 규격&lt;/a&gt;에서 다음과 같이 설명됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;canvas&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;element에는 element의 비트맵 크기를 제어할 수 있는 두 가지 속성이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 지정된 경우 이러한 특성에는 &lt;em&gt;유효한 음&lt;/em&gt;이 아닌 &lt;em&gt;정수&lt;/em&gt;의 값이 있어야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;음수&lt;/em&gt;가 아닌 &lt;em&gt;정수를 구문&lt;/em&gt; 분석하는 &lt;em&gt;규칙&lt;/em&gt;을 사용하여 숫자 값을 구해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성이 없거나 값을 구문 분석하여 오류를 반환하는 경우 기본값을 대신 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본값을 300으로 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본값은 150입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설정 방법&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캔버스에서는 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-javascript prettyprint-override&quot;&gt;&lt;code&gt;canvasObject.setAttribute('width', '150');
canvasObject.setAttribute('height', '300');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위해서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소, CSS 규칙&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;페이지에 그려질 캔버스 요소의 실제 크기를 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반면에 HTML 속성은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캔버스 API가 사용할 좌표계 또는 '그리드'의 크기를 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 다음을 생각해 보겠습니다(&lt;a href=&quot;http://jsfiddle.net/BYossarian/7CWCs/3/&quot;&gt;jsfiddle&lt;/a&gt;).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;var ctx = document.getElementById('canvas1').getContext('2d');
ctx.fillStyle = &quot;red&quot;;
ctx.fillRect(10, 10, 30, 30);

var ctx2 = document.getElementById('canvas2').getContext('2d');
ctx2.fillStyle = &quot;red&quot;;
ctx2.fillRect(10, 10, 30, 30);&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;canvas {
  border: 1px solid black;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;canvas1&quot; style=&quot;width: 50px; height: 100px;&quot; height=&quot;50&quot; width=&quot;100&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&quot;canvas2&quot; style=&quot;width: 100px; height: 100px;&quot; height=&quot;50&quot; width=&quot;100&quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;둘 다 캔버스 요소의 내부 좌표를 기준으로 동일한 것을 그렸습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 두 번째 캔버스에서는 CSS 규칙에 의해 캔버스 전체가 더 넓은 영역으로 확장되기 때문에 빨간색 직사각형의 폭이 두 배가 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: CSS가 다음을 규정하는 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;및/또는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지정되지 않으면 브라우저는 HTML 속성을 사용하여 이러한 값의 1단위가 페이지에서 1px가 되도록 요소의 크기를 조정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 특성을 지정하지 않으면 기본값은 a입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;300&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;150&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS에서 너비와 높이를 설정하면 캔버스가 늘어납니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캔버스의 치수를 동적으로 조작하려면 다음과 같이 자바스크립트를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;canvas = document.getElementById('canv');
canvas.setAttribute('width', '438');
canvas.setAttribute('height', '462');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;브라우저는 CSS 너비와 높이를 사용하지만 캔버스 요소는 캔버스 너비와 높이에 따라 확장됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트에서 cs 너비와 높이를 읽고 캔버스 너비와 높이를 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var myCanvas = $('#TheMainCanvas');
myCanvas[0].width = myCanvas.width();
myCanvas[0].height = myCanvas.height();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;i&gt;샤니멀&lt;/i&gt; 교정&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var el = $('#mycanvas');
el.attr('width', parseInt(el.css('width')))
el.attr('height', parseInt(el.css('height')))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캔버스는 이미지를 버퍼 단위로 렌더링하므로 너비와 높이를 지정하면 HTML은 버퍼 크기와 길이가 변경되지만 CSS를 사용하면 버퍼의 크기는 변경되지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지를 확대하는 것.&lt;/font&gt;&lt;/p&gt; 
&lt;h4&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 크기 조정을 사용합니다.&lt;/font&gt;&lt;/h4&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캔버스 크기 변경 -&amp;gt; 버퍼 크기 변경 -&amp;gt; 렌더링&lt;/font&gt;&lt;/p&gt; 
&lt;h4&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS 크기 조정 사용&lt;/font&gt;&lt;/h4&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;캔버스 크기 변경 -&amp;gt; 렌더링&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버퍼 길이는 변경되지 않은 상태로 유지되므로 컨텍스트가 영상을 렌더링할 때 영상이 크기가 조정된 캔버스에 표시됩니다&lt;strong&gt;(단&lt;/strong&gt;, &lt;strong&gt;변경되지 않은 버퍼&lt;/strong&gt;에 렌더링됨&lt;strong&gt;).&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS는 캔버스 요소의 너비와 높이를 설정하여 그려지는 모든 것을 치우치게 하는 좌표 공간에 영향을 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;바닐라 자바스크립트로 가로와 세로를 설정하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;canvas.width = numberForWidth

canvas.height = numberForHeight
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 CSS가 캔버스 크기를 지정하는 데 훨씬 더 좋은 기계를 가지고 있고 CSS는 자바스크립트나 HTML이 아닌 스타일링을 결정해야 한다고 생각합니다. 그렇기 때문에 캔버스 문제를 해결하기 위해서는 HTML에서 너비와 높이를 설정하는 것이 중요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS에는 HTML에 있는 것을 포함하여 속성에 대한 다른 스타일링 규칙을 무시할 수 있는 규칙이 있습니다. 보통 사용법은 눈살을 찌푸리게 하지만 여기서 사용법은 &lt;em&gt;합법적&lt;/em&gt;인 해킹입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WebAssembly용 Rust 모듈에서 다음 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-rust prettyprint-override&quot;&gt;&lt;code&gt;fn update_buffer(canvas: &amp;amp;HtmlCanvasElement) {
    canvas.set_width(canvas.client_width() as u32);
    canvas.set_height(canvas.client_height() as u32);
}

//.. 
#[wasm_bindgen(start)]
pub fn start() -&amp;gt; Result&amp;lt;(), JsValue&amp;gt; {
    // ...
    let canvas: Rc&amp;lt;_&amp;gt; = document
        .query_selector(&quot;canvas&quot;)
        .unwrap()
        .unwrap()
        .dyn_into::&amp;lt;HtmlCanvasElement&amp;gt;()
        .unwrap()
        .into();
    update_buffer(&amp;amp;canvas);
    // ...

    // create resizing handler for window
    {
        let on_resize = Closure::&amp;lt;dyn FnMut(_)&amp;gt;::new(move |_event: Event| {
            let canvas = canvas.clone();
            // ...

            update_buffer(&amp;amp;canvas);
            // ...
        window.add_event_listener_with_callback(&quot;resize&quot;, on_resize.as_ref().unchecked_ref())?;
        on_resize.forget();
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;거기서 WASM 모듈이 로드되고 윈도우 크기가 조정될 때마다 캔버스 버퍼를 업데이트합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수동으로 지정하여 작업을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 의 값으로 캔버스의. 버퍼를 업데이트하는 더 좋은 방법이 있을지도 모르지만, 나는 이 솔루션이 @SamB, @CoderNaveed, @AnthonyGedeon, @Bluerain, @Ben Jackson, @Manolo, @XaviGuardia, @Russel Harkins, @fermar에 의해 제안된 것보다 더 낫다고 믿습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소는 HTML이 아닌 CSS로 스타일링됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;와는 달리&lt;/font&gt;&lt;/font&gt;&lt;code&gt;elem.style.width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&amp;amp;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;elem.style.height&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Manolo에 의해 사용되는 트릭 또는 @XaviGuardia에 의해 사용되는 JQuery와 동등한 것, 그것은 효과가 있을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;canvas&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크기는 다음과 같이 용법으로 지정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;flex&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;grid&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항목.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Russel Harkings의 솔루션과 달리 이 솔루션은 크기 조정도 처리합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비록 그의 대답이 정말 깨끗하고 쉽기 때문에 마음에 듭니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WASM은 미래!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하하 :D&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;P.S. 엄청 많습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.unwrap()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;러스트는 발생 가능한 실패를 명시적으로 처리하기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추신:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    {
        let on_resize = Closure::&amp;lt;dyn FnMut(_)&amp;gt;::new(move |_event: Event| {
            let canvas = canvas.clone();
            // ...

            update_buffer(&amp;amp;canvas);
            // ...
        window.add_event_listener_with_callback(&quot;resize&quot;, on_resize.as_ref().unchecked_ref())?;
        on_resize.forget();
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 나은 도서관으로 훨씬 더 깨끗하게 할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_resize_handler(&amp;amp;window, move |e: ResizeEvent| {
  let canvas = canvas.clone();
  // ...

  update_buffer(&amp;amp;canvas);
})
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS 미디어 쿼리와 같이 동적 동작을 원하는 경우 캔버스 너비 및 높이 속성을 사용하지 마십시오.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CSS 규칙을 사용한 다음 캔버스 렌더링 컨텍스트를 얻기 전에 CSS 너비 및 높이 속성을 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var elem = document.getElementById(&quot;mycanvas&quot;);

elem.width = elem.style.width;
elem.height = elem.style.height;

var ctx1 = elem.getContext(&quot;2d&quot;);
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2588181/canvas-is-stretched-when-using-css-but-normal-with-width-height-attributes&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>CSS</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/657</guid>
      <comments>https://yellowcard.tistory.com/657#entry657comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:39 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security에서 보안 주석 구성에서 URL 패턴 제외</title>
      <link>https://yellowcard.tistory.com/656</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Security에서 보안 주석 구성에서 URL 패턴 제외&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;java config approach를 사용하여 spring security를 구성한 spring web application을 가지고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증에서 몇 가지 URL 패턴(예: 정적 리소스 등)을 제외하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;spring security xml config로 이것을 더 일찍 해보았지만 antmatchers를 추가하는 것이 도움이 되지 않아 java config로 알아낼 수 없었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 보안 구성 클래스 확장에 추가된 나의 코드입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WebSecurityConfigurerAdapter&lt;/code&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers(&quot;/authFailure&quot;)
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic()
                .and()
                .authenticationProvider(_provider)
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilter(authFilter())
                .addFilterAfter(executionContextFilter(),
                        TokenBasedSecurityFilter.class).csrf().disable();
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 사용하는 Spring Security 버전은 3.2.0입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;b&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/b&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제외된 URL을 치며 얻은 스택 트레이스,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request
    at com.inventory.ricemill.tba.spring.TokenBasedSecurityFilter.doFilter(TokenBasedSecurityFilter.java:59)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

Apr 01, 2014 10:18:41 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Inventory] in context with path [/ricemill] threw exception [Request processing failed; nested exception is org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request] with root cause
org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request
    at com.inventory.ricemill.tba.spring.TokenBasedSecurityFilter.doFilter(TokenBasedSecurityFilter.java:59)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요청은 스프링 보안 필터 체인에 등록된 필터를 통과하지만 요청이 앤트매처와 함께 무시되므로 통과되지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Github에 게시된 Spring 보안 예제에서 솔루션을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;WebSecurityConfigurerAdapter&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;과부하가 걸린&lt;/font&gt;&lt;/font&gt;&lt;code&gt;configure&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;take하는 메세지&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WebSecurity&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무시할 요청에 대한 개미 일치를 수용하는 논쟁으로서.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(&quot;/authFailure&quot;);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 &lt;a href=&quot;https://github.com/spring-projects/spring-security-javaconfig/blob/master/samples/preauth/src/main/java/org/springframework/security/samples/config/SecurityConfig.java&quot;&gt;스프링 보안 샘플&lt;/a&gt; 참조&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증된 URL 패턴을 구성하는 위치가 어디입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신 코드에 uri가 하나밖에 안 보이네요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성(HttpSecurity) 메서드가 여러 개 있습니까, 아니면 한 개뿐입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나의 방법으로 모든 URI가 필요해 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 것에 접근하기 위해 인증이 필요한 사이트가 있어서 /*를 보호하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 인증을 하기 위해서는 /로그인을 보호하고 싶지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(로그인 페이지를 예쁘게 만들 수 있도록) 액세스를 허용하고 싶은 정적 자산과 인증이 필요하지 않은 상태 확인 페이지도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 /admin이라는 리소스가 있습니다. 이 리소스는 다른 사이트보다 더 높은 권한을 요구합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음이 저에게 도움이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
        .antMatchers(&quot;/login**&quot;).permitAll()
        .antMatchers(&quot;/healthcheck**&quot;).permitAll()
        .antMatchers(&quot;/static/**&quot;).permitAll()
        .antMatchers(&quot;/admin/**&quot;).access(&quot;hasRole('ROLE_ADMIN')&quot;)
        .antMatchers(&quot;/**&quot;).access(&quot;hasRole('ROLE_USER')&quot;)
        .and()
            .formLogin().loginPage(&quot;/login&quot;).failureUrl(&quot;/login?error&quot;)
                .usernameParameter(&quot;username&quot;).passwordParameter(&quot;password&quot;)
        .and()
            .logout().logoutSuccessUrl(&quot;/login?logout&quot;)
        .and()
            .exceptionHandling().accessDeniedPage(&quot;/403&quot;)
        .and()
            .csrf();

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: 첫 번째 경기 승리이므로 주문서를 가지고 플레이해야 할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 원래 /**를 먼저 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        .antMatchers(&quot;/**&quot;).access(&quot;hasRole('ROLE_USER')&quot;)
        .antMatchers(&quot;/login**&quot;).permitAll()
        .antMatchers(&quot;/healthcheck**&quot;).permitAll()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이로 인해 사이트는 계속해서 모든 /login 요청을 /login으로 다시 리디렉션했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마찬가지로 /admin/**도 마지막으로 사용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        .antMatchers(&quot;/**&quot;).access(&quot;hasRole('ROLE_USER')&quot;)
        .antMatchers(&quot;/admin/**&quot;).access(&quot;hasRole('ROLE_ADMIN')&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이로 인해 내 권한 없는 테스트 사용자 &quot;손님&quot;이 관리 인터페이스에 액세스할 수 있게 되었습니다(예!).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개미매처스를 추가하는 것이 도움이 되지 않는다는 것은 무엇을 의미합니까? 개미매처스는 정확히 당신이 하는 방법입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 것이 작동해야 합니다(분명히 URL을 적절하게 변경).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers(&quot;/authFailure&quot;).permitAll()
                .antMatchers(&quot;/resources/**&quot;).permitAll()
                .anyRequest().authenticated()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여전히 기쁨을 느끼지 못하는 경우에는 더 많은 세부 정보/적층 추적 등을 제공해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://automateddeveloper.blogspot.co.uk/2014/02/spring-4-xml-to-annotation-configuration.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML-Java config switch에 대한 자세한 내용은 여기에 있습니다.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래와 같이 &quot;authorizeRequests()&quot; 이전에 &quot;antMatcher&quot;를 지정하면 인증이 &quot;antMatcher&quot;에 지정된 URL로만 제한됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http.csrf(.disable() .antMatcher(&quot;/&lt;strong&gt;apurl&lt;/strong&gt; needsauth/**&quot;.authorizeRequests().&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 이미 제시된 답변을 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증과 허가의 차이에 대한 혼란이 많은 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Security는 인증을 먼저 실행하고, 인증을 실행한 다음에 인증을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 인증 필터를 먼저 실행하고 인증된 엔드포인트를 확인한 후 그 후에만 인증된 엔드포인트를 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 지정 인증 필터를 피하려면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;permitAll&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증이 아닌 &lt;strong&gt;인증&lt;/strong&gt;과 관련된 것이므로 작동하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Spring Security 5.7.0-M2는 더 이상 사용하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;WebSecurityConfigurerAdapter&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인증 필터는 다음을 사용하여 무시할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; @Bean
 public WebSecurityCustomizer ignoringCustomizer() {
        return (web) -&amp;gt; web.ignoring().requestMatchers(&quot;/ignore1&quot;, &quot;/ignore2&quot;);
 }
 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 개미매처스를 이용해서.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 좀 더 현대적인 방식으로 보면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -&amp;gt; web.ignoring().antMatchers(&quot;/authFailure&quot;);
    }

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 모든 해결책들이 &lt;strong&gt;구식&lt;/strong&gt;이라는 것을 발견했습니다...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 제가 해결한 해결책입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableWebSecurity/*(debug = true)*/
@RequiredArgsConstructor
@EnableMethodSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    // @formatter:off
    return http
        .csrf()
            .disable()
            .headers().frameOptions().disable()
        .and()
        // Enable CORS at Spring Security level
        .cors()
        .and()
        .authorizeHttpRequests()
            .requestMatchers(&quot;/login/**&quot;, &quot;/api/noAuth/**&quot;)
                .permitAll()
            .anyRequest()
                .authenticated()
        .and()
        .oauth2ResourceServer()
            .jwt()
                .jwtAuthenticationConverter(new CustomJwtAuthenticationConverter(new UserDetailsConverter()))
        .and()
        .and().build();
    // @formatter:on

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/22767205/spring-security-exclude-url-patterns-in-security-annotation-configurartion&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/656</guid>
      <comments>https://yellowcard.tistory.com/656#entry656comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:31 +0900</pubDate>
    </item>
    <item>
      <title>우커머스는 가격을 계산하고 절약합니다.</title>
      <link>https://yellowcard.tistory.com/655</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우커머스는 가격을 계산하고 절약합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 훌륭한 튜토리얼 http://www.remicorson.com/mastering-woocommerce-products-custom-fields/ 을 사용하여 Woocmerce/Add Product/General 탭에 사용자 지정 필드를 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 정의 필드(높이, 너비, 승수)가 데이터베이스 OK(확인)에 저장되고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;나는 커스텀&lt;/strong&gt; 필드를 &lt;strong&gt;기반으로 가격을 계산하고,&lt;/strong&gt; 그 &lt;strong&gt;가격을 정가로 데이터베이스에 저장하고 싶습니다&lt;/strong&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 가격이 저장되지 않고 있다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 제 코드가 있습니다. 함수에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 아이 테마의 php:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* CUSTOM FIELDS: Add custom fields to Product/General pane in Woocommerce
  from http://www.remicorson.com/mastering-woocommerce-products-custom-fields/ */

// Display Fields
add_action('woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields');
// Save Fields
add_action('woocommerce_process_product_meta', 'woo_add_custom_general_fields_save');

function woo_add_custom_general_fields()
{
    global $woocommerce, $post;
    echo '&amp;lt;div class=&quot;options_group&quot;&amp;gt;';

    // Product Height
    woocommerce_wp_text_input(
        array(
            'id' =&amp;gt; '_product_height',
            'label' =&amp;gt; __('Product Height (inches)', 'woocommerce'),
            'placeholder' =&amp;gt; '',
            'description' =&amp;gt; __('Enter the product height in inches here.', 'woocommerce'),
            'type' =&amp;gt; 'number',
            'custom_attributes' =&amp;gt; array(
                'step' =&amp;gt; 'any',
                'min' =&amp;gt; '0'
            )
        )
    );

    // Product Width
    woocommerce_wp_text_input(
        array(
            'id' =&amp;gt; '_product_width',
            'label' =&amp;gt; __('Product Width (inches)', 'woocommerce'),
            'placeholder' =&amp;gt; '',
            'description' =&amp;gt; __('Enter the product width in inches here.', 'woocommerce'),
            'type' =&amp;gt; 'number',
            'custom_attributes' =&amp;gt; array(
                'step' =&amp;gt; 'any',
                'min' =&amp;gt; '0'
            )
        )
    );

    // Product Area Multiplier
    woocommerce_wp_text_input(
        array(
            'id' =&amp;gt; '_product_area_mult',
            'label' =&amp;gt; __('Product Area Multiplier', 'woocommerce'),
            'placeholder' =&amp;gt; '',
            'description' =&amp;gt; __('Enter Product Area Multiplier. ', 'woocommerce'),
            'type' =&amp;gt; 'number',
            'custom_attributes' =&amp;gt; array(
                'step' =&amp;gt; 'any',
                'min' =&amp;gt; '0'
            )
        )
    );

    // Product Area Price: added this field to check if this value is being calculated
    woocommerce_wp_text_input(
        array(
            'id' =&amp;gt; '_product_area_price',
            'label' =&amp;gt; __('Product Area Price', 'woocommerce'),
            'placeholder' =&amp;gt; '',
            'description' =&amp;gt; __('Product Area Price. Calculated automatically', 'woocommerce'),
            'type' =&amp;gt; 'number',
            'custom_attributes' =&amp;gt; array(
                'step' =&amp;gt; 'any',
                'min' =&amp;gt; '0'
            )
        )
    );

    echo '&amp;lt;/div&amp;gt;';
}

function woo_add_custom_general_fields_save($post_id)
{
    $woocommerce_product_height = $_POST['_product_height'];
    $woocommerce_product_width = $_POST['_product_width'];
    $woocommerce_product_area_mult = $_POST['_product_area_mult'];
    $woocommerce_product_area_price = $_POST['_product_area_price'];

    // save height, width, multiplier
    if (!empty($woocommerce_product_height))
        update_post_meta($post_id, '_product_height', esc_attr($woocommerce_product_height));

    if (!empty($woocommerce_product_width))
        update_post_meta($post_id, '_product_width', esc_attr($woocommerce_product_width));

    if (!empty($woocommerce_product_area_mult))
        update_post_meta($post_id, '_product_area_mult', esc_attr($woocommerce_product_area_mult));


    // calculate and save _product_area_price, _regular_price, price as Height*Width*Mult
    if (!empty($woocommerce_product_height) &amp;amp;&amp;amp; !empty($woocommerce_product_width) &amp;amp;&amp;amp; !empty($woocommerce_product_area_mult))
        $woocommerce_product_area_price = $woocommerce_product_height * $woocommerce_product_width * $woocommerce_product_area_mult;

    if (!empty($woocommerce_product_area_price))
        update_post_meta($post_id, '_product_area_price', esc_attr($woocommerce_product_area_price));

    if (!empty($woocommerce_product_area_price))
    {
        update_post_meta($post_id, '_regular_price', esc_attr($woocommerce_product_area_price));
        update_post_meta($post_id, '_price', esc_attr($woocommerce_product_area_price));
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스의 가격 필드를 업데이트하는 것 외에는 모든 것이 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 사용자 정의 필드는 동일한 구문으로 업데이트됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 확인한 바로는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$woocommerce_product_area_price&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;존재하며 사용자 지정 필드를 업데이트하고 있지만 동일한 변수가 업데이트되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_regular_price&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_price&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;들녘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 이 선들은 작동하지 않습니다. 비록 같은 변수가 업데이트될 지라도.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_product_area_price&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필드:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (!empty($woocommerce_product_area_price))
{
    update_post_meta($post_id, '_regular_price', esc_attr($woocommerce_product_area_price));
    update_post_meta($post_id, '_price', esc_attr($woocommerce_product_area_price));
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;혹시 우커머스에서 가격 업데이트를 위해 누락된 구문이나 체크가 있는 것은 아닐까요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 가격에 문제가 있다는 것을 프론트엔드에 표시하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_price&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반영하고 싶다면 키&lt;/font&gt;&lt;/font&gt;&lt;code&gt;_regular_price&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;맨 앞에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 코드를 사용해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if (!empty($area_price)){
    update_post_meta($post_id, '_regular_price', esc_attr($area_price));
    update_post_meta($post_id, '_price', esc_attr($area_price)); //&amp;lt;-- Add this line.
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트됨&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우선 &lt;strong&gt;순위&lt;/strong&gt;를 더 &lt;strong&gt;높이면&lt;/strong&gt; 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;woocommerce_process_product_meta&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;액션 훅, 효과가 있을 겁니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_action('woocommerce_process_product_meta', 'woo_add_custom_general_fields_save', 99);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 테스트해봤는데 잘 작동하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/41628018/woocommerce-calculate-and-save-price&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/655</guid>
      <comments>https://yellowcard.tistory.com/655#entry655comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:21 +0900</pubDate>
    </item>
    <item>
      <title>LISTAGG 윈도잉 절과 동등함</title>
      <link>https://yellowcard.tistory.com/654</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LISTAGG 윈도잉 절과 동등함&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LISTAGG&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수를 사용하면 분석적으로 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;OVER (PARTITION BY column..)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;절&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 다음과 같이 윈도우를 사용하는 것은 지원하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ROWS&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RANGE&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스토어 레지스터에서 설정한 데이터가 있습니다(질문은 단순화).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;레지스터 테이블의 수량은 항상 1개 - 1개 품목, 1개 거래선입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;TranID TranLine ItemId OrderID Dollars Quantity
------ -------- ------ ------- ------- --------
1      101      23845  23      2.99    1
1      102      23845  23      2.99    1
1      103      23845  23      2.99    1
1      104      23845  23      2.99    1
1      105      23845  23      2.99    1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이 데이터를 수량별로 분류하는 특별 주문 시스템의 테이블에 &quot;매칭&quot;해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시스템은 여러 줄에서 동일한 항목 ID를 가질 수 있습니다(항목이 동일하더라도 주문한 구성요소가 다를 수 있음).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ItemId OrderID Order Line Dollars Quantity
------ ------- ---------- ------- --------
23845  23      1          8.97    3
23845  23      2          5.98    2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 데이터를 맞출 수 있는 &lt;em&gt;방법&lt;/em&gt;은 주문 ID, 아이템 ID, 달러 금액뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;본질적으로 저는 다음과 같은 결과를 얻어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ItemId OrderID Order Line Dollars Quantity Tran ID  Tran Lines
------ ------- ---------- ------- -------- -------  ----------
23845  23      1          8.97    3        1        101;102;103
23845  23      2          5.98    2        1        104;105
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전 노선이 어떤 식으로든 주문되는지는 특별히 신경 쓰지 않습니다. 제가 신경 쓰는 것은 달러의 금액이 일치하는 것과 특별 주문에 대한 합계를 계산할 때 레지스터의 한 줄을 &quot;재사용&quot;하지 않는 것뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 표로 구분할 필요가 없습니다. 이는 보고 목적이며 세부 사항은 레지스터 트랜잭션 라인 수준으로 다시 돌아가지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;처음에는 분석 기능을 사용하여 이 작업을 수행하여 주문 시스템에서 달러 금액 및 수량과 일치하는 첫 번째 행 집합을 식별하고 다음과 같은 결과 집합을 제공하는 &quot;최상의 일치&quot;를 수행할 수 있다고 생각했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;TranID TranLine ItemId OrderID Dollars Quantity CumDollar  CumQty
------ -------- ------ ------- ------- -------- --------   ------
1      101      23845  23      2.99    1        2.99       1
1      102      23845  23      2.99    1        5.98       2
1      103      23845  23      2.99    1        8.97       3
1      104      23845  23      2.99    1        11.96      4
1      105      23845  23      2.99    1        14.95      5
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지금까지 좋아요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 쿼리에 LISTAGG를 추가하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT tranid, tranline, itemid, orderid, dollars, quantity, 
       SUM(dollars) OVER (partition by tranid, itemid, orderid order by tranline) cumdollar,
       SUM(quantity) OVER (partition by tranid, itemid, orderid order by tranline) cumqty
       LISTAGG (tranline) within group (order by tranid, itemid, orderid, tranline) OVER (partition by tranid, itemid, orderid)
FROM table
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 누적 agg가 아닌 전체 agg를 반환한다는 것을 알게 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;TranID TranLine ItemId OrderID Dollars Quantity CumDollar  CumQty ListAgg
------ -------- ------ ------- ------- -------- --------   ------ -------
1      101      23845  23      2.99    1        2.99       1      101;102;103;104;105
1      102      23845  23      2.99    1        5.98       2      101;102;103;104;105
1      103      23845  23      2.99    1        8.97       3      101;102;103;104;105
1      104      23845  23      2.99    1        11.96      4      101;102;103;104;105
1      105      23845  23      2.99    1        14.95      5      101;102;103;104;105
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 이건 쓸모가 없어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가능하다면 SQL에서 이것을 하는 것이 훨씬 더 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;커서와 절차 논리로 이를 수행할 수 있다는 것을 알고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;LISTAGG 분석 함수 또는 이를 지원하는 다른 분석 함수로 윈도우를 설정할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;11gR2입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 달성할 수 있는 유일한 방법은 상호 연관된 하위 쿼리를 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WITH CTE AS
(   SELECT  TranID, 
            TranLine, 
            ItemID, 
            OrderID, 
            Dollars, 
            Quantity, 
            SUM(dollars) OVER (PARTITION BY TranID, ItemID, OrderID ORDER BY TranLine) AS CumDollar, 
            SUM(Quantity) OVER (PARTITION BY TranID, ItemID, OrderID ORDER BY TranLine) AS CumQuantity
    FROM    T
)
SELECT  TranID, 
        TranLine, 
        ItemID, 
        OrderID, 
        Dollars, 
        Quantity, 
        CumDollar, 
        CumQuantity, 
        (   SELECT  LISTAGG(Tranline, ';') WITHIN GROUP(ORDER BY CumQuantity)
            FROM    CTE T2
            WHERE   T1.CumQuantity &amp;gt;= T2.CumQuantity
            AND     T1.ItemID = T2.ItemID
            AND     T1.OrderID = T2.OrderID
            AND     T1.TranID = T2.TranID
            GROUP BY tranid, itemid, orderid
        ) AS ListAgg
FROM    CTE T1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이것이 당신이 요구했던 정확한 결과를 주지 못한다는 것을 알고 있지만, 그것이 LISTAG 누적의 문제를 극복하고 당신이 나아갈 수 있도록 하기에 충분하기를 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;솔루션을 시연하기 위해 &lt;a href=&quot;http://sqlfiddle.com/#!4/c7f0a/5&quot; rel=&quot;noreferrer&quot;&gt;SQL Fiddle&lt;/a&gt;을 설치했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예제에서 스토어 레지스터 테이블은 5개의 행을 포함하고 특수 주문 시스템 테이블은 2개의 행을 포함합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예상 결과 세트에는 특별 주문 시스템 테이블의 두 행이 포함되어 있으며, 스토어 레지스터 테이블의 모든 &quot;트란 라인&quot;이 &quot;트랜 라인&quot; 열에 표시되어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 이 5개 행에서 2개 행으로 집계해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, LISTAGG 분석 기능이 필요한 것이 아니라 LISTAGG Aggregate 기능이 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스토어 레지스터 테이블의 행을 특수 주문 시스템 테이블의 오른쪽 행에 결합하는 것이 여러분의 과제입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 달러와 수량의 합계를 계산해서 잘 가고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;누락된 유일한 단계는 각 상점 레지스터 행을 각 특수 주문 시스템 행에 할당할 수 있는 달러 및 수량 범위를 정의하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 예가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 테이블을 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; create table store_register_table (tranid,tranline,itemid,orderid,dollars,quantity)
  2  as
  3  select 1, 101, 23845, 23, 2.99, 1 from dual union all
  4  select 1, 102, 23845, 23, 2.99, 1 from dual union all
  5  select 1, 103, 23845, 23, 2.99, 1 from dual union all
  6  select 1, 104, 23845, 23, 2.99, 1 from dual union all
  7  select 1, 105, 23845, 23, 2.99, 1 from dual
  8  /

Table created.

SQL&amp;gt; create table special_order_system_table (itemid,orderid,order_line,dollars,quantity)
  2  as
  3  select 23845, 23, 1, 8.97, 3 from dual union all
  4  select 23845, 23, 2, 5.98, 2 from dual
  5  /

Table created.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 질문은:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; with t as
  2  ( select tranid
  3         , tranline
  4         , itemid
  5         , orderid
  6         , sum(dollars) over (partition by itemid,orderid order by tranline) running_sum_dollars
  7         , sum(quantity) over (partition by itemid,orderid order by tranline) running_sum_quantity
  8      from store_register_table srt
  9  )
 10  , t2 as
 11  ( select itemid
 12         , orderid
 13         , order_line
 14         , dollars
 15         , quantity
 16         , sum(dollars) over (partition by itemid,orderid order by order_line) running_sum_dollars
 17         , sum(quantity) over (partition by itemid,orderid order by order_line) running_sum_quantity
 18      from special_order_system_table
 19  )
 20  , t3 as
 21  ( select itemid
 22         , orderid
 23         , order_line
 24         , dollars
 25         , quantity
 26         , 1 + lag(running_sum_dollars,1,0) over (partition by itemid,orderid order by order_line) begin_sum_dollars
 27         , running_sum_dollars end_sum_dollars
 28         , 1 + lag(running_sum_quantity,1,0) over (partition by itemid,orderid order by order_line) begin_sum_quantity
 29         , running_sum_quantity end_sum_quantity
 30      from t2
 31  )
 32  select t3.itemid &quot;ItemID&quot;
 33       , t3.orderid &quot;OrderID&quot;
 34       , t3.order_line &quot;Order Line&quot;
 35       , t3.dollars &quot;Dollars&quot;
 36       , t3.quantity &quot;Quantity&quot;
 37       , t.tranid &quot;Tran ID&quot;
 38       , listagg(t.tranline,';') within group (order by t3.itemid,t3.orderid) &quot;Tran Lines&quot;
 39    from t3
 40         inner join t
 41           on (   t.itemid = t3.itemid
 42              and t.orderid = t3.orderid
 43              and t.running_sum_dollars between t3.begin_sum_dollars and t3.end_sum_dollars
 44              and t.running_sum_quantity between t3.begin_sum_quantity and t3.end_sum_quantity
 45              )
 46   group by t3.itemid
 47       , t3.orderid
 48       , t3.order_line
 49       , t3.dollars
 50       , t3.quantity
 51       , t.tranid
 52  /

    ItemID    OrderID Order Line    Dollars   Quantity    Tran ID Tran Lines
---------- ---------- ---------- ---------- ---------- ---------- --------------------
     23845         23          1       8.97          3          1 101;102;103
     23845         23          2       5.98          2          1 104;105

2 rows selected.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안부 전해요,&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;롭.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/10952950/listagg-equivalent-with-windowing-clause&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/654</guid>
      <comments>https://yellowcard.tistory.com/654#entry654comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:13 +0900</pubDate>
    </item>
    <item>
      <title>한 사용자가 수정한 모든 파일을 알려줄 수 있습니까?</title>
      <link>https://yellowcard.tistory.com/653</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 사용자가 수정한 모든 파일을 알려줄 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 모든 커밋에 걸쳐 한 사용자가 수정한 모든 파일의 목록을 나에게 주고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 특별한 사용 사례는 루비 온 레일 프로젝트의 i18n에 참여한 적이 있는데, 우리는 어떤 파일이 이미 수행되었는지, 어떤 파일이 여전히 수행되어야 하는지 알고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 사용자들은 i18n에 대해서만 작업을 했고, 나머지 코드 베이스에 대해서는 작업을 하지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 그 정보는 모두 입력이 되어야 하는데, 어떻게 빼낼지 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 파일 목록이 간단히 표시되며, 다른 파일은 표시되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git log --no-merges --author=&quot;Pattern&quot; --name-only --pretty=format:&quot;&quot; | sort -u
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필요에 따라 --commiter에 대한 --작성자를 전환합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것만이 유일한 방법은 아니지만, 효과는 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git log --pretty=&quot;%H&quot; --author=&quot;authorname&quot; |
    while read commit_hash
    do
        git show --oneline --name-only $commit_hash | tail -n+2
    done | sort | uniq
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 한 줄로:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git log --pretty=&quot;%H&quot; --author=&quot;authorname&quot; | while read commit_hash; do git show --oneline --name-only $commit_hash | tail -n+2; done | sort | uniq
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;git log --stat --committer=&amp;lt;user&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 그냥 사용자 이름을 위에 올려놓기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--committer=&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옵션(또는 사용)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--author=&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;적절한 경우).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 커밋당 모든 파일이 삭제되므로 중복이 발생할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;git log --pretty= --author=@abcd.com --name-only | sort -u | wc -l
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;회사별로 변경된 모든 파일을 깃레포에 표시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git log --pretty= --author=user@abcd.com --name-only | sort -u | wc -l
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 수정된 파일을 git repo에서 작성자 이름 'user'로 표시합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일 이름 목록만 원하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;git log --author= --pretty= 형식:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;%h | xargsgit diff --name-only | sort | uniq&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/6349139/can-i-get-git-to-tell-me-all-the-files-one-user-has-modified&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>git</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/653</guid>
      <comments>https://yellowcard.tistory.com/653#entry653comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:16:04 +0900</pubDate>
    </item>
    <item>
      <title>libfoo.so .1과 같은 라이브러리 이름이 지정된 전체 파일 경로는 어떻게 찾을 수 있습니까?</title>
      <link>https://yellowcard.tistory.com/652</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;libfoo.so .1과 같은 라이브러리 이름이 지정된 전체 파일 경로는 어떻게 찾을 수 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;링커를 구현하지 않거나 사용하지 않음&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ldd&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 도서관으로 가는 모든 길을 어떻게 찾을 수 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;리눅스에서 사용할 수 있는 표준 라이브러리가 있습니까? (POSIX 가능성이 있습니까?)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ldd&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;grep&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용 중인 파일에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libGL.so.1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ ldd /usr/bin/glxinfo | grep libGL
libGL.so.1 =&amp;gt; /usr/lib/libGL.so.1 (0x00007f34ff796000)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;예를 들어,&lt;/strong&gt; 도서관 이름을 &lt;strong&gt;지정하면 어떻게 전체 경로를 찾을&lt;/strong&gt; 수 &lt;strong&gt;있습니까?&lt;/strong&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;32비트 및 64비트 라이브러리 찾기 옵션을 수락하는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 어떤 도서관도 그렇게 하지 않는다면, 이것을 할 수 있는 프로그램이 존재합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;뭐 이런 거.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;find-library-path libGL.so.1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;locate libGL.so.1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령어가 계산되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라이브러리를 실제로 로드하고 싶지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dlopen&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도서관에서 코드를 실행한다면요&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;링크 공간을 관리하는 도구인 &lt;a href=&quot;http://linux.die.net/man/8/ldconfig&quot; rel=&quot;noreferrer&quot;&gt;oldconfig&lt;/a&gt;를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-p&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;flag를 사용하면 링크 가능한 모든 라이브러리를 찾아볼 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;홍키 통크의 대답을 확대해 보면, 사령부는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;echo &quot;$(ldconfig -p | grep libGL.so.1 | tr ' ' '\n' | grep /)&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;혼자서 길을 열어줄 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라이브러리를 실제로 로드하고 표준이 아니지만 널리 사용할 수 있는 기능을 사용하는 것이 괜찮으시다면, 전화해 주십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dladdr&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라이브러리의 모든 기호에 로드된 전체 경로 이름을 포함하는 정보가 반환됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GNU가 있는 시스템의 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libc&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 찾은 파이썬은 다음과 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LD_DEBUG&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(의 맨 &lt;a href=&quot;http://man7.org/linux/man-pages/man8/ld.so.8.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;페이지&lt;/a&gt;에 설명됨).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;LD_DEBUG=libs python3 -c &quot;import ctypes; ctypes.CDLL('libssl.so.1.0.0')&quot; 2&amp;gt;&amp;amp;1 | \
    grep -A 1000 &quot;initialize program: python&quot; | grep -A 3 &quot;find library&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출력(의 경우)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;libssl.so.1.0.0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; 15370: find library=libssl.so.1.0.0 [0]; searching
 15370:  search cache=/etc/ld.so.cache
 15370:   trying file=/lib/x86_64-linux-gnu/libssl.so.1.0.0
 15370: 
 15370: find library=libcrypto.so.1.0.0 [0]; searching
 15370:  search cache=/etc/ld.so.cache
 15370:   trying file=/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
 15370: 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://github.com/albertz/system-tools/blob/master/bin/find-lib-in-path.py&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기&lt;/a&gt;에 이러한 스크립트를 구현했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python3

&quot;&quot;&quot;
Like `type` but for libs.
&quot;&quot;&quot;

import sys
import os
from argparse import ArgumentParser
from glob import glob


def parse_ld_conf_file(fn):
    paths = []
    for l in open(fn).read().splitlines():
        l = l.strip()
        if not l:
            continue
        if l.startswith(&quot;#&quot;):
            continue
        if l.startswith(&quot;include &quot;):
            for sub_fn in glob(l[len(&quot;include &quot;):]):
                paths.extend(parse_ld_conf_file(sub_fn))
            continue
        paths.append(l)
    return paths


def get_ld_paths():
    # To be very correct, see man-page of ld.so.
    # And here: http://unix.stackexchange.com/questions/354295/what-is-the-default-value-of-ld-library-path/354296
    # Short version, not specific to an executable, in this order:
    # - LD_LIBRARY_PATH
    # - /etc/ld.so.cache (instead we will parse /etc/ld.so.conf)
    # - /lib, /usr/lib (or maybe /lib64, /usr/lib64)
    paths = []
    if &quot;LD_LIBRARY_PATH&quot; in os.environ:
        paths.extend(os.environ[&quot;LD_LIBRARY_PATH&quot;].split(&quot;:&quot;))
    paths.extend(parse_ld_conf_file(&quot;/etc/ld.so.conf&quot;))
    paths.extend([&quot;/lib&quot;, &quot;/usr/lib&quot;, &quot;/lib64&quot;, &quot;/usr/lib64&quot;])
    return paths


def main():
    arg_parser = ArgumentParser()
    arg_parser.add_argument(&quot;lib&quot;)
    args = arg_parser.parse_args()

    paths = get_ld_paths()
    for p in paths:
        fn = &quot;%s/%s&quot; % (p, args.lib)
        if os.path.exists(fn):
            print(fn)
            return

    print(&quot;Did not found %r in %r.&quot; % (args.lib, paths), file=sys.stderr)
    sys.exit(1)


if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/13148608/how-can-i-find-the-full-file-path-given-a-library-name-like-libfoo-so-1&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/652</guid>
      <comments>https://yellowcard.tistory.com/652#entry652comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:15:58 +0900</pubDate>
    </item>
    <item>
      <title>날짜 시간을 지원하는 파이썬 JSON 인코더?</title>
      <link>https://yellowcard.tistory.com/651</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;날짜 시간을 지원하는 파이썬 JSON 인코더?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python JSON 인코더가 date time을 지원하도록 만드는 우아한 방법이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서드파티 모듈인가요 아니면 쉬운 해킹인가요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 json을 생성하기 위해 db에서 몇 개의 행을 가져오기 위해 토네이도의 데이터베이스 포장지를 사용하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리 결과에는 정규 MySQL 타임스탬프 열이 포함됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python의 기본 json 인코더가 모든 종류의 데이터베이스 쿼리에서 매우 일반적인 자체 datetime 유형을 지원하지 않는다는 것은 매우 짜증나는 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 파이썬의 json 인코더를 수정하고 싶지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좋은 연습이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정말 고마워.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ps: 파이썬 JSON 인코더 기본 메서드를 수정하여 더러운 해킹을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변경 사항:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def default(self, o):
    raise TypeError(repr(o) + &quot; is not JSON serializable&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;받는 사람:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;def default(self, o):
    from datetime import date
    from datetime import datetime
    if isinstance(o, datetime):
        return o.isoformat()
    elif isinstance(o, date):
        return o.isoformat()
    else:
        raise TypeError(repr(o) + &quot; is not JSON serializable&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 개발 환경만을 위한 일시적인 해결책이 될 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 장기적인 솔루션이나 운영 환경의 경우, 이는 매우 부적절하기 때문에 새 서버에 구축할 때마다 수정 작업을 수행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 좋은 방법이 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 파이썬 코드 자체를 수정하고 싶지 않고, 토네이도 소스 코드도 수정하고 싶지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 프로젝트 코드를 사용해서 이를 실현할 수 있는 방법이 있을까요? 가급적이면 한 번에 가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정말 고마워.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;json.dumps(thing, default=str)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://docs.python.org/library/json.html#json.JSONEncoder.default&quot; rel=&quot;noreferrer&quot;&gt;문서&lt;/a&gt;에서는 JSON 인코더를 서브클래싱하고 자신만의 기본 메서드를 구현할 것을 &lt;a href=&quot;http://docs.python.org/library/json.html#json.JSONEncoder.default&quot; rel=&quot;noreferrer&quot;&gt;제안&lt;/a&gt;합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 기본적으로 거기에 있는 것 같군요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 인코더에서 날짜를 처리하지 않는 이유는 JSON에 날짜의 표준 표현이 없기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일부 &lt;a href=&quot;http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx&quot; rel=&quot;noreferrer&quot;&gt;사용자&lt;/a&gt;는 형식을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/Date(1198908717056)/&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 하지만 저는 개인적으로 ISO 형식을 선호합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;import json
import datetime


class DateTimeEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, (datetime.datetime, datetime.date, datetime.time)):
            return obj.isoformat()
        elif isinstance(obj, datetime.timedelta):
            return (datetime.datetime.min + obj).time().isoformat()

        return super(DateTimeEncoder, self).default(obj)

now = datetime.datetime.now()
encoder = DateTimeEncoder()
encoder.encode({&quot;datetime&quot;: now, &quot;date&quot;: now.date(), &quot;time&quot;: now.time()})
&amp;gt; {&quot;datetime&quot;: &quot;2019-07-02T16:17:09.990126&quot;, &quot;date&quot;: &quot;2019-07-02&quot;, &quot;time&quot;: &quot;16:17:09.990126&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;프로젝트를 위해 직접 수업을 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import datetime
import decimal
import json
import sys

class EnhancedJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            ARGS = ('year', 'month', 'day', 'hour', 'minute',
                     'second', 'microsecond')
            return {'__type__': 'datetime.datetime',
                    'args': [getattr(obj, a) for a in ARGS]}
        elif isinstance(obj, datetime.date):
            ARGS = ('year', 'month', 'day')
            return {'__type__': 'datetime.date',
                    'args': [getattr(obj, a) for a in ARGS]}
        elif isinstance(obj, datetime.time):
            ARGS = ('hour', 'minute', 'second', 'microsecond')
            return {'__type__': 'datetime.time',
                    'args': [getattr(obj, a) for a in ARGS]}
        elif isinstance(obj, datetime.timedelta):
            ARGS = ('days', 'seconds', 'microseconds')
            return {'__type__': 'datetime.timedelta',
                    'args': [getattr(obj, a) for a in ARGS]}
        elif isinstance(obj, decimal.Decimal):
            return {'__type__': 'decimal.Decimal',
                    'args': [str(obj),]}
        else:
            return super().default(obj)


class EnhancedJSONDecoder(json.JSONDecoder):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, object_hook=self.object_hook,
                         **kwargs)

    def object_hook(self, d): 
        if '__type__' not in d:
            return d
        o = sys.modules[__name__]
        for e in d['__type__'].split('.'):
            o = getattr(o, e)
        args, kwargs = d.get('args', ()), d.get('kwargs', {})
        return o(*args, **kwargs)

if __name__ == '__main__':
    j1 = json.dumps({'now': datetime.datetime.now(),
        'val': decimal.Decimal('9.3456789098765434987654567')},
        cls=EnhancedJSONEncoder)
    print(j1)
    o1 = json.loads(j1, cls=EnhancedJSONDecoder)
    print(o1)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{&quot;val&quot;: {&quot;args&quot;: [&quot;9.3456789098765434987654567&quot;], &quot;__type__&quot;: &quot;decimal.Decimal&quot;}, &quot;now&quot;: {&quot;args&quot;: [2014, 4, 29, 11, 44, 57, 971600], &quot;__type__&quot;: &quot;datetime.datetime&quot;}}
{'val': Decimal('9.3456789098765434987654567'), 'now': datetime.datetime(2014, 4, 29, 11, 44, 57, 971600)}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.python.org/3.4/library/json.html#json.JSONEncoder.default&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;json 설명서&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://taketwoprogramming.blogspot.hu/2009/06/subclassing-jsonencoder-and-jsondecoder.html&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mark Hildreth -- JSON 인코더 및 JSON 디코더 서브클래싱&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://hg.tryton.org/trytond/file/ade5432ac476/trytond/protocols/jsonrpc.py#l53&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;세드릭 크리어 -- trytond.protocols.jsonrpc 소스 코드&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: 키와 arg, kwarg를 값으로 하는 사용자 정의 사전을 인코더의 값으로 전달함으로써 보다 유연하게 만들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__init__()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(또는 기본 사전) 을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;default()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;방법.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;json.dumps(r, default=lambda o: o.isoformat() if hasattr(o, 'isoformat') else o)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 지정 디코더/인코더 만들기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return http_date(obj)
        if isinstance(obj, uuid.UUID):
            return str(obj)
        return json.JSONEncoder.default(self, obj)

class CustomJSONDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)

    def object_hook(self, source):
        for k, v in source.items():
            if isinstance(v, str):
                try:
                    source[k] = datetime.datetime.strptime(str(v), '%a, %d %b %Y %H:%M:%S %Z')
                except:
                    pass
        return source
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Tryton 프로젝트에는 다음을 위한 JSON 인코더 구현이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;datetime.datetime&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;datetime.date&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;datetime.time&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물건을 (다른 사람과) 같이&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버와 클라이언트 간의 JSON RPC 통신에 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://hg.tryton.org/2.4/trytond/file/ade5432ac476/trytond/protocols/jsonrpc.py#l53 참조&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;datetime 유형을 unix 타임스탬프로 변환한 다음 내용을 json으로 인코딩합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예: http://codepad.org/k3qF09Kr&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그 소포나 그 소포를 사용하는 것을 추천합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;훨씬 더 빠르며 여전히 여러 가지 복잡한 유형을 지원합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 지정 인코더 만들기&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(콜의 답변에 작지만 중요한 추가 사항은 pd의 처리입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NaT(또는 null/빈 타임스탬프 값). 추가하지 않으면 NaT/누락된 타임스탬프 데이터에 대해 매우 이상한 타임스탬프 변환이 발생하기 때문입니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if pd.isnull(obj):
            return None
        elif isinstance(obj, datetime):
            return obj.isoformat()
        elif isinstance(obj, date):
            return obj.isoformat()
        elif isinstance(obj, timedelta):
            return (datetime.min + obj).time().isoformat()
        else:
            return super(CustomEncoder, self).default(obj)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 이를 사용하여 데이터 프레임을 인코딩합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df_as_dict = df.to_dict(outtype = 'records')  # transform to dict

df_as_json = CustomEncoder().encode(df_as_dict) #transform to json
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인코더가 데이터를 표준화했기 때문에, 일반 디코더는 데이터를 다시 데이터 프레임으로 변환하는 데 있어 잘 작동할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;result_as_dict = json.JSONDecoder().decode(df_as_json) # decode back to dict

result_df = pd.DataFrame(result)  # transform dict back to dataframe
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 인코딩하기 전에 데이터 프레임을 더 큰 dict에 입력하는 경우에도 이러한 작업이 가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;input_dict = {'key_1':val_1,'key_2':val_2,...,'df_as_dict':df_as_dict}
input_json = CustomEncoder().encode(input_dict)
input_json_back_as_dict = json.JSONDecoder().decode(input_json)
input_df_back_as_dict = input_json_back_as_dict['df_as_dict']
input_df_back_as_df = pd.DataFrame(input_df_back_as_dict)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/12122007/python-json-encoder-to-support-datetime&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/651</guid>
      <comments>https://yellowcard.tistory.com/651#entry651comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:15:51 +0900</pubDate>
    </item>
    <item>
      <title>기준과 일치하는 가장 최근 타임스탬프가 있는 행을 선택하는 가장 좋은 방법</title>
      <link>https://yellowcard.tistory.com/650</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기준과 일치하는 가장 최근 타임스탬프가 있는 행을 선택하는 가장 좋은 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 너무 자주 언급되는 것이라 거의 생각을 접을 뻔했지만 저는 이것을 최선의 방법으로 하고 있지 않다고 거의 확신합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 표가 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE TABLE TEST_TABLE
(
  ID          INTEGER,
  TEST_VALUE  NUMBER,
  UPDATED     DATE,
  FOREIGN_KEY INTEGER
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FORINE_KEY = 10인 가장 최근에 업데이트된 행과 관련된 TEST_VALUE를 선택하는 가장 좋은 방법은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;편집:&lt;/strong&gt; 아래의 답은 단순히 제 방법으로 정렬한 다음 맨 위 행을 선택하는 것이므로 이 문제를 더 흥미롭게 만들어 보겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나쁘지는 않지만 대량 반품의 경우에는 성능이 저하될 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 보너스 포인트: 확장 가능한 방식으로 수행하는 방법(즉, 불필요한 주문 없이).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분석 기능은 당신의 친구입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; select * from test_table;

        ID TEST_VALUE UPDATED   FOREIGN_KEY
---------- ---------- --------- -----------
         1         10 12-NOV-08          10
         2         20 11-NOV-08          10

SQL&amp;gt; ed
Wrote file afiedt.buf

  1* select * from test_table
SQL&amp;gt; ed
Wrote file afiedt.buf

  1  select max( test_value ) keep (dense_rank last order by updated)
  2  from test_table
  3* where foreign_key = 10
SQL&amp;gt; /

MAX(TEST_VALUE)KEEP(DENSE_RANKLASTORDERBYUPDATED)
-------------------------------------------------
                                               10
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체 행에 대한 정보를 얻기 위해 확장할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; ed
Wrote file afiedt.buf

  1  select max( id ) keep (dense_rank last order by updated) id,
  2         max( test_value ) keep (dense_rank last order by updated) test_value
,
  3         max( updated) keep (dense_rank last order by updated) updated
  4  from test_table
  5* where foreign_key = 10
SQL&amp;gt; /

        ID TEST_VALUE UPDATED
---------- ---------- ---------
         1         10 12-NOV-08
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분석적 접근 방식은 일반적으로 상당히 효율적입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;분석 기능은 비교적 새로운 기능이므로 9.0.1 이전 버전에서는 작동하지 않을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;더 이상 인구가 많지는 않지만, 항상 오래된 버전을 사용하는 사람들이 몇 명 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WHERE updated = (SELECT MAX(updated) ...)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 TOP 1 레코드를 선택합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ORDER BY updated DESC
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle 구문에서는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT 
  * 
FROM 
(
  SELECT * FROM test_table
  ORDER BY updated DESC
)
WHERE 
  ROWNUM = 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫째, 항상 해당 외래 키로 모든 행을 보고 업데이트된 값이 가장 높은 행을 찾아야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MAX나 ORDER BY를 의미합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비교의 효율성은 부분적으로 Optimizer에 달려 있으므로 Oracle 버전에 따라 달라집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 구조가 실제 성능에 더 큰 영향을 미칠 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FOREAN_KEY, UPDATED DESC, TEST_VALUE의 인덱스는 Oracle이 일반적으로 단일 리프 블록에 액세스하는 것만으로 답변을 제공할 수 있기 때문에 쿼리에 가장 확장성이 높은 솔루션을 제공할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 구조물에 새 레코드를 삽입해야 하므로 삽입물에 좋지 않은 영향을 미칠 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 지금 이런 일을 하고 있는 열등한 방법은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT TEST_VALUE
FROM TEST_TABLE
WHERE ID = (
  SELECT ID
  FROM (
    SELECT ID
    FROM TEST_TABLE
    WHERE FOREIGN_KEY = 10
    ORDER BY UPDATED DESC
  )
  WHERE ROWNUM = 1
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 오버플로우 천재들을 쌓아두고, 몇 가지 기술을 가르쳐주세요.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;font papago-translate=&quot;translated&quot;&gt;테스트 선택_VALUE&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FROM TEST_TABLE&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WHERE UPDATED = (최대 선택(업데이트됨)&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FROM TEST_TABLE&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 FORINE_KEY = 10 )&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;AND 외국인 키 = 10&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;AND ROWNUM = 1 -- 레코드의 업데이트 날짜가 동일한 경우를 위해&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;첫 번째 기록을 사용하는 대신 가장 높은 ID 또는 가장 작은/가장 큰 TEST_VALUE로 동점을 만들 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FORINE_KEY의 인덱스인 UPDATE가 쿼리 성능에 도움이 될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저스틴 케이브의 답변을 읽기 전까지는 다음과 같은 패턴을 사용하여 최근 기록을 대량으로 수집했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WITH test_table_ranked AS (
    SELECT
        test_table.*,
        ROW_NUMBER() OVER (
            PARTITION BY foreign_key ORDER BY updated DESC
        ) AS most_recent
    FROM
        test_table
)
SELECT *
FROM test_table_ranked
WHERE most_recent = 1
-- AND foreign_key = 10
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 쿼리는 테이블에서 각 외부 키에 대한 최신 업데이트를 찾습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키를 알면 저스틴의 대답이 더 빠르지만, 이 쿼리는 SQL Server에서도 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성능은 색인화된 항목에 따라 달라집니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WITH 
ten AS
(
    SELECT *
    FROM TEST_TABLE
    WHERE FOREIGH_KEY = 10
)
SELECT TEST_VALUE 
FROM ten
WHERE UPDATED = 
(
    SELECT MAX(DATE)
    FROM ten
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 도움이 되는 Oracle SQL FAQ가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.orafaq.com/wiki/SQL_FAQ&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://www.orafaq.com/wiki/SQL_FAQ&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;select test_value
from
(
  select test_value 
  from test_table
  where foreign_key=10
  order by updated desc
)
where rownum = 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle은 내부 선택 항목에서 하나의 행만 필요로 하며 이를 효율적으로 수행할 수 있다는 것을 충분히 현명하게 인식합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 효과가 있지 않을까요?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT TOP 1 ID
FROM test_table
WHERE FOREIGN_KEY = 10
ORDER BY UPDATED DESC
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서브쿼리는 필요없습니다...&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/285477/best-way-to-select-the-row-with-the-most-recent-timestamp-that-matches-a-criteri&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>oracle</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/650</guid>
      <comments>https://yellowcard.tistory.com/650#entry650comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:15:42 +0900</pubDate>
    </item>
    <item>
      <title>압축-archive 및 상대 경로 보존</title>
      <link>https://yellowcard.tistory.com/649</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;압축-archive 및 상대 경로 보존&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그들을 이해하는 데 힘든 시간을 보내고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;compress-archive&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 하고 싶은 일을...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;루트 프로젝트 폴더가 있는데 하위 디렉토리에 있는 파일 중 일부를 압축하고 관련 경로를 보존하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/font&gt;&lt;code&gt; / ├── _scripts ├── ├─_module1 | | └── filex.js | └─_module2 | ├── file1.js | └── file2.txt &lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 루트 디렉터리에서 다음을 포함하는 zip 파일을 만들고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;module2/*&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그리고 폴더 구조를 유지하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 우편물에 다음 내용이 포함되어 있으면 좋겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt; scripts/module2/file1.js scripts/module2/file2.txt &lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 루트 폴더에서 이 작업을 실행하면 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Compress-Archive -Path &quot;scripts\module2\*&quot; -DestinationPath tmp.zip&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;zip 파일의 내용은 다음 내용만 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt; /file1.js /file2.txt &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 것으로 보입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Compress-Archive&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(Windows PowerShell v5.1 기준)에서는 다음을 지원하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;폴더&lt;/em&gt;를 대상으로 지정하면 해당 폴더의 하위 트리가 재귀적으로 아카이브에 추가되지만, 대상 폴더의 &lt;em&gt;이름&lt;/em&gt;(아카이브 내의 하위 폴더가 됨)에 의해서만 해당 &lt;em&gt;경로&lt;/em&gt;가 추가되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구체적으로.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Compress-Archive -Path scripts\module2 -DestinationPath tmp.zip
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 내용을 (recurs적으로) 저장할 것.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scripts\module2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tmp.zip&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, archive-internal path를 사용하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.\scripts\module2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.\module2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;- 대상 폴더의 &lt;em&gt;이름&lt;/em&gt;(&lt;em&gt;마지막&lt;/em&gt; 입력 경로 구성 요소).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 의미는 당신이 폴더를 넘겨야 한다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scripts&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원하는 아카이브-내부 경로를 얻는 대신, 그것은 항상 전체 &lt;em&gt;하위 트리&lt;/em&gt;를 포함할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scripts&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 라는 점을 감안하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Compress-Archive&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;포함/exclusion 메커니즘을 제공하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한 가지 - 번거로운 - 옵션은 예를 들어, 원하는 계층 구조를 다시 만드는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$env:TEMP&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;폴더, 대상 폴더 복사, 실행&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Compress-Archive&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;재작성된 계층의 근본에 대해 다음을 정리합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;New-Item -Force -ItemType Directory $env:TEMP/scripts
Copy-Item -Recurse -Force scripts/module2 $env:TEMP/scripts
Compress-Archive -LiteralPath $env:TEMP/scripts -DestinationPath tmp.zip
Remove-Item $env:TEMP/Scripts -Recurse -Whatif
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 다음과 같은 해결책을 찾을 수 &lt;em&gt;있습니다&lt;/em&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;을 사용하여&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;NET v4.5+ &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.io.compression.zipfile&quot; rel=&quot;noreferrer&quot;&gt;클래스&lt;/a&gt;를 직접 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Add-Type -Assembly System.IO.Compression.FileSystem&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(PowerShell &lt;em&gt;Core&lt;/em&gt;에는 필요 없음).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://www.7-zip.org/&quot; rel=&quot;noreferrer&quot;&gt;7-Zip&lt;/a&gt;과 같은 외부 프로그램을 사용함으로써,&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전체 구조를 임시 디렉토리에 복사할 필요 없이 이 작업을 수행하고 싶었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#build list of files to compress
$files = @(Get-ChildItem -Path .\procedimentos -Recurse | Where-Object -Property Name -EQ procedimentos.xlsx);
$files += @(Get-ChildItem -Path .\procedimentos -Recurse | Where-Object -Property Name -CLike procedimento_*_fs_*_d_*.xml);
$files += @(Get-ChildItem -Path .\procedimentos -Recurse | Where-Object -Property FullName -CLike *\documentos_*_fs_*_d_*);

# exclude directory entries and generate fullpath list
$filesFullPath = $files | Where-Object -Property Attributes -CContains Archive | ForEach-Object -Process {Write-Output -InputObject $_.FullName}

#create zip file
$zipFileName = 'procedimentos.zip'
$zip = [System.IO.Compression.ZipFile]::Open((Join-Path -Path $(Resolve-Path -Path &quot;.&quot;) -ChildPath $zipFileName), [System.IO.Compression.ZipArchiveMode]::Create)

#write entries with relative paths as names
foreach ($fname in $filesFullPath) {
    $rname = $(Resolve-Path -Path $fname -Relative) -replace '\.\\',''
    echo $rname
    $zentry = $zip.CreateEntry($rname)
    $zentryWriter = New-Object -TypeName System.IO.BinaryWriter $zentry.Open()
    $zentryWriter.Write([System.IO.File]::ReadAllBytes($fname))
    $zentryWriter.Flush()
    $zentryWriter.Close()
}

# clean up
Get-Variable -exclude Runspace | Where-Object {$_.Value -is [System.IDisposable]} | Foreach-Object {$_.Value.Dispose(); Remove-Variable $_.Name};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;좀 오래된 쓰레드이지만 요즘 윈도우 10 설치에 기본인 파워쉘 5.1을 통해 zip 파일을 만드는 데 도움이 될 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크립트를 사용하면 원본 하위 디렉터리 구조를 유지할 수 있을 뿐만 아니라 불필요한 일부 하위 트리/파일을 제외할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Visual Studio 솔루션의 소스 코드를 보관하는 데 사용하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Write-Output &quot;Zipping Visual Studio solution...&quot;

# top level from where to start and location of the zip file
$path = &quot;C:\TheSolution&quot;
# top path that we want to keep in the source code zip file
$subdir = &quot;source\TheSolution&quot;
# location of the zip file
$ZipFile = &quot;${path}\TheSolution.zip&quot;

# change current directory
Set-Location &quot;$path&quot;

# collecting list of files that we want to archive excluding those that we don't want to preserve
$Files  = @(Get-ChildItem &quot;${subdir}&quot; -Recurse -File | Where-Object {$_.PSParentPath -inotmatch &quot;x64|packages|.vs|Win32&quot;})
$Files += @(Get-ChildItem &quot;${subdir}\packages&quot; -Recurse -File)
$Files += @(Get-ChildItem &quot;${subdir}\.git&quot; -Recurse -File)
$FullFilenames = $files | ForEach-Object -Process {Write-Output -InputObject $_.FullName}

# remove old zip file
if (Test-Path $ZipFile) { Remove-Item $ZipFile -ErrorAction Stop }

#create zip file
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem
$zip = [System.IO.Compression.ZipFile]::Open(($ZipFile), [System.IO.Compression.ZipArchiveMode]::Create)

# write entries with relative paths as names
foreach ($fname in $FullFilenames) {
    $rname = $(Resolve-Path -Path $fname -Relative) -replace '\.\\',''
    Write-Output $rname
    $zentry = $zip.CreateEntry($rname)
    $zentryWriter = New-Object -TypeName System.IO.BinaryWriter $zentry.Open()
    $zentryWriter.Write([System.IO.File]::ReadAllBytes($fname))
    $zentryWriter.Flush()
    $zentryWriter.Close()
}

# release zip file
$zip.Dispose()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/51394271&quot;&gt;번거로운 mklement0 기술&lt;/a&gt;이 저에게 효과가 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래는 폴더가 섞인 다양한 파일 목록을 지원하기 위해 만든 스크립트입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# Compress LFS based files into a zip
# To use
#  1. place this script in the root folder
#  2. modify the contents of $lfsAssetFiles to point to files relative to this root folder
#  3. modify $zipDestination to be where you want the resultant zip to be placed
# based off of https://stackoverflow.com/a/51394271

# this should match files being .gitignored
$lfsAssetFiles = 
&quot;\Assets\Project\Plugins\x32&quot;,
&quot;\Assets\Project\Plugins\x64\HugePlugin.dll&quot;

# This is where the contents of the zip file will be structured, because placing them inside of a specific folder of the zip is difficult otherwise
$zipStruct = $PSScriptRoot + &quot;\zipStruct&quot;

# the actual zip file that will be created
$zipDestination = &quot;C:\Dropbox\GitLfsZip\ProjectNameLfs.zip&quot;

# remove files from previous runs of this script
If(Test-path $zipStruct) {Remove-item $zipStruct -Recurse}
If(Test-path $zipDestination) {Remove-item $zipDestination}

Foreach ($entry in $lfsAssetFiles)
{
  # form absolute path to source each file to be included in the zip
  $sourcePath = $PSScriptRoot + $entry;

  # get the parent directories of the path. If the entry itself is a directory, we still only need the parent as the directory will be created when it is copied over.
  $entryPath = Split-Path -Parent $entry

  # form what the path will look like in the destination
  $entryPath = $zipStruct + $entryPath

  # ensure the folders to the entry path exist
  $createdPath = New-Item -Force -ItemType Directory $entryPath

  # copy the file or directory
  Copy-Item -Recurse -Force $sourcePath $createdPath
}

# create a zip file https://blogs.technet.microsoft.com/heyscriptingguy/2015/page/59/
Add-Type -AssemblyName &quot;system.io.compression.filesystem&quot;
[io.compression.zipfile]::CreateFromDirectory($zipStruct, $zipDestination)
# Compress-Archive doesn't work here because it includes the &quot;zipStruct&quot; folder: Compress-Archive -Path $zipStruct -DestinationPath $zipDestination
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/51392050/compress-archive-and-preserve-relative-paths&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>powershell</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/649</guid>
      <comments>https://yellowcard.tistory.com/649#entry649comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:15:34 +0900</pubDate>
    </item>
    <item>
      <title>Mysql 하위 쿼리 결과 &amp;quot;where&amp;quot; 절이 나타납니다.</title>
      <link>https://yellowcard.tistory.com/648</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Mysql 하위 쿼리 결과 &quot;where&quot; 절이 나타납니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql 쿼리를 이렇게 실행할 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select (select A from B where ... ) as C from D where C like ' ... '
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리 결과를 일반적인 &quot;where&quot; 절에 사용해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 하위 쿼리로 포장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * 
FROM (
        select (select A from B where ... ) as C from D
     ) subq
WHERE 
    C like ' ... '
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;너 이거 읽어 본 적 있어?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/subqueries.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://dev.mysql.com/doc/refman/5.0/en/subqueries.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리는 다른 문 안에 있는 SELECT 문입니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL 4.1부터는 SQL 표준에 필요한 모든 하위 쿼리 형식과 작업과 MySQL 고유의 몇 가지 기능이 지원됩니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리의 예는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 예제에서 SELECT * FROM t1 ...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 외부 쿼리(또는 외부 문)이고 (SELECT column1 FROM t2)는 하위 쿼리입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리는 외부 쿼리 내에 중첩되며, 실제로 다른 하위 쿼리 내에 상당한 깊이로 하위 쿼리를 중첩하는 것이 가능합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리는 항상 괄호 안에 나타나야 합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리의 주요 장점은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문의 각 부분을 분리할 수 있도록 구조화된 쿼리를 허용합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이들은 복잡한 가입과 결합이 필요한 작업을 수행할 수 있는 대안적인 방법을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 사람들이 복잡한 가입이나 조합보다 하위 쿼리를 더 잘 읽을 수 있다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제로 초기 SQL을 &quot;구조화된 쿼리 언어&quot;라고 부르는 독창적인 아이디어를 사람들에게 제공한 것은 서브쿼리의 혁신이었습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL 표준에 의해 지정되고 MySQL에서 지원되는 하위 쿼리 구문에 대한 주요 사항을 보여주는 예문은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그림처럼 되지는 않지만 두 곳 모두에서 쿼리를 실행할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 해당 결과를 사용하여 임시 테이블을 만들고 쿼리에서 사용할 수 있도록 결합합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;Select C from D inner join (Select A from B where...) C on C.1=D.1 where C like....&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 실제로 유효한 SQL입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select (select A from B where A = D.A ) as C 
from D
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 JOIN을 구현하는 것이 훨씬 나은(성능 측면에서) 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT D.A
FROM D
INNER JOIN B ON B.A = D.A
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리의 결과를 비교하는 경우 예를 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;select X ... where (select Y ... ) = Z&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만, 아마 나쁜 생각일 겁니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 이렇게 해야 할 때는 메인 셀렉트로 간소화하는 방법을 찾는 것이 가장 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중첩 쿼리를 피할 수 있는 매우 창의적인 방법이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 이유는 모든 선택이 매번 내부 쿼리를 수행해야 하기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 쿼리에 대해 where를 수행하는 경우 모두 선택하고 where를 적용합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 다시 한 번 다른 곳에 적용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;select X ... where Y = Z and A = B.&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/8590421/mysql-subquery-result-in-where-clause&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/648</guid>
      <comments>https://yellowcard.tistory.com/648#entry648comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:15:26 +0900</pubDate>
    </item>
    <item>
      <title>-static-libgcc -static-libstdc++를 사용하여 컴파일해도 여전히 libc.so 에 대한 동적 종속성이 발생합니다.</title>
      <link>https://yellowcard.tistory.com/647</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-static-libgcc -static-libstdc++를 사용하여 컴파일해도 여전히 libc.so 에 대한 동적 종속성이 발생합니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가능한 한 휴대가 가능한 실행 파일을 만들려고 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 종속성을 제거한 후, 다른 시스템에서 바이너리를 실행할 때 다음을 보게 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by foob)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 내 &lt;em&gt;바이너리&lt;/em&gt;가 사용자에게 libc 버전을 업그레이드할 필요가 없기를 원하므로 이 의존성도 제거하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 바이너리를 생성한 링커 플래그는 이미 포함되어 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-static-libgcc -static-libstdc++&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 공유 libc.so .6에서 바이너리가 여전히 요구하는 이유는 &lt;em&gt;무엇입니까?&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 추가를 해봤습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-static&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플래그도 마찬가지입니다. 하지만 이 &lt;em&gt;이진&lt;/em&gt;을 실행하려고 하면 결과가 매우 이상합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;$ ls -l foob
-rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob
$ ./foob
bash: ./foob: No such file or directory
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;무엇을 해야 하나?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;$ file foob
foob: ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5adee9a598b9261a29f1c7b0ffdadcfc72197cd7, not stripped
$ strace -f ./foob
execve(&quot;./foob&quot;, [&quot;./foob&quot;], [/* 64 vars */]) = -1 ENOENT (No such file or directory)
write(2, &quot;strace: exec: No such file or di&quot;..., 40strace: exec: No such file or directory
) = 40
exit_group(1)                           = ?
+++ exited with 1 +++
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;흥미롭게도, 만약 내가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ldd&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;없는&lt;/em&gt; 버전&lt;/font&gt;&lt;/font&gt; &lt;code&gt;-static&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 버전보다 두 개 &lt;em&gt;적은&lt;/em&gt; 엔트리를 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-static&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 즉,&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;libstdc++.so.6 =&amp;gt; /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f420c1000)
libgcc_s.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f41636000)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;GNU libc는 정적으로 연결되도록 설계되지 않았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중요한 기능, 예를 들어.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gethostbyname&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;iconv&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 정적 이진에서 오작동하거나 전혀 작동하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비록 정적 연결의 요점이 그러한 의존성을 피하는 것이지만, 어떤 상황에서는 정적 바이너리가 &lt;em&gt;동적으로 열리고 사용하려고 시도&lt;/em&gt;할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 &lt;a href=&quot;http://www.uclibc.org/&quot; rel=&quot;noreferrer&quot;&gt;uClibc&lt;/a&gt;나 &lt;a href=&quot;http://www.musl-libc.org/&quot; rel=&quot;noreferrer&quot;&gt;musllibc&lt;/a&gt;에 대한 프로그램을 컴파일해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(이것은 적어도 15년 동안 사실이었습니다.)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 libc가 커널 버전과 같은 시스템의 다른 부분에 의존할 수 있기 때문에 libc의 정적 링크가 프로그램의 이식성을 향상시키지 못할 수 있음을 유의해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;-static을 사용하여 완전한 정적 링크를 시도하려면 트릭을 사용해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용한 모든 라이브러리의 정적 버전이 설치되어 있는 경우.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용하여 프로그램에 링크된 정적 라이브러리만 있는지 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ldd binary_name
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 디버깅하는 데 유용한 정보를 제공하는 또 다른 방법은 링커 플래그에 --verbose를 추가하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/26304531/compiling-with-static-libgcc-static-libstdc-still-results-in-dynamic-depende&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/647</guid>
      <comments>https://yellowcard.tistory.com/647#entry647comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:15:19 +0900</pubDate>
    </item>
    <item>
      <title>스타일에 바인딩 값</title>
      <link>https://yellowcard.tistory.com/646</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스타일에 바인딩 값&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클래스(속성 바인딩에 의해 획득됨)의 색상 속성을 바인딩하여 다음을 설정하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;background-color&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;div&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;import {Component, Template} from 'angular2/angular2';

@Component({
  selector: 'circle',
  bind:{
    &quot;color&quot;:&quot;color&quot;
  }
})
@Template({
  url: System.baseURL + &quot;/components/circle/template.html&quot;,
})
export class Circle {
    constructor(){

    }

    changeBackground():string{
        return &quot;background-color:&quot; + this.color + &quot;;&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 템플릿:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
    .circle{
        width:50px;
        height: 50px;
        background-color: lightgreen;
        border-radius: 25px;
    }
&amp;lt;/style&amp;gt;
&amp;lt;div class=&quot;circle&quot; [style]=&quot;changeBackground()&quot;&amp;gt;
    &amp;lt;content&amp;gt;&amp;lt;/content&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 구성 요소의 용도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;circle color=&quot;teal&quot;&amp;gt;&amp;lt;/circle&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 바인딩이 작동하지 않지만, 예외도 두지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 말씀드리면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{{changeBackground()}}&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;템플릿의 어딘가에서 올바른 문자열을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런데 왜 스타일 바인딩이 작동하지 않는 겁니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 내부의 색상 속성의 변화를 어떻게 볼 수 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Circle&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수업? 대체물은 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;$scope.$watch(&quot;color&quot;, function(a,b,){});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앵귤러 2에서?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열에 대한 스타일 바인딩이 작동하지 않는 것으로 나타났습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결책은 스타일의 배경을 묶는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt; &amp;lt;div class=&quot;circle&quot; [style.background]=&quot;color&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재(2017년 1월 / Angular &amp;gt; 2.0) 다음을 사용하실 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;changeBackground(): any {
    return { 'background-color': this.color };
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;circle&quot; [ngStyle]=&quot;changeBackground()&quot;&amp;gt;
    &amp;lt;!-- &amp;lt;content&amp;gt;&amp;lt;/content&amp;gt; --&amp;gt; &amp;lt;!-- content is now deprecated --&amp;gt;
    &amp;lt;ng-content&amp;gt;&amp;lt;ng-content&amp;gt; &amp;lt;!-- Use ng-content instead --&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 짧은 방법은 아마도 다음과 같습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;circle&quot; [ngStyle]=&quot;{ 'background-color': color }&quot;&amp;gt;
    &amp;lt;!-- &amp;lt;content&amp;gt;&amp;lt;/content&amp;gt; --&amp;gt; &amp;lt;!-- content is now deprecated --&amp;gt;
    &amp;lt;ng-content&amp;gt;&amp;lt;ng-content&amp;gt; &amp;lt;!-- Use ng-content instead --&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알파28과 이렇게 잘 어울리게 만들 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;import {Component, View} from 'angular2/angular2';

@Component({
  selector: 'circle', 
  properties: ['color: color'],
})
@View({
    template: `&amp;lt;style&amp;gt;
    .circle{
        width:50px;
        height: 50px;
        border-radius: 25px;
    }
&amp;lt;/style&amp;gt;
&amp;lt;div class=&quot;circle&quot; [style.background-color]=&quot;changeBackground()&quot;&amp;gt;
    &amp;lt;content&amp;gt;&amp;lt;/content&amp;gt;
&amp;lt;/div&amp;gt;
`
})
export class Circle {
    color;

    constructor(){
    }

    changeBackground(): string {
        return this.color;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 부르면서.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;circle color='yellow'&amp;gt;&amp;lt;/circle&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;app.component.html&lt;/strong&gt;에서 다음을 사용합니다.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;  [ngStyle]=&quot;{'background-color':backcolor}&quot;
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;App.ts&lt;/strong&gt;에서 문자열 유형의 변수 선언&lt;/font&gt;&lt;/font&gt;&lt;code&gt;backcolor:string&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변수 설정&lt;/font&gt;&lt;/font&gt;&lt;code&gt;this.backcolor=&quot;red&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 각도 11 및 이전 버전에서 정상적으로 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div [style.backgroundColor]=&quot;myBgColor&quot; [style.color]=&quot;myColor&quot;&amp;gt;Jesus loves you&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 controller .ts 파일에서:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;myBgColor = '#1A1A1A'
myColor = '#FFFFFF'
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[attr.style]=&quot;changeBackground()&quot;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/29515475/binding-value-to-style&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Angular</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/646</guid>
      <comments>https://yellowcard.tistory.com/646#entry646comment</comments>
      <pubDate>Wed, 1 Nov 2023 22:15:13 +0900</pubDate>
    </item>
    <item>
      <title>WebSockets 및 Apache 프록시: mod_proxy_wstunnel을 구성하는 방법은 무엇입니까?</title>
      <link>https://yellowcard.tistory.com/645</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WebSockets 및 Apache 프록시: mod_proxy_wstunnel을 구성하는 방법은 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다음을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 서버의 &lt;em papago-id=&quot;2-1&quot;&gt;&lt;a href=&quot;https://httpd.apache.org/docs/2.4/mod/mod_proxy.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;2-1-0&quot;&gt;포트&lt;/a&gt;&lt;/em&gt; 80에서 Apache 2.&lt;em papago-id=&quot;2-3&quot;&gt;&lt;a href=&quot;https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;2-3-0&quot;&gt;4&lt;/a&gt;&lt;/em&gt;(mod_proxy 및 mod_proxy_wstunnel 사용)&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Node.js +&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;socket.io&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 서버의 포트 3001에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;액세스&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;example.com&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(포트 80 포함)은 다음과 같은 Apache &lt;a href=&quot;https://stackoverflow.com/a/18604082/1422096&quot; papago-id=&quot;6-1&quot;&gt;구성을 사용&lt;/a&gt;하는 이 메서드 덕분에 2.로 리디렉션됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName example.com
    ProxyPass / http://localhost:3001/
    ProxyPassReverse / http://localhost:3001/
    ProxyPass / ws://localhost:3001/
    ProxyPassReverse / ws://localhost:3001/
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹소켓 부분을 제외한 모든 부분에서 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ws://...&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프록시가 전송해야 하는 것처럼 전송되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지에 액세스할 때&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;example.com&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 내가 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Impossible to connect ws://example.com/socket.io/?EIO=3&amp;amp;transport=websocket&amp;amp;sid=n30rqg9AEqZIk5c9AABN.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문:.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;11-1&quot;&gt;Apache 프록시를 WebSockets로 만드는 방법?&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://serverfault.com/a/623027/208727&quot; papago-id=&quot;12-1&quot;&gt;저&lt;/a&gt;는 이 주제 덕분에 마침내 해낼 수 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업 항목:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1) Apache 2.4를 설치하고(2.2에서는 작동하지 않음) 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2) 가지다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;nodejs&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포트 3001에서 실행&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3) Apache 구성에서 이 작업 수행&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  ServerName example.com

  RewriteEngine On
  RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
  RewriteCond %{QUERY_STRING} transport=websocket    [NC]
  RewriteRule /(.*)           ws://localhost:3001/$1 [P,L]

  ProxyPass / http://localhost:3001/
  ProxyPassReverse / http://localhost:3001/
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;em papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고: 웹 소켓을 사용하는 동일한 서버에 둘 이상의 서비스가 있는 경우 &lt;a href=&quot;https://stackoverflow.com/a/49696076/1422096&quot; papago-id=&quot;17-1&quot;&gt;이&lt;/a&gt;를 분리하여 사용할 수 있습니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL로 필터링하는 대신 HTTP 헤더로 필터링할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 구성은 소켓을 사용하지 않는 경우에도 웹 소켓을 사용하는 모든 웹 응용 프로그램에서 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;io:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  ServerName www.domain2.com

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /(.*)           ws://localhost:3001/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule /(.*)           http://localhost:3001/$1 [P,L]

  ProxyPassReverse / http://localhost:3001/
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유용할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 쿼리가 ws를 통해 노드로 전송됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  ServerName www.domain2.com

  &amp;lt;Location &quot;/&quot;&amp;gt;
    ProxyPass &quot;ws://localhost:3001/&quot;
  &amp;lt;/Location&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소켓 기준.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IO 1.0(2014년 5월), 모든 연결은 HTTP 폴링 요청으로 시작됩니다(자세한 내용은 &lt;a href=&quot;https://stackoverflow.com/a/28240802/4080966&quot; papago-id=&quot;20-1&quot;&gt;여기&lt;/a&gt;).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, WebSocket 트래픽을 전달하는 것 외에 다음과 같은 것을 전달해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;transport=polling&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTTP 요청.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 솔루션은 다른 트래픽을 리디렉션하지 않고 모든 소켓 트래픽을 올바르게 리디렉션해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 Apache2 모드를 사용하도록 설정합니다.&lt;/font&gt;&lt;/p&gt; &lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;sudo a2enmod proxy rewrite proxy_http proxy_wstunnel
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;*.conf 파일에서 이 설정을 사용합니다(예:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/apache2/sites-available/mysite.com.conf&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 각 하기 위해  :).&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 각 작품을 설명하기 위해 코멘트를 넣었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName www.mydomain.com

    # Enable the rewrite engine
    # Requires: sudo a2enmod proxy rewrite proxy_http proxy_wstunnel
    # In the rules/conds, [NC] means case-insensitve, [P] means proxy
    RewriteEngine On

    # socket.io 1.0+ starts all connections with an HTTP polling request
    RewriteCond %{QUERY_STRING} transport=polling       [NC]
    RewriteRule /(.*)           http://localhost:3001/$1 [P]

    # When socket.io wants to initiate a WebSocket connection, it sends an
    # &quot;upgrade: websocket&quot; request that should be transferred to ws://
    RewriteCond %{HTTP:Upgrade} websocket               [NC]
    RewriteRule /(.*)           ws://localhost:3001/$1  [P]

    # OPTIONAL: Route all HTTP traffic at /node to port 3001
    ProxyRequests Off
    ProxyPass           /node   http://localhost:3001
    ProxyPassReverse    /node   http://localhost:3001
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루팅을 위해 추가 섹션을 추가했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/node&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편리한 교통, 자세한 정보는 &lt;a href=&quot;https://stackoverflow.com/a/18604082/4080966&quot; papago-id=&quot;27-1&quot;&gt;여기&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 답변을 통해 Ubuntu Mate와 Apache2가 작동하는 Raspberry Pi에서 실행되는 Node-RED의 역방향 프록시를 마침내 얻었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName nodered.domain.com
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*)           ws://localhost:1880/$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket [NC]
    RewriteRule /(.*)           http://localhost:1880/$1 [P,L]
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 다음과 같은 모듈을 활성화해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저의 경우 아래와 같이 httpd.&lt;strong papago-id=&quot;30-1&quot;&gt;conf&lt;/strong&gt;에서 한 &lt;strong papago-id=&quot;30-1&quot;&gt;줄&lt;/strong&gt;만 추가하면 됩니다( 굵은 줄).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;
&amp;lt;VirtualHost *:80&amp;gt;
    ServerName: xxxxx

    #ProxyPassReverse is not needed
    &lt;b&gt;ProxyPass /log4j ws://localhost:4711/logs&lt;/b&gt;
&amp;lt;VirtualHost *:80&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아파치 버전은 CentOS에서 2.4.6입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정적, 휴식 및 웹소켓 컨텐츠를 실행하는 스프링 애플리케이션에 대해 다음과 같은 작업을 수행했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache는 다음 URI의 Proxy 및 SSL Endpoint로 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/app → 정적 컨텐츠&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/api → REST API&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/api/ws → 웹소켓&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2 papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아파치 구성&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName xxx.xxx.xxx    

    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On

    &amp;lt;Proxy *&amp;gt;
         Require all granted
    &amp;lt;/Proxy&amp;gt;

    RewriteEngine On

    # websocket 
    RewriteCond %{HTTP:Upgrade}         =websocket                      [NC]
    RewriteRule ^/api/ws/(.*)           ws://localhost:8080/api/ws/$1   [P,L]

    # rest
    ProxyPass /api http://localhost:8080/api
    ProxyPassReverse /api http://localhost:8080/api

    # static content    
    ProxyPass /app http://localhost:8080/app
    ProxyPassReverse /app http://localhost:8080/app 
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SSL 구성에 동일한 vHost 구성을 사용하므로 프록시 관련 내용을 변경할 필요가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링구성&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;server.use-forward-headers: true
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 설정:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache 2.4.10(Debian 실행)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Node.js(버전 4.1.1) 경로에서 WebSockets를 허용하는 포트 3000에서 실행되는 앱&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/api/ws&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Basj가 위에서 언급한 대로 a2enmod 프록시와 ws_tunnel이 활성화되었는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 내 문제를 해결한 Apache config 파일의 스크린샷입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/gEJzR.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/gEJzR.png&quot; alt=&quot;Apache config&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트로서 관련된 부분:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  ServerName *******
  ServerAlias *******
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/

  &amp;lt;Location &quot;/api/ws&quot;&amp;gt;
      ProxyPass &quot;ws://localhost:3000/api/ws&quot;
  &amp;lt;/Location&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주요 답변 외에도 웹 소켓을 사용하는 동일한 서버에 둘 &lt;strong papago-id=&quot;47-1&quot;&gt;이상&lt;/strong&gt;의 서비스가 있는 경우 사용자 &lt;a href=&quot;https://socket.io/docs/client-api/#with-custom-path&quot; rel=&quot;noreferrer&quot; papago-id=&quot;47-3&quot;&gt;지정 경로&lt;/a&gt;(*)를 사용하여 서비스를 분리할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;노드 서버:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var io = require('socket.io')({ path: '/ws_website1'}).listen(server);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트 HTML:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;/ws_website1/socket.io.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
...
&amp;lt;script&amp;gt;
var socket = io('', { path: '/ws_website1' });
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache 구성:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RewriteEngine On

RewriteRule ^/website1(.*)$ http://localhost:3001$1 [P,L]

RewriteCond %{REQUEST_URI}  ^/ws_website1 [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule ^(.*)$ ws://localhost:3001$1 [P,L]

RewriteCond %{REQUEST_URI}  ^/ws_website1 [NC]
RewriteRule ^(.*)$ http://localhost:3001$1 [P,L]
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(*) 참고: 기본값 사용&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RewriteCond %{REQUEST_URI} ^/socket.io&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹사이트에 특정한 것이 아닐 것이고, 웹소켓 요청은 다른 웹사이트들 사이에서 뒤섞일 것입니다!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ws https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html 의 완벽한 솔루션을 위해 이 링크를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 단계만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 가다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/apache2/mods-available&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단계...1&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가능하게 하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mode proxy_wstunnel.load&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 명령을 사용하여&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$a2enmod proxy_wstunnel.load
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단계...2&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 가다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/apache2/sites-available&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가상 호스트 내부의 .conf 파일에 아래 줄을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ProxyPass &quot;/ws2/&quot;  &quot;ws://localhost:8080/&quot;

ProxyPass &quot;/wss2/&quot; &quot;wss://localhost:8080/&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고: 8080은 연결을 원하기 때문에 Tomcat이 포트를 실행하고 있음을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ws&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tomcat과 tomcat serve apache에 우리의 war 파일을 넣은 곳.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ws&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.감사해요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 구성&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ws://localhost/ws2/ALLCAD-Unifiedcommunication-1.0/chatserver?userid=4 =Connected
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;폴링&quot; 운송용입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache 측면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName mysite.com
    DocumentRoot /my/path


    ProxyRequests Off

    &amp;lt;Proxy *&amp;gt;
        Order deny,allow
        Allow from all
    &amp;lt;/Proxy&amp;gt;

    ProxyPass /my-connect-3001 http://127.0.0.1:3001/socket.io
    ProxyPassReverse /my-connect-3001 http://127.0.0.1:3001/socket.io   
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클라이언트 측:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var my_socket = new io.Manager(null, {
    host: 'mysite.com',
    path: '/my-connect-3001'
    transports: ['polling'],
}).socket('/');
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업 항목:&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache 2.4를 설치해야 합니다(2.2에서는 작동하지 않음).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a2enmod proxy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a2enmod proxy_wstunnel.load&lt;/code&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Apache 구성에서 이 작업 수행&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;8080이 tomcat 실행 포트인 파일에 두 줄만 추가하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
ProxyPass &quot;/ws2/&quot; &quot;ws://localhost:8080/&quot; 
ProxyPass &quot;/wss2/&quot; &quot;wss://localhost:8080/&quot;

&amp;lt;/VirtualHost *:80&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows에서 동일한 문제가 발생하는 경우 http.conf에서 아래 행의 코멘트를 해제하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/stD3G.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/stD3G.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 아래 줄을 Apache config에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    LoadModule proxy_module modules/mod_proxy_wstunnel.so
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 필요한 Apache 모듈을 활성화합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 다음 템플릿을 사용하여 Apache 역방향 프록시 사이트 구성(기존 호스트-포트 조합 사용)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localhost:3000&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;78&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;), socket.io &lt;a href=&quot;https://socket.io/docs/v4/reverse-proxy/#apache-httpd&quot; papago-id=&quot;78-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;em papago-id=&quot;78-1-1&quot;&gt;웹소켓&lt;/em&gt;&lt;/a&gt; 작동(socket.io v4 공식&lt;a href=&quot;https://socket.io/docs/v4/reverse-proxy/#apache-httpd&quot; papago-id=&quot;78-1&quot; rel=&quot;nofollow noreferrer&quot;&gt; &lt;/a&gt;설명서에서 adapted):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  # redirect anything HTTP-without-S to HTTPS-with-S
  ServerName websocket.example.com

  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
  # see https://httpd.apache.org/docs/2.4/rewrite/flags.html
  # see https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule

  ErrorLog ${APACHE_LOG_DIR}/websocket-http-error.log
  CustomLog ${APACHE_LOG_DIR}/websocket-http-access.log combined
&amp;lt;/VirtualHost&amp;gt;

&amp;lt;VirtualHost *:443&amp;gt;
  ServerName websocket.example.com

  SSLEngine On
  SSLProxyCheckPeerName On

  # assuming let's encrypt certificate
  SSLCertificateFile /etc/letsencrypt/live/websocket/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/websocket/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/websocket/chain.pem

  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/

  # setup websocket socket.io configuration
  # see https://socket.io/docs/v4/reverse-proxy/#apache-httpd
  RewriteEngine on
  RewriteCond %{HTTP:Upgrade} websocket [NC]
  RewriteCond %{HTTP:Connection} upgrade [NC]
  RewriteRule ^/?(.*) &quot;ws://localhost:3000/$1&quot; [P,L]

  ProxyTimeout 3

  ErrorLog ${APACHE_LOG_DIR}/websocket-https-error.log
  CustomLog ${APACHE_LOG_DIR}/websocket-https-access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/27526281/websockets-and-apache-proxy-how-to-configure-mod-proxy-wstunnel&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>node.js</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/645</guid>
      <comments>https://yellowcard.tistory.com/645#entry645comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:52:19 +0900</pubDate>
    </item>
    <item>
      <title>AJAX 클라이언트 코드 작성 방법을 배우는 동안 자바스크립트 라이브러리 사용을 피해야 합니까?</title>
      <link>https://yellowcard.tistory.com/644</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AJAX 클라이언트 코드 작성 방법을 배우는 동안 자바스크립트 라이브러리 사용을 피해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;
&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;1-1&quot;&gt;문&lt;/b&gt; 닫았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문은&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;/help/closed-questions&quot; papago-id=&quot;1-3&quot;&gt;의견&lt;/a&gt;에 입각한&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 답변을 받지 않고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;      &lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;hr class=&quot;my12 outline-none baw0 bb bc-powder-400&quot;&gt; 
  &lt;div class=&quot;fw-nowrap fc-black-600&quot;&gt; 
   &lt;div class=&quot;d-flex fd-column lh-md&quot;&gt; 
    &lt;div class=&quot;mb0 d-flex&quot;&gt; 
     &lt;div class=&quot;flex--item mr8&quot;&gt; 
      &lt;svg aria-hidden=&quot;true&quot; class=&quot;svg-icon iconLightbulb&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 18 18&quot;&gt;
       &lt;path d=&quot;M15 6.38A6.48 6.48 0 0 0 7.78.04h-.02A6.49 6.49 0 0 0 2.05 5.6a6.31 6.31 0 0 0 2.39 5.75c.49.39.76.93.76 1.5v.24c0 1.07.89 1.9 1.92 1.9h2.75c1.04 0 1.92-.83 1.92-1.9v-.2c0-.6.26-1.15.7-1.48A6.32 6.32 0 0 0 15 6.37ZM4.03 5.85A4.49 4.49 0 0 1 8 2.02a4.48 4.48 0 0 1 5 4.36 4.3 4.3 0 0 1-1.72 3.44c-.98.74-1.5 1.9-1.5 3.08v.1H7.2v-.14c0-1.23-.6-2.34-1.53-3.07a4.32 4.32 0 0 1-1.64-3.94ZM10 18a1 1 0 0 0 0-2H7a1 1 0 1 0 0 2h3Z&quot;&gt;&lt;/path&gt;
      &lt;/svg&gt; 
     &lt;/div&gt; 
     &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;2-0&quot;&gt;이 질문을 개선하고 싶으십니까?&lt;/b&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;/posts/215589/edit&quot; papago-id=&quot;2-2&quot;&gt;이 게시물을 편집&lt;/a&gt;하여 사실과 인용으로 답변할 수 있도록 질문을 업데이트합니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;mb0 mt6 d-flex&quot;&gt; 
     &lt;p class=&quot;ml24 pl2&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;3-1&quot; title=&quot;2015-07-22 17:55:02Z&quot; papago-attr-id=&quot;1&quot;&gt;8년 전&lt;/span&gt;에 문을 닫았습니다.&lt;/font&gt;&lt;/p&gt; 
    &lt;/div&gt; 
    &lt;div class=&quot;ml24 pl2&quot;&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
  &lt;/div&gt; 
  &lt;div class=&quot;mt24 d-flex gsx gs8&quot;&gt; 
   &lt;a class=&quot;s-btn s-btn__outlined flex--item js-post-notice-edit-post&quot; href=&quot;/posts/215589/edit&quot; papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문을 개선합니다.&lt;/font&gt;&lt;/a&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AJAX 라이브러리를 사용하지 않고 AJAX를 코딩하는 방법을 배우는 것이 더 나을까요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery와 같은 라이브러리를 사용하는 것보다 처음부터 코딩하는 것의 장점은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고 항목:&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/122902/what-are-some-of-the-pros-and-cons-of-using-jquery&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery를 사용할 때 어떤 장점과 단점이 있습니까?&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;학습을 위해, 예, 라이브러리를 피합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 개념적으로 간단한 AJAX 같은 경우, 브라우저가 &quot;원시&quot;로 사용될 수 있는 방법을 억지로 배우면 나중에 큰 혜택을 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 그것이 어떻게 작동하는지 확실하게 알게 되면, 다른 이유로 미묘한 브라우저 차이를 해결하는 데 시간을 소비하는 것이 아깝다면 라이브러리를 사용하세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 jQuery와 다른 것들의 출처를 읽는 데 시간을 할애하는 것이 잘 쓰여진 자바스크립트의 모습에 대한 통찰력을 얻을 수 있을 것이며, 이는 당신이 &lt;em papago-id=&quot;9-1&quot;&gt;작성&lt;/em&gt;하는 코드에 도움이 될 것입니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 AJAX 라이브러리를 사용하여 무슨 일이 일어나고 있는지 개념적으로 이해하고 정확하게 호출을 구현할 수 있는 것이 정말 중요하다고 생각하지만, AJAX 사용을 시작하기 위해 XmlHttpRequest를 수행하기 위해 실제 코드를 작성해야 한다는 @Shog9에 동의하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개념을 이해하기 위해 배경을 읽어보고 싶습니다. 원한다면 이를 보여주는 코드 샘플을 구현해 보세요. 하지만 개념을 이해하고 나면 라이브러리를 사용하든 사용하지 않든 AJAX로 작업하는 방법에 대한 몇 가지 튜토리얼을 찾아보세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러분은 곧 다른 사람들이 전에 그곳에 가본 적이 있다는 것을 알게 될 것이고, 어떻게 돌아다닐지에 대해 꽤 좋은 표지판을 남겼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋은 코드를 쓰는 방법을 알아보기 위해 프레임워크 코드를 보는 것에 대한 생각에 동의합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뭐, 상황에 따라 다르겠지만...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;빨리 생산성을 향상시키길 원하십니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 JQuery나 당신이 선택한 다른 프레임워크가 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 자바스크립트/Ajax로 뛰어들어 작업이 어떻게 작동하는지 배우고 싶다면 직접 작성해 보고 다른 프레임워크도 살펴보고 학습하는 것이 더 좋을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사람마다 관점이 다르니까 그 사람들을 보고 어떻게 하고 있는지를 배워요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경고:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 jQuery를 사랑합니다. 제 의견은 편파적입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트를 처음 접하는 사람들은 도서관에 의존하기보다 기본적인 것(읽기: 처음부터 하기)을 배우는 것이 중요하다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 결과 코드의 시간 절약과 간결함은 도서관을 이용할 가치가 있다는 것을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요약하자면: 학습은 자신이 해야 합니다. 그렇지 않으면 자신과 마감일을 잘 지키고 도서관을 이용하세요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 세대의 기술은 이전 세대의 학습이 더 많은 힘을 제공할 수 있음에도 불구하고 학습의 유용성을 떨어트릴 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예: 수백만 명의 사람들이 자신의 C를 쓰는 것이 더 많은 통제력을 제공하더라도 Visual Basic을 배웁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;18-0&quot;&gt;질문에 대한 답변:&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;AJAX에 대해 알고 싶다면 라이브러리에서 AJAX를 어떻게 사용하는지 알아보세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;오픈 소스입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 시간이 지나면서 성숙해졌고 평도 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 &lt;strong papago-id=&quot;19-1&quot;&gt;AJAX&lt;/strong&gt;를 사용하고 싶다면, 그냥 라이브러리들 중 하나를 사용해서 골치 아픈 세상을 구할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 모든 것은 당신의 최종 목표가 무엇이냐의 문제라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 어떤 프레임워크가 가장 좋고 왜 어떤 것들이 작동하는지에 대한 교육적인 결정을 내릴 수 있도록 AJAX에 대한 기본적인 이해를 잘 하고 싶다면 프레임워크의 도움 없이 AJAX를 배우는 것이 당신에게 가장 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;동적 웹사이트와 AJAX를 설계하는 방법을 배우려는 목표가 당신의 이해에서 누락된 링크라면, 프레임워크를 기반으로 학습하는 데 아무런 해가 없다고 봅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 기술의 기본을 얼마나 자주 이해해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;에서 Http 요청을 할 수 있도록 WinHttp 개체를 사용하는 방법을 실제로 알 필요가 없는 것과 같은 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;넷, 대부분의 경우 XmlHttpRequest 개체에 접근하기 위해 어떤 형태의 인터페이스를 사용할 가능성이 높기 때문에 개체를 사용하는 방법을 알 필요가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/215589/should-i-avoid-using-a-javascript-library-while-learning-how-to-write-ajax-clien&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Ajax</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/644</guid>
      <comments>https://yellowcard.tistory.com/644#entry644comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:52:07 +0900</pubDate>
    </item>
    <item>
      <title>Pandas read_xml() 메서드 테스트 전략</title>
      <link>https://yellowcard.tistory.com/643</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Pandas read_xml() 메서드 테스트 전략&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 &lt;a href=&quot;http://pandas.pydata.org/pandas-docs/stable/io.html&quot; papago-id=&quot;1-1&quot; rel=&quot;noreferrer&quot;&gt;팬더 I/O 도구는&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;read_xml()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법과 그에 대응하는 방법&lt;/font&gt;&lt;/font&gt;&lt;code&gt;to_xml()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 그러나 데이터 프레임 가져오기 및 마크업 형식에 대해 트리와 같은 구조를 구현할 수 있음을 증명합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 팬더 팀이 그와 같은 것을 고려한다면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;read_xml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;향후 팬더 버전을 위한 방법, 어떤 구현을 추구할 것인가: 내장된 파싱&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xml.etree.ElementTree&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;iterfind()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;iterparse()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능 또는 타사 모듈,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;lxml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;XPath 1.0과 XSLT 1.0 방법으로?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래는 단순하고 평평한 요소 중심의 XML 입력에 대한 4가지 방법 유형에 대한 테스트 실행입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 것은 루트의 두 번째 레벨 자식에 대해 일반화된 파싱을 위해 설정되며 각 방법은 정확하게 동일한 팬더 데이터 프레임을 생성해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 통화를 제외한 모든 통화&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pd.Dataframe()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사전 목록에&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;XSLT 메서드는 캐스트된 XML을 CSV로 변환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;StringIO()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pd.read_csv()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문.&lt;/font&gt;&lt;/strong&gt; &lt;em papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(멀티파트)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능: 느린 속도를 어떻게 설명합니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;iterparse&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을 반복적으로 파싱하기 때문에 종종 더 큰 파일에 권장됩니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 부분적으로 그 때문인가요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;논리 검사?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리: CPU 메모리가 I/O 호출의 타이밍과 상관관계가 있습니까? XSLT 및 XPath 1.0은 전체 파일을 메모리에서 읽어야 구문 분석이 가능하기 때문에 더 큰 XML 문서로 확장이 잘 되지 않는 경향이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전략: 사전 목록이 최적의 전략입니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dataframe()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출? &lt;a href=&quot;https://stackoverflow.com/questions/28259301/how-to-convert-an-xml-file-to-nice-pandas-dataframe&quot; papago-id=&quot;21-1&quot;&gt;생성기&lt;/a&gt; 버전과 &lt;a href=&quot;https://stackoverflow.com/questions/26077231/how-to-open-this-xml-file-to-create-dataframe-in-python&quot; papago-id=&quot;21-3&quot;&gt;이터워크&lt;/a&gt; 사용자 &lt;a href=&quot;https://stackoverflow.com/questions/26077231/how-to-open-this-xml-file-to-create-dataframe-in-python&quot; papago-id=&quot;21-3&quot;&gt;정의&lt;/a&gt; 버전의 흥미로운 답변을 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 프레임에 두 목록을 모두 업캐스트합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;22-0&quot;&gt;입력&lt;/strong&gt; 데이터&lt;em papago-id=&quot;22-2&quot;&gt;(Stack Overflow의 &lt;a href=&quot;https://stackoverflow.com/users?page=1&amp;amp;tab=reputation&amp;amp;filter=year&quot; papago-id=&quot;22-2-1&quot;&gt;연도별 현재 최고 사용자&lt;/a&gt;&lt;/em&gt; 수(&lt;em papago-id=&quot;22-2&quot;&gt;Panda Friends 포함)&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;stackoverflow&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Gordon Linoff&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/1144035/gordon-linoff&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;New York, United States&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;5,985&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;499,408&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;sql&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;sql-server&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;mysql&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Günter Zöchbauer&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/217408/g%c3%bcnter-z%c3%b6chbauer&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Linz, Austria&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;5,835&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;154,439&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;angular2&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;typescript&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;javascript&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;jezrael&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/2901002/jezrael&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Bratislava, Slovakia&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;5,740&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;83,237&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;pandas&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;python&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;dataframe&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;VonC&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/6309/vonc&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;France&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;5,577&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;651,397&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;git&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;github&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;docker&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Martijn Pieters&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/100297/martijn-pieters&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Cambridge, United Kingdom&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;5,337&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;525,176&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;python&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;python-3.x&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;python-2.7&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;T.J. Crowder&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/157247/t-j-crowder&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;United Kingdom&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;5,258&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;508,310&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;javascript&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;jquery&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;java&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;akrun&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/3732271/akrun&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;5,188&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;229,553&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;r&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;dplyr&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;dataframe&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Wiktor Stribi?ew&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/3832970/wiktor-stribi%c5%bcew&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Warsaw, Poland&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,948&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;158,134&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;regex&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;javascript&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;c#&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Darin Dimitrov&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/29407/darin-dimitrov&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Sofia, Bulgaria&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,936&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;709,683&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;c#&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;asp.net-mvc&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;asp.net-mvc-3&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Eric Duminil&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/6419007/eric-duminil&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,854&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;12,557&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;ruby&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;ruby-on-rails&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;arrays&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;alecxe&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/771848/alecxe&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;New York, United States&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,723&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;233,368&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;python&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;selenium&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;protractor&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Jean-François Fabre&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/6451573/jean-fran%c3%a7ois-fabre&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Toulouse, France&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,526&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;30,027&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;python&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;python-3.x&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;python-2.7&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;piRSquared&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/2336654/pirsquared&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Bellevue, WA, United States&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,482&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;41,183&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;pandas&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;python&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;dataframe&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;CommonsWare&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/115145/commonsware&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Who Wants to Know?&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,475&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;616,135&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;android&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;java&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;android-intent&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Quentin&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/19068/quentin&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;United Kingdom&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,464&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;509,365&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;javascript&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;html&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;css&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Jon Skeet&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/22656/jon-skeet&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Reading, United Kingdom&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,348&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;921,690&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;c#&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;java&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;.net&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Felix Kling&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/218196/felix-kling&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Sunnyvale, CA&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,324&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;411,535&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;javascript&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;jquery&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;asynchronous&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;matt&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/341994/matt&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,313&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;220,515&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;swift&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;ios&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;xcode&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Psidom&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/4983450/psidom&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Atlanta, GA, United States&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,236&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;36,950&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;python&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;pandas&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;r&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Martin R&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/1187415/martin-r&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Germany&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,195&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;269,380&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;swift&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;ios&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;swift3&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Barmar&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/1491895/barmar&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Arlington, MA&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,179&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;289,989&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;javascript&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;php&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;jquery&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Alexey Mezenin&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/1227923/alexey-mezenin&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;??????&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,142&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;31,602&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;laravel&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;php&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;laravel-5.3&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;BalusC&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/157882/balusc&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Amsterdam, Netherlands&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,046&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;703,046&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;java&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;jsf&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;servlets&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;GurV&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/6348498/gurv&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;4,016&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;7,932&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;sql&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;mysql&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;sql-server&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Nina Scholz&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/1447675/nina-scholz&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Berlin, Deutschland&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,950&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;61,135&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;javascript&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;arrays&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;object&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;JB Nizet&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/571407/jb-nizet&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Saint-Etienne, France&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,923&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;418,780&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;java&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;hibernate&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;java-8&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Frank van Puffelen&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/209103/frank-van-puffelen&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;San Francisco, CA&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,920&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;86,520&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;firebase&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;firebase-database&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;android&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;dasblinkenlight&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/335858/dasblinkenlight&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;United States&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,886&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;475,813&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;c#&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;java&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;c++&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Tim Biegeleisen&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/1863229/tim-biegeleisen&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Singapore&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,814&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;77,211&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;sql&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;mysql&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;java&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Greg Hewgill&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/893/greg-hewgill&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Christchurch, New Zealand&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,796&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;529,137&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;git&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;python&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;git-pull&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;unutbu&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/190597/unutbu&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,735&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;401,595&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;python&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;pandas&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;numpy&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Hans Passant&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/17034/hans-passant&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Madison, WI&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,688&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;672,118&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;c#&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;.net&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;winforms&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Jonathan Leffler&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/15168/jonathan-leffler&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;California, USA&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,649&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;455,157&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;c&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;bash&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;unix&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;paxdiablo&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/14860/paxdiablo&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,636&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;507,043&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;c&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;c++&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;bash&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Pranav C Balan&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/3037257/pranav-c-balan&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Ramanthali, Kannur, Kerala, India&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,604&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;64,476&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;javascript&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;jquery&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;html&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
  &amp;lt;topusers&amp;gt;
    &amp;lt;user&amp;gt;Suragch&amp;lt;/user&amp;gt;
    &amp;lt;link&amp;gt;http://www.stackoverflow.com//users/3681880/suragch&amp;lt;/link&amp;gt;
    &amp;lt;location&amp;gt;Hohhot, China&amp;lt;/location&amp;gt;
    &amp;lt;year_rep&amp;gt;3,580&amp;lt;/year_rep&amp;gt;
    &amp;lt;total_rep&amp;gt;71,032&amp;lt;/total_rep&amp;gt;
    &amp;lt;tag1&amp;gt;swift&amp;lt;/tag1&amp;gt;
    &amp;lt;tag2&amp;gt;ios&amp;lt;/tag2&amp;gt;
    &amp;lt;tag3&amp;gt;android&amp;lt;/tag3&amp;gt;
  &amp;lt;/topusers&amp;gt;
&amp;lt;/stackoverflow&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;23-0&quot;&gt;파이썬&lt;/strong&gt; 메소드&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import xml.etree.ElementTree as et
import pandas as pd
from io import StringIO
from lxml import etree as lxet

def read_xml_iterfind():
    tree = et.parse('Input.xml')

    data = []
    inner = {}
    for el in tree.iterfind('./*'):
        for i in el.iterfind('*'):
            inner[i.tag] = i.text
        data.append(inner)
        inner = {}

    df = pd.DataFrame(data)

def read_xml_iterparse():
    data = []
    inner = {}
    i = 1
    for (ev, el) in et.iterparse(path):
        if i &amp;lt;= 2:
           first_tag = el.tag

        if el.tag == first_tag and len(inner) != 0:
            data.append(inner)            
            inner = {}

        if el.text is not None and len(el.text.strip()) &amp;gt; 0:
            inner[el.tag] = el.text
    i += 1

    df = pd.DataFrame(data)    

def read_xml_lxml_xpath():     
    tree = lxet.parse('Input.xml')

    data = []
    inner = {}
    for el in tree.xpath('/*/*'):
        for i in el:
            inner[i.tag] = i.text
        data.append(inner)
        inner = {}

    df = pd.DataFrame(data)

def read_xml_lxml_xsl():     
    xml = lxet.parse('Input.xml')

    xslstr = '''
    &amp;lt;xsl:transform xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; version=&quot;1.0&quot;&amp;gt;
        &amp;lt;xsl:output version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; indent=&quot;yes&quot;  method=&quot;text&quot;/&amp;gt;
        &amp;lt;xsl:strip-space elements=&quot;*&quot;/&amp;gt;

        &amp;lt;!-- HEADERS --&amp;gt;
        &amp;lt;xsl:template match = &quot;/*&quot;&amp;gt;
            &amp;lt;xsl:for-each select=&quot;*[1]/*&quot;&amp;gt;
              &amp;lt;xsl:value-of select=&quot;local-name()&quot; /&amp;gt;
                &amp;lt;xsl:choose&amp;gt;
                   &amp;lt;xsl:when test=&quot;position() != last()&quot;&amp;gt;
                      &amp;lt;xsl:text&amp;gt;,&amp;lt;/xsl:text&amp;gt;
                   &amp;lt;/xsl:when&amp;gt;
                   &amp;lt;xsl:otherwise&amp;gt;
                      &amp;lt;xsl:text&amp;gt;&amp;amp;#xa;&amp;lt;/xsl:text&amp;gt;
                   &amp;lt;/xsl:otherwise&amp;gt;                              
                &amp;lt;/xsl:choose&amp;gt;   
            &amp;lt;/xsl:for-each&amp;gt;
            &amp;lt;xsl:apply-templates/&amp;gt;
        &amp;lt;/xsl:template&amp;gt;

        &amp;lt;!-- DATA ROWS (COMMA-SEPARATED) --&amp;gt;
        &amp;lt;xsl:template match=&quot;/*/*&quot; priority=&quot;2&quot;&amp;gt;    
            &amp;lt;xsl:for-each select=&quot;*&quot;&amp;gt;
              &amp;lt;xsl:if test=&quot;position() = 1&quot;&amp;gt;
                   &amp;lt;xsl:text&amp;gt;&amp;amp;quot;&amp;lt;/xsl:text&amp;gt;
              &amp;lt;/xsl:if&amp;gt;
              &amp;lt;xsl:value-of select=&quot;.&quot; /&amp;gt;
                &amp;lt;xsl:choose&amp;gt;
                   &amp;lt;xsl:when test=&quot;position() != last()&quot;&amp;gt;
                      &amp;lt;xsl:text&amp;gt;&amp;amp;quot;,&amp;amp;quot;&amp;lt;/xsl:text&amp;gt;
                   &amp;lt;/xsl:when&amp;gt;
                   &amp;lt;xsl:otherwise&amp;gt;
                      &amp;lt;xsl:text&amp;gt;&amp;amp;quot;&amp;amp;#xa;&amp;lt;/xsl:text&amp;gt;
                   &amp;lt;/xsl:otherwise&amp;gt;                              
                &amp;lt;/xsl:choose&amp;gt;
            &amp;lt;/xsl:for-each&amp;gt;
        &amp;lt;/xsl:template&amp;gt;

    &amp;lt;/xsl:transform&amp;gt;
    '''
    xsl = lxet.fromstring(xslstr)

    transform = lxet.XSLT(xsl)
    newdom = transform(xml)

    df = pd.read_csv(StringIO(str(newdom)))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;타이밍&lt;/font&gt;&lt;/strong&gt; &lt;em papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(현재 XML 및 XML과 25배의 자식이 있는 경우(예: 900 StackOverflow 사용자 레코드)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# SHORTER FILE
python -mtimeit -s'import readxml_test_runs as test' 'test.read_xml_iterfind()'
100 loops, best of 3: 3.87 msec per loop

python -mtimeit -s'import readxml_test_runs as test' 'test.read_xml_iterparse()'
100 loops, best of 3: 5.5 msec per loop

python -mtimeit -s'import readxml_test_runs as test' 'test.read_xml_lxml_xpath()'
100 loops, best of 3: 3.86 msec per loop

python -mtimeit -s'import readxml_test_runs as test' 'test.read_xml_lxml_xsl()'
100 loops, best of 3: 5.68 msec per loop

# LARGER FILE
python -mtimeit -n'100' -s'import readxml_test_runs as test' 'test.read_xml_iterfind()'
100 loops, best of 3: 36 msec per loop

python -mtimeit -n'100' -s'import readxml_test_runs as test' 'test.read_xml_iterparse()'
100 loops, best of 3: 78.9 msec per loop

python -mtimeit -n'100' -s'import readxml_test_runs as test' 'test.read_xml_lxml_xpath()'
100 loops, best of 3: 32.7 msec per loop

python -mtimeit -n'100' -s'import readxml_test_runs as test' 'test.read_xml_lxml_xsl()'
100 loops, best of 3: 51.4 msec per loop
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능: 파일을 반복적으로 구문 분석할 때 큰 파일에 대해 종종 권장되는 느린 구문 분석을 어떻게 설명하십니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;if 로직 체크에 부분적으로 기인합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이썬 코드가 매번 평가되기 때문에 파이썬 코드가 많아지면 속도가 느려질 것이라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 파이피 같은 JIT 컴파일러를 사용해 본 적이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제거하면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;first_tag&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다만, 상당히 빠른 것 같습니다. 예, if 로직 체크에 부분적으로 기인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;def read_xml_iterparse2(path):
    data = []
    inner = {}
    first_tag = None
    for (ev, el) in et.iterparse(path):
        if not first_tag:
           first_tag = el.tag

        if el.tag == first_tag and len(inner) != 0:
            data.append(inner)            
            inner = {}

        if el.text is not None and len(el.text.strip()) &amp;gt; 0:
            inner[el.tag] = el.text

    df = pd.DataFrame(data)    

%timeit read_xml_iterparse(path)
# 10 loops, best of 5: 33 ms per loop
%timeit read_xml_iterparse2(path)
# 10 loops, best of 5: 23 ms per loop
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 내가 마지막의 목적을 이해할 수 있을지 확신할 수 없었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확인해보세요. 그런데 왜 공백 전용 요소를 잃어버리려고 하는지도 모르겠네요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 제거&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지속적으로 약간의 시간을 절약합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;def read_xml_iterparse3(path):
    data = []
    inner = {}
    first_tag = None
    for (ev, el) in et.iterparse(path):
        if not first_tag:
           first_tag = el.tag

        if el.tag == first_tag and len(inner) != 0:
            data.append(inner)            
            inner = {}

        inner[el.tag] = el.text

    df = pd.DataFrame(data)    

%timeit read_xml_iterparse(path)
# 10 loops, best of 5: 34.4 ms per loop
%timeit read_xml_iterparse2(path)
# 10 loops, best of 5: 24.5 ms per loop
%timeit read_xml_iterparse3(path)
# 10 loops, best of 5: 20.9 ms per loop
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 성능 향상 여부에 관계없이 반복 구문 분석 버전은 초대형 데이터 프레임을 생성하는 것으로 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 효과적이고 빠른 버전입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-py prettyprint-override&quot;&gt;&lt;code&gt;def read_xml_iterparse5(path):
    data = []
    inner = {}
    for (ev, el) in et.iterparse(path):
        # /ending parents trigger a new row, and in our case .text is \n followed by spaces.  it would be more reliable to pass 'topusers' to our read_xml_iterparse5 as the .tag to check
        if el.text and el.text[0] == '\n':
            # ignore /stackoverflow
            if inner:
                data.append(inner)
                inner = {}
        else:
            inner[el.tag] = el.text

    return pd.DataFrame(data)    

print(read_xml_iterfind(path).shape)
# (900, 8)
print(read_xml_iterparse(path).shape)
# (7050, 8)
print(read_xml_lxml_xpath(path).shape)
# (900, 8)
print(read_xml_lxml_xsl(path).shape)
# (900, 8)
print(read_xml_iterparse5(path).shape)
# (900, 8)
%timeit read_xml_iterparse5(path)
# 10 loops, best of 5: 20.6 ms per loop
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리: CPU 메모리가 I/O 호출의 타이밍과 상관관계가 있습니까? XSLT 및 XPath 1.0은 전체 파일을 메모리에서 읽어야 구문 분석이 가능하기 때문에 더 큰 XML 문서로 확장이 잘 되지 않는 경향이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;I/O 호출&quot;이 무슨 뜻인지는 잘 모르겠지만, 문서가 캐시에 들어갈 수 있을 정도로 작다면 캐시에서 다른 많은 항목을 제거하지 않기 때문에 모든 작업이 훨씬 빨라질 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전략: 사전 목록이 Dataframe() 호출에 최적의 전략입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제너레이터 버전과 이터워크 사용자 정의 버전의 흥미로운 답변을 참조하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 프레임에 두 목록을 모두 업캐스트합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;목록은 메모리를 덜 사용하므로 열의 개수에 따라 현저한 차이가 발생할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론, 그러면 XML 태그가 일관된 순서로 정렬되어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DataFrame()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출은 또한 모든 행에서 명령어의 키를 조회할 필요가 없기 때문에 작업량을 줄일 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 만약 어떤 값에 대해 어떤 열이 있는지를 파악하기 위해서 말입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/41776263/pandas-read-xml-method-test-strategies&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>xml</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/643</guid>
      <comments>https://yellowcard.tistory.com/643#entry643comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:52:00 +0900</pubDate>
    </item>
    <item>
      <title>평원 C에서 UTF-8을 탐지하는 방법은?</title>
      <link>https://yellowcard.tistory.com/642</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;평원 C에서 UTF-8을 탐지하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 주어진 문자열이 UTF-8 인코딩임을 감지하는 평이한 오래된 C에서 코드 스니펫을 찾고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;regex로 해결하는 방법은 알고 있지만, 여러 가지 이유로 이 경우에는 일반적인 C 이외의 것은 사용하지 않는 것이 좋을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;regex를 사용하는 솔루션은 다음과 같습니다(경고: 다양한 검사 생략).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define UTF8_DETECT_REGEXP  &quot;^([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$&quot;

const char *error;
int         error_off;
int         rc;
int         vect[100];

utf8_re = pcre_compile(UTF8_DETECT_REGEXP, PCRE_CASELESS, &amp;amp;error, &amp;amp;error_off, NULL);
utf8_pe = pcre_study(utf8_re, 0, &amp;amp;error);

rc = pcre_exec(utf8_re, utf8_pe, str, len, 0, 0, vect, sizeof(vect)/sizeof(vect[0]));

if (rc &amp;gt; 0) {
    printf(&quot;string is in UTF8\n&quot;);
} else {
    printf(&quot;string is not in UTF8\n&quot;)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플레인 C에서 이 표현식을 (&lt;a href=&quot;http://www.w3.org/International/questions/qa-forms-utf-8&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;버그&lt;/a&gt;가 없기를 바라는) 구현한 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;_Bool is_utf8(const char * string)
{
    if(!string)
        return 0;

    const unsigned char * bytes = (const unsigned char *)string;
    while(*bytes)
    {
        if( (// ASCII
             // use bytes[0] &amp;lt;= 0x7F to allow ASCII control characters
                bytes[0] == 0x09 ||
                bytes[0] == 0x0A ||
                bytes[0] == 0x0D ||
                (0x20 &amp;lt;= bytes[0] &amp;amp;&amp;amp; bytes[0] &amp;lt;= 0x7E)
            )
        ) {
            bytes += 1;
            continue;
        }

        if( (// non-overlong 2-byte
                (0xC2 &amp;lt;= bytes[0] &amp;amp;&amp;amp; bytes[0] &amp;lt;= 0xDF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[1] &amp;amp;&amp;amp; bytes[1] &amp;lt;= 0xBF)
            )
        ) {
            bytes += 2;
            continue;
        }

        if( (// excluding overlongs
                bytes[0] == 0xE0 &amp;amp;&amp;amp;
                (0xA0 &amp;lt;= bytes[1] &amp;amp;&amp;amp; bytes[1] &amp;lt;= 0xBF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[2] &amp;amp;&amp;amp; bytes[2] &amp;lt;= 0xBF)
            ) ||
            (// straight 3-byte
                ((0xE1 &amp;lt;= bytes[0] &amp;amp;&amp;amp; bytes[0] &amp;lt;= 0xEC) ||
                    bytes[0] == 0xEE ||
                    bytes[0] == 0xEF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[1] &amp;amp;&amp;amp; bytes[1] &amp;lt;= 0xBF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[2] &amp;amp;&amp;amp; bytes[2] &amp;lt;= 0xBF)
            ) ||
            (// excluding surrogates
                bytes[0] == 0xED &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[1] &amp;amp;&amp;amp; bytes[1] &amp;lt;= 0x9F) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[2] &amp;amp;&amp;amp; bytes[2] &amp;lt;= 0xBF)
            )
        ) {
            bytes += 3;
            continue;
        }

        if( (// planes 1-3
                bytes[0] == 0xF0 &amp;amp;&amp;amp;
                (0x90 &amp;lt;= bytes[1] &amp;amp;&amp;amp; bytes[1] &amp;lt;= 0xBF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[2] &amp;amp;&amp;amp; bytes[2] &amp;lt;= 0xBF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[3] &amp;amp;&amp;amp; bytes[3] &amp;lt;= 0xBF)
            ) ||
            (// planes 4-15
                (0xF1 &amp;lt;= bytes[0] &amp;amp;&amp;amp; bytes[0] &amp;lt;= 0xF3) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[1] &amp;amp;&amp;amp; bytes[1] &amp;lt;= 0xBF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[2] &amp;amp;&amp;amp; bytes[2] &amp;lt;= 0xBF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[3] &amp;amp;&amp;amp; bytes[3] &amp;lt;= 0xBF)
            ) ||
            (// plane 16
                bytes[0] == 0xF4 &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[1] &amp;amp;&amp;amp; bytes[1] &amp;lt;= 0x8F) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[2] &amp;amp;&amp;amp; bytes[2] &amp;lt;= 0xBF) &amp;amp;&amp;amp;
                (0x80 &amp;lt;= bytes[3] &amp;amp;&amp;amp; bytes[3] &amp;lt;= 0xBF)
            )
        ) {
            bytes += 4;
            continue;
        }

        return 0;
    }

    return 1;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;양식 검증을 위해 W3C가 권장하는 정규식을 충실하게 번역한 것으로, 일부 유효한 UTF-8 시퀀스(특히 ASCII 제어 문자가 포함된 것)를 실제로 거부합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 댓글에 언급된 변경을 통해 이를 수정한 후에도 기술적으로는 합법적이어야 함에도 NUL 문자를 내장하지 못하도록 하는 제로 종결을 가정하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 직접 문자열 라이브러리를 만들 때 수정된 UTF-8(즉, NUL을 긴 2바이트 시퀀스로 인코딩)을 사용했습니다. 위의 단점을 겪지 않는 검증 루틴을 제공하기 위한 템플릿으로 이 &lt;a href=&quot;https://bitbucket.org/cggaertner/libtcu/src/5ea138154ba5/utf8z.h&quot; rel=&quot;noreferrer&quot; papago-id=&quot;6-1&quot;&gt;헤더&lt;/a&gt;를 자유롭게 사용하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Bjoern Hoermann이 만든 이 디코더는 제가 찾은 것 중에 가장 간단합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 상태를 유지할 뿐만 아니라 단일 바이트를 공급함으로써 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 상태는 네트워크를 통해 청크 단위로 들어오는 UTF8을 구문 분석하는 데 매우 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://bjoern.hoehrmann.de/utf-8/decoder/dfa/&quot; papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://bjoern.hoehrmann.de/utf-8/decoder/dfa/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Copyright (c) 2008-2009 Bjoern Hoehrmann &amp;lt;bjoern@hoehrmann.de&amp;gt;
// See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details.

#define UTF8_ACCEPT 0
#define UTF8_REJECT 1

static const uint8_t utf8d[] = {
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf
  8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df
  0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef
  0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff
  0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, // s1..s2
  1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4
  1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6
  1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // s7..s8
};

uint32_t inline
decode(uint32_t* state, uint32_t* codep, uint32_t byte) {
  uint32_t type = utf8d[byte];

  *codep = (*state != UTF8_ACCEPT) ?
    (byte &amp;amp; 0x3fu) | (*codep &amp;lt;&amp;lt; 6) :
    (0xff &amp;gt;&amp;gt; type) &amp;amp; (byte);

  *state = utf8d[256 + *state*16 + type];
  return *state;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순한 validator/detector는 코드 포인트가 필요 없기 때문에 이렇게 쓸 수 있습니다(초기 상태는 다음과 같이 설정됨).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UTF8_ACCEPT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;):&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;uint32_t validate_utf8(uint32_t *state, char *str, size_t len) {
   size_t i;
   uint32_t type;

    for (i = 0; i &amp;lt; len; i++) {
        // We don't care about the codepoint, so this is
        // a simplified version of the decode function.
        type = utf8d[(uint8_t)str[i]];
        *state = utf8d[256 + (*state) * 16 + type];

        if (*state == UTF8_REJECT)
            break;
    }

    return *state;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트가 유효한 경우 utf8&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UTF8_ACCEPT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무효인 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UTF8_REJECT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 더 많은 데이터가 필요한 경우 다른 정수를 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 청크(예: 네트워크에서 전송)로 공급하는 경우의 사용 예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char buf[128];
size_t bytes_read;
uint32_t state = UTF8_ACCEPT;

// Validate the UTF8 data in chunks.
while ((bytes_read = get_new_data(buf, sizeof(buf))) {
    if (validate_utf8(&amp;amp;state, buf, bytes_read) == UTF8_REJECT)) {
        fprintf(stderr, &quot;Invalid UTF8 data!\n&quot;);
        return -1;
    }
}

// If everything went well we should have proper UTF8,
// the data might instead have ended in the middle of a UTF8
// codepoint.
if (state != UTF8_ACCEPT) {
    fprintf(stderr, &quot;Invalid UTF8, incomplete codepoint\n&quot;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주어진 문자열(또는 바이트 시퀀스)이 예를 들어 각각의 UTF-8 옥텟과 같은 UTF-8 인코딩 텍스트인지 여부를 탐지할 수 없으며 모든 UTF-8 옥텟 시리즈가 라틴-1(또는 다른 인코딩) 옥텟의 유효한(비논리적인 경우) 시리즈이기도 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 모든 유효한 라틴어-1 옥텟 시리즈가 유효한 UTF-8 시리즈인 것은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 UTF-8 인코딩 스키마를 준수하지 않는 문자열을 제외할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;U+0000-U+007F    0xxxxxxx
U+0080-U+07FF    110yyyxx    10xxxxxx
U+0800-U+FFFF    1110yyyy    10yyyyxx    10xxxxxx
U+10000-U+10FFFF 11110zzz    10zzyyyy    10yyyyxx    10xxxxxx   
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열을 UTF-8로 구문 분석해야 합니다. http://www.rfc-editor.org/rfc/rfc3629.txt 매우 간단합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;파싱이 실패하면 UTF-8이 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 할 수 있는 간단한 UTF-8 라이브러리가 주변에 몇 개 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열이 기존의 일반 ASCII이거나 &lt;strong papago-id=&quot;17-3&quot;&gt;UTF-8&lt;/strong&gt; 인코딩된 ASCII 외부의 문자를 포함하고 있다는 것을 &lt;strong papago-id=&quot;17-1&quot;&gt;알고&lt;/strong&gt; 있다면 단순화할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 경우에는 차이점을 신경 쓸 필요가 없는 경우가 많습니다. UTF-8의 설계는 ASCII를 처리할 수 있는 기존 프로그램이 대부분의 경우 투명하게 UTF-8을 처리할 수 있다는 것이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ASCII는 UTF-8 자체로 인코딩되어 있으므로 ASCII는 유효한 UTF-8입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 문자열은 무엇이든 될 수 있습니다. 콘텐츠가 ASCII, GB 2312, CP437, UTF-16인지 아니면 프로그램을 힘들게 만드는 다른 12개의 문자 인코딩인지 알 수 없는 문제를 해결해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주어진 바이트 배열이 UTF-8 문자열이라는 것을 감지하는 것은 불가능합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유효한 UTF-8이 될 수 없다는 것을 확실하게 판단할 수 있으며(유효하지 않은 UTF-8이 아님을 의미하는 것은 아님), 유효한 UTF-8 시퀀스일 수 있지만 이는 위양성이 될 수 있다고 판단할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 예를 들어 난수 생성기를 사용하여 3개의 난수 바이트 배열을 생성하고 이를 사용하여 코드를 테스트합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이들은 무작위 바이트이므로 UTF-8이 아니므로 코드가 &quot;UTF-8일 가능성이 있다&quot;고 생각하는 모든 문자열은 거짓 양성입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 추측으로는 (이런 상황에서) 당신의 코드가 12% 이상 틀릴 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 불가능하다는 것을 알게 되면, (자신의 예측과 더불어) 신뢰 수준을 반환하는 것에 대해 생각해 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 함수가 &quot;이것이 UTF-8이라고 88% 확신합니다&quot;와 같은 것을 반환할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 다른 모든 유형의 데이터에 대해 이 작업을 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, &quot;이것이 UTF-16이라고 95% 확신합니다&quot;라고 반환하는 데이터가 UTF-16인지 확인한 다음 (95%가 88%보다 높기 때문에) 데이터가 UTF-8이 아니라 UTF-16이었을 가능성이 더 높다고 판단하는 기능이 있을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 단계는 신뢰 수준을 높이기 위한 요령을 추가하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 문자열이 대부분 공백으로 구분된 유효 음절 그룹을 포함하는 것처럼 보인다면 실제로 UTF-8이라고 훨씬 더 확신할 수 있습니다. 같은 방식으로 데이터가 HTML일 수 있다면 유효한 HTML 마크업을 확인하고 이를 사용하여 자신감을 높일 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 다른 유형의 데이터에도 동일하게 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 데이터에 유효한 PE32 또는 ELF 헤더 또는 올바른 BMP 또는 JPG 또는 MP3 헤더가 있으면 UTF-8이 아니라고 훨씬 더 확신할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;훨씬 더 나은 접근법은 문제의 실제 원인을 고치는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 관심 있는 모든 파일의 시작 부분에 일종의 &quot;문서 유형&quot; 식별자를 추가하거나, &quot;이 소프트웨어는 UTF-8을 가정하고 다른 어떤 것도 지원하지 않습니다&quot;라고 말할 수 있습니다. 이렇게 하면 우선 의심스러운 추측을 할 필요가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.mozilla.org/projects/intl/detectorsrc.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;5-1&quot;&gt;Firefox에 통합된 UTF-8 디텍터&lt;/a&gt;를 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;범용 문자 집합 감지기에서 볼 수 있으며 C++ 라이브러리를 따라 설치되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UTF-8을 인식하는 수업을 찾기가 매우 쉬워야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 클래스는 기본적으로 UTF-8에 고유한 문자 시퀀스를 탐지합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최신 파이어폭스 트렁크를 가져옵니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;\mozilla\extensions\universal chardet\로 이동합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UTF-8 디텍터 클래스를 찾습니다(정확한 이름이 무엇인지 잘 기억나지 않습니다).&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 주어진 키(최대 4자의 문자열)가 이 링크의 형식과 일치하는지 확인합니다. http://www.fileformat.info/info/unicode/utf8.htm&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/*
** Checks if the given string has all bytes like: 10xxxxxx
** where x is either 0 or 1
*/

static int      chars_are_folow_uni(const unsigned char *chars)
{
    while (*chars)
    {
        if ((*chars &amp;gt;&amp;gt; 6) != 0x2)
            return (0);
        chars++;
    }
    return (1);
}

int             char_is_utf8(const unsigned char *key)
{
    int         required_len;

    if (key[0] &amp;gt;&amp;gt; 7 == 0)
        required_len = 1;
    else if (key[0] &amp;gt;&amp;gt; 5 == 0x6)
        required_len = 2;
    else if (key[0] &amp;gt;&amp;gt; 4 == 0xE)
        required_len = 3;
    else if (key[0] &amp;gt;&amp;gt; 5 == 0x1E)
        required_len = 4;
    else
        return (0);
    return (strlen(key) == required_len &amp;amp;&amp;amp; chars_are_folow_uni(key + 1));
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;unsigned char   buf[5];

ft_to_utf8(L'歓', buf);
printf(&quot;%d\n&quot;, char_is_utf8(buf)); // =&amp;gt; 1
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 계산에 따르면 3개의 랜덤 바이트는 유효한 UTF-8일 확률이 15.8%인 것으로 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;128^3 가능한 ASCII 전용 시퀀스 = 2097152&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2^16-2^11 가능한 3바이트 UTF-8 문자(대리쌍 및 비문자가 허용됨을 가정함) = 63488&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1920 2바이트 UTF-8 문자(ASCII 문자 앞 또는 뒤) = 1920*128*2 = 524288&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3바이트 수열로 나누기 = (2097152+63488+491520)/1677216.0 = 0.1580810546875&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IMHO는 파일 길이가 3바이트에 불과하기 때문에 잘못된 일치 수를 엄청나게 과대평가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;바이트 수가 증가함에 따라 교차점은 훨씬 아래로 내려갑니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 UTF-8이 아닌 실제 텍스트는 무작위가 아니며, 높은 비트 집합을 가진 많은 수의 단일 바이트가 있으며, 이는 유효한 UTF-8이 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실패 확률을 추측할 때 더 유용한 메트릭은 높은 비트 집합을 가진 바이트 시퀀스가 유효한 UTF-8일 가능성입니다. 다음 값을 얻습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;1 byte = 0% # the really important number that is often ignored
2 byte = 11.7%
3 byte = 3.03% (assumes surrogate halves are valid)
4 byte = 1.76% (includes two 2-byte characters)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 유효한 UTF-8 문자열인 실제 읽기 쉬운 문자열(언어 및 인코딩)을 찾는 것도 유용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 매우 어렵기 때문에 실제 데이터의 문제가 아님을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오래된 스레드라는 것을 알고 있지만 @Christoph의 멋진 솔루션(업보트)에 비해 개선된 것 같아 여기에 제 솔루션을 게시하려고 생각했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 전문가가 아니라서 RFC를 잘못 읽었을 수도 있지만 256바이트 맵 대신 32바이트 맵을 사용할 수 있어 메모리와 시간을 모두 절약할 수 있을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 통해 UTF-8 문자 하나만큼 문자열 포인터를 발전시켜 UTF8 코드 포인트를 32비트 부호 정수로 저장하고 오류 발생 시 -1 값을 저장하는 간단한 매크로를 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 몇 가지 댓글이 달린 코드가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdint.h&amp;gt;
/**
 * Maps the last 5 bits in a byte (0b11111xxx) to a UTF-8 codepoint length.
 *
 * Codepoint length 0 == error.
 *
 * The first valid length can be any value between 1 to 4 (5== error).
 *
 * An intermidiate (second, third or forth) valid length must be 5.
 *
 * To map was populated using the following Ruby script:
 *
 *      map = []; 32.times { map &amp;lt;&amp;lt; 0 }; (0..0b1111).each {|i| map[i] = 1} ;
 *      (0b10000..0b10111).each {|i| map[i] = 5} ;
 *      (0b11000..0b11011).each {|i| map[i] = 2} ;
 *      (0b11100..0b11101).each {|i| map[i] = 3} ;
 *      map[0b11110] = 4; map;
 */
static uint8_t fio_str_utf8_map[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                     1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5,
                                     5, 5, 2, 2, 2, 2, 3, 3, 4, 0};

/**
 * Advances the `ptr` by one utf-8 character, placing the value of the UTF-8
 * character into the i32 variable (which must be a signed integer with 32bits
 * or more). On error, `i32` will be equal to `-1` and `ptr` will not step
 * forwards.
 *
 * The `end` value is only used for overflow protection.
 */
#define FIO_STR_UTF8_CODE_POINT(ptr, end, i32)                                 \
  switch (fio_str_utf8_map[((uint8_t *)(ptr))[0] &amp;gt;&amp;gt; 3]) {                      \
  case 1:                                                                      \
    (i32) = ((uint8_t *)(ptr))[0];                                             \
    ++(ptr);                                                                   \
    break;                                                                     \
  case 2:                                                                      \
    if (((ptr) + 2 &amp;gt; (end)) ||                                                 \
        fio_str_utf8_map[((uint8_t *)(ptr))[1] &amp;gt;&amp;gt; 3] != 5) {                   \
      (i32) = -1;                                                              \
      break;                                                                   \
    }                                                                          \
    (i32) =                                                                    \
        ((((uint8_t *)(ptr))[0] &amp;amp; 31) &amp;lt;&amp;lt; 6) | (((uint8_t *)(ptr))[1] &amp;amp; 63);    \
    (ptr) += 2;                                                                \
    break;                                                                     \
  case 3:                                                                      \
    if (((ptr) + 3 &amp;gt; (end)) ||                                                 \
        fio_str_utf8_map[((uint8_t *)(ptr))[1] &amp;gt;&amp;gt; 3] != 5 ||                   \
        fio_str_utf8_map[((uint8_t *)(ptr))[2] &amp;gt;&amp;gt; 3] != 5) {                   \
      (i32) = -1;                                                              \
      break;                                                                   \
    }                                                                          \
    (i32) = ((((uint8_t *)(ptr))[0] &amp;amp; 15) &amp;lt;&amp;lt; 12) |                             \
            ((((uint8_t *)(ptr))[1] &amp;amp; 63) &amp;lt;&amp;lt; 6) |                              \
            (((uint8_t *)(ptr))[2] &amp;amp; 63);                                      \
    (ptr) += 3;                                                                \
    break;                                                                     \
  case 4:                                                                      \
    if (((ptr) + 4 &amp;gt; (end)) ||                                                 \
        fio_str_utf8_map[((uint8_t *)(ptr))[1] &amp;gt;&amp;gt; 3] != 5 ||                   \
        fio_str_utf8_map[((uint8_t *)(ptr))[2] &amp;gt;&amp;gt; 3] != 5 ||                   \
        fio_str_utf8_map[((uint8_t *)(ptr))[3] &amp;gt;&amp;gt; 3] != 5) {                   \
      (i32) = -1;                                                              \
      break;                                                                   \
    }                                                                          \
    (i32) = ((((uint8_t *)(ptr))[0] &amp;amp; 7) &amp;lt;&amp;lt; 18) |                              \
            ((((uint8_t *)(ptr))[1] &amp;amp; 63) &amp;lt;&amp;lt; 12) |                             \
            ((((uint8_t *)(ptr))[2] &amp;amp; 63) &amp;lt;&amp;lt; 6) |                              \
            (((uint8_t *)(ptr))[3] &amp;amp; 63);                                      \
    (ptr) += 4;                                                                \
    break;                                                                     \
  default:                                                                     \
    (i32) = -1;                                                                \
    break;                                                                     \
  }

/** Returns 1 if the String is UTF-8 valid and 0 if not. */
inline static size_t fio_str_utf8_valid2(char const *str, size_t length) {
  if (!str)
    return 0;
  if (!length)
    return 1;
  const char *const end = str + length;
  int32_t c = 0;
  do {
    FIO_STR_UTF8_CODE_POINT(str, end, c);
  } while (c &amp;gt; 0 &amp;amp;&amp;amp; str &amp;lt; end);
  return str == end &amp;amp;&amp;amp; c &amp;gt;= 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표현 코드를 사용한 추가 제안&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 다음과 같은 코드를 제안합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나은 이해를 위해 조금 더 표현적이기를 바랍니다(이 게시물의 다른 제안처럼 빠르지 않을 수도 있음).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 테스트 사례에서는 첫 번째 질문에 어떻게 답하는지를 보여 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define __FALSE (0)
#define __TRUE  (!__FALSE)

#define MS1BITCNT_0_IS_0xxxxxxx_NO_SUCCESSOR        (0)
#define MS1BITCNT_1_IS_10xxxxxx_IS_SUCCESSOR        (1)
#define MS1BITCNT_2_IS_110xxxxx_HAS_1_SUCCESSOR     (2)
#define MS1BITCNT_3_IS_1110xxxx_HAS_2_SUCCESSORS    (3)
#define MS1BITCNT_4_IS_11110xxx_HAS_3_SUCCESSORS    (4)

typedef int __BOOL;

int CountMS1BitSequenceAndForward(const char **p) {
    int     Mask;
    int     Result = 0;
    char    c = **p;
    ++(*p);
    for (Mask=0x80;c&amp;amp;(Mask&amp;amp;0xFF);Mask&amp;gt;&amp;gt;=1,++Result);
    return Result;
}


int MS1BitSequenceCount2SuccessorByteCount(int MS1BitSeqCount) {
    switch (MS1BitSeqCount) {
    case MS1BITCNT_2_IS_110xxxxx_HAS_1_SUCCESSOR: return 1;
    case MS1BITCNT_3_IS_1110xxxx_HAS_2_SUCCESSORS: return 2;
    case MS1BITCNT_4_IS_11110xxx_HAS_3_SUCCESSORS: return 3;
    }
    return 0;
}

__BOOL ExpectUTF8SuccessorCharsOrReturnFalse(const char **Str, int NumberOfCharsToExpect) {
    while (NumberOfCharsToExpect--) {
        if (CountMS1BitSequenceAndForward(Str) != MS1BITCNT_1_IS_10xxxxxx_IS_SUCCESSOR) {
            return __FALSE;
        }
    }
    return __TRUE;
}

__BOOL IsMS1BitSequenceCountAValidUTF8Starter(int Number) {
    switch (Number) {
    case MS1BITCNT_0_IS_0xxxxxxx_NO_SUCCESSOR:
    case MS1BITCNT_2_IS_110xxxxx_HAS_1_SUCCESSOR:
    case MS1BITCNT_3_IS_1110xxxx_HAS_2_SUCCESSORS:
    case MS1BITCNT_4_IS_11110xxx_HAS_3_SUCCESSORS:
        return __TRUE;
    }
    return __FALSE;
}

#define NO_FURTHER_CHECKS_REQUIRED_IT_IS_NOT_UTF8       (-1)
#define NOT_ALL_EXPECTED_SUCCESSORS_ARE_10xxxxxx        (-1)

int CountValidUTF8CharactersOrNegativeOnBadUTF8(const char *Str) {
    int NumberOfValidUTF8Sequences = 0;
    if (!Str || !Str[0]) { return 0; }
    while (*Str) {
        int MS1BitSeqCount = CountMS1BitSequenceAndForward(&amp;amp;Str);
        if (!IsMS1BitSequenceCountAValidUTF8Starter(MS1BitSeqCount)) {
            return NO_FURTHER_CHECKS_REQUIRED_IT_IS_NOT_UTF8;
        }
        if (!ExpectUTF8SuccessorCharsOrReturnFalse(&amp;amp;Str, MS1BitSequenceCount2SuccessorByteCount(MS1BitSeqCount))) {
            return NOT_ALL_EXPECTED_SUCCESSORS_ARE_10xxxxxx;
        }
        if (MS1BitSeqCount) { ++NumberOfValidUTF8Sequences; }
    }
    return NumberOfValidUTF8Sequences;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 테스트 케이스도 작성했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;static void TestUTF8CheckOrDie(const char *Str, int ExpectedResult) {
    int Result = CountValidUTF8CharactersOrNegativeOnBadUTF8(Str);
    if (Result != ExpectedResult) {
        printf(&quot;TEST FAILED: %s:%i: check on '%s' returned %i, but expected was %i\n&quot;, __FILE__, __LINE__, Str, Result, ExpectedResult);
        exit(1);
    }
}

void SimpleUTF8TestCases(void) {
    TestUTF8CheckOrDie(&quot;abcd89234&quot;, 0);  // neither valid nor invalid UTF8 sequences
    TestUTF8CheckOrDie(&quot;&quot;, 0);           // neither valid nor invalid UTF8 sequences
    TestUTF8CheckOrDie(NULL, 0);
    TestUTF8CheckOrDie(&quot;asdföadkg&quot;, 1);  // contains one valid UTF8 character sequence
    TestUTF8CheckOrDie(&quot;asdföadäkg&quot;, 2); // contains two valid UTF8 character sequences
    TestUTF8CheckOrDie(&quot;asdf\xF8&quot; &quot;adäkg&quot;, -1); // contains at least one invalid UTF8 sequence
}
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 프로그램은 stdin에서 utf-8 문자열(ascii, 유로 등의 비 아스키 문자)을 읽습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 라인은 func_find_utf8로 전달됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;utf-8 문자는 멀티바이트 문자이므로 함수 func_find_utf8은 문자가 asci인지 non-ascii인지를 찾기 위해 문자 비트를 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자가 ASCII가 아닌 경우 바이트의 너비를 알고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;바이트의 너비를 전달하고 print_non_ascii 기능을 하도록 배치합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

#include&amp;lt;string.h&amp;gt;

/* UTF-8 : BYTE_BITS*/

/* B0_BYTE : 0XXXXXXX */

/* B1_BYTE : 10XXXXXX */

/* B2_BYTE : 110XXXXX */

/* B3_BYTE : 1110XXXX */

/* B4_BYTE : 11110XXX */

/* B5_BYTE : 111110XX */

/* B6_BYTE : 1111110X */

#define B0_BYTE 0x00

#define B1_BYTE 0x80

#define B2_BYTE 0xC0

#define B3_BYTE 0xE0

#define B4_BYTE 0xF0

#define B5_BYTE 0xF8

#define B6_BYTE 0xFC

#define B7_BYTE 0xFE

/* Please tune this as per number of lines input */

#define MAX_UTF8_STR 10

/* 600 is used because 6byteX100chars */

#define MAX_UTF8_CHR 600

void func_find_utf8 (char *ptr_to_str);

void print_non_ascii (int bytes, char *pbyte);

char strbuf[MAX_UTF8_STR][MAX_UTF8_CHR];

int
main (int ac, char *av[])
{

  int i = 0;

  char no_newln_str[MAX_UTF8_CHR];

  i = 0;

  printf (&quot;\n\nYou can enter utf-8 string or Q/q to QUIT\n\n&quot;);

  while (i &amp;lt; MAX_UTF8_STR)
    {

      fgets (strbuf[i], MAX_UTF8_CHR, stdin);

      if (!strlen (strbuf[i]))
    break;

      if ((strbuf[i][0] == 'Q') || (strbuf[i][0] == 'q'))
    break;

      strcpy (no_newln_str, strbuf[i]);

      no_newln_str[strlen (no_newln_str) - 1] = 0;

      func_find_utf8 (no_newln_str);

      ++i;

    }

  return 1;

}

void
func_find_utf8 (char *ptr_to_str)
{

  int found_non_ascii;

  char *pbyte;

  pbyte = ptr_to_str;

  found_non_ascii = 0;

  while (*pbyte)
    {

      if ((*pbyte &amp;amp; B1_BYTE) == B0_BYTE)
    {

      pbyte++;

      continue;

    }

      else
    {

      found_non_ascii = 1;

      if ((*pbyte &amp;amp; B7_BYTE) == B6_BYTE)
        {

          print_non_ascii (6, pbyte);

          pbyte += 6;

          continue;

        }

      if ((*pbyte &amp;amp; B6_BYTE) == B5_BYTE)
        {

          print_non_ascii (5, pbyte);

          pbyte += 5;

          continue;

        }

      if ((*pbyte &amp;amp; B5_BYTE) == B4_BYTE)
        {

          print_non_ascii (4, pbyte);

          pbyte += 4;

          continue;

        }

      if ((*pbyte &amp;amp; B4_BYTE) == B3_BYTE)
        {

          print_non_ascii (3, pbyte);

          pbyte += 3;

          continue;

        }

      if ((*pbyte &amp;amp; B3_BYTE) == B2_BYTE)
        {

          print_non_ascii (2, pbyte);

          pbyte += 2;

          continue;

        }

    }

    }

  if (found_non_ascii)
    printf (&quot; These are Non Ascci chars\n&quot;);

}

void
print_non_ascii (int bytes, char *pbyte)
{

  char store[6];

  int i;

  memset (store, 0, 6);

  memcpy (store, pbyte, bytes);

  i = 0;

  while (i &amp;lt; bytes)
    printf (&quot;%c&quot;, store[i++]);

  printf (&quot;%c&quot;, ' ');

  fflush (stdout);

}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1031645/how-to-detect-utf-8-in-plain-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/642</guid>
      <comments>https://yellowcard.tistory.com/642#entry642comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:51:43 +0900</pubDate>
    </item>
    <item>
      <title>플록 (): 레이스 조건 없이 잠긴 파일 제거?</title>
      <link>https://yellowcard.tistory.com/641</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플록 (): 레이스 조건 없이 잠긴 파일 제거?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;flock()을 사용하여 mutexes라는 이름의 프로세스 간에 잠금을 설정합니다(즉, 일부 프로세스는 some_name이라는 이름의 파일을 임시 디렉토리에 잠그는 방식으로 구현됩니다).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;lockfile = &quot;/tmp/some_name.lock&quot;;
fd = open(lockfile, O_CREAT);
flock(fd, LOCK_EX);

do_something();

unlink(lockfile);
flock(fd, LOCK_UN);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;임시 디렉터리가 수백 개의 파일로 채워지지 않도록 잠금 파일은 어느 시점에서 제거해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 이 코드에는 분명한 레이스 조건이 있습니다. 프로세스 A, B 및 C의 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;A opens file
A locks file
B opens file
A unlinks file
A unlocks file
B locks file (B holds a lock on the deleted file)
C opens file (a new file one is created)
C locks file (two processes hold the same named mutex !)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 레이스 조건을 도입하지 않고 어느 시점에서 잠금 파일을 제거할 수 있는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문에 답하면 죄송합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일을 잠근 후 다른 복사본을 열고 fstat 두 복사본을 모두 열고 다음과 같이 inode 번호를 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;lockfile = &quot;/tmp/some_name.lock&quot;;

    while(1) {
        fd = open(lockfile, O_CREAT);
        flock(fd, LOCK_EX);

        fstat(fd, &amp;amp;st0);
        stat(lockfile, &amp;amp;st1);
        if(st0.st_ino == st1.st_ino) break;

        close(fd);
    }

    do_something();

    unlink(lockfile);
    flock(fd, LOCK_UN);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 프로그램이 파일 시스템에 남아 있는 파일에 대한 잠금을 유지할 경우 남은 파일이 있는 다른 모든 프로그램의 아이노드 번호가 잘못 표시되기 때문에 경쟁 상태를 방지할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 실제로 다음과 같은 속성을 사용하여 상태 기계 모델에서 증명했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;P_i에 파일 시스템에 디스크립터가 잠겨 있으면 다른 프로세스는 중요 섹션에 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;P_i가 오른쪽 inode를 가진 stat 뒤에 있거나 critical 섹션에 있는 경우 파일 시스템에서 디스크립터가 잠겨 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유닉스에서는 파일이 열리는 동안 파일을 삭제할 수 있습니다. 파일 설명자 목록에 있는 모든 프로세스가 끝날 때까지 해당 노드는 유지됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유닉스에서는 링크 수가 0이 되면 모든 디렉터리에서 파일이 제거되었는지 확인할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 이전/새 파일 경로의 ino-value를 비교하는 대신 이미 열려 있는 파일의 nlink count를 확인하기만 하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 파일은 단순한 임시 잠금 파일일 뿐 실제 뮤텍스 리소스나 장치가 아니라고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;lockfile = &quot;/tmp/some_name.lock&quot;;

for(int attempt; attempt &amp;lt; timeout; ++attempt) {
    int fd = open(lockfile, O_CREAT, 0444);
    int done = flock(fd, LOCK_EX | LOCK_NB);
    if (done != 0) { 
        close(fd);
        sleep(1);     // lock held by another proc
        continue;
    }
    struct stat st0;
    fstat(fd, &amp;amp;st0);
    if(st0.st_nlink == 0) {
       close(fd);     // lockfile deleted, create a new one
       continue;
    }
    do_something();
    unlink(lockfile); // nlink :=0 before releasing the lock
    flock(fd, LOCK_UN);
    close(fd);        // release the ino if no other proc 
    return true;
}
return false;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 이 파일들을 잠금에만 사용하고 실제로 그것들에 쓰지 않는다면, 나는 당신이 디렉토리 엔트리의 존재 자체를 보류된 잠금에 대한 표시로 취급하고, 아예 사용하지 말 것을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위해서는 디렉토리 항목을 생성하고 오류가 이미 존재하는 경우 오류를 보고하는 작업을 구성해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Linux 및 대부분의 &lt;em papago-id=&quot;15-1&quot;&gt;파일&lt;/em&gt; 시스템에서 전달&lt;/font&gt;&lt;/font&gt;&lt;code&gt;O_EXCL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 위해 일할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 일부 플랫폼 및 일부 파일 시스템(특히 오래된 NFS)에서는 이를 지원하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://linux.die.net/man/2/open&quot; papago-id=&quot;16-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;따라서 man 페이지&lt;/a&gt;는 다음과 같은 대안을 제시합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠금 파일을 사용하여 원자 파일 잠금을 수행하고 NFS 지원에 의존하지 않아야 하는 휴대용 프로그램&lt;/font&gt;&lt;/font&gt;&lt;code&gt;O_EXCL&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 는 동일한 파일 시스템에 고유한 파일(예: 호스트 이름과 PID 통합)을 생성하고 (2)를 사용하여 잠금 파일에 대한 링크를 만들 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(2)가 0을 반환하면 잠금이 성공한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 고유 파일에서 (2)를 사용하여 링크 수가 2로 증가했는지 확인합니다. 이 경우 잠금도 성공적입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 이것은 공식적으로 문서화된 잠금 체계처럼 보이며 따라서 일정 수준의 지원과 모범 사례 제안을 나타냅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 저는 다른 접근법들도 보았습니다. 예를 들어, &lt;a href=&quot;http://bazaar.canonical.com/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-1&quot;&gt;대부분&lt;/a&gt;의 장소에서 symlink 대신 디렉토리를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/view/6499.3.7/bzrlib/lockdir.py#L17&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-3&quot;&gt;소스 코드&lt;/a&gt;에서 인용:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠금은 디스크에서 정보 파일을 포함하는 특정 이름의 디렉토리로 표시됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠금은 임시 디렉토리의 이름을 제자리로 변경하여 수행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;알려진 모든 전송 및 파일 시스템에 대해 한 번만 잠금을 요청해도 성공하고 다른 한 번만 실패할 것으로 생각하기 때문에 임시 디렉토리를 사용합니다. (일부 파일 시스템 또는 전송에는 이름 변경 및 덮어쓰기 기능만 있어 누가 이겼는지 구분하기 어렵기 때문에 파일에서는 사용할 수 없습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 접근 방식의 한 가지 단점은 차단하지 않는다는 것입니다. 잠금 시도에 실패하면 오류가 발생하지만 잠금을 사용할 수 있을 때까지 기다리지 않는다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;잠금을 폴링해야 하므로 잠금 경합으로 문제가 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 파일 시스템 기반 접근 방식에서 벗어나 타사 구현 방식을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 ipc mutex를 어떻게 하는지에 대한 일반적인 질문은 이미 물었으므로, 특히 &lt;a href=&quot;https://stackoverflow.com/questions/tagged/ipc+mutex?sort=votes&quot; papago-id=&quot;21-1&quot;&gt;이번&lt;/a&gt; 것은 &lt;a href=&quot;https://stackoverflow.com/q/2681023/1468366&quot; papago-id=&quot;21-3&quot;&gt;결과물&lt;/a&gt;을 검색해서 보는 것을 제안합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런데, 이 태그들은 당신의 게시물에도 유용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17708885/flock-removing-locked-file-without-race-condition&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/641</guid>
      <comments>https://yellowcard.tistory.com/641#entry641comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:51:26 +0900</pubDate>
    </item>
    <item>
      <title>부트스트랩과 함께 필드셋 범례 사용</title>
      <link>https://yellowcard.tistory.com/640</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩과 함께 필드셋 범례 사용&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 부츠트랩을 사용하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JSP&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 제 폼을 위해 사용하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이건 내 암호입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;fieldset class=&quot;scheduler-border&quot;&amp;gt;
    &amp;lt;legend class=&quot;scheduler-border&quot;&amp;gt;Start Time&amp;lt;/legend&amp;gt;
    &amp;lt;div class=&quot;control-group&quot;&amp;gt;
        &amp;lt;label class=&quot;control-label input-label&quot; for=&quot;startTime&quot;&amp;gt;Start :&amp;lt;/label&amp;gt;
        &amp;lt;div class=&quot;controls bootstrap-timepicker&quot;&amp;gt;
            &amp;lt;input type=&quot;text&quot; class=&quot;datetime&quot; id=&quot;startTime&quot; name=&quot;startTime&quot; placeholder=&quot;Start Time&quot; /&amp;gt;
            &amp;lt;i class=&quot;icon-time&quot;&amp;gt;&amp;lt;/i&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS는&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;fieldset.scheduler-border {
    border: 1px groove #ddd !important;
    padding: 0 1.4em 1.4em 1.4em !important;
    margin: 0 0 1.5em 0 !important;
    -webkit-box-shadow:  0px 0px 0px 0px #000;
            box-shadow:  0px 0px 0px 0px #000;
}

legend.scheduler-border {
    font-size: 1.2em !important;
    font-weight: bold !important;
    text-align: left !important;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 출력됩니다.&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/cTTgq.jpg&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 방법으로 출력을 원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/Kh9xq.jpg&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가를 해봤습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;border:none;
width:100px;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;legend.scheduler-border&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS에서&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 예상 생산량을 얻고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 문제는 다른 분야에 대해 추가하고 싶다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;범례의 텍스트 폭이 다음보다 길기 때문에 문제가 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;100px&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제가 언급한 것처럼 출력을 얻으려면 어떻게 해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(전설 텍스트를 누르지 않음)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 부트스트랩이 기본적으로 시스템의 너비를 설정하기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;legend&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원소를 100%까지&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 당신의 것을 바꿈으로써 이 문제를 해결할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;legend.scheduler-border&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 방법:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-css prettyprint-override&quot;&gt;&lt;code&gt;legend.scheduler-border {
    width:inherit; /* Or auto */
    padding:0 10px; /* To give a bit of padding on the left and right */
    border-bottom:none;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS &lt;a href=&quot;http://jsfiddle.net/JamesD/PgA84/1&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15-0&quot;&gt;&lt;strong papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;피들  fid&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩이 스타일을 재정의하는 것을 방지하기 위해 부트스트랩 &lt;em papago-id=&quot;16-1&quot;&gt;후&lt;/em&gt; 사용자 지정 스타일시트가 추가되는지 확인해야 합니다. 하지만 여기서 사용하는 스타일은 보다 구체적이어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추가할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;margin-bottom:0;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전설과 분할자 사이의 간격을 줄이기 위해서도 말입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩 4에서는 필드 세트에 범례와 혼합되는 테두리를 갖는 것이 훨씬 쉽습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 달성하기 위해 맞춤형 CSS가 필요하지 않으며, 다음과 같이 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;fieldset class=&quot;border p-2&quot;&amp;gt;
   &amp;lt;legend  class=&quot;w-auto&quot;&amp;gt;Your Legend&amp;lt;/legend&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 보입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩 5에서 범례에 적용된 기본 스타일을 &lt;a href=&quot;https://github.com/twbs/bootstrap/issues/32548#issuecomment-767653924&quot; papago-id=&quot;21-1&quot; rel=&quot;noreferrer&quot;&gt;수정&lt;/a&gt;하면 &lt;a href=&quot;https://stackoverflow.com/a/50487490/13478534&quot; papago-id=&quot;21-3&quot;&gt;부트스트랩 4&lt;/a&gt;에서 얻은 것과 다른 렌더링이 생성됩니다. 그런 다음 추가해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;float-none&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 부류로서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;legend&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;태그:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;fieldset class=&quot;border p-2&quot;&amp;gt;
   &amp;lt;legend  class=&quot;float-none w-auto&quot;&amp;gt;Your Legend&amp;lt;/legend&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;/&amp;gt;
&amp;lt;form&amp;gt;
&amp;lt;fieldset class=&quot;border p-2&quot;&amp;gt;
   &amp;lt;legend  class=&quot;float-none w-auto p-2&quot;&amp;gt;Your Legend&amp;lt;/legend&amp;gt;
   &amp;lt;input type=&quot;text&quot;&amp;gt;
&amp;lt;/fieldset&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;/questions/tagged/bootstrap&quot; class=&quot;post-tag&quot; title=&quot;'부트스트랩' 태그가 지정된 질문 표시&quot; rel=&quot;tag&quot; papago-id=&quot;24&quot; papago-translate=&quot;translated&quot; papago-attr-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부츠끈&lt;/font&gt;&lt;/a&gt; &lt;a href=&quot;/questions/tagged/html&quot; class=&quot;post-tag&quot; title=&quot;'html' 태그가 지정된 질문 표시&quot; rel=&quot;tag&quot; papago-id=&quot;25&quot; papago-translate=&quot;translated&quot; papago-attr-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;html&lt;/font&gt;&lt;/a&gt; &lt;a href=&quot;/questions/tagged/form&quot; class=&quot;post-tag&quot; title=&quot;'양식' 태그가 붙은 질문 표시&quot; rel=&quot;tag&quot; papago-id=&quot;26&quot; papago-translate=&quot;translated&quot; papago-attr-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;형태&lt;/font&gt;&lt;/a&gt; &lt;a href=&quot;/questions/tagged/fieldset&quot; class=&quot;post-tag&quot; title=&quot;'필드 세트' 태그가 지정된 질문 표시&quot; rel=&quot;tag&quot; papago-id=&quot;27&quot; papago-translate=&quot;translated&quot; papago-attr-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필드 세트&lt;/font&gt;&lt;/a&gt; &lt;a href=&quot;/questions/tagged/legend&quot; class=&quot;post-tag&quot; title=&quot;'legend' 태그가 지정된 질문 표시&quot; rel=&quot;tag&quot; papago-id=&quot;28&quot; papago-translate=&quot;translated&quot; papago-attr-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전설을&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이런 문제가 있었고 이런 식으로 해결했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fieldset.scheduler-border {
    border: solid 1px #DDD !important;
    padding: 0 10px 10px 10px;
    border-bottom: none;
}

legend.scheduler-border {
    width: auto !important;
    border: none;
    font-size: 14px;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 다른 접근법을 사용했고, 부츠트랩 패널을 사용해서 좀 더 풍부한 모습을 보여주었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단지 누군가를 돕고 답을 개선하기 위해서입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.text-on-pannel {
  background: #fff none repeat scroll 0 0;
  height: auto;
  margin-left: 20px;
  padding: 3px 5px;
  position: absolute;
  margin-top: -47px;
  border: 1px solid #337ab7;
  border-radius: 8px;
}

.panel {
  /* for text on pannel */
  margin-top: 27px !important;
}

.panel-body {
  padding-top: 30px !important;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;link href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;div class=&quot;panel panel-primary&quot;&amp;gt;
    &amp;lt;div class=&quot;panel-body&quot;&amp;gt;
      &amp;lt;h3 class=&quot;text-on-pannel text-primary&quot;&amp;gt;&amp;lt;strong class=&quot;text-uppercase&quot;&amp;gt; Title &amp;lt;/strong&amp;gt;&amp;lt;/h3&amp;gt;
      &amp;lt;p&amp;gt; Your Code &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 아래를 보여줄 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고: 다른 헤더 사이즈를 사용하기 위해서는 스타일을 변경해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 모든 정답을 간단히 요약하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜냐하면 어떤 대답이 문제를 해결하고 어떤 일이 막후에서 일어나고 있는지 알아내기 위해 많은 시간을 들여야 했기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩과 함께 설정되는 필드에는 두 가지 문제가 있는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bootstrap&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폭을 다음으로 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;legend&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;100%로&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 그것이 그것의 상단 테두리를 덮는 이유입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fieldset&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뭐가 있어요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bottom border&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 위해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;legend&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 범례 너비를 다음과 같이 자동으로 설정하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;legend.scheduler-border {
   width: auto; // fixes the problem 1
   border-bottom: none; // fixes the problem 2
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;fieldset.scheduler-border {
  border: 1px groove #ddd !important;
  padding: 0 1.4em 1.4em 1.4em !important;
  margin: 0 0 1.5em 0 !important;
  -webkit-box-shadow: 0px 0px 0px 0px #000;
  box-shadow: 0px 0px 0px 0px #000;
  margin-top: 30px !important;
}

legend.scheduler-border {
  font-size: 1.2em !important;
  font-weight: bold !important;
  text-align: left !important;
  width: auto;
  padding: 0 10px;
  border-bottom: none;
  margin-top: -15px;
  background-color: white;
  color: black;
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;fieldset class=&quot;scheduler-border&quot;&amp;gt;
        &amp;lt;legend class=&quot;scheduler-border&quot;&amp;gt;Technical Ameen&amp;lt;/legend&amp;gt;
        &amp;lt;h2&amp;gt;Your Work Here&amp;lt;/h2&amp;gt;
    &amp;lt;/fieldset&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩 5에서 범례 태그를 사용하기 위한 적절한 해결책을 찾지 못할 경우&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범례 태그에서 대체 솔루션을 위해 CSS 속성을 사용할 수 있습니다. 이것은 인라인 CSS 예입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;style=&quot;margin-top:-15px; background-color: white; color: black;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 이 선을 여백 상단에 대한 필드 세트 태그에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; style=&quot;margin-top: 30px !important;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/bGmCr.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/bGmCr.jpg&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩 5로 레전드 스타일을 얻는 아주 간단한 솔루션이면 좋겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;fieldset  class=&quot;border p-2 form-group&quot;&amp;gt;
   &amp;lt;legend class=&quot;control-label customer-legend pl-1&quot;&amp;gt;Your Legend&amp;lt;/legend&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.customer-legend:before {
    left: 100px;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/16852484/use-fieldset-legend-with-bootstrap&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>CSS</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/640</guid>
      <comments>https://yellowcard.tistory.com/640#entry640comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:51:18 +0900</pubDate>
    </item>
    <item>
      <title>Python git 저장소를 복제하는 방법</title>
      <link>https://yellowcard.tistory.com/639</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Python git 저장소를 복제하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하위 프로세스를 사용하지 않고 git 저장소를 복제하는 파이썬 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 당신이 추천하는 어떤 종류의 모듈을 사용해도 좋습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/gitpython-developers/GitPython&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-1&quot;&gt;GitPython&lt;/a&gt;을 사용하면 Git에 대한 좋은 python 인터페이스를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 설치 후 (&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pip install gitpython&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;), 새 저장소를 복제하는 경우 &lt;a href=&quot;https://gitpython.readthedocs.io/en/stable/reference.html#git.repo.base.Repo.clone_from&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;clone_from&lt;/a&gt; 함수를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from git import Repo

Repo.clone_from(git_url, repo_dir)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Repo 개체 사용에 대한 예는 &lt;a href=&quot;https://gitpython.readthedocs.io/en/stable/tutorial.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;GitPython 자습서&lt;/a&gt;를 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;6-0&quot;&gt;참고:&lt;/strong&gt; GitPython은 git를 시스템에 설치하고 시스템의 PATH를 통해 액세스할 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://gitpython.readthedocs.io/en/stable/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;GitPython&lt;/a&gt;이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이전에는 들어본 적이 없고 내부적으로도 git 실행 파일을 어딘가에 두는 것에 의존합니다. 게다가 버그가 많을 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 시도해 볼 가치가 있을 겁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://gitpython.readthedocs.io/en/stable/reference.html#git.repo.base.Repo.clone&quot; rel=&quot;noreferrer&quot; papago-id=&quot;8-1&quot;&gt;복제&lt;/a&gt;하는 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import git
git.Git(&quot;/your/directory/to/clone&quot;).clone(&quot;git://gitorious.org/git-python/mainline.git&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(좋지도 않고 지원되는 방법인지 모르겠지만 효과가 있었습니다.)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 해결책은 매우 간단하고 간단합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;암호를 수동으로 입력할 필요도 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 전체 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import sys
import os

path  = &quot;/path/to/store/your/cloned/project&quot; 
clone = &quot;git clone gitolite@&amp;lt;server_ip&amp;gt;:/your/project/name.git&quot; 

os.system(&quot;sshpass -p your_password ssh user_name@your_localhost&quot;)
os.chdir(path) # Specifying the path where the cloned project needs to be copied
os.system(clone) # Cloning
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이썬 3의 경우&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 설치 모듈:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;pip3 install gitpython
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 나중에 코딩해보세요 :)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from git.repo.base import Repo
Repo.clone_from(&quot;https://github.com/*****&quot;, &quot;folderToSave&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 당신에게 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 &lt;a href=&quot;https://github.com/gitpython-developers/GitPython&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16-1&quot;&gt;GitPython&lt;/a&gt;으로 레포를 복제하는 동안 진행 상황을 인쇄하는 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import time
import git
from git import RemoteProgress

class CloneProgress(RemoteProgress):
    def update(self, op_code, cur_count, max_count=None, message=''):
        if message:
            print(message)

print('Cloning into %s' % git_root)
git.Repo.clone_from('https://github.com/your-repo', '/your/repo/dir', 
        branch='master', progress=CloneProgress())
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Github의 &lt;a href=&quot;https://libgit2.github.com/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17-1&quot;&gt;libgit2&lt;/a&gt; 바인딩인 &lt;a href=&quot;http://www.pygit2.org/repository.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17-3&quot;&gt;pygit2&lt;/a&gt;는 원격 디렉토리를 복제하는 원-라이너를 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;clone_repository(url, path, 
    bare=False, repository=None, remote=None, checkout_branch=None, callbacks=None)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://pypi.org/project/dload/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;18-1&quot;&gt;dload&lt;/a&gt;를 이용하실 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import dload
dload.git_clone(&quot;https://github.com/some_repo.git&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;pre&gt;&lt;code&gt;pip install dload
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Dulwich 팁을 사용하면 다음을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from dulwich.repo import Repo
Repo(&quot;/path/to/source&quot;).clone(&quot;/path/to/target&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 여전히 매우 기본적입니다. 객체와 참조를 복사하지만, 베어가 없는 저장소를 만들 경우 아직 작업 트리의 내용을 만들지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;꽤 간단한 방법은 URL의 크레딧을 전달하는 것입니다. 하지만 약간 의심스러울 수 있습니다. 주의해서 사용하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import os

def getRepo(repo_url, login_object):
  '''
  Clones the passed repo to my staging dir
  '''

  path_append = r&quot;stage\repo&quot; # Can set this as an arg 
  os.chdir(path_append)

  repo_moddedURL = 'https://' + login_object['username'] + ':' + login_object['password'] + '@github.com/UserName/RepoName.git'
  os.system('git clone '+ repo_moddedURL)

  print('Cloned!')


if __name__ == '__main__':
    getRepo('https://github.com/UserName/RepoYouWant.git', {'username': 'userName', 'password': 'passWord'})
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;gitpython 모듈을 이용한 gitpull과 gitpush의 샘플 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import os.path
from git import *
import git, os, shutil
# create local Repo/Folder
UPLOAD_FOLDER = &quot;LocalPath/Folder&quot;
if not os.path.exists(UPLOAD_FOLDER):
  os.makedirs(UPLOAD_FOLDER)
  print(UPLOAD_FOLDER)
new_path = os.path.join(UPLOADFOLDER)
DIR_NAME = new_path
REMOTE_URL = &quot;GitURL&quot;  # if you already connected with server you dont need to give 
any credential
# REMOTE_URL looks &quot;git@github.com:path of Repo&quot;
# code for clone
class git_operation_clone():
  try:
    def __init__(self):
        self.DIR_NAME = DIR_NAME
        self.REMOTE_URL = REMOTE_URL

    def git_clone(self):

        if os.path.isdir(DIR_NAME):
            shutil.rmtree(DIR_NAME)
        os.mkdir(DIR_NAME)
        repo = git.Repo.init(DIR_NAME)
        origin = repo.create_remote('origin', REMOTE_URL)
        origin.fetch()
        origin.pull(origin.refs[0].remote_head)
  except Exception as e:
      print(str(e))
# code for push
class git_operation_push():
  def git_push_file(self):
    try:
        repo = Repo(DIR_NAME)
        commit_message = 'work in progress'
        # repo.index.add(u=True)
        repo.git.add('--all')
        repo.index.commit(commit_message)
        origin = repo.remote('origin')
        origin.push('master')
        repo.git.add(update=True)
        print(&quot;repo push succesfully&quot;)
    except Exception as e:
        print(str(e))
if __name__ == '__main__':
   a = git_operation_push()
   git_operation_push.git_push_file('')
   git_operation_clone()
   git_operation_clone.git_clone('')
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;창에서 레포를 복제하는 가장 쉬운 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;pip 설치 클론&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클론 [REPO] [USERNAME]&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예: 클론 와이파이 브루트 사이버 다이옥사이드&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;셸 명령을 통해 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;os.system(&quot;pip install clone&quot;) os.system(&quot;clone SSH-Brute Cyber-Dioxide&quot;) 가져오기&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브러리 없이 간단한 솔루션을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/usr/bin/python
import os

destination_path  = &quot;destination/path/where/project/to/be/cloned&quot;
clone_command = &quot;git clone https://your.git.servername/git-folder/repo-name.git&quot; 

clone_with_path = clone_command  +&quot; &quot;+ destination_path
os.system(clone_with_path)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;30-0&quot;&gt;권한:&lt;/strong&gt; 대상 폴더가 없으면 대상 폴더를 만듭니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2472552/python-way-to-clone-a-git-repository&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Python</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/639</guid>
      <comments>https://yellowcard.tistory.com/639#entry639comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:51:09 +0900</pubDate>
    </item>
    <item>
      <title>자동 완료 시 트리거된 이벤트가 있습니까?</title>
      <link>https://yellowcard.tistory.com/638</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 완료 시 트리거된 이벤트가 있습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 폼이 아주 단순해요.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자가 입력 필드에 입력하면 페이지의 다른 곳에 입력한 내용을 업데이트합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 모든 것이 잘 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트를 에 묶었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;keyup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;change&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;click&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사건.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유일한 문제는 브라우저의 자동 완성 상자에서 입력을 선택하면 업데이트되지 않는다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 완료에서 선택할 때 트리거되는 이벤트가 있습니까(둘 다 아님).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;change&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도 아니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;click&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;autocomplete 박스에서 선택하고 입력 필드를 &lt;em papago-id=&quot;7-1&quot;&gt;흐리게&lt;/em&gt; 하면 업데이트가 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자동 완료가 되는 대로 작동이 되었으면 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조: http://jsfiddle.net/pYKKp/ (hopefully 과거에 &quot;이메일&quot;이라는 이름의 입력으로 많은 양식을 작성했습니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input name=&quot;email&quot; /&amp;gt; 
&amp;lt;div id=&quot;whatever&quot;&amp;gt;&amp;amp;lt;whatever&amp;gt;&amp;lt;/div&amp;gt; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3 papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;div { 
    float: right; 
} 
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3 papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트:&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;input&quot;).on('keyup change click', function () { 
   var v = $(this).val(); 
    if (v) { 
     $(&quot;#whatever&quot;).text(v);   
    }  
    else { 
        $(&quot;#whatever&quot;).text('&amp;lt;whatever&amp;gt;'); 
    } 
}); 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;를 사용하는 것을 추천합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;monitorEvents&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. &lt;a href=&quot;http://developer.apple.com/library/safari/#documentation/appleapplications/Conceptual/Safari_Developer_Guide/DebuggingYourWebsite/DebuggingYourWebsite.html&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;웹 인스펙터&lt;/a&gt;와 &lt;a href=&quot;http://getfirebug.com/wiki/index.php/Command_Line_API#monitorEvents.28object.5B.2C_types.5D.29&quot; papago-id=&quot;13-3&quot; rel=&quot;noreferrer&quot;&gt;파이어버그&lt;/a&gt;에서 자바스크립트 콘솔이 제공하는 기능으로 요소에서 생성되는 모든 이벤트를 출력합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 방법의 예는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;monitorEvents($(&quot;input&quot;)[0]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자의 경우 Firefox와 Opera 모두 사용자가 자동 완료 드롭다운에서 항목을 선택하면 이벤트가 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE7-8에서는 사용자가 포커스를 변경한 후 이벤트가 생성됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최신 크롬에서도 유사한 이벤트가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 브라우저 호환성 차트는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/input&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 멋진 해결책이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('html').bind('input', function() {
    alert('test');
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬과 파이어폭스로 테스트를 해봤는데 다른 브라우저에서도 가능할 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 많은 요소를 가진 이벤트를 많이 시도했지만 자동완료에서 선택할 때만 트리거됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가의 시간을 절약할 수 있기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/8548572/1032370&quot; papago-id=&quot;21-1&quot;&gt;Xavi&lt;/a&gt;가 설명한 것처럼 100% 크로스 브라우저를 사용할 수 있는 솔루션은 없기 때문에 이를 위해 스스로 트릭을 만들었습니다(계속하려면 5단계).&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;22-0&quot;&gt;1.몇&lt;/strong&gt; 가지 새로운 어레이가 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.timeouts     = new Array();
window.memo_values  = new Array();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;23-0&quot;&gt;2.&lt;/strong&gt;트리거할 입력 텍스트에 초점을 맞추면(&quot;이메일&quot;의 경우, 예를 들어 &quot;이름&quot;의 경우) jQuery(필요하지 않음)를 사용하여 Interval을 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery('#name').focus(function ()
{
    var id = jQuery(this).attr('id');
    window.timeouts[id] = setInterval('onChangeValue.call(document.getElementById(&quot;'+ id +'&quot;), doSomething)', 500);
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;24-0&quot;&gt;3.&lt;/strong&gt;블러에서 간격을 제거합니다. (항상 jQuery noted thought). 값이 변경되었는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;jQuery('#name').blur(function ()
{
    var id = jQuery(this).attr('id');
    onChangeValue.call(document.getElementById(id), doSomething);
    clearInterval(window.timeouts[id]);
    delete window.timeouts[id];
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;25-0&quot;&gt;4.&lt;/strong&gt;이제, 변화를 확인하는 주요 기능은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function onChangeValue(callback)
{
    if (window.memo_values[this.id] != this.value)
    {
        window.memo_values[this.id] = this.value;

        if (callback instanceof Function)
        {
            callback.call(this);
        }
        else
        {
            eval( callback );
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;26-0&quot;&gt;중요 참고:&lt;/strong&gt; 트리거된 입력 HTML 요소를 참조하여 위의 기능 안에 &quot;이것&quot;을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 함수가 작동하려면 ID를 지정해야 하며 함수를 전달하거나 함수 이름 또는 명령 문자열을 콜백으로 전달할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;27-0&quot;&gt;5.&lt;/strong&gt;마지막으로 자동 완성 드롭다운 목록에서 값을 선택한 경우에도 입력 값이 변경되면 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function doSomething()
{
    alert('got you! '+this.value);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;28-0&quot;&gt;중요한 참고:&lt;/strong&gt; 다시 위의 함수 안에서 트리거된 입력 HTML 요소를 참조하여 &quot;이것&quot;을 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업 중인 피들!!!&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;복잡하게 들리겠지만 그렇지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://jsfiddle.net/CNw3d/&quot; papago-id=&quot;31-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;작업용 피들&lt;/a&gt;을 준비했는데, 변경할 입력은 &quot;이름&quot;으로 명명되므로 온라인 형태로 이름을 입력하면 테스트할 브라우저의 자동 완성 드롭다운 목록이 있을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;blur&quot;를 추가합니다. 모든 브라우저에서 작동합니다!&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;input&quot;).on('blur keyup change click', function () {
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;strong papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery OR JAVASCRIPT로 폼 입력 시 자동 완료 탐지&lt;/font&gt;&lt;/strong&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;34-0&quot;&gt;사용방법:&lt;/strong&gt; 이벤트 &lt;strong papago-id=&quot;34-2&quot;&gt;입력&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(입력 또는 텍스트 영역) 값 제안을 선택하는 방법&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 JQuery의 경우:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(input).on('input', function() { 
alert(&quot;Number selected &quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;});&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 자바스크립트의 경우:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot;  onInput=&quot;affiche(document.getElementById('something').text)&quot; name=&quot;Somthing&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 시작은 abax 쿼리...&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유일하게 확실한 방법은 구간을 사용하는 것입니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루카의 대답은 제게 너무 복잡해서 누군가에게 도움이 되기를 바라는 저만의 짧은 버전을 만들었습니다. (아마도 미래의 저조차도)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    $input.on( 'focus', function(){
        var intervalDuration = 1000, // ms
            interval = setInterval( function(){

                // do your tests here
                // ..................

                // when element loses focus, we stop checking:
                if( ! $input.is( ':focus' ) ) clearInterval( interval );  

            }, intervalDuration );
    } );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome, Mozilla, 심지어 IE에서도 테스트를 받았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다음을 통해 깨달았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;monitorEvents&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;적어도 크롬에서는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;keyup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트가 자동 완료 &lt;strong papago-id=&quot;44-1&quot;&gt;전&lt;/strong&gt;에 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;input&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트. 정상적인 키보드 입력에서 시퀀스는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;keydown&lt;/code&gt; &lt;code&gt;input&lt;/code&gt; &lt;code&gt;keyup&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;46&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그래서 입력 &lt;strong papago-id=&quot;46-1&quot;&gt;후&lt;/strong&gt;에.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 한 일은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let myFun = ()=&amp;gt;{ ..do Something };

input.addEventListener('change', myFun );

//fallback in case change is not fired on autocomplete
let _k = null;
input.addEventListener( 'keydown', (e)=&amp;gt;_k=e.type );
input.addEventListener( 'keyup', (e)=&amp;gt;_k=e.type );
input.addEventListener( 'input', (e)=&amp;gt;{ if(_k === 'keyup') myFun();})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 브라우저로 확인해야 하지만 간격이 없는 방법일 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 위한 이벤트는 필요하지 않다고 생각합니다. @xavi의 답변에서 알 수 있듯이 이에 대한 브라우저 전체 지원은 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본값의 변경 사항이 있는지 필드를 한 번 확인하는 기능을 로드한 후에 추가하거나, 특정 값을 다른 곳에 복사하는 것만으로 초기화가 제대로 되었는지 확인하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8548533/any-event-triggered-on-autocomplete&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/638</guid>
      <comments>https://yellowcard.tistory.com/638#entry638comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:51:00 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell에서 명명된 매개 변수를 [ref]로 정의하는 방법</title>
      <link>https://yellowcard.tistory.com/637</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PowerShell에서 명명된 매개 변수를 [ref]로 정의하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하려고 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[ref]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름이 지정된 매개 변수.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;workflow Test
{
    Param([Parameter(Mandatory=$true)][String][ref]$someString)

    write-verbose $someString -Verbose
    $someString = &quot;this is the new string&quot;
}

cls
$someString = &quot;hi&quot;
Test -someString [ref]$someString
write-host $someString

#Error: Cannot process argument transformation on parameter 'someString'. Reference type is expected in argument.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[ref] 매개 변수 예제에서 &quot;workflow&quot;를 사용하고 있음을 확인했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순화를 위해 &quot;기능&quot;이라고 부르고 나중에 &quot;워크플로우&quot;로 돌아가도록 합시다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 변경해야 할 세 가지 사항이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[ref] 매개변수를 함수로 전달할 때 매개변수를 괄호 안에 넣어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 내에서 [ref] 파라미터를 사용할 경우 $variable.value를 참조합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매개 변수 정의에서 [string] type을 제거합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;[string], [ref]일 수 있지만 둘 다는 아닙니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작동하는 코드는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function Test
{
    Param([Parameter(Mandatory=$true)][ref]$someString)

    write-verbose $someString.value -Verbose
    $someString.value = &quot;this is the new string&quot;
}
cls
$someString = &quot;hi&quot;
Test -someString ([ref]$someString)
write-host $someString
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;워크플로우&quot;에 관해서는.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/02/powershell-workflows-restrictions.aspx&quot; papago-id=&quot;11-1&quot; rel=&quot;noreferrer&quot;&gt;PowerShell Workflow&lt;/a&gt;는 매우 제한적입니다&lt;a href=&quot;http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/02/powershell-workflows-restrictions.aspx&quot; papago-id=&quot;11-1&quot; rel=&quot;noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/02/powershell-workflows-restrictions.aspx&quot; papago-id=&quot;11-1&quot; rel=&quot;noreferrer&quot;&gt; 제한사항&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;특히 워크플로우 내의 개체에서는 메서드를 호출할 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 선이 끊어집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$someString.value = &quot;this is the new string&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워크플로우에서 [ref] 매개변수를 사용하는 것은 워크플로우 제한 때문에 실용적이지 않다고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파워셸 함수에서 참조 매개변수 사용에 대한 정보를 검색할 때 첫 구글 히트작이었기 때문에 저는 이 보완적인 매우 단순한 답변을 작성해야 한다고 느꼈습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수가 아닌 워크플로우에 대한 질문이었지만:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수에서 참조 매개변수 사용 예제(워크플로우와 함께 작동하지 않음):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Function myFunction ([ref]$aString) {
    $aString.Value = &quot;newValue&quot;;
}
$localVariable = &quot;oldValue&quot;
Write-Host $localVariable # Outputs: oldValue
myFunction ([ref]$localVariable);
Write-Host $localVariable # Outputs: newValue
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수를 사용하면 매개 변수를 다음과 같이 참조 및 다른 유형으로 정의할 수 있습니다(워크플로우에서는 정의할 수 없음).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Function myFunction ([ref][string]$aString) {
    $aString.Value = &quot;newValue&quot;;
}
$localVariable = &quot;oldValue&quot;
Write-Host $localVariable # Outputs: oldValue
myFunction ([ref]$localVariable);
Write-Host $localVariable # Outputs: newValue
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Jan의 의견에 동의합니다. 워크플로우 제한(객체에 대한 메서드 호출) 때문에 워크플로우에서 참조 매개 변수를 사용하려고 하면 안 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://blogs.technet.microsoft.com/heyscriptingguy/2013/01/02/powershell-workflows-restrictions/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;16-1&quot;&gt;https://blogs.technet.microsoft.com/heyscriptingguy/2013/01/02/powershell-workflows-restrictions/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/29596634/how-to-define-named-parameter-as-ref-in-powershell&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>powershell</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/637</guid>
      <comments>https://yellowcard.tistory.com/637#entry637comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:50:52 +0900</pubDate>
    </item>
    <item>
      <title>editline/history.h 및 editline/readline.h를 찾을 수 없음/이미 설치된 개발자 도구로 컴파일하려고 할 때 macOS에서 작동함</title>
      <link>https://yellowcard.tistory.com/636</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;editline/history.h 및 editline/readline.h를 찾을 수 없음/이미 설치된 개발자 도구로 컴파일하려고 할 때 macOS에서 작동함&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 독자적인 LISP(http://www.buildyourownlisp.com/chapter4_interactive_prompt) 를 구축하기 위한 이 자습서를 작성하고 있는데, 어떤 이유에서인지 컴파일을 시도하면 다음과 같은 내용이 나옵니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REPL.c:4:10: fatal error: 'editline/readline.h' file not found
#include &amp;lt;editline/history.h&amp;gt;
^
1 error generated.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;macOS 개발자 도구를 설치했는데, brew는 readline이 설치되어 있고 brew install editline을 시도하면 어떻게 해야 할지 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 내 암호입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  1 #include &amp;lt;stdio.h&amp;gt;
  2 #include &amp;lt;stdlib.h&amp;gt;
  3 #include &amp;lt;editline/readline.h&amp;gt;
  4 #include &amp;lt;editline/history.h&amp;gt;
  5 
  6 int main(int argc, char** argv) {
  7      
  8   /* version/exit info */
  9   puts(&quot;Edward Version 0.0.1&quot;);
 10   puts(&quot;Press Ctrl+c to Exit\n&quot;);
 11          
 12   /* endless loop for main REPL */
 13   while (1) { 
 14     /* output prompt and read line */
 15     char* input = readline(&quot;lispy&amp;gt; &quot;);
 16                   
 17     /* put input in history  */
 18     add_history(input);
 19                       
 20     /* Echo input back */                          
 21     printf(&quot;No you're a %s\n&quot;, input);
 22                       
 23     /* free input */
 24     free(input);
 25   }                           
 26   return 0;
 27 } 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;분명 아주 기본적인 일이지만, 이 프로젝트를 꼭 진행하고 싶어서 해결할 수 있었으면 좋겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 제가 컴파일할 때 사용하는 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cc -std=c99 -Wall REPL.c -ledit -o REPL
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포함만&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;editline/readline.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령줄 도구가 설치된 경우 이 도구가 존재해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 파일에는 히스토리 기능을 포함하여 libedit을 위한 &quot;readline wrapper&quot;가 포함되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;포함파일&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;editline/history.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OS X에 존재하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 수정으로 당신의 코드를 테스트해보니 문제없이 컴파일되어 실행되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OSX 요세미티 사용.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제거했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include&amp;lt;editline/history.h&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용후&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cc -std=c99 -Wall test.c -ledit -o test&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금은 잘 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;난 엘 캐피탄에 있어, 제거&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &amp;lt;editline/history.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cc -std=c99 -Wall test.c -ledit -o test&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저한테는 통합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플래그 추가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-ledit&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력 플래드 이전에, 그것은 연결 과정이고, 컴파일러가 당신의 프로그램에 편집 라인에 직접 호출을 내장할 수 있게 해줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 아래와 같은 오류 메시지가 나타납니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Undefined symbols for architecture x86_64:
  &quot;_add_history&quot;, referenced from:
      _main in prompt-086f90.o
  &quot;_readline&quot;, referenced from:
      _main in prompt-086f90.o
ld: symbol(s) not found for architecture x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우분투 14.04에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;sudo apt-get install libeditline-dev&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 포함합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;#include &amp;lt;editline.h&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최종적으로 다음과 같이 컴파일합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-leditline&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기중에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되었으면 좋겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OSX 매버릭스를 사용하고 있는데 라인을 제거하는 것이 효과적이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;editline/history.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;FreeBSD에서 다음을 수행하는 솔루션(다른 Unice에서도 작동할 수 있음):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

#include &amp;lt;readline/readline.h&amp;gt;
#include &amp;lt;readline/history.h&amp;gt;

...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 실행:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ cc test.c -Wall -std=c99 -lreadline -o test
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 단계에서 &quot;-readline&quot;이 없으면 링크되지 않으며 &quot;readline&quot; 함수에 대한 정의되지 않은 참조에 대한 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;28-1&quot;&gt;나&lt;/em&gt;는 당신만의 &lt;em papago-id=&quot;28-1&quot;&gt;목록&lt;/em&gt;을 만들기로 시작했고 같은 문제에 부딪쳤습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 어떤 답변도 저에게 통하지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;약간의 연구 끝에 저는 macOs에 읽기 라인 기능을 제공하는 gnu 읽기 라인 라이브러리가 없다는 것을 알게 되었습니다. 다른 버전의 macOs는 편집 라인이라는 라이브러리를 사용하여 읽기 라인의 에뮬레이션을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시작은...&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;man editline&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;#include &amp;lt;histedit.h&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네, 편집 라인은 라인 입력과 이력에 대한 몇 가지 구조를 제공하고 그 구조에 대한 기능을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 이러한 구조를 인스턴스화해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집 라인에 대한 설명서에는 예제가 없기 때문에 그다지 도움이 되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플사는 헤더 파일을 사용할 수 있도록 하여 조금이나마 도움이 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.opensource.apple.com/source/libedit/libedit-13/src/histedit.h&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;29-1&quot;&gt;http://www.opensource.apple.com/source/libedit/libedit-13/src/histedit.h&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 이것이 처음이고 여전히 나에게 꽤 혼란스러웠습니다. 데비안 패키지로 사용할 수 있는 소스 코드의 일부 버전이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다행히 나보다 현명한 사람이 이미 그것을 파고들어 lbedit을 사용하여 명령 줄을 구현했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.cs.utah.edu/ ~&lt;a href=&quot;https://www.cs.utah.edu/~bigler/code/libedit.html&quot; papago-id=&quot;30-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;bigler/code/lived&lt;/a&gt; it.&lt;a href=&quot;https://www.cs.utah.edu/~bigler/code/libedit.html&quot; papago-id=&quot;30-1&quot; rel=&quot;nofollow noreferrer&quot;&gt; &lt;/a&gt;html.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;비글러 씨의 코드와 &lt;em papago-id=&quot;30-3&quot;&gt;Build&lt;/em&gt; your &lt;em papago-id=&quot;30-3&quot;&gt;our own&lt;/em&gt; list에서 코드를 가져와서 이것을 얻기 위해 조합했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* repl-macos.c
 * Repl code example from builyourownlisp.com
 * Modified by NB aug 2017
 * Code example for editline from
 * www.cs.utah.edu/~bigler/code/libedit.html
 */

#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;histedit.h&amp;gt;

char* prompt(EditLine *e){
return &quot;lispy&amp;gt; &quot;;
}

int main(int argc, char** argv){

    EditLine *el; // Line editor state
    History *herstory; // the rest is history

    // Temp Variables   
    int count;
    const char *usrin;
    int keepreading = 1;
    HistEvent ev;

    // Initialize the editline state
    el = el_init(argv[0], stdin, stdout, stderr);
    el_set(el, EL_PROMPT, &amp;amp;prompt);
    el_set(el, EL_EDITOR, &quot;emacs&quot;);

    // Initialize history
    herstory = history_init();
    if(!herstory){
        fprintf(stderr, &quot;Couldn't initialize history\n&quot;);
        return 1;
    }

    //set history size
    history(herstory, &amp;amp;ev, H_SETSIZE, 800);
    // Set up the call back functions for history functionality
    el_set(el, EL_HIST, history, herstory);

    puts(&quot;Begin moLisp interpreter&quot;);
    puts(&quot;Type 'exit' at prompt to exit&quot;);

    while(keepreading){
        usrin = el_gets(el, &amp;amp;count);

    // add the command to the history, and echo it back to the user
        if(count &amp;gt; 0){
            history(herstory, &amp;amp;ev, H_ENTER, usrin);
            if(strcmp(usrin, &quot;exit\n&quot;))
                printf(&quot;No, You're a %s&quot;, usrin);
            else{
                puts(&quot;bye&quot;);
                --keepreading;
            }
        }   
    }

  // Clean up memory 
  // by freeing the memory pointed to within the structs that
  // libedit has created.
  history_end(herstory);
  el_end(el);


  return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의: 사용되는 구조물의 인스턴스화는 while loop 외부에서 발생하며, 구조물이 사용하는 메모리를 자유롭게 해주는 기능도 마찬가지입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 때문에 종료 명령을 추가했습니다. 그렇지 않으면 while loop을 종료할 수 있는 유일한 방법은 프로그램을 중단하는 것뿐이라면 메모리 누수가 있다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;gcc repl-macos.c -ledit -Wall -o repl-edit&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- 편집라인을 연결하기 위해 리드가 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련성이 있다면, 저는 macOs 10.4.11을 사용하고 있고 여기 제 컴파일러, 출력이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gcc --version&lt;/code&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;powerpc-apple-darwin8-gcc-4.0.0 (GCC) 4.0.0 20041026 (Apple Computer, Inc. 빌드 4061)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 책은 c-code가 휴대용이어야 한다는 것과 그렇지 않다는 것을 지적합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 단계는 리눅스에서 읽기 라인을 사용하고 macos에서 편집 라인을 사용하도록 전처리 지시문을 추가하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Debian Buster 10에서 패키지를 다음과 같이 설치해야 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt install libeditline-dev 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;editline/readline.h&amp;gt;
#include &amp;lt;editline/history.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방금 포함시켰습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;editline.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-리드 라인 플래그로 프로그램을 실행하고 완벽하게 작동했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우분투에 있는 경우 편집 라인 라이브러리 추가&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sudo apt-get install libtedit-dev&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/22886475/editline-history-h-and-editline-readline-h-not-found-working-on-macos-when-tryin&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/636</guid>
      <comments>https://yellowcard.tistory.com/636#entry636comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:50:45 +0900</pubDate>
    </item>
    <item>
      <title>더 작은 배당과 더 큰 분배의 모듈러스는 어떻게 작동합니까?</title>
      <link>https://yellowcard.tistory.com/635</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 작은 배당과 더 큰 분배의 모듈러스는 어떻게 작동합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;7 % 3 = 1 (remainder 1)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쩌죠?&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;3 % 7&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(remainder?)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나머지 3/7은 3..&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나머지 3개로 0번을 했기 때문에 3%7 = 3&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;7은 3에 들어가는 거야? 0번이고 3번 남았어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몫은 0입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나머지(modulus)는 3입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개념적으로 저는 이렇게 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정의에 따라 배당금은 다음과 같아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(quotient * divisor) + modulus&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 모듈러스에 대한 풀이:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;modulus = dividend - (quotient * divisor)&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배당금이 분배수보다 적을 때마다, 몫은 항상 0이고, 모듈러스는 단순히 배당금과 같아집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;OP 값으로 설명하기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;modulus of 3 and 7 = 3 - (0 * 7) = 3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 값으로 설명하기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;1 % 3:
1 - (0 * 3) = 1

2 % 3:
2 - (0 * 3) = 2
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;같은 방법.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몫은 0(3 / 7, 분수 부분은 버려짐)입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나머지는 다음을 만족합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(a / b) * b + (a % b) = a
(3 / 7) * 7 + (3 % 7) = 3
0 * 7 + (3 % 7) = 3
(3 % 7) = 3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 C99 §6.5.5, 곱셈 연산자에 정의되어 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;7을 3으로 나눈 값은 2이고 나머지는 1입니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3을 7로 나눈 값은 0이고 나머지는 3입니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 긍정적이기만 하면 나머지는 배당금과 같아집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나 또는 둘 다 부정적이면, 당신은 다음과 같이 상기됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈러스 연산자가 아닌 나머지 연산자입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모듈러스는 항상 양수이지만 나머지는 음수일 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;(7 * 0) + 3 = 3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;; 따라서 나머지는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;% q = r은 q * x + r = a가 되도록 x가 있음을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 7 % 3 = 1 이므로 3 * 2 + 1 = 7,&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 3 % 7 = 3 이므로 7 * 0 + 3 = 3&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기억해야 할 가장 간단하고 효과적인 캐치는 다음과 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;23-1&quot;&gt;배당금&lt;/strong&gt;이 &lt;strong papago-id=&quot;23-3&quot;&gt;분배금&lt;/strong&gt;보다 적을 때마다 모듈러스는 그 &lt;strong papago-id=&quot;23-5&quot;&gt;배당금&lt;/strong&gt;일 뿐입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 공식화해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if x &amp;lt; y, then x % y = x 
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 분할자가 더 작고 부정적이라면, 이 놀라운 경우를 언급하는 것을 잊어버린 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;-3 % 7 

result: 4
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 뇌가 이런 질문을 이해할 수 있도록 항상 실제 물체로 변환합니다. 예를 들어 &lt;strong papago-id=&quot;26-1&quot;&gt;3% 7&lt;/strong&gt;의 질문을 변환하면 &lt;strong papago-id=&quot;26-3&quot;&gt;&quot;3&quot;&lt;/strong&gt;은 &lt;strong papago-id=&quot;26-5&quot;&gt;3인치&lt;/strong&gt; 너비의 &lt;strong papago-id=&quot;26-5&quot;&gt;금속 구멍&lt;/strong&gt;으로, &lt;strong papago-id=&quot;26-7&quot;&gt;&quot;7&quot;&lt;/strong&gt;은 &lt;strong papago-id=&quot;26-9&quot;&gt;7인치 금속 나사&lt;/strong&gt;로 표현할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;26-11&quot;&gt;7인치 금속 나사&lt;/strong&gt;를 &lt;strong papago-id=&quot;26-13&quot;&gt;3인치 너비의 금속 구멍&lt;/strong&gt;에 삽입할 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 아닙니다. 따라서 답은 3인치 금속 구멍이어야 합니다. 1&lt;strong papago-id=&quot;26-15&quot;&gt;,000인치 또는 100만인치&lt;/strong&gt; 너비 나사가 있다고 해도 상관없습니다. 1,000인치 또는 100만인치 너비 나사를 3인치 너비 금속 구멍에 몇 번이나 삽입할 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;0번이죠?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3622298/how-does-modulus-of-a-smaller-dividend-and-larger-divisor-work&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/635</guid>
      <comments>https://yellowcard.tistory.com/635#entry635comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:50:35 +0900</pubDate>
    </item>
    <item>
      <title>컴파일 시 스택 사용량 확인</title>
      <link>https://yellowcard.tistory.com/634</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 시 스택 사용량 확인&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C에서 컴파일 시간에 함수가 필요로 하는 스택 크기를 알고 출력할 수 있는 방법이 있습니까? 여기 제가 알고 싶은 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 기능을 사용해 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void foo(int a) {
    char c[5];
    char * s;
    //do something
    return;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 함수를 컴파일할 때 호출할 때 스택 공간을 얼마나 소모하는지 알고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 큰 버퍼를 숨기는 구조의 온스택 선언을 탐지하는 데 유용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 것을 인쇄할 수 있는 것을 찾고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;: 은 file fo.c : function fo stack &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바이트들&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성된 어셈블리를 보지 않고 그것을 알 수 있는 방법이 있습니까? 또는 컴파일러에 대해 설정할 수 있는 제한이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트 : 주어진 프로세스에 대해 런타임 스택 오버플로를 방지하려는 것이 아니라 컴파일러가 결정한 함수 스택 사용이 컴파일 프로세스의 출력으로 사용 가능한 경우 런타임 전에 찾을 수 있는 방법을 찾고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 말로 하자면, 함수에 로컬인 모든 객체의 크기를 알 수 있을까요? 컴파일러 최적화는 내 친구가 아닐 것입니다. 왜냐하면 몇몇 변수는 사라지지만 상한은 괜찮기 때문입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;리눅스 커널 코드는 x86의 4K 스택에서 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 그들은 신경을 씁니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 확인하기 위해 사용하는 것은 자신들이 작성한 펄 스크립트이며, 최근 커널 타르볼(2.6.25가 이를 가지고 있음)에서 스크립트/checkstack.pl 로 찾을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;objdump의 출력으로 실행되며 사용 설명서는 첫 번째 주석에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 공간 바이너리에 이미 오래전에 사용했던 것 같은데 펄 프로그래밍을 조금만 알고 계시면 고장나면 고치기 쉽습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어쨌든 기본적으로 GCC의 산출물을 자동으로 보는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 커널 해커들이 그런 툴을 작성했다는 것은 GCC로 그것을 할 수 있는 정적인 방법이 없다는 것을 의미합니다(혹은 그것이 아주 최근에 추가되었을 수도 있지만, 나는 그렇게 생각하지 않습니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그건 그렇고, mingw 프로젝트의 objdump와 ActivePerl, 또는 Cygwin을 사용하면 윈도우와 다른 컴파일러로 얻은 바이너리에서도 그렇게 할 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;StackAnyser는 실행 코드 자체와 디버깅 정보를 조사하는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/126036/checking-stack-usage-at-compile-time#126439&quot; papago-id=&quot;14-1&quot;&gt;이 답변&lt;/a&gt;에 의해 설명된 것은 제가 찾고 있는 것입니다. 스택 분석기는 저에게 오버킬로 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ADA를 위해 존재하는 것과 유사한 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;gnat 매뉴얼의 이 매뉴얼 페이지를 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;22.2 정적 스택 사용량 분석&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-fstack-usage로 컴파일된 장치는 기능별로 사용된 스택의 최대 양을 지정하는 추가 파일을 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일의 기본 이름은 .su 확장자가 있는 대상 개체 파일과 동일합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 파일의 각 줄은 세 개의 필드로 구성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;* The name of the function.
* A number of bytes.
* One or more qualifiers: static, dynamic, bounded. 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 필드는 함수 프레임의 알려진 부분의 크기에 해당합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한정자 정적은 함수 프레임 크기가 순수하게 정적임을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 일반적으로 모든 지역 변수가 정적 크기를 가짐을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 두 번째 필드는 함수 스택 활용도의 신뢰할 수 있는 척도입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한정자 동적은 함수 프레임 크기가 정적이 아님을 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 주로 일부 지역 변수가 동적 크기를 가질 때 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 한정자가 단독으로 나타나는 경우 두 번째 필드는 함수 스택 분석의 신뢰할 만한 측도가 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제한된 필드로 자격을 갖추면 두 번째 필드가 함수 스택 활용도의 신뢰할 수 있는 최대치임을 의미합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정적 코드 분석이 이에 대한 충분한 수치를 제공하지 못하는 이유를 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;임의의 주어진 함수에서 모든 지역 변수를 찾는 것은 사소한 일이며, 각 변수에 대한 크기는 C 표준(빌트 인 유형의 경우) 또는 계산(구조 및 조합과 같은 복잡한 유형의 경우)을 통해 구할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론, 컴파일러는 패딩, 레지스터에 변수를 넣거나 불필요한 변수를 완전히 제거하는 등 다양한 최적화 작업을 수행할 수 있기 때문에 100% 정확하다고 보장할 수는 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 그것이 주는 어떤 대답이라도 최소한 좋은 추정이 되어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구글 검색을 빠르게 해서 &lt;a href=&quot;http://www.absint.com/stackanalyzer/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24-1&quot;&gt;StackAnalyzer&lt;/a&gt;를 찾았는데 다른 static code 분석 도구들도 비슷한 기능을 가지고 있는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 100% 정확한 수치를 원한다면, 당신은 컴파일러의 출력을 보거나 Ralph가 &lt;a href=&quot;https://stackoverflow.com/questions/126036/checking-stack-usage-at-compile-time#126246&quot; papago-id=&quot;25-1&quot;&gt;그의 답장&lt;/a&gt;에서 제안한 것처럼 실행시간 동안 그것을 확인해야 할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 모든 것을 정리하는 사람이기 때문에 컴파일러만이 정말로 알 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생성된 어셈블리를 보고 프리앰블에 얼마나 많은 공간이 예약되어 있는지 확인해야 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그러나 그것은 실제로 다음과 같은 것들을 설명하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;alloca&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들은 실행시간에 그들의 일을 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러분이 임베디드 플랫폼에 있다고 가정할 때, 여러분은 툴체인이 이것을 시도하고 있다는 것을 발견할 수 있을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우수한 상용 임베디드 컴파일러(예: Arm/Keil 컴파일러)는 스택 사용에 대한 보고서를 생성하는 경우가 많습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 인터럽트와 재귀는 일반적으로 그 범위를 약간 넘어선 것이지만, 어떤 사람이 스택 어딘가에 있는 수 메가바이트의 버퍼를 가지고 심각한 실수를 저질렀는지 대략적으로 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확히 &quot;컴파일 시간&quot;은 아니지만, 빌드 후 단계로 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;링커가 당신을 위해 지도 파일을 만들도록 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지도 파일의 각 기능에 대해 실행 파일의 해당 부분을 읽고 기능 프롤로그를 분석합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Stack Analyzer와 비슷하지만 훨씬 간단합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 실행 파일이나 해체를 분석하는 것이 컴파일러 출력을 얻을 수 있는 가장 쉬운 방법이라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러가 내부적으로 알고 있기는 하지만 이를 통해 얻을 수 없을 것 같습니다(컴파일러 벤더에게 기능 구현을 요청하거나 오픈 소스 컴파일러를 사용하는 경우 직접 수행하거나 누군가가 대신 수행하도록 요청할 수도 있습니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 구현하려면 다음 작업이 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지도 파일을 파싱할 수 있는&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 파일 형식 이해&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능 프롤로그가 어떤 모습인지 알고 그것을 &quot;decode&quot;할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;목표 플랫폼에 따라 이 작업이 얼마나 쉽거나 어려울지가 달라집니다. (내장되어 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 CPU 아키텍처?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무슨 컴파일러?)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 모든 작업은 x86/Win32에서 수행할 수 있습니다. 하지만 이런 작업을 전혀 수행하지 않고 처음부터 이 모든 작업을 수행해야 한다면 작업이 완료되고 작업이 완료되기까지 며칠이 걸릴 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 그렇지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이론 컴퓨터 과학의 문제 중지는 일반 프로그램이 주어진 입력에 대해 중단되는지 여부를 예측할 수조차 없다는 것을 암시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 프로그램 실행에 사용되는 스택을 계산하는 것은 훨씬 더 복잡할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 안 돼요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아마 특별한 경우일 겁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;임의 길이의 입력에 따라 재귀 수준이 달라지며 이미 운이 없다고 가정해 보겠습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/126036/checking-stack-usage-at-compile-time&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/634</guid>
      <comments>https://yellowcard.tistory.com/634#entry634comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:50:29 +0900</pubDate>
    </item>
    <item>
      <title>window cmd를 사용하여 사용자 권한을 보는 방법?</title>
      <link>https://yellowcard.tistory.com/633</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;window cmd를 사용하여 사용자 권한을 보는 방법?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows에서 명령 프롬프트를 사용하여 사용자 권한을 보려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 계정 및 다음과 같은 사용자 권한:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SeBatchLogonRight
SeDenyBatchLogonRight
SeInteractiveLogonRight
SeDenyInteractiveLogonRight
SeServiceLogonRight
SeDenyServiceLogonRight
SeNetworkLogonRight
SeDenyNetworkLogonRight
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해 보았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ntrights&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작동이 안 돼요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;OS 감사를 위한 자동화된 스크립트를 만들기 위해 어떤 도구도 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 명령을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;whoami /priv
whoami /all
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 &lt;a href=&quot;http://technet.microsoft.com/en-us/library/cc771299.aspx&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;whoami &lt;/a&gt;@ &lt;a href=&quot;http://technet.microsoft.com/en-us/library/cc771299.aspx&quot; papago-id=&quot;5-1&quot; rel=&quot;noreferrer&quot;&gt;technet&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마크 러시노비치는 AccessChk라는 훌륭한 도구를 사용하여 명령줄에서 이 정보를 얻을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;설치할 필요가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb664922.aspx&quot; papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://technet.microsoft.com/en-us/sysinternals/bb664922.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;accesschk.exe /accepteula -q -a SeServiceLogonRight
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 내용을 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;IIS APPPOOL\DefaultAppPool
IIS APPPOOL\Classic .NET AppPool
NT SERVICE\ALL SERVICES
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대조적으로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;whoami /priv&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;whoami /all&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 출품작이 빠져 있었어요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SeServiceLogonRight&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 해당 권한에 대한 줄을 조사합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 지금 문제는 계정이 사용자 이름이 아닌 SID로 나열된다는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 프롬프트로 이동하여 명령을 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;net user &amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지역 그룹 구성원 자격을 표시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도메인에 있는 경우 로컬 그룹을 &lt;strong papago-id=&quot;18-1&quot;&gt;대신&lt;/strong&gt; 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;net localgroup Administrators or net localgroup [Admin group name]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자체적으로 로컬 그룹이 있는 로컬 그룹 목록을 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;net localgroup
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;whoami /priv&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령을 실행하여 모든 사용자 권한을 나열합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/11607389/how-to-view-user-privileges-using-windows-cmd&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>powershell</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/633</guid>
      <comments>https://yellowcard.tistory.com/633#entry633comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:50:22 +0900</pubDate>
    </item>
    <item>
      <title>jQuery에서 마우스 휠 이벤트를 얻습니까?</title>
      <link>https://yellowcard.tistory.com/632</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery에서 마우스 휠 이벤트를 얻습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마우스 휠 이벤트를 가져올 수 있는 방법이 있습니까(말하지 않음).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scroll&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트) jQuery에서?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;​$(document).ready(function(){
    $('#foo').bind('mousewheel', function(e){
        if(e.originalEvent.wheelDelta /120 &amp;gt; 0) {
            console.log('scrolling up !');
        }
        else{
            console.log('scrolling down !');
        }
    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다에 구속력&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mousewheel&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DOMMouseScroll&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결국 저는 정말 잘 일했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(window).bind('mousewheel DOMMouseScroll', function(event){
    if (event.originalEvent.wheelDelta &amp;gt; 0 || event.originalEvent.detail &amp;lt; 0) {
        // scroll up
    }
    else {
        // scroll down
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 방법은 IE9+, Chrome 33, Firefox 27에서 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집 - 2016년 3월&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오랜만에 이 문제를 다시 생각해보기로 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크롤 이벤트에 대한 MDN 페이지는 다음을 활용하는 스크롤 위치를 검색하는 훌륭한 방법을 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;requestAnimationFrame&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 이전의 탐지 방법보다 매우 선호되는 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크롤 방향과 위치 외에 더 나은 호환성을 제공하기 위해 코드를 수정했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;false&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;(function() {
  var supportOffset = window.pageYOffset !== undefined,
    lastKnownPos = 0,
    ticking = false,
    scrollDir,
    currYPos;

  function doSomething(scrollPos, scrollDir) {
    // Your code goes here...
    console.log('scroll pos: ' + scrollPos + ' | scroll dir: ' + scrollDir);
  }

  window.addEventListener('wheel', function(e) {
    currYPos = supportOffset ? window.pageYOffset : document.body.scrollTop;
    scrollDir = lastKnownPos &amp;gt; currYPos ? 'up' : 'down';
    lastKnownPos = currYPos;

    if (!ticking) {
      window.requestAnimationFrame(function() {
        doSomething(lastKnownPos, scrollDir);
        ticking = false;
      });
    }
    ticking = true;
  });
})();&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; See the Pen 
&lt;a href=&quot;http://codepen.io/blindside85/pen/bpEMEN/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바닐라 JS 스크롤 트래킹&lt;/font&gt;&lt;/a&gt; by Jesse Dupuy (
&lt;a href=&quot;http://codepen.io/blindside85&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@블라인드사이드85&lt;/font&gt;&lt;/a&gt;) on 
&lt;a href=&quot;http://codepen.io&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드펜&lt;/font&gt;&lt;/a&gt;.
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드는 현재 작업 중입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Chrome v50, Firefox v44, Safari v9, and IE9+&lt;/code&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/scroll&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/Events/scroll&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/wheel&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/Events/wheel&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2017년 현재는 그냥 글을 쓰시면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(window).on('wheel', function(event){

  // deltaY obviously records vertical scroll, deltaX and deltaZ exist too.
  // this condition makes sure it's vertical scrolling that happened
  if(event.originalEvent.deltaY !== 0){

    if(event.originalEvent.deltaY &amp;lt; 0){
      // wheeled up
    }
    else {
      // wheeled down
    }
  }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 Firefox 51, Chrome 56, IE9+에서 작동합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마우스 휠을 위/아래로 감지하는 &lt;a href=&quot;https://github.com/brandonaaron/jquery-mousewheel/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;19-1&quot;&gt;플러그인&lt;/a&gt;이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;마우스휠&quot; 이벤트에 대해 이야기하는 답변들은 더 이상 사용하지 않는 이벤트를 말합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적인 이벤트는 단순히 &quot;바퀴&quot;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel 참조&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과가 있었습니다:)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; //Firefox
 $('#elem').bind('DOMMouseScroll', function(e){
     if(e.originalEvent.detail &amp;gt; 0) {
         //scroll down
         console.log('Down');
     }else {
         //scroll up
         console.log('Up');
     }

     //prevent page fom scrolling
     return false;
 });

 //IE, Opera, Safari
 $('#elem').bind('mousewheel', function(e){
     if(e.originalEvent.wheelDelta &amp;lt; 0) {
         //scroll down
         console.log('Down');
     }else {
         //scroll up
         console.log('Up');
     }

     //prevent page fom scrolling
     return false;
 });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/7154967/jquery-detect-scrolldown&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스택 오버플로에서&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 바닐라액이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수에 전달된 이벤트가 다음과 같은 경우 jQuery에서 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;event.originalEvent&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery가 jQuery 이벤트의 속성으로 사용할 수 있도록 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 안에 있으면.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;callback&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 줄 앞에 추가하는 아래 함수:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;event = event.originalEvent;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드는 휠 속도/양을 정규화하며 일반적인 마우스에서 앞으로 스크롤하는 경우에는 양수이고 뒤로 마우스 휠을 움직이는 경우에는 음수입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h3 papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데모: http://jsfiddle.net/BXhzD/&lt;/font&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;var wheel = document.getElementById('wheel');

function report(ammout) {
    wheel.innerHTML = 'wheel ammout: ' + ammout;
}

function callback(event) {
    var normalized;
    if (event.wheelDelta) {
        normalized = (event.wheelDelta % 120 - 0) == -0 ? event.wheelDelta / 120 : event.wheelDelta / 12;
    } else {
        var rawAmmount = event.deltaY ? event.deltaY : event.detail;
        normalized = -(rawAmmount % 3 ? rawAmmount * 10 : rawAmmount / 3);
    }
    report(normalized);
}

var event = 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll';
window.addEventListener(event, callback);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery를 위한 플러그인도 있는데, 이 플러그인은 코드에 더 상세하고 약간의 여분의 설탕이 있습니다. https://github.com/brandonaaron/jquery-mousewheel&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 각 IE, Firefox 및 Chrome의 최신 버전에서 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function(){
        $('#whole').bind('DOMMouseScroll mousewheel', function(e){
            if(e.originalEvent.wheelDelta &amp;gt; 0 || e.originalEvent.detail &amp;lt; 0) {
                alert(&quot;up&quot;);
            }
            else{
                alert(&quot;down&quot;);
            }
        });
    });
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 오늘 이 문제에 빠져 있었고 이 코드가 제게 잘 작동하고 있다는 것을 알았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#content').on('mousewheel', function(event) {
    //console.log(event.deltaX, event.deltaY, event.deltaFactor);
    if(event.deltaY &amp;gt; 0) {
      console.log('scroll up');
    } else {
      console.log('scroll down');
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; knob.bind('mousewheel', function(e){  
 if(e.originalEvent.wheelDelta &amp;lt; 0) {
    moveKnob('down');
  } else {
    moveKnob('up');
 }
  return false;
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@다린디미트로프가 올린 플러그인은&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jquery-mousewheel&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, &lt;a href=&quot;https://github.com/jquery/jquery-mousewheel/issues/165&quot; papago-id=&quot;34-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;jQuery 3+로 깨졌습니다&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 3+에서 작동하는 것을 사용하는 것이 더 좋을 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 루트를 가기 싫다면 MDN은 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;이벤트&lt;/a&gt;가 표준에 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;맞지&lt;/a&gt; 않고 지원되지 않는 곳이 많기 때문에 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;이벤트&lt;/a&gt;를 사용하는 것에 대해 매우 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel&quot; papago-id=&quot;35-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;주의&lt;/a&gt;를 기울입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신에 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/wheel&quot; papago-id=&quot;35-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;당신&lt;/a&gt;이 의미하는 가치가 정확히 무엇인지에 대한 훨씬 더 구체적인 정보를 얻기 때문에 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Events/wheel&quot; papago-id=&quot;35-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;이벤트를 사용해야 한다고&lt;/a&gt; 말합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 주요 브라우저에서 지원합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저의 조합은 이렇게 생겼습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래/위로 스크롤할 때마다 점점 희미해집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 헤더를 페이딩하기 위해 헤더 위로 스크롤해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var header = $(&quot;#header&quot;);
$('#content-container').bind('mousewheel', function(e){
    if(e.originalEvent.wheelDelta &amp;gt; 0) {
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    else{
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 것은 터치/모바일에 최적화된 것이 아닙니다. 저는 이것이 모든 모바일에 더 적합하다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var iScrollPos = 0;
var header = $(&quot;#header&quot;);
$('#content-container').scroll(function () {

    var iCurScrollPos = $(this).scrollTop();
    if (iCurScrollPos &amp;gt; iScrollPos) {
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);

    } else {
        //Scrolling Up
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    iScrollPos = iCurScrollPos;

});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급한 &lt;a href=&quot;https://github.com/jquery/jquery-mousewheel&quot; papago-id=&quot;38-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;jquery mousewheel plugin&lt;/a&gt;을 사용한다면 이벤트 핸들러 함수의 두번째 인수를 사용하는 것은 어떨까요 -&lt;/font&gt;&lt;/font&gt;&lt;code&gt;delta&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#my-element').on('mousewheel', function(event, delta) {
    if(delta &amp;gt; 0) {
    console.log('scroll up');
    } 
    else {
    console.log('scroll down');
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 가지 중요한 것들이 곳곳에 널려 있는 것 같고, 내가 원하는 대로 코드를 작동시키기 위해서는 모든 답을 읽어야 했기 때문에, 내가 발견한 내용을 한 곳에 게시하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;wheel&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용되지 않는 다른 이벤트 또는 브라우저 특정 이벤트에 대한 이벤트입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 있는 많은 사람들은 뭔가 잘못된 것을 가지고 있습니다: 반대입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&amp;gt;0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&amp;lt;=0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 그 반대의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&amp;lt;0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&amp;gt;=0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 여기에 있는 많은 답변들은 아래로 스크롤하거나 위로 스크롤하는 것을 잘못 유발할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x=0&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(horizon 스크롤).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 분이 어떻게 하면 감수성을 부여할 수 있냐고 물어보시는데, 이걸 사용할 수 있는 거죠.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;setTimeout()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;50ms 정도의 지연으로 일부 도우미 플래그를 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isWaiting=false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 당신은 당신 자신을 보호합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;if(isWaiting)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 아무것도 하지 말아요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 시 수동으로 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isWaiting=true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;53&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 이 선 바로 아래에서 &lt;strong papago-id=&quot;53-1&quot;&gt;setTimeout&lt;/strong&gt;을 다시 시작합니다. 나중에 변경할 사람.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isWaiting=false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;50 ms 후에&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 최근에 같은 문제가 생겼다 어디에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(window).mousewheel&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;돌아오는 중이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 한 일은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(window).on('mousewheel', function() {});&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 처리하기 위해 사용하고 있는 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function (event) {
    var direction = null,
        key;

    if (event.type === 'mousewheel') {
        if (yourFunctionForGetMouseWheelDirection(event) &amp;gt; 0) {
            direction = 'up';
        } else {
            direction = 'down';
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/8189840/get-mouse-wheel-events-in-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>jQuery</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/632</guid>
      <comments>https://yellowcard.tistory.com/632#entry632comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:50:15 +0900</pubDate>
    </item>
    <item>
      <title>Spring 보안에서 하나를 제외한 모든 URL 허용</title>
      <link>https://yellowcard.tistory.com/631</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring 보안에서 하나를 제외한 모든 URL 허용&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 다른 모든 것에 대해 익명 접근을 허용하면서 하나의 URL만 보호하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인터넷에서 보는 Java 구성 예는 모두 명시적으로 사용해야 한다는 것을 나타내는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;permitAll&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각각의 URL, 그리고 적절한&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hasRole&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보호해야 할 URL의 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 애플리케이션에 새로운 URL을 추가할 때마다 수정하는 정말 다루기 힘든 자바 코드를 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;좀 더 쉽게 사용할 수 있는 자바 구성이 있을까요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 제 경우에는 제가 보호하고 있는 URL이 하위 리소스라는 점도 주목해 주십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;employee/me&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 하고싶습니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;employee/list&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 익명으로 접근할 수 있는 등.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;6-1&quot;&gt;Java Configuration&lt;/em&gt;을 사용하는 경우 다음과 같은 방법을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;configure&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;방법:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
                .antMatchers(&quot;/employee/me&quot;).authenticated()
                .antMatchers(&quot;/**&quot;).permitAll();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Protected void configure(HttpSecurity http)에서 Exception { http.authorizeRequests() .antMatchers(&quot;/employee/me&quot;)를 던집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인증됨() .antMatchers(&quot;/**&quot;).permitAll(); }&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/36382970/allow-all-urls-but-one-in-spring-security&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>Spring</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/631</guid>
      <comments>https://yellowcard.tistory.com/631#entry631comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:50:05 +0900</pubDate>
    </item>
    <item>
      <title>왜 문서가.내 자바스크립트에서 바디 널?</title>
      <link>https://yellowcard.tistory.com/630</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 문서가.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 자바스크립트에서 바디 널?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 저의 간략한 HTML 문서가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome Console에서 이 오류를 지적하는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;Uncatched TypeError: 메서드를 호출할 수 없습니다. &quot;의 'adpendChild'입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Javascript Tests&amp;lt;/title&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

        var mySpan = document.createElement(&quot;span&quot;);
        mySpan.innerHTML = &quot;This is my span!&quot;;

        mySpan.style.color = &quot;red&quot;;
        document.body.appendChild(mySpan);

        alert(&quot;Why does the span change after this alert? Not before?&quot;);

    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시신은 아직 정의되지 않았습니다&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 이러한 요소를 사용하는 자바스크립트를 실행하기 전에 모든 요소를 생성하기를 원합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 당신은 자바스크립트를 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;head&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하는 섹션&lt;/font&gt;&lt;/font&gt;&lt;code&gt;body&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 시원치 않아요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 이 코드를 a로 포장하길 원합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window.onload&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;핸들러 또는 &lt;strong papago-id=&quot;9-1&quot;&gt;뒤&lt;/strong&gt;에 배치합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;태그(&lt;a href=&quot;https://stackoverflow.com/users/1222176/e-bacho-2-0&quot; papago-id=&quot;10-1&quot;&gt;e-bacho 2.0&lt;/a&gt;에서 언급한 바와 같이).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Javascript Tests&amp;lt;/title&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
      window.onload = function() {
        var mySpan = document.createElement(&quot;span&quot;);
        mySpan.innerHTML = &quot;This is my span!&quot;;

        mySpan.style.color = &quot;red&quot;;
        document.body.appendChild(mySpan);

        alert(&quot;Why does the span change after this alert? Not before?&quot;);
      }

    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://jsbin.com/osohog/2/edit&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-0&quot;&gt;데모 참조&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트가 실행되기 전에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;body&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소가 로드되기도 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하는 몇 가지 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;h3 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 DOM 로드 콜백에 래핑합니다.&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트 수신기에 논리를 랩핑합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DOMContentLoaded&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 콜백이 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;body&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소가 로드되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;document.addEventListener('DOMContentLoaded', function () {
    // ...
    // Place code here.
    // ...
});
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요에 따라 A/S를 첨부할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;load&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트 청취자.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;window&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;window.addEventListener('load', function () {
    // ...
    // Place code here.
    // ...
});
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사이의 차이에 대해서는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DOMContentLoaded&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;load&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트, 이 &lt;a href=&quot;https://stackoverflow.com/questions/2414750/difference-between-domcontentloaded-and-load-events&quot; papago-id=&quot;25-1&quot;&gt;질문을 참조&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위치 이동&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;element, 마지막으로 자바스크립트 로드:&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금, 당신의.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소를 로드하는 중입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문서의 요소입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 그것이 실행될 것이라는 것을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;body&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로드했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developers.google.com/apps-script/guides/html/best-practices#load_javascript_last&quot; papago-id=&quot;31-1&quot; rel=&quot;noreferrer&quot;&gt;구글 개발자들&lt;/a&gt;은 그것을 옮기는 것을 추천합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지 끝에 태그를 지정하여 모든 HTML 콘텐츠가 자바스크립트가 처리되기 전에 렌더링되도록 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;p&amp;gt;Some paragraph&amp;lt;/p&amp;gt;
  &amp;lt;!-- End of HTML content in the body tag --&amp;gt;

  &amp;lt;script&amp;gt;
    &amp;lt;!-- Place your script tags here. --&amp;gt;
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 onload 이벤트에 추가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;승인된 답변은 이를 정확하게 보여주지만, 작성 시 다른 모든 답변과 마찬가지로 스크립트 태그를 닫는 본문 태그 뒤에 넣을 것을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유효한 html이 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 브라우저가 너무 친절하기 때문에 코드가 작동하게 됩니다 ;)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 이 답변 참조 &lt;a href=&quot;https://stackoverflow.com/questions/3037725/is-it-wrong-to-place-the-script-tag-after-the-body-tag&quot; papago-id=&quot;35-1&quot;&gt;&amp;lt;/body&amp;gt; 태그 뒤에 &amp;lt;script&amp;gt; 태그를 배치하는 것이 잘못된 것입니까?&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 이유로 다른 답변들을 반대표로 던졌습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 이 부분을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

    var mySpan = document.createElement(&quot;span&quot;);
    mySpan.innerHTML = &quot;This is my span!&quot;;

    mySpan.style.color = &quot;red&quot;;
    document.body.appendChild(mySpan);

    alert(&quot;Why does the span change after this alert? Not before?&quot;);

&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML 뒤에 다음과 같이 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;...&amp;lt;/body&amp;gt;
   &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
        var mySpan = document.createElement(&quot;span&quot;);
        mySpan.innerHTML = &quot;This is my span!&quot;;

        mySpan.style.color = &quot;red&quot;;
        document.body.appendChild(mySpan);

        alert(&quot;Why does the span change after this alert? Not before?&quot;);

    &amp;lt;/script&amp;gt;

    &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 당신이 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;script src=&quot;...&quot;&amp;gt;...&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;본문 태그 &lt;em papago-id=&quot;40-1&quot;&gt;&lt;strong papago-id=&quot;40-1-0&quot;&gt;끝&lt;/strong&gt;&lt;/em&gt;에 &lt;em papago-id=&quot;40-1&quot;&gt;&lt;strong papago-id=&quot;40-1-0&quot;&gt;있는&lt;/strong&gt;&lt;/em&gt; 파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
        
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
        &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
        &amp;lt;title&amp;gt;you can see this&amp;lt;/title&amp;gt;
        
       //-------------------------*** not here ***---------------------
        
    &amp;lt;/head&amp;gt;
        
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;div class=&quot;no&quot;&amp;gt;this is my dummy div1&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;no&quot;&amp;gt;this is my dummy div2&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;no&quot;&amp;gt;this is my dummy div2&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;no&quot;&amp;gt;this is my dummy div2&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
       
        //-------------------------*** here ***---------------------
        
        &amp;lt;script src=&quot;...js&quot;&amp;gt;...&amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저는 html을 위에서부터 아래로 파싱하며 스크립트는 본문이 로드되기 전에 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크립트를 차례로 수정하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  &amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
       &amp;lt;title&amp;gt; Javascript Tests &amp;lt;/title&amp;gt; 
  &amp;lt;/head&amp;gt;
 &amp;lt;body&amp;gt;
 &amp;lt;/body&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

    var mySpan = document.createElement(&quot;span&quot;);
    mySpan.innerHTML = &quot;This is my span!&quot;;

    mySpan.style.color = &quot;red&quot;;
    document.body.appendChild(mySpan);

    alert(&quot;Why does the span change after this alert? Not before?&quot;);

&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;document.body&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드가 실행될 때 아직 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 수행할 수 있는 작업:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var docBody=document.getElementsByTagName(&quot;body&quot;)[0];
docBody.appendChild(mySpan);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/9916747/why-is-document-body-null-in-my-javascript&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>JavaScript</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/630</guid>
      <comments>https://yellowcard.tistory.com/630#entry630comment</comments>
      <pubDate>Sun, 22 Oct 2023 20:00:50 +0900</pubDate>
    </item>
    <item>
      <title>열의 MySQL 합 요소</title>
      <link>https://yellowcard.tistory.com/629</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;열의 MySQL 합 요소&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 3열(A,B,C)로 된 테이블을 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블에서 몇 개의 행을 선택한 다음 MySQL을 선택하여 각 열에 값이 추가된 하나의 행을 반환하고자 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   A B C
1. 2 2 2
2. 4 4 4
3. 6 7 8
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 세 행을 모두 선택하면 MySQL이 반환됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   A   B  C
1. 12  13 14
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt; select sum(A),sum(B),sum(C) from mytable where id in (1,2,3);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;select
  sum(a) as atotal,
  sum(b) as btotal,
  sum(c) as ctotal
from
  yourtable t
where
  t.id in (1, 2, 3)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select sum(a), sum(b), sum(c)
from your_table
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4586040/mysql-sum-elements-of-a-column&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/629</guid>
      <comments>https://yellowcard.tistory.com/629#entry629comment</comments>
      <pubDate>Sun, 22 Oct 2023 20:00:42 +0900</pubDate>
    </item>
    <item>
      <title>C의 매크로 범위?</title>
      <link>https://yellowcard.tistory.com/628</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C의 매크로 범위?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 매크로는 어떻게 평가됩니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# define i 20
void fun();

int main(){
  printf(&quot;%d&quot;,i);
  fun();
  printf(&quot;%d&quot;,i);
  return 0;
}

void fun(){
  #undef i
  #define i 30
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생산량은 2020년과 같으나 반면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# define i 20
void fun(){
  #undef i
  #define i 30
}

int main(){
  printf(&quot;%d&quot;,i);
  fun();
  printf(&quot;%d&quot;,i);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력은 3030입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;설명해주세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C Preprocessor는 함수 호출에 관계없이 &lt;strong papago-id=&quot;4-1&quot;&gt;위에서 아래&lt;/strong&gt;로 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로가 정의된 파일의 해당 지점(행)부터 해당될 때까지 유효합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;undef&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;번역 단위가 끝날 때까지요&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 당신의 암호는&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# define i 20
               // from now on, all token i should become 20
void fun();
int main()
{
  printf(&quot;%d&quot;,i);   // printf(&quot;%d&quot;,20);
  fun();
  printf(&quot;%d&quot;,i);   // printf(&quot;%d&quot;,20);
  return 0;
}
void fun()
{
#undef i
              // from now on, forget token i
#define i 30
              // from now on, all token i should become 30
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 두번째 암호는&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# define i 20
               // from now on, all token i should become 20
void fun()
{
#undef i
               // from now on, forget i
#define i 30
               // from now on, all token i should become 30
}
int main()
{
  printf(&quot;%d&quot;,i);    //  printf(&quot;%d&quot;,30);
  fun();
  printf(&quot;%d&quot;,i);    // printf(&quot;%d&quot;,30);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;8-1&quot;&gt;전혀&lt;/em&gt; 관련된 범위가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로는 사전 처리 단계에서 별도로 별도로 독립적으로 처리되며 C 스코프 개념은 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define i 20

void fun();

int main()
{
  printf(&quot;%d&quot;,i);
  fun();
  printf(&quot;%d&quot;,i);
  return 0;
}

void fun()
{
}

#undef i
#define i 30
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define i 20
#undef i
#define i 30

void fun()
{
}

int main()
{
  printf(&quot;%d&quot;,i);
  fun();
  printf(&quot;%d&quot;,i);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 왜 그렇게 행동하는지 당신은 그것들을 보면 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전처리기 기호에는 스코프가 있지만 해당 스코프는 파일 스코프와 같은 다른 스코프와 상호 작용하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전처리기 기호 범위는 단일 번역 단위로 제한됩니다. A&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#define&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나의 번역 단위는 다른 번역 단위와 관련이 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전처리기 기호의 범위는 다음 명령을 따르는 토큰의 영역입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#defines&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것을 상징하는.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 후, 매크로의 발생은 규정에 따라 인식되고 확대됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전처리기 매크로 정의는 재귀적이지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대체 토큰 시퀀스에 정의 중인 심볼의 호출처럼 보이는 내용이 포함되어 있는 경우에는 해당 내용이 인식되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 지시 뒤에 범위가 시작되는 이유입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 매크로가 재정의된 경우에도 마찬가지입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 재정의는 특수한 것이며 원래 정의와 동일하다는 규칙을 준수해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(동일성에 대한 정확한 규칙은 표준에 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전처리기 기호의 범위는 번역 단위의 끝으로 끝나거나, 번역 단위의 대상이 되는 경우 이전에 종료됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#undef&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지시의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 전처리기 기호의 범위는 기본적으로 번역 단위 텍스트의 영역으로, 전처리기 토큰 스트림으로 간주되며, 이 영역에서 해당 기호는 인식 및 대체가 가능합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순히 범위가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로는 전처리기로 대체됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 그들의 확장은 정보원에서의 위치에 따라, 위에서 아래로 정의됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전처리기 매크로는 C 언어의 일부가 아니기 때문에 범위가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 컴파일러가 제대로 실행되기 전에 실행되는 일종의 검색 대체 프로그램입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전처리기는 어떤 파일이든 간단히 통과하고 C 소스 파일일 필요는 없으며 매크로 호출을 찾으면 매크로 본문의 텍스트로 대체합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로는 컴파일 전에 별도의 단계로 소스 텍스트에 적용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로는 컴파일된 코드의 어떤 형태로도 더 이상 존재하지 않으며 실행 시 평가되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(소스 텍스트 스캔 중에) &lt;em papago-id=&quot;24-1&quot;&gt;매크로&lt;/em&gt;가 호출될 때 유효한 매크로 정의는 원본 텍스트로 대체됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매크로는 C 전처리기 단계에서 평가됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 전처리기 단계는 컴파일 단계와는 별도로 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 때문에 매크로는 일반 범위를 따르지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 원본 파일에 나타나는 순서대로 평가됩니다(따라서 위에서 아래로).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 코드 예제에서는 i의 값을 30으로 변경해야 하는 메인 함수에서 fun()을 호출했음에도 불구하고 2020을 출력합니다. 그러나 fun 함수가 호출된 위치 아래에 나타나기 때문에 전처리기가 아직 그 지점에 도달하지 않았기 때문에 값이 변경되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 코드 예제에서는 재미 기능이 메인 기능 위에 있기 때문에 3030을 출력합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 preprocessor가 fun 함수를 이미 거치고 i의 값을 30으로 변경한 것과 반대로 발생합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/17349387/scope-of-macros-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>C</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/628</guid>
      <comments>https://yellowcard.tistory.com/628#entry628comment</comments>
      <pubDate>Sun, 22 Oct 2023 20:00:35 +0900</pubDate>
    </item>
    <item>
      <title>Laravel에서 Wordpress Database로 인증 사용자</title>
      <link>https://yellowcard.tistory.com/627</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Laravel에서 Wordpress Database로 인증 사용자&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스에 있는 기존 사이트가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹(워드 프레스)을 통해서만 사용자 등록을 할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;라라벨에서 워드프레스 DB로 사용자 인증하는 방법&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하는 방법은 여러 가지가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WordPress 데이터베이스를 사용하려면 Laravel 앱에서 사용자 지정 인증 드라이버를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://packagist.org/packages/hampel/wordpress-auth-laravel&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;햄펠의 소포&lt;/a&gt;는 이렇게 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 인증 공급자를 사용하여 WordPress 사용자를 인증합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/CalderaWP/laravel-wp-user&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;Laravel WP User Package&lt;/a&gt;는 이를 수행할 수 있으며 REST API도 지원합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://github.com/mikemclin/laravel-wp-password&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;Laravel WP Password 패키지&lt;/a&gt;를 사용하여 WordPress 호환 암호 해시를 생성하도록 Laravel의 해시를 재정의합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://medium.com/@mangia/share-users-between-wordpress-and-laravel-a536d54499bb&quot; papago-id=&quot;5-3&quot; rel=&quot;noreferrer&quot;&gt;이것에 대해서는 여기&lt;/a&gt;서 더 &lt;a href=&quot;https://medium.com/@mangia/share-users-between-wordpress-and-laravel-a536d54499bb&quot; papago-id=&quot;5-3&quot; rel=&quot;noreferrer&quot;&gt;자세히 보실&lt;/a&gt; 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://ben.lobaugh.net/blog/7175/wordpress-replace-built-in-user-authentication&quot; papago-id=&quot;6-0&quot; rel=&quot;noreferrer&quot;&gt;WordPress의 내장 인증&lt;/a&gt;을 대체합니다&lt;a href=&quot;https://ben.lobaugh.net/blog/7175/wordpress-replace-built-in-user-authentication&quot; papago-id=&quot;6-0&quot; rel=&quot;noreferrer&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://auth0.com/authenticate/laravel/wordpress/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;7-1&quot;&gt;Auth0&lt;/a&gt;을 사용합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.google.com/search?q=wordpress+laravel+authentication&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;아마&lt;/a&gt; 아직 더 &lt;a href=&quot;https://www.google.com/search?q=wordpress+laravel+authentication&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;많은 방법&lt;/a&gt;이 있을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/49025277/auth-user-from-laravel-to-wordpress-database&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>WordPress</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/627</guid>
      <comments>https://yellowcard.tistory.com/627#entry627comment</comments>
      <pubDate>Sun, 22 Oct 2023 20:00:27 +0900</pubDate>
    </item>
    <item>
      <title>Mysql: 좋아요?</title>
      <link>https://yellowcard.tistory.com/626</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mysql: 좋아요?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키워드1, 키워드2, 키워드3을 사용하여 검색을 수행한다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스에 &quot;이름&quot; 열이 있는 레코드가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1: John Do&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;2: Samuel Do&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;3: 존 스미스&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;애나 스미스&lt;/font&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 쿼리:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM users WHERE (name LIKE &quot;%John%&quot; OR name LIKE &quot;%Doe%&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1,2,3(이 순서대로) 레코드를 선택합니다만, 예를 들어 키워드로 주문하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;keyword1=John, keyword2=Doe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 키워드별로 나열해야 합니다: 1,3,2 (&quot;John&quot;을 검색한 후 &quot;Doe&quot; 검색을 수행하고 싶기 때문입니다)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;생각하고 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SELECT DISTINCT FROM (...... UNION .....)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 다른 방법으로 주문하는 것이 훨씬 쉬워질 것입니다(실제 쿼리는 정말 깁니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 질서를 만드는 요령이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;order by case 
    when name LIKE &quot;%John%&quot; then 1 
    when name LIKE &quot;%Doe%&quot;  then 2 
    else 3 
end
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;RedFilter의 답변을 기반으로 두 키워드가 모두 있는 행을 맨 위에 배치할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;order by case 
when (name LIKE &quot;%John%&quot; and name LIKE &quot;%Doe%&quot;) then 1 
when name LIKE &quot;%John%&quot; then 2
when name LIKE &quot;%Doe%&quot;  then 3
end
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html&quot; papago-id=&quot;11-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;주문&lt;/a&gt;할 수 있는 &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html&quot; papago-id=&quot;11-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Boolean&lt;/a&gt; Fulltext &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html&quot; papago-id=&quot;11-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Searchs&lt;/a&gt;에 대해 읽어 보십시오.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt; SELECT * 
 from
 (
  SELECT u.*, 1 OrderNum 
  FROM users 
  WHERE (name LIKE &quot;%John%&quot;)
  UNION 
  SELECT u.*, 2 OrderNum 
  FROM users 
  WHERE (name LIKE &quot;%Doe%&quot;)
  )
  Order by OrderNum
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 예는 모든 것을 주문할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;John&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 알파벳 순으로 뒤를 잇고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Doe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ORDER BY CASE
    WHEN name LIKE &quot;John%Doe&quot; THEN CONCAT('a',name)
    WHEN name LIKE &quot;John%&quot;    THEN CONCAT('b',name)
    WHEN name LIKE &quot;%Doe&quot;     THEN CONCAT('c',name)
    ELSE name  
END  
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3609166/mysql-order-by-like&lt;/font&gt;&lt;/p&gt;</description>
      <category>programing</category>
      <category>MySQL</category>
      <author>yellowcard</author>
      <guid isPermaLink="true">https://yellowcard.tistory.com/626</guid>
      <comments>https://yellowcard.tistory.com/626#entry626comment</comments>
      <pubDate>Sun, 22 Oct 2023 20:00:21 +0900</pubDate>
    </item>
  </channel>
</rss>