2025년 1월 21일 화요일

asp.net으로 custom 인증처리 만들기

asp.net 으로 권한처리할때 (로그인말고 Authorization)
개별적인 인증이 필요할때가 있다.

기존 Auth처리말고 새로운 인증을 하고싶을때는 Custom 인증클래스를 만들어야하는데
예를 들어 HttpRequest 해더에 Authorization의 키에 
특정한 값내용이 들어가 있을때 이를 내부에서 별도로 
인증처리하여 실패하면 다음으로 못넘어 가게하고
Unauthorized를 리턴하게 하려면 다음과 같은 클래스를 만들면된다.




[AttributeUsage(AttributeTargets.Method)]
public class CheckCustomToken : Attribute, IAuthorizationFilter
{
     public CheckCustomToken() { }

     //
     public void OnAuthorization(AuthorizationFilterContext context)
     {
         //
         StringValues sv_authToken = "";
         context.HttpContext.Request.Headers.TryGetValue("Authorization", out sv_authToken);
         string str_authToken = sv_authToken.FirstOrDefault();

         // str_authToken 가지고 어쩌고 저쩌고
         bool bChk_auth = 췍췍(str_authToken);
         if (!bChk_auth)
         {
             context.Result = new UnauthorizedObjectResult("Invalid Token" );
             return;
         }
     }
}



이렇게 해서  컨트롤러의 메서드에서 다음처럼 Attribute로 달면된다.




[HttpPost]
[CheckCustomToken]
public async Task<IActionResult> gogosing()
{
    Ok();
}




요로코롬

html의 code 태그 만들기를 파이썬으로 하기..

code 태그라고 html 문서에서 해당부분이
컴퓨터 코드임을 나타내는 태그이다.
복사와 구분이 좋으라고 만들어져 있는데..

블로그 쓰는 입장에서 바꾸는게 여간 귀찮은 일이 아니다.
(하겠냐?)

그래서 그걸 바꺼주는 파이썬 코드를 만들었드랬다.
utf-8 인코딩으로 되어있는 input.txt 파일의 내용을 읽어서
Code 태그로 바꾸고 output.txt로 출력한다.
배경은 div로 감싸서 회색으로 했더랬다..


fp = open("input.txt", "r", encoding='utf-8')
lines = fp.read()
fp.close()
#

lines = lines.replace("    ", "&nbsp;&nbsp;&nbsp;&nbsp;")
lines = lines.replace("<", "&lt;")
lines = lines.replace(">", "&gt;")
lines = lines.replace("\r\n", "</br>")
lines = lines.replace("\n", "</br>")   
lines = '<div style="background:rgb(224, 224, 224);"><code>' + lines + '</code></div>'

#
ofp = open("output.txt", "w", encoding='utf-8')
ofp.write(lines)   
ofp.close()

#
print('Convert Done!!')


요로코롬...

2025년 1월 8일 수요일

moviepy가 2버전으로 업데이트 됬음..

moviepy가 2버전으로 업데이트가 됬다..
현재 동영상편집툴에는 프리미어, 파이널컷, 다빈치리졸브 등등이 있다.

이런 전문적인툴에 비해서는 moviepy는 아직 한참 모자라다.
하지만 프로그래밍으로 동영상편집을 진행할수 있다는 장점은 위의 단점을
상당히 커버해준다. 즉 자동화가 가능하다는 소리..

뭐랄까..  프로그래머가 동영상을 편집해야하는 일은 가끔이지만 일어난다..
하지만 그 영상을 위해서 위의 전문툴을 익히고 사용하기에는 시간과 비용이 아깝다.
하지만 이런류의 작업을 위해서 파이썬이 나왔고 그에 걸맞는 무비파이가 존재한다.

당연히 gui로 작업하는것이 글로 쓰는것보다 훨씬 낫지만 이런 흐름으로 계속가게 
되었을때 3버전이 릴리스가 되고 그에 따라서 화려하지는 않지만 gui가 생기게 된다면
(뭔가.. 쥬피터 노트북같은 웹을통해서 이루어 질것 같다.)

그때는 꽤나 괄목할만한 상태가 되는것에는 분명하다.
회사에서도 돈들어가는 프로그램 없이 파이썬 에디터만으로 홍보영상등을
만들어내니까 비용이 절감되고 좋아라한다. 
개인적으로도 유튜브에 올려야될 영상이라던가.. 다른사람의 부탁등으로 영상제작을
해야할때에도 상당히 유용할듯하다.

이렇게 '유튜브에 올라갈정도의 수준의 영상을 제작' 할때 moviepy를 이용하면 시간은
오래걸릴지언정 어찌어찌 전문적인툴의 결과의 70% 정도의 수준으로 비슷하게
흉내 낼수있게 되긴한다.
이게  참.. 뭐랄까..  이부분이 스고이.. 라는 거시다..
(개인적으로 다이나믹줌과 Effect - factor에서 EasyInOut이 빨리 나왔으면 좋겠다.)


늘.. 느끼는거지만 이런 서브워크는 싹다~ 파이썬으로.. ㅇㅇ



2024년 12월 5일 목요일

윈도우11에 글자가 좌우여백 있게 넓게 써지는 경우 (전자/반자)


이렇게 써지는 버그가 윈도우 11에 와서 생겨버렸다.

전자 / 반자 라고 하는데 

갑자기 이처리가 토글되면

Alt키와  =키 를 눌러주면 된다..

(ㅅㅂ 이런 단축키를 외우고 있겠냐??)


그리고 이게 IME 관련 버그인것 같은데 

고정적으로 안나오게 하려면

IME설정에서 아래와 같이 이전버전 IME 사용함으로 하고 재부팅하면

해당증상이 안나오는것 같다고 한다..





2024년 11월 26일 화요일

C# 윈폼 콤보박스 처리 (feat. GUI 의존)

C# 으로 웹서비스 말고 GUI프로그래밍 같은걸 할때는 윈폼,WPF, 마우이 등을 이용한다.
주력은 아무래도 윈폼,WPF로 많이 함.  윈폼은 죽을때가 됐는데 아직까지 사용자층이 
두터워서 닷넷 스탠다스에서 꿋꿋이 살아 남았음..  -_-;;

암튼 윈폼으로 작업을 하다보면 기본 UI가 안이쁨.. 그래서 이것을 카바칠라고 
누겟에서 GUI 관련 라이브러리를 받아다가.. 그걸로 도배해 버리면 그 당시에는
좋을런지 모르겠지만.. 나중에 마이그레이션 이슈를 격게된다..  그래서 이렇게 몇번
데이고 나면 다시 근본으로 돌아오게 되는데.. 나는 이걸 뼈저리게 느낀적이 많이 있어서  
다른 라이브러리에는 의존을 많이 하지만 GUI만큼은 고생스럽더라도 사용자정의 컴퍼넌트
같은것을 시간을 투자해서 만들어서 그걸 사용한다.  이렇게 만들고 나면 나중에 재사용가능성
이 있는 유저컨트롤이 되니까 시간이 흐를수록 UI의 빌드가 쉬워진다.
그리고 기본 컴퍼넌트와도 잘 어울릴수 있도록 그려내야 한다.


암튼.  윈폼에서 콤보박스처리 방법

- 컴퍼넌트에서 dropdownstyle을 dropdownlist로 변경함 (안하면 클릭하면 Edit모드됨)
- 자료바인딩 처리는 다음처럼

// 먼저 바인딩할 자료를 열거형으로 가져오고 - ex. combolist
combobox.DisplayMember = "Display";
combobox.ValueMemver = "Value";
// 이렇게 Display와 Value필드를 가진 dynamic으로 item 바인딩
foreach (var obj in combolist)
{
    combobox.Items.Add(new { Display = obj.ToString(),  Value = obj });
}
//처음으로 이동처리
combobox.SelectedIndex = 0;


- 그다음 선택한 콤보 아이템를 사용할때는 (User클래스를 바인딩했다.. 치고)
User usr = (combobox.SelectedItem as dynamic).Value;
- 글자는 
string str = (combobox.SelectedItem as dynamic).Display;


요로코롬 사용하면됨..   ㅇㅇ



2024년 11월 7일 목요일

C# 으로 윈도우 서비스 만들기

C# 에서 윈도우 서비스를 만들수있다..  (.NetFrameWork로 해야함!!)

모니터링 용도나 간단한 질의응답용 서버를 만들때 등등 백그라운드에서

항시 시작되었으면 하는 프로그램이 있을때 주로 사용된다. 

서비스로 등록을 해놓으면 윈도우가 시작될때 자동으로 시작된다. (설정시)

물론 시작프로그램에 등록해도 되지만 UI가 필요없기도 하거니와 

트레이아이콘등으로 실행하게 해놓더라도 미관상 좋지 않다.


1.  먼저 C#으로 Windows 서비스 프로젝트 하나 만든다.


2. Procgram.cs 에서  SericeBase를 상속받은 클래스를 실행시키는걸 볼수 있다. 

