JAVA 에서 특정 URL 경로로 데이터를 가져오기 위하여 URL Encoding 을 해야할 때 여간 귀찮은 것이 아니다.

그래서 아래처럼 URLEncoder 클래스를 수정한 BorwerURLEncoder 를 만들었다.


사용법은 URLEncoder 와 동일하며, 마치 브라우저 창에서 URL 주소를 입력해 놓은 것처럼 출력되도록 하였다.

 


BrowserURLEncoder.java 

import java.io.CharArrayWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.BitSet;

public class BrowserURLEncoder {

	static BitSet dontNeedEncoding;
	static final int caseDiff = ('a' - 'A');
	static String dfltEncName = "utf-8";
	
	static {
		dontNeedEncoding = new BitSet(256);
		int i;
		for (i = 'a'; i <= 'z'; i++) {
			dontNeedEncoding.set(i);
		}
		for (i = 'A'; i <= 'Z'; i++) {
			dontNeedEncoding.set(i);
		}
		for (i = '0'; i <= '9'; i++) {
			dontNeedEncoding.set(i);
		}
		
		dontNeedEncoding.set('#');
		dontNeedEncoding.set('?');
		dontNeedEncoding.set(':');
		dontNeedEncoding.set('@');
		
		dontNeedEncoding.set('-');
		dontNeedEncoding.set('_');
		dontNeedEncoding.set('.');
		dontNeedEncoding.set('*');
		dontNeedEncoding.set('!');
		dontNeedEncoding.set('$');
		dontNeedEncoding.set('&');
		dontNeedEncoding.set('(');
		dontNeedEncoding.set(')');
		dontNeedEncoding.set('/');
		dontNeedEncoding.set('*');
		dontNeedEncoding.set('+');
		dontNeedEncoding.set(',');
		dontNeedEncoding.set(';');
		dontNeedEncoding.set('=');

	}

	
	public static String encode(String url) {
		return encode(url, dfltEncName);
	}

	public static String encode(String urlString, String encoding) {
		try {
			URL url = new URL(urlString);
			StringBuilder urlStrBuilder = new StringBuilder();
			int port = url.getPort();
			String path = url.getPath();
			String query = url.getQuery();
			urlStrBuilder.append(url.getProtocol())
							.append("://")
							.append(url.getHost())
							.append(port > 0 ? ":" + port : "");
			
			if (path != null && !path.isEmpty()) {
				path = encodeString(path, encoding);
				urlStrBuilder.append(path);
			}
			if (query != null && !query.isEmpty()) {
				query = encodeString(query, encoding);
				urlStrBuilder.append("?").append(query);
			}
			return urlStrBuilder.toString();
		} catch (Exception e) {
			return urlString;
		}
	}

	private static String encodeString(String s, String enc) throws UnsupportedEncodingException {
		boolean needToChange = false;
		StringBuffer out = new StringBuffer(s.length());
		Charset charset;
		CharArrayWriter charArrayWriter = new CharArrayWriter();
		if (enc == null)
			throw new NullPointerException("charsetName");
		try {
			charset = Charset.forName(enc);
		} catch (IllegalCharsetNameException e) {
			throw new UnsupportedEncodingException(enc);
		} catch (UnsupportedCharsetException e) {
			throw new UnsupportedEncodingException(enc);
		}

		for (int i = 0; i < s.length();) {
			int c = (int) s.charAt(i);
			if (dontNeedEncoding.get(c)) {
				out.append((char) c);
				i++;
			} else {
				do {
					charArrayWriter.write(c);
					if (c >= 0xD800 && c <= 0xDBFF) {
						if ((i + 1) < s.length()) {
							int d = (int) s.charAt(i + 1);
							if (d >= 0xDC00 && d <= 0xDFFF) {
								charArrayWriter.write(d);
								i++;
							}
						}
					}
					i++;
				} while (i < s.length() && !dontNeedEncoding.get((c = (int) s.charAt(i))));

				charArrayWriter.flush();
				String str = new String(charArrayWriter.toCharArray());
				byte[] ba = str.getBytes(charset);
				for (int j = 0; j < ba.length; j++) {
					out.append('%');
					char ch = Character.forDigit((ba[j] >> 4) & 0xF, 16);
					if (Character.isLetter(ch)) {
						ch -= caseDiff;
					}
					out.append(ch);
					ch = Character.forDigit(ba[j] & 0xF, 16);
					if (Character.isLetter(ch)) {
						ch -= caseDiff;
					}
					out.append(ch);
				}
				charArrayWriter.reset();
				needToChange = true;
			}
		}
		return (needToChange ? out.toString() : s);
	}

}


