Cpp
2007.08.20 11:38

C / 부호 있어? 부호 없어?

조회 수 27769 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

변수의 선언이 signed 인가? unsigned 인가가 중요함.
unsigned 선언했다면, 자료형의 크기가 같다는 조건하에서 signed와 unsigned의 비교에서는 unsigned로 변환된 후 비교가 되는것 같다.
상식적으로 생각해봤을 때는
a-b는 -1이다. -1 % 5한 값은 0으로 나누어 떨어지지 않기 때문에 답은 200으로
생각하기 쉽다.

허나 변수의 선언이 unsigned 정수형이기 때문에 a-b 역시 unsigned 정수다.
-1의 unsigned int 값은 4294967295 이다.  이는 5로 나누어 떨어지므로 답은 100이 출력된다.

int main()
{
    unsigned int a, b, c, d;
    a = 1;
    b = 2;
    c = 5;

    if( ((a-b)%c) == 0 ) d=100;
    else d=200;
    printf("%d\n", d);
}


 

TAG •

Cpp
2007.08.21 18:01

C / 수행결과는?

조회 수 27496 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
#include <stdio.h> 
int main(void){   unsigned char a = 0xf2;
   if(a & 0xf0 == 0xf0) {
      printf("aaaaaaaa\n");
   }
   else {
      printf("bbbbbbbb\n");
   }
   return 0;
}



중괄호()의 중요성을 깨닫게 해주는 코드임.

결과는 else 절이 수행됨.
== 연산자가 & 연산자보다 한 단계 높음.ㅋㅋ

연산자 우선순위

1 = ::
2 = .->  ,   ( )    ,    ++  --
3 = ++ --   ,      ^ !      ,      - +       ,    & *      ,      ()
4 = .*->*
5 = * / %
6 = + -
7 = << >>
8 = < <= > >=
9 = ==  , !=
10 = &
11 = ^
12 = |
13 = &&
14 = ||
15 = ?:
16 =   =  ,*=  . /=  , %=  , +=  ,  -=  ,  <<=  ,  >>=  ,  &=  ,  |=  ,  ^=
17 = throw
18 =   ,   .

TAG •

Python
2007.10.17 19:23

Using the Python Interpreter

조회 수 69715 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

Python 튜토리얼에 나오는 'Python 인터프리터 사용하기' 임.

리눅스나 유닉스 운영체제에서 수행하는 방법에 대해 설명함.
먼저, 아래와 같이 셸 프롬프트에서 python이 설치되어 있는지 확인함.

[wittgens@wfedora python]$ whereis python
python: /usr/bin/python2.4 /usr/bin/python /usr/lib/python2.4 /usr/include/python2.4
 /usr/share/man/man1/python.1.gz
[wittgens@wfedora python]$


1. Python 인터프리터 호출하기

셸(Shell) 프롬프트에서 python이라고 입력하면, 마치 또 다른 셸을 실행한 것 처럼 >>> 프롬프트가 나타남.
아래는 python 인터프리터가 실행된 모습임.

[wittgens@wfedora python]$ python
Python 2.4.3 (#1, Oct  1 2006, 18:00:19)
[GCC 4.1.1 20060928 (Red Hat 4.1.1-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>


위에서 보면 알 수 있듯이, Python의 버전과 빌드된 환경정보가 간단하게 출력된 것을 알 수 있음.

Python 인터프리터를 호출하는 또다른 방법은 셸(Shell) 프롬프트에서 바로 수행하는 방법도 있음.
"python -c command [arg] ..."

[wittgens@wfedora python]$ python -c 'print "hello world"'
hello world



파이썬 모듈이 스크립트로 유용할 때가 있는데, "python -m module [arg] ..." 을 사용하여 호출할 수 있다.

Note)
"python file" 과 "python <file"은 차이가 있는데,
python file은 file에 작성된 python 코드를 수행함을 나타내고,
python <file은 file을 표준 입력으로 python을 수행함.


1) 인자 전달(Argument Passing)
Python 인터프리터로 인자가 전달되는 데, sys.argv 라는 문자열의 리스트(list)로 저장됨.
아래와 같은 hello.py 라는 파일이 작성되어 있다면,

[wittgens@wfedora python]$ cat hello.py
#! /usr/bin/env python
import sys
print 'hello world,', sys.argv


python hello.py arg1 arg2 arg3 라고 입력하면 아래와 같은 결과를 확인할 수 있다.

[wittgens@wfedora python]$ python hello.py arg1 arg2 arg3
hello world, ['hello.py', 'arg1', 'arg2', 'arg3']


자료형(Data Type)중의 하나인 리스트(list)에 대해서는 나중에 알아보겠다.


2) 대화식 모드(Interactive Mode)
셸(Shell) 프롬프트에서 python 라고 입력하면, 다음부터 대화식 모드임.

[wittgens@wfedora python]$ python
Python 2.4.3 (#1, Oct  1 2006, 18:00:19)
[GCC 4.1.1 20060928 (Red Hat 4.1.1-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "hello"
hello
>>> var1 = 1234
>>> var2 = 2
>>> print var1*var2
2468



2. 인터프리터와 그의 환경 (The Interpreter and Its Environment)

1) 오류 처리(Error Handling)
인터프리터를 실행한 상태에서 인터프리터가 알 수 없거나 잘못된 키워드 등을 입력했을 때
오류메시지를 확인할 수 있다.
나중에 오류를 처리하는 방법에 대해서 알아 보겠다.

2) 실행가능한 파이썬 스크립트 (Executable Python Scripts)
실행 가능한 스크립트를 작성하려면  파일의 시작 부분에

#! /usr/bin/env python

이라는 주석이 들어가 있어야 하고
해당 파일의 권한이 실행가능하면 됨.

[wittgens@wfedora python]$ cat hello.py
#! /usr/bin/env python
import sys
print 'hello world,', sys.argv
[wittgens@wfedora python]$ chmod u+x hello.py
[wittgens@wfedora python]$ ./hello.py
hello world, ['./hello.py']
[wittgens@wfedora python]$ ./hello.py a1 a2 a3
hello world, ['./hello.py', 'a1', 'a2', 'a3']
[wittgens@wfedora python]$

3) 소스 코드 인코딩 (Source Code Encoding)
소스 파일이 ascii가 아닌 다른 인코딩을 사용한다면
#! 으로 시작하는 코드 아래에
# -*- coding: encoding -*-
 를 입력해주면 된다.


4) 대화식 시작 파일 (The Interactive Startup File)
Python 인터프리터가 실행될 때마다 특정 명령들을 수행하고 싶을 때
PYTHONSTARTUP 이라는 환경변수에 실행하고 싶을 Python 파일명을 등록해 놓으면 된다.

[wittgens@fedora python]$ export PYTHONSTARTUP=.pyrc.py
[wittgens@fedora python]$ cat .pyrc.py                           <-- .pyrc.py 파일안에 아래 내용으로 생성되어 있다고 가정함.
print '--> STARTUP: hello my friend.'
[wittgens@fedora python]$ python
Python 2.5 (r25:51908, Nov  6 2007, 16:54:01)
[GCC 4.1.2 20070925 (Red Hat 4.1.2-27)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
--> STARTUP: hello my friend.
>>>
TAG •

Python
2007.10.25 11:12

An Informal Introduction to Python

조회 수 43690 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

한 줄 주석은 '#' 으로 시작합니다.
파이썬 인터프리터를 실행하면 >>> 프롬프트가 나오는 데 여기서는 생략하겠습니다.

Example)

# 이건 주석입니다.
A=1 #이것도 주석입니다.
print A
1


1. Using Python as a Calculater (계산기로 파이썬 사용하기)

1) Number

>>> 2+2
4
>>> # 정수 나누기
... 7/3
2
>>> 3*3.75/1.5 # 소수형과 정수형의 혼합 표현에서는 정수형이 소수형으로 변환되어 계산됨
7.5
>>> 1j*1J # 복소수 표현 (complex number expression)
(-1+0j)



2) Strings
문자열 표현에는 따옴표(')나 쌍따옴표(")를 사용하여 표현합니다.
문자열안에 따옴표나 쌍따옴표를 사용해야 할 때는 \ (back slash)를 사용하면 가능합니다.

>>> "it's a string"
"it's a string"
>>> 'it\'s a string'
"it's a string"



문자열이 여러 줄(Line)일 경우 triple-quetes 로 표현합니다.. """ or '''

print """
hello,
my name is
Jeong-soo, Kim
"""

hello,
my name is
Jeong-soo, Kim


문자열을 + 연산자로 연산하면 결과는 두 문자열이 합쳐집니다.
문자열은 [ ] 연산자를 사용하여 해당 순서에 있는 문자를 참조할 수 있습니다.
첨자에 음수가 들어갈 수 있는데, 이때는 문자열 끝부터 참조가 됩니다.
+---+---+---+---+---+
| H | e | l | p | A |
+---+---+---+---+---+
0   1   2   3   4   5
-5  -4  -3  -2  -1


첨자에 : (콜론)이 들어갈 수 있는데, 콜론은 범위 지정시 사용됩니다.
문자열의 길이를 알고 싶을 때는 내장 함수인 len() 을 사용합니다.

 >>> word = "0123456789"
>>> word[0]
'0'
>>> word[2]
'2'
>>> word[0:2]
'01'
>>> word[:4]
'0123'
>>> word[-2]
'8'
>>> word[:-1]
'012345678'


문자열을 유니코드로 표현하고 싶을 때는 문자열 앞에 u를 사용합니다.
u"abc"

3) Lists
파이썬에서는 합성 데이터 타입을 지원하는데, 그 중 하나가 리스트(list)입니다.
리스트는 항목들이 comma(,)로 분리된 자료구조 입니다.
리스트도 첨자 연산([ ])이 가능합니다.
리스트의 원소의 개수를 알고 싶을 때는 len() 함수를 사용합니다.
문자열(strings)은 한번 지정된 원소는 변경할 수 없으나, 리스트는 가능합니다.


리스트에 대한 세부 설명은 나중으로 미뤄야 할 것 같네요..
일해야 하네요.ㅋㅋ

TAG •

Python
2007.11.07 01:38

More Control Flow Tools

조회 수 70899 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
if Statements
조건식 다음에는 반드시 콜론(:)을 명시해 줘야함.
elif 문은 여러번 사용해도됨. statements에는 문장들이 올 수 있음.
if 조건식:
    statements
elif 조건식:
    statements

...
else:
    statements

for Statements
a = ['cat', 'window', 'defenestrate']
for x in a:
    print x, len(x)

cat 3
window 6
defenestrate 12



The range() Function
range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(5, 10)
[5, 6, 7, 8, 9]
range(0, 10, 3)
[0, 3, 6, 9]


break and continue Statements, and  else Clauses on Loops
break 문은 루프를 단계 빠져나오는 사용됨.
continue
루프를 다음으로 넘기는 역할을 .
루프 문은 else 절을 가질 수도 있는데, 이것은 루프문이 수행되고 한번 수행됨.
break
루프문을 탈출했을 때는 수행되지 않는다.
 for n in range(2, 10):
   for x in range(2, n):
      if n % x == 0:
         print n, 'equals', x, '*', n / x
        
break
   else:
      # loop fell through without finding a factor
      print n, 'is a prime number'

2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3


pass Statements
pass문은 아무것도 하지 않음. 키보드 인터럽트 (Keyboard Interrupt) 발생되면 종료됨.
While True:
   pass



Defining Functions
키워드 def 시작으로 함수를 정의한다.
def fib(n):
   a, b = 0, 1
   while b < n:
      print b,
      a, b = b, a+b

fib(2000)



More on Defining Functions
인자를 여러개 같는 함수도 정의할 있다.

Keyword Arguments
인자를 정의할 때 대입 연산자를 사용하면 인자를 전달하지 않더라도 기본 값으로 함수내에서 받아들임.
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
   while True:
      ok = raw_input(prompt)
      if ok
in ('y', 'ye', 'yes'): return True
      if ok
in ('n', 'no', 'nop', 'nope'): return False
      if retries < 0: raise IOError, 'refusenik user'
      print complaint


주의) 기본 인자 값은 최초 한번만 수행된다.

def f(a, L=[]):
   L.append(a)
   return L

print f(1) # 최초 한번만 L=[] 수행됨.
[1]
print f(2)
[1, 2]
print f(3)
[1, 2, 3]

Keyword Arguments
함수를 호출할 keyword 사용할 있는데 형태는 "keyword = value" .
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
   print "-- This parrot wouldn't", action,
   print "if you put", voltage, 'volts through it."
   print "-- Lovely plumage, the", type
   print "-- It's", state, "!"
위와 같이 정의되었다면 아래와 같이 호출할 있다.
parrot(1000)
parrot(action = "VOOOOM", voltage = 10000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', bereft of life', 'jump')

함수 인자로 **name 같은 형태로 주어졌을 , 정해진 인자를 제외하고 모든 키워드 인자들을 가지는 dictionary 받는다.
정해진 인자들은 *name 같은 형태로 받을 있다. (*name **name 전에 정의해야된다.) *name에는 정해진 인자가 tuple 받아진다.
def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, '?'
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments: print arg
    print '-'*40
    keys = keywords.keys()
    keys.sort()
    for kw in keys: print kw, ':', keywords[kw]

cheeseshop('Limburger', "It's very runny, sir.", "It's really very, VERY runny, sir.", client='John Cleese', shopkeeper='Michael Palin', sketch='Cheese Shop Sketch')

위와 같이 호출했다면,
결과는 아래와 같다.
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch


Arbitrary Argument Lists
함수는 인자의 임의의 개수로 호출할 수 있다. 이런 인자들은 튜플(tuple)로 감싸진다.
예를들면, 아래와 같이 선언할 수 있다.
def printf(format, *args)
   print (format % args)

호출은 다음과 같이 할 수 있다.
printf("name: %s, age: %d", "Mr. Kim", 20)
name: Mr. Kim, age: 20

Unpacking Argument Lists
역 상황을 생각해보자. 인자들이 리스트나 튜플에 이미 있을 때 함수 호출에 사용할 경우가 있다.
range(3, 6) # 일반적인 분리된 인자들로 호출하기
[3, 4, 5]
args = [3, 6]
range(*args) # 하나의 리스트로부터 unpack 되어진 인자들로 호출하기
[3, 4, 5]


같은 경향으로 directory도 ** 연산자를 사용한 키워드(keyword) 인자들로  전달되어질 수 있다.
def func1(var1, kvar1='hello', kvar2=200):
   print var1, kvar1, kvar2

dicArgs = {"var1": "How", "kvar1": "old", "kvar2": "you?"}

func1(**dicArgs)
How old you?


Lambda Forms
lambda 키워드를 사용하면, 작은 익명의 함수가 생성된다. 짧은 문장으로 제한됨.
lambda 형태는 함수 객체가 필요할 때 사용할 수도 있다. 
def make_incrementor(n):
   return lambda x: x+n

f = make_incrementor(42)

f(0)
42
f(1)
43 


Documentation Strings
함수에 대한 요약이나 설명을 정의할 필요가 있을 때 함수 구현 시작 줄에 """ 를 사용한다.
아래 예를 보면 쉽게 이해가 될 것이다.
def my_function():
   """ @name: my_function
   @description: Do nothing, but document it.
   """
   pass

print my_function.__doc__
 @name: my_function
   @description: Do nothing, but document it.


나름 실행해보면서 하니 시간이 많이 걸리는군.. emoticon
TAG •

Python
2007.11.09 04:21

Data Structures

조회 수 72664 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

More On List

리스트(list) 데이터 타입은 여러 메소드들을 가짐.

 

append(X)

리스트의 마지막에 X를 추가 ( a[len(a):] = [x] )

 

extend(L)

리스트의 확장 개념으로 리스트 L를 현재 리스트에 포함시킴. (a[len(a):] = L)

 

insert(i, X)

주어진 위치 i에 새로운 원소 X를 삽입함.

 

remove(X)

리스트 중에 X로 시작하는 첫번째 원소를 삭제함. 원소 X를 찾지 못하면 Error를 일으킴.

 

pop(i)

주어진 위치 i의 원소를 지우고, 해당 원소를 반환함. 인자가 주어지지 않으면 마지막 원소를 꺼냄.

 

index(X)

원소 X의 최초 시작 인덱스를 반환함, 원소 X가 없다면 Error를 일으킴.

 

count(X)

원소 X가 리스트내에 몇번 나타나는 지를 반환함.

 

sort()

해당 리스트를 오름차순으로 정렬함.

 

reverse()

리스트안의 원소들의 순서를 뒤집는다.

 

 

Using Lists as Stacks

리스트를 스택으로 사용하기. pop()메소드를 인자없이 사용하면 마지막 원소를 꺼내므로 stack list로 구현가능함.

stack = [3, 4, 5]
stack.append(6)
stack.append(7)
stack
[3, 4, 5, 6, 7,]
stack.pop()
7
stack
[3, 4, 5, 6] 

 


Using List as Queues

리스트를 큐로 사용할 수도 있는데 pop()메소드의 인자에 0을 넘겨 처음 원소를 꺼내면 queue list로 구현가능함.

queue = ["Kim", "Jeong", "Zang"]
queue.append("Shin")
queue.pop(0)

'Kim'


Functional Programming Tools

list를 사용할 때 아주 유용한 3개의 내장 함수(built-in function)가 있다. filter(), map(), reduce()

 

“filter(function, sequence)”

function(item)의 결과가 truesequence를 반환함.

>>> def f(x): return x % 2 != 0 and x % 3 != 0

...

>>> filter(f, range(2, 25))

[5, 7, 11, 13, 17, 19, 23]

>>> 

 

 

“map(function, sequence)”

function(item)의 반환값으로 하는 sequence를 반환함.

>>> def cube(x): return x*x*x

...

>>> map(cube, range(1, 11))

[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

 

“reduce(function, sequence)”

function의 호출함으로써 하나의 값을 반환함. sequence의 최초 두 개의 값을 function에 적용하고 그 다음 두 값을 function에 적용하여 sequence가 끝날 때까지 계속하여 그 결과를 반환함.

>>> def add(x, y): return x+y

...

>>> reduce(add, range(1, 11))

55

 

List Comprehensions

리스트 생성하는 방법은 여러 가지가 있으며, 리스트 표현안에 for, if 절이 올 수도 있다..

예제를 보면서 이해하자.

 

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']

>>> [weapon.strip() for weapon in freshfruit]

['banana', 'loganberry', 'passion fruit']

>>> vec = [2, 4, 6]

>>> [3*x for x in vec]

[6, 12, 18]

>>> [3*x for x in vec if x > 3]

[12, 18]

>>> [3*x for x in vec if x < 2]

[]

>>> [[x,x**2] for x in vec]

[[2, 4], [4, 16], [6, 36]]

>>> [x, x**2 for x in vec]  # error - parens required for tuples

  File "<stdin>", line 1, in ?

    [x, x**2 for x in vec]

               ^

SyntaxError: invalid syntax

>>> [(x, x**2) for x in vec]

[(2, 4), (4, 16), (6, 36)]

>>> vec1 = [2, 4, 6]

>>> vec2 = [4, 3, -9]

>>> [x*y for x in vec1 for y in vec2]

[8, 6, -18, 16, 12, -36, 24, 18, -54]

>>> [x+y for x in vec1 for y in vec2]

[6, 5, -7, 8, 7, -5, 10, 9, -3]

>>> [vec1[i]*vec2[i] for i in range(len(vec1))]

[8, 12, -54]

 

>>> [str(round(355/113.0, i)) for i in range(1,6)]

['3.1', '3.14', '3.142', '3.1416', '3.14159']

 

The del Statement

리스트의 항목을 지우는데 두 가지 방법이 있는데, 하나는 pop함수를 사용하는 것이고 다른 하나는 del 문을 사용하는 것이다.

 

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]

>>> del a[0]

>>> a

[1, 66.25, 333, 333, 1234.5]

>>> del a[2:4]

>>> a

[1, 66.25, 1234.5]

>>> del a[:]

>>> a

[]

del a # a 참조자체도 완전히 지워버리는 역할을 하며, 여기부터는 a 참조시 에러 발생.

 

Tuples and Sequences

튜플은 ()를 사용함. 튜플은 한번 생성되면 변경할 수 없다.

튜블은 packing unpacking이 가능함.

 

t = 1, 2, 3 # <- packing

a, b, c = t # <- unpacking

 

Sets

파이썬에서는 데이터 타입으로 set을 지원함. set은 중복이 없는 정렬되지 않은 원소로 구성되어 있다.

예제를 보면서 이해하자.

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']

>>> fruit = set(basket)               # create a set without duplicates

>>> fruit

set(['orange', 'pear', 'apple', 'banana'])

>>> 'orange' in fruit                 # fast membership testing

True

>>> 'crabgrass' in fruit

False

 

>>> # Demonstrate set operations on unique letters from two words

...

>>> a = set('abracadabra')

>>> b = set('alacazam')

>>> a                                  # unique letters in a

set(['a', 'r', 'b', 'c', 'd'])

>>> a - b                              # letters in a but not in b

set(['r', 'd', 'b'])

>>> a | b                              # letters in either a or b

set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])

