배열 크기 설정 없이 문자 받아드리기

Tags

, , , , ,

환경 : 비주얼 스튜디오 2010

제목 짓기 참 어렵네…

다름이 아니라 자주 다니는 커뮤니티에 질문이 올라왔다..

 

질문은 문자열 역순 출력

adsf <–입력

fsda <–출력

 

이런식이었다.. 뭐 그냥 배열을 하면 너무 쉬워서 동적배열로 한번 짜보았다..

 

하지만 여기서 의문.. 동적배열의 특징은 가변적인 입력만큼 메모리를 할당한다 라는 거다..하지만 직접 코딩을 하다보면

(char *)malloc(sizeof(char))

즉 size를 지정하게 되어있다.. 저 위 상태에서 2글자 이상 집어넣게 되면 메모리가 부족하다는 오류가 뜨게 된다..

헐..이제 알았네….

 

그래서 생각해 본 게 초기 배열 크기를 정하지 않고 코딩을 할 수 없을까 였다.. 그래서 한번 짜보았다.

배열 거꾸로

 

여기서 중요한 코드가

buf = (char *)realloc(buf,strlen(buf));

이 코드다..

핵심적으로 적자면

1. realloc 함수가 성공적으로 된다면..(buf 리턴 값이 0이 아닐 경우)  realloc 되기 전의 buf 에 들어있는 데이터는 초기화 되지 않는다 라는 거다..

(지금에서야 느낀거지만 당연한 것이었을듯. 왜냐하면 접근할 수 있는 주소값을 지웠다고 데이터가 사라지는건 아닐테니..)

2. 만약에 realloc이 실패한다면(buf리턴 값이 0이 될경우) 값이 buf 값이 날아가므로 실패하기 전에 buf 값을 저장해야 할 것이다(소스코드에선 구현이 되지 않았다)

3. 오류가 난다면 realloc 사이즈 크기때문이다..95% 이상.

4. realloc 함수에 사이즈 만큼 추가가 된다

buf = realloc(buf,size(char)+1); 라면 realloc안의 buf 크기에 상관없이 총 buf의 크기는 2로 변한다

buf = malloc(4);

buf=realloc(buf,size(char)+2);

이렇게 되면 buf의 크기는 3이다 6,7등등이 아니라…

 

뭐 이정도???

 

후 이것때문에 한 2시간 해맨듯..

그래도 해결했으니 다행이다.

 

메모리 종류(ecc,register)

문제되면 알려주세요 자삭 하겠습니다.

원본 글 : http://2cpu.co.kr/bbs/board.php?bo_table=QnA&wr_id=297096

unbuffered module – 우리가 흔히 구할수있는 PC 메모리 ( 보통 모듈당 64bit data 폭,보통 8개혹은 16개 의 메모리 콤포넌트로 이루어짐 )

ECC unbuffered module  –  8bit 당 1bit 의 에러검출을 위한 기능을 위해 동일한 여분의 콤포넌트가  사용된 메모리 ( 보통 72bit data 폭 ,보통 9개 혹은 18개의 메모리콤포넌트 로 이루어짐) 

ECC registered – ECC 기능의 메모리에 시그널  (특히 dq 라인)무결성을 높히기 위해 콤포넌트 + 레지스터 ( 쉽게 말씀드리면 FlipFlop array)로 구성된 메모리 모듈.레지스터에 정렬후 1cycle 의 clock 이 더 있어야 실지 signal 이 외부와 소통 되므로 unbuffered 메모리에 비해 latency 가 늘어남. 
 ( 보통 72bit data 폭 , 9개 혹은 18개의 메모리콤포넌트 + 레지스터 ( +PLL) ) 로 구성. buffered 메모리라고도함. 

ECC unbuffered 모듈은 대개 unbuffered 메모리를 사용할수 있는곳에 사용이 가능하고 ECC 기능의 여부는 메모리콘트롤러에서 지원여부 와 사용된 메모리 모듈이 무엇이냐에 따라 달라지겠죠. 
ECC registered vs  ECC unbuffered or unbuffered 메모리 모듈은 호환성이 없습니다.메모리 운영방식이 다르니 메모리콘트롤러가 다르겠고  당연히 호환이 안되겠죠.

 

원본 글 : http://dreamwebs.kr/hboard4/bbs/board.php?bo_table=board1&wr_id=211

 

[일반 메모리]

S : Small outline DIMM(SO-DIMM)
노트북용 메모리를 의미 합니다.
즉, 데스크탑에는 장착자체가 불가능한 규격 입니다.
(노트북에만 사용할 수 있고 장착 가능한 메모리 입니다.)

U : Unbuffered DIMM(UDIMM), non ECC
일반 데스크탑 메모리 입니다.
buffer(버퍼) 즉, 메모리간에 속도차이로 인해 신호동기화나 각종 데이터 처리간의
신호왜곡이나 차이점, 문제들을 커버해줄 수 있는 버퍼 기능이 없고(Unbuffered),
(우리가 컴퓨터에서 통상 말하는 버퍼메모리의 그 버퍼를 의미 합니다.)
오류수정/검출 기능(ECC : Error-correcting code) 도
지원하지 않는다는(non ECC) 의미 입니다.

서버가 아닌 일반 데스크탑에서는 필요없는 기능이기 때문에 
해당 메모리를 통상 일반 PC메모리, 데스크탑용 메모리라고 부릅니다.


[서버용 메모리]

E : Unbuffered DIMM(UDIMM), ECC
버퍼기능은 없으나 오류수정/검출 기능을 지원하는 메모리 입니다.

R : Registered DIMM(RDIMM)
buffered 메모리라고도 합니다.
메모리 버퍼의 기능에서 데이터 처리 기법(기술)중에 하나가 Registered 이고,
메모리 카드에 장착된 register 칩이 메모리 컨트롤러 사이에서 버퍼 역활을
합니다. (Unbuffered 의 반대 개념입니다.)
그리고 해당 Registered 규격 메모리들은 거의 대부분 ECC 기능이 포함되어 있습니다.

그런데 여기서 한가지 의문점이 들지 않으시나요?^^
Registered DIMM 을 buffered 메모리 즉, buffered DIMM 이라고도 부르는데,
표준규격인 Unbuffered DIMM 이 있으니까 동일한 개념으로 Buffered DIMM 이라고
표준규격을 만들어야 되지 왜 Registered DIMM 으로 규격을 만든건지..

현재의 SDRAM 이전에 사용하던 구형 메모리들에서도 서버용 메모리를 통상적으로
buffered 메모리라고 불렀습니다. 그리고 반대되는 의미로 Unbuffered 라고했구요.
그리고 지금 현재의 SDRAM 으로 대부분이 대체되면서 이전 방식과의 서버 메모리 특성이나
동작 차이점으로 인해 buffered 가 아닌 Registered 로 바뀌게된 부분이지
기능이나 동작의 의미는 동일한 말입니다. 그리고 예전에도 사용하던 Unbuffered 는 바뀌지 않고,
지금도 사용하고 있고, 규격된 부분입니다.
왜냐하면 구형 메모리가 SDRAM 으로 대체되어도 일반사용자용 메모리는 메모리 특성이나
동작차이점이 없기 때문 입니다.
물론 성능은 더 향상되었죠^^;; 기본적인 구동 원리 부분에 큰 차이점이 없다는 부분입니다.
그래서, Buffered DIMM 이 아닌, Registered DIMM 이라고 규격화된 부분 입니다.
(Buffered 만 Registered 로 바뀌었다는 의미 입니다.)

P : Registered DIMM(RDIMM), with address/command parity function
방금전 설명드린 Registered DIMM 뒤에 추가 기능이 있네요^^
ECC(오류 수정/검출) 기능과 비슷하다고 생각되실 수도 있지만
ECC 는 데이터 오류 검출->수정 기능이 있다면 Parity 는 단순히 검출,확인
기능만 있습니다. 그래도 ECC 기능이 아예 지원되지 않는것 보다 오류 검출/확인만
되어도 시스템 문제 발생시 원인을 좀더 쉽게 찾을 수 있습니다.
요즘 출시되는 서버 시스템에서 사용하지 않는 기능 입니다.
ECC 기능이 더 좋기 때문이고, Parity 메모리 다음에 나온게 ECC 메모리 입니다.

F,FB : Fully Buffered DIMM(FDIMM or FBDIMM)
단어 의미로 보면 buffered 메모리 즉, Registered 메모리처럼 버퍼를 사용하는
메모리가 맞지만 Fully 란 단어가 들어갔기 때문에 내부 동작구성이나 구조가 완전히 다릅니다.
이 메모리 같은 경우 PC의 메모리 컨트롤러를 통해 데이터를 주고 받는게 아니라
메모리 카드에 AMB(Advanced Memory Buffer) 라는 마치 일종의 메모리 컨트롤러가
추가된 메모리 입니다. 이 AMB 컨트롤러를 통해서 모든 데이터 처리가 이루어 집니다.
즉, 일반적인 버퍼기능 보다 좀더 완벽한 버퍼기능이 가능한 제품 입니다.

그래서 F,FB 메모리 같은 경우는 기존 DDR 규격과는 전혀 다른
전용 규격이고 메모리 슬롯도 전용 규격 입니다.

즉 F, FB 규격의 메모리는 아예 별도의 규격이라고 생각 하시면 됩니다.
서버 PC라도 메인보드 사양이 FDIMM or FBDIMM 일 경우에만
사용할 수 있는 전용 메모리 입니다.

그래서 서버 PC 사용자분들도 실수로 잘못 구입하시는 경우가 있는 제품 입니다.
(아래 그림을 보시면 더 이해하기 편하실 겁니다.)

 

 

gdb list 오류

hkbt@ubuntu:~/hackboot_test$ gdb -q a.out
Reading symbols from /home/hkbt/hackboot_test/a.out…done.
(gdb) list
1 ../sysdeps/i386/elf/start.S: No such file or directory.
in ../sysdeps/i386/elf/start.S

이런 오류가 뜰 때가 있다.

이 때 소스를 컴파일 할 때 -g 옵션을 주면 된다

hkbt@ubuntu:~/hackboot_test$ gcc 소스코드.c -g

 

추가.

그런데 궁금한건 우분투 9.10을 설치 하고 바로 했을 땐 -g옵션 안주었음에도 불구하고 list 명령어가 잘 됬는데 gdb 설정 좀 만지다 보니까 안되던데..이상하네 내가 잘못 본건가 -g옵션 준적이 없는데.. 미스테리임

gdb intel 문법으로 표시하기

뭐 별건 아니고 현재 테스트 중인 리눅스 운영체제는 ubuntu 9.10 인데

책을 보니 set dis intel 이란 명령어가 안먹히더라

그래서 찾아보니 set disassembly-flavor intel 하면 동작하는 것을 알 수 있다.

 

참고 : x86 어셈블리 코드를 작성할 떄 사람들은 at&t 문법과 intel 문법 중 한가지를 사용했는데.

at&t 문법은 %와 $ 등이 붙여진다. intel 문법은 그런게 없다..

참고로 나도 at&t문법이 편한듯

일시적인 intel 문법 적용

(gdb)set dissassembly-flaver intel 꼬는 att

환경설정

hkbt@ubuntu$ echo “set disassembly-flavor intel” > ~/.gdbinit

 

 

추가.

(gdb)set dis intel을 하게 되면

Ambiguous set command “dis intel”: disable-randomization, disassemble-next-line, disassembly-flavor, displaced-stepping.

이런 문구를 볼 수가 있는데

disable-randomization : 이것 같은 경우는 aslr을 디스에이블 해주는 것 같다 하지만 해보진 않았으니 정확히 믿지는 말 것

참고 url  : http://www.outflux.net/blog/archives/2010/07/03/gdb-turns-off-aslr/

나머지는 나중에 조사해야겠음 이거 조사하다가 하려는 공부도 하기 전에 시간 다 보낼듯 -_-

 

python 2.x http response body 가지고 오기

정말 오랜만에 글을 작성하네요..

회사일 정말 바빠서 아예 처다보지도 못하던 중… 해킹문제를 풀 기회가 생기게 되었고 그 중에 파이선 플밍 문제가 있어서 플밍을 작성했습니다.

별거 아니긴 하지만 이 문제를 요청하신 분이 코드를 배포하지 말라고 해서 이번 공부 중의 가장 기초적이었던 2.x 대의 url response body 내용 가지고 오기 부분만 적겠습니다.

사실 3.x버전을 하려고 했는데.. 계속 인코딩 문제가 나서 일단 2.x로 해결을 봤습니다. 3.x 는 response body를 byte 형태로 가지고 오기 때문에 문자 검색, print 가 오류가 계속 나는 겁니다. 하여튼 이거 아직도 해결 못하고…

역시 2.x 에서는 response body를 str로 가지고 오기 때문에 정말 편하네요…(이것 때문에 왜 3.x을 공부했을까라는 생각이 너무나는 하루였습니다…)

——————————————————————————————————————————

import urllib2

def HttpResponseBody(url):

p_request = urllib2.Request( url )
p_response = urllib2.urlopen(p_request)

return p_response.read()

if __name__=”__main__”:

url = “http://www.test.co.kr&#8221;

content = HttpResponseBody( url )

print type(content)

결과물은 response 의 바디 부분의 코드를 가져오게 됩니다.

여기서 중요한 점은 type(content) <– str 이라는 겁니다. 이것 때문에 바로 문자열 검색 함수들을 쓸 수가 있거든요..

그리고 참고로 url로 보낼 때 스페이스 는 %20으로 변환을 해야 합니다. 그냥 스페이스로 보내면 안먹히네요..하여튼 참조 하세요…

class python 데이터 이동?

위 제목을 붙이긴 했는데 막상 하고 나니 이걸 왜 작성하는지도 모르겠고 -_-;;

처음에 이걸 쓰려고 했던 이유는 하나의 파이선 파일의 class 데이터를 연산? 하고 import 시키면 이 데이터를 사용할 수 있다 뭐 이런 건데.. 하고 나니 -_- 별로 의미있는 짓은 아니라고 생각한다 그래도 혹시 모르니 기록 오래걸린건 아니니까..

