понедельник, 29 марта 2010 г.

Главный вопрос -- кто?

Уж больно все в масть легло. Ждите очередного похолодания.

вторник, 23 марта 2010 г.

Гарри Каспаров обвиняет Яндекс и Mail.Ru в противодействии сайту Putinavotstavku.Ru



ссылка на источник

суббота, 20 марта 2010 г.

Программинг под андроид

С тех пор как КПК стали достаточно широко распространены, меня постоянно волновал вопрос создания программ для различных устройств непосредственно на целевых устройствах, а не на эмуляторах. Однако до сегодняшнего дня мне не удавалось найти хоть какого-нибудь внятного компилятора или интерпретатора непосредственно встроенного в телефон или КПК.

Совсем не так обстоит дело с HTC Hero под управлением Android, который попал ко мне в руки неделю назад и вряд ли из них теперь вырвется :-)

Конечно же, существует Android SDK, который, как говорят, довольно удобен в использовании и позволяет писать серьезные приложения. Ну в этом нет ничего необычного, ни метафизического намека, ни каприза -- десктоп-компилятор + программный эмулятор -- не наш случай на сегодня.

Что если я интересуетесь просто легким хакингом устройства непосредственно с помощью самого устройства? Вдруг просто хочется иметь возможность программировать мобильное устройство с интернетом в любой момент и в любом месте? Например, на скучных лекциях (которые, впрочем, я уже давно веду сам).

Короче, есть штука -- Android Scripting Environment, которая позволяет все это делать! То есть не вести лекции, а программить на девайсе. Коли вы знакомы (или хотя бы собираетесь познакомиться) с Python, Lua, BeanShell или другими скрипт-языками, то можете смело писать программки непосредственно на своем Android-устройстве -- никаких больших компьютеров, никаких компиляторов, никаких шуток. Я опишу свой опыт, и, за одно, попробую привести пример Python-скрипта для добавления твитов на Twitter.

Android Scripting Environment (ASE) инсталлируется на Android также как любое другое приложение. Инсталятор ASE можно скачать со страницы проекта на googlecode.com.

Программирование с ASE наиболее всего напоминает программирование в типичном окружении Linux. Взаимодействие с пользователем, выполнение вычислений, соединение с интернетом. Более того из ASE можно даже добраться до подмножества Android SDK, включающего опрос сенсоров Android и запуск других приложений. Эти возможности позволяют опытным разработчикам (или скрипто-писателям) полностью подстраивать девайс под свои собственные нужды без необходимости полноценной разработки софта. Скрипты могут даже вешаться в качестве сервисов и быть доступными все время использования. Разработчики утверждают, что имеется поддержка запуска скриптов из Locale (у меня пока что-то этот функционал не работает, хотя плагин поставился).

После инсталляции и запуска приложение отразит на экране менеджер скриптов -- входную точку ASE.


ASE инсталлируется вместе с набором полезных примеров, покрывающих основной функционал. Клик по любому файлу приведет его запуску в отдельном терминальном окне на соответствующем интерпретаторе. Расширение файла указывает на используемый язык. Например, файл с расширением ".bsh" будет выполняться в BeanShell.

Для создания нового скрипта я нажимаю кнопку "Add", а для редактирования или удаления нового скрипта нужно сделать длинный клик на желаемом файле.


Кстати, для скриптов можно создавать ярлыки, что совершенно необходимо для запуска каких-либо созданных полезных действий непосредственно из основного меню.

Настало время рассмотреть предлагаемый скрипт более внимательно. Нам понадобится: устройство с ОС Android и с доступом в интернет (в моем случае HTC Hero с подключением по WiFi). Как упомянуто выше, я буду создавать программу на самом устройстве, хотя ничто не помешает желающим, создать файл на компьютере общего назначения и скопировать его на устройство.

Скрипт, который я сейчас покажу написан на Python. Перед погружением в код, я должен отметить, что с этим языком я знаком весьма посредственно, хотя и прочитал до этого пару книг. Если же кто-то имеет более сильные навыки в каком-либо скрипт-языке, то он, или она :-), сможет сразу же написать что-нибудь полезное без существенных затрат времени.

Ниже представлен код, который позволяет делать апдейты Twitter-аккаунта.

import android       # API Android'a
import httplib # для разговора с web-серверами
import urllib # для форматирования апдейта
import base64 # для использования Basic аутентификации

droid = android.Android() # получаем экземпляр интерфейса
# дальше комментарии излишни, я думаю

statMsg = droid.getInput('Сделать твит' , 'Что ты делаешь?')
statUpd = urllib.urlencode({'status':statMsg.result})

h = httplib.HTTP('twitter.com')
h.putrequest('POST','/statuses/update.xml?' + statUpdate)
h.putheader('Authorization','Basic ' + base64.encodestring('login:passwd'))
h.putheader('user-agent','Android-Scripting-Engine-Python')
h.endheaders()

returnCode, returnMsg, headers = h.getreply()
droid.makeToast(returnMsg)

f = h.getfile()
print f.read()

Когда приложение запустится, то попросит ввести твит. Как только я что-нибудь туда введу и нажму "ОК" -- весь мир прильнет к своим голубым экранам, чтоб насладиться моим откровением.

Естественно, что возможности Android Scripting Environment куда шире, чем взаимодействие с Twitter. Я рекомендую всем при возможности опробовать ASE в деле. Дорогу осилит идущий. Счастливого и приятного выдирания волос среди ночи :-)

PS приведенный код не отправит твит на русском языке -- это оставлю в качестве домашнего задания досужим читателям.

четверг, 11 марта 2010 г.

Анимация в XAML

Для страждущих.


<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfEx.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Window.Resources>
<Storyboard x:Key="OnLoadedLeft">
<DoubleAnimationUsingKeyFrames AutoReverse="True"
RepeatBehavior="Forever"
BeginTime="00:00:00"
Storyboard.TargetName="ellipse"
Storyboard.TargetProperty="(Canvas.Left)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:03" Value="400"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="OnLoadedTop">
<DoubleAnimationUsingKeyFrames AutoReverse="True"
RepeatBehavior="Forever"
BeginTime="00:00:00"
Storyboard.TargetName="ellipse"
Storyboard.TargetProperty="(Canvas.Top)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:03.5" Value="300"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource OnLoadedLeft}"/>
</EventTrigger>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource OnLoadedTop}"/>
</EventTrigger>
</Window.Triggers>

<Canvas>
<Ellipse x:Name="ellipse"
Fill="#FF1A19E8"
Stroke="Black"
Width="50"
Height="50"
Canvas.Left="0"
Canvas.Top="0"
StrokeThickness="0"/>
</Canvas>
</Window>

вторник, 9 марта 2010 г.

Шевчук