Вы читаете журнал [info]fscavr


Рассмотрим в этой статье создание простого приложения часов для Windows Phone 7.

Разработка будет производится с помощью SDK for Windows Phone 7.1. Итак, вначале выберем создание нового проекта в VS2010 со следующими конфигурациями:

Чтобы не «удлинять» статью, всё нам ненужное, что было создано автогенерацией, мы оставим. В реальном приложение это убрать не составит проблем.

Теперь на главной странице (MainPage.xaml) расположим новый TextBlock, его имя по умолчанию будет «textBlock1»:



Далее у нас будет идти работа с кодом MainPage.xaml.cs. Сейчас у нас есть всего лишь несколько строк кода:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using Microsoft.Phone.Controls;

namespace MyClock

{

    public partial class MainPage : PhoneApplicationPage

    {

        // Constructor

        public MainPage()

        {

            InitializeComponent();

        }

        // Далее ненужный нам код кнопки

        private void Button_Click(object sender, RoutedEventArgs e)

        {

            NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));

        }

    }

}


В случае обычного приложения для Windows код для часов выглядел бы следующим образом:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using Microsoft.Phone.Controls;

using System.Threading;

namespace MyClock

{

    public partial class MainPage : PhoneApplicationPage

    {

        // Constructor

        public MainPage()

        {

            InitializeComponent();

            textBlock1.Text = DateTime.Now.ToLongTimeString();

            (new Thread(UpdateClock)).Start();

        }

        delegate void MyDelegate();

        private void UpdateClock()

        {

            while (true)

            {

                Dispatcher.BeginInvoke(new MyDelegate(SetNowTime), null);

                Thread.Sleep(500);

            }

        }

        private void SetNowTime()

        {

            textBlock1.Text = DateTime.Now.ToLongTimeString();

        }

        // Далее ненужный нам код кнопки

        private void Button_Click(object sender, RoutedEventArgs e)

        {

            NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));

        }

    }

}

Попробуем запустить приложение на эммуляторе…. И оно работает!

Что мы сделали в конечном итоге: мы добавили в конструктор главной страницы запуск новой «нити»(потока), которая каждые 500 мс обновляет время на экране. Главной особенностью обновления времени из нового потока является то, что для этого мы используем специальный объект «Dispatcher», который отвечает за вызовы методов между разными нитями.

Таким образом, какие выводы можно сделать из данного простого приложения

  1. Разработка WP7 приложений похожа на разработку для настольных приложений
  2. При использование новых нитей надо не забывать про Dispatcher и усыпление потоков.

При проверке на HTC 7 Mozart with Windows Phone результаты совпали с результатами на эмуляторе.

Спасибо за внимание!




Итак, какое же программное обеспечение требуется для того, чтобы начать разработку под WP7? Т.к. платформа новая, то может сложиться впечатление, что разработка под нее будет «не заточенной». Так это не так!!! 
Для этого требуется установить:

  1. Visual Studio 2010 (не Express)
  2. SP1 for VS 2010 (http://www.microsoft.com/downloads/ru-ru/details.aspx?familyid=75568aa6-8107-475d-948a-ef22627e57a5)
  3. SDK for WP7 (http://www.microsoft.com/downloads/ru-ru/details.aspx?FamilyID=0a373422-6680-46a7-89e1-e9a468a14259)

В случае, если Вы разрабатываете  с помощью VS, то Вам потребуется установить только 3 пункт.

Немного о нужности HTC Mozart


Зачем нужен HTC Mozart with Windows Phone

  • Одна из самых полезных функций для работы – моментальная проверка почты и возможность также оперативно на нее отвечать.
  • Интеграция контактов с sim карты и социальных сетей. При этом, если телефон потеряется или что-то с ним произойдет все контакты сохранятся в вашей записной книжке LiveID
  • Чтение книг в транспорте
  • Занесение заметок в него и использование, как записной книжки
  • Ориентироваться на местности благодаря удобным картам

Какие еще «вкусности»

1.       Поиск телефона, его блокировка и стирание всех личных данных с него удаленно через сайт windowsphone.com. Это значительно повышает шансы найти телефон при его потере

2.       Огромное количество развлекательных приложений

3.       Удобный, уникальный интерфейс

YCombinator в JavaScript


 Недавно стал изучать JavaScript... И пришла в голову идея написать Y-Combinator на JavaScript (на уникальность не претендую :) )...

Вот получился такой кусочек кода, где есть Y-Combinator и функция факториала, написанная в саморекурсивной форме, используя только безымянные функции:


function write(x)
{
   document.getElementById('YCombinator').innerHTML += x + '<br/>';
}

function YCombinator(f)
{
   return function (x)
   {
      return (f(YCombinator(f)))(x);
   };
}

var factor = function (fact)
{
   return function (x)
   {
      return (x<=1)?1:fact(x-1)*x;
   };
};

write(YCombinator(factor)(5));


Результатом будет 120, как и ожидалось.

Выводы:
  1. Вид самого Y-Combinatora получился довольно изящный
  2. Написание саморекурсивных безымянных функций слегка громоздко
  3. Использовать можно, но весьма на любителя
Спасибо за внимание!

Правило трёх ударов.


1 удар. Делая что-то в первый раз, Вы просто это делаете.
2 удар. Делая что-то аналогичное во второй раз, Вы морщитесь от необходимости повторения, но все-таки повторяете тоже самое.
3 удар. Делая что-то похожее в третий раз, вы начинаете рефакторинг.

© Martin Fauler

Итак, давно была мысль описать вероятностную машину Тьюринга (ВМТ). По-моему гениальнейшее теоретическое изобретение :)

