Array Configuration Utility 입니다. 통칭 SSA

 

cp044526.exe
13.74MB

 

'HP > 서버' 카테고리의 다른 글

ibm op 판넬  (0) 2016.10.28
HP Microserver Gen8 windows server 2012 설치방법  (0) 2016.09.11
HP server ESXi 구성하기  (0) 2016.09.11
HP server iLO 라이센스 발급받기  (0) 2016.09.11
HP Microserver Gen8 ILO  (0) 2016.09.11

가끔 리눅스 크론탭 번호를 잘못설정해서 nano 로 계속 열리거나

vim 으로 열리는 경우가 있다.

 

그경우 다음과 같이 변경하면된다.

 

나노로 변경

export VISUAL=nano; crontab -e

vim 으로 변경

export VISUAL=vim; crontab -e

vi 로 변경

export VISUAL=vi; crontab -e

일단 필자는 에이텐 KVM 스위치를 사용하고 있고 CS62US 모델을 사용중이고

 

로지텍은 M705를 사용중이다...(8년째 가성비로 참고 쓰는중)

 

해당 KVM 스위치는 핫키 지원이 되고 핫키 설정 및 기타 설정을 할 수 있는 모델이다.

 

그래서 메뉴얼에 있는 설정 중 마우스 에뮬레이터? 기능을 켜고 끌 수 있게 되어있다.

 

무슨 기능인지 모르겠는데 누군가는 마우스 인식이 안될 때 이 기능을 껏다고 해서 나도 해봤다.

 

[NumLock + (-)]로 설정 메뉴에 진입 후 [m] 키로 해당 기능을 껐다.

 

결과는 성공 !!!!!

 

아래 메뉴얼 이미지를 첨부하니 참고하길...



출처: https://cofs.tistory.com/424 [CofS]

 

KVM 스위치 CS62US에서 로지텍 마우스 사용하기

망분리된 환경에서 KVM 스위치 사용은 자주 있는 일이다. 그런데 일부 제품들에서 로지텍 무선마우스 지원이 안되더라... 필자도 4개 제품을 사용해봤는데(다른 이유로...) 그중 2개가 로지텍 마우

cofs.tistory.com

 

갑작스러운 the password has expired error 로 당황할때가 있습니다..

 

 

비밀번호는 SYSTEM 계정으로 들어가서 다음 명령으로 변경하면 됩니다.

 

ALTER USER user_id IDENTIFIED BY new_password;

 

만약 집에서 개인정으로 테스트 해보는 환경이라면 매번 비밀번호를 변경하는게 불편할 수도 있겠습니다. 다음 명령으로 만료가 되지 않도록 설정할 수 있습니다.

 

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

 

추가로 또 하나 이야기 하자면, 로그인 시 비밀번호가 10번 틀리면 계정이 잠기는 것이 기본 프로필 설정입니다. 잠긴 계정을 풀려면 다음 명령을 사용합니다.

 

ALTER USER user_id ACCOUNT UNLOCK;

 

시스템 계정까지 비밀번호가 비밀번호가 만료되었다면 시스템의 로컬에서 sqlplus 를 사용해서  인증없이 로그인한 후 비밀번호를 변경하면 되겠습니다. 다음처럼 합니다.



출처: https://offbyone.tistory.com/118 [쉬고 싶은 개발자]

'프로그래밍언어 > Oracle' 카테고리의 다른 글

Mariadb 백업 및 복구  (0) 2020.02.26
오라클 명령어  (0) 2018.10.15
ORA-01034: ORACLE not available 에러  (0) 2018.07.31

Python jupyter notebook 설치

 

#pip를 이용한 notebook 설치
pip install notebook


#config 파일 생성하기 (생성후 생성된 conifg 경로 확인)
jupyter notebook --generate-config

#password hash 만들기
python
from notebook.auth import passwd
passwd()


까지 입력하면 패스워드 묻는프롬프트가 나타남 두번 입력한후.
해쉬가 나타나면 해당 해쉬를 복사.

 

 

#config 파일 생성하기 (생성후 생성된 conifg 경로 확인) 의 경로를 찾아가 vi 편집기 실행

 

vi /root/.jupyter/jupyter_notebook_config.py 

다음사항들의 # 주석을 해제

설정 방법
비밀번호 설정 c.NotebookApp.password 주석 해제 후 아까 생성후 복사해둔 해쉬 붙여넣기
기본 작업 경로 설정 c.NotebookApp.notebook_dir주석해제 후 실행하고자하는 dir 지정 (ex, /home/(사용자이름) )
외부 접속 허용 c.NotebookApp.allow_origin = '*'
서버를 띄울 아이피 설정 c.NotebookApp.ip = '0.0.0.0'
주피터 서버 실행 시 브라우저 실행 X c.NotebookApp.open_browser = False
주피터 서버 포트 c.NotebookApp.port = 8888

Sh 파일로 만들어 실행하기.

nohup /root/venv/bin/jupyter notebook --allow-root &

 

 

완료이후 

 

http://해당서버ip:8888 접속하면

 

다음과 같은 화면이 나타납니다.

 

 

CDKey.vbs
0.00MB
CD-key.ps1
0.00MB

Windows CD-Key 알아내기

Microsoft/NT 2013. 6. 5. 15:01

내가 쓰고 있는 Windows에 CD-Key(Product Key)를 찾아내는 방법은 여러가지 입니다.

간편하게 MagicalJellyBean http://www.magicaljellybean.com/keyfinder/ 같은 간단한 프로그램을 이용하는 방법도 있지만, 해당 컴퓨터에 설치를 필요로 하지요

 

1. Magical Jelly Bean의 Keyfinder프로그램

 

2. VBS스크립트를 활용

또다른 방법으로 스크립트를 이용하면 별도의 프로그램 설치필요 없이도 가능 합니다.

아래는 구글링으로 찾아낸 VBS 

 

++Script 펼치기

 

 

