Uipath가  타사 툴에 비해 불편한 사항 중 하나가 String 포맷의 편집이 다소 귀찮게 돼있다는 점이다.

그중 하나가 Before-After 기능인데, String의 Before와 After Word를 정해서 그 Between을 가져오는 Activity이다.

가령 "기간 : 20211217~20211231 {개행} 주최자 : James" 형태의 문자열이 있을 때 "기간 : "과 "~" 사이를 sBefore라는 변수에 넣는다고 하면 Index를 이리저리 찾아줘야 하는 귀찮음이 생긴다.

거기에 이 단어가 없는 경우까지 고려해서 분기처리를 또 해야한다.

 

간단하게 할 수 있는 방법은 다음과 같다.

split(split(sOrgStr,sBeforeStr)(1),sAfterStr)(0).Trim

split(split(sOrgStr,"기간 : ")(1),"~")(0).Trim

split(split(sOrgStr,"~")(1), environment.newline)(0).Trim

물론 이 경우 주의해야 될 케이스는 있다. 사용하고자 하는 분기 String이 앞에 또 있는 경우다.

그렇게 Occurence가 2이상인 경우는 split index의 (1)을 (2) 등으로 변경해야 하는 번거로움이 생긴다.

[라이브러리 만드는 법도 간단하므로 아예 라이브러리 만드는 것을 추천한다.]

split(split(sOrgStr,sBeforeStr)(iOccurence),sAfterStr)(0).Trim

Trim 여부도 조절하게 만드는 걸 추천한다. [어떤 값은 앞에 띄어쓰기가 있어야 시스템에서 조회되기도 함]

+ 웬만하면 이렇게 쓰더라도 값이 잘못 가져와 지거나 키워드가 변경될 소지를 고려해 split 에러 시 대처를 추가하자

보통 리소스가 충분하다면 시의성이 중요한 과제들의 경우 스케줄 텀을 짧게 두어 체크하도록 개발한다.

그러나 리소스가 충분하지 않으면,

가령 시스템에 데이터를 요청 후 오래 대기하였다가, 추후에 받아야 되는 과제 등은

메일이나 큐로 트리거 되었다 하더라도, 후속처리를 위해 특정시간 이후 Start Job 되어야 할 수 있다.

[일반적으로 시스템 요청 후 지연처리 되는 과제는 이런 복합적인 스케줄을 요구할 수 있다.]

[현업도 오케스트레이터를 접근하여 큐를 이해하고 활용하는 경우면 다른 방법도 있을 수 있다. 다만 그런 사이트는 거의 없을뿐]

 

이럴 때는 큐로 요청체크를 하더라도 후속작업을 위해 스케줄을 걸기 때문에 소스 내에서 지금의 작업 트리거가 스케쥴인지 큐인지를 구분해야 한다.

그 중 가장 편한 방법은 스케쥴 트리거를 걸 때만, Main이 되는 Xaml의 구분용 Argument를 따로 생성해 두고

그 파라미터 값을 부여해 주는 것이다.

[기본적으로 파라미터 값의 설정은 프로세스를 생성할 때부터도 가능하다.]

[물론 패키지 자체를 여러 개 생성하는 것도 가능한 선택지이다. 다만 관리 시에 소스 관련 패키지를 모두 취합해야 하는 불편함이 있으므로 Argument로 구분하고 분기를 통해 작업이 달라지는 게 합리적이다.]

 

 

 

 

주의 : 요청당 5천자까지 번역이 권장되므로 대량의 텍스트엔 부적합하다.

 

준비해야 하는 패키지 : UipathTeam.String.Activities

 

App key는 프로젝트 사이트에 요청하는 게 일반적이나 개발자가 직접 받아야 되는 케이스가 있다.

그럼 프로젝트용으로 받은 구글 아이디에서 Console을 접속해 API를 받으면 된다.

[API 및 서비스 - 사용자 인증 정보 - API Key]

 

https://console.cloud.google.com/navigation-error;errorUrl=%2Fhome%2Fdashboard

 

Google Cloud Platform

하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을 사용하려면 로그인하세요.

accounts.google.com

 

Key를 입력 후 Source Language Code와 Target Language Code를 입력하면 Input Text를 번역해 Output으로 돌려준다. [code는 하단 참조]

이때 언어 자동감지를 하게 하려면 Source Language Code를 빈 String("")으로 주면 된다.

 

 

[Language Codes]

https://developers.google.com/admin-sdk/directory/v1/languages

 

Languages Codes  |  Directory API  |  Google Developers

Send feedback Languages Codes The language codes in the table below are supported for the field Customer.language. Name Code Amharic am Arabic ar Basque eu Bengali bn English (UK) en-GB Portuguese (Brazil) pt-BR Bulgarian bg Catalan ca Cherokee chr Croatia

developers.google.com

 

프로젝트에 들어가면 자연어 처리를 너무 아무렇지 않게 요구하는 케이스들이 있다.

그러나 우리가 쓸 수 있는 리소스나 알고리즘, 모델은 보통 자연어 처리를 지원할 정도가 되지 않는다.

이때 간단한 대안으로 제시할 수 있는 것이 레벤슈타인 알고리즘이다.

 

레벤슈타인 알고리즘은 각 String을 2차원 배열로 분리해 글자 차이를 계산해주는 방식이고

패키지로 배포가 되어있다. [UipathTeam.String.Acitivities]

https://hoony-gunputer.tistory.com/entry/%EB%A0%88%EB%B2%A4%EC%8A%88%ED%83%80%EC%9D%B8-%EA%B1%B0%EB%A6%AC%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EB%91%90-%EB%AC%B8%EC%9E%A5-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0

 

레벤슈타인 거리를 이용해서 두 문장 비교하기

레벤슈타인 거리를 이용해서 두 문장 비교하기 레벤슈타인 거리는 독일의 레벤슈타인이라는 사람이 고안한 알고리즘이다. 레벤슈타인 거리란 두개의 문장을 2차원 배열로 나타내어서 각 문장

hoony-gunputer.tistory.com

 

보통 해당 사업이 조회하려는 사업이 맞나 같은 것들을 판단해서 공고를 보내주거나 하는 형태로 쓰이고

일치율은 테스트를 통해 조정을 하여 제시하길 바란다. (일반적으로는 40% 내외이나 사안의 유의성에 따라 편차는 클 수 있음.)

20.4에서 Uipath 오케스트레이터의 인증서 교체 시

인증서 Config 매핑이 자동으로 되지 않아 수동으로 매핑하고

권한을 부여해야 한다고 함.

 

 

+ 특정 버전 이상에서는 자체 발급 인증서로 인증되지 않아 IT팀에 따로 요청하여 인증서를 받기도 했음

각 시스템별로 Data Export를 하는 것을 받아보면 여러가지 형태가 있다.

xls, xlsx, csv, txt 등등 각 서버마다 DB최적화를 위해서든, 사용자 편의를 위해서든 데이터를 주는 방식이 다르다.

혹은 OCR로 데이터를 읽었더니 Structured Text가 생기고 이를 의미단위로 나누어 처리해야 되는 케이스들이 생긴다.

 

RPA로 이런 데이터를 다루기 위해서, 특히 DataTable에 넣기 위해서는 다음과 같은 방법이 있다.

 

1. Generate Data Table

 - OCR의 구조화된 텍스트를 읽기 위한 방식이지만 Amazon같이 txt로 뱉어주는 곳에서 유용하게 쓸 수 있다.

 - 규칙적으로 나누다보니 변칙적인 데이터가 있는 경우(구분자나 문법에 관련된 문자열이 데이터 자체에 포함된 경우) 문제가 생길 수 있다.

 - 일반적으로 chr(34)를 Replace하고 Input에 넣어야 잘 작동한다.

 - 특이한 데이터의 경우 Environment.NewLine(chr(10)+chr(13))이 아닌 Chr(10)으로 row가 나뉘거나, 이상한 Tab으로 컬럼이 나뉘기도 한다.[이럴 땐 그 탭을 복사해서 컬럼 구분자로 넣어줘야 함]

 - 일률적이지 않을 수 있으므로 잘 구조화된 텍스트가 아니라면 다른 방법을 먼저 시도하길 권한다. [웬만해선 CSV 체크를 하면 잘 되긴 한다.]

2. Ctrl+a 후 엑셀에 붙이기

 - 가장 원시적인 방법일 수 있으나 갓셀은 굉장히 이를 잘 인식해준다.

 - 특이한 데이터의 경우 붙일 때 Ctrl+Alt+v 로 붙이고 유니코드 텍스트 등을 선택해야 잘 인식된다.

 - 이 작업을 여러번 반복해야 하는 경우, 간헐적으로 키가 씹혀서 붙이는 Starting Cell에 v만 입력되기도 하므로 주의

 

 

이런 케이스가 아주 많이 일어나진 않는다.

Data Scraping 등이 안 되는지 체크해보고 위를 시도해 보도록 하자.

RPA를 개발하다 보면 생각보다 환경 이슈 중 윈도우 권한 관련 이슈가 많이 발생한다.

대부분의 실행, UI인식 문제는 권한 문제부터 훑어볼 정도로 흔한 문제이다.

 

다만 관리자로 실행하는 경우 Uipath를 실행하는 데 있어 애로사항이 많다.

특히 구성상 uipath를 관리자 권한으로 실행시켜야 하는데 환경에 따라 이렇게 설정하면

Machine 설정 인식이 안 되는 케이스가 있다.

따라서 최대한 실행 앱의 권한을 기본 User로 맞춰주거나 기본 User의 권한을 올려서 부여해줘야 한다.

관리자 권한으로 인한 증상은 보통 다음과 같다.

1. Ui Element 인식 불가[Xplatform, OZ Viewer 같은 내부 그리드 구성앱이 아닌데 세부 인식이 되지 않고 통으로 잡힘]

2. 관리자 권한 실행 메세지가 발생[Uipath에서 알려주는 게 일반적이고 간혹 앱 자체에서 띄우기도 함]

3. 특정환경에서만 앱의 특정기능 혹은 시작 시 알 수 없는 에러 발생[이런 경우 보통 현업 PC에서는 잘된다고 함]

4. 이벤트 뷰어에서 관련된 에러가 떠있음[응용프로그램 혹은 보안쪽에 로그가 있음]

 

i) 필수는 아니지만 기본적으로 관리자 권한으로 실행되도록 체크된 경우

앱의 실행파일의 속성에서 관리자 권한으로 실행될 수 있는 옵션들을 찾아 Uncheck 시켜주자

그럼에도 안 된다면,

C:\Windows\System32\cmd.exe /min /c "set __COMPAT_LAYER=RUNASINVOKER && start "" "실행할 파일 경로"

Start process 액티비티로 cmd.exe까지는 프로그램 경로, 그 뒤는 Parameter로 주면 됨.

[헥사 에디터를 이용하는 방법도 있으니 필요하다면 검색 "실행파일로부터 관리자 권한을 제거하는 방법"]

ii) 파일 및 폴더 권한이 필요한 경우

추정되는 폴더루트에 User의 권한이 적정수준으로 부여돼 있는지 체크

우클릭 속성 - 보안탭에서 User 선택 후 확인

iii) 레지스트리 권한이 필요한 경우

드물게 이런 케이스들이 있다. 앱에서 로컬 레지스트리에 해당 프로그램의 권한 유저값을 변경하는 등의 행위로 보안 처리를 해놨는데 윈도우 업데이트 등으로 일반 유저의 레지스트리 편집 권한이 없어진 경우이다.

이 경우 레지스트리 편집기의 폴더를 우클릭하면 마찬 가지로 권한 부여가 가능하다.

 

 

+ UAC(사용자 계정 컨트롤) 관련 팁

- 로컬 보안 정책을 실행

- 로컬 정책 - 보안 옵션 - 사용자 계정 컨트롤 : 관리 승인 모드에서 모든 관리자 실행 => 사용 안 함

[단, 보안 관련해서 담당자와 상의할 것을 추천함. 출처가 불분명한 앱들이 실행할 수 있도록 열어주는 것이기 때문]

 

가끔 과제중에 ISO를 mount하고 특정 프로그램을 실행시켜, 그곳에 있는 정보를 가져와 처리해야 되는 케이스도 있다.

ISO는 PC가 재부팅되면 unmount 되는 경우가 있어 최초에 mount를 확실히 해버리는 것이 좋다.

아래의 코드를 invoke powershell script를 통해 실행하면 CD를 Unmount한 후 Mount한다. [Is Script 체크 필요]

string.Format("dismount-DiskImage -ImagePath ""{0}"""+Environment.NewLine+"dismount-DiskImage -ImagePath ""{1}"""+Environment.NewLine+"{0}"""+Environment.NewLine+"mount-DiskImage -ImagePath ""{1}""",첫번째 ISO경로, 두번째 ISO 경로)

[unmount 후 다시 mount해주는 코드. 그렇지 않으면 계속 새로운 드라이브에 같은 것을 mount하게 됨]

Type Argument를 Object로 바꿔주면 Output 받아오는 과정에서 에러가 안 남.

그렇지 않은 경우 Mount 이후 에러가 발생할 수 있으나 Mount는 성공적으로 됨을 확인했음.

[그래도 에러가 나면 경로가 바뀌었다든지 하는 케이스를 잡을 수 있기 때문에 Type Argument는 귀찮더라도 바꿔주자]

+ Recent posts