<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Nomad Engineer</title>
    <link>https://universehan.tistory.com/</link>
    <description>노마드를 도전하는 엔지니어. 여행하면서 얻는 생각 과 정보를 공유</description>
    <language>ko</language>
    <pubDate>Wed, 5 Aug 2026 21:06:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>universehan</managingEditor>
    <image>
      <title>Nomad Engineer</title>
      <url>https://tistory1.daumcdn.net/tistory/3769405/attach/20b4c55b34b844189b0bde06a6d39dfd</url>
      <link>https://universehan.tistory.com</link>
    </image>
    <item>
      <title>MacOS 에서 python 환경 설정하기</title>
      <link>https://universehan.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;맥에서 여러 버전의 파이썬을 사용하는경우 파이썬 환경 설정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Context&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬을 사용하기 위해서는 사용 방법에 맞게 설정할 필요가 있다. 나 같은 경우는 다양한 프로젝트를 하기 때문에 여러버젼의 파이썬을 사용해야 하고, 각 프로젝트에서는 별도의 모듈을 사용해야 하기 떄문에 global 환경에 모든것이 설치되길 원하지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 개발 환경에서 파이썬 패키지 매니저를 사용하는 방법은 여러가지가 있지만 여기서는 pyenv 를 사용하여서 로컬 환경에서 여러 버젼의 파이썬을 설치하고 변경할 수 있도록 하고, 각 프로젝트에서는 venv를 사용하여 별도의 독립된 환경에서 외존 모듈들이 설치되어 사용하는 방법을 설명한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;pyenv&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다름 링크를 참고하여 pyenv 를 설치하고, 자신의 shell 환경에 맞는 설정을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/pyenv/pyenv#homebrew-in-macos&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/pyenv/pyenv#homebrew-in-macos&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;python 설치하기&lt;/h3&gt;
