2) 이진화 JAVA

사람은 보통 숫자를 처리할때 10진법으로 처리한다. 그러나 컴퓨터는 2진법으로 이것을 처리한다. 그러기 위해 사람이 쓰는 숫자를 2진수로 변환을 한 다음에 표기(or 저장)을 하여야 한다. 이를 위해 알아야 할 것이 크게 세 가지 인데 이에 대해 이 글에서 쓰도록 하겠다.

1. 10진수 -> 2진수 변환.
10진수의 숫자를 2진수로 나눈 나머지들+맨 마지막 몫만 모으면 된다. 다시 10진수로 변환할 때에는 1로 표시된 자리수만 2의 n승으로 바꿔서 더해주면 된다. 예시는 아래 그림을 참고하면 된다.


음수 같은 경우는 완성된 2진수를 반대로 표시한 다음 그 결과에 1을 더한다.


2. 소수 -> 2진 소수 변환.
소수점 앞자리는 정수를 바꾸듯이 하고, 소수점 뒷자리는 끝이 0이 될때까지 계속 2을 곱해서 나온 정수부(소수점 앞자리)만 떼어서 붙여나가면 된다.



3. 2진 소수 -> 부동 소수
2진 소수로 변환한 2진법을 n * 2의n승 형태로 바꿔주면 된다.
3.625는 1.0101 * 2의1승 으로 표현 할 수 있다. 그런데 이 때 n승으로 곱셈을 얼마나 밀 건지 약속을 정해야 하는데 이는 IEEE754에서 정해져 있다.  이 때 n.0101은 가수부 n승은 지수부라고 한다. 가수의 정수부는 버리는데 지수부를 통해서 추측이 가능하므로 버린다.

여기서의 지수부는 1, 가수부는 0101이 된다.


4. 비트 채우기
IEEE754 에서는 소수의 형태를 확정 지어 놓았는데, 그 방안은 하기와 같다. (그냥 약속이니 외워라...)
윗 줄은 float 형이고 부호를 나타내는 1비트(정수는 0), 지수부를 나타내는 8비트(126까지), 가수부를 나타내는 23비트로 구성되어 있다. 밑은 double 형이고 부호를 나타내는 1비트(정수는 0), 지수부를 나타내는 11비트(1022까지), 가수부를 나타내는 52비트로 구성되어 있다.
 
이 때 3.625 (1.0101)의 경우는 float형으로도 커버 가능한 범위 이므로 이를 비트를 채워서 표현하면 아래와 같아진다.
[0] / [00000001] / [00000000 00000000 00000101]




5. 표현 가능 최대값
이 글을 쓰게 된 원인인 최대값이 어떻게 저렇게 나오는 가에 대한 답을 내려보자. 위의 비트채우기의 원리 대로 최대로 채울 수 있는 float형의 소수를 비트로 표현하게 되면 하기와 같다.
[0] / [11111110] / [11111111 11111111 11111111] -> (양수) ????? * 2의254승
[1] / [11111110] / [11111111 11111111 11111111] -> (음수) ????? * 2의254승

이를 10진법으로 바꾸면 (양,음수)3.4028235 * 10의38승 가 된다.  가끔 보면 1.4~~ 하면서 쓰는데 이건 가장 미세한 값 기준으로 쓴 것이다.

1) 자료형, 접근 제한자 JAVA

본 글은 기본적인 OOP 및 javascript(es5 이상)을 습득한 기준으로 작성하는 글이다.

자료형
자바스크립트는 명시적인 자료형이 없다. (자료형이 없진 않다. 진짜 자료형이 없다면 typescript 처럼 쓰기는 어렵겠지.) 형변환을 할 때나 쓰기 때문에 잊어버릴 뿐.

그러나 java에는 메모리를 효율적으로 활용하기 위해 미리 변수별로 공간을 제한해 놓는데 이걸 자료의 형태별로 구분한다. 종류는 총 8가지가 있다. 컴퓨터는 이진데이터를 활용하므로 데이터가 가질 수 있는 범위 또한 이진법으로 외워두면 편하다.


1. boolean - 2의1승
논리형으로써 true,false를 나타낸다.

2. char - 2의16승
문자형으로써 유니코드로 65535에 해당하는 한 문자를 나타낸다.

3. bite - 2의8승
정수형으로써 -2의8승 ~ 2의8승 -1  까지 커버한다.

4. short - 2의16승
정수형으로써 -2의16승 ~ 2의16승 -1  까지 커버한다.

5. int - 2의32승
정수형으로써 -2의32승 ~ 2의32승 -1  까지 커버한다.

6. long - 2의64승
정수형으로써 -2의64승 ~ 2의64승 -1  까지 커버한다.

7. float - 2의32승
실수형으로써 10진법 숫자를 이진기수로 변환 후 2의32승 까지 곱한 값을 커버한다.

8. double - 2의64승
실수형으로써 10진법 숫자를 이진기수로 변환 후 2의64승 까지 곱한 값을 커버한다.

(7,8번의 경우 다음 글인 '이진화' 에서 자세히 다뤄보도록 하겠다)


접근제한자
SOLID 중 O인 개방 - 폐쇄 원칙에 의거 분리시키고자 할 때가 있는데 이 때 사용하는 것이 접근제한자 이다

1. public
모든 경우에 접근이 가능하다.
2. default
같은 패키지 안에서 접근 가능
3. protected
현재 및 자식(상속관계)에서만 접근 가능
4. private
현재 객체에서만 접근 가능




접근성이란, 웹 접근성 지침 접근성

접근성이랑, 장애인과 비장애인이 동등하게 정보를 습특할수 있도록 하는 것이다. 우리 나라 에서는 이걸 별도의 지침을 만들어 좀 더 기술적으로 명확하게 대처하고 있다. 이는 장차법(장애인 차별금지 및 권리구제 등에 대한 법률) 등에 근거를 두고 있다.

다만 잘 간과하는 것이 있는데, 장애인 만을 위한 서비스는 아닌 것이 "특수한 환경에 의해 수행방식이 제한되는 경우" 또한 이에 포함되기 때문에 특정 입력기기에 종속된 서비스를 만들지 말아야 한다. (예를 들어 마우스가 고장났다고 해보자 ;;)

이 지침은 총 4개의 원칙(간단하게 원리라고 하자), 13개의 지침(원칙을 구현하는 방법), 24개의 검사 항목으로 구성되어 있다. 이 글은 이 내용 이외에 한가지 나중에 추가될지도 모르는 항목에 대해 같이 쓰기도 하고 한번에 설명이 가능한 항목에 대해서는 요약해서 기술하도록 한다.

원칙을 기준으로 내용을 분석해 보도록 하자. 그리고 몇 가지 용어 또한 알고 있어야 하는데, 간단하게 '스크린 리더'가 무엇이고 어떻게 쓰이는 건지는 알고 보는게 좋다.

1. 인식의 용이성 (perceivable)
사용자가 장애 유무 등에 관계 없이 모든 컨텐츠의 내용을 파악할 수 있도록 하는 것.

지침 검사항목
대체 텍스트텍스트가 아닌 콘텐츠에는 그 의미를 알 수 있도록 대체 텍스트를 제공해야 한다. (스크린리더 사용자를 위한 배려)
멀티미디어 대체 수단영상, 음성 콘텐츠 에는 자막 또는 수화 등을 사용하여야 한다 (청각장애인 배려)
명료성색에 관련없이 콘텐츠의 의미를 식별할 수 있어야 한다 (색맹, 색약)
명료성지시사항은 모양,크기,위치,방향,색,소리 등에 관계없이 인식이 가능해야 한다 (시각,청각장애인 배려 특정 감각이 없을때 지시사항을 파악을 못하는걸 방지)
명료성콘텐츠와 배경의 명도는 최소 4.5 : 1 이어야 한다.
명료성자동으로 소리가 재생되지 않아야 한다. (스크린리더에 방해됨)
명료성이웃한 콘텐츠는 구별할 수 있어야 한다. (저시력장애인 배려)

이를 지키지 않은 코딩 예시 (대체텍스트, 멀티미디어)

1
2
3
4
5
6
<body>
<img src="bear.jpg" />
<video width="320" height="240" controls>
<source src="movie.mp4" type="video/mp4">
</video>
</body>

2번 라인에는 alt 등을 통한 대체텍스트가 필요하고 video는 자막을 track라는 하위 태그를 통해 구현할 수 있다.


2. 운용의 용이성 (operable)
사용자가 장애 유무 등에 관계 없이 모든 기능을 사용할 수 있어야 한다. 예를 들어 키보드로만 사용시에 불편점이 있으면 이를 어긴걸로 볼 수 있다.

지침 검사항목
입력장치 접근성모든 기능은 키보드만으로도 사용할 수 있어야 한다.
입력장치 접근성키보드에 의한 초점은 논리적으로 이동해야 하며 (다음 초점이 어디로 갈지 예측이 되어야 하며) 시각적으로도 구별이 되어야 한다.
입력장치 접근성사용자 입력 및 컨트롤은 조작 가능하도록 제공되어야 한다. (임의로 disable 한것이 아니라면 다 편집이 잘 되어야 한다.)
충분한 시간 제공시간제한이 있는 콘텐츠는 응답시간 조절이 가능해야 한다. (운동장애가 있는 장애인을 배려)
충분한 시간 제공자동으로 변경되는 콘텐츠는 움직임을 제어할 수 있어야 한다. (스크린리더 사용에 방해됨)
광과민성 발작 예방너무 번쩍거리는 콘텐츠를 제공하지 않아야 한다. (초당 3~50회, 간질 등의 기저질환자 배려)
쉬운 내비게이션콘텐츠의 반복되는 영역은 건너뛸 수 있어야 한다. (키보드 사용자 배려)

쉬운 내비게이션페이지의 영역별로 영역이 무엇을 의미하는지 적절한 제목을 사용하여야 한다.

쉬운 내비게이션링크 텍스트는 용도나 목적을 이해할수 있도록 제공해야 한다.



3. 이해의 용이성 (understandable)
사용자가 장애 유무 등에 관계 없이 콘텐츠의 내용을 이해할 수 있어야 한다. 

지침 검사항목
가독성주로 사용하는 언어를 명시해야 한다. (이래야 스크린리더에서 언어권에 맞는 보이스엔진을 사용한다)
예측 가능성사용자가 의도하지 않은 기능은 실행되지 않아야 한다.
콘텐츠의 논리성
콘텐츠는 논리적인 순서로 이동되어야 한다. (예축 가능하도록)
콘텐츠의 논리성표는 이해하기 쉽게 구성해야 한다.
입력 도움사용자의 입력에 대응하는 레이블이 있어야 한다, (라벨버튼? 클릭시 입력 폼등에 포커스 - 등록용)
입력 도움사용자의 입력에 대응하는 레이블이 있어야 한다 (라벨버튼? 클릭시 입력 폼등에 포커스 - 수정용)


3. 견고성 (robust)
사용자가 콘텐츠를 이용할 수 있도록 기술에 영향을 받지 말아야 한다. (에러 안나면 된다.)

지침 검사항목
문법 준수마크업 요소 등의 언어레벨
웹 어플리케이션모든 콘텐츠들이 규칙들을 다 준수하고 있어야 한다.



직선그래프와 1차함수 프로그래밍 상식

일단, 그래프를 나타내기 위해서는 다음과 같은 상황으로 상정해야 한다. svg의 line 태그처럼 생각하는게 좋을 것이다. 시작점을 ⓐ, 끝점을 ⓑ 라고 하자.

중학교때 배웠던 1차 함수를 기억하는가? 모르면 수학방 가서 배우고 오는 것이 좋을 것이다. (링크) 간단하게 어느정도 기억하고 있는 사람을 위해 바로 적자면 식은 아래와 같이 나올 것이다.

y = ax; (y의 시작점을 0이라 보았을 때)
y = ax + b; (y의 시작점을 b라 보았을 때)

여기서 a는 기울기 이고, 이 기울기를 구하는 공식은 (y의 증가량) / (x의 증가량 이다).
이는 곧 (ⓑ의 y - ⓐ의 y) / (ⓑ의 x - ⓐ의 x)를 의미 하겠지.

기울기가 존재하는 사선의 경우는 위의 공식을 바로 적용하면 된다. 이를 이용해 각 path가 어느 지점을 지나치는지 알 수 있다.

그러나, 수평 수직과 같은 기울기가 0인 경우는 어떻게 생각해야 할까? (본인은 이것때문에 한참을 고생했다 -_-)
밑의 그림을 통해 기본 아이디어를 잡아두고 가자.



왼쪽의 빨간 박스가 y 축에 붙어 있는 직선이고 오른쪽의 파란 박스가 그 직선을 필요한 N만큼 이동한 것이다. 즉, 이걸 거꾸로 생각하면 직선또한 그리게 할 수가 있다.

프로그래밍으로 하면 y를 시작점부터 끝점까지 반복문을 돌게 하면서 그동안 x는 내가 원하는 위치로 고정 시켜 놓으면 된다. 수평의 경우도 마찬가지로 계산할 수 있겠지. 

이걸 공식으로는 
x1 - x2 = 0 일때 x는 x1 뭐 이렇게 하는데 이것보다는 모든 y에서 x의 위치는 시작점과 같다 이런식으로 외우는게 더 나을 것이다.


나중에 좀 더 수학 공부해서 다각형에다가 라디안 회전했을때 쓰는 삼각함수에 대해서도 포스팅해야지.


Docker 도커란? 프로그래밍 상식

1.도커란?
서버 배포관리 어플리케이션이다. 이전에 사용하던 방법은 서버 하나 설치할 때마다 사람이 수동으로 tar 등을 올렸다가 풀어주면서, DB 정보 등의 접속정도를 직접 올려놓는 것이었다. 이 방식의 단점은 한 사람이 여러 서버를 관리할 때 그 종속성을 깔끔하게 관리하리 어렵다는 것이며 이는 유지보수가 어렵다는 걸 의미한다.

도커를 사용하면 모든 의존관계를 '이미지'로써 저장할 수 있기 때문에 관리가 훨씬 더 용이하다 ^^*

2. 가상서버와 차이점.

가상서버는 물리적 서버가 가지고 있는 자원 위에 각자 사용할 OS를 설치해 두는 것이다. 이는 상대적으로 수많은 오버헤드(시스템 자원에의 접근 횟수 -  처리를 위해 필요한 시간 혹은 메모리)가 일어날 가능성이 다분하다. 그러나 도커의 경우에는 리눅스 기반의 단일 OS이지만, 각 환경변수 등의 확장(?)을 통해 마치 서로 다른 OS인 것처럼 쓸 수 있다.


3. 컨테이너와 이미지란?

이미지는 정적 리소스, 컨테이너는 이걸 기반으로 한 하나의 프로세스라고 볼 수 있다.

이 구성으로 인해 이미지만 외부에서 따로 관리하면서 각 컨테이너와 이미지와의 연관만 바꿔주면 서버 업데이트 또한 간단하게 할 수 있다.! 이미좌 컨테이너는 여러개 존재할 수도 있다.


4. 이미지 저장소
도커 이미지를 저장하기 위해 따로 보유할 수 있다. 사용법은 마치 git과 유사하며, 이미지의 변경사항이 있을 경우 전체적으로 저장하는게 아니라 변경부분만 따로 저장해 놓으므로 리소스 관리도 효율적이다.
또한 공식 저장소 가 있어 자주 사용할만한 세팅 등은 그곳에서 받아도 효율적이다. (https://hub.docker.com/)

1 2 3 4 5 6 7 8 9 10 다음