2023년 2학기 Open Source Software 과목에서 진행한 프로젝트.

보통 학교 수업에서 프로젝트를 진행할 때는 교수님이 프로젝트 주제를 좁히거나 기술에 제약을 두시는데, 이 과목에선 오픈 소스 소프트웨어에 걸맞게 제약 조건 없이 원하는 소프트웨어를 만들 수 있었다. (교수님 최고!)

 

복학하고 나서 첫 학기에 진행했던 프로젝트다 보니 해보고 싶은 주제가 굉장히 많았다.

후보 주제가 다음과 같았다.

 

1. 미로 탈출을 인공지능을 이용해서 구현(군대에서 메이즈 러너 시리즈 책 전권을 다 읽을 정도로 인상깊었다)

2. Saleinfo Bot(핫딜을 알려주는 봇이라고 생각하면 된다)

3. 전자기기(노트북, 스마트폰, 테블릿) Benchmark (벤치 마크를 측정한 뒤 GeekBench 표본과 비교하여 내가 뽑은 전자기기가 상위 몇 퍼센트의 성능을 가졌는지 평가하는 프로그램)

4. CV를 이용한 야구 게임(컴퓨터로 하는 스크린 야구라고 생각하면 된다)

 

2번 주제인Saleinfo Bot을 먼저 개발하다가, robots.txt 크롤링 차단으로 인해서 한계에 부딪혔다. 그래서 다른 주제를 택하기로 했다.

3번 주제인 벤치마크 통계 프로그램을 만들다가, low-level 프로그래밍으로도 칩셋의 세부 정보를 식별하는데 실패하여 이것도 중간에 버려졌다는...

그래서 야구 게임을 만들게 되었다.

 

사실 진짜 만들고 싶은 건 "컴투스 프로야구 같은 야구 게임 + 스크린 야구" 였다. 하지만 촉박한 마감기한 + CV, 머신러닝 라이브러리에 대해 무지했기 때문에 프로젝트 목표를 변경하여 타자에 해당하는 기능만 구현하게 되었다.

 

 

자세한 기능은 README.md에 자세히 적어두었다.

 

https://github.com/DawnGlow/Hitting_Ball

 

GitHub - DawnGlow/Hitting_Ball

Contribute to DawnGlow/Hitting_Ball development by creating an account on GitHub.

github.com

 

 

미완성한 부분

야구 방망이를 실내에서 휘두르는 건 위험하니, 볼펜과 같이 일자형 물체를 인식하여 랜덤으로 날라오는 공을 맞출 수 있도록 구현하려고 했다. 하지만 스윙에 대한 기준 측정치를 판별하는게 내 실력으론 어려웠다. 그래서 프로젝트 마감 2일전까지 구현을 못해서 주먹으로 공을 치는 것으로 바꿔서 프로젝트를 마무리할 수 밖에 없었다.

 

 

느낀 점

일단 이 프로젝트에서 걸림돌이었던 부분은 라이브러리에 대한 배경지식이겠지만, 또 다른 문제점으로는 게임 구조 설계였다. 유니티나 언리얼 같은 게임 엔진을 사용한게 아니라 PyGame이라는 라이브러리를 사용했다. 이 라이브러리의 도움을 일부 받았지만, 원하는 게임 구조를 만들기 위해서는 게임 Status 과 관련된 코드를 처음부터 직접 짜야했었고, 여기서 코드가 꼬이게 되었다. 게임에는 항상 Event loop라는게 존재하고 Event가 발생했을 때 특정 함수를 실행해서 동작을 하도록 구현해야 했는데, 이 때 콜백 구조를 이용했다면 더 깔끔하게 코드를 작성하고 개발 난이도가 쉬워졌을텐데, 이벤트 루프를 메인에서 그냥 while문으로 돌리고 Status를 변수로 취급하여 게임을 설계하는 바람에 코드 구조를 많이 잘못 설계한 채로 구현을 진행했다. 이 부분이 너무 아쉬웠고, 다음에 학교 수업에서 게임을 만들어야 할 기회가 생긴다면 이러한 경험을 바탕으로 클래스 설계 등을 잘 해봐야겠다고 생각했다.

2023년 2학기 유닉스 프로그래밍 과목에서 진행했던 프로젝트. 시스템 콜(System Call)을 이용하여 프로그램을 만드는 프로젝트였다.

교수님께서 리눅스 서버에서 프로그램 시연을 할 것이기 때문에, CLI로 구현하라고 하셨다

 

