Press "Enter" to skip to content

[월:] 2019년 07월

유용한 정규식

정규식이란?
입력된 데이터의 패턴이 내가 원하는 패턴인지 검증하는데 사용한다.
예를 들어 입력값이 다 숫자로 되어 있는지… 알파벳으로 되어 있는지 등을 검사하는데 사용한다.

정규식 기초

^ : 문자열의 시작
$ : 문자열의 끝
[] : 문자열 셋, []안에서 ^쓰면 NOT을 의미함 
     ex) [ab][a-z][0-9] 라고 입력하면 첫글자는 a또는 b이고 그 다음에 a~z가 나오고 그 뒤에 0~9
       
* : 0번 이상 발생
+ : 1번 이상 발생
? : 0번 또는 1번 발생
{} : 횟수 표시
    [A]{3}이면 AAA이고 [a]{3,}이면 a가 3개 이상, [A]{2, 4}이면 A가 2개 이상, 4개 이하(AA, AAA, AAAA) 이다.
\d : 숫자, [0-9]와 동일
\D : 숫자가 아닌 것들 [^0-9]와 동일
| : OR의 의미
{} : 그룹화 한다.
. : \n 이외 모든 종류의 한 문자
\. : . 문자 
# : 숫자의 부호( + 혹은 - )

정규식 시험 사이트
https://regexr.com/
https://rubular.com/
http://www.regexplanet.com/advanced/java/index.html
https://regexper.com/
http://txt2re.com/index.php3

프로그래밍 하다가 일일이 해볼려면 수명이 단축된다.
이 사이트들에서 한번 해보고 프로그래밍에 적용하자!

정규식 예제

영문/숫자로 시작하고, 3~10자릿수 문자열

^[0-9a-zA-Z]{3,10}$ 

^ : 시작문자
[0-9a-zA-Z] : 숫자와 영문
{3,10} : 3~10자릿수
$ : 끝까지  
16진수 문자열

^[+-]?([a-f0-9]{6})$

^ : 시작문자
# : 부호문자
[+-] : + 혹은 -
? : 0개 혹은 1개. 여기서는 + 혹은 -의 부호문자가 +일 경우 생략될 수 있음.
([a-f0-9]{6}) : 0~9, a~f까지의 문자 6자리
$ : 끝까지
이메일 주소 

^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$ 

^([a-z0-9_\.-]+): 알파벳, 숫자, _, ., - 로 시작하는 1개 이상의 문자(이메일 주소의 ID에 해당함)
@: 골뱅이????
([\da-z\.-]+): 알파벳, 숫자, ., - 로 구성된 1개 이상의 문자(도메인)
\.: 그냥 .(쩜)
([a-z\.]{2,6}): 알파벳. 이 2개 이상 6개 이하인 문자열
$: 끝까지

아... 이건 복잡하다. 그냥 복사해서 쓰자
URL

 ^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w_\.-]*)*\/?$ 

이것도 그냥 복사해서 쓰자. 복잡하다.
IP 주소

 ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ 

아놔... 길다. 복잡한건 걍 복사해서 쓰기!!
HTML 태그

 ^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$ 

웹페이지 긁어올때 유용하다.

안드로이드에서 adb shell로 apk 추출하기

설치된 패키지 찾기

adb shell
pm list packages -f | grep "패키지 이름 등등 검색어"

설치된 패키기 찾기(전체 패키지를 페이지단위로 보여주기)

adb shell pm list packages | more

실제로 해보기(볼드체만이 입력 명령임-예제로 카카오톡 apk를 추출해 보겠습니다.)
명령 프롬프트 창에서 작업합니다.

C:\Temp> adb shell
beryllium:/ $ 
beryllium:/ $ pm list packages -f | grep kakao
package:/data/app/com.kakao.talk-wuLPpyq8x_j7b7eUR_6vGg==/base.apk=com.kakao.talk
package:/data/app/com.kakao.taxi-_6AcQILJ-fTin_aO2jbH_Q==/base.apk=com.kakao.taxi
beryllium:/ $ exit
C:\Temp>adb pull /data/app/com.kakao.talk-wuLPpyq8x_j7b7eUR_6vGg==/base.apk
 /data/app/com.kakao.talk-wuLPpyq8x_j7b7eUR_6vGg==/base.apk: 1 file pulled. 36.5 MB/s (96969655 bytes in 2.532s)
C:\Temp>

C:\Temp 폴더에 base.apk 라는 이름으로 카카오톡 apk가 추출되었습니다.

블루투스 Characteristic 조회

{
    List<BluetoothGattService> gattServices = bBluetoothLeService.agetInstance().lmBGatt.getServices();

    if ( gattServices == null )
    {
        return;
    }
    String uuid = null;
    String unknownServiceString = "모르는 서비스";
    String unknownCharaString = "모르는 특성";

    ArrayList<HashMap<String, String>> gattServiceData = new ArrayList<HashMap<String, String>>();
    ArrayList<ArrayList<HashMap<String, String>>> gattCharacteristicData = new ArrayList<ArrayList<HashMap<String, String>>>();
    ArrayList<ArrayList<BluetoothGattCharacteristic>> mGattCharacteristics = new ArrayList<ArrayList<BluetoothGattCharacteristic>>();

    // Loops through available GATT Services.
    for ( BluetoothGattService gattService : gattServices )
    {
        HashMap<String, String> currentServiceData = new HashMap<String, String>();
        uuid = gattService.getUuid().toString();

        gattServiceData.add( currentServiceData );

        ArrayList<HashMap<String, String>> gattCharacteristicGroupData = new ArrayList<HashMap<String, String>>();
        List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
        ArrayList<BluetoothGattCharacteristic> charas = new ArrayList<BluetoothGattCharacteristic>();

        // Loops through available Characteristics.
        for ( BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics )
        {
            charas.add( gattCharacteristic );
            HashMap<String, String> currentCharaData = new HashMap<String, String>();
            uuid = gattCharacteristic.getUuid().toString();
            gattCharacteristicGroupData.add( currentCharaData );

            List<BluetoothGattDescriptor> diss = gattCharacteristic.getDescriptors();
            for ( BluetoothGattDescriptor d : diss )
            {

                uuid = d.getUuid().toString();
                uuid = d.getUuid().toString();


            }
        }
        mGattCharacteristics.add( charas );
        gattCharacteristicData.add( gattCharacteristicGroupData );
    }
}

C # GDI + 게이지 컨트롤 사용자 컨트롤

C #의 예 : 무료 그리기 .Net GDI + 게이지 컨트롤 사용자 컨트롤

원문 : http://www.ucancode.net/Visual_C_MFC_Samples/CSharp_Example_Free_DOTNET_Gauge_Control_Draw_Source_Code.htm

자동 번역된 원문 : https://translate.googleusercontent.com/translate_c?depth=1&hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&sp=nmt4&tl=ko&u=http://www.ucancode.net/Visual_C_MFC_Samples/CSharp_Example_Free_DOTNET_Gauge_Control_Draw_Source_Code.htm&xid=17259,15700023,15700043,15700124,15700149,15700186,15700191,15700201,15700214,15700215,15700218&usg=ALkJrhjgwnWG0C7Gdwu9LnRAInCVhzJabg

파일 보관 : 데모프로젝트, 소스

 AquaGauge_dll.zip AquaGauge_src.zip

자동 번역된 원문 갈무리
[그림이 보이지 않으면 원문이 삭제되거나 변경된 것임]

스크린 샷 - AquaGauge.gif
[그림1]


소개

쉽고 강력한 .NET GDI + 를 탐색하기 위해 .NET 사용자 정의 컨트롤 을 개발하기로 결정했습니다. .NET 2.0을 사용하여 개발 된이 간단한 계기 제어 는 모니터링 목적의 전체 범위를 충족시킬 수 있습니다. GDI +를 사용하여 광택 컨트롤을 개발하는 방법을 살펴 보겠습니다.

재정의 된 사용자 정의 컨트롤 메서드

일반적으로 사용자가 완전히 그려진 사용자 정의 컨트롤을 만들면 OnPaint 및 OnPaintBackground 메서드를 재정의해야 합니다. 또한 컨트롤 스타일을 적절하게 설정해야합니다. 이 공통 스타일은 this .SetStyle(ControlStyles.XXXXX, true/false); .

SupportsTransparentBackColor이렇게하면 Gauge 컨트롤 이 true 설정된 경우 투명한 배경색을 지원할 수 true .
ControlStyles.ResizeRedraw컨트롤 크기를 조정할 때 다시 칠할 수 있습니다.
ControlStyles.AllPaintingInWmPainttrue 인 경우 컨트롤 은 깜박임을 줄이기 위해 WM_ERASEBKGND 창 메시지를 무시합니다 . 
이 스타일은 UserPaint 비트가 true 로 설정된 경우에만 적용해야 true .
ControlStyles.UserPainttrue 컨트롤 은 운영 체제가 아니라 자체를 그립니다.
ControlStyles.OptimizedDoubleBuffertrue 경우, 컨트롤은 화면에 직접적으로가 아니라 버퍼에 먼저 그려 지기 때문에 깜박임을 줄일 수 있습니다. 이 속성을 true 설정하면 AllPaintingInWmPaint 도 true 설정해야 true .

OnPaint 및 OnPaintBackground 메서드는 컨트롤을 다시 칠해야 할 때마다 호출됩니다. 예를 들어 컨트롤의 크기를 조정하거나 폼을 최소화하고 최대화하면 OnPaint 메서드가 호출됩니다.

OnPaintBackground 대 OnPaint

OnPaintBackground 는 Window의 배경 (그리하여 모양)을 OnPaintBackground 빠른 속도를 보장합니다. 반대로 OnPaint 는 세부 사항을 칠하고 개별 페인트 요청 을 다시 그려야하는 모든 영역을 포함하는 하나의 Paint 이벤트 로 결합하므로 속도가 느려질 수 있습니다 . 예를 들어 컨트롤에 그라디언트 색상의 배경을 그리려 는 경우 OnPaintBackground 를 호출 할 수 있습니다 .

OnPaintBackground 에는 이벤트와 같은 명명법이 있고 OnPaint 메서드 와 동일한 인수가 사용되지만 OnPaintBackground 는 true 이벤트 메서드 가 아닙니다 . PaintBackground 이벤트 가없고 PaintBackground 가 이벤트 대리자를 호출하지 않습니다. OnPaintBackground 메서드를 재정의 할 때 파생 클래스는 기본 클래스 의 OnPaintBackground 메서드 를 호출 할 필요가 없습니다 .

게이지 다이얼 그리기

먼저 다이얼을 그려 보는 법을 봅시다. 다이얼에는 눈금, 임계 값 표시기, 일부 텍스트 및 현재 값이 표시되어야합니다.

눈금을 그리 려면 원주에서 그려지 는 규칙의 위치를 ​​계산해야합니다. 다이얼에서 90도에서 270도 사이의 각도에서 0부터 10까지의 크기로 그려야 한다고 가정 해 봅시다. 이 경우도 (270-90 = 180)의 차이는 10 부분으로 나누어야합니다. 그려야 할 각 파트의 위치를 ​​찾으려면 다음 수식이 필요합니다.

  x = centerX + radius * cos (180 / partNo)   y = 중심 Y + 반경 * sin (180 / partNo) 

참고 : Math.Cos 또는 Math.Sin 을 사용할 때 각도를 라디안 단위로 지정해야합니다.

서클 수식
[그림2]

위치를 찾은 후 원주에 모든 유형의 눈금 표시를 그릴 수 있습니다. 나는 눈금으로 선을 그리기 로했다. 다이얼 영역은 자주 변경되지OnPaintBackground 재정의 된 OnPaintBackground 메서드 에서 그릴 수 있습니다 .

포인터 그리기

포인터를 자주 다시 칠할 필요가 있습니다. 따라서 OnPaint 메서드 에서 그리는 것이 좋습니다 . 포인터 위치를 찾는 것은 척도 그리기 의 논리와 같습니다. 포인터는 graphicsObj.FillPolygon() 메서드를 사용하여 그릴 수 있으며 현재 값을 나타내는 모든 각도로 변환 할 수 있습니다. 그렇지 않으면 현재 값에 대한 모든 변경 사항에 대해 포인터를 다시 그릴 수 있습니다.

광택을 그리기

광택을 그리는 것은 매우 간단합니다. 모든 다이얼과 포인터를 페인팅 한 후에 그라디언트 색상으로 두 개의 타원을 채우면됩니다.LinearGradientBrush 클래스는 그라디언트 칠을 그릴 수있는 기능을 제공합니다. 다이얼 위로 그라디언트 레이어를 설정하면 아래 그림과 같이 광택이 생깁니다.

광택
[그림3]

Aqua Gauge 컨트롤 사용하기

이 Aqua Gauge 컨트롤 은 Windows에서 제공하는 다른 사용자 컨트롤로 사용할 수 있습니다. 다음은 요구 사항에 맞게이 게이지를 구성하는 데 사용할 수있는 컨트롤 관련 속성입니다.

속성 이름유형기술
DialColorColor게이지의 배경색을 가져 오거나 Set .
DialTextString게이지 다이얼에 표시된 텍스트를 가져 오거나 Set 합니다.
EnableTransparentBackgroundbool투명한 배경색을 사용하거나 사용하지 않도록 설정합니다. 참고 :이 옵션을 사용하면 성능이 저하되고 컨트롤이 깜박일 수 있습니다.
GlossinessfloatGlossiness의 강도를 Get 거나 Set .
MaxValuefloats 또는 Set 게이지 스케일에 표시된 최대 값으로 가져옵니다.
MinValuefloats 또는 Set 게이지 눈금에 표시된 최소값으로 가져옵니다.
NoOfDivisionsint게이지 눈금의 분할 수를 s 또는 Set 으로 지정합니다.
NoOfSubDivisionsints 나 Set 을 각 디비전에 대한 눈금에 표시되는 세분화 수로 가져옵니다.
RecommendedValuefloat눈금에 s 또는 Set 권장 값으로 가져옵니다. 이것은 임계 영역을 그리기위한 피벗 점으로 사용됩니다.
ThresholdPercentfloat눈금에서 임계 값 영역 비율을 가져 오거나 Set .
Valuefloat포인터가 가리킬 값을 가져 오거나 Set 합니다.

가볼만한 곳

우리가 많은 조작으로 이미지를 그릴 때마다 이미지 객체에 그려서 페인트하는 것이 좋습니다. 예를 들어 계기판을 그리려면 CPU를 많이 사용하는 작업이 필요합니다. 따라서 다이얼로그를 이미지 위에 그린 다음 graphicsObj.DrawImage() 사용하여 그릴 수 있습니다. 다이얼 속성을 변경할 때마다 이미지 개체를 다시 만들 수 있습니다. 성능이 향상됩니다.

C# 사용자정의 컨트롤(게이지 컨트롤) 예제

공개된 사용자 정의 컨트롤 예제(게이지 컨트롤) C#

클라이언트 영역에 컨트롤을 그려넣는 고급 수준의 사용자 정의 컨트롤 예제임

원문 : http://www.ucancode.net/CSharp_Tutorial_GDI+_Gauge_Source_Code.htm

자동번역 : https://translate.googleusercontent.com/translate_c?depth=1&hl=en&rurl=translate.google.com&sl=auto&sp=nmt4&tl=ko&u=http://www.ucancode.net/CSharp_Tutorial_GDI%2B_Gauge_Source_Code.htm&xid=17259,15700023,15700043,15700124,15700149,15700186,15700191,15700201,15700214,15700215,15700218&usg=ALkJrhhyzJaaqUNZVYdwhf5ODUTWa2ApJg

소스파일 보관 AGaugeApp.zip
스크린샷

* 스크린샷이 안보이면 원문 사이트가 변경됬을 가능성이 높음.

* 라이센스 정책은 모름.(원문 사이트 참조)