суббота, 29 сентября 2007 г.

Google Mail vs Велтон телеком. Уведомления о почте

Когда-то давно, когда у меня был основной почтовый ящик на mail.ru я настраивал уведомления на почте.

Я являюсь абонентом сети "Велтон-телеком" и пользователем почтового сервиса Goggle Mail и хочу поделиться как настроить уведомления о приходе новой почты.


Для этого нужно зайти на сервис Google Mail, выбрать Settings -> Forwarding and POP -> Forwarding.

После этого выбрать пункт "Forward a copy of incoming mail to" и ввести почтовый адрес вида 805XXXXXXX@sms.velton.ua, который содержит семизначный номер вашего телефона.

После этого по приходе новой почте вам будут приходить текстовые сообщения с номера 3333 такого вида:

From: some.address+caf_=8057XXXXXXX=sms.velton.ua@gmail.com
Date: Sat 29 Sep 2007 13^53^52+0300
Subj: Hello world
Text: This is a test e-mail.

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


Так что на повестке дня вопрос по-прежнему открыт.

понедельник, 27 августа 2007 г.

Total Commander и PDA

В связи с недавным приобретением КПК постепенно обустраиваю свое рабочее место.

За последние полмесяца софта было перепробовано порядочно. Однако все время меня раздражал тот факт, что с моим устройством приходится работать через проводник, который открывается из окна ActiveSync приложения.


Буквально недавно нашел соответствующий плагин для моего единственно возможного файлового менеджера - Total Commander :)

Плагин WinCE обеспечивает доступ Pocket PC, который  подключен через ActiveSync соединение. Сам плагин выполнен в виде виртуальной файловой системы.

В общем я доволен находкой и скорее всего буду ею пользоваться и на работе и дома.


P.S. Руководствуясь спортивным интересом обнаружил еще плагин WM Explorer  - аналогичный плагин для Far. Любопытно, какой же из двух этих плагинов более функциональный :)

воскресенье, 26 августа 2007 г.

Тестирование - в массы :)

Пару месяцев назад я проходил один занимательный тест.

В результате получил следующий результат:

Составление вашего психологического портрета окончено. Результаты: Тихий Гений
Довольно редкая и положительная психологическая группа людей. В одежде эти люди не стремятся к гламурному блеску, но умеют найти свой стиль. Волосы, например, красят редко, предпочитая натуральность и уход за кожей. Характер в целом "в штиле", но бывают редкие скачки, выливающиеся в недовольство окружающих. Их мирок кишит неуловимыми замыслами, которые они, однако, не всегда воплощают. Про таких говорят "деньги его любят". В работе Гении делают ставку на свою коммуникабельность, и редко проигрывают. У них отлично получается рисовать и пространственно мыслить, однако задания, требующие усидчивости, им будут не по плечу. Редкие люди, видящие душу Тихого Гения насквозь, ценят и уважают его как друга. Люди этого типа чувствуют свою связь с богом и людьми. Опасными друзьями могут стать попытки забыться от мира: телевизор, компьтер, алкоголь, наркотики.
Пройти тест



А сегодня прошел еще один:

Обратив взор свой в бездну, понял ты, что сила в тебе есть - Надежда
Мы знать, не знаем и не помним, пока не встретимся с бедой, что весь наш мир такой огромный весит на ниточке одной, она ... В палящий зной, Вы тень на горизонте, в кромешной тьме Вы света луч. Вам не приходила в голову мысль, что если во мраке, горит хотя бы один огонёк, то свет не сможет погибнуть никогда! Вы тот, что дарит надежду, на спасение, поддержку близким друзьям, для них вы луч в тёмном царстве. Для света Вы последняя надежда! image
Пройти тест



Вот такие вот дела. Если подойти к результатам с некоторой долей юмора, то можно сделать вывод "тихий гений, подающий надежды" :) ...довольно оптимистично ;)

вторник, 21 августа 2007 г.

Вожделенное приобретение

Совсем недавно купил себе КПК, о котором достаточно давно мечтал.

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

Так или иначе он пошел мне на пользу. Потому что как-то я чуть было не приобрел себе Dell X51.

Вообще это была занятная история. Я уже собрал все свое нажитое и отправился с одним своим товарищем в магазин за покупкой сего девайса, выбил чек и пошел с ним получать наладонник.

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

