728x90

 

브라우저에서 다운로드 하는 것 처럼 user-agent 정보 보내기

몇몇 웹사이트는 브라우저로 다운로드하지 않는다고 판단될 경우 다운로드를 허가하지 않는 경우가 있다. 이 때 '--user-agent' 옵션으로 정보를 함께 보낼 수 있음.

 

$ wget --user-agent="나의 useragent정보넣기" DOWNLOAD-URL



 

useragent 찾는 법

1. 구글에 user agent확인 검색

http://m.avalon.co.kr/check.html

 

USER AGENT 확인

navigator.userAgent 값은 다음과 같습니다. $_SERVER['HTTP_USER_AGENT'] 값은 다음과 같습니다.

m.avalon.co.kr

2. 콘솔창에

Useragent 구글에 useragent확인 또는

콘솔창에 navigator.userAgent라고 입력을 한다.

 

다운로드 가능한지 확인

 

wget --spider 다운받을링크

올바른 링크는 잘되고 아니면 안되는 거 볼 수 있음

 

재시도 횟수

wget --tries=횟수 다운받을링크

wget --tries=75 naver.com

 

여러개 파일 다운로드

1. 폴더 만들고

 

mkdir 폴더명

2 . 거기에 링크를 여러개  다운

링크 한 칸씩 띄어써야함

 

wget -i 폴더명 링크1 링크2

 

ftp파일 전송 프로토콜(File Transfer Protocol, FTP)다운로드

는 잘 안됨..

 

이해 잘 안감요 이하 블로그설명

 

wget으로 ftp 다운로드를 할 수 있습니다.

 

anonymous ftp 다운로드는 다음 예제와 같습니다.

$ wget FTP-URL

 

인증이 필요한 ftp는 '--ftp-user'와 '--ftp-password'를 입력해야 합니다.

$ wget --ftp-user=USERNAME --ftp-password=PASSWORD FTP-URL



출처: https://sisiblog.tistory.com/25 [달삼쓰뱉]

728x90
728x90

파일 삭제

rm 파일명

 

폴더 삭제

rmdir 폴더명

 

ls -al

로 확인

 

여러개 한번에 삭제

파일명 한 칸씩 띄어서 쓰면 됨

 rm index.html index.html.1 index.html.2 index.html.3

 

 

전체 한번에 삭제 

rm *.txt

txt 형식이면 모두 삭제

참고로 안쓰는 건지 확인하고 하자

728x90
728x90

우분투 설치하고

계정생성 비번만들어

 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh|bash

(안돼서 다시함 둘중에 아무거나 하면 됨

뒤에 넣은 명령어 curl어쩌구는 됐다..)

 

하고 sudo su 슈퍼모드로

 

에서 다시 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh|bash

 

nvm install node

이거 해서 노드깔아줌

 

잉 nvm 찾을 수 없다고 뜨네

 

 

환경설정을 해줘야하는구나

. ~/.nvm/nvm.sh

 

 

nvm install node

이거 해서 노드깔아줌

 

 

버전확인

node -v

npm -v

 

 

----마리아디비깔기---

 

슈퍼유저로 전환되어있니

sudo su

 

 

레퍼지토리에서 업데이트 패키지가 있는지 체크하고, 설치된 패키지를 업데이트 하기

sudo apt update && sudo apt-get -y upgrade

 

 

mariaDB를 설치

sudo apt-get install -y mariadb-server

 

 mariaDB 접속하기

mysql -u root -p

 

 

에러

나는 기존에 mysql깔려있어서 포트번호가 똑같아서 에러남

 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 

 

 

에러 해결해보기

/etc/mysql/mariadb.conf.d 의  50-server.cnf 파일을 수정한다

 

 

cd /etc/mysql/mariadb.conf.d/

ls -la

vi 50-server.cnf

 

들어가서 

i눌러서 편집모드로 바꾸고

#주석 지우고 포트번호를 3307로 바꿔줌

esc눌러서 편집끝내고 :wq로 저장후 종료를 한다

cat 50-server.cnf로 내용 잘바뀌었나 확인한다

 

 

 

서버구동하기

sudo service mysql restart

 

 

MariaDB 접속하기

mysql -u root -p

 

 

확인하기

show databases;

잘뜸~

 

 

 

 

 

 

https://codecoco.tistory.com/58

 

[리눅스] ubuntu에 MariaDB 설치하기 // ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run

0. SuperUser 로 전환하기 sudo su 1. 레퍼지토리에서 업데이트 패키지가 있는지 체크하고, 설치된 패키지를 업데이트 하기 sudo apt update && sudo apt-get -y upgrade root@DESKTOP-RJ31OF5:/home/ubuntu# sudo..

codecoco.tistory.com

 

728x90
728x90

출처: https://webdir.tistory.com/101

 

리눅스 디렉토리 구조

리눅스의 디렉토리 혹은 파일 시스템 구조는 윈도우와는 조금 다른 구조를 가지고 있습니다. 기본적으로 디렉토리를 구분하는 '/'(슬래시)는 리눅스에서 사용하고 윈도우는 반대인 '\'(역슬래시)

webdir.tistory.com

윈도우는 GUI 그래픽 유저 인터페이스 사용자편의에 초점

리눅스는 

 

 

리눅스 시스템의 디렉토리 구조는 전체적으로 역 트리(tree) 구조


자주쓰는 명령어

https://itholic.github.io/linux-basic-command/

 

[linux] 리눅스 기본 명령어/자주 쓰는 명령어

리눅스 기본 명령어

itholic.github.io

 

/(루트)

최상의 디렉토리인 루트 디렉토리를 의미하며, 리눅스의 모든 디렉토리들의 시작점이다. 즉, 모든 디렉토리들을 절대경로로 표기할 때에 이 디렉토리로부터 시작해야 한다.

