레이블이 컴퓨터인 게시물을 표시합니다. 모든 게시물 표시
레이블이 컴퓨터인 게시물을 표시합니다. 모든 게시물 표시

2024년 10월 21일 월요일

스마트폰 PC 데이터 공유 방법 (안전하게 백업 하자)

오랜만에 PC, 스마트폰 교체한 후에 알게 된 상식. 내가 너무 무식했었구나. ㅋㅋㅋ 10년 지나니 기술이 많이 달라졌네? 옛날부터 느낀 거지만 작은 저장 매체들인 카세트 테이프, 비디오 테이프, 플로피 디스크, CD, DVD 등은 많이 사 봤자 결국 다 버리게 된다. 더 큰 저장 매체인 인터넷 저장소(넷플릭스 같은 거), HDD, Flash 메모리(SSD, USB 메모리, SD 카드 등)가 등장 하거든. 항상 예상한 그대로 되는 거 같네.



유심(신분증)이 없어도 옛날 기계들처럼 사용 가능하다
암호를 풀어 화면이 열린 상태에서 연결해야 한다

옛날엔 대충 3가지 방법이 있었다.

  1. USB 직접 연결 : 이렇게 하면 스마트폰이 옛날 기계들 역할을 하게 됨
  2. FTP(파일 전송 프로토콜) 이용 : 요즘은 클라우드(구름), 드라이브(운전?)라고 함
  3. e-mail 첨부 파일 : 대용량 파일 전달엔 불리했었다. 편지가 아닌 소포에 해당.

이게 이름만 바뀐 거 같네. 여전히 그 방법 그대로 달라진 건 없네. 단지 동기화 기능이 추가 된 것만 다르네. 좀 더 자세하게 그리면 아래와 같다.


여기서 가까운 길을 보면, 3가지가 있다.
  1. USB 직접 연결 : 스마트폰에 단순 메모리 장치 역할만 함 (확실한 방법)
  2. LAN 안에서 드라이브 공유 : PC 폴더 공유 방식, 두 장치 호환성 문제로 잘 안 됨
  3. 근접 무선 통신(블루투스) 연결 : 이것도 두 장치 호환성 문제로 잘 안 됨

원거리(인터넷)를 이용하는 방법과 USB를 직접 연결하는 방식은 뭔가 표준화 되어서 잘 동작하는데, 네트워크 안에서 폴더 / 드라이브 공유 방식은 O/S가 달라도 안 되는 경우가 있었다. 2개 기계를 무선으로 연결하는 경우도 아마 호환성 문제로 옛날 기계와 새 기계 사이에 통신은 잘 안 될 것이다. 2개의 기계가 통신 하려면 통신 방법이 같아야 하는데, 옛날 것과 새 것의 통신 방법이 다르면 안 되는 것이지. 호환성 좋은 옛날 방식이 확실하다.


여기서 유선과 무선 짝짓기(Pairing) 차이를 보자.

  1. 유선 : 두 기계를 직접 연결한 경우 기계들은 누구와 대화 해야 하는지 안다.
  2. 무선 : 허공에 서로 떠들기 때문에 누구와 대화 해야 한다고 알려 줘야 한다.
  3. 네트 : 멀리 떨어진 기계를 대신하는 숫자(전화번호/인터넷IP주소)를 교환기에 알린다. 

유선이나 무선이나 도청이 가능하기 때문에 암호로 대화해야 한다. 옛날엔 이런 게 없어서 도청하면 바로 내용을 알 수 있었다. 초기 무선 전화기는 옆집에서 라디오 주파수 대역을 늘리도록 수정하면 도청 가능했다. 그래서 무선은 2가지를 서로 맞추어야 한다. 주파수 대역(채널)과 암호 방식이다. 여기서 주파수 대역이란 음의 높고 낮음이라 생각하면 된다. 암호란 외국어라고 생각하면 된다. 우리 이제 소프라노 대역으로 프랑스어로 대화하자 뭐 이런 거지. 그런데 이런 내용도 남들이 도청하기 때문에 도청이 불가능한 통신이란 세상에 없다.



이 중에서 인터넷 보관은 편리하나 믿을 수 없다. 중요한 파일 보관 순서.

  1. 백업 저장 장치 : 가장 안전함 (언제나 내 것임)
  2. PC / 스마트폰 : 고장 나거나 분실, 교체하면? 본인 인증 지옥으로...
  3. 인터넷 e-mail, 클라우드 드라이브 : 로그인 거부하면 내 것 아님

PC나 스마트폰이 갑자기 달라진 경우 누군가 해킹하는 걸로 추정하고, 인터넷 계정이 ID/PW만으로는 안 열리며, 본인 인증을 하라고 괴롭히는 경우가 있음. 그러니 인터넷은 공유 목적의 임시 저장 공간으로 생각 하는 게 안전함.

생각을 해 보라고. 지가 무슨 수로 본인 인증을 하겠어? 결국 아래 정보 맞춰 보는 게 전부잖아? 암호 말고 나머지는 다 노출 된 거 아냐? 암호를 정확히 넣었는데 왜 로그인 못 하게 하는 거지?

  1. ID : 이것도 e-mail 주고 받으면서 쉽게 알게 되지?
  2. PW : 이게 가장 중요함 → 이걸 무시해?
  3. 실명 : 남의 이름은 쉽게 알 수 있지?
  4. 생일 / 주민 번호(신분 번호) : 이것도 쉽게 알 수 있지?
  5. 계좌 번호 / 신용 카드 번호 등 : 이것도 거래 하면 알 수 있지?
  6. 전화번호 : 이것도 통화 하면 알게 되고 그 휴대폰까지 가지고 있다면?

본인임을 확인하는 가장 중요한 게 암호라고. 검찰이 안농운 스마트폰 압수해 가도 암호 안 알려 주니까 못 열잖아? 그런데 암호 넣었는데 무슨 다른 본인 인증이 필요하다는 거야? 분실하거나 고장 난 옛날 폰으로 인증 번호 보내서 볼 수 없고, 다른 이메일로 인증 번호 보내면, 그 이메일도 본인 인증 한다면서 다른 이메일로 인증 번호 또 보내고...



국민 평균보다 질 떨어지는 것들에 속아 정권 찬탈 당한 꾸리안들이나
이런 것들에게 정권 넘겨 준 덜민주와 문죄인 무리도 참 한심하네
가족이나 친구나... 내 주변엔 왜 이런 멍청이들만 있는 것일까? 
욕하기 싫어도 어이 없어 욕이 나온다
그러면서 난 왜 무시해? 
그래도 내 말 무시하고 잘 된 놈 없어서 다행이다 ㅋㅋㅋ
어리석고 무식하고 미신 믿는 사람과는 함께 하지 말아야지...
대가리에 똥만 차서 꾸리꾸리한 새끼들...

2024년 10월 18일 금요일

USB 플래시 드라이브 (USB 메모리 / 스틱 / 키) 포맷 형식 3가지 FAT32 / NTFS / exFAT

USB 플래스 드라이브를 PC USB 포트에 꼽고 포맷을 하면 다음과 같은 화면 나온다.


3가지 중에 뭐가 좋은가? 위키 백과 읽어 봐도 오타인 오해인지 이해를 못 하겠는데, AI에게 물어 보니 깔끔하게 나온다. AI 만세!


그러니까 옛날 각종 기계들에서도 사용하려면 FAT32를 쓰고, 4GB가 넘는 대용량 동영상을 보관하거나 오류가 나면 안 되는 중요한 개인 파일 백업 할 용도라면 NTFS로 하면 된다는 것. USB 메모리 성능(속도)을 최대한 높이고 싶다면 exFAT을 사용한다.


다음은 위키 백과의 자세한 내용인데 오타 때문에 신뢰도가 낮다. 


일단 익숙하지 않은 용량 단위를 사용하니까 미리 정리하자. 표기가 달라졌을 뿐 옛날과 같은 거다. 표의 아래 숫자들은 CPU의 정수 처리 단위나 버스(데이터 이동 통로)의 데이터 이동 단위를 추가한 것이다. 이건 메모리 용량과 관계가 있다. 메모리 위치를 지정하려고 정수를 사용하기 때문이다. 또한 파일의 개수, 클러스터 위치, 섹터 위치, 트랙 위치 등을 지정하는데 정수를 사용한다. 컴퓨터에선 무한이란 게 없고 항상 최대 값에 한계가 있다. 우리가 사용하는 종이 노트에도 숫자와 글자를 써넣을 공간의 한계가 있는 것처럼.


옛날 디스크 형태 메모리 장치와 반도체 메모리 장치를 비교해 본 것이다. 처음엔 녹음 테이프 형태(스크롤 / 두루마리 형태 책과 같음)를 사용했는데 처음과 끝으로 이동할 때 한 참 돌려야 하는 문제가 있어서 나온 것이 디스크 형태(페이지 단위 묶음 형태 책과 같음)이다. 이건 원통 좌표계라서 (각도, 반경) 조작으로 좀 더 빨리 특정 기억 장소로 이동할 수 있다. 단지 각도는 원반이 회전해서 올 때까지 약간 기다리는 시간이 있고, 반경은 센서가 내외로 이동하는 시간이 필요하다. 반도체 메모리 형태는 그냥 주소로 바로 위치를 지정하는 1차원 배열이지만, 주소의 자릿수를 이용해서 2차원 배열(행렬)로 표현할 수 있는 직각 좌표계라서 (X, Y) 좌표 조작으로 더 빨리 특정 장소로 이동할 수 있다. 3차원 배열 이상은 텐서라고 부른다. USB나 SSD는 이 형태이지만, 앞의 2개 파일 시스템이 HDD 사용할 때 만든 것이라 용어를 알아야 한다.

파일 내 바이트 위치 ↔ 클러스터 주소 ↔ 트랙/섹터 위치

여기서 최소 단위 섹터나 클러스터의 크기는 파일의 최소 크기가 된다. 왜냐하면 HDD가 이 단위로 읽고 쓰기 때문이다. 공책으로 말 하면 빈 페이지 하나라 생각해라. 반도체 메모리의 경우에도 이런 페이지(클러스터/블록) 개념이 필요하다. 플래시 메모리도 실제 이런 단위가 있어 이 안에선 직렬로 읽고 쓴다. 책의 목차도 페이지 번호를 적어 놓지 문장이 적힌 행 위치까지 적어 놓지는 않는다. 그건 그 페이지 가서 훑어 봐야 알 수 있다. 수첩은 페이지 면적이 작다. 전체 용량이 작을 때는 저장 공간을 효율적으로 관리하기 위해서 클러스터가 작은 것이다. 공책은 페이지 면적이 크다. 용량이 넉넉하면 클러스터를 크게 해도 된다. 다루는 파일의 크기가 크다면 클러스터도 크게 하는 게 그렇게 비효율적이지 않다. 클러스터는 저장 용량과 저장할 파일의 평균적 크기에 비례해서 선택하면 된다.

참고로 버스라는 건 장치들 사이에 데이터를 주고 받는 도로인데, 옛날엔 병렬을 사용했었다. 그런데 이 병렬 신호가 고속이 되니 도착 시간에 차이가 있고, 전선 사이에 간섭이 있어 문제가 된다. 그라운드 선 1개에 여러 신호 선이 붙은 형국. 요즘은 고속의 직렬 통신을 사용한다. 2개의 선이 붙어 있는 직렬 통신에선 전선 사이 간섭이 없다. 상행선 하행선 2차선을 묶은 게 단위다. 전선은 4개가 되는 것이다. 이 고속의 직렬 통신을 몇 차선 쓰느냐, 도로의 제한 속력에 따라서 통신 속도가 결정 된다. 이런 하드웨어 통신 전선 규격 말고도 컴퓨터와 장치 사이에 데이터를 주고 받는 절차인 소프트웨어 규격이 있다. 자기 컴퓨터 안에서만 쓸 경우 문제가 없는데, 다른 컴퓨터로 데이터를 옮길 때는 이 모든 게 맞아야 한다.


다음은 위키 백과 내용인데 오타 때문인지 뭔 소리 하는지 모르겠다. ㅋㅋㅋ


최대 용량 계산이 이상해서 계산법을 좀 보자.

최대 파일 수 x 클러스터 크기 = 최대 용량

FAT 12 최대 용량 계산 : 
4068 x 8 KB = 31.78 MB
4068 x 64 KB = 254.25 MB

FAT 16 최대 용량 계산 :
65460 x 32 KB = 1.99 GB
65460 x 64 KB = 3.99 GB

FAT 32 최대 용량 계산 : 
268173300 x 8 KB = 1.99 TB
268173300 x 32 KB = 7.99 TB
268173300 x 64 KB = 15.98 TB


계산법에 따르면 최대 파일 수, 최대 클러스터 수는 정수로 정해져 있으니까 클러스터 크기에 따라 최대 용량이 달라지게 되어 있다는 걸 알 수 있다. 그러니까 수첩이나 노트로 말 하면 페이지 수는 정해져 있고, 페이지 크기만 다르다는 얘기지.

가장 먼저 나온 것으로 년도를 보면 상당히 구닥다리이나 간단한 구조라 한다. 파일을 다룰 때 바이트 단위로 위치를 지정하기 때문에, 이 위치를 지정하는 정수 크기가 파일 크기가 된다. 이 정수가 32비트 크기이고 고로 4GB로 용량 제한이 있게 된다. 클러스터는 최소 파일 사이즈이니까 최대 파일 수는 최대 클러스터 수라고 생각하면 된다. 고로 최대 용량은 클러스터를 지정하는 정수 크기와 클러스터의 크기를 곱하면 나오게 된다. 그런데 위를 보면 알겠지만 뭐가 맞는 계산인지 모르겠다. ㅋㅋㅋ