>>> a & b                              # letters in both a and b

set(['a', 'c'])

>>> a ^ b                              # letters in a or b but not both

set(['r', 'd', 'b', 'm', 'z', 'l'])

 


Dictionaries

파이썬에서는 dictionary라는 유용한 자료형을 지원한다. dictionary는 다른 언어에서는 "associative memories" 혹은 "associative arrays" 라고도 불린다. sequence와 달리 dictionary는 key에 의해 참조가 된다.
아래 예제를 보면서 dictionary 표현을 익히자.

tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127

tel
{'sape': 4139, 'jack': 4098, 'guido': 4127}

tel['jack']
4098

del tel['sape']
tel['irv'] = 4127

tel
{'jack': 4098, 'irv': 4127, 'guido': 4127}

tel.keys()
['jack', 'irv', 'guido']

tel.has_key('guido')
True

'guido' in tel
True


dict() 생성자는 튜플(tuple)로 저장된 key-value 쌍으로 된 리스트(list)로 부터 디렉토리를 생성한다.

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
>>> dict([(x, x**2) for x in (2, 4, 6)])     # use a list comprehension
{2: 4, 4: 16, 6: 36}


 

키들이 문자열일 경우 keyword argument를 이용하여 더 쉽게 디렉토리를 생성할 수 있다.

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}



Looping Techniques
루프를 돌 때 iteritems() 메소드를 사용하면 키와 값을 취할 수 있다.

>>> months = {1:'jan', 2:'feb', 3:'mar', 4:'apr', 5:'may', 6:'jun', 7:'jul', 8:'aug', 9:'sep', 10:'oct', 11:'nov', 12:'dec'}
>>> months
{1: 'jan', 2: 'feb', 3: 'mar', 4: 'apr', 5: 'may', 6: 'jun', 7: 'jul', 8: 'aug', 9: 'sep', 10: 'oct', 11: 'nov', 12: 'dec'}
>>> for k, v in months.iteritems():
...     print k, v
...
1 jan
2 feb
3 mar
4 apr
5 may
6 jun
7 jul
8 aug
9 sep
10 oct
11 nov
12 dec


하나의 sequence를 루프(loop) 돌 때, enumerate() 함수를 사용하면 위치 첨자(position index)와 그에 해당하는 값을 얻을 수 있다.

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print i, v
...
0 tic
1 tac
2 toe


두개 혹은 그 이상의 sequence를 동시에 반복하기 위해 zip()함수로 그 항목들을 pair로 만들 수 있다.

>>> question = [ 'name','quest', 'favorite color' ]
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> zip(question, answers)
[('name', 'lancelot'), ('quest', 'the holy grail'), ('favorite color', 'blue')]
>>> for q, a in zip(question, answers):
...     print 'What is your %s? It is %s.' % (q, a)
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.


하나의 sequence를 거꾸로 반복하기 위해서는 reversed() 함수를 사용하면 된다.

>>> range(1, 10, 2)
[1, 3, 5, 7, 9]
>>> reversed(range(1, 10, 2))
<listreverseiterator object at 0xb7ec62ec>
>>> for i in reversed(range(1, 10, 2)):
...     print i
...
9
7
5
3
1


하나의 sequence를 정렬된 순으로 반복하기 위해서는 sorted()함수를 사용한다.

>>> basket = ['apple','orange','pear','banana']
>>> sorted(basket)
['apple', 'banana', 'orange', 'pear']
>>> for f in sorted(set(basket)):
...     print f
...
apple
banana
orange
pear


 

More on Conditions

in, not in
is, is not : 두 객체가 같은가 확인하기위한 연산자
비교는 연결하여 사용할 수도 있다. 예로, a < b == c
비교는 boolean 연산자와도 연결된다. and, or
 

Comparing Sequences and Other Types

Sequence 객체들은 같은 sequence 타입을 가진 다른 객체들끼리도 비교가능하다.
이 때는 lexicographical  순으로 비교됨.


>>> (1, 2, 3)              < (1, 2, 4)
True
>>> (1, 2, 3)              < (1, 2, 4)
True
>>> [1, 2, 3]              < [1, 2, 4]
True
>>> 'ABC' < 'C' < 'Pascal' < 'Python'
True
>>> (1, 2, 3, 4)           < (1, 2, 4)
True
>>> (1, 2)                 < (1, 2, -1)
True
>>> (1, 2, 3)             == (1.0, 2.0, 3.0)
True
>>> (1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)
True


TAG •

Ruby
2007.11.12 20:04

Summary 그 첫 번째 ...

조회 수 21067 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

▣ 루비의 주석은 '#'으로 시작함.

 

▣ 루비는 순수 객체 지향 언어임.

 

▣ 모든 것이 객체로 조작됨.

"string1".length

7

"abc".index("c")

2

-100.abc 

100

 

▣ 객체 생성법

a. Song1 = Song.new("contructor")

b. 객체 참조명 = 클래스.new(인자)

 

▣ 함수 선언

def func(arg1)

statements ...

end

 

▣ 함수 호출 : 아래 두 개는 동일하게 수행됨.

a. func("abc")

b. func "abc"

 

▣ 문자열 안에 {#expression}

 

▣ 변수와 클래스 명명법

a. Local : 소문자로 시작하거나 _로 시작하는 문자

b. Global : $ 로 시작함

c. Instance : @ 로 시작함

d. Class 변수 : @@ 로 시작함

e. Class 이름 : 대문자로 시작함.

 

▣ 배열과 해쉬 (Array and Hash)

Array

Expression: array_name = [ element1, element2, … ]

1. [] <- empty array

2. Array.new <- empty array

ii.   Reference: array_name[0], array_name[1]

1. 참조시 해당 첨자에 원소가 없으면 nil

2. nil 은 조건식에 사용될 때는 false.

iii.   배열 쉽게 생성하는 방법 : %w{ } 를 사용함.

1. array1 = %w{ ant bee cat dog elk }

a. array1[0]    >> "ant"

b. array1[3]    >> "dog"

Hash

Expression

hash_name = {

   'cello' => 'string',

   'drum' => 'percussion'

}

i.   Refrence: hash_name['cello']

ii.   기본값을 정해 Hash 생성하기

1. histogram = Hash.new( 0 )

2. histogram['key1']    >> 0

3. histogram['key1'] = histogram['key1'] + 1

4. histogram['key1']   >> 1

 

Control Structures

if

if count > 0

puts "try again"

elsif tries > 3

puts "you lose"

else

puts "Enter a number"

end

elsif 는 여러 번 사용해도 됨

statements if

puts "Dangers, Mr. Kim" if radiation > 3000

문장들 뒤에 if를 사용하면 편리함 ^^

while

while weight < 10 and numPallets <= 30

pallet = nextPallet()

weight += pallet.weight

numPallets += 1
end


statements while

square = square * square while square < 1000

문장 뒤에 while도 사용할 수 있음

 

Regular Expression

a. Expressions)

i.   /Perl|Python/ : Perl or Python

ii.   /P(erl|ython)/ : Perl or Python

iii.   /ab+c/ : abbc, abbbc, …

iv.   /ab*c/ : abc, abbc, abbbc, …

b. match operator : =~

c. Examples)

if line =~ /Perl|Python/

puts "Scripting language is #{line}"

end

 =~ 매치 연산자

문자열 표현 속에 #{line}

line.sub(/Perl/, 'Ruby')

최초 Perl로 시작하는 표현을 Ruby로 대체

line.gsub(/Perl/, 'Ruby')

모든 Perl로 시작하는 표현을 Ruby로 대체

 

Blocks and Iterators

Blocks

Expression: { statements }

Example)

def callback

yeild arg1

yeild arg1

end

 

callBack { |arg1| puts arg1 }

In the Block

In the Block

yeild 문에 Block이 수행됨.

yeild 문에 인자를 줄 수 있는데,

Block 안에서는 | |로 받음.

 

