728x90
반응형

제텔카스텐 (Zettelaksten)

 제텔카스텐은 독일어로 메모를 뜻하는 제텔과 상자라는 뜻의 카스텐을 합쳐서 만든 단어로, 독일 빌레펠트 대학 사회학 교수인 니클라스 루만이 개발한 지식 관리 시스템이다. 니클라스 루만 교수는 잘 정리된 제텔카스텐 체계를 활용해 약 30년 간 9만 개의 메모를 작성했고, 350편의 논문과 58권의 책을 집필했다고 한다.
 

 블로그나 노션에 내용을 정리하다보면 카테고리를 분류하기 어려운 경우가 종종 있다.
예를들면 Python과 MongoDB 연동하기, Ubuntu에 Docker 설치하기 등 2가지 이상의 주제가 한 개의 글에 겹칠 때인데 블로그나 노션, 책과 같은 일반적인 글들은 목차와 범주가 있어 트리 구조로 글이 분류되어 있기 때문이다. 하지만 제텔카스텐은 원자화된 메모(노드)간의 연결을 통해서 그래프 형태로 관리되기 때문에 Python과 MongoDB, Ubuntu와  Docker처럼 각 주제를 메모하고 각 주제를 통합하는 메모를 작성하고 연결을 지정하여, 직접 분류하지 않아도 서로 연관되는 메모들끼리 모이도록 관리한다.
일종의 군집화나 수동으로 학습시키는 인공지능이라고 생각할 수 있을 것 같다.
내용이 충분하게 축적되어 있고 구조가 복잡할수록 제 2의 뇌라고 불릴만큼 효과적인 체계가 된다.
 
제텔카스텐을 제대로 구축하려면 지켜야할 기본적인 원리들이 있다.

  • 원자성 : 각 노트에는 하나의 아이디어만 기록한다.
  • 자율성 : 각 노트는 관련있는 다른 노트로 이동, 처리, 분류하고 연결할 수 있어야 한다.
  • 항상 다른 노트와 연결하기 : 새로운 노트는 기존 노트와 반드시 연결해줘야 한다.
  • 연결 이유 설명하기 : 다른 노트와 연결되는 이유를 항상 설명해야한다.
  • 자신의 언어를 사용하기 : 작성할 내용을 내가 이해하고 나만의 언어로 다시 적어야 한다.
  • 참고 자료 보관하기 : 자료의 정보와 출처를 기록한다.
  • 나의 생각 기록하기 : 아이디어가 떠오를 때 원칙을 지켜 작성한다.
  • 직접 분류하지 않기 : 카테고리를 직접 만들지 말고 연결에 더 신경써야 한다.
  • 연결 노트 만들기 : 연관성이 없어 보이는 노트의 연관성을 찾았을 때, 노트를 설명해줄수 있는 연결 노트를 만든다.
  • 목차 만들기 : 노트가 특정 주제로 통합되는 경우는 목차 노트를 만들어서 서술, 논쟁할 수 있도록 순서를 배치한다.
  • 노트 삭제 절대 금지 : 오래된 노트를 삭제하지 말고 왜 문제인지 설명하는 새로운 노트와 연결한다.
  • 과감하게 노트 만들기 : 사용하지 않는 노트가 작성된다고 하더라고 시스템에는 문제가 없다.
  • 최대한 많이 연결하기

아래 웹 사이트에서는 니클라스 루만이 남긴 실제 노트를 볼 수 있다. 
https://niklas-luhmann-archiv.de/

Niklas Luhmann-Archiv

niklas-luhmann-archiv.de

 


옵시디언 (Obsidian)

 
 옵시디언은 노션과 같은 마크다운 에디터이다.
다양한 플러그인들과 연동할 수 있고 디스코드나 카카오 오픈 채팅 등 국내 사용자 커뮤티니가 존재한다.
옵시디언의 장점이자 단점은 로컬에서 작동된다는 점인데, 메모가 클라우드에 저장되는 노션과 달리 로컬에만 저장된다는 점은 장점이지만 인터넷을 통한 접근이 어렵다는 것과 백업, 동기화 등의 작업이 따로 필요하다는 점은 단점이라고 볼 수 있을 것 같다. 
 템플릿을 지정하여 노트의 양식을 정의해둘 수 있고 그래프 뷰 기능이 있어 메모간의 연결 구조를 UI로 볼 수 잇다. 제텔카스텐 기법을 적용하기에 적합한 지식 관리 툴이라고 생각한다.
 
아래는 옵시디언 사이트에 접속하면 가장 먼저 보이는 문구이다.

 
 오픈소스는 아니지만 개인이 사용할 경우 무료이고 동기화 기능은 매월 10달러 정도의 비용이 필요하다.
옵시디언을 다루는 내용은 직접 툴을 사용해보고 추가로 작성할 예정이다.
다운로드는 아래 링크에서 할 수 있다.
https://obsidian.md/

Obsidian

Obsidian: A knowledge base that works on local Markdown files.

obsidian.md

 
 
 

728x90
반응형
728x90
반응형

실기 시험 대비 방법 및 후기

 코로나 확진으로 인해 2회차 실기를 못봐서 3회 시험을 바로 신청했다. 정보처리 기사 실기 시험 대비를 위해 먼저 아래 수제비 문제집을 구입했다.

1권을 거의 다 풀고 기본 내용을 반복적으로 공부했고, 아래 CBT 사이트에서 문제를 반복적으로 풀면서 외웠다. 

앱스토어(또는 play 스토어)에서 정보처리기사를 검색해 나온 어플로 두음 암기도 했다..!

SQL 중 1문제가 이전 기출 중에서 동일하게 출제되어, 정답을 바로 적을 수 있었고 두음암기도 처음엔 효과를 의심했지만 막상 시험장에선 그것만 생각났다.

 

https://q.fran.kr/%EC%8B%9C%ED%97%98/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC%20%EC%8B%A4%EA%B8%B0

 

기출문제 문제은행

각종IT시험, 공인중개사 등 답있는 기출문제 시험 자격증 족보

q.fran.kr

 

 물론 위 내용을 공부한 내용들 중 시험에 나오지 않은 부분이 훨씬 많지만 부분점수가 존재하고, 기출범위가 넓은 실기 시험 특성 상 평소에 조금씩이라도 꾸준히 공부하는 방법이 유리할 것 같다. 그리고 프로그래밍과 SQL 문제만 다 맞춰도 합격 확률이 매우 올라간다. (개인적으론 프로그래밍도 1문제 틀렸고, 못적은 답도 많았지만 부분점수 덕분에 겨우 합격한 것 같다.)


 

2022년 3회 실기 가답안 및 문제

 시험 직후 아래 사이트를 보고 가답안과 부분 점수를 계산했는데 거의 실제 문제와 유사하게 정리된 것 같다.

3회 문제 내용을 대략적으로 알고 싶다면 아래 링크도 추천한다.

https://www.gisafirst.com/board/n1/view.php?offset=0&tq=1393907668&reqCategory=&idx=425&word=&s_type=&s_content=&s_terms= 

 

온라인IT자격증의 시작 기사퍼스트로 대비하세요.

정보공유 >> 가답안 * 가답안 복원과 무관한 글은 사전 통보 없이 삭제하겠습니다.* 22년 3회 정보처리기사 실기 시험은 10월 16일 (일) 오전 9:00 시행됩니다.10월 16일 시험 당일 가답안이 진행될 예

www.gisafirst.com

 


결과

 

728x90
반응형
728x90
반응형

코로나 확진..

2022년 7월 24일 일요일에 예정되어 있던 2회차 실기 시험을 코로나 확진으로 인한 격리 때문에 응시하지 못했다..
그래서 실기 시험 비용을 환불 받으려고 했지만, 필요한 (귀찮은)서류들도 많았고 공지사항이나 양식들이 숨어(?)있어서 찾기부터 힘들었다.

 

그리고 결론부터 말하자면 이 글을 작성하는 시점에 환불은 실패했다.
하지만 코로나 확진자가 다시 늘어나면서 나처럼 격리로 인해 시험에 응시하지 못하는 경우도 많아 질 거라고 생각했기 때문에 찾아본 방법을 공유하려고 한다.

 

이제 어디서 어떻게 환불을 받을 수 있는지 알아보자. (참고로 집에 프린터와 스캐너가 있다면 좋다.)


 

코로나 확진 시 큐넷 기술자격 환불하기

 우선 코로나 환불이라는 키워드로 관련된 공지사항들을 찾았다.

아래 링크를 누르면 볼수 있는데 환불이 아닌 다른 내용들도 같이 있어 환불과 관련된 내용만 캡쳐해보았다.

 

http://www.q-net.or.kr/man004.do?id=man00402&gSite=Q&gId=&BOARD_ID=Q001&&ARTL_SEQ=5208108


 확진 환자와 자가 격리자는 시험일이 겹칠 경우, 시험일 이후 30일까지 원서 접수 수수료를 100%환불 신청할 수 있다고 적혀있지만 제출해야할 서류들이 몇 가지 있는 것 같다.

 

  • 환불 신청서 : 큐넷 -> 고객지원 -> 자료실 -> 각종 서식 -> "검정수수료 환불신청서" 에서 다운로드가 가능하다.
  • 출입국 사실 증명 또는 증빙서류 : 의료기관 또는 국가기관의 증빙 서류로 격리해제 확인서를 제출하려고 한다.
  • 신분증 사본 : 신분증의 사본
  • 주민등록등본 : 본인이 아닌 가족이 해당될 경우, 필수적으로 제출해야 한다. (본인이 확진자일 경우 필수는 아닌 것 같다.)

 


 

서류들을 모아보자

 먼저 환불 신청서의 양식은 큐넷에서 찾았다. 그런데 파일은 hwp와 pdf로만 제공해준다.

파일 열어보기 귀찮을까봐 이미지로 붙여두었고, 이미지 하단에 다운로드 링크도 있다.

https://www.q-net.or.kr/cst006.do?id=cst00602&gSite=Q&gId=

 

 사실 나는 여기서 환불에 대한 의지가 약해졌다.

한글 양식인데 한글이 없어 수정하지 못했고, 만약 한글이 있다고 해도 서명을 어떻게 해야하는지 고민이 되었다.

남은 방법은 직접 프린트해서 작성하고 스캔한 뒤에 메일로 전송해서 (일정 기간이 지난 후) 계좌로 환불받는 것인데,

난 집에 스캐너가 없었다.. (스캔할 곳을 찾아가서 비용을 지불해야됨) 

 

 격리해제 확인서는 격리 당사자라면 보건소(또는 병원)에서 격리가 끝난 뒤에 전달해줄 것이다.

환불 신청 기간은 30일로 넉넉한 편이기 때문에 그냥 기다리면 된다.

 

마지막(확진된 당사자일 경우에) 신분증 사본을 구하려면 스캐너가 또 필요하다..!

그리고 만약 본인이 아니라 가족이 확진되어 시험을 못봤다면, 주민등록등본을 구해와야 한다.

이건 인터넷 발급을 통해 오히려 쉽게 구할 수 있을 것 같다. (만약 인터넷 발급이 안된다면 주변 지하철 역의 무인발급기를 찾아보자)

 

만약 집에 프린터와 스캐너가 있고 격리가 끝나게 되어 서류를 다 모았다면 이제 메일로 전송해주면된다.


 

어디로?

 어디로 보내야 할 지 몰라서 구글 검색을 해봤지만 나오지 않았다.

Q-Net의 검색 창에서 검색해서 찾았는데, 지역마다 보내야 하는 메일 주소가 다른 것 같다.

링크도 있지만 공지사항으로 등록된 글이라 나중에 없어질 수도 있을 것 같다고 생각해서 이미지도 붙여놨다.

 

우선 링크는 https://www.q-net.or.kr/man004.do?id=man00402&gSite=Q&gId= 이고 이미지는 아래에 있다.

아래 이미지와 링크를 참조해서 모아둔 파일들을 전달해주자.

https://www.q-net.or.kr/man004.do?id=man00402&gSite=Q&gId=

 

여기까지 진행했다면 드디어 시험비 22600원을 환불 받을 자격이 생겼다!! (언젠가)

 

