레이블이 OS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OS인 게시물을 표시합니다. 모든 게시물 표시

2015년 6월 29일 월요일

[H3 2011] 하이브리드 앱 아키텍쳐 및 개발방법








자료: http://www.slideshare.net/devparan/h3-2011-c5-hybrid-app-architecture-and-development-method

추가 자료: https://jhpark0803.wordpress.com/%EC%BB%A8%ED%8D%BC%EB%9F%B0%EC%8A%A4-%EC%9E%90%EB%A3%8C-%EB%AA%A8%EC%9D%8C/h3-2011/

[SW 아키텍처] 모바일 기반 아키텍처 (iPhone, Android)

출처: http://hyeonstorage.tistory.com/137

모바일 기반 아키텍처 (iPhone, Android)

1. iPhone

(1) Application Life Cycle


- User taps application icon : 어플리케이션 실행, 어플리케이션이 실행되면서 화면가운데 화면이 확대되는 트랜직션 그래픽스

- main(), UIApplicatonMain() : 메인함수 호출, 어플리케이션이 실작할때 최초로 읽히는 main.m 파일을 의미, 어플리케이션을 초기화

- Event Loop : 프로그램이 이벤트가 발생할때까지 대기상태로 아무것도 하지 않고 이벤트를 받을 준비를 하거나 이벤트를 받으면 응답하고 대기하는 것을 반복한다.

- System asks application to terminate : 어플리케이션 종료를 체크

- Application execution terminates : 어플리케이션 종료

(2) Event Handling Cycle



사용자가 장치를 조작하면 아이폰 운영체제는 터치 이벤트를 감지하고 어플리케이션의 이벤트 큐에 그 이벤트를 배치한다.

그러면 UIApplication 객체의 이벤트 핸들링 하부구조는 이벤트 큐의 TOP에서 각 이벤트를 꺼내와서 그 이벤트를 다루는데 가장 적합한 객체에게 전달한다. 

또한 이벤트는 어플리케이션에서 터치 이벤트를 다루어야 할 간접적인 책임이 있는 컨트롤 객체와 기타 객체에게 전달될 수도 있다.

(3) iPhone App에 사용된 Design Pattern

- Model-View-Conroller

모델-뷰-컨트롤러(MVC) 디자인 패턴은 어플리케이션의 객체들을 세 가지 역할로 나눈다.

모델 객체는 데이터를 나타낸다.

이 어플리케이션에서 데이터가 매우 단순하다. 그냥 문자열이다. 그리고 실제로 하나의 메소드 안에서만 사용될 것이다. 그래서 엄밀히 말하면 모델이 필요하지 않다고도 할 수 있다. 그러나 여기서 중요한 것은 기본 원칙이다. 다른 어플리케이션들에서 모델은 좀 더 복잡할 것이며 여러 곳에서 사용될 것이다.

뷰 객체는 데이터를 보여주는 법을 알며 사용자에게 데이터를 편집할 수 있게 한다.

컨트롤러 객체는 모델과 뷰를 연결한다.

- Delegation

딜리게이션은 한 객체가 자신의 딜리게이트(위임자)로 지정된 다른 객체에게 입력을 요청하거나 이벤트가 발생했음을 알리기 위해 주기적으로 메시지를 보내는 패턴이다.

이것은 클래스 상속을 사용하지 않고도 이미 존재하는 객체의 기능을 확장하여 재사용할 수 있는 방법이다.

딜 리게이트 메소드는 보통 프로토콜로 그룹 지어져 있다. 프로토콜은 기본적으로 단순히 메소드들의 리스트이다. 어떤 클래스가 프로토콜을 따른다면(Conform), 그것은 해당 프로토콜이 필요로 하는 메소드들을 구현했음을 보장하는 것이다. 딜리게이트 프로토콜은 객체가 그 딜리게이트에 보낼 수 있는 모든 메시지를 정의한다.

- Target-action

