<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>JAMES</title>
        <link>https://velog.io/</link>
        <description>기도하지말고 행동하라</description>
        <lastBuildDate>Mon, 09 Jan 2023 07:29:01 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>JAMES</title>
            <url>https://velog.velcdn.com/images/james-chun-dev/profile/6710fdaf-8f42-4b34-b19d-56efc11a0bdb/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. JAMES. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/james-chun-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Mac] 숨김파일 보기 터미널 명령어]]></title>
            <link>https://velog.io/@james-chun-dev/Mac-%EC%88%A8%EA%B9%80%ED%8C%8C%EC%9D%BC-%EB%B3%B4%EA%B8%B0-%ED%84%B0%EB%AF%B8%EB%84%90-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@james-chun-dev/Mac-%EC%88%A8%EA%B9%80%ED%8C%8C%EC%9D%BC-%EB%B3%B4%EA%B8%B0-%ED%84%B0%EB%AF%B8%EB%84%90-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Mon, 09 Jan 2023 07:29:01 GMT</pubDate>
            <description><![CDATA[<p><code>보기</code></p>
<pre><code>$ defaults write com.apple.finder AppleShowAllFiles -bool true
$ killall Finder</code></pre><p><code>안보기</code></p>
<pre><code>$ defaults write com.apple.finder AppleShowAllFiles -bool false
$ killall Finder</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[time] YYYY-MM-DD date format 사용하기]]></title>
            <link>https://velog.io/@james-chun-dev/time-YYYY-MM-DD-date-format-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@james-chun-dev/time-YYYY-MM-DD-date-format-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 07 Dec 2022 02:53:30 GMT</pubDate>
            <description><![CDATA[<h2 id="datetime-format-layout">Datetime Format Layout</h2>
<pre><code>const (
    Layout      = &quot;01/02 03:04:05PM &#39;06 -0700&quot; // The reference time, in numerical order.
    ANSIC       = &quot;Mon Jan _2 15:04:05 2006&quot;
    UnixDate    = &quot;Mon Jan _2 15:04:05 MST 2006&quot;
    RubyDate    = &quot;Mon Jan 02 15:04:05 -0700 2006&quot;
    RFC822      = &quot;02 Jan 06 15:04 MST&quot;
    RFC822Z     = &quot;02 Jan 06 15:04 -0700&quot; // RFC822 with numeric zone
    RFC850      = &quot;Monday, 02-Jan-06 15:04:05 MST&quot;
    RFC1123     = &quot;Mon, 02 Jan 2006 15:04:05 MST&quot;
    RFC1123Z    = &quot;Mon, 02 Jan 2006 15:04:05 -0700&quot; // RFC1123 with numeric zone
    RFC3339     = &quot;2006-01-02T15:04:05Z07:00&quot;
    RFC3339Nano = &quot;2006-01-02T15:04:05.999999999Z07:00&quot;
    Kitchen     = &quot;3:04PM&quot;
    // Handy time stamps.
    Stamp      = &quot;Jan _2 15:04:05&quot;
    StampMilli = &quot;Jan _2 15:04:05.000&quot;
    StampMicro = &quot;Jan _2 15:04:05.000000&quot;
    StampNano  = &quot;Jan _2 15:04:05.000000000&quot;
)</code></pre><h4 id="yyyy-mm-dd">YYYY-MM-DD</h4>
<pre><code>package main

import (
    &quot;fmt&quot;
    &quot;time&quot;
)

const (
    YYYYMMDD = &quot;2006-01-02&quot;
)

func main() {
    now := time.Now().UTC()
    fmt.Println(now.Format(YYYYMMDD))
}
//output: 2022-03-14</code></pre><h4 id="ddmmyyyy">DD/MM/YYYY</h4>
<pre><code>package main

import (
    &quot;fmt&quot;
    &quot;time&quot;
)

const (
    DDMMYYYY = &quot;02/01/2006&quot;
)

func main() {
    now := time.Now().UTC()
    fmt.Println(now.Format(DDMMYYYY))
}
//output: 14/03/2022</code></pre><h4 id="yyyy-mm-dd-hhmmss">YYYY-MM-DD hh:mm:ss</h4>
<pre><code>package main

import (
    &quot;fmt&quot;
    &quot;time&quot;
)

const (
    DDMMYYYYhhmmss = &quot;2006-01-02 15:04:05&quot;
)

func main() {
    now := time.Now().UTC()
    fmt.Println(now.Format(DDMMYYYYhhmmss))
}
//output: 2022-03-14 05:41:33</code></pre><blockquote>
<p>출처: <a href="https://gosamples.dev/date-format-yyyy-mm-dd/">https://gosamples.dev/date-format-yyyy-mm-dd/</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[go] aes256 cbc 암호화 복호화]]></title>
            <link>https://velog.io/@james-chun-dev/go-aes256-cbc-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94</link>
            <guid>https://velog.io/@james-chun-dev/go-aes256-cbc-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94</guid>
            <pubDate>Wed, 16 Nov 2022 06:15:04 GMT</pubDate>
            <description><![CDATA[<h3 id="pkcs5padding">PKCS5Padding</h3>
<p>base64:</p>
<pre><code class="language-go">import (
    &quot;bytes&quot;
    &quot;crypto/aes&quot;
    &quot;crypto/cipher&quot;
    &quot;encoding/base64&quot;
    &quot;fmt&quot;
)

func AESEncrypt(src string, key []byte, iv string) string {
    block, err := aes.NewCipher(key)
    if err != nil {
        fmt.Println(&quot;key error1&quot;, err)
    }
    if src == &quot;&quot; {
        fmt.Println(&quot;plain content empty&quot;)
    }
    ecb := cipher.NewCBCEncrypter(block, []byte(iv))
    content := []byte(src)
    content = PKCS5Padding(content, block.BlockSize())
    crypted := make([]byte, len(content))
    ecb.CryptBlocks(crypted, content)

    return base64.StdEncoding.EncodeToString(crypted)
}

func AESDecrypt(cryptedStr string, key []byte, iv string) []byte {
    encryptedData, _ := base64.StdEncoding.DecodeString(cryptedStr)
    block, err := aes.NewCipher(key)
    if err != nil {
        fmt.Println(&quot;key error1&quot;, err)
    }
    if len(encryptedData) == 0 {
        fmt.Println(&quot;plain content empty&quot;)
    }
    ecb := cipher.NewCBCDecrypter(block, []byte(iv))
    decrypted := make([]byte, len(encryptedData))
    ecb.CryptBlocks(decrypted, encryptedData)

    return PKCS5Trimming(decrypted)
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

func PKCS5Trimming(encrypt []byte) []byte {
    padding := encrypt[len(encrypt)-1]
    return encrypt[:len(encrypt)-int(padding)]
}</code></pre>
<p>hex:</p>
<pre><code class="language-go">func Ase256Encode(plaintext string, key string, iv string, blockSize int) string {
    bKey := []byte(key)
    bIV := []byte(iv)
    bPlaintext := PKCS5Padding([]byte(plaintext), blockSize, len(plaintext))
    block, err := aes.NewCipher(bKey)
    if err != nil {
        panic(err)
    }
    ciphertext := make([]byte, len(bPlaintext))
    mode := cipher.NewCBCEncrypter(block, bIV)
    mode.CryptBlocks(ciphertext, bPlaintext)
    return hex.EncodeToString(ciphertext)
}

func Ase256Decode(cipherText string, encKey string, iv string) (decryptedString string) {
    bKey := []byte(encKey)
    bIV := []byte(iv)
    cipherTextDecoded, err := hex.DecodeString(cipherText)
    if err != nil {
        panic(err)
    }

    block, err := aes.NewCipher(bKey)
    if err != nil {
        panic(err)
    }

    mode := cipher.NewCBCDecrypter(block, bIV)
    mode.CryptBlocks([]byte(cipherTextDecoded), []byte(cipherTextDecoded))
    return string(cipherTextDecoded)
}

func PKCS5Padding(ciphertext []byte, blockSize int, after int) []byte {
    padding := (blockSize - len(ciphertext)%blockSize)
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[kotlin] 안드로이드 aes256 암호화 복호화]]></title>
            <link>https://velog.io/@james-chun-dev/kotlin-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-aes256-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94</link>
            <guid>https://velog.io/@james-chun-dev/kotlin-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-aes256-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94</guid>
            <pubDate>Wed, 16 Nov 2022 05:37:33 GMT</pubDate>
            <description><![CDATA[<h3 id="cbc-사용">cbc 사용</h3>
<p>PKCS5Padding:</p>
<pre><code class="language-kotlin">fun encryptCBC(strToEncrypt: String, key: String, iv: String): String {

    try {

        val ivParameterSpec = IvParameterSpec(iv.toByteArray())
        val secretKey = SecretKeySpec(key.toByteArray(), &quot;AES&quot;)

        val cipher = Cipher.getInstance(&quot;AES/CBC/PKCS5Padding&quot;)
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec)

        val crypted = cipher.doFinal(strToEncrypt.toByteArray())
        val encodedByte = Base64.encode(crypted, Base64.DEFAULT)

        return String(encodedByte)

    } catch (e: Exception) {
        Log.e(&quot;Exception&quot;, &quot;Exception : ${e.message}&quot;)
    }
    return &quot;&quot;
}

fun decryptCBC(strToDecrypt: String, key: String, iv: String): String {

    val ivParameterSpec = IvParameterSpec(iv.toByteArray())
    val secretKey = SecretKeySpec(key.toByteArray(), &quot;AES&quot;)

    val cipher = Cipher.getInstance(&quot;AES/CBC/PKCS5Padding&quot;)
    cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec)

    val decodedByte = Base64.decode(strToDecrypt, Base64.DEFAULT)
    val byteResult = cipher.doFinal(decodedByte)

    return String(byteResult)
}</code></pre>
<p>PKCS7Padding:</p>
<pre><code class="language-kotlin">object AESEncyption {

    const val secretKey = &quot;tK5UTui+DPh8lIlBxya5XVsmeDCoUl6vHhdIESMB6sQ=&quot;
    const val salt = &quot;QWlGNHNhMTJTQWZ2bGhpV3U=&quot; // base64 decode =&gt; AiF4sa12SAfvlhiWu
    const val iv = &quot;bVQzNFNhRkQ1Njc4UUFaWA==&quot; // base64 decode =&gt; mT34SaFD5678QAZX

    fun encrypt(strToEncrypt: String) : String?
    {
        try
        {
            val ivParameterSpec = IvParameterSpec(Base64.decode(iv, Base64.DEFAULT))

            val factory = SecretKeyFactory.getInstance(&quot;PBKDF2WithHmacSHA1&quot;)
            val spec =  PBEKeySpec(secretKey.toCharArray(), Base64.decode(salt, Base64.DEFAULT), 10000, 256)
            val tmp = factory.generateSecret(spec)
            val secretKey =  SecretKeySpec(tmp.encoded, &quot;AES&quot;)

            val cipher = Cipher.getInstance(&quot;AES/CBC/PKCS7Padding&quot;)
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec)
            return Base64.encodeToString(cipher.doFinal(strToEncrypt.toByteArray(Charsets.UTF_8)), Base64.DEFAULT)
        }
        catch (e: Exception)
        {
            println(&quot;Error while encrypting: $e&quot;)
        }
        return null
    }

    fun decrypt(strToDecrypt : String) : String? {
        try
        {
            val ivParameterSpec =  IvParameterSpec(Base64.decode(iv, Base64.DEFAULT))

            val factory = SecretKeyFactory.getInstance(&quot;PBKDF2WithHmacSHA1&quot;)
            val spec =  PBEKeySpec(secretKey.toCharArray(), Base64.decode(salt, Base64.DEFAULT), 10000, 256)
            val tmp = factory.generateSecret(spec);
            val secretKey =  SecretKeySpec(tmp.encoded, &quot;AES&quot;)

            val cipher = Cipher.getInstance(&quot;AES/CBC/PKCS7Padding&quot;);
            cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
            return  String(cipher.doFinal(Base64.decode(strToDecrypt, Base64.DEFAULT)))
        }
        catch (e : Exception) {
            println(&quot;Error while decrypting: $e&quot;);
        }
        return null
    }
}</code></pre>
<h3 id="gcm-사용">gcm 사용</h3>
<pre><code class="language-kotlin">fun encrypt(password: String): String {
    val secretKeySpec = SecretKeySpec(password.toByteArray(), &quot;AES&quot;)
    val iv = ByteArray(16)
    val charArray = password.toCharArray()
    for (i in 0 until charArray.size){
        iv[i] = charArray[i].toByte()
    }
    val ivParameterSpec = IvParameterSpec(iv)

    val cipher = Cipher.getInstance(&quot;AES/GCM/NoPadding&quot;)
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec)

    val encryptedValue = cipher.doFinal(this.toByteArray())
    return Base64.encodeToString(encryptedValue, Base64.DEFAULT)
}

fun decrypt(password: String): String {
    val secretKeySpec = SecretKeySpec(password.toByteArray(), &quot;AES&quot;)
    val iv = ByteArray(16)
    val charArray = password.toCharArray()
    for (i in 0 until charArray.size){
        iv[i] = charArray[i].toByte()
    }
    val ivParameterSpec = IvParameterSpec(iv)

    val cipher = Cipher.getInstance(&quot;AES/GCM/NoPadding&quot;)
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec)

    val decryptedByteValue = cipher.doFinal(Base64.decode(this, Base64.DEFAULT))
    return String(decryptedByteValue)
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[mysql/mariadb] docker 설치, 서비스 시작]]></title>
            <link>https://velog.io/@james-chun-dev/docker-mysql-5.6-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@james-chun-dev/docker-mysql-5.6-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Wed, 31 Aug 2022 08:06:53 GMT</pubDate>
            <description><![CDATA[<h2 id="설치-및-서비스-시작">설치 및 서비스 시작</h2>
<blockquote>
<p>Intel Mac
DB Port 3307 설정시</p>
</blockquote>
<p>mysql 5.6 docker image 로 내려받기</p>
<pre><code>$ docker pull mysql:5.6</code></pre><p>mysql 서비스 시작</p>
<pre><code>$ docker run -p 3307:3306 --name [컨테이너명] -e MYSQL_ROOT_PASSWORD=[비밀번호] -d mysql:5.6</code></pre><p>mariadb 10.5 서비스 시작</p>
<pre><code>$ docker run -p 3307:3306 --name [컨테이너명] -e MYSQL_ROOT_PASSWORD=[비밀번호] -d mariadb:10.5</code></pre><blockquote>
<p>M1 Mac</p>
</blockquote>
<p>mysql 5.7 docker image 로 내려받기</p>
<pre><code>$ docker pull --platform linux/amd64 mysql:5.7</code></pre><p>mysql 서비스 시작</p>
<pre><code>$ docker run --platform linux/amd64 -p 3306:3306 --name [컨테이너명] -e MYSQL_ROOT_PASSWORD=[비밀번호] -d mysql:5.7</code></pre><h2 id="mysql-접속-및-설정">mysql 접속 및 설정</h2>
<p>docker 컨테이너 터미널 접속(Desktop 으로도 터미널접속 가능)</p>
<pre><code>$ docker exec -it [컨테이너명] /bin/bash</code></pre><p>mysql 접속</p>
<pre><code>$ mysql -u root -p
$ [비밀번호] //위에서 설정한 비밀번호</code></pre><p>mysql 비밀번호 변경</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[mysql] v5.7 설치 및 초기 설정]]></title>
            <link>https://velog.io/@james-chun-dev/mysql-v5.7-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@james-chun-dev/mysql-v5.7-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Tue, 30 Aug 2022 09:35:04 GMT</pubDate>
            <description><![CDATA[<p>brew 명령어로 설치:</p>
<pre><code>$ brew install mysql@5.7</code></pre><p>서비스 시작:</p>
<pre><code>$ brew services start mysql@5.7</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Xcode] xcodegen 설치 및 사용법]]></title>
            <link>https://velog.io/@james-chun-dev/Xcode-xcodegen-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@james-chun-dev/Xcode-xcodegen-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Fri, 08 Jul 2022 03:03:35 GMT</pubDate>
            <description><![CDATA[<p>brew 로 설치:</p>
<pre><code>brew install xcodegen</code></pre><p>project.yml 파일 편집:</p>
<pre><code>name: ProjectName
targets:
  ProjectName:
    type: application
    platform: iOS
    deploymentTarget: &quot;15.0&quot;
    sources: [ProjectName]
    settings:
      base:
        INFOPLIST_FILE: ProjectName/Info.plist
        PRODUCT_BUNDLE_IDENTIFIER: com.example.ProjectName
</code></pre><p>터미널 명령어 실행:</p>
<pre><code>xcodegen generate</code></pre><blockquote>
<p>출처:
<a href="https://github.com/yonaskolb/XcodeGen">https://github.com/yonaskolb/XcodeGen</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[java/kotlin] 구글 인앱결제시 priceAmountMicros 에서 Float 으로 변환]]></title>
            <link>https://velog.io/@james-chun-dev/javakotlin-%EA%B5%AC%EA%B8%80-%EC%9D%B8%EC%95%B1%EA%B2%B0%EC%A0%9C%EC%8B%9C-priceAmountMicros-%EC%97%90%EC%84%9C-Float-%EC%9C%BC%EB%A1%9C-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@james-chun-dev/javakotlin-%EA%B5%AC%EA%B8%80-%EC%9D%B8%EC%95%B1%EA%B2%B0%EC%A0%9C%EC%8B%9C-priceAmountMicros-%EC%97%90%EC%84%9C-Float-%EC%9C%BC%EB%A1%9C-%EB%B3%80%ED%99%98</guid>
            <pubDate>Thu, 09 Jun 2022 07:18:19 GMT</pubDate>
            <description><![CDATA[<p>SkuDetails.priceAmountMicros 의 대한 설명:
<img src="https://velog.velcdn.com/images/james-chun-dev/post/6545b809-bf0f-4583-89e7-d99e6aaf237a/image.png" alt="priceAmountMicros"></p>
<p>priceAmountMicros to float 으로 변환후 소수점 3번째짜리에서 반올림</p>
<p>java:</p>
<pre><code>public float getPrice(SkuDetails item) {
    double price = item.getPriceAmountMicros() / 1000000.0;
    return (float) (Math.round(price*1e2)/1e2);
}</code></pre><p>kotlin:</p>
<pre><code>fun getPrice(item: SkuDetails) : Float {
    val price = item.priceAmountMicros / 1000000.0
    return (round(price*100)/100).toFloat()
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[iconv-go] byte to string 변환시 한글깨짐 해결]]></title>
            <link>https://velog.io/@james-chun-dev/iconv-go-byte-to-string-%EB%B3%80%ED%99%98%EC%8B%9C-%ED%95%9C%EA%B8%80%EA%B9%A8%EC%A7%90-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@james-chun-dev/iconv-go-byte-to-string-%EB%B3%80%ED%99%98%EC%8B%9C-%ED%95%9C%EA%B8%80%EA%B9%A8%EC%A7%90-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Thu, 09 Jun 2022 05:49:31 GMT</pubDate>
            <description><![CDATA[<p>간혹 byte를 string 으로 출력시 한글깨짐 현상을 겪을 수 있다.
이때 가장 합리적인 해결 방안
example:</p>
<pre><code>result, _ := iconv.ConvertString(string(output), &quot;euc-kr&quot;, &quot;utf-8&quot;)</code></pre><blockquote>
<p><a href="https://github.com/djimenez/iconv-go">https://github.com/djimenez/iconv-go</a></p>
</blockquote>
<p>윈도우 사용자:
윈도우는 gcc 활성화를 위해서 <a href="https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-win32/seh/">MinGW</a>를 설치해야 한다.(키보드 관련 go 라이브러리도 마찬가지)
<img src="https://velog.velcdn.com/images/james-chun-dev/post/8a4d7e17-d24a-462b-8a8e-12ca2c704f55/image.png" alt="res">
인스톨 파일이 작동되지 않는다면 압축파일 받아서 ProgramFiles 에 압축해제해서 떨궈놓고 환경변수(mingw64/bin)만 셋팅하면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[cli] redis 커맨드 명령어]]></title>
            <link>https://velog.io/@james-chun-dev/cli-redis-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@james-chun-dev/cli-redis-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Tue, 24 May 2022 02:22:05 GMT</pubDate>
            <description><![CDATA[<h2 id="cli-명령어">cli 명령어</h2>
<pre><code>$ redis-cli</code></pre><h2 id="set-get-del">set get del</h2>
<pre><code>[127.0.0.1:6379&gt; set key value
[127.0.0.1:6379&gt; get key
[127.0.0.1:6379&gt; del key</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[brew] redis 설치 및 실행]]></title>
            <link>https://velog.io/@james-chun-dev/brew-redis-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%8B%A4%ED%96%89</link>
            <guid>https://velog.io/@james-chun-dev/brew-redis-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%8B%A4%ED%96%89</guid>
            <pubDate>Mon, 23 May 2022 09:42:56 GMT</pubDate>
            <description><![CDATA[<h2 id="brew-로-설치">brew 로 설치</h2>
<pre><code>$ brew install redis</code></pre><h2 id="설치-확인">설치 확인</h2>
<pre><code>$ brew list</code></pre><h2 id="foreground-실행-및-중지">foreground 실행 및 중지</h2>
<pre><code>$ redis-server</code></pre><h2 id="background-실행-및-중지">background 실행 및 중지</h2>
<pre><code>$ brew services start redis
$ brew services info redis
$ brew services stop redis</code></pre><h2 id="서비스-확인">서비스 확인</h2>
<pre><code>$ brew services list</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] int to enum 변환]]></title>
            <link>https://velog.io/@james-chun-dev/swift-int-to-enum-string-to-enum-enum-to-int-enum-to-string-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@james-chun-dev/swift-int-to-enum-string-to-enum-enum-to-int-enum-to-string-%EB%B3%80%ED%99%98</guid>
            <pubDate>Tue, 26 Apr 2022 08:57:29 GMT</pubDate>
            <description><![CDATA[<p>int to enum:</p>
<pre><code>public enum LanguageCode : Int{
    case ko
    case en
    case ja
    case zhcn
    case zhtw
    case th
    case vi
    case es
    case pt
    case fr
    case de
    case ru

    var description: String {
        return String(describing: self)
    }
}

print(languageCode.rawValue) //0
print(languageCode.description) //ko</code></pre><p>string to enum:</p>
<pre><code>public enum LoginType: String {
    case google=&quot;GOOGLE&quot;
    case facebook=&quot;FACEBOOK&quot;
    case apple=&quot;APPLE&quot;
    case guest=&quot;GUEST&quot;
}

print(LoginType.google.rawValue) //GOOGLE</code></pre><blockquote>
<p>출처
<a href="https://stackoverflow.com/questions/28461133/swift-enum-both-a-string-and-an-int">https://stackoverflow.com/questions/28461133/swift-enum-both-a-string-and-an-int</a>
<a href="https://stackoverflow.com/questions/24701075/swift-convert-enum-value-to-string">https://stackoverflow.com/questions/24701075/swift-convert-enum-value-to-string</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] CodingKeys 사용법]]></title>
            <link>https://velog.io/@james-chun-dev/swift-CodingKeys-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@james-chun-dev/swift-CodingKeys-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Tue, 12 Apr 2022 08:03:43 GMT</pubDate>
            <description><![CDATA[<p>swift:</p>
<pre><code>struct Login: Codable {
    let code: UInt
    let msg: String
    let data: LoginInfo
    enum CodingKeys: String, CodingKey {
        case code = &quot;code&quot;
        case msg = &quot;msg&quot;
        case data = &quot;data&quot;
    }
}

struct LoginInfo: Codable {
    let userID: String
    let username: String
    enum CodingKeys: String, CodingKey {
        case userID = &quot;userID&quot;
        case username = &quot;username&quot;
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[objc/swift] unix 와 같은 13자리 timestamp 얻기]]></title>
            <link>https://velog.io/@james-chun-dev/objcswift-unix-%EC%99%80-%EA%B0%99%EC%9D%80-13%EC%9E%90%EB%A6%AC-timestamp-%EC%96%BB%EA%B8%B0</link>
            <guid>https://velog.io/@james-chun-dev/objcswift-unix-%EC%99%80-%EA%B0%99%EC%9D%80-13%EC%9E%90%EB%A6%AC-timestamp-%EC%96%BB%EA%B8%B0</guid>
            <pubDate>Mon, 11 Apr 2022 07:38:04 GMT</pubDate>
            <description><![CDATA[<p>objc:</p>
<pre><code>long long milliseconds = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);</code></pre><p>swift:</p>
<pre><code>// ex1)
let currentDate = NSNumber(value:Int64(Date().timeIntervalSince1970 * 1000))

// ex2)
extension Date {

    func toMillis() -&gt; NSNumber {
        return NSNumber(value:Int64(timeIntervalSince1970 * 1000))
    }

    var timestamp: Int64 {
        Int64(timeIntervalSince1970 * 1000)
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[m1] Homebrew 설치 및 환경변수 설정]]></title>
            <link>https://velog.io/@james-chun-dev/mac-brew-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@james-chun-dev/mac-brew-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sun, 27 Mar 2022 15:23:19 GMT</pubDate>
            <description><![CDATA[<h2 id="brew-설치">brew 설치</h2>
<p><a href="https://brew.sh/index_ko">공식사이트</a> 를 통해 설치합니다.(m1 이든 intel 이든 설치명령어는 같습니다.)</p>
<pre><code>/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre><h2 id="환경변수">환경변수</h2>
<p>m1 은 설치된 바이너리 디렉토리가 달라서 환경변수 설정을 해줘야 합니다. (intel은 자동설정됨)</p>
<pre><code>export HOME_BREW=&quot;/opt/homebrew/bin&quot;
export PATH=$PATH:$HOME_BREW</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[mod] go 환경변수 설정 및 mod 사용법]]></title>
            <link>https://velog.io/@james-chun-dev/mod-go-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-%EB%B0%8F-mod-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@james-chun-dev/mod-go-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-%EB%B0%8F-mod-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Sun, 27 Mar 2022 15:05:08 GMT</pubDate>
            <description><![CDATA[<h2 id="golang-설치">golang 설치</h2>
<p><a href="https://golang.org/doc/install">공식사이트</a> 를 통해 설치합니다.</p>
<h2 id="환경변수">환경변수</h2>
<p>윈도우든 맥이든 환경변수를 설정해야 합니다.</p>
<ul>
<li>GOROOT : /usr/local/go (설치시 자동 설정됨)</li>
<li>GOPATH : workspace 에 해당하므로 임의로 정하면 됩니다.</li>
<li>GOBIN : $GOPATH/bin</li>
</ul>
<p>특히 GOROOT, GOPATH 가 제대로 설정되있어야 mod 명령어가 잘 작동됩니다.</p>
<p>환경변수 설정은 각자 알아서 본인취향대로 하면 됩니다.</p>
<h2 id="mod-사용법">mod 사용법</h2>
<ul>
<li><p>go mod init</p>
<p>기본적으로 mod 파일을 생성해주고 vendor 폴더가 존재한다면 vendor.json 파일을 읽고 mod 파일을 생성하여 내부 프로젝트에서 사용되고 있는 의존성 소스에 대해 내려받고 관리해준다.  </p>
</li>
<li><p>go mod vendor</p>
<p>vendor 디렉토리를 생성해줍니다</p>
</li>
<li><p>go mod tidy</p>
<p>프로젝트 내부 의존성을 토대로 mod 파일 업데이트</p>
</li>
</ul>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://velog.io/@kimmachinegun/Go-Go-Modules-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-7cjn4soifk#go111module">Go Modules 살펴보기</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MariaDB/mysql] root 초기 비번 설정]]></title>
            <link>https://velog.io/@james-chun-dev/MariaDB-root-%EC%B4%88%EA%B8%B0-%EB%B9%84%EB%B2%88-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@james-chun-dev/MariaDB-root-%EC%B4%88%EA%B8%B0-%EB%B9%84%EB%B2%88-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Fri, 25 Mar 2022 06:52:38 GMT</pubDate>
            <description><![CDATA[<h2 id="mariadb-접속">mariadb 접속</h2>
<pre><code>$ mysql</code></pre><h2 id="mysql-db-접근">mysql db 접근</h2>
<pre><code>[MariaDB [(none)]&gt; use mysql</code></pre><h2 id="root-비번-설정">root 비번 설정</h2>
<pre><code>// mysql 5.6 이하
[mysql]&gt; set password for &#39;root&#39;@&#39;localhost&#39; = PASSWORD(&#39;1234&#39;);
// mysql 5.7 이상
[mysql]&gt; set authentication_string=password(&#39;new password&#39;) where user = &#39;root&#39;;
// mysql 8.x 이상
[mysql]&gt; alter user &#39;root&#39;@&#39;localhost&#39; identified with mysql_native_password by &#39;new password&#39;;

// mariadb 10.4 이상
[MariaDB [mysql]&gt; set password=password(&#39;1234&#39;);
[MariaDB [mysql]&gt; flush privileges;</code></pre><h2 id="root-로그인">root 로그인</h2>
<pre><code>mysql -uroot -p1234</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[MariaDB] port 변경]]></title>
            <link>https://velog.io/@james-chun-dev/MariaDB-port-%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@james-chun-dev/MariaDB-port-%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Tue, 22 Mar 2022 06:19:21 GMT</pubDate>
            <description><![CDATA[<h2 id="설정파일-편집">설정파일 편집</h2>
<pre><code>$ vi /usr/local/etc/my.cnf</code></pre><p><img src="https://images.velog.io/images/james-chun-dev/post/ef3e96dc-d88a-4d9d-8c63-309e51ce1a3f/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202022-03-22%20%EC%98%A4%ED%9B%84%203.09.26.png" alt="port-add"></p>
<h2 id="저장후-서비스-재시작">저장후 서비스 재시작</h2>
<pre><code>$ brew services restart mariadb</code></pre><h2 id="서비스-확인">서비스 확인</h2>
<pre><code>$ brew services list</code></pre><h2 id="port-변경확인">port 변경확인</h2>
<pre><code>$ sudo lsof -i :8000</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Xcode] Carthage 사용법]]></title>
            <link>https://velog.io/@james-chun-dev/Xcode-Carthage-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@james-chun-dev/Xcode-Carthage-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Mon, 21 Mar 2022 08:07:00 GMT</pubDate>
            <description><![CDATA[<h2 id="설치">설치</h2>
<p>home brew 를 이용해 설치합니다.</p>
<pre><code>$ brew update
$ brew install carthage</code></pre><h2 id="cartfile-생성">Cartfile 생성</h2>
<p>.xcodeproj 또는 .xcworkspace가 있는 동일한 디렉토리에 Cartfile을 만듭니다.</p>
<pre><code>$ touch Cartfile</code></pre><h2 id="cartfile-편집">Cartfile 편집</h2>
<p>Cartfile에 원하는 종속성을 나열합니다. 예를 들면 다음과 같습니다.</p>
<pre><code>github &quot;Alamofire/Alamofire&quot; ~&gt; 5.5</code></pre><h2 id="실행">실행</h2>
<pre><code>$ carthage update --use-xcframeworks</code></pre><h2 id="빌드된-framework-적용">빌드된 Framework 적용</h2>
<p>Carthage/Build에서 빌드된 .xcframework 번들을 애플리케이션 Xcode 프로젝트의 &quot;Frameworks and Libraries&quot; 섹션으로 드래그합니다.</p>
<blockquote>
<p>Application에 Carthage를 사용하는 경우 &quot;Embed &amp; Sign&quot;을 선택하고, 그렇지 않으면 &quot;Do Not Embed&quot;를 선택하십시오.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[os/exec] 커맨드 명령어 실행하기 in go]]></title>
            <link>https://velog.io/@james-chun-dev/shell-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-in-go</link>
            <guid>https://velog.io/@james-chun-dev/shell-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-in-go</guid>
            <pubDate>Wed, 09 Feb 2022 07:14:22 GMT</pubDate>
            <description><![CDATA[<pre><code>package main

import (
    &quot;fmt&quot;
    &quot;os&quot;
    &quot;os/exec&quot;
    &quot;strings&quot;
)

func main() {

    // 1. Create an *exec.Cmd
    // cmd := exec.Command(&quot;go&quot;, &quot;version&quot;)

    // // Stdout buffer
    // cmdOutput := &amp;bytes.Buffer{}
    // // Attach buffer to command
    // cmd.Stdout = cmdOutput

    // // Execute command
    // printCommand(cmd)
    // err := cmd.Run() // will wait for command to return
    // printError(err)
    // // Only output the commands stdout
    // printOutput(cmdOutput.Bytes())

    // 2. Create an *exec.Cmd
    cmd := exec.Command(&quot;go&quot;, &quot;version&quot;)

    // Combine stdout and stderr
    printCommand(cmd)
    output, err := cmd.CombinedOutput()
    printError(err)
    printOutput(output)
}

func printCommand(cmd *exec.Cmd) {
    fmt.Printf(&quot;==&gt; Executing: %s\n&quot;, strings.Join(cmd.Args, &quot; &quot;))
}

func printError(err error) {
    if err != nil {
        os.Stderr.WriteString(fmt.Sprintf(&quot;==&gt; Error: %s\n&quot;, err.Error()))
    }
}

func printOutput(outs []byte) {
    if len(outs) &gt; 0 {
        fmt.Printf(&quot;==&gt; Output: %s\n&quot;, string(outs))
    }
}</code></pre><blockquote>
<p>출처: <a href="https://www.darrencoxall.com/golang/executing-commands-in-go">https://www.darrencoxall.com/golang/executing-commands-in-go</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>