프로그래밍 381

[Rust] Option<T>가 Null보다 나은 이유(번역)

Null의 문제점 Rust에는 다른 많은 프로그래밍 언어에서 있는 Null이 없다. Null은 값이 없음을 의미하는 값이다. Null이 있는 언어에서, 변수는 항상 Null, 또는 Not-null 두가지 상태 중 하나에 있다. Null의 발명자인 Tony Hoare는 2009년 발표 "Null References: The Billion Dollar Mistake"에서 이렇게 얘기했다: "나는 그것을 10억 달러짜리 실수라고 부릅니다. 그 당시 저는 객체 지향 언어에서 참조에 대한 최초의 포괄적인 타입 시스템을 설계하고 있었습니다. 모든 참조의 사용이 컴파일러에 의해 자동으로 검사되도록 보장하는 것이 목표였습니다. 하지만 null 참조를 넣는 유혹을 이기지 못했습니다. 구현하기가 너무 쉽기 때문입니다. 이..

[Rust] Stack과 Heap (번역)

Stack과 Heap 많은 프로그래밍 언어에서는 스택(Stack)과 힙(Heap)에 대해 자주 생각할 필요가 없다. 그러나 시스템 프로그래밍 언어인 Rust에서는 값이 스택에 있거나 힙에 있는지 여부가 언어의 동작 방식과 특정 결정을 내리는 이유에 영향을 미친다. 스택에 대하여 스택과 힙은 모두 런타임(Runtime)에 코드가 사용할 수 있는 메모리의 일부이지만 구조가 다르다. 스택은 값을 가져온 순서대로 저장하고 반대 순서로 값을 제거한다. 이것을 "Last In, First Out" (LIFO)라고 한다. 접시 더미를 생각해보라. 접시를 더 추가하면 더미 위에 놓고 접시가 필요할 때는 가장 위에서 하나씩 가져온다. 중간이나 바닥에서 접시를 추가하거나 제거하는 것은 그다지 효과적이지 않을 것이다. 데이..

[안드로이드] 회전목마(Carousel) 애니메이션 구현하기

게임에서 아이템이나 캐릭터 선택을 할때 회전 목마처럼 돌아가는 선택 애니메이션을 자주 볼 수 있는데, 이것을 안드로이드에서 구현해 볼 수 있는 기회가 생겼다. 사실 노가다를 하면 어떻게든 구현할 수 있지만, 이번에는 문제를 분석하고 쪼개보는 연습을 겸해봤다. 💡 요구사항: 3가지 종류의 상자가 있고, 이 상자들을 돌려가면서 열 상자를 선택하게 해주세요. 1. 상자 유형 데이터화 첫번째로 해야할 일은 상자를 데이터화하는거다. enum 클래스로 상자의 이미지, 가격, 이름이 담긴 LuckyBoxType을 만들어 주었다. enum을 사용한 이유는 순차적 접근이 sealed class보다 훨씬 쉽기 때문이다. enum class LuckyBoxType( val image: Int = 0, val cost: In..

포맷 후 cli로 설치 셋업

평소에 사용하는 프로그램들을 새로운 Mac에서 쉽게 설치하는 용도로 모아보았다. brew install --cask google-chrome brew install --cask visual-studio-code brew install --cask slack brew install --cask notion brew install --cask docker brew install --cask karabiner-elements brew install --cask postman brew install --cask iterm2 brew install --cask figma brew install --cask displaylink brew install --cask dbeaver-community brew insta..

[Python] 국내 주요 음원차트 API

Melon | melon-chart.py Bugs | bugs-chart.py Genie | genie-chart.py Vibe | vibe-chart.py Flo | flo-chart.py Flutter 강의를 막 떼서 음원차트 트래킹 앱을 만들어볼까싶었다. Front는 목록이랑 알림정도라서 난이도가 높지않아 보였지만, Backend는 국내 음원사이트 긁어오는 프로그램부터 만들어야하는데...생각에 현재 배포된 국내음원차트 API들을 살펴보았는데 대부분 웹 크롤링 방식이었다. 봇이라고 거르지도 않고, 음원사이트들이 그래도 몇년에 한번씩 단장하기때문에 꽤 괜찮은 방법이긴하지만 개인적으로는 진짜 API를 따오고 싶었다. 다행히도 내가 안드로이드 개발자이기 때문에 당장 떠오르는 방법이 있었다. 바로, 앱에서 ..

Flow.map() vs Flow.transform()

fun getPagedFavoritePosts(): Flow = Pager( config = PagingConfig(25), pagingSourceFactory = { GenericPagingSource { afterKey -> redditApi.loadFavoritePosts(getUserName(), afterKey) } } ).flow.transform { pagingData -> emit(pagingData.map { (it.data as PostDto).map() }) } 우연히 오픈소스 코드를 보다가, 나라면 map을 썼을 것 같던 구문에 transform을 사용한 것을 발견했다. transform? 처음 들어봤는데 이름이 map과 왠지 비슷한 일을 할 것같아서 찾아보았다. map Flow의 ..

[안드로이드] 특정 시간 내 중복 Request를 막는 OkHTTP Interceptor 구현하기

특정시간 안에 보낸 동일한 Request에 대해서 서버에 요청하지 않고, 이전에 받은 응답값을 그대로 내려주는 Interceptor를 구현해보았다. Response Body를 어떻게 재사용할 것인가 고민을 많이 했는데, ByteArray 형태로 읽어두고 중복된 요청일때 ResponseBody로 만들어주는 방법을 사용해보았다. 이렇게 짧은 시간안에 연속적으로 요청을하더라도, 500ms 이후에만 새로 요청을 하게된다. 개발중인 앱의 Request Method가 전부 POST이기때문에, Request body까지 읽어서 hashing을 하고있는데, 그럴 필요까지 없으신분들은 Request URL 자체를 hash 값으로 잡아도 무방할 것이다. 혹시 유용했다면 Star를~! HTML 삽입 미리보기할 수 없는 소스

구글 설문지 (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..