반응형
int_hex_str_bin

진법 표현 int hex str bin

파이썬에서 진법 표현 방법을 알아보자.

여러가지 진법 수 표현

기본적으로 숫자를 쓰면 10진수이다. 수 앞에 진법표기 접두어를 쓰면 해당 진법의 수로 인식을 한다. (숫자 0 다음에 문자 o/x/b)

  • 8진수 : 0o
  • 16진수 : 0x
  • 2진수 : 0b
i10 = 1234
i8 = 0o1234
i16 = 0x1234
i2 = 0b1010
print(i10, i8, i16, i2)
1234 668 4660 10
  • 그냥 print로 출력하면 10진수로 변환하여 출력해 준다.

여러가지 진법 수를 문자열로 변환

  • str, oct, hex, bin 함수를 사용한다.
i10 = 1234
print( str(i10), oct(i10), hex(i10), bin(i10))
1234 0o2322 0x4d2 0b10011010010

i16 = 0x4d2
print( str(i16), oct(i16), hex(i16), bin(i16))
1234 0o2322 0x4d2 0b10011010010
동일한 출력결과
  • 파라미터는 10진수일 필요없다. 아무거나 결국엔 십진수로 변수에 값이 할당되므로 같은 결과가 나온다.

포맷 스트링을 사용한 문자열 변환

  • format 함수로 사용하여 수를 진법 스트링으로(b, o, x) 변환한다.
  • 소문자면 소문자로 대문자면 대문자로 출력된다.
  • 앞에 #(샵)을 붙이면 prefix 도 출력한다.
print( format(1234, 'x'), format(1234, 'X'), format(1234, '#x'), format(1234, '#X') )
4d2 4D2 0x4d2 0X4D2
  • 출력 포맷 스트링을 사용하면 원하는 형태로 prefix를 줄 수 있다. (단, %방식은 %b를 지원하지 않는다.)
print( '%x %X 0x%x  '%(1234,1234,1234) )
4d2 4D2 0x4d2
print( '%d %o %x' % (1234,1234,1234) )
1234 2322 4d2
print( '{0:d} {0:o} {0:x} {0:b}'.format(1234,1234,1234,1234) )
1234 2322 4d2 10011010010

여러가지 진법 수 문자열을 수로 변환

print( int('0o2322', 8), int('0x4d2', 16), int('0b10011010010', 2) )
1234 1234 1234
  • 간단하게 스트링을 int로 타입 캐스팅하는데 기본이 10진수이고, 다른 진법인 경우는 진법을 명시를 해 주면 된다.

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

파이썬 충돌해결 module conflict  (0) 2019.12.01
파이썬 개발환경/가상환경구축  (0) 2019.12.01
크롤링 BeautifulSoup 요약  (2) 2019.11.06
크롤링(Crawl) 2편  (2) 2019.10.27
웹 크롤링 Crawl 1편  (1) 2019.10.24
반응형
derivative_br_61

61. ddxx1x22+arcsinx2\frac{d}{dx} \frac{x\sqrt{1-x^2}}{2} + \frac{arcsinx}{2}

ddxx1x22+arcsinx2=12(1x2+x2x21x2+11x2)=1x2x2+121x2=22x221x2=1x21x2=1x2 \begin{aligned} &\frac{d}{dx}\frac{x\sqrt{1-x^2}}{2} + \frac{arcsinx}{2}\\ &=\frac{1}{2}(\sqrt{1-x^2}+x\frac{-2x}{2\sqrt{1-x^2}} +\frac{1}{\sqrt{1-x^2}})\\ &=\frac{1-x^2-x^2+1}{2\sqrt{1-x^2}}=\frac{2-2x^2}{2\sqrt{1-x^2}}\\ &=\frac{1-x^2}{\sqrt{1-x^2}}=\sqrt{1-x^2} \end{aligned}


62. ddxsinxcosxsinx+cosx\frac{d}{dx} \frac{sinx-cosx}{sinx+cosx}

ddxsinxcosxsinx+cosx=(cosx+sinx)(sinx+cosx)(sinxcosx)(cosxsinx)(1+2sinxcosx)=(sinx+cosx)2+(sinxcosx)2(sinx+cosx)2=1+2sinxcosx+12sinxcosx1+2sinxcosx=21+sin(2x) \begin{aligned} &\frac{d}{dx} \frac{sinx-cosx}{sinx+cosx}\\ &=\frac{(cosx+sinx)(sinx+cosx)-(sinx-cosx)(cosx-sinx)}{(1+2sinxcosx)}\\ &=\frac{(sinx+cosx)^2+(sinx-cosx)^2}{(sinx+cosx)^2}\\ &=\frac{1+2sinxcosx+1-2sinxcosx}{1+2sinxcosx}\\ &=\frac{2}{1+sin(2x)} \end{aligned}


63. ddx4x2(2x35x2)\frac{d}{dx}4x^2(2x^3 – 5x^2)

ddx4x2(2x35x2)=8x(2x35x2)+4x2(6x210x)=40x480x3=40x3(x2) \begin{aligned} &\frac{d}{dx}4x^2(2x^3 – 5x^2)\\ &=8x(2x^3-5x^2)+4x^2(6x^2-10x)\\ &=40x^4-80x^3=40x^3(x-2) \end{aligned}


64. ddx(x)(4x2)\frac{d}{dx}(\sqrt x)(4-x^2)

ddx(x)(4x2)=4x22x+x(2x)=4x24x22x=5x2+42x \begin{aligned} &\frac{d}{dx}(\sqrt x )(4-x^2)\\ &=\frac{4-x^2}{2\sqrt x}+\sqrt x(-2x)=\frac{4-x^2-4x^2}{2\sqrt x}\\ &=\frac{-5x^2+4}{2\sqrt x} \end{aligned}


65. ddx1+x1x\frac{d}{dx} \sqrt{\frac{1+x}{1-x}}

ddx1+x1x=ddx1x21x=2x(1x)21x2+1x2(1x)2=x2x+1x21x2(1x)2=1x1x2(1x)2=11x2(1x) \begin{aligned} &\frac{d}{dx}\sqrt{\frac{1+x}{1-x}}=\frac d {dx} \frac{\sqrt{1-x^2}}{1-x}\\ &=\frac{\frac{-2x(1-x)}{2\sqrt{1-x^2}}+\sqrt{1-x^2}}{(1-x)^2}\\ &=\frac{\frac{x^2-x+1-x^2}{\sqrt{1-x^2}} }{(1-x)^2} =\frac{1-x}{\sqrt{1-x^2}(1-x)^2}\\ &=\frac{1}{\sqrt{1-x^2}(1-x)} \end{aligned}


66. ddxsin(sinx)\frac{d}{dx}sin(sinx)

ddxsin(sinx)=cos(sinx)cosx \begin{aligned} &\frac{d}{dx}sin(sinx)\\ &=cos(sinx)cosx \end{aligned}


67. ddx(1+e2x)/(1e2x)\frac{d}{dx}(1+e^{2x})/(1-e^{2x})

