<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>nicesource</title>
    <link>https://nicesource.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 24 Jun 2026 09:22:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>nicesource</managingEditor>
    <item>
      <title>여기서 쉼표로 구분된 값을 포함하는 열의 값</title>
      <link>https://nicesource.tistory.com/946</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;열에 값이 포함된 항목을 선택하는 SQL Server 2008용 SQL 문을 작성하려고 합니다. 이제 열 내의 값은 쉼표로 구분된 목록입니다(일반적으로 항목이 하나만 있을 수 있고 선행 쉼표가 없을 수 있음). 예를 들어 In checking에서 &quot;이 값이 목록 내 어딘가에 포함되어 있습니까?&quot;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;COLUMN = Cat, Dog, Sparrow, Trout, Cow, Seahorse
Does COLUMN contain Cat? YES
Does COLUMN contain horse? NO
Does COLUMN contain Sheep? NO
&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;COLUMN = Mouse
Does COLUMN contain Hare? NO
Does COLUMN contain Mouse? YES
&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;이와 같은 IN' 키워드&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT id_column FROM table_name WHERE 'Cat' IN COLUMN
&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;또한 CONSE() 또는 'LIKE'를 이 예로 사용할 수 없습니다. 위의 예에서는 전체 문자열이 'Seahorse'에 말을 포함하므로 'horse'에 대한 값을 반환하고, 바늘과 쉼표를 검색할 수 없습니다('horse'를 찾는 경우 검색은 'horse'가 됨). 항목이 목록 끝에 있는 경우에는 어떻게 됩니까?&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;목록 '17,34,400,12'에서 '40'을 찾는다면 '40'을 찾아서 잘못된 입력을 반환할 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 통해 모든 솔루션을 해결할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WHERE (',' + RTRIM(MyColumn) + ',') LIKE '%,' + @search + ',%'
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;WHERE
      MyColumn LIKE '%,' + @search + ',%' --middle
      OR
      MyColumn LIKE @search + ',%' --start
      OR
      MyColumn LIKE '%,' + @search --end
      OR 
      MyColumn =  @search --single (good point by Cheran S in comment)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;SELECT * FROM TABLENAME WHERE FIND_IN_SET(@search, column)
&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 * FROM TABLENAME WHERE FIND_IN_SET(@search, REPLACE(column, ' ', ''))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/string-functions.html&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://dev.mysql.com/doc/refman/5.0/en/string-functions.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;DECLARE @search VARCHAR(10);
SET @search = 'Cat';

WITH T(C)
AS
(
SELECT 'Cat, Dog, Sparrow, Trout, Cow, Seahorse'
)
SELECT *
FROM T 
WHERE ', ' + C + ',' LIKE '%, ' + @search + ',%'
&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 *
from YourTable
where ','+replace(col, ' ', '')+',' like '%,Cat,%'
&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;10개만 있으면 1개를 찾는데 문제가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WHERE tablename REGEXP &quot;(^|,)@search(,|$)&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/12559876/finding-exact-value-from-a-comma-separated-string-in-php-mysql&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 찾았어요.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 가장 좋은 해결책은 서로 다른 행에 쉼표로 구분된 값을 갖도록 테이블을 정규화하는 것입니다(First normal form 1NF) http://en.wikipedia.org/wiki/First_normal_form .&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 CLR http://bi-tch.blogspot.com/2007/10/sql-clr-net-function-split.html 을 사용하거나 일반 SQL을 사용하여 SQL에서 멋진 분할 테이블 값 함수를 구현할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CREATE FUNCTION dbo.Split
(
    @RowData nvarchar(2000),
    @SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
    Id int identity(1,1),
    Data nvarchar(100)
) 
AS  
BEGIN 
    Declare @Cnt int
    Set @Cnt = 1

    While (Charindex(@SplitOn,@RowData)&amp;gt;0)
    Begin
        Insert Into @RtnValue (data)
        Select 
            Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

        Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
        Set @Cnt = @Cnt + 1
    End

    Insert Into @RtnValue (data)
    Select Data = ltrim(rtrim(@RowData))

    Return
END
&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;cross apply&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select distinct a.id_column
from   MyTable a cross apply
       dbo.Split(A.MyCol,',') b
where  b.Data='Cat'
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;SELECT * FROM TABLE_NAME WHERE
        (
            LOCATE(',DOG,', CONCAT(',',COLUMN,','))&amp;gt;0 OR
            LOCATE(',CAT,', CONCAT(',',COLUMN,','))&amp;gt;0
        );
&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에는 CONTENS라는 새로운 키워드가 있습니다. 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 http://msdn.microsoft.com/en-us/library/ms187787.aspx 을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;콤마로 구분된 항목 수를 알 수 없으므로 'charindex' 및 'substring' SQL Server 함수로 함수를 만들어야 할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;함수에서 반환된 값을 'in' 식으로 사용할 수 있습니다.&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;첫 번째 통화는 0시에 시작합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열이 아닌 ID를 알고 있는 경우 다음 방법을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;where mylookuptablecolumn IN (myarrayorcommadelimitedarray)
&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;A or B를 원할 경우 작동하지만 A not a not&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@tbaxter120에서 제안하는 까다로운 솔루션도 좋지만 이 기능을 사용하여 매력적으로 작동합니다. pString은 구분 문자열이고 pDelimiter는 구분 문자입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[DelimitedSplit]
--===== Define I/O parameters
        (@pString NVARCHAR(MAX), @pDelimiter CHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
 RETURN
--===== &quot;Inline&quot; CTE Driven &quot;Tally Table&quot; produces values from 0 up to 10,000...
     -- enough to cover VARCHAR(8000)
  WITH E1(N) AS (
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
                ),                          --10E+1 or 10 rows
       E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
       E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
 cteTally(N) AS (--==== This provides the &quot;base&quot; CTE and limits the number of rows right up front
                     -- for both a performance gain and prevention of accidental &quot;overruns&quot;
                 SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
                ),
cteStart(N1) AS (--==== This returns N+1 (starting position of each &quot;element&quot; just once for each delimiter)
                 SELECT 1 UNION ALL -- does away with 0 base CTE, and the OR condition in one go!
                 SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
                ),
cteLen(N1,L1) AS(--==== Return start and length (for use in substring)
                 SELECT s.N1,
                        ---ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000)
                        ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,50000)
                   FROM cteStart s
                )
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
 SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
        Item       = SUBSTRING(@pString, l.N1, l.L1)
   FROM cteLen l

