루덴스코드 Blog

분류 전체보기 +230

Github, 깃허브는 개발자들 사이에서는 이제는 너무나 유명한 서비스가 되었다.


git 이라는 버젼관리 프로그램이 있다. 이것을 인터넷상에서 저장해주는 서비스가 github 다. github 는 기본적으로 무료로 사용할 수 있다. 대신 무료사용자에게는 정보를 숨길 수가 없다. 그래서 오픈소스들이 github 에 모인다. 


깃허브에서 개인블로그를 만들어 사용할 수 있게 해주는 재미있는 방식이 여럿 소개 되었다. 그중 페이지를 이용하고 지킬이라는 툴을 이용한 방식이 일반적으로 널리 사용된다.


기본대로 하려면 개인 PC 에 지킬을 설치하고, 거기서 프로그램을 통해 웹사이트를 구성할 수 있는 페이지들을 만든 다음 그것을 깃허브의 개인계정에 넣으면 된다. 그런데 지킬을 설치한 PC 에서만 사용이 가능하다는 단점이 있다. 이 점을 보완하기 위해 깃허브에서 제공하는 프로그램을 이용해서 개인 개정에는 페이지를 보일수 있는 기본 프레임을 만들어두게 하고, 사용하지 일정한 양식(포맷)에 맞춘 글을 올리면 자동으로 글이 등록하게 한 지킬 테마들이 있다.


그 테마를 사용해 보았다.



물론 위의 사진은 아니다. ^_^


깃허브 테마는 많지는 않다. 그리고, 기존의 네이버 블로그나 티스토리, 다음 블로그 처럼 테마들이 다양하지도 않다. 어찌보면 조금 답답할수도 있고, 선택이 많지 않아 "에개"하는 마음이 들 수 있다. 하지만 자유도는 역시 최강이다. 알아서 만들어서 알아서 남들에게 주고, 알아서 남들이 만든것을 가져다 쓰라는 OpenSource 정신이 물씬 풍긴다.


그래서 아주 SIMPLE 한 블로그를 만들었다. 


이렇게 만들것을 계속 사용할 것인지 조금 고민해봐야겠다.



내용도 심플하고, 텍스트도 이것저것 꼬이지 않아서 좋고, 심지어 사진마저 무료로 올리는데다가 링크만 따면 다른데서도 쉽게 쓸수 있다. ... 만들기 전까지는 그냥 한번 해봐야하는 생각이었는데, 사진까지 올리고보니 계속 써야 하나 하는 유혹이 몰려온다.


프론트엔드 개발자라면, 깃허브 블로그는 정말 버리기 힘든 유혹일게다.




Comment +0

문재인 대통령의 신년 기자회견문을 워드클라우드로 작성해보았습니다.



결과 그래프에서 보이듯 "국민"이라는 말이 제일 많이 사용되었습니다. 이 부분은 지난 대선 주자 연설문에서 보였던 특징과 동일합니다. "국민"이라는 말을 참 좋아하고 많이 사용하는 것이 문재인 대통령 연설문의 특징입니다. 

물론 이 워드클라우드는 단어의 수를 계수하여 그 비중대로 단어를 화면에 보여주는 것이 전부입니다. 그래서 문맥사이, 단어들 사이에 담겨 있는 깊은 의미를 파악하지는 못합니다. 그 부분은 별도의 기사나 독자들의 해석에 맡깁니다. 여기서는 전문에 드러난 단어의 사용빈도에 따른 중요도를 파악하는 것으로 그치고자 합니다.

이 결과만으로 간단하게 생각해보자면 문재인 대통령은 "국민"을 참 좋아하는 것 같습니다.


이 워드클라우드를 만든 모든 소스는 깃허브에 올려두었습니다. [링크]

이에 사용된 간단한 설치와 소스에 대한 설명은 다음과 같습니다.


윈도우 10 환경

파이썬 3.4

virtualenv 로 가상개발환경

> virtualenv -p c:\python\python34\python.exe myvenv34

> myvenv34\scripts\activate

konlpy, pygame, jupyter 설치 (jupyter notebook 를 사용하지 않는다면 jupyter 는 설치하지 않아도 무방)

(myvenv34)> pip install konlpy pygame jupyter



깃허브에서 wordcloud.py 를 다운받는다.

(myvenv34)> python wordcloud.py



이러면 다음과 같은 결과가 나옵니다. 








Comment +0

Weka 는 뉴질랜드 Waikato 대학에서 제작한 대표적인 데디터마이닝 도구다. 이안 위튼은 Weka 를 이용한 데이터마이닝 MOOC 를 제공하고 있다. 무료로도 가능하고, 제한없는 강의를 듣기 원하면 $89 을 내면 된다. 물론 영어로 이루어진다. [관련링크]

Weka 를 이용한 Data Mining 은 한두시간에 다룰 가벼운 주제는 아니다. 실제로 사용되는 머신러닝에 대한 기본적인 이해를 가지고 있어야 하고 다양한 응용이 가능해야 한다. 이안 위튼이 쓴 Data Mining 책은 한글로 번역되어 구입이 가능하다. 관심이 있다면 이 책을 구입해서 읽어보고, 위 사이트에서 영어로 된 강의를 들어보는 것도 좋을 듯 하다.

아주 간단한 Weka 에 대한 튜토리얼은 유튜브에서 검색하면 쉽게 찾을 수 있다. 다만 짧게 된 소개를 보고 Weka 를 다 이해한다는 것은 무리다. 일반적으로 붓꽃에 대한 데이터를 가지고 간단한 소개를 진행한다.

 



Weka 가 어렵거나 복잡하지 않으면(사실 어렵지는 않다. 뭔가 많이 붙어있어서 복잡할 뿐이다), 따로 소개와 함께 사용법을 만들어 볼까 했는데, 그건 당분간 보류한다. 생각보다 다뤄야 할 것들이 많을 것 같다. 그보다는 확률과 통계에 기반한 수학과 인공지능 혹은 머신러닝이 지금까지 걸어온 길을 소개해주는 글을 쓰는 것이 나을 것 같다. 소개하면서 발견하는 좋은 프로그램, 툴들을 소개는 하되 깊이 있게 다루지는 않겠다. 첫째, 내가 그 툴들을 제대로 사용해 본 적이 없기 때문이고, 둘째 툴들의 소개는 상당한 시간이 소요되고, 셋째, 툴들은 계속해서 수정되고 업그레이드되면서 바뀔 것이기 때문이다.

꼭 필요한 내용들을 선정하고 그것들을 중심으로 다루면서 Weka 와 같은 툴들은 소개하는 선에서 넘어가야 할 것 같다.





Comment +1

  • 안녕하세요.
    아빠, 우리함께 아두이노해요 책에 27페이지에
    기본준비물목록에 있는것들 구매하려면 어떻게 해야하는지
    궁금합니다.

    답변부탁드리겠습니다.

블로그나 PT 등에 사용하기 편한 간단한 온라인 컴파일러와 소스코드 문법 하이라이트 기능 소개 


온라인 컴파일러 테스트 : ideone.com

ideone.com 사이트를 가끔 이용한다.

간단한 코딩 테스트나 문법을 확인할 필요가 있을 때 무거운 컴퍼일러와 에디터를 일일이 열어서 확인하기가 귀찮을 때 자주 사용한다.

#include <stdio.h>
#include <math.h>
int main(void) {

    int i1 = ceil(2.3);
    int i2 = ceil(-2.3);
    int i3 = floor(2.3);
    int i4 = floor(-2.3);

    printf("ceil(2.3) = %d, ceil(-2.3)=%d, floor(2.3)=%d, floor(-2.3)=%d", i1,i2,i3,i4);
    return 0;
}


실행결과

ceil(2.3) = 3, ceil(-2.3)=-2, floor(2.3)=2, floor(-2.3)=-3


코드에 색깔을 입힌 문법 하이라이트 : colorscripter.com

블로그나 기타 사이트, 혹은 PT 용으로 소스코드를 넣을 때 문법적으로 중요한 키워드들을 색깔로 구별해 주는 것이 좋다. 그것을 위해 가끔 사용하는 사이트가 colorscripter.com 이다. 소스코드를 넣으면 키워드들을 적당한 색으로 바꿔준다. 그대로 긁어서 붙여넣으면 완성 ^^

위에 사용한 코드를 그대로 가져다가 붙이면 아래와 같이 색이 입혀져서 나온다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <math.h>
 
int main(void) {
 
    int i1 = ceil(2.3);
    int i2 = ceil(-2.3);
    int i3 = floor(2.3);
    int i4 = floor(-2.3);
    
    printf("ceil(2.3) = %d, ceil(-2.3)=%d, floor(2.3)=%d, floor(-2.3)=%d", i1,i2,i3,i4);
 
    return 0;
}



Comment +0


처음코딩을 시작한 사람들을 위한 베이비스텝과정입니다.

잘 몰라도 괜찮습니다. 혼자서 못하는 건 당연합니다. 누군가 도와주지 않으면 일어설 수 없는 베이비가 처음 걸음을 걸을때의 기쁨과 감격을 다시 한번 느껴봅시다.

혼자서 힘들면 누군가와 함께 일어서는 연습을 합시다. 

베이비스텝, 시작합니다.


2017년 12월 29일 부터 30일, 금요일과 토요일 무박2일로 베이비스텝을 진행합니다.

신청자를 받습니다. 6명 이상이면 진행하겠습니다. 참가 신청은 12월 9일부터 16일까지 받겠습니다. 양식링크는 이곳에 게제합니다. 세부내역은 12월 9일에 공지하겠습니다.


Comment +0

소수구하는 알고리즘


예전에 파이썬으로 했던 소수 알고리즘이다.

2개의 수를 넣으면 그 두 수 사이의 모든 소수를 찾아서 화면에 출력한다.

실제로 소수를 찾는 시간은 매우 빠르지만 너무 많은 수를 출력하게 되면 화면 출력시간때문에 지연시간이 길어진다.



  • 2로 나누어 떨어지는 수는 소수가 아니므로 통과

  • 3으로 나누어 떨어지는 수는 소수가 아니므로 통과

  • 그러므로 3 이상의 모든 소수는 6k-1 또는 6k+1 에 해당한다. 모든 수에 대해서 % 연산을 수행하지 않고 6k-1, 6k+1 에 대해서만 수행한다.

  • 1부터 자기자신(N)까지의 모든 수를 대상으로 "N%(1...N)" 을 수행하지 않고, sqrt(N) 까지만 수행한다. 약수가 있다면 하나는 작은 수이고 다른 하나는 큰 수일텐데, 작은 수는 아무리 커도 sqrt(N) 보다는 작다. sqrt(N)*sqrt(N) = N 이므로 sqrt(N) 까지만 반복한다.

위의 조건에 따라 % 연산 결과가 0 이 되는 경우가 하나라도 발생하면 소수가 아니므로 그 상태에서 break; 를 수행


위의 조건을 따라 프로그램하면 다음과 같은 코드가 된다. (자바 코드)


package com.javalex.day3_1_primenumber;


public class PrimeNumberMake2 {

public static void primeMake(long startNumber, long endNumber) {

if (startNumber<=2 && endNumber >= 2) System.out.println(2 + "는 소수입니다");

if (startNumber<=3 && endNumber >= 3) System.out.println(3 + "는 소수입니다");

long modifiedNumber = 5;

if (startNumber > 5 ) modifiedNumber = startNumber;

for (long i = modifiedNumber; i<=endNumber; i++) {

boolean priNum = true;

if ((i%2==0)||(i%3==0)) priNum = false;

else {

for (int j=6; j<=(int)Math.sqrt(i)+1; j=j+6 ) {

if ((i%(j-1)==0)||(i%(j+1)==0)) { priNum = false; break; }

}

}

if (priNum==true) {

System.out.println(i+ "는 소수입니다");

}

}

}

}



아래는 위의 알고리즘이 적용되지 않은 소수 구하는 코드다. N 이 소수인것을 알기 위해 2 부터 N-1 까지 모두 나눠보고 0 으로 나누어서 떨어지는지를 검사한다. 보통 for 문을 배우면서 소수를 구하는 프로그램을 짜라고 시켜보면 이런식의 프로그램을 짠다. 


package com.javalex.day3_1_primenumber;


public class PrimeNumberMake0 {

public static void primeMake(long startNumber, long endNumber) {


if (startNumber<=2 && endNumber >= 2) System.out.println(2 + "는 소수입니다");

if (startNumber<=3 && endNumber >= 3) System.out.println(3 + "는 소수입니다");


long modifiedNumber = 4;

if (startNumber > 4 ) modifiedNumber = startNumber;

for (long i = modifiedNumber ; i<endNumber; i++) {

int priNum = 0;

for (int j=2; j<i; j++ ) {

if (i%j==0) priNum++;

}

if (priNum==0) System.out.println(i+ "는 소수입니다");

}

}

}



