2023년 8월 29일 화요일

git rejected error(feat. cherry-pick)

 문제


아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다.


push에선 remote와 다르니 당연히 pull을 진행해라고 하지만


로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성)


해결하려면 다음 방법을 쓰면 된다.



현재 실패한 상황 기준으로

1. git branch temp를 만들어 백업을 만든다.

2. git push origin temp 해서 remote에 백업을 올린다.

3. 다시 작업할 브랜치로 checkout 한다.

4. git fetch --all #remote에 있는 내 최신화된 저장소 정보를 받아온다.

5. git reset --hard origin/{작업브랜치} # origin/{작업브랜치} 의 commit 상황을 hard하게(강제로) 덮어씌운다

#자동 병합이 안된다면 다시 수동 병합 후 저장->add->commit 까지 평소처럼 진행

6. git log --branches --oneline # temp브랜치의 아이디를 확인

7. git cherry-pick [아이디7자리] #명령어를 입력하면 commit을 가져오면서 충돌이 있던 파일도 자동으로 병합해줌

#자동 병합이 안된다면 다시 수동 병합 후 저장->add->commit 까지 평소처럼 진행

8. git log 명령어로제대로 된지 확인

9. 성공적으로 잘 적용 됫다면 git push명령어로 remote에 적용하고 마무리!

2023년 8월 26일 토요일

[Unity] firebase storage에서 폴더째로 삭제하기(feat. google cloud functions)

 firebase unity sdk에서는 저장소의 listall같은 기능(하위경로 확인)이 존재하지 않는다.


그래서 goolge cloude function을 이용하여 구현하여야 한다.


## 공식 문서링크

https://cloud.google.com/functions/docs?hl=ko


요금은 대략

월 200만건 무료이고

100만건당 0.4달러


라고 보면된다 (CPU환경이나 메모리에따라 요금 상이함)


# 하는 방법

기존 firebase와 연결해 놓은 googlecloud 를 이용한다.


대시보드









---



Cloud Functions 클릭

---



함수 만들기 눌러서 
인증되지 않은 호출 허용 체크
리전 선택
ADD 트리거 클릭


---

트리거 Storage 선택

---

각종 설정 알잘딱 하시고


---











노드 코드 
진입점 똑같이 맞춰주시고


package.json 코드도 맞춰주기


---

node.js
```
const functions = require('@google-cloud/functions-framework');
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();

// Register an HTTP callback with the Functions Framework.
functions.http('listFilesInFolder', async (req, res) => {
  const bucketName = req.query.bucket; // 버킷 이름
  const folderPath = req.query.folder; // 폴더 경로

  if (!bucketName || !folderPath) {
    res.status(400).send('Missing bucket or folder parameter');
    return;
  }

  try {
    const options = {
      prefix: folderPath,
    };

    const [files] = await storage.bucket(bucketName).getFiles(options);

    // 'files' is an array of File objects.
    res.send(files.map(file => file.name));
  } catch (err) {
    console.error('ERROR:', err);
    res.status(500).send(err);
  }
});
```

package.json

```
{
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0",
     "@google-cloud/storage": "^7.0.1"
  }
}

```





유니티에서 제가 사용한 코드입니다

대략 이런식으로 사용하시면 됩니다
```
using Firebase.Storage;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;

public class FirebaseStorageAllBucketList : MonoBehaviour
{


    public List<string> stringList;
    public int deleteCnt;

    public string folderPath;

    [System.Serializable]
    public static class JsonHelper
    {
        public static List<T> FromJson<T>(string json)
        {
            string newJson = "{ \"array\": " + json + "}";
            Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
            return wrapper.Items;
        }
        private class Wrapper<T>
        {
            public List<T> Items;
        }
    }


    public void CallGetallBucket(string folderPath)
    {
        StartCoroutine(GetBucketList(folderPath));
    }


    IEnumerator GetBucketList(string folderPath )
    {

        string url = $"(함수 url 입력)?bucket=(사용자 버킷)&folder={folderPath}";

        using (UnityWebRequest www = UnityWebRequest.Get(url))
        {
       

            yield return www.SendWebRequest();

            if (www.result != UnityWebRequest.Result.Success)
            {
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log(www.downloadHandler.text);
                string[] splitArray = www.downloadHandler.text.TrimStart('[').TrimEnd(']').Split(',');

                stringList = new List<string>();
               
                foreach (string item in splitArray)
                {
                    stringList.Add(item.Trim().Trim('\"'));
                }
                deleteCnt = stringList.Count;
            }
        }
    }
}


```


이상입니다!






2023년 4월 23일 일요일

unity side slider(center Start)

 


가운데 부터 시작해서 양쪽을 채우는 슬라이더




using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(Slider))]
public class SliderSwitcher : MonoBehaviour
{
    private Slider _slider;

    void Awake()
    {
        _slider = GetComponent<Slider>();

        _slider.onValueChanged.AddListener(delegate { UpdateSliderSense(); });
    }
private void Start() { UpdateSliderSense(); // init }

    public void UpdateSliderSense()
    {
        if (_slider.value > 0)
        {
            _slider.fillRect.anchorMin = new Vector2(0.5f, 0);
            _slider.fillRect.anchorMax = new Vector2(_slider.handleRect.anchorMin.x, 1);
        }
        else
        {
            _slider.fillRect.anchorMin = new Vector2(_slider.handleRect.anchorMin.x, 0);
            _slider.fillRect.anchorMax = new Vector2(0.5f, 1);
        }
    }
}


2023년 4월 17일 월요일

Unity 에서 만,억,조,경,해 등등 큰숫자 표현

 

코드



using System;
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using System.Text;
using UnityEngine;

public class BigCountTest : MonoBehaviour
{

