[wxpython] 다중모니터 감지하기

Posted by 백창
2017.06.28 15:17 개발/Python

#1


wxPython 은 GUI를 만들 수 있는 오픈소스 라이브러리이다.


GUI를 만드는건 만드는건데 가끔 보면 듀얼모니터, 다중모니터를 사용하면서 


모든 화면에 프로그램을 띄울 필요가 생길 것이다.


그걸 어떻게 감지하는지 퍼온 소스를 적어 놓겠다.


#2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import wx
 
app = wx.App()
 
#To get the count of displays
num_displays = wx.Display.GetCount()
 
#Open a frame on each display
for display_num in range(num_displays):
    #Get a display object
    display = wx.Display(display_num)
 
    #To get a wx.Rect that gives the geometry of a display
    geometry = display.GetGeometry()
 
    #Create a frame on the display
    frame = wx.Frame(None,-1,"Display %d"%display_num,
    geometry.GetTopLeft(),geometry.GetSize())
 
    #Make the frame visible
    frame.Show()
 
app.MainLoop()
cs


모니터의 갯수를 저장해서 반복문을 돌며 각 화면마다 프레임을 실행해주는 소스가 되겠다.


#3


https://bytes.com/topic/python/answers/486021-multi-monitor-support

'개발 > Python' 카테고리의 다른 글

[wxpython] 다중모니터 감지하기  (0) 2017.06.28
[Python] 웹페이지 변화 감지하기  (2) 2017.04.27
Python  (0) 2017.04.27
이 댓글을 비밀 댓글로

[Python] 웹페이지 변화 감지하기

Posted by 백창
2017.04.27 16:48 개발/Python

# 1


음.. 파이썬을 시작하게된 이유였던가 ?


웹 페이지에 변화를 감지하기 위해서 파이썬을 처음으로 깔았다.


페이지 변화를 감지해서 뭐하냐 싶겠지만 의외로 용도가 많다.


공지사항에 새로운글(있던 글이 지워지거나 수정된 것도 감지되겠지만)을 체크하여 알림을 보낼 수 있고,

뭐 다른 용도도 많이 있다.


내가 처음 사용한 용도는 회사 홈페이지가 뻑나면 복구 스크립트를 돌리는데 사용했다.

뻑난지를 이 방법으로 확인한거지


# 원리


원리는 별거 없다. 


일정 주기마다 페이지를 긁어 해쉬값으로 저장해두고 기존에 저장된 해쉬값과 비교를 하는 것이다.


페이지가 조금만 달라져도 해쉬값은 크게 변하니 쉽게 감지할 수 있다.


# 소스


1. 페이지를 긁어서 해쉬값으로 변환하여 저장


음.. getList는 긁어오고 싶은 사이트들을 저장해둔 파일을 불러오는 소스라서 무시해도된다.

그냥 주소써서 긁어오면됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# coding : utf-8
import requests
import hashlib
import time
import sys
import re
import getList
reload(sys)
sys.setdefaultencoding('utf-8')
 
# get check list
lines = getList.getList()
 
cnt = len(lines)
= 0
 
try :
 
    while i < cnt:
        chkList = re.split(r'[\s]',lines[i])
        i += 1
        with requests.Session() as c:
            URL = chkList[1]
 
            html = c.get(URL)
 
            m = hashlib.md5(html.text)
             now = time.localtime()
            file = open("PATH/md5_%s_%04d-%02d-%02d.log"%(chkList[0],now.tm_year, now.tm_mon, now.tm_mday),'a')
    
            print >> file, m.hexdigest()
            file.close()
 
    execfile("PATH/check.py",{})
except:
    print 'error'
 
cs



2. 페이지비교


offset에 따라 몇번째까지 비교할지 설정할 수 있고

2로 되어있으니 최근 2번 것과 비교하여 다르면 메시지를 보내도록 하였다.

(메시지는 텔레그램으로 보내면 편함)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#-*- coding: utf-8 -*-
import time
import re
import getList
import sendMsg
 
# get check List
lists = getList.getList()
lists_cnt = len(lists)
= 0
 
while i < lists_cnt:
    chkList = re.split(r'[\s]',lists[i])
    i += 1
    now = time.localtime()
 
    file = open("PATH/md5_%s_%04d-%02d-%02d.log"%(chkList[0], now.tm_year, now.tm_mon, now.tm_mday),'r')
    lines = file.readlines()
    file.close()
 
    flag = True
 
    cnt = len(lines)
 
    # set compare res
    offset = 2
    if cnt < offset:
        offset = cnt
 
    # compare hash value
    for j in range(cnt-offset, cnt):
        if lines[j] != lines[cnt-1]:
            flag = False
 
    # if unmatch
    if flag == False:
        # send msg
        for z in range(2len(chkList)):
            sendMsg.send_msg_to_telegram(chkList[z],'['+chkList[0]+'] 변화 감지 : \t'+chkList[1])
 
cs


# 마침


벌써 비슷한 방식으로 3개째 프로그램을 만들었다.

생각하기에 따라서 활용도가 많으니 잘 활용해봐야겠다.


'개발 > Python' 카테고리의 다른 글

[wxpython] 다중모니터 감지하기  (0) 2017.06.28
[Python] 웹페이지 변화 감지하기  (2) 2017.04.27
Python  (0) 2017.04.27
  1. 일하랬더니 옴닉을 만들어버렸네...
이 댓글을 비밀 댓글로

Python

Posted by 백창
2017.04.27 16:31 개발/Python

# 1


흠.. 내가 파이썬을 공부하게 될 줄이야..


심심할때 사용하려고 리눅스 서버를 돌리기 시작하니까 파이썬의 매력에 빠질수밖에 없었다.


파이썬의 매력이라기보다는 스크립트 언어의 매력에 빠진거지.


재밌네 

'개발 > Python' 카테고리의 다른 글

[wxpython] 다중모니터 감지하기  (0) 2017.06.28
[Python] 웹페이지 변화 감지하기  (2) 2017.04.27
Python  (0) 2017.04.27
이 댓글을 비밀 댓글로

정규식을 이용해 숫자만 추출

Posted by 백창
2016.06.24 10:09 개발/Java script

# 개요


 수업시간에는 정규식에 대해 깊이 생각해본적이 없었는데, 요즘 정말 활용분야가 다양하다는 걸 느끼고 있다.


Javascript에서 정규식을 이용하여 문자열에서 숫자만 추출해보도록 하자.



# 소스


1
2
3
4
5
function fn(str){
    var res;
    res = str.replace(/[^0-9]/g,"");
    return res;
}
cs


# 주절주절


 간단하게 해석해보자면 [^0-9] 즉, 숫자가 아닌 부분을 "" 공백으로 치환함으로써 숫자만 남기는 것.


 얼마나 편리한지 허허.

'개발 > Java script' 카테고리의 다른 글

정규식을 이용해 숫자만 추출  (2) 2016.06.24
배열 특정 값 지우기  (0) 2015.12.14
[d3] line chart 그리기  (0) 2015.03.31
  1. ㅎㅎㅎ넘나 편리한것
  2. 같이 regex 공부합세
이 댓글을 비밀 댓글로

[Flask] 외부소스 읽기

Posted by 백창
2016.05.31 09:33 개발/Flask

# 개요


 Flask 개발 중 css와 js파일을 로드하기 위해 평소처럼 resource/js .. css 등의 디렉토리를 만들고 아래와 같이


<script type="text/javascript" src="./resource/js/jquery.js>


js 파일을 읽어왔다.


하지만 현실은.. js 파일을 찾을 수 없다는 에러메시지만 받을 수 있었다.


Flask에서 css나 js파일을 읽어 올 때 'url_for' 을 이용하여 지정하면 편리하게 읽어 올 수 있다.



# 사용법


서버동작이 구현되어 있는 run.py 파일을 기준으로 static 폴더를 생성하여 참조할 소스들을 static폴더에 넣는다.