위에 자료들을 찾아 모으면서 느낀점이 있다면 정말 환불해주기 싫어한다는 생각뿐이었다.

너무 분해서 어떻게든 환불을 받아보려고 했지만 결국 실패했다..

 

만약 코로나에 걸리게되어 나랑 비슷한 상황이 생겼고, 집에 스캐너도 있다면 꼭 환불받길 바란다.

 

728x90
반응형
728x90
반응형

 

정보처리기사

 정보처리기사는 국가 자격증이다.

과학기술정보통신부에서 주관하고, 한국 산업인력공단에서 시행한다.

 

1년에 3회 시행되며, 필기 시험과 실기 시험으로 나눠진다.

시험 응시 자격은 관련 학과 학사 학위(또는 취득예정자) 또는 현업에서 일정 기간 이상 종사를 요구하지만,

정보기술 분야에 포함되는 자격증이므로 4년제 대학교 졸업자라면 학과에 상관없이 응시가 가능하다. (고용노동부고시 제2012-49호 "국가기술자격의 종목별 관련학과 고시")

시험의 응시는 아래 사이트에 로그인하고 일정에 맞춰 지원하고 결제하면 된다.

 

* 참고로 2020년 이후로 개편되어 난이도가 올라갔다.

로그인 시 모바일 공인인증서도 지원해주는데 편한 것 같다.

 

https://www.q-net.or.kr/man001.do?&gSite=Q&gId= 

 

Q-net 자격의 모든것

 

www.q-net.or.kr


 

필기 시험 대비

 공부 방법에 정답은 없지만, 적어도 정처기 필기 시험에 대해선 아래 사이트가 제일 좋은 것 같다.

최신 회차의 시험 문제와 정답, 풀이를 제공해준다.

따로 문제집 사지 말고 아래 사이트에서 무료로 다운받아서 풀자.

 

https://www.comcbt.com/xe/iz

 

정보처리기사 필기 기출문제 - 최강 자격증 기출문제 전자문제집 CBT

정보처리기사 필기 기출문제 전자문제집 CBT

www.comcbt.com

 

난 아래 방법으로 공부해서 약 6회 정도를 풀었고 그 중 4회 정도 합격한 상태에서 시험봤다. (총점 73점)

 

  • 2020년 이후 문제집 다운로드받아 풀고 틀린거, 모르는거 체크
  • 틀린 문제에서 모르는 용어 찾아보기
  • 합격 때까지 반복

 

* 2022년 2회 필기 합격, 정기 기사 2회 실기는 6월 20일 ~ 23일 지원 예정, 공부 방법은 좀 더 연구해보겠다.

728x90
반응형
728x90
반응형

 

질문 전 확인 사항

  • 중요도 : 질문을 통해 면접관이 확인하고 싶은 내용들의 우선 순위
     
    1. 업무 능력
    2. 커뮤니케이션
    3. 협력

 

  • 포커스 : 통상적인 기술 면접과 임원 면접에서 각각 집중되는 내용
     
    1. 기술 면접 : 직무 관련 부분으로 해당 기술 팀의 팀장 등 실무자와 면접을 진행한다.
    2. 임원 면접 : 회사의 임원진과 진행하는 면접으로 인성과 태도, 조직과의 융화도에 초점을 둔 인성 면접이라고 생각 할 수 있을 듯 하다.

 

  • 구조화 면접 : 면접관의 경험과 판단에 의한 면접은 확증편향으로 인한 잘못된 판단의 위험이 있다. 이런 문제를 해결하기 위해 지원자에게 미리 체계적으로 구조화된 질문을 던져 답변하는 방식을 기반으로 판단하는 구조화 면접을 기반한 채용 과정들이 도입된다. 아래는 구글이 생각하는 구조화 면접의 요소들이라고 한다.
     
    1. 직무와 관련된 검증된 질 좋은 질문들
    2. 면접관들의 기록 (지원자의 답변에 대해 종합적인 피드백 등)
    3. 모든 평가자들이 표준화된 기준에 따라 점수를 받음
    4. 면접관 교육

 


 

예상 질문 및 답변 ( 사람인 참고 )

 

  • 간단하게 자기소개 먼저 해주세요 (1분 자기소개) 또는 지원동기가 무엇인가요?
  • 이 회사에 적합한 인재라고 생각하는 이유가 있나요?
  • 살면서 가장 힘들었던 경험이 무엇이고 있다면 어떻게 극복했나요?
  • 갈등이나 불화를 겪은 경험이 있나요? 있다면 어떻게 해결했나요?
  • 남들과 차별화되는 강점이 무엇인가요?
  • (공백기가 있다면) 공백기 동안 무엇을 했나요?
  • 지원 직군에 가장 중요한 역량은 뭐라고 생각하나요?
  • 전 직장에서 가장 크게 기여한 부분이 무엇인가요?
  • 이전 직장에서 이해관계자들과의 관계를 어땠나요?
  • 우리 회사의 경쟁사를 알고 있나요??
  • (첫 이직 또는 이직횟수가 적은 경우) 이직에 대한 계기, 그만둔 이유
    ** 회사가 해결해 줄 수 없는 문제 제시 (학업, 가정사, 개인사, 업무발전 등)
  • 다른 회사에 갈 수도 있었는데, 우리 회사에 오고 싶은 이유는?
  • 우리 회사에 대해서 어떻게 생각 하나요? 
  • 입사 후 바라는 점이 있나요? (또는 입사 후 포부가 뭔가요?)
  • 본인의 꿈이 뭔지 설명해 줄 수 있나요?
  • 회사에서 어떤 걸 얻고 싶은지, 어떤 사람이 되고 싶은지 설명해줄 수 있나요 ?
  • 회사 상품을 보면서 느낀 생각이 있나요? 우리 회사의 강약점이 뭐라고 생각하나요?
  • 우리 회사의 경쟁력이 뭐라고 생각하나요?
  • 야근에 대해서 어떻게 생각하나요?
  • 상사와 의견대립이 있다면 어떻게 할 건 가요?
  • 마지막으로 질문하고 싶은건 없나요?
    ** 회사에 대한 나의 적극성과 관심도 표현하기

 