이론적으로 가능한 것 vs 실제 O/S에서 허용한 한계 vs 호환성 때문에 제한

USB 드라이브 / SSD (Flash 메모리 반도체 계통)의 경우 최대 용량은 큰 의미가 없을 것이다. 어차피 도달하지 못 하니까. 값이 싼 HDD로는 테라 바이트에 도달하는데 값 비싼 Flash 메모리로 거기까지 도달하려면 부자여야 할 거다. 문제는 최대 파일 크기에 4GB (32비트 정수) 한계가 있다는 것. 그래서 이걸 넘는 동영상들은 저장하기 힘들다. 동영상을 제외하고 이 크기를 넘는 파일은 거의 없기 때문에 대부분의 경우 무난하다.




그 다음 나온 것인데 년도를 보면 역시 구닥다리이다. 이건 일단 파일 용량 한계 4GB를 넘겼다. 최대 파일 크기가 16 TB인지 16 EB인지 모르겠으나 여하튼 파일 크기 문제는 없겠다. 그리고 보안이나 오류 복구에 유리하다고 하니 백업할 때 사용하면 좋을 것 같다. USB 드라이브 / SSD (플래시 메모리 반도체 계통)나 HDD의 경우라 하더라도 최대 용량 도달하긴 힘들 거 같으니 최대 용량 신경 안 써도 될 거 같다. 이건 간단하게 파일의 바이트 위치 지정은 64비트를 쓴 거 같고, 클러스터 위치 지정은 32비트를 쓴 거 같다. 그런데 또 다른 표기에선 64비트 클러스터 수를 지원하는 거 같으니까 클러스터 위치도 64비트를 쓴 거 같네. (제일 앞의 인공지능이 알려 준 표를 봐라)



3개 중엔 가장 늦게 나온 건데 별칭이 FAT64인 걸 보면 FAT32의 단순한 확장 같다. 최대 용량 크기와 최대 파일 크기가 같은 걸 보니까 1개 파일로 저장 공간을 다 채울 수도 있단 거네. 그런데 서로 다른 문장들이 있으니 16 EB는 NTFS 것을 잘 못 베낀 건가? 그런데 지금은 별로 쓸 일이 없다는 것. 이런 용량을 뭐로 도달하겠냐? HDD로도 힘들겠다. 그러나 고용량 플래시 메모리 미디어를 위한 파일 시스템이라고 한 걸 보면 USB 드라이브 / SSD 용도로 만들었단 걸 알 수 있지. 그래서 당연히 USB 메모리 / SSD에 더 효율적이겠으나 아직은 호환성이 낮다고 하니 백업용으론 좋으나 다른 장치에 데이터 전달용으론 무리겠다. O/S가 임베디드라는 건 스마트폰 같은 휴대용 소형 컴퓨터에 사용한다는 의미니까, 말 그대로 플래시 메모리에 맞게 만든 거란 얘기네. 그렇다면 성능은 가장 좋겠군.


경제력 군사력으론 선진국 수준
정치적 제도적으론 후진국 수준
똥검개판이 뇌물 먹고, 범죄 방조 하고, 정적 모함 하고, 정치 개입 하는 나라
꾸리꾸리한 꾸리아! ㅋㅋㅋ 냄새 쥑인다.
일당 독재 갱북 대구隊寇에 많이 사는 나라 망칠 친일 독재 잔당 문디좆 냄새.
거짓말 제조기 극우 꼴통 십세!
거짓말 판독기 인공 지능 만세!
한국 친일 극우, 일본 극우는 미국 극우(마가), CIA 지원을 받는다며?
그럼 이재명 모함 → 암살 시도 → 쿠데타 이 모든 배후가 미국 극우, CIA야? ㅋㅋㅋ
그럼 미국은 이제 우리의 적인 거야? ㅋㅋㅋ

2024년 10월 15일 화요일

구글 계정 사용하지 않을 때는 반드시 로그아웃 해야 하는 이유 (지랄 같은 본인 인증)

로그인 상태에서 다음과 같은 일이 동시에 생기면 좆 빠지게 고생한다.

  1. 갑자기 PC 저장 장치가 고장 나거나 PC를 교체한 경우
  2. 갑자기 휴대폰을 분실/교체하거나
  3. 갑자기 전화 번호를 바꾼 경우

구글은 어떤 해커가 다른 기계로 로그인 시도한 걸로 보고 본인 확인을 하는데 그 방법이 아주 골 때린다는 거지. 분명 ID/PW 정확하게 넣었거든? 그럼 그냥 통과 시켜 주면 되잖아? 왜 본인 확인을 또 하는 거냐고! 본인 확인을 꼭 하고 싶다면 그 사람이 직접 본인만 아는 질문과 답변을 만들도록 하라고. 문답 3번 정도 만들면 되잖아?


내가 실제 겪은 본인 인증 지옥에 빠진 사례 1

남에게 받은 중고 스마트폰으로 바꾸었다. 그런데 스마트폰이 뭐가 잘 못 되었는지 계속 구글 계정을 입력하라고 한다. 몇 개 입력했는데 또 입력하라네? 이거 미친 거 아냐? (분실 폰인지 확인하기 위해 원래 사용자 본인 확인 해 달라는 것이었음) 그래서 답답해서 다른 사람 스마트폰 사용하려고 다른 곳으로 이동한 후에 인터넷 사용하려고 PC로 구글 로그인 하니 갑자기 본인 확인 한다면서 스마트폰으로 인증 번호를 보냈다네? 그런데 스마트폰은 전화도 안 되고, 문자도 안 되고, 구글 계정만 자꾸 물어보는 거야. 그러니 이도 저도 안 되고 어쩌란 거냐? 욕이 절로 나온다. 스마트폰과 PC가 비슷한 때에 고장 나면 어쩌란 거야?

그날 스마트폰도 바뀌었고 그 스마트폰 문제 때문에 다른 곳에 이동해서 다른 PC에서 구글에 접속했었다. 그러니까 구글은 PC 니꺼 맞아? 하고 원래 주인 계정을 물어 본 것이고, PC는 본인 확인 한다면서 되지도 않는 스마트폰에 인증 번호를 날리는 또라이 짓을 한 것이다. 그래서 다른 이메일로 인증 받으려고 하니까 그 이메일 계정도 똑같은 짓을 하더라. 공무원 스타일 일 처리다. A에게 가니 B에서 확인 받으라고 하고, B에게 가니 다시 A에게 확인 받으라는 식이다. 무한 반복 똥개 훈련. 가입 취소 원상 복구를 몇 번 했다. 남의 집 PC는 이제 사용도 못 하는 거야?


내가 실제 겪은 본인 인증 지옥에 빠진 사례 2

이 비슷한 일을 PC가 고장 나서 교체했을 때 또 겪었다는 것. 가장 중요한 HDD가 고장 난 것. 부팅도 안 되고, 내 데이터도 못 읽었다. (HDD는 프로그램 설치용, 데이터 보관용 2개를 사용할 것. 대용량 1개로 파티션 나눠도 망함) 항상 로그인 상태로 사용하였기 때문에 새 PC에서 로그인 하려고 하니 문제였다. 이번엔 복구 이메일이 문제였다. 모든 이메일 계정이 PC가 바뀐 걸 인지하고, 다른 이메일로 본인 확인 인증 번호를 보낸 것이다. 어이 없는 상황이 벌어졌다. 

아마 기억엔 가입했을 때 입력했던 전화번호로 본인 확인하여 겨우 로그인 했다. 가입했을 때 전화번호를 구글이 기억하고 있었나? 아니면 아마 스마트폰으로 이메일을 열었을 것이다. 그런데 스마트폰으로 이메일 열면 왜 본인 확인 안 하냐? ㅋㅋㅋ 스마트폰 암호가 그렇게 대단한 것도 아닌데? 그리고 침이 마르도록 구글 욕을 했다. 왜냐고? 그 계정에 내 중요한 파일들이 들어 있었거든. 폭탄 들고 구글 코리아에 쳐들어갈 뻔했다.

클라우드 드라이브, 이메일은 임시 공유 용도로만 사용할 것. 백업을 해도 보조용



ID/PW로도 부족하다면 다른 질문 몇 개 더 넣도록 하면 되잖아? 질문 자기가 만들고 답변도 자기가 만들면 그걸 기억 못 하는 놈이 있겠냐? 왜 옛날 스마트폰 번호로 인증 번호를 보내고, 이메일 계정 A와 B가 서로 상대편에게 본인 확인하라면서 인증 메일을 보내니? 어느 하나라도 인증을 해 줘야 할 거 아냐! 시작은 있어야 할 거 아니냐? 어떻게 서로 꼬리를 물고 계속 남에게 떠넘기기 하는 거냐? (바보엔 약이 없다) 

인증 기관이라고 하는 게 이런 거 하는 곳이다. 거긴 ID/PW 물어 보고 "그 놈 맞아" 이렇게 물어 본 곳에 알려 주는 게 일이다. 뭔가 사기 같지? 그래서 구글은 그거나 이거나 해서 다른 이메일이나 전화번호로 인증 받는 건데, 다른 이메일도 다른 이메일로 인증 받으라고 하니 지랄인 거지. 전화번호로 하면 왜 간단하게 인증이 되지? 거기도 PW 통과한 것밖엔 다른 게 없잖아? 누군가 스마트폰 화면만 열면 끝이잖아. 스마트폰엔 여러 센서가 달려 있어서, 여러 가지 암호가 가능한데 최고는 역시 긴 문자/숫자 나열이잖아? 그냥 2개 기계, 2개 사이트의 크로스체크(교차 검증) 수준에 불과한 거 아냐? 이놈 저놈 다 인증 앱 만들고, 인증 기관 한다고... (뭐가 달라? 얘들은 그냥 한 번에 인증을 해 주는 게 다르다 ㅋㅋㅋ)



그래서 복구 전화번호, 복구 이메일 따위는 사용하지 않기를 권장한다. (바보들의 설계)


안전하게 데이터 백업 하자


다음은 구글 계정 가입할 때 입력하는 내용이다. 처음 입력할 때 신원 확인을 위해서 이름, 생년월일, 휴대폰 번호를 넣는다. 즉 익명성은 없다는 거지. 이 정보는 한국에서만 물어 보는 걸까? 물론 이 정보를 암호화 해서 기계만 기억하고 있다면 문제 없겠으나 그걸 어떻게 믿어? 담당 프로그래머는 암호 다 풀 수 있을 건데? 옛날엔 이런 거 안 물어 보고 이메일 만들었거든. 인터넷이 민주주의에 기여 하는 이유가 바로 익명성인데... (물론 범죄에도 기여하지 그러나 최고의 범죄자는 학살/암살/납치/강간/고문하는 독재 정부라는 것) 전화기 없으면 이메일도 사용 못 하게 하냐? 그래서 (하도 많이 개인 정보 털린 기억이 있으니까) 가입한 후에 가짜 정보를 입력해 두고 있다.


그래 물어 봐, 난 가짜 정보 입력해 둘 거니까...



그래서 어떻게 할까? 가입한 모든 사이트의 ID를 노트/수첩에 정리 해 두고 다음 순서로 백업 만든다. 가입한 사이트가 너무 많아 기억 못 하거든. 

  1. 백업 저장 장치(USB / DVD / HDD / SSD 등) : 가장 안전, 중요한 건 암호 걸어 놓을 것
  2. PC 부팅 HDD : 고장 나면? 교체 하면 되는데, 그 이후 본인 인증 미궁 속으로 빠진다.
  3. 스마트폰 : 분실 하면? 이건 쉽다. 그냥 새로 장만 하고 로그인 하면 된다.
  4. 클라우드/이메일 : PC, 스마트폰, 전화번호 다 바뀌면? 본인 인증의 지옥 속으로 추락.

그리고 PW는 모두 일괄적으로 어느 한 때 통일해서 바꾼다. 이 PW가 진짜로 나 자신을 증명하는 유일한 거지. 물론 이런 내용이 적힌 파일은 비밀 번호를 걸어 둔다. 노트에 적을 때는? 암호에 대해 공부해 보라. 

암호 예) 좋아 하는 시조 하나를 외운다. 그러면 4x4=16개 한글 문자가 나온다. 이걸 암호로 사용하면 아무도 못 푼다. 그리고 각 글자의 초성을 숫자 0~9에 대응 시키면, 1경의 숫자 조합이 나온다. 그런데 오직 영문 대소문자 + 숫자 + 기호를 섞어야 하니 외우기 힘들지. 왜 다른 나라 문자는 못 사용하게 하는 거지? ㅋㅋㅋ

그리고 복구 전화 번호 등록 안 한다. PC와 스마트폰을 엮어 놓지 않는 게 좋다. 제발 스마트폰과 PC를 엮지 말라고. 서로 다른 사용자 취급하란 거지. 복구 이메일도 등록 안 한다. PC나 스마트폰이 바뀌면 모든 계정이 "너 누구냐?" 이런 식으로 나오니까, 그 기계로는 어차피 복구가 안 된다. 다른 기계(스마트폰)를 이용해야 복구할 수 있다. 정말 멍청한 짓이다. 정말 불편하다.