시스템 콜은 read(), open(), write() 부터 fork(), execve() 등등 굉장히 많기 때문에 사실 저수준에서 어떤 것을 구현하는 것이 과목의 목표와 조금 더 맞긴 하지만, 우리 팀은 기존에 C의 high level로 구현되어 있던 코드들을 system call을 이용하여 구현하는 것으로 프로젝트의 방향을 잡았다. 최대한 수업시간에 배운 시스템 콜을 이용하여 만들만한 프로그램을 찾다가, 편의점 Pos System을 만들기로 하였다.

프로젝트 진행 기간은 약 2-3주정도 였고, 2인에서 진행하였다.

 

 

 

 

 

기능 구현

일단 편의점 시스템의 도메인을 먼저 구상하였다.

시스템 상 경영주(관리자) / 고객을 구분하였고, 관리자에서는 경영주와 알바를 구분하였다.

고객은 GS25의 나만의 냉장고와 같이 사용자가 이용할 수 있는 서비스를 바탕으로 기능을 구현하였고,

경영주/알바는 실제 POS 기계의 시스템을 바탕으로 기능을 구현하였다.

 

경영주 / 알바 기능

관리자 기능

 

 

발주

 

발주 - 새로운 물품 추가

 

구매내역 확인
근무자 정보 확인/수정

 

경영 지표 분석

 

시간대별 분석

 

월간 분석

 

할인 이벤트 수정

 

물건 환불

 

알바 기능

 

알바 기능 - 근무 시간 조정

 

경영주의 근무 시간 조정 요청 처리
예상 급여 명세서

고객 기능 구현

 

 

 

 

시스템 콜 활용

setjmp, longjmp를 이용하여 로그인 기능, 메뉴 돌아가기 등을 구현하였다.

fgets, fscanf, fprintf, open, read, fseek 등의 시스템 콜을 통해 파일 입출력

malloc/realloc 등의 시스템 콜로 구조체 동적할당

fflush()로 출력 버퍼 비우기

time 구조체를 이용하여 구매 기록 저장

 

아쉬웠던점

fork()와 execve() 를 통해서 실제 편의점 포스 시스템처럼 창을 띄우는 구조를 구현하고 싶었는데, 운영체제 한계 + 시연 환경의 한계로 인해서 구현하지 못했다.

 

느낀점

시스템 콜을 이용할 때는 일반 라이브러리 함수를 사용할 때 보다 더 조심해야 한다는 것을 느꼈다.

그리고 Github PR 기능을 잘 사용할 줄 몰라서 2인 팀프로젝트를 진행함에도 서로 커밋을 하다 보니 충돌을 일으키는 경우가 빈번히 존재했다. 프로젝트를 끝내고 github 공부를 해서 브랜치를 만들고 PR을 하고 merge 하는 과정을 추가로 학습했다.

 

 

사실 시스템 콜을 이용해서 저수준에서만 할 수 있는 기능들을 구현하지 않았지만, 그래도 시스템 콜을 이용해서 굉장히 많은 기능을 구현했다. 볼륨이 빵빵해서인지 교수님께서 높은 평가 점수를 주셨다 ㅎㅎ

2021년 1학기 디지털논리회로 과목에서 진행했던 프로젝트. 굉장히 허접(?)스럽다

Logisim이라는 논리 회로 에뮬레이터로 원하는 기능을 구현하여 프로젝트를 완성하는 것이 목표였다.

 

이 과목이 개정되고 처음 수강했던지라 이전에 선배들이 했던 프로젝트가 없었기 때문에, 어떤 주제를 선정할까 고민하다가 숫자야구를 고르게 되었다. (해가 지날 수록 프로젝트 레거시들이 쌓이면서 기준점이 높아진 탓인가 이제는 로지심으로 캐치마인드를 구현할 수준이라고 한다...)

 

 

보통 숫자야구는 숫자 4개를 가지고 4 Strike를 달성하면 게임이 종료되지만, a~z 문자 3개를 가지고 3 Strike를 달성하도록 조건을 바꿔보았다.

 

 

 

이 당시에 수업시간에 배웠던 동기식/비동기식 업카운터를 이용해 프로젝트를 만들어보면서 이해도가 높아졌던 기억이 있다. (근데 이 때 논리회로를 배운 이후로 아직까지 논리회로 내용을 써먹은 적이 없다. 약간 상식을 배운 느낌이랄까)

2021년 1학기에 Object Oriented Programming(Java 강의)에서 진행했던 프로젝트. GUI로 만든 첫 프로그램이다.

 

이 프로젝트 제한 조건이, 반드시 JavaFx를 이용해서 프로젝트 결과물을 만들어 제출해야 했다.

 

