반응형
hostname 호스트명
or
hostnamectl set-hostname 호스트명



반응형
반응형

무료 성능테스트 도구인 Jmeter 설치방법을 공유합니다.


다운로드 URL : http://jmeter.apache.org/download_jmeter.cgi


다운로드 URL로 이동 후에 Binaries에 zip확장자로 된 녀석을 다운로드 받습니다. (윈도우에 설치할 겁니다.)



다운로드 받은 파일의 압축을 풀고 bin 폴더에 가보면 jmeter.bat 파일이 있습니다.

그 파일을 실행합니다.


Java를 인식하지 못해서 실행이 되지 않습니다.



탐색기의 왼쪽에 보면 '내 PC'에 마우스 오른쪽을 누릅니다.

가장 아래 '속성(R)'을 누릅니다.



새로 뜬 창에서 '고급 시스템 설정' 을 선택합니다.


그러면 아래 창이 뜨는데, '고급' 탭을 선택하고 아래쪽에 '환경 변수(N)'을 선택합니다.






환경변수창이 뜨면 아래 이미지 처럼 JAVA_HOME 이 등록되어 있어야 합니다.

없다면 '새로 만들기(N)'을 선택해서 JAVA_HOME을 등록해 줍니다. (그전에 jdk가 미리 깔려 있어야합니다.)


JAVA_HOME 이 등록되었다면 'Path' 를 선택하고 '편집(E)'를 선택합니다.





아래 이미지 처럼 '%JAVA_HOME%\bin' 이 등록되어 있어야 합니다.

없다면 '새로 만들기(N)'을 눌러서 새로 등록합니다.



환결설정 적용 완료 후 jmeter.bat 를 다시 실행해보면 아래처럼 초기화면이 뜹니다.






Jmeter 를 그대로 쓰기에는 성능 테스트 방법이나 결과물이 좀 부실한 부분이 있어서 보통 추가적으로 플러그인을 더 설치해서 사용합니다.


각각의 플러그인을 찾아서 수동으로 설치할 수도 있지만, 플러그인 매니저를 설치해서 매니저를 통해 설치를 진행하도록 하겠습니다.


다운로드 URL : https://jmeter-plugins.org/downloads/all/


다운로드 URL로 접속해서 'plugins-manager.jar'를 다운받습니다.


위 이미지의 녹색 박스에서 설명한 것처럼 다운로드한 파일을 jmeter홈의 lib/ext 에 복사하고 JMeter를 재실행합니다.




그러면, 아래 이미지처럼 Options 메뉴 가장 하단에 Plugins Manager가 생성됩니다.





Plugins Manager를  선택하면 아래창이 뜹니다.

첫번째 탭에 현재 설치되어있는 플러그인들이 보입니다.


두번째 탭에는 설치 가능한 플러그인을 보여줍니다.

여기서 왼쪽에 보면 텍스트로 검색할 수 있도록 입력박스가 있습니다.

'Stan' 이라고 입력해서 'jpgc - Standard Set' 플러그인을 검색합니다.

검색되면 하단의 'Apply Changes and Restart JMeter'를 선택해서 플러그인을 설치합니다.





설치가 완료된 후에 다시 첫번째탭에서 확인해보면 'jpgc - Standard Set' 플러그인이 추가된 것을 확인할 수 있습니다.



실제 활용법은 다음에 공유하도록 하겠습니다.

반응형
반응형

2018/08/06 - [java] - gc overhead limit exceeded excel download 엑셀 대용량 쓰기


~*~*!! 위 글의 코드를 이용하세요!!.

--------------


poi 라이브러리를 이용해 엑셀 파일을 만드는 방법을 공유합니다.


먼저 라이브러리 입니다. 메이븐 기준으로 아래와 같이 지정해주시면 됩니다.


    <!-- poi -->
    <!-- xls -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.14</version>
    </dependency>
    <!-- xlsx -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.14</version>
    </dependency>
cs


엑셀 파일이 작성된 결과를 먼저 보여드립니다.

일반적으로 많이 쓰이는 테이블 형태로 병합하는 부분까지 추가해보았습니다.

그리고 헤더 부분은 배경색 및 글씨 굵기가 볼드처리 되어있습니다.




위 엑셀의 화면을 구성하기 위한 코드입니다.

