루덴스코드 Blog

코딩교육 +28

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


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


코딩교육용 로봇 "코디"를 소개한다. 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



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

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

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


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


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


  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

250시간을 코딩을 배운 영국의 학생이 만드는 앱과 17시간 코딩을 배운 한국의 학생은 만든 프로그램은 비교가 불가하다. 우리 아이들이 수능성적만 높다고 미래가 보장되는 시절은 지났다. 모두에게 주어진 24시간을 어떻게 쓰는지 한국은 영국을 보며 배워야한다. 그리고 지금이라도 인식이 바뀌어야 한다. 사회가 바뀌어야 한다.



코딩교육에 대한 우려

코딩교육에 대해서 많은 이야기들이 오고 갑니다. 그런데 정말 우리가 코딩교육을 할 이유나 필요가 있을까요? 많은 사람들은 의아해합니다. 부정적으로 생각하는 사람도 많습니다. 개발자들은 일반적으로 코딩교육에 대해서 그다지 좋아하지 않습니다.

지금까지 한국의 학교교육은 정답은 맞추는 교육을 해왔습니다. 문제가 있으면 답이 있어야만 했습니다. 심지어 답이 없어도 이게 답이라고 말할수 있는 것이 있어야만 했고, 그걸 답이라고 적어야만 했습니다. 답이 있어서 답을 찾는다기 보다는 답이 없더라도 누군가가 답이라고 하면 답이 되었습니다. 그리고 그게 왜 답인지를 스스로에게 설득시켰습니다. 그것이 지금까지의 한국의 학교교육입니다.

프로그램교육은 이런 배경 위에서 이루어졌습니다. GW베이직을 가르치는 많은 학원들이 있었습니다. 스프레드시트와 오피스를 포함한 컴퓨터 활용 능력도 가르쳤습니다. 그리고 그것이 기술이고, 그것이 미래를 이끌어갈 능력이라고 말했습니다. 항상 문제를 내고, 그 문제를 푸는 하나의 과정을 답이라고 말했습니다. 그것을 가르쳤고, 그것을 배웠습니다.

그래서 한국의 프로그램 교육은 누군가 미리 만들어 놓은 답을 찾아가는 교육이 되고 말았습니다. 학생들은 시시해졌습니다. 발길이 뜸해진 학원은 문을 닫습니다. 해외에서는 트위터가 만들어지고, 페이스북이 만들어지고, 인스타그램이 만들어졌지만 이 조그마한 나라에서는 누군가 무엇이라도 조금 하려면 당장 대기업이 달려들어 집어 삼켜버렸습니다.

이런 코딩교육, 과연 할 필요가 있을까요? 과거의 프로그램학원들의 전철을 밟는 것은 아닐까요? 


250시간과 17시간의 차이

2016년 10월 7일자 중앙일보 기사에 이런 제목이 붙었습니다. "영국 초등생의 코딩 교육이 무서운 이유".

거기서 기자는 이렇게 말합니다. "진짜 중요한 건 코딩이 아니다"


영국 6학년 학생의 코딩교육과정을 살펴보면 이 학생은 1년동안 체계적으로 모바일 앱을 만듭니다. 사실 이전에 이미 250시간의 코딩교육을 받았습니다. 한국에서는 고작 17시간 코딩교육을 할때 영국학생들은 250시간의 코딩관련 수업을 듣습니다. 


앱을 만드는 6단계

아이가 만드는 앱은 6단계로 나뉩니다. 

첫째 앱을 기획한다. 어떤 것을 만들고 왜 만들어야 하는지 기획합니다. 

둘째, 프로젝트를 관리한다. 그룹으로 된 아이들이 스스로 누가 어떤 역할을 맡을 것인지를 정하고 각자의 할일을 결정합니다. 

셋째, 시장조사를 한다. 비슷한 앱이 어떤 것이 있는지, 우리가 만드는 앱은 기존의 앱과 어떻게 다르게 만들것인지, 차별화전략을 어떻게 할 것인지를 토론합니다. 

넷째, 앱의 메뉴와 디자인을 결정한다

다섯째 어떻게 프로그래밍을 할 것인지를 정한다. 

여섯째 앱을 시장에 퍼뜨릴수 있는 마케팅방법을 정한다.


앱 만들기는 단계별로 6주동안 진행됩니다. 영국 아이들에게 코딩교육은 단순한 앱만들기같은 소프트웨어 프로그래밍 교육 이상입니다. 왜 이 앱이 필요한지, 어떻게하면 사람들에게 도움이 되는 앱을 만들수 있는지, 사람들이 원하는 것이 무엇인지를 스스로 고민하면서 찾을 수 있는 힘을 기르게 합니다. 함께 사는 사회, 시장의 모습, 자신의 장점, 타인의 장점, 협업과 책임의식을 자연스럽게 익히게 합니다.


