[카테고리:] 컴퓨터

  • 파이썬

    파이썬은 아무래도 나랑 안맞는다.

    예를 들어, 30×30의 배열을 선언하고 거기에 뭘 채워넣고 싶은데, 문법이 이상하다.

    a = [[[0]*30]*30]

    이러면 0으로 채워진 30차 정사각형 배열이 선언된다.

    잘 안읽힌다.

    아무튼. 그보다는, 뭘 만들어야 하는지 이해를 못한 상황에서 만드는 프로그램을 만들 수 없다. 뭘 만들어야 하더라?

  • 스마트폰으로 인터넷공유

    스마트폰과 노트북이 있으면 다음과 같은 것이 가능하다.

    (Desire폰 SKT 기준)

    1. 3g+wifi테더링

    전화기를 3g망으로 연결하고, wifi로 컴퓨터와 연결한다. 기본적으로는 KT의 EGG서비스와 동일한 개념이 된다. 3g무선데이터용량을 사용하게 되므로 용량 초과시에는 요금폭탄을 맞을 수 있으므로 정신줄 놓지 말자. wifi테더링 할 때

    비밀번호를 설정해 두지 않으면 아무나 접속하여 사용 가능해 지므로 요금폭탄을 맞을 수 있다.

    매우 주의하자.

    2. 3g+USB테더링

    1번과 같은데, 무선랜을 사용할 수 없는 경우에 컴퓨터에서 무선랜을 쓸 수 있게 된다. 3g용량을 사용하므로 조심하자.

    3. wifi+USB테더링

    2번과 같은데 3g데이터를 사용하지 않는다. 무선랜을 사용할 수 없는데, 근처에 접근 가능한 무선랜이 있을 때 사용할 수 있드. 특히, 최근에 접근 제한된 T wifi zone을 컴퓨터에서 사용할 수 있는 방법이다. 3g용량 걱정없이 마음껏 쓸 수 있다.

  • 컴퓨터 뇌수술

    컴퓨터에서 기억을 담당하고 있는 하드디스크를 상호 교환 이식하는 수술에 성공했다. R410과 T290을 교체하는 대 공사였다. 특히 T290의 분해가 매우 어려운 일이었는데, 중고 판매를 포기하는 정도의 노력을 거친 결과 성공하였다.

  • OS에 대하여


    http://bit.ly/pRfCCQ

    KBS의 동영상이다. 여긴 임베드 방식 퍼가기를 허용하지 않아서 링크만 올린다.

    OS가 뭐하는 놈인지 간단하고 쉽게(초보자 수준으로) 설명하고 있다.

  • Semi infinite loop

    어쩌다보니 아래와 같은 반복문을 쓰게 되었다.

    for M1 in numpy.arange(1e24, 1e26, 1e23):

    for M2 in numpy.arange(1.0, 30.0, 1.0):

    for M3 in numpy.arange(1.0, 30.0, 1.0):

    for v in numpy.arange(1.0, 30.0, 1.0):

    for w in numpy.arange(1.0, 30.0, 1.0):

    for d1 in numpy.arange(0.0, 10.0, 0.5):

    for d2 in numpy.arange(0.0, 10.0, 0.5):

    지금 24시간째 돌고 있는데 안 끝나고 있다. 대략 32억번 정도의 반복해야 하는데, 언제 끝나려나…

    7차원 공간에서 해당 영역 전체를 스캔해야 하는 계산이라, 최적화는 불가능하다.

  • Contour 그림 그리다가 문제

    Gnuplot의 영역에서 또다시 삽질이 시작되었다.

    저런 데이터가 있다. 문제는…

    원본을 splot으로 그려보면 위와 같이 0부터 1까지 골고루 존재하는데

    contour plot을 위해 dgrid3d 를 켜고 그리면 위와 같이 0.2 이하로는 내려가지 않는다는 것…

    뭐가 문제일까. 인간이 문제인가?

  • 변수 교환하기

    파이썬으로 프로그램을 만들다 보니 편리한 기능을 발견했다.

    A = B

    위와 같이 쓰면 B의 값이 A에 대입된다.

    A, B = C, D

    위와 같이 쓰면 C의 값이 A에 들어가고 D의 값이 B에 들어간다.

    A, B = B, A

    위와 같이 쓰면 A와 B의 값이 교환된다.

    이걸 응용해서 좌표를 회전시키는 함수를 만들 수 있다.

    angle = 10.0

    x, y = x*cos(angle)+y*sin(angle), -x*sin(angle)+y*cos(angle)

    참 쉽죠?

  • 연구소에서 만든 프로그램들

    포트폴리오용으로.

    나도 내가 뭘 만들었는지 잊어먹을 것 같아서 기록해 둠.

    1. TOF분석 프로그램(TOFANG)

    2. 자동 Shot counter 아키텍처

    3. 실험 결과 자동 분석 프로그램(Analyzer)

    4. 전자빔 스펙트럼 프로그램(ESMC)

    5. 엑스선 스펙트럼 프로그램(XSMC)

    6. 실험실 자동화 아키텍처

    7. TP분석 프로그램(TIARRA)

    8. beam pointing checker(BPC)

    9. TIFF converter

    10. Winspec SPE file converter

  • 고유값 구하기 문제

    컴퓨터를 이용해서 기계적으로 선형대수학 문제를 풀다 보면 흔히 만나는 문제가 고유값(Eigenvalue)구하기 문제이다. 그리고 이 문제를 풀다 보면 흔히 만나는 문제가 고유값의 순서이다.

    컴퓨터는 답만 맞으면 되지? 하는 철학으로 구현된 계산 방법을 이용하는데, 그러다보니 행렬을 연속적인 변수로 만들어 냈을 때 고유값의 순서가 바뀌는 경우가 있다. 내가 풀어야 하는 문제는 고유값의 순서가 바뀌면 안되는 문제이고 이 문제를 어떻게 해결하느냐가 관건이다.

    다음의 알고리즘을 참고하자.


    http://snowall.tistory.com/2595

    그리고 만든 것이 다음 프로그램이다.

    import numpy

    eig = numpy.linalg.eig

    matrix = numpy.matrix

    absn = numpy.abs

    a0 = 0

    a1 = 1

    a2 = 2

    for t2 in numpy.arange(-6.0, 6.1, 3.0):

    file = open(“data”+str(t2)+”.txt”, ‘w’)

    for t1 in numpy.arange(-r, r, stepping):

    test=eig(massMatrix(t1, t2))

    a2 = numpy.nonzero(test[0]==test[0].max())[0][0]

    a0 = numpy.nonzero(test[0]==test[0].min())[0][0]

    a1 = 2*(a0+a2)%3

    file.write(

    str(t1)+”\t”

    + str(t2)+”\t”

    + str(absn(test[0][a0]))+”\t”

    + str(absn(test[0][a1]))+”\t”

    + str(absn(test[0][a2]))+”\t”

    + str(absn(test[1][0, a0]))+”\t”

    + str(absn(test[1][0, a1]))+”\t”

    + str(absn(test[1][0, a2]))+”\t”

    + str(absn(test[1][1, a0]))+”\t”

    + str(absn(test[1][1, a1]))+”\t”

    + str(absn(test[1][1, a2]))+”\t”

    + str(absn(test[1][2, a0]))+”\t”

    + str(absn(test[1][2, a1]))+”\t”

    + str(absn(test[1][2, a2]))+”\t”

    + str(a0)+”\t”

    + str(a1)+”\t”

    + str(a2)+”\n”)

    이중 massMatrix는 논문에 써야 하는 영업비밀이라 공개하기가 좀 그렇고, 3차 정사각 행렬을 되돌려 주는 함수라는 것만 알려둔다.

    이런식으로 출력시키면 고유값이 끊기지 않고 부드럽게 이어져서 나온다.

    이 문제는 내가 석사때도 마주쳤었는데, 그땐 복소수로 이루어진 3차 정사각 행렬의 고유값 계산하는 1000줄짜리 프로그램을 직접 만들어서 풀었었다. 내가 미쳤었나보다. -_-;

  • 가게 여는 시간


    http://kldp.org/node/124415

    위의 문제를 풀어보았다.

    문제: 어떤 가게가 여는 시간이 a, 닫는 시간이 b라고 하자. x를 입력하면 가게가 열었는지 닫았는지 알려주는 함수를 만들어 보자.

    예: a=2시, b=15시. f(x=12)=true, f(x=1)=false, f(x=17)=false

    예: a=20시, b=5시. f(x=1)=true, f(x=12)=false, f(x=23)=true

    C언어라고 가정하자.

    가장 빠르게 떠오르는 답은 다음과 같다.

    isOpen(int a, int b, int x){

    if a if a return true;

    } else{

    return false;

    }

    } else {

    if a>x || x>b{

    return true;

    } else{

    return false;

    }

    }

    }

    KLDP게시판에 많은 고수분들이 괜찮은 풀이를 올렸는데, 그중에 내가 제안한 것 두가지만 여기서 설명하도록 하겠다.

    첫번째로

    isOpen(int a, int b, int x){ return ((a-b)(x-a)(x-b)/abs((a-b)(x-a)(x-b))+1)/2; }

    일단 ab인 경우에 bb이면 a-b는 양수이다. 이 경우에도 b 이 함수의 문제는 a=b, a=x, b=x인 경우에는 0으로 나누는 문제가 발생한다는 점이다. 예외처리를 위해서 if문을 쓸 수밖에 없게 된다.

    두번째로

    isOpen(int a, int b, int x){

    return (x-a+n)%n<(b-a+n)%n;
    }

    여기서 n은 하루의 길이를 나타내는 정수이다. 이런식으로 계산하는 것이 가능한 것은 24시간을 기준으로 할 때 항상 xb일 수 있겠지만(a=b는?) 실제 개념으로는 항상 ab인 경우에는 b-a가 음수가 되는데, 그런 사태를 막기 위해서 양변에 n을 더해준 후에 %로 잘라주게 된다.

    세번째로

    isOpen(int a, int b, int x){

    return (a-b)(x-a)(x-b)>0;

    }

    첫번째 답의 변형이다. 셋 중에서 제일 간단한 것 같다

    .