'Programming/C'에 해당되는 글 22건

  1. 2008.01.24 오늘 할짓 없어서 한 뻘짓. 4
  2. 2007.07.01 메모리 직접 접근의 유용성 (memcpy) 3
  3. 2007.06.28 리눅스에서 2기가 이상인 파일에 접근하기 4
  4. 2007.05.25 Mpd 싱크 가사....... 프로그램 8
  5. 2007.05.11 간단한 양방향 linkedlist 6

오늘 할짓 없어서 한 뻘짓.

사용자 삽입 이미지

Rss에서 신비로 게시판 올라온 자료들 확인할수 있게 conky에 추가!

(실시간 다운을 위해서??)

일단 그냥 따로 실행파일 만들어서 설정파일에서 따로 명령을 실행시키게 만들어놨다

execl인가  뭐 그걸로..

음.....C로 했는데 다해놓고 보니까 그냥 쉘 스크립트로 할수도 있겠구나 싶었다..

(맞다! curl도 있구나!)

wget으로 받은다음 sed같은거 써서 출력하게 해도 됬었을 텐데

괜히 소켓쓰고 파일받고 문자열 파싱한다고 뻘짓했다..............

(뭐 로케일 변환 빼면 전에 다 만든거라 새루 한건 별루없;;)

그러고보니,,,,,,,,아 오늘이 아니고 인제 어제구나...........

포스팅은 해야겠고 올릴글은 업ㅂ어서 ...

메모리 직접 접근의 유용성 (memcpy)


Before
전형적인 막장짓..
초기화 -> 거꾸로 값 받아서 배열에 삽입 -> 포맷에 맞게 sprintf를 써서 -> 문자열로 만들고
-> 그걸다시 sscanf써서 -> 정수로 변환후 -> 리턴..
unsigned int  atox(char *string)

     unsigned int ret;

     sscanf(string,"%x",&ret);

    return ret;
}

 unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int i;
    char temp[size * 2 + 1];
    unsigned char dt[size];
    temp[size * 2] = '\0';

    for(i = 0;i < size;i ++)
        /* 리틀 엔디언 */
        dt[size - i - 1] = *(segment + offset + i);

    if(size == 1)
        sprintf(temp,"%02x",dt[0]);
    else if(size == 2)
        sprintf(temp,"%02x%02x",dt[0],dt[1]);
    else if(size == 3)
        sprintf(temp,"%02x%02x%02x",dt[0],dt[1],dt[2]);
    else if(size == 4)
        sprintf(temp,"%02x%02x%02x%02x",dt[0],dt[1],dt[2],dt[3]);

    return atox(temp);
}

After
몰라 걍 직접 집어넣어 버려....; 왜 진작 이걸 생각 못했을까?
역시 메모리에 직접 접근해서 하는게 더 편하다.
unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int ts = 0;
  
    memcpy(&ts,segment + offset,size);

    return ts;
}

비슷하게 잘 작동하는듯 하다.... 좀 이상한가... 바꾸고 나니 왠지 불안하다...
값은 제대로 찍히는거 같은데.................

아 size가 클경우 overflow가 일어날수도 있을거 같은데.. 그거 처리도 해야하나?
근데...귀차나연...ㅋ

리눅스에서 2기가 이상인 파일에 접근하기


도스 테이블을 만지작거리는중.

이상하게 값들이 제대로 안들어가는거 같아서.. long long 의 형까지 써보면서 삽질을 해봤지만

안되길래 구글링.... 한 결과

"open,lseek,fopen같은 함수는 2G정도의 파일만 접근이 가능하다.."

는 걸 알아냈다..............

아마도  off_t 값의 범위 때문에 그럴지도?

해결방법은

open64,lseek64처럼 직접소스에 64를 추가시켜주거나

(이때는 따로 인클루드파일을 추가시켜주거나 OR   DEFINE을 해줘야하는듯)

D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

를 Gcc컴파일할때 추가해주면 된다  (gcc 버전 3.4부터 된다는 말이 있는데?)

이리하면

/dev/hda같은 대용량 파일(?) 도 잘 처리가 된다..

Mpd 싱크 가사....... 프로그램

이딴거 올려봤자 별루 보는사람도 얼마 없겠지만뭐.........

두번째 프로젝트(?) 인 주2>MPD 용 싱크가사 프로그램을 대충~ 완성했다.........

일단 되는 기능은 잘 된다.... 내부적으로 고칠건 좀 있는데....... 안그래도 잘 작동하는데 고치기는

귀찮고 해서 현재 놀면서 방치중~~~ 귀차나~ 귀차나~ 어디 딴짓이나 해볼까~ 하고 있는.............

이거에 대해서 간단히 설명하자면 원래 랜덤여신님이 만든 주3>amarok-live-lyrics

가 있는데.. 그 프로그램에 서버로부터 가져오는 주소값만 살짝 내 프로그램으로 받게 해서 만든것!

사실 "구태여 이렇게 따로 프로그램을 만들지 않더라도"

저 amarok-live-lyrics의 내용만 약간 바꾸면 (주4>dcop 대신 주5>mpc를 써서 한다던가............)

mpd용으로 사용할수 있건만............ 만들어본,........

주6> conky에서 주7>파이썬 안써보고 프로그램 만들어보려고요...

 또.......어짜피 배우는 입장이기도 하고........ ,c언어 예/복습도 할겸................ )

대략 프로그램 구조가......

mp3파일을 읽어 망할놈의 태그 를 건너뛴 만큼 읽는 위치를 이동한다

-> 일정부분을 읽어서 md5 Hash(?) 한다

-> md5한 값을 바로슬 서버의 주소와 합쳐서  -> 주8>소켓써서 서버로부터 페이지를 받아온다

-> 새로운 가사 파일에 그 내용을 저장한다 -> 저장한 내용을 불러와서 메모리에 저장

-> 가사/시간 분리 -> 링크드리스트로 정리 -> 타이머써서 -> (시간에 맞춰) 출력하기.....

-> 에러있음 break -> 그리고 쭉~ 반복~.

아직 주9>터미널 전용(!) 프로그램이라 사용자 인터페이스는 정말 할말이 없다

(이부분에서만 보면 완존 쓰레기다 ; 그래서 주10>공개를 못하겠어용 ㅜ)

아직은 계획이 없지만... 뭐 필요하면 Gtk용 프로글햄으로 바꿀 생각도 있긴한데 귀차나서...

하지만! amarok-live-lyrics 보다 좋은건 딱 하나있다...... 주11> mutagen

을 쓰지않고 자체적으로 mp3파일을 분석해서 태그를 무시하기때문에.. 싱크가사 인식성공률이

amarok-live-lyrics보다 높다..........는거 정도...

(amarok-live-lyrics는 서버에 가사가 있는데도 불구하고 태그위치를 제대로  감지를 못해서

md5값을  잘못얻어오는 경우가 몇몇 mp3파일에서 발견되었었다........

모르겠다 요즘에 버젼업 되어서 고쳐졌는지...... )

주1>지워졌다 ㅋㅋ.

주2>MPD : Music Player Demon 일겁니다.. 내기억으로는.. 데몬이기때문에 재부팅을하거나
일부로 종료시키지 않은한 음악이 멈추질 않죠! 저는 가끔씩 X 를 재시작하는데 그때 음악이 끈겨서
참 안타까웠던차 이프로그램을 jazzbug님의 추천으로 사용하게 되었죠.......
괜찮네요.. 좋아요...근데 지원되는 파일 포맷이 mp3,ogg정도 밖에 없는게 단점..
망할 wma는 재생이 안돼ㅜㅜㅜㅜㅜㅜ

주3>amarok-live-lyrics 
랜덤여신님이 만든 live-lyrics 다음 링크를 참조해주세요.
http://barosl.com/blog/entry/amarok-live-lyrics

주4>dcop :amarok이 이거 쓰던데...... 이거쓰면 amarok이 플레이중인 시간,전체시간,곡이름등을 알수 있다
dcop amarok default 뭐시기.. 이런식으로 썻던거 같은데.. 지금 amarok을 실행시키고 있다면 함
해보시길어플의 상태를 알수 있게 해주는 뭐 그런 녀석인가부다......... 더이상은 모르겠삼..
gtk어플(?) 쪽에도 이런게 있던거 같긴함.

주5>mpc : Music Player Client 인가.. 그래요..

주7> conky
에서 주8>파이썬(python) 이가 메모리 젤많이 먹는거 보면 기분이 상당이 뭐하다(?) 그래서 파이썬
안쓰고 만들려다보니......

주8>소켓 : 이녀석도 기억이 안나서 혼자서 만들다가 몰라서 걍 소스 보고 몇줄 복사붙여넣기 했어요 ㅜㅜ

주9>터미널 전용(!) 프로그램 : 아시려나 모르겠지만 본인은 터미널 프로그램을 매우 사랑! 스러워한다..

주10>공개를 못하겠어용 ㅜ
그리고 우리나라에서 MPD를 쓰는 사람이 몇이나되겠으며( 아니 아는 사람이나 몇이나 될까! )
, 호좁한 인터페이스를 가진 이 터미널 프로그램을 쓸사람은 몇이나 되겠으며......
그래서 공개를 못하겠어욤...

주11> mutagen
파이썬 라이브러리라...물론 이 플그램은 C언어니까 쓸수 없기도 했고 또 c언어용 태그 라이브러리(id3lib인가?)가 존재는 하나 파일을 복사해놓고 거기서 다시 태그를 읽어오고 해야했기 때문에 비효울적인거 같기도 하고(mutagen을 쓴 amarok-live-lyrics도 그렇다..) 
사실 뻘짓할 시간이 아까우니 원래 이런 라이브러리를 쓰는게 이익이겠지만...
공부도 함 해볼겸해서  걍 내가 뻘짓해가면서 만듦

간단한 양방향 linkedlist

 
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 struct node
 5 {
 6     struct node *backward;
 7     int data;
 8     struct node *forward;
 9 };
10
11 struct node* create_node(int i)
12 {
13     struct node *new_node          = NULL;
14     static struct node *old_node   = NULL;
15
16     new_node = (struct node *)malloc(sizeof(struct node) * 1);
17
18     new_node -> backward     = old_node;
19     new_node -> data            = i;
20     new_node -> forward        = NULL;
21
22     /* 첫번째 노드가 아니라면 전노드가 있는 곳의 주소를 준다 */
23     if(old_node != NULL)
24         old_node -> forward = new_node;
25
26     old_node = new_node;
27
28     return new_node;
29 }
30
31 /*me_free <= Header*/
32 void free_node(struct node *me_free)
33 {
34     while(me_free -> forward != NULL){
35         me_free = me_free -> forward;
36         free(me_free -> backward);
37     }
38
39     free(me_free);
40 }
41
42 int main(void)
43 {
44     struct node *head  = NULL;
45
46     head = create_node(1);
47     create_node(2);
48     create_node(3);
49     create_node(4);
50
51     printf("node 1 : %d\n",head -> data);
52     printf("node 2 : %d\n",head -> forward -> data);
53     printf("node 3 : %d\n",head -> forward -> forward -> data);
54     printf("node 4 : %d\n",head -> forward -> forward -> forward -> data);
55     printf("moving : %d\n",head -> forward -> backward -> data);
56
57     free_node(head);
58
59     return 0;
60 }

간단한 linkedlist 당장 쓸때가 있어서

"아무것도 안보고 스스로 처음" 으로 만들어 봣다...

1년반전만해도 linkedlist짜는데 못짜가지고 막 배껴가갔던게 생각이 나네 ㅋㅋ

뭐 암튼간데  잘 작동하는듯하는데.. 글쎄 확실힌 모르겠다..

뭐낙 실수가 많아서..

일단 memory-leak은 안생기는거 같지만....

뭐누군가가 구글링을 하거나 해서 학교 숙제 도움이나 될까..

뭐 틀리다고 해도 내책임은 없다,.. =3 (이블로그에있는 모든 자료가 마찬가지!)

--07-5-12-1시 30분 더 알아보기 쉽게 수정--
prev 1 2 3 4 5 next