System.out.println("Hello, World");


처음 누를때, 누른 상태로 이동할 때, 떨어질 떄 각각 다른 이벤트가 발생한다. 현재 화면좌표는 MotionEvent의 getX, getY메서드로 조사한다. 

곡선을 구성하는 점의 개수는 제한이 없으므로 고정 크기의 배열을 사용해서는 안되며 반드시 가변 크기를 지원하는 컬렉션을 사용해야 한다. 

추가만 되고, 중간에 삽입, 삭제할 일을 없으므로 배열형식의 ArrayList가 적합하다. 

Posted by 김마농

가장 중요한거부터 언급

- 리스너로 전달할 지역 변수는 final로 선언한다.




 텍스트뷰 객체를 mText 멤버로 선언하고 onCreate에서 딱 한번만 조사한다. onTouch에서는 텍스트 뷰를 따로 구할 필요 없이 mText 멤버를 참조하면 된다. 메서드로 뭔가 전달할 것이 있으면 인수를 사용하는 것이 문법적인 정석이다. 그러나 이벤트 핸들러의 경우 인터페이스에 의해 원형이 고정되어 있으므로 인수를 더 추가할 방법이 없다. 그래서 어떡하든 핸들러내에서 참조할 수 있는 형태로 전달해야 하는 것이다.


이 방법도 문제가 있는데 리스너가 아주 많을 경우 각 리스너로 전달할 변수를 일일히 클래스의 멤버로 선언하자면 외부 클래스가 너무 뚱뚱해진다는 것이다. 멤버란 클래스의 상태를 저장하는 변수이지 정보 전달용이 아니다. 외부 클래스를 날씬하게 유지하려면 특정 리스너로 전달할 값은 메서드의 지역 변수로 선언해야 한다. 이런 경우는 코드가 조금 더 복잡해진다. 



onTouch가 호출되었을때는 outText 변수가 존재하지 않으므로 outText의 실제값을 참조할 수 없다. 미래에 호출될 리스너에게 현재의 지역 변수값을 전달하는 것은 불가능하다. 

이에 비해 지역 변수에 final을 붙이면 더 이상 변경할 수 없는 상수가 되므로 onTouch를 등록하는 시점에 그 값을 분명히 전달 할 수 있다. 

onTouch 메서드에서 참조하는 outText는 리스너가 등록될 시점의 값을 가지는 상수객체이다. outText변수와 onTouch 리스너는 생성 시점과 등록 시점이 같지만 존재 기간은 서로 다르다. outText는 일개 지역 변수이지만 onTouch는 리스너로 등록되므로 사실상 전역적으로 지속된다.




Posted by 김마농

1. 콜백 메서드 정의하기 

- 이벤트를 받는 가장 쉬운 방법은 해당 클래스를 상속받아 콜백 메서드를 재정의하는 것이다. 콜백은 특정 이벤트가 발생했을때 시스템에 의해 자동으로 호출되는 메서드이며 이 메서드에 코드를 작성해 놓으면 이벤트 발생시의 동작을 정의 할 수 있다.

사용자와 상호 작용하는 주체가 뷰이므로 이벤트 콜백은 주로 뷰가 제공한다. 



2. 리스너 인터페이스 구현

- 이벤트 리스너는 통상 특정 뷰에 대해 정의되는 것이므로 외부에 선언할 필요 없이 액티비티 클래스 내부에 이너클래스로 선언한다. 

액티비티는 리스너 타입의 객체 TouchListener를 멤버로 선언 및 생성하고 뷰는 setOnTouchListener 메서드로 리스너 객체를 터치 이벤트와 연결했다.



리스너로 이벤트를 처리하는 절차를 간략하게 요약하면 다음과 같다.

 1) 리스너를 상속받는 클래스를 선언하고 추상 메서드를 구현한다.

 2) 리스너 객체 TouchListener를 선언 및 생성한다.

 3) 준비된 리스너 객체를 뷰의 이벤트와 연결한다.



3. 액비티비가 리스너 구현