/bin

기본적인 명령어가 저장된 디렉토리. 즉, 리눅스 시스템사용에 있어 가장 기본적이라고 할 수 있는 mv, cp, rm 등과 같은 명령어들이 이 디렉토리에 존재하며 root 사용자와 일반사용자가 함께 사용할 수 있는 명령어 디렉토리이다.

/boot

부팅에 필요한 가진 파일들이 저장되는 곳. 리눅스 부트로더(Boot Loader)가 존재하는 디렉토리. 즉, GRUB 과 같은 부트로더에 관한 파일들(grub.conf 등)이 이 디렉토리에 존재한다.

/dev

시스템 디바이스(device)파일을 저장하고 있는 디렉토리. 즉, 하드디스크 장치파일 /dev/sda, CD-ROM 장치파일 /dev/cdrom 등과 같은 장치파일들이 존재하는 디렉토리이다.

/etc

시스템의 거의 모든 설정파일이 존재하는 디렉토리. /etc/sysconfig(시스템 제어판용 설정파일), /etc/passwd(사용자관리 설정파일), /etc/named.conf(DNS 설정파일) 등과 같은 파일들이 존재한다.

/etc/mai/

sendmail.cf 나 access 파일등의 sendmail 의 설정파일들이 존재하는 디렉토리.

/etc/ssh/

SSH 서비스, 즉 sshd 데몬에서 사용하는 각종 설정파일들이 존재하는 디렉토리.

/etc/squid/

squid 프락시서버의 설정파일들이 저장된 디렉토리.

/etc/samba/

삼바관련 설정파일들이 저장된 디렉토리

/etc/skel/

계정사용자 생성시의 초기화파일들이 저장된 디렉토리(useradd 에서 사용함)

/etc/rc.d/

부팅레벨별 부팅스크립트파일들이 존재하는 디렉토리.

/etc/rc.d/init.d/

시스템 초기화 파일들의 실제파일들이 존재함.

/etc/pam.d/

PAM 설정 정보파일들이 저장된 디렉토리.

/etc/httpd/

RPM 으로 설치된 아파치 설정파일(httpd.conf 등)들이 저장된 디렉토리.

/etc/cron.d/, /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly/, /etc/cron.weekly/

모두 크론설정파일이 존재하는 디렉토리임.

/etc/xinetd.d/

xinetd 수퍼데몬에 의해 서비스되는 서비스설정파일이 존재함.

/home

사용자의 홈 디렉토리가 생성되는 곳, useradd 명령어로 새로운 사용자를 생성하면 대부분 사용자의 ID와 동일한 이름의 디렉토리가 자동으로 생성됨.

/lib

커널과 프로그램에 필요한 각종 라이브러리가 저장되는 곳. 커널모듈파일과 라이브러리파일 즉, 커널이 필요로하는 커널모듈파일들과 프로그램(C, C++ 등)에 필요한 각종 라이브러리 파일들이 존재하는 디렉토리.

/media

DVD, CD-ROM, USB 등과 같은 탈부착이 가능한 장치들의 마운트포인트로 사용되는 디렉토리.

/mnt

/media 디렉토리와 비슷한 용도로 탈부착이 가능한 장치들에 대하여 일시적인 마운트포인트로 사용하는 디렉토리.

/proc

일명 "가상파일시스템" 이라고 하는 곳으로 현재 메모리에 존재하는 모든 작업들이 파일형태로 존재하는 곳이다. 디스크상에 실제 존재하는 것이 아니라 메모리상에 존재하기 때문에 가상파일시스템이라고 부른다. 실제 운용상태를 정확하게 파악할 수 있는 중요한 정보를 제공하며 여기에 존재하는 파일들 가운데 현재 실행중인 커널(kernel)의 옵션 값을 즉시 변경할 수 있는 파라미터파일들이 있기 때문에 시스템 운용에 있어 매우 중요한 의미를 가진다.

/root

시스템 최고관리자인 root 사용자의 개인 홈디렉토리.

/sbin

ifconfig, e2fsck, ethtool, halt 등과 같이 주로 시스템 관리자들이 사용하는 시스템관리자용 명령어를 저장하고 있는 디렉토리.

/tmp

일명 "공용디렉토리" . 시스템을 사용하는 모든 사용자들이 공동으로 사용하는 디렉토리. mysql 에서 사용하는 mysql.sock 등과 같은 소켓파일, 또는 아파치에서 사용하는 세션파일등이 생성되기도 한다. 웹해킹에 사용되기도 해서 주의를 요망.

/usr

시스템이 아닌 일반사용자들이 주로 사용하는 디렉토리. 즉, c++, chsh, cpp, crontab, du, find등과 같이 일반사용자들용 명령어들은 /usr/bin 에 위치한다.

/usr/bin/

일반 사용자들이 사용가능한 명령어 파일들이 존재하는 디렉토리.

/usr/X11R6/

X 윈도우 시스템의 루트 디렉토리.

/usr/include/

C 프로그램에 필요한 헤드파일(*.h) 디렉토리.

/usr/lib/

/lib 에 들어가지 않은 라이브러리 디렉토리.

/usr/sbin/

/bin 에 제외된 명령어와 네트워크관련 명령어가 들어있는 디렉토리.

/usr/src/

프로그램 소스(주로 커널소스)가 저장되는 디렉토리.

/usr/local/

MySQL, Apache, PHP 등과 같은 어플리케이션들을 소스로 컨파일설치할 때 사용되는 장소.

/usr/share/man/

명령어들의 도움말을 주는 메뉴얼(manual)페이지 디렉토리. 즉, 이 디렉토리에는 시스템에서 사용하는 모든 맨페이지파일(man page)이 존재함.

