애청하는 flutter 유튜버가 있다.

"MitchKoko"

거기에 나오는 지뢰찾기 그대로 따라해 봤다.

띄엄띄엄 공부하다 보니 까먹고 또 까먹는다... 그래서 배 부르다

앱 UI는 확실히 Mac버전이 이쁜듯 하다.

돈벌어서 MacBook 사야겠다.

암튼 잘 동작하니 재밌다.

다른것도 해봐야 겠다.

 

[참고 URL] https://www.youtube.com/watch?v=hrvtfNlLcF4&ab_channel=MitchKoko


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

기본 닷넷에서 제공하는 DataGridView 주로 사용하는데

주된 이유는 기본 콤포넌트라서 그리고 가벼워서 정도인데...

데이터 바인딩 하다보면 양이 많지도 않은데 완전 느려지는 경우가 있다.

이때를 대비해서 사용할 수 있는 DoubleBuffered 기능이 있다.

자세한 설명은 접고 그냥 따라 해보면 와C 완전빨라 경험한다.

 


using System.Reflection;


    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
            Init_DataGridView();
        }


        // 내용 blah blah


        private void Init_DataGridView()
        {
            grdData.DoubleBuffered(true);
        }
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    public static class ExtenstionMethods
    {
        public static void DoubleBuffered(this DataGridView dgv, bool setting)
        {
            Type dgvType = dgv.GetType();
            PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
            pi.SetValue(dgv, setting, null);
        }
    }


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

올초 러시아 프로젝트 잠시 여유 있을 때 Flutter를 처음 접했다.

기존 현황판 화면이 반응형이 아니다 보니 사무실 개인 PC화면에서는 화면을 줄이거나 늘릴때 보기가 힘들어 나름 공부삼아 시작을 했다.

아직 웹서비스를 이용하지 못해 극히 제한적인 화면 위주의 결과물이지만 공부하면서 나름대로 재미도 있고 앞으로 여러모로 쓸모있겠다는 생각을 해 보았다.

더구나 윈도우 프로그램, 웹브라우저, 폰(아이폰, 안드로이드) 의 크로스플랫폼을 지원하니 더더욱 구미가 당긴다.

앞으로 어디까지 더 진행하고 개발할지 모르지만 한발짝 디뎠으니 앞으로 틈틈히 노력하고 연구해야 겠다.

 


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

DB통신을 하다 보면 DataTable 을 이용한 핸들링이 참 많다.

그중에 해당 Row의 값을 이용한 특정컬럼을 구할때 마다 Linq를 이용하여 쉽게 값을 획득해 올수 있다.

할때마다 검색하는거 지겨워서 메모해 둔다.

private string GetItem(string GUBUN, string CODE)
{
try
{
var rowColl = dtItem.AsEnumerable(); // dataTable

string name = (from r in rowColl
where r.Field("CODE") == CODE
select r.Field(GUBUN)).First();

return name;
}
catch
{
return "";
}
}

 

특정값을 가진 dataTable 복사로도 가능

dt = ds.Tables[0].AsEnumerable()

.Where(Row=>Row.Field<string>("AAA") == "1" &&

Row.Field<string>("BBB") == "2")

.OrderByDescending(Row=>Row.Field<string>("CCC"))

.CopyToDataTable();

 

오랫만에 티스토리 안녕~


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

TiberoHelper.cs
0.14MB

아는 사람은 알겠지만.

MS-SQL : SqlHelper

Oracle : OracleHelper

주로 이용을 해왔다.

나름 괜찮은 라이브러리라 생각되고 현재까지도 잘 사용하고 있다.

이번에 Tiber로 db가 변경이 되어 Tibero도 Helper가 있다면 참 좋겠다라고 생각했는데

워낙 Tibero 자료가 넉넉치가 않다보니 갑갑하다.

Oracle의 대부분 기능을 Tibero가 흡수(?)라고 해야할지 베꼈다고 해야할지... 암튼 비슷한 구조라 판단이 되어

OracleHelper를 이용하여 Tibero에 맞게 수정을 했다.

결과적으로 문제없이 잘 된다.

---------------------------------------------------------------------------

오라클과는 달리 Oracle Client 설치 후 Oracle.Data.Client.dll 첨부 형태로 되지 않고

Tibero 6 db설치 이후 ODBC로 연결 설정을 추가적으로 해 주어야 한다.

이 부분은 구글링해서 해결했다.

단, 최신정보인 Tibero6 이 아닌 Tibero5버전의 자료가 대부분인데 이 부분은 최신버전에 맞게 설정해 주면 가능할 것 같다.

 

p.s 티맥스는 최신화 가이드 및 기술지원을 잘 배포해 주었으면 한다. <해결하기 위해 답답한 부분이 많아 ㅠ>

 


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

부트스트랩 components 관련 사이트

https://getbootstrap.com/docs/3.3/components/

'020. Prigraming' 카테고리의 다른 글

웹서버 nginx  (0) 2018.09.18
XCOPY 도스명령어 배치파일 만들기  (0) 2012.05.02

WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

웹서버 nginx

020. Prigraming 2018. 9. 18. 17:08

나에게 있어 웹이란 알고싶으나 알아야 하나 그저 멀리서 바라만 봐야하는 존재로 여겨진다.


최근 함께 일하는 동료를 통해 nginx 를 듣게 되었다.

웹서버라면 주로 IIS, Apache를 써 본게 다인데 내가 그동안 알지 못하던 뭔가 새로운 녀석이 나타난것이다. 

이죽일놈의 IT...


장점은 빠르다... 가볍다... 무료다... 뭐 이정도 인거 같다.


당장 업무에 쓰이지도 않고 공부도 안할테지만 뭔가 알아는두어야겠다는 의무감에 최소한의 URL이라도 남겨둬야지 하는 마음으로 기록해본다.

기억보다 기록을 믿으니깐...


설치관련 :

https://nginx.org/en/download.html


nginx 소개 :

https://opentutorials.org/module/384/3462



설치관련 페이지에서 파일을 다운받은 후 압축을 풀고

D:\...\nginx-1.15.3\nginx-1.15.3\conf

위치에 nginx.conf 파일이 있는데 그 부분에 아래의 예시처럼 포트를 설정해서 웹서비스 할 수 있는것으로 보인다.


    server {

        listen 90;

        server_name 127.0.0.1 127.0.0.1;

        location / {

            root "D:/www";

            add_header "Cache-Control"  "no-cache, no-store, must-revalidate";

            add_header "Expires"        "0";

        }

    }




'020. Prigraming' 카테고리의 다른 글

부트스트랩 components 관련 사이트  (0) 2018.09.18
XCOPY 도스명령어 배치파일 만들기  (0) 2012.05.02

WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

요즘들어 보안에 대한 프로그래밍을 많이 하게 된다.

하래서 한다만 과연 무엇을 위한 보안인지는 모르겠다. 그냥 하는거다.


DB연결자를 구성할때 최소한 서버IP, 사용자정보, 사용자 비밀번호 를 요구한다.

나같은 경우 보통 ini 파일안에 그 정보를 담아두곤 하는데 이 부분에 사용자 비밀번호가 노출돼 보안에 지적될 소지가 있어 암호화 처리하여 ini에 구성한 뒤 복호화 하여 DB Connection을 맺게 구성을 해야 할 것 같다.


그래서 준비해 보았다.



다음과 같은 화면으로 구성해 보았다.


언젠가 쓸 날이 있을거라 본다.


# frmMain.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


namespace _CS__Generator_Password

{

    public partial class frmMain : Form

    {

        //암호화 복호화 키 8글자 (필히 8자리여야 함)

        WATCrypt m_crypt;


        public frmMain()

        {

            InitializeComponent();

        }


        private void frmMain_Load(object sender, EventArgs e)

        {


        }


        private void btnApply_Click(object sender, EventArgs e)

        {

            if (txtKeyCode.Text.Length != 8)

            {

                MessageBox.Show("Only allows 8-digit");

                return;

            }


            //암호화 복호화 키 8글자 (필히 8자리여야 함)

            m_crypt = new WATCrypt(txtKeyCode.Text);


            txtKeyCode.ReadOnly = true;


        }


        private void btnEncryption_Click(object sender, EventArgs e)

        {

            if (txtKeyCode.ReadOnly == false)

            {

                txtKeyCode.Focus();

                return;

            }


            if (txtEncryption.Text == "")

            {

                txtEncryption.Focus();

                return;

            }


            // 암호화

            txtEncryption_Gene.Text = m_crypt.Encrypt(txtEncryption.Text);

        }


        private void btnDecryption_Click(object sender, EventArgs e)

        {

            if (txtKeyCode.ReadOnly == false)

            {

                return;

            }


            if (txtDecryption.Text == "")

            {

                txtDecryption.Focus();

                return;

            }


            // 복호화

            txtDecryption_Gene.Text = m_crypt.Decrypt(txtDecryption.Text);


        }


    }



}




# WATCrypt.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace _CS__Generator_Password
{

    class WATCrypt
    {

        byte[] Skey = new byte[8];

        public WATCrypt(string strKey)
        {
            Skey = ASCIIEncoding.ASCII.GetBytes(strKey);
        }
        
        public string Encrypt(string p_data)
        {

            if (Skey.Length != 8)
            {
                throw (new Exception("Invalid key. Key length must be 8 byte."));
            }


            DESCryptoServiceProvider rc2 = new DESCryptoServiceProvider();

            rc2.Key = Skey;

            rc2.IV = Skey;

            MemoryStream ms = new MemoryStream();

            CryptoStream cryStream = new CryptoStream(ms, rc2.CreateEncryptor(), CryptoStreamMode.Write);

            byte[] data = Encoding.UTF8.GetBytes(p_data.ToCharArray());
            
            cryStream.Write(data, 0, data.Length);

            cryStream.FlushFinalBlock();
            
            return Convert.ToBase64String(ms.ToArray());

        }
        
        public string Decrypt(string p_data)
        {

            DESCryptoServiceProvider rc2 = new DESCryptoServiceProvider();
            
            rc2.Key = Skey;

            rc2.IV = Skey;
            
            MemoryStream ms = new MemoryStream();

            CryptoStream cryStream = new CryptoStream(ms, rc2.CreateDecryptor(), CryptoStreamMode.Write);

            byte[] data = Convert.FromBase64String(p_data);
            
            cryStream.Write(data, 0, data.Length);

            cryStream.FlushFinalBlock();
            
            return Encoding.UTF8.GetString(ms.GetBuffer());

        }

    }
}



WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

문득 태블릿PC를 이용하여 품질데이터 관리 하는 기능의 일환으로 이미지 압축에 관련하여 한번 살펴 보았다.

아래 0 압축율은 이미지가 깨지므로 25L이 적당한것으로 테스트 되었다.


자 그럼 이제 카메라 구동기술을 알아보자. 한 3년은 걸릴거 같음 ㅋ


private void VaryQualityLevel()

{

    // Get a bitmap.

    Bitmap bmp1 = new Bitmap(@"c:\TestPhoto.jpg");

    ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);


    // Create an Encoder object based on the GUID

    // for the Quality parameter category.

    System.Drawing.Imaging.Encoder myEncoder =

        System.Drawing.Imaging.Encoder.Quality;


    // Create an EncoderParameters object.

    // An EncoderParameters object has an array of EncoderParameter

    // objects. In this case, there is only one

    // EncoderParameter object in the array.

    EncoderParameters myEncoderParameters = new EncoderParameters(1);


    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);

    myEncoderParameters.Param[0] = myEncoderParameter;

    bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jpgEncoder, myEncoderParameters);


    myEncoderParameter = new EncoderParameter(myEncoder, 100L);

    myEncoderParameters.Param[0] = myEncoderParameter;

    bmp1.Save(@"c:\TestPhotoQualityHundred.jpg", jpgEncoder, myEncoderParameters);


    // Save the bitmap as a JPG file with zero quality level compression.

    myEncoderParameter = new EncoderParameter(myEncoder, 0L);

    myEncoderParameters.Param[0] = myEncoderParameter;

    bmp1.Save(@"c:\TestPhotoQualityZero.jpg", jpgEncoder, myEncoderParameters);


}



// Image format에 대한 Codec 정보를 가져온다.

private ImageCodecInfo GetEncoder(ImageFormat format)

{


    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();


    foreach (ImageCodecInfo codec in codecs)

    {

        if (codec.FormatID == format.Guid)

        {

            return codec;

        }

    }

    return null;

}


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

우선 테스트 하기 위해 내가 늘 사용하는 이 방법


닥치고 우선 신규 프로젝트를 하나 만들고 > 신규 폼 > 버튼 하나를 올려 놓자

그 위 버튼에 이벤트를 걸자!(버튼 더블클릭)


그 다음 소스는 아래 부분을 참조

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


using System.Net.Mail;


namespace _CS__메일보내기

{

    public partial class Form1 : Form

    {

        const string SMTP_SERVER = "smtp.naver.com"; // SMTP 서버 주소

        const int SMTP_PORT = 587; // SMTP 포트


        const string MAIL_ID = "yhtmpresentz@naver.com"; // 보내는 사람의 이메일

        const string MAIL_ID_NAME = "yhtmpresentz"; // 보내는사람 계정 ( 네이버 로그인 아이디 ) 

        const string MAIL_PW = "xxxxxxxxxxxx";  // 보내는사람 패스워드 ( 네이버 로그인 패스워드 )


        public Form1()

        {

            InitializeComponent();

        }


        private void button1_Click(object sender, EventArgs e)

        {

            try

            {



                MailAddress mailFrom = new MailAddress(MAIL_ID, MAIL_ID_NAME, Encoding.UTF8); // 보내는사람의 정보를 생성

                MailAddress mailTo = new MailAddress("passion012@korea.com"); // 받는사람의 정보를 생성


                SmtpClient client = new SmtpClient(SMTP_SERVER, SMTP_PORT); // smtp 서버 정보를 생성


                MailMessage message = new MailMessage(mailFrom, mailTo);


                message.Subject = "CSDP000 테스트"; // 메일 제목 프로퍼티

                message.Body = "반갑습니다"; // 메일의 몸체 메세지 프로퍼티

                message.BodyEncoding = Encoding.UTF8; // 메세지 인코딩 형식

                message.SubjectEncoding = Encoding.UTF8; // 제목 인코딩 형식


                client.EnableSsl = true; // SSL 사용 유무 (네이버는 SSL을 사용합니다. )

                client.DeliveryMethod = SmtpDeliveryMethod.Network;

                client.Credentials = new System.Net.NetworkCredential(MAIL_ID, MAIL_PW); // 보안인증 ( 로그인 )

                client.Send(message);  //메일 전송 


            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

 

        }

    }

}





WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,