구조화 면접 질문

  • 대인관계 능력
  1. 어떤 일에 있어 다른사람들을 설득하여 목표를 이뤄낸 경험이 있나요?
  2. 다양한 상황이나 환경에 잘 적응한다는 걸 설명할 수 있는 경험이 있나요?
  3. 같이 일하는 사람들과 갈등이 있었던 적이 있나요? 있었다면 어떻게 행동했고 결과는 어땠나요?
  4. 당신은 주로 어떤 방법으로 갈등을 조절하나요? 갈등을 성공적으로 조정한 사례를 소개해주세요.
  5. 상대방과 협상했던 경험 중 가장 어려웠던 적이 있으면 소개해주세요. 당신은 어떻게 했고, 협상 결과는 어땠나요?

 

  • 직무 수행 능력
  1. 동시다발적으로 일어난 일들을 처리해야 했던 경험과 해결했던 방법을 알려주세요.
  2. 살면서 중요한 결정을 내려야 했던 경험이 있나요? 있다면 한가지만 예로 들어주고, 현재엔 어떤 영향이 있는지도 말해주세요.
  3. 직무 분야에서 성장하기 위해 지난 2년간 노력했던 것 들을 2 가지 소개해주세요.
  4. 당신이 했던 일이 부정적인 피드백을 받았던적이 있나요?
  5. 자기개발을 위해 지금 하고 있는게 있나요?
  6. 미리 잠재적인 문제가 발생할 것을 예상하여 예방적 차원의 조치를 했던 경험이 있나요?
  7. 올바른 판단력과 논리적인 사고를 통해 문제를 해결했던 사례가 있다면 구체적으로 말해주세요.

 

  • 유연성/ 적응력
  1. 지난 2년간 당신이 업무를 수행하며 변화를 주어야했던 것이 있다면 소개해주세요.
  2. 다른 사람을 변화시켜야 할 책임이 있었던 상황이 있나요? 있다면 어떤 역할을 수행했고 결과는 어떤가요.
    다시 돌아간다면 다른 방법을 시도할 건가요?
  3. 지난 기간동안 이뤄낸 주된 변화가 있나요? 있다면 어떻게 이뤄냈나요?
  4. 프로젝트를 수행하면서 난관에 봉착했던 경험을 말해주세요. 어떻게 극복했나요.

 

  • 시스템적 사고
  1. 현재 수행하는 업무가 조직의 임무와 목표를 달성하는데 어떤 영향을 주고 있다고 생각하나요.
  2. 당신의 현재 업무가 조직에 중요하다고 생각하나요? 그렇다면 왜 그렇게 생각하는지 알려주세요.
  3. 당신에게 기대된 수준 이상으로 직무를 수행한 경험이 있다면 알려주세요. 
    어떤 계기로 추가적인 노력을 하게 되었나요? 다른 동료들도 자발적으로 추가적인 노력을 한 걸 알고 있나요?
    알고있었다면 피드백이 있었나요?
  4. 당신이 속한 조직이나 직무 영역의 성과를 높이기 위해 이루어낸 변화가 있다면 설명해주세요.
    어떻게 그 아이디어를 떠올리게 되었고 실행을 위해 어떻게 했나요?
  5. 조직내에서 했던 결정이 조직 외적으로 의도치 않은 결과를 가져온 적이 있나요?

 

  • 비전/ 목표
  1. 입사 후 포부가 무엇입니까?
  2. 입사 5년 후, 10년 후 자신의 모습은 어떨 것이라고 생각합니까?
  3. 본인의 직업관은 무엇입니까?
  4. 당신에게 일이 왜 중요합니까?
  5. 직장은 어떤 면을 보고 선택합니까?
  6. 일하는 목적이 무엇입니까?
  7. 과거 근무 경험에서 가장 크게 배운 점은 ?
  8. 어떤 회사가 훌륭한 회사라고 생각합니까?
  9. 인생에서 가장 필요한 사항은 무엇이라 생각하나요?
  10. 중소기업을 선택한 이유가 무엇입니까?
  11. 바람직한 사원상은 무엇이라고 생각합니까?
  12. 일과 사생활에 대해서 어떻게 생각합니까?
  13. 인생의 목표는 무엇입니까?
  14. 회사 근무를 하면서 가장 중요하다고 생가가하는 것은 무엇입니까?
  15. 기업의 사회적인 책임은 무엇이라고 생각합니까?
  16. 어떤 아이템을 가지고 어떤 일을 해보고 싶습니까?
  17. 본인이 리더로 추진했던 일이 있습니까? 있다면 어떤 성과가 나왔는지 말해보세요.
  18. 본인은 따라가는 스타일입니까, 아니면 주도하는 스타일입니까?
  19. 자신의 능력을 벗어난 업무가 주어진다면 어떻게 하겠습니까?
  20. 인생에서 가장 열정적인 순간은 언제였습니까?
  21. 어린 시절의 꿈이 있습니까?
  22. 인생 최종 목표(또는 꿈)은 무엇입니까?

 

  • 조직적응력
  1. 어떤 경영 스타일일 때, 자신의 능력이 최대가 되나요?
  2. 상사의 말이 확실히 틀렸을 다면 어떻게 할건가요?
  3. 본인 만의 커뮤니케이션 방법이 있나요?
  4. 집안이 무너질 때 도와줄 친구는 몇 명인가요?
  5. 직원으로서 필요한 덕목이 무엇이라고 생각합니까?
  6. 입사 후 회사와 맞지 않는다면 어떻게 하시겠습니까?
  7. 어떤 유형의 사람을 싫어하나요?
  8. 어울리기 힘들었던 사람과 공동의 이익을 만들 수 있었던 경험이 있다면, 그 경험에 대해서 말해주세요.
  9. 조직에서 무언가 성취해본 경험이 있나요?
  10. 어떤 상황에서 스트레스를 받나요?
  11. 본인의 업무스타일은 어떤 유형인가요?
  12. 업무강도가 센 편입니다. 괜찮습니까?
  13. 상사와 의견이 다를 때는 어떻게 대처할 건가요?
  14. 상사가 부당한 업무지시를 시킨다면 어떻게 할 건가요?
  15. 남이 하기 싫어하는 일을 한 경험을 말해보세요.
  16. 노래방에서 몇시간이나 놀 수 있나요?
  17. 거래처와의 갈등이 있을 경우 어떻게 대처하겠습니까?
  18. 고객이 불만사항을 제기하면 어떻게 해결하겠습니까?
  19. 단체활동에서 의견 충돌이 일어날 경우 어떻게 해결하겠습니까?
  20. 대인관계에서 가장 중요하게 생가가하는 건 뭔가요?
  21. 오늘 면접 보는 지원자들 중 누가 제일 먼저 말을 걸었습니까?

 

  • 관심사/ 가치관
  1. 봉사 활동을 특별히 많이 했는데, 기업의 사회 환원 활동에 대한 본인의 생각은 어떻습니까?
  2. 가장 존경하는 인물은 누구입니까?
  3. 가장 인상 깊게 본 영화가 뭐고 이유는 뭔가요?
  4. 가장 존경하는 인물로 부모님을 언급했는데, 이유가 있나요?
  5. 매일 아침 신물을 읽는다고 했는데, 오늘 아침 신문의 톱기사는 무엇입니까?
  6. 한 달에 책을 몇권 정도 읽나요? 
  7. 본인만의 스트레스 해소법이 있나요?
  8. 정보를 수집할 때 효율적인 자신만의 방안이 있나요?
  9. 공익과 사익 중 무엇을 더 추구해야 한다고 생각합니까?
  10. 평소에 결정할 때 과감하게 하는 편입니까? 아니면 신중하게 하는 편입니까?
  11. 본인의 가치관에 대해 말해보고 그 가치관이 우리 회사에선 어떻게 발휘 될 것인지 설명해보세요.
  12. 만약 일할 때 로비나 뒷거래가 일어난다면 어떻게 해결할 건 가요?

 

  • 돌발/ 창의성
  1. 당신이 면접관이라면 어떤 걸 중심으로 평가하겠습니까?
  2. 한 달을 시한부로 살 수 있고, 5000만원의 돈이 주어진다면 어떻게 사용할 건가요?
  3. 빨간 벽돌을 건축자재 외에 사용할 수 있는 용도를 최대한 많이 말해보세요.
  4. 읽지않은 이메일이 2000통 있습니다. 이중 300통만 답변이 가능하다면 어떤 것 부터 하겠습니까?
  5. 전국에 치킨집이 몇개 있을까요?
  6. 서울 시내의 중국집 전체의 하루 판매량을 논리적인 근거를 제시하여 정산해보세요.
  7. 아이들을 웃게하는 방법이 뭘까요?
  8. 자신이 얼마짜리 사람이라고 생각하나요?
  • 압박질문
  1. 다른 회사도 지원했습니까?
  2. 다른 회사는 전형이 어디까지 진행되었습니까?
  3. 다른 회사에도 합격하면 어디에 입사할 건가요?
  4. 열심히 일하겠다고 밝혔는데, 구체적으로 어떻게 열심히 할건가요?
  5. 우리 히사에 지원했다가 떨어진 이력이 있는데, 그 때는 왜 떨어진거 같나요?
    다시 지원한 이유가 있나요?
  6. 다른 회사에 지원했다가 떨어진 이유가 뭔가요?
  7. 면접을 본 다른 기업이 있습니까?
  8. 우리 회사에 떨어진다면 어떻게 할 건가요?
  9. 본인이 오늘 면접에 떨어진다면 이유가 무엇이겠습니까?
  10. 직무가 바뀌어도 괜찮습니까?
  11. 입사 후 희망 부서에 배치되지 않는다면 어떻게 할 건가요?
  12. 다른 지원자에 비해 스펙이 부족한 것 같은데 어떻게 생각하세요?
  13. 스펙이 굉장히 좋은데 왜 이 일을 하려고 하나요?
  14. 해외 경험이 많은데 경비를 어떻게 조달했나요?
  15. 군대 면제인데, 그 이유는 무엇인가요?
  16. 업무에 도움이 될만한 자격증이 없는ㄴ데, 업무에 지장이 있지 않을까요?
  17. 개인과 조직 어느 것이 더 중요하다고 생각합니까?
  18. 기존 직원들보다 나이가 많은데 잘 어울릴 수 있을까요?
  19. 학점이 낮은 이유가 뭔가요?
  20. 스트레스를 잘 받을 것 같은데 실제로는 어떤가요?
  21. 여자가 사회생활에 더 불리하다고 생각하나요?
  22. 공백기에 대해 설명해주세요
  23. 동기들보다 급여 처우가 안좋다는 걸 알게되면 어떻게 대처하겠습니까?
  24. 자신이 옆 지원자들보다 어떤 게 뛰어나 뽑혀야한다고 생각합니까?
  25. 몇 번째 면접인가요? 그동안 왜 떨어졌다고 생각하세요?

 

  • 기업/ 직무 적합도 및 관심도
  1. 해당 직무와 전공이 맞지 않는데 왜 지원했나요?
  2. 해당 업종의 최근 이슈에 대해서 말해보세요
  3. 지원 직무를 위해 본인이 준비한 것이 있나요?
  4. 우리 회사 매장에 다녀온 소감이나 개선해야 할 점을 말해보세요
  5. 우리 회사의 사업 문야에 대해 아는 대로 설명해주세요
  6. 우리 회사 인재상에 본인이 해당하는 한가지와 그 이유에 대해 말해보세요
  7. 우리 회사의 장단점이 뭔가요
  8. 우리 회사의 이미지가 어떤가요
  9. 지원한 직무가 본인에게 잘 맞는 직무라고 생각하나요?
  10. 우리 회사를 알게 된 경로는 무엇인가요?
  11. 우리 회가가 왜 지원자를 뽑아야 한다고 생각합니까?
  12. 입사를 위해 어떤 노력을 했습니까?

 

  • 대외활동 및 성격
  1. 갈등이나 좌절 경험이 있나요? 있다면 어떻게 극복했나요?
  2. 본인의 차별화된 강점이 있나요?
  3. 본인의 장단점에 대해 말해주세요.
  4. 본인의 의사결정 노하우가 있습니까?
  5. 자신을 색깔로 표현한다면 어던 색이고, 그 이유는 무엇입니까?
  6. 본인의 성격을 한 단어로 표현하여 이를 역량과 연관지어 말해보세요.
  7. 가장 소중하게 생가가하는 것은 무엇입니까?
  8. 본인의 단점 3가지만 이야기해 주세요.

 

참고 자료 및 링크

728x90
반응형
728x90
반응형

 

포스팅 이유

최근에 IT 직군으로 취업을 준비하면서 기술면접에 대한 질문 내용을 찾던 중 설로인이라는 회사에서 공개한 질문 목록을 찾았다.
꽤 넓은 분야에 관련된 좋은 질문들이 있어서 작성했다.

먼저 원본 질문의 링크이다.
https://github.com/sirloin-dev/meatplatform/blob/master/job-description/interview-questions.adoc
 

GitHub - sirloin-dev/meatplatform: 설로인의 육류 플랫폼 서비스를 소개합니다!

설로인의 육류 플랫폼 서비스를 소개합니다! Contribute to sirloin-dev/meatplatform development by creating an account on GitHub.

github.com

 

 

목차

  • 경력 관리 및 협업
  • 운영체제 / 논리회로 일반
  • 네트워크
  • 데이터 베이스
  • 자료 구조 및 알고리즘
  • 디자인 및 테스트
  • Java / JVM
  • Kotlin
  • Python
  • NodeJS
  • Android
  • ios
  • Web

 

경력 관리 및 협업

  • 설로인 입사 이후, 3년 뒤 후보자의 모습, 10년 뒤 후보자의 모습에 대해 말씀해주세요.
  • 수습 기간동안 어떻게 본인의 능력을 팀에게 증명해 보이시겠습니까?
  • 일을 하던 중에, 다른 업무 요청이 들어온다면 어떻게 상황을 조율하시겠습니까?
  • 제일 재미있게 들었던 학교 수업, 또는 최근 흥미가 있거나 재미있었던 개발 관련 소식 / 또는 해본 일중 기뻤거나 슬픈 일
  • 후보자님께서 소프트웨어 엔지니어의 길을 걷기로 결심한 이유에 대해 말씀해 주세요.
  • 납득가지 않는 일을 떠 맡게 되었다면, 갈등을 어떻게 해결하시겠습니까?
  • 코드 리뷰에서 동료 코드의 어떤 점을 가장 중요하게 체크하시나요?
  • 코드의 품질을 정의하는 후보자님만의 기준이 있습니까?
  • Continuous Integration 의 중요성에 대해 설명해주세요.
  • OpenJDK 는 GNU GPL 라이선스로 배포됩니다. GNU GPL 이 뭔가요?
  • 정규표현식을 유용하게 사용한 경험이 있습니까? 또는 불편한 적은 없었나요?
  • 저희 회사는 후보자님이 자신있어 하시는 XX 기술을 쓰지 않고 있습니다. 그 기술을 반드시 도입해야 한다고, 면접관을 어떻게 설득하시겠습니까?
  • 업무 스케쥴링 하실 때, 시간 비용은 어떻게 산정하시나요?
  • Agile 이 대세라고 하는데, Agile 개발 방법론에 대한 본인의 생각을 말씀해 주세요. Agile 의 단점은 없습니까?

 

운영체제/ 논리회로 일반

  • 컴퓨터는 10진수를 2진수로 바꿔서 계산합니다. 10진수를 2진수로 바꾸는 방법과, 그 반대 방법에 대해 설명해 주시기 바랍니다.
  • 컴퓨터는 소숫점 계산을 잘 못합니다. 그 이유가 무엇일까요? 어떻게 문제를 해결할 수 있을까요? 직접 구현한다면 어떻게 하시겠습니까?
  • Thread 간의 데이터 공유와 Process 간의 데이터 공유의 공통점과 차이점을 설명해주세요.
  • 컴퓨터가 기계어를 읽고, 실행하는 과정에 대해 설명해 주실 수 있나요?
  • 운영체제가 여러 프로그램을 동시에 실행하는 원리에 대해 설명해주세요.
  • 컴파일러와 인터프리터는 어떤 차이가 있을까요?
  • Garbage Collection 이란 무엇일까요? Garbage Collection 방식 중 제일 잘 알고 계시는 GC를 아무거나 하나만 설명해주세요.
  • Garbage collection 이 있는 언어를 원자력 발전소, 자동차 동력 제어, 인공위성, 국가 전력망 제어시스템 같은 곳에 쓸 수 있을까요? 후보자님의 생각을 말씀해 주세요.
  • 지금 이용하시는 기술/언어에서 제일 마음에 드는점과 불만인 점 한가지를 말씀해주세요.
  • System call 이 뭔가요? System call 에 대해 설명해주세요.
  • 바이트코드와 기계어의 차이에 대해 설명해주세요.
  • Thread safety 란 뭔가요? 어떻게 구현해야 Thread safe 한 코드를 만들 수 있나요?
  • bytecode 기반 언어는 디컴파일에 특히 취약하다는 문제가 있는데, 언어를 바꾸지 않고 이를 해결할 방법이 없을까요?
  • 파이프(|) 란 무엇이고, 어떻게 동작하는지 설명해주세요.

네트워크

  • Socket 으로 바로 통신하는 것 대비 HTTP 는 비효율적인데도 왜 많은 앱들은 HTTP 를 쓰는 걸까요?
  • OSI Layer 7 또는 TCP Model 에 대해 설명해주세요.
  • 차세대 프로토콜로 논의중인 HTTP/3 은 UDP 기반의 QUIC 이라는 기술로 구현되어 있습니다. UDP 는 TCP 대비 안
  • 정성이 떨어지는 프로토콜이라고 하는데, 그럼에도 왜 UDP 를 채택한 걸까요?
  • SSL (또는 TLS) 가 어떻게 동작하는지 말씀해주세요.
  • HTTP 는 Stateless (상태가 없는) 통신 프로토콜이라고 합니다. 따라서, 상태가 없다면 가령 HTTP 를 쓰는 서비스는 매번 로그인을 해 줘야 하거나 사용자 정보를 저장하는 일이 불가능합니다. 그런데 실제론 그렇지 않죠. 어떻게 이런 불편함을 해소했을까요?
  • 웹 브라우저에 https://www.google.com URL 을 입력 후 enter 를 쳤을 때 일어나는 과정을 최대한 상세하게 설명해주세요.
  • HTTP(s) 프로토콜에서 바이너리 데이터를 전송하는 방식에 대해 설명해주세요.
  • Socket 으로 웹 페이지를 크롤링하는 HTTP 클라이언트를 직접 구현해야 한다면, 어떻게 하시겠습니까?

 

