반응형

1. 다운

$wget http://forum.falinux.com/_zdownload/data/ezboot.x5.v18.tar.gz

2. 압축 해제

tar -xvf ezboot.x5.v18.tar.gz

3. 내용물 확인

jisu@ubuntu:~$ cd v18.org
jisu@ubuntu:~/v18.org$ ls
eztiny  image  include  main  Makefile  start

image - 이지부트의 최종 이미지 파일이 들어감.

include - 이지부트 소스가 사용하는 헤더 파일이 있음.

main - C언어로 작성된 코드가 있음.

start - 어셈블리어로 작성된 보드 초기화 관련 코드들이 있음.

 

이지부트는 어셈블리 코드들이 컴파일 되어 한부분, main 이렉터리에 있는 C코드들이 컴파일되어 한부분을 이룹니다.

 

프로그램이 시작되면 맨처음 0번지에는 start에 있는 코드들이 실행(초기화라고 생각해라)된다. 그리고 실행이 끝나면 PC(Program Counter)에 main() 함수주소가 들어갑니다.(PC <- main() 주소)

 

4. 홈 디렉토리에 작업폴더 만들기!

jisu@ubuntu:~/v18.org/main$ cd ..
jisu@ubuntu:~/v18.org$ mkdir ~/navilnux
jisu@ubuntu:~/v18.org$ cp main ~/navilnux/chap2 -r
jisu@ubuntu:~/v18.org$ cp include ~/navilnux/chap2 -r

5. chap2폴더로 들어와 작업해봅시다

jisu@ubuntu:~/v18.org$ cd  ~/navilnux
jisu@ubuntu:~/navilnux$ ls
chap2
jisu@ubuntu:~/navilnux$ cd chap2
jisu@ubuntu:~/navilnux/chap2$ ls
arp_cmd.c      flash_cmd.c  lib1funcs.S     net.o       time.c
arp_cmd.o      flash_cmd.o  main.c          printf.c    time.o
config.c       go_cmd.c     main-elf32      printf.o    vscanf.c
config.o       go_cmd.o     main-ld-script  ram_cmd.c   vscanf.o
cs8900.c       gpio.c       main.o          ram_cmd.o   vsprintf.c
cs8900.o       gpio.o       main_org        serial.c    vsprintf.o
defaultlibs    help.c       Makefile        serial.o    zmodem.c
entry.o        help.o       Makefile.bak    string.c    zmodem_cmd.c
entry.S        include      nand.c          string.o    zmodem_cmd.o
flash_29lvx.c  info_cmd.c   nand.o          tftp_cmd.c  zmodem.o
flash_29lvx.o  lib1funcs.o  net.c           tftp_cmd.o

6. serial.c 파일을 수정합니다

  • 헤더 파일에 있는 #include <config.h> 지움
    -> 이지부트 설정을 담고 있는 파일 
  • extern TConfig Cfg;를 지움
    -> 이지부트 설정 담음
  • void SerialInit( eBauds baudrate ) 함수를 다 지움
    -> 이지부트 설정 담음
  • static volatitle Word *UART = (volatile Word *) STUART; 
    =>>>#ifdef IN_GUMSTIX
    static volatitle Word *UART = (volatile Word *) FFUART;

    #else static volatitl
    #endif

    -> UART : 컴퓨터 간에 통신 기능을 제공하는 기법
    -> 나빌눅스에서는 FULL FUNCTION UART를 사용
    ==> UART를 버퍼 주소로 변경해 준다
    -> volatile 는 컴파일러로부터 최적화를 막아주는 키워드

6. main.c를 그냥 다 지우고

navilux.c를 만들어서 하자

 

$rm main.c
$gedit navilnux.c
#include <pxa255.h>
#include <time.h>
#include <gpio.h>
#include <stido.h>
#include <string.h>

int main(void){
	while(1){
		printf("hello world\n");
		msleep(1000);
	}
}

//나빌눅스 c코드 / 1초마다 hello world를 출력

7.권한 주기

$chmod +x navilnux.c

8. 지워야할 항목 temp 폴더 만들어서 옮기기

jisu@ubuntu:~/navilnux/chap2$ chmod +x navilnux.c
jisu@ubuntu:~/navilnux/chap2$ mkdir temp
jisu@ubuntu:~/navilnux/chap2$ mv entry.S temp
jisu@ubuntu:~/navilnux/chap2$ mv gpio.c temp
jisu@ubuntu:~/navilnux/chap2$ mv lib1funcs.S temp
jisu@ubuntu:~/navilnux/chap2$ mv main-ld-script temp
jisu@ubuntu:~/navilnux/chap2$ mv navilnux.c temp
jisu@ubuntu:~/navilnux/chap2$ mv printf.c temp
jisu@ubuntu:~/navilnux/chap2$ mv serial.c temp
jisu@ubuntu:~/navilnux/chap2$ mv string.c temp
jisu@ubuntu:~/navilnux/chap2$ mv time.c temp
jisu@ubuntu:~/navilnux/chap2$ mv vsprintf.c temp

9. c 파일을 지움 삭제후 폴더에 보관했던 파일들을 꺼내오고 폴더를 삭제

