728x90

Created: 2024-07-14
Updated: 2024-07-28

Language

 

 

Computer Science

모두의 네트워크

0. 읽은 시기🗓️
2024.07

1. 책 소개📖
OSI모델과 TCP/IP 모델의 기초를 쌓을 수 있는 책

2. 독후감✍️
정보처리기사와 기술 면접을 대비해서 네트워크 기초를 공부해 본 적은 있지만, 취업 이후에는 네트워크와 관련된 작업을 하지 않다보니 자연스럽게 잊혀졌다. 그러다 올해부터 회사에서 미니 프로젝트를 진행할 것이라는 소식을 들었다. 어떤 내용으로 진행할지 고민하다, 이번 기회에 자주 접하고 있지만 잘 모르는 주제를 선정해서 공부하면 좋을 것 같다고 생각했다. 그리고 그 주제가 네트워크🛜가 됐다.
인터넷을 통해서 정보를 수집하는 것도 좋지만, 정제된 지식이 정리된 책을 읽어보면 좋을 것 같다는 생각에 구입한 책이다(교보문고 기준 네트워크 검색어 + 판매량 순으로 순위권에 보이지 않는 책이지만, 어디선가 추천 글을 보아서 샀다🫠).
개인적으로 추천하는 책이고, 추천하는 이유는 지식을 연결해주기 때문이다. 간단한 예시로 4계층(전송 계층)은 신뢰할 수 있는 통신을 구현하는 계층이라고 외웠었는데, 신뢰할 수 있는 통신을 어떻게 만드는지 쉽고 간단하게 알려준다.
이 책을 읽고 막연하게 '정보는 상호 합의하에.. 잘.. 주고 받고 있지 않을까🫠..?'라는 생각을 '눈에 보이지 않는 전파를 통해 데이터가 이동하고 있구나🤓!'로 바꿀 수 있었다(그래서 가끔은 전파가 늘 이렇게 우리랑 함께해도 건강에 괜찮은가🥸라는 생각도 한다).

3. 새롭게 알게 된 내용📑

웹 서버에서의 데이터 전달과 처리

  • 물리 계층
    데이터가 전기 신호로 웹 서버에 도착
  • 데이터 링크 계층
    이더넷 프레임의 목적지 MAC 주소와 자신의 MAC 주소 비교
    주소가 같으면 이더넷 헤더와 트레일러를 분리하고 네트워크 계층으로 전달
  • 네트워크 계층
    목적지의 IP 주소와 웹 서버의 IP 주소가 같은지 확인
    주소가 같으면 IP 헤더를 분리하고 전송 계층에 전달
  • 전송 계층
    목적지 포트 번호를 확인하여 어떤 애플리케이션으로 전달해야 되는지 판단
    TCP 헤더를 분리하여 응용 계층에 전달
  • 응용 계층
    전송 계층으로부터 받은 데이터를 애플리케이션에 맞게 해석하고 처리
    예: HTTP 요청이 도착하면 웹 서버는 이를 해석하여 적절한 웹 페이지를 반환

4. 구매처🛒

 

 

Database

SQL 첫걸음

0. 읽은 시기🗓️
2024.01

1. 책 소개📖
SQL 입문서

더보기

2. 독후감✍️
책이 쉽다. 그리고 MySQL🐬 환경이다. 다음 책은 SQL 레벨업인데, 그건 또 어렵다(그래서 읽는 걸 좀 미뤘다). SQL 기본 지식이 있는 상태(저는 SQLD를 소지하고 있습니다🙋‍♀️)라면, 이 책을 굳이 읽지 않아도 될 것 같다. 책도 얇고 단원이 잘 나눠져있어서 들고다니며 가볍게 보기 좋을 것 같다. 근데, 쿼리 좀 작성해봤으면 안 읽어도 될 것 같다.

3. 새롭게 알게 된 내용📑

새롭게 알게된 내용이나 알고 있던 내용을 깔끔하게 정리할 수 있도록 도와준 내용🤓!

-- * Null 값의 정렬 순서
--    * MySQL 기준 Null 값을 가장 작은 값으로 취급
--    * Oracle 기준 Null 값을 가장 큰 값으로 취급

-- * LIMIT
--    * 행수 제한
--    * where 조건절과 달리 order by 정렬 이후 최종적으로 수행
--    * OFFSET: 시작 위치 지정(0부터 시작)

select * from sample33 limit 3;

/*
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
+------+
*/

