2017년 6월 30일 금요일

#주절주절 잡지식[Makefile, set number]



흠, 잠깐 시간이 나서 오늘 터득한 걸 작성해놓는다.

먼저, c의 Makefile, 질문의 요지는 CC = @CC@를 어떻게 왜 쓰는거지?를 찾는 길이었다.

(from : http://onecellboy.tistory.com/143)
위의 글에 따라 @를 붙이면 그 라인의 에코는 나타나지 않는다.
궁금증에 간단한 예제로 따라 해 보았다.



Makefile을 다음과 같이 구성했다. 여기서 주목해야 할 점은 2가지이다. @와 $(CC)-매크로
먼저, @를 붙여서 실행되는 과정을 없애보자.차이점은make clean할 때 나타나는 명령어 에코가 나타나지 않는다는 것이다.


매크로를 붙여서 실행한 명령어에는실행하면서 화면에 출력하지만,
gcc -c main.c gcc -c foo.c gcc -c bar.c는화면에 출력하지 않는다.
또한, make clean 명령어는 @를 붙이지 않았으므로 화면에 에코잉한다.

다음으로, 매크로에 대해 알아보자.
다음은 검색을 통해 알게 된 사이트로 매크로를 더 알고 싶으면 이 사이트를 참조하자.
 https://www.tutorialspoint.com/makefile/makefile_macros.htm

아, 결론은 @@는 Makefile이 A Makefile에서 B Makefile.in 같은 걸 만들 때 A에서 불러와서 쓰는 변수같은 역할을 한다. 좀 더 flexible한 변수말이다. 더 자세한 건 알아내지 못했다..



자, 이제 다음으로는 vim
라인 수 붙이는 명령어를 간단하게 짚고 넘어가자.
왜 인지 예전에 찾다가 포기했었던거 같은데.. 나 바본가..
 

그냥 기본 화면에서 :set number하면 그 화면에서 바로 줄번호가 나타나지만, 지속되지 않는다.

지속시키려면?

$ vi .vimrc

set number를 작성해주고 저장해주면된다. 지속적으로 줄번호가 붙는 vi/vim을 쓸 수 있다!

2017년 6월 22일 목요일

마방진(Mabangjin) with C

먼저, 마방진의 원리를 이해해보자.

(1) 마방진의 표를 그린다. (5x5, 8x8, 10x10 ...) 여기에선 간단히 5x5로 진행한다.

(2) 1은 가장 첫줄의 정중앙에서부터 시작한다.

(3) 정중앙에서 부터 시작은 마방진은 대각선방향으로 진행된다.

(4) 그리고 그림과 같이 대각선의 끝이 진행할 곳이 없을동안 계속 대각선으로 전진한다.

(5) 대각선에서 막힘이 일어나는경우,
    그림과 같이 앞으로 진행할 대각선의 가장 아랫줄로 이동한다.

(6) 이후 '3'과 같이 대각선 방향이 세로가 아니라 가로로 막힘이 발생하는 경우는
    그림과 같이 앞으로 진행해야 할 대각선의 가장 첫 줄로 이동한다.


(7) 가장 첫 줄로 이동한 이후부터는 이전과 같이 대각선 방향으로 동일하게 움직인다.

(8) 대각선으로 움직이다 '5'와 같이 이미 채워져있는 공간과 마주치는 경우,
    그림과 같이 현재 숫자의 아래칸부터 이어나가는 방식으로 진행되게 된다.

 위의 진행을 차례대로 따라 이후를 진행하면 마방진의 모든 칸을 채워서
 아래의 그림처럼 완성할 수 있다.

마방진 완성모습

이를 코드로 작성해보자.

#include <stdio.h>
#include <conio.h> //getch()를 위해 포함
int main(){
int a[6][6]; //기본 틀 만들기
int i=1; // 차례로 커질 수
int j=(int)(5/2+1); //처음에 중간 값 부터 시작하도록 만듦
int NMG=0;
int k=0;
for(k=1;k<=25;k++){
a[i][j]=k; //
NMG =(int )(k-(k/5)*5);
//k가 int이기 때문에 답에 소숫점이 나와도 int로 먼저 계산해버린다.
// 따라서 (k/5)는 k가 5의 배수가 아닌이상 1-4는 전부 0이 나오게 되는 것을 이용하여
//5번이상 한 라인에서 실행할 수 없게 만든 것이다.
if(NMG==0){
i++;
}
else{ //대각선으로 전진
i--;
j++;
if(i<1){//만약 기존의 칸을 벗어나면, 가장 아래의 줄로 이동한다.
i=5;
}
if(j>5){ //만약 기존의 칸을 벗어나면, 그 줄의 첫 번째로 이동한다.
j=1;
}
}
}//for
//숫자들을 출력하기 위해서 실행
for(i=1;i<6;i++){
for(j=1;j<6;j++){
printf("%3d ",a[i][j]);
}
printf("\n");
}
getch();
}
코드에 필요한 설명은 주석을 통해 언급하였다. 필요하다면 읽어보도록 하자.

2017년 4월 15일 토요일

#Python + #Java socket. 파이썬+자바 소켓 파일 전송(이미지 전송)

-----------------------------------------------------------------------------------------------------------
imageServer.py
 
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
#!/usr/bin/env python
# -*- coding:utf8 -*-
import socket
import os
import sys
HOST = 'localhost'
PORT = 5000
ADDR = (HOST,PORT)
BUFSIZE = 4096
videofile = "../Pictures/desert.png"
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
filename = "i.png"
#Bind Socket
serv.bind(ADDR)
serv.listen(5)
conn, addr = serv.accept()
print 'client connected ... ', addr
#Open the file
#Read and then Send to Client
f=open(filename,'rb')# open file as binary
data=f.read()
print data,',,,'
exx=conn.sendall(data)
print exx,'...'
f.flush()
f.close()
#Close the Socket 
print 'finished writing file'
conn.close()
serv.close()
cs

-----------------------------------------------------------------------------------------------------------
imageClient.java

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
package sending;
/**
 * @author haei
 */
import java.io.*;
import java.net.Socket;
public class FileClient {
  
    private Socket s;
  
    public FileClient(String host, int port) {
        try {
            s = new Socket(host, port);
                        saveFile(s);
        } catch (Exception e) {
            e.printStackTrace();
        }      
    }
      
        private void saveFile(Socket clientSock) throws IOException
        {
                InputStream in = clientSock.getInputStream();
                //바이트 단위로 데이터를 읽는다, 외부로 부터 읽어들이는 역할을 담당
                BufferedInputStream bis = new BufferedInputStream(in);
                //파일을 읽는 경우라면,BufferedReader보다 BufferedInputStream이 더 적절하다.
                FileOutputStream fos = new FileOutputStream("testfile.png");
                //파일을 열어서 어떤식으로 저장할지 알려준다. FileOutputStream을 쓰면 들어오는 파일과 일치하게 파일을 작성해줄 수 있는 장점이 있다.
               
                int ch;
                while ( (ch = bis.read()) != -1) {
                    fos.write(ch);
                    //열린 파일시스템에 BufferedInputStream으로 외부로 부터 읽어들여온 파일을 FileOutputStream에 바로 써준다.
                }
        fos.close();
        in.close();
    }
  
    public static void main(String[] args) {
        FileClient fc = new FileClient("localhost"5000);
    }
}
cs

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

이 소스를 만들어내는데 많이 헤매서 생각보다 오래걸렸다.
어떻게 보면 간단한 생각이지만, 아직 내가 많이 부족한 관계로 이 간단한 소켓하나 작성하지 못하는 수준이였다.. 결국 물어물어서 해결한 문제지만, 해결이 되고나니 뿌듯하다.

파이썬-파이썬 /자바-자바 간의 소켓문제는 많이 존재하지만, 다른 언어사이의 예제가 생각보다 찾기가 어려웠다.

파이썬Server 와 자바Client간의 파일 전송을 작성한 예제이다.
처음에는 자바에서 인코딩문제인가?를 생각해서 Binary로 처리해야되나?라는 생각을 하게되었고 f=open(filename,'rb') 파일을 "ReadBinary"하고 있다.

두번째로는 BufferedInputStream이다. 자바에는 많은 처리 함수들이 존재하기 때문에 각자 어떤때에 쓰이는지 정리, 공부해두면 좋을 것같다는 생각이 들었다.

파일이 필요한 사람이 있을까봐 파일도 첨부 해 놓겠다.
java python