Естественно, ребята на выдаче пытались мне впарить этот девайс. Однако я сделал волевое решение и затребовал либо дополнения некомплекта либо возврат денег.

Как раз в тот момент более в наличии этих КПК не было мне вернули деньги.

И вот, спустя больше года и совершенно в другом магазине я таки себе приобрел совершенно другой по классу девайс - Fujitsu Siemens Pocket Loox C550.

Так что я доволен что тогда я таки не сделал эту покупку, потому как технологии за это время не стояли на месте.

Естественно что этот девайс был несколько дороже.

Как говориться сегодня раки (Fujitsu-Siemens) были большие, но за $520 против вчерашних, маленьких (Dell X51) но за $400 ;)


В общем я крайне доволен функциональностью этого умного устройства, если бы не одно НО!

Софт, который осуществляет поддержку Wi-Fi от производителя мало того что малополезный, дык он еще и вредоносный :(

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

После того, как я посвятил этой программе достаточно большое время и проколдовал со своим КПК наверное две недели подряд (от случая к случаю, в свободное время) в конечном счете мне открылась святая истина...


Вот целая ветка бесконечно благодарных пользователей этой программы...

"вобщем после хард ресета n560 пикнет и все что было до этого
установлено будет удалено. теперь ни в коем случае не запускаем e2c,
удалить ее не получится т.к. она вшита в винду, но можно просто не
запускать ее."

В общем это оказалось абсолютной правдой. При первом запуске эта замечательная программа вправляет мозг мобильной операционке и лечить это проще всего ампутацией памяти вашего мобильноо питомца...

Такие вот забавные программки поставляются с КПК. Обхохочешься...

воскресенье, 12 августа 2007 г.

Функциональные требования MP3 плееру

Сегодня общался с товарищем по аське и в ходе беседы я вывел для себя следующие требования:

- небольшие размеры, логичные пропорции
- как можно больше отображаемых строк на экране
- возможность заливки мелодий без дополнительного софта
- удобное управление, возможность управления одной рукой
- работа от стандартного элемента питания (AAA)
- поддержка эквалайзера (бывает что нужно немного докручивать под наушники)

четверг, 2 августа 2007 г.

Visual Studio 2008

Сегодня стал счастливым обладателем версии Beta 2.

Эту версию студии еще называют Orcas. В принципе я уважаю маркетинговые изыски кампаний. Если это им помогает, то пожалуйста ;)

Для меня же эта студия 2008 :) Была бы моя воля я бы вообще порядковые номера вел. Без всяких премудростей. Если продукт хороший, ему вообще название не нужно...


В общем, если кому нужно, могу записать диск.

суббота, 14 июля 2007 г.

Managed C++. Проба пера

Сегодня попробовал поработать с управляемым C++.

Ну и в качестве упражнения хотелось попробовать что-то интересное, а не ограничиваться переписыванием примеров из того же MSDN.

Поэтому мой выбор пал на одну небольшую библиотеку - minifmod. Это часть библиотеки FMOD - кроссплатформенной библиотеки для работы с различными аудиоформатами.

Библиотека minifmod поставляется с открытым исходным кодом, а так же имеет в поставке статическую C-библиотеку для использования их в проектах Visual C++.

Но .NET программист не сможет использовать эту библитеку, поэтому я решил это исправить.

Действительно, достаточно типичная ситуация. Мы имеем огромную массу библиотек, написанных на C и C++, для того чтобы использовать вызовы к этим библиотекам можно использовать достаточно удобный интерфейс как Platform Invoke. Однако в моем случае это было невозможно, потому как это не *.dll, а static link library.

Было принято решение создать проект на Managed C++, который является оберткой вокруг minifmod, а так же тестовый проект Windows Forms на C# который бы использовал мою библиотеку-обертку.

Изучив исходный код minifmod я обнаружил, что сама библиотека заточена на работу с музыкальными треками как с файлами:
FMUSIC_MODULE * FMUSIC_LoadSong(signed char *name, SAMPLELOADCALLBACK sampleloadcallback);

По правде говоря меня это несколько расстроило, потому как это накладывало целый ряд ограничений на ее использование.

К счастью, я обнаружил еще механизм функций обратного вызова, которые вселили в меня надежду что не все так плохо как кажется на самом деле:
typedef void (*FMUSIC_CALLBACK)(FMUSIC_MODULE *mod, unsigned char param);

void FSOUND_File_SetCallbacks(
unsigned int (*OpenCallback)(char *name),
void (*CloseCallback)(unsigned int handle),
int (*ReadCallback)(void *buffer, int size, unsigned int handle),
void (*SeekCallback)(unsigned int handle, int pos, signed char mode),
int (*TellCallback)(unsigned int handle));

Итак, я решил реализовать класс, который бы как минимум умел бы воспроизводить XM-треки из файла, и как максимум - работать с объектом типа System.IO.Stream.

Мне очень понравился процесс создания этой оболочки. Мне даже удалось в некоторой степени "обмануть" разработчиков, и передавать не строку с путем файла а указатель на объект типа System.IO.Stream.

Вот листинг .NET класса для воспроизведения XM-файлов:
namespace NModPlayer
{
public ref class ModPlayer : public IDisposable
{
private:
Stream^ _stream;
FMUSIC_MODULE* _mod;
GCHandle _gcHandle;

public:

ModPlayer(Stream^ stream)
{
_stream = stream;
FSOUND_File_SetCallbacks(memopen, memclose, memread, memseek, memtell);
}

void BeginPlay()
{
GCHandle _gcHandle = GCHandle::Alloc(_stream);
void* pStream = (void*)GCHandle::ToIntPtr(_gcHandle);

_mod = FMUSIC_LoadSong((char*)pStream, NULL);
FMUSIC_PlaySong(_mod);
}

void StopPlay()
{
if (_mod)
{
FMUSIC_FreeSong(_mod);
}

if (_gcHandle.IsAllocated)
{
_gcHandle.Free();
}
}

~ModPlayer()
{
StopPlay();
}
};
}

Обратите внимание на конструкцию вида:
GCHandle _gcHandle = GCHandle::Alloc(_stream);
void* pStream = (void*)GCHandle::ToIntPtr(_gcHandle);

_mod = FMUSIC_LoadSong((char*)pStream, NULL);

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

Таким образом, я сделал фиксацию объекта Stream, получил на него неуправляемый указатель, привел его к типу который от меня хотели и передал в библиотечную функцию.

Реализация callback-функций выглядит следующим образом:
Stream^ handleToStream(unsigned int handle)
{
GCHandle gcHandle = GCHandle::FromIntPtr((IntPtr)(void*)handle);
Stream^ stream = (Stream^)gcHandle.Target;
return stream;
}

unsigned int memopen(char* instance)
{
return (unsigned int)((void*)instance);
}

void memclose(unsigned int)
{
// Do nothing because GC will free all allocated memory
}

int memread(void *buffer, int size, unsigned int handle)
{
Stream^ stream = handleToStream(handle);

if (stream->Position + size >= stream->Length)
{
size = (int)(stream->Length - stream->Position);
}

array^ managedBuffer = gcnew array(
(unsigned int)size);

stream->Read(managedBuffer, 0, size);

Marshal::Copy(managedBuffer, 0, (IntPtr)buffer, managedBuffer->Length);

return size;
}

void memseek(unsigned int handle, int pos, signed char mode)
{
Stream^ stream = handleToStream(handle);

if (mode == SEEK_SET)
{
stream->Position = pos;
}
else if (mode == SEEK_CUR)
{
stream->Position += pos;
}
else if (mode == SEEK_END)
{
stream->Position = stream->Length + pos;
}

if (stream->Position > stream->Length)
{
stream->Position = stream->Length;
}
}

int memtell(unsigned int handle)
{
Stream^ stream = handleToStream(handle);

return (int)stream->Position;
}

В фунции memopen вроде бы передают указатель на строку, но мы то знаем, что мы туда отдали ;)

В принципе реализация остальных функций не требует особых пояснений.

Так что теперь любой .NET программист сможет спокойно использовать эту библиотеку, потому как в его распоряжении окажется обычная .NET сборка с классом ModPlayer.

Вот например я этот класс использовал в Windows Form приложении:
namespace NMiniFMOD.Sample
{
public partial class FormMain : Form
{
ModPlayer _modPlayer;

public FormMain()
{
InitializeComponent();
}

private void FormMain_Shown(object sender, EventArgs e)
{
using (Stream stream = new MemoryStream(Resources.MusicTrack))
{
_modPlayer = new ModPlayer(stream);
_modPlayer.BeginPlay();
}
}

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
_modPlayer.Dispose();
}
}
}

Если интересно, могу выложить полный исходный код.