Playground에서 CocoaPod 사용하기

Playground에서 CocoaPod 사용하기 Playground를 iOS/Mac 개발자에게 아주 유용한 놀이터입니다. 이 놀이터에 cocoapod으로 테스트해보고 싶은 라이브러리를 쉽게 추가할 수 있다면 아주 편리할 것 같네요. 그 방법을 알아보겠습니다. 1. Empty Project 생성 우선 CocoaPod을 사용하기 위해서는 프로젝트가 필요합니다. XCode를 실행 후 New Project를 선택합니다. 그 다음 아래 그림처럼 Other에서 Empty프로젝트를 생성합니다. 2. pod init 생성한 프로젝트의 폴더로… Read More »

Swift로 즐기는 이미지프로세싱

Swift와 Playground를 즐길만한 놀이를 찾다가 간략하게 픽셀을 가지고 노는 걸 해보면 어떨까해서 만들어 보았습니다. 거창하게 이미지프로세싱이라 제목을 붙였지만 아주 간단한 것들만 해 보았습니다. 우연히 발견한 RGBAImage가 많은 도움이 되었습니다. 아래의 Playground는 https://github.com/skyfe79/SwiftImageProcessing 에서 받을 수 있습니다. Swift Image Processing This project contains swift playgrounds that demonstrate how to do pixel operations in swift. Thanks to RGBAImage… Read More »

시그마와 Fold

알고리즘을 구현할 때, 루프(loop)는 꼭 필요하다. 루프를 사용한다는 것은 우리가 어떤 시퀀스, 즉 어떤 자료의 목록인 리스트를 다룬다는 것을 뜻한다. 수학에서 리스트를 다루는 가장 대표적인 루프는 시그마이다. 시그마는 리스트를 받아 리스트의 각 원소를 합하는 루프다. 우리에게 익숙한 명령형 언어로 시그마를 작성해 보면 아래와 같다.

위의 sigma1을 보면 루프 내에서 sum의 상태와 i 변수의 상태가… Read More »

Swift와 C언어의 Pointer

UnsafePointer와 UnsafeMutablePointer Swift에서 C언어의 레거시 API를 사용할 때, C API가 포인터를 담고 있는 경우 Swift에서는 아래의 두 가지 경우로 함수 시그니쳐가 변환되어 임포트 됩니다. UnsafePointer<T> UnsafeMutablePointer<T> C언어의 API 에서 함수의 인자에 const가 붙은 경우 UnsafePointer<T>가 되며 const가 없는 경우 UnsafeMutablePointer<T>가 됩니다. 몇 가지 예를 들면 아래와 같습니다.

C언어에서 포인터를 선언하기 위해서 아직 정의되지 않은… Read More »

1부터 10000까지의 합

1부터 10000까지의 총합을 구하는 코드를 작성하고 하면 대부분 아래와 같이 작성할 것이다.

하지만 다르게 작성하는 법은 없을까?

익숙함의 배신

이직을 하게 되면서 면접을 몇 차례 진행하다 보니 ‘익숙함’이 아주 무서운 것임을 느끼게 되었다. 뭐랄까? 익숙함의 배신이라고 해야할까? 완전 틀리게 이해하고 있으면서 잘 알고 있다고 느끼는 착각이라고 해야할 것 같다. 예를들어 YUV, Stride 같은 용어들의 정의를 잘 이해하고 있다고 생각했지만 실상은 그렇지 않았다. 용어에 익숙해져 있을 뿐이지 그 정의에 대해서는 틀리게 이해하고 있었던 것이다. 컴퓨터를… Read More »

Swift와 C++ 코드 동시에 사용하기

ObjectiveC는 C언어의 Super Set이라 C코드를 자유롭게 ObjC 파일 내에서 사용할 수 있습니다. C++의 경우 m 확장자를 mm으로 변경해 주면 사용할 수 있습니다. iOS의 개발 언어가 Swift로 변경되고 나서는 C++을 사용하기 위해 약간의 수고를 더 해줘야 합니다. 안드로이드의 JNI에 비하면 아무 것도 아니지만요. 다음 순서로 하면 됩니다. C++ 모듈을 만든다 (h/cpp or hpp/cpp) ObjC++ 랩퍼를 만든다.… Read More »

멋쟁이 헤스켈, List Comprehension!

헤스켈을 공부하기 시작한 것이 얼마 되지 않았지만, 보면 볼 수록 매력덩어리이다. 헤스켈에 푹 빠져버린 첫 순간은 List Comprehension을 접하고 나서다.

Swift의 [1…100] 의 타입은?

Haskell에서 [1..100] 은 1부터 100까지의 정수 리스트가 된다. [1,2,3, … , 100] 이 표기의 편리함에 익숙하다 보니 Swift에서 아래와 같은 실수를…

Swift에서 [1…100]  은 Range하나를 담은 배열이다. 즉, 정수의 배열이 아니다. ㅠ.ㅠ

그렇다면 [1…100] 같은 정수 목록은 어떻게 생성할 수 있을까? 다행히도 Array클래스가 Range를 받아 순열을 생성해주는 생성자가 있다.

[1…100].filter {}… Read More »

Swift로 아주 큰 수를 곱해 보자.

Swift로 큰 수를 곱해보자. 이를테면, 12345678912345678901234567891234567890123456789123456789012345678912345678901234567891234567890123456789123456789012345678912345678901234567891234567890123456789123456789012345678901234567890123456789 *  12345678912345678901234567891234567890123456789123456789012345678912345678901234567891234567890123456789123456789012345678912345678901234567891234567890123456789123456789012345678901234567890123456789 같은 수를 곱해보자. 

대수적 데이터 타입과 Enum

대수적 데이터 타입은 다른 데이터 타입을 조합 및 연산하여 하나의 새로운 집합을 정의할 때, 해당 집합을 대수적 데이터 타입이라고 한다. 쉽게 얘기해 집합을 정의하는 것이다. 헤스켈에서 대표적인 대수적 데이터 타입은 Bool 타입이다.

Bool 타입은 True타입과 False타입이 모여 Bool이라는 집합을 정의한다고 생각할 수 있다. 대수적 데이터 타입의 몇 가지 예를 더 살펴보자.

Point 집합은… Read More »

함수를 정의하자.

수학적 함수표기와 Haskell 함수표기의 차이점 Mathematics Haskell f(x) f x f(x,y) f x y f(g(x)) f (g x) f(x,g(y)) f x (g y) f(x)g(y) f x * g y 조건 표현식으로 함수 정의하기

조건 표현식 중첩하기

주의 Haskell에서 if 조건 표현식은 항상 else 문이 있어야 한다. Guard를 사용하여 함수 정의하기

아주… Read More »

타입을 읽자.

Haskell 에서 타입을 지정할 때 :: 를 사용한다.

Class Constraints. Java, C# 등에서 Interface라고 생각하면 이해하기 쉽다.

커링(currying) 함수가 왜 필요한가?

명령형 언어에서 함수는 보통 0개에서 n개의 인자를 동시에 받아 특정 알고리즘을 수행한다.

함수형 언어에서 함수는 보통 커링함수를 사용하는데 커링 함수는 n개의 인자를 받는 함수가 있을 경우 n개의 인자를 동시에 받는 것이 아니라 1개씩 인자를 받으며 다음 인자를 받는 함수를 반환하는 함수를 말한다. int add( int a, int b ) 라는 함수가 있을 경우, 이를… Read More »

Intel Multi OS Engine와 Kotlin

인텔이 제작하고 있는 Multi OS Engine은 자바를 사용하여 Android, iOS앱을 MacOSX나 Windows OS 에서 만들 수 있게 해주는 기술입니다. 아직 정식단계는 아니고 프리뷰 단계라고 하네요. 중요한 것은 Multi OS Engine을 Kotlin을 통해 사용할 수 있다는 점입니다.

안드로이드 커스텀뷰 프로그래밍 – 커스텀뷰의 크기 정하기

커스텀뷰의 크기(기하 혹은 좌표계) 정하기 뷰를 생각해 봅시다. 뷰는 하나의 사각형으로 화면에 무엇인가를 그리는 객체입니다. 그리고 사용자로부터 터치 이벤트를 받는 인터렉션의 주체이기도 합니다. 뷰를 생각할 때 가장 중요한 것은 하나의 사각형입니다. 우리가 뷰에 무엇을 그려야 하거나 어떤 뷰에 인터렉션이 발생했는지 알기 위해서는 뷰를 구분지을 영역이 필요하기 때문입니다. 커스텀뷰를 만들 때, 가장 먼저 해야할 일도 뷰의… Read More »

NDK 라이브러리 배포 시 java.lang.UnsatisfiedLinkError 에 대해서.

한 프로젝트에서 두 개 이상의 ndk 라이브러리를 사용한다고 가정해 봅시다. 각 라이브러리는 아래와 같이 ABI를 지원한다면 앱을 빌드하고 실행했을 때 잘 실행될까요? NDK-Library A armeabi NDK-Library B arm64-8a armeabi armeabi-v7a mips mips64 x86 x86_64 즉, NDK-Library B는 모든 ABI를 지원하고 NDK-Library A는 armeabi만 지원합니다. 이럴 경우 앱을 빌드하고 실행하면 NDK-Library A를 찾을 수 없다고 예외를… Read More »

AndroidChannel

안드로이드 프로그래밍을 하면서 Handler를 사용해서 메인 스레드와 워커 스레드간에 통신을 할 때, 작성해야하는 코드가 매번 부담이 되서 AndroidChannel이라는 라이브러리로 만들어 보았습니다. AndroidChannel을 사용하여 Ping-Pong 코드를 아래처럼 작성할 수 있습니다.

나이스!

오늘은 안드로이드 하드웨어 코덱을 사용하여 인코딩한 카메라 스트림을 RTMP로 송출하는데 성공! 기쁘다

TypedArray의 getDrawable()이 null을 반환한다면?

위처럼 속성을 선언하고 아래 코드처럼 접근할 때, null을 반환한다면

해당 커스텀뷰를 선언한 xml로 이동하여 xml 네임스페이스를 제대로 적었는지 확인한다.

이렇게 적어야 하는데 가끔 인텔리센스에 의해서

로 쓰여질 경우가 있다. 길고긴 삽질;