정말 간단합니다. 주석 이외에 설명은 별도로 하지않겠습니다. 


  public static void main(String[] args) throws FileNotFoundException, IOException {
    ExcelUtil excel = new ExcelUtil("sheet 이름");
 
    // 시작 위치
    excel.setOffset(11);
 
    // 헤더
    excel.addRow("f8f8f8", Font.BOLDWEIGHT_BOLD, Arrays.asList("DATE""TOTAL Contacts""Browser"""""""));
    // 헤더
    excel.addRow("f8f8f8", Font.BOLDWEIGHT_BOLD, Arrays.asList("DATE""TOTAL Contacts""Chrome""Safari""IE""기타"));
 
    // 내용
    excel.addRow(Arrays.asList("2018-01-01""15""1""2""0""12"));
    excel.addRow(Arrays.asList("2018-01-02""30""16""2""0""12"));
 
    // 병합  merge(firstCol, firstRow, lastCol, lastRow)
    excel.merge(1112);// DATE
    excel.merge(2122);// TOTAL Contacts
    excel.merge(3161);// Browser
    
    File file = new File("/test/파일명.xlsx");
    excel.write(new FileOutputStream(file));
  }




ExcelUtil 전체 소스입니다. 엑셀을 읽거나 그래프를 그릴 수 있는 기능도 포함하고 있습니다.


 
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.AttributedString;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
 
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.ShapeTypes;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
public class ExcelUtil {
  private XSSFSheet sheet;
  private int rowIndex = 0;
  private int maxCols = 0;
  private XSSFWorkbook workbook;
  private int offsetCol = 0;
 
  public ExcelUtil(String sheetName) {
    workbook = new XSSFWorkbook();
    sheet = workbook.createSheet(sheetName);
  }
 
  public void setOffset(int col, int row) {
    offsetCol = col;
    rowIndex = row;
  }
 
