History

초기에는 Click Stream을 기록하기 위한 수단으로서 활용되었음

기존 관계형DB가 아닌 TSDB와 거의 비슷한 개념임

가능한 Group by 조합에 모두 Index를 부과하여 퍼포먼스를 제고하는 방식

다만 TSDB와는 달리 통계량을 뽑아내는 것에 대해 퍼포먼스를 높이도록 조직됨

기존에 이런 방식으로 작동하는 OLAB이 있었으나 솔루션 가격이 매우 비쌌음

그러던 중 Imply Data라는 곳에서 자신들의 기술력을 알리기 위해 OLAB 기반으로 개발하여

아파치 재단을 통해 오픈소스로 출범시켜 버림[각주:1]

이후 에어비엔비에서 드루이드를 기반한 솔루션을 개발한 것이 Superset임

초기 Superset은 연결할 수 있는 Database로 드루이드만 지원됐으나,

지금은 Postgre, Mysql 등 다양한 DB와 Connection 할 수 있게 발전함

특징

Druid와 비슷한 TSDB로 Click House, SnowFlake, BigQuery(구글), RedShift(아마존)가 있음

다만 TSDB와는 달리 Join하기가 어려움

따라서 Join하지 않아도 되는 큰 테이블을 만들어 처리하는 것이 편리

오픈소스이기 때문에 시스템이 안정적이진 않음[각주:2]

Superset은 문자형 컬럼, 숫자형 컬럼으로 나뉨

숫자형 컬럼을 Dimension으로 선택하면 새로운 통계량을 그래프로 쉽게 나타낼 수 있음

데이터를 요청자 스스로 조정하여 Group-by graph를 얻는 데 용이함

 

개발

ETL을 통해 Database에 올림

Ingestion은 Job History가 나오고 Query탭을 통해 업로드한 Data를 확인할 수 있음

보통 Dictionary로 데이터를 저장하고 JSON 형태로 Transform함

TS 기반이면서 실시간성을 띌 수 있게 조직되었기 때문에 데이터 분할 term에 대한 segment가 존재함[각주:3]

가령 Hour segment라면 1시 1분에 올리고 1시 59분에 올리면 덮어쓰기가 됨

Data Update가 어려운 TSDB 특성상 Segment 단위를 통째로 다시 올려야 제대로 업데이트가 됨

기준 데이터에서 컬럼을 삭제하면 바로 적용되어 제대로 출력되지 않음

컬럼을 추가하는 경우 'Sync Columns From Source'를 눌러 새로고침함

  1. 이로인해 OLAB의 가격이 급락하며 어떤 분야든 데이터 분석 시대가 도래했다는 후문 [본문으로]
  2. 불안정한데도 Druid의 유지비용이 다른 솔루션들에 비해 저렴한 편은 아니라고 함 [본문으로]
  3. 이를 Granularity라고 한다. 작은 양을 짧게 자주한다면 fine-grained 반대로 큰 양을 가끔한다면 coarse-grained라고 한다. Granularity는 이 두 개념의 합집합 정도로 생각할 수 있다. [본문으로]

DB연결 시 DSN으로 세팅하는 게 편하긴 하지만

Credential 변경 시 Device마다 각각 들어가서 바꿔줘야 한다.

그래서 규모가 커질 수록 Connection String을 설정해 Asset과 연동되도록 하는 것이 편하다.

 

"Driver={ODBC Driver 이름};Server=서버IP;Port=포트번호;Database=DB이름;Uid=아이디;Pwd=패스워드;"

 

ODBC는 일단 적절한 버전을 깔도록 하자. [보통 RPA에서는 32비트로 연결되므로 5점대 버전이 안정적이다]

ODBC 설정에 들어가서 '추가'를 누르면 다음과 같이 뜬다.

 

ODBC 선택창

여기서 뜨는 '이름'을 Driver에 적어주자.

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

혹시나 DB 종류가 다른 경우, 가령 오라클이면

Oracle ODBC를 깔고 Oracle ODBC connection string을 쳐서 찾아보면 된다.

다만 Driver name은 웬만해선 지정해줘야 돌아가니 체크

굉장히 드문 경우지만 IP Block 등을 막기 위해서 RPA 과제 진행 중 Proxy를 사용하는 케이스가 있다.

그 경우 지금 VPN이 돌고 있는지 아닌지를 알기 위해 기존 원래 공인 IP를 확인하고

특정 시점에 공인 IP를 확인하는 로직이 필요하다.

 

네이버에 '내 아이피 찾기' 이런 식으로 쳐도 나오지만,

RPA에서 가장 부담이 적은 방법은

Invoke Power shell에서 "(Invoke-WebRequest ifconfig.me/ip).Content.Trim()"를 실행하는 것이다.

기본 Text Command를 하드 코딩하는 경우의 설정

 

output은 Collection 객체이고 하나의 요소가 Return 된다. (= 공인 IP 주소)

 

 

오개념이 좀 있을 수 있지만 대략적인 느낌만 참고 바랍니다.

+ 기억을 다시 되돌려보니 트리거를 걸 때 specific robots를 체크하면 environment를 굳이 바꾸지 않아도 됐던 거 같은데

단톡 질문하신 분 참고해 보세요~

자주 헷갈려서 남겨둔다.

Try~Catch~Finally에서 Catch 에러가 나면 xaml의 Error Handler로 가게 된다.

따라서 Finally 구문은 실행되지 않는다.

Try에서 Terminate Workflow를 쓰면 바로 이렇게 되게 할 수 있다.

[Catch문도 안 탐]

일반적으로 다른 언어에서도 Catch문에서 에러가 나면 Finally는 실행되지 않고 에러로 처리된다.

다만 파이썬은 Finally가 실행된다. [각주:1]

  1. 이래서 Finally를 금지하는 경우도 있다. [본문으로]

변수명을 짓는 건 창의적으로 했다간 고민도 많이 하거니와

다른 분들도 알아먹기 힘들기 때문에

점점 규칙을 가져가게 되는 것 같다.

 

그 중 날짜 변수에 대한 규칙을 갈무리 해본다.

보통 날짜 변수는 3가지 형태로 들어온다.

1. datetime 형태의 변수

 - datetime으로 들어오는 경우 포맷팅을 신경쓸 필요가 없다. 따라서 000_date로 변수명을 짓는다.

 - ex) start_date, checkin_date, end_date

2. timestamp 형태의 변수

 - 마찬가지로 포맷팅을 신경 안 쓴다.

 - ex) ts, start_ts, end_ts

3. string 형태의 변수

 - 포맷팅을 신경쓰게 된다. 어떻게 들어오는지 적어주는 게 좋다.

 - ex) target_dd, start_yyyymmdd, end_yymmdd

 

다른 규칙을 가져가시는 분은 댓글 부탁 드립니다. 구경 좀 하게요.

보통 패킹된 데이터를 풀 때, index를 많이 활용한다.

가령 {'abc||def', 'abc2||def2', ....., 'abc10000||def10000'} 라는 set가 있다고 하자.[각주:1]

이 set에서 '||'를 구분자로 해서 자르고 앞 뒤를 각각 변수로 담는다고 하면,

for item in chr_set:
    first = item.split("||")[0]
    second = item.split("||")[1]

이런 형태로 구문을 쓸 수 있다.

그러나 파이썬에선 다음과 같은 형태로 언패킹을 할 수 있다.

for item in chr_set:
    first, second = item.split("||")

 

또 dict형태라고 하면,

snacks = {
    '과자': ('치토스', 120),
    '젤리': ('하리보', 70),
    '쿠키': ('칙촉', 90),
}
for kind, (name, cal) in snacks.items():
    print(kind, name, cal)

이렇게 순서쌍만 맞춰주면 바로 할당이 된다.

과자 치토스 120
젤리 하리보 70
쿠키 칙촉 90

 

특이하게도 서로간 값을 교환하는 경우에도 가능하다.

str_source = 'value'
str_target = 'value2'
print(str_source)
print(str_target)
str_source, str_target = str_target, str_source
print(str_source)
print(str_target)
value
value2
value2
value

 

  1. 뒤에 숫자는 그냥 붙여둔 것이고 사실상 그냥 랜덤한 값들이 차있다고 생각하자. [본문으로]

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

 

i) 오케스트레이터에 연결되어 패키지화 된 경우

-p 또는 --process <오케스트레이터상 매핑된 process 이름>

예 : UiRobot.exe execute -p UiPathDemoProcess

이렇게 올리면 작업 스케줄러(AR봇)로 실행하더라도 오케스트레이터에서 해당 수행의 로그를 실시간으로 확인할 수 있습니다.

 

ii) 오케스트레이터에 연결되지 않고, 파일 자체를 실행해야 하는 경우

 

일반적으로 오케스트레이터를 구매하지 않았을 때, AR에서의 방식입니다. [ex) 항공 DSR 배치 업로드 과제]

-f 또는 --file <로컬 파일 경로>

예 : UiRobot.exe execute --file "C:\UiPath\Automation\Project.json"

 

iii) 인수를 전달해야 하는 경우

--input <JSON 형태의 input parameter key-value>

예 : UiRobot.exe execute --process UiPathDemoProcess --input "{'i_sArg' : 'value' , 'i_iNumber' : 3, 'i_arrOffice' : ['본점', '지점']}"

iv) 폴더를 지정해야 되는 경우

--folder <폴더이름>

예 : UiRobot.exe execute --process UiPathDemoProcess --input "{'i_sArg' : 'value' , 'i_iNumber' : 3, 'i_arrOffice' : ['본점', '지점']}" --folder 회사이름

 

추가 TIP

+ bat 파일을 통해 실행시키는 경우 해당 파일은 ANSI 인코딩으로 저장해야 한글 인수를 전달해도 깨지지 않습니다.

+ 폴더이름은 한글이어도 상관없고, 프로세스 이름 및 폴더명은 띄어쓰기가 들어가지 않는 이상 ""을 씌우지 않아도 됩니다.

+ argument가 boolean값인 경우 소문자로 적어야 합니다. true, false

+ Recent posts