최근 유튜브에서 본 것들 중 인상에 남는 컨텐츠를 몇 개 가져왔다. 직접 플레이하는 게임이라기보다 디자인적 요소가 메인이 되는 내용이다. 2번 레퍼런스는 당장 시작해보아도 좋을 것 같다. bouncing square은 설명란에 소스를 공개해놓은 채널도 있었는데, 그 크리에이터들은 python을 사용했다.
해당 트랙의 사전캠프는 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을 살펴볼 수 있었다. 매일 그날의 기록을 적기 위해 프로젝트에서 캡쳐를 하는 것은 상당히 피곤한 일이다. 글 작성에도 시간을 소모한다. 나의 경우는 '정제된 내용을 게시하는 것'의 우선순위가 높을 것 같기 때문에 과연 매일 어떤 식으로 글을 작성해나갈지 아직 감이 잡히지 않는다. 미래에 읽어도 가독성이 좋은 글을 쓰고싶다.
적성검사는 잘 봤다고 생각했고, 에세이는 누가봐도 처음 보는 템플릿일 정도로 처참했다. 농담이 아니고, 어쩌다 하루 마음을 고쳐먹었지만 징징대는 베짱이가 써 본 시의 느낌이다. 오후 3시 7분 결과를 확인하라는 문자를 받고 벌써 결과가 나왔나 생각하며 싸피 홈페이지에 접속해보았다.
대외비 가능성 있는 부분은 모두 검열했다
나도 믿지 못할 합격이라는 결과가 나왔다. 에세이에 자신이 없는 사람이라면 적성테스트에서 만점을 노려보면 좋을 것 같다는 비뚤어진 팁을 하나 남기고 싶다.
이왕 되었으니 있는 경험 없는 경험 모두 도전해보자 라고 생각했다. 인생에서 다시 찾아오기 힘들 기회임에는 확실하고, 역시 한차례 더 합격한다면 한차례 더 성장하는 기회를 얻을 수 있을 것임은 분명하다.
넥토리얼 준비를 할 때 처음 오픈카톡방을 찾아보았고, 오늘자로 두 번째 오픈채팅 검색은 SSAFY가 되었다. 많은 11기 준비생과 선배들이 면접스터디를 해 보는 것을 추천하는 분위기였기에, 바로 행동에 옮겼다. 지방에 살고 있기 때문에 온라인으로 할 수 있는 스터디를 찾아갔다.
면접 스터디
2023년 11월 29일(수)
첫 입장까지 할 숙제를 최대한 조사하여 노션 페이지에 담아갔다. 숙제 중 생전 처음 보는 토픽도 그렇고 들어보기만 했던 토픽에 대해서는 혼자 숙제를 하며 지식을 넓히는데에 도움이 되었다. 그러나 개인사정으로 스터디 열어주신 분께 양해를 구하고 스터디에서 하차하게 되었다.
내 상태와 별개로 면접 스터디는 어떻게든 확실히 서로를 보완할 수 있는 장이 될 수 있다는 것을 확실히 느꼈고 다들 정말 붙고 싶어하는 분위기도 도움이 되기 때문에 인터뷰를 준비하는 사람들은 꼭 한번은 참여하면 좋겠다.
그리고 SSAFY에 대해 아는게 별로 없다면 오픈카톡에서 얻을 게 많다. 인터뷰 관련해서도 관련 꿀팁이나 정보가 정말 많았다. 오픈카톡에 미리 참여하여 당분간 눈치보면서 이것저것 주워먹자.
앞으로
이제 지금 시점에서 할 수 있는건, '내일배움캠프' 수료를 하는 것과 1인개발자 또는 중소기업 게임개발직 정도가 되겠다.
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 강의는 영상자료의 총 합 길이가 그렇게 길지 않은 것으로 보아 프로젝트 위주의 진행을 할 것 같아보인다.
뭔가 대한민국의 '메타버스' 이미지를 쏙 갖다놓은 메타버스 플랫폼을 처음 접해보고 새로운 기분을 느끼며 중간합류 한 첫주차 사전캠프를 보냈다.
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)
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버전으로의 마이그레이션을 하는데에도 상당히 애를 먹었다.