'전체'에 해당되는 글 105건

  1. 2013.12.17 베틀코드 소리문자
  2. 2013.12.16 베틀문자 2014 한눈에 보기
  3. 2012.11.30 베틀코드 기초문자 한눈에 보기
  4. 2012.11.28 PYTHON 에서 디버깅하기 pdb.pm()
  5. 2012.11.24 베틀언어 기초단어 843 ( 2012 - 11 )
  6. 2012.11.18 베틀언어에 대한 간략한 소개와 베틀문자의 구조
  7. 2011.09.21 자바스크립트에서 이미지 크기 구하기
  8. 2010.08.25 [자바스트립트] Jison / narwhal (3)
  9. 2010.04.27 Pyjamas
  10. 2009.12.08 XMLRPC CGI 서버 ( Python 3.1 기준 )
  11. 2009.10.30 php 라이브러리 자동로드
  12. 2009.10.19 PHP CI 프레임 워크
  13. 2009.10.12 PYTHON sphinx 문서제
  14. 2009.10.08 PYTHON ftputil
  15. 2009.09.09 PYTHON unittest package_unittest
  16. 2009.09.05 PYTHON 정적변수 static variable
  17. 2009.09.05 PYTHON 절대경로 , 상대경로 , 현재경로
  18. 2009.09.04 PYTHON3 에서 enum 상수 만들기 ( 열거형상수 )
  19. 2009.09.04 DOS 자주가는 디렉토리로 쉽게 이동하는 배치 스크립트
  20. 2009.09.03 PYTHON 명령행 유용팁 TIP
  21. 2009.09.01 PYTHON 파이썬 소스코드 토큰화하기 ( #주석제거 ) , tokenize , untokenize
  22. 2009.08.14 PYTHON lambda 사용하기
  23. 2009.08.12 PYTHON inspect 모듈 # 함수를 호출하는 줄의 라인번호 구하기
  24. 2009.08.08 PYTHON class decoration 클래스
  25. 2009.08.08 PYTHON decorator [ functools ] partial , wraps
  26. 2009.08.08 PYTHON 참고 링크 , 강좌
  27. 2009.07.29 PYTHON 한글라이브러리명 사용하기
  28. 2009.07.11 SQLITE3 (1)
  29. 2009.07.10 MYSQL insert into , replace into , insert into .. on duplicate key update
  30. 2009.07.04 MYSQL Replication 리플리케이션
분류없음2013.12.17 12:33



신고
Posted by 콩이랑 팥이랑 심자꾸나
분류없음2013.12.16 16:11

기초문자한눈에

정체문자

핵체문자

신고
Posted by 콩이랑 팥이랑 심자꾸나

기초문자한눈에

정체문자

핵체문자



신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2012.11.28 13:24

python에서 디버깅하기 

pdb.pm 사용하기

pdb.pm 를 사용하면 실행 후 에러가 난 부분에 직접 디버깅을 할 수 있다.

test01.py

import pdb

A = [1,2,3,4,5]
for x in range(10) :
   print(A[x])

print(A)

디버깅을 하려면 py3 -i test01.py 로 실행후 >>> pdb.pm() 를 입력한다.

C:\_py\bitggal_dev\Bitggal-0-2\Doc\Betle\_static\WordLib>py3 -i test01.py

C:\_py\bitggal_dev\Bitggal-0-2\Doc\Betle\_static\WordLib>C:\python32\python.exe
-i test01.py
1
2
3
4
5
Traceback (most recent call last):
  File "test01.py", line 5, in <module>
    print(A[x])
IndexError: list index out of range
>>> pdb.pm()
> c:\_py\bitggal_dev\bitggal-0-2\doc\betle\_static\wordlib\test01.py(5)<module>()
-> print(A[x])
(Pdb) x
5
(Pdb)

신고
Posted by 콩이랑 팥이랑 심자꾸나

베틀언어의  843 개 기초단어 입니다.


저작자 표시 비영리 변경 금지
신고
Posted by 콩이랑 팥이랑 심자꾸나
분류없음2011.09.21 00:21
자바스크립트에서는 HTML 에 있는 이미지의 원래크기를 구할 수 없다고 생각했었다.
그러나 검색해 본 결과  다음과 같이 별 어렵지 않게 이미지의 원래 크기를 구할 수 있는 스크립트를 작성할 수 있었다.

<html>


<head>

<script type='text/javascript' src='../jquery-1.5.2.min.js'></script>


<script type='text/javascript' >

    $(document).ready(function(){

    

    // 이미지의 크기 구하기 

    /*

    http://stackoverflow.com/questions/318630/get-real-image-width-and-height-with-javascript-in-safari-chrome

    */

    

    // var img = $("img")[0]; // Get my img elem

    var img = $("#im1"); // Get my img elem


    var pic_real_width, pic_real_height;

    $("<img/>") // Make in memory copy of image to avoid css issues

        .attr("src", $(img).attr("src"))

        .load(function() {

            pic_real_width = this.width ;   // Note: $(this).width() will not

            pic_real_height = this.height ; // work for in memory images.

            alert( '' + pic_real_width + ',' + pic_real_height  ) 

        });

     });

    

</script>


</head>

<body>


<img id='im1' src='t1.gif'>


</body>


</html>


참고 :
 http://youngsam.kr/1062?category=3
 http://stackoverflow.com/questions/318630/get-real-image-width-and-height-with-javascript-in-safari-chrome
신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/js2010.08.25 16:39

narwhal 과 jison

설치환경

  • cygwin 설치된 윈도우XP 환경

narwhal , jison 을 윈도우에서 설치하고 실행은 cyg 에서 실행 ( cyg 상 tusk에 문제있음 ) cyg를 위한 PATH 에 설치된 윈도우 경로를 지정 ( .bashrc 에서 )

  • 설치 ::

    ( +.bat 실행 )

    #narwhal 을 설치 > git clone git://github.com/280north/narwhal.git

    #jison 설치 > tusk install jison

  • cyg 설정

    # 윈도우에 설치되 자바 경로 추가
    # ~/.bashrc 파일
    
    # jison / narwhal / java
    export PATH=$PATH:/cygdrive/c/APM_Setup/htdocs/js/narwhal/bin:/cygdrive/c/APM_Setup/htdocs/js/narwhal/packages/jison/bin:"/cygdrive/c/Program Files/Java/jdk1.6.0_10/bin":
    

실행테스트

이제 cyg 를 실행하고 narwhal 과 jison 을 테스트 한다.

narwhal test

> narwhal --help

$ narwhal --help

    Usage: narwhal-rhino [OPTIONS] [SCRIPT]
    Runs the Narwhal JavaScript interpreter.
    If no script is specified, runs interactively.
     -e -c --command COMMAND: evaluate command (final option)
     -m --module MAIN: run a library module as a script (final option)
     modules:
        -r --require MODULE: pre-load a module
        -I --include LIB: add a library
        -p --package PACKAGE: add a package
        -P --no-packages: don't load packages
        -: --path DELIMITER: prints an augmented PATH with all package bins/
     -d --debug: set debug mode, system.debug = true
     -v --verbose: verbose mode: trace module loads. -vv for all 'require' calls
     -l --log LEVEL: set the log level (critical, error, warn, info, debug)
     -V --version: print Narwhal version number and exit
     --no-term: disables terminal coloring (term module)
     -O: increase the optimization level (stacks -OO)
     -o: decrease the optimization level (stacks -oo)
     -h --help: displays usage information (final option)

jison test

  • 파서생성

    $ cd /cygdrive/c/APM_Setup/htdocs/js/jison/examples/
    
    $ ../bin/jison calculator.jison
        --->( calculator.js 생성 )
    
    # json 버전인 경우
    $ ../bin/jison calculator.json
    
  • 웹에서 파서 로드 실행하기

    # calc.html
    <html>
        <head>
            <script type='text/javascript' src='calculator.js' ></script>
        </head>
        <body>
            <b>
                <script type='text/javascript' >
    
                    //print 함수는 공함수로
                    function print( a ){ }
    
                    scr= "(42/6)*7"
                    a = calculator.parse( scr );
    
                    document.write(  scr + '  ==> ' + a )
    
                </script>
            </b>
        </body>
    </html>
    
    # 브라우저 결과
    (42/6)*7 ==> 49
    
  • narwhal에서 실행하기

    # calc_test.js
    var parser = require("./calculator").parser;
    function exec (input) {
        return parser.parse(input);
    }
    var twenty = exec("4 * 5");
    
    # 실행
    > narwhal  calc_test.js
    
    # 실행결과 : 20
    
  • narwhal에서 입력파일로 실행

    # calc_t
    7 * 8 / 2 / 3
    
    # 실행
    > narwhal calculator.js calc_t
    
    # 실행결과 : 9.333333333333334
    
  • narwhal에서 소스로 직접 실행

    // mygenerator.js
    var Parser = require("jison").Parser;
    
    var grammar = {
        "lex": {
            "rules": [
               ["\\s+", "/* skip whitespace */"],
               ["[a-z0-9]+", "return 'HEX';"]
            ]
        },
    
        "bnf": {
            "hex_strings" :[ "hex_strings HEX",
                             "HEX" ]
        }
    };
    
    var parser = new Parser(grammar);
    
    // generate source, ready to be written to disk
    var parserSource = parser.generate();
    
    // you can also use the parser directly from memory
    
    parser.parse("adfe34bc e82a");
    // returns true
    
    parser.parse("adfe34bc zxg");
    // throws lexical error
    

jison 으로 파서 생성

파서의 문법 파일인 *.jison 파일을 만든후 narwhal jison 으로 변환하여 *.js 파일을 만든다.


신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2010.04.27 23:11
분류없음2009.12.08 22:39

파이썬에서 XMLRPC CGI 서버가동하기

다음은 CGI HTTP 서버스크립트 임 /cgi-bin , /wbin 디렉토리는 CGI 가 실행되는 디렉토리로 서버가 실행되는 스크립트의 디렉토리에 밑에 있다. (httpsrv.py)

from  http.server import *
from http.server import CGIHTTPRequestHandler

def run(server_class=HTTPServer, handler_class=CGIHTTPRequestHandler ):
server_address = ('', 8080 )
handler_class.cgi_directories = ['/cgi-bin', '/wbin']
httpd = server_class(server_address, handler_class)
httpd.serve_forever()

run()

XMLRPC CGI 스크립트 ( cx1.py ):

from xmlrpc.server import DocCGIXMLRPCRequestHandler

class MyFuncs:
def div(self, x, y) : return x // y

handler = DocCGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()

XMLRPC CGI 테스트 스크립트 ( cx1c.py ):

import xmlrpc.client

s = xmlrpc.client.ServerProxy('http://localhost:8080/wbin/cx1.py' )

print(s.pow(2,3)) # Returns 2**3 = 8
print(s.add(2,3)) # Returns 5

# Print list of available methods
print(s.system.listMethods())

이제 서버를 가동하고 테스트 실행하면:

python  httpsrv.py
..
python cx1c.py

다음과 같은 결과를 얻을 것이다.:

>python cx1c.py
8
5
['add', 'div', 'pow', 'system.listMethods', 'system.methodHelp', 'system.methodS
ignature']

자바스크립트와 XMLRPC

다음은 자바스크립트에서 직접 XML 사용하여 XMLRPC를 호출하는 방법이다. 이 방법은 번거롭고 리턴받은 XML 코드도 해석하여야 사용가능하다.

<html>

<body>
<a href= "/cgi-bin/cx1.py">ii</a>
<script language="javascript" type="text/javascript">

var req = new XMLHttpRequest();
req.open('POST', 'http://localhost:8080/cgi-bin/cx1.py', false );
req.send(
"<?xml version='1.0'?>" +
"<methodCall>" +
"<methodName>add</methodName>" +
"<params>"+
"<param><value><i4>23</i4></value></param>" +
"<param><value><i4>23</i4></value></param>" +
"</params>" +
"</methodCall>"
);
document.write( req.responseText + "--------")

</script>

</body>
</html>

mimic.js 자바스크립트 XML-RPC 라이브러리

파이썬과 javascript 사이의 XML-RPC 에서 잘 동작하는 라이브러리로 mimic.js 이 있다.

위 mimic.js 를 다운로드 하고 다음과 같이 자바스크립트를 작성하면

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<script type="text/javascript" src='mimic.js' > </script>
</head>

<body>
<script type="text/javascript" >

a = new XmlRpcRequest( 'cgi-bin/cx1.py','add')

a.params= [ 30 , 12345 ]

//또는
// a.addParam( 30 )
// a.addParam( 12345 )

b = a.send()

document.write( "`30 + 12345 = ` 의 결과는 => " )
document.write( b.parseXML() )

</script>

</body>

</html>

위 html 을 브라우저 로 보아 다음과 같이 결과가 보인 다면 성공적으로 작동되고 있는 것이다.


신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/php2009.10.30 12:58
<?  // test.php 
   
    //만든이 : 부들 ikw3179@naver.com
    //만든날 : 2009 . 10. 30
    //저작권 : GPL

    $title=' 상위폴더 뒤져서 include 테스트  하기 ' ;
    $_debug=1 ;
   
    // 상위디렉토리의 모든 라이브러리 include
    $E = "root_insc.php" ; // 종료위치 
    $I = array(
      "ptest_inc.php" ,      
      "m2_inc.php" ,
      "m_inc.php" ,
    );
?>


<?php $D=__FILE__;while(1){$P=dirname($D).'/';if($D==$P)break;else{while(is_file($P.end($I)))$M[]=$P.array_pop($I);$R="$D/$E";if(is_file($R)){include_once$R;break;}$D=$P;}}foreach(array_reverse($M)as$m)include_once$m;if($I)print('<u>INC오류 '.print_r($I,1).'</u>');?>

<?php

   

?>

위 프로그램에서
<?php $D=__FILE__;while(1){$P=dirname($D).'/';if($D==$P)break; else{while(is_file($P.end($I)))$M[]=$P.array_pop($I);$R="$P/$E"; if(is_file($R)) {include_once$R;break;}$D=$P;}}foreach(array_reverse($M)as$m)include_once$m; if($I)print('<u>INC오류 '.print_r($I,1).'</u>');?>

이 부분은 상위 디렉토리를 뒤져서 라이브러리 파일을 인클루드한다.

 $E 변수는 가장 상위 폴더에 있어야 하며 이 파일을 찾으면 찾기를 종료한다.
 $I 는 인클루드 파일로 상위 파일부터 순서대로 배열되어야 한다.  

만약 환경설정과  ,  디렉토리구조를 자주 변경한다면 이와같이 유동적으로 작동하는 인클루드가 적합할수 있다.


...
root_inc.php
└─/ptest
    ├─main_inc.php
    ├─/m
    │  ├─m_inc.php
    │  ├─m2_inc.php
    │  └─test.php
    │ 
    ├─t
    └─t=#테스트


위 구조에서 test.php
파일은 root_inc.php , main_inc.php , m_inc.php , m2_inc.php 를 순서대로 인클루드한다.
 


------------------------------
기능확장
------------------------------
다음과 같이 로드 기능을 확장 한다.



<?php $D=__FILE__;while(++$Z){$P=dirname($D).'/';if($Z==1)$A=$P;if($D==$P)break;else{

//while(is_file($P.end($I)))$M[]=$P.array_pop($I);

while($J=end($I))

 if($J[0]=='|'&&($J=$A.substr($J,1))&&is_file($J));
 elseif(basename($J)==$J&&is_file($P.$J)){$J=$P.$J;}
 elseif(!is_file($J))break;
 $M[]=$J;array_pop($I);
}

$R="$P/$E";if(is_file($R)){include_once$R;break;}$D=$P;}}if($M)foreach(array_reverse($M)as$m)include_once$m; if($I)print('<u>INC ERR[$Z]'.print_r($I,1).'</u>');?>



위 파일에서 로드하는 루프구문을 위와 같이 변경하면 다음과 같은 형식으로 로드가 가능해 진다.

*  상대경로면 , 절대경로르 기준으로 로드 :  이름에 경로가 있는 경우
__file__ 기준 로드  : '|'  으로 시작하는 경우
자동검색 로드  : 이름이 basename 으로만 구성된 경우

    // 상위디렉토리의 모든 라이브러리 include
    $E = "root_insc.php" ; // 종료위치 
    $I = array(
  "../temp/temp.php" , // 상대경로면 , 절대경로
  
  "|../p.php" ,    // __file__ 기준
       
  "main_i.php" , //bsasename 있으면 자동검색
 );


 전체 파일내용  

<?  // test.php 
   
    //만든이 : 부들 ikw3179@naver.com
    //만든날 : 2009 . 10. 30
    //저작권 : GPL

    $title=' 상위폴더 뒤져서 include 테스트  하기 ' ;
    $_debug=1 ;
   
    // 상위디렉토리의 모든 라이브러리 include
    $E = "root_inc.php" ; // 종료위치 
    $I = array( 

  "../temp/temp.php" , // 상대경로면 , 절대경로
  
  "|../p.php" ,    // __file__ 기준
       
  "main_i.php" , //bsasename 있으면 자동검색
 );
  
?>

<?php $D=__FILE__;while(++$Z){$P=dirname($D).'/';if($Z==1)$A=$P;if($D==$P)break;else{while($J=end($I)){if($J[0]=='|'&&($J=$A.substr($J,1))&&is_file($J));elseif(basename($J)==$J&&is_file($P.$J)){$J=$P.$J;}elseif(!is_file($J))break;$M[]=$J;array_pop($I);}$R="$P/$E";if(is_file($R)){include_once$R;break;}$D=$P;}}if($M)foreach(array_reverse($M)as$m)include_once$m; if($I)print('<u>INC ERR[$Z]'.print_r($I,1).'</u>');?>

<?
$M = array(1,2,3,4,5) ;

print( end( $M ));

?>


 



다음 파일들을 순서적으로 로드하게 된다.

C:\root_inc.php
C:\APM_Setup\temp\temp.php
C:\APM_Setup\p.php
C:\APM_Setup\htdocs\main_i.php

신고
Posted by 콩이랑 팥이랑 심자꾸나
분류없음2009.10.19 10:29

http://codeigniter.com/

한국어 메뉴얼
http://codeigniter-kr.org/user_guide/general/styleguide.html

=============
* 컨트롤 만들기 
* table 


<?php
class b extends Controller {

 function index()
 {
  $this->load->library('table');
  
  $tmpl = array (
      'table_open'          => '<table border="5" width=100% cellpadding="4" cellspacing="0">',

      'heading_row_start'   => '<tr>',
      'heading_row_end'     => '</tr>',
      'heading_cell_start'  => '<th>',
      'heading_cell_end'    => '</th>',

      'row_start'           => '<tr  bgcolor=gray>',
      'row_end'             => '</tr>',
      'cell_start'          => '<td align=center>',
      'cell_end'            => '</td>',

      'row_alt_start'       => '<tr  bgcolor=lightgrey>',
      'row_alt_end'         => '</tr>',
      'cell_alt_start'      => '<td>',
      'cell_alt_end'        => '</td>',

      'table_close'         => '</table>'
      );

  $this->table->set_template($tmpl);

  $data = array(


     array('Mary', 'Red', 'Large'),     array('Fred', 'Blue', 'Small'),
     array('Mary', 'Red', 'Large'),     array('Fred', 'Blue', 'Small'),
     array('Mary', 'Red', 'Large'),     array('Fred', 'Blue', 'Small'),
     array('Mary', 'Red', 'Large'),
     array('John', 'Green', 'Medium')
     );

   echo $this->table->generate($data);
  
  $this->bview() ;
 }

 function bview()
 {
  $this->load->view('v/bview');  
 }
}
?>


 



<hr>
<?

$this->table->set_empty("&nbsp;--");

$this->table->clear() ;
$data = array(

   array('오리', '너구리', '그리고'),
   array('John', 'Green','')
   );

 echo $this->table->generate($data);

$list = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve');

$new_list = $this->table->make_columns($list, 3);

$this->table->set_heading(array('Name', 'Color', 'Size','123'));

echo $this->table->generate($new_list);

 
?><hr>





* 폼검증

<html>
<head>
<title>My Form</title>
</head>
<body>

<?php echo validation_errors(); ?>

<?php echo form_open('c');

echo $_POST['username'] ;
?>

<h5>Username</h5>
<input type="text" name="username" value="<?=$_POST['username']?>" size="50" />

<h5>Password</h5>
<input type="text" name="password" value="" size="50" />

<h5>Password Confirm</h5>
<input type="text" name="passconf" value="" size="50" />

<h5>Email Address</h5>
<input type="text" name="email" value="" size="50" />

<div><input type="submit" value="Submit" /></div>

</form>

</body>
</html>



 

<?php
class c extends Controller {

 function index()
 { 
  $this->load->helper(array('form', 'url'));
  
  $this->load->library('form_validation');
  
  $this->formcheckinit() ;
   
  if ($this->form_validation->run() == FALSE)
  {
   $this->load->view('v/cview') ;
  }
  else
  {
   $this->load->view('v/cview2') ;
  }

 
  
 }

 function formcheckinit()
 {
  
 $this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]');
$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');


 }
 
 function cview()
 {
  $this->load->view('v/cview') ;
  
  
  
  
 }
 

}
?>