이 두개의 코드를 돌려서 걸리는 시간을 확인해 보았다. 이때 사용한 소스는 다음과 같다.


package com.javalex.day3_1_primenumber;


public class MainPrime {


public static void main(String[] args) {

long sNum = 100_000_000L;

long eNum = 100_000_100L;

long startTime;

startTime = System.currentTimeMillis();

PrimeNumberMake0.primeMake(sNum, eNum);

System.out.println((System.currentTimeMillis()-startTime)+"ms");


startTime = System.currentTimeMillis();

PrimeNumberMake2.primeMake(sNum, eNum);

System.out.println((System.currentTimeMillis()-startTime)+"ms");

}

}



결과는 다음과 같다.


100000007는 소수입니다

100000037는 소수입니다

100000039는 소수입니다

100000049는 소수입니다

100000073는 소수입니다

100000081는 소수입니다

194011ms

100000007는 소수입니다

100000037는 소수입니다

100000039는 소수입니다

100000049는 소수입니다

100000073는 소수입니다

100000081는 소수입니다

3ms


아무런 생각없이 그냥 짠 코드의 실행시간은 194초가 걸렸다. 내 PC 의 CPU 가 i3 라서 더 느리게 나왔다. 아마도 PC 성능이 좋으면 이보다는 조금 빨리 실행이 될 것이다. 반면 2의 배수, 3의 배수를 제외하고 6k+-1 의 항목만 검사하면서 2부터 N 까지가 아닌 까지 검사하면고, 소수가 아니면 바로 break 를 써서 빠진 결과는 3ms 가 나왔다.


194초 VS 0.003


저 차이가 바로 프로그램에 수학과 생각이 들어가야 하는 이유다.

Comment +0


자바 공부하시는 분들 참고하세요.

소수구하는 알고리즘을 이용한 클래스 강의 자료입니다.

이클립스에서 실행하세요.


///////////////////////////////////////////

// PrimeNumberMake.java

///////////////////////////////////////////


package com.javastudy.primesecure;

import java.util.Random;


public class PrimeNumberMake {

private long passwordElement1; 

private long passwordElement2; 

private long passMultiValue;


public PrimeNumberMake() {

Random randNum = new Random();

passwordElement1 = primeMake(1_234_567_890L+randNum.nextInt(100_000_000));

passwordElement2 = primeMake(2_345_678_901L+randNum.nextInt(100_000_000));

passMultiValue = passwordElement1 * passwordElement2;

}

public long getPasswordElement1() {

return passwordElement1;

}


public long getPasswordElement2() {

return passwordElement2;

}


public long getPassMultiValue() {

return passMultiValue;

}


public long primeMake(long startNumber) {

long i = startNumber;

boolean priNum = false;

while(!priNum) {

i++;

priNum = true;

if ((i%2==0)||(i%3==0)) priNum = false;

else {

for (int j=6; j<Math.sqrt(i); j=j+6) {

if((i%(j-1)==0)||(i%(j+1)==0)) { 

priNum=false; 

break;

}

}

}

}

return i;

}

}


///////////////////////////////////////////

// MainPrime.java

///////////////////////////////////////////


package com.javastudy.primesecure;


public class MainPrime {


public static void main(String[] args) {

PrimeNumberMake pswd = new PrimeNumberMake();

System.out.println("첫번째 소수값 : "+pswd.getPasswordElement1());

System.out.println("두번째 소수값 : "+pswd.getPasswordElement2());

System.out.println("두소수의 곱   : "+pswd.getPassMultiValue());

}

}



Comment +0


온라인으로 동영상강좌를 만들고 있습니다.

코딩교육 기초과정과 이어서 아두이노 초급과정, 파이썬 초급과정을 만들었습니다.
그리고 이름을 "처음코딩"이라고 붙였습니다.
처음 시작하는 사람도 따라올 수 있고, 어린 친구들도 얼마든지 배울수 있는 그런 곳을 만들고 싶습니다.


현재 아두이노와 파이썬 기초를 올렸습니다. 앞으로 파이썬을 이용한 파이게임과 장고등을 올릴 예정입니다. 아두이노를 이용한 IoT 와 다양한 프로젝트 활용편도 올릴 예정입니다. 


[아두이노기초]

AB-01 아두이노 따라잡기 시작
AB-02 Arduino Paper Box
AB-03 실습에 필요한 준비물
AB-04 아두이노 IDE 설치
AB-05 Arduino IDE 업데이트 방법
AB-06 LED 점멸, 하드웨어 구성
AB-07 아두이노 LED 점멸, SW구성
AB-08 아두이노 LED 점멸, 하드웨어 해석
AB-09 3개의 LED 와 1개의 Switch
AB-10 3 LED & 1 Switch (Software 1/4)
AB-11 3 LED & 1 Switch (Software 2/4)
AB-12 3 LED & 1 Switch (Software 3/4)
AB-13 3 LED & 1 Switch (Software 4/4)
AB-14 아두이노2개로 신호등2개 연결하기
AB-15 C언어 기초 - 기본구조
AB-16 C언어 기초 - 하드웨어구성
AB-17 C언어 기초 - setup()
AB-18 C언어 기초 - loop() 함수
AB-19 C언어 기초 - 함수
AB-20 C언어기초 - { } 의미
AB-21 C언어기초 - 세미콜론 ;
AB-22 C언어기초 - 주석
AB-23 C언어기초 - 변수
AB-24 C언어 기초 - 변수의 종류
AB-25 C언어 기초 - 2의 보수
AB-26 C언어 기초 - 아스키테이블
AB-27 C언어 기초 - 연산/비교/논리/비트
AB-28 C언어 기초 - 상수(#define const)
AB-29 C언어 기초 - 조건문 if
AB-30 C언어 기초 - 반복문 for
AB-31 C언어 기초 - 반복문 while
AB-32 아두이노함수/LED 전류계산/풀업
AB-33 C언어 기초 - ADC / 샘플링, 양자화
AB-34 C언어 기초 - 수학함수
AB-35 C언어 기초 - 디버깅
AB-36 강의없음
AB-37 C언어 - millis()함수


[파이썬기초]



Comment +0

과학, 수학, 코딩의 중요성 [한국대학신문, 2017.09.24.]

국내 대학에 필요한 교육의 핵심으로 논리력을 말하며 이를 위해 과학, 수학, 코딩의 중요성을 유지수 국민대 총장이 말했다.

국민대는 모든 신입생을 대상으로 코딩을 가르친다. 그 깊이와 정도는 아직 미흡하겠지만 이대로 충분한 시간이 흐른다면 이것 만으로도 학교와 학생들에게 큰 재산이 될 것이다. 


미디어 오늘에서는 리터러시 교육의 필요성을 말한다. [미디어오늘, 2017.09.23.]

교육대상자는 TV 매체 보다는 인터넷을 더 본다. 대도서관, 양띵, 캐리등 많은 이들이 기존의 방송이 아닌 개인 인터넷 방송을 통해 사람들에게 알려지고 있다. 어린 친구들일수록 노출의 정도는 더 강하다. 이를 단순화시켜 부정하려고 규제를 두는 것이 문제를 해결하지 못한다고 지적한다. 리터터시는 과거 글을 읽고, 쓰고, 셈하기를 배우는 것에서 이제는 인터넷과 관련 미디어를 어떻게 대할 것인지, 어떻게 수요할 것인지의 문제가 되고 있다. 디지털 리터러시는 먼 미래가 아닌 바로 지금 우리앞에 닥친 현실이다. 이것을 규제를 통해 해결하려는 과거의 방식은 아무런 해결책이 되지 못한다.


엔씨소프트는 2020년까지 500억을 청소년 창의교육에 사용하기로 했다. [한겨레, 2017.09.22.]

다양한 방향으로 미래와 학생들을 위해서 게임회사가 투자를 결심한 것을 환영한다. 조금 더 바란다면, 조금 더 쓰지...


Comment +0


어릴때부터 무엇인가를 만드는 것을 좋아했다. 그래서 어린이날 선물이나 생일 선물은 항상 프라모델을 원했다. 비행기, 탱크, 자동차, 잠수함까지 만들어 보았다. 그중 상당수는 건전지를 넣어 움직일 수 있었다. 커다란 대야에 물을 가득 받아두고 잠수함을 넣어 앞으로 가는 것을 보며 기뻐했다. 아마도 어릴 때부터 나는 “덕후”기질이 다분했었던 것 같다.


책을 싫어하지도 않았다. 집에서는 항상 누워서 책을 보는게 버릇이 되었다. 책을 빌릴 도서관이 주변에 없는 시골에서 자랐기에 읽을 수 있는 책은 몇 권 되지 않았다. 30권짜리, 50권짜리 전집을 사면 3일에서 길면 일주일에 다 읽었다. 읽고, 또 읽기를 반복했다. 다행히 학교에 도서관이라는 것이 있다는 것을 알게 된 다음부터는 학교 도서관을 이용했다. 거긴 신간은 없었고, 외계에서 온 것 같은 이상한 책들은 가득했다. 난 흑마술을 학교 도서관에서 접했다.


중학교 때 지금은 폐간된 ‘라디오와 모형’이라는 잡지를 구독했다. 특집기사로 Z80을 이용한 마이컴제작이 있었다. 부품조차 구하기 힘든 당시에 최신(?) 8비트 마이컴을 만들어보겠다고 덤벼들었다. 결과는 주변 환경이 따라주지 못해서 실패. 비록 마이컴을 만들지는 못했지만 광석라디오를 만들고, 멜로디벨을 만들고, 그 과정에서 비슷한 취미를 가진 어른들을 친구로 만날 수 있었다. 새로운 세상을 접하면서 난 그래도 꽤 재미난 학창시절을 보냈다.


어울려서 몰려다니기 보다는 차분히 한 자리에서 책을 보거나 이야기하거나 무언가를 만들면서 시간을 보냈다. 지금 생각해보면 나는 그때 놀고 있었다. 친구들과 어울려 치기 어린 장난을 치는 것도 놀이지만, 자신이 좋아하고 원하는 것을 하면서 마음이 즐겁다면 그것이 곧 놀이다.


호모 사피엔스는 도구를 사용하는 호모 파베르가 되고, 다시 생활을 즐기는 호모 루덴스가 된다. 이 모든 것은 다른 존재의 유별난 특징을 말하는 것이 아니라 한 존재가 드러나는 다양성의 각 측면을 보여주는 것이다. 


알파고는 이세돌에게 4:1 의 승리를 거두었다. 그리고 2017년 더 강력해진 알파고가 커제와의 승부에서 3:0 승리를 거두었다. 인공지능이 프로기사를 이긴 것을 보며 어떤 이는 두려움을 느끼고, 어떤 이는 절망감을 느낀다. 그런데 정말 슬픈 일일까?


10자리 숫자들의 곱셈을 사람보다 계산기가 빨리 한다고 절망하는 사람은 없다. 오히려 귀찮은 계산을 하지 않아도 되니 좋아하는 사람이 많다. 포크레인이 가장 힘센 사람보다 더 많은 흙을 더 빨리 퍼낸다고 절망하는 사람도 없다. 열흘 걸릴 일을 하루에 해결할 수 있다고 좋아하는 사람은 많다. 기술의 발전은 인간을 절망으로 이끌지 않는다. 오히려 기술은 인간이 지금까지 해왔던 힘들고 번거로운 작업에서 벗어나게 해준다. 인공지능 무인자동차가 등장하면 졸린 눈을 부릅뜨고 온갖 신경을 쓰며 자동차를 운전하지 않아도 된다. 인간은 기계에게 진 것이 아니라 똑똑한 기계를 만들어 사용하게 된 것이다. 


지금까지 직관에 의해 좋다고 판단한 바둑의 수를 이제는 빠른 계산이 가능한 기계의 도움을 받아 얼마나 좋은지를 구체적으로 계산할 수 있게 되었다. 어쩌면 누군가에게는 그저 게임기에 지나지 않았을 컴퓨터가 프로그램이 가능한 사람들에 의해 이제까지 계산하지 못했던 바둑이라는 세계의 막연했던 좋고 나쁨을 구체적인 수치로 계산할 수 있게 된 것이다. 그러기에 알파고가 이세돌이나 커제를 이긴 것은 기계가 인간을 이긴 것이 아니라 인간이 기계를 이용한 인간 스스로의 한계를 뛰어 넘은 것이다. 


이제 인류에게 남은 과제는 인간이 인간답게 이 모든 것을 제대로 사용할 의무다. 인간다움을 유지하는 공동체에게 4차 산업혁명시대의 기술은 타인을 돕는 도구가 될 것이다. 하지만 인간다움을 버린 이에게 신기술은 타인을 향한 칼이다. 새로운 세상과 그 세상에 속한 기술은 우리 앞에 던져졌다. 이제 우리에게 남겨진 것을 이것을 어떻게 취할 것인가이다. 


소수에게 종속된 인공지능과 빅데이터는 조지 오웰의 빅브라더를 가져올 것이다. 하지만 다수에게 공개된 인공지능, 빅데이더, 클라우드는 이제까지 거대 기업의 전유물이었던 언론, 방송을 개인이 다룰 수 있게 한다. 다양한 소셜 네트웍이 존재하고, 누구나 그 서비스를 이용만 하는 것이 아니라 원하면 만들 수 있게 된 사회 속에서 정보의 은폐는 불가능해졌다. 그러기에 우리에게 남은 것은 이것을 이용하려는 의지와 올바른 민주시민으로서의 의식을 갖는 것이다. 


이대로는 안된다면 한국의 교육을 걱정하는 사람들이 많다. 많은 정도가 아니라 대부분의 사람들이 우려한다. 아이들을 학원에 보내는 부모들도 정말 이렇게 해야만 하는 것인가를 고민한다. 걱정을 하지만 다른 방법을 찾지 못해 여전히 사교육이 이루어진다. 그래도 내 아이가 먹고 살 수는 있어야 하지 않느냐는 부모들의 마음을 모르지 않기에 이러한 사교육 열풍은 이해가 되고 한편으로 공감이 된다. 당장 지금까지 하던 모든 것을 끊고, 완전히 새로운 삶을 아이와 부모에게 들이밀 수는 없다. 하지만 생각을 하는 것은 가능하다. 이대로는 안된다는 것을 생각하고, 정말 10년 후, 20년 후의 생활에서 필요한 것이 무엇인가를 한번 더 고민한다면 이제는 지금까지 투자하던 것을 서서히 줄이면서 새로운 투자처를 물색해야 한다. 


과거에 인공지능과 빅데이터가 슈퍼 컴퓨터를 가진 기관만이 할 수 있었던 영역이었던 적이 있다. 하지만 지금은 클라우드라는 것을 이용할 수 있다면 누구나 가능하다. 사용한 시간만큼 비용을 지불하면 되기 때문에 잘만 사용하면 공부하면서 돈이 들어갈 일은 없다. 구글과 MS, 아마존이 클라우드 경쟁을 하고 있어서 학생이나 개발자에겐 거의 1년간 무료로 사용할 수 있게 해주고 있다.


새로운 공부를 해보자. 대학을 들어가기 위한 공부가 아니라 미래를 만들어가는 공부를 해보자. 그리고 그 공부가 나를 이롭게 하고, 우리를 이롭게 하자. 사회를 함께 만들어가는 시민의식을 만들어보자. 새로운 세상을 즐기며 민주시민의식을 구현하는 것, 그것이 4차 산업혁명이 가져올 미래를 절망적인 터미네이터의 미래가 아닌 권력과 힘의 분배가 이루어진 즐거운 민주시민사회로의 한걸음 다가감이 아닐까.


Comment +1

코드클럽의 스크래치 자료 링크 



1. 락 밴드

PDF

튜터용 지침서

자료(MATERIALS) 


1. 우주에서 길을 잃다

PDF

튜터용 지침서

자료(MATERIALS) 




Comment +0

Julian Meyer 라는 13세 소년이 만든 pygame 에 대한 튜토리얼이다. 이 게임은 기본적인 슈팅게임의 기본을 담고 있다. 방법을 익혀두면 다양하게 게임을 만들거나 응용이 가능하다. Beginning Game Programming for Teens with Python 이라는 이름으로 과정과 소스가 모두 인터넷에 공개되어 있다. 2.7 버젼으로 된 것을 최신 버젼인 3.6 버젼으로 수정했고, 일부 코드를 이해하기 쉽게 고쳤다.



STEP 0. 파이썬 & pygame 설치, 그래픽파일과 음악파일 준비


이 글은 윈도우 사용자를 위해 쓰였다. 리눅스나 맥은 가지고 있지 않은 관계로 설치해보질 못했으면 과정이 크게 다르지 않으리라는 것은 알지만 여기에 그 내용을 기록하지 않는다. 또한 원글과는 달리 최신 버젼인 파이썬 3.6 을 설치하여 사용하였다. 파이게임은 이글을 쓰는 당시에 있는 버젼인 1.9.3 을 설치하였다. 파이게임의 설치방법은


pip install pygame


으로 설치한다. 혹시 파이썬 설치방법을 모르는 사람은 다른 글을 통해 익히기 바란다.(가까운 시일내 파이썬 기본 강의를 올릴 예정이며 그때 파이썬 설치에 대해서 자세히 기록할 예정)


게임에 사용되는 배경음악과 그래픽 파일은 여기에서 다운로드하여 사용한다. 


[음악과 그래픽 다운로드]


이후의 과정은 최대한 설명은 생략하고 소스 중심으로 방법만 기술한다.



STEP 1. 토끼 보이기


다음의 코드를 사용한다.


# 1 - Import library
import pygame
from pygame.locals import *

# 2 - Initialize the game
pygame.init()
width, height = 640, 480
screen=pygame.display.set_mode((width, height))

# 3 - Load images
player = pygame.image.load("resources/images/dude.png")

# 4 - keep looping through
while 1:
    # 5 - clear the screen before drawing it again
    screen.fill(0)
    # 6 - draw the screen elements
    screen.blit(player, (100,100))
    # 7 - update the screen
    pygame.display.flip()
    # 8 - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button 
        if event.type==pygame.QUIT:
            # if it is quit the game
            pygame.quit() 
            exit(0) 




STEP 2. 장면추가하기


다음 내용을 #3의 마지막 부분에 넣는다.


grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")


다음 코드를 #6 의 처음 부분에 추가한다.


for x in range(int(width/grass.get_width()+1)): for y in range(int(height/grass.get_height()+1)): screen.blit(grass,(x*100,y*100)) screen.blit(castle,(0,30)) screen.blit(castle,(0,135)) screen.blit(castle,(0,240)) screen.blit(castle,(0,345 ))


STEP 3. 토끼전사가 움직이게 하기


#2 의 마지막 부분에 다음 코드를 넣는다.

keys = [False, False, False, False]
playerpos=[100,100]


#6 에서 

    screen.blit(player, (100,100))

screen.blit(player, playerpos)

으로 바꾼다.

#8의 마지막 부분에서 for event.type==pygame.QUIT: 블럭 다음에 아래 코드를 넣는다.


        if event.type == pygame.KEYDOWN:
            if event.key==K_w:
                keys[0]=True
            elif event.key==K_a:
                keys[1]=True
            elif event.key==K_s:
                keys[2]=True
            elif event.key==K_d:
                keys[3]=True
        if event.type == pygame.KEYUP:
            if event.key==pygame.K_w:
                keys[0]=False
            elif event.key==pygame.K_a:
                keys[1]=False
            elif event.key==pygame.K_s:
                keys[2]=False
            elif event.key==pygame.K_d:
                keys[3]=False


파일의 마지막 부분에 아래 내용을 추가한다.


    # 9 - Move player
    if keys[0]:
        playerpos[1]-=5
    elif keys[2]:
        playerpos[1]+=5
    if keys[1]:
        playerpos[0]-=5
    elif keys[3]:
        playerpos[0]+=5


여기까지 코드를 실행시켜보면 키보드로 WASD 를 누를때 고양이전사가 움직인다.


STEP 4. 고양이전사 방향전환하기


atan2() 라는 수학함수를 사용한다. atan2 함수는 math 라이브러리를 사용한다.


#1 의 끝 부분에 다음을 추가한다.


import math

#6 의 마지막줄을 다음 내용으로 교체(수정)한다.

    # 6.1 - Set player position and rotation
    position = pygame.mouse.get_pos()
    angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
    playerrot = pygame.transform.rotate(player, 360-angle*57.29)
    playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
    screen.blit(playerrot, playerpos1) 


STEP 5. 발사 !


#2 의 마지막 부분에 다음 코드를 추가한다.

acc=[0,0]
arrows=[]


#3 의 마지막 부분에 화살 이미지를 넣는 코드를 추가한다.

arrow = pygame.image.load("resources/images/bullet.png")

#8 마지막 부분에 새로운 이벤트 핸들러를 추가한다.
        if event.type==pygame.MOUSEBUTTONDOWN:
            position=pygame.mouse.get_pos()
            acc[1]+=1
            arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])


#6.1 바로 다음에 아래 코드를 추가한다.

    # 6.2 - Draw arrows
    for bullet in arrows:
        index=0
        velx=math.cos(bullet[0])*10
        vely=math.sin(bullet[0])*10
        bullet[1]+=velx
        bullet[2]+=vely
        if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
            arrows.pop(index)
        index+=1
        for projectile in arrows:
            arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
            screen.blit(arrow1, (projectile[1], projectile[2]))


STEP 6. 오소리 출현

#2 마지막 부분에 아래 코드 추가

badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194


#3 마지막 부분에 다음 코드 추가

badguyimg1 = pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1


#6.2 다음에 아래 코드 추가

    # 6.3 - Draw badgers
    if badtimer==0:
        badguys.append([640, random.randint(50,430)])
        badtimer=100-(badtimer1*2)
        if badtimer1>=35:
            badtimer1=35
        else:
            badtimer1+=5
    index=0
    for badguy in badguys:
        if badguy[0]<-64:
            badguys.pop(index)
        badguy[0]-=7
        index+=1
    for badguy in badguys:
        screen.blit(badguyimg, badguy)


랜덤함수 사용을 위해서 다음 코드를 #1 의 끝 부분에 추가

import random

#4 의 while 문 바로 다음에 badtimer 를 감소시키는 코드 추가
    badtimer-=1

#6.3 의 첫번째 for 반복문 안에서 index+=1 바로 앞에 아래 코드를 추가
        # 6.3.1 - Attack castle
        badrect=pygame.Rect(badguyimg.get_rect())
        badrect.top=badguy[1]
        badrect.left=badguy[0]
        if badrect.left<64:
            healthvalue -= random.randint(5,20)
            badguys.pop(index)
        # 6.3.3 - Next bad guy


STEP 7. 오소리와 화살이 만날때


#6.3.1 아래에 다음 코드를 추가

        #6.3.2 - Check for collisions
        index1=0
        for bullet in arrows:
            bullrect=pygame.Rect(arrow.get_rect())
            bullrect.left=bullet[1]
            bullrect.top=bullet[2]
            if badrect.colliderect(bullrect):
                acc[0]+=1
                badguys.pop(index)
                arrows.pop(index1)
            index1+=1


STEP 8. 체력바와 시간 나타내기


#7 의 시작전에 아래 코드를 추가

# 6.4 - Draw clock font = pygame.font.Font(None, 24) survivedtext = font.render(str(int(90000-pygame.time.get_ticks()))+":"+str(int((90000-pygame.time.get_ticks())/1000%60)).zfill(2), True, (0,0,0)) textRect = survivedtext.get_rect() textRect.topright=[635,5] screen.blit(survivedtext, textRect)


#3 의 끝부분에 다음 코드를 추가

healthbar = pygame.image.load("resources/images/healthbar.png")
health = pygame.image.load("resources/images/health.png")


#6.4 다음에 아래 코드를 추가

    # 6.5 - Draw health bar
    screen.blit(healthbar, (5,5))
    for health1 in range(healthvalue):
        screen.blit(health, (health1+8,8))


STEP 9. WIN / LOSE


아래 코드를 마지막 부분에 추가

    #10 - Win/Lose check
    if pygame.time.get_ticks()>=90000:
        running=0
        exitcode=1
    if healthvalue<=0:
        running=0
        exitcode=0
    if acc[1]!=0:
        accuracy=acc[0]*1.0/acc[1]*100
    else:
        accuracy=0
# 11 - Win/lose display        
if exitcode==0:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(gameover, (0,0))
    screen.blit(text, textRect)
else:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(youwin, (0,0))
    screen.blit(text, textRect)
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()


#3 의 마지막 부분에 아래 코드를 추가

gameover = pygame.image.load("resources/images/gameover.png")
youwin = pygame.image.load("resources/images/youwin.png")


#4의 아래 내용을 수정한다.

[수정전]

# 4 - keep looping through
while 1:
    badtimer-=1

[수정후]

# 4 - keep looping through
running = 1
exitcode = 0
while running:
    badtimer-=1


STEP 10. 배경음악과 효과음악


#2 마지막 부분에 추가

pygame.mixer.init()

#3의 마지막 부분에 추가
# 3.1 - Load audio
hit = pygame.mixer.Sound("resources/audio/explode.wav")
enemy = pygame.mixer.Sound("resources/audio/enemy.wav")
shoot = pygame.mixer.Sound("resources/audio/shoot.wav")
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1, 0.0)
pygame.mixer.music.set_volume(0.25)


#6.3.1 의 if badrect.left<64: 다음에 아래 코드 추가

# section 6.3.1 after if badrect.left<64:
hit.play()


#6.3.2 의 if badrect.colliderect(bullrect): 다음에 아래 코드 추가

# section 6.3.2 after if badrect.colliderect(bullrect):
enemy.play()


#8 의 if event.type==pygame.MOUSEBUTTONDOWN: 다음에 아래 코드 추가

# section 8, after if event.type==pygame.MOUSEBUTTONDOWN:
shoot.play()


Comment +0


◆ 함수 

함수는 재사용 가능한 프로그램의 조각을 말합니다. 이것은 특정 명령어들을 묶어서 이름을 짓고, 그 이름을 프로그램 어디에서건 사용함으로써 그 명령어들을 몇번이고 다시 실행할 수 있게 하는 것입니다. 이를 보고 함수를 호출한다고 합니다. 


def say_hello():

    # block belonging to the function

    print('hello world')

    # End of function


say_hello() # call the function

say_hello() # call the function again



◆ 함수와 매개변수


함수를 정의할 때 매개 변수를 지정할 수 있습니다. 매개 변수란 함수로 넘겨지는 값들의 이름입니다. 매개 변수는 변수와 거의 같이 취급되지만, 매개 변수의 값들은 함수가 호출되어질 때 넘겨받은 값들로 채워지며 함수가 실행되는 시점에서는 이미 할당이 완료되어 있다는 점이 다릅니다.


매개 변수는 함수를 정의할 때 괄호 안에서 쉼표로 구분합니다. 함수를 호출할 때에는, 동일한 방법으로 함수에 값을 넘겨줍니다. 함수를 정의할 때 주어진 이름을 매개 변수라 부르고, 함수에 넘겨준 값들을 인자라 합니다.


def print_max(a, b):

    if a > b:

        print(a, 'is maximum')

    elif a == b:

        print(a, 'is equal to', b)

    else:

        print(b, 'is maximum')

# directly pass literal values

print_max(3, 4)

x = 5

y = 7

# pass variables as arguments

print_max(x, y)



◆ 지역변수

함수 안에서 변수를 선언하고 사용할 경우, 함수 밖에 있는 같은 이름의 변수들과 함수 안에 있는 변수들과는 서로 연관이 없습니다. 이러한 변수들을 함수의 지역(local) 변수라고 하며, 그 범위를 변수의 스코프(scope) 라고 부릅니다. 모든 변수들은 변수가 정의되는 시점에서의 블록을 스코프로 가지게 됩니다.



x = 50

def func(x):

    print('x is', x)

    x = 2

    print('Changed local x to', x)


func(x)

print('x is still', x)



◆ 전역변수


함수나 클래스 내부에서 상위 블록에서 선언된 변수의 값을 변경하고 싶을 경우, 파이썬에게 이 변수를 앞으로 지역 변수가 아닌 전역(global) 변수로 사용할 것임을 알려 줍니다. 이때 global을 이용합니다. global 문을 사용하지 않으면, 함수 외부에서 선언된 변수의 값을 함수 내부에서 변경할 수 없습니다.


x = 50


def func():

    global x

    print('x is', x)

    x = 2

    print('Changed global x to', x)


func()

print('Value of x is', x)


# 함수 내부에서 global 로 변수가 전역변수임을 알린다.

# 4번째 줄이 없으면 에러 발생



◆ 기본 인수값

함수를 호출할 때 인수를 선택적으로 넘겨주게 하여 사용자가 값을 넘겨주지 않으면 자동으로 기본값을 사용하도록 하는 것이 편할 때가 있습니다. 이런 경우, 기본 인수값을 지정하면 됩니다. 함수를 선언할 때 원하는 매개 변수 뒤에 대입 연산자 (=)와 기본값을 입력하여 기본 인수값을 지정합니다.


이 때, 기본 인수값은 반드시 상수이어야 합니다. 좀 더 정확히 말하자면, 불변값이어야 합니다. 


def say(message='HI ', times=1):

    print(message * times)


say('Hello')

say('World', 5)

say()

# say( , 10)



◆ 키워드 인수

여러 개의 매개 변수를 가지고 있는 함수를 호출할 때, 그 중 몇 개만 인수를 넘겨주고 싶을 때가 있습니다. 이때 매개 변수의 이름을 지정하여 직접 값을 넘겨줄 수 있는데 이것을 키워드 인수 라 부릅니다. 함수 선언시 지정된 매개 변수의 순서대로 값을 넘겨주는 것 대신, 매개 변수의 이름 (키워드) 를 사용하여 각각의 매개 변수에 인수를 넘겨 주도록 지정해 줍니다.


키워드 인수를 사용하는 데 두가지 장점이 있습니다. 첫째로, 인수의 순서를 신경쓰지 않고도 함수를 쉽게 호출할 수 있는 점입니다. 둘째로는, 특정한 매개 변수에만 값을 넘기도록 하여 나머지는 자동으로 기본 인수값으로 채워지게 할 수 있습니다.


def func(a, b=5, c=10):

    print('a is', a, 'and b is', b, 'and c is', c)


func(3, 7)

func(25, c=24)

func(c=50, a=100)


func(1,2,3)

func(a=1,b=2,c=3)

func(c=3,a=1,b=2)




◆ VarArgs 매개변수

함수에 임의의 개수의 매개 변수를 지정해주어야 할 때가 있습니다. 이때 VarArgs 매개 변수를 사용합니다. 아래 예제와 같이 별 기호를 사용하여 임의의(Variable) 개수의 인수(Arguments) 를 표현합니다.


def total(initial=5, *numbers, **keywords):

    count = initial   

    for number in numbers:

        count += number

    for key in keywords:   

        count += keywords[key]

    return count


print(total(10, 1, 2, 3, vegetables=50, fruits=100))




◆ return 문

return 문은 함수로부터 되돌아(return) 나올 때, 즉 함수를 빠져 나올 때 사용됩니다. 이 때 return 값 처럼 값을 지정해 주면, 함수가 종료될 때 그 값을 반환하도록 할 수 있습니다.


def maximum(x, y):

    if x > y:

       return x

    elif x == y:

       return 'The numbers are equal'

    else:

       return y


print(maximum(2, 3))



◆ DocString : 설명문자열

파이썬은 설명(Documentation) 문자열(String) 이라고 불리우는, 짧게 줄여서 DocStrings라 불리우는 편리한 기능을 가지고 있습니다. DocString은 여러분이 만든 프로그램을 알아보기 쉽게 해 주고, 또 후에 프로그램에 대한 설명서를 작성할 때 유용하게 사용될 수 있는 중요한 도구입니다. 아래 예제와 같이, DocString은 프로그램이 실행중일 때도 읽어올 수 있습니다.


def print_max(x, y):

    '''Prints the maximum of two numbers.

    

    The two values must be integers.'''

    x = int(x)

    y = int(y)

    if x > y:

        print(x, 'is maximum')

    else:

        print(y, 'is maximum')


print_max(3, 5)

print(print_max.__doc__)



◆ 파이썬 turtle 모듈 사용하기

1. 사용하려는 모듈 가져오기 (import)

import turtle

2. 캔버스생성

t = turtle.Pen()

3. 거북이 움직이기

t.forward(거리)

t.backward(거리)

t.left(각도)

t.right(각도)

t.reset()

t.clear()

t.up()

t.down()


4. 사각형을 그려보자


import turtle


t = turtle.Pen()


t.forward(100)

t.left(90)

t.forward(100)

t.left(90)

t.forward(100)

t.left(90)

t.forward(100)


5. 다음 코드를 실행해보자



import turtle


t = turtle.Pen()


for i in range(0,36):

    t.forward(100)

    t.left(50)



터틀그래픽 기본 자료 https://docs.python.org/3.6/library/turtle.html



Comment +0



◆ 학점 프로그램을 만든다면 ?


점수

학점

점수에 따른 학점의 기준을 만든다

) 95점 이상 A+, 60점 미만 F

첫번째 줄의 점수를 판단

) 96점은 95점 이상이므로 A+

다음 줄로 계속 이동하면서 를 반복

) 51점은 60점 미만이므로 F

더 이상 점수가 없을 때 프로그램 종료

96

 ?

51

 ?

69

 ?

15

 ?


프로그램을 만들 때 조건과 반복은 필수


◆ 조건문이란?

조건에 따라 특정한 동작을 하게 하는 것


if 문은 조건을 판별할 때 사용됩니다. if (만약) 조건이 참이라면, if 블록의 명령문을 실행하며 else (아니면) 면 else 블록의 명령문을 실행합니다. 이 때 else 조건절은 생략이 가능합니다.


if True:

    print('Yes, it is true’)



number = 23

guess = int(input('Enter an integer : '))

if guess == number:

    # New block starts here

    print('Congratulations, you guessed it.')

    print('(but you do not win any prizes!)')

    # New block ends here

elif guess < number:

    # Another block

    print('No, it is a little higher than that')

    # You can do whatever you want in a block ...

else:

    print('No, it is a little lower than that')

    # you must have guessed > number to reach here

print('Done')

# This last statement is always executed,

# after the if statement is executed.



◆ 반복문 : while 

while 문은 특정 조건이 참일 경우 계속해서 블록의 명령문들을 반복하여 실행할 수 있도록 합니다. while 문은 *반복문*의 한 예입니다. 또한 while 문에는 else 절이 따라올 수 있습니다.

 

number = 23

running = True

while running:

    guess = int(input('Enter an integer : '))

    if guess == number:

        print ('Congratulations, you guessed it.')

        # this causes the while loop to stop

        running = False

    elif guess < number:

        print ('No, it is a little higher than that.')

    else:

        print ('No, it is a little lower than that.')

else:

    print ('The while loop is over.')

       # Do anything else you want to do here

print ('Done')



◆ for 루프

for..in 문은 객체의 열거형(Sequence)을 따라서 반복하여 실행할 때 사용되는 파이썬에 내장된 또 하나의 반복문으로, 열거형에 포함된 각 항목을 하나씩 거쳐가며 실행합니다. 열거형에 대해서는 이후에 좀 더 자세히 다룰 것입니다. 일단 여기서는, 열거형이란 여러 항목이 나열된 어떤 목록을 의미한다고 생각하시기 바랍니다.


for i in range(1, 5):

    print (i)

else:

    print ('The for loop is over')



◆ break 문

break 문은 루프 문을 강제로 빠져나올 때, 즉 아직 루프 조건이 `False`가 되지 않았거나 열거형의 끝까지 루프가 도달하지 않았을 경우에 루프 문의 실행을 강제로 정지시키고 싶을 때 사용됩니다.


중요한 점은 만약 여러분이 break 문을 써서 for 루프나 while 루프를 빠져나왔을 경우, 루프에 딸린 else 블록은 실행되지 않습니다.


while True:

    s = input('Enter something : ')

    if s == 'quit':

        break

    print ('Length of the string is', len(s))

print ('Done')


◆ continue 문

continue 문은 현재 실행중인 루프 블록의 나머지 명령문들을 실행하지 않고 곧바로 다음 루프로 넘어가도록 합니다.


while True:

    s = input('Enter something : ')

    if s == 'quit':

        break

    if len(s) < 3:

        print('Too small')

        continue

    print('Input is of sufficient length')

        # Do other kinds of processing here...


HW : 

1. 하나의 숫자를 입력받은 후 1) 짝수인지 여부와 2) 3의 배수인지 여부를 출력

2. 로또 번호 출력기 만들기

2.1. 5개의 로또번호를 만든다.

2.2. 5개의 숫자를 입력받은 후 번호가 맞는지 확인하는 것을 반복한다. 

2.3. 5개 번호가 다 맞으면 5개 번호와 시행횟수를 출력한다.

3. 숫자를 입력받은 후 그 숫자만큼 * 을 출력하는 프로그램

3.1. ******** (한줄로 출력)


 3.2.

 3.3

 3.4

 3.4

3.5 

 3.6

*

**

***

****

*****

    *

   **

  ***

 ****