/var

시스템운용중에 생성되었다가 삭제되는 데이터를 일시적으로 저장하기 위한 디렉토리. 거의 모든 시스템로그파일은 /var/log 에 저장되고, DNS 의 zone 설정파일은 /var/named 에 저장되고, 메일파일은 /var/spool/mail 에 저장되며, 크론설정파일은 /var/spool/cron 디렉토리에 각각 저장됨.

/var/tmp/

/tmp 디렉토리와 같은 공용디렉토리. 즉, /tmp 디렉토리와 /var/tmp 디렉토리의 퍼미션은 1777 로서 sticky bit 가 설정되어 있는 공용디렉토리이다. 리눅스 시스템에서 공용디렉토리는 /tmp 와 /var/tmp 둘뿐이다.

/var/log/

시스템로그파일(messages, secure, xferlog 파일등)이 저장되는 디렉토리.

/var/ftp/

vsftp 등과 같은 FTP 서비스를 위한 다운로드될 파일들 즉, FTP 홈디렉토리.

/var/named/

BIND 즉, DNS 에서 사용하는 zone 파일들이 저장되는 디렉토리.

/var/spool/mail/

각 계정사용자들의 메일파일이 저장되는 디렉토리.

/var/spool/lpd/

프린트를 하기 위한 임시 디렉토리(스풀링 디렉토리).

/var/spool/mqueue/

발송을 위한 메일 일시저장 디렉토리.

/var/spool/cron/

각 사용자들의 cron 설정파일들이 저장된 디렉토리.

/var/spool/at/

atd 즉, 예약작업에 관한 파일들이 저장되는 디렉토리.

/lost+found

최상위 디렉토리인 / 디렉토리에만 존재하는 것이 아니라 파일시스템마다 존재할 수 있는 디렉토리임. 이 디렉토리는 fsck 또는 e2fsck 등과 같은 파일시스템 체크 및 복구유틸리티 실행후에 주로 생성이 되는 것으로서 복구되지 않은 채로 블록(block)만 존재하는 파일 즉, 연결이 끊어진 inode 들이 숫자파일형태로 존재하는 곳임. 숫자형태로 존재하는 파일들은 mv 명령어로 파일이름만 바꾸면 바로 복구될 수 있다.

 

출처 :리눅스 서버관리 실무 바이블 v3.0



728x90
728x90
package main

import "fmt"


type Node struct {
	next *Node
	val  int
}
//결합성 높이고 의존성 줄여~
//관련있는 애들 묶어주자. 하나의 struct으로 묶기


//1. 새 struct만듦
type LinkedList struct { 
	//루트를 포인트형으로 가지고 있음
	root *Node
	tail *Node
}

//2. 메서드 3개 추가함  add remove printNode
//LinkedList가 가지고 있는기능, 메서드
func (l *LinkedList) AddNode(val int) {
	if l.root ==nil {
		//없는 상태면
		//루트는, 새로만든 노드의 메모리 주소를 포인트 형태로 갖고 있고
		l.root = &Node{val:val}
		//테일은 자료가 없으니까 루트랑 똑같음
		l.tail= l.root
		return
	}
	//꼬리 다음을 새로운 노드 만들어서 붙이면 됨
	l.tail.next = &Node{val:val}
	l.tail= l.tail.next
}


func  (l *LinkedList)  RemoveNode(node *Node ) {
	if node == l.root {
		l.root = l.root.next 
		node.next = nil
		return
	}

	prev := l.root
	for prev.next != node {
		
		prev = prev.next

	}
	if node== l.tail {
		prev.next = nil
		l.tail = prev
	} else {
		prev.next= prev.next.next
	}
	node.next = nil
}



func (l *LinkedList)  PrintNodes() {
	//그다음 노드가 없을때까지 전진
	node := l.root
	for node.next != nil {
		fmt.Printf("%d -> ",node.val)
		node = node.next
	}
	fmt.Printf("%d\n",node.val)
}


func main() {
	//이안에 root와 tail 포함되어있어서 따로 만들 필요 없음
	list := &LinkedList{}
	list.AddNode(0)

	// var root *Node
	// var tail *Node
	// //노드의 주소를 root로 가지고 있음
	// root = &Node{val: 0}
	// //맨처음꺼 하나만 있을 때는 tail은 root와 같음
	// tail= root

	for i:=1; i<10; i++ {
		// tail= AddNode(tail,i)
	    list.AddNode(i)
	}
	
	list.PrintNodes()



   list.RemoveNode(list.root.next)

	list.PrintNodes()

    list.RemoveNode(list.root)
	list.PrintNodes()

	list.RemoveNode(list.tail)
	list.PrintNodes()
	fmt.Printf("tail:%d\n", list.tail.val)

}

// //노드 추가하는 거를 함수로 만들게요 //새로 추가된 노드로 반환값있어야함
// func AddNode(tail *Node, val int) *Node {

// 	// var tail *Node
// 	// tail = root
// 	// for tail.next != nil {
// 	// 	tail = tail.next
// 	// }
// 	//맨 마지막에 새 노드 추가
// 	node := &Node{val: val}
// 	tail.next = node
// 	return node

// }


// func RemoveNode(node *Node,root *Node, tail *Node ) (*Node, *Node) {
// 	//내가 지우고자 하는 노드가 맨 앞인 경우
// 	if node == root {
// 		//새로운 루트는 기존 루트의 다음이 됨
// 		root = root.next
// 		if root == nil {
// 			tail= nil
// 		}
// 		return root, tail

// 	}
// 	//이전 노드 다음이 현재 지우고자 하는 노드가 아니면
// 	//이전을 이전다음으로 보내. 맞게 되면 for문 빠져나가 
// 	prev := root
// 	for prev.next != node {
		
// 		prev = prev.next

// 	}
// 	if node== tail {
// 		prev.next = nil
// 		tail = prev
// 	} else {
// 		prev.next= prev.next.next
// 	}

// 	return root, tail
// }

// func PrintNodes(root *Node) {
// 	//그다음 노드가 없을때까지 전진
// 	node := root
// 	for node.next != nil {
// 		fmt.Printf("%d -> ",node.val)
// 		node = node.next
// 	}
// 	fmt.Printf("%d\n",node.val)
// }
728x90
728x90

https://youtu.be/r1_G9ayX980

d

동적배열 종류

c++ STL에 vector / java에는  array list/ c#에는 list / golang에는 slice

 

동적배열은?  <--------------------------> 정적배열(fixed size array 길이 정해진 배열 [10]int)

[]int

길이 변하는 배열

 

실제 고정 길이의 배열이 따로 있고 그 고정 길이 배열을 가르키고, 포인트하고 있다!!

배열의 길이가 늘어나면 새로운 더 긴 배열을 만든 다음에 거기로 모든 값을 복사시키고 그 배열로 포인트 바꿈

 

"동적 배열은 실제 배열을 포인트하고 있다."

 

 

 

동적배열선언 만드는 여러 방법들

var a [] int

a:=[]int{초기값}

a:=make([]int,3)

a:=make([ ]int,  length, capacity)

 

length 길이

내가 쓰고 있는 길이

 

capacity 확보해놓은 공간

 

(동적배열, 값을 추가할 때 배열 늘리는데 2배씩 확보해놓음 그래서 길이와 cap다를 수 있음)

항목 추가 명령어 append

a:= []int {}

a= append(a,1)

a에 다시 대입

 

슬라이스 = append(슬라이스,항목)

 

 

a[start Index : End Index]

   (start ~ end]  마지막은 포함안됨

 

a[10]int{1,2,3,4,5,6,7,8,9,10}

a[4:6]

a[시작인덱스 5번째 : 6번째]

즉 5번째~6번째까지 슬라이스 의미

 

a[4: ]

5번째부터~ 끝까지

a[ :4]

처음부터 ~4번째까지

 

슬라이스는 원래 배열이 있고 그 배열을 가르키는 포인터

슬라이스는 잘라내는 게 아니라 그 일부분을 가르키는 배열! 

 

 

 

//추가된 값이 원래길이,확보된 공간 벗어나게 되면

새 메모리 만들어서 거기에 복사됨. 그럼 메모리 주소 바뀜!

코드로 보기

package main

import "fmt"

func main() {

//////////////////////////////////len cap 메모리를 새로 확보해야돼서 주소도 달라짐  새로운 메모리에 담아서
	// a:= []int{1,2}
	// b:= append(a,3)
	// fmt.Printf("%p %p\n",a,b)
	// for i := 0; i<len(a); i++{
	// 	fmt.Printf("%d,",a[i])

	// }
	// fmt.Println()
	// for i := 0; i<len(b); i++{
	// 	fmt.Printf("%d,",b[i])
	// }
	// fmt.Println()

	// fmt.Println(cap(a)," ", cap(b))

	///////make로 넣기//메모리 같아서 b값 바꾸니까 a도 바뀜

	// a:= make([]int, 2,4)
	// a[0]=1
	// a[1]=2
	// b:= append(a,3)

	// fmt.Printf("%p %p\n",a,b)
	// fmt.Println(a)
	// fmt.Println(b)
	// b[0]=4
	// b[1]=5

	// fmt.Println(a)
	// fmt.Println(b)
	//////처음부터 아예 공간을 다르게 확보하게 싶다면
	// a:= []int{1,2}
	//
	// a := make([]int, 2, 4)
	// a[0] = 1
	// a[1] = 2
	// //슬라이스 새로 만듦
	// b := make([]int, len(a))
	// for i := 0; i < len(a); i++ {
	// 	b[i] = a[i]
	// }
	// b = append(b, 3)
	// fmt.Printf("%p %p\n",a,b)

}

 

3가지 경우임

1. 값넘쳐서 새 메모리에 담아짐

2. 값안넘쳐서 메모리 a랑 b같음 b변경될때 그대로인 메모리안에서 바뀌어서 a도 바뀜

3. 아예 슬라이스 새로 만들어서 공간 따로 확보함

 

 

 

//배열 뒤에서 하나씩 지우기

package main

import "fmt"

//뒤에 하나씩 지워나가는 함수//배열 반환,int 맨뒤에 값도 반환
func RemoveBack(a []int) ([]int, int){
	//처음부터 a배열길이에서 1뺀것, 즉 맨뒤에를 하나 없앤다
	return a[ :len(a)-1], a[len(a)-1]

}

func main() {


a:=[]int{1,2,3,4,5,6,7,8,9,10}

	for i :=0; i<5; i++{
		var lastlostone int
		a, lastlostone= RemoveBack(a)
       fmt.Printf("%d,",lastlostone)
	}
	fmt.Println()
	fmt.Println(a)


}

 

 

 

728x90
728x90

print: 괄호안 내용을 단순히 출력, 줄바꿈 안됨

printf: %d,%f 등을 쓸 때 사용. 

println: 괄호안 내용 출력한 후 한 줄 띄워짐

 

 

 

 

 

 

728x90
728x90

1. %d : 10진수로 출력 정수형
2. %f : 실수형
3. %e : 지수형
4. %o : 8진수로 출력
5. %x : 16진수로 출력
6. %u : 부호없는 10진수로 출력
7. %g : 실수형으로 자동 출력
8. %p : 포인터의 주소를 출력
9. %c : 하나의 문자로 출력 문자형
10. %s : 문자열을 출력

출처: https://clanguage.tistory.com/1 [프로그래밍 블로그]

728x90
728x90

11월 팀플 때 서버배포를 시도하면서 

aws를 썼다. 무료 프리티어지만 용량초과되면 돈 나간다길래 

나름 조심해서 썼다. 

 

(인스턴스를 여러 나라별로 만들어봐서 문제가 생긴걸까..?)

암튼 옆에서 이전달에 쓴게 청구됐다는 얘기를 들어서 쓰고 바로 

인스턴스 중지를 했다. 그리고 이번달, 다음달, 예상청구금액 없는것도 확인함.

 

 

 

하지만

며칠 전

돈 빠져나감!

 

찾아보고 청구서를 자세히보니까 "탄력적 ip"를 썼기 때문이었음 (블로그 보면서 무작정 따라하다보니..ㅜ)

그중에서도 

탄력적ip가 인스턴스랑 연결 안되어있어서 돈 나간다는 거. 

그래서 탄력적ip 바로 삭제하러 갔는데

 

연결해제나 다른 버튼은 활성화안되어있었음

찾아보니까 

릴리즈

가 삭제라길래 그거 누르니까 삭제됨

 

근데 문제는!!! 

심지어 12월 예상청구금액도 찍혀 있었음 충격

얘도 마찬가지로 탄력적 그 똑같은 서비스가 청구됐다고 뜸

 

혹시 몰라서 찾아보면서 있는거 다지움

 

이제 됐겠지 하고 

 

문의메일도 보냄

 

나 11월에 완전 조금 쓰고 중지할거했는데도 돈나갔고

무엇보다 12월에 요금이 자꾸 추가되고 오른다 문제있다 환불해달라

 

 

하니까 11월꺼 환불해줌 근데 문제에 대한 답장은 없음

 

 

 

됐으려나 기다림 

계정 삭제하고 싶은데 뭐가 문제인지 너무 알고 싶음(12월금액 자꾸오르는 이유)

 

 

근데 다음날 또 확인해보니 12월 예상청구금액 3배 오름 

안돼..

 

 

예약도 구독도 없어!

혹시 몰라서 비번도 바꿈

 

메일 답장왔는데 11월 환불잘해줬고 

12월은 너가 이전에 쓴거에 대한 요금이야

이러는데 

 

왜 추가돼? 지금 안쓰는데 왜 오르냐고요

 

 

근데 찾다보니 이거 봄 온디맨드 비용 

뭐 이런게 충당률 보고서에 있더라 

하지만 이게 언제 지출된건지 안나와서

11월꺼일수도 있음

 

(12월 청구된것도 마찬가지로 탄력적ip에서 나갔다하니까..)

 

문제는 계정을 해지해도

예약 인스턴스나 

구독인 애 있으면 돈 계속 나간다는 거야

그게 무서워

 

위에서 봤듯이 하나하나 다 눌러보고 확인해봤는데 없어

온디맨드 저게 예약 항목에 있어서 걱정되고...

온디맨드는 사용한 시간당 돈 지불하는 원래보다 저렴하게 하게 해주는 그런 서비스인거같던데

진짜 뭘까.

 

결론 아무리 찾아보고 해봐도 

나는 안쓰는게 맞는데 계속 12월 쌓이는거 보는거보다 

일단 계정 자체를 해제하기로 마음먹음(예약인스턴스,구독없는거 확인했으니까)

 

 

 

이런 것도 발견함. 의심시작 얜가?

(뭔지 잘모르겠음 내 생각에 내가 사용했던 프리티어 그 크레딧인듯. 구독..그거랑 다르겠지

게다가 사용한 금액 0 이고 남은금액이 오히려 찍혀있는데..

 

확인했다고 없다고 구독같은거 안했다고)

 

 

 

만료 날짜까지 돈나가는거 아니야? 후덜덜해지기도 함

정말 aws 야금야금 돈 뜯어가네

 

해지해도 이전에 청구된거는 다 받아가고

구독,예약있음 뜯어간대 조심

 

결제 예정이거나 미납된 애들 없는거 다 확인하긴 했는데

12월 예상청구...저 놈이 있으니까

거기까지는 오케이해도

 

다음에 더 계속 나가면 문의해야쥐

 

 

 

찾아보면서 진짜 영어잘해야겠다 싶은게 타고 들어가다 보면 공식문서 영어임

거의 1000만원 나와서 취소하려는 사람도 프리토킹으로 해결했다고 하고

 

aws 뒤통수 때리기 멈춰!! 

 

(예산 제한 그것도 설정해봤는데 걍 내가 제한해놓은 값까지만 결제되는게 아니고 넘어갔다고 알람해주는 거였음.....ㅎ

얘네도 그거 알아서 그런지 처음에 환불문의하는거는 돌려주는 거 같긴함. 다른 사람들 중에서도 진짜 안쓰는데 계속 돈나가서 문의하니까 자기네들 설정이 잘못되어있는게 맞다고 너 안쓰는거 맞다고 취소해줬다고 함. )

 

 

 

 

 

 

 

조심...또 조심...

728x90
728x90
package main

import "fmt"

func main() {

   //a는 int 형 이라 선언
	var a int
	//p는 int형 포인트
	var p *int
	//p에 a 주소 대입, p의 값은 a의 주소를 가르키고 있다
	p = &a
	//a는 3으로 대입
	a=3
	//3
	fmt.Println(a)
	//0xc000100028 메모리의 주소 나옴
	fmt.Println(p)
	//포인터가 가르키는 값 3(주소가 가르키는 값)
	fmt.Println(*p)
    
    }

 

 

 

 

포인터 왜 쓰냐 

