요즘 틈틈이 읽고 있는 책인데 상당히 괜찮은 것 같아서 소개합니다.

단순히 HTML과 CSS의 기능만 소개하는 정도가 아니라 보다 근원적인 뒷 배경 

이야기들과 각종 노하우들과 팁들이 소개되고 있는 책입니다.


책의 편집 형태도 장황한 산문식 설명이 아니라 보기 쉽고 가독성있게 핵심적인 설명으로 유익하게 보고 있는 책입니다.

단지 영문 자료라는 약간의 무거움은 있겠네요.



Jon Duckett, 「HTML & CSS - Design and Build Websites 」, John Wiley & Sons, Inc.


아래 사이트에 관련 소스들과 더 많은 자료들이 있습니다.


http://www.htmlandcssbook.com/


PDF 자료는 검색해 보면 나올 겁니다^^





TextView txt = (TextView)findViewById(R.id.txt);

txt.setLinksClickable(true);

txt.setMovementMethod(LinkMovementMethod.getInstance());

String urlNaver = "<a href='http://www.naver.com'>네 이 버</a><br>";

String urlGoogle = "<a href='http://www.google.com'>구 글</a>";


txt.setText(Html.fromHtml(urlNaver));

txt.append(Html.fromHtml(urlGoogle));





안드로이드 SQLite에 대해서 주의해야 할 사항


SQLiteOpenHelp 클래스의 두 abastract 메소드인 onCreate()와 onUpgrade()가 호출되는 시점에 대해서 주의해야 할, 그리고 알아야 할 사항이 있다.

여기서 MyDB는 SQLiteOpenHelper 클래스를 상속받은 클래스라고 할 경우

(class MyDB extends SQLiteOpenHelper)


 MyDB dbHelp = new MyDB(this);

  ⇒ 이 단계에서는 SQLiteOpenHelper를 상속 받은 MyDB의 생성자만 호출이
      되고 MyDB의 onCreate()는 아직 호출이 안된다.


      SQLiteDatabase db = dbHelp.getReadableDatabase() 혹은  
      dbHelp.getWritableDatabase()가 호출 될 때 비로소

      MyDB의 onCreate()가 호출되서 테이블이 생성이 된다. 


      getReadableDatabase()하는 시점에서 테이블이 없으면

      테이블이 새롭게 생성이 되고 기존 존재하면 그것을 Radable이나 Writable 중
      하나로 open한다.


 MyDB의 onUpgrade()가 호출되는 시점

  ⇒ super(context,"Test.db", null, 2); 의 맨 마지막 인자인 DB의
      version 값이 상향 조정될 때 호출된다.





현재 소스에 있는 특정 변수 명을 변경할 경우, 
소스가 클 경우는 해당 변수 명을 일일이 변경하는 건 다소 복잡한 작업이 된다.
이 문제를 한번에 해결하는 단축키를 이클립스에서 제공한다.


alt-shift-r : 변수명 변경(소스에서 이 변수를 한꺼번에 모두 바꿈)


바꾸고자 하는 변수 명에 커서를 둔 상태에서 alt-shift-r을 누르면 해당 변수 명이 블럭으로 선택되고 해당 변수 명을 변경한 후 Enter키를 치면 이 변수를 한꺼번에 모두 바꾼다.



아래와 같은 에러를 만나면 원인은 쓰레드 안에 쓰레드를 사용하였기 때문에 

오류가 발생하였다.


java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()


해결 방법은 쓰레드 안에 Handler를 새로 선언하여 사용하면 된다.


