자바스크립트 난독화(패킹, 언패킹)

Posted by Find my true self Fimtrus
2014.10.14 10:44 Programming/Web

자바스크립트는 "소스보기"를 통해 외부에 노출된다.

(아래는 모 사이트 난독화 적용화면)




그러기에 더욱 난독화의 적용이 필요하다.(난독화를 적용한다고 해서 소스 분석이 안되는 것은 아니다. 단지 보기 힘들뿐)


웹을 통해 난독화를 적용시킬 수 있는 사이트를 소개한다.



난독화 (click)

난독화 해제 (click)



출처 : 박종명의 아름다운 개발

이 댓글을 비밀 댓글로

[Javascript] Iframe document 얻기.

Posted by Find my true self Fimtrus
2014.08.13 15:09 Programming/Web

query에는 css 선택자를 넣어주면된다

ex) getFrameDocuement("#frame1");


function getFrameDocument( query ) {
	var frame = document.querySelector( query );
	if (frame == null)
		return;

	var frameDocument = frame.contentWindow || frame.contentDocument;
	return frameDocument;
}


이 댓글을 비밀 댓글로

[Javascript] String byte check. 스트링 바이트 체크 (한글).

Posted by Find my true self Fimtrus
2014.08.13 14:38 Programming/Web

자바스크립트에서 스트링 길이를 구할 때, 한글 길이와 영문길이를 같이 계산하는 경우가 대부분이다.


하지만, 한글의 경우 2byte로 계산해야 정상적인 계산이라고 볼 수 있는데,


구글링 중 어느 블로그를 통해 계산법에 대해 알게 되었다.


현재 string의 byte 수를 구하는 function 이다.


String.prototype.getBytes = function() {
	var contents = this;
	var str_character;
	var int_char_count;
	var int_contents_length;

	int_char_count = 0;
	int_contents_length = contents.length;

	for (k = 0; k < int_contents_length; k++) {
		str_character = contents.charAt(k);
		if (escape(str_character).length > 4)
			int_char_count += 2;
		else
			int_char_count++;
	}
	return int_char_count;
}


그리고 조금더 응용해서 


입력된 숫자 만큼의 길이의 스트링을 리턴해준다.


String.prototype.getStringFromByteLength = function( byteLength ) {
	var contents = this;
	var str_character;
	var int_char_count;
	var int_contents_length;
	
	var returnValue = "";
	
	int_char_count = 0;
	int_contents_length = contents.length;
	
	for (k = 0; k < int_contents_length; k++) {
		str_character = contents.charAt(k);
		if (escape(str_character).length > 4)
			int_char_count += 2;
		else
			int_char_count++;
		
		if ( int_char_count > byteLength ) {
			break;
		}
		returnValue += str_character;
	}
	return returnValue;
}



위의 function은 출처가 어딘지 모르겠네요...


혹시 직접 만드신분이 보신다면...댓글 부탁드려요~


이 댓글을 비밀 댓글로

[Javascript] 자바스크립트에서 replaceAll 하기.

Posted by Find my true self Fimtrus
2014.08.08 15:26 Programming/Web

자바에서는 친절하게 replaceAll을 제공하지만 


자바스크립트는 제공하지 않는다.


결국 해당 function을 만들어주는 수 밖에 없다..


마찬가지로 웹페이지 로드될 때, 아래코드를 추가시켜주면된다.


String.prototype.replaceAll = function() { 
	var a = arguments, length = a.length;
	
	if ( length == 0 ) {
		return this;
	}
	
	var regExp = new RegExp( a[0], "g");
	
	if ( length == 1 ) {
		
		return this.replace(regExp, "");
	} else {
		return this.replace(regExp, a[1]);
	}
	return this;
}



이 댓글을 비밀 댓글로

[Javacript] Array remove Index 배열 삭제

Posted by Find my true self Fimtrus
2014.08.08 14:28 Programming/Web

자바스크립트의 Array 객체 ( [] 대괄호를 통해 생성 또는 new Array 로 생성하는 경우) 에는 배열 객체를 삭제하거나, 인덱스를 입력받아 삭제하는 function이 없다.


물론 splice나 split 등의 function을 이용하면 되긴 하지만, 


익숙하지 않은 사람들에게는 상당히 귀찮은 작업이다.


그래서 function을 미리 만들어 놓고 사용하는데,


이것도 마찬가지로 웹페이지가 로드될 때 코드를 추가해주면


모든 Array가 아래 function들을 가지게 된다.



Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

Array.prototype.removeIndex = function () {
	var a = arguments, length = a.length;
	this.splice ( a[--length], 1 );
	return this;
}


추가한뒤 array 객체를 보면 remove와 removeIndex가 딱!



이 댓글을 비밀 댓글로

[Javascript] Date format 추가.

Posted by Find my true self Fimtrus
2014.08.08 14:15 Programming/Web

자바스크립트에서 Date 객체에 대한 format function을 지원해 주지 않는다.


해서..... 포멧을 만들려면 상당히 귀찮은 작업을 해야하는데,


아래 코드를 웹페이지 로드될 때, 추가해주면 format function 을 사용할 수 있다.

Date.prototype.format = function(f) { if (!this.valueOf()) return " "; var weekName = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]; var d = this; return f.replace(/(yyyy|yy|MM|dd|E|HH|hh|mm|SSS|ss|a\/p)/g, function($1) { switch ($1) { case "yyyy": return d.getFullYear(); case "yy": return (d.getFullYear() % 1000).zf(2); case "MM": return (d.getMonth() + 1).zf(2); case "dd": return d.getDate().zf(2); case "E": return weekName[d.getDay()]; case "HH": return d.getHours().zf(2); case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2); case "mm": return d.getMinutes().zf(2); case "ss": return d.getSeconds().zf(2); case "a/p": return d.getHours() < 12 ? "AM" : "PM"; case "SSS": var temp = "0000"; var milliSeconds = d.getMilliseconds(); temp = temp + milliSeconds; temp = temp.substring ( temp.length - 3 , temp.length); return temp; default: return $1; } }); };


이 댓글을 비밀 댓글로

[Android] 사진 저장 후 갤러리에 보이지 않는 경우-MediaScanner

Posted by Find my true self Fimtrus
2014.07.25 10:51 Programming/Android

개별 파일로 intent를 통해 리소스 디비 업데이트

이동~~(Click)



이번에는 폴더 전체 스캔, MediaScanner를 통해 업데이트를 해보겠습니다.


이부분도 간단하게 구현가능한데, 범용성을 위해 클래스로 뺐습니다^^;



package com.jhlibrary.util;

import android.content.Context;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;

public class MediaScanner {
	private Context mContext;

	private String mPath;

	private MediaScannerConnection mMediaScanner; 
	private MediaScannerConnectionClient mMediaScannerClient;

	public static MediaScanner newInstance(Context context) {
		return new MediaScanner(context);
	}

	private MediaScanner(Context context) {
		mContext = context;
	}

	public void mediaScanning(final String path) {

		if (mMediaScanner == null) {
			mMediaScannerClient = new MediaScannerConnectionClient() {

				@Override
				public void onMediaScannerConnected() {
					mMediaScanner.scanFile(mPath, null); // 디렉토리
					// 가져옴
				}

				@Override
				public void onScanCompleted(String path, Uri uri) {

				}
			};
			mMediaScanner = new MediaScannerConnection(mContext, mMediaScannerClient);
		}

		mPath = path;
		mMediaScanner.connect();
	}
}


직접 구현의 경우, MediaScannerConnection 클래스를 통해 디비에 접근(?), 


파일 또는 디렉토리 전체에 대한 업데이트를  할 수 있다.


먼저 MediaScannerConnectionClient 를 객체화 해줍니다.

(이 클래스는 MediaScannerConnection에서 callback을 받기 위한 클래스입니다).


그리고  connection을 위한 MediaScannerConnection을 객체화 하면 끝~!



사용하기 위해선 아래처럼 하시면 됩니다.



MediaScanner scanner = MediaScanner.newInstance(MainActivity.this);
scanner.mediaScanning("파일경로"); 
이 댓글을 비밀 댓글로
    • 1234
    • 2015.01.23 10:34
    MediaScanner scanner = MediaScanner.newInstance(MainActivity.this);
    scanner.mediaScanning("파일경로");
    여기서 MainActivity에서 오류가나는데 왜이런거죠?
      • 1234
      • 2015.01.23 10:38
      그리고 파일경로에는 /sdcard 이런식으로 적는건가요?
    • Environment 클래스에 보면 sd카드 등 파일패스 경로가 지정되어 있습니다.

      그걸 사용하셔서 해당 파일의 위치를 지정하시면 됩니다.
    • 스르르
    • 2015.11.27 00:06
    정말정말정말 감사합니다~~ 며칠동안 고민하던거 바로 해결했어요

[Android] 사진 저장 후 갤러리에 보이지 않는 경우.

Posted by Find my true self Fimtrus
2014.07.25 10:34 Programming/Android

안드로이드에서 현재 화면을 저장하는 경우, 또는 이미지를 저장하였을 때


갤러리에서 보이지 않는 경우가 있다.


안드로이드에서는 사용자가 가지고 있는 리소스를 디비화 해서 저장하고 있는데,


해당 파일의 정보 및 썸네일까지 담고 있다.


그래서 갤러리 같은 경우, 이미지 파일을 보여주긴 하지만 상당히 빠른 속도로 화면을 볼수 있는 이유 중의 하나이다.


아무튼..갤러리에 보여주기 위해서는 디비에 업데이트 해주는 인텐트가 필요하다. 아니면 별도의 스캐너를 사용해도되고....


간단하게 인텐트를 통해 해당 파일을 업데이트하는 방법이다.




//
context.sendBroadcast(new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)) );
//

context : Activity 또는 해당 어플리케이션의 context

file : 업데이트할 파일 객체.


이 댓글을 비밀 댓글로

[Android, Hybrid] 앱에서 파일 다운로드 구현. URL File Download.

Posted by Find my true self Fimtrus
2014.07.10 15:09 Programming/Android

웹브라우저를 이용해서 파일을 다운로드 받을 경우, 다운로드매니저를 통해 받게 된다.(진저브레드 이상)


앱에서 다운로드 매니저를 사용하여 파일 다운로드 받는 방법을 쓰고자 한다.


앱이나 하이브리드나 다운로드 하는 방법은 동일하다.


다운로드 매소드, 그리고 다운로드매니저로부터 액션을 받을 수 있는 리시버를 만드면 끝.!


Download Method

private DownloadManager mDownloadManager; //다운로드 매니저. 
private int mDownloadQueueId; //다운로드 큐 아이디..
private String mFileName ; //파일다운로드 완료후...파일을 열기 위해 저장된 위치를 입력해둔다.
/**
 * @param url : 파일을 다운로드할 url.
 */
public void download(String url) {
	if (mDownloadManager == null) {
		mDownloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
	}
	Request request = new DownloadManager.Request( Uri.parse(url) );
	request.setTitle("==타이틀==");
	request.setDescription("==설명==");
	List<string> pathSegmentList = uri.getPathSegments();
	Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/temp").mkdirs();  //경로는 입맛에 따라...바꾸시면됩니다.
	request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS + "/temp/", pathSegmentList.get(pathSegmentList.size()-1) );
	mFileName = pathSegmentList.get(pathSegmentList.size()-1);

	mDownloadQueueId = mDownloadManager.enqueue(request);
}



다운로드관련 인텐트를 받을 리시버를 만들고, 등록시켜주면 끝!

(onResume 에서 등록, onPause에서 해제를 추천한다.)


Complete Receiver

/**
 * 다운로드 완료 액션을 받을 리시버.
 */
private BroadcastReceiver mCompleteReceiver = new BroadcastReceiver() {
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
			Toast.makeText(context, "Complete.", Toast.LENGTH_SHORT).show();
			Intent intent1 = new Intent();
			intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent1.setAction(android.content.Intent.ACTION_VIEW);
			intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

			String localUrl = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
					+ "/temp/" + mFileName; //저장했던 경로..
			String extension = MimeTypeMap.getFileExtensionFromUrl(localUrl);
			String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);

			File file = new File(localUrl);
			intent1.setDataAndType(Uri.fromFile(file), mimeType);
			try {
				startActivity(intent1);
			} catch (ActivityNotFoundException e) {
				Toast.makeText(NPF.this, "Not found. Cannot open file.", Toast.LENGTH_SHORT).show();
				e.printStackTrace();
			}
		}
	}
};


@Override
protected void onPause() {
	super.onPause();
	unregisterReceiver(mCompleteReceiver);
}

@Override
protected void onResume() {
	super.onResume();
	IntentFilter completeFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
	registerReceiver(mCompleteReceiver, completeFilter);
}


하이브리드 앱의 경우 JavaInterface에 해당 method를 넣어주면 되고, 일반적인 앱에서 사용할 경우에는


유틸 같은 곳에 추가하여 사용하면된다.(물론 해당 method를 조금 수정해서 context를 받도록 해야할 것이긴 하지만)



이 댓글을 비밀 댓글로
    • 2014.07.14 09:31
    비밀댓글입니다
    • 조금의(?) 수정
    • 2015.10.21 22:14
    직접 내용을 수정하여 제목, 내용 커스텀 + 경로 지정 가능하게 해보고
    일반 앱에 바로 복붙하고 Import만 하면 가능하게 대충 수정을...

    public void download(String url, String title, String des, String path) {
    DownloadManager mDownloadManager = null; //다운로드 매니저.
    int mDownloadQueueId; //다운로드 큐 아이디..
    String mFileName ; //파일다운로드 완료후...파일을 열기 위해 저장된 위치를 입력해둔다.
    if (mDownloadManager == null) {
    mDownloadManager = (DownloadManager) getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE);
    }
    DownloadManager.Request request = new DownloadManager.Request( Uri.parse(url) );
    request.setTitle(title);
    request.setDescription(des);
    List<String> pathSegmentList = Uri.parse(url).getPathSegments();
    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/" + path).mkdirs(); //경로는 입맛에 따라...바꾸시면됩니다.
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS + "/" + path + "/", pathSegmentList.get(pathSegmentList.size()-1) );
    mFileName = pathSegmentList.get(pathSegmentList.size()-1);

    mDownloadQueueId = (int) mDownloadManager.enqueue(request);
    }

[Chrome] 크롬 강력한 새로 고침 단축키. 클리어 캐시

Posted by Find my true self Fimtrus
2014.07.09 13:40 Programming

작업 중에 CSS나 html을 수정하였을 경우, 캐시로 인해 새로고침이 정상적으로 이루어 지지 않을 때가 많다.


매번 설정에 들어가서 캐시를 지워야 했지만 크롬에는 강력한 새로고침이라는 기능이 있다.

(옛날 버전에는 안될 수도 있으니,, 최신버전으로..)


마우스 우측버튼 클릭, 개발자 콘솔(또는 검사)를 열고, 새로고침을 롱클릭하게 되면 하위메뉴들이 나오는데,



그중 "강력한 새로고침"과, "캐시비우기 및 강력 새로고침"이라는 선택창이 있다. (윈도우 버전에서만 보인다) 맥 버전에도 추가 됬음!


이중 하나를 선택하면 화면이 리로드 되고, 이미지나 css에서 304 값을 받는 경우는 없을 것이다.


단축키로 사용하고 싶으면  ctrl + shift + r 을 눌리게 되면 강력한 새로고침이 동작한다.


맥에서는 롱클릭하여도 반응이 없고, command + shift + r 단축키를 눌리면 강력한 새로고침이 된다!!

이 댓글을 비밀 댓글로
  1. 감사합니다
  2. 오오 이런 방법이! 감사합니다
    • 2017.08.29 01:30
    오 감사합니다!
    • 2017.12.11 13:54
    비밀댓글입니다
    • 묵사마
    • 2018.05.26 21:13
    좋은 정보 감사ㅋ