*****


*****

****

***

**

*

*****

 ****

  ***

   **

    *

    *

   ***

  *****

 *******

*********

*********

 *******

  *****

   ***

    *



 

Comment +0


◆ 주석 - # 문자 뒤에 따라오는 짧은 문장


print('hello world') # Note that print is a statement

# Note that print is a statement


◆ 리터럴 상수

- 5

- 1.23

- ‘This is a book’

- “Sting”


◆ 숫자형

- 정수형 : 5

- long 형이 없다


import sys


t1 = sys.maxsize

# t1 = sys.maxint


t2 = t1+1 #int범위를 넘으면 long 자동 형 변환

t3 = t2**10


print(t1)

print(t2)

print(t3)


print(type(t1))

print(type(t2))

print(type(t3))


- 소수점 숫자형 : 4.16, 52.3E-3 (= )


◆ 문자열


◆ 작은 따옴표(‘’)와 큰 따옴표(“”)


◆ 따옴표 세 개


◆ 문자열 수정은 불가


◆ format()

str_format.py


age = 26

name = 'Python'


print('{0} was {1} years old'.format(name, age))

print('{0} is easy'.format(name))



◆ format() 대신 문자열 더하기


print(name + ' is ' + str(age) + ' years old')


※ 위의 형식보다는 format()을 사용하는 것을 추천


◆ 중괄호 숫자 생략 가능


age = 19

name = 'Baram'


print('{} was {} years old'.format(name, age))

print('Why is {} playing with that python?'.format(name))



◆ format() 의 또 다른 사용법


# 소수점 이하 셋째 자리까지 부동 소숫점 숫자 표기 (0.333)

print('{0:.3f}'.format(1.0/3))

# 밑줄(_)로 11칸을 채우고 가운데 정렬(^)하기 (___hello___)

print('{0:_^11}'.format('hello'))

# 사용자 지정 키워드를 이용해  표기

print('{name} wrote {book}'.format(name='Baram', book='Easy Arduino'))



◆ print() 사용시 줄바꿈을 막으려면,


print("Hello ", end='')

print("World")



◆ 특수(Escape) 문자

\'

"'"

'"'

\"

\\

\n

\t


◆ 순문자열 

r"Newlines are indicated by \n“


◆ 변수


- 식별자의 첫 문자는 알파벳 문자 (ASCII 대/소문자 혹은 유니코드 문자)이거나 밑줄 (_)


- 나머지는 문자 (ASCII 대/소문자 혹은 유니코드 문자), 밑줄 (_), 또는 숫자 (0-9)


- 식별자는 대/소문자를 구분. 예를 들어, myname 과 myName 은 다르다.


- 올바른 식별자 이름은 i, name_2_3 등과 같고, 올바르지 않은 식별자 이름은 2things, this is spaced out, my-name, >a1b2_c3 등입니다.



◆ 명시적 행간결합


s = ' Hello \

World'


print(s)


◆ 들여쓰기 – 4칸 들여쓰기


◆ 연산자


>>> 2 + 3

5

>>> 3 * 5

15

>>>



+ (덧셈 연산자)

- (뺄셈 연산자)

* (곱셈 연산자)

** (거듭제곱 연산자)

/ (나눗셈 연산자)

% (나머지 연산자)

<< (왼쪽 시프트 연산자)

>> (오른쪽 시프트 연산자)

& (비트 AND 연산자)

| (비트 OR 연산자)

^ (비트 XOR 연산자)

~ (비트 반전 연산자)

< (작음)

> (큼)

<= (작거나 같음)

>= (크거나 같음)

== (같음)

!= (같지 않음)

not (불리언 NOT 연산자)

and (불리언 AND 연산자)

or (불리언 OR 연산자)


◆ 연산 및 할당 연산자


a = a*3 은

a *= 3 과 동일


◆ 연산순서


● lambda

● if – else

● or

● and

● not x

● in, not in, is, is not, <, ⇐, >, >=, !=, ==

● |

● ^

● &

● <<, >>

● +, -

● *, /, //, %

● +x, -x, ~x

● **

● x[index], x[index:index], x(arguments…​), x.attribute

● (expressions…​), [expressions…​], {key: value…​}, {expressions…​}



◆ ( ) 이용한 연산순서 변경

● 2 + 3 * 4 + 5

● 2 + 3 * (4 + 5)

● 2 + (3 * (4 + 5))





Comment +0


파이썬은 배우기 쉽고, 강력한 프로그래밍 언어입니다. 파이썬은 효율적인 고수준 데이터 구조를 갖추고 있으며, 간단하지만 효과적인 객체 지향 프로그래밍 접근법 또한 갖추고 있습니다. 우아한 문법과 동적 타이핑, 그리고 인터프리팅 환경을 갖춘 파이썬은 다양한 분야, 다양한 플랫폼에서 사용될 수 있는 최적의 스크립팅, RAD(rapid application development - 빠른 프로그램 개발) 언어입니다.


◆ 파이썬이라는 이름의 유래

파이썬의 창시자 귀도 반 로섬(Guido van Rossum)이 BBC에서 방영되던 "Monty Python’s Flying Circus"라는 TV 프로그램의 이름을 따서 지었습니다. 사실 귀도는 뱀이라는 긴 몸으로 다른 동물의 몸을 휘감아 으깨어 부수고 먹어치우는 동물을 딱히 좋아하지는 않는다고 합니다.


◆ 파이썬의 특징


● 단순함(Simple)

● 쉬움(Easy to Learn)

● 오픈 소스(Free and Open Source)

● 고수준 언어(High-level Language)

● 이식성(Portable)

● 인터프리터 언어(Interpreted)

● 객체 지향 언어(Object Oriented)

● 확장성(Extensible)

● 포함성(Embeddable)

● 확장 가능한 라이브러리(Extensive Libraries)


요약 - 흥미진진하고 강력한 언어. 재미있고 쉽게 프로그램을 작성할 수 있음


◆ Python 2.x 에서 Python 3.x 으로 바뀌면서 생긴 변화들


1. python 3.x – 변수가 객체로 처리


2. print에서 ( ) 필수 사용

Python 2

Python 3

print ‘hello’

print(’hello’)


3. str 과 unicode 통일됨

Python 2

Python 3

print( type('hello') )

print( type(u'hello') )

# <type 'str'>

# <type 'unicode'>

print( type('hello') )

print( type(u'hello') )

# <class 'str'>

# <class 'str'>


모든 문자열은 별도로 지정하지 않아도 유니코드로 설정됨


4. int 나누기 결과가 float 으로 저장

Python 2

Python 3

print( 1/4 )

print( type(1/4) )

# 0

# <type 'int'>

print( 1/4 )

print( type(1/4) )

# 0.25

# <class 'float'>



5. long → int로 통일


Python 2

Python 3

print( 2**30 )

print( type(2**30) )

print( 2**100 )

print( type(2**100) )

# 1073741824

# <type 'int'>

# 1267650600228229401496703205376

# <type 'long'>

print( 2**30 )

print( type(2**30) )

print( 2**100 )

print( type(2**100) )

# 1073741824

# <class 'int'>

# 1267650600228229401496703205376

# <class 'int'>


◆ 개발환경 구성 - 윈도우 환경에서의 설치


https://www.python.org/downloads/ 의 최신버전의 설치 프로그램을 설치

설치 방법은 다른 소프트웨어를 설치 할 때와 동일 


주의: 혹시 설치 도중 기본으로 설치하도록 표시된 "추가 기능"을 선택하지 않을 것인지 물어도, 선택을 해제하지 마세요.



◆ 개발환경 구성 – 아톰 IDE 설치


공식 홈페이지 http://atom.io 에 들어가면 상단에 윈도우즈용 다운로드 버튼이 나타납니다.

인스톨 파일을 다운받았다면 실행시켜서 설치하면 되겠습니다. 설치시와 실행시, 외부와의 커넥션이 있으므로 방화벽이 있는 시스템의 경우 통신을 허락해주어야 합니다.


◆ 명령 프롬프트 사용하기

파이썬을 윈도우의 명령 프롬프트 상에서 사용하기 위해 PATH 환경 변수를 설정


윈도우 2000, XP, 2003의 경우, “제어판 → 시스템 → 고급 → 환경 변수”로 들어가세요. “시스템 변수” 목록에 있는 “PATH”를 선택한 뒤, “편집” 버튼을 누르고 파이썬을 설치한 폴더(디렉토리)가 있는지 확인하세요. 만약 없다면 디렉토리를 PATH 에 추가해서 넣어주세요. 


그 이전 버전의 윈도우를 사용하시는 분들은, C:\AUTOEXEC.BAT`를 열고 맨 뒷줄에 `PATH=%PATH%;C:\Python35 이라고 마지막에 한 줄 추가한 뒤 시스템을 재시작하세요. 윈도우 NT의 경우, AUTOEXEC.NT 파일을 편집하세요.



◆ 파이썬 실행

PATH 환경변수가 제대로 설정되어 있다면, 파이썬 인터프리터를 명령 프롬프트 상에서도 실행하실 수 있습니다.


윈도우 환경에서 터미널 창을 열기 위해서는, 시작 메뉴를 누르고 실행 버튼을 클릭하세요. 나타나는 대화상자에 “cmd” 를 입력하시고 enter 키를 입력하세요.


이제, “python” 을 입력하고 파이썬 프롬프트가 잘 실행되는지 확인하세요.


잘 되면, print(‘Hi Baram’)를 넣어 보세요. 파이썬 프로그램을 마칠때는 exit()를 입력하고 엔터를 치면 됩니다.



◆ Linux 에서의 설치


GNU/Linux 사용자의 경우, 파이썬이 이미 설치되어 있을 것입니다.


확인하시려면, 터미널 프로그램을 열거나 혹은 Alt+F2 키를 입력한 뒤 “gnome-terminal”을 입력하여 터미널을 실행하세요. 만약 이 두 방법으로 터미널을 실행시킬 수 없으면, 여러분이 설치한 리눅스 배포판의 설명서를 참조하세요. 이제, “python”을 입력하고 문제가 없는지 확인하세요.


다음과 같이 입력하면 시스템에 설치된 파이썬의 버전을 확인할 수 있습니다.


$ python -V

Python 3.5.3 (버젼에 따라 다르게 나올 수 있습니다.)



◆ “Hello World” 프로그램 작성

파이썬에서 프로그램을 실행하는 방법은 두 가지가 있습니다. 첫째는 대화형 인터프리터 프롬프트를 이용하는 방법과, 둘째는 소스 파일을 이용하는 것입니다. 지금부터 두 방법 모두 알아보도록 하겠습니다.


1. 인터프리터 프롬프트에서의 실행


     print("Hello World“)


2. 편집기 사용, 소스파일 실행


PyCharm Community 또는 atom 사용


PyCharm 설치 후 hello.py 저장, 실행


hello.py 이름으로 파일을 만들고 내용으로


print('Hello World')


를 넣습니다. 명령어입력창으로 가서 python hello.py를 칩니다.




Comment +0



인터넷에 상당히 좋은 자료들이 많다. 파이썬은 새로운 언어이고, 쉬우면서도, 짧은 시간에 개발자들이 가장 많이 쓰는 언어가 되었다.

파이썬을 배우기에 적당한 자료들을 모아둔다.


[Python 기본문법]

  • A Byte of Python : https://goo.gl/bXa14i
  • 온라인 파이썬입문  https://goo.gl/Tb68ur
  • codecademy 학습 https://goo.gl/I7sxQ1

[pyQt - GUI]
  • 영문튜토리얼 https://goo.gl/Sx1yOl

[DJango - 웹]
  • 장고걸스 튜토리얼 https://goo.gl/t6SKPI


Comment +0


Python 예약어 (Reserved Words):

  • 파이썬의 예약어는 모두 30개입니다.
  • 예약어는 변수 나 함수등의 이름으로 사용 할 수 없습니다.
  • 예약어는 모두 소문자입니다. 
KeywordKeywordKeyword
andexecnot
assertfinallyor
breakforpass
classfromprint
continueglobalraise
defifreturn
delimporttry
elifinwhile
elseiswith
exceptlambdayield


Comment +0


1. 리터러시의 고전적 이해 (1)


리터러시, 문해라고 불리는 literacy 의 고전적 정의는 "문자화된 기록물을 통해 지식과 정보를 획득하고 이해할 수 있는 능력"이다. 그래서 고전적으로 문해력은 읽기, 쓰기, 셈하기로 분류된다. 이 세가지 능력이 있다면 새로운 지식과 정보를 습득하고 이해할 수 있다는 의미가 된다.


literate 는 라틴어에서 영어로 옮겨진 단어이다. '수준높고 우아한 교양이 있는 것'을 의미한다. 그래서 literature 는 문학이라는 뜻을 가진다. 베이컨은 이 단어를 '모든 문헌을 망라한 것'이라고 표현했고, 이는 문학을 의미하게 되어 현재에 이른다. literacy 의 근원에는 높은 혹은 고귀한 교양이라는 의미가 포함된다.


옥스포드 사전에서 literacy 는 1850년대 미국 메사추세츠의 교육위원회 기관지에 처음 등장하는 것으로 기록된다. 여기서의 literacy 는 공교육제도의 모든 아동에게 습득시킬 교양의 의미를 가진다. 미국에서 이 말은 기능적 리터러시로 사용되었다. 당시에는 초등학교 4학년, 1930년대에는 중학생, 현재 고등학교 졸업수준의 교양을 의미하게 된다. 미국에서의 리터러시는 공교육과정에서 습득할 공통교양을 의미한다.


1956년 유네스코 개발교육의 정책문서에서 리터러시는 읽고 쓰는 능력으로 기록된다. 한국과 일본에서는 유네스코를 중심으로 개발교육의 맥락에서 리터러시가 소개되었기에 국내에서의 리터러시는 읽고쓰는 능력을 의미하게 된다.



2. 디지털 리터러시


과거에 읽기와 쓰기, 셈하기가 문해를 위한 기초 교양이었다면 지금시대의 기초교양은 그것을 넘어선다. 디지털 시대에 사는 사람들에게는 별도의 기초교양이 필요하다. 그것을 디지털 리터러시라고 부른다. 디지털 시대에 살고 있다고 하지만 과연 무엇이 우리에게 필수적인 것인지에 대해서는 아직 논의의 여지가 많다. 여기서는 영국 JISC 의 디지털 리터러시에 대한 7가지 요소를 보이고자 한다. 


 


디지털 리터러시에 대해서 많이 말은 하지만 정작 세부 내용으로 들어가면 아직 무엇을 어떻게 정의하는지 국내에서는 제대로 된 연구결과가 없다. 그래서 영국 JISC 의 7요소를 가져왔다. 과거 6요소였던 것이 2014년도에 개정되면서 7요소가 되었고, 다시 개정될 것으로 보인다. 즉, 꾸준히 디지털 리터러시에 관한 연구는 필요하고 연구가 진행되는 만큼 우리는 한걸음 더 필요한 것에 가깝게 다가설 수 있다.


영어 단어를 번역해보았다.



이 중 미디어 리터러시에 관한 내용은 어느 정도 있다. (2)


2013년도 코카포터스의 미디어 리터러시의 국내외 동향 및 정책방향을 보면 미디어리터러시에 관해서는 상당한 관심을 보인다. 여기서는 ‘소통’능력을 추가하여, 리터러시를 ‘접근 능력’, ‘비판적 이해 능력’, ‘창의적 표현 능력’, ‘소통 능력’의 4가지 하위영역으로 확장시킨다. 


디지털 리터러시에 대해서는 각 국의 연구를 참고하여 한국에서도 능동적으로 연구를 시작할 때가 되었다.




Reference


1. goo.gl/AYcAZW

2. goo.gl/tgrZEF



Comment +0

word cloud 를 만들어 보기위해 하루 공부했다. 다행히 R 이나 파이썬이 어려운 언어가 아니고, 기존에 어느정도 알고 있는 것들이라 쉽게 적용할 수 있었다.


아직 모양은 조금 더 다듬어졌으면 하지만 이정도만 해도 우선은 합격이다. 더 필요한 것은 나중에 Big Data 를 다루면서 한번 더 해보기로 한다.


설치와 기타 모든 과정은 생략한다. 다음번에 기회가 되면 파이썬과 R 을 이용한 워드클라우드 만들기를 강의로 올리도록 하겠다.


파이썬으로 만든 Word Cloud 의 데이터는 5인의 대선후보 수락 연설문이다. 가져온 데이터의 위치는  http://raythep.mk.co.kr/newsView.php?cc=270001&no=13153 이고, 여기서 PDF 내부의 raw 데이터를 추출해 내어서 별도의 위치에 저장해 두었다.


https://github.com/eventia/CandSpeech


위 링크를 따라가면 5 명의 후보 수락 연설문의 raw 데이터와 함께 본 작업을 수행한 파이썬의 코드가 있다. 파이썬 버젼은 3.4 였으며, 조금만 변형하면 2.7 로도 가능하다. 원 소스는 [ http://konlpy.org/ko/v0.4.3/examples/wordcloud/ ] 에 있으며, 파이썬 2.7 버젼에서 KoNLPy 를 사용한다.


한글로 word cloud 를 만들기 위해 폰트를 추가로 넣어주는 과정이 있었으나, 그 과정을 포함하여 세부적인 기술사항은 이 글에서는 생략한다. 




1번 문재인 후보의 연설문으로 word cloud 를 작성한 것이다. 글씨 크기는 본문안에 그 단어가 몇번 나왔는지의 비중에 따라 달라진다. 가장 많이 사용한 단어는 국민이고, 다른 후보들과는 조금 특이한 점이 "저"라는 겸양대명사의 사용이 두드러진다. "대통령" 이라는 말보다 "저"의 빈도가 높다. 또 다른 후보들과 달리 자신의 이름 "문재인"을 호명하는 횟수가 적다. 총 2번이다. 실제로 "국민"이라는 말은 다른 단어에 포함된 것을 합하면 총 33번 등장한다. 어쨌거나 있는 그대로를 가지고 word cloud 를 만들어야 한다는 생각으로 별도로 자료에 대한 수정을 가하지는 않았다.



2번 홍준표 후보의 경우 "대통령"이라는 말이 연설문 안에서 큰 비중을 차지한다. 의도적으로 그 단어를 자주 드러냄으로서 원하는 것을 제대로 강조하고 있다. 그 외에 대한민국, 계파, 우리, 당, 좌파 등의 단어가 자주 언급된다. 자신의 이름도 자주 언급한다. 내용은 차치하고 단어 선택에 있어서 산만하지 않고 제대로 한길을 파고 있다는 것이 보인다.




3번 안철수 후보의 연설문에는 두드러지게 "국민"이라는 말이 등장한다. 문재인의 연설문에도 "국민"이 큰 빈도를 가지지만 안철수의 연설문에서 "국민"의 언급횟수는 문재인의 언급횟수를 뛰어 넘는다. 나, 여러분, 미래, 대통령, 승리, 안철수 등이 자주 등장한다. 한글 자연어 처리 방법에서 , 를 제대로 처리하지 못하는 것 때문에 "안철수,"와 "안철수"가 별도의 단어처럼 되어 2번 등장한다. 이것을 합치면 안철수 후보의 연설문속에 자신의 이름을 반복해서 언급하는 비중은 다섯 후보중 가장 많다. 문재인이 "저"라는 겸양대명사를 썼다면 안철수는 자신의 이름 "안철수"를 대중들에게 각인시키는 연설을 했다. 연설문을 통해 후보들이 보이는 다른 전략이 보인다.




4번 유승민 후보의 연설문에서 대통령이라는 단어의 비중은 확실히 크다. 보수, 여러분, 저, 대한민국, 유승민, 문재인등이 그 다음으로 큰 비중을 가진다. 다른 후보들과 달리 유승민 후보는 연설문에서 "문재인"을 5번 언급한다. 유승민의 선거전력이 보이는 부분이다. 유력 후보인 문재인에 대한 비판을 최대의 앞당겨서 연설문부터 시작하겠다는 의지의 표명으로 보인다. 나름 굵직한 단어들이 많이 포진되어 있는 것으로 보아 중요하다고 생각되는 단어들을 자주 반복해서 언급함으로 그 중요성을 부각시키려는 전략은 모든 후보들 중 가장 나아보인다.


5번 심상정 후보의 연설문은 가장 많이 나온 단어인 "정의당" 이 총 13번 등장한다. 이는 유승민 후보의 27번 언급된 "대통령"이나 안철수 후보가 41번 언급한 "국민", 28번 언급된 홍준표의 "대통령", 33번 언급된 문재인의 "국민"과 비교하면 너무 횟수가 적다. 동어반복을 피하고자 하는 의도가 있었던 것이 아닐까하는 생각을 해보지만 결국 일반 대중을 상대로 하는 연설문을 고급진 문장으로 구사하면 일반인들의 이해는 떨어질 수 밖에 없다. 심상정 후보의 연설문은 강조되는 단어가 없다. 즉각적으로 와 닿는 단어들을 만들어내지 못했다. 멀찍이 떨어져있는 단어들은 국민들에게 이해의 정도를 떨어뜨릴 수 밖에 없다. 아쉬운 부분이다. 





Comment +0


코딩교육용 로봇 "코디"를 소개한다. 2015년 상반기에 인디고고에서 펀딩에  성공했고, 가격이나 외형이 상당히 초기의 모습과 실제 펀딩이 시작될때의 모습이 많이 달라졌다. 2017년이라 이 외에도 많은 코딩용 로봇들이 나왔지만 크게 변한건 없는 것 같다. 


블로터에서 코디를 소개한 기사를 보면 다음과 같은 특징들이 나온다. 


빛센서, 나침반, 마이크, 자이로스코프, 가속도센서, 초음파센서 등으로 구성되어 있다. 외형은 무한궤도를 사용한 탱크의 모양이다 

2013년 헝가리에서 설립한 스타트업으로 2년간 제품 연구 및 개발을 했고, 인디고고를 통해 대량 생산에 들어간다. 169달러, 18만원정도다. 간단한 프로그램을 PC 나 태블릿이 아닌 스마트폰으로 가능하게 했고, 주 대상층을 초등 저학년이다. 조건, 반복, 변수, 데이터 흐름등을 배울수 있고, Computational Thinking 을 가르칠 수 있다고 설명한다.




링크 : http://www.bloter.net/archives/224560


인디고고 사이트는 코디에 대한 보다 자세한 설명이 있다. 코딩교육용 로봇을 준비하고 있다면 한번 살펴볼만한 곳이다.


링크 : https://www.indiegogo.com/projects/codie-cute-personal-robot-that-makes-coding-fun#/


우선 별도의 홈페이지 연결이 되지 않는 것으로 보아 코디가 지속적으로 개발되고 있는지 의문이 든다. 그림으로 나타난 정도의 코딩을 지원하는 것으로 이 로봇을 구입해서 교육용으로 쓰려고 할 것인지에 대해서도 의문이 든다. 코디가 나올때만해도 경쟁제품들이 거의 없는 편이어서 괜찮았겠지만 현재는 상당히 많은 경쟁제품들이 출시되고 있다. 가격과 기능, 교육적 효용성등을 고려할 때 이정도의 로봇으로 지속적인 판매를 이루어내기는 어려워보인다.


이번부터 당분간 시장에 나온 코딩교육용 로봇을 살펴보고 그 특징이나 장단점을 비교해보는 글을 쓰고자 한다. 충분한 돈이 있으면 직접 구입해서 제품을 사용해 보고 그 결과를 올리는 것이 좋겠지만 아쉽게도 그럴만한 경제적 사정이 되지 않는다. 혹시라도 일정기간동안 빌려서 사용해볼 수 있다면 제일 좋겠다. 가지고 있는 로봇을 2주정도 빌려주실 분이 계시면 정말 고맙겠다. 그럴수 있다면 메일로 (eventia@daum.net) 연락주시기 바란다.





Comment +0

야스민 B. 카파이, 퀸 버크가 쓴 "코딩의 귀환"은 한국어로 나온 코딩교육 서적 중 첫번째로 읽어야 할 책이다.






코딩교육이라는 핫이슈가 한국사회를 뜨겁게 달구고 있다. 첫째, 선진국들이 이미 하고 있는데 한국은 뒤쳐졌으니 따라가야 한다는 주장과 둘째, 학교교육에 SW교육을 필수로 넣겠다는 정부발표때문이다. 


그러다보니 결국 우리는 왜 해야 하는지에 대한 정확한 이유가 없이 어쨌거나 떠밀려서 해야만 하게 되었고, 한편에서는 지금도 힘들어죽겠는데 또 수능을 위해 SW까지 공부해야되느냐라는 소리가 나온다. 개발자들은 지금도 3D 직종인데 이걸 자식들에게 물려주어야 하는가라는 소리도 나온다. 그 와중에 각종 협회와 자격증을 가진 단체들은 자기들이 주도권을 가져야 코딩교육을 제대로 할 수 있다고 밥그릇 싸움을 시작했다.


이런 현 시점에서 "코딩교육"이라는 단어가 그다지 매력적으로 다가오지는 않는다. 이미 출판된 몇권의 책에서도 결국 코딩교육은 1) 세계적 추세다 2) 초,중,고 필수과목이다 가 핵심이 되고있다. 거기에 애매하게 창의성을 포함시켜서 이야기하고, 해외의 SW개발자들의 연봉을 들어 필요성을 말한다. 듣다보면 해야 할것 갈고, 안하면 안될것 같기는 한데, 그럼에도 왜 해야 하는지에 대해서 제대로 설명해주지 않는다. 