신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.10.12 20:44
python에서 매뉴얼 및 문서제작을 위한 sphinx 라이브러리를 설치하면 RST 형식을 기반으로 하는 문서제작을 쉽게 할 수 있다.

http://sphinx.pocoo.org/
 Sphinx is a tool that makes it easy to create intelligent and beautiful documentation, written by Georg Brandl and licensed under the BSD license.

It was originally created to translate the new Python documentation, and it has excellent support for the documentation of Python projects, but other documents can be written with it too. Of course, this site is also created from reStructuredText sources using Sphinx!

현재는 python 2.x 에서 사용할 수 있으며  설치과정 또한 매우 쉽다.
신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.10.08 20:37

사이트에 FTP로 파일을 복사해 넣는 작업등을 할때 ftp 클라이언트 라이브러리를 사용하면 편리하게 배포툴을 만들수 있다.

ftputil 라이브러리를 http://pypi.python.org/pypi/ftputil/2.4.1 에서  다운 받아서 2to3 로 PYTHON 3 에 맞게 만든 후 설치 한다.



신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.09.09 17:07

파이썬에서 유닛테스트를 할 경우 하나의 파일을 작성하고 실행하는  경우보다 여러개의 파일을 작성하고 총 결과를 얻는 것이 필요한 경우가 많다. 이런 경우 기존의 모듈들에서 적당한 unittest 파일들을 테스트하는 사례를 참고하여 자신에 맞게 구성해서 사용하면 좋을 것이다.