TAG •

Ruby
2007.11.13 11:05

Blocks and Iterators

조회 수 17096 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
코드 블럭 (Code Blocks)

아래는 간단한 블럭을 생성한 예제입니다.

{ puts "Hello" }  # this is a block

do
  club.enroll(person)
  person.socialize
end


ruby에서 블럭의 개념은 막강합니다.
callback 함수, 코드 덩어리(code chunk) 전달, 순환자(iterator) 를 구현하는데, code block이 사용됩니다.

def callBlock
  yield
  yield
end

callBlock { puts "In the block" }

결과:
In the block
In the block

위 수행결과를 보면 yield를 사용하여 code block를 받았다.

아래 예제를 보자
a = %w( ant bee cat dog elk) # create an array
a. each { |animal| puts animal } # iterate over the contents
수직 바(bar, |)를 이용하면 yield의 인자가 대치됩니다..
# within class Array ...
def each
  for each element
    yield(element)
  end
end


TAG •

조회 수 19617 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

zeroboard 에디터 컴포넌트인 BNU님의 Code Highlighter를 약간 수정해봤습니다.

코드를 입력할 박스 안에서 폰트를 변경하거나 하면 code highlight 된 결과에 <FONT ...> 태그가 나타납니다.

php 함수와 정규식 표현을 이용하여 transHTML()함수를 수정하여,
해당 태그들을 없애주는 코드를 추가했습니다.

    // source 중에 html tag를 없앤다.
    $body = preg_replace("/<.?font(.*?)>/i", "", $body);
    $body = preg_replace("/<.?span(.*?)>/i", "", $body);
    $body = preg_replace("/<.?strong(.*?)>/i", "", $body);
    $body = preg_replace("/<.?br(.*?)>/i", "\n", $body);


preg_replace함수를 써서 없앨 태그를 지정해주면 됩니다.

TAG •

Python
2007.11.17 07:10

Modules

조회 수 45625 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
모듈에 대해서 알아보자.
함수들의 모음이 모듈이라고 생각하면 쉬울 것이다.
공통의 목적이 가진 함수들을 모아 특정 파일명으로 저장해놓으면,
이를 다른 모듈이나 메인 모듈에서 import하여 사용할 수 있다.
모듈을 import 방법
import module_name
module_name은 확장자(.py)를 제외한 파일명임.

 [wittgens@fedora python]$ cat fibo.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# 피보나치 수열 모듈
def fib(n):
        a, b = 0, 1
        while b < n:
                print b,
                a, b = b, a + b

def fib2(n):
        result = []
        a, b = 0, 1
        while b < n:
                result.append(b)
                a, b = b, a + b
        return result

[wittgens@fedora python]$ python
Python 2.5 (r25:51908, Oct 19 2007, 09:47:40)
[GCC 4.1.2 20070925 (Red Hat 4.1.2-27)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fibo
>>> fibo.fib(5)
1 1 2 3
>>> fibo.fibo2(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'fibo2'
>>> fibo.fib2(5)
[1, 1, 2, 3]

More on Modules
모듈을 import 또다른 방법은 모듈을 전역으로 가져오는 방법이다.
모듈은 자체 심볼 테이블이 있으며, 아래와 같은 방법으로 하면 전역 심볼 테이블로 모듈이름을 가져오기 때문에 모듈명.항목명(modulename.itemname)으로 접근하지 않고 바로 항목명(itemname)으로 접근 가능하다.

1. from module_name import function_name
2. from module_name import *
>>> from fibo import *
>>> fib(5)
1 1 2 3


The Module Search Path
fibo 라는 이름으로 모듈을 import 했다면, fibo.py를 현재 디렉토리에서 찾는다.
실제로 파이썬은 sys.path에 등록된 경로에서도 모듈을 찾느다.
따라서 파이썬 스크립트의 파일명을 정할 때는 sys.path에 등록된 모듈명과 같아서는 안된다.

"Compiled" Python files
컴파일 된 파이썬 코드는 표준 모듈들을 많이 사용한 간단한 프로그램을 위한 시작 시에 속도를 향상시켜 준다. 이를 "byte-compiled" 된 코드라 부른다.
예를 들어 spam.py 스크립트가 있는 위치에 spam.pyc라는 파일이 생성되어 있다면, spam.py 스크립트가 컴파일되어 있다는 것을 의미한다.

1. 파이썬 모듈을 호출할 때 -O 플래그를 사용하면, 모든 바이트 코드가 취적화된다. 기존에 존재하는 .pyc 파일들은 무시되며 .py 파일들이 최적화된 바이트코드로 컴파일된다.

2. -O 플래그를 두번 사용할 때 (-OO) __doc__ 스트링은 바이트코드로부터 제거되고, 더 compact한 바이트 코드를 생성한다.

Standard Modules
파이썬은 표준 모듈들의 라이브러리로 이루어진다. 몇몇 모듈들은 인터프리터에 내장된다.
sys.path 변수(list)에 경로를 지정해 놓으면 파이썬은 모듈들의 경로를 그 변수 리스트에서 찾는다.

The dir() Function
내장함수 dir()은 정의된 모듈의 이름을 가져온다. dir() 함수는 모듈의 이름을 정렬된 문자열 리스트를 반환한다.
>>> import fibo
>>> dir(fibo)
['__builtins__', '__doc__', '__file__', '__name__', 'fib', 'fib2']

내장 함수의 리스트를 원하면, __builtin__ 을 import하여 dir()함수로 가져오면 된다.
 >>> dir(__builtin__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', 'abs', 'all', 'any', 'apply', 'basestring', 'bool', 'buffer', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']

Packages
패키지는 "점(dot)으로 구분한 모듈이름"을 사용하여 모듈들을 구조화하기위한 방법이다.
자바에서도 package라는 개념이 있는데 이와 유사하다라고 생각하면 된다.
단, 패키지들을 담는 디렉토리에는 __init__.py 파일이 필요하다. 아주 간단한 경우에는 __init__.py파일은 비어있다. 하지만 __init__.py 파일에는 해당 패키지를 초기화하는 코드들을 기록해 놓는다.

Importing * From a Package
예를 들어 from Sound.Effects import * 을 코드에 넣었다면, Sound.Effects 패키지에 있는 모든 모듈들을 import 된다.
허나 모든 운영체제에서 잘 동작하는 것은 아니다. Window나 Mac 플랫폼에서는 잘 동작할 수 없다.
파일명을 대소문자를 구분하지 못하는 플랫폼에는 정상 동작하지 않는 경우도 있을 것이다.
패키지 작성자는 이런 경우도 지원할 것인지 결정해야한다.
예를들어, Sounds/Effects/__init__.py 파일에 다음 코드가 있다면
__all__ = ["echo", "surround", "reverse"] 

위의 코드는 from Sound.Effects import * 라고 import할 때 Sound 패키지내에 위 3개의 서브 모듈들만 import됨을 의미한다.
__all__ 이 정의되지 않는다면, from Sound.Effects import * 문장은 Sound.Effects 패키지로부터 서브 모듈들을 현재 이름공간(namespace)에 모두 import 하지는 않는다.
__init__.py에서 명시적으로 __all__에 서브 모듈명을 등록해 주면 __all__에 등록된 서브 모듈들은 반드시 현재 이름공간(namespace)에 로드된다.
import Sound.Effects.echo
import Sound.Effects.surround
from Sound.Effects import * 
위 예제에서 echo와 surround 모듈들은 현재 이름공간(namespace)에 로드된다.
(왜냐하면, __all__에 echo와 surround 모듈이 등록되어 있기 때문에)

Intra-package References
서브 모듈들은 종종 서로 참조할 필요가 있다. 예를 들면, surround 모듈은 echo 모듈을 사용할 수도 있다. 현재에서 상위의 모듈을 참조하거나 하위의 모듈을 참조할 수도 있다.
아래 예를 보자
from . import echo # 현재 패키지의 echo 모듈 import
from .. import Formats # 상위 패키지의 Formats 모듈 전부 import
from ..Filters import equalizer # 상위 Filters 패키지의 equalizer 모듈 import


Packages in Multiple Directories
패키지들은 __path__라는 속성을 추가로 지원한다. 이것은 __init__.py 파일이 실행되기 전 디렉토리의 이름으로 초기화된다. 이 변수는 수정될 수 있으며, 항후 해당 패키지의 서브패키지나 모듈들을 찾는데 영향을 준다.


TAG •
  • ?
    비트겐스 2007.11.22 09:52
    해석하면서 이해까지 하려니 힘드는군~ 쩝~ 딸리는 영어실력 emoticon

조회 수 35537 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
BNU님이 만드신 code highlighter 0.1 버전에서

코드를 넣는 창에서 추가 버튼을 누르면 코드 박스가 나타나지 않았다 (@ 파이어폭스)

code_highlighter/tpl/popup.html 파일에서 19행을 아래와 같이 변경해 주면됨.

<select id="code_type" name="code_type"> 


이유는 자바 스크립트 (popup.js) 의 insertCode() 함수에서는

zbxe common javascript인 xGetElementById() 라는 함수를 사용하는데,

이 함수는 document의 id를 참조하여 value를 획득하는 함수인 것 같음.


TAG •

SQL
2007.12.04 10:01

mysql / CREATE TABLE

조회 수 37573 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
MySQL 에서 테이블을 생성하는 CREATE TABLE 문에 대해서 알아보자.

CREATE [TEMPRORARY] TABLE [IF NOT EXISTS] 테이블명
  [(생성_정의,...)] [테이블_옵션] [select_문]

생성_정의(create_definition):

col_name column_definition | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) | {INDEX|KEY} [index_name] [index_type] (index_col_name,...) | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...) | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition | CHECK (expr)


칼럼_정의(column_definition)

data_type [NOT NULL | NULL] [DEFAULT default_value]

      [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

      [COMMENT 'string'] [reference_definition]

데이터 타입 (data_type)

    BIT[(length)]

  | TINYINT[(length)] [UNSIGNED] [ZEROFILL]

  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]

  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]

  | INT[(length)] [UNSIGNED] [ZEROFILL]

  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]

  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]

  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]

  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]

  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]

  | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]

  | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]

  | DATE

  | TIME

  | TIMESTAMP

  | DATETIME

  | YEAR

  | CHAR(length)

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | VARCHAR(length)

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | BINARY(length)

  | VARBINARY(length)

  | TINYBLOB

  | BLOB

  | MEDIUMBLOB

  | LONGBLOB

  | TINYTEXT [BINARY]

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | TEXT [BINARY]

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | MEDIUMTEXT [BINARY]

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | LONGTEXT [BINARY]

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | ENUM(value1,value2,value3,...)

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | SET(value1,value2,value3,...)

      [CHARACTER SET charset_name] [COLLATE collation_name]

  | spatial_type


인덱스_칼럼_이름 (index_col_name):
    col_name [(length)] [ASC | DESC]

인덱스_타입 (index_type):
     USING {BTREE | HASH | RTREE}

참조_정의 (reference_definition):

    REFERENCES tbl_name [(index_col_name,...)]

      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]

      [ON DELETE reference_option]

      [ON UPDATE reference_option]

참조_옵션 (reference_option):
    RESTRICT | CASCADE | SET NULL | NO ACTION

테이블_옵션 (table_option):

    {ENGINE|TYPE} [=] engine_name

  | AUTO_INCREMENT [=] value

  | AVG_ROW_LENGTH [=] value

  | [DEFAULT] CHARACTER SET charset_name

  | CHECKSUM [=] {0 | 1}

  | COLLATE collation_name

  | COMMENT [=] 'string'

  | CONNECTION [=] 'connect_string'

  | DATA DIRECTORY [=] 'absolute path to directory'

  | DELAY_KEY_WRITE [=] {0 | 1}

  | INDEX DIRECTORY [=] 'absolute path to directory'

  | INSERT_METHOD [=] { NO | FIRST | LAST }

  | MAX_ROWS [=] value

  | MIN_ROWS [=] value

  | PACK_KEYS [=] {0 | 1 | DEFAULT}

  | PASSWORD [=] 'string'

  | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

  | UNION [=] (tbl_name[,tbl_name]...)

select_문 (select_statement)

    [IGNORE | REPLACE] [AS] SELECT ...   (Some legal select statement)




참조: http://www.mysql.com
TAG •

Python
2007.12.04 12:16

MySQLdb Example

조회 수 47734 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
python에서 mysql 모듈을 사용하는 간단한 방법을 알아보자.

   import MySQLdb # mysql 모듈을 import 함

   # DBMS와 연결한다. 인자는 키워드 인자로 넘겨주면 됨.
   conn = MySQLdb.connect (host = "localhost",
                           user = "testuser",
                           passwd = "testpass",
                           db = "test")
   cursor = conn.cursor () # cursor를 얻음
   cursor.execute ("SELECT VERSION()") # 쿼리 실행
   row = cursor.fetchone () # 쿼리 결과중 처음 하나만 가져옴
   print "server version:", row[0]
   cursor.close () # 커서를 닫는다.
   conn.close () # 연결을 끊음.



TAG •

Python
2007.12.04 13:44

Socket Example

조회 수 55973 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

소켓을 이용하여 통신하는 예제.

아래는 해당 호스트와 포트로 접속하여 데이터를 주고 받는 함수를 만들었음.

#! /usr/bin/python
# coding: utf-8

import socket

"""
\brief 소켓 통신을 위한 함수
\param host 대상 호스트 주소
\param port 대상 호스트 포트
\param msg 전송할 메시지
\param timeout 수신 타임아웃
"""
def comm(host, port, msg, rx_timeout=60):
    # 소켓 객체 생성
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 수신 타임아웃 지정
    s.settimeout(rx_timeout)
    try:
        # 소켓 연결
        s.connect((host, port))
        # 전송할 메시지 타입이 유니코드 일 경우 인코딩
        if type(msg) == unicode:
            msg = msg.encode('utf-8')
        # 메시지 전송
        s.send(msg)
        # 메시지 수신
        recvdata = s.recv(1024)
        print '[sock] Received', recvdata
        s.close()
        # 수신된 메시지 반환
        return recvdata
    except socket.timeout:
        print "[sock] timeout"
        # 소켓 닫기
        s.close()
    return None
TAG •

Java
2007.12.05 00:57

jdbc / 연결 문자열 예제

조회 수 29942 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
MySQL 연결시 트랜잭션을 지원하게 하려면 아래와 같이 지정하면 된다.

...
String
strConn = "jdbc:mysql://" + hostname + "/" + dbname + "?user=" + user +
"&password=" + passwd +
"&useUnicode=true&characterEncoding=latin1&relaxAutoCommit=true";

