ARM의 FSR(Fault Status Register) Spec을 보면

ARM9 까지는 Read/Write 상태를 알 수 없고 , ARM11부터 지원하는 것 처럼 보인다 - (1 << 11 bit - Linux kernel "fault.h")

그렇다면, ARM9에서 CoW는 어떤식으로 지원되었을까?

자세히 살펴보지는 않았지만, vendor에서 지원했거나, 아니면, MMU에서 해당 정보를 알 수 있는 방법을 제공했을 수도 있겠다.

(아니면... 내가 모르는 무언가가 있을수도...)

어쨌든 CoW는 memory write순간을 Processor가 알 수 있어야만 구현이 가능하다!

'Domain > Linux' 카테고리의 다른 글

Read line from file or standard input....  (0) 2013.11.28
[Linux] mmap and memory...  (0) 2013.10.07
git server daemon 설치하기  (0) 2013.06.13
atime 대신에 strictatime을 사용하자!  (0) 2013.05.31
[Shell] Variable Name Expansion  (0) 2013.03.28

보통 Eclipse에서 Javadoc을 사용하기 위해서는 아래의 링크를 참조하면 된다.

http://stackoverflow.com/questions/9873152/how-to-attach-javadoc-or-sources-to-jars-in-libs-folder


그렇지만, ADT의 경우는 약간 다르다.

위의 링크를 자세히 살펴보면... 아래쪽에 ADT의 경우 libs directory를 사용하면 안된다는 내용의 minor 답변을 볼 수 있을 것이다.

그렇다!

ADT의 경우는 libs directory를 일반적은 Eclipse와는 달리 사용하는 듯 하다.

따라서, ADT에서 javadoc을 사용하기 위해서는 libs directory가 아닌 다른 외부 directory를 만들어서 Add JARs 메뉴를 통해서 jar archive를 build path에 추가해야 한다. 그 다음, 해당  jar archive가 project의 Referenced Libraries 아래에 정상적으로 추가되었는지 확인한다.

위의 과정이 정상적으로 이루어 졌다면, 위의 stackoverflow 에서의 답변(ADT관련 답변) 에서 언급한 대로


해당 jar archive 선택 -> 우클릭 -> Properties 선택 -> Javadoc Location 메뉴 선택 -> javadoc location을 입력 -> project close -> project open (reopen)


과정을 거치면, java doc이 정상적으로 동작하는 것을 확인할 수 있다.

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class Main {
    private static volatile int sCnt = 0;
    private static class TestRun implements Runnable {
        @Override
        public void
        run() {
            int num = sCnt++;
            System.out.println("Run(" + num + ") - Start");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ignored) { }
            System.out.println("Run(" + num + ") - End");
        }
    };
    public static void
    main(String[] args) {
        ThreadPoolExecutor tpe = new ThreadPoolExecutor
                (2,
                 2,
                 Long.MAX_VALUE,
                 TimeUnit.MILLISECONDS,
                 new LinkedBlockingQueue());
        int num = 10;
        while (0 < num--)
            tpe.execute(new TestRun());
    }
}

많은 회사들이 굴곡을 겪게 된다.

완전히 망하지는 않더라고, 흥(興)했다가 쇠(衰)했다가를 반복하게 마련이다.

사세(社勢)가 안 좋을때는 "좋지 않은 회사"라는 인식때문에 소위 스펙이 좋은 사람들, 다시말하면, 일반적인 회사들이 채용하고 싶어하는 조건을 갖추어서 원하는 회사를 선택할 수 있는 정도의 사람들은 입사를 꺼려하게 된다.

그러나 그 반대의 경우, 즉 사세가 상당히 좋을 때는 "좋은 회사"라는 인식을 가지게 되고, 좋은 사람들이 많이 들어오게 된다.


물론, 회사가 얼마나 잘 되느냐는, 회사에서 어떤 사람들이 일하고 있느냐에 따라 상당부분이 결정된다.

그렇지만, 그런 문제 뿐만이 아니라, 다양한 원인 - 사람, 환경, 전략 등등 - 소위 '흐름' 이라는 것이 존재하고, 이 흐름에 따라 기업은 상승기와 하강기를 겪게 된다.

그리고, 기업은, 회사에 기여한 업적을 기준으로 보상하므로, 소위 '안 좋은 상황'에 회사에 몸담고 있던 사람들은 '상승기'가 되면, '업적'과 더불어 회사가 어려웠을때, 기여했던 공로 - 아이러니 하게도, 그 중 상당수는, 다른 곳으로 이직할 수 있는 역량이 되지 못해서, 어쩔 수 없이 남아 있던 사람들일 가능성도 무시할 수 없다. - 를 인정받아 승진하게 된다.


