분류 전체보기

실수로 지운 파티션 복구하기

2021. 3. 22. 12:10

파티션을 나누거나, 포맷을 할 때면 실수로 파티션 테이블을 지우거나 바꿀 때도 있다.
파티션 삭제를 파일 삭제와 비슷한 사고라고 생각하고 파일 복구 방법을 찾는 경우가 많다.
하지만 실상은 파티션 복구만 해낸다면 모든 파일을 제자리로 돌릴 수 있다. 심지어 파티션 복구는 파일 복구보다 쉽고, 빠르고, 복원 가능성도 높다.

파티션이란?

우선 파티션의 구조 먼저 이해해야 한다. 일반적으로 MBR(Master Boot Record)에 있는 파티션 테이블에 파티션 정보를 기록한다.

파일 하나를 찾을 때, MBR의 파티션 테이블에서 파티션의 위치를 찾고 그 위치에 가서 파티션 구간 내부의 구조를 확인한다(흔히 포맷이라고 하는 NTFS, APFS, EXT4등이 그 구조에 대한 정보를 담고 있다).
이 구조에 있는, 파일 구조가 명세 된 파일에서 파일의 위치를 찾아 파일을 불러오는 것이다.

요즘은 MBR 대신 GPT를 쓰는데, 그 곳에 파티션 테이블이 포함되어 있다.
결론은, 파티션을 아무리 지우고 수정해도 파일이 저장되는 부분과는 독립적인 공간이고, 파일이 저장되는 부분은 건드리지 않는다는 것이다.

파티션과 파티션 포맷

보통 파티션을 변경하면 파티션 포맷도 같이 하기 때문에 파티션과 파티션 포맷을 연결해서 생각하기 쉽다.
하지만 파티션과 파티션 포맷은 엄연히 다른 것이다.

포맷은 틀을 잡는 것이다. 파티션 된 공간 안에서 데이터를 기록할 수 있도록 틀을 구성한다. 파일 구조가 명세 된 파일을 지우고 다시 구축한다. 포맷에 따라 파일 명세가 달라지기 때문에 필수적이다.

파티션은 저장 장치에 가장의 벽을 설치하기 위해 파티션 테이블을 수정한다. 파티션 포맷이나 파일 구조를 수정하지 않는다. 파티션 테이블에 포맷 정보가 담겨있기 때문에 파티션을 수정하면 파티션의 포맷이나 파일 구조를 읽어 올 수 없다.
파티션 테이블을 변경하면 포맷 정보를 읽어 올 수 없게 되므로 일반적으로는 파티션을 변경하면 포맷도 한번에 수행한다.

현실로 비유하자면, 파티션은 가벽 파티션을 생각하면 되고, 포맷은 책상을 생각하면 된다.

  • 파티션을 만들더라도 책상이 없으면 물건을 놓을 수 없다.
  • 공간이 좁아지도록 파티션을 옮기면 책상이 잘려서 책상을 사용할 수 없다.
  • 공간이 넓어지도록 파티션을 옮기더라도, 책상을 새로 들이지 않으면 물건을 올려 둘 수 있는 공간은 그대로다.

이런 구조이기 때문에, 파티션 테이블을 완전히 삭제한 후 재구축 한 상태라도 파티션 테이블을 복구할 수 있다면 모든 파일이 그대로 남아있게 된다!

앞에 언급한 것처럼 대부분의 소프트웨어들은 파티션을 변경하면 포맷도 같이 진행한다. 그래서 파티션을 관리하는 특수한 소프트웨어를 사용해야 한다.
그 특수한 소프트웨어를 이용해 파티션을 복구해보자.

MiniTool Partition Wizard 9.0

대표적으로 MiniTool Partition Wizard가 있다.
현재 13.5 버전까지 출시되었지만, 파티션 복구 기능을 무료로 사용할 수 있는 버전은 MiniTool Partition Wizard 9.0이다.

복구 방법 설명을 위해 방금 만든 가상 HDD에 파일 하나만 저장한 후 다시 파티션을 삭제했다.

설치 파일 다운로드

파일 크기 제한으로 분할압축 한 파일들을 다운로드 받아 설치한다.
또는 여기(kollhong.com)에서 한번에 다운로드한다.

pwfree9.zip
0.87MB

 

pwfree9.z01
9.77MB

 

pwfree9.z02
9.77MB

 

pwfree9.z03
9.77MB

비밀번호 kollhong.com
공식 사이트가 아닌 곳에서 다운로드 할 때는 반드시 checksum 확인, 서명 확인!!

실행

Partition Recovery Wizard 실행

파티션 관리 도구에 파티션 복구 기능도 제공되는 것이어서 파티션 복구 위자드를 실행해야 한다.

왼쪽 Wizards 메뉴에서 Partition Recovery Wizard 실행

다음 클릭

 

복구 할 디스크 선택

 

스캔 범위 선택. 실수로 파티션을 삭제한 후 다시 파티션을 만든 게 아니라면 Unallocated Space로 충분하다.

 

스캔 방식 선택. 마찬가지로 실수로 파티션을 지운 후 다시 파티션을 만들지 않았다면 Quick Scan을 선택하면 된다.

 

그러면 위와 같이 검색 된 파티션이 보인다. 남겨 둘 파티션을 선택하는 것이므로 현재 HDD에 남아있는 파티션도 선택해야 한다.

 

왼쪽 상단의 Apply 버튼을 누른다.

 

진행 후 위와 같은 창이 뜨면 성공

드라이브 레터 지정

파티션을 복구하더라도 Windows 탐색기에는 복구 한 파티션이 보이지 않을 수 있다.
파티션은 존재하지만 파티션에 드라이브 레터가 존재하지 않아서 마운트 되지 않은 것이다.

'하드 디스크 파티션 만들기 및 포맷' 실행

 

복구 한 파티션 선택, 우클릭, 드라이브 문자 및 경로 변경

 

추가 클릭

 

원하는 드라이브 문자 할당. 보통 C부터 순서대로 할당되므로 특별한 경우가 아니면 바로 '확인'을 클릭하여 저장하면 된다.

 

복구를 성공적으로 완료하면 기존의 파일까지 전부 보인다.

번외 - 파일 복구 프로그램

같은 업체에서 제공하는 파일 복구 프로그램이다.
파티션 복구와 달리 파티션이 있던 구간 전체를 스캔해야 하므로 시간이 오래 걸린다.

다행히 지워진 파일을 찾았다.
하지만 파일 이름을 인식하지 못한다. 뿐만 아니라 확장자 또한 html이 아닌 htm으로 되어 있다. 파일 내용에 따라 형식을 추론하기 때문이다. 파일 구조 가 명세 된 파일은 포맷에 관련 되어 있기 때문에 포맷을 복구하는 프로그램이 아니라면 인식하기 어렵다.

포스팅을 위해 방금 새로 만든 HDD임에도 불구하고 알 수 없는 파일들이 굉장히 많다.

VM을 Docker로 구현

2020. 11. 23. 16:47

Docker는 가상화가 아니다!

처음에는 Docker에 Ubuntu나 CentOS를 설치해 사용했다.
사용하려는 목적이 Synology NAS에서 apt 패키지 매니저를 사용하기 위한 목적이었고, 쉘 사용이 쉬워서 OS 컨테이너를 사용했다.
그러니까... 가상화의 목적으로 사용했다는 것이다.

그러나 systemctl이나 네트워크 구성이 어려운 점, Docker의 목적과 달리 백업, 배포가 어려운 점 때문에 Docker에 OS를 돌리는 건 그만 두기로 했다.
그래서 아래와 같은 방법으로는 docker를 사용하지 않을 건데, 혹시 나중에라도 필요하게 될까봐 기록으로 남겨본다.

아래 방법을 따라하면 CentOS 이미지를 사용하여 Docker를 구성하고, systemctl을 사용할 수 있고, 고유의 IP를 부여할 수 있다.

VM을 Docker로 구현하려 함

VM

  • 모든 컴퓨터 하드웨어를 가상화하고 OS를 실행 함. 약 30% 성능 저하가 있음.
  • 최근에는 Hypervisor를 사용하여 CPU가상화를 하지 않아 성능 저하가 낮은 편. 하지만 기타 IO장치들은 가상화를 하기 때문에 IOPS가 낮음. (최대 50% 저하)
  • OS 설치해야 함. 메모리 및 디스크 관리를 호스트 OS와 가상 OS에서 동시에 수행하며, 가상 OS에 할당한 메모리는 호스트에서 사용할 수 없음.

Docker

Docker의 원래 목적은 OS 자체를 가상화하는 것이 아니고 프로그램별로 containerize(컨테이너화) 하는 것이다.

  • 운영체제를 설치하지 않고, 서비스에 필요한 패키지만 설치하고 설정파일을 import 하여 컨테이너로 만드는 방식이다.
  • OS가 없기 때문에 메모리, 디스크 관리를 호스트 OS에서만 관여하므로 오버헤드가 적다.
  • 단점은 OS가 없기 때문에 ssh같은 원격 접속 도구나 yum 같은 패키지 매니저가 없다는 것이다.
  • 같은 환경의 컨테이너를 몇 줄의 텍스트로 만들 수 있으며, 따라서 배포가 쉽다. 이런 방식 덕분에 낯선 방식이지만 서버 유지/보수는 더 쉽다.
  • docker의 목적상 호스트 컴퓨터의 환경을 따르기 때문에 기존의 가상머신처럼 개별적 IP를 부여하기 어렵다.
Docker로 환경을 구축하는 두 가지 방법
  1. OS 자체를 컨테이너에 구현하는 방법이다. 개별적인 IP를 부여하고자 할 때는 그 과정이 복잡하다. 지금까지는 이 방법으로 블로그를 운영했다.
    그리고 이 방법으로 컨테이너를 만드는 방법을 오늘 소개하려고 한다.
  2. Docker의 원래 목적대로 각 애플리케이션 별로 컨테이너를 만든다. 별도의 IP는 부여하지 않으며, 새로 구성할 때는 컨테이너를 새로 만들어야 한다.
    이 방식이 원래 Docker의 용도대로 이용하는 방법이다.
    2번 방법은 구축/유지 보수가 쉬운 장점이 있지만 낯선 방식 때문에 Docker에 익숙한 관리자가 필요하다.

Docker 설치

Docker repo 추가 및 설치

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io

systemctl enable docker

docker 볼륨 위치 이동, docker 네트워크에 dns 정보 강제 지정

nano /etc/docker/daemon.json
{
    "data-root": "/mnt/RAID-Storage/docker/",
    "dns": ["192.168.0.1"]
}

Docker에서 디스크 크기 제한을 가능하도록 변경