타겟-액션 매커니즘은 버튼이나 슬라이더 같은 컨트롤 객체가 클릭이나 드래그와 같은 사용자 이벤트에 반응하여, 그 메시지를 해석할 수 있는 다른 객체(타겟)에게 메시지를 보내며(액션) 어플리케이션에서 지정된 명령을 수행

(4) View Class Hierarchy

- 뷰가 다시 그려질 필요가 있으면, UIView 객체의 기제작된 드로잉 코드는 drawRect: 메소드를 호출하여 사각영역으로 전달함

- 추가한 커스텀 뷰 서브클래스에서 이 메소드를 오버라이드하고, 뷰의 컨텐츠를 그리기 위해 사용함

- 처음으로 뷰가 그려지면, drawRect: 메소드에 전달된 Rectangle은 뷰의 전체 가시 영역을 포함함

- 이후의 호출동안 이 Rectangle은 실제로 다시 그려져야할 부분만 표현함

뷰가 다시 그리는 이벤트
> 부분적으로 뷰를 가리는 다른 뷰를 이동하거나, 제거할 때
> hidden 프러퍼티를 NO로 설정함으로써 이전에 숨겨진 뷰를 다시 보이게 할 때
> 뷰의 스크롤을 움직일 때
> 뷰의 setNeedsDisplay나 setNeedsDisplayInRect: 메소드를 명시적으로 호출할 때

drawRect: 메소드를 호출한 후, 뷰는 스스로 업데이트 되었음으로 표시하고, 또다른 업데이트 사이클이 도착하고, 업데이트 사이클을 촉발하는 새로운 액션을 기다림

뷰가 정적인 컨텐츠를 표시한다면, 스크롤과 다른 뷰 때문에 발생하는 이벤트만 신경쓰면 됨

뷰 컨텐츠를 주기적으로 업데이트 한다면, setNeedsDisplay나 setNeedsDisplayRect: 메소드를 언제 호출할 지 결정해야만 함 또한 사용자와 상호작용이나 새로운 컨텐츠의 생성에 응답해 뷰를 업데이트 할 수도 있음

(5) Layered View in Clock Application




2. Android 

(1) Android SDK Emulator 디렉토리 구조와 UI


(2) Android Architecture




안드로이드 플랫폼은 크게 리눅스 커널과, C/C++ 로 작성한 라이브러리, 안드로이드 응용프로그램의 뼈대를 제공하는 어플리케이션 프레임워크와 기본 어플리케이션으로 구성돼 있다. 리눅스 커널은 OS의 기본 기능인 태스크간의 스케쥴링과 메모리, 디스크, 네트워크 등의 자원을 사용할 수 있도록 시스템 콜을 제공한다. 이는 리눅스 커널 윗부분에 초록색으로 표시된 네이티브 라이브러리를 통해 응용프로그램이 편하게 사용할 수 있는 형태로 제공된다.

안드로이드 응용프로그램은 자바 언어로 작성하고, 자바 클래스로 구성된 어플리케이션 프레임워크를 이용한다. 이 자바 파일을 안드로이드 SDK를 이용해 빌드하면 내부적으로 Java 컴파일러와 dex converter를 거쳐 Dalvic VM위에서 동작하는 바이트 코드로 변환하게 된다.
결과적으로 안드로이드 응용프로그램은 어플리케이션 프레임워크를 이용해 버추얼머신에서 제공하는 코어 라이브러리 기능을 사용하게 되고, 이 코어 라이브러리는 리눅스 커널 위에서 동작하는 다양한 C/C++ 라이브러리를 호출하게 된다. 이 라이브러리는 필요에 따라 리눅스 커널의 시스템 콜을 호출하게 된다.

(3) Android Architecture에 사용된 Open Source


안드로이드 플랫폼에는 다양한 오픈소스가 사용되었다.

(4) Android Application Layer


Eclair 기준으로 총 51개 기본 어플이 등록되어 있으며 추가적으로 동일한 어플리케이션 프로그램 인터페이스 라이브러리를 이용하는 서드파티 어플을 추가할 수 있다.

(5) Android Framework