자~, 이제 회사는 소위 "좋은 회사"로 인정받는 기간에 접어 들었다. 그리고, 사세가 확장되었으므로 일거리가 많아지고, 사람이 많이 필요하게 되었다.

따라서 신규 사람을 채용하게 되고, 이제는 "좋은 회사"로 인정받기 때문에, 뛰어난 스펙/실력/역량 의 지원자들이 몰리게 된다.

이런 과정을 거치게 되면, 회사의 인력 구조는 제목에서 언급한 바와 같이, 실질적인 역량이 떨어지는 사람이 뛰어난 실력의 신입 입사자들을 관리하는 구조로 만들어지게 된다.


회사의 관점이 아니라, 개인의 관점에서 보면, 어떤 사람이 "나는 왜 이직하는 회사마다 망하거나, 아니면, 회사가 어려워지지?"라고 생각한다면, 그 이유는 십중팔구 그 사람이 소위 "뛰어난 사람"이기 때문일 가능성이 높다.

뛰어난 사람이므로, 이직할 당시 "최고의 회사"에 지원해서 합격할 것이다. 보통 "최고의 회사"라고 칭해지는 곳은 그 회사의 정점에 서 있을 확률이 높다. 즉, 더 좋아지기 보다는 이제 하강기에 접어들 가능성이 높다는 뜻이다.

따라서, 이런식의 이직을 몇차례 경험하게 되면, 앞서 이야기 한 바와 같은 생각을 가지게 되는 것도 무리는 아닐 것이다.


어쨌든... 만약, 내가 생각하고 있는 이런 가정들이 충분히 납득할 만하다면, 이직을 할때, 소위 "최고의 회사"에 들어가는 것 보다는 "성장 가능성"을 보고 입사하는 것이 좋아보인다. 물론... 어떤 회사가.. 흥할것이냐 망할 것이냐는 누구도 알 수 없겠지만.... -_-;


많은 기업들이, 직원들이 업무시간 중에 소위 '잡담'하는 것을 굉장히 싫어 - 일을 안하고 '논다'고 생각하는 듯 하다. - 하는 것 같다.

그래서, 직원들이 휴식할 수 있는 공간을 별로 만들지 않거나, 눈치를 보며 만들더라도 접근성이 어려운 곳에 위치한 경우가 많다.

비록 그것이 '고의적'인 조치는 아니라 할지라도, 직원들의 휴식공간이 회사의 업무공간 배치에 우선순위를 가지가 어렵기 때문에, 결국 접근성이 좋지 않은 곳으로 결정나는 경향도 있을 것이다.


그 원인이 어찌되었던 간에, 휴식공간에 대한 직원들의 접근성에 문제가 있는 경우 어떠한 문제가 발생할까?

직원들의 복지, 만족도 같은 당연하고 일차원적인 영향은, 너무나 당연한 것이므로 따로 이야기 하지 않겠다.

문제는, 직원들이 소위 '잡담'을 하고자 할때, 혹은 짧고, 간단한 업무회의를 하고자 할때 발생한다.

간단한 업무회의라, '회의실'을 따로 잡기에는 좀 무리가  - 회의실은 대부분 항상 부족하기 때문에 막상 예약하려고 해도 사용할 수 있는 곳이 없는 경우가 다반사다. -  - 있으므로, 그냥 업무하는 공간 - 큐비클 - 안에서 이야기 하는 경우가 종종 발생하게 된다.

'잡담'역시, 휴게공간에 가는 것이 귀찮으므로 - 접근성이 떨어진다 - 그냥 큐비클 안에서 이루어지는 경우가 많게 된다.

문제는, '회의'나 '잡담'을 하는 당사자가 아니라, 그 주변 사람들이다.


소프트웨어 회사의 경우를 생각해 보자.

소프트웨어는 엄청난 집중력을 요구하는 업무가 많다. 그런데, 이때 주변에서 '회의'를 하거나, '잡담'을 하는 소리때문에 집중하기 어려운 환경이 조성되게 되면, 업무에 차질을 빚게 된다.

100여명이 일하는 공간을 가정해 보면, 그 중 한 곳의 2~3명이라도  이러한 '큐비클 안 회의/잡담'을 하게 되면, 다른 97~98 명은 집중을 요구하는 일을 하기에 대단히 어려운 환경에 처하게 되는 것이다.

그렇다고 해서, '업무 큐비클에서 회의하거나 잡담하지 말라'라는 공문/지시를 하는 방법으로 해결하려고 한다면, 이 또한 흐지부지 될 가능성이 높다.