스마트폰과 PC가 같은 계정 공유 문제 : 장점은 동기화 하여 두 기계에서 같은 내용 다루니 편리하다는 것이고, 둘 중 하나 없어도 당장 인터넷 사용할 수 있다. 단점은 둘 중에 어느 하나가 해커에게 뚫렸을 경우다. 계정이 분리 되어 있다면 어느 하나만 털리겠지. 그래서 안전하게 스마트폰 계정과 PC 계정을 따로 만들어 분리해 둔다. 즉 공유할 게 있다면 두 계정이 서로 이메일 보내기 하는 거지.

제발 기본 원칙을 지키라고. 어느 기계든 상관 없이 ID/PW 등으로 그 사람임을 인증하게 하라고. 급하게 남의 기계 사용하는 사람 어쩌란 거냐? 아 당신이 평소 사용하던 기계가 아니니 그 자리에서 그냥 답답해 죽으세요? 이제 남의 집에 가서는 PC도 못 사용하는 거야? 눈도 없는 기계가 건방지게 본인 확인을 왜 하냐고! 익명성을 지키란 말야! 옛날 방식이 더 좋아! 

이런 문제 영화로 만들면 좋을 거 같다. 기계가 본인 인식을 못 해서 비참해지는 주인공. 고생 고생 하다 원인을 알고 분노한 주인공은 구글이나 네이버에 폭탄 들고 돌격하는 걸로 끝나는 거지. 화려하게 터지며 구글과 네이버 건물이 불 타며 무너지는 거야. 그리고 덤으로 조중동 건물도 불타며 무너지는 거지.

목적에 충실한 가장 단순한 방법이 가장 잘 팔리더라 (심플 이즈 더 베스트)



※ SIM / USIM은 의미로 보면 그냥 신분증 같은 거? 이것만 다른 기계에 끼우면 통화 가능함


※ SD 카드 : 안전한 디지털 카드? 옛날 카세트 테이프나 플로피 디스크 대체품


스마트폰은 서로 분리 되어도 이상 없는 4가지가 조립 된 것이다. 원래 소형 컴퓨터 + 인터넷 + 전화기의 결합이었기 때문에 이들을 분리하는 게 편하다. 기계 바꾸려면 모든 관련 정보를 다 바꿔야 하는 번거로움이 있는데, 조립식이면 분리해서 조립만 하면 되기 때문에 관련 정보를 다 바꿀 필요가 없는 거지. 전화기, 메모리, 인터넷 따로 떼서 새 기계에 붙이기만 하면 되잖아? (전화망은 유심이 그 역할을 하고, 메모리도 SD 카드라는 게 있긴 하지만, 스마트폰 내장 메모리는 분리가 안 되지) 보통은 메모리 내용 옮겨야 하고, 번호 이동 중에 뭔가 꼬이면 본인 인증하느라 먹통 되고, 회사에 전화해서 해결 해 달라고 협박하고...
  1. 인터넷도 사용료 내야 하지 (휴대폰은 공짜? 아니 무선 인터넷 주인이 냄)
  2. 전화망도 사용료 내야 하지 (이건 본인 인증 간단하던데?)
  3. 컴퓨터는 기계만 사면 자기 것이지 (CPU + RAM + ROM + 기타)
  4. 메모리에는 중요한 내용이 담겨 있잖아? 암호 외엔 답이 없지. 백업 필요.
이 4개는 분리 조립되는 게 더 편하다. 전화망 바꾸려고 모든 걸 바꿀 필요가 없잖아? 등록은 처음 한 번 하고 그 기계 부품 옮겨서 조립만 하면 되는 거였잖아? (그래서 유심 이동하여 꼽으면 되지) 지금은 메모리 내용이 더 중요해지고 있잖아? 메모리는 개인 비밀이 담긴 영혼과 같은 거라고. (그래서 SD 카드라는 걸 사용하지) 비밀 번호 하나만 만들면 각 장치 사용을 통제할 수 있는데, 본인 인증의 무한 지옥에 빠져서 몇 번을 반복해야 하는 건지... 원격 본인 인증이란 게 결국은 본질이 ID/PW의 반복 문답이잖아? 이름, 주민번호, 전화번호 이거 모두 ID잖아? 많이 물어 봤자 소용 없어. 다 까발려진 건데. 결국 마지막은 PW잖아? 제발 한 번으로 끝내자고. 왜 폰에선 안 물어보는 걸 PC에선 물어 보냐고!

내가 누구의 이름, 주민번호, 전화번호, 주소, ID 등은 알았다고 해. 쉽게 알 수 있겠지? 그런데 비밀번호는 그 사람을 잡아 고문하지 않고는 알 수 없겠지? 너희들이 하고 있는 본인 인증 통과한 애가 정말 본인이 맞겠니? 직접 신분증 보고 얼굴 보고 판단하는 게 확실하지 않겠니? 사람 고용하기 싫어서 너무 싸구려로 일 처리하는 거 아니냐? 전화로 물어 보는 것도 역시 같은 거라고. 크로스체크잖아. (PC는 누구 것인지 모르지만 스마트폰은 누구 것인지 확실하니까 스마트폰을 통해 본인 인증?) 그냥 ID/PW 물어 보고 끝내라고! 어차피 뻘짓이야! 최종적으로는 암호잖아! 본인 확인한다면서 물어 보는 게 어차피 이름, 생년월일, 주민번호, 전화번호, 신용카드 번호 같은 거잖아? 이제 그만 함이 어떠한가?

이 꾸리꾸리한 나라, 가족, 친구 모두 미쳐버린 거 아냐? 바보 새끼들...
꽃뱀에 꽈추 물린 똥개검사놈들에게 휘둘리는 한심한 나라 ㅋㅋㅋㅋ
꽃뱀 만세! 꽃뱀 잘 한다! 어디 예수 부처도 성추행범 만들어 봐라!

2023년 12월 8일 금요일

개인 보안 : 인터넷 검색 검열 기능 차단, 민망한 검색 결과나 파일 오픈 기록 숨기는 법

다음은 타인이 내가 본 파일이나 내 검색 결과를 보지 못 하게 설정하는 방법이다. 예를 들어 야한 웹사이트나 야한 파일 등을 본 경우, 바보 같은 컴퓨터가 그걸 봤다는 걸 표시하니까 황당하잖아? 이렇게 기능 정지를 해도 남들이 또 기능을 살릴 수 있다. 그러니 자기 컴퓨터를 따로 사용하자.





다음은 무차별적 성인 검색을 하기 위해 필요한 절차다. 성인물이 아님에도 검색이 되지 않는 황당한 경우가 있다. 성적, 폭력적, 잔인함 XXX(트리플 X)에 해당해서 그런가? 잘 하면 정치, 종교 관련 내용도 검열 하겠네? 그런 경우 검열 기능을 꺼버리자. 구글 크롬에서 막기도 하는데 그러 경우 로그인을 하고 성인 인증을 한다. (나 어른이야 임마!) 의심스러운 링크는 흔적을 남기지 않기 위해 비밀창(시크릿창)으로 열어라.



정치, 종교, 역사는 왜곡된 정보가 많고 검열을 하기 때문에 믿을 게 못 된다. 

정치의 경우 한국은 독재 잔당이 집권하면 언론 탄압을 하여 검열을 하거나 선동용 거짓 정보를 퍼뜨리기 때문에 TV나 신문을 믿을 수 없다. 공산주의/자본주의 독재 국가를 포함한 모든 독재 국가에서 일어하는 현상이다. 진짜는 인터넷 언론을 검색해 찾아라.

종교의 경우 종교 간, 종파 간 음해 공작으로 거짓 정보를 퍼뜨릴 수 있다. 같은 기독교인 개신교와 천주교와 동방정교 사이에도 다툼이 있고, 기독교, 이슬람, 유대교, 힌두교, 불교 사이도 다툼이 있다. 학자들의 객관적 연구 결과도 부정할 정도로 미신적/맹신적이다. 진짜는 인터넷에서 경전을 검색해 찾아라.

역사도 정부의 목적에 따라 왜곡된 역사를 가르친다. 우리가 학교에서 배운 것은 1920년부터 일본이 한국에 가르친 일제 식민 사학이다. 근현대사의 경우는 친일파 독재 잔당 등이 여전히 힘을 쓰고 있어 학교에서 제대로 배울 수가 없다. 중국의 동북, 서북, 서남 공정이나 일본의 2차 대전 때의 전쟁 범죄 역사 왜곡도 그런 것이다. 진짜는 인터넷에서 사료를 직접 검색해 찾아라.

2023년 1월 4일 수요일

크롬 인터넷 최초 접속시 지연 문제 해결 (프록시 설정)

인터넷 초기 접속시 원본 서버가 아니라 프록시 서버를 검색하느라 시간이 소모 되어 잠시 접속이 멈춘 것처럼 보이는 현상. 아래 순서에 따라 프록시 자동 검색을 중지한다.





proxy [prάksi/prɔ́ksi] n.  

대리(권); 대리인(agent); 대용물; 대리 투표; 위임장.


프락치(러시아어: фракция = f프락찌야)는 러시아어로 원래는 도당, 당파, 당(黨)중의 당, 파벌, 파벌 싸움, 당쟁, 내분, 한 정당 내의 파벌, 분파, 그룹, 집단, 단체 등을 뜻하는 단어이나 대한민국에서는 어떤 목적을 위해 신분을 숨기고 다른 단체에 들어가 활동하는 사람을 뜻한다.


아마도 프락치와 프락시의 발음이 비슷해서 대리인 = 요원 = 첩보원 = 간첩 이렇게 오해한 걸로 보인다. 프록시 서버는 실제로 웹 서버 검색을 감시할 수 있다. A 서버 대신 중간의 B 서버가 A 서버인 척 하는 것이기 때문이다. 친일파 군부 독재 시절 경찰의 간첩이 된 학생들을 이렇게 불렀다고 하더라. 비슷한 오해로 빨치산도 있다. "빠르티z산"의 첫 발음이 빨갱이(공산당) "빨"과 비슷하고, 끝 발음이 "산山"과 비슷해서 산에서 활동하는 빨갱이 게릴라로 오해한다. 빨갱이 또한 공산당의 상징 색이 빨간 색이기 때문에 오해하게 된 단어이다.


ᛜpar·ti·san¹, -zan¹ [pάːrtǝzən/pὰːrtizǽn] n.  

① 한동아리, 도당, 일당; 당파심이 강한 사람; 열성적인 지지자《of》.

② 〖軍〗 유격병, 빨치산.


빨갱이는 한국·인도네시아·남아프리카 등지에 분포하며 강 어귀나 연안에 굴을 파고 생활하는 망둑어목 망둑어과의 몸 길이 17cm를 가진 바다 물고기이다. 


현재 물고기 빨갱이는 욕이 되었고 노인들이 사회 운동가, 자유주의, 민주주의, 환경 보호론자, 진보적인 사람들을 다 싸잡아 이렇게 욕하는데 당연히 명예훼손에 해당 되며, 한국에서 명예훼손은 형사 죄에 속한다. 즉 고소 고발이 다 가능하다. 김대중, 노무현, 문재인 빨갱이 하면 아무나 증거 잡아서 고발하면 된다. 왜 명예훼손이 형사범에 속하는지 모르겠다. 개인들 사이의 일인데 말이다. 한국 법은 일제 시대 법을 베끼고 독재 시절에 정부 입맛에 맞게 수정된 걸로 아는데 너무 시대에 뒤쳐져 있다. 50년이 넘고 거의 80년이 다 되어 가는 법이잖아? 시대에 맞게 선진국 수준에 맞게 고쳐야 한다.


1945년 해방 때 태어난 사람은 2023년엔 78세이다. 

1950년 한국 전쟁 때 태어난 사람은 2023년엔 73세이다.

1960년 4.19 혁명 때 태어난 사람은 2023년엔 63세이다.

1961년 5.16 쿠데타 이후

1987년 민주화 될 때까지 

60, 70대는 27년 동안 박정희, 전두환 독재 밑에서 학창 시절, 젊은 시절을 살며 노예로 세뇌 당한 세대이다. 이승만 시대 친일파를, 진짜 한국 전쟁을 경험한 세대는 80/90대이다. 그리고 이 노예 세대를 빨아 먹는 것들도 같은 나이 또래이다. 한 번 길들여지면 다시 자유를 줘도 못 누린다. 노예 근성.

이 시대 빨갱이로 몰리면 죽음이었고, 자유/민주/진보 외치면 빨갱이로 몰렸다. 이 노인들 눈에는 군부 독재에 반하는 건 모두 빨갱이인 것이다. 공산주의 덕에 민주주의가 매 맞는 식. 또한 패권을 장악한 경상도 사람들은 타 지역(특히 전라도) 사람들을 차별했다. 마치 지배 민족과 피지배 민족 관계 같았다. 어딜 가나 경상도 노인들이 목소리가 큰 이유이다. 제주도가 왕따 당하고, 전라도가 왕따 당했다. 제주도 사람들은 일본으로 도망가서 재일 교포가 되었고, 전라도 사람들은 경상남도와 수도권에 취업 이민을 가게 된다.


레드 콤플렉스(Red Complex = 빨갱이 콤플렉스)는 공산주의에 대한 반감이 극대화되어, 어떤 사상을 공산주의인 것처럼 지칭하여 그 사상을 거부하는 것을 뜻한다.


이 시대 20대 남자들이 철 없이 친일파 독재 잔당을 지지하던데, 20대가 뭘 알겠나? 그 나이에 정치를 알면 이미 어른이지. 원래 남자는 30세가 되어야 철이 든다. 문제는 정보 부족이다. 20대, 60/70대 투표는 솔직히 무시해야 옳다. 기분 나쁘겠지만 어쩔 수 없다. 고대엔 20대에게 투표권도 안 줬다. 고대 60/70대는 좀 있으면 저승 갈 사람들이어서 숫자가 적었다. 그러니까 사회에 나와 일을 하는 세대에게만 투표권을 줘야 한다. 언론이 사람들을 속이는데 정보가 부족한 사람들은 뭔가 이상함을 눈치 못 채고 쉽게 속는다. 언론에게 사기 당했다고 해야 할까? 아니면 학교 교육이 개판이 되었나?

친일파 군부 독재 잔당은 자유, 민주, 민족 주의와 모순이잖아? 

어떻게 뻔뻔하게 이런 단어를 사용할 수 있지?

2022년 1월 25일 화요일

컴퓨터 DVD Reader 분해 청소

모든 기계는 닦고, 기름칠 하고, 정기적으로 움직여 줘야 한다. 

DVD를 너무 사용하지 않으니 DVD를 인식하지 못 하고 CD Reader로만 동작하더라. DVD나 HDD의 적은 진동이다. 기계적 회전을 하고 센서와 디스크 사이의 간격이 중요하기 때문에 진동이 민감하다. 동작 이상이 있을 경우 진동부터 확인해 보라.





분해 하는 방법을 모를 때 함부로 나사를 돌려 빼게 되는데 매우 후회하게 된다. 

중앙 회전 모터 나사를 뺐다가 레이저와 높이 맞추느라 하루 종일 실험했다.

너무 높아도 낮아도 안 된다. 낮으면 DVD 디스크 표면 손상, 높으면 포커스를 못 잡는다.

레이저 렌즈 부분은 손대서 기름 묻히지 않았다면 굳이 청소 할 필요는 없다.



용감하게 뚜껑이 없는 상태에서 구동을 해 보았다. (10년 된 것이라서)

처음에 레이저/렌즈가 내경 쪽으로 이동해서 포커스(초점)를 맞춘다.

디스크가 없거나 초점이 맞지 않으면 거기서 멈춘다.

초점이 안 맞으면 디스크를 약간 돌려 보거나 내경 외경으로 살짝 이동해서 읽어 본다.

데이터가 있는 층에 초점이 맞으면 갑자기 회전을 넣고 읽기 시작한다.

강하게 회전 넣을 때 DVD가 튀기도 하니까 솜봉으로 살짝 눌러 준다.

회전 소리가 들리고 포커스 맞추는 소리가 나면 거의 정상적으로 인식한 것이다.


레이저/렌즈 위에 약간의 먼지가 있다고 해서, DVD 투명 표면에 약간의 흠이 나고, 지문이 묻고, 먼지가 묻었다고 해서, 잘 못 읽는 건 아니다. 남의 눈에 티끌은 보여도 자기 눈 앞에 흠을 보지 못 한다는 말이 있다. 몇 mm 정도 되는 직경의 빛 다발이 한 점에 모이기 때문에 일부가 가린다고 해도 나머지는 통과한다. 또한 초점이 맞는 표면이 아닌 곳에 있는 형상은 보이지도 않는다. 거의 10년을 방치했지만 레이저/렌즈 부분은 청소할 필요가 없을 정도이다.

2020년 12월 7일 월요일

크롬으로 동영상 다운 받기, 복사 방지 해제하기

일단 크롬이 있어야 하니 설치한다.


동영상이 포함된 화면에서 다음과 같은 짓을 한다. 


F12는 지금 열려 있는 페이지에만 통하고 다른 탭의 페이지에는 안 먹히니 안심해라. 설정 아무렇게나 바꿔도 그 페이지 닫으면 사라진다.

한 페이지에는 동영상, 광고 Flash 방송 등 여러 미디어가 있기 때문에 뭐가 동영상인지 잘 구분해야 한다. 일단 재생을 하면 어느 하나만 지속적으로 계속 다운로드 되는 걸 알 수 있는데 그게 바로 네놈이 원하는 그 동영상이다. 주의할 것은 시끄러우니 스피커를 꺼야 한다. 이어폰을 사용할 것.

야동 서버가 일본이라면 한국과 시간이 비슷하기 때문에 출근하는 아침 시간이 한산하여 다운로드 하기 쉽다. 흐흐흐흡 😈

서버가 유럽이나 미국에 있다면? 시간 차이를 잘 계산해서 그 동네 아침 출근 시간에 다운로드 받아야 쉽다. 크하하하 😈

유럽이 약 8시간 차이. 미국 서부도 약 8시간 차이다. 8 x 3 = 24. 정확히는 런던, 북경, LA가 8시간 차이다. 그러면 계산해 볼까?

  • 일본 오전 = 한국 오전
  • 미국 오전 = 한국 밤
  • 유럽 오전 = 한국 오후


그 외 다른 방법을 검색해 보면

  1. https://9xbuddy.online/ko - 웹 사이트에 URL 알려 주면 다운로드 그러나 느림
  2. 크롬 웹 스토어 Video Downloader Plus - 동영상 프리로드 후 빠른 다운로드
  3. PC 설치 WonderShare UniConverter 16 - 빠른 다운로드 + 포맷 변환 + 유료  

웹사이트에 따라서 되는 게 있고 안 되는 게 있다. Video Donwloader Plus는 동영상이 프리로드가 되어 있어야 다운로드가 된다. 그렇지 않은 사이트는 안 된다. 프리로드가 되어 있으니까 빠른 다운로드가 되는 거겠지? 9xbuddy.online은 프리로드가 되지 않는 사이트라도 되기는 하지만 동영상 재생 시간 동안 다운 받는다. 프리로드가 안 되어 있으니까 재생하면서 다운 받는 거겠지?

요즘은 다운로드 할 필요 없다. 넷플릭스처럼 웹 사이트에서 쉽게 볼 수 있도록 서비스하기 때문인데, 그래도 이런 프로그램을 사용하는 이유가 뭘까? 그러나 매우 인상적인 동영상들이 있는데 나중에 찾아 보면 구하기 힘든 것들도 있다. 그런 건 개인 소장 하는 게 좋다. 아마도 이런 기능은 원래 남의 사이트의 자료를 베끼려고 만든 것이기 때문에 고해상도 원본을 다운로드 받을 수 있다. 희귀한 것이란?

  1. 아름다운 것
  2. 진실한 것 (열심히 찍었거나 가짜가 아닌 진짜)
  3. XXX (이것의 의미는 다양하다. 야한 것을 의미하기도 한다)



복사 방지 되어 있는 페이지는 다음과 같이 다룬다.


역시 F12는 현재 열린 페이지에만 통하니 안심해라. 다른 탭의 페이지에는 설정이 안 먹힌다.



일제 시대 우리가 배운 식민사관 = 지금도 학교에서 배우는 역사

  1. 국경을 반도로 좁혀 가르쳐라. (왜? 일본이 팔아 넘겼잖아.)
  2. 역사를 짧게 가르쳐라. (왜? 일본보다 빠르면 안 되니까.)
  3. 안 좋은 것만 가르쳐라. (왜? 열등감에 쩔도록)
  4. 가야는 국가가 아니라 가르쳐라. (왜? 임나 일본부가 가능해야 하잖아.)

그래서 우린 통신 이후 압록강 두만강을 넘은 적 없단다. 그럼 간도와 연해주엔 언제 들어가 살았냐? 또한 사국 시대 초반 이전은 신화란다. 오히려 중국 애들이 동이족 고조선 유적 발견하고 있단다. 조선을 말아 먹은 애들이 서인(사대주의자) → 노론(사도세자 사형) → 시파(매국노)인데 얘들이 친일파 조상이라 오히려 미화하고 있단다. 가야 = 임나, 그래서 임나일본부가 가능하려면 가야는 일본보다 역사가 늦어야 한단다. 그런데 가야가 있었을 때는 일본은 고분시대라 하여 정복 전쟁이 한참이던 때라는데? 야마토 정권은 가야 멸망 후에 생기는데? 역사 좀 아는 사람이 보면 비웃을 일인데 한중일 어용 사학자들 너무 하는 거 아냐? 창피를 모르냐?

2020년 7월 1일 수요일

컴퓨터 마우스 분해 청소 수리 하기



요즘 전자 제품들은 나사 구멍을 막아 놓아서 찾기 힘들게 만들던데, 역시 다른 전자 제품과 비슷하게 아랫도리를 잘 보면 나사 구멍을 하나 찾을 수 있을 것이다. 테이프로 덮어 놓아 보이지 않는다. 창피해서 가린 것일까? 뜯지 말라고 가린 것이다. A/S 받을 것도 아니니 뜯어 내고 나사를 푼다.

전선(마우스 꼬리)이 있는 앞 부분은 뚜껑과 바닥이 서로 이빨이 맞아 꼽히도록 되어 있다. 뚜껑의 이빨이 부러지지 않게 뚜껑의 엉덩이를 약간 들고 뒤로 빼면서 일단 홀라당 벗겨 낸다.

레이저 마우스라고 해서 레이저가 있는 줄 알았는데 없다. 그냥 발광 다이오드 같다. 아니 발광 다이오드 맞다. 프리즘이 있고 반사광을 집광하는 돋보기가 달려 있다. 이 돋보기 빛을 칩처럼 생긴 중앙의 광 센서가 처리한다.

사진은 2개의 마우스 구조를 본 것이다. 같은 구조다. 기판을 위로 들면 휠도 분해할 수 있다.



3개의 버튼이 있는데 작은 돌출 부분을 누르면 딸깍 소리가 난다. 휠 회전 부분은 드드득 하는 느낌이 나는 On/Off 스위치다. 스위치에는 전극이 3개 있다. 전극 하나는 공통, 다른 전극은 On/Off가 바뀐다. 버튼을 누르거나 회전을 한 스텝 하면 상태가 바뀐다. 어떻게 회전 방향을 감지하는지는 잘 모르겠다. 전문가가 아니라서.

휠 부분 근처에 오랫동안 쌓인 먼지를 닦아 낸다. 먼지는 주로 기계적 동작을 하는 부분에 잔뜩 쌓여 있다. 가장 먼저 문제가 발생하는 쪽이 휠이라는 건 뻔하다. 톱니와 스프링 사이에 먼지가 끼면 On/Off 전환이 잘 안 되게 된다. 바람을 세게 불어 넣어 먼지를 제거한다.

어떤 스위치든 스프링이 변형 되면 접촉이 확실하지 않게 된다. 그러면 On/Off가 선명하지 않아서 컴퓨터가 헛갈리게 된다. 휠의 경우는 상하 방향을 자주 헛갈리게 되고, 버튼의 경우는 클릭(Click)은 이상 없는데 드래그(Drag)가 잘 먹히지 않고 중간에 자주 끊어지게 된다. 버튼의 스프링이 탄력을 잃어 너무 자주 On/Off 전환이 일어나니 그런 것이다.

On/Off 전환 과정에선 매우 짧은 시간에 무수히 많은 떨림이 있다. 인간은 감지 하지 못 하나 기계는 감지한다. 기계가 On/Off 전환 순간의 이런 고주파 떨림에 반응하지 않게 둔감하게 감지하도록 되어 있는데 그 수준까지 넘은 경우 헛갈리는 현상이 발생한다. 즉 On/Off 상태가 일단 바뀌면 유지를 해야 하는데 떨림이 계속 발생한다는 소리다. 그럼 어떻게 하지?

마우스 버튼은 3개 있는데 그 중에 휠 버튼은 잘 사용하지 않는다. 아마도 좌측 버튼이 가장 많이 사용하기 때문에 먼저 고장날 것이다. 드래그가 잘 안 될 것이다. 그러면 중앙 버튼과 좌측 버튼을 바꾸면 된다. 납땜질을 좀 해야 한다. 다리가 3개라서 3개를 동시에 가열해서 뽑아야 한다.

컴퓨터 잔고장 주된 원인

2017년 4월 28일 금요일

아주 간단한 어셈블리어, 인터프리터, 컴파일러 제작하기?

힘들게 공룡과 기사가 그려진 컴파일러란 책을 보고 깨달은 것이다. 책은 정말 두꺼운데 내용을 요약하면 10% 정도로 줄겠더라. 정말 읽기 피곤할 정도로 난잡하게 쓴 책이다.



어셈블리어란?


기계어란 것은 컴퓨터가 이해하는 명령어로 숫자로 되어 있다. 이 숫자를 사람이 읽기 피곤하기 때문에 단어로 바꾼 것이 어셈블리어이다. 예를 들면 다음과 같은 꼴이다. 어떤 CPU의 명령어라고 하자.

9797 1234 5678 = Add $1234, $5678 = Acc ← $1234 + $5678

9797(꾸질꾸질) = Add = 더하라, $는 수가 아니라 주소를 의미. 1234, 5678은 메모리 주소이다. 내용은 1234번지와 5678번지 내용을 더해서 Acc 레지스터에 넣어라 하는 더하기 명령이다.

반복문과 조건문은 어셈블리어에서 보면 본질적으로 같다. 조건 판단(크다/작다/같다/다르다)을 하는 부분과 거기에 따라 실행할 명령어가 담긴 메모리 주소로 이동(점프)하는 부분으로 되어 있다. 그래서 어셈블리어에서도 조건문과 반복문은 고급언어처럼 보이게 할 수 있다. 반복문과 조건문 번역은 그렇게 어렵지 않다.

고급 언어와 어셈블리어 언어의 차이는 아마도 수식을 번역할 수 있느냐 없느냐 차이 정도? 정말 단순한 어셈블리어는 단어 vs 숫자 번역기 같은데 복잡한 어셈블리어는 수식도 번역해 준다. (인문계 친구에게 수학도 언어라고 얘기했더니 노발대발 하던데... 컴퓨터 분야에선 수학도 언어의 일종이라 언어 처리 기술을 사용한다. 유명한 과학자가 한 말이 있는데 수학은 우주를 표현하는 언어라고 하더라.)



인터프리터란?


고급언어에서 문제는 반복문, 조건문이 아니라 사람이 쓰는 수식을 기계가 이해하기 쉬운 순서로 바꾸는 것이다. 예를 들면 아래와 같다.

1234 + 5678 ⇒ + 1234 5678  ⇒ Add 1234, 5678 ⇒ Add(1234, 5678)

인간의 표현에선 연산자가 중간에 온다. 이걸 제일 앞에 나오게 하는 접두사, 제일 뒤에 나오게 하는 접미사 표현으로 바꾼다. 접두사 표현은 어셈블리어와 비슷한 영어식 어순이고, 함수 표현과도 같다. 접미사 표현은 한국어 어순과 같은 것이다.

1234 + 5678 ⇒ 1234 5678 +  ⇒ 1234와 5678을 더해라

이렇게 수식을 번역하고 바로 실행하는 것을 인터프리터라 한다. 고로 매번 실행할 때 번역 시간이 소모된다. 이 소모 시간을 피하려면 번역한 내용을 지우지 말고 재활용해야 하는데 메모리가 그만큼 소모된다.

반복문과 조건문 번역은 수식 번역만큼 오랜 시간이 걸리지 않는다. 고로 수식 번역 결과 정도만 따로 보관해도 처리 속도는 향상될 것이다. 아니면 반복문과 조건문까지 포함해서 번역한 것을 일정 단위로 저장했다가 재활용하는 것이다.

인터프리터의 장점은 메모리 절약 정도? 쉽게 코드를 수정할 수 있다는 것? 프로그램을 조립해서 사용하기 쉽다는 정도? 느리다는 것을 빼면 다 장점이다.

※ Java(자바)는 가상 머신 위에서 동작하는 인터프리터 언어이다. 그러니까 가상 머신의 코드를 진짜 머신의 코드로 바꾸는 과정이 필요하다. 그래서 실행 속도가 느리다. 그 경쟁자 C#은 가상 머신 코드를 진짜 실행 코드로 컴파일 하는 것도 추가 한다.



컴파일러란?


번역한 내용을 따로 만들어 두고 그것을 실행하기 때문에 번역 시간은 1회만 소모되고 처리 속도가 빠르다. 대신 번역한 내용을 담아야 하는 메모리 소모, 코드를 일부 수정하면 전체를 다시 번역해서 다른 부분들과 조립해야 하는 번거로움이 있다. 실행 속도가 빠르다는 것을 빼면 다 단점이다. 허나 인터프리터 요소를 살짝 섞은 조립식 컴파일러가 나온다면 얘기는 달라진다. 예를 들어 모든 객체/함수를 별도로 컴파일 해 두는 것이다. 실행할 때 즉석에서 조립하여 연결하는 방법을 쓴다.

이런 경우 세상 모든 함수, 모듈, 객체에 대한 이름 구분이 필요해진다. 이놈이 만든 함수와 저놈이 만든 함수가 이름이 같으면 어느 것을 붙여야 하겠는가? 경상도 홍길동인가 전라도 홍길동인가? 보통 간단하게 같은 폴더 안에 있는 지역 함수와 공통으로 사용하는 폴더의 전역 함수만 조립하면 된다. 이렇게 할 경우 그 함수만 수정해서 컴파일 한 후 넣으면 유지보수는 간단히 끝난다.

예를 들어 다음과 같은 코드가 있다고 하자.

A = B + C
D = A * E

여기서 A, B, C, D, E 변수의 주소는 가변적일 수 있다. 프로그램을 실행시킬 때 메모리 위치를 어디로 잡느냐에 따라 실제 주소는 변할 수도 있다. 그렇다면 메모리에 읽어 올 때 변수의 주소를 결정해서 번역해 주는 과정이 필요하다. 그래서 이런 번잡한 과정을 피하고자 메모리를 블록/세그먼트/페이지/클러스터/섹터 등 (이름이 참 많다) 구간으로 나누는 방법을 쓴다.

$1 = $2 + $3
$4 = $1 + $5

이렇게 번역한 후에 블록/세그먼트/페이지/클러스터/섹터 뭐라 하든지 그것의 시작 주소만 결정해 주면 다음과 같이 자동으로 계산 처리 된다.

시작 주소 = S
$(S+1) = $(S+2) + $(S+3)
$(S+4) = $(S+1) + $(S+5)

이런 식의 실행 전에 바로 조립을 하려면 O/S의 도움 없인 불가능하다. O/S가 모든 주소를 번역하거나 시작 주소를 결정해 주어야 한다. 마찬가지로 조립할 함수들의 위치를 결정하면서 함수들의 주소도 번역해 주어야 한다. 이 과정이 거의 인터프리터가 하는 작업과 비슷한 수준이라 적절히 섞자는 것이다. 모든 주소를 번역하기는 힘들고 시작 주소만 결정해 주는 것이 좋은데 그건 O/S보다 CPU의 기능이 가능해야 한다.

※ 아마도 이와 비슷한 개념이 윈도우즈의 DLL 같은 것, 자바의 클래스 파일 같은 것이겠다. 이 뒤를 잇는 C#에서도 역시 클래스 명칭 구분을 위한 방법들이 나온다. (IT 분야엔 고수가 적고 하수가 많다. 이 명칭 구분에 대한 이해도 떨어지는 사람들이 많더라. 학원 강사라면서 말이다. 어떻게 초보자보다 못 하냐?)



단어 인식 ↔ 수식 인식 ↔ 문장 인식


예를 들어 조건문, 반복문, 선언문, 대입문은 문장이라고 한다. 그 속에 들어가는 것이 수식이다. 수식 안에 단어들이 들어 있다. 고로 단어 인식기가 가장 하위직이고 중간이 수식 인식기이며 최고 상급자가 문장 인식기가 된다.


  • 선언문이란 단어(변수/상수/함수)의 품사(문법 특징)를 정해주는 것과 같은 것이다.
  • 대입문이란 수식의 계산 결과를 단어(변수/함수)에 넣어주는 것이다.
  • 조건문이란 수식의 계산 결과를 보고 무엇을 실행할지 (어디로 갈지) 결정하는 것이다.
  • 반복문이란 수식의 계산 결과를 보고 반복할 것인지 결정하는 것이다.


수식은 우리가 아는 수학에서 수식과 같은 것이다. 그 수식 안에는 단어들이 들어 있다. 단어는 변수, 상수, 함수이다. 이것들은 공백, 기호(소수점/괄호), 연산자로 구분할 수 있다. 단어는 알파벳, 숫자, 기호, 한글, 한자 등 문자 차이를 보고 구분이 가능하다.

  • 상수 : 값이 변하지 않는다. 예) π = 3.141592, 긴 숫자보단 문자 π를 쓰면 편하지?
  • 변수 : 값이 변한다. 값이 미정이다. 열어 봐야 안다. 계산해 봐야 안다.
  • 함수 : 파라미터(매개변수)에 따라 정해진 계산 결과 값이다.

사람이 정해주는 단어에 해당하는 변수, 상수, 함수는 알파벳과 숫자의 조합이다. 함수와 변수의 차이는 함수 뒤에는 괄호가 온다는 것이다. 수학 상수 π나 e와 같은 것은 변수처럼 이름을 붙일 수 있다. 이러면 변수인지 상수인지는 단어만 보곤 알 수 없게 된다. 고로 단어장이 필요해진다. 숫자로 된 상수는 다음과 같은 패턴이다.

-123.456e-789
부호/정수.소수e부호/지수
정수/소수/지수 = 0~9의 반복

이 패턴을 보고 이 게 한 단어라는 것을 판독하는 게 단어 인식기다. 단어 인식기에는 괄호 구조 인식 기능이 없다. 수식/문장 인식기의 경우는 괄호 구조를 인식해야 한다. 즉 열었으면 닫아야 하는 구조로 되어 있다. 물론 원한다면 단어 인식기에도 괄호 구조를 넣을 수 있다. 단어의 시작(접두사)과 끝(접미사)이 어떤 궁합을 가지고 있다면 말이다. 헌데 그런 단어는 세상에 없으니 만들 필요 없다. 필요한 것이 있다면 변수, 상수, 함수를 구분해 주는 접두사 정도는 있으면 편하다.

문장 인식기는 수식이 들어갈 자리가 나오면 수식 인식기를 호출하여 수식 부분 번역을 담당하게 하거나 계산 결과를 가져오라고 한다. 수식 인식기는 단어가 나오는 부분에선 단어 인식기를 호출해서 그 단어가 어떤 품사인지 내용물은 뭔지 가져오라고 한다. 단어 인식기는 문자 하나씩 읽으면서 이질적인 문자가 나오는지 확인하여 단어를 구분해 내고, 단어장에서 검색해 본다.

단어 인식기에 많이 사용하는 방법은 상태 변화도, 상태 변화표이다. 그림으로 그리면 상태 변화도이고 이걸 표로 만들면 상태 변화표이다. 예를 들어 위의 수식 패턴에서 부호나 기호는 한 문자라서 간단한데 정수, 소수, 지수는 0~9의 반복이다. 이렇게 같은 종류의 문자가 계속 나오면 그 구간은 같은 상태로 보는 것이다.

현재 상태 + 입력 문자 → 필요 행동 + 다음 상태
if 현재 상태 and 입력 문자 then 뭔가 하고 다음 상태로 변경 end

예를 들어 정수부를 읽는 상태라면 입력 문자가 계속 0~9가 나오면 계속 정수 상태를 유지하다가 소수점이 나타나면 정수 상태는 끝나는 것이다. 나머지 소수부, 지수부도 정수부와 같기 때문에 상태만 다르지 처리 방법은 같은 식이다. (난 지금 숫자 상수를 읽고 있어, 그 중에서 정수부를 읽고 있어. 다른 기호가 나올 때까지 말이야.)

이렇게 읽은 10진수를 2진수로 바꾸려면, 일단 정수부와 소수부를 붙여 정수로 보고 2진수로 바꾼다. 여기에 부호를 적용하고, 소수점 위치만큼 10을 곱하거나 나누기 한다. 지수부도 읽은 후에 부호를 붙여 2진 정수로 바꾼 후 그 만큼 10 곱하기/나누기를 한다. 그럼 2진수 실수로 바뀌어 저장이 된다.

※ 실수의 경우 2진수는 10진수로 정확히 바뀌는데 10진수는 2진수로 정확히 바뀌지 않는다. (이상한데? 모든 수는 2로 정확히 나눌 수 있어 정확하게 바뀌는데? 메모리 한계 때문에 정밀도가 떨어진다는 의미이다.) 10진수 문자열(표현형식)과 2진수 실수(저장형식) 사이 변환 과정에서 2 곱하기 나누기를 반복하는 것보다는 한 번에 10의 거듭제곱이나 2의 거듭제곱을 곱하고 나누는 게 더 빠르다.



문법 표현


단어의 구조를 표현하는 문법이 정규 문법, 정규식이라고 한다. 수식이나 명령문을 표현하는 문법이 문맥 자유 문법이다.


  • 생성 문법 : 추상 표현(비단말) → 구체 표현 대체(단말 포함)
  • 정규 문법 = 정규 표현식(정규식) : 비말단 → 말단/{말단+비말단}/{비말단+말단}/생략
  • 문맥 자유 문법 : 비말단 → 말단&비말단 조합
  • 문맥 의존 문법 = 문맥 민감 문법 : 앞+{비말단}+뒤 → 앞+{말단&비말단 조합}+뒤
  • 재귀 열거 문법 : 재귀 열거 언어(재귀 열거 집합)를 표한다고 하는데 알 거 없다.

※ 말단/단말 : 구체적 단어/문자/기호, 비말단/비단말 : 추상적 계층(식/항/구/절)


좌측의 추상적 표현을 우측의 좀 더 구체적 표현으로 대체하면서 문장을 만들어가는 작문 문법이 생성 문법이다. 재귀 열거 문법이 뭔지 모르겠으나 형태를 단순하게 제약한 것이 문맥 의존 문법이다. 그러니까 이건 앞과 뒤를 보고 중간을 대체하여 작문을 하는 것이다. 앞 뒤 문맥을 본다는 말이다. 앞과 뒤가 안 맞으면 대체 불가능하다.

문맥 의존 문법 중에 형태를 단순하게 제약한 것이 문맥 자유 문법이다. 앞뒤 상황을 보지 않고 그냥 기계적으로 대체하면 된다. 컴퓨터 언어(수식, 명령문)는 모두 이 문법에 속한다. 이 문법으로 괄호 구조를 표현할 수 있다. 문맥 자유 문법 중에서 형태를 단순하게 제약한 것이 정규 문법이다. 비말단은 반드시 말단을 포함하며 비말단은 하나인 단순한 형태로 대체 된다. 이 문법은 괄호 구조를 표현하지 못 한다. 단어 구조 표현은 이 문법에 속한다. 이 문법을 수식처럼 표현한 것이 정규식이다.