ddx1+e2x1e2x=e2x2(1e2x)(1+e2x)(2e2x)(1e2x)2=2e2x2e4x+2e2x+2e4x(1e2x)2=4e2x(1e2x)2 \begin{aligned} &\frac{d}{dx}\frac{1+e^{2x}}{1-e^{2x}}\\ &=\frac{e^{2x}2(1-e^{2x})-(1+e^{2x})(-2e^{2x})}{(1-e^{2x})^2}\\ &=\frac{2e^{2x}-2e^{4x}+2e^{2x}+2e^{4x}}{(1-e^{2x})^2}\\ &=\frac{4e^{2x}}{(1-e^{2x})^2} \end{aligned}


68. ddx[x/(1+lnx)]\frac{d}{dx}[x/(1+lnx)]

ddxx1+lnx=1+lnxx(1/x)(1+lnx)2=lnx(1+lnx)2 \begin{aligned} &\frac{d}{dx} \frac{x}{1+lnx} \\ &=\frac{1+lnx-x(1/x)}{(1+lnx)^2}=\frac{lnx}{(1+lnx)^2} \end{aligned}


69. ddxxx/lnx\frac{d}{dx}x^{x/lnx}

ddxxx/lnxy=xx/lnx,lny=xlnxlnx=x,1ydy=dxdydx=y=xx/lnx=elnxx/lnx=e(x/lnx)lnx=ex \begin{aligned} &\frac{d}{dx}x^{x/lnx}\\ &y=x^{x/lnx}, lny=\frac{x}{lnx}lnx=x,\frac{1}{y}dy=dx\\ &\frac{dy}{dx}=y=x^{x/lnx}\\ &=e^{{lnx}^{x/lnx}}=e^{(x/lnx)lnx}=e^x \end{aligned}


70. ddxln[x21x2+1]\frac{d}{dx}ln[\sqrt{\frac{x^2-1}{x^2+1}}]

ddxln[x21x2+1]=x2+1x212x2x21x2+1x212x2x2+1x2+1=x(x2+1)x21xx21x21(x2+1)=x3+xx3+x(x21)(x2+1)=2x(x21)(x2+1) \begin{aligned} &\frac{d}{dx}ln[\sqrt{\frac{x^2-1}{x^2+1}}]\\ &=\sqrt \frac{x^2+1}{x^2-1}\frac{\frac{2x}{2\sqrt{x^2-1}}\sqrt{x^2+1}-\sqrt{x^2-1}{\frac{2x}{2\sqrt{x^2+1}}}}{x^2+1}\\ &=\frac{ \frac{x(x^2+1)}{\sqrt{x^2-1}} -x\sqrt{x^2-1} }{\sqrt{x^2-1}(x^2+1)}\\ &=\frac{x^3+x-x^3+x}{(x^2-1)(x^2+1)}=\frac{2x}{(x^2-1)(x^2+1)} \end{aligned}
Alt.
ln[x21x2+1]=12ln(x21)12ln(x2+1) ln[\sqrt{\frac{x^2-1}{x^2+1}}]=\frac{1}{2}ln(x^2-1)-\frac{1}{2}ln(x^2+1)



Author: crazyj7@gmail.com

'Math' 카테고리의 다른 글

Derivative100 [81-90]  (0) 2019.12.12
derivative100 [71-80]  (0) 2019.11.27
derivatie100 [51-60]  (0) 2019.11.18
D operator  (0) 2019.11.07
derivative100 [41-50]  (1) 2019.11.06
반응형
derivative_br_51

51. ddx10x\frac{d}{dx}10^x

ddx10x=10xln(10) \begin{aligned} &\frac{d}{dx}10^x\\ &=10^xln(10) \end{aligned}

y=ax,lny=xlna(1/y)dy=(lna)dxdy/dx=ylna=axlnaor10x=eln10x \begin{aligned} &y=a^x, lny=xlna \\ &(1/y)dy=(lna)dx \\ &dy/dx=ylna=a^xlna \\ or\\ &10^x=e^{ln10^x} \end{aligned}


52. ddxcubert(x+(lnx)2)\frac{d}{dx}cubert(x+(lnx)^2)

ddxx+(lnx)23=ddx(x+(lnx)2)1/3=13(x+(lnx)2)2/3(1+2ln(x)1x)=13(x+(lnx)2)2/3(1+2lnxx) \begin{aligned} &\frac{d}{dx}\sqrt[3]{x+(lnx)^2}\\ &=\frac{d}{dx}(x+(lnx)^2)^{1/3}=\frac{1}{3}(x+(lnx)^2)^{-2/3}(1+2ln(x)\frac{1}{x})\\ &=\frac{1}{3(x+(lnx)^2)^{2/3}}(1+\frac{2lnx}{x}) \end{aligned}


53. ddxx3/42x1/4\frac{d}{dx}x^{3/4} – 2x^{1/4}

ddxx3/42x1/4=34x1/412x3/4=3x3/44x2x1/44x=3x432x44x \begin{aligned} &\frac{d}{dx}x^{3/4} – 2x^{1/4}\\ &=\frac{3}{4}x^{-1/4}-\frac{1}{2}x^{-3/4}\\ &=\frac{3x^{3/4}}{4x}-\frac{2x^{1/4}}{4x}\\ &=\frac{3\sqrt[4]x^3-2\sqrt[4]x}{4x} \end{aligned}


54. ddxlog2(x1+x2)\frac{d}{dx}log_2 (x \sqrt{1+x^2})

ddxlog2(x1+x2)((d/dx)logax=1xlna)=1+x2+x2x21+x2x1+x2ln2=1+2x2x(1+x2)ln2 \begin{aligned} &\frac{d}{dx}log_2 (x \sqrt{1+x^2})\\ &((d/dx) log_ax=\frac{1}{xlna})\\ &=\frac{\sqrt{1+x^2}+x\frac{2x}{2\sqrt{1+x^2}}}{x\sqrt{1+x^2}ln2}\\ &=\frac{1+2x^2}{x(1+x^2)ln2} \end{aligned}


55. ddx(x1)/(x2x+1)\frac{d}{dx}(x-1)/(x^2-x+1)

ddxx1x2x+1=x2x+1(x1)(2x1)(x2x+1)2=x2x+1(2x23x+1)(x2x+1)2=x2+2x(x2x+1)2 \begin{aligned} &\frac{d}{dx} \frac{x-1}{x^2-x+1}\\ &=\frac{x^2-x+1-(x-1)(2x-1)}{(x^2-x+1)^2}\\ &=\frac{x^2-x+1-(2x^2-3x+1)}{(x^2-x+1)^2}\\ &=\frac{-x^2+2x}{(x^2-x+1)^2} \end{aligned}


56. ddx13cos3xcosx\frac{d}{dx}\frac{1}{3} cos^3x – cosx