데이터 베이스

  • noSQL 과 RDB 의 특징, 차이에 대해 말씀해주세요. 어느 상황에 어떤 데이터베이스를 쓰는게 좋겠습니까?
  • 데이터베이스가 자료를 빠르게 검색하기 위해 어떤 일을 할까요? 최대한 상세하게 설명해주세요.
  • RDBMS 의 여러 JOIN 중 아무거나 하나 골라서, 그림으로 설명해 주실 수 있습니까?
  • 데이터베이스 샤딩 / 파티셔닝에 대해 설명해주세요.
  • 데이터베이스가 Index 를 이용해 자료를 빠르게 검색하는 과정을, 우리 할머니도 알아들을 수 있도록 설명해 주시겠어요?
  • Stored procedure 를 이용한 시스템을 어떻게 유지보수 할 수 있습니까? Stored procedure 의 장점과 단점에 대해 말씀해 주세요.
  • Optimistic Locking(낙관적 락) 과 Pessimistic Locking(비관적 락) 에 대해 설명해주세요. 각각의 락을 사용할 상황 또는 제품 사례를 말씀해주세요.
  • 어떤 서비스의 이용자 테이블이 있다고 가정합시다. 이용자 id 를 여러 테이블에서 FK 로 참조하고 있습니다. 그런데 이용자 테이블에 환경설정, 개인정보 등 정보를 한데 저장하다보니 Column 이 40개가 넘게 있는 상태입니다. 문제를 진단해 주시고, 해결 방안도 제시해 주시기 바랍니다.
  • Slow query 를 발견하고, 수정한 경험에 대해 말씀해 주세요.
  • 저희는 도축장에서 전달받은 원육을 소매점에 도매하는 서비스를 운영하고 있습니다. 여기서, 원육과 소매점을 어떻게 테이블로 모델링 하시겠습니까?
  • 어플리케이션의 문자열(String) 을 데이터베이스에 저장하기 위해 고려해야 할 사항에는 어떤 점이 있을까요?
  • Big data 를 다루려면 RDBMS 보다 NoSQL 이 더 좋다는 말이 많습니다. 그렇다면 large data set 에는 항상 NoSQL 만 써야 할까요? 반드시 RDBMS 만을 이용해 large data set 을 다루려면 어떻게 해야 할까요?
  • 실 서비스의 데이터를 조작하고, 또 조회해야 하는 Admin app 을 만들어야 한다면, 어떻게 구현하시겠습니까?
  • 데이터 마이그레이션 기간 동안 서비스 순단을 최소한으로 하고 싶습니다. 이런 요구사항에 맞는 테이블을 어떻게 설계하시겠습니까?
  • (JPA 경험자 한정) JPA 를 이용할 때, JPQL 을 쓰는 경우가 종종 있는데, JPQL 을 쓰시며 좋았던 점과 불편했던 점을 말씀해 주세요.
  • (JPA 경험자 한정) JPA 의 @Entity 란 뭔가요? 도메인 객체와 Entity 객체를 각각 어떻게 정의하시겠습니까?
  • (JVM 경험자 한정) 배열과 ArrayList, LinkedList 의 차이점은 무엇인가요?

 

자료 구조 및 알고리즘

  • 지금 사용하시는 스마트폰의 화면을 캡쳐하는 프로그램을 만들어야 한다면 어떻게 하시겠습니까?
  • 전화번호와 같은 민감한 정보를 어떻게 저장하는게 좋을까요? 관리자조차 모르게 저장하고 싶다면?
  • 암호화란 무엇일까요? 알고 계신 암호화 방식 아무거나 하나만 설명해주세요.
  • 어떤 알고리즘을 도입하기 전에, 성능을 판별해 보고자 합니다. 어떤 방법을 활용해, 어떤 기준으로 알고리즘의 효율을 판단하시겠습니까?
  • 공개 키 암호화와 비밀 키 암호화에 대해 설명해주세요.
  • 캡슐화에 대해 설명해주세요.
  • 캐시란 뭐고, 어떤 목적으로 쓰는 건가요?
  • List 와 Set 의 차이에 대해 설명해주세요.
  • 이진 탐색의 최선 / 최악의 경우에 대해 말씀해주세요.
  • 손실 압축과 무손실 압축의 차이에 대해 설명해주세요.
  • RSA 로 공개 키를 만들 때, 키 길이를 정하는 기준이 있습니까? 키 길이를 길게 하면 암호화 문제를 완벽 해결할 수 있나요?
  • 순환 Queue 를 만드려면 어떻게 하시겠습니까? 그리고 어떤 Queue 또는 Graph 가 무한 순환 구조라는 것을 어떻게 판단하시겠습니까?
  • 압축 알고리즘을 설계하라는 요구사항이 들어왔다면, 어떻게 구현하시겠습니까?
  • 전화번호부 앱을 만든다고 가정하겠습니다. 1명당 1KiB의 정보를 갖도록 모델을 설계했습니다. 앱이 온전히 사용할 수 있는 메모리가 4메가인 기기에서, 10000명(총 10메가)의 이용자 정보를 검색할 수 있도록 구현해야 합니다. 어떻게 하시겠습니까?
  • (JVM 경험자 한정) 배열과 ArrayList, LinkedList 의 차이점은 무엇인가요?

디자인 및 테스트

  • Singleton pattern 이란 무엇이고, 어떤 장점과 단점이 있을까요?
  • 싱글턴 코드는 테스트를 어렵게 만드는 문제가 있습니다. 왜 그럴까요? 싱글턴이 좋지 않다는데 왜 스프링 프레임워크 같은 녀석들은 별다른 규칙이 없을 때 기본으로 Singleton bean 을 만들까요?
  • 좋은 Test 라고 평가할 수 있는 가장 중요한 요소를 말씀해주세요. 후보자님은 어떤 Test 를 좋은 Test 라고 정의하십니까?
  • Callback function(또는 Closure) 이 뭔가요? 주의할 점이 있을까요?
  • Mutable, Immutable 이란 뭔가요? 각각은 어떤 특징이 있을까요?
  • Acceptance, Smoke, End-to-End, Integration, Unit test 같은 용어들을 본인만의 방법으로 구분짓는 기준이 있습니까?
  • 메소드의 파라미터로 전달한 객체를 메소드 내에서 마음대로 바꾸지 못 하게 하려면 어떻게 코딩하는게 좋을까요?
  • 왜 메소드가 파라미터를 조작하는 것이 문제가 될까요? 문제가 아닐 수도 있지 않을까요?
  • 음료수 자판기에 탑재한 소프트웨어를 제작했다고 가정해 보겠습니다. 작성하신 소프트웨어의 통합 테스트 시나리오를 어떻게 작성하시겠습니까? 생각나는대로 말씀해 주세요.
  • 현재 다루시는 플랫폼에서의 테스트 자동화를 어떻게 구축 하시겠습니까?
  • test code 를 작성하는 본인만의 기준이 있습니까? test 실행 속도를 높이려면 어떤 방법이 좋을까요?
  • blackbox testing, whitebox testing 의 차이에 대해 설명해주세요. 어떤 상황에서 어떤 테스트 방법을 사용하시겠습니까?
  • 상속의 이점 중 "코드의 중복을 줄여준다" 는 말이 있습니다. 그런데 코드 중복을 줄이기 위해서 상속을 쓰는 것은 매우 좋지 않은 코딩 방식이라고 저희는 생각합니다. 이에 대한 후보자님의 의견을 듣고 싶습니다.
  • Java 의 Marker interface (아무 메소드도 없이 타입만 있는) 에 대해 어떻게 생각하시나요?
  • 코드 응집성(cohesion)이란 말을 어떻게 설명하실 수 있습니까? 응집도가 낮은 코드와 높은 코드를 예를 들어 설명해 주세요.
  • NodeJS 로 실행하는 서버와 통신하는 Spring 또는 Python 서버를 구현할 때, 어떻게 하시겠습니까? HTTP 외의 방법을 쓰고 싶다면 어떻게 해야 할까요?
  • 네이버 같은 서비스에서 IP 주소가 바뀔 경우 접속 경고 등의 오류를 발생시킨다. 어떻게 구현하시겠습니까?
  • 서비스의 memory leak 을 어떻게 판단하고, 해결하시겠습니까?
  • 우리 서비스가 대 성공해서 이용자가 4000만이 되었다고 가정합니다. 이용자 4천만 돌파 기념으로 선착순으로 접속한 사용자에게 보너스 포인트를 주는 이벤트를 운영하려 합니다. 모든 이용자들에게 공평하게, 플랫폼이 제공하는 Push 를 보내려 하는데요. 이 경우, 어떤 점들을 고려해야 할까요?
  • MSA vs Monolithic 을 선택하는 기준이 있습니까?
  • M 인프라 시스템이 A 시스템 대비 가격이 많이 싸졌다고 가정해 보겠습니다. 우리의 인프라 시스템을 A 에서 M 으로 최대한 빨리 바꾸려면 어떤 점을 고려해야 할까요?
  • 우리 앱의 어떤 페이지(또는 특정 view) 의 로딩이 매우 늦다면 어떻게 개선할 수 있을까요?
  • 우리가 사용하는 앱들의 API 는 예고없이 바뀌기도 합니다. 외부 API 가 마구 변경되는 상황에서도 우리 앱이 크래시 나지 않게 하려면 어떻게 해야 할까요?
  • 제작한 애플리케이션이 얼마나 사용자 친화적인지를 측정할 수 있는 방법이 있을까요?

 

Java / JVM

  • JVM 에서의 autoboxing 이란 어떤 현상을 말하는 걸까요?
  • interface default implementation 이란? abstract class 를 상속받는 것과 기본 구현을 들고 있는 interface 를 implements 하는것은 어떤 차이가 있나요?
  • Java stream method 중 map 과 flatMap 의 차이에 대해 설명해주세요.
  • 메소드에서 리스트 타입의 파라미터를 받을 때, ArrayList - List - Collection - Iterable 처럼 구체 타입 뿐 아니라 상위 타입도 받을 수 있습니다. 컬렉션을 받는 어떤 API 를 구현하실 때 구체 타입의 API 디자인을 선호하는지, 추상 타입의 API 디자인을 선호하는지를 설명해 주세요. 왜 그런 선택을 하시나요?
  • Java 의 equals 와 == 의 차이에 대해 설명해주세요. Kotlin 의 == 와 === 는 어떤 차이가 있나요?
  • 스프링의 @Autowired 를 가급적 쓰지 말라는 이야기가 종종 들리는데 원인이 뭘까요?
  • final 키워드를 변수, 메소드, 클래스에 선언하는 것은 어떤 의미가 있습니까?
  • synchronized 를 메소드에 선언하는 것과, 특정 객체에 선언하는 것은 어떤 차이가 있습니까?
  • Reflection 을 유용하게 사용하는 사례를 말씀해 주세요.
  • JDK/JVM 은 대표적으로 OpenJDK 와 Oracle JDK 로 나뉘는데요, 업무에 어떤 JDK 를 사용하시겠습니까? 선택의 이유를 말씀해 주세요.
  • hashCode / equals 메소드의 역할에 대해 아시는 내용을 최대한 설명해주세요.
  • Java 의 Collections.unmodifiableList 같은 API 를 이용해 List 같은 collection 을 변경 불가능하게 만들 수 있습니다. 그렇다면 이 API 를 사용하면 immutability 를 달성할 수 있을까요?
  • 다음 싱글턴 코드의 어떤 점을 개선하실 수 있습니까? (개선이 필요 없을 수도 있음 / 왜?)
class MySingleton {
  private static MySingleton instance;