  public void addRow(List<String> rows) {
    addRow(null, (short0, rows);
  }
 
  public void addRow(String backgroundColor, List<String> rows) {
    addRow(backgroundColor, (short0, rows);
  }
 
  public int getRowIndex() {
    return rowIndex;
  }
 
  public void setCellWidth(int cellnum, int width) {
    sheet.setColumnWidth(cellnum, width);
  }
 
  public void setCell(int cellnum, int rownum, XSSFCellStyle cellStyle, String cellValue) {
    XSSFRow row = sheet.getRow(rownum);
    if (row == null) {
      row = sheet.createRow(rownum);
    }
 
    XSSFCell cell = row.getCell(cellnum);
    if (cell == null) {
      cell = row.createCell(cellnum, XSSFCell.CELL_TYPE_STRING);
    }
    cell.setCellStyle(cellStyle);
    cell.setCellValue(cellValue);
  }
 
  public void addRow(String backgroundColor, short boldweight, List<String> cellStrings) {
    XSSFRow header = sheet.createRow(rowIndex++);
    int cellIndex = offsetCol;
    for (String value : cellStrings) {
      XSSFCell cell = header.createCell(cellIndex++, XSSFCell.CELL_TYPE_STRING);
      cell.setCellValue(value);
      cell.setCellStyle(createCellStyle(backgroundColor, boldweight));
    }
    if (maxCols < cellIndex) {
      maxCols = cellIndex;
    }
  }
 
  public void addRow(List<Map<StringString>> style, List<String> cellStrings) {
    XSSFRow header = sheet.createRow(rowIndex++);
    int cellIndex = offsetCol;
    for (String value : cellStrings) {
      int index = cellIndex - offsetCol;
      XSSFCell cell = header.createCell(cellIndex++, XSSFCell.CELL_TYPE_STRING);
      cell.setCellValue(value);
      String backgroundColor = null;
      short boldweight = 0;
      if (style.size() > index) {
        Map<StringString> styleMap = style.get(index);
        backgroundColor = styleMap.get("backgroundColor");
        if (styleMap.containsKey("boldweight")) {
          boldweight = Short.parseShort(styleMap.get("boldweight"));
        }
      }
      cell.setCellStyle(createCellStyle(backgroundColor, boldweight));
    }
    if (maxCols < cellIndex) {
      maxCols = cellIndex;
    }
  }
 
  public XSSFCellStyle createCellStyle(String backgroundColor, short boldweight) {
    XSSFCellStyle cellStyle = sheet.getWorkbook().createCellStyle();
    cellStyle.setAlignment(HorizontalAlignment.CENTER);
    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    if (backgroundColor != null) {
      cellStyle.setFillForegroundColor(new XSSFColor(hexToByteArray(backgroundColor)));
      cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
    }
    setSolidBorder(cellStyle);
 
    if (boldweight != 0) {
      Font headerFont = this.sheet.getWorkbook().createFont();
      headerFont.setBoldweight(boldweight);
      cellStyle.setFont(headerFont);
    }
    return cellStyle;
  }
 
  public void setFontHeight(int cellnum, int rownum, int height) {
    sheet.getRow(rownum).getCell(cellnum).getCellStyle().getFont().setFontHeight(height);
  }
 
  public void setCellAlignment(int cellnum, int rownum, HorizontalAlignment align) {
    sheet.getRow(rownum).getCell(cellnum).getCellStyle().setAlignment(align);
  }
 
  public void setCellWrapText(int cellnum, int rownum, boolean b) {
    XSSFRow row = sheet.getRow(rownum);
    XSSFCellStyle rowStyle = row.getRowStyle();
    if (rowStyle == null) {
      XSSFCellStyle cellStyle = sheet.getWorkbook().createCellStyle();
      cellStyle.setWrapText(b);
      row.setRowStyle(cellStyle);
    } else {
      rowStyle.setWrapText(b);
    }
    row.getCell(cellnum).getCellStyle().setWrapText(b);
  }
 
  // hex to byte[]
  public byte[] hexToByteArray(String hex) {
    if (hex == null || hex.length() == 0) {
      return null;
    }
 
    byte[] ba = new byte[hex.length() / 2];
    for (int i = 0; i < ba.length; i++) {
      ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
    }
    return ba;
  }
 
  public void setSolidBorder(XSSFCellStyle cellStyle) {
    cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
    cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
    cellStyle.setBorderTop(CellStyle.BORDER_THIN);
    cellStyle.setBorderRight(CellStyle.BORDER_THIN);
    cellStyle.setBorderLeft(CellStyle.BORDER_THIN);
  }
 
  public void write(OutputStream outputStream) throws IOException {
    // adjust column width to fit the content
    for (int i = 0; i < maxCols; i++) {
      sheet.autoSizeColumn(i);
      sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 1500);
    }
    for (int i = 0; i < offsetCol; i++) {
      setCellWidth(i, 900);
    }
    this.sheet.getWorkbook().write(outputStream);
    this.workbook.close();
  }
 
  public void merge(int firstCol, int firstRow, int lastCol, int lastRow) {
    // 셀 병합
    sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); // 병합
  }
 
  public void drawRect(int rownum, int scolnum, int ecolnum, int dx1, int dx2) {
    XSSFDrawing patriarch = sheet.createDrawingPatriarch();
    XSSFClientAnchor a = new XSSFClientAnchor();
    a.setCol1(scolnum);
    a.setRow1(rownum);
    a.setDx1(pxToEmu(dx1));
    a.setDy1(pxToEmu(5));
    a.setDx2(pxToEmu(dx2));
    a.setDy2(pxToEmu(-5));
    a.setRow2(rownum + 1);
    a.setCol2(ecolnum);
 
    XSSFSimpleShape shape1 = patriarch.createSimpleShape(a);
    shape1.setShapeType(ShapeTypes.RECT);
    int red = 0, green = 0, blue = 0;
    red = Integer.parseInt("f0"16);
    green = Integer.parseInt("ad"16);
    blue = Integer.parseInt("4e"16);
    shape1.setLineStyleColor(red, green, blue);
    shape1.setFillColor(red, green, blue);
  }
 
  public static int pxToEmu(int px) {
    return (int) Math.round(((double) px) * 72 * 20 * 635 / 96); // assume
                                                                 // 96dpi
  }
 
  public static int emuToPx(int emu) {
    return (int) Math.round(((double) emu) * 96 / 72 / 20 / 635); // assume
                                                                  // 96dpi
  }
 
  public float getDefaultRowHeightInPoints() {
    return this.sheet.getDefaultRowHeightInPoints();
  }
 
  public void setRowHeightInPoints(int rownum, float height) {
    sheet.getRow(rownum).setHeightInPoints(height);
  }
 
  public float getRowHeightInPoints(int rownum) {
    return sheet.getRow(rownum).getHeightInPoints();
  }
 
  /**
   * ROW 높이 자동 조절
   * 
   * @param rownum
   * @param cellValue
   */
  public void setAutoRowFit(int cellnum, int rownum) {
    XSSFRow row = sheet.getRow(rownum);
    XSSFCell cell = row.getCell(cellnum);
    XSSFFont cellFont = cell.getCellStyle().getFont();
    int fontStyle = java.awt.Font.PLAIN;
    if (cellFont.getBold())
      fontStyle = java.awt.Font.BOLD;
    if (cellFont.getItalic())
      fontStyle = java.awt.Font.ITALIC;
 
    java.awt.Font currFont = new java.awt.Font(cellFont.getFontName(), fontStyle, cellFont.getFontHeightInPoints());
 
    String cellText = cell.getStringCellValue();
    AttributedString attrStr = new AttributedString(cellText);
    attrStr.addAttribute(TextAttribute.FONT, currFont);
 
    // Use LineBreakMeasurer to count number of lines needed for the text
    //
    FontRenderContext frc = new FontRenderContext(nulltruetrue);
    LineBreakMeasurer measurer = new LineBreakMeasurer(attrStr.getIterator(), frc);
    int nextPos = 0;
    int lineCnt = 1;
    float columnWidthInPx = sheet.getColumnWidthInPixels(cellnum);
    while (measurer.getPosition() < cellText.length()) {
      nextPos = measurer.nextOffset(columnWidthInPx);
      lineCnt++;
      measurer.setPosition(nextPos);
    }
    int fromIndex = -1;
    while ((fromIndex = cellText.indexOf("\n", fromIndex + 1)) >= 0) {
      lineCnt++;
    }
    if (lineCnt > 1) {
      row.setHeightInPoints(
          sheet.getDefaultRowHeightInPoints() * lineCnt * /* fudge factor */ 1.1f);
    }
  }
 
  public static List<List<String>> readExcel(File file) throws IOException, InvalidFormatException {
    return readExcel(new FileInputStream(file), file.getName(), 0);
  }
 
  public static List<List<String>> readExcel(File file, int sheetAt) throws IOException, InvalidFormatException {
    return readExcel(new FileInputStream(file), file.getName(), sheetAt);
  }
 
  public static List<List<String>> readExcel(InputStream is) throws IOException, InvalidFormatException {
    return readExcel(is, "xlsx"0);
  }
 
  private static Workbook getWorkbook(InputStream inputStream, String fileName) throws IOException {
    Workbook workbook = null;
 
    if (fileName.endsWith("xlsx")) {
      workbook = new XSSFWorkbook(inputStream);
    } else if (fileName.endsWith("xls")) {
      workbook = new HSSFWorkbook(inputStream);
    } else {
      throw new IllegalArgumentException("The specified file is not Excel file");
    }
 
    return workbook;
  }
 
  public static List<List<String>> readExcel(InputStream is, String fileName, int sheetAt)
      throws IOException, InvalidFormatException {
    List<List<String>> resultList = new ArrayList<>();
    // 파일을 읽기위해 엑셀파일을 가져온다
    Workbook workbook = getWorkbook(is, fileName);
    int rowindex = 0;
    int columnindex = 0;
    // 시트 수 (첫번째에만 존재하므로 0을 준다)
    // 만약 각 시트를 읽기위해서는 FOR문을 한번더 돌려준다
    Sheet sheet = workbook.getSheetAt(sheetAt);
    // 행의 수
    int rows = sheet.getPhysicalNumberOfRows();
    for (rowindex = 0; rowindex < rows; rowindex++) {
      // 행을 읽는다
      Row row = sheet.getRow(rowindex);
      resultList.add(new ArrayList<String>());
      if (row != null) {
        // 셀의 수
        int cells = row.getPhysicalNumberOfCells();
        for (columnindex = 0; columnindex <= cells; columnindex++) {
          // 셀값을 읽는다
          Cell cell = row.getCell(columnindex);
          String value = "";
          // 셀이 빈값일경우를 위한 널체크
          if (rowindex == 0 && cell == null) {
            continue;
          }
          if (cell != null) {
            // 타입별로 내용 읽기
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_FORMULA:
              value = cell.getCellFormula();
              break;
            case Cell.CELL_TYPE_NUMERIC:
              value = String.format("%1$,.0f", cell.getNumericCellValue());
              break;
            case Cell.CELL_TYPE_STRING:
              value = cell.getStringCellValue() + "";
              break;
            case Cell.CELL_TYPE_BLANK:
              value = cell.getBooleanCellValue() + "";
              break;
            case Cell.CELL_TYPE_ERROR:
              value = cell.getErrorCellValue() + "";
              break;
            }
          }
          if ("false".equals(value)) {
            value = "";
          }
          resultList.get(rowindex).add(value);
        }
      }
    }
    workbook.close();
    return resultList;
  }
}
cs