$rm *.c
$cp temp/* .
$rm -r temp

10.헤더파일 정리

$cd include
$mkdir temp
$mv gpio.h temp
$mv pxa255.h temp
$mv serial.h temp
$mv stdarg.h temp
$mv stdio.h temp
$mv string.h temp
$mv time.h temp
$rm *.h
$rm 1
$cp temp/* .
$rm -r temp

11. Makefile 지웠다가 다시 만듬

CC = arm-linux-gcc

LD = arm-linux-ld

OC = arm-linux-objcopy

 

CFLAGS = -nostdinc -I. -I./include

CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs -O2

CFLAGS += -fno-strict-aliasing -fno-common -pipe -mapcs-32

CFLAGS += -mcpu=xscale -mshort-load-bytes -msoft-float -fno-builtin

 

LDFLAGS = -static -nostdlib -nostartfiles -nodefaultlibs -p -X -T ./main-ld-script

 

OCFLAGS = -O binary -R .note -R .comment -S

all: navilnux.c

$(CC) -c $(CFLAGS) -o entry.o entry.S

$(CC) -c $(CFLAGS) -o gpio.o gpio.c

$(CC) -c $(CFLAGS) -o time.o time.c

$(CC) -c $(CFLAGS) -o vsprintf.o vsprintf.c

$(CC) -c $(CFLAGS) -o printf.o printf.c

$(CC) -c $(CFLAGS) -o string.o string.c

$(CC) -c $(CFLAGS) -o serial.o serial.c

$(CC) -c $(CFLAGS) -o lib1funcs.o lib1funcs.S

$(CC) -c $(CFLAGS) -o navilnux.o navilnux.c

$(LD) $(LDFLAGS) -o navilnux_elf entry.o gpio.o time.o vsprintf.o printf.o string.o serial.o lib1funcs.o navilnux.o

$(OC) $(OCFLAGS) navilnux_elf navilnux_img

$(CC) -c $(CFLAGS) -o serial.o serial.c -D IN_GUMSTIX

$(LD) $(LDFLAGS) -o navilnux_gum_elf entry.o gpio.o time.o vsprintf.o printf.o string.o serial.o lib1funcs.o navilnux.o

$(OC) $(OCFLAGS) navilnux_gum_elf navilnux_gum_img

 

clean:

rm *.o

rm navilnux_elf

rm navilnux_img

rm navilnux_gum_elf

rm navilnux_gum_img

12.

v18.org/ main / main.c 의 gokernel 확인

    	     	if ( getc_timed( Cfg.BootMenuKey, Cfg.AutoBootWaitTime*1000 ) )
    	     	{
       	     		//printf( "\r                                                                \n");  
       	     		printf( "\n");  
             		CopyImage();
             		GoKernel( 1, NULL );
             		// ¿©±â·Î ¿òÁ÷ÀÌÁö ŸÊŽÂŽÙ.
             		// ---
    	     	}
    	     	break;

 

13.v18.org/main/go_cmd.c 안의 함수 주소 확인

int 	GoKernelSingle( void )
{
    	char buff[] = { 0,0,0,0,0 }; // ží·É Ä¿žÇµå œÃÇè¿ëÀÓ 
    	void (*theKernel)(int zero, int arch);

	char kcmd[2048];
	int  len;
	
	// Ä¿³Î Ä¿žÇµå ¹®ÀÚ¿­À» ŸòŸî¿ÂŽÙ.
	memset( kcmd, 0, 2048 );
	len = GetKCmdStr( kcmd );	

    	printf( "Starting kernel [MARCH %d]...\n", Cfg.Kernel_ArchNumber );

    	memcpy( (char *) DEFAULT_RAM_KERNEL_ZERO_PAGE, kcmd, 2048 );

    	theKernel = (void (*)(int, int))DEFAULT_RAM_KERNEL_START; 
    	theKernel( ( long ) 0 , (long) Cfg.Kernel_ArchNumber );

    	return 0;
}

14.v18.org/include/mem_map.h 확인

#define DEFAULT_RAM_KERNEL_START        0xA0008000              // ·¥¿¡Œ­ Ä¿³Î     œÃÀÛ Ÿîµå·¹œº 
#define DEFAULT_RAM_RAMDISK_START       0xA0800000              // ·¥¿¡Œ­ ·¥µðœºÅ© œÃÀÛ Ÿîµå·¹œº 
#define DEFAULT_RAM_WORK_START          0xA1000000              // ÀϹÝÀûÀÎ ºÎÆ® ·ÎŽõ ÀÛŸ÷ ¿µ¿ª 

#define DEFAULT_RAM_KERNEL_ZERO_PAGE    0xA0000000              // ºÎÆ®·ÎŽõ¿¡Œ­ Ä¿³Î·Î ÀüŽÞÇÏŽÂ ¿µ¿ª œÃÀÛ Ÿîµå·¹œº 

#define DEFAULT_RAM_KERNEL_START 0xA0008000

이라고 되어있습니다.

메모리 주소가 하나의 헤더파일에 정의되어 있는 것입니다.

이지부트가 실행이 끝나면, . 커널이 실행되어야 할 주소입니다.

 

15.v18.org/main/main-ld-script 수정

change 0xA0F00800 to 0xA0008000.

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_ram_entry)
SECTIONS
{
	. = 0xA0008000;

	. = ALIGN(4);
	.text : { *(.text) }

	. = ALIGN(4);
	.rodata : { *(.rodata) }

	. = ALIGN(4);
	.data : { *(.data) }

	. = ALIGN(4);
	.got : { *(.got) }

	. = ALIGN(4);
	.bss : { *(.bss) }
}

make해서 이지부트 이미지 만들려고하는데 에러 나옴ㅎㅎ 울고싶다

include/pxa255.h:46:1: warning: this is the location of the previous definition
serial.c:41: error: syntax error before "Word"
serial.c:41: warning: initialization discards qualifiers from pointer target type
make: *** [all] Error 1

 

반응형
반응형

MongoDB - Query Document 

 

조회 (find()) //db.COLLECTION_NAME.find(query, projection)

Document 를 조회하는 find() 메소드

 

find() 메소드의 인자로 query 와 projection 이 들어옵니다.

두 값 모드 Optional 파라메터입니다.

query 의 데이터 타입은 document(객체) 입니다. 이는 다큐먼트를 조회하는 기준을 정하는 파라메터입니다. 이 값이 생략되거나 비어있는 객체 {} 를 전달하면 해당 컬렉션의 모든 다큐먼트들을 조회합니다.

projection 의 데이터 타입 역시 document 로, 조회한 다큐먼트의 표시할 field 를 지정하는 것 입니다.

 

실습 위해 컬렉션 만들어보고 삽입!

>db.articles.insert([

  {

    "title": "article01",

    "content": "content01",

    "writer": "Velopert",

    "likes": 0,

    "comments": []

  },

  {

    "title": "article02",

    "content": "content02",

    "writer": "Alpha",

    "likes": 23,

    "comments": [

      {

        "name": "Bravo",

        "message": "Hey Man!"

      }

    ]

  },

  {

    "title": "article03",

    "content": "content03",

    "writer": "Bravo",

    "likes": 40,

    "comments": [

      {

        "name": "Charlie",

        "message": "Hey Man!"

      },

      {

        "name": "Delta",

        "message": "Hey Man!"

      }

    ]

  }

])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 3,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

db.articles.find().pretty()
{
        "_id" : ObjectId("5d80289f790e7a86104506af"),
        "title" : "article01",
        "content" : "content01",
        "writer" : "Velopert",
        "likes" : 0,
        "comments" : [ ]
}
{
        "_id" : ObjectId("5d80289f790e7a86104506b0"),
        "title" : "article02",
        "content" : "content02",
        "writer" : "Alpha",
        "likes" : 23,
        "comments" : [
                {
                        "name" : "Bravo",
                        "message" : "Hey Man!"
                }
        ]
}
{
        "_id" : ObjectId("5d80289f790e7a86104506b1"),
        "title" : "article03",
        "content" : "content03",
        "writer" : "Bravo",
        "likes" : 40,
        "comments" : [
                {
                        "name" : "Charlie",
                        "message" : "Hey Man!"
                },
                {
                        "name" : "Delta",
                        "message" : "Hey Man!"
                }
        ]
}
  • articles 의 다큐먼트 중 writer 가 Bravo 인 다큐먼트를 검색

특정 field 의 정확한 값으로 다큐먼트를 조회할 때는 find 의 query 로 찾을 document 를 객체 형식으로 지정

db.articles.find({ "writer" : "Bravo" }).pretty()
{
        "_id" : ObjectId("5d80289f790e7a86104506b1"),
        "title" : "article03",
        "content" : "content03",
        "writer" : "Bravo",
        "likes" : 40,
        "comments" : [
                {
                        "name" : "Charlie",
                        "message" : "Hey Man!"
                },
                {
                        "name" : "Delta",
                        "message" : "Hey Man!"
                }
        ]
}

 

Query 연산자

  • 비교 연산자

operator

 설명 

 $eq

 (equals) 주어진 값과 일치하는 값 

 $gt

 (greater than) 주어진 값보다 큰 값 

 $gte

 (greater than or equals) 주어진 값보다 크거나 같은 값 

 $lt

 (less than) 주어진 값보다 작은 값 

 $lte

 (less then or equals) 주어진 값보다 작거나 같은 값 

 $ne

 (not equlas) 주어진 값과 일치하지 않는 값 

 $in

 (in) 주어진 배열 안에 속하는 값

 $nin

 (not in) 주어진 배열 안에 속하지 않는 값 

 

articles 콜렉션 안의 다큐먼트 중 like 필드의 값이 10보다 크고 30보다 작은 다큐먼트를 조회

db.articles.find( { "likes" : { $gt : 10, $lt : 30 } } ).pretty()
{
        "_id" : ObjectId("5d80289f790e7a86104506b0"),
        "title" : "article02",
        "content" : "content02",
        "writer" : "Alpha",
        "likes" : 23,
        "comments" : [
                {
                        "name" : "Bravo",
                        "message" : "Hey Man!"
                }
        ]
}
  •  논리(Logical) 연산자

Operator 

 설명 

 $or

 주어진 조건 중 하나라도 만족한다면 true 

 $and

 주어진 조건을 모두 만족해야만 true 

 $not

 주어진 조건이 거짓일 때 true 

 $nor

 주어진 모든 조건이 거짓일 때 true 

-title 의 값이 "article01" 이거나 writer 의 값이 "Alpha" 인 도큐먼트를 조회

db.articles.find( { $or : [ { title : "article01" }, { writer : "Alpha" } ] } ).pretty()
{
        "_id" : ObjectId("5d80289f790e7a86104506af"),
        "title" : "article01",
        "content" : "content01",
        "writer" : "Velopert",
        "likes" : 0,
        "comments" : [ ]
}
{
        "_id" : ObjectId("5d80289f790e7a86104506b0"),
        "title" : "article02",
        "content" : "content02",
        "writer" : "Alpha",
        "likes" : 23,
        "comments" : [
                {
                        "name" : "Bravo",
                        "message" : "Hey Man!"
                }
        ]
}

-writer 의 값이 "Alpha" 이고, like 의 값이 20 이상인 다큐먼트를 조회

db.articles.find( { $and : [ { writer : "Alpha" }, { likes : { $gt : 20 } } ] } ).pretty()
{
        "_id" : ObjectId("5d80289f790e7a86104506b0"),
        "title" : "article02",
        "content" : "content02",
        "writer" : "Alpha",
        "likes" : 23,
        "comments" : [
                {
                        "name" : "Bravo",
                        "message" : "Hey Man!"
                }
        ]
}
>

 

-$and 연산자는 하나의 query 객체로 표현하는 것과 같음.

 

db.articles.find( { $and : [ { writer : "Alpha" }, { likes : { $gt : 20 } } ] } ).pretty()

=

db.articles.find( { writer : "Alpha", likes : { $gt : 20 } } ).pretty()

 

 

 

Update() //db.콜렉션명.update(SELECTION_CRITERIA, UPDATED_DATA)

>db.mycol.update({'title' : 'MONGO DB'}, {$set  :{'title' : 'new mongo'}})
>db.mycol.update({'title' : 'MONGO DB'}, {$set  :{'title' : 'new mongo'}}, {multi : true})

 

Save() //db.콜렉션명.save({_id : 객체id(), new_data})

save()는 동일 id값이 들어오면 update. 그리고 save() 함수 변경시 변경/추가 여부를 결과값으로 알려줌

> db.user.save({ "_id" : 5, "name" : "matt", "part" : "staf", "title" : "lab" })
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 5 })

 

> db.user.save({ "_id" : 5, "name" : "matt", "part" : "staff", "title" : "lab" })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.user.find()
{ "_id" : 5, "name" : "matt", "part" : "staff", "title" : "lab" }

 

Remove() //db.콜렉션명.remove(delete_creiteria)

>db.mycol.remove({'title' : 'mongo'})

 

Projection

일반적인 SQL 쿼리문에서 "select" 구문에 해당하는 Projection은 find() 메소드의 두번째 인자값에 해당.

/* sample query */ db.tbl.find( { num: { $gt: 29} }, { val1: 1, val2: 1 } ◀ projection ).limit(10)

 

