Для того, чтобы найти какую-то функцию, или часть кода по маске нужно сделать всего-навсего очень простую команду:
print '0x%.08X' % FindBinary(INF_BASEADDR, SEARCH_DOWN, '83 3D ? ? ? 00 00 75')
Личный блог посвященный компьютерам, программированию, разработке сайтов, дизайну и информационной безопасности.
четверг, 28 октября 2010 г.
вторник, 26 октября 2010 г.
C# Работа со временем.
Вот есть в шарпе класс DateTime, который позволяет работать с датой временем и т.д. А вот если нам нужно только время, без даты? Чтобы дата не учитывалась. Например, мы пишем программу, которая будет выполнять определенные задачи по расписанию. Допустим в определенное время запускать и в определенное время останавливать какие-то процессы. Для этого нам потребуется класс, который может достаточно просто представлять время, но без даты. Вот этот класс(или вернее структура):
namespace Helpers
{
public struct Time //: IComparable
{
private int minuteOfDay;
public static Time Midnight = "0:00";
private static int MIN_OF_DAY = 60 * 24;
public Time(int minuteOfDay)
{
if (minuteOfDay >= (60 * 24) || minuteOfDay < 0)
throw new ArgumentException("Skal ligge i intervallet 0 - 1439", "minuteOfDay");
this.minuteOfDay = minuteOfDay;
}
public Time(int hour, int minutes)
{
if (hour < 0 || hour > 23)
throw new ArgumentException("Must be in the range 0-23", "hour");
if (minutes < 0 || minutes > 59)
throw new ArgumentException("Must be in the range 0-59", "minutes");
minuteOfDay = (hour * 60) + minutes;
}
#region Operators
public static implicit operator Time(string s)
{
var parts = s.Split(':');
if (parts.Length != 2)
throw new ArgumentException("Time must be specified on the form tt:mm");
return new Time(int.Parse(parts[0]), int.Parse(parts[1]));
}
public static bool operator >(Time t1, Time t2)
{
return t1.MinuteOfDay > t2.MinuteOfDay;
}
public static bool operator <(Time t1, Time t2)
{
return t1.MinuteOfDay < t2.MinuteOfDay;
}
public static bool operator >=(Time t1, Time t2)
{
return t1.MinuteOfDay >= t2.MinuteOfDay;
}
public static bool operator <=(Time t1, Time t2)
{
return t1.MinuteOfDay <= t2.MinuteOfDay;
}
public static bool operator ==(Time t1, Time t2)
{
return t1.GetHashCode() == t2.GetHashCode();
}
public static bool operator !=(Time t1, Time t2)
{
return t1.GetHashCode() != t2.GetHashCode();
}
/// Time
/// Minutes that remain to
/// Time conferred minutes
public static Time operator +(Time t, int min)
{
if (t.minuteOfDay + min < (24 * 60))
{
t.minuteOfDay += min;
return t;
}
else
{
t.minuteOfDay = (t.minuteOfDay + min) % MIN_OF_DAY;
return t;
}
}
public static Time operator -(Time t, int min)
{
if (t.minuteOfDay - min > -1)
{
t.minuteOfDay -= min;
return t;
}
else
{
t.minuteOfDay = MIN_OF_DAY + (t.minuteOfDay - min);
return t;
}
}
public static TimeSpan operator -(Time t1, Time t2)
{
return TimeSpan.FromMinutes(Time.Span(t2, t1));
}
#endregion
public int Hour
{
get
{
return (int)(minuteOfDay / 60);
}
}
public int Minutes
{
get
{
return minuteOfDay % 60;
}
}
public int MinuteOfDay
{
get { return minuteOfDay; }
}
public Time AddHours(int hours)
{
return this + (hours * 60);
}
public int CompareTo(Time other)
{
return this.minuteOfDay.CompareTo(other.minuteOfDay);
}
#region Overrides
public override int GetHashCode()
{
return minuteOfDay.GetHashCode();
}
public override string ToString()
{
return string.Format("{0}:{1:00}", Hour, Minutes);
}
#endregion
///
/// Safe enumerering - whatever interval applied max days
///
/// Start time
/// Spring in minutes
///
public static IEnumerable<Time> Range(Time start, int step)
{
return Range(start, start, step);
}
///
/// Safe enumerering - whatever interval applied max days
///
public static IEnumerable<Time> Range(Time start, Time stop, int step)
{
int offset = start.MinuteOfDay;
for (var i = 0; i < Time.Span(start, stop); i += step)
{
yield return Time.Midnight + (i + offset);
}
}
///
/// Calculates the number of minutes between t1 and t2
///
public static int Span(Time t1, Time t2)
{
if (t1 < t2) // same day
return t2.MinuteOfDay - t1.MinuteOfDay;
else // over midnight
return MIN_OF_DAY - t1.MinuteOfDay + t2.MinuteOfDay;
}
}
}
Применять его можно примерно так:
Time tStop = "12:03";
Time tStart = "13:20";
DateTime dtNow = DateTime.Now;
Time tNow = new Time(dtNow.Hour, dtNow.Minute);
int t = Time.Span(tStart, tStop);
int t1 = Time.Span(tStart, tNow);
if (t1>1440) t1 = t1-1440;
int t2 = Time.Span(tNow, tStop);
int tsum = t1 + t2;
if (tsum == t) // Если выполнилось это условие, то запускаем нужное задание (то есть время сейчас между 12:03 и 13:20)
if (tsum != t) // Если выполнилось это условие, то останавливаем нужное задание (то есть время сейчас не между 12:03 и 13:20 )
То есть, все достаточно просто. Но одну ошибочку в инструкции по применению данного класса я все же оставил. Для вас. Хотя, возможно она никогда себя так и не проявит в вашем приложении. Тем же кто ее увидит или найдет, просьба выложить в комментарии ваш рецепт ее решения. Хотя это даже не ошибка. Просто одна ситуация которую можно случайно не учесть.
namespace Helpers
{
public struct Time //: IComparable
{
private int minuteOfDay;
public static Time Midnight = "0:00";
private static int MIN_OF_DAY = 60 * 24;
public Time(int minuteOfDay)
{
if (minuteOfDay >= (60 * 24) || minuteOfDay < 0)
throw new ArgumentException("Skal ligge i intervallet 0 - 1439", "minuteOfDay");
this.minuteOfDay = minuteOfDay;
}
public Time(int hour, int minutes)
{
if (hour < 0 || hour > 23)
throw new ArgumentException("Must be in the range 0-23", "hour");
if (minutes < 0 || minutes > 59)
throw new ArgumentException("Must be in the range 0-59", "minutes");
minuteOfDay = (hour * 60) + minutes;
}
#region Operators
public static implicit operator Time(string s)
{
var parts = s.Split(':');
if (parts.Length != 2)
throw new ArgumentException("Time must be specified on the form tt:mm");
return new Time(int.Parse(parts[0]), int.Parse(parts[1]));
}
public static bool operator >(Time t1, Time t2)
{
return t1.MinuteOfDay > t2.MinuteOfDay;
}
public static bool operator <(Time t1, Time t2)
{
return t1.MinuteOfDay < t2.MinuteOfDay;
}
public static bool operator >=(Time t1, Time t2)
{
return t1.MinuteOfDay >= t2.MinuteOfDay;
}
public static bool operator <=(Time t1, Time t2)
{
return t1.MinuteOfDay <= t2.MinuteOfDay;
}
public static bool operator ==(Time t1, Time t2)
{
return t1.GetHashCode() == t2.GetHashCode();
}
public static bool operator !=(Time t1, Time t2)
{
return t1.GetHashCode() != t2.GetHashCode();
}
/// Time
/// Minutes that remain to
/// Time conferred minutes
public static Time operator +(Time t, int min)
{
if (t.minuteOfDay + min < (24 * 60))
{
t.minuteOfDay += min;
return t;
}
else
{
t.minuteOfDay = (t.minuteOfDay + min) % MIN_OF_DAY;
return t;
}
}
public static Time operator -(Time t, int min)
{
if (t.minuteOfDay - min > -1)
{
t.minuteOfDay -= min;
return t;
}
else
{
t.minuteOfDay = MIN_OF_DAY + (t.minuteOfDay - min);
return t;
}
}
public static TimeSpan operator -(Time t1, Time t2)
{
return TimeSpan.FromMinutes(Time.Span(t2, t1));
}
#endregion
public int Hour
{
get
{
return (int)(minuteOfDay / 60);
}
}
public int Minutes
{
get
{
return minuteOfDay % 60;
}
}
public int MinuteOfDay
{
get { return minuteOfDay; }
}
public Time AddHours(int hours)
{
return this + (hours * 60);
}
public int CompareTo(Time other)
{
return this.minuteOfDay.CompareTo(other.minuteOfDay);
}
#region Overrides
public override int GetHashCode()
{
return minuteOfDay.GetHashCode();
}
public override string ToString()
{
return string.Format("{0}:{1:00}", Hour, Minutes);
}
#endregion
///
/// Safe enumerering - whatever interval applied max days
///
/// Start time
/// Spring in minutes
///
public static IEnumerable<Time> Range(Time start, int step)
{
return Range(start, start, step);
}
///
/// Safe enumerering - whatever interval applied max days
///
public static IEnumerable<Time> Range(Time start, Time stop, int step)
{
int offset = start.MinuteOfDay;
for (var i = 0; i < Time.Span(start, stop); i += step)
{
yield return Time.Midnight + (i + offset);
}
}
///
/// Calculates the number of minutes between t1 and t2
///
public static int Span(Time t1, Time t2)
{
if (t1 < t2) // same day
return t2.MinuteOfDay - t1.MinuteOfDay;
else // over midnight
return MIN_OF_DAY - t1.MinuteOfDay + t2.MinuteOfDay;
}
}
}
Применять его можно примерно так:
Time tStop = "12:03";
Time tStart = "13:20";
DateTime dtNow = DateTime.Now;
Time tNow = new Time(dtNow.Hour, dtNow.Minute);
int t = Time.Span(tStart, tStop);
int t1 = Time.Span(tStart, tNow);
if (t1>1440) t1 = t1-1440;
int t2 = Time.Span(tNow, tStop);
int tsum = t1 + t2;
if (tsum == t) // Если выполнилось это условие, то запускаем нужное задание (то есть время сейчас между 12:03 и 13:20)
if (tsum != t) // Если выполнилось это условие, то останавливаем нужное задание (то есть время сейчас не между 12:03 и 13:20 )
То есть, все достаточно просто. Но одну ошибочку в инструкции по применению данного класса я все же оставил. Для вас. Хотя, возможно она никогда себя так и не проявит в вашем приложении. Тем же кто ее увидит или найдет, просьба выложить в комментарии ваш рецепт ее решения. Хотя это даже не ошибка. Просто одна ситуация которую можно случайно не учесть.
четверг, 21 октября 2010 г.
Закрытие всех работающих экземпляров процесса Notepad.exe
// Просто завершение процесса
private void ButtonStop_Click(object sender, System.EventArgs e) { System.Diagnostics.Process[] myProcesses; myProcesses = System.Diagnostics.Process.GetProcessesByName("Notepad"); foreach (System.Diagnostics.Process instance in myProcesses) { instance.CloseMainWindow(); instance.Close(); } }
// Настройка ожидания завершения выполнения процесса Блокнота
private void ButtonStop_Click(object sender, System.EventArgs e) { System.Diagnostics.Process[] myProcesses; myProcesses = System.Diagnostics.Process.GetProcessesByName("Notepad"); foreach (System.Diagnostics.Process instance in myProcesses) { instance.CloseMainWindow(); instance.WaitForExit(3000); instance.Close(); } }
среда, 22 сентября 2010 г.
Установка Apache, php и mysql в Ubuntu
Итак, приступим:
Способ первый:
запускаем терминал и выполняем такие команды:
sudo apt-get install apache2
sudo apt-get install php5 libapache2-mod-php5
sudo invoke-rc.d apache2 restart
sudo apt-get install mysql-server
sudo invoke-rc.d apache2 restart
Все готово для работы.
Способ второй:
В терминале запускаем всего одну команду
sudo tasksel install lamp-server
Далее для обоих способов:
в терминале вводим:
sudo gedit /var/www/test.php
Пишем и сохраняем:
В браузере переходим по ссылке http://localhost/test.php, где вы увидите всю информацию о PHP.
Базовые команды
Теперь пару слов о командах, которые вам могут пригодиться в процессе работы:
Запуск Apache2:
sudo invoke-rc.d apache2 start
Остановка Apache2:
sudo invoke-rc.d apache2 stop
Перезапуск Apache2:
sudo invoke-rc.d apache2 restart
Изменение пароля mysql
sudo mysqladmin -u root password новый_пароль
Подключение к консоли mysql
mysql -u root -p
Дополнительное удобство
Еще одна фишка, которая мне показалась безусловно удобной,описана далее. Ее суть состоит в том, что можно в браузере набрать ссылку вроде test.com.dev и без проблем откроется наш сайт, который сохранен на локальном харде в домашней папке в sites/test.com.dev/public .
Допустим сайт наш будет называться test.com, и храниться в папке sites, как описано выше. Создаем папку для нашего сайта:
mkdir -p ~/sites/test.com.dev/public
Далее создаём файлик для этого сайта:
sudo gedit /etc/apache2/sites-available/test.com.dev
и вписываем в него следующие строки:
ServerName test.com.dev
ServerAlias www.test.com.dev
DocumentRoot /home/Имя_Пользователя/sites/test.com.dev/public
где Имя_Пользователя нужно заменить на ваше имя пользователя.
Сохраняем файл, закрываем gedit и говорим апачу, что этот сайт теперь нужно обслуживать:
sudo a2ensite test.com.dev
При выполнении, эта команда скажет вам, что апачу необходимо перезагрузить данные конфигурации, что мы и сделаем:
sudo /etc/init.d/apache2 reload
Теперь, настроим удобное обращение к сайту. Для этого пропишем, что хост test.com.dev обслуживается на нашем компьютере, локально. Открываем файл /etc/hosts
sudo gedit /etc/hosts
находим там строку, начинающуюся на 127.0.0.1 (обычно, это первая строка) и вписываем в её конец, через пробел от предыдущих данных, test.com.dev. Сохраняем файл, закрываем редактор.
Теперь кидаем какой-нибудь файлик index.html в папочку нашего сайта (/home/$USER/Sites/www.test.com.dev/public)
Всё, теперь уже можно вписать в адресную строку браузера http://test.com.dev/ и увидеть, что сайт вас приветствует.
Еще редактор текстов здесь немного дебильный (да простят меня его разработчики, но это так) - так что в текст вкралось немного ошибок... :-( Некоторые тэги отсеиваются, и всплывающее окно бесит.
Еще нужно написать скриптик, который все вышеописанное делает автоматом...
П.С.: при подготовке данного документа использовались материалы с таких источников:
http://rotuka.com/2008/10/lamp-ubuntu-apache-mysql-php/
Способ первый:
запускаем терминал и выполняем такие команды:
sudo apt-get install apache2
sudo apt-get install php5 libapache2-mod-php5
sudo invoke-rc.d apache2 restart
sudo apt-get install mysql-server
sudo invoke-rc.d apache2 restart
Все готово для работы.
Способ второй:
В терминале запускаем всего одну команду
sudo tasksel install lamp-server
Далее для обоих способов:
в терминале вводим:
sudo gedit /var/www/test.php
Пишем и сохраняем:
В браузере переходим по ссылке http://localhost/test.php, где вы увидите всю информацию о PHP.
Базовые команды
Теперь пару слов о командах, которые вам могут пригодиться в процессе работы:
Запуск Apache2:
sudo invoke-rc.d apache2 start
Остановка Apache2:
sudo invoke-rc.d apache2 stop
Перезапуск Apache2:
sudo invoke-rc.d apache2 restart
Изменение пароля mysql
sudo mysqladmin -u root password новый_пароль
Подключение к консоли mysql
mysql -u root -p
Дополнительное удобство
Еще одна фишка, которая мне показалась безусловно удобной,описана далее. Ее суть состоит в том, что можно в браузере набрать ссылку вроде test.com.dev и без проблем откроется наш сайт, который сохранен на локальном харде в домашней папке в sites/test.com.dev/public .
Допустим сайт наш будет называться test.com, и храниться в папке sites, как описано выше. Создаем папку для нашего сайта:
mkdir -p ~/sites/test.com.dev/public
Далее создаём файлик для этого сайта:
sudo gedit /etc/apache2/sites-available/test.com.dev
и вписываем в него следующие строки:
ServerName test.com.dev
ServerAlias www.test.com.dev
DocumentRoot /home/Имя_Пользователя/sites/test.com.dev/public
где Имя_Пользователя нужно заменить на ваше имя пользователя.
Сохраняем файл, закрываем gedit и говорим апачу, что этот сайт теперь нужно обслуживать:
sudo a2ensite test.com.dev
При выполнении, эта команда скажет вам, что апачу необходимо перезагрузить данные конфигурации, что мы и сделаем:
sudo /etc/init.d/apache2 reload
Теперь, настроим удобное обращение к сайту. Для этого пропишем, что хост test.com.dev обслуживается на нашем компьютере, локально. Открываем файл /etc/hosts
sudo gedit /etc/hosts
находим там строку, начинающуюся на 127.0.0.1 (обычно, это первая строка) и вписываем в её конец, через пробел от предыдущих данных, test.com.dev. Сохраняем файл, закрываем редактор.
Теперь кидаем какой-нибудь файлик index.html в папочку нашего сайта (/home/$USER/Sites/www.test.com.dev/public)
Всё, теперь уже можно вписать в адресную строку браузера http://test.com.dev/ и увидеть, что сайт вас приветствует.
Еще редактор текстов здесь немного дебильный (да простят меня его разработчики, но это так) - так что в текст вкралось немного ошибок... :-( Некоторые тэги отсеиваются, и всплывающее окно бесит.
Еще нужно написать скриптик, который все вышеописанное делает автоматом...
П.С.: при подготовке данного документа использовались материалы с таких источников:
http://rotuka.com/2008/10/lamp-ubuntu-apache-mysql-php/
установка и настройка ssh в Ubuntu
Итак, сегодня мы научимся устанавливать, пользоваться очень популярной, или скорее очень полезной штукой под названием ssh.
Как говорит Википедия:
SSH (англ. Secure Shell — «безопасная оболочка»[1]) — сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов). Сходен по функциональности с протоколами Telnet и rlogin, но, в отличие от них, шифрует весь трафик, включая и передаваемые пароли. SSH допускает выбор различных алгоритмов шифрования. SSH-клиенты и SSH-серверы имеются для большинства сетевых операционных систем.
Еще раз напоминаю что я пользуюсь Ubuntu (если у Вас другая ось, то напишите и я добавлю материала про нее), чтобы в винде не пытались вводить что-то типа sudo apt-get ... и т.д.
Теперь, следующей командой установим ssh клиент, на машине с которой мы будем подключаться к той, на которой установлен ssh сервер
Вся конфигурация нашего сервера производиться изменением файла /etc/ssh/sshd_config. Давайте посмотрим что же там в этом файле за опции такие. Сначала сделаем резервную копию файла конфигурации:
теперь откроем его в терминале:
Вы увидите следующие директивы:
Теперь перезагружаем ssh демон
Где номер_порта на котором висит ssh сервер, а host.name - это имя хоста сервера или его IP адрес
Монтирование файловой системы сервера производиться с помощью команды SSHFS
Для установки sshfs введем команду:
Монтирование производиться следующей командой:
Где remoteuser - имя удаленного пользователя, remotehost - имя удаленного хоста или его ip адрес, /путь/к/удаленной_директории - удаленая директория которую вы хотите примонтировать, локальная_директория - это место куда вы хотите примонтировать удаленную папку
Для отмонтирования удаленной директории используем команду:
Ну вот, для начала вроде должно хватить, потом напишу больше
Как говорит Википедия:
SSH (англ. Secure Shell — «безопасная оболочка»[1]) — сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов). Сходен по функциональности с протоколами Telnet и rlogin, но, в отличие от них, шифрует весь трафик, включая и передаваемые пароли. SSH допускает выбор различных алгоритмов шифрования. SSH-клиенты и SSH-серверы имеются для большинства сетевых операционных систем.
Еще раз напоминаю что я пользуюсь Ubuntu (если у Вас другая ось, то напишите и я добавлю материала про нее), чтобы в винде не пытались вводить что-то типа sudo apt-get ... и т.д.
Установка
Сначала установим ssh сервер на машине к которой мы будем подключаться. Для этого в консоли мы вводим:sudo apt-get install openssh-client
Теперь, следующей командой установим ssh клиент, на машине с которой мы будем подключаться к той, на которой установлен ssh сервер
sudo apt-get install openssh-server
Вся конфигурация нашего сервера производиться изменением файла /etc/ssh/sshd_config. Давайте посмотрим что же там в этом файле за опции такие. Сначала сделаем резервную копию файла конфигурации:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original
теперь откроем его в терминале:
sudo nano /etc/ssh/sshd_config
Вы увидите следующие директивы:
- Port - указывает порт по которому сервер будет ожидать входящего соединения. Например, Port 1234 означает что к серверу можно будет подключиться по порту 1234.
- ListenAddress - указывает какой протокол/интерфейс будет прослушиваться ssh.
- Protocol - позволяет выбрать версию протокола 1 или 2. Рекомендуется протокол 2.
- HostKey - Ключевые файлы для второй версии протокола SSH
- UsePrivilegeSeparation - хз. Оставляем включенным для безопасности.
Теперь перезагружаем ssh демон
sudo /etc/init.d/ssh restart
Использование
И теперь мы можем смело к нему конектиться. Для этого в терминале клиента воодим следующую командуssh -p номер_порта host.name
Где номер_порта на котором висит ssh сервер, а host.name - это имя хоста сервера или его IP адрес
Монтирование файловой системы сервера производиться с помощью команды SSHFS
Для установки sshfs введем команду:
sudo apt-get install sshfs
Монтирование производиться следующей командой:
sshfs remoteuser@remotehost:/путь/к/удаленной_директории локальная_директория
Где remoteuser - имя удаленного пользователя, remotehost - имя удаленного хоста или его ip адрес, /путь/к/удаленной_директории - удаленая директория которую вы хотите примонтировать, локальная_директория - это место куда вы хотите примонтировать удаленную папку
Для отмонтирования удаленной директории используем команду:
fusermount -u локальная_директория
Ну вот, для начала вроде должно хватить, потом напишу больше
QuickSynergy - Одна мышка и клавиатура на два компьютера. QuickSynergy - Одна мышка и клавиатура на два компьютера.
Сегодня мы рассмотрим очень интересную штучку. Имя ей quicksynergy
Synergy - это бесплатная программа (Open source, GNU Public License) позволяющая использовать одну мышку и одну клавиатуру для управления несколькими компьютерами с разными операционными системами. Принцип работы очень прост: стоит вам переместить курсор мыши к краю экрана одного ПК, он появляется на краю экрана другого.
На Ubuntu устанавливается очень просто:
чтобы попасть в нужный компьютер), а на клиентах просто указывает
IP адрес хоста.Давайте еще раз рассмотрим настройку для Ubuntu.
Synergy - это бесплатная программа (Open source, GNU Public License) позволяющая использовать одну мышку и одну клавиатуру для управления несколькими компьютерами с разными операционными системами. Принцип работы очень прост: стоит вам переместить курсор мыши к краю экрана одного ПК, он появляется на краю экрана другого.
На Ubuntu устанавливается очень просто:
sudo apt-get install quicksynergy.
Для других операционных ситстем можно скачать отсюда.Настраивается все очень просто - на сервере(машине с клавой и мышкой) прописываем хосты(имена компьютеров или их IP адреса) клиентов и их расположение относительно основного экрана (куда двигать мышкой,чтобы попасть в нужный компьютер), а на клиентах просто указывает
IP адрес хоста.Давайте еще раз рассмотрим настройку для Ubuntu.
- Запускаем Quicksynergy на серверной машине (той у которой есть клавиатура и мышь).
- Только на серверной машине вводим имена компьютеров клиентов (компьютеров, которые без клавы и мыши) в одном из полей ввода (в зависимости от взаимного расположения компьютеров в пространстве). Если вы не знаете имена клиентов, то наберите в терминале на клиентских машинах hostname и будет вам счастье.
- Запустите Quicksynergy на клиентской машине.
- Только на клиентской машине идем на вкладку Use и вводим в поле ввода ip адрес серверной машины.
- Нажимаем Execute на серверной машине.
- Нажимаем Execute на клиенсткой машине.
- На Серверной машине перемещаем курсор к краю экрана и видим как мышинный указатель появляется на экране другого компьютера.
- Радуемся и пишем каменты. :)
Разработка под Android на Python. Часть 2. Обзор возможностей
Перевод частичный. Некоторые вещи не знаю как написать на русском
Итак, ASE мы установили, пользоваться научились, теперь пришла пора рассмотреть его основные возможности.
Для работы любого скрипта на Python нам нужно будет подключить модуль android, делается это следующими строками:
import androiddroid = android.Android()
Далее рассмотрим возможности по группам.
Сообщения и уведомления
Вывод всплывающего окна
droid.makeToast("Hello, Android!")
А так делается ввод информации:
name = droid.getInput("Hello!", "What is your name?")
print name
droid.makeToast("Hello, %(result)s" % name)
Чтение и модификация настроек:
volume = droid.getRingerVolume()
droid.setRingerVolume(5)
droid.setRingerSilent(True)
droid.vibrate(100) # 100 миллисекунд вибрации.
Получение данных датчиков:
droid.startSensing()
time.sleep(1) # Give the sensors a moment to come online.
sensors = droid.readSensors()
print sensors
Поиск Вашего местоположения:
droid.startLocating()
time.sleep(1)
location = droid.readLocation()
print location
Или более простой путь(информация будет не всегда актуальна):
location = droid.getLastKnownLocation()
Отправка SMS сообщений:
droid.sendTextMessage("8675309", "Hey, Jenny!")
Использование Text to Speech
ASE поддерживает TTS через Eyes-Free проект (смотрите InstallingTextToSpeech).
droid.speak("I can talk!")
Набор номера
droid.dialNumber("8675309")
droid.callNumber("8675309")
droid.map("pizza") # or "munich" or "1600 amphitheatre pkwy"
droid.showContacts()
droid.email()
Запуск произвольных заданий
droid.startActivity('android.intent.action.CALL', uri)
Starting an Activity for Result
Starting an activity for result allows you to do things like scanning barcodes (see InstallingBarcodeScanner). Again, there are several convenience methods in addition to the ability to raise arbitrary intents.
code = droid.scanBarcode()
print code
pic = droid.captureImage()
print pic
contact = droid.pickContact()
droid.call(contact['result']['data'])
Exiting the Activity or Service
Для выхода из сервиса или скрипта используем следующую команду
droid.exit()
Так же можно отправить результат работы перед выходом.
droid.setResultExtra('some_string', 'string_value')
droid.setResultExtra('some_int', 42)
droid.setResultExtra('some_double', 3.14159)
droid.exitWithResultOk()
# or...
droid.exitWithResultCanceled()
Итак, ASE мы установили, пользоваться научились, теперь пришла пора рассмотреть его основные возможности.
Для работы любого скрипта на Python нам нужно будет подключить модуль android, делается это следующими строками:
import androiddroid = android.Android()
Далее рассмотрим возможности по группам.
Сообщения и уведомления
Вывод всплывающего окна
droid.makeToast("Hello, Android!")
А так делается ввод информации:
name = droid.getInput("Hello!", "What is your name?")
print name
droid.makeToast("Hello, %(result)s" % name)
Чтение и модификация настроек:
volume = droid.getRingerVolume()
droid.setRingerVolume(5)
droid.setRingerSilent(True)
droid.vibrate(100) # 100 миллисекунд вибрации.
Получение данных датчиков:
droid.startSensing()
time.sleep(1) # Give the sensors a moment to come online.
sensors = droid.readSensors()
print sensors
Поиск Вашего местоположения:
droid.startLocating()
time.sleep(1)
location = droid.readLocation()
print location
Или более простой путь(информация будет не всегда актуальна):
location = droid.getLastKnownLocation()
Отправка SMS сообщений:
droid.sendTextMessage("8675309", "Hey, Jenny!")
Использование Text to Speech
ASE поддерживает TTS через Eyes-Free проект (смотрите InstallingTextToSpeech).
droid.speak("I can talk!")
Набор номера
droid.dialNumber("8675309")
droid.callNumber("8675309")
droid.map("pizza") # or "munich" or "1600 amphitheatre pkwy"
droid.showContacts()
droid.email()
Запуск произвольных заданий
droid.startActivity('android.intent.action.CALL', uri)
Starting an Activity for Result
Starting an activity for result allows you to do things like scanning barcodes (see InstallingBarcodeScanner). Again, there are several convenience methods in addition to the ability to raise arbitrary intents.
code = droid.scanBarcode()
print code
pic = droid.captureImage()
print pic
contact = droid.pickContact()
droid.call(contact['result']['data'])
Exiting the Activity or Service
Для выхода из сервиса или скрипта используем следующую команду
droid.exit()
Так же можно отправить результат работы перед выходом.
droid.setResultExtra('some_string', 'string_value')
droid.setResultExtra('some_int', 42)
droid.setResultExtra('some_double', 3.14159)
droid.exitWithResultOk()
# or...
droid.exitWithResultCanceled()
Подписаться на:
Сообщения (Atom)