공부할게 생겼네...
http://dotnet.github.io/orleans/
2015년 7월 17일 금요일
소프트웨어 아키텍트가 알아야 할 97가지 (작성중)
소프트웨어 아키텍트가 알아야할 97가지
1. 고객의 요구사항보다 여러분의 이력에 더 우선순위를 두지말라.
=> 자신의 이력서를 최신 기술로 채우기 보다는 고객이 만족할 수 있는 기술을 택하라.
=> 그것이 고객, 개발자 및 본인이 행복해지는 지름길이다.
2. 본질적인 복잡성을 단순화시키고 예상치 못한 복잡성을 줄여라.
=> 문제자체가 가지고 있는 복잡성, 그것이 본질적인 복잡성이다.
=> 이를 단순화해서 문제를 풀더라도 적합하지 않는 방식으로 복잡성을 더하는우를 범하지 말라.
3. 가장 큰 문제는 기술이 아니다.
=> 문제를 푸는 인력 최고의 기술혁신, 그것은 대화
4. 소통이 왕이라면, 명확성과 리더십은 그의 신하이다.
=> 결국 사람의 일이다. 명확하게 처리하고 사람들을 이끌어라.
5. 애플리케이션 아키텍처는 애플리케이션 성능을 결정한다.
=> 튜닝은 기본이 된 상태에서 유효하다. 잘못된 아키텍처는 결국 재설계를 요구한다.
6. 요구된 기능에서 가치 추구하기
=> ...
2015년 6월 29일 월요일
개발자에게 부탁하라.
zdnet Korea에서 꾸준히 보고 있는 컬럼, 특히 임백준씨의 글은 공감가는 내용이 많다.
그 중에 최근에 올라온 컬럼 중 하나인 "개발자에게 부탁하라"는 최근의 나의 상황이 많이 반영된 탓인지 어느 글보다 더 공감이 되는 내용이다.
"개발자에게 부탁하라(전문)"
신문사들이 위기를 겪고 있다. 신문사로 향하는 트래픽이 현저히 줄어들고 있기 때문이다. 여기에서 트래픽은 웹사이트나 콘텐츠를 이용하는 사람들의 수를 의미한다. 한국에서 발생하는 인터넷 트래픽은 네이버를 정점으로 하는 소수의 포털 사이트가 독차지한지 오래되었다. 신문사들이 설 땅은 별로 없다.
트래픽의 흐름을 살펴보면 전통적인 언론사들이 힘을 잃는 양상이 그대로 드러난다. 조선, 중앙, 동아, 한겨레, 경향과 같은 신문사는 자신의 힘으로 트래픽을 발생시키지 못한다. 그들이 생산하는 기사나 콘텐츠가 대부분 포털을 통해서 소비되기 때문이다. 콘텐츠는 신문사가 생산하지만 트래픽은 포털로 몰린다. 과거에 신문 헤드라인이 수행하던 기능을 이제는 실시간 검색어가 대신하고 있다.
랭키 닷컴에 따르면 2011년 11월에는 트래픽 상위 10등 안에 2개의 신문사가 포함되어 있었고, 상위 30등 안에는 6개가 포함되어 있었다. 하지만 4년 후인 2015년 5월에는 상위 10등 안에 단 1개의 신문사도 없고, 경제지를 제외하면 30등 안에 2개의 신문사가 포함되어 있을 뿐이다. 가장 순위가 높은 조선닷컴이 16~19등이다.
자본주의 사회에서 트래픽은 광고와 직결된다. 풍부한 트래픽은 높은 광고수입을 의미하고, 빈곤한 트래픽은 낮은 광고수입을 의미한다. 그래서 트래픽은 돈이다. 종이 신문을 보는 사람이 거의 없고, 신문사 사이트를 방문하는 사람도 별로 없는 요즘에는 신문사들이 광고수입을 올리기 어렵다. 신문사에 광고를 주는 기업은 실제로 광고효과를 기대해서가 아니라 만약의 경우를 위한 보험의 의미로 광고를 줄 뿐이다.
다른 나라도 마찬가지다. 미국에서는 100년이 넘는 유수한 역사를 자랑하던 신문사들이 속속 문을 닫고 있다. 신문사가 문을 닫았다는 뉴스는 이제 뉴스가 되지 않는다. 유력지의 하나인 워싱턴 포스트가 아마존에게 팔린 것은 힘의 방향이 어디를 향하고 있는지 보여주는 사례다. 뉴욕타임스는 직원 수를 줄이며 회사 전체를 인터넷과 모바일 중심으로 재편하기 위해 노력하고 있다.
갈수록 힘을 잃는 우리나라의 신문사들은 문제를 해결할 방법을 찾지 못하고 있는 것처럼 보인다. 해외에 있는 소프트웨어 회사에게 외주를 맡기기도 하고, 모바일 중심의 전략을 강조하기도 하지만 개편의 수준은 홈페이지 레이아웃의 재편성 수준을 벗어나지 못한다. 모든 신문사의 속사정을 알지 못하기 때문에 단언하기 어렵지만, 적어도 내가 관찰한 바에 의하면 그렇다.
이유는 간단하다. IT를 비용으로 보는 시각을 바꾸지 못하기 때문이다. 컴퓨터 프로그래밍을 그 자체로 비즈니스로 생각하지 않고 단순한 도구로 바라보기 때문이다. 기자는 독자를 위해서 일하고, 프로그래머는 그런 기자들을 위해서 PC를 고치는 사람 정도로 생각한다. 신문사를 특정해서 이야기하고 있지만 사실은 모든 업계에 공통적인 이야기다. 인터넷, 디지털, 모바일, 소프트웨어 시대에서 주인공은 개발자다. 당연한 일이다. 주인공에게 단역을 맡겨놓고 작품을 만들려고 하니 작품이 나오지 않는 것이다.
한국에 있는 수많은 회사들이 안고 있는 문제의 하나는 PC와 프린터를 고치고 LAN을 연결하는 일을 소프트웨어 개발과 혼동한다는 점이다. 그런 일을 폄하하는 것이 아니다. PC를 수리하는 일과 소프트웨어를 개발하는 일이 타자기를 수리하는 일과 타자기를 쳐서 기사를 작성하는 일만큼이나 다르다는 사실을 말하는 것이다.
신문사가 인터넷과 모바일을 중심으로 자신을 재편하고 트래픽을 끌어 모으고 싶으면, 개발자에게 부탁해야 한다. 기술수준이 높은 개발자를 고용해서 팀을 구축하고, 그들이 회사 내부에서 마음껏 일을 저지르도록 장려해야 한다. 기자들과 시간을 보내면서 신문사의 생리를 파악하도록 하고, 편집과 뉴스전송의 원리를 이해하도록 하고, 신문이라는 산업 전체의 틀을 볼 수 있도록 도와주어야 한다.
그들이 원하는 컴퓨터와 소프트웨어 도구를 구입해주고, 해외에서 열리는 개발자 컨퍼런스에 참석시키고, 책과 자료를 구입하도록 지원해주어야 한다. 업계의 다른 개발자들을 초청해서 세미나를 열도록 하고, 사내 회의실에서 밋업(Meetup)과 같은 모임을 개최하도록 도와주어야 한다. 그들이 최첨단 기술스택을 선택하도록 장려하고, 자신들의 선택을 마음껏 외부에서 이야기하도록 북돋워야 한다. 프로그래밍을 도구가 아니라 비즈니스의 핵심 목적으로 삼을 때에만 가능한 이야기다.
그러다보면 강호의 고수 개발자들이 관심을 갖고 서서히 모여든다. 고수들이 한 곳에 모이면 회사를 인터넷, 모바일 중심으로 재편하는 것이 문제가 아니다. 아무도 생각하지 못했던 혁신이 일어난다. 혁신이 몰고 올 파괴력을 생각하면 트래픽(즉 광고)을 끌어 모으는 것은 부수효과에 불과하다. 그러니까 개발자에게 부탁하라는 말은 이런 것을 의미한다.
한국의 회사는 내부에 개발자를 두고 일을 개발자에게 부탁하는데 이상할 정도로 인색하다. 해외 업체에게 맡기거나 SI 서비스를 통해서 시스템을 구축한다. 그렇게 하는 것이 나은 경우도 물론 있다. 하지만 소프트웨어 개발 실력에 비즈니스 지식까지 통달한 사람이 갖는 생산성을 고려하면 그런 사람을 내부에 두는 것이 얼마나 필요한 일인지 깨닫지 못하는 것이 이상하다.
간단하다. 그런 깨달음을 경쟁사보다 먼저 얻는 회사가 미래를 차지한다. 트래픽에 연연하는 것을 속물적이라고 비난해서는 곤란하다. 모든 일은 사람이 모인 곳에서 시작되기 때문이다. 트래픽은 21세기의 광장이다. 그래서 날이 갈수록 힘을 잃어가는 신문사들의 사활은 바로 여기에 달려있다. 지금, 개발자에게 부탁하라. 거기가 혁신의 출발점이다.
그 중에 최근에 올라온 컬럼 중 하나인 "개발자에게 부탁하라"는 최근의 나의 상황이 많이 반영된 탓인지 어느 글보다 더 공감이 되는 내용이다.
"개발자에게 부탁하라(전문)"
신문사들이 위기를 겪고 있다. 신문사로 향하는 트래픽이 현저히 줄어들고 있기 때문이다. 여기에서 트래픽은 웹사이트나 콘텐츠를 이용하는 사람들의 수를 의미한다. 한국에서 발생하는 인터넷 트래픽은 네이버를 정점으로 하는 소수의 포털 사이트가 독차지한지 오래되었다. 신문사들이 설 땅은 별로 없다.
트래픽의 흐름을 살펴보면 전통적인 언론사들이 힘을 잃는 양상이 그대로 드러난다. 조선, 중앙, 동아, 한겨레, 경향과 같은 신문사는 자신의 힘으로 트래픽을 발생시키지 못한다. 그들이 생산하는 기사나 콘텐츠가 대부분 포털을 통해서 소비되기 때문이다. 콘텐츠는 신문사가 생산하지만 트래픽은 포털로 몰린다. 과거에 신문 헤드라인이 수행하던 기능을 이제는 실시간 검색어가 대신하고 있다.
랭키 닷컴에 따르면 2011년 11월에는 트래픽 상위 10등 안에 2개의 신문사가 포함되어 있었고, 상위 30등 안에는 6개가 포함되어 있었다. 하지만 4년 후인 2015년 5월에는 상위 10등 안에 단 1개의 신문사도 없고, 경제지를 제외하면 30등 안에 2개의 신문사가 포함되어 있을 뿐이다. 가장 순위가 높은 조선닷컴이 16~19등이다.
자본주의 사회에서 트래픽은 광고와 직결된다. 풍부한 트래픽은 높은 광고수입을 의미하고, 빈곤한 트래픽은 낮은 광고수입을 의미한다. 그래서 트래픽은 돈이다. 종이 신문을 보는 사람이 거의 없고, 신문사 사이트를 방문하는 사람도 별로 없는 요즘에는 신문사들이 광고수입을 올리기 어렵다. 신문사에 광고를 주는 기업은 실제로 광고효과를 기대해서가 아니라 만약의 경우를 위한 보험의 의미로 광고를 줄 뿐이다.
다른 나라도 마찬가지다. 미국에서는 100년이 넘는 유수한 역사를 자랑하던 신문사들이 속속 문을 닫고 있다. 신문사가 문을 닫았다는 뉴스는 이제 뉴스가 되지 않는다. 유력지의 하나인 워싱턴 포스트가 아마존에게 팔린 것은 힘의 방향이 어디를 향하고 있는지 보여주는 사례다. 뉴욕타임스는 직원 수를 줄이며 회사 전체를 인터넷과 모바일 중심으로 재편하기 위해 노력하고 있다.
갈수록 힘을 잃는 우리나라의 신문사들은 문제를 해결할 방법을 찾지 못하고 있는 것처럼 보인다. 해외에 있는 소프트웨어 회사에게 외주를 맡기기도 하고, 모바일 중심의 전략을 강조하기도 하지만 개편의 수준은 홈페이지 레이아웃의 재편성 수준을 벗어나지 못한다. 모든 신문사의 속사정을 알지 못하기 때문에 단언하기 어렵지만, 적어도 내가 관찰한 바에 의하면 그렇다.
이유는 간단하다. IT를 비용으로 보는 시각을 바꾸지 못하기 때문이다. 컴퓨터 프로그래밍을 그 자체로 비즈니스로 생각하지 않고 단순한 도구로 바라보기 때문이다. 기자는 독자를 위해서 일하고, 프로그래머는 그런 기자들을 위해서 PC를 고치는 사람 정도로 생각한다. 신문사를 특정해서 이야기하고 있지만 사실은 모든 업계에 공통적인 이야기다. 인터넷, 디지털, 모바일, 소프트웨어 시대에서 주인공은 개발자다. 당연한 일이다. 주인공에게 단역을 맡겨놓고 작품을 만들려고 하니 작품이 나오지 않는 것이다.
한국에 있는 수많은 회사들이 안고 있는 문제의 하나는 PC와 프린터를 고치고 LAN을 연결하는 일을 소프트웨어 개발과 혼동한다는 점이다. 그런 일을 폄하하는 것이 아니다. PC를 수리하는 일과 소프트웨어를 개발하는 일이 타자기를 수리하는 일과 타자기를 쳐서 기사를 작성하는 일만큼이나 다르다는 사실을 말하는 것이다.
신문사가 인터넷과 모바일을 중심으로 자신을 재편하고 트래픽을 끌어 모으고 싶으면, 개발자에게 부탁해야 한다. 기술수준이 높은 개발자를 고용해서 팀을 구축하고, 그들이 회사 내부에서 마음껏 일을 저지르도록 장려해야 한다. 기자들과 시간을 보내면서 신문사의 생리를 파악하도록 하고, 편집과 뉴스전송의 원리를 이해하도록 하고, 신문이라는 산업 전체의 틀을 볼 수 있도록 도와주어야 한다.
그들이 원하는 컴퓨터와 소프트웨어 도구를 구입해주고, 해외에서 열리는 개발자 컨퍼런스에 참석시키고, 책과 자료를 구입하도록 지원해주어야 한다. 업계의 다른 개발자들을 초청해서 세미나를 열도록 하고, 사내 회의실에서 밋업(Meetup)과 같은 모임을 개최하도록 도와주어야 한다. 그들이 최첨단 기술스택을 선택하도록 장려하고, 자신들의 선택을 마음껏 외부에서 이야기하도록 북돋워야 한다. 프로그래밍을 도구가 아니라 비즈니스의 핵심 목적으로 삼을 때에만 가능한 이야기다.
그러다보면 강호의 고수 개발자들이 관심을 갖고 서서히 모여든다. 고수들이 한 곳에 모이면 회사를 인터넷, 모바일 중심으로 재편하는 것이 문제가 아니다. 아무도 생각하지 못했던 혁신이 일어난다. 혁신이 몰고 올 파괴력을 생각하면 트래픽(즉 광고)을 끌어 모으는 것은 부수효과에 불과하다. 그러니까 개발자에게 부탁하라는 말은 이런 것을 의미한다.
한국의 회사는 내부에 개발자를 두고 일을 개발자에게 부탁하는데 이상할 정도로 인색하다. 해외 업체에게 맡기거나 SI 서비스를 통해서 시스템을 구축한다. 그렇게 하는 것이 나은 경우도 물론 있다. 하지만 소프트웨어 개발 실력에 비즈니스 지식까지 통달한 사람이 갖는 생산성을 고려하면 그런 사람을 내부에 두는 것이 얼마나 필요한 일인지 깨닫지 못하는 것이 이상하다.
간단하다. 그런 깨달음을 경쟁사보다 먼저 얻는 회사가 미래를 차지한다. 트래픽에 연연하는 것을 속물적이라고 비난해서는 곤란하다. 모든 일은 사람이 모인 곳에서 시작되기 때문이다. 트래픽은 21세기의 광장이다. 그래서 날이 갈수록 힘을 잃어가는 신문사들의 사활은 바로 여기에 달려있다. 지금, 개발자에게 부탁하라. 거기가 혁신의 출발점이다.
2015년 6월 17일 수요일
StackExchange.Resid.StrongName (MultiAdd Sample)
using System.Linq;
using NUnit.Framework;
namespace StackExchange.Redis.Tests
{
[TestFixture]
public class MultiAdd : TestBase
{
[Test]
public void AddSortedSetEveryWay()
{
using(var conn = Create())
{
var db = conn.GetDatabase(3);
RedisKey key = Me();
db.KeyDelete(key);
db.SortedSetAdd(key, "a", 1);
db.SortedSetAdd(key, new[] {
new SortedSetEntry("b", 2) });
db.SortedSetAdd(key, new[] {
new SortedSetEntry("c", 3),
new SortedSetEntry("d", 4)});
db.SortedSetAdd(key, new[] {
new SortedSetEntry("e", 5),
new SortedSetEntry("f", 6),
new SortedSetEntry("g", 7)});
db.SortedSetAdd(key, new[] {
new SortedSetEntry("h", 8),
new SortedSetEntry("i", 9),
new SortedSetEntry("j", 10),
new SortedSetEntry("k", 11)});
var vals = db.SortedSetRangeByScoreWithScores(key);
string s = string.Join(",", vals.OrderByDescending(x => x.Score).Select(x => x.Element));
Assert.AreEqual("k,j,i,h,g,f,e,d,c,b,a", s);
s = string.Join(",", vals.OrderBy(x => x.Score).Select(x => x.Score));
Assert.AreEqual("1,2,3,4,5,6,7,8,9,10,11", s);
}
}
[Test]
public void AddHashEveryWay()
{
using (var conn = Create())
{
var db = conn.GetDatabase(3);
RedisKey key = Me();
db.KeyDelete(key);
db.HashSet(key, "a", 1);
db.HashSet(key, new[] {
new HashEntry("b", 2) });
db.HashSet(key, new[] {
new HashEntry("c", 3),
new HashEntry("d", 4)});
db.HashSet(key, new[] {
new HashEntry("e", 5),
new HashEntry("f", 6),
new HashEntry("g", 7)});
db.HashSet(key, new[] {
new HashEntry("h", 8),
new HashEntry("i", 9),
new HashEntry("j", 10),
new HashEntry("k", 11)});
var vals = db.HashGetAll(key);
string s = string.Join(",", vals.OrderByDescending(x => (double)x.Value).Select(x => x.Name));
Assert.AreEqual("k,j,i,h,g,f,e,d,c,b,a", s);
s = string.Join(",", vals.OrderBy(x => (double)x.Value).Select(x => x.Value));
Assert.AreEqual("1,2,3,4,5,6,7,8,9,10,11", s);
}
}
[Test]
public void AddSetEveryWay()
{
using (var conn = Create())
{
var db = conn.GetDatabase(3);
RedisKey key = Me();
db.KeyDelete(key);
db.SetAdd(key, "a");
db.SetAdd(key, new RedisValue[] { "b" });
db.SetAdd(key, new RedisValue[] { "c", "d" });
db.SetAdd(key, new RedisValue[] { "e", "f", "g" });
db.SetAdd(key, new RedisValue[] { "h", "i", "j","k" });
var vals = db.SetMembers(key);
string s = string.Join(",", vals.OrderByDescending(x => x));
Assert.AreEqual("k,j,i,h,g,f,e,d,c,b,a", s);
}
}
[Test]
public void AddSetEveryWayNumbers()
{
using (var conn = Create())
{
var db = conn.GetDatabase(3);
RedisKey key = Me();
db.KeyDelete(key);
db.SetAdd(key, "a");
db.SetAdd(key, new RedisValue[] { "1" });
db.SetAdd(key, new RedisValue[] { "11", "2" });
db.SetAdd(key, new RedisValue[] { "10", "3", "1.5" });
db.SetAdd(key, new RedisValue[] { "2.2", "-1", "s", "t" });
var vals = db.SetMembers(key);
string s = string.Join(",", vals.OrderByDescending(x => x));
Assert.AreEqual("t,s,a,11,10,3,2.2,2,1.5,1,-1", s);
}
}
}
}
Redis with StackExchange.Redis.StrongName(Sample Code)
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
db = redis.GetDatabase();
EndPoint ep = db.IdentifyEndpoint();
server = redis.GetServer(ep);
//Add Resid by Key-Value
RedisValue v = "a";
db.StringSet("stringKey", v);
Dictionary<RedisKey, RedisValue> dics = new Dictionary<RedisKey, RedisValue>() {
{"stringKeyA", "S_1"},
{"stringKeyB", "S_2"}
};
db.StringSet(dics.AsQueryable().ToArray(), When.Always, CommandFlags.None);
//Add to Resid by Set Value
RedisValue[] values = { "d", "e", "f" };
long size = db.SetAdd("SetKey", values);
IEnumerable<RedisValue> setvalue = db.SetScan("SetKey");
//Add to Redis by List Value
db.ListRightPush("ListKey", "abcdefghijklmnopqrstuvwxyz".Select(x => (RedisValue)x.ToString()).ToArray());
RedisValue[] listvalue = db.ListRange("ListKey", 0, -1);
//Key Confirm
foreach (RedisKey k in server.Keys()) {
MessageBox.Show(k.ToString());
}
라벨:
.NET Framework,
Redis
2014년 12월 3일 수요일
Using Linq at Remote
Remote Linq Made Easy
http://blog.trivadis.com/b/christofsenn/archive/2013/05/27/remote-linq-made-easy.aspx
Using Expressions in WCF
https://outlawtrail.wordpress.com/2013/06/10/using-expressions-in-wcf/
http://blog.trivadis.com/b/christofsenn/archive/2013/05/27/remote-linq-made-easy.aspx
Using Expressions in WCF
https://outlawtrail.wordpress.com/2013/06/10/using-expressions-in-wcf/
2014년 11월 28일 금요일
WPF를 배우기 좋은 사이트
http://dotnetmvp.tistory.com/category/WPF
1. XAML문법을 익히기
2. Layout 이해
3. DataBinding
4. Routed Event
5. Command
4. DependencyProperties
1. XAML문법을 익히기
2. Layout 이해
3. DataBinding
4. Routed Event
5. Command
4. DependencyProperties
2014년 10월 23일 목요일
2014년 8월 14일 목요일
VBA 에서 Web Data 수신
혹시 사용하게 될 지 몰라서 VBA에서 Web Data 추출하는 루틴을 기록해둠
http://blogs.msdn.com/b/marcelolr/archive/2010/02/16/consuming-odata-with-office-vba-part-i.aspx
Public Sub Sendxml()
Dim hreq As New MSXML2.XMLHTTP60
Dim url As String, postData As String
url = "http://10.210.27.41/Candy/WorkProc"
postData = ""
hreq.Open "POST", url, False
hreq.setRequestHeader "Content-Type",
"application/x-www-form-urlencoded"
hreq.send (postData)
If hreq.Status = 200 Then
hreq.getAllResponseHeaders
MsgBox hreq.responseText
Else
MsgBox "Read Failed!!"
End If
End Sub
참조할만한 게시물http://blogs.msdn.com/b/marcelolr/archive/2010/02/16/consuming-odata-with-office-vba-part-i.aspx
2014년 7월 23일 수요일
Web Parsing by VBA
속도와 정확도를 고려해야 하고 사이트에서 로그인 등을 요구하는 경우, 좀더 복잡한 방법이 필요하게 된다.
지금까지 경험을 통해서 VBA로 웹파싱하는 각각의 방법과 장단점을 비교해 본다.
1. Winhttp를 이용하는 방법
가장 기본적인 방법이면서도 필요한 모든 기능을 제공하는 아주 막강한 라이브러리이다. GET, POST 방식 모두 지원하며, 헤더와 쿠키 정보도 작성하여 같이 전송할 수 있다.
사실상 거의 모든 페이지를 완벽히 파싱해 올 수 있으나 우리나라의 웹 환경상 접근이 제한되어 있는 페이지는 파싱해오기 어려운 문제점이 있다.(Internet Explorer.Application을 이용하면 이 문제도 해결 가능하다. 추후 설명) 또한 결과값은 단순히 String으로 제공하기 때문에 DOM 형식에 따른 접근이 어려운 문제점도 존재한다. 따라서 String을 일일이 Split하는 노가다가 불가피하다. (HTMLDocument를 이용하면 이 문제도 해결 가능하다 추후 설명)
때문에 단순한 페이지를 파싱해 올때는 속도면에서나 코딩 작업의 효율 면에서 매우 유용하나, 복잡한 페이지를 파싱하는 데에는 다른 라이브러리를 같이 사용할 필요가 있다.
또한 비슷한 라이브러리로 xmlhttp가 있는데 불러온 페이지의 정보를 XML DOM 형식으로 제공하는 장점이 있다. 해외 포럼에서는 xmlhttp의 속도가 더 빠르다고 이야기하는 경우를 종종 봤는데, 체감상으로 잘 느껴지지 않는다. 그리고 winhttp는 WaitForResponse를 통해서 페이지를 모두 로드할 때까지 대기하게 할 수 있지만, xmlhttp는 Status를 통해서 간접적으로 확인 할 수밖에 없어 불편함이 있다.
2. Internet Explorer.Application 오브젝트를 이용하는 방법
VB나 VC 계열의 언어에서는 자바나 다른 언어와는 달리 추가적인 라이브러리 없이 손쉽게 Internet Explorer를 제어할 수 있다. InternetExplorer.Application 오브젝트를 생성한 다음에 웹페이지에 접근하고, 폼에 정보를 입력하거나 마우스를 클릭하는 등 이벤트도 설정할 수 있다.
따라서 ActiveX 환경하에서 로그인이 필요한 홈뱅킹 등의 사이트도 손쉽게 접근할 수 있다. 그리고 페이지 정보를 DOM 형식으로 제공하기 때문에 id나 tag, class 정보로 손쉽게 특정 정보에 접근할 수 있어 활용범위가 무궁무진한 장점이 있다.
때문에 winhttp의 대부분의 단점을 커버한다고 볼수 있으나 가장 큰 문제점은 속도이다. Internet Explorer 애플리케이션을 직접 실행시켜서 제어하기 때문에 메모리를 지나치게 많이 차지하고 ActiveX 추가기능들이 실행되는 환경이라면 더욱더 느려지는 문제점이 발생한다.
그리고 속도가 느려지다 보니 파싱한 페이지 정보가 짤려버리는 문제점도 종종 발생하기 때문에 에러 처리에 많은 시간을 들여야 할 수도 있다. 따라서 불가피한 경우에만 사용하는 것이 좋다고 본다.
3. Winhttp와 HtmlDocument를 이용하는 방법
Winhttp로 파싱한 페이지 정보를 HTMLDocment 오브젝트에 강제로 집어넣음으로서 DOM 형식으로 만드는 방법이다. 속도면에서나 정보의 접근성 면에서나 가장 우수한 방법이다. 현재는 이방법으로만 코딩을 하고 있다. 추후에 이 방법으로 페이지를 파싱하는 방법에 대해서 글을 올려 보겠다.
tip. 3번의 방법 즉, winhttp와 HtmlDocument를 같이 사용하는 방법이 효과적이긴 하나 로그인 등이 필요한 일부 페이지는 접근이 어려운 문제가 있다. 이러한 문제는 InternetExplorer 애플리케이션을 실행하여 로그인 한다음에 쿠키를 복사한 뒤, WinHttp로 쿠키 정보를 다시 보내면 간단히 해결 가능하다. 이 방법에 대해서도 추후 글을 올려 보겠다.
2014년 4월 22일 화요일
MMF 테스트
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.IO.MemoryMappedFiles;
using System.Diagnostics;
namespace MMFs {
class Program {
static void Main(string[] args) {
int SIZE = 1000000;
//Random rnd = new Random();
//double[] rndv = new double[SIZE];
//for(int i = 0; i < rndv.Length; i++) {
// rndv[i] = rnd.NextDouble() * 10000;
//}
//using(BinaryWriter swr = new BinaryWriter(new FileStream(@"c:\randomdata.data", FileMode.Create, FileAccess.Write))) {
// for(int i = 0; i < rndv.Length; i++) {
// swr.Write(rndv[i]);
// }
//}
double[] dbldata = new double[SIZE];
MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(@"c:\randomdata.data");
MemoryMappedViewAccessor access = mmf.CreateViewAccessor();
int sizedbl = sizeof(double);
int pos = 0;
for(int i = 0; i < SIZE; i++) {
double bucket = 0;
access.Read<double>(pos, out bucket);
pos += sizedbl;
dbldata[i] = bucket;
}
Stopwatch sw = Stopwatch.StartNew();
pos = 0;
for(int i = 0; i < SIZE; i++) {
double bucket = 0;
access.Read<double>(pos, out bucket);
pos += sizedbl;
dbldata[i] = bucket;
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds + ", " + (1000 * 60) / sw.ElapsedMilliseconds);
Console.ReadLine();
}
}
}
라벨:
.NET Framework
2014년 4월 21일 월요일
JSonSerialzer : ServiceStack.Text
기존 Serializer에 비해 속도도 빠르고, 훨씬 Flexible 한 듯...
https://github.com/ServiceStack/ServiceStack.Text
2014년 4월 9일 수요일
노트북 Booting Error 고치기
SSD에서 멀쩡하게 부팅되는 노트북이 HDD만 붙이면 OS없다고 부팅 안되는 문제가 발생...
다시 HDD빼면 정상적으로 부팅되고...
결국 이리저리 찾다가 bcdedit를 이용해서 기존 bcd 파일 새로 생성 후 다시 복구하는방법을 찾아서 복구했다.
덕분에 bcdedit 사용법을 잘 익혔네.
http://rajandmk.blogspot.kr/2012/09/how-to-create-clean-bcd-file-to-fix.html
라벨:
IT General
피드 구독하기:
글 (Atom)