1. 기본

 

 범위

 예시

 10진수

 0 - 9

0,  1, 2, 3, 4 .... 8, 9, 10 ...

 16진수(Hex)

 0 ~ 9, A ~ F 

0,  1, 2 .... 9, A, B ... F, 10, 11 .... 19, 1A, 1B

 8진수(Octal)

 0 ~ 7

 0, 1, 2 .... 6, 7, 10, 11 ....

 2진수(Binary)

 0, 1

 0, 1, 10, 11, 100, 101



2. Python 으로 구현해보기

 1) 내장함수로 구현해보기

  - 소스 코드

if __name__ == "__main__":
num_10 = 236

num_2 = bin(num_10) # 접두어 "0b"가 붙음
num_8 = oct(num_10)
num_16 = hex(num_10)

print("10 -> 2 : ", num_2)
print("10 -> 8 : ", num_8)
print("10 -> 16 : ", num_16)
print("=================")

# int(x, base=10)
print("2 -> 10 : ", int(num_2, 2))
print("8 -> 10 : ", int(num_8, 8))
print("16 -> 10 : ", int(num_16, 16))

  - 결과


 2) 함수 구현해보기.

  - 재귀함수를 사용하여 함수 구현

def convert(num, base):
T = "0123456789ABCDEF"
quotient, remainder = divmod(num, base)

if quotient == 0:
return T[remainder]
else:
return convert(quotient, base) + T[remainder]


if __name__ == "__main__":
num_10 = 236

print(convert(num_10, 2))
print(convert(num_10, 8))
print(convert(num_10, 16))

print("=================")
print(int(convert(num_10, 2), 2))
print(int(convert(num_10, 8), 8))
print(int(convert(num_10, 16), 16))

  - 실행결과



3. 전체 소스

def convert(num, base):
T = "0123456789ABCDEF"
quotient, remainder = divmod(num, base)

if quotient == 0:
return T[remainder]
else:
return convert(quotient, base) + T[remainder]


if __name__ == "__main__":
num_10 = 236

num_2 = bin(num_10) # 접두어 "0b"가 붙음
num_8 = oct(num_10)
num_16 = hex(num_10)

print("10 -> 2 : ", num_2)
print("10 -> 8 : ", num_8)
print("10 -> 16 : ", num_16)
print("=================")

# int(x, base=10)
print("2 -> 10 : ", int(num_2, 2))
print("8 -> 10 : ", int(num_8, 8))
print("16 -> 10 : ", int(num_16, 16))
print("=================")

print(convert(num_10, 2))
print(convert(num_10, 8))
print(convert(num_10, 16))

print("=================")
print(int(convert(num_10, 2), 2))
print(int(convert(num_10, 8), 8))
print(int(convert(num_10, 16), 16))


'프로그래밍 > Python' 카테고리의 다른 글

10진수 n진수로 변환하기.  (0) 2018.07.30
[Basic] 약수  (0) 2018.06.04

1. 세가지 공통점

 - 문자열을 처리하는 Class


2. String 과 (StringBuffer, StringBuilder)의 차이점

 - 메모리 상에서 처리방식에서 차이점이 있다.

 - String은 immutable(변경불가) 이고, StringBuffer는 mutable이다.


3. StringBuffer, StringBuilder 두개의 차이점

 1) StringBuffer

  - append 메소드

@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}


 2) StringBuilder

  - append 메소드

@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}


4. 결론

 - 단순한 처리일 경우 String 을 사용해도 크게 문제 안됨.

 - multi thread 환경에서는 StringBuffer를 사용하는게 안전하다. 그렇지 않을 경우라면 StringBuilder가 더 빠르다. 아래 소스를 참고하자.

public class StrTest {

public static void main(String[] args) {

strBufferTest();
strBuilderTest();
}

private static void strBufferTest() {
Date start = new Date();
StringBuffer stringBuffer = new StringBuffer();

new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuffer.append(num);
});

}).start();

new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuffer.append(num);
});

}).start();

