[go: up one dir, main page]

Google Developers 팀에서는 구글 기술을 사용한 다양한 프로젝트를 전시하고, 많은 분들이 체험해볼 수 있도록 Google HackFair 를 매년 개최해오고 있습니다. 2012년을 시작으로 올해로 5회째를 맞이하는 Google HackFair 2017에서 여러분의 기발한 아이디어를 구글 기술로 현실화시킨 독창적인 프로젝트를 기다리고 있습니다!

Logo Google Hackfair-02 (4).jpg

일시: 2017년 10월 21일(토) ~ 22일(일) 11:00 ~ 18:00
장소: 서울혁신파크


이번 Google HackFair 2017은 작년에 이어 국내 최대의 메이커 축제인 메이커 페어 서울 2017과 함께 합니다! 만드는 즐거움을 공유하는 행사인 메이커 페어 서울과 함께 여러분들의 프로젝트를 더 많은 분들에게 선보이는 기회가 되길 바랍니다.



그동안 상상만 했던 아이디어가 있으신가요? 그렇다면 이번 Google HackFair 2017에 참여해 여러분의 아이디어를 현실로 만들어 보세요. 저희 Google Developers 팀에서 여러분의 아이디어를 열렬히 응원하고 지원합니다!

페이스북 게시글 공유 이벤트!

GDG Korea 페이스북의 Google HackFair 2017 게시글을 여러분의 타임라인에 공유해 주세요. 총 20분을 선정해 Google HackFair 2017 초대권을 선물로 보내 드립니다.

- 이벤트 기간: 2017년 8월 9일(수) 08:30 - 8월 18일(금) 18:00
- 당첨자 안내: 2017년 8월 21일(월) 당첨자 개별 안내

Google HackFair 참가 신청

- 참가를 희망하는 분이나 팀은 8월 18일(금) 18시까지 참가 신청을 완료해주시기 바랍니다.
- 프로젝트 데모 영상을 9월 8일(금) 18시까지 제출하신 팀들 중 최종 참가 팀을 선정합니다. (데모 영상은 프로젝트 확인용이므로 별도의 편집은 필요없으며, 접수 방법은 참가 신청을 해주신 팀에게 별도로 안내해 드릴 예정입니다.)
- 최종 참가팀 발표는 9월 11일(월)에 개별로 진행될 예정입니다. (일정은 변경될 수 있습니다.)

Google HackFair 참가자 특전

- 최종 선정된 프로젝트팀 모두에게 AIY 프로젝트 Voice Kit (아래 이미지) 및 Google Developers 티셔츠, 그리고 구글에서 제작한 기념품을 선물로 드립니다.




- 행사 기간 동안의 식사 일체 및 간식을 제공하며, 1일차 저녁에 진행되는 메이커 네트워킹 이벤트에도 참석하실 수 있습니다.
- 메이커 페어 서울 2017 참가자에게 제공되는 모든 혜택도 동일하게 제공합니다.
- 서울/경기도 이외의 지역에 계시는 분들께는 행사 기간 동안의 교통/숙박을 모두 지원해 드립니다.
- 최종 참가팀에 선정되지 않더라도 프로젝트 데모 영상을 제출해 주신 모든 분들께 행사 초대권을 보내 드립니다.

프로젝트 대상

(아래의 기술 중 반드시 한가지 이상이 사용된 프로젝트만 참가 접수가 가능합니다.)
- Android Things
- TensorFlowCloud Machine Learning
- TangoDaydream


우대 사항

- 생활에 실용적으로 사용할 수 있거나 재미있는 프로젝트인 경우
- 프로젝트 홈페이지나 소셜 채널을 만들고 지속적으로 운영하는 경우(공식 해쉬태그: #ghackfair)
- 소스코드를 오픈소스로 공개한 경우


Google HackFair 유의 사항

- 10월 21일(토)과 22일(일) 행사 당일 최소 1명 이상의 팀원이 행사장에 상주해 계셔야 합니다.
- 팀당 인원 수는 최대 3명입니다.
- 개인이 아니라 회사나 단체의 프로젝트도 참가 가능합니다. 단, 등록 가능한 팀 인원 수는 3명으로 동일하게 제한합니다.
- 이미 개발되어 있는 프로젝트도 참가 가능합니다.
- 다른 공모전이나 대회에 참가했던 프로젝트도 참가 가능합니다.
- 프로젝트 결과물의 저작권/소유권 등 모든 관련 권리는 모두 프로젝트에 참가하신 분들에게 있습니다.

Google HackFair 2017 참가 신청하러 가기!

- 이 신청서는 추후 프로젝트 참가 신청팀에게 안내를 드리기 위한 용도로 사용되며, 제출하신 아이디어만으로 참가가 결정되지는 않으니 지금 가지고 계신 아이디어를 자유롭게 적어 주시기 바랍니다.
- 최종 참가팀은 9월 8일 (금) 18시까지 제출하신 프로젝트 데모 영상을 통해 결정되며 데모 영상 접수 방법은 별도로 안내해 드릴 예정입니다.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 정승욱(Android GDE)님이 참여해 주셨습니다.>
Cloud Functions for Firebase 팀과 함께 일하면서 가장 마음에 드는 부분 중 하나는 개발자가 모바일 애플리케이션에서 Firebase가 호스팅하여 완전히 관리되는 백엔드로 로직을 이동하는 데 도움을 드리고 있다는 점입니다. 개발자는 몇 줄의 자바스크립트 코드를 작성하는 것만으로도 리얼타임 데이터베이스의 콘텐츠 변경을 자동으로 처리하는 로직을 통합할 수 있습니다. 여러 사람들이 빌드하는 내용을 지켜보는 건 정말 흥미로운 일입니다!

Cloud Next 2017에서 Cloud Functions가 처음 발표되었을 때 데이터베이스에 대한 모든 유형의 변경에 대해 사용 가능한 트리거는 하나뿐이었습니다. 이 트리거는 onWrite() 콜백을 사용하여 지정되며, 어떤 종류의 변경이 발생했는지 파악할 책임은 코드 작성자에게 있었습니다. 예를 들어, 앱에 대화방이 있고 새 메시지가 도착하면 Firebase 클라우드 메시징을 사용하여 대화방 사용자들에게 알림을 보내고 싶은 경우를 생각해봅시다. 이런 기능을 구현하기 위해 다음과 같은 코드를 작성할 수 있습니다.
exports.sendNotification = functions.database
        .ref("/messages/{messageId}").onWrite(event => {
    const dsnap = event.data  // a DeltaSnapshot that describes the write
    if (dsnap.exists() && !dsnap.previous.exists()) {
        // This is a new message, not a change or a delete.
        // Send notifications with FCM...
    }
})

쓰기 위치에 새 데이터가 있는지, 해당 위치에 이전 데이터가 없는지 확인하려면 이벤트 객체에서 DeltaSnapshot을 검사해야 합니다. 왜 이런 과정이 필요한 걸까요? 새 메시지, 업데이트된 메시지 및 삭제된 메시지를 포함하여 일치하는 위치에 있는 데이터가 변경되는 모든 경우에 onWrite()가 트리거되기 때문입니다. 그러나 이 함수는 새로운 메시지에만 관심이 있으므로 쓰기가 업데이트 또는 삭제가 아닌지 확인해야 합니다. 업데이트 또는 삭제가 있었다면, 이 함수가 계속 트리거되어 즉시 반환됩니다. 이러한 추가 실행에는 비용이 소요되는데, 유용한 작업을 수행하지 않는 함수에 대해 요금이 발생되도록 하려는 개발자는 없을 것입니다.

변경 사항

Cloud Functions 데이터베이스 트리거에서 더 이상 이러한 추가 검사가 필요하지 않다는 희소식을 전해 드립니다! firebase-functions 모듈 버전 0.5.9부터는 onCreate(), onUpdate(), onDelete()라는 세 가지 유형의 데이터베이스 트리거를 작성할 수 있습니다. 이러한 트리거는 변경된 유형을 인식하고 개발자가 바라는 변경의 유형에만 응답하여 실행됩니다. 이제 위의 함수를 다음과 같이 작성할 수 있습니다.
exports.sendNotification = functions.database
        .ref("/messages/{messageId}").onCreate(event => {
    // Send notifications with FCM...
})

여기서는 같은 위치에 있는 데이터에 대한 어떤 후속 업데이트에 대해서도 이 함수가 다시 트리거되는 문제에 대해 걱정할 필요가 없습니다. 이 함수는 읽기도 쉬울 뿐더러, 운영 비용도 적게 듭니다.

참고로, onWrite()는 사라진 게 아닙니다. 원한다면 언제든지 작성하는 함수와 함께 이 함수를 계속 사용하실 수 있습니다.

onWrite()onUpdate()로 무한 루프 방지

이전에 onWrite()를 사용하여 한 위치에서 데이터를 추가하거나 변경한 적이 있다면, onWrite() 중에 해당 데이터를 변경함으로써 onWrite()가 다시 한 번 호출된다는 점을 알고 계실 겁니다. (모든 쓰기가 쓰기로 카운트되기 때문입니다.)

메시지 작성 후 메시지의 lastUpdated 속성을 업데이트하는 다음 함수를 고려하세요.
exports.lastUpdate = functions.database
        .ref("/messages/{messageId}").onWrite(event => {
    const msg = event.data.val()
    msg.lastUpdated = new Date().getTime()
    return event.data.adminRef.set(msg)
})

얼핏 보면 괜찮은 것 같지만 뭔가 중요한 내용이 빠져있습니다. 이 함수는 자신이 트리거된 위치와 동일한 위치에 다시 쓰기 때문에 실제로는 onWrite()에 대한 또 다른 호출을 트리거합니다. 이에 따라 쓰기의 무한 루프가 발생하므로 두 번째 호출에서 벗어날 방법이 필요하다는 것을 알 수 있습니다.

onUpdate() 함수 구현에도 이런 문제가 있는 것으로 드러납니다. 이 특정 사례에서 한 가지 해결책은 lastUpdated의 기존 값을 확인하여 현재 날짜보다 30초 이상 오래되지 않은 경우 벗어나는 것입니다. 따라서 onUpdate()를 사용하여 이 함수를 다시 작성한다면 다음과 같은 내용일 수 있습니다.
exports.lastUpdate = functions.database
        .ref("/messages/{messageId}").onUpdate(event => {
    const msg = event.data.val()
    const now = new Date().getTime()
    if (msg.lastUpdated > now - (30*1000)) {
        return
    }
    msg.lastUpdated = now
    return event.data.adminRef.set(msg)
})

이제 이 함수는 약간의 추가 로직으로 무한 루프를 방지합니다.

이러한 새로운 트리거를 사용하려면 firebase-functions 모듈을 0.5.9로 업데이트해야 합니다. 이런 업데이트에 대한 자세한 내용은 여기에 있는 문서를 참조하세요.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 신정규(Machine Learning GDE)님이 참여해 주셨습니다.>

게시자: 연구원 Luke Metz, 소프트웨어 엔지니어 Yun Liu(2016년 Google Brain Resident 참가자)

“통계, 물리학, 화학 등 다양한 학문적 배경을 가진 사람들이 모여서 운영되는 Google Brain Residency는 제가 딥 러닝과 심도 있는 프로그래밍을 모두 처음으로 접한 소중한 경험이었습니다. 컴퓨터 비전과 언어에 대한 딥 러닝, 강화 학습, 이론 등, 제가 선택한 다양한 주제를 연구하기 위해 제게 주어진 자율권을 활용했습니다. 원래는 통계학 박사 학위를 취득하려고 했지만 이곳에서의 경험이 자극제가 되어 올해 가을부터 시작되는 Stanford CS 프로그램에 등록했습니다.” - Melody Guan, 2016년 Google Brain Residency 참가자
이번 달로 Google Brain Residency 프로그램의 첫 클래스를 운영한 지 1년이 되어 마무리하게 되는데, 놀랍도록 성공적인 성과를 거두었습니다. 이 1년짜리 프로그램은 다양한 교육 배경과 경험을 가진 사람들이 기계 학습과 딥 러닝에 대해 연구할 수 있는 기회를 제공할 목적으로 마련되었습니다. 지난 1년 동안 프로그램 참가자인 레지던트들은 이론에서부터 로봇 공학과 음악 생성에 이르는 다양한 주제 분야에서 각종 연구 보고서를 꿰뚫고 Google 스케일의 실험을 설계 및 구현하고 최첨단 기술 연구에 참여하는 등, 분주한 활동을 해왔습니다.

1년 전, 프로그램의 시작과 함께 처음으로 구성된 초대 레지던트 클래스는 지금까지 ICLR(15건), ICML(11건), CVPR(3건), EMNLP(2건), RSS, GECCO, ISMIR, ISMBCosyne 같은 유명 기계 학습 간행물에 30여 건의 논문을 발표했습니다. 현재 NIPS, ICCV, BMVCNature Methods에서 추가로 18건의 논문을 심사하는 중입니다. 위의 논문 중 두 건은 Distill에 발표되었는데, 디콘볼루션이 체커보드 아티팩트를 만들어내는지 탐구하고 필체 생성 모델의 시각화 방법을 제시하는 내용이었습니다.

레지던트들이 작성한 한 Distill 논문에서는 신경망이 필체를 생성하는 방식을 상호작용적으로 탐구합니다.
로봇이 관찰을 통해 인간의 움직임을 모방하는 방법을 배울 수 있는 시스템. 자세한 내용은 “Time-Contrastive Networks: Self-Supervised Learning from Multi-View Observation”(레지던트 Corey Lynch, P. Sermanet, J. Hsu, S. Levine 공저, CVPR Workshop 2017에 채택됨)을 참조하세요.
하드웨어 기기 할당을 위한 계산을 강화 학습을 사용하여 최적화하여 분산 딥 러닝 네트워크를 대규모로 훈련하는 모델. 자세한 내용은 “Device Placement Optimization with Reinforcement Learning”(레지던트 Azalia Mirhoseini 및 Hieu Pham, Q. Le, B. Steiner, R. Larsen, Y. Zhou, N. Kumar, M. Norouzi, S. Bengio, J. Dean 공저, ICML 2017에 제출됨)을 참조하세요.
딥 러닝 아키텍처에 중점을 두고 최적화 방법을 찾는 과정을 자동화하는 접근방식. “Neural Optimizer Search with Reinforcement Learning”(레지던트 Irwan Bello 및 Barret Zoph, V. Vasudevan, Q. Le 공저, ICML 2017에 제출됨) 논문의 최종 버전이 곧 발표 예정.
레지던트들은 범용 시퀀스-시퀀스 모델(번역에서 예시로 사용됨), 음악 합성, 인간 스케치 모방, 모델 트레이닝을 위한 서브샘플링, 모델에 대한 효율적인 "주의" 메커니즘, 시계열 분석(특히 신경과학 분야)을 통해 오픈소스 커뮤니티에 상당히 공헌하기도 했습니다.

이번 프로그램을 마친 레지던트들은 각자의 커리어에서 한 단계 더 높은 수준으로 도약하게 될 것입니다. 이들 중 다수는 Google Brain 팀에서 정직원으로 연구 경력을 계속 쌓아갈 예정입니다. 다른 레지던트들은 스탠포드, UC 버클리, 코넬, 옥스포드, NYU, 토론토, CMU 등의 대학교에서 최고의 기계 학습 박사과정을 선택했습니다. 이 프로그램에서 기울인 노력과 경험을 밑거름으로 하여 앞으로 맺게 될 결실을 지켜보는 것만으로도 너무나 자랑스럽고 뿌듯할 것입니다!

이번 주에 프로그램의 첫 클래스를 무사히 "졸업"하는 저희들을 이어 다음 클래스 참가자 35명이 1년간의 여정을 시작하게 됩니다. 다양한 경험과 교육 배경, 놀라운 재능을 가진 분들이라 역시 기대가 큽니다. 새로운 레지던트들이 저희가 지난 1년간 진행했던 첫 클래스의 성공을 기반으로 어떻게 성장해나가면서 팀을 새롭고 흥미진진한 방향으로 계속 이끌어갈지 정말 기대됩니다. 또 다른 흥미진진한 연구와 혁신의 한 해를 기대해봅니다!

2018년 Residency 프로그램 신청은 2017년 9월에 시작됩니다. 프로그램에 대해 자세히 알아보려면 g.co/brainresidency를 방문하시기 바랍니다.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 조은(우아한형제들)님이 참여해 주셨습니다.>
지난 4월에 여러분께 amp-bind를 사용해 더욱 향상된 AMP 페이지 상호작용을 시험해보는 걸 권했습니다. 오늘은 amp-bind의 정식 출시를 알리며 한다는 점을 알려드리면서 이를 계기로 특히 전자상거래 측면에서 AMP 지원 범위가 얼마나 확대될지 감을 잡으실 수 있도록 이 기능을 좀 더 상세히 살펴보도록 하겠습니다.

amp-bind란?

지난 4월의 블로그 게시물에서 amp-bind를 다음과 같이 소개한 바 있습니다.

amp-bind는 계속해서 AMP의 기본적인 성능과 UX를 보장하는 동시에 AMP의 상호작용 모델을 근본적으로 바꿔놓습니다. amp-bind는 amp-carouselamp-accordion과 같이 범위가 지정되고 사용 사례를 기반으로 하는 구성 요소로만 상호작용을 제한하는 AMP 프로젝트의 기존 방식을 뛰어넘어 AMP를 기반으로 작성되는 코딩 계층과 더 비슷한 방식으로 동작합니다. amp-bind는 다양한 문서 상태에 대한 트리거와 사용자 액션을 연결해주므로, 개발자로서는 훨씬 더 자유롭게 원하는 유형의 상호작용을 정의할 수 있습니다.

이런 정의는 기술적으로는 정확하지만 상당히 추상적이기도 합니다. 이 기능은 너무나 유연성이 뛰어나므로, 막연한 광의의 설명만으로는 실제로 어떤 일을 해낼 수 있는 기능인지 파악하기 어렵습니다.

그렇다면 amp-bind로 어떤 기능을 구현할 수 있을까요?

먼저 이 기능의 기본적인 동작부터 몇 가지를 살펴보는 게 좋을 것 같습니다. 그 후에 AMP by Example playground에 나와 있는 코드를 변경해 보면서 직접 시험해 보시기 바랍니다.

기본 사항을 익힌 후 배운 내용을 바탕으로 아래의 예제를 살펴보면 amp-bind를 다른 AMP HTML 기능과 함께 사용할 때 구현 가능한 기능 몇 가지를 확인할 수 있습니다.
  • 제품 색과 크기 선택(상세 예제는 아래 참조)
  • 서버 측 필터 및 정렬(상세 예제는 아래 참조)
  • 페이지 새로고침 없이 검색 결과 표시(상세 예제는 아래 참조)
  • 자동 제안 사항 검색(상세 예제는 아래 참조)
  • 캐러셀 슬라이드 표시기(상세 예제는 아래 참조)
  • '선택' 입력으로부터 탐색 트리거
  • 'like', 'thumbs up', 'add to cart' 등을 기반으로 전체 페이지 상태를 업데이트하는 스마트 버튼. 이 스마트 버튼을 통해 이러한 액션과 장바구니에 늘어나는 품목 수 또는 '좋아요(like)' 수를 바탕으로 맞춤설정된 추천 사항으로 구성된 캐러셀을 표시할 수 있습니다.
  • 다수의 항목으로 구성된 다양한 뷰(목록 또는 그리드) 간 전환
  • 구매 전 제품 옵션을 맞춤설정할 수 있는 UI 패널 오버레이 전환
  • 도움말 숨기기/표시
  • 맞춤형 슬라이더를 사용하여 amp-list 데이터 필터링
  • 전체 페이지 업데이트 없이 통화 변경(예: 미국 달러에서 유로로)
  • 기타 등등!

제품 색과 크기 선택


bind-product.gif

이 예제에서는 제품 상세 페이지에서 흔히 볼 수 있는 여러 기능을 보여줍니다. 이 기능 중 전체 상호작용이 필요하지 않은 경우 분리하여 사용할 수도 있습니다. 여기서 amp-bind는 amp-form, amp-selector, amp-carousel 및 몇 가지 기본적인 CSS 간의 이벤트와 액션을 조정합니다.
  1. 사용자가 amp-form(손쉬운 사용자설정 및 명확한 시맨틱을 위한 amp-selector를 사용하여 입력 항목 제공)에서 항목을 선택합니다.
  2. 이러한 선택 항목 각각과 관련된 이벤트가 발생합니다.
  3. 이 이벤트는 다음과 같은 몇 가지 사항을 수행하도록 amp-bind를 통해 조정됩니다.
    • 세 가지 각기 다른 amp-carousel(각 사과 색마다 하나씩) 중 하나에 대한 CSS 표시 트리거
    • 특정 색의 사과에 특정 크기를 사용할 수 없는 경우 양식 입력에 대해 '비활성화된' 속성(및 스타일) 트리거
    • 사과 색에 따라 가격 업데이트 트리거

페이지에서 amp-bind를 사용하면 사용자는 자신이 선택한 항목을 바로 확인할 수 있게 하고, 구매 관련 정보를 빠르고 정확히 파악한 후 Form을 전송할 수 있습니다.

서버 측 필터 및 정렬

bind-filter-sort.gif
현재 amp-list[src] 바인딩을 통해 서버 측 데이터 정렬 및 필터링이 가능합니다. 여기서는 amp-bind를 사용하여 'select' 입력 및 amp-list 간의 이벤트 및 액션을 조정합니다. 단계별로 살펴보도록 하겠습니다.
  1. 사용자가 정렬이나 필터링 관련 규칙을 선택합니다(예: '낮은 순에서 높은 순').
  2. 'select' 상태 변경과 관련된 이벤트가 발생합니다.
  3. 이 이벤트는 amp-list의 src 속성에 대한 업데이트를 트리거하도록 amp-bind를 통해 조정되어, 이 업데이트에서는 정렬 규칙(?sort=price-ascending)과 일치하는 쿼리 매개변수를 추가하며, 이를 통해 서버에 호출을 보냅니다.
  4. 서버가 정렬 규칙에 따라 결과 목록을 반환합니다. 이런 결과는 amp-list에서 정의된 템플릿에 따라 렌더링됩니다.

바인딩 이벤트는 여러 입력을 통해 트리거될 수 있으므로 'show more' 버튼을 통한 결과 추가, 목록 결과 페이지 매기기 등의 다른 많은 기능에 이 기본 패턴을 사용할 수 있습니다. 따라서 사용자는 상위 페이지를 새로 고치지 않고도 목록에서 추가 항목을 탐색할 수 있습니다. 개발자 여러분은 사용자가 맞춤설정된 추천 사항 목록을 새로 고칠 수 있는 환경도 구현할 수 있습니다.

모범 사례: 페이지를 처음 로드할 때 div[placeholder]를 사용하여 결과를 정적으로 표시하는 것이 좋습니다. 그러면 지연 없이 결과가 사용자에게 즉시 표시됩니다. 그런 다음 사용자가 정렬 및 필터링 메커니즘과 상호작용할 때 amp-bind를 사용하여 amp-list를 통한 호출을 'src' 속성에 정의된 업데이트된 URL로 실행하여 결과를 표시할 수 있습니다.

페이지 새로고침 없이 검색 결과 표시


bind-auto-search.gif

전체 페이지를 새로 고치지 않고 인라인으로 검색 결과를 가져와서 표시함으로써, 사용자는 대역폭을 절약하고 현재 페이지 컨텍스트를 유지함에 따라 더욱 완벽한 환경을 이용할 수 있습니다. 이러한 구현 방식은 amp-list에 바인딩하는 방법의 또 다른 응용 사례입니다. 여기서는 amp-form도 사용합니다.
  1. 사용자가 amp-form을 통해 '배'를 검색합니다.
  2. 이 검색에서 트리거된 이벤트는 amp-list의 src 속성에 대한 업데이트를 트리거하도록 amp-bind를 통해 조정되어, 이 업데이트에서는 검색 쿼리(?searchProduct=pear)와 일치하는 쿼리 매개변수를 추가하며, 이를 통해 서버에 호출을 보냅니다.
  3. 서버가 검색 쿼리에 따라 결과 목록을 반환합니다. 이런 결과는 amp-list에서 정의된 템플릿에 따라 렌더링됩니다.

자동 제안 사항 검색


bind-autosuggest.gif

이 예제(참조 코드)에서는 amp-list[src] 바인딩에 약간 더 복잡한 동작을 추가합니다. 여기서는 amp-bind를 사용하여 amp-form 및 amp-list 간의 이벤트 및 액션을 조정합니다.
  1. 사용자가 검색창에 검색어를 입력하기 시작합니다.
  2. 양식 필드에 대한 텍스트 입력과 관련된 이벤트가 발생합니다(버튼을 누를 때마다 이러한 이벤트가 트리거되지 않도록 방지하기 위해 디바운스됨).
  3. 이 이벤트는 다음과 같은 두 가지 사항을 수행하도록 amp-bind를 통해 조정됩니다.
    1. amp-list를 포함하는 숨겨진 div에 대한 가시성 트리거
    2. 해당 amp-list의 src 속성에 대한 업데이트 트리거. 이 업데이트에서는 사용자가 양식에 입력한 부분 쿼리를 포함하여 서버에 호출을 보냅니다.
  4. 서버가 이 쿼리를 기반으로 가능한 결과 목록을 반환합니다. 이러한 목록은 amp-list에서 해당 템플릿을 통해 렌더링합니다. 그러면 이러한 옵션이 사용자에게 자동 제안 사항으로 표시됩니다.
  5. amp-list 템플릿은 이러한 제안 사항에서 탭하는 항목에 따라 조정되어 양식 필드를 업데이트하는 방식으로 상호작용을 완료합니다.

참고: 개발자 고유의 기능을 빌드하는 경우 이 기능에 대한 두 가지 다른 UI가 동시에 중첩되지 않도록 브라우저의 자동 제안 사항 기능을 꺼야 합니다.

이 기능이 어떻게 작동하는지 더 자세히 알아보려면 GitHub의 예제를 살펴보세요. 예제를 자신의 페이지로 복사하여 붙여넣은 후 템플릿과 백엔드를 사용자설정하기만 하면 원하는 항목을 제공할 수 있습니다. 가장 단순하게는 사용자가 검색할 수 있는 단어에 대해 더욱 세부적인 제안 사항을 제공할 수 있으며, 이와 반대로 가격, 그림 및 평점이 포함된 제품 결과를 나타내는 매우 상세한 카드를 표시할 수도 있습니다.


캐러셀 슬라이드 표시기


bind-carousel-indices.gif

여기서 amp-bind는 단순한 페이지 표시기(캐러셀의 왼쪽 아래에 표시되는 4개의 점)에서 CSS 스타일을 사용하여 amp-carousel의 인덱스를 조정하려고 사용한 것일 뿐입니다.
  1. 사용자가 캐러셀에 표시된 슬라이드를 스와이프합니다.
  2. 표시된 슬라이드의 변경과 관련된 이벤트가 발생합니다.
  3. 이 이벤트는 페이지 매기기를 나타내는 점에 대한 CSS 스타일의 변경을 트리거하도록 amp-bind를 통해 조정됩니다.

개발자들은 이 기능을 통해 광범위한 어포던스를 구성하여 캐러셀이 스와이프 가능함을 나타낼 수 있으므로 amp-carousel에서 기본 제공하는 화살표에만 의존할 필요가 없습니다.


다음 단계는?

amp-bind는 현재 안정적으로 작동하지만, 계속해서 더 많은 기능이 활발히 추가되고 있습니다. 우리는 커뮤니티를 통해 받은 피드백을 바탕으로 AMP의 기본적인 성능과 UX가 그대로 보장되는 수준에서 이 구성 요소를 훨씬 더 강력하게 만드는 기능을 계속해서 추가하고 있습니다.

무엇보다도 정렬/필터링 활용 사례를 완성하기 위한 바인딩에서 URL 쿼리 매개변수 및 해당 방문 기록 상태 업데이트, AMP에 인라인으로 추가할 수 있는 항목과 삽입할 수 있는 항목 사이의 경계를 뛰어넘는 풍부한 기능의 상호작용을 지원하기 위한 iframe 및 해당 상위 문서 간 메시징 지원, 그리고 서버 호출을 통해 검증된 양식을 사용하여 페이지 상태를 조정하기 위한 바인딩 업데이트 등이 로드맵에 포함되었습니다.


여러분의 경험을 공유해 주세요!

Google AMP 팀이 확인한 것보다 여러분이 더 많은 새로운 기능을 찾아낼 수 있다고 생각합니다. 주저하지 말고 탐험을 시작해 보세요! amp-bind를 실험해 보고 찾아낸 사실을 알려주시기 바랍니다. 개발자 여러분이 빌드한 결과물을 정말 보고 싶으며 이를 더욱 넓은 AMP 커뮤니티에 공유해 활발한 토론을 이어가시기 바랍니다.

항상 그렇듯이 amp-bind는 물론, AMP에서 지원했으면 하는 다른 기능에 대한 여러분의 의견을 듣고 싶습니다. 개발자 여러분의 얘기를 꼭 듣게 되기를 기다리겠습니다!

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.>

 게시자: Fergus Hurley, Google Play 제품 관리자

열악한 앱 성능은 많은 사용자가 겪는 문제입니다. 혹시 최근에 사용중인 앱이 비정상 종료되거나, 응답 없음(ANR) 오류가 발생하거나, 혹은 렌더링 속도가 버벅된 경우가 있나요? 배터리가 너무 빨리 줄어들어, 배터리 사용량을 확인해봤더니 배터리를 과도하게 사용하는 앱이 있다면 어떻게 반응하실지 생각해보세요. 앱 성능에 문제가 있으면, 언젠가 사용자가 그 사실을 알게됩니다. 실제로 Google Play의 앱 리뷰 내용을 내부 분석한 결과, 별 1개짜리 리뷰 중 절반이 앱의 안정성에 대해 언급한 것으로 나타났습니다.

반대로, 사람들은 최고의 성능을 보이는 앱에는 계속해서 후한 평점과 호의적인 리뷰로 화답합니다. 그 결과 Google Play에서 순위가 올라가고 설치 수도 증가하게 됩니다. 뿐만 아니라, 사용자가 앱을 더 많이 사용하고, 더 많이 앱에 참여하고 더 많은 시간과 비용을 기꺼이 투자합니다.

이번 I/O에서 Google Play Console의 새로운 안드로이드 바이탈(Android vitals) 대시보드가 발표되었습니다. 안드로이드 바이탈은 악성 앱 동작을 이해하고, 분석하는 데 도움이 되도록 설계되었습니다. 이를 활용해, 문제의 원인을 분석하고, 앱의 성능을 향상시키고, 앱 사용자를 더 행복하게 만들 수 있습니다.

Google Play Console의 안드로이드 바이탈



안드로이드 바이탈은 앱의 성능을 한 눈에 확인하고 주요 지표를 살펴볼 수 있는 출발점입니다. 대시보드는 개발자와 사업 팀 모두에게 똑같이 유용합니다. 주요 지표를 통해 앱의 성능을 객관적으로 모니터링하고, 실제 사용자 데이터를 분석하여 어떤 부분이 문제가 되는지 그리고 어떤 부분을 우선적으로 개선해야하는지에 관한 통찰을 얻을 수 있습니다.

안드로이드 바이탈은 사용자가 사용량 및 진단 데이터를 자동으로 공유하도록 허가한 안드로이드 기기에서 다음과 같은 데이터를 수집합니다.
  • 안정성: ANR 비율 및 비정상 종료 비율
  • 렌더링 시간: 느린 렌더링(16ms) 및 UI 프레임 멈춤 현상(700ms)
  • 배터리 사용량: wake locks 점유 및 과도한 웨이크업

Busuu가 앱 성능 향상에 주력하여 4.1☆에서 4.5☆로 평점을 높인 방법을 살펴보세요.

Busuu는 세계 최대의 언어 학습 앱 중 하나입니다. 제품 책임자인 Antoine Sakho에게서 Busuu가 사용자 평점을 높인 비결을 들어보세요.

안드로이드 및 Google Play 도구를 활용해 앱 성능을 향상시키는 방법에 대해 자세히 알아보세요

대시보드에 표시되는 데이터 및 앱의 성능과 안정성을 향상시키는 방법을 이해하려면 안드로이드 바이탈의 모범 사례 문서를 읽어보세요. 또한, 잘못된 동작을 식별하고 수정하는 데 사용할 수 있는 안드로이드 및 Google Play 개발자 도구에 관한 I/O 세션 동영상도 참고하시기 바랍니다.


다른 Play Console 기능에 대해 자세히 알아보시고, Playbook 앱을 사용하여 최신 소식과 팁을 계속 확인하면서 Google Play에서 성공가도를 달리시기 바랍니다. 지금 바로 베타에 가입하고 설치해 보세요.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.>
지난 4월 Python용 Firebase Admin SDK가 정식 출시되었습니다. 첫 번째 버전은 Firebase 인증 기능과 관련된 두 가지 주요 기능 - 맞춤 토큰 작성 및 ID 토큰 인증 기능을 제공했습니다. 버전 2.1.0부터는 추가로 Firebase 실시간 데이터베이스 지원 기능을 제공합니다.

구현 방식의 차이로 인해, 새롭게 추가된 API는 기존 Admin SDK(Node.js 및 자바)에서 제공하던 데이터베이스 API와는 한 가지 큰 차이점이 있습니다. 실시간 이벤트 리스너를 지원하지 않는다는 점입니다. 현재 Python Admin SDK에서는 실시간 업데이트 알림을 받기 위해, 이벤트 리스너를 데이터베이스 참조에 추가할 수 없습니다. 대신, 모든 데이터 획득 작업이 블로킹(blocking) 방식으로 이루어집니다. 이러한 차이가 있지만, 여전히 이 API를 활용해 다양한 일을 수행할 수 있습니다.

Python Admin SDK의 데이터베이스 모듈을 사용하면 기본 데이터 조작 작업과 고급 쿼리를 모두 수월하게 처리할 수 있습니다. Python 환경에서 데이터베이스와 상호작용을 시작하려면, 우선, 접근할 실시간 데이터베이스 URL을 사용해 SDK를 초기화 합니다.

import firebase_admin
from firebase_admin import credentials

cred = credentials.Cert('path/to/serviceKey.json')
firebase_admin.initialize_app(cred, {
    'databaseURL' : 'https://my-db.firebaseio.com'
})

그런 다음 SDK의 db 모듈에서 데이터베이스 참조를 가져옵니다. 일반적인 데이터베이스 작업을 위한 기능들이 Python 메서드(get(), set(), push(), update()delete())로 노출되어 있습니다.

from firebase_admin import db

root = db.reference()
# Add a new user under /users.
new_user = root.child('users').push({
    'name' : 'Mary Anning', 
    'since' : 1700
})

# Update a child attribute of the new user.
new_user.update({'since' : 1799})

# Obtain a new reference to the user, and retrieve child data.
# Result will be made available as a Python dict.
mary = db.reference('users/{0}'.format(new_user.key)).get()
print 'Name:', mary['name']
print 'Since:', mary['since']

Firebase 실시간 데이터베이스에서 모든 데이터 값은 JSON으로 저장됩니다. Python Admin SDK를 활용해 어떻게 JSON과 Python의 네이티브 데이터 형식을 오고 갈 수 있는지 잘 살펴보시기 바랍니다.

고급 쿼리를 실행하려면 데이터베이스 참조에서 사용할 수 있는 order_by_* 메서드 중 하나를 호출합니다. 쿼리 객체가 반환되며, 해당 쿼리 객체를 대상으로 추가적인 API를  실행할 수 있습니다. 예를 들어, 아래 코드조각에서 처럼 API를 호출하여, limit 쿼리와 range 쿼리를 실행하고 정렬된 결과를 가져올 수 있습니다.

from firebase_admin import db

dinos = db.reference('dinosaurs')

# Retrieve the five tallest dinosaurs in the database sorted by height.
# 'result' will be a sorted data structure (list or OrderedDict).
result = dinos.order_by_child('height').limit_to_last(5).get()

# Retrieve the 5 shortest dinosaurs that are taller than 2m.
result = dinos.order_by_child('height').start_at(2).limit_to_first(5).get()

# Retrieve the score entries whose values are between 50 and 60.
result = db.reference('scores').order_by_value() \
    .start_at(50).end_at(60).get()

새로운 API에 대한 자세한 내용은 Admin SDK 문서를 살펴보시기 바랍니다. Github 리포지토리도 확인해보시고, 문제가 있는 경우 알려주시거나, 직접 패치를 제공해 주셔도 좋습니다. Admin SDK를 더욱 개선하는 데 도움을 주시면 고맙겠습니다. 사실, 여러분의 지속적인 피드백이 이처럼 짧은 기간에 이 API를 만들고 출시하는 데 좋은 자극제가 되었습니다. Firebase로 즐겁게 코딩해 보세요!

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 곽동현(Machine Learning GDE)님이 참여해 주셨습니다.>

게시자: Łukasz Kaiser, Google 브레인 팀 수석 연구원

딥 러닝(DL)은 기계 번역, 음성 인식물체 감지와 같은 많은 유용한 기술의 급속한 발전을 이끌었습니다. 연구 커뮤니티에서는 실험 결과를 재현하고 딥 러닝을 발전시키는 데 도움을 주려고 저자들이 공개한 코드를 쉽게 찾아볼 수 있습니다. 그러나 이러한 DL 시스템은 대부분 상당한 엔지니어링 작업이 필요하고 특정 문제 또는 아키텍처에 대해서만 작동할 수 있는 고유한 실험 설정을 사용하므로, 새로운 실험을 실행하고 그 결과를 비교하기가 어렵습니다.

오늘 우리는 설레는 마음으로 TensorFlow의 딥 러닝 모델의 학습을 위한 오픈 소스 시스템인 Tensor2Tensor(T2T)를 공개합니다. T2T는 번역, 파싱, 이미지 캡션 등과 같은 다양한 ML 애플리케이션용 최고성능 모델을 쉽게 만들 수 있게 하여, 이전보다 훨씬 빠르게 다양한 아이디어를 탐색할 수 있게 해줍니다. 이 릴리스에는 DL 연구의 시작에 도움이 되는 몇몇 최신 논문(Attention Is All You Need, Depthwise Separable Convolutions for Neural Machine TranslationOne Model to Learn Them All)에서 발표한 최고의 모델을 비롯한 데이터셋 및 모델의 라이브러리가 포함되어 있습니다.
번역 모델
학습 시간
BLEU(베이스라인과의 차이)
Transformer(T2T)
3일(8개의 GPU)
28.4(+7.8)
SliceNet(T2T)
6일(32개의 GPU)
26.1(+5.5)
1일(64개의 GPU)
26.0(+5.4)
ConvS2S
18일(1개의 GPU)
25.1(+4.5)
GNMT
1일(96개의 GPU)
24.6(+4.0)
8일(32개의 GPU)
23.8(+3.2)
MOSES(구문 기반의 베이스라인)
해당 없음
20.6(+0.0)
표준 WMT 영어-독일어 번역 작업에서 BLEU 점수(높을수록 좋음).
T2T가 제공할 수 있는 향상 사항의 한 예로, 우리는 기계 번역에 라이브러리를 적용했습니다. 위의 표에서 볼 수 있듯이, 2개의 서로 다른 T2T 모델인 SliceNet과 Transformer는 이전의 최고성능 모델인 GNMT+MoE를 능가합니다. 최고의 T2T 모델인 Transformer는 표준 GNMT + MoE 모델보다 3.8점 높고 이 모델 자체는 베이스라인인 구문 기반 번역 시스템, MOSES보다 4점 높았습니다. 특히 T2T를 사용하면 단일 GPU로 하루 만에 이전의 최고성능 결과를 달성할 수 있습니다. 작은 Transformer 모델(위에 표시되지 않음)은 단일 GPU에서 1일 학습 후 24.9 BLEU를 달성합니다. 이제 GPU를 사용하는 모든 사람들이 스스로 훌륭한 번역 모델을 고안할 수 있습니다. github 저장소에 이를 수행하는 방법에 대한 설명이 있습니다.

모듈식 멀티태스킹 교육

T2T 라이브러리는 친숙한 TensorFlow를 사용하여 개발되었으며, 데이터셋, 모델 아키텍처, 옵티마이저, 학습률 감소 방법, 하이퍼 파라미터 등과 같이 딥 러닝 시스템에 필요한 여러 가지 요소를 정의합니다. 결정적으로, 이 모든 부분 요소들 사이에 표준 인터페이스를 반드시 사용하고 최신 ML 모범 사례를 구현합니다. 따라서 모든 데이터셋, 모델, 옵티마이저 및 하이퍼 파라미터 셋을 선택하고 학습을 실행하여 어떻게 수행되는지 확인할 수 있습니다. 아키텍처를 모듈화했으므로 입력 데이터와 예측된 출력 간의 모든 부분이 텐서-to-텐서 함수입니다. 모델 아키텍처에 대한 새로운 아이디어가 있다면 전체 구현을 바꿀 필요가 없습니다. 텐서르 ㄹ입력으로 받고 텐서를 출력하는 함수를 정의하여, 베딩 부분과 Loss함수 및 기타 모든 부분을 그대로 유지한 채, 모델의 중간 부분을 수정할 수 있습니다.

이는 더 이상 특정 모델이나 데이터셋에 고정되지 않은 학습을 통해 T2T가 유연함을 의미합니다. 유명한 LSTM 시퀀스-시퀀스 모델과 같은 아키텍처조차도 수십 줄의 코드로 쉽게 정의할 수 있습니다. 또한, 서로 다른 도메인의 여러 작업에서 단일 모델을 학습할 수 있습니다. 한계를 감안하여 모든 데이터셋에서 동시에 단일 모델을 학습할 수도 있으며, 이와 같이 학습되고 T2T에 포함된 MultiModel은 ImageNet(이미지 분류), MS COCO(이미지 캡션), WSJ(음성 인식), WMT(번역) 및 Penn Treebank 파싱 자료에 대해 공동으로 학습할 때조차도 많은 작업에서 좋은 결과를 얻을 수 있습니다. 이는 단일 모델을 통해 이러한 모든 작업을 한 번에 수행할 수 있다는 점을 최초로 시연한 것입니다.

기본 제공 모범 사례

이 초기 릴리스와 함께, 연구 커뮤니티에서 널리 사용되는 많은 데이터셋1, 소수의 모델2, 다수의 하이퍼 파라미터 구성, 그리고 트레이드에서 중요한 다른 트릭이 잘 수행되도록 하는 구현을 위한 스크립트도 제공합니다. 이들을 모두 나열하기는 어렵지만, T2T로 모델을 실행하기로 결정할 경우 정확한 시퀀스 패딩과 해당 크로스 엔트로피(cross-entropy) 손실, Adam 옵티마이저용으로 적절히 조정된 파라미터, 적응형 배치, 동기화된 분산 학습, 이미지용으로 적절히 조정된 데이터 증대, 레이블 스무딩 및 번역에 관한 최고성능 기술의 성과를 달성하고 좋은 결과를 얻는 데도 도움이 될 수 있도록 위에서 언급한 내용을 비롯해, 매우 효과적으로 작동했던 다수의 하이퍼 파라미터 구성을 자유롭게 활용할 수 있습니다.

예를 들어, 영어 문장을 문법적 구성요소 트리로 파싱하는 작업을 살펴봅시다. 이 문제는 수십 년 동안 연구되어왔고 많은 노력을 통해 경쟁력 있는 방법이 개발되었습니다. 이는 시퀀스-to-시퀀스 문제로 나타날 수 있고 신경망으로 해결될 수 있지만 많은 조정 작업이 필요했습니다. T2T를 사용할 경우 이 문제에 대해 교육하기 위해 파싱 데이터세트 생성기를 추가하고 트랜스포머 모델을 조정하는 데 불과 며칠밖에 걸리지 않았습니다. 놀랍게도 우리는 단 일주일 만에 아주 좋은 결과를 얻었습니다.
파싱 모델
F1 점수(높을수록 좋음)
Transformer(T2T)
91.3
Dyer 외
91.7
Zhu 외
90.4
Socher 외
90.4
Vinyals 및 Kaiser 외
88.3
표준 테스트 셋에서 파싱 F1 점수, WSJ의 섹션 23. Penn Treebank WSJ 학습 세트에서 차별화된 학습을 받은 모델만 비교합니다. 자세한 결과는 문서를 참조하세요.

Tensor2Tensor에 기여

기존 모델 및 데이터셋 탐색 외에도, 자신만의 모델을 쉽게 정의하고 Tensor2Tensor에 자신만의 데이터셋을 추가할 수 있습니다. 이미 포함된 모델은 많은 NLP 작업에서 매우 잘 수행될 것으로 예상되므로 데이터셋을 추가하기만 하면 흥미로운 결과가 발생할 것이라 믿습니다. 또한, T2T를 모듈화함으로써 자체 모델을 제공하고 다양한 작업에서 어떻게 수행되는지 매우 쉽게 확인할 수 있게 되었습니다. 이러한 방법으로 전체 커뮤니티가 기본 라이브러리를 활용하고 딥 러닝 연구를 가속화할 수 있습니다. github 저장소로 가서 새로운 모델을 시도하고 자신만의 모델을 제공해보세요!

감사의 말

Tensor2Tensor의 출시는 많은 엔지니어와 연구원의 광범위한 협력 덕분에 가능했습니다. 이 기회를 빌어 공헌해주신 핵심 팀(알파벳 순서)에 감사의 말씀을 전합니다. Samy Bengio, Eugene Brevdo, Francois Chollet, Aidan N. Gomez, Stephan Gouws, Llion Jones, Łukasz Kaiser, Nal Kalchbrenner, Niki Parmar, Ryan Sepassi, Noam Shazeer, Jakob Uszkoreit, Ashish Vaswani.


1. 우리는 이미지 분류(MNIST, CIFAR-10, CIFAR-100, ImageNet), 이미지 캡션(MS COCO), 번역(영어-독일어 및 영어-프랑스어를 포함한 여러 언어를 이용한 WMT), 언어 모델링(LM1B), 파싱(Penn Treebank), 자연어 추론(SNLI), 음성 인식(TIMIT), 알고리즘 문제(대수에 덧셈 및 곱셈을 통해 리버싱에서 십여 가지 이상의 작업)에 대한 다수의 데이터셋을 포함했으며 앞으로도 더 추가할 예정입니다. 여러분의 데이터셋도 언제든 대환영입니다.↩
2. LSTM 시퀀스-to-시퀀스 RNN, 분리 가능한 콘볼루션(예: Xception)도 포함한 콘볼루션 네트워크, ByteNet 또는 Neural GPU와 같이 최근에 연구된 모델, 이 게시글에서 언급한 저장소에서 적극적으로 업데이트할 예정인 새로운 최신 모델 포함.↩




<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 Justin Hong(Google)님이 참여해 주셨습니다.>
게시자: Wayne Piekarski, IoT 디벨로퍼 어드보케

오늘 우리는 Android Things Console의 프리뷰를 출시합니다. 개발자는 이 콘솔을 통해 공장 출고 시 이미지를 생성하고 운영체제 및 개발자가 제공하는 APK의 업데이트를 비롯해, Android Things IoT 기기에서 실행되는 소프트웨어를 관리할 수 있습니다. 기기가 곧 제공될 예정인 Developer Preview 5와 같은 향후 업데이트를 받으려면 Android Things Console을 통해 다운로드한 시스템 이미지를 기기에 플래싱 해두어야 합니다. Google은 OTA(Over-The-Air) 업데이트를 지원하는 인프라를 모두 제공하므로, 개발자로서는 자신의 특정 애플리케이션에 집중할 수 있으며 이전보다 더욱 빠르고 안정적으로 시장에 진입하기 위해 OTA 인프라를 자체적으로 만들 필요가 없습니다.

콘솔을 살펴보고 콘솔이 제공하는 기능을 알아보도록 하겠습니다.

제품 제작 및 제품 설정

개발자는 먼저 기기의 기반이 되는 SoM(System-on-Module)의 유형과 이름을 선택하는 과정을 포함하는 제품 정의 단계부터 시작합니다. 많은 개발자가 IoT 기기를 빌드할 때 Google Play 서비스를 사용하고 싶어 하는데, 이 콘솔에서는 옵션 기능으로 구성됩니다. OEM 파티션 크기도 구성되는데, 향후 확장되는 APK 크기를 포함할 수 있을 정도로 커야 합니다.

시스템 이미지

기기가 콘솔로부터 올바른 제품에 대한 향후 업데이트를 받으려면 초기 기본 펌웨어가 필요합니다. 초보자의 경우, 단순하게 'Create Build Configuration'을 사용하여 제품에 맞게 구성된 빈 번들이 포함된 기본 공장 출고 시 이미지를 빌드할 수 있습니다. 그런 다음 이 시스템 이미지를 기기로 다운로드하여 플래싱할 수 있고, APK를 테스트용으로 사이드로딩하여 개발 작업을 시작할 수 있습니다.

이후에 기기에 배포할 애플리케이션 준비가 끝나면 번들 ZIP 파일을 콘솔로 업로드할 수 있습니다. 이 번들은 기본 APK 파일과 APK에서 서비스로 제공되는 사용자 공간 드라이버, 그리고 기본 APK에서 실행되는 추가 APK를 모두 포함하는 ZIP 파일이며 부팅 중에 표시되는 bootanimation.zip 파일도 포함됩니다. 이렇게 업로드된 번들 파일은 기기에 배포할 수 있는 완전한 시스템 이미지의 생성에 사용됩니다. 번들 파일 콘텐츠에 대한 자세한 내용은 관련 문서에서 확인할 수 있습니다.

OTA 업데이트

이 탭에서는 개발자가 기기 그룹에 푸시할 시스템 이미지를 선택할 수 있습니다. 개발자가 한 시스템 이미지를 선택한 후 'Push to Devices'를 실행하면 프로세스가 시작됩니다. 그러면 이 이미지가 모든 기기로 안전하게 푸시되고 A/B 파티션 중 하나에 설치된 후 기기가 재부팅될 때 활성화됩니다. 장애가 감지되면 기기가 이전에 정상 작동한 것으로 알려진 버전으로 자동으로 롤백되므로 향후 업데이트가 계속 가능합니다. 개발자는 Android Things의 새 릴리스를 사전에 테스트한 후 기기를 자동으로 업데이트할지 결정할 수 있습니다.

피드백

Android Things Console은 현재 프리뷰로 제공되고 있으며, 더 많은 기능과 사용자 지정 옵션을 추가하기 위해 노력하고 있습니다. Android Things 개발자께서는 모두 Android Things Console을 사용해보고 피드백을 주시면 감사하겠습니다. 버그 신고기능 요청을 작성하고 Stack Overflow에 질문 사항을 올리는 방법으로 피드백을 제공해 주실 수 있습니다. Android Things Console에 대해 더 자세히 알아보려면 다음의 상세 문서를 검토하시기 바랍니다. 또한, Google+를 통해 최신 정보를 구하고 아이디어를 토론할 수 있으니 Google IoT 개발자 커뮤니티에 가입하시기를 권해 드립니다.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 정승욱(Android GDE)님이 참여해 주셨습니다.>
많은 Firebase 개발자들은 대개 Android, iOS 또는 웹용이거나 이 세 가지를 전부 지원하는 앱 자체에만 집중합니다. 저처럼 개발 업무 중 클라이언트 측에서 대부분의 시간을 보내는 분이라면, 백엔드 구성 요소를 다루는 일 역시 번거로울 수 있습니다. 이제 Cloud Functions for Firebase를 사용하여 서버를 관리할 필요 없이 자바스크립트로 아주 쉽고 재미있게 백엔드 코드를 작성하고 배포할 수 있습니다. 개인적으로 제가 편하게 느끼는 개발 환경은 Android입니다. 그래서 저는 Cloud Functions를 파악하기 위해 자바스크립트 공부를 다시 하고 Cloud Functions가 백엔드 코드 실행에 사용하는 node.js를 배우는 시간을 보냈습니다.

Promise 소개

그 과정에서 저는 자바스크립트에서 비동기 작업을 관리하는 새로운 방법을 배웠습니다. 브라우저에서 자바스크립트로 작업해봤거나 Cloud Functions로 작업한 경험이 있는 분이라면 이미 Promise라고 하는 클래스에 익숙하실 겁니다. Promise는 비동기 작업을 처리할 수 있는 매우 일반적인 방법입니다. Android 개발자에게 가장 쉽게 이해되는 개념으로 설명하자면, Firebase API를 다룰 때 가끔 사용하는 Task API와 비슷한 것이라 생각하시면 됩니다.

Promise를 사용하면 데이터베이스 쓰기 또는 네트워크 요청과 같이 비동기식으로 실행하는 작업 단위에 응답할 수 있습니다. Cloud Functions는 Promise를 인식합니다. 어떤 함수가 비동기 작업 중에 계속 활성 상태를 유지하도록 하려면 이 함수에서 Promise를 반환하는 방법을 쓰면 됩니다(클라이언트로 응답을 전송해야 하는 HTTP/S 트리거는 예외). Promise를 반환할 때는 해당 함수에서 수행되는 모든 비동기 작업이 완전히 완료된 후 "확인"되는 Promise를 반환해야 합니다. 많은 개발자들이 Firebase YouTube 채널의 동영상이 Cloud Functions에서 Promise의 작동 방식을 이해하는 데 무척 유용하다는 사실을 깨달았습니다.


이 동영상에서는 Jen이 Promise를 다룰 수 있는 두 가지 기본 방법에 대해 설명합니다. 첫째, Promise에 then() 메서드를 사용하여 작업 항목을 순차적으로 연결하는 방법이 있습니다. 여기서는 다음 작업 항목이 이전 항목 결과의 영향을 받습니다. 둘째, Promise.all() 메서드가 있습니다. 이 메서드는 병렬로 발생하는 여러 작업 항목이 모두 완료된 후 확인되는 새 Promise를 생성합니다. 이 두 메커니즘을 적절히 활용하여 함수에서 일반적으로 수행되는 대부분의 작업을 관리할 수 있습니다. 작업이 완료되면 Cloud Functions 환경이 정리할 시점을 알 수 있도록 함수에서 최종 Promise를 반환합니다.

ECONNRESET 때문에 힘드셨나요?

단순한 함수에서는 무척 쉽사리 효과를 볼 수 있습니다. 하지만 저 자신을 비롯한 많은 개발자들은 Promise를 많이 포함한 많은 작업을 진행할 때 복잡한 함수는 정말 관리하기 어렵다는 점을 뼈저리게 느끼게 되었습니다. 제대로 관리되지 않는 Promise로 인해 나타나는 증상 중 하나는 Firebase 콘솔의 함수 로그에 다음 오류가 표시되는 것입니다.

Error: read ECONNRESET

이 오류는 몇 가지 상이한 점을 의미할 수 있습니다. 어떤 경우에는 클라이언트 라이브러리에 버그가 발생한 것일 수 있습니다. 또 어떤 경우에는 Promise를 다룰 때의 흔한 실수로 인해 나타나는 증상입니다.

네트워크 연결이 완료되기 전에 함수가 종료되는 경우 열려 있는 연결을 강제로 차단할 수 있다는 뜻이며, 이때 로그에는 ECONNRESET이 남습니다. 다음은 이러한 오류가 발생할 수 있는 상황입니다.

비동기 작업 중 세 가지 항목을 시작하려고 하는데, 작업 완료 시 확인되는 Promise를 반환하는 doSomeAsync()라는 함수에서 작업이 시작되고, 다음과 같이 세 번째 작업에서 Promise를 반환한다고 생각해 봅시다.

doSomeAsync(x)
doSomeAsync(y)
return doSomeAsync(z)

이 함수에서 Promise를 반환하는 것은 좋습니다. 하지만 Cloud Functions에는 모든 작업이 완전히 완료된 후 확인되는 새 Promise가 필요합니다. 마지막 작업 항목이 항상 다른 두 작업 항목 이후에 끝나리라는 보장이 없으면 Cloud Functions가 함수를 일찍 정리하며, 이로 인해 문제가 발생할 수 있습니다. 대신, 다음과 같이 모든 작업의 모든 Promise를 다른 모든 Promise가 확인된 후에만확인되는 새 Promise로 결합해야 합니다.

const promise_x = doSomeAsync(x)
const promise_y = doSomeAsync(y)
const promise_z = doSomeAsync(z)
return Promise.all([promise_x, promise_y, promise_z])

개발자가 함수에서 시작하는 비동기 작업의 모든 항목을 일일이 추적하지 않을 경우, 로그에 두려워하던 ECONNRESET 오류가 표시될 수 있으며 작업 항목이 예상대로 작동하지 않을 수 있습니다. 모든 Promise를 유지하려면 실제로 약간 부지런을 떨어야 할 수도 있습니다!

더 복잡한 함수의 예를 보고 싶으면 Google I/O '17에서 제가 진행한 세션에서 작성한 오픈소스 tic-tac-toe 웹 게임을 참조하시기 바랍니다. 이를 통해 Firebase를 사용하여 전체적으로 어떻게 빌드했는지 알 수 있을 것입니다.


Cloud Functions 및 기타 Firebase 제품에 대한 추가 가이드 및 콘텐츠는 YouTube Firebase 채널Firebase 블로그를 확인하시기 바랍니다.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 김태호(Google)님이 참여해 주셨습니다.>
7,000명이 넘는 개발자들이 쇼어라인 앰피시어터(Shoreline Amphitheater)에서 열린 올해의 Google I/O에 참가하면서 이곳 마운틴 뷰는 정말 숨가쁘게 돌아갔습니다. 우리는 여러 가지 중요한 제품 발표를 진행했지만 그중에서도 특히 새롭게 리디자인된 AdMob이 가장 기대되는 제품입니다!

많은 개발자 여러분이 수익을 창출하기 위해 인앱 광고를 활용하고 있습니다. 실제로 백만 개가 넘는 앱이 현재 AdMob을 사용하여 iOS 및 Android 환경에서 수익을 내고 있습니다. 그리고 지금까지 Google이 여러분과 같은 개발자들에게 지불한 금액이 35억 달러를 넘어섰습니다. 하지만 우리는 개발자 여러분의 성공을 돕기 위해 훨씬 더 많은 일을 할 수 있을 것이라는 점을 알고 있었습니다. 그래서 개발자가 수익성 있는 사업을 더욱 빠르게 구축하고 규모를 확장해도 수익성을 유지할 수 있도록 AdMob 플랫폼을 처음부터 다시 빌드했습니다.

새로운 사용자 인터페이스를 통한 사용 편의성 실현

개발자의 시간은 일분일초가 값진 것이죠. 그래서 개발자가 Google 화면 탐색이 아니라, 비즈니스 성장에 그 소중한 시간을 쓰실 수 있도록 하고 싶습니다. 새로운 AdMob에서는 탐색에서 대시보드까지 모든 점이 개발자 앱을 중심으로 구성되었습니다. 가장 필요한 도구와 기능이 바로 사용할 수 있게 제공됩니다. 또한, 전체 AdMob 플랫폼에 걸쳐 머티리얼 디자인을 적용함으로써 모든 단계에서 개발자 환경이 직관적이고 생산적일 수 있도록 했습니다.

새로운 환경에 로그인하면 핵심 성장 추세를 드러내고 앱의 성능을 간략히 보여 주는 스냅샷을 제공하는 간소화된 인터페이스를 볼 수 있을 것입니다. 앱이 하나만 있든 50개가 있든, 새로 제공되는 앱 선택기로 새로워진 AdMob 환경을 빠르게 탐색할 수 있습니다. 뿐만 아니라, 수익을 완벽 분석한 정보를 제공하는 단순화된 대시보드도 추가했습니다. 여기서 개발자는 광고가 각 앱의 평생 가치, 참여율 및 점유율과 같은 중요한 지표에 어떤 영향을 미치는지 파악할 수 있습니다.
필요한 정보를 더욱 쉽게 찾을 수 있도록 새로워진 AdMob

Firebase와의 긴밀한 통합으로 더욱 풍성해진 통찰력

개발자는 앱 비즈니스의 수익 창출에 관한 한 여러 가지 다양한 옵션이 있음을 저희는 잘 알고 있습니다. 인앱 구매, 구독, 광고 또는 상거래 중 어떤 걸 사용하기로 결정하시든, 의사 결정을 내리고 아주 작은 수익 창출 변화가 사용자 환경에 어떤 식으로 영향을 미칠 수 있는지 모니터링하는 데 전체 상황을 볼 수 있는 기능이 얼마나 유용한지도 잘 알고 있습니다. 예전에는 이러한 데이터 전체를 컴파일하는 데 여러 가지 도구가 필요했답니다. 대부분의 경우엔 이런 작업이 불가능했고, 그나마 가능한 경우라도 시간이 많이 걸렸습니다. 그래서 Google은 Firebase용 Google 애널리틱스와의 통합을 통해 포괄적인 분석 기능을 즉시 사용할 수 있도록 추가했습니다.

이러한 통합을 통해 모든 수익원에 대한 새로운 보고를 볼 수 있으며 Firebase에 더욱 깊이 들어가면 평생 가치와 사용자 행동이 어떤 식으로 영향을 받는지를 파악할 수 있습니다.

시작하려면 AdMob 계정과 Firebase 계정을 연결하고 최신 버전의 SDK로 업데이트하세요. 계정을 연결하고 나면 자세한 광고 수익 데이터와 함께 인앱 구매 및 앱에 소비된 시간과 같은 사용자 정보를 모두 한 곳에서 액세스할 수 있게 됩니다. Firebase 계정은 이제 광고 신호에 액세스할 수 있으며 AdMob은 앱 사용량 신호에 액세스하여 더 깊은 수준의 분석 정보를 확보할 수 있습니다. 자세한 광고 수익 데이터는 물론, 세션 기간 및 광고 노출과 같은 소비자 정보를 즉각적으로 액세스할 수 있으므로 더 이상 끝없는 스프레드시트를 처리하거나 어림짐작할 필요가 없습니다.
올바른 데이터가 한 곳에서 모여 있으므로 더욱 현명한 수익 창출 전략을 구현할 수 있습니다.

평생 가치를 더욱 완벽하게 보여 주는 뷰가 제공되므로 이제 확신을 가지고 수익 창출 전략 구축에 필요한 데이터를 확보할 수 있습니다. Byss Mobile의 공동 창업자 Marcin Krakowiak는 이미 팬이 되었습니다. "우리는 앱 포트폴리오를 계속해서 다각화하고 있으므로 지속 가능한 수익 창출 전략을 구축하는 것이 우리 팀의 역점 과제였습니다. 의미 있고 정확하게 연결된 데이터 소스의 확보가 바로 이러한 전략 개발에 핵심적인 요소입니다. 이번에 Firebase와 AdMob이 새롭게 통합되면서 가능해진 일입니다. 마침내 인앱 구매와 광고 모두에 대한 평생 가치를 분석하여 수익성이 더욱 높은 수익 창출 전략을 테스트하고 구축할 수 있게 되었습니다."

미디에이션 그룹을 이용한 확장에 도움이 되는 고급 컨트롤

이미 AdMob을 사용하고 있다면 미디에이션(Mediation)이 여러 광고 네트워크에서 수익을 창출할 수 있는 훌륭한 방법이라는 사실을 알고 계실 겁니다. 미디에이션 기능은 미디에이션 그룹이 추가됨에 따라 훨씬 더 좋아졌습니다.

예전에는 모든 광고 슬롯과 지역에 대한 미디에이션을 구성해야 했습니다. 미디에이션을 사용하는 개발자들은 이 과정에서 시간이 상당히 소비된다는 사실을 발견하는 경우가 종종 있었습니다. 이러한 작업을 더욱 용이하게 하기 위해 AdMob에 미디에이션 그룹을 추가했습니다. 미디에이션은 한 번만 설정한 후 전체 앱에 걸쳐 여러 광고 단위 및 국가에 해당 그룹을 한 번에 할당하기만 하면 됩니다. 개발자 여러분은 미디에이션 체인에서 최대 3회까지 아웃바운드 네트워크에 대한 호출을 수행하여 수익 극대화에 도움을 받을 수 있습니다.
단 몇 번의 클릭만으로 새로운 미디에이션 그룹을 설정하고 활성화할 수 있습니다.

개발자 여러분이 미디에이션 그룹은 물론, 리디자인된 AdMob 플랫폼이 제공할 기타 모든 기능을 활용하시기를 바랍니다. 이러한 기능은 모두 개발자를 염두에 두고 마련된 것이기 때문입니다! 저희는 앱 개발자의 성공을 뒷받침할 준비가 되어 있으며, 개발자 여러분이 비즈니스 성장에 이러한 새로운 도구를 활용하는 다양한 방법을 지켜보는 기쁨을 누렸으면 합니다. Google의 새로운 수익 창출 도구를 활용하여 AdMob을 사용하는 수백만 개 앱 네트워크에 참여해 보세요.

도움말 센터를 방문하거나 Google 계정 팀에 연락해 이런 훌륭한 기능을 언제 이용할 수 있게 될지 확인해 보시기 바랍니다.

게시자: Duke Dukellis, AdMob 그룹 제품 관리자











<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.>
게시자: Xiaowen Xin 및 Renu Chaudhary, Android 보안 팀

외부 콘텐츠를 잘 표시하는 것이 핵심 기능인 앱들이 있습니다. 뉴스 리더 앱은 주요 뉴스 기사를 보여주고, 쇼핑 앱은 판매 제품의 목록을 표시해야 합니다. 이런 경우, 신뢰할 수 없는 외부 콘텐츠를 잘 처리하는 것이 정말 중요합니다. 공격자가 즐겨 사용하는 방식 중 하나는 잘못된 형식의 콘텐츠를 전달하는 것 입니다. 이에 올바르게 대처하지 못하면, 앱의 동작이 잘못되거나 주요한 정보가 노출 될 위험이 있습니다.

많은 안드로이드 앱이 WebView를 사용하여 신뢰할 수 없는 콘텐츠를 다루고 있습니다. 구글은 악성 콘텐츠에 의해 다른 콘텐츠나 앱이 손상되지 않도록 수년에 다양한 개선 작업을 진행 해왔습니다. 안드로이드 롤리팝 버전부터 WebView를 독립된 APK로 제공하고 있으며, Play Store에서는 6주마다 WebView 업데이트를 진행하여 사용자에게 신속하게 중요 수정 사항을 제공하고 있습니다. 이에 더 나아가, 새롭게 소개되는 최신 WebView에서는 중요한 보안 관련 기능 두 가지가 소개되었습니다.

안드로이드 O에서 렌더러 프로세스 격리

안드로이드 O부터는 WebView의 렌더러가 호스트 앱과 별개의 격리된 프로세스에서 실행됩니다.

<크롬(Chrome)과 유사하게, WebView는 이제 두 단계로 격리되며 더 향상된 보안을 제공합니다.>
  1. 렌더링 엔진이 별개의 프로세스로 분할됩니다. 이는 호스트 앱을 렌더러 프로세스에서 발생하는 버그 또는 비정상 종료로부터 보호하고, 렌더러를 악용할 수 있는 악성 웹사이트가 호스트 앱을 악용하기 더욱 어렵게 만듭니다.
  2. 이를 더 강화하기 위해, 렌더러 프로세스는 한정된 권한을 갖은 격리된 프로세스 샌드박스 내에서 실행됩니다. 예를 들어, 렌더링 엔진은 자체적으로 디스크에 쓰거나 네트워크와 통신할 수 없습니다.
    또한, 렌더링 엔진은 안드로이드 환경의 크롬에서 사용하는 것과 동일한 seccomp 필터(seccomp에 대한 블로그 게시물을 곧 발표할 예정임)에도 바인딩됩니다. seccomp 필터는 렌더러 프로세스가 액세스할 수 있는 시스템 API의 종류와 기능을 제한 할 수 있습니다.

세이프 브라우징 통합

최신 버전의 WebView에는 잠재적으로 위험할 수 있는 사이트를 감지하여 사용자에게 경고하는 구글의 세이프 브라우징 기능이 통합되었습니다. 올바르게 구성된 WebView는 세이프 브라우징의 멀웨어 및 피싱 데이터베이스를 바탕으로 요청된 URL을 검사하고 사용자가 위험한 사이트를 방문하기 전에 경고 메시지를 표시합니다. 크롬의 경우 한 달에 2억 5천만 건 이상의 요청이 세이프 브라우징 기능의 혜택을 받고 있습니다. 이제는 안드로이드 WebView에서도 이러한 정보를 확인할 수 있습니다.

세이프 브라우징 활성화


앱의 모든 WebView에 대해 세이프 브라우징을 활성화하려면 매니페스트 태그에 다음을 추가하세요.
<manifest>
     <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                android:value="true" />
      . . .
     <application> . . . </application>
</manifest>

WebView는 별도의 APK로 배포되므로, Android 5.0 이상을 실행하는 기기에서 현재 WebView용 세이프 브라우징을 이용할 수 있습니다. 매니페스트에 단 한 줄만 추가하여 앱을 업데이트하고 대부분의 사용자들을 보호할 수 있도록 보안을 즉시 강화할 수 있습니다.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 문현경(Web Technologies GDE)님이 참여해 주셨습니다.>

별도의 언급이 없는 한, 아래에 기술된 변경 사항은 Android, Chrome OS, Linux, Mac, Windows용 최신 Chrome 베타 채널 릴리스에 적용됩니다.

Paint Timing API

모든 경우에 페이지가 로드되는 시점을 완벽하게 캡쳐하는 일반화된 측정항목은 없지만 First Paint(FP) 와 First Contentful Paint(FCP) 는 로드하는 동안 중요한 사용자 모멘트를 측정하는 데 유용한 값입니다. 사이트의 로드 성능에 대해 더 나은 통찰력을 개발자에게 제공하기 위해 새 Paint Timing API는 First Paint(FP) 와 First Contentful Paint(FCP)를 캡처하는 측정항목을 제공합니다.

Screen Shot 2017-06-08 at 8.57.03 AM.png
Google I/O 2017의 “웹 성능: 사용자 환경에 가장 많은 영향을 미치는 측정항목 활용”세션 중 Google.com 페이지의 First Paint(FP)와 First Contentful Paint(FCP)

CSS font-display

다운로드 가능한 웹 글꼴은 시각적으로 풍부한 웹 환경을 생성하기 위해 자주 사용됩니다. 역사적으로, Chrome은 시각적 정확성을 위해 지정된 글꼴을 사용할 수 있을 때까지 텍스트 렌더링을 지연시켰습니다. 그러나 연결 상태가 좋지 않으면 글꼴을 다운로드하는 데 몇 초 정도 걸리고 사용자에게 콘텐츠가 보일 때까지 시간이 상당히 지연될 수 있습니다. 이제 Chrome은 CSS @font-face 설명자와 해당 font-display 속성을 지원하므로, 개발자가 글꼴을 다운로드하는 동안 Chrome이 텍스트 콘텐츠를 표시하는 방법과 시간을 지정할 수 있습니다. 

Credential Management API 개선 사항

개발자 의견을 반영하여 모든 사이트에서 Credential Management API를 더 쉽게 사용할 수 있도록, 사용자설정 fetch()를 통해 저장된 비밀번호에 액세스하는 기능은 이제 지원 중단되었습니다. Chrome 60부터 사용자의 비밀번호가 PasswordCredential의 일부로 직접 반환됩니다.

또한, Web Authentication Working Group에서 수행 중인 작업에 더 잘 부합하도록 일련의 변경 작업을 단행했습니다. 여기에는 requireUserMediation의 지원 중단이 포함되며, 해당 이름이 preventSilentAccess로 변경되었습니다.

이번 릴리스에 포함된 기타 기능

  • 이제 Chrome의 데스크톱 버전에서 Payment Request API가 지원됩니다. 
  • 이제 사이트에서 Payment Request API를 사용하여 네이티브 결제 앱을 통해 결제를 처리할 수 있습니다. 
  • 이제 Object rest 와 spread 프로퍼티를 지원합니다. 객체를 병합 및 부분 복제(shallow-clone)하고 다양한 불변 객체 패턴을 더욱 간단하게 구현할 수 있습니다. 
  • Web Budget API를 사용하면 사용자에게 알림을 표시하지 않고 푸시 알림 권한이 있는 사이트에서 데이터 동기화 또는 사용자기 다른 기기에서 처리한 알림 닫기 등의 백그라운드 작업을 트리거하는 제한된 수의 푸시 메시지를 보낼 수 있습니다. 
  • 이제 새로운 웹 푸시 암호화 형식이 지원되며 PushManager.supportedContentEncodings를 사용하여 이 형식을 사용할 수 있는 장소를 탐지할 수 있습니다. 
  • 이제 사이트의 구독이 만료되는지 여부와 그 시기를 알려주는 PushSubscription.expirationTime을 사용할 수 있습니다. 
  • 성능과 예측 가능성을 개선하기 위해 이제 pointermovemousemove 이벤트가 각 AnimationFrame 마다 한 번씩 전달되며, 이는 현재의 scrollTouchEvents 기능과 일치합니다.
  • 이제 :focus-within CSS 의사 클래스(pseudo-class)를 사용할 수 있습니다. 이 클래스는 :focus 의사 클래스가 영향을 미치는 모든 요소에 영향을 미칠 뿐만 아니라 :focus에 의해 영향을 받는 하위 항목이 있는 모든 요소에도 영향을 미칩니다. 
  • 이제 CSS 프레임 타이밍 함수를 사용할 수 있습니다. 이 함수는 애니메이션이 첫 번째 및 마지막 프레임을 포함하여 정확히 똑같은 길이로 모든 프레임을 표시해야 하는 애니메이션 루프에 유용합니다. 
  • 편집 작업을 캡처하는 다양한 방법을 제공하기 위해 이제 InputEvent를 통해 사용자 입력을 스크립트로 관리할 수 있으며, 편집 가능한 요소에 제공되는 세부사항을 개선할 수 있습니다. 
  • 보안 강화를 위해, 사용자가 사이트를 떠날 때 트리거되는 BeforeUnload 대화상자가 이제 이를 표시하려고 시도하는 프레임이 사용자 동작이나 사용자 상호작용을 받은 경우에만 표시됩니다. BeforeUnloadEvent는 이에 상관없이 계속 발송됩니다. 
  • 이제 무료 오픈 동영상 코딩 형식인 VP9을 MP4(ISO BMFF) 컨테이너와 함께 사용할 수 있고 아래 언급된 새 VP9 문자열 형식이 필요합니다. 
  • 이제 새 VP9 문자열 형식을 사용할 수 있고 다양한 미디어 관련 API에서 허용되므로, 개발자가 동영상 코덱에서는 일반적이지만 아직 노출되지 않은 인코딩 속성을 설명할 수 있습니다.

지원 중단 및 상호 운용성 개선 사항

  • getElementsByTagName()에서 이제 DOM 사양업데이트를 반영하여 정규화된 이름을 허용합니다. 
  • /deep/은 이제 하위 항목 연결자처럼 동작하며, 이는 사실상 무작동(no-op)입니다. 
  • 이제 사용자 환경을 개선하기 위해 Navigator.vibrate()를 호출하면 사용자가 프레임이나 포함된 프레임을 명시적으로 탭한 경우를 제외하고 즉시 false를 반환하여 교차 원점(cross-origin) iframe에 대해 기존 동작을 일치시킵니다. 
  • WEBKIT_KEYFRAME_RULE 및 WEBKIT_KEYFRAMES_RULE이 제거되고 접두사가 없는 표준화된 API인 KEYFRAME_RULEKEYFRAMES_RULE로 대체되었습니다. 
  • 비표준 WebKitAnimationEventWebKitTransitionEvent에 대한 지원이 document.createEvent()에서 제거되었습니다. 
  • 사양과 더 잘 부합하도록, NodeIterator.filterTreeWalker.filter가 더 이상 JavaScript 객체를 래핑하지 않고, .prototypewindow.NodeFilter에서 제거되었습니다. 
  • RTCPeerConnection.getStreamById()가 제거되고 그 대안으로 폴리필이 권장됩니다. 
  • SVGPathElement.getPathSegAtLength()가 지원 중단되었습니다. 그 이유는 SVGPathElement 사양에서 제거되었기 때문입니다. 
  • Headers.prototype.getAll()이 사양에서 제거되고 그에 따라 Fetch API에서 제거되었습니다. 
게시자: Shubhie Panicker, 페인트 타이밍 프로모터


작성자: 권순선, 아태지역 개발자 생태계 총괄 (Head of APAC Ecosystem, Developer Relations)

머신러닝은 이제 구글의 거의 모든 제품에서 다양하게 쓰이면서 많은 사용자들에게 편리하고 유용한 기능을 제공하고 있습니다. 이에 구글은 TensorFlow 머신러닝 프레임워크를 오픈소스로 공개하고 이를 클라우드에서 이용할 수 있는 Cloud ML을 제공하고 있을 뿐만 아니라 Vision API, Translation API 등 머신러닝 기술을 이용한 다양한 API들도 함께 제공하면서 전세계의 더욱 많은 개발자들이 머신러닝 관련 기술을 이용할 수 있도록 하는데도 많은 노력을 기울이고 있습니다.

머신러닝에 관심을 가지는 개발자들이 늘어나면서 한국에서는 TensorFlow Korea 사용자 모임에서 많은 개발자들이 다양한 정보를 공유하고 지식과 경험을 공유하고 있습니다. 이 TensorFlow Korea 사용자 모임의 주도로 7월 한달 동안 제주에서 전세계의 개발자들이 함께 모여 머신러닝 관련 기술을 함께 개발하는 머신러닝 캠프 제주 2017(이하 캠프)이라는 행사가 열리는데요. 구글도 여기에 카카오, 제주특별자치도, 국립제주대학교, 제주창조경제혁신센터와 함께 이 캠프를 후원하게 되어 매우 기쁘고 또 영광스럽게 생각합니다.
이 캠프에 선발된 개발자는 총 20명이며 여기에 멘토들이 함께하는데 총 633명이 캠프에 지원하였고 그중 절반 이상은 해외에서 신청하여 참석자를 선정하는데 매우 어려움이 있었습니다만 그만큼 많은 분들이 관심과 열의를 가지고 지원해 주셔서 또 기쁜 일이기도 했습니다. 최종 선발된 20명 중에서도 중국, 미국, 독일, 홍콩, 인도, 터키, 스웨덴, 헝가리 등 다양한 국적의 개발자들이 포함되어 명실공히 국제적인 규모가 되었습니다. (선정된 참석자들에게는 항공과 숙소 등이 모두 제공되며 머신러닝 개발에 필요한 구글 클라우드 크레딧도 함께 제공됩니다.)

20170703_102626.jpg
<‘머신러닝 캠프 제주 2017’ 참가자들의 단체 사진>
캠프는 7월 3일에 시작되어 7월 28일에 참석자들이 그동안 개발한 결과물들을 공유하게 되는데 음성인식, 기계번역, 이미지 생성, 이미지 분석, 자율주행 등 다양한 분야를 대상으로 머신러닝 관련 기술들이 TensorFlow를 이용하여 개발될 예정이며 그 과정에서 개발된 코드들은 모두 GitHub에 공개될 예정입니다. 전체 프로젝트 목록은 여기에서 보실 수 있습니다.

IMG_20170703_103014.jpg
<’머신러닝 캠프 제주 2017'의 첫 세션에 참가하고 있는 참가 개발자들>

7월 10일에는 캠프 참여자뿐만 아니라 국내외의 머신러닝 연구자/개발자들이 함께 참여하는 머신러닝 컨퍼런스도 개최됩니다. 여기에는 구글 브레인을 이끌고 있는 제프 딘(Jeff Dean) 시니어 펠로우와, 구글 브레인 내에서 텐서플로 팀을 이끌고 있는 라잣 몬가(Rajat Monga) 엔지니어링 디렉터가 화상 연결을 통해 참여할 예정이며, 조경현 뉴욕대 교수, 이홍락 미시건대 교수/구글 브레인팀 방문 과학자, 임재환 서던캘리포니아대 교수, 경기대학교의 최예림 교수 등 머신러닝 학계의 유명 석학이 함께 참여하여 머신러닝의 현재와 미래를 조망해보는 뜻깊은 시간을 가질 예정입니다. 머신러닝 컨퍼런스 참석을 희망하시는 분들은 온오프믹스에서 신청하실 수 있습니다.

또한 7월 11일과 25일에는 머신러닝에 관한 기초적인 교육 프로그램인 머신러닝 학습 캠프가 열리는데, 여기서는 처음 접하는 분들을 위해 머신러닝과 TensorFlow에 관한 기초적이고 간단한 내용을 다루어 보게 됩니다. 머신러닝 학습 캠프 참석자도 온오프믹스를 통해 추후 모집할 예정이니 많은 관심 부탁드립니다.

이번 머신러닝 캠프 제주 2017을 통해 다양하고 유용한 결과물들이 개발되고 이 과정에서 참석자들이 즐겁고도 유용한 시간을 보낼 수 있기를 기원합니다. 다시 한번, 이 의미있는 행사에 구글도 함께할 수 있게 되어 진심으로 기쁘게 생각합니다.