728x90

출처 : http://ggari.tistory.com/220


Posted by 앗뜨거
,
728x90

table test 의 column이


name, score가 있다고 할 때


John / 50

Matthew / 40

Cain / 70


일 때 


select @rownum:=@rownum+1 as num, t.* from test t, (SELECT @rownum:=0) r 


로 하면 


num/name/score


1 / John / 50

2 / Matthew / 40

3 / Cain / 70


로 되고


select @rownum:=@rownum+1 as num, t.* from test t, (SELECT @rownum:=0) r  ORDER BY score DESC


로 하면


1 / Cain / 70

2 / John / 50

3 / Metthew / 40


로 나온다

'프로그래밍 > MySQL' 카테고리의 다른 글

[MySQL] 명령어 정리2  (0) 2014.07.09
[MySQL] Rank계산  (0) 2014.07.08
엑셀 파일을 Mysql 로 자료 넣기  (2) 2014.07.04
mysql date 현재시간으로 insert 하기  (0) 2014.06.23
MySQL 백업 및 복원  (0) 2014.06.20
Posted by 앗뜨거
,
728x90

여러가지로 검색하고 해보아도 초보입장에서 쉽게 이해가고, 되는 내용들이 없어 Mysql사이트의 다큐먼트를 참고로해서 작업해보았습니다. 


다른방법들에 비해 약간 번거롭긴하지만, 정확하고 빠른 데이타 삽입이 가능하여, 혹시 저처럼 해매시는 분들이 계실까 하여 올려봅니다. 


[상황] 


mysql에 사용할 db와 테이블을 생성하였으며, 각 테이블에는 사용할 컬럼이 정의되어있다. 그런데 이곳에 엑셀파일로 가지고 있는 데이타를 한방에 빠르게 입력하고 싶다. 


예) 데이타 베이스: testdb 

    테이블명      : member 

    member 테이블의 컬럼: name,id,password,phone,mphone,email 


    데이타 베이스의 캐릭터셋은 utf-8이다. 


컬럼데이타에 해당하는 엑셀파일 memberinfo.xls파일을 가지고있다. 


==================================================== 


상황은 다들 이해 가시죠?? 지금부터 작업을 시작해 보겠습니다. 


1. 엑셀파일에는 입력할 데이타가 테이블 컬럼 순서에 맞게 입력이 되어있어야 합니다. 

    즉, 엑셀파일의 왼쪽부터 "이름/아이디/패스워드/전화번호/핸드폰/이메일" 이런식 

    으로 데이타가 입력되어있어야 합니다. 컬럼명은 필요없습니다. 데이타만.... 


2. 이상태의 엑셀파일을 다른이름으로 저장 합니다. ==>txt파일(탭으로분리) 


3. 이부분이 중요합니다. 이부분이 생략되면 한글이 정상적으로 입력되지 않습니다. 

    생성된 텍스트 파일을 윈도우에서 열어줍니다. 

    그냥 열기만 하면됩니다.  열린상태에서 그대로 다른이름으로 저장 합니다. 

    이때, 가장아래 쪽에 보면 인코딩 방식을 선택할 수 있는 곳이있습니다. 

    그곳에서 인코딩 방식을 UTF-8로 선택하고 저장합니다. 


4. 이렇게 utf-8방식으로 저장된 텍스트 파일을 ftp를 이용해 계정에 올립니다. 


5. ssh/telnet등을 이용해 계정에 접속하고 mysql에 접속합니다. 


6. 사용할 DB를 선택하시고, 예) mysql> use testdb; 


7. 다음과 같이 입력합니다. 

  


    load data infile '파일경로' into table 테이블명 (컬럼네임1,컬럼네임2,----) 


  위의 예로 작성해 보면 

(계정은 test / 파일업로드 경로는 /home/test ,텍스트파일은 member.txt, 테이블명은 member라 가정합니다.) 


load data infile '/home/test/member.txt' into table member (name,id,password,phone,mphone,email) 

Posted by 앗뜨거
,
728x90

 InetAddress.getAllByName() 사용방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Ex02_01 
{
    public static void main(String[] args)
    {
        try
        {
            //InetAddress ia = new InetAddress(); 처럼 하면 좋겠지만 
            //InetAddress 는 생성자 자체가 존재하지 않기때문에 쓸수없다        
            InetAddress[] ia = InetAddress.getAllByName("www.naver.com");    //여러개의 주소를 얻는방법
            
            for(int i=0; i < ia.length ; i++)
            {
                System.out.println(i + 1 + "번째의 주소 => " + ia[i].getHostName() +"   아이피 => "+ia[i].getHostAddress());
            }
        }
        catch(UnknownHostException e){}
        
    }
}