View.OnClickListener clickSomeThing = new View.OnClickListener(){

@Override

public void onClick(View v){

Handler mHandler = new Handler(Looper.getMainLooper());

mHandler.postDelayed(new Runnable(){

@Override

public void run() {

doSomeMethod(); //쓰레드 안에서 실행되는 쓰레드

}, 0);

}

};



안드로이드 WebView의 lodaData() 에서 한글 깨짐 방지


Load할 data가 "UTF-8" 일때,


WebView mWebView = (WebView)findViewById(R.id.webView1);

mWebView.getSettings().setDefaultTextEncodingName("UTF-8");


StringBuilder sb = new StringBuilder();
sb.append("<html><head></head><body><table cellpadding=\"3\"             
                                                                   cellsapcing=\"10\" width=\"750\">");
sb.append("<tr align=\"left\" bgcolor=\"#E5CC7F\">");
sb.append("<th>번 호</th>");
sb.append("<th>이 름</th>");
sb.append("<th>나 이</th>");
sb.append("</tr>");

... 중간 생략 ...

sb.append("</table></body></html>");


// Android 4.0 이하 버전

mWebView.loadData(sb.toString(),  "text/html", "UTF-8");  


// Android 4.1 이상 버전

mWebView.loadData(sb.toString(),  "text/html; charset=UTF-8", null);  


assets 폴더에 있는 HTML 파일을 WebView에 표시하는 방식도 있는데

본 소스는 메모리 상의 HTML을 막바로 WebView에 표시하는 방식이다.




HTML의 th와 td의 개념


<th>내용</th> : table head 약자로, 표의 제목을 쓰는 역할. bold체로 표시됨

<tr>내용</tr> : table row 약자로 가로줄을 만드는 역할

<td>내용</td> : table data 약자로 셀을 만드는 역할


<table border="1" width="350" >

   <tr align="center" >

        <th>Number</th>

        <th>Name</th>

   </tr>

   <tr align="center">

        <td>111</td>

        <td>Kim. S. Y</td>

   </tr>

   <tr align="center">

        <td>222</td>

        <td>Lee. K. H</td>

   </tr>

</table>




EditText로 입력을 받을 때 숫자만 입력 받고 문자가 포함되었을 경우 다시 
입력받도록 하기위한 간단한 코드이다.


xml layout이 다음과 같을 경우 
inputType="number"로하면 오직 양의 정수만 입력 가능하다. 
키보드에 특수 문자나 +, -, 소수점이 표시되더라도 오직 양의 정수만 입력
가능하다.

그리고 maxLength="4"로하면 4개의 숫자만 입력이 가능하다.
xml layout 파일을 아래와 같이 설정함을 통해서 숫자만 입력되도록 할수 있다.

    <EditText 
        android:id="@+id/editPhoneNum"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/txtPhoneNum"
        android:inputType="number"
        android:maxLength="4"
        android:textSize="40sp"/>

xml layout을 이용하거나 혹은 소스 상에서 체크할려면 다음과 같이 하는 방법도 
가능하다.

EditText editPhone = (EditText)findViewById(R.id.editPhoneNum);
try {
String str = editPhone.getText().toString().trim();

//아래 str에 숫자만 있을 경우는 NumberFormatException이 
                //발생치 않으나 숫자 이외의 어떤 문자가 포함되면 
                //NumberFormatException이 발생한다.
//따라서 이 Exception이 발생하면 숫자 이외의 값이 입력되었다고 
                //판단하고 재 입력 받도록 처리하면된다.

int rt = Integer.parseInt(str);
Toast.makeText(this, "RT : "+rt, 1).show();
} catch(NumberFormatException e){
Toast.makeText(this, "숫자만 입력하세요", 1).show();
}

한 마디로

Integer.parseInt()를 이용하되 NumberFormatException을 이용해서 
처리할 수 있다.


윈도우에서 특정 pid의 서비스, 애플리케이션 죽이기


가끔 특정 프로그램이 종료되지 않고 권한 거부 메시지를 내 보낼때 처리하는 

방법이다.


DOS 창(커맨더 창)을 띄운 뒤 아래 명령어로 처리.

C:\>taskmgr (작업 관리자 창 띄우는 명령)

C:\>taskkill /f /pid 0000 

작업 관리자 창에서 특정 pid 값을 가진 서비스/애플리케이션 등을 kill



<?
session_start();
echo "세션 시작";
?>

위의 php 코드에서 아래와 같은 에러가 발생할 때

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\APM_Setup\htdocs\kkk\vvv.php:1) in C:\APM_Setup\htdocs\kkk\vvv.php on line 3


원인은 session_start() 앞에 다른 명령어가 없어야 되는데 있을 때 발생한다.
그런데 위의 코드에서 다른 명령어가 없는데도 이런 에러 발생하는 경우가 있는데
그 이유는 이 파일을 저장할 때 utf-8로 저장을 하면 발생한다.
이유는 utf-8의 경우는 문서를 저장할 때 문서 맨 앞에 특정한 3byte를 집어 넣는다.
이유는 utf-8임을 구별하기 위해서 이다.

따라서 이 문제가 발생하지 않을려면 방법은 두 가지

① ANSI로 저장하면 된다. 그런데 이건 웹 브라우저를 셋팅할 때 euc-kr로 설정되어 있으면 문제가 없지만 utf-8로 설정되어 있으면 ANSI로 저장한 상태에서 한 글을 사용하면 웹브라우저에서 한글이 깨지는 문제가 발생한다. 왜냐하면 ANSI는 한글을 euc-kr 형태로 표현하기 때문이다.


② utf-8로 저장하되 BOM 없음으로 저장하면 된다.
utf-8을 BOM 없음으로 저장할려면 윈도우 메모장에서는 안된다. 
Notepad++ 과 같은 것으로는 가능하다.


그런데 또 문제는 utf-8 BOM 없음으로 저장하면 한글이 깨지는 경우가 발생한다.
이 문제를 해결할려면 다음 코드를 넣으면 된다. 니하하하~~~

header("Content-Type:text/html; charset=utf-8"); ==> 이 코드를 넣어 주면 한글 깨지는 문제를 해결 할 수 있다.
혹시 euc-kr일 경우는 utf-8 대신에 euc-kr을 넣어 주면 된다.
아래 샘플 코드이다.


<?php

session_start();

header("Content-Type:text/html; charset=utf-8");

echo ("세션이 시작되었습니다. UTF-8 BOM 없음 입니다.");

?>


+ Recent posts