"코딩의 귀환"은 미국 코딩교육의 역사를 짚어준다. 전체의 역사 속에서 코딩교육의 의미와 필요성, 그리고 흥미진진한 사실들을 전달해준다. 카파이는 펜실베니아 대학 Learning Science 교수이고, 퀸 버크는 찰스톤 대학 사범교육부의 조교수다. 이 책은 Computer Science 전공자와 Education 전공자가 함께 만들어낸 역작이다!


앞으로 몇차례에 걸쳐서 이 책의 내용을 소개하고자 한다. 오늘은 책의 서문에 적히 미첼 레스닉의 말을 요약하는 것으로 대신한다. 미첼 레스닉은 스크래치로 알려진 MIT 미디어랩을 담당하고 있다. 



미첼은 [코딩의 귀환: 아이들이 프로그래밍을 배워야 하는 이유] 에서 시모어 페퍼트와의 만남을 떠올린다. 페퍼트는 초창기 퍼스널 컴퓨터에 열광하는 사람들을 모아두고 아이들이 컴퓨터 프로그램을 만들고, 음악을 작곡하고, 로봇을 제어하고, 시물레이션을 개발하는 창의적 활동을 할 것이라고 강연했다. 이꿈은 당시 사람들에게는 실현불가능한 것처럼 보였다. 하지만 30년만에 그 일이 일어나고 있다. 1980년대 프로그래밍을 아이들에게 가르치려는 열풍이 있었다. 로고라는 언어가 나왔다. 하지만 그 열풍은 오래가지 않았다. 교육자들은 프로그래밍이 몇몇 아이들에게만 적합한 제한적이고 기술적 행위라고 보았다. 

이책은 지난 몇년간 갑자기 코딩이 다시 유행을 타게 된 것을 보여준다. 스크래치는 온라인 커뮤니티를 탄생시켰고, 레고와 공동으로 아이들이 제어할 수 있는 로봇 키트를 개발하게 했다. 아직 많은 이들은 코딩을 일자리와 관련해서만 생각하지만 카파이와 버크(책의 저자들)는 코딩의 매력이 금전적, 경제적 동기를 뛰어넘는다는 것을 깨달았다. 코딩의 부활은 maker movement 의 더 큰 움직임이다. 메이커 운동과 프로그래머 운동에 대해 흥미를 느끼는 사람이 늘어나고 있다. 하지만 아직 초기단계다. 기술이 퍼지는 속도보다 사람들의 사고방식이 변화는 속도가 느리다. 아직 많은 사람들은 컴퓨터를 정보를 실어나르고 정보에 접근하는 도구로만 본다. 사람들이 컴퓨터에 대한 새로운 사고방식과 학습에 관한 새로운 사고방식을 기대한다.





Comment +0

The Co-operative Santa Dash - London


협동조합에 가입하고자 하는 조합원의 자격을 제한할 수 있고, 총회나 다른 제도적 장치를 통해 신규가입자를 심사, 승낙하는 것이 가능하다.


협동조합의 조합원 자격에 대해서 기존에 읽었던 책("협동조합 참 좋다")에서는 국제협동조합연맹의 경우를 들며 조합원의 자유로운 가입과 탈퇴의 원칙과 함께 정치, 종교, 사회적 이유로 가입을 제한하거나 탈퇴를 강요해서는 안되다고 말하고 있다. 그래서인지 그 책에서는 open membership 만을 보여주고 있어서 제한적 조합원 가입에 대한 부분을 인터넷으로 찾아보았다.


2017/04/30 - [우리안의 페르소나/바람 칼럼] - 서평 "협동조합 참 좋다", 제목이 모든 것을 말해주는 입문서


제한적 조합원 가입에 대한 내용을 찾은 이유는 첫째, 개방조합원제(open membership)에서 발생할 수 있는 정체성 왜곡과 영리기업화의 위험요소가 있기 때문이다. 쉽게 말해 5명의 조합원으로 시작한 협동조합이 잘 되고 있다고 판단한 누군가가 10명의 인원을 동원하여 그들을 조합원으로 가입시키면서 그 협동조합을 자기 구미에 맞게 얼마든지 바꾸고 변형시킬 수 있기 때문이다. 


협동조합의 초기에는 고생을 함께 하면서 상호신뢰를 기반으로 하는 사람들로 시작하게 될 것이다. 하지만 성장과 함께 협동조합을 찾는 사람들은 편함이라는 열매에만 관심을 가질 수 있고, 더 나아가서 황금알을 낳는 거위를 자신의 것으로 만들겠다는 사악(?)한 마음을 품을 수도 있다. 전자, 즉 어느정도의 편리성을 보고 협동조합에 함께 하겠다는 이들은 얼마든지 환영할 수 있고, 함께 해 나갈 수 있겠지만 후자, 공동체의 이익보다는 자신과 자신이 속한 조직의 배타적 탐욕을 채우려는 이들이 있다면 그 부분에 대해서 미리 어느정도의 예비책 혹은 장치가 준비되어 있어야 한다. 주식회사라면 50%의 주식을 소유함으로 기업의 경영권을 방어할 수 있겠지만 협동조합은 그 부분이 약하다. 상호신뢰를 기반으로 한 경영과 기업활동은 큰 시너지를 낼 수도 있지만 잘못 사용되면 낭패로 돌아올 수도 있다. 그래서 이 부분, closed membership 에 관심을 가지게 되었다.


협동조합은 이용자 소유회사로 조합원의 동질성을 유지하기 위해 조합원의 가입 자격을 제한할 수 있다. 이는 조합원의 자유로운 가입과 탈퇴 원칙과 상충되지는 않는다. 협동조합의 유형에 따라 개방형 조합원제가 어울리기도 하고 때로는 제한 조합원제가 어울릴 수도 있다. 이를테면 부가가치 투자와 차별화 전략을 추구하는 협동조합의 경우, 사업을 이용하지 않는 휴면 조합원 - 직업변경, 은퇴, 거주지이전 등 - 의 증가는 곧 외부 투자자에게 그들의 권리를 양도함으로 소유권과 통제권을 행사할 수 있게 하고, 결국 협동조합의 운영을 왜곡되게 할 수 있다.


농협의 경우 지역농협의 조합원에 대해 주소, 거주, 사업장이 있는 농업인으로 자격을 제한하고, 농업인의 범위를 대통령령으로 정하게 한다. 그리고 지역농협 이사회는 신규 조합원의 가입을 심사, 승낙하는 역할을 한다. 사업을 이용하지 않는 조합원에 대한 탈퇴 조치는 지역농협의 총회에서 결정된다.


코딩교육에 관한 협동조합을 만든다면 이 부분을 주목해 보아야 할 것이다. 어느 정도의 규모가 되기 전까지는 open membership 보다는 closed membership 이 필요하다. 충분히 조합원의 숫자가 커진다면 그때 open membership 으로 전환한다. 이 전환의 시점은 조합 총회에서 결정하게 한다.




Comment +0



협동조합을 알고 싶어서 스터디를 만들었고, 지원센터에서 책을 소개 받았고, 그래서 첫번째로 선택되어 읽은 책이 "협동조합 참 좋다"이다. 이 책에 대한 간단한 서평을 써보았다. 내용은 첫째 입문서로는 그럭저럭 쉽게 잘 읽히는 책이라는 점이고, 둘째 깊이 있게 협동조합을 알기에는 부족하다는 것이다. 그래도 처음 입문하는 입장에서는 쉽게 전체를 죽 살펴볼 수 있는 점에서는 좋게 볼 수 있겠다.

단, 이 책 한권만 읽고 협동조합을 다 아는 걸로 착각해서는 안된다. ^^


이전에 썼던 글의 연장선에서 스터디 첫번째 책이었던 "협동조합 참 좋다"에 대한 간략한 소개정도의 글이다.


2017/04/28 - [우리안의 페르소나/Etc] - 협동조합으로 코딩교육이 가능할까?


"협동조합 참 좋다"는 예스24에서 이북으로 구입한 협동조합 스터디의 첫번째 책이다. 이북을 구입하기보다는 종이책을 선호하지만 스터디의 급한 일정으로 그자리에서 바로 책의 구입이 필요했고, 다행하게도 이 책은 이북으로 판매되고 있었다. 가격이 조금 더 저렴해도 될텐데 이북주제(?)에 종이책과 별로 차이가 없었다. 그래서 구입하면서 안타까웠다. 종이책을 사면 이북이 같이 지원되면 얼마나 좋을까.


협동조합에 대해서 잘 모르는 사람들로 이루어진 스터디를 시작했다. 대부분 책을 잘 읽고, 강의도 하는 사람들이라 스터디나 토론을 하는 일에는 그다지 어려움이 없는 사람들이다. 그래서 모임에서 책에 대해서 내린 결론은 "처음 시작하는 사람들이 읽어볼 수 있는 기초 입문서"였다.


협동조합을 시작하려는 사람이라면 여러권의 책을 읽어볼 것이다. 이 책은 그 중 첫번째 입문용으로 적당하다. 협동조합에 대한 기초상식, 기본원리를 알려주고 해외 사례로 성공적인 케이스를 알려준다.


저자가 해외 성공 케이스들을 소개한 내용은 괜찮았지만 이 책에서 아쉬운 것은 전문적인 시각이 아닌 기자의 시각으로 사례들을 소개하다보니 협동조합에 대한 깊이 있는 접근이나 고민의 깊이가 부족한 것이다. 어쩌면 처음 시작하는 단계에서 자료를 모으면서 쓴 책이라 이런 깊이 있는 내용을 담는 것은 불가능했을 것이라고 추측해본다. 그래서 이 책은 한권으로 협동조합의 모든 것을 알수는 없고, 사실 한권으로 협동조합의 모든 것을 알려줄 수 있는 그런 책은 존재하지 않는다. 그래서 이 책은 협동조합에 관한 입문서로 적당하다.


단, 입문서로 필요한 한가지 내용이 빠져있는데, 이후에 읽어볼만한 책, 협동조합을 시작하려는 사람들을 위한 조금 더 깊이 있는 책들의 목록이 없다. 이 책이 나온 시기를 고려해보면 이해가 된다. 협동조합이 아직 국내에 제대로 소개되지 않은 시점에서나온 책이었으니 다른 소개할만한 참고서적들을 찾기가 힘들었을 게다.


원주지역의 협동조합과 생협을 소개한다. 농협은 협동조합이지만 협동조합으로 의식하지 못하고 금융권으로 기득권만을 챙기고 있다는 지적도 따끔하다. 이 부분들은 협동조합의 고민하는 독자에게 한번 더 심사숙고하게 한다. 아직 한국에서 협동조합은 기업생태계의 큰 부분을 차지하지 못하고 있다. 그래서 이런 현실적 어려움은 시작하려는 사람들에게 협동조합이 아직은 힘들고 어려운 부분이 많다는 것을 알려준다.


협동조합을 시작하기 위해서는 깊이 있는 스터디와 상당한 고민이 필요하다. 한국 협동조합은 넘어야 할 산이 많고, 시작하려는 이들에게도 각오해야 할 문제들이 쌓여있다. 이 책을 읽으며 느낀 점이다. 막연한 기대감과 희망 이면의 현실과 부대낄 각오가 필요하다.





Comment +0



최근들어 협동조합이라는 주제의 스터디를 시작했다.

"협동조합, 참 좋다" 라는 책으로 첫 스터디를 진행했다.

조금 실망이다. 책의 내용은 제목에서 벗어나지 않는다. 전체의 내용은 협동조합이 좋다는 내용이다. 책은 참고로만 하고 인터넷에서 자료를 찾아보았다.


내게는 협동조합이라는 기업의 형태가 코딩교육을 담아내기에 적합한지 여부가 중요하다. 


