Jetson Nano Developer Kit 개봉기

지난 달에 열린 GTC에서 NVIDIA가 JETSON NANO를 발표하였습니다. 라즈베리파이만한 크기에 가격도 저렴? ($99)하고, 게다가 CUDA 코어까지 내장되어 있어, 요즘 유행하는 머신러닝 알고리즘들을 테스트 해보거나, 가지고 놀기 좋게끔 만든 보드인듯 합니다.

한국은 공식판매처가 한컴MDS로 되어 있어, 맘편하게 하나 주문해봤는데, 오늘에서야 도착했습니다. 아마 다른 분들도 다 오늘쯤 받으시겠네요.^^

패키징은 벌것 없습니다. 딸랑 종이박스 하나이고, 내용물도 메뉴얼을 제외하면 보드 하나만 들어있습니다. 흔한 USB 케이블도 없네요. 녹색 커버를 열면 아래와 같이 보드가 담겨있는 봉투가 보이고,

그 밑에 간단한 보드 메뉴얼과, 보드 받침대? 역할을 하는 종이접기류가 보이네요.

보드는 정전기 방지 봉투가 잘 포장되어 있고, 뜯어보면 많이 보셨던 JETSON NANO가 들어있습니다. 뭐 크게 감흥이 있는 건 아니고, 나노 모듈에 확장보드 형태로 되어 있습니다.

뒷면은 부품들을 배치하지 않아, 거의 평면이고, 다만 단자들이 전부다 노출되어 있는 관계로 사용하실땐 받침이나 커버가 꼭 있어야겠네요. (위에서 본 종이접기처럼….)

한쪽면에 확장 커넥터들을 몰아놨습니다. 왼쪽부터 DC어댑터 단자(5V/4A max), HDMI, DP, USB3.0 x4, Ethernet, Micro USB B (전원공급용, 5V/2A) 이고요.

보드 오른쪽은 라즈베리파이와 유사하게 확장 포트들이 배치되어 있습니다. GPIO와 POE 등. 반대쪽엔 UART, POWER SW, RESET, 카메라를 연결할 수 있는 단자가 보이고요. 여기에 라즈베리파이에 사용했던 카메라를 꼽을수 있다네요.

나노모듈을 제거하면 밑에 PCIe 확장포트가 보입니다.

여기에 아래 제품과 같은 무선랜/블루트스 카드를 꼽으면 무선 연결이 가능해집니다. 다른 용도로도 사용이 가능할 것 같고요. 다만 안테나가 비포함되어 있으니 안테나도 같이 주문해야 합니다.

나노모듈 밑에는 MicroSD 카드를 꼽을수 있습니다. JETSON 웹페이지에서 이미지를 다운로드 받아 SD카드에 굽고, 끼워서 부팅하면 됩니다.

라즈베리파이와 크기를 비교하면 가로 길이는 비슷하지만, 세로 길이가 좀 깁니다. 하지만 라즈베리파이의 경우 확장커넥터들이 오른쪽에 밀려있는 관계로 실제 조립하거나 사용할때는 나노가 좀더 편리할 수도 있겠단 생각이 듭니다.

몇가지 아쉬운 점들이 보이는데, USB C 단자를 설계해 놓고 Micro USB B 단자를 꼽아놓은 점, USB포트에 커넥터들 임시땜빵, 오디오출력이 가능함에도 오디오출력 포트가 없다는 점 등이 있네요. RTC를 위한 배터리 단자도 자리만 남겨놓고 조립은 안했네요.

뭐.. 처음 제작된 제품이니 조만간 리비전되어 나올 듯 합니다. 전원을 넣고 부팅하면 Ubuntu 설치할 때와 마찬가지로 언어선택, 키보드, 계정 생성 등의 진행절차가 나오고 완료하면 Ubuntu로 부팅이 가능합니다. Ubuntu 버전은 18.04가 설치되어 있으며, 일단 처음 설치한 후의 느낌은 라즈베리파이보단 좀더 쾌적하게 움직인다 정도 입니다.