코딩교육은 읽기, 쓰기, 셈하기와 동급

지금은 4차 산업혁명의 시대입니다. 코딩이 읽기, 쓰기, 셈하기와 같은 비중을 가지게 될 것입니다. 이 시대에 살아갈 아이들에게 필요한 것은 스스로 생각하고, 찾아내고, 만들어 낼 수 있는 지극히 현실적인 코딩교육입니다. 

우리 코딩교육은 과연 이런 질문을 던지고 스스로 답을 찾기 위해 노력하고 있는가 고민해봅니다. 여전히 앞에서 가르쳐주는 답을 이해하고 그것에 자신의 생각을 끼어맞추기 위해 애를 쓰는 코딩교육이라면 곤란합니다.


코딩은 수학과 같다.

“산업혁명의 동력은 수학이었다. 4차 산업혁명에선 코딩이 수학과 같은 역할을 할 것이다.” 영국의 교육부 장관이 초,중,고교에 코딩 공교육을 도입하던 2014년에 한 말입니다. 미국, 영국, 프랑스등은 이미 빠르게 움직이고 있고, 일본뿐만 아니라 중국도 우리보다 훨씬 일찍 코딩을 가르치고 있습니다. 한국의 초,중등 학생들은 이제 스크래치를 가지고 놀고, 스크래치와 비슷하게 생긴 국내용 소프트웨어를 만들어내고 있을때 중국 아이들이 앱인벤터로 스마트폰 앱을 만들고 있다. 


이제까지의 질서는 빠르게 바뀌고 있습니다. 새로운 질서가 그 자리를 차지하고 있습니다. 


Comment +0

한국학생만큼 힘들게 살아가고 있는 학생이 얼마나 있을까? 한국학생은 위기다. 그래서 한국은 위기다.



코딩교육을 이야기할때 비싼 사교육장이 또 등장하는 것이 아닌가라는 우려를 하시는 분들을 만난다. 강남을 포함해서 교육에 신경을 많이 쓰는 곳은 몇백만원짜리 코딩캠프가 열리는 것을 지면을 통해 본다. 


코딩교육이 비싼 사교육이 되어서는 안된다. 개성이나 취향을 무시하는 것이 성공을 위한 당연한 과정으로 여기는 현실은 안타깝다. 세바시 19회에 나왔던 이범의 "한국학생의 3대 공부 위기" 동영상이다. 코딩교육에 대한 내용은 없다. 하지만 교육을 크게 바라보는 좋은 시각을 제시해준다.




그가 말하는 공부의 3박자는 소개하는데 {동기, 기술, 노력}이다. 일반적으로 말하는 공부잘하는 첫번째 방법은 노력이다. 즉, 얼마나 시간투자를 하는가이다. 하지만 OECD 최고의 공부시간을 가지고도 그만큼 좋은 효과를 만들어내지 못하는 것이 현실이다. 대학까지 마친 학생들은 기업에서 원하는 인재가 되지 못한다는 것도 현실이다. 기업 인사담당자들에게 지원자들의 대학 학점과 스펙은 더이상 중요하지 않다. 왜냐하면 그것으로 신입사원을 뽑았더니 결과가 신통치 않았다는 경험때문이다.



한 학생이 일주일에 공부하는 시간은 미국이 32시간, 일본이 33시간, 핀란드가 30시간, 한국은 탁월하게 50시간이다. 이 숫자는 일주일에 공부하는 시간이다. 가장 많은 시간을 들여 공부하는 한국학생들의 학업에 대한 성취도는 많이 떨어지다. 공부하는 환경이 좋아졌다고 하지만 정작 공부의 기술은 20-30년전 기성세대들의 것보다 수동적이다. 학생들의 문제가 아니라 수동적으로 될수 밖에 없게 만든 시스템의 문제이다. 


예전엔 단어장, 계획표, 노트정리등을 하면서 공부했다. 지금 학원을 다니는 학생들은 강사가 시키는 대로 해야 한다. 자신이 스스로 계획을 세우는 것을 금지당한다. 


초등학생들은 선행학습을 하고, 학기중에 학교에서 다시 배우고, 한번 더 학원에서 진도를 나가고, 4번째로 중간고사와 기말고사 직전에 정리학습을 한다. 즉, 학생 개인의 힘으로 아무것도 하지 않고 수동적으로 4번 반복하게 된다. 아이들은 스스로 공부하는 근육을 기르지 못한다. 


자기주도학습과 학원주도학습사이에서 더 중요한 것은 자기주도학습이다. 코딩교육도 누군가가 정해주기 때문에 하는 것이 아니라 스스로 재미있고 즐거워서 할 수 있는 어떤 것이 되어야 한다.