InetAddress 는 생성자가 존재하지 않기 때문에 new InetAddress(); 처럼 쓸 수 없다.

그래서 

InetAddress[] ia = InetAddress.getAllByName("www.naver.com"); 이런식으로 써야된다.

배열형으로 쓴이유는  

 InetAddress.getAllByName() 의  getAllByName() 이 배열형으로 읽어오기때문이다 여러개의주소를 한번에 담아낸다

그래서  InetAddress.getAllByName() 를 쓸때는 for문 등 반복자를 통해서 출력해야된다.

Posted by 앗뜨거
,
728x90

Eclipse 를 이용하여 java 개발을 하다가, 명령 프롬프트 창에서 compile 하고 run 할때

 

D:\eclipse-data\mytest\src\test1>javac Test2.java

 

D:\eclipse-data\mytest\src\test1>java Test2
Exception in thread "main" java.lang.NoClassDefFoundError: Test2 (wrong name: test1/Test2)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)


 

실행시 이런 걸 당해본 경험이 있다면........... package 를 사용했기 땜에 이렇다

이럴 땐

 

D:\eclipse-data\mytest\src\test1>java -cp D:\eclipse-data\mytest\src test1.Test2
f1[0]=0.0 f2[0]=0.0 // 정상 결과

 

 i) 이렇게 classpath 를 상위 폴더까지 잡아주고

 ii) [package name].[class name] 이렇게 하면 된다

 

근데 이렇게 일일이 classspath 를 잡아주기엔 넘넘 귀찮다

 

환경변수에 CLASSPATH 값에 상위폴더를 의미하는 '..' 이걸 추가시켜준다

(내 컴퓨터 >> 속성 >> 고급)

 

자 이제 명령 프롬프트 창을 다시 열어서 확인해보고

 

D:\>set CLASSPATH

CLASSPATH=.;..;  /*기타등등*/

 

classpath 등록만 하면 package.class_name 이렇게만 하면 된다 

 

D:\eclipse-data\mytest\src\test1>java test1.Test2
f1[0]=0.0 f2[0]=0.0 //정상 결과

 

기타 상세한 다른 내용은 아래 사이트를 들어가보면 된다

 

참고 : http://www.jarticles.com/package/package_eng.html

Posted by 앗뜨거
,
728x90

출처 : http://cremazer.blogspot.kr/2013/09/java-tcp.html#index4  


서버소켓은 소켓간의 연결만 처리하고 실제 데이터는 소켓들끼리 서로 주고받습니다. 한 소켓의 입력스트림은 상대편 소켓의 출력스트림과 연결되고, 출력스트림은 입력스트림과 연결됩니다. 그래서 한 소켓에서 출력스트림으로 데이터를 보내면, 상대편 소켓에서는 입력스트림으로 받게됩니다.


  자바에서는 TCP를 이용한 소켓프로그래밍을 위해 Socket과 ServerSocket 클래스를 제공합니다.


Socket : 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 가지고 있습니다. 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어집니다.

ServerSocket : 포트와 연결(bind)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다. 한 포트에 하나의 ServerSocket만 연결할 수 있습니다. (프로토콜이 다르면 같은 포트를 공유할 수 있습니다.)