&lt;pre id=&quot;code_1664939876511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pyenv install 3.10.6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 활성화된 쉘에서 version 을 설정하려면&lt;/p&gt;
&lt;pre id=&quot;code_1664940764980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv shell 2.7.18&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;venv&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.python.org/ko/3/library/venv.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.python.org/ko/3/library/venv.html&lt;/a&gt;&amp;nbsp;를 참고하여 개별 프로젝트를 위한 가상 환경을 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다래의 명령을 사용하여 간단한 가상 환경을 만들 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1664940322553&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python -m venv .env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 가상환경을 활성화 하려면 아래의 명령을 실행하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1664940391822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ source .env/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 환경의 종료는 &quot;deactivate&quot; 명령을 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1664940432373&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ deactivate&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발</category>
      <category>pyenv</category>
      <category>Python</category>
      <category>파이썬설치</category>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/42</guid>
      <comments>https://universehan.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 5 Oct 2022 12:27:28 +0900</pubDate>
    </item>
    <item>
      <title>다시 취업준비...</title>
      <link>https://universehan.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;한국에 돌아온지 1년이 지났다. 그리고 어찌어찌 하다 다시 취업준비를 하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 무엇이 부족한지 알기 위해서 무작정 여러곳의 인터뷰를 잡히는대로 보기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강남언니, 채널톡, 그린랩스, 아마존, 유니티, 마이크로소프트 등등.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단은 알고리즘과, 시스템디자인 위주의 준비를 하면 되겠다고 생각했다. 그러나 실전 인터뷰를 보고나니 내가 부족한것들이 더 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘, 경험위주의 기술 인터뷰, 소프트웨어 공학 기본 지식들.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;알고리즘&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년동안 사용했던 언어가 코틀린이라서 우선 연습을 코틀린이로 하게되었다. 실제 인터뷰를 보면서 몇 가지 어려움을 발견했는데, 내가 생각보다 코틀린에 익숙하지 않았다. 그리고 코틀린은 안전한 언어라서 예상하지 못한 애러들을 해결하느라 시간을 괸장히 많이 사용했다. 그리고 나는 오래된 개발자라 기본적인 자료구조나 알고리즘의 구현이 굉장히 서툴렀다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 가지 문제점들을 깨닿고 전략을 바꾸기로 결심했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 언어를 파이썬으로 변경했다.&amp;nbsp;개발자해외취업 페이스북 커뮤니티에서, 황동성님이 공유해주신 인터뷰 준비하는 방법을 참고하여 &lt;a href=&quot;https://developers.google.com/edu/python/?fbclid=IwAR1EMy8jSSyKgwol8wx86ur91Ieicl2iJyuYBA9C1TDgNXQLr4LnW175ouQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;구글의 파이썬 무료 코스&lt;/a&gt;를 일단 보기로 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 간단한 반복문에서서 경계값을 정할때 실수를 많이 한다는것을 알게 되었다. 이 문제를 생각하는 프로그래밍이란 책에서 &quot;정확한 프로그램작성&quot; 이라는 부분을 참고하여 논리학과 프로그램 검증 방법을 사용하여 해결 하는 연습을 하고, 문제를 풀때 적용하기로 결심했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이력서 상의 기술 인터뷰&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 이력서에는 몇 가지 굵직한 단어들이 나온다. Scrum Master, 마이크로 서비스, 이벤트 드리븐 아키텍처. 하지만 면접을 통해서 이런 개념들에 대해서 내가 깊이 알고 있지 못하고, 개념도 잘 모른다는것을 발견했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힐링페이퍼(강남언니)에서는 내가 개념을 정확히 알고 있는지를 확인했고 나는 잘 대답할 수 없었다. 스크럼잉란 무엇인가? 라는 질문에 나는 명확히 대답할 수 없었고 핵심 개념을 잘 몰랐다. 마이크로 서비스는 어떤것이고 어떤 문제를 해결하는가? 라는 질문에도 역시 잘 대답할 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널톡 면접을 볼때는 나의 대규모 처리 경험과 이벤트 기반 아키텍처에대해서 질문을 하였는데, 대규모 처리를 위해 필요한 다양한 지식들이 부족했다는것을 깨닳았다. 대규모 트래픽에서의 문제 진단을 위한 절차, 모니터링 방법, 측정 방법들을 잘 알지 못했고. 장애 상황에서 발생하는 쓰래드 이슈, 응답지현에 대한 실제 스프링 어플리케이션에서 어떻게 쓰래드 정책을 설정하는지 등등을 잘 대답하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마존면접에서는 네트워크와 리눅스 기본 개념에 대해서 질문을 많이 받았는데 이 역시 잘 대답하지 못하였다. SSL 이 무엇인지 어떻게 동작하는지 실제로 어떻게 문제 상황에서 진단을 해나갈 수 있는지. 리눅스에서 도커엔진이 동작하는 원리라던지, HTTPS 핸드쉐이킹에 대해서, DNS 가 어떤 단계로 동작하는지 등등을 잘 설명할 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티 면접에서는 JPA의 N+1 문제에 대해서 잘 대답하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다시 부족한 것들을 채우자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 알로기즘을 꾸준히 다시 공부하기로 했다. 파이썬을 익히고, 파이썬으로 다양한 문제들을 해결하고, 그리고 기본적인 정렬 및 자료구조를 손으로 직접 구현하는 연습을 해야겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용했지만 잘 몰랐단 개념들에 대해서 다시 공부하고 정리해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷, 웹, 웹 서비스, HTTP, HTTPS, 마이크로 서비스, 이벤트 드리븐 등등에 대해서 다시 차근차근 공부를 해야겠다. 봐야할 책들을 선별해 봤는데, 리얼월드 HTTP, TCP/IP Illustrated, 마이크로서비스 패턴, 기업통합 패턴 들을 봐야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/41</guid>
      <comments>https://universehan.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 5 Oct 2022 11:46:23 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 개발영어 표현들(grant) - 2022.07.13</title>
      <link>https://universehan.tistory.com/36</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Grant who ~ something ~&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grant: 승인 하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can grant users ... access to ... : 당신은 ~ 한 사용자들을 ~ 에 엑세스 하도록 승인할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;You can mange you user identities in an external system outside of AWS and grant users who sign in from those systems access to perform AWS tasks and assess your AWS resources.[1]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;당신은 AWS 의 외부 시스템에 있는 사용자의 아이덴티티들을 관리할 수 있고, 그곳으로부터 로그인한 사용자들에게 AWS 작업을 수행하는 접근과 당신의 AWS 리소스의 접근을 승인할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;References&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Identity federation&lt;/b&gt; section, &lt;a href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Temporary security credentials in IAM&lt;/a&gt; - AWS document&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>영어</category>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/36</guid>
      <comments>https://universehan.tistory.com/36#entry36comment</comments>
      <pubDate>Wed, 13 Jul 2022 15:00:29 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 개발영어 표현들 - 2022.07.12</title>
      <link>https://universehan.tistory.com/35</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;A thorough treatment of ~&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;~에 대한 철저한 처리. &lt;a href=&quot;https://en.dict.naver.com/#/search?range=all&amp;amp;query=thorough+treatment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;네이서 사전&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;A thorough treatment of testing in the enterprise is beyound the scope of this reference manual. [1]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔터프라이즈에서의 테스팅에 대한 &lt;b&gt;철저한 처리&lt;/b&gt;는 이 레퍼런스 메뉴얼의 범위를 벗어난다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;References&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testing-introduction&quot;&gt;Introduction to Spring Testing&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>영어</category>
      <category>개발영어</category>
      <category>영어</category>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/35</guid>
      <comments>https://universehan.tistory.com/35#entry35comment</comments>
      <pubDate>Tue, 12 Jul 2022 10:39:33 +0900</pubDate>
    </item>
    <item>
      <title>평험한 개발자가 평범하지 않는 연봉을 받는법</title>
      <link>https://universehan.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나는 뛰어난 개발자가 아니다. 하지만 왠만한 뛰어난 개발자도 받기 힘든 연봉을 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 하면 높은 연봉을 받는 개발자가 될 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;훌륭한 개발자가 된다? 회사에서 수많은 기여를해 나의 가치를 인정받는다?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맞는 말이다. 하지만 그것은 누구나 할 수 있는 당연한 이야기이기 때문에 여기서 하지 않겠다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그럼 무슨 이야기를 할까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 연봉은 상대적이다. 남들보다 높은 연봉, 내가 생각하는 나의 실력보다 높은 연봉을 받는다면 그것은 높은 연봉을 받는것이라고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하고싶은말은 현재 나는 그대로일때 나의 가치를 최대로 끌어 올려서 높은 연봉을 받을 수 있는 어찌보면 욕먹을 만한 팁을 이야기 해보고자 한다. 사람들이 궁금해 하는건 실제로 그런거니까. 아무도 이야기 해주지 않는거니까. 그럼 이야기를 시작해 보겠다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;나의 꼭 필요로 하는 회사를 찾아라&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람은 다 다르다. 마찬가지로 회사도 다 다르다. 사람마다 가진 능력도 다르고 경험도 다르며, 성격도 다 다르다. 회사 역시 문화도 다르고 비즈니스도 다르고 상황도 다 다르다. 결국 내 옆에 앉아있는 동료보다 내가 더 성과도 낮고 실력디 떨어진다고 느낄 수 있지만, 모든곳에서 그럴까? 그건 다른 이야기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 실력을 봐도 한마디로 높다! 라고 말하기 어렵다. 누구는 리팩토링을 잘 할 수 있고, 누구는 인프라를 굉장히 잘 다루고, 누구는 테스트 케이스를 잘 짠다. 어떤 사람은 커뮤니케이션을 정말 잘하고, 어떤 사람은 문서를 기가막히게 잘 작성한다. 단순히 코딩능력만 본다고 하더라도 사람마다 잘 하는 부분이 다 다르고, 똑같이 서버 코딩을 한다고 해도, 세부적인 경험에 따라 다 다르다. 어떤 사람은 날짜를 다루는것을 기가막히게 잘 다룰 수 있고, 어떤 사람은 데이터를 다루는 API를 잘 만들 수 있다. 정말이지 하나하나 다 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 역시 마찬가지다. 서비스의 규모, 개발의 단계, 팀의 규모와 문화에 따라 정말이지 천차만별로 다르다. 결국 상황에 따라 필요로 하는 사람이 정말 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하고싶은 말은 이거다. 정말 그 순간, 내가 가지고 있는 역량을 절실하게 필요로 하는 회사를 찾아라. 그런 회사를 찾는다면 일단 그 회사입장에서의 나의 가치는 다른 회사가 생각하는 가치와는 차원이 다를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 하나 들어보자면, 옛날에 게임회사에서 병특으로 일 할때였다. 그당시 병특 개발자들이 받는 연봉은 120만원 정도였다. 병특이 아닌 주니어 개발자의 연봉은 200만원 정도였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 단 한명이 예외가 있었다. 그 사람은 병특인데 그 당시 거의 400만원 이상을 받고 있었다. 회사는 플래이스테이션 개발이 필요했고, 그 사람이 유일하게 플레이스테이션 개발을 할 수 있었기 때문이다. 실력은 모두가 다 잘 했기 때문에 그렇게 큰 차이는 없을것 같았다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;최대한 많은 기회를 만들어라&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 어떻게 나를 꼭 필요로 하는 회사를 찾을까?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답은 간단하다. 진짜 많은 기회를 만들면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 어떤 회사를 지원한다고 했을때, 아무리 내가 잘 아는 회사의 팀에 지원한다고 하더라도 실제로 면접을 보기전에는 알 수 있는 정보가 거의 없다. 그리고 실제 일을 하기전에는 정말 그 회사가 무엇을 하는지 나랑 잘 맞는지는 정말 잘 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 나랑 연관성이 있다고 생각하면, 주저하지 말고 이력서를 넣고 면접을 보면서, 내가 일을 잘 할 수 있는 회사인지 그리고 그 회사가 정말 나를 필요로 하는지를 파악해 보는것이다. 그렇게 하면 나도 회사를 보는 안목도 생기고, 많은 기회도 얻을 수 있다. 반대로 많은 회사들에게 나를 보여주면 맞는 사람을 찾을 확률이 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 나는 본격적으로 이직을 하면 최소 100개 이상의 회사에 이력서를 넣고, 30군대 넘는 면접을 보고, 10개정도의 오퍼를 받고 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;면접은 연봉 협상을 위한 과정이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 면접 과정을 합격을 목표로 준비하고 임한다. 하지만 면접과정은 실제로 나의 최종 오퍼금액에 영향을 미친다. 결국 그 짧은 시간을 내가 어떻게 보냈냐에 따라서 나의 최소 1년 혹은 3년 이상의 연봉을 결정한다. 심하게 이야기 하자면, 내가 1년동안 어떻게 성장했는가 보다. 짧으면 1시간, 길면 6시간정도의 면접시간에 내가 얼마나 잘 했는가가 나의 연봉을 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어보자, 내가 회사에서 인정받고 많은 기여를 했으며 엄청난 성장을 했다고하자. 그런데 면접 당일날 컨디션이 안좋아서 면접관의 질문을 거의 못알아 들었고 답변 역시 잘 하지 못했다고 해보자. 내가 이미 경험한것이고 다 아는것이라고 해봤자 소용없다. 상대방은 오히려 이력서에 적혀있는 화려한 경험에 비해 거의 대답한것이 없는 나를 생각하면서 정말 실력없다고 평가할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접,&amp;nbsp; 특히 기술면접을 위해 최선을 다해 준비하고, 그 순간 순간의 질문과 대답에 최선을 다 해라. 겨우 합격했다고 좋아할 필요가 없다. 결국 최종 오퍼를 받고 실망할 수도 있으니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실전 면접을 통해 성장해라&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접을 통해 성장하라는 말을 싫어하는 사람이 엄청 많을것 같다. 실력도 없으면서 면접만 잘봐서 들어온 개발자라고 비난 받을 수도 있다. 여기서 중요한것은 면접을 통해서 성장한 역량도 나의 역량이라는걸 생각하라. 어차피 기술 면접에서 이해 없이 답변해 봐야 통과 할 수도 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만... 면접 질문은 정말 회사가 필요로 하는 역량을 확인 하는 질문이다. 결국 내가 가진 다른 역량이 아무리 뛰어나도 회사가 필요로 하는 역량이 부족하면 사실 나는 매력이 없는 지원자다. 결국은 면접을 통해서 얻은 지식과 역량을 갖춰야 해당 회사에 꼭 필요한 사람이 되는것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 면접 질문은 크게 벗어나지 않는다. 비슷한 역량을 필요로하는 회사들을 대게 비슷한 질문들을 한다. 알고리즘 + 시스템 디자인을 주로 보는 회사들은 항상 알고리즘 문제를 내고 시스템 디자인 문제를 낸다. 그게 그 회사들이 필요로 하는 역량이기 때문이다. 실제 과제를 내주고 그것에 대해 구현하고 토론 하는 회사들은 또 다들 비슷한 과제를 내주고 비슷하게 코드를 가지고 토론을 한다. 경험을 위조로 묻는 회사들은 대게 이력서 위주로 경험에 대해 질문을 한다. 결국 10군대 정도 면접을 보면.. 2~3가지의 그룹으로 나뉘게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접을 통해서 나의 부족함을 깨닿고, 다시 해당 부분을 보충해 갈 수록 점점 면접을 잘 보는 자신을 발견할 수 있다. 그리고 면접을 통해서 성장한 부분도 실제 업무에도 도움이 된다. 비슷햔 면접 유형의 회사를 3군대 이상 경험하다 보면 4번째 부터는 내가 거의 모든걸 답할 수 있다는걸 알게될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;돈이 많은 회사로부터 오퍼를 받아라&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사마다 자금과 개발자 수요에 대한 상황이 다 다르다. 특정 상황에 자금력이 생기고 개발자를 공격적으로 채용하는 회사들이 있다. 그런 회사들로부터 오퍼를 받으면 실제로 내가 높은 연봉을 받을 수 있는 확률도 올라가고 다른 회사와의 협상에도 높은 연봉을 받을 확률이 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다른회사로부터 인정받은 나의 가치를 어필 하라.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사도 짧은 면접시간동안에 나의 가치를 평가하기란 쉽지 않다. 사람이 그렇듯이 더욱 확실한 근거를 원한다. 내가 만약 다른 좋은 회사, 더 높은 연봉, 더 많은 회사로 부터 오퍼를 받았다면, 솔직하게 하지만 부드럽게 그것을 이야기 하는게 좋다. 그러면 회사는 나에대에 조금 더 확신을 하게되고, 나를 놓치지 않기위해서 더 좋은 조건을 제시할 확률이 높다. 실제로 미국의 유명한 에어bnb 개발자가 쓴 연봉 협상 글에도 나온 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연봉 협상에 최선을 다 하라&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연봉협상에 정말 최선을 다 해라. 만약 이번 연봉 협상에 실패 한다 하더라도, 연봉 협상 능력을 기르는것은 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 사실 면접보다 연봉협상을 더 신중하게 진행한다. 실제로 높은 연봉을 받는 많은 사람들이 연봉협상을 기술면접보다 더 힘들어 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;입사후에는?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 이런 걱정을 한다. 많은 연봉을 받고 입사후에 잘 못하면 어떻게하지? 또 어떤 커리어 코치는 조언한다 너무 높은 연봉은 입사후를 더 힘들게 한다고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 일을 못하면 돈을 더 적게 받는다고, 나한테 덜 실망하지 않는다. 그리고 높은 연봉을 오히려 나 스스로를 채찍질 하는 도구가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;돈의 가치를 하는법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지만 잘 하면 된다. 남들이 하기 싫어하지만 중요한 일을 내가 잘 하는것. 내가 잘하고 싶은것을 다른 사람보다 +1만 더 잘하는것. 그러면 충분히 인정받을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;적응이 힘들어 퇴사 하게된다면?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 나는 그 연봉으로 시작한다. 물론 이 말을 많은 사람들이 싫어하겟지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 경험상 다른 사람들이 잘 이야기 하지 않는 나의 생각을 공유해봤다. 어떤 회사는 나 같은 사람을 싫어 할테고, 누군가는 나 같은 사람을 보며 시기할 수도 있다. 하지만 그냥 절실한 누군가에게 도움이 됐으면 한다.&lt;/p&gt;</description>
      <category>200% 인상</category>
      <category>개발자</category>
      <category>억대연봉</category>
      <category>연봉협상</category>
      <category>이직</category>
      <category>커리어</category>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/34</guid>
      <comments>https://universehan.tistory.com/34#entry34comment</comments>
      <pubDate>Sat, 18 Jun 2022 01:36:21 +0900</pubDate>
    </item>
    <item>
      <title>소프트웨어는 어떻게 모든(다른)환경에서 실행되는가?</title>
      <link>https://universehan.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어를 배포하고 대상환경에서 실행하는것은 소프트웨어를 개발 하는것 만큼이나 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 왜 어려운지 이해 하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼만큼 알면 소프트웨어를 잘 빌드하고 배포하고 실행 할 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 구조로 되어 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Hello World&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;파이썬으로 다음과 같은 간단한 프로그램을 만들었다고 하자. 파일 이름은 hello.py 로 하자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625133020998&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;Hello World&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이걸 어떻게 실행 할 수 있을까? 두 가지 방법이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;python 으로 GIT으로 실행 하는 방법&lt;/li&gt;