  public static synchronized MySingleton getInstance() {
    if (instance == null) {
        instance = new MySingleton();
    }
    return instance;
  }
}

 

  • java 9 이상에 도입된 추가 기능들 중 마음에 드는거 아무거나 하나만 설명해주세요.
  • 민감한 정보를 String 으로 저장하는 것과, char[] 또는 StringBuilder/StringBuffer 같은 클래스로 저장하는 것은 어떤 차이가 있나요?
  • 크기를 지정하지 않고 ArrayList 를 new 로 생성하면 크기 10의 ArrayList 가 생성됩니다. Array 는 크기를 넘길 수 없는데 반해 ArrayList 는 꽉 찬 List 에 element 를 추가로 더할 수 있습니다. 그렇다면 10개의 element 를 채워넣은 ArrayList 의 11번째 element 을 add 하기위해 어떤 일이 일어나는지 설명해주세요.
  • java.lang.String 의 hashCode 구현에 대해 고찰해 봅시다. 왜 그런 구현일지, 문제점은 없을지 이야기해주세요.
  • lambda 와 메소드 1개만 있는 익명 클래스 직접 선언은 문법적 차이 외에 어떤 내부적인 차이가 있을까요?
  • Java generics 에는 primitive type 을 쓸 수 없는 문제가 있습니다. 왜 그럴까요? 어떻게 해결할 수 있을까요?
  • I/O 를 Java nio 로 코딩할 때 주의점은 어떤게 있을까요?
  • Java 는 Pure OOP 언어가 아니라고 하는데, 왜 그런 걸까요?
  • java.lang.String 의 length 메소드는 정확한 결과를 반환하지 않는 경우가 종종 있습니다. 정확한 의 의미란 무엇이고, 왜 그럴까요?
  • Maven 이나 Gradle 이, 의존성 선언한 artifact 들을 찾는 과정에 대해 설명해주세요.
  • java.util.Property extends Hashtable, java.util.Stack extends Vector 같은 클래스는 상속으로 망한 대표 사례입니다. 이유를 설명해 주세요.
  • Spring boot 가 stereotype annotation 을 붙인 클래스들을 어떻게 찾고 bean 으로 등록하는지 그 과정을 최대한 상세하게 설명해주세요.
  • Spring 은 @Transactional 어노테이션 붙인 메소드를 어떻게 찾고 트랜잭션을 처리하나요? 그 내부 구현을 상세하게 설명해 주세요.
  • 메소드에 @Transactional 을 붙이는 것과, TransactionTemplate 을 사용해 트랜잭션을 직접 제어하는 것에는 어떤 차이가 있나요? 어떤 방식을 더 선호하시는지 그 이유도 함께 설명해 주시기 바랍니다.

Kotlin

  • Kotlin 으로 작성한 jvm target 코드는 숨은 비용이 있습니다. 어떤 숨은 비용을 말하는걸까요? 그럼에도 불구하고 Kotlin 을 써야 할까요?
  • Kotlin extension function 이 실제 native code 로 바뀔 때 어떤 형태로 바뀌는지 설명해주세요.

Python

  • object 의 기본 메소드인 __eq__, __hash__ 에 대해 설명해 주세요. 두 메소드를 모두 구현할 때, 어떤 점을 주의해야 할까요?
  • Memory leak 을 유발하는 python 코딩 패턴의 사례를 말씀해주세요.
  • yield 키워드의 역할에 대해 설명해주세요.
  • Global Interperter Lock 에 대해 설명해주세요.

Node.js

  • Promise 에 대해 설명해 보세요.
  • Typescript 의 type 과 interface 의 공통점 및 차이점을 설명해 보세요.
  • Typescript 의 interface 의 특징? 컴파일 이후에는 어떻게 되는지 말씀해주세요.
  • Javascript 와 Java 의 차이를 우리 할머니도 알아들으실 수 있도록 설명해주실 수 있습니까?
  • Map 의 키로 number, string 대신 object 를 쓰고 싶다면, 어떤 점을 고려해야 합니까?
  • Prototype 기반 상속과 일반적인 OOP 에서의 상속은 어떤 차이가 있습니까?

 

Android

  • 비동기로 처리한 작업을 UI 에 표시하기 위해 어떤 일이 필요한지 설명해주세요.
  • 안드로이드 Activity 처리 결과를 다루는 onActivityResult` 메소드는 왜 deprecated 처리되었을까요?
  • ViewGroup 내에 선언한 View 들에 onClickListener 를 선언할 경우 안드로이드가 이벤트를 어떻게 핸들링하는지 설명해 주시기 바랍니다.
  • systrace 가 뭐고, 결과 분석은 어떻게?
  • Memory leak 을 유발하는 coding pattern?
  • Dagger 를 왜 쓸까요? 다른 대안은 없나요?
  • Android HAL(Hardware Abstraction Layer) 에 대해 설명해주세요.

ios

  • 비동기로 처리한 작업을 UI 에 표시하기 위해 어떤 일이 필요한지 설명해주세요.

Web

  • 비동기로 처리한 작업을 UI 에 표시하기 위해 어떤 일이 필요한지 설명해주세요.
  • DOM 의 class 와 id 의 차이?
  • Event bubbling 과 Event capturing 에 대해 설명해주세요.
  • 웹 UI 프레임워크들은 SPA 로 개발하는게 2022년 현재 대세인데 native app 에서는 그런 방식이 일반적이지 않다. 왜 그럴까요?
  • flutter/RN 이 제공하는 hot reload 와 hot restart(live reload) 의 차이에 대해 설명해주세요.
  • React 를 이용해 구현한 SPA 의 SEO 경험을 공유해주세요.
728x90
반응형
728x90
반응형

1. 목적 및 구성

  • 상대 PC에 제어 명령을 보내는 마스터 프로그램(이하 A)과 받은 명령을 수행할 슬레이브 프로그램 (이하 B)이 존재함
  • A는 B가 전송한 모니터 화면을 그려줄 인터페이스를 가지고 있으며, 해당 화면 내에서의 상호작용을 B에게 전달
  • B는 최초 실행 시 서버에 자동으로 연결을 시도하며, 연결 후 대상 pc의 화면과 정보를 A에게 전달함
    이후 A에서 보내오는 명령을 수행함 (마우스, 키보드 입력, 단축키 요청 등)

 

2. 기능

  • 자동 연결
  • 모니터링
  • 대상 정보 수집
  • 원격 제어

 

3. 알고리즘

  • 전역 후킹
  • 키보드 마우스 이벤트 모듈
  • 화면 캡쳐 및 코덱 인코딩
  • 실시간 비동기 UDP 전송
  • json 파싱
  • 트레이아이콘, DLL 로드

 

4. 오픈소스  

  • FFMPEG
  • OpenCV
728x90
반응형
728x90
반응형

https://en.wikipedia.org/wiki/WireGuard

 

WireGuard - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Free and open-source VPN protocol WireGuard is a communication protocol and free and open-source software that implements encrypted virtual private networks (VPNs), and was designed wi

en.wikipedia.org

 

https://www.wireguard.com/

 

WireGuard: fast, modern, secure VPN tunnel

WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant th

www.wireguard.com

 

728x90
반응형
728x90
반응형

shift + 윈도우 + s

728x90
반응형
728x90
반응형

1. 소개 

https://parsec.app/

 

Connect to Work or Games from Anywhere | Parsec

Parsec is a remote desktop you'll actually love. Connect to work, games, or projects wherever you are, whenever you want.

parsec.app

- 계정을 생성하고 대상 PC와 Source PC에 동일한 계정으로 로그인 하면 P2P (UPNP) 연결을 통해 대상 PC의 화면을 로컬로 스트리밍

- 노트북, 스마트폰 등의 저성능 환경에서 대상 PC의 성능을 활용할 수 있음

  ex) 고성능 게임, 영상 작업, 음악 작업, AI 학습 등 작업 가능

 

2. 사용 가능한 환경

가능한 환경

728x90
반응형
728x90
반응형

목적

아두이노 Leonardo Beetle(CJMCU-Beetle)로 OS에서 키보드로 인식되게 하여 입력 방지 프로그램을 우회


 

부품 구매

디바이스 마트
엘레파츠

 

제작

OS에서 시리얼 통신 방식으로 입력할 문자열을 아두이노에 전송해주면, 내부의 스크립트가 문자열을 읽어 키보드로 입력해주는 원리로 파워쉘 스크립트와 아두이노 스크립트를 작성하여 제작함.

 

1) COM포트에 문자열을 전송해주는 파워쉘

# COM1 부분은 Leonardo Beetle이 연결된 포트에 해당, 두번째 인자는 Baud Rate
$port = new-Object System.IO.Ports.SerialPort COM3,115200,None,8,one

$port.open()

# 열려진 포트에 HELLO. 문자열 Write
$port.WriteLine("HELLO.")

# 열려진 포트에 한글로 문자열 Write (한영키(Right Alt 키)를 누르면 한글로 조합됨)
$port.WriteLine("xptmxm answkduf")

$port.Close()

 

2) 아두이노 코드

// Arduino Leonardo, 115200, COM3
// 보드를 Leonardo로 설정해주고 업로드해야함
// 설정하지 않을 경우 Keyboard.h를 찾을 수 없음
#include "Keyboard.h"

void setup() {
  Serial.begin(115200);
  Keyboard.begin();
}

void my_keyinput(char ch)
{
  // delay 10ms 후 키보드 Press
  delay(10);
  Keyboard.press(ch);
  
  // delay 10ms 후 키보드 Release
  delay(10);
  Keyboard.releaseAll();
}

void loop() 
{
  // 1초 딜레이 후 시작
  delay(1000);
  Serial.println("loop start");
  
  // 입력전에 혹시 눌려진 키가 있을 수 있어 전체 Release 해줌
  delay(100);
  Keyboard.releaseAll();
  
  char temp[100];
  if(Serial.available())
  {
    // `문자열이 존재할 때까지 100bytes 씩 시리얼 포트를 읽어옴.
    byte leng = Serial.readBytesUntil('`', temp, 100); 
    
    delay(200); 
    
    // 한글자씩 분해하고 키 입력
    for(int i = 0; i < leng; i++)
    {
      Serial.print(temp[i]);
      my_keyinput(temp[i]);
    }
    Serial.println();
  }    
  
  delay(100);
  Keyboard.releaseAll();
  
  delay(1000);
  Serial.println("loop end");
}

 

 

참고사항

  • Leonardo Beetle은 아두이노 레오나르도의 Beetle 버전
  • 위의 코드는 Leonardo Beetle만 구매하면 사용이 가능함

 

728x90
반응형
728x90
반응형

** 참고, 아래 내용과 코드는 테스트용으로 시뮬레이터로 실제 거래 목적이 아닙니다.

 

목적

  • yfinance, yahoo_fin 등의 Python 라이브러리로 시장 정보를 받아와 작성된 알고리즘을 테스트한다.
  • Ticker 별로 적합한 형태의 트레이딩 알고리즘을 개발하여 시뮬레이션해본다.
  • 최적/최고 수익을 내는 파리미터와 알고리즘, 티커를 찾아내어 실거래에 적용한다.

 

알고리즘

존버, 물타기

 기본적인 알고리즘의 전체 구조는 투자시 일반적으로 사용되는 존버(대기)와 물타기(추가 매수) 등을 기반으로 시작했다.

처음 작성된 알고리즘은 거래 시작 시점부터 현재까지 누적된 비율을 계산하여 미리 입력해둔 특정 값에 맞춰졌을 경우 매도 또는 매수를 판단하여 알려준다. 예를들면 아래 코드에서는 '변화심한그래프.거래행동판단()' 함수가 해당 기능을 담당하며 현재 티커의 주가를 입력받으면 클래스 내부에 저장된 이전 기록과 비율을 읽고 계산하여 대기(0), 매수(+a), 매도(-)를 결정해준다.


 

소스 코드

  • hwan_yfinance_module.py
from abc import *
import matplotlib.pyplot as plt
import yfinance as yf
from datetime import *
from datetime import timedelta


class yfinanace_Main(metaclass=ABCMeta):
    @abstractmethod
    def 현재가치판단(self, Ticker):
        pass
    
    @abstractmethod
    def Date_Save(self):
        pass

    @abstractmethod
    def Data_Load(self):
        pass