해당내용을 메모장에 붙여넣기 하여 .vbs 형식으로 저장한뒤 더블클릭으로 확인 가능합니다.

  ㄴ 또는 아래의 파일을 다운받으세요

 

 CDKey.vbs


 

하지만, 위 두가지 방법으로는 Volume license로 적용된 CD-Key는 확인이 불가능 합니다.

이유는 해당 키값을 레지스트리에 암호화된 상태로 남아, 모두 BBBBB-BBBBB-BBBBB-BBBBB-BBBBB 이런 형식으로 보이기 때문이지요.

 

그래서, 또다시 구글링으로 방법을 찾아보았습니다.

3. PowerShell을 이용한 방법

 

 

3.1 아래의 스크립트를 메모장에 복사한 후 .PS1 형태로 저장 합니다.

     ㄴ 또는 아래의 파일을 받으세요

 CD-key.ps1

 

 

+++PS 스크립트 펼치기

 

 

3.2 PowerShell을 실행후, Set-ExecutionPolicy Unrestricted 와 Set-ExecutionPolicy RemoteSigned 를 각각 실행 합니다.

 

3,3 위 .PS1파일을 바로 실행하거나, (방법은 이곳: http://technet.microsoft.com/en-us/library/ee176949.aspx 참조)

         ㄴ 복사후 PS창에 붙여 넣기 합니다. (아래그림참조)

 

 

 

3.4 Get-WindowsKey 커맨드로 CD-Key확인. 이상 끝.

 

혹시 안되면 댓글 남겨주세요.

출처는 http://mspowershell.blogspot.kr/

'운영체계자료 > Windows NT Server' 카테고리의 다른 글

MSE 윈도우서버에 설치하는방법  (0) 2018.07.21
server 블루스크린 c00002e2  (0) 2016.04.07

package.json 파일만 옮긴이후.

 

npm install

 

Option Explicit
Dim objshell,path,DigitalID, Result
Set objshell = CreateObject("WScript.Shell")
'Set registry key path
Path = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
'Registry key value
DigitalID = objshell.RegRead(Path & "DigitalProductId")
Dim ProductName,ProductID,ProductKey,ProductData
'Get ProductName, ProductID, ProductKey
ProductName = "Product Name: " & objshell.RegRead(Path & "ProductName")
ProductID = "Product ID: " & objshell.RegRead(Path & "ProductID")
ProductKey = "Installed Key: " & ConvertToKey(DigitalID)
ProductData = ProductName & vbNewLine & ProductID & vbNewLine & ProductKey
'Show messbox if save to a file
If vbYes = MsgBox(ProductData & vblf & vblf & "Save to a file?", vbYesNo + vbQuestion, "BackUp Windows Key Information") then
Save ProductData
End If
'Convert binary to chars
Function ConvertToKey(Key)
Const KeyOffset = 52
Dim isWin8, Maps, i, j, Current, KeyOutput, Last, keypart1, insert
'Check if OS is Windows 8
isWin8 = (Key(66) \ 6) And 1
Key(66) = (Key(66) And &HF7) Or ((isWin8 And 2) * 4)
i = 24
Maps = "BCDFGHJKMPQRTVWXY2346789"
Do
Current= 0
j = 14
Do
Current = Current* 256
Current = Key(j + KeyOffset) + Current
Key(j + KeyOffset) = (Current \ 24)
Current=Current Mod 24
j = j -1
Loop While j >= 0
i = i -1
KeyOutput = Mid(Maps,Current+ 1, 1) & KeyOutput
Last = Current
Loop While i >= 0

If (isWin8 = 1) Then
keypart1 = Mid(KeyOutput, 2, Last)
insert = "N"
KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
If Last = 0 Then KeyOutput = insert & KeyOutput
End If
ConvertToKey = Mid(KeyOutput, 1, 5) & "-" & Mid(KeyOutput, 6, 5) & "-" & Mid(KeyOutput, 11, 5) & "-" & Mid(KeyOutput, 16, 5) & "-" & Mid(KeyOutput, 21, 5)
End Function
'Save data to a file
Function Save(Data)
Dim fso, fName, txt,objshell,UserName
Set objshell = CreateObject("wscript.shell")
'Get current user name
UserName = objshell.ExpandEnvironmentStrings("%UserName%")
'Create a text file on desktop
fName = "C:\Users\" & UserName & "\Desktop\WindowsKeyInfo.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set txt = fso.CreateTextFile(fName)
txt.Writeline Data
txt.Close
End Function

해당파일을 vbs 확장자로 저장하거나 첨부된 파일을 다운받은후에.

 

wscript.exe "check.vbs"

실행하면 

시디키를 확인할수있다.

 

DHCP 활성화 방법

Network -> DHCPServer -> Status : Enable 체크

 

외부 Remote 활성화

 

System Tools -> Admin Setup -> Remote Management -> Add

Subnet : 0.0.0.0 / 0 입력

 

이후 공인ip로 접근시 해당 공유기에 접근할수 있습니다. 

공식 메뉴얼 

https://www.tp-link.com/us/support/faq/66/

 

How do I configure Remote Management for my TP-Link Wireless Router? | TP-Link

How do I configure Remote Management for my TP-Link Wireless Router? Step 1 Open the web browser and in the address bar type in: http://192.168.1.1 or http://192.168.0.1 or http://tplinklogin.net Then press Enter. Note: The LAN IP is vary by model. Please

www.tp-link.com

전체 문서 메뉴얼

https://www.tp-link.com/kr/support/download/tl-er6020/v1/

 

다운로드 함 TL-ER6020 | TP-Link 대한민국

TP Link - Download Center Detail

www.tp-link.com

세부설정 옵션 메뉴얼

https://www.tp-link.com/us/configuration-guides/configuring_network/?configurationId=18572#configuring_the_wan_8_2

 

configuring_network

VLAN Add the WAN port to a VLAN. Generally, you don’t need to manually configure it unless required by your ISP. By default, the WAN port is automatically assigned to a VLAN, and the egress rule of the VLAN is UNTAG, so the packets are transmitted by the

www.tp-link.com

 

 

Mongodb replicaset 으로 구성하여 사용하던 도중에 .. master 이 올라가지 않는 문제가 발생했다.

 

시스템이 비정상 셧다운된이후였는데. 올라가는 로그를 보니 

 

쉽게 해결되긴 어려워 보였다..

 

slave 는 정상 구동중인 상태였으므로.

 

그냥 master 을 삭제하고 다시 구성하면 되지 않을까싶어 해보았다.

 

 

mongo --port 26026 -u "id" -p "Password" --authenticationDatabase "admin"

salve 권한이 있는 포트로 접속한후 

rs.remove("localhost:26016")

과감히 삭제이후 다시새로운 곳에 다음과 같이 폴더를 생성한후

mkdir /var/lib/mongo/master
mkdir /var/lib/mongo/master/log

 conf  파일을 생성

# mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb/master
  journal:
    enabled: true

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/lib/mongodb/master/log/mongod.log

# network interfaces
net:
  port: 26016
  bindIp: 127.0.0.1

processManagement:
  timeZoneInfo:  /usr/share/zoneinfo
  fork: true 

replication:
  replSetName: "replica"

 

 

 

이후 mongodb 에 접속하여 새로운 master 다시 추가.

rs.add( { _id:0,host:"127.0.0.1:26016",priority:2} )

 

이렇게하면 모두 완료된다..

 

 

replicaset 구성방법은 이전글을 참고하시면 됩니다.

 

https://ospetabyte.tistory.com/571?category=758411

 

MongoDB 설치 MongoDB replicaset 설정

우분투 18.04 기준으로 되어있습니다.  1. MongoDB 설치 wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - sudo apt-get install gnupg wget -qO - https://www.mongodb.org/..

ospetabyte.tistory.com

 

 

pip install virtualenv

virtualenv python 
# python 이라는 경로로 가상환경 설치

source bin/activate

실행

 

아이들이 필요로해서 사는것인데 그걸가지고 장사를 한다니 너무 보기 안좋네요..

 

그분들도 다 아이들이 있으실껀데. 그래서 굳이 캠을 사지않고 스마트폰으로 가능한 방법이 있어서

 

이렇게 공유드립니다. 

 

많은분들이 비싸게 캠을 사지 않고 원격 수업을 들었으면 하는마음에서 도메인에 사이트를 올렸습니다.

 

누구나 보고 쉽게 설치할수있게 설명해놓았습니다.

 

이렇게 설치하고 제가 테스트한곳들은 웹상에서 캠이 필요로하는 곳들은 테스트했을땐 정상적으로 작동하였습니다.

 

가장 좋은테스트는 원격수업을 하는 실무에 있는분들이 테스트해줬으면 하는 바램입니다. 

 

제가 어떻게 그분들께 연락을 할수가없으니 이방법이 많이 공유되어 비싸값에 캠을 구매하지 않고

 

학생들이 정상적으로 수업을 받았으면 하는 마음입니다.

 

http://schoolcam.shop/

 

 

스마트폰 캠으로 사용하는방법!

PC에 필요한 다운로드 프로그램 사이트 (iriun):

사이트 바로가기 바로 다운로드

 

**주의사항**

스마트폰은 Wifi가 연결되어있어야만합니다. 스마트폰과 PC 의 네트워크가 같은곳에 있어야합니다.

1 - PC START

설치 프로그램 아이콘 실행

2

동의후 Next 버튼

3

Next 버튼

4

Install 버튼

5

체크박스 선택후 Finish 버튼

6 - PC END

해당화면이 실행되었다면 정상적으로 PC 설치 완료

1 - Phone START

휴대폰에서 Google Play 어플 실행

2

ir 만 검색하셔도 아래 추천 검색어가 나오게됩니다.

3

설치 버튼을 눌러줍니다.

4

설치가 완료되면 App을 실행합니다.

5

설치가 완료되면 App을 실행합니다.

6

허용클 눌러줍니다.

7

허용클 눌러줍니다.

8- PHONE END

이제 PC 와 스마트폰이 캠으로연결되었습니다.

충격적인 자바스크립트 문법을 보았다...

 

        if(x !==3){
            console.log(y);
            var y = 5;
            if(y === 5){
                var x =3;
            }
            console.log(y);
        }
        if(x ===3){
            console.log(y);
        }

이문법을 보고 console.log(y) 에서 오류가 발생할꺼라고 생각했지만. 이문법은 아래와 같이 해석된다.

 

        var x;
        var y;
        if(x !==3){
            console.log(y);
            var y = 5;
            if(y === 5){
                var x =3;
            }
            console.log(y);
        }
        if(x ===3){
            console.log(y);
        }

애초당시 처음 선언했던것처럼 코드를 짜면 안되지만.. 호이스트를 확인하기 위해서.. 보았다..

 

        f();
        function f(){
            console.log(f);
        }

함수역시..

 

         function f(){
            console.log(f);
        }
        f();

 

https://git-scm.com/download/win

 

Git - Downloading Package

Downloading Git Now What? Now that you have downloaded Git, it's time to start using it.

git-scm.com

윈도우 64비트 사용자라면 해당 파란 체크 부분을 다운로드 설치 한다.

설치할때 이렇다할것은 없다 기본 셋팅으로 다음~을 눌러 진행하면 된다.

 

설치가 완료되면.

 

 

Git Bash 를 실행한다.

 

설치가 정상적으로 되었다면

git --version

 

 

 

위와같이 확인할수있다.

 

간단한 bash 명령어는 리눅스와 동일하다

 

 

git init #깃 경로 지정

vi .gitignore #깃 커밋 제외대상 추가

vi README.md #깃 메인 설명



환경설정 

git config --global user.name "Peta"
git config --global user.email "0petabyte@gmail.com"

확인은 git config --list

git add 폴더이름 or 파일명 또는 git add . (모든 파일 추가)

git commit -m "message 를 이곳에 적는다"

git remote  (기존에 설정이 안되었다면 아무것도 안나온다.)

git remote add origin https://github.com/TEST/TEST

이제 repository 에 연결완료.

git push origin master  입력하면 push 완료.

삭제

git -rm -r 폴더 git -rm -r file.js

git commit -m 'delete'

git push origin master 

'프로그래밍언어 > Git' 카테고리의 다른 글

깃허브 프로젝트 이름 변경하여 임포트하기.  (0) 2020.02.27
Git bash 명령어  (0) 2019.06.27

깃허브에서 프로젝트 임포트하려다가 보면 똑같은 프로젝트 이름때문에 . 임포트가 되지않는다..

 

 

Some Projects cannot be imported because they already exist in the workspace.

간혹.. 이경우때문에 기존프로젝트 이름을 변경하던가..해서 받곤했는데 가끔보면 너무 불편해서.

 

가능한 방법을 찾아보았다. 아래처럼 하면 가능하다!

 

먼저 깃에서 프로젝트를 다운받는다.

 

 

그다음 압축을 풀어서 프로젝트 폴더 이름을 변경한다.

 

그이후에

 

 

 

해당 프로젝트 경로까지 선택하면 바뀐 이름으로 프로젝트를 임포트 할수있다..

 

생각보다 간단한데.. 검색해도!!

 

.project 파일 수정해야되서 귀찮더라.. 

 

다른 방법이 잘보이지 않는다!! 그래서 직접 이렇게 하면 될것같은데? 싶어서 해본 방법이다.

 

추가!


 

프로젝트 임포트후 에러가 뜬다면..

 

Java version 을 바꾸어주면된다.!

 

 

 

 

'프로그래밍언어 > Git' 카테고리의 다른 글

[Git] 깃 허브 Bash 설치 및 기본 셋팅.  (0) 2020.03.04
Git bash 명령어  (0) 2019.06.27

백업.

mysqldump -u root -p dbname > /root/mariadb/backup.sql

 

 

복구

mysql -u root -p  dbname < backup.sql 

'프로그래밍언어 > Oracle' 카테고리의 다른 글

오라클 비번 만료(the password has expired)  (0) 2020.11.04
오라클 명령어  (0) 2018.10.15
ORA-01034: ORACLE not available 에러  (0) 2018.07.31
자료형 종류 예제
수(Number) 정수

76,197,750,

-11,

-234

실수(고정소수점)

3.14,

-2.717,

45.78

실수(부동소수점)

1e4, 

2.5e34,

5.67e-9,

7.66E-3

문자열 문자열

"1234"

"true"

"apple-run"

"사랑"

"\"JSP\""

제어문자

\b (백 스페이스)

\f (폼 피드)

\n (개행)

\r (캐리지 반환)

\t (탭)

\" (따움표)

\/ (슬래시)

\\ (역슬래시)

배열

배열은 대괄호[ ] 로 나타냅니다

배열의 각 요소는 기본 자료형이거나 배열, 객체입니다.

각 요소들은 쉼표 , 로 구분합니다

"name" : ["홍길동","이순신","임꺽정"]

// 대괄호 안에 배열 요소를 콤마 , 로 구분해서 나열합니다.

객체

JSON 개게는 중괄호 {}로 둘러싸서 표현합니다.

쉼표 , 를 사용해 여러 프로퍼티를 포함 할 수 있습니다.

{

   "name" : "홍길동",

   "age" : 16,

   "weight" : 67

}

// 중괄호 안에 name/value 쌍을 콤마로 구분해서 나열합니다. 

popupTest.html

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<script type="text/javascript">
window.onload = pageLoad;
function pageLoad(){
	notShowPop = getCookieValue();
	if(notShowPop != "true"){
		window.open("popUp.html","pop","width=400,height=500,history=no,resizable=no,status=no,scrollbars=yes,menubar=no");
		
	}
}

function getCookieValue(){
	var result="false";
	if(document.cookie != ""){
		cookie = document.cookie.split(";");
		for(var i=0; i<cookie.length;i++){
			element = cookie[i].split("=");
			value=element[0];
			value=value.replace(/^\s*/,'');
			if(value =="notShowPop"){
				result = element[1];
			}
		}
	}
	
	return result;
}

function deleteCookie(){
	document.cookie = "notShowPop=" + "false" + ";path=/; expires=-1";
}

</script>
</head>
<body>
	<form>
		<input type=button value="쿠기삭제" onClick="deleteCookie()">
	</form>
</body>
</html>

 

popUp.html

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<script type="text/javascript">
	function setPopUpStart(obj){
		if(obj.checked == true){
			var expireDate = new Date();
			expireDate.setMonth(expireDate.getMonth() +1);
			document.cookie = "notShowPop="+"true" + ";path=/; expires="+expireDate.toGMTString();
			
			window.close();
		}
	}
</script>
</head>
<body>
	<form>
		<input type=checkbox onClick="setPopUpStart(this)">오늘 더이상 팝업창 띄우지 않기
	</form>
</body>
</html>

 

'프로그래밍언어 > JavaScript' 카테고리의 다른 글

ES6 자바스크립트 호이스트  (0) 2020.03.06
json 자료형  (0) 2020.02.26
자바스크립트 slice 요소 복사  (0) 2018.11.14
자바스크립트 splice 배열요소 삭제  (0) 2018.11.14

if문 기본사용법

if [ 값1 조건식 값2 ];then

   수행문

 fi 

 

if 문 조건문 종류

[ -z ] : 문자열의 길이가 0이면 참

[ -n ] : 문자열의 길이가 0이 아니면 참



[ -eq ] : 값이 같으면 참

[ -ne ] : 값이 다르면 참

[ -gt ] :  값1 > 값2

[ -ge ] : 값1  >= 값2

[ -lt ] : 값1 < 값2

[ -le ] : 값1 <= 값2



[ -a ] : &&연산과 동일 and 연산

[ -o ] : ||연산과 동일 xor 연산



[ -d ] : 파일이 디렉토리면 참

[ -e ] : 파일이 있으면 참

[ -L ] : 파일이 심볼릭 링크면 참

[ -r ] : 파일이 읽기 가능하면 참

[ -s ] : 파일의 크기가 0 보다 크면 참

[ -w ] : 파일이 쓰기 가능하면 참

[ -x ] : 파일이 실행 가능하면 참

[ 파일1 -nt 파일2 ]  : 파일1이 파일2보다 최신파일이면 참

[ 파일1 -ot 파일2 ]  : 파일1이 파일2보다 이전파일이면 참

[ 파일1 -ef 파일2 ] : 파일1이 파일2랑 같은 파일이면 참

 

AND문

 if [ 값1 조건식 값2 -a 값1 조건식 값2 ];then

   수행문

 fi 

 

OR문

 if [ 값1 조건식 값2 -o 값1 조건식 값2 ];then

   수행문

 fi 

 

if elif문

if [ 값1 조건식 값2 ]
then
 수행문
   
elif [ 값1 조건식 값2]
then
 수행문
 
fi 

 

smbclinet 설치

sudo apt-get install smbclient cifs-utils

 

smb 클라이언트 정보 확인

 

smbclient -L 192.168.0.111 -U%   

 

 

연결

 

sudo mount -t cifs //컴퓨터이름(혹은 주소)/공유이름 /공유할/디렉토리

암호가 있을경우

   -o username=계정이름,password=암호

 

 

 

mongoDB 백업하기(dump)

mongodump -u user_name -p user_password --authenticationDatabase=admin --out /data/backup/ --db db_name --collection collection_name --gzip 

# 옵션 설명
-u : 계정명
-p : 계정의 비밀번호
--authenticationDatabase=admin : 인증
--host : 원격 시 IP 주소 및 포트 
--out : Dump 받을 폴더 경로
--db : Dump 받을 DB 선택 (미작성 시 DB 전체)
--collection : Dump 받을 collection(table) 선택  (미작성 시 Collection 전체)
--gzip : Dump 파일 확장자

 

mongoDB 복구하기(Restore)

mongorestore -u user_name -p user_password --host 192.168.0.100:8000 --authenticationDatabase=admin --gzip --db db_name --collection collection_name /data/backup/collection.bson.gz --drop

# 옵션 설명
-u : 계정명
-p : 계정의 비밀번호
--authenticationDatabase=admin : 인증
--host : 원격 시 IP 주소 및 포트
--db : Restore 할 DB 선택 
--collection : Restore 할 collection(table) 선택
--gzip : Restore 파일 확장자
--drop : 백업에 없는 collection 삭제



sudo apt-get install mariadb-server

 

sudo mysql_secure_installation

 

Set root password? [Y/n] Y 

Remove anonymous users? [Y/n] Y

Disallow root login remotely? [Y/n] n

Remove test database and access to it? [Y/n] Y

Reload privilege tables now? [Y/n] y

 

 

셋팅완료후 접속을 하면..

root@peta:/home/peta# mysql -u -root -p
Enter password: 
ERROR 1698 (28000): Access denied for user '-root'@'localhost'

 

접속이 되질 않는다..

 

설정을 바꾸어주자.

root@peta:/home/peta# mysql

MariaDB [(none)]> use mysql;

MariaDB [mysql]> update user set plugin='' where user='root';

MariaDB [mysql]> flush privileges;

 

 

이제 데이터베이스와 계정을 생성하자.

 

MariaDB [(none)]> create database testDB;

MariaDB [(none)]> create user 'testId'@'%' identified by 'Passwd';

MariaDB [mysql]> grant all privileges on testDB.* to 'testId'@'%';

MariaDB [mysql]> flush privileges;

 

 

root@peta:/home/peta# vi /etc/mysql/mariadb.conf.d/50-server.cnf 
#문자열 변경
collation-server      = utf8mb4_unicode_ci

#외부접속허용
bind-address            = 0.0.0.0

 

이렇게 모든셋팅이 완료되었다.

18-Feb-2020 20:39:53.622 SEVERE [http-nio-8080-exec-5] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [appServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment] with root cause
	java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
		at java.lang.Class.forName0(Native Method)
		at java.lang.Class.forName(Class.java:264)
		at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
		at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
		at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1181)
		at org.imgscalr.Scalr.scaleImage(Scalr.java:2135)
		at org.imgscalr.Scalr.scaleImageIncrementally(Scalr.java:2275)
		at org.imgscalr.Scalr.resize(Scalr.java:1711)
		at org.imgscalr.Scalr.resize(Scalr.java:1298)
		at com.peta.controller.upload.UploadFileUtils.makeThumbnail(UploadFileUtils.java:89)
		at com.peta.controller.upload.UploadFileUtils.uploadFile(UploadFileUtils.java:38)
		at com.peta.controller.upload.UploadController.uploadAjax(UploadController.java:81)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
		at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
		at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
		at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)
		at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
		at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
		at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
		at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
		at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
		at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
		at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
		at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
		at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:94)
		at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
		at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
		at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
		at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
		at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
		at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
		at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
		at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
		at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
		at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
		at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
		at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
		at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:609)
		at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
		at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
		at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
		at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
		at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
		at java.lang.Thread.run(Thread.java:748)

 

 

권한문제일주 알고 한참을 찾다가보니..

 

tomcat/bin/catalina.sh 파일에서

 

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"

아래와 같이 변경

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Djava.awt.headless=true"

 

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"

 

'운영체계자료 > Linux' 카테고리의 다른 글

리눅스 smb 마운트  (1) 2020.02.23
마리아디비 10.1 설치및 초기 셋팅  (0) 2020.02.20
Ubuntu 18.04 설치후 셋팅  (0) 2020.02.10
Linux 사용하고 있는 port process 확인  (0) 2019.07.22
VI편집기 명령어  (0) 2018.08.31

우분투 셋팅을 자주하는 경우가 많아서 기록목적으로 포스팅합니다. 

원하는 셋팅과 다를수 있습니다. 

 

 

#English 로 설치할것. 한글 에러..많음..

#sudo passwd 설정

sudo passwd root 



#network 툴 설치

sudo apt install net-tools 



#ssh 설치

apt-get install openssh-server 
vi /etc/ssh/sshd_config 
PermitmitRootLogin yes 
service ssh restart 



#python3.7 클린설치

apt-get update 
sudo apt install software-properties-common 
sudo apt install python3.7 

apt install curl 
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 

sudo apt-get install python3-distutils 
python3.7 get-pip.py 


apt install curl 
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 

sudo apt-get install python3-distutils 
python3.7 get-pip.py 



#오류발생시 

apt search testresources 
apt search widgetsnbextension 
이후에 다시 python3.7 get-pip.py 



#python 명령어로 바로 3.7 실행하기
#which python3.7 로 python 설치 루트 확인후

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 3 
sudo update-alternatives --config python 


#설정할 필요가 없다면 다되었음

#host네임변경

vi /etc/hostname 



#ip설정

vi /etc/netplan/01-network-manager-all.yaml  


# Let NetworkManager manage all devices on this system 
network: 
  version: 2 
  renderer: networkd 
  ethernets: 
   ens33: 
    addresses: 
      - 172.30.1.60/24 
    gateway4: 172.30.1.254 
    nameservers: 
      addresses: [168.126.63.1,8.8.4.4] 

 

netplan apply 






#crontab 

sudo select-editor

#vi mode 사용할경우는 2번

 

크론탭에 추가할내용

MAILTO=""
PATH=/usr/local/bin/:/sbin:/bin:/usr/sbin:/usr/bin

 

 

#java 설치

 

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

 

Java SE Development Kit 8 - Downloads

Java SE Development Kit 8 Downloads Thank you for downloading this release of the Java™ Platform, Standard Edition Development Kit (JDK™). The JDK is a development environment for building applications, applets, and components using the Java programming la

www.oracle.com

다운로드

 

/usr/local/java 디렉토리에 받아서 압축 해제

 

tar -xvzf jdk-8u241-linux-x64.tar.gz 

$ sudo vi /etc/profile

JAVA_HOME=/usr/local/java/jdk1.8.0_241
JRE_HOME=/usr/local/java/jdk1.8.0_241
PATH=$PATH:$JRE_HOME/bin:$JAVA_HOME/bin

export JAVA_HOME
export JRE_HOME
export PATH
$sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_241/bin/java" 1
$sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_241/bin/javac" 1
$sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_241/bin/javaws" 1
$sudo update-alternatives --set java /usr/local/java/jdk1.8.0_241/bin/java
$sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_241/bin/javac
$sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_241/bin/javaws

설치 확인

 

 

#톰캣 설치

 

whet http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51-fulldocs.tar.gz

tar -xvzf apache-tomcat-8.5.51-fulldocs.tar.gz 

/usr/local 에 설치

 

 

$currentDate 필드 값을 날짜 또는 시간 소인으로 현재 날짜로 설정합니다.
$inc 필드 값을 지정된 양만큼 증가시킵니다.
$min 지정된 값이 기존 필드 값보다 작은 경우에만 필드를 업데이트하십시오.
$max 지정된 값이 기존 필드 값보다 큰 경우에만 필드를 업데이트합니다.
$mul 필드 값에 지정된 양을 곱합니다.
$rename 필드 이름을 바꿉니다.
$set 문서에서 필드의 값을 설정합니다.
$setOnInsert 업데이트로 인해 문서가 삽입되는 경우 필드 값을 설정합니다. 기존 문서를 수정하는 업데이트 작업에는 영향을 미치지 않습니다.
$unset 문서에서 지정된 필드를 제거합니다.

 

우분투 18.04 기준으로 되어있습니다.

 

 1. MongoDB 설치

 

wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -

sudo apt-get install gnupg

wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list

 

sudo apt-get update

 

sudo apt-get install -y mongodb-org=4.2.3 mongodb-org-server=4.2.3 mongodb-org-shell=4.2.3 mongodb-org-mongos=4.2.3 mongodb-org-tools=4.2.3

 

위와같이 설치할경우 리눅스에 설치된 디렉토리는

 

 

2 . 폴더 생성 및 conf 파일 생성 

 

실행파일 

/usr/bin/mongo 

 

설치경로

/var/lib/mongo

 

설치경로에 3가지의 폴더와 파일을 만들어야한다.

 

mkdir /var/lib/mongo/master
mkdir /var/lib/mongo/master/log

mkdir /var/lib/mongo/slave1
mkdir /var/lib/mongo/slave1/log

mkdir /var/lib/mongo/arbiter
mkdir /var/lib/mongo/arbiter/log

 

 

그다음 위의 경로에 아래의 conf 파일을 각각 생성해준다. 

 

 

 

master 파일.

# mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb/master
  journal:
    enabled: true

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/lib/mongodb/master/log/mongod.log

# network interfaces
net:
  port: 26016
  bindIp: 127.0.0.1

processManagement:
  timeZoneInfo:  /usr/share/zoneinfo
  fork: true 

replication:
  replSetName: "replica"

 

slave 파일.

# mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb/slave1
  journal:
    enabled: true

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/lib/mongodb/slave1/log/mongod.log

# network interfaces
net:
  port: 26026
  bindIp: 127.0.0.1

processManagement:
  timeZoneInfo: /usr/share/zoneinfo
  fork: true 

replication:
  replSetName: "replica"

 

arbiter

# mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb/arbiter
  journal:
    enabled: true

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/lib/mongodb/arbiter/log/mongod.log

# network interfaces
net:
  port: 26036
  bindIp: 127.0.0.1

processManagement:
  timeZoneInfo: /usr/share/zoneinfo
  fork: true 

replication:
  replSetName: "replica"

 

 

3. 실행 및 종료

 

 

 

실행명령어

/usr/bin/mongod --config /var/lib/mongodb/master/master.conf 
/usr/bin//mongod --config /var/lib/mongodb/slave1/slave1.conf 
/usr/bin/mongod --config /var/lib/mongodb/arbiter/arbiter.conf 

 

종료명령어 (종료시에만 입력)

/usr/bin/mongod --shutdown --config /var/lib/mongodb/arbiter/arbiter.conf 
/usr/bin/mongod --shutdown --config /var/lib/mongodb/slave1/slave1.conf 
/usr/bin/mongod --shutdown --config /var/lib/mongodb/master/master.conf 

 

다음과같은 Shell 이 뜨게되면 아래와 같이 입력한다.

rsconf ={_id : "replica", members:[{_id:0,host:"127.0.0.1:26016",priority:2},{_id:1,host:"127.0.0.1:26026",priority:1},{_id:2,host:"127.0.0.1:26036",priority:1,arbiterOnly:true}]};

 

이렇게 하면 셋팅완료

 

 

아래부분은 보안부분이다.


#외부 접속을 허용하기위해선 bindIp : 0.0.0.0 로 설정해야 한다.

 

#계정생성 PRIMARY 로 접속하여

> use admin
> db.createUser({
    user: 'adminId',
    pwd: 'password',
    roles: ['root']
})

 

## 암호화 설정방법.

Linux에서 mongodb 키 파일을 작성하고 모드가 600그대로있는 모든 DB 서버에 복사하십시오 .

openssl rand -base64 741 > mongodb.key

chmod 600 mongodb.key

mongod.conf

security:
    authorization: enabled
    keyFile: /var/lib/mongodb/mongodb.key

 

 

<c:forEach items="${ test.numbers }" var="num">

	<c:forEach items="${ num.vec }" var="vec">

	<td>${ vec }</td>

	</c:forEach>

</c:forEach>

스프링 Controller에서 Model에 배열 데이터를 담아서 View로 전달한다면

View에서는 jstl forEach 구문을 이용해서 접근할 수 있다.

 

<c:forEach items="${ test.numbers }" var="num">

	<td>${ num }</td>



</c:forEach>

 

물론 이중구문을 이용해 배열안의 배열까지 접근이 가능하다.

 

 

forEach 구문을 사용안하고 배열 중 한 요소만을 출력하고자 한다면 다음과 같이 작성하면된다.

	<c:out value="${ test.num[1] }" />

num배열에서 2번째 요소가 출력된다.

 

배열 사이즈를 알고 싶을때는 다음과 같이 작성한다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

	<c:out value="${fn:length(test.num)}" />

 

 

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup

def getTitle(url):

    try:
        html = urlopen(url)
    except HTTPError as e:
        print(e)
        pass

    try:
        bsObj = BeautifulSoup(html.read(),"html.parser")
        #span class 가 red 이거나 green 인 경우
        #nameList = bsObj.findAll("span",{"class":{"green","red"}})
        #for name in nameList:
        #    content = name.get_text()
        #    print(content)

        # text 중에 the prince 가 몇번 들어가있는지 len 으로 갯수 확인
        #nameList = bsObj.findAll(text="the prince")
        #print(len(nameList))


        #id 가 text 인 값을 모두 찾아서 출력. 배열로 들어가기떄문에 선택적 출력을 할경우는 배열번지 선택
        allText = bsObj.findAll(id='text')
        print(allText)
        #print(allText[0].get_text())

    except AttributeError as e:
        print(e)
        pass


print('Search Start=================')
url = 'http://www.pythonscraping.com/pages/warandpeace.html'

getTitle(url)


print('Search End=================')

'빅데이터 > Scrapy' 카테고리의 다른 글

Python BeautifulSoup 기본 parser ver:python3  (0) 2018.12.23
Xpath 사용법  (0) 2018.08.25

Criteria.java

package com.peta.domain;

public class Criteria {
	private int page;
	private int perPageNum;
	private int groupnum;
	
	
	
	public int getGroupnum() {
		return groupnum;
	}

	public void setGroupnum(int groupnum) {
		this.groupnum = groupnum;
	}

	public Criteria() {
		this.page =1;
		this.perPageNum =10;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		
		if(page <= 0) {
			this.page = 1;
			return;
		}
		this.page = page;
	}

	public int getPerPageNum() {
		return this.perPageNum;
	}

	public void setPerPageNum(int perPageNum) {
		
		if(perPageNum <=0 || perPageNum >100) {
			this.perPageNum = 10;
		}
		this.perPageNum = perPageNum;
	}

	public int getPageStart() {
		return (this.page - 1) * perPageNum;
	}

	@Override
	public String toString() {
		return "Criteria [page=" + page + ", perPageNum=" + perPageNum + "]";
	}
	

	 
	
	
}

 

SearchCriteria.java

package com.peta.domain;

public class SearchCriteria extends Criteria{
	private String searchType;
	private String keyword;

	
	
	

	public String getSearchType() {
		return searchType;
	}
	public void setSearchType(String searchType) {
		this.searchType = searchType;
	}
	public String getKeyword() {
		return keyword;
	}
	public void setKeyword(String keyword) {
		this.keyword = keyword;
	}
	@Override
	public String toString() {
		return "SearchCriteria [searchType=" + searchType + ", keyword=" + keyword + "]";
	}


	
	
}

 

PageMaker.java

package com.peta.domain;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

public class PageMaker {
	private int totalCount;
	private int startPage;
	private int endPage;
	private boolean prev;
	private boolean next;
	
	
	//한화면에 보이는 페이지 갯수
	private int displayPageNum =10;
	
	private Criteria cri;

	public void setCri(Criteria cri) {
		this.cri =cri;
	}
	
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
		
		calcData();
	}
	
	private void calcData() {
		endPage = (int) (Math.ceil(cri.getPage() / (double) displayPageNum) * displayPageNum);
		
		startPage = (endPage-displayPageNum) + 1;
		
		int tempEndPage = (int) (Math.ceil(totalCount / (double) cri.getPerPageNum()));
		
		if (endPage > tempEndPage) {
			endPage = tempEndPage;
		}
		
		prev = startPage == 1? false:true;
		
		next = endPage * cri.getPerPageNum() >= totalCount ? false :true;
	}
	


	public int getStartPage() {
		return startPage;
	}

	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}

	public int getEndPage() {
		return endPage;
	}

	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}

	public boolean isPrev() {
		return prev;
	}

	public void setPrev(boolean prev) {
		this.prev = prev;
	}

	public boolean isNext() {
		return next;
	}

	public void setNext(boolean next) {
		this.next = next;
	}

	public int getDisplayPageNum() {
		return displayPageNum;
	}

	public void setDisplayPageNum(int displayPageNum) {
		this.displayPageNum = displayPageNum;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public Criteria getCri() {
		return cri;
	}

	@Override
	public String toString() {
		return "PageMaker [totalCount=" + totalCount + ", startPage=" + startPage + ", endPage=" + endPage + ", prev="
				+ prev + ", next=" + next + ", displayPageNum=" + displayPageNum + ", cri=" + cri + "]";
	}
	
	public String makeQuery(int page) {
		UriComponents uriComponents =
				UriComponentsBuilder.newInstance()
				.queryParam("page", page)
				.queryParam("perPageNum", cri.getPerPageNum())
				.build();
		
		return uriComponents.toUriString();
	}
	
	public String makeSearch(int page) {
		UriComponents uriComponents =
				UriComponentsBuilder.newInstance()
				.queryParam("page", page)
				.queryParam("perPageNum", cri.getPerPageNum())
				.queryParam("groupnum", cri.getGroupnum())
				.queryParam("searchType", ((SearchCriteria) cri).getSearchType())
				.queryParam("keyword", encoding(((SearchCriteria) cri).getKeyword())).build();
		
		return uriComponents.toUriString();
	}
	
	private String encoding(String keyword) {
		if(keyword ==null || keyword.trim().length() ==0) {
			return "";
		}
		
		try {
			return URLEncoder.encode(keyword,"UTF-8");
		}catch(UnsupportedEncodingException e) {
		return "";
		}
	}
	
	
}

 


 

Mapper.xml

 

특이사항 : if 문의 입력을 and 로 시작시키기위해 favnum >0 을 미리 조건을 준다. CDATA 사용

 <select id="listCriteria" resultType="com.peta.domain.UrlVO">
<![CDATA[
 select favnum,url,memo,userid,groupnum,nowdate from fav_list where favnum > 0
 ]]>
 <if test="groupnum != 0">
 and groupnum = #{groupnum}
 </if>
  
 <if test="searchType != null">
 	<if test="searchType == 'u'.toString()">
 		and url like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'm'.toString()">
 		and memo like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'um'.toString()">
 		and (url like CONCAT('%', #{keyword}, '%') OR memo like CONCAT('%', #{keyword}, '%')) 
 	</if>
 </if>
 order by favnum desc 
 limit #{pageStart},#{perPageNum}
 </select>
 

 
 <select id="countPaging" resultType="int">
 <![CDATA[
 select count(favnum) from fav_list where favnum > 0 
 ]]>
 <if test="groupnum != 0">
 AND groupnum = #{groupnum}
 </if>
  <if test="searchType != null">
 	<if test="searchType == 'u'.toString()">
 		and url like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'm'.toString()">
 		and memo like CONCAT('%', #{keyword}, '%')
 	</if>
 	<if test="searchType == 'um'.toString()">
 		and (url like CONCAT('%', #{keyword}, '%') OR memo like CONCAT('%', #{keyword}, '%')) 
 	</if>
 </if>
 </select>

DAO

public List<CodeVO> listCriteria(Criteria cri) throws Exception;
public int countPaging(Criteria cri) throws Exception;

 

DAOImpl

	@Override
	public List<CodeVO> listCriteria(Criteria cri) throws Exception{
		return session.selectList(namespace+".listCriteria",cri);
	}
	@Override
	public int countPaging(Criteria cri) throws Exception{
		return session.selectOne(namespace+".countPaging",cri);
	}

 

Service

public List<CodeVO> listCriteria(Criteria cri) throws Exception;
public int countPaging(Criteria cri) throws Exception;

ServiceImpl

	@Override
	public List<CodeVO> listCriteria(Criteria cri) throws Exception{
		return dao.listCriteria(cri);
	}
	@Override
	public int countPaging(Criteria cri) throws Exception{
		return dao.countPaging(cri);
	}

 

jsp page

	<div class="container">
		<ul class="pagination justify-content-center">
			<c:if test="${pageMaker.prev}">
				<li class="page-item"><a class="page-link" href="list${pageMaker.makeSearch(pageMaker.startPage -1)}">Previous</a></li>
			</c:if>
			
			<c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="idx">
				<li class="page-item <c:out value="${pageMaker.cri.page == idx?'class = active':''}"/>" >
				<a class="page-link" href="list${pageMaker.makeSearch(idx)}">${idx}</a>
				</li>
			</c:forEach>
				<c:if test="${pageMaker.next && pageMaker.endPage > 0}">
					<li><a class="page-link" href="list${pageMaker.makeSearch(pageMaker.endPage +1)}">Next</a></li>
				</c:if>
		</ul>
	</div>

 

 

Controller

    @RequestMapping(value="/code", method= {RequestMethod.GET,RequestMethod.POST})
    public String codeGroupList(Model model,CodeVO vo,SearchCriteria cri) throws Exception {
    	logger.info("Code Group list start................");
    	String codeType = "code";
		int groupnum = vo.getGroupnum();
		
		model.addAttribute("nowgroupnum",groupnum);
    	model.addAttribute("codeGroup",service.codeGroupList());
    	model.addAttribute("codeType",codeType);
    	model.addAttribute("list",service.listCriteria(cri));
    	model.addAttribute("groupcount",service.groupCount(groupnum));
    	model.addAttribute("nowgroupname",service.groupName(groupnum));
		PageMaker pageMaker = new PageMaker();
		pageMaker.setCri(cri);
		model.addAttribute("cri",cri);
		pageMaker.setTotalCount(service.countPaging(cri));
		model.addAttribute("pageMaker",pageMaker);
        return "codeboard/codeList.page";
    }
    

+ Recent posts