Определение. ВМТ - это вид недетерминированной машины Тьюринга, в котором каждый шаг, где есть недетерменированный выбор, делается случайно.
При этом,  существует 2 способа (при желании можно создать гораздо больше способов) определения случайного шага:
  1. Мы создаем такое устройство, которое будет эмулировать подкидывание монетки, тогда, очевидно, мы сможем выбрать следующий шаг случайно.
  2. Создаем у нашей МТ (машины Тьюринга) вторую полубесконечную ленту, на которой записана в случайном порядке последовательность 0 и 1. Далее, будем использовать эту ленту, как устройство, описанное в пункте 1.
 У ВМТ следует ввести понятие вероятности ветки вычисления b:
Pr[b] = 2-k,
 где k - это число "подкидывания монетки" в ветке вычисления b.
Тогда определим вероятность того, что ВМТ М допускает слово w:
 
Pr[M допускает w] = ∑Pr[bi],
 
где bi - i-ая ветка вычисления, которая допускает слово w.
Так же очевидна следующая формула:
Pr[M отвергает w] = 1 - Pr[M допускает w].
 
Для 0≤ε<0.5 мы можем сказать, что ВМТ М распознает язык А с вероятностной ошибкой ε, если:
  1. Если w∈A, тогда Pr[M допускает w] ≥ 1 - ε, и
  2. если w∉A, тогда Pr[M отвергает w] ≥ 1 - ε.
Определение. Класс языков BPP - это такой класс языков, что распознаются вероятностными машинами Тьюринга за полиномиальное время с вероятностной ошибкой 1/3. 
На самом деле возникает вопрос, почему взято именно число 1/3. Ответ следует после следующей леммы:
Лемма. Пусть есть фиксированная константа ε находящаяся в промежутке от 0 до 0.5. Тогда для любой полиномиальной функции poly(n) ВМТ, вычислимая за полиномиальное время, M1 с ошибкой ε эквивалентна ВМТ, вычислимой за полиномиальное время, M2 с вероятностной ошибкой 2-poly(n)
Таким образом, 1/3 взята просто из критерия того, что 0<1/3<1/2. 

Двунаправленные списки


Недавно столкнулся с проблемой создания двунаправленных списков в F#. Решение оказалось ужасно простое...

let L = [1;2;3;4;5;6]; - Создаем основной список

Основной способ создания двунаправленного списка - это разделение основного списка на два списка (будет создана пара списков). Первый список будет хранить пройденные элементы, а второй еще не пройденные элементы. Тогда Движение по списку будет осуществленно следующим образом:

let iteratorNext j=
    let Next m=
        match m with
        |(h,[])->(h,[])
        |(h,h1::t1)->(h1::h,t1)
    Next j
;;
- Движение по списку вперед (подается в функцию пара списков)

let iteratorPrev j=
    let Prev m=
        match m with
        |([],h)->([],h)
        |(h::t,h1)->(t,h::h1)
    Prev j
;; - Движение по списку назад (подается в функцию пара списков)

Остается теперь только создать функцию получения элемента из списка. Мы просто будем брать первый элемент из второго списка в паре:

let GetElement k =
    match k with
    |(h,h1::t1) -> h1
;;
- Получение элемента списка

Ну и для примера, мы пройдем по списку 2 раза вперед, один раз назад и получим элемент из него:

let GetElement k =
match k with
|(h,h1::t1) -> h1
;;
- будет выведено число "2"


Вот вроде мы и получили двунаправленный список! :)

История с антивирусами


Две недели назад поставил Антивирус Касперского. Не смотря на его эффективность, жутко тормозит систему. Через неделю его снес=)
Недавно вышел Microsoft Security Essentials. Сегодня поставил. Эффективность оценить еще не сумел, но зато не тормозит систему, что не может не радовать=)

Нашел довольно интересный электронный журнал по функциональному программированию:fprog.ru =) Можно на досуге почитать=)

Установил Windows 7


Установил Windows 7. Работает быстрее, чем Vista.  Красивое оформление=)
Так же порадовал PowerShell. В-общем, мне пока всё нравится=)

Tags: