프로그래밍 381

[Python] SlackBot 쉽게 만들기

오늘 소개할 것은 Slack Bolt다. Slack Bolt 이전에는 슬랙봇을 만들기 위해 Redirect URL을 App에 정의 해주어야 했고, 그렇기 때문에 도메인도 필요하고 LocalHost에서 돌릴려면 ngrok 같은 서비스도 부가적으로 이용해야 했다. 웹 애플리케이션을 만들어야 했던건 덤이다 ㅎ... 하지만 이 모든것은 Bolt선에서 모두 정리된다! 두-둥 시작하기 슬랙 앱 만들기 봇 토큰 Scope 요청해서 토큰 발급받기 위 2가지 과정이 선행되어야 함은 기존과 변함없다. 하지만 Socket Mode를 켜줘야하는 추가 설정이 필요하다. Socket Mode는 우리의 봇이 HTTP 엔드포인트를 노출하지 않고도 작동할 수 있게 해준다. 설령 봇이 방화벽 뒤에있더라도 말이다. Socket Mode를..

[VideoJS] 영상 타임라인에 프리뷰를 표시하는 방법

유튜브나 트위치에서 SeekBar에 마우스를 가져다대면, 특정 주기마다 영상 프리뷰가 살짝살짝씩 보인다. 당연히 될거라고 생각했던 기능이지만 이 프리뷰는 (당연히 ㅎㅎ) 손수 만들어주어야한다. 과정은 다음과 같다. 1. 영상을 특정 Interval 마다 잘라서 썸네일을 만든다. 2. 만들어진 썸네일을 한 장의 Sprite 이미지로 만든다. 3. VideoJS에 videojs-sprite-thumbnails Plugin을 적용해서 Sprite를 영상에 설정해준다. 나는 ts파일이 이미 10초 단위로 쪼개져있었기 때문에 폴더안의 모든 파일을 돌면서 한 장씩 썸네일을 만들어주었다. ffmpeg -i -s 160x90 -vframes 1 .jpg 그리고 만들어진 사진들을 imagemagick의 montage를 ..

영상자막을 채팅처럼 표현하기

DASHI 서비스를 계속 발전시키는 도중에, 트위치 채팅도 다시볼 수 있었으면 좋겠다고 생각했다. 문제는 채팅이 영상과 맞게 정확한 시간에 올라와야한다는 건데, 그래서 채팅을 WebVTT로 만들었다. 즉 영상 자막이 된다는 건데, 일반적인 영상 자막처럼이 아니라 세로로 스크롤하며 올라오는 채팅포맷이어야 했다. var track = video.textTracks[0]; track.oncuechange = function() { var cue = this.activeCues[0]; if (cue) { console.log(cue.text); } }; 영상에 자막을 추가하고, 영상자막이 변경될때마다 console에 로그를 찍는 코드다. 이를 이용해서 Container에 채팅 Element를 하나씩 추가하고 스..

DASHI - 트위치 다시보기 부활

2022년 11월 10일 트위치 다시보기 서비스가 사라졌다. 오늘이 19일이니까 1년하고도 정확히 9일지났는데 너무나 불편한게 많아서 견딜 수 없었다 ㅋㅋㅋ 솔직히 1080p 뺏긴건 괜찮다...근데 다시보기는 선 넘었다고 생각함 좋아하는 스트리머가 갑자기 방송을 키거나, 아니면 그 날의 녹화본이 사라지거나 하는 경우가 잦아서 트수는 이 상황을 안타까워하며 분개하며...나만의 다시보기 스트리밍 서비스인 dashi를 어제 하루를 꼬박 투자해서 만들었다. 기능 - Observe하는 스트리머의 방송 녹화: 방송을 한번 켤때마다 하나의 다시보기가 만들어진다. - 지난 방송 리스트: 최대 3일까지의 방송목록을 가지고 있는다. - 최근 잘라보기: 지금은 리밋을 해제에서 처음부터 끝까지 볼 수 있지만, 최근 N시간만 ..

Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by build file 오류 해결방법

오류 해석 빌드가 project/build.gradle에 선언된 repository보다 settings.gradle에 선언된 repositories를 선호하도록 설정되어 있으나, 프로젝트단에서 "maven"이라는 repositories를 선언해버렸다는 의미이다. 원인 내 settings.gradle.kts 파일에는 RepositoriesMode가 FAIL_ON_PROJECT_REPOS로 설정되어 있다. 이 RepositoriesMode는 3가지 종류가 있다. RepositoriesMode.PREFER_PROJECT 기본 값, settings.gradle에 선언된 repositories를 무시하고, project단의 repositories를 참조한다. RepositoriesMode.FAIL_ON_PROJE..

Mainframer - 리모트 서버에서 빌드를 돌려보자

안드로이드 프로젝트 빌드 시간으로 고민하는 사람들이 많을 거라고 생각한다. 좋은 장비가 도움을 줄수는 있지만, 남아도는 좋은 서버가 있다면? (꽤 희망적인 가정인데) Mainframer나 Mirakle을 이용하면 SSH를 통해 리모트 머신에서 프로젝트를 빌드하고 결과를 로컬에 동기화 할 수 있다. 이것이 가능한데에는 rsync가 큰 역할을 한다. 우선 빌드서버와 SSH 연결이 가능한 상태를 가정하도록 하겠다. SSH 연결만 된다면 리모트 머신에서 딱히 준비할 건 없기때문이다. Mainframer Releases 페이지에서 최신 버전의 mainframer.sh를 다운받는다. . └── MyAndroidProject/ ├── app ├── .mainframer/ │ ├── config │ ├── ignore..

Gradle의 이해: Plugin

Plugins 플러그인은 총 3종류로 구분할 수 있다. Gradle Core Plugin Gradle에서 제공하는 플러그인으로 Plugin의 namespace가 org.gradle인 플러그인 들이다. 앞서 보았던 ‘java-library’도 이에 해당한다. Version 정의가 필요 없다. Community Plugin 보통 gradlePluginPortal()에 위치하고 있으며 ID와 Version으로 구성되어 있다. Convention Plugin 로컬에서 직접 구성하는 플러그인이다. 많은 하위 프로젝트가 있는 프로젝트에서, 동일한 빌드 구성 또는 빌드 로직을 반복작업해야하는 번거로움이 생기는데, Convention Plugin을 구성해두면 빌드 구성을 캡슐화해서 단 한줄만으로 원하는 빌드 구성을 적..

Gradle의 이해: Task

Tasks gradle :project:tasks 를 입력하면 프로젝트에서 수행 가능한 Task들을 알 수 있다. Gradle 작업의 중요한 측면은 증분성에 있다. 이는 Gradle이 이전 빌드의 결과를 재사용 할 수 있다는 것을 의미한다. 따라서 프로젝트를 빌드하고 소스 코드의 작은 부분만 변경했다면, 다시 빌드하더라도 다시 수행해야하는 Task들은 처음 빌드보다 적어진다. > Task :app:processProductionDebugGoogleServices UP-TO-DATE > Task :app:productionDebugOssDependencyTask UP-TO-DATE > Task :app:productionDebugOssLicensesTask UP-TO-DATE > Task :app:merg..

Gradle의 이해: build.gradle

The Build Files Gradle이 각 모듈을 빌드할 수 있으려면 build.gradle.kts 파일이 필요하다. Plugin, Extension, Dependencies의 3가지 구성으로 이루어져 있다. Plugin 플러그인은 Gradle Task의 집합이다. 예시로 든 java-library 플러그인은 source set내의 파일들을 “jar” 파일로 빌드하는 Task들이 정의되어있다. 이처럼 플러그인 선언은 하위 프로젝트가 어떻게 빌드될 것인가에 대한 룰을 설정한다. plugins { id("java-library") } Extension Compile할때 특정한 Java 버전이 필요할 수 있다. 이러한 작업을 위해 플러그인은 Extension을 제공한다. java { toolchain.la..