ddx13cos3xcosx=133cos2x(sinx)+sinx=sinx(1cos2x)=sin3x \begin{aligned} &\frac{d}{dx} \frac{1}{3}cos^3x – cosx\\ &=\frac{1}{3}3cos^2x(-sinx)+sinx\\ &=sinx(1-cos^2x)=sin^3x \end{aligned}


57. ddxexcosx\frac{d}{dx}e^{xcosx}

ddxexcosx=excosx(cosxxsinx) \begin{aligned} &\frac{d}{dx}e^{xcosx}=e^{xcosx}(cosx-xsinx)\\ \end{aligned}


58. ddx(xx)(x+x)\frac{d}{dx}(x-\sqrt{x})(x+\sqrt{x})

ddx(xx)(x+x)=ddxx2x=2x1 \begin{aligned} &\frac{d}{dx}(x-\sqrt{x})(x+\sqrt{x})=\frac{d}{dx}x^2-x\\ &=2x-1 \end{aligned}


59. ddxarccot(1x)\frac{d}{dx}arccot(\frac{1}{x})

ddxarccot(1x)y=arccot1x,1x=coty,x2dx=csc2ydyR.T.,angle=y,o=x,a=1,h=x2+1dydx=x2csc2y=1x21+x2x2=11+x2(=ddxarctan(x)) \begin{aligned} &\frac{d}{dx}arccot(\frac 1 x)\\ & y=arccot \frac 1 x, \frac 1 x=cot y, -x^{-2}dx=-csc^2ydy\\ & R.T., angle=y, o=x, a=1, h=\sqrt{x^2+1} \\ & \frac {dy}{dx}=\frac {x^{-2}}{csc^2 y}=\frac{1}{x^2\frac{1+x^2}{x^2}}=\frac{1}{1+x^2} \\ &(=\frac{d}{dx}arctan(x)) \end{aligned}
Alt.
ddxarccot(x)=11+x2ddxarccot(1/x)=11+1/x2(1/x2)=1x2+1 \frac{d}{dx} arccot(x)=-\frac{1}{1+x^2}\\ \frac{d}{dx} arccot(1/x)=-\frac{1}{1+1/x^2}(-1/x^2)\\ =\frac{1}{x^2+1}


60. ddx(x)(arctanx)ln(x2+1)\frac{d}{dx}(x)(arctanx) – ln(\sqrt{x^2+1})

ddx(x)(arctanx)ln(x2+1)=arctanx+x11+x21x2+112x2+12x=arctanx+x1+x2x1+x2=arctanx \begin{aligned} &\frac{d}{dx}(x)(arctanx) – ln(\sqrt{x^2+1})\\ &=arctanx+x\frac{1}{1+x^2}-\frac{1}{\sqrt{x^2+1}}\frac{1}{2\sqrt{x^2+1}}2x\\ &=arctanx+\frac{x}{1+x^2}-\frac{x}{1+x^2}\\ &=arctan x \end{aligned}



Author: crazyj7@gmail.com

'Math' 카테고리의 다른 글

derivative100 [71-80]  (0) 2019.11.27
derivative100 [61-70]  (0) 2019.11.19
D operator  (0) 2019.11.07
derivative100 [41-50]  (1) 2019.11.06
derivative100 [31-40]  (0) 2019.11.05
반응형
CustomEarlyStop

Custom EarlyStopping

EarlyStop 클래스는 학습을 조기 종료시킬 때 사용한다. 학습을 무조건 많이 시킨다고 성능이 좋아지는 것은 아니다. 오히려 과적합이 발생하여 실제 테스트 데이터에 적용시 성능이 떨어질 수 있다.
따라서 어느정도가 적합한지를 자동으로 측정하는 역할을 한다.

EarlyStopping

keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, 
verbose=0, mode='auto', baseline=None, restore_best_weights=False)

Arguments

  • monitor : 모니터링 대상. loss, val_loss, score, val_score, val_f1_score 등 메트릭 정보를 입력한다.
  • min_delta : 최소 감지 변화량을 의미한다. 이 값보다 적은 변화는 변화(개선)가 없다고 인식한다.
  • patience : 인내할 횟수. monitor 값의 변화 감지가 개선되는 쪽으로 patience 횟수만큼 연속으로 없을 경우, 학습을 Stop하게 된다. 예를 들어 loss가 1.0이었는데, 10번 연속으로 1.0 이하로 떨어지지 않으면 학습을 중지한다. (patience=10일때) 성능은 매 epoch마다 항상 좋아지지 않고 약간 들쭉날쭉하면서 좋아지는 경향들이 있다. 이 값이 너무 커지면 학습을 너무 오래할 수 있고, 너무 작으면 너무 일찍 학습이 종료될 수 있다.
    따라서 Checkpoint와 함께 사용하여 best 상태를 항상 기록하도록 설정하는 것이 좋다.
  • baseline : monitor 값이 도달할 기본값. baseline을 넘어 개선이 이루어 지지 않으면 학습을 중지한다. (이 파라미터는 잘 안쓴다.)
  • restore_best_weights: monitor 값의 최상치일때의 weights들로 복원한다.

Custom EarlyStopping

위 EarlyStopping을 좀 수정하여 처음 100 에폭은 무조건 학습하고, 100에폭이 넘으면 그 때부터 EarlyStopping을 사용하고 싶을 때 아래와 같이 만들 수 있다.
(StackOverflow 참고)

class CustomStopper(keras.callbacks.EarlyStopping):
    def __init__(self, monitor='val_loss',
                 min_delta=0, patience=0, verbose=0, 
                 mode='auto', start_epoch = 100): # add argument for starting epoch
                super(CustomStopper, self).__init__()
                self.start_epoch = start_epoch
                
    def on_epoch_end(self, epoch, logs=None):
            if epoch > self.start_epoch:
                    super().on_epoch_end(epoch, logs)

Author: crazyj7@gmail.com

반응형
hotkey_eclipse

HotKey Eclipse

  • 이클립스 단축키는 변경가능하여 가장 좋은 것은 설정에서 단축키를 찾는 것이 가장 정확하다.
    OS별로 다를 수 있음에 유의한다. Window , Mac , Linux 등.
    windows-preferences에서 Key로 검색
    Keys 화면내에서 검색하여 찾기
    예를 들면)
    comment : 주석관련
    find : 검색관련 , 다음 검색 등
    assist : 코드Assist (많이 찾는 Content Assist) 구조체 필드 확인, 메소드 목록 확인 등.
    import : 자동 import관련

빠르게 단축키를 보려면 ^+Shift+L 한 번 더 누르면 단축키 설정창을 띄운다. 다른 것 다 필요없고 이것만 기억해도 된다.

생각안나면 Ctrl+Shift+L 이것만 기억하자!!

