Wednesday, May 6, 2020

Swift : class vs struct

Swift : class vs struct 

struct

- call by value 
- memory 할당 영역 : stack 
- 상속 불가, protocol 구현 
- Codable  사용가능
- NSData Serializable 사용 불가 

Class


- call by reference
- memory 할당 영역 : heap 
- 상속, protocol 구현 가능
- Codable 사용 불가 
- NSData Serializable 사용 가능


Q. Struct 에서 Classs를 Property 를 가지고 있다면 어떻게 동작하는가? 


struct SomeStruct {
    var desc: String
    var image: UIImage
}

SomeStruct 자체는 Copy가 되지만, 그 Property 들은 Call-By-Reference동 동작함으로 Copy시에 주소값만 복사가 된다. 

Q. 언제 Struct를 쓰는가?


JSON Response를 Modeling  할때 주로 사용. 
Serilizable 이 필요 한 경우 사용 불가. 


Q. 언제 Class 를 쓰는가? 


Objc에서도 같이 사용 할때, 
Model을 Serizlize 하여 전송하거나 저장할 필요가 있을 때



Friday, March 24, 2017

#AWS #IAM introductions

What is IAM?

Essentially, IAM allows you to manage users and their level of access to the AWS console.

What does IAM give you?

Centralised control of your AWS account.
Shared Access of your AWS account
Granular Permissions
Identity Federation ( including Active Directory, Facebook, Linkedin etc )
Mutifactor Authentication
Provide temporary access for users/devices and services where necessary
Allows you to set up your own password rotation policy 
Integrates with many different AWS services
Supports PCI DSS Compliance
Free to use

Critical Terms:

Users
Groups - A collection of users under on set of permissions. 
Roles - You create roles and can then assign them to AWS resources. 
Policies - A document that defines one ( or more permissions 


Sunday, March 12, 2017

#AWS Root path access denined on #S3 Static Website Hosting with #CloudFront

Problem. Access Denied on root path of cloudfront's endpoint.


I see Access Denined even I configured 'Index Document' on S3.
And access root path with S3' endpoint works perfect.

Answer. Default Root Object on CloudFront

Configure 'Default Root Object' property on cloudfront same as S3's 'Index Document'.


Friday, March 10, 2017

#Android How to setup test environment with Robolectric

1. ADD dependencies

    testCompile 'org.mockito:mockito-core:1.10.19'
    testCompile "org.robolectric:robolectric:3.3.1"
    testCompile "org.robolectric:shadows-multidex:3.0"
    testCompile 'org.khronos:opengl-api:gl1.1-android-2.1_r1'

2. Create Test Class for Activity 

if you have a activity at 'src/main/java/com.example.activity.SomeActivity', 
create test activity at 'src/test/java/com.example.activitySomeActivityTest'.

* Edit Run Configuration , if you use OSX or linu.



3. Write Test Code 


@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 22)
public class LoginActivityTest {

    private LoginActivity subject;
    private EditText editTextId;
    private EditText editTextPass;
    private Button buttonLogin;

    @Before
    public void setUp() throws Exception {
        subject = Robolectric.setupActivity(LoginActivity.class);
        editTextId = (WashEditText) subject.findViewById(R.id.layoutEmail);
        editTextPass = (WashEditText) subject.findViewById(R.id.layoutPw);
        buttonLogin = (Button) subject.findViewById(R.id.btnLogin);
        subject.loginCommunicator = mock(LoginCommunicator.class);
    }

    @Test
    public void loginWithoutEmail() throws Exception {
        buttonLogin.performClick();
        ShadowLooper.idleMainLooper();
        verify(subject.loginCommunicator, never()).requestLoginEmail(eq("liketaehoon@gmail.com"), eq(CommonUtil.password("1234")), anyString(), any(WashResponse.Listener.class));
        assertThat( ShadowToast.getTextOfLatestToast(), equalTo(subject.getString(R.string.error_input_email)));
    }
}
4. Run Test 

Saturday, December 24, 2016

파이썬 개발 환경 for osx.

pyenv


파이썬 버전 관리

brew install pyenv
https://github.com/yyuu/pyenv

pyenv-virtualenv


파이썬 가상 환경

brew install pyenv-virtualenv
https://github.com/yyuu/pyenv-virtualenv

autoenv


폴더별 SHELL 환경 설정 ( 꼭 파이썬이 아니더라도 )

brew install autoenv
https://github.com/kennethreitz/autoenv

vim


말이 필요 없는

Tuesday, December 20, 2016

[번역][Swift 공식 블로그] Objective-C [id] 를 Swift [Any] 로 사용하기. 1부

Objective-C [id] 를 Swift [Any] 로 사용하기 1부

원문 : Objective-C id as Swift Any 

Swift3를 이전버전에 비해 좀더 강력하세 Objective-C API를 사용할수 있습니다.
예를들어, Swift2에서는 [id](ObjC)형을 값과,Class 종류만을 가질수 있는 [AnyObject](Swift)형으로 사용할수 있었습니다. Swift2에서는 NSString이나 NSArray 혹은 다른 Foundation 에서 제공하는 형을 기대하는 CoCoa API에서 사용될수 있는 [String][Array][Dictionary][Set] 같은 형으로 묵시적으로 캐스팅 하여 사용할수 있었습니다. 이러한 방식은 일관성이 없고, AnyObject에 실제 어떤 형이 들어 있는지 알수 없어, 버그의 소지가 높았습니다.

Swift3에서는 [id] 타입을 class,enum,struct 혹은 다른 Swift type의 어떠한 타입의 값을 서술할수 있는 [Any] 타입으로 매핑합니다. 이러한 변화는 Swift 에서 사용되는 Objective-C API를 더 유연하게 사용할수 있게 합니다. 왜냐하면  Swift로 정의된 데이터를 Objective-C API에 바로 전달함으로써, Swift type를 분리해서 일일이"box" types로 치환하는 작업을 제거하기 때문입니다.  이러한 특성은 NSArray, NSDictionary, NSSet 과 같은 Collection Class 에도 적용됩니다. 예를들어 hashed container인 [Dictionary] 와 [Set] 같은 경우는 [Hashable] protocol을 구현하는 [AnyHashable] 타입으로 변환되게 됩니다.



ObjCSwift 2Swift 3
[id]AnyObjectAny
[NSArray *][AnyObject][Any]
[NSDictionary *][NSObject:AnyObject][AnyHashable:Any]
[NSSet *]SetSet

대부분의 경우, 이러한 변화에 대응하기위해 코드를 많이 바꿀 필요는 없습니다. 
Swift 2에서 동작했던 [AnyObject]로의 묵시적인 변환을 이용한 코드는 Swift3에서 여전히 동작할것입니다. 그러나 Swift3를 제대로 활용하기 위해, 이러한 변수들의 타입 선언문을 바꾸어야합니다. [AnyObject], [NSString]. [NSArray],[NSDictionary] 같은 걸 묵시적으로 이때까지 사용했다면, 명시적으로 [ as NSString ] 혹은 [ as String ]을 사용해줄 필요가 있습니다. Swift3 에서는 더이상 이런 묵시적인 컨버팅은 허용되지 않습니다. 자동치환 도구는 이런 사소한 변화를 자동으로 해주어, Swift 2 에서 3로 이전할때 코드가 지속적으로 컴파일 될수 있게 도와줍시다. 물론 가장 잘 정리된 형태는 아닐껍니다. 이 글에서 우리는 [id]를 [Any]로 사용하는것을 이용할때, 우리가 직접 수정해야 하는 부분과, 주의해야 하는것들에 대해 살펴 볼 예정입니다. 

Method 오버라이딩과 Protocol 구현

Objective-C Class를 상속받아, Method를 오버라이딩하거나, Objective-C protocol을 구현해야할때, Objective-C 에서 [id] 를 사용한다면 Method Signature를 변경해야 합니다. 
흔한 예로, [NSObject]의 [isEqual:] 이나 [NSCopying] Protocol의 [copyWithZone:] 를 구현하는 경우 입니다. 

// Swift 2
class Foo: NSObject, NSCopying {
 override func isEqual(_ x: AnyObject?) -> Bool { ... }
 func copyWithZone(_ zone: NSZone?) -> AnyObject { ... }
}
Swift3 에서는 추가로 [copyWithZone(_:)]를 [copy(with:)]로 이름을 바꿔야 하며, [AnyObject] 대신에 Any를 사용하도록 Method Signature를 변경해야 합니다.

