2019의 게시물 표시

(VB.NET) 1:1 Multiport connection

이미지
Basic MultiPort : https://it-jerryfamily.tistory.com/entry/Program-C-multiple-port%EB%A1%9C-%EC%9E%91%EC%97%85%ED%95%98%EA%B8%B0?category=611730 Using socket with asynchronus method : https://www.youtube.com/watch?v=cG5q4XdYIUI&t=1289s AutoScroll : https://www.youtube.com/watch?v=NCBpd3CNRIU 위의 링크에 있는 것들을 조합해서 1:1 Multiport connection을 한 것입니다. Server / Client side가 있는데 몇 가지 아직 몇 가지 문제점이 있어서 공부를 더 해야겠네요~ ㅠㅠ 문법이 생소하기도 하고 새로운 메쏘드도 너무 많아서 99%는 베껴쓰고 1% 정도만 되는데로 고쳐가면서 해결했어요 ~ 머리가 나쁘니 몸이 고생이네요~~ 이제 이걸로 사내 장비에 이더넷 통신을 해서 데이터 기록이 되는지 확인하고, DataGridBox를 추가해서 엑셀로 기록할 수 있게 하면, 꽤나 편한 프로그램이 되겠네요~ ㅎㅎ 이렇게 하는게 맞는지 모르겠는데 일단 해봐야겠네요~  해놓고 매뉴얼을 보니 이게 멀티포트가 아닌가.. Modbus란 것과 헷갈린건가 .. 아직은 잘 모르겠네요~~ https://web-material3.yokogawa.com/IMMV1000-17E_020.pdf https://drive.google.com/open?id=14aub3FWghQHV3mJt4f2aUAw2ySrAfLl6 (참고사항)                  (ServerSocket.vb : 49-53, method : serverAccept() ) socket(i).BeginAccept( AddressOf  AcceptedCallBack, socket(i) ) 다른 예제에서는 두번째 변수가 null로

(VB.NET) index가 C# 대비 하나가 작게 생성이 되네요~

이미지
VB.NET에서 마지막 Index를 Dim variable[ Last_index ] As type 으로 쓰네요~ 이걸로 며칠을 헤맸네요~ ㅋㅋ

(VB.NET) Socket communication 입문

이미지
http://vb.net-informations.com/communications/vb.net_chat_server.htm 사내에서 쓰는 장비가 직렬통신이 안되는게 있고, Active X로 동작하는 친구들이 있길래 요새 트렌드인 64비트 환경에서는 먹통인게 너무 많더라고요.. 그래서 개선된 프로그램 제작해서 배포하려고 찾아보니 VB.NET이라는 언어로 이더넷 / 직렬통신이 가능하네요~ 역시 마소구글형님들은 대단한거 같아요~~ dll을 로드해서 구현하던 VBA 방식을 베껴 쓰다가 python과 같이 단순히 Import System.Net.Sockets를 사용하는 걸 보고 정말 놀랐네요;;; 지금까지 전 뭘한걸까요~~ 여튼 장비랑 통신을 해야해서 자료를 찾다보니 위의 예제로 실행하면 가능할 것 같습니다. 위의 예제에는 송수신 버퍼사이즈가 10024로 되어있는데, 실행하면 소켓의 송수신 버퍼사이즈가 65536으로 나와서 에러가 뜨더라고요~ 그래서 바이트 버퍼 배열의 사이즈를 아래와 같이 소켓 버퍼 사이즈로 바꾸니까 되더라고요~ 이유는 모르겠습니다.. 공부를 더 해봐야겠네요.. 역시 근본없는 넘이라 제약이 많네요~ ㅋㅋ 왠지 버퍼사이즈를 줄여서 보내야 할 거 같은데요~ 해결해봐야겠네요! (For test server side)               Dim  bytesFrom( clientSocket.ReceiveBufferSize )  As   Byte (For test client side)               Dim  inStream( clientSocket.ReceiveBufferSize )  As   Byte Test server/client files above (written in SharpDevelop 4.4) https://drive.google.com/open?id=1KUANExxlHFmoZU6ZF6az4MsBlwHCX-41 아래 레퍼런스는 키사이트에서 이더넷 샘플 프로그램을 VBA로 만들어놨네요~ 에디

(ActiveX) 64비트 엑셀에서는 Active X가 동작하지 않네요~ Error 429

회사에 있는 장비들은 아무래도 ; out-of-date가 많다보니 뭔가 하나 바꿔서 설치하면 동작이 안되는 경우가 많습니다 오늘은 오랜만에 동기형이 뭔가 도와달라고 이야기해서 가보니까 PtrSafe를 입력해달라는 문구가 떠 있어서, 전에 직렬통신 모듈을 사용하던 기억이 나서 이걸 입력하면 해결되겠지? 생각하고, API 호출하는 줄에 PtrSafe를 추가를 했는데요~ 이제 Error '429' can't create object ?? 무슨 에러가 뜨는거네요. 종일 궁금해서 찾다보니까 그 VB 프로그램이 ActiveX를 통해 외부 장비와 연결이 되있는데 이게 64비트 오피스에서는 지원을 안한다는 내용이었네요~ ㅋㅋ 마소형님들도 빠져있으니 32비트 오피스를 쓰라구~ ㅋㅋㅋ (그 장비 말고도 다른 종류도 Ax로 연결된게 꽤 있는걸로 알고 있어요) https://stackoverflow.com/questions/16121232/run-time-error-429-activex-component-cant-create-object?rq=1 전에 그래서 64bit Excel에서는 타이머 API도 조금 동작이 이상하게 했던 것 같기도 하네요. 32bit Excel에서 잘되던 타이머 API가 이상하게 64bit에서는 안되길래, 타이머를 돌리기전에 한 번 톡하고 타이머를 켰다가 끄면 제대로 돌아가더란 말이죠~ 이유는 모르겠습니다 ㅋㅋ 지금도 그렇게 쓰고 있습니다. (32bit / 64bit를 구분해놨습니다.) 제 생각엔 64bit에서는 위와 같이 ActiveX server를 쓸 수 없으니까, 아래와 같이 처리해야 한다고 결론을 냈습니다. 1) 오피스를 32bit 버전을 다시 설치해서 사용함 (여러 검색 결과에서는 이 방법을 추천합니다.) 2) Serial Comm, Ethernet Comm을 직접 연결해서 SCPI Command로 장비와 통신한다. 장기적으로 보자면 역시 2)의 방법을 쓰는게 좋아보이지만 당장 편하기는 1)

(Python) Matplotlib References

https://www.youtube.com/playlist?list=PL-osiE80TeTvipOqomVEeZ1HRrcEvtZB_ 열공해야징!

(C++) Reference Links - Vector

Vectors & vector functions https://www.youtube.com/watch?v=Cq1h1KPoGBU Vectors as parameters https://www.youtube.com/watch?v=ReWNqNAhlkY&t=2s Vectors as objects https://www.youtube.com/watch?v=iPlW5tSUOUM&list=PL318A5EB91569E29A&index=22 C++ Vector Tutorial 9년 전에 자료구조 수업을 처음 들을 때엔 교수님이 이론에 대해서 쭉쭉 나열할 때 '????' 했던 기억밖에 없던 Vector container네요. 여기서부터는 아련한 과거의 기억,, 그 다음 해에 C++로 시뮬레이션에 쓸 간단한 2D 패턴 제너레이터를 만들게 되었는데요, 패턴 생성하는 사이즈나 갯수가 정해져 있지 않다보니 동적할당을 하게 되었는데, 졸업할 때까지도 포인터의 개념을 제대로 이해하지 못해서 수정할 때마다 골 아팠던 기억이 나네요~ 그렇게 9년이 흐르고 오늘 white color auto calibration의 모든 case를 확인 해보려고 생각난 김에 C++로 동적할당해서 배열을 만들어서 해보자! 하고 White는 Red+Green+Blue니까 3차원 동적할당 배열을 해야지! 하고 또 해보니까 여전히 포인터가 너무 어렵더라고요~ ㅋㅋ 그렇게 new delete하는 걸 찾다보니까 어떤 분께서 왜 Vector를 쓰지 않냐??? 알아서 할당 삭제 다 해주는데 ?? 라는 걸 보고 검색해보니, '????' -> '!!!!' 아.. 그렇게 9년이 흐르고 나서 C++ 포인터도 써야할 이유가 생기고, 그러다 보니까 어느새 Vector 튜토리얼을 보고 있는 제 자신을 발견하게 되었습니다. 세상이 참 좋아진 것 같아요. 9년 전에 이해 안되었던건데 이렇게 친절하게 설명해주시는 분이 계

(VBA) 연결된 데이터의 끝까지 복사하기 / 복사하고 삭제하기 - Recursive copy cycle의 구현

이미지
VBA로 데이터를 정리하다보면 어떤 범위의 데이터를 옮겨야 하는 경우가 자주 있습니다. (여기서부터는 작성 배경입니다.) 전에 말씀드렸습니다만 기본적으로 저는 인덱싱 방식으로 인덱스로 처리하다보니 코드가 main에 위치를 하고 가독성이 나빠지고 중간에 하나 skip이라도 할라면 완전 코드가 꼬여가지고 스파게티도 그런 스파게티가 없더라고요!! in-house program 개발하다보면 사용하시는 분들의 VOC도 일하시다보면 바뀌는 경우가 있고,(어쩔 수 없다고 생각합니다. 제품 평가 중엔 역시 어떤 factor가 주인자인지 예상하기가 힘드니까 말이에요) 또 전산전문부서가 아닌 일반부서 유저는 전사용 ERP System과 호환성도 고려할 필요도 있기 때문에, SW 고속 개발과 높은 완성도를 위해서는 역시 가독성과 생산성이 좋은 모듈이 필수라고 생각을 했습니다. 그러다보니 고안한 범용 모듈 컨셉이 recursive cycle인데, 아마 다른 분들도 꽤 많이 쓰셨을 것 같습니다만 저도 정리하기 위해서 작성해보려고 합니다. ---- (여기서부터는 소스 작성 부분입니다.) Copy 모듈의 Recursive는 굉장히 간단합니다. StartPoint[Sheet명 / Cell주소]와 TargetPoint[Sheet명 / Cell주소], Offset만 있으면 됩니다. 그리고 데이터 연결을 시켜준 뒤 Offset 값에 1을 더해서 Return 해주는 것을 반복하는데, Cell이 빈칸일 때 While을 정지시켜버리면 되겠죠! 아래와 같이 테스트 코드를 동작해보면 역시 연결된 셀은 모조리 복사가 되네요! Good! 다음으로는 Copy & Delete인데 큰 차이는 없습니다. Return전에 Sheets(StartPoint(0)).Range(StartPoint(1)).Offset(0,OffsetValue).Value를 삭제해버리면 되니까요! 긴 설명 없이 아래의 코드 (A2 -> A5 Copy 후에, A5 ->

(Node.js) XLSX 모듈 사용 / 행렬 파싱 및 조건에 맞는 데이터만 추출

이미지
요번에는 Node.js로 아래와 같이 KRX에서 코스피/코스닥 상장사 정보를 취득한 후 네이버에서 원하는 조건에 맞는 정보만 크롤링하는 모듈을 만들어보려고 합니다! 그러면 주식하는 친구들은 조건식을 걸어놓기만 해도 손 안대고 틈틈히 자동으로 수집된 정보를 확인할 수 있게 되겠네요!  (이후에는 자동 메일링까지 추가할 건데 우선은 크롤링해서 유의미한 XLSX로 Export하는 것 까지를 먼저 만들려고 합니다!) 네이버 주식에서 페이지를 확인해보니 종목코드를 기준으로 페이지 주소가 매칭이 되고, 그 유니크한 종목 코드에 유니크한 Selector를 확인하면 데이터 크롤링이 되겠네요! ----- 저는 KRX 사이트에서 업체리스트를 xls로 받아온 뒤에 추출된 결과를 중간에 result.xls로 먼저 저장해놨다가 크롤링할 때 다시 리딩해서 쓰는 방식을 구현해보려고 합니다. VBA / C++ 데이터 처리 방식이 익숙하기도 하고 나중에 불필요하면 떼버리면 되니까요? XLSX Import하는 모듈은 앞서 설명을 드렸었고요, 데이터를 Readfile한 뒤에 조건에 맞는거만 옮겨담는 작업이 필요한데요, 이를 위해 stackoverflow에서 parsing하는 알고리즘을 참고해서 아래와 같이 변형합니다! https://stackoverflow.com/questions/30859901/parse-xlsx-with-node-and-create-json 원본은 data[row][headers[col]] = value인데, XLSX에서 가상의 sheet에 데이터를 넣어주려면 array of arrays 방식이 되어야 하기 때문에, 아래와 같이 우선 빈 배열을 선언하고, row / column을 동적할당(new array()) 후 push 하는 방식으로 처리해줘야 합니다. 제가 아는 방법 중엔 이게 제대로 동작을 하기 때문에 이렇게 바꿔서 사용했습니다. 조건식은 나중에 입력받겠지만, c

(Python) Merge sorting algorithm의 구현

이미지
이번에는 Python으로 Merge sorting을 구현해봤습니다. 수업 과제라서... ㅋㅋㅋ 알고리즘은 인터넷에 이미 많이 올라와있으니까 알고리즘은 아래의 사이트에서 읽어보시면 됩니다!! (알고리즘이 최적화가 되어있지 않고 variable convention이 안 맞는게 꽤 많습니다 ㅠ, .. 걸러 읽어주세요!!!) https://www.geeksforgeeks.org/merge-sort/ ---- 사상은 우선 최소 단위인 2개까지 쪼개가지고 아래와 같이 왼쪽/오른쪽에 Handle을 배치해서 크거나 작은 순으로 데이터를 땡기고 핸들을 좌/우에서 밀어가지고 핸들이 끝까지 가면 반대쪽 데이터를 끝까지 append하는 거에요. 알고리즘이 너무 간단해서 설명이 엄청 짧네요! 크게 파트는 두 개로 나눌건데, 1. 입력을 받은 후 처리되는 배열을 정하고, 핸들 배치한 뒤에 비교하는 알고리즘을 호출하는 부분과, 2. 위에서 입력받은 데이터를 비교해서 데이터를 처리하고 정리된 데이터를 리턴하는 부분을 만들어보려고 합니다. ----- 1. 여기서부터는 입력을 받은 후 처리되는 배열을 정하고 핸들 배치, Merge sort를 호출하는 부분입니다. 1) 먼저 List의 길이를 확인합니다. (MainCount_input) 위의 알고리즘을 보면 Merge sorting 하는 Array의 size가 2배씩 커지는데, (MainMultiIndex)에서 1부터 2씩 곱해가다보면 소팅하려고 투입하는 배열 사이즈가 원본 List보다 커지겠죠! 그 때 종료 시켜버리면 되겠죠! 2),3) MainIndex는 Sorting 시작할 부분을 지정해주는 거에요, 그러니까 아래와 같은 순서로 처리가 될 거에요. (종료호출이 왜 있는지는 아래에다가 달아놓으려고 합니다!) (2개 정렬) 정렬범위 : 0~1 / 종료호출 : 2 정렬범위 : 2~3 / 종료호출 : 4 정렬범위 : 4~5 / 종료호출 : 6 .. 2개 정렬이 끝나

(Node.js) XLSX로 결과 출력하기 / 모듈 디자인 Exporting / Node.js modular design

이미지
Node.js에서 XLSX 라이브러리를 제공하기 때문에, 웹 크롤링 -> XLSX Export -> 주기적 메일링 하는 방식으로 데이터 수집이 가능할 것 같다고 생각했습니다. 그래서 이번에는 1) 전에 만들었던 웹크롤러 모듈화 2) XLSX 라이브러리를 사용해서 외부로 Export 3) 모듈화한 것을 외부에서 호출 요래 3가지를 한 번 해봤습니다! 전 근본없는 node.js 코딩을 하기 때문에 먼저 원문 내용을 읽으시는 것이 좋겠습니다. https://github.com/SheetJS/js-xlsx 이제 시작입니다. ----- 기본적으로 아래와 같이 XLSX 라이브러리를 불러오고 , 내장 wb를 하나 만들어야 합니다. 가상의 Workbook 같은걸로 이해해주셔요. // ----- XLSX Initialization part ----- // const XLSX = require('xlsx'); /* Initializing a free workbook & worksheet name*/ let wb = XLSX.utils.book_new(); // ----- End of XLSX Initialization part ----- // ----- 그 다음 let ws_data =[]; 빈 Array를 선언해버립시다. 그러면, Title과 url을 URL이 undefined가 아닐 때만 dynamic allocation하는 concept으로 아래와 같이 설정합니다. 새 행마다 new로 dynamic allocation을 하고, push로 열에다가 밀어넣는다! 는 concept입니다. 엑셀에서 행렬로 그려보면 대충 저런 모습일 것입니다.                         열        열       열 행 new array -> push() push() push() 행 new array -> push() push() push() 행 new array

(Node.js) EUC-KR을 Cheerio - Iconv-lite로 불러올 때

이미지
처음으로 Node.js로 웹 데이터 수집을 해봤는데, 글자가 자꾸 깨져서 수십번의 실패 끝에 되는 방법을 찾았습니다. 웹에는 iconv와 iconv-lite 두 가지 방법이 나오는데, iconv는 무슨 문제에선가 설치가 잘 안됩니다. 그래서 iconv-lite를 이용해서 진행했는데 이 경우에는 아래 순서로 코드가 진행될 것입니다. Request >> Cheerio >> iconv-lite 여기서 Cheerio와 iconv-lite 모듈 사용 위치가 중요한데, 만약 잘못되었다면 '占쏙옙'또는 '�'을 만나게 됩니다. 웹에서 검색해보면 인코딩이 잘못됐으니 로드된 데이터를 iconv-lite로 바꾸라고 하는데, 모듈 사용이 적절하게 되지 않고 데이터를 읽어들이면 이미 깨진 데이터를 저장하기 때문에 역으로 디코딩 자체도 당연히 제대로 안됩니다. 그래서 여기저기서 주워온 지식들을 합쳐보니까 아래와 같이 하면 해결이 됐습니다 ㅎ.ㅎ 오늘도 웹에 계신 수많은 선생님들 감사합니당!!! <방법> 1. request 옵션에서 인코딩은 Null로 설정 2. 아래와 같이 Cheerio에서 불러들일 때 iconv-lite의 iconv.decode(Target 변수, 'EUC-KR') 3. 마지막으로 데이터 출력할 때는 별도의 모듈을 사용하지 않고 .text()로 읽어들인다.