&lt;li&gt;실행가능한 바이너리파일(executable binary file)을 만들고 이 파일을 실행하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 첫번째 방법으로 간단하게 실행 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1625133222711&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python hello.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과는&lt;/p&gt;
&lt;pre id=&quot;code_1625135778686&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Hello World&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와우! 이렇게 멋진 프로그램을 만들고 나니, 뭔가 혼자 보기 아깝다는 생각이 든다. 그래서 주변에 친한 친구들에게 내가 방금 만든 이 멋진 프로그램을 보여주고 싶어졌다. 그런데 어떻게 하지? 친구들은 파이썬도 할 줄 모르는데 친구들에게 소스 파일을 받아다가 파이썬 명령어를 타이핑해서 실행하라고 할 수도 없으니 말이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Executable Binary 파일 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(작성 해야함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친구의 반응을 보니 더더욱 신이났다. 그래서 그 파일을 다른 친구에게 보내주고 실행해 보라고 했다. 그런데 예상과는 다르게 그 친구의 컴퓨터에서는 실행이 안된다는것이다. 어? 왜그러지? 알고보니 첫 친구의 컴퓨터는 윈도우즈를 사용하고 있었다. 그런데 이번 친구는 맥북(MacOS)을 사용하고 있었다. 어... 그럼 이제 어떻게 해야하지?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다른 타깃 시스템을 위한 파일 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/32</guid>
      <comments>https://universehan.tistory.com/32#entry32comment</comments>
      <pubDate>Thu, 1 Jul 2021 18:46:55 +0900</pubDate>
    </item>
    <item>
      <title>그저그런 개발자의 이직도전기 - 프롤로그</title>
      <link>https://universehan.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;핀란드로 해외취업을 성공한지 일년이 다 되어가고 있었다. 이제 슬슬 팀에 적응하기 시작하고 회사에서 내가 개선하고싶은것들이 하나 둘씩 눈에 보이고 있었다. 곧 연봉협상에 대해서 이야기를 꺼내야지.&lt;br&gt;&lt;br&gt;그런데 2월이 되자 이상한 낌새가 느껴졌다. 팀에 사람이 더 필요해 팀과 함께 지원자들을 함께 인터뷰하고 뽑고 싶은 지원자가 어느정도 추려졌을때쯤, 갑자기 추가적인 채용이 중단 되었다. 그렇다 회사의 펀딩사정이 좋지 않아 더 이상 채용을 할 수가 없게되었다.&lt;br&gt;&lt;br&gt;아니나 다를까 그 시점부터 매주 대표는 이상하리 만큼 펀딩상황에 대해서 자주 공유하기 시작했다. 그리고 얼마 안가 3월이 되었을때 회사는 추가 펀딩에 차질이 생겨 임시로 회사의 인력의 70%를 레이오프 할 수 있다는 사실을 발표했다. 그리고 그 과정에서 나는 이직을 결심하였다.&lt;br&gt;&lt;br&gt;회사는 생각보다 나에게 이직을 준비할 시간을 허용하지 않았다. 회사의 재정상황이 좋지 않았기 때문에 일주일 단위의 유급휴가는 허락하지 않았다.&lt;br&gt;&lt;br&gt;타지에서 여유 자금도 없이 갑작스럽게 언제 실직할지도 모르는 상황에 놓여지니 하루하루가 불안했다. 회사 생활이 적응하는데 정신이 팔여서 핀란드에서 꿀이라고 이야기하는 노동조합이더 가입되어 있지 않은 생태라 실직하기 되면 재정적으로 매우 난감한 상황에 처하기 될것이었다.&lt;br&gt;&lt;br&gt;결론부터 이야기 하면 다행히도 핀란드에서도 알아주는 회사 2곳과 한국 회사 5곳 태국회사 한곳, 이렇게 총 8개의 회사에 합격하여 오퍼를 받게 되었다.&lt;br&gt;&lt;br&gt;오퍼를 받은 회사들을 적어 봤다.&lt;br&gt;* Nordea - 유럽의 대형 은행중 하나&lt;br&gt;* smartly.io - SNS 광고 플랫폼중 2인자 글래스도어 평점 4.8&lt;br&gt;* raketitiede - 핀란드 컨설회사&lt;br&gt;* 아고다 - 태국의 글로벌 여행 예약 서비스&lt;br&gt;* 직방 - 대한민국 대표 집 구하기 서비스&lt;br&gt;* 쏘카 - 대한민국 대표 카 쉐어링 서비스&lt;br&gt;* 라포랩스 - 의류 서비스 스타트업&lt;br&gt;* 반도체관련 소프트웨어 스타트업&lt;br&gt;&lt;br&gt;&lt;br&gt;앞으로 하나하나씩 나의 2021년 상반기 이직 경험을 기록해보고자 한다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/31</guid>
      <comments>https://universehan.tistory.com/31#entry31comment</comments>
      <pubDate>Tue, 22 Jun 2021 01:39:23 +0900</pubDate>
    </item>
    <item>
      <title>개발일지 - 2021.03.28 (일) - MediaMuxer 초기화</title>
      <link>https://universehan.tistory.com/30</link>
      <description>&lt;p&gt;NDK에서 MediaMuxer를 생성하기 위해서는 unix File Descriptor가 필요했다. 표준 c++의 파일 open() 함수를 사용하여 파일을 열고 거기서 얻은 FileDescriptor를 전달하여 MediaMuxer를 생성하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;수행한 절차는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 코드에서 내장 스토리지의 경로를 얻기&lt;/li&gt;
&lt;li&gt;내장 스토리지 경로 + 파일 이름으로 저장할 아웃풋으 지정하여 네이티브 코드로 전달&lt;/li&gt;
&lt;li&gt;네이티브 코드에서 전달받은 string 값을 std::string 형식으로 변환&lt;/li&gt;
&lt;li&gt;네이티브 코드에서 파일을 여는데 필요한 해더파일을 선언.&lt;/li&gt;
&lt;li&gt;네이티브 코드에서 파이을 열어 FileDescriptor를 획득&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1616944740321&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;fcntl.h&amp;gt;

// ...

outputFileDescriptor = open(outputFile.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/30</guid>
      <comments>https://universehan.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 29 Mar 2021 21:15:46 +0900</pubDate>
    </item>
    <item>
      <title>개발일지 - 2021.03.27 (토)</title>
      <link>https://universehan.tistory.com/29</link>
      <description>&lt;p&gt;안드로이드 네이티브 미디어 레코더 개발중.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;CDD라는 것이 있다. 안드로이드 하드웨어 제조사가 지켜야할 가이드 라인같은것. 여기에 오디오 레이턴시에 대한 부분이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PackageManager.&lt;span&gt;FEATURE_AUDIO_PRO 를 제공하면 20ms 이하의 레이턴시를 보장한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;PackageManager.&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;FEATURE_AUDIO_LOW_LATENCY 를 지원하면 지속적인 라운드트립 레이턴시가 50ms 이하를 보장하지만 Cold input 레이턴시는 100ms 이하이다.&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;결국 pro를 제공하지 않으면 프로페셔널 오디오 기기로 쓰기에는 부적합.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;믿었던 LG G7의 배신.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;테스트 기기로 사용하던 G7폰은 low와 pro둘다 제공하지 않는다. 결국. 100ms도 보장하지 않는다. 어쩐지.. 최소 300ms이상은 레이턴시가 생기는것 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일단은 MediaCodec과 MediaMuxer를 사용해서 녹화를 하고, 차이나는 레이턴시를 재보는걸로 결정.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;AAudioCodec 디코더는 어떻게 만드는 걸까?&lt;/p&gt;
&lt;p&gt;MIME_TYPE 설정&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ACC Profile 설정&lt;/p&gt;
&lt;p&gt;AAC LC 라는걸 선택한다. 사용가능한 프로파일은 다음에 나와있다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/MPEG-4_Part_3#Audio_Profiles&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;en.wikipedia.org/wiki/MPEG-4_Part_3#Audio_Profiles&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1616850869757&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MPEG-4 Part 3 - Wikipedia&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Jump to navigation Jump to search MPEG-4 Part 3 or MPEG-4 Audio (formally ISO/IEC 14496-3) is the third part of the ISO/IEC MPEG-4 international standard developed by Moving Picture Experts Group.[1] It specifies audio&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/MPEG-4_Part_3#Audio_Profiles&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/MPEG-4_Part_3#Audio_Profiles&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/MPEG-4_Part_3#Audio_Profiles&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/MPEG-4_Part_3#Audio_Profiles&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;MPEG-4 Part 3 - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;From Wikipedia, the free encyclopedia Jump to navigation Jump to search MPEG-4 Part 3 or MPEG-4 Audio (formally ISO/IEC 14496-3) is the third part of the ISO/IEC MPEG-4 international standard developed by Moving Picture Experts Group.[1] It specifies audio&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;안드로이드에서 사용 가능한 값들은. 다음 레퍼런스 페이지에서 AAC로 검색.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel#constants_1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel#constants_1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1616850938793&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MediaCodecInfo.CodecProfileLevel &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel#constants_1&quot; data-og-url=&quot;https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/33NNr/hyJGzQ6KrZ/nW4HPArjZeuNv5kovnsmW1/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel#constants_1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel#constants_1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/33NNr/hyJGzQ6KrZ/nW4HPArjZeuNv5kovnsmW1/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;MediaCodecInfo.CodecProfileLevel &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MediaDecoder 초기화 코드&lt;/p&gt;
&lt;pre id=&quot;code_1616852339808&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char* acc_mime_type = &quot;audio/mp4a-latm&quot;;
audioEncoder = AMediaCodec_createDecoderByType(acc_mime_type);
if (audioEncoder == nullptr) {
  LOGE(&quot;Creating decoder have been failed.&quot;);
  return false;
}

const int AAC_OBJECT_LC = 2;
std::shared_ptr&amp;lt;AMediaFormat&amp;gt; aacAudioFormat(AMediaFormat_new());
AMediaFormat_setString(aacAudioFormat.get(), AMEDIAFORMAT_KEY_MIME, &quot;audio/mp4a-latm&quot;);
AMediaFormat_setInt32(aacAudioFormat.get(), AMEDIAFORMAT_KEY_AAC_PROFILE, AAC_OBJECT_LC);
AMediaFormat_setInt32(aacAudioFormat.get(), AMEDIAFORMAT_KEY_SAMPLE_RATE, 8000);
AMediaFormat_setInt32(aacAudioFormat.get(), AMEDIAFORMAT_KEY_CHANNEL_COUNT, 1);
AMediaFormat_setInt32(aacAudioFormat.get(), AMEDIAFORMAT_KEY_BIT_RATE, 8000 * 16);

media_status_t mediaStatus;
mediaStatus = AMediaCodec_configure(audioEncoder, aacAudioFormat.get(), nullptr, nullptr, 0);
if (mediaStatus != AMEDIA_OK) {
  LOGE(&quot;Configure audio encoder failed.&quot;);
  return false;
}

mediaStatus = AMediaCodec_start(audioEncoder);
if (mediaStatus != AMEDIA_OK)
{
  LOGE(&quot;Starting audio encoder failed&quot;);
  return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MediaMuxer 초기화.&lt;/p&gt;
&lt;p&gt;NDK에서 MediaMuxer를 생성 하려면 int 타입의 unix File Descriptor가 필요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Java에서는 그냥 파일 경로만 지정해 주면 됐었는데 여기서는 어떻게 하는걸까...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span&gt;Applications should not create their own file descriptors.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;이렇게 써있는데 쓰라는건지 말라는건지.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음의 과정을 거쳐야 하는구나.&lt;/p&gt;
&lt;p&gt;Java Storage Path -&amp;gt; full path -&amp;gt; File -&amp;gt; FileOutputStream -&amp;gt; FileDescriptor -&amp;gt; pass jni -&amp;gt; NativeFileDescriptor -&amp;gt; unix fd -&amp;gt; MediaMuxer.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;할 일&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java Recorder Class 에 FileDescriptor 설정 함수 만들기&lt;/li&gt;
&lt;li&gt;jni 에 바인딩 할 함수 만들기&lt;/li&gt;
&lt;li&gt;c++ 클래스에 전달하기&lt;/li&gt;
&lt;li&gt;FileDscriptor -&amp;gt; unix file descriptor 로 변환하기&lt;/li&gt;
&lt;li&gt;RecordingActivity에서 FileDscriptor얻기&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/29</guid>
      <comments>https://universehan.tistory.com/29#entry29comment</comments>
      <pubDate>Sun, 28 Mar 2021 16:56:35 +0900</pubDate>
    </item>
    <item>
      <title>Layoff</title>
      <link>https://universehan.tistory.com/28</link>
      <description>&lt;p&gt;다니고 있는 회사가 일정기간동안 레이오프에 들어간다고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;신기한 점은 갑자기 모든 직원을 미리 다 모아서 회사의 상황이랑 재정상황을 다 공개하고 어떻게 할지 협상에 들어갔다. 한국에서랑은 약간 다른 느낌의 대처라서 신기했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;핀란드 같은 경우는 노동조합에 가입이 되어 있으면 실업을 할 경우 거의 90%에 해당하는 실업급여가 나온다. 그래서 그런지 다른 동료들이 레이오프라고 해도 별로 걱정을 하는 분위기는 아니다. 하지만 나는 어디에 가입을 해야할지 몰라서 망설이다가 가입을 하지 못했다. 큰일이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;레이오프 초반에는 많은 팀이 스스로의 팀은 중요한 팀이기 때문에 레이오프 대상이 되기는 힘들것이라고 했다. 하지만 현재 지출의 70%를 줄이는것이 목표라고한다. 어떻게 하는것이 좋을까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;나는 가능하면 빨리 결단을 내리고 안전하게 이직준비를 하는것이 좋을것 같다라는 판단을 했다. 그래서 자발적 레이오프에 먼저 지원을 했다. 보통은 레이오프를 하게되면 위로금이 나온다고 하던데. 어떨지 모르겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이직을 위해 온라인코딩테스트 연습을 하고 있는데 쉽지 않다. 그래서 이직을 잘 할 수 있을까? 이직은 언제나 어렵다..&lt;/p&gt;</description>
      <category>핀란드</category>
      <author>universehan</author>
      <guid isPermaLink="true">https://universehan.tistory.com/28</guid>
      <comments>https://universehan.tistory.com/28#entry28comment</comments>
      <pubDate>Sat, 27 Mar 2021 21:15:08 +0900</pubDate>
    </item>
  </channel>
</rss>