;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 아래와 같이 where 절에 호출할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WHERE [fieldname] IN (SELECT LTRIM(RTRIM(Item)) FROM [dbo].[DelimitedSplit]('2,5,11', ','))
&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;            declare @d varchar(1000)='-11,-12,10,121'

            set @d=replace(@d,',',',%'' or '',''+a+'','' like ''%,')

            print @d
            declare @d1 varchar(5000)=
            'select * from (
            select ''1,21,13,12'' as a
            union
            select ''11,211,131,121''
            union
            select ''411,211,131,1211'') as t
             where '',''+a+'','' like ''%,'+@d+ ',%'''

             print @d1
             exec (@d1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;tbaxter120이 제안한 솔루션은 효과가 있었지만 MySQL &amp;amp; Oracle &amp;amp; MSSQL에서 모두 지원할 수 있는 무언가가 필요했습니다. 여기 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WHERE (CONCAT(',' ,CONCAT(RTRIM(MyColumn), ','))) LIKE CONCAT('%,' , CONCAT(@search , ',%'))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;SQL Server 2016 이상인 경우&lt;/strong&gt;에만 해당 - STRING_SPLIT 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT Column From Table 
WHERE EXISTS (SELECT *  FROM STRING_SPLIT(Column , ',') WHERE value IN ('Cat'));
&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/5611715/where-value-in-column-containing-comma-delimited-values&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>sql-server</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/946</guid>
      <comments>https://nicesource.tistory.com/946#entry946comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:45:21 +0900</pubDate>
    </item>
    <item>
      <title>blob이 포함된 테이블의 mysql 쿼리 속도가 파일 시스템 캐시에 따라 다름</title>
      <link>https://nicesource.tistory.com/945</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;blob이 포함된 테이블의 mysql 쿼리 속도가 파일 시스템 캐시에 따라 다름&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;BLOB(각 항목의 크기가 1MB 이하, 일반적으로 훨씬 작음)가 있는 필드가 포함된 약 120k 행의 테이블이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문제는 이 테이블의 열(BLOB는 &lt;em&gt;포함&lt;/em&gt;하지 않음)을 묻는 쿼리를 실행할 때마다 파일 시스템 캐시가 비어 있으면 완료하는 데 약 40&quot;이 걸린다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;동일한 테이블의 모든 후속 쿼리에는 1&quot; 미만의 값이 필요합니다(명령줄 클라이언트에서 서버 자체에서 테스트).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쿼리에서 반환되는 행 수는 빈 집합에서 60k+로 다양합니다.&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;테이블은 제 isam 이지만 innodb로 변경(및 ROW_FORMAT= compact 설정)을 시도했지만 아무런 행운이 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;BLOB 열을 제거하면 쿼리가 항상 빠릅니다.&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;다음은 설명, 인덱스 및 테이블 정의와 함께 차례로 실행되는 2개의 예제 쿼리입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; SELECT ct.score FROM completed_tests ct where ct.status != 'deleted' and ct.status != 'failed' and score &amp;lt; 100;
Empty set (48.21 sec)
mysql&amp;gt; SELECT ct.score FROM completed_tests ct where ct.status != 'deleted' and ct.status != 'failed' and score &amp;lt; 99;
Empty set (1.16 sec)

mysql&amp;gt; explain SELECT ct.score FROM completed_tests ct where ct.status != 'deleted' and ct.status != 'failed' and score &amp;lt; 99;
+----+-------------+-------+-------+---------------+--------+---------+------+-------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows  | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+-------+-------------+
|  1 | SIMPLE      | ct    | range | status,score  | status | 768     | NULL | 82096 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+-------+-------------+
1 row in set (0.00 sec)


mysql&amp;gt; show indexes from completed_tests;
+-----------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table           | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| completed_tests |          0 | PRIMARY     |            1 | id          | A         |      583938 |     NULL | NULL   |      | BTREE      |         |
| completed_tests |          1 | users_login |            1 | users_LOGIN | A         |       11449 |     NULL | NULL   | YES  | BTREE      |         |
| completed_tests |          1 | tests_ID    |            1 | tests_ID    | A         |         140 |     NULL | NULL   |      | BTREE      |         |
| completed_tests |          1 | status      |            1 | status      | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |
| completed_tests |          1 | timestamp   |            1 | timestamp   | A         |      291969 |     NULL | NULL   |      | BTREE      |         |
| completed_tests |          1 | archive     |            1 | archive     | A         |           1 |     NULL | NULL   |      | BTREE      |         |
| completed_tests |          1 | score       |            1 | score       | A         |         783 |     NULL | NULL   | YES  | BTREE      |         |
| completed_tests |          1 | pending     |            1 | pending     | A         |           1 |     NULL | NULL   |      | BTREE      |         |
+-----------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

mysql&amp;gt; show create table completed_tests;
+-----------------+--------------------------------------
| Table           | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+-----------------+--------------------------------------
| completed_tests | CREATE TABLE `completed_tests` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `users_LOGIN` varchar(100) DEFAULT NULL,
  `tests_ID` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `test` longblob,
  `status` varchar(255) DEFAULT NULL,
  `timestamp` int(10) unsigned NOT NULL DEFAULT '0',
  `archive` tinyint(1) NOT NULL DEFAULT '0',
  `time_start` int(10) unsigned DEFAULT NULL,
  `time_end` int(10) unsigned DEFAULT NULL,
  `time_spent` int(10) unsigned DEFAULT NULL,
  `score` float DEFAULT NULL,
  `pending` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `users_login` (`users_LOGIN`),
  KEY `tests_ID` (`tests_ID`),
  KEY `status` (`status`),
  KEY `timestamp` (`timestamp`),
  KEY `archive` (`archive`),
  KEY `score` (`score`),
  KEY `pending` (`pending`)
) ENGINE=InnoDB AUTO_INCREMENT=117996 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED
1 row in set (0.00 sec)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 &lt;a href=&quot;https://stackoverflow.com/questions/9409518/mysql-query-slow-at-first-fast-afterwards&quot;&gt;원래&lt;/a&gt; 이것을 &lt;a href=&quot;https://stackoverflow.com/questions/9409518/mysql-query-slow-at-first-fast-afterwards&quot;&gt;mysql 쿼리에 처음에는 빠르게&lt;/a&gt; 올렸지만 지금은 더 많은 정보가 있어서 다른 질문으로 다시 올립니다. 나도 이것을 &lt;a href=&quot;http://forums.mysql.com/read.php?24,517931,517931#msg-517931&quot; rel=&quot;noreferrer&quot;&gt;mysql 포럼&lt;/a&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;MySQL의 BLOB(=TEXT) 스토리지 설계는 완전한 결함이 있고 intuitive에 반하는 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 같은 문제에 몇 번 부딪혔지만 권위 있는 설명을 찾을 수 없었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 마침내 찾은 가장 자세한 분석은 2010년의 이 게시물입니다: http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적인 믿음과 기대는 BLOBs/TEXTs가 주 행 저장소 외부에 저장된다는 것입니다(예: 이 답변 &lt;a href=&quot;https://stackoverflow.com/a/5811334/1202674&quot;&gt;참조&lt;/a&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;BLOB 항목의 크기가 수KB인 경우 행 데이터에 직접 포함됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 비 BLOB 열만 선택해도 엔진은 디스크에서 모든 BLOB를 로드해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 각 100바이트의 비블롭 데이터와 5000바이트의 블롭 데이터로 구성된 1M 행이 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 비블롭 열을 선택하면 MySQL이 행당 약 &lt;strong&gt;100-120바이트&lt;/strong&gt;(BLOB 주소의 경우 +20)인 디스크에서 읽게 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 실제로 MySQL은 모든 BLOB를 행과 동일한 Disk 블록에 저장하므로 &lt;em&gt;사용&lt;/em&gt;하지 않더라도 모두 함께 읽어야 하므로 Disk에서 읽은 데이터의 크기는 약 5100MB = &lt;strong&gt;5GB&lt;/strong&gt;입니다. 이는 예상보다 &lt;strong&gt;50배&lt;/strong&gt; 이상 크며 쿼리 실행 &lt;strong&gt;속도가 50배&lt;/strong&gt; 느림을 의미합니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;물론 이 설계에는 장점이 있습니다. 블롭본을 포함한 모든 열이 필요할 때 외부에 저장될 때보다 블롭이 행과 함께 저장될 때 SELECT 쿼리가 더 빠릅니다. 행당 1개의 추가 페이지 액세스를 피할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이는 BLOB의 일반적인 사용 사례가 아니며 DB 엔진이 이 사례에 최적화되어서는 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터가 너무 작아서 일렬로 들어맞고 필요한 경우나 그렇지 않은 경우에 상관없이 모든 쿼리에 로드해도 괜찮다면 BLOB/TEXT 대신 VARCHAR 유형을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떤 이유로(긴 행 또는 긴 블롭) BLOB 값이 외부에 저장되더라도 &lt;strong&gt;768바이트 접두사&lt;/strong&gt;는 여전히 행 자체에 유지됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;앞의 예를 들어 보겠습니다. 각 행에 100바이트의 비블롭 데이터가 있지만 이제 블롭 열에는 각 1MB의 항목이 저장되므로 외부에 보관해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비블롭 열의 선택은 행당 약 800바이트(비블롭 + 블롭 접두사)를 읽어야 하며, 이는 예상했던 것보다 &lt;strong&gt;7배&lt;/strong&gt; 더 큰 &lt;strong&gt;디스크&lt;/strong&gt; 전송이며, &lt;strong&gt;쿼리&lt;/strong&gt; 실행 &lt;strong&gt;속도&lt;/strong&gt;는 7배 더 느립니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;외부 BLOB 스토리지는 16KB의 블록에 공간을 할당하고 단일 블록에는 여러 항목을 담을 수 없기 때문에 블롭이 작고 각각 8KB씩 차지하는 경우 할당된 실제 공간이 두 &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;언젠가 이 디자인이 고쳐지길 바랍니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL은 크고 작은 모든 블롭을 DB에 저장하는 접두사 없이 외부 스토리지에 저장하며, 모든 크기의 항목에 대해 외부 스토리지 할당이 효율적입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제가 발생하기 전에 BLOB/TEXT 열을 &lt;strong&gt;분리&lt;/strong&gt;하는 것이 유일하게 합리적인 해결책인 것 같습니다. 다른 테이블이나 파일 시스템(각 BLOB 값은 파일로 유지됨)으로 분리하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;[업데이트 2019-10-15]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;InnoDB 문서는 이제 위에서 논의한 문제에 대한 궁극적인 해답을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;BLOB/TEXT 값의 768바이트 접두사를 인라인에 저장하는 경우는 &lt;strong&gt;COMPCT&lt;/strong&gt; 행 형식에 실제로 적용됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서에 따르면 &quot;각 비 &lt;em&gt;NULL&lt;/em&gt; 가변 &lt;em&gt;길이 필드(...)에 대해 내부 부품은 768바이트&lt;/em&gt;입니다.&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 &lt;strong&gt;Dynamic&lt;/strong&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;em&gt;InnoDB는 오버플로 페이지에 대한 20바이트 포인터만을 포함하는 클러스터 인덱스 레코드와 함께 &lt;/em&gt;긴 &lt;em&gt;가변길이&lt;/em&gt; 열 &lt;em&gt;값(...)&lt;/em&gt;을 &lt;em&gt;&lt;strong&gt;완전히 오프페이지&lt;/strong&gt;&lt;/em&gt;에 &lt;em&gt;저장&lt;/em&gt;할 수 &lt;em&gt;있습니다. (...) TEXT &lt;/em&gt;및&lt;em&gt; BLOB 열은 40바이트 이하로 일렬로 저장됩니다.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 BLOB 값은 최대 &lt;strong&gt;40바이트&lt;/strong&gt;의 인라인 스토리지를 차지할 수 있습니다. 이는 COMPRATE 모드에서와 마찬가지로 768바이트보다 훨씬 나은 수준이며 테이블에서 BLOB 유형과 비 BLOB 유형을 혼합하고 여러 행을 상당히 빠르게 검색할 수 있는 경우에는 훨씬 합리적인 접근 방식으로 보입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 확장(20바이트 이상) 인라인 스토리지는 크기가 20-40바이트인 값의 경우에만 사용됩니다. 값이 큰 경우에는 COMPRAT 모드와 달리 20바이트 포인터만 저장됩니다(접두사 없음).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 확장된 40바이트 스토리지는 실제로 거의 사용되지 않으며 인라인 스토리지의 평균 크기를 20바이트(또는 BLOB에 20B 미만의 작은 값을 많이 유지하는 경우)로 가정할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대체적으로 InnoDB에서 BLOB 열의 예측 가능한 성능을 높이기 위해서는 대부분의 경우 COMPRATE가 아닌 Dynamic 행 형식이 기본적인 선택이 되어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;InnoDB에서 실제 물리적 스토리지를 확인하는 방법의 예는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://dba.stackexchange.com/a/210430/177276&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://dba.stackexchange.com/a/210430/177276&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;MyISAM&lt;/strong&gt;의 경우, BLOB에 대한 오프페이지 스토리지를 전혀 &lt;strong&gt;제공하지 않는&lt;/strong&gt; 것으로 보입니다(열선만 가능).&lt;/font&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://dev.mysql.com/doc/refman/5.7/en/dynamic-format.html&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://dev.mysql.com/doc/refman/5.7/en/dynamic-format.html&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://forums.mysql.com/read.php?24,105964,267596#msg-267596&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://forums.mysql.com/read.php?24,105964,267596#msg-267596&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 이 문제에 대해 한동안 연구를 하고 있었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 사람들이 기본 키 하나만 별도의 테이블에 있는 blob을 사용하고 blob 메타 데이터를 blob 테이블에 대한 외부 키가 있는 다른 테이블에 저장할 것을 권장합니다.&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;CREATE INDEX `IX_score_status` ON `completed_tests` (`score`, `status`);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MariaDB로 전환할 수 있다면 테이블 제거 최적화를 최대한 활용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 BLOB 필드를 자신의 테이블로 분할하고 보기를 사용하여 왼쪽 조인을 사용하여 기존 테이블 구조를 재생성할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 쿼리 실행에 명시적으로 필요한 경우에만 BLOB 데이터에 액세스할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블롭이 있는 테이블에 대해 WHERE 쿼리 후 사용되는 필드에 인덱스 또는 인덱스를 추가하기만 하면 됩니다.&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;users : USERID, NAME, ...
userphotos : BLOBID, BLOB, USERNO, ...

select * from userphotos where USERNO=123456; 
&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;대용량 이미지(예: BLOB, MEDIAL BLOB 또는 LONG BLOB 총 5GB 이상)가 많을 경우 BLOB에 비해 많은 시간(분 이상)이 소요됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ID가 기본 키입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WHERE 절에 BLOB 테이블 필드에 대한 인덱스가 없으면 MySQL은 이미지를 포함한 전체 데이터를 검색하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터가 점점 더 커지면 시간이 많이 걸립니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;USERNO 필드에 대한 인덱스를 생성하면 데이터베이스 속도가 빨라지고 전체 데이터 크기에 따라 독립적으로 처리됩니다.&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;pre&gt;&lt;code&gt;**Add Index to the USERNO at userphotos**
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문에 대한 답으로 ct.status에 대한 인덱스를 만들어야 합니다.&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/9511476/speed-of-mysql-query-on-tables-containing-blob-depends-on-filesystem-cache&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MySQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/945</guid>
      <comments>https://nicesource.tistory.com/945#entry945comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:45:12 +0900</pubDate>
    </item>
    <item>
      <title>$.get of jquery는 비동기식입니까?</title>
      <link>https://nicesource.tistory.com/944</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$.get of jquery는 비동기식입니까?&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;$.ajax
&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;$.get&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;인터넷으로 조금 검색해봤지만, 아직도 둘의 차이를 100% 확신할 수는 없습니다.&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;$.get&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;$.ajax&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;$.get&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;$.ajax&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;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;이것은 Ajax의 축약 함수로, 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});
&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;async&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;async&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;true&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;async&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery의 미래 버전에서는 완전히 사라질 것입니다; 그것은 &lt;strong&gt;항상&lt;/strong&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;$.get&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;$.ajax&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;/blockquote&gt; 
&lt;p&gt;&lt;code&gt;$.ajax&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;$.get&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://api.jquery.com/jQuery.get/&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;$.get&lt;/code&gt;&lt;/a&gt; 는 단순히 다음의 약자입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});
&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;jQuery&lt;/code&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://api.jquery.com/jQuery.ajax/&quot; rel=&quot;nofollow&quot;&gt;문서화&lt;/a&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.get&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;$.ajax&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;$.jajax with GET method, 이것은 약속 대상으로 하는 것이 어떻습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function showResults(name) { 
        var deferred = $.Deferred, requests = [];

        requests.push($.ajax({url:&quot;/path/to/uri/?name=&quot; + name, type: &quot;GET&quot;, async: false}).done(function(d) { 
         //alert or process the results as you wish 
        }));
        $.when.apply(undefined, requests).then(function(d) { console.log(d); /*var d is a promised late return */ deferred.resolve(); }); 
        return deferred.promise();

    }
&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;$.when(showResults('benjamin')).done(function() { });&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;당신은 또한 $.delered 요청의 루프에 이 함수를 넣을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function updateResults() { 
             var deferred = $.Deferred, requests = [];
             requests.push($.ajax(url:&quot;/path/to/names/?nameArr=&quot; + jsonArrOfNames, type: &quot;GET&quot;, async: false}).done(function(res) {  requests.push(showResults(res[0]));}) );
             $.when.apply($, requests).then(function(d) { console.log(d); /*var d is a promised late return */  deferred.resolve(); }); 
             return deferred.promise();
            }
&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/13671798/is-get-of-jquery-asynchronous&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Ajax</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/944</guid>
      <comments>https://nicesource.tistory.com/944#entry944comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:45:04 +0900</pubDate>
    </item>
    <item>
      <title>AngularJS 지시 콜백</title>
      <link>https://nicesource.tistory.com/943</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;AngularJS 지시 콜백&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 그것이 작동하지 않는 단순한 &lt;a href=&quot;http://plnkr.co/edit/LCiNNRbNv6eTXd7BQcFp?p=preview&quot;&gt;실패&lt;/a&gt;를 가지고 있습니다.&lt;/font&gt;&lt;/p&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;&amp;lt;body ng-controller=&quot;ParentController&quot;&amp;gt;
    &amp;lt;h1&amp;gt; Method Arguments &amp;lt;/h1&amp;gt;
    &amp;lt;h3&amp;gt; open console to view output&amp;lt;/h3&amp;gt;
    &amp;lt;hello-world onLoadCallback=&quot;myCallback(arg1)&quot;&amp;gt;&amp;lt;/hello-world&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;javascript 파일:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var app = angular.module(&quot;app&quot;,[]);

function ParentController($scope) {
  $scope.myCallback = function(var1){
    console.log(&quot;myCallback&quot;, var1);
  }
}
app.directive('helloWorld', function() {
  return {
      restrict: 'AE',
      template: '&amp;lt;h3&amp;gt;Hello World!!&amp;lt;/h3&amp;gt;',
      scope:{
            onLoadCallback: '&amp;amp;'
        },
        link: function(scope, element, attrs, dateTimeController) {
            console.log('linked directive, not calling callback')
            scope.onLoadCallback('wtf');

      }
  };
});
&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작업:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;hello-world on-load-callback=&quot;myCallback(arg1)&quot;&amp;gt;&amp;lt;/hello-world&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&gt;&lt;code&gt;&amp;lt;hello-world onLoadCallback=&quot;myCallback(arg1)&quot;&amp;gt;&amp;lt;/hello-world&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&gt;&lt;code&gt;scope.onLoadCallback({arg1: 'wtf'});
&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/24640284/angularjs-directive-callback&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>angularjs</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/943</guid>
      <comments>https://nicesource.tistory.com/943#entry943comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:57 +0900</pubDate>
    </item>
    <item>
      <title>Twitter Bootstrap으로 요소를 수평 또는 수직으로 중앙에 배치하려면 어떻게 해야 합니까?</title>
      <link>https://nicesource.tistory.com/942</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Twitter Bootstrap으로 요소를 수평 또는 수직으로 중앙에 배치하려면 어떻게 해야 합니까?&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;strong&gt;업데이트&lt;/strong&gt;: 지난 2013년 초에는 이 답변이 맞았을 가능성이 높았지만, 더 이상 사용해서는 안 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;적절한 솔루션은 다음과 같은 &lt;a href=&quot;https://stackoverflow.com/a/40002430/1729885&quot;&gt;오프셋을 사용&lt;/a&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class=&quot;mx-auto&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&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=&quot;text-center&quot;
class=&quot;pagination-centered&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://getbootstrap.com/css/#helper-classes-center&quot; rel=&quot;noreferrer&quot;&gt;부트스트랩 설명서&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;display: block&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;margin&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;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;center-block&quot;&amp;gt;...&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;div에서 이미지의 중심을 맞추려고 하는데 이미지의 중심이 맞지 않는 경우, 다음과 같이 문제를 설명할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://jsfiddle.net/e0cr1nL2/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS Fiddle 문제 데모&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;col-sm-4 text-center&quot;&amp;gt;
    &amp;lt;img class=&quot;img-responsive text-center&quot; src=&quot;myPic.jpg&quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&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;img-responsive&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;수업은 a를 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display:block&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-align:center&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-center&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;&amp;lt;div class=&quot;col-sm-4&quot;&amp;gt;
    &amp;lt;img class=&quot;img-responsive center-block&quot; src=&quot;myPic.jpg&quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://jsfiddle.net/e0cr1nL2/1/&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS Fiddle 솔루션 데모&lt;/font&gt;&lt;/strong&gt;&lt;/a&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;center-block&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;display:block&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;img-responsive&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;img-responsive&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-center&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;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 &lt;a href=&quot;https://www.w3schools.com/bootstrap4/bootstrap_flex.asp&quot; rel=&quot;nofollow noreferrer&quot;&gt;이제 부트스트랩 4는 플렉스박스&lt;/a&gt;를 기본적으로 &lt;a href=&quot;https://www.w3schools.com/bootstrap4/bootstrap_flex.asp&quot; rel=&quot;nofollow noreferrer&quot;&gt;사용&lt;/a&gt;하기 때문에 &lt;a href=&quot;https://medium.com/codingthesmartway-com-blog/introduction-to-bootstrap-4-flex-layout-flexbox-for-bootstrap-f85405ce5ebf&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;&lt;a href=&quot;https://www.youtube.com/watch?v=k32voqQhODc&quot; rel=&quot;nofollow noreferrer&quot;&gt;Brad Schiff가 만든&lt;/a&gt; 훌륭하고 빠르게 진행되는 &lt;a href=&quot;https://www.youtube.com/watch?v=k32voqQhODc&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;여기 멋진 &lt;a href=&quot;https://yoksel.github.io/flex-cheatsheet/&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;&lt;strong&gt;부트스트랩 4&lt;/strong&gt;에서는 &lt;strong&gt;센터링&lt;/strong&gt; 방식이 변경되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부트 스트랩의 수평 중앙 4&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;text-center&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;display:inline&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;code&gt;mx-auto&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;center-block&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;display: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;/li&gt; 
 &lt;li&gt;&lt;code&gt;offset-*&lt;/code&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/em&gt;&lt;/font&gt; &lt;code&gt;mx-auto&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;/ul&gt; 
&lt;p&gt;&lt;code&gt;mx-auto&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(자동 x축 여백) 가운데로 이동&lt;/font&gt;&lt;/font&gt;&lt;code&gt;display:block&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;display:flex&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;%&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;vw&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;px&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;strong&gt;플렉스박스&lt;/strong&gt;는 그리드 컬럼에서 &lt;strong&gt;기본적으로 사용&lt;/strong&gt;되므로 플렉스박스 센터링 방법도 다양합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.codeply.com/go/SOSvvKpLOc&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;데모&lt;/strong&gt; 부트스트랩 4 수평 센터링&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;BS4의 수직 센터링에 대해서는 다음을 참조하십시오.&lt;/font&gt;&lt;/strong&gt; &lt;a href=&quot;https://stackoverflow.com/a/41464397&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://stackoverflow.com/a/41464397&lt;/font&gt;&lt;/a&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;/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-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;.content {
  position: absolute;
  top: 50%;
  left:50%;
  transform: translate(-50%,-50%);
  }&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;content&quot; &amp;gt;
  
   &amp;lt;p&amp;gt; some text &amp;lt;/p&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&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt;
    html, body {
        height: 100%;
        margin: 0;
        padding: 0 0;
    }

    .container-fluid {
        height: 100%;
        display: table;
        width: 100%;
        padding-right: 0;
        padding-left: 0;
    }

    .row-fluid {
        height: 100%;
        display: table-cell;
        vertical-align: middle;
        width: 100%;
    }

    .centering {
        float: none;
        margin: 0 auto;
    }
&amp;lt;/style&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container-fluid&quot;&amp;gt;
        &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
            &amp;lt;div class=&quot;offset3 span6 centering&quot;&amp;gt;
                content here
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&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&gt;&lt;code&gt;.centering{
float:none;
margin:0 auto
}

 &amp;lt;div class=&quot;span8 centering&quot;&amp;gt;&amp;lt;/div&amp;gt;
&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;부트스트랩 4를 사용하면 플렉스 기반 HTML 클래스를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;d-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;justify-content-center&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;align-items-center&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;/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-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;/&amp;gt;
&amp;lt;div class=&quot;d-flex justify-content-center align-items-center&quot;&amp;gt;
    &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;Create&amp;lt;/button&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&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처 : &lt;a href=&quot;https://getbootstrap.com/docs/4.1/utilities/flex/&quot; rel=&quot;nofollow noreferrer&quot;&gt;부트스트랩 4.1&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 &lt;a href=&quot;https://stackoverflow.com/a/25036303&quot;&gt;비슷한 질문&lt;/a&gt;에서 나온 이 &lt;a href=&quot;https://stackoverflow.com/a/25036303&quot;&gt;솔루션&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;text-center&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;&amp;lt;td&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;&amp;lt;th&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;/p&gt; 
 &lt;p&gt;&lt;code&gt;&amp;lt;td class=&quot;text-center&quot;&amp;gt;Cell data&amp;lt;/td&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;&amp;lt;th class=&quot;text-center&quot;&amp;gt;Header cell data&amp;lt;/th&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부트스트랩 4에서 당신이 할 수 있는 것을 발견했습니다.&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;strong&gt;중앙 수평&lt;/strong&gt;은 정말로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;text-center&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;strong&gt;center vertical&lt;/strong&gt; 하지만 부트스트랩 클래스를 사용하면 둘 다 추가됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mb-auto mt-auto&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;부트스트랩 4의 플렉스 특성 사용으로 이를 해결할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&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-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;/&amp;gt;
&amp;lt;div class=&quot;d-flex justify-content-center align-items-center&quot;&amp;gt;
    &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;Create&amp;lt;/button&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&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://getbootstrap.com/docs/4.3/utilities/flex/#justify-content&quot; rel=&quot;nofollow noreferrer&quot;&gt;부트스트랩용&lt;/a&gt;으로 몇개 품목의 수직 중앙 4개&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유연성 규칙을 위한 &lt;strong&gt;d-flex&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항목의 수직 방향에 대한 &lt;strong&gt;flex-column&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;align-&lt;strong&gt;items&lt;/strong&gt;-중심 수평중심&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;justice-content-center&lt;/strong&gt;:수직 중심 맞춤&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;style=&lt;/strong&gt;'높이:&lt;strong&gt; px&lt;/strong&gt;;' 중심이 계산되거나 h-100 클래스를 &lt;strong&gt;사용&lt;/strong&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-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;/&amp;gt;
&amp;lt;div class=&quot;d-flex flex-column align-items-center justify-content-center bg-secondary&quot; style=&quot;
    height: 300px;
&quot;&amp;gt;
    &amp;lt;div class=&quot;p-2 bg-primary&quot;&amp;gt;Flex item&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;p-2 bg-primary&quot;&amp;gt;Flex item&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;p-2 bg-primary&quot;&amp;gt;Flex item&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&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부트스트랩 5를 사용하면 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;my-auto&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;URL : https://stackoverflow.com/questions/10088706/how-can-i-center-elements-horizontally-or-vertically-with-twitter-bootstrap&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>CSS</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/942</guid>
      <comments>https://nicesource.tistory.com/942#entry942comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:50 +0900</pubDate>
    </item>
    <item>
      <title>C++ 함수 포인터를 C 함수 포인터로 변환</title>
      <link>https://nicesource.tistory.com/941</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C++ 함수 포인터를 C 함수 포인터로 변환&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 C 라이브러리를 이용하여 C++ 어플리케이션을 개발하고 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 라이브러리에 기능할 포인터를 보내야 합니다.&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 MainWindow : public QMainWindow {  
     Q_OBJECT  
     public:  
     explicit MainWindow(QWidget *parent = 0);  
     private:  
     Ui::MainWindow *ui;
     void f(int*);

 private slots:
     void on_btn_clicked(); 
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 on_btn_clicked 함수입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void MainWindow::on_btn_clicked()
{
    void (MainWindow::* ptfptr) (int*) = &amp;amp;MainWindow::f;

    c_library_function(static_cast&amp;lt;void()(int*)&amp;gt;(ptfptr), NULL);

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 함수는 이러한 함수인 void f(int*)에 대한 포인터를 가져와야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 위의 코드가 작동하지 않아 f멤버 기능을 원하는 포인터로 변환할 수 없습니다.&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;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 일반적으로 C를 통해 &lt;strong&gt;정적&lt;/strong&gt; 멤버 함수에 포인터를 전달할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 C API에 콜백을 등록할 때 &quot;사용자 데이터&quot; 포인터를 전달하여 등록된 기능으로 다시 전달합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class MyClass
{

    void non_static_func(/* args */);

public:
    static void static_func(MyClass *ptr, /* other args */) {
        ptr-&amp;gt;non_static_func(/* other args */);
    }
};
&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;c_library_function(MyClass::static_func, this);
&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;extern &quot;C&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;전달을 위한 정적 멤버가 아닌(declared를 a로)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;friend&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;필요한 경우), 하지만 실제로 이 방법을 사용하여 C 콜백이 많은 GObject 코드와 C++ 코드를 인터페이스하는 데 문제가 발생한 적은 없습니다.&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;인스턴스 매개변수를 사용하여 통화를 수행하는 정적 함수 또는 전역 함수를 만드는 것이 가능합니다.&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;template &amp;lt;typename T&amp;gt;
struct Callback;

template &amp;lt;typename Ret, typename... Params&amp;gt;
struct Callback&amp;lt;Ret(Params...)&amp;gt; {
    template &amp;lt;typename... Args&amp;gt;
    static Ret callback(Args... args) { return func(args...); }
    static std::function&amp;lt;Ret(Params...)&amp;gt; func;
};

// Initialize the static member.
template &amp;lt;typename Ret, typename... Params&amp;gt;
std::function&amp;lt;Ret(Params...)&amp;gt; Callback&amp;lt;Ret(Params...)&amp;gt;::func;
&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;std::bind&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;)를 사용하여 c-pointer로 변환합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Callback::callback&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct Foo {
    void print(int* x) { // Some member function.
        std::cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; std::endl;
    }
};

int main() {
    Foo foo; // Create instance of Foo.

    // Store member function and the instance using std::bind.
    Callback&amp;lt;void(int*)&amp;gt;::func = std::bind(&amp;amp;Foo::print, foo, std::placeholders::_1);

    // Convert callback-function to c-pointer.
    void (*c_func)(int*) = static_cast&amp;lt;decltype(c_func)&amp;gt;(Callback&amp;lt;void(int*)&amp;gt;::callback);

    // Use in any way you wish.
    std::unique_ptr&amp;lt;int&amp;gt; iptr{new int(5)};
    c_func(iptr.get());
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 정확히 기억한다면, 클래스의 정적 메서드만 함수 구문에 &quot;정상&quot; C 포인터를 통해 액세스할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러니까 정적으로 만들어 보세요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;클래스의 메서드에 대한 포인터는 순수 C 메서드에 대한 의미가 없는 &quot;개체&quot;(이것)와 같은 추가 정보가 필요합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;https://isocpp.org/wiki/faq/pointers-to-members#memfnptr-vs-fnptr&quot; rel=&quot;noreferrer&quot;&gt;여기&lt;/a&gt;에 나와 있는 FAQ에는 문제에 대한 좋은 설명과 가능한 (못생긴) 해결책이 나와 있습니다.&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;@Snps의 대답은 훌륭합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항상 사용하던 콜백을 만드는 메이커 기능으로 확장하였습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;void&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;typedef void (*voidCCallback)();
template&amp;lt;typename T&amp;gt;
voidCCallback makeCCallback(void (T::*method)(),T* r){
  Callback&amp;lt;void()&amp;gt;::func = std::bind(method, r);
  void (*c_function_pointer)() = static_cast&amp;lt;decltype(c_function_pointer)&amp;gt;(Callback&amp;lt;void()&amp;gt;::callback);
  return c_function_pointer;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그때부터 클래스 내 또는 다른 곳에서 일반 C 콜백을 생성하고 구성원에게 다음과 같은 호출을 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;voidCCallback callback = makeCCallback(&amp;amp;Foo::print, this);
plainOldCFunction(callback);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@Snps의 대답은 완벽합니다!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 @DXM이 언급했듯이 콜백은 한 번만 유지할 수 있습니다.&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; #include &amp;lt;type_traits&amp;gt;

template&amp;lt;typename T&amp;gt;
struct ActualType {
    typedef T type;
};
template&amp;lt;typename T&amp;gt;
struct ActualType&amp;lt;T*&amp;gt; {
    typedef typename ActualType&amp;lt;T&amp;gt;::type type;
};

template&amp;lt;typename T, unsigned int n,typename CallerType&amp;gt;
struct Callback;

template&amp;lt;typename Ret, typename ... Params, unsigned int n,typename CallerType&amp;gt;
struct Callback&amp;lt;Ret(Params...), n,CallerType&amp;gt; {
    typedef Ret (*ret_cb)(Params...);
    template&amp;lt;typename ... Args&amp;gt;
    static Ret callback(Args ... args) {
        func(args...);
    }

    static ret_cb getCallback(std::function&amp;lt;Ret(Params...)&amp;gt; fn) {
        func = fn;
        return static_cast&amp;lt;ret_cb&amp;gt;(Callback&amp;lt;Ret(Params...), n,CallerType&amp;gt;::callback);
    }

    static std::function&amp;lt;Ret(Params...)&amp;gt; func;

};

template&amp;lt;typename Ret, typename ... Params, unsigned int n,typename CallerType&amp;gt;
std::function&amp;lt;Ret(Params...)&amp;gt; Callback&amp;lt;Ret(Params...), n,CallerType&amp;gt;::func;

#define GETCB(ptrtype,callertype) Callback&amp;lt;ActualType&amp;lt;ptrtype&amp;gt;::type,__COUNTER__,callertype&amp;gt;::getCallback
&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;typedef void (cb_type)(uint8_t, uint8_t);
class testfunc {
public:
    void test(int x) {
        std::cout &amp;lt;&amp;lt; &quot;in testfunc.test &quot; &amp;lt;&amp;lt;x&amp;lt;&amp;lt; std::endl;
    }

    void test1(int x) {
        std::cout &amp;lt;&amp;lt; &quot;in testfunc.test1 &quot; &amp;lt;&amp;lt;x&amp;lt;&amp;lt; std::endl;
    }

};

cb_type* f = GETCB(cb_type, testfunc)(std::bind(&amp;amp;testfunc::test, tf, std::placeholders::_2));

cb_type* f1 = GETCB(cb_type, testfunc)(
                std::bind(&amp;amp;testfunc::test1, tf, std::placeholders::_2));


f(5, 4);
f1(5, 7);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단히 말하면 &lt;a href=&quot;http://en.cppreference.com/w/cpp/utility/functional/mem_fn&quot; rel=&quot;nofollow&quot;&gt;std::mem_fn&lt;/a&gt;을 사용하여 멤버 함수 포인터를 일반 C 함수 포인터로 변환할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 주어진 질문에 대한 답이지만, 질문자는 C 코드가 메인 윈도우*를 갖지 않고 메인 윈도우의 인스턴스 메서드를 호출할 수 있을 것으로 예상하기 때문에 이 질문은 혼란스러운 전제를 가지고 있는 것 같습니다.&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;mem_fn을 사용하여 캐스팅할 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MainWindow::on_btn_clicked&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;C 함수 포인터에, 당신은 여전히 a를 취하는 함수.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MainWindow*&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;void (*window_callback)(MainWindow*,int*) = std::mem_fn(&amp;amp;MainWindow::on_btn_clicked);
&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;호출을 특정 인스턴스에 래핑하려면 C 함수를 작성해야 합니다(결국 C API 코드는 메인 윈도우 또는 메인 윈도우의 특정 인스턴스에 대해 아무것도 알지 못합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void window_button_click_wrapper(int* arg)
{
    MainWindow::inst()-&amp;gt;on_btn_clicked(arg);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 OO 안티패턴으로 간주되지만, C API는 당신의 객체에 대해 아무것도 모르기 때문에 이것만이 유일한 방법입니다.&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;extern &quot;C&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;pre&gt;&lt;code&gt;class MainWindow;

static MainWindow* instance;

class MainWindow
{
public:
  MainWindow()
  {
    instance = this;

    registerCallback([](int* arg){instance-&amp;gt;...});
  }
};
&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;MainWindow&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;URL : https://stackoverflow.com/questions/19808054/convert-c-function-pointer-to-c-function-pointer&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/941</guid>
      <comments>https://nicesource.tistory.com/941#entry941comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:42 +0900</pubDate>
    </item>
    <item>
      <title>WordPress 웹사이트 게시물 테이블에 HTML 컨텐츠 저장 이슈 발생</title>
      <link>https://nicesource.tistory.com/940</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WordPress 웹사이트 게시물 테이블에 HTML 컨텐츠 저장 이슈 발생&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;WordPress에서 페이지/게시물을 저장/미리 보기/게시하려고 하면 연결 재설정 문제가 나타납니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 HTML 코드가 포함된 컨텐츠에서만 발생합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 일반 텍스트에서 잘 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;처음에는 WP 이슈인 줄 알았는데 단말기를 통한 업데이트 쿼리는 물론 php myadmin에서 직접 시도해도 컨텐츠 업데이트에 실패했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 열에 대해 utf8_unicode_ci 및 utf8mb4_unicode_ci와 같은 대조를 시도했습니다.&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;font papago-translate=&quot;translated&quot;&gt;WP 문제가 아니라고 확신합니다.&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;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;웹 서버&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Apache/2.4.6 (CentOS) PHP/5.6.35&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP 확장자: mysqli 설명서&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP 버전: 5.6.35&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버 유형:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마리아DB&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버 버전: 5.5.56-Maria&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DB&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;phphmyadmin&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전 정보 : 4.4.15.10&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/3arCe.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/3arCe.png&quot; alt=&quot;php myadmin error response&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;웹 서버 로그나 mariadb 로그에서 힌트를 찾을 수 없습니다.&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;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정말 고마워.&lt;/font&gt;&lt;/h2&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;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/51474177/html-content-save-issue-in-posts-table-of-wordpress-website&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MariaDB</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/940</guid>
      <comments>https://nicesource.tistory.com/940#entry940comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:33 +0900</pubDate>
    </item>
    <item>
      <title>Wordpress에서 WooCommerce &amp;quot;My Account&amp;quot; 메뉴의 URL을 변경하려면 어떻게 해야 합니까?</title>
      <link>https://nicesource.tistory.com/939</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Wordpress에서 WooCommerce &quot;My Account&quot; 메뉴의 URL을 변경하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Wordpress에서 WooCommerce 플러그인을 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;wooCommerce에서 만든 &quot;my-account&quot; 페이지에 나타나는 &quot;다운로드&quot; 링크의 URL을 변경하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/HNxCV.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/HNxCV.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;/my-account/downloads/&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;/customer-area/dashboard/&lt;/code&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;function wpb_woo_my_account_order() {
    $myorder = array(
        'edit-account'       =&amp;gt; __( 'Change My Details', 'woocommerce' ),
        'dashboard'          =&amp;gt; __( 'Dashboard', 'woocommerce' ),
        'orders'             =&amp;gt; __( 'Orders', 'woocommerce' ),
        'customer-area/dashboard' =&amp;gt; __( 'Download MP4s', 'woocommerce' ),
        'edit-address'       =&amp;gt; __( 'Addresses', 'woocommerce' ),
        'payment-methods'    =&amp;gt; __( 'Payment Methods', 'woocommerce' ),
        'customer-logout'    =&amp;gt; __( 'Logout', 'woocommerce' ),
    );
    return $myorder;
}
add_filter ( 'woocommerce_account_menu_items', 'wpb_woo_my_account_order' );
&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;/my-account/&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예전에 내가 했던 방식은 우커머스를 통해 엔드포인트 URL을 변경하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;woocommerce_get_endpoint_url&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_filter('woocommerce_get_endpoint_url', 'woocommerce_hacks_endpoint_url_filter', 10, 4);
function woocommerce_hacks_endpoint_url_filter($url, $endpoint, $value, $permalink) {
    $downloads = get_option('woocommerce_myaccount_downloads_endpoint', 'downloads');
    if (empty($downloads) == false) {
        if ($endpoint == $downloads) {
            $url = '//example.com/customer-area/dashboard';
        }
    }
    return $url;
}
&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;$url&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;get_option()&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;downloads&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;URL : https://stackoverflow.com/questions/40026409/how-can-i-change-the-url-of-woocommerce-my-account-menu-in-wordpress&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>WordPress</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/939</guid>
      <comments>https://nicesource.tistory.com/939#entry939comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:26 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트에서 숫자를 10분의 1로 반올림하는 방법?</title>
      <link>https://nicesource.tistory.com/938</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트에서 숫자를 10분의 1로 반올림하는 방법?&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;숫자는 통화이므로 다음 예제와 같이 반올림합니다(소수점 2개).&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;192.168 =&amp;gt; &lt;strong&gt;192.20&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;192.11 =&amp;gt; &lt;strong&gt;192.20&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;192.21 =&amp;gt; &lt;strong&gt;192.30&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;192.26 =&amp;gt; &lt;strong&gt;192.30&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;192.20 =&amp;gt; &lt;strong&gt;192.20&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트를 이용하여 이를 달성하는 방법은?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본으로 제공되는 자바스크립트 기능은 표준논리에 따라 숫자를 반올림합니다(반올림하려면 5보다 작음).&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;/**
 * @param num The number to round
 * @param precision The number of decimal places to preserve
 */
function roundUp(num, precision) {
  precision = Math.pow(10, precision)
  return Math.ceil(num * precision) / precision
}

roundUp(192.168, 1) //=&amp;gt; 192.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;Math.round(price * 10)/10
&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;통화 형식을 유지하려면 Number 방법을 사용하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.toFixed()&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(Math.round(price * 10)/10).toFixed(2)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 String이 되겠지만 =)&lt;/font&gt;&lt;/em&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;// Arguments: number to round, number of decimal places
function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}
&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;alert(roundNumber(192.168,2));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;TheEye&lt;/em&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-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;var num = 192.16;
    
console.log(    Math.ceil(num * 10) / 10    );&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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OP는 두 가지를 기대합니다.&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;A. 상위 10위까지 반올림하고,&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;B. 100위 안에 0을 표시하는 것(통화에 대한 전형적인 필요).&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;다음은 수리야키란의 제안된 답변을 기반으로 하는 접근 방식입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//Arguments: number to round, number of decimal places.

function roundPrice(rnum, rlength) {
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength-1)) / Math.pow(10, rlength-1);
    var toTenths = newnumber.toFixed(rlength);
    return toTenths;
}

alert(roundPrice(678.91011,2)); // returns 679.00
alert(roundPrice(876.54321,2)); // returns 876.60
&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;첫 번째 것은 단순히 평소의 100분의 1로 반올림하고, 두 번째 것은 단순히 가장 가까운 100분의 1(더 큰)로 반올림합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(roundNumber(678.91011,2)); // returns 678.91

function ceilNumber(rnum, rlength) { 
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(ceilNumber(678.91011,2)); // returns 678.92
&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;math.pow()&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;function roundIt(num, precision) {
    var rounder = Math.pow(10, precision);
    return (Math.round(num * rounder) / rounder).toFixed(precision)
};
&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;Math.round()&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;Math.ceil()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반올림 대신에 반올림하는 것이 OP가 원했던 것입니다.&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;function limitDecimal(num,decimal){
     return num.toString().substring(0, num.toString().indexOf('.')) + (num.toString().substr(num.toString().indexOf('.'), decimal+1));
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;@AndrewMarshall answer를 오랫동안 사용해 왔지만 몇 가지 엣지 케이스를 발견했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 테스트는 통과되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;equals(roundUp(9.69545, 4), 9.6955);
equals(roundUp(37.760000000000005, 4), 37.76);
equals(roundUp(5.83333333, 4), 5.8333);
&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;// Closure
(function() {
  /**
   * Decimal adjustment of a number.
   *
   * @param {String}  type  The type of adjustment.
   * @param {Number}  value The number.
   * @param {Integer} exp   The exponent (the 10 logarithm of the adjustment base).
   * @returns {Number} The adjusted value.
   */
  function decimalAdjust(type, value, exp) {
    // If the exp is undefined or zero...
    if (typeof exp === 'undefined' || +exp === 0) {
      return Math[type](value);
    }
    value = +value;
    exp = +exp;
    // If the value is not a number or the exp is not an integer...
    if (isNaN(value) || !(typeof exp === 'number' &amp;amp;&amp;amp; exp % 1 === 0)) {
      return NaN;
    }
    // If the value is negative...
    if (value &amp;lt; 0) {
      return -decimalAdjust(type, -value, exp);
    }
    // Shift
    value = value.toString().split('e');
    value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
    // Shift back
    value = value.toString().split('e');
    return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
  }

  // Decimal round
  if (!Math.round10) {
    Math.round10 = function(value, exp) {
      return decimalAdjust('round', value, exp);
    };
  }
  // Decimal floor
  if (!Math.floor10) {
    Math.floor10 = function(value, exp) {
      return decimalAdjust('floor', value, exp);
    };
  }
  // Decimal ceil
  if (!Math.ceil10) {
    Math.ceil10 = function(value, exp) {
      return decimalAdjust('ceil', value, exp);
    };
  }
})();

// Round
Math.round10(55.55, -1);   // 55.6
Math.round10(55.549, -1);  // 55.5
Math.round10(55, 1);       // 60
Math.round10(54.9, 1);     // 50
Math.round10(-55.55, -1);  // -55.5
Math.round10(-55.551, -1); // -55.6
Math.round10(-55, 1);      // -50
Math.round10(-55.1, 1);    // -60
Math.round10(1.005, -2);   // 1.01 -- compare this with Math.round(1.005*100)/100 above
Math.round10(-1.005, -2);  // -1.01
// Floor
Math.floor10(55.59, -1);   // 55.5
Math.floor10(59, 1);       // 50
Math.floor10(-55.51, -1);  // -55.6
Math.floor10(-51, 1);      // -60
// Ceil
Math.ceil10(55.51, -1);    // 55.6
Math.ceil10(51, 1);        // 60
Math.ceil10(-55.59, -1);   // -55.5
Math.ceil10(-59, 1);       // -50
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;출처 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round&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;/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-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;let num = 5.56789;
let n = num.toFixed(2);
console.log(n); //output 5.57&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;parseInt는 항상 반올림합니다 soo...&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-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;console.log(parseInt(5.8)+1);&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;do parseInt()+1&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/5191088/how-to-round-up-a-number-to-a-precision-of-tenths-in-javascript&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JavaScript</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/938</guid>
      <comments>https://nicesource.tistory.com/938#entry938comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:19 +0900</pubDate>
    </item>
    <item>
      <title>Red Hat에 Maria DB(mysql) 설치.설치 후 서비스를 시작하려면 어떻게 해야 합니까?</title>
      <link>https://nicesource.tistory.com/937</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Red Hat에 Maria DB(mysql) 설치.&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;redhat에 mysql(maria db)을 설치했습니다.&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;pre&gt;&lt;code&gt;$sudo yum install mysql
&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;Installed:
  mariadb.x86_64 1:5.5.41-2.el7_0

Dependency Installed:
  perl.x86_64 4:5.16.3-285.el7               perl-Carp.noarch 0:1.26-244.el7                 perl-Encode.x86_64 0:2.51-7.el7                     perl-Exporter.noarch 0:5.68-3.el7
  perl-File-Path.noarch 0:2.09-2.el7         perl-File-Temp.noarch 0:0.23.01-3.el7           perl-Filter.x86_64 0:1.49-3.el7                     perl-Getopt-Long.noarch 0:2.40-2.el7
  perl-HTTP-Tiny.noarch 0:0.033-3.el7        perl-PathTools.x86_64 0:3.40-5.el7              perl-Pod-Escapes.noarch 1:1.04-285.el7              perl-Pod-Perldoc.noarch 0:3.20-4.el7
  perl-Pod-Simple.noarch 1:3.28-4.el7        perl-Pod-Usage.noarch 0:1.63-3.el7              perl-Scalar-List-Utils.x86_64 0:1.27-248.el7        perl-Socket.x86_64 0:2.010-3.el7
  perl-Storable.x86_64 0:2.45-3.el7          perl-Text-ParseWords.noarch 0:3.29-4.el7        perl-Time-HiRes.x86_64 4:1.9725-3.el7               perl-Time-Local.noarch 0:1.2300-2.el7
  perl-constant.noarch 0:1.27-2.el7          perl-libs.x86_64 4:5.16.3-285.el7               perl-macros.x86_64 4:5.16.3-285.el7                 perl-parent.noarch 1:0.225-244.el7
  perl-podlators.noarch 0:2.5.1-3.el7        perl-threads.x86_64 0:1.87-4.el7                perl-threads-shared.x86_64 0:1.43-6.el7
&lt;/code&gt;&lt;/pre&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;$ sudo service mysql start&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;/bin/systemctl start mysql.service 메서드 호출을 실행하지 못했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Unit mysql.service를 로드하지 못했습니다.&lt;/font&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;Red hat 버전을 사용하고 있습니다 - Red Hat Enterprise Linux Server Release 7.1 (마이포)&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;yum install mariadb-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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스의 이름은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mariadb&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;OS 7은 적어도...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 mariadb-server package를 설치한 후에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;systemctl enable mariadb&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;systemctl start mariadb&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;mysqld&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;mysql&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;$ service mysqld start
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 적절한 systemd 구문을 사용하는 것이 더 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ systemctl start mysqld
&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/30804013/maria-db-mysql-installation-on-red-hat-how-do-i-start-service-after-installa&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MariaDB</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/937</guid>
      <comments>https://nicesource.tistory.com/937#entry937comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:10 +0900</pubDate>
    </item>
    <item>
      <title>Zlib 압축이 워드프레스 다중 사이트의 파일에 대한 경로를 망쳤습니다.</title>
      <link>https://nicesource.tistory.com/936</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Zlib 압축이 워드프레스 다중 사이트의 파일에 대한 경로를 망쳤습니다.&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;Wordpress 3.6&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성능 향상을 위해 W3 Super Cache 플러그인을 사용할 수 있습니다.&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;a href=&quot;http://wpmu.org/dramatically-speed-up-wordpress-and-wpmu-load-times-with-this-simple-tip/&quot; rel=&quot;nofollow&quot;&gt;WPMU&lt;/a&gt;에서 '&lt;a href=&quot;http://wpmu.org/dramatically-speed-up-wordpress-and-wpmu-load-times-with-this-simple-tip/&quot; rel=&quot;nofollow&quot;&gt;손&lt;/a&gt;에 쥐는&lt;a href=&quot;http://wpmu.org/dramatically-speed-up-wordpress-and-wpmu-load-times-with-this-simple-tip/&quot; rel=&quot;nofollow&quot;&gt;' 팁&lt;/a&gt;이 있는데, 작가님이 추천해주신.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;zlib compression&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로드 시간 x3을 단축할 수 있습니다.&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;&amp;lt;?php 
    ini_set(’zlib.output_compression’, ‘On’);
    ini_set(’zlib.output_compression_level’, ‘1′);
?&amp;gt;
&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;&quot;즉각적으로 엄청난 성능 향상을 목격&quot;하는 대신에, 그것은 무엇인가를 망쳤습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;blogs.dir&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;위의 PHP 스니펫을 제거했지만, 링크는 여전히 먹통입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 찾아봤는데요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.htaccess&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;wp-config&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;zlib에서 입력된 것을 보지 못했습니다.&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;W3 Super Cache 파일을 지우십시오. 오래된 캐시된 복사본을 보게 될 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그 플러그인을 잘 모릅니다. 저는 W3TC를 사용하지만, 일종의 &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;캐싱 플러그인이 간섭하지 않는 한 설정을 영구링크로 이동하여 저장할 수도 있습니다(사용자를 위해 .htaccess 파일을 다시 작성합니다).&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/19598493/zlib-compression-screwed-up-path-to-files-in-wordpress-multisite&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>WordPress</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/936</guid>
      <comments>https://nicesource.tistory.com/936#entry936comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:44:04 +0900</pubDate>
    </item>
    <item>
      <title>json 개체에서 Angular.js 형식 날짜</title>
      <link>https://nicesource.tistory.com/935</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;json 개체에서 Angular.js 형식 날짜&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 json 응답은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[{&quot;Id&quot;:&quot;dab4580b-e24d-49f8-9fd5-2e968b10d3b5&quot;,&quot;Title&quot;:&quot;MVVM-Sidekick 入精&quot;,&quot;CreatedOn&quot;:&quot;\/Date(1390272893353)\/&quot;,&quot;IsChecked&quot;:false},{&quot;Id&quot;:&quot;66a0f134-e240-4cc4-96fa-ac3807853ca7&quot;,&quot;Title&quot;:&quot;Windows Phone 开发入精&quot;,&quot;CreatedOn&quot;:&quot;\/Date(1390018447080)\/&quot;,&quot;IsChecked&quot;:false}]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;CreatedOn&quot; 날짜의 형식은 '/Date(1390272893353)/'입니다.&lt;/font&gt;&lt;/p&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;&amp;lt;td&amp;gt;{{item.CreatedOn | date: 'yyyy-MM-dd HH:mm'}}&amp;lt;/td&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;/일자(1390272893353)/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서버 쪽의 코드를 변경하고 싶지 않습니다(json 문자열을 수정하지 않음). 이 날짜를 포맷하는 가장 좋은 방법은 무엇입니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 실제로 @Charminbear와 @Nikos의 답변을 조합했습니다. 이 필터는 꽤 잘 작동하고 정규 용어 없이도 꽤 명확합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;myApp.filter(&quot;jsDate&quot;, function () {
    return function (x) {
        return new Date(parseInt(x.substr(6)));
    };
});
&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;{{ $scope.item.CreatedOn | jsDate | date:&quot;yyyy-MM-dd&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;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;app.filter(&quot;mydate&quot;, function() {
    var re = /\/Date\(([0-9]*)\)\//;
    return function(x) {
        var m = x.match(re);
        if( m ) return new Date(parseInt(m[1]));
        else return 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;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;/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;td&amp;gt;{{item.CreatedOn | mydate | date: 'yyyy-MM-dd HH:mm'}}&amp;lt;/td&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;하지만 저는 제가 도움이 된 것이 무엇이었는지 말씀드리고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;td&amp;gt;{{item.yourdatefield.slice(6,-2) | date:'dd-MMM-yyyy' }}&amp;lt;/td&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;Angular Date-Filter는 JS-Date를 예상합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 JSON Date를 필터에 전달하기 전에 파싱해야 합니다.&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;td&amp;gt;{{item.CreatedOnParsed | date: 'yyyy-MM-dd HH:mm'}}&amp;lt;/td&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&gt;&lt;code&gt;$scope.item.CreatedOnParsed =  new Date(parseInt(item.CreatedOn.substr(6)));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 &lt;a href=&quot;https://stackoverflow.com/questions/206384/how-to-format-a-json-date&quot;&gt;답변&lt;/a&gt;에 나와 있는 바와 같이&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;EDIT&lt;/strong&gt; 방금 게시물의 댓글에서 알 수 있듯이 날짜 필터에는 타임스탬프만으로도 충분하므로 이 정도면 충분합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$scope.item.CreatedOnParsed =  item.CreatedOn.substr(6);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;//input - &quot;DocDate&quot;:&quot;\/Date(1127318400000-0000)\/&quot;
-------

&amp;lt;tr dir-paginate=&quot;user in SalesOrder&amp;gt;
    &amp;lt;td&amp;gt;{{user.DocDate | jsonDate}}&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;

controller
----------
app.filter('jsonDate', ['$filter', function ($filter) {
    return function (input, format) {
        return (input) 
               ? $filter('date')(parseInt(input.substr(6)), format) 
               : '';
    };
 }]);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;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;(function() {
    if (JSON &amp;amp;&amp;amp; !JSON.parseWithDate) {
        JSON.parseWithoutDate = JSON.parse; //Store the original JSON.parse function

        var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/;  
        var reMsAjax = /^\/Date\((d|-|.*)\)[\/|\\]$/;  

        JSON.parseWithDate = function (json) {  
            /// &amp;lt;summary&amp;gt;  
            /// parses a JSON string and turns ISO or MSAJAX date strings  
            /// into native JS date objects  
            /// &amp;lt;/summary&amp;gt;      
            /// &amp;lt;param name=&quot;json&quot; type=&quot;var&quot;&amp;gt;json with dates to parse&amp;lt;/param&amp;gt;          
            /// &amp;lt;/param&amp;gt;  
            /// &amp;lt;returns type=&quot;value, array or object&quot; /&amp;gt;  
            try {  
                var res = JSON.parseWithoutDate(json,
                function (key, value) {  
                    if (typeof value === 'string') {  
                        var a = reISO.exec(value);  
                        if (a)  
                            return new Date(Date.UTC(+a[1], +a[2] - 1,   
                                                     +a[3], +a[4], +a[5], +a[6]));  
                        a = reMsAjax.exec(value);  
                        if (a) {  
                            var b = a[1].split(/[-+,.]/);  
                            return new Date(b[0] ? +b[0] : 0 - +b[1]);  
                        }  
                    }  
                    return value;  
                });  
                return res;  
            } catch (e) {  
                // orignal error thrown has no error message so rethrow with message  
                throw new Error(&quot;JSON content could not be parsed&quot;);  
                return null;  
            }  
        };  
        JSON.dateStringToDate = function (dtString) {  
            /// &amp;lt;summary&amp;gt;  
            /// Converts a JSON ISO or MSAJAX string into a date object  
            /// &amp;lt;/summary&amp;gt;      
            /// &amp;lt;param name=&quot;&quot; type=&quot;var&quot;&amp;gt;Date String&amp;lt;/param&amp;gt;  
            /// &amp;lt;returns type=&quot;date or null if invalid&quot; /&amp;gt;   
            var a = reISO.exec(dtString);  
            if (a)  
                return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3],   
                                         +a[4], +a[5], +a[6]));  
            a = reMsAjax.exec(dtString);  
            if (a) {  
                var b = a[1].split(/[-,.]/);  
                return new Date(+b[0]);  
            }  
            return null;  
        };  
        JSON.stringifyWcf = function (json) {  
            /// &amp;lt;summary&amp;gt;  
            /// Wcf specific stringify that encodes dates in the  
            /// a WCF compatible format (&quot;/Date(9991231231)/&quot;)  
            /// Note: this format works ONLY with WCF.   
            ///       ASMX can use ISO dates as of .NET 3.5 SP1  
            /// &amp;lt;/summary&amp;gt;  
            /// &amp;lt;param name=&quot;key&quot; type=&quot;var&quot;&amp;gt;property name&amp;lt;/param&amp;gt;  
            /// &amp;lt;param name=&quot;value&quot; type=&quot;var&quot;&amp;gt;value of the property&amp;lt;/param&amp;gt;           
            return JSON.stringify(json, function (key, value) {  
                if (typeof value == &quot;string&quot;) {  
                    var a = reISO.exec(value);  
                    if (a) {  
                        var val = '/Date(' +   
                                  new Date(Date.UTC(+a[1], +a[2] - 1,   
                                           +a[3], +a[4],   
                                           +a[5], +a[6])).getTime() + ')/';  
                        this[key] = val;  
                        return val;  
                    }  
                }  
                return value;  
            })  
        };  
        //Make Date parsing the default
        JSON.parse = JSON.parseWithDate;
    }
})();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 가져온 것은 http://codepaste.net/i89xhc, 입니다. 다만 제가 표준 JSON.parse 함수를 날짜를 구문 분석하는 이 버전으로 덮어씁니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 Angular가 보는 모든 JSON에서 ASMX 날짜를 자동으로 파싱한다는 것을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각도 $http 변환을 사용하여 사용자 정의 변환을 작성할 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조: https://docs.angularjs.org/api/ng/service/$http&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것이 .net JSON 날짜이고 당신이 moment.js를 사용하고 있다고 가정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 &lt;a href=&quot;https://momentjs.com/docs/#/parsing/asp-net-json-date/&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기에 정의&lt;/a&gt;된 기능을 필터에 활용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; myApp.filter('JSONdate', [
       '$filter', function ($filter) {
           return function (input, appformat) {
               if (input != null) {
                   return moment(input).format(appformat);
                   // use the line below if you want to leverage the standard date filter on top of this 
                   // return $filter('date')(new Date(moment(input)), appformat);
               } else {
                   return '';
               }
           };
       }])
&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/22435212/angular-js-format-date-from-json-object&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>angularjs</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/935</guid>
      <comments>https://nicesource.tistory.com/935#entry935comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:43:57 +0900</pubDate>
    </item>
    <item>
      <title>두 날짜의 차이를 어떻게 계산할 수 있습니까?</title>
      <link>https://nicesource.tistory.com/934</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;2010년 1월 1일부터 2010년 2월 3일 사이의 날짜를 계산하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;NSDate *date1 = [NSDate dateWithString:@&quot;2010-01-01 00:00:00 +0000&quot;];
NSDate *date2 = [NSDate dateWithString:@&quot;2010-02-03 00:00:00 +0000&quot;];

NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];

int numberOfDays = secondsBetween / 86400;

NSLog(@&quot;There are %d days in between the two dates.&quot;, numberOfDays);
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집:&lt;/font&gt;&lt;/h3&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;NSDate&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;NSDateFormatter&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;NSDateFormatter&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;따라서 2개 사이의 초수&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NSDate&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한, 본 &lt;a href=&quot;https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW8&quot; rel=&quot;noreferrer&quot;&gt;문서&lt;/a&gt;에서는 Cocoa의 시간 구현이 도약 초를 설명하지 않는다는 점을 명시하고 있으므로, 이러한 정확성이 필요한 경우에는 자체 구현을 롤(roll)해야 합니다.&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;NSDateComponents *components;
NSInteger days;

components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
        fromDate: startDate toDate: endDate options: 0];
days = [components day];
&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;NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
&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;date1&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;date2&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;NSDate&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;NSTimeInterval&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;typedef double NSTimeInterval;
&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;iOS 달력을 활용해 계산한 만큼 일광절약, 윤년을 챙깁니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열 및 조건을 시간 및 일이 포함된 분으로 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate
{
    NSDateComponents *components;
    NSInteger days;
    NSInteger hour;
    NSInteger minutes;
    NSString *durationString;

    components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute fromDate: startDate toDate: endDate options: 0];

    days = [components day];
    hour = [components hour];
    minutes = [components minute];

    if(days&amp;gt;0)
    {
        if(days&amp;gt;1)
            durationString=[NSString stringWithFormat:@&quot;%d days&quot;,days];
        else
            durationString=[NSString stringWithFormat:@&quot;%d day&quot;,days];
        return durationString;
    }
    if(hour&amp;gt;0)
    {        
        if(hour&amp;gt;1)
            durationString=[NSString stringWithFormat:@&quot;%d hours&quot;,hour];
        else
            durationString=[NSString stringWithFormat:@&quot;%d hour&quot;,hour];
        return durationString;
    }
    if(minutes&amp;gt;0)
    {
        if(minutes&amp;gt;1)
            durationString = [NSString stringWithFormat:@&quot;%d minutes&quot;,minutes];
        else
            durationString = [NSString stringWithFormat:@&quot;%d minute&quot;,minutes];

        return durationString;
    }
    return @&quot;&quot;; 
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Swift 5 및 iOS 12에서는 필요에 따라 다음 두 가지 방법 중 하나를 사용하여 날짜 간의 차이를 일 단위로 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h2&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;Calendar&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;/h2&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let dateComponents = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)

print(dateComponents) // prints: day: 1621 isLeapMonth: false
print(String(describing: dateComponents.day)) // prints: Optional(1621)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;#2. 사용하기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DateComponentsFormatter&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;/h2&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [NSCalendar.Unit.day]

let elapsedTime = formatter.string(from: startDate, to: endDate)
print(String(describing: elapsedTime)) // prints: Optional(&quot;1,621 days&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트 4&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 해보고 (String을 사용한 날짜 범위)를 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Start &amp;amp; End date string
let startingAt = &quot;01/01/2018&quot;
let endingAt = &quot;08/03/2018&quot;

// Sample date formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = &quot;dd/MM/yyyy&quot;

// start and end date object from string dates
var startDate = dateFormatter.date(from: startingAt) ?? Date()
let endDate = dateFormatter.date(from: endingAt) ?? Date()


// Actual operational logic
var dateRange: [String] = []
while startDate &amp;lt;= endDate {
    let stringDate = dateFormatter.string(from: startDate)
    startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
    dateRange.append(stringDate)
}

print(&quot;Resulting Array - \(dateRange)&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스위프트 3&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var date1 = Date(string: &quot;2010-01-01 00:00:00 +0000&quot;)
var date2 = Date(string: &quot;2010-02-03 00:00:00 +0000&quot;)
var secondsBetween: TimeInterval = date2.timeIntervalSince(date1)
var numberOfDays: Int = secondsBetween / 86400
print(numberOfDays)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 큰 단위뿐만 아니라 모든 단위를 원한다면 다음 두 가지 방법 중 하나를 사용합니다(@Ankish의 답변 기준).&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;28 D | 23 H | 59 M | 59 S&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;+ (NSString *) remaningTime:(NSDate *)startDate endDate:(NSDate *)endDate
{
    NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *components = [[NSCalendar currentCalendar] components:units fromDate: startDate toDate: endDate options: 0];
    return [NSString stringWithFormat:@&quot;%ti D | %ti H | %ti M | %ti S&quot;, [components day], [components hour], [components minute], [components second]];
}

+ (NSString *) timeFromNowUntil:(NSDate *)endDate
{
    return [self remaningTime:[NSDate date] endDate:endDate];
}

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1970년 이후의 날짜와 시간 간격을 초 단위로 환산하면 그 차이를 알 수 있고 두 날짜의 차이를 알 수 있습니다.&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;다음의 경우, 저는 향후 날짜의 예시로 2일을 사용했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;계산 기준:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;2 days&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;24 hours&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;60 minutes&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;60 seconds&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이틀간의 초수는 172,800초가 될 것으로 예상됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Set the current and future date
let now = Date()
let nowPlus2Days = Date(timeInterval: 2*24*60*60, since: now)

// Get the number of seconds between these two dates
let secondsInterval = DateInterval(start: now, end: nowPlus2Days).duration

print(secondsInterval) // 172800.0
&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/4371757/how-can-i-calculate-the-difference-between-two-dates&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>swift</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/934</guid>
      <comments>https://nicesource.tistory.com/934#entry934comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:43:48 +0900</pubDate>
    </item>
    <item>
      <title>mysql feature- scaling</title>
      <link>https://nicesource.tistory.com/933</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql feature- scaling&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;이렇게 정규화된 값을 선택하기 위해 mysql 쿼리를 공식화해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;normalized = (value-min(values))/(max(values)-min(values))&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 
    Measurement_Values.Time, 
    ((Measurement_Values.Value-min(Measurement_Values.Value))/(max(Measurement_Values.Value)-min(Measurement_Values.Value))) 
from Measurement_Values  
where Measurement_Values.Measure_ID = 49 and Measurement_Values.time &amp;gt;= '2020-05-30 00:00'
&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;font papago-translate=&quot;translated&quot;&gt;질문하신 내용은 설명이 조금 부족하지만, 창 기능(MySQL 8.0에서만 사용 가능)을 원하시는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select 
    time, 
    value,
    (value - min(value) over() / (max(value) over() - min(value) over()) normalized_value
from measurement_values  
where measure_id = 49 and time &amp;gt;= '2020-05-30 00:00'
&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 
    mv.time, 
    mv.value,
    (mv.value - mx.min_value) / (mx.max_value - mx.min_value) normalized_value
from measurement_values  
cross join (
    select min(value) min_value, max(value) max_value
    from measurement_values
    where measure_id = 49 and time &amp;gt;= '2020-05-30 00:00'
) mx
where measure_id = 49 and time &amp;gt;= '2020-05-30 00:00'
&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/62211117/mysql-feature-scaling-calculation&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MariaDB</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/933</guid>
      <comments>https://nicesource.tistory.com/933#entry933comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:43:40 +0900</pubDate>
    </item>
    <item>
      <title>고유성 제약 조건을 조건부로 적용할 수 있습니까?</title>
      <link>https://nicesource.tistory.com/932</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;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;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 열을 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;isactive&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;(username, isactive)&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;두 개의 활성 사용자 이름을 가질 수 없습니다.&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;NULL&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;isactive&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;NULL&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;아니요, UNIECIAL 제약 조건은 &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;username&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열에서 NULL로 이동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UNIUIC 제약 조건은 NULL 값을 가진 여러 행을 허용합니다.&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;응용 프로그램 또는 SQL에서&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT IFNULL(t.username,'USER DELETED') AS username
  FROM mytable t
&lt;/code&gt;&lt;/pre&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;username&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;column. (값을 변경할 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;username&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;column(열) 그러면 다음 문장에서 이전 사용자 이름과 동일한 값의 행을 삽입할 수 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&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;pre&gt;&lt;code&gt;user_deleted TINYINT(1) UNSIGNED DEFAULT 0 COMMENT 'boolean' 
&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;'USER DELETED'&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;user_deleted&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 IF(u.user_deleted,'USER DELETED',u.username) AS username
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(논리적인 &quot;사용자 삭제&quot; 조건을 나타내려면 1 값을 사용합니다.)&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;username&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;username&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;value, UNIECIAL 제약 조건을 사용하면 사용자 이름이 중복된 새 행이 삽입되지 않습니다.&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;질문에 실제로 필요하지 않을 수도 있습니다.&lt;/font&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;삽입/업데이트 시 트리거 만들기&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;현재(NEW) 레코드 값으로 중복된 레코드가 있는지 확인합니다.&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;a. 중복 카운트를 통해 이를 확인하거나 동일한 값을 가진 다른 레코드를 확인할 수 있지만 기본 키가 다릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;발견된 경우 &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.5/en/signal.html&quot; rel=&quot;nofollow noreferrer&quot;&gt;신호&lt;/a&gt;를 올려 오류를 던집니다.&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;또한 성능 비용도 고려해야 합니다.&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;pre&gt;&lt;code&gt;DELIMITER $$

CREATE TRIGGER `my_trigger` BEFORE INSERT/UPDATE
    ON `usertable`
    FOR EACH ROW BEGIN

    IF EXISTS (SELECT 1 FROM usertable WHERE userid &amp;lt;&amp;gt; NEW.userid AND username = NEW.username AND isactive = 1) THEN 
        SELECT CONCAT(NEW.username, ' exists !') INTO @error_text; 



     SIGNAL SQLSTATE '45000' SET message_text = @error_text; 
    END IF;
    END$$

DELIMITER ;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;FORMER_NAME이라는 다른(고유하지 않은) 필드를 만들고 사용자가 비활성화되면 원래 이름을 해당 필드로 이동합니다.&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;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;USER DELETED 2013/08/17:233805&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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;열을 비활성으로 추가하므로 고유 키는 다음과 같습니다. (username, inactive)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;inactive, inactive = 0은 사용자가 활성임을 의미하며 inactive &amp;gt; 0은 사용자가 활성임을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자를 비활성화 할 때는 평소처럼 1개가 아닌 비활성 = user_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;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;nullable 기능을 제공하는 생성된 열을 추가하여 @gordon-linoff 답변을 확장했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 나중에 코드를 작성할 때 이 null 동작을 실수로 잊어버림으로써 혼란스럽지 않고 엉망이 되지 않는 읽고 쓸 수 있는 확실한 true 및 false 값을 가진 true not null active 열을 가지고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 나는 특정 이름을 가진 열을 계산한 다음 제약 조건에 그 값을 사용하므로 nullable 고유의 active 동작을 얻지만 active 열을 내가 원하는 대로 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sql prettyprint-override&quot;&gt;&lt;code&gt;isactive BOOL NOT NULL,
_isactive_constraint_key_ BOOL AS (CASE WHEN isactive IS true THEN true END),
CONSTRAINT active_user UNIQUE(username, _isactive_constraint_key)
&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/18293543/can-i-conditionally-enforce-a-uniqueness-constraint&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MySQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/932</guid>
      <comments>https://nicesource.tistory.com/932#entry932comment</comments>
      <pubDate>Sun, 5 Nov 2023 14:43:33 +0900</pubDate>
    </item>
    <item>
      <title>내 html 페이지에 각도 변수 표시</title>
      <link>https://nicesource.tistory.com/931</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 html 페이지에 각도 변수 표시&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;font class=&quot;papago-parent&quot;&gt;사용 중인 컨트롤러 내부에 다음과 같은 기능이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$http.get('/api/tasks/?format=json').success(function(data) {
        $scope.tasks = data;
        for (var i=0; i &amp;lt; $scope.tasks.results.length; i++)
        {
            if ($scope.tasks.results.status == 0)
            {
                tobedone++;
            }
        }
    });
&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&gt;&lt;code&gt;tobedone&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 html 페이지 안에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;[to be done]을 시도해 보았지만(저는 장고를 사용하고 있으므로 커스텀 프로바이더를 사용하고 있습니다) 아무것도 표시되지 않습니다.&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;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;템플릿에서 현재의 멤버인 모든 변수에 액세스할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$scope&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;tobedone&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;$scope.tobedone&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;{{tobedone}}&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;[[tobedone]]&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 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;URL : https://stackoverflow.com/questions/17044725/display-a-angular-variable-in-my-html-page&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>angularjs</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/931</guid>
      <comments>https://nicesource.tistory.com/931#entry931comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:24:28 +0900</pubDate>
    </item>
    <item>
      <title>할당 배열 VS 가변 길이 배열</title>
      <link>https://nicesource.tistory.com/930</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할당 배열 VS 가변 길이 배열&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;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;/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/31199566/whats-the-difference-between-a-vla-and-dynamic-memory-allocation-via-malloc&quot; dir=&quot;ltr&quot; papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;malloc을 통한 동적 메모리 할당과 VLA의 차이점은 무엇입니까?&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(4개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot; 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;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;4-1&quot; title=&quot;2016-12-01 10:07:29Z&quot; papago-attr-id=&quot;1&quot;&gt;6년 전&lt;/span&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&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;가장 일반적인 방법은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc&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;pre&gt;&lt;code&gt;int * array;
... // when we know the size
array = malloc(size*sizeof(int));
&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;하지만 크기를 알고 난 후에 배열을 정의하는 것은 C99에서도 유효합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;... // when we know the size
int array[size];
&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;strong papago-id=&quot;8-1&quot;&gt;완전히&lt;/strong&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;두 개체 모두 동일한 개체 수와 유형을 저장할 수 있지만, 다음 사항에 유의해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&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;free()&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;free()&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 class=&quot;papago-parent&quot;&gt;기술 용어에서는 malloc에 &lt;em papago-id=&quot;12-3&quot;&gt;할당&lt;/em&gt;하는 것과 가변 길이 배열에 &lt;em papago-id=&quot;12-5&quot;&gt;자동&lt;/em&gt;으로 할당하는 것으로 저장 &lt;em papago-id=&quot;12-1&quot;&gt;기간&lt;/em&gt;이 다릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C는 &lt;em papago-id=&quot;13-1&quot;&gt;스택&lt;/em&gt;의 개념이 없지만 많은 구현이 스택에서 가변 길이 배열을 할당하는 반면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc&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;em papago-id=&quot;14-1&quot;&gt;힙&lt;/em&gt;에서 할당합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 스택 크기가 kB 정도인 반면 힙은 훨씬 더 큰 많은 임베디드 운영 체제와 같은 스택 제한 시스템의 문제입니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;malloc&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;/li&gt; 
 &lt;li&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;realloc()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, VLA는 할 수 없지만(더 정확하게는 블록을 다른 배열 차원으로 다시 실행하여 이전 콘텐츠를 손실합니다).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호스트형 C89 구현은 다음을 지원합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;malloc()&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;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호스트형 C11 구현은 가변 길이 배열을 지원하지 않을 수 있음(그러면 다음을 정의해야 함)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;__STDC_NO_VLA__&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C116.10.8.3)에 따른 정수 1로서.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;23&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;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;URL : https://stackoverflow.com/questions/16672322/malloced-array-vs-variable-length-array&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/930</guid>
      <comments>https://nicesource.tistory.com/930#entry930comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:24:22 +0900</pubDate>
    </item>
    <item>
      <title>부트스트랩 모달이 열린 상태에서 신체 내용의 스크롤 방지 방법</title>
      <link>https://nicesource.tistory.com/929</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;Angular UI Bootstrap &lt;a href=&quot;http://angular-ui.github.io/bootstrap/#/modal&quot; rel=&quot;noreferrer&quot; papago-id=&quot;1-1&quot;&gt;Modal box&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;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;font class=&quot;papago-parent&quot;&gt;이 스크롤은 모드 안에 있으면 안 됩니다. 즉, 페이지 스크롤을 사용할 때 모드는 스크롤만 해야 하고 내용은 스크롤하지 않아야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://plnkr.co/edit/7so09g5TOpw6VL65nXFK?p=preview&quot; rel=&quot;noreferrer&quot; papago-id=&quot;2-1&quot;&gt;여기 플렁커&lt;/a&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;드림하이의 답변을 약간 수정한 것이 제게 잘 들어맞았습니다. iOS 기기를 위해 고정된 위치를 추가하는 것이 포함되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;body.modal-open {
    position: fixed;
    overflow: hidden;
}
&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;pre&gt;&lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot;&amp;gt;
&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;https://stackoverflow.com/questions/18964793/bootstrap-3-horizontal-scrollbar-on-iphone-after-form-focus&quot; papago-id=&quot;5-1&quot;&gt;부트스트랩 3: &lt;/a&gt;폼&lt;a href=&quot;https://stackoverflow.com/questions/18964793/bootstrap-3-horizontal-scrollbar-on-iphone-after-form-focus&quot; papago-id=&quot;5-1&quot;&gt; 포커스&lt;/a&gt; 후 &lt;a href=&quot;https://stackoverflow.com/questions/18964793/bootstrap-3-horizontal-scrollbar-on-iphone-after-form-focus&quot; papago-id=&quot;5-1&quot;&gt;아이폰의 가로 스크롤&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;이 두 가지 변화로 저는 angularjs modal form을 iOS에서 잘 동작할 수 있게 되었습니다.&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;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 UI 부트스트랩을 사용하는 것과 같은 문제에 직면해 있으며 일종의 해결책을 생각해 냈습니다.&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;.ovh&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 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;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 당신의 음악을 보세요: http://plnkr.co/edit/OIJ2ee5Ph0ELgkKPrSbr?p=preview&lt;/font&gt;&lt;/p&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;strong papago-id=&quot;10-0&quot;&gt;데모&lt;/strong&gt; 목적으로만 index.html에 클래스를 배치했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;게다가 주사를 놓았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$document&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 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular JS와 UI 부트스트랩을 사용하는 사람들을 위해.&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;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;.modal.in {
  overflow-x: hidden;
  overflow-y: auto;
}
&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;저는 CSS 아래에 두었을 뿐이고 이제는 모달 팝업이 열릴 때마다 본문 스크롤이 숨겨집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular UI Bootstrap을 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.modal-open {
  overflow: hidden !important;
  position: relative
}
&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;overflow:hidden을 추가하면 배경 페이지 스크롤이 숨겨집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 모달 스크롤은 페이지 스크롤로 표시되며 모달은 스크롤하도록 설정됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;body.modal-open {
    overflow: hidden;
}
&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;bootstrap js commented line이 문제를 일으키면 나처럼 이 line을 comment할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  this.backdrop(function () {
  var transition = $.support.transition &amp;amp;&amp;amp; that.$element.hasClass('fade')

  if (!that.$element.parent().length) {
    that.$element.appendTo(that.$body) // don't move modals dom position
  }

  that.$element
    .show()
    .scrollTop(0)

  if (that.options.backdrop) that.adjustBackdrop()
  that.adjustDialog()

  if (transition) {
    that.$element[0].offsetWidth // force reflow
  }

  that.$element
    .addClass('in')
    .attr('aria-hidden', false)

  //that.enforceFocus()
&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;저는 대화가 닫힐 때 페이지가 스크롤되어 ui-bootstrap-tpls.js 파일을 수정했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 문제는 modal을 해제할 때 removeModalWindow가 매개 변수 'modalInstance' 및 'modalWindow.value.modalOpener'로 호출되고 있다는 것입니다.&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;'해제'와 '닫기 기능'에서 두 번째 파라미터만 제거하면 페이지 스크롤 효과가 해결됩니다.&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;'removeModalWindow(modalInstance, modalWindow.value.modalOpener)'가 'removeModalWindow(modalInstance)'가 됩니다.&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;pre&gt;&lt;code&gt;.modal-open .modal {
  overflow: hidden;
}

.modal-open{
  height: 100vh;
}
&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/20563681/how-to-prevent-scrolling-of-the-body-content-when-bootstrap-modal-is-open&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>angularjs</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/929</guid>
      <comments>https://nicesource.tistory.com/929#entry929comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:24:16 +0900</pubDate>
    </item>
    <item>
      <title>사용자의 현지 시간에서 2시간을 빼는 방법은?</title>
      <link>https://nicesource.tistory.com/928</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자의 현지 시간에서 2시간을 빼는 방법은?&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;로컬 시간에서 2시간을 뺀 값을 표시할 수 있는 간단한 자바스크립트 코드 블록을 줄 수 있는 사람?&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;var d = new Date();

d.setHours(d.getHours() - 2);
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.w3schools.com/jsref/jsref_obj_date.asp&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;날짜 개체에 대한 전체 참조 목록&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;Javascript Date Documentation&lt;/a&gt;에 따르면 다음과 같은 방법을 쉽게 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var twoHoursBefore = new Date();
twoHoursBefore.setHours(twoHoursBefore.getHours() - 2);
&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;그리고 당신이 설정한 시간이 부족할지에 대해서는 걱정하지 마세요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;0..23&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;range. Date() 개체가 그에 따라 날짜를 업데이트합니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4943088/how-to-subtract-2-hours-from-users-local-time&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JavaScript</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/928</guid>
      <comments>https://nicesource.tistory.com/928#entry928comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:24:09 +0900</pubDate>
    </item>
    <item>
      <title>트랜잭션당 개별 행 데이터 타임 스탬프로 정의된 일정 기간 동안의 트랜잭션을 카운트하는 방법</title>
      <link>https://nicesource.tistory.com/927</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;MySQL 구문에서 MariaDB 10.2.4를 사용하고 있으며 각 트랜잭션에 대해 각 고객의 행의 타임 스탬프(달력일이 아닌)를 기준으로 이전 24시간 동안 발생한 트랜잭션 수를 계산하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h5 papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;열 정보:&lt;/font&gt;&lt;/h5&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;행_숫자:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&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;order_no: 각 행에 대한 고유 값입니다.&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;customer_id: 고객별로 고유하지만 테이블에서 반복됩니다.&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;order_date: 카운트를 수행해야 하는 타임스탬프입니다.&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;dollar_value: 컨텍스트에 대한 값이 있으며 십진수입니다.&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;입력은 출력(trans_count) 및 행_number 열을 제외하고 모두 동일한 열이 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h5 papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3열 관심있는 시간대는 고객 아이디 1111171로 2022-02-11 22:53:50(order_date 란에 있는 값)~2022-02-10 22:53:50(order_date - interval 1 day) 입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;4행과 6행이 일치하므로 3행의 출력은 3(3행 포함)이 됩니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4열 고객님 1111171님의 시간은 2022-02-110 06:49:36 ~ 2022-02-10 06:49:36 입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;6,8,9,10행은 기간 내에 속하며 동일한 customer_id이므로 trans_count 값은 5입니다.&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5 papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블&lt;/font&gt;&lt;/h5&gt; 
&lt;div class=&quot;s-table-container&quot;&gt; 
 &lt;table class=&quot;s-table&quot;&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th style=&quot;text-align: left;&quot; papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;행_숫자&lt;/font&gt;&lt;/th&gt; 
    &lt;th style=&quot;text-align: left;&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;순서_아니오&lt;/font&gt;&lt;/th&gt; 
    &lt;th style=&quot;text-align: left;&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;customer_id&lt;/font&gt;&lt;/th&gt; 
    &lt;th style=&quot;text-align: left;&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;order_date&lt;/font&gt;&lt;/th&gt; 
    &lt;th style=&quot;text-align: left;&quot; papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;달러_가치&lt;/font&gt;&lt;/th&gt; 
    &lt;th style=&quot;text-align: left;&quot; papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;trans_count&lt;/font&gt;&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888883&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111100&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-14 01:10:04&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;2256.0&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888837&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111100&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-12 05:46:32&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1457.2&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888812&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-11 22:53:50&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1757.2&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888887&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-11 06:49:36&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1350.2&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888804&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111100&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-11 03:10:07&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1853.6&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888866&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-11 01:20:26&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1053.0&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888833&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111181&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-10 21:09:05&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;253.2&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888874&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-10 18:06:55&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1958.6&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888829&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-10 10:11:59&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1456.2&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888802&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-10 09:55:31&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;956.6&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;11&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888835&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111100&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-09 19:40:24&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;756.4&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;12&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888810&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111123&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-09 01:34:56&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;3179.5&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;13&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888850&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111100&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-08 20:00:20&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;629.0&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;14&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888821&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-08 17:59:05&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1249.45&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;15&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888809&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-08 06:25:15&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1250.0&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;16&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888837&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111147&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-08 06:18:15&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;184.6&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;17&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888836&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111171&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-07 12:01:47&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;88.28&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;18&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888808&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111147&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-05 12:02:49&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;3008.7&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;19&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888890&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111147&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-05 11:48:16&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1543.31&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;20&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;8888805&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1111147&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot; papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2022-02-05 11:37:55&lt;/font&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;2617.4&lt;/td&gt; 
    &lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/div&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1000 이상의 dollar_value만 계산하는 것과 같은 다른 필터도 적용할 생각이지만 카운트의 논리에 영향을 미치지는 않을 것으로 예상합니다.&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;저는 PySpark에서 이것을 할 수 있었지만, 같은 논리를 반복할 수 없었습니다.&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;pre&gt;&lt;code&gt;# Function to calculate number of seconds from number of days
days = lambda i: i * 86400

# Create window by casting timestamp to long (number of seconds) then defining the number of days you wish to review
w = (Window.partitionBy('customer_id').orderBy(F.col(date_column).cast('long')).rangeBetween(-days(monitor_length_days), 0))

# Add total value of transactions undertaken within time frame by customer_id
filteredDF = filteredDF.withColumn(output_name, F.count('customer_id').over(w))
&lt;/code&gt;&lt;/pre&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;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;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;안타깝게도 Maria&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB에서는 일정 기간 동안 창을 만들 수 없기 때문에 다른 접근 방식이 필요합니다.&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;JOIN&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;customer_id&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;order_date&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;이전 24시간 이내에 있습니다&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 조인된 테이블의 행을 세어 다음을 얻을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;trans_count&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 class=&quot;lang-sql prettyprint-override&quot;&gt;&lt;code&gt;SELECT o.customer_id, o.order_date,
       COUNT(c.customer_id) AS trans_count
FROM orders o
JOIN (SELECT customer_id, order_date
     FROM orders
     ) c ON c.customer_id = o.customer_id AND c.order_date BETWEEN o.order_date - INTERVAL 1 DAY AND o.order_date
GROUP BY o.customer_id, o.order_date
ORDER BY o.order_date DESC
&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 class=&quot;lang-none prettyprint-override&quot;&gt;&lt;code&gt;customer_id order_date              trans_count
1111100     2022-02-14 01:10:04     1
1111100     2022-02-12 05:46:32     1
1111171     2022-02-11 22:53:50     3
1111171     2022-02-11 06:49:36     5
1111100     2022-02-11 03:10:07     1
1111171     2022-02-11 01:20:26     4
1111181     2022-02-10 21:09:05     1
1111171     2022-02-10 18:06:55     3
1111171     2022-02-10 10:11:59     2
1111171     2022-02-10 09:55:31     1
1111100     2022-02-09 19:40:24     2
1111123     2022-02-09 01:34:56     1
1111100     2022-02-08 20:00:20     1
1111171     2022-02-08 17:59:05     2
1111171     2022-02-08 06:25:15     2
1111147     2022-02-08 06:18:15     1
1111171     2022-02-07 12:01:47     1
1111147     2022-02-05 12:02:49     3
1111147     2022-02-05 11:48:16     2
1111147     2022-02-05 11:37:55     1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://dbfiddle.uk/?rdbms=mariadb_10.3&amp;amp;fiddle=ad0b34c9c76d06a9d144f3e99400333d&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;dbfiddle 데모&lt;/font&gt;&lt;/a&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;15행의 경우 다음과 같은 사항을 참고합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;trans_count&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&gt;&lt;code&gt;2&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;17번 행에 24시간 이내에 선행 거래가 있기 때문입니다.&lt;/font&gt;&lt;/font&gt;&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/71731245/how-to-count-transactions-over-a-period-of-time-defined-by-the-individual-row-da&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MariaDB</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/927</guid>
      <comments>https://nicesource.tistory.com/927#entry927comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:24:03 +0900</pubDate>
    </item>
    <item>
      <title>EXCEL 워크시트를 ClosedXML을 통해 CSV로 저장할 수 있습니까?</title>
      <link>https://nicesource.tistory.com/926</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXCEL 워크시트를 ClosedXML을 통해 CSV로 저장할 수 있습니까?&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;워크북의 워크시트를 ClosedXML을 통해 CSV로 저장할 수 있습니까?&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;var workbook = new XLWorkbook(fileName);
IXLWorksheet worksheet;
workbook.Worksheets.TryGetWorksheet(sheetName, out worksheet);
&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;CSV로 저장하는 방법?&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;셀에 구분자가 있는 경우 다른 답변은 유효한 CSV를 생성하지 못하므로 여기서 더 나은 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var lastCellAddress = worksheet.RangeUsed().LastCell().Address;
File.WriteAllLines(csvFileName, worksheet.Rows(1, lastCellAddress.RowNumber)
    .Select(r =&amp;gt; string.Join(&quot;,&quot;, r.Cells(1, lastCellAddress.ColumnNumber)
            .Select(cell =&amp;gt;
        {
            var cellValue = cell.GetValue&amp;lt;string&amp;gt;();
            return cellValue.Contains(&quot;,&quot;) ? $&quot;\&quot;{cellValue}\&quot;&quot; : cellValue;
        }))));
&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;strong papago-id=&quot;5-1&quot;&gt;@Extragorey&lt;/strong&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;아니요, ClosedX에서는 직접 가능하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ML. 루프나 LINQ를 사용하여 자신만의 CSV 파일을 구축해야 합니다.&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;pre&gt;&lt;code&gt;System.IO.File.WriteAllLines(csvFileName,
    worksheet.RowsUsed().Select(row =&amp;gt;
        string.Join(&quot;;&quot;, row.Cells(1, row.LastCellUsed(false).Address.ColumnNumber)
                            .Select(cell =&amp;gt; cell.GetValue&amp;lt;string&amp;gt;()))
 ));
&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;@Emanuelle이 지적한 바와 같이 @Raidri의 답변은 적절한 CSV 형식을 생성하지 못할 뿐만 아니라 빈 행도 완전히 생략합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var lastCellAddress = worksheet.RangeUsed().LastCell().Address;
System.IO.File.WriteAllLines(csvFileName, worksheet.Rows(1, lastCellAddress.RowNumber)
    .Select(row =&amp;gt; String.Join(&quot;,&quot;, row.Cells(1, lastCellAddress.ColumnNumber)
        .Select(cell =&amp;gt; cell.GetValue&amp;lt;string&amp;gt;()))
));
&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;row.LastCellUsed(false)
&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;csv의 올바른 형식이 아닙니다.&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/27102904/can-i-save-an-excel-worksheet-as-csv-via-closedxml&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Excel</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/926</guid>
      <comments>https://nicesource.tistory.com/926#entry926comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:55 +0900</pubDate>
    </item>
    <item>
      <title>sqlite artertable 단일 문에 여러 열 추가</title>
      <link>https://nicesource.tistory.com/925</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sqlite artertable 단일 문에 여러 열 추가&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;sqlite에서 테이블 추가 Multiple column을 하나의 문에 변경할 수 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경 가능한 테스트 추가 컬럼 mycolumn1 텍스트 추가 컬럼 mycolumn2 텍스트 추가;&lt;/font&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;a href=&quot;http://www.sqlite.org/lang_altertable.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;SQLite의 ALTER TABLE 설명서&lt;/a&gt; 상단에 있는 구문 다이어그램을 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://www.sqlite.org/images/syntax/alter-table-stmt.gif&quot; alt=&quot;ALTER TABLE syntax&quot;&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;ADD&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;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;BEGIN TRANSACTION;
ALTER TABLE tblName ADD ColumnNameA TEXT DEFAULT '';
ALTER TABLE tblName ADD ColumnNameB TEXT DEFAULT '';
ALTER TABLE tblName ADD ColumnNameC TEXT DEFAULT '';
COMMIT
&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;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;em papago-id=&quot;9-1&quot;&gt;mu is too short&lt;/em&gt;'의 답이 맞습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL의 &lt;em papago-id=&quot;9-3&quot;&gt;트랜잭션&lt;/em&gt; 기능을 사용하여 여러 열을 추가할 수 있는 최적화된 솔루션 제공&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;String alterTableQuery = &quot;ALTER TABLE &quot; + TABLE_NAME + &quot; ADD COLUMN &quot;;
List&amp;lt;String&amp;gt; newColumns = ..// Your new columns

db.beginTransaction();
for (String column : newColumns){
    db.execSQL(alterTableQuery + column +  &quot; VARCHAR&quot;);
}
db.setTransactionSuccessful();
db.endTransaction();
&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;변경 가능한 검정 추가 mycolumn 1 텍스트; 변경 가능한 검정 추가 mycolumn 2 텍스트;&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;/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;URL : https://stackoverflow.com/questions/6172815/sqlite-alter-table-add-multiple-columns-in-a-single-statement&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>SQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/925</guid>
      <comments>https://nicesource.tistory.com/925#entry925comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:49 +0900</pubDate>
    </item>
    <item>
      <title>angular 4 unit testing error 'TypeError: cctor는 생성자가 아닙니다'</title>
      <link>https://nicesource.tistory.com/924</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angular 4 unit testing error 'TypeError: cctor는 생성자가 아닙니다'&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;TypeError: ctor is not a constructor&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;TypeError: ctor is not a constructor
TypeError: ctor is not a constructor
    at _createClass (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42355:26)
    at _createProviderInstance$1 (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42330:26)
    at resolveNgModuleDep (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42315:17)
    at _createClass (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42362:26)
    at _createProviderInstance$1 (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42330:26)
    at resolveNgModuleDep (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42315:17)
    at NgModuleRef_.webpackJsonp../node_modules/@angular/core/@angular/core.es5.js.NgModuleRef_.get (http://localhost:9877/_karma_webpack_/vendor.bundle.js:43401:16)
    at TestBed.webpackJsonp../node_modules/@angular/core/@angular/core/testing.es5.js.TestBed.get (http://localhost:9877/_karma_webpack_/vendor.bundle.js:48412:47)
    at http://localhost:9877/_karma_webpack_/vendor.bundle.js:48418:61
    at Array.map (native)
&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;제공자를 조롱하고 useValue 대신 Class를 사용하려고 하면 &quot;TypeError: ctor is not constructor&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;pre&gt;&lt;code&gt;providers: [{provide: OrderService, useClass: new OrderServiceMock()}]
&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;정확한 선언은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;providers: [{provide: OrderService, useValue: new OrderServiceMock()}]
&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;AOT로 앱을 만들 때도 똑같은 메시지가 있었습니다.&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;제 문제는 @abahet이 제안한 것처럼 공급자와 관련이 없었습니다.&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;AOT를 준수하지 않는 새로운 라이브러리를 설정했기 때문입니다(그리고 프로바이더도 없었습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해당 라이브러리는 모듈(이 경우 구성 요소 및 파이프)에 가져온 것을 &lt;strong papago-id=&quot;9-1&quot;&gt;내보내야&lt;/strong&gt; 했습니다(각형 모듈에서 가져온 것이 아니라 Typescript 내보내기를 말하는 것입니다).&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;font class=&quot;papago-parent&quot;&gt;그래서 저는 다음과 같이 했습니다.&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;https://www.npmjs.com/package/npm-check-updates 을 사용하여 모든 npm 패키지&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;node_modules 및 .package-lock.json을 제거하고 다시 설치합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변경된 api로 인한 모든 오류 수정&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 효과가 있네요 :-)&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 패키지가 오류를 일으켰는지는 한 번도 파악하지 못했지만, 한 가지 방법은 모듈을 하나씩 제거하는 MockAppModule을 만드는 것입니다.&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;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;세 번째 가능성, 저는 다른 모듈이 포함된 모듈을 가지고 있었고 다른 모듈을 내보내지 않았습니다(Typescript speaking).&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;저도 AOT가 활성화 되어있는 문제가 있었습니다.&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;18&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/44597532/angular-4-unit-testing-error-typeerror-ctor-is-not-a-constructor&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>angular</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/924</guid>
      <comments>https://nicesource.tistory.com/924#entry924comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:43 +0900</pubDate>
    </item>
    <item>
      <title>유휴 상태일 때 MySQL Workbench 연결이 끊어짐</title>
      <link>https://nicesource.tistory.com/923</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유휴 상태일 때 MySQL Workbench 연결이 끊어짐&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;OS X 10.9.5에서 MySQL Workbench 6.3을 사용하여 여러 클라우드 데이터베이스(Rackspace에서 호스팅)를 관리하고 있는데 다음과 같은 문제가 발생합니다.&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;5분 동안 비활성 상태이면 다음과 같은 문제가 발생합니다.&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;쿼리를 실행할 수 없습니다(오류 2013: 쿼리 중 MySQL 서버에 대한 연결 끊김).&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;db에서 테이블을 검색하려고 하면 &quot;테이블을 가져올 수 없음&quot;, &quot;뷰를 가져올 수 없음&quot; 등의 메시지가 나타납니다.&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;왼쪽 패널을 새로 고치면 &quot;Error Code: 2006 MySQL 서버가 사라졌습니다&quot;라는 메시지가 나타납니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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 papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;5분 동안 활동을 하지 않은 후에 발생하기 때문에 정말 짜증납니다.&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/15712512/mysql-workbench-how-to-keep-the-connection-alive&quot; papago-id=&quot;8-1&quot;&gt;MySQL Workbench:&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/15712512/mysql-workbench-how-to-keep-the-connection-alive&quot; papago-id=&quot;8-1&quot;&gt; 연결을 유지하는 방법&lt;/a&gt;은 아무것도 바뀌지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Workbench Preferences 탭에서 다음과 같은 설정이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DBMS 연결 Keep-Alive 간격(초): 600&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DBMS 연결 읽기 시간 초과(초): 600&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DBMS 연결 시간 초과(초): 60&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제는 &lt;strong papago-id=&quot;12-1&quot;&gt;5분 동안 작동&lt;/strong&gt;하지 않은 상태에서 &lt;strong papago-id=&quot;12-1&quot;&gt;정확히&lt;/strong&gt; 발생합니다&lt;strong papago-id=&quot;12-1&quot;&gt;!&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;4분 59초 간격으로 두 개의 쿼리를 실행하면 완벽하게 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 Workbench에서 동일한 데이터베이스에 연결하는 동료들은 이러한 문제를 겪지 않습니다.&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;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집 -&amp;gt; 기본 설정 -&amp;gt; SQL Editor로 이동하면 다음을 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DBMS connection keep-alive interval (in seconds): 600
DBMS connection read time out (in seconds): 600
DBMS connection time out (in seconds): 60
&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;DBMS 연결 keep-alive 간격은 Workbench가 연결을 유지하기 위해 keep-alive 요청을 서버로 보내는 빈도를 의미합니다.&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;5분 == 300초부터 DBMS 연결 유지 alive 간격 &amp;lt; 300 설정 (예: 250)&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;이것은 &quot;250초마다 킵 얼라이브 요청을 전송하라&quot;는 의미입니다.&lt;/font&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;그런 다음 MySQL Workbench를 종료하고 다시 시작하여 변경 사항을 적용합니다.&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;Standard TCP/IP over SSH 연결 방법을 사용하는 경우 ssh ServerAliveInterval을 구성하는 것도 도움이 됩니다.&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;이 버그는 6.0 이후의 MySQL Workbench의 모든 버전에 존재합니다(현재: 6.1, 6.2 및 6.3에 버그가 있음).&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;MySQL Workbench 6.0.x로 다운그레이드 하는 것이 이 문제를 해결할 수 있는 유일한 방법인 것 같습니다.&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;MySQL Workbench 6.0.x 다운로드 : http://dev.mysql.com/downloads/workbench/6.0.html&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;FWIW: Kosh의 추천에 따라 다음과 같이 설정을 변경했는데 Ubuntu 16에서 실행되는 WB 6.3의 문제를 없앤 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DBMS connection keep-alive interval (in seconds): 60
DBMS connection read time out (in seconds): 60
DBMS connection time out (in seconds): 30
&lt;/code&gt;&lt;/pre&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;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows Azure에서 호스팅하는 Ubuntu 14.04에서 tcp_keepalive_time을 120초로 설정하여 해결했습니다.&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;Azure 로드 밸런서의 TCP keepalive는 기본적으로 240초이므로, Azure 시스템의 TCP keepalive가 이 값보다 크면 연결이 자동으로 끊어질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 개선하려면 tcp_keepalive_time을 120으로 설정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;tcp_keepalive_time을 확인하려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/font&gt;&lt;h1 papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cat/proc/sys/넷/ipv4/tcp_keepalive_time&lt;/font&gt;&lt;/h1&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;7200(기본 2시간)&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;2. 값을 2시간에서 120초 사이로 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;sudo sysctl -wnet. ipv4. tcp_keepalive_time=120&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;net.ipv4.tcp_keepalive_time = 120&lt;/font&gt;&lt;/p&gt; 
&lt;ol start=&quot;3&quot;&gt; 
 &lt;li&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;h1 papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cat/proc/sys/넷/ipv4/tcp_keepalive_time&lt;/font&gt;&lt;/h1&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;120&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4. 재부팅 후에도 sysctl 파일의 값이 그대로 유지되도록 설정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;vi /etc/ sysctl.conf&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;i (파일에 삽입하려면) net. ipv4. tcp_keepalive_time = 120 (파일 하단에 이 줄 추가) :wq(저장 후 종료)&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;이것 때문에 몇 달 동안 정신이 나갔습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 호스트게이터 서버에 접속했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결 후 10초 정도만 테이블을 편집할 수 있으면 테이블 커밋을 수행하면 테이블이 &quot;독서 전용&quot;으로 바뀌고 마우스 오버 메시지가 나타납니다. &quot;유일한 행 식별자를 확인할 수 없음(MySQL 서버가 사라짐)&quot; 또는 &quot;(쿼리 중 MySQL 서버와의 연결이 끊어짐)&quot;입니다.&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;여기에 나와 있는 다른 제안에 따르면, 해결책은 킵 얼라이브 설정을 줄이는 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저 같은 경우에는 10대로 떨어져야 했습니다. (대역폭이 상당히 형편없다면 Hostgator!)&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&gt;&lt;/font&gt;&lt;code&gt;SSH KeepAlive&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;em papago-id=&quot;41-1&quot;&gt;기본&lt;/em&gt; 설정&lt;em papago-id=&quot;41-1&quot;&gt;/기타/타임아웃&lt;/em&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&gt;&lt;/font&gt;&lt;code&gt;DBMS connection keep-alive interval&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;em papago-id=&quot;43-1&quot;&gt;Preferences/SQL Editor/MySQL Session&lt;/em&gt;에서).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결이 안정적으로 유지될 때까지 10대까지 가져가야 했습니다.&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;44&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;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Kosh Very's Answer는 제게 적합하지 않아서 이에 대한 다른 해결책을 찾았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&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;max_allowed_packet를 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;my.ini&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;My(C:\ProgramData\My&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;SQL\MySQL 서버 5.6)&lt;/font&gt;&lt;/font&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;max_allowed_packet=16M&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;이제 MySQL 서비스를 다시 시작합니다.&lt;/font&gt;&lt;/p&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;&lt;strong papago-id=&quot;50-0&quot;&gt;Kosh Very&lt;/strong&gt;'s가 정답입니다.&lt;/font&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;/p&gt; 
&lt;ol&gt; 
 &lt;li&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;strong papago-id=&quot;8-0&quot;&gt;연결&lt;/strong&gt;:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql -u myusername -p&lt;/code&gt; &lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;암호를 입력하라는 메시지가 나타납니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&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-0&quot;&gt;실행&lt;/strong&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;ALTER TABLE mydb.mytable DROP COLUMN mycol;&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;55&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/31811517/mysql-workbench-drops-connection-when-idle&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MySQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/923</guid>
      <comments>https://nicesource.tistory.com/923#entry923comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:36 +0900</pubDate>
    </item>
    <item>
      <title>파이썬에서 XSLT를 사용하여 XML 파일을 변환하는 방법은?</title>
      <link>https://nicesource.tistory.com/922</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이썬에서 XSLT를 사용하여 XML 파일을 변환하는 방법은?&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;파이썬에서 xslt를 사용하여 xml을 변환해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 php로 된 샘플 코드를 가지고 있습니다.&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;pre&gt;&lt;code&gt;$xmlFileName = dirname(__FILE__).&quot;example.fb2&quot;;
$xml = new DOMDocument();
$xml-&amp;gt;load($xmlFileName);

$xslFileName = dirname(__FILE__).&quot;example.xsl&quot;;
$xsl = new DOMDocument;
$xsl-&amp;gt;load($xslFileName);

// Configure the transformer
$proc = new XSLTProcessor();
$proc-&amp;gt;importStyleSheet($xsl); // attach the xsl rules
echo $proc-&amp;gt;transformToXML($xml);
&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;a href=&quot;https://lxml.de/index.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;lxml&lt;/a&gt;을 사용하면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import lxml.etree as ET

dom = ET.parse(xml_filename)
xslt = ET.parse(xsl_filename)
transform = ET.XSLT(xslt)
newdom = transform(dom)
print(ET.tostring(newdom, pretty_print=True))
&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;a href=&quot;https://lxml.de/index.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;4-0&quot;&gt;LXML&lt;/a&gt;은 libxml2 및 libxslt를 기반으로 하는 파이썬에서 XML 처리를 위해 널리 사용되는 고성능 라이브러리이며 &lt;a href=&quot;https://lxml.de/xpathxslt.html#xslt&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;4-2&quot;&gt;XSLT를 위한 기능&lt;/a&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;가장 좋은 방법은 lxml을 사용하는 것이지만 XSLT 1만 지원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import os
import lxml.etree as ET

inputpath = &quot;D:\\temp\\&quot;
xsltfile = &quot;D:\\temp\\test.xsl&quot;
outpath = &quot;D:\\output&quot;


for dirpath, dirnames, filenames in os.walk(inputpath):
            for filename in filenames:
                if filename.endswith(('.xml', '.txt')):
                    dom = ET.parse(inputpath + filename)
                    xslt = ET.parse(xsltfile)
                    transform = ET.XSLT(xslt)
                    newdom = transform(dom)
                    infile = unicode((ET.tostring(newdom, pretty_print=True)))
                    outfile = open(outpath + &quot;\\&quot; + filename, 'a')
                    outfile.write(infile)
&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;XSLT 2를 사용하려면 &lt;a href=&quot;https://stackoverflow.com/questions/29443364/use-saxon-with-python&quot; papago-id=&quot;6-1&quot;&gt;saxon with python에서 옵션&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/16698935/how-to-transform-an-xml-file-using-xslt-in-python&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>xml</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/922</guid>
      <comments>https://nicesource.tistory.com/922#entry922comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:29 +0900</pubDate>
    </item>
    <item>
      <title>사용 중인 waitpid()의 예?</title>
      <link>https://nicesource.tistory.com/921</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용 중인 waitpid()의 예?&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;waitpid()&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&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;//Create two children
pid_t child1;
pid_t child2;
child1 = fork();

//wait for child1 to finish, then kill child2
waitpid() ... child1 {
kill(child2) }
&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&gt;&lt;/font&gt;&lt;code&gt;waitpid()&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;pre&gt;&lt;code&gt;pid_t waitpid(pid_t pid, int *status, int options);
&lt;/code&gt;&lt;/pre&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;pid&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;ul&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;&lt;strong papago-id=&quot;6-0&quot;&gt;&amp;lt; -1&lt;/strong&gt;: 프로세스 그룹 ID가 다음의 절대값과 같은 자식 프로세스를 기다립니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pid&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;/li&gt; 
 &lt;li papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;10-0&quot;&gt;-1&lt;/strong&gt;: 자식 프로세스를 기다립니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;11-0&quot;&gt;0&lt;/strong&gt;: 프로세스 그룹 ID가 호출 프로세스 ID와 동일한 자식 프로세스를 기다립니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-0&quot;&gt;&amp;gt; 0&lt;/strong&gt;: 프로세스 ID가 다음의 값과 같은 자식을 기다립니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pid&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;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 값은 OR이 0이거나 다음 상수 이상입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;WNOHANG&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;/li&gt; 
 &lt;li&gt;&lt;code&gt;WUNTRACED&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;이 옵션을 지정하지 않더라도 중지된 추적된 자식에 대한 상태가 제공됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;WCONTINUED&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;code&gt;SIGCONT&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;/li&gt; 
&lt;/ul&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;man waitpid&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;/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;pid_t waitpid(pid_t pid, int *statusPtr, int options);
&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;1. 여기서 pid는 아이가 기다려야 하는 과정입니다.&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;2.statusPtr은 종료 프로세스의 상태 정보를 저장할 위치를 나타내는 포인터입니다.&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;3. waitpid 기능에 대한 옵션 작업을 specifies합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 옵션 플래그 중 하나를 지정하거나 비트 단위 포함 OR 연산자와 결합할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WHANG 추적 안 함 계속됨&lt;/font&gt;&lt;/strong&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;성공한 경우 waitpid는 상태가 보고된 종료된 프로세스의 프로세스 ID를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실패하면 -1이 반환됩니다.&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;1. Waitpid는 프로세스에 대한 자식이 둘 이상 있고 부모가 다시 시작하기 전에 특정 자식이 실행될 때까지 기다리려는 경우에 사용할 수 있습니다.&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;2. waitpid는 작업 제어를 지원합니다.&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;3.it 은 상위 프로세스의 비차단을 지원합니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;sys/wait.h&amp;gt;

int main (){
    int pid;
    int status;

    printf(&quot;Parent: %d\n&quot;, getpid());

    pid = fork();
    if (pid == 0){
        printf(&quot;Child %d\n&quot;, getpid());
        sleep(2);
        exit(EXIT_SUCCESS);
    }

//Comment from here to...
    //Parent waits process pid (child)
    waitpid(pid, &amp;amp;status, 0);
    //Option is 0 since I check it later

    if (WIFSIGNALED(status)){
        printf(&quot;Error\n&quot;);
    }
    else if (WEXITSTATUS(status)){
        printf(&quot;Exited Normally\n&quot;);
    }
//To Here and see the difference
    printf(&quot;Parent: %d\n&quot;, getpid());

    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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/21248840/example-of-waitpid-in-use&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/921</guid>
      <comments>https://nicesource.tistory.com/921#entry921comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:23 +0900</pubDate>
    </item>
    <item>
      <title>CREATE 명령이 사용자에게 거부됨</title>
      <link>https://nicesource.tistory.com/920</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CREATE 명령이 사용자에게 거부됨&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;show grants for charm@'localhost';

---------------------+
| Grants for charm@localhost                                                                                   |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'charm'@'localhost' IDENTIFIED BY PASSWORD '*EDD1CD76B1331E363B2BAED3F0B7EAF28559FBEWD' |
| GRANT ALL PRIVILEGES ON `charmstyle_com`.`charmstyle_com` TO 'charm'@'localhost' 
&lt;/code&gt;&lt;/pre&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;grant all on charmstyle_com to charm@'localhost' IDENTIFIED BY 't1q4gytrur';
flush privileges;
&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;pre&gt;&lt;code&gt;   ERROR 1142 (42000) at line 29: CREATE command denied to user 'charm'@'localhost' for table 'adminnotification_inbox'
&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;사용자 권한을 'charmstyle_com' 데이터베이스 내의 'charmstyle_com' 테이블에만 부여했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아마도 'charmstyle_com'(또는 최소한 'adminnotification_inbox' 테이블)의 모든 테이블에 사용 권한을 부여하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; GRANT ALL PRIVILEGES ON `charmstyle_com`.* TO 'charm'@'localhost' 
&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;pre&gt;&lt;code&gt; GRANT ALL PRIVILEGES ON `charmstyle_com`.`adminnotification_inbox` 
     TO 'charm'@'localhost' 
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/9887364/create-command-denied-to-user&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MySQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/920</guid>
      <comments>https://nicesource.tistory.com/920#entry920comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:16 +0900</pubDate>
    </item>
    <item>
      <title>mysql은 int를 통화로 선택하거나 통화 형식으로 변환합니까?</title>
      <link>https://nicesource.tistory.com/919</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mysql은 int를 통화로 선택하거나 통화 형식으로 변환합니까?&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;통화 형식으로 선택하면서 int를 변환하는 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;$' 기호를 표시할 수는 있지만 ,'를 어떻게 배치합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;= 1,000달러를 1,000달러로 바꾸는 것과 같은 경우?&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;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;FORMAT() 함수 : http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_format&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT CONCAT('$', FORMAT(val, 2)) ... ;
&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/10556404/mysql-select-int-as-currency-or-convert-int-to-currency-format&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MySQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/919</guid>
      <comments>https://nicesource.tistory.com/919#entry919comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:10 +0900</pubDate>
    </item>
    <item>
      <title>Powershell에서 32/64비트 결정</title>
      <link>https://nicesource.tistory.com/918</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Powershell에서 32/64비트 결정&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;시스템이 32/64비트이면 WMI에서 꺼낼 몇 줄의 코드를 만들고 64비트이면 이 작업을 수행합니다. 32비트이면 이 작업을 수행합니다.&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;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Environment에는 두 가지 부울 정적 방법이 있습니다. 하나는 PowerShell 프로세스를 살펴보고, 하나는 기본 OS를 검사하고 비교할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ([Environment]::Is64BitProcess -ne [Environment]::Is64BitOperatingSystem)
{
&quot;PowerShell process does not match the OS&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://social.technet.microsoft.com/Forums/office/en-US/5dfeb3ab-6265-40cd-a4ac-05428b9db5c3/determine-32-or-64bit-os?forum=winserverpowershell&quot; rel=&quot;noreferrer&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;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최소한 Windows 7(윈도우 7)을 실행하고 있다고 가정하면 다음과 같은 작업이 가능합니다.&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;64비트 기계에서 실행되는 32비트 버전의 파워셸에서 나에게 적합한 샘플을 포함하면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Get-WmiObject win32_operatingsystem | select osarchitecture
&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;64비트에 대해 &quot;64비트&quot;를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ((Get-WmiObject win32_operatingsystem | select osarchitecture).osarchitecture -eq &quot;64-bit&quot;)
{
    #64 bit logic here
    Write &quot;64-bit OS&quot;
}
else
{
    #32 bit logic here
    Write &quot;32-bit OS&quot;
}
&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;이는 이전 답변과 유사하지만 64비트/64_비트/64비트/64비트 형식에 관계없이 올바른 결과를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ((Get-WmiObject win32_operatingsystem | select osarchitecture).osarchitecture -like &quot;64*&quot;)
{
#64bit code here
Write &quot;64-bit OS&quot;
}
else
{
#32bit code here
Write &quot;32-bit OS&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;pre&gt;&lt;code&gt;Write-Host &quot;64bit process?:&quot;$([Environment]::Is64BitProcess) ;Write-Host &quot;64bit OS?:&quot;$([Environment]::Is64BitOperatingSystem);
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;[IntPtr]::Size -eq 4 # 32 bit
&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;IntPtr의 크기는 32비트 시스템에서 4바이트, 64비트 시스템에서 8바이트가 됩니다(https://msdn.microsoft.com/en-us/library/system.intptr.size.aspx) .&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;if($env:PROCESSOR_ARCHITECTURE -eq &quot;x86&quot;){&quot;32-Bit CPU&quot;}Else{&quot;64-Bit CPU&quot;}
&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;-edit, 미안하지만 사용법을 설명하기 위해 코드를 더 포함하는 것을 잊었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if($env:PROCESSOR_ARCHITECTURE -eq &quot;x86&quot;)
 {
#If the powershell console is x86, create alias to run x64 powershell console.
 set-alias ps64 &quot;$env:windir\sysnative\WindowsPowerShell\v1.0\powershell.exe&quot;

$script2=[ScriptBlock]::Create(&quot;#your commands here, bonus is the script block expands variables defined above&quot;)

ps64 -command $script2
 }
 Else{
 #Otherwise, run the x64 commands.
&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;Guvante의 답변을 사용하여 전역 부울 만들기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$global:Is64Bits=if((gwmi win32_operatingsystem | select osarchitecture).osarchitecture -eq &quot;64-bit&quot;){$true}else{$false}
&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;em papago-id=&quot;0-1&quot;&gt;&lt;strong papago-id=&quot;0-1-0&quot;&gt;없습니다&lt;/strong&gt;&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-Eq&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연산자) 를 통해 &quot;&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;code&gt;$True&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;code&gt;$False&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;/p&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://stackoverflow.com/a/67691083/3789665&quot; papago-id=&quot;18-0&quot;&gt;Jose의 One-liner&lt;/a&gt;는 다음과 같이 단순화됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$global:Is64Bits=(gwmi win32_operatingsystem | select osarchitecture).osarchitecture -eq &quot;64-bit&quot;
&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;URL : https://stackoverflow.com/questions/31977657/determining-32-64-bit-in-powershell&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Powershell</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/918</guid>
      <comments>https://nicesource.tistory.com/918#entry918comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:23:04 +0900</pubDate>
    </item>
    <item>
      <title>GLib 기능을 사용하는 이유는 무엇입니까?</title>
      <link>https://nicesource.tistory.com/917</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GLib 기능을 사용하는 이유는 무엇입니까?&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;C 및 GTK+에서 프로그래밍하는 동안 사용하는 것이 &quot;더 나은&quot; 이유는 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;g_strdup_printf&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;g_free&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;g_strcmp0&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;GLIB 동료들은?&lt;/font&gt;&lt;/font&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;일반적으로 GLib의 목적은 유틸리티 및 휴대성 라이브러리입니다.&lt;/font&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;여러분이 언급한 특정 기능들은 모두 C 표준 라이브러리 변형 위에 추가적인 기능을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;g_strdup_printf&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;code&gt;sprintf&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;g_free&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;d.)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;g_free&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;code&gt;free&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 class=&quot;papago-parent&quot;&gt;, 그러나 NULL-포인트가 있는지 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;g_strcmp0&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&gt;&lt;code&gt;strcmp&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;, 그러나 NULL 포인터를 빈 문자열처럼 처리하여 앞에 정렬합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;Linux 이외의 다른 유닉스 환경에서는 또는 프로그램이 Windows에서 컴파일된 경우 해당 기능 중 일부가 대상 운영 체제에서 존재하지 않거나 다르게 동작할 수 있습니다.&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;glib 버전을 사용하면 일관된 동작을 보장할 수 있습니다.&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;GLib은 컬렉션 유형(링크 리스트, 배열, 해시 테이블 등)과 같은 모든 프로그래밍 언어에서 요즘 기대할 수 있는 휴대성과 기본적인 것을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 GLib이 제공할 수 있는 혜택입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GLib의 요점은 C 표준이 아니라 표준의 구현을 위해 휴대할 수 있도록 하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GLib은 코드를 그런 고약한 버그가 있는 플랫폼으로 포팅해야 할 때까지 일견 쓸모없어 보일 수 있는 알려진 별난 것들을 처리합니다.&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;예를 들어 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;g_free&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 class=&quot;papago-parent&quot;&gt;C99가 작동해야 한다고 해도 &lt;a href=&quot;https://stackoverflow.com/a/1938758/518853&quot; papago-id=&quot;21-1&quot;&gt;실패하는 플랫폼이 있습니다&lt;/a&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 수표는 적어도 1998년 이후로 존재합니다. (나는 그것을 git history에서 추적했습니다.)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 이상 필요 없다고 하시는 분들도 계시겠지만, 2017년에도 확인하는 회사에서 일했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&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&gt;&lt;code&gt;free&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 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;/p&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;/p&gt; 
&lt;hr&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 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;malloc&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 class=&quot;papago-parent&quot;&gt;돌아오는지 보다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&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 class=&quot;papago-parent&quot;&gt;? 복구할 방법이 있는 사람이 몇 명이나 됩니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&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 class=&quot;papago-parent&quot;&gt;, 기본적으로 기억이 안 나는데요?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;g_malloc&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 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;g_try_malloc&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 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; 이는 malloc와 동일하지만, 여전히 도구로 사용할 수 있는 포장지라는 이점을 제공합니다.&lt;/font&gt;&lt;/font&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;char *buffer = g_malloc(30);
/* Do something with it ... */
g_free (buffer);
&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 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;정신을 frees하고 개발자가 자신이 달성하고자 하는 작업에 집중할 수 있도록 합니다.&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;NULL&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 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;34&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;em papago-id=&quot;34-1&quot;&gt;벅스&lt;/em&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;특징들&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 점은 GLib이 제공하는 모든 컬렉션 유형이 다시 구현할 필요가 없다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결된 목록을 다시 구현하는 것이 쉽다고 해서 해야 하는 것은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 몇 가지 링크된 목록 구현이 포함된 코드를 발송하는 다른 회사에서 일했는데, 몇몇 개발자들은 단지 &lt;em papago-id=&quot;36-1&quot;&gt;Not Invented&lt;/em&gt; Here 신드롬을 가지고 자신들의 것을 재개발할 것이기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GLib과 같은 일반적이고 철저하게 테스트된 광범위한 라이브러리는 이러한 말도 안 되는 일을 방지하는 데 도움이 됩니다.&lt;/font&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;이러한 동작은 GTK+가 지원하는 모든 플랫폼에서 잘 정의되어 있으며, 때로는 부분적으로 작동할 수도 있는 기본 기능과는 대조적입니다.&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;저는 이것이 의도된 것은 맞지만 잘 실행되지 않았다고 말해야겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;포인터를 여러 번 놓아도 프로그램이 충돌하거나 타지 않아 다행입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 NULL 문자열을 정렬합니다.&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;em papago-id=&quot;38-1&quot;&gt;매우&lt;/em&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;10년 전에는 Gnome lib을 사용하는 것이 타당했을지 모르지만, 지금은 유산 부채입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C89는 매우 안정적인 기능과 구문을 가진 세계에서 가장 표준적인 언어이므로 다른 사람의 C89 코드를 디버깅할 수 있습니다.&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;대조적으로 Gnome의 glib은 C 표준 이외의 기능을 변경하므로 C로 된 모호한 래퍼 코드 디버깅을 처리할 수 있을 뿐만 아니라 Gnome이 래퍼 기능을 변경하기 때문에 코드가 작동하지 않을 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그림 A: g_snprintf()&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준 sprintf() 기능의 보다 안전한 형태.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력은 n자(종료 null 문자 포함)를 초과하지 않도록 보장되므로 버퍼 오버플로가 발생하지 않도록 보장하기 쉽습니다.&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;g_strdup_printf()도 참조하십시오.&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;1.2.3 이전 버전의 GLib에서는 출력이 잘린 경우 이 함수가 -1을 반환할 수 있으며 잘린 문자열은 null로 종료되지 않을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;1.3.12 이전 버전에서는 출력 문자열의 길이를 반환합니다.&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;g_snprintf()의 반환 값은 ISO C99에서 표준화된 snprintf() 함수를 준수합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력 문자열의 길이를 반환하는 기존 snprintf()와는 다릅니다.&lt;/font&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;형식 문자열에는 Single Unix 규격에 지정된 대로 위치 매개 변수가 포함될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Gnome을 대체할 링크드 리스트를 작성하게 된 것에 대한 감격이 덜합니다. 그리고 또 다른 버전의 snprintf()와 조용히 malloc() 메모리를 저장하는 crappy 래퍼 코드를 작성하여 C 코딩의 절대적인 최대치인 &quot;&lt;strong papago-id=&quot;47-1&quot;&gt;Always malloc() and free&lt;/strong&gt;() &lt;strong papago-id=&quot;47-1&quot;&gt;in same&lt;/strong&gt; scope&lt;strong papago-id=&quot;47-1&quot;&gt;&quot;&lt;/strong&gt;를 g_strdup_printf()로 대체할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;g_strdup_printf()&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;표준 C sprintf() 함수와 유사하지만 필요한 최대 공간을 계산하고 결과를 유지하기 위해 메모리를 할당하기 때문에 더 안전합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환된 문자열은 더 이상 필요하지 않을 때 g_free()로 해제해야 합니다.&lt;/font&gt;&lt;/p&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;여기에 gchar를 char로 변경하거나 gboolean을 boolean을 boolean으로 변경하는 등 &quot;유용한&quot; 일을 하기 위해 코드에 수많은 문자열 변경을 하는 스릴을 더하면 내 서브버전 비교가 전화번호부가 될 때까지 메스꺼움이 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 나쁜 것은, 당신은 결국 점점 더 많은 코드를 변경해야 한다는 것입니다. 왜냐하면 이 것들은 .h 파일들 전체에 흩어져 있기 때문에, 그것은 배에 실린 시체처럼 계속해서 거대한 혼란으로 확대되기 때문입니다.&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;strong papago-id=&quot;51-1&quot;&gt;어디&lt;/strong&gt;서든 glib&lt;strong papago-id=&quot;51-1&quot;&gt;.h&lt;/strong&gt;를 찾는다면, RUN!!!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;51-3&quot;&gt;그냥 안 된다고 해요!&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;52-0&quot;&gt;추신:&lt;/strong&gt; 소스를 다운로드하고, Gnome 고유의 유형을 모두 제거하고, 다시 컴파일하여 자신만의 &quot;g_&quot;-less functions sorta를 만들고, 어느 정도 효과가 있으며, 시간을 많이 절약할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전시 B: g_strdup_printf()&lt;/font&gt;&lt;/strong&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;font class=&quot;papago-parent&quot;&gt;Gnome에는 g_strdup_vprintf()와 같이 반환된 문자열을 보관하는 데 필요한 저장소의 양을 &quot;마법적으로&quot; 알고 있는 &quot;사랑스러운&quot; 기능이 많이 있습니다. 저는 &quot;마법적인&quot; 기능 뒤를 살펴볼 기회가 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 Cever의 가장 끔찍한 학대로 제 상을 받습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 래퍼 함수를 통해 g_strdup_vprintf()를 계속 추적하면 gmessages.c.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * g_printf_string_upper_bound:
 * @format: the format string. See the printf() documentation
 * @args: the parameters to be inserted into the format string
 *
 * Calculates the maximum space needed to store the output
 * of the sprintf() function.
 *
 * Returns: the maximum space needed to store the formatted string
 */
gsize
g_printf_string_upper_bound (const gchar *format,
                             va_list      args)
{
  gchar c;
  return _g_vsnprintf (&amp;amp;c, 1, format, args) + 1;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 printf() 기능이 절대 0일 때 snot보다 느릴 뿐만 아니라, 오버플로를 보장하는 저장을 위해 바이트 전체(예, gcharc 전체)를 할당한다는 것을 알게 될 것입니다. 하지만 누가 신경 쓰겠습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;()를 말로크하는 데 필요한 줄의 길이를 얻을 수 있습니다. 왜냐하면 그들은 돌아서서 전체 인쇄물 ()을 다시 수행할 것이기 때문입니다. 이번에는 충분한 저장 공간만으로 &quot;마법적으로&quot; 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 그 크기에 +1을 더할 것입니다. 그래서 당연히 끔찍한 비용을 지불해야 할 누런 터미네이터를 사용할 수 있는 여지가 있을 것입니다. 하지만 그들은 그것을 코드 깊숙이 숨겨놨기 때문에 그냥 포기하고 맹목적으로 사용할 것이고 이것이 얼마나 거대한 두뇌 조각인지 알아채지 못할 것이라고 장담합니다.&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;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;g_vsnprintf() 함수가 당신을 버리게 하지 마세요. 왜냐하면 gprintfint.h를 사용하면 작은 보석은 평범한 오래된 바닐라 vsnprintf()의 다른 이름에 불과하다는 것을 알게 될 것이기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* GLIB - Library of useful routines for C programming
 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * Modified by the GLib Team and others 2002.  See the AUTHORS
 * file for a list of people on the GLib Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GLib at ftp://ftp.gtk.org/pub/gtk/. 
 */

#ifndef __G_PRINTFINT_H__
#define __G_PRINTFINT_H__

#ifdef HAVE_GOOD_PRINTF

#define _g_printf    printf
#define _g_fprintf   fprintf
#define _g_sprintf   sprintf
#define _g_snprintf  snprintf

#define _g_vprintf   vprintf
#define _g_vfprintf  vfprintf
#define _g_vsprintf  vsprintf
#define _g_vsnprintf vsnprintf

#else

#include &quot;gnulib/printf.h&quot;

#define _g_printf    _g_gnulib_printf
#define _g_fprintf   _g_gnulib_fprintf
#define _g_sprintf   _g_gnulib_sprintf
#define _g_snprintf  _g_gnulib_snprintf

#define _g_vprintf   _g_gnulib_vprintf
#define _g_vfprintf  _g_gnulib_vfprintf
#define _g_vsprintf  _g_gnulib_vsprintf
#define _g_vsnprintf _g_gnulib_vsnprintf

#endif

#endif /* __G_PRINTF_H__ */
&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;Gnome과 함께 작업하기 전에 Oz의 마법사를 다시 보는 것이 좋습니다. 그래서 커튼 뒤를 보지 않는 것을 알 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 악몽에 온 걸 환영합니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Gnome이 C보다 더 안정적이라고 생각하는 사람은 비판적 사고가 많이 부족합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능과 투명성을 STL에서 더 잘 된 몇 가지 좋은 것과 교환합니다.&lt;/font&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;여기 최신 정보가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개발자가 실수를 깨달은 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;g_mem_is_system_malloc는 버전 2.46 이후로 사용되지 않으므로 새로 작성된 코드에서 사용하지 마십시오.&lt;/font&gt;&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GLib은 항상 시스템 malloc을 사용하므로 이 함수는 항상 TRUE를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;g_malloc()에서 사용하는 할당자가 시스템의 malloc 구현인지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;malloc()로 할당된 TRUE 메모리를 반환하면 g_malloc()로 할당된 메모리와 교환하여 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 GLIB 기반이 아닌 API에 의해 반환되는 할당된 메모리의 추가 복사본을 방지하는 데 유용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html#g-mem-is-system-malloc&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html#g-mem-is-system-malloc&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;66&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/2240154/why-use-glib-functions&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/917</guid>
      <comments>https://nicesource.tistory.com/917#entry917comment</comments>
      <pubDate>Tue, 31 Oct 2023 22:22:57 +0900</pubDate>
    </item>
    <item>
      <title>Swift 프로토콜 오류: 클래스 유형이 아닌 경우 'weak'을(를) 적용할 수 없습니다.</title>
      <link>https://nicesource.tistory.com/916</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Swift 프로토콜 오류: 클래스 유형이 아닌 경우 'weak'을(를) 적용할 수 없습니다.&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;protocol A : class { ... }

protocol A { ... }
&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;a를 추가하려고 하면 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;weak&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;: class&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;pre&gt;&lt;code&gt;protocol A { ... }

weak var delegate: A
&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;blockquote&gt; 
 &lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'weak'은(는) 클래스가 아닌 유형에 적용할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;blockquote&gt; 
 &lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'weak'을(를) 클래스 바인딩되지 않은 'A'에 적용하면 안 됩니다. 클래스 바인딩이 있는 프로토콜 준수 추가를 고려하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 &amp;gt;= 4:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protocol A : AnyObject { ... }
&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;스위프트 &amp;lt; 4:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protocol A : class { ... }
&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;https://docs.swift.org/swift-book/LanguageGuide/Protocols.html#ID281&quot; papago-id=&quot;11-1&quot; rel=&quot;noreferrer&quot;&gt;&quot;클래스&lt;/a&gt; 전용 &lt;a href=&quot;https://docs.swift.org/swift-book/LanguageGuide/Protocols.html#ID281&quot; papago-id=&quot;11-1&quot; rel=&quot;noreferrer&quot;&gt;프로토콜&lt;/a&gt;&quot;을 정의합니다&lt;a href=&quot;https://docs.swift.org/swift-book/LanguageGuide/Protocols.html#ID281&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;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;약한 참조는 &lt;em papago-id=&quot;12-1&quot;&gt;참조 유형&lt;/em&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;따라서 프로토콜을 준수하는 개체를 취약한 속성에 저장해야 하는 경우 프로토콜은 클래스 전용 프로토콜이어야 합니다.&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;protocol A { 
    var name : String { get set }
}

func foo(a : A) {
    a.name = &quot;bar&quot; // error: cannot assign to property: 'a' is a 'let' constant
}
&lt;/code&gt;&lt;/pre&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&gt;&lt;code&gt;a.name = &quot;bar&quot;&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;code&gt;a&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;protocol A : class { 
    var name : String { get set }
}
&lt;/code&gt;&lt;/pre&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;a&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;a&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;a.name = &quot;bar&quot;&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;a&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;/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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;11-1&quot;&gt;Swift&lt;/strong&gt; 4 &lt;strong papago-id=&quot;11-1&quot;&gt;이상&lt;/strong&gt;을 사용하는 경우 를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;AnyObject&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;pre&gt;&lt;code&gt;protocol A : AnyObject { ... }
&lt;/code&gt;&lt;/pre&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;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;class&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;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;class' 키워드를 사용하여 클래스 제한 프로토콜을 정의하는 것은 더 이상 사용되지 않습니다. 대신 'AnyObject'를 사용하십시오.&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;'class'를 'AnyObject'로 바꿉니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NSObject 또는 AnyObject와 같은 클래스 유형에서 프로토콜을 파생할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;protocol TopNewsTableDelegate : AnyObject {
    func topNewsTableDidLoadedStories()
}
&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;@objc protocol A { ... }
&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;protocol CustomProtocolName : NSObjectProtocol {
  // ...
}
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/33471858/swift-protocol-error-weak-cannot-be-applied-to-non-class-type&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>swift</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/916</guid>
      <comments>https://nicesource.tistory.com/916#entry916comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:16:00 +0900</pubDate>
    </item>
    <item>
      <title>C#에서 HTTP Post 데이터를 가져오는 방법?</title>
      <link>https://nicesource.tistory.com/915</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C#에서 HTTP Post 데이터를 가져오는 방법?&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;메일건 API를 사용하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 그들에게 URL을 제공해야 하는 부분이 있는데, 그러면 그들은 HTTP Post로 저에게 데이터를 올릴 것입니다.&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;저는 메일건에게 이 URL(http://test.com/MailGun/Webhook.aspx) 을 제공하여 그들이 데이터를 게시할 수 있도록 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 그들이 보내는 매개 변수 이름 목록을 가지고 있습니다(receiven, domain, ip, ...).&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;Webhook.aspx 페이지에서 다음과 같은 코드를 시도했지만 모두 비어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; lblrecipient.text= Request.Form[&quot;recipient&quot;];

 lblip.Text= Request.Params[&quot;ip&quot;];

 lbldomain.Text = Request.QueryString[&quot;domain&quot;];
&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;이 코드는 POST에서 전송되는 모든 양식 변수를 나열합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 게시물 값의 적절한 이름이 있는지 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;string[] keys = Request.Form.AllKeys;
for (int i= 0; i &amp;lt; keys.Length; i++) 
{
   Response.Write(keys[i] + &quot;: &quot; + Request.Form[keys[i]] + &quot;&amp;lt;br&amp;gt;&quot;);
}
&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;이 코드는 HTTP 요청에서 원시 입력 스트림을 읽습니다.&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;using(var reader = new StreamReader(Request.InputStream))
    content = reader.ReadToEnd();
&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&gt;&lt;code&gt;Request[&quot;recipient&quot;]&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;웹 요청 중에 클라이언트가 보낸 HTTP 값 읽기&quot;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;QueryString, Form, Cookies 또는 ServerVariables 컬렉션에서 데이터에 액세스하려면 Request[&quot;key&quot;]를 작성할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출처 : &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.httprequest(v=vs.110).aspx&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10-1&quot;&gt;MSDN&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;11&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;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MailGun이 사이트에 게시하는 값을 보려면 MailGun이 작성 중인 웹 요청에서 값을 읽어야 합니다. 이 값을 어딘가에 기록한 다음 페이지에 표시합니다.&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;MailGun이 POST 값을 보낼 엔드포인트와 기록된 값을 볼 때 사용하는 다른 페이지가 있어야 합니다.&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;따라서 이 페이지를 보고 요청 값을 읽을 때는 MailGun이 아닌 요청에서 값을 읽는 것입니다.&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;font class=&quot;papago-parent&quot;&gt;서버에 값을 기록/저장해야 합니다(메일건은 클라이언트).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 서버에서 해당 값을 검색해야 합니다(웹 브라우저가 있는 PC는 클라이언트가 됩니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 파일은 두 개의 완전히 다른 asx 파일(또는 매개 변수가 다른 동일한 파일)이 됩니다.&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;aspx 1페이지(메일건이 가지고 있는 것):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var val = Request.Form[&quot;recipient&quot;];
var file = new File(filename);
file.write(val);
close(file);
&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;aspx 2페이지:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var contents = &quot;&quot;;
if (File.exists(filename))
  var file = File.open(filename);
  contents = file.readtoend();
  file.close()

Request.write(contents);
&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;pre&gt;&lt;code&gt;    public void ShowAllPostBackData()
    {
        if (IsPostBack)
        {
            string[] keys = Request.Form.AllKeys;
            Literal ctlAllPostbackData = new Literal();
            ctlAllPostbackData.Text = &quot;&amp;lt;div class='well well-lg' style='border:1px solid black;z-index:99999;position:absolute;'&amp;gt;&amp;lt;h3&amp;gt;All postback data:&amp;lt;/h3&amp;gt;&amp;lt;br /&amp;gt;&quot;;
            for (int i = 0; i &amp;lt; keys.Length; i++)
            {
                ctlAllPostbackData.Text += &quot;&amp;lt;b&amp;gt;&quot; + keys[i] + &quot;&amp;lt;/b&amp;gt;: &quot; + Request[keys[i]] + &quot;&amp;lt;br /&amp;gt;&quot;;
            }
            ctlAllPostbackData.Text += &quot;&amp;lt;/div&amp;gt;&quot;;
            this.Controls.Add(ctlAllPostbackData);
        }
    }
&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;웹 브라우저에서 개발자 콘솔(Chrome 및 IE에서 F12)을 연 다음 네트워크 탭을 열고 요청 및 응답 데이터를 봅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 옵션 - Fiddler (http://fiddler2.com/) 를 사용합니다.&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;POST 요청이 페이지로 전송되는 것을 확인할 수 있게 되면 쿼리 문자열과 헤더를 확인합니다.&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;strong papago-id=&quot;21-0&quot;&gt;업데이트&lt;/strong&gt;: 죄송합니다. 먼저 MailGun API를 살펴보아야 했습니다. 브라우저를 통하지 않고 서버에서 직접 요청이 옵니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Request의 모든 멤버를 디버그하고 검사해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MailGun에서 POST를 받으면 파람스.&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;pre&gt;&lt;code&gt;string[] keys = Request.Form.AllKeys;
var value = &quot;&quot;;
for (int i= 0; i &amp;lt; keys.Length; i++) 
{
   // here you get the name eg test[0].quantity
   // keys[i];
   // to get the value you use
   value = Request.Form[keys[i]];
}
&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;pre&gt;&lt;code&gt;protected void Page_Load(object sender, EventArgs e){
    ...
    postValue = Request.Headers[&quot;Key&quot;];
&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;POST&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;var request = new NSMutableUrlRequest(url){
    HttpMethod = &quot;POST&quot;, 
    Headers = NSDictionary.FromObjectAndKey(FromObject(value), FromObject(&quot;key&quot;))
};
webView.LoadRequest(request);
&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;font class=&quot;papago-parent&quot;&gt;양식.열쇠'.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 작동하지 않을 경우 'request.inputStream'을 사용하여 모든 요청 키를 알려주는 soap 문자열을 얻을 수 있습니다.&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/20151556/how-to-get-the-http-post-data-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>ASP.NET</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/915</guid>
      <comments>https://nicesource.tistory.com/915#entry915comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:15:53 +0900</pubDate>
    </item>
    <item>
      <title>C 소비용 C++ 클래스 API 포장</title>
      <link>https://nicesource.tistory.com/914</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 소비용 C++ 클래스 API 포장&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/FFI 라이브러리에서 쉽게 사용할 수 있도록 DLL에서 랩핑하여 내보내야 하는 관련 C++ 클래스 세트가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이를 위한 &quot;베스트 프랙티스&quot;를 찾고 있습니다.&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;/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;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;각 공개 방법에 대해 C 함수가 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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;C 코드에서 클래스를 나타내려면 불투명 포인터도 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&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;void* 및 기타 정보를 포함하는 구조를 구축할 수 있지만 void*를 사용하는 것이 더 간단합니다(예: 어레이를 지원하는 경우?).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Fred.h
--------------------------------

#ifdef  __cplusplus
class Fred
{
    public:
    Fred(int x,int y);
    int doStuff(int p);
};
#endif

//
// C Interface.
typedef void*   CFred;

//
// Need an explicit constructor and destructor.
extern &quot;C&quot; CFred  newCFred(int x,int y);
extern &quot;C&quot; void   delCFred(CFred);

//
// Each public method. Takes an opaque reference to the object
// that was returned from the above constructor plus the methods parameters.
extern &quot;C&quot; int    doStuffCFred(CFred,int p);
&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 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;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;pre&gt;&lt;code&gt;CFred.cpp
--------------------------------

// Functions implemented in a cpp file.
// But note that they were declared above as extern &quot;C&quot; this gives them
// C linkage and thus are available from a C lib.
CFred newCFred(int x,int y)
{
    return reinterpret_cast&amp;lt;void*&amp;gt;(new Fred(x,y));
}

void delCFred(CFred fred)
{
    delete reinterpret_cast&amp;lt;Fred*&amp;gt;(fred);
}

int doStuffCFred(CFred fred,int p)
{
    return reinterpret_cast&amp;lt;Fred*&amp;gt;(fred)-&amp;gt;doStuff(p);
}
&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;로키 아스타리의 답은 매우 좋으나 샘플 코드는 C++ 클래스 안에 래핑 코드를 넣었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 포장 코드를 별도의 파일로 작성하는 것을 선호합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 랩핑 C 기능은 클래스 이름 앞에 붙이는 것이 더 좋은 스타일이라고 생각합니다.&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;다음의 블로그 게시물들은 그것을 하는 방법을 보여줍니다: http://blog.eikke.com/index.php/ikke/2005/11/03/using_c_classes_in_c.html&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;블로그가 폐기되어 결국 사라질 수도 있기 때문에 꼭 필요한 부분을 복사했습니다(Ikke's Blog의 크레딧).&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우선 헤더 파일 하나를 사용하는 C++ 클래스가 필요합니다(Test.hh).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class Test {
    public:
        void testfunc();
        Test(int i);

    private:
        int testint;
};
&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;1개의 구현 파일(Test.cc )&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &quot;Test.hh&quot;

using namespace std;

Test::Test(int i) {
    this-&amp;gt;testint = i;
}

void Test::testfunc() {
    cout &amp;lt;&amp;lt; &quot;test &quot; &amp;lt;&amp;lt; this-&amp;gt;testint &amp;lt;&amp;lt; endl;
}
&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;이것은 기본적인 C++ 코드입니다.&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;이 코드는 C와 C++ 사이에 있는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 헤더 파일이 하나 나왔습니다. (TestWrapper.h, C++ 코드가 포함되어 있지 않기 때문에 .)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef void CTest;

#ifdef __cplusplus
extern &quot;C&quot; {
#endif

CTest * test_new(int i);
void test_testfunc(const CTest *t);
void test_delete(CTest *t);
#ifdef __cplusplus
}
#endif
&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;및 기능 구현(TestWrapper.cc , .cc는 C++ 코드를 포함하고 있으므로):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &quot;TestWrapper.h&quot;
#include &quot;Test.hh&quot;

extern &quot;C&quot; {

    CTest * test_new(int i) {
        Test *t = new Test(i);

        return (CTest *)t;
    }

    void test_testfunc(const CTest *test) {
        Test *t = (Test *)test;
        t-&amp;gt;testfunc();
    }

    void test_delete(CTest *test) {
        Test *t = (Test *)test;

        delete t;
    }
}
&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;내 경험에서 나온 몇 가지 의견:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li 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;오류 설명을 문자열 형태로 반환하는 기능이 있으면 유용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 모든 반환 값은 모수를 벗어나야 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;pre&gt;&lt;code&gt;C_ERROR BuildWidget(HUI ui, HWIDGET* pWidget);
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유효성에 대한 핸들 확인을 위해 구조물에 서명/핸들 포인터를 classes합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;pre&gt;&lt;code&gt;C_ERROR BuildWidget(HUI ui, HWIDGET* pWidget){
    Ui* ui = (Ui*)ui;
    if(ui.Signature != 1234)
    return BAD_HUI;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DLL의 메모리 할당 방식과 앱 소비 방식이 다를 수 있으므로 DLL에서 내보낸 함수를 사용하여 개체를 생성하고 릴리스해야 합니다.&lt;/font&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;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;C_ERROR CreateUi(HUI* ui);
C_ERROR CloseUi(HUI hui); // usually error codes don't matter here, so may use void
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li 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;이를 통해 사용자는 실제 크기를 알아보기 위해 내부를 해킹하지 않고도 디스크, DB 또는 원하는 곳에 저장할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않으면 사용자가 데이터를 알려진 크기의 바이트 배열로 변환하는 데만 사용할 자신의 파일 I/O api를 제공해야 합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;C_ERROR CreateBitmap(HUI* ui, SIZE size, char** pBmpBuffer, int* pSize);
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신의 객체가 당신의 C++ 라이브러리 밖에서 어떤 전형적인 표현을 가지고 있다면, 이 표현으로 변환하는 평균을 제공하세요 (예를 들어, 당신이 어떤 클래스를 가지고 있다면)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Image&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;HIMG&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;handle, window HBITMAP)로 변환 및 변환할 수 있는 기능을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 통해 기존 API와의 통합이 간소화됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;C_ERROR BitmapToHBITMAP(HUI* ui, char* bmpBuffer, int size, HBITMAP* phBmp);
&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;첫째, 당신의 모든 메소드를 C 함수로 변환할 필요가 없을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;API를 단순화하고 C++ 인터페이스를 일부 숨길 수 있다면 C++ 로직을 뒤로 변경할 때 C API를 변경할 기회를 최소화할 수 있으므로 더 좋습니다.&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;따라서 해당 API를 통해 제공될 상위 수준의 추상화를 생각해 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;설명한 void* 솔루션을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 보기에는 가장 적절합니다(또는 HANDLE으로 def void*를 입력합니다 :).&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;벡터(및 문자열::c_str)를 사용하여 C++가 아닌 API와 데이터를 교환합니다. (&lt;em papago-id=&quot;31-1&quot;&gt;&lt;a href=&quot;http://www.gotw.ca/publications/c++cs.htm&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-1-0&quot;&gt;C++ Coding Standards&lt;/a&gt;&lt;/em&gt;의 가이드라인 #78, H. Sutter/ A.&lt;/font&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;PS &quot;시공자가 원래 주장 목록을 유지할 수 있다&quot;는 것은 사실이 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 C 호환되는 인수 유형에만 해당됩니다.&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;PS2 물론 &lt;a href=&quot;https://stackoverflow.com/questions/1588788/wrapping-c-class-api-for-c-consumption/1588807#1588807&quot; papago-id=&quot;33-1&quot;&gt;C&lt;/a&gt; ăt ălin을 듣고 인터페이스를 가능한 작고 간단하게 유지합니다.&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;이 내용은 C++ FAQ&lt;a href=&quot;http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html&quot; papago-id=&quot;34-1&quot; rel=&quot;nofollow noreferrer&quot;&gt; Lite&lt;/a&gt;에서 &quot;&lt;a href=&quot;http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html&quot; papago-id=&quot;34-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;C와 &lt;/a&gt;C++의 &lt;a href=&quot;http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html&quot; papago-id=&quot;34-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;혼합&lt;/a&gt;&quot;에 관심이 있을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;구체적으로 &lt;a href=&quot;https://isocpp.org/wiki/faq/mixing-c-and-cpp#cpp-objs-passed-to-c&quot; papago-id=&quot;34-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;[32.8] C++ 클래스의 객체를 &lt;/a&gt;C&lt;a href=&quot;https://isocpp.org/wiki/faq/mixing-c-and-cpp#cpp-objs-passed-to-c&quot; papago-id=&quot;34-3&quot; rel=&quot;nofollow noreferrer&quot;&gt; 함수로/또는&lt;/a&gt; C 함수로 &lt;a href=&quot;https://isocpp.org/wiki/faq/mixing-c-and-cpp#cpp-objs-passed-to-c&quot; papago-id=&quot;34-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;전달하려면 어떻게&lt;/a&gt; 해야 &lt;a href=&quot;https://isocpp.org/wiki/faq/mixing-c-and-cpp#cpp-objs-passed-to-c&quot; papago-id=&quot;34-3&quot; rel=&quot;nofollow noreferrer&quot;&gt;합니까?&lt;/a&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/1588788/wrapping-c-class-api-for-c-consumption&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/914</guid>
      <comments>https://nicesource.tistory.com/914#entry914comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:15:45 +0900</pubDate>
    </item>
    <item>
      <title>가변 인수는 gcc에서 어떻게 구현됩니까?</title>
      <link>https://nicesource.tistory.com/913</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가변 인수는 gcc에서 어떻게 구현됩니까?&lt;/font&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int max(int n, ...)
&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;사용중입니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cdecl&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&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;va_end&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;va_start&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;code&gt;va_arg&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;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출자가 인수 배열의 주소를 max로 두 번째 인수로 전달합니까?&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;C 언어가 스택에 매개 변수를 저장하는 방식을 살펴보면 매크로가 작동하는 방식이 명확해야 합니다:-&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Higher memory address    Last parameter
                         Penultimate parameter
                         ....
                         Second parameter
Lower memory address     First parameter
       StackPointer  -&amp;gt;  Return address
&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;논쟁들은 항상&lt;sup papago-id=&quot;10-1&quot;&gt;1&lt;/sup&gt; 이렇게 저장됩니다, 심지어 그것들이 없어도.&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 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;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&gt;&lt;code&gt;va_start&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;macro는 첫 번째 함수 파라미터에 대한 포인터를 설정합니다. 예:-&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; void func (int a, ...)
 { 
   // va_start
   char *p = (char *) &amp;amp;a + sizeof a;
 }
&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 class=&quot;papago-parent&quot;&gt;어떤것은&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;p&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;두번째 파라미터를 가리킵니다. 더&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;va_arg&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 class=&quot;papago-parent&quot;&gt;매크로가 이 작업을 수행합니다:-&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; void func (int a, ...)
 { 
   // va_start
   char *p = (char *) &amp;amp;a + sizeof a;

   // va_arg
   int i1 = *((int *)p);
   p += sizeof (int);

   // va_arg
   int i2 = *((int *)p);
   p += sizeof (int);

   // va_arg
   long i2 = *((long *)p);
   p += sizeof (long);
 }
&lt;/code&gt;&lt;/pre&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 class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;va_end&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 class=&quot;papago-parent&quot;&gt;macro는 그냥 설정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;p&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 class=&quot;papago-parent&quot;&gt;치에 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NULL&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 class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&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;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&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;컴파일러와 일부 RISC CPU를 최적화하면 스택을 사용하지 않고 레지스터에 파라미터를 저장합니다.&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;...&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 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;/li&gt; 
&lt;/ol&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 class=&quot;papago-parent&quot;&gt;스택에 인수가 전달되면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;va_&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 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;va_start&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 class=&quot;papago-parent&quot;&gt;,그리고 나서.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;va_arg&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 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;매개변수를 반복할 때 &quot;스택&quot;에서 인수를 &quot;pops&quot;합니다.&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;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&gt;&lt;code&gt;max&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 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&gt;&lt;code&gt;max(a, b, c);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&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&gt;&lt;code&gt;max&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 class=&quot;papago-parent&quot;&gt;function, 스택은 기본적으로 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre papago-id=&quot;32&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;|  c |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;|  b |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;|  a ||&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;| 레트 |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SP -&amp;gt; +---------+&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;SP&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 class=&quot;papago-parent&quot;&gt;진짜 스택 포인터인데, 사실은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;a&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&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;b&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 class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&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;code&gt;ret&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 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;32&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;va_start(ap, n)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;does는 인수의 주소를 사용합니다 (&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;34&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 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;|  c |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ap -&amp;gt; | b |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;|  a ||&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;| 레트 |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SP -&amp;gt; +---------+&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&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;va_arg(ap, int)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&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;Private Stack 포인터가 가리키는 것을 반환하고 다음 인수에서 Private Stack 포인터를 now point로 변경하여 &quot;pops&quot;합니다.&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;pre 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;ap -&amp;gt; | c |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;|  b |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;|  a ||&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;| 레트 |&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SP -&amp;gt; +---------+&lt;/font&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;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 함수 프로토타입이 (,...)로 선언되면 컴파일러는 varargs 플래그로 표시된 구문 트리를 설정하고 명명된 인수의 유형을 참조합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;엄격한 C 적합성을 위해 각 명명된 인수는 해당 매개 변수가 va_start의 명명 필드이고 va_arg()로 반환될 가능성이 있을 때 va_list를 설정하는 데 필요한 추가 정보를 가져와야 하지만 대부분의 컴파일러는 마지막 명명된 인수에 대해 이 정보를 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수가 정의되면 해당 프롤로그 생성기는 varargs 플래그가 설정되었음을 확인하고 va_start 매크로가 참조할 수 있는 오프셋을 알고 있는 숨겨진 필드를 설정하는 데 필요한 코드를 프레임에 추가합니다.&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;해당 함수에 대한 참조를 찾으면 이름이 지정된 인수에 대해 va_start 및 va_arg에 대해 설정된 필드에 추가되는 배열 경계와 같은 런타임 유형 정보의 숨겨진 필드를 추가로 도입할 수 있는...을 나타내는 각 인수에 대한 추가 구문 분석 및 코드 생성 트리를 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 결합된 트리는 매개 변수 값을 프레임에 복사하기 위해 생성되는 코드를 결정하고, 프롤로그는 임의의 또는 마지막으로 명명된 매개 변수에서 시작하는 va_list를 생성하기 위해 va_start에 필요한 것을 설정하며, va_arg()의 각 호출은 다음에서 유효성 검사에 사용되는 매개 변수 특정 숨겨진 필드를 참조하는 인라인 코드를 생성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 시간은 예상 반환이 컴파일 중인 표현 사용과 호환되는 할당이며, 필요한 인수 프로모션/coerc을 수행합니다.&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;이러한 각 단계에는 각 인수에 스택의 첫 번째 명명된 인수보다 일정 거리가 할당된 고정 크기가 있다고 가정하는 va_start() 및 va_arg()의 단순한 기본 정의를 재정의하는 config/proc/proc.c 및 proc.h 파일에 캡슐화된 프로세서 및 호출 규약 종속성이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 플랫폼 또는 언어의 경우 고정 크기 스택보다 별도의 malloc()로 구현된 매개 변수 프레임이 더 바람직합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 이러한 용도는 스레드 안전이 아닙니다. 함수 반환 또는 스레드 중단으로 인해 매개 변수 프레임이 유효하지 않도록 하는 지정되지 않은 방법 없이 va_list 참조를 다른 스레드에 전달하는 것은 안전하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;49&quot;&gt;ReferenceURL : &lt;a href=&quot;https://stackoverflow.com/questions/12371450/how-are-variable-arguments-implemented-in-gcc&quot; target=&quot;_blank&quot; papago-id=&quot;49-1&quot;&gt;https://stackoverflow.com/questions/12371450/how-are-variable-arguments-implemented-in-gcc&lt;/a&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/913</guid>
      <comments>https://nicesource.tistory.com/913#entry913comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:15:36 +0900</pubDate>
    </item>
    <item>
      <title>현재 카테고리의 워드프레스 게시물만 나열합니다.</title>
      <link>https://nicesource.tistory.com/912</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;워드프레스 사이트에 두 번째 탐색 메뉴를 만들려고 합니다.&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;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;get_ posts 함수를 실험해 보았지만 현재 범주를 동적으로 선택하는 방법을 찾는데 &lt;strong papago-id=&quot;3-1&quot;&gt;어려움&lt;/strong&gt;을 겪고 있습니다. 즉, 여기 &lt;strong papago-id=&quot;3-1&quot;&gt;범주&lt;/strong&gt;에 무엇을 넣을 것인가=x&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 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;&amp;lt;ul id=&quot;catnav&quot;&amp;gt;

     &amp;lt;?php
     global $post;
     $myposts = get_posts('numberposts=5&amp;amp;category=1');
     foreach($myposts as $post) :
     ?&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;&amp;lt;?php the_permalink(); ?&amp;gt;&quot;&amp;gt;&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
     &amp;lt;?php endforeach; ?&amp;gt;



    &amp;lt;/ul&amp;gt;
&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;여기서 나온 이 코드로 드디어 해결: http://www.snilesh.com/resources/wordpress/wordpress-recent-posts-from-current-same-category/&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;pre&gt;&lt;code&gt;&amp;lt;ul id=&quot;catnav&quot;&amp;gt;
&amp;lt;?php
global $post;
$category = get_the_category($post-&amp;gt;ID);
$category = $category[0]-&amp;gt;cat_ID;
$myposts = get_posts(array('numberposts' =&amp;gt; 5, 'offset' =&amp;gt; 0, 'category__in' =&amp;gt; array($category), 'post_status'=&amp;gt;'publish', 'order'=&amp;gt;'ASC' ));
foreach($myposts as $post) :
setup_postdata($post);
?&amp;gt;
&amp;lt;li&amp;gt;
&amp;lt;a href=&quot;&amp;lt;?php the_permalink(); ?&amp;gt;&quot;&amp;gt;
&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;?php endforeach; ?&amp;gt;
&amp;lt;?php wp_reset_query(); ?&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;?p=46&quot;&amp;gt;Why Us?&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;

&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!--Insted Of this--&amp;gt;
$myposts = get_posts('numberposts=5&amp;amp;category=1');
&amp;lt;!--Use This--&amp;gt;
$cat_ID = get_query_var('cat');
query_posts('cat='.$cat_ID.'&amp;amp;showposts=5&amp;amp;order=ASC');
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;$args=array(
'cat' =&amp;gt; get_query_var('cat'),
  'orderby' =&amp;gt; 'title',
  'order' =&amp;gt; 'ASC',
  'posts_per_page'=&amp;gt;-1,
  'caller_get_posts'=&amp;gt;1
);
$my_query = new WP_Query($args);
&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;/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; &amp;lt;ul id=&quot;catnav&quot;&amp;gt;

 &amp;lt;?php
foreach( ( get_the_category() ) as $category ) {
$the_query = new WP_Query('category_name=' . $category-&amp;gt;category_nicename . '&amp;amp;showposts=5&amp;amp;order=ASC');
while ($the_query-&amp;gt;have_posts()) : $the_query-&amp;gt;the_post();
?&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&quot;&amp;lt;?php the_permalink(); ?&amp;gt;&quot; title=&quot;&amp;lt;?php the_title(); ?&amp;gt;&quot;&amp;gt;&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
&amp;lt;?php endwhile; ?&amp;gt;
&amp;lt;?php
}
?&amp;gt;


&amp;lt;/ul&amp;gt;
&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;font class=&quot;papago-parent&quot;&gt;제가 제외하고 싶은 두 개의 카테고리에 게시물이 존재합니다. 8, 9, 11 카테고리에 게시물이 표시됩니다.&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;카테고리명 대신 카테고리 id에서 게시물을 받는 것이 좋다고 생각합니다. if other 조건을 작성할 수 있고 id가 8,9,11인 게시물을 제외할 수 있습니다.&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;URL : https://stackoverflow.com/questions/13010805/list-wordpress-posts-from-current-category-only&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>WordPress</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/912</guid>
      <comments>https://nicesource.tistory.com/912#entry912comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:15:29 +0900</pubDate>
    </item>
    <item>
      <title>Retrofit 2 - 동적 URL</title>
      <link>https://nicesource.tistory.com/911</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Retrofit 2 - 동적 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;Retrofit 2를 사용하면 다음과 같은 서비스 메서드의 주석에 전체 URL을 설정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public interface APIService {
  @GET(&quot;http://api.mysite.com/user/list&quot;)
  Call&amp;lt;Users&amp;gt; getUsers();
}
&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;그러나 제 앱에서는 컴파일 시 웹 서비스의 URL을 알 수 없고 앱에서 다운로드한 파일로 검색하므로 전체 동적 URL로 레트로핏 2를 사용할 수 있는 방법이 궁금합니다.&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;public interface APIService {
  @GET(&quot;{fullUrl}&quot;)
  Call&amp;lt;Users&amp;gt; getUsers(@Path(&quot;fullUrl&quot;) fullUrl);
}

new Retrofit.Builder()
  .baseUrl(&quot;http://api.mysite.com/&quot;)
  .build()
  .create(APIService.class)
  .getUsers(&quot;http://api.mysite.com/user/list&quot;); // this url should be dynamic
  .execute();
&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;그러나 여기서 Retrofit은 경로가 실제로 전체 URL이 아니라고 보고 다운로드를 시도하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;http://api.mysite.com/http%3A%2F%2Fapi.mysite.com%2Fuser%2Flist&lt;/code&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;이렇게 동적인 url로 Retrofit을 어떻게 사용할 수 있는지 힌트가 있습니까?&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;p papago-id=&quot;7&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;https://github.com/square/retrofit/blob/master/CHANGELOG.md#version-200-beta1-2015-08-27&quot; papago-id=&quot;7-1&quot;&gt;로그&lt;/a&gt;에서 발췌한 내용입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새로 만들기: @URL 매개 변수 주석을 사용하면 끝점에 대한 전체 URL을 전달할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;public interface APIService {
    @GET
    Call&amp;lt;Users&amp;gt; getUsers(@Url String url);
}
&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;url의 일부만 교체하고 싶었으며, 이 솔루션을 사용하면 url 전체를 전달할 필요가 없고 동적인 부분만 전달할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public interface APIService {

  @GET(&quot;users/{user_id}/playlists&quot;)
  Call&amp;lt;List&amp;lt;Playlist&amp;gt; getUserPlaylists(@Path(value = &quot;user_id&quot;, encoded = true) String userId);
}
&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;strong papago-id=&quot;1-1&quot;&gt;암호화&lt;/strong&gt;된 플래그를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Path&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;pre&gt;&lt;code&gt;public interface APIService {
  @GET(&quot;{fullUrl}&quot;)
  Call&amp;lt;Users&amp;gt; getUsers(@Path(value = &quot;fullUrl&quot;, encoded = true) String fullUrl);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&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;/&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;code&gt;%2F&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;/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;그것은 당신을 구원하지 못할 것입니다.&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&gt;&lt;code&gt;%3F&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;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Retrofit 2.0.0-beta2 기준, 이 URL에서 JSON을 응답하는 서비스가 있는 경우: &lt;a href=&quot;http://myhost/mypath&quot; papago-id=&quot;19-1&quot;&gt;http://myhost/mypath&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;다음이 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public interface ClientService {
    @GET(&quot;&quot;)
    Call&amp;lt;List&amp;lt;Client&amp;gt;&amp;gt; getClientList();
}

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(&quot;http://myhost/mypath&quot;)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

ClientService service = retrofit.create(ClientService.class);

Response&amp;lt;List&amp;lt;Client&amp;gt;&amp;gt; response = service.getClientList().execute();
&lt;/code&gt;&lt;/pre&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;public interface ClientService {
    @GET
    Call&amp;lt;List&amp;lt;Client&amp;gt;&amp;gt; getClientList(@Url String anEmptyString);
}

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(&quot;http://myhost/mypath&quot;)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

ClientService service = retrofit.create(ClientService.class);

Response&amp;lt;List&amp;lt;Client&amp;gt;&amp;gt; response = service.getClientList(&quot;&quot;).execute();
&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;다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;@GET(&quot;group/{id}/users&quot;)&lt;/code&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;code&gt;Call&amp;lt;List&amp;lt;User&amp;gt;&amp;gt; groupList(@Path(&quot;id&quot;) int groupId, @Query(&quot;sort&quot;) String sort);&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 https://square.github.io/retrofit/ 설명서를 참조하십시오.&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;MVVM(Retrofit)에서 Get and Post 메서드를 사용한 동적 URL&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Retrofit 서비스 인터페이스:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public interface NetworkAPIServices {

@POST()
Observable&amp;lt;JsonElement&amp;gt; executXYZServiceAPI(@Url String url,@Body AuthTokenRequestModel param);


@GET
Observable&amp;lt;JsonElement&amp;gt; executeInserInfo(@Url String url);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MVVM 서비스 클래스:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   public Observable&amp;lt;JsonElement&amp;gt; executXYZServiceAPI(ModelObject object) {
    return networkAPIServices.authenticateAPI(&quot;url&quot;,
            object);
}

 public Observable&amp;lt;JsonElement&amp;gt; executeInserInfo(String ID) {
    return networkAPIServices.getBank(DynamicAPIPath.mergeUrlPath(&quot;url&quot;+ID)));
}
&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;그리고 Retrofit 클라이언트 클래스&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; @Provides
@Singleton
@Inject
@Named(&quot;provideRetrofit2&quot;)
Retrofit provideRetrofit(@Named(&quot;provideRetrofit2&quot;) Gson gson, @Named(&quot;provideRetrofit2&quot;) OkHttpClient okHttpClient) {


   builder = new Retrofit.Builder();
    if (BaseApplication.getInstance().getApplicationMode() == ApplicationMode.DEVELOPMENT) {
        builder.baseUrl(NetworkURLs.BASE_URL_UAT);
    } else {
        builder.baseUrl(NetworkURLs.BASE_URL_PRODUCTION);
    }


    builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
    builder.client(okHttpClient);
    builder.addConverterFactory(GsonConverterFactory.create(gson));


    return builder.build();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 이것은 https://gethelp.wildapricot.com/en/articles/549-changing-your&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;baseURL : https://gethelp.wildapricot.com&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;나머지 @Url: /en/articles/549-changing-your(복고 서비스 클래스에서 통과)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1단계&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  Please define a method in Api interface like:-
 @FormUrlEncoded
 @POST()
 Call&amp;lt;RootLoginModel&amp;gt; getForgotPassword(
        @Url String apiname,
        @Field(ParameterConstants.email_id) String username
 );
&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;strong papago-id=&quot;32-0&quot;&gt;단계-2&lt;/strong&gt; 모범 사례를 위해 레트로핏 인스턴스에 대한 클래스를 정의합니다:-&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  public class ApiRequest {
       static Retrofit retrofit = null;



public static Retrofit getClient() {
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
            .addInterceptor(logging)
            .connectTimeout(60, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .build();

    if (retrofit==null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(URLConstants.base_url)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}
&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;strong papago-id=&quot;33-1&quot;&gt;3단계&lt;/strong&gt;는 활동에서 다음과 같이 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  final APIService request =ApiRequest.getClient().create(APIService.class);
  Call&amp;lt;RootLoginModel&amp;gt; call = request.getForgotPassword(&quot;dynamic api 
  name&quot;,strEmailid);
&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;a href=&quot;https://github.com/G-Corporation/RetrofitHelper&quot; papago-id=&quot;34-0&quot; rel=&quot;noreferrer&quot;&gt;레트로핏&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코틀린으로 작성된 &lt;a href=&quot;https://github.com/G-Corporation/RetrofitHelper&quot; papago-id=&quot;34-0&quot; rel=&quot;noreferrer&quot;&gt;도우미&lt;/a&gt; 라이브러리를 통해 몇 줄의 코드를 사용하여 API 호출을 할 수 있으며, 모든 호출에서 &lt;strong papago-id=&quot;34-2&quot;&gt;헤더와 파라미터 &lt;/strong&gt;등 &lt;strong papago-id=&quot;34-2&quot;&gt;다양한 URL&lt;/strong&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;다음과 같이 응용프로그램 클래스에 여러 URL을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class Application : Application() {

    override fun onCreate() {
    super.onCreate()

        retrofitClient = RetrofitClient.instance
                    //api url
                .setBaseUrl(&quot;https://reqres.in/&quot;)
                    //you can set multiple urls
        //                .setUrl(&quot;example&quot;,&quot;http://ngrok.io/api/&quot;)
                    //set timeouts
                .setConnectionTimeout(4)
                .setReadingTimeout(15)
                    //enable cache
                .enableCaching(this)
                    //add Headers
                .addHeader(&quot;Content-Type&quot;, &quot;application/json&quot;)
                .addHeader(&quot;client&quot;, &quot;android&quot;)
                .addHeader(&quot;language&quot;, Locale.getDefault().language)
                .addHeader(&quot;os&quot;, android.os.Build.VERSION.RELEASE)
            }

        companion object {
        lateinit var retrofitClient: RetrofitClient

        }
    }  
&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;그런 다음 필요한 URL을 통화에 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;retrofitClient.Get&amp;lt;GetResponseModel&amp;gt;()
            //set base url
            .setBaseUrlKey(&quot;example&quot;)
            //set path
            .setPath(&quot;api/users/2&quot;)
            //set url params Key-Value or HashMap
            .setUrlParams(&quot;KEY&quot;,&quot;Value&quot;)
            .setResponseHandler(GetResponseModel::class.java,
                object : ResponseHandler&amp;lt;GetResponseModel&amp;gt;() {
                    override fun onSuccess(response: Response&amp;lt;GetResponseModel&amp;gt;) {
                        super.onSuccess(response)
                        //handle response
                    }
                }).run(this)
&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;a href=&quot;https://github.com/G-Corporation/RetrofitHelper/wiki&quot; rel=&quot;noreferrer&quot; papago-id=&quot;37-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;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 코드 설정이 되어 있고 다른 인터페이스를 변경하지 않으려면 이 &lt;a href=&quot;https://futurestud.io/tutorials/retrofit-2-how-to-change-api-base-url-at-runtime-2&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;9-1&quot;&gt;링크&lt;/a&gt;에 설명된 솔루션을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;요점은 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;changeApiBaseUrl&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 class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL을 업데이트하고 Retrofit Builder를 다시 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class ServiceGenerator {  
public static String apiBaseUrl = &quot;http://futurestud.io/api&quot;;
private static Retrofit retrofit;

private static Retrofit.Builder builder =
        new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(apiBaseUrl);

private static OkHttpClient.Builder httpClient =
        new OkHttpClient.Builder();

// No need to instantiate this class.
private ServiceGenerator() {
}

public static void changeApiBaseUrl(String newApiBaseUrl) {
    apiBaseUrl = newApiBaseUrl;

    builder = new Retrofit.Builder()
                    .addConverterFactory(GsonConverterFactory.create())
                    .baseUrl(apiBaseUrl);
}

public static &amp;lt;S&amp;gt; S createService(Class&amp;lt;S&amp;gt; serviceClass, AccessToken token) {
    String authToken = token.getTokenType().concat(token.getAccessToken());
    return createService(serviceClass, authToken);
}

// more methods
// ...
}
&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;pre&gt;&lt;code&gt;public class DynamicBaseUrlActivity extends AppCompatActivity {

public static final String TAG = &quot;CallInstances&quot;;
private Callback&amp;lt;ResponseBody&amp;gt; downloadCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file_upload);

    downloadCallback = new Callback&amp;lt;ResponseBody&amp;gt;() {
        @Override
        public void onResponse(Call&amp;lt;ResponseBody&amp;gt; call, Response&amp;lt;ResponseBody&amp;gt; response) {
            Log.d(TAG, &quot;server contacted at: &quot; + call.request().url());
        }

        @Override
        public void onFailure(Call&amp;lt;ResponseBody&amp;gt; call, Throwable t) {
            Log.d(TAG, &quot;call failed against the url: &quot; + call.request().url());
        }
    };

    // first request
    FileDownloadService downloadService = ServiceGenerator.create(FileDownloadService.class);
    Call&amp;lt;ResponseBody&amp;gt; originalCall = downloadService.downloadFileWithFixedUrl();
    originalCall.enqueue(downloadCallback);

    // change base url
    ServiceGenerator.changeApiBaseUrl(&quot;http://development.futurestud.io/api&quot;);

    // new request against new base url
    FileDownloadService newDownloadService = ServiceGenerator.create(FileDownloadService.class);
    Call&amp;lt;ResponseBody&amp;gt; newCall = newDownloadService.downloadFileWithFixedUrl();
    newCall.enqueue(downloadCallback);
    }
}
&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;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/32559333/retrofit-2-dynamic-url&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Android</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/911</guid>
      <comments>https://nicesource.tistory.com/911#entry911comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:15:22 +0900</pubDate>
    </item>
    <item>
      <title>목표-C에서 프로토콜/딜러를 확장하는 방법은 무엇입니까?</title>
      <link>https://nicesource.tistory.com/910</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;AVAudioPlayer와 같은 클래스를 확장하려면 AVAudioPlayer Delegate에 다른 방법을 추가하는 가장 좋은 방법은 무엇입니까?&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;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확장할 경우 실제 위임자 getter/setter를 덮어쓰도록 해야 합니까?&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;pre&gt;&lt;code&gt;@protocol AudioTrackDelegate : AVAudioPlayerDelegate {
    - (void)foo;
}
@end

@interface AudioTrack : AVAudioPlayer {
}
@end
&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;@protocol NewProtocol &amp;lt;OldProtocol&amp;gt;
- (void)foo;
@end
&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&gt;&lt;code&gt;NewProtocol&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;OldProtocol&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&gt;&lt;code&gt;respondsToSelector&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;pre&gt;&lt;code&gt;if ([object respondsToSelector:@selector(foo)])
    [(id)object foo];
&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&gt;&lt;/font&gt;&lt;code&gt;NSObject&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;pre&gt;&lt;code&gt;@interface NSObject (NewProtocol)
- (void)foo;
@end
@implementation NSObject (NewProtocol)
- (void)foo
{
}
@end
&lt;/code&gt;&lt;/pre&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;프로토콜은 컴파일된 앱에 코드를 추가하지 않습니다. 프로토콜은 클래스가 프로토콜에 &quot;적합한&quot; 것으로 간주되는 메서드를 구현해야 한다는 사실만 강제합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 유용하게 사용하면 동일한 방식의 작동 방식으로 클래스 그룹을 생성할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;printable&amp;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;code&gt;&amp;lt;serialized&amp;gt;&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;code&gt;&amp;lt;plays&amp;gt;&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;@protocol plays
    - (void) play;
    - (NSString *) type;
@end
&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;&amp;lt;plays&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MUST를 구현해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;play&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;type&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 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;if ([obj conformsTo: @protocol(plays)]) {
    [obj play];
}
&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;카테고리는 실제로 클래스에 새 메서드를 동적으로 추가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 메서드는 선택기로 런타임에 전역적으로 액세스할 수 있으며 이름으로 호출할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@selector(foo)&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;[object foo:bar];&lt;/code&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;보안 문제가 있을 수 있으며 수업 중에 메모리 누수 등이 발생할 수 있습니다.&lt;/font&gt;&lt;/p&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;AVAudioPlayerDelegate_TrackOps.m&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#import &quot;AVAudioPlayerDelegate.h&quot;
@implementation AVAudioPlayerDelegate (TrackOps)

- (NSObject *) foo {
    // do foo stuff;
    return bar;
}

@end
&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;NSObject&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;foo&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;Foo&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;Objc_perform_selector(@selector(foo))&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;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;a href=&quot;http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;목표-C 소개&quot; papago-id=&quot;29-1&quot; papago-attr-id=&quot;2&quot;&gt;Apple의 Objective-C 소개&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;URL : https://stackoverflow.com/questions/732701/how-to-extend-protocols-delegates-in-objective-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>iPhone</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/910</guid>
      <comments>https://nicesource.tistory.com/910#entry910comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:15:11 +0900</pubDate>
    </item>
    <item>
      <title>wp_nav_메뉴 항목에 특징 이미지 추가</title>
      <link>https://nicesource.tistory.com/909</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;wp_nav_메뉴 항목에 특징 이미지 추가&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;셀프 Q&amp;amp;A입니다.&lt;/font&gt;&lt;/strong&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;wp_nav_메뉴의 출력에 나타나는 text/html을 어떻게 수정합니까?&lt;/font&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;사용자 지정 워커를 사용하여 이 작업을 수행하는 예를 볼 수 있지만 코드는 작은 변경 사항에 대해 매우 복잡합니다.&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 papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 특정 메뉴에 필터를 추가해야 합니다(필요한 경우 모든 메뉴에 추가할 수 있음 - add_filter 라인을 직접 사용하기만 하면 됨).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Add filter to specific menus 
add_filter('wp_nav_menu_args', 'add_filter_to_menus');
function add_filter_to_menus($args) {

    // You can test agasint things like $args['menu'], $args['menu_id'] or $args['theme_location']
    if( $args['theme_location'] == 'header_menu') {
        add_filter( 'wp_setup_nav_menu_item', 'filter_menu_items' );
    }

    return $args;
}
&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;그러면 $item 개체에서 post 또는 category ID를 필터로 전달하기 위해 코드를 작성해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;$ 항목에는 기본 포스트/카테고리 ID가 포함되지 않고 메뉴 항목 ID만 포함되어 있기 때문에 예상보다 쉽지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 URL을 사용하여 ID를 역방향 조회합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em papago-id=&quot;7&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;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Filter menu
function filter_menu_items($item) {

    if( $item-&amp;gt;type == 'taxonomy') {

        // For category menu items
        $cat_base = get_option('category_base');
        if( empty($cat_base) ) {
            $cat_base = 'category';
        }

        // Get the path to the category (excluding the home and category base parts of the URL)
        $cat_path = str_replace(home_url().'/'.$cat_base, '', $item-&amp;gt;url);

        // Get category and image ID
        $cat = get_category_by_path($cat_path, true);
        $thumb_id = get_term_meta($cat-&amp;gt;term_id, '_term_image_id', true); // I'm using the 'Simple Term Meta' plugin to store an attachment ID as the featured image

    } else {
        // Get post and image ID
        $post_id = url_to_postid( $item-&amp;gt;url );
        $thumb_id = get_post_thumbnail_id( $post_id );
    }

    if( !empty($thumb_id) ) {
        // Make the title just be the featured image.
        $item-&amp;gt;title = wp_get_attachment_image( $thumb_id, 'poster');
    }

    return $item;
}
&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;그런 다음 처음에 적용한 필터를 제거하여 다음 처리된 메뉴에서 filter_menu_items()에 정의된 것과 동일한 HTML을 사용하지 않도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Remove filters
add_filter('wp_nav_menu_items','remove_filter_from_menus', 10, 2);
function remove_filter_from_menus( $nav, $args ) {
    remove_filter( 'wp_setup_nav_menu_item', 'filter_menu_items' );
    return $nav;
}
&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;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;9-1&quot;&gt;플러그인 없이 작동&lt;/strong&gt;하며, 현재 슬러그에 카테고리가 없는 경우 우커머스 상품 카테고리('product_cat')를 확인합니다.&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;php&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Add filter to specific menus 
add_filter('wp_nav_menu_args', 'add_filter_to_menus');
function add_filter_to_menus($args) {

    // You can test agasint things like $args['menu'], $args['menu_id'] or $args['theme_location']
    if( $args['theme_location'] == 'menu-header') {
        add_filter( 'wp_setup_nav_menu_item', 'filter_menu_items' );
    }

    return $args;
}
// Filter menu
function filter_menu_items($item) {

    if( $item-&amp;gt;type == 'taxonomy') {

        // Get category and image ID
        $slug = pathinfo( $item-&amp;gt;url, PATHINFO_BASENAME );
        $cat = get_term_by( 'slug', $slug, 'category' );
        // If there is no standard category try getting product category
        if( !$cat ) {
            $cat = get_term_by( 'slug', $slug, 'product_cat' );
        }
        $thumb_id = get_term_meta($cat-&amp;gt;term_id, 'thumbnail_id', true);

    } else {
        // Get post and image ID
        $post_id = url_to_postid( $item-&amp;gt;url );
        $thumb_id = get_post_thumbnail_id( $post_id );
    }

    if( !empty($thumb_id) ) {
        // Make the title just be the featured image.
        $item-&amp;gt;title = wp_get_attachment_image( $thumb_id, 'poster');

        // Display image + title example
        // $item-&amp;gt;title = wp_get_attachment_image( $thumb_id, 'poster').$item-&amp;gt;title;
    }
    return $item;
}
// Remove filters
add_filter('wp_nav_menu_items','remove_filter_from_menus', 10, 2);
function remove_filter_from_menus( $nav, $args ) {
    remove_filter( 'wp_setup_nav_menu_item', 'filter_menu_items' );
    return $nav;
}
&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;URL : https://stackoverflow.com/questions/26079190/add-featured-image-to-wp-nav-menu-items&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>WordPress</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/909</guid>
      <comments>https://nicesource.tistory.com/909#entry909comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:15:04 +0900</pubDate>
    </item>
    <item>
      <title>typedef 포인터 상수 이상함</title>
      <link>https://nicesource.tistory.com/908</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;typedef 포인터 상수 이상함&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;typedef struct Person* PersonRef;
struct Person {
  int age;
};

const PersonRef person = NULL;

void changePerson(PersonRef newPerson) {
  person = newPerson;
}
&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;하지만.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const&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 class=&quot;papago-parent&quot;&gt;무슨 생각 있어요?&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;typedef int* intptr;
const intptr x;
&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;const int* x;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;intptr&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;int를 가리키는 포인터입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const intptr&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;int&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;int&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;blockquote&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;/blockquote&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;gcc의 &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gcc/Typeof.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-1&quot;&gt;매크로 유형&lt;/a&gt;과 같은 몇 가지 추한 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef int* intptr;
intptr dummy;
const typeof(*dummy) *x;
&lt;/code&gt;&lt;/pre&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;intptr&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;pre&gt;&lt;code&gt;const PersonRef person = NULL;
&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;struct Person*const person= NULL;
&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;/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;ol&gt; 
 &lt;li&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;const&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;/li&gt; 
 &lt;li 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;/li&gt; 
&lt;/ol&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;어쨌든, 이 점을 염두에 두면서, 그 이유가 왜&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;struct Person *const person = NULL;
&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-1&quot;&gt;const 포인터&lt;/strong&gt;를 선언합니다.&lt;/font&gt;&lt;/p&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;생각해 보세요, 당신의 유형은 &quot;&lt;em papago-id=&quot;24-1&quot;&gt;그룹&lt;/em&gt;&quot;입니다&lt;em papago-id=&quot;24-1&quot;&gt;.&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;struct Person&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;*&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;pre&gt;&lt;code&gt;const PersonRef person = NULL;
&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;컴파일러에 다음과 같은 내용이 표시됩니다(pseudo-code).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const [struct Person *]person = NULL;
&lt;/code&gt;&lt;/pre&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;const&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;code&gt;struct Person *&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;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;글쓰는건 어때요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;typedef struct Person { ... } Person;
const Person *person; /*&amp;lt; const person */
Person *const pointer; /*&amp;lt; const pointer to mutable person */
&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;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;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러한 악명 높은 버그 중 하나는 const로 선언되는 typedef:ed 포인터 유형이 직관적으로 예상하는 &quot;constant data에 대한 non-constant pointer&quot;가 아니라 &quot;constant data에 대한 constant pointer&quot;로 취급된다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 당신의 프로그램에서 일어나는 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;35&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;typedef struct
{
  int age;
} Person;

const Person* person = NULL; // non-constant pointer to constant Person
&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;pre&gt;&lt;code&gt;error: assignment of read-only variable ‘person’
&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;person = newPerson;
&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;왜냐하면 당신이 person을 const로 선언했기 때문에 그 값은 읽기만 가능하기 때문입니다..&lt;strong papago-id=&quot;38-1&quot;&gt;const 값은 변경&lt;/strong&gt;할 수 &lt;strong papago-id=&quot;38-1&quot;&gt;없습니다&lt;/strong&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;만약 당신이 그 부가세를 바꾸려고 한다면 왜 그것을 일정하게 유지하고 있습니까?&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;remove const 키워드 당신의 코드는 잘 작동할 것입니다.&lt;/font&gt;&lt;/p&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 class=&quot;papago-parent&quot;&gt; Piotr 의 (된) 로 GCC 를  수 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;typeof&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 class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;static_assert(std::is_same&amp;lt;const int *, std::add_const_t&amp;lt;std::remove_pointer_t&amp;lt;intptr&amp;gt;&amp;gt; *&amp;gt;::value, &quot;not same via type_traits&quot;);
static_assert(std::is_same&amp;lt;const int *, std::remove_reference_t&amp;lt;decltype(std::as_const(*intptr()))&amp;gt;*&amp;gt;::value, &quot;not same via decltype&quot;);
&lt;/code&gt;&lt;/pre&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 class=&quot;papago-parent&quot;&gt;바꿈으로써&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foo_t&amp;lt;T&amp;gt;&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 class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foo&amp;lt;T&amp;gt;::type&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 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;Boost의 버전을 사용하면 C++98에서도 가능하지만, C++11 이후로는 꽤 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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 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;iterator&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 class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;const_iterator&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;p papago-id=&quot;49&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/8504411/typedef-pointer-const-weirdness&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/908</guid>
      <comments>https://nicesource.tistory.com/908#entry908comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:14:56 +0900</pubDate>
    </item>
    <item>
      <title>Laravel: 데이터베이스에 동적으로 연결</title>
      <link>https://nicesource.tistory.com/907</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Laravel: 데이터베이스에 동적으로 연결&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;Laravel 5(.1)에서 다른 데이터베이스에 연결하는 데 필요한 애플리케이션을 만들고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유일한 문제는 어떤 데이터베이스에 연결해야 하는지 알 수 없기 때문에 데이터베이스를 사용한다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;php in config는 불가능합니다.&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;DB 클래스를 사용하는 것을 포함하여 데이터베이스에 대한 새로운 연결을 하려면 어떻게 해야 합니까? (또는 이것이 가능합니까?)&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&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;Laravel은 이 설정이 로드될 것으로 예상할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;config/database.php&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&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;config/database.php&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;database&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Laravel config에서.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 의미는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;connections&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;config/database.php&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;database.connections&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 papago-id=&quot;12&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;Config::set(&quot;database.connections.mysql&quot;, [
    &quot;host&quot; =&amp;gt; &quot;...&quot;,
    &quot;database&quot; =&amp;gt; &quot;...&quot;,
    &quot;username&quot; =&amp;gt; &quot;...&quot;,
    &quot;password&quot; =&amp;gt; &quot;...&quot;
]);
&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&gt;&lt;/font&gt;&lt;code&gt;mysql&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;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;실제로 런타임에 데이터베이스 설정을 변경하여 사용할 수 있습니다.&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;config() 함수를 사용하여 추가로 설정하거나 기존 연결 설정을 덮어씁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;config(['database.connections.mynewconnection' =&amp;gt; {settings here}]);
&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;따라서 새 설정을 사용해야 할 경우 사용할 연결을 위해 DB 캐시를 삭제합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DB::purge('mynewconnection');
&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;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;DB::setDefaultConnection('mynewconnection');
&lt;/code&gt;&lt;/pre&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;use Illuminate\Support\Facades\Config;
use DB;
&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;데이터베이스 구성 설정:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;        Config::set(&quot;database.connections.mysql_external&quot;, [
            'driver' =&amp;gt; 'mysql',
            &quot;host&quot; =&amp;gt; &quot;localhost&quot;,
            &quot;database&quot; =&amp;gt; &quot;db_name&quot;,
            &quot;username&quot; =&amp;gt; &quot;root&quot;,
            &quot;password&quot; =&amp;gt; &quot;root&quot;,
            &quot;port&quot; =&amp;gt; '8889',
            'charset'   =&amp;gt; 'utf8',
            'collation' =&amp;gt; 'utf8_unicode_ci',
            'prefix'    =&amp;gt; '',
            'strict'    =&amp;gt; false,
        ]);
&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;pre&gt;&lt;code&gt;    $users = DB::connection('mysql_external')-&amp;gt;select('Select id from users');
&lt;/code&gt;&lt;/pre&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;        DB::disconnect('mysql_external');
        Config::set(&quot;database.connections.mysql_external&quot;, [
            'driver' =&amp;gt; 'mysql',
            &quot;host&quot; =&amp;gt; &quot;localhost&quot;,
            &quot;database&quot; =&amp;gt; &quot;&quot;,
            &quot;username&quot; =&amp;gt; &quot;&quot;,
            &quot;password&quot; =&amp;gt; &quot;&quot;,
            &quot;port&quot; =&amp;gt; '',
            'charset'   =&amp;gt; 'utf8',
            'collation' =&amp;gt; 'utf8_unicode_ci',
            'prefix'    =&amp;gt; '',
            'strict'    =&amp;gt; false,
        ]);
&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;저도 여러 MS Access DB 파일을 MySQL로 가져오는 스크립트로 이 문제를 겪었는데 실행 시 편집 구성을 제안하는 솔루션 중 어느 것도 만족스럽지 못했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;가져오기를 원하는 액세스 DB 파일마다 동적으로 새로운 구성을 만드는 것은 보기 흉하고 지저분했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 번의 플레이 끝에 라라벨을 설득해 기존 연결에서 DB를 다음과 같이 전환할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$mysqlConn = DB::connection();
$mysqlConn-&amp;gt;getPdo()-&amp;gt;exec(&quot;USE $schemaName;&quot;);
$mysqlConn-&amp;gt;setDatabaseName($schemaName);
&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;//appServiceProvider.php&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; Connection::macro('useDatabase', function (string $databaseName) {
            $this-&amp;gt;getPdo()-&amp;gt;exec(&quot;USE `$databaseName`;&quot;);
            $this-&amp;gt;setDatabaseName($databaseName);
    });
&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;//usage.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  \DB::connection()-&amp;gt;useDatabase($dbName);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;database.php에 새 데이터베이스 연결 만들기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    'connections' =&amp;gt; [
        'new_db_connection' =&amp;gt; [
            'driver' =&amp;gt; 'sqlsrv',
            'host' =&amp;gt; env('DB_HOST', 'localhost'),
            'port' =&amp;gt; env('DB_PORT', '3306'),
            'database' =&amp;gt; env('DB_DATABASE_NEW', 'forge'),
            'username' =&amp;gt; env('DB_USERNAME', 'forge'),
            'password' =&amp;gt; env('DB_PASSWORD', ''),
            'charset' =&amp;gt; 'utf8',
            'collation' =&amp;gt; 'utf8_unicode_ci',
            'prefix' =&amp;gt; '',
            'strict' =&amp;gt; false,
            'engine' =&amp;gt; null,
         ],
       'old_db_connection' =&amp;gt; [
            'driver' =&amp;gt; 'sqlsrv',
            'host' =&amp;gt; env('DB_HOST', 'localhost'),
            'port' =&amp;gt; env('DB_PORT', '3306'),
            'database' =&amp;gt; env('DB_DATABASE_OLD', 'forge'),
            'username' =&amp;gt; env('DB_USERNAME', 'forge'),
            'password' =&amp;gt; env('DB_PASSWORD', ''),
            'charset' =&amp;gt; 'utf8',
            'collation' =&amp;gt; 'utf8_unicode_ci',
            'prefix' =&amp;gt; '',
            'strict' =&amp;gt; false,
            'engine' =&amp;gt; null,
        ],
     ]
&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;static function getDatabaseName()
{
    // Apply your condition and return databse 
    if(url('/') === 'http://localhost:8001'){
        return 'new_db_connection';
    } else {
        return 'old_db_connection';
    }

}
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;   $databaseName = Helper::getDatabaseName();
    DB::connection($databaseName)
    -&amp;gt;table('your table name')
    -&amp;gt;select('*')
    -&amp;gt;get();
&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;&amp;lt;?php

namespace App\Models;

use App\Helper;
use Illuminate\Database\Eloquent\Model;

class Test extends Model {

    public function __construct()
    {
       // You can apply the below variable dynamically and model 
       // will use that new connection
        $this-&amp;gt;connection = Helper::getDatabaseName();

    }

    protected $table = &quot;users&quot;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;// Without Using any Facades
    
    config(['database.connections.mynewconnection' =&amp;gt; [
        'driver' =&amp;gt; 'sqlsrv',
        'host' =&amp;gt; env('DB_HOST', 'localhost'),
        'port' =&amp;gt; env('DB_PORT', '3306'),
        'database' =&amp;gt; env('DB_DATABASE_OLD', 'forge'),
        'username' =&amp;gt; env('DB_USERNAME', 'forge'),
        'password' =&amp;gt; env('DB_PASSWORD', ''),
        'charset' =&amp;gt; 'utf8',
        'collation' =&amp;gt; 'utf8_unicode_ci',
        'prefix' =&amp;gt; '',
        'strict' =&amp;gt; false,
        'engine' =&amp;gt; null,  
    ]]);


// With Facades
// Use Illuminate\Support\Facades\Config;

Config::set('database.connections.mynewconnection', [
    'driver' =&amp;gt; 'sqlsrv',
    'host' =&amp;gt; env('DB_HOST', 'localhost'),
    'port' =&amp;gt; env('DB_PORT', '3306'),
    'database' =&amp;gt; env('DB_DATABASE_OLD', 'forge'),
    'username' =&amp;gt; env('DB_USERNAME', 'forge'),
    'password' =&amp;gt; env('DB_PASSWORD', ''),
    'charset' =&amp;gt; 'utf8',
    'collation' =&amp;gt; 'utf8_unicode_ci',
    'prefix' =&amp;gt; '',
    'strict' =&amp;gt; false,
    'engine' =&amp;gt; null,              
]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;32&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;blockquote&gt; 
 &lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB::연결('my new connect')-&amp;gt;table(&amp;lt;table_name&amp;gt;)-&amp;gt;get();&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;pre&gt;&lt;code&gt;    class SomeModel extends Eloquent {

    if(app::environment('local'))
      {
 
        protected $connection = 'mysql2';
     }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 모든 곳에서 모델 대신 SomeModel 클래스를 사용합니다.&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;참조 : https://fideloper.com/laravel-multiple-database-connections&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/36085131/laravel-connect-to-databases-dynamically&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MySQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/907</guid>
      <comments>https://nicesource.tistory.com/907#entry907comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:14:49 +0900</pubDate>
    </item>
    <item>
      <title>C와 C++의 &amp;quot;기준 통과&amp;quot;의 차이는 정확히 무엇입니까?</title>
      <link>https://nicesource.tistory.com/906</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C와 C++의 &quot;기준 통과&quot;의 차이는 정확히 무엇입니까?&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;&quot;pass by reference&quot;라는 문구는 C와 C++ 개발자들이 동일하게 사용하고 있지만 서로 다른 의미로 사용되고 있는 것으로 보입니다.&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://stackoverflow.com/q/373419/150634&quot; papago-id=&quot;2-1&quot;&gt;기준 통과와 값 통과의 차이&lt;/a&gt;를 이미 다루는 질문들이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로, 함수에 값별로 인수를 전달한다는 것은 함수가 자체적으로 인수 복사본을 갖게 된다는 것을 의미합니다. 즉, &lt;em papago-id=&quot;2-3&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;그러나 참조를 통과할 때 함수 내부의 매개 변수는 전달된 개체와 동일한 개체를 &lt;em papago-id=&quot;2-5&quot;&gt;나타냅니다&lt;/em&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;유감스럽게도 &quot;pass by value&quot;와 &quot;pass by reference&quot;라는 두 가지 문구가 사용되어 혼동을 일으킬 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 부분적으로 C++ 프로그래머들이 새로운 C++ 프로그래머들이 채택하기 어려운 이유라고 생각합니다. 특히 C의 배경에서 왔을 때 말이죠.&lt;/font&gt;&lt;/p&gt; 
&lt;h1&gt;C&lt;/h1&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;C에서는 기술적인 의미에서 모든 것이 가치에 의해 통과됩니다.&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;void foo(int)&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;foo(x)&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;x&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;foo&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;pre&gt;&lt;code&gt;void foo(int param) { param++; }

int main()
{
  int x = 5;
  foo(x);
  printf(&quot;%d\n&quot;,x); // x == 5
}
&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;&lt;font class=&quot;papago-parent&quot;&gt;의 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&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&gt;&lt;code&gt;foo&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 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;x&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 class=&quot;papago-parent&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;main&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;원래의 가치를 계속 유지하고 있습니다.&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;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 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;int* p&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;code&gt;p&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 class=&quot;papago-parent&quot;&gt;의 지시자로서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&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&gt;&lt;code&gt;int x = 5;
int* p = &amp;amp;x;
&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;&lt;font class=&quot;papago-parent&quot;&gt;첫번째는 유형입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&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 class=&quot;papago-parent&quot;&gt;그리고 가치가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;5&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 class=&quot;papago-parent&quot;&gt;. 두번째는 유형입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int*&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 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;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;포함된 주소가 함수에 복사됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 내부의 &lt;em papago-id=&quot;22-1&quot;&gt;포인터&lt;/em&gt;를 수정해도 함수 외부의 포인터는 변경되지 않습니다. 그러나 함수가 &lt;em papago-id=&quot;22-3&quot;&gt;가리키는 개체&lt;/em&gt;를 수정하면 함수 외부의 개체가 변경됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&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;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;void foo(int* param) { (*param)++; }

int main()
{
  int x = 5;
  foo(&amp;amp;x);
  printf(&quot;%d\n&quot;,x); // x == 6
}
&lt;/code&gt;&lt;/pre&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 class=&quot;papago-parent&quot;&gt;우리는 그것을 통과할 때 말할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int*&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 class=&quot;papago-parent&quot;&gt;기능으로, 그것은.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&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 class=&quot;papago-parent&quot;&gt;그것은 &quot;참조에 의해 통과되었다&quot;고 지적하지만, 사실은.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&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;이것은 우리에게 &quot;pass by value&quot;와 &quot;pass by reference&quot;라는&lt;sup papago-id=&quot;27-1&quot;&gt;1&lt;/sup&gt; 구어적 의미를 부여합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&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&gt;&lt;code&gt;int*&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&gt;&lt;code&gt;int&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 class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;31-1&quot;&gt;포인터 유형&lt;/em&gt;은 함수 유형, 개체 유형 또는 &lt;em papago-id=&quot;31-3&quot;&gt;참조된 유형&lt;/em&gt;이라고 하는 불완전한 유형에서 파생될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&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&gt;&lt;code&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;&lt;font class=&quot;papago-parent&quot;&gt;연산자(에서와 같이)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*p&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 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;이것은 C의 &quot;기준 통과&quot; 개념을 더욱 촉진합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++&lt;/font&gt;&lt;/h1&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;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;C++는 C의 많은 독창적인 언어 기능을 채택했습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 중에는 포인터가 있으므로 &quot;참조로 전달&quot;이라는 구어체 형식은 여전히 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*p&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 class=&quot;papago-parent&quot;&gt;아직도 재참조 중입니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;p&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 그러나 C++는 C가 가지고 있지 않은 기능, 즉 &lt;em papago-id=&quot;38-1&quot;&gt;참조&lt;/em&gt;를 진정으로 통과하는 기능을 도입하기 때문에 이 용어를 사용하는 것은 혼란스러울 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유형 뒤에 앰퍼샌드가 오는 것이 &lt;em papago-id=&quot;39-1&quot;&gt;기준 유형&lt;/em&gt;입니다&lt;sup papago-id=&quot;39-2&quot;&gt;2&lt;/sup&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&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;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&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&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void foo(int&amp;amp; param) { param++; }

int main()
{
  int x = 5;
  foo(x);
  std::cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; std::endl; // x == 6
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&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;foo&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&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;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&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;x&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&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;param&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&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;param&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&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;x&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;font class=&quot;papago-parent&quot;&gt;그리고 지금&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;x&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&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;값이 6입니다.&lt;/font&gt;&lt;/font&gt;&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;font class=&quot;papago-parent&quot;&gt;아무것도 복사되지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기준을 통과하는 것이 실제로 값으로 포인터를 통과하는 것이었던 C와는 달리, C++에서는 기준을 통과할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&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;참조 통과라는 용어에서는 이러한 모호성이 존재하기 때문에 참조 유형을 사용할 때는 C++의 맥락에서만 사용하는 것이 좋습니다.&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;int*&amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&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; 그러나 포인터가 사용되고 있을 때 &quot;기준 통과&quot;라는 용어를 접할 수도 있지만 적어도 지금은 실제로 무슨 일이 일어나고 있는지 알고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h2 papago-id=&quot;53&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;54&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;Java와 같은 일부 변수에서는 개체에 대한 참조(C++의 참조와 동일하지 않음)로 모든 변수가 알려져 있지만 이러한 참조는 값으로 전달됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조를 통해 함수를 전달하는 것처럼 보이지만 실제로 수행하는 작업은 값을 기준으로 함수에 참조를 복사하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++에서 기준 통과에 대한 미묘한 차이는 전달된 기준에 새 객체를 할당할 때 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;public void foo(Bar param) {
  param.something();
  param = new Bar();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&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;Bar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;45&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;param.something()&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;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 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;Bar&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;47&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;param&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;48&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;foo&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;49&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;이런 종류의 레퍼런스 재할당은 C++ 레퍼런스에서는 불가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;sup papago-id=&quot;61-0&quot;&gt;1&lt;/sup&gt; &quot;구어적&quot;으로, 저는 &quot;기준 통과&quot;의 C 의미가 C++의 의미보다 덜 진실하다고 주장하려는 것은 아닙니다. 단지 C++가 정말로 기준 유형을 가지고 있으므로 당신이 &lt;em papago-id=&quot;61-2&quot;&gt;정말&lt;/em&gt;로 기준을 통과하고 있다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C의 의미는 실제로 가치를 전달하고 있는 것에 대한 추상화입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;sup papago-id=&quot;62-0&quot;&gt;2&lt;/sup&gt; 물론, 이것들은 lvalue reference들이고 우리는 이제 C++11에도 rvalue reference들이 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;63&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/13654138/what-exactly-is-the-difference-between-pass-by-reference-in-c-and-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>C</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/906</guid>
      <comments>https://nicesource.tistory.com/906#entry906comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:14:39 +0900</pubDate>
    </item>
    <item>
      <title>최고의 자바스크립트 압축기</title>
      <link>https://nicesource.tistory.com/905</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;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 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;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;현재 상태로는 이 질문은 우리의 Q&amp;amp;A 형식에 맞지 않습니다.&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;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;안내&lt;/a&gt;를 받기 위해 헬프 &lt;a href=&quot;/help/reopen-questions&quot; papago-id=&quot;1-1&quot;&gt;센터를 방문&lt;/a&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 class=&quot;flex--item mb0 mt8&quot; 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;font class=&quot;papago-parent&quot;&gt;&lt;span class=&quot;relativetime&quot; papago-id=&quot;2-1&quot; title=&quot;2012-06-09 16:55:42Z&quot; papago-attr-id=&quot;1&quot;&gt;11년 전&lt;/span&gt;에.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;   &lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&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;ul&gt; 
 &lt;li papago-id=&quot;4&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;5&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;6&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&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근에 자바스크립트로 작성된 (&lt;a href=&quot;http://en.wikipedia.org/wiki/Nodejs&quot; papago-id=&quot;7-3&quot; rel=&quot;noreferrer&quot;&gt;NodeJS Node&lt;/a&gt;.js 플랫폼에서 실행되는) 자바스크립트 압축기인 &lt;a href=&quot;http://github.com/mishoo/UglifyJS&quot; papago-id=&quot;7-1&quot; rel=&quot;noreferrer&quot;&gt;UglifyJS&lt;/a&gt;를 출시했는데, 필요가 없기 때문에 어떤 자바스크립트 엔진에서도 실행할 수 있도록 쉽게 수정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Node.js&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;a href=&quot;http://developer.yahoo.com/yui/compressor/&quot; papago-id=&quot;8-1&quot; rel=&quot;noreferrer&quot;&gt;YUI Compressor&lt;/a&gt;와 &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_Closure_Tools&quot; papago-id=&quot;8-3&quot; rel=&quot;noreferrer&quot;&gt;Google Closure&lt;/a&gt; 둘 다보다 훨씬 빠르며, 테스트한 모든 스크립트에서 &lt;a href=&quot;http://en.wikipedia.org/wiki/Yahoo!_UI_Library&quot; papago-id=&quot;8-5&quot; rel=&quot;noreferrer&quot;&gt;YUI&lt;/a&gt;보다 더 잘 압축되며 Closure보다 더 안전합니다(&quot;eval&quot; 또는 &quot;with&quot;로 처리할 수 있음).&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;공백 제거 이외의 Uglify&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS는 또한 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;10&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;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연속 var 선언에 조인&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;필요 없는 괄호, 부모 및 세미콜론을 삽입하지 않도록 합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IF를 최적화합니다(필요하지 않은 것을 감지하면 &quot;다른&quot; 것을 제거하고 IF를 &amp;amp;&amp;amp;, || 또는 ?/: 연산자로 변환하는 등).&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;foo[&quot;bar&quot;]&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;foo.bar&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;/li&gt; 
 &lt;li papago-id=&quot;17&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;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드가 작아질 경우 간단한 식을 해결합니다(1+3*4 ==&amp;gt; 13).&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;19&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;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 년 후 이 질문을 다시 검토해 보면, &lt;a href=&quot;http://github.com/mishoo/UglifyJS&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;20-1&quot;&gt;UglifyJS&lt;/a&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;아래에 명시된 바와 같이, NodeJS 플랫폼에서 실행되지만, 어떠한 자바스크립트 엔진에서도 실행할 수 있도록 쉽게 수정할 수 있습니다.&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;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구글은 &lt;a href=&quot;https://github.com/google/closure-compiler&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;23-1&quot;&gt;&lt;strong papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클로저 컴파일러&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;를 출시했는데, 클로저 컴파일러는 &lt;a href=&quot;http://blog.feedly.com/2009/11/06/google-closure-vs-yui-min/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;23-3&quot;&gt;여기&lt;/a&gt;와 &lt;a href=&quot;http://news.ycombinator.com/item?id=924426&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;23-5&quot;&gt;여기&lt;/a&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.julienlecomte.net/blog/2007/08/13/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24-1&quot;&gt;다음과 같습니다&lt;/a&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;기본적으로 초기 압축 시 &lt;a href=&quot;http://dean.edwards.name/packer/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;25-1&quot;&gt;패커&lt;/a&gt;가 더 잘 수행하지만 유선으로 전송하기 전에 파일을 압축하려면 &lt;a href=&quot;http://www.julienlecomte.net/yuicompressor/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;25-3&quot;&gt;YUI 압축기&lt;/a&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;그건 그렇고 테스트는 jQuery 코드로 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원본 jQuery 라이브러리 62,885바이트, gzip 뒤에 19,758바이트&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery 36,391바이트, gzip 후 11,541바이트로 JSM으로 최소화&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery는 packer 21,557 바이트, gzip 후 11,119 바이트로 최소화됨&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;jQuery는 YUI Compressor 31,822바이트, gzip 후 10,818바이트로 최소화되었습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@&lt;a href=&quot;https://stackoverflow.com/users/2434/daniel-james&quot; papago-id=&quot;31-1&quot;&gt;daniel james&lt;/a&gt;는 댓글 &lt;a href=&quot;http://compressorrater.thruhere.net/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;31-3&quot;&gt;압축기&lt;/a&gt;에서 언급하는데, 이는 패커가 최고의 압축률로 차트를 이끄는 것을 보여주므로 ymmv라고 생각합니다.&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;a href=&quot;http://developer.yahoo.com/yui/compressor/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;32-0&quot;&gt;YUI Compressor&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;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;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;34-1&quot;&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;34-1&quot;&gt;  CSS 압축 기능을 사용해 본 적은 없지만 존재합니다.&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;34-1&quot;&gt;
&lt;/strike&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strike papago-id=&quot;34-1&quot;&gt; &lt;/strike&gt; CSS 압축도 마찬가지로 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고: Dean Edwards의 /&lt;a href=&quot;http://dean.edwards.name/packer/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;35-1&quot;&gt;packer&lt;/a&gt;/는 YUI Compressor보다 더 나은 압축률을 달성하지만, 사용 중에 몇 가지 자바스크립트 오류가 발생했습니다.&lt;/font&gt;&lt;/em&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;a href=&quot;http://shrinksafe.dojotoolkit.org/&quot; papago-id=&quot;36-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Dojo 프로젝트&lt;/a&gt;의 &lt;a href=&quot;http://shrinksafe.dojotoolkit.org/&quot; papago-id=&quot;36-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;strong papago-id=&quot;36-1-0&quot;&gt;ShrinkSafe&lt;/strong&gt;&lt;/a&gt;를 사용합니다. 코드에서 기호를 찾고 그 범위를 파악하는 등의 작업을 실제로는 자바스크립트 인터프리터(&lt;a href=&quot;http://www.mozilla.org/rhino/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;36-3&quot;&gt;Rhino&lt;/a&gt;)를 사용하기 때문에 예외적으로 코드가 다른 쪽으로 나올 때 동작할 수 있도록 도와줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 작업을 수행하기 위해 regex를 사용하는 많은 압축 도구와 대조적으로 (신뢰성이 떨어짐).&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;저는 현재의 Visual Studio 솔루션의 &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&amp;amp;displaylang=en&quot; papago-id=&quot;37-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Web&lt;/a&gt; Deployment &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&amp;amp;displaylang=en&quot; papago-id=&quot;37-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Project&lt;/a&gt;에서 MSBuild 작업을 수행하고 있으며, 이 작업은 ScrinkSafe를 통해 솔루션의 모든 JS 파일을 실행한 후 배포할 수 있습니다.&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;&lt;strong papago-id=&quot;38-0&quot;&gt;편집:&lt;/strong&gt; 그런데 '최선'은 프로젝트의 필요에 따라 '최선'의 기준이 달라지기 때문에 논쟁의 여지가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개인적으로, ShrinkSafe는 좋은 균형이라고 생각합니다. 가장 작은 사이즈 ==를 가장 잘 생각하는 사람들에게는 부족할 것입니다.&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;&lt;strong papago-id=&quot;39-0&quot;&gt;편집:&lt;/strong&gt; YUI 압축기도 코뿔소를 사용한다는 점에 주목할 필요가 있습니다.&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;a href=&quot;http://www.crockford.com/javascript/jsmin.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;40-1&quot;&gt;JSMin&lt;/a&gt;을 사용해보고 C#, Java, C 및 기타 포트를 구입하여 쉽게 사용할 수 있습니다.&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;font class=&quot;papago-parent&quot;&gt;base62 옵션은 서버가 gziped 파일을 보낼 수 없는 경우에만 해당됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'shrink vars'가 있는 패커는 YUI를 더 잘 압축할 수 있지만 세미콜론을 어딘가로 건너뛰었을 경우 버그를 발생시킬 수 있습니다.&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;base62는 기본적으로 가난한 남자의 gzip입니다. 그래서 gzip base62-ed 코드가 gzip 축소-vared 코드보다 더 큰 파일을 제공합니다.&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;a href=&quot;http://crockford.com/javascript/jsmin&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;43-0&quot;&gt;제이에스민은&lt;/a&gt; 또 하나입니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&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;Ruby on Rails용 http://github.com/sstephenson/sprockets&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://blog.madskristensen.dk/post/Optimize-WebResourceaxd-and-ScriptResourceaxd.aspx&quot; papago-id=&quot;45-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기&lt;/a&gt; HttpHandler의 &lt;a href=&quot;http://blog.madskristensen.dk/post/Optimize-WebResourceaxd-and-ScriptResourceaxd.aspx&quot; papago-id=&quot;45-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;소스 코드가 있습니다.&lt;/a&gt; 아마 당신에게 도움이 될 겁니다.&lt;/font&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;&lt;a href=&quot;http://brilaps.com/index.php?content=byuic&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;여기서&quot; papago-id=&quot;46-0&quot; papago-attr-id=&quot;6&quot;&gt;여기&lt;/a&gt;에 경로를 따라 모든 js와 css를 찾아 /(선택적으로) 난독화하는 YUI 압축기 스크립트(&lt;a href=&quot;http://brilaps.com/index.php?content=byuic&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;바이아크&quot; papago-id=&quot;46-2&quot; papago-attr-id=&quot;7&quot;&gt;Byuic&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;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.bananascript.com/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;47-0&quot;&gt;bananascript.com&lt;/a&gt; 은 나에게 최고의 결과를 주곤 했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;KJS 압축&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://opensource.seznam.cz/KJScompress/index.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://opensource.seznam.cz/KJScompress/index.html&lt;/font&gt;&lt;/a&gt;&lt;/p&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;Kjscompress/csskcompress는 자바스크립트와 CSS가 포함된 파일에서 중요하지 않은 공백과 주석을 제거하기 위해 두 개의 응용 프로그램(kjscompress cscompress)으로 설정됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 GNU/리눅스 운영 체제용 명령줄 응용 프로그램입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.iteral.com/jscrush/&quot; rel=&quot;nofollow noreferrer&quot; title=&quot;제이에스 크러쉬&quot; papago-id=&quot;51-0&quot; papago-attr-id=&quot;8&quot;&gt;Js Crush&lt;/a&gt;는 미니드 후에 사용하기 좋은 압축기입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;52&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/28932/best-javascript-compressor&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>JavaScript</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/905</guid>
      <comments>https://nicesource.tistory.com/905#entry905comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:14:32 +0900</pubDate>
    </item>
    <item>
      <title>JQuery에서 선택한 옵션이 이미 있는지 확인하려면 어떻게 해야 합니까?</title>
      <link>https://nicesource.tistory.com/904</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 papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JQuery에서 선택한 옵션이 이미 존재하는지 확인하려면 어떻게 해야 합니까?&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;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 존재하는 경우 true로 평가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#yourSelect option[value='yourValue']&quot;).length &amp;gt; 0;
&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;jQuery를 사용하는 또 다른 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var exists = false; 
$('#yourSelect  option').each(function(){
  if (this.value == yourValue) {
    exists = true;
  }
});
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;if ( $(&quot;#your_select_id option[value=&amp;lt;enter_value_here&amp;gt;]&quot;).length == 0 ){
  alert(&quot;option doesn't exist!&quot;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var exists = $(&quot;#yourSelect option&quot;)
               .filter(function (i, o) { return o.value === yourValue; })
               .length &amp;gt; 0;
&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;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대부분의 다른 답변이 저에게 적합했지만 .find():&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if ($(&quot;#yourSelect&quot;).find('option[value=&quot;value&quot;]').length === 0){
    ...
}
&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;if ( $(&quot;#your_select_id option[value='enter_value_here']&quot;).length == 0 ){
  alert(&quot;option doesn't exist!&quot;);
}
&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;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;선택 컨트롤에 대한 루프를 통해 매번 돔을 통해 검색을 실행하는 대신 jquery select 요소를 변수에 저장하고 다음 작업을 수행했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function isValueInSelect($select, data_value){
    return $($select).children('option').map(function(index, opt){
        return opt.value;
    }).get().includes(data_value);
}
&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;  var key = 'Hallo';

   if ( $(&quot;#chosen_b option[value='&quot;+key+&quot;']&quot;).length == 0 ){
   alert(&quot;option not exist!&quot;);

    $('#chosen_b').append(&quot;&amp;lt;option value='&quot;+key+&quot;'&amp;gt;&quot;+key+&quot;&amp;lt;/option&amp;gt;&quot;);
    $('#chosen_b').val(key);
   $('#chosen_b').trigger(&quot;chosen:updated&quot;);
                         }
  });
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/646317/how-can-i-check-whether-a-option-already-exist-in-select-by-jquery&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>jquery</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/904</guid>
      <comments>https://nicesource.tistory.com/904#entry904comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:14:25 +0900</pubDate>
    </item>
    <item>
      <title>Pandas Data Frame을 사용하여 OLS 회귀 분석 실행</title>
      <link>https://nicesource.tistory.com/903</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Pandas Data Frame을 사용하여 OLS 회귀 분석 실행&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;pandas&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 프레임과 저는 B열과 C열의 값으로부터 A열의 값을 예측할 수 있습니다.&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;import pandas as pd
df = pd.DataFrame({&quot;A&quot;: [10,20,30,40,50], 
                   &quot;B&quot;: [20, 30, 10, 40, 50], 
                   &quot;C&quot;: [32, 234, 23, 23, 42523]})
&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;ols(A ~ B + C, data = df)&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;a href=&quot;http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html&quot; papago-id=&quot;4-1&quot; rel=&quot;noreferrer&quot;&gt;예&lt;/a&gt;를 살펴보면 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;scikit-learn&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 class=&quot;papago-parent&quot;&gt;이렇게 되면 데이터를 목록 내의 목록으로 다시 포맷해야 하는데, 이는 애초에 판다를 사용하려는 목적을 저버리는 것처럼 보입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;팬더 데이터 프레임의 데이터에 대해 OLS 회귀(또는 일반적으로 모든 기계 학습 알고리즘)를 실행하는 가장 피톤적인 방법은 무엇입니까?&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;a href=&quot;http://statsmodels.sourceforge.net/&quot; papago-id=&quot;6-1&quot; rel=&quot;noreferrer&quot;&gt;stats&lt;/a&gt; models 패키지를 사용하면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pandas&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;pandas&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;' version 0.20.0 (이것은 몇 가지에 사용되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pandas.stats&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&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import pandas as pd
&amp;gt;&amp;gt;&amp;gt; import statsmodels.formula.api as sm
&amp;gt;&amp;gt;&amp;gt; df = pd.DataFrame({&quot;A&quot;: [10,20,30,40,50], &quot;B&quot;: [20, 30, 10, 40, 50], &quot;C&quot;: [32, 234, 23, 23, 42523]})
&amp;gt;&amp;gt;&amp;gt; result = sm.ols(formula=&quot;A ~ B + C&quot;, data=df).fit()
&amp;gt;&amp;gt;&amp;gt; print(result.params)
Intercept    14.952480
B             0.401182
C             0.000352
dtype: float64
&amp;gt;&amp;gt;&amp;gt; print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      A   R-squared:                       0.579
Model:                            OLS   Adj. R-squared:                  0.158
Method:                 Least Squares   F-statistic:                     1.375
Date:                Thu, 14 Nov 2013   Prob (F-statistic):              0.421
Time:                        20:04:30   Log-Likelihood:                -18.178
No. Observations:                   5   AIC:                             42.36
Df Residuals:                       2   BIC:                             41.19
Df Model:                           2                                         
==============================================================================
                 coef    std err          t      P&amp;gt;|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept     14.9525     17.764      0.842      0.489       -61.481    91.386
B              0.4012      0.650      0.617      0.600        -2.394     3.197
C              0.0004      0.001      0.650      0.583        -0.002     0.003
==============================================================================
Omnibus:                          nan   Durbin-Watson:                   1.061
Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.498
Skew:                          -0.123   Prob(JB):                        0.780
Kurtosis:                       1.474   Cond. No.                     5.21e+04
==============================================================================

Warnings:
[1] The condition number is large, 5.21e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;9&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;code&gt;pandas.stats&lt;/code&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;0.20.0으로 &lt;a href=&quot;http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#whatsnew-0200-prior-deprecations&quot; papago-id=&quot;11-0&quot; rel=&quot;noreferrer&quot;&gt;제거&lt;/a&gt;되었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&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&gt;&lt;/font&gt;&lt;code&gt;pandas.stats.ols&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;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from pandas.stats.api import ols
&amp;gt;&amp;gt;&amp;gt; df = pd.DataFrame({&quot;A&quot;: [10,20,30,40,50], &quot;B&quot;: [20, 30, 10, 40, 50], &quot;C&quot;: [32, 234, 23, 23, 42523]})
&amp;gt;&amp;gt;&amp;gt; res = ols(y=df['A'], x=df[['B','C']])
&amp;gt;&amp;gt;&amp;gt; res
-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ &amp;lt;B&amp;gt; + &amp;lt;C&amp;gt; + &amp;lt;intercept&amp;gt;

Number of Observations:         5
Number of Degrees of Freedom:   3

R-squared:         0.5789
Adj R-squared:     0.1577

Rmse:             14.5108

F-stat (2, 2):     1.3746, p-value:     0.4211

Degrees of Freedom: model 2, resid 2

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             B     0.4012     0.6497       0.62     0.5999    -0.8723     1.6746
             C     0.0004     0.0005       0.65     0.5826    -0.0007     0.0014
     intercept    14.9525    17.7643       0.84     0.4886   -19.8655    49.7705
---------------------------------End of Summary---------------------------------
&lt;/code&gt;&lt;/pre&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;statsmodels&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;code&gt;pandas.stats.ols&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;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;sklearn&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;code&gt;pandas&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;sklearn&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 프레임을 numpy 배열로 변환하거나 다른 데이터 유형으로 변환하지 않아도 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit(df[['B', 'C']], df['A'])

&amp;gt;&amp;gt;&amp;gt; reg.coef_
array([  4.01182386e-01,   3.51587361e-04])
&lt;/code&gt;&lt;/pre&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;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇지 않습니다. NumPy 배열로 변환하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = np.asarray(df)
&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;em papago-id=&quot;23-1&quot;&gt;보기&lt;/em&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;gt;&amp;gt;&amp;gt; from sklearn.linear_model import LinearRegression
&amp;gt;&amp;gt;&amp;gt; lr = LinearRegression()
&amp;gt;&amp;gt;&amp;gt; X, y = data[:, 1:], data[:, 0]
&amp;gt;&amp;gt;&amp;gt; lr.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
&amp;gt;&amp;gt;&amp;gt; lr.coef_
array([  4.01182386e-01,   3.51587361e-04])
&amp;gt;&amp;gt;&amp;gt; lr.intercept_
14.952479503953672
&lt;/code&gt;&lt;/pre&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;https://www.statsmodels.org/stable/index.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;24-0&quot;&gt;통계분석&lt;/a&gt; 모형은 팬더 데이터 프레임에 직접 열 참조를 사용하여 &lt;a href=&quot;https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;24-2&quot;&gt;OLS 모형&lt;/a&gt;을 구축할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&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;짧고 달콤함:&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;model = sm.OLS(df[y], df[x]).fit()&lt;/code&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;strong&gt;&lt;em papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 세부 정보 및 회귀 요약:&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# imports
import pandas as pd
import statsmodels.api as sm
import numpy as np

# data
np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,100,size=(100, 3)), columns=list('ABC'))

# assign dependent and independent / explanatory variables
variables = list(df.columns)
y = 'A'
x = [var for var in variables if var not in y ]

# Ordinary least squares regression
model_Simple = sm.OLS(df[y], df[x]).fit()

# Add a constant term like so:
model = sm.OLS(df[y], sm.add_constant(df[x])).fit()

model.summary()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;em papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력:&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      A   R-squared:                       0.019
Model:                            OLS   Adj. R-squared:                 -0.001
Method:                 Least Squares   F-statistic:                    0.9409
Date:                Thu, 14 Feb 2019   Prob (F-statistic):              0.394
Time:                        08:35:04   Log-Likelihood:                -484.49
No. Observations:                 100   AIC:                             975.0
Df Residuals:                      97   BIC:                             982.8
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P&amp;gt;|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         43.4801      8.809      4.936      0.000      25.996      60.964
B              0.1241      0.105      1.188      0.238      -0.083       0.332
C             -0.0752      0.110     -0.681      0.497      -0.294       0.144
==============================================================================
Omnibus:                       50.990   Durbin-Watson:                   2.013
Prob(Omnibus):                  0.000   Jarque-Bera (JB):                6.905
Skew:                           0.032   Prob(JB):                       0.0317
Kurtosis:                       1.714   Cond. No.                         231.
==============================================================================
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;em papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;R-제곱, 계수 및 p-값을 직접 구하는 방법:&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# commands:
model.params
model.pvalues
model.rsquared

# demo:
In[1]: 
model.params
Out[1]:
const    43.480106
B         0.124130
C        -0.075156
dtype: float64

In[2]: 
model.pvalues
Out[2]: 
const    0.000003
B        0.237924
C        0.497400
dtype: float64

Out[3]:
model.rsquared
Out[2]:
0.0190
&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;B는 통계적으로 유의하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터에서 추론을 끌어낼 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C가 B 확률에 영향을 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; df = pd.DataFrame({&quot;A&quot;: [10,20,30,40,50], &quot;B&quot;: [20, 30, 10, 40, 50], &quot;C&quot;: [32, 234, 23, 23, 42523]})

 avg_c=df['C'].mean()
 sumC=df['C'].apply(lambda x: x if x&amp;lt;avg_c else 0).sum()
 countC=df['C'].apply(lambda x: 1 if x&amp;lt;avg_c else None).count()
 avg_c2=sumC/countC
 df['C']=df['C'].apply(lambda x: avg_c2 if x &amp;gt;avg_c else x)
 
 print(df)

 model_ols = smf.ols(&quot;A ~ B+C&quot;,data=df).fit()

 print(model_ols.summary())

 df[['B','C']].plot()
 plt.show()


 df2=pd.DataFrame()
 df2['B']=np.linspace(10,50,10)
 df2['C']=30

 df3=pd.DataFrame()
 df3['B']=np.linspace(10,50,10)
 df3['C']=100

 predB=model_ols.predict(df2)
 predC=model_ols.predict(df3)
 plt.plot(df2['B'],predB,label='predict B C=30')
 plt.plot(df3['B'],predC,label='predict B C=100')
 plt.legend()
 plt.show()

 print(&quot;A change in the probability of C affects the probability of B&quot;)

 intercept=model_ols.params.loc['Intercept']
 B_slope=model_ols.params.loc['B']
 C_slope=model_ols.params.loc['C']
 #Intercept    11.874252
 #B             0.760859
 #C            -0.060257

 print(&quot;Intercept {}\n B slope{}\n C    slope{}\n&quot;.format(intercept,B_slope,C_slope))


 #lower_conf,upper_conf=np.exp(model_ols.conf_int())
 #print(lower_conf,upper_conf)
 #print((1-(lower_conf/upper_conf))*100)

 model_cov=model_ols.cov_params()
 std_errorB = np.sqrt(model_cov.loc['B', 'B'])
 std_errorC = np.sqrt(model_cov.loc['C', 'C'])
 print('SE: ', round(std_errorB, 4),round(std_errorC, 4))
 #check for statistically significant
 print(&quot;B z value {} C z value {}&quot;.format((B_slope/std_errorB),(C_slope/std_errorC)))
 print(&quot;B feature is more statistically significant than C&quot;)


 Output:

 A change in the probability of C affects the probability of B
 Intercept 11.874251554067563
 B slope0.7608594144571961
 C slope-0.060256845997223814

 Standard Error:  0.4519 0.0793
 B z value 1.683510336937001 C z value -0.7601036314930376
 B feature is more statistically significant than C

 z&amp;gt;2 is statistically significant     
&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;URL : https://stackoverflow.com/questions/19991445/run-an-ols-regression-with-pandas-data-frame&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Python</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/903</guid>
      <comments>https://nicesource.tistory.com/903#entry903comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:14:18 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 및 NoSQL: 올바른 것을 선택할 수 있도록 도와줍니다.</title>
      <link>https://nicesource.tistory.com/902</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 및 NoSQL: 올바른 것을 선택할 수 있도록 도와줍니다.&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;스레드(Threads)라는 큰 데이터베이스가 있습니다. 1,000,000,000개의 행(실제로 이러한 스레드가 존재합니다. 단지 즐긴다고 일을 더 어렵게 만드는 것은 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스레드에는 몇 가지 정보만 포함되어 있으므로 작업 속도를 높일 수 있습니다. (intid, 문자열 해시, int reply count, int dateline(타임스탬프), int formid, 문자열 제목)&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;p&gt;&lt;code&gt;select * from thread where forumid = 100 and replycount &amp;gt; 1 order by dateline desc limit 10000, 100&lt;/code&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;1G의 기록이 있기 때문에 상당히 느린 질의입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 이 1G 레코드를 제가 가진 포럼(카테고리)의 수만큼 테이블로 나누어보자고 생각했습니다.&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&gt;&lt;code&gt;select * from thread_{forum_id} where replycount &amp;gt; 1 order by dateline desc limit 10000, 100&lt;/code&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;대부분의 포럼이 몇 개의 주제(100k-1M)만을 가지고 있기 때문에 포럼(카테고리)의 99%에서는 이 속도가 매우 빠릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 약 1,000만 개의 레코드를 가진 일부가 있기 때문에 일부 쿼리는 여전히 느립니다(0.1/.2초, 내 앱에 너무 많은 양!, &lt;strong papago-id=&quot;4-1&quot;&gt;&lt;em papago-id=&quot;4-1-0&quot;&gt;이미 인덱스를 사용하고 있습니다&lt;/em&gt;&lt;/strong&gt;!).&lt;strong papago-id=&quot;4-1&quot;&gt;&lt;em papago-id=&quot;4-1-0&quot;&gt;&lt;/em&gt;&lt;/strong&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;MySQL을 이용해서 어떻게 개선해야 할지 모르겠습니다.&lt;/font&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;이 프로젝트를 위해 서버 10대(12GB 램, 4x7200rpm 하드디스크(소프트웨어 raid 10, 쿼드코어)를 사용할 예정입니다.&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;이 10개의 서버에 카산드라를 설치하면(원래대로 작동할 시간이 생긴다고 가정하면) 성능이 향상되어야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&lt;strong 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;여러 시스템에서 MySQL과 분산 데이터베이스를 계속 사용하거나 카산드라 클러스터를 구축하시겠습니까?&lt;/font&gt;&lt;/strong&gt;&lt;/em&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; show index in thread;
PRIMARY id
forumid
dateline
replycount
&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;mysql&amp;gt; explain SELECT * FROM thread WHERE forumid = 655 AND visible = 1 AND open &amp;lt;&amp;gt; 10 ORDER BY dateline ASC LIMIT 268000, 250;
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+
| id | select_type | table  | type | possible_keys | key     | key_len | ref         | rows   | Extra                       |
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+
|  1 | SIMPLE      | thread | ref  | forumid       | forumid | 4       | const,const | 221575 | Using where; Using filesort | 
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+
&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;다음을 읽고 잘 설계된 nodb 테이블의 장점과 클러스터 인덱스를 가장 잘 사용하는 방법에 대해 조금 알아야 합니다. innodb에서만 사용할 수 있습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/&lt;/font&gt;&lt;/a&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;h2 papago-id=&quot;16&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;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중요한 기능은 테이블이 innodb 엔진을 사용하고 스레드 테이블의 기본 키가 더 이상 단일 auto_incrementing 키가 아니라 formula_id와 thread_id의 조합을 기반으로 하는 복합 &lt;strong papago-id=&quot;17-1&quot;&gt;클러스터&lt;/strong&gt; 키라는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;threads - primary key (forum_id, thread_id)

forum_id    thread_id
========    =========
1                   1
1                   2
1                   3
1                 ...
1             2058300  
2                   1
2                   2
2                   3
2                  ...
2              2352141
...
&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;각 포럼 행에는 next_thread_id(unsigned int)라는 카운터가 포함되어 있으며, 이 카운터는 트리거에 의해 유지되며 스레드가 지정된 포럼에 추가될 때마다 증분됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 thread_id에 대해 단일 auto_increment primary 키를 사용할 경우 포럼당 총 40억 개의 스레드를 저장하는 것이 아니라 40억 개의 스레드를 저장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;forum_id    title   next_thread_id
========    =====   ==============
1          forum 1        2058300
2          forum 2        2352141
3          forum 3        2482805
4          forum 4        3740957
...
64        forum 64       3243097
65        forum 65      15000000 -- ooh a big one
66        forum 66       5038900
67        forum 67       4449764
...
247      forum 247            0 -- still loading data for half the forums !
248      forum 248            0
249      forum 249            0
250      forum 250            0
&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;select * from threads where thread_id = y;
&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;pre&gt;&lt;code&gt;select * from threads where forum_id = x and thread_id = y;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 응용 프로그램 코드는 사용자가 어떤 포럼을 검색하고 있는지 알고 있어야 하므로 구현이 정확히 어렵지 않습니다 - 현재 보는 form_id를 세션 변수 또는 숨겨진 폼 필드에 저장하는 등.&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;pre&gt;&lt;code&gt;drop table if exists forums;
create table forums
(
forum_id smallint unsigned not null auto_increment primary key,
title varchar(255) unique not null,
next_thread_id int unsigned not null default 0 -- count of threads in each forum
)engine=innodb;


drop table if exists threads;
create table threads
(
forum_id smallint unsigned not null,
thread_id int unsigned not null default 0,
reply_count int unsigned not null default 0,
hash char(32) not null,
created_date datetime not null,
primary key (forum_id, thread_id, reply_count) -- composite clustered index
)engine=innodb;

delimiter #

create trigger threads_before_ins_trig before insert on threads
for each row
begin
declare v_id int unsigned default 0;

  select next_thread_id + 1 into v_id from forums where forum_id = new.forum_id;
  set new.thread_id = v_id;
  update forums set next_thread_id = v_id where forum_id = new.forum_id;
end#

delimiter ;
&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;(form_id, thread_id) composite 자체가 고유하기 때문에 제가 reply_count를 기본 키의 일부로 포함시킨 것을 알아차렸을 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 reply_count를 사용하는 쿼리를 실행할 때 일부 I/O를 절약하는 인덱스 최적화입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이에 대한 자세한 내용은 위의 2개 링크를 참조하시기 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;24&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;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 여전히 제 예제 테이블에 데이터를 로드하고 있으며 지금까지 약 5억 행(당신의 시스템의 절반)을 로드했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;로드 프로세스가 완료되면 대략 다음과 같은 결과가 발생할 것으로 예상됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;250 forums * 5 million threads = 1250 000 000 (1.2 billion rows)
&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;저는 의도적으로 일부 포럼에 500만 개 이상의 스레드가 포함되도록 했습니다. 예를 들어, 포럼 65에는 1,500만 개의 스레드가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;forum_id    title   next_thread_id
========    =====   ==============
65        forum 65      15000000 -- ooh a big one
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;27&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;select sum(next_thread_id) from forums;

sum(next_thread_id)
===================
539,155,433 (500 million threads so far and still growing...)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;innodb에서 next_ thread_ids를 합산하여 총 스레드 수를 지정하면 일반적인 것보다 훨씬 빠릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select count(*) from threads;
&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;포럼 65의 스레드 수:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select next_thread_id from forums where forum_id = 65

next_thread_id
==============
15,000,000 (15 million)
&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;select count(*) from threads where forum_id = 65
&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;지금까지 약 5억 개의 스레드가 있으며 포럼 65의 스레드 수는 1,500만 개입니다. 스키마가 어떻게 작동하는지 살펴보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select forum_id, thread_id from threads where forum_id = 65 and reply_count &amp;gt; 64 order by thread_id desc limit 32;

runtime = 0.022 secs

select forum_id, thread_id from threads where forum_id = 65 and reply_count &amp;gt; 1 order by thread_id desc limit 10000, 100;

runtime = 0.027 secs
&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;제가 보기에는 꽤 성능이 좋아 보입니다. 5억 개 이상의 행(그리고 증가하는)이 있는 단일 테이블로, 1,500만 개의 행을 0.02초 만에 포함하는 쿼리가 있습니다(부하 상태에서!).&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;33&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;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&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;범위별 파티셔닝&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&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;/li&gt; 
 &lt;li&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;/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;/p&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 papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;40-0&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;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;replycount &amp;gt; 1&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;hasreplies = 1&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;hasreplies&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;replycount &amp;gt; 1&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;code&gt;INDEX(forumid, hasreplies, dateline)&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; 주문을 지원하기 위한 BTREE 지수인지 확인합니다.&lt;/font&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;ul&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;&lt;font class=&quot;papago-parent&quot;&gt;기정사실인&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;forumid&lt;/code&gt;&lt;/li&gt; 
 &lt;li&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;hasreplies&lt;/code&gt;&lt;/li&gt; 
 &lt;li&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&gt;&lt;code&gt;dateline&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&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;/p&gt; 
&lt;ul&gt; 
 &lt;li&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;BTREE 아래로 이동하여 일치하는 하위 트리 찾기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;forumid = X&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; :수)) . ( : log()) 입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&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;BTREE 아래로 더 이동하여 일치하는 하위 트리 찾기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;hasreplies = 1&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 class=&quot;papago-parent&quot;&gt;(계속 일치하는 동안)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;forumid = X&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;code&gt;hasreplies&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 class=&quot;papago-parent&quot;&gt;0 또는 1 밖에 되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포럼의 전체 항목 목록을 읽고 다시 sort할 필요 없이 필요한 결과를 얻기 위해 dateline-sorted 하위 트리를 이동합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&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 class=&quot;papago-parent&quot;&gt;이전에 제안했던 것은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;replycount&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 class=&quot;papago-parent&quot;&gt;틀렸습니다, 왜냐하면 그것은 범위 질의였고 따라서 a의 사용을 막았기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dateline&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 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;결과를 정렬하려면(따라서 응답이 있는 스레드를 매우 빠르게 선택했을 것이지만, 결과적으로 백만 줄짜리 목록은 필요한 100개의 요소를 찾기 전에 완전히 정렬되어야 했을 것입니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;62-0&quot;&gt;중요&lt;/strong&gt;: 이렇게 하면 모든 경우에 성능이 향상되지만 MySQL이 BTRE를 통해 바로 읽음에도 불구하고 앞으로 건너뛸 수 없는 것처럼 보이기 때문에 큰 OFFSET 값(10000!)은 성능이 저하됩니다. 따라서 OFFSET이 클수록 요청 속도가 느려집니다.&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 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;여러 계산에 걸쳐 계산을 퍼트리면 OFFSET 문제가 자동으로 해결되지 않는 것 같습니다(어쨌든 오프셋을 병렬로 건너뛰는 방법은 무엇입니까?).&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;또는 NoSQL로 이동합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NoSQL을 포함한 모든 솔루션은 다음을 기반으로 OFFSET 시뮬레이션으로 압축됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dateline&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 class=&quot;papago-parent&quot;&gt;(basically들의 말은)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dateline &amp;gt; Y LIMIT 100&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 class=&quot;papago-parent&quot;&gt;대신에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;LIMIT Z, 100&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 class=&quot;papago-parent&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Y&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 class=&quot;papago-parent&quot;&gt;오프셋에서 품목의 날짜입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Z&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;오프셋과 관련된 성능 문제를 제거하지만 200페이지 중 100페이지로 바로 이동할 수는 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;NoSQL 또는 MySQL 옵션과 관련된 의문의 부분이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실 이것은 여기에 숨겨진 근본적인 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 언어는 사람이 쓰기 쉽고 컴퓨터는 읽기가 조금 어렵습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대용량 데이터베이스에서는 SQL 백엔드를 사용하지 않는 것이 좋습니다. 이것은 추가적인 단계 명령 구문 분석이 필요하기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 광범위한 벤치마킹을 해보았는데 SQL 파서가 가장 느린 경우가 있습니다.&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;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그건 그렇고, 널리 알려지지는 않았지만 MySQL은 NoSQL 데이터베이스에서 성장했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL David와 Monty의 저자들이 일했던 회사는 데이터 웨어하우징 회사였으며, 종종 일반적이지 않은 작업에 대한 맞춤형 솔루션을 작성해야 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이로 인해 Oracle 등의 성능이 좋지 않을 때 데이터베이스 기능을 수동으로 작성하는 데 사용되는 홈브루 C 라이브러리가 크게 쌓이게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL은 거의 20년 된 이 동물원에 1996년 재미로 추가되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;알고 난 뒤에 뭐가 왔을까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 MySQL을 사용하면 SQL 오버헤드를 피할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 보통 SQL 파싱은 가장 느린 부분은 아니지만 알아두면 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;파서 오버헤드를 테스트하려면 &quot;SELECT 1&quot;(예: ;)을 벤치마크하면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;72&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;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리에 작동하는 인덱스 집합을 유지할 수 있는 충분한 RAM이 있으면 인덱스를 사용할 수 있는 모든 쿼리가 빨라집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키 버퍼가 인덱스를 저장할 수 있을 정도로 충분히 크게 설정되었는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 12GB로 충분하지 않은 경우 12GB RAM이 있는 서버를 10대 사용하지 말고 32GB 또는 64GB RAM이 있는 서버를 적게 사용하십시오.&lt;/font&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;인덱스는 필수이지만 올바른 유형의 인덱스를 선택해야 합니다. BTREE는 WHERE 절에서 &quot;&amp;lt;&quot; 또는 &quot;&amp;gt;&quot;로 쿼리를 사용할 때 더 적합한 반면 해시는 한 열에 여러 개의 다른 값이 있고 WHERE 절에서 &quot;=&quot; 또는 &quot;&amp;lt;=&amp;gt;&quot;를 사용할 때 더 적합합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더보기 http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;77&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/4419499/mysql-and-nosql-help-me-to-choose-the-right-one&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>MySQL</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/902</guid>
      <comments>https://nicesource.tistory.com/902#entry902comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:14:07 +0900</pubDate>
    </item>
    <item>
      <title>Pandas Dataframe / Numpy 배열 &amp;quot;축&amp;quot; 정의의 모호성</title>
      <link>https://nicesource.tistory.com/901</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Pandas Dataframe / Numpy 배열 &quot;축&quot; 정의의 모호성&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;python 축이 어떻게 정의되는지, 그리고 그것들이 DataFrame의 행 또는 열을 참조하는지에 대해 매우 혼란스러웠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래의 코드를 생각해 보십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=[&quot;col1&quot;, &quot;col2&quot;, &quot;col3&quot;, &quot;col4&quot;])
&amp;gt;&amp;gt;&amp;gt; df
   col1  col2  col3  col4
0     1     1     1     1
1     2     2     2     2
2     3     3     3     3
&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&gt;&lt;code&gt;df.mean(axis=1)&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;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; df.mean(axis=1)
0    1
1    2
2    3
&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;df.drop(name, axis=1)&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;strong papago-id=&quot;5-1&quot;&gt;열을 떨어뜨립니다&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; df.drop(&quot;col4&quot;, axis=1)
   col1  col2  col3
0     1     1     1
1     2     2     2
2     3     3     3
&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;누가 팬더/넘피/스키피에서 &quot;축&quot;이 무엇을 의미하는지 이해할 수 있도록 도와줄 수 있나요?&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;DataFrame.mean&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;code&gt;axis=1&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;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;10-1&quot;&gt;0&lt;/em&gt;=&lt;em papago-id=&quot;10-1&quot;&gt;down&lt;/em&gt;과 &lt;em papago-id=&quot;10-3&quot;&gt;1&lt;/em&gt;= across로 기억하는 것이 가장 간단할 것입니다.&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;ul&gt; 
 &lt;li&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;axis=0&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;/li&gt; 
 &lt;li&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;axis=1&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;/li&gt; 
&lt;/ul&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&gt;&lt;img src=&quot;https://i.stack.imgur.com/DL0iQ.jpg&quot; width=&quot;410&quot; height=&quot;210&quot;&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;팬더가 NumPy의 단어 사용을 따라 한다는 것을 기억하는 것도 유용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;axis&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 이 용법은 NumPy의 &lt;a href=&quot;http://docs.scipy.org/doc/numpy/glossary.html&quot; papago-id=&quot;18-1&quot;&gt;용어집&lt;/a&gt;에서 다음과 같이 설명합니다.&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;2차원 배열에는 두 개의 대응 축이 있습니다. 첫 번째 축은 행&lt;strong papago-id=&quot;19-1&quot;&gt; 간&lt;/strong&gt;에 수직으로 &lt;strong papago-id=&quot;19-1&quot;&gt;아래쪽&lt;/strong&gt;으로 실행되고&lt;strong papago-id=&quot;19-1&quot;&gt;(축&lt;/strong&gt; 0),&lt;strong papago-id=&quot;19-1&quot;&gt; &lt;/strong&gt;두 번째 축은 열 &lt;strong papago-id=&quot;19-3&quot;&gt;간에 수평&lt;/strong&gt;으로 실행됩니다&lt;strong papago-id=&quot;19-3&quot;&gt;(축 &lt;/strong&gt;1).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;[&lt;em papago-id=&quot;19-5&quot;&gt;나의 강조&lt;/em&gt;]&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;df.mean(axis=1)&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 class=&quot;papago-parent&quot;&gt;각 개별 행을 따라 &lt;em papago-id=&quot;21-1&quot;&gt;열&lt;/em&gt;에 걸쳐 &lt;em papago-id=&quot;21-1&quot;&gt;수평&lt;/em&gt;으로 항목의 평균을 취합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반면에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;df.mean(axis=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;em papago-id=&quot;22-1&quot;&gt;아래쪽&lt;/em&gt;으로 행을 &lt;em papago-id=&quot;22-1&quot;&gt;옮기는&lt;/em&gt; 작업이 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&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;df.drop(name, axis=1)&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;code&gt;axis=0&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;26&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;splited&quot;&gt;&lt;strong&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;axis&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;28-1&quot;&gt;변경할 축&lt;/em&gt;을 의미합니다.&lt;/font&gt;&lt;/font&gt;&lt;/strong&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;예를 들어 차원이 x&lt;em papago-id=&quot;29-1&quot;&gt; &lt;/em&gt;b x &lt;em papago-id=&quot;29-1&quot;&gt;c&lt;/em&gt;인 데이터 프레임이 있다고 가정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;df.mean(axis=1)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;치수 x&lt;em papago-id=&quot;30-1&quot;&gt; &lt;/em&gt;1 x &lt;em papago-id=&quot;30-1&quot;&gt;c&lt;/em&gt;의 데이터 프레임을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;df.drop(&quot;col4&quot;, axis=1)&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;em papago-id=&quot;31-1&quot;&gt;x (b-1)&lt;/em&gt; x &lt;em papago-id=&quot;31-1&quot;&gt;c&lt;/em&gt;인 데이터 프레임을 반환합니다.&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;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;axis=1&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;code&gt;b&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;b&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;/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;pre&gt;&lt;code&gt;// Not realistic but ideal for understanding the axis parameter 
df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]],
                  columns=[&quot;idx1&quot;, &quot;idx2&quot;, &quot;idx3&quot;, &quot;idx4&quot;],
                  index=[&quot;idx1&quot;, &quot;idx2&quot;, &quot;idx3&quot;]
                 )

---------------------------------------1
|          idx1  idx2  idx3  idx4
|    idx1     1     1     1     1
|    idx2     2     2     2     2
|    idx3     3     3     3     3
0
&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;font class=&quot;papago-parent&quot;&gt;대해서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;df.drop&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 class=&quot;papago-parent&quot;&gt;(축은 위치를 의미함)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;A: I wanna remove idx3.
B: **Which one**? // typing while waiting response: df.drop(&quot;idx3&quot;,
A: The one which is on axis 1
B: OK then it is &amp;gt;&amp;gt; df.drop(&quot;idx3&quot;, axis=1)

// Result
---------------------------------------1
|          idx1  idx2     idx4
|    idx1     1     1     1
|    idx2     2     2     2
|    idx3     3     3     3
0
&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;&lt;font class=&quot;papago-parent&quot;&gt;대해서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;df.apply&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 class=&quot;papago-parent&quot;&gt;(축은 방향을 의미함)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;A: I wanna apply sum.
B: Which direction? // typing while waiting response: df.apply(lambda x: x.sum(),
A: The one which is on *parallel to axis 0*
B: OK then it is &amp;gt;&amp;gt; df.apply(lambda x: x.sum(), axis=0)

// Result
idx1    6
idx2    6
idx3    6
idx4    6
&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;문자열 별칭 &lt;strong papago-id=&quot;41-1&quot;&gt;'index'&lt;/strong&gt; 및 &lt;strong papago-id=&quot;41-3&quot;&gt;'columns'&lt;/strong&gt;를 정수 0/1 대신 사용할 수 있음을 널리 알아야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;별칭은 훨씬 더 명확하며 계산이 어떻게 이루어지는지 기억하는 데 도움이 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'index'의 다른 별칭은 &lt;strong papago-id=&quot;41-5&quot;&gt;'행&lt;/strong&gt;'입니다&lt;strong papago-id=&quot;41-5&quot;&gt;.&lt;/strong&gt;&lt;/font&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 class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;axis='index'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&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;/p&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;df = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))
          a         b         c         d
0  0.990730  0.567822  0.318174  0.122410
1  0.144962  0.718574  0.580569  0.582278
2  0.477151  0.907692  0.186276  0.342724
3  0.561043  0.122771  0.206819  0.904330
4  0.427413  0.186807  0.870504  0.878632
5  0.795392  0.658958  0.666026  0.262191
6  0.831404  0.011082  0.299811  0.906880
7  0.749729  0.564900  0.181627  0.211961
8  0.528308  0.394107  0.734904  0.961356
9  0.120508  0.656848  0.055749  0.290897
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&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;axis='index'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&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&gt;&lt;code&gt;df.mean(axis='index')
a    0.562664
b    0.478956
c    0.410046
d    0.546366
dtype: float64
&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;다음과 같은 결과를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.mean() # default is axis=0
df.mean(axis=0)
df.mean(axis='rows')
&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;행에서 왼쪽에서 오른쪽으로 작업을 수행하려면 axis= 'columns'를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 DataFrame에 추가 열이 추가될 수도 있다는 생각으로 기억합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.mean(axis='columns')
0    0.499784
1    0.506596
2    0.478461
3    0.448741
4    0.590839
5    0.595642
6    0.512294
7    0.427054
8    0.654669
9    0.281000
dtype: float64
&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;df.mean(axis=1)
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;축=0/인덱스/행으로 새 행 추가&lt;/font&gt;&lt;/h3&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;따라서 축 = 0/index/rows를 사용할 때마다 DataFrame의 새 행을 얻는 것과 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;행을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.append(df.mean(axis='rows'), ignore_index=True)

           a         b         c         d
0   0.990730  0.567822  0.318174  0.122410
1   0.144962  0.718574  0.580569  0.582278
2   0.477151  0.907692  0.186276  0.342724
3   0.561043  0.122771  0.206819  0.904330
4   0.427413  0.186807  0.870504  0.878632
5   0.795392  0.658958  0.666026  0.262191
6   0.831404  0.011082  0.299811  0.906880
7   0.749729  0.564900  0.181627  0.211961
8   0.528308  0.394107  0.734904  0.961356
9   0.120508  0.656848  0.055749  0.290897
10  0.562664  0.478956  0.410046  0.546366
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;축=1/로 새 열 추가&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마찬가지로 axis=1/ columns를 사용하면 쉽게 자신의 열로 만들 수 있는 데이터가 생성됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;df.assign(e=df.mean(axis='columns'))

          a         b         c         d         e
0  0.990730  0.567822  0.318174  0.122410  0.499784
1  0.144962  0.718574  0.580569  0.582278  0.506596
2  0.477151  0.907692  0.186276  0.342724  0.478461
3  0.561043  0.122771  0.206819  0.904330  0.448741
4  0.427413  0.186807  0.870504  0.878632  0.590839
5  0.795392  0.658958  0.666026  0.262191  0.595642
6  0.831404  0.011082  0.299811  0.906880  0.512294
7  0.749729  0.564900  0.181627  0.211961  0.427054
8  0.528308  0.394107  0.734904  0.961356  0.654669
9  0.120508  0.656848  0.055749  0.290897  0.281000
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;df._AXIS_ALIASES
{'rows': 0}

df._AXIS_NUMBERS
{'columns': 1, 'index': 0}

df._AXIS_NAMES
{0: 'index', 1: 'columns'}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;axis='rows' 또는 axis=0이면 행 방향의 액세스 요소를 최대 아래 방향으로 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;축=0을 따라 합을 적용하면 각 열의 합계가 됩니다.&lt;/font&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;axis= 'columns' 또는 axis=1일 때는 열 방향, 왼쪽에서 오른쪽으로 접근 요소를 의미합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;축=1을 따라 합을 적용하면 각 행의 합계를 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;57&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;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;치수 변경, 축=0이면 행 변경, 열 변경, 축=1이면 열 변경, 행 변경 변경으로 기억했습니다.&lt;/font&gt;&lt;/p&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/25773245/ambiguity-in-pandas-dataframe-numpy-array-axis-definition&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>DataFrame</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/901</guid>
      <comments>https://nicesource.tistory.com/901#entry901comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:32:48 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell 개체에서 멤버를 제거하시겠습니까?</title>
      <link>https://nicesource.tistory.com/900</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PowerShell 개체에서 멤버를 제거하시겠습니까?&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;/p&gt;&lt;p&gt;&lt;code&gt;Select-Object&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&gt;&lt;code&gt;ExcludeProperty&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;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;# new object with properties Test and Foo
$obj = New-Object -TypeName PSObject -Property @{ Test = 1; Foo = 2 }

# remove a property from PSObject.Properties
$obj.PSObject.Properties.Remove('Foo')
&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;$obj = New-Object -TypeName PsObject -Property @{ Test = 1}
$obj | Add-Member -MemberType NoteProperty -Name Foo -Value Bar
$new_obj = $obj | Select-Object -Property Test
&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;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$obj | Select-Object -Property * -ExcludeProperty Foo
&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;font class=&quot;papago-parent&quot;&gt;개체를 JSON으로 변환한 다음 개체로 다시 변환합니다. 모든 속성이 NoteProperty 유형으로 변환되어 원하는 항목을 제거할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   $mycomplexobject = $mycomplexobject | ConvertTo-Json | ConvertFrom-Json

    $mycomplexobject.PSObject.Properties.Remove('myprop')
&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;JSON과 back으로 변환하면 PSCustomObject가 생성됩니다.&lt;/font&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;일반적으로 꽤 쉽게 할 수 있는 'import-csv'에서 얻을 수 있는 것과 같은 객체의 모음(array)입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$MyDataCollection = Import-CSV c:\datafiles\ADComputersData.csv
$MyDataCollection
Windows Server : lax2012sql01
IP             : 10.101.77.69
Site           : LAX
OS             : 2012 R2
Notes           : V

Windows Server : sfo2016iis01
IP             : 10.102.203.99
Site           : SFO
OS             : 2012 R2
Notes           : X
&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;$MyDataCollection | ForEach { $_.PSObject.Properties.Remove('Notes') }

Windows Server : lax2012sql01
IP             : 10.101.77.69
Site           : LAX
OS             : 2012 R2

Windows Server : sfo2016iis01
IP             : 10.102.203.99
Site           : SFO
OS             : 2012 R2
&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;URL : https://stackoverflow.com/questions/17905060/remove-a-member-from-a-powershell-object&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Powershell</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/900</guid>
      <comments>https://nicesource.tistory.com/900#entry900comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:32:39 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스:사용자 정의 필드의 모든 값 가져오기</title>
      <link>https://nicesource.tistory.com/899</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;Verve Meta Box를 사용하고 있습니다.&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;예를 들어, &quot;과일&quot;이라는 사용자 지정 선택 필드가 있고 옵션으로 &quot;사과&quot;, &quot;오렌지&quot; 및 &quot;바나나&quot;가 있는 경우 배열로 이러한 값의 전체 목록을 얻을 수 있는 방법은 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;게시물과 관련된 내용을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;get_post_custom_values('fruit')
&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;미리 감사드립니다!&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;global $wpdb;
$results = $wpdb-&amp;gt;get_results( 'SELECT DISTINCT meta_value FROM wp_postmeta WHERE meta_key LIKE &quot;FIELD_NAME&quot;', OBJECT );
&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;포스트메타 테이블이 &quot;wp_postmeta&quot;(기본값)인지 확인하고 관리자에서 필드에 대해 작성한 이름으로 FIELD_NAME을 변경합니다.&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;루프에서 get_post_meta 함수를 사용하면 일반 워드프레스 방식으로 할 수 있습니다.&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;pre&gt;&lt;code&gt;$fruits = trim(get_post_meta($post-&amp;gt;ID,'fruits',true)); 
$fruits_array = explode(',',$fruits);
foreach($fruits_array as $f){
   echo $f.'&amp;lt;br/&amp;gt;';
}
&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;/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;저는 우아한 해결책을 찾지 못했습니다.&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;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/9281095/wordpress-get-all-values-of-a-custom-field&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>WordPress</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/899</guid>
      <comments>https://nicesource.tistory.com/899#entry899comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:32:32 +0900</pubDate>
    </item>
    <item>
      <title>그 끝에 cross(x) 버튼이 있는 EditText를 만드는 방법?</title>
      <link>https://nicesource.tistory.com/898</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 끝에 cross(x) 버튼이 있는 EditText를 만드는 방법?&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;EditText&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;EditText&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 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;EditText&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;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android용 재료 설계 구성 요소를 통한 2020년 솔루션:&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;p&gt;&lt;em papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 최신 버전 찾기: https://maven.google.com/&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;implementation 'com.google.android.material:material:1.3.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;또는 AndroidX libs를 사용하도록 업데이트하지 않았다면 다음과 같은 방법으로 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;implementation 'com.android.support:design:28.0.0'
&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;&amp;lt;com.google.android.material.textfield.TextInputLayout
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:hint=&quot;@string/hint_text&quot;
    app:endIconMode=&quot;clear_text&quot;&amp;gt;

  &amp;lt;com.google.android.material.textfield.TextInputEditText
      android:layout_width=&quot;match_parent&quot;
      android:layout_height=&quot;wrap_content&quot;/&amp;gt;

&amp;lt;/com.google.android.material.textfield.TextInputLayout&amp;gt;
&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;strong papago-id=&quot;10-1&quot;&gt;앱:endIconMode&lt;/strong&gt;=&quot;&lt;strong papago-id=&quot;10-1&quot;&gt;clear_text&lt;/strong&gt;&quot;에 주목합니다.&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;a href=&quot;https://material.io/develop/android/components/text-input-layout/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-1&quot;&gt;재료 설계 문서&lt;/a&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;FrameLayout
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:layout_marginTop=&quot;9dp&quot;
    android:padding=&quot;5dp&quot;&amp;gt;

    &amp;lt;EditText
        android:id=&quot;@+id/calc_txt_Prise&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:inputType=&quot;numberDecimal&quot;  
        android:layout_marginTop=&quot;20dp&quot;
        android:textSize=&quot;25dp&quot;
        android:textColor=&quot;@color/gray&quot;
        android:textStyle=&quot;bold&quot;
        android:hint=&quot;@string/calc_txt_Prise&quot;
        android:singleLine=&quot;true&quot; /&amp;gt;

    &amp;lt;Button
        android:id=&quot;@+id/calc_clear_txt_Prise&quot;      
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_marginRight=&quot;10dp&quot;
        android:layout_gravity=&quot;right|center_vertical&quot;
        android:background=&quot;@drawable/delete&quot; /&amp;gt;

&amp;lt;/FrameLayout&amp;gt;
&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;버튼의 id를 사용하여 ClickListener 메서드에서 원하는 작업을 수행할 수도 있습니다.&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;em papago-id=&quot;14-1&quot;&gt;DroidParts&lt;/em&gt;를 사용하시는 경우 &lt;a href=&quot;https://github.com/droidparts/droidparts/blob/master/droidparts-misc/src/org/droidparts/widget/ClearableEditText.java&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14-3&quot;&gt;ClearableEditText&lt;/a&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;사용자 지정 배경 &amp;amp; Clear 아이콘이 다음과 같이 설정됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;abs__ic_clear_holo_light&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;em papago-id=&quot;16-1&quot;&gt;ActionBarSherlock&lt;/em&gt;에서:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/FMgd7.png&quot; alt=&quot;enter image description here&quot;&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;이 도우미 방법을 코틀린 파일에 넣으십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fun EditText.setupClearButtonWithAction() {

    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val clearIcon = if (editable?.isNotEmpty() == true) R.drawable.ic_clear else 0
            setCompoundDrawablesWithIntrinsicBounds(0, 0, clearIcon, 0)
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit
    })

    setOnTouchListener(View.OnTouchListener { _, event -&amp;gt;
        if (event.action == MotionEvent.ACTION_UP) {
            if (event.rawX &amp;gt;= (this.right - this.compoundPaddingRight)) {
                this.setText(&quot;&quot;)
                return@OnTouchListener true
            }
        }
        return@OnTouchListener false
    })
}
&lt;/code&gt;&lt;/pre&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;onCreate&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;yourEditText.setupClearButtonWithAction()
&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;그건 그렇고, 당신은 추가해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;R.drawable.ic_clear&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 class=&quot;papago-parent&quot;&gt;이건 google- https://fonts.google.com/icons?selected=Material%20Icons%20Outlined%3Aclear%3A 에서 온 것입니다.&lt;/font&gt;&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;Android의 지원 라이브러리에는 바로 이와 같은 클래스가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(에서 파생되지 않음)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EditText&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만, 그래서 a 대신 a를 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;TextWatcher&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 class=&quot;papago-parent&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/yLxCj.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/yLxCj.png&quot; alt=&quot;Search view with no text (and hint text &amp;quot;Search&amp;quot;)&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/xTTe2.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/xTTe2.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&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;XML에서는 다음과 같이 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  &amp;lt;android.support.v7.widget.SearchView
            android:id=&quot;@+id/searchView&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:iconifiedByDefault=&quot;false&quot;
            android:queryHint=&quot;@string/SearchHint&quot;
            app:iconifiedByDefault=&quot;false&quot;
            app:queryHint=&quot;@string/SearchHint&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Drawable x = getResources().getDrawable(R.drawable.x);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
mEditText.setCompoundDrawables(null, null, x, null);
&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;여기서 x는:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/vDH0q.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&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 class=&quot;papago-parent&quot;&gt;위해서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;drawable resource&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 class=&quot;papago-parent&quot;&gt;표준 안드로이드 이미지를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20171127224252/http://www.androiddrawables.com/Menu.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://androiddrawables.com/Menu.html 용 웹 아카이브&lt;/font&gt;&lt;/a&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;android:background=&quot;@android:drawable/ic_menu_close_clear_cancel&quot;
&lt;/code&gt;&lt;/pre&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 class=&quot;papago-parent&quot;&gt;십자가를 바짝 붙이면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;drawableEnd&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 class=&quot;papago-parent&quot;&gt;당신의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EditText&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 class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;EditText
     ...
    android:drawableEnd=&quot;@drawable/ic_close&quot;
    android:drawablePadding=&quot;8dp&quot;
     ... /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;확장을 &lt;strong papago-id=&quot;34-1&quot;&gt;사용하여 클릭&lt;/strong&gt;(또는 사용)을 처리합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;OnTouchListener&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 class=&quot;papago-parent&quot;&gt;당신에게 직접&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;EditText&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 class=&quot;papago-parent&quot;&gt;):&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fun EditText.onDrawableEndClick(action: () -&amp;gt; Unit) {
    setOnTouchListener { v, event -&amp;gt;
        if (event.action == MotionEvent.ACTION_UP) {
            v as EditText
            val end = if (v.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL)
                v.left else v.right
            if (event.rawX &amp;gt;= (end - v.compoundPaddingEnd)) {
                action.invoke()
                return@setOnTouchListener true
            }
        }
        return@setOnTouchListener false
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em papago-id=&quot;37&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;pre&gt;&lt;code&gt;editText.onDrawableEndClick {
    // TODO clear action
    etSearch.setText(&quot;&quot;)
}
&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;사용자 정의 보기 또는 특수 레이아웃을 사용하지 않으려면 9-patch를 사용하여 (X) 버튼을 만들 수 있습니다.&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;예: http://postimg.org/image/tssjmt97p/ (StackOverflow에 이미지를 게시하기에 포인트가 부족합니다.)&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;사용자가 x를 클릭한 것을 감지하도록 OnTouch Listener를 다음과 같이 설정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;editText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_UP){
            if (motionEvent.getX()&amp;gt;(view.getWidth()-view.getPaddingRight())){
                ((EditText)view).setText(&quot;&quot;);
            }
        }
        return false;
    }
});
&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;고객의 요구에 따라 이 솔루션은 경우에 따라 더 효과적으로 작동할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 xml을 덜 복잡하게 유지하는 것을 선호합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 아이콘을 왼쪽에 두고 싶은 경우에도 도움이 됩니다. 9 패치에 아이콘을 간단히 포함할 수 있습니다.&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;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;텍스트 후행 아이콘이 선명한 텍스트 필드&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&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;/p&gt; 
&lt;pre&gt;&lt;code&gt;    ...
    app:endIconMode=&quot;clear_text&quot;&amp;gt;
​
    ...
​
&amp;lt;/com.google.android.material.textfield.TextInputLayout&amp;gt;
&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;p&gt;&lt;a href=&quot;https://material.io/develop/android/components/text-fields&quot; rel=&quot;noreferrer&quot; papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;material.io&lt;/font&gt;&lt;/a&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;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;a href=&quot;https://i.stack.imgur.com/wRkJ4.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/wRkJ4.png&quot; alt=&quot;example &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;UI 부분은 아래와 같이 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;RelativeLayout
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;50dp&quot;
    android:layout_marginTop=&quot;9dp&quot;
    android:padding=&quot;5dp&quot;&amp;gt;

    &amp;lt;EditText
        android:id=&quot;@+id/etSearchToolbar&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;match_parent&quot;
        android:textSize=&quot;13dp&quot;
        android:padding=&quot;10dp&quot;
        android:textColor=&quot;@android:color/darker_gray&quot;
        android:textStyle=&quot;normal&quot;
        android:hint=&quot;Search&quot;
        android:imeOptions=&quot;actionSearch&quot;
        android:inputType=&quot;text&quot;
        android:background=&quot;@drawable/edittext_bg&quot;
        android:maxLines=&quot;1&quot; /&amp;gt;

    &amp;lt;ImageView
        android:id=&quot;@+id/ivClearSearchText&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_centerVertical=&quot;true&quot;
        android:layout_marginRight=&quot;6dp&quot;
        android:src=&quot;@drawable/balloon_overlay_close&quot;
        android:layout_alignParentRight=&quot;true&quot;
        android:layout_alignParentEnd=&quot;true&quot; /&amp;gt;
&amp;lt;/RelativeLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집text_bg.xml&lt;/font&gt;&lt;/strong&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;!-- res/drawable/rounded_edittext_focused.xml --&amp;gt;
&amp;lt;shape xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:padding=&quot;10dp&quot;
    android:shape=&quot;rectangle&quot; &amp;gt;

    &amp;lt;solid android:color=&quot;#FFFFFF&quot; /&amp;gt;

    &amp;lt;stroke
        android:width=&quot;1dp&quot;
        android:color=&quot;#C9C9CE&quot; /&amp;gt;

    &amp;lt;corners
        android:bottomLeftRadius=&quot;15dp&quot;
        android:bottomRightRadius=&quot;15dp&quot;
        android:topLeftRadius=&quot;15dp&quot;
        android:topRightRadius=&quot;15dp&quot; /&amp;gt;

&amp;lt;/shape&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;balloon_overlay_close.png&lt;/font&gt;&lt;/em&gt;&lt;a href=&quot;https://i.stack.imgur.com/VAgX7.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/VAgX7.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;51&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;searchBox.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if(charSequence.length() &amp;gt; 0){
            clearSearch.setVisibility(View.VISIBLE);
        }else{
            clearSearch.setVisibility(View.GONE);
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {}
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;52&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;searchBox.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            String contents = searchBox.getText().toString().trim();
            if(contents.length() &amp;gt; 0){
                //do search

            }else{
                //if something to do for empty edittext
            }

            return true;
        }
        return false;
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;53&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;clearSearch.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        searchBox.setText(&quot;&quot;);
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위젯이 포함된 전체 라이브러리: https://github.com/opprime/EditTextField&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;55&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;compile 'com.optimus:editTextField:0.2.0'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;layout.xml 파일에서 위젯 설정을 사용하여 재생할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;app: clearButtonMode ，an에는 이러한 값이 있습니다. 편집하지 않는 한 편집 중에는 항상 사용할 수 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱:clearButtonDrawable&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&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;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/vTBB3.gif&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/vTBB3.gif&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;60&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;android:drawableRight=&quot;@android:drawable/ic_input_delete&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 토막글은 Jaydip 답변과 함께 둘 이상의 버튼을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ET와 Button Elements를 참조한 후 호출하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;vecotr 버튼을 사용했으므로 Button 요소를 ImageButton으로 변경해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;private void setRemovableET(final EditText et, final ImageButton resetIB) {

        et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus &amp;amp;&amp;amp; et.getText().toString().length() &amp;gt; 0)
                    resetIB.setVisibility(View.VISIBLE);
                else
                    resetIB.setVisibility(View.INVISIBLE);
            }
        });

        resetIB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                et.setText(&quot;&quot;);
                resetIB.setVisibility(View.INVISIBLE);
            }
        });

        et.addTextChangedListener(new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {}
            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }
            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if(s.length() != 0){
                    resetIB.setVisibility(View.VISIBLE);
                }else{
                    resetIB.setVisibility(View.INVISIBLE);
                }
            }
        });
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;62&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;TextView
    android:id=&quot;@+id/inputSearch&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:drawableRight=&quot;@drawable/ic_actionbar&quot;
    android:layout_alignParentBottom=&quot;true&quot;
    android:layout_toRightOf=&quot;@+id/back_button&quot;/&amp;gt;

&amp;lt;Button
    android:id=&quot;@+id/clear_text_invisible_button&quot;
    android:layout_width=&quot;30dp&quot;
    android:layout_height=&quot;30dp&quot;
    android:layout_gravity=&quot;right|center_vertical&quot;
    android:background=&quot;@color/transparent&quot;
    android:layout_alignBaseline=&quot;@+id/inputSearch&quot;
    android:layout_alignBottom=&quot;@+id/inputSearch&quot;
    android:layout_alignRight=&quot;@+id/inputSearch&quot;
    android:layout_alignEnd=&quot;@+id/inputSearch&quot;
    android:layout_marginRight=&quot;13dp&quot;
    /&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;63&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;EditText
    android:id=&quot;@+id/idSearchEditText&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;@dimen/dimen_40dp&quot;
    android:drawableStart=&quot;@android:drawable/ic_menu_search&quot;
    android:drawablePadding=&quot;8dp&quot;
    android:ellipsize=&quot;start&quot;
    android:gravity=&quot;center_vertical&quot;
    android:hint=&quot;Search&quot;
    android:imeOptions=&quot;actionSearch&quot;
    android:inputType=&quot;text&quot;
    android:paddingStart=&quot;16dp&quot;
    android:paddingEnd=&quot;8dp&quot;
/&amp;gt;

EditText mSearchEditText = findViewById(R.id.idSearchEditText);
mSearchEditText.addTextChangedListener(this);
mSearchEditText.setOnTouchListener(this);


@Override
public void afterTextChanged(Editable aEditable) {
    int clearIcon = android.R.drawable.ic_notification_clear_all;
    int searchIcon = android.R.drawable.ic_menu_search;
    if (aEditable == null || TextUtils.isEmpty(aEditable.toString())) {
        clearIcon = 0;
        searchIcon = android.R.drawable.ic_menu_search;
    } else {
        clearIcon = android.R.drawable.ic_notification_clear_all;
        searchIcon = 0;
    }
    Drawable leftDrawable =  null;
    if (searchIcon != 0) {
        leftDrawable = getResources().getDrawable(searchIcon);
    }
    Drawable rightDrawable = null;
    if (clearIcon != 0) {
        rightDrawable = getResources().getDrawable(clearIcon);
    }

    mSearchEditText.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, rightDrawable, null);
}


@Override
public boolean onTouch(View aView, MotionEvent aEvent) {
    if (aEvent.getAction() == MotionEvent.ACTION_UP){
        if (aEvent.getX() &amp;gt; ( mSearchEditText.getWidth() - 
         mSearchEditText.getCompoundPaddingEnd())){
            mSearchEditText.setText(&quot;&quot;);
        }
    }
    return false;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;64&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;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;&amp;lt;RelativeLayout
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;35dp&quot;
        android:layout_margin=&quot;10dp&quot;
        android:background=&quot;@drawable/your_desired_drawable&quot;&amp;gt;

        &amp;lt;EditText
            android:id=&quot;@+id/search_et&quot;
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;match_parent&quot;
            android:layout_alignParentStart=&quot;true&quot;
            android:layout_toStartOf=&quot;@id/clear_btn&quot;
            android:background=&quot;@null&quot;
            android:hint=&quot;search...&quot;
            android:imeOptions=&quot;actionSearch&quot;
            android:inputType=&quot;text&quot;
            android:maxLines=&quot;1&quot;
            android:paddingStart=&quot;15dp&quot;
            android:paddingEnd=&quot;10dp&quot; /&amp;gt;

        &amp;lt;ImageView
            android:id=&quot;@+id/clear_btn&quot;
            android:layout_width=&quot;20dp&quot;
            android:layout_height=&quot;match_parent&quot;
            android:layout_alignParentEnd=&quot;true&quot;
            android:layout_centerInParent=&quot;true&quot;
            android:layout_marginEnd=&quot;15dp&quot;
            android:visibility=&quot;gone&quot;
            android:src=&quot;@drawable/ic_baseline_clear_24&quot;/&amp;gt;

    &amp;lt;/RelativeLayout&amp;gt;
&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;이제 clear button의 기능입니다. 이 코드를 create 메서드에 붙여넣으십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;search_et.addTextChangedListener(object: TextWatcher {
            override fun beforeTextChanged(s:CharSequence, start:Int, count:Int, after:Int) {
            }
            override fun onTextChanged(s:CharSequence, start:Int, before:Int, count:Int) {
            }
            override fun afterTextChanged(s: Editable) {
                if (s.isNotEmpty()){
                    clear_btn.visibility = VISIBLE
                    clear_btn.setOnClickListener {
                        search_et.text.clear()
                    }
                }else{
                    clear_btn.visibility = GONE
                }
            }
        })
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;67&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;class EditTextWithClear : AppCompatEditText {

constructor(context: Context) : super(context)

constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)

constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
    context,
    attributeSet,
    defStyleAttr
)

private val blackClearDrawable =
    ResourcesCompat.getDrawable(resources, R.drawable.ic_clear_text, null) as Drawable
private val opaqueClearDrawable =
    ResourcesCompat.getDrawable(resources, R.drawable.ic_clear_text, null) as Drawable

private var clearButtonImage: Drawable = opaqueClearDrawable
private var onTextClearListener: OnTextClearListener? = null

fun setOnTextClearListener(onTextClearListener: OnTextClearListener) {
    this.onTextClearListener = onTextClearListener
}

private fun showClearButton() {
    setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, clearButtonImage, null)
}

private fun hideClearButton() {
    setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, null, null)
}

@SuppressLint(&quot;ClickableViewAccessibility&quot;)
override fun onTouchEvent(event: MotionEvent): Boolean {
    if (isClearButtonVisible() &amp;amp;&amp;amp; wasClearButtonTouched(event)) {
        onClearButtonTouched(event)
        return true
    }

    return super.onTouchEvent(event)
}

override fun onTextChanged(
    text: CharSequence?,
    start: Int,
    lengthBefore: Int,
    lengthAfter: Int
) {
    if (text?.isNotEmpty() == true) {
        showClearButton()
    } else {
        onTextClearListener?.onTextClearListener()
        hideClearButton()
    }
}

private fun isClearButtonVisible(): Boolean {
    return compoundDrawablesRelative[2] != null
}

private fun wasClearButtonTouched(event: MotionEvent): Boolean {
    val isClearButtonAtTheStart = layoutDirection == View.LAYOUT_DIRECTION_RTL

    return if (isClearButtonAtTheStart) {

        val clearButtonEnd = paddingStart + clearButtonImage.intrinsicWidth
        event.x &amp;lt; clearButtonEnd

    } else {

        val clearButtonStart = width - clearButtonImage.intrinsicWidth - paddingEnd
        event.x &amp;gt; clearButtonStart

    }
}

private fun onClearButtonTouched(event: MotionEvent) {
    when (event.action) {
        MotionEvent.ACTION_DOWN -&amp;gt; {
            clearButtonImage = blackClearDrawable
            showClearButton()
        }
        MotionEvent.ACTION_UP -&amp;gt; {
            clearButtonImage = opaqueClearDrawable
            text?.clear()
            hideClearButton()
        }
    }
}

interface OnTextClearListener {
    fun onTextClearListener()
}

/*
This code use your activity and fragment
editext.setOnTextClearListener(object : EditTextWithClear.OnTextClearListener{
    override fun onTextClearListener() {
        //perform action when empty your edittext
    }
})*/}
&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;Xml 코드&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;com.example.clearbaleedittext.utility.EditTextWithClear
    android:id=&quot;@+id/etEditext&quot;
    android:layout_width=&quot;0dp&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:layout_marginTop=&quot;@dimen/dp_12&quot;
    android:background=&quot;@color/transparent&quot;
    android:fontFamily=&quot;@font/helvetica_normal&quot;
    android:inputType=&quot;text&quot;
    android:maxLines=&quot;1&quot;
    android:paddingHorizontal=&quot;@dimen/dp_12&quot;
    android:paddingVertical=&quot;@dimen/dp_12&quot;
    android:textSize=&quot;@dimen/sp_16&quot;
    /&amp;gt;
&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;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/6355096/how-to-create-edittext-with-crossx-button-at-end-of-it&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>Android</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/898</guid>
      <comments>https://nicesource.tistory.com/898#entry898comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:32:26 +0900</pubDate>
    </item>
    <item>
      <title>BLOB를 CLOB로 변환하는 방법은?</title>
      <link>https://nicesource.tistory.com/897</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BLOB를 CLOB로 변환하는 방법은?&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;저는 오라클 11g을 사용하고 있고 텍스트 길이를 알아내려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 평소에.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select length(myvar) from table&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&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;BLOB&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 class=&quot;papago-parent&quot;&gt;나는 내가 몇자인지 알고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BLOB&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&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;BLOB&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;UTL_RAW.CAST_TO_VARCHAR2(myblob) from table&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&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;BLOB&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;code&gt;Section&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 이것을 데이터베이스에서 16진수 형태로 볼 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;S.e.c.t.i.o.n.&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 class=&quot;papago-parent&quot;&gt;그런 다음 이 쿼리를 사용했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select UTL_RAW.CAST_TO_VARCHAR2(myblob) 
from table
&lt;/code&gt;&lt;/pre&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;'S'&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;code&gt;BLOB&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;select length(UTL_RAW.CAST_TO_VARCHAR2(myblob))
from table
&lt;/code&gt;&lt;/pre&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;18&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;code&gt;Sections&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;18자가 없습니다.&lt;/font&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;BLOB&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;VARCHAR&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;CLOB&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;VARCHAR&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;has. 나는 다음과 같은 질문을 함으로써 이를 시도했습니다. (이것이 맞는지는 확실하지 않지만 인터넷에서 찾은 것입니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(myblob, 32767, 1))
from table
&lt;/code&gt;&lt;/pre&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&gt;&lt;/font&gt;&lt;code&gt;'S'&lt;/code&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;여기 예가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;create function clobfromblob(p_blob blob) return clob is
      l_clob         clob;
      l_dest_offsset integer := 1;
      l_src_offsset  integer := 1;
      l_lang_context integer := dbms_lob.default_lang_ctx;
      l_warning      integer;

   begin

      if p_blob is null then
         return null;
      end if;

      dbms_lob.createTemporary(lob_loc =&amp;gt; l_clob
                              ,cache   =&amp;gt; false);

      dbms_lob.converttoclob(dest_lob     =&amp;gt; l_clob
                            ,src_blob     =&amp;gt; p_blob
                            ,amount       =&amp;gt; dbms_lob.lobmaxsize
                            ,dest_offset  =&amp;gt; l_dest_offsset
                            ,src_offset   =&amp;gt; l_src_offsset
                            ,blob_csid    =&amp;gt; dbms_lob.default_csid
                            ,lang_context =&amp;gt; l_lang_context
                            ,warning      =&amp;gt; l_warning);

      return l_clob;

   end;
&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;blob을 clob으로 변환하려면 다음을 시도합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT TO_CLOB(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(MYBLOB,2000))) 
FROM MYTABLE;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;SELECT DBMS_LOB.GetLength( myblob ) length_in_bytes
  FROM table
&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;는 BLOB의 길이를 바이트 단위로 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;BLOB의 문자 데이터는 UTF-16 문자 집합을 사용하여 인코딩되어 바이트 수가 문자 수의 두 배가 될 수 있습니다(사용 중인 유니코드 버전과 저장 중인 특정 데이터에 따라).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 문자의 경우 4바이트의 스토리지가 필요할 수 있지만 해당 문자를 처리할 가능성은 상대적으로 낮습니다.&lt;/font&gt;&lt;/p&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;/font&gt;&lt;/font&gt;&lt;code&gt;DBMS_LOB.ConvertToClob&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BLOB를 CLOB로 변환하는 프로시저(이 프로시저이기 때문에 PL/SQL 블록에서 호출해야 함).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;변환의 일환으로 데이터가 인코딩된 문자 집합을 지정해야 합니다. 애플리케이션에서 UTF-16 문자 집합을 사용하고 있다고 가정하지만 이는 단지 가정에 불과합니다.&lt;/font&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;CLOB로만 변환:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select TO_CLOB(UTL_RAW.CAST_TO_VARCHAR2(YOURCLOB)) from DUAL;
&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;p papago-id=&quot;32&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/12849025/how-to-convert-blob-to-clob&lt;/font&gt;&lt;/p&gt;</description>
      <category>source</category>
      <category>oracle</category>
      <author>nicesource</author>
      <guid isPermaLink="true">https://nicesource.tistory.com/897</guid>
      <comments>https://nicesource.tistory.com/897#entry897comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:32:08 +0900</pubDate>
    </item>
  </channel>
</rss>