2014년 10월 6일 월요일

arm. arm의 register

내 본업은 system engineer이다.

그간 정리해놓았던 것들을 blog로 옮겨보려고 한다. 차근차근...



ARM register 37개임거의범용 register로 구성되어 있다.
User 
System 
FIQ 
Supervisor 
Abort 
IRQ 
Undef 
R0 






R1 






R2 






R3 






R4 






R5 






R6 






R7 






R8 

R8_fiq 




R9 

R9_fiq 




R10 

R10_fiq 




R11 

R11_fiq 




R12 

R12_fiq 




R13(SP) 

R13_fiq 
R13_svc 
R13_abt 
R13_irq 
R13_und 
R14(LR) 

R14_fiq 
R14_svc 
R14_abt 
R14_irq 
R14_und 
R15(PC) 







CPSR 







SPSR_fiq 
SPSR_svc 
SPSR_abt 
SPSR_irq 
SPSR_und 

Current Program Status Register(CPSR) 
  • 31 ~ 28 (NZCV) 
    • N: Negative 
    • Z: Zero 
    • C: Carry 
    • V: oVerflow 
  • 27 ~ 8: unused 
  • 7: IRQ 
  • 6: FIQ enable(0)/disable(1), interrupt 걸리지 않도록 control 가능함. 
  • 5: Thumb mode / ARM mode 
  • 4 ~ 0: 현재의 mode 
Saved Program Status Register(SPSR) 
  • CPSR 복사해 넣는 특수 Register. 백업용임. 
  • SPSR 값을 CPSR 다시 집어 넣으면 이전 mode 곧바로 복귀 가능함. 

R14: Linked Register(LR) 
  • 어딘가로 jump 어디서 branch 왔는지 표시하는  

R13: Stack Pointer(SP) 
  • 현재 Stack 어디까지 쌓아두었는가. 

R15: Program counter(PC) 
  • 현재 어디를 수행하고 있는지를 나타냄. 

Context: Register set snapshot. , R0 ~ R1, CPSR snapshot 

Thumb / ARM mode 차이 
  • Thumb R0 ~ R7 사용 
  • ARM R0 ~ R12까지 사용 
FIQ banked register 많은 이유는 stack backup하는 시간 절약... 

Kernel 영역에서 행하는 것은 supervisor mode. 
User 영역에서 실행하는 것은 user mode. 
모델에서 0~3 4개의 모드가 있는데 kernel 0모드, user 3 모드, 1, 2 OS 제공해줌. 
user mode system call SWI(SW interrupt) 명령을 내리면 kernel 영역으로 진입함. 
unistd.h system call 정의 되어 있음 

2014년 9월 30일 화요일

python. 문자열


문자열 조작 / list 조작 / split() / join() / strip() / find() / %(forma) 설명..
FIXME: 예제 추가

문자열 조작:
  • a[start:end:shift]
  • repr(): 문법 내에 표현들을 문자열로 표현해줌. 예를들면, 배열이나 숫자, 함수 등. 아무거나 넣으면 error exception

list 조작:
  • documentation의 string section 참고..너무많다.

자르기:
  • split(): 나누기
  • join(): 합치기

삭제:
  • strip(): 원래 문자열에서 공백(arg가 있으면 문자) 제거
  • lstrip(): 원래 문자열에서 왼쪽 여백 제거
  • rstrip(): 원래 문자열에서 오른쪽 여백 제거
--> 여기서 공백/여백은 string.whitespace variable에서 확인 가능함.

치환:
  • replace(): 치환
  • maketrans() / translate():강력한 치환..

검색:
  • find(): 첫 번째 substring의 string에서의 index, 없으면 -1
  • rfind(): reverse find()
  • index() / rindex(): find와 동일하지만 substring이 없으면 -1이 아니라 error return
  • count(): substring이 몇 번 있는지
  • startswith() / endswith(): 시작과 끝을 검색하고 boolean return

format:
  • "xxx{0}yyy{1}".format(":", ";") --> xxx:yyy;
  • 0, 1 등의 정수 대신에 dict 표현도 가능함
  • "%s: test" % "yongk" --> yongk: test
참고: http://lapee79.blogspot.kr/2013/08/python-strings.html

2014년 9월 25일 목요일

algorithm. Introduction to Algorithms 3rd 15.1 Rod cutting

Rod cutting(Dynamic programming)



문제: 위의 가격이 정해져 있을 때 n length인 막대기를 짤라 파는 경우 중 가장 수익이 높은 값은?

생각은 간단하다.
MaxPrice[n] = Max(p[i] + MaxPrice[n - i])
이 것을 코드화 하면
import sys 
P = [0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30] 

def rodCut(p, n): 
        if n == 0: return 0
        ret = 0 
        for i in range(1, n + 1): 
                ret = max(ret, P[i] + rodCut(p, n - i)) 
        return ret 

rl = lambda: sys.stdin.readline()
print(rodCut(P, int(rl())))

이고
dynamic programming을 적용해서 r에 저장하면
def memorizedCutRodAux(p, n, r): 
        if n == 0:
                r[n] = 0 
                return r[n]
        if r[n] >= 0:
                return r[n]
        ret = 0 
        for i in range(1, n + 1): 
                r[n] = ret = max(ret, P[i] + memorizedCutRodAux(p, n - i, r)) 
        return r[n]

def memorizedCutRod(p, n): 
        r = [-1] * (n + 1)
        return memorizedCutRodAux(p, n, r)
print(memorizedCutRod(P, int(rl())))

그리고 이 것을 bottom up 방식으로 구현하면
def bottomUpMemorizedCutRod(p, n): 
        r = [-1] * (n + 1)
        r[0] = 0 
        for i in range(1, n + 1): 
                ret = 0 
                for j in range(i + 1): 
                        r[n] = ret = max(ret, p[i] + r[n - i]) 
        return r[n]
print(bottomUpMemorizedCutRod(P, int(rl())))

이다.
시간 제약에 걸릴 때 가장 먼저 생각해보는 방법이다..

덧. TopCoder 알고리즘 책에는 변수가 여러가지 인 경우 배열로 저장하기 위한 방법을 표현한 문제가 있다.

2014년 9월 22일 월요일

java. 자료구조의 methods 간단 정리


java의 자료구조는 java.util.Collection으로 간단 정리 한다.
Collection의 자료구조는 Collections로 algorithm이 구현되어 있음.
Arrays는 덤.(Collection : Collections = 배열 : Arrays)

java.util.Collection

Collection interface는 기본적으로 다음 methods를 이용한다.
  • Iterable을 implements 하는건 당연
  • add() ,  addAll() : 데이터 담기용 메소드
  • contains() ,  containsAll() ,  isEmpty() ,  equals() ,  size() : 데이터 확인용
    메소드
  • clear() ,  remove() ,  removeAll() : 데이터 삭제용 methods

java에서 data 저장은 배열(Array)과 다음 네 가지 자료구조이다.
  • 순서가 있는 목록(List) 형
    • ArrayList
    • AttributeList
    • LinkedList
    • RoleList
    • Stack
    • Vector
    • methods
  • 순서가 중요하지 않은 셋(Set) 형
    • 동일 key에 값이 중복될 수 없어  unique한 값을 저장할 때 필요함.
    • EnumSet
    • HashSet / LinkedHashSet
    • TreeSet
    • methods
      • contains(Object o) /containsAll(Collections c): o / c가 모두 포함된지 확인.
  • 먼저 들어온 것이 먼저 나가는 큐(Queue) 형
    • ArrayDeque
    • DelayQueue
    • LinkedList
    • methods
      • offer(): put
      • poll() / peek(): 꺼내기 / 들여다보기
  • 키-값(key-value) 으로 저장되는 맵(Map) 형 --> Map
    • List와 다른 점은 key값에 값이 매칭 되어 있다는 점이 다르다.
    • 당연히 key는 중복 불가.
    • EnumMap
    • HashMap
    • TreeMap
    • methods
      • get() / put() / putAll(Map m) / size() / isEmpty()
      • clear()
      • containsKey() / containsValue(): key나 value가 있는지 확인
      • equals()
      • hashCode(): map의 hash code를 return
      • keySet(): key를 Set 형태로 return
      • values(): Collection<>을 return.

java.util.Collections
Collection을 쉽게 제어하는데 쓰임.
methods:
  • addAll() / copy() / binarySearch() / fill()
  • checkedCollection() / checkedMap() / checkedList() / checkedSet()
  • checkedSortedMap()/ ~Set()
  • disjoint(Collection c1, Collection c2) 하나도 안겹치면 return true
  • emptyxxx(): 깡통 List / Map / Set 등을 return
  • frequency(Collection c, Object o): c에 o가 몇 개 있는지?
  • indexOfSubList(List l, Object o) / lastIndexOfSubList(): l에 o의 첫 번째 index / 마지막 index
  • list(): ArrayList로 return
  • max() / min()
  • nCopy(): n번 복사한 배열
  • reverse(): 순서를 꺼꾸로
  • rotate() / suffle(): 돌리고 섞기
  • swap(a, b): a, b swap
  • 그 외 매우 많다! 생략함..

java.util.Arrays
 Array를 쉽게 제어하는데 쓰임
methods:
  • asList(): List 형으로 변환해서 return.
  • binarySearch(Object[] o, key):key 값으로 순서를 찾음.
  • copyOf() / copyOfRange()
  • equals() / deepEquals()
  • fill(Object[] a, b): a를 b로 전부 채움
  • hashCode(): hash code return
  • sort(): 앞의 post에서 소개함.
뭐 워낙 자주 쓰는거라 당연히 알고 있어야 한다고 생각함.


쓰다보니 길어졌지만 이게 간단 정리한 것이다.
TODO: 너무 뻔한건 지우자

2014년 9월 18일 목요일

java. sort()

sort()를 사용하기 위해 필요한 것들은:

-->git; java.util.Comparator,  java.util.Collections
알고리즘 공부하면서.. 배열만 보면 '닥치고 소팅!' 하고싶은 순간이 여러번 오게 된다.
그 때마다 검색해서 Compare 어쩌구.. Descending / ascending 등 매 번 잘 몰라 고민할 때가 많아 정리해 보려고 한다.
한 줄 요약하자면, Comparable을 implements 한 객체를 compare()해서 sort() 하는 것이다.
세부 내용은 다음과 같다.

sort()를 쓰기 위해서는 다음이 필요하다.
  •  Arrays, Collections의 object들을 sort() 하여 정렬하려면 자연정렬 하거나.. Comparator를 인자로 주어야 한다.
  • 자연정렬은 Arrays.sort(int[] array)로간단하게되지만, (물론 2차 배열은 Comparator 필요)
  • List를 정렬하는 Collections.sort()와 같은 것은 Comparator를 인자로 주어야 한다. 어떻게 주느냐..
  • Comparator instance를 생성해보면 알겠지만 public int compare()를 override 하게 된다. 여기에 Compare 방법을 구현하면 됨. 음수는 작다 0이면 같다 양수면 크다이다. 쉽지?
  • Comparable를 상속한 Object는 compareTo()를 override하면 된다. 아래 예시에 잘 나와 있음. javadoc에는 다음과 같이 되어 있다.
     * Sorts the specified list into ascending order, according to the
     * {@linkplain Comparable natural ordering} of its elements.
     * All elements in the list must implement the {@link Comparable}
     * interface.  Furthermore, all elements in the list must be
     * mutually comparable (that is, {@code e1.compareTo(e2)}
     * must not throw a {@code ClassCastException} for any elements
     * {@code e1} and {@code e2} in the list).
  • 즉, Comparable을 implement 한 객체만 비교 가능하고 compare()를 override 하여야 한다는 말. 이게 핵심이다. 쉽지? ㅋㅋ

인터넷에서 검색한 예제를 하나 살펴보자.
(출처:http://java67.blogspot.kr/2012/10/how-to-sort-object-in-java-comparator-comparable-example.html)

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 *
 * Java program to test Object sorting in Java. This Java program
 * test Comparable and Comparator implementation provided by Order
 * class by sorting list of Order object in ascending and descending order.
 * Both in natural order using Comparable and custom Order using Comparator in Java
 *
 * @author http://java67.blogspot.com
 */
public class ObjectSortingExample {

    public static void main(String args[]) {
     
        //Creating Order object to demonstrate Sorting of Object in Java
        Order ord1 = new Order(101,2000, "Sony");
        Order ord2 = new Order(102,4000, "Hitachi");
        Order ord3 = new Order(103,6000, "Philips");
     
        //putting Objects into Collection to sort
        List orders = new ArrayList();
        orders.add(ord3);
        orders.add(ord1);
        orders.add(ord2);
     
        //printing unsorted collection
        System.out.println("Unsorted Collection : " + orders);
     
        //Sorting Order Object on natural order - ascending
        Collections.sort(orders); //sorting here.
     
        //printing sorted collection
        System.out.println("List of Order object sorted in natural order : " + orders);
     
        // Sorting object in descending order in Java
        Collections.sort(orders, Collections.reverseOrder());
        System.out.println("List of object sorted in descending order : " + orders);
             
        //Sorting object using Comparator in Java
        Collections.sort(orders, new Order.OrderByAmount());
        System.out.println("List of Order object sorted using Comparator - amount : " + orders);
     
        // Comparator sorting Example - Sorting based on customer
        Collections.sort(orders, new Order.OrderByCustomer());
        System.out.println("Collection of Orders sorted using Comparator - by customer : " + orders);
    }
}

/*
 * Order class is a domain object which implements
 * Comparable interface to provide sorting on natural order.
 * Order also provides copule of custom Comparators to
 * sort object based uopn amount and customer
 */
class Order implements Comparable {

    private int orderId;
    private int amount;
    private String customer;

    /*
     * Comparator implementation to Sort Order object based on Amount
     */
    public static class OrderByAmount implements Comparator {

        @Override
        public int compare(Order o1, Order o2) {
            return o1.amount > o2.amount ? 1 : (o1.amount < o2.amount ? -1 : 0);
        }
    }

    /*
     * Anohter implementation or Comparator interface to sort list of Order object
     * based upon customer name.
     */
    public static class OrderByCustomer implements Comparator {

        @Override
        public int compare(Order o1, Order o2) {
            return o1.customer.compareTo(o2.customer);
        }
    }

    public Order(int orderId, int amount, String customer) {
        this.orderId = orderId;
        this.amount = amount;
        this.customer = customer;
    }

 
    public int getAmount() {return amount; }
    public void setAmount(int amount) {this.amount = amount;}

    public String getCustomer() {return customer;}
    public void setCustomer(String customer) {this.customer = customer;}

    public int getOrderId() {return orderId;}
    public void setOrderId(int orderId) {this.orderId = orderId;}

    /*
     * Sorting on orderId is natural sorting for Order.
     */
    @Override
    public int compareTo(Order o) {
        return this.orderId > o.orderId ? 1 : (this.orderId < o.orderId ? -1 : 0);
    }
 
    /*
     * implementing toString method to print orderId of Order
     */
    @Override
    public String toString(){
        return String.valueOf(orderId);
    }
}

Output
Unsorted Collection : [103, 101, 102]
List of Order object sorted in natural order : [101, 102, 103]
List of object sorted in descending order : [103, 102, 101]
List of Order object sorted using Comparator - amount : [101, 102, 103]
Collection of Orders sorted using Comparator - by customer : [102, 103, 101]

위에서 Order를 sorting 하는방법을 보면
  • Order가 Comparable을 implements 하여 compareTo()를 override 했기 때문에 Collections.sort()로 sorting 하는 방법
  • Order의 내부에 Comparator를 상속받은 class(OrderByAmount와 OrderByCustomer)를 구현해서 sorting 하는 방법을 구현하고 있다. 잘 안보이나? 코드를 잘 뜯어보면 보인다.

사용하는 관점에서 한번 더 정리를 하자면,
  • List를 sorting 하려면 Collections의 sort()를 쓰고 Comparator를 넘겨줘야 하고
  • 배열을 sorting 하려면 Arrays의 sort()를 쓰면 된다. 2차 배열은 마찬가지로 Comparator를 넘겨줘야 한다.
  • 비교를 하려면 비교 대상(Object)이 Comparable이어야 한다.