    public int viewcnt;//원하는 단위까지 표현


    private string[] formatnumberarray = new string[]
    {"","만","억","조","경","해","자","양","가","구","간" };
    private string GetintText(int viewcnt=0)
    {
       

        int placeN = 4;
        BigInteger value = myint;
        List<int> numberList = new List<int>();
        int p = (int)Mathf.Pow(10, placeN);

        do
        {
            numberList.Add((int)(value % p));
            value /= p;
        } while (value>=1);

        string retstr="";


        if (viewcnt != 0)
        {
            viewcnt = Mathf.Max(0, numberList.Count - viewcnt);
        }

        for (int index = viewcnt; index < numberList.Count; index++)
        {
            retstr = numberList[index] + formatnumberarray[index] + retstr;
        }

        return retstr;
    }

    public string txt_display;
    BigInteger myint;


    // Start is called before the first frame update
    void Start()
    {
        myint = 123456548;
        string encodedNumber = GetintText();
        Debug.Log("Encoded number: " + encodedNumber);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Y))
        {
            txt_display = GetintText();
        }
        if (Input.GetKeyDown(KeyCode.U))
        {
            txt_display = GetintText(viewcnt);
        }
        if (Input.GetKeyDown(KeyCode.T))
        {
            myint += myint;
        }
    }
}







2023년 3월 30일 목요일

unity (waitUntil) 최적화 [unity coroutine optimization]

 



waitUntil을 추가했음



## 효과

yield new 로 생기는 가비지콜렉션을 줄일수있다.


참고

https://velog.io/@livelyjuseok/C-Unity-%EC%BD%94%EB%A3%A8%ED%8B%B4-Yield-%EC%B5%9C%EC%A0%81%ED%99%94-%ED%95%98%EA%B8%B0IEqualityComparer



## 사용예

```
yield return YieldCache.WaitForEndOfFrame;
        yield return YieldCache.WaitUntilcustom(() => isLoginSuccess);
        yield return YieldCache.WaitUntilcustom(() => FirebaseDataManager.Instance != null);
        yield return YieldCache.WaitUntilcustom(() => DataPersistenceManager.Instance != null);

        //yield return new WaitForEndOfFrame();
        //yield return new WaitUntil(() => isLoginSuccess);
        //yield return new WaitUntil(() => FirebaseDataManager.Instance !=null);
        //yield return new WaitUntil(() => DataPersistenceManager.Instance != null);

```




## 최적화 코드
```csharp 최적화 코드
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
static class YieldCache
{
    class FloatComparer : IEqualityComparer<float>
    {
        bool IEqualityComparer<float>.Equals(float x, float y)
        {
            return x == y;
        }
        int IEqualityComparer<float>.GetHashCode(float obj)
        {
            return obj.GetHashCode();
        }
    }


    class FloatComparerbool : IEqualityComparer<Func<bool>>
    {
        bool IEqualityComparer<Func<bool>>.Equals(Func<bool> x, Func<bool> y)
        {
            return x == y;
        }
        int IEqualityComparer<Func<bool>>.GetHashCode(Func<bool> obj)
        {
            return obj.GetHashCode();
        }
    }

    public static readonly WaitForEndOfFrame WaitForEndOfFrame = new WaitForEndOfFrame();
    public static readonly WaitForFixedUpdate WaitForFixedUpdate = new WaitForFixedUpdate();

    private static readonly Dictionary<float, WaitForSeconds> _timeInterval = new Dictionary<float, WaitForSeconds>(new FloatComparer());
    private static readonly Dictionary<float, WaitForSecondsRealtime> _timeIntervalReal = new Dictionary<float, WaitForSecondsRealtime>(new FloatComparer());
    private static readonly Dictionary<Func<bool>, WaitUntil> _waitUntill = new Dictionary<Func<bool>, WaitUntil>(new FloatComparerbool());

    public static WaitForSeconds WaitForSeconds(float seconds)
    {
        WaitForSeconds wfs;
        if (!_timeInterval.TryGetValue(seconds, out wfs))
            _timeInterval.Add(seconds, wfs = new WaitForSeconds(seconds));
        return wfs;
    }

    public static WaitForSecondsRealtime WaitForSecondsRealTime(float seconds)
    {
        WaitForSecondsRealtime wfsReal;
        if (!_timeIntervalReal.TryGetValue(seconds, out wfsReal))
            _timeIntervalReal.Add(seconds, wfsReal = new WaitForSecondsRealtime(seconds));
        return wfsReal;
    }

    public static WaitUntil WaitUntilcustom(Func<bool> state)
    {
        WaitUntil wfsReal;
        if (!_waitUntill.TryGetValue(state, out wfsReal))
            _waitUntill.Add(state, wfsReal = new WaitUntil(state));
        return wfsReal;
    }

}







2023년 2월 14일 화요일

2022년 11월 16일 수요일

실수로 git pull 햇을때 로컬 되살리기

 



>[!warning] # 무조건 지켜야 하는 법칙(로컬을 살리기위해,협업을 위해)

> git pull 을 하기전에 

> # **stash** 명령어로 로컬 저장!!

> - 반드시  를 해서 local의 변경사항을 저장하자!!!

> 하지 않는다면 되돌릴수없는 강을 건너게 된다...



git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...