달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'Dev Language'에 해당되는 글 71건

  1. 2023.05.02 타 도메인간 IFRMAE 스크립트 호출
  2. 2023.04.21 Java PKIX path building failed/Unable to find valid certification path to requested target
  3. 2020.04.09 자바에서 ltrim과 rtrim 구현하기(1줄로 간단하게)
  4. 2020.04.09 웹에서 앱 설치 여부를 확인하자
  5. 2020.02.19 C# 디컴파일 프로그램
  6. 2019.09.17 PHP Client Ip 얻기
  7. 2019.09.17 JAVA Client IP 얻기
  8. 2019.02.28 Object 프로퍼티스 확인
  9. 2018.11.26 자바 엑셀 내리기 BigGrid 10만 라인 약 2초
  10. 2018.11.16 JAVA 바코드 생성
  11. 2018.10.11 JAVA AES128 암호화 복호화 소스
  12. 2018.10.11 C# AES128 암호화 복호화 소스
  13. 2017.07.13 숫자형식 포멧 방법
  14. 2017.03.30 AES, SHA 암호화 3, C#
  15. 2017.03.30 AES, SHA 암호화 1, JAVA
  16. 2016.10.05 웹소스 FTP 파일 압축하기
  17. 2016.10.05 외부에서 호스팅업체 MYSQL 접근하기(+ DLL 포함 컴파일)
  18. 2016.07.13 Reverse Eng(리버싱을 위한 툴)
  19. 2016.07.12 PHP 네이버블로그 원격 글쓰기 API 소스
  20. 2016.06.16 ResultSet을 컬렉션으로 반환
  21. 2016.04.27 달력 JQuery DatePicker
  22. 2016.04.20 AB 파일 압축풀기 2
  23. 2016.03.25 정규식(혹은 정규표현식)에 대한 문서들 정리
  24. 2016.03.25 정규표현식(Regular Expression)을 소개합니다
  25. 2016.03.25 input 태그에 숫자만을 입력할 수 있도록 하기
  26. 2016.03.16 PHP 만나이 계산하기
  27. 2016.02.15 엘리먼트 x,y 위치값 가져오기
  28. 2016.02.12 Eclipse 성능개선 최적화
  29. 2016.02.12 Log4j 로 쿼리 로그 깔금 하게 보기
  30. 2015.12.31 윈도우 플랫폼 체크


■ 부모 기본 onload 설정
window.onload = function(){
        window.addEventListener('message', function(e) {
            console.log("parent message");
            console.log(e.data);
            console.log("e.origin : " +e.origin);
            
            if(e.data.childData === ' test data'){
                alert("iframe in data");
            }
        });
        
    }

■ 부모에서 iframe 메세지 전송
  var iframe = document.getElementById('child_iframe').contentWindow;
    iframe.postMessage({parentData : 'test parent data'}, "*");
        


■ 자식 기본 onload 설정
window.onload = function(){
        window.addEventListener('message', function(e) {
            console.log("child message");
            console.log(e.data);
            console.log("e.origin : " +e.origin);
            
            if(e.data.parentData === ' test parent data'){
                alert("parent in data");
            }
        });        
        
    }


■ 자식 iframe 에서 부모창으로 메세지 전송
  var iframe = document.getElementById('child_iframe').contentWindow;
    iframe.postMessage({parentData : 'test parent data'}, "*");
        
window.parent.postMessage({childData : 'test data'}, "*");
        

Posted by 타카스 류지
|

Unable to find valid certification path to requested target
Java PKIX path building failed

 

아래 처럼 크롬 브라우저로 해당 등록할 사이트 인증서를 내보내기로 저장한다.

사용하는 JDK 폴더의 BIN 폴더에 들어가 CMD 명령어로 아래 내용을 작성

 

keytool -importcert -file "c:\등록할사이트인증서.crt" -keystore C:\Java\jdk1.8.0_361\jre\lib\security\cacerts -storepass changeit -noprompt

 

끝!

Posted by 타카스 류지
|

자바에서 ltrim과 rtrim을 구현하려면

정규식을 사용하면 된다.(딱 1줄로 구현할 수 있다!)


소스는 다음과 같다.


String result = s.replaceAll("^\\s+",""); // ltrim
 예제
String result = s.replaceAll("\\s+$",""); // rtrim 예제


출처: https://nine01223.tistory.com/261 [스프링연구소(spring-lab)]

Posted by 타카스 류지
|

Web 에서 앱 설치 여부를 확인 하자

1. 내용

  • 인터벌 함수를 이용해서 hidden 을 계속 확인한다.
  • 타임아웃 함수를 이용해서 특정시간이 되면 앱이 설치 안되어있다고 판단한다.

2. 문제

  • 단순참고용 정도로 사용하면 좋을거 같습니다.
  • 많이 테스트 안해보았습니다.
  • document.webkitHidden || document.hidden 를 이용해서 설치 여부를 확인 하는 방법 입니다.
  • 크롬에서 지원하는 intent 방식을 사용하면 항상 마켓이 실행되서 체크하기 어려우니 꼭 커스텀 스킴으로 테스트 해야 합니다.

3. 코드

var appSchem = 'mayapp://launch?Data=abcdefg';


isMyApp();

location.href = appSchem;

function isMyApp() {
    function clearTimers() {
        clearInterval(heartbeat);
        clearTimeout(timer);
    }

    function intervalHeartbeat() {
        if (document.webkitHidden || document.hidden) {
            clearTimers();
            console.log('앱이 설치 되어 있습니다.');
        }
    }
    heartbeat = setInterval(intervalHeartbeat, 200);
    var deLay = 1000;
    timer = setTimeout(function() {
        console.log('앱이 없습니다.');
    }, deLay);
  }
}

 

출처 : https://pyeongho.github.io/app_check

Posted by 타카스 류지
|

1)  .Net Reflector (유료)

 

https://www.red-gate.com/products/dotnet-development/reflector/

 

 

2)  dotPeek(JetBrains)  (무료)

 

https://www.jetbrains.com/ko-kr/decompiler/download/download-thanks.html?platform=windowsWeb

 

3)  ILSpy (무료)

ILSpy_binaries_5.0.2.5153.zip
3.55MB

 

 

 

Posted by 타카스 류지
|

function get_userip() { 

        $first_ip = getenv(REMOTE_ADDR);
        $second_ip = getenv(HTTP_X_FORWARDED_FOR); // 방화벽 + 사설아이피 
        $third_ip = getenv(HTTP_CLIENT_IP); // 방화벽 + 공인아이피 

        if (!$second_ip && !$third_ip) { 
                return $first_ip; 
        } else { 
                if($second_ip){ 
                        return "$first_ip/$second_ip"; 
                } else { 
                        return "$first_ip/$third_ip"; 
                
        

Posted by 타카스 류지
|

String ip = request.getHeader("X-Forwarded-For");

 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

     ip = request.getHeader("Proxy-Client-IP"); 

 } 

 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

     ip = request.getHeader("WL-Proxy-Client-IP"); 

 } 

 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

     ip = request.getHeader("HTTP_CLIENT_IP"); 

 } 

 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

     ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 

 } 

 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

     ip = request.getRemoteAddr(); 

 }

 

 

출처 : https://www.lesstif.com/pages/viewpage.action?pageId=20775886

Posted by 타카스 류지
|

alert(   Object.getOwnPropertyNames(오브젝트 변수)   ) ;

console.log(   Object.getOwnPropertyNames(오브젝트 변수)   ) ;

Posted by 타카스 류지
|

시트 하나당 10만라인 그리는고 저장하는데 약 10초 나옴~


아래껀 원본....

BigGridDemo.java


이건 멀티 시트 추가할수 있게 카피하여 부분 수정함

BigGridMultiDemo.java



혹시나 해서 JAR 라이브러리 파일들이 필요할까 하여


프로젝트로 하나 만들어 파일들 다 넣어둠 0-0


Excel_Big.zip



방식은 poi 는 구조만 만들고 실제 데이터는


xml 파일로 텍스트 형식으로떨군후 합치기


정말 빠름빠름~

'Dev Language > JAVA' 카테고리의 다른 글

자바에서 ltrim과 rtrim 구현하기(1줄로 간단하게)  (0) 2020.04.09
JAVA Client IP 얻기  (0) 2019.09.17
JAVA 바코드 생성  (0) 2018.11.16
JAVA AES128 암호화 복호화 소스  (0) 2018.10.11
숫자형식 포멧 방법  (0) 2017.07.13
Posted by 타카스 류지
|


안녕하세요.


일하면서 바코드 관련 개발을 하게 되어 다음에도 쓸수 있게 정리하여 올립니다.


다만 정리는 제 기준으로 케이스별 로 만들었기 때문에


필요하신건 파일안에 주석이 있으니 수정하여 활용하시면 될것 같습니다.



Barbecue 오픈 API

http://barbecue.sourceforge.net



barbecue-1.5-beta1.zip




1. 바코드 지원 Format


Code128, Code128A, Code128B, Code128C, UCC128, EAN128, EAN13, Bookland, UPC-A, Standard 2 of 5, Interleave 2 of 5, PDF417, Code 39, Codabar, PostNet


2. 바코드 저장 Format


PNG, JPEG, GIF, SVG, and EPS




※  일반 적 파일로 저장


▶ 바코드 파일 생성 - barcode.saveBarcodeImage(텍스트, 경로);


barcode.saveBarcodeImage("10000000", "c:/");




▶ 바코드 파일 생성(배경 투명 처리) - barcode.saveBarcodeImage(텍스트 , 경로, 투명 유무);


barcode.saveBarcodeImage("20000000", "c:/", true);




▶ 바코드 파일 생성(확장자 지정 png, jpeg , gif) - barcode.saveBarcodeImage(텍스트, 경로, 확장자);


barcode.saveBarcodeImage("30000000", "c:/", "png");




▶ 바코드 파일 생성(사이즈 변경) - barcode.saveBarcodeImage(텍스트, 경로, 바코드넓이, 바코드높이);