저작자 표시
신고
Posted by 범 범2

댓글을 달아 주세요

1. 리눅스(데비안, 우분투, 레드헷, CentOS 등등) 


    $ ps -ef 



 2. AIX .

  

     리눅스와 동일한다.


     $ ps -ef 


3.  Solaris


      $ /usr/ucb/ps auwxw


  

4. HP-UX


       $ ps -efx



 5. BSD 

                        

       $ ps auxwww     

   


 6. Windows 



       $ WMIC path win32_process get Processid,Commandline


       

   

저작자 표시
신고
Posted by 범 범2
TAG ps

댓글을 달아 주세요

대략 두어 달 전..

자전거에 나의 Nexus 6P 를 매달고 빠른 속도로 내리막을 내지르다가 갑자기 튀어나온 요철에 급브레이크를 잡게 되었다.

덕분에 넥서스 6p 는 관성에 의해 총알처럼 튀어나갔고 아스팔트 바닥에 서너 바퀴 구른 뒤에 아래 사진과 같은 꼴을 하게 되었다.




다행히도 화면도 잘 나오고 기능 만큼은 정상적으로 동작하지만, 친구나 회사 사람이나 누구나 할 것 없이 모두 이렇게 한마디씩 했다.

"핸드폰은 언제 바꿀거에요?"


아직 바꾼지 1년도 안 되었는데... ㅜ_ㅜ



수리점을 찾았으나 나의 Nexus 6p 꼬락서니를 보고 고개를 절레절레 흔드는 분이 있는가 하면

정말로 휴대폰을 바꿀까 고민하게 만드는 많은 수리비용 덕분에 부품을 직접 구입하여 자가 수리하기로 하였다.

이왕이면 배터리도 새것으로 교체하는 것으로...



알리 익스프레스를 통하여 구입한 액정+터치 모듈. 

조금 허접하긴 하지만 일회용으로 쓸 수 있는 분해 도구도 함께 포함된다.


가격은 배송비 포함하여 70.30$ 들었다.

도착하는데 30일 가까이 걸렸다.


그리고, 이 녀석에게는 사소한 문제가 있었으니..



새 제품이 아닌 듯했다.

떼어낸 접착제 흔적과 써멀 페이스트 흔적, 그리고 기분 나쁜 얼룩을 보니 

온전한 제품을 각개격파하여 판매하는 것이 아닐까 하는 의구심이 생긴다.


아마도 액정을 제외한 다른 모듈에 불량이 생긴 제품을 각개 격파하여 파는 것은 아닐까?


내가 구입했던 디스플레이 모듈 판매 페이지의 상품평에는 별 다섯 개 만점과 

구매자들이 직접 입력한 좋은 평가들이 많았으니 한 번 믿고 써보도록 한다.



그리고, 알리에서 17.0$ 주고 구입한 프레임...


응?


원래 들어있어야 하는 부품은 찾아볼 수 없고 같은 부품이 두 개 들어있다.




ㅠ_ㅠ


결국, 프레임 아래쪽 덮개는 이미 있던 것을 재활용해야만 했다.











마지막으로...


문제의 배터리...


가격은 대략 11$밖에 안 하지만, 