처음 며칠은 지켜질 수도 있겠지만, 약간만 시간이 지나게 되면, 또 다시 이러한 문제들이 발생하게 된다. 왜냐하면, 근본적으로 이 문제를 '처벌의 대상'으로 보기에 상당한 무리가 따르고, 객관적인 '측정기준' - 처벌을 위한 - 을 만들 수가 없으므로, 지켜지지 않을 것이다.

결국, 직원들의 휴게 공간이 부족 + 접근성의 문제는 전체적으로 보면, 직원들의 업무 효율성과도 직접적인 연관성이 있다.


소위 '직원들이 노는 꼴을 못 본다.'는 회사가, 직원들의 휴게 공간에 대한 접근성을 심하게 떨어뜨리게 되면, 역설적으로 '직원들이 일을 제대로 할 수 없는' 환경을 만들게 되는 것임을 깨달을 필요가 있다.


Commands in Rule is called after entire 'make' is parsed.

Ex.

A:=a
B:=a

define prv
    @echo $(1) : $(A) / $(B)
endef

a: b
	$(call prv,[a])

B:=b

b:
	$(call prv,[b])

B:=c


Above 'make' gives following results

[b] : a / c
[a] : a / c

That is, commands are executed after executing last 'make' statement 'B:=c'.


But, assignment in dependency phase is something special.

In this case, assigned value is effective only in that target and it's dependents in rule chain.

And, after checking all dependencies, command is executed.

Ex.


Above 'make' gives following results

A:=a
B:=a

define prv
    @echo $(1) : $(A) / $(B)
endef

a: d b e
	$(call prv,[a])

B:=b

b: B:=x
b: c
	$(call prv,[b])
b: B:=y

c:
	$(call prv,[c])

d:
	$(call prv,[d])

e:
	$(call prv,[e])

B:=c
Above 'make' gives following results
[d] : a / c
[c] : a / y
[b] : a / y
[e] : a / c
[a] : a / c

One interesting point here is, dependency is checked in order. So, for target 'a', dependency is checked  by 'd' -> 'b' -> 'e' order.

[ will be updated time to time. ]

int (*arr)[SZ] = (int (*)[SZ])malloc(sizeof(int) * SZ * SZ);


이것은 function pointer와 비슷하게 이해하면 되는데...


int(*)[SZ]  <=> void(*)(int, char)

int(*arr)[SZ] <=> void (*func)(int, char)


int [SZ] array에 대한 pointer type => int(*)[SZ]

void (int, char) function에 대한 function pointer => void(*)(int, char)

[ From GNUMake documenet ]

We say that expansion is deferred if

expansion is not performed immediately. Expansion of a deferred construct is not performed

until either the construct appears later in an immediate context, or until the second phase.


Variable Assignment

Variable definitions are parsed as follows:

immediate = deferred

immediate ?= deferred

immediate := immediate

immediate += deferred or immediate


define immediate

deferred

endef


define immediate =

deferred

endef


define immediate ?=

deferred

endef


define immediate :=

immediate

endef


define immediate +=

deferred or immediate

endef


For the append operator, ‘+=’, the right-hand side is considered immediate if the variable

was previously set as a simple variable (‘:=’), and deferred otherwise.


Tested on Android ICS.


- Making Android project that has normal java entry function - 'public static void main(String[] args) { ...  }'.

  (ex. make 'public static void main(String[] args) { ... }' at 'my.test.Main' )

my/test/Main.java

-----------------


    package my.test;

public static void main(String[] args) {

System.out.println("Hello!");

}

- Making 'xxx.apk' by exporting Android project. (You don't need to care about signing.)

- Let's test with following commands

    $> adb push xxx.apk /data

And then programs can be run with following commands

    $> export CLASSPATH=/data/xxx.apk
    $> app_process /system/bin my.test.Main
or
    $> export CLASSPATH=/data/xxx.apk
    $> dalvikvm my.test.Main
or
    $> dalvikvm -classpath /data/mytest.apk my.test.Main

'main' function should be run.


IMPORTANT POINT here is knowing that 'apk' is a kind of 'jar' in JAVA.

See inside 'apk', then you can figure out structure of 'apk' is very similar with 'jar'.

And this is the hint of above way.


And, you can also find classes.dex at <android project root>/bin/ . and this is just like classes.jar of java.

So, this classes.dex can be replace xxx.apk above.


WARNING!




"Project Properties -> Java Build Path -> Order and Export tab" 에 가서 check 'Android Private Libraries' check box.


+ Recent posts