select * from sample33 limit 3 offset 3;

/*
+------+
| no   |
+------+
|    4 |
|    5 |
|    6 |
+------+
*/

 

4. 구매처🛒

 

 

 

Code Quality

내 코드가 그렇게 이상한가요?

0. 읽은 시기🗓️
2024.03

1. 책 소개📖
좋은 코드 / 나쁜 코드로 배우는 설계 입문

2. 독후감✍️
누군가 내 코드를 읽으며 인상을 찌푸릴 때, 한 번쯤은 속으로 물었던 그 말. '제 코드가 그렇게 이상한가요..?'

코드 품질과 관련된 내용은 어째서인지 신입 개발자에게는 너무 성급한 주제라고 생각했다. 새로운 지식을 한창 쌓아갈 시기에 쌓인 지식을 다듬는 느낌이라 그간 미뤄왔는데, 한 번도 사용하지 않았던 MVVM패턴에 맞춰 기능을 구현하기 바빠 나도 내 코드를 보면서 ' 어😯? ' 하는 경우가 생겨 공부를 시작했다.

교보문고에 "코드"를 검색해서 판매량 기준으로 정렬하면, 좋은 책들과의 경쟁에서 밀려 3페이지 가장 마지막에 머물러있다. 하지만, 이 책은 내가 처음으로 코드 설계와 구조에 대해 관심을 갖게해준 책으로, 주변에 추천하고 싶은 책이다. 읽으면서 중요한 내용은 다시 복기하려고 적어두었는데, 문맥을 잊어버릴까봐 책도 결국은 샀다.

이 글을 수정하고 있는 24년 7월 기준 나는 C#을 쓰고 있는데, Java로 되어있는 예제 코드를 따라 쓰면서 오랜만에 다시 Java를 공부하는 재미도 있었다. 여러 좋은 내용이 있었지만, 프로젝트에서 이 책을 보고 적용해봤던 내용은 조건 분기 부분이었다. 책에서 설명한 조기 return을 활용하는 방법은 아래와 같다.

3. 새롭게 알게 된 내용📑

if(0 < member.hitPoint){
    if(member.canAct()){
        if(magic.costMagicPoint <= member.magicPoint){
            member.consumeMagicPoint(magic.costMagicPoint);
            member.chant(magic);
        }
    }
}


// 조기 리턴으로 중첩 제거하기 1
if(member.hitPoint <= 0) return;

if(member.canAct()){
    if(magic.costMagicPoint <= member.magicPoint){
        member.consumeMagicPoint(magi.costMagicPoint);
        member.chant(magic);
    }
}


// 조기 리턴으로 중첩 제거하기 2
if(member.hitPoint <= 0){
    return;
}
if(!member.canAct()){
    return;
}
if(member.magicPoint < magic.costMagicPoint){
    return;
}
member.consumeMagicPoint(magic.costMagicPoint);
member.chant(magic);

 

float hitPointRate = member.hitPoint / member.maxHitPoint;

if(hitPointRate == 0){
    currentHealthCondition = HealthCondition.dead;
}
else if(hitPointRate < 0.3){
    currentHealthCondition = HealthCondition.danger;
}
else if(hitPointRate < 0.5){
    currentHealthCondition = HealthCondition.caution;
}
else{
    currentHealthCondition = HealthCondition.fine;
}

return currentHealthCondition;


// 가독성을 낮추는 else 구문도 조기 리턴으로 해결하기 1
float hitPointRate = member.hitPoint / member.maxHitPoint;

if(hitPoint == 0){
    return HealthCondition.dead;
}
else if(hitPoint < 0.3){
    return HealthCondition.danger;
}
else if(hitPoint < 0.5){
    return HealthCondition.caution;
}
else{
    return HealthCondition.fine;
}


// 가독성을 낮추는 else 구문도 조기 리턴으로 해결하기 2
float hitPointRate = member.hitPoint / member.maxHitPoint;

if(hitPoint == 0){
    return HealthCondition.dead;
}
if(hitPoint < 0.3){
    return HealthCondition.danger;
}
if(hitPoint < 0.5){
    return HealthCondition.caution;
}

return HealthCondition.fine;

4. 구매처🛒

 

 

Etc.

 

728x90
728x90

[헤드 퍼스트 C#]를 읽고 만든 프로그램에 대해 정리한 글입니다.

 

작성일: 2024-02-04

수정일: 

 

독서 기간: 2024-02-03 ~ 2024.02.04

 

📖

회사에서 WPF, C# 개발을 시작했습니다.

C#은 처음이기에 개인적인 추가 공부가 필요한 상황입니다🥸.

처음에는 Java를 배울 때처럼 정보의 바다, 유튭에서 강의를 찾았지만 자료가 상대적으로 부족하였습니다. 그래서.. 책📖을 샀습니다!

C#.. 여러 책이 있었지만, 이 책을 구매한 이유는 Visual Basic 2022 버전이 같았기에 이건 어쩌면 인연🫠이라고 생각했습니다.

이 책은 다양한 프로젝트를 만들어 볼 수 있는 예제가 있습니다. 그래서 만든 예제와 함께 개선할 점을 적어두면 나중에 리팩토링을 해보면 좋지 않을까해서 기록을 남겨둡니다.

 


 

짝 맞추기 게임

 

🫠개선하면 좋은 점

* 시작 버튼 추가

* 다양한 이모지 종류 추가

* 같은 모양의 이모지 개수 추가

* 최단 기록 저장

* 타이머 시간 감소

* (유사한 게임) 숫자 순서대로 클릭하기

728x90

'일상 > 독서의기록' 카테고리의 다른 글

Book Archive  (0) 2024.07.14
만화로 배우는 리눅스 시스템 관리 1 (1~9)  (1) 2024.01.27
코딩인터뷰 완전분석 (VI big-O 예제 8)  (0) 2024.01.22
728x90

 

이 글은 [만화로 배우는 리눅스 시스템 관리1]을 읽고 정리한 글입니다.

 

작성일: 2024-01-27

수정일: 

 

독서 기간: 2024-01-27 ~ 

 

📖

저에게는 사실 숨겨둔 자격증이 하나 있습니다. 리눅스 마스터 2급이죠. 취득은 했는데, 사용하지 않으니 윈도우 마스터가 되었습니다. 주말에 잠깐 시간을 내어 '아참, 나 리눅스 자격증 있었지..?'를 상기시켜보자 읽게 되었습니다.

(책은 [기억보단 기록을] 블로그에서 발견했습니다!)

 


 

1화 다른 컴퓨터를 리모트로 조작하고 싶어(SSH)

 

* SSH(Secure SHell): 다른 PC에 네트워크 경유로 로그인해서 자기 앞에 있는 PC처럼 조작할 수 있음

  * 통신경로는 암호화되어 안전

  * rsh(Remote SHell): 암호 입력 시, 그대로 네트워크로 보내기 때문에 노출될 위험이 존재

ssh user@192.168.11.0
# ssh 로그인_할_사용자명@접속할_로그인_pc_주소

ssh -Y -C user@192.168.11.0
# -Y: 실행의 결과로 나오는 시각적인 컨텐츠를 현재 이 컴퓨터에서도 보이도록 하기 위한 명령어
# -C: 통신 내용 압축 -> 응답 속도 향상

nautilus
# 우분투 - 현재 폴더 위치에서 바로 터미널 창을 열기 위해 사용

 

 

2화 임시로 관리자 권한을 얻고 싶어(sudo)

 

sudo
# 관리자 권한 실행

gksudo --sync nautils
# GUI 애플리케이션(Nautils)

 

 

3장 다양한 문자열을 한 번에 검색하고 싶어(grep)

 

grep -r -i "hello" /home/docs/
# grep 옵션 "검색하고 싶은 문자열" 경로
# -r: 서브 폴더까지 검색
# -i: 대소문자 무시

 

 

4장 터미널에서도 대화형으로 파일을 편집하고 싶어(vim)

 

* 데스크톱 환경

  * 마우스로 조작 가능한 환경

    * 서버를 구축할 때 테스크톱을 제외하고 최소 구성으로 설치할 경우, 서버 처리 능력을 최대한 활용할 수 있음

 

sudo apt-get install vim
# yum install vim
# vim 설치

vim /home/docs/abc.txt
# vim 편집하고 싶은 파일 경로
# 시스템 설정 파일 변경 시, sudo 명령어 추가

 

* 모드

  * i: 끼워넣기 모드 시작

  * Esc: 노멀 모드 시작

 

# 노멀 모드

/ guest ok = Yes
# / 검색할 내용

N
# 다음 검색어로 이동

Shift N
# 이전 검색어로 이동

 

Vim Cheat Sheet

 

 

5화 vim에서도 복사 & 붙이기 & 되돌리기를 하고 싶어(yank)

 

* 단말 자체의 조작

  * 마우스로도 키보드로도 가능한 조작

  * 예: 복사 - 단말이라는 창에 표시한 내용을 복사

          붙이기 - 단말은 붙일 내용을 키 입력 조작으로 변환

* 콘솔 애플리케이션 자체 조작

  * 키보드로만 할 수 있는 조작

 

Ctrl Z
# 실행중인 애플리케이션 일시 정지

fg
# 일시 정지된 애플리케이션 재실행

 

 

6화 갑자스러운 네트워크 끊김에서 복귀하고 싶어(가상 터미널)

 

사용자 입력 -> GNOME 단말 -> (가상 단말 -> Vim) / Vim -> 표시 결과 텍스트

* 가상 단말, GNOME 단말

  * 입력을 넘기고 받은 출력을 표시

  * 가상 단말

    * 일반 애플리케이션과 달리 로그아웃한 상태가 되더라도 계속 동작

    * 화면이 변경되어도 SSH 접속은 한 번만 하면 됨

    * 접속이 끊기기 쉬운 WiFi나 테더링 경유로 SSH 접속할 때 유

  * GNOME

    * 화면이 변경될 때, 그 때마다 서버에 SSH 접속을 함

 

sudo apt-get install tmux
# tmux 설치

tmux attch
# tmux 가상 단말에 재 접속(접속이 끊기기 전 상태로 돌아가기)

 

 

7화 다른 화면도 보면서 작업하고 싶어(화면 분할)

 

Ctrl B, "
# 화면 가로 분할

Ctrl B, %
# 화면 세로 분할

Ctrl B, 화살표
# 화면 포커스 이동

exit
# 화면 분할 해제

 

 

8화 최근 실행한 명령어를 호출하고 싶어(명령어 이력)

 

Ctrl R 검색어
# 검색어가 포함된 명령어 검색(과거 방향으로만 검색)

vim ~/.bashrc
Shift G
# 파일 마지막으로 이동

stty stop undef
# Ctrl S로 현재 방향으로만 검색 기능 추가

 

 

9화 오래전에 실행한 명령어를 호출하고 싶어(명령어 이력 검색)

 

vim ~/.bashrc

Shift G
# 파일 끝으로 이동

export HISTSIZE=10000
# 메모리에 저장할 이력의 최대 건수
export HISTFILESIZE=10000
# .bash_history에 저장할 이력의 최대 건수

function share_history {
	history -a
	history -c
	history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
# 명령어를 실핼할 때마다 .bash_history와 메모리의 명령어 이력 동기화
# 다른 화면 bash에서 실행한 명령어도 명령어 이력 검색에서 찾을 수 있음

 

728x90
728x90

 

이 글은 [코딩인터뷰 완전분석]을 읽고 정리한 글입니다.

 

작성일: 2024-01-22

수정일: 

 

독서 기간: 2024-01-22 ~ 😮

 

기본 환경

☕Java

 

📖

깊이우선탐색과 너비우선탐색을 하다가 멈춰버린 알고리즘..

근본을 찾아 틈틈이 읽어보려고 했는데, 분량이 어마어마합니다. 880페이지..😮

우선 파이팅..!


문제

여러 개의 문자열로 구성된 배열이 주어졌을 때 각각의 문자열을 먼저 정렬하고 그 다음에 전체 문자열을 사전순으로 정렬하는 알고리즘의 수행시간

 

 

해설

- 가장 긴 문자열의 길이: s

- 배열의 길이: a

 

1. 각 문자열을 정렬하는 데 걸리는 시간: O(slogs)

    * 이진탐색 기준: 총 글자수 * 파티션 글자수

    * logs: 데이터가 s개 일 때, logs 단계만에 원하는 데이터를 찾을 수 있음

2. a개의 문자열 정렬하는 데 걸리는 시간: O(a* slogs)

3. 전체 문자열을 사전순으로 정렬하는 데 걸리는 시간

    3.1. 문자열 전체 비교: O(aloga)

    3.2. 문자열 2개를 비교: O(s)

        * 각 문자열을 비교하는 데 걸리는 시간은 문자열의 길이 s에 비례

    3.3. 총 소요시간: O(s*aloga)

4. 전체 시간 복잡도: O(a*s(loga + logs))

 

 

⭐ 중요

역할이 다른 변수는 다른 이름으로 지정, 모두 N으로 선언해서는 안됨

 

728x90