위의 코드에서 "projection"으로 표시된 부분
만약 _id 필드를 projection에서 제외하면 추후에 projection을 합칠 때 문제가 생김.

위 구문에서 val1 필드 값인 1은 추출한 콜렉션에서 val1 필드를 포함하고 반대로 val1 필드 값이 0이라면 추출한 콜렉션에서 val1 필드를 제외. 따라서 위 구문은 val1과 val2 필드를 포함하겠다는 뜻.

 

 

1.추출할 콜렉션에서 특정 필드를 제외 쿼리 예시

db.t_col.find({ "view_count": { $gt: 29 }, { "title":0 })

 

위의 쿼리를 실행하면 view_count값이 29보다 큰 document들을 선택하고, 선택된 document들의 필드 중 "title" 필드를 제외.

 

2 .2개의 필드와 _id 필드를 포함하는 쿼리.

db.t_col.find({ "view_count": { $gt: 29 }, { "title":1, "cont":1 })

위의 쿼리를 실행하면 view_count값이 29보다 큰 document들을 선택하고, 선택된 document들의 필드 중 "title", "cont", "_id" 필드만 가져옴.

 

3. 2개의 필드를 포함하고 _id 필드를 제외하는 쿼리.

db.t_col.find({ "view_count": { $gt: 29 }, { "title":1, "cont":1, "_id":0 })

 

위의 쿼리를 실행하면 view_count값이 29보다 큰 document들을 선택하고, 선택된 document들의 필드 중 "_id"필드를 제외하고 "title", "cont" 필드만 가져옴

반응형
반응형
https://insightbooklist.wordpress.com/books/programming-insight/%EB%8F%84%EC%A0%84-%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-os-%EB%A7%8C%EB%93%A4%EA%B8%B0/%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C%EC%99%80-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C/

어떤 착한 분이 임베디드 관련 자료들을 다 복원해주셨다 ㅜㅜ 우선 다 다운받아놓기 ....

 

1.gumstix_uboot.tgz 다운

위에서 다운받으면 되지만 vmware는 32bit , OS는 64bit여서 자꾸 다운됨 ㅜㅜ 그래서 wget 명령어 사용함

$wget -O gumstix_uboot.tgz https://drive.google.com/file/d/0B6crpDdRQpLzVDM0clpoWG5ROHc/edit

##이거 안돼서 

https://tttsss77.tistory.com/76

로 공유 폴더 만들고 gumstix_uboot.tgz 공유 폴더로 만듬 

 

ubuntushare 폴더에서 gumstix_uboot.tgz 를 root로 cp

$ cp gumstix_uboot.tgz ~
$ ls
Desktop    examples.desktop   Pictures    qemu-2.1.2.tar.bz2  workspace
Documents  gumstix_uboot.tgz  Public      Templates
Downloads  Music              qemu-2.1.2  Videos

 

 

2. uboot 압축 품

$tar -xvf gumstix_uboot.tgz

 

3.폴더 이동해 make distclean  입력

$cd gumstix_uboot
$make distclean

 

4.파일 삭제되는 것을 볼 수 있습니다

@ubuntu:~/gumstix_uboot$ make gumstix_config
Configuring for gumstix board...
$make all

하고 ls 하면 u-boot.bin이 생성된 것을 볼 수 있음

jisu@ubuntu:~/gumstix_uboot$ ls
arm_config.mk dtt lib_nios nios_config.mk board dump lib_nios2 post CHANGELOG examples lib_ppc ppc_config.mk common fs m68k_config.mk pro compilelog i386_config.mk MAINTAINERS README config.mk include MAKEALL rtc COPYING lib_arm Makefile System.map cpu lib_generic microblaze_config.mk tools CREDITS lib_i386 mips_config.mk u-boot disk lib_m68k mkconfig u-boot.bin doc lib_microblaze net u-boot.map drivers lib_mips nios2_config.mk u-boot.srec
jisu@ubuntu:~/gumstix_uboot$ /usr/local/bin/qemu-system-arm -M connex -pflash u-boot.bin -nographic
qemu-system-arm: failed to read the initial flash content
qemu-system-arm: Initialization of device cfi.pflash01 failed

64비트와 32비트 차이로 오류가 났다 ㅜㅜ >> 명령어 입력 >> flash.bin이 생성 > uboot.bin을 대체한다고 생각

jisu@ubuntu:~/gumstix_uboot$ dd if=/dev/zero of=flash.bin bs=4096 count=4096
4096+0 records in
4096+0 records out
16777216 bytes (17 MB) copied, 0.0392093 s, 428 MB/s
jisu@ubuntu:~/gumstix_uboot$ dd if=u-boot.bin of=flash.bin bs=4096 conv=notrunc
38+1 records in
38+1 records out
158832 bytes (159 kB) copied, 0.00100775 s, 158 MB/s

해결하고 다시 명령어 입력해보면 완성!

jisu@ubuntu:~/gumstix_uboot$ /usr/local/bin/qemu-system-arm -M connex -pflash flash.bin -nographic
pxa2xx_clkcfg_write: CPU frequency change attempt


U-Boot 1.1.4 (Sep 23 2019 - 04:51:26) - 200 MHz - 

*** Welcome to Gumstix ***

U-Boot code: A3F00000 -> A3F26C70  BSS: -> A3F5BD8C
RAM Configuration:
Bank #0: a0000000 64 MB
Flash: 16 MB
Using default environment

SMC91C1111-0
Net:   SMC91C1111-0
Hit any key to stop autoboot:  0 
Instruction Cache is ON
### JFFS2 loading 'boot/uImage' to 0xa2000000
Scanning JFFS2 FS:  done.
find_inode failed for name=boot
load: Failed to find inode
### JFFS2 LOAD ERROR<0> for boot/uImage!

 

 

지긋지긋한 설치 완성 

이러고 나서 또 에러나면 그냥 ㅘㄱㅁ,ㅇ라ㅣㅇㄴ러ㅣ마어리ㅏㅇㄴ

반응형
반응형

qemu 설치

1.qemu 받을 폴더 만들고 -> wget로 파일 받음

$mkdir workspace
$wget http://wiki.qemu-project.org/download/qemu-2.1.2.tar.bz2 

 

2. 다운 완료 되면 압축 풀어줌

$tar -xvf qemu-2.1.2.tar.bz2

$ls
>>qemu-2.1.2   qemu-2.1.2.tar.bz2

3.qemu-2.1.2 폴더로 이동 -> ./configure

$cd qemu-2.1.2/
$./configure

4.패키지 여러 개 설치     (설치하고 -> make 하면 에러가 뜬다)

아니 뭐가 문젠지는 모르겠지만 make 하기전에 패키지를 다 깔고 들어가도 되지 않을까 싶어서 시작했는데 된다! 

glib-2.12와 gthread-2.0이 컴파일하는데 필요

$sudo apt-get install libglib2.0
autoreconf를 못찾는다는 에러

$sudo apt-get install autoconf
http://theintobooks.wordpress.com/2012/10/30/installing-qemu/
에러 참고

$sudo apt-get install libtool
flex와 bison을 찾지 못함
$sudo apt-get install aptitude // 다른 설치 툴 사용
$sudo aptitude install flex        //flex 설치
$sudo aptitude install bison     //bison 설치

##make 시 에러가 나면 ctrl + c 정지 후 -> sudo make clean -> make 

 

$sudo make install 

5.install 완료

오랜시간이 걸려 완료 후 정상적으로 설치되었는지 확인하려면

$ls /usr/local/bin

완료 완료!

반응형
반응형

ARM 크로스 컴파일 환경구축

1.arm-linux-gcc 파일 다운로드

$mkdir workspace
$cd workspace/ 
$wget ftp://ftp2.de.freebsd.org/pub/linux/handhelds/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2

-> 현재 있는 폴더로 다운로드 됨

 

2.압축해제

해당파일을 루트로 옮기고 압축품

$sudo cp ./arm-linux-gcc-3.3.2.tar.bz2/
$cd/
$sudo tar xvf arm-linux-gcc-3.3.2.tar.bz2/

 

3.압축해제 확인 및 유저프로파일 수정

압축 풀린 것 확인 -> 없으면 잘못된것

$ls /usr/local/arm/3.3.2
$cd ~

vi 명령어 사용해서 profile 파일을 고쳐주라는데 자꾸 에러나서 걍 gedit -> 이렇게 해도 상관읎다!

$gedit .profile

맨 하단에 PATH 설정 후 저장

PATH=/usr/local/arm/3.3.2/bin:/usr/local/arm/3.3.2/sbin:"${PATH}"  

 

4.변경사항 적용 및 확인

편집 완료되면 명령어로 변경된 사항을 적용시켜줌

$source ~/.profile

변경사항 잘 정용되었나 확인해보는 명령어

$echo $PATH

아까입력한 PATH 나오면 성공!

반응형
반응형

1.조인이란?

-> 데이터베이스를 연결하여 데이터를 검색하는 방법

-> PK 혹은 FK로 두 테이블을 연결

-> 적어도 하나의 칼럼은 서로 공유되고 있어야함

 

Customer 테이블
Reservation 테이블

 

2.INNER JOIN = 교집합 

  • 기준테이블과 JOIN 한 테이블의 중복된 값을 보여줌
  • 결과값 : A의 테이블과 B테이블이 모두 가지고 있는 데이터만 검색
  • ON 절에서는 WHERE 절에서 사용할 수 있는 모든 조건을 사용할 수 있음
  • 표준 SQL과는 달리 MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용.
--문법--
SELECT *
FROM 첫번째 테이블 이름
INNER JOIN 두번쨰 테이블 이름

ON 조건

SELECT *

FROM 첫번째 테이블 이름
JOIN 두번째 테이블 이름
ON 조건

SELECT *
FROM 첫번째 테이블 이름 AS 별칭 , 
            두번째 테이블 이름 AS 별칭
WHERE 조건

--예제--
Reservation 테이블의 Name 필드와 Customer 테이블의 Name 필드가 서로 일치하는 레코드만 

INNER JOIN 으로 가져옴

1. 
SELECT *

FROM Reservation
INNER JOIN Customer
ON Reservation.Name = Customer.Name;

2. 
SELECT *

FROM Reservation
JOIN Customer
ON Reservation.Name = Customer.Name;

3.

SELECT *
FROM Reservation AS r, Customer AS c
WHERE r.Name = c.Name;

 

결과

 

3. LEFT OUTER , RIGHT OUTER 조인

  • 하나의 테이블 기준으로 합치는 조인

  • LEFT JOIN
    • 왼쪽 테이블을 중심으로 오른쪽의 테이블을 매치
    • 왼쪽 테이블의 한 개의 레코드에 여러개의 오른쪽 테이블 레코드가 일치할 경우
      >>> 해당 왼쪽 레코드를 여러번 표시
    • 왼쪽은 무조건 표시, 매치되는 레코드가 오른쪽에 없으면 null
    • ON 절의 조건을 만족하지 않는 경우, 첫 번째 테이블 필드(왼쪽)값은 그대로 가져옴.
--문법--
SELECT *
FROM 첫번째 테이블 이름
LEFT JOIN 두번째 테이블 이름
ON 조건

--예제--
Reservation 테이블의 Name 필드를 기준으로 Customer 테이블의 Name 필드와 일치하는 레코드만 LEFT JOIN으로 가져온 후, 그 중 ReserveDate 필드 값이 2019.09.13 이후인 레코드만 선택

SELECT *
FROM Reservation
LEFT JOIN Customer
ON Reservation.Name = Customer.Name
WHERE ReserveDate > '2019-09-13';

 

결과

 

 

 

  • RIGHT JOIN
    • 오른쪽 테이블 중심으로 왼쪽 테이블을 매치
    • LEFT JOIN 에서 방향을 오른쪽으로만 바꾼 것
      >>> 해당 레코드가 여러번 표시되거나, null 표시
--문법--
SELECT *
FROM 첫번째 테이블 이름
RIGHT JOIN 두번째 테이블 이름
ON 조건

--예제--
Customer 테이블의 Name 필드를 기준으로 Reservation 테이블의 Name 필드와 일치하는 레코드만을 RIGHT JOIN으로 가져오는 예제


SELECT * 
FROM Reservation
RIGHT JOIN Customer
ON Reservation.Name = Customer.Name;

결과

반응형

'Database Study > SQL' 카테고리의 다른 글

[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
[Oracle DB]PL / SQL 기초  (0) 2020.01.06
[Oracle DB] 오라클_SQL (쿼리문) 처리 및 실행 순서  (0) 2020.01.06
Select query 튜닝  (0) 2020.01.03
[MySQL]기본 쿼리 & 내장함수 & JOIN  (0) 2019.09.11
반응형

데이터베이스 기본 쿼리

 

데이터베이스 생성

create database 데이터베이스이름;

 

데이터베이스 삭제

drop database 데이터베이스이름;

 

데이터베이스 조회

show databases;

 

데이터베이스 사용

use 데이터베이스이름;

 


테이블

 

테이블 정보

desc 테이블이름;

 

테이블 삭제

drop table 테이블이름;


레코드

 

레코드 추가

insert into 테이블이름 value('A','B','C');

insert into 테이블이름(FieldA,FieldB,FieldC) value('A','B','C');

 

레코드 조회

select * from 테이블이름;

select FieldA, FieldB from 테이블이름;

select * from 테이블이름 where FieldA = 'Content';

select distinct FieldA 테이블이름;                      중복제거

select * from 테이블이름 where FieldB between 00:00:00 and 12:00;00   //00시~12시 사이

select * from 테이블이름 where FieldB in (A, B);                                //A와 B 중에서

select * from 테이블이름 where FieldB LIKE '%단어%';                       //단어가 포함된 레코드 조회

select * from 테이블이름 where FieldB is null;    not is null                 //null일때

 

레코드 삭제

delete from 테이블이름 where Field = 'Content';

 

레코드 수정

update 테이블이름 set FieldA='바꿀내용' where FieldA='기존데이터';

 


내장함수

 

1. 숫자 관련 함수 
▶ ABS(숫자) - 절대값 출력. 
▶ CEILING(숫자) - 값보다 큰 정수 중 가장 작은 수. 
▶ FLOOR(숫자) - 값보다 작은 정수 중 가장 큰 수[실수를 무조건 버림(음수일 경우는 제외)]. 
▶ ROUND(숫자,자릿수) - 숫자를 소수점 이하 자릿수에서 반올림.(자릿수는 양수,0,음수를 갖을 수 있다.) 
▶ TRUNCATE(숫자,자릿수) - 숫자를 소수점 이하 자릿수에서 버림. 
▶ POW(X,Y) or POWER(X,Y) - X의 Y승 
▶ MOD (분자, 분모) - 분자를 분모로 나눈 나머지를 구한다.(연산자 %와 같음) 
▶ GREATEST(숫자1,숫자2,숫자3...) - 주어진 수 중 제일 큰 수 리턴. 
▶ LEAST(숫자1,숫자2,숫자3...) - 주어진 수 중 제일 작은 수 리턴. 
▶ INTERVAL(a,b,c,d.....) - a(숫자)의 위치 반환 


2. 문자 관련 함수 
▶ ASCII(문자) - 문자의 아스키 코드값 리턴. 
▶ CONCAT('문자열1','문자열2','문자열3'...) - 문자열들을 이어준다. 
▶ INSERT('문자열','시작위치','길이','새로운문자열') - 문자열의 시작위치부터 길이만큼 새로운 문자열로 대치 
▶ REPLACE('문자열','기존문자열','바뀔문자열') - 문자열 중 기존문자열을 바뀔 문자열로 바꾼다. 
▶ INSTR('문자열','찾는문자열') - 문자열 중 찾는 문자열의 위치값을 출력 
▶ LEFT('문자열',개수) - 문자열 중 왼쪽에서 개수만큼을 추출.
▶ RIGHT('문자열',개수) - 문자열 중 오른쪽에서 개수만큼을 추출. 
▶ MID('문자열',시작위치,개수) - 문자열 중 시작위치부터 개수만큼 출력 
▶ SUBSTRING('문자열',시작위치,개수) - 문자열 중 시작위치부터 개수만큼 출력 
▶ LTRIM('문자열') - 문자열 중 왼쪽의 공백을 없앤다. 
▶ RTRIM('문자열') - 문자열 중 오른쪽의 공백을 없앤다. 
▶ TRIM('문자열') - 양쪽 모두의 공백을 없앤다. 
▶ LCASE('문자열') or LOWER('문자열') - 소문자로 바꾼다. 
▶ UCASE('문자열') or UPPER('문자열') - 대문자로 바꾼다. 
▶ REVERSE('문자열') - 문자열을 반대로 나열한다. 


3. 논리 관련 함수 
▶ IF(논리식,참일 때 값,거짓일 때 값) - 논리식이 참이면 참일 때 값을 출력하고 논리식이 거짓이면 거짓일 때 출력한다. 
▶ IFNULL(값1,값2) - 값1이 NULL 이면 값2로 대치하고 그렇지 않으면 값1을 출력 


4. 집계 함수 
▶ COUNT(필드명) - NULL 값이 아닌 레코드 수를 구한다. 
▶ SUM(필드명) - 필드명의 합계를 구한다. 
▶ AVG(필드명) - 각각의 그룹 안에서 필드명의 평균값을 구한다. 
▶ MAX(필드명) - 최대값을 구한다. 
▶ MIN(필드명) - 최소값을 구한다. 


5. 날짜 관련 함수 
▶ NOW() or SYSDATE() or CURRENT_TIMESTAMP() - 현재 날짜와 시간 출력 
▶ CURDATE() or CURRENT_DATE() -현재 날짜 출력 
▶ CURTIME() or CURRENT_TIME() -현재 시간 출력 
▶ DATE_ADD(날짜,INTERVAL 기준값) -날짜에서 기준값 만큼 더한다. 
※ 기준값 : YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 
▶ DATE_SUB(날짜,INTERVAL 기준값) -날짜에서 기준값 만큼 뺸다. 
※ 기준값 : YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 
▶ YEAR(날짜) -날짜의 연도 출력. 
▶ MONTH(날짜) -날짜의 월 출력. 
▶ MONTHNAME(날짜) -날짜의 월을 영어로 출력. 
▶ DAYNAME(날짜) -날짜의 요일일 영어로 출력. 
▶ DAYOFMONTH(날짜) -날짜의 월별 일자 출력. 
▶ DAYOFWEEK(날짜) -날짜의 주별 일자 출력(월요일(0),화요일(1)...일요일(6)) 
▶ WEEKDAY(날짜) -날짜의 주별 일자 출력(월요일(0),화요일(1)...일요일(6)) 
▶ DAYOFYEAR(날짜) -일년을 기준으로 한 날짜까지의 날 수. 
▶ WEEK(날짜) -일년 중 몇 번쨰 주. 
▶ FROM_DAYS(날 수) --00년 00월 00일부터 날 수 만큼 경과한 날의 날짜 출력. 
▶ TO_DAYS(날짜) --00 년 00 월 00일 부터 날짜까지의 일자 수 출력. 
▶ DATE_FORMAT(날짜,'형식') : 날짜를 형식에 맞게 출력 

 


JOIN

 

반응형

'Database Study > SQL' 카테고리의 다른 글

[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
[Oracle DB]PL / SQL 기초  (0) 2020.01.06
[Oracle DB] 오라클_SQL (쿼리문) 처리 및 실행 순서  (0) 2020.01.06
Select query 튜닝  (0) 2020.01.03
[MySQL]JOIN (조인) 문법  (0) 2019.09.12
반응형

항상 몽고shell을 부른다고 생각 ,그 안에서 명령어를 사용

 

-mongodb 시작(cmd)

cmd 두개 돌려서 서버 먼저 돌리고

>mongod --dbpath c:\data\db
>mongo

 

로 들어감

C:\Users\USER>mongo localhost:27017

 

Database 생성: use

>use mydb
switched to db mydb
>db //현재 사용중인 데이터 베이스 확인
mydb

 

-콜렉션 자동 생성

> db.movie.insert({"name":"korea"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
mydb 0.000GB

movie라는 컬렉션을 자동으로 생성해주고 키와 value 값을 넣어줌

 

Database 제거: db.dropDatabase()

>db.dropDatabase()
{ "dropped" : "mongodb_tutorial", "ok" : 1 }

 

Collection 생성: db.createCollection()

>db.createCollection(name,options)

 

name 은 생성하려는 컬렉션의 이름이며 option 은 document 타입으로 구성된 해당 컬렉션의 설정값

options 매개변수는 선택적인(Optional) 매개변수로서 생략하셔도 되고, 필요에따라 사용

Parameter Type
Name String
Option Document// 옵션은 문서 형태로

 

Option

Field Type 설명
capped Boolean 이 값을 true 로 설정하면 capped collection 을 활성화 시킵니다. Capped collection 이란, 고정된 크기(fixed size) 를 가진 컬렉션으로서, size 가 초과되면 가장 오래된 데이터를 덮어씁니다. 이 값을 true로 설정하면 size 값을 꼭 설정해야합니다.
autoIndex Boolean 이 값을 true로 설정하면, _id 필드에 index를 자동으로 생성합니다. 기본값은 false 입니다.
size number Capped collection 을 위해 해당 컬렉션의 최대 사이즈(maximum size)를 ~ bytes로 지정합니다.
max number 해당 컬렉션에 추가 할 수 있는 최대 갯수를 설정합니다.
> use test
switched to db test
> db.createCollection("mycollection") //콜렉션생성("콜렉션이름")
{ "ok" : 1 }
> show collections
mycollection

 

Collection 제거: db.COLLECTION_NAME.drop()

>db.COLLECTION_NAME.DROP

 

MongoDB에서는 하나의 Document 저장 시 3가지 메서드 사용

1. INSERT() : Collection에 하나의 Document 최초 저장

2. UPDATE() : 하나의 Collection에서 특정 필드만 수정할 때 사용(필드 단위로 변경)

3. SAVE() : 하나의 Document에서 특정 필드만 변경하더라도, Document 단위로 데이터를 변경

 

 

JSON 타입과 BSON 타입

자바스크립트 형식의 오브젝트 표기법

; Javascript Obect Notation

ex) p = {

eno : 1

,job : "developer"

,company : "xx"

}

 

db.insert(p)

 

BSON ; Binary Serial Object Notation)

 데이터 베이스 내에 저장될때 BSON 데이터로 변환되어 저장

 

데이터 타입
null형 { "name" : null }

undefined형 { "name" : undefined }

boolean형 { "name" : true }

64비트 부동소숫점 { "age" : 21 }

string형 { "name" : "neo" }

objectId형 { "oid" : ObjectId() }

date형 { "regdate" : new Date() }

정규식형 { "name" : /neo/i }

javascript형 { "func" : function() { /- ... *- } }

array형 { "array" : [ 1, 2, 3 ] }

문서형 { "person" : { "name" : "neo" } }


Read

> db.person.findOne()
처음 문서 하나를 조회

 

> db.person.find()
저장된 문서의 전체를 조회



Update

> person1.desc = []
> db.person.update({ name : "neo" }, person1)

 

> var person2 = db.person.findOne({"name" : "neo"});
> person2.desc = {"blood", "B"}

 

Delete

> db.person.remove({ name : "neo" })
컬렉션 내에 이름이 neo인 문서를 삭제
> db.person.remove()
모든 컬렉션의 문서를 삭제

 

-mongodb CRUD

 

Document 추가: db.COLLECTION_NAME.insert(document)

>db.COLLECTION_NAME.insert(document)

> db.books.insert({"name": "NodeJS Guide", "author": "Velopert"})
WriteResult({ "nInserted" : 1 })

> db.books.insert([
... {"name": "Book1", "author": "Velopert"},
... {"name": "Book2", "author": "Velopert"}
... ]);
BulkWriteResult({
      "writeErrors" : [ ],
     "writeConcernErrors" : [ ],
     "nInserted" : 2,
      "nUpserted" : 0,
     "nMatched" : 0,
      "nModified" : 0,
      "nRemoved" : 0,
      "upserted" : [ ]
})

> db.books.find() //컬렉션이 다큐먼트 리스트 확인 명령어

명령어 사용 전 데이터를 추가 할 데이터베이스를 선택

배열형식의 인자를 전달해주면 여러 다큐먼트를 동시에 추가 할 수 있음

 

Document 제거: db.COLLECTION_NAME.remove(criteria, justOne)

두 가지 매개변수

parameter type 설명
*criteria document 삭제 할 데이터의 기준 값 (criteria) 입니다. 이 값이 { } 이면 컬렉션의 모든 데이터를 제거합니다.
justOne boolean 선택적(Optional) 매개변수이며 이 값이 true 면 1개 의 다큐먼트만 제거합니다. 이 매개변수가 생략되면 기본값은 false 로 서, criteria에 해당되는 모든 다큐먼트를 제거합니다.
> db.books.find({"name": "Book1"})
{ "_id" : ObjectId("56c097f94d6b67aafdeb88ac"), "name" : "Book1", "author" : "Velopert" }
> db.books.remove({"name": "Book1"})
WriteResult({ "nRemoved" : 1 })
> db.books.find()
{ "_id" : ObjectId("56c08f3a4d6b67aafdeb88a3"), "name" : "MongoDB Guide", "author" : "Velopert" }
{ "_id" : ObjectId("56c08f474d6b67aafdeb88a4"), "name" : "NodeJS Guide", "author" : "Velopert" }
{ "_id" : ObjectId("56c097f94d6b67aafdeb88ad"), "name" : "Book2", "author" : "Velopert" }

.pretty() : display 모양이 예쁘게 나옴 ㅎㅎ

 

ex)

학생 필드에 이름, 학과, 나이, 취미(배열)로 삽입

> db.stu.insert({"name" : "kim", "dept" : "computer", "age" : 20, "hobby":["kkk","ttt","yyy"]})
WriteResult({ "nInserted" : 1 })
> db.stu.find().pretty()
        { "_id" : ObjectId("5d770c463b5ad95f3a6bdb43"),
          "name" : "kim",
          "dept" : "computer",
          "age" : 20,
          "hobby" : [
                         "kkk",
                         "ttt",
                         "yyy"
           ]
}
db.stu.find()
{ "_id" : ObjectId("5d770c463b5ad95f3a6bdb43"), "name" : "kim", "dept" : "computer", "age" : 20, "hobby" : [ "kkk", "ttt", "yyy" ] }

 

-문서 검색 메소드 

예제1: 모든 다큐먼트 조회

> db.articles.find()

예제2: 다큐먼트를 예쁘게 깔끔하게 조회

> db.articles.find().pretty()

예제3: writer 값이  “Velopert” 인 Document 조회

> db.articles.find( { “writer”: “Velopert” } ).pretty()

예제4: likes 값이 30 이하인 Document 조회

> db.articles.find( { “likes”: { $lte: 30 } } ).pretty()

 

 

 Query 연산자

  • mongoDB 에서도 원하는 데이터를 찾기 위해 연산자를 사용. 
  • 연산자의 종류는 비교(Comparison), 논리(Logical), 요소(Element), 배열(Array) 등 
  • <키>:<값> / <키>:{<연산자>:<값>}
  •  
operator 설명
$eq {<키>:{$eq:<값>}} (equals) 주어진 값과 일치하는 값
$gt  {<키>:{$gt:<값>}} (greater than) 주어진 값보다 큰 값
$gte {<키>:{$gte:<값>}} (greather than or equals) 주어진 값보다 크거나 같은 값
$lt {<키>:{$lt:<값>}} (less than) 주어진 값보다 작은 값
$lte {<키>:{$lte:<값>}} (less than or equals) 주어진 값보다 작거나 같은 값
$ne {<키>:{$ne:<값>}} (not equal) 주어진 값과 일치하지 않는 값
$in {<키>:{$in:<값>}} 주어진 배열 안에 속하는 값
$nin {<키>:{$nin:<값>}} 주어빈 배열 안에 속하지 않는 값

예제5: likes 값이 10보다 크고 30보다 작은 Document 조회

> db.articles.find( { “likes”: { $gt: 10, $lt: 30 } } ).pretty()

예제6: writer 값이 배열 [“Alpha”, “Bravo”] 안에 속하는 값인 Document 조회

> db.articles.find( { “writer”: { $in: [ “Alpha”, “Bravo” ] } } ).pretty()

논리 연산자

operator 설명
$or 주어진 조건중 하나라도 true 일 때 true
$and 주어진 모든 조건이 true 일 때 true
$not 주어진 조건이 false 일 때 true
$nor 주어진 모든 조건이 false 일때 true

예제7: title 값이 “article01” 이거나, writer 값이 “Alpha” 인 Document 조회

> db.articles.find({ $or: [ { “title”: “article01” }, { “writer”: “Alpha” } ] })

예제8: writer 값이 “Velopert” 이고 likes 값이 10 미만인 Document 조회

> db.articles.find( { $and: [ { “writer”: “Velopert” }, { “likes”: { $lt: 10 } } ] } )
> db.articles.find( { “writer”: “Velopert”, “likes”: { $lt: 10 } } )
반응형

+ Recent posts