2015년 12월 24일 목요일

esp8266 - nodemcu와 그 친구들

nodemcu 가 계속 버전업을 해서 다양한 모듈들을 아주 쉽게 사용할 수 있도록 적극적인 지원을 하고 있다.

물론 이 모듈들은 http://nodemcu-build.com/ 같은 곳에서 추가/삭제를 자유롭게 하여 커스텀 빌드를 만들 수 있다.

하나씩 살펴보자.

  1. WS2812
  2. WS2801
  3. BMP085
  4. TSL2561
  5. HX711
  6. DS18B20
  7. DHT11, DHT21, DHT22, DHT33, DHT44
  8. u8glib - sh1106_128x64, ssd1306, ssd1309_128x64, ssd1327_96x96_gr, uc1611 ...
헉헉 목록만 봐도 숨찬다.

RGB LED 계열
WS2812

WS2801 (Strip 형태)

압력 센서
BMP085

조도센서

TSL2561

무게센서 (load cell)

HX711

온도센서
DS18B20


온습도 모듈

DHT11

DHT21


DHT22

DHT33


DHT44



디스플레이류 (양이 매우 많다)


ILI9163


ILI9341


PCF8833


SSD1351

이외에도 엄청 다양;;;;; 자료 찾기가 겁난다.

물론 꼭 ESP8266에서만 작동하는 모듈들은 아니지만 실제로 사용시에 속도 문제로 바이너리를 사용해야하는 경우도 있고 라이브러리 사용이 복잡하다던가 여러가지 경우가 있을 수 있으므로 우선적으로 고려해두면 좋다.

2015년 12월 19일 토요일

iOS/swift - segue 연결 후 중간에 가로채기 하고자 할때 : shouldPerformSegueWithIdentifier

segue로 storyboard를 연결해 놓고 특정 조건일 때 해당 segue로 연결을 막고 싶은 경우가 있다.

가령 특정 메뉴를 들어가고자 할땐 로그인이 되있지 않다면 로그인 화면으로 유도하려면 segue를 중간에 가로채야 한다.


UIViewController 안에서 shouldPerformSegueWithIdentifier 를 사용하여 구현할 수 있다.

NeedLoginSegue 로 이동할 경우 사용자 정보( checkUserInformation(userDefaults) )가 false면 LoginSegue 를 열게 하는 코드는 다음과 같다.

    override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {
        if identifier == "NeedLoginSegue" {
            if checkUserInformation(userDefaults)==false {
                self.performSegueWithIdentifier("LoginSegue", sender: nil)
            }
            return false
        }
        return true
    }

unwind와 함께 빈번하게 쓰는 패턴이니 기억해두자.

2015년 12월 14일 월요일

iOS 앱 제출 전 점검사항.

App 정보
현지화 가능한 정보
이름: 255자
개인정보 취급방침 URL : (선택사항)

일반정보
번들ID - reverse domain
기본언어 - 한국어 등
SKU - App Store에 표시되지 않는 App의 고유한 ID
카테고리 - (2개)
건강 및 피트니스
게임
교육
금융
날씨
내비게이션
뉴스
도서
라이프 스타일
비즈니스
사진 및 비디오
생산성
소셜 네트워킹
쇼핑
스포츠
엔터테인먼트
여행
유틸리티
음식 및 음료
음악
의학
잡지 및 신문
참고
카탈로그

가격 및 사용가능 여부

제출 준비 중
버전정보
App 동영상 미리보기
최대 5개 스크린 샷
4.7, 5.5, 4, 3.5, iPad, iPad Pro

설명 - 4000자
키워드 - 100자
지원 URL
마케팅 URL - 선택

App 정보

App 아이콘 - 아이콘은 App Store에서 사용되며 최저 해상도가 72DPI이고 RGB 색상 영역에 있는 JPG 또는 PNG 형식이어야 합니다. 레이어나 둥근 모서리가 있어서는 안 됩니다. (png일 경우 투명 알파채널이 있어도 안됨)

거래 담당자 연락처 정보 - 한국 App Store에서 App과 함께 표시되는 추가 정보를 제공할 수 있습니다. 이 정보는 한국 App Store에만 나타납니다.

대한민국 App Store의 거래 담당자 연락처 정보를 표시합니다.

저작권 - App에 대해 독점 권한을 가진 개인 또는 법인의 이름으로, 앞에 권한을 획득한 연도가 옵니다(예: ‘2008 Acme Inc.’). URL을 제공하지 마십시오.

App 심사 정보
연락처 정보 - App 심사 팀에서 궁금한 점이 있거나 추가 정보를 필요로 할 경우에 연락할 조직의 담당자입니다.

데모 계정 - App에 대해 전체 접근 권한을 얻기 위한 사용자 이름과 암호입니다. 이 계정은 심사 과정 중에 사용되며 만료되어서는 안 됩니다. 메모 필드에 추가 계정을 위한 세부 정보를 포함하십시오.

메모 - 심사 과정 중에 도움이 될 만한 App에 대한 추가 정보입니다. App별 설정처럼 App을 테스트하는 데 필요할 수 있는 정보를 포함하십시오.

TestFlight 계정 생성용 Apple ID 필요.

* 스크린샷 뜨는 꿀팁.

iOS Simulator - iPhone 6 Scale 50% 기준. cmd+shift+4, space 로 스샷 후

imagemagick을 사용.

convert MainMenu.png -crop 375x666+56+54 MainMenuC.png

깔끔하게 떨어진다.

2015년 12월 6일 일요일

Xcode swift

http://en.swifter.tips/selector/

notification 을 observe 할일이 있어 찾아봄.

NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "callMe", name: "CallMeNotification", object: nil)

selector는 그냥 string이네
대신 저 callMe

@objc private func callMe() {
    //...
}

이렇게 써야하는 것.
참으로 불완전하다.

unwind(segue 되돌아가기)도 좀 헤메었다.
부르는 쪽에서 exit를 아래와 같이 만들고 (함수명은 자유)

@IBAction func unwindToHomeDetail(segue:UIStoryboardSegue) {

}

unwind를 실행하는 쪽에선 Navigation Controller 안에 있지 않으면 작동하지 않았다.
두 개를 동시에 쓸땐 어케되나.


도중 cocoapod이 무한 install 대기 시
pod repo remove master
pod setup
pod install
아이고 고맙습니다.

괴로운 문제가 또

UIView에 테두리를 어떻게 두르느냐?
코드로 안하고 방법이 없나.

Picker로 사진을 찍을때 1280x960 으로 처리할 수 있다.

scale 문제

    func scaleImage(image: UIImage)->UIImage {
        // 이미지를 354*472 변환, po
        let sizeRatio:CGFloat = 354.0/image.size.width/2
        
        let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(sizeRatio, sizeRatio))
        let hasAlpha = false
        let scale: CGFloat = 0.0 // Automatically use scale factor of main screen
        
        UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
        image.drawInRect(CGRect(origin: CGPointZero, size: size))
        
        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return scaledImage
    }

/2를 해준 이유는 scale이 2라서.
(lldb) po scaledImage.size
▿ CGSize
  - width : 177.0
  - height : 236.0

scale을 1로 지정해 주는 게 맞지 않나?

Python 코드를 고치기 시작
    def write_imgwithlandmarks(self):
        img = self.img
        for point in self.landmarks[0:15]:
             cv2.circle(img, (int(round(point[0])), int(round(point[1]))), 2, (255, 00), 5)
        cv2.imwrite("result.png", img)
        output = []
        raw = open("result.png", "rb").read()
        width, height, _, _ = png.Reader(bytes=raw).read()
        data = raw.encode("base64").replace("\n", "")
        return data

label, textEdit padding 문제
그냥은 안되고 
에서 언급한 것 처럼 Text : Attributed 로 전환.
align bar 에서 맨 오른쪽 ... (more) 버튼을 눌러서 indent / first Line 값을 입력

근데 지우면 말짱 도루묵.

Array도 정리
let Collection = [
  ["a", "b"],
  ["C"]
]

이러면 NSArray

let Collection:[[String]] = [
  ["a", "b"],
  ["C"]
]

이렇게 써야 Swift Array

2015년 11월 22일 일요일

Xcode Log - Label / Attributed Text - Replace

        let mutableString:NSMutableString = (resultLabel.attributedText as! NSMutableAttributedString).mutableString
        mutableString.replaceOccurrencesOfString("@1", withString: "109", options: 
NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, mutableString.length))

결국 이 두 줄의 코드.

AS3 할때도 이런 경우가 있었는데 HTML 형식으로 formatting한 label을 다룰때 생각보다 간단하지 않았다.
물론 해결하고 나니 속 시원했었지만.


이게 다 저 @1 부분을 replace 하려고 시작한 일이었다.
조금 더 다양한 가능을 보려고 손을 좀 더 보았다.



Xcode 에서 이걸 직접 살펴보았다.

                                <attributedString key="attributedText">
                                    <fragment content="이거이 사람이 짓이 아닌가 봅니다.
"
>
                                        <attributes>
                                            <color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
                                            <font key="NSFont" size="17" name="AppleSDGothicNeo-Regular"/>
                                            <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                        </attributes>
                                    </fragment>
                                    <fragment content="진짜">
                                        <attributes>
                                            <color key="NSColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                            <font key="NSFont" size="24" name="AppleSDGothicNeo-Bold"/>
                                            <font key="NSOriginalFont" size="17" name="AppleSDGothicNeo-Bold"/>
                                            <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                        </attributes>
                                    </fragment>
                                    <fragment content=" 속이 상해서 참말로
"
>
                                        <attributes>
                                            <color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
                                            <font key="NSFont" size="17" name="AppleSDGothicNeo-Regular"/>
                                            <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                        </attributes>
                                    </fragment>
                                    <fragment content="@1%">
                                        <attributes>
                                            <color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
                                            <font key="NSFont" size="24" name="AppleSDGothicNeo-Regular"/>
                                            <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                        </attributes>
                                    </fragment>
                                    <fragment content=" 부분만 살짝 갈아끼워줍니다.">
                                        <attributes>
                                            <color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
                                            <font key="NSFont" size="17" name="AppleSDGothicNeo-Regular"/>
                                            <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                        </attributes>
                                    </fragment>
                                </attributedString>

보면 attributedString 아래에 fragment 단위로 누어져있고 그 아래 attributes 가 있고 그 안에 color/font/paragrapthStyle 등등이 있는 걸 볼 수 있다.

HTML DOM 을 만드는 것과 비슷하게 할 수 있지만 지금 당장 필요한 것은 본문을 손상하지 않고 내용만 바꾸고 싶은데 이걸 전체를 들었다가 다시 생성하는 건 너무 삽질이라고 생각.

debugger를 열고 attributedText를 관찰해보자

(lldb) print (resultLabel.attributedText)
(NSAttributedString?) $R10 = 0x00007fa99c8a2f90 {
  ObjectiveC.NSObject = {...}
}


이런게 있다.
Mutable!! 바꿀 수 있다는 소리다!

(lldb) po (resultLabel.attributedText as! NSMutableAttributedString).mutableString
이거이 사람이 짓이 아닌가 봅니다.
진짜 속이 상해서 참말로
@1%
부분만 살짝 갈아끼워줍니다.

오케이!
이거야 이거!
mutableString 이면 바꿀 수 있다.


mutableString 을 보니 NSMutableString 이다.

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableString_Class/index.html#//apple_ref/occ/instm/NSMutableString/replaceOccurrencesOfString:withString:options:range:

MutableString 이라면 이런게 있지!
replaceOccurrencesOfString!!

Declaration

SWIFT
func replaceOccurrencesOfString(_ targetString,
                     withString replacementString,
                        options optionsNSStringCompareOptions,
                          range searchRangeNSRange) -> Int
OBJECTIVE-C
- (NSUInteger)replaceOccurrencesOfString:(NSString *)target                              withString:(NSString *)replacement                                 options:(NSStringCompareOptions)opts                                   range:(NSRange)searchRange
바꿀 것은 target 에 주고 withString 에 변경할 문자열을 지정한다.
정확한 일치를 원하므로 NSStringCompareOptions.LiteralSearch 를 사용한다.

여기에 Range 가 좀 걸리는데
만들어주자.

Declaration

SWIFT
func NSMakeRange(_ locInt_ lenInt) -> NSRange
OBJECTIVE-C
NSRange NSMakeRange ( NSUInteger loc, NSUInteger len );

Return Value

An NSRange with location location and length length.

Availability

Available in OS X v10.0 and later.
0부터 mutableString의 길이까지 지정해주면 된다.

새로 만드는 걸 했다면 거대한 삽질을 할뻔.



2015년 11월 19일 목요일

Xcode 개발 Log

AlamoFire 를 사용한 경우 swift에서 JSON 취급이 조금 헷갈렸다.


        Alamofire.upload(urlRequest.0, data: urlRequest.1)
            .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) -> Void in
                print("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
            }
            .responseJSON { response in
                if response.result.isSuccess {
                    /* avoid optional */
                    let result:NSDictionary = response.result.value as! NSDictionary
                    print((result["facetype"] as! NSArray)[1])
                } else {
                    print("Cannot find face")
                }
            }

lldb에서 po 로 열심히 찍어본 결과
JSON으로 넘겨준 경우 NSDictionary 와 NSArray를 결국 열심히 찍어보는 수 밖에 없었다.
최종 결과물도 as String 형변환을 해줘야함.

swift는 좋은 언어지만 애플이 잘못했지.


2015년 11월 15일 일요일

Xcode Key binding

1. 우상단 컨트롤들


왼쪽부터 
Show the Standard View - Cmd + Enter
Show the Assistant View - Cmd + Option + Enter
Show the Version Editor - Cmd + Option + Shift + Enter


왼쪽부터
Hide or show the Navigation - Cmd + 0 
Hide or show the Debug Area - Cmd + Shift + Y
Hide or show the Utilities - Cmd + Alt + 0 

2. Storyboard

Hide or show Document Online - 바인딩 없음(Cmd + 9 로 설정) 

3. 우측 상단 바로 아래 Inspectors
왼쪽부터
Show the File inspector - Cmd + Shift + 1
Show Quick Help inspector - Cmd + Shift + 2
Show the Identity inspector - Cmd + Shift + 3
Show the Attributes inspector - Cmd + Shift + 4
Show the Size inspector - Cmd + Shift + 5
Show the Connections inspector - Cmd + Shift + 6

4. 우측 하단 Library
왼쪽부터
Show the File Template Library - Cmd + Ctrl + Option + 1
Show the Code Snippet Library - Cmd + Ctrl + Option + 2
Show the Object Library - Cmd + Ctrl + Option + 3
Show the Media Library - Cmd + Ctrl + Option + 4

5. 기타
Run - Cmd + R
Stop - Cmd + .
Resolve Auto Layout Issue - Update Frames - Cmd + Option + =