반응형

File Writing 부분은 작성하지 않았음...

 

여러모로 문제가 있음

 

참고용...


import java.net.URLEncoder;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.*;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; 
 
public class getMsrstnAcctoRltmMesureDnsty {
 

    // tag값의 정보를 가져오는 메소드
private static String getTagValue(String tag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
    Node nValue = (Node) nlList.item(0);
    if(nValue == null) 
        return null;
    return nValue.getNodeValue();
}

public static void main(String[] args) {
int page = 1; // 페이지 초기값 
     int totalCount = 0; // 전체 건수
    
     int nowCnt = 0; // 현재 페이지의 건수
    
     // JSON Object 
     JSONArray jitem = new JSONArray(); 
    
    
    
try{
while(true){

 // 서비스 인증키입니다. 공공데이터포털에서 제공해준 인증키를 넣어주시면 됩니다.         
            String serviceKey = "키입력";
             
             
            // 한페이지에서 읽어올 개수
            String numOfRows   = "5";         
            
            // 한글은 encoding 수행합니다.
         String stationName = URLEncoder.encode("종로구", "UTF-8");
         String ver         = "1.0";
         String dataTerm    = "DAILY";
         String RtnType     = "XML";
    
     StringBuffer jsonSb = null;
        
        
            String urlStr = "http://openapi.airkorea.or.kr/"
                    + "openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty"
                    + "?"
                    + "ServiceKey="  + serviceKey
                    + "&stationName=" + stationName
                    + "&dataTerm="  + dataTerm 
                    + "&pageNo=" + page
                    + "&numOfRows=" + numOfRows                    
                    + "&ver=" + ver 
                    + "&_retrunType=" + RtnType
                    ;
            
DocumentBuilderFactory dbFactoty = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactoty.newDocumentBuilder(); 
Document doc = dBuilder.parse(urlStr);



if ( page == 1 ) { 
// 파싱할 tag
NodeList nListT = doc.getElementsByTagName("body");

Node nNodeT = nListT.item(0);
if(nNodeT.getNodeType() == Node.ELEMENT_NODE){

Element eElementT = (Element) nNodeT; 

totalCount = Integer.parseInt(getTagValue("totalCount", eElementT));
} // for end

}

// root tag 
doc.getDocumentElement().normalize();  

// 파싱할 tag
NodeList nList = doc.getElementsByTagName("item");


//JSONObject
for(int temp = 0; temp < nList.getLength(); temp++){
Node nNode = nList.item(temp);
if(nNode.getNodeType() == Node.ELEMENT_NODE){

Element eElement = (Element) nNode;

JSONObject jobj = new JSONObject();


jobj.put("dataTime",  getTagValue("dataTime", eElement).toString());
// jobj.put("so2Value",  Float.parseFloat(getTagValue("so2Value", eElement).toString()));
// jobj.put("coValue",   Float.parseFloat(getTagValue("coValue", eElement).toString()));
// jobj.put("o3Value",   Float.parseFloat(getTagValue("o3Value", eElement).toString()));
// jobj.put("pm10Value", Float.parseFloat(getTagValue("pm10Value", eElement).toString()));
// jobj.put("pm25Value", Float.parseFloat(getTagValue("pm25Value", eElement).toString()));
// jobj.put("khaiValue", Float.parseFloat(getTagValue("khaiValue", eElement).toString()));
// jobj.put("khaiGrade", Float.parseFloat(getTagValue("khaiGrade", eElement).toString()));
// jobj.put("so2Grade",  Float.parseFloat(getTagValue("so2Grade", eElement).toString()));
// jobj.put("coGrade",   Float.parseFloat(getTagValue("coGrade", eElement).toString()));
// jobj.put("o3Grade",   Float.parseFloat(getTagValue("o3Grade", eElement).toString()));
// jobj.put("no2Grade",  Float.parseFloat(getTagValue("no2Grade", eElement).toString()));
// jobj.put("pm10Grade", Float.parseFloat(getTagValue("pm10Grade", eElement).toString()));
// jobj.put("pm25Grade", Float.parseFloat(getTagValue("pm25Grade", eElement).toString()));

jobj.put("so2Value",  getTagValue("so2Value", eElement).toString());
jobj.put("coValue",   getTagValue("coValue", eElement).toString());
jobj.put("o3Value",   getTagValue("o3Value", eElement).toString());
jobj.put("pm10Value", getTagValue("pm10Value", eElement).toString());
jobj.put("pm25Value", getTagValue("pm25Value", eElement).toString());
jobj.put("khaiValue", getTagValue("khaiValue", eElement).toString());
jobj.put("khaiGrade", getTagValue("khaiGrade", eElement).toString());
jobj.put("so2Grade",  getTagValue("so2Grade", eElement).toString());
jobj.put("coGrade",   getTagValue("coGrade", eElement).toString());
jobj.put("o3Grade",   getTagValue("o3Grade", eElement).toString());
jobj.put("no2Grade",  getTagValue("no2Grade", eElement).toString());
jobj.put("pm10Grade", getTagValue("pm10Grade", eElement).toString());
jobj.put("pm25Grade", getTagValue("pm25Grade", eElement).toString());

  JSONParser jsonParser = new JSONParser();
jitem.add(jsonParser.parse(jobj.toJSONString()));

    
} // for end
} // if end



nowCnt = page * Integer.parseInt(numOfRows);

page += 1;

 
if(nowCnt > totalCount){
break;
}
} // while end

} catch (Exception e){
e.printStackTrace();
} // try~catch end

System.out.println("[message]:" + jitem.toJSONString());
System.out.println("End of Main");
} // main end 
   
  }
   