반응형
반응형

Internet Explorer 인터넷 익스플로러 줄여서 IE라고 불리우는 이 브라우저의 USER AGENT가 11버전에서만 다르게 표시되어서 접속 브라우저 통계를 잡는데 문제가 있습니다.


구글링을 해본결과 정확한 구분방법은 아직없고 그나마 현재로서 가장 간단해 보이는 방법을 공유합니다.


IE11 에서 User Agent를 찍어보면 다음과 같이 나옵니다.



 Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko




IE10 까지는 항상 있어왔던 MSIE 단어가 사라져버렸습니다. (MS 맘에 안들어 ㅜㅠ)



어쩔수 없이 rv:11.0 이라는 단어를 기준으로 MSIE를 같이 구분하고 있습니다. 하지만 이 단어로 IE11을 구분하는건 전혀 개런티 할 수 없습니다. 이런 방법도 있다는 것만 참고하시면 됩니다.



아래 java 코드를 참조하세요.


    public static String getBrowser(HttpServletRequest request) {
        String header = request.getHeader("User-Agent");
        if (header == null) {
            return "기타";
        } else if (header.indexOf("MSIE"> -1 || header.indexOf("rv:11.0"> -1) {
            return "MSIE";
        } else if (header.indexOf("Chrome"> -1) {
            return "Chrome";
        } else if (header.indexOf("Firefox"> -1) {
            return "Firefox";
        } else if (header.indexOf("Safari"> -1) {
            return "Safari";
        } else {
            return "기타";
        }
    }



반응형
반응형

DB2에서 테이블 수정 후 DML 쿼리를 사용하면 아래 오류가 발생한다.


DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016, SQLERRMC=7; 



해결법으로는 아래 두 쿼리를 실행한다.


REORG TABLE [TABLE_NAME];
 
call ADMIN_CMD('REORG TABLE [TABLE_NAME]');



반응형

'Database' 카테고리의 다른 글

mysql create database  (0) 2018.03.09
db2 character set 확인  (0) 2018.02.13
db2 - SQL1025N The database manager was not stopped because databases are still active.  (0) 2018.02.13
db2 drop database  (0) 2018.02.13
db2 window client 설치  (3) 2018.01.24
db2 substring  (0) 2018.01.11
DB2 LIKE 검색  (0) 2018.01.07
DB2 date format  (0) 2018.01.07
반응형

윈도우에서 Orange For DB2를 사용하려면 DB2 Client가 설치되어 있어야합니다.


DB2 클라이언트 설치 과정을 공유합니다. (IBM 사이트 구려)


http://www-01.ibm.com/support/docview.wss?uid=swg27007053


위 URL 접속하면 아래 화면이 보이는데 원하는 버전을 선택합니다.





링크를 타고 이동하면 아래 화면이 보이는데 여러 OS환경 중에 자신에게 맞는 것을 선택합니다.

+ 표시를 누르면 상세링크가 아래처럼 보이게되는데 그중에 'IBM Data Server Client'를 선택합니다.




IBM Data Server Client를 선택하면 아래와 같은 화면이 나옵니다.

체크박스에 체크 후 '계속' 버튼을 선택합니다.



IBM 로그인이 필요합니다.



IBM 전용 다운로드 프로그램을 설치해서 다운 받거나

브라우저 자체에서 바로 다운 받을 수 있는데 저는 그냥 바로 다운받기를 선택했습니다.


아래 빨간 박스의 영역을 선택하면 다운로드가 시작됩니다.


다운로드 완료 후 exe파일을 실행하면 아래처럼 압축을 푸는 WinZip이 실행됩니다. 원하는 위치를 선택하고 Unzip 을 선택합니다.





압축이 풀린 폴더에 가보면 아래와 같은 파일목록이 보이는데 setup.exe를 실행합니다.


setup.exe를 실행하면 지금 부터는 GUI 로 좀 편하게 진행할 수 있습니다.




왼쪽 메뉴의 '제품 설치'를 선택합니다. 그리고 '새로 설치' 를 선택합니다.



지금 부터는 모두 기본 값으로 설정하겠습니다.

'다음' '다음' 신공으로 모두 넘어 갑니다.



라이센스 정보에 승인합니다.


별 신경쓰지 않고 넘어가셔도 됩니다.

필요할 때 관리자 권한 팝업이 뜨는데 그때 허용하면 됩니다.


'완료'를 선택합니다.


드디어 설치가 시작되었습니다.


DB2가 모두 설치되고 나서 Orange For DB2 를 다시 실행해보면 잘 동작합니다.

반응형

'Database' 카테고리의 다른 글

db2 character set 확인  (0) 2018.02.13
db2 - SQL1025N The database manager was not stopped because databases are still active.  (0) 2018.02.13
db2 drop database  (0) 2018.02.13
DB2 : SQLCODE=-668, SQLSTATE=57016  (0) 2018.01.25
db2 substring  (0) 2018.01.11
DB2 LIKE 검색  (0) 2018.01.07
DB2 date format  (0) 2018.01.07
DB2 SYSDATE NOW  (0) 2018.01.07
반응형

아래 스크립트를 myfirewall.sh 로 저장하고 정책이 변경될 때마다 파일을 수정하고 다시 실행해줍니다.


#!/bin/bash
 
# 모두 삭제
iptables -F
 
# 기본 정책을 설정합니다
# 들어오는 것은 기본으로 모두 막습니다.
iptables -P INPUT DROP
iptables -P FORWARD DROP
# 나가는 것에 대해서는 기본으로 모두 허용합니다.
iptables -P OUTPUT ACCEPT
# wget
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# localhost
iptables -A INPUT -i lo -j ACCEPT
# DNS
iptables -I INPUT -p udp --sport 53 -j ACCEPT
iptables -I INPUT -p tcp --sport 53 -j ACCEPT
 
# ----------------------------------------------------------
# 전체 허용
 
# HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
 
 
# ----------------------------------------------------------
# 그룹A
 
# SSH
iptables -A INPUT -p tcp -123.456.789.012 --dport 22 -j ACCEPT
# WEB
iptables -A INPUT -p tcp -123.456.789.012 --dport 80 -j ACCEPT
 
 
 
# ---------------------------------------------------------------
# 그룹B
 
GROUP_B=222.333.4.5
# SSH
iptables -A INPUT -p tcp -s $GROUP_B --dport 22 -j ACCEPT
# manager 포트
iptables -A INPUT -p tcp -s $GROUP_B --dport 8991 -j ACCEPT
 
 
# 설정을 저장
/sbin/service iptables save
 
# 설정한 내용을 출력
iptables --v
 



반응형
반응형

스프링부트를 이용하면 보통 application.properties 에 jdbc 설정을 포함시켜서 사용합니다.

하지만 Multiple datasource를 이용하거나 별도로 파일로 관리를 하고 싶은 경우에 분리하는 방법을 공유합니다.


우선, application.properties에는 아래 처럼 공통 설정과 jdbc를 설정할 classpath를 설정해줍니다. (저는 classpath root 여서 별도 경로가 없습니다.)


application.properties

#Database Configuration
jdbc.config=jdbc.properties



jdbc.config에서 지정한 파일에서 기존에 application.properties에서 했던 설정을 합니다.


jdbc.properties

#Database Configuration
spring.datasource.driverClassName=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.initialize=false
spring.datasource.continueOnError=true
spring.datasource.max-active=10
spring.datasource.max-idle=10
spring.datasource.min-idle=1
spring.datasource.max-wait=-1
spring.datasource.initial-size=1
spring.datasource.test-on-borrow=true
spring.datasource.test-while-idle=true
spring.datasource.validation-query=
#5 minutes
spring.datasource.time-between-eviction-runs-millis=300000
 


스프링부트의 메인 클래스에서 다음과 같이 @PropertySource 를 지정하면 끝입니다.


MainApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
 
@SpringBootApplication
@PropertySource(value = { "classpath:${jdbc.config}" })
public class MainApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(MainApplication.class, args);
  }
}




반응형
반응형

서비스를 개발하다보면 전화번호를 다룰때가 많습니다.

집전화나 휴대폰전화 형식이 조금씩 다르고 사용자가 임의로 입력하게되면 그 형식이 또 다를수 있습니다.

그래서 보통 DB에 저장시에는 숫자만 저장하고 보여줄 때 형식에 맞게 보여줍니다.


그 형식에 맞게 보여주는 코드를 공유해봅니다.


public class FormatUtil {
 
  public static String phone(String src) {
    if (src == null) {
      return "";
    }
    if (src.length() == 8) {
      return src.replaceFirst("^([0-9]{4})([0-9]{4})$""$1-$2");
    } else if (src.length() == 12) {
      return src.replaceFirst("(^[0-9]{4})([0-9]{4})([0-9]{4})$""$1-$2-$3");
    }
    return src.replaceFirst("(^02|[0-9]{3})([0-9]{3,4})([0-9]{4})$""$1-$2-$3");
  }
 
  public static void main(String[] args) {
    System.out.println(FormatUtil.phone("01012341234"));
    System.out.println(FormatUtil.phone("0212341234"));
    System.out.println(FormatUtil.phone("03212341234"));
    System.out.println(FormatUtil.phone("0621231234"));
    System.out.println(FormatUtil.phone("0163451234"));
    System.out.println(FormatUtil.phone("#012"));
    System.out.println(FormatUtil.phone("15881588"));
    System.out.println(FormatUtil.phone("050612341234"));
  }
}




결과


010-1234-1234
02-1234-1234
032-1234-1234
062-123-1234
016-345-1234
#012
1588-1588
0506-1234-1234




정확한 스펙에 맞게하고 싶은분은 여기를 참조하셔서 직접 구현하셔도 됩니다.


링크 : 대한민국의 전화번호 체계

반응형
반응형
이클립스 사용자를 위해 서브라임 텍스트인텔리J(intelliJ)(안드로이드 스튜디오) 단축키를 틈틈이 정리하고 있습니다.

 

명령 이클립스  IntelliJ / 인텔리J
안드로이드 스튜디오 / Anroid Studio
라인 지우기 Ctrl + D  Ctrl + Y 
라인 복사 Ctrl + Alt + 위.아래 화살표  Ctrl + D
라인 상하 이동 Alt + 위.아래 화살표 Alt + Shift + 위.아래 화살표
라인 번호로 이동하기 Ctrl + L Ctrl + G
다음 찾기 Ctrl + K Ctrl + F3 이후 F3, Shift + 3
관련 클래서 자동 Import Ctrl + Shift + O
Ctrl + Alt + O
(아래 설정후 사용가능)
File –>> Settings –>> Editor –>> General –>> Auto Import 에서 아래 두개 체크 활성화
- Add unambiguous imports on the fly
- Optimize imports on the fly(fou current project)
코드 자동 정렬 Ctrl + Shift + F Ctrl + Alt + L
모든 것을 검색 Ctrl + Shift + L 
(Quick Search Plugin)
Ctrl + Shift + F
Rename F2 Shift + F6
변수이름변경 Alt + Shift + R Shift + F6
창 닫기 Ctrl + W Ctrl + F4
창 크게 Ctrl + M Ctrl + Shift + F12
마지막 수정한 곳으로 이동 Ctrl + Q Ctrl + Shift + Backspace
뒤로가기 Alt + Left Ctrl + Alt + Left
변수로 뽑아내기 Alt + Shift + L Ctrl + Alt + V
사용되는 곳 찾기 Ctrl + Alt + H Alt + F7
파일 열기 Ctrl + Shift + R Ctrl + Alt + Shift + N
다음 에러로 이동 Ctrl + > F2
이전 에러로 이동
Ctrl + < Shift + F2

 

반응형

'Tool' 카테고리의 다른 글

svn: E160013, svn: E170000  (0) 2018.04.06
expected key exchange group packet from server  (0) 2018.03.12
VMWare 무료버전 설치하기 (윈도우 2018.02.15)  (0) 2018.02.15
jmeter install 설치  (0) 2018.01.29
Git client for Window 설치  (0) 2018.01.12
jenkins - ssh를 이용해 배포하기  (3) 2018.01.09
windows 10 telnet client  (0) 2017.12.22
엑셀 수식 안될때  (0) 2017.11.14

+ Recent posts