본문 바로가기

분류 전체보기

[Xcode] include non modular header inside framework module Build Settings -> LLVM Modules -> Allow Non-modular includes in Framework Modules -> YES 해당 에러가 pod에서 난다면 pod의 Build Setting에도 들어가서 변경해주어야 한다. 더보기
[C#] Using static 사용하기 새로운 문법인 using static을 사용하면 네임스페이스 뿐만 아니라 static class도 축약하여 사용할 수 있다. 이 기능은 C# 6.0에서 추가된 기능이며, Visual Studio 2015부터 사용할 수 있다. 더보기
[C#] Thread.SpinWait와 SpinWait 구조체의 차이 .Net 에서는 SpinWait을 할 수 있는 두가지 방법을 제공한다첫번째는 Thread.SpinWait 메소드이고 두번째는 SpinWait구조체를 사용하는것이다. 이 두가지 방법은 busy waiting을 수행한다는점에서는 같은 역할을 하지만, 실제 동작에 있어서 몇가지 차이점을 가진다.일단 SpinWait 구조체는 Thread.SpinWait의 래핑이다. SpinWait는 Thread.SpinWait를 이용하여 구현되었다.Thread.SpinWait는 주어진 iterationCount만큼만 스핀한다, SpinWait의 SpinOnce는 딱 1회 스핀을 수행하는것이 아니다. 지금까지 얼마나 돌았는지 보고 적적한 스핀 횟수만큼 스핀하게 된다. (따라서 SpinWait를 미리 만들어놓고 재사용하는건 좋지 .. 더보기
[C#] Mixin 흉내내기 C#은 믹스인을 지원하지 않고, Java와 같은 인터페이스 기반의 다중 상속을 선택했다. 하지만 이 방법은 '구현'을 상속하지 못한다는 점에서 굉장히 불편한데, 아래의 예제에 어떤 경우에 불편한지 예제를 작성해 보았다. IPrintable 인터페이스는 디버그 용도 등을 위해 해당 클래스의 모든 프로퍼티들을 콘솔에 출력하기 위한 용도로 만들어졌다. 여기서 짜증나는 점은, Print 메소드는 무조건 직접 구현해야 한다는 것이다. 알다시피 C#은 런타임에 모든 프로퍼티의 이름, 값들을 리스트로 가지고있다. 그렇기에 사실 저렇게 직접 하나하나 다 찍어야 할 필요는 전혀 없다. 누가 대신 찍어줄수도 있다는 말이다. 위의 루비 예제는 mixin을 이용하여 모든 인스턴스 멤버의 값을 출력하는 Printable을 구현.. 더보기
[C#] Thread.Sleep의 await(Task) 버전 static async void Foo() { Console.WriteLine("hello"); await Task.Delay(1000); Console.WriteLine("world"); // 1 초후에 출력됨 } static void Main(string[] args) { Foo(); while (true) { Console.Read(); } } 더보기
[Ruby] select, map, collect select콜렉션에서 주어진 조건과 일치하는 모든 항목의 콜렉션을 반환한다. puts [1,2,3,4,5,6].select {|x| x >= 3 } # 3 4 5 6 collect콜렉션의 모든 원소들을 가공해서 새로운 콜렉션을 반환한다. puts [1,2,3].map {|x| x * x } # 1 4 9 mapmap은 collect의 alias이며, 다른 언어에서 사용하는 메소드와 네이밍을 맞춰서 편리성을 제공하기 위해 만들어진 메소드이다. 더보기
[PostSharp] ReaderWriterSynchronized PostSharp의 ReaderWriterSynchronized기능을 이용하면 원본 코드의 수정 없이 이미 작성한 클래스를 Thread-Safe 하도록 만들 수 있습니다.명심해야 할 것은, PostSharp에서 제공하는 쓰레딩 모델들은 개발 편의성이 중시되어, 직접 제어되는 락보다 좋은 성능을 내지는 못합니다. 간단하게 카운터 클래스를 만들고 여러 스레드에서 동시에 반복적으로 카운트를 올리는 작업을 수행해 보도록 하겠습니다. class Foo { private int num {get; set;} = 0; public void Increase() { num++; } public int Read() { return num; } } class Program { static void Main(string[] a.. 더보기
[Swift 2.0] guard 새로운 guard 키워드는 는 주어진 조건식이 false일 때 지정한 코드 블럭을 실행시키는 역할을 한다. guard true else { /* 실행 안됨 */ } guard false else { /* 실행됨 */ } 이 기능을 이용하여 기존에 사용하던 if let ~ 을 아주 깔끔하게 대체할 수 있는데,아래 코드와 같이 피라미드처럼 생긴 괴상한 if let ~ 의 중첩을 없엘 수 있다. (Pyramid of Doom) if let a = a { if let b = b { /* .... */ } else { return nil; } } else { return nil; } if let ~을 쓰던 코드를 guard로 정리한 모습 guard let a = a else { return nil } guard .. 더보기
[Ruby] deep_merge https://github.com/danielsdeleo/deep_merge a = { :a => [1, 2, 3] } b = { :a => [4, 5, 6] } a.merge! b p a 기본적으로 Hash에 merge를 이용하면 없는 키는 추가되지만 이미 존재하는 키는 덮어쓰게된다.따라서 위의 코드를 실행하면 아래와 같은 결과가 나오게 되는데, { :a => [4, 5, 6] } 경우에 따라서는 [4, 5, 6]이 아니라 [1, 2, 3, 4, 5, 6]이 필요할때가 있다. (훨씬 많을듯)이럴 때 사용할 수 있는 것이 deep_merge이다. deep_merge를 사용할 경우 두 해시가 자연스럽게 합쳐진다.deep_merge는 아래의 명렁어로 설치할 수 있다. gem install deep_merge.. 더보기
[go] channel synchronization https://gobyexample.com/channel-synchronization 채널을 이용하여 고루틴 간의 실행 순서를 동기화할 수 있습니다. 여기서는 채널의 블러킹 recv를 이용하여 고루틴이 끝날 때 까지 대기하는 방법을 보여줍니다. package main import "fmt" import "time" // 고루틴으로 실행시킬 함수입니다. // done 채널은 고루틴의 작업이 끝났음을 알려주기 위해 사용됩니다. func worker(done chan bool) { fmt.Print("working...") time.Sleep(time.Second) fmt.Println("done") // 값을 넣어 끝났음을 알립니다. done 더보기