Tuesday, December 30, 2008
Pasta
2008년 마지막 날
Sunday, December 28, 2008
크리스마스 만찬
Casillero del Diablo 2006
(It's up to the each wine aged method.)
Robert Mondavi Woodbridge 2006
Tuesday, December 23, 2008
오늘부터 The end of the year holiday season
Sunday, December 21, 2008
스파게티
Saturday, December 20, 2008
Hardys VR Cabernet Sauvignon 2007
---------------------------------------------
Jacob's Creek Grenache Shiraz Vintage 2007
테팔, 와인, 요리
Friday, December 19, 2008
boost::asio - Network Library modified by Terry - 3
client 부분임.
client 특징:
- 거의 모든 기능이 session 에 들어가 있기 때문에 초 간단함.
- connect 를 async / blocking 두 가지 모두 지원하지만 blocking 을 추천.
- 기본적으로 ioservice 가 iocp 를 사용하기 때문에, thread 를 돌림.
- 사용하는 쪽에서는 끝날 때까지 loop 돌려주다가 join 호출해서 종료하면 됨.
client.h
#pragma once
#ifndef _ASIO_CLIENT_H_
#define _ASIO_CLIENT_H_
#include "session.h"
class asio_client
{
private:
boost::asio::io_service& io_service_;
tcp::resolver::iterator endpoint_iterator_;
session_ptr session_;
boost::thread t_;
void* cb_class_;
cb_connect cb_connect_;
bool started_;
public:
asio_client(boost::asio::io_service& io_service, tcp::resolver::iterator endpoint_iterator) :
io_service_(io_service), endpoint_iterator_(endpoint_iterator),
cb_class_(0), cb_connect_(0),
started_(0)
{
session_ptr new_session(new session(io_service));
session_ = new_session;
//connect();
}
void connect()
{
tcp::endpoint endpoint = *endpoint_iterator_;
session_->socket().async_connect(endpoint,
boost::bind(&asio_client::handle_connect,
this,
boost::asio::placeholders::error,
++endpoint_iterator_)
);
}
void connect_blocking()
{
boost::system::error_code error;
session_->socket().connect(*endpoint_iterator_, error);
if(error)
{
cerr << "Error! failed to connect to a patch server : << " << started_ =" true;" started_ ="="" t_ =" boost::thread(boost::bind(&boost::asio::io_service::run," started_ ="="" cb_class_ =" cb_class;" cb_connect_ =" f_connect;">set_callback(cb_class, f_parser);
}
protected:
void handle_connect(const boost::system::error_code& error, tcp::resolver::iterator endpoint_iterator)
{
if(error)
{
cerr << "\n -Error- failed to connect to a patch server : << " <<>do_async_read();
}
void do_close()
{
cout << "Close socket" <<>socket().close();
}
};
typedef boost::shared_ptrasio_client_ptr;
#endif//_ASIO_CLIENT_H_
Monday, December 15, 2008
boost::asio - Network Library modified by Terry - 2
session 부분임.
session 특징:
- TCP session. Server / Client 모두 다 사용.
- 접속하였을 때와 패킷을 받았을 때 콜백 호출. 나머지 필요하면 그때 새로운 콜백 추가.
- ReadBuffer 를 그냥 packet_parser 콜백에 넘기기 때문에, 더 좋은 성능을 이끌어 내고 싶으면
- packet_parser 콜백 받는 부분에서 버퍼를 복사한 후 다른 쓰레드로 넘겨서 처리해야 함.
- packet_parser 부분이 길어지게 되면 당연히 async_read 를 늦게 걸 수 밖에 없기 때문에 성능이 저하됨.
- 에러처리는 기본적인 것만 되어 있음.
session.h
#pragma once
#ifndef _SESSION_H_
#define _SESSION_H_
#include "structure.h"
#include
#include
using boost::asio::ip::tcp;
using namespace std;
class session;
typedef boost::shared_ptrsession_ptr;
typedef boost::functioncb_boost_func;
typedef bool (*cb_packet) (void* cb_class, packet_ptr p, session_ptr s);
typedef bool (*cb_connect) (void* cb_class, session_ptr s, const boost::system::error_code& error);
class session : public boost::enable_shared_from_this
{
private:
tcp::socket socket_;
data_buffer read_buffer_;
data_buffer write_buffer_;
bool authorized_;
void* cb_class_;
cb_packet parse_packet_;
public:
session(boost::asio::io_service& io_service) :
socket_(io_service), authorized_(0), cb_class_(0), parse_packet_(0)
{
}
virtual ~session() {;}
tcp::socket& socket() { return socket_; }
bool get_authorized() const { return authorized_; }
void set_authorized(bool value) { authorized_ = value; }
void start()
{
do_async_read();
}
void send_packet(packet_ptr packet)
{
// check a packet size
if(packet->body_length_ > max_body_size)
{
cerr << "\n -Error- packet size is too large : " << packet->body_length_ << "\n";
return;
}
do_async_write(packet);
}
void set_callback(void* cb_class, cb_packet cb_func)
{
cb_class_ = cb_class;
parse_packet_ = cb_func;
}
void do_async_read()
{
// read only header
boost::asio::async_read(socket_,
boost::asio::buffer(read_buffer_.data_.begin(), header_size),
boost::bind(&session::do_async_read_body,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
);
//socket_.async_read_some(
// boost::asio::buffer(read_buffer_.data_.begin(), max_packet_size),
// boost::bind(&session::handle_read,
// shared_from_this(),
// boost::asio::placeholders::error,
// boost::asio::placeholders::bytes_transferred)
// );
}
void do_async_read_body(const boost::system::error_code& error, size_t bytes_transferred)
{
if(error)
{
if(bytes_transferred == 0)
cerr << "\n -Close socket. \n";
else
cerr << "\n -Error- do_async_read_body (" << error.message() << ")\n";
// close this socket
this->socket_.close();
return;
}
packet_header header;
memcpy(&header, static_cast(read_buffer_.data_.begin()), header_size);
// read body
boost::asio::async_read(socket_,
boost::asio::buffer(&read_buffer_.data_[header_size], header.body_length_),
boost::bind(&session::handle_read,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
);
}
void do_async_write(packet_ptr packet)
{
memcpy((void*)&write_buffer_.data_[0], (void*)static_cast(packet.get()), header_size);
memcpy((void*)&write_buffer_.data_[header_size], (void*)packet->data_, packet->body_length_);
boost::asio::async_write(socket_,
boost::asio::buffer(write_buffer_.data_.begin(), header_size + packet->body_length_),
boost::bind(&session::handle_write,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
);
}
protected:
void handle_read(const boost::system::error_code& error, size_t bytes_transferred)
{
if(error)
{
cerr << "\n -Error- handler_read (" << error.message() << ")\n";
// close this socket ?
return;
}
cout << "\nhandle_read : bytes_transferred " << bytes_transferred << " bytes" << endl;
if(bytes_transferred == 0)
{
// normal close.
return;
}
if(bytes_transferred > max_packet_size)
{
cerr << "\n -Error- handler_read : too many transferred bytes (" << bytes_transferred << ")\n";
return;
}
packet_header* header = reinterpret_cast(read_buffer_.data_.begin());
if(!header || header->body_length_ <= 0 || header->body_length_ > max_body_size)
{
assert(header);
cerr << "\n -Error- handler_read : abnormal error read buffer" << std::endl;
return;
}
packet_ptr packet(new packet);
packet->index_ = header->index_;
packet->body_length_ = header->body_length_;
packet->data_ = new char[packet->body_length_];
memcpy(packet->data_, (void*)&read_buffer_.data_[header_size], packet->body_length_);
// invoke a callback function
if(parse_packet_(cb_class_, packet, shared_from_this()) == false)
{
cerr << "\n -Error- handler_read : packet_parse returned false. socket closed." << std::endl;
socket_.close();
return;
}
// do an asynchronous read again
do_async_read();
}
void handle_write(const boost::system::error_code& error, size_t bytes_transferred)
{
#ifdef _DEBUG
cout << "\nhander_write bytes transferred : " << bytes_transferred << " bytes" << endl;
#endif
// do nothing.
}
};
#endif//_SESSION_H_
Saturday, December 13, 2008
20대 나와 함께 했던 사람들
칠리크랩, 클라키, 삼겹살
Wednesday, December 10, 2008
The Dark Knight
To do
Monday, December 8, 2008
Nottage Hill Cabernet Shiraz 2007
떡볶이
Sunday, December 7, 2008
경사
Friday, December 5, 2008
boost::asio - Network Library modified by Terry - 1
코드의 확장이 제대로 된 예제가 전혀 없어서,
내 입맛에 맞게끔 수정을 가해서 쓰고 있다.
매우 간단하지만, 상당히 잘 동작하는 편이여서 마음에 든다.
소스가 다 나열하기에는 조금 길어서 5~6 번 정도에 나누어서 올릴 계획.
첫번째는 기본이 되는 packet structure 정의.
주요 특징:
- boost::asio network library 에서 사용하기 불편한 점을 보완.
- 각 socket 마다 꽤나 큰 read / write buffer 를 들고 있음.
- buffer 구조가 매우 단순하므로 mmo 에 당장 사용하기에는 무리가 있음.
- 현재 잘 동작하고 있지만, buffer 에 문제가 생기면 allocator 를 도입할 에정.
- client 연결이 많고 mmo 처럼 패킷 받은 후에 처리해야할 양이 많은 경우, packet parse 용 thread 를 따로 만들어서 동작시키는 것이 당연함!
- callback 을 boost::function 을 사용해서 좀 세련되게 하고 싶었으나, object 를 넘기는 과정에서 계속 complie error 가 발생.
- 시간관계상 그냥 C style callback 유지. 귀찮아서 다시 function 작업은 안해봤음. :)
structure.h
#include
#include
#include
#include
struct packet_header
{
unsigned short index_;
unsigned short body_length_;
packet_header() : index_(0), body_length_(0) {}
};
struct packet : public packet_header
{
char* data_;
packet() : data_(0) {}
~packet() { if(data_) delete [] data_; }
};
const int header_size = (int)sizeof(packet_header);
const int max_body_size = 1024; // If you need more size, just edit this!!!
const int max_packet_size = header_size + max_body_size;
struct data_buffer
{
boost::arraydata_;
};
typedef boost::shared_ptrpacket_header_ptr;
typedef boost::shared_ptrpacket_ptr;
typedef boost::shared_ptrdata_buffer_ptr;
C# Client Network Library
아직 테스트 중이고, 살펴보면 허술한 부분도 많지만
뭐 간단하게 동작하는 데는 큰 문제 없음.
주요 특징 :
- Async 를 걸고 IOCP 에서 return 받는 간단한 구조.
- 방식은 proactor 이지만 thread 가 하나이기 때문에 뭐라 지칭하긴 그렇고, 그냥 비동기 콜임. :)
- boost::asio 를 많이 모방했음. 그래서 함수 이름이나, packet 을 읽는 방식이 거의 같음. -0-;
- connect 는 sync, send/recv 는 async.
Packet type - namespace Protocol
namespace Protocol
{
public struct packet_header
{
public System.UInt16 index_;
public System.UInt16 body_length_;
}
public struct packet
{
public packet_header h_;
public System.Byte[] data_;
}
public class packet_size
{
public static readonly int header_size;
public static readonly int max_body_size;
public static readonly int max_packet_size;
static packet_size()
{
header_size = Marshal.SizeOf(typeof(packet_header));
max_body_size = 1024;
max_packet_size = header_size + max_body_size;
}
}
}
Network Library - namespace NetworkLib
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using Protocol;
namespace network_lib
{
public class packet_args : EventArgs
{
private packet p_;
public packet_args(packet p)
{
p_ = p;
}
public packet data
{
get { return p_; }
}
}
public delegate void packet_event(object sender, packet_args p);
class packet_parse
{
public event packet_event e_;
public void do_packet_parse(packet p)
{
if (e_ != null)
e_(this, new packet_args(p));
}
}
public class client_session
{
#region Private Variables
private string ip_;
private string port_;
private Socket client_socket_;
private packet read_packet_;
private Byte[] read_buffer_;
private Byte[] write_buffer_;
private IAsyncResult result_;
private AsyncCallback cb_async_read_body_;
private AsyncCallback cb_handle_read_;
private AsyncCallback cb_handle_write_;
private packet_parse event_packet_;
#endregion
#region Constructors
public client_session()
{
init();
}
public client_session(string ip, string port)
{
ip_ = ip;
port_ = port;
init();
}
#endregion
#region Properties
public string IP
{
get { return ip_; }
set { ip_ = value; }
}
public string Port
{
get { return port_; }
set { port_ = value; }
}
public bool connected
{
get { return (client_socket_ != null) ? client_socket_.Connected: false; }
}
#endregion
#region Public Methods
public void add_packet_event(packet_event h)
{
event_packet_.e_ += h;
}
public void connect()
{
try
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(ip_), System.Convert.ToUInt16(port_));
client_socket_ = new Socket(System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Stream,
System.Net.Sockets.ProtocolType.Tcp);
client_socket_.Connect(ip);
if (client_socket_.Connected)
do_async_read();
}
catch (SystemException se)
{
MessageBox.Show(se.Message);
}
}
public void disconnect()
{
if (connected)
client_socket_.Disconnect(false);
}
public void do_async_read()
{
try
{
// do_async_read_head
result_ = client_socket_.BeginReceive(read_buffer_,
0,
packet_size.header_size,
SocketFlags.None,
cb_async_read_body_,
read_buffer_);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
public void do_async_write(packet p)
{
try
{
packet_header heaer = p.h_;
System.Byte[] buffer = raw_serialize_ex(heaer);
buffer.CopyTo(write_buffer_, 0);
p.data_.CopyTo(write_buffer_, packet_size.header_size);
// do_async_write
result_ = client_socket_.BeginSend(write_buffer_,
0,
packet_size.header_size + p.h_.body_length_,
SocketFlags.None,
cb_handle_write_,
write_buffer_);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
// copied from group.google.com
public object raw_deserialize_ex(byte[] rawdatas, Type anytype)
{
int rawsize = Marshal.SizeOf(anytype);
if (rawsize > rawdatas.Length)
return null;
GCHandle handle = GCHandle.Alloc(rawdatas, GCHandleType.Pinned);
IntPtr buffer = handle.AddrOfPinnedObject();
object retobj = Marshal.PtrToStructure(buffer, anytype);
handle.Free();
return retobj;
}
// copied from group.google.com
public byte[] raw_serialize_ex(object anything)
{
int rawsize = Marshal.SizeOf(anything);
byte[] rawdatas = new byte[rawsize];
GCHandle handle = GCHandle.Alloc(rawdatas, GCHandleType.Pinned);
IntPtr buffer = handle.AddrOfPinnedObject();
Marshal.StructureToPtr(anything, buffer, false);
handle.Free();
return rawdatas;
}
#endregion
#region Private Methods
private void init()
{
client_socket_ = null;
cb_async_read_body_ = new AsyncCallback(do_async_read_body);
cb_handle_read_ = new AsyncCallback(cb_handle_read);
cb_handle_write_ = new AsyncCallback(cb_handle_write);
read_packet_.data_ = new System.Byte[packet_size.max_body_size];
read_buffer_ = new System.Byte[packet_size.max_packet_size];
write_buffer_ = new System.Byte[packet_size.max_packet_size];
event_packet_ = new packet_parse();
}
private void do_async_read_body(IAsyncResult r)
{
try
{
int bytes_transferred = client_socket_.EndReceive(r);
if (bytes_transferred == 0)
{
// normal close
return;
}
if (bytes_transferred != packet_size.header_size)
{
MessageBox.Show(" !Error - invalid received header size : " + bytes_transferred);
return;
}
packet_header header;
System.Byte[] header_buffer = new System.Byte[packet_size.header_size];
System.Buffer.BlockCopy(read_buffer_, 0, header_buffer, 0, packet_size.header_size);
header = (packet_header)raw_deserialize_ex(header_buffer, typeof(packet_header));
read_packet_.h_.index_ = header.index_;
read_packet_.h_.body_length_ = header.body_length_;
// do_async_read_body
result_ = client_socket_.BeginReceive(read_buffer_,
packet_size.header_size,
header.body_length_,
SocketFlags.None,
cb_handle_read_,
read_buffer_);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
private void cb_handle_read(IAsyncResult r)
{
try
{
int bytes_transferred = client_socket_.EndReceive(r);
if (bytes_transferred > packet_size.max_body_size)
{
MessageBox.Show(" !Error - invalid received body size : " + bytes_transferred);
return;
}
System.Buffer.BlockCopy(read_buffer_, packet_size.header_size, read_packet_.data_, 0, bytes_transferred);
// parse packet
event_packet_.do_packet_parse(read_packet_);
// do_async_read
do_async_read();
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
private void cb_handle_write(IAsyncResult r)
{
int bytes_transferred = client_socket_.EndSend(r);
string msg = "packet has been sent. bytes : " + bytes_transferred + "\n";
}
#endregion
}
}
책 구입
배송비 포함해서 무려 US$115.63 !!!!
현재 환율로 계산하면
115.63 * 1,475.50 = 163,905.525 원
아. 겁나 비싸다. -_-;;;
결국에 한국 환율로 계산해서 통장에서 빠져나가는데...
싱가폴에서 신용카드를 하나 만들긴 해야겠다.
그래야 조금이라도 아낄 수 있을 듯.
Wednesday, December 3, 2008
Monday, December 1, 2008
The end of the probation
Saturday, November 29, 2008
Palo Alto Reserva 2006
Gato Negro 2007
Argento Malbec 2006
French Cellars Merlot 2007
Thursday, November 27, 2008
오늘의 생활영어
시간이 좀 오래결렸다.
It took long time.
아주 간단한 문장이 아니던가!
하지만 팀 리드인 Ross 는 못 알아듣겠다는 표정을 지어주었다.
어째서? 뭐때메?? 다시 천천히 또박또박 말했더니, 그제서야 알아 들은 Ross.
생각을 좀 해보니깐 아마 Ross 는
It took wrong time.
으로 알아들은 것 같다.
한국인의 발음상 l, r 을 구별해서 발음하는 것은 쉬운일이 아니다.
물론, 의식적으로 확연히 구별해서 말하거나, 이미 혀가 구부러져서 발음을 잘하거나 하면 모르지만
문장안에서 부드럽게 사용하기에는, 나같은 초보자로서는 여간 어려운 일이 아닐 수 없다.
그렇다면 대안은??
It took a lot of time.
It took lots of time.
으로 처리해버리자.
a lot of ~ / lots of ~ 는 Western 인들도 상당히 많이 사용한다.
아마 혼동을 주지 않기 때문일 듯 싶다. 단수 복수 구별도 안하고. 발음도 쉽고.
한국에서 영어를 배울 때 a lot of ~ / lots of ~ 는 many / much 보다 priority 가 떨어져 있다.
하지만, 실제 회화에서는 전자를 더 많이 사용하는 것 같다.
C# 에서 파일 읽기
// Open the stream and read it back.
using (FileStream fs = File.OpenRead(path))
{
byte[] b = new byte[1024];
UTF8Encoding temp = new UTF8Encoding(true);
while (fs.Read(b,0,b.Length) > 0)
{
Console.WriteLine(temp.GetString(b));
}
}
using (FileStream fsSource = new FileStream(pathSource,
FileMode.Open, FileAccess.Read))
{
// Read the source file into a byte array.
byte[] bytes = new byte[fsSource.Length];
int numBytesToRead = (int)fsSource.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to numBytesToRead.
int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
// Break when the end of the file is reached.
if (n == 0)
break;
numBytesRead += n;
numBytesToRead -= n;
}
}
Wednesday, November 26, 2008
Terminator 4 Flash Poster
Christian Bale!!!
Tuesday, November 25, 2008
Fairview Stellenbosch Merlot 2006
망했음...
Sunday, November 23, 2008
생일 때 갔던 와인집
대충 이렇게 생긴 곳임.
벽에는 와인이 나라별로 정렬되어 있음.
잠시 정신줄을 놓은....
야외에 있던 자리. 분위기는 끝내주었음.
그나마 멀쩡하게 나온 사진 :)
Saturday, November 22, 2008
Lupo Nero
Jacob's Creek Shiraz Vintage 2006
Thursday, November 20, 2008
와인 레퍼런스 시작
Tuesday, November 18, 2008
블로그의 대전제
글 하나 쓸 때에도 무언가 남에게 보여주어야 한다는 강박관념.
물론, 혼자 잡담도 많이 쓰고 그랬지만
예전에 게시판으로 홈페이지를 운영할 때와는 느낌이 많이 다르다.
아마 인터넷에 있는 Tech 쪽 블로그 들이 정보 전달이 주된 목적이고,
개인 블로그를 그런 용도로 사용하는 사람들도 꽤나 많아서
나도 그러한 압박을 계속 받아온 듯 하다.
이렇게 되면 문제가, 글 하나 쓸 때마다 번거롭고 거추장스럽다 보니
자연스럽게 안쓰게 된다. 무언가 전달할 내용이 없을 때에는.
그런데, 블로그란 게 무엇인가.
이름 그대로 log 아니던가. 자신의 생각, 일, 일상 등 사소한 것을 기록하는 것이다.
log 는 기록. 그게 정보가 되었던 쓰레기가 되었던 log 는 기록.
(서버에서 남기는 대부분의 log 는 garbage 가 됨. 응??) 암튼
'나는 그 동안 대전제를 잊고 있었다.'
'농구는 좋아하나?'
- 남훈, 노선생. 풍전고등학교.
블로그의 대전제를 잊지 말고 내 삶을 logging 하는 일을 다시 열심히 해 주어야 겠다.
Sunday, November 16, 2008
느린 것들은 안녕
Wednesday, November 12, 2008
C#, Managed C++ 참고 자료
C# 레퍼런스 모음.
C/C++ 을 하다가 C# 으로 추가 개발을 하려는 사람에게 꼭 필요한 것들을 모아봤음.
직접 해보면서 삽질한 내용임.
C# eBook
http://www.bestsoftware4download.com/software/t-free-c-school-ebook-download-llijghlw.html
http://www.pnasoft.com/archive/2008/01/11/pro-csharp-2008-and-the-net-3-5-platform-4th-edition.aspx
C++ / CLI, Managed C++ eBook
http://int6.net/ebook/Expert.Cpp.Cli.NET.pdf
C# memcpy (링크를 까먹어서 -_- 코드로 대체)
// copied from group.google.com
public object raw_deserialize_ex(byte[] rawdatas, Type anytype)
{
int rawsize = Marshal.SizeOf(anytype);
if (rawsize > rawdatas.Length)
return null;
GCHandle handle = GCHandle.Alloc(rawdatas, GCHandleType.Pinned);
IntPtr buffer = handle.AddrOfPinnedObject();
object retobj = Marshal.PtrToStructure(buffer, anytype);
handle.Free();
return retobj;
}
// copied from group.google.com
public byte[] raw_serialize_ex(object anything)
{
int rawsize = Marshal.SizeOf(anything);
byte[] rawdatas = new byte[rawsize];
GCHandle handle = GCHandle.Alloc(rawdatas, GCHandleType.Pinned);
IntPtr buffer = handle.AddrOfPinnedObject();
Marshal.StructureToPtr(anything, buffer, false);
handle.Free();
return rawdatas;
}
Block Copy
http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx
Byte[] to String
System.Text.Encoding.UTF8.GetString(...);
String to Byte[]
ASCIIEncoding.UTF8.GetBytes(...);
[Managed C++] System::String^ <-> std::string
http://www.codeguru.com/forum/showthread.php?p=1722705#post1722705
UI Invoke (다른 Thread 에서 ui 를 업데이트 하려면 invoke 를 거쳐가야함.)
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.invoke.aspx
i.e.) this.Invoke(new _set_btn_enable_delegate(_set_btn_enable));
Property Grid
http://msdn.microsoft.com/en-us/library/aa302326.aspx
XML Serializer
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx
CRC32, MD5, SHA1
http://www.vbaccelerator.com/home/net/code/Libraries/CRC32/article.asp
http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1cryptoserviceprovider.aspx
Native C++ <-> Unmanaged C++ <-> C#
http://sj21.wo.to/tt/483
http://sj21.wo.to/tt/484
http://blogs.msdn.com/junfeng/archive/2006/05/20/599434.aspx
Application 정보는 System.Application
Environment 정보는 System.Environment
다른 Application 실행시키려면
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx
일단 이정도.
위의 내용만 잘 숙지해도, 기본적인 개발은 할 수 있음.
Tuesday, November 11, 2008
Normal story in Singapore
The road in front of my office.