new Thread(() -> {
Date end = new Date();
long millis = end.getTime() - start.getTime();

try {
Thread.sleep(5000);

System.out.println("StringBuffer length : " + stringBuffer.length());
System.out.println("StringBuffer time(ms) :" + millis);

} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}

private static void strBuilderTest() {
Date start = new Date();
StringBuilder stringBuilder = new StringBuilder();
new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuilder.append(num);
});

}).start();

new Thread(() -> {
IntStream.range(1, 10000).forEach(num -> {
stringBuilder.append(num);
});

}).start();

new Thread(() -> {
Date end = new Date();
long millis = end.getTime() - start.getTime();

try {
Thread.sleep(5000);

System.out.println("StringBuilder length : " + stringBuilder.length());
System.out.println("StringBuilder time(ms) :" + millis);

} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();

}
}

  - 위 소스 결과


 - JDK 1.5버전 부터인지 정확하지는 않지만 String 선언시 문자열을 '+'하는 형태로 작업 할 경우 컴파일시에 StringBuilder로 변경됨.



*참고 페이지

 - https://www.slipp.net/questions/271

 - https://lalwr.blogspot.com/2016/02/string-stringbuffer-stringbuilder.html

https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser?rq=1  에서 본 내용을 간단하게 정리해봄.




결과


'프로그래밍 > Javascript' 카테고리의 다른 글

How to detect browser.  (0) 2018.07.23
IOS 버전 관련 처리  (0) 2018.07.20
[Jquery] .each에서 break, continue 구현하기.  (0) 2018.07.02
How to create dynamic a form!  (0) 2018.06.07
javascript replaceAll 사용하기  (0) 2018.03.08
Timer 구현하기  (0) 2017.01.25

1. IOS Useagent


Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1


2. 하고싶은 것

 - 11.4 버전 이상일 경우를 체크하고 싶다.


 - 소스

function osVersion(){
var mt = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);

if (mt === undefined || mt === null || nt === '') {
return false;
}

var version = [
parseInt(mt[1], 10),
parseInt(mt[2], 10),
parseInt(mt[3] || 0, 10)
];

return parseFloat(version.join('.'))
}

 - 사용법

if (osVersion() > 11.4) {
alert("에러");
}


* IOS 인지 아닌지에 대한 처리는 없습니다. 관련 소스는 추가해서 사용하세요 ^_^

'프로그래밍 > Javascript' 카테고리의 다른 글

How to detect browser.  (0) 2018.07.23
IOS 버전 관련 처리  (0) 2018.07.20
[Jquery] .each에서 break, continue 구현하기.  (0) 2018.07.02
How to create dynamic a form!  (0) 2018.06.07
javascript replaceAll 사용하기  (0) 2018.03.08
Timer 구현하기  (0) 2017.01.25

(작성일 기준으로 1.2.8 버전이 최신버전)


자바(with Spring)를 개발하다보면 Class를 추가/변경 하는 작업을 많이 한다. 그럴때마다 서버를 리스타트하는 일은 엄청나게 번거로운 일이다. 그래서 자동으로 reload 시켜주는 걸 찾아봤다.


1. 설치하기

 - pom.xml

<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>


 - jar 다운로드(이 경우에는 다운로드한 경로를 따로 복사해 놓으세요.)

http://mvnrepository.com/artifact/org.springframework/springloaded/1.2.8.RELEASE


4. Spring Boot

 1) maven 명령어로 실행

spring-boot:run 을 실행시킨다.


 2) vm option 추가

-javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify


  (1) Intelli J 일 경우

 - File -> Setting -> Build, Execution, Deployment -> Compiler

Build project automatically 체크!!




  (2) Eclipse 일 경우

    - 추후 작성


5. Spring Framework + Tomcat

 - 추후 작성


6. Daemon 실행

java -javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify SomeJavaClass


7. 테스트 결과

 1) 전역변수 추가 -> 안됨.

  - 테스트 코드(변경 전)

@RequestMapping(value = "/")
public ResponseEntity<String> test() {
return new ResponseEntity<String>("INDEX", HttpStatus.OK);
}

  - 테스트코드(변경 후)

private String ma = "test222";

@RequestMapping(value = "/")
public ResponseEntity<String> test() {
LOG.info("test : {} ", ma);
return new ResponseEntity<String>("INDEX", HttpStatus.OK);
}


  - 결과


 2) @Controller 추가 -> 안됨.