Prusament PETG Urban Grey 필라멘트 구입

Prusa i3 MK3를 구입하고 번들로 같이 왔던 Prusament PLA Galaxy Silver 필라멘트를 사용해왔더랬습니다. 짙은 회색에 PLA 재질이라 프린트 품질도 훌륭하고 표면도 아주 괜찮았습니다만… 그럭저럭 사용하다보니 한 롤을 다 써버렸습니다.

처음에 같이 주문했던 Prusament PLA Azure Blue, Prusament PLA Lipstick Red도 있긴 했지만 색상이 상당히 튀는 색이라 나중에 특별한 넘 뽑을때나 사용하기로 하고, 일반적으로 사용할 필라멘트를 추가 주문하였습니다.

이번에 주문한 제품은 Prusament PETG Urban Grey로 밝은 회색 빛의 PETG 재질의 필라멘트입니다. PETG는 PLA 보다 강도도 뛰어나고, ABS에 비해 환경 유해물질도 나오지 않습니다. 또 프린트 중 냄새도 현저히 없는 수준이고요.

오늘 받아서 간단히 큐브를 프린트 해보았는데, 출력 중 변홍도 없고 꽤 괜찮게 나옵니다. 다만 노즐 온도가 290도, 베드 온도가 90도까지 올라가야하니 PLA 출력때보다 열기가 좀 느껴지네요. 냄새도 PLA보다 덜 납니다. 가격은 한롤 당 $28.49 정도로 저렴한 PETG보단 비싼 편이나 Prusa에서 셋팅한 값을 그대로 사용할 수 있고, 출력 품질도 보장되니 그다지 비싸게 느껴지진 않습니다.

Scratch 3.0 블로킹 블럭 만들기

확장블럭 중 블로킹 기능을 필요로 하는 블럭을 만들어야 할 필요가 있다. 예를 들면 로봇의 경우 setDistance, setRotation 등 특정 거리나 특정 각도까지 움직이고, 이때 동작이 완료될 때까지 기다려야 하는 블럭이 존재한다.

Scratch 3.0의 Extension의 경우 개발 언어는 Javascript이다. 따라서 일반 언어에서 사용하듯 while 문을 이용한 제어가 불가능하다. 만약 while 문을 사용하면 스크립트 실행 자체가 멈춰버리므로, 프로그램 자체가 멈춰버리고, 이게 길게되면 각종 브라우저에서 에러와 같이 인식한다.

이를 구현하기 위해서 Promise와 setInterval의 조합으로 해결이 가능하다. 로봇이 움직이고 있다는 신호는 로봇의 상태 정보를 통해 파악할 수 있고, 움직이는 명령을 보낸 후, 로봇의 상태 정보를 지속적으로 모니터링하여 로봇의 동작이 완료되었음을 의미하는 플래그가 셋되면 블럭의 동작을 완료하면 된다.

기존 setDistance() 함수는 다음과 같이 되어 있다.

setDistance (args) {
    const l_dist = parseInt(args.L_DIST);
    const r_dist = parseInt(args.R_DIST);

    this._peripheral.setDistance(l_dist, r_dist);
}

이제 여기에 플래그를 모니터링하고, 블럭의 동작을 완료하는 부분을 추가한다.

setDistance (args) {
    const l_dist = parseInt(args.L_DIST);
    const r_dist = parseInt(args.R_DIST);

    this._peripheral.setDistance(l_dist, r_dist);

    return new Promise(resolve => {
        var first_check = true;
        var ttt = setInterval(() => {
            if(this._peripheral.isRobotMoving == false && first_check == true) {
                first_check = false;
            }
            else if(this._peripheral.isRobotMoving == false && first_check == false) {
                resolve();
                clearInterval(ttt);
            }
        }, 100);
    });
}

이제 로봇의 연결하고 위 블럭을 실행해보면, 다음과 같이 동작이 완료될 때까지 대기함을 볼 수 있다.

워드프레스에서 카테고리 리스트 페이지 만들기