배송일이 중국 국경절과 겹치고, 오는 중간에 소포가 분실되는 바람에 도착하는데 70일 넘게 걸렸다. 핳핳....

(분실된 제품은 판매자가 다시 보내줬다.)



70일 넘는 시간 동안 나는 



요 상태로 갖고 다녀야만 했다.





이제 본격적인 준비가 다 끝나고 추가로 사용한 공구 및 재료를 나열하면 


일자 드라이버

니퍼 

열풍기

핀셋

써멀 그리스 (MX-4)



이렇게 되겠다.




열풍기가 필요한 이유는 Nexus 6p 에 접착제와 양면 테잎이 너무 많이 들어가기 때문이다.

덕문에 수리 난이도가 꽤 높다.



분해 방법은 일단 아래 주소를 참고하였다.


https://gigglehd.com/zbxe/13487642






첫 번째 단계는 뒷 판 아래쪽에 있는 덮개를 제거하는 일이다.

아래 사진처럼 열풍기로 가열하여 접착 성분을 녹인 뒤에 제거한다.





위 사진처럼 일자 드라이버를 틈새 사이로 쑤셔 넣어 떼는 것보다 

접착 성분을 녹인 뒤에 강력한 초록 테이프로 붙여서 떼는 것이 훨씬 좋을 것 같다.






상단 덮개를 제거한다.

생각보다 깔끔하게 떨어지지 않기 때문에 산산조각내어 떼어내는 장면인데, 

이렇게 뗄 경우, 사방팔방에 유리 조각이 튈 수 있다.

 특히 미세한 파편이 눈에 들어가지 않도록 보호경을 껴야 한다.




상단 덮개가 모두 제거된 모습.


덮개를 모두 제거한 뒤에 보이는 나사를 모두 제거한다.





그 다음 단계로 위 사진과 같이 주어진 공구를 통하여 액정과 프레임을 분리해야 하는데, 

큰 문제가 있었다.




바닥에 떨어질 때 충격 때문에 위 사진처럼 프레임이 찌그러지는 바람에 

간단한 방법으로는 디스플레이 모듈이 쉽게 분리되지 않는다는 것이다.



결국, 특단의 조치를 내리게 되었다.

니퍼를 이용하여 프레임의 찌그러진 부분을 벌려주는 방법을 사용한다!!




이제 디스플레이 모듈과 프레임을 분리하기만 하면 된다.



분리된 프레임 안쪽




분리된 디스플레이 모듈 안쪽.


아이폰의 유니바디와 유사한 구조를 갖고 있는 것을 확인할 수 있다.




메인보드 좌측 하단에 있는 커넥터 덮개의 나사를 풀고 제거한다.



커넥터 세 개를 조심스럽게 모두 제거한다.



하단 기판의 커넥터를 제거한다.




아.... 

https://gigglehd.com/zbxe/13487642 <--- 요기 있는 사진은 배터리가 참 쉽게 분리 되던데..

내 것은 초강력 접착제로 딱 달라 붙여서 쉽게 제거되지 않는다.


안 쓰는 신용카드를 마구 쑤셔 넣어서 배터리를 접착제로부터 분리하려고 하니 배터리가 ㄴ 모양으로 휘어 버린다.

이러다 결국 초록 연기를 뿜으며 터지는 것 아닌지 노심초사했지만, 배터리가 직각이 되도록 꺾여도 아무 일도 발생하지 않았다.


넥 6p 는 제조 공정에서 장인정신으로 접착제를 정성스럽게 바른 것 같다.



분리된 배터리. 심하게 휘었지만, 손으로 핀 것이 저 모양이다.




전원 모듈의 나사를 모두 풀어주고 제거한다.




전원 모듈을 제거한 상태에서 스피커 박스를 분리해야 하는데...

스피커 박스의 단자(빨간 동그라미) 초 강력 접착제로 찰싹 붙어있다. ㅠ_ㅠ

힘으로 빼다가는 단자의 회로를 끊어먹을 수 있으니 열풍기로 충분히 가열하여 접착 성분을 녹인 뒤에 

핀셋으로 조심스럽게 스피커박스와 단자를 뽑는다.


진짜 겁나 힘들었다.


그리고 스피커 박스 단자의 접착 성분이 다시 굳기 전에, 새로운 디스플레이 모듈의 같은 위치에 옮긴다. 



스피커 박스와 마찬가지로 우측에 있는 진동 모터도 새 디스플레이 모듈로 옮긴다.

고무로 되어있는 빨간색 부속도 바로 옮겨준다.





마지막으로 전원 모듈 기판을 얹고 안테나 케이블 한쪽을 다시 연결한다.(흰색, 아래쪽에 보이는 케이블) 


이때, 잠깐 편의를 위하여 나사 하나를 임시로 조여준다. 

조립 도중에 전원 모듈이 계속 떨어지는 것을 방지하기 위함이다.






메인 보드의 전면 카메라, 3.5파이 이어마이크 단자의 금속 덮개를 제거한다.

(1) 이 3.5파이 단자이며, (2) 가 전면 카메라 모듈이다.



회로가 끊어지지 않도록 신경써서 커넥터를 제거한다.




분리된 3.5 파이 단자와 전면 카메라.

이 녀석들도 접착제(양면테잎) 이 발라져 있는데 매우 엉성하게 발라져 있어서 툭 건드니 바로 빠져버렸다.



모든 커넥터를 제거하고 메인 보드를 분리한다.

분홍색 부분은 방열을 위한 써멀 페이스트이며, 어차피 한 번 떼진 것은 다시 붙여도 효과가 떨어지기 때문에,

키친타올로 잘 닦아 내었다.




분리된 메인보드의 자태.





커넥터의 금속 덮개 (1) 와 전원, 볼륨 버튼 모듈을 기존의 디스플레이 모듈에서 새 디스플레이 모듈로 옮겼다. 



버튼 모듈의 회로가 단선 되어있는 것을 발견하였다. ㅠ_ㅠ

위 과정에서 니퍼로 프레임을 무리하게 피는 과정에서 충격이 가해진 것으로 판단된다.

결국 이 부품만 따로 주문하였고 10일 뒤에 다시 받아볼 수 있었다.



새로 받은 버튼 모듈




새 버튼 모듈을 새로운 디스플레이 모듈에 붙이고, 

기존의 써멀 페이스트를 깨끗이 닦아내었다.




기존의 써멀 페이스트가 있던 부분에 성능 좋은(하지만, 집에 굴러다니던..) 써멀 그리스를 도포하였다.



조립은 분해의 역순... 


일단 각 커넥터의 금속 덮개를 닫기 전에 전원을 넣고 잘 동작하는지 테스트 하였다.




이상 무.


액정 -> 상,하단 스피커 -> 전면 카메라 -> 3.5 파이 이어마이크 단자 -> 진동 모터 순으로 테스트 하고

모든 모듈이 정상 동작하는 것을 확인하였다.




음... 

평소에 넥서스 6p 를 사용하면서 느낀 것인데, 앞면과 저 부분에 많은 열이 발생한다.

열이 밖으로 잘 빠져나갈 수 있도록 써멀 그리스를 임의로 도포하였다.




이제 프레임을 닫아주고, 덮게를 부착한다.

오공본드를 사용하여 하단 덮게를 닫았다.



액정 테스트. 아무 이상 없는 것을 확인하였다.




자투리 부품. 




- 끝 -



저작자 표시
신고
Posted by 범 범2

댓글을 달아 주세요

  1. 111 2016.11.28 01:35 신고 Address Modify/Delete Reply

    이야.... 저도 생각중인데 액정이 걱정이네여 .. 혹시 번인있고 이상한액정올까봐 조마조마 그래도 70불이면 되게 싸게 구매하셨네요