[System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern long BitBlt (IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); private Bitmap memoryImage; private void CaptureScreen() { Graphics mygraphics = this.CreateGraphics(); Size s = this.Size; memoryImage = new Bitmap(s.Width, s.Height, mygraphics); Graphics memoryGraphics = Graphics.FromImage(memoryImage); IntPtr dc1 = mygraphics.GetHdc(); IntPtr dc2 = memoryGraphics.GetHdc(); BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376); mygraphics.ReleaseHdc(dc1); memoryGraphics.ReleaseHdc(dc2); } private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e) { e.Graphics.DrawImage(memoryImage, 0, 0); } private void printButton_Click(System.Object sender, System.EventArgs e) { CaptureScreen(); printPreviewDialog1.Show(); }출처: MSDN 페이지
2009년 9월 11일 금요일
폼을 캡쳐하여 미리보기로..
2009년 5월 29일 금요일
SyntaxHilighter Test
using System; namespace TestNamespace { class TestClass { public static void main() { Console.WriteLine("Hello World"); } } }
음하하... 드디어 되는 군요... ^^
다시 한 번 Zephyr님께 감사를~~
2009년 4월 28일 화요일
[업데이트] kImage - 이미지 정리 프로그램
프로그램이 오류와 함께 처리가 되지 않는 문제가 있어 이를 처리 했습니다..
동일 파일명이 있을 경우 덮어 쓰도록 변경 했습니다.
다음 수정에는 덮어쓰기도 옵션으로.... ^^;
자세한 사용 방법은 아래 글을 통해 확인 하시면 됩니다.
자작 이미지 정리 프로그램 - kImage
2009년 4월 27일 월요일
자작 FastPing 프로그램
AutoIt으로 작성했습니다..
게임을 할때 공속 업 효과를 가지고 오는 모양이더군요..
뭐.. 이런 저런 게임들에서 속도에 효과가 있는 모양입니다..
회사에서 누가 패스트핑 아느냐고 물어 보기에 적용방법을 찾아 만들게 되었군요..
처음 실행하면 패스트핑이 적용되고, 다시 실행하면 해제하게 됩니다.
적용후에는 재부팅 할 것인지 물어보는데 패스트핑 자체가 적용후 재부팅해야 적용되므로
재부팅하면 설정 다 날라가는 PC방에서는 헛일이겠군요...
아래 파일은 AutoIt 소스 입니다..
관심 있으신 분들은 한 번 살펴보세요 ^^
2009년 4월 23일 목요일
김창준님 프로그래머를 위한 공부법 정리
1. 알고리즘·자료구조 학습에서의 문제
- 왜 우리는 학교에서 `프로그래밍을 하는 과정'이나 `디자인 과정'(소프트웨어 공학에서 말하는 개발 프로세스가 아니라 몇 시간이나 몇 십 분 단위의, 개인적인 차원의 사고 과정 등을 일컫습니다)을 명시적으로 배운 적이 없을까요?
- 알고리즘 공부에서 중요한 것
- 알고리즘을 스스로 생각해낼 수 있는 능력
- 다른 알고리즘과 효율을 비교할 수 있는 능력
- 알고리즘을 컴퓨터와 다른 사람이 이해할 수 있는 언어로 표현해낼 수 있는 능력
- 이것의 정상작동(correctness) 여부를 검증해 내는 능력
3. 실질적이고 구체적인 문제를 함께 다루라
- 구상(concrete) 다음에 추상(abstract)
- ACM ICPC(세계 대학생 프로그래밍 경진 대회)
4. 알고리즘 디자인 과정의 중요성
- Program Development by Stepwise Refinement (http://www.acm.org/classics/dec95)
- Stepwise Program Construction (http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD227.PDF)
- 알고리즘 검증: 루프 불변식(loop invariant)
- 맨버(Udi Manber) 『Instruction to Algorithms: A Creative Approach』
- 다익스트라의 『A Discipline of Programming』
- 그라이스(Gries)의 『The Science of Programming』
5. 알고리즘과 패러다임
- 로버트 플로이드(Robert Floyd)의 튜링상 수상 강연(The Paradigms of Programming, 1978)
- 죠지 폴리야(George Polya)의 『Howto Solve it』
- 알고리즘 개론 교재 CLR (Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson,and Ronald L. Rivest)
- 존 벤틀리(Jon Bentley)의『Programming Pearls』
6. 리팩토링 학습에서의 문제
- 무색 무미 무취의 무위(無爲)적 자연(自然) 코드가 되는 그 날을 위해 오늘도 우리는 리팩토링이라는 유위(有爲)를 익힌다.
7. 리팩토링 공부
- TDD와 함께..
- 리팩토링 수련법
- 일취집중후각법: 앞에 소개한 본지 2001년 11월호에서 인용된 글 참조
- 주석 최소화: 주석을 최소화하되 코드의 가독성이 떨어지지 않도록(혹은 오히려 올라가도록) 노력합니다. 이렇게 하면 자동으로 리팩토링이 이뤄지는 경우가 많습니다.
- AOO 따르기: OAOO 법칙을 가능하면 최대한, 엄격하게 따르려고 합니다. 역시 자동으로 좋은리팩토링이 이뤄집니다. 여기서 디자인패턴이 창발하기도 합니다. GoF 책을 한번도 보지 못한 사람이 디자인패턴을 자유자재로 부리는 경우를 보게 됩니다.
- 디미터 법칙(Law of Demeter) 따르기: 디미터 법칙을 가능하면 지키려고 합니다. 어떤 리팩토링이 저절로 이뤄지거나 혹은 필요 없어지는가요?
- 짝(Pair) 리팩토링: 함께 리팩토링합니다. 혼자 하는 것보다 더 빨리, 더 많은 걸 배우게 됩니다. 특히, 각자 작성했던 코드를 함께 리팩토링하고, 제3자의 코드를 함께 리팩토링해 봅니다. 사람이 많다면 다른 짝이 리팩토링한 것과 서로 비교하고 토론합니다.
- `무엇'과 `어떻게'를 분리: 어떻게에서 무엇을 분리해 내도록 합니다. 어떤 리팩토링이 창발합니까?
- 레이브와 웽거(Jean Lave, Etienne Wenger)의『Situated Learning : Legitimate Peripheral Participation』
- 마소 2001년 12월호 「허실문답 XP 강화」
- 조선시대 사상가 혜강 최한기는『신기통』
8. 디자인패턴 학습에서의 문제
- 우리가 궁극적으로 추구하는 것은 패턴이 아니라 현실이어야 한다
- 미국 캘리포니아 주립대학의 교수 베티 에드워즈(Betty Edwards) 『Drawing on the
Right Side of the Brain』
9. 디자인 패턴 공부
- 삐아제와 비갓스키(Lev Vygotsky)의 구성주의
- 어떤 패턴의 필요성을 자신의 경험 속에서 절감하지 못한다면 그 패턴을 제대로 아는 것이 아니다
10. 소프트웨어 개발에 푹 빠지기
- 독일어를 마스터하기 위해서는 독일어 문화에 자기 자신을 푹 담궈야(immerse) 한다.
- 커리프스키(Joshua Kerievsky)의 「A Learning Guide To Design Patterns」http://www.industriallogic.com/papers/learning.html
- 스터디 그룹의 패턴 언어를 서술한 「Knowledge Hydrant」http://www.industriallogic.com/papers/khdraft.pdf
- 『A Learning Guide To Design Patterns』
- 랄프 존슨 "싱글톤 패턴을 가르치기 전에 콤포짓, 스트래터지, 템플릿 메쏘드, 팩
토리 메쏘드 패턴을 가르친다. 이것이 훨씬 더 일반적인 것들이며,"
11. 마이크로패턴
- 커리프스키의 「Stop Over-Engineering!」(SoftwareDevelopment Magazine, Apr 2002, http://www.sdmagazine.com/documents/s=7032/sdm0204b/0204b.htm)
- 존 블리스사이즈가 쓴 「Diversify」http://www.research.ibm.com/people/v/vlis/pubs/gurus-99.pdf
12. 디자인패턴 추천서 디자인패턴
- 『Design Patterns Explained』(Shalloway, Trott)
- 『Design Patterns Java Workbook』(Steven John Metsker)
- 『Refactoring』(Martin Fowler)
- 『Design Patterns』
- 『Design Patterns Smalltalk Companion』
- 『Pattern Hatching』(John Vlissides)
- 『Smalltalk Best Practice Patterns』(Kent Beck)
- 『Pattern Languages of Program Design』1,2,3,4: 패턴 컨퍼런스 논문 모음집
- 『Pattern-Oriented Software Architecture』1,2
- 『Concurrent Programming in Java』(Doug Lea)
- 『Patterns of Software』(Richard Gabriel)
- 『Analysis Patterns』(Martin Fowler)
- 『A Timeless Way of Building』(Christopher Alexander)
- 『The Natureof Order』
- 『A Pattern Language』(Christopher Alexander)
- 『Problem Frames』(Michael Jackson)
13. 익스트림 프로그래밍 공부
- 필독서
- 『XP Explained』(Kent Beck): XP 선언서
- 『XP Installed』(Ron Jeffries et al): C3 프로젝트에 적용한 예, 얻은 교훈 등
- 『Planning XP』(Kent Beck, Martin Fowler): 계획 부분 설명(관리자, 코치용)
- 『Refactoring』(Martin Fowler): 리팩토링에 대한 최고의 책
- 『XP Applied』: 유즈넷과 메일링 리스트의 논의 등 최근 자료를 반영
- 『XP Explored』: 가장 쉽고 구체적인 XP 안내서
- 여유가 된다면,,
- 『The Timeless Way of Building』
- 『XP in Practice』(Robert C. Martin 외)
- 『XP Examined』: XP 컨퍼런스에 발표된 논문 모음
- 『Peopleware』(Tom DeMarco)
- 『Adaptive Software Development』(Jim Highsmith)
- 『Surviving Object-Oriented Projects』(Alistair Cockburn)
- 『Software Project Survival Guide』(Steve McConnell)
- 『The Psychology of Computer Programming』(Gerald M. Weinberg)
- 『Agile Software Development』(Alistair Cockburn)
- 『Software Craftsmanship』(Pete McBreen)
- 『Agile Software Development with SCRUM』(Schwaber Ken)
- 『A Practical Guide to eXtreme Programming』(David Astels 외)
- 『Agile Modeling』(Scott Ambler)
- 『Agile Software Development Ecosystems』(Jim Highsmith)
- 『Test Driven Development』(Kent Beck)
- IEEE Software/Computer, CACM, Software Development Magazine 등에 실린 기사
- 『XP Conference, XP Universe 등의 논문들(특히 최근 것들)
- 유즈넷, 메일링 리스트, 오리지널 위키 http://c2.com의 논의들
14. Refactor Me
- 실 생활에서 직접 실험을 해보면서 - 이 때 욕심 부리지 않고 한 가지씩 지긋이 해보는 느긋함과 음미의 정신이 필요할지도 모르겠습니다 - 자신의 경험을 축적해 나가고, 동시에 이 글을 적절히 리팩토링해서 자신만의 패턴을 차근히 만들어 나가길 바랍니다.
[출처] Minjae's PX : 김창준님 프로그래머를 위한 공부법 정리
요즘 프로그래밍을 하다보면 꼭 접하게 되는 것들...
이전 따로 떼고 생각하기가 힘든 대세일까나...
아직 내게는 익숙하지 않은 옷 같은 처지... 무량수불....
2009년 4월 14일 화요일
자작 이미지 정리 프로그램 - kImage
사진을 찍은 날짜 순으로 폴더를 생성해 이미지 파일을 정리하는 프로그램을 하나 만들었습니다.
이미지 파일은 bmp, jpg, jpeg, gif, png, raw, tif 파일을 인식합니다.

처음 실행하면 위와 같은 화면을 볼 수 있습니다.
붉은 네모 안의 "Click..." 글자를 클릭하여 이미지 파일이 있는 위치를 선택하면 선택한 폴더 하위에
날짜별로 폴더를 만들어 사진을 찍은 날짜에 맞추어 이동시켜 줍니다.
프로그램을 처음 실행하고 종료하면 Config.xml파일이 생성되는데, 마지막으로 실행했던 폴더를 저장
하고자 한다면 xml파일을 열고 <UseSetting></UseSetting> 사이의 값을 1로 변경 저장한 재실행 하면,
다음 실행부터 마지막으로 실행한 폴더가 바로 설정됩니다.

Convert.ToInt32()와 int.Parse()의 차이
int의 정적 메서드를 사용하는 방법과 Convert 클래스의 To 메서드를 쓰는 방법..
(사실 Int 뿐만이 아니라 대부분의 형들이 2가지 방법을 지원하죠..)
막상 사용하다 보면 두가지 방식 모두 거의 동일하게 동작해서 실상 차이가 있는지 모르고 지나치는 경우가
많습니다.. 사실 저도 왜 두가지를 만들어 놨는지 의문을 가지고 있었죠..
Convert 클래스가 많은 형을 지원하기도 하지만...(맞나.... ㅡㅡ;;)
가장 큰 차이는 뭐라해도 "null을 지원하느냐"가 아닐까 싶습니다.
int.Parse()를 사용할 때 인자에 null값이 들어오면 바로 에러 이쁘게 날려줄겁니다..
하지만 Convert.ToInt32()를 사용할 경우 null 값이 들어오면 0으로 값을 반환해 줍니다.
회사에서 C# 개념 정리 하라며 학원을 보내어 다니는 중입니다만...
강사도 이 차이를 잘 모르고 있더군요..
생각난 김에 한자 적어 봅니다..
string을 int로 바꾼다면 int.TryParse() 메서드를 더 추천 합니다.
기본형은 bool int.TryParse(string s, out int result) 형태 입니다.
string s를 int값으로 바꿀 수 있으면 true를 리턴하고 out 으로 참조 전달된 result 변수에 값을 입력하고,
실패하면 false를 리턴하고 int 기본값(0)을 result에 돌려 보냅니다.
변환이 성공했는지 확인하기가 더 용이해서 즐겨 쓰는 방법이죠.. ^^
2009년 4월 10일 금요일
IE8 오류와 관련해 VC++ 팀 블로그에 글이 올라 왔네요..
이전에 포스트한 글 중에 IE8과 VC++을 함께 사용할 경우 VC++에서 문제가 생긴다는 이야기를 했지요..
(VC++ 사용자는 되도록이면 IE8을 사용하지 마세요... 글 참조)
이와 관련해서 해결법이 VC++ 팀 블로그에 올라와 있다는 소식이 있네요...
아래에 링크하겠습니다...
Some VS2005 and VS2008 Wizards Pop Up Script Error.
IE8을 쓰지 않아 정확한지 확인은 하지 못했습니다...
지금까지는 IE8을 쓸생각이 없고.. 앞으로도 관망하려고 합니다..
혹... 이미 사용하시는 분들은 시도해 보세요..
결과도 알려주시면 감사 x 1000배 입니다 ^^
2009년 3월 25일 수요일
Dictionary<>를 foreach 루프 돌리기
바로 며칠 전까지 Dictionary<>를 사용하면서 Key를 이용해 일일히 Value를 초기화 하거나 귀찮으면
아예 Clear()를 돌렸다...
정말 간단하게 foreach로 돌릴 수 있는 걸 모르고 말이지....
항상 기본은 충실히 하자... T^T
아래는 foreach로 돌리는 예제.........
Dictionary<string,int> dic = new Dictionary<string, int>();
dic.Add("key1", 1);
dic.Add("key2", 2);
dic.Add("key3", 3);
foreach(KeyValuePair<string, int> kv in dic)
{
Console.WriteLine("Key: {0}, Value: {1}", kv.Key, kv.Value);
}
2009년 3월 24일 화요일
VC++ 사용자는 되도록이면 IE8을 사용하지 마세요...
이거... IE8 사용해 볼까 하던 맘이 싹 달아났네요...
당분간은 관망해야겠군요...
아래는 Monaca님의 블로그에서 가져온 원문입니다.
---------- 출처 : http://monac.egloos.com/2270467 ---------------------------------------------
컨트롤에 Add variable Wizard를 실행해서 컨트롤 멤버 변수를 추가하는데 스크립트 에러가 발생합니다.
스크립트 에러를 무시하고 진행하면 동작하는 것처럼 보이지만, 코드를 제대로 생성하지 못해서 VC++에서 컴파일도 안 됩니다.
undefiend m_EditResult1;
이런식으로 추가됩니다.
수작업으로 매번 이를 바로 잡으면서 IE8을 쓰거나 아니면 당분간 쓰지 마세요.
More IE8 Extensibility Improvements
http://blogs.msdn.com/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx
레지스트리에 FEATURE_BROWSER_EMULATION 키 값을 설정해서 IE7 모드로 동작하게 하는 방법도 동작하지 않습니다.
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=425510
마찬가지로 devenv.exe를 로컬 애플리케이션으로 등록하는 법도 동작하지 않습니다.
(그외 microsoft.com을 127.0.0.1로 hosts 파일 수정하기 방법 등도 안 됩니다)
아직까지는 해결법이 공개되지 않았고, 위 블로그 댓글에도 있지만, 에뮬레이션 모드 얘기하지 말고 당장 문제를 해결해줘야 합니다.
베타 때는 그렇다고 하지만, 정식 버전인데 문제가 있네요.
ps. 해결하신 분이 있다면 알려주세요.
ps2. 스마트폰 디바이스 프로젝트는 아예 생성도 못하고, 프로젝트 생성 결과 리포트가 항상 failed로 뜬다고 합니다.
(http://www.eggheadcafe.com/software/aspnet/32004994/ie8-installation-breaks-v.aspx)
ps3. Visual C++ 2005, 2008 모두 문제가 발생한다고 합니다.
2009년 3월 15일 일요일
Intel System Developer Manual 배송 시작
드디어 배송이 시작되었습니다..
정확히는 13일에 시작이 되었군요...
UPS를 통해 배송되는군요...
어디까지 왔을 까~~나~
흘흘..
아직 오려면 한참 기다려야 겠군요.. ^^;
2009년 3월 11일 수요일
Farpoint Spread에서 ClipBoard Paste 직접 구현하기
이를 컨트롤하고자 할 때 paste 중에 컨트롤 할 수 있는 이벤트는 있으나 paste가 끝났는지 여부를
알기가 힘듭니다.
이때문에 paste 후 데이터 검사를 하려 해도 타이밍을 잡지 못하고 멍하니 바라만 보고 있다가..
System.Window.Forms.Clipboard 클래스를 이용해 paste 중에 데이터를 직접 컨트롤해 버렸습니다.
펼쳐두기..
(object sender, FarPoint.Win.Spread.ClipboardPastingEventArgs e)
{
e.Handled = true;
string data;
string[] rows, cols = new string[] { };
int rowNum, colNum;
if (!Clipboard.ContainsData(DataFormats.Text)) return;
rowNum = fpSpread_Sheet1.ActiveRowIndex;
colNum = fpSpread_Sheet1.ActiveColumnIndex;
data = Clipboard.GetData(DataFormats.Text) as string;
data = data.Replace("\r\n", Convert.ToChar(13).ToString());
rows = data.Split(new Char[] { Convert.ToChar(13) });
for (int rowLoop = 0; rowLoop < rows.Length - 1; rowLoop++)
{
cols = rows[rowLoop].Split(new Char[] { Convert.ToChar(9) });
for (int colLoop = 0; colLoop < cols.Length; colLoop++)
fpSpread_Sheet1.Cells[rowNum + rowLoop, colNum + colLoop].Value
= cols[colLoop];
fpSpread_Sheet1.SetActiveCell(rowNum + rowLoop, colNum);
}
fpSpread_Sheet1.ClearSelection();
fpSpread_Sheet1.SetActiveCell(rowNum, colNum);
fpSpread_Sheet1.AddSelection(rowNum, colNum, rows.Length - 1,
cols.Length);
}
2009년 3월 9일 월요일
인텔 본사에 Sytem Developer's Manual을 신청했습니다 ^^
총 6권의 하드카피를 신청할 수 있고 인텔의 여건에 따라 가능한 수량을 보내 주는 군요..
여기에서 신청할 수 있습니다.


신청한 메일입니다. Hard Copy Literature 라는 말을 포함하지 않을 경우 pdf파일만 떨렁 올 수 있으니 주의 하세요..

인텔로부터 리턴 메일이 왔군요..
이제 오는걸 기다리면 되려나 봅니다..
대략 3~4주가량 걸릴듯 합니다.
도착하면 한 번 더 포스팅 하도록 하겠습니다 ^^
2009년 2월 19일 목요일
숫자 입력만 받아들이기
private void TextBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8)
{
e.Handled = true;
}
}
TextBox에 KeyPress이벤트로 키 입력을 숫자키와 백스페이스로 제한한 코드다..
KeyChar값이 ASCII니까 8이 백스페이스.....
응용편....
Char.IsLetter(e.KeyChar) : 알파벳이라면 여기에 걸릴테지...
Char.IsSymbol(e.KeyChar) : 기호는 이걸로 거를테고...
Char.IsControl(e.KeyChar) : 제어 문자 거르고...
Char.IsPunctuation(e.KeyChar) : 구분 문자인지 체크..
숫자와 영문을 동시에 처리한다면 Char.IsLetterOrDigit()을 쓰는 방법도 있다..^^
2009년 2월 9일 월요일
C#으로 본 자료운용 구조[DFS와 BFS 비교]
폴더에 대한 검색..
서브 폴더를 포함한 검색을 하며 검색되는 속도에 의해 얼마나 느려 질 수 있는지...
처음 사용하던 탐색 방법은 DFS(Depth First Search - 깊이 우선 방식)으로 Stack 구조의 재귀함수를 사용하는 방법이다.
아래는 C#으로 만들어본 DFS 방식의 파일 검색 함수이다.
private ListDirSearch(string sDir, string extName) { List tmpList = new List (); try { foreach (string f in Directory.GetFiles(sDir, extName)) tmpList.Add(f); foreach (string d in Directory.GetDirectories(sDir)) { tmpList.AddRange(DirSearch(d, extName).ToArray()); } } catch (Exception excpt) { MessageBox.Show(excpt.Message); //return tmpList; } return tmpList; }
자주 다니는 사이트에서 BFS(Breadth First Search - 너비 우선 방식)을 알게되어 이를 운용해 봤는데 확실히 이 방법이
빠른 속도를 보인다. 다만.. 저장공간 사용량이 DFS에 비해 많다는 것...
하지만 요즘 PC들이 메모리가 좀 많은가... 많이 쓴다고 해봤자 메모리양에 비하면 새발의 피지... ㅎㅎ
아래는 BFS 방식의 파일 검색 함수 예제이다.
private ListDirSearch(string sDir, string extName) { List tmpDir = new List (); List fileList = new List (); int head = 0, tail = 0; tmpDir.Add(sDir); tail++; while (head != tail) { try { foreach (string d in Directory.GetDirectories(tmpDir[head])) { tmpDir.Add(d); tail++; } foreach (string f in Directory.GetFiles(tmpDir[head++], extName)) fileList.Add(f); } catch (Exception excpt) { MessageBox.Show(excpt.Message); //return tmpList; } } return fileList; }
좀.. 당황스러운건... C#으로 두 함수를 만들어 비교해 봤지만...
시간 차이가 거의 없다는 것... ㅡ_ㅢ;;;
나 실패한건가 T^T
2009년 2월 7일 토요일
스마트 클라이언트 만들기 첫 경험........
고객측에서 웹페이지에 링크를 해달라는 요청....
무슨소린가 하고 다른 프로젝트 쪽에 확인해보니...
ClickOnce로 만들어 달라는 것이군...;;
두 시간 동안 자료 뒤지고.. 간단하게 웹서버 만들어서 무작정 따라해봤으나 ㅡㅡ;
DLL들 설치나... 게시할때 SSL 사용여부 등에 따라 ㅡㅡ;
아우.. ㅡ_ㅢ;;;
하루 날렸다 ㅡㅡ;
그나마 다행히 ClickOnce가 어떻게 돌아가는지는 이해했으니...;;;
안그럼..
캐안습이었겠지 ㅡㅡ;
MS 스마트 클라이언트 아파치에서 실행 문제 해결
이 때는 프로그램이 게시되어 있는 폴더에 ".htaccess"라는 파일을 생성하고,
(이미 있다면 파일 하단에 추가)
아래 내용을 추가하여 저장합니다.
AddType application/x-ms-application application
AddType application/x-ms-manifest manifest
AddType application/octet-stream deploy
아파치를 재시작하고 다시 접속해 보면....
성공!!!
프로그램 중복 실행 방지 v2
static void Main() { System.Diagnostics.Process[] myProc = System.Diagnostics.Process.GetProcessesByName(Application.ProductName); if(myProc.Length < 2) Application.Run(new Form1()); else { MessageBox.Show("이미 실행중입니다"); Application.Exit(); } }
프로세스상에 실행된 프로그램으로 확인하는 방법
2009년 2월 5일 목요일
하위 폴더를 포함한 폴더 및 파일 검색 스크립트
#cs ----------------------------------------------------------------------------
프로그램 이름 : FileSearch
파일 : FileSearch.au3
Autoit버전 : 3.3.0.0
함수 : _FileSearch($sPath[, $sExt[, $iFlag]])
설명 : 하위 폴더를 포함하여 폴더 및 파일 검색
$sPath - 파일 찾기 경로(지정하지 않을 경우 작업 폴더를 기본으로 함)
$sExt - 찾고자 하는 필터(기본값 '*')
$iFlag - 찾기 옵션
$iFlag = 0 폴더와 파일 모두 검색(기본값)
$iFlag = 1 파일만 검색
$iFlag = 2 폴더만 검색
저자 : Kuro™
연락처 : kuro78@gmil.com, http://kuroz.tistory.com
환경 : WInXP SP3(윈도우NT기반)
수정 : 2009.02.04 - 최초 작성
#ce ----------------------------------------------------------------------------
Func _FileSearch($sPath = '', $sExt = '*', $iFlag = 0)
Local $aResult[1], $aPath[1]
Local $iHead = 1, $iTail = 1, $iCount = 0
Local $hSearch
If $sPath = '' Then $sPath = @WorkingDir
If StringRight($sPath, 1) = '\' Then $sPath = StringTrimRight($sPath, 1)
_ArrayAdd($aPath, $sPath)
$iTail += 1
while $iHead <> $iTail
Local $sTmp, $sTmpPath
$sTmpPath = $aPath[$iHead] & '\'
$hSearch = FileFindFirstFile($sTmpPath&$sExt)
If @error <> -1 Then
$iHead += 1
Do
$sTmp = FileFindNextFile($hSearch)
If @error Then
FileClose($hSearch)
ExitLoop
EndIf
If $sTmp = '.' Or $sTmp = '..' Then ContinueLoop
If StringInStr(FileGetAttrib($sTmpPath & $sTmp), 'D') Then
_ArrayAdd($aPath, $sTmpPath & $sTmp)
If $iFlag <> 1 Then $iCount = _ArrayAdd($aResult, $sTmpPath & $sTmp)
$iTail += 1
ContinueLoop
EndIf
If $iFlag <> 2 Then $iCount = _ArrayAdd($aResult, $sTmpPath & $sTmp)
Until 0
EndIf
WEnd
$aResult[0] = $iCount
Return $aResult
EndFunc
최종 버전... 처음엔 재귀함수 형태로 파일 검색 로직을 만들었다가 좌절했던...
bfs 방식으로 검색하도록 수정 후 확실히 속도는 많이 올라갔음...
약 4000개 파일 2000개 폴더 검색하는데 평균 45초 정도 걸린다...;;
아래는 처음에 작성했던 소스.....
재귀함수는 저하늘에 별에게나 줘버려 ㅡ_ㅢ;;
#include-once
#include <Array.au3>
Func _FileSearch($sParam, $iSub = 0, $iDirInc = 0)
Local $hSearch, $aList[1], $aDirs[1], $sPath, $sExt
$sPath = StringLeft($sParam, StringInStr($sParam, '\', 0, -1))
If $sPath = '' Then $sPath = @WorkingDir & '\'
$sExt = StringTrimLeft($sParam, StringInStr($sParam, '\', 0, -1))
If $sExt = '' Then $sExt = '*.*'
$hSearch = FileFindFirstFile($sPath & $sExt)
If @error <> -1 Then
Local $sFile, $iCount
Do
$sFile = FileFindNextFile($hSearch)
If @error Then
FileClose($hSearch)
ExitLoop
EndIf
If $sFile = '.' Or $sFile = '..' Then ContinueLoop
If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
$iCnt = _ArrayAdd($aDirs, $sPath & $sFile)
$aDirs[0] = $iCnt
If Not $iDirInc Then ContinueLoop
EndIf
$iCount = _ArrayAdd($aList, $sPath & $sFile)
until 0
$aList[0] = $iCount
EndIf
If $iSub Then
Local $aTmp
For $i = 1 to $aDirs[0]
$aTmp = _FileSearch($aDirs[$i] & '\' & $sExt, $iSub, $iDirInc)
For $j = 1 to $aTmp[0]
_ArrayAdd($aList, $aTmp[$j])
Next
$aList[0] += $aTmp[0]
Next
EndIf
Return $aList
EndFunc