# 상승장 형태에서 변화가 비교적 심한 종목일 경우 적용
class 변화심한그래프(yfinanace_Main):
    # 초기 값 지정
    def __init__(self):
        self.int_보유주식수 = 0
        self.int_전일가 = 0
        self.dou_누적률 = 0.0
        self.dou_전일기준등락률 = 0
        self.dou_고정비율 = 20.0 # 주식 종목별 변경 필요

    # set
    def set_int_보유수량(self, int_보유주식수):
        self.int_보유주식수 = int_보유주식수
    def set_dou_누적률(self, dou_누적률):
        self.dou_누적률 = dou_누적률
    def set_int_보유수량(self, int_보유주식수):
        self.int_보유주식수 = int_보유주식수
    def set_int_전일가(self, int_전일가):
        self.int_전일가 = int_전일가
    
    def 내부변수_보여주기(self):
        print("현재 보유수량 : ", self.int_보유주식수, ", 누적률 : ", self.dou_누적률,
                        ", 전일가 : ", self.int_전일가)

    # 현재 시세를 입력받아 매수, 매도, 대기 를 판단해서 알려주는 함수
    def 거래행동판단(self, int_주가):
        # ex) 현재 주가가 8000원, 전일 가격이 10000원이면 전일기준 등락률은 -20% (-2000 / 10000 * 100)가 됨
        self.dou_전일기준등락률 = ((int_주가-self.int_전일가)/self.int_전일가) * 100

        # 전일 등략률을 누적함
        self.dou_누적률 = self.dou_누적률 + self.dou_전일기준등락률

        # 내부 변수 현황 출력
        #print("현재가 : "+ str(int_주가) +", 전일가 대비 등락률 :" + str(dou_전일기준등락률))
        #self.내부변수_보여주기()
        
        # 누적률이 고정비율 이상인 경우 전량 매도 후 공통 변수 초기화
        if self.dou_누적률 >= self.dou_고정비율:
            int_행동 = -1 * self.int_보유주식수
            self.dou_누적률 = 0.0 
            self.int_보유주식수 = self.int_보유주식수 + int_행동

        # 누적률이 -20%(-고정비율) 이하인 경우, 현재 누적률을 보유 주식수에 곱한 수 만큼 추가 매수
        elif self.dou_누적률 <= -1 * self.dou_고정비율:
            int_행동 = int(self.int_보유주식수 * ((self.dou_누적률/100) * -1))
            self.set_int_보유수량(self.int_보유주식수+int_행동) 

        # 누적률이 +고정비율과 -고정비율 사이일 경우(20% ~ -20%) 행동은 없음
        else:
            int_행동 = 0

        # 결정된 행동을 반환
        return int_행동

    def 현재가치판단(self, Ticker):
        print("미구현 동작입니다.")

    def Date_Save():
        print("미구현 동작입니다.")

    def Data_Load():
        print("미구현 동작입니다.")


def Simulate_변화심한그래프(str_ticker, str_startdate):
    #str_ticker = "GOOGL"
    #str_startdate = "2021-03-01"
    str_enddate = datetime.now()

    yf_Ticker = yf.Ticker(str_ticker) #AAPL, TSLA, GOOGL
    close_TickerData = yf_Ticker.history(start=str_startdate, end=str_enddate, interval="1d")['Close']

    int_최초구매수량 = 10 # 주식 종목별 최적화 필요 변수
    dou_시작주가 = close_TickerData[0]
    dou_최초투자금 = int_최초구매수량 * dou_시작주가

    # class set
    f = 변화심한그래프()
    f.set_int_보유수량(int_최초구매수량)
    f.set_int_전일가(dou_시작주가)

    print("\n초기값")
    print("Tiker :" + str_ticker + ", Start : " + str_startdate + ", Now : " + str_enddate.strftime('%Y-%m-%d') )
    f.내부변수_보여주기()
    print("")

    # 입력 기준 7일 단위로 값 가져오기 
    list_7일단위값 = []
    for i in range(1, len(close_TickerData)):    
        if i%7 == 0:
            list_7일단위값.append(close_TickerData[i])

    # 시작
    cnt = 1 
    int_전체추가투자금액 = 0

    # 시뮬레이션 Start
    for int_현재주가 in list_7일단위값:
        int_행동 = f.거래행동판단(int_현재주가)
    
        if int_행동 == 0:
            print(str(cnt) + "회 행동 : 대기")
            print("현재가 : "+ str(int_현재주가) +", 전일가 대비 등락률 :" + str(f.dou_전일기준등락률))
            print("현재 보유수량 : ", f.int_보유주식수, ", 누적률 : ", f.dou_누적률, ", 전일가 : ", f.int_전일가)
        
        elif int_행동 > 0:
            print(str(cnt) + "회 행동 : ", int_행동, "주 매수 -> 현재보유 주식 수(주) : " + str(f.int_보유주식수) + ", 추가 투자금($) : " + str(int_행동 * int_현재주가))
            int_전체추가투자금액 += (int_행동 * int_현재주가)
   
        else:
            print(str(cnt) + "회 행동 : 전량매도(", int_행동, "주), 매도 금액($) : " + str(int_행동*int_현재주가*-1))
            print("  투자 기간 : " + str_startdate + " ~ " + (datetime.strptime(str_startdate,"%Y-%m-%d") + timedelta(days=(cnt*7))).strftime('%Y-%m-%d') )
            print("  최초 투자금액 : " + str(dou_최초투자금))
            print("  추가 투자금액 : " + str(int_전체추가투자금액))
            print("  전체 투자금액 : " + str(dou_최초투자금+int_전체추가투자금액))
            print("  손익 : " + str((int_행동*int_현재주가*-1) - (dou_최초투자금 + int_전체추가투자금액)))
            break
    
        f.set_int_전일가(int_현재주가)
        print("")
        cnt += 1

    # 데이터 셋 그래프
    plt.plot(list_7일단위값)
    plt.show()

 

  • make_money.py
#-*- encoding: utf-8 -*_
import hwan_yfinance_Module as my_class

str_startDate = "2020-01-01"
arr_Ticker = ["GOOGL", "AAPL", "TSLA"]

for str_Ticker in arr_Ticker:
    my_class.Simulate_변화심한그래프(str_Ticker, str_startDate)

 

변화 심한 그래프 시뮬레이션 결과

Alphabet A (Google, Voting)/ 2020-01-01 시작

Google 시뮬레이션 결과
- 티커 : GOOGL
- 기간 : 2020-01-01 ~ 2020-06-31
- 투자 : $15502 (최초 $13394 , 추가 $2108)
- 손익 : $3413

 

AAPL(애플)/ 2020-01-01 시작

Apple 시뮬레이션 결과
- 티커 : AAPL
- 기간 : 2020-01-01 ~ 2020-04-29
- 투자 : $837 (최초 $726, 추가 $111)
- 손익 : $233

 

TSLA(테슬라) / 2020-01-01 시작

Tesla 시뮬레이션 결과
- 티커 : TSLA
- 기간 : 2020-01-01 ~ 2020-01-15
- 투자 : $837 (최초 $837, 추가 $0)
- 손익 : $302

 

리뷰 및 개선 사항

  • 현재 시뮬레이션된 알고리즘은 특정 상황, 특정 조건에서는 수익이 발생하지만,변동성이 적은 종목에서 테스트했을 경우 수익이 나지 않고, 지속적으로 하락된 상황에서는 기하급수적으로 주식을 구매함
  • 실거래 적용은 아직 큰 리스크가 있음
  • yfinance 라이브러리가 아닌 야후 finance의 개인키를 발급 받아 RestAPI를 직접 사용하는 모듈을 제작하면 더 좋을 듯함
728x90
반응형
728x90
반응형

1. 목적 및 내용 요약

Captcha 이미지를 읽어 내용을 알려주는 신경망 모델을 Python으로 작성하여 UiPath Activity 형태로 만들어준다.


 

2. Captcha 이미지 수집기 제작

RPA로 제작된 이미지 수집기


 

3. 이미지 Dataset 만들기

 3-1) 폴더 구성

  - C:\RPA\Captcha_ImageCollector\origin : 위에서 수집기가 수집한 파일들 위치

  - C:\RPA\Captcha_ImageCollector\separate : 분리된 파일들 생성

  - C:\RPA\Captcha_ImageCollector\complete : 분리가 완료된 파일 이동

폴더 구성

 3-2) 이미지 분리용 코드

import tensorflow as tf
import cv2
import os

import PIL.Image as pimage
import numpy as np
import matplotlib.image as mimage
import matplotlib.pyplot as plt

from tensorflow.keras import datasets, layers, models


# Init Flag
is_Debug = False

# Init global variables
str_path_main = "C:\RPA\Captcha_ImageCollector"
str_path_origin = str_path_main + "\\origin"
str_name_origin = "\\[index].jpeg"
str_file_origin = str_path_origin + str_name_origin
str_path_separate = str_path_main + "\\separate"
str_name_separate = "\\[index].jpeg"
str_file_separate = str_path_separate + str_name_separate
str_path_complete = str_path_main + "\\complete"
str_path_dataset = str_path_main + "\\dataset"
str_path_testset = str_path_main + "\\testset"


# 입력 경로의 파일 수를 반환
def get_current_index(str_path):
    return len(os.listdir(str_path))

# 이미지 Shape를 출력
def print_ImageShape(img, is_debug):
    if is_debug:
        _height, _width, _channel = img.shape
        print("Image Shape : " + str(_height) +", "+ str(_width) + ", " + str(_channel))

# 분리된 이미지를 생성
def Image_Separate(str_originImage):
    # separate 경로 내부의 현재 파일 수를 얻어옴
    int_index = get_current_index(str_path_separate)

    # 이미지 사이즈 변수 초기화
    origin_w = 240 # 6*40
    origin_h = 120 # 6*20
    piece_x = int(origin_w/7)

    # 원본 이미지 불러오기
    img = cv2.imread(str_originImage)
    print_ImageShape(img, is_Debug)

	# 이미지 사이즈 변경 후 테두리 공백 제거
    img = cv2.resize(img, dsize=(origin_w, origin_h)).copy()
    img = img[int(origin_h*0.05):int(origin_h*0.75), int(origin_w*0.05):int(origin_w*0.90)].copy()
    print_ImageShape(img, is_Debug)

    # 이미지 분리
    list_img = []
    img_copy = img.copy()

    for i in range(0, 6):
        list_img.append(img[:, piece_x * i:piece_x * (i+1)])
        if is_Debug: 
        	# 디버그 모드일 경우 분리할 경계선을 보라색으로 나타내줌
            result = cv2.rectangle(img_copy, (piece_x * i, 0), (piece_x * i, origin_h), (255, 0, 255), 1)
            print(piece_x * i, ", ",  piece_x*(i+1))
        
    # 분리된 이미지를 separete 경로에 파일로 출력, 뒤로 이어붙이기
    for i in range(0, 6):
        int_index = int_index + 1
        cv2.imwrite(str_file_separate.replace("[index]", str(int_index)), list_img[i])

        if is_Debug:
            cv2.imshow('img', list_img[i])
            cv2.waitKey(0)

    if is_Debug:
        result = img_copy
        cv2.imshow('result', result)
        cv2.waitKey(0)

        cv2.destroyAllWindows()
    return ;

# Function
def Start_Separate():
    # 한번에 가져올 개수, 아래 코드는 현재 경로에 있는 파일 전부를 의미함
    int_onetime = get_current_index(str_path_origin)

    last_origin_index = get_current_index(str_path_origin)
    last_complete_index = get_current_index(str_path_complete)
    print("origin start count: ", last_origin_index)
    print("complete start count : ", last_complete_index)

    # origin의 마지막 index 파일부터 가져옴 (수집기가 뒤에서부터 추가하기 때문)
    for i in reversed(range(last_origin_index + 1 - int_onetime, last_origin_index + 1)):
        str_ImageFullPath = str_file_origin.replace("[index]" , str(i))
        try:
            print(str_ImageFullPath)

            Image_Separate(str_ImageFullPath)
            print(str_path_complete + "\\" + str(i)+".jpeg")

            last_complete_index += 1
            os.rename(str_ImageFullPath, str_path_complete + "\\" + str(last_complete_index) +".jpeg")
        except:
            print(str_ImageFullPath + " - 파일 없음.")

    last_origin_index = get_current_index(str_path_origin)
    last_complete_index = get_current_index(str_path_complete)
    print("origin end count: ", last_origin_index)
    print("complete end count : ", last_complete_index)

