소켓통신으로 객체를 마샬링하여 통째로 전달하여 보자.

우리가 소켓통신을 사용하다 보면 배열이나 구조체를 통째로

날리면 편하겠다 라는 생각을 많이 하게 된다.

먼저 우리가 알아두어야 할 개념이 있다.

MarshalAsAttribute의 설명

이 특성은 매개 변수, 필드 또는 반환 값에 적용될 수 있습니다.

각 데이터 형식에 기본 마샬링 동작이 있으므로 이 특성은 선택적입니다. 이 특성은 주어진 형식을 여러 형식으로 마샬링할 수 있는 경우에만 필요합니다. 예를 들어, 문자열은 LPStr, LPWStr, LPTStr 또는 BStr로 관리되지 않는 코드로 마샬링할 수 있습니다. 기본적으로 공용 언어 런타임에서는 문자열 매개 변수를 BStr로 COM 메서드로 마샬링합니다. MarshalAsAttribute 속성을 개별 필드나 매개 변수에 적용하여 특정 문자열이 BStr 대신 LPStr로 마샬링되도록 할 수 있습니다. 형식 라이브러리 내보내기(Tlbexp.exe)는 사용자의 마샬링 기본 설정을 공용 언어 런타임에 전달합니다.

일부 매개 변수 및 반환 값은 COM interop 또는 플랫폼 호출과 함께 사용할 경우 기본 마샬링 동작이 다릅니다. 기본적으로 런타임에서는 문자열 매개 변수 및 값 형식의 필드를 LPStr로 플랫폼 호출 메서드 또는 함수로 마샬링합니다. 자세한 내용은 기본 마샬링 동작을 참조하십시오.

대부분의 경우 이 특성은 다음 C# 시그니처와 같이 UnmanagedType 열거형을 사용하는 관리되지 않는 데이터의 형식을 쉽게 식별합니다.

void MyMethod([MarshalAs(LPStr)] String s);

일부 UnmanagedType 열거형 멤버에는 추가 정보가 필요합니다. 예를 들어, UnmanagedTypeLPArray 일 때에는 추가 정보가 필요합니다. 이 특성을 배열에 사용하는 방법에 대한 자세한 내용은배열에 대한 기본 마샬링을 참조하십시오.

형식 라이브러리 가져오기(Tlbimp.exe)는 이 특성을 매개 변수, 필드 및 반환 값에도 적용하여 입력 형식 라이브러리의 데이터 형식이 해당 관리되는 데이터 형식의 기본 형식이 아님을 나타냅니다. Tlbimp.exe는 입력 형식 라이브러리에 지정된 형식에 상관없이 명확함을 기하기 위해 StringObject 형식에 항상 MarshalAsAttribute를 적용합니다.


예제를 보자.