RAID-Storage에 quota 마운트 옵션 지정

nano /etc/fstab

UUID=...... /mnt/RAID-Storage xfs defaults,prjquota 0 1

원래 defaults인 부분을 defaults,prjquota로 변경한다.
이러면 xfs자체에서 quota 기능을 구현하고, docker는 xfs의 기능을 사용한다.

이후 컨테이너를 만들 때 --storage-opt size=120G 옵션 사용.

고유 IP 할당

고유 IP를 할당하기 위해 Linux 커널에서 기본으로 제공하는 가상 네트워크 어댑터를 활성화한다.

서버 부팅시에 macvlan을 자동으로 구성하는 스크립트.
cd /etc/sysconfig/network-scripts
wget https://raw.githubusercontent.com/larsks/initscripts-macvlan/master/ifdown-macvlan
wget https://raw.githubusercontent.com/larsks/initscripts-macvlan/master/ifup-macvlan
chmod +x ifup-macvlan ifdown-macvlan
macvlan 구성
nano /etc/sysconfig/network-scripts/ifcfg-macvlan

DEVICE="macvlan"
TYPE=macvlan
DEVICETYPE=macvlan
MODE=bridge
MACVLAN_MODE=bridge
PHYSDEV=br0
MACVLAN_PARENT=br0
BOOTPROTO=static
IPADDR=192.168.0.170
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
NM_CONTROLLED=no
ONBOOT=yes
Docker에서 macvlan 네트워크 생성
docker network create -d macvlan \
    --subnet=192.168.0.170/24 \
    --gateway=192.168.0.1 \
    -o parent=br0 \
    -o macvlan_mode=bridge \
    macvlan

이 후 컨테이너를 생성할 때 --network macvlan 옵션, --ip 192.168.0.XXX 옵션을 사용하고
각 컨테이너마다 docker exec -it "컨테이너 이름" "echo 'nameserver 192.168.0.1' >> /etc/resolv.conf" 를 수행해야 한다.

systemctl (서비스 관리 도구) 사용

docker는 기본적으로 systemctl을 사용할 수 없다. OS를 가상화하는 목적이 아니기 때문이다.
systemctl을 사용하기 위해서는 systemctl에 필요한 파일을 만들어야 한다.

빈 디렉토리에 Dockerfile 만들고 이미지 빌드
mkdir docker && cd docker
nano Dockerfile
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/;\
rm -f /etc/systemd/system/.wants/;\
rm -f /lib/systemd/system/local-fs.target.wants/; \
rm -f /lib/systemd/system/sockets.target.wants/udev; \
rm -f /lib/systemd/system/sockets.target.wants/initctl; \
rm -f /lib/systemd/system/basic.target.wants/;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

# 언어셋 설치
RUN yum clean all \
&& yum repolist \
&& yum -y update \
&& sed -i "s/en_US/all/" /etc/yum.conf \
&& yum -y reinstall glibc-common

# epel-release 활성화
RUN yum install epel-release -y

# 기본적으로 필요한 OS 패키지를 설치한다.
RUN yum -y install tar unzip vi vim telnet net-tools iproute curl openssl \
apr apr-util apr-devel apr-util-devel nano firewalld git \
elinks locate python-setuptools

# ssh 서버 설치
RUN yum -y install openssh-server \
&& echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config \
&& echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config \
&& mkdir /root/.ssh && echo 'ssh-rsa "키" kollhong@localhost.localdomain' >> /root/.ssh/authorized_keys\
&& yum clean all

RUN systemctl enable sshd

# 타임존 변경
ENV LANG=ko_KR.utf8 TZ=Asia/Seoul

# 컨테이너 실행시 실행될 명령
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

Dockerfile에 기반하여 컨테이너 이미지 생성

docker build --rm -t local/centos7 .

컨테이너 만들기

이제 docker run 명령어로 컨테이너를 만들어서 가상머신처럼 사용할 수 있다.

컨테이너를 만들 때 local/centos7 이미지로 container를 만들면 systemctl을 사용할 수 있다.

docker run --memory "2g" --storage-opt size=120G -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v "디스크 디렉토리":"컨테이너 마운트 위치" --privileged --network macvlan --restart always --ip "컨테이너 IP" --dns 192.168.0.1 -t -d --name "컨테이너 이름" local/centos7

-v 옵션은 호스트 컴퓨터의 볼륨을 컨테이너에 마운트한다.

systemctl을 사용하기 위해서는 아래 옵션이 필수적이다.
-v /sys/fs/cgroup:/sys/fs/cgroup:ro : 이 옵션은 systemctl을 사용하는데 필요한 컨트롤 그룹 정보를 컨테이너에서 확인할 수 있게 한다.
-t, -d : 이 옵션은 유사 TTY 환경을 구현하고, detatch 모드로 컨테이너를 실행한다.

예시

docker run --memory "2g" -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /mnt/RAID-Storage/docker_volumes/bio-processor/:/opt --privileged --network macvlan --restart always --ip 192.168.0.171 --dns 192.168.0.1 -t -d --name "bio-processor" local/centos7

컨테이너(게스트 컴퓨터) 접속

docker exec -it "컨테이너 이름" "명령"
명령은 보통 /bin/bash이다.

컨테이너 백업

현재 컨테이너를 image로 저장

docker commit "컨테이너 이름" "이미지 이름"

image를 tar로 내보내기

docker save -o "파일 이름.tar" "이미지 이름"

tar를 이미지로 불러오기

docker load -i "파일 이름.tar"

이미지 확인

docker image ls 명령을 사용해서 불러온 이미지가 있는지 확인

docker run... 명령을 사용할 때 이미지를 선택하여 컨테이너 생성할 수 있다.

CSS local font에 맑은 고딕만 인식되는 이유

2020. 9. 23. 16:41

이번에는 글 제목이 이상합니다.

원래는 서론, 본론, 결론부로 정확히 구분하여 포스팅을 작성했었죠.
그러다보니 글 작성 주기도 길어지고, 파트 구분이 어려운 글감은 버려지기도 했습니다.

앞으로 개발 이야기를 자주 쓰려고 하는데, 개발 이야기는 파트 구분이 어려운 주제인 듯합니다.
그래서 적어도 개발 이야기는 상당히 이상한 제목, 짧은 본문으로 자주 올려보려고 합니다.

문제의 인지

원래 블로그에 폰트를 Malgun Gothic, Apple SD Gothic Neo 두가지를 사용했습니다.
보통 모바일에도 둘 중 하나는 설치되어 있기 때문에 이렇게 설정했는데, 아이폰에서는 작동하지 않았습니다.
분명 Apple SD Gothic Neo가 폰트 이름이 맞는데 작동하지 않았습니다. 맑은 고딕 폰트는 잘 적용이 됐는데 말이죠.

구글링

대부분은 일관적인 사이트 경험을 위해 로컬 폰트보다 서버에 woff폰트를 저장하고 사용했습니다.
저는 HDD 서버를 사용했고, 반응형 페이지이기 때문에 폰트에 따라 사이트 경험이 크게 달라지지 않았죠. 그래서 시스템 폰트를 사용할 예정이었습니다.

그래서 폰트 이름이 인식되지 않는 문제로 아무리 구글링을 해봐도 서버에 업로드 된 woff 폰트의 경로와 이름을 잘 쓰면 인식 된다는 답변 뿐이었습니다.
게다가 맑은 고딕 폰트는 인식되고, 산돌 고딕 폰트는 인식되지 않으니 검색하기는 더 힘들었습니다. 산돌 고딕은 한글 폰트인데, 구글링을 할 때는 영어 위주로 검색해왔기도 하구요.

폰트의 Full Name을 사용해라

그러다가 로컬 폰트가 인식되지 않는 이유를 찾았습니다.
저는 CSS에서 폰트 패밀리를 인식해서 폰트의 weight가 클 경우 Bold 폰트를 불러오는 줄 알고 font-face를

src: local('Apple SD Gothic Neo'), local('Malgun Gothic');

로 적었습니다. 하지만 그게 아니었습니다.

PostScript name 또는 Full name을 사용해야 합니다.
맑은 고딕의 경우는 Regular Font의 Full name이 Malgun Gothic이기 때문에 CSS에서 인식할 수 있었지만,
애플 산돌 고딕의 경우는 Apple SD Gothic Neo Regular가 Full name이었습니다.
그래서 아이폰에서는 CSS에 정의 된 폰트를 인식할 수 없었던 것입니다.


위가 맑은 고딕 폰트입니다. Full name이 Malgun Gothic이죠.


애플 산돌 고딕은 다릅니다. Font family만 Apple SD Gothic Neo이고 Full name이나 PostScript name은 "Regular" 까지 써야 합니다.

아직 남은 의문

Full name은 언어에 따라 다릅니다. 한글 OS에서는 맑은 고딕, Apple SD 산돌고딕 Neo이고, 영문 OS에서는 Malgun Gothic, Apple SD Gothic Neo입니다.

지금까지는 영문으로만 적어도 적용 되는걸로 보이는데, 추가 확인이 필요합니다.

키보드, 한글 쿼티가 뭐야?

2020. 6. 14. 18:01

어디서 이런 단어가 나온걸까?

한글 쿼티라는 단어를 처음 접한 것은 삼성 스마트폰이 나온 이후이다.
갤럭시S의 한글 키보드 설정에 '쿼티'라는 단어를 넣은 것이다.

마침내는 커뮤니티 사이트에서도 '한글 쿼티'를 사용하기에 이르렀다.

의미 전달에는 문제가 없다. 하지만 실제로는 정말 말도 안 되는 표현이다.
그 이유를 얘기해보려 한다.

키보드 결정 요소

키보드를 경정하는 요소는 두 가지가 있다.
키보드 종류(Keyboard Type), 입력 방법(Input Method)

입력 방법 대신에 키보드 배열(Layout)이라고도 한다.
하지만 키보드 종류와 섞어 쓰는 경향이 있기 때문에 정확한 구분을 위해 입력 방법이라고 표현한다.

키보드 종류와 입력 방법을 선택할 수 있다.


윈도우 설치를 해봤다면 이런 화면 몇 번쯤 봤을 것이다.
윈도우 설치 과정에서 키보드의 종류와 키보드 입력 방법을 선택할 수 있다.

키보드 종류

키보드 종류는 쉽게 말하면 키보드가 보내는 신호의 종류를 말한다.
초기에는 키보드에 컴퓨터 제조사마다 신호가 달랐고, 윈도우는 범용 호환성이 타겟이었기 때문에 여러가지 키보드에 대한 호환성을 갖고 있다.