만약 docutils 의 테스트 실행이 좋다면 docutils 모듈을 설치한 후 test 폴더의  package_unittest 와 그 와 관련된 파일들을 자신에 맞게 고쳐서 자신의 테스트 폴더에서 실행하면 된다.

먼저  docutils 모듈을 설치한 후 test 폴더를 살펴 보자

C:\_ik\download\python\docutil\docutils-0.5\test>
├─data
├─functional
│  ├─expected
│  │  └─ui
│  │      ├─default
│  │      └─small-black
│  ├─input
│  │  └─data
│  ├─output
│  │  └─ui
│  │      ├─default
│  │      └─small-black
│  └─tests
├─test_parsers
│  └─test_rst
│      ├─includes
│      └─test_directives
│          └─includes
│              ├─more
│              └─sibling
├─test_readers
│  ├─test_pep
│  └─test_python
├─test_transforms
└─test_writers

위 폴더 중 test_ 로 시작하는  폴더명은 모두 unittest  를 위한 폴더들이다.
또한 test_ 로 시작하는 파일명도 unittest 를 실행하는 테스트 파일이다.

한번 docutils 모듈을 설치한후 모듈 테스트를 감행해 보자! ( python 2.x 에서 테스트 )
C:\_ik\download\python\docutil\docutils-0.5\test>python alltest.py
모든 디렉토리의 test_ 파일이 실행될 것이다.


이 좋은 테스틑 모듈을 바로 가져와 적용하고 싶으나  내가 만든 테스트 파일은 'test_' 로 시작하는 대신 파일명과 폴더명에  '+' 기호가 들어가기 때문에 바로 위 테스트 스크립트를 적용할 수 없다.  

unitest_files
│  test_pytok+.py
│  test_pytok2.py
│  test_pytok3.py

├─a+
│  │  a_pytok2+.py
│  │  a_pytok3+.py
│  │
│  └─b+
│          b_pytok2+.py
│          b_pytok3+.py

└─c+
        c_pytok2+.py
        c_pytok3+.py



다행히도 약간의 수정만 가하면 쉽게 적용시킬수 있다.

위  C:\_ik\download\python\docutil\docutils-0.5\test 폴더의 package_unittest.py , alltests.py
를 2to3 를 적용해 python 3.x 에 맞게 변경하고 불필요한 코드를 제거하고 변경해보자. ( 현재 테스트 스크립트가 3.x에서 작성 되었기 때문 )

그리고 다음과 같이 불필요한 부분을 주석처리하고 코드에 약간의 수정을 가하였다.

package_unittest.py

#! /usr/bin/env python

# $Id: package_unittest.py 4564 2006-05-21 20:44:42Z fwiemann $
# Author: Garth Kidd <garth@deadlybloodyserious.com>
# Copyright: This module has been placed in the public domain.

"""
This module extends unittest.py with `loadTestModules()`, by loading multiple
test modules from a directory.  Optionally, test packages are also loaded,
recursively.
"""

import sys
import os
import getopt
import types
import unittest
import re


# So that individual test modules can share a bit of state,
# `package_unittest` acts as an intermediary for the following
# variables:
debug = 0
verbosity = 2

USAGE = """\
Usage: test_whatever [options]

Options:
  -h, --help       Show this message
  -v, --verbose    Verbose output
  -q, --quiet      Minimal output
  -d, --debug      Debug mode
"""

def usageExit(msg=None):
    """Print usage and exit."""
    if msg:
        print(msg)
    print(USAGE)
    sys.exit(2)

def parseArgs(argv=sys.argv):
    """Parse command line arguments and set TestFramework state.

    State is to be acquired by test_* modules by a grotty hack:
    ``from TestFramework import *``. For this stylistic
    transgression, I expect to be first up against the wall
    when the revolution comes. --Garth"""
    global verbosity, debug
    try:
        options, args = getopt.getopt(argv[1:], 'hHvqd',
                                      ['help', 'verbose', 'quiet', 'debug'])
        for opt, value in options:
            if opt in ('-h', '-H', '--help'):
                usageExit()
            if opt in ('-q', '--quiet'):
                verbosity = 0
            if opt in ('-v', '--verbose'):
                verbosity = 2
            if opt in ('-d', '--debug'):
                debug =1
        if len(args) != 0:
            usageExit("No command-line arguments supported yet.")
    except getopt.error as msg:
        usageExit(msg)

def loadTestModules(path, name='', packages=None):
    """
    Return a test suite composed of all the tests from modules in a directory.

    Search for modules in directory `path`, beginning with `name`. If
    `packages` is true, search subdirectories (also beginning with `name`)
    recursively.  Subdirectories must be Python packages; they must contain an
    '__init__.py' module.
    """
    testLoader = unittest.defaultTestLoader
    testSuite = unittest.TestSuite()
    testModules = []
    path = os.path.abspath(path)        # current working dir if `path` empty
    paths = [path]
    while paths:
        p = paths.pop(0)
        files = os.listdir(p)
        for filename in files:
            #if filename.startswith(name):
            if re.search( name , filename ) :
                fullpath = os.path.join(p, filename)
                if filename.endswith('.py'):
                    fullpath = fullpath[len(path)+1:]
                    testModules.append(path2mod(fullpath))
                elif packages and os.path.isdir(fullpath) and \
                      os.path.isfile(os.path.join(fullpath, '__init__.py')):
                    paths.append(fullpath)
    # Import modules and add their tests to the suite.
    sys.path.insert(0, path)
    for mod in testModules:
        if debug:
            print("importing %s" % mod, file=sys.stderr)
        try:
            module = import_module(mod)
        except ImportError:
            print("ERROR: Can't import %s, skipping its tests:" % mod, file=sys.stderr)
            sys.excepthook(*sys.exc_info())
        else:
            # if there's a suite defined, incorporate its contents
            try:
                suite = getattr(module, 'suite')
            except AttributeError:
                # Look for individual tests
                moduleTests = testLoader.loadTestsFromModule(module)
                # unittest.TestSuite.addTests() doesn't work as advertised,
                # as it can't load tests from another TestSuite, so we have
                # to cheat:
                testSuite.addTest(moduleTests)
                continue
            if type(suite) == types.FunctionType:
                testSuite.addTest(suite())
            elif type(suite) == types.InstanceType \
                  and isinstance(suite, unittest.TestSuite):
                testSuite.addTest(suite)
            else:
                raise AssertionError("don't understand suite (%s)" % mod)
    sys.path.pop(0)
    return testSuite

def path2mod(path):
    """Convert a file path to a dotted module name."""
    return path[:-3].replace(os.sep, '.')

def import_module(name):
    """Import a dotted-path module name, and return the final component."""
    mod = __import__(name)
    components = name.split('.')
    for comp in components[1:]:
        mod = getattr(mod, comp)
    return mod

def main(suite=None):
    """
    Shared `main` for any individual test_* file.

    suite -- TestSuite to run. If not specified, look for any globally defined
    tests and run them.
    """
    parseArgs()
    if suite is None:
        # Load any globally defined tests.
        suite = unittest.defaultTestLoader.loadTestsFromModule(
              __import__('__main__'))
    if debug:
        print("Debug: Suite=%s" % suite, file=sys.stderr)
    testRunner = unittest.TextTestRunner(verbosity=verbosity)
    # run suites (if we were called from test_all) or suite...
    if type(suite) == type([]):
        for s in suite:
            testRunner.run(s)
    else:
        testRunner.run(suite)

alltest.py

#!/bin/sh
''''exec python -u "$0" "$@" #'''

# $Id: alltests.py 4629 2006-06-22 19:03:06Z goodger $
# Author: David Goodger <goodger@python.org>
# Copyright: This module has been placed in the public domain.

__doc__ = \
"""
All modules named 'test_*.py' in the current directory, and recursively in
subdirectories (packages) called 'test_*', are loaded and test suites within
are run.
"""

import time
# Start point for actual elapsed time, including imports
# and setup outside of unittest.
start = time.time()

import sys
import os
# import DocutilsTestSupport              # must be imported before docutils
# import docutils


class Tee:

    """Write to a file and a stream (default: stdout) simultaneously."""

    def __init__(self, filename, stream=sys.__stdout__):
        self.file = open(filename, 'w')
        self.stream = stream

    def write(self, string):
        self.stream.write(string)
        self.file.write(string)

    def flush(self):
        self.stream.flush()
        self.file.flush()


def pformat(suite):
    step = 4
    suitestr = repr(suite).replace('=[<', '=[\n<').replace(', ', ',\n')
    indent = 0
    output = []
    for line in suitestr.splitlines():
        output.append(' ' * indent + line)
        if line[-1:] == '[':
            indent += step
        else:
            if line [-5:] == ']>]>,':
                indent -= step * 2
            elif line[-3:] == ']>,':
                indent -= step
    return '\n'.join(output)

def suite():
    path, script = os.path.split(sys.argv[0])
   
    suite = package_unittest.loadTestModules('.','\+', packages=1)
   
    sys.stdout.flush()
    return suite

# must redirect stderr *before* first import of unittest
sys.stdout = sys.stderr = Tee('alltests.out')

import package_unittest


if __name__ == '__main__':
    suite = suite()

    # print ('Testing Docutils %s [%s] with Python %s on %s at %s'
           # % (docutils.__version__, docutils.__version_details__,
              # sys.version.split()[0],
              # time.strftime('%Y-%m-%d'), time.strftime('%H:%M:%S')))
    # print 'Working directory: %s' % os.getcwd()
    # print 'Docutils package: %s' % os.path.dirname(docutils.__file__)

    sys.stdout.flush()
    package_unittest.main(suite)
    #if package_unittest.verbosity > 1:
    #    print >>sys.stderr, pformat(suite) # check the test suite
    finish = time.time()
    print('Elapsed time: %.3f seconds' % (finish - start))



위 두 파일을 my_unitest_files 폴더에 복사하고 하위폴더에  __init__.py 를 생성하여 모듈로 만든다.
그러면 다음과 같다.

my_unitest_files
│  alltests.py
│  package_unittest.py
│  test_pytok+.py
│  test_pytok2.py
│  test_pytok3.py

├─a+
│  │  a_pytok2+.py
│  │  a_pytok3+.py
│  │  __init__.py
│  │
│  └─b+
│          b_pytok2+.py
│          b_pytok3+.py
│          __init__.py

└─c+
        c_pytok2+.py
        c_pytok3+.py
        __init__.py


그리고 실행해 보자. ( python 3.x 에서 테스트 )
python   alltest.py

다음과 같이 잘 실행된다면 성공 -_-


my_unitest_files > python   alltest.py
runTest (test_pytok+.TestSequenceFunctions) ... ok
test_delcomm2 (a+.a_pytok2+.TestSequenceFunctions) ... FAIL
test_delcomm3 (a+.a_pytok2+.TestSequenceFunctions) ... ok
test_0 (a+.a_pytok3+.테스트테스트테스트) ... ok
test_1 (a+.a_pytok3+.테스트테스트테스트) ... ok
test_delcomm2 (c+.c_pytok2+.TestSequenceFunctions2) ... ok
test_delcomm3 (c+.c_pytok2+.TestSequenceFunctions2) ... ok
test_0 (c+.c_pytok3+.테스트테스트테스트) ... ok
test_1 (c+.c_pytok3+.테스트테스트테스트) ... ok
test_delcomm2 (a+.b+.b_pytok2+.TestSequenceFunctions) ... FAIL
test_delcomm3 (a+.b+.b_pytok2+.TestSequenceFunctions) ... ok
test_0 (a+.b+.b_pytok3+.테스트테스트테스트) ... ok
test_1 (a+.b+.b_pytok3+.테스트테스트테스트) ... ok

======================================================================
FAIL: test_delcomm2 (a+.a_pytok2+.TestSequenceFunctions)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\MYSQL\smasta\py\pyProj\test\a+\a_pytok2+.py", line 24, in test_delcom
m2
    self.assertEqual('0','1')
AssertionError: '0' != '1'

======================================================================
FAIL: test_delcomm2 (a+.b+.b_pytok2+.TestSequenceFunctions)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\MYSQL\smasta\py\pyProj\test\a+\b+\b_pytok2+.py", line 24, in test_del
comm2
    self.assertEqual('0','1')
AssertionError: '0' != '1'

----------------------------------------------------------------------
Ran 13 tests in 0.015s

FAILED (failures=2)
Elapsed time: 0.109 seconds


위와 같이  a+ , b+ , c+ 모든 폴더의 테스트파일이 실행된 것을 볼 수 있다.




신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.09.05 23:03
python의 클래스에서 정적변수를 만들 듯이 함수에서도  정적변수를 만드는 방법이 있다.  다만 딱히 정해진 방법이 없기 때문에 다양한 형식으로 만들어 볼수 있다.

기본적으로 __dict__ 속성을 이용히여 만들게 된다.

다음은 v 함수정의 밖에서 v.sv 정적변수를  v.__dict__['sv'] = 897 로 초기화한다.
>>> def v(x):
...     v.sv += x
...     print( v.sv )
...
>>> v.__dict__['sv'] = 897
>>>
>>> v(1)
898
>>> v(1)
899
>>> v(1)
900

이왕이면 v.sv = 897 로 초기화 하는 것이 보기좋을 것이다.
>>> def v(x):
...     v.sv += x
...     print( v.sv )
...
>>> v.sv = 897
>>>
>>> v(1)
898
>>> v(1)
899
>>> v(1)
900


만약 함수내에서 정적변수를 정의 하고 싶다면 다음과 같이 할수 있다.
def v(x):
    try : v.sv
    except : v.sv = 897
    v.sv += x
    print( v.sv )

예외처리구문을 사용하는 것이 못마땅하다면 ( 굳이 이렇게 하는 것은 Python 에  php의 isset 같은 함수가 없기 때문 )
다음과 같이 하면된다.

def v(x):
    if not 'sv' in dir( v ) : v.sv = 897
    v.sv += x
    print( v.sv )

차라리 이렇게 할 바에 광역변수 하나 정의하여 사용하는 것도 그다지 나쁘지는 않을 것이다,.


신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.09.05 14:44
python 에서 경로처리에 관한 모듈은 os.path 를 사용한다.

현재 실행되는 스크립트파일의 절대경로를 구하려면
  os.path.dirname( os.path.abspath( __file__ ) )

두 경로의 상대적 경로 구하기
  os.path.relpath( "c:\\ik" , "c:\\os\\pp" )
'..\\..\\ik'

공통경로 구하기
 os.path.commonprefix( ["c:\\ik\\jj" , "c:\\ik\\sd" ])
'c:\\ik\\'

중간 경로 슬래쉬 제거
  os.path.normpath( "c:\\os\\..\\pp" )
'c:\\pp'

현재 실행경로 구하기
  os.getcwd()

경로명 합치기
 os.path.join( "a" , "b" ,"c" )
'a/b/c'



신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.09.04 17:39

파이썬에서 c , c++ 에서 많이 사용하는 enum 상수를 지원하지 않지만 유사하게 만들어 사용할수 있는 방법이 있다.
enumerate , exec 함수를 사용하거나 range 를 사용한 다중 할당문을 사용할 수 있다.

( python 3.1 에서 테스트  )


# 열거형 상수 만들기


for i, season in enumerate(['SPRING', 'SUMMER', 'FALL', 'WINTER'] , 1 ):
    execcode = "{}={}".format( season , i )
    print( execcode )
    exec( execcode )
   
print( SPRING, SUMMER, FALL, WINTER )


# range를 사용하여 다음과 같이 만들수 있다.
A, B, C, D = range(100,104)
print( A, B, C, D )


# 또는 다음과 같이 만들수 있다.  3.x 버전에서 유효
A, B, C, D , *NEXTALL  = range(100,110)
print( A, B, C, D )


#클래스 상수 만들기

class CLS :
   
    def __init__(self): pass

for v , k in enumerate( ['MOVE' , 'COPY' , 'DEL'] ) :
    setattr( CLS , k , v )

print( CLS.MOVE , CLS.COPY , CLS.DEL  )

obj = CLS( )
print( obj.MOVE , obj.COPY , obj.DEL ) 

#클래스 상수 만들기 2

class CLS2 :
    E,F,G,H = range(1,1+4)
    def __init__(self): pass

print( CLS2.E , CLS2.F , CLS2.G , CLS2.H ) 



#다음 경우는 __getattr__를 사용하기 때문에 객체로 만든 후에만 사용가능하게 된다.
import itertools

class CLS3 :
    attr_dict = dict( zip( ['MOVE' , 'COPY' , 'DEL'] , itertools.count(5) ) )
   
    def __init__(self): pass
    def __getattr__(self , attr ) :
        return self.attr_dict[attr]

X = CLS3()
print( X.MOVE , X.COPY , X.DEL  )


#좀더 복잡하게 변경불가능한 상수와 일반 맴버변수를 구분해보자 
#다음 경우는 __getattr__를 사용하기 때문에 객체로 만든 후에만 사용가능하게 된다.
import itertools

def set_enum( attrs , start=1 ) :
    return dict( zip( attrs , itertools.count(start) ) )
   

class CLS3 :
    ENUM = set_enum( [ 'MOVE' , 'COPY' , 'DEL' ] )
    ATTR = {}
   
    def __init__(self): pass
    def __getattr__(self , attr ) :
        if attr in self.ENUM : return self.ENUM[attr]
        if attr in self.ATTR : return self.ATTR[attr]
       
    def __setattr__(self , attr ,val ) :
        if attr in self.ENUM : raise ValueError
        self.ATTR[attr] = val
       
X = CLS3()
print( X.MOVE , X.COPY , X.DEL  )

X.MOVE  =100   #경고가 뜬다 !!
X.CL =200

print( X.MOVE , X.COPY , X.DEL , X.CL )

   
   
   



신고
Posted by 콩이랑 팥이랑 심자꾸나
분류없음2009.09.04 10:09
명령행에서 자주가는 디렉토리로 빠르게 이동하고 싶은데 그 때마다 디렉토리를 입력하는 것은 지루한 반복작업이 된다.
윈도우에서 배치파일에 자주가는 디렉토리를 등록하여 사용하는 방법을 있으면 좋을것 같아 다음과 같은 스크립트를 만들었다.

아래의 SCD.bat 와 SCD_SET.bat 파일을 실행경로디렉토리에 만들고 SCD_SET 에 자주가는 디렉토리에 번호를 등록하여 사용하면된다.



SCD.bat
REM 만든이 : 부들 <.)++++<
REM 만든때 : 2009 9 1
REM 메일: ikw3179@naver.com
REM 저작권 : GPL

@cls

@SET MAIN=
@SET SCD=
@SET SUB=

@set L=############################################################

@set UBIN=C:\_bin
@set SCD_SET=%UBIN%\%0_set.bat

@type %SCD_SET%
@echo %L:#=-%

@set /P MAIN=입력/MAIN:

@if "%MAIN%"=="" (
    set SCD=%CD%
    set MAIN=_
)

@if "%MAIN%"=="#" np++ %SCD_SET%

@call %SCD_SET%
    
@dir /W %SCD%
@set /P SUB=입력/SUB:
@if not "%SUB%"=="" cd %SCD%\%SUB%



SCD_SET.bat

@if %MAIN%==1 set SCD=C:\MYSQL\smasta\py\pyLib\study
@if %MAIN%==2 set SCD=C:\MYSQL\smasta\py\pyHanQry
@if %MAIN%==3 set SCD=C:\_ik\python
@if %MAIN%==4 set SCD=C:\_ik\python
@if %MAIN%==5 set SCD=C:\_ik\python
@if %MAIN%==6 set SCD=C:\_ik\python
@if %MAIN%==7 set SCD=C:\_ik\python
@if %MAIN%==8 set SCD=C:\_ik\python
@if %MAIN%==9 set SCD=C:\_ik\python


사용방법은 간단한다. 명령행에서 SCD 을 입력하면 다음과 같은 화면이 뜨고 번호를 입력하면 해당디렉토리로 이동한다.
C:\>SCD

@if %MAIN%==1 set SCD=C:\MYSQL\smasta\py\pyLib\study
@if %MAIN%==2 set SCD=C:\MYSQL\smasta\py\pyHanQry
@if %MAIN%==3 set SCD=C:\_ik\python
@if %MAIN%==4 set SCD=C:\_ik\python
@if %MAIN%==5 set SCD=C:\_ik\python
@if %MAIN%==6 set SCD=C:\_ik\python
@if %MAIN%==7 set SCD=C:\_ik\python
@if %MAIN%==8 set SCD=C:\_ik\python
@if %MAIN%==9 set SCD=C:\_ik\python
------------------------------------------------------------
입력/MAIN:1
 C 드라이브의 볼륨: MAIN
 볼륨 일련 번호: 742D-B8E0

 C:\MYSQL\smasta\py\pyLib\study 디렉터리

[.]                 [..]                [a]                 [a=#APCON.ji]
[c]                 [c=#클래스.ji]      [d]                 [d=#배포]
[m]                 [m=#문법관련]       [n]                 [n=#네트워크]
pyall_copy.py       [py_test]           [py_tk]             [py_ulib]
[r]                 [r=#소스샘플]       [s]                 [s=#기본라이브러리]
[w]                 [w=#웹]             [x]                 [x=#XML]
[z=#asasd._]        __py_copy.pyc
               2개 파일                 703 바이트
              24개 디렉터리  28,647,710,720 바이트 남음
입력/SUB:w

C:\MYSQL\smasta\py\pyLib\study\w>




신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.09.03 15:18

IDLE 실행하기
python  -m idlelib.idle

idle 실행과 함께 미리 임포트 하기
C:\Python31> echo import os | python -m idlelib.idle -

idle.bat 파일로 만들어 사용하기
echo import %*  | python -m idlelib.idle -
사용시에는   idle.bat  os , sys , pprint .. 처럼 입력하면 된다.


만약 IDLE 를 사용하지 않고
명령행에서 인터프리터를 사용하려면
python -i -c "import  os , sys"


스크립트 실행후 inspect 모드로 ..
python  -i  sample.py
신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.09.01 02:04

다음은 파이썬 소스코드에서 #주석을 제거하는 함수이다. tokenize 모듈을 사용하였고 토큰화한후 주석을 제거한후 소스를 다시 실행가능하도록 연결하는 작업이 간단치 않다. python의 들여쓰기로 인해 토큰도 그에 맞추어 재 구성해야 한다.

다음 delcomm 함수는 현재파일의 주석을 제거한다.
python3.1 에서 테스트됨


import tokenize , io , pprint , codecs

'''
#"토큰화 테스트"'
'''
F = open( __file__ , "rb" ).readline ; #파일을 바이너리 모드로 열어야 함
ALIST = tokenize.tokenize( F )
for x  in  ALIST :
    X = list(x)
    X.pop(2)
    X.pop(2)
    if X :
        print ("#" , end='' )
        pprint.pprint(X)

abcd ='987654'
고한글='77'
고한글 in [1,2,77]

print( '' )

def delcomm( file ) :
    F = open( file , "rb" ).readline
    A = tokenize.tokenize( F )

    idn = ['']
    NL =None # 새줄
    UC =None # 유니코드식별자
    R = ''
   
    for x  in A :
        X = list ( x )

        #INDENT #들여쓰기
        if X[0] == 5    :   idn.append( X[1] )  ; continue
        elif X[0] == 6  :   idn.pop() ; continue
       
        #NEWLINE
        if NL :
            R += NL + idn[-1]
            NL = None
           
        #CASE
        if X[0] == 4  or X[0] == 56  :
            NL = X[1]
        #주석제거
        elif X[0] == 55 :
            continue
       
        elif X[0] == 54 :
            R +=  X[1]
            UC = True
           
        elif X [ 0 ] == 57 : #엔코딩
            R += '# -*- encoding : {} -*-\r\n'.format( X[1] )
           
        else :
            if UC :
                R += ' '+ X[1] + ' '
            else :
                R += X[1] + ' '
           
            UC = False
   
    return R

print ( delcomm( __file__ ) )
   
   
       







만약 untokenize 함수를 사용한다면  다음처럼 간단하게 주석을 제거할수 있다.

import tokenize

F =open ( __file__ ,"rb").readline ;

# 이 주석글은 제거된다.
ALIST =tokenize .tokenize (F )

G =[]
for toknum ,tokval ,_ ,_ ,_ in ALIST :
    if toknum ==55 :continue
    G .append ((toknum ,tokval ))

print (str (tokenize .untokenize (G ),'utf8'))




신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.08.14 20:36

보통 파이썬에서 람다는 한줄짜리 아름없는 함수로 알려져 있다.
map , reduce , 등의 함수와 함께 유용하게 사용될 수 있으나 복잡한 연산을 하기 어렵다는 결점을 가지고 있다.

다음 파이썬 문법을 보아도 중간의 문장없이 인수와 리턴문으로만 구성되어 있음이 명확하다 .
def <lambda>(arguments): return expression


그러나 여러가지로  시도해 본 결과 람다문을 중복하여 사용하거나 or , and 로 분기하는 등 다양하게 활용될수 있었다.
( 테스트는 python 3.1 )


# 2009. 8 ... <.)++++<  budl


#행렬바꾸기 #############################################



import random

# 예제는 random 로 랜덤한 수와 그 수에 10을 더한 값을 리턴하는 인수없는 함수를 만드는 것이다.
# random 에서 exec 로 연산하기 
b = lambda :( exec('x=random.randint(1,100);y=x+10',globals()) ) or ( x , y )

print()

A=[]
for N in range(0,10)  :
    B = []
    for x in range(*b()) :
        B.append( x )
    A.append(B)
    print ( B )


Z = zip( *A  )
for x in Z : print(x)   



# 람다 중복하기  #############3333333333333
# 위 exec 를 사용하는 대신 다음과 같이 중복람다를 쓰면 보다 간단하다.

c = lambda :( lambda x=random.randint(1,100) :( x , x +10 ))()

print( c() )
print( c() )
print( c() )
print( c() )
print( c() )
print( c() )


z=100
c = lambda x :( lambda i=x , j=z :( "{}+{}+{}+{}".format(i,j,z,x), " => " , i+j+z+x ) )()
print( *c(18) )


#차라리 이렇게 할 바에 함수를 하나 정의하지
#삼중중복 람다
x = lambda : \

        (lambda a=100 , b=26 : \
            (lambda i=a+a , j=b*b : ( i , j )  \
            )()   \
        )()

print( x())


#차라리 이렇게 할 바에 함수를 하나 정의하지
#조건에 따른 분기
q = lambda x, y : ( x%10 and 'x%10'  ) or ( y%10 and 'y%10' ) or ((x//y)%10 and '(x//y)%10')

print ( q(20,10) )


신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.08.12 12:16
python에서  inspect  모듈을 사용하는 것은 디버깅을 할때 특히 유용하게 사용될수 있다.

단순히 소스의 실행위치의 라인번호를 찍는 것은 sys 모듈을 사용할 수도 있다.

예제는 소스코드의 실행되는 위치의 정보를 보여주는 예제 
 
import sys

def traceit(frame, event, arg):

    '''
    call line return exception
   
    dir( frame )
    ['__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__get
attribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '_
_new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', 'f_back', 'f_builtins', 'f_code', 'f_globals', '
f_lasti', 'f_lineno', 'f_locals', 'f_trace']

    '''
    if event == "return":
        lineno = frame.f_lineno
        print( '=' * 79 )
        print ( "line ==> ", lineno  )
        print ( "arg ==> ", arg )
       
        for x in [ 'f_back', 'f_builtins', 'f_code', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_trace' ] :
            print(  x , eval( "frame.{0:}".format( x )  ) , sep=' ==> ')
            print( '=' * 79 )
           
    return traceit

def main( *arg ):
    m=[1,2,3,4]
    print ( "\n\n\nIn main" )
    for i in range(5):
        print ( i, i*3 )
    print ( "Done." )
   
    return 1000
   

sys.settrace(traceit)
main( 1,7812 ,['한글'])





inspect 모듈을 사용하면 보다 손쉽게 함수를 호출하는 곳의 위치와  프레임을 찾을 수 있다. 
 

다음은 inspect 을 사용한 예제임 ( python 3.1 에서 테스트 되었음 )

디버깅을 위해서 -d 옵션을 사용하여 pdb 모드로 테스트 할수 있습니다.
>python  inspect_sample.py -d

pdbx.py 
import pdb , sys

print ( sys.argv )
if '-d' in sys.argv : pdb.set_trace()

inspect_sample.py
import inspect
import pdbx

def 어디야 ():

    print( '==>  ' , end='\n' )

    print ( *inspect.stack() , sep='\n\n'  , end='-'*50 + '\n')   

    outer1 = inspect.stack()[1][0]
    outer2 = inspect.stack()[2][0]
   
    print ( '-->>  ' , inspect.currentframe() )
   
    print ( 'F0 줄번호 :' , inspect.getlineno(inspect.currentframe())  )  
    print ( 'F1 줄번호 :' , inspect.getlineno(outer1 )  )  
    print ( 'F2 줄번호 :' , inspect.getlineno(outer2 )  )  
   
    # f_locals을 통해서 상위 프레임의 지역변수를 본다
    a = outer1.f_locals['x'] + outer1.f_locals['y']
    return a
   
def 여기야():

    x = 1
    y = 2

    print ( 어디야 () )

   
여기야()

여기야()

여기야()




다음은
http://bbs.python.or.kr/viewtopic.php?t=21471

에 소개된 inspect 예제를 python3.1에 맞게 고친것이다.
import pdbx
import types
import inspect

def countcall(func):
    def countwrap(*args, **kwargs):
        countwrap.count += 1
        return func(*args, **kwargs)
    countwrap.count = 0
    return countwrap

#클래스 함수를 변경한다.
def countallmethods():
    uframe = inspect.stack()[1][0]
   
    #문제있음
    print( uframe.f_locals )
   
    for name, obj in uframe.f_locals.items():
       
        #if callable(obj):
        #if hasattr(obj, "__call__") :
       
        #python 3.1 에서는 다음과 같이 타입을 비교한다.
        if (type(obj) == types.FunctionType ) :

            print ( "= = =" , name )
            print( "Wrapping", name)
            uframe.f_locals[name] = countcall(obj)

class OldClass:
    def gogo(self):
        print( "gogo!!")
    def hehe(self):
        print( "hehe!!")
    def merong(self):
        print( "merong!!")

    countallmethods()

OldClass().gogo()
OldClass().hehe()
OldClass().merong()
OldClass().hehe()
OldClass().gogo()
OldClass().merong()
OldClass().merong()
OldClass().merong()
OldClass().merong()

print( "called gogo", OldClass.gogo.count)
print( "called hehe", OldClass.hehe.count)
print( "called merong", OldClass.merong.count )




== 참고 ==

  * Tracing python code

  * PyMOTW: inspect



신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.08.08 14:35
파이썬에서는 함수 뿐만아니라 클래스도 데코레이션 문법을 적용할수 있다.
데코레이션을 정의하는 함수에 의해서 기존의 클래스를 상속받는 클래스를 만들어 반환하게 된다.

다음은 예제는 set 함수만을 가지는 클래스에 get 함수를 추가적으로 포함하는 클래스 데코레이션 .
(모든 소스는 python3.1 에서 테스트 되었음 )
def meta(cls):
    class C(cls) :
        def __init__( self , *args ) :
            self.all = sum( args )
           
        def get( self ) :
            return self.all
    return C
   

@meta
class X:
    def set( self , num ) :
        self.all = num
       
   
q = X( 1,2,3,4,5,6,7)

print ( q )
print ( q.get() )

q.set( 3432 )
print ( q.get() )

 

위 예제의 실행결과

<__main__.C object at 0x00C15ED0>
28
3432




다음은 클래스 정보를 읽어서 새로운 함수를 추가하는 데코레이션이다.
import string, sys
import cmd
import pdbx

#데코레이션으로 변형하기

def deco_allhelp( CLS ):
    funcstr = "def func(self,args) : "

    for x in  dir(CLS)  :
        if x[0:5] == "help_"    :
            funcstr += "\n  print( '=== {} ==='.format('" + x[5:] + "') )"
            funcstr += "\n  self." + x + "()"
   
    funcstr += "\nCLS.do_allhelp=func"
    print( funcstr )
   
    exec( funcstr , globals() , locals() )

    print( dir(CLS)  )
   
    return CLS 

@deco_allhelp
class CLI(cmd.Cmd):
   
    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = '> '

    def do_hello(self, arg):
        print ( "hello again", arg, "!" )

    def help_hello(self):
        print ( "syntax: hello [message]", )
        print ( "-- prints a hello message" )

    def do_quit(self, arg):
        sys.exit(1)

    def help_quit(self):
        print ( "syntax: quit", )
        print ( "-- terminates the application" )

    def do_i(self , args ):
        print ( args )
        print ("i"*80)

    # shortcuts
    do_q = do_quit


# try it out

cli = CLI()
cli.cmdloop()

실행하면 CLI 클래스에 do_allhelp 라는 새로운 함수를 추가하게 된다.

그리고 cmdloop() 시에  'alldump' 명령으로 모든 도움말을 볼수 있다.


그러나 상황에 따라 모든 데코레이션이 적합한 것은 아니다.  다음과 같이 상위 클래스로 램핑하여도  간단히 위와 동일한 효과를 얻을 수도  있다.

import string, sys
import cmd
import pdbx

#상위 클래스로 랩핑하기
class CmdX ( cmd.Cmd ):
    def __init__(self):
        cmd.Cmd.__init__(self)
       
    def do_help(self,args) :
        if not args : 
            cmd.Cmd.do_help( self , args )
            print ('Help <command>:')
            print ('======================')
            self.do_allhelp( args )
        else : cmd.Cmd.do_help( self , args )
       
    def do_allhelp( self , args) :
        for x in dir( self ) :
            if x[:5] == 'help_' :
                print( "* {} *".format( x[5:] ) )
                exec( 'self.' + x + "()" )
       
class CLI(CmdX):
   
    def __init__(self):
        CmdX.__init__(self)
        self.prompt = '> '

    def do_hello(self, arg):
        print ( "hello again", arg, "!" )

    def help_hello(self):
        print ( "syntax: hello [message]", )
        print ( "-- prints a hello message" )

    def do_quit(self, arg):
        sys.exit(1)

    def help_quit(self):
        print ( "syntax: quit", )
        print ( "-- terminates the application" )

    def do_i(self , args ):
        print ( args )
        print ("i"*80)

    # shortcuts
    do_q = do_quit


# try it out

cli = CLI()
cli.cmdloop()




신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.08.08 01:30
PYTHON 에서는 함수를 새로 작성하지 않고도 함수에 추가적인 기능을 부여하는 방법이 있다.
흔히 decorator 라고 불리우는 방법으로  python 3.x 에서  functools 모듈을 이용할 수 있다.

파이썬에서는 함수를 가공하는 방법에는 크게 두 가지로 분류할 수 있다.

partial  : 기준 함수로 부터 정해진 기존 인자가 주어지는 여러개의 특정한 함수를 만들고자 할때
wraps  : 여러함수에 동일한 기능,특징을 부여하고자 할때

다음은 PYTHON 3.x 에서 테스트 된 에제

다음은 warps 를 사용한 예제

import time

from functools import wraps

def ff( *a , **k ):
    def dcofunc(functor):
        @wraps(functor)
        def function(*args, **xargs):
                start = time.time()
                args = args  + a
                xargs.update( k )
                functor( *args, **xargs)
                end = time.time()
                print( "Elapsed time: %5f" % (end-start))
        return function
    return dcofunc
   

@ff( '밥' , '물' , '우유' ,  반찬=[ '김치' ,'간장'] )
def 먹은것을말해봐( *args , **kw ):
    print ( "먹은것은 다음과 같음" )
    print ( "  - args" , args )
    print ( "  - kw" , kw )

@ff( '산에오르기' , '청소' , '모임'  ,  점심='12:00' , 저녁='5:30' , 잠='10:30'  )
def 오늘의일정( *args , **kw ):
    print ( "일정은 다음과 같음. 사정에 따람 변경될 수 있음" )
    print ( "  - args" , args )
    print ( "  - kw" , kw )

   
먹은것을말해봐( '빵' , '오이' , '국수' , 과일=[ '참외' , '복숭아' ] )
오늘의일정( '바람쐬기' , '산책' , '낮잠' , 비공식일정=['비자금숨기기','영화보기'] )

먹은것은 다음과 같음
  - args ('빵', '오이', '국수', '밥', '물', '우유')
  - kw {'과일': ['참외', '복숭아'], '반찬': ['김치', '간장']}
Elapsed time: 0.000000
일정은 다음과 같음. 사정에 따람 변경될 수 있음
  - args ('바람쐬기', '산책', '낮잠', '산에오르기', '청소', '모임')
  - kw {'잠': '10:30', '비공식일정': ['비자금숨기기', '영화보기'], '저녁': '5:30
', '점심': '12:00'}
Elapsed time: 0.000000

다음은 partial  를 사용한 예제

import functools

오진수=functools.partial( int , base=5 )
print( 오진수('123') )
print( 오진수('4') )
print( 오진수('100') )
print( 오진수('10') )

삼진수=functools.partial( int , base=5 )
print( 삼진수('120') )
print( 삼진수('11') )
print( 삼진수('100') )
print( 삼진수('20') )

삼십육진수=functools.partial( int , base=36 )
print( 삼십육진수('A') )
print( 삼십육진수('DEF') )
print( 삼십육진수('872G') )
print( 삼십육진수('A9') )

int ()  함수로 부터 특수화된 여러가지 함수를 만들어 냈다.

경우에 따라서 이런  함수장식 기능을  함수 실행시에만 사용하기를 원할 수도 있다.
다음은 데코레이션 문법을 사용하지 않고 위와 동일한 기능을 함수 실행시에만 적용한 예이다.

import time
from functools import wraps

def ff( *a , **k ):
    def dcofunc(functor):
       
        @wraps(functor)
        def function(*args, **xargs):
                start = time.time()
                args = args  + a
               
                xargs.update(k)
                functor( *args, **xargs )
               
                end = time.time()
                print( "Elapsed time: %5f" % (end-start))
        return function
    return dcofunc
   

def 먹은것을말해봐( *args , **kw ):
    print ( "먹은것은 다음과 같음" )
    print ( "  - args" , args )
    print ( "  - kw" , kw )

def 오늘의일정( *args , **kw ):
    print ( "일정은 다음과 같음. 사정에 따람 변경될 수 있음" )
    print ( "  - args" , args )
    print ( "  - kw" , kw )
   
   
X=ff( '밥' , '물' , '우유' ,  반찬=[ '김치' ,'간장'] )
X(먹은것을말해봐)( '빵' , '오이' , '국수' , 과일=[ '참외' , '복숭아' ] , 반찬=['국'] )

ff( '밥' , '물' , '우유' ,  반찬=[ '김치' ,'간장'] )(오늘의일정)( '바람쐬기' , '산책' , '낮잠' , 비공식일정=['비자금숨기기','영화보기'] )








== 참고자료 ==

http://deisys.upnl.org/wiki/doku.php?id=python:decorator#python
신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.08.08 01:16
파이썬 전체 FAQ
http://coffeenix.net/doc/language/pyfaq/index.htm


파이선은 무엇을 하는 프로그램인가요?
http://ask.nate.com/qna/view.html?n=9022801

혀나미 노트

( Pytho / 프로토타이핑

PyInline, Pyrex / C언어를 포함 할 수 있는 도구
Psyco / 코드의 실행 속도를 증가하기 위한 도구   )
http://linuxne.springnote.com/pages/413509



Dive Into Python (다이빙 파이썬) 


PYPI ::: PYTHON 패키지 검색 , 설치

Python recipes


http://www.activestate.com/ASPN/Python/Cookbook/

(the eff-bot guide to) The Standard Python Library
http://effbot.org/librarybook/

Sphinx 문서제작
http://sphinx.pocoo.org/

pyGTK
http://www.pygtk.org/applications.html

파이썬 디버깅
http://coreapython.hosting.paran.com/etc/Debugging%20in%20Python.htm
http://onlamp.com/pub/a/python/2005/09/01/debugger.html
http://www.python.org/doc/2.4.1/lib/debugger-commands.html


Psyco로 파이썬을 C 만큼 빠르게!
http://www.ibm.com/developerworks/kr/library/l-psyco.html

pyrex
http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/About.html

SWIG and Python
http://www.swig.org/Doc1.3/Python.html#Python_nn4

pysvn
http://theeye.pe.kr/tag/pysvn


파이썬 디자인 패턴
http://coreapython.hosting.paran.com/tiphack/Patterns%20in%20Python.htm#a-word-of-warning
신고
Posted by 콩이랑 팥이랑 심자꾸나
플밍/python2009.07.29 10:09
파이선 3.x 에서는 기본적으로 유니코드를 지원하기 때문에 자유롭게 한글을 사용할수 있다.

단 import 라이브러리 명으로는 한글을 사용할수 없다.  따라서 라이브러리의 디렉토리명과 파일명에 한글을 사용할수 없다.

이런 경우 jihwa 표기법으로 라이브러리명에  영문명과 한글명을 병기 표기하고 한글로 임포트하는 함수를 만들어 사용할 수 있다.


2009-07-29  오전 12:01    <DIR>          .
2009-07-29  오전 12:01    <DIR>          ..
2009-07-28  오후 10:44    <DIR>          A
2009-07-28  오후 09:23    <DIR>          A=%일반#
2009-07-28  오후 10:11    <DIR>          Ae23
2009-07-28  오후 10:05    <DIR>          Ae23=%일반123#
2009-07-28  오후 09:02               470 implib.py
2009-07-28  오후 11:41             1,431 include.py
2009-07-28  오후 11:41             1,620 include.pyc
2009-07-28  오후 10:47             1,320 include_.py
2009-07-28  오후 08:13                19 z3a2.py
2009-07-28  오후 08:13                19 z3a2.py=%Z3A2엔코딩#
2009-07-29  오전 12:01               131 z3a2.pyc
2009-07-28  오후 11:18                 0 __init__.py
2009-07-29  오전 12:01               106 __init__.pyc
2009-07-28  오후 08:13                19 제이.py
              10개 파일               5,135 바이트
               6개 디렉터리  30,570,455,040 바이트 남음

C:\_ik\pyHanQuery\lib>

lib>
│  implib.py
│  include.py
│  include.pyc
│  include_.py
│  z3a2.py
│  z3a2.py=%Z3A2엔코딩#
│  z3a2.pyc
│  __init__.py
│  __init__.pyc
│  제이.py

├─A
│  │  __init__.py
│  │  __init__.pyc
│  │
│  ├─B
│  │      q.py
│  │      q.py=%라인
│  │      q.pyc
│  │      z3a2.py
│  │      z3a2.py=%Z3A2엔코딩#
│  │      z3a2.pyc
│  │      __init__.py
│  │      __init__.pyc
│  │
│  └─B=%버튼
├─A=%일반#
├─Ae23
└─Ae23=%일반123#



C:\_ik\pyHanQuery\lib>
그리고 다음 라이브러리 소스를 임포트 한 후 include() 함수로 한글명으로 임포트 할수 있다.


import  os , glob , re , sys
'''

'''
#os.path.exists
#os.path.isfile

# 경로를 lib 목록에 추가하기 위한 함수
def add_syspath( new_lib_path ):
    if not os.path.exists( new_lib_path ) : return

    if any( \
        map( lambda x: os.path.relpath( new_lib_path , x ) == '.' ,\
            sys.path ) \
            ): pass
           
    else : sys.path.append( new_lib_path )
    return  True

# jihwa 파일 또는 디렉토리의 실제경로를 구함
def get_pathname( real_path , jdir_name ):
    dir = glob.glob( real_path + "/" + jdir_name + ".py")
    if dir :
        return os.path.basename(dir[0])
    else :
        dir = glob.glob( real_path + "/*=%" + jdir_name + "*" )
        len_real_path = len(real_path) + 1
        if dir :
            for d in dir :
                ndir = d[len_real_path:]
                R = re.search( "^([^=]+)=%" + jdir_name + "($|\.|\#)", ndir )
                if( R ) : return R.group(1)
        else :
            print ( '{0:}에서 {1:}을 찾을 수 없음'.format( real_path , jdir_name ) )

 

#globals 는 호출하는 쪽에서 globals() 로 설정 
def include( globals , *jdirs , modules=[ '*' ] , path='.' ):

    if os.path.exists( path ) :
        path=os.path.realpath( path )
    else  : return
   
    rpath=path
    add_syspath( rpath )
   
    # sys.path 에 추가
   
    for jdir in jdirs :
        #print( jdir )
        r = get_pathname( rpath , jdir )
        if r : rpath += "/" + r
        else : break

    files=[]
    for pyf in modules  :
        #print( pyf )
        p = get_pathname( rpath , pyf )
        if p:
            ep = p.rfind('.')
            if( ep > 0 ) : p = p[:ep]
            files.append( p )  #'.py'를 제거

        '''
        '''
    print( files )
    print( modules )
    zip_f_m = zip( files , modules )
    file_as_mod = [ '{0:} as {1:}'.format(x,y)  for x , y in zip_f_m ]
   
   
    R = re.search( '^\.?/?(.*)', rpath[len(path):] )

    R_str = ""
    if( R.group(1) ) : R_str = "from " + R.group(1).replace('/' , '.') + " "
   
   
    exec_str = R_str + "import " + " , ".join( file_as_mod )
    print( exec_str )
    exec( exec_str , globals )
   
    return True
   
def _file_src( filename ) :
    return str( open( filename , 'rb').read() , 'utf-8' ).replace('\r\n', '\n')

def execfile(filename , globals=None , locals=None ):
    exec( _file_src( filename ) , globals , locals  )

def compilefile( filename ):
    return compile( _file_src( filename ) , filename , 'exec' )
   
if __name__=='__main__' :

    os.chdir( os.path.dirname( __file__ ) )

    include( globals() , '일반' , '버튼' , modules=[ 'z3a2.py' , '라인' , 'Z3A2엔코딩' , 'Z3A2엔코딩'  ] )
   
    A = compilefile( 'A/B/q.py' )
    exec(A)

    execfile( 'A/B/q.py' )

 





위 소스에서 include( '일반' , '버튼' , pyfiles=[ 'z3a2.py' , '라인' , 'Z3A2엔코딩' , 'Z3A2엔코딩'  ] )
은  A/B/z3a2.py , A/B/q.py 파일을 임포트 하게 된다.

또한 소스 파일을 임포트 하지 않고 그대로 읽어서 실행하려면 다음과 같이 compile 함수나 exec 함수를 사용할 수 있다.

 
이제 다음과 같이 실행 메인소스에서 임포트하여 사용하면 된다. 

import sys
sys.path.append( 'C:\\_ik\\pyHanQuery\\lib' )

import inc

inc.include( globals()
    , modules=[ '지화' ]
    , path='C:\\_ik\\pyHanQuery\\lib' )


지화.func_1(  )
...




 

def execfile(filename , a  ):
    exec( str( open(filename , 'rb').read() , 'utf-8' ) , a )
   
execfile('함수.py' , globals() )

A = compile( str( open('함수.py', 'rb').read() , 'utf-8' ) , '함수.py' , 'exec' )
exec(A)

윈도우의 경우 '\r\n' 을  '\n' 으로 치환할 필요가 있다.
다음과 같이 함수를 만들어 사용한다.
def _file_src( filename ) :
    return str( open( filename , 'rb').read() , 'utf-8' ).replace('\r\n', '\n')

def execfile(filename , globals=None , locals=None ):
    exec( _file_src( filename ) , globals , locals  )

def compilefile( filename ):
    return compile( _file_src( filename ) , filename , 'exec' )




신고
Posted by 콩이랑 팥이랑 심자꾸나
분류없음2009.07.11 11:06
SQLITE3 에서는 기본적으로 utf-8을 지원하기 때문에 한글을 쓸경우 utf-8 로 변환후 입력하는 것이 좋다.

echo insert into a values( '우리' , '나라2' ); | iconv -f euckr -t utf-8 | sqlite3 test

sqlite3  test .dump | iconv -f utf-8 -t euckr

C:\APM_Setup\htdocs\sqlite>echo insert into a values( '우리' , '나라2' ); | iconv -f euckr -t utf-8 | sqlite3 test

C:\APM_Setup\htdocs\sqlite>sqlite3  test .dump | iconv -f utf-8 -t euckr
BEGIN TRANSACTION;
CREATE TABLE a ( k char(45) , v varchar(255) );
INSERT INTO "a" VALUES('key','value');
INSERT INTO "a" VALUES('123','tkasdasdasd');
INSERT INTO "a" VALUES('123','한글 이 있다');
INSERT INTO "a" VALUES('x','vv');
INSERT INTO "a" VALUES('우리','나라');
INSERT INTO "a" VALUES('우리','나라2');
COMMIT;

C:\APM_Setup\htdocs\sqlite>


간단한 배치파일을 만들어 활용할 수 있다.

eu.bat
@iconv -f euckr -t utf-8

ue.bat
@iconv -f utf-8 -t euckr

echo insert into a values( '우리' , '나라2' ); | eu.bat | sqlite3 test
sqlite3  test .dump | ue.bat



== 참고자료 ==

도움말
http://www.sqlite.org/lang.html

php_sqlite3.dll 다운로드
http://perisama.net/downloads/PHP/MSVC6/PHP-5.3-cvs/Release_TS/ext/

http://www.phpbb.com/community/viewtopic.php?f=70&t=1059695


GUI 툴
http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index

사용자 정의함수
http://jeminency.tistory.com/tag/SQLite%20function
신고
Posted by 콩이랑 팥이랑 심자꾸나
데이타베이스/MySQL2009.07.10 20:09
MYSQL 에는 다양한 형태의 입력문장이 있다.
크게 나눈다면 다음과 같이 세가지 형태를 볼수 있는데

insert into 
replace into  
insert into .. on duplicate key update


위 입력문의 차이는 테이블의 키와 중복되는 지의 여부에 따라 다르게 반응하게 된다는 것이다.

insert into
는 키와 충돌할 경우 에러를 발생시킨다. 이런 문제를 회피하는 것으로 insert ignore into 문장을 사용할 수 있으나 이 경우 입력을 취소하게 되므로 다시 입력을 필요로 하게 된다.   방법은 replace into 로 해당 중복되는 행을 완전히 새로운 입력문으로 변경할 수 있다. 즉 중복키에 대해서 기존것을 지우고 입력하는 것이된다. 이것이 편리하기는 하지만 많약 참조키로 외부에서 참조하고 있다면 지워지지 않기 때문에 이것 또한 에러를 발생시킨다. 이런 경우에  insert into .. on duplicate key update 를 사용하면 아무문제 없이 해결할수 있다.

insert into .. on duplicate key update  는 여러면에서 가장 최상의 입력문이라 할 수 있다.
신고
Posted by 콩이랑 팥이랑 심자꾸나
데이타베이스/MySQL2009.07.04 22:19
두 대의 MYSQL 서버 동기화 하기
 * 먼저 두 대의 서버를 같은 호스트에 포트를 달리하여 설치하거나 서로 다른 호스트에 설치한다.
 * 테스트를 위해서 같은 호스트를 사용하였다.

 * master server 설정
[mysqld]
port=3306
log-bin=C:\\MYSQL\\log\\bin_logs
server-id=1
 * master 서버를 재가동한다.
 * master 에서 slave  유저 권한 설정
GRANT REPLICATION SLAVE ON *.* TO 'slv_user'@'%' IDENTIFIED BY 'slv_user';
GRANT REPLICATION SLAVE ON *.* TO 'slv_user'@'localhost' IDENTIFIED BY 'slv_user';
flush  privileges ;
 
 * slave server 설정
[mysqld]

# 동기화 옵션 -- >>>>
replicate-ignore-table=test.my
replicate-ignore-table=test.x2
replicate-wild-ignore-table=smasta_crm.%event%

slave-skip-errors=all
# 동기화 옵션 -- <<<<

port=3400
server-id=2
log-bin=E:\\MYSQL5\\log\\bin_logs

 * slave 서버를 가동한다.
 * master 서버의 원하는 데이타를 덤프하여 로드한다.

mysqldump --database  userdb1 --database  userdb2  --master-data | mysql  -u -p -P3400

 * slave server 에서 master change to  쿼리문을 실행하여  slave 를 가동한다.
slave stop ;
CHANGE MASTER TO
    MASTER_HOST='localhost',
    MASTER_USER='slv_user',
    MASTER_PASSWORD='slv_user',
    MASTER_LOG_POS=6075,
    MASTER_LOG_FILE='bin_logs.000001' ;
slave start ;

 * 제대로 되었는지 확인하려면 다음 두 명령을 master 와 slave에서 실행해본다.

show master status ;
show slave status ;


mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: localhost
                  Master_User: slv_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin_logs.000001
          Read_Master_Log_Pos: 1340
               Relay_Log_File: ITFOS-N-relay-bin.000004
                Relay_Log_Pos: 478
        Relay_Master_Log_File: bin_logs.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table: test.x2,test.my
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table: smasta_crm.%event%
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1340
              Relay_Log_Space: 892
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
1 row in set (0.00 sec)

mysql> show master status ;
+-----------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| bin_logs.000001 |      331 |              |                  |
+-----------------+----------+--------------+------------------+
1 row in set (0.00 sec)

 


듀얼 마스터 설정하기
 * 듀얼마스터로 설정하는 경우는 모두에 my.ini 에 설정을 한다.
 * server 1 설정
[mysqld]

# 동기화 옵션 -- >>>>
replicate-ignore-table=test.my
replicate-ignore-table=test.x2
replicate-wild-ignore-table=smasta_crm.%event%

slave-skip-errors=all
# 동기화 옵션 -- <<<<

port=3306
log-bin=C:\\MYSQL\\log\\bin_logs
server-id=1
 * server 2 설정
[mysqld]

# 동기화 옵션 -- >>>>
replicate-ignore-table=test.my
replicate-ignore-table=test.x2
replicate-wild-ignore-table=smasta_crm.%event%

slave-skip-errors=all
# 동기화 옵션 -- <<<<

port=3400
server-id=2
log-bin=E:\\MYSQL5\\log\\bin_logs

 * 두 대의 서버 모두에 GRANT REPLICATION SLAVE ON 설정을 한다.
 * 두 대의 서버 모두에 master change to  쿼리문을 실행하여  slave 를 가동한다.



복구
 * 듀얼마스터로 설정되어 있는 경우는 두 개의 리플리케이션을 끊어야 하기에
먼저  양쪽의 서버에서 reset master  를 실행하고 다음에  slave stop , reset slave 를 실행한다. 
 * 이상이 있는 쪽 서버의 데이타를 지우고 덤프한 자료를 로드시킨다.
 * 원래대로 마스터와 슬래브 설정을 하고 재가동한다.
 * change master to 설정에서 MASTER_LOG_POS 를 확인하여 설정한 후 slave start ..


에러상황 건너가기
 * 만약 어떤 쿼리의 에러상황 때문에 동기화가 중지되었다면 slave에서 다음과 같이 입력하여 해당 문제쿼리를 넘어가도록 한다 
slave stop ;
set global sql_slave_skip_counter=1;
slave start ;


==  참고 자료 ==

http://wiki.kldp.org/wiki.php/MySQL%B8%AE%C7%C3%B8%AE%C4%C9%C0%CC%BC%C7
http://radiocom.kunsan.ac.kr/lecture/mysql/replication_my_cnf_option.html
http://blog.wowpc.net/285

http://ryujeen.tistory.com/entry/MySQL-Replication-%EC%9E%A5%EC%95%A0-%EB%B0%9C%EC%83%9D-%EB%B0%8F-%EB%B3%B5%EA%B5%AC-%EB%B0%A9%EB%B2%95

TIP :  파이프를 이용한 데이타베이스 복사
mysqldump  -uroot -p12345  test2 | mysql -uroot -p12345 -P3370 test2


http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=51ha&m_no=23043&cat1=1286&cat2=1300&cat3=1353&lang=k

MYSQL replication 테이블 제외
http://vndfbfkd.tistory.com/575




신고
Posted by 콩이랑 팥이랑 심자꾸나

티스토리 툴바