// Swift 3
class Foo: NSObject, NSCopying {
 override func isEqual(_ x: Any?) -> Bool { ... }
 func copy(with zone: NSZone?) -> Any { ... }
}

Untyped Collections

Property lists, JSON 혹은 User Info Dictionary 들은 Cocoa 에서 일반적이고, 이런것들은 Cocoa Native 에서 untyped collection으로 표기됩니다. Swift2에서는 이 요소들을 사용하기 위해, 묵시적 bridging 변화을 사용하여 [AnyObject] 혹은 [NSObject]로 명시된 [Array] [Dictionary] [Set] 을 만들어야 했습니다. 

// Swift 2
struct State {
 var name: String
 var abbreviation: String
 var population: Int

 var asPropertyList: [NSObject: AnyObject] {
  var result: [NSObject: AnyObject] = [:]
  // Implicit conversions turn String into NSString here…
  result["name"] = self.name
  result["abbreviation"] = self.abbreviation
  // …and Int into NSNumber here.
  result["population"] = self.population
  return result
 }
}

let california = State(name: "California",
        abbreviation: "CA",
        population: 39_000_000)
NSNotification(name: "foo", object: nil,
      userInfo: california.asPropertyList)
혹은 Cocoa container class 인 NSDictionary를 사용할수도 있었습니다.

// Swift 2
struct State {
 var name: String
 var abbreviation: String
 var population: Int

 var asPropertyList: NSDictionary {
  var result = NSMutableDictionary()
  // Implicit conversions turn String into NSString here…
  result["name"] = self.name
  result["abbreviation"] = self.abbreviation
  // …and Int into NSNumber here.
  result["population"] = self.population
  return result.copy()
 }
}
let california = State(name: "California",
        abbreviation: "CA",
        population: 39_000_000)
// NSDictionary then implicitly converts to [NSObject: AnyObject] here.
NSNotification(name: "foo", object: nil,
      userInfo: california.asPropertyList)
Swift 3 에서는 이런 묵시적 전환은 더이상 사용할수 없음으로 위의 예제 코드는 더이상 동작하지 않습니다. 자동 변환 도구는 개별 값들을 [as] 를 통환 형변환을 하도록 하여 코드가 동작하게 할것이지만 좀더 좋은 방법이 있습니다.
Swift는 Cocoa API에서 받을수 있는, [Any] 혹은 [AnyHashable]의 Collection을 사용할수 있음으로 우리는 [NSObject:NSObject] 혹은 [NSDictoinary]를 사용하는 대신 [AnyHashable:Any]를 사용함으로써 다른 코드의 치환 없이 동작하는 코드를 만들수 있습니다. 

// Swift 3
struct State {
 var name: String
 var abbreviation: String
 var population: Int

 // Change the dictionary type to [AnyHashable: Any] here...
 var asPropertyList: [AnyHashable: Any] {
  var result: [AnyHashable: Any] = [:]
  // No implicit conversions necessary, since String and Int are subtypes
  // of Any and AnyHashable
  result["name"] = self.name
  result["abbreviation"] = self.abbreviation
  result["population"] = self.population
  return result
 }
}
let california = State(name: "California",
        abbreviation: "CA",
        population: 39_000_000)
// ...and you can still use it with Cocoa API here
Notification(name: "foo", object: nil,
    userInfo: california.asPropertyList)

[AnyHashable] Type

Swift [Any] Type은 어떠한 형도 담을수 있지만, [Dictionary],[Set]은 [Hashable] 한 Key를 필요로 합니다. 또한 [Any]는 너무 범용이죠. Swift3를 시작으로 Swift Standard Library [AnyHashab]e 타입을 지원합니다. [Any] 와 마찬가지로 이것은 모든 [Hashable] 형의 슈퍼 타입입니다. [String][Int] 혹은 다른 hashable 한 타입들이 들어 있을수 있으며, 묵시적으로 [AnyHashable] 형과 값을 가질수 있습니다. [AnyHashable]에 있는 자료형은 [is],[as!][as?]등을 통해 동적으로 체크할수 있습니다. [AnyHashable]은 type이 명시되지 않은 [NSDioctionary] 혹은 [NSSet] 형을 Objective-C를 통해 가져오는데 사용할수도 있지만, 순수 Swift 에서도 다형성을 가진 sets이나 dictionary를 다루는데 사용할수 있습니다. 


