반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Count cells that contain specific text

2015. 8. 28. 05:43 | Posted by 솔웅


반응형

Count cells that contain specific text





=COUNTIF(rng,"*txt*")


특정 문자가 있는 cell들의 갯수를 알고자 한다면 COUNTIF 함수를 사용하시면 됩니다. 일반적으로 위와 같은 형태입니다. rng 는 cell들의 Range를 말합니다. txt 는 cell이 포함하고 있는 문자를 말하는 것이구요. *는 wildcard 죠 어떤 문자이든 상관 없다는 겁니다. 그러니까 *txt* 는 txt 만 포함돼 있으면 아무거나 괜찮다 입니다.




예를 들어 아래 공식을 보시죠.

=COUNTIF(B4:B11,"*a*")

이렇게 하면 B4에서 B11 사이에 있는 cell들 중에서 a를 포함하고 있는 모든 cell들의 갯수를 표시할 겁니다.

이걸 응용해서 다음과 같이 사용할 수도있습니다.

=COUNTIF(rng,"*"&a1&"*")

이건 rng 범위 안에서 a1 cell 에 있는 문자를 포함하고 있는 cell들의 갯수를 구할 겁니다.


반응형

Tutorial: How to use Auto Layout in Xcode 6

2015. 8. 27. 05:22 | Posted by 솔웅


반응형

유튜브 강좌 따라 하다가 Constraint 부분에서 헤맸어.

몇번 잘 못 누르니까 컴터 속도가 막 느려지고 그러더라구.

맥북에어라서 사양이 낮아서 그런가...

좀 사양 높은 걸 사야되나?


하여간 Constraint 부분을 좀 확실하게 알려고 써핑하다가 아래 글 발견.

한번 따라해 봐야지.


원문은 http://www.brianjcoleman.com/autolayout-xcode6/





Tutorial: How to use Auto Layout in Xcode 6



애플은 새로 iPhone 6 (4.7in) 와 iPhone 6 Plus (5.5in)를 발표했다. 현재의 iPhone 4 (3.5in), iPhone 5 (4in), and iPad (9.4in) 이외의 또 다른 크기의 디바이스가 생긴 것이다. iOS 개발자로서 우리는 오랫동안 안드로이드와는 다르게 그렇게 다양하지 않은 화면 크기들을 대상으로 개발하는 잇점을 누려왔다. 이제 다양한 화면크기의 iOS 기기가 나왔다. 여러분의 앱은 이제 이 다양한 화면 크기에서 운용 될 수 있도록 해야 한다. 그렇지 않으면 애플은 당신의 앱을 reject 할 것이다. 그리고 사용자들은 그들의 기기에서 당신의 앱이 제대로 작동하지 않는다고 불평을 해 댈 것이다.


아래는 코드를 사용하지 않고 Storyboard를 사용해서 constraint를 사용해 view를 control 할 수 있는 tutorial을 제공하고 있다. 이 방법을 따르면 auto rotation 기능도 함께 적용할 수 있을 것이다.


Constraint를 사용해 Interface 디자인 하기


    1. Single View Application template 으로 새 프로젝트를 만듬. 프로젝트 이름을 AutoLayout 으로 함
    2.  interface를 편집하기 위해 Storyboard를 선택함. constraint의 장점 중 하나는 코딩을 하지 않고도 여러가지를 처리할 수 있다는 것이다. 많은 auto layout 적용이 이곳 Storyboard에서 처리 될 수 있다.
    3.  4개의 labeled button들을 추가한다. 라이브러리에서 round rect button을 view로 네번 드래그 하면 된다. 파란 가이드 라인이 각각의 버튼을 해당 코너에 배치하는 데 도움을 줄 것이다. 각 버튼을 더블 클릭해서 title을 할당한다.




    4.  Run 함. 현재 autorotation은 세팅됐는데 아직 autosize attribute들은 세팅하지 않았다. 빌드하고 run 해 봐라. Hardware Rotate left를 선택하라. 그러면 시뮬레이터가 아이폰을 landcape 모드로 바꿀 것이다. 어떤 버튼들은 스크린 밖에 위치해 보이지 않을 것이다. 우리는 이 부분을 바로 잡을 것이다.




    5.  아래 그림은 Auto Layout Menu의 예를 보여주고 있습니다. 스토리보드의 오른쪽 아래부분에 있습니다. 우선 작업할 view를 선택하시고 작업할 버튼을 선택하시면 됩니다.

