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

+ Recent posts