사실 이 때 내 기억으로 JavaFx를 배우는데 너무 어려웠다. 컴포넌트, 컨테이너에 대한 개념부터, 외우기 힘든 Label, CheckBox와 같은 클래스들을 배우면서 어떻게 프로그램을 만들까 고민을 했었다.

 

고민하던도중 SceneBuilder라는 툴이 있다는 것을 알았고, SceneBuilder의 도움을 받아서 GUI 구현을 수월하게 할 수 있었다.

 

이 때 OOP 과목 말고 프로젝트를 진행하는 과목이 하나 더 있어서 복잡하지 않지만 JavaFx의 클래스를 적당히 사용할 수 있는 프로그램을 만들어야 겠다고 생각을 했고 계산기를 만들자고 결론을 내렸다.

 

https://github.com/DawnGlow/Calculator

 

GitHub - DawnGlow/Calculator: 2021_Java_OOP

2021_Java_OOP. Contribute to DawnGlow/Calculator development by creating an account on GitHub.

github.com

 

기능은 덧셈 뺄샘 나눗셈 곱셈을 먼저 구현했다.

괄호 연산까지 구현하려고 했었는데, 이 때 자료구조를 능숙하게 다루지 못하기도 했고 시간이 없어서 4가지 연산만 구현한 채로 마무리했다. 지금에서 보면 자료구조 스택, 트리 이용해서 구현할 각이 바로 보이긴 한다. 확실히 많이 성장했구나...

 

사실 이 OOP 프로젝트는 JavaFx를 강제로 사용해야 한다는 조건 때문에 열심히 할 의지가 없었고, 내가 지금까지 했던 프로젝트들 중에 가장 간단하게 만들었던 것 같다. 기본적인 구현만 하고 보고서만 딸랑 제출했지만, A+을 맞았다는게 놀라웠긴 했다(내가 이 때 중간 기말 시험을 잘 봤긴 했지)

(이 때부터 프론트엔드 쪽 보단 백엔드가 나랑 더 잘 맞는다고 느꼈던 것 같다.)

 

 

2020년 2학기 "공학기초설계"라는 과목에서 진행했던 프로젝트

 

EV3 로봇 키트라는게 있는데, 각 부품을 조립할 수 있고, 코딩을 할 수 있다. 코딩을 통해서 부품의 동작을 제어하고, 원하는 결과물을 내는 것이 이 프로젝트의 목표였다.

 

이 당시에 코로나 19가 유행했던지라, 공공장소에서 손 세정제를 분사해주는 디스펜서에 불편함을 느끼고, 비접촉형 자동 분사기를 만들어봐야 겠다는 아이디어를 가지고 자동 디스펜서를 만들어봤다.

 

이 때 작성했던 보고서 내용은 아래에 적어둘게요

 

프로젝트 목적/필요성

최근 코로나 19로 인한 손세정제, 손소독제 사용량이 증가하였다. 
공공장소에서 손세정제, 손소독제를 사용할 시 펌프부분을 많은 사람들이 세정되지 않은 손으로 만지게 된다. 세저오디지 않은 손이 펌프에 접촉되다 보면 펌프 부분이 청결하게 유지되지 않는다. 따라서, 손세정제, 손소독제를 접촉하지 않고 사용할 수 있게 돕는 장치가 필요하다 생각하였고 자동 디스펜서를 만들게 되었다. 

 

프로젝트 목표

자동 디스펜서 장치를 손세정제, 손소독제 뿐만 아니라 디스펜서를 사용하는 다양한 제품에도 범용적으로 활용할 수 있게 개발할 것이고, 이를 위해 수동으로 높낮이를 조정할 수 있게 개발할 것이다. 적외선 센서와 라지모터 2개를 이용하여 적외선 센서가 손을 감지했을 때 라지모터를 이용하여 디스펜서를 펌핑하고 액체를 분사하는 구조를 구상하였다. 자동 분사 기능 뿐만 아니라, 분사 횟수, 리필 필요 등의 정보를 P브릭 경고등이나 디스플레이, 사운드를 통해 사용자나 관리자에게 전달하도록 하는 기능을 구현해 볼 것이다. 디스펜서 활용 제품의 자동 분사 기능이 이 장치의 주된 특징이며, 단순히 자동 분사 기능뿐만 아니라 관리자나 사용자에게 부가 정보를 제공한다는 것이 이 장치만의 독특한 특징이다.

 

 

 

Flow Chart

 

 

 

구현 기능

자동 분사 기능
적외선 센서의 근접감지모드를 사용해 범위 내에 디스펜서를 사용하려는 손이 일정 범위 내에 접근하면 라지모터를 이용하여 디스펜서의 펌프부분을 눌러 디스펜서 내의 액체가 자동으로 분사되게 한다.

연속 분사 방지 기능
센서가 손을 인식하면, 모터가 딜레이 없이 계속해서 작동해서 무한정 액체가 분사되거나, 사용자가 원하는 액체의 양보다 많은 양이 분사될 수 있다. 따라서 루프 중간에 대기블록을 삽입하고, 사운드 블록을 통해 "Ready"라는 사운드가 출력될 때만 액체가 분사되게 하여 위와 같은 상황을 방지하도록 한다.

정보 출력 기능
루프 블록의 반복 횟수를 통해 자동 디스펜서가 작동할 때마다 분사된 횟수를 저장하며 디스플레이 창에 출력한다. 

오작동 방지 기능
사용자가 오작동, 디스펜서고갈을 발견한 경우 터치센서를 눌러 프로그램을 종료할 수 있도록 터치센서를 부착하고, 루프 인터럽트 블록을 이용되며 빨간 경고등과 "Goodbye"라는 사운드가 같이 출력되며 프로그램이 종료되다.

 

느낀점

2020년 이후에도 몇 번의 프로젝트를 더 진행했었는데, 유달리 이 프로젝트에서 많이 느꼈던 것이 있었다.

먼가 열심히 했던 프로젝트였다 보니, 프로젝트 계획하고 하루하루 지날때마다 뭔가 새로운 아이디어가 생겼다 ㅎㅎ.

팀원과 서로 의견을 제시하면서 프로젝트 완성도가 높아졌고, 이 과정에서 프로젝트는 장기적으로 많은 것들을 생각하면서 더 좋은 결과물을 만들어 낼 수 있다는 점이였다.

 

 

지금으로부터 4년 전인 2020년에 진행했던 프로젝트

 

1학년 새내기때 C언어도 제대로 다루지 못했지만, 동아리 선배가 이끌어줘서 나름 성공적(?)으로 마무리했던 C언어 프로젝트 이다.

지금 돌아보면 이 프로젝트가 지금까지 대학교 생활하는데 큰 도움이 되지 않았나 싶다. 첫 단추를 잘 끼운 느낌이다.

 

동아리 C언어 스터디에서, 2명이 팀을 이뤄서 C언어를 이용해서 자유 주제로 프로그램 하나를 만드는 것이 목표였다.

 

주제 선정은 그 당시 구글링을 하다가 너무 어렵지도, 복잡하지도 않은 무난한 주제로 선택했던 걸로 기억

 

구현했던 기능은

  • 도서 검색
  • 도서 대출
  • 도서 반납
  • 도서 삭제
  • 도서 추가

정도 였다.

 

이때는 GUI를 이용할 생각도 못했다. 그냥 구조체, 포인터만 조금 다룰 줄 아는 수준이었기 때문에..

 

 

 

 

 

 

https://github.com/DawnGlow/BookRental_C

 

GitHub - DawnGlow/BookRental_C

Contribute to DawnGlow/BookRental_C development by creating an account on GitHub.

github.com

 

이 때 깃허브도 처음 접해봤는데, git add * 명령어로만 로컬 변경사항을 커밋해서, 프로젝트 설정 파일들까지 몽땅 커밋해버렸던 기억이 있다 ㅎㅎ

 

4년 전에 이 프로젝트 하고 느낀점에 대해서 적어뒀던게 있다.

 

처음에 프로젝트 계획서를 작성하는데, 한번도 해본적이 없으니까 멘땅에 헤딩하는 느낌이였어요.
C언어 문법도 전부다 익힌 상태가 아니여서 코드를 쓰는 속도도 느리고 특정헤더파일에 있는 
함수라던지 한 번도 안배운 함수를 사용해야 하는 등 막히는 부분이 조금 있었습니다. 
그런데 C언어 스터디하면서 문법도 제대로 익힐수 있었어요.
저희가 특정 기능을 구현하기 위한 코드를 짤 때 각자 슈도 코드를 작성해보고 코딩을 해서 비교를 해보고
수정을 하는 방식으로 코딩을 했는데, 이 과정에서 팀원이 작성한 코드를 보고 많은 것들을 배울 수 있었던 것 같습니다.
이 프로젝트 경험이 이후 진행했던 프로젝트에 큰 도움이 됬던 것 같습니다

 

확실한 건 프로젝트를 진행해야 배운 내용들이 채화가 된다는 것이다. 이 글을 보고 있는 새내기 대학생분들이 있다면, 방학 때 반드시 본인이 학기 중에 배웠던 내용을 바탕으로 프로젝트를 진행하는 것을 강추!!!

+ Recent posts