Microsoft Expression Blend 2 툴을 이용하여 XAML을 생성하였다;
그중 Image라는 컨트롤을 넣었는데 상황에 따라 그림파일을 동적으로 바꿔주고 싶었지만

방법을 몰라 고생하다가! 별것도 아닌걸 꽤나 오랜시간걸려서 찾은것같아;
이런문제로 고생하고 있을 다른 분들을 위한 포스팅!

<Image Height="80" HorizontalAlignment="Left" x:Name="itemImage" Width="80" Source="image.bmp"/>
이 XMAL 코드에서처럼  Source="image.bmp" 이런식으로 초기에는 간단하게 bmp 파일과 연결할수있다;

비하인드 코드에서 제어하기 위해서는

 private void ChageSource()
 {
    itemImage.Source = 
          new BitmapImage(new Uri(m_itemImageURL, UriKind.Relative));
 }
 

BitmapImage를 생성하고 해당하는 경로를 Uri로 넣어주면 간단하게 해결된다!!
사용을 위해 using System.Windows.Media.Imaging;  을 추가한다
여기서 Uri()생성자의 처음 인자는 "파일의 경로" 이고

두번째인자의 UrlKind.Relative (상대경로) ,UrlKind.Absolute (절대경로) ,UrlKind.RelativeOrAbsolute (둘다)
의미한다!


Posted by 맨날맑음
,

실버라이트의 Storyboard를 이용하면 간단하게 타이머를 만들수있다;

물론 System.Windows.Threading.DispatcherTimer 를 이용해도 같은 효과를 낼수있다!

매우 간단한 예제인지라 소스코드만 보면 금새 알수 있을것이다!


using System;
using System.Windows;
using System.Windows.Controls;
//실버라이트 스토리보드를 이용하기 위해 using!
using System.Windows.Media.Animation;

//실버라이트 스토리보드를 이용한 타이머 예제
namespace MyTimer
{
    public partial class Page : UserControl
    {
        Storyboard timer = new Storyboard();
        int cnt = 0;

        public Page()
        {
            InitializeComponent();
            //타이머 간격 설정;
            timer.Duration = new Duration(new TimeSpan(0, 0, 1));

            //x:Name 설정            
            timer.SetValue(NameProperty, "StoryboardTimer");

            //타이머 종료 이벤트 등록
            timer.Completed += new EventHandler(timer_Completed);

            //타이머 시작
            timer.Begin();
        }

        //타이머 종료 이벤트
        void timer_Completed(object sender, EventArgs e)
        {
            txtResult.Text = string.Format("{0} TimeSpan..", ++cnt);
            //다시한번 타이머를 호출한다!
            timer.Begin();
        }
    }
}
Posted by 맨날맑음
,

리스트박스를 이용하여 채팅 프로그램을 구현했지만
글이 길어지면 자동으로 스크롤 돼지 않아서 불편한 경험이있었다;

이번 포스팅에서는 간단하게 리스트박스를 자동으로 스크롤 하는 방법을 알아보려구 한다;

매우 간단하다!! 단 두줄;

 void IDT_TEXT_KeyDown(object sender, KeyEventArgs e)
        {
            //텍스트박스에 누른 키가 엔터일경우
            if(e.Key == Key.Enter)
            {
                if (IDT_TEXT.Text == "")
                {
                   return;
                }

                IDL_LIST.Items.Add(IDT_TEXT.Text);
                //리스트박스의 스크롤을 자동으로///////////////////////////
                IDL_LIST.UpdateLayout();
                IDL_LIST.ScrollIntoView(IDL_LIST.Items[IDL_LIST.Items.Count-1]);
                ///////////////////////////////////////////////////////////
                IDT_TEXT.Text = "";
            }   
        }   
  
여기서 주목할 부분은 이 두줄이다
IDL_LIST.UpdateLayout();
IDL_LIST.ScrollIntoView(IDL_LIST.Items[IDL_LIST.Items.Count-1]);


리스트박스를 업데이트하고; 스크롤을 가장 최근의 글을 보게 하면
자동으로 스크롤되느느 리스트박스를 볼수있다!!!
모두들 메리크리스마스!!ㅋㅋㅋ
Posted by 맨날맑음
,

mp3

2 개의 파일을 합치고자 할때 콘솔 명령어로 간단하세 합칠수 있다;

실행 -> cmd
 copy    /b   media1.mp3 + media2.mp3    result.mp3 

동영상

mp3와 동일하지만, 
 copy /b  media1.avi + media2.avi  result.avi
 /b: 파일을 바이너리로 취급

합친 후, 인덱스 재생성을 해야한다!(AVI 포맷일경우)
mencoder -ovc copy -oac copy  result.avi    -o  indexingResult.avi


mencoder를 이용하여 index만 빠르게 처리한다.

-ovc copy           Option Video Codec  copy (그대로 사용)
-oac copy           Option Audio Codec  copy (그대로 사용)
-o                      OUT FILE NAME


주의할 점은, mencoder에서 처리할 수 있는 codec으로 된 파일만 처리가능한 것이다.

다수의 영상 & mp3

다수의 영상이나 mp3의 경우
순차로 이름지어진 파일들을 하나의 폴더에 모은뒤, 아래처럼 하면된다.
copy /b  *  newfilename

* 마찬가지로 동영상일경우 인덱스 재생성

Posted by 맨날맑음
,

ffmpeg   -i   동영상.avi -ss  600  -t  120  -vcodec copy -acodec copy  clip.avi

-ss   10분(600초)부터 부분파일을 시작
-t      2분간(120초) 해당하는 부분 선택
-vcodec copy         비디오codec을 원본과 동일하게 지정(변환없이 원본그대로 사용)
-acodec copy         오디오codec ........  ...

clip.avi   출력파일명


위에 -t  대신에 -fs를 대체하면 파일용량 상한선을 지정할 수 있다..

-> 시작옵션만 지정하면, 시작부터 파일끝까지..
-> 끝옵션만 지정하면, 시작부터 제한된 시간까지..

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

mp3를 비롯한 다른 오디오 파일을 잘라내는 방법 또한 위의 내용과 같다.

10분짜리 mp3파일을 반절로 나눌때
ffmpeg -i FILE.mp3  -acodec copy  -t 300    전반부.mp3
-t 300 (초)       5분까지라는 뜻으로 시작점이 지정되지 않았기 때문에 처음부터 5분까지이다.

ffmpeg -i FILE.mp3  -acodec copy  -ss 300    후반부.mp3
-ss 300 (초)      5분부터라는 뜻으로, 끝부분이 지정되지 않았기 때문에 5분부터 끝까지이다.


그 외에도 다른 오디오분할도 위와 같이 하면 된다.
단순한 분할이 목적이라면, 오디오편집프로그램보다 이것이 더 빠르다.  

만약 안된다면, 해당프로그램버젼에서 지원이 안되는 codec이기 때문이다.
지원되는 형식과, codec 종류를 알고 싶을땐... 아래 명령을 사용
ffmpeg -formats

compile할대의 옵션의 차이에 의해서 codec지원이 되고, 안된다. 
Posted by 맨날맑음
,

NET Framework 3.0에서 LINQ로 인하여 너무나도 많은 것이 변화되어 버렸기에 짚고 넘어가야만 한다.

 LINQ의 아키텍쳐

조금 작긴하지만 LINQ로 할 수 있는 것은 object, Dataset, SQL, Entities, XML 이렇게 5가지이며 Object와 RDB, XML 3가지에 대해 컨트롤 할 수 있게 되었다. 다시말해 3tire 시스템에서 맨 끝에 존재하는 현존하는 데이터 영역 모두를 LINQ를 통해 단일화된 방법으로 사용할 수 있는 것이다. (생각해보자 그전에 Data Object, DB, XML 3가지의 사용법이 모두 달라 얼마나 힘들었는지?) 또한 LINQ를 활용하여 delegate 대리자를 선언하지 않아도 되며 OR Mapping 툴 또는 Framework를 별도로 설치하지 않아도 된다.

NET Framework 3.0 의 변화 부분


1. "var" (Local Variable Type Inference) 변수 지원
var는 정말 불확실성때문에 꺼려지는 문법중하나이다. 그러나 MS가 누구인가? VB부터 줄곧 따라다니던 VAR를 포기하나 했더니 결국 집어 넣고 말았다.
using System;
class Test {
  public static void Main() {
    var a = "12345";
    Console.WriteLine (a);
    var b = 123456;
    Console.WriteLine (b.ToString());
  }
}
컴파일 부터 실행까지 아무런 문제 없이 실행된다. -_- 단, var를 실행되는 런타임이 결정하는 것이 아니라 컴파일하는 컴파일러가 결정한다. 따라서 null을 넣게 되면? "test.cs(4,9): error CS0815: 암시적으로 형식화된 지역변수에는 을 할당 할 수 없습니다."라는 메시지를 보게될 것이다. 이부분이 가장 중요한 부분이다. 왜냐면 다른 특징들은 모두 var를 지원함으로써 얻어지는 것이기 때문이다.
 
2. 배열, XML, DB 등 데이터를 가져오는 것이 하나의 방법으로 통한다.
바로 이부분이 LINQ의 능력이다. 배열이나 XML, DB등 데이터를 가져와서 핸들링 할때 데이터를 가져오는 부분이 모두 달랐다. XML을 파싱해서 각각의 변수에 넣었다가 핸들링하고 다시 집어 넣고 노가다 였는데 모든 것을 Linq 한방에 핸들링 할 수 있다는 것이다.
using System;
using System.Linq;

class Test {
  public static void Main() {
      int[] scores = new int[] { 97, 92, 81, 60 };



      var scoreQuery =  from score in scores 
                               where score > 80 
                               select score;



      foreach (int i in scoreQuery)
      {
          Console.Write(i + " ");
      }            
  }
}
배열인 scores에 대해 80점 이상인 놈만 가져오자. 이런거 할려면 if문 넣어서 뺑뺑이 돌리던 기억이 엇그제 같은데 LINQ로 한방에 끝나버린다.

3. Anonymous Type을 지원한다.
다음의 황당한 코드 함 보자.
using System;
class Test {
  public static void Main() {
      var user = new { Name = "vicviper", Age = 35 };
      Console.WriteLine (user.Name);
  }
}
무엇이 황당한가? 분명 2.0대에서는 user라는 클래스를 만들고 Name과 Age를 인터페이스 선언하여야 정상 작동하던 코드였다. 그러나, 우리의 C# 3.0 컴파일러는 이렇게 단순한 놈은 자동으로 생성해버린다. 따라서, 컴파일러 오류도 없고 정상작동되는 것이다. 심지어 이런것도 가능하다.
using System;class Test {
  public static void Main() {
      var family1 = new { Name = "papa", Age = 35 };
      var family2 = new { Name = "mama", Age = 35 };
      Console.WriteLine (family1.Age + family2.Age);
  }
}

XML 파싱하기

 (파일명 : test.xml)


   111.111.111.111
   vic
   password

Linq이전에는 이녀석을 비교하려고 XML Document 열어서 열심히 While문으로 Read했었다. Linq로 이놈을 한번 분석해보면 다음과 같이 매우 짧게 진행할 수 있다.
using System.Linq;
using System.Xml;
using System.Xml.Linq;


class Test {
  static void Main(){ 
   XDocument xe = XDocument.Load(System.Windows.Forms.Application.StartupPath  + "\\test.xml");
    var query = from c in xe.Descendants("config") 
                    select c;

   foreach(var q in query)
   {
      Console.WriteLine(q);
   }
   Console.ReadLine();
  }  
}
실행시켜보면 위의 XML전체가 출력되는 것을 볼수 있을 것이다. 이제 이녀석을 좀더 다듬어 보자. "select c;"라고 된 부분을 "select c.Element("id");"로 바꿔보자.
var query = from c in xe.Descendants("config") 
                    select c.Element("id");
실행을 하면 XML의 ID부분만 출력이 될 것이다.
111.111.111.111
어쩐지 제대로 찾아 들어오는 느낌. 이제 아까 바꾼 "select c.Element("id");"를 "select c.Element("id").Value;"로 바꿔보자.
    var query = from c in xe.Descendants("config") 
                    select c.Element("id").Value;
실행하면 결과가 아주 이쁘게 값만 떨어진다.
111.111.111.111
그런데 여기서 만족할 수 없다. 여러개의 값을 가려오려면 어떻게 해야 할 까? 다음과 같이 함 바꿔보자.
var query = from c in xe.Descendants("config") 
                    select new 
                    {
                        id = c.Element("id").Value,
                       user = c.Element("user").Value
                     }
   //이번에는 foreach문도 바꿔주자
   foreach(var q in query)
   {
      Console.WriteLine(q.id + q.user);
   }   
결과는 직접 함 해보도록하고 이제 다음단계로 SQL문처럼 한번 써보자. 다음과 같이 바꿔보고 실행 함 해보자.
   var query = from c in xe.Descendants("config") 
                where c.Element("user").Value == "vic"
                select c;
어떤게 나오는가? where문이 진짜 먹으니 뿌듯한 느낌!


XML생성


이제 한걸음 더 나가서 XML을 생성함 해보자. 사용은 무지 쉽다.
using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