2부에서 계속 

Explicit Conversion for Unbridged Context
[AnyObject] Member Lookup
Swift Value Types in Objective-C
Linux Portability
Learning More



Wednesday, December 14, 2016

[Introduction to Algorithm] 4. Heaps and Heap Sort

4. Heaps and Heap Sort

Priority Queue

key를 가지는 각 요소를 가지는 집합이라고 볼수 있으며, 추가, 최대값, 최대값 추출, 키 값 변경등을 할수 있다.

Heap

Priority Queue의 Array 형식의 구현채로, 시각화하면 거의 완벽한 Binary Tree 형태를 가진다.

Max Heap Property 

주어진 node의 key 값은 항상 해당 node의 children node의 key 보다 항상 크다.

Min Heap 

Max Heap 과 반대의 특성을 가진다.


Heap as a Tree

root of tree : array의 첫번째 element. (i=1)
parent(i) = i/2 : node i 의 부모 node
left(i) = i*2 : node i의 왼쪽 child
right(i) = i*2+1 node i의 오른쪽 child

Binary Heap의 높이는 항상 O(lg n)

Heap Operation

build_max_heap : 정렬되지 않은 array를 max-heap 으로 변환하는 작업

max_heapify : max heap property를 하나만 어기는 경우, 이를 교정하는 작업

insert, extract_max,heapsort

Max_heapify 

* left(i) 와 right(i) 가 max-heaps 라고 가정.
* 만약 A[i] 가 max-heap property를 어긴다면, A[i]를 subtree의 root 와 바꿈으로써 교정할수 있다. 

Max_heapify (example)



Time = ? O(log n)

Max_Heapify Pseudocode

l = left(i)
r = right(i)

if ( l<= heap-size(A) and A[l] > A[i]) then largest = l else larges = i
if (r<= heap-size(A) and A[r] > A[largest]) then largest = r
if largest != i then exchange A[i] and A[largest] Max_Heapify(A, largest)

Build_Max_Heap(A)

for i=n/2 downto 1
    do Max_Heapify(A,i)

n/2 부터 시작하는 이유?

n/2+1....n까지는 Leaf Node 이고, Leaf Node 는 Single-Node Tree로 Max-Heap Property를 만족한다. 

Time =? O(n log n)

Build_Max_Heap(A) Analysis

Max_Heapify는 Leaf 바로위의 Node 에 대해서 O(1) 이 든다. 
일반화해서 보면  Leaf 보다 l level 만큼 떨어진 Node에 대해서는 O(l)이 든다고 할수 있다. 
level 1 nodes : n/4, level 2 node : n/8 .... level log n : 1개의 노드를 가진다고 할수 있다.

결과 적으로 총 loop count는

n/4(1c) + n/8(2c) + n/16(3c) .... 1 ( log n c)

n/4 = 2^k를 대입하면, 

c2^k(1/2^0 + 2/2^1 + 3/2^2 + .... (k+1)/2^k) 가 되면 () 은 수학적으로 상수(constant)가 된다. 

즉 cn/4*c' 가 되어 Build_Max_Heap은 O(n)을 가진다. 

Heap-Sort

1. Max Heap 생성 
2. 최대값 구하기 , A[1]
3. A[n] 과 A[1] 치환 
4. Heap 사이즈를 n-1로 변경 
5. max_heapify를 호출하여, Max Heap으로 재구성.
6. Heap 사이즈가 0이 될때 까지 2번부터 재시작.

* Running Time 

Heap이 비워질때 까지  n번의 loop 이 돌고 매 loop마다 max_heapify:O(log n) 이 호출된다.
즉, O(n log n)


영상 바로가기 :
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/lecture-4-heaps-and-heap-sort/

Heap Sort vs x-Sorts ?

Heap Sort 는 best,worst,average case에서 동일하다. 
Heap Sort 는 Memory Complexity 에서 모든 경우에 1을 가진다. 

Heap Sort는 Stable 하지 못한 Sorting 기법이다. 

* Sort에서 Stability 란, 중복된 key가 있는 입력 값에서 해당 key들이일정한 순서(원 입력의 순서)대로 정렬되는지를 의미한다.

https://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms