rajephon S/W Engineer 게임과 영화를 좋아하는 개발자
rajephon.dev

달고나 짤 생성기를 만들어보자

banner-image

🏡 2020 회고

banner-image

🏡 2019 회고

banner-image

🏡 라즈베리파이 3 B+를 이용해 홈 서버 구축하기

banner-image

🐳 도커를 이용해 쉽게 IRC 서버 구축하기

banner-image

Erlang - 05. Rebar3 Project Setup

banner-image

Erlang - 04. Functions

banner-image

Erlang - 03. Lists

banner-image

개비스콘 짤 생성기 포스트모템

banner-image

Erlang - 02. Pattern Matching

banner-image

Erlang - 01. Data Types

banner-image

Erlang - 00. Hello World

banner-image

얼랭 학습기 (20190303~20190309)

banner-image

깃허브 페이지에 커스텀 도메인 연결하기 🛰

banner-image

Akka 공부하기 - 01.4 Child Actors, Actor Hierarchies, and Supervision

Announcement

지난 포스트 Akka 공부하기 - 01.3 Props와 and IActorRef에 이어지는 내용입니다.
이 포스트는 github petabridge/akka-bootcamp/…/Unit-1/lesson4를 번역&정리한 글입니다.

2018 회고

prog2019_goalsrammers
이미지 출처: flickr.com/@Marco Verch
원래 Akka 다음 포스트를 이어가야 하는데, 새로운 회사에 적응하면서 정신없이 보내다 보니 2019년이다. Akka 포스팅 이전에 2018년 한 해를 정리하는 회고를 작성하기로 했다.

Akka 공부하기 - 01.3 Props와 and IActorRef

Announcement

지난 포스트 Akka 공부하기 - 01.2 메시지 정의 및 핸들링에 이어지는 내용입니다.
이 포스트는 github petabridge/akka-bootcamp/…/Unit-1/lesson3를 번역한 글입니다. 혹시 오역이 있다면 피드백 바랍니다.

Akka 공부하기 - 01.2 메세지 정의 및 핸들링

Announcement

지난 포스트 Akka 공부하기 - 01.액터(Actors)와 액터시스템(ActorSystem)에 이어지는 내용입니다.
이 포스트는 github.com/petabridge/akka-bootcamp/tree/master/src/Unit-1/lesson2를 번역한 글입니다. 혹시 오역이 있다면 피드백 바랍니다.

Akka 공부하기 - 01.액터(Actors)와 액터시스템(ActorSystem)

Announcement

지난 포스트 Akka 공부하기 - 00. 액터 모델이란?에 이어지는 내용입니다.
이 포스트는 github.com/petabridge/akka-bootcamp/src/Unit-1/lesson1/를 번역한 글입니다. 혹시 번역 미스나 실수가 있다면 피드백 바랍니다.

Akka 공부하기 - 00.액터 모델이란?

Announcement

이번 블로그 포스팅은 배운 내용을 정리해보려 합니다. 잘못된 부분이 있을 경우 코멘트 부탁드립니다. 정정 코멘트 환영합니다!

OpenWrt 패키지 빌드 환경 세팅하기

OpenWrt
출처 flickr:Gareth Halfacree

Unity - 선 샤프트(Sun shafts) / 볼류메트릭 라이팅(Volumetric Lighting) 효과 이용하기

VolumetricLighting

Intro

영화, 뮤직비디오, 게임 등 영상 매체를 보다 보면 창문이나 사물 틈으로 멋들어지게 빛이 산란하는 모습을 볼 수 있다. 이러한 빛의 모습을 한국어로는 틈새빛살, 영어로는 Crepuscular rays, sunbeams, sun rays, god rays 등으로 불린다.
유니티에서는 해당 효과를 선 샤프트(Sun Shafts)라 부르고 있고, 유니티 테크놀로지 공식 에셋을 통해 사용할 수 있다.

Amazon Linux AMI에서 midi를 mp3, ogg로 변환하기

Timidity++

TiMidity++(간단히 TiMidity)는 하드웨어 신시사이저 없이도 미디 파일을 재생할 수 있는 소프트웨어 신시사이저이다. 실시간으로 사운드 카드를 렌더링할 수 있고, PCM 방식의 .wav 파일과 같은 별개의 파일로 결과물을 저장할 수 있다.
Wikipedia: TiMidity++

프로그래머스 문제풀이 고득점 Kit 해시 - 베스트앨범

문제

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.

속한 노래가 많이 재생된 장르를 먼저 수록합니다.
장르 내에서 많이 재생된 노래를 먼저 수록합니다.
장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

제한 사항

  • genres[i]는 고유번호가 i인 노래의 장르입니다.
  • plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
  • genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
  • 장르 종류는 100개 미만입니다.
  • 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
  • 모든 장르는 재생된 횟수가 다릅니다.

