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