'Programming'에 해당되는 글 58건

  1. 2008.06.01 플로피 디스크 이미지를 만들어서 mount하자! 5
  2. 2008.03.11 ctags 설정 4
  3. 2008.02.28 gethostbyname 의 세그멘테이션 오류 2
  4. 2008.02.20 Mplayer로 workspace이동하기 2
  5. 2008.02.14 [쉘스크립트]자막파일 이름 안바꾸고 애니보기 4

플로피 디스크 이미지를 만들어서 mount하자!

뭐 찾아보면 이런프로그램 있을거 같지 말입니다..

그것도 아니면 그냥 이미지 자체를 다운 받거나 ㅋ

하지만 그냥 작년에 배운 fat파일 시스템 연습하는겸,

디스켓이미지가 필요한일도 있어서 함 만들어 봤어요 ㅋ
/*
* =====================================================================================
*
* Filename: main.c
*
* Description: 플로피디스크 이미지 만들어주는 프로그램
*
* Version: 1.0
* Created: 2008년 05월 31일 21시 41분 41초
* Revision: none
* Compiler: gcc
*
* Author: first_name last_name (fl), fl@my-company.com
* Company: my-company
*
* =====================================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

/* define data type */
#define BYTE unsigned char
#define DBYTE unsigned short int
#define DWORD unsigned int /* 음 따지자면 틀린건가? ㅋ */

/* floppy disk spec */
#define FLOPPY_DISK_SIZE 1474560 /* */
#define BASIC_BUFFER_SIZE 1024
#define FLOPPY_INIT_COUNT 1440

/* for dos-table */
#define MSDOS_SIANATURE 0x55,0xAA /* */
#define MSDOS_SIANATURE_LOCAL 0x1fe

/* for fat12 */
#define INT_ETC_VAL 0xF0,0xFF,0xFF /* */

/* floppy disk write */
typedef struct _floppy
{
/* bit write */
unsigned init_jump:8*3;
char ipl_name[8];
DBYTE byte_per_sector;
BYTE sector_per_cluster;
DBYTE reserved_sector_count;
BYTE num_fats;
DBYTE boot_entry_count;
DBYTE total_sector_12;
BYTE media;
DBYTE fat_size12;
DBYTE sector_per_track;
DBYTE number_of_heads;
DWORD hidden_sector;
DWORD total_sector_32;
BYTE drive_number;
BYTE reseved1;
BYTE boot_signature;
DWORD volume_id;
char volume_label[11];
char file_system_type[8];
/* not padding ! */
} __attribute__ ((packed)) Floppy;

void init ( int fd )
{
char buffer[BASIC_BUFFER_SIZE] = {0x00};
int i;

for(i = 0;i < FLOPPY_INIT_COUNT; i ++)
write(fd,buffer,sizeof(buffer));

} /* ----- end of function init ----- */

void write_ipl( int fd )
{
Floppy fda;

memset((void *)&fda,0,sizeof(fda));

fda.init_jump =0x904eeb;
memcpy(&fda.ipl_name,"LowidIPL",8);
fda.byte_per_sector =512;
fda.sector_per_cluster =1;
fda.reserved_sector_count =1;
fda.num_fats =2;
fda.boot_entry_count =224;
fda.total_sector_12 =2880;
fda.media =0xf0;
fda.fat_size12 =9;
fda.sector_per_track =18;
fda.number_of_heads =2;
fda.hidden_sector =0;
fda.total_sector_32 =2880;
fda.drive_number =0x00;
fda.reseved1 =0x00;
fda.boot_signature =0x29;
fda.volume_id =0xffffffff;
memcpy(&fda.volume_label,"LowidFLOPPY",11);
memcpy(&fda.file_system_type,"FAT12 ",8);

lseek(fd,0,SEEK_SET);
write(fd,&fda,sizeof(fda));
} /* ----- end of function write_mdr ----- */

void write_signature ( int fd )
{
char init_byte[3]={INT_ETC_VAL};
char msdos_signature[2]={MSDOS_SIANATURE};

/* for msdos */
lseek(fd,MSDOS_SIANATURE_LOCAL,SEEK_SET);
write(fd,msdos_signature,sizeof(msdos_signature));

/* for fat12 what? 0x200? ,0x1400? */
lseek(fd,0x200,SEEK_SET);
write(fd,init_byte,sizeof(init_byte));
lseek(fd,0x1400,SEEK_SET);
write(fd,init_byte,sizeof(init_byte));
} /* ----- end of function init_000200 ----- */

int main ( int argc, char *argv[] )
{
int fd;

if( argc != 2 ){
fprintf(stderr,"만들 디스크 이미지명을 입력해 주세요\n" \
"Useage : %s create_filename\n",argv[0]);
exit(EXIT_FAILURE);
}

if( ( fd = open(argv[1],O_EXCL | O_CREAT | O_WRONLY,00644)) == -1){
perror("파일 열기 실패");
exit(EXIT_FAILURE);
}

init(fd);
write_ipl(fd);
write_signature(fd);

close(fd);

return EXIT_SUCCESS;
} /* ---------- end of function main ---------- *


별 주석달것도 없습니다..



fat파일 시스템만 안다면 별 문제 없을듯.


이거 자세한 정보는 한빛문화사 홈피에서 fat치면 아마 나올거에요

제가 작년인가 포스팅할때 주소도 적어놨었는데 ㅋㅋ

거기가면 기본값이랑 범위같은게 상세히 공개되어있어요..

그대로 프로그래밍 하면 되니까 정말 어려울것도 없다는..

소스바연.. 값들 넣는거 때문에 그렇지 별 내용은 없는겁니다

이 약간 내용이 있기는 합니다.


구조체에서 bit로 선언하는거 - (ex>unsigned bla:1; ->이건 1bit - one or zero)

bit 선언에서는 int,unsigned 밖에 없지 말입니다....

위에 상황같은데 쓰는거보단 bool형 같은거 쓸때 좋죠..


또 padding 없는 구조체 (물론gcc, 윈도우에선 #progma로 하던가요? )

ex> __attribute__ ((packed)) Name;

다 아시겠지만 구조체를 sizeof하면 원래 크기가 다르죠. 4byte(cpu에 따라 다르겠지만) 마다 할당하니까요

위에 ipl만들때는 바이트수 철저히 따져서 입력해야하기 때문에 저렇게 쓴것이지만요.


사용법 $./filename image_name
마운트법 $mount -o loop image_name
확인 $df -T

그리고 플로피디스크 쓰듯이 쓰면댐



마운트후 디랙토리 만들기 삭제 파일생성.. 잘되네요 ㅋㅋㅋ

리눅스는 디바이스도 파일처럼 다룰수 있어서 편하지 말입니다~
(뭐 지금의 경우는 반대지만)

덧> 요즘에는 시간이 좀 남지 말입니다~ 그래서 학기중에 못했던(중간고사 끝날때부터 딱 저번주 까지 정말 바빳던..ㅋ)
포스팅도 좀 자주(?) 하는데...

다음주부터 또 시험크리때문에 포스팅을 제대로 할수 있을지 의문이에요 ㅜㅜ

추가> qemu -fda 옵션 붙이면 qemu가 죽습니다? 우아아앙~ 왜이래?? boot jump code가 잘못?

ctags 설정



<어라 새로운 플긴이네요...... 몰랐네....... 이거함 적용 ㅋ>
리눅스 커널 프로그래밍(IT EXPERT)(CD1장포함) 상세보기
한동훈 지음 | 한빛미디어 펴냄
리눅스 실무서. 이 책은 리눅스 커널 프로그래밍 환경 구축부터 커널 컴파일 개발법, 리눅스 시스템 호출과 모듈 프로그래밍 방법, 문자 디바이스 프로그래밍과 블록 디바이스 프로그래밍, 메모리 관리와 프로세스 관리 등의 내용을 담았다. 부록 CD에는 본문에서 사용한 예제소스와 커널 2.4.32 소스와 커널 2.26.14.6 소스, 데비안 리눅스 최소 설치 버전, VMWare 이미지 및 플레이어가 수록됐다.


리눅스 커널 프로그래밍이란 책을 보고 있습니다

커널책중에 이게 젤 만만해 보이더군요 ( 쉽다는 말이 아니라 그중에서............)

뭐 암튼.;; 근데 앞부분에 ctags를 설정하는 부분이 있길래(csope,tlist는 사용하지만 이건 처음) 122 page..........

따라서 해봤는데 제대로 안되네여..

일단 커널소스있는데서

ctags -R

을 한뒤에 검색...

일단 tags 가 있는데서
vim -t task_struct

하면 잘되는데 그안(vim)에서

:ta mm_struct 하면 안되는겨 -_- 그래서 구글도 찾아보고 하니까 답이 나오네...

~/.vimrc에다가

set tags=./tags,tag파일이있는작업디렉토리/tags,.............. "여기 set tags를 아예 안적으면 ctags가 제대로 작동 X

라는 식으로 tags파일을 "절대경로" 로 정해줘야 하네요.. 직접 저 태그파일의 경로를 말이에요..

그러니까 control + ] 도 잘 동작하네요 ㅋ

<대충 요약> 자세한건 :help tags (이겟죠뭐)
control + ] => 현제 커서위치에 해당하는 자료구조로 이동
control + t => 좀전의 위치로 이동
:ta XXX     => tag파일에서 XXX 검색
:ta /XXX    => tag파일에서 XXX 포함하는것도 검색
:tj XXX     => 2개이상이면 ls처럼 list 출력
:tn,:tp      => (tag)next,prev
tags        => History list

아나 설정파일 같은거 할때 책에 이런거좀 적어주지 칫.,. 데뱡이나 펫호라아님 무시하는 건가효??

우리 아치는 머셈??

내가 만드는 호좁한 기껏해야 천줄안팍인 프로그램은 이딴거 별 필요 없었는데....... 확실히 커널크기가 크니까

이런것도 필요한듯하네요

음......글구 스터디할분이랑 같이 수요일날부터 하기로 했는데 같이할님이랑 못만나겠네요......

일단 혼자서라도 해야...............

.......................학과 공부 대충하고 이거 해도 되려나........

덧> tags파일이 자주 수정된다면 걍 crontab에 등록시켜 버려도 될거 같다 알아서 갱신하게 ㅋ

학교땜에 바빠서 제대로 건들일수가 없네여 ㅜㅜ

gethostbyname 의 세그멘테이션 오류

이것도 제목이 풰이크가 되네요 적어 놓고 보니 -_-;............

몇달전에 만든 소켓라이브러리

(라고 해봤자 전 프로그램에 썻던 소스코드 모음.. 지금은 bind,connect등 함수 순서조차도 기억이 안남..)

를 써서 GET 으로 인터넷 웹페이지를 긁어오는 짓을하고 있었는데요...

자꾸 gethostbyname 함수 에서 세그먼트에러가 나는 바람에 왜그런가 했는데..

(gdb가 여기서 난다고 했다! 난 이녀석을 철석같이 믿었것만! )

그래서 여기만 뚫어져라 쳐다보고 있었는데 라이브러리에서 오류 먹은걸 나보고 어쩔???

하다가 중간에 에러메세지를 자세히!(전 까진 대충,..) 보니까 malloc어쩌구~ 라고 나오길래..

(gethostbuname 함수내부 에서) 이걸 동기로 해서...

분명히 그럼 네 소스어딘가오류가 있겠지하고서 뒤저보니까..................

원인을 찾았다... !!!

"서버에 보내는 정보가 잘못되서" 였다 "Cokie:" 이렇게 한번만 해야할걸 "Cookie: Cookie: " ... 이런식으로 보내서..

그럼 오류가 날려면 send함수에서 나야지 왜 여기서 나는지 도저히 이해할수가 없다....

gethostbyname은 그냥 DNS주소를 IP주소로 변환해주는 기능밖에 하지 않는데...

가 아니라..................;

이건또 뭥미?? 중간에 malloc size를 잘못 정해주어서 였네요..

할당할 메모리 크기를 리턴해주는 함수가 있었는데.. 거기서 크기를 잘못 리턴해 주는 바람에

(필요한 크기보다 더 작게 할당해서 쓰는범위가 할당한범위를 넘겨버렸어요.......; )

전혀~ 상관 없는 gethostbyname 함수가 세그먼트 오류를 먹으면서 뻣어버린것.........

제대로 free,malloc을 못하면 세그먼트 오류가 난다고 하는데.. 실제로 이런거 겪어보긴 처음이라...

(free도 아니고 malloc이...free는 많이 격어 봐서 적응이 되지만..)

소켓을 건들땐 valgrind가 느려서 안썻더니만.. 이런 문제가 발생하네요...

(에뮬레이팅을 하다보니 소켓같은건 좀 느린가 보다......)

소켓같은 데서도 valgrind를 사용할수 있었으면 좋겠네여........

 뭐 제가 방법을 모르는거 겠지만요.... 누구 아는 분 댓글점...

'Programming > Networking' 카테고리의 다른 글

소켓shutdown..DomainName<->IP  (0) 2006.07.18
TCP/IP 추가 and UDP /IP  (0) 2006.07.18
소켓 프로그래밍 part 2~4 TCP/IP  (4) 2006.07.15
열혈강의 TCP/Ip Socket Programming --Part 1  (1) 2006.07.06

Mplayer로 workspace이동하기

제목은 낚을려고한 반쯤은..........풰이크고.
사실은 mplayer의 파이프에 대해서...

뭐 이런거 없어도 그냥 워크스페이스 이동으로만으로 사라지게 할수 있습니다만..
그것도 아니면 아예 종료해버리던가요 (mplayer에서는 q를 누르면 종료가 되죠..)
하지만 그것을 막기 위해서 아래의 스크립트를 사용하는 겁니다..
긴급상황을 넘긴후에는 나머지 동영상을 끝까지 즐기세요!(뭔가 이상해..)

준비물 fluxbox,mplayer
뭐 fluxbox 가 없다하여도.... 대부분의 윈도메니져가 비슷한 기능을 제공할겁니다 그건 알아서 하시고..
전 일단 플빡을 쓰므로 플빡을 기준으로 하겠습니다..
미리 말하지만, 오타는 좀 이해를..
그리고 스크립트는 진짜 간단합니다 몇줄안되죠!

중요한것은 MPLAYER가 PIPE 입력을 지원한다는 점입니다..
시실 이거 하나만 알면 됩니다.. 아랬건 별 필요가 없어요..
DBUS 같은걸로 할줄 알았는데 아니네요,, 다행이어라..

~/.bashrc
 
# export 안하려면 일일히 경로를 지정해 주세요.
export MPLAYER_PIPE_PATH=/tmp/mplayer_pipe

function mp()
{
    if [ ! -e "$MPLAYER_PIPE_PATH" ];then
       mkfifo "$MPLAYER_PIPE_PATH"
    fi

    # -input file=.. 이걸로 파이프 경로를 적어줍니다..
    mplayer -channels 6 -input file="$MPLAYER_PIPE_PATH" "$@"
}

파이프에 메세지를 전달합니다.. 자세한 내용(옵션애 대한) 것은
구글에서 mplayer slave라고 검색하면 좀 나옵니다.
~/bin/screen_hide.sh

# 없앨수도 있을까나..
mplayer_pid=`pgrep mplayer`

if [ "$mplayer_pid" !- "" ];then
    echo "pause" > "$MPLAYER_PIPE_PATH"
fi

이건 플빡전용이라.. 플빡 쓰시는분 아니면 별 신경안써도 되실듯.. 물론 workspace는 2개이상이여야 하겠죠..
대충 내용을 설명하자면 MacroCmd라는건 {A} {B} {C} 이런식으로 명령을 주어진대로 실행하는 겁니다.
여기서는 alt_R 키를 누르면 해당 스크립트를 실행후에 workspace를 딴대로 돌려버리는거죠.
~/.fluxbox/keys

Alt_R :MacroCmd {Exec /home/$USER/bin/screen_hide.sh} {NextWorkSpace}

이러면 오른쪽 alt키로 "긴급한 순간" 에 화면을 확 돌려버릴수 있습니다..
동영상은 그대로 멈춤채로요.(이게 중요함!)
윈도에서 XXX 같은 프로그램보다 화면이동이 빨라서.. 순발력만 뛰어나면 잘 감출수 있을겁니다.

이걸 조금만 응용한다면 외부에서 현재 실행중인 mplayer의 정보를알수도 있으며
접근(멈춤이라던가) 도 가능합니다..

뭐...................... 이거 특별히 포스팅할거리는 아닌거 같지만..
글안올리는거 같기도하고 mplayer slave에 대한 것도 없길래 걍 함 올려보는 겁니다..

추가>
1, 구글링 무섭네연.. 십분바께 안됬는데 봇떠서 내페이지 맨위에 올라있는 후덜덜.
2 저 스크립트에 버그좀 있는데................ 에이 몰라연 알아서 고치셈.

[쉘스크립트]자막파일 이름 안바꾸고 애니보기


 한  보름정도 써봤는데 제대로 작동 잘  하는거 같군요..

그래서 한번 소스 올려봅니다..

간단히 소게 하자면

1 지정된디렉토리로 이동해서 영상파일을 헤더랑 테일 짜른거 보여준후에

2 숫자로 선택하게 하는겁니다

3 옵션으로 찾는 숫자에 해당하는 압축파일을 보여준뒤에 압축풀고

4 나온 smi파일을 파싱해서

5 그걸 동영상파일이랑 이름만 같게한후 자동으로 mplayer로 틀어주는 역활을 합니다..

일단 "작동하는데만" 신경을 썻기 때문에 버그가 꽤 많을겁니다..

주석으로 대충 적어놨는데 몇개 더 있을지도 모르겠네요..

이거 덕분에 애니보기도 쉬워졌네요 일일이

1 영상파일 복사 -> smi압축파일 해제 -> smi 이름바꾸기 -> 동영상 플레이 할필요가 없어졌네요 하핫..

지금 소스 자체가 너무 허술한데.. 뭐 그래도 작동은 제대로 하니깐 잘 봐줘요..

사용법은> 프로그램이름 07
이런식으로 뒤에 '화' 수만 적어주면 됩니다..
<
cd "$HOME/ani" 은 알아서 수정해 주세요>
#!/bin/bash

# VERSION 0.01
# ------------ 추가할것들 ----------------
# Get_Subtitle
# 1,모든 필드를 얻는다 해당 숫자가 포함된것만 자막을 검색하게 추가할것
# 일단 다 만들고 출력은 따로 한다
# (파일이 하나일경우 걍 안보여주고 하려고함)
# 2,선택되지 않는 파일은 루프를 돌려서 삭제한다
# 한 압축파일에 여러 smi들이 있을때 유용
# 근데 이렇게 파려면 모든 데이터를 배열에 넣어야 되는데..;
#
# Get_Filename
# $1중에 없다면 아예 출력을 말게 해야되 <-이거할것 꼭 필요한건 아니지만..
#
# 기타
# 입력받을때 에러 확인할것! (전담함수 추가 바람)
# argument 가능하게 할까?

SUBTUTILE_SUFFIX="smi"
FILE_EXT="$HOME/bin/file_extracter.sh"

cd "$HOME/ani"

if [ $# -ne 1 ];then
echo "Useage: $0 search_file"
exit
fi

function Run_Program()
{
mplayer "$movie_filename" >/dev/null 2>/dev/null &
}

function Clear_Screen()
{
# 지극히 개인적인 옵션 지우고 싶으면 지우셈
clear
echo -e "\n\n\n\n\n"
}

function Get_Subtitle()
{
local cnt=1
local array_cnt=0
local num=1
declare -a array

# fe 내 전용 압축해제 스크립트)
set $($FILE_EXT "$1" | grep -i .smi)

while [ $# -gt 0 ];do
if [ $cnt -gt 1 ];then
string="$string $1"
case "$1" in
*.smi | *.SMI )
# 첫번째 공백제거 (여기서부터가 진정한 데이터)
echo "$(($array_cnt + 1)) - "${string:1}""
array[$array_cnt]="${string:1}"
((array_cnt++))
((cnt=0))
string=""
esac
fi
((cnt++))
shift
done

# 만약 파일이 하나라면 그냥 물어보지 말고 바로 리턴
if [ $array_cnt -eq 1 ];then
ret=${array[0]}
return
else
echo -n "choice number :";read num
fi

ret=${array[$num-1]}
}

# 문자열을 받으면 [],(),{} 사이의 문자를 없애주는 함수
# 이것은 오직 출력할때만 쓰여야만 한다
function Delete_Bracket()
{
# 확장자 백업
local subfix="${1##*.}"
# 확장자 제거 (head,tail 검사위해서)
ret="${1%.*}"
# head 재거
ret=${ret#\[*\]}
ret=${ret#\(*\)}
# tail 제거
ret=${ret%\[*\]}
ret=${ret%\(*\)}
ret="${ret} ----- $subfix"
}

function Get_Filename()
{
local i=0
local loop_filename=""
local num=1
declare -a file_array

for loop_filename in ''$1''
do
Delete_Bracket "$loop_filename"
case "$ret" in
*"$2"* )
echo $(($i+1)) - "$ret"
file_array[$i]="$loop_filename"
((i++))
esac
done
echo -n "choice number :";read num
ret=${file_array[$num-1]}
}

# MAIN
# 깨끗히 하고 시작
Clear_Screen

# 동영상파일과 자막파일을 선택하게 하고 변수에 저장
Get_Filename "*$1*.avi *$1*.mkv *$1*.wmv" "$1"
movie_filename="$ret"
subtitle_filename="${movie_filename%.*}.$SUBTUTILE_SUFFIX"

# 자막파일이 있으면 실행하고 걍 스크립트 종료
if [ -f "$subtitle_filename" ];then
Clear_Screen
Run_Program
exit
fi

# $1의 조건에 해당되는 압축파일(zip,rar) 을 출력하고 선택하게 한다
Get_Filename "*$1*.zip *$1*.rar" "$1"
comp_filename="$ret"

# 압축을 푼다
Get_Subtitle "$comp_filename" "$1"
comp_subtitle_filename="$ret"

# 선택된.smi 파일을 동영상.smi로 이름을 바꾼다
mv "$comp_subtitle_filename" "$subtitle_filename"

# 이제 애니보자!
Clear_Screen
Run_Program

#프로그램 종료전 전에 있던 디렉토리로 재이동
cd $OLDPWD

몇일동안 쉘스크립트 건드리면서 느끼는건데 어지간한건 C 안쓰고 걍 쉘스크립트로 다 해결가능한거 같군요..

정규식이랑 같이 쓰면 파싱하기도 쉽고 (뭐 C언에어서도 파싱라이브러리가 있긴하지만..)
조금만 미리 쓰면 쉘스크립트에서 "신비로 자동 다운로더!" 이런것도 만들수 있을거 같습니다..

해당클럽/자료실에서 자동으로 검색할 문자열이 포함된 것들을 추려서 자동으로 다운로드하게...
prev 1 ··· 3 4 5 6 7 8 9 ··· 12 next