Align – 정렬하는 constraint를 생성한다. 예를 들어 두개의 view를 왼쪽 정렬하는 경우.
Pin – spacing constraint를 생성한다. 예를 들어 UI constol의 너비를 정의하는 경우
Issues – layout 과 관련된 issue들을 해결할 경우
Resizing – resizing 관련 세팅을 할 경우



6. 이제 우리의 constrait들을 적용해 봅시다. 왼쪽 위에 있는 버튼을 선택하세요. 이 버튼의 constraint를 변경하기 위해 Pin 버튼을 선택하세요. top에 20px을 그리고 left에 0px을 넣으세요. “Add 2 Contraints” 버튼을 눌러서 해당 사항들을 적용합니다.



7. 이제 해당 버튼을 선택하면 파란 가이드라인을 보실 수 있을 겁니다. constraint가 적용돼 있다는 것을 말합니다. 아마 top left 버튼에 대해 아직 파란 선은 보실 수 없을 텐데요. 아직 해당 위치의 constraint들은 default이기 때문입니다.



8. 이제 같은 작업을 나머지 3개의 버튼들에도 수행합니다.




9. Run 합니다. 각각의 버튼들이 가까운 corner에 제대로 위치해 있을 겁니다. 화면 밖으로 나갔던 버튼들이 화면 안으로 제대로 들어왔습니다. 







Auto Layout에 대한 팁


origin, width 그리고 height등을 설정하지 않고 Auto Layout을 사용해서 view들을 세팅하면 language 나 locale 이 변경 됨에 따라 위치나 크기가 재조정 될 겁니다. Auto Layout은 모든 디바이스들에 대해 .storyboard와 .xib 파일 세트를 생성합니다.


설정된 width constraint 제거. - text 의 크기가 재조정 되도록 합니다. 만약 width constraint를 설정하시면 어떤 view에서는 해당 텍스트가 일정 부분 짤려서 나올 수도 있습니다.


intrinsic content size 사용 - text 필드와 레이블의 default 는 resize automatically 입니다. 만약 view가 텍스트에 맞게 조정되지 않았다면 해당 view를 선택하고 Editor > Size To Fit Content를 선택하세요.


leading and trailing attributes를 사용 - constraint를 적용할 때 leading and trailing for horizontal constraints를 사용하세요. 그러면 좌우를 equivalent 하게 해 줄 겁니다. leading and trailing attributes는 horizontal constraints의 디폴트 입니다.

인접한 view들에게는 Pin을 사용 - Pin을 하면 도미노 효과가 나타납니다. 한 view가 텍스트에 맞게 크기가 재조정되면 다른 view들도 똑같은 적용을 받는 겁니다. 그러지 않으면 어떤 디바이스들에서는 view들이 겹쳐지게 될 겁니다.


layout change를 항상 테스트하라 - iPhone 4, iPhone 5, iPhone 6, iPhone 6 Plus, and iPad 등 다양한 화면 사이즈에서 테스트 하세요.

윈도우의 minimize size나 maximum size를 세팅하지 마라 - 그냥 자동으로 재조정되도록 하는게 좋습니다.


Auto Layout은 새로운 프로젝트를 생성할 때 디폴트로 설정할 수 있습니다. 이전의 프로젝트에 Auto Layout을 적용하려면 첫번째 View Controller의 첫번째 view 를 선택하고 File Inspector를 선택합니다. 그리고 “Use Auto Layout”를 선택합니다.