코딩교육이 수능에 포함되는 순간 더 이상 창의적인 개발자는 한국에서 씨가 말라버릴 수 있다. 배우되, 시험이나 성적과 무관해야 한다. 가르치되 표준화된 교안에 얽매이지 않아야 한다. 지금의 시험문제에 프로그램방법론의 일부가 포함되어서는 안된다. 틀린부분을 찾는 교육은 할 수 있지만 개성있고 재미있고 놀랄만한 프로그램은 측정할 수 없다. 



Comment +0


4차 산업혁명이 다가오니까 코딩교육을 해야 한다는 말은 틀립니다. 만약 그 말이 맞다면 우리의 자녀들은 갑갑한 세상에서 살아야 합니다. 기계에 맞춰서 공부하고, 기계에 맞춰서 살아야 합니다. 인간이 기계의 부속품이 되는 것입니다. 찰리채플린 영화 모던타임즈가 생각나는군요. 


4차 산업혁명은 지금까지의 세상과는 많이 다를 거라는 의미로 붙여진 이름입니다. 이 말은 2016년 다보스포럼에서 처음 언급됩니다. 물론 그 이전에 4차산업혁명이라는 말이 나오기까지 산업에 상당히 큰 변화가 있었습니다. 


인간은 기계의 부속품?

과학기술이 전체의 큰 비중을 차지했습니다. 증기기관으로 대표되는 산업혁명을 1차 산업혁명이라 부릅니다. 전기가 발명되고 시작된 대량 생산 시스템을 2차 산업혁명이라고 부르고, 컴퓨터 제어를 통한 생산자동화 시스템을 3차 산업혁명으로 부릅니다. 그리고 4차 산업혁명은 이 세번째 산업혁명의 이후에 나오는 빅데이터와 인공지능이 결합되면서 기존의 제어를 인간이 직접하지 않고 컴퓨터가 알아서 판단하는 방식에 따른 것입니다. 물론 그렇다고 영화나 만화속에서 보이는 정도의 암울한 미래를 생각하지는 마세요. 4차 산업혁명에서의 기계의 움직임은 더 이상 인간의 "직접적인" 명령에 따르지 않고 주어진 상황을 스스로 분석(AI)해서 어떤 행동을 하게 되지만, 그런 행동을 하게 되는 이유는 인간이 기계에게 시킨 "학습" 때문입니다. 


인간이 할 일은 기계를 가르치는 일!

조금 더 쉽게 말하면 기계가 알아서 모든 것을 판단하는 것이 아니라, 판단의 기준과 법칙을 인간이 기계(컴퓨터)에게 주면 그것에 따라서 기계가 학습을 합니다. 그래서 머신러닝(ML)이라고 부릅니다. 평가기준을 인간이 주고, 그에 따른 학습을 통해 기계는 최적의 행동을 하게 됩니다. 평가기준을 기계가 스스로 만드는 것이 아닙니다. 인간이 직접명령을 주지는 않지만, 학습 방법을 기계에 알려줍니다. 


회사에 신입사원이 들어오면 고참이 교육을 시키는 것과 비슷합니다. 처음에는 아무것도 몰라서 이것 저것 구체적으로 지시를 할 겁니다. '저기서 볼트를 오른쪽으로 세바퀴 돌려라. 그 다음 왼쪽 두번째 버튼을 눌러라.' 이런 식으로 말이죠. 그러다가 어느정도 알게 되면 추상적인 명령을 합니다. '두번째 기계를 작동시켜라'. 마지막으로 충분한 학습이 이뤄지면 이렇게 말합니다. '내일은 니가 알아서 해라'.


아무것도 모르는 신입사원이 그렇게 되기까지 '학습'이 있었던 겁니다. 그 학습의 결과로 이 신입사원은 경력기술자가 되는 것이죠. 기계학습도 비슷합니다. 이렇게 잘하고 못하고를 사람이 판단해 주어야 합니다. 그리고 그 결과를 가지고 기계는 조금씩 깨달아갑니다. 어떻게 해야 칭찬을 받을 수 있는지 말이죠. 칭찬을 많이 받을 수 있는 선택을 하는 것, 그것이 바로 ML 입니다. 


10년후 직업 중 65% 는 아직 만들어지지 않았다.

7세 아이가 사회에서 직업을 가질 나이가 되면 선택할 수 있는 직업 중 65%는 지금은 존재하지 않는 직업일 것이라고 말합니다. 2016년까지의 인재는 뛰어난 기억력을 가진 사람입니다. 머리 속에서 기억하고 있는 정보를 빨리 꺼내서 사용할 수 있는 사람이 인재입니다. 대표적으로 의사와 법조인들이죠. 하지만 앞으로는 이러한 기억들은 보조 장치들에 의존하게 될 겁니다. 프로기사들의 16만개의 기보를 기억하고 그것으로 학습하는 것을 기계는 단 5주만에 해냈습니다. 알파고와 같은 보조 장치들이 활용되면 더 이상 인간의 뇌로 하는 저장과 기억에 대한 것은 큰 차이가 없어집니다. 



누구든 말을 하면 바로 통역기가 통역을 해 주는 시대가 눈 앞에 왔습니다. 

이미 영어와 일본어 통역기는 시제품으로 나왔습니다. 한국어와 영어도 아주 빠른 시간안에 번역, 통역을 해주는 제품이 나올 겁니다. 법전을 뒤지거나 의학 전문 서적과 논문을 뒤지는 것이 도서관이 아니라 손에 있는 휴대폰이나 시계로 바로 가능하게 될 겁니다. 기억하는 것이 더 이상 중요하지 않은 시대가 오고 있습니다.


그러면 무엇이 중요할까요? 컴퓨터가 기억하게 하고, 인간은 그 저장된 기억을 인간을 위해서 사용하면 됩니다. 

창조적으로, 그리고 공동체적으로 말이죠. 암기가 아니라 창의적인 사람이 인재가 됩니다. 소통과 협동을 통해 서로의 장점을 키워갈 수 있는 사람, 이런 사람들이 앞으로 주목을 받게 될 것입니다. 코딩교육은 논리와 협동을 통해 주어진 문제를 해결하고 단계별 해법을 컴퓨터에게 위임하는 훈련으로 만들어져야 합니다. 정보를 저장하는 것은 컴퓨터가 잘 합니다. 컴퓨터의 지시를 듣고 그것을 따르는 것이 아니라 반대로 잘 기억하고 있는 컴퓨터에게 학습을 시키는 것, 그것이 인간이 문명을 진일보 하게 할 수 있는 역할입니다. 코딩교육은 이러한 일을 가능하게 할 것입니다.

Comment +0

CEA-014 아두이노 2개로 신호등 2개 연결하기

인터넷에서 "아두이노 신호등" 으로 검색해 보면 상당한 많은 자료들을 얻을 수 있습니다. 대부분 아두이노 우노에 LED 3개를 연결해서 신호등 하나를 만드는 내용입니다. 혹은 5개를 연결해서 차량용 신호등 하나와 보행자용 신호등하나를 만드는 것도 있습니다.

이 정도의 신호등은 지난시간까지 공부한 내용으로 여러분이 혼자서도 충분히 만들수 있습니다.

오늘 여러분에게 소개할 신호등은 아두이노 우노 2개를 사용해서 만들게 됩니다. 하나의 아두이노에서 LED 3개를 순차적으로 점멸시키는 것은 대부분의 신호등 프로그램과 비슷합니다. 그런데 거기에 두가지를 추가했습니다.




1. 시작시간을 초기화 하는 신호등 리셋 스위치

이 리셋스위치를 누르면 신호등의 신호는 처음으로 초기화됩니다. 초기화되서 맨 처음부터 정해진 순서대로 다시 순서대로 불이 들어옵니다.

2. 설정된 시간이 되면 작동하는 타이머

가변저항, 포텐셔미터의 값을 읽어서 1 에서 100 사이의 값으로 만듭니다. 그 값을 시간으로 계산합니다. 리셋스위치를 누른 후 정해진 시간이 지나면 다른 아두이노의 리셋스위치를 작동시킵니다.




신호등 1개는 너무 쉬워서 2개를 만들어서 연결해 보겠습니다.



그냥 막 연결하지 말고, "제대로" 연결해 봅시다. 보행자도 차를 탄 사람도 불편하지 않게 신호등 체계를 만들어 봅시다.



신호등간 신호를 주는 방식을 간단하게 고안해봤습니다. 하나의 신호등을 초기화하면 옆에 붙은 신호등이 일정한 시간간격을 두고 같이 초기화됩니다. 이 시간간격을 차량이동 예상 시간으로 만들어두면 됩니다.



3개의 아두이노를 꾸며봤습니다. 저항을 잘 보면 색띠가 있습니다. 색띠를 읽으면 저항값을 알 수 있습니다. 참고로 위에서부터 330, 330, 330, 10k, 1k 값을 가집니다. 맨 마지막 저항은 왜 들어갔을까요? 영상에서는 설명해주지 않습니다만 들어가지 않으면 안되는 저항입니다. 나중에 조금 더 아두이노를 공부한 다음에 이 저항에 대해서 설명할 기회가 되면 그때 설명하겠습니다.



Notepad++ 를 사용해서 편집합니다. 제가 주로 사용하는 텍스트에디터는 노트패드++ 입니다. 무료라서 쓰고 있지만 성능도 결코 왠만한 다른 에디터에 떨어지지 않습니다. 플러그인이 많고 다양해서 만족하면서 쓰고 있습니다. 



맨 위의 영상을 꼭 확인해보세요. 여기 전체 소스코드를 올립니다.



#define SIGNAL_RED  5

#define SIGNAL_YELLOW  6

#define SIGNAL_GREEN  7

#define TIMEPIN   A0

#define STARTSWITCH  10 // 스위치 입력

#define NEXTSIGNAL  11 // 다음 신호등 스위치 출력

#define BUTTON_ON   0

#define BUTTON_OFF  1


#define LED_RED_TIME  3000

#define LED_YELLOW_TIME  2000

#define LED_GREEN_TIME  3000



bool buttonState = 1;

bool lastButtonState = 1;

bool resetFlag = 0;

unsigned long timeValue = 0;

byte i=0;

unsigned long nowTime, oldTime;

  

void setup(){

  Serial.begin(9600);

  pinMode(SIGNAL_RED, OUTPUT);

  pinMode(SIGNAL_YELLOW, OUTPUT);

  pinMode(SIGNAL_GREEN, OUTPUT);

  pinMode(STARTSWITCH, INPUT);

  pinMode(NEXTSIGNAL, OUTPUT);

}


void loop(){

  buttonState = digitalRead(STARTSWITCH);


  if(buttonState != lastButtonState ) {

    lastButtonState = buttonState;

    delay(100);

i++;

if(i%2==1) {

signalTowerReset();

Serial.print("timeValue = ");

Serial.println(timeValue);

}

  }

  if(resetFlag) sendTimeSignal();

  ledSignalTower();

}




void signalTowerReset()

{

ledBlink3(); // 전체 신호등이 3번 깜박


resetFlag = 1;

    timeValue = map(analogRead(TIMEPIN), 0, 1023, 1, 100); // 신호등간 시간간격 [0~1023] => [0~99]

nowTime = millis();

oldTime = nowTime;

}



void sendTimeSignal(){

if((nowTime-oldTime)<timeValue*1000){

digitalWrite(NEXTSIGNAL, HIGH);

}

if(((nowTime-oldTime)>=timeValue*1000) && ((nowTime-oldTime)<(timeValue+1)*1000)) {

digitalWrite(NEXTSIGNAL, LOW);

}

if((nowTime-oldTime)>=(timeValue+1)*1000) {

digitalWrite(NEXTSIGNAL, HIGH);

resetFlag = 0;

}

}


void ledSignalTower(){

  nowTime = millis();

  if((nowTime-oldTime>=0)&&(nowTime-oldTime<LED_RED_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, LOW);

 }


  if((nowTime-oldTime>=LED_RED_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);

 for(byte i=0;i<6;i++ ){

   if((nowTime-oldTime>=LED_RED_TIME+LED_YELLOW_TIME*i/6)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME*(i+1)/6))

 {  digitalWrite(SIGNAL_YELLOW, i%2); }  

 }

  }  

 

 

  if((nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, LOW);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);  

 }

  if(nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME) oldTime = nowTime;

}


 

void ledBlink3(){

  for(int tempi=0;tempi<3;tempi++){

digitalWrite(SIGNAL_RED, 1);

digitalWrite(SIGNAL_YELLOW, 1);

digitalWrite(SIGNAL_GREEN, 1);

delay(200);

digitalWrite(SIGNAL_RED, 0);

digitalWrite(SIGNAL_YELLOW, 0);

digitalWrite(SIGNAL_GREEN, 0);

delay(200);

  }

}


Comment +0

[CEA-009~13] LED 3개를 스위치로 점멸시키기











지난 시간에 이어 3개의 LED 를 점멸시켜보겠습니다. 아두이노 우노에는 0 번에서 13번까지 총 13개의 디지털 입출력이 가능한 핀이 있습니다. 여기에 A0 에서 A5 까지 6개의 아날로그 입력 핀이 있습니다. 합치면 19개의 핀이 있고 모두 디지털입출력이 가능합니다.



3개의 LED 를 2, 3, 4번에 연결하고, 스위치는 9번에 연결합니다. 스위치를 연결할 때 주의항 내용이 있습니다. 플로팅(Floating) 상태에 두지 않기 위해서 풀업 또는 풀다운 상태를 만들어주어야 합니다.



하드웨어 연결이 끝났으면 소프트웨어를 만들어봅시다. 코딩의 시작입니다.



LED 는 초기에 켜져있다가 스위치를 누르면 LED 가 꺼지게 만들어봅시다. 



앞에서 만들어 본 코드를 조금씩 고쳐서 원하는 대로 LED 불빛이 바뀌게 해봅시다.



스위치가 눌려있는 동안 2, 3, 4 번에 연결된 LED 는 순서대로 켜지고 꺼지게 됩니다. 간단한 조건인 if 문을 사용할 수 있으면 됩니다. 변수를 하나 만들어 두고 반복할 때마다 1씩 증가하게 합니다. 1일대는 첫번째 LED를, 2일때는 두번째 LED를, 3일때는 세번째 LED를 켜고, 그 외의 다른 수(4)일때는 0이 되게 합니다.



위에서 만들었던 코드를 수정해봅시다.



% 연산은 나누고 남은 수, 나머지를 반환합니다. 그래서 i 를 계속 증가시킬때 i%3 은 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, ... 이렇게 세개 숫자를 반복해서 보내줍니다. 

여기에 버튼을 누를 때마다 LED의 빛을 하나씩 옆으로 이동하게 해봅시다. 위 소스를 실행시키면 약간 이상합니다. 그 부분을 찾아보세요.



앞에서 내준 숙제의 답입니다. 미리 보지 마시고 꼭 세번째 동영상을 보고 프로그램을 고쳐본 다음에 보세요.



답은 동영상을 확인하세요. 잘 보면 보입니다.

Comment +0

CEA-008 LED 1개 점멸하기 (하드웨어해석)


LED 를 1개 점멸시키는 회로를 구성하고 아두이노로 프로그램을 직접 짜 보았습니다. 이제 지난시간에 만들었던 회로에 대해서 조금 더 깊이있게 살펴보겠습니다. 초등학생이라면 이 부분은 건너뛰어도 됩니다. 시간은 오래 걸리지 않으니까 한번 보기는 하시구요, 잘 이해가 안되면 억지로 이해하려고 하지 마세요. LED 에 맞는 저항값을 어떻게 구하는지를 선생님께 물어보시면 선생님이 그 값을 계산해서 주실겁니다. 



영상에 나오는 사진을 몇장 첨부합니다.



LED 에 불을 켜는 프로그램과 회로를 구성했습니다. 구성한 회로가 어떤 것인지를 한번 살펴보겠습니다.



전기의 속도는 30만km/s 입니다. 1 초에 30만 km 를 간다는 뜻입니다. 빛과 속도가 같습니다. 하지만 전자의 이동 속도는 도체의 종류, 전압, 기타 환경에 따라서 많이 달라지는데 일반적으로 가정에서 사용하는 전선을 쓴다고 가정했을때 전자의 속도는 7~8mm/s 정도가 됩니다. 1 초에 7~8mm 밖에 움직이지 못합니다.  



전기가 흐를때 LED 를 통과하면서 전기에너지는 빛에너지로 바뀝니다. LED 는 전기에너지를 열에너지로 허비하는 것이 거의 없습니다. 백열등이나 형광등에서 LED 등으로 바뀌는 가장 큰 이유가 바로 효율때문입니다.



LED 는 2V 정도의 전압강하가 있습니다. 그리고 20mA 정도의 전류가 흐를때 최적의 빛을 냅니다. 물론 이 수치는 LED 마다 다릅니다. 일반적으로 20mA 는 LED 에게는 안전한 전류입니다. 이정도의 전류를 만들기 위해서 필요한 저항을 구하는 방법입니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN, 전압강하

Comment +0

CEA-007 LED 1개 점멸하기 (소프트웨어)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 지난 시간에 하드웨어 구성을 마쳤습니다. 아두이노는 하드웨어와 소프트웨어를 동시에 다룰 수 있어야 합니다. 하드웨어가 어떻게 구성되었는지 모른다면 소프트웨어를 만들 수 없습니다.



영상에 나오는 사진을 몇장 첨부합니다.



LED 점멸하는 소프트웨어입니다. 기본 소스는 다음과 같습니다. 


void setup() {

  pinMode(12, OUTPUT);

}


void loop() {

  digitalWrite(12,0);

  delay(100);

  digitalWrite(12,1);

  delay(100);

}


12는 LED 가 연결된 아두이노의 핀번호 이고, 1 은 그 핀으로 전기가 흐른다(5V 출력)는 것, 0 은 그 핀으로 전기가 흐르지 않는다(0V 출력)는 것을 의미합니다.



예제에 나오는 LED_BUILTIN 은 13을 의미합니다. LED_BUILTIN 이 사용된 장소를 위 그림에 담았습니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN

Comment +0

CEA-006 LED 1개 점멸하기 (하드웨어 구성)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 아직 정식으로 C 언어를 공부한 것이 아니라서 많은 부분을 설명하지는 못합니다. 하지만 우선은 그냥 따라서 해보는 것이 중요합니다.




해보면 생각보다 그렇게 어렵지도 복잡하지도 않습니다. 단지 아직 모를뿐이지요.


제대로 프로그래밍 언어를 공부하려면 시간도 걸리고 어려움이 있겠지만 아두이노를 가지고 사용하기 위해 프로그램을 익한다면 시간도 그렇고 오래걸리지는 않습니다. 당신이 조금만 똑똑하면 한주일이면 가능하고, 조금 명석한 편이 아니라면 3주일이면 됩니다. 