원래 a출력했을 때 

x++로 해도 

값만 복사됐지 a와 b는 다른거라서  1추가 안되고 여전히 1이었음

x는 괄호 밖에서 역할 못하고

 

포인터 쓰면

package main

import "fmt"

func main() {

//포인터가 왜 사용되는지 보자`~~~~`
var a int
  a=1
  //포인터형 *x으로 해서 a의 주소값으로 해야함
  Increase(&a)

  fmt.Println(a)
}

func Increase(x *int) {
	//x가 가지고 있는 값은 메모리 주소인데
	//그 메모리가 가르키는 주소의 값은 = 메모리가 가르키는 주소의 (원래)값 + 1
*x=*x+1

//얘는 아까 x++와 같은 거라 볼 수 있쥐, 그때 포인터로 안하면 a에서 값만 복사돼서 x++여도 x는 함수 안이라서 a가 늘어나진 않았어
}

 

 

 

 

 

 

이거 사용해서

 

structure로 만든 거 보기

 

함수는 값이 복사돼서 쓰이기만 하지 

안에 있는 s는 다 다른거임 그래서 결과도 넣은 거 안나오고 

수학,a라고 나옴

package main

import "fmt"


type Student struct {
name string
age int
grade string
class string

}

func (s Student) PrintSungjuk(){

	fmt.Println(s.class,s.grade)
}

func (s Student) InputSungjuk(class string, grade string){
    s.class = class
	s.grade =grade
}


func main(){
	var s Student= Student{name: "t",age:23, class: "수학",grade: "A"}
 s.InputSungjuk("과학","c")
 s.PrintSungjuk();
}

 

 

s를 포인터형으로 받으면 해결됨!!!

*Student로 바꿔주면 됨

package main

import "fmt"


type Student struct {
name string
age int
grade string
class string

}

func (s *Student) PrintSungjuk(){

	fmt.Println(s.class,s.grade)
}

func (s *Student) InputSungjuk(class string, grade string){
    s.class = class
	s.grade =grade
}


func main(){
	var s Student= Student{name: "t",age:23, class: "수학",grade: "A"}
 s.InputSungjuk("과학","c")
 s.PrintSungjuk();
}

결과가 과학,c로 잘 나옴

 

 

 

복사될 때 student 메모리의 주소만 복사 되는거

s는 메모리 주소값을 가지고 있는거

s.class 한거는 

s 메모리 주소값이 가르키고 있는 값의 class를 변경. 

 

 

 

C++에서는 

메모리 주소가 가르키는 값의 뭘 변경하고 싶을 때 

p->grade  = "c" 이런 식으로 씀(-> 포인터 앞에 이 화살표 사용)

 

값value 형태에만 . 점 찍을 수 있음

(값)s.grade

 고랭에서는 화살표랑 점 구분 안해

p.grade = "c"  포인터여도 점

s.grade ="c"  그냥 내부 값이어도 점

 

 

 

 

structure 만들고 그안에 속성넣고

기능도 만들었을 때

 

그 기능이 그 값의 내용을 변경한다 할때는

값의 형태가 아니라 포인터의 형태로 받는다는거!

 

 

 

포인터 형태로 호출하면 메모리 주소만 복사 된다

값 형태로 호출하면, 인자를 값 형태로 받으면 전체 값이 다 복사 된다

 

 

 

 

 

강의 좋구만~~

 

https://youtu.be/nBAKHq12kew

 

728x90
728x90

함수 호출 과정은 무조건 복사로 이뤄진다

복사 일어날 때 값이 복사되는 거지

그 메모리가 그대로 전달되는 게 아님~~!!!

 

이걸 해결하기 위해서 포인터가 나옴

 

//

 

객체, 구조체에 대해 알아봤고

구조체는 속성 모아놓은거임

기능을 가질 수도 있음 (함수)

 

속성, 기능 가지고 있는게 구조체

 

 

 

 

 

https://youtu.be/59SpbJX5kTI

 

728x90
728x90

이해한 내용 적어보자면~~

 

값 연결된 형태

next 로 다음 값 가르키고 있음

 

array랑 많이 비교되곤 하는데

값을 삽입하고 뺄 때 array에 비해서 빠름!

대신 조회할 때는 상대적으로 느림 

 

링크드리스트

연결된 그 뭉텅이...를 노드라고 함

 

노드 안에는 값이랑 다음 노드를 가르키는 애(이름뭐였지)가 있음

 

맨앞에 있는 노드를 head

맨 뒤 꼬리에 있는거 tail

 

head를 찾아서 next로 값 빼고 넣고 함

 

변수로 새로 할당해서 하는데 삭제를 먼저 하는게 아니라

다음값 가르키고 나서 삭제해야 뒤에 안잃어~

https://visualgo.net/ko

 

VisuAlgo - 영상을 통한 자료구조와 알고리즘의 시각화 (한국어판) (Korean)<br>

VisuAlgo is free of charge for Computer Science community on earth. If you like VisuAlgo, the only payment that we ask of you is for you to tell the existence of VisuAlgo to other Computer Science students/instructors that you know =) via Facebook, Twitter

visualgo.net

-> 이 비주얼고로 알고리즘 어떻게 작동되는지 살펴볼 수 있음 좋구만

 

본 강의

https://youtu.be/sq49IpxBl2k

 

 

 

 

 

 

 

 

 

 

728x90
728x90

같은 타입의 여러 객체를 저장하는 일종의 집합

컨테이너는 클래스 템플릿으로,

(컨테이너는..데이터를 저장하고 관리하기 위한 클래스)

컨테이너 변수를 선언할 때 컨테이너에 포함할 요소의 타입을 명시할 수 있다.