barcode.saveBarcodeImage("40000000", "c:/", 1,30);






※ base64 이미지로 활용하여 파일로 저장하여 사용하지 않고 사로 HTML 코드로 활용



▶바코드 BASE64 텍스트 생성 - barcode.getBarcodeBase64(텍스트);


barcode.getBarcodeBase64("1234567890");


 



▶ 바코드 BASE64 텍스트 생성(배경 투명 처리) - barcode.getBarcodeBase64(텍스트, 투명 유무);

barcode.getBarcodeBase64("1234567890", true);

 



▶ 바코드 BASE64 텍스트 생성(사이즈 변경) - barcode.getBarcodeBase64(텍스트, 바코드넓이, 바코드높이);

barcode.getBarcodeBase64("1234567890", 2, 60);




▶ 바코드 BASE64 텍스트 생성(배경 투명 처리, 사이즈 변경) - barcode.getBarcodeBase64(텍스트, 투명 유무, 바코드넓이, 바코드높이);

barcode.getBarcodeBase64("1234567890", true, 3, 70);




아래 파일은 사용할려고 예제로 따로 만들어준 파일


이클립스에서 경로 맞춰서 지정해주시고

~ Main.java  파일에서 실행하시면 됩니다.


Barcode39Image.java

Barcode128Image.java

BarcodeCreateMain.java





'Dev Language > JAVA' 카테고리의 다른 글

JAVA Client IP 얻기  (0) 2019.09.17
자바 엑셀 내리기 BigGrid 10만 라인 약 2초  (0) 2018.11.26
JAVA AES128 암호화 복호화 소스  (0) 2018.10.11
숫자형식 포멧 방법  (0) 2017.07.13
AES, SHA 암호화 1, JAVA  (0) 2017.03.30
Posted by 타카스 류지
|

JAVA AES128 암호화 복호화 소스

package test;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;


public class FirstApp {

 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  
  FirstApp f = new FirstApp(); 
  
  System.out.println(f.encrypt("TEST08"));
  
 }
 private final String KEYNAME = "nfaator!plaeemo!";
private final String ALGORITHM = "AES"; public static final String AES_ECB_NOPADDING = "AES/ECB/NoPadding"; public String encrypt(final String source) throws Exception { byte[] eArr = null; SecretKeySpec skeySpec = new SecretKeySpec(KEYNAME.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(AES_ECB_NOPADDING); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); eArr = cipher.doFinal(this.addPadding(source.getBytes())); return fromHex(eArr); } public byte[] encryptToByteArray(final String source) throws Exception { byte[] eArr = null; SecretKeySpec skeySpec = new SecretKeySpec(KEYNAME.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(AES_ECB_NOPADDING); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); eArr = cipher.doFinal(this.addPadding(source.getBytes())); return eArr; } public String GetEncryptString(String source) throws Exception { StringBuilder sbResult = new StringBuilder(); byte[] eArr = null; SecretKeySpec skeySpec = new SecretKeySpec(KEYNAME.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(AES_ECB_NOPADDING); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); eArr = cipher.doFinal(this.addPadding(source.getBytes())); for (byte b : eArr) { sbResult.append(String.format("%02x", b)); } return sbResult.toString(); } public String decrypt(final String source) throws Exception { Cipher cipher = Cipher.getInstance(AES_ECB_NOPADDING); SecretKeySpec skeySpec = new SecretKeySpec(KEYNAME.getBytes(), ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] eArr = this.removePadding(cipher.doFinal(this.toBytes(source))); return new String(eArr); } private byte[] removePadding(final byte[] pBytes) { int pCount = pBytes.length; int index = 0; boolean loop = true; while (loop) { if (index == pCount || pBytes[index] == 0x00) { loop = false; index--; } index++; } byte[] tBytes = new byte[index]; System.arraycopy(pBytes, 0, tBytes, 0, index); return tBytes; } private byte[] toBytes(final String pSource) { StringBuffer buff = new StringBuffer(pSource); int bCount = buff.length() / 2; byte[] bArr = new byte[bCount]; for (int bIndex = 0; bIndex < bCount; bIndex++) { bArr[bIndex] = (byte) Long.parseLong(buff.substring(2 * bIndex, (2 * bIndex) + 2), 16); } return bArr; } private byte[] addPadding(final byte[] pBytes) { int pCount = pBytes.length; int tCount = pCount + (16 - (pCount % 16)); byte[] tBytes = new byte[tCount]; System.arraycopy(pBytes, 0, tBytes, 0, pCount); for (int rIndex = pCount; rIndex < tCount; rIndex++) { tBytes[rIndex] = 0x00; } return tBytes; } public String fromHex(byte[] pBytes) { int pCount = pBytes.length; StringBuffer buff = new StringBuffer(pCount * 2); for (int pIndex = 0; pIndex < pCount; pIndex++) { if (((int) pBytes[pIndex] & 0xff) < 0x10) { buff.append(0); } buff.append(Long.toString((int) pBytes[pIndex] & 0xff, 16)); } return buff.toString(); } }

[출처] C# JAVA AES128 암호화 복호화 소스|작성자 실버캐슬

'Dev Language > JAVA' 카테고리의 다른 글

자바 엑셀 내리기 BigGrid 10만 라인 약 2초  (0) 2018.11.26
JAVA 바코드 생성  (0) 2018.11.16
숫자형식 포멧 방법  (0) 2017.07.13
AES, SHA 암호화 1, JAVA  (0) 2017.03.30
ResultSet을 컬렉션으로 반환  (0) 2016.06.16
Posted by 타카스 류지
|

C# AES128 암호화 복호화 소스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            String s = "TEST08";
            String key = "nfaator!plaeemo!";
            Console.WriteLine(Encrypt(s, key));
            Console.WriteLine(Decrypt(Encrypt(s, key), key));
        }
        private static string Encrypt(string s, string key)
        {
            StringBuilder sbResult = new StringBuilder();

            byte[] KeyArray = UTF8Encoding.UTF8.GetBytes(key);
            byte[] EncryptArray = UTF8Encoding.UTF8.GetBytes(s);

            RijndaelManaged Rdel = new RijndaelManaged();
            Rdel.Mode = CipherMode.ECB;
            Rdel.Padding = PaddingMode.Zeros;
            Rdel.Key = KeyArray;

            ICryptoTransform CtransForm = Rdel.CreateEncryptor();
            byte[] ResultArray = CtransForm.TransformFinalBlock(EncryptArray, 0, EncryptArray.Length);

            foreach (byte b in ResultArray)
            {
                sbResult.AppendFormat("{0:x2}", b);
            }

            return sbResult.ToString();
        }

        private static string Decrypt(string s, string key)
        {
            byte[] KeyArray = UTF8Encoding.UTF8.GetBytes(key);
            byte[] EncryptArray = HexToByte(s);

            RijndaelManaged Rdel = new RijndaelManaged();
            Rdel.Mode = CipherMode.ECB;
            Rdel.Padding = PaddingMode.Zeros;
            Rdel.Key = KeyArray;

            ICryptoTransform CtransForm = Rdel.CreateDecryptor();
            byte[] ResultArray = CtransForm.TransformFinalBlock(EncryptArray, 0, EncryptArray.Length);
            return UTF8Encoding.UTF8.GetString(ResultArray);
        }

        private static byte[] HexToByte(string msg)
        {
            msg = msg.Replace(" ", "");
            byte[] comBuffer = new byte[msg.Length / 2];
            for(int i = 0; i < msg.Length; i+=2)
            {
                try
                {
                    comBuffer[i / 2] = (byte)Convert.ToByte(msg.Substring(i, 2), 16);
                }
                catch(ArgumentOutOfRangeException ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            return comBuffer;
        }

    }

}


Posted by 타카스 류지
|

//휴대폰

public static String makePhoneNumber(String Number) {

String regEx = "(\\d{3})(\\d{3,4})(\\d{4})";


if(!Pattern.matches(regEx, Number)) return null;


return Number.replaceAll(regEx, "$1-$2-$3");

}


//사업자번호

public static String makeNumber(String Number) {

String regEx = "(\\d{3})(\\d{2})(\\d{5})";


if(!Pattern.matches(regEx, Number)) return null;


return Number.replaceAll(regEx, "$1-$2-$3");

}



//법인번호

public static String makeNumber(String Number) {

String regEx = "(\\d{6})(\\d{7})";


if(!Pattern.matches(regEx, Number)) return null;


return Number.replaceAll(regEx, "$1-$2");

}

'Dev Language > JAVA' 카테고리의 다른 글

JAVA 바코드 생성  (0) 2018.11.16
JAVA AES128 암호화 복호화 소스  (0) 2018.10.11
AES, SHA 암호화 1, JAVA  (0) 2017.03.30
ResultSet을 컬렉션으로 반환  (0) 2016.06.16
AB 파일 압축풀기  (2) 2016.04.20
Posted by 타카스 류지
|

닷넷.. C#을 통해 AES, SHA 암호화를 진행하겠습니다.

음.. visual studio 정품이 없어 고민하다가 검색해보니.. 언제부터 나왔는지 모르겠는데 https://www.visualstudio.com/ko-kr/visual-studio-homepage-vs.aspx에 가니 visual studio 커뮤니티라는 공짜가 있네요... 냉큼 설치하고 진행~

콘솔 응용 프로그램 프로젝트 생성하고 코드~

using System;

using System.IO;

using System.Security.Cryptography;

using System.Text;

 

namespace CryptoConsole

{

    class Program

    {

        static void Main(string[] args)

        {

            string str1 = "암호화되지 않은 문자";

            Console.WriteLine("plain : " + str1);

 

            string str2 = encryptAES128(str1);

            Console.WriteLine("AES128 encrypted : " + str2);

 

            string str3 = decryptAES128(str2);

            Console.WriteLine("AES128 decrypted : " + str3);

 

            string str4 = encryptAES256(str1);

            Console.WriteLine("AES256 encrypted : " + str4);

 

            string str5 = decryptAES256(str4);

            Console.WriteLine("AES256 decrypted : " + str5);

 

            string str6 = encryptSHA256(str1);

            Console.WriteLine("SHA256 encrypted : " + str6);

 

            Console.WriteLine("end");

 

        }

 