fn키 조합으로 101키를 입력할 수 있는 키보드

일반적으로 101키 키보드를 사용한다. 한/영 버튼이나 한자 버튼이 있다면 한글 103/106키를 사용하게 된다.
윈도우의 경우 101키 키보드로 한글을 입력할 경우 오른쪽 Alt를 한/영 버튼으로, 오른쪽 Ctrl을 한자 버튼으로 사용한다.

키보드의 종류에 따라 키보드의 모양이 바뀌고, 컴퓨터에 전송되는 신호가 달라진다. 또한 키보드 종류를 바꾸면 입력에 문제가 생기거나 한/영 전환이 불가능 할 수 있다.
하지만 키보드와 키보드 종류를 알맞게 선택한다면 어떤 언어도 문제 없이 입력할 수 있다.

키보드 입력 방법

키보드에 인쇄된 문자를 말한다.
키캡에 인쇄된 물리적인 차이만 존재할 뿐, 키보드 내부에는 어떤 차이도 존재하지 않는다.
키보드에 한글이 인쇄되어 있든 영문이 인쇄되어 있든 상관 없이 컴퓨터에 같은 신호를 보낸다.

한글 두벌식 표준의 'ㅂ'이나 영문 QWERTY의 'Q'나 같은 신호가 전송된다.
단지 차이는 컴퓨터에서(또는 운영체제에서) 같은 입력 신호에 대해 어떻게 해석하느냐의 차이인 것이다.
입력 방법이 영문 쿼티일 경우 한글 입력 방법으로 바꾸지 않는 한, 한글 입력은 불가능하다.

영문 : QWERTY

가장 큰 특징은 숫자키 아랫줄이 QWERTY로 시작한다는 것이다.
타자기에서 사용하던 배열으로, 입력 속도가 빠르면 타자기가 꼬이는 문제 때문에 최대한 비효율적으로 설계했다는 이야기가 있다.

QWERTY

영문(라틴어) : QWERTZ, AZERTY

QWERTZ는 독일, 오스트리아, 스위스 등에서 사용하는 키보드이다.
AZERTY는 프랑스, 벨기에 등에서 사양한다. 두 입력 방법은 발음 구별 기호를 입력할 수 있다.

숫자키 아래의 첫 줄이 각각 QWERTZ, AZERTY로 시작하는 특징이 있으며, 키보드 종류는 QWERTY와 같다.

한글 : 두벌식 표준

한글 키보드 중에서 자음과 모음으로 구분 된 두벌식 키보드이며, 그 중에서 표준 키보드 배열이다.

두벌식 표준

숫자키 아래의 첫 줄이 ㅂㅈㄷㄱㅅㅛ로 시작하는 특징이 있으며, 키보드 종류는 QWERTY와 같아도 된다.

한글 : 세벌식 3-91(세벌식 391 또는 세벌식 최종)

세벌식은 초성 중성 종성 세 부분으로 구분된 키보드를 말한다.

세벌식 최종


위 키보드는 그 중에서도 세벌식 3-91 키보드 배열이다.
세벌식은 대체로 숫자키로도 한글 입력을 하게끔 되어 있다.

기존 두벌식 키보드와 크게 다르지만, 키보드 종류가 컴퓨터와 호환된다면 어떤 키보드라도 세벌식 입력 방법을 사용할 수 있다.

한글 쿼티

위에서 한글 입력 방법의 종류, 쿼티의 의미를 알아봤다.
또한 키보드의 모양을 의미하는 키보드 종류도 알아봤다.

그렇다면 한글 쿼티라는 단어에 굉장히 큰 모순이 생기는 것을 알 수 있다.

1. 한글 입력 방법을 지정하지 않았다는 데에 문제가 있다.

위에서 본 것처럼 한글 키보드에는 종류가 많다.
두벌식은 대체로 표준만 사용하지만 세벌식까지 확장하면 5종류가 넘는다.

그렇다면 한글 쿼티는 어떤 입력 방법을 말하는 것일까?
좀 우겨보면 이런 것도 한글 쿼티라고 말할 수 있을 것이다.

천지인 쿼티?

키보드 첫 줄이 QWERTY로 시작하고, 한글 입력이 가능한 키보드이다.
그러면 문제 없는 것 아닌가?

2. 영문 키보드를 QWERTY로 고정한 데에 문제가 있다.

나는 키보드 입력을 많이 하기 때문에 DVORAK도 써봤다.
그러나 한글 입력에는 전혀 지장이 생기지 않았다. 왜냐하면 한/영 전환을 누르면 '두벌식 표준' 입력 방법을 사용할 수 있기 때문이다. DVORAK을 사용하든 Colemak을 사용하든 한글 입력 상태에서 왼쪽 Shift 키의 오른쪽에 있는 버튼을 누르면 여전히 'ㅋ'이 입력된다. 하지만 키보드 첫 줄이 QWERTY로 시작하지 않는다.

그렇다면 나는 한글 DVORAK 입력 방식이었을까? 아니면 한글 QWERTY 입력 방식이었을까?

0. 원래 '한글 쿼티'의 의도는 키보드 종류를 말하고 싶었던 것이다.

QWERTY와 두벌식 표준의 공통점은 키보드의 모양이다. 그것 뿐이다. 키보드의 종류가 같다는 것이다.
컴퓨터에서는 이 공통점을 말할 때 '101키 키보드'라고 한다. 하지만 스마트폰은 대부분의 키가 없으므로 101키라고 말할 수 없다. 실제로는 40개 내외의 키밖에 없다.
101키라고 말할 수 없으니 한글 QWERTY라는 세상 신박한 표현을 사용하게 된 것이다.

신토불이 vs 완전 현지화

블리자드에서 오버워치의 사운드를 담당했다는 분이 했던 말이 있다. 오버워치가 서든어택을 제치고, 잠시나마 롤까지 제칠 수 있었던 이유 중 하나가 완전 현지화라는 것이다. 이 부분은 믿거나 말거나 이지만 그 근거가 상당히 인상적이어서 소개한다.

오버워치는 캐릭터의 보이스를 대부분 한국인이 녹음했고, 그래서 한국인의 정서에 맞는 분위기를 연출할 수 있었다는 것이다.
오버워치를 안 해본 사람이라도 "이 것도 너프해 보시지!", "석양이 진다" 등의 대사는 다들 한 번쯤 들어봤을 것이다. 또한 한국어가 아니어도 한국인이 더빙했다. 류승룡 기모찌로 알려진 "류진노 켄오 쿠라에!"는 한국 블리자드에서 더빙한 음성이다.
외국 게임이지만 최대한 한국인에게 맞게 새로 만들었다는 것이다.

반면에 서든어택은 한국 게임이지만 외국 게임처럼 보이려고 노력했다는걸 지적했다.

단지 해당 담당자의 말일 뿐이다. 나는 그 근거가 인상적이었다고 말 하고 싶었을 뿐이고, 오버워치가 성공하고 서든어택이 망한 이유가 '사운드 때문이다' 라고 말하고 싶은 건 아니다.

신토불이 스마트폰?

한국인이 한국폰을 선호하는건 나쁜게 아니다. 게다가 한국 브랜드가 뒤쳐지는 브랜드도 아니니 말이다.
하지만 문제를 제기하고 고칠 필요는 있을 것 같다.

한국

삼성

구글에 "한글 쿼티"라고 검색해보자. 그러면 삼성 갤럭시 얘기 뿐이다.

항상 갤럭시라는 단어가 함께 등장한다.

타자기 역사는 1829년부터 시작됐고, 한글 타자기는 1913년부터 시작됐다.
전자식 타자기가 나올 때부터 한글과 영문을 동시에 입력할 수 있게 됐다.
두벌식 표준 입력 방식은 1985년 제정됐다.

입력기의 역사는 100년이 넘었고, QWERTY나 두벌식 표준 입력 방식이 바뀌지 않은 것은 35년이 넘었다.
그럼에도 불구하고 구글 검색에서는 삼성 스마트폰 얘기 뿐이다. '한글 쿼티'라는 표현은 근래에 사용하기 시작한 것이다.

 

LG

LG도 마찬가지로 '쿼티 키패드'라고 표현한다.

 

외국

왠만한 외국 기업들은 '두벌식 표준'이라고 표현하고 있다.

구글

구글 입력기에서는 두벌식 표준이라고 표현한다.

애플

애플은 표준, 10키로 구분한다.

보통은 '두벌식 표준'이라고 하는데, '표준'이라고 써져 있다.
조금 애매하긴 하다. 그러나 두벌식은 자음과 모음으로 구분된 것을 의미하고, 그 중에서도 표준 입력방식이 우리가 사용하는 자판인 것을 생각해보면 적절한 표현으로 볼 수 있다.

마치며...

한국 서드파티 키보드들 중에서도 '한글 쿼티' 라고 말하는 경우는 거의 드물다.
내가 스마트폰을 사용하면서 '한글 쿼티'를 본건 LG 기본 입력기와 삼성 기본 입력기 뿐이라고 해도 과언이 아니다.

그렇다면 두 업체는 어째서 '한글 쿼티'라고 말하기 시작한거고, 왜 여태까지 수정하지 않는걸까?

Optimus EX용 커널(SmartassV2+Lazy)

2020. 3. 16. 19:56

변경점

  • 백원만님 커널 기반
  • 기본 Governer : Lazy (하지만 init.rc에서 가버너를 바꾸는 듯함)
  • 기타 여러가지

적용법


adb, terminal에서 su dd if=(img 파일 입력) of=/dev/block/mmcblk0p7

KT젤리빈용입니다

boot.img
4.8 MB

'안드로이드 > 옵티머스 EX' 카테고리의 다른 글

Optimus EX용 커널(SmartassV2+Lazy)  (0) 2020.03.16
Optimus EX 롬 백업  (0) 2016.12.28

블로그에 다크모드가 적용되었습니다!

2019. 9. 25. 00:25

추후 강좌도 작성하겠습니다.

사파리의 경우 아래와 같은 개발자 모드 화면에서 다크모드를 강제로 켜거나 끌 수 있습니다.

 

 

크롬에서도 개발자모드를 통해 미적용 상태와 비교가 가능할 것으로 보입니다.

 

 

마크다운 사용 이전의 게시물은 가독성이 현저히 떨어지는 부분이 있습니다.

최대한 옛날 글에서도 가독성을 잃지 않도록 바꿔나갈 예정입니다.

[macOS 한글 호환성 2편] 한글 깨짐 수정법

2019. 8. 29. 15:42

맥을 사용하면서 자주 접하게 될 한글 인코딩 호환성 문제