안드로이드 어플리케이션 프레임워크는 자바 기반의 프레임워크이며 대부분이 native C/C++ 코드로 작성되어 있다.

이 프레임워크는 액티비티 매지너, 패키지 매니저 등 핵심 시스템 서비스를 담당하는 코어 시스템 서비스들과 하드웨어와의 인터페이스를 담당하는 하드웨어 서비스들로 구성된다.

(6) Android Library


안드로이드 내장 라이브러리는 Bionic Libc, Function Library, Native Server, Hardware Abstraction Library로 구성된다. 
Bionic은 임베디드에서 사용을 위해 최적화된 직접 구현된 libc이다.
Function Library에는 Webkit, 미디어 프레임워크, SQLite가 속하며, 그리고 Native Server에는 Surface Finger와 Audio Finger가 있다.

(7) Android Runtime


안드로이드 런타임은 Core 라이브러리와 Dalvic 가상머신으로 구성되어 있다. 코어 라이브러리는 강력하지만, 단순하고 익숙한 개발 플랫폼을 제공하는 Java 언어를 위한 Core API를 포함하고 있다. 그리고 Dalvic 가상 머신은 안드로이드에서 자체적으로 만든 것으로 청정영역을 제공하는 가상머신으로써 어플리케이션의 호환성과 실행의 일관성을 제공한다.

(8) Android Kernel


안드로이드에서 리눅스 커널을 사용하는 이유는 메모리 및 프로세스 관리, 인가 기반의 보안 모델, 검증된 드라이버 모델, 공유 라이브러리 지원, 오픈소스 기반 등의 장점 때문이다. 그러나, 안드로이드가 표준 리눅스 유틸리티 전체를 포함하고 있지는 않다. 이는 안드로이드가 리눅스 커널을 기반으로 하고 있지만 내장 윈도우 시스템을 지원하지 않기 때문이다 그리고 알람, 파워 매니지먼트 등은 안드로이드를 위해 확장된 리눅스 커널 영역이다.



* 모바일 기반 아키텍처 요구사항

- 최적화된 리소스 사용으로 경량화 구조를 유지할 것

- 프로세스의 적절한 사용으로 고가용성을 유지할 것

- User Interface 로딩 시간을 최소화할 것

- 확장 가능한 권한/ 인즈 체제를 구축할 것

- Application 수준에서 보안 요구사항을 만족할 것

- Application Download 및 Install 작업이 용이할 것

2015년 6월 28일 일요일

AT-BIOS Interrupt

Read/Write Disk


디스크로부터 읽기, 디스크에 쓰기, 섹터의 검사(verify) 및 찾기
  • AH = 0x02 (읽을 때)
  • AH = 0x03 (쓸 때)
  • AH = 0x04 (검사할 때)
  • AH = 0x0C (찾기 할 때)

  • AL = 처리할 섹터 수 (연속된 섹터 처리 가능)
  • CH = [실린더 번호] & 0xFF
  • CL = [섹터 번호 (bit 0-5)] | ([실린더 번호] & 0x300) >> 2
  • DH = 헤드 번호
  • DL = 드라이브 번호
  • ES:BX = 버퍼 어드레스 (검사 혹은 찾기를 할 때에는 이 값을 참조하지 않음)

  • 반환 값: (JNC 명령으로 체크)
  • FLAGS.CF == 0 : 에러 없음, AH == 0
  • FLAGS.CF == 1 : 에러 있음, AH에 에러 코드 (리셋 기능과 같음) 



2015년 6월 25일 목요일

VirtualBox VDI 용량 추가


Host (Windows)

  • VirtualBox 설치 경로로 이동
  • 아래 API 명령 입력
        > VBoxManage modifyhd <VID 파일명> --resize <용량 MB 단위>
  • VirtualBox 관리 콘솔에 확인

