2017년 2월 22일 수요일

[python] method(*param)

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse , Line
from random import random


class MyPaintWidget(Widget):
    def on_touch_down(self,touch):
        color = (random(),random(),random())
        with self.canvas:
            Color(*color)

            self.pck(color)
            print '-'*20
            self.pck(*color)


            d = 30
            Ellipse(pos=(touch.x - d /2 , touch.y - d/2) , size = (d,d))
            touch.ud['line'] = Line(points=(touch.x , touch.y))
            print touch.ud

    def pck(self, a =255,b = 255,c = 255):
        print "a = " + str(a)
        print "b = " + str(b)
        print "c = " + str(c)

    def on_touch_move(self,touch):
        with self.canvas:
            touch.ud['line'].points += [touch.x, touch.y]
            print touch.ud['line'].points




class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()


if __name__ == '__main__':
    MyPaintApp().run()


[python] GUI Tool

C# 의 WPF와 윈폼을 사용해서, 테스트용 프로그램들을 많이 만들었다.

특정 기능이나 시스템을 여러 환경에서 테스트 해야할때, 콘솔에서 작업하는것 보다 훨씬 속도가 빠르기 때문에, 특히 윈폼을 이용한 테스팅 어플리 케이션을 많이 만든다. 그런데, 
C#은 굉장히 복잡한 알고리즘이나 분석등의 작업에는 불편한다. 

파이썬으로 10분이면 만들꺼, C#으로는 훨씬 시간이 더 많이 걸리는 경우가 많다. 

그래서 기능이나 시스템의 내용에 따라 파이썬과 C#을 번갈아 가면서 사용중인데, 파이썬으로도 c#처럼 편하게 GUI를 만들수 있다면 일의 효율이 매우 크게 증가할 거라고 항상 생각해 왔다. 

 파이썬으로는 GUI 를 TK밖에 안써봐서, 쓸만한 다른 GUI를 찾고있는데 후보는 두개다. 

ptQt나 Kivy 

Kivy는 안드로이드 모바일폰에서 사용 가능하다고 한다. 

pyQt는 디자이너 프로그램이 딸려있다. 

항상 C#에서도 디자이너를 사용해 GUI를 만들어와서 pyQt가 더 빠르게 익힐 수 있지 않을까 하는데, 디자인과 모바일까지 지원된다는 점에선 Kivy가 좋은 것 같기도하다. (앞으로 모바일쪽 테스팅 하기 때문에.. )


현재 프로젝트에서 엄청난 수의 알고리즘들을 설꼐하고 테스트 해야되는데, C#으로 하기에는 너무 시간이 많이 걸릴것 같아 어떻게든 파이썬 GUI로 만들고 싶은데 나중을 생각해 Kivy를 공부하고 싶지만, 프로젝트 일정에 따라갈 수 있을지 걱정이다.. 

(일단 Kivy 를 시작해본다.)

windows10 64bit / anaconda python2.7
 conda install -c krisvanneste kivy=1.8.0 로 인스톨

2017년 2월 19일 일요일

[python] Qt4 With Python2.7 and Vertual Enviroment

1. conda update conda
2.  conda create -n qtEnv python=2.7 anaconda
3. activate qtEnv 

---------------------------------------------------
next, we need to change qtpy 5 -> qtpy4
---------------------------------------------------

4. conda install -c anaconda pyqt=4.11.4

Done! go to visual studio and add python env 

[c#] Data Split

        public void SplitTrain_Test(float[][] data_x , float[] label , double trainSize ) {
            int[] idx = new int[label.Length];
            Parallel.For( 0 , label.Length , i => {
                idx[i] = i;
            } );

            Random rnd = new Random();
            int trainNum = (int)(label.Length *trainSize);
            int[] rndIdx   = idx.OrderBy(x => rnd.Next()).ToArray();
            int[] trainIdx = idx.Take(trainNum).ToArray();
            int[] testIdx  = idx.Skip(trainNum).ToArray();
        }

[C#] Linq Orderby

orderby 는 각 요소들에서 조건을 뽑아내서 서로 비교한다.

예를들어

orderby(x => x ) : 숫자 요소일시 1 ,2 ,3 순으로 정렬 / 문자시 알파벳순

orderby(x => x%2 ) : 숫자 요소일시 2,4,8 ... 1,3,5 순으로 정렬

여기서 만약 두 요소의 비교조건 값이 같을경우는 정렬이 안된다. 이떄 thenby 쓰면 된다.

2017년 2월 6일 월요일

[C#] Closure 쓰는 이점

1. 원하는때 계산이 가능 : Lazy 개념

2.  파라미터를 킵해놓을 수 있기 때문에 병렬처리하는데 관리가 쉬워진다.

3. 파라미터의 보존이 가능해, 파라미터로 사용된 데이터가 바뀌고, 함수는 바뀌기전 파라미터를 사용해야 한다면,  Closure 로 쉽게 처리가 가능

Ex)

Func method1( int input   ){

    return new Func((a,b)=>{
        return input + a + b;

    });

}

라고 하자.

어떤 시퀀스가

int x = 13;
int y = 0.1;
List> templist = new List>();
for( i => range(0 ,10)){
    templist.add( method1(i*x) );
}
z = 0
for( i => range(0 ,10)){
    z += templist[i]( y, y*i  );
}

별 의미 없는 것이지만, 이런식으로 응용을 할 수 있다.

어떤 일정한 패턴의 계산 값들을 바로 계산하지 않고,  특정 시점에서 계산한다던지..

[C#] Linq Exampled

var output1 = input.Select(x=>x*10);

var output2 = input.Where( x => x > 20);


var output3 = output1.Aggregate((x,y)=> x+y);


var output3 = output1.Aggregate(100,(x,y)=> x+y); // 첫 요소가 100으로 추가된다.