원격연결정보를 깔끔하게 제거하는 방법입니다.

 

실행 > regedit 로 레지스트리 편집기를 실행합니다.

 

HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default 이로 이동해서

아래 그림과 같이 오른쪽의 원격 IP 주소가 적힌 항목들을 제거합니다.

 

아래쪽에 Servers 의 IP 폴더들이 있는데 이것도 삭제합니다.

(HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers)

 

여기까지 하면 모두 깔끔하게 원격연결정보가 삭제됩니다.

 

CustomExpandEditor Class 를 작성합니다.

    public class CustomExpandEditor : Editor
    {
        public static BindableProperty IsExpandableProperty
        = BindableProperty.Create(nameof(IsExpandable), typeof(bool), typeof(CustomExpandEditor), false);

        public bool IsExpandable
        {
            get { return (bool)GetValue(IsExpandableProperty); }
            set { SetValue(IsExpandableProperty, value); }
        }

        public CustomExpandEditor()
        {
            TextChanged += OnTextChanged;
        }

        private void OnTextChanged(object sender, TextChangedEventArgs e)
        {
            if (IsExpandable) InvalidateMeasure();
        }
    }

 

xaml 에 아래처럼 작성합니다.

        <cntrols:CustomExpandEditor x:Name="memoEditor"
                                    IsExpandable="true"
                                    Placeholder = "내용"
                                    PlaceholderColor="#95969B"
                                    BackgroundColor="SkyBlue"
                                    Margin="7,0,7,0"
                                    MaxLength="50" />

IsExpandable 이 true 인 경우에는 글자 수에 따라서 글자가 잘리지 않고 크기가 늘어납니다.


 Android

iOS



 

 

        #region ImageToBytes

        /// <summary>

        /// 이미지를 바이트 배열로 변환합니다.

        /// </summary>

        /// <param name="image">변환할 이미지입니다.</param>

        /// <returns>바이트배열입니다.</returns>

        byte[] ImageToBytes(Image image)

        {

            // 이미지 포멧을 가져옵니다.

            ImageFormat imageFormat = image.RawFormat;

            using (MemoryStream memoryStream = new MemoryStream())

            {

                // 이미지 포멧에 따라 스트림에 이미지를 저장합니다.

                if (imageFormat.Equals(ImageFormat.Jpeg))

                {

                    image.Save(memoryStream, ImageFormat.Jpeg);

                }

                else if (imageFormat.Equals(ImageFormat.Png))

                {

                    image.Save(memoryStream, ImageFormat.Png);

                }

                else if (imageFormat.Equals(ImageFormat.Bmp))

                {

                    image.Save(memoryStream, ImageFormat.Bmp);

                }

                else if (imageFormat.Equals(ImageFormat.Gif))

                {

                    image.Save(memoryStream, ImageFormat.Gif);

                }

                else if (imageFormat.Equals(ImageFormat.Icon))

                {

                    image.Save(memoryStream, ImageFormat.Icon);

                }

 

                // 배열을 선언합니다.

                byte[] buffer = new byte[memoryStream.Length];

 

                // 배열을 체웁니다.

                memoryStream.Seek(0, SeekOrigin.Begin);

                memoryStream.Read(buffer, 0, buffer.Length);

 

                return buffer;

            }

        }

        #endregion

 

지금은 Azure 시대 (Azure Value Pack)

https://ms.ebook.co.kr/Microsoft_Azure_kit/#page=16

 

Microsoft Learn Azure 소개

https://docs.microsoft.com/ko-kr/learn/azure/

 

https://github.com/hoya012/Machine-Learning-Yearning-Korean-Translation

Docker Image 를 Save 한 파일의 사이즈를 줄이는 방법은

gz 로 압축을 하면 반이상 줄어든다.

 

또한 gz 압축 파일은 Docker load 명령어로 image 화 할때도 사용할수 있다.

tar (기존)

docker load -i dockerimage.tar

 

gz

docker load -i dockerimage.tar.gz

 

load 속도차는 거의 없는것 같다.

 

 

* 빗썸 코인정보 Class

    public class CoinInfo

    {

        public string CoinType       { get; set; }

        public DateTime CoinTime     { get; set; }

        public string Status         { get; set; }

        public int OpeningPrice     { get; set; }

        public int ClosingPrice     { get; set; }

        public int MinPrice         { get; set; }

        public int MaxPrice         { get; set; }

        public string AveragePrice { get; set; }

        public string UnitsTraded   { get; set; }

        public string Volume1Day    { get; set; }

        public string Volume7Day    { get; set; }

        public int BuyPrice         { get; set; }

        public int SellPrice        { get; set; }

        public string Date           { get; set; }

    }

 

* 빗썸 데이터 가져오기

 

                //string page = "https://api.bithumb.com/public/ticker/BTC"; // 특정 화폐정보만 가져올때

                string page = "https://api.bithumb.com/public/ticker/ALL";

                HttpClient client = new HttpClient();

                var response = await client.GetAsync(page);

                if (!response.IsSuccessStatusCode) return;

 

                using (HttpContent content = response.Content)

                {

                    string result = await content.ReadAsStringAsync();

                    var o = JsonConvert.DeserializeObject(result);

                    JObject JObj = JObject.Parse(result);

 

                    //BTC,ETH,DASH,LTC,ETC,XRP,BCH,XMR,ZEC,QTUM,BTG,EOS

                    string[] coinTypes = "BTC,ETH,DASH,LTC,ETC,XRP,BCH,XMR,ZEC,QTUM,BTG,EOS".Split(',');

 

                    string status = JObj["status"].ToString();

                    if (status != "0000") return;

 

                    string date = JObj["data"]["date"].ToString();

 

                    // 데이터 가져온 시간입니다.

                    DateTime coinTime = DateTime.Now;

                    List<CoinInfo> coinInfoList = new List<CoinInfo>();

 

                    foreach (string coinType in coinTypes)

                    {

                        CoinInfo coinInfo = new CoinInfo() { CoinType = coinType, Status = status, Date = date, CoinTime = coinTime };

 

                        coinInfo.OpeningPrice = int.Parse(JObj["data"][coinType]["opening_price"].ToString());

                        coinInfo.ClosingPrice = int.Parse(JObj["data"][coinType]["closing_price"].ToString());

                        coinInfo.MinPrice = int.Parse(JObj["data"][coinType]["min_price"].ToString());

                        coinInfo.MaxPrice = int.Parse(JObj["data"][coinType]["max_price"].ToString());

                        coinInfo.AveragePrice = JObj["data"][coinType]["average_price"].ToString();

                        coinInfo.UnitsTraded = JObj["data"][coinType]["units_traded"].ToString();

                        coinInfo.Volume1Day = JObj["data"][coinType]["volume_1day"].ToString();

                        coinInfo.Volume7Day = JObj["data"][coinType]["volume_7day"].ToString();

                        coinInfo.BuyPrice = int.Parse(JObj["data"][coinType]["buy_price"].ToString());

                        coinInfo.SellPrice = int.Parse(JObj["data"][coinType]["sell_price"].ToString());

 

                        coinInfoList.Add(coinInfo);

                    }

                }

 

* 빗썸 예시 데이터 (Json) - 2019-05-21 오후10:45 데이터

사용자 컨트롤 작성시 사용자 컨트롤에 다른 컨트롤들을

배치 시킬수 있도록 하기 위한 방법입니다.

 

UserControl (TestControl) 을 만들고 사용자가 편집 가능하게 할 컨트롤을 아래 처럼 정의합니다.

 

namespace Test

{

    public partial class TestControl : UserControl

    {

        /// <summary>

        /// 사용자 정의 판넬입니다.

        /// </summary>

        [Category("Test")]

        [Browsable(false)]

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

        public Panel UserPanel => this.userPanel;

    }

}

 

ParentControlDesigner 를 상속받는 디자이너 클래스를 추가합니다.

 

using System.ComponentModel;

using System.Windows.Forms.Design;

 

namespace Test

{

   public class TestControlDesigner : ParentControlDesigner

    {

        public override void Initialize(IComponent component)

        {

            base.Initialize(component);

 

            TestControl testControl = component as TestControl;

            if (dsGridSelector != null)

            {

                base.EnableDesignMode(dsGridSelector.UserPanel, "UserPanel");

            }

        }

    }

}

 

UserControl 의 상단에 아래 처럼 처리합니다.

 

namespace Test

{

    [Designer(typeof(TestControlDesigner))]

    public partial class TestControl : UserControl

    {

        /// <summary>

        /// 사용자 정의 판넬입니다.

        /// </summary>

        [Category("Test")]

        [Browsable(false)]

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

        public Panel UserPanel => this.userPanel;

    }

}

 

이게 디자이너 단에서 UserPanel 부분으로 다른 컨트롤 들을 배치 시킬수 있습니다.

 

만약 Panel 안의 Panel 을 처리하고 싶을때는 부모 판넬도 위와 같은 처리를 해야

정상적으로 동작합니다.

 

예시)

Panel1 안에 Panel2 가 있는 경우 Panel2 로 디자이너에서 편집이 가능하게 할 경우

 

namespace Test

{

    [Designer(typeof(TestControlDesigner))]

    public partial class TestControl : UserControl

    {

        /// <summary>

        /// 사용자 정의 판넬1입니다.

        /// </summary>

        [Category("Test")]

        [Browsable(false)]

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

        public Panel UserPanel1 => this.userPanel1;

 

        /// <summary>

        /// 사용자 정의 판넬2입니다.

        /// </summary>

        [Category("Test")]

        [Browsable(false)]

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

        public Panel UserPanel2 => this.userPanel2;

 

    }

}

 

 

using System.ComponentModel;

using System.Windows.Forms.Design;

namespace Test

{

    public class TestControlDesigner : ParentControlDesigner

    {

        public override void Initialize(IComponent component)

        {

            base.Initialize(component);

 

            TestControl testControl = component as TestControl;

            if (dsGridSelector != null)

            {

                base.EnableDesignMode(dsGridSelector.UserPanel1, "UserPanel1");

                base.EnableDesignMode(dsGridSelector.UserPanel2, "UserPanel2");

            }

        }

    }

}

 

 

 

 

 

 

 

SearchControl 의 ButtonClick 이벤트에서 Search 버튼에 대한 이벤트를 처리하려면

ButtonPressedEventArgs 인자로 들어온 e 값에서 구분할수 있다.

 

if (e.Button.Kind == ButtonPredefines.Search) ..

 

 

Clear 버튼에 대한 이벤트를 처리하려면

 

if (e.Button.Kind == ButtonPredefines.Clear) ..

 

SearchControl 의 Button Event 에서는 기본적으로 두 버튼에 대해 이벤트가 처리된다.

 

 

 

Properties.CharacterCasing  : 대소문자처리

Properties.ShowSearchButton : Search 버튼 표시여부

Properties.NullValuePrompt  : Null 값인 경우 표시할 텍스트

Properties.ShowDefaultButtonsMode : 서치버튼, 클리어버튼 표시 여부

 => DevExpress.XtraEditors.Repository.ShowDefaultButtonsMode.AutoShowClear : search 버튼은 항상 보이고 clear 버튼은 필요할때만 활성화

+ Recent posts