728x90

드림핵에서 공부하다가 헷갈려서 정리한다.

아래와 같이 레지스터와 메모리가 있고, Code1번을 실행한다고 할때 rax에 저장되는 값은 무엇일까?

[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2
=================================
[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A
==================================
[Code]
1: add rax, [rbx+rcx*8]

 

[풀이]

- 먼저 0x로 표현되는 것은 16진수이다.
- rcx는 0x2(16진수로 2)이고 여기에 8을 곱하게 되면 10진수로는 16이다.
- 10진수 16은 16진수로 10이다. (참고링크)
- rbx의 값은 0x555555554000이므로 여기에 0x10을 더하게 되면 0x555555554010이 된다.
- 위의 Memory표를 참고하였을때 0x555555554010의 값은 0x0000000000000003이다.
- 0x31337에 0x0000000000000003을 더하게 되면 0x000000000003133A가 된다. (16진수 이므로 9다음에는 A가된다.)
- 0x000000000003133A는 0x3133A이다.

728x90
728x90

리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분한다.

세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것인데, 크게
- 코드 세그먼트
- 데이터 세그먼트
- BSS 세그먼트
- 힙 세그먼트
- 스택 세그먼트
로 구분된다.

메모리에 대한 권한은 읽기, 쓰기, 실행이 존재한다.

 

/ 코드 세그먼트
- 실행 가능한 기계 코드가 위치하는 영역
- 텍스트 세그먼트(Text Segment)라고도 불린다.
- 읽기, 실행 권한이 부여되어있다.
- 쓰기 권한이 있다면 공격자가 악의적인 코드를 삽십하기가 쉬워지므로, 대부분의 현대 운영체제는 이 세그먼트에 쓰기 권한을 제거한다.
- 함수가 컴파일 되었을때 기계 코드로 변환되면 코드 세그먼트에 위치하게 된다.

/ 데이터 세그먼트
- 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치합니다.
- 읽기 권한이 부여된다. (CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로)
- 쓰기가 가능한 세그먼트와 쓰기가 불가능한 세그먼트로 분류된다.
- 쓰기가 가능한 세그먼트 :
    > data 세그먼트
    > 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다.
- 쓰기가 불가능한 세그먼트 : 
    > rodata(read-only data) 세그먼트
    > 값이 변하면 안되는 데이터들이 위치합니다.
    > 전역으로 선언된 상수가 여기에 포함된다.

/ BSS 세그먼트
- 컴파일 시점에 값이 정해지지 않은 전역변수가 위치하는 메모리 영역이다.
- 개발자가 선언만 하고 초기화하지 않은 전역변수 등이 포함된다.
- 프로그램이 시작될 때, 모두 0으로 값이 초기화된다.
- 이 세그먼트에는 읽기, 쓰기 권한이 부여된다.

/ 힙 세그먼트
- 힙 데이터가 위치하는 세그먼트이다.
- 스택과 마찬가지로 실행중에 동적으로 할당될 수 있다.
- 리눅스에서는 스택 세그먼트와 반대 방향으로 자란다고 표현한다.
- C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치하게 된다.
- 일반적으로 읽기,쓰기 권한이 부여된다.

/ 스택 세그먼트
- 프로세스의 스택이 위치하는 영역이다.
- 함수의 인자지역 변수와 같은 임시 변수들이 실행중에 여기에 저장된다.
- 스택 세그먼트는 스택 프레임(Stack frame)이라는 단위로 사용된다.
- 함수가 호출될 때 생성되고, 반환될 때 해제된다.
- 특정 프로세스가 얼마 만큼의 스택 프레임을 사용하게 될 지 미리 계산하는것은 일반적으로 불가능하므로
운영체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 이를 확장해준다.
- 스택이 확장될 때 기존 주소보다 낮은 주소로 확장되기 때문에 '아래로 자란다'라는 표현을 사용한다.
- 읽기, 쓰기 권한이 부여된다.

 

 

 

728x90
728x90

알고리즘 공부때문에 c를 다시 공부하고 있는데 비주얼 스튜디오에서 scanf가 에러라고 나온다.

검색을 해보니 비주얼 스튜디오에서만 나는 오류라고 한다.

해결 방법은 4가지가 있는데 그중 많이들 추천하는 방법은 파일 제일 최상단에
'#define _CRT_SECURE_NO_WARNINGS'을 넣어주는 것이다.

 

이외 
- scanf를 scanf_s로 고쳐쓰기 : 비주얼 스튜디오에서만 나는 에러라 굳이 코드를 바꿀필요는 없으므로 비추천한다고 함
- 파일 최상단에 '#pragma warning(disable:4996)'를 쓰기

- 상단 메뉴 중 '보기 > 속성 페이지(Shift+F4) > 왼쪽의 구성속성 > C/C++ > 일반 > 왼쪽 하단의 SDL 검사' 를 '아니요(/sdl-)'로 변경


어떤 방법으로 하든 뭐 해결만 되면 되지 않겠능가..

 

 

 

728x90
728x90

문득 컴퓨터에 설치된 프로그램들을 정리하고 싶을때가 있다.
오늘이 그랬다.
제어판에 들어가서 '프로그램 추가/제거'에 들어가 안쓰는 프로그램이 있는지 살펴보았는데 눈에 띄는 프로그램명이 하나있다.
'Microsoft Update Health Tools'

Microsoft Update Health Tools

Health? 건강 관련된 프로그램인가...? 뭐지..ㅋㅋㅋ
삭제해도 되는것인지 구글에 검색해보았다.

https://www.minitool.com/lib/microsoft-update-health-tools.html

 

What Is Microsoft Update Health Tools? Here Is an Introduction!

You may want to get some information about Microsoft Update Health Tools, and this post is what you need. You can know what it is and should you uninstall it.

www.minitool.com

위 링크에 따르면 이 프로그램은 윈도우 업데이트를 위해 필요할 수 있는 작업을 수행하거나 일부를 변경한다고 되어있다.

세부 사항 (구글번역)



Microsoft Update Health Tools는 삭제할 수 있는 걸까? 삭제해도 되는 걸까? 삭제해야 하는걸까? 
대답 : 
삭제할 수 있는 걸까? -> 손상 없이 제거할 수 있다고 한다.
삭제해도 되는 걸까? -> 삭제해도 된다.
삭제해야 하는 걸까? -> 아니다.

위에 소개한 링크에 따르면 해당 소프트웨어는 위험한 프로그램이 아니기 때문에 그대로 두는 것이 좋다고 말하고 있다.
또, 다른 블로그에서 찾아본바로는 삭제를 해도 윈도우 업데이트를 하게 되면 다시 살아나는 경우도 있다고...
괜히 스트레스 받지말고 그냥 두자...

 

728x90
728x90

Node.js의 프레임워크인 Express를 알아보고자

AWS의 EC2서비스에 우분투18으로 인스턴스를 추가하고 Express설치를 했다.

 

근데 테스트해봐야지 하고 브라우저에서 'http://인스턴스아이피:3000'을 아무리 호출해도 접근이 되지 않는 문제가 발생했다.

'뭐가 문제지..'하고 EC2의 보안설정도 확인하고 ufw도 확인하고 iptables도 다 확인했는데 도무지 접근이 안되었다..

혼자서 끙끙대다가 회사의 인프라팀장님께 도움을 받았는데 문제의 원인은 소스코드에 있었다.

app.js의 소스코드는 아래와 같았는데

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
	  res.statusCode = 200;
	  res.setHeader('Content-Type', 'text/plain');
	  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
	  console.log(`Server running at http://${hostname}:${port}/`);
});

여기서 문제가 발생하게 되었던 부분은 'hostname'쪽이었다.

hostname을 '127.0.0.1'이 아니라 인스턴스의 eth0아이피로 설정해주니 외부에서 접근이 되며 해결이 되었다.

 

-----------------------------------------------------------------------------------------------

착오가 있었다.

express를 설치했는데 접근이 되지 않았던 문제가 아니었다.

위의 소스코드는 node.js로 hello world를 표시하는 웹서버 코드였다.

그냥 익스프레스를 설치하니 따로 호스트네임을 설정하지 않아도 바로 접근이 되었다.

휴우..ㅋㅋㅋㅋ

728x90
728x90

리눅스 기준, 코드나이터 설치는 아주 간단하다.

코드이그나이터 홈페이지(https://codeigniter.com)에 접속 후, 소스를 다운로드 받아 프로젝스 소스위치에 업로드하면 된다.

왼쪽 하단의 Download 버튼을 클릭하면 zip파일로 다운로드 된다.

 

 

 

 

 

728x90
728x90

C#을 공부하다보니 헷갈리는것이 생겼다.

바로 'String'(첫글자 대문자)와 'string'


구글신에 검색해보니

'string'은 'System.String'의 별칭(alias)이라고 한다.

해서 기술적으로 다른점은 없다고.

* 마치 'System.Int32'를 'int'로 나타내는것과 같다.


이 지식의 출처는 아래에.

http://h5bak.tistory.com/96

https://stackoverflow.com/questions/7074/what-is-the-difference-between-string-and-string-in-c

728x90
728x90

전자정부 프레임워크를 실행할때,

'org.springframework.web.context.ContextLoaderListener'라는 에러를 내며 실행이 안될때가 있다.


해결방법은..

개발환경 v1.0(eclipse 3.4기반)의 경우

- Project 메뉴 선택 -> Clean... 선택 후.. 프로젝트 재빌드 수행..

- 프로젝트 선택 -> context menu -> Maven -> Update Project Configuration

- 프로젝트 선택 -> context menu -> Run as -> maven clean

- 프로젝트 선택 -> context menu -> Run as -> maven package 후.. 오류 확인..

- Servers view에서 tomcat 서버 삭제 후.. 재등록...



개발환경 v2.0(eclipse 3.6 기반)의 경우

- 프로젝트 선택 -> context menu -> Properites 선택

- Deployment Assembly 항목 선택 후.. Add.. 선택

- Java Build Path Entries 선택 .. -> Maven Dependencies 선택...


728x90
728x90

MySQL과 큐브리드는 생각보다 많이 비슷하고도 많이 다르다.


이번에 MySQL로 쓰고있던 것을 큐브리드로 갈아타는 작업이 생겼는데,

작업을 하며 검색했던 차이점을 나중에 또 찾는 수고스러운 작업을 피하기 위해 여기에 메모해둔다.


아직은 찾은 종류가 많진 않은데 작업하면서 계속 추가할 예정이다.



1. MySQL에서 형변환 시 

CAST(TEMP_COL AS CHAR) 에서 CAST(TEMP_COL AS CHAR(2)) 으로 변경했다.

CHAR에 범위가 들어가 있지 않아서 에러가 난듯했다.

* 근데  SELECT CAST('F' AS CHAR) FROM DB_ROOT; 를 하면 에러는 안나는데... 

  여하튼 CHAR에서 CHAR(범위)로 바꾼뒤 쿼리는 정삭적으로 실행되었다.



2. 예약어 쓰기

MySQL에서는 YEAR, MONTH, DAY를 쌍따옴표를 쓰지 않고도 알리아스로 쓸 수 있다.

하지만 큐브리드에서는 예약어를 쓸때 꼭 쌍따옴표로 감싸줘야 한다.


MySQL : SELECT '2016' AS YEAR FROM DUAL;

cubrid : SELECT '2016' AS "YEAR" FROM DB_ROOT;

* 물론 예약어는 되도록 쓰지않는것이 좋을것 같다.



3. SYSDATE 사용

MySQL에서는 현재날짜를 사용할때 NOW() 또는 SYSDATE()를 이용한다.

큐브리드에서는 각각 NOW()와 SYSDATE로 써야한다.


MySQL : SELECT SYSDATE(), NOW() FROM DUAL;

cubrid : SELECT SYSDATE, NOW() FROM DB_ROOT;



4. REPLACE사용

MySQL에서는 REPLACE함수를 사용할때 인자를 홑따옴표로 감싸도 되고 쌍따옴표로 감싸도 된다.

SELECT REPLACE('2016-09-07','-','') FROM DUAL;     -- OK

SELECT REPLACE("2016-09-07","-","") FROM DUAL;  -- OK


하지만 큐브리드에서는 홑따옴표로 감싸야만 한다.

SELECT REPLACE('2016-09-07','-','') FROM DB_ROOT;        -- OK

SELECT REPLACE("2016-09-07","-","") FROM DB_ROOT;     -- ERROR



5. 날짜연산

잘못된 구문이긴 한데 기존에 Mysql에서

SELECT DATE('2016-09-07')-DATE('2016-09-01') FROM DUAL;

같은 구문을 쓰고 있는게 있었다.

(두 날짜의 차이를 구하는 올바른 함수는 DATEDIFF(날짜1, 날짜2)이다.)


위의 구문을 돌리면 결과값으로 6이 나온다.

왜냐, 20160907이라는 숫자값에서 20160901이라는 숫자값을 빼기 때문이다.

SELECT DATE('2016-09-07')-DATE('2015-09-01') FROM DUAL;

위의 쿼리를 돌리면?

결과값으로 10006이 나온다. 20160907 - 20150901 로 계산하기 때문이다.


암튼, MqSQL에서는 이런식으로도 쿼리 실행이 가능한데 큐브리드에서는 안된다.

큐브리드에서 두 날짜의 차이를 비교하려면 DATEDIFF함수를 써야한다.

SELECT DATEDIFF(DATE('2016-09-07'),DATE('2016-09-01')) FROM DB_ROOT;       -- OK


오늘 날짜랑 비교하려면 

SELECT DATEDIFF(DATE(SYSDATE),DATE('2016-09-01')) FROM DB_ROOT;           -- OK

이렇게 쓰면 된다.



6. MySQL의 varbinary에서 큐브리드의 BIT VARYING으로

간혹, MySQL에서 데이터 컬럼 중에 varbinary타입을 쓰는 경우가 있다.

이경우 큐브리드에서는 BIT VARYING타입을 써야하는데,

이때 where절에서 조회하는 방법이 바뀔 수 있다.


varbinary타입이 내가 많이 쓰는 쪽은 아니라서 맞는진 모르겠지만

기존에 구문이

SELECT COL1 FROM TEMP_TBL WHERE COL1 = '1';   -- (COL1이 varbinary타입일경우) ( 결과 : 31 )

위처럼 쓰여지고 있었다.

재미있는건 해당 컬럼에 insert를 할때 그 데이터가 hex(16진수)화 되어서 들어가는데 where절에서 조건을 1로 줘서 조회를 하면

결과는 1이 hex화된 31이 나온다.


이런 상황에서 큐브리드로 갈아타려면

insert할때는 들어가는 값을 hex함수로 감싸서 넣어주어야 하고

select할때는 where 절에서는 "CAST(OTHBC_YN AS VARCHAR) = hex('1')" 과 같이 varchar로 cast한 컬럼값과 hex화된 데이터 값을 비교하도록 변경하여야 한다. 

입력 : INSERT INTO TEMP_TBL ( COL1 ) VALUES ( HEX('1') );

조회 : SELECT COL1 FROM TEMP_TBL WHERE CAST(COL1 AS VARCHAR) = hex('1')



728x90

'개발 > DB' 카테고리의 다른 글

[오라클] LEFT OUTER JOIN과 LEFT JOIN의 차이점  (3) 2016.09.08
728x90


없다.



결론부터 말하면 LEFT OUTER JOIN과 LEFT JOIN의 결과는 같다.


LEFT OUTER JOIN을 줄여쓰면 LEFT JOIN이 된다.



또,

INNER JOIN을 줄여쓰면 그냥 JOIN이 된다.



나는 헷갈려서 그냥 OUTER, INNER를 명시적으로 써주는 편인데

같이 개발하시는 다른분들이 다 줄여쓰셔서 다 바꿨다..



구글링 해보면 이것저것 많이들 나온다.


아래는 내가 구글링 했던 블로그이다.

참고하시길...

http://egloos.zum.com/sweeper/v/3002220 <- OUTER JOIN

http://egloos.zum.com/sweeper/v/3002133 <- INNER JOIN

728x90

'개발 > DB' 카테고리의 다른 글

MySQL에서 CUBRID로 바꿀때 변경했던 것들  (0) 2016.09.20

+ Recent posts