# 분리 시작
Start_Separate()

 

3-3) 결과

중간 과정 편집

 

 3-4) 이미지 분류

 - 이미지 내부의 숫자들 중 괜찮은 이미지를 각 숫자별 폴더로 분류

 - 불량한 애들은 수작업으로 버려줌

분류 중인 이미지

   


 

4. 학습 모델 제작, 학습, 가중치 파일 생성

 - C:\RPA\Captcha_ImageCollector\dataset : 학습 시 사용할 데이터들, 폴더 별로 분류된 이미지들이 위치

 - C:\RPA\Captcha_ImageCollector\testset : 학습 완료 후 정확도를 검증하기 위한 테스트용 데이터 위치

 - 위 분리용 코드 이어서 작성

 

4-1) 학습용 코드

# 한개 이미지 가져와서 테스트
def test_OneImage(model, image_path):
    x = []
    img = cv2.imread(image_path, 0)
    
    cv2.imshow("current image", img)
    cv2.waitKey(0)

    tmp_x = cv2.resize(img, dsize = (84, 34))
    tmp_x = tmp_x.astype('int32')
    tmp_x = tmp_x.reshape(84, 34, 1)
    tmp_x = tmp_x / 255.0
    x.append(tmp_x)

    predicted_number = model.predict_classes(np.array(x))[0]

    return predicted_number

# 데이터셋 가져오기
def get_datasets(str_dataset_path):
    dataset_images = []
    dataset_labels = []

    for i in range(0, 10):
        for j in range(1, 100):
            img_name = str_dataset_path + "\\" + str(i) + "\\" + str(i) + " (" + str(j) + ").jpeg"
            try:
                img = cv2.imread(img_name, 0)
                
                x = cv2.resize(img, dsize = (84, 34))
                x = x.astype('int32')
                x = x.reshape(84, 34, 1)
                x = x / 255.0

                dataset_images.append(x)
                dataset_labels.append(i)

            except:
                None

    return dataset_images, dataset_labels

# CNN 모델
def model_CNN_ver1():
    # model 
    model = models.Sequential()

    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(84, 34, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    #model.add(layers.Dropout(0.5))

    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Dropout(0.5))

    # dense layer
    model.add(layers.Flatten())
    model.add(layers.Dense(32, activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))

    model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

    return model

# 데이터셋, 테스트셋 가져오기
train_images, train_labels = get_datasets(str_path_dataset)
test_images, test_labels = get_datasets(str_path_testset)

print("가져온 학습용 데이터 수 : ",  len(train_images))
print("가져온 테스트용 데이터 수 : ",  len(test_images))

# 모델 생성
model = model_CNN_ver1()

# 모델 8회 학습
model.fit(np.array(train_images), np.array(train_labels), epochs=8)
model.save("my_model.h5")

# h5 파일 가져와서 정확도 테스트
model22 = models.load_model("my_model.h5")

# 3회 정확도 테스트
test_loss, test_acc = model.evaluate(np.array(test_images),  np.array(test_labels), verbose=3)
print("학습된 모델의 정확도 : {:5.2f}%".format(100*test_acc))

 

4-2) 학습 결과

학습 결과 91.85%

 - 대충 10번의 학습 후에 91.85%의 테스트 정확도를 가지는 my_model.h5 가중치, 모델 파일이 생성됨.

 

4-3) 가중치 파일 사용해서 정확도 테스트하기

test_images, test_labels = get_datasets(str_path_testset)
print("가져온 테스트용 데이터 수 : ",  len(test_images))

# 모델 생성
model = model_CNN_ver1()

# 파일을 불러오지 않고 모델의 정확도 테스트
test_loss, test_acc = model.evaluate(np.array(test_images),  np.array(test_labels), verbose=3)
print("학습안된 모델의 정확도 : {:5.2f}%".format(100*test_acc))

# h5 파일 가져온 뒤 정확도 테스트
model22 = models.load_model("my_model.h5")
test_loss, test_acc = model22.evaluate(np.array(test_images),  np.array(test_labels), verbose=3)
print("학습된 모델의 정확도 : {:5.2f}%".format(100*test_acc))

 

4-4) 테스트 결과

 

4-5) 이미지 한개씩 가져와서 예측된 값 보기

model22 = models.load_model("my_model.h5")

for i in range(0, 10):
    for j in range(1, 100):
        imgname = str_path_testset + "\\" + str(i) + "\\" + str(i) + " (" + str(j) + ").jpeg"
        try:
            print(test_OneImage(model22, imgname))
        except:
            print("no image files")
            None

 

4-6) 결과

 - 중간 중간 잘못 예측된 결과가 보인다. 그냥 진행한다.

현재 이미지와 결과

 


5. 원본 이미지 넣어서 한번에 결과 보기

5-1) 테스트용 원본 이미지, 학습 파일 경로 지정

학습이 완료된 h5 파일과 테스트용 이미지가 보인다.

 

5-2) 코드

# Image_Separate 기반, 6조각으로 분리된 이미지 자체를 return
def Image_Separate_2(str_originImagePath):
    # init 
    origin_w = 240 # 6*40
    origin_h = 120 # 6*20
    piece_x = int(origin_w/7)

    # Read Image
    img = cv2.imread(str_originImagePath, 0)
    img = cv2.resize(img, dsize=(origin_w, origin_h)).copy()
    img = img[int(origin_h*0.05):int(origin_h*0.75), int(origin_w*0.05):int(origin_w*0.90)].copy()

    # Separated Image 
    list_img = []

    for i in range(0, 6):
        list_img.append(img[:, piece_x * i:piece_x * (i+1)])

    return list_img;

# 이미지를 받아서 예측 값 retrun
def test_OneImage_2(model, img):
    x = []

    tmp_x = cv2.resize(img, dsize = (84, 34))
    tmp_x = tmp_x.astype('int32')
    tmp_x = tmp_x.reshape(84, 34, 1)
    tmp_x = tmp_x / 255.0
    x.append(tmp_x)

    predicted_number = model.predict_classes(np.array(x))[0]

    return predicted_number

# 분리된 이미지 list를 하나씩 넣어서 결과값 list를 만듦
def completed_module(my_model, img_path):
    list_img_2 = Image_Separate_2(img_path)
    list_result = []

    for int_index in range(0, 6):
        list_result.append(test_OneImage_2(my_model, list_img_2[int_index]))

    return list_result;

def test_FullImage():
	oringin_img_path = "test (" + str(int_index) + ").jpeg"
    for int_index in range(1, 400):
        try:
        	# 결과 출력
            print(completed_module(model22, oringin_img_path)
			
            # 원본 이미지 보여주기
            origin_img = cv2.imread(oringin_img_path)           
            cv2.imshow("result", origin_img)    
            cv2.waitKey(0)
        except:
            None

# 테스트
test_FullImage()

 

5-3) 결과

- 체감상 70~80% 확률로 성공

결과

 


6. 학습된 가중치 파일 c#에서 실행하기

 - HDF.Invoke, IronPython, Keras.Net, Tensorflow.Net 으로 코드 테스트해본 결과,

   정상동작하지 않거나 라이브러리 종속성 문제, 파이썬 3 지원안함 등의 문제로 사용 제한됨

   -> 현재사용하는 python39버전과 PythonNet Nuget의 버전을 맞춰서 설치함

 - 위에서 작성된 코드를 클래스 형태로 재작성 

 - 파이썬 코드와 h5 모듈은 실행되는 파일과 동일폴더에 위치하여야 함

   (VS의 속성 창에서 해당 파일 우클릭 > 속성 > 파일복사 칸의 값을 항상 복사로 설정하면

    실행 시마다 해당 파일이 실행 파일 옆에 복사됨)

 - 이 과정은 C#-Python 연동을 위한 테스트 코드 부분임

   Activity 제작 관련 내용은 아래 7번 항목으로 이동

 

6-1) C# 코드 (PythonNet)

nuget package manager에서 버전에 맞게 설치

using System;
using System.Text;
using System.IO;
using Python.Runtime; // PythonNet - python39버전 설치
using System.Collections.Generic;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {	
            // 엔진 초기화
            PythonEngine.Initialize();

	    // 정확하진 않지만 자원을 동결시켜 준다고함
            using (Py.GIL())
            {
            	// Import할 모듈명, HwanCaptchaModule.py
                dynamic hcm = Py.Import("HwanCaptchaModule");
                // 임포트한 모듈 내부의 Hwan_Captcha_Module 클래스 초기화
                dynamic f = hcm.Hwan_Captcha_Module("cur.jpeg", "my_model.h5");
                
                // 클래스 내의 start 메소드 실행 후 결과 출력
                Console.WriteLine(f.start());
            }
            // 엔진 종료
            PythonEngine.Shutdown();

            Console.WriteLine("Press any key...");
            Console.ReadKey();
        }
    }
}

 

6-2) Python 코드

# -*- coding: utf-8 -*-
import os
# 로그 레벨 설정으로 Tensorflow 경고 문구 제거, Tensorflow를 import하기 전에 변경해 줘야한다.
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 

import sys
import cv2
import numpy as np
from tensorflow.keras import models

# Input : str_ImagePath, str_modelPath
# Output : str_result
class Hwan_Captcha_Module(object):
    def __init__(self, str_ImagePath, str_modelPath):
        self.str_ImagePath = str_ImagePath
        self.str_modelPath = str_modelPath
        self.model = models.load_model(self.str_modelPath)
    
    def Image_Classification(self, img):
    	# 신경망에 넣기 전 데이터 형태 가공
        x = []
        tmp_x = cv2.resize(img, dsize = (84, 34)).astype('int32').reshape(84, 34, 1) / 255.0
        x.append(tmp_x)
		
        # predict로 반환된 SoftMax 값들을 리스트 형태로 바꾸어 그 중 가장 높은 확률의 인덱스를 구함
        list = self.model.predict(np.array(x)).tolist()[0][:]
        list = list.index(max(list))
		
        # 찾아낸 인덱스가 신경망이 판단한 현재 이미지와 가장 가까운 숫자임
        return list 

    def completed_module(self):
    	origin_w = 240 # 6*40
        origin_h = 120 # 6*20
        piece_x = int(origin_w/7)

	    # 흑백 이미지로 로드(이미지의 차원을 줄임)
        img = cv2.imread(self.str_ImagePath, 0)
        img = cv2.resize(img, dsize=(origin_w, origin_h))
        # 주변 공백 제거
        img = img[int(origin_h*0.05):int(origin_h*0.75), int(origin_w*0.05):int(origin_w*0.90)]

        str_result = ""
        # 위에서 계산된 한 조각 크기만큼 옆으로 이동하면서 숫자 이미지를 가져옴.
        for i in range(0, 6):
            str_result += str(self.Image_Classification(img[:, piece_x * i:piece_x * (i+1)]))

        return str_result;
        
	# 찾아낸 결과를 return 하고 에러 발생 시 문자열 return
    def start(self):
        try:
            return self.completed_module()
        except:
            return "파일을 찾을 수 없습니다."
                        
if __name__ == "__main__":
    Hwan_Captcha_Module(sys.argv[1], sys.argv[2]).start()

 

6-3) 결과 

- 한글자씩 틀리는 경우가 종종 있지만 대부분 성공 (체감상 60~70% 성공률인 듯 하다)

- 아래 411050은 마지막이 0인지 9인지 사람이 봐도 헷갈림


7. Custom Activity 제작

 - Nuget Package Manager.exe 또는 Nuget.exe를 활용하여 .nupkg 파일 생성

 - python 코드의 종속성을 없애기 위해 6번의 코드를 one directory - exe 형태로 만든 뒤 nupkg에 포함시킴

   (auto-exe-to-py 환경 구성 및 사용법)

 - nuspec 파일로 패키지 구성을 정의할 수 있음 (자세한 내용은 MSDN 참조)

 

7-1) C# 코드 (C# 클래스 라이브러리, .Net Framework 4.6.1)

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Activities;
using System.ComponentModel;
using System.Diagnostics;

namespace ClassLibrary
{
    public class Captcha : CodeActivity
    {
        [Category("Input")]
        [RequiredArgument]
        public InArgument<String> in_str_imagepath { get; set; }

        [Category("Output")]
        public OutArgument<String> out_str_result { get; set; }

        protected override void Execute(CodeActivityContext context)
        {
            var str_imagepath = in_str_imagepath.Get(context);
            var str_result = "";
            var str_error = "";
            var str_id = "activities_captcha";
            var str_version = "1.0.7";

            var psi = new ProcessStartInfo();

            var str_h5file = Environment.GetEnvironmentVariable("userprofile") + "\\.nuget\\packages\\"+ str_id + "\\"+ str_version + "\\hcm\\model.h5";
            psi.FileName = Environment.GetEnvironmentVariable("userprofile") + "\\.nuget\\packages\\" + str_id + "\\" + str_version + "\\hcm\\Hwan_Captcha_Module.exe"; 

            psi.Arguments = string.Format("{0} {1}", str_imagepath, str_h5file);

            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;

            using (var process = Process.Start(psi))
            {
                str_error = process.StandardError.ReadToEnd();
                str_result = process.StandardOutput.ReadToEnd();
                
                // 에러가 비어있지 않으면 에러 출력
                if (!string.IsNullOrEmpty(str_error))
                {
                    Console.WriteLine("error : " + str_error);
                }
            }

            out_str_result.Set(context, str_result);
        }
    }
}

 

7-2) .nuspec 파일 생성

<?xml version="1.0" encoding="utf-8"?>
<package >
  <metadata>
    <id>activities_captcha</id>
    <version>1.0.7</version>
    <title>캡챠!</title>
    <authors>hwan</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <license type="expression">MIT</license>
    <description>개꿀</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <tags>Captcha</tags>
  </metadata>
  <files>
    <file src="Hwan_Captcha_Module\**" target="hcm\" />
  </files>
</package>

 

7-3) nuget.exe로 .nupkg 파일 생성하기

- nuget 파일 알아서 구하고 c:\windows 안에 두기

- nuspec있는 프로젝트 위치로 이동 후 아래 코드 실행 

nuget pack

 

7-4) 생성된 .nupkg 파일을 특정 폴더(custom-package 배포용 폴더)에 위치시킨뒤 UiPath Stuido 에서 가져옴


8. 결과

- 위의 6번과 같은 정확도로 결과가 도출됨

Custom Activity 사용

 

728x90
반응형
728x90
반응형

1. 구매 계획

1-1) 구매시 고려사항
- 1호기는 상용 FC, 무선컨트롤러 등 상용 부품을 선택할 예정
- 상용 제품들을 조립하여 250급 쿼드콥터 조립 후 제어

1-2) 프레임 선택
- Titan XL5 232mm
https://ko.aliexpress.com/item/32882570954.html?spm=a2g0o.detail.1000013.1.5dd843d0KtsCJo&gps-id=pcDetailBottomMoreThisSeller&scm=1007.13339.169870.0&scm_id=1007.13339.169870.0&scm-url=1007.13339.169870.0&pvid=d62fe2ca-44b8-40ee-8142-99d5fbbb1374&_t=gps-id:pcDetailBottomMoreThisSeller,scm-url:1007.13339.169870.0,pvid:d62fe2ca-44b8-40ee-8142-99d5fbbb1374,tpp_buckets:668%230%23131923%230_668%230%23131923%230_668%23888%233325%2320_668%23888%233325%2320_668%232846%238108%231977_668%235811%2327173%2311_668%232717%237559%2373_668%231000022185%231000066059%230_668%233468%2315615%23639_668%232846%238108%231977_668%235811%2327173%2311_668%232717%237559%2373_668%233164%239976%23933_668%233468%2315615%23639

 

7.49US $ |3K 탄소 섬유 XL5 232mm XL6 283mm XL7 294mm XL8 360mm True X FPV 프리 스타일 프레임 5 6 7 8 인치 FPV 레

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com

* 2021-06-06 알리익스프레스 기준 XL5 모델 -> 가격 : $17.83, 배송비 : $1.94 (기본 선택, 7월 10일 도착예정)


1-3) 부품 선택
- 프로펠러 : 모터에 맞게 구매
- 모터 : 개당 양력이 400g 정도면 됨 (2300kv, CW*2, CCW*2)
- 변속기 : 20A 정도로 4개
- FC : CC3D (예정)
- 송수신기 : Devo 7 (수신기 포함버전)
- PDU : 마텍 XPW 전원보드(140A, 듀얼BEC, 전류센서)
https://smartstore.naver.com/ssrc/products/586715039
- 배터리 :
- 충전기 : IMAX B6AC (단자 확인)
- 배터리 체커 :
- 전선 및 커넥터 : XT60
- 기타 : 수축튜브, 전선, 단자, 어댑터, 스트랩
https://smartstore.naver.com/ssrc/category/294584f8922e414faf32e0de306ee3c0


1-4) 참고 자료
https://www.youtube.com/watch?v=SfFl_-tof4Y


1-5) 결론
- 키트로 구매하는 게 더 저렴하기 떄문에 위 부품과 가장 비슷한 키트를 구매
- 충전기, 송수신기, 기타 소모품은 그대로 구매

2. 구매

2-1) 250급 드론 키트

Ready go -Flying 에서 주문

- BLHELI20A 변속기와 CC3D는 각각 BLHELI30A와 F4 로 대체됨 (가격 동일)
- 이미지에 해당하는 부품이 없을 경우, 현재 재고에 있는 부품으로 변경해 주는 듯함.
- 따로 구매하는 것보다 가격이 저렴하여 선택
https://ko.aliexpress.com/item/32727686945.html?spm=a2g0n.productlist.0.0.261cc697i6dT3x&browser_id=b41df9bafa2e47008f1cabd3b8284dac&aff_trace_key=&aff_platform=msite&m_page_id=mpzegyemj1icad8m179e4e8a77d7271094cc18c636&gclid=&_imgsrc_=ae01.alicdn.com%2Fkf%2FHTB1eHGzNXXXXXbkXFXXq6xXFXXXr.jpg_640x640Q90.jpg


2-2) 배터리 충전기

Onetree Charger Store에서 구매

- 오른쪽 위에 SkyRC 로고가 있는게 정품, 가품과 가격이 크게 차이나지 않지만 가품 사용 시 고생할 수 있음.
- 판매자가 구매요청 확인 시 물건을 바로 배송해줌 (응답이 빠름)
- UA 버전으로 구매 (220V)
https://ko.aliexpress.com/item/32847556295.html?spm=a2g0n.productlist.0.0.c74a171abV8ZnV&browser_id=b41df9bafa2e47008f1cabd3b8284dac&aff_trace_key=&aff_platform=msite&m_page_id=mpzegyemj1icad8m179e4f0c3d01bb3e5101a6eba7&gclid=&_imgsrc_=ae01.alicdn.com%2Fkf%2FH9eab6ab211f64e049c7dffb9d139e5add.jpg_640x640Q90.jpg

 

39201.0₩ 24% OFF|SKYRC 미니 밸런스 충전기 방전기 IMAX B6 RC 헬리콥터용, Re peak NiMH NiCD LiHV NiCd PB 리튬

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com



2-3) 송수신기

RUSFPV Store 에서 구매&nbsp;

- 보급형이면서 오래 쓸만한 10채널 송수신기, IA6 수신기가 포함된 제품으로 구매
https://ko.aliexpress.com/item/32885553734.html?spm=a2g0n.productlist.0.0.503750f1bznMAB&browser_id=b41df9bafa2e47008f1cabd3b8284dac&aff_trace_key=&aff_platform=msite&m_page_id=mpzegyemj1icad8m179e4f1e7ef23487b6c7fbd466&gclid=&_imgsrc_=ae01.alicdn.com%2Fkf%2FH878cbabe4262438fbe9520239893d110P.jpg_640x640Q90.jpg

 

53169.0₩ 48% OFF|플라이 스카이 FS i6X I6X 2.4G 10CH AFHDS 2A 라디오 송신기 X6B IA6B A8S IA10B IA6 수신기 RC 비

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com



2-4) 결론
- 알리익스프레스 어플로 21년 6월 6일에 주문, 21년 6월 20일 도착 예정 (현시점 6월 9일, 6월 20일 도착완료)
- 금액은 약 19만원 소요됨 (배송비 포함, 무료 기본 배송, 카카오페이 됨)
- 배터리 제외하고 거의 모든 부품을 저렴한 가격에 해결할 수있음

 

728x90
반응형
728x90
반응형

1. 주소

https://www.gseek.kr/member/rl/online/main.do?menuId=OTOP&menuStep=1&pMenuId=OTOP

 - 동영상 강의를 무료로 수강가능

 

경기도지식(GSEEK)

경기도 무료 온라인 평생학습서비스, 외국어, 자격취득, 생활/취미, 부모교육, 청소년 등 제공

www.gseek.kr

 

2. 개인 수강 과목

 - Sketch Up으로 도전하는 3D 모델링

 https://www.gseek.kr/member/rl/courseInfo/onCourseCsInfo.do?menuId=UB00&menuStep=2&pMenuId=OTOP&courseSeq=3580&courseCsSeq=1&courseCateCode=B100&eduTypeCode=&stuSeq= 

 

경기도지식(GSEEK)

경기도 무료 온라인 평생학습서비스, 외국어, 자격취득, 생활/취미, 부모교육, 청소년 등 제공

www.gseek.kr

 

 - 왕초보도 따라하는 ‘유니티’로 게임 만들기 - 입문편

https://www.gseek.kr/member/rl/courseInfo/onCourseCsInfo.do?menuId=UB00&menuStep=2&pMenuId=OTOP&courseSeq=1375&courseCsSeq=1&courseCateCode=B300&eduTypeCode=&stuSeq= 

 

경기도지식(GSEEK)

경기도 무료 온라인 평생학습서비스, 외국어, 자격취득, 생활/취미, 부모교육, 청소년 등 제공

www.gseek.kr

 

728x90
반응형
728x90
반응형

Ctrl + Shift + t

728x90
반응형
728x90
반응형

1. 주소 : https://www.devicemart.co.kr/main/index

 

대한민국 전자부품 1등 쇼핑몰 디바이스마트

디바이스마트

www.devicemart.co.kr

 

2. 설명

- 센서, 공구, 워크스테이션, 로봇 부품 등 판매

728x90
반응형
728x90
반응형

1. 소개

 https://ghidra-sre.org/

 

Ghidra

Getting Help Ghidra provides context-sensitive help on menu items, dialogs, buttons and tool windows. To access the help, press F1 or Help on any menu item or dialog. Visit our Wiki Issue Tracker

ghidra-sre.org

 

728x90
반응형
728x90
반응형

1. 주소

https://www.netmanias.com/ko/post/blog/6264/nat-network-protocol-p2p/p2p-nat-nat-traversal-technic-rfc-5128-part-1-relaying-connection-reversal

- 네트워크 관련 기술들 내용 정리 좋음

 

P2P와 NAT: NAT 통과 기법 소개 (RFC 5128) - 1편: Relaying & Connection Reversal

오늘은 사설 IP 주소를 가지는 두 단말 간에 P2P 통신이 가능하도록 하는 기술(NAT Traversal이라 부름)에 대해 소개 해 드리겠습니다. RFC 5128(State of P2P Communication across NATs - Informational)에서 설명하고

www.netmanias.com

 

 

 

728x90
반응형
728x90
반응형

** 티스토리 에디터 변경으로 아래 기능은 현재 사용 제한

 

1. 주소

https://colorscripter.com/

 

2. 사용

 

3. 블로그 적용

- HTML 또는 클립보드에 복사 클릭

- HTML 시 외부 컨텐츠 > HTML에 복사 붙혀넣기

- 클립보스 시 ctrl+v 

 

728x90
반응형

+ Recent posts