        // 

        private static readonly string KEY = "01234567890123456789012345678901";

 

        //128bit (16자리)

        private static readonly string KEY_128 = KEY.Substring(0, 128 / 8);

 

        //256bit (32자리)

        private static readonly string KEY_256 = KEY.Substring(0, 256 / 8);

        

        //AES 128 암호화.., CBC, PKCS7, 예외발생하면 null

        public static string encryptAES128(string plain)

        {

            try

            {

                //바이트로 변환

                byte[] plainBytes = Encoding.UTF8.GetBytes(plain);

 

                //레인달 알고리듬

                RijndaelManaged rm = new RijndaelManaged();

                //자바에서 사용한 운용모드와 패딩방법 일치시킴(AES/CBC/PKCS5Padding)

                rm.Mode = CipherMode.CBC;

                rm.Padding = PaddingMode.PKCS7;

                rm.KeySize = 128;

 

                //메모리스트림 생성

                MemoryStream memoryStream = new MemoryStream();

 

                //key, iv값 정의

                ICryptoTransform encryptor = rm.CreateEncryptor(Encoding.UTF8.GetBytes(KEY_128), Encoding.UTF8.GetBytes(KEY_128));

                //크립토스트림을 키와 IV값으로 메모리스트림을 이용하여 생성

                CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);

 

                //크립트스트림에 바이트배열을 쓰고 플러시..

                cryptoStream.Write(plainBytes, 0, plainBytes.Length);

                cryptoStream.FlushFinalBlock();

 

                //메모리스트림에 담겨있는 암호화된 바이트배열을 담음

                byte[] encryptBytes = memoryStream.ToArray();

 

                //베이스64로 변환

                string encryptString = Convert.ToBase64String(encryptBytes);

 

                //스트림 닫기.

                cryptoStream.Close();

                memoryStream.Close();

 

                return encryptString;

            }

            catch (Exception)

            {

                return null;

            }

        }

 

        //AES128 복호화.., CBC, PKCS7, 예외발생하면 null

        public static string decryptAES128(string encrypt)

        {

            try

            {

                //base64를 바이트로 변환

                byte[] encryptBytes = Convert.FromBase64String(encrypt);

                //byte[] encryptBytes = Encoding.UTF8.GetBytes(encryptString);

 

                //레인달 알고리듬

                RijndaelManaged rm = new RijndaelManaged();

                //자바에서 사용한 운용모드와 패딩방법 일치시킴(AES/CBC/PKCS5Padding)

                rm.Mode = CipherMode.CBC;

                rm.Padding = PaddingMode.PKCS7;

                rm.KeySize = 128;

 

                //메모리스트림 생성

                MemoryStream memoryStream = new MemoryStream(encryptBytes);

 

                //key, iv값 정의

                ICryptoTransform decryptor = rm.CreateDecryptor(Encoding.UTF8.GetBytes(KEY_128), Encoding.UTF8.GetBytes(KEY_128));

                //크립토스트림을 키와 IV값으로 메모리스트림을 이용하여 생성

                CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

 

                //복호화된 데이터를 담을 바이트 배열을 선언한다.

                byte[] plainBytes = new byte[encryptBytes.Length];

 

                int plainCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length);

 

                //복호화된 바이트 배열을 string으로 변환

                string plainString = Encoding.UTF8.GetString(plainBytes, 0, plainCount);

 

                //스트림 닫기.

                cryptoStream.Close();

                memoryStream.Close();

 

                return plainString;

            }

            catch (Exception)

            {

                return null;

            }

        }

 

        //AES 256 암호화.., CBC, PKCS7, 예외발생하면 null

        public static string encryptAES256(string plain)

        {

            try

            {

                //바이트로 변환

                byte[] plainBytes = Encoding.UTF8.GetBytes(plain);

 

                //레인달 알고리듬

                RijndaelManaged rm = new RijndaelManaged();

                //자바에서 사용한 운용모드와 패딩방법 일치시킴(AES/CBC/PKCS5Padding)

                rm.Mode = CipherMode.CBC;

                rm.Padding = PaddingMode.PKCS7;

                rm.KeySize = 256;

    

                //메모리스트림 생성

                MemoryStream memoryStream = new MemoryStream();

 

                //key, iv값 정의

                ICryptoTransform encryptor = rm.CreateEncryptor(Encoding.UTF8.GetBytes(KEY_256), Encoding.UTF8.GetBytes(KEY_128));

                //크립토스트림을 키와 IV값으로 메모리스트림을 이용하여 생성

                CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);

 

                //크립트스트림에 바이트배열을 쓰고 플러시..

                cryptoStream.Write(plainBytes, 0, plainBytes.Length);

                cryptoStream.FlushFinalBlock();

 

                //메모리스트림에 담겨있는 암호화된 바이트배열을 담음

                byte[] encryptBytes = memoryStream.ToArray();

 

                //베이스64로 변환

                string encryptString = Convert.ToBase64String(encryptBytes);

 

                //스트림 닫기.

                cryptoStream.Close();

                memoryStream.Close();

 

                return encryptString;

            }

            catch (Exception)

            {

                return null;

            }

        }

 

        //AES256 복호화.., CBC, PKCS7, 예외발생하면 null

        public static string decryptAES256(string encrypt)

        {

            try

            {

                //base64를 바이트로 변환

                byte[] encryptBytes = Convert.FromBase64String(encrypt);

                //byte[] encryptBytes = Encoding.UTF8.GetBytes(encryptString);

 

                //레인달 알고리듬

                RijndaelManaged rm = new RijndaelManaged();

                //자바에서 사용한 운용모드와 패딩방법 일치시킴(AES/CBC/PKCS5Padding)

                rm.Mode = CipherMode.CBC;

                rm.Padding = PaddingMode.PKCS7;

                rm.KeySize = 256;

 

                //메모리스트림 생성

                MemoryStream memoryStream = new MemoryStream(encryptBytes);

 

                //key, iv값 정의

                ICryptoTransform decryptor = rm.CreateDecryptor(Encoding.UTF8.GetBytes(KEY_256), Encoding.UTF8.GetBytes(KEY_128));

                //크립토스트림을 키와 IV값으로 메모리스트림을 이용하여 생성

                CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

 

                //복호화된 데이터를 담을 바이트 배열을 선언한다.

                byte[] plainBytes = new byte[encryptBytes.Length];

 

                int plainCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length);

 

                //복호화된 바이트 배열을 string으로 변환

                string plainString = Encoding.UTF8.GetString(plainBytes, 0, plainCount);

 

                //스트림 닫기.

                cryptoStream.Close();

                memoryStream.Close();

 

                return plainString;

            }

            catch (Exception)

            {

                return null;

            }

        }

 

        //SHA256 해쉬 함수 암호화.., 예외발생하면 null

        public static string encryptSHA256(string plain)

        {

            try

            {

                //바이트로 변환

                byte[] plainBytes = Encoding.UTF8.GetBytes(plain);

 

                SHA256Managed sm = new SHA256Managed();

 

                byte[] encryptBytes = sm.ComputeHash(plainBytes);

 

                //hex.. 16진수

                //string encryptString = BitConverter.ToString(encryptBytes).Replace("-", "").ToLower();

 

                //base64

                string encryptString = Convert.ToBase64String(encryptBytes);

 

                return encryptString;

            }

            catch (Exception)

            {

                return null;

            }

        }

    }

}

 

실행결과

 



출처: http://aircook.tistory.com/entry/AES-SHA-암호화-3-C [aircook의 잡동사니]

Posted by 타카스 류지
|

java 언어를 이용해서 

블럭암호화는 AES 128/256으로,  해쉬함수는 SHA 256 알고리즘으로 암호화 진행해 보겠습니다.

SHA 128은 보안상 위험함으로 사용안하는것을 추천합니다.

java의 경우 AES 256 암호화를 하기 위해서는 주석에 나와 있는것처럼  http://www.oracle.com/technetwork/java/javase/downloads/index.html에서 파일을 다운받아 JCE관련 패치를 해야됩니다.

base64 인코딩을 위해 commons-codec 라이브러리 추가하였습니다. jdk에 포함되어 있는sun.misc.BASE64Encoder(), sun.misc.BASE64Decoder() 이 클래스들은 http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html를 보면 지원도 보장도 안한다고 나와 있습니다.

pom.xml

<dependency>

        <groupId>commons-codec</groupId>

        <artifactId>commons-codec</artifactId>

        <version>1.10</version>

</dependency>


이클립스에 코딩~~

package com.tistory.aircook;

 

import java.security.MessageDigest;

 

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

 

import org.apache.commons.codec.CharEncoding;

import org.apache.commons.codec.binary.Base64;

import org.apache.commons.codec.binary.Hex;

 

public class Crypto {

 

        public static void main(String[] args) {

 

               String str1 = "암호화되지 않은 문자";

               System.out.println("plain : " + str1);

 

               String str2 = encryptAES128(str1);

               System.out.println("AES128 encrypted : " + str2);

 

               String str3 = decryptAES128(str2);

               System.out.println("AES128 decrypted : " + str3);

              

               String str4 = encryptAES256(str1);

               System.out.println("AES256 encrypted : " + str4);

              

               String str5 = decryptAES256(str4);

               System.out.println("AES256 decrypted : " + str5);

              

               String str6 = encryptSHA256(str1);

               System.out.println("SHA256 encrypted : " + str6);

 

        }

 

        // 

        private final static String KEY = "01234567890123456789012345678901";

 

        // 128bit (16자리)

        private final static String KEY_128 = KEY.substring(0, 128 / 8);

       

        // 256bit (32자리)