▶ 예제 - Server



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
 * @file name : TcpIpServer.java
 * @date : 2013. 9. 29.
 * @discription : TcpIp Server
 * 
 */
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpServer {
    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        try {
            // 서버소켓을 생성하여 7777번 포트와 결합(bind)시킨다.
            serverSocket = new ServerSocket(7777);
            System.out.println(getTime() + "서버가 준비되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true) {
            try {
                System.out.println(getTime() + "연결요청을 기다립니다.");
                // 서버소켓은 클라이언트의 연결요청이 올 때까지 
                // 실행을 멈추고 계속 기다린다.
                // 클라이언트의 연결요청이 오면 클라이언트 소켓과 통신할 
                // 새로운 소켓을 생성한다.
                Socket socket = serverSocket.accept();
                System.out.println(getTime() + socket.getInetAddress()
                        + "로부터 연결요청이 들어왔습니다.");
                // 소켓의 출력스트림을 얻는다.
                OutputStream out = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(out);
                // 원격 소켓(remote socket)에 데이터를 보낸다.
                dos.writeUTF("[Notice] Test Message1 from Server.");
                System.out.println(getTime() + "데이터를 전송했습니다.");
                // 스트림과 소켓을 닫아준다.
                dos.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } // while
    } // main
    // 현재시간을 문자열로 반환하는 함수
    static String getTime() {
        SimpleDateFormat f = new SimpleDateFormat("[hh:mm:ss]");
        return f.format(new Date());
    }
}




▶ 결과





  클라이언트를 실행하였을 때 위의 결과와 같이 연결요청이 들어왔다는 메시지를 서버에서는 보여줍니다.



▶ 예제 - Client



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
 * @file name : TcpIpClient.java
 * @date : 2013. 9. 29.
 * @discription : TcpIp Client
 * 
 */
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.Socket;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpClient {
    public static void main(String args[]) {
        try {
            String serverIp = "127.0.0.1";
            System.out.println("서버에 연결중입니다. 서버IP :" + serverIp);
            // 소켓을 생성하여 연결을 요청한다.
            Socket socket = new Socket(serverIp, 7777);
            // 소켓의 입력스트림을 얻는다.
            InputStream in = socket.getInputStream();
            DataInputStream dis = new DataInputStream(in);
            // 소켓으로 부터 받은 데이터를 출력한다.
            System.out.println("서버로부터 받은 메세지 :" + dis.readUTF());
            System.out.println("연결을 종료합니다.");
            // 스트림과 소켓을 닫는다.
            dis.close();
            socket.close();
            System.out.println("연결이 종료되었습니다.");
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    } // main
}




▶ 결과




  클라이언트는 연결하고자 하는 서버의 IP와 포트번호를 가지고 소켓을 생성하면 자동으로 서버에 연결요청을 하게됩니다.



1
2
String serverIp = "127.0.0.1";
Socket socket = new Socket(serverIp, 7777);




  서버프로그램이 실행되고 있지 않거나 서버의 전원이 꺼져있어서 서버와 연결을 실패하면 ConnectException이 발생합니다.





  서버와 연결되면 소켓의 입력스트림을 얻어서 서버가 전송한 데이터를 읽을 수 있습니다.



1
2
3
4
5
InputStream in = socket.getInputStream();
DataInputStream dis = new DataInputStream(in); 
// 소켓으로 부터 받은 데이터를 출력한다.
System.out.println("서버로부터 받은 메세지 :" + dis.readUTF());




서버와의 작업이 끝나면 소켓과 스트림을 닫아야 합니다.


1
2
dis.close();
socket.close();




  위의 예제에서는 내 PC에서 테스트하기위해 서버IP를 127.0.0.1로 설정하였지만, 원래는 서버가 실제로 사용하고 있는 IP를 지정해 주어야 합니다.





2. 소켓이 사용하고 있는 포트정보확인


  서버 프로그램에서는 서버소켓이 연결요청을 받아 새로운 소켓을 생성하면, 그 소켓이 연결된 상대편 포트와 서버에서 사용하는 포트정보를 확인할 수 있습니다.



1
2
3
4
Socket socket = serverSocket.accept();
System.out.println("getPort() : " + socket.getPort());  //상대편 포트정보
System.out.println("getLocalPort() : " + socket.getLocalPort());  //서버 포트정보






3. 서버소켓의 대기시간 설정하기


  ServerSocket 클래스의 setSoTimeout(int timeout)을 사용해서 서버소켓의 대기시간을 지정할 수 있습니다. timeout의 값은 천분의 일초단위이며 0을 입력하면 제한시간 없이 대기하게 됩니다. 지정한 대기시간이 지나면 accept()에서 SocketTimeoutException이 발생하므로 catch문에서 적절한 처리를 할 수 있습니다.

--------------------------------------------------------------------------------
...
while (true) {
    try {
      System.out.println(getTime() + "연결요청을 기다립니다.");


     // 요청대기시간을 5초로 설정한다.
     // 5초동안 접속요청이 없으면 SocketTimeoutException이 발생한다.
     serverSocket.setSoTimeout(5*1000);

     Socket socket = serverSocket.accept();
     System.out.println(getTime() + socket.getInetAddress() + "로부터 연결요청이 들어왔습니다.");


     ....


   } catch (SocketTimeoutException e){   
     System.out.println("지정된 시간동안 접속요청이 없어서 서버를 종료합니다.");
     System.exit(0);
   } catch (IOException e) {
      e.printStackTrace();
   }

}
...
--------------------------------------------------------------------------------





4. 채팅 프로그램 예제(MultiChat)



▶ 서버

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
 * @file name : TcpIpMultichatServer.java
 * @date : 2013. 9. 29.
 * @discription : 채팅프로그램 - 서버
 * 
 */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpMultichatServer {
    HashMap clients;
    TcpIpMultichatServer() {
        clients = new HashMap();
        Collections.synchronizedMap(clients);
    }
    public void start() {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(7777);
            System.out.println("서버가 시작되었습니다.");
            while (true) {
                socket = serverSocket.accept();
                System.out.println("[" + socket.getInetAddress() + ":"
                        + socket.getPort() + "]" + "에서 접속하였습니다.");
                ServerReceiver thread = new ServerReceiver(socket);
                thread.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    } // start()
    void sendToAll(String msg) {
        Iterator it = clients.keySet().iterator();
        while (it.hasNext()) {
            try {
                DataOutputStream out = (DataOutputStream) clients
                        .get(it.next());
                out.writeUTF(msg);
            } catch (IOException e) {
            }
        } // while
    } // sendToAll
    public static void main(String args[]) {
        new TcpIpMultichatServer().start();
    }
    class ServerReceiver extends Thread {
        Socket socket;
        DataInputStream in;
        DataOutputStream out;
        ServerReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
                out = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) {
            }
        }
        public void run() {
            String name = "";
            try {
                name = in.readUTF();
                sendToAll("#" + name + "님이 들어오셨습니다.");
                clients.put(name, out);
                System.out.println("현재 서버접속자 수는 " 
                        + clients.size() + "입니다.");
                while (in != null) {
                    sendToAll(in.readUTF());
                }
            } catch (IOException e) {
                // ignore
            } finally {
                sendToAll("#" + name + "님이 나가셨습니다.");
                clients.remove(name);
                System.out.println("[" + socket.getInetAddress() + ":"
                        + socket.getPort() + "]" 
                        + "에서 접속을 종료하였습니다.");
                System.out.println("현재 서버접속자 수는 " 
                        + clients.size() + "입니다.");
            } // try
        } // run
    } // ReceiverThread
}




▶ 클라이언트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
 * @file name : TcpIpMultichatClient.java
 * @date : 2013. 9. 29.
 * @discription : 채팅 프로그램 - 클라이언트
 * 
 */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpMultichatClient {
    public static void main(String args[]) {
        if (args.length != 1) {
            System.out.println("USAGE: java TcpIpMultichatClient 대화명");
            System.exit(0);
        }
        try {
            String serverIp = "127.0.0.1";
            // 소켓을 생성하여 연결을 요청한다.
            Socket socket = new Socket(serverIp, 7777);
            System.out.println("서버에 연결되었습니다.");
            Thread sender = new Thread(new ClientSender(socket, args[0]));
            Thread receiver = new Thread(new ClientReceiver(socket));
            sender.start();
            receiver.start();
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
        }
    } // main
    static class ClientSender extends Thread {
        Socket socket;
        DataOutputStream out;
        String name;
        ClientSender(Socket socket, String name) {
            this.socket = socket;
            try {
                out = new DataOutputStream(socket.getOutputStream());
                this.name = name;
            } catch (Exception e) {
            }
        }
        public void run() {
            Scanner scanner = new Scanner(System.in);
            try {
                if (out != null) {
                    out.writeUTF(name);
                }
                while (out != null) {
                    out.writeUTF("[" + name + "]" + scanner.nextLine());
                }
            } catch (IOException e) {
            }
        } // run()
    }
    static class ClientReceiver extends Thread {
        Socket socket;
        DataInputStream in;
        ClientReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
            } catch (IOException e) {
            }
        }
        public void run() {
            while (in != null) {
                try {
                    System.out.println(in.readUTF());
                } catch (IOException e) {
                }
            }
        } // run
    }
}





▶ 실행결과




참고서적 : 자바의 정석


Posted by 앗뜨거
,
728x90

출처 : http://www.bloter.net/archives/176582

프로그래머가 되려면 무엇부터 해야 할까. 학원에 가면 되려나? 그럴 필요까지는 없다. 컴퓨터 1대만 있으면 프로그램을 짜는 언어를 배울 수 있기 때문이다.

프로그래밍 언어를 배우는 과정은 외국어 공부와 비슷하다. 일본어, 중국어, 영어 등 다양한 외국어가 있듯이 프로그래밍 언어도 여러 종류가 있다. 외국어를 가르치는 e러닝 사이트가 있는 것처럼, 프로그래밍도 온라인으로 배울 수 있다.

준비하기

먼저 공부할 프로그래밍 언어를 고르자. 외국어를 배울 때 영어, 중국어, 아랍어 등을 동시에 익히기 어려운 것처럼 일단 어떤 언어를 배울지 생각해야 한다. 개발자가 주로 사용하는 프로그래밍 언어는 C, C#, 오브젝트C, 자바(Java), HTML, PHP, 리눅스, MySQL 등 대략 50여개 정도다. 그 중 어떤 언어를 먼저 시작해야 할까?

C는 공대학생이 필수로 공부하는 언어다. C는 오래전에 생겼지만 그만큼 기본에 충실한 문법구조를 가지고 있다. 라틴어가 영어, 스페인어의 기초가 된 것처럼 C#, 자바, 오프젝트 C 같은 언어들은 C에서 파생됐다. 대부분의 언어는 비슷한 구조를 갖기 때문에 어느 언어든 하나를 제대로 공부해 놓으면 다른 언어를 활용하는데 무리가 없다.

배우기 쉬운 언어는 웹프로그래밍 언어이다. 웹프로그래밍 언어는 웹사이트 제작할 때 필요한 언어로, 많이 사용되는 것은 HTML, CSS, 자바스크립트가 있다.

mooc_logo

초급편 : 문법 배우기

프로그래밍을 배우기 위해서는 컴퓨터가 이해하는 문법을 먼저 배워야 한다. 영어를 배울 때 문장 구조가 주어, 동사, 목적어 순서대로 써야 한다는 규칙을 알아야 하는 것처럼 말이다. 어떤 언어든 문법을 공부하는 건 지루하고 어렵다. 다행히도 그런 걱정을 덜어주는 좋은 웹사이트들이 널렸다.

■ 웹사이트 제작 A부터 Z까지 ‘생활코딩

생활코딩은 웹사이트를 만들때 필요한 프로그래밍 정보를 제공해주는 웹사이트다. 용어를 자세하게 설명해주고 동영상 강의 자료도 풍부하다. 장점은 일단 웹사이트가 한국어로 구성됐다는 점이다. 뒤에 소개될 서비스는 대부분 영문 기반 웹사이트다. 생활코딩은 페이스북 그룹도 운영하고 있어 가입한 사용자끼리 피드백을 주고받으며 학습을 할 수 있다. 생활코딩 설립자 이고잉 님이 비정기적으로 오프라인으로 수업을 해 주기도 한다.

생활코딩 교육과정은 3부문으로 나뉜다. 생활코딩, 효도코딩, 생활표현 정보를 제공한다. 웹사이트 구축을 배우려면 ‘생활코딩’ 부분을 먼저 보면 된다. 처음 시작하는 사람은 첫 번째 챕터인 ‘웹서비스만들기’ 링크를 누르고 왼쪽 메뉴 순서대로 읽으면 된다. 간단한 오리엔테이션을 읽고 웹서비스를 만들기 위한 프로그램을 설치한다. 실습은 웹브라우저 내에서 하지 않고 자신의 컴퓨터에 설치된 프로그램을 통해 한다.

두 번째와 세 번째 챕터인 HTML과 CSS를 배우고 나면 자바스크립트부터는 조금 어려울 수 있다. 이해가 잘 되지 않는다면 일단 강좌가 안내하는대로 따라해 보고 결과화면이 제대로 나오는지만 확인해도 좋다. 초급자에게는 포기하지 않고 꾸준히 따라하는 것이 가장 좋기 때문이다. 현재까지 생활코딩만큼 이해하기 쉽게 만들어 놓은 웹사이트는 없는 것 같다. 생활코딩에서 제공하는 내용만 정확히 알게 되면 이후 다른 프로그래밍에 쉽게 도전할 수 있을 것이다.

생활코딩의 장점은 PHP, MySQL, 리눅스 언어에 대한 교육도 함께 진행되는 점이다. 웹사이트 제작 방법을 알려주는 서비스들은 보통 HTML, CSS, 자바스트립트, 제이쿼리(jQuery)까지만 알려주는 게 대부분이다. 완성한 웹사이트를 어떻게 서버에 올리고, 다른 사람이 접근 할 수 있는 방법과 다양한 데이터를 통합하는 과정은 복잡하고 배워야 할 범위도 굉장히 넓기 때문이다. 웹프로그래밍 외에 데이터베이스나 운영체제에 대해 공부하고 싶은 사람도 이 서비스를 활용할 수 있다. 생활코딩은 iOS용 앱도 제공하고 있어 실습 이외에 내용 설명이나 동영상 시청은 모바일로 할 수 있다.

■ 따라하면서 배우는 웹프로그래밍 ‘코드카데미

코드카데미는 무료로 웹프로그래밍 언어를 배울 수 있는 서비스다. 이 웹사이트의 회원수는 1월 2400만명을 돌파했다. 코드카데미는 긴 설명 대신 쉬운 예제를 직접 따라하면서 프로그래밍을 익힐 수 있도록 도와준다. 문법을 배우기 전에 간단한 예문을 익히는 셈이다. 프로그래밍은 띄어쓰기 한 칸, 콤마 하나를 잘못 찍어 오류가 나기도 한다. 프로그래밍 수업시간에는 한 글자 한 글자 자신이 직접 타이핑하면서 자신이 입력하는 것이 어떤 화면을 나오게 하는지 파악하는 게 중요하다. 그런 의미에서 코드카데미는 핵심적인 기능을 직접 타이핑할 수 있어 좋다.

코드카데미 웹사이트에 들어가서 회원가입을 하고 오른쪽에 있는 ‘Learn’을 클릭하면 배울 수 있는 언어 종류가 나온다. 코드카데미에서 배울 수 있는 언어는 HTML, CSS, 자바스크립트, 제이쿼리, PHP, 파이썬, 루비가 있다. 가장 위에 있는 3개의 탭은 예제이다. 이 예제를 실행하기 위해서는 HTML, CSS, 자바스크립트를 알아야 하므로 웹프로그래밍에 대해 전혀 모르는 사람이라면 중간에 6칸으로 나와 있는 언어배우기로 시작하는 것이 좋다. 왼쪽 처음부터 순서대로 따라하면 된다. 왼쪽 창에 영어로 설명된 코드를 검은색 창에 그대로 따라 치고 ‘Save&Submit Code’를 누른다. 그러면 결과화면이 오른쪽 흰색 창에 나오고 ‘Next Lesson’ 버튼을 눌러 다음 단계로 넘어간다. 코드를 잘못 입력했을 때는 틀린 부분을 알려주므로 그에 맞게 수정하면 된다. 마치 게임하듯 여러 단계를 통과하면 마지막 단계에 가면 코스를 수료했다고 나온다. 코드카데미에 그룹 메뉴에 들어가면 해당 언어를 배우고 있는 다양한 사용자들과 함께 질문하고 토론할 수 있다.

codecademy_01

▲코드카데미 웹사이트

codecademy_02

▲코드카데미  실습 화면

■ 어린이용 코딩에서 아이폰 앱 개발 연습까지 ‘코드닷오아르지

코드닷오아르지(Code.org)는 2012년에 설립된 비영리단체로, 프로그래밍을 연습할 수 있도록 도와준다. 이 단체는 초등학생부터 프로그래밍을 배워야하다는 캠페인을 벌이며 공립학교에 프로그래밍 교과과목을 넣기 위해 대대적인 노력을 하고 있다. 또 여성 컴퓨터 공학도 육성에도 힘쓰면서 다양한 사람이 프로그래밍에 관심을 가질 수 있도록 도와준다. 12월에는 코드닷오아르지 홍보영상에 오바마 미국대통령이 격려 메세지를 보태 화제가 되기도 했다.

이 웹사이트는 프로그래밍 언어 이론을 공부하기보다는 몇 가지 예제를 주고 그대로 따라하는 도구를 제공하고 있다. 무엇보다 어린아이들이 게임을 하면서 프로그래밍 원리를 익힐 수 있도록 도와준다. 클릭과 드래그로 일단 원하는 결과물을 만들게 하고 그 결과물 안에 어떤 소스가 들어있는지 설명해주는 식이다. 성인들을 위한 아이폰 앱, 3D게임, 가상로봇 만들기도 체험할 수 있다. 프로그램을 따로 깔지 않아도 웹브라우저 안에서 바로 프로그래밍을 연습할 수 있어 편리하다 .

중급편 : 예문 익히기

기본적인 문법을 배웠으면 요즘 자주 사용되는 코드가 어떤 건지, 내가 쓴 코드가 무엇이 잘못되었는지 비교해봐야 한다. 영어 단어를 외울 때 자주 쓰는 표현을 같이 외우면 작문이나 회화할 때 도움이 된다. 프로그래밍 언어도 마찬가지다.

개발자는 보통 코드 몇 줄을 검색하고 그와 비슷한 코드와 비교하며 잘못된 점을 찾는다. 몇몇 웹사이트는 아예 자주 쓰는 코드를 모았다.

■ 검색한 코드를 웹에서 테스트한다, ‘런어블’ 

유튜브 동영상을 실시간으로 웹페이지에 업로드하고 싶다. 숙련된 개발자라면 코드를 스스로 짤 수 있을 것이다. 하지만 코드를 검색해서 쓰는 방법도 있다. ‘동영상 자동 받아오기 코드 php’ 라고 구글에서 검색하면 코드를 찾을 수 있다. 문제는 검색한 코드가 오류가 있거나 원하는 코드가 아닐때이다. 이럴 때는 원하는 코드가 나올 때까지 계속 검색하고 프로그래밍툴에 맞추어 수정하는 작업을 반복해야 한다. 다행히도 최근 이런 반복 과정을 없애주는 웹사이트가 나왔다. 이름 그대로 검색한 소스를 바로 ‘실행할 수 있는(Runnable)’ ‘런어블’이다.

런어블은 코드를 검색하고 테스트할 수 있는 웹사이트다. 소스를 검색하고, 검색한 소스를 바로 웹에서 실행할 수 있다. 런어블에서 ‘동영상 자동 받아오기 코드 php’라고 검색하면 완성된 소스가 검색되고, 웹브라우저에서 바로 실행하고 결과화면까지 볼 수 있다. 제공된 소스를 런어블 플랫폼 위에서 수정하면서 테스트할 수도 있다.

runable02

▲런어블 웹사이트

runable03

▲런어블 실습 화면

아마존 개발자였던 야시 쿠머가 개발한 이 웹사이트는 2013년 10월 공개됐다. 현재까지 이 웹사이트에 접속하는 개발자는 15만명이 넘는 것으로 알려져 있다. 명실상부 세계 최대 소스 저장창고로 자리매김한 것이다. 런어블은 특정 기능을 수행하기 위한 함수집합(API), 소프트웨어 개발도구(SDK), 프레임워크에 관련된 코드를 모아 저장하고 이를 사용자들이 검색할 수 있게 도와준다. 사용자는 검색뿐만 아니라 자신의 제작한 코드를 직접 올릴 수 있다. 처음에 1천여개 코드로 시작한 런어블은 올해 말께는 1천만개가 넘는 소스가 저장될 것으로 예상된다. C언어, C++, JAVA도 있다.

■ 코드계의 지식iN ‘스택오버플로우

구글에서 코드를 검색했을 때 가장 자주 뜨는 웹사이트가 하나 있다. 스택오버플로우다. 스택오버플로우는 2008년 만들어진 웹사이트로, 컴퓨터 프로그래밍 관련 다양한 주제에 대한 질문과 답변을 주고받을 수 있다. 네이버 지식iN 서비스와 비슷하지만, 주제가 컴퓨터 프로그래밍에 한정된 게 차이점이다. 전세계 개발자들이 애용하는 이 웹사이트의 회원은 190만명이 넘고, 550만건이 넘는 질문이 등록돼 있다. 스택오버플로우에 올라온 코드는 저작자표시-동일조건변경허락(BY-SA) CCL 조건을 지키면 누구나 가져다 고쳐 쓸 수 있다.

stackoverflow

▲스택오버플로우 웹사이트

고급편 : 실전 연습

중급과정을 넘어섰다면 이제 실전 회화 단계로 들어서야 한다. 인터넷에 많은 자료가 축적돼 있지만 그렇다고 인터넷에서 모든 프로그래밍에 대한 답을 찾을 순 없다. 그럴 땐 자신이 배운 문법과 경험을 활용해 이것저것 새로운 코드를 만들어봐야 할 것이다. 자신이 어떤 실력을 가지고 있는지 테스트할 수도 있고, 이제껏 사용하지 않았던 프로그래밍 언어를 배울 수도 있다.

■ 프로그래밍 실력을 측정해 보자, ‘해커미터

해커미터는 프로그래밍 실력을 테스트할 수 있는 웹사이트이다. 개발자 버전과 고용주 버전으로 가입해 사용할 수 있다. 개발자 버전으로 가입했다면 원하는 언어를 클릭하고 문제를 풀 수 있다. 특정 조건을 지키면서 제시된 결과가 나오도록 프로그래밍하면 된다. 수학문제 푸는 것과 비슷하다. 별도의 프로그램을 설치하지 않고 웹브라우저 위에서 바로 테스트할 수 있다. 테스트할 수 있는 언어로는 C, C++. 자바, 루비, 파이썬이 있다. 고용주로 가입하면 원하는 수준의 개발자들을 추천해주는 e메일을 받을 수 있다.

hackmeter_01

▲해커미터 문제 화면

hackmeter_02

▲해커미터 답안 제출 화면

■ 프로그래밍 전문 온라인 강의, 유다시티 & 코세라

프로그래밍 언어 문법, 사용법을 익히고 나서 더 배우고 싶은 이에게 유다시티와 코세라를 추천한다.

유다시티는 온라인 공개수업(MOOC)운동의 하나로, 유명 대학 강의를 대중에게 무료로 제공하는 서비스다. 2011년 컴퓨터과학 과목 중심으로 온라인 강의를 제공하면서 화제를 모았다. 유다시티가 초창기 개설한 ‘컴퓨터의 원리’는 30만명이 등록했고, 이 숫자는 현재까지 MOOC 중 최고 기록이다. 2012년에는 구글, 엔비디아, 마이크로소프트와 협력해 수업을 구성하기도 했다. 현재는 컴퓨터과학 분야 외에도 디자인, 생물학, 수학, 심리학 등 다양한 분야를 수강할 수 있다. 현재 제공되는 수업은 대부분이 유료다. 대학수업 현장을 찍어 보내는 것이 아닌, 인터넷 강의용으로 따로 제작하고 있다.

코세라도 세계 유명대학 강의를 무료로 제공해주는 교육 서비스다. 코세라는 컴퓨터, 통계학, 의료보건, 경제학, 인문학 등 다양한 분야의 온라인 강의를 제공하는데, 컴퓨터 관련 수업을 가장 많이 제공한다. 전체 560개 강의 중 100여개가 컴퓨터과학 관련 수업이다.

Posted by 앗뜨거
,
728x90

파일 리스트 조회하기[이클립스]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;
 
public class CreateFile2 //파일 조회
{
    public static void main(String[] args)
    {
        String fname = "src/chap11/two";
        File f = new File(fname);
        
        File[] files = f.listFiles();
        
        for (int i = 0, j=0; i < files.length; i++)
        {
            if(files[i].getName().endsWith(".java"))        //끝에 .java 파일이 있으면 출력
            {
                System.out.println(j++ +1 +" . " + files[i].getName());
            }
        }
    }
}



결과



Posted by 앗뜨거
,
728x90



출처 : http://blog.naver.com/judge41/140105495861


Posted by 앗뜨거
,
728x90

구글링을 통해 JAVA를 활용한 한글 인코딩 처리에 대해 자료를 찾아봤는데 정확하고 좋은 자료가 많지 않았다.


위 블로그에서는 자바에서 String은 UTF-8로 취급된다..고 언급하고 있다.

그러나 내가 해보니 JAVA 프로그램 소스 파일의 인코딩을 따라가는 것 같다.
소스파일이 MS949 방식이면 파일 입출력에서도 MS949 방식을 따른다.

따라서 인코딩 형식이 UTF-8 포맷의 소스파일에서 파일 입력과 출력을 MS949 형식으로 된 것을 하려면 이렇게 해야한다.




1
2
3
4
5
6
7
8
9
10
//파일 입력
FileInputStream fileInputStream = new FileInputStream(filePath);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "MS949");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 
 
//파일 출력
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
OutputStreamWriter OutputStreamWriter = new OutputStreamWriter(fileOutputStream, "MS949");
BufferedWriter bufferedWriter = new BufferedWriter(OutputStreamWriter);

 
 
따라서 MS949 인코딩으로 된 텍스트 파일을 읽어서 UTF-8 로 저장하고 싶다면, 위에는 MS949, 아래엔 UTF-8로 입력부와 출력부를 잡아주면 된다.


Posted by 앗뜨거
,