<?xml version="1.0" encoding="utf-16"?><ClipboardData Version="1.0" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:sap2010="http://schemas.microsoft.com/netfx/2010/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:ui="http://schemas.uipath.com/workflow/activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><ClipboardData.Data><scg:List x:TypeArguments="x:Object" Capacity="1"><ui:InvokeCode ContinueOnError="{x:Null}" x:Name="__ReferenceID0" sap2010:Annotation.AnnotationText="iCollectCnt만큼 뽑아줌" Code="Dim randomGenerator As New Random()&#xA;RandomThreeList = OriginalList.OrderBy(Function(x) randomGenerator.Next()).Take(RequestNo).ToArray()" DisplayName="랜덤으로 뽑기 Invoke code" VirtualizedContainerService.HintSize="1436,196"><ui:InvokeCode.Arguments><p:InArgument x:TypeArguments="x:Int32" x:Key="RequestNo">[iCollectCnt]</p:InArgument><p:InOutArgument x:TypeArguments="s:String[]" x:Key="RandomThreeList">[arrRandomCard]</p:InOutArgument><p:InArgument x:TypeArguments="s:String[]" x:Key="OriginalList">[arrNormalCard]</p:InArgument></ui:InvokeCode.Arguments><WorkflowViewStateService.ViewState><scg:Dictionary x:TypeArguments="x:String, x:Object"><x:Boolean x:Key="IsPinned">True</x:Boolean><x:Boolean x:Key="IsAnnotationDocked">True</x:Boolean></scg:Dictionary></WorkflowViewStateService.ViewState></ui:InvokeCode></scg:List></ClipboardData.Data><ClipboardData.Metadata><scg:List x:TypeArguments="x:Object" Capacity="4"><scg:List x:TypeArguments="x:Object" Capacity="4"><x:Reference>__ReferenceID0</x:Reference></scg:List></scg:List></ClipboardData.Metadata></ClipboardData>

 

 

 

그냥 숫자 하나를 Random으로 뽑으려면,

New Random().Next(min, max)

2022년 10월인가부터 MS에서 보안상의 이유로 일반 smtp 호스트 + 포트만 가지고 메일을 보낼 수 없게 했다.

그에 따라 방식이 좀 바뀌었다.

Secured SMTP (required info)

Server: "회사도메인.mail.protection.outlook.com"
Port: 25
Ignore CRL: True
SecureConnection: StartTls
Sender Address: "보내는 사람으로 할 메일"

 

결국은 host가 나름 protection 서버로 넘어간다는 게 다른 점이 되겠다.

원래라면 tls나 ssl을 검사하겠으나 ignore CRL을 통해 skip해 주었다.

 

※ 쓰고보니 수신자가 좀 길어질 때는 에러가 난다. 이에 대비가 필요하다.

환경: Load balancer가 있는 airflow 2.5로 배치. worker는 2~3대

AS-IS: worker에서 output하는 경로를 지정(/app/data/) -> output하는 경로는 worker들간 file이 동기화가 될 수 있게 처리

이슈: dag별로 다른 worker에서 처리가 되는 상황에서(로드밸런싱) druid input하는 dag와 output file을 정리하는 dag가 각각 다른 worker에서 실행. 동기화가 되기 이전에 init dag가 실행되면 에러. 또는 동기화 과정에 stuck이 생겨 제대로 진행되지 않으면 각 dag가 같은 곳에서 실행되지 않는 한 에러남.

 

해결책

결국 중앙처리를 해야 하는데, 생각나는 해결법은 2가지다.

1. kafka로 produce, consume

2. s3 같은 cloud나 NAS 같은 공동 space에 작업

1은 기존 소스 기준 변경점이 크고 scale도 크지 않아서 2로 작업 계획

1을 잘 모듈화 시켜놓으면 kafka가 있을만한 규모의 아키텍쳐에선 괜찮을 거 같다.

드물게 Find Children을 통해 element값을 가져와서 동적으로 처리해야 하는 케이스가 발생한다.

그 과정에서 기준 요소를 찾고 규칙적인 값을 Datascraping으로 가져올 수 있다.

다만 규칙에 반하는 예외요소들이 있을 수 있다.

가령 호텔의 후기를 가져오는데 어떤 후기는 특정 값이 채워져 있고 어떤 후기는 안 채워져 있어서

후기 폼이 달라진다고 가정하자.

이 경우 2가지 접근법이 있을 수 있다.

1. Datascraping을 경우의 수만큼 n번 나눠서 하고 결과물을 merge한다.

2. 각 element를 쪼개면서 조건을 따지고 가져온다.

2번으로 하고 싶은 경우 먼저 Find Children으로 element ienumerable을 가져오고,

각각의 element의 속성값을 가져와야 한다.