run.py  - static         - js

                                 - css

             - templates


그리고 아래와 같이 사용하면 정상적으로 읽어 올 수 있게 된다.


 <link type="text/css" rel="stylesheet" href="{{url_for('static', filename='css/style.css')}}/>



# 비고


 o url_for 함수의 여러가지 유용한 사용법이 있는듯한데 일단 그건 나중에 알아봐야겠다..

 o Flask에서 {{ }}를 사용하면 파이썬의 함수나 변수를 사용할 수 있다.

'개발 > Flask' 카테고리의 다른 글

[Flask] 외부소스 읽기  (0) 2016.05.31
[Flask] 설치  (0) 2016.05.26
Tags
이 댓글을 비밀 댓글로

[Flask] 설치

Posted by 백창
2016.05.26 16:15 개발/Flask

# 개요


 4월이 되며 든 생각이 스크립트 언어를 공부해야겠다는것이었다. 어떤 언어를 공부할까 고민하다가 함께 발전할 수 있는 Python 을 해보기로 하고 간단한 웹서버를 구축하기 위해 FLASK를 수동으로 설치해보았다.


# flask란?


 flask는 Python 용 micro Framework이다. 다른 라이브러리들에는 존재하는 기능들을 제공하지는 않지만 그런 기능들을 가질 수 있는 확장성은 제공하고 있다.

 간단하게 생각하면 내가 필요한것들을 가져다 쓰면되겠다.


# 설치

 

 pip 명령어를 사용하면 간단하게 설치 할 수 있지만, flask를 설치할 서버가 인터넷이 안되기 때문에 수동으로 설치하였다.


 먼저, 다음 URL에 접속하여 flask 소스를 다운받아서 설치해보자.



 소스를 받고 압축을 해제하면 여러 파일들이 있는데 그 중 setup.py라는 파일을 이용해서 수동으로 설치할 수 있다.


 # python setup.py install


 설치가 잘 되나요? 인터넷이 안되는 환경에서는 이 방법만으로는 설치가 어렵다.


 그렇다면 어떻게 해야할까?,,,


 Flask는 Werkzeug, jinja2 등 몇몇 패키지에 의존성을 가진다. 이 패키지들이 깔려있지않다면 flask를 설치할 수 가 없다.


 다음 URL에 접속하여 의존성을 가지는 패키지들을 다운받아 먼저 설치하자.





 Flask를 설치했던 방법과 동일한 방법을 사용하여 위 패키지들을 설치하고 다시한번 Flask를 설치하면 잘 될 것이다.



# 테스트


다음 코드를 작성하여 Flask가 잘 설치되었고 동작하는지 테스트 해보자.


1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"
 
if __name__ == "__main__":
    app.run()
cs


$ python hello.py


를 실행하면 로컬 환경에서 127.0.0.1:5000 을 통해 결과를 확인 할 수 있다.


같은 네트워크에 public IP로 주고 싶다면


app.run() 대신 app.run(host='0.0.0.0')을 입력해주면 된다.


# 출처


http://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html

https://spoqa.github.io/2013/02/20/python-development-environment.html


'개발 > Flask' 카테고리의 다른 글

[Flask] 외부소스 읽기  (0) 2016.05.31
[Flask] 설치  (0) 2016.05.26
이 댓글을 비밀 댓글로

[oracle] DB Link

Posted by 백창
2016.04.07 11:14 개발/Oracle

db link 설명


http://www.gurubee.net/lecture/1560

'개발 > Oracle' 카테고리의 다른 글

[oracle] DB Link  (0) 2016.04.07
[oracle] 날짜 + 번호 일련번호 생성하기  (0) 2015.12.13
이 댓글을 비밀 댓글로

배열 특정 값 지우기

Posted by 백창
2015.12.14 16:46 개발/Java script

# 개요


 Javascript 배열 내 원하는 value의 값을 삭제해보자.