        private final static String KEY_256 = KEY.substring(0, 256 / 8);

 

        // AES 128 암호화

        public static String encryptAES128(String string) {

 

               try {

                       byte[] keyData = KEY_128.getBytes(CharEncoding.UTF_8);

 

                       // 운용모드 CBC, 패딩은 PKCS5Padding

                       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

 

                       // key 와 iv 같게..

                       // 블록 암호의 운용 모드(Block engine modes of operation)가 CBC/OFB/CFB를 사용할 경우에는

                       // Initialization Vector(IV), IvParameterSpec를 설정해줘야한다. 아니면 InvalidAlgorithmParameterException 발생

                      

                       cipher.init(Cipher.ENCRYPT_MODEnew SecretKeySpec(keyData"AES"), new IvParameterSpec(keyData));

 

                       // AES 암호화

                       byte[] encrypted = cipher.doFinal(string.getBytes(CharEncoding.UTF_8));

 

                       // base64 인코딩

                       byte[] base64Encoded = Base64.encodeBase64(encrypted);

 

                       // 결과

                       String result = new String(base64Encoded, CharEncoding.UTF_8);

 

                       return result;

               }

               catch (Exception e) {

                       return null;

               }

        }

 

        // AES 128복호화

        public static String decryptAES128(String string) {

 

               try {

                       byte[] keyData = KEY_128.getBytes(CharEncoding.UTF_8);

 

                       // 운용모드 CBC, 패딩은 PKCS5Padding

                       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

 

                       cipher.init(Cipher.DECRYPT_MODEnew SecretKeySpec(keyData"AES"), new IvParameterSpec(keyData));

 

                       // base64 디코딩

                       byte[] base64Decoded = Base64.decodeBase64(string.getBytes(CharEncoding.UTF_8));

 

                       // AES 복화화

                       byte[] decrypted = cipher.doFinal(base64Decoded);

 

                       // 결과

                       String result = new String(decrypted, CharEncoding.UTF_8);

 

                       return result;

               }

               catch (Exception e) {

                       return null;

               }

        }

       

        // AES 256 암호화

        public static String encryptAES256(String string) {

 

               try {

                       byte[] key256Data = KEY_256.getBytes(CharEncoding.UTF_8);

                       byte[] key128Data = KEY_128.getBytes(CharEncoding.UTF_8);

 

                       // 운용모드 CBC, 패딩은 PKCS5Padding

                       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

 

                       // key 와 iv 같게..

                       // 블록 암호의 운용 모드(Block engine modes of operation)가 CBC/OFB/CFB를 사용할 경우에는

                       // Initialization Vector(IV), IvParameterSpec를 설정해줘야한다. 아니면 InvalidAlgorithmParameterException 발생

                      

                       // AES 256은 미국만 되는거라. JDK/JRE 패치를 해야된다.

                       // http://www.oracle.com/technetwork/java/javase/downloads/index.html 에서

                       // Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 이런 링크 찾아서 다운

                       // $JAVA_HOME\jre\lib\security 아래에 local_policy.jar, US_export_policy.jar 파일 overwrite!

                      

                       // iv값이 16자리가 아니면..

                       // java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long 발생

                      

                       cipher.init(Cipher.ENCRYPT_MODEnew SecretKeySpec(key256Data"AES"), new IvParameterSpec(key128Data));

 

                       // AES 암호화

                       byte[] encrypted = cipher.doFinal(string.getBytes(CharEncoding.UTF_8));

 

                       // base64 인코딩

                       byte[] base64Encoded = Base64.encodeBase64(encrypted);

 

                       // 결과

                       String result = new String(base64Encoded, CharEncoding.UTF_8);

 

                       return result;

               }

               catch (Exception e) {

                       return null;

               }

        }      

       

        // AES 256복호화

        public static String decryptAES256(String string) {

 

               try {

                       byte[] key256Data = KEY_256.getBytes(CharEncoding.UTF_8);

                       byte[] key128Data = KEY_128.getBytes(CharEncoding.UTF_8);

 

                       // 운용모드 CBC, 패딩은 PKCS5Padding

                       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

 

                       cipher.init(Cipher.DECRYPT_MODEnew SecretKeySpec(key256Data"AES"), new IvParameterSpec(key128Data));

 

                       // base64 디코딩

                       byte[] base64Decoded = Base64.decodeBase64(string.getBytes(CharEncoding.UTF_8));

 

                       // AES 복화화

                       byte[] decrypted = cipher.doFinal(base64Decoded);

 

                       // 결과

                       String result = new String(decrypted, CharEncoding.UTF_8);

 

                       return result;

               }

               catch (Exception e) {

                       return null;

               }

        }      

       

 

        public static String encryptSHA256(String string) {

              

               try {

                       MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");

 

                       byte[] stringBytes = string.getBytes();

                       int stringBytesLength = stringBytes.length;

 

                       byte[] dataBytes = new byte[1024];

                       for (int i = 0; i < stringBytesLengthi++) {

                              dataBytes[i] = stringBytes[i];

                       }

 

                       messageDigest.update(dataBytes, 0, stringBytesLength);

 

                       byte[] encrypted = messageDigest.digest();

 

                       // hex, 16진수

                       // StringBuffer sb = new StringBuffer();

                       // for (int i = 0; i < encrypted.length; i++) {

                       //      sb.append(Integer.toString((encrypted[i] & 0xff) + 0x100, 16).substring(1));

                       // }

                       // 결과

                       // String result = sb.toString();

                      

                       // commons codec lib 사용하면 아래처럼 간단하게..

                       // String result = Hex.encodeHexString(encrypted);

                      

                      

                       // base64 인코딩

                       byte[] base64Encoded = Base64.encodeBase64(encrypted);

                       // 결과

                       String result = new String(base64Encoded, CharEncoding.UTF_8);

 

                       return result;

               }

               catch (Exception e) {

 

                       return null;

               }

        }

}


결과



출처: http://aircook.tistory.com/entry/AES-SHA-암호화-1-JAVA [aircook의 잡동사니]

'Dev Language > JAVA' 카테고리의 다른 글

JAVA AES128 암호화 복호화 소스  (0) 2018.10.11
숫자형식 포멧 방법  (0) 2017.07.13
ResultSet을 컬렉션으로 반환  (0) 2016.06.16
AB 파일 압축풀기  (2) 2016.04.20
Eclipse 성능개선 최적화  (0) 2016.02.12
Posted by 타카스 류지
|

간혹 웹호스팅을 사용하면서 FTP 데이터를 몽땅 다운받아야 하는상황이 있을때가있다.

 

고로 백업? 인데.... 그냥 다운받기하면 언제 다운받나요 ;;;;

 

그래서 그냥 FTP 루트에 파일 올리고 웹에서 열어주기만 하면은 압축파일 하나가 뚝딱

 

그냥 다운받으시면됩니다.

 

다만 압축시킬려고 올린 파일도 같이 포함됩니다. 0-0

 

 

FTP 웹 소스 백업.php

 

Posted by 타카스 류지
|

호스팅업체에 웹호스팅이랑 mysql 을 서비스 받고있는데

 

외부에서 호스팅 DB 를 끌어다가 사용하고 싶을대가 있습니다.

 

고민고민 하다가 찾아봤는데 어떤사람인진 모르겠지만

 

만들어놓고 블로그 올려놨으면서 압축 비번 걸어놓고 비번은 모르쇠 -_-

 

그래서 만들어봄

 

먼저 JSON 으로 주고 받는식으로 만든거라 컴파일시에 DLL 포함시키게 하면은

 

exe 단일 파일료 사용이 가능해서 밑에 내용처럼 따라 하시면됩니다.

 

그리고 json 을 쉽게 사용하기 위해서 dataset 으로 변환 시키서 사용하게 해놓았습니다.

 

필요한건 뽑아 쓰셔도 됩니다.

 

 

[Program.cs 소스]

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Reflection;
using System.Windows.Forms;

namespace sample
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            // 리로스 dll 취득
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        // 리소스 dll 취득

        static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            Assembly thisAssembly = Assembly.GetExecutingAssembly();
            var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
            if (resources.Count() > 0)
            {
                var resourceName = resources.First();
                using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
                {
                    if (stream == null) return null;
                    var block = new byte[stream.Length];
                    stream.Read(block, 0, block.Length);
                    return Assembly.Load(block);
                }
            }
            return null;
        }

    }
}

 

Program.cs 에다가 위 내용 양식에 맞춰서 넣어주고

 

 

솔루션 탐색기에서 필요한 dll 폴더나 파일로 불러와준후에

 

 

이렇게 해주면됨 간단하죠?

 

zip 파일을 다운받아서 압축풀면 php하고 cs 파일이 있음

 

cs 파일을 사용할땐 namespace 를 맞춰주고 사용하길

 

 

C# 웹호스팅 MYSQL API.zip

 

 

php 파일은 호스팅 임의 경로에 맞춰 주시고

 

cs 파일을 열어보시면

 

private string api_url = @"http://localhost/mysql.api.php";  부분이 있음 해당경로를 맞춰 주시면 됩니다.

 

 

사용법은 cs파일 안이 적혀 있습니다.

 

 

정상적으로 SELECT, INSERT, UPDATE, DELETE 전부 되는걸 확인했네요 이제 꽁냥꽁냥 만들기만 남았네요

 

다들 잘사용하세요

 

ps. 필요한사람있을진 모르겠지만 0-0

 


 

'Dev Language > C#' 카테고리의 다른 글

C# AES128 암호화 복호화 소스  (0) 2018.10.11
AES, SHA 암호화 3, C#  (0) 2017.03.30
윈도우 플랫폼 체크  (0) 2015.12.31
Mac Address Changer(맥 어드레스 변경)  (0) 2015.12.30
.NET Decompile (닷텟 디컴파일)  (0) 2015.06.04
Posted by 타카스 류지
|

리버싱을 위해서 툴을 사용하는 기본적인 순서는 다음과 같다.

  1. 바이너리 분석
  2. 문자열 분석 및 Api와 Event분석
  3. 모니터링을 통한 파일 및 레지스트리, 네트워크 패킷 분석
  4. 디스어셈블러나 디버거를 이용한 분석

첫째로 할 일은 분석할 파일을 PEID와 같은 바이너리 분석 툴로 컴파일러 확인과 패커 여부를 파악한 후에 어떤 언어로 코딩되어 있는지 확인하고, 패커가 있다면 해당 패킹을 풀 수 있는 툴이 있는지 없으면 수동으로 어떻게 풀지를 결정해야 한다.

둘째로 어떠한 문자열들이 들어있는지 대략적으로 살펴보고, 어떤 Api를 사용했는지 주요 이벤트 시점의 위치에 대해서 분석을 해본다.

셋째는 프로그램에서 어떤 파일들을 접근하는지, 어느 위치의 레지스트리를 사용하는지 모니터링을 해본다. 그 외에 외부의 시스템과 어떤 패킷이 오가는지도 확인한다.

넷째로는 디스어셈블링을 통해 얻어진 어셈코드를 분석하거나 디버거로 로드하여 실시간으로 분석해 볼 수 있다.

 

리버싱을 하기 위해서는 디버거 이외에도 알아야 할 툴들이 많으며, 시스템 전반적인 공부들을 해야 한다.

  1. 시스템 모니터링 툴(파일과 레지스트리 변화와 네트워크 상태, 프로세스의 상태를 분석)
    1. Filemon
      1. http://www.microsoft.com/technet/sysinternals/utilities/Filemon.mspx
      2. 어플리케이션이 파일들을 어떻게 사용하는지 실시간으로 모니터링해서 오픈, 읽기, 쓰기, 삭제 등의 상황을 정확히 출력해주는 툴이다.
    2. Regmon
      1. http://www.microsoft.com/technet/sysinternals/utilities/regmon.mspx
      2. Filemon과 더불어 레지스트리를 검사하는 툴로써 어플리케이션이 어떤 레지스트리들을 사용하는지를 실시간으로 모니터링하는 툴이다.
    3. TcpView
      1. http://www.microsoft.com/technet/sysinternals/Utilities/TcpView.mspx
      2. 윈도우에서 네트워크 관련 프로세스가 어떤 포트를 열어서 사용 중인지 모니터링해주는 툴이다.
    4. Procexp
      1. http://www.microsoft.com/technet/sysinternals/Utilities/ProcessExplorer.mspx
      2. Windows 작업관리자와 비슷하지만 프로세스의 세부적인 정보를 보여주고, 실시간으로 새로 생성하고, 없어지는 프로세스를 색으로 표시한다.
  2. 디스어셈블러(바이너리 파일을 역으로 어셈블리어로 재구성해준다.)
    1. IDA
      1. http://www.Hex-rays.com/idapro
      2. 바이너리 파일을 역으로 어셈블리어로 재구성해준다.
  3. 디컴파일러(이미 컴파일이 된 바이너리를 역으로 컴파일해주는 툴이다.)
    1. 플래쉬 디컴파일러(sothink SWF Decompiler)
      1. http://www.sothink.com/product/flashdecompiler
      2. 상용프로그램이며, SWF 파일을 디컴파일해서 원래 소스파일인 FLV 파일까지 만들어주며, 액션스크립트를 추출하거나 내부 사운드, 이미지들까지 확인가능하다.
    2. 닷넷 프로그램 디컴파일러(Reflector)
      1. http://www.aisto.com/roeder/dotnet/
      2. .NET으로 제작된 프로그램의 원래 소스를 복원해주는 기능을 가지고 있다.
    3. 델파이 디컴파일러(DeDe)
      1. http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissaemblers/DeDe.shtml
      2. 델파이로 제작된 윈도우 어플리케이션을 디컴파일해주는 프로그램이다.
  4. 메모리 패치(윈도우 운영체제가 사용중인 메모리 값들을 검색해서 원하는 값으로 변경해 주는 기능이 있다.)
    1. 티서치
      1. http://codeengn.com/ReverseEngineering_PDS/1826
      2. 간단하게 메모리 값을 수정한다.
    2. 치트엔진
      1. http://www.cheatengin.org
  5. 바이너리 분석(어떤 패커를 이용해서 바이너리를 패킹했는지, 어떤 언어로 제작했는지 알아낸다)
    1. PEiD
      1. http://www.peid.info
      2. 바이너리 분석 툴 중에서 유명하고, 많은 리버서들에게 사용되는 툴
    2. 리소스해커
      1. http://www.angusj.com/resourcehacker/
      2. 리소르를 분석해야 하는 경우에 사용되는 툴로서 프로그램 내부에서 사용되는 문자열이나 아이콘, 이미지, 폼 구조에 대해서 분석할 때 유용하다.
    3. Strings
      1. http://www.microsoft.com/technet/sysinterals/Miscellaneous/Strings.mspx
      2. 바이너리 내부에서 사용된 문자열들을 보기 좋게 추출한다.
  6. 언패커(프로그램을 압축하거나 보호하기 위해서 사용되는 패커들이 하는 일을 반대로 해주는 툴)
    1. Universal Extractor
      1. http://legroom.net/software/uniextract
      2. 잘 알려져 있는 패킹을 풀어주는 통합 툴
    2. VMUnpacker
      1. http://www.dswlab.com
      2. 중국의 보안업체에서 꾸준히 업데이트를 하고 있어서 기능이 뛰어난 툴
  7. 헥스에디터(바이너리 파일을 수정할 때 사용)
    1. 울트라에디터
      1. http://www.ultraedit.com
    2. Hex Workshop
      1. http://www.Hexworkshop.com
  8. 루트킷 탐지(루트킷을 탐지하기 위한 툴)
    1. GMER
      1. http://www.gmer.net/files.php
      2. 회사 차원에서 제공하는 툴로서 주기적으로 업데이트 되고, 다른 툴에 비해 안정적이다.
    2. IceSword
      1. http://pif.blogcn.com
      2. 중국 개발자가 자신의 블로그에서 배포중인 툴 만큼 기업체에서 제공하는 패턴처럼 자주 업데이트 되지는 않지만, 루트킷 탐지 분야에서는 최고의 툴로 찬사를 받고 있는 툴이다.
  9. 네트워크 모니터링 툴(외부와 어떤 통신을 하고 있는지 확인하는 용도로 사용)
    1. WireShark
      1. http://www.wireshark.org
      2. 무료로 사용할 수 있는 패킷 캡쳐 툴로 다양한 프로토콜로 전송되는 것들을 분석해서 보여준다.
  10. 가상머신(특정한 프로그램들을 실행하는 컴퓨터를 진짜 컴퓨터 같이 만들어주는 소프트웨어
    1. VMWare
      1. http://www.vmware.com
      2. 오랫동안 개발해오면서 성능 및 기능이 다양하고, 가장 많은 주변 장치들을 지원하고 있다.
    2. Virtual PC
      1. http://www.microsoft.com/windows/products/winfamily/virtualpc/default.mspx
      2. 64비트 지원, Windows Vista 지원, 레거시 제품들의 호환성 문제를 VPC를 이용해 해결하라고 가이드하고 있으며, 하드웨어 가상화도 지원한다.
    3. QEMU
      1. http://fabrice.bellard.free.fr/qemu/
      2. 다른 한 시스템 안에서 개인용 컴퓨터 시스템의 완전한 가상화를 제공하며 자유 소프트웨어이다.
    4. VirtualBox
      1. http://www.virtualbox.org
      2. 공개 가상 PC에 비해 속도가 빠른 편이다.

 

Posted by 타카스 류지
|
PHP 네이버블로그 원격 글쓰기 API 소스

include_once "xmlrpc.inc"; 

function newPost($title, $description, $category) { 
$g_blog_url = "https://api.blog.naver.com/xmlrpc"; 
$user_id = "네이버 아이디"; 
$blogid = "블로그 아이디 = 네이버 아이디와 동일"; 
$password = "글쓰기 API 암호"; 
$publish = true; 
$client = new xmlrpc_client($g_blog_url); 

$client->setSSLVerifyPeer(false); 
$GLOBALS['xmlrpc_internalencoding']='UTF-8'; 

$struct = array( 
'title' => new xmlrpcval($title, "string"), 
'description' => new xmlrpcval($description, "string"), 
'categories' => new xmlrpcval($category, "string") 
); 

$f = new xmlrpcmsg("metaWeblog.newPost", 
array( 
new xmlrpcval($blogid, "string"), 
new xmlrpcval($user_id, "string"), 
new xmlrpcval($password, "string"), 
new xmlrpcval($struct , "struct"), 
new xmlrpcval($publish, "boolean") 
); 

$f->request_charset_encoding = 'UTF-8'; 

return $response = $client->send($f); 

$return = newPost("블로그 제목", "블로그 내용", "블로그 카테고리명"); 

print_r($return); 
?> 

xmlrpc.inc 다운로드 

네이버 글쓰기 API를 활성화 시키시고 작업하시면 됩니다. 

많은 내용들이 구글에 올라와 있습니다만 내용이 너무 복잡하더군요 

그래서 필요한 부분만 올려봅니다. 

수정 및 삭제는 따로 찾아보시면 될듯합니다. 


자세한 내용은 위의 문서를 참고하시면 될듯합니다. 

매번 블로그 로그인 하기 귀찮을때는 요긴하게 쓰입니다. ^^

출처 : PHP스쿨
Posted by 타카스 류지
|

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p></p>
 * @author Lee Jeong Hak(pluggers@naver.com)
 * @version $Revision: 1.2 $ $Date: 2004/05/06 01:27:53 $

 *  ResultSet을 컬렛션으로 반환
 */
public class RsToCollection {

    private int rsCount;
    private List rsList = new ArrayList();
    private ResultSet rs = null;

    /**
     * 
     */
    public RsToCollection(ResultSet rs) {
        this.rs = rs;
    }

    /**
     * @param rs
     * @return
     * @throws SQLException
     */
    private Object doCreateRow(ResultSet rs) throws SQLException {
        Map result = new HashMap();
        ResultSetMetaData rsmd = rs.getMetaData();
        int count = rsmd.getColumnCount();
        for (int i = 1; i <= count; i++) {
            String label = rsmd.getColumnLabel(i);
            Object value = rs.getObject(i);
            if (label != null && value != null) {
                result.put(label.toUpperCase(), value);
            }
        }
        return result;
    }
    /**
     * @param rs
     * @return
     */
    public List getRsList() {
        try {
            while (rs.next()) {
                Object obj = doCreateRow(rs);
                if (obj instanceof Object[]) {
                    for (int i = 0; i < ((Object[]) obj).length; i++) {
                        rsList.add(((Object[]) obj)[i]);
                    }
                } else {
                    rsList.add(obj);
                }
            }
            rsCount = rsList.size();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rsList;
    }
    /**
     * @return
     */
    public Map getMapList(ResultSet rs) {
        getRsList();
        return (Map) rsList.get(0);
    }
    /**
     * @return
     */
    public int getRsCount() {
        return rsCount;
    }

    /**
     * @param i
     */
    public void setRsCount(int i) {
        rsCount = i;
    }

}

'Dev Language > JAVA' 카테고리의 다른 글

숫자형식 포멧 방법  (0) 2017.07.13
AES, SHA 암호화 1, JAVA  (0) 2017.03.30
AB 파일 압축풀기  (2) 2016.04.20
Eclipse 성능개선 최적화  (0) 2016.02.12
Log4j 로 쿼리 로그 깔금 하게 보기  (0) 2016.02.12
Posted by 타카스 류지
|

간단하게 정리한거

 

달력.zip

 

 

참조.html

 

 


        $("#dtpicker").datepicker({  

            dateFormat: 'yy-mm-dd'// 데이터는 yyyy-MM-dd로 나옴  
            closeText: '닫기',  
            prevText: '이전달',  
            nextText: '다음달',  
            currentText: '오늘',  
            monthNames: ['1월''2월''3월''4월''5월''6월''7월''8월''9월''10월''11월''12월'],  
            monthNamesShort: ['1월''2월''3월''4월''5월''6월''7월''8월''9월''10월''11월''12월'],  
            dayNames: ['일''월''화''수''목''금''토'],  
            dayNamesShort: ['일''월''화''수''목''금''토'],  
            dayNamesMin: ['일''월''화''수''목''금''토'],  
            weekHeader: 'Wk',  
            firstDay: 0,  
            isRTL: false,  
            duration: 200,  
            showAnim: 'show',  
            maxDate: dtNow,       // 오늘 날자이후 데이터 클릭은 막기위해  
            //changeMonth: true,  
            //changeYear: true,  
            //yearRange: 'c-10:c',  
            showMonthAfterYear: true,  
            yearSuffix: '년',  
            showOtherMonths: true// 나머지 날짜도 화면에 표시  
            selectOtherMonths: true// 나머지 날짜에도 선택을 하려면 true  
            defaultDate: dtAsk,  
  
            onChangeMonthYear: function (year, month, inst) {  
    // 년 또는 월이 변경시 이벤트 발생  
                EvtChangeMonthYear(year, month);  
            },  
  
            beforeShow: function (input, inst) {  
    // 일자 선택되기전 이벤트 발생  
            },  
            onSelect: function (dateText, inst) {  
    // 일자 선택된 후 이벤트 발생  
            }  
        });  
        $.datepicker.setDefaults($.datepicker.regional['ko']);  
    });  

출처 : http://todduf.blogspot.kr/2014/06/jquery-datepicker.html

Posted by 타카스 류지
|

ab 파일은 Android Backup 파일로서


adb backup 명령어를 통해 ab파일로 추출을 하고 

adb restore 명령어로 디바이스에 바로 복원 가능합니다


물론 Holo backup 프로그램처럼 스크립트 명령어를 직접입력할필요없이 사용하기 편하게 만든 프로그램들도 있습니다...


adb 명령어를 통해서는 ab 파일로 압축할수는 있으나 컴에서 바로 풀어볼수는 없습니다


이걸 하기위해선 


java 와 abe.jar 파일이 필요합니다


JAVA 는 기본적으로 아실분들은 아시리라 믿고


abe.jar 파일은 http://sourceforge.net/projects/adbextractor/


에서 받으실수 있습니다


일단 명령어는


   java -jar abe.jar unpack <backup.ab> <backup.tar> <password> 


이며 위처럼 tar 파일로 생성됩니다


tar 압축은 7zip등의 프로그램으로 푸시면 됩니다...


간혹 에러가나며 압축이 안풀리는경우도 있는데...


확실한건 아니지만 안드로이드 버전등에 따라서 발생하는 문제인듯 보입니다..

 

출처 : http://blackcoffeeholic.tistory.com/368

'Dev Language > JAVA' 카테고리의 다른 글

AES, SHA 암호화 1, JAVA  (0) 2017.03.30
ResultSet을 컬렉션으로 반환  (0) 2016.06.16
Eclipse 성능개선 최적화  (0) 2016.02.12
Log4j 로 쿼리 로그 깔금 하게 보기  (0) 2016.02.12
poi를 이용한 (*.xls, *.xlsx)읽기  (0) 2015.10.06
Posted by 타카스 류지
|

 

출처 : http://www.hyungjun.kr/227

 

참고 : http://taegon.kim/archives/3937

 

-> http://blog.naver.com/pureb612b?Redirect=Log&logNo=220597602756 

 

 

 

 

 

 

 

 

정규식(혹은 정규표현식)에 대해서 자료를 찾다가 괜찮은 문서들이 있길래 정리해봅니다.

 

1. IBM DeveloperWorks의 Special Issue중에서 초보 개발자 코드 트레이닝,Part 5 : 정규 표현식

2. www.wonchu.net의 자바스크립트 정규식 문서(아래 두개중 어떤 링크를 이용해도 됨.)
http://www.wonchu.net/board.do?method=bview&boardId=003&boardSeq=36 (검색엔진에서 찾은 링크)
http://www.wonchu.net/issue/00336 (게시판에 표시된 링크)

3. [똥싼너구리의 정리노트]라는 스프링노트에 올라온 문서
정규표현식 카테고리

4. [카알의 적당한 인생 이야기]에 올라온 정규표현식 문서
정규 표현식(Regular Expressions) 

 



아래는 [카알의 적당한 인생 이야기]의 내용을 정리한 것입니다.

 

 

(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시
$ (dollar) : 라인의 끝이나 문자열의 끝을 표시
. (period) : 임의의 한 문자를 표시
예)
^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)


(2) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타낸다.
[]내에서 "^"이 선행되면 not을 나타낸다.
이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다. "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower, print, space, uppper, xdigit가 있다.
이외에 [:<:]와 [:>:]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝을 나타낸다.
예)
[abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일)
[Yy] (Y 또는 y)
[A-Za-z0-9] (모든 알파벳과 숫자)
[-A-Z]. ("-"(hyphen)과 모든 대문자)
[^a-z] (소문자 이외의 문자)
[^0-9] (숫자 이외의 문자)
[:alpha:] ([A-Za-z]와 동일)
[[:digit:]] ([0-9]와 동일)

(3) {} (brace) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄
예)
a{3} ('a'의 3번 반복인 aaa만 해당됨)
a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄)
a{3,5} (aaa, aaaa, aaaaa 만 해당됨)
ab{2,3} (abb와 abbb 만 해당됨)
[0-9]{2} (두 자리 숫자)
doc[7-9]{2} (doc77, doc87, doc97 등이 해당)
[^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당)
.{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)

(4) * (asterisk) : "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열
예)
ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등)
* (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨)
.* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨)
ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등)
a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등) doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당)
[A-Z].* (대문자로만 이루어진 문자열)
like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이됨, like, likely, liker, likelihood 등)

(5) + (asterisk) : "+" 직전의 선행문자가 1번 이상 나타나는 문자열
예)
ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨)
ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등)
like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨)
[A-Z]+ (대문자로만 이루어진 문자열)

(6) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
예)
ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)

(7) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용

(8) | (bar) : or를 나타냄
예)
a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
korea|japan|chinese (korea, japan, chinese 중 하나)

정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함 
Posted by 타카스 류지
|

 

출처: http://www.nextree.co.kr/p4327/

 

 -> http://blog.naver.com/pureb612b?Redirect=Log&logNo=220597602756

 

정규표현식(Regular Expression)을 소개합니다.

날이 갈수록 개인정보 보호에 관련하여 보안정책을 점진적으로 강화하고 있습니다. 이에 따라 Web에서 회원가입 시 Password 설정을 복잡해진 보안정책에 맞추다 보니 복잡하게 조합해야만 정상적으로 가입을 할 수 있습니다. 이러한 강화된 보안정책 때문에 기존에 사용하던 자신만의 Password를 인위적으로 보안정책에 맞추는 경우가 많을 것입니다. 그러다 보니, 종종 Log-In을 할 때 Password를 잊어버려서 곤란한 상황이 발생하는 경우도 한번쯤은 있었을 것입니다. 일반적으로 이렇게 복잡한 조건이 필요한 경우 사용자에게 입력을 받을 때 여러 가지 조건을 주면서 정해진 규칙 안에서만 입력을 하도록 유도를 하고 있습니다. 이번 프로젝트를 진행하면서 사용자가 입력하여 DB에 형식에 맞도록 저장하기 위해 조건을 주는 부분이 있었는데, 간단하게 해결 하기 위해 정규표현식(Regular Expression)을 사용하였습니다. 이 글에서는 정규표현식을 실제로 사용하면서 필요한 정보들을 초보 개발자의 관점에서 해석하고 실제로 사용하는 과정을 담았습니다.

 

- 정규표현식이란?

 

정규표현식의 사전적인 의미로는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다. 주로 Programming Language나 Text Editor 등 에서 문자열의 검색과 치환을 위한 용도로 쓰이고 있습니다. 입력한 문자열에서 특정한 조건을 표현할 경우 일반적인 조건문으로는 다소 복잡할 수도 있지만, 정규표현식을 이용하면 매우 간단하게 표현 할 수 있습니다. 하지만 코드가 간단한 만큼 가독성이 떨어져서 표현식을 숙지하지 않으면 이해하기 힘들다는 문제점이 있습니다.

 

Regular Expression UML

Regular Expression UML

 

- 정규표현식 표현방법

 

정규표현식은 표준인 POSIX의 정규표현식과 POSIX 정규표현식에서 확장된 Perl방식의 PCRE가 대표적이며, 이외에도 수많은 정규표현식이 존재하며 정규표현식 간에는 약간의 차이점이 있으나 거의 비슷합니다. 정규표현식에서 사용하는 기호를 Meta문자라고 합니다. Meta문자는 표현식 내부에서 특정한 의미를 갖는 문자를 말하며, 공통적인 기본 Meta문자의 종류로는 다음과 같습니다.

 

jhkim-140117-RegularExpression-21

 

Meta 문자중에 독특한 성질을 지니고 있는 문자클래스’[ ]‘라는 문자가 있습니다. 문자클래스는 그 내부에 해당하는 문자열의 범위 중 한 문자만 선택한다는 의미이며, 문자클래스 내부에서는 Meta문자를 사용할 수 없거나 의미가 다르게 사용됩니다.

 

jhkim-140117-RegularExpression-19

 

POSIX에서만 사용하는 문자클래스가 있는데, 단축키처럼 편리하게 사용할 수 있습니다. 대표적인 POSIX 문자클래스는 다음과 같으며 대괄호’[ ]‘ 가 붙어있는 모양 자체가 표현식이므로 실제로 문자클래스로 사용할 때에는 대괄호를 씌워서 사용해야만 정상적인 결과를 얻을 수 있습니다.

 

jhkim-140117-RegularExpression-08

 

이밖에도 [:cntrl:] : 아스키 제어문자(0~31번, 127번), [:print:] : 출력 가능한 모든 문자, [:xdigit:] : 모든 16진수 숫자 등이 있습니다.

 

정규표현식을 실제로 사용할 때 언어마다 사용방법이 각각 다릅니다. 진행했던 프로젝트에서는 정규표현식을 JavaScript에서 사용했는데, JavaScript에서 사용하는 방법에 대해서 설명 하겠습니다. 사용하는 JavaScript 버전이 1.1이하 버전일 경우에는 정규표현식을 사용할 수 없습니다. 정규표현식을 사용하는 방법으로는 두 가지가 방법이 존재하며, 첫 번째로는 ‘RegExp’객체를 이용하는 방법이 있습니다. 주로 정규표현식이 자주 변경되는 경우 사용합니다.

두 번째로는 객체초기화(Object Initializer)를 사용하는 방법입니다. 주로 입력된 표현식이 거의 바뀌지 않는 상수 형태의 표현식을 사용할 때 사용합니다.

- Flag의 종류

 

자주 사용하는 Flag는 밑의 3종류가 있으며 Flag를 사용을 하지 않을 수도 있습니다. 만약 Flag를 설정 하지 않을 경우에는 문자열 내에서 검색대상이 많더라도 한번만 찾고 끝나게 됩니다.

 

jhkim-140117-RegularExpression-09

 

이 외에도 공백을 무시하고 주석을 허용하는 x, 개행문자도 포함해서 찾는 s 등 다양한 Flag들이 있습니다.

 

- 정규표현식 실제 적용

 

사용자로부터 값을 입력 받는 부분에서 유효성 체크를 하기 위해 정규표현식을 간단하게 적용한 경우가 있었습니다. 먼저 입력 받은 값은 반드시 한글이 포함되지 않도록 유효성 체크를 하는 부분이 있었습니다. 사용자가 입력한 데이터 중에서 유효하지 않는 데이터를 정규표현식을 이용하여 검색한 뒤 Return하는 방법을 사용하였습니다.

다음으로는 8자리 이하 정수로 이루어진 x, y 좌표를 사용자로부터 입력 받는 경우가 있었습니다. 사용자가 조건에 충족하지 않은 값을 입력할 경우 DB에 적재 할 때나 좌표를 활용할 때 문제가 발생할 수 있기 때문에 유효성 체크가 필요했습니다. 사용자가 값을 입력할 때마다 유효한 값인지 체크를 하고, 잘못된 값을 입력하면 그 값은 Null로 치환을 하는 방법을 사용했습니다. 사용자 입장에서는 유효하지 않은 값을 입력하면 값을 입력하는 순간 아무런 동작을 하지 않은 것처럼 보입니다.

정규표현식으로 조건을 구현하니 매우 간단하게 해결하였습니다. 이 밖에도 Email Check, File 확장자 Check, 주민등록번호 Check, 문자열 공백제거, 문자열 첫 글자 대문자로 치환 등등 정규표현식을 이용하여 다양한 형태의 유효성검사를 구현할 수 있습니다. 정규표현식을 구현하면서 유용한 Utility들이 있습니다. 물론 이러한 Utility들은 Web에서 다양하게 찾아 볼 수 있지만 프로젝트를 진행하면서 유용하게 사용했던 Utility두가지에 대해서 간단하게 소개하도록 하겠습니다. 먼저 사용자가 정규표현식을 작셩하고 직접 원하는 문자열을 Test 할 수도 있고, quality 높은 표현식을 구현하는데 도움을 주는 Utility입니다. 정규표현식에 대해서 지식이 부족한 사용자도 우측의 정규식 표현 Sample과 그에 대한 설명이 자세하게 나와있어서 쉽게 구현할 수 있습니다. 프로그램을 다운받지 않고 Web에서 직접 실행하므로 별다른 설치 없이도 즉시 사용할 수 있는 편리성이 있습니다. 하지만 Web에서 실행하므로 Off-Line에서는 지원이 안되며, 프로그램 내부에서 전체적으로 Font Size가 작다는 단점이 있습니다.

 

http://gskinner.com/RegExr/

 

jhkim-140117-RegularExpression-17

 

두번째 Utility는 표현식을 쉽게 이해할 수 있도록 도식화 하는 Utility입니다. 앞에서 정규표현식 표현방법을 소개 할 때 쉽게 이해할 수 있도록 도식으로 처리한 부분도 이 Utility를 이용하여 직접 구현하였습니다. 이 Utility는 표현식을 구현하기 보다는 복잡한 표현식을 해석하고 이해하는 목적이 가장 알맞다고 생각합니다. 프로젝트를 진행하면서 직접 구현한 표현식이 도식으로 목적에 맞게 구현 되는지 Test 할 수 있습니다. 정규표현식에 대해 어느 정도 지식을 갖추고 있는 사용자들에게 적합하다고 생각합니다. 이 Utility도 앞선 Utility와 마찬가지로 Web에서 별다른 설치 없이 즉시 사용 가능합니다.

 

http://www.regexper.com/

 

jhkim-140117-RegularExpression-18

 

- 글을 마치며…

 

정규표현식은 자주 쓰지 않으면 금방 잊게 되는 수학공식과 같은 존재라고 생각합니다. 정규표현식에 대해서는 오래전부터 접해보긴 했지만, 매번 수박 겉 핥기 식의 학습으로 인해 정규표현식을 접할 때마다 새로운 느낌을 받았습니다. 이번에 정규표현식에 대해 글을 쓰는 목적 중에 하나는 회사 블로그에 글을 올리면서 이러한 얕은 지식을 정리하고 내 것으로 만드는 계기가 되도록 하는 마음으로 선택하였습니다. 이번 프로젝트에는 정규표현식을 다양하게 사용하지 못해서 한정된 부분만 구현하였지만, 기본 표현법만 제대로 익히면 JavaScript 이외에 다양한 정규표현식에서도 쉽게 응용할 수 있다고 생각합니다.

 

- 참조 Site

 

정규표현식 – wiki백과 : http://ko.wikipedia.org/wiki/정규표현식

 

정규표현식의 기본 문법 정리표 : http://blog.daum.net/creazier/15309380

 

정규표현식 사용하기 : http://icoon22.tistory.com/220

 

정규식이란 무엇인가 : http://twinstarbox.tistory.com/entry/Java-정규식이란-무엇인가

 

자바스크립트 정규 표현식 : http://yaku.tistory.com/75

 

Perl 정규표현식, 메타데이타 : http://blog.naver.com/PostView.nhnblogId=turtle1006&logNo=60107758671

 

- 정규표현식 관련 Utility Site

 

정규표현식 Test 및 생성 Util -> http://gskinner.com/RegExr/

 

정규표현식 도식화 표현Util -> http://www.regexper.com/

 

 

Posted by 타카스 류지
|

input 태그에 숫자만을 입력할 수 있도록 하려면1 자바 스크립트의 도움이 필요합니다. 구현이 쉬워 보이지만 다양한 웹 브라우저를 고려하다보면 생각보다 까다롭습니다.

1onkeydown 이벤트 핸들러

input 태그에 onkeydown 속성을 추가합니다.

<input type="text" onkeydown="filterNumber(event);">

filterNumber 함수는 다음과 같습니다.

function filterNumber(event) {
  event.preventDefault(); 1
}

1이 어떤 값도 입력할 수 없도록 합니다.

onkeypress 또는 onkeyup 이벤트 핸들러는 사용할 수 없습니다.

onkeypress 이벤트 핸들러를 사용할 수 없는 이유

onkeypress 이벤트 핸들러를 사용하면 한글을 입력할 수 있습니다. 한글 입력에 대해서는 onkeypress 이벤트 자체가 발생하지 않습니다.

onkeyup 이벤트 핸들러를 사용할 수 없는 이유

