Korea Evangelist

Developer & Platform Evangelism, Microsoft Korea

February, 2011

  • Korea Evangelist

    모다의 윈도우폰7 뚝딱 팩토리(13)-터치 스크린 위의 다양한 키보드

    • 0 Comments

     

     

    한국마이크로소프트에서 초급 스마트폰 개발자 분들을 위해 공개하는 모다의 윈도우폰7 뚝딱 팩토리 열세번째 영상!

    윈도우폰의 하드웨어 표준안을 보면 풀 터치를 기본으로 하고 있고, 추가적으로 외장 하드웨어 키보드를 제조사가 추가할 수 있게 되어있습니다. 풀 터치 환경에서는 가상키보드(SIP: Soft Input Panel)를 터치스크린 위에 띄워서 입력을 받게 되는데요, 기본적으로는 Qwerty 자판 형식을 취하고 있지만 터치스크린의 장점을 십분 활용해서  각 상황에 맞게 커스터마이징 된 키보드가 제공됩니다.

    예를들면 웹 서핑을 하는 경우에는 [.com] 이 들어간 변형 키보드가, 이메일을 보낼 때는, [@] 특수기호가 첫 화면에 뜨는 키보드가, 전화를 걸 때는 숫자만 올라오는 키보드가 사용자 편의성을 증대시키지요. 윈도우폰에서는 약 60여가지의 가상키보드 형태를 지원하고 있으며 개발자 분들이 여러 가지 중 하나를 선택해서 화면에 띄울 수 있도록 개발환경을 제공하고 있습니다. 예를 들어 이메일 입력을 위한 가상키보드 설정은 다음과 같이 할 수 있습니다.

     

       1:  textBox1.InputScope = new InputScope()
       2:  {
       3:        Names = {new InputScopeName() { NameValue = InputScopeNameValue.EmailSmtpAddress } }
       4:  };

     

    구현 자체는 매우 간단하지만, 어플리케이션을 사용하는 입장에서는 정말 유용한 기능중의 하나입니다. 이런 요소들이 하나하나 모여서 사용자를 감동시키고 다른 어플리케이션과 차별화를 할 수 있는 것이지요.

     

       1:  using System;
       2:  using System.Collections.Generic;
       3:  using System.Linq;
       4:  using System.Net;
       5:  using System.Windows;
       6:  using System.Windows.Controls;
       7:  using System.Windows.Documents;
       8:  using System.Windows.Input;
       9:  using System.Windows.Media;
      10:  using System.Windows.Media.Animation;
      11:  using System.Windows.Shapes;
      12:  using Microsoft.Phone.Controls;
      13:   
      14:  namespace SIP_sample
      15:  {
      16:      public partial class MainPage : PhoneApplicationPage
      17:      {
      18:          // Constructor
      19:          public MainPage()
      20:          {
      21:              InitializeComponent();
      22:          }
      23:   
      24:          private void button1_Click(object sender, RoutedEventArgs e)
      25:          {
      26:              textBox1.InputScope = new InputScope()
      27:              {
      28:                  Names = {new InputScopeName() { NameValue = InputScopeNameValue.EmailSmtpAddress } }
      29:              };
      30:          }
      31:   
      32:          private void button2_Click(object sender, RoutedEventArgs e)
      33:          {
      34:              textBox1.InputScope = new InputScope()
      35:              {
      36:                  Names = { new InputScopeName() { NameValue = InputScopeNameValue.TelephoneNumber } }
      37:              };
      38:          }
      39:      }
      40:  }

     

     

  • Korea Evangelist

    모다의 윈도우폰7 뚝딱 팩토리(12)-카메라와 앨범 연동하기

    • 0 Comments

     

    한국마이크로소프트에서 초급 스마트폰 개발자 분들을 위해 공개하는 모다의 윈도우폰7 뚝딱 팩토리 열두번째 영상!

    윈도우폰에서는 각 기능들에 대해 접근을 엄격하게 제한하고 있지만, 몇 가지 기능들에 대해 예외를 적용하고 있습니다. 바로 사진, 주소록 등의 데이터에 접근하는 기능인데요 이 기능들과 어플리케이션이 연동되기 때문에 훨씬 멋지고 편리한 기능이 만들어 질 수 있답니다.

    하지만 개인정보들이 담긴 데이터의 접근은 신중해야 합니다. 함부로 개인데이터를 조회하고 유출하지 못하도록 윈도우폰의 개발환경에서는 이에 접근할 때 사용하는 Launchers & Choosers 라는 것이 있습니다. 이 기술은 어플리케이션에서 활용할 데이터를 선택함에 있어 사용자가 결정권을 쥐게 되고 그만큼 의도하지 않은 개인정보 사용을 피할 수 있는, 두 마리 토끼를 모두 잡은 기술이지요.

    참고로 이 기술들을 활용한 어플리케이션을 조작할 때는 주로 실제 폰에서 테스트를 하게 되는데요, 사진이나 미디어 등의 자료에 접근 할 경우 디버거에서 오류가 나는 경우가 종종 발생합니다. 그 이유는 싱크 프로그램인 Zune 소프트웨어가 폰의 미디어 관련 자료들의 접근을 제한하기 때문이죠. 따라서 Zune 소프트웨어가 동작하지 않는 상태에서 디버깅 할 수 있는 방법을 찾으셔야 하는데요, Windows Phone Connect Tool이 이런 문제들을 해결해 주고 있습니다. 어떻게 디버깅 하는지 한번 살펴볼까요?

     

     

    이번 영상에서는 chooser를 이용해 카메라와 앨범기능을 사용하는 예제와 함께, Connect Tool을 이용해 디버깅 하는 방법도 알려드립니다!

     

       1:  using System;
       2:  using System.Collections.Generic;
       3:  using System.Linq;
       4:  using System.Net;
       5:  using System.Windows;
       6:  using System.Windows.Controls;
       7:  using System.Windows.Documents;
       8:  using System.Windows.Input;
       9:  using System.Windows.Media;
      10:  using System.Windows.Media.Animation;
      11:  using System.Windows.Shapes;
      12:  using Microsoft.Phone.Controls;
      13:   
      14:  using Microsoft.Phone;
      15:  using Microsoft.Phone.Tasks;
      16:   
      17:  namespace CameraApp
      18:  {
      19:      public partial class MainPage : PhoneApplicationPage
      20:      {
      21:          CameraCaptureTask camTask;
      22:          PhotoChooserTask photoTask;
      23:   
      24:          // Constructor
      25:          public MainPage()
      26:          {
      27:              InitializeComponent();
      28:              camTask = new CameraCaptureTask();
      29:              photoTask = new PhotoChooserTask();
      30:   
      31:              camTask.Completed += new EventHandler<PhotoResult>(imageTask_Completed);
      32:              photoTask.Completed +=new EventHandler<PhotoResult>(imageTask_Completed);
      33:          }
      34:   
      35:          void imageTask_Completed(object sender, PhotoResult e)
      36:          {
      37:              // throw new NotImplementedException();
      38:              image1.Source = PictureDecoder.DecodeJpeg(e.ChosenPhoto); // 이미지 처리
      39:              textBlock1.Text = e.OriginalFileName;
      40:          }
      41:   
      42:          private void button1_Click(object sender, RoutedEventArgs e)
      43:          {
      44:              camTask.Show();
      45:          }
      46:   
      47:          private void button2_Click(object sender, RoutedEventArgs e)
      48:          {
      49:              photoTask.Show();
      50:          }
      51:      }
      52:  }

     

     

  • Korea Evangelist

    모다의 윈도우폰7 뚝딱 팩토리(11)-보안 프로그래밍

    • 0 Comments

     

     

    한국마이크로소프트에서 초급 스마트폰 개발자 분들을 위해 공개하는 모다의 윈도우폰7 뚝딱 팩토리 열한번째 영상!

    유무선을 막론하고, 중요한 것이 바로 보안입니다. 정말 간단한 어플리케이션이 아닌 이상, 항상 보안과 관련된 문제에 부딪히기 마련인데요, 특히 스마트폰 위에 올라가는 어플리케이션들은 민감한 개인정보를 활용 할 수 있고, 노출이 잘 되는 무선 환경을 사용하기 때문에 더더욱 조심하셔야 합니다.

     

    Launcher and Chooser / 격리된 저장소처럼 윈도우 폰의 기본 기능/환경으로 제공하는 보안기능도 있지만 개발자가 직접 프로그래밍을 해 주셔야 하는 부분도 존재합니다. 예를 들어 통신과 관련된 어플리케이션을 만들었는데, 내가 무엇을 검색하고 누구한테 어떤 메세지를 보내는지 모두 노출이 되면 사용자 입장에서는 달갑지 않은 느낌이 들겠죠. 이러한 문제들을 덜기 위해서 도입하는 방법이 바로 암호화입니다. 그리고 윈도우폰에서는 이러한 암호화 프로그래밍을 조금 더 생산적으로 하기 위해 6가지 보안 알고리즘을 기본적으로  지원합니다. 물론 외부 라이브러리나 직접 코딩하는 방법등을 통해서 다른 알고리즘을 구현 할 수도 있습니다.

    동영상의 예제에서는 단방향 암호화 알고리즘인 SHA를 이용해서 비밀번호를 안전하게 체크하는 방법을 사용하고 있는데요, 이해를 돕기 위해 비밀번호가 무엇인지 string 값에 비밀번화를 직접 대입하고 시연을 하였지만,  실제 프로그래밍에서 영상처럼 암호화되지 않은 비밀번호(전문용어로는 plaintext라고 합니다)를 하드코딩하는 방법은 위험한 방법입니다. 사용자가 직접 볼 수는 없지만, 리버스 엔지니어링 등 각종 해킹 시도로 노출이 될 가능성이 더 높아지기 때문이지요. 따라서 예제 동영상보다 조금 더 안전한 프로그래밍을 하시려면 한번 암호화를 거친 ByteArray 자체를 직접 하드코딩 하시는 방법이 더욱 안전합니다.

    보안 자체는 상당히 복잡한 학문입니다. 수학과 컴퓨터과학이 결합되어 있고, 그 자체를 모두 이해하려면 오랜 시간이 소요되므로 많은 학교나 학원 등의 교육기관에서 별도의 교육과정을 두고 있는 것을 보실 수가 있습니다. 따라서, 보안 알고리즘이 어떻게 되어있고, 어떤 상황에 사용해야 하는지에 대한 자세한 사항은 전문 문서나 서적 등을 참고해 주세요.

     

       1:  using System;
       2:  using System.Collections.Generic;
       3:  using System.Linq;
       4:  using System.Net;
       5:  using System.Windows;
       6:  using System.Windows.Controls;
       7:  using System.Windows.Documents;
       8:  using System.Windows.Input;
       9:  using System.Windows.Media;
      10:  using System.Windows.Media.Animation;
      11:  using System.Windows.Shapes;
      12:  using Microsoft.Phone.Controls;
      13:   
      14:  using System.Security.Cryptography;
      15:  using System.Text;
      16:   
      17:  namespace securityWP7
      18:  {
      19:      public partial class MainPage : PhoneApplicationPage
      20:      {
      21:          // 암호화 되지 않은 비밀번호를 하드코딩하는 방법은 가급적 피해주시기 바랍니다
      22:          private string originalPassword = "MODA";
      23:          private UnicodeEncoding uniEncoder;
      24:          private byte[] originalPasswordByteCode;
      25:   
      26:          // Constructor
      27:          public MainPage()
      28:          {
      29:              InitializeComponent();
      30:   
      31:              // 바이트코드로 변환
      32:              uniEncoder = new UnicodeEncoding();
      33:              originalPasswordByteCode = uniEncoder.GetBytes(originalPassword);
      34:          }
      35:   
      36:          private void button1_Click(object sender, RoutedEventArgs e)
      37:          {
      38:              if (checkPassword(textBox1.Text))
      39:              {
      40:                  MessageBox.Show("Password Confirmed");
      41:              }
      42:              else 
      43:              {
      44:                  MessageBox.Show("Incorrect Password");
      45:              }
      46:          }
      47:   
      48:          private bool checkPassword(string inputPassword)
      49:          {
      50:              // throw new NotImplementedException();
      51:              SHA1Managed hasher = new SHA1Managed();
      52:              int i;
      53:   
      54:              // 사용자 입력을 바이트코드로 변환
      55:              byte[] userInputbyByteCode = uniEncoder.GetBytes(inputPassword);
      56:              // 변환된 바이트코드를 SHA1 해싱
      57:              byte[] hashedUserInput = hasher.ComputeHash(userInputbyByteCode);
      58:              // 저장된 패스워드도 해싱
      59:              byte[] hashedPassword = hasher.ComputeHash(originalPasswordByteCode);
      60:   
      61:              // 두 byte[] 배열이 동일한지 확인
      62:              for (i = 0; i < hashedPassword.Length; i++)
      63:              {
      64:                  if (hashedPassword[i] != hashedUserInput[i])
      65:                      return false;
      66:              }
      67:              return true;
      68:          }
      69:      }
      70:  }

     

  • Korea Evangelist

    {CODE PARTY} 2월 23일 세미나 개발자들을 위한 클라우드 개발

    • 0 Comments


    등록은 ==> 여기에서 ^^

  • Korea Evangelist

    모다의 윈도우폰7 뚝딱 팩토리(10)-가속도계(중력센서) 사용하기

    • 0 Comments

     

     

    한국마이크로소프트에서 초급 스마트폰 개발자 분들을 위해 공개하는 모다의 윈도우폰7 뚝딱 팩토리 열번째 영상!

    윈도우폰 표준안에는 중력센서라고도 알려져 있는 ‘가속도계(accelerometer)’가 탑재되어있습니다. 이 센서를 통해 지금 휴대폰이 제대로 서 있는지, 아니면 눕혀있는지 상태를 체크할 수 있고, 조금 더 재미있는 기능을 만들자면 이 값의 변화를 감지해서 흔들고 있는지, 아니면 충둘이 일어났는지를 확인할 수도 있습니다. 현재 우리가 하고 있는 다양한 자동차 게임 역시 이 가속도계를 사용하여 구현되어있지요. 활용하기에 따라 다양하고 기발한 어플리케이션을 만들 수도 있습니다.

    폰이 눕혀있는 상태가 가로, 세로, 앞뒤가 있기 때문에 3차원 좌표계를 사용하며, 상태 측정 자체는 비교적 간단하지만 실제 어플리케이션을 개발하고 활용하실 때는 약간 머리아픈(!) 3차원 좌표계 관련 연산과 삼각함수같은 수학적 연산을 활용 해 주셔야 하는 경우가 종종 발생합니다. 아니면 다음과 같은 트릭을 생각 해 볼 수도 있지요

     
    // pseudo code
    double accel = e.X;
    double velocity += accel;
    position += velocity;
     
    어떤 기능을 하는 코드인지 감이 잡히시나요? 이 코드는 폰을 기울임에 따라 기운 방향으로 가속도가 증가하며 변화하는 위치를 결정하는 간단한 트릭코드입니다. 실제 물리시간에 배울 때 위치와 가속도의 관계는 제곱이나 루트 등을 사용해서 매우 복잡하게 계산합니다만, 이 코드에서는 단순한 덧셈 연산 몇 번으로 해결하였지요. 실제로 이렇게 계산하면 어플리케이션의 performance 개선에도 도움이 됩니다.^^
     

    가속도계는 재미있는 기능이지만 이 기능 역시 에뮬레이터에서 제대로 동작하지 않기 때문에 정확한 디버깅을 하려면 개발자 등록이 되어있는 실제 기기가 필요합니다. 이번화에서도 실제기기에서 동작하는 모습을 영상으로 짤막하게 담았습니다.

     

       1:  using System;
       2:  using System.Collections.Generic;
       3:  using System.Linq;
       4:  using System.Net;
       5:  using System.Windows;
       6:  using System.Windows.Controls;
       7:  using System.Windows.Documents;
       8:  using System.Windows.Input;
       9:  using System.Windows.Media;
      10:  using System.Windows.Media.Animation;
      11:  using System.Windows.Shapes;
      12:  using Microsoft.Phone.Controls;
      13:   
      14:  using Microsoft.Devices.Sensors;
      15:   
      16:  namespace Accelerometer01
      17:  {
      18:      public partial class MainPage : PhoneApplicationPage
      19:      {
      20:          Accelerometer acc;
      21:   
      22:          // Constructor
      23:          public MainPage()
      24:          {
      25:              InitializeComponent();
      26:   
      27:              acc = new Accelerometer();
      28:              acc.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChanged);
      29:              acc.Start();
      30:          }
      31:   
      32:          void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
      33:          {
      34:              // throw new NotImplementedException();
      35:              // non-UI 스레드에서 UI 스레드 제어를 하기 위한 코드
      36:              Deployment.Current.Dispatcher.BeginInvoke(() => accChanged(e));
      37:          }
      38:   
      39:          void accChanged(AccelerometerReadingEventArgs e)
      40:          {
      41:              //throw new NotImplementedException();
      42:              textBlock1.Text = "X: " + e.X.ToString("0.0") +Environment.NewLine
      43:                  + "Y: " + e.Y.ToString("0.0") + Environment.NewLine
      44:                  + "Z: " + e.Z.ToString("0.0") + Environment.NewLine;
      45:          }
      46:      }
      47:  }

     

     

Page 2 of 4 (17 items) 1234