나를 감동시킨 소스코드
글쓴이: geekforum / 작성시간: 화, 2002/02/26 - 9:48오전
프로그램을 개발하면서 기반구조부터 실제 사용자가 접하는 부분까지 모두 처음부터 개발하는 경우도 많겠지만 이미 누군가 만들어 놓은 걸 고치는 경우도 많으시겠지요. 그리고 아마 오픈소스 쪽이라면 남의 코드를 볼수있는 경우가 더욱 많을 테고요.
남이 짜놓은 코드 보다가 나도 모르게 감탄하는 경우도 꽤 많을것 같은데 그런 경험을 한번 나누어 보면 어떨까 합니다. 잘하는 프로그래머들도 처음부터 잘하지는 않았을 테고, 경험이 많을수록 남의 코드 보고 감탄한 경우도 많았을 거라고 생각됩니다. 여러분을 감동시킨 소스코드는 무엇인지요? 괜찮다면 한번 보여 주세요....
Forums:
저도 STL이 참 멋지다고 생각하고 있습니다.처음엔 MFC쓰면서 CS
저도 STL이 참 멋지다고 생각하고 있습니다.
처음엔 MFC쓰면서 CString밖엔 몰랐는데
STL의 string도 쓸만하고 vector도 참 쓰기편하고 좋더군요.
무엇보다도 소스를 옮겨 붙이기가 참 좋더군요.
MFC를 쓰게 되면 Win32로만 쓰여진 프로젝트에는 쓰기 힘들잖아요.
미로찾기 좋아시나요?한번 컴파일 해서 실행해 보시길 바랍니다.절대
미로찾기 좋아시나요?
한번 컴파일 해서 실행해 보시길 바랍니다.
절대로 트로이 따위는 아닙니다.
출처 : http://www.ioccc.org/1985/shapiro.c
#define P(X)j=write(1,X,1)
#define C 39
int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,C-1,-1},m[]={1,-C,-1,C},*b=N,
*d=N,c,e,f,g,i,j,k,s;main(){for(M[i=C*R-1]=24;f|d>=b;){c=M[g=i];i=e;for(s=f=0;
s<4;s++)if((k=m[s]+g)>=0&&k=16!=M[k]>=16))a[f++
]=s;if(f){f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];j=j c|1<
b++?b[-1]:e;}P(" ");for(s=C;--s;P("_"))P(" ");for(;P("\n"),R--;P("|"))for(e=C;e--;P("_ "+(*u++/8)%2))P("| "+(*u/4)%2
);}
일부로 이렇게 짠건가요?? ㅡㅡ;이 소스를 보고있노라면 많은걸 느끼게
일부로 이렇게 짠건가요?? ㅡㅡ;
이 소스를 보고있노라면 많은걸 느끼게 해주는군요..
소스의 들여쓰기규칙이라던가.. 띄어쓰기.. ㅋㅋ
이 소스를 보는 방법?
1. 가독성을 확보한다. (보기힘들다)
2. 각 변수명을 의미있는 명으로 바꾸자.
3. 씨의 연산자 우선순위와 결합법칙을 알자.
(필요하다면 c++; M[g=i];의 형식을 c = c + 1; g = i; M[g];로..)
4. 미로의 알고리즘을 파악하자.
5. 나중을 위하여 주석을 달아두자.
#define P(X) j = write(1, X, 1)
#define C 39
int M[5000] = {2};
int *u=M;
int N[5000];
int R=22;
int a[4];
int l[]={0,-1,C-1,-1};
int m[]={1,-C,-1,C};
int *b=N;
int *d=N;
int c, e, f, g, i, j, k, s;
main()
{
srand(time(NULL));
for(M[i=C*R-1]=24; f|d>=b; )
{
c = M[g=i];
i = e;
for(s=f=0; s<4; s++)
if((k=m[s]+g) >= 0 &&
k l[s] != k%C &&
(!M[k] || !j && c >= 16 != M[k] >= 16))
a[f++]=s;
if(f) {
f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];
j=j f+=c&-16*!j;
M[g]= c|1<
M[*d++=e]=f|1<<(s+2)%4;}
else
e=d>b++?b[-1]:e;
}
P(" ");
for(s=C; --s; P("_")) P(" ");
for(; P("\n"), R--; P("|"))
for(e=C; e--; P("_ "+(*u++/8)%2))
P("| "+(*u/4)%2);
}//end main
#define fine #define de #define/**/ /**/
#define fine #define de #define/**/ /**/*#define*/
#define de #define
#define do de
do { begin
do you like (green eggs and ham++)?
do you eat them: in a box?
do you eat them with a fox?0
do } end
fine
fine, just fine.
/*@@@@@@@@@@@@=___
/@@@@@@@@@@@@@@@@@@@a
@@@@@@@@@@@@@@@@@@@@@
|@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@
\@=~ ~~@@@/
\ /
\ |
/@@@@@===__ |
@@@@@@@@@@@@==/
/@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@
/ ~~~====@@@@@@
/ ~~~/
| /
/____ |
@@@@@@@@=====__/
@@@@@@@@@@@@@@@@
/@@@@@@@@@@@@@@@
/@@@@@@@@@@@@@@@|
___/ ~~~~@@*/
char groo(p,q)int p;int q;{return
((char) (--q*q+ (p/10)*q+--p))
; }void grem /**/ (){ int x=0
; printf(" ")
;/**/ /**/ for(;x<16
; x++)printf
( "%c",groo(x
, 8)) ;printf
( "\n\n")
; }void cred(a
) int a;{int
x=0;printf
( "%c "
, /*_____===~*/ groo(a,8))
; for(;x<16
; x++)printf
( "%c",(char)
a*16+ x);printf(
"\n");}main(a
,b)int a;
char **b ;{int x=2;
do(x=0;x<4;x++)exit(0);
for(grem();x<1<<3+(int)b[0]
[0]%2;)cred (++x-1);}
사용법입니다. 사실 원래 코드는 상당히 이쁩니다.http://www.
사용법입니다. 사실 원래 코드는 상당히 이쁩니다.
http://www.ioccc.org/1996/gandalf.c
를 참고하시면 됩니다.
사용법은... [같은 실행파일인데도, 실행하는 파일이름에 따라서 결과물이 다릅니다 쿨럭..]
gcc gandalf.c -ogandalf
cp gandalf cathat
cp gandalf hatcat
To use:
make gandalf
./gandalf
Also try:
For C-shell:
setenv PATH ( . $PATH )
hatcat
cathat
For K-shell, /bin/sh, bash, etc:
PATH=.:$PATH
hatcat
cathat
And next try:
./cathat
`pwd`/cathat # <--- those are back quotes
확장된 Pascal 언어에는 이런 특이한게 있습니다.즉 R 값이
확장된 Pascal 언어에는 이런 특이한게 있습니다.
즉 R 값이 아닌 L 값을 Casting하는 것이 가능하다는겁니다.
Program XX;
Type
TPoint = Record
x,y: Word;
end;
var
p : TPoint;
v : LongWord;
begin
// v의 High Bit 부분 2바이트에는 X 좌표, Low Bit 부분의 2바이트에는 Y 좌표값이 들어 있다고 합시다.
// 그러면 대개는 이렇게 코딩합니다.
p.x := Hi(v);
p.y := Lo(v);
// C 처럼 한다면
p.x := v shr 16; // p.x = v >> 16;
p,y := v and $FFFF; // p.y = v & 0xFFFF;
// 그러나 좀 아는 사람은 이렇게 합니다.
LongWord(p) := v;
// 이것은 memmove나 CopyMemory와 본질적으로 바를바없습니다만, 일단 생김새가 간단 명료하고 보기가 좋습니다.
end;
저는 C++Builder의 VCL 라이브러리요...예를 들어멀티라
저는 C++Builder의 VCL 라이브러리요...
예를 들어
멀티라인 에디트창의 3번째 라인 다음에 다른 문자들을 추가 하고 싶다고 할때,
== Borland C++Builder 의 예 ==
Memo1->Lines->Insert(3, "중간에 추가 합니다.");
// 엄청 간단!
//참고) Lines는 TStrings 객체 입니다.
== M$ Visual C++ 의 예 ==
CString sTest;
CStringArray saTest;
int nST = 0, nED = 0;
m_Edit1.GetWindowText(sTest);
sTest = sTest + "\r\n";
while (true) {
nED = sTest.Find("\r\n", nST);
if (nED == -1)
break;
saTest.Add(sTest.Mid(nST, nED - nST));
nST = nED + 2;
}
saTest.InsertAt(3, "중간에 추가 합니다.");
sTest = "";
for (int i = 0; i < saTest.GetSize(); i++) {
sTest = sTest + saTest.GetAt(i) + "\r\n";
}
m_Edit1.SetWindowText(sTest);
//이게 뭔 삽질인고... -_-;;
MFC에서도 그리 복잡하지 않습니다.간단한 걸 어렵게 하시고는 도구를
MFC에서도 그리 복잡하지 않습니다.
간단한 걸 어렵게 하시고는 도구를 탓하시면 아니되지요..^^
int index = m_Edit.LineIndex(3);
m_Edit.SetSel(index, index);
m_Edit.ReplaceSel("중간에 추가합니다\r\n");
단 세 줄로 되는 겁니다.
그래도 위의 한줄이 훨씬 낫군요./* Borland */Mem
그래도 위의 한줄이 훨씬 낫군요.
/* Borland */
Memo1->Lines->Insert(3, "중간에 추가 합니다.");
/* MS */
int index = m_Edit.LineIndex(3);
m_Edit.SetSel(index, index);
m_Edit.ReplaceSel("중간에 추가합니다\r\n");
요즘에 CBuilder 사용하면서 느끼지만... 역시 코드가 간결해요.
MFC의 세 함수 LineIndex, SetSel, ReplaceSel은
MFC의 세 함수 LineIndex, SetSel, ReplaceSel은 Windows API의 EM_LINEINDEX, EM_SETSEL, EM_REPLACESEL 메시지를 각각 감싼 것입니다. VCL은 이들을 조합하여 특수한 상황에 딱 맞는 인터페이스를 만들어낸 것일 뿐, 겉으로는 하나의 함수로 보여도 내부적으로 여러 과정을 거쳐야 하는 것은 윈도우 환경을 이용하는 한 어쩔 수 없는 것이겠지요. 즉 양 라이브러리가 일을 하는 방식에 본질적인 차이가 있는 것은 아니며, 추상화의 정도에 차이가 있다고 할 수 있지 않을까 싶습니다. 물론 MFC에서도 비슷한 일을 하는 함수를 만들어 쓸 수 있습니다.
void InsertLine(CEdit& e, int line_index, CString str) { int char_index = e.LineIndex(line_index); e.SetSel(char_index, char_index); e.ReplaceSel(str += "\r\n"); }
InsertLine(m_Edit, 3, "중간에 추가합니다");
그럼 이런 특성화된 함수를 모두 제공하는 것이 좋으냐의 문제로 귀결되는데, 사용자의 입장에서는 언뜻 보기에 당연히 다양한 함수가 제공되면 좋을 것 같지만 반드시 그렇지도 않습니다.
위에서 LineInsert 함수는 멤버 함수가 아니더라도 기존의 멤버 함수들의 일만을 조합하여 원하는 일을 할 수 있는데, 이는 위 기능이 edit box의 본질적인 기능이 아니라는 뜻입니다. 이런 기능까지 모두 멤버 함수로 만든다면 클래스의 인터페이스가 매우 장황해지고 이해하거나 배우기가 어렵게 될 수 있습니다. (예컨대 std::basic_string<>도 인터페이스가 너무 복잡하다는 비판이 뉴스그룹에서 들리고 있지요.)
이런 기능들은 오히려 non-member로 만드는 것이 encapsulation에 좋다는 주장이 있습니다. 자세한 것은 Scott Meyers의 "How Non-Member Functions Improve Encapsulation" 이라는 글을 읽어보시기 바랍니다.
VC와 CBiulder에 대한 잘못된 견해라고 생각합니다.VC가
VC와 CBiulder에 대한 잘못된 견해라고 생각합니다.
VC가 MFC 클래스를 포함하고 있듯이 CBuilder가 VCL 클래스를 포함하고 있을 뿐입니다.
어느 쪽이 더 함수의 수가 많느냐 적느냐 따지기가 어렵습니다.
Cbuilder는 내부적으로 STL을 이용하여 바꾸어가는 중이라고 알고 있습니다.
그래서 함수가 많아지더라도 그 각각이 표준에서 그리 벗어나지 않고 있고, 또한 여러 STL과 결합도, 같은 Win32 코드라고 하더라도, VC에 비해 상대적으로 쉽다고 알고 있습니다.
MFC 공부하다 보면, Get이나 Put으로 시작하는 클래스 멤버 함수가 많다는 것을 느끼게 됩니다. 반면에 VCL에서는 그런 함수보다는 프로세스 중심의 함수가 많습니다.
그러다 보니, 눈으로 읽을 때, 객체에 대한 소스를 보면 VC 쪽이 더 빨리 읽히고, 객체에 대한 작업을 나타내는 소스를 보면 CBiulder 쪽이 더 빨리 읽히더군요.
ps>
위 내용은 어디까지나 개인의 의견입니다. ^^a
또한 더 이상의 코멘트에는 E-mail로서 답하겠습니다.
게시판을 사용하지 않음을 양해하여 주십시오.
게임 프로그램 작성중에 스크립트를 사용해야 할필요성이 있어서0
게임 프로그램 작성중에 스크립트를 사용해야 할
필요성이 있어서
0)스크립트 작성
1)줄 단위로 읽기
2)탭 단위로 나누기
3)스크립트 해석하기
요런식으로 포인터내,개행이네...하면서 프로그램
작성하다가............
요것을 봤을때....-_-;...
--------------------------------------------
void ScriptTranslate()
{
char EnemyName[20];
char EnemyType;//Enemy01이면 1,Item이면 m,StageClear이면 r
int x, y;
int itemtype;
int m_nMaxWidth,m_nMaxHeight;//중점을 맞추어 주는 가로 세로 값
int string_size;
int i=0;
int j=0;
while(NextCommandCount<=(FrameCount/2))
{
fscanf(Stage, "%s", EnemyName);
string_size = strlen(EnemyName);
EnemyType=EnemyName[string_size-1];
switch(EnemyType)
{
case 'N':
break;
case '1':
m_nMaxWidth=62;
m_nMaxHeight=62;
fscanf(Stage, "%d %d", &x, &y);
x=x+m_nMaxWidth/2;//중점 좌표로 변환
y=y+m_nMaxHeight;
while(now_enemy01_count {
if(Enemy01_C[now_enemy01_count].m_nUsed == NO)
{
Enemy01_C[now_enemy01_count] = CEnemy01(x,y,Player_C);
Enemy01_C[now_enemy01_count].m_nUsed = YES;
now_enemy01_count=0;
break;
}
else
{
now_enemy01_count++;
}
}
break;
case '2':
m_nMaxWidth=232;
m_nMaxHeight=100;
fscanf(Stage, "%d %d", &x, &y);
x=x+m_nMaxWidth/2;
y=y+m_nMaxHeight;
while(now_enemy02_count {
if(Enemy02_C[now_enemy02_count].m_nUsed == NO)
{
Enemy02_C[now_enemy02_count] = CEnemy02(x,y,Player_C);
Enemy02_C[now_enemy02_count].m_nUsed = YES;
now_enemy02_count=0;
break;
}
else
{
now_enemy02_count++;
}
}
break;
case '3':
m_nMaxWidth=100;
m_nMaxHeight=100;
fscanf(Stage, "%d %d", &x, &y);
x=x+m_nMaxWidth/2;
y=y+m_nMaxHeight;
while(now_enemy03_count {
if(Enemy03_C[now_enemy03_count].m_nUsed == NO)
{
Enemy03_C[now_enemy03_count] = CEnemy03(x,y);
Enemy03_C[now_enemy03_count].m_nUsed = YES;
now_enemy03_count=0;
break;
}
else
{
now_enemy03_count++;
}
}
break;
case '4':
m_nMaxWidth=65;
m_nMaxHeight=65;
fscanf(Stage, "%d", &y);
y=y+m_nMaxHeight;
while(now_enemy04_count {
if(Enemy04_C[now_enemy04_count].m_nUsed == NO)
{
Enemy04_C[now_enemy04_count] = CEnemy04(y);
Enemy04_C[now_enemy04_count].m_nUsed = YES;
now_enemy04_count=0;
break;
}
else
{
now_enemy04_count++;
}
}
break;
case '5':
m_nMaxWidth=55;
m_nMaxHeight=62;
fscanf(Stage, "%d", &y);
y=y+m_nMaxHeight;
while(now_enemy05_count {
if(Enemy05_C[now_enemy05_count].m_nUsed == NO)
{
Enemy05_C[now_enemy05_count] = CEnemy05(y);
Enemy05_C[now_enemy05_count].m_nUsed = YES;
now_enemy05_count=0;
break;
}
else
{
now_enemy05_count++;
}
}
break;
case '6':
m_nMaxWidth=250;
m_nMaxHeight=125;
fscanf(Stage, "%d", &y);
y=y+m_nMaxHeight;
while(now_enemy06_count {
if(Enemy06_C[now_enemy06_count].m_nUsed == NO)
{
Enemy06_C[now_enemy06_count] = CEnemy06(y,Player_C);
Enemy06_C[now_enemy06_count].m_nUsed = YES;
now_enemy06_count=0;
break;
}
else
{
now_enemy06_count++;
}
}
break;
case 'm':
m_nMaxWidth=115;
m_nMaxHeight=60;
fscanf(Stage, "%d %d", &y, &itemtype);
y=y+m_nMaxHeight;
while(now_itemessenger_count < MAXITEMMESSENGER)
{
if(ItemMessenger_C[now_itemessenger_count].m_nUsed == NO)
{
ItemMessenger_C[now_itemessenger_count] = CItemMessenger(y,itemtype);
ItemMessenger_C[now_itemessenger_count].m_nUsed = YES;
now_itemessenger_count=0;
break;
}
else
{
now_itemessenger_count++;
}
}
break;
case 'r': // StageClear
//AllDamage(GEnemyBullet, 100);
//AllDamage(Enemy, 1000);
//BGEffect = TRUE;
//Head->SetLife(99);
break;
case 'e': // Goto NextStage
//StageClear = TRUE;
break;
//case 9999:
// CurrentState = 6;
// break;
default:
break;
}
fscanf(Stage, "%d", &NextCommandCount);
}
FrameCount++;
}
--------------------------------------------
스크립트 파일은 요런식으로 이루어져 있었음..
----------------------------------------------
N
60 Item 400 502
200 Enemy03 630 100
200 Enemy03 630 200
230 Enemy03 630 100
230 Enemy03 630 200
fscanf을 이용해서 스크립트 파일을 분석한뒤
개체 생성...-_-..
/////////////////////////////////// Th
/////////////////////////////////
// The one and only CTestApp object
CTestApp theApp;
아 이 얼마나 삼라만상인가...!!
흠 프로그래밍하시는 분들께는 우스운 내용일지는 모르겠지만.. 전 scri
흠 프로그래밍하시는 분들께는 우스운 내용일지는 모르겠지만.. 전 script 밖에 몰라서..
일단은 jsboard 의 auto_link() 함수 입니다. 제가 만들었
지만 저도 분석을 하지 못하는 이상한 함수죠. 참고로 전
정규표현식이라는 것을 머리로 하는것이 아니라 일대일 대입
으로 작성하는지라.. 만들고 나니 저도 무슨 내용인지를 모르겠더군요. ^^;
두번째는 oops firewall 을 만들때 참조했던 firewall 스크립트였었는데, 파이프를 이렇게 사용할 수도 있구나 하는 생
각에 망치로 머리를 한대 맞았던것 같은 기분을 준 코드였습니다. 어느정도 자만감에 차 있던 제게 다시 처음부터 공부할 자세를 만들어준 코드였죠.
STRING_MATCH="ACK+ACK:80:/default.ida? ACK+ACK:25:?B?W7GksO1d"
for values in ${STRING_MASQ_MATCH}
do
value=$(echo ${values} | sed -e 's/+/ /g')
echo ${value} | {
IFS=':' read flag port string tagport
[ "${tagport}" = "" ] && tagport=dport
echo " * iptables -A FORWARD -p tcp --tcp-flags ${flag} --${tagport} ${port} \\"
echo " -m string --string \"${string}\" \\"
echo " -j REJECT --reject-with tcp-reset"
${IPTABLES} -A FORWARD -p tcp --tcp-flags ${flag} --${tagport} ${port} -m string \
--string "${string}" -j REJECT --reject-with tcp-reset
}
done
예전부터 느끼는 거지만... 김정균님께서는 아래의 문서를 꼭 한번 읽어보
예전부터 느끼는 거지만... 김정균님께서는 아래의 문서를 꼭 한번 읽어보셨으면 합니다. 워낙에 비표준이 표준인 시대라 강권하진 못하겠습니다만...
http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1738.html
그리고 두번째로, 아래의 것은 틀립니다.
이것이 맞습니다.
참고로 "" 안에 들어가는 "도 "로 대체해야 합니다.
제가 외국의 유명 php/perl 스크립트를 볼때마다 감탄하는 점은, 늘 사소한 곳에까지 철저하게 프로그래밍을 한다는 겁니다. 나중에 꼬투리 잡으려고(...) 표준 문서 들고 대조해보면, 하나하나 다 제대로 맞습니다. 사소한 URL에서부터 XHTML, CSS까지요. 그런걸 보면서 '큰물에서 노는 전국구급 스타 프로그래머란 역시 뭔가 다르구나'라는걸 느꼈습니다.
이게 아닙니다-_-;;<a href="/board.php?page
이게 아닙니다-_-;;
이것이 맞습니다.
10 play "cdefgab"오오오옷~~~ 노래가 나온다뉘~~~
10 play "cdefgab"
오오오옷~~~ 노래가 나온다뉘~~~
--;
아..옛날 8비트 IQ2000에서 했던 베이직 언어군요.그리운 시
아..옛날 8비트 IQ2000에서 했던 베이직 언어군요.
그리운 시절이네요..
용돈 모아 롬팩을 40여개 모으고...
그때부터 열심히 프로그램 했더라면 지금쯤...^^:;
하하하~~옛날 생각나네요..MSX에서 하면 3중화음까지 나왔었
하하하~~
옛날 생각나네요..
MSX에서 하면 3중화음까지 나왔었나요.. 이젠 기억도 안나내요..
^^
void main()
{
printf("Hello World\n");
exit(0);
}
/* 초심으로 돌아가자~~~~~ */
5 play"v15" 볼륨 높여주기.... ^^a
5 play"v15"
볼륨 높여주기.... ^^a
모두들 좋은 하루 되세요~
저도 여러 코드들을 보고 감동했었지만 비교적 최근의 예로는 loki의 코
저도 여러 코드들을 보고 감동했었지만 비교적 최근의 예로는 loki의 코드(Modern C++ Design이라는 책에서 설명하고 있는)를 들 수 있을 것 같습니다.
아직 제대로 이해하지는 못하고 있지만 template을 이런 식으로 사용할 수 있구나! 하는 일종의 충격을 주었구요
특히 컴파일 타임에 recursive하게 class 들을 만들어 나가는게 정말 신기했습니다. 비슷한 방법으로 compile 타임에 factorial이나 cosine의 값을 구해내는 코드들도 참 신기했구요
0010111101010010100010000101010001011111
00101111010100101000100001010100010111110101011001
11101011110111101010101000101101111101111000111110
01111110111011011010000101001010101010111010010100
11101001100100101001010101010110000001010101111101
11111000000010111111011111111011101010101010110101
Nice code^^;
Nice code^^;
처음 알고리즘 책에,재귀에 관한 소스를 봤었는데...;이게
처음 알고리즘 책에,
재귀에 관한 소스를 봤었는데...;
이게 어떻게 돌아가나 했단 생각을...;
아직도..debug 로 만들(?) 었던hello world
아직도..
debug 로 만들(?) 었던
hello world
와.. qb 로 만들었던 hello world 와..
c 로 만들었던
hello word ..
아직도 잊지 못하는 친구들 이라는 =)
뭐하는 소스지?
뭐하는 소스지?
프로그램 입문서에서 맨처음에 작성해보라고 나오는 소스...리눅스
프로그램 입문서에서 맨처음에 작성해보라고 나오는 소스...
리눅스 그냥 재미로에서도 소개된 프로그램...
ㅋㅋㅋ...
감동이라... 충격도 감동(마음이 움직이다)에 포함되니까...
감동이 맞겠네요...
/usr/src/linux/init/main.cLine 363-365
/usr/src/linux/init/main.c
Line 363-365:
ticks = jiffies;
while (ticks == jiffies);
ticks = jiffies;
나우누리에 누가 올린 글입니다. RMS의 gcc2.8.1 rtl.h중에서
나우누리에 누가 올린 글입니다. RMS의 gcc2.8.1 rtl.h중에서....
enum rtx_code {
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
#include "rtl.def"
/* rtl expressions are documented here */
#undef DEF_RTL_EXPR
LAST_AND_UNUSED_RTX_CODE};
/* A convenient way to get a value for NUM_RTX_CODE.
Assumes default enum value assignment. */
X 매크로군요.#define VAR_LIST \
X 매크로군요.
#define VAR_LIST \
X( a, b, c, 5, "ab" ) \
X( b, c, d, 10, "wr" ) \
X( p, a, z, 15, "12" )
enum VAR_ENUM
{
#define X( var1, var2, var3, var4, var5 ) var1,
VAR_LIST
#undef X
};
이런식이죠.
X 매크로 라고 부릅니다.
저도 첨으로 감동 받은건더블 버퍼링에의한 정렬..시퀀스 버퍼링에의
저도 첨으로 감동 받은건
더블 버퍼링에의한 정렬..
시퀀스 버퍼링에의한 정렬..
패스트 버퍼링에의한 정렬..
링크드 리스트 를 이용하고
2중 for문 사용하고.. 첨으로
감동했습미다..
뭐 프로그램은 예술이다를 알게해주는
간단한 예였으니까요..
물론 아직도 충분히 감동적이죠......
물론 아직도 충분히 감동적이죠......
한자어 검색기능을 만든 것이 신기했고요, MDI에서 자식폼의 정보전달로
한자어 검색기능을 만든 것이 신기했고요, MDI에서 자식폼의 정보전달로 엄청 힘들었는데 객체 상속성과 다형성을 통한 방법으로 문제를 해결했을때 참 신기했습니다.
가장 신기한 것은 처음 컴파일러를 설치하고 결과물을 실행시켰을때의 감동입니다.
궁하면 결국 답은 나오지만 그 과장에 엄청난 시간과 노력이 들어가더군요.
제게 감동을 준 소스 코드들이 너무나 많아서 무엇이 제게 가장 큰 감동을
제게 감동을 준 소스 코드들이 너무나 많아서 무엇이 제게 가장 큰 감동을 주었는지는 생각이 안나네요. 하지만, 감동을 준 것은 제가 "이해할 수 있었던" 코드들이었지, 이해하지 못하는, 또는 어려운 코드들은 아니었던 것 같습니다.
처음으로 감동했었던 코드들은 옛날 마소에 1라인 콘테스트에 나왔었던 코드들이었습니다. 아... 그런 멋진 꽁수를 부렸던 양반들은 다들 어디로 가고...
SPC-1000 에서는 비디오 메모리가 메인 메모리에 매핑되는 방식이 아니었기 때문에, 화면을 지우려면 다음과 같이 했었습니다.
10 screen 0,0,5
20 for i=0 to &h17ff
30 out i, 0
40 next i
50 goto 50
...재밌었죠. 그때의 몇몇 번지들도 기억이 납니다. &h554a 라든지 &h7c9d 같은 번지들...(아시는 분들은 기억나실겁니다.) 암튼, 위에 있는 소스가 제게는 감동적인 소스 중 하나였습니다.
아, 원 그리는 소스도 있었는데...
10 screen 0,0,5
20 for i = 0 to 3.14159 * 2
30 x = 30 * cos(i) + 128
40 y = 30 * sin(i) + 128
50 pset( x,y,1 )
60 next i
70 goto 70
였죠. 덕분에 나중에 중학교 들어가서 삼각함수는 쉽게 했습니다.
그담에 애플로 프로그래밍을 했는데, 각 스캔 라인의 주소를 메모리에 매핑하는 방식으로 복잡한 계산을 피해서 속도를 높이고자 했었지요. 애플은 머리가 굳은 고등학교 시절에 해서 그런지, 비디오 메모리 번지가 잘 기억이 안나는군요. &h8000 이었던가요.. 4000이었던가요... 나중에 한글 라이브러리 만들면서 잘 써먹었습니다. 당시, 리자 어셈블러로 GUI 시스템을 구축하는 데 써먹었었던 기법입니다. 마우스도 없이 키보드만으로 GUI를 만들고 영어학습 프로그램을 돌렸었죠. 그때가 89년 현대고등학교 전산제였나...
92년도에 한글 라이브러리를 구축하기 위해서( 이는 제가 IBM으로 프로그래밍을 시작한 첫 해였습니다. ) 공부했었던 라이브러리 소스들이 저는 감동적이었습니다. 지금은 누구라도 알고 있을법한 기법들이지만, 그때는 너무나 신선한 충격이었지요. 당시에는 이를 이용하기 위한 별별 기법들이 다 있었던 것으로 기억합니다. 그러한 기법들을 구현한 예제 소스 하나하나가 다 신선했었죠. 타이머 인터럽트 낚아채기, 키보드 인터럽트 낚아채기 등등등... 신기한것은 기계를 직접 제어하는 것이 가장 최고최강의 테크닉으로 인정받았던 시기가 바로 이때까지였던 것 같습니다.
이때까지는 인터럽트 제어, 포트번호(not TCP, IO Port) 몇번에서 뭐가 어쩌구... 해서 VGA 카드의 320*200 256color packed 모드에서 320*200 256 color 의 흔히들 X-Mode 라고 불렀던 모드로 바꾸고 하는 것이 테크닉이었던 것 같습니다. 아니면 그때까지는 그정도밖에 시야가 넓지 않았을지도 모르지요. 슬슬 클리퍼니 파라독스니 디베이스니 하는 RDBMS 이전의 XBase 제품들의 수명이 다 되어갈 때가 이때, 94년95년즈음이 아닌가 합니다.
이 때는 Fake니 하는 어셈블리 데모 소스들도 많이 보았지요. 그코드들도 감동의 연속이었습니다. 64K의 미학이라.. 마치 다시 8비트 시절로 되돌아간 것 같았습니다.
인터넷이 우리의 안방에 들어온 94년 이후로는 금싸라기같은 소스 코드들을 많이 볼 수 있게 되었습니다. 그 초기에 IJG(Independent Jpeg Group)의 jpeg Library 를 보게 되었습니다. 94년도에 처음으로 이 소스를 보게 되었는데, 그당시 객체지향에 푹 빠져 있는 상태에서 C 로 가라(가짜) 객체지향과 같은 코드을 만들어 놓은 것이 너무나도 인상적이었습니다. 이전까지는 계속 기계를 Low-level 로 제어하는 것이 최고의 테크닉인 줄 알았다가 다른 세계를 보니 정말 감동적이더군요! 재작년에 그 코드를 다시 볼 일이 있었는데,(imlib를 쓸까, jpeg library를 쓸까 선택해야 했었거든요.. 결국 imlib를 쓰기는 했지만..) 그 때도 정말 대단하다고 생각되었었습니다.
Apache 같은 소스도 나름대로 감동적이었습니다만, 프로그램의 크기가 워낙에 크고, 보면 볼수록 많은 시간이 소요되면서 "야, 이거야~!" 라고 무릎을 탁 칠 수 있는 그런 것은 아니더군요. 오히려, 그러한 것들을 하나씩 봐 나가는 제가 더 감동적이었습니다. ^^;
어쨌든, 제가 가장 감동했었던 코드들은 누군가 봤으면 하찮았었을 그런 코드들이었습니다. 그러한 코드들.. 프로그래머라면 하나씩을 다 가지고 있지 않았을까요? 어렵고 거대한 코드들보다는 내가 이해할 수는 있지만, 생각해내지는 못했었던 그런 코드들이 더 자신에게는 예쁜 소스였던 것 같습니다.
좋은 하루들 되세요.
ps: 글을 쓰고 나니, 간단하게 끝내려던 글이 장문이 되어 버렸습니다. 게다가 자기자랑으로 첨철된 글 같군요. 하지만, 지금까지 타이핑한게 아까와서 지우지는 못하겠네요. ^^;a "나를 감동시킨 소스코드"라는 제목이 마치 마법같습니다. 토론글이 아닌 잡담+자랑글을 쓰고도 옛 생각에 마음이 기뻐졌습니다. 스트레스 해소게시판도 아닌데 괜히 기분이 좋군요. 토롱 제창자이신 BK2 님께 감사...
모두들 좋은 하루 되세요~
마소의 1라인 콘테스트라.. 제가 중.고등학교 때 응모한 적이 있습니다.
마소의 1라인 콘테스트라.. 제가 중.고등학교 때 응모한 적이 있습니다.
가지고 있던 트라이젬을 가지고 애플 호환기종으로 했었죠.
베이직 한 문장으로 "애플 기종에 펑션키 구현"과 "모니터 모드에서의
체크섬 출력 프로그램"으로 당선된 적이 있습니다.
당시 해외의 "바이트"라는 잡지에서 먼저 시작되었던 거 같은데.
주로 어셈블리 코드를 문자열에 넣고 실행하는 방식을 애플 호환 기종에서는
많이 사용했었습니다.
여담이지만 당시 플로피 드라이브를 거금 15만원에 샀던 기억도 납니다.
아마두.. &hb800 이 아닌가 싶네요. ^^;;
아마두.. &hb800 이 아닌가 싶네요. ^^;;
저랑 비슷한 초창기를 거치셨던듯.. 전 중학교 올라가며 애플을 만졌는데요
저랑 비슷한 초창기를 거치셨던듯.. 전 중학교 올라가며 애플을 만졌는데요.
(비디오 메모리는 $2000에서 $3fff 까지, $4000 에서 $5fff 까지 각각 한페이지씩일겁니다.)
학교에선 spc-1000 이 있어서 올리신 코드가 이해가 되네요.
그때 원그리는 소스를 처음 보며 sin 이랑 cos 함수에 대해 저놈들은 무언가
궁금해했던 기억이 나네요.. 원라인 콘테스트에 저도 출품한다고 당시
뭔가 만들던 기억이 나는데,원라인으론 아무래도 잘 안 돼서 나중에
좀 길게 꾸며서 다시 마소에 보냈는데 아무 연락도 없더군요. -_-;
제 경우에는 워즈니악이 만든 애플의 베이직 인터프리터 코드 (롬에 탑재된
형태로 공급되는) 를 한줄씩 분석하며 코딩 방법에 대해 충격 같은걸 처음
느꼈습니다.
재미있는 꽁수(?) 랄까 그런것도 많았죠.
점프를 하는데 op code 의 중간쯤으로 하게 해서 전혀 엉뚱한 명령이
수행되도록 하는 식의 최적화랄까.. 암튼 어셈블리가 아닌 기계어 코드를
절묘하게 사용하는 여러가지를 배웠었죠.
그때만 해도 어셈블러가 없어서 (디스크 드라이브가 없었음),기계어코드를
핸드어셈블 하는 시절이었는데 sta (store acc) 명령이 8d 라는게 아직까지
기억이 나는군요. -_-;
몇년쯤 있다가 황인창씨의 테이프 어셈블러가 마소를 통해 나오게 되는데
이때는 감동이라기보다는 내가 먼저 만들수 있었는데 하는 아쉬움이 들더군요.
다음으로 충격이랄까 감동이랄까를 느꼈던게 알고리즘적인 측면에서였는데,
그래픽 에디터를 만들면서였습니다.
원이나 상자, 이런건 쉽게 만들수가 있었죠.
가장 문제가 되었던게 폐곡선 내에 빼곡하게 색 채우는 함수 Paint 를 아무래도
구현을 못 해서 머릴 엄청 썩이다가 결국 포기하고 말았죠.
나중에 되부름 (recursion) 을 이용해서 아주 간단하게 페인트 알고리즘을
마소에서 구현할걸 보게 되었는데,이때 세상엔 머리 좋은 사람들이 정말
많구나 이런걸 느꼈나봅니다.
사실 당시에 전 꽤나 건방져서 충분한 시간만 주어지면 어떤 종류의 프로그램
이라도 (제가 울티마 4인가를 하던 때였는데),울티마 같은 게임도 한 몇달
머리 썩이면 만들수 있어라고 생각하던..그런 때였는데 나중에 플라이트
시뮬레이터를 보고 그런 자신감마저 완전히 날아가버렸죠.
수학을 잘 해야 프로그래밍도 잘 하겠구나 하는걸 그때 느꼈죠.
알고리즘 처음 공부할때였는데요.Maximum Subsequence 구
알고리즘 처음 공부할때였는데요.
Maximum Subsequence 구하는 문제의 O(n) 알고리즘이었는데,
정말 보고 놀랬었습니다.
SPC1500 으로 첨 컴퓨터를 만졌는데...basic 으로 프로그래
SPC1500 으로 첨 컴퓨터를 만졌는데...
basic 으로 프로그래밍(???)을 시작했죠~
거기서.. 물론 hello,world 출력도 기억에 남지만,
행번호를 10, 20, 30, ... 꼭 이렇게 안하고
100, 200, 300, ... 이렇게 해도 프로그램이 제대로 돌아간다는 것을
알았을 때~! ^^;;;
(왜...? 왜... 이게 감격스러웠는지는 모르겠지만... ^^;;;)
암호에 가까운 리눅스 커널 소스천재들이닷!!
암호에 가까운 리눅스 커널 소스
천재들이닷!!
중1때 (10년도 전이군요..)hello world 를 찍으려면
중1때 (10년도 전이군요..)
hello world 를 찍으려면 printf 를 쓴다는 걸 알고
- Made By XXXX(My name) -
나오게 하는 프로그램? 짯을때..
#include
void main(void)
{
printf("- Made by XXXX - \n");
}
^_^
읽다 보닌깐..c 처음 배울때 생각이 나네요..hello worl
읽다 보닌깐..
c 처음 배울때 생각이 나네요..
hello world 프로그램이었는데...
자꾸 에러가 나더라 고요..
나중에 알고 봤더니.. .....앞에 인덱스는 안쓴다는걸 ^^;;
1 #include
2 void main()
3 {
4 printf("hello world\n");
5 }
이런적이....
오래된 K&R의 모든 예제들... 그땐 참 감동이었는데... 흐
오래된 K&R의 모든 예제들... 그땐 참 감동이었는데... 흐
k&R 소스 예제는 어디서 볼 수 있나요?갈켜 주세요~
k&R 소스 예제는 어디서 볼 수 있나요?
갈켜 주세요~
The C Programming Language, Second Editi
The C Programming Language, Second Edition
by Brian W. Kernighan and Dennis M. Ritchie.
Prentice Hall, Inc., 1988.
http://cm.bell-labs.com/cm/cs/cbook/
전 지금 봐도 감동적이던데... :-)
전 지금 봐도 감동적이던데... :-)
학교에서 OS배울때 맨날 봤던 Nachos 소스 코드. 이거 정말
학교에서 OS배울때 맨날 봤던 Nachos 소스 코드.
이거 정말 예술의 경지다.
C++로 mips를 그대로 에뮬래이션 한것이 아무것도 모르던
그 시절에는 정말 쇼킹했음.
동감합니다.저는 Java version의 Nachos 5.0j로 했었
동감합니다.
저는 Java version의 Nachos 5.0j로 했었는데요....
그렇게 빠르게 소스코드가 이해된 경우가 없었습니다...-_-
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
처음 recursion을 배우고 하노이의 탑을 단 몇줄로 구현해 놓은 것
처음 recursion을 배우고 하노이의 탑을 단 몇줄로 구현해 놓은 것을 보고 recursion은 Programming ART라고 생각했음...
예전에 자료구조 배우면서하노이를 recursion 쓰지 않고 하는 숙
예전에 자료구조 배우면서
하노이를 recursion 쓰지 않고 하는 숙제가 있었는데...
그문제 풀면서 고민했던 게 생각나네요...^^
recursion이 개념적으로 쉽기는 하지만
또 많은 문제들이 recursion을 쓰지 않고도 해결 가능하지요...
나를 감동시킨 메일링http://lists.ximian.com/mai
나를 감동시킨 메일링
http://lists.ximian.com/mailman/listinfo/mono-list
주소가 잘못된것 같네요. http://lists.ximian.com/
주소가 잘못된것 같네요.
http://lists.ximian.com/archives/public/mono-list/
JAVA J2EE 블루프린터 문서중에 있는 Pet Store^^
JAVA J2EE 블루프린터 문서중에 있는 Pet Store
^^
페이지