알고자 하는 것

1. read.py 를 생성을 하고 클래스로 만든다 이 클래스의 read_file이란 부분은 파일을 읽어서 dict로 저장

2. Read_main.py를 만들고 read.py를 임포트를 시킴

3. 그 후 read.py에서 데이터를 조작하고  Read_main.py에서 read.py 의 list.txt 처리한 내용을 출력 이미지의 

 

————————————————————————————————————-

 

 

 

python3 dict 관련

어떤 프로그램을 참조하는 중이었다.. dict에 관한 부분이었는데  dict 자료구조를 모르던 상태에서 본 것이었는데 값이 나와야된다고 생각을 했는데 값은 안나오고 왠 숫자만 나오는 것이었다. 알쏭달쏭하던중 대충 추측해서 알아보니 추측이 맞더라 알고 나니 별거 아니엇지만 그냥 정리해봄

알고자 하는 것들

1. dict 자료구조에서 for cmd in command() 실행하면 key가 선택이 되어진다.(디폴트로 key라는 거임) values를 꺼내려면 밑의 처럼 command.values 로 명시해주어야함

2. 파일 오픈 시 f (이걸 핸들러라고 해야하나 디스크립터라고 해야하나 잘 모르겟네요..) 로 for 문이 가능하다는점 (솔직히 안될 줄 알았음..) 결과론적으론 f.readline()와 같다.

이미지

python3 클래스 관련

이것을 작성하는 이유는 이론적인 이유라기 보단 이렇게 사용될 수 있다라는 것을 위해 글을 쓴다.

여기서 알아보고자 하는 것은

1. 소스상에 cals(100,200) 인자를 넣는 것은 __init__ 의 매개변수에 집어넣으면 된다.

2. sum_1이란 변수를 선언해주고 main에 objcalc.sum_1을 True냐 false냐 에 따라서 조건문을 줄 수 있다. 별거 아닌거 같지만 옵션을 주어야 하는경우가 많아서 ….

물론 이건 정말 기초중의 기초일 것이다 다만 나 같은 경우에는 클래스를 정확히 개념을 못잡고 한 상태라서 대충 이용할 만한 가치가 있다고 생각되는 것은 기록하려고 한다.

이미지

1. 매개변수 받기

소스의 CALS(100,200)을 받기 위해서는 일단 __init(self,A,B) 이런식으로 매개변수를 잡아준다. 아 그리고 저기 주석 처리 되어 있는 2개 주석 풀어줘야함 그냥 막 썻더니 ㅜㅜ 저 주석을 풀어주지 않으면 self.A self.B를 사용할 시 위의 7~8번째 있는 줄의 A B를 참조함

2. 조건문 하기

objccalc.sum_1 = True 나 false를 사용해서 조건을 만들려면 클래스내에 선언을 해준다음에 if문에 self.sum_1 형식으로 걸어주면 된다.

python self 설명

파이선 클래스를 접하면서 초반에 이해가 안되는게 바로  self였다.

지금은 대충 어림잡아서 알기 때문에 아 이런걸 몰랐나 하지만..몰랐을 당시에는 이게 뭐야 했던 것이 여러번 있었던듯..

——————————————————————————————————

self란 뭐 책이나 많은 설명이 있었지만 모르는 사람이 보기엔 어려운 것일 뿐.

그냥 내 생각으로는 class 내부의 함수나 데이터들을 쓸 수 있게 해주는 것이라고 생각을 한다

이미지

원래 self를 설명하려고 짠 소스는 아닌데 그냥 여기서 몇개 수정해서 설명을 하려고 한다.

그리고 이 예제가 정확하게 맞는건 아니라고 생각을 한다.

단순하게 설명을 하자면 self.A self.B를 사용을 하면 소스 상의 7,8 번째 상의 데이터를 이용하게 되고 단순하게 A,B를 사용하게 되면 클래스 외부 A,B를 사용하게 된다는 것이다.

이것은 데이터 뿐만이 아니라 func도 해당이 되는데 24번째줄의 sum()이란 함수를 보면

클래스 내부의 함수이기 때문에 self.sum을 사용해야 된다라는 것이다.

만약에 클래스 외부의 함수였다면 sum을 그냥 썻을 것이다.

python file 한글 포함

가끔가다가 python file 한글이 포함 되면 

SyntaxError: Non-UTF-8 code starting with ‘\xb0’ in file C:\Documents and Settings\Administrator\바탕 화면\notepad_store.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details                           

이런 에러를 뱉을때가 있다.

파일을 저장할때 ansi 말고 utf-8로 저장 이라는 버튼을 누르면 해결이 된다.