입출력 예

genres plays return
[“classic”, “pop”, “classic”, “classic”, “pop”] [500, 600, 150, 800, 2500] [4, 1, 3, 0]

입출력 예 설명

classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.

고유 번호 3: 800회 재생
고유 번호 0: 500회 재생
고유 번호 2: 150회 재생
pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.

고유 번호 4: 2,500회 재생
고유 번호 1: 600회 재생
따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.

프로그래머스 문제풀이 level3 - 야근 지수

문제

회사원 Demi는 가끔은 야근을 하는데요, 야근을 하면 야근 피로도가 쌓입니다. 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다. Demi는 N시간 동안 야근 피로도를 최소화하도록 일할 겁니다. Demi가 1시간 동안 작업량 1만큼을 처리할 수 있다고 할 때, 퇴근까지 남은 N 시간과 각 일에 대한 작업량 works에 대해 야근 피로도를 최소화한 값을 리턴하는 함수 solution을 완성해주세요.

제한 사항

  • works는 길이 1 이상, 20,000 이하인 배열입니다.
  • works의 원소는 50000 이하인 자연수입니다.
  • n은 1,000,000 이하인 자연수입니다.

입출력 예

works n result
[4, 3, 3] 4 12
[2, 1, 2] 1 6
[1,1] 3 0

입출력 예 설명

입출력 예 #1 n=4 일 때, 남은 일의 작업량이 [4, 3, 3] 이라면 야근 지수를 최소화하기 위해 4시간동안 일을 한 결과는 [2, 2, 2]입니다. 이 때 야근 지수는 22 + 22 + 22 = 12 입니다.

입출력 예 #2 n=1일 때, 남은 일의 작업량이 [2,1,2]라면 야근 지수를 최소화하기 위해 1시간동안 일을 한 결과는 [1,1,2]입니다. 야근지수는 12 + 12 + 22 = 6입니다.

입출력 예 #3

error: no matching function for call to ‘regex_replace(std::string&, std::regex&, const char [1])’

문제

아마존 인스턴스에서 make 명령어로 빌드 시 에러 발생

아이폰 XS 직구하기 - 01

이전 포스트 아이폰 XS 직구하기 - 00와 이어지는 내용입니다.

아마존 SES 세팅부터, 개인 도메인 메일 송수신, Node.js 활용 메일 전송까지 (22.04.30 업데이트)

수정기록

아이폰 XS 직구하기 - 00

Intro

나는 아이폰6를 쭉 사용해왔다. 그 이전에는 아이폰5s를 사용해오다가, 작년(2017년)부터 아이폰6 미사용폰을 구입하여 약정없이 사용했다. 무제한 요금제를 저렴하게 이용할 수 있는 MVNO(알뜰통신사)나, 일반 통신사를 핸드폰 할부금 없이 한 번 이용해보니 데이터를 마음껏 쓰면서도 부담감이 없는 통신요금이 너무나도 좋았다.
그래도 아이폰6는 4년 전 출시모델이고, 이번에는 다시 최신폰을 사용하며 얼리어답터가 되어보고자 하여 아이폰XS 직구를 마음먹었다.

맥용 메뉴 바 앱 개발하기 - 01. 콘솔 명령어 수행 및 권한상승요청

Intro

기존 포스트 맥용 메뉴 바 앱 개발하기 - 00. 팝오버 생성와 이어지는 내용입니다. 단순 기술참고만 하려면 상관없으나, 예제 코드 등 내용이 이전 포스트와 이어지므로, 기존 포스트를 먼저 읽는 것을 추천드립니다.

맥용 메뉴 바 앱 개발하기 - 00. 팝오버 생성

Intro

전부터 macOS에서의 상단 메뉴 바에서 동작하는 앱을 만들어보고 싶다는 생각을 했습니다. 메뉴 바 앱은 접근성도 쉽고, 주로 생산성을 향상시켜주는 앱이 많아서 그런지 사용자와 계속 함께한다는 느낌도 있어서요. 계속 생각만 하고 미뤄오다가, 요즘 여유 시간이 생겨 연습삼아 배우면서 개발을 진행했습니다.

슬랙 날씨 봇 만들기

00. 준비

슬랙 메신저를 통해 날씨를 알려주는 봇을 만들어보자.
목표는 매일 일정 시간에 날씨를 알려주고, 명령어를 통해 날씨 정보를 확인할 수 있는 봇을 개발하는 것이다.

Android NDK CMake 빌드 중 라이브러리 메소드 사용시 에러 발생

1. 문제점

C++로 작성된 정적 라이브러리 파일을 안드로이드 스튜디오에서 NDK를 이용하여 추가해 사용하려 했으나 다음과 같은 오류가 발생하였다.

FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':libProject:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process /Users/username/Library/Android/sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /Users/username/Documents/androidProject/libProject/.externalNativeBuild/cmake/debug/arm64-v8a --target native-lib}
  [1/3] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/SomeFile.cpp.o
  [2/3] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/SomeFile2.cpp.o
  [3/3] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
  FAILED: : && /Users/username/Documents/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++  --target=aarch64-none-linux-android --gcc-toolchain=/Users/username/Documents/android-ndk-r16b/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/username/Documents/android-ndk-r16b/sysroot -fPIC -isystem /Users/username/Documents/android-ndk-r16b/sysroot/usr/include/aarch64-linux-android -D__ANDROID_API__=22 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security  -std=c++11 -fexceptions -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot /Users/username/Documents/android-ndk-r16b/platforms/android-22/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/SomeFile.cpp.o CMakeFiles/native-lib.dir/src/main/cpp/SomeFile2.cpp.o  ../../../../libs/CoreLib/libs/arm64-v8a/libAnyfiMesh_CoreLib.a -llog -latomic -lm "/Users/username/Documents/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libgnustl_static.a" && :
  ../../../../libs/CoreLib/libs/arm64-v8a/libAnyfiMesh_CoreLib.a(some_file3.cpp.o): In function `SomeClass::someMethod2()':
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x384): undefined reference to `std::__ndk1::__shared_weak_count::__release_weak()'
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x3bc): undefined reference to `std::__ndk1::__shared_weak_count::__release_weak()'
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x3f4): undefined reference to `std::__ndk1::__shared_weak_count::__release_weak()'
  ../../../../libs/CoreLib/libs/arm64-v8a/libAnyfiMesh_CoreLib.a(some_file3.cpp.o): In function `SomeClass::someMethod3() const':
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x5d4): undefined reference to `std::__ndk1::some_method::init(void*)'
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x614): undefined reference to `std::__ndk1::locale::locale()'
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x798): undefined reference to `std::__ndk1::locale::~locale()'
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x7a0): undefined reference to `std::__ndk1::some_method::~some_method()'
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x82c): undefined reference to `std::__ndk1::locale::~locale()'
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text+0x834): undefined reference to `std::__ndk1::some_method::~some_method()'
  ../../../../libs/CoreLib/libs/arm64-v8a/libAnyfiMesh_CoreLib.a(some_file3.cpp.o): In function `ByteBufferPool::acquire()':
  /Users/username/Documents/libraryProject/src/Common/some_file3.cpp:(.text._ZN14ByteBufferPool7acquireEv[_ZN14ByteBufferPool7acquireEv]+0xa0): undefined reference to `std::__ndk1::__shared_weak_count::__release_weak()'
  .... 이하 생략 ...

라이브러리 빌드도 완료되었으며 사용한 NDK Toolchain 버전도 일치해서 문제없을거라 생각했는데 오류가 발생하여 구글링을 진행하였다.

D-Link 공유기 파이썬으로 원격 부팅(WOL) 이용하기

요즘 나오는 대부분의 공유기는 원격 부팅(WOL) 기능을 제공합니다.

Node.js 서버에 Google OAuth 2.0 로그인 손쉽게 만들기

구글 계정을 이용한 로그인 구현은 예전에 비하여 정말 손쉬워졌다. Firebase를 이용하거나, Google Sign-In for Websites를 순차적으로 따라하는 것만으로도 쉽게 만들 수 있다. 본인은 Passport.js라이브러리가 마음에 들어서 그것을 활용해보려고 한다.

하트블리드(Heartbleed) 공격과 방어

1. 서론

2014년 대다수 시스템 소프트웨어의 통신보안에 사용되는 OpenSSL에 중대한 취약점이 발견되었다. 이를 발견한 핀란드 보안 업체 ‘코데노미콘’은 이를 대중에게 설명하기 위하여 Heartbleed.com이라는 홈페이지를 개설하고 피를 흘리는 심장과 함께 이 취약점의 이름을 하트블리드(Heartbleed)라고 명명하였다. 이 취약점이 이런 이름으로 칭해지게 된 계기와 취약점 분석, 그리고 방어 방법에 대한 설명을 담았다.

블로그를 시작하며.

블로그를 처음 접해본 것은 오래 전이다. 중학교 시절 친구들과 일상 이야기를 적는 공간으로 네이버 블로그를 시작했다. 그러다가 고등학교로 넘어가며 티스토리 블로그로 이사를 간 다음, 좀 더 전문적인 글을 작성하며 구글 애드센스 광고를 달면서 작지만 용돈을 만들기도 했다.