전체 글 (204)

  • 2023.12.06
  • 2023.12.06
  • 2023.12.05
  • 2023.12.01
  • 2023.11.30
  • 2023.11.29
  • 2023.11.25
  • 2023.09.16
  • 2023.09.14
  • 2023.09.13
  • 2023.08.07
  • 2023.03.24
  • 12
    06

    개발일지 목록 : 클릭

     

    학습 내용에 대해

    3주차는 리소스 스프라이트가 주어지고, 별도의 Start Scene을 구성하기 등을 배웠다. 4주차는 gameManager 스크립트가 게임의 대부분을 구성하는 같은 그림 찾기 보드게임을 만들었다. 게임 로직에 특히 신경 쓸 부분이 많았다. 5주차는 4주차에 만들었던 보드게임에 효과음과 배경음 넣기, 빌드세팅, '게임 재시작' 단계에 광고 넣기 등 까다로운 부분을 다뤘다.

    전체적으로 익숙해지는 느낌이라 학습 정리는 크게 하지 않았고, 5주차에 실습한 내용들이 유니티의 매 프로젝트마다 까다롭다고 생각되는 부분이다. 강의자료의 '광고 넣기' 파트는 예전의 자료였기 때문에 많이 달라져 작동하지 않아 최신 문서를 찾아가며 적용하였다. 현재 Unity Ads를 넣는 방법과 예제 코드는 아래 노션 페이지에 정리 해 두었다. 또한 빌드 시 해상도가 맞지 않을 시 화면을 빠져나가는 자잘한 버그도 스크립트 수정을 통해 해결하였다.

    Unity Ads 사용 가이드(2023.12.05)

    유니티 화면 밖으로 내용이 삐져나가는 경우를 방지한 해상도 비율 고정 스크립트 작성

     

    사전캠프 과정을 미리 마치며

    유니티를 처음 시작하는 사람도 많이 참여하는 캠프이기 때문에, 전체적으로 분량과 난이도가 크게 어렵지 않았고 복습 및 익숙해진다는 느낌으로 빠르게 종료하였다.

    남은 사전캠프 기간은 지금까지 모아둔 레퍼런스를 구현하며 공부 해 나가려고 한다.

     

    이하 현재 메모한 레퍼런스들

    1. (단기, 약 24시간~30시간 정도 예상) 아마데우스 프로젝트

    https://www.youtube.com/watch?v=XPXXpIx0LCE

    짧은 영상 안에 요즘 트렌드들을 신랄하게 압축 해 놓은 프로젝트이다. 매우 유익한 로드맵을 작성해 준 영상 제작자에게 감사하며, 이 과정을 그대로 진행 해 보기로 생각했다. 슈타인즈 게이트 전 시나리오를 아마 다섯 번 이상 정주행했고(생각나면 찾아봄) 특히 아마데우스 파트는 다른 에피소드와 비교해 윤리 문제를 비롯한 수많은 감정선이 얽혀 있어 미묘한 기분을 느낄 수 있었기 때문에 이 프로젝트에 더욱 관심이 갔다. 해당 영상의 댓글란에 타임스탬프와 함께 기술적인 요소를 함께 적어놓았기 때문에 매번 참고할 수 있다.

    시작하기 전에, 기술적인 부분은 2분정도로 짧게 다루어지지만, 이 중 한개의 스킬에서 이미 큰 시행착오를 겪은 경험이 있기 때문에 모든 과정을 구현하는 데에는 아마 시간이 오래 걸릴 것으로 생각된다. 

    영상 작성자가 보여준 완성작은 소설 내 아마데우스와 본질적으로 크게 다르지 않을까 생각된다. 소설의 아마데우스는 인간의 기억으로부터 학습된 언어모델이고, 영상 제작자의 아마데우스는 게임 등장인물의 모든 음성파일 대본 즉 일부 생활패턴을 학습시킨 언어모델이다. 음성인식 기능 그리고 현재 OpenAI에서는 지원하지 않는 GPT로부터의 대화 시작 등 몇 가지 요소가 더 마련되면 더 소설 속의 아마데우스와 가까워질 것이다.

    2. (중장기 프로젝트)Unity를 사용한, 미디 파일로부터 바운스 볼 자동 생성 시뮬레이터

    https://www.youtube.com/watch?v=fagldH23oj0

    미디파일만으로 위와 같은 영상의 벽돌을 직접 배치해주는 시뮬레이터를 구상중이다.

    현재까지의 진척

    • 매번 실행을 할 때마다 유니티 물리엔진이 큰 오차를 내지 않는다는 것을 확인했다. 그렇기 때문에 한번 배치가 완료된다면 미디 파일이나 타임스케일, 공의 시작지점 등을 바꾸지 않는 이상 계속 활용이 가능하다.
    • 개발 환경의 플레이 도중 상태에서 생성된 오브젝트는, 프리펩으로 저장하면 게임을 정지해도 남겨둘 수 있다는 것을 알았다. 알고리즘을 통해 배치한 벽돌은 프리펩으로 저장하여 남길 것이다.
    • 미디파일을 필요한대로 다루는 방법을 아직 찾지 못했다. 앞으로의 진척 과제이다.
    • 기본적인 틀이 잡히면, 디자인적 요소를 더 신경쓰며 보완 해 나가야 할 것이다.
    • 이상의 내용은 하나의 탬플릿으로 사용하여, 다양한 미디와 그에 맞는 스타일링을 거친 후 각각 영상 미디어로 가공 할 예정이다. 완료한다면 유튜브에 업로드 하지 않을까

    3. GPT 둘의 상호 대화 구현

    지금 환경에서도 사람이 직접 GPT 모델 두개를 놓고 수동으로 입력을 시켜주어 양방향 대화를 이어줄 수 있기는 하다.

    셀레니움을 활용하여 이를 자동화 시켜줄 수 있을지, 프로젝트의 진척을 서로 보완해가며 사람의 도움 없이 괜찮은 결과물을 만들 수 있을지 궁금하다. OpenAI ChatGPT에는 입력해줄 수 있는 내용의 종류가 한정적이기 때문에, 처음에 어떤 프로젝트를 쥐여줄지도 고민해 봐야겠다.

    4. NovelAI 자동생성 및 업로드

    노벨AI를 매달 25달러를 주고 구독하고 있는데, 그럴싸한 아웃풋이 없어 아쉽기때문에, 셀레니움을 이용한 자동생성과 어딘가의 플랫폼에 업로드 하는 것을 자동화하는 프로그램을 짜 보고 싶다고 생각했다.

    개발자도구의 콘솔창에서 쉽게 일러스트의 자동생성은 할 수 있었기 때문에, 셀레니움에서 콘솔창 제어를 활용 할 수 있을지 확인해 보고 싶다. AI그림을 대량으로 업로드할 플랫폼이 있을지도 찾아봐야겠다.

    월 구독액만큼 뽕을 뽑을 수 있는 방법이 어디 없을까.

     

    반응형
    COMMENT
     
    12
    06

    글 작성에 앞서

    한국어 검색으로는 자료가 너무 없었기 때문에 계속 탐색중. 현재진행형이다.

    DryWetMIDI

    검색했을 때 가장 눈에 띄었던 건 무료 에셋인 DryWetMIDI 에 대한 내용이다.

    에셋을 다운로드 받아보면 몇개의 파일과 DEMO씬으로 이루어져 있다.

    DryWetMIDI의 구성

    DemoScript를 통해 대략 어떤 느낌으로 사용하면 될지 알 수 있고, [깃허브 README.md]나 [Documentation]에서 자세한 내용을 확인 할 수 있다.

    당장 확인한 내용은, DemoScene에서 제공하는 DemoScript를 그대로 사용하면 미디파일을 재생하며 콘솔에 음계를 로그로 보여주는데, 음계 로그와 동시에 오브젝트를 생성하려고 시도하면 오브젝트 생성은 메인 스레드에서만 가능하다는 에러를 보여주는걸로 보아 제대로 활용하기 위해선 다른 접근 방법을 생각해야 할 것 같다.

    또한 자세히는 모르겠지만, 미디재생을 위해 할당받은 오디오 출력 채널을 도중 에러로 인해 Release 작업 없이 종료되면 오디오 채널이 계속 점유중인 채로 남게 되어 프로그램을 껐다 켜야하는 수고가 필요했다. 다른 방법이 있을 것 같긴 한데 초심자라 잘 모르겠다. 그리고 그 외 여러가지 테스트를 해 보며 충돌이 나 유니티가 종료되는 일이 굉장히 빈번했다.

    공식문서를 자세히 보면서 익혀나가면 좋을 것 같다.

    Unity Midi Visualizer Tutorial (유튜브)

    https://www.youtube.com/watch?v=3PRifmlwi0I

    Midi 인풋을 받아오는 MidiJack 이라는 라이브러리가 있다는 것은 들었지만, 내가 본 이 영상에서는 아무래도 라이브러리를 사용하지 않는 것 같아 참고가 될까 하여 가져왔다.

    영상 제작자는 미디 키보드를 연결하여, 계이름에 맞는 오브젝트를 생성하는 스크립트를 작성한 것처럼 보인다.

    일단 메모만 해 두고 시간이되면 본 후 이 글에 정리 해 볼것.

    How to make a Rhythm Game In Unity (using MIDI) 

    https://www.youtube.com/watch?v=ev0HsmgLScg

    2023.12.07

    괜찮은 영상을 찾은 것 같다. 바로 따라 해 봐야겠다. DryWetMIDI를 이용하여 리듬게임을 만드는 방법을 설명한다.

     

    반응형
    COMMENT
     
    12
    05

    글 확인 전 참고사항

    - Unity Ads 패키지의 이름이 Unity Advertising으로 변경되었습니다. 버전 4.4.1부터는 이 패키지를 Unity 광고 레거시라고 합니다.

    - 아래의 내용은 2023년 12월 5일에 공식문서를 참고하여 유니티 2022.3.8.f1(LTS) 버전에서 정상적인 작동을 확인하였습니다.

    - [노션페이지]에서 더 나은 스타일로 글을 확인할 수 있습니다.

    Unity Ads / Unity Advertising 사용 가이드

    1. https://cloud.unity.com/ 로 접속하여 대시보드 진입
    2. 광고를 넣고자 하는 프로젝트 진입
    3. 서비스 목록 중 Unity Ads Monetization 선택하여, 광고 활성화
      1. I only plans to use Unity Ads(Unity Ads만 사용할 계획입니다) 선택 후 다음
      2. My app is not live in an app store yet(내 앱이 아직 앱 스토어에 게시되지 않았습니다) 선택 후 프로젝트 추가
      3. 본인의 경우 에러 발생 창 나왔지만, Retry 버튼 클릭하면 바로 해결.
      4. 아까 보였던 광고 활성화 버튼이 사라져있으면 OK
    4. Unity Ads Monetization 페이지에서 계속 진행. 설정 가이드 진입.
    5. 가이드에 따라 3개 스텝을 진행.
      1. Install Unity Ads SDK(Unity 광고 SDK 설치)
        1. 개발환경의 Unity로 이동
        2. Window > General > Services 진입하여, Advertisement Legacy 설치
        3. 또한 별개로 Setup Guide 페이지에서 Read integration guide 를 클릭하면 전체 가이드 공식문서가 열리며, 추후 사용할 예시 스크립트도 모두 여기에 적혀있다.
      2. Testing(테스트)
        1. 실제 광고가 아닌 테스트 광고를 사용하기 위해 필요한 절차
        2. Go to Testing 클릭하여 설정 페이지로 이동
        3. Apple App Store 와 Google Play Store 의 편집 버튼을 눌러 Override client test mode 에 체크 한 후, Force test mode ON (i.e. use test ads) for all devices 을 선택하여 모든 장치에서 테스트용 광고를 사용하도록 설정한다.
        4. 추후 실제 광고를 사용하게 된다면 여기서 다시 설정을 바꿔준다.
      3. Configure Ad Units(광고 단위 구성)
        1. 어떤 탬플릿의 광고를 사용할지 확인하기 위한 목적.
        2. Go to Ad Units 버튼 또는 왼쪽의 광고 단위 탭에 접근한다.
        3. 여기서 확인해야 할 것은 상단에 표시된 iOS 게임 ID, 안드로이드 게임 ID 그리고 하단에 나온 광고 단위 ID 이다. 필요에 따라 다른 모양의 광고를 사용하면 되며, 예시로 전면 광고 ID인 Interstitial_Android와 Interstitial_iOS를 사용 해 보겠다.
    6. 광고 적용
      1. 앱 시작 시 ‘SDK 초기화’를 필수적으로 해야하며, 이후 필요한만큼 ‘광고 유닛 표시’ 를 한다.
      2. SDK 초기화를 위해 씬에 빈 오브젝트를 하나 생성하여 아래 스크립트를 적용한다. 게임 시작 시 함께 실행된다. _androidGameId 변수와 _iOSGameId 는 5-c-iii에서 확인한 것을 기재한다.
        • AdsInitializer.cs(포스트 하단)
      3. 전면, 보상형, 배너 타입의 광고 중에 전면 광고를 넣어보자. 각 타입의 구현은 [공식문서]에서 확인할 수 있다. 아래와 같은 스크립트를 방금 생성한 오브젝트에 함께 적용한다. 게임이 시작되고 약 2초 후에 광고의 로드와 표시를 한다. _androidAdUnitId 와 _iOsAdUnitId 에는 각각 안드로이드와 iOS에서 표시될 광고의 타입(유닛)을 넣어주면 되는데, 전면광고를 예로 들면 각각 "Interstitial_Android” 와 “Interstitial_iOS”를 입력 해 주어야 한다. 광고 단위의 ID는 5-c-iii 과정에서 확인한 광고 단위 탭에서 확인 가능하다.
        • InterstitialAdExample.cs(포스트 하단)
      4. 적용하여 실행한 후 2초 뒤 모습은 아래와 같다.
        • 결과 확인

     

    7. 보상형 광고 등 이외 내용은 [공식문서]를 참고

     

    티스토리 이미지 위치 조정도 안되고, 오더리스트 타입도 설정 안 되고, 들여쓰기 내어쓰기도 안보이고, 코드블럭도 배치 안되고, 글씨 size 설정도 안보이고, 마크다운모드 다녀오면 글 전체 문단 배치가 박살나있고 왜 이러는지 모르겠다. 플랫폼 바꿔야할까 생각중

    (소스코드)

    // AdsInitializer.cs
    
    using UnityEngine;
    using UnityEngine.Advertisements;
    
    public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener
    {
        [SerializeField] string _androidGameId;
        [SerializeField] string _iOSGameId;
        [SerializeField] bool _testMode = true;
        private string _gameId;
    
        void Awake()
        {
            InitializeAds();
        }
    
        public void InitializeAds()
        {
    #if UNITY_IOS
                _gameId = _iOSGameId;
    #elif UNITY_ANDROID
            _gameId = _androidGameId;
    #elif UNITY_EDITOR
                _gameId = _androidGameId; //Only for testing the functionality in the Editor
    #endif
            if (!Advertisement.isInitialized && Advertisement.isSupported)
            {
                Advertisement.Initialize(_gameId, _testMode, this);
            }
        }
    
    
        public void OnInitializationComplete()
        {
            Debug.Log("Unity Ads initialization complete.");
        }
    
        public void OnInitializationFailed(UnityAdsInitializationError error, string message)
        {
            Debug.Log($"Unity Ads Initialization Failed: {error.ToString()} - {message}");
        }
    }
    // InterstitialAdExample
    
    using UnityEngine;
    using UnityEngine.Advertisements;
    
    public class InterstitialAdExample : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
    {
        [SerializeField] string _androidAdUnitId = "Interstitial_Android";
        [SerializeField] string _iOsAdUnitId = "Interstitial_iOS";
        string _adUnitId;
    
        void Awake()
        {
            // Get the Ad Unit ID for the current platform:
            _adUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
                ? _iOsAdUnitId
                : _androidAdUnitId;
        }
           
        void Start()
        {
            // 2초 후에 광고를 표시합니다
            Invoke("InvokeAd", 2.0f);
        }
    
        void InvokeAd()
        {
            LoadAd();
            ShowAd();
        }
        // Load content to the Ad Unit:
        public void LoadAd()
        {
            // IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled in a different script).
            Debug.Log("Loading Ad: " + _adUnitId);
            Advertisement.Load(_adUnitId, this);
        }
    
        // Show the loaded content in the Ad Unit:
        public void ShowAd()
        {
            // Note that if the ad content wasn't previously loaded, this method will fail
            Debug.Log("Showing Ad: " + _adUnitId);
            Advertisement.Show(_adUnitId, this);
        }
    
        // Implement Load Listener and Show Listener interface methods: 
        public void OnUnityAdsAdLoaded(string adUnitId)
        {
            // Optionally execute code if the Ad Unit successfully loads content.
        }
    
        public void OnUnityAdsFailedToLoad(string _adUnitId, UnityAdsLoadError error, string message)
        {
            Debug.Log($"Error loading Ad Unit: {_adUnitId} - {error.ToString()} - {message}");
            // Optionally execute code if the Ad Unit fails to load, such as attempting to try again.
        }
    
        public void OnUnityAdsShowFailure(string _adUnitId, UnityAdsShowError error, string message)
        {
            Debug.Log($"Error showing Ad Unit {_adUnitId}: {error.ToString()} - {message}");
            // Optionally execute code if the Ad Unit fails to show, such as loading another ad.
        }
    
        public void OnUnityAdsShowStart(string _adUnitId) { }
        public void OnUnityAdsShowClick(string _adUnitId) { }
        public void OnUnityAdsShowComplete(string _adUnitId, UnityAdsShowCompletionState showCompletionState) { }
    }
    반응형
    COMMENT
     
    12
    01

    레퍼런스로 가져온 컨텐츠에 대해

    최근 유튜브에서 본 것들 중 인상에 남는 컨텐츠를 몇 개 가져왔다. 직접 플레이하는 게임이라기보다 디자인적 요소가 메인이 되는 내용이다. 2번 레퍼런스는 당장 시작해보아도 좋을 것 같다. bouncing square은 설명란에 소스를 공개해놓은 채널도 있었는데, 그 크리에이터들은 python을 사용했다.

     

    1. MINECRAFT Nostalgic Marble Music

    가장 멋 없고 단순한 방식의 작성을 생각한다면, 음악을 먼저 작성한 뒤, 음악의 처음부터 반복해서 들어가면서 한땀한땀 공이 흘러가는 위치에 실로폰 블럭을 배치하는 것이다. 

    한 단계 더 높은 자동화 방식으로는, midi를 참조한 게임이 음표가 등장하는 매 순간 공과 접하는 블록을 생성해 결과적으로 얻어낸 블록의 모든 좌표를 사용하는 것이다.

    내 수준에서 가능할만한 전략은 아직은 더 떠오르지 않는다.

    그리고 영상에 사용된 쉐이더?가 엄청 예쁘다

     

    2. REVISED - "Megalovania" played by bouncing square

    이것도 1번 컨텐츠와 전략은 비슷하다. 그리고, 움직이는 사각형을 여럿 풀어놓아 여러 staff를 연주할 수 있을 것 같다는 생각도 든다.

    3. "Symphony of Curves: A Mathematical Ballet" | Curlicue Fractals | 1080p | 🎵 : "Thoughts" by ANBR

    이건 영상이 예뻐서 가져왔다. 영상을 구성하는 여러 요소도 신경쓰이고, 유니티로 그래프를 표현하는 방법은 본 기억이 없다. 에셋 스토어 뒤져보면 나올지도.

     

    반응형
    COMMENT
     
    11
    30

    개발일지 목록 : 클릭

     

    사전캠프 과정에 대해

    해당 트랙의 사전캠프는 C# 프로그래밍의 기초(Unity와는 별개) 학습 문서와, 다섯개의 유니티 프로젝트 강의가 준비되어있다. 지금도 트랙 수강자가 계속 합류하고 있고, 모집 기간은 아직 남아있지만 거의 정원이 다 찼다는 듯

    5회분의 유니티 프로젝트는 각각 n주차 프로젝트 라고 하여, 개개인이 시간 배분을 하여 약 5주간의 사전캠프에 모두 학습하는 것을 목표로 한다.

    C# 학습과 유니티 프로젝트 1주차와 2주차

    2023.11.30(목)

    나는 저번주 목요일에 합류하여 일주일을 진행하였다. 생각해보니 C#은 이전에 따로 배운 기억이 없는데 유니티를 몇 차례 다뤄봤던 경험이 있어서 거의 아는 내용이었고, 변수값을 초기화 시켜놓지 않으면 기본적으로 어떤 값을 가지는지 등 디테일한 느낌의 요소들을 주로 알아갔다.

    프로젝트는 저번 포스팅에도 작성했듯이 준비된 강의량이 엄청 많은 것은 아니다. 처음 유니티를 하는 사람이나 늦게 합류한 사람도 어렵지 않게 모두 커버 가능할 정도로 보였다. 내일배움캠프 진도 시트가 마련되어 있는데, 이미 마지막 주 프로젝트까지 끝낸 사람도 몇 명 보였다. 나는 오늘 2주차까지 진행해두고, 다른 작업이나 과거 프로젝트 코드개선을 하기도 했다.

    1주차 프로젝트

    생각했던 것과 달리 1주차 때 얻어간게 많았다. 지금까지 유니티를 야매로 배우며 건드리기 꺼려졌던 것들이 꽤나 있었기 때문(애니메이션과 UI전반). 대부분 기억을 되살려가며 익숙해져가는 느낌으로, '하늘에서 떨어지는 오브젝트를 먹으면 점수를 얻는 게임'을 작성했다. 그리고 과거에는 GameManager와 그 스크립트에 대해서 잘 모르고 정말 되는대로 사용했었는데 이 부분도 어떤 탬플릿이 좋을지 고민 해 가야겠다.

    2주차 프로젝트

    2주차 프로젝트도 1주차와 비슷한 느낌의 게임으로, '하늘에서 계속해서 떨어지는 오브젝트(square)들을 유저가 마우스 컨트롤(마우스커서=shield)로 잘 비벼서, 화면 하단의 특정 오브젝트(balloon)와 접촉하지 않도록 오래 버티는 게임'이다. 새로 학습한 스킬은 아래와 같다.

    - balloon은 평소의 idle 상태와 접촉해서 터질 때의 die 상태, 두 가지의 애니메이션이 있고, 애니메이션 컨트롤러 라는 것을 사용하여 특정 상태에 따라 다른 애니메이션을 취하도록 하는 방법

    - PlayerPrefs 클래스(맞나?)를 사용하여 게임이 종료되어도 점수 등의 데이터를 남기고 불러오는 방법

    (1, 2주차 결과 이미지를 같은 라인에 나란히 두고 싶었는데 티스토리 글작성에서 왠지 되지를 않는다)

    1주차와 2주차는 비교적 쉬운 프로젝트였다고 하며, 3주차에는 본격적으로 레벨 시스템과 여러 씬을 다루는 프로젝트를 한다고 한다. 어제자로 이제 신경 쓸 다른 일들이 적어져서 사전캠프 진행에 속도가 붙을 것 같다.

    그 외 특별한 이벤트

    구글 폼을 통해 내일배움캠프에 궁금한 것을 질문하는 설문을 진행했었다. 오늘자 학습을 진행하다가, 오후 6시에 ZEP(메타버스 수업공간) 내 이벤트 필드에 모여 폼으로 모인 질문에 답변하며 매니저님들과 소통하는 시간을 가졌다.

    캠프 진행에 크게 중요한 내용은 보통 공지에 있는 편이기에 비교적 가벼운 내용이 많았고, 예전 OT때도 느꼈던건데, 매니저님의 밈 이해도나 엔터테이닝 능력이 저세상급이다. 'ㅁ 붕 쿤!' 자세를 실제로 카메라 앞에서 하는 사람을 처음 봤다. 드립학원이나 밈 학원이 정말 존재하는 게 아닐까.

    캠프는 내가 생각했던것보다 훨씬 체계적이고 관리도 게을리 하지 않을 것 같은 인상을 받았다는 것이다. 그리고 진행 중 정기적인 평가도 이루어지고 이를 반영한 수강생의 역량에 따라 세개의 반이 운영된다고 한다. 이건 꽤나 경쟁심을 부추기는 좋은 요소라고 생각했다. 그래도 각 반에서 진행되는 특강들은 다시보기를 진행한다고 하니 불이익이라고 할 것은 없다.

    그리고 TIL이라는 용어를 처음 알았는데, 'Today I Learned'의 약자로 특별한 건 없고 하루 배운 것을 정리하는 것이다. TIL은 캠프를 하며 반드시 작성을 시킨다고 한다. 내 경우는 블로그에 매 1회차만 작성하고 그만두는 경우가 대부분이었기 때문에, 외부의 시선을 느끼며 작성하는 것이 도움이 될 것이다. 이렇게 작성된 TIL은 복습에도 사용되고, 취업활동 때 성실성을 보여주는 근거로도 활용할 수 있을 것이다. 

    조금 찾아보니 지금 먼저 캠프를 하는 다른 수강생의 TIL을 살펴볼 수 있었다. 매일 그날의 기록을 적기 위해 프로젝트에서 캡쳐를 하는 것은 상당히 피곤한 일이다. 글 작성에도 시간을 소모한다. 나의 경우는 '정제된 내용을 게시하는 것'의 우선순위가 높을 것 같기 때문에 과연 매일 어떤 식으로 글을 작성해나갈지 아직 감이 잡히지 않는다. 미래에 읽어도 가독성이 좋은 글을 쓰고싶다.

    TIL에 대한 설명과 수강생의 TIL들은 아래의 링크에서 확인 해 볼 수 있다.

    스파르타 - TIL 제대로 작성하는 방법 | TIL이란? TIL 작성 이유

    오늘과 같은 이벤트성 컨텐츠는 목요일에 주로 열릴 것이라고 한다.

    마무리

    다른 수강생들의 진도가 2주차 체크에서 많이 멈춰있다. 3주차에서 시간을 많이 쓰나보다. 금방 5주까지 끝낼 수 있을 것 같기 때문에 외적으로 진행할 다른 것들도 정리 해 보아야겠다.

    반응형
    COMMENT
     
    11
    29

    SSAFY 11기 비전공 서류전형 결과

    2023년 11월 28일(화)

    적성검사는 잘 봤다고 생각했고, 에세이는 누가봐도 처음 보는 템플릿일 정도로 처참했다. 농담이 아니고, 어쩌다 하루 마음을 고쳐먹었지만 징징대는 베짱이가 써 본 시의 느낌이다. 오후 3시 7분 결과를 확인하라는 문자를 받고 벌써 결과가 나왔나 생각하며 싸피 홈페이지에 접속해보았다.

    대외비 가능성 있는 부분은 모두 검열했다

    나도 믿지 못할 합격이라는 결과가 나왔다. 에세이에 자신이 없는 사람이라면 적성테스트에서 만점을 노려보면 좋을 것 같다는 비뚤어진 팁을 하나 남기고 싶다.

    이왕 되었으니 있는 경험 없는 경험 모두 도전해보자 라고 생각했다. 인생에서 다시 찾아오기 힘들 기회임에는 확실하고, 역시 한차례 더 합격한다면 한차례 더 성장하는 기회를 얻을 수 있을 것임은 분명하다. 

    넥토리얼 준비를 할 때 처음 오픈카톡방을 찾아보았고, 오늘자로 두 번째 오픈채팅 검색은 SSAFY가 되었다. 많은 11기 준비생과 선배들이 면접스터디를 해 보는 것을 추천하는 분위기였기에, 바로 행동에 옮겼다. 지방에 살고 있기 때문에 온라인으로 할 수 있는 스터디를 찾아갔다.

    면접 스터디

    2023년 11월 29일(수)

    첫 입장까지 할 숙제를 최대한 조사하여 노션 페이지에 담아갔다. 숙제 중 생전 처음 보는 토픽도 그렇고 들어보기만 했던 토픽에 대해서는 혼자 숙제를 하며 지식을 넓히는데에 도움이 되었다. 그러나 개인사정으로 스터디 열어주신 분께 양해를 구하고 스터디에서 하차하게 되었다.

    내 상태와 별개로 면접 스터디는 어떻게든 확실히 서로를 보완할 수 있는 장이 될 수 있다는 것을 확실히 느꼈고 다들 정말 붙고 싶어하는 분위기도 도움이 되기 때문에 인터뷰를 준비하는 사람들은 꼭 한번은 참여하면 좋겠다.

    그리고 SSAFY에 대해 아는게 별로 없다면 오픈카톡에서 얻을 게 많다. 인터뷰 관련해서도 관련 꿀팁이나 정보가 정말 많았다. 오픈카톡에 미리 참여하여 당분간 눈치보면서 이것저것 주워먹자.

    앞으로

    이제 지금 시점에서 할 수 있는건, '내일배움캠프' 수료를 하는 것과 1인개발자 또는 중소기업 게임개발직 정도가 되겠다.

     

    반응형
    COMMENT
     
    11
    25

    개발일지 목록 : 클릭

     

    SSAFY의 비전공자(내 실수인지 비전공자로 지원이 되어버림) 적성진단과 에세이를 마친 후 결과를 기다리는 중이었다.

    SSAFY의 테스트 관련해서 따로 포스팅을 하지 않았기에 지금 적어본다면. 적성검사는 수리 및 추론문제 파트와 Computational Thinking 파트로 나뉘어져 있었는데, 수리추론은 서른 문제인가 스무문제에서 세 문제 이외 모두 제대로 풀었고 Computational Thinking 파트는 그 존재와 문제유형을 테스트 당일에 알아 당황한 감이 없지 않지만 주어진 시간 꽉 채워서 아마 만점을 예상한다. 수리추론에서 못 푼 세 문제의 유형은 옛날 IQ 테스트에서 볼 법한 도형 규칙성 찾기(어느 정도의 시간이 걸릴지 예측 불가능하기에 바로 포기했다), 하나는 시간이 부족해서 풀지 못한 경우의 수 문제이다.

    아마 테스트의 성적은 나름 좋게 나올 것 같은데 역시 웹개발보다는 게임개발을 하고 싶다고 다시 생각하여, SSAFY에 제출할 에세이는 잔잔한 미친 시인이 되어 내 공허한 서사를 풀어냈기 때문에 아마 불합격 통지를 받는다면 에세이가 한 몫 하지 않을까 생각한다.

    + 인터뷰 대상자로 합격했지만, 인터뷰 대비 1일차에 아무래도 나한테 부족한 점이 많고 적성도 아닌 것 같아 길게 끌지 않고 하차하기로 결정했다.


    2023년 11월 22일 수요일, 오후에 카페에 나가 SSAFY의 소식을 기다리며(과거 기수의 기록을 보면 11월 28일 쯤 발표 할 것으로 예상) 생각해두었던 내일배움캠프 게임개발 과정에 지원하겠다고 생각하며 바로 신청을 넣었다. 여기 지원한 데에는 몇 가지 이유가 있는데,

    - 온라인으로 진행. / 다른 지방 부트캠프가 괜찮다 싶어 지원했다가 이거 때문에 방까지 구하는 것은 좀 아닌 것 같아 취소했고, 기숙사를 지원해주는 곳도 있었는데, 4인 1실에 부실한 시설(개인 데스크탑도 놓을 수 없어 보이는 환경)을 보고 실망하여 지원을 하지 않은 곳도 있다. 수도권에 살았다면 더 많은 곳에 지원하고 더 많은 채용모집에도 지원 해 볼 수 있었을텐데, 지방러의 고충이다.

    - 팀 활동. / 팀 프로젝트를 하는지까지는 조사해보지 않았지만 일단 함께 팀원으로 할 수 있는 사람이 있다는 것에 의미를 가졌다. 여태껏 혼자 해왔기에 나 이외의 사람과 소통하는 경험이 필요하다.

    - 튜터 활동으로 보이는 스크린샷에 마음이 쏠렸음. /  담임 매니저 집중 관리 라는 키워드로 Zoom 비슷한 환경에서 게임 개발 실습을 진행하는 사진이다. 어떤 환경에서 캠프가 진행되는지 살짝이나마 알 수 있었다는 점에서 마음이 기울었을지도.

    - 'Unity 전액 국비지원 🔥단 선착순 50명 한정' 라는 문구에 급하게 지원함. / 낚였을지도 모른다(ㅎㅎ). 실제로 현재 사전교육생 수는 이것보다 많아보이는데 아직 정식으로 시작한건 아니기 때문에 모른다. 정말 선착순이라면 설마 짤릴지도?

    + (위에 대한 추가 내용) 모집 기간이 많이 남아있었지만, 정원 마감이 되었다. 늦게 합류하신 분들은 아쉽지만 예비 인원으로 본강의가 시작되기 전 까지 이탈자가 생기면 그 자리를 채운다는 듯 하다.

    아무튼 이런저런 이유로 내일배움캠프(스파르타 코딩클럽) 유니티 게임개발 파트로 지원했다.

    3일 이내에 결과가 통지된다고 했는데, 당일 저녁에 합격 발표(좀 애매하게 메시지가 와서 불합격 여지가 있는건지 알 수 없었다)를 받고 바로 슬랙 서버에 초대되었다. 아무래도 SSAFY 결과는 나오나마나가 된 것 같다.


    2023년 11월 23일 목요일, 오후 3시 경에 연락을 받아 사전캠프에 합류하였다. 월요일에 이미 OT를 하고 사전캠프를 시작했다는 듯. 정해진 시간에 메타버스 플랫폼 ZEP에 접속하고 출석페이지에서 입실 버튼을 누르고 자습을 하는 시스템이다. 주어진 자료를 통해 공부하며 진도표에 체크를 해나간다. 교육 개시인 12월 21일 전까지는 계속 이렇게 진행하는 듯 싶다.

    C#의 기초에 관한 자료와, 사전교육 5주에 걸친 Unity에 관한 교육 내용이 준비되어있는 것을 얼추 확인했다. C#의 내용은 기초중의 기초로 적은 분량이었기에 신경써서 메모할 내용은 없이 확인을 끝냈고, Unity 강의는 영상자료의 총 합 길이가 그렇게 길지 않은 것으로 보아 프로젝트 위주의 진행을 할 것 같아보인다.

    뭔가 대한민국의 '메타버스' 이미지를 쏙 갖다놓은 메타버스 플랫폼을 처음 접해보고 새로운 기분을 느끼며 중간합류 한 첫주차 사전캠프를 보냈다.

    반응형
    COMMENT
     
    09
    16

    본인은 컴공 전공까지 했으면서 백준을 하지 않는 나태(?)한 대학생활을 보냈기 때문에, 코딩테스트는 반짝 벼락치기로 대비했다. 그래도 동빈나 채널 보면서 DFS/BFS, DP, 다익스트라 정도까지는 제대로 이해하고 구현까지 연습했던 정도.

    급하게 준비한 코딩테스트였고, 쉬운 문제를 내심 기대했지만.

    시험 방식 포함 모든 내용에 대해 공개하면 안된다고 하여 모두 삭제

     

    한 문제도 온전하게 못 풀어서 아마 다음 단계 전형에는 초대받지 못할 것 같다.

    쓴 경험이 되었는데, 앞으로 대기업 코딩테스트가 계속해서 이 정도 난이도의 문제로 출제된다면 지금부터 준비하는건 도저히 무리일 것 같기도 싶어 앞으로 어떻게 해야할까 싶다.

    반응형
    COMMENT
     
    09
    14

    #1.  리스트를 오름차순으로 정렬하는 sort() 함수

    list_a = [0,2,1,3,4]
    list_a.sort()
    print(list_a) # [0,1,2,3,4]
    
    list_a.sort(reverse=True)
    print(list_a) # [4,3,2,1,0]

    대입이 아닌, 리스트에 직접 .sort()를 해서 사용한다.

    reverse 매개변수를 True로 전달할 시, 역순으로 정렬.

     

    #2. 리스트를 역순으로 만드는 reverse() 함수

    list_b = [1, 10000, 100]
    list_b.reverse()
    print(list_b) #[100,10000,1]

     sort()와 마찬가지로 리스트에 직접 .reverse()를 하여 사용

     

    #3. 슬라이싱을 사용하여 리스트를 역순으로

    list_c = [1, 10000, 100]
    reversed_c = list_c[::-1]
    print(reversed_c) #[100,10000,1]

     

     

    리스트가 아닌 문자열의 경우, 슬라이싱의 방법만 유효하다.

    반응형
    COMMENT
     
    09
    13

    제목: 개인정보 수집 유효기간(2023 KAKAO BLIND RECRUITMENT)

    난이도: Lv.1

    사용언어: Python

    def solution(today, terms, privacies):
        
        answer = []
        
        today = [int(i) for i in today.split('.')]
        
        terms_dict = {key: int(value) for key, value in (item.split() for item in terms)}
        
        for data_n in range(len(privacies)):
            
            data = privacies[data_n]
            term_type = data.split()[1]
            
            date = [int(i) for i in data.split()[0].split('.')]
            date[1] += terms_dict[term_type]
            
            today_value = today[0]*28*12 + today[1]*28 + today[2]
            date_value = date[0]*28*12 + date[1]*28 + date[2]
            
            if(today_value >= date_value):
                answer.append(data_n+1)
            
        return answer

    「풀이방식」

    1) 개인정보 수집 일자의 '월' 수치에 유효기간을 더하여 만료일자에 저장한다.

    2) 오늘날짜의 '연도', '월', '일' 에 각각 (28*12), (12), (1) 의 가중치를 곱한 값과 만료일자에도 동일한 가중치를 곱하여 두 값을 비교, 만료일자에 가중치를 곱한 값보다 오늘날짜에 가중치를 곱한 값이 같거나 크다면 answer 리스트에 추가한다.


    「검색했던 내용」

    1) 리스트 컴프리헨션

    today = [int(i) for i in today.split('.')]
    terms_dict = {key: int(value) for key, value in (item.split() for item in terms)}

    이와 같이 반복문을 사용하는 것보다 코드를 간결하게 작성할 수 있고, 성능적으로 효율적일 수 있다. 리스트 컴프리헨션은 다양한 작업에 사용될 수 있으며, 데이터 변환, 필터링 및 초기화 작업에 유용하게 활용된다.

    또한 아래와 같이 다양한 컴프리헨션이 있다.

     

    딕셔너리 컴프리헨션: 딕셔너리를 생성하고 초기화하기 위한 컴프리헨션. 리스트 컴프리헨션과 유사하지만 중괄호 {}를 사용한다.

    data = {"A": 1, "B": 2, "C": 3}
    squared_data = {key: value ** 2 for key, value in data.items()}

    집합 컴프리헨션: 집합을 생성하고 초기화하기 위한 컴프리헨션. 중괄호 {}를 사용하며 중복된 항목이 없는 집합을 만든다.

    numbers = [1, 2, 2, 3, 4, 4, 5]
    unique_numbers = {x for x in numbers}

    문자열 컴프리헨션: 문자열을 생성하는 데 사용.

    characters = ['a', 'b', 'c']
    text = ''.join([c.upper() for c in characters])

    제너레이터 컴프리헨션: 제너레이터를 생성하는 데 사용. 제너레이터는 한 번에 하나의 항목을 생성하는 데 유용하다.

    numbers = [1, 2, 3, 4, 5]
    squared_generator = (x ** 2 for x in numbers)

     

    반응형
    COMMENT
     
    08
    07

    소요시간: 약 10시간

    초기버전 개발을 마친 후 크롬 웹 스토어에 제출하여 검토중

    구글링 해 보니 약 3일정도 생각하면 된다고 한다.

     

    3일간의 검토 후 현재 크롬 웹 스토어에서 배포

    https://chrome.google.com/webstore/detail/arcacon-gif-downloader/ajccljbpmpeebkknkmmladkcicmnhadb?hl=ko

     

     

     

     

    아이콘
    아카라이브에서 원본 GIF 다운로드 기능을 제공한다

     

    해당 확장프로그램의 눈에 띄는 한계점은 아래 두 가지이다.

     

    1. 로그인을 필수로 요구한다:

    GIF 파일 주소를 얻는 다른 방식을 하나 더 생각하고 있는데, 이게 된다면 이후 업데이트로 로그인은 필수가 아니게 될 수 있다.

    2. 댓글의 아카콘만 가능하다:

    케이스를 나누어 글 본문도 가능하도록 업데이트 될 수도 있다. 하지만 아카콘 판매 페이지에서는 지금 방식으로써는 작동 불가능. 1번에서 생각하고 있다는 다른 방식을 더 확장시킨다면 이것도 해결 가능할지도 모른다. 아카콘 판매 페이지가 얼마나 정교하게 이루어졌는지에 따라 달려있다.

     

     

    GPT-4 코드 인터프리터를 적극 활용

    개발 완료까지 약 310회의 대화를 진행하였다. 주요 과정은 아래와 같다.


    1. 목표 설정: 사용자가 arca.live에서 특정 비디오(아카콘)를 우클릭하여 GIF 형태로 다운로드할 수 있는 크롬 확장 프로그램을 개발하기로 결정했습니다.

    2. 초기 설계 및 구현:
       - `content.js`에서 사용자가 우클릭한 비디오를 감지하고, 해당 비디오의 정보를 `background.js`에 전달하는 기능을 구현했습니다.
       - `background.js`에서는 비디오 정보를 바탕으로 다운로드 URL을 생성하고, 해당 URL의 이미지를 다운로드하는 기능을 구현했습니다.

    3. 오류 수정 및 기능 개선:
       - 매니페스트 파일과 스크립트 파일의 권한 설정, URL 처리 방식 등을 수정하면서 여러 오류와 문제점을 해결했습니다.
       - 특정 비디오를 우클릭하면 컨텍스트 메뉴에 다운로드 옵션을 표시하는 기능을 추가했습니다.

    4. 매니페스트 V3 마이그레이션:
       - 매니페스트 V2에서 V3로의 전환을 수행하면서 `background.js`를 `service_worker.js`로 변경하고, 관련 권한 및 설정을 수정했습니다.
       - 이 과정에서 발생한 여러 오류를 수정했습니다.

    5. 아이콘 및 기타 세부 사항 추가:
       - 확장 프로그램의 아이콘을 설정했습니다.
       - 컨텍스트 메뉴에 아이콘을 표시하려 했으나, 해당 기능이 지원되지 않아 제거했습니다.

    6. 테스트 및 마무리:
       - 최종적으로 확장 프로그램이 원하는 대로 동작하는 것을 확인했습니다.
       - ID 중복 오류 문제를 해결하고, 파일 구조를 정리했습니다.

    7. 스토어 등록 준비:
       - 확장 프로그램을 크롬 웹 스토어에 등록하기 위해 필요한 권한 요청, 원격 코드 사용 여부 등을 확인하고, 문서 작성을 준비했습니다.

     

    초기버전 개발 후기:

    - GIF파일의 접근이 까다로운 아카라이브 구조를 우회하는데에 상당한 시간이 소모되었다.

    - CORS 정책인지 이걸 우회한다고 온갖 방법을 시험해보느라 상당한 시간이 소요되었다. 결과적으로 성공은 해서 다행.

    - 처음 생각했던 것보다 몇배 몇십배의 오류와 버그가 발생한다. 

    - 크롬 웹 스토어에 등록하려면 매니페스트 버전 3을 강제하고있다. 매니페스트 버전 2로 개발을 마쳤는데 스토어 등록이 불가하다고 하여 3버전으로의 마이그레이션을 하는데에도 상당히 애를 먹었다.

    반응형
    COMMENT
     
    03
    24

    애드센스에서 한번 설정한 국가정보를 변경하는 건 불가능합니다.

     

    따라서 한국에서 해외로 또는 해외에서 한국으로 거주국가와 함께 수익을 받는 계좌를 옮길 경우

    계정을 한번 해지하고 새롭게 만드는 방법을 사용합니다.

     

    계정 해지 시, 그 동안 축적된 통계와 아직 지급받지 않은 수익 등을 포기해야합니다.

     

    좌측 탭의 계정정보에 진입

     

    애드센스 페이지 좌측의 탐색기에서 계정정보에 진입합니다.

    계정 - 설정 - 계정 정보

    페이지 우측 하단 버튼을 통해 계정 해지를 진행합니다.

    애드센스 계정 해지

    수익 잔액 지급 동의 및, 이유 선택, 약관 동의를 확인 후 계정을 해지합니다.

    내 계정 해지 버튼을 클릭할 경우 바로 계정해지가 완료되기 때문에 주의합니다.

    이후 다시 애드센스에 접속하게 되면 새로 계정을 만드는 페이지로 이동합니다.

     

     

    이는 2023년 03월 24일에 확인한 내용이며, 일본 국가설정에 대한 계정을 해지하였습니다.

    애드센스의 업데이트 및 타 국가에 따라서는 다른 과정을 요구할 가능성이 있습니다.

    반응형
    COMMENT