컨테이너에는 복사 생성과 대입을 할 수 있는 타입의 객체만을 저장할 수 있고

요소의 추가 및 제거를 포함한 다양한 작업을 도와주는 여러 멤버 함수를 포함하고 있다.

 

 

컨테이너의 종류

STL에서 컨테이너는

자료를 저장하는 방식

관리하는 방식에 따라 여러 가지 형태로 나뉠 수 있음

 

STL 컨테이너는 크게 다음과 같이 세 가지 유형으로 구분됨

 

1. 순차(시퀀스) 컨테이너(sequence container)

데이터를 선형으로 저장하며, 특별한 제약이나 규칙이 없는 가장 일반적인 컨테이너

 임의의 위치에 삽입, 삭제가 가능합니다.

 데이터를 순차적으로 저장합니다.

 일반적인 자료구조와 동일한 형태

 자료를 입력한 순서대로 저장하기 떄문에 저장, 검색, 알고리즘에 불리

 => 많지 않은 자료, 검색 속도 중요하지 않을 때 사용

 

 

vector(가변배열), deque(덱,앞뒤로 넣고 빼는큐), list(양방향 연결리스트), forwad_list(단방향 연결리스트)

 

2. 연관 컨테이너(associative container)

데이터를 일정 규칙에 따라 조직화하여 저장하고 관리하는 컨테이너

검색에 유리

 

set, multiset, map, multimap

 

3. 어댑터 컨테이너 (adapter container)

결함과 명료성을 위해 인터페이스를 제한한 시퀀스나 연관 컨테이너의 변형

단, 반복자를 지원하지 않으므로 STL 알고리즘에서는 사용할 수 없습니다.

 

 

stack, queue, priority_queue

 

출처

http://tcpschool.com/cpp/cpp_container_intro

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com


출처: https://heekim0719.tistory.com/314 [별토끼 DEVLOG]

 

[C++] STL Container 개념 및 특징

[C++] STL Container 개념 및 특징 STL(Standard Template Library) 란? C++의 템플릿을 이용해 표준으로 정리된 라이브러리 STL의 구성 요소 1. 반복자 :STL 컨테이너에 저장된 원소들을 가리키는 포인터 2. 컨테..

heekim0719.tistory.com

 

728x90
728x90

출처: https://shjz.tistory.com/13 [밤머리 이야기]

 

[C++] STL : Standard Template Library 1 -표준 템플릿 라이브러리란?

STL이 무엇인지 알고 계십니까? C++를 주 프로그래밍 언어로 사용하고 계신 분들은 알고 있으리라 생각합니다. STL은 C++ 언어의 '표준 템플릿 라이브러리 (Standard Template Library) '의 약자입니다. STL을

shjz.tistory.com

STL

자료구조와 알고리즘 모음 라이브러리

STL은 템플릿으로 만들어짐 

 

 

 

[질문] C++로 할 수 있는 프로그래밍 스타일은 절차적 프로그래밍, 객체 지향 프로그래밍만 있을까요?

[답] 아니오. Generic Programming 도 가능합니다.



Generic Programming은 한국에서는 보통 '일반적 프로그래밍'이라고 이야기 합니다. 저도 처음에는 그렇게 들었습니다. 

 

그러나 이것은 잘못된 표현이지 않을까 생각합니다. 영어 사전을 보면 Generic 이라는 것은 '총칭(總稱)적인' 이라는 뜻도 있는데 이것이 '일반적'이라는 단어보다 더 확실하며 제가 2004년에 일본에서 구입한 "C++ 설계와 진화(Bjarne Stroustrup 저)"라는 일본 번역서에도 Generic은 총칭으로 표기하고 있습니다. 

 

클래스는 아시는 바와 같이 멤버 변수와 멤버 함수로 이루어져 있습니다. 그리고 멤버 함수도 그 내용은 저의 생각에 의해 변수들이 조작으로 되어 있습니다. 

 

'암소는 동물이다'라는 식으로 C++ 언어에서 총칭을 하는 것은 변수의 타입(type)을 총칭화 하는 것입니다

 

 

STL의 구성 요소

1. 반복자 :STL 컨테이너에 저장된 원소들을 가리키는 포인터

2. 컨테이너 : 데이터를 저장하고 관리하기 위한 클래스 (vector, list, map, deque 등..)

3. 알고리즘 : STL에서 제공하는 함수 (ex. 정렬, 검색 등..)



출처: https://heekim0719.tistory.com/314 [별토끼 DEVLOG]

 

728x90
728x90

스택

후입선출(가장 늦게 넣은 데이터가 가장 빨리 나가는 것)

객체들의 집합소, 데이터를 기록하는 구조

비어있는 스택에서 원소 추출하려하면 stact underflow

스택 넘치는데 스택 추가하려고 하면 stack over

집합에서 가장 오랜 시간 존재했던 원소를 삭제

선입선출( 가장 먼저 넣은 데이터가 가장 빨리 나간다)

 

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야함.

프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.

프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 4가지

1. 코드code 영역->실행할 프로그램의 코드저장되는 영역,cpu가 여기서 명령어 가져가서 처리함

2. 데이터data 영역->프로그램의 전역변수와 정적 변수가 저장되는 영역, 프로그램 시작과 함께 할당되고 종료되면 소멸

3. 스택stack 영역->함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 곳,함수호출시 할당되고 종료시 소멸

4. 힙heap 영역->사용자가 직접 관리할 수 있는,그래야하는 메모리 영역,사용자에 의해 메모리공간이 동적할당되고 해제됨. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨.

 

 

--수업때 얘기는 밑에--

 

 

스택은 컴파일러가 돌기 전 단계.

힙은 구동된 다음에 메모리 반환 해제가 됨