반응형

swift Memo

2015. 8. 26. 10:37 | Posted by 솔웅


반응형

* Set to whole width with some Margin


ctrl-Drag -> to right : Menu - Select Trailing space to container Margin : Orange Lines
  //      -> to left : Select leading space to the container margin
  //      -> to Top  : Select Top spacing to Top Layout Guide
==> will see blue line : completed for vertical
Orange - Click on Document outline (bottom left) -> Select lable 0
Yellow circle in View Controller section -> resolve the issue : Update Frame, Constraints, Reset to Suggested Constraints, Apply to all views in container -> select Update Frame -> Fix Misplacement -> Orange will go away


* iOS Simulator - Hardware - Rotate


* special Characters - Edit - Emoji & Symbols


* Array
- var xxx: Array<Double> = Array<Double>()
- var XXX = Array<Double>()
XXX.append(displayValue)


* right button on a element in Storyboard screen - disconnect to the methods


* fit elements (objects) to screen

Make perfect Grid for all elements in the screen. -> select 2nd icon :o: : Add New Constraints - top,left,right,bottom all 8
-> in View Controller Scene : Click on yellow icon on right top -> click on any yellow triangle - Apply to all views .... -> done : Test - rotate it



반응형

swift 함수 사용 예제

2015. 8. 25. 13:46 | Posted by 솔웅


반응형


요즘 유튜브에서 Swift 관련 강좌 들으면서 공부하고 있거든.

따라 하다가 이해가 안 가서 보고 또 보고 했던 부분 정리해 두려고....

한참만에 이해 했네...


강좌는 Stanford - Developing iOS 8 Apps with Swift


import UIKit

class ViewController: UIViewController {
  @IBOutlet weak var nums: UILabel!
  var conditionA = false


  @IBAction func CalNums(sender: AnyObject) {
    let typed = sender.currentTitle!
    if conditionA {
      nums.text = nums.text! + typed!
    } else {
      nums.text = typed
      conditionA = true
    }
  }

  var operandStack = Array<Double>()


  @IBAction func enter() {
    conditionA = false
    operandStack.append(numsValue)
    println("operandStack = \(operandStack)")
  }
 
  var numsValue: Double{
    get {
      return NSNumberFormatter().numberFromString(nums.text!)!.doubleValue
    }
    set {
      nums.text = "\(newValue)"
      conditionA = false
    }
  }

  @IBAction func operator2(sender: UIButton) {
    let operation = sender.currentTitle!
    if conditionA {
      enter()
    }
    switch operation {
    case "✖️": performOperation(multiply)
    default: break
    }
  }
 
  func performOperation(operation: (Double,Double) -> Double) {
    if operandStack.count >= 2 {
      numsValue = operation(operandStack.removeLast(), operandStack.removeLast())
      println("numsValue is \(numsValue)")
      enter()
    }
  }
 
  func multiply(op1: Double, op2: Double) -> Double {
    return op1 * op2
  }


}


위데 색깔 들어가 있는 부분만 볼건데...

일단 빨간 부분...


파라미터가 operation: (Double,Double)->Double 이자나.

operation: 부분을 이해 못해서 한참 헤맸어.


일단 그 부분을 빼면은 더블형 두개를 파라미터로 받아서 더블형을 반환하는 함수인데...

performOperation 함수를 암만 봐도 return 이 없잖아.

그래서 이게 어떻게 된 건지 한참을 봤는데...


operation: (Double,Double)->Double 부분이 ( ) 로 감싸여져 있잖아.

이건 이 함수의 input 값과 return 값을 나타내는게 아니라 그냥 그 전체가 input parameter 라는 얘기지...

즉 더블형 두개를 받아서 더블형을 반환하는 operation 함수를 입력 파라미터로 받는 다는 얘기.


한참 헤맸네...


위에서 performOperation 를 호출 한 부분을 보면 

case "✖️": performOperation(multiply)

그 입력 값은 multiply가 되지.


그러면 performOperation 의 입력값은

multiply: (Double,Double)->Double 가 되는가봐.


즉 더블형 두개를 입력받고 더블형을 반환하는 multiply 라는 함수가 입력값이 되지.


이제 이 함수 선언 부분을 이해했으니까 그 안을 들여다 보자고.


그냥 다른 부분은 넘어가고 제일 중요한 부분이

numsValue = operation(operandStack.removeLast(), operandStack.removeLast())

여기서 operation 은 multiply 이니까 multiply 함수를 호출해서 반환 받은 값을 numsValue 변수에 넣어 주는거야.


입력값은 operandStack 배열의 마지막 값과 두번째 마지막 값.

뭐 다른 부분은 쉽게 이해가 가서 별로 정리해 둘 건 없고.


swift 에서 제공하는 함수 축약해서 사용하는 방법을 이 부분에서 설명이 되니 그거나 정리해야 겠다.




  func multiply(op1: Double, op2: Double) -> Double {
    return op1 * op2
  }


이 부분을 축약해서 case 문 안에 넣는 거야.


case "✖️": performOperation({ (op1: Double, op2: Double) -> Double in
      return op1 * op2 })


이것도 축약할 수 있는데.



multiply 함수가 더블형 파라미터 두개를 전달 받아서 더블형 을 반환 하는 것은 이미 함수에서 선언 했으니까 그 부분은 이렇게 생략해도 됨.


case "✖️": performOperation({ (op1, op2) in return op1 * op2 })


그리고 return 를 생략해도 되고..


case "✖️": performOperation({ (op1, op2) in op1 * op2 })


여기서 더 줄일 수 있는데..
multiply 함수에 두개의 더블형 파라미터가 전달 되는 것은 이미 알고 있으니까 그냥 아래 처럼 해도 된대.


case "✖️": performOperation({ $0 * $1 })


그리고 그냥 괄호도 없애 버리고 이렇게 해도 되고.


case "✖️": performOperation{ $0 * $1 }


swift는 이런 부분에서 굉장히  flexible 한 것 같애.


이게 원래 계산기 앱 소스코드인데.. 이렇게 축약하면 곱하기 나누기 더하기 빼기 모두 다 집어 넣어서 소스코드를 아래와 같이 간략하게 만들 수 있어.


import UIKit

class ViewController: UIViewController {
  @IBOutlet weak var nums: UILabel!
  var conditionA = false
 
  @IBAction func CalNums(sender: AnyObject) {
   
    let typed = sender.currentTitle!
   
    if conditionA {
      nums.text = nums.text! + typed!
    } else {
      nums.text = typed
      conditionA = true
    }
  }

  var operandStack = Array<Double>()
  @IBAction func enter() {
    conditionA = false
    operandStack.append(numsValue)
    println("operandStack = \(operandStack)")
  }
 
  var numsValue: Double{
    get {
      return NSNumberFormatter().numberFromString(nums.text!)!.doubleValue
    }
    set {
      nums.text = "\(newValue)"
      conditionA = false
    }
  }

  @IBAction func operator2(sender: UIButton) {
    let operation = sender.currentTitle!
    if conditionA {
      enter()
    }
    switch operation {
    case "✖️": performOperation{ $0 * $1 }
    case "➗": performOperation{ $0 / $1 }
    case "➕": performOperation{ $0 + $1 }
    case "➖": performOperation{ $0 - $1 }
    default: break
    }
  }
 
  func performOperation(operation: (Double,Double) -> Double) {
    if operandStack.count >= 2 {
      numsValue = operation(operandStack.removeLast(), operandStack.removeLast())
      println("numsValue is \(numsValue)")
      enter()
    }
  }
}




오늘 아주 좋은 걸 배웠어.. :)

그 강좌 계속 따라가면서 저 계산기 앱 마저 완성하면 swift도 많이 익숙해 질 것 같네....


반응형


반응형

7개월 만에 글을 쓰는 군요.