onkeyup 이벤트는 글자가 입력된 후에 발생하기 때문에 onkeyup 이벤트 핸들러를 사용하면 모든 글자를 입력할 수 있습니다.

그런데 파이어폭스에서는 한글이 입력되는 문제가 있습니다. 이를 해결하려면 input 태그에 ime-mode 스타일을 추가합니다.

<input type="text" style="ime-mode: disabled;" onkeydown="filterNumber(event);">

2입력이 가능한 키 코드 설정하기

현재까지는 어떤 값도 입력할 수 없습니다. 지금부터는 다음 예외 규정을 filterNumber 함수에 반영하겠습니다.

  • 숫자

  • 단축키

  • 특수 키

숫자 입력 허용

먼저 숫자 입력을 허용합니다. event 객체의 1keyCode 속성으로 사용자가 입력한 키 코드를 알 수 있습니다.

function filterNumber(event) {
  var code = event.keyCode; 1
  if (code > 47 && code < 58) {
    return;
  } 
  event.preventDefault(); 2
}

숫자 0의 키 코드는 48이고, 숫자 9의 키 코드는 57입니다. 따라서 키 코드가 47보다 크고 58보다 작으면 숫자를 입력한 것이기 때문에 2가 호출되지 않도록 반환합니다.

점 입력 허용

정수가 아닌 소숫점도 입력할 수 있도록 점(.)의 입력을 허용합니다.

function filterNumber(event) {
  var code = event.keyCode;
  if (code > 47 && code < 58) {
    return;
  }
  if (code === 110 || code === 190) {
    return;
  }
  event.preventDefault();
}
110은 숫자 패드에 있는 점(.)의 키 코드입니다.

단축키 입력 허용

값을 입력할 때 다양한 단축키를 사용할 수 있습니다.

Ctrl + A

입력한 값을 선택

Ctrl + Z

실행 취소

Ctrl + Y

다시 실행

이런 단축키를 지원하기 위해 Ctrl 또는 Alt 키가 눌러진 상태라면 입력을 허용합니다.

function filterNumber(event) {
  var code = event.keyCode;
  if (code > 47 && code < 58) {
    return;
  }
  if (code === 110 || code === 190) {
    return;
  }
  if (event.ctrlKey || event.altKey) {
    return;
  }
  event.preventDefault();
}

특수 키 입력 허용

마지막으로 왼쪽(←) 또는 오른쪽(→) 방향키와 같은 특수 키 입력을 허용합니다.

function filterNumber(event) {
  var code = event.keyCode;
  if (code > 47 && code < 58) {
    return;
  }
  if (code === 110 || code === 190) {
    return;
  }
  if (event.ctrlKey || event.altKey) {
    return;
  }
  if (code === 9 || code === 36 || code === 35 || code === 37 ||
      code === 39 || code === 8 || code === 46) {
    return;
  }
  event.preventDefault();
}

주요 특수 키 코드는 다음과 같습니다.

표 1주요 키 코드

코드

TAB

9

HOME

36

END

35

LEFT

37

RIGHT

39

BACKSPACE

8

DELETE

46

 


 

출처 :   https://www.3rabbitz.com/blog_ko/a6068a3f953de9d8/10

Posted by 타카스 류지
|

function getManNai($birth_year,$birth_month,$brith_day){
        $birth_year = (int)$birth_year;
        $birth_month = (int)$birth_month;
        $brith_day = (int)$brith_day;

        $now_year = date("Y");
        $now_month = date("m");
        $now_day = date("d");

        if($birth_month < $now_month){
           $age = $now_year - $birth_year;
        }else if($birth_month == $now_month){
         if($brith_day <= $now_day)
          $age = $now_year - $birth_year;
         else
          $age = $now_year - $birth_year -1;
        }else{
           $age = $now_year - $birth_year-1;
        }
        return $age;
}
        
getManNai(1990,01,05);

Posted by 타카스 류지
|

function getOffset( el ) {
   
var _x = 0;
   
var _y = 0;
   
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {

_x += el.offsetLeft - el.scrollLeft;
        _y
+= el.offsetTop - el.scrollTop;
        el
= el.offsetParent;
   
}
   
return { top: _y, left: _x };
}

 

 


var x = getOffset( document.getElementById('yourElId') ).left;

 

 

Posted by 타카스 류지
|

Eclipse 성능개선 최적화

프로젝트가 하나둘씩 쌓여갈 때 마다 이클립스가 느려짐이 심각해집니다.

다양한 기능을 지원하는 만큼 무거운 느낌을 감출 수 없네요. 이클립스의 성능개선을 위해 불필요한 설정을 해제하는 것에 대해 알아보겠습니다.

이클립스 Juno 버젼으로 설정

 

 

eclipse.ini 설정

이클립스 실행 파일안에 같이 존재하는 설정 파일 입니다. 잘못 건들면 실행이 안될 수 있으니 주의 하셔야 해요.

 

메모리 수치는 무조건 높은 게 좋은 것은 아니구요. 본인의 PC에 맞게 적당하게 설정 합니다. 

항상 Xms, Xmx 값만 설정하다가 자세히 알아보니 더 옵션이 많네요.

-Xverify:none 
-XX:+UseParallelGC
-XX:-UseConcMarkSweepGC 
-XX:PermSize=64M
-XX:MaxPermSize=512M  
-XX:MaxNewSize=512M 
-XX:NewSize=128M 
-Xms1024m  
-Xmx1024m

 

소스 자동 폴딩 해제

블록단위로 접혀지는 자동 폴딩을 해제 합니다.  

 

자동 동작하는 코드 자동완성기능 해제

클래스의 변수, 메소드 등을 접근할 때 유용한 기능이지만 자동 동작으로 인해 버벅거리는 원인을 발생하곤 하죠?

이걸 해제한다고 해도 CTRL + SPACE 를 사용해서 동작 시킬 수 있습니다.

 

Spelling 체크 설정 해제

철자체크 기능을 해제 합니다. 좋은 기능이지만 별로 불필요 한 것 같네요.

 

Validation (유효성체크) 설정 해제

Window > Preferences > Validation 

저는 웹 관련된 Validator 만 체크 해놓습니다.

 

작업중이지 않는 프로젝트 닫기

현재 작업 중인 프로젝트외엔 닫아두는 것이 좋습니다.

불필요한 플러그인 삭제

컴퓨터를 사용하더라도 많은 프로그램들이 깔려 있으면 컴퓨터가 느린것처럼 이클립스 또한 사용하지 않는 플러그인들은 제거하는 것이 좋습니다.

Window > Preferences > Install/Update

이클립스의 실행속도 개선

이클립스를 실행 하였을 때 로딩되는 플러그인에 대해 제외 시킵니다.

Autometic Update Off



출처 : http://www.slipp.net/wiki/pages/viewpage.action?pageId=5177633

Posted by 타카스 류지
|
Log4j 설정 참고 자꾸 까먹음


1. log4sql을 다운받는다. 위치는 http://log4sql.sourceforge.net/ 이다.
경로 : http://sourceforge.net/project/showfiles.php?group_id=209296

다운 받아서 lib 에 복사 

아래는 Maven 설정
--------------------
<dependency>
<groupId>log4sql</groupId>
<artifactId>log4sql</artifactId>
<version>7.8</version>
</dependency>
--------------------

2. DB connection정보 변경
ex) jdbc.driverClassName=oracle.jdbc.OracleDriver  ---> jdbc.driverClassName=core.log.jdbc.driver.OracleDriver
DB에 따라서 변경해야하는 드라이버 명은 (http://log4sql.sourceforge.net/) 이곳에서 확인 가능.

기타 log 설정 등은 기존 설정을 사용하되,sql에 관해 로그를 남기던 옵션은 다 해제해 준다.


Posted by 타카스 류지
|

public string GetPlatform()
        {
            OperatingSystem osversion = System.Environment.OSVersion;
            string winName = "";


            switch (osversion.Platform)
            {
                case PlatformID.Win32Windows:
                    if (osversion.Version.Major == 4)
                    {
                        switch (osversion.Version.Minor)
                        {
                            case 0:
                                winName = "Windows 95";
                                break;
                            case 10:
                                winName = "Windows 98";
                                break;
                            case 90:
                                winName = "Windows Me";
                                break;
                        }
                    }
                    break;

 

                case PlatformID.Win32NT:
                    if (osversion.Version.Major == 4)
                    {
                        winName = "Windows NT 4.0";
                    }
                    else if (osversion.Version.Major == 5)
                    {
                        switch (osversion.Version.Minor)
                        {
                            case 0:
                                winName = "Windows 2000";
                                break;
                            case 1:
                                winName = "Windows XP";
                                break;
                            case 2:
                                winName = "Windows Server 2003";
                                break;
                        }
                    }
                    else if (osversion.Version.Major == 6)
                    {
                        switch (osversion.Version.Minor)
                        {
                            case 0:
                                winName = "Windows Vista";
                                break;
                            case 1:
                                winName = "Windows 7";
                                break;
                            case 2:
                                winName = "Windows 8";
                                break;
                            case 3:
                                winName = "Windows 8.1";
                                break;
                        }
                    }
                    else if (osversion.Version.Major == 10)
                    {
                        switch (osversion.Version.Minor)
                        {
                            case 0:
                                winName = "Windows 10";
                                break;
                        }
                    }
                    break;
            }//switch QUIT
            return winName;
        }

 

 

Operating system Version number
Windows 10 10.0*
Windows Server 2016 Technical Preview 10.0*
Windows 8.1 6.3*
Windows Server 2012 R2 6.3*
Windows 8 6.2
Windows Server 2012 6.2
Windows 7 6.1
Windows Server 2008 R2 6.1
Windows Server 2008 6.0
Windows Vista 6.0
Windows Server 2003 R2 5.2
Windows Server 2003 5.2
Windows XP 64-Bit Edition 5.2
Windows XP 5.1
Windows 2000 5.0

 

 

 

 

 

 

 

 

 

 

Posted by 타카스 류지
|