Guest (Linux):RedHat 계열


    # fdisk -l
    # fdisk /dev/sda
      d (파티션 지우기 선택)
      2 (sda2 실제 삭제)
      n (새 파티션 생성)
      p (primary)
      2 (2번 파티션)
      Enter
      Enter
      w (write)
    # reboot

    # pvresize /dev/sda2
    # pvscan
    # lvextend -l+100%FREE /dev/mapper/ol-home
    # resize2fs /dev/mapper/ol-home
    # df -h

  • resize2fs 실행 시 오류 발생
    # pvresize -v /dev/sda2
    # lvresize -r -l+100%FREE /dev/mapper/ol-home
    # df -h

기타 정보 확인 명령어


    # pvdisplay
    # vgdisplay
    # lvdisplay

Oracle Linux 7 기반 Oracle Database 11g R2 설치

Linux 기초 명령어 (RedHat 계열)



    - hostname 변경
      # vi /etc/hostname
      # vi /etc/sysconfig/network
      # vi /etc/hosts
      # service network restart
      # reboot

    - zip / unzip
      $ zip -r test.zip ./*
      $ unzip happy.zip
      $ unzip happy.zip -d ./target

    - tar.gz
      $ tar -czvf images.tar.gz ./test
      $ tar -xzvf images.tar.gz

    - software update
      # yum list updates
      # yum update –y 


Oracle Database 11g R2 installation


$ su -

# df -h

# usermod -g oinstall -G dba oracle
# useradd -g oinstall -G dba oracle
# passwd oracle

# /sbin/sysctl -p
# /sbin/sysctl -a

# mkdir -p /opt/app/
# chown -R oracle:oinstall /opt/app/
# chmod -R 775 /opt/app/

# su - oracle
$ export TMP=/tmp
$ export TMPDIR=$TMP

$ export ORACLE_BASE=/opt/app/oracle
$ export ORACLE_SID=orcl



After installation

# vi /etc/oratab
SID:ORACLE_HOME:{Y|N|W} ----> Y

# vi /etc/init.d/oracle
#!/bin/bash

# oracle: Start/Stop Oracle Database 11g R2
#
# chkconfig: 345 90 10
# description: The Oracle Database is an Object-Relational Database Management System.
#
# processname: oracle

. /etc/rc.d/init.d/functions

LOCKFILE=/var/lock/subsys/oracle
ORACLE_HOME=/opt/app/oracle/product/11.2.0/dbhome
ORACLE_USER=oracle

case "$1" in
'start')
   if [ -f $LOCKFILE ]; then
      echo $0 already running.
      exit 1
   fi
   echo -n $"Starting Oracle Database:"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl start"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl start dbconsole"
   touch $LOCKFILE
   ;;
'stop')
   if [ ! -f $LOCKFILE ]; then
      echo $0 already stopping.
      exit 1
   fi
   echo -n $"Stopping Oracle Database:"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl stop"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbshut"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl stop dbconsole"
   rm -f $LOCKFILE
   ;;
'restart')
   $0 stop
   $0 start
   ;;
'status')
   if [ -f $LOCKFILE ]; then
      echo $0 started.
      else
      echo $0 stopped.
   fi
   ;;
*)
   echo "Usage: $0 [start|stop|status]"
   exit 1
esac

exit 0



# chmod 755 /etc/init.d/oracle
# chkconfig --add oracle
# chkconfig oracle on

http://localhost:1158/em
$ emctl stop dbconsole
$ emctl config emkey -repos -sysman_pwd
$ emctl secure dbconsole -sysman_pwd
$ emctl start dbconsole
$ emctl config emkey -remove_from_repos -sysman_pwd


$ lsnrctl start
$ lsnrctl status
$ lsnrctl stop
$ netstat -anp | grep 1521 | grep LISTEN

$ sqlplus "/as sysdba"
SQL> startup
SQL> shutdown normal|immediate|abort



$ vi ~/.bash_profile
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome
export ORACLE_HOME_LISTNER=$ORACLE_HOME/bin/lsnrctl
export ORACLE_SID=TMSRACDB
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export PATH=$ORACLE_HOME/bin:$PATH




Installed information


DB Global Name
SQL> SELECT * FROM props$ WHERE name='GLOBAL_DB_NAME';
SQL> SELECT * FROM global_name;


SQL> ALTER DATABASE RENAME GLOBAL_NAME TO <>;

SID
SQL> select name from v$database;
SQL> SELECT instance FROM v$thread;




re-installation


# rm -Rf /usr/local/bin/oraenv
# rm -Rf /usr/local/bin/coraenv
# rm -Rf /etc/oratab

# chkconfig oracle off
# chkconfig --del oracle
# rm -Rf /etc/init.d/oracle
# rm -Rf $ORACLE_HOME

$ unset ORACLE_HOME
$ unset TNS_ADMIN


기타

** tnsname.ora
- $ORACLE_HOME/network/admin
- 로컬컴퓨터가 원격 서버로 접속할 방법을 서술

** listener.ora
- $ORACLE_HOME/network/admin
- 오라클서버에서 리스너를 기동시킬 때 (즉, lsnrctl start) 사용하게 되는 환경 파일

$ sqlplus -S scott/tiger < /data/script/test.sql
(-S : uses silent mode)

AT-BIOS Interrupt

INT(0x10) : 비디오 관련

  • 비디오 모드 설정
    • AH = 0x00
    • AL = 모드(자주 사용되는 화면 모드만 설명)
      • 0x03:16색 텍스트, 80x25
      • 0x12:VGA 그래픽스, 640 x480x4bit 칼라, 독자 영역 엑세스
      • 0x13:VGA 그래픽스, 320 x200x8bit 칼라, Packed Pixel
      • 0x6a:확장 VGA 그래픽스, 800 x600x4bit 칼라, 독자 영역 엑세스
                          (비디오 카드에 의해서는 서포트되지 않는다.)
    • 반환값:없음

  • 커서 모양 설정
    • AH = 0x01
    • CH = 시작 라인
    • CL = 종료 라인
      • CH < CL라면 1개의 부분으로부터 되는 보통 커서
      • CH > CL라면 2개의 부분으로부터 되는 커서
      • CH == 0x20이면 커서는 표시되지 않는다
    • 반환값:없음

  • 커서 위치 지정
    • AH = 0x02
    • BH = 0(페이지 번호)
    • DL = x 좌표
    • DH = y 좌표
    • 반환값:없음

  • 점 출력
    • 굳이 이 함수를 이용하지 않고 바로 Video 메모리를 이용할 수도 있다.
    • AH = 0x0c
    • AL = 색상 코드(0 ~ 15)
    • CX = x좌표
    • DX = y좌표
    • 반환값:없음

  • 한 문자 출력
    • AH = 0x0e
    • AL = 문자 코드
    • BH = 0(페이지 번호)
    • BL = 문자의 색
    • 반환값:없음
    • 주의) beep(0x07), 백 스페이스(0x08), CR(0x0d), LF(0x0a)는 제어 코드로서 인식된다

  • 색상 코드를 대응되는 팔레트에 저장한다.
    • 16색 모드일 때만 사용가능하다.
    • AX = 0x1000
    • BL = 색상 코드(0 ~ 15)
    • BH = 팔레트 코드(0 ~ 63)
    • 주의) EGA 그래픽 카드와의 호환성을 유지하기 위해서 사용됩니다. 잘못 사용하면 상당히 복잡해지기 때문에 기본값 그대로 두고 사용하는 것이 좋습니다.

  • 팔레트 설정
    • AX = 0x1010
    • BX = 팔레트 번호(0 ~ 255)
    • DH = Red(0 ~ 63)
    • CH = Green(0 ~ 63)
    • CL = Blue(0 ~ 63)
    • 반환값:없음

  • 문자열 출력
    • AH = 0x13
    • AL = 옵션
      • 0x00:문자열의 속성을 BL 레지스터로 지정하고 커서는 이동시키지 않는다.
      • 0x01:문자열의 속성을 BL 레지스터로 지정하고 커서를 이동시킨다.
      • 0x02:문자열을 출력하고 커서는 이동시키지 않는다.
      • 0x03:문자열을 출력하고 커서를 이동시킨다.
      • 실제 데이터는 메모리에 [문자 코드] [칼라 코드] [문자 코드] [칼라 코드]와 같이 저장된다고 보면된다.
    • BH = 0(페이지 번호)
    • BL = 칼라 코드(AL 레지스터의 값이 0x01, 0x02일 경우에만 적용)
    • CX = 문자열의 길이
    • DL = x좌표
    • DH = y좌표
    • ES:BP = 출력할 문자열이 있는 곳의 주소
    • 반환값:없음

  • 제일 간단하게 사용할 수 있는 화면모드인 0x13의 사용법
    • 0x13번 화면모드는 그다지 해상도가 좋지는 않지만 Packed Pixel 모드이기 때문에 프로그래밍 하기가 편합니다. 우선 화면 모드를 변경하고 팔레트를 설정합니다.
    • 이 모드는 Video Ram의 0xa0000 ~ 0xafff의 64KB에 위치하게 됩니다. 정확히 말하면 320 x 200 = 64000이 되므로 62.5 KB라고 해야겠지만, VRAM는 0xa0000 ~ 0xaffff의 64 KB입니다.엄밀하게 말하면(자), 320 x200=64000이므로, 62.5 KB가 됩니다. 이 모드에서는 점 하나가 1바이트에 해당되기때문에 읽고 쓰기도 아주 간단합니다.

[참고]
16진 : 색상 : 색상코드(HTML)
0x0 : 검정 : #000000
0x1 : 파랑 : #0000a8
0x2 : 초록 : #00a800
0x3 : 파랑 : #00a8a8
0x4 : 빨강 : #a80000
0x5 : 보라 : #a800a8
0x6 : 갈색 : #a85700
0x7 : 옅은 회색 : #a8a8a8
0x8 : 짙은 회색 : #575757
0x9 : 하늘색 : #5757ff
0xA : 연두 : #57ff57
0xB : 시안 : #57ffff
0xC : 마젠타? : #ff5757
0xD : 분홍 : #ff57ff
0xE : 노랑 : #ffff57
0xF : 흰색 : #ffffff

# 인터럽트 상세 설명: http://www.ctyme.com/rbrown.htm

IBM PC AT 호환기종의 메모리 맵핑

  • PCI 장치 혹은 PC에 장착하는 카드를 사용할 때, 각 장치가 메모리에 맵핑되는 상태를 설명합니다.
  • 0x00000000 - 0x0009ffff : RAM
  • 0x000a0000 - 0x000bffff : 비디오 카드 접근 영역
  • 0x000c0000 - 0x000c7fff : 비디오 BIOS
  • 0x000c8000 - 0x000dffff : 각종 카드의 ROM 영역
  • 0x000d0000 - 0x000dffff 영역은 대부분 비어 있다
  • 0x000e0000 - 0x000effff : 확장 BIOS
  • 0x000f0000 - 0x000fffff : BIOS
  • 0x00100000 - 0x00efffff : RAM
  • 0x00f00000 - 0x00ffffff : RAM 혹은 ISA 홀(BIOS의 설정에 의해서 결정될 수 있다)
    • 286의 경우는, 0x00fffff0로부터의 16바이트에 리셋트 점프 명령이 있을 수도 있다
  • 0x01000000 - 메모리의 끝 : RAM
  • 메모리의 끝 - 0xffffffef : PCI 장치등의 메모리 맵핑 I/O에 이용 가능한 영역
  • 0xfffffff0 - 0xffffffff : 386이후에서는 여기에 리셋트 점프 명령이 있다

 

소프트웨어에 따른 용도 구분

  • 0x00000000 - 0x000003ff : 리얼모드용 인터럽트 벡터
  • 물론 IDT를 변경하면 변경할 수 있지만 기본적으로는 이 주소가 사용된다
  • 0x00000300 - 0x000003ff는 BIOS용 스택
  • 0x00000400 - 0x000004ff : BIOS가 사용하는 영역
  • 0x00007c00 - 0x00007dff : 부트섹터가 로딩되는 주소
  • 0x0009fc00 - 0x0009ffff : ACPI 영역