[C#]

//Applied to a parameter.

  public void M1 ([MarshalAs(UnmanagedType.LPWStr)]String msg);

//Applied to a field within a class.

  class MsgText {

    [MarshalAs(UnmanagedType.LPWStr)] Public String msg;

  }

//Applied to a return value.

[return: MarshalAs(UnmanagedType.LPWStr)]

public String GetMessage();

 

이 마샬링의 개념이 정리가 되었으면 이제  관리되지 않는 메모리 블록의 데이터를

관리되는 개체로 마샬링하는 메서드를 정리 해보도록 하자.


Marshal.PtrToStructure 메서드사용 예제

UCOMITypeInfo typeInfo = ...;

IntPtr ptr = IntPtr.Zero;

typeInfo.GetTypeAttr(ref ptr);

TYPEATTR attr = (TYPEATTR)Marshal.PtrToStructure(ptr,

    typeof(TYPEATTR));





실전 객체 전달 프로그래밍


using System.Runtime.InteropServices; //관리되지않는 코드 (포인터 사용및 구조체를 시퀜셜하게 만들기위해)

using System.Text;

using System.Net.Sockets;

using System.Diagnostics;  


// 클래스(구조체) 샘플.

[StructLayout(LayoutKind.Sequential)]

public class TempPacket

{

    public byte Command;

    public byte Version;

    public ushort Length;        

    [MarshalAs(UnmanagedType.ByValArray, SizeConst=10)] public byte[] Data;  //바이트 배열....

}


public class Sample

{

    public void Text()

    {

        TempPacket tmpPacket = new TempPacket();


        tmpPacket.Command = 0x10;

        tmpPacket.Version = 0x01;

        tmpPacket.Length = 10;

        tmpPacket.Data = Encoding.ASCII.GetBytes("0123456789");


        //객체를 보내보자.                    

        byte[] buffer = new byte[Marshal.SizeOf(tmpPacket)];

        unsafe

        {

            fixed(byte* fixed_buffer = buffer)

            {

                Marshal.StructureToPtr(tmpPacket, (IntPtr)fixed_buffer, false);

            }

        }

   

        //소켓열고        

        TcpClient tcpClient = new TcpClient();

        tcpClient.Connect("localhost", 8296);

   

        NetworkStream networkStream = tcpClient.GetStream();

   

        networkStream.Write(buffer, 0, Marshal.SizeOf(tmpPacket));

               

        //객체받고

        TempPacket tmpPacket2 = new TempPacket();

        networkStream.Read(buffer, 0, Marshal.SizeOf(tmpPacket));

        unsafe

        {

            fixed(byte* fixed_buffer = buffer)

            {

                Marshal.PtrToStructure((IntPtr)fixed_buffer, tmpPacket2);

            }

        }    

        string data;

   

        data = Encoding.ASCII.GetString(tmpPacket2.Data, 0, 10);

        Debug.WriteLine(data);

        networkStream.Close();

        tcpClient.Close();

    }

}


 


  작성자 : HOONS(박경훈)
  이메일 : tajopkh@hanmail.net
  홈페이지 : http://www.hoonsbara.com 

Posted by 나비:D
:

ASCII Codes

2008. 3. 18. 11:11
ASCII Codes

Char

Hex

Oct

Dec

 

Char

Hex

Oct

Dec

 

Char

Hex

Oct

Dec

 

Char

Hex

Oct

Dec

Ctrl-@ NUL

00

000

0

 

Space

20

040

32

 

@

40

100

64

 

`

60

140

96

Ctrl-A SOH

01

001

1

 

!

21

041

33

 

A

41

101

65

 

a

61

141

97

Ctrl-B STX

02

002

2

 

"

22

042

34

 

B

42

102

66

 

b

62

142

98

Ctrl-C ETX

03

003

3

 

#

23

043

35

 

C

43

103

67

 

c

63

143

99

Ctrl-D EOT

04

004

4

 

$

24

044

36

 

D

44

104

68

 

d

64

144

100

Ctrl-E ENQ

05

005

5

 

%

25

045

37

 

E

45

105

69

 

e

65

145

101

Ctrl-F ACK

06

006

6

 

&

26

046

38

 

F

46

106

70

 

f

66

146

102

Ctrl-G BEL

07

007

7

 

'

27

047

39

 

G

47

107

71

 

g

67

147

103

Ctrl-H BS

08

010

8

 

(

28

050

40

 

H

48

110

72

 

h

68

150

104

Ctrl-I HT

09

011

9

 

)

29

051

41

 

I

49

111

73

 

i

69

151

105

Ctrl-J LF

0A

012

10

 

*

2A

052

42

 

J

4A

112

74

 

j

6A

152

106

Ctrl-K VT

0B

013

11

 

+

2B

053

43

 

K

4B

113

75

 

k

6B

153

107

Ctrl-L FF

0C

014

12

 

,

2C

054

44

 

L

4C

114

76

 

l

6C

154

108

Ctrl-M CR

0D

015

13

 

-

2D

055

45

 

M

4D

115

77

 

m

6D

155

109

Ctrl-N SO

0E

016

14

 

.

2E

056

46

 

N

4E

116

78

 

n

6E

156

110

Ctrl-O SI

0F

017

15

 

/

2F

057

47

 

O

4F

117

79

 

o

6F

157

111

Ctrl-P DLE

10

020

16

 

0

30

060

48

 

P

50

120

80

 

p

70

160

112

Ctrl-Q DCI

11

021

17

 

1

31

061

49

 

Q

51

121

81

 

q

71

161

113

Ctrl-R DC2

12

022

18

 

2

32

062

50

 

R

52

122

82

 

r

72

162

114

Ctrl-S DC3

13

023

19

 

3

33

063

51

 

S

53

123

83

 

s

73

163

115

Ctrl-T DC4

14

024

20

 

4

34

064

52

 

T

54

124

84

 

t

74

164

116

Ctrl-U NAK

15

025

21

 

5

35

065

53

 

U

55

125

85

 

u

75

165

117

Ctrl-V SYN

16

026

22

 

6

36

066

54

 

V

56

126

86

 

v

76

166

118

Ctrl-W ETB

17

027

23

 

7

37

067

55

 

W

57

127

87

 

w

77

167

119

Ctrl-X CAN

18

030

24

 

8

38

070

56

 

X

58

130

88

 

x

78

170

120

Ctrl-Y EM

19

031

25

 

9

39

071

57

 

Y

59

131

89

 

y

79

171

121

Ctrl-Z SUB

1A

032

26

 

:

3A

072

58

 

Z

5A

132

90

 

z

7A

172

122

Ctrl-[ ESC

1B

033

27

 

;

3B

073

59

 

[

5B

133

91

 

{

7B

173

123

Ctrl-\ FS

1C

034

28

 

<

3C

074

60

 

\

5C

134

92

 

|

7C

174

124

Ctrl-] GS

1D

035

29

 

=

3D

075

61

 

]

5D

135

93

 

}

7D

175

125

Ctrl-^ RS

1E

036

30

 

>

3E

076

62

 

^

5E

136

94

 

~

7E

176

126

Ctrl_ US

1F

037

31

 

?

3F

077

63

 

_

5F

137

95

 

DEL

7F

177

127

Posted by 나비:D
:

이번에는 우리가 가지고 있는 객체와 클래스의 기초 지식을 바탕으로 가상 모델링 해보도록 하겠습니다. 가상 모델링으로 구축 할 시스템은 바로 가상 축구 게임 입니다. 이제부터 클래스를 정의하고 동작(메서드)을 정의하는 요령을 익혀 보도록 합시다.

1. 일단 게임에 필요한 대상이나 동작 같은 요소들을 모두 적습니다.

사람, 공격수, 슛, 패스, 골키퍼, 펀칭, 태클, 축구공, 전반전, 팀, 선수, 수비수, 심판, 파울, 경기시간, 후반전 등등

2. 적어 놓은 요소들 중에는 동사와 명사가 있습니다. 명사는 바로 클래스가 되는 것이고 동사는 바로 메서드가 되는 것입니다. 이제 클래스와 메서드를 구분해 봅시다.

클래스(명사) - 사람, 공격수, 골키퍼, 축구공, 전반전, 팀, 선수, 수비수, 심판, 경기시간, 후반전 등등

메서드(동사) - 슛, 패스, 펀칭, 태클 등등

3. 다음은 클래스 안의 메서드를 정리 합니다.

4. 설계 된 클래스들의 연관을 살펴 보고, 상속과 추상 or 다형성의 개념을 도입합니다. 이번 단계는 앞서 우리가 공부한 객체 지향의 설계 방법을 활용할 수 있는 단계입니다.


처음 단순하게 늘어 놓았던 단어들이 한 단계, 한 단계 정리 되면서 제법 폼 있는 설계도가 완성 되었습니다. 클래스 모델링이라고 해서 절대 대단한 것이 있는 것이 아닙니다. 누구나 쉽게 설계하고 모델링 할 수 있습니다. 지금 언급한 4가지 단계는 필자의 필살기적 노하우를 정리 해 본 것입니다. 반드시 기억해 두시기 바랍니다.

우리가 게임이든 어떤 소프트웨어든 프로그래밍 하기 전에 가장 먼저 해야 할 중요한 작업이 클래스 모델링의 과정입니다. 체계적인 뼈대를 갖추고 프로그래밍을 하는 것과 뼈대를 세워 가면서 프로그래밍을 하는 것은 확연히 차이가 나게 됩니다.

앞서 말했듯이 객체 지향적 사고는 한번에 자신의 머리 속에 정착 되는 것은 아닙니다. 반드시 직접 설계해보고 토론해보고 또 생각해보는 반복적인 노력을 하시길 바랍니다. 그럼 어느새 내가 만든 프로그램은 뼈대가 생기게 될 것이고 더욱더 논리적인 프로그램을 만들 수 있을 것입니다.

작성자 : HOONS(박경훈)
이메일 : tajopkh@hanmail.net
홈페이지 : http://www.hoonsbara.com

Posted by 나비:D
:

1. Introduction
저번 강좌에서는 객체와 클래스의 개념에 대해서 자세하게 알아 보았습니다. 이제 어느 정도 객체와 클래스의 개념을 이해 했을 것입니다. 하지만 이런 객체와 클래스를 알게 되었다고 해서 우리가 객체 지향 적인 프로그래밍을 설계하고 활용 할 수 있는 것은 아닙니다. 이 개념은 꾸준히 연구하고 설계하는 노력에서 나오는 것이기 때문입니다. 그래서 이번 장에서 클래스를 설계하는 방법에 대해 연구해보고 설계하는 방법을 다루어 볼 것입니다. 이번 장의 대상은 객체와 클래스의 개념을 이해 하고 있으신 분 이여야 하며 클래스의 문법 또한 이해하고 있어야 합니다. 그럼 객체 지향 설계에 들어 가보도록 하겠습니다.

2. 객체지향의 단계적 활용

2.1 업무 요청

여러분은 어느 호텔의 고객정보관련 프로그램 일을 유지하고 개발하는 개발자입니다. 어느 무료한 시간을 보내고 있던 중에 새로운 작업요청이 들어 왔습니다.

To. 고객관리 개발자

현재 호텔에 투숙하고 있는 고객의 정보를 가지고 있다가 투숙하고 있는 고객들의 성(gender)을 물어보면 그 고객이 남자인지 여자인지 반환해 주는 프로그램을 만들어 주세요

아주 간단한 프로그램을 요청이 들어왔네요. 작업내용을 한번 정리 해보겠습니다. 호텔의 고객들의 성을 반환해 주는 프로그램을 만들어 주면 됩니다. 근데 잠시 저장 시켰다가 요청한 아이의 성을 반환해 주라는 것이군요. 머 어려울 거 없는 내용입니다.

위와 같은 업무를 받았을 때 여러분은 클래스를 어떻게 설계하고 정의할지 생각해 보시기 바랍니다. 그리고 이제 단계별로 객체지향 적인 설계를 해 볼 것입니다. 여러분이 생각하고 활용하는 객체 지향의 능력은 어느 정도 되는지도 한번 점검해 보기 바랍니다.

2.2 객체 지향의 30% 활용

public class Custom
{
//여러 고객정보들 생략
private bool Sung; //true=남,false=여
public Custom(bool _Sung) //고객의 성을 저장하는 생성자
{
Sung=_Sung;
}
public string GetSung
{
get{return Sung;}
set{Sung=value;}
}
public string GetSung() // 고객의 성을 반환해주는 메소드
{
if(Sung)
return "남자";
else
return "여자";
}
}

객체를 30% 활용한 코드를 살펴 봅시다. 고객의 정보를 담을 Custom이라는 클래스를 만들었습니다. 그리고 Sung이라는 변수를 이용해서 남자 고객인지 여자 고객인지 구분하여 문자열을 전달합니다. 어떻습니까? 별 문제가 없어 보이죠? 대부분의 개발자들이 위와 같이 클래스를 설계 할 것입니다.

하지만 위의 클래스 객체 지향적인 설계로 보여지지 않습니다. 위의 프로그램 설계는 남자 고객인지 여자 고객인지 확인 하기 위해서는 생성한 객체 Sung이라는 변수를 확인 해야만 합니다. 다시 말하면 남자고객과 여자고객 두 개의 객체를 하게 되면 사실상 남자 고객인지 여자 고객인지 명확하게 구별 되지 못하는 거입니다. 이제 다음 단계를 살펴 봅시다. 그럼 왜 효율적이지 못한 것인지 충분히 느끼게 될 것입니다.

2.3 객체 지향의 60% 활용

public class Custom
{
// 고객 정보들 생략!
}
public class Man : Custom
{
public string GetSung()
{
return "남자";
}
}
public class Woman : Custom
{
public string GetSung()
{
return "여자";
}
}

이번에 설계된 클래스는 고객 객체를 생성 할 때 너는 여자다 남자다 라는 인자를 기억해둘 필요가 없습니다. 고객 클래스에서 Sung인자를 없애버렸습니다. 프로그램 메모리도 어느 정도 절약 할 수 있게 된 것이죠. 그리고 남자와 여자라는 자식 클래스를 별도로 만들었습니다.

이 클래스는 너의 성이 무엇이냐 라는 질문에 어떤 플래그를 거치지 않고 자신의 성을 말할 수 있습니다. 여기서는 객체 지향의 상속성 이라는 개념을 도입한 것입니다. 너무나 중요한 개념입니다. 상속을 도입했다고 해서 첫술에 배부르면 안 됩니다. 자, 그럼 이제 다형성과, 추상화의 개념을 도입하여 클래스를 설계 해 보겠습니다.


2.4
객체 지향의 90% 활용

public abstract class Custom
{
abstract public string GetSung(); //추상화
}
public class Man : Custom
{
public override string GetSung() //다형성
{
return "남자";
}
}
public class Woman : Custom
{
public override string GetSung()
{
return "여자";
}
}

추상화의 개념은 Custom 안에 GetSung()이라는 메서드 에서 사용 되었습니다. 추상화라는 것은 표현하고자 하는 특성을 간추리는 작업을 의미합니다. Custom 클래스에서 추상적으로 선언된 GetSung() 메서드는 abstract로 선언 되어 있습니다. 그리고 각각의 Man,Woman 클래스에서는 Custom 클래스를 상속 받고 그 안에서 GetString()을 구체화 하여 사용합니다. 각각의 클래스에서 자신의 특성에 맞추어서 구체화 되는 것을 우리는 다형성 이라고 부릅니다. 같은 GetSung()이지만 남자와 여자의 두 개의 특성으로 사용 되는 것입니다. 위의 설계는 추상화의 개념과 다형성의 개념이 잘 표현되고 있습니다.

2.5 다형성과 추상화의 활용

다형성과 추상화를 이용한 예제를 살펴 보았습니다. 이제 객체에 대한 놀라움과 감탄이 나와야 할 타이밍입니다. 하지만 별다른 감동이 오지 않으시는 분들이 대부분일 것입니다. 별 감동이 없으신 분들을 세가지 분류의 사람들로 가려집니다. 첫 번째 경우는 다형성과 추상화의 개념을 자주 도입해 사용 하시고 있는 분이라면 그다지 큰 감동이 오지 않습니다. 괜한 시간낭비를 했다고 생각 할 수 있습니다. _-_; 두 번째는 다형성과 추상화의 개념을 알고는 있었지만 필요성을 느끼지 못해서 사용해오지 않았던 분들입니다. 그리고 마지막으로 객체지향 설계를 한번도 접해 본적이 없으신 분들입니다. 필자의 생각으로는 주로 두 번째 분류의 사람이 대부분이라고 생각이 됩니다. 객체의 개념은 알고 있지만, 별다른 필요성을 느끼지 못해 왔다는 것입니다. 필자 역시 그래 왔었기 때문에 여러분들의 마음을 잘 읽을 수 있습니다. 그래서 특별히 두 번째 사람들의 분류를 겨냥한 돌발 상황을 만들어 보겠습니다.

여러분은 앞서 주문한 프로그램은 완성 하였습니다. 하지만 추상화와 다형성의 개념은 사용하지 않았습니다. 이유는 별 필요성을 느끼지 못해서 라고 해두겠습니다. 프로그램은 정상적으로 아주 잘 작동 되었습니다. 하지만 이 호텔에는 외계인이 자주 잠을 자러 방문합니다. 그런데 외계인은 자신은 중성이라고 자꾸 떼를 씁니다. 외계인 덕분에 요청에 의해서 만들어 준 프로그램은 사용할 수 없었습니다. 호텔 운영자는 중성이라는 요소를 추가시켰으면 좋겠다는 소망이 간절할 뿐입니다.

자, 프로그램 수정! 머 한두 번 있는 일도 아닙니다. 너그럽게 수정을 받아 드리도록 합시다. 자 이제 30%, 90% 의 설계를 살펴 보면서 어떻게 수정해야 될지 같이 생각해 봅시다.

만약 30% 활용한 설계일 경우를 살펴 봅시다. 클래스가 상당히 지저분해 질 것으로 보여집니다. 플러그의 형태를 변화시켜야 되고 GetSung() 이라는 메서드를 수정 해야 합니다. 이것은 깨끗하지 못한 클래스 되어 간다는 것을 볼 수 있습니다. 그럼 객체를 90% 활용한 클래스를 살펴 보도록 합시다. 다형성의 개념을 가지고 있는 이 클래스에서는 단지 중성 클래스를 확장 함으로서 간단히 해결 할 수 있게 됩니다.

객체 지향적 사고는 한번에 자신의 머리 속에 정착 되지 않는 것이 특징입니다. 객체 지향적 사고를 가지기 위해서는 많이 설계해보고 토론해보고 또 생각해보는 노력이 필요합니다.

3. 정리!! 객체지향적 설계 방법

순차적으로 진행 되어야 할 객체 지향 설계 방법을 정리 해보겠습니다.

1) 구현 할 대상(객체)를 선별합니다.

-> 남자, 여자를 구분해 낸 것처럼 연관성 있는 객체들을 분별해 냅니다.

2) 중복 요인을 확인합니다.

-> 중복되는 부분을 뽑아내어 하나의 부모 클래스로 묶는 작업을 말합니다.

3) 상속 받은 후, 각자의 특징대로 클래스를 다시 정의합니다.

-> 고객 클래스를 상속 받은 후 남자, 여자, 중성과 같이 나누는 잡업을 말합니다.

객체 지향에는 정답이 없습니다. "이렇게 설계하는 것이 객체 지향적으로 설계하는 것이다." 것은 극히 주관적인 말이 되는 것입니다, 하지만 효율적인 객체 지향적인 프로그래밍을 하기 위해서는 객체의 특성을 자유롭게 활용 하도록 노력해야만 합니다. 앞의 예제에서 적용해 본 객체의 속성은 추상화(Abstraction), 상속성(Inheritance), 다형성(Polymorphism) 이였습니다. 이 밖에도 캡슐화(Encapsulation), 주체성(Identity), 분류성(Classification)등등의 많은 개념들이 존재 합니다.

작성자 : HOONS(박경훈)
이메일 : tajopkh@hanmail.net
홈페이지 : http://www.hoonsbara.com

Posted by 나비:D
:
Posted by 나비:D
:
티스토리를 사용하시는 분들은 대부분 티스토리 자체에서 글을 써 올릴 겁니다. 저도 대부분 그렇긴 합니다. 사실 티스토리 정도 되면 매우 만족스러운게 사실이긴 합니다.

문제는, 제 경우에는 파일 업로드(파일 업로드 관리)에서 가끔 파일이 한 번에 하나씩밖에 올라가지 않는 버그가 있고, 이 버그는 생각보다 참 짜증스러울 때가 많습니다. (글을 저장하고 다시 열어도 버그가 뜨는 때는 계속 뜨더군요)

그런 차에... Windows Live Writer라는 녀석이 나왔다길래, 설치해봤습니다. 원격 블로그 작성 프로그램의 하나겠지요. MS에서 나왔으니, 기대와 불안이 교차합니다. VISTA에서는 문제없겠구나. 티스토리에서 쓰려면 고생 좀 하겠구나.

몇 번 삽질 끝에 방법을 정리해 올려봅니다. 중간에 순서를 왔다갔다 하는 지점이 있으니, 한 번죽 읽어보시고 시작하시기를 권합니다.

http://windowslive.msn.co.kr/mktg/?authkey=WinLive11180050055734369

이 글을 쓰는 이유 중 하나는, 이벤트 함 응모해 보려고 하는 흑심이 숨어있음을 미리 밝힙니다. 위 URL에서 라이브 라이터를 다운받으실 수 있습니다.

이 작업은 중간에 티스토리의 정체를 물어봅니다. 그러나, 거만 MS답게, 티스토리 같은 건 모릅니다. 그러므로, 티스토리가 알아모시게 해야 합니다.

작업 중에 못잡아서 못썼다는 분들도 계시던데,


티스토리의 관리자 메뉴에서, 환경 설정으로 가신 후, 기타 설정에서 BlogAPI의 활성화를 선택해주지 않았기 때문에 못 잡는 겁니다. 체크 해 주시면 해결 끝. 꼭 저장하기 누르십시오. (한 번 반복했다는...)


자, 우선은 티스토리의 계정과 아이디, 비번을 잘 입력합니다. 잊지 마셔야 할 것은, 티스토리 아이디는 메일 주소라는 겁니다. -_-a (여기서 1차 실수)


그러면 이러다가...


여기서 다음과 같이 설정하면 됩니다.


혹시라도 저처럼, 그럼에도 불구하고 설정을 못 잡는 경우가 있습니다.
요렇게 설정하십시오. 원격 게시 URL은 아이디.tistory.com/api 가 될 겁니다. (이 내용은 BlogAPI 설정하는 곳에 쓰여있습니다. 혹시 모르니 Ctrl-C. 복사해두시면 편하겠죠?)

잠시 기다리면, 다음과 같은 창이 뜹니다.


궁금하니까, 해보겠습니다. (이거 보신 분들은 굳이 안 하셔도...) 이 사이에 웹 로그 설정은 신나게 다운로드하고 있을 겁니다. 다운로드가 끝나면, 아래와 같은 창이 뜹니다. (방금 예. 누른 부분은 나중에 적용됩니다)


마침을 눌러 종료합니다. 그러면, 다음과 같은 창이 뜹니다.


자아, 그러면 이제 글을 써 보겠습니다. (WLW로 쓴 실험용 글은 여기 참조)

사진을 올릴 때는 주의해야 하는데, 자동으로 사진이 들어있던 내 PC 또는 로컬 환경과 링크를 맺으려고 노력하기 때문에, 강제로 끊어줘야 합니다. 또한, 자동으로 그림자도 깔고, 사이즈도 멋대로 만들기 때문에, 이에 대한 정리가 필요합니다.


일반적인 티스토리 설정으로는 다음과 같습니다. 왼쪽에서(그러니까, 이미지 탭에서는) 여백 없고, 테두리 없고, 링크 없는 겁니다. 고급 탭에서는 크기를 크게. 로 설정하면 아무래도 자신의 블로그 가로 최대 폭이 나오는 듯 싶습니다. (제 블로그 가로 폭이 512입니다) 회전이나 대비 조정 등은 아무쪼록 편한대로 설정하시면 됩니다. 기타 옵션에서는 워터마크도 제공합니다.

마지막에 이미지 탭 아래쪽의 '현재 설정을 기본값으로 저장' 을 꾹 누질러 주십시오. 그러면, 두번째 사진부터는 알아서 잘 붙습니다. ^^

표도 잘 붙고, 지도를 붙이겠다고 하니 MS의 Virtual Earth가 뜨는군요. 도대체 PC에 얼마나 프로그램을 깔아 둔 것일까요. (무섭다)


어쨌든, 이미 깔린 몸이니, 써보기라도 합시다. 지도는 도로 지도와 위성 지도 두 가지를 제공합니다. 아무래도 비주얼이 핵심이니, 인공위성 지도로 해보죠. 도로 지도는 길찾기 글을 쓸 때는 유용할 듯도 합니다. 지도창이 작아 보이지만, 확대가 가능하니 자기가 찾는 지역까지 빨리 움직일 수 있습니다.

Posted by 나비:D
:

출처 : http://benepia.hosting.paran.com/tc/30

오랜시간동안 Beta 테스트를 거치고 마침내 정식판 Live Writers가 발표(2007.11.06)되었다.

http://windowslivewriter.spaces.live.com/

0001 

MS의 브랜드가 주는 신뢰감과 발전성을 고려해 볼 때,

앞으로 많은 분들이 이 원격 블로깅 툴을 사용할 것으로 예상된다.

한글판 인스톨러 다운로드 : http://g.live.com/1rewlive/ko/WLInstaller.exe

영문판 인스톨러 다운로드 : http://g.live.com/1rewlive/en/WLInstaller.exe

네이버등 많은 수의 블로거를 거느린 대형포탈은

원격블로깅이 가능하지 않은 환경을 고집한다.

물론 웹상으로 너무도 훌륭한 글쓰기 환경을 제공하고 있지만,

로컬상에 저장해 둘 수 있는 장점을 허락하지 않는 이유는,

쉬운 이주를 막기 위한 까닭일 것이다.


스마트에디터, 커뮤니티, 다양한 스킨을 비롯한 디자인에 이르기까지,

네이버의 블로그 서비스는 나무랄 데 없이 훌륭하다.

그럼에도, 많은 분들이 설치형 블로그나 티스토리로 이주하고 있는 것도 사실이다.

그들을 위해 어떤분께서 네이버 백업프로그램도 개발하신 것으로 안다.


웹의 초창기와 달리, 넷세상에서도 권리의식이 발전했고, 인식이 변화하고 있다.

제한과 제약이 없는 자유를 원하신다면, 설치형블로그로 가야겠지만,

글에 대한 권리를 보다 자유로이 행사하고, 백업과 이주의 자유를 보유하고 싶으시다면,

원격 API를 통한 글쓰기와 db백업이 가능한 티스토리( http://tistory.com )를 추천드리고 싶다.

Posted by 나비:D
:

unable to load SWC multiple points

Cairngorm Framework 강좌를 보면서 따라하기 했습니다...


하지만 아래와 같은 문구의 오류가 나더군요

unable to load SWC Cairngorm.swc: multiple points


구글검색도 해봤지만 영문 ㅡㅡ;;; 머 대충 네이버 툴바 이용해서 단어 하나씩 해결하면서 보니까


Here are the steps:

  1. Download the Cairngorm src .zip
  2. Unzip into a folder on your machine
  3. Import the .project file into Flex Builder
  4. Hit Project -> Clean for a nice clean build

요런 게 있더군요 하지만 이방법으로도 되지 않는다!


그러면 플렉스 버전 확인해보세요 ㅋㅋㅋ


테스트 환경이 노트북과, 데스크탑으로 했는데

노트북의 경우 플렉스 2.0.1 이였고

데스크탑의 경우 플렉스 2.0.1. 123.... 머시긴가 여튼 좀 길었습니다.


결과 노트북은 위와 같은 메시지가 뜨지 않터군요

데스크탑은 여전히 저런 메시지를 팍팍 뿌려 주면서 캔곰을 못 쓰게 만들고요 ㅡㅡ;;;


그래서 데스크탑의 플렉스 버전도 2.0.1로 바꿧습니다 ㅋㅋ 되내요 ㅋㅋㅋㅋ 야호 ㅋㅋㅋ


다른분들도 혹시 이런 메시지나 오류가 나면 플렉스 버전을 2.0.1로 마춰보세요 ㅡㅡV

플렉스 버전 2.0.1 에는 정상작동

플렉스 버전 2.0.1 14.. 머시기는 작동 불등

상위 버전은 모르겠음 ^^;;;

unable to load SWC Cairngorm.swc: multiple points

Flex Builder Version 2.0.1 !!!!

Version 2.0.1 14.... NO!!

Only Version 2.0.1!!

Posted by 나비:D
:
- 방법 1
<jsp:useBean id="year" scope="request" type="java.lang.String"/>
<jsp:useBean id="month" scope="request" type="java.lang.String"/>
<jsp:useBean id="last" scope="request" type="java.lang.Integer"/>
<jsp:useBean id="map" scope="request" type="java.util.Map<?,?>"/>
<jsp:useBean id="list" scope="request" type="java.util.List<com.acroem.undine.bean.Sensor>"/>

- 방법 2
String year = (String)request.getAttribute("year");
String month = (String)request.getAttribute("month");
Integer last = (Integer)request.getAttribute("last");
java.util.Map<?,?> map = (java.util.Map<?,?>)request.getAttribute("map");
java.util.List<?> list = (java.util.List<?>)request.getAttribute("list");

아직 어느방법이 좋다고 할순 없지만

방법 1의 경우에는 request 받을때 null이 들어 올 경우 오류가 발생함
방법 2의 경우에는 null이 와도 if문을 이용하여 null체크가 가능

아직 머가 좋다고 말 못하겠음 ㅋ
Posted by 나비:D
:

Collection, ArrayList, HashTable

 

Collection

1. Collection의 이해

1) 배열의 경우 인덱스를 사용하여 각 항목(element)에 접근하게 되는데, collection은 인덱스를 사용하지 않고 모든 element에 순차적으로 접근할 수 있는 방법을 제공하는거야.

2) element에 순차적으로 접근할 수 있도록 허용하는 객체의 집합이야.

3) 객체가 열거자(enumerator)라고 불리는 객체의 참조를 제공하면 collection이라 해.

4) 열거자는 collection 내의 항목을 순차적으로 액세스할 수 있어.

5) Foreach를 통해 객체내에 순차적으로 접근할 수 있도록 기능을 제공한다.

 

 

2. Collection의 동작

1) collection foreach 와 함께 사용될 때 foreach는 자동적으로 collection IEnumerable interface로부터 GetEnumerator() method를 호출

2) GetEnumerator() Ienumerable interface를 구현한 열거자 객체(enumerator object) return

3) foreach는 이 열거자 객체로부터 IEnumerable interface를 얻어 method(MoveNext(), Reset()) property(Current)를 호출

 

 

3. Custom Collection

 1) collection을 만들려면 System.Collections namespaceIEnumerable interface를 구현해야해.

IEnumerable interface

{

IEnumerable GetEnumerator();     //    열거자 객체를 반환

// 얘가 제공되어야지만 collection이라고 불릴 수 있는거야.

}

 2) 열거자 객체는 System.CollectionIEnumerable를 구현하는거야.

Interface IEnumerator

{

object Current { get; }  // Current 라는 프로퍼티는 get이라는 접근자만 제공하고 있어.

bool MoveNext();  

void Reset();

}

 

 

4. Custom Collection 작동모습

 1) IEnumerator를 구현한 class의 객체는 다음과 같이 작동을 구현해.

    (1) 객체 초기화시 어떤 element(항목) 가리키지 않음

(2) MoveNext method를 호출하여 첫번째 element로 이동.

(3) Current property를 통해 element를 뽑아내는거야.

    - Current property는 객체의 reference return하므로 이것을 찾고자 하는 객체의 형식으로 cast해서(안에 저장된 데이터의 타입으로) 필요한 작업을 수행

(4) MoveNext를 호출하여 다음 element로 이동

(5) 위 과정을 마지막까지 반복.

(6) Current property null return 하면 더 이상 접근할 항목이 없다는 의미

   (그래서 항상 루프를 돌릴 때 Current null인지 아닌지를 체크해야해)

(7) Reset method 를 호출하여 처음으로 돌아가거나 , 처리종료

(8) Reset 호출시에는 첫번째 element 의 이전을 가르키므로 MoveNext를 통해서 첫번째 항목으로 이동해서 순차적으로 접근을 해야해.

 

 

 

 

ArrayList

1. ArrayList의 이해

1) 객체를 배열로 만들어 사용하는데 유용한 기능을 제공

2) 확장성이 뛰어나 삽입/삭제/열거 등의 기능을 제공

3) 배열의 크기를 초기에 지정할 수 있어.

4) 정의된 크기를 초과하면 자동으로 크기를 늘려줘.

 

 

2. ArrayList Collection의 관계

1) ArrayList라는 자체가 IEnumerable interface를 통해서 구현된 클래스야. (상속을 받어)

  때문에 ArrayList GetEnumerator를 통해 열거자객체를 얻을 수 있어.

  (여기서도 foreach문을 사용할 수 있게 되는거야)

2) 이를 통해 순차적으로 ArrayList에 접근할 수 있어.

 

 

3. ArrayList 사용법

1) 생성 및 초기화

  ArrayList myAL = new ArrayList();   // ArrayList 생성

  myAl.Add(new Car(“그랜져”, 100000));    //  초기화, Car type data ArrayList에 저장

myAl.Add(new Car(“체어맨”, 200000));

myAl.Add(new Car(“포텐샤”, 300000));

 


 

2) ArryList 정보

  myAL.Count;  //  실제로 저장된 element

  int MaxSize = myAL.Capacity;     //  Capacity가 하는 일은 현재 ArrayList 총 크기 얻기지.

  myAL.Capacity = 20;   //   저장될 수 있는 총 용량 설정(default 16)

 

 

3) element(항목) 제거

  myAL.RemoveAt(1);   //  0부터 시작해서 지정된 요소를 제거, 1이면 두번째위치의 녀석이지

 

 

4) ArrayList를 배열로 변환

  - parameter를 배열로 전달해야 하는 경우에 사용(Type 변환 주의)

Car[] CarArray = new Car[myAL.Count];  //  저장될 배열 생성

for(int i=0; i<myAL.Count; i++) {     //   배열에 ArrayList 정보 저장

CarArray[i] = (Car)myAL[i];  // Car type으로 명시적 형변환하고 있어. 꼭 형변환해야해

}

foreach(Car i in CarArray) {    //  배열 출력

Console.WriteLine(“차종 : {0}, 가격 : {1}”, i.carName, i.carPrice);

}

 

 

 

 

 

HashTable

1. HashTable의 이해

1) 특정 Key 값에 의해 element에 접근할 수 있도록 고안된 데이터 구조

2) 어떠한 형태의 객체든 저장이 가능해(ArrayList도 가능해)

  Hashtable hash1 = new Hashtable();    //  HashTable 객체 선언

 

  Hash.Add(“847361”, “홍길동”);    //  Add method를 통한 등록

Hash.Add(“127561”, “박길동”);   // 첫번째가 키값, 두번째가 항목에 들어갈 데이터

Hash.Add(“887261”, “김길동”);

Hash.Add(“234561”, “이길동”);   

 

    foreach (string item1 in hash1.Keys) {   //  key data type에 의한 foreach 출력

           // 위에 놈은 위 string인가. 그건 홍길동의 type string이기 때문이야

      Console.WriteLine(item1 + “    “ + hash1[item1]);

}

 

Collection, ArrayList, HashTabled 의 공통점은?

    비슷한 특징이 있어. 객체를 배열로 묶어서 저장하고 그 배열에 대해서 순차적으로 foreach문을 통해서 자동적으로 접근할 수 있도록 기능을 제공하고 있지.

 

--------------------------------------------------------------------------------------------------------------

, 이제 예문을 통해 알아보자.

 

■ Collection

 

using System;


// 기본적인 기능을 가지고 있는 Collection를 만들어볼꺼야 #################
class MyCollection
{

 // 보통은 private로 많이 하나 예제니 간단하게 public으로 만들자
 public int[] items;     //   배열 생성
 int nIndex = -1;         //   변수 생성

 MyCollection collection;  // 변수 생성..... 안에서 items를 계속 접근할려고 만들었어.


 //  생성자에서는 collection에다가 현재객체를 담도록 지정해볼꺼야.
 public MyCollection()
 {
  collection = this; //  여기에는 Reference가 담기게 되는거야.
 }


 public MyCollection GetEnumerator()
 {
  return this;  //   MyCollection를 리턴하도록 설정했어. 
 }


 //   이 MoveNext를 통해 이동하고 Current를 통해 데이터를 뽑아내는거야.
 public bool MoveNext()
 {
  nIndex++;
  return(nIndex < collection.items.GetLength(0));
   //   배열에 접근할 수 있는 배열첨자의 역할을 int type변수
 }


 public void Reset()
 {
  // nIndex 배열을 초기화해줄것
  nIndex = -1;
 }


 public int Current
 {
  get { return(collection.items[nIndex]); }
 }
}


// ######################################################


class MyClass
{
 public static void Main()
 {
  // 위에서 Collection을 만들었으니 객체를 만들어서 순차적으로 접근해보자.
  MyCollection col = new MyCollection();
  col.items = new int[5]{11, 33, 22, 55, 44};      
  //  5개의 int type Array 생성

  // 콜렉션같은 경우는 foreach문을 통해 순차적인 접근이 가능해.
  foreach(int i in col)
  {
   Console.WriteLine(i);
  }

 }
}


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒


■ ArrayList

 

 // 학습목료
// : 학교에 등교하는 학생의 정보를 저장해볼꺼야.

using System;
using System.Collections; // -> 이 부분을 참조했어. (네임스페이스)

 

class Student
{
 // 멤버들을 기술할꺼야. 예제를 위해 public으로 구성할꺼야.
 public string name; // 학생 이름
 public int no;      
   //  학생 번호

 

 // ###생성자를 생성###
 public Student(){}


 public Student(string name, int no)
 {
  this.name = name;       // 초기화
  this.no = no;          
   // 초기화
 }
}


class Myschool
{
 public static void Main()
 {
  // 나왔다. ArrayList ~
  ArrayList myAL = new ArrayList();


  // 어짜피 레퍼런스타입으로 저장되기에 new를 사용했어.
  myAL.Add(new Student("홍길동", 20));      //  학생 객체를 Array를 통해 생성
  myAL.Add(new Student("지니진", 10));
  myAL.Add(new Student("이순신", 30));


  // 홍길동을 삭제할꺼야~
  myAL.RemoveAt(0);



  // 그럼 출력해보자.
  // 현재는 Student type Data를 가지고 있어. 우리는 ArrayList 자체가 아니라 Student 객체에 대한 데이트들.
  // 그래서 Student type으로 변환해야해.
  for(int i=0; i<2; i++)
  {
   // 여기서 Student type으로 형변환을 해줄꺼야
   Console.WriteLine("이름 : {0}, 번호 : {1}", ((Student)myAL[i]).name, ((Student)myAL[i]).no);
  }



  Console.WriteLine();

  // 이번에는 배열로 바꿔보자. -------------------------------------------------------------------------------------------
  // Student 라는 클래스에 데이터가 들어가 있어.  배열로 Student type으로 배열로 만들꺼야.
  Student[] StudentArray = new Student[myAL.Count];  // 객수만큼 만들어.. 2인 배열이 생성되겠지

  // for문을 통해서 알아보자
  for(int i=0; i<myAL.Count; i++)
  {
   // Student Array 에 Student type으로 저장하는거야.
   // 파라미터나 foreach문으로 출력이 가능해

   StudentArray[i] = (Student)myAL[i];
  }


  foreach(Student i in StudentArray)
  {
   Console.WriteLine("이름 : {0}, 번호 : {1}", i.name, i.no);
  }


 }
}



▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒


■ HashTable

 

// 학습목료
// : 학교에 등교하는 학생의 정보를 저장해볼꺼야.



// ArrayList 같은경우 아이이뉴멀오프 인터페이스를 실제로 구현하면
// foreach문을 통해 접근할수 있어.

using System;
using System.Collections; // -> 이 부분을 참조했어. (네임스페이스)


class MyHashTable
{
 public static void Main()
 {
  // 배열같은 경우는 인덱스값이 int type만 가능하나 해쉬 테이블을 달라
  // 문자열이나 기타 다른 타입으로도 가능하다는 거야.

  Hashtable hash1 = new Hashtable();


  hash1.Add("111111", "홍길동");   // 앞이 키값, 뒤가 항목
  hash1.Add("222222", "임꺽정");
  hash1.Add("333333", "이순신");

 

  // 그럼 출력해보자
  foreach(string item in hash1.Keys)
  {
      Console.WriteLine(item + "         " + hash1[item]);
  }



  // 항목을 삭제해보자.
  hash1.Remove("222222");
  foreach(string item in hash1.Keys)
  {
   Console.WriteLine(item + "         " + hash1[item]);  // 임꺽정이 지워진것을 알수있어.
  }


 }
}


▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

Posted by 나비:D
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :