<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>빠르고 정확한 개발자</title>
    <link>https://wefree.tistory.com/</link>
    <description>서두르지 말고, 멈추지도 말고</description>
    <language>ko</language>
    <pubDate>Fri, 12 Jun 2026 11:19:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>wefree</managingEditor>
    <item>
      <title>wsl2 용량 최적화</title>
      <link>https://wefree.tistory.com/431</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;wsl 에서 docker 를 사용하고 있다면, wsl 볼륨이 windows 에서 용량을 너무 많이 차지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 C:\Users\USER\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx 의 파일이 매우 커질 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 최적화로 용량을 줄일 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1770725844134&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wsl --shutdown
Optimize-VHD -Path &quot;C:\Users\USER\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&quot; -Mode Full&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>wsl2</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/431</guid>
      <comments>https://wefree.tistory.com/431#entry431comment</comments>
      <pubDate>Tue, 10 Feb 2026 21:18:44 +0900</pubDate>
    </item>
    <item>
      <title>DuckDB 에서 PostgreSQL 연결하기</title>
      <link>https://wefree.tistory.com/430</link>
      <description>&lt;pre id=&quot;code_1761916810261&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import duckdb

# (1) DuckDB 연결 &amp;mdash; 메모리 또는 파일 DB
con = duckdb.connect()  # 메모리 기반
# 또는
# con = duckdb.connect(&quot;mydb.duckdb&quot;)  # 파일 기반

# (2) PostgreSQL extension 설치 / 로드 (필요한 경우)
con.execute(&quot;INSTALL postgres;&quot;)
con.execute(&quot;LOAD postgres;&quot;)

# (3) PostgreSQL DB를 ATTACH
# 예: 로컬의 PostgreSQL 인스턴스, 기본 스키마 public
con.execute(&quot;&quot;&quot;
ATTACH 'dbname=postgres user=postgres host=127.0.0.1 port=5432 password=mypassword'
  AS pg_db
  (TYPE postgres)
&quot;&quot;&quot;)

# (4) 연결된 PostgreSQL 테이블을 쿼리
# 예: pg_db.public.mytable 라는 테이블이 있다면
res = con.execute(&quot;SELECT * FROM pg_db.company LIMIT 5&quot;).fetchdf()
print(res)

# (5) (선택) PostgreSQL 쪽에 데이터를 쓰기
# con.execute(&quot;&quot;&quot;
#             INSERT INTO pg_db.new_table (col1, col2)
#             VALUES (1, 'abc')
#             &quot;&quot;&quot;)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>pandas &amp;amp; duckdb</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/430</guid>
      <comments>https://wefree.tistory.com/430#entry430comment</comments>
      <pubDate>Fri, 31 Oct 2025 22:20:21 +0900</pubDate>
    </item>
    <item>
      <title>DuckDB 에서 pyspark api 사용하기</title>
      <link>https://wefree.tistory.com/429</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://duckdb.org/docs/stable/clients/python/spark_api&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://duckdb.org/docs/stable/clients/python/spark_api&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1761916643849&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from duckdb.experimental.spark.sql import SparkSession as session
from duckdb.experimental.spark.sql.functions import lit, col
import pandas as pd

spark = session.builder.getOrCreate()

pandas_df = pd.DataFrame({
    'age': [10, 20, 30]
})

df = spark.createDataFrame(pandas_df)

res = df.select(col('age'))
res.toPandas().head()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>pandas &amp;amp; duckdb</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/429</guid>
      <comments>https://wefree.tistory.com/429#entry429comment</comments>
      <pubDate>Fri, 31 Oct 2025 22:18:41 +0900</pubDate>
    </item>
    <item>
      <title>각 파티션에서 TaskContext를 사용해 현재 partitionId가져오기</title>
      <link>https://wefree.tistory.com/428</link>
      <description>&lt;pre id=&quot;code_1752242388274&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.apache.spark.sql.SparkSession

object PartitionIdTest {
	def main(args: Array[String]): Unit = {
		// TaskId는 Spark에서 작업을 실행할 때 각 작업에 대한 고유한 식별자를 제공합니다.
		// 이 식별자는 Spark의 내부 로깅 및 모니터링에 사용됩니다.
		// SparkContext의 getTaskId() 메서드를 사용하여 현재 작업의 TaskId를 가져올 수 있습니다.

		implicit val spark: SparkSession = SparkSession.builder().appName(&quot;TaskIdTest&quot;).master(&quot;local[*]&quot;).getOrCreate()
		import spark.implicits._

		(1 to 10).toDF.repartition(10).foreachPartition { patition =&amp;gt;
			// 각 파티션에서 TaskContext를 사용하여 현재 작업의 TaskId를 가져옵니다.

			val partitionId = org.apache.spark.TaskContext.get().partitionId()
			println(s&quot;Current Partition ID in partition: $partitionId&quot;)
		}

		spark.stop()
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실행 결과&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1752242412961&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Current Partition ID in partition: 4
Current Partition ID in partition: 6
Current Partition ID in partition: 8
Current Partition ID in partition: 9
Current Partition ID in partition: 0
Current Partition ID in partition: 1
Current Partition ID in partition: 3
Current Partition ID in partition: 2
Current Partition ID in partition: 7
Current Partition ID in partition: 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;라이브러리 형태로 만들기&lt;/h2&gt;
&lt;pre id=&quot;code_1752249425440&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.apache.spark.TaskContext
import org.apache.spark.sql.SparkSession

import java.time.format.DateTimeFormatter
import java.time.{LocalDate, LocalDateTime, ZoneId}

object SparkPartition {
	implicit class SparkPartition(spark: SparkSession) {
		def foreachExecutor(size: Int)(f: Int =&amp;gt; Unit): Unit = {
			import spark.implicits._

			(0 until size).toDF.repartition(size).foreachPartition { partition =&amp;gt;
				val id: Int = TaskContext.get().partitionId()

				f(id)
				partition.foreach { _ =&amp;gt; Unit }
			}
		}
	}

	def main(args: Array[String]): Unit = {
		implicit val spark: SparkSession = SparkSession.builder()
			.appName(&quot;SparkPartition&quot;)
			.master(&quot;local[*]&quot;)
			.getOrCreate()

		spark.foreachExecutor(2) { id =&amp;gt;
			println(s&quot;Partition ID: $id&quot;)

			while(true) {
				// Simulate some processing
				val now: String = LocalDateTime.now(ZoneId.of(&quot;Asia/Seoul&quot;)).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
				println(s&quot;$now Processing in partition: $id&quot;)
				Thread.sleep(60000L) // Sleep to simulate work
			}
		}

		spark.stop()
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>spark</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/428</guid>
      <comments>https://wefree.tistory.com/428#entry428comment</comments>
      <pubDate>Fri, 11 Jul 2025 23:00:35 +0900</pubDate>
    </item>
    <item>
      <title>주식 각 종목의 가장 최근 결과 가져오기</title>
      <link>https://wefree.tistory.com/427</link>
      <description>&lt;pre id=&quot;code_1750491450575&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                SELECT DISTINCT ON (i.code) 
                       i.code, i.date, i.last_actual_price, i.final_predicted_price,
                       i.price_change, i.price_change_percent, i.test_r2, i.volatility, 
                       i.prediction_days, i.last_actual_date,
                       i.train_r2, i.test_mse, i.test_rmse, i.test_mae,
                       c.name as company_name, c.rank, i.model_info
                FROM investment i
                JOIN company c ON i.code = c.code
                ORDER BY i.code, i.date DESC&lt;/code&gt;&lt;/pre&gt;</description>
      <category>postgresql</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/427</guid>
      <comments>https://wefree.tistory.com/427#entry427comment</comments>
      <pubDate>Sat, 21 Jun 2025 16:38:13 +0900</pubDate>
    </item>
    <item>
      <title>Dataset 으로 정의된 case class 의 fields 가져오기</title>
      <link>https://wefree.tistory.com/426</link>
      <description>&lt;pre id=&quot;code_1749557177674&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;case class PwlLog(
	log_type: String,
	device_type: String,
	event_type: String
)

val fields: Array[String] = classOf[PwlLog].getDeclaredFields.map(_.getName)

spark.read
     ....
     .withColumn(&quot;log_type&quot;, ...)
     .select(fields.map(col): _*)
     .as[PwlLog]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>spark</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/426</guid>
      <comments>https://wefree.tistory.com/426#entry426comment</comments>
      <pubDate>Tue, 10 Jun 2025 21:06:28 +0900</pubDate>
    </item>
    <item>
      <title>개발 환경 세팅 &amp;amp; Job 제출</title>
      <link>https://wefree.tistory.com/425</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;docker-compose.yml 로 flink cluster 시작&lt;/h2&gt;
&lt;pre id=&quot;code_1746436214194&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '2'
services:
  jobmanager:
    image: flink:1.18.1-scala_2.12-java17
    ports:
      - &quot;8081:8081&quot;
    command: jobmanager
    environment:
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager        
    volumes:
      - /mnt/c:/opt/flink/c

  taskmanager:
    image: flink:1.18.1-scala_2.12-java17
    depends_on:
      - jobmanager
    command: taskmanager
    scale: 1
    environment:
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager
        taskmanager.numberOfTaskSlots: 2
    volumes:
      - /mnt/c:/opt/flink/c&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 flink cluster 시작&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 /mnt/c 위치를 volume mount 해 놓음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1746436239019&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;container 에 접속&lt;/h2&gt;
&lt;pre id=&quot;code_1746436470650&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it flink-jobmanager-1 /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;example job 제출&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/apache/flink/blob/master/flink-examples/flink-examples-streaming/src/main/java/org/apache/flink/streaming/examples/wordcount/WordCount.java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WordCount.java&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1746436617004&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bin/flink run -c com.github.windbird.WordCountExample WordCount.jar --input wc.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Local dashboard 보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8081/&lt;/p&gt;</description>
      <category>flink</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/425</guid>
      <comments>https://wefree.tistory.com/425#entry425comment</comments>
      <pubDate>Mon, 5 May 2025 18:19:33 +0900</pubDate>
    </item>
    <item>
      <title>TypeTag, ClassTag</title>
      <link>https://wefree.tistory.com/424</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TypeTag&lt;/h2&gt;
&lt;pre id=&quot;code_1745326383828&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;scala&quot;&gt;&lt;code&gt;import scala.reflect.runtime.universe._

def printType[T: TypeTag](value: T): Unit = {
  println(s&quot;Type: ${typeOf[T]}&quot;)
}

printType(42)          // 출력: Type: Int
printType(&quot;Hello&quot;)     // 출력: Type: String&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ClassTag&lt;/h2&gt;
&lt;pre id=&quot;code_1745326427300&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import scala.reflect.ClassTag

def createArray[T: ClassTag](size: Int): Array[T] = {
  new Array[T](size)
}

val intArray = createArray[Int](5)  // Int 배열 생성
val strArray = createArray[String](5)  // String 배열 생성&lt;/code&gt;&lt;/pre&gt;</description>
      <category>scala/basic</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/424</guid>
      <comments>https://wefree.tistory.com/424#entry424comment</comments>
      <pubDate>Tue, 22 Apr 2025 21:54:13 +0900</pubDate>
    </item>
    <item>
      <title>Semaphore 를 사용해 최대 maxConcurrent 개의 Future만 실행되도록 제한</title>
      <link>https://wefree.tistory.com/423</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;내가 작성&lt;/h2&gt;
&lt;pre id=&quot;code_1741829294824&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.naver.search.web

import java.util.concurrent.Semaphore
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Await, Future}

object SemaphoreFutureTest {
	def semFuture[T](f: =&amp;gt; T, n: Int): Future[T] = {
		val sem = new Semaphore(n)
		Future {
			try {
				sem.acquire()
				f
			} finally {
				sem.release()
			}
		}
	}

	def f(x: Int): Int = {
		Thread.sleep(1000)
		println(x)
		x * 10
	}


	def main(args: Array[String]): Unit = {
		val futures: Seq[Future[Int]] = (1 to 9).map { x =&amp;gt;
			semFuture(f(x), 2)
		}

		val r: Future[Seq[Int]] = Future.sequence(futures)
		val ints: Seq[Int] = Await.result(r, scala.concurrent.duration.Duration.Inf)
		ints.foreach(println)
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AI 작성 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1741829942348&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import scala.concurrent.{Future, ExecutionContext}
import scala.concurrent.duration._
import java.util.concurrent.Semaphore

implicit val ec: ExecutionContext = ExecutionContext.global

def limitConcurrentFutures[T](futures: List[() =&amp;gt; Future[T]], maxConcurrent: Int): Future[List[T]] = {
  val semaphore = new Semaphore(maxConcurrent)

  val limitedFutures = futures.map { futureFunc =&amp;gt;
      semaphore.acquire()
      try {
        futureFunc()
      } finally {
        semaphore.release()
      }
  }

  Future.sequence(limitedFutures)
}

// 사용 예제
val tasks: List[() =&amp;gt; Future[Int]] = List(
  () =&amp;gt; Future { Thread.sleep(1000); 1 },
  () =&amp;gt; Future { Thread.sleep(1000); 2 },
  () =&amp;gt; Future { Thread.sleep(1000); 3 },
  () =&amp;gt; Future { Thread.sleep(1000); 4 }
)

val result: Future[List[Int]] = limitConcurrentFutures(tasks, 2)
result.onComplete(println)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>scala/basic</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/423</guid>
      <comments>https://wefree.tistory.com/423#entry423comment</comments>
      <pubDate>Thu, 13 Mar 2025 10:28:32 +0900</pubDate>
    </item>
    <item>
      <title>Session Kill</title>
      <link>https://wefree.tistory.com/422</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래 nGQL 로 session 을 확인 / KILL 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741606993506&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show SESSIONS;
kill SESSION &amp;lt;sessionId&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 연결된 session 이 너무 많아 하나씩 KILL 하기 힘들 때는 코드를 작성해 진행할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1741607115352&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import com.vesoft.nebula.client.graph.SessionPool
import com.vesoft.nebula.client.graph.data.ResultSet

import scala.collection.JavaConverters._

object KillAllSessions {
	def main(args: Array[String]): Unit = {
		val sessionPool: SessionPool = ...
		val resultSet: ResultSet = sessionPool.execute(&quot;SHOW SESSIONS;&quot;)

		try {
			val sessionIds: Seq[Long] = for {
				row &amp;lt;- resultSet.getRows.asScala
				id = row.getValues.asScala.head.getIVal
			} yield id

			sessionIds.foreach { id =&amp;gt;
				sessionPool.execute(s&quot;KILL SESSION $id;&quot;)
				println(s&quot;Killed session $id&quot;)
			}
		} finally {
			sessionPool.close()
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>graph database/nebula graph</category>
      <author>wefree</author>
      <guid isPermaLink="true">https://wefree.tistory.com/422</guid>
      <comments>https://wefree.tistory.com/422#entry422comment</comments>
      <pubDate>Mon, 10 Mar 2025 20:45:31 +0900</pubDate>
    </item>
  </channel>
</rss>