파이썬은 객체 지향 함수이기 때문에 모듈을 import하고 그 객체로부터 메서드(함수)를 뽑아 쓴다.

먼저 메서드가 정의된 파일(모듈)이 abc.py라 가정하고 다음과 같은 내용이 있다고 하자.

def add(a, b):
    return a+b

def minus(a,b):
    return a-b

import abc를 하면 abc 객체를 생성할 수 있다.

그 객체에서 메서드를 뽑아서 사용하면 된다.

a = abc.add(3, 5)

b = abc.minus(3, 5)

 

다른 패키지들도 마찬가지다.

가령 DB에 연결하게 해주는 pymysql 패키지는 import된 후

conn=pymysql.connect(
  host=connHeader['host'],
  port=connHeader['port'],
  user=connHeader['user'],
  password=connHeader['password'],
  db=connHeader['db'],
  charset=connHeader['charset']
)

이런 형태로 연결 객체를 만들어 준다.

1. 판다스의 자료 구조와 장점

Pandas에서 자료구조는

시리즈(Series)라 불리는 Columnal 데이터와

DataTable과 유사한 형태의 테이블 데이터인 데이터프레임(DataFrame)이 있다.

 

기본 자료구조가 정해진 컬럼을 주렁주렁 달고 다니는 row 형태가 아닌 column 형태라서

자료 가공을 하면서 조건에 맞는지 여부를 따질 때, 다른 컬럼을 소환하지 않고 작업할 수 있다.

따라서 작업 속도가 빠르고 데이터 관련 가공은 Pandas를 많이 쓴다.

 

비슷한 궤로 통계를 이용한 데이터 가공에도 강하다.

OLS 같은 통계추정량을 구할 때도 필요한 coefficients 이외는 residual로 처리하는 방식이기 때문에

회귀방정식에 넣는 column만 바로 적용될 수 있다.

[역으로 기존 RDB 형식으로만 작업하면 굉장히 비효율적으로 수행할 거 같다.]

 

2. 현재 사용하는 판다스 버전

터미널에서 pip install pandas=={버전}를 하면 numpy는 종속이라서 같이 깔린다.

현재 연습용으로 버전은 1.2.4를 쓰고 있다.

import numpy as np
import pandas as pd

데이터프레임에 데이터를 담기 위해 Excel을 썼는데 DRM에 걸려 판다스로 바로 읽는 것은 불가했다.

import xlwings as xw

그래서 xlwings도 깔아줬다.

 

3. 컬럼 추가 방법

# 엑셀 파일 이름
filename = 'test2.xlsx'
# 엑셀 인스턴스 생성
app = xw.App(visible=False)
# 엑셀 읽은 객체 생성
wb = xw.Book(filename)
# 데이터프레임 형태로 읽기
df = wb.sheets(1).used_range.options(pd.DataFrame, index=False).value
# 인스턴스 종료
app.kill()

xlwings를 써서 읽으면 엑셀이 켜진다. 그래서 인스턴스를 잡고 닫을 수 있게 했다.

자료에 따로 index가 따로 없으면 index=False로 해야 한다. (기본값은 True)

 

df도 dt랑 비슷해서 df['컬럼명'][1] 같은 식으로 하나의 cell value를 가져올 수 있다.

[다만 columnal이기 때문에 기준이 되는 column이 먼저 쓰임]

# 컬럼 추가
df['Test'] = np.where(df['Column1'].isnull(), "값 없음", df['Column2'])

컬럼의 기본값 필터링을 위해선 numpy 객체를 쓴다.

where 메서드를 쓰고 3항연산자 형태로 입력하면 기본값이 조건에 맞게 구성된다.

 

 

4. row 필터링

# 필터링
df = df[(df['Test'] != '값 없음')]

파이썬 문법 중 특이하면서도 편리한 부분은 리스트 형태의 변수 안에 조건만 쓰면 알아서 필터링 된다는 점이다.

row 필터링은 컬럼명을 쓰는 부분에 해당하는 컬럼 조건을 써주면 된다.

string 관련 여부를 체크하려면 하기와 같이 쓴다.

df = df[df['abc'].str.contains("포함여부 확인하고 싶은 str")]

 

대전제

모든 컨설팅은 결국 좋은 프로세스를 만드는 데 목적이 있고

좋은 프로세스는 직관적, 효율적이면서 목표 기간간 충분히 지속가능하다는 특성을 가진다.

 

--------------------------------------------------------------------------------------------------------

제1원칙

이때 RPA가 추구하는 1차 목표는 안정성이며 2차로 퍼포먼스이다.

1차 안정성 보장한 후 설계를 하고, 그런 설계로 인한 예상 소요시간이 수용 가능한지 체크해야 한다.

 

제2원칙

필수와 선택을 명확히 구분해야 한다.

요구사항에서 '필수'인 것과 '되면 더 좋은 것(선택)'을 구분해야 이것을 어떻게 처리할지 판단이 된다.

보통은 요구사항에서 들어오면 필수로 인식해서 무조건 이걸 성공시켜야 된다 생각하고 필수로직과 같이 태우기 십상인데

결국 선택적 영역에서 오류가 나서 필수 프로세스가 진행되지 못하는 케이스가 많다.

특히 이런 케이스가 잦은 이유는 요구사항을 내는 주체가 대부분 상대적으로 선택적 영역에 관심이 덜하기 때문이다.

 

제3원칙

RPA로 컨트롤 할 수 있는 것과 없는 것을 구분해야 한다.

컨트롤 할 수 있는 것에는 '대응'이 필요하고, 없는 것에는 'Exception'이 필요하다.

이에 따라 디버그를 할 때도 '대응'이 실패했는지, 'Exception'처리에 실패했는지를 구분할 수 있게 설계해야 한다.

 

제4원칙

직접 인식이 어려울 땐 돌아갈 수 있어야 한다.

https://jnaul.tistory.com/303

 

[RPA] 설계와 개발을 쉽게 하기 위한 Proxy 연상

설계와 개발을 하다보면 바로 정보를 가져올 수 없거나 인식 기점을 직접적으로 가져올 수 없는 경우가 있다. 혹은 직접적으로 가져오는 경우 예외 케이스가 많아지는 경우도 있다. 그 경우 Proxy

jnaul.tistory.com

 

현상 : AR인 곳에서 batch 파일이나 스케줄러를 통해 프로세스를 실행시키고자 할 때 발생. 이벤트 뷰어에서 "Please provide the Folder Path for process" 라는 문구가 뜸

원인 : 오케스트레이터 다른 폴더내에 같은 프로세스명이 있음(어떤 프로세스를 실행시킬지 판단 불가해서 에러)

조치 : 오케스트레이터 폴더 path를 인수로 주거나 겹치는 프로세스를 삭제

https://docs.uipath.com/robot/docs/arguments-description

 

Arguments Description

To make it easier for you to work with command line arguments, navigate to the directory in which the Robot is installed using the change directory command. For example, if you did not change the default location of the Robot, you can use the following com

docs.uipath.com

예시 : UiRobot.exe execute --process UiPathDemoProcess --folder OrchFolder1 --input "{'inArg' : 'value' , 'Integer' : 3}"

조건문을 쓰다 보면 And와 Or를 자주 쓰게된다.

그러나 항상 불편한 점이 있다.

ex) dtContainer isnot nothing AND dtContainer.rows.count > 0

예시와 같은 조건을 걸면 dtContainer가 Nothing인 경우에 에러가 난다.

Nothing인 DataTable에 .rows라는 메서드를 적용할 수 없기 때문이다. (NullpointException)

물론 이런 경우 미리 build data table을 해서 테이블 기본 할당을 해놓고 row만 체크할 수도 있다.

하지만 이는 개발관점에서도 비효율적이고 프로세싱에서도 손해가 있는 방법이다.

 

첫번째 조건이 False일 때, AND로 이어진 구문은 더이상 검사할 필요가 없다

마찬가지로 Or로 이어진 구문도 앞에 나온 조건이 True면 Or 뒤에 구문은 볼 필요가 없다.

Uipath에서 이런 기능을 해주는 것이 AndAlso, OrElse라고 한다.

[파이썬에서는 And, Or만 있고 이게 기본적으로 AndAlso, OrElse의 기능을 함]

 

따라서 And와 Or는 항상 AndAlso, OrElse에 비해 어떤 상황이든 효율적이지 않다.

앞으로는 개발 시에 AndAlso, OrElse로 바꿔적으려고 한다.

설계와 개발을 하다보면 바로 정보를 가져올 수 없거나 인식 기점을 직접적으로 가져올 수 없는 경우가 있다.

혹은 직접적으로 가져오는 경우 예외 케이스가 많아지는 경우도 있다.

그 경우 Proxy 연상이 필요하다.

 

예시1)

조회 후 로딩이 끝나면 엑셀 다운로드를 눌러 파일을 다운로드 하는 진행에서

로딩이 언제 끝나는지 체크가 되지 않거나 힘든 경우를 가정하자.

그럼 보통은 delay를 주고 로딩 이미지 exist를 찍었다가 false면 진행시키려고 했다가

로딩 이미지 인식이 제대로 안 되거나 움직이거나 하는 케이스들로 고생하는 경우가 많다.

position attribute 등으로 직접적인 커버를 할 수도 있으나

기본적으로는 로딩 자체가 모달 팝업같은 형태를 띄기 때문에

로딩 중에는 화면 내 input이 작동하지 않는다.

따라서 그냥 엑셀 다운로드를 누르고 다운로드 창이 뜨는지 retry scope으로 체크해도 같은 효과를 볼 수 있다.

 

 

예시2) 

가령 RPA가 수행될 때 녹화가 수행되도록 하기 위해 녹화 프로그램의 단축키를 누르는 상황이 있다고 하자.

이 경우 녹화 프로그램을 켜고 단축키를 눌렀을 때,

폴더에 녹화를 위한 새 파일이 생겼는지를 체크하는 게 직접적이다.

이때 가장 정확한 방식은 기존 폴더의 최신 파일이름과

녹화 단축키 버튼 Send 후 폴더의 최신 파일이름을 비교하는 방식일 수 있다.

그걸 비교하기 위해서는 기존 폴더의 최신 파일이 없이 이번 녹화파일이 해당 폴더의 첫 파일인 경우 등을 고려해야 한다.

그러나 단축키 send 직전 폴더의 파일 개수를 세고 그보다 늘었는지를 체크하기는 쉽다.

 

 

좋은 개발자라면 위의 예시를 보는 중에 의문이 생길 수 있다.

'로딩이 안 끝나도 클릭이 돼버리면 정합성 문제가 생기는 거 아닌가?'

'그 타이밍에 임시파일 등이 생기면 틀어지는 거 아닌가?'

너무 당연하게도 proxy 연상을 통한 방식은 직접적이지 않기 때문에 틀어질 가능성은 있다.

다만 살짝만 보완해도 직접적인 방식과 거의 같은 수준의 안정성을 보여준다.

가령 임시파일이 생기는 케이스의 경우 확장자를 mp4 같은 영상 확장자로 필터링하면

.dat 같은 임시파일에 대해 신경쓰지 않아도 된다.

 

RPA Studio단에서의 설계는 이런 형태의 Proxy 연상이 빠르게 가능해지면서 성장하는 편이다.

어떤 면에선 '잔머리'라고도 볼 수 있다.

잔머리가 무조건 좋은 건 아니지만 초보 개발자일수록 너무 어렵게 생각해서

개발을 못 하는 케이스가 많아 글을 써본다.(나 포함)

그런 경우 이런 proxy 연상들을 서로 공유하면서 하나의 tip으로 가져가면

현업분들의 요구사항에 대응하는 실력이 빠르게 크는 거 같다.

for /f “skip=1 tokens=3%%s in (‘query user %username%’) do ( %windir%\System32\tscon.exe %%s /dest:console /password:password )

bat파일로 저장 후 관리자 권한 실행 => RDP로 붙은 세션 날려버림

다시 잠그려는 경우

Rundll32.exe user32.dll, LockWorkStation

 

https://docs.microsoft.com/ko-kr/windows-server/administration/windows-commands/tscon

 

tscon

원격 데스크톱 세션 호스트 서버의 다른 세션에 연결하는 tscon에 대한 참조 문서입니다.

docs.microsoft.com

 

 

VNC를 사용하지 않는 사이트에서는 프레임워크에 포함하여 사고를 미연에 방지할 수 있을 듯

현상 : 라이선스 갱신 이후 오케스트레이터 라이선스 조회 안 됨 + 라이선스 명칭이 studio에서 studio pro로 변경됨

추정원인 : DB 권한없음

조치 : DB  owner를 DB user account랑 일치시킴

 

듣고 정리한 케이스인데 보통 관련된 경우를 피하기 위해

온프레미스에서 오케스트레이터 설치 시 DB Owner 및 User에 권한을 부여하는 것을 꼭 체크해야 한다.

+ Recent posts