분류 전체보기 (199)
ººº::Development™:: (66)
::JAVA™:: (9)
::C/C++™:: (6)
::Perl/Python™:: (2)
::WEB™:: (7)
::Media™:: (2)
::Database™:: (8)
::Linux™:: (12)
::zEtc™:: (20)
ººº::Learning™:: (31)
ººº::Information™:: (37)
ººº::Note™:: (11)
ººº::Photo™:: (50)
ººº::zEtc™:: (3)
rss

믹시
tistory 티스토리 가입하기!
'ººº::Development™::/::zEtc™::'에 해당되는 글 20건
2008. 11. 27. 22:21
추상 메소드를 구현하는 것은 하위 클래스이다. 하위 클래스 측에서 메소드를 구현하면 구체적인 처리가 결정된다. 서로 다른 하위 클래스가 서로 다른 구현을 실행하면 서로 다른 처리가 실행될 것입니다. 그러나 하위 클래스에서 어떤 구현을 하더라고 처리의 흐름은 상위 클래스에서 결정한대로 이루어진다.
위와 같이 상위 클래스에서 모든 처리의 흐름을 정의하고, 하위 클래스에서 그 구체적인 내용을 결정하는 패턴이 Template Method 패던이다.

1. AbstractDisplay.java
public abstract class AbstractDisplay {
    public    abstract    void    open();
    public    abstract    void    print();
    public    abstract    void    close();   
    public final void display() {
        open();
        for( int i = 0; i < 5; i++ ) {
            print();
        } close();
    }
}

2. CharDisplay.java
public class CharDisplay extends AbstractDisplay {
    private    char    ch;
    public CharDisplay( char ch ) { this.ch = ch; }   

    public void close() { System.out.println( ">>" ); }
    public void open() { System.out.print( "<<" ); }   
    public void print() { System.out.print( ch ); }   
}

3. StringDisplay.java
public class StringDisplay extends AbstractDisplay {
    private    String    string;
    private    int        width;   
    public StringDisplay( String string ) {
        this.string    = string;
        this.width = string.getBytes().length;
    }
    public void close() { printLine(); }
    public void open() { printLine(); }
    public void print() { System.out.println( "|" + string + "|" ); }
    private void printLine() {
        System.out.print( "+" );
        for( int i = 0; i < width; i++ ) {
            System.out.print( "-" );
        } System.out.println( "+" );
    }
}

4. Main.java
public class Main {
    public static void main(String[] args) {
        AbstractDisplay    d1    = new CharDisplay( 'H' );
        AbstractDisplay d2    = new StringDisplay( "Hello, world." );
        AbstractDisplay d3    = new StringDisplay( "안녕하세요" );
        d1.display();
        d2.display();
        d3.display();
    }
}

어떻게 위의 코드를 보고 금방 이해가 되나여? 저같은 경우에는 앞의 내용들과 크게 다를것은 몬 느끼겠지만 조금씩 다른게 있다는 느낌이 받고 있다.

Template Method패턴을 사용하면 구체적인 알고리즘은 상위 클래스에서 정의대어 있고, 하위 클래스에서는 해당하는 method를 실제로 구현하는 역할을 수행하는 패턴이라고 이해하면 될 것 같다.

:: 그럼 일 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복하기를 ^^* ::



2008. 11. 27. 21:47
우리가 일사 생활에서 10v를 사용하는 전자 제품에 220볼트의 전원을 연결할 때, 중간에 어뎁터라는 것을 사용해서 전류를 변화 시켜주는 거와 같이 Adapter패턴은 한 클래스의 인터페이스를 다른 인터페이스로 변환해 주는 패턴입니다. Adapter패턴을 사용하면 인터페이스 호환성 문제 때문에 같이 사용할 수 없는 클래스를 연결해 줍니다.

아래 예제는 java.util의 Properties 클래스를 사용해 peorperty를 스크림에서 읽고 해당 property내용을 업데이트 한 후 다시 스크림을 쓰는 Adapter Class인 FileProperties Class를 작성하는 것이다.

1. FileIO.java
import java.io.IOException;

public interface FileIO
{
    public    void    readFromFile( String fileName ) throws IOException;
    public    void    writeToFile( String fileName ) throws IOException;
    public    void    setValue( String key, String value );
    public    String    getValue( String key );
}

2. FileProperties.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class FileProperties extends Properties implements FileIO
{
    Properties properties = new Properties();

    @Override
    public String getValue( String key ) { return properties.getProperty( key ); }

    @Override
    public void readFromFile(String fileName) throws IOException {
        properties.load( new FileInputStream( fileName ) );
    }

    @Override
    public void setValue(String key, String value) { properties.setProperty( key, value ); }

    @Override
    public void writeToFile(String fileName) throws IOException {
        properties.store( new FileOutputStream( fileName ), "Written by FileProperties" );
    }
}


3. Main.java
import java.io.IOException;

public class Main {
    public static void main( String[] args ) {
        FileIO    f    = new FileProperties();
        try
        {
            f.readFromFile( "file.txt" );
            f.setValue( "year", "2004" );
            f.setValue( "month", "4" );
            f.setValue( "day", "21" );
            f.writeToFile( "newfile.txt" );
        } catch( IOException e ) { e.printStackTrace(); }
    }
}


아직 이 패턴이 어떻게 쓰이는지는 잘 모르겠지만 전혀 이질적인 인터페이스를 가지는 클래스를 연결할 때, 사용하면 유용할 꺼 같기는 하다. 위 예지를 보면 FileIO Class 만 알고 있다면, FileProperties클래스가 Properties클래스의 메소르에 대해서 몰라고 peroperty를 취급할 수 있다.

정말로 어럽다.. 언제 다 이해를 할 수 있을런지!ㅡㅡ;

:: 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복만이 가득 하기를..^^*; ::



2008. 11. 21. 00:17
지금까지 내가 코딩을 하면서 얼마나 무식하게 코딩을 했는지 요즘 처절하게 느끼고 있다. 팀장님의 코딩 실력과 이사님의 개발자적 시각.. 아주 많이 부족하다는걸 느끼는 가운데 안되겠다 싶어서 공부를 시작한다. 그 첫번째로 패턴...이전에 포스팅에서 얼랭을 공부한다고 했는데 얼랭은 아주 천천히 시간 날때마다 보는 것으로 미루고( 이러면 안되는걸 알면서도 ) 지금당장 공부하는게 급하다!ㅠㅠ;

그 첫번째로 패턴..앞으로 지금 보고 있는 책을 바탕으로 하나하나 패턴에 관해 정리를 해봐야겠다. 이곳에 포스팅 되는 내용은 개인적인 내용도 있고, 지금 보는 책의 내용도 함깨 있음을 미리 밝힌다.

1. Iterator 패턴
모든 언어에서 배열의 요소를 찾기 위해서 for구문과 같은 Loop문을 사용해 요소를 하나하나 찾는다. 이와 같이 첫번째 요소부터 마지막 요소까지 하나하나 찾아 나가는 방법을 일반화한 것이 Iterator 패턴이다. 다시 말해 어떠한 무언가가 모여있는 것들은 단순하게 검색하는 것을 의미한다.

Iterator패턴은 컬랙션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 모요있는 모든 요소에 접근할 수 있게 해주는 방법을 제공한다.

public interface Aggregate { public abstract Iterator iterator(); }

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

public class Book {
    private String    name;   
    public Book( String name ) { this.name = name; }
    public String getName() { return name; }
}

import java.util.ArrayList;

public class BookShelf implements Aggregate
{
    private    Book[]    books;
    private int        last    = 0;
    private    ArrayList<Book>    arrayList;
   
    public BookShelf() { arrayList    = new ArrayList<Book>(); }
    public BookShelf( int maxsize ) { this.books    = new Book[maxsize]; }
   
    public Book getBookIndex( int index ) {
        return ( arrayList != null ) ? (Book)arrayList.get( index ) : books[index];
    }
    public Book getBookAt( int index ) {
        return ( arrayList != null ) ? arrayList.get( index ) : books[index];
    }
   
    public void appendBook( Book book ) {
        if( arrayList != null )   
            arrayList.add( book );
        else if( arrayList == null && last >= 0 )
        {
            books[last]    = book;       
            last++;
        }
    }
   
    public int getLength() { return ( arrayList != null ) ? arrayList.size() : last; }   
    public Iterator iterator() { return new BookShelfIterator( this ); }
}

public class BookShelfIterator implements Iterator
{
    private    BookShelf    bookShelf;
    private    int            index;
   
    public BookShelfIterator( BookShelf bookShelf ) {
        this.bookShelf    = bookShelf;
        this.index        = 0;
    }
   
    public boolean hasNext() {
        if( index < bookShelf.getLength() ) return true;
        else return false;
    }

    public Object next() {
        Book    book = bookShelf.getBookAt( index );
        index++;       
        return book;
    }
}

위에 상당히 많은 코드들이 보이는데 위 코드들은 서가(BookShelf)안에 책(Book)을 넣고, 그 책의 이름을 차례대로 표시하는 프로그램으로 Size가 정해진 서가와 가변 Slze의 서가가 존재하는 프로그램이다.

public class Main
{
    public static void main(String[] args)
    {
        BookShelf    bookShelf    = new BookShelf( 4 );
        bookShelf.appendBook( new Book( "Around the World in 80 days" ) );
        bookShelf.appendBook( new Book( "Bible" ) );
        bookShelf.appendBook( new Book( "Cinderella" ) );
        bookShelf.appendBook( new Book( "Daddy-Long-Legs" ) );
       
        Iterator    it = bookShelf.iterator();
        while( it.hasNext() )
        {
            Book    book = (Book)it.next();
            System.out.println( book.getName() );
        }
       
        BookShelf    bookShelf2    = new BookShelf();
        bookShelf2.appendBook( new Book( "Around the World in 80 days--" ) );
        bookShelf2.appendBook( new Book( "Bible--" ) );
       
        it = bookShelf2.iterator();
        while( it.hasNext() )
        {
            Book    book = (Book)it.next();
            System.out.println( book.getName() );
        }
    }
}

위 프로그램을 실제 테스트 하는 코드로 첫번째서가는 책을 4권만 넣을 수 있는 서가이지만 아래쪽의 코드는 ArrayList를 사용하는 서가이기 때문에 책의 숫자에 상관없이 저장할 수 있다.

코드들을 보다보면 추상 클랙스, 혹은 인터페이스를 많이 사용한다. 나도 아직 잘 사용해 보지 않은 방식이지만 앞으로 하나씩 보면서 몸에 익혀 보도록 해야겠다.

:: 그럼 이글을 읽는 모든 분들에게 오늘 하루 즐겁고, 행복많이 가득하기를 ::



2008. 10. 6. 19:18
  지금까지 얼래에 관해 아주 간단하게나마 간을 보았다. 그런데 정작 프로그램같은 코드는 한줄도 작성해 보지 않았다. 그래서 이번 포스트부터 얼랭으로 간단한 프로그램을 만들어보고 컴파일하고 사용해 보도자.
그럼 처음으로 얼랭에서의 모듈에 관해 알아보자.

1. 모듈
  얼랭에서의 모듈은 코드의 기본 단위이다. 작성한 모든 함수는 모듈에 담기고, 이러한 모듈은 확장자 .erl인 파일로 저장된다. 또한 이렇게 작성된 모듈은 컴파일해야 하며, 컴파일된 모듈은 .beam확장자를 가진다.

다음내용을 geometry.erl파일로 저장한다.
-module( geometry ).
-export( [area/1] ).
area( {rectangle, Width, Ht } )   -> Width * Ht;
area( {circle, R} )                   -> 3.14159 * R * R.