(나는 이름 바꾸기를 통해서 그 클래스의 이름을 TRService로 바꿨음)

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
    new TRService()
};
ServiceBase.Run(ServicesToRun);


3. 해당 클래스에 보면 OnStart와 OnStop을 오버라이드한다.. 여기다가 시작할때랑 종료할때의 코드를 집어 넣으면 된다.  간단히 'C:\Temp\' 폴더에 mylog.txt에 매초마다 시간을 출력하는 서비스를 만들어봄.

public partial class TRService : ServiceBase
{
    /// 내부 멤버
    private System.Timers.Timer _timer;
    private const string folderPath = @"C:\Temp\";
    private const string filePath = folderPath + "mylog.txt";

    /// 생성자
    public TRService()
    {
        InitializeComponent();
    }

    /// 시작할때
    protected override void OnStart(string[] args)
    {
        if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); }
        WriteLog("서비스 시작한다");

        //타이머 시작
        _timer = new System.Timers.Timer();
        _timer.Interval = 1000;
        _timer.Elapsed += Timer_Tick;
        _timer.Start();
    }

    /// 온타이머
    private void Timer_Tick(object sender, ElapsedEventArgs e)
    {
        WriteLog("나야~ 타이머.. :" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
    }

    /// 종료할때
    protected override void OnStop()
    {
        _timer.Stop();
        WriteLog("서비스 종료한다");
    }

    /// 라이트로그
    private void WriteLog(string strMsg)
    {
        using (StreamWriter sw = new StreamWriter(filePath, true))
        {
            sw.WriteLine(strMsg);
            sw.Close();
        }
    }
}


4. Sift + F7로 디자인타임으로 나가서 ServiceName의 속성값을 내가 원하는 서비스이름으로 변경한다.  나는 'MyTRService' 로 했음 


5. 이제 빌드하면 bin 폴더에 exe파일로 생성되는데.. 이파일들을 'C:\Temp\ServiceTest' 로 복사해줌 

6. 다른 인스톨러를 이용하면 설치가 쉽게 되겠지만  sc 커맨드 명령으로도 충분히 서비스 등록이 가능하다. 간단한 sc 명령은 다음과 같다.

서비스 만들기: sc create 서비스명 binPath="만든exe파일의 절대경로" 
서비스 시작하기: sc start 서비스명
서비스 중지하기: sc stop 서비스명
서비스 삭제하기: sc delete 서비스명
서비스 상태조회: sc query 서비스명

이정도만 알아도 충분함


7. 이제 명령프롬프트로 등록후 시작하고 서비스 목록에 가보면 서비스 목록이 나와있다.



8. 해당파일의 내용도 매초마다 출력하고 있음.



9. 서비스를 중지하고 싶으면 중지처리를 하면되고 윈도우 시작시 자동으로 등록하고 싶으면 시작유형을 자동으로 바꿔주면 됨..


ㅇㅇ
 

2024년 10월 22일 화요일

C# 윈폼에서 스플레쉬 띄우기

스플레쉬라고 프로그램 시작전에 잠시 이미지 띄우고 본프로그램으로 진입하는 창이 있다.

아주 별거 아닌데..  이런거 하나 해주면 좋다고 한다.. -_-
(오옷~ 시스템이 확~ 바꼈구만~!!)  -_-;


뭐 암튼 그렇다..   순서대로 따라해봄

1. 먼저 그럴싸한 이미지 하나 만든다..  (뭐 대충 500*350 픽셀에다가 이런거..)


2. 그다음 새폼을 하나만들고 보더 스타일 없이 CenterScreen 띄움으로 하고
가운데 마진없이 Panel하나 만들고 Dock->Fill 그리고 그 패널 백그라운드 이미지를  
1에서 만든 이미지로 하고 Strech 한다..

3. 그리고 그폼에 타이머 하나 넣고 1초~2초정도로 만들고 
폼로드에서 timer를 start하고 타이머 틱에서 stop하고 폼을 close 한다.

4. 그다음 Program.cs 등의 주진입점에서 다음처럼 쓰레드로 창을 띄운다
메인폼 이름이 FrmMain 이고 스플레쉬폼 이름이 SplashFrm 이라면
Thread sp_thred = new Thread(() => { Application.Run(new SplashFrm());});
sp_thread.Start();
Thread.Sleep(50);
//메인프로그램 시작
Application.Run(new FrmMain());

요로코롬 해주면 스플레쉬폼은 쓰레드니까 타이머가 다되면 알아서 죽고
메인폼은 메인폼대로 진행 나가면 된다.. 


ㅇㅇ