Connection conn = DriverManager.getConnection(strConn);
...


releaxAutoCommit 속성:

If the version of MySQL the driver connects to does not support transactions, still allow calls to commit(), rollback() and setAutoCommit() (true/false, defaults to 'false')?

만약 MySQL 드라이버의 버전이 transaction을 지원하지 않도록 연결하였으나, commit(), rollback(), setAutoCommit() 메소드 호출을 허용하는가? (기본값은 false임)


맨처음 relaxAutoCommit=true를 빼고 Connection을 생성하니 auto commit이 true인 상태에서 commit할수 없다라는 예외가 발생하였으나, 이상하게도 지금은 빼도 동작하니, 내가 먼가 잘못했남~ emoticon
TAG •

Python
2007.12.11 14:43

Input and Output

조회 수 53022 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
오랫만에 python 공부를 시작해 볼까~emoticon

이번엔 입력과 출력(Input and Output)에 대해서이다.

Fancier Output Formatting (더 화려한 출력 형식)
이제까지 값을 쓰는 두 가지 방법을 봤을 것이다. (expression statements, print statement)
세번째 방법은 file 객체의 write() 메소드를 사용하는 것임.
표준 출력 파일은 sys.stdout로 참조될 수 있음.


Reading and Writing Files
>>> f = open('/tmp/workfile','w')
>>> print f
<open file '/tmp/workfile', mode 'w' at 0xb7f2b3c8>
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 9] Bad file descriptor
>>> f.write('abcdefg')
>>> f.close()
>>> f = open('/tmp/workfile','r')
>>> f.read()
'abcdefg'
>>>

파일 객체의 메소드
read() # 파일에서 읽음
readline() # 파일에서 한 줄을 읽음
readlines() # 파일에서 여러 줄을 읽어서 list 로 반환함.
write() # 파일에 기록함
seek() # 파일포인터를 이동함
close() # 파일을 닫음.

The pickle Module
파일에 더 복잡한 객체를 저장하거나 읽기 위해서 pickle 표준 모듈을 제공한다.
자바에서 객체 직렬화와 비슷한 듯.
객체를 파일에 저장하기 위해서는 pickle.dump() 함수를 사용하며,
파일에서 객체를 읽어내기 위해서는 pickle.load() 함수를 사용한다.
>>> obj = [123, 4565, 111, 321, 'abc']
>>> obj
[123, 4565, 111, 321, 'abc']
>>> f = open('/tmp/workfile', 'w')
>>> pickle.dump(obj, f)
>>> f.close()
>>> f = open('/tmp/workfile', 'r')
>>> pickle.load(f)
[123, 4565, 111, 321, 'abc']


좋은 모듈이군.. emoticon
TAG •

Python
2007.12.11 14:47

Serial Communication Example

조회 수 53164 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

serial 통신 예제입니다.

pySerial 패키지가 설치가 되어있어야 합니다.