협동조합에 대한 정의는 다음의 세가지 정도로 요약된다.


  1. 재화 또는 용역의 구매 · 생산 · 판매 · 제공 등을 협동으로 영위함으로써 조합원의 권익을 향상하고 지역사회에 공헌하는 사업조직
    (협동조합기본법 제2조 제1호)

  2. 공동으로 소유되고 민주적으로 운영되는 사업체를 통하여 공통의 경제적, 사회적, 문화적 필요와 욕구를 충족시키고자 하는 사람들이 자발적으로 결성한 자율적인 조직(국제협동조합연맹(ICA))

  3. 용자가 소유하고 이용자가 통제하며 이용규모를 기준으로 이익을 배분하는 사업체(미국 농무성(USDA))


협동조합의 7대 원칙은 다음과 같다.


1. 자발적이고 개방적인 조합원 제도


2. 조합원에 의한 민주적 관리


3. 조합원의 경제적 참여

협동조합의 자본은 공정하게 조성되고 민주적으로 통제

자본금의 일부는 조합의 공동재산이며, 출자배당이 있는 경우에 조합원은 출자액에 따라 제한된 배당금을 받음

잉여금은

(1)협동조합의 발전을 위해 일부는 배당하지 않고 유보금으로 적립

(2)사업이용 실적에 비례한 편익제공

(3)여타 협동조합 활동 지원 등에 배분


4. 자율과 독립


5. 교육, 훈련 및 정보 제공


6. 협동조합 간의 협동


7. 지역사회에 대한 기여



과연 이런 협동조합으로 코딩교육이 가능할까? 못할것은 없겠지만 솔직한 심정으로 과연 다른 형태의 기업활동에 비해 더 나을지 확신이 서지 않는다.

가깝게 이미 협동조합을 하고 있는 사람들을 봐도 오히려 힘들어하는 사람들이 많고, 나아가 엔지니어들의 협동조합을 만들려고 하지만 서로가 가진 것을 제대로 오픈하지 않고 이미 가지고 있는 것에 플러스 알파를 원하는 경우를 종종 보게 된다.


결국 어떤 식으로 기업활동을 하건 중요한 것은 "사람"이라는 생각을 하게 된다. 충분히 믿고, 서로 신뢰할 수 있는 그런 사람을 만나야 등을 맡길 수 있다.

어떻게 회사를 만들 것인가보다 먼저 할 일은 함께 할 "사람"을 만나는 것이다.




Comment +0

드디어 책이 나왔습니다.

시중에 많이 나와있는 아두이노 책들과는 조금 다르게 쓰려고 노력했습니다.

한번 봐 주세요. ^^

http://www.yes24.com/24/Goods/38002956?Acode=101




Comment +0

경계를 만들어서 스스로를 가두지 않는다면 가려는 방향엔 왠만하면 길은 있다.


사진을 클릭하시면 기사로 이동합니다.


블로터에 재미있는 글이 떴다. 고등학생이 "머신러닝"으로 "의학"관련 연구를 한다는 글이다.


고등학생으로 스탠포드 온라인 고등학교를 선택했다. 물론 들어가기가 쉬운 곳은 아니다. 미국의 교육이 평균적으로 많이 떨어져있는 것을 고려해서 고등학교 중 일부를 영재들이 공부할 수 있는 곳으로 만들었다. 그 중 하나가 스탠포드 온라인 고등학교다. 온라인으로 진행되기 때문에 한국에서도 입학할 수 있다. 영어로 의사소통이 가능하고, 수업을 따라갈 수 있으면 말이다.

김가은 학생은 한국에서 홈스쿨을 하면서 미국 스탠포드 대학이 진행하는 영재 고교과정을 이수하고 있는 셈이다. 

머신러닝으로 의학을 연구한다는 것을 보면서 '아!'하는 환호성이 나왔다. 사실 Bio 쪽 자료들은 온라인으로 상당히 많이 공개된 부분이다. 그래서 프로그램만 어느정도 가능하고, 수학적 지식만 있다면 누구라도 집에서 인터넷에 연결된 PC 에서 연구를 진행할 수 있다. 대학원에서 했던 연구가 DNA 분석쪽이었고, 모든 프로그램은 오픈소스에 자료는 공개되 있는 DNA 지도였다. 여기에 약간의 인공지능이 가미된 프로그램을 할 수 있다면 고등학생이라도 충분히 가능하다.


코딩교육을 어린 아이들에게 가르치려고 준비하면서 최종적으로는 인공지능(머신러닝)과 빅데이터를 포함시키려고 준비하고 있다. 김가은 학생은 누구의 도움도 받지 않고 거기까서 혼자서 해냈다. 대단하다. 아무도 가르쳐주지 않은 것을 하나씩 하다보니 거기까지 갔다고 말한다. 


코딩이라는 것은 단순한 프로그램언어를 사용하는 것이 아니다. 사실 영상분석이나 DNA 시퀀스 분석은 프로그래머의 영역이 아니다. 프로그램을 할 수 있는 과학자, 공학자, 기술자의 몫이다. 

스스로의 힘으로 거기까지 간 학생의 보며 이런 생각이 들었다. 


"경계를 만들어서 스스로를 가두지 않는다면 가려는 방향엔 왠만하면 길은 있다."




Comment +0

누구나 사용할 수 있는 쉬운 코딩방법이 나오고 있습니다. 미래엔 일반인들이 코딩을 하게 될 것입니다. 더이상 코딩은 전문가들의 소유가 아니게 됩니다.


쉬운 프로그랭 툴들

프로그램 언어들은 계속해서 일반인들이 접하기에 쉬운 방향으로 만들어지고 있습니다. 스크래치는 아동용 장난감처럼 취급되긴 하지만 프로그램 언어의 기본내용을 모두 담고 있습니다. 앱인벤터는 잘 활용하면 상업용 프로그램을 만들수 있습니다. CODE.ORG 에서는 고등학생을 위한 자바스크립트 강의를 진행하면서 블럭형 프로그램을 사용할 수 있도록 하고 있습니다. python 도 참 쉬운 프로그램 언어입니다.


아마도 자바스크립트로 프로그램을 짜봤던 분들은 텍스트에디터에서 작업하는걸 당연하게 여길 겁니다. 그런데 CODE.ORG 에서는 이 부분을 블럭으로 대체해서 사용할 수 있게 해두었습니다. 구글의 blocky 라는 오픈소스를 사용해서 만들었다고 합니다.



물론 개발용은 아닙니다. 교육용입니다. 간단한 프로그램을 자바스크립트 블럭으로 만들고 그자리에서 바로 스마트폰으로 실행시킬 수 있습니다. 놀랍지 않습니까?

코딩은 누구나 할 수 있게 쉬워졌고, 많은 개발 도구들은 공개되었습니다. 나이와 상관없이, 경제력과도 무관하게 누구나 코딩을 배울수 있어야 합니다. 유튜브에는 이와 관련된 많은 동영상들이 올라와 있습니다. 무엇인가를 배우려고 마음만 먹는다면 얼마든지 가능한 시대가 되었습니다. 저도 직접 만든 아두이노 동영상강의를 유튜브에 올리고 있습니다. 이런 공개된 자료들을 잘 이용하면 누구라도 코딩을 익힐 수 있습니다.

Comment +0

가까운 미래엔 인공지능을 사용하게 될 것이다. 그리고 그 인공지능을 어떻게 사용하는가가 중요하게 될 것이다.


10년 후 미래엔 누구나 인공지능을 다룰 수 있을겁니다. 

다음은 테크M 28호에 나온 기사의 일부입니다.

국내 각 분야에 종사하고 있는 전문가들은 10년 뒤 유망한 직업 1순위로 데이터 사이언티스트, 빅데이터 디자이너 등 데이터 관련 직종을 꼽고 있는 것으로 나타났다. 또 10년 후 자신의 직업에 가장 영향을 줄 요인으로 인공지능과 빅데이터를 꼽았다 – 테크M 제28호(2015년8월) 기사


기사에 있는 그래프입니다.

 


추락할 직업 VS 유망 직업

추락할 직업과 유망직업의 경계는 어떻게 판단한 것일까요? 설문은 미래사회의 핵심기술인 AI 로 인한 사회적 변화를 전망한 것입니다. 곧 사라질 직업들은 대부분 단순 반복 작업과 관련되거나 매뉴얼에 의해서 기계적으로 움직이는 직업들입니다. 누가 해도 차이가 없는 직종들이입니다. 전화상담, 단순조립, 택시 운전만 아니라 회계사, 의사, 약사, 변호사도 거의 매뉴얼에 따라 작업이 이루어집니다. 굳이 창의적일 필요가 없고, 다른 사람이 할 수 없는 특별한 기술을 필요로 하지 않습니다. 상황에 따라 다른 선택을 할 가능성이 별로 없습니다. 

10년 후 유망직종으로 꼽힌 것들은 인간과 직접적인 소통을 하는 일입니다. 예술가거나, 혹은 코딩을 하는 사람들입니다. 현재 한국 개발자 중 상당수는 시스템 구축일을 하고 있습니다. 하지만 앞으로는 인공지능, 빅데이터, 클라우드서비스를 이용해서 의미있는 결과물을 만들어내는 쪽으로 가게 될 것입니다. 


Comment +0

알파고가 이세돌을 이겼습니다. 바둑에서 인공지능이 사람을 이길것이라고는 대부분의 사람들은 예상하지 못했습니다. 그만큼 바둑은 다양한 변수를 가진 복잡한 시스템이었습니다. 그런 바둑에서 인공지능이 두각을 드러냈습니다. 이제 사람들은 궁금합니다.

로봇이 인간을 지배하는 시대가 오는건가?




코딩교육의 필요성

코딩교육이 필요할까요? 예, 필요합니다. 왜냐하면 알파고는 학습과정을 거쳐 바둑밖에 모르기 때문입니다. 알파고는 학습이 이루어져서 알아낸 답안에 대해서만 답을 할수 있습니다. 학습되지 않은 것은 답을 할 수 없습니다. 

2016년 3월 15일자 경향신문 사설의 일부를 봅시다.

세기의 대결이 끝난 이 시점에 우리가 차분히 짚어봐야 할 것이 있다. 바로 알파고 충격이 인류의 삶과 미래에 던진 질문이다. 알파고는 인공지능이 분석의 영역을 넘어 인간 직관의 영역으로까지 진입하고 있음을 생생히 보여줬다. 알파고를 계기로 인간과 기계의 관계는 루비콘강을 건넜을지 모른다. 미증유의 상황에 인류가 어떻게 대처할 것인지가 무거운 과제로 남게 됐다.

인공지능의 진보, 인공지능이 몰고 올 4차 산업혁명의 도도한 흐름을 막을 길은 없다.... 경향신문 사설 2016.03.15. 


인공지능(AI)에 대한 편견

인공지능에 대해서 사람들이 가지고 있는 편견이 있습니다. 미래를 소재로 한 영화속에서 기계가 인간을 지배하는 사회를 자주 다룹니다. 기계에 의해 인간이 양육되는 세상을 영화 매트릭스에서 보여주었습니다. 터미네이터나 매트릭스 같은 영화처럼 종말의 때에 인공지능(AI) 는 인간을 지배하는 신적 존재가 되고, 기계가 반란을 일으켜 인간을 공격한다는 내용은 알파고의 승리 소식을 들으면서 많은 사람들에게 조금 더 섬뜩하게 다가온것 같습니다.

하지만 빅데이터나 AI 를 조금이라도 직접적으로 접해본 사람들은 이러한 공포가 얼마나 부질없는지 압니다. 빅데이터와 AI 는 사람이 손으로 풀면 1년이 걸리는 두꺼운 수학문제집을 1초에 계산해낼수 있는 도구입니다. 하지만 그 방법은 인간이 AI 에게 코치해 주어야만 가능합니다. 인공지능은 스스로 학습하지 못합니다. 가르쳐야 하고, 인공지능 프로그램에게 적절하게 푸는 방식을 알려주고, 잘 풀었을때 칭찬을 해주어야 합니다. 때로는 알파고가 제대로 알아듣지 못하면 다시 새로운 방식으로 문제를 풀도록 해야 합니다. 그 과정중에 충분히 많은 데이터가 필요합니다.


알지 못하기에 두려워하다.

종종 우리는 알지 못하는 것을 두려워합니다. 그래서 거부합니다. 하지만 두려워하고 거부하는 사람은 언제까지나 그 자리에 머무를 뿐입니다. 앞으로 나갈 수 있는 사람은 지금까지 해온것을 기꺼이 포기할 수 있는 사람입니다. 

카메라에 들어가는 것이 플래시 메모리가 아닌 필름이었던 때가 있습니다. 얼마 되지 않았습니다. 카메라는 필름을 필요로 할 것이라는 생각은, 지금까지 그래왔으니 앞으로도 그럴 것이라는 생각으로 사람을 낙관적으로 만드는 대신 눈을 멀게 합니다.

Comment +0