class Test {
  static void Main(){ 
  XDocument xdoc =
      new XDocument(
      new XDeclaration("1.0", "UTF-8", "yes"),
      new XProcessingInstruction("TEST", "TEST Data"),
      new XComment("테스트 XML"),
      new XElement("config",
          new XElement("id", "1234"),
          new XElement("user", "abc")
      )         
   );
   xdoc.Save(System.Windows.Forms.Application.StartupPath  + "\\test.xml");
  }  
}
test,xml을 열어 보면




  1234
  abc

이렇게 정확하게 들어와 있는 것이 보일것이다.
Posted by 맨날맑음
,


개발관련 포스팅을 하려면 소스코드를 넣을일이 많을텐데
소스코드르르 넣어두 색상변경도 번거롭고 블로그에 그냥 붙여넣었을땐
왠지 알아보기도 어려운 것이 영 찝찝할때가 많다;

하지만 Google Code 의 SyntaxHighlighter를 블로그에 설치하면 이런 걱정이 말끔히
해결된다!!!!

설치방법

1. Google Code 의 SyntaxHighlighter 사이트로 가서 최신버전을 받는다;

2. 다운받은 SyntaxHighlighter_1.5.1.rar 파일을 적당한곳에 압축을 푼다;

3. 티스토리 관리자 메뉴에서 '스킨선택' -> '파일 업로드'를 이용하여 파일을 올린다;
    올릴파일은 압축푼 Scripts폴더와 Styles 폴더에 있는 파일을 모두 올린다
    ! 이때 Uncompressed 파일도 있는데 Scripts가 슬림한 파일이므로 이걸 올려야 속도가 빠르다;



4. 파일을 올린후 저장하고 '스킨선택' -> 'HTML/CSS 편집창에서' </body> body 종료 태그 바로위에
밑의 태그를 붙여 넣는다!
   여기까지 했다면 설치는 완료!
   ! 이때 자신이 사용하지 않는 language는 빼고 넣는것이 더욱 속도를 높이는 방법이다;
<!-- google code for syntaxhighlight -->    
<link href="./images/SyntaxHighlighter.css" type="text/css" rel="stylesheet" /></link>    
<script language="javascript" src="./images/shCore.js"></script>    
<script language="javascript" src="./images/shBrushCpp.js"></script>    
<script language="javascript" src="./images/shBrushCSharp.js"></script>    
<script language="javascript" src="./images/shBrushCss.js"></script>    
<script language="javascript" src="./images/shBrushDelphi.js"></script>    
<script language="javascript" src="./images/shBrushJava.js"></script>    
<script language="javascript" src="./images/shBrushJScript.js"></script>    
<script language="javascript" src="./images/shBrushPhp.js"></script>    
<script language="javascript" src="./images/shBrushPython.js"></script>    
<script language="javascript" src="./images/shBrushRuby.js"></script>    
<script language="javascript" src="./images/shBrushSql.js"></script>    
<script language="javascript" src="./images/shBrushVb.js"></script>    
<script language="javascript" src="./images/shBrushXml.js"></script>    
<script language="javascript">    
dp.SyntaxHighlighter.ClipboardSwf = './images/clipboard.swf';     
dp.SyntaxHighlighter.HighlightAll('code');     
</script>    
<!-- google code for syntaxhighlight -->  


글쓰기시 사용방법!

    코드를 사용하고자 하는곳에 다음과 같이 HTML 태그만 넣으면 된다!

   ex) C# 언어의 경우
   <pre name="code" class="c#:firstline[1]">
      //여기에는 코드를 붙여 넣는다
  </pre>


TEST

Posted by 맨날맑음
,

소스코드

using System.Xml.Linq;

namespace XMLSample
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
           
            WebClient wc = new WebClient();
            //이벤트 등록
            wc.DownloadStringCompleted +=
                new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);                            
            wc.DownloadStringAsync(new Uri("Outer.xml", UriKind.RelativeOrAbsolute));         
        }

        void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            XDocument xDoc = XDocument.Parse(e.Result); // 외부에 존재하는 XML 파일을 읽을 경우

            var linq = from c in xDoc.Descendants("Item")
                       select (string)c.Value;

            foreach (string item in linq)
            {
                tbOuter.Text += item + "\n";
            }
        }
    }
}


XML 소스
<?xml version="1.0" encoding="utf-8" ?>
<Items>
  <Item>Car</Item>
  <Item>Road</Item>
  <Item>Tree</Item>
  <Item>Park</Item>
  <Item>Mountain</Item>
</Items>


Posted by 맨날맑음
,