프로그래밍 354

구글 설문지 (Google Forms) 완료시 데이터 외부 API로 전송하기

구글 설문지를 완료했을때 보상을 주거나, 추가 정보를 처리해야 할 일이 있을 수 있다. 그래서 구글 설문지를 완료하면 외부 API로 데이터를 보내는 방법을 정리해보려한다. OAuth Scope 추가하기 먼저 더보기 메뉴에서 [스크립트 편집기]로 진입한다. 외부 API로 요청을 보내기 위해서 아래 scope에 대한 권한이 필요한데, 이것을 정의하려면 appsscript.json을 편집해야한다. "https://www.googleapis.com/auth/script.external_request" 프로젝트 설정 > 편집기에 [appsscript.json 매니페스트 파일 표시] 체크를 하면 편집기에서 appsscript.json이 생긴 것을 볼 수 있을 것이다. { "timeZone": "Asia/Seoul"..

[Kotlin] 클로저(Closure)에 대해 알아보자

Closure와 일반함수의 차이점 Closure는 outer scope에 있는 변수에 접근할 수 있지만, 일반 함수는 그렇지 못하다. 일반 함수는 자신이 정의된 영역 내에서만 변수를 사용할 수 있다. Closure는 함수를 값으로 취급하여 변수에 저장하거나 다른 함수의 인자나 반환값으로 사용할 수 있지만, 일반 함수는 그렇지 못하다. 일반 함수는 이름을 통해서만 호출할 수 있다. Closure는 실행 시점에 생성되고 소멸되지만, 일반 함수는 컴파일 시점에 생성되고 소멸되지 않는다. Closure는 상황에 따라 다른 값을 가질 수 있지만, 일반 함수는 항상 동일한 값을 가진다. Kotlin closure Kotlin에서 Closure는 상위 함수의 영역에 있는 변수에 접근할 수 있는 함수다. Kotlin은..

Kotlin은 왜 나왔고, 왜 Android 공식언어로 채택되었을까?

Kotlin은 어떤 언어? Intelij IDE로 유명한 Jetbrains에서 개발 2017년 구글에서 안드로이드 개발 정식언어로 채택 (왜 채택?) ‘Interoperatablity’ 강조, 틈새를 파고드는 전략 → 기존에 개발된 프로젝트 / 라이브러리를 그대로 사용가능 엄청 특별한건 아님… JVM language들 다 되긴함 Scala / Groovy / Jython… Kotlin In Action: Kotlin의 주요 목표는 더 간결하고, 생산적이면서 안전한 Java의 대안을 제공하는 것. → But Java의 대안에 초점보다는 실용적임 / 간결함 / 안전한 언어에 초점 객체지향 프로그래밍 뿐만아니라 함수형 프로그래밍 스타일도 지원 일급함수(First-class functions) 불변값 (Immu..

vim Cheatsheet

u 뒤로 (Undo) y 복사 (Yank) p 붙여넣기 (Put) c 변경 (Change) d 삭제 (Delete) r 대치 R 단어모두 대치 x 지우기 o 다음줄 삽입 O 이전줄 삽입 w 다음 단어 시작으로 이동 e 다음 단어 끝으로 이동 b 뒤로 한 단어만큼 이동 gg 처음으로 G 끝으로 Ctrl + G 현재 문서에대한 정보 Ctrl + f 다음 페이지 (Forward) Ctrl + b 이전 페이지 (Backward) / 검색 (문서 처음부터) ? 검색 (문서 끝부터) n 다음 검색결과 N 이전 검색결과 :/s/old/new/g 현재 한 줄에있는 old를 new로 변경 :! 외부 명령어 사용 :set nu 라인넘버 보이게 :set hls 검색시 하이라이트 켜기 (highlight search) :se..

VS Code 파란 물결 표시 색상 바꾸기 (flutter const)

Flutter 개발할때 const 키워드를 붙이지 않으면 아주 짜증나는 물결표시가 시선을 강탈한다. 각자 Theme에 따라서 크게 거슬리지 않을때도 있지만, 사진에서 보듯 내 테마는 좀 심했다. ㅋㅋㅋㅋ VS Code settings에서 workbench.colorCustomizations 아래에 editorInfo.foreground 색상을 설정해주면 된다. "workbench.colorCustomizations": { /* 특정 테마만 설정 */ "[Min Dark]": { "editorInfo.foreground":"#58585899" }, /* 전역 설정 */ "editorInfo.foreground":"#58585899", }

[안드로이드] Push할 때마다 Auto-Formatting적용하기 : GitHook으로 코딩 스타일 맞추기

작업환경을 타지 않는 방법의 필요성 코딩 스타일의 일관성은 가독성, 협업에서 중요한 포인트이지만 개인적인 코딩 습관들, 빡빡한 일정들 등으로 인해 지키기 쉽지 않다. IDE에서 저장시에 코드 포맷팅을 해주는 기능들이 있기는 하지만, 작업환경마다 세팅해줘야한다는 단점이 있다. 따라서 어떤 환경에서 작업하더라도 코딩 스타일을 지켜줄 수 있는 방법이 필요했다. (이 원문을 응용하여 작성된 글입니다.) GitHook + ktlint 그것은 바로 GitHook을 이용하는 방법이다. git init을 하면 .git/hook 폴더에는 여러 GitHook 샘플들이 생긴다. 이 경로 안에 내가 Hook을 발생시키기 원하는 시점에 대한 파일을 “확장자 없이” 넣어주면 간단히 Hook 세팅을 할 수 있다. 샘플 파일들은 ...

[CloudFlare] Workers Log 편하게 보는 법

wrangler tail Worker에 찍은 console.log들을 편하게 보고싶은데, CF에서 제공하는 Real-time Logs는 내가 원하는 정보보다 방대하다. 아래는 그 로그의 예시인데, "logs" 부분에 당시 내가 찍은 console.log가 있다면 담기는 식이다. 실패한 요청만 필터링을 거는 등 스마트하게 로그를 보고싶다면 wrangler tail 명령어를 이용하면된다. { "outcome": "ok", "scriptName": "entrypoint", "exceptions": [], "logs": [], // ****** 바로 여기 !! ********* "eventTimestamp": 1675348988505, "event": { "request": { "url": "https://....

[안드로이드] ExoPlayer 깜빡거리거나 검은 화면(Black screen)이 뜰 때

문제발생 Epoxy로 무한 반복되는 배너 캐러셀에 동영상을 적용시키는 중에, 간혹 동영상이 재생될때 검은 화면만뜨고 재생이 안되거나 깜빡이는 문제가 있었다. *하나의 ExoPlayer를 RecyclerView.Adapter에서 재활용해가면서 쓰는 사례다. 정신차리고 setPlayer() Document를 자세히 읽어보니... Player를 다른 View에 붙일때 switchTargetView()를 쓰는걸 추천한다고 되어있다. 하지만 setPlayer()를 직접 쓰고자 할 경우 이전 View에서 Player를 분리하기 위해 setPlayer(null)을 호출하기 이전에 새로운 View에 Player를 연결시켜야 한다. *switchTargetView를 직접 써보려고 했으나, 지원하지 않는 메소드였다. 해결..

[안드로이드] java.lang.IllegalStateException: An instance of OnFlingListener already set 해결

문제 발생 @ModelView(autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT) internal class PagerSnapHelperCarousel @JvmOverloads constructor( context: Context ) : Carousel(context) { init { if (onFlingListener == null) { PagerSnapHelper().attachToRecyclerView(this) } } } Epoxy의 Custom Carousel로 SnapHelper를 붙이는 도중 OnFlingListener가 이미 등록되어있다는 오류가 발생했다. 당연하게도 이유는 RecyclerVIew에 OnFlingListener가 이미 등록되어 있어..

[TypeScript] satisfies 연산자 알아보기

satisfies operator satisfies는 TypeScript 4.9 버전 부터 새롭게 추가된 연산자로, 업캐스팅(up-casting)으로 Type-safety를 보장한다. 💡 업캐스팅? 부모 - 자식 상속관계의 클래스가 있을때 부모 → 자식 방향의 형변환을 다운캐스팅, 자식 → 부모 방향의 형변환을 업캐스팅이라 한다. Parent p = new Parent(); Child c = new Child(); Parent p2 = (Parent) c; // 업캐스팅 Child c2 = (Child) p2; // 다운캐스팅 Typescript의 경우 한 타입이 다른 타입의 값을 모두 포함하고 있으면 상속관계가 된다. 사용 예시를 바로 보자. Versions는 VersionRecord를 satifsfi..