python(2.7) 으로 웹페이지 parsing 을 하다보면 계속 만나게 되는 문제.

매번 까먹어서 짜증나서 블로그에 포스팅해놔야지


euc-kr 로 제작된 웹페이지를 urllib 등으로 데이터를 읽어와서

작업을 하려하면 한글이 무참히 깨지거나, 폭풍 error



이렇게, unicode로 변환 후 utf-8로 encoding 해주면 대부분 잘 된다.

홈페이지를 만들다 보면

유저가 모바일로 접속한것인지, 데스크탑으로 접속한건지

구별해야 할 때가 있다.


모바일로 접속했을 경우 모바일 웹을 보여줘야하고

데스크탑으로 접속했을 경우 PC웹을 보여줘야 하기 때문이다.

(물론 다른이유들도 있겠지만)


그리하여, 접속자가 모바일로 접속했는지 PC로 접속했는지 구별하는 방법을 알아보자





위와 같이 $_SERVER['HTTP_USER_AGENT'] 로 모바일인지 PC인지 등을 구별할 수 있다.

위의 소스는 일부러 iOS와 Android 를 나누었지만

나누지 않고 Mobile 로 구별할 수 도 있다.

Agent 로 오는 값은 다양한데 대표적으로 아래와 같은 목록이 있다.



위의 목록이면 거의 대부분의 '스마트폰'을 식별해 낼 수 있다.







위와 같은 페이스북 좋아요, 공유버튼을 만들어 달아보자



https://developers.facebook.com/docs/plugins/like-button

위의 링크로 접속하면 페이스북 좋아요 버튼을 만들 수 있다.




<그림1>



위의 그림1과 같은 모습을 볼 수 있는데. 각 텍스트에 내가 원하는 값들을 넣으면 쉽게 Code 를 작성해준다.


URL to Like 에 좋아요 갯수를 올릴 링크를 넣고

Layout 과 Action Type 을 지정해주고, 옵션을 선택하고 Get Code 를 누르면 된다.

[ 가운데 미리보기를 보면서 만들면 누구나 쉽게 만들 수 있다]




<그림2>


그림2와 같이 만들어 준 코드를 홈페이지 나 블로그에 적용 하기만 하면된다.

Body 내에 스크립트를 넣어두고,

아래칸의 코드를 버튼을 두고싶은 위치에 적용하면 된다.


위와 같은 소스를 적용하면!





위와 같이 해당 사이트에 대해 좋아요를 표시하고, 좋아요 버튼을 누름으로서 페이스북에 뉴스피드에 홍보효과까지 생긴다!


Android 앱 개발시 Java 7 사용하기

GDG Korea Android 의 공동 운영자이신 김기완(hl5pma 골뱅이 gmail.com) 님께서 
안드로이드의 새로운 빌드시스템인 gradle 설정을 통해, 작년 가을 새롭게 릴리즈된 Java 7 

컴파일러를 이용하여 안드로이드 어플리케이션을 개발하는 방법에 관한 내용을 정리해 주셨습니다.
개발자의 삶을 한층 더 편안하게 만들어줄 수 있는 Java 의 새로운 기능들을 함께 살펴보면 어떨까요?

buildToolsVersion 19 부터 Java 7 로 앱을 빌드할 수 있게 됨에 따라 gradle 빌드 스크립트에 아래 내용을 추가해주면 Java 7 의 특성들을 이용하여 앱을 개발할 수 있게 되었습니다.

android {
  compileSdkVersion 19
  buildToolsVersion "19.0.0"

  defaultConfig {
    minSdkVersion 7
    targetSdkVersion 19
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
}
안드로이드앱 개발시 이용할 수 있는 Java 7 의 특징들은 다음과 같습니다.

이진수 표현

숫자 앞에 "0b" 또는 "0B" 를 붙여 이진수 표현이 가능합니다.
int hex = 0x8;  // 16진수
int dec = 8;  // 10진수
int oct = 08; // 8진수
int bin = 0b101010; // 2진수

숫자 사이에 언더스코어(_)표시

숫자 사이에 언더스코어(_)를 넣을 수 있게 되어 가독성을 향상시킬 수 있게 되었습니다.
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

switch 구문에서 String 사용

그동안 switch 구문에 기본형과 열거형만 사용할 수 있었고 String 을 사용할때는 다수의 if else 문으로 제어문을 구성해야 했다면 Java 7 부터는 switch 구문에서 String 을 사용할 수 있게 되었습니다.
public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
  String typeOfDay;
  switch (dayOfWeekArg) {
    case "Monday":
      typeOfDay = "Start of work week";
      break;
    case "Tuesday":
      case "Wednesday":
      case "Thursday":
        typeOfDay = "Midweek";
        break;
      case "Friday":
        typeOfDay = "End of work week";
        break;
      case "Saturday":
      case "Sunday":
        typeOfDay = "Weekend";
        break;
      default:
        throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
  }
  return typeOfDay;
}

다이아몬드(<>)

제네릭 인스턴스를 생성할 때 그동안 인스턴스 선언/생성 양쪽에 모두 타입을 적어주었어야 했었습니다.
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
다이아몬드 기호(<>) 표시만으로 인스턴스 생성 부분에서의 타입을 생략할 수 있게 되었습니다.
Map<String, List<String>> myMap = new HashMap<>();

try-with-resources (Api level 19)

그동안 사용 후 close() 메서드를 호출하여 자원을 반납해야 했던 InputStream/OutputStream 등은 Java 7 에서 try 구문 시작시 간단한 선언으로 자동으로 자원반납이 가능하게 되었습니다.
static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
  BufferedReader br = new BufferedReader(new FileReader(path));
  try {
    return br.readLine();
  } finally {
    if (br != null) br.close();
  }
}
Java 7 이전까지는 이렇게 BufferedReader 를 사용하고 난 후 finlly 에서 close() 를 호출해 stream 을 닫아주어야 했었다면 아래 코드와 같이 try 구문이 시작할 때 BufferedReader 선언하면 try 구문이 끝날 때 자동으로 close() 를 호출하게 됩니다.
static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }
}
주의: AutoCloseable interface 에 의한 close() 호출이기 때문에 Api level 19(Kitkat) 버전부터 사용할 수 있습니다.

multi-catch Exception

그동안 예외를 처리할 때 서로 다른 예외간 처리방식은 동일함에도 불구하고 같은 내용의 코드를 중복 작성해야 하는 불편함이 있었습니다.
catch (IOException ex) {
    logger.log(ex);
    throw ex;
catch (SQLException ex) {
    logger.log(ex);
    throw ex;
}
Java 7 에서는 '|' 연산자로 여러개의 예외를 한번에 묶어 처리할 수 있게되었습니다.
catch (IOException|SQLException ex) {
  logger.log(ex);
  throw ex;
}

참고 사이트




-- 위 문서 출저: http://googledevkr.blogspot.kr/2014/01/using-java7-in-android.html

너무 좋은 문서라 퍼왔슴당

오늘은 Google I/O 2013 에서 발표되었던 Volley 라는 Network&ImageLoading Framework 에 대해서 블로깅 해보려고 합니다.

이번 프로젝트에서 저는 Network 통신을 위해서 사용한 라이브러리 인데, 매우 만족하고 이에 대해 블로깅하고 정보를 공유하고자 합니다.


Volley의 주요 기능은 다음과 같습니다.



  ● 요청작업큐(RequestQueue) + Thread pool을 이용한 동시 요청 지원.

  ● 요청별 우선 순위 : 목록조회와 이미지 다운로드를 할때 목록조회가 우선순위가 높게 설정. 다음 페이지의 목록조회를       요청하면 이전페이지의 이미지로딩이 끝나지 않아도 기다리지 않고 수행. 

      (A요청이 B요청보다 먼저 응답을 받아야 할 경 우와 같이)

  ● Transparent cache : 요청하는 쪽에서 Cache 적용여부를 의식하지 않아도 됨

  ● 이미지 로딩툴, NetworkImageVIew라는 View 제공

  ● 요청 취소 : 특정 요청, 해당 Context의 요청 모두 취소할 수 있고, 취소할 규칙도 지정 가능

  ● 진저브레드 이전의 HttpURLConnection의 버그 문제 해결 : 

      2013년 5월 The platform에 기고한 Android의 HTTP 클라이언트 라이브러리 기사에서 다룬 여러 오픈소스가 그랬던  

      것처럼 진저브레드 이상에서만 java.net.HttpURLConnection을 쓰는 로직이 들어가 있습니다.

  ● retry, backoff policy 지원, 확장 기능

  ● SPDY 지원 : 발표 당시에는 Volley의 tranport stack으로 OkHttp( http://square.github.io/okhttp/ ) 를 넣는 작업이 

      누군가가 진행하고 있다고 했는데, 기사를 작성한 이후에 따끈따끈하게 공개 되었습니다.

  ● JSON, XML, Image, protobuffer 등 다양한 Response형식을 처리하도록 확장 가능



위와 같이 아주 유용하고 필요한 기능들이 기본적으로 내장되어있으며, 오픈소스라서 사용자에 맞게 커스터마이징도 가능한 점도 굳굳!



그리고 StringRequest, JSONObjectRequest, JSONArrayRequest 등 형식에 맞는 Request도 별도의 작업 없이 가능합니다.


또한 많은 분들이 ImageLoading 즉 웹으로부터 이미지를 다운로드 받아서 보여주기 위한 라이브러리로도 많이사용하시는데요!

그 목적으로 사용하시기에도 아주 좋은 기능들이 가득 포함되어있습니다.

이미지 로딩 부분에서의 장단점을 다루기에는 너무 많은 양이기 때문에 좋은 블로그 글을 소개시켜드리겠습니다.

[Android의 이미지 로딩 라이브러리 -> http://helloworld.naver.com/helloworld/429368 ]



아무튼! 저는 Network 통신을 위한 기본적인 방법들을 소개해드릴겁니다.



Volley 사용하기


Volley를 기본적으로 다운로드하고 프로젝트에 import 했다고 가정한 상태에서 예제 소스를 통해서 설명드리겠습니다.



위와 같은 요청이 가장 기본적인 Volley의 NetworkRequest 방법입니다.

http://rootnix.in 에 Get Request  를 보내고 Response 를 받아오는 거죠.


  StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener)


위와 같이 String 만으로 받는것뿐 아니라, 요청에 파라미터를 넣고 응답받는 형식도 다른 형식으로 받을 수 도 있습니다.


위와 같이 JsonObject를 파라미터로 주고 Response 또한 JsonObject 로 받을 수 있어서 Restful Api 를 사용하기에 아주 좋습니다.


 JsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener)




Volley를 얼마나 잘 활용하느냐에 따라서 네트워크 통신 모듈을 작성하시는데 있어서 편리함과 유용함을 한번에 느끼실 수 있으실 겁니다 :D


더 자세한 활용법은 연락주시면 더 도와드리도록 하겠습니다.



Volley 다운로드 - git

 git clone https://android.googlesource.com/platform/frameworks/volley

https://android.googlesource.com/platform/frameworks/volley )

현재 진행중인 프로젝트를 진행하면서 어플에서 해당번호로 한뼘통화(스피커폰)를 거는 이슈가 있었다.

해당 이슈는 어려운부분은 아니지만 한글로 된 가이드를 찾아보지 못해서 이렇게 적어본다.



전화를 거는데는 TelephonyManager 와 통화상태를 확인할 StatePhoneReceive,

그리고 스피커폰을 제어할 AudioManager 가 필요하다.


그리고 Manifest 에

MODIFY_AUDIO_SETTINGS

CALL_PHONE

READ_PHONE_STATE

퍼미션이 필요하다.






이렇게 Permission 을 설정해줘야한다.

그리고 java 소스는 다음과 같다.




Android 어플을 개발 하다 보면 사진,음악,동영상 등을 만든 후 스토리지에 저장하는 일을 만나곤 한다.

저장해서 path를 불러온 후 사용하는것 까진 문제가 없는데, 보통 저장후에 저장한 파일을 리스트에 불러오는데에 문제가 발생하곤한다.


안드로이드는 미디어를 저장한 후 미디어저장소를 갱신하는데 까지 꽤 오랜 시간이 걸린다.

그래서 자신이 미디어를 저장함과 동시에 그 미디어를 스캐닝처리를 해주어야, 바로 재사용이 가능하다.






이와 같이 저장한 파일의 경로로 스캐닝 해주거나

주기적으로 스토리지 전체를 스캐닝 해주는 방법으로 해결할 수 있다.

그리고 위의 방법은 Intent 의 Action 만 바꿔줌으로서 action 을 지정 할 수 있다.



ps. 는 애인알람 개발하다 내가 필요해서 ...

안드로이드를 개발하면서 이클립스를 쓰는데..ㅋㅋ

단축키를 몰라서 아는 몇개만 썼었는데.. 더 좋은 퍼포먼스를 위해 단축키를 알아본다




Ctrl + / : 주석 처리 - 한 라인/블록에 대해 주석 처리 (추가 및 제거)


Ctrl + L : 특정 라인으로 이동


Ctrl + F6 : Editor 창간의 이동


Ctrl + F7 : View 이동 메뉴


Ctrl + F8 : Prespectives 이동 메뉴


Ctrl + D : 한라인 삭제 - 커서가 위치한 라인 전체를 삭제 한다.


Ctrl + J : Incremental find 이클립스 하단 상태 표시줄에 Incremental find 라고 표시되어 한 글자자씩 누를 때 마다 코드내의 일치하는 문자열로 이동 , 다시 Ctrl + J 를 누르면 그 문자열과 일치 하는 부분을 위/아래 방향키로 탐색이 가능하다.


Ctrl + N : 새로운 파일 / 프로젝트 생성


Ctrl + 1 (빠른교정) - 문 맥에 맞게 소스 교정을 도와 준다. 변수를 선언하지 않고 썼을경우 빨간색 에러 표시되는데 이 단축키를 적용하면 변수에 맞는 선언이 추가 되도록 메뉴가 나타난다.


Ctrl + 0 : 클래스 구조를 트리로 보기


Ctrl + Space :  Cotent Assist - 소스 구문에서 사용 가능한 메소드, 멤버들의 리스트 메뉴를 보여준다.


Ctrl + PageUp , Ctrl + PageDown : Edit 창 좌우 이동 - Edit 창이 여러개 띄워져 있을경우 Edit 창간의 이동 한다.


Ctrl + Shift + Down : 클래스 내에서 다음 멤버로 이동


Ctrl + Shift + M : 해당 객체의 Import 문을 자동 생성 - import 추가 할 객체에 커서를 위치 시키고 단축키를 누르면 자동적으로 import 문이 생성


Ctrl + Shift + O : import 문을 자동 생성 - 전체 소스 구문에서 import 안된 클래스의 import 문을 생성해 준다.


Ctrl + Shift + G : 해당 메서드 / 필드를 쓰이는 곳을 표시 - View 영역에 Search 탭에 해당 메서드 / 필드를 사용하는 클래스를 표시 해준다.


Alt + Shift + R : Refactoring (이름변경) - Refactoing 으로 전체 소스에서 이름변경에 의한 참조 정보를 변경해 준다.


F3 : 선언 위치로 이동


F11 : 디버깅 시작


F8 : 디버깅 계속


F6 : 디버깅 한줄씩 실행(step over)


F5 : 디버깅 한줄씩 실행 함수 내부로 들어감 (step into)


F12 : Editor 창으로 이동 (Debugging 등 자동적으로 포커스가 이동 됐을경우 편리)


Alt + Up , Alt + Down : 줄 바꿈 - 해당 라인을 위 / 아래로 이동 시킨다.


Alt + Shift + S : Source Menu - 소스메뉴 (Import 추가 , Comment 추가 , 각종 Generator 메뉴) 가 나타난다.


Alt + Shift + Up : 블록설정 - 소스 코드를 블록 단위로 설정해 준다.


Alt + Shift + Down : 블록해제 - 소스 코드를 블록 단위로 해제한다.


Alt + Shift + J : 주석 생성 - 해당 메서드/클래스에 대한 주석을 템플릿을 생성해 준다.


sysout + (Ctrl + Space) : System.out.println() 문장 삽입 - 코드 템플릿을 이용해서 소스 구문을 추가


(Windows -> Preferences -> JAVA -> Editor -> Templates 에서 자주 쓰는 소스 구문을 추가시키면 <템플릿 이름> + (Ctrl + Space) 로 소스 문장을 완성 시킬 수 있다.)


Alt + Shift + Z : Surround With 메뉴 - try / catch 문이나 for , do , while 등을 해당 블록에 감싸주는 메뉴가 나타난다.


Ctrl + Shift + F : 코드 포맷팅 - 코드 내용을 문법 템플릿에 맞게 포맷팅(들여쓰기) 해준다.


Ctrl + Alt + Down: 한줄 복사후 아래에 복사 넣기 - Copy&Paste 대체하는 단축키. 커서가 위치한 라인을 복사해 밑줄에 생성해 준다.


Ctrl + Shift +X : 대문자로 변환


Ctrl + Shift + Y : 소문자로 변환


Ctrl + Shift + L : 모든 단축키의 내용을 표시해준다.


Ctrl + Shift + B : 현재 커서 라인에 Break point 설정


Ctrl + Shift + T : 클래스 찾기



1. menu - Help - Install New Softerware

2. Click Add Button - http://www.jgit.org/updates - OK

3. checks the Eclipse EGit / JGit / JGit Command Line Interface - OK

 

Visual Basic Runtimes Pack
when we download software which made by Visual basic.
basically it need that runtime files as .ocx or .dll

by the way, if u dont have that runtime files, maybe error will come.
at that time, u can download this installation file.

thank u
 

티스토리 툴바