기본적으로 제공하는 함수는 pop함수로 원하는 값을 제거하기에 불편함이 있다. 


다음 코드는 구글에서 배열 특정값을 제거하는 소스를 검색하면 자주 나오는 코드이다


# 소스


1
2
3
4
5
6
7
8
9
10
11
function removeA(arr) {
    var what, a = arguments, L = a.length, ax;
    while (L > && arr.length) {
        what = a[--L];
        while ((ax= arr.indexOf(what)) !== -1) {
            arr.splice(ax, 1);
        }
    }
    return arr;
}
    
cs


# 사용방법


removeA( 배열 , 지우고 싶은 값);


# 출처


---------stackoverflow

'개발 > Java script' 카테고리의 다른 글

정규식을 이용해 숫자만 추출  (2) 2016.06.24
배열 특정 값 지우기  (0) 2015.12.14
[d3] line chart 그리기  (0) 2015.03.31
이 댓글을 비밀 댓글로

[oracle] 날짜 + 번호 일련번호 생성하기

Posted by 백창
2015.12.13 03:23 개발/Oracle

# 개요


 Oracle에서 스케줄 등록 없이 날짜 + 숫자 와 같은 형식의 일련번호를 생성해보자.


# 코드


1
2
3
4
5
6
select 
    to_number(to_char(sysdate,'YYMMDD'|| nvl(to_char(max(substr(sales_no,7))),'00'))+1
from
    sales
where
    to_char(sales_date,'YYYYMMDD'= to_char(sysdate,'YYYYMMDD')    
cs


# 설명


 일련번호의 형태로 많이 사용하는 방식은 YYYYMMDD + 00001 와 같은 방식일 것이다. 


 이런 일련번호를 생성하기 위해서는 스케줄을 등록하여 하루가 지날때마다 초기 값을 지정해주는 방법이 있었다.


 개발 중인 프로그램의 특성상 DB서버를 항상 켜두는 것이 아니기 때문에 insert 시 계산하는 방법에 대해 고민해보았다.


 아직 학생이라 효율성의 측면까지는 생각하지 못하였고 동작은 잘 되고 있다.


# 전체 SQL 및 DB



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<insert id="addNewOrder" parameterType="com.nara.order.vo.AddOrder">
    <selectKey order="BEFORE" keyProperty="sales_no" resultType="int">
        select 
            to_number(to_char(sysdate,'YYMMDD'|| nvl(to_char(max(substr(sales_no,7))),'00'))+1
        from
            sales
         where
            to_char(sales_date,'YYYYMMDD'= to_char(sysdate,'YYYYMMDD')
    </selectKey>
    insert
        into sales
            (sales_no, cust_no, cost_sum, sales_date, pay, section)
        values
            (#{sales_no}, #{cust_no}, #{cost_sum}, sysdate, #{pay}, #{section})
</insert>
cs



# 동작 결과




'개발 > Oracle' 카테고리의 다른 글

[oracle] DB Link  (0) 2016.04.07
[oracle] 날짜 + 번호 일련번호 생성하기  (0) 2015.12.13
이 댓글을 비밀 댓글로

[d3] line chart 그리기

Posted by 백창
2015.03.31 21:16 개발/Java script


 개요


 d3.js를 이용해 Line Chart를 그리자



 D3


d3란 데이터를 시각적으로 표현하는 자바스크립트 라이브러리이다. 


d3 사이트에 들어가면 많은 예제가 있고 소스가 공개되어 있어 따라해볼 수 있습니다.


http://d3js.org/



 소스


- 스크립트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function drawLineChart(className,array_value,array_Kg, lineData_pre, lineData_ori){
    
    // define dimensions of graph
    var m = [80808080]; // margins
    var w = 500 - m[1- m[3];    // width
    var h = 300 - m[0- m[2]; // height
    
    // x & y range
    var x = d3.scale.linear().domain([0, d3.max(array_Kg)]).range([0, w]);
    var y = d3.scale.linear().domain([d3.min(array_value), d3.max(array_value)]).range([h, 0]);
 
    var line = d3.svg.line()
    // assign the X function to plot our line as we wish
    .x(function(d) { 
        return x(d.x); 
    })
    .y(function(d) { 
        return y(d.y); 
    });
    
    var graph = d3.select("#"+className).append("svg:svg")
          .attr("width", w + m[1+ m[3])
          .attr("height", h + m[0+ m[2])
        .append("svg:g")
          .attr("transform""translate(" + m[3+ "," + m[0+ ")");
                
    // create yAxis
    var xAxis = d3.svg.axis().scale(x).tickSize(-h).tickSubdivide(true).orient("bottom");
    // Add the x-axis.
    graph.append("svg:g")
          .attr("class""x axis")
          .attr("transform""translate(0," + h + ")")
          .call(xAxis)
         .append("svg:text")
          .style("text-anchor","middle")
          .text("Kg");
 
 
    // create left yAxis
    var yAxisLeft = d3.svg.axis().scale(y).ticks(4).orient("left");
    // Add the y-axis to the left
    graph.append("svg:g")
          .attr("class""y axis")
          .attr("transform""translate(-25,0)")
          .call(yAxisLeft);
    
    
    // Add the line by appending an svg:path element with the data line we created above
    // do this AFTER the axes above so that the line is above the tick-lines
    graph.append("svg:path").attr("d", line(lineData_pre)).attr("class","predict");
 
    graph.append("svg:path").attr("d", line(lineData_ori)).attr("class","origin");
}
cs


- CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
path {
    stroke-width: 1;
    fill: none;
}
/**
*    graph line color
*/
.predict{
    stroke:steelblue;
}
.origin{
    stroke:orange;
}
.axis {
  shape-rendering: crispEdges;
}
.x.axis line {
  stroke: lightgrey;
}
.x.axis .minor {
  stroke-opacity: .5;
}
.x.axis path {
  display: none;
}
.y.axis line, .y.axis path {
  fill: none;
  stroke: #000;
}
cs




 코드 주석


1. var x, y : 제일 먼저 x&y 값 최소와 최대값을 측정하여 범위를 지정한다.

2. var line : 데이터에 따라 선을 그리기 위해 x좌표값과 y좌표값을 데이터에서 추출한다.

(아래 데이터에서는 Kg이 x축이고 L , a, b, E가 각각 Y의 값이되어 4개의 그래프를 그릴 수 있다)

3. var graph : className으로 지정된 ID를 가진 div를 선택해 그래프의 바탕을 그린다.

4. var xAxis, yAxis : 앞서 구한 x&y의 범위를 가지고 x축과 y축을 그린다.

(transform 옵션은 축의 위치가 되겠다)

5. graph.append("svg:path") 를 통해 line 함수로 추츨된 x y 좌표로 그래프의 선을 그린다.


 Data



origin
L a b E Kg
54.59 1.04 2.81 0.45 32.0
55.21 1.02 2.67 0.5 209.0
54.91 0.95 2.12 0.35 211.0
54.34 1.16 2.5 0.5 305.0
54.59 0.98 2.01 0.48 371.0
54.28 1.0 2.46 0.5 433.0

predict

LabEKg
54.601512204878791.02529713975785542.7958658656028120.439670601399571432.0
55.204234776560471.02768152242697772.6771897893800560.5050869193777713209.0
54.8863728256512640.98179670291752492.149646309017210.37113914211756211.0
54.3457023796577451.15547794185641962.49327085631507650.4939113237644091305.0
54.543651832328611.01319704838464332.06317044141718360.5249999887597754371.0
54.280970805276050.99846972236447532.4603476822979950.5031537879399656433.0



 결과



'개발 > Java script' 카테고리의 다른 글

정규식을 이용해 숫자만 추출  (2) 2016.06.24
배열 특정 값 지우기  (0) 2015.12.14
[d3] line chart 그리기  (0) 2015.03.31
이 댓글을 비밀 댓글로