단, 이 방식은 VB.NET으로만 되는 것으로 보인다. (C# 템플릿에서는 해당 method가 없음)

[VB.NET] 에서의 방식

assign을 활용해 다음과 같이 설정

sValue = DirectCast(uiElementVar.Get("text"), String)

[Get의 ToString이 어떤 형태를 overide해야 할지를 모르기 때문에 에러가 난다. 예를 들어 속성값중 boolean인 value도 있고 region 객체가 나올 수도 있다. 그래서 DirectCast를 했는데 스타일에 따라 object로 일단 받아놓고 그 값을 ToString해서 쓸 수도 있다.]

[C#]에서의 방식

invoke code를 통해 다음과 같이 설정

Arguments에 in으로 uielement 변수, out으로 value를 받을 string 변수 설정

string elementText = uielementVar.Get("innertext").ToString();
sResult = elementText;

 

이때 get을 해오는 기전은 DataScraping이 하는 것과 동일하다.

(Find Children을 할 때 이미 한번에 해당 데이터 아래의 요소들을 한번에 다 긁어온 거로 볼 수 있다.)

따라서 각각 get Text를 하는 것에 비해 속도가 월등히 빨라진다.

복잡한 조건으로 가져오는 게 아니라면 웬만하면 Datascraping으로 가져오는 것을 권장한다.

https://jnaul.tistory.com/333

 

[Uipath] Data Scraping에 대해[2023-03-02 수정]

1. DataScraping이란? Uipath의 강력한 장점 중 하나는 RPA의 Main Demand에서 많은 비중을 차지하는 '웹크롤링'을 코딩하는 생산성이 매우 좋다는 점이다. 그걸 가능하게 해주는 핵심적인 기능이 Data Scrapin

jnaul.tistory.com

 

※ aaname같이 uipath에서 임의로 붙여주는 것은 못 가져오는 케이스도 있어 보인다. 별 문제가 없으려면 최대한 element 내부의 고유 속성 기준으로 가져와야 될 거 같다.

※ 기왕 나눠서 가져오고 있다면 값에 대한 정합성 체크를 넣어주는 것을 추천드린다. 그러지 않고는 이런 구조로 가져갔을 때의 장점이 많이 사라진다.

https://soooprmx.com/%ed%8c%8c%ec%9d%b4%ec%8d%ac%ec%9d%80-%ec%9d%b8%ed%84%b0%ed%94%84%eb%a6%ac%ed%84%b0%ec%96%b8%ec%96%b4%ec%9e%85%eb%8b%88%ea%b9%8c/

 

파이썬은 인터프리터언어입니까? · Wireframe

최근에 많이 보게 되는 질문 중 하나가 ‘파이썬은 인터프리터 언어입니까? 컴파일언어입니까?’라는 것이다. 개인적으로 이 질문은 사람을 참 난감하게 하는데, 어떻게 답해야하나에 앞서 아

soooprmx.com

 

요약하자면,

1. 컴파일이란 광의적으로 특정 언어를 다른 언어로 번역하는 의미를 지닌다.

2. 인터프리터란 즉각적으로 한줄한줄을 실행시키는 실행 형태를 의미한다.

3. 따라서 어떠한 언어가 컴파일 언어인지 인터프리터 언어인지를 따지는 것은 질문이 잘못 되었다. 이는 언어구현의 문제이기 때문이다.

 

파이썬이 일반적으로 동작하는 방식은,

소스코드를 바이트코드로 변환 후 이 바이트 코드를 해석기가 한번에 실행하는 방식이다.

물론 한줄한줄 해석기가 실행하는 방식도 가능하겠지만

(그리고 이렇게만 동작한다면 완전히 '인터프리터' 언어겠지만)

그렇게 하면 당연하게도 퍼포먼스에서 크게 손해를 보게 된다.

유지보수 cost때문에 Linq를 아주 권장하지는 않지만,

row의 type으로 인한 이슈나 속도 이슈를 막기 위해서,

꼭 써야될 때가 있다.

특히 datatable간의 비교가 많은데 다음과 같은 경우 2개가 질문이 많이 나오는 걸로 보인다.

 

[상황1] dtData1의 키값이 dtData2의 키컬럼에 존재하는 경우 포함[키컬럼 type은 int]

[Assign] dtOutput = (from row1 in dtData1.AsEnumerable()
                     join row2 in dtData2.AsEnumerable() on row1.Field<int>("Key") equals row2.Field<int>("Key")
                     select row1).CopyToDataTable()

 

[상황2] dtData1의 키값이 dtData2의 키컬럼에 존재하는 경우 미포함[키컬럼 type은 int]

[Assign] TempKeys = (dtData2.AsEnumerable().Select(row => row.Field<int>("Key"))).ToArray()

[Assign] dtOutput = (dtData1.AsEnumerable().Where(row => !tempjoin.Contains(row.Field<int>("Key")))).CopyToDataTable()

이슈 : sql을 dataframe으로 변형하는 과정에서 groupby를 할 때 groupby key값에 NaN이 존재하는 경우 해당 row들이 삭제되어 정합성이 맞지 않음

원인 : groupby시 기본 dropna=True로 설정돼 있음

조치 :

1. groupby 옵션에서 dropna=False로 변경 

2. insert시 NaN이 있으면 문제가 있기 때문에

df.replace({np.nan: None}, inplace=True)

로 NaN을 None으로 replace해줌

들여야 할 습관 : groupby해서 NaN인 경우를 살려야 되는지 꼭 체크하고 dropna를 바꿔주자

+ Recent posts