이렇게 문법으로 표현해도 번역기를 만들 때는 직접적인 도움이 안 된다. 그 문법이란 것은 작문(생성)을 할 때 도움이 되는 문법이지 역으로 독해(해석)를 할 때는 도움이 안 된다. 독해할 때는 거꾸로 된 문법이 필요하다. 예를 들면 다음과 같은 식이다. 생성 문법을 거꾸로 읽어 적용해야 한다.

해석 문법 : 구체 표현 → 추상 표현 대체

독해를 거쳐 어떤 순서(어순)로 나열된 1차원적 배치의 문장(영어)이 순서가 없는 입체적 연결 상태(문장 성분 사이의 관계도로 나무 가지 모양)로 바뀐다. 이 연결 상태를 어떤 문법에 따라 어떤 순서로 나열된 문장(한국어)으로 바꾸는 것이 번역이다. 단순 단어 대체가 아닌 어순을 바꿀 때는 먼저 독해를 완벽하게 끝내야 한다. 일단 독해가 끝나는 시점에 이 수식/문장이 문법에 맞는지 틀린지 결판이 난다.

I am a boy → I=(a+boy) → 나=(한+소년) → 나+이다+(한+소년) → 나는 한 소년이다.

생성 문법을 어떻게 표현하든 결국 해석 문법을 보고 상태 변화도, 상태 변화표를 만들어야 구현할 수 있다. 여기서 상태는 추상적 계층이 된다. 입력은 읽은 문자/단어가 된다. 헌데 수식의 경우처럼 뒤의 연산자까지 읽어 봐야 결정이 되는 경우는 입력 값에 다음 연산자도 포함이 된다. 즉 다음 문자/단어를 읽어 봐야 어떤 결론이 나는 경우는 상태 변화도에서 다음 문자/단어도 입력으로 반영 되어야 한다. 고로 상태 변화도가 상당히 복잡해진다. 생성 문법을 보고 다음에 나올 수 있는 가능한 모든 문자/단어를 찾아야 하는 문제가 있다.

  • A + B * C → A + (B * C) : B 뒤에 곱하기가 있어 이렇게 번역 된다.
  • A * (B + C) → A * (B + C) : B 앞에 괄호가 나오기 때문에 이렇게 번역 된다.
  • A * B + C → (A * B) + C : B 뒤에 더하기가 있어 이렇게 번역 된다.




고급언어의 수식 번역과 계산


다음과 같은 접간사 형태의 수식을 접두사나 접미사 형태로 바꾸는 것을 말한다.

원문 : A = B + C * (D + E)
번역 : A ← + B * C + D E or A ← D E + C * B +
번역 : A ← 합(B, 곱(C, 합(D, E))) or A ← (((D, E)합, C)곱, B)합

영어식 어순으로 번역했을 경우 읽는 순서 그대로 계산하기 힘들다. 이건 복합문을 단문으로 나누어 계산 순서에 맞게 배치해야 계산이 가능하다. 예를 들면 아래와 같다.

순서1 : Acc ← 합(D, E)
순서2 : Acc ← 곱(C, Acc)
순서3 : Acc ← 합(B, Acc)
순서4 : A ← Acc

그런데 역순으로 읽었더니, 다시 말해서 한국식 어순으로 번역했을 경우 읽는 순서 그대로 계산하기 쉽다. 예를 들면 아래와 같다.

0단계 : (((D, E)합, C)곱, B)합 = D, E, 합, C, 곱, B, 합
1단계 : Acc ← D, E, 합
2단계 : Acc ← Acc, C, 곱
3단계 : Acc ← Acc, B, 합
4단계 : A ← Acc

그러니까 어떻게 하든 원문을 이 순서로 번역만 하면 되는 것이다. 방법은 2가지가 있는데 책에서 설명하는 아주 복잡한 방법으로 수식을 1회만 쭉 읽으면서 번역하는 방법이 있고, 다른 하나는 사람이 계산하는 방법처럼 여러 번 읽으면서 다시 쓰기 하는 방법이다. 일단 사람이 하는 방법부터 보자.



단순 무식해서 이해하기 쉬운 다시 쓰기 방법


0단계 : A = B + C * (D + E) 
1단계 : A = B + C * T1 ☞ T1 = D + E 
2단계 : A = B + T2 ☞ T2 = T1 * C 
3단계 : A = T3 ☞ T3 = T2 + B

번역 결과 :
T1 = D + E
T2 = T1 * C
T3 = T2 + B
A = T3

원문에서 계산 순서가 높은 것을 찾아서 그것부터 번역하고 변수 하나로 대체해 가는 방식이다. 이 때 수식을 다른 곳에 다시 써야 한다. 이 방식으로 하면 메모리는 원문의 3배 정도만 필요하다. 번역문이 들어갈 공간 C, 다시 쓰기 할 공간 A, B이다. 다시 쓰기 할 때는 A와 B 사이를 왔다 갔다 하면 된다. 다시 쓰기 하는 시간 낭비는 있지만 단순 명확해서 오류가 나기 힘들다. 또한 한 번만 번역하면 계속 재활용할 수 있다.



고급스럽고 복잡해서 이해하기 어려운 함수 재귀 호출


