본문 바로가기

C#, MONO28

c# 프로세스 동작시간 측정 프로세스 동작시간 측정 신호 처리과정에서 알고리즘이 효과적인 방법인지 알고 싶을때 특정 코드의 동작 시간을 측정하고 싶을 때가 있습니다. C#에서는 이를 위한 내용이 준비되어 있습니다. Stopwatch를 이용해서 sw.Start()와 sw.Stop()으로 실행 시간을 구합니다. 한번만 프로세스를 해서는 구하기 어렵기 때문에 cnt 만큼 반복한 후에 이를 평균내서 실행 결과를 측정합니다. 출력된 결과도 그때 그때 다른 값을 보입니다. 이건 어쩔수 없네요. 그래서 다수의 프로세서 사이의 동작 시간을 비교 측정하는 방법이 좋겠네요 using System.Diagnostics; pulic func(){ Stopwatch sw = new Stopwatch(); int cnt_size = 1000; sw.Star.. 2021. 11. 12.
c#의 구조체 C#의 구조체(structure)와 클래스(class) c언어에서 많이 활용되는 구조체는 c#에서도 사용이 가능합니다. 형태상으로 보면 구조체와 클래스는 다르지 않습니다. 다만 구조체는 객체 지향성 특성이 없기 때문에 상속 권한이 없습니다. 그래도 아주 단순한 형태로 데이터 묶음을 만들어서 함수의 파라미터로 사용할 수 있어 편리합니다. 구조체의 구조 c#에서 구조체는 멤버를 초기화하는 함수, 멤버를 내보내거나 할당하는 함수 등을 함께 포함할 수 있습니다. 물론 연산도 가능합니다. 아래의 예는 실제 신호처리의 다이내믹 처리를 위해 사용되는 파라미터를 구초체 묶으로 만들어 사용하는 내용입니다. 이 중에서 Data_Set()는 구조체의 모는 멤버를 할당해 줍니다. 기타 함수들은 멤버 값을 반환해 줍니다. pu.. 2021. 10. 8.
c# 다항식 연산 다항식 연산 다항식(Polynomial)과 다항식 간의 연산은 신호처리 과정에서 가끔 사용합니다. 특히 필터 합성에서 계수를 합성할 때 사용합니다. 이 글에서는 C#으로 다항식의 덧셈과 곱셈을 하는 클래스를 만들어 보겠습니다. 다항식 연산용 클래스 다음과 같이 다항식의 차수 degree와 차수별 계수를 기록하는 클래스를 만듭니다. 계수 coef는 차수보다 1개 더 많이 사용됩니다. 즉 degree = 2면 $a_2 x^2 + a_1 x + a_0 $ 형식으로, coef []는 $[a_2, a_1, a_0 ]$로 기록됩니다. 아래의 클래스는 Add()는 다항식 덧셈 연산을, Multiply()는 다항식 곱셉 연산을 합니다. using System; namespace test_IIR_FreqResponse .. 2021. 10. 8.
c#의 배열과 리스트 배열과 리스트 c#에서 배열(array)과 리스트(list)는 다수의 데이터를 처리하는데 유용합니다. c#에는 매우 다양한 형태의 배열과 리스트가 있고, 이를 활용하는 방법또한 매우 다양합니다. 이글에서는 배열을 초기화하는 방법등의 기초적인 내용과 함께 배열과 리스트를 상호 변환하는 방법을 알아보겠습니다. 다차원 배열의 할당 c#에서는 다차원 배열은 다음과 같이 할당합니다. int[] Array1 = new int[20]; int[,] IntArray20 = new int[20,30]; 다른 다차원 배열 방법도 있습니다. 초기 할당 방법이 C와 유사합니다. const int size_x = 10; const int size_y = 20; Float[][] a; a = new float[size_x][];.. 2021. 10. 6.
c#의 Enum 멤버의 정보 추출 Enum 멤버의 이름 추출 또는 할당 번호 추출 C#에서 Enum을 사용하면 함수간에 변수를 전달할때 변수의 조건을 명시적으로 제한하기 때문에 코딩하기 매우 편리합니다. 혹은 조건에 따라 코딩을 분리하거나, 데이터의 내용을 제한적으로 할 수 있고, 내용을 특정 문자로 변경해서 사용하기 때문에 매우 좋습니다. 그런데 가끔 Enum의 멤버의 이름을 문자로 반환받거나, 할당된 번호를 사용하고 싶을때가 있습니다. 이 글에서는 Enum의 멤버에 대한 정보를 추출하는 방법을 알아보겠습니다. 실험용 Enum 만들기 두 개의 Enum을 만들겠습니다. 그리고 멤버 할당 번호를 숫자와 문자(char)로 해보겠습니다. public enum TP{ abc=0, efg, hij, }; public enum TQ { abc = .. 2021. 10. 6.
테이블 컬럼 조작 SQLite의 테이블 조작 테이블에 컬럼을 추가 싶을 때가 있습니다. 다음과 같이 하면 됩니다. ALTER TABLE user ADD (note TEXT); 테이블의 이름을 변경하고 싶으면 다음과 같이 하면 됩니다. ALTER TABLE user RENAME COLUMN 'note' to 'memo'; 2021. 8. 21.
c#에서 Sqlite를 연결, 데이터 읽어 오기, 수정하기 C#에서 SQLite를 사용하기 윈도즈에서 sqlite를 사용하려면 다음과 같이 정의하면 됩니다. using System.Data.SQLite; c#-mono로 리눅스에서 사용하려면 다음가 같이 nuget 패키지를 설치합니다. 데이터 베이스 연결 문장 윈도즈에서 데이터베이스 파일과 sqlite를 연결하는 문장은 다음과 같이 설정해야 합니다. _conn_string = string.Format("Data Source={0}",_db_file); 리눅스용은 다음과 같이 설정합니다. _conn_string = string.Format("URI=file:{0}",_db_file); 데이터 불러오기 윈도즈에서 데이터베이스에 기록된 ID에 해당하는 이름을 가져오는 내용입니다. 이 함수는 ref로 결과를 받습니다. .. 2021. 8. 20.
데이터의 추가 및 삭제 데이터의 추가 하나의 데이터를 추가하는 방법은 다음과 같습니다. insert into user (ID,name,age,addres) VALUES (1,"lee",12,"") 여기서 앞의 컬럼 이름을 제외하고 생성해도 됩니다. insert into user VALUES (1,"lee",12,"") 다음과 같이 성성된 내용을 확인할 수 있습니다. 데이터의 삭제 컬럼의 삭제는 WHERE을 포함한 조건문으로 실행합니다. 여기서는 ID=1인 조건을 만족하는 내용을 삭제해 보겠습니다. delete from user where ID=1; 다음과 같이 부등식 기호를 이용해서 삭제할 수도 있습니다. delete from usert where age 2021. 8. 20.
데이터베이스 파일 만들기 파일 만들기 DB Browser에서 모든 작업을 하면 됩니다. 가장 먼저 원하는 데이터베이스 파일을 만듭니다. 확장자는 일반적으로 *.db를 사용하면 됩니다. 다음과 같이 DB Browser->파일->새데이터 베이스 파일을 선택하고 test.db를 만들어 보겠습니다. 그러면 다음에 편리하게 데이터베이스에 포함될 테이블을 만들게 도와줍니다. 그런데 이 화면은 사용하지 않도록 취소를 선택합니다. 테이블 만들기 우리는 SQL(structured query language)를 이용해 보겠습니다, 이는 나중에 c#과 같은 프로그램 언어에서 활용하는 개념을 이해하기 위해서입니다. 주 화면에서 SQL 실행을 찾아 선택합니다. 그러면 아래 그림과 같이 SQL을 입력할 수 있는 화면이 보입니다. 그리고 다음과 같이 테이.. 2021. 8. 20.
INI 파일 다루기 INI 파일 최근에야 XML, registry를 주로 사용하지만 매우 간단하게 프로그램 운영 정보를 기록하는 방법으로 여전히 INI가 사용됩니다. 내용을 간단하게 수정이 가능하기 때문에 편리하기도 합니다. 특히 프로그램 초기화 조건을 기록하기에 매우 유용하며, registry를 사용하지 않기 때문에 윈도우즈와 리눅스에서 모두 사용이 가능합니다. test.ini를 다음과 같이 만듭니다. 여기서 사용 목적은 uart 통신 속도를 ini를 이용해서 기록하고 불러기를 해보겠습니다. [UART] BAUD=19200 먼저 Nuget을 이용해서 IniParser를 참조로 등록합니다. 그리고 다음과 같이 초기 내용을 사용합니다. using IniParser; using IniParser.Model; string ini.. 2021. 8. 14.
OS 알아보기 Linux OS 확인 C#은 윈도우즈와 리눅스에 모두 동작합니다. 그런데 어떤 OS인지에 따라 사용하는 리소스에 접근하는 방법이 다릅니다. 특히 통신이나 데이터 베이스 접근을 다르게 해야 합니다. 그래서 C#이 동작할때 어떤 OS 상태인지 알 필요가 있습니다. 다음 코드는 동작 OS가 리눅스이면 true를 반환합니다. private static bool isLinux(){ bool ret=false; try{ int p=(int)Environment.OSVersion.Platform; ret=(p==4)||(p==6)||(p==128); } catch(Exception){ ret = false; } return ret; } 광고좀 꾹 눌러주시면 고맙겠습니다. 2021. 8. 14.
프로그램 중복 실행 방지하기 같은 응용 프로그램을 두 개 이상 실행을 방지할 필요가 있습니다. 특히 통신 포트 등을 사용할 때는 중복 실행을 방지할 필요가 있습니다. 다음과 같이해서 현재 프로그램을 가져옵니다. string current_prog = System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToUpper(); GetProcessesByName()을 이용해서 현재 프로그램이 몇 개 동작하는지 p에 기록합니다. 즉 p의 수량이 1이 아니면 중복으로 프로그램이 동작중임을 알 수 있습니다. System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName(current_prog); c#의 Prgram의.. 2021. 8. 14.
로그(Log) 를 남기고, 오래된 로그 파일 자동 삭제 로그 남기기 프로그램 운영 관리를 위해서는 로그(Log) 파일을 생성하고, 프로그램 진행 상태를 로그로 남기도록 만들기도 합니다. 로그 파일은 일간, 주간, 월간으로 새로운 파일을 만들고 기록하면 관리하게 가 편리합니다. 그런데 로그 파일을 무작정 기록하면, 누적된 파일의 크기가 문제가 됩니다. 특히 용량이 제한된 임베디드와 같은 소형 장비에서는 기록장치의 용량이 제한되어 있기 때문에 더욱 문제가 되기 때문이다. 그래서 누적 가능한 일자를 제한하여, 파일을 삭제하는 방법을 로그 파일에 함께 사용합니다. MonoDevelop.TaskForce.Utilities의 LogUtil로 로그 파일 만들기 다음은 LOG 디렉터리에 날자별로 로그파일을 Text 내용으로 기록하고, 60일 간격으로 오래된 파일을 삭제하는.. 2021. 8. 14.
c#에서 ssh scp로 bash 명령어 실행 및 파일 전송 C#에서 ssh 실행 c#에서 ssh를 실행해서 Raspberry Pi를 조정할 수 있습니다. 또 ssh의 scp를 이용해서 파일 복사도 가능합니다. 먼저 Nuget 패키지 관리자를 이용해서 다음의 내용을 추가합니다. Renci.ssh.net과 WinSCP의 두 가지 방법으로 실행 방법을 선택해서 적용이 가능합니다. Renci.ssh.net을 이용한 bash 명령어 사용 다음 코드는 ssh로 Raspberry PI로 접근해서 ls -la이라는 명령어를 실행하고 결과를 PC의 콘솔로 출력하는 내용입니다. 다른 명령어를 사용해도 됩니다. using Renci.SshNet; using Renci.SshNet.Sftp; using Renci.SshNet.Common; SshClient client = new S.. 2021. 8. 11.
c#과 Python의 연동 C#과 Python 연결 Linux에서 Python의 입지는 매우 큽니다. 특히 머신 러닝(machine learing) 관련된 내용은 Python으로 작성된 결과가 많아, 이를 c#에서 직접 사용하고 싶은 욕망이 큽니다. 이 글에서는 Python의 코드 내용을 실행하고 결과를 얻는 방법을 알아보겠습니다. C#에서 Python 설치 먼저 VisualStuio에서 c# 프로젝트를 만들고 Nuget 패키지 관리로 IronPython을 참조로 추가합니다. 그러면 c#에서 python으로 접근할 수 있게 됩니다. Python class의 함수로 접근 먼저 python에서 Calculator.py의 class를 만들고 덧셈을 실행하는 함수를 선언합니다. class Calculator(object): def add.. 2021. 8. 11.
Enum의 정보 변환 하기 C#의 Enum c#에서 Enum의 유용성은 말할 나위가 없습니다. 이글에서는 더욱 유용하게 Enum을 사용하는 방법을 다뤄보겠습니다. 먼저 다음과 같이 Test란 이름으로 Enum을 정의하겠습니다. public enum Test{ abc = 1, efg = 0 }; Enum의 멤버 이름을 문장형 리스트로 변환 이때 리스트는 Enum을 정의할 때 함께 정의한 숫자 순서로 만들어집니다. var Test_List = Enum.GetNames(typeof(Test)); Enum 멤버를 문장으로 직접 반환 var str0 = Test.abc.ToString(); 또는 다음과 같은 방법으로도 가능합니다. var str1 = Enum.GetName(typeof(Test),Test.abc); Enum 멤버에 할당된 .. 2021. 8. 11.
문장 변환 정리(1) 숫자형 문자를 정수로 반환 숫자만 포함된 문자를 정소로 변환하는것은 매우 쉽습니다. 다만 문자에 숫자만 있다고 확실히 보장해야 합니다. int value = Convert.ToInt32(str); hexString을 정수로 변환 int n = Int32.Parsse(string,System.Globalization.NumberStyles.HexNumber); 문장이 숫자를 표현하는지 확인 str = "1234"; int num = 0; bool is_num = int.TryParse(str,out num); if(is_num==true){ //- 숫자형 문장입니다. //- num에 숫자가 기록된다. } 원하는 문자들만 출력, 특수문자를 제외하는 방법 using System.Text.RegularExpre.. 2021. 8. 11.
SQlite SQlite는 소형 데이터베이스를 구현하는데 매우 유용한 방식입니다. 기능도 소형 장치를 위해 적합한 수준입니다. Linux에서는 다음과 같이 SQlite를 설치하고 데이터베이를 생성하고 관리하는 브라우저도 함께 설치합니다. 이 브라우저는 Windows용도 있어 사용이 편리합니다. sudo apt-get install sqlite3 sudo apt-get install sqlitebrowser 다음과 같이 vnc로 접근해서 개발 부분을 보면 DB Browser for SQLite를 실행하면 데이터베이스 접근 및 생성이 가능합니다. 또는 ssh에서 sqlitebrower를 쓴 다음에 실행해도 아래의 화면을 볼 수 있습니다. 2021. 8. 10.
유용한 File 접근 c#에서는 편리하게 파일에 접근하는 방법을 제공합니다. 이 방법은 MONO를 사용해서 linux에서도 동일한 결과를 얻어 줍니다. 현재 디렉터리 System.IO.Directory.GetCurrentDirectory() 파일 존재 여부 if(File.Exists(this.scene_file) == true){...} 경로와 경로의 합성 string db_dir = Path.Combine(System.IO.Directory.GetCurrentDirectory(),"DB"); 파일명. 확장자 추출 string filepath = @"D:\다운로드\POP\Survive You.mp3"; string file_fullname = System.IO.Path.GetFileName(filepath); // "Surv.. 2021. 8. 9.
float[]를 double[]로 변화 신호처리를 하는 과정에서는 형 변화를 많이 하며, 배열로 된 다수의 데이터를 for문을 사용하지 않고 한꺼번에 변환하도록 간결한 코드 방법이 편리할 때가 있습니다. lamda 식을 이용해서 float []을 double []로 변환하는 방법은 다음과 같습니다. double[] d = Array.ConvertAll(data.ToArray(),x => (double)x); 물론 원하는 형식을 사용해서 변환이 모두 가능합니다. 2021. 8. 9.