참조 사이트 (http://pyserial.sourceforge.net/)

import serial 후 사용하세요.

def serial_comm(port_num, baud, data):
    ser = serial.Serial()
    ser.baudrate = baud
    ser.port = port_num - 1
    ser.setTimeout(1)
    print ser
    ser.open()
    if ser.isOpen() == False:
        print "can't open port : ", ser.portstr
        return []
    ser.flushInput()
    ser.write(data)
    recv = ser.read(1024)
    ser.close()
    
    hex_strings = ''
    for ch in recv:
        hex_str = '%02X ' % ord(ch)
        hex_strings += hex_str
    print 'size', len(recv), 'bytes'
    print hex_strings
    return recv
TAG •

조회 수 30685 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

모듈추가 -> 이름: modWheelScroll
Option Explicit

'윈도우 프로시저 서브클레싱을 위한 API함수 선언
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'API상수 선언
Private Const GWL_WNDPROC = -4
Private Const WM_MOUSEWHEEL = &H20A

Private SubClassData As Collection  '서브클레싱한 데이타를 가지고있는 구조체


'윈도우 프로시저 콜백 함수 - 휠스크롤 메시지만 처리
Private Function Proc_WheelScroll(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim zDelta As Long
    Dim i As Long
On Error Resume Next
    For i = 1 To SubClassData.Count
        If hWnd = SubClassData(i).objGrid.hWnd Then
            Exit For
        End If
    Next i
    '어떤 플렉스 그리드에서 메시지가 발생했는지..
    If uMsg = WM_MOUSEWHEEL Then
    
        zDelta = wParam / 65536
        If zDelta > 0 Then
            Call Scroll_Grid(SubClassData(i).nDistance * -1, SubClassData(i).objGrid)
        Else
            Call Scroll_Grid(SubClassData(i).nDistance, SubClassData(i).objGrid)
        End If
    Else
        Proc_WheelScroll = CallWindowProc(SubClassData(i).lpPreWndProc, hWnd, uMsg, wParam, lParam)
    End If
    Exit Function
ERRHDN:
    MsgBox Err.Description
End Function


'스크롤 가능하도록 메시지 프로시저를 서브클레싱 한다.
'서브 클레싱 할때마다 카운트를 증가시키고 플렉스 그리드를 가지고 있는다.
Public Sub SetWheelScroll(ByRef FlexGrid As MSFlexGrid, Optional ByVal nDistance As Long = 1)
    
    Dim CData As clsSubClasData
    
    If SubClassData Is Nothing Then
        Set SubClassData = New Collection
    End If
    
    Set CData = New clsSubClasData
    
    Set CData.objGrid = FlexGrid
    CData.nDistance = nDistance
    CData.lpPreWndProc = SetWindowLong(FlexGrid.hWnd, GWL_WNDPROC, AddressOf Proc_WheelScroll)
    
    SubClassData.Add CData
End Sub

'서브클레싱 해제
Public Sub RestoreWheelScroll(objGrid As MSFlexGrid)
    Dim i As Long
    
    For i = 1 To SubClassData.Count
        If SubClassData(i).objGrid.hWnd = objGrid.hWnd Then
            Exit For
        End If
    Next i
    
    With SubClassData(i)
        Call SetWindowLong(.objGrid.hWnd, GWL_WNDPROC, .lpPreWndProc)
        Set .objGrid = Nothing
    End With
    
    SubClassData.Remove i
End Sub


'실제 스크롤 하는 함수
Private Sub Scroll_Grid(ByVal nMove As Long, objGrid As MSFlexGrid)
    Dim i As Long
On Error GoTo ERRHND
    
    objGrid.TopRow = objGrid.TopRow + nMove
    
    Exit Sub
ERRHND:
    'Debug.Print Form1.MSFlexGrid1.TopRow
End Sub

클래스 모듈 추가 -> 이름: clsSubClasData
Option Explicit

Public lpPreWndProc As Long     '원래 윈도우 프로시저 핸들
Public objGrid As MSFlexGrid    '플렉스 그리드 오브젝트
Public nDistance As Long        '한번 휠스크롤 할때마당 움직일 양


폼 로드 시 (XXX_Load())
Private Sub Form_Load()
    Call SetWheelScroll(Form2.MSFlexGrid1, 1)
End Sub

폼 언로드 시 (XXX_Unload(Cancel As Integer)
Private Sub Form_Unload(Cancel As Integer)
    Call RestoreWheelScroll(Form2.MSFlexGrid1)
End Sub


http://www.sujunggusul.com 에서 가져온 자료입니다.





TAG •

Ruby
2007.12.12 22:10

Getting Started : Ruby

조회 수 23496 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

루비 = 스몰토크의 객체지향성 + 펄의 텍스트 처리 + Lisp의 메타프로그래밍


루비 시작하기
[wittgens@fedora ruby]$ cat hello.rb
puts "hello world"
[wittgens@fedora ruby]$ ruby hello.rb
hello world
[wittgens@fedora ruby]$

여기서 puts 라는 함수는 표준 출력(stdout)으로 지정 문자열을 출력하는 함수..
표준 입력(stdin)으로 부터 문자열을 받는 함수는 gets 이다. newline까지 입력받음.
[wittgens@fedora ruby]$ cat hello2.rb
puts "What is your name?"
name = gets
puts("Hello " + name)

[wittgens@fedora ruby]$ ruby hello2.rb
What is your name?
Jeong-soo, Kim
Hello Jeong-soo, Kim

코드를 실행할 때마다 편집기 및 셸을 왔다갔다 하려면 번거롭다.
python 인터프리터와 같이 irb (Interactive RuBy) 유틸리티를 사용하면 이를 해결해준다.
[wittgens@fot ~]$ irb
irb(main):001:0>
irb(main):008:0> puts "hello world!"
hello world!
=> nil
irb(main):009:0>

루비에서는 값이 없다는 의미로 nil 을 사용한다. java에서의 null과 같은 의미인 것 같다.

루비에서는 모든 자료형을 객체 취급한다.
"hello" 라고 표현하면 문자열 객체가 되는 것이다. 객체가 된다는 의미는 메소드를 지닌다.
"hello".length 과 같이 length라는 메소드를 호출할 수 있다.

루비에서는 한줄에 여러 변수에 값을 넣을 수도 있다.

str1, str2 = "hello", "bye"
str1 에는 "hello", str2 에는 "bye"가 들어간다.


문자열 객체에 여러 메소드를 지원하는데 100개가 넘는다.
size, upcase, ...

 TIP) 오픈소스 루비 라이브러리를 찾는다면, http://raa.ruby-lang.org/ 사이트를 참고함.

객체를 생성하는 방법은 new 메소드를 이용하면 된다.
[wittgens@fot ~]$ irb --simple-prompt
>> arr = Array.new
=> []
>> arr.push("cat")
=> ["cat"]
>> arr.push(123)
=> ["cat", 123]
>>

new와 깉이 클래스에 직접 호출하는 메소드를 클래스 메소드라 하며,
push와 같이 객체에 호출하는 메소드를 객체 메소드 또는 인스턴스 메소드라 부른다.

문자열안에 다른 문자열을 삽입하는 방법은 아래와 같다.
>> name = "Jeong-soo"
=> "Jeong-soo"
>> "Hi, #{name}"
=> "Hi, Jeong-soo"

큰따옴표와 작은따옴표는 차이가 있다.
문자열안 특수문자의 입력이 있는지 여부로 구분된다.
작은 따옴표는 특수문자 허용을 하지 않으며 큰따옴표(")는 허용한다.
위의 "Hi, #{name}" 부분을 작은 따옴표로 둘러싼 경우는
출력결과가 "Hello, #{name}"이 된다.

객체의 메소드를 확인하는 메소드는 methods 이다.
>> 5.methods
=> ["%", "inspect", "<<", "singleton_method_added", "&", "clone", ">>", "round", "method", "public_methods", "instance_variable_defined?", "divmod", "equal?", "freeze", "integer?", "chr", "*", "+", "to_i", "methods", "respond_to?", "-", "upto", "between?", "prec", "truncate", "/", "dup", "instance_variables", "__id__", "modulo", "succ", "|", "eql?", "object_id", "zero?", "~", "id", "to_f", "singleton_methods", "send", "prec_i", "taint", "step", "to_int", "frozen?", "instance_variable_get", "^", "__send__", "instance_of?", "remainder", "to_a", "+@", "nonzero?", "-@", "type", "**", "floor", "<", "protected_methods", "<=>", "instance_eval", "display", "==", "prec_f", "quo", ">", "===", "downto", "id2name", "size", "instance_variable_set", "kind_of?", "abs", "extend", ">=", "next", "to_s", "<=", "coerce", "hash", "ceil", "class", "tainted?", "=~", "private_methods", "div", "nil?", "untaint", "times", "to_sym", "[]", "is_a?"]


TAG •

Java
2007.12.13 16:44

Java communication API in Linux

조회 수 33774 추천 수 0 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
java.sun.com 사이트에서 Java Communication API 를 다운 받는다.

comm3.0_u1_linux.zip 파일을 압축을 풀면 commapi 이라는 디렉토리가 생긴다.
commapi 디렉토리안에 docs, examples, jar, lib 디렉토리가 있다.

[wittgens@fedora java_packages]$ unzip comm3.0_u1_linux.zip
...
  inflating: commapi/lib/libLinuxSerialParallel.so
  inflating: commapi/lib/libLinuxSerialParallel_g.so
[wittgens@fedora java_packages]$ ls
comm3.0_u1_linux.zip  commapi
[wittgens@fedora java_packages]$ cd commapi/
[wittgens@fedora commapi]$ ls
docs  examples  jar  lib
[wittgens@fedora commapi]$ sudo cp docs/javax.comm.properties $JAVA_HOME/jre/lib/
[wittgens@fedora commapi]$ sudo cp lib/*.so $JAVA_HOME/jre/lib/ext/
[wittgens@fedora commapi]$ sudo cp jar/comm.jar $JAVA_HOME/jre/lib/ext/

[wittgens@fedora examples]$ cd Simple/
[wittgens@fedora Simple]$ java SimpleWrite
port /dev/term/a not found.

위와 같은 에러가 발생할 것이다. linux에서는 시리얼 포트가 /dev/ttyS0, /dev/ttyS1, ... 으로 잡히기 때문에 SimpleWrite.java 파일을 편집하여 /dev/term/a 라는 부분을 /dev/ttyS0로 변경해준다.

[wittgens@fedora Simple]$ javac SimpleWrite.java
[wittgens@fedora Simple]$ sudo java SimpleWrite
Found port /dev/ttyS0
Exception in thread "main" java.io.IOException: Not all params are supported by kernel
        at com.sun.comm.LinuxSerial.nativeSetSerialPortParams(Native Method)
        at com.sun.comm.LinuxSerial.setSerialPortParams(LinuxSerial.java:346)
        at SimpleWrite.main(SimpleWrite.java:93)

변경해 줘도 위와 같은 예외가 발생한다.
무시한다.ㅋㅋ 이와 관련하여 리눅스 포럼에 많이 나와있을 것이다. 참조하여 해결하기 바란다.ㅋ


  • ?
    비트겐스 2007.12.13 16:48
    이벤트 리스너로 처리하지 않으면, 시리얼로 부터 read시 데이터를 읽어버리는 경우가 발생하여
    이벤트 리스너를 추가하여 하나의 SerialPort를 wrapping 한 클래스를 만들었음.
  • ?
    비트겐스 2007.12.27 13:35
    finally { } 블록을 추가하여 한번더 setSerialPortParams를 호출해준다.

Board Pagination Prev 1 2 3 4 Next
/ 4