영상에 나오는 사진을 몇장 첨부합니다.



기본 예제에 나오는 LED Blink 프로그램을 살펴봅시다.



LED 를 사용할 때 극성에 주의하셔야 합니다. 내부를 잘 보면 굵은 쪽이 있습니다. 그 쪽에 - 또는 GND 쪽을 연결합니다.



실제 회로를 기호로 그린 그림입니다. LED 와 저항 330 또는 220 옴을 연결해주면 됩니다.



아두이노에서 LED 에 불을 켜 봅시다.


태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 키트, 부품

Comment +0

CEA-005 아두이노 IDE 보드 업데이트, 라이브러리 설치와 업데이트 



지난 시간에 아두이노 IDE 를 설치했습니다. 그리고 BLINK 라는 첫번째 예제 프로그램을 실행해 봤습니다. 이제 본격적으로 아두이노를 사용해서 프로그램을 해보는 시간이 되었습니다.


그런데 혹시나 예전에 아두이노 IDE 를 설치하셨던 분이 계시면 최신버젼으로 업데이트를 해주는 것이 필요합니다. 보드가 변경되거나 혹은 보드에 더 잘 맞는 펌웨어가 나오거나 할때마다 개개인이 알아서 이 부분을 고쳐주는 것은 쉽지 않습니다. 사실 아두이노 이전에는 그렇게 했습니다. 무엇인가 변경이 되면 플로피디스크나 CD 를 넣고, 펌웨어 업데이트를 했습니다. 하는 방법도 쉽지 않았습니다. 하다가 잘못되면 하드웨어가 망가지기도 했습니다.


아두이노는 전문가들을 위해서 세부적으로 조작 가능한 개발환경을 제공하는 대신에 일반인들을 대상으로 쉽고 편하게 개발할 수 있도록 한다는 철학이 있습니다. 그래서 아두이노 IDE 프로그램을 관리하는 곳에서 일괄적으로 클릭 한두번으로 보드 업데이트, 라이브러리 설치, 라이브러리 업데이트가 가능하게 해두었습니다.




본격적으로 프로그램에 들어가기 전에 라이브러리 설치와 업데이트, 보드 업데이트 방법을 익혀보겠습니다.



태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, 업데이트, 라이브러리, 보드

Comment +0

CEA-004 아두이노 IDE 설치와 첫 프로그램 


아두이노 IDE 를 설치해 봅시다. 그리고 첫번째 프로그램을 실행해보겠습니다.



STEP 1. 아두이노 홈페이지에 방문해서 아두이노 프로그램(IDE)을 다운받습니다.


홈페이지 주소 : http://www.arduino.cc/

다운받을 프로그램 : https://www.arduino.cc/en/Main/Software



저 주소로 접속하면 다운받을 프로그램의 링크가 다시 나옵니다. 영어를 읽을 수 있으면 읽어서 그대로 따라하시면 됩니다. 아니면 아래에 있는 링크를 따라갑시다


STEP 2. 다운받은 프로그램을 PC 에 설치합니다.


STEP 3. 아두이노와 PCUSB 케이블로 연결합니다.


STEP 4. 설치된 아이콘을 더블클릭하면 IDE 가 실행됩니다.


STEP 5. IDE 내부에서 보드와 포트를 설정합니다.


아두이노 IDE 를 실행시킨 상태에서 [파일]-[예제]-[01.Basics]-[Blink] 를 선택해서 클릭합니다. 


제 아두이노 우노보드를 잘 보면 1초 간격으로 LED 가 깜박이는 것을 볼 수 있습니다.

 

 

 



 




태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, blink

Comment +0

CEA-003 아두이노 기본프로그램과 실습 준비물



아두이노 공부를 위해 필요한 기본 준비물들을 소개합니다.


지난 시간에 만들었던 아두이노 우노와 소형브레드보드를 올린 상자를 사용하겠습니다. 상자안에는 필요한 부품들을 보관할 수 있습니다. 상자만드는 법은 이전 동영상을 보시고 따라하시면 됩니다.


아두이노 우노, 브레드 보드와 함께 다음의 부품들을 준비하셔서 간단한 실습을 진행하면서 아두이노를 학습할 수 있습니다. 물론 아두이노를 공부하는 것은 단지 공부를 위한 것이 아니라 해결하기 원하는 문제를 해결할 수 있는 수단을 갖는 것입니다. .


다음 준비물을 준비합시다.



1. 아두이노 우노 + USB  케이블

2. 브레드보드


3. 저항 220, 330, 1k, 2k, 10k 각 20개씩

4. LED 10개

5. 택트스위치 4개

6. 점퍼와이어 혹은 듀폰케이블 1 set

7. 가변저항 혹은 포텐셔미터 1개

8. CDS 센서

9. 초음파센서


10. 이더넷실드 (+ LAN 케이블)

11. 9-12V 어댑터

12. 인터넷 공유기 (가정에서 사용하고 있는 것)



이 외에도 여러가지 센서들과 액츄에이터가 있습니다. 그 부분은 기초과정을 마치고 난 다음에 기회를 보아서 설명하도록 하겠습니다.



아두이노 우노와 브레드보드입니다. 빈 상자에 붙여두었습니다. 작고 휴대가 간편하게 구축한 개발환경입니다. 



필요한 부품들 중 저항의 모습입니다. 220, 330, 1k, 2k, 10k 저항을 준비하시면 실습뿐만 아니라 앞으로 사용하는데 큰 지장이 없습니다. 



중앙 아래에 있는 CDS 센서는 빛의 밝기를 감지하는 센서입니다. 오른쪽에 있는 가변저항은 포텐셔미터로 불립니다. 생긴 모양은 다양하게 있습니다. 브레드보드에 꼽아서 사용하기 편한 타입으로 저렴한 것을 구하시면 됩니다. 가변저항은 10k오옴까지 변할 수 있을 것을 구합니다. 위에 있는 것은 초음파센서입니다. 왼쪽에 있는 스위치는 택트스위치입니다.



LED 의 종류는 다양합니다. 용도에 따라 맞는 것을 사용하면 됩니다. 왼쪽 빨간색 LED 를 보시면 원통형으로 지름 3mm 짜리가 있고 그 옆에 원통형 5mm 와 2x5mm 짜리 사각 LED 가 있습니다. 저렴하면서 신호확인용으로 가장 많이 사용되는 종류입니다. 밝은 빛을 필요로 하는 플래시를 만드는 것이 아니라면 이 세 종류 중 하나를 사용하면 됩니다. 개인적으로 2x5mm 짜리 사각 LED 를 좋아합니다. 2mm 짜리라서 여러개를 일렬로 늘어놓기 좋습니다. 만능기판이나 브레드보드에 사용하기도 좋습니다.



점퍼선 혹은 듀폰케이블이라고 불리는 케이블입니다. 3가지 종류가 있습니다. 일반적으로 가장 많이 쓰이는 것이 가장 오른쪽에 있는 양쪽이 M-M 타입인 케이블입니다. 하지만 센서를 사용할 때 M-F 타입이나 F-F 타입도 있으면 유용하게 사용됩니다. 이 세 종류를 꼭 구입하시기 바랍니다.



이더넷실드입니다. 아두이노 우노의 통신용 모듈이나 실드가 여러개 있습니다. 그 중 블루투스와 이더넷실드를 가장 많이 사용합니다. 블루투스는 스마트폰이나 다른 기기가 있어야 합니다. 하지만 이더넷실드는 그 자체로 인터넷에 바로 연결이 됩니다. IOT 를 위한 기본 통신 모듈로 이더넷실드를 사용합니다. 블루투스는 다음번에 스마트폰용 앱을 제작하면서 그때 아두이노와 블루투스로 통신하는 것을 해보겠습니다. 아두이노 프로그램을 할 수 있고, 이더넷실드까지 사용할 수있다면 블루투스 통신은 30분이면 충분히 이해할 수 있습니다. 더 필요한 것은 앱(App)개발이지요.



제가 가지고 있는 것 중에 아두이노 우노와 브레드보드를 올린 상자 두개를 사진으로 올립니다. 왼쪽처럼 조금 큰 상자를 사용하면 안에 들어갈 수 있는 것들이 많습니다. 오른쪽처럼 작은 상자를 만들면 가지고 다니기 편합니다.



모두 수납한 사진입니다.


태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 키트, 부품

Comment +0

CEA-002 arduino Paper Box


아두이노 작업환경을 만드는 동영상입니다.






준비물은 적당한 크기의 택배상자와 M2.5 볼트, 너트, 와셔입니다. 와셔는 M2.5 의 것을 써도 괜찮고 아니면 M3 의 와셔를 써도 좋습니다.










동영상을 보시면 쉽게 따라하실 수 있을겁니다. 저렴한 종이 상자로 개발환경과 부품수납공간을 만들어보세요. 



태그 : CEA, 코딩교육, 아두이노, arduino, 개발환경, 수납공간, 종이상자

Comment +1

  • 박진만 2017.10.08 22:45 신고

    멋지네요.
    저도 만들어서 공부할 때,
    수업할 때 사용해야겠네요.
    좋은 동영상 고맙습니다.

CEA-001 코딩교육 아두이노 따라잡기 시작 





확대


1. 코딩교육, 아두이노 따라잡기

2. 아두이노란?

3. 아두이노 우노 / 마시모밴지 / 오픈소스, 오픈하드웨어

4. 코딩교육 VS 프로그램교육



Comment +0