+이클립스
-동일한 파일을 2개 창으로 보기
ctrl+{ ; 좌우로 보기 (ctrl+shift+{)
ctrl+_ ; 상하로 보기

-파일2개를 창2개로 보기
추가로 열 파일을 탭에서 드래그하여 원하는 윈도우 박스 위치에 놓는다.

컨쉽+O ; auto import
컨쉽+T ; 클래스 찾기
컨쉽+위/아래 ; 메소드 이동(위, 아래)
컨쉽+스페이스 ; 파라미터 보기
컨쉽+F ; 자동 코드 들여쓰기 정리. form feed.
컨+O ; 현재소스내에서 메소드나 필드로 이동 ; method
컨+T ; class tree보기/이동 상속관계 ; tree
컨+K ; 찾는 문자열 블록선택후, 연속으로 찾기. 반대방향은 쉽 추가.
컨+D ; delete line
컨+I ; auto indent (one line)

  • 가장 필요한 단축키.
    Code Assit
    추적
    돌아가기
    실행
    이전 커서위치로 이동.
    소스를 추적하여 쫒아가다가 다시 돌아갈 때 필요!!!

+요약
@+방향키 ; 이전 커서 위치로 이동!!! 소스추적하다가 되돌아갈때 필수!
^+Space ; 코드 파라미터 보기 (sysout 자동풀기) 리눅스에서는 @+/
^H ; 전체 검색
^K ; 다음 찾기. 이전찾기 ^+SHIFT+K
F3 or ^클릭 ; 추적 go to definition
^+F11 ; 실행
^F6 ; 이전 에디터창(소스).
^Q ; 소스 마지막 수정위치로 이동
^+SHIFT+/ ; 블록 주석처리
^+ / ; 주석처리
^+SHIFT+F ; 코드 정리

+이클립스(MAC)
(@대신Com)+방향키 ; 이전 커서 위치로 이동
(Com추가)+^+Space ; 코드 파라미터 보기
F3 or ^+클릭 ; 추적
(FN추가)+^+F11 ; 실행
^F6 ; 이전 에디터창(소스).
^Q ; 소스 마지막 수정위치로 이동
^H ; 전체 검색
^K ; 다음 찾기. 이전찾기 ^+SHIFT+K

단축키가 안먹는다면 다른 프로그램 단축키와 충돌이 났거나 다를 수 있어서 다른 단축키로 바꿔보자.
언제든 설정에서 원하는 단축키를 지정할 수 있고, 현재 단축키 설정도 확인 가능하니 처음에는 꼭 확인하는 것을 권장한다.

Author: crazyj7@gmail.com

'Develop > Java' 카테고리의 다른 글

gradle2 API server  (0) 2021.11.13
gradle1 기초  (0) 2021.11.13
Short URL(단축URL) API  (1) 2019.11.07
[JavaScript] 스탑와치 밀리초/StopWatch milliseconds  (0) 2019.08.27
Java RSA 간단한 비대칭키 암호 서명 검증 테스트  (0) 2019.08.14
반응형
Ether02coin

이더리움 개발 관련된 사항

알아야 될 것.

  • view 값을 가져오는 것은 가스 소모가 되지 않는다.
  • 코인 발행은 계약을 만든 사람만이 가능하다.
  • 코인 전송시에는 ID/PWD가 필요없다. 단지 이더리움 키쌍이 필요하다.

코인 만들기

image

pragma solidity ^0.5.0;

contract Coin {
    // The keyword "public" makes those variables
    // easily readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react to
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    constructor() public {
        minter = msg.sender;
    }

    function mint(address receiver, uint amount) public {
        require(msg.sender == minter);
        require(amount < 1e60);
        balances[receiver] += amount;
    }

    function send(address receiver, uint amount) public {
        require(amount <= balances[msg.sender], "Insufficient balance.");
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}

가상 화폐(코인) 계약은 위와 같다. 정말 간단하다. 저렇게 간단한데, 코인 발행와 송금, 조회가 가능하다.

위 코드를 한 줄씩 읽어나가면 이렇게 된다.

코드 요약

  • 코인 발행자는 minter 라는 주소. (위 계약을 deploy할때 선택한 계정이 발행자가 된다. 중요하다.)
  • 주소마다 매핑된 balances가 있다. 즉, 주소로 코인 잔고 조회가 가능하다.
  • Sent는 이벤트로 송금이 완료되면 발생시키려고 만든 것이다. send 함수 마지막에 보면 호출한다.
  • 생성자(constructor)에서는 최초에 deploy시 사용자를 minter 발행자로 지정한다.
  • mint는 코인을 receiver로 amount 만큼 발행해 준다. (코인을 찍어서 준다.)
  • mint 조건을 보면 발행자만 mint를 사용할 수 있다. 금액 제한은 걸려있다. 수신자의 balances에 금액을 추가한다.
  • send는 코인 송금이다. 수신자 주소와 금액을 넣게 되어 있다.
  • send의 조건은 요청자(msg.sender)의 잔고 금액이 amount(송금금액)보다 커야 한다.
  • send에서는 송신자의 잔고에서 금액을 빼서 수신자의 잔고에 추가한다. 마지막에 송금완료 이벤트(Sent)를 발생시킨다.

저렇게 간단한 코드로 이 기능이 다 되는건가? 실제 테스트를 해 볼 수 있다.

테스트

  • deploy 계정 : 0xCA… (주소는 길기 때문에 여기서는 생략함)
  • balances에 위 계정을 입력하여 확인. 코인 잔고는 0으로 나옴.
    image
  • 나부터 코인을 찍어보자. 1000개.
    발행자만 가능하니 account는 0xCA… 로 설정하고,
    mint로 수신자 0xCA…, amount는 1000으로 해서 tranact 발생! 이후 다시 balances로 확인. 1000 코인이 발행되어 잘 들어왔다.
    image
  • 이제 다른 계정으로 발행해 보자. 계정을 0x147…로 바꿔서 mint를 해보니, 발행자 권한이 아니라 거부된다. 현재 잔고는 0으로 조회된다.
    image
    -원래 계정 0xCA에서 100원만 0x147한테 주자. 전송할때는 계정을 0xCA로 바꾼다음, send에 receiver와 amount를 입력하고 transact를 한다. balances조회하면 100 코인이 정상적으로 수신되었다. 0xCA로 balances를 조회하면 100코인이 줄어 900코인이 된 것을 확인할 수 있다.
    imageimage

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#2 HelloWorld  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether01] solidity 맛보기  (0) 2019.11.10
이더리움개발 환경 준비  (1) 2019.11.10
반응형
Ether01getset

smart contract / solidity 맛보기

온라인 solidity 개발 테스트 사이트에 접속한다.
https://remix.ethereum.org/

  • 코드를 작성한다.
    단순하게 integer값을 set하고 get하는 API 2개가 있다.
    image

  • 컴파일 한다.
    image

  • Deploy를 한다.
    image

  • 생성된 contract에서 각각의 메소드를 테스트해 볼 수 있다. 위에서는 100을 set하고 get으로 100이 나오는 것을 확인하였다.

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#2 HelloWorld  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether02] 코인만들기  (0) 2019.11.10
이더리움개발 환경 준비  (1) 2019.11.10
반응형
Ethe00_Setup

Etherium

이더리움 주소

  1. 개인키 생성
  2. 개인키에서 공개키 생성
  3. keccak256으로 공개키의 해시값 생성
  4. 해시값에서 뒤쪽 20바이트를 이더리움 주소로 사용한다.

계정

  1. 외부 소유계정 (EOA)
    다른 계정과 이더 송수신 및 컨트랙트에 트랜잭션 전송도 가능

  2. 컨트랙트 계정
    개인키가 없다. 스마트계약을 블록체인에 배포시 생성됨.
    다른 계정과 이더 송수신 가능.
    코드를 감고 있다.
    EOA나 다른 컨트랙트의 영향으로 트랜잭션을 발생시킬 수 있다.

지갑

이더리움 계정을 저장하고 관리
여러 계정을 관리하고 트랜잭션에 서명, 잔고 추적 등.

가스

스마트 계약 배포, 트랜잭션 실행등에 비용이 소모된다. 채굴자에게 이더를 지불해야한다. 트랜잭션에 얼마나 많은 단위연산이 포함되는지에 따라 비용이 결정됨. 연산의 단위를 가스라고 한다.

가스 가격

트랜잭션 생성자가 원하는 가스 가격을 정할 수 있다. 가스당 3wei 처럼 설정한다. 설정한 가스가격이 높을 수록 트랜잭션 처리 속도가 빠르다. 채굴자들이 높은 가격순으로 처리하기 때문.

가스 한도

트랜잭션 수행 최대 금액을 지정할 수 있다. 블록가스 한도와 다르다.

바이트 코드

스마트 계약 코드는 solidity 언어로 작성 EVM 바이트코드로 컴파일하여 EVM(이더리움 VM)에서 실행된다.

게스(Geth)/패리티(Parity) 클라이언트

geth는 이더리움재단에서 제공하는 공식 클라이언트. (Go로 개발). geth는 블록체인의 복사본을 최신 상태로 유지하고 위해 계속 통신한다. 블록을 채굴하고, 블록체인에 트랜잭션을 추가하고 검증하고 실행한다. API를 제공하기도 한다.

Web3JS

이더리움과 상호작용하는 javascript library.

가나슈. 메모리블록체인 개발테스트
https://www.trufflesuite.com/ganache

지갑관리
https://metamask.io/

메인넷 모니터링
https://etherscan.io/

https://www.etherstudy.net/geth.html

geth 다운로드 설치

https://geth.ethereum.org/downloads/

> geth --dev console
> eth.blockNumber

가나슈설치

Ganache
https://www.trufflesuite.com/ganache
또는
https://github.com/trufflesuite/ganache/releases

온라인 solidity 개발

https://remix.ethereum.org/#optimize=false&evmVersion=null

윈도우/linux solidity compiler

https://github.com/ethereum/solidity/releases

https://github.com/ethereum/solidity/releases/download/v0.5.12/solidity-windows.zip

가나슈가 개발 테스트시에는 빠르다. 추천! (단, 키스토어가 없다. 개인키 접근이 필요하면 복호화된 스트링을 복사해서 사용한다. UI에 열쇠모양 클릭.)

geth는 메모리를 많이 먹어서 느림. 대신 키스토어에 개인키 저장.

py-solc 모듈이 solidity 여러가지 버전에 대해서 잘 지원이 안되는 듯함. python내에서 source compile시도시 에러발생.
커맨드로 빌드하여 output을 파일에 생성하고, 그 파일을 파이썬에서 읽어서 설정하는 방식으로 해야 할 듯 하다.

solc 컴파일러는 버전에 따라 다르니 주의가 필요하다. ubuntu에서 구버전 solc 를 설치하려면?

우분투에서 apt-get 으로 설치하면 최신버전의 solc가 설치된다.
구버전을 사용하려면 위 사이트에서 구버전 soliidity-ubuntu-trusty-clang.zip을 받아서 설치한다.
실행시 libz3 에러가 발생?? 하면 아래와 같이 라이브러리를 설치해 준다. 그 외에도 여러가지 개발툴들을 설치한다.
apt-get -y install build-essential cmake g++ gcc git unzip
apt-get install libz3-dev
solc --version

강좌

https://www.ethereum.org/ko/developers/#%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C

https://solidity-kr.readthedocs.io/ko/latest/

https://winterj.me/smart-contract-with-python/


실습

  • geth 설치
sudo add-apt-respository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
sudo apt install golang-go

확인
geth version
1.9.6-stable
go version
1.10.4
  • genesis 블록 설정
    genesis.json 파일 생성
$ cat genesis.json 
{
    "config": {
        "chainId": 16,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
        },
    "nonce": "0x0000000000654123",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x00",
    "gasLimit": "0x2db7579a600",
    "difficulty": "0x20",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {}
}
  • difficulty 값은 채굴난이도로 낮을수록 빨리캔다. 위의 설정에서는 32가 된다.
  • geth 접속 후, eth.getBlock(0) 으로 확인할 수 있다.

초기화

현재 폴더에서 chain-data 폴더가 만들어진다. 데이터는 다 그곳에 저장됨. (geth, keystore 등)

geth init genesis.json --datadir chain-data
geth --datadir chain-data console

구동

접속을 쉽게하려면 rpc를 만들어 놓자. 아래와 같은 start.sh 스크립트를 만들어 저장해 두고 실행하자. 기본 포트는 8545인데, 여기서는 8485로 변경하였다. (주의!)
원격에서 계정 unlock을 허용하려면 --allow-insecure-unlock 옵션을 추가한다.

just running...
> geth --datadir ./chain-data console
> 최초 계정을 만들어 주어야 한다. 없으면 마이닝 모드 구동시 
> ether base가 없다고 에러가 남.
> 
> personal.newAccount('pass')
> 파라미터가 암호임. 반복하여 여러개의 계정을 임시로 만들어 본다.
> exit

start with options...
> cat start.sh
geth --rpc --rpcport 8485 --rpccorsdomain "*" --datadir "./chain-data" --port 30303 --nodiscover --rpcapi "db,eth,net,web3" --networkid 15 console
다른예) 위와 같이 실행해서 계정을 만든 다음 다음부터 아래처럼 실행
geth --rpc --rpcport 8545 --rpccorsdomain "*" --datadir "./chain-data" --port 30303 --nodiscover --mine --minerthreads 1 --allow-insecure-unlock --rpcapi "admin,personal,miner,db,eth,net,web3" --networkid 15 console
> ./start.sh
실행하면 메시지와 함께 콘솔이 뜬다.

내가 쓰는 구동 스크립트

> cat start3.sh
> geth --rpc --rpcport 8485 --rpcaddr "0.0.0.0" --rpccorsdomain "*" --datadir "./chain-data" --port 30303 \
--allow-insecure-unlock --mine --minerthreads 5 --identity private_chain \
--rpcapi "personal,miner,admin,db,eth,net,web3" --networkid 15 console
  • 윈도우에서 구동시 CPU100% 먹길래 "minerthreads 1"을 삭제해주니까 CPU가 정상적으로 떨어졌다. (참고) 또는 5나 10정도로 설정한다.
  • 구동해 놓으면 coinbase 계정으로 이더가 알아서 쌓이기 시작한다.
  • 마이닝이 안되면 miner.start(5) 이렇게 쓰레드를 지정해서 시작해 보자.
  • 그래도 마이닝이 계속 안되면, 작업관리자를 띄워서 메모리를 살펴보자. 메모리가 점점 증가하다가 1기가 좀 넘어서 기다리면 그 때 부터 CPU를 막 잡아먹기 시작하면서 마이닝을 할 것이다. 컴퓨터 성능에 따라 마이닝 하는데 시간이 좀 걸릴 수 있으니 기다려라.

로컬의 다른 쉘에서 geth 연결하기

geth 구동시 datadir에 설정된 경로에 geth.ipc라는 파일이 생기는데 그것으로 연결한다.

$ geth attach ./chain-data/geth.ipc
or
$ geth attach http://localhost:8485 (rpc:http://... 이렇게도 가능)
일부 작업이 제한될 수 있다. geth 시작시 옵션 설정이 필요.
  • 간단한 명령어
    eth.accounts : 계정 목록
    eth.blockNumber : 현재 채쿨된 블록 번호
    eth.hashrate
    eth.coinbase : 채굴 보상받을 계정. 디폴트는 eth.accounts[0]
    eth.mining : 마이닝 상태 on/off
    eth.getBalance(account) : 잔고
    eth.getTransaction(tx) : TX 정보
    miner.start() : 함수를 호출하여 마이닝 시작. 파라미터 1,2등 thread개수옵션
    miner.stop() : 마이닝 중지
    miner.setEtherbase() : 채굴 보상 계정 설정
    personal.newAccount(password) : 계정 생성
    personal.unlockAccount(account, password) : 계정 잠금 해제 (송금등 TX발생시 사전필요작업임)

  • 콘솔 연결 후 작업

personal.newAccount('pass')
personal.newAccount('pass')
personal.newAccount('pass')
personal.newAccount('pass')
위와 같이 테스트 계정들을 만들어 준다. 암호는 일단 다 pass로 하였음.
eth.mining : 마이닝 상태 확인. 
miner.start() : 마이닝이 멈춰있으면 마이닝을 시작한다.
잠시 후,첫번째 계정 잔고를확인한다.
eth.blockNumber
eth.getBalance( eth.accounts[0] ) : 0번 사용자 잔고 확인.

계정의 키는 데이터 루트 폴더(chain-data)안에 keystore 폴더에 계정별로 저장되어 있다.

  • 방화벽
    아까 rpc port로 설정했던 포트를 연다.
    ufw allow 8485

  • remix연결
    Env. web3provider
    http://172.16.100.88:8485
    원격 주소로는 접속이 안되는 것인지??? 계속 실패하였음.
    그래서 ssh로 포트 터널링하여 로컬로 연결함. (참고로 서버 ssh포트는 2222로 변경된 상태)
    접속 실패 원인을 찾아보니, rpcaddr을 안 줘서 그런 거였다.

ssh -L 8545:localhost:8485 blockchain@172.16.100.88
   -p 2222

위와 같이 로컬 8545를 원격의 8485로 연결해 놓고, remix에서 web3 provider에 주소를 로컬 주소를 주었다.
http://localhost:8545

  • smart contract deploy (배포)

계정 unlock을 해 주어야 한다 (unlock을 해주지 않으면 deploy나 set이 안된다.)
한 번 해두면 일정시간만 허용되는 것 같고, 시간이 지나면 자동으로 잠긴다.
personal.unlockAccount(eth.accounts[0])
위 커맨드가 작동하지 않는다면, geth 구동 스크립트에 옵션을 추가해 주어야 한다. –allow-insecure-unlock

remix로 contract를 deploy 시도 및 API 테스트를 했는데, 계속 가스 초과 에러가 발생하였다.
여러가지 시도 끝에, solidity compiler 버전을 0.4.23으로 낮추고 deploy를 하니 정상적으로 작동하였다. 계속 삽질을 했다는…
또 어디서는 genesis에 chainId가 0이면 그런 증상이 발생해서 42정도로 설정하여 해결했다는 얘기도 있다. 나의 경우는 chainId 설정을 하지 않았는데( config 필드가 empty) 위와 같이 해결하였음.
잘 안되면 남들하는 버전을 보고 연관되어 돌아가는 버전을 모두 맞춰 시도해보는 것도 좋다.

참고
원격 접속용 geth 구동

$ nohup geth --networkid 4649 --nodiscover --maxpeers 0 --datadir ~/Blockchain/data_testnet --mine --minerthreads 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --unlock 0,1 --password ~/Blockchain/data_testnet/passwd --verbosity 6 2>> ~/Blockchain/data_testnet/geth.log &

rpc ; http-rpc 활성화
rpcaddr : 접속 가능한 주소 0.0.0.0는 any 허용. 127.0.0.1을 입력하면 로컬호스트에서만 접속 가능. 자신의 IP 주소를 주면 그 IP로 접근이 허용된다.
rpcapi : rpc에서 허용가능한 모듈을 지정. 여기에 miner, personal 등이 들어가면 사용 가능.
unlock : 계정 잠금 해제. geth에서 해당 계정에 암호없이 접근 가능.

많이 쓰는 명령어

잔고 조회
eth.getBalance(eth.accounts[0])

전송 : 10이더를 해당 사용자에게 전송
personal.unlockAccount(eth.accounts[0])
패스워드(pass) 입력

eth.sendTransaction( {from: eth.accounts[0], 
   to:"0xc8cafbebb42f522f040d5690b1b220c3a9aed8f1", 
   value:web3.toWei(10,"ether")})

eth.getBalance("0xc8cafbebb42f522f040d5690b1b220c3a9aed8f1")

마이닝
eth.mining  : 현재 마이닝 상태
miner.start(1)
miner.stop()

계정
eth.accounts : 계정 목록 조회
personal.newAccount('password') : 계정 생성
personal.unlockAccount(eth.accounts[0]) : 잠금해제

SubLimeText 에서 solidity code intelligence 지원

Ctrl+Shift+P를 누르고 install 을 치고 install package 실행
잠시 기다리면, 입력창이 뜸.
ethereum을 입력. Ethereum을 설치
다시 한 번 반복하고 이번엔 EthereumSoliditySnippets를 설치
다시 시작하면 적용 완료.

강좌

https://www.ethereum.org/ko/developers/#%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C

https://solidity-kr.readthedocs.io/ko/latest/

https://winterj.me/smart-contract-with-python/

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#2 HelloWorld  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether02] 코인만들기  (0) 2019.11.10
[ether01] solidity 맛보기  (0) 2019.11.10
반응형
tomcat_setup

Tomcat 8 install

Ubuntu 기준으로 tomcat8 설치하기

JDK8

$ apt-cache search openjdk-8
$ apt-get install openjdk-8-jdk
$ java -version
openjdk version 1.8.0_222

설치 경로 확인

$ upate-alternatives --list java
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
$ cd /usr/lib
$ ln -s jvm/java-8-openjdk-amd64 java
$ ls /usr/lib/java

tomcat8

tomcat은 패키지를 apt-get으로 설치하면 자동으로 설정이 되는 장점이 있지만, 수동으로 받아서 설치하는 것이 좋다. (개인 취향)
수동으로 하는 것은 설치 경로나 구성 등을 본인에 맞게 할 수 있다.

간략 버전 (빠른 설치)

sudo apt-get install tomcat8
ufw allow 8080
service tomcat8 start
끝

수동 설치
http://tomcat.apache.org
홈페이지에서 원하는 버전의 다운로드 URL을 복사한다.

# cd /usr
# wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz
# tar xvfz apache*.gz
# ln -s apache-tomcat-8.5.9 tomcat
# cd /usr/tomcat/bin
# ./version.sh
Apache Tomcat/8.5.9

환경 설정

  • 방화벽 오픈
    ufw allow 8080
  • 환경 변수
$ vi /etc/profile
export JAVA_HOME=/usr/lib/java
export CATALINA_HOME=/usr/tomcat
export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar 

$ source /etc/profile
  • 구동 테스트
    cd /usr/tomcat/bin
    ./startup.sh
    netstat -ant | grep 8080
    ps -ef | grep tomcat

브라우저에서 http://IP:8080 으로 접속하여 페이지가 뜨는지 확인한다.

  • 테스트 종료
    ./shutdown.sh

서비스 등록

  • 계정 생성
groupadd tomcat
useradd -M -s /bin/nologin -g tomcat -d /usr/tomcat tomcat
cd /usr/
chown -R tomcat.tomcat apache-tomcat-8.5.9
  • 서비스 등록
root@blockchain:/etc/systemd/system# cat tomcat.service 
# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment="JAVA_HOME=/usr/lib/java"
Environment="CATALINA_PID=/usr/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/usr/tomcat"
Environment="CATALINA_BASE=/usr/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

ExecStart=/usr/tomcat/bin/startup.sh
ExecStop=/usr/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

위와 같이 파일을 작성하고
systemctl daemon-reload

서비스 구동

service tomcat status
service tomcat start

부팅시 자동시작 스크립트

/etc/init.d에 tomcat 파일을 아래와 같이 만들고
chomd 755 tomcat으로 권한을 설정한다.
JAVA_HOME, CATALINA_HOME, tomcat 계정, 디렉터리를 잘 설정한다.

#!/bin/sh
#
# /etc/init.d/tomcat -- startup script for the Tomcat 8 servlet engine
#
# Modified init-Script from Ubuntu Tomcat init-script
#
#
### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Tomcat.
# Description:       Start the Tomcat servlet engine.
### END INIT INFO

set -e

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/opt/tomcat
NAME=tomcat
DESC="Tomcat servlet engine"
DEFAULT=/etc/default/$NAME
JVM_TMP=/tmp/tomcat-tmp

if [ `id -u` -ne 0 ]; then
        echo "You need root privileges to run this script"
        exit 1
fi

# Make sure tomcat is started with system locale
if [ -r /etc/default/locale ]; then
        . /etc/default/locale
        export LANG
fi

. /lib/lsb/init-functions

if [ -r /etc/default/rcS ]; then
        . /etc/default/rcS
fi


# The following variables can be overwritten in $DEFAULT

# Run Tomcat 8 as this user ID and group ID
TOMCAT_USER=tomcat
TOMCAT_GROUP=tomcat

# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not
# defined in $DEFAULT)
JDK_DIRS="/usr/lib/java"

# Look for the right JVM to use
for jdir in $JDK_DIRS; do
    if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then
        JAVA_HOME="$jdir"
    fi
done

export JAVA_HOME=/usr/lib/java

# Directory where the Tomcat binary distribution resides
CATALINA_HOME=/usr/$NAME

# Directory for per-instance configuration files and webapps
CATALINA_BASE=/usr/$NAME

# Use the Java security manager? (yes/no)
TOMCAT_SECURITY=no

# Default Java options
# Set java.awt.headless=true if JAVA_OPTS is not set so the
# Xalan XSL transformer can work without X11 display on JDK 1.4+
# It also looks like the default heap size of 64M is not enough for most cases
# so the maximum heap size is set to 128M
if [ -z "$JAVA_OPTS" ]; then
        JAVA_OPTS="-Djava.awt.headless=true -Xmx128M"
fi

# End of variables that can be overwritten in $DEFAULT

# overwrite settings from default file
if [ -f "$DEFAULT" ]; then
        . "$DEFAULT"
fi

if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" ]; then
        log_failure_msg "$NAME is not installed"
        exit 1
fi

POLICY_CACHE="$CATALINA_BASE/work/catalina.policy"

if [ -z "$CATALINA_TMPDIR" ]; then
        CATALINA_TMPDIR="$JVM_TMP"
fi

# Set the JSP compiler if set in the tomcat.default file
if [ -n "$JSP_COMPILER" ]; then
        JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=\"$JSP_COMPILER\""
fi

SECURITY=""
if [ "$TOMCAT_SECURITY" = "yes" ]; then
        SECURITY="-security"
fi

# Define other required variables
CATALINA_PID="/var/run/$NAME.pid"
CATALINA_SH="$CATALINA_HOME/bin/catalina.sh"

# Look for Java Secure Sockets Extension (JSSE) JARs
if [ -z "${JSSE_HOME}" -a -r "${JAVA_HOME}/jre/lib/jsse.jar" ]; then
    JSSE_HOME="${JAVA_HOME}/jre/"
fi

catalina_sh() {
        # Escape any double quotes in the value of JAVA_OPTS
        JAVA_OPTS="$(echo $JAVA_OPTS | sed 's/\"/\\\"/g')"

        AUTHBIND_COMMAND=""
        if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
                JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
                AUTHBIND_COMMAND="/usr/bin/authbind --deep /bin/bash -c "
        fi

        # Define the command to run Tomcat's catalina.sh as a daemon
        # set -a tells sh to export assigned variables to spawned shells.
        TOMCAT_SH="set -a; JAVA_HOME=\"$JAVA_HOME\"; source \"$DEFAULT\"; \
                CATALINA_HOME=\"$CATALINA_HOME\"; \
                CATALINA_BASE=\"$CATALINA_BASE\"; \
                JAVA_OPTS=\"$JAVA_OPTS\"; \
                CATALINA_PID=\"$CATALINA_PID\"; \
                CATALINA_TMPDIR=\"$CATALINA_TMPDIR\"; \
                LANG=\"$LANG\"; JSSE_HOME=\"$JSSE_HOME\"; \
                cd \"$CATALINA_BASE\"; \
                \"$CATALINA_SH\" $@"

        if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
                TOMCAT_SH="'$TOMCAT_SH'"
        fi

        # Run the catalina.sh script as a daemon
        set +e
        touch "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
        chown $TOMCAT_USER "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
        start-stop-daemon --start -b -u "$TOMCAT_USER" -g "$TOMCAT_GROUP" \
                -c "$TOMCAT_USER" -d "$CATALINA_TMPDIR" \
                -x /bin/bash -- -c "$AUTHBIND_COMMAND $TOMCAT_SH"
        status="$?"
        set +a -e
        return $status
}

case "$1" in
  start)
        if [ -z "$JAVA_HOME" ]; then
                log_failure_msg "no JDK found - please set JAVA_HOME"
                exit 1
        fi

        if [ ! -d "$CATALINA_BASE/conf" ]; then
                log_failure_msg "invalid CATALINA_BASE: $CATALINA_BASE"
                exit 1
        fi

        log_daemon_msg "Starting $DESC" "$NAME"
        if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null; then

                # Regenerate POLICY_CACHE file
                umask 022
                echo "// AUTO-GENERATED FILE from /opt/tomcat/" \
                        > "$POLICY_CACHE"
                echo ""  >> "$POLICY_CACHE"
                cat $CATALINA_BASE/conf/*.policy \
                        >> "$POLICY_CACHE"

                # Remove / recreate JVM_TMP directory
                rm -rf "$JVM_TMP"
                mkdir -p "$JVM_TMP" || {
                        log_failure_msg "could not create JVM temporary directory"
                        exit 1
                }
                chown $TOMCAT_USER "$JVM_TMP"

                catalina_sh start $SECURITY
                sleep 5
                if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                        --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                        >/dev/null; then
                        if [ -f "$CATALINA_PID" ]; then
                                rm -f "$CATALINA_PID"
                        fi
                        log_end_msg 1
                else
                        log_end_msg 0
                fi
        else
                log_progress_msg "(already running)"
                log_end_msg 0
        fi
        ;;
  stop)
        log_daemon_msg "Stopping $DESC" "$NAME"

        set +e
        if [ -f "$CATALINA_PID" ]; then
                start-stop-daemon --stop --pidfile "$CATALINA_PID" \
                        --user "$TOMCAT_USER" \
                        --retry=TERM/20/KILL/5 >/dev/null
                if [ $? -eq 1 ]; then
                        log_progress_msg "$DESC is not running but pid file exists, cleaning up"
                elif [ $? -eq 3 ]; then
                        PID="`cat $CATALINA_PID`"
                        log_failure_msg "Failed to stop $NAME (pid $PID)"
                        exit 1
                fi
                rm -f "$CATALINA_PID"
                rm -rf "$JVM_TMP"
        else
                log_progress_msg "(not running)"
        fi
        log_end_msg 0
        set -e
        ;;
   status)
        set +e
        start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null 2>&1
        if [ "$?" = "0" ]; then

                if [ -f "$CATALINA_PID" ]; then
                    log_success_msg "$DESC is not running, but pid file exists."
                        exit 1
                else
                    log_success_msg "$DESC is not running."
                        exit 3
                fi
        else
                log_success_msg "$DESC is running with pid `cat $CATALINA_PID`"
        fi
        set -e
        ;;
  restart|force-reload)
        if [ -f "$CATALINA_PID" ]; then
                $0 stop
                sleep 1
        fi
        $0 start
        ;;
  try-restart)
        if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null; then
                $0 start
        fi
        ;;
  *)
        log_success_msg "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
        exit 1
        ;;
esac

exit 0

Author: crazyj7@gmail.com

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
Bash Tip 작업속도를 빠르게  (0) 2021.03.03
리눅스 백그라운드 실행(터미널종료에도)  (2) 2021.02.23
Git 사용법_요약  (0) 2019.12.16
VI 사용법  (0) 2015.06.02
반응형
mysql_setup

MySQL 5.7

타임존 설정

타임존 선택 수동으로 설정하는 방식

ls /usr/share/zoneinfo
여기에서 원하는 지역을 디렉터리 구조 내부를 탐색하여 찾는다.
ls /usr/share/zoneinfo/Asia/Seoul

현재설정
$ ll /etc/localtime
/etc/localtime -> /usr/share/zoneinfo/America/New_York
$ date
Thu Nov 7 20:48:33 EST 2019

다음과 같이 변경
$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
$ date
Fri Nov 8 10:55:06 KST 2019

사실 타임존 선택은 더 간단하게 “tzselect” 커맨드로 하면 메뉴를 골라 쉽게 설정할 수 도 있다.

$ tzselect

시간 동기화

시간이 틀리면 여러가지 문제가 발생하니 먼저 시간을 동기화하자.

sudo apt-get install ntp

vi /etc/ntp/conf
server 1.kr.pool.ntp.org
server 1.asia.pool.ntp.org
server time.bora.net

sudo service ntp restart
sudo ntpq -p

설치 (Ubuntu 기준)

-기존 설치된 것 삭제

apt list | grep mysql-server
버전 확인
sudo apt-get purge mysql-server
sudo apt-get purge mysql-common

설치 데이터 삭제
아래 경로 반드시 확인 필요!
rm -rf /var/log/mysql
rm -rf /var/log/mysql.*
rm -rf /var/lib/mysql
rm -rf /etc/mysql
  • 패키지 검색

  • sudo apt-get update

  • sudo apt-cache search mysql-server
    image

  • 설치

  • sudo apt-get install mysql-server-5.7
    image

$ mysql --version
5.7.27
$ vi /etc/mysql/mysql.conf.d/mysqld.cnf
port 번호 변경 (옵션)
$ service mysql restart

관리자 패스워드 설정

수동으로 패스워드 설정 방법

루트로 mysql을 실행한다.
$ sudo mysql -u root 
패스워드 없이 로그인 됨.
> alter user 'root'@'localhost' identified with mysql_native_password by '패스워드';
> flush privileges ;
> exit
$ service mysql restart

일반계정으로 전환하여 로그인 (로컬)
$ mysql -u root -p

간단하게 커맨드로 설정하는 방법

루트로 로그인하여
$ mysqladmin -u root -p password

계정 생성

로컬 접속

> create database test character set utf8 collate utf8_bin ;  # test DB를 만들어서 아래 권한 부여 (옵션)

> use mysql ;
> insert into user(host, user, authentication_string, ssl_cipher,
 x509_issuer, x509_subject) 
 values('localhost', '계정', password('패스워드'), '', '', ''); 
> flush privileges ;
> grant all privileges on DB명.* to 계정@localhost;
> flush privileges ;

빈 값 필드들을 빼보니 쿼리가 실패하였다. grant전에 flush를 안해주면 쿼리가 실패한다. 위에 나온대로 하는 게 좋다.

원격 접속

> 위 로컬 접속에서 localhost를 %로만 바꿔준다. 

더 간단한 방법

> craete user '계정'@'localhost' identified by '패스워드' 
   password expire never ;
> grant all privileges on DB명.* to 계정@localhost;

Author: crazyj7@gmail.com

+ Recent posts