인코딩이 윈도와 다르다. 맥에서 만든 파일은 윈도에서 자음과 모음이 분리되어 보인다. 많은 사람들이 이를 자소 분리현상이라고 말한다. 또한, 일부 사이트는 한글이 깨지거나, 다운로드한 파일의 이름이 깨지는 경우가 많다.`

이번 글에서 다룰 것은 아니지만, 이 현상은 iOS에서도 나타나는 현상이다. 하지만 지금까지 iOS 사용자들은 이런 불편함을 느끼지 못했다. 파일 공유가 어려워서, 다운로드 받을 파일을 수정하는 경우는 많지만, 파일을 만드는 경우는 거의 없었다. 또한, 주요 클라우드 서비스는 파일을 업로드하면 자소 분리를 해결해주기 때문에 한글 인코딩 문제가 크게 다가오지 않았다. 그런데, 앞으로는 iOS 사용자들도 자주 겪게 될 것이다. 9월 중 정식 공개될 iOS 13에서는 File 앱을 통해 파일 관리를 쉽게 할 수 있다. 문제는 맥과 같은 인코딩을 사용하기 때문에 베타 사용자들 입장에서는 iOS 13에서 한글 처리에 문제가 생긴 것으로 느끼기도 할 수 있다는 것이다.

어쨌든, 이번 글을 통해 두 가지를 다룰 것이다.

  1. 업로드 하는 파일의 자소 분리 문제와 해결법
  2. 다운로드하는 파일의 텍스트 깨짐과 해결법

원인

이 현상의 원인은 인코딩이 달라서가 아니다. 윈도우에서 CP949라는 구식 인코딩 방식을 사용하기 때문이다. CP949는 EUC-KR의 확장 버전이라고 볼 수 있다. 이 인코딩 방식은 MS에서 초기 윈도우를 개발할 때, 한글 지원을 위해 만든 인코딩 방식이다. 따라서 현재는 개량된 인코딩이 많이 나와 있으며, 많은 운영체제에서 사용하지 않는 인코딩 방식이다(지원하지 않는다는 의미는 아니다). 요즘은 영어를 제외한 대부분의 문자를 Unicode로 인코딩한다. 영어도 특수한 문자를 표시하기 위해 유니코드로 인코딩하는 경우가 많다.

그럼에도 불구하고 윈도우는 여전히 기본 인코딩 방식이 CP949이다. 그래서 기본 텍스트 편집기로 작성한 파일이나 Visual Studio에서 작성한 코드들이 다른 운영체제에서 보면 깨져서 보인다. 특이하게도 한글 윈도우만 기본 인코딩이 CP949이다. 한글 지원을 위한 인코딩이니... 당연한 결과다. 영문 윈도우는 기본 인코딩이 CP949가 아니다. 영문 윈도우에서 작성한 한글 텍스트 문서들은 다른 운영체제에서도 잘 보인다는 얘기다.
영문 윈도우가 한글을 지원하지 않는 것도 아닌데, 한글 윈도우는 왜 기본 인코딩이 CP949인지 의문이다.

그래서, 일부 웹페이지들이 CP949로 인코딩되어 있다. 이런 사이트는 일부 운영체제에서 글자가 깨져서 보인다. 앞서 언급했듯이, 한글 윈도우만 기본 인코딩이 CP949이기 때문에 다른 언어의 윈도우나 다른 운영체제에서 작성한 웹페이지는 한글이 깨지지 않는다. 가끔은 웹페이지는 잘 보이지만, 파일을 다운로드하면 파일 이름이 깨져있기도 하는데, 이 또한 파일을 전송하는데 인코딩을 제대로 바꾸지 않아서 그렇다.

증상

글자가 깨진다는 것은 아래와 같은 증상을 말한다.

텍스트파일의 내용 중 한글이 보이지 않는다.
간혹 다운로드한 파일의 이름이 위와 같이 깨지기도 한다.

이 증상은 1편의 자소 분리 현상에 비할 수 없이 불편하다. 자소 분리 현상은 파일을 공유하면 다른 사용자가 겪게 되는 문제이면서도 인코딩을 바꾸지 않더라도 읽고 이해할 수는 있다.

하지만 위의 한글 깨짐 현상은 맥의 사용자가 직접 겪을 문제이고, 인코딩을 바꾸지 않는 한, 사용자는 읽고 이해하기 어렵다.

해결법

저 텍스트를 유니코드 인코딩으로 변환하면 된다.

이번에는 iconv명령을 사용한다. iconv -f cp949 -t UTF-8 "$f"

Automator로 만들기

기존의 터미널은 파일을 직접 입력해야 한다. 하지만 오토메이터를 사용하면 Finder에서 파일을 선택하여 바로 실행할 수 있고, 또한 여러 파일을 자동화할 수도 있다.

실행 가능한 Workflow 파일 다운로드

깨진 한글 파일 변경.workflow.zip
8.5 kB

깨진 한글 txt 변경.workflow.zip
0.21MB

2021.05.31
iconv가 인코딩을 인식하지 못하는 경우 파일 내용이 사라지는 문제 발생
iconv 변환에 문제가 없는지 확인 후 변환을 시도하도록 변경
변환 결과 알림 추가

Finder에서 사용할 수 있게 등록하기

  • 시스템 메뉴(애플 로고)
  • 시스템 환경설정(System Preferences)
  • Extentions
  • Finder
  • 방금 만든 Quick Action 선택

Quick Action에 등록된 서비스를 실행하면 아래처럼 파일 내용이 정상이 된다.

2021.05.31 파일 내용이 사라지는 문제 수정

  1. 행인 2020.09.11 16:57

    엄청난 팁이에요! 이 문제 때문에 미쳐버릴것 같던 때가 한두번이 아닙니다.
    정말 정말 감사합니다.

    • BlogIcon 본인해남 2021.01.06 14:45

      작동이 잘되시던가요? 저는 'AppleScript 실행' 동작에 오류가 발생함:.... 이라고 나오던데요...

  2. 본인해남 2021.01.06 14:51

    덕분에 많은 것을 이해했습니다. 감사한 마음입니다.
    말씀하신데로 오토메이터를 설치 실행해보았습니다만, 'AppleScript 실행' 동작에 오류가 발생함:. 이라고 나오던데요. 혹시 제가 무엇을 잘못했을까요?
    제가 한 것은: 파일 다운받아 압축 풀고 더블클릭하여 실행해서 확장프로그램의 파인더에 설치 및 체크는 잘되었는데요...

  3. 본인해남 2021.01.06 14:51

    덕분에 많은 것을 이해했습니다. 감사한 마음입니다.
    말씀하신데로 오토메이터를 설치 실행해보았습니다만, 'AppleScript 실행' 동작에 오류가 발생함:. 이라고 나오던데요. 혹시 제가 무엇을 잘못했을까요?
    제가 한 것은: 파일 다운받아 압축 풀고 더블클릭하여 실행해서 확장프로그램의 파인더에 설치 및 체크는 잘되었는데요...

    • BlogIcon 친절한 콜홍 2021.01.25 07:34 신고

      앗 휴대폰을 바꾸면서 알림을 받지 못해서 늦게 답장 해드립니다.

      정확히 어떤 상황에서 나오는 메시지인가요?
      메뉴바에서 메시지가 나타나는 것인가요? 아니면 새로운 창이 떠서 메시지가 나타나는 것인가요?
      그리고 더보기 버튼이나 자세히 보기 같은 버튼이 있을 것 같습니다. 있다면 그 내용도 알려주세요.

      다운로드 받은 파일 아이콘에 이름을 변경하고자 하는 파일의 아이콘을 드래그&드롭 해보세요. 똑같은 결과가 나타나나요?

  4. BlogIcon a 2021.01.21 00:25

    a

  5. YSE 2021.02.07 18:47

    감사합니다! 텍스트 파일을 받을 일이 많았는데 늘 한글이 깨져서 엄청 불편했었어요. 덕분에 잘 해결했습니다! (참고로 저는 아직 catalina 10.15.7버전입니다.)

  6. ... 2021.02.08 00:20

    혹시.. 천재 이신가요?.... 진짜 너무 감사합니다.... 이게 이렇게 빨리 해결되는거였다니.... ㅠㅠㅠㅠ

  7. 캄사 2021.03.15 20:49

    감사합니다.
    그런데 위의 실행 가능한 Workflow 파일 다운로드 에는 파일이 두개가 있는데
    "깨진 한글 txt 변경.workflow" 이 파일이 설명에 맞는건가요?

    "깨진 한글 파일 변경.workflow" 파일은 어떤 기능인가요?
    오토메이션에서 열아봤는데 2개가 모두 iconv를 사용하던데요.
    둘다 있어야 하는건가요 ?

    궁금합니다.

    • BlogIcon 친절한 콜홍 2021.03.16 13:16 신고

      깨진 한글 txt 변경.workflow
      는 파일 내옹 중에 한글이 깨진 경우에 사용하는 것이구요.

      깨진 한글 파일 변경.workflow
      는 파일 이름 중에 한글이 깨진 경우에 사용하는 프로그램입니다!

  8. guest 2021.04.07 05:44

    감사합니다
    전 이걸 사용했더니 어떤건 제대로 되고 어떤건 내용이 몽땅 사라져버렸어요 ㅠ_ㅠ 0바이트로 용량도 바뀌었고요. 머가 잘못되었을까요 ㅠ_ㅠ

    • BlogIcon ㅇㅇ 2021.05.20 08:21

      저도 똑같이 이렇게 됐어요ㅠㅠ

    • BlogIcon 친절한 콜홍 2021.05.31 11:19 신고

      iconv가 업데이트 되면서 일부 cp949 인코딩을 변환할 수 없는 문제가 생긴 것 같습니다.
      brew를 통해 최신 버전을 설치했지만 여전히 같은 문제가 발생하는군요.

      현재 파일을 업데이트해서 인코딩을 성공적으로 변환했는지 먼저 확인한 후에 파일 내용을 수정하도록 변경했습니다.

  9. 2021.07.11 14:24

    비밀댓글입니다

  10. guest 2021.10.14 11:07

    깨진 한글 txt 변경 파일을 이용할 시 내용이 모두 사라지는 문제가 발생합니다.
    확인해주시면 감사하겠습니다.

  11. m1 사용자 2021.10.15 22:34

    m1에서 txt 파일을 수정하면 파일 내용이 전부 사라지네요

[macOS 한글 호환성 1편] 한글 자소분리 해결법

2019. 8. 28. 20:06

맥을 사용하면서 자주 접하게 될 한글 인코딩 호환성 문제

macOS에서 사용하는 한글 인코딩은 Windows와 다르다. 맥에서 만든 파일은 윈도우에서 자음과 모음이 분리되어 보인다. 많은 사람들이 이를 자소 분리현상이라고 말한다. 또한, 일부 사이트는 한글이 깨지거나, 다운로드한 파일의 이름이 깨지는 경우가 많다. 이 또한 인코딩이 달라서 생기는 문제이다.

이번 글에서 다룰 것은 아니지만, 이 현상은 iOS에서도 나타나는 현상이다. 하지만 지금까지 iOS 사용자들은 이런 불편함을 느끼지 못했다. 파일 공유가 어려워서, 다운로드한 파일을 수정하는 경우는 많지만, iOS 장치에서 파일을 생성하여 공유하는 경우는 거의 없었다. 또한, 주요 클라우드 서비스는 파일을 업로드하면 자소 분리를 해결해주기 때문에 한글 인코딩 문제가 크게 다가오지 않았다. 그런데, 앞으로는 iOS 사용자들도 자주 겪게 될 것이다. 9월 중 정식 공개될 iOS 13에서는 Files 앱을 통해 파일 관리를 쉽게 할 수 있다. 문제는 맥과 같은 인코딩을 사용하기 때문에 베타 사용자들 입장에서는 iOS 13에서 한글 처리에 문제가 생긴 것으로 느끼기도 할 수 있다는 것이다.

어쨌든, 이번 글을 통해 두 가지를 다룰 것이다.

  1. 업로드하는 파일의 자소 분리 문제와 해결법
  2. 다운로드하는 파일의 텍스트 깨짐과 해결법

원인

맥과 윈도우는 인코딩 방식이 다르다.

윈도우는 NFC(Normalization Form Canonical Composition) 방식을, 맥은 NFD(Normalization Form Canonical Decomposition) 방식을 사용한다. 한국어로는 보통 완성형, 조합형이라고 말한다.

조합형은 '콜'을 저장할 때, 'ㅋ' + 'ㅗ' + 'ㄹ'로 저장한다

문자 코드
11
12
13

이라고 하면 실제 저장 내용은 111213으로 저장된다
'ㅋ', 'ㅗ', 'ㄹ'을 입력하는 동안 코드는 11, 1112, 111213으로 바뀐다.

윈도우는 '콜'이라는 문자에 다른 코드를 할당한다.

문자 코드
11
12
13
2032
222355

이라고 하면 실제 저장 내용은 222355가 된다.

'ㅋ', 'ㅗ', 'ㄹ'을 입력하는 동안 코드는 11,2032,222355로 바뀐다.

위는 예시일 뿐이며, 실제로는 완성형 중에도 여러 가지, 조합형 중에도 여러 가지 인코딩 방법이 존재한다.

증상

두 가지 모두 표준 정규화 인코딩 방식이다. 맥은 윈도우에서 만든 파일을 제대로 처리할 수 있으니, 맥은 두 가지 표준을 모두 지원하는 셈이다. 윈도우는 조합형으로 인코딩 된 파일을 제대로 표시할 수 없으니 호환성이 떨어진다고 볼 수 있다.

그러나 일반적인 사용자 입장에서는 유니코드나 인코딩 표준에 대해서 알 겨를이 없으니 맥의 문제라고 착각하기 쉽다. 개인적으로는 현실에서 꽤 많은 사용자가 맥의 문제라고 인식하는 것 같다. 윈도우가 제대로 출력하지 못하는 것인데도 불구하고...

출처 : clien.net

해결법

하지만 점유율 부분에서 이런 문제를 신경 써야 하는 쪽은 맥 사용자다. 다행히도 맥에서는 완성형으로 인코딩 된 파일을 표시할 수 있다. 그래서 파일 명을 완성형으로 인코딩하면 된다.

convmv 설치

우선 convmv를 설치해야 한다. convmv는 CONVerts filenames from one encoding to another and MoVe라는 뜻으로, 인코딩을 바꾸는 툴이다. mv는 파일을 이동하는 명령인데, 이름을 바꾸는 데에도 사용한다. 그러므로 인코딩을 바꾸는 툴이라고 봐도 된다.

터미널을 열고 brew install convmv 를 입력한다. brew가 설치되어 있지 않다면 brew를 먼저 설치해야 한다. brew는 리눅스용으로 컴파일된 프로그램을 실행할 수 있게 해주는 환경을 만들어준다.

convmv 사용법

convmv -f utf8 -t utf8 --nfc --notest <filename>

텍스트 인코딩을 utf8에서 utf8로 바꾸는데, nfc 정규화 방식을 사용한다는 의미이다.

자세한 내용은 man convmv를 참고하면 된다.

2021.03.17
일부 시스템에서 convmv가 NFD로 정규화 된 파일을 인식하지 못하는 문제가 있어 수정 하였습니다.
원인을 정확히 할 수는 없지만, Argument로 파일 이름을 전달할 경우 convmv 프로그램이 인식하지 못하는 것 같습니다.
따라서 디렉토리를 인수로 사용하고, 해당 디렉토리에서 모든 파일을 검색하여 convmv를 실행하도록 변경하였습니다.

2021.05.21
3월 17일에 업데이트 한 내용 원상 복귀하였습니다.
지난 1여년 간 같은 문제가 계속 반복되어 문제를 우회할 수 있도록 코드를 수정하였으나,
최신 환경에서 문제가 해결된 것으로 보여 원상 복귀하였습니다.

추가로 프로그램 실행 결과가 알림으로 나타나도록 수정하였습니다.

Automator로 만들기

기존의 터미널은 파일을 직접 입력해야 한다. 하지만 오토메이터를 사용하면 Finder에서 파일을 선택하여 바로 실행할 수 있고, 또한 여러 파일을 자동화할 수도 있다.

실행 가능한 Workflow 파일 만들기

  • 오토메이터 실행
  • 새로 만들기
  • Quick Action 선택
  • 왼쪽 사이드바에서 Run Shell Script를 선택하고, 오른쪽으로 끌어온다.
  • 왼쪽 사이드바에서 Set Value of Variable을 선택하고, 오른쪽으로 끌어온다.
  • 왼쪽 사이드바에서 Display Notification을 선택하고, 오른쪽으로 끌어온다.
  • 오른쪽 패널을 이미지와 같이 바꾸고 입력한다.

for i in "$@"; do
	/usr/local/bin/convmv -f utf-8 -t utf-8 --nfc --notest "$i"
done
  • 파일을 ~/Library/Services에 저장한다.

Finder에서 사용할 수 있게 등록하기

  • 시스템 메뉴(애플 로고)
  • 시스템 환경설정(System Preferences)
  • Extentions
  • Finder
  • 방금 만든 Quick Action 선택

Finder에서 사용하기

이젠 아래 이미지처럼 사용하면 된다.

2021.03.17 일부 시스템에서 convmv가 작동하지 않던 문제 수정
2021.05.21 convmv 소스코드 원상 복귀 및 알림 추가

  1. 이전 댓글 더보기
  2. workspace 2020.03.21 23:38

    다 한글 이름 파일들 입니다...
    file -I 커맨드를 돌려본 결과 charset=binary 라고 출력됩니다.
    그래서 -f 을 binary 라고도 해보고 base64라고도 해봤는데 결과는 똑같네요..
    진짜 뭐가 문제인 걸까요 ㅠㅠ
    cannot find directory 문제는 아닌것같습니다.

    • BlogIcon 친절한 콜홍 2020.03.22 11:50 신고

      제가 정상적으로 작동하는 파일도 charset=binary라고 나오네요.

      혹시 맥에서 방금 만든 파일로도 0files in 0 seconds라고 나오나요?

      brew에서 convmv를 업데이트하거나 재설치해보세요.


      파일을 찾지 못했다고 나오지 않는걸 봐서는 convmv명령까지 파일이 제대로 전달되는 것 같습니다.
      그렇다면 convmv에서 인코딩을 제대로 인식하지 못하는 것으로 보입니다.

    • BlogIcon 친절한 콜홍 2020.03.22 11:53 신고

      맥에서 새로 만든 파일로도 제대로 안 된다면

      1. 맥 구성 문제로 한글 인코딩이 이상한 것이거나
      2. convmv의 문제로 인코딩을 인식할 수 없거나
      둘 중 하나밖에 가능성이 없습니다.

      우선 convmv재설치 하시구요.
      가능하다면 다른 맥을 사용해보시고, 그게 어렵다면 다른 사용자계정을 만들어서 시도해보세요.

  3. 맥초보 2020.03.25 01:40

    좋은 정보 정말 감사합니다. 앞으로 맥으로도 과제할때 걱정 없을거 같습니다. 한가지 질문이 있는데요. 확장프로그램 설정에서 설정한 빠른동작이 터치바 항목으로 가 있습니다. 이걸 어떻게 Finder항목으로 옮길 수 있을까요? 저장할때 Finder로 설정했는데 이상하네요 ㅠㅠ

    • BlogIcon 친절한 콜홍 2020.03.25 19:19 신고

      Finder로 설정한 건 파인더에서만 이 오토메이터를 사용할 수 있게 하는거구요, 확장프로그램 설정에 나오는 것과는 관련 없어요.
      저는 파인더와 터치바 항목에 둘 다 나타납니다.

    • 맥초보 2020.03.25 19:56

      감사합니다. 한가지만 더 여쭤도 될까요? ㅠㅠ
      저는 우클릭 했을때 Services항목이 없습니다. 제가 잘못한게 있을까요?

    • BlogIcon 친절한 콜홍 2020.03.25 20:03 신고

      그게 확장 프로그램 설정에서 사용 체크를 해야 나타나는거예요.
      확장프로그램에 나타나지 않는 이유를 모르면 해결할 수 없을 듯합니다

    • 맥초보 2020.03.25 20:08

      됐습니다!!ㅎㅎ 잘 쓰겠습니다 ㅎㅎ

    • BlogIcon 친절한 콜홍 2020.03.25 20:08 신고

      다행이네요! 잘 쓰세요~

  4. Eric 2020.03.31 09:55

    이러한 방법 알려주셔서 감사합니다.
    제가 난독증이 있어서 그러는데요..
    convmv 설치 하고, Automator로 만들기 하고..

    그리고 파인더에서 항상 수정해 줘야 하는건가요??
    이런 질문 드려서 죄송합니다.

    • BlogIcon 친절한 콜홍 2020.03.31 10:26 신고

      오토메이터까지 알맞게 이해 하신거예요!

      그 아랫 단계를 하시면 언제든지
      파인더 - 파일 선택 - 마우스 우클릭 - 서비스 - 한글 파일명 자소분리 수정
      을 클릭해서 윈도에서 자소가 분리되어 보이는 현상을 해결할 수 있습니다!

  5. 디언 2020.04.13 11:09

    안녕하세요
    brew를 아래 명령어로 설치하고
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew install convmv 로 convmv설치한후
    automator 실행 하고 캡쳐내용대로 넣은후 save한후
    finder에서 쓸수있게 service로 등록하고
    finder에서 한글명의 엑셀파일을 우클릭해서 해당 quick action을 클릭한후
    윈도우 pc에서 해당 파일을 봤는데.. 여전히 자소음이 분리되어 나타납니다 ㅠ
    혹시나해서 convmv를 uninstall 후 install다시했는데도 마찬가지에요..
    혹시 어느 부분을 놓쳤거나 점검해봐야할지요..

    • BlogIcon 친절한 콜홍 2020.04.20 00:15 신고

      어떤 의미인지 모르겠습니다.
      말씀하신 걸 보면 제대로 따라한 것 같습니다.
      처음부터 다시 한 번 차근차근 해보세요.

  6. mansesjh22 2020.04.20 00:13

    안녕하세요! 꿀팁 정말 감사합니다ㅠㅠ
    근데 과정 중에 오토메이터에 셸 스크립트를 쓰고 저장 전에 제가 잘못하고 run을 눌렀었는데요...ㅜㅜ이게 크게 문제되지는 않나요??

  7. 시미간 2020.04.24 16:43

    와우! 자소분리 문제 해결법을 찾던 중... 이 포스트를 발견했습니다!

    잘 작동합니다!

    감사합니다!

  8. ㅇㅇ 2020.05.01 04:19

    최근까지 활발히 댓글 달아주신거 보고 댓글 남깁니다.
    현재 MacOS 10.15.3에서, 정상 작동하지 않습니다. 코드 문제는 아니고요, 위에 어떤 분이 말씀하신 것처럼 제대로 변환이 안됩니다.

    ❯❯❯ convmv 도큐멘트.docx -f utf8 -t utf8 --nfc --notest
    Ready! I converted 0 files in 0 seconds.
    ❯❯❯ convmv -f utf8 -t utf8 --nfc --notest 도큐멘트.docx
    Ready! I converted 0 files in 0 seconds.
    ❯❯❯ convmv -f utf8 -t utf8 --nfd --notest 도큐멘트.docx
    mv "./도큐멘트.docx" "./도큐멘트.docx"
    Ready! I converted 1 files in 0 seconds.

    이런 상황이고요, 정확히 어떤 이슈인지 모르겠습니다. 확실한 것은 어떤 방법을 이용해도 convmv으로는 윈도우에서 한글 깨지는 현상이 없어지지 않아요. 최근까지 이 블로그에서 안내해준 오토메이터로 잘 쓰고 있었는데, Mac Version issue인지 convmv 이슈인지 모르겠어요 (전자같긴한데) 확인 가능한가요?

    • ㅇㅇ 2020.05.01 04:22

      폴더에 적용해도 마찬가지입니다.

      ❯❯❯ convmv -r -f utf8 -t utf8 --nfd --notest ./test
      mv "./test/도큐멘트.docx" "./test/도큐멘트.docx"
      Ready! I converted 1 files in 0 seconds.

      이렇게는 뜨는데, 막상 윈도우에서 보면 그대로 깨져 있어요.

    • BlogIcon 친절한 콜홍 2021.03.17 17:32 신고

      실행 코드 수정하였습니다.

      파일을 선택해서 서비스를 실행하면 같은 폴더의 모든 파일에 대해서 convmv가 실행됩니다.
      폴더를 선택해서 서비스를 실행하면 해당 폴더 내부에 있는 모든 파일에 대해서 convmv가 실행됩니다.

      파일 이름을 전달하면 인식하지 못하는 듯하고, 프로그래밍 방식으로 파일 이름들을 불러와 convmv로 실행하면 정상 작동하는 것 같습니다.

  9. 노란공룡 2020.07.21 19:58

    맥에서 이 글의 방법으로도 iterm2에서 한글이 풀려서 보이시는 분들은, 아마도 macOS의 기본 Terminal에서는 잘 보일 겁니다. 이런 경우는 iterm2의 설정으로 간단히 해결 됩니다.

    iterm2 > preferences > Profiles > Text > Unicode normalization form 을 None에서 NFC 또는 HFS+로 바꿔보세요 --3--3---333 ^^

    • BlogIcon 조아라 2020.07.31 19:12

      우와 감사합니다 터미널에서 한글폴더 검색은 성공했는데 보이는건 깨져보여서 의아스러웠었거든요 덕분에 속시원해졌어요~!

    • BlogIcon 개발개발 2021.07.22 23:13

      진심으로 감사합니다! 원하던 해답입니다

  10. tky7068 2020.08.07 16:55

    참고가 되었습니다. 감사합니다. ^^

    • BlogIcon jewooks 2020.08.13 15:30

      일단 먼저 제가 오랫동안 스트레스 받았던 부분을 해결해 주셔서 너무 감사합니다 !

      저는 액셀 함수 출력 부분에 다른 엑셀시트를 넣을때 항상 한글이 깨져서 너무 괴로웠는데 작성자님 덕분에 속이 편해 졌습니다. 감사합니다 ㅠㅠ

  11. 2020.09.09 14:03

    비밀댓글입니다

    • BlogIcon 친절한 콜홍 2020.09.23 11:59 신고

      휴대폰을 바꾸면서 알림을 못 받았더니 이런 귀한 댓글에 답변을 못 드렸네요 ㅠㅠ

      확실히 맥에서 인코딩이 서로 다른 파일에 대해 작업하기 어려움이 있습니다.
      그래서 윈도우 사용자와 파일 공유를 하는게 아니더라도 인코딩을 바꿔두는게 편하기도 하지요.

      특히 구글 드라이브같은 파일 공유 서비스를 이용할 때 인코딩을 변경해주지 않는다면 파일이 겹치거나 동기화가 되지 않는 등 어려움이 있구요...

      좋은 의견 감사합니다!

  12. 감사합니다. 2020.12.23 22:16

    알려주신 정보 감사합니다 ^^

    정보 공유차 댓글을 달아 드립니다.

    현재 맥 OS 10.14.6 모하비를 사용중이고,

    알려주신 방법으로 파일 인코딩 변환을 할 때 맥 에서는 제대로 잘 보입니다.

    하지만, 다시 이 파일 을 윈도우 로 옮기면 파일명이 여전히 깨져 있네요.... ㅠㅠ

    특정 버전 에서는 convmv 가 정상적으로 작동되지 않는 듯 합니다.

    오토메이터, 쉘에서 직접 실행 모두 마찬가지입니다...

    • BlogIcon 친절한 콜홍 2020.12.31 20:56 신고

      그렇군요.
      최신 버전에서도 다시 한 번 확인 해봐야겠습니다. 감사합니다

    • BlogIcon 친절한 콜홍 2021.03.17 17:33 신고

      실행 코드 수정하였습니다.

      파일을 선택해서 서비스를 실행하면 같은 폴더의 모든 파일에 대해서 convmv가 실행됩니다.
      폴더를 선택해서 서비스를 실행하면 해당 폴더 내부에 있는 모든 파일에 대해서 convmv가 실행됩니다.

      파일 이름을 전달하면 인식하지 못하는 듯하고, 프로그래밍 방식으로 파일 이름들을 불러와 convmv로 실행하면 정상 작동하는 것 같습니다.

  13. mac초보 2021.01.29 16:37

    뭔가가 될듯한데
    사실 맥이 너무 어렵습니다.

    위에 있는 대로 따라서 하고는 싶은데 터미널은 너무 어렵고 오토메이터들어가봐도 잘 모르겠고

    위 설치 파일을 공유해 주실수 없는지요?

    • BlogIcon 친절한 콜홍 2021.02.09 08:12 신고

      제가 2탄에서는 오토메이터를 공유해드렸지만 1탄에서는 그러지 않았습니다.
      그 이유는 아래와 같습니다.

      1. 터미널에서 설치하는 프로그램에 의존합니다. 따라서 터미널을 직접 수행하지 않는다면 오토메이터는 실행되지 않습니다.

      2. 개발자가 아니라면 대부분 터미널이나 오토메이터는 낯선 기능입니다.
      대부분 독자분들이 해당 기능을 처음 접해보는 것입니다. 그래서 어떤 기능인지를 알아야 하고, 어떻게 수정하는지를 알아야 합니다.
      그런 것들은 약간의 설명이 덧붙여진 무작정 따라하기 방법으로 충분히 전달할 수 있습니다.


      그래서 1탄은 첨부파일 업이 작성한 것입니다. 이 점 참고하셔서 차근차근 다시 따라해보시길 바랍니다.

  14. DongHyun 2021.03.17 13:44

    k

  15. lee 2021.03.20 16:22

    안녕하세요 좋은 글 감사합니다. 글을 보고 그대로 따라해봤는데 커맨드 실행 시에 '=: line 8: convmv: command not found' 오류가 발생합니다. brew 이용해서 convmv 설치했고 계속해서 저 오류가 발생해서 reinstall까지 진행했는데 설치 후에 추가적인 설정이 필요한건가요? 참고로 m1 맥북 사용중인데 이 문제와 연관은 없을지 궁금합니다. 감사합니다

    • BlogIcon lee 2021.03.20 16:24

      참고로 터미널에서 convmv 입력 시 문제 없이 동작합니다

    • BlogIcon 친절한 콜홍 2021.03.20 16:33 신고

      convmv 대신 /usr/local/bin/convmv로 써보세요.
      또는 오토메이터에서 Run Shell Script 부분에 Shell을 선택하는 부분이 있습니다. 거기서 zsh을 선택 해보세요. 이미 zsh일 경우 bash로 바꿔보세요.

  16. 감사합니다 2021.03.24 16:26

    파일만 지정했을때는 파일명까지 경로로 받아서 not found 가 떨어지네요
    폴더만 가능한걸로 보여집니다.
    예를들어
    /users/Desktop/테스트.docx 를 자소분리수정 워크플로우 실행하면

    not found --
    /users/Desktop/테스트.docx/*
    이렇게 에러가 나네요.

    • BlogIcon 친절한 콜홍 2021.03.24 16:37 신고

      수정 했습니다!
      변수를 저장하고는 다른 변수를 사용해서 발생했던 문제입니다.

    • BlogIcon 감사합니다 2021.03.24 16:53

      빠른답변 감사합니다.
      와우....엄청빠르시네요....
      잘쓰겠습니다!!!

  17. 상원 2021.04.28 17:03

    안녕하세요, 전 텍스트파일이 아니라
    긁어낸 텍스트를 변환하고 싶어서
    여러모로 해보는데 잘 안되네요 ㅜㅜ

    제 업무가 지금처럼 덧글로 파일경로를 공유해야하는데
    MAC경로와 윈도우 경로의 구조가 달라서, 그 부분은 path converter(구글 크롭 앱)으로 해결하고 있지만,
    한글 폴더명같은 경우는 유니코드가 그대로라 애를 먹고있어요.

    그래서 오토메이터로 서비스를 만들어서, 긁어낸 텍스트 전체의 유니코드방식을 바꾸려고 하는데요


    automator에서 수신하는 작업흐름을 텍스트로 지정하고
    input as string 으로

    변환하고 싶은데..
    제가 코드를 잘 몰라서요,,,
    applescript 실행으로
    _______________________________
    on run {input, parameters}
    return iconv -f UTF-8-MAC -t UTF-8 (input as string)


    end run
    _______________________________

    구분까지는 넣었는데...

    $f는 어떤역할을 하는지, input as string 을 변환시키려면 어떻게해야하는지를 정말 구글링을 2시간 해도 못찾겠어요..
    쉘스크립트를 쓰려고 해도, "input as string"의 역할을 하는게 뭔지 모르겠고요...

    도와주시면 감사하겠습니다 ㅜㅜㅜ

    • BlogIcon 친절한 콜홍 2021.05.21 10:42 신고

      안녕하세요?

      convmv는 본문에 말했던 것처럼 파일 이름을 바꾸는 프로그램입니다.

      텍스트의 인코딩을 바꾸려 하신다면 2편을 참고하셔서 인코딩을 변경하시는 것을 추천합니다.

  18. 감사합니다. 2021.05.20 09:37

    지난번에 폴더만 가능하다고 답변달았던 사람인데요
    이번에 또 뭔가 바꼈는지
    파일을 자소분리수정 실행하면 해당파일을 찾지못하네요.
    os 패치때무인건가..

    • BlogIcon 친절한 콜홍 2021.05.21 11:49 신고

      이번에 다시 해보니 또 안되네요...

      일단 코드를 원래대로 되돌렸습니다.
      그랬더니 잘 되구요.

      지난번에 수정했던 코드가 버그를 우회할 수 있는 코드였고, 조금 말이 안되는 코드였어서 원래대로 되돌렸습니다.
      거의 1년째 문제가 해결되지 않아 수정했던건데, 이젠 문제가 해결 된 것 같습니다.

      convmv 2.05(오늘 최신버전), macOS 11.3.1에서 정상 실행 됩니다.

    • BlogIcon 감사합니다 2021.05.24 09:42

      감사합니다!!

  19. Youjin 2021.07.04 20:33

    안녕하세요 ㅠㅠ

    ‘셸 스크립트 실행’ 동작에 오류가 발생함: ‘-: line 1: /usr/local/bin/convmv: No such file or directory’

    자꾸 이 에러가 뜹니다. M1 입니다.

    • BlogIcon 친절한 콜홍 2021.07.04 21:46 신고

      제가 M1은 안 써봐서 잘 모르겠습니다.

      우선은 /usr/local/bin/convmv를 그냥 convmv로 바꿔보세요.

      그래서 해결이 안된다면 brew에서 convmv를 설치할 때 나오는 메시지를 잘 읽어보면 convmv가 설치되는 위치가 나올겁니다.
      그 위치를 /usr/local/bin/convmv 대신 바꿔보세요

  20. 민중택배 2021.07.20 05:28

    윈도우가 호환성이 떨어져서의 문제 보다는
    MacOS 는 국내 한글 표기 표준에 협조적이지 않다로 보아야할 것 같습니다

    https://ko.wikipedia.org/wiki/KS_X_1026-1

    현대한글의 경우 "한글 완성자"를 요구합니다.
    이 현상과 같은 혼란을 줄이기 위한 규정입니다.
    따라서 MacOS는 "정보교환용"의 목적으로
    외부에 데이터를 전송하거나 공유해야 할 때는
    "한글 완성자" 형태로 바꾸어서 전달할 수 있어야 합니다.

  21. 최진생 2021.07.30 11:05

    ^^

Windows 10 설치 USB 쉽게 만들기

2019. 7. 12. 14:41

UEFI 바이오스에서 윈도 설치 디스크 만들기가 굉장히 쉬워졌다. 그러나 여전히 rufus와 같은 유틸리티를 사용하여 복잡하게 만드는 것이 일반적이다.

이 글에서는 다른 프로그램 없이 바로 부팅 가능한 윈도 설치 USB를 만들어보기로 한다. 방법이 굉장히 간단하기 때문에 본문도 굉장히 짧다.

그래서 서론으로 UEFI는 어떤 특징이 있는지 알아보고, 윈도 설치 ISO를 다운로드하는 방법을 알아본다.

그리고 본문으로 UEFI의 특징을 살려 윈도우 설치 디스크를 만드는 방법을 알아보고자 한다.

UEFI

UEFI의 가장 큰 특징은 기존의 BIOS 시스템에 비해 더 큰 시스템이라는 것이다.

옛날의 BIOS는 기본적인 설정과, POST(Power On Self Test)기능만 제공한다.

하지만 UEFI는 좀 더 많은 기능을 제공한다. 기본 설정과 POST 뿐 아니라, 커서 기능, GUI기능, 빠른 부팅, CLI를 제공한다. 빠른 부팅은 POST 결과를 저장해서 다음에는 POST 단계를 줄이는 기능이다. CLI는 BIOS 단계에서 명령을 실행할 수 있는 환경을 제공한다는 의미이다.

여기서 중요한 게 CLI이다. CLI로 명령을 실행하려면 BIOS가 외부 저장장치에 엑세스 할 수 있어야 한다.
UEFI가 외부 저장장치에 엑세스 할 수 있다는 또 다른 증거가 있다. UEFI는 설정 화면의 스크린샷을 연결된 USB 메모리에 저장할 수 있다는 것이다..

그리고 이런 기능의 지원을 위해 UEFI 바이오스는 FAT32 포맷의 외부 저장장치에 접근할 수 있다.

UEFI 설정 스크린샷

출처 : forum.asrock.com

UEFI는 스크린샷 단축키를 클릭하면 연결되어 있는 FAT32 장치에 스크린샷을 저장한다.

그 외에 여러가지 포맷을 읽을 수 있는 것으로 알고 있지만, 모든 OS에서 사용할 수 있는 포맷은 FAT32와 exFAT 뿐이기 때문에 이 튜토리얼은 FAT32로 진행한다.

FAT32로 윈도우 설치 USB 만들기

우리는 UEFI가 FAT32를 읽고 쓸 수 있고, 윈도우가 FAT32를 읽고 쓸 수 있으며, 윈도우가 ISO파일을 열 수 있다는 것을 알고 있다.

그러면 윈도우 설치 디스크를 만들기는 굉장히 쉽다.
ISO파일을 열고 그 파일을 FAT32 장치에 쓰기 작업을 하면 된다.

ISO 파일 다운로드 하기

MS의 공식 홈페이지에서 다운로드 할 수 있다. 다만, 윈도우에서 접속할 때와 다른 기기에서 접속할 때의 방법이 조금 다르다.

윈도우에서 접속하면 ISO 링크를 주지 않고, 윈도우에서 실행하는 다운로더를 주기 때문이다. 만약 다운로더를 사용하고 싶지 않다면 UA를 변경하면 된다.

프로그램 이용

다운로드 링크 : https://www.microsoft.com/ko-kr/software-download/windows10

다운로드 안내 페이지

위와 같은 사이트가 나타난다. 우리는 컴퓨터를 업데이트 할 것이 아니라, ISO를 만들 것이기 때문에 '지금 도구 다운로드'를 클릭한다. 'MediaCreationTool'이 다운로드 된다.

약관을 반드시 읽어보아야 한다.

프로그램을 실행하고 프로그램 사용권을 자세히 읽은 후 동의한다면 동의 버튼을 눌러 진행한다.

공식 문서이든, 블로그 문서이든, 수많은 튜토리얼을 보면 대부분 게시물들이 위와 같은 약관이나 사용 조건에 대한 동의 화면이 나오면 무조건 동의 버튼을 누르라고 하고 있다.
물론 대부분의 약관은 사용자를 방해하거나 목을 조르려는 용도로 만들지는 않지만, 반드시 읽어보도록 안내 해주었으면 하는 바람이 있다.
이 약관은, 프로그램 제조사와 사용자 사이의 법적으로 유효한 '계약'이며, 소비자의 보호, 제조사의 보호 또는 분쟁시 분쟁 중재를 위한 내용이다.

다운로드 과정

'다른 PC용 설치 미디어 만들기' 를 클릭하고 다음을 누른다.

다운로드 과정

어와 아키텍처를 선택하고 다음을 누른다. 에디션은 통합본으로 나오기 때문에 한 종류 뿐이다. 아키텍처는 Windows 8이나 그 이후 버전이 설치되어 출시된 컴퓨터라면 64비트를 선택하면 된다.

다운로드 과정

ISO 파일을 만들 것이기 때문에 'ISO 파일'을 선택하고 다음을 클릭한다.

USB 플래시 드라이브를 선택하더라도 FAT32로 포맷한다. 따라서 'USB 플래시 드라이브'를 선택하고 진행해도 결과는 같다.
단지 이 튜토리얼은 FAT32로 포맷하는 것이 얼마나 편리한지를 보여주기 위한 것이기 때문에 'ISO 파일'로 진행한다.

파일 위치 선택 대화상자가 나타나면 다운로드할 위치를 설정한다.

다운로드 중

다운로드 중

그러면 다운로드가 시작되고, 미디어를 만드는 작업을 한다.

다운로드 완료

ISO 만들기가 완료됐다. DVD 버너를 사용할 것이 아니기 때문에 '마침'을 눌러 종료한다.

ISO 파일 열기 단계로 넘어가면 된다.

ISO 다운로드 링크 이용

다운로드 링크 : https://www.microsoft.com/ko-kr/software-download/windows10ISO

원하는 윈도우 버전을 선택하고 다운로드 한다.

Windows가 아닌 OS에서 접속할 때 나타나는 ISO 다운로드 페이지

ISO 파일 USB 드라이브로 복사하기

ISO 파일 미리보기

다운로드한 Windows.iso 파일을 실행하면 위와 같은 파일들이 보인다. 이 파일들 모두 FAT32로 포맷된 USB 드라이브에 복사하면 된다.

미립자팁

마지막으로, FAT32의 장점을 활용하는 방법이다. 같은 파일 시스템 안에서는 파일을 이동하는데 걸리는 시간이 굉장히 짧다. 그래서 하나의 USB 안에 여러가지 에디션들을 넣어놓고 필요한 버전을 USB 메모리의 최상단으로 꺼내면 해당 에디션을 설치할 수 있게 된다.

설치 디스크로 부팅하기

윈도우에서 바로 진입

앞서 언급했다시피, UEFI는 빠른 부팅을 지원한다. 빠른 부팅을 할 경우 다른 불필요한 장치에 대해 POST를 진행하지 않는다. 따라서 윈도우 설치 USB 디스크를 삽입하더라도 USB는 확인하지 않고 바로 윈도우로 부팅될 수 있다.

이런 경우에 대비하여 윈도에서 직접 부팅 장치를 선택하거나, UEFI 설정에 진입할 수 있는 방법을 제공한다.

시작 -> 전원 -> (Shift 버튼을 누른 상태로) 다시 시작을 누른다

Use a device를 클릭해서 Windows 설치 디스크를 선택한다.

UEFI 설정에서 부팅 순서 변경

제조사마다 다르므로 제조사 문서를 참고해야 한다. 보통은 부팅 우선순위, Boot Priorities와 같은 표현을 사용한다.

2장-2 변수의 크기와 오버플로우, 언더플로우

2019. 5. 5. 22:01

크흠.... 기존 학교에서 배운 것들을 티스토리에 요약하고, 컴퓨터에서 삭제하려는 목적으로 '컴퓨터공학' 카테고리를 만들었습니다.

그런데 이렇게 3년이 흘러버리니 1학년 때 적어둔 것들이 어떤 순서로 필기된건지 모르겠더군요. 순서가 뒤죽박죽이어서 후에 배울 것들을 앞 장에서 응용하고 있다 보니 게시글의 순서가 뒤죽박죽이 되어 버렸습니다.

티스토리의 경우 게시된 날짜를 기준으로 정렬되는 듯하여 모든 정리가 끝나면 다시 한번 순서를 조절하도록 하겠습니다.

변수의 크기 알아보기

우선 이전 장([컴퓨터공학/C] : 2장-1 자료형)에서 각 자료형이 몇 Bytes의 크기인지 배웠습니다. 실제로 프로그래밍을 할 때 변수들의 크기가 중요합니다. 뒤에 배우게 될 구조체도 크기를 아는 것이 중요합니다.

간단한 정수형이나 실수형 변수의 크기는 외울 수 있다고 하더라도 프로그래머가 직접 구현하는 구조체의 크기까지 외울 수 있을까요? 아마 불가능할겁니다.

그래서 sizeof();연산자가 있습니다.

이 연산자는 함수가 아닙니다. 연산자입니다. 왜냐하면 프로그램이 실행될 때 sizeof();를 실행해서 크기를 계산하는 게 아니고, 프로그램을 컴파일 할 때 컴파일러가 size를 계산해서 상수로 바꿉니다. 그러니까 크기를 외워서 크기를 입력하는 것과 sizeof(); 연산자를 사용하는 것은 성능상에 차이가 없다는 의미입니다.
상수가 뭔지도 추후에 배울 예정입니다. 상수는 코드를 읽기 쉬우면서 프로그램은 가볍게 만들기에 유리합니다.

#include <stdio.h>
void main(){
    char x;
    float y;

    printf("변수 x의 크기  %d\n", sizeof(x));        //<- printf("변수 x의 크기 %d\n", 1); 과 성능 차이 전혀 없음
    printf("변수 y의 크기 %d\n", sizeof(y));
    printf("double의 크기%d\n", sizeof(double));
}

이런 식으로 활용하게 됩니다. sizeof();는 연산자가 아니기 때문에 파라미터의 형식도 상관 없고, 그게 심지어는 자료형이라도 작동합니다.

오버플로우(OverFlow)와 언더플로우(UnderFlow)

변수의 크기를 알 필요가 있는 가장 큰 이유입니다. 제대로 말하자면 조금 다릅니다. 정확한 표현으로는 오버플로우와 sizeof()를 자주 사용해야 하는 이유가 같습니다.

Overflow란, 직역 의미 그대로 넘쳐 흐른다는 의미입니다. 변수의 크기가 너무 커서 변수의 공간 안에 저장할 수 없는 경우이죠. Underflow는 반대의 의미입니다. 너무 작아서 변수의 공간 안에 담을 수 없는 경우입니다.
2장-1에서 배우기로 char형은 1 Byte 크기를 가지고 있고 -128~127의 범위를 갖고 있습니다. 그리고 1 Byte는 8 bits로 구성되어 있습니다.
만약 127을 char형 변수에 저장한다면 실제로는 0111 1111로 저장됩니다. 그리고 여기에 1을 더하면 1000 0000이 되죠. 그 값은 - 128입니다. 이런 것을 Overflow라 합니다. 반대로 -128에서 1을 빼면 127이 되는 현상을 Underflow라고 합니다.

그런데 궁금한게 있습니다! 이전 장에서도 변수의 범위까지는 언급을 했지만 왜 1000 0000이 -127이 되는지는 말하지 않았습니다. 상식적으로 맨 앞이 부호를 표시한다면 1111 1111이 -128이 되어야 하지 않을까요?
컴퓨터는 구조상 뺄셈 연산을 하지 못합니다. 구조를 단순화 하기 위해, 뺄셈은 음수를 더하는 연산을 하죠. 그래서 음수의 표현보다는 음수의 연산에 초점을 맞춰서 개발한 표현방식입니다. 이런 음수의 표현을 '2의 보수'라고 합니다.

127과 -127를 더하면 그 값은 0이 됩니다. 사람이 생각하는 대로 표현했다면 0111 1111 + 1111 1111은 1 0111 1110이라는 이상한 숫자가 나옵니다. 8 Bits 공간을 가지고 있기 때문에 Overflow는 버리고 0111 1110이 됩니다.

하지만 2의 보수를 만들어주면 덧셈이 쉬워집니다. 2의 보수는 양수에서 각 자릿수마다 ~(NOT)연산을 하고 1을 더한다고 보면 됩니다. 그러니까 0111 1111의 2의 보수를 만들면 1000 0001이 -127이 됩니다. 두 수를 덧셈 연산하면 1 0000 0000이 되죠. 위에서와 같이 Overflow를 버리면 0이 됩니다!

변수의 최댓값과 최솟값

변수의 크기는 알았는데, 그럼에도 최댓값과 최솟값은 알아야 Overflow를 방지할 수 있는것 아닌가요? 그래서 몇몇 변수에 대해서 최댓값과 최솟값을 미리 정의해둔 헤더가 있습니다. limits.h인데요, 여기서 CHAR_MIN, CHAR_MAX, UINT_MIN, UINT_MAX 등의 표현으로 정의되어 있습니다. 바로 사용해볼까요?

#include<stdio.h>
#include<limits.h>

void main(){
    char x = CHAR_MAX;
    printf("MAX of CHAR : %d \n", x);
    char y= x+ 1;
    printf("Overflow : %d \n", y);
    printf("127+(-128)  = %d\n", x+y);                 //출력은 -1이 됩니다.
}

이런 식으로 사용할 수 있는겁니다. char의 최댓값을 저장하면 127이 됩니다. 그리고 Overflow된 값(-128)을 y에 저장합니다. 그리고 이 두 수를 더하면 -1이 됩니다.

요약

  • 변수의 크기를 알 수 있다.
  • 오버플로와 언더플로를 이해할 수 있다.
  • 2의 보수를 이해하고, 음수와의 연산에서 오버플로와 언더플로를 활용하는 것을 알 수 있다.
  • 변수의 최댓값과 최솟값이 정의된 헤더를 불러올 수 있다.

변수의 크기를 알아야 하는 이유?

마지막으로 한 가지 더!

오버플로를 설명하면서 변수의 크기를 알아야 하는 이유라고 언급했습니다. 하지만 아무리 생각해봐도 관련성이 없어보입니다. 나중에 배열, 포인터나 주소의 개념을 갖고 나면 이해가 될 부분입니다. C언어는 LowLevel언어이기 때문에 메모리 주소에 직접 접근할 수 있습니다. 그만큼 프로그램이 빠르지만 프로그래머가 메모리를 고려해야 하는 단점이 있습니다.

예를 들어서 char형의 변수가 5개로 구성된 배열 name이 있습니다. 이 변수는 1 Byte 변수가 5개가 있는 것이고, 총 5 Bytes로 구성됩니다. name의 주소가 0x0020이라고 하면, 첫번째 칸은 0x0020이고, 다섯번째 칸은 0x0025가 됩니다.
그런데 프로그래머가 6번째 배열에 접근하려고 하면 C언어는 0x0026에 접근합니다. name을 통해 접근할 수 있는 주소의 범위는 0x0020~0x0025까지인데, 이에 상관없이 0x0026에 접근하는 겁니다. 물론 이런 비정상적인 접근은 OS에서 차단하고 프로그램을 강제 종료합니다. 계속 실행되면 다른 프로그램의 정보를 탈취할 수 있기 때문에 아예 종료해버리는 겁니다.

출처 : reddit.com
그 결과가 이겁니다. 옛날에는 시도 때도 없이 보던 겁니다. 수 년이 지나면서도, Windows가 업데이트 되고 업그레이드 되면서도 꾸준히 보던 경고입니다. 지금 보니 메모리 접근을 고려하는게 얼마나 어려운지 아시겠죠?

물론 다른 고급 언어들도 비슷합니다. 객체 지향 언어들도 배열은 같거든요. 하지만 대부분은 객체를 사용합니다. 그리고 그 객체는 리스트(배열 개념을 객체로 표현한 것이다. C언어는 Linked List(연결리스트)로 구현할 수 있다.)와 리스트의 갯수까지 갖고 있기 때문에 프로그래머는 마지막 변수가 필요할 때, 리스트의 크기를 가져오면 됩니다.

리스트의 개념은 C언어에서도 구조체를 이용해 연결리스트로 표현이 가능합니다. 단지 구현 방법이 좀 다를 뿐이죠. 이는 후에 배열, 포인터 부분에서 학습하게 됩니다.

다음에는 진수의 표현에 대해서 올리도록 하겠습니다.

'컴퓨터공학 > C' 카테고리의 다른 글

2장-2 변수의 크기와 오버플로우, 언더플로우  (0) 2019.05.05
4장-2 비트 연산과 연산 순서  (0) 2019.01.14
4장-1 산술 연산자  (0) 2019.01.14
3장 printf scanf 함수  (0) 2019.01.10
2장-1 자료형  (0) 2019.01.10
1장-1 Hello World  (0) 2018.12.16

+ Recent posts