http://tutorialforlinux.com/2013/11/26/how-to-install-android-ndk-development-kit-on-debian-linux-easy-guide/

각기 다른 서버로 파일을 전송할 때 유용하다


scp -r 옮길파일 또는 디렉토리(예:/eclipse) 아이디(예:root)@아이피:옮길 파일 경로

하여 옮길 서버의 비밀번호를 입력해 주면 복사된다.

리눅스용 이클립스를 다운받아 원하는 폴더에 넣고 압축을 풀어 준다.


관리자 계정으로 접속 후


mv  /이클립스 압축 푼 디렉토리/eclipse /opt

하여 opt경로에 이클립스를 이동 후 링크를 걸어 준다


ln -s /opt/eclipse/eclipse /usr/bin/eclipse

이제 어디서든 이클립스를 실행할 수 있다.


이클립스에서 properties파일에 한글을 입력하면 깨져서 나오게 된다

해결하기 위해선 해당 플러그인을 설치 해야 한다


Plug-in 설치 주소 : http://propedit.sourceforge.jp/eclipse/updates/


에서 PropertiesEditor만 체크하고 설치하면 된다.

Window >> Preferences >> Java >> Code Style >> Code Templates >> Comments


Files (*.java, *.jsp 등, 파일 맨 위에 생성되는 주석 설정)

 

/**

* <pre>

* 1. 프로젝트명 : ${project_name}

* 2. 패키지명(또는 디렉토리 경로) : ${package_name}

* 3. 파일명 : ${file_name}

* 4. 작성일 : ${date} ${time}

* 5. 작성자 : ${user}

* 6. 설명 :

* </pre>

*/


 

Types (클래스명 바로 위에 생성되는 주석 설정)

 

/**

* <pre>

* 1. 패키지명 : ${package_name}

* 2. 타입명 : ${file_name}

* 3. 작성일 : ${date} ${time}

* 4. 작성자 : ${user}

* 5. 설명 :

* </pre>

* ${tags}

*/


 

Methods (메소드명 바로 위에 생성되는 주석 설정)

생성자나 오버라이드되는 메소드, 또는 getter/setter는 별도 설정

 

/**

* <pre>

* 1. 메소드명 : ${enclosing_method}

* 2. 작성일 : ${date} ${time}

* 3. 작성자 : ${user}

* 4. 설명 :

* </pre>

* ${tags}

*/

 

 



* 자주 쓰이는 설정(예, ${date})

date : Current date (현재 날짜)

time : Current time (현재 시간)

user : User name (사용자 이름)

enclosing_type :The type enclosing the method (선택된 메소드의 타입)

file_name : Name of the enclosing compilation (선택된 파일 이름)

package_name : Name of the enclosing package (선택된 패키지 이름)

project_name : Name of the enclosing project (선택된 프로젝트 이름)

tags : Generated Javadoc tags (@param, @return...) (Javedoc 태그 생성)