위에서 -module은 해당하는 모듈의 이름이라고 생각하시면 되고, -export는 해당하는 모듈의 함수(?, 이 부분은 추후 다시 설명 )이름과 해당하는 함수의 파라미터 개수를 뜻한다고 생각하자. -module과 -export보다는 아래 내용에 중점을 두고, 위 내용을 간략하게 설명하겠다.
  area 함수는 두 절( clause )로 구성되며, 두 절의 각 패천은 정확하게 하나의 절과 대응한다. 풀어 설명하면 geometry:area( {rectangle, 10, 5} )를 호출하면, 첫번째 절과 매치하게 된다. 이해가 잘 안되면 컴파일 하고 실행해보면서 이해를 해보자.

  먼저 위 내용을 컴파일 하기 전에 위 파일은 erl을 실행하는 폴더에 존재해야 한다. 즉, C:\temp 폴더에서 erl을 실행하면 위 파일은 c:\temp 폴더에 존재해야 한다. 만약 다른 폴더에서 erl을 실행했다면 erl 콘솔에서 "cd( "변경하고자 하는 폴더 path" )." 명령어를 통해 폴더를 변경해 주어야 한다.
1> c( geometry ).
{ok, geometry}
2> geometry:area( {rectangle, 10, 5}).
50
3> geometry:area( {circle, 1.4} ).
6.15752

1번째 라인에서 c( geometry ) 명령을 통해 geometry.erl 파일의 코드를 컴파일 한다. 2와 3번째 라인에서 geomery 모듈에 있는 함수를 호출한다. 함수 이름과 함께 모듈 이름도 포함하고 있음에 유의해서 보자.

  어떻게 위 내용을 통해 모듈에 관해 조금이나마 이해가 되는지 모르겠다. 나는 이 코드를 통해 일단 가장 기보닝 되는 내용은 이해가 되기는 했지만 머 아직도 이해의 폭은 좁고 설명하기에는 많이 부족한거 같다. 다음 포스트에서 함수에 관해 좀더 포스팅을 하다보면 조금 이나마 이해의 폭을 넓일수 있을 것이다.

그럼 이 글을 읽는 모든 분들에게 즐겁고 행복한 일만 가득하기를 기원합니다.!


2008. 10. 6. 18:53
지금까지 얼랭에 관해서 포스팅을 하면서 메모장과 콘솔에서만 작업을 해왔는데 앞으로 좀더 많은 코드들을 작성하다보면 메모장만으로는 힘들꺼 같다는 생각.. 그래서 찾아본 Eclipse플러그인!..바로 구글에서 검색 ...
ㅋㅋ 역시 있다. Eclipse에서 얼랭 프로그래밍이 가능한 플러그인이 존재한다.


바로 설치 후 Eclipse를 실행하면 아래와 같이 Erlang project를 생성할 수 있다.


위와 같이 얼랭 프로젝트를 생성하고 실행하면 된다.! 아직 Eclipse에서 얼랭을 컴파일하고 실행하는 부분은 찾아보지 못해서 그 부분은 추후 다시 한번 포스팅 하도록 하겠다.

그럼 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복한 하루 되시길 ...

'ººº::Development™:: > ::zEtc™::' 카테고리의 다른 글

[Pattren] Iterator 패턴 - Java  (0) 2008.11.21
[Erlang] 초간단 순차 프로그램  (1) 2008.10.06
[Erlang] 얼랭 간보기 #2  (0) 2008.09.29
[Erlang] 얼랭 간보기..  (0) 2008.09.24
[Erlang] 얼랭 출발..  (0) 2008.09.18


2008. 9. 29. 20:00
지난번에 어텀, 튜플, 리스트등을 알아보았다. 오늘은 아주 간단하게 문자열에 관해서만 사설을 풀어놓고 다음 포스트에 얼랭에 관해 정말로 간을 함 보도록 하자.

1. 문자열
  얼랭에서의 문자열은 실제로는 정수의 리스트일 따름이다. 이해가 안되시는 분들이 있을거고 바로 이해되시는 분들도 있으실건데 항상 그렇지만 나중에 다 이해되는 날이 있을 것이다.!ㅋㅋ
얼랭에서의 문자열은 타 언어와 동일하게 큰따옴표( " )로 둘러싸면 된다.
1> Name = "Hello".
"Hello"
 위에서의 문자열은 앞에서 설명드렸듯이 개별 문자를 표현하는 정수 리스트들의 축약형일 뿐이다. 예를 들면
2> [1, 2, 3].
[1, 2, 3]
3> [83, 117, 114, 112, 114, 105, 115, 101].
"Surprise"
4> [1, 83, 117, 114, 112, 114, 105, 115, 101].
[1, 83, 117, 114, 112, 114, 105, 115, 101]
 위에서 보면 3번째에서 리스트 항목이 모두 출력 가능한 문자이기 때문에 문자열이 출력되고 동일한 리스트에 1이 추가된 4번째에서는 1이 출력가능한 문자가 아니기 때문에 그냥 정수 리스트가 출력된 것이다.

자 오늘은 아주 간단하게 문자열만 알아보았다. 이는 이제 시작일 뿐이고 다음 포스트에서 정말로 얼랭으로 아주 간단한 순차 프로그램을 작성해 보면서, 얼랭에 대해 좀더 간을 보도록 하자.

그럼 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복만이 가득하기를..!^_^;


2008. 9. 24. 19:54
지난번 포스트에서 얼랭을 시작해봤다. 그럼 오늘은 얼랭을 시작했으니 이제 얼랭에 대해서 간을 함 봐보자. 여기서 간을 본다 하니무슨 음식도 아니고? 이러는 분들도 있겠지만 나도 그렇고 아직 얼랭의 간도 보기 전이니 그냥 간을 본다고 하자. 왜냐 얼랭을배우면서 이 부분이 아직 이해가 잘 안되는 부분이니깐!^_^;

1. 패턴 매칭
  일반적인 언어에서 "="은 할당문을 나타낸다. 그러나 얼랭에서 "="는 패턴매칭 연산을 뜻한다. 언뜻 이해가 되지 않겠지만이전 포스트에서 변수에 한번 할당되면 그 변수의 값은 바뀌지 않는다고 했다. 이것과 연결해서 패턴매칭은 "Lhs = Rhs"이것에서 일반적인 언어에서 Rhs의 값을 Lhs에 대입하라는 것이 아니라 Rhs의 값을 계산한 다음 Lhs의 패턴과 매칭하라는것이다.
  아직 이해가 되지 않겠지만, 그냥 그렇다라고 생각하자 아래 예는 패턴 매칭을 설명한다.
1> X = ( 2 + 4 ).
6
2> Y = 10.
10
3> X = 6.
6
4> X = Y.
=ERROR ...
위 예에서 보는거와 같이 처음에 X값과 Y값에 각각 6과 10이 바인딩 된 상태이다. 이 상태에서 3번째 라인은 X바인딩된 6과 정수 6의 패턴은 일치하기 때문에 에러가 안나지만, 4번째 라인에서는 X와 Y에 바인딩된 패턴이 일치하지 않기 때문에 에러를 발생시킨다.
즉, 예를 들면 얼랭에서의 "="는 수적적 의미의 "="와 비슷하다. 즉, 좌변과 우변의 결과가 동일하다라는 의미이다.

2. 애텀( Atom )
 애텀? Atom? 도대체 애텀이 머야? 얼래에서의 애텀은 수치가 아닌 상이한 불변 값을 나타내는데 사용한다. 이건 또 무슨 말인가? C나 자바에서의 열거형을 생각하면 쉽게 이해가 될 것이다. 이러한 애텀은 전역(global)으로 선언되며, 반드시 소문자로 시작해야 하고 _나 @와 같은 기호가 올수 있고 작은 따옴표로 묶을 수 있다.

이해가 안되시는 분들이 많이 있을 것이다. 사실 나도 잘 이해가 안되니 하지만 저번에도 말했듯이 언젠가는 이해가 되겠지..? 이런 마음으로 계속 진행을 해보자

3. 튜플( Tuple )
 튜플? 와 도대체 이넘의 언어는 무슨 이런 말들이 많어? 도대체가 이해가 안되네. 하지만 나도 아직 많이는 보지 않았지만 내가 느낀 얼랭은 수학과 유사하다는 느낌이 많이 든다.( 여기저기 수학 공부를 많이 해야한다는 생각만..ㅜㅜ; 사실 수학하기 싫어서 컴터 전공했는데!ㅠㅠ; 후회 막심 )

  머 다시 돌아와서 튜플은 C의 구조체와 유사하며, 다른 점은 형의 선언이나 그런거 없이 데이터의 집합체라고 보면된다. 나는 그냥 집합으로 이해하고 있다. 그런데 이러한 튜플을 코드로 읽거나 이해하기 편하게 첫번째 요소를 해당하는 튜플이 무엇인지를 나타내는 애텀으로 사용한다. 즉 { 10, 25 } 대신 { point, 10, 25 }라고 적는다.
  자 그럼 튜플을 생성하고 사용해 보자
1> F = { firstName, joe }.
{firstName, joe}
2> L = { lastName, armstrong }.
{lastName, armstrong}
3> Point = { point, 10, 45 }.
{point, 10, 45}
  자 이렇게 튜플을 생성했다면 위 튜플을 사용해 보자.
4> {point, X, Y} = Point.
{point, 10, 45}
5> X.
10
6> Y.
45
  헉, 먼가 이상하지 않은가? 똑봐로 봤다. 튜플에서 어떠한 값을 추출하려면, 패턴 매칭 연산자 "="를 사용해야 한다. 다시 말해서 위의 4번에서 Point에서 point를 추출해서 X, Y에 각각 10과 45를 바운드 시킨다. 이해가 되는가? 나도 사실 여기까지는 잘 안됬다. 하지만 책에서 그랬듯이 그냥 가다보면 이해가 될 것이다. 생각하고 그냥 가보는 수밖에

4. 리스트
  튜플이 다수의 데이터들에 대한 묶음이라면, 리스트는 가변적인 개수의 데이터를 담아두는 집합이라고 생각하면 좀더 편할 것이다. 사실 나도 이렇게 이해하고 있다. 또한 리스트는 대괄호 []로 표현한다.
  리스트도 첫번째 요소를 '헤드( head )'라고하고 이후의 나머지를 '꼬리( tail )'라고 부른다. 예를 들어 [1, 2, 3, 4, 5]에서 1이 헤드에 해당하고 나머지 "2, 3, 4, 5"가 꼬리에 해당한다. 머 말이 많아야 머하나 리스트를 생성하고 사용해보자.
1> ThingsToBuy = [{apples, 10}, {pears, 6}, {milk, 3}].
[{apples, 10}, {pears, 6}, {milk, 3}]
2> ThingsToBuy1 = [{oranges, 4}, {newspaper, 1}|ThingsToBuy].
[{apples, 10}, {pears, 6}, {milk, 3}]
자 이렇게 리시트를 생성했다면 리스트에서 해당하는 요소를 추출해보자. 이때 역시 패텬매칭을 유의해서 살펴보자. 우선 리스트에서 헤드와 꼬리를 분리해 내자
4> [Buy1|ThingsToBuy2] = ThingsToBuy1.
[{oranges, 4}, {newspaper, 1}, {apples, 10}, {pears, 6}, {milk, 3}]
5> [Buy2, Buy3|ThingsToBuy3] = ThingsToBuy2.
[{newspaper, 1}, {apples, 10}, {pears, 6}, {milk, 3}]
6> Buy2.
{newspaper, 1}
이 렇게 하면 Buy1에는 {oranges, 4}가 바인딩 되고 나머지가 ThingsToBuy2에 바인딩 된다. 이렇게 하나하나 패턴 매칭을 사용해 리스트에서 하나하나 요소를 추출하면 된다. 즉 5번째 라인이 끝나면, 각각 어떻게 바인딩이 되는지 확인해 보면 될 것이다.

자 오늘도 여기까지 하고, 다음에 문자열을 시작으로 다시 시작해보도록 하겠다. 그럼 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복만이 가득하길...


2008. 9. 18. 19:36
한시간동안 작성한 내용 다 날려먹고 다시 작성하네요..
지난번 포스티에서 얼랭을 배우면서 하나하나 내용을 정리한다고 했듯이 이번에 그 첫번째로 포스팅을 합니다. 즉, 저두 책을 조금 봤다는 내용이지요!!^_^..

1. 얼랭 설치
  - 다운로드 : http://www.erlang.org/download.html
  - 윈도우 : 위 링크에서 바이너리 파일을 다운로드 받아서 여타 다른 어플리케이션을 설치하는 거와 동일하게
               다음다음 누르면 설치 완료
  - 리눅스 : 위 링크에서 소스코드를 다운받아 소스 컴파일을 하거나, yum을 사용해 설치하면 된다.( 소스 컴
               파일 방법과 여타 다른 방법은 따로 설명을 하지 않겠습니다. )

    그리고 앞으로의 얼랭 관련된 포스트는 모두 윈도우에서 작성된 내용을 기반으로 포스팅 하겠습니다.

2. 얼랭 실행
  - 설치가 완료되면 시작 -> Erlang OTP XXX -> Erlang을 선택하면 얼랭 콘솔이 동작한다. 이 콘솔에서 기
    본적인 명령을 실행해보고 결과를 확인할 수 있다.
  - 만약 윈도우 PATH를 설정해 놓았다면 윈도우 콘솔에서 erl 명령어를 통해 바로 얼랭콘솔로 접속할 수 있
     다.


3. 정수
  얼랭은 정수의 범위가 따로 정해저 있는거 같지는 않다. 그냥 설정하는대로 엄청나게 큰 수까지 모두 계산을 할 수 있다.
1> 2 + 3 * 4.
14
2> ( 2 + 3 ) * 4.
20
3> 123456789 * 987654321.
XXXXXXXX ...
 또한, 진수 계산도 별 무리없이 사용 가능하다.
4> 16#cafe * 32#suger.
1577682511434

자 위와같이 아주 간단하게 얼랭으로 수직을 계산해 봤다. 이 때 눈치 빠르신 분들은 느겼을 것이다. 바로 모든 명령어의 끝이 "."으로 끝나는 것을 알 수 있다. 여기서 얼랭의 첫번째 문법을 배웠다. 얼랭은 C나 JAVA에서 ";" 으로 문장의 끝을 표현하듯이 "."으로 문장의 끝을 표현한다. 이것을 아주 중요하니 습관처럼 사용하기 바란다.

4. 변수
변수가 무엇인지는 말을 안해도 알것이고 얼랭에서의 변수는 아래와 같이 사용한다.
1> X = 123456.
123456
자 위와 같이 변수를 사용하면 된다. 머 다른 언어와 별 차이를 못느끼겠다. 하지만 여기서 다른 언어와 가장 큰 차이점이 있다. 얼랭에서의 변수는 "단일 할당 변수( Single assignment variable )"로 한번 할당이 이루어지면 더이상 해당하는 변수의 값을 바꿀 수 없다는 것이다. 만약 할당된 변수에 다른 데이터를 할당하고자 하면 얼랭은 오류를 토해내게 될 것이다.

다음 포스트에서 알려드리겠지만 얼랭은 기본적인 수학의 문법을 따르기 때문에 변수를 선언하고 사용하는데 다른 언어와 약간의 차이점이 있다. 또한 위와 같이 특정변수에 값이 할당되면 "바운드( bound )변수"라 부르고, 그렇지 않을 경우에는 "언바운드( unbound )변수" 라고 부른다..

자 오늘은 여기까지만 하고 다은포스트에 위 변수의 예기를 이어서 패턴, 어텀, 튜플 등에 대해서 알아보도록 하겠다. 처음에 작성한 이후 한번 날려먹고 나서는 내용이 많이 줄어든 감이 있지만 저와같이 처음 얼랭을 시작하시는 분들께 조금이나마 도움이 되길 ...

그럼 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복만이 가득하길...




2008. 9. 11. 18:52
사용자 삽입 이미지
얼마전에 이리 저리 블로그를 뒤적이는 가운데 신기한 글을 봤다. 바로 얼랭.. 얼랭.. 얼랭으로 무엇을 얼랭으로 이거를 해봤다.. 이런 글들이다. 이러지리 아는것도 없음서 궁금한건 못참는 성격이라 일단은 얼랭이 무엇인가 부터 찾아봤더니" 함수형 언어로 멀티코어에서 상당히 빠른 속도로 실행되는 프로그램을 작성할 수 있다." 라는 글들과 몇몇의 포스트를 확인 할 수 있었다.

이러한 가운데 그런가보다 하고 넘어갈려는 찰라.. 요즘 회사 업무도 안되고 먼가 새로운게 필요하다는 생각에 그래 이왕 궁금한점이 생겼는데 한번 배워보자라는 생각으로 덜컥 책부터 구입했다.
사용자 삽입 이미지


이제부터 하나하나 읽으면서 시작해야지 일과 중에는 힘들겠지만 그래도 일과 이후에 짬짬이 책보면서 코드 한줄 한줄 따라가다보면 좋겠지.. 이걸로 이전에 만들어놨던 프로그램을 좀더 빠른 속도로 처리할 수 있지 않을까? 등등 가지가지 생각을 가져보고 있다.

앞으로 열시미 아자아자 하나하나 둘둘, 하나 둘 계단을 올라가듯이 천천히 하지만 착실하게 올라가보자!! 아자아자!

일단 그 첫번째로 얼랭부터 다운받아서 깔고, 한 챕터를 끝낼때마다 이곳에 해당하는 챕터의 내용을 요약하고 내가 이해한 그대로 포스팅을 해나가겠다. 이 이유야 머 당연하겠지만 복습과 책속의 내용을 다시 한번 머릿속에 정리하는 과정, 또한 나와같이 시작하시는 분들을 위해 한줄!! 한사람의 생각보다는 여러사람의 생각이 좋고 그런 가운데 좋은 정보들이 생산될꺼 같다는 느낌에! ㅋㅋㅋㅋ

:: 얼랭 사이트 ::
www.erlang.org

:: 관련 도서 ::
Programming Erlang - 강컴

자 그럼 이포스트를 읽는 모든 분들께 오늘 하루 행복한 하루 되시길 기도드립니다.!


2008. 8. 26. 08:45

사용자 삽입 이미지
구글이 휴대폰이나 PC의 웹 브라우저에서 특정 위치정보를 파악할 수 있는 API '기어스 지오로케이션 API'를 공개했다고 외신이 보도했다.

지오로케이션 API는 모바일혹은 무선 인터넷이 가능한 곳에서 현재의 위치를 파악하여 제공하는 API이다. 이를 이용해서 사용자는 구글 맵스 등을 통해 현재 위치에서 가장 가까운곳의 레스토랑이나 백화점 등의 지역정보를 얻을 수 있게 된다.

모바일의 경우는 무선전화기지국이나 GPS를 이요하고, PC는 IP주소를 통해 현 위치를 산출한다고 한다. 이는 사용자로 하여금 자신의 위치정보를 따로 입력할 필요가 없다는 뜻이기도 하다.

기사 내용으로는 사용자의 개인정보를 따로 입력받지 않기 때문에 사생활 침해의 위험이 없다고 했으녀, 신뢰할 수 있는 사이트에서만 위치 파악 기능을 허가하도록 추천하고 있다고 밝혔다.


위 기사내용을봐서는 구글이 자신들이 말하는 광고회사와 정확하게 맞아떨어지는 서비스 같다는 느낌이다.
지오로케이션 API를 사용하면 지역정보에 기반한 광고가 충분히 가능하기 때문이다.!
머 구글이 지역정보에 기반한 광고목적으로 사용을 허가해 줘야만 가능한 얘기지만 그래도 광고회사인데 해주지 않을까?


prev"" #1 #2 next