스택 영역에 메모리 선언하면 해제도 못함

 

함수내부는 stack

헤더파일은 heap

 

선언할 때 함수에 많이 하면 터진다..스택이라서..

헤더에 해라..

 

 

 

 

출처

https://hwan1402.tistory.com/110

 

스택(Stack)과 힙(Heap) 차이점

메모리 구조 프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다. 따라서 컴퓨터의 운영체제

hwan1402.tistory.com

 

728x90
728x90

템플릿(template)은 C++ 프로그래밍 언어의 한 기능으로, 함수와 클래스가 제네릭 형과 동작할 수 있게 도와 준다. 함수나 클래스를 개별적으로 다시 작성하지 않고도 각기 다른 수많은 자료형에서 동작할 수 있게 한다. 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 틀.

출처: https://blockdmask.tistory.com/43 [개발자 지망생]

 

템플릿은 함수, 클래스 붕어빵 만드는 붕어빵 틀

재료는 객체타입

 

템플릿의 종류는 함수 템플릿과 클래스 템플릿의 두 가지가 있다.

 

함수 템플릿

여러 다른 자료형(int, long, float, double, class... )을 템플릿 인자 ('<...>' 안에 들어가는)로 받아, 함수 내부에서 활용할 수 있도록 한 것이다. 다시 말하면, 여러 다른 자료형에 대하여 같은 역할을 하는 하나의 함수 계열을 하나의 템플릿으로 표현할 수 있다는 점이다. 

클래스 템플릿

클래스 템플릿은 클래스를 템플릿 변수에따라 생성할 수 있게 하는 기능이다. 클래스 템플릿은 컨테이너의 용도로 많이 쓰인다. 

 

 

 

템플릿 특수화

특정 타입, 다른 기능수행 즉 특수화하게 하려고 따로 템플릿 정의해 만드는거

 

템플릿 만들 때는 템플릿 선언 

template <typename T>

T라는 타입에 템플릿 선언한다는 뜻 , 

myFunc(1,3)

여기 맞게 값넣으면 알아서 함수구체화됨

"이렇게 템플릿의 구체화는 컴파일 타임에 필요한 타입에 대해서만 구체화를 하게된다. 위코드에서 구체화된 두 개의 함수 이름은 같고 시그니처만 다르므로 서로 오버로딩 관계다. 색이 다른 붕어빵~"

 

 

 

둘의 차이점

클래스 템플릿 사용할 때 반드시 타입 명시해줘야 함.

auto obj = MyClass<int>(3):

 

3써서 타입추론이 자동이뤄지는거 아닐까? 왜 타입을 강제지정할까?

 

[클래스 템플릿 구체화에 대한 이해]

(객체생성) 인스턴스화가 되기 전(=생성자가 호출되기 전)에 먼저 객체를 위한 메모리가 할당되어야 하는데

메모리 할당을 위해서는 

생성자에 전달되는 인수의 타입을 미리 알아야함! (여기서 객체에서 사용되는 타입은 클래스 멤버 변수의 타입을 말함.)

즉 클래스의 생성자가 호출되기 전에 객체를 위한 메모리가 할당되어 있어야 한다는 거~

 

 

 

 

 

 

 

 

출처: 

<대박적 설명>

https://thrillfighter.tistory.com/408

 

C++ 템플릿(template) 이해하기

템플릿을 사용하여 프로그래밍 하는 것을 일반화(Generic) 프로그래밍이라고도 한다. 개인적으로 C++을 제대로 공부하기 위한 첫 번째 관문은 템플릿(template) 아닐까 생각한다. 템플릿을 알아야 S

thrillfighter.tistory.com

https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_(C%2B%2B)

728x90
728x90

c(순차적 프로그램)에서 확장됨

c++객체지향프로그램

 

객체지향프로그램: 자바,씨샵,씨플플 

 

객체지향

객체의 속성, 객체의 동작(method)

객체 묶어둔게 클래스

 

 

cout은 객체

객체에 대한 것을 어디서 정의함

 

화면출력할 때 std::cout 사용

입력은 std::cin

 

ios에 입출력 라이브러리의 모든 클래스 여기 다들어있음

 

namespace

여러개의 라이브러리 클래스들이 중복되어있을 수 있음 이들을 구분하여 중복되지 않도록 하는 키워드를 의미

 

 

함수나 클래스 작성시 소속된 네임스페이스를 일일이 기술하는 작업 번거로워서

네임스페이스 생략하기 위해 using문 사용

>  using namespace 네임스페이스명;

 

https://youtu.be/JoAdRwJi-GI

728x90
728x90

절차지향 프로그래밍, 여기에서 개선해서 객체지향 나온 거래 둘 다 함수 사용하지만

정리정돈 도구인 객체가 존재한다가 둘의 큰차이

 

함수를 만들어서 함수 안에 코드 넣어서 깔끔하게 만들어줬음

근데 이제 함수가 또 많아지면?

 

서로 연관되어있는 함수, 변수들을 객체라는 것으로 그루핑. 박스에 넣는 것처럼

그 이름 도 새로 지어. 연관된 함수들을 다른 함수랑 분류하고 그룹지어~~

그게 바로

 

객체지향(프로그래밍 방법론)

object oriented programming

 

만들어진 틀(클래스) 안에 여러 객체 묶어줘서 

번거롭지 않게 한번에 실행할 수 있음

 

 

 

 

상속은 물려받는 것

인터페이스는 장착하는 것

 

 

 

객체지향- 은닉성 특징, 내부구조는 감춰두고 외부구조에서 조작할 수 있는애들만

public으로 공개

 

 

 

 

 

https://youtu.be/vrhIxBWSJ04

https://youtu.be/dy9yQIx38u8

 

728x90

+ Recent posts