0단계 : A = B + C * (D + E)
1단계 : A = B +, 여기까지 읽고 A = 는 마지막 처리 위해 기억
2단계 : A = B + C *, 여기까지 읽고 B + 도 나중 처리 위해 기억
3단계 : A = B + C * (, 여기까지 읽고 C * 도 나중에 처리하기 위해 기억
4단계 : A = B + C * (D + E), 여기까지 읽고 T1 = D E + 로 번역하고 상위로
5단계 : A = B + C * T1, 보류했던 것을 T2 = C T1 *로 번역하고 상위로
6단계 : A = B + T2, 보류했던 것을 T3 = B T2 +로 번역하고 상위로

여기 방법은 함수 재귀호출을 이용해 보류했던 내용을 스택에 보관하는 방법이다. 이 방법은 접미사 형태의 번역문을 스택에 보관한다. 이 때 변수 대신 변수의 값을 직접 넣어 두면, 스택에서 빼 오는 순서 그대로 계산하면 된다. 앞의 방법과 번역문의 메모리(스택) 사용 양은 같다. 계산 속도도 같다. 앞의 방법은 번역된 것을 계속 가지고 있고, 이 방법은 계산하는 과정에서 스택의 내용이 변하기 때문에 다신 번역(어순 변경 작업)해야 한다.



1항 연산자, 2항 연산자, 우선순위와 미리 읽기


우리가 아는 가감승제 4칙 연산은 2항 연산자다. 3항 연산자는 없다. 연산자가 좌우 양쪽의 값으로 계산을 한다. 헌데 음수 기호는 1항 연산자다 우측의 부호만 바꾼다. 문제는 부호 바꿈 기호가 빼기 연산자와 같은 모양이란 것이다. (차라리 음수 부호는 다른 걸 쓰는 게 더 간단하다.) 이 경우 연산자 2개가 겹쳐 나오게 되는 것이 힌트다. 괄호 기호도 포함해서 연산자와 괄호가 겹쳐 나오면 궁디(뒤)부터 처리하란 신호다.

원문 : A = B * -C + D * (E + F)
번역 : C~, B *, E F +, D *, +, A =.
해석 : C를 음수로, B와 곱하고, E와 F 더하고, D 곱하고, 앞 2개 결과 더하고, A에 대입하라.

빼기 연산자와 부호 바꾸기 연산자를 구분하기 위해서 ~로 고쳤다. 여기서 읽다 보면 *와 –가 이어 나오고, *와 (가 이어 나온다. 그런 경우 먼저 뒤의 것을 먼저 처리해야 한다. 수학에선 *와 /와 괄호로 묶인 것을 항이라고 한다. 항은 먼저 계산해야 한다. 전통적 수식이 계산 순서대로 배치되어 있지 않기 때문이다. 또한 우선순위가 낮은 +와 – 연산자의 경우 한 단계 더 읽어서 뒤에 우선순위가 높은 *와 /가 나오는지 확인해야 한다. 이를 미리 읽기라 한다.

※ C언어에선 대입 연산자 =를 2항 연산자로 취급한다. 복잡한 수식 안에서 여러 변수에 같은 값을 대입할 수 있다는 장점은 있지만 쓸데없이 복잡하기만 하다. C언어는 좀 허세가 심하다. 목표에 충실한 가장 간단한 방법을 가장 많이 사용한다. 결국 이런 문법을 복잡한 수식 안에서 사용 안 하는 이유는 소스 코드 독해가 어렵기 때문이지. 그래서 오직 초기화 할 때만 사용한다. A = B = C = D = 3.141592.



선언문 = 단어장


C언어를 보면 제일 앞에 변수와 함수 선언문이 나온다. 함수의 경우 내용 정의가 없지만 문법 확인을 할 수 있는 정도의 정보는 나열되어 있다. 

결과 값 리턴 타입, 함수이름, 매개변수(파라미터) 개수와 종류

이렇게 하는 이유는 아래 앞으로 나올 코드들의 문법 확인을 쉽게 하기 위해서다.  미리 단어장을 만들어 두는 것이다. 이렇게 하지 않으면 새로운 변수, 함수를 만날 때마다 단어장에 넣어야 하며, 지금 보고 있는 문장 문법 확인하기 위해서 뒤의 함수 정의 등을 찾아 볼 수는 없기 때문이다. 사람이나 기계나 단어 정의는 먼저 해 두는 것이 편하다.

  • 다음 나열된 단어는 상수이다. 그 불변 값은 이렇다.
  • 다음 나열된 단어는 변수이다. 그 초기 값은 이렇다.
  • 다음 나열된 단어는 함수이다. 매개변수는 이렇다.

단어의 종류, 즉 품사 구분을 해 주는 접두사나 접미사를 단어에 붙여 표현하는 것이 좋다. 왜? 컴퓨터나 사람이나 그 단어를 단어장에서 찾아보지 않고도 문법이나 문맥 검사를 해 볼 수 있기 때문이다. 옛날 Basic 언어에는 이런 접미사가 있다. 프로그래머가 일부러 만들어 붙일 수도 있다. 이런 기능은 코드 쓰기엔 불편하지만 나중에 읽을 때 편하다. 그래서 편집기에서 자동으로 붙여 주는 것이 좋다.

  • 상_원주율 = 3.141592 ☞ 고정 불변
  • 변_반지름 = 100 ☞ 초기 값으로 100을 지정
  • 함_원둘레(반지름) ☞ 반지름만 알면 된다.
  • 함_원면적(반지름) ☞ 반지름만 알면 된다.

※ Apple Mac 컴퓨터에서 사용하는 Objective C라는 언어는 함수 파라미터에도 설명문을 붙일 수 있더라. 그래서 함수처럼 보이지 않던데 코드에 대한 설명을 붙이라고 강요하는 것 같더라.




간단한 형식 문법 체크, 예측 문법


상세한 번역 전에 간단한 형식적 문법 확인부터 먼저 하는 것도 좋다. 전반적인 균형과 틀을 보는 것이다. 이런 형식적 문법 체크 기능은 편집기에 넣으면 좋다. 즉 한 줄 입력하면 바로 문법 확인해서 고치도록 알려 주는 것이 좋다.

  • 단어 철자가 틀렸는지 : 특히 I(아이)와 l(엘)과 1(일), 0(영)과 O(오우) 등
  • 괄호의 짝이 맞는지 : {[(~)]} “~”, ‘~’열린 것은 닫혀야 한다.
  • 구분자가 맞는지 : .,:;!? 앞과 뒤를 구분하며 끝과 시작을 알린다.
  • 파라미터 개수 : 함수는 파라미터(매개변수) 개수가 정해져 있다.
  • 연산자 중첩 : 기호 2개를 붙여 하나의 연산자로 취급할 수 있다.
  • 반복/조건문의 틀 : 괄호의 짝을 맞추는 것과 비슷한 것이다.


이런 문법 확인이 가능한 이유는 예측 문법 때문이다. 앞부분의 형태를 보면 뒤에 어떤 틀이 나올 것인지 예측이 가능하기 때문이다. 고로 그 틀만 맞는지 확인하면 된다.

하나 의아한 것이 있는데 왜 편집기에서 반복문 조건문의 틀을 잡아 주지 않는지 모르겠다. 반복문과 조건문은 괄호와 비슷해서 자기 짝이 있다. 번역할 때는 자기 짝을 확인하기 위해서 눈에 보이지 않지만 키워드에 ID를 붙여야 한다. 프로그래머는 일부러 설명문 형태로 눈에 보이게 ID를 붙이기도 한다.

HTML언어에선 괄호에 ID를 붙이는 방식이다. 시작 괄호엔 /가 없고 끝 괄호엔 /를 넣는다. 괄호의 ID는 <~> 사이에 넣는다. 고로 괄호 <~>는 함부로 사용할 수 없는 기호다. 

<이름> 여기엔 보통 단어나 문장이 들어간다. </이름>

이렇게 하는 이유는 중첩 괄호가 무지 많이 나오기 때문에 자기 짝을 확인해야 할 필요가 있기 때문이다. 그걸 프로그래머가 하라고 이렇게 만든 것인데 컴퓨터가 확인해 주는 것이 더 바람직하다. 이런 기초적인 문법은 실수하지 않도록 컴퓨터가 틀로 제공하고 사람이 못 건드리도록 하는 것이 좋다.

위보다는 <이름: 어쩌구 저쩌구 :이름> 형태가 더 깔끔하지 않나?

반복/조건문에선 조건문 쪽에 애매모호한 문제가 있다. 컴퓨터 언어에선 괄호처럼 짝이 맞거나 구분자처럼 끝과 시작을 확실하게 해 줘야 한다.

if ~ then ~
if ~ then ~ else ~
if ~ then if then ~ else ~ = if ~ then (if then ~) else ~ = if ~ then (if then ~ else ~ )

위와 같은 형태는 종료를 알려 주는 키워드가 없다. 고로 중첩해서 사용할 경우 애매모호한 해석에 빠진다. 즉 이렇게 해석할 수도 있고 저렇게 해석할 수도 있는 경우가 나온다. 그래서 그걸 해결하는 복잡한 번역기를 만들기보다는 다음과 같은 형태로 문법을 바로 잡는 것이 더 간단하다.

if ~ then ~ 끝
if ~ then ~ else ~ 끝
if ~ then (if ~ then ~ 끝) else ~ 끝 ≠ if ~ then (if ~ then ~ else ~ 끝) 끝

※ C언어에선 이 문제를 해결하기 위해 문장 블록을 괄호 {~}로 표현하고, 문장 구분을 ;으로 하고 있다. 즉 문장의 끝과 시작을 알리는 것이 ;이다. 여러 문장들을 묶을 때 {~}로 감싼다. C언어는 수식처럼 괄호의 중첩이다. 그래서 C언어를 배울 때 마치 수식을 보는 듯한 착각을 일으킨다. C언어가 고급 언어가 아니라고 하는 이유 중에 하나이다. 명령문이 마치 수식처럼 보인다. 솔직히 다른 고급 언어 문법에 C언어가 가진 장점만 섞는 게 더 바람직하겠다.



상수, 변수, 함수, 포인터(간접 주소), 배열과 문자열


  • 상수란 항상 일정한 수를 말하기 때문에 프로그램 시작과 끝까지 값이 변하지 않는다. 
  • 변수란 변하는 수를 말하기 때문에 값을 바꿀 수 있다. 고로 변수는 값을 넣을 메모리 공간의 주소로 표현 된다.  
  • 함수란 수를 처리하는 상자란 의미다. 고로 매개 변수를 받아 계산한 후에 결과 값을 주는 코드의 주소로 표현 된다. 매개변수와 결과 값은 스택을 통해 전달한다.
  • 문자열이란 문자들의 1차원 나열이다. 즉 단어나 문장이 된다.
  • 배열이란 같은 구조의 n차원 나열이다.  예를 들어 99단이라고 하면 2차원 배열이다.
  • 포인터란 문자열, 배열, 함수처럼 거대한 내용의 시작 주소이다.


보통 숫자를 다룰 경우는 이 차이를 인식하지 못 하는데 배열과 문자열을 다루게 되면 차이를 느끼게 된다. 

  • 3.141592...는 상수이다.
  • π는 상수를 간단하게 표시한 것이다.
  • 수식에서 보통 a, b, c 등 알파벳으로 표기한 것은 변수이다.
  • sin, cos, tan, exp, log 등은 함수이다.
  • 문자열은 문자의 배열이다.
  • 배열은 수식에서 변수 이름 옆에 붙이는 첨자와 같은 개념이다. a₁, a₂, a₃, a₄


보통의 고급 언어에선 문자열 처리가 쉽지만 C 언어에선 문자열 처리가 어셈블리어처럼 불편하다. 여기선 상수 문자열과 변수 문자열의 차이가 명확해진다. 문자열 변수의 경우 길이가 변하는 문제가 있다. 그건 메모리 공간 할당의 문제를 말한다. 고로 보통 문자열은 힙이라는 곳(단어장이나 연습장 정도?)에 저장하고 변수는 이 주소만 담고 있다. 고로 주소만 살짝 바꾸면 문자열을 직접 지울 필요 없이 지운 것처럼 보인다.

주소1: 홍길동
주소2: 을지문덕
주소3: 김구
변수A = 주소2 = 을지문덕

이렇게 문자열을 가리키는 주소를 담고 있는 변수가 문자열 변수인데 문자열만 가리키지 않고 같은 자료 형의 단순 반복인 배열(아파트 구조), 객체(변수+함수)나 다른 변수까지 가리키게 할 수 있지 않을까? 그런 변수가 포인터 변수이고 간접 주소 방식이라고 한다. 그러니까 A(포인터)를 찾아 가니 B(변수)로 가라고 하고, B(변수)를 찾아가니 C(값)를 알려주더란 것이다.

※ 헌데 C언어의 포인터 표기법은 정말 쓸데없이 복잡한 허세다. 그렇게 복잡하게 만들어도 결국 사람들이 쓰지 않잖아? 소스 코드 독해가 너무 어려우니까. 같은 목적지에 도달하는 더 간단한 방법을 쓰지 왜 복잡한 방법을 쓰겠어? Java 같은 언어는 같은 포인터 선언을 더 쉽게 한다.

함수 호출할 때는 스택(먼저 넣으면 나중에 빼게 되는 구조)에 예를 들어 이렇게 내용을 저장한다. 이건 서로 약속이 되어 있어야 한다.

1단계 : 결과 값을 받을 공간 저장(사용자 작성 프로그램에서 하는 짓) 
2단계 : 파라미터(매개변수)들 저장(사용자 작성 프로그램에서 하는 짓) 
3단계 : CPU/MPU 레지스터 상태 저장 (기계가 자신의 정신 상태를 자동 저장) 
4단계 : 복귀할 주소 (기계가 자동으로 저장) 
5단계 : 함수 실행 코드가 있는 주소로 점프 

항상 돌아올 곳을 알아야 한다. 그래서 점프할 때 기계가 자동 저장을 한다. 호출 당한 함수는 3/4단계 정보는 건드리지 않아야 한다. 자신이 필요한 파라미터의 수와 종류를 알기 때문에 스택에서 읽어낼 수 있다. 계산 결과도 어디에 저장할지 알고 있다. 일을 다 처리한 후에 원상 복귀 명령이 실행되면 3/4단계 정보는 기계가 자동으로 읽어 복구 시킨다. 그럼 호출을 한 쪽에서 2단계 내용을 지우고, 1단계 내용을 받으면 된다.




문맥(같은 표현에 다른 의미) 확인


컴퓨터에서 문맥이라 하면 주로 변수의 종류(Type타입)가 어울리는지 확인하는 것이다. 겉으로 본 형식 문법에는 문제가 없는데 막상 내용을 보니 문자열과 수를 더하라거나(방법은 2가지), 정수와 실수를 더하라거나(방법은 3가지) 하는 문제가 있을 수 있다.

문자열을 숫자로 바꾼 후 더하기 : “123” + 876 = 999
숫자를 문자열로 바꾼 후 붙이기 : “주소” + 123 = “주소123”
정수를 실수로 바꾼 후 더하기 : 123 + 876.999 = 123.000 + 876.999 = 999.999
소수점 이하를 버린 후 더하기 : 123 + 876 = 999
소수점 이하 반올림 후 더하기 : 123 + 877 = 1000

OK 문자열은 이해하겠는데 정수/실수 구분이 있어? 아쉽게도 컴퓨터 진화에선 정수가 먼저 생기고 실수가 나중에 생겼다. 그래서 저장 형식이 서로 다르다. 그러나 정수를 실수로 변환하는 것은 손바닥 뒤집기처럼 쉽다. 정수가 따로 존재하는 이유는 간단한 개수 셀 때 편하기 때문이다. 실수는 공학적 계산을 할 때 필요하다.

정수 : 9876543210
실수 : 9876543210.0123456789

고정 소수점을 취할 경우 정수의 2배 저장 공간을 사용해서 간단하게 실수를 만들 수 있다. 허나 천문학적인 숫자 계산은 할 수가 없기 때문에 부동 소수점 방식을 취한다.
※ 정수, 실수, 바이트, 논리, 문자열 등 기본형 말고 사용자가 조립해서 정의할 수 있는 형이 있다. 이런 것이 발전해서 결국 객체라는 것도 나온다. 여하튼 이런 복잡한 자료 구조를 가리키는 포인터(주소변수)는 당연한 것이 된다.

※ C언어의 포인터 변수 선언은 정말 불필요할 정도로 복잡하다. 참 쓸데없는 짓이다. 자료 구조에 이름을 붙이고 그 이름을 가리키게 하면 되는 간단한 문제인데? 그래서 지금은 포인터 무시하고 Java 이후 객체 지향 언어에선 변수 이름만 가지고 간단하게 쓰고 있지만. 미쳤나? 정력이 남아돌지? 



객체 지향 언어란?


문자열은 문자의 배열이었고, 단순 계산기 시절엔 반복 계산한 결과를 배열에 저장했다. 헌데 서로 다른 종류의 데이터 형을 묶을 필요가 생겼다. 그게 사용자 정의 자료 형이다.

컴퓨터가 단순히 계산기 수준을 넘어서고, 문자열을 다루면서 타자기를 대신하게 된 후에, 전쟁 시뮬레이션이나 컴퓨터 게임을 만들게 되면서 객체란 개념이 나타난다. 여기서 객체란 병사, 전차, 전투기, 미사일 같은 유닛을 말한다. 같은 설계로 만들어지지만 각 객체는 서로 다른 위치, 상태에 있다. 

  • 최대 이동 속도 : 엔진의 힘이라고 보면 된다.
  • 최대 이동 거리 : 연료의 양이라고 보면 된다.
  • 장갑 두께 vs 무게 : 방어력과 관성에 영향
  • 유효 사거리 : 거리에 따라 정확도도 떨어진다.
  • 연사 속도 : 분당 발사 수
  • 무기 종류 : 총알, 포탄, 미사일
  • 현재 위치, 현재 속도(방향 포함), 현재 가속도(방향 포함)

바로 이런 객체 설계도가 사용자 정의 자료 구조였고, 각 객체는 이 자료 구조를 배열로 만들면 되는 거였다. 고로 기존의 고급 언어나 C언어로도 객체 지향 프로그램을 할 수 있다. 객체 지향 언어란 객체 지향 프로그램을 강요한 것을 말한다. 아마 접두사/접미사를 붙이며 프로그래밍을 하던 프로그래머가 언어 문법으로 만들어 강요하게 되었을 것이다.

보통 객체 지향 언어는 특정 자료 구조에 특정 함수들을 연결하도록 강요한다. 함수들은 그 함수가 다루는 자료 구조가 정해져 있다. 헌데 아주 많은 함수들이 이곳저곳에 흩어져 있을 때 그 함수와 자료 구조를 연결하여 해석하기 힘들다. 그래서 서로 짝이 맞는 함수와 자료 구조를 함께 적어 놓도록 강요한 것이 객체 지향 언어이다. 별거 아니지?

이렇게 식구들을 모아 가족을 만들었으면 성을 붙여 줘야 할 거 아닌가? 이 변수들과 저 함수들은 모두 그 객체에 속하니 객체 명칭을 성姓으로 쓰는 것이다. 변수와 함수를 모아서 정의 해야 하고 사용할 때도 성씨를 붙여 줘서 구분해야 하는 것이다. 별거 아니지?

  • 전차.속도 = 40km/h
  • 전차.위치 = (X, Y, Z)
  • 전차.가속도 = 0
  • 전차.장갑 = 30mm
  • 전차.사거리 = 3km
  • 전차.연사속도 = 분당 12발
  • 전차.발사체 = 포탄

※ 개체 지향 언어에서 보이는 가장 얼빵한 짓을 예로 든다면 수학 함수, 문자열 함수, 날짜 시간 함수 같은 무소속이 당연한 전역 함수를 객체에 포함시킨 것이다. 이건 객체 지향 목적에도 맞지 않고 불편하기만 하다. 또한 단 하나의 값만 들어가는 기본 자료 형도 객체로 만든 것이다. 객체란 여러 자료 형이 섞여 있는 구조일 때 의미가 있는 것인데 정말 얼빵한 짓이다.

이렇게 하는 이유는 소스 코드 해석 중에 그 자료 구조와 상관있는 함수를 쉽게 파악할 수 있기 때문이다. 그 자료 구조 바로 밑에 함수들을 적어 놓기 때문이다. 객체 지향 언어는 객체 지향 프로그램을 돕는 게 아니라 강요하는 것이다. 

객체 지향 프로그램을 돕는 것은 오히려 막강한 소스 코드 편집기다. 편집 중에 객체와 함수의 이름들을 다 기억하고 있다가 알려 주는 편집기야 말로 객체 지향 프로그램을 돕는 놈이다. 이게 없다면 객체, 함수, 변수 이름을 따로 정리해 놓고 있다가 직접 검색 확인해서 입력해야 한다.

헌데 막상 소스 코드를 해석해 보면 함수의 호출 관계를 보여주는 조직도 비슷한 것이 필요하다. 이런 것을 해 주는 프로그램이나 편집기는 아직 없더라. A함수를 해석하는데 의미를 알 수 없는 B함수를 호출하더라. B를 찾아가 보니 또 C를 호출하는데 C를 찾아가면 D를 호출하더라. 뭐 이런 식으로 가니 소스 코드 해석이 어렵더라. 객체도 마찬가지. 이 객체가 다른 객체를 포함하고 있어 찾아가면 또 다른 객체를 포함하고 있고 뭐 그런 식이다.





2017년 1월 23일 월요일

컴퓨터 부동 소수점, 고정 소수점 이해, Visual Basic Macro에서 사용하는 데이터 형식

2026-08-12 수정

수학에서 말하는 수의 종류와 컴퓨터에서 표현법이다.

  • 자연수自然數 : 0 이상의 양의 정수, 예) 0, 1, 2, 3...
  • 정수整數 : 소수가 없는 정수, 예) –3, -2, -1, 0, 1, 2, 3
  • 소수小數 : 0.XXX로 1보다 작은 수, 예) 0.123, 0.01%
  • 실수實數 : 정수整數 + 소수小數, 예) 123.456, 3.141592
  • 고정固定 소수점小數點 표현 : 예) 정수부 3자리 + 소수부 3자리 = 123.456
  • 부동浮動 소수점小數點 표현 : 예) 가수부 3자리 x 지수부 3자리 = 0.123×10¹²³
  • 가수假數 : 소수점 이하 부분 = 소수 ↔ 진수眞數·정수整數
  • 지수指數 : 우측 어깨 위에 붙어 거듭 제곱을 나타내는 수

숫자를 표현할 수 있는 공간(칸)이 6개라고 하자. 여기서 고정 소수점이란 소수점의 위치가 고정 되어 있음을 뜻한다. 소수점 위 3자리, 소수점 아래 3자리처럼 말이다. 부동 소수점이란 소수점 위치가 가변적이란 얘기다. 부동浮動float플로우트는 떠다님을 의미한다. 다른 말로 지수 형태 표현이라고 할 수 있다. 소수점의 위치는 지수指數가 결정하고, 수의 정밀도는 가수가 결정한다. 가수假數란 가짜 수란 의미인데 소수점 이하를 의미한다. 그러니까 소수인 거지.

컴퓨터 메모리를 너무 어렵게 생각하지 말자. 우리가 초등학교 때 사용하던 원고지처럼 바둑판 격자가 그려진 공책을 상상하면 된다. 각 칸에는 글자 하나 적을 수 있다. 숫자를 적을 공간에 한계가 있는 것은 당연하다. 컴퓨터 메모리도 그러하다. 한 바이트라고 하는 것을 알파벳 문자가 들어가는 자리라고 생각하라. 


예를 들면 분해능 1000의 저울이 있다고 하자. 1g단위로 1kg까지 측정하는 저울이 있고, 1kg단위로 1톤까지 측정하는 저울이 있다. 실제 저울은 보통 1/100 정밀도이다. 여기서 저울 눈금에 표시되는 숫자는 가수에 해당한다. 눈금 간격이 정밀도(분해능)를 나타낸다. 그 뒤의 단위(g/kg)는 지수에 해당한다. 이건 규모(크기)를 나타낸다. 이 정도 설명해도 이해 못 하면 국정원 댓글 용역들이거나 일베충이다.

그런데 기억 공간이란 것은 한계가 있다. 공간(칸수) 제약이 있는 숫자 표시를 할 때는 2가지 개념이 있다. 측정기나 컴퓨터 속의 수를 너무 어렵게 생각하지 말자. 중앙이 0이고 좌우가 ±30㎝인 자를 상상하자. 이 자의 최소 눈금은 1㎜이다. 그럼 이렇게 정리 할 수 있다.

  • 표시 범위 : ±300㎜ → 자의 크기
  • 최소 눈금 : ±1㎜ → 정밀도/분해능

범위는 얼마나 큰 수, 작은 수를 표현할 수 있느냐이고, 눈금은 얼마나 섬세하게 나누어 표현할 수 있느냐이다. 이런 숫자 표현을 컴퓨터에선 비트 나열로 어떻게 할까? 그게 궁금하다. 2진수와 10진수를 바꾸는 개념이 필요하다. 몇 개의 숫자는 기억하자.

  • 1바이트(08비트) : 256개 정수 표현
  • 2바이트(16비트) : 6만5536개 정수 표현
  • 4바이트(32비트) : 42억9496만7296개 정수 표현
  • 8바이트(64비트) : 184경4674조4073억7095만51616개 정수 표현


Visual Basic Macro에서 사용하는 데이터 형식


컴퓨터에서 하나의 데이터 표현에 사용하는 기억 공간은 현재 8바이트(64비트)까지이다. 1바이트(8비트)에서 시작해서 2배씩 증가하는 것이 전통이다. 주어진 바이트 공간이 같아도 내용을 어떻게 해석하느냐의 차이가 있어 Data Type(자료 종류)이라 부른다.

  • 1바이트 : byte(자연수)
  • 2바이트 : integer(정수), boolean(논리)
  • 4바이트 : long(정수), single(실수)
  • 8바이트 : longlong(정수), double(실수), currency(화폐), date(시간)


대부분 컴퓨터 언어에선 전통적인 숫자 표현이다. 정수의 경우는 이해하기 쉽다. 고로 실수를 어떻게 표현하는지 분석해 볼 것이다. single, double, date는 부동 소수이고, currency가 고정 소수이다. 기타 흥미로운 자료형도 있다.

  • 14바이트 : decimal(10진수)
  • 16바이트 : variant(가변적)


decimal은 10진수를 표현한 것이다. 이건 단독 사용이 안 되고 variant와 함께 사용해서 다른 수를 10진수 형식으로 바꾼다. variant는 여러 형태의 데이터를 다 표현할 수 있도록 넓힌 공간이라 가장 많은 바이트를 차지한다. 추가된 2바이트는 자료 형식에 대한 정보이다. 고로 10진수 표현이 어떠한지 분석해 볼 것이다.

기타 object(객체), longptr(포인터) 등은 메모리 주소(위치)와 데이터 구조를 나타내는 자연수로 사람이 직접 건드릴 일이 없다. 데이터 구조란 여러 종류의 자료형을 묶어서 한 덩어리로 취급할 때 필요한 것이다. 고로 위치/크기/종류를 모두 구분해야 한다. 주소의 바이트 크기도 시스템(CPU + O/S)에 따라 자동으로 바뀌니까 신경 쓸 일 없다. 이와 유사한 자료 형식이 있다.

  • string(고정) : 문자열 길이(약 6만까지)
  • string(가변) : 10바이트 + 문자열 길이(약 20억까지)
  • variant(문자열) : 22바이트 + 문자열 길이(약 20억까지)


길이가 가변적인 자료형의 대표적이고 전통적인 것이 문자열이다. 길이가 고정된 문자열은 보통 단어 목록(사전)을 표현할 때 사용한다. 최대 한계 길이(약 6만까지 가능)를 정해서 사용한다. 단어 길이가 6만(65536자)이면 한글 250자 원고 (10행x25자) 240 페이지 분량, 500자 원고 (25행x20자) 120 페이지 노트 정도 된다. 여하튼 최대 단어 길이를 정하고 미리 공간을 확보하는 것이다. 이게 말이 단어지 이 정도면 문서 하나 정도가 들어간다.

길이가 가변적인 것은 보통 문장(문단)을 표현할 때 사용한다. 메모리는 절약 되지만 구현이 복잡하다. 문자열은 바이트의 배열이 된다. 고로 문자열 변수는 이 배열의 주소(위치)를 가리키게 되면서 문자열 길이도 표현해야 한다. 고로 4바이트(약 20억)는 길이, 나머지 4바이트는 주소(위치)를 표현하는 것 같은데 남은 2바이트는 뭔지 모르겠으나 컴퓨터가 알아서 할 일이다.

데이터를 비트로 표현하는 방법을 분석하기 위해 사용할 프로그램이다.


2진 부동 소수점 형식 분석


10진수로 된 실수를 2진수로 바꾸는 것은 정확하지 않고, 계산도 복잡하다. 고로 가수, 지수, 부호 비트를 구분해서 분석하려면 대가리를 좀 굴려야 한다. 2진수는 m×2ⁿ 형태이고 m(가수), n(지수)는 부호가 있다. n과 m의 변화를 보기 위해서 다음과 같은 수를 저장해 본 후에 분석한다.


m
n
10진양수
10진음수
1
0
1
-1
1
1
2
-2
1
2
4
-4
1
3
8
-8
1
4
16
-16
1
5
32
-32
1
6
64
-64
1
7
128
-128
1
8
256
-256
1
9
512
-512
1
-1
0.5
-0.5
1
-2
0.25
-0.25
1
-3
0.125
-0.125
1
-4
0.0625
-0.0625
1
-5
0.03125
-0.03125
1
-6
0.015625
-0.015625
1
-7
0.0078125
-0.0078125
1
-8
0.00390625
-0.00390625
1
-9
0.001953125
-0.001953125
0.1
0
0.5
-0.5
0.11
0
0.75
-0.75
0.111
0
0.875
-0.875
0.1111
0
0.9375
-0.9375
0.11111
0
0.96875
-0.96875
0.111111
0
0.984375
-0.984375
0.1111111
0
0.9921875
-0.9921875
0.11111111
0
0.99609375
-0.99609375
11
0
3 -3
111
0
7 -7
1111
 0
15 -15
11111
0
31 -31
111111
0
63 -63
1111111
0
127 -127
11111111
0
255 -255


간단한 비교 분석을 통해 다음과 같은 결론에 도달한다. 첫 비트는 부호, 그 다음은 지수, 그 다음은 1이 생략된 가수이다. 바이트의 배치 순서는 CPU에 따라 다른데 PC에서 사용하는 인텔 CPU는 하위 바이트를 먼저 기록한다. 그래서 거꾸로 배치해야 사람이 읽기 편하다. 지수는 비트 1자리만 늘어도 2배로 커지는 효과가 있다. 가수는 비트가 2배로 늘어야 2배 정밀도가 된다.

  • 32비트 실수 최소 눈금 : ±1.401298E-45 (2진수이기 때문에 이렇다)
  • 64비트 실수 최소 눈금 : ±4.94065645841247E-324 (2진수이기 때문에 이렇다)

최소 값일 때는 비트 모양이 지수 = 0, 가수 = 000...0001 꼴이다.








날짜와 시간 표현은 64비트 부동 소수점 형식을 빌려 사용하고 있다. 초→분→시→일→월→년으로 1초 시간에 해당하는 소수를 계속 누적하는 형태이다. 1일은 정수 1에 해당한다. 고로 1일을 60초 * 60분 * 24시 = 86400초로 나누면 단위 시간 1초에 해당하는 소수를 구할 수 있다. 365일은 평년, 366일은 윤년이다.

  • 최소 눈금 : 1초 =  0.0000115740740740740... (740무한 반복)
  • 최대 범위 : 1900년 1월 0일 자정(0시0분0초) ~ 약 9999년(1만년)까지





10진 고정 소수점 형식 분석


돈 계산할 때 사용하는 Currency 고정 소수점 형식은 정수와 다를 것 없다. 본질적으로 정수이다. 정수처럼 첫 비트가 부호이다. 양수=0, 음수=1이며 음수는 정수처럼 보수를 취한다. 10진수로 소수점 아래 4자리까지 표현하고 싶다면 10000에 해당하는 수를 1로 보는 방식이다. 다시 말하면 1만 배 곱하여 저장, 계산한 후에 10진수로 결과 표시할 때만 소수 4자리 앞에 살짝 소수점을 찍어 준다. 고로 비트 패턴으로는 정수와 소수의 구분이 없고 그냥 1만배가 된 정수이다.

  • 최소눈금 : ±0.0001 (10진수라서 최소 눈금을 1로 표현 가능)
  • 최대범위 : 약 ±2의 63승 ÷ 10000






10진 부동 소수점 형식 분석


Decicmal의 형식을 읽을 수는 없었으나 10진법이라는 것도 Currency처럼 최소 눈금을 정하고 정수처럼 취급하는 방법으로 보인다. 왜냐하면 최소 눈금은 10진수로 표현했을 때만 1로 끝나기 때문이다. 또한 최대 범위를 보면 약 12바이트가 가수로 사용된다. 고로 남은 2바이트가 부호와 지수가 될 것이다. 헌데 지수가 있다는 말은 부동 소수란 말이다.

  • 최소 눈금 : ±0.0000000000000000000000000001, 10진수 29자리 표시
  • 최대 범위 : 약 ±2의 96승(12바이트), 10진수 29자리 표시

이 방법은 가수는 일반 정수처럼 취급하고, 지수는 10진수로 보는 방식이다. 계산은 내부적으로 어떤 방식으로 알아서 할 것이고, 화면에 표시할 때만 소수점 위치를 살짝 결정해 찍어주는 방법이다. 이렇게 하는 이유는 계산의 정확도를 위함이다. 10진 소수를 2진 소수로 정확히 바꿀 수는 없다. 허나 정수에선 가능하다. 고로 2진수 1을 10진수 최소 눈금으로 잡은 것이다.

이 방법으로도 곱하기 나누기에선 문제가 없다. 가수는 서로 곱하고 나누고, 지수는 서로 더하고 빼면 된다. 문제는 더하기 빼기이다. 지수가 큰 쪽으로 자리수를 맞추어야 하는데 가수는 2진 정수인데 지수는 10진수를 표시하니 복잡하다. 뭐 알아서 잘 했겠지.

이제 정수로 실수를 표현하는 원리를 알았으니 직접 구현할 수도 있을 것이다. 대충 이렇게 마무리한다.






독재정부가 하는 짓은 동서고금 똑같다.
전쟁터에서 하는 짓은 동서고금 똑같다.
한 나라의 역사만 제대로 알아도 나머지 나라 역사를 안다. 외국사 = 한국사
그러니 독재자 이승만, 박정희, 김일성, 한국 전쟁에 대한 환상을 깨자.
우리가 학교에서 배운 한국사는 1920년부터 일본이 가르친 일제 식민 사학이다.
근현대사 또한 친일파 세력 때문에 제대로 교육 받았다고 할 수 없다.