- 안드로이드 프로젝트에는 최소한 액티비티 하나는 존재하므로 액티비티가 리스너 인터페이스를 구현하는 것도 물론 가능하다. 액비티비는 Activity 클래스를 이미 상속 받지만 인터페이스는 개수에 상관없이 얼마든지 더 상속받을 수 있다. 선언문에서 인터페이스를 상속받고 본체에 핸들러 메서드를 정의하면 된다. But 이렇게 만들어진 뷰는 액티비티에 강하게 종속된다는 면에서 기동성이 떨어진다. 이 뷰를 다른 액티비티에 재사용하려면 액티비티가 구현하는 리스너를 분리하여 다른 액티비로 옮겨야 한다. 뷰와 관련도니 메서드가 뷰 자신에게 포함되지 않고 부모가 구현해 주기 때문에 독립성이 떨어진다.


4. 뷰가 리스너 구현

 - 액티비티가 리스너를 구현 할 수 있다면 뷰도 마찬가지이다. 액티비비나 뷰나 둘 다 클래스이므로 임의의 인터페이스를 구현할 수 있다. 어떤 이유로든 뷰를 파생했다면 클래스 선언문이 있으므로 액티비티한테 빌붙을 필요 없이 뷰 스스로가 자신이 필요로 하는 리스너 인터페이스를 상속받아 구현하면 된다.


5. 익명 이너 클래스 사용

- 3, 4번은 간편하기는 하지만 인터페이스를 구현해 줄 적당한 클래스가 있을 때만 쓸수 있는 방법이므로 역시 일반적인 해법은 아니다. 

자바 이벤트 처리 방식의 특성상 하나당 객체 하나씩을 만들어야 하는데 이는 너무 번거로운 일이다. 이벤트 처리를 위해 꼭 필요한 알맹이는 사실 핸들러 메서드 뿐이다. 그러나 객체 지향 언어이다보니 메서드가 홀로 존재할 수 없으며 클래스 안에 넣어야 하고 객체를 생성한 후 등록하는 번거러운 과정을 거쳐야 한다. 

자바는 이런 경우를 위해 언어 차원에서 익명 이너 클래스라는 문법을 제공한다. 상위 클래스나 인터페이스의 메서드 하나를 재정의하기 위해 클래스를 선언하는 경우, 그리고 그 클래스의 객체가 단 하나만 필요한 경우는 굳이 클래스를 선언할 필요 없이 상속과 재정의를 동시에 할 수 있다.



6. 익명 이너 클래스의 임시 객체 사용

 - 익명클래스의 객체 TouchListener는 두 개를 생성할 수 없으며 오로지 하나만 생성할 수 있다. 특정 뷰에 대한 이벤트 핸들러로만 쓸 경우는 굳이 두 개를 생성할 필요도 없다. 

이럴때는 객체의 이름조차도 줄 필요가 없으며 임시 객체를 하나를 생성하여 등록 메서드의 인수로 전달해버리면 된다.



또한 핸들러의 우선순위는 

뷰의 리스터 -> 뷰의 onTouchEvent 콜백 메서드 -> 액티비티의 onTouchEvent 콜백 메서드로 보면 된다. 보다시피 좁은 범위일수록 우선 순위가 높은데 이는 상식과 일치한다. 그러나 이 우선순위가 절대적인것은 아니다. 각 핸들러는 리턴값으로 다음 순위 메서드의 호출 기회를 통제한다.


Posted by 김마농

http://tiles.apache.org/download.html


여기로 접속하여 


Binary distribution (Java 5.0 and above)


Sample web application


를 각각 다운 받는다.

그리고 tiles-2.2.2-bin.zip 압축을 풀어서 

tiles-api-2.2.2.jar
tiles-core-2.2.2.jar
tiles-jsp-2.2.2.jar
tiles-servlet-2.2.2.jar
tiles-template-2.2.2.jar

이것들이랑 lib 폴더안에 들어 있는 
commons-beanutils-1.8.0.jar
commons-digester-2.0.jar
jcl-over-slf4j-1.5.8.jar
slf4j-api-1.5.8.jar

그리고 optional 폴더안에 들어있는 
slf4j-jdk14-1.5.8.jar가 필요하다.

Posted by 김마농

1. 새로운 Workspace를 생성한다 "framework-sc"


2. ibatis란 이름으로 자바프로젝트를 생성한다. 


3. 오라클과 연동하는 작업을 한다. 


4. window -> preference -> enc로 검색하여  Workspace, CSS Files, HTML Files, JSP Files의 환경설정을 


UTF-8로 설정해준다.


5. ibatis -> 설정 - >java build path -> add external JARS 들어가서 ibatis다운 받은걸 등록한다.


6. 패키지 생성 config


7. ibatis 다운 받은 폴더에서 simple_example\com\mydomain\data에 있는 Account.xml과 SqlMapConfig.xml 2개를 config 패키지에 카피한다.


8. Account.xml 파일을 member.xml로 파일명을 변경한다.


9. Account.xml에서 6번 라인부터 모두 지운다.


10. SqlMapConfig로 들어가서 


<sqlMapConfig>

  <transactionManager type="JDBC" commitRequired="false">

    <dataSource type="SIMPLE">

      <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>

      <property name="JDBC.ConnectionURL" value="jdbc:oracle:this:@127.0.0.1:1521:XE"/>

      <property name="JDBC.Username" value="scott"/>

      <property name="JDBC.Password" value="tiger"/>

    </dataSource>

  </transactionManager>

  <sqlMap resource="config/member.xml"/>

</sqlMapConfig>

이렇게 설정해준다.

Posted by 김마농

http://blog.mybatis.org/로 접속


오른쪽에서 Java Downloads 들어감




search를 다음과 같이 변경하여 해당 항목을 다운로드 한다. 


Posted by 김마농
R1, R2, R3 라우터 관련 3문제
1. Show users을 이용해 접속된 사용자 현황 출력
2. AUX에 비밀번호 걸기

3. 생각이 안나는데 아마 E0의 IP설정인듯


그다음 허브와 컴퓨터를 연결하는 다이렉트 케이블 작업


WindowServer2000 문제

1. FTP

2. DNS(정방향)

3. Web사이트

4. TCP/IP 설정

5. DHCP

6. 등등 대표적인 유형들 나옴



Posted by 김마농

4. 로컬보안정책







5. 서비스 설정하기




6. 사용자 추가하기










Posted by 김마농

1. 네트워크 IP 설정하기






2. 시스템 부팅환경 설정하기





3. FTP 사이트 추가하기















Posted by 김마농

public class SoundExampleView extends View{
 SoundPool m_SoundPool;
 int m_Sound_id_1;
 int m_Sound_id_2;
 
 MediaPlayer m_Sound_Background;//배경음악
 MediaPlayer m_sound_1;
 MediaPlayer m_sound_2;
 public SoundExampleView(Context context){
  super(context);
  m_SoundPool = new SoundPool(5,AudioManager.STREAM_MUSIC,0);
  m_Sound_Background = MediaPlayer.create(context, R.raw.background2);
  m_sound_1 = MediaPlayer.create(context, R.raw.effect1);
  m_sound_2 = MediaPlayer.create(context, R.raw.effect2);
  m_Sound_Background.start();
  m_Sound_id_1 = m_SoundPool.load(context, R.raw.effect1,1);
  m_Sound_id_2 = m_SoundPool.load(context, R.raw.effect2,2);
  m_Sound_Background.start();
  setFocusable(true);
  
 }
 
 public boolean onKeyDown(int keyCode, KeyEvent event){
  if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
   //m_sound_1.start();
   m_SoundPool.play(m_Sound_id_1, 1, 1, 0, 0, 1);
  
  if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
   //m_sound_2.start();
   m_SoundPool.play(m_Sound_id_2, 1, 1, 0, 0, 1);
  if(keyCode == KeyEvent.KEYCODE_SPACE){
   if(m_Sound_Background.isPlaying())
   m_Sound_Background.pause();
   else
    m_Sound_Background.start();
   //화면을 갱신시켜준다.
   invalidate();
  }
 
  
  return super.onKeyDown(keyCode, event);
 }
 
 
 protected void onDraw(Canvas canvas){
  Paint p = new Paint();
  p.setTextSize(20);
  p.setColor(Color.WHITE);
  String str;
  //isPlaying 메서드를 통해 현재 상태를 얻어옵니다.
  if(m_Sound_Background.isPlaying())
   str="재생중";
  else
   str = "일시 정지줗ㅇ";
  canvas.drawText("배경음악 : "+ str, 0, 20,p);
   
 }
  
 }

 

 

 

public class SoundExample extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SoundExampleView(this));
    }
}

 

Posted by 김마농