워드프레스에서 카테고리를 선택하였을 때, 해당 카테고리에 해당되는 포스트들의 리스트만 보여주는 페이지가 필요할 수 있다. 아마 찾아보면 플러그인도 있긴 할텐데, 간단히 파일 하나 정도만 생성해주면 사용자가 원하는 카테고리 페이지를 만들 수 있다.

현재 사용하고 있는 테마의 디렉토리로 이동한다.

$ cd /var/www/html/wp-content/theme/twentyseventeen

category.php 파일을 생성한다. 만약 카테고리 이름별로 페이지를 생성하고 싶다면, 원하는 카테고리 이름을 추가하여 만들어주면 된다. 예를 들어 scratch 카테고리 페이지를 만든다면, category-scratch.php를 만들어준다. 워드프레스는 해당 페이지를 읽을 때 우선순위를 두게 되는데,

category-{name}.php — category.php — archive.php — index.php

와 같은 우선순위를 두고 읽게 된다.

category.php 파일을 생성하고, 다음과 같이 입력한다. archive.php 파일에서 필요한 부분만 수정하였다.

<?php
    get_header(); ?>

<div class="wrap">
    <?php if ( have_posts() ) : ?>
        <header class="page-header">
        <?php
            the_archive_title( '<h1 class="page-title">', '</h1>' );
            the_archive_description( '<div class="taxonomy-description">', '</div>' );
        ?>
        </header><!-- .page-header -->
    <?php endif; ?>

    <div id="primary" class="content-area">
        <main id="main" class="site-main" role="main">

        <?php
        if ( have_posts() ) :
        ?>
        <?php
            /* Start the Loop */
            while ( have_posts() ) :
                    the_post(); ?>

            <div id="category-post">+ <a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
            <small><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?></small> </div>

            <?php
            endwhile;
        else :
            get_template_part( 'template-parts/post/content', 'none' );
        endif;
        ?>
        </main>
    </div>
<?php get_sidebar(); ?>
</div>

<?php
get_footer();

저장한 다음, 다시 블로그에서 카테고리를 선택하면 다음과 같이 보인다.

이때 보여지는 포스트의 수는 워드프레스의 Reading 설정에 있는 갯수를 따른다. 이를 늘려도 되지만, 그렇게 되면 첫 페이지에 보여지는 포스트의 수가 너무 늘어나게 되므로, archive 페이지에서만 보여지는 포스트의 수를 늘려주도록 한다.

마찬가지로 테마의 디렉토리에서 functions.php 파일을 열어 다음의 내용을 추가한다.

add_action( 'pre_get_posts', 'prefix_category_query' );
function prefix_category_query( $query ) {
    if( is_archive() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', '100' );
    }
}

archive 페이지의 경우에 보여지는 포스트의 수를 100개로 늘렸다. 이제 다시 카테고리를 선택해보면,

전체 포스트가 잘 보여짐을 볼 수 있다.

Scratch 3.0 업데이트

스크레치 3.0은 현재도 활발하게 업데이트가 진행 중이다. 이에 따라, 기존에 작성하였던 Extension들도 이에 맞추어 몇가지 수정해야 하는 상황이 발생한다.

scratch-gui

  • 확장카드의 이미지들의 위치가 한 디렉토리로 통일됨. 기존은 외부 연결에 사용되는 아이콘 그림의 경우 peripheral-connection에 넣었으나, 이젠 확장카드 이름의 디렉토리에 모두 넣어 사용하고 peripheral-connection 디렉토리는 사라짐.
  • 기존 외부링크로 되어 있던 리소스들이 로컬로 전환 중. 사운드, 이미지 등이 로컬 파일로 존재. 즉, 이제 인터넷 연결 없이도 원할히 사용 가능.
  • 확장카드 추가 – gdx, LEGO Boost 등

scratch-vm

  • 추가된 확장카드에 대한 소스들 추가.

scratch-l10n

  • 추가된 확장카드에 대한 언어 추가.