42cursus
- [ft_transcendence] 3. 반응형 게임 컨테이너 제작 게임의 요구 사항에는 다음과 같은 애매한 말이 적혀있었다. - The game must be responsive! 이게 게임이 실시간으로 반응을 해야한다는 뜻인지, 아니면 브라우저 창의 크기가 변하는 것에 따라 게임 창의 크기가 변해야 한다는 뜻인지 알 수가 없었다. 어떻게 할 지 고민하다가 최대한 보수적으로 기준을 잡고 게임 창의 크기가 브라우저 사이즈에 따라 변할 수 있도록 제작하기로 결정하였다. 게임은 html canvas를 이용해 구현되어 있었기 때문에 반응형으로 만들어주기 위해서는 브라우저 크기가 변할 시 canvas를 다시 그려주는 작업이 필요했다. 혹시나 반응형 canvas를 쉽게 그릴 수 있게 해주는 패키지가 있나 찾아보았지만, 있다 하더라도 내가 원하는 수준의 커스텀이 불가능해서 그냥 직.. 2023.01.23
- [ft_transcendence] 2. Pong 제작 들어가며 먼저 고백하자면, 우리는 게임을 만들며 치명적인 실수를 했다. 바로 백엔드 쪽에서 게임에 접속한 유저를 식별하기 위해 유저가 연결된 socket의 id를 사용했다는 것이다. 이런 실수를 하는 사람들이 많았는지 공식 문서에서는 아예 대놓고 소켓의 아이디를 디버깅 이외의 목적으로 사용하지 말라고 강조하고 있다. 소켓의 id는 매 연결 시 새롭게 부여된다. 그래서 여러 가지 이유(네트워크가 잠시 끊기거나, 프론트에서 컴포넌트가 변경되며 소켓 인스턴스가 바뀌는 경우 등등...)로 클라이언트와 서버 사이의 소켓 연결이 끊어질 수 있는데, 소켓 id로 유저를 식별하면 한번 연결이 끊어진 유저는 영영 다시 식별을 할 수 없게 되는 것이다... 이 때문에 게임을 플레이하던 유저가 페이지를 새로고침하거나, 네트.. 2023.01.13
- [ft_transcendence] 1. 게임 설계 개요 본 과제에서 만들어야 하는 서비스에는 채팅과 게임이라는 두 개의 주요 기능이 있다. 그중 나는 게임을 구현하는 부분을 맡았다. 만들어야 하는 게임은 1972년에 출시된 Pong의 규칙을 따르는 간단한 핑퐁게임이었다. Pong과 동일한 규칙으로 진행되기만 하면 게임을 구현하는 데에 별도의 제한이 없었으므로 우리는 최대한 간단하게 만들기로 했다. 팀원 중 한 분의 블랙홀이 얼마 남지 않아 시간이 없었기 때문에...ㅠㅠ 게임 부분의 요구사항은 다음과 같다. 1) 실시간 온라인 1:1 게임이 가능해야 하며, 모든 조작은 플레이할 수 있을 수준으로 부드럽게 작동해야 한다. 2) 별도로 방을 생성하거나 초대 없이 매칭 큐 등록을 통해 랭크게임을 진행할 수 있어야 한다. 3) 채팅 인터페이스를 통해 다른 유저를.. 2022.12.18
42life
- 프랑스 개발자 2개월 차 생존신고 쉽지 않을 것이라 생각했던 회사 생활은 정말로 쉽지 않았다.한국에서도 경험해보지 못한 강도의 업무가 계속되는 나날들. 요구사항은 하루마다 변하고, 옆에서 일하던 개발자들은 어느날 갑자기 해고 되거나 스스로 나가거나. 그 속에서 하루하루 일정에 쫒기며 다른 생각은 할 새도 없이 기능 구현만 미친듯이 하고 있다. 내가 일했던 그 어떤 스타트업보다 스타트업 같은 회사 (근데 스타트업 아님). 처음에는 와 나도 해고되면 어떡하지 라는 생각으로 두려움에 떨면서 매일 출근했는데이제는 그냥 잘리면 한국 가면 되지~ 라는 마인드로 다니고 있다. 이게 맞나 싶은 마음이 강하게 들고 솔직히 어떻게 해야할 지 아예 모르겠음. 이 쌓여가는 기술부채를 대체 어떻게 감당할 것인가 라는 생각밖에 안남. 초 압박적인 일정으로 기능구.. 2025.08.22
- 생존신고 마지막으로 블로그에 글을 쓴 게 1년 하고도 조금 넘어서 간단히 적는 생존신고. 간략히 말하자면 나는 프랑스에서 정규직 소프트웨어 엔지니어로 취직하는 데 성공했다. 정말 많은 일들이 있었지만, 아주 아주 운이 좋게도 내가 원하는 분야의 비즈니스를 하는 회사에 그동안 해오던 iOS 개발자로 취직하는 데 성공한 것이다... 그리고 지금은 새롭게 이사갈 집을 찾기 위해 고군분투 중이다. 이제는 정규직도, 월세의 3배를 넘는 월급도, 보증인도 있지만 여전히 파리에서 집 구하기는 그 무엇보다도 어렵다... 하지만 이 또한 이겨내리니... 이다음은 그동안 내가 뭘 했나 돌아보기 위해 간단히 적는 타임라인 ~ 2024년 9월Deezer에서의 인턴십 기간. 이때 지겹도록 했던 리팩토링이 정말 도움이 많이 되었다. 특히.. 2025.07.01
- 나는 8개월동안 파리에서 무엇을 했나 프랑스 생활에 웬만큼 적응이 되고 나니 시간이 믿을 수 없을 정도로 빨리지나간다. 어느덧 내가 프랑스에 떨어진지도 8개월이 다 되어가고 있는데, 그동안 무슨 일을 했나 살펴볼 필요가 있다. 왜냐하면 반성이 필요한 시기라고 느끼기 때문임. 이 글도 사실 1월달에 시작해서 중간에 고이 접어뒀다가 2024년 5월 11일 새벽에 다시 적고 있다. 11월별일 안했다.본격적으로 42 과제를 시작하기로 마음먹고 Inception of Things를 시작했지만, 극악의 프로젝트 난이도 + 당장 쓸모 없음 -> 동기부여 안됨의 콜라보로 극악의 나태의 늪에 빠졌었다. 클러스터도 찔끔찔끔 나가고, 집이 클러스터에서 매우 가깝다보니 조금 피곤하다(+배고프다) 싶으면 그냥 집에 와버리고는 했다. (근데 이건 지금도 그럼 ㅎ; .. 2024.01.25
iOS
- [refactoring] <한들> 바로잡기 - 0. 불필요한 의존성 해제 배경 2022년 4월 경, 죽음의 minishell을 끝마친 나는 갑작스레 납치되어 Wordle의 한국어 버전 iOS 앱 의 제작에 참여하게 된다. 당시 뜨거운 인기를 끌었던 Wordle의 인기가 식기 전에 앱을 출시하는 게 목표였기에 우리는 2주 동안 미친 듯이 앱을 만들었고, 그 후 각자의 길을 걷느라 앱의 유지보수는 치명적인 버그를 수정하는 선에서만 해왔다. 그런데 이 내놓은 자식 이 미친 중독성을 바탕으로 대략 월 100달러 이상의 광고 수익을 꼬박꼬박 가져다주게 되자, 돈독이 오른 나는 한들을 만들어 놀고 먹자는 원래 목표를 위해 다시금 한들 개발에 뛰어들게 되는데... 문제상황 원래 기획사항이었지만 미뤄두었던 [푼 문제 다시보기] 기능을 만들기 위해 코드를 훑어보던 나는 그만 경악하고 만다. .. 2023.03.06
- [AVFoundation] observer로 AVPlayer의 상태 확인하기 문제상황 소셜미디어 피드 UI를 구현하며 url로 부터 가져온 비디오의 상태를 가져와야 하는 일이 생겼다. 비디오가 정상적으로 로딩되었는지, 플레이 가능한지, 버퍼링 중인지와 같은 상태를 알고 상황에 따른 피드백을 해주어야만 했다. 해결방법 AVFoundation은 swift가 탄생하기 전부터 사용되어오던 프레임워크라 현대적인 인터페이스를 제공하지는 않았고 AVPlayer, 혹은 AVPlayerItem에 KVO(Key-Value Observing)을 활용하는 방식으로 상태를 가져올 수 있었다. Swift에서 KVO 방식의 옵저버를 사용하기 위해서는 NSObject를 상속하는 객체를 생성해야 한다. 만들고 있는 앱은 MVVM 아키텍쳐를 따르고 있었으므로, 아예 영상 플레이어 관련 로직을 전담하는 Video.. 2023.02.22
- [SwiftUI] SwiftUI에서 AVPlayerLayer 사용하기 문제상황 최근에 인스타그램의 릴스처럼 영상으로 구성된 피드 UI를 만들어야 하는 일이 생겼다. API에서 영상의 url을 가져와 영상을 플레이하는 뷰를 제작해야 했는데, 문제는 기본적으로 SwiftUI에서 제공하는 영상 플레이어의 커스텀이 극도로 제한적이라는 것... import AVKit struct VideoContainer: some View { //... var body: some View { //SwiftUI에서 제공하는 기본 비디오 플레이어 VideoPlayer(player: AVPlayer(url: Bundle.main.url(forResource: "video", withExtension: "mp4")!)) .frame(height: 400) } //... } AVKit에서 제공하는 Vid.. 2023.02.20
여행
-
20. 그라나다 1~2일차 / 2021. 12. 11. ~ 2021. 12. 12.
-
19. 말라가 - 2021. 12. 09. ~ 2021. 12. 11. 말라가의 숙소는 시내에서 조금 떨어져 있는 말라게타 해변 바로 앞에 있는 곳이었다. 터미널에서 버스를 타고 20분 정도 달려 도착할 수 있었던 숙소. 정류장에 내리니 멋드러진 석양이 나를 반겨주었다. 사실 말라가는 별 생각 없이 인터넷에서 좋다는 후기만 읽고 가기로 결정했던 곳인데, 여행을 하며 조금 더 리서치를 하다 보니 론다나 코르도바에 가는 게 낫지 않았을까 하는 약간의 후회가 있었다. 그런데 이 멋진 석양을 보고 마음이 풀렸다. 숙소는 평점이 아주 높은 곳이었는데, 도착하고 나서 그 이유를 알 수 있었다. 마치 스페인에 시골집이 있다면 이런느낌이 아닐까? 라는 인상을 받았다. 친절한 주인아저씨와 강아지, 그리고 미쳐버린 분위기의 테라스까지. 저녁은 나가서 먹을까 하다가 근처에 까르푸가 있길래 재료..
-
18. 세비야 3일차 - 세비야 대성당 / 2021. 12. 09. 전날 저녁까지 늦게까지 술을 마시고 조금 늦게 일어나니 크리스가 떠날 준비를 하고 있었다. 오늘 일정을 마지막으로 독일로 돌아간다고 했는데, 오전에 진행되는 세비야 대성당 투어를 예약해두었다고 했다. 유럽의 관대한 학생 정책은 세비야 대성당에도 적용되었는지, 무료로 투어를 예약할 수 있었다고. 나도 이날 별다른 일정이 없었는데, 크리스의 말을 듣고 세비야 대성당에 가보기로 했다. 더 이상의 성당은 여행 일정에 없다고 결정을 했지만, 만 25세가 지나기 전에 혜택을 끝까지 착즙해야 했기 때문에... 그렇게 프랑수아와 크리스, 그리고 나는 언젠가 다시 만나기로 약속하고는 서로의 행운을 빌며 헤어졌다. 조금 늦은 조식을 먹고는 체크아웃을 하고 짐을 숙소에 맡겨둔 후 세비야 대성당으로 향했다. 그런데 아뿔싸, ..