그 동안 iOS  앱 개발 프로젝트에 참가하면서 글이 중단 된 거 같은데...

Mobile Automated Testing Framework이 없어서 열심히 Manual Testing을 하느라고 바빴습니다.

FleetService 와 관련해서 Driver 들의 주행 정보를 수집하고 Driver 들에게 필요한 정보들을 제공해 주는 앱을 개발하고 있습니다.


엊그제 Prem이라는 동료가 와서 부탁한게 있어서...

제가 엑셀 프로그래밍을 업무에 몇번 활용했더니 그게 소문이 났는지 저한테 엑셀 프로그래밍을 부탁하더라구요.


데이터소스에서 데이터 수천개를 뽑아서 A 컬럼에 넣고 또 수천개를 뽑아서 C 컬럼에 넣었는데..


A 컬럼에 있는 데이터들을 일일이 가져와서 C 컬럼 어디엔가 있는지 없는지를 확인해야 한다고 하더라구요.


로직을 잘 고민해 보니까 컬럼간 비교보다는 C 컬럼에 데이터를 다른 sheet에 넣어서 sheet 내의 데이터들을 비교하는 로직으로 만들면 코드가 훨씬 더 간편해 질 것 같더라구요.





예전에 사용해 봤던 UsedRange 하고 늘 사용하고 있는 VLookup 함수를 사용하면요...


그래서 이렇게 만들어 봤습니다.


Sub CompareData()
    Dim rngCell As Range
    For Each rngCell In Worksheets("Sheet1").UsedRange
        On Error Resume Next
        Sal = Application.WorksheetFunction.VLookup(Sheet1.Range(rngCell.Cells.Address), Worksheets("Sheet2").UsedRange, 1, False)
        If Err.Number <> 0 Then
            Let rngCell.Interior.Color = RGB(255, 36, 36)
        End If
    Next
End Sub



rngCell 이라는 Range 변수를 선언해 두고 For Each 문을 돌립니다.


rngCell In Worksheets("Sheet1").UsedRange


이렇게 돌리면 Sheet1 에 있는 각각의 데이터 수 만큼 For 문이 돕니다.


On Error Resume Next

이것은 에러가 났을 경우 에러처리 하지 말고 그냥 그 다음 것을 실행하라는 겁니다.

나중에 VLookup 을 했을 때 찾는 데이터가 없으면 N/A 로 에러 처리 되거든요..

그 때 catch  해서 그 이벤트를 handling 하려고 이렇게 했습니다.


Sal = Application.WorksheetFunction.VLookup(Sheet1.Range(rngCell.Cells.Address), Worksheets("Sheet2").UsedRange, 1, False)


VLookup 함수를 이용했는데요. For 문이 돌면서 Sheet1의 각 데이터가 하나씩 골라질 텐세 그 각 Range를 VLookup의 첫번째 파라미터로 놓고요. Sheet2 의 모든 UsedRange를 두번째 파라미터에 넣습니다.

세번째 파라미터 1은 첫번째 값을 가져 온다는 얘기고 마지막 False 는 exact match 를 사용한다는 겁니다.


이렇게 되면 Sheet1의 해당 데이터가 Sheet2에 있으면 그 값이 Sal 에 할당이 되고 없으면 N/A 이렇게 에러가 할당이 됩니다.


이 때 On Error Resume Next 를 하지 않았다면 그냥 에러 처리가 될 텐데 그게 있어서 그 다음 라인으로 넘어갑니다.



그 다음에 IF 문이 있는데요.


만약에 에러가 발생하면 해당 Cell의 Interior 색을 빨간색으로 하라는 겁니다.


그러면 Sheet1의 어떤 값이 Sheet2에 없을 경우 해당 Cell 이 빨갛게 칠해 지는 겁니다.


UsedRange와 VLookup 두개의 함수로 동료의 업무를 깔끔하게 해결해 줬네요.. :)

반응형
이전 1 다음