@Controller
public class Test {
@RequestMapping(value = "/test")
public ResponseEntity<String> test2() {
return new ResponseEntity<String>("INDEX 2", HttpStatus.OK);
}
}

 

 3) @RequestMapping 추가 -> 안됨.

@RequestMapping(value = "/test")
public ResponseEntity<String> test2() {
return new ResponseEntity<String>("INDEX 2", HttpStatus.OK);
}

   - 404가 뜬다.


 4) Class 추가 - 됨!!

  - 테스트 코드

public enum TestCd {
BOOK, NOTE;
}

  - 잘 추가/수정 된다.


 5) 지역변수 -> 됨!

@RequestMapping(value = "/")
public ResponseEntity<String> test() {

String testValue = "test test test";
LOG.info("test : {} ", testValue);

return new ResponseEntity<String>("INDEX", HttpStatus.OK);
}

 - 잘 추가/수정 된다.



관련문서

 - https://github.com/spring-projects/spring-loaded

 - https://andromedarabbit.net/spring-loaded%EC%99%80-gradle%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%ED%95%AB%EC%8A%A4%EC%99%91-%EC%A7%80%EC%9B%90%ED%95%98%EA%B8%B0/

 - http://www.holaxprogramming.com/2015/05/29/spring-boot-and-loaded/





1. 사용기
- 구매할 때 이곳저곳 여러 쇼핑몰을 검색해봤는데, 신세계몰이 조금 저렴해서 거기서 주문함
- 거실 tv가 아닌 개인 모니터에 연결해서 넷플릭스 등을 연결해서 봄
- 화질은 좀 별로지만 편해서 종종 사용하는 중
- 금액대비 쓸만함
- 네이버에서 야구 볼때도 사용함. (Mac에서 크롬사용하여 야구를 켬!!) tving으로 사용할 때도 있음. 화질은 심각함ㅋㅋㅋ


'개인 > Review' 카테고리의 다른 글

chromecast  (0) 2018.07.17
네이버 웨일 리뷰  (0) 2016.12.09
앱코 k935p 무접점 키보드  (0) 2016.10.20

1. X Stream

 - IntStream 은 int를 지정한 범위 내에서 반복문을 동작함

 - LongStream dms Long을 지정한 범위 내에서 반복문을 동작함


2. range, rangeclosed

 - range는 endExclusive 값 전까지만 반복

 - rangeClosed는 endExclusive 를 포함하여 반복


3. IntStream

 - 소스

public class IntRangeTest {

public static void main(String[] args) {
int startNum = 1;
int endNum = 9;

intRangeTest(startNum, endNum);
System.out.println("\n");
intRangeClosedTest(startNum, endNum);

System.out.println("\n");
}

private static void intRangeTest(int startNum, int endNum) {
System.out.print("IntRange Test 1 : ");
IntStream.range(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("IntRange Test 2 : ");
for (int i = startNum; i < endNum; i++) {
System.out.print(i);
}
}

private static void intRangeClosedTest(int startNum, int endNum) {
System.out.print("IntRangeClosed Test 1 : ");
IntStream.rangeClosed(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("IntRangeClosed Test 2 : ");
for (int i = startNum; i <= endNum; i++) {
System.out.print(i);
}
}
}


 - 결과



4. LongStream

 - 소스

public class LongRangeTest {

public static void main(String[] args) {
long startNum = 1L;
long endNum = 9L;

longRangeTest(startNum, endNum);
System.out.println("\n");
longRangeClosedTest(startNum, endNum);

System.out.println("\n");
}

private static void longRangeTest(long startNum, long endNum) {
System.out.print("LongRange Test 1 : ");
LongStream.range(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("LongRange Test 2 : ");
for (long i = startNum; i < endNum; i++) {
System.out.print(i);
}
}

private static void longRangeClosedTest(long startNum, long endNum) {
System.out.print("LongRangeClosed Test 1 : ");
LongStream.rangeClosed(startNum, endNum).forEach(System.out::print);

System.out.println();

System.out.print("LongRangeClosed Test 2 : ");
for (long i = startNum; i <= endNum; i++) {
System.out.print(i);
}
}
}

 

 - 결과

<!-- 리사이즈 변경 불가 -->
<textarea style="resize: none;"></textarea>
<!-- vertical horizontal 둘다 가능 -->
<textarea style="resize: both;"></textarea>
<!-- vertical 둘다 가능 -->
<textarea style="resize: vertical;"></textarea>
<!-- horizontal 둘다 가능 -->
<textarea style="resize: horizontal;"></textarea>


'프로그래밍 > html & css' 카테고리의 다른 글

Bootstrap 사용하기  (0) 2018.08.08
textarea 리사이즈 관련  (0) 2018.07.16
radio, checkbox clear 버튼 만들기.  (0) 2018.04.25
<html lang="ko">  (0) 2018.04.09
html tag(select box, checkbox) Readonly(?)처럼 사용하기  (0) 2018.03.08

업무 중에 엑셀 다운로드 기능에 "암호 걸기"가 필요해짐.


1. pom.xml에 필요한 dependencyt 추가

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>


2. 샘플

 - 아래와 같이 설정해주면 잘 나온다.

EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);
Encryptor encryptor = encryptionInfo.getEncryptor();
encryptor.confirmPassword(password);


 - 결과


3. 전체소스

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

import java.io.*;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;

@Slf4j
public class ExcelTest {

@Test
public void 엑셀파일에_암호걸기() {
final String password = "1234";
final String savePath = "c:\\temp\\excel2.xlsx";

List<String> tmpData = Arrays.asList("Java", "JavaScript", "Python", "GoLang");

try (Workbook wb2 = new XSSFWorkbook();
ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
FileOutputStream fos = new FileOutputStream(savePath);) {

Sheet sheet1 = wb2.createSheet("Sheet1");

//Write Excel File
for (int i = 0; i < tmpData.size(); i++) {
String data = tmpData.get(i);

Row row = sheet1.createRow(i);
Cell cell = row.createCell(0);

cell.setCellValue(data);

}

wb2.write(fileOut);

InputStream filein = new ByteArrayInputStream(fileOut.toByteArray());
OPCPackage opc = OPCPackage.open(filein);

POIFSFileSystem fileSystem = new POIFSFileSystem();

EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);
Encryptor encryptor = encryptionInfo.getEncryptor();
encryptor.confirmPassword(password);

opc.save(encryptor.getDataStream(fileSystem));
fileSystem.writeFilesystem(fos);

log.info("Create Excel File!!");

} catch (IOException e) {
log.error(e.getMessage(), e);

} catch (InvalidFormatException e) {
log.error(e.getMessage(), e);

} catch (GeneralSecurityException e) {
log.error(e.getMessage(), e);
}

}

}


1. History 명령어란?

- 이전에 입력한 명령어 이력을 볼 수 있는 명령어


2. 사용하기

 1) history

- 기본 명령어로 순차적으로 입력했던 명령어 리스트를 보여준다.


history




 2) 최근 N개 검색

- history n

- 최근 입력한 n 개의 명령어 이력을 보여준다.


history 5

- 최근 5개의 명령어를 보여준다.


 3) 이력 중 문자열 검색

- history |grep {검색할 문자열}

- {검색할 문자열}에 대한 명령어만 리스트로 노출된다.


history |grep cd


 4) 기존 이력 삭제

- 기존에 입력했던 명령어 목록 삭제


history -c


 5) 명령어 이력을 파일로 만들기

- 입력된 이력을 특정 파일로 저장


history -w tmp_history.txt


 6) 기존에 입력했던 명령어 재실행

- history 명령어로 출력한 앞에 번호로 명령어 재 실행

- !{이력번호}


!506


 7) 바로 전 입력한 명령어 실행

- !!


!!




3. Tip

 1) 명령어 수행시간 추가

- 명령어 입력 시간 추가


(1) /etc/profile 수정

vi /etc/profile


(2)  아래 내용 추가

#Add Date to .bash_history

HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S : "

export HISTTIMEFORMAT


(3) 적용

source /etc/profile


+ Recent posts