메소드나 클래스 바로 위에 주석(/**) 시작 입력하고 엔터 누르면 자동으로 위에서 설정한 주석 템플릿이 생성된다.

참고로 주석입력 단축키는 ALT + SHIFT + J 이다.


안드로이드, 또는 자바 프로그래밍을 할 때 아주 높은 빈도로 등장하는 키워드 중 하나가 'synchronized' 입니다.
쓰레드(Thread)를 이용해서 프로그래밍을 할 때 동기화를 맞추기 위해서 사용하는 명령어죠.


무작정 synchronized를 남발하거나 사용하다보면 프로그램 성능이 저하되거나 오동작, 또는 오히려 락(Lock)이
발생되는 경우가 있는데, 놓치기 쉬운 synchronized의 개념에 대해 확실히 알고 넘어가야 될 것 같습니다. 

public class SynchronizedTest

{

public synchronized void A()

{

System.out.println("Method A");

}

public synchronized void B()

{

System.out.println("Method B");

}

public void C()

{

System.out.println("Method C");

}

}

위와 같은 클래스가 있다고 가정할 때, 메소드 A와 메소드 B는 synchronized가 사용되어져 있습니다.
다수의 쓰레드를 사용하는 프로그램에서 class SynchronizedTest 의 인스턴스 내부의 메소드 A, B, C에 접근할 때,
메소드 A와 메소드 B는 동시에 진입이 불가능합니다.


쓰레드 1과 쓰레드 2가 있다고 가정하면 쓰레드 1이 메소드 A를 수행하는 동안, 쓰레드 2는 메소드 A와 메소드 B에 
접근이 제한
이 됩니다.
많이 착각하는 오류 중 하나가 쓰레드 1이 메소드 A를 수행할 때, 쓰레드 2는 메소드 A로의 접근만 제한이 되는 걸로 
생각하는 경우가 있는데 그게 아니라 메소드 A와 메소드 B 모두 접근이 제한됩니다. 


그 이유는 다음과 같습니다.

public synchronized void A()

{

System.out.println("Method A");

}

이렇게 메소드 전체에 synchronized가 걸린 경우는 


public void A()

{

synchronized (this)

{

System.out.println("Method A");

}

}

이것과 같습니다. this, 즉 현재 클래스의 인스턴스를 이용해서 락(Lock)을 걸기 때문입니다.
그렇게 때문에 한 인스턴스 내에서 synchronized된 메소드들은 여러 개의 쓰레드에서 동시에 진입이 불가능합니다.

즉, 함부로 synchronized를 남발하다가는 상당히 심각한 성능 저하가 발생할 수 있습니다.


그리고 여기서 알 수 있는 또 다른 점은 락은 인스턴스마다 존재한다는 점입니다. 
즉, class SynchronizedTest의 인스턴스를 여러 개 만들었다면, 각각의 인스턴스마다 락이 따로 존재하게 됩니다.


하지만, 만약 static을 이용해서

public static synchronized void A()

{

System.out.println("Method A");

}

가 된다면 이야기는 조금 달라집니다. 이 메소드는 각 인스턴스마다 생기는 고유의 메소드가 아니라 
static으로 설정되어진 메소드이기 때문에


public void A()

{

synchronized (SynchronizedTest.class)

{

System.out.println("Method A");

}

}

이것과 같은 코드가 됩니다.


synchronized는 쓰레드 기반의 프로그래밍을 할 때 상당히 중요한 키워드이기 때문에
그 개념은 확실히 알고 넘어가야 할 것 같습니다.

String path = DictionaryFactory.class.getResource("").getPath();

자바에서 이메일 발송을 구현하기 위해서는
Java Mail 라이브러리와 JAF(JavaBeans Activation Framework) 라이브러리를 추가해주어야 한다.

Java Mail 다운로드 바로가기 >> http://java.sun.com/products/javamail/downloads/index.html
JAF 다운로드 바로가기 >> http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html


 
01.import java.util.*;
02.import javax.mail.*;
03.import javax.mail.internet.*;
04.
05.public class TestEmailSender {
06. private static final String emailHost = "smtp.gmail.com";
07. private static final String emailId = "Gmail 계정";
08. private static final String emailPw = "Gmail 비밀번호";
09.
10. public void sendEmail(String from, String to, String subject, String content) {
11. Properties props = new Properties();
12. props.put("mail.smtp.starttls.enable", "true");
13. props.put("mail.smtp.host", emailHost);
14. props.put("mail.smtp.auth", "true");
15.
16. EmailAuthenticator authenticator = new EmailAuthenticator(emailId, emailPw);
17.
18. Session session = Session.getInstance(props, authenticator);
19.
20. try {
21. Message msg = new MimeMessage(session);
22. msg.setFrom(new InternetAddress(from));
23. msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
24.
25. msg.setSubject(subject);
26. msg.setContent(content, "text/html; charset=EUC-KR");
27. msg.setSentDate(new Date());
28.
29. Transport.send(msg);
30. } catch (MessagingException e) {
31. e.printStackTrace();
32. }
33. }
34.
35. class EmailAuthenticator extends Authenticator {
36. private String id;
37. private String pw;
38.
39. public EmailAuthenticator(String id, String pw) {
40. this.id = id;
41. this.pw = pw;
42. }
43.
44. protected PasswordAuthentication getPasswordAuthentication() {
45. return new PasswordAuthentication(id, pw);
46. }
47. }
48.
49. public static void main(String[] args) {
50. String subject = "Gmail을 통한 Java Email 발송 테스트";
51. String content = "Gmail을 통한 Java Email 발송 테스트입니다.";
52. String from = "보내는 이메일 주소";
53. String to = "받을 이메일 주소1,받을 이메일 주소2";
54. // 받을 이메일 주소는 반드시 ","로 구분해준다.
55.
56. new TestEmailSender().sendEmail(from, to, subject, content);
57. }
58.}

public class Test implements  KeyListener {  .......

//이 두개를 동시에 해줘야 텝이벤트가 먹는다...
  id_tf.addKeyListener(this);
  id_tf.setFocusTraversalKeysEnabled(false);

 

//다음과 같이 걸어주면 된다.

 public void keyPressed(KeyEvent e) {
  if(e.getKeyCode()==KeyEvent.VK_TAB && e.getSource()==id_tf){
       pw_tf.requestFocus();
  }
  
  if(e.getKeyCode()==KeyEvent.VK_TAB && e.getSource()==pw_tf){
       login_bt.requestFocus();
  }
 }
 
 public void keyTyped(KeyEvent e) {
 }
 
 public void keyReleased(KeyEvent e) {
 }


 // 테스트 (다이얼로그 띄우기)
 public void testMI() {
  JDialog testJD = new JDialog(this, "진행중...", true);
  JPanel testJP = new JPanel(new BorderLayout(5, 5));
  ImageIcon ii = new ImageIcon("./img/loading.gif");
  testJP.add(new JLabel(ii));
  testJD.add(testJP);
  point(testJD);
 
  testJD.setSize(200, 140);
 
  testJD.setVisible(true);
 
  // 진행 끝나면 (testJD 멤버로) 버튼을 사용해도 좋다
  testJD.dispose();
 }



// JDialog 좌표 설정
 public void point(JDialog jd) { 
  // PointerInfo사용, 좌표값을 얻어 사용자가 클릭한 곳에 화면을 출력
  PointerInfo pointerInfo = MouseInfo.getPointerInfo();
  pointerInfo.getLocation();
  Dimension my = jd.getSize();
  jd.setLocation(pointerInfo.getLocation().x - my.width / 2,
    pointerInfo.getLocation().y - my.height / 2);
 }

+ Recent posts