반응형

'4차 산업 > ELK 관련' 카테고리의 다른 글

Logstash 대기 오염 관련 Json 처리 예제  (0) 2019.03.21
반응형

input {

  file {

    type => "json"

    codec => "json" {

        charset => "utf-8"

    }

    path => "/test.json"

    start_position => "beginning"

    sincedb_path => "/dev/null"

  }

}

filter {

  json {

   source => "message"

  }


  # split records tag

  split {

        field => "[records]"

  }


  # new json type append

  if [records][so2Grade] {

  mutate {

        add_field => {

                "so2Grade"    => "%{[records][so2Grade]}"

                "pm25Grade1h" => "%{[records][pm25Grade1h]}"

                "pm10Value24" => "%{[records][pm10Value24]}"

                "khaiValue"   => "%{[records][khaiValue]}"

                "so2Value"    => "%{[records][so2Value]}"

                "coValue"     => "%{[records][coValue]}"

                "pm10Grade1h" => "%{[records][pm10Grade1h]}"

                "o3Grade"     => "%{[records][o3Grade]}"

                "pm10Value"   => "%{[records][pm10Value]}"

                "khaiGrade"   => "%{[records][khaiGrade]}"

                "pm25Value"   => "%{[records][pm25Value]}"

                "no2Grade"    => "%{[records][no2Grade]}"

                "pm25Value24" => "%{[records][pm25Value24]}"

                "pm25Grade"   => "%{[records][pm25Grade]}"

                "mangName"    => "%{[records][mangName]}"

                "coGrade"     => "%{[records][coGrade]}"

                "dataTime"    => "%{[records][dataTime]}"

                "no2Value"    => "%{[records][no2Value]}"

                "pm10Grade"   => "%{[records][pm10Grade]}"

                "o3Value"     => "%{[records][o3Value]}"

        }


        # remove split records

        remove_field => [ "[fields]", "[records]" ]

  }


   # convert field

   mutate {

       convert => {

         "so2Grade"    => "float"

         "pm25Grade1h" => "float"

         "pm10Value24" => "float"

         "khaiValue"   => "float"

         "so2Value"    => "float"

         "coValue"     => "float"

         "pm10Grade1h" => "float"

         "o3Grade"     => "float"

         "pm10Value"   => "float"

         "khaiGrade"   => "float"

         "pm25Value"   => "float"

         "no2Grade"    => "float"

         "pm25Value24" => "float"

         "pm25Grade"   => "float"

         "coGrade"     => "float"

         "no2Value"    => "float"

         "pm10Grade"   => "float"

         "o3Value"     => "float"

         "mangName"    => "string"

      }

   }

}

output {

    stdout { codec => json }

    file {

        codec => json_lines

        path => "/output_test.json"

    }

    elasticsearch {

       hosts => "localhost"

       index => "atmosphere"

    }

}


======================================================


input {

  file {

    type           => "json"

    #codec          => "json"

    codec          => "plain"

    path           => "/media/sf_Class/jptest/jongrogu20190320.json"

    start_position => "beginning"

    sincedb_path   => "/dev/null"

  }

}

filter {

  json {

        source => "message"

  }


  # split records tag

  split {

        field => "[records]"

  }


  # new json type append

  mutate {

        # remove split records

        remove_field => [ "[fields]", "[records]" ]

        add_field => {

                "so2Grade"    => "%{[records][so2Grade]}"

                "pm25Grade1h" => "%{[records][pm25Grade1h]}"

                "pm10Value24" => "%{[records][pm10Value24]}"

                "khaiValue"   => "%{[records][khaiValue]}"

                "so2Value"    => "%{[records][so2Value]}"

                "coValue"     => "%{[records][coValue]}"

                "pm10Grade1h" => "%{[records][pm10Grade1h]}"

                "o3Grade"     => "%{[records][o3Grade]}"

                "pm10Value"   => "%{[records][pm10Value]}"

                "khaiGrade"   => "%{[records][khaiGrade]}"

                "pm25Value"   => "%{[records][pm25Value]}"

                "no2Grade"    => "%{[records][no2Grade]}"

                "pm25Value24" => "%{[records][pm25Value24]}"

                "pm25Grade"   => "%{[records][pm25Grade]}"

                "mangName"    => "%{[records][mangName]}"

                "coGrade"     => "%{[records][coGrade]}"

                "dataTime"    => "%{[records][dataTime]}"

                "no2Value"    => "%{[records][no2Value]}"

                "pm10Grade"   => "%{[records][pm10Grade]}"

                "o3Value"     => "%{[records][o3Value]}"

        }


  }


 # validation

  mutate {

           gsub =>  [

                       "so2Grade" ,    "[^0-9.]" , "",

                       "pm25Grade1h" , "[^0-9.]" , "",

                       "pm10Value24" , "[^0-9.]" , "",

                       "khaiValue" ,   "[^0-9.]" , "",

                       "so2Value" ,    "[^0-9.]" , "",

                       "coValue" ,     "[^0-9.]" , "",

                       "pm10Grade1h" , "[^0-9.]" , "",

                       "o3Grade" ,     "[^0-9.]" , "",

                       "pm10Value" ,   "[^0-9.]" , "",

                       "khaiGrade" ,   "[^0-9.]" , "",

                       "pm25Value" ,   "[^0-9.]" , "",

                       "no2Grade"  ,   "[^0-9.]" , "",

                       "pm25Value24" , "[^0-9.]" , "",

                       "pm25Grade" ,   "[^0-9.]" , "",

                       "coGrade" ,     "[^0-9.]" , "",

                       "no2Value" ,    "[^0-9.]" , "",

                       "pm10Grade" ,   "[^0-9.]" , "",

                       "o3Value" ,     "[^0-9.]" , ""

                    ]

  }




  # convert field

  mutate {

       convert => {

         "so2Grade"    => "float"

         "pm25Grade1h" => "float"

         "pm10Value24" => "float"

         "khaiValue"   => "float"

         "so2Value"    => "float"

         "coValue"     => "float"

         "pm10Grade1h" => "float"

         "o3Grade"     => "float"

         "pm10Value"   => "float"

         "khaiGrade"   => "float"

         "pm25Value"   => "float"

         "no2Grade"    => "float"

         "pm25Value24" => "float"

         "pm25Grade"   => "float"

         "coGrade"     => "float"

         "no2Value"    => "float"

         "pm10Grade"   => "float"

         "o3Value"     => "float"

      }

   }


  # date

  date {

        match => ["dataTime" , "yyyy-MM-dd HH:mm"]

  }


}



output {

    stdout { codec => rubydebug }

    file {

        codec => json_lines

        path => "/media/sf_Class/jptest/output_test.json"

    }

#    elasticsearch {

#       hosts => "localhost"

#       index => "atmosphere"

#    }

}




반응형
반응형


Oracle version이 10.2.0.4로 동일하고 DB간 character set 도 동일하다고 가정한다면....

 

그냥 데이타파일을 copy하면 안되고요...

Cross-Platform Transportable Tablespaces 기능을 사용하시면 됩니다.

 

이때 Source 와 Target DB에서 아래를 조회해서 endian format이 같은지 검사해서...

아래 경우 little endian인데...source db와 target db의 os가 동일한 endian이면 상관없지만

 

 

        SQL> select PLATFORM_ID, PLATFORM_NAME  from v$database;
       
        PLATFORM_ID PLATFORM_NAME
        ----------- ------------------------------
                 10 Linux IA (32-bit)

 

        SQL> select  * from v$transportable_platform;
       
        PLATFORM_ID PLATFORM_NAME                  ENDIAN_FORMAT
        ----------- ------------------------------ --------------
                  1 Solaris[tm] OE (32-bit)        Big
                  2 Solaris[tm] OE (64-bit)        Big
                  7 Microsoft Windows IA (32-bit)  Little  
                 10 Linux IA (32-bit)              Little   <--- Little endian임.
                  6 AIX-Based Systems (64-bit)     Big
                  3 HP-UX (64-bit)                 Big
                  5 HP Tru64 UNIX                  Little
                  4 HP-UX IA (64-bit)              Big
                 11 Linux IA (64-bit)              Little
                 15 HP Open VMS                    Little
                  8 Microsoft Windows IA (64-bit)  Little
                  9 IBM zSeries Based Linux        Big
                 13 Linux 64-bit for AMD           Little
                 16 Apple Mac OS                   Big
                 12 Microsoft Windows 64-bit for A Little
                    MD

 

다를 경우 Rman으로 Data File Conversion 을 해야 합니다.

 

     - Source 에서
       > rman target=/
       RMAN> Convert Tablespace 'FINANCE, HR' to Platform ='AIX_Based System (64-bit)'  <--    

                  v$transportable_platform.platform_name
                     DB_FILE_NAME_CONVERT = '/orahome/dbs1', '/orahome/dbs/transport_aix',
                                            '/orahome/dbs2', '/orahome/dbs/transport_aix'; 
         <--해당 디렉토리 아래 FINANCE, HR TS에 해당하는 모든 것을 convert하여 지정된 디렉토리 아래로 copy
        
     또는
    
     - Target 에서
       > rman target=/    
       RMAN> Convert Datafile '/tmp/transport_stage/*' From Platform = 'Solaris[tm] OE (32-bit)'
                     DB_FILE_NAME_CONVERT = '/tmp/transport_stage/fin', '/orahome/dbs1/fin',
                                            '/tmp/transport_stage/hr',  '/orahome/db2/hr';
     - DB_FILE_NAME_CONVERT 가 없으면 flash recovery area에 같은 이름으로 만들어진다.
     - Parallelism option은 parallel하게 복수개의 file을 convert할때 사용.  Convert 시간은 Rman으로
       백업할때 걸리는 시간과 같다. Convert 전후의 file size는 변함이 없다.





TDB라는 방법도 있습니다.

http://www.oracle.com/technetwork/database/features/availability/maa-wp-10gr2-platformmigrationtdb-131164.pdf


HP.UX -> AIX로 진행 해 봤는데..

시간이 많이 걸리던 순서대로 나열하면 exp/imp, TTS, TDB 순서 더군요...

참고 하세요..





반응형
반응형

반응형
반응형

DOWNLOAD : http://www.donnabaker.ca/downloads.html

 

가진 것에서 시작하자

  게리가 첫 번째 해야 할 일은 기존 양식을 검토하는 것이다 . 종이에 그린 양식이 모두 좋은 PDF 양식이라는 보장은 없다.
또 모든 이용자들을 만족시킨다는 보장도 없다. 게리는 과거에 사용된 Word 양식을 열고 소비자 정보를 얻기 위해 어떤 시도를 했는지를 살펴보았다. <그림 10-2>

<그림 10-2> 기존 양식은 기본에 충실하지만 그다지 매력적으로 보이지 않는다.


DOWNLOAD 게리가 검토하는 양식을 사용하려면 베이커 웹사이트에서 customer form.doc를 다운로드 한다. 간단히 수정한 양식을 보려면 survey2007.doc를 다운로드 한다.

게리가 특별히 걱정할 일은 없었다. 양식은 기본에 충실했지만 질문의 요점이 불명확하고 설명문도 그다지 좋지 않았다.
페이지 상단은 구성이 훌륭하고 질문은 읽기 좋은 편이었다.



양식 내용 수정하기

  게리는 집의 종류를 묻는 질문을 삭제해서 양식의 내용을 단순화하기로 했다. 이 정보는 추적하기도 어렵고 관련성도 부족하다. 핵심 정보는 응답자가 실제로 그 집을 소유하고 있느냐는 것이다. 임대한 사람들은 맞춤식 외장재를 설치하는 데 관심이 없기 때문이다.

  다음으로는 양식에 소제목을 달아야 한다. 마지막 부분은 예외로 하더라도 소제목들은 매우 유용하게 쓸 수 있다. 게리는 이전 양식이 왜 큰 성공을 거두지 못했는지를 발견했다. 페이지 하단의 정보란은“저희 직원이 향후에 연락할 수 있는 정보를 기입해 주십시오”라고 쓰여 있었다.

  게리는 잠재 고객을 쫓기보다는 그들이 스스로 찾아올 수 있는 전략을 짰다. 그는 개인 정보란에“리모델링 패키지 3,000달러를 받는 행운의 주인공이 되십시오”라고 입력했다. 경품에 대한 승인은 따로 받아야 하지만 틀림없이 유용한 고객의 정보를 수집하는 데 인센티브를 준다는 전략이 효과를 보게 될 것이다.



단순한 필드 만들기

  다음에는 양식 필드의 모양을 단순하게 만들어야 한다. 기존 필드들은 요란하고 지나치게 장식적이었다. 게리는 애크로뱃이 문서의 표에 들어간 문구를 읽고 별도의 개체로 해석한다는 사실을 알고 있었다.
양식의 인식 가능성을 높이기 위해서 애크로뱃에서 불필요한 줄이나 테두리를 삭제해야 한다. 게리가 단순화한 양식의 모양은 다음과 같다.

<그림 10-3> 애크로뱃과 이용자가 이해하기 쉽게 양식이 수정되었다.

  • 확인란과 텍스트 필드에 사용된 그림자 삭제

  • 필드 둘레의 테두리 제거

  • 필드의 설명문과 사용자 반송란을 돋보이기 위해 레이아웃 상의 테두리 제거

  게리는 양식 작업을 마치고 다시 확인한 다음, survey2007.doc로 저장했다<그림 10-3>. 지금까지의 작업은 순조로웠다. 이제는 PDF 버전으로 양식을 만들어야 한다.


줄과 테두리
  게리가 고심한 것이 바로 그림 10.4이다. 원래 양식에는 수많은 선들이 필드를 둘러싸고 있다. 원래 양식을 PDF로 변환하고 ‘TouchUp 개체 도구( )'로 양식으로 선택하면 선들은 모두 개체로 인식된다.
필드라는 것을 보여주는 선들이 너무 많으면 양식이라기보다는 무슨 격자무늬처럼 보일 것이다. 개체가 너무 많으면 프로그램에서 해석하기도 어렵다. 게리가 양식을 단순하게 처리한 것은 옳은 결정이었다.

  <그림 10-4> 선이 많으면 주목을 끌지는 모르지만, 지나치게 많으면 애크로뱃이 필드를 해석하기가 어렵다.



PDF 양식 만들기

  게리는 소스 파일인 Word에서 양식을 만들고 있다. 엑셀이나 인디자인, 일러스트레이터 등의 프로그램에서 만든 양식을 가져오기로 불러오는 것도 가능하다. 또는 애크로뱃에서 스캔한 양식이나 기존의 PDF 파일을 이용하거나, 빈 페이지에서 도구를 이용해서 양식을 처음부터 만들 수도 있다.

  지나치게 복잡하거나 장식적인 양식은 사용자가 정확히 이해할 수 없기 때문에 부정확한 정 보로 이어질 가능성이 높다. 애크로뱃은 양식의 내용을 분명한 텍스트와 이미지 등 많은 방식으로 정의한다. 여기서 게리는 양식의 필드가 어떻게 구성되고 이용되는지를 배우게 될 것이다.


Note
  당신이 자동차 후드 밑에 무엇이 있는지를 궁금해 하는 사람이라면, 태그를 이용하는 방법에 대해 쓴 5장“접근 가능한 문서 만들기”를 참고하기 바란다. 콘텐트와 순서, 기사 등의 구조 등은 베이커 웹사이트에서 5장 보너스 자료를 읽어보기 바란다.
 
반응형
반응형

폼 데이터 핸들링
ADOBE ACROBAT 에서

"애크로뱃 8의 폼 배포와 트래킹"에서 설명했던 것처럼 데이터셋 파일은 배포 프로세스의 한 부분으로서 자동 생성된다. 파일은 PDF 패키지다.

데이터셋 파일에 파일들을 추가하려면 아래 순서를 따른다.

 
  1. 애크로뱃 8 프로페셔널에서 리턴 폼을 열기 위하여 더블 클릭한다. 데이터셋에 완료 폼 추가(Add Completed Form to Dataset) 대화상자가 열리고, 배포의 한 부분으로서 생성된 데이터셋 PDF 파일이 나열된다.

  2. OK를 클릭해 대화상자를 닫는다. PDF 패키지 파일이 열리고 폼은 데이터 리스트에 포함된다. PDF 패키지의 구조는 데이터 구체화 명령(Figure 2)을 수반한다.


    (+) 확대보기

    Figure 1 : 패키지의 데이터셋 파일에 폼 파일들이 추가된다.


  3. 파일 도착 즉시 데이터셋에 더 많은 파일을 추가하기 위하여, PDF 패키지의 툴바에서 임포트 데이터(Import Data)를 클릭하고 리턴 폼 추가(Add Returned Forms) 대화상자를 연다.
    파일 추가(Add File)를 클릭하고 리턴 폼 추가(Add Returned Forms) 대화상자에 있는 완료 폼 파일들을 찾아 선택한다. OK를 클릭하고 대화상자를 닫는다. Figure 1에서 보이는 것과 같이 PDF 패키지에 파일을 로드한다.

  4. 스프레드시트에 데이터를 익스포트하기 위하여, PDF 패키지의 툴바에 있는 익스포트 데이터(Export Data)를 클릭한다. 저장파일 대화상자를 열기 위하여 폴더를 선택하고, 디폴트로 데이터셋 파일 이름을 사용하여 CSV(comma-separated values: 쉼표에 의해 분리되는 항목 값) 포맷으로 저장한다. Save를 클릭한다.

  5. 스프레드시트 프로그램을 열고 CSV 파일을 찾아 선택한다. 스프레드시트는 리턴 폼을 파일 이름에 따라 정렬하고 두 질문에 대한 각각의 답도 함께 나타낸다 (Figure 2).


    Figure 2 : 익스포트 폼 데이터는 스프레드 시트 셀 안의 각각의 질문에 대한 답변과 함께 시트에 나타난다.


얼마나 자주 사용하세요?

PDF 패키지의 파일 어샘블 선택 빈도에 따라 업무 강도나 일정을 알 수 있다. 개인에 따라 종합 파일이 매일 필요할 수도 있고 분기말에나 한번 필요할 수도 있다.

원문출처 : http://www.adobe.com/designcenter/acrobat/articles/acr8at_handleform.html
출처 : http://www.acrobatpdf.com/tip/detail.asp?id=80&gotopage=10&code=
반응형
반응형

* 폼 필드 설정
ADOBE ACROBAT 에서

애크로뱃8 프로페셔널의 폼 필드에서 사용할 수 있는 설정 탭에 대한 개략적인 설명이다.

General 탭. 이 탭은 모든 타입의 기본이 된다.
이 탭의 대화상자에 이름과 툴팁을 넣고 필드를 보여줄지 여부도 결정한다. 추가적으로, 필드가 꼭 필요한지(즉 항목 기입이 필수인지) 또는 필드가 읽기 전용인지를 조건으로 지정한다. 예를 들면, 사용자의 이름 필드를 꼭 입력하도록 하거나 계산된 텍스트 필드를 읽기 전용으로 지정할 수 있다.

Appearance 탭. 이 탭의 대화상자에 이름과 툴팁을 넣고 필드를 보여줄지 여부도 결정한다.
추가적으로, 필드가 꼭 필요한지(즉 항목 기입이 필수인지) 또는 필드가 읽기 전용인지를 조건으로 지정한다. 예를 들면, 사용자의 이름 필드를 꼭 입력하도록 하거나 계산된 텍스트 필드를 읽기 전용으로 지정할 수 있다.

Options 탭. 모든 폼 필드에는 옵션 탭이 있다.
필드의 종류에 따라 내용은 달라진다. 버튼을 예로 들면, 디스플레이를 위한 라벨과 이미지를 선택할 수 있는 옵션이 있다. 체크박스 필드는 체크마크나 별표 같은 오브젝트의 겉모습을 선택할 수 있으며 콤보 박스와 리스트 박스는 아이템리스트를 넣을 수 있는 공간을 가지고 있으며 라디오 버튼 필드는 버튼의 스타일을 자동 선택 여부와 관계없이(figure 1) 선택할 수 있도록 하고 있다.

Actions 탭. 모든 폼 필드에는 이 탭이 있으며 모든 타입에서 비슷하게 동작하는 것처럼 보인다. 액션들은 애크로뱃이 몇몇 인터렉션에 반응해 수행하는 동작들이다. 예를 들면, 버튼을 누름에 따라 다른 문서를 열 수 있고 숫자를 폼 필드에 입력하여 그 계산 결과를 나타내는 것은 액션이다.


Figure 1:
라디오 버튼 모양 같은 필드타입에 대한 옵션을 고른다 .



Format 탭. 텍스트 박스나 콤보 박스 필드 같은 폼 필드 타입은 속성 대화상자에 포맷 탭을 가지고 있다. 필드에서 사용자가 입력하는 텍스트에 적용하는 포맷팅 카테고리의 타입을 선택할 수 있다. 포맷팅은 숫자부터 화폐 단위, 날자까지(Figure 2) 다양하게 범위를 정할 수 있다.


Figure 2: 폼 탭에서 사용자 입력을 허용하는 필드에 텍스트 모양을 설정한다.


Validate 탭. 필드에서 사용자 입력을 제한할 수 있다.
예를 들면 텍스트 박스나 콤보 박스 필드에 숫자나 문자를 입력하는 것 등이 있다. 대화상자에서
옵션을 선택하거나 자바스크립트 검증(validation) 스크립트 사용을 선택할 수 있다.

Calculate 탭. 대화상자의 탭을 사용하여 함수 계산도 수행한다.

Selection Change 탭. 이 탭은 리스트 박스 속성에서만 볼 수 있다.
리스트 박스에서 선택 변경이 있을 경우의 반응을 설정해 놓을 수 있다.


접근성 고려

여러 상황에서 폼이 접근성(accessibility) 기준을 따르도록 하는 것에 유의해야 한다. 스크린리더와 다른 장치간의 올바른 커뮤니케이션을 유지하는 것이 접근성의 주요 기능 중 하나다. 폼 필드의 속성 대화상자를 열고 General 탭의 툴팁에 “당신의 생일”과 같은 간단한 인스트럭션을 입력한다.
툴팁이 없으면, 스크린리더는 폼 필드의 타입만 말하여 사용자가 그 내용을 이해할 수 없게 된다.


간편한 폼 작성 , 간편해진 내 삶

아래의 내용을 고려하여 폼을 작성한다.

문서의 디자인이 사용하려는 필드의 크기를 수용할 수 있도록 한다 .
첫 필드를 만들 때는 글꼴과 겉모습 같은 것은 모든 필드에 기본이 될 수 있는 옵션을 설정한다 .
추가적인 필드의 추가하고 이름을 지을 수 있도록 시스템을 개발하라 .
정렬과 같이 몇 가지 필드 중 한 가지 속성을 변경할 경우 , 각 필드를 개별적으로 일일이 변경하지 않아도 된다. 시프트-클릭으로 필드를 선택하고 단축키 메뉴를 사용하여 속성 대화상자를 연다. 정렬을 변경할 경우, 변경 내용은 모든 선택된 필드에 적용된다.
자바스크립트는 각각의 필드에 개별적으로 쓰이고 (write), 몇몇 필드에서는 계산이 허용되지 않는다.


원문출처 : http://www.adobe.com/designcenter/acrobat/articles/acr8at_configfields.html
출처 : http://www.acrobatpdf.com/tip/detail.asp?id=79&gotopage=10&code=
반응형

+ Recent posts