середа, 14 липня 2010 р.

IP адреса без використання DNS

Раніше для того щоб отримати IP адресу я використовував gethostbyname, хоч і рекомендують її замінювати іншими. Проблеми з’являються, якщо у користувача якісь проблеми з мережою - програма просто застигає і чекає доки функція не віддасть керування (зменшити час очікування не вдається). Тому тепер я беру IP адресу з мережевого інтерфейсу (потрібно підключити ifaddrs.h):

ifaddrs *myaddrs, *ifa;
sockaddr_in *s4;
int status;
char ip[64];

status = getifaddrs(&myaddrs);
if (status != 0)
PrintLog("getifaddrs failed");

for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
continue;
if ((ifa->ifa_flags & IFF_UP) == 0)
continue;

if (ifa->ifa_addr->sa_family == AF_INET)
{
s4 = (struct sockaddr_in *)(ifa->ifa_addr);
if (inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s4->sin_addr), ip, sizeof(ip)) == NULL)
PrintLog("%s: inet_ntop failed", ifa->ifa_name);
}
}
freeifaddrs(myaddrs);

Протестовано на MacOS Snow Leopard і Tiger.

пʼятниця, 9 липня 2010 р.

BeHealthy 0.0.2 build 9 beta for Mac OS

BeHealthy 0.0.2b9 released.
Features:
  • new status icons
  • disable/enable display sleep option
  • status notification sounds

середа, 7 липня 2010 р.

BeHealthy now available in Bodega Mac apps store

Good news! Today BeHealthy was approved to great Mac application store Bodega. New updates of application will be soon - I'm working on it.

четвер, 1 липня 2010 р.

BeHealthy 0.0.1 build 1 beta for Mac OS

I've just released ver. 0.0.1 b1 of BeHealthy - utility to control your work time. I made it for my own, so feel free using it and be healthy.
BeHealthy
is currently in beta stage and therefore some functions might not work as you like. Please don’t get angry and have patience!
Mac OS 10.6 required
Download

четвер, 27 травня 2010 р.

Android sqllite БД на SD карті

Виникла потреба розміщувати базу даних на SD карті мого HTC Hero. Вирішення знайшлося майже відразу (я ж новенький в розробці для Android):
try
{
File dbPath = new File(Environment.getExternalStorageDirectory(), "myappname");
if (!dbPath.exists()) {
dbPath.mkdirs();
}
File dbFile = new File(dbPath, "mydb.db");
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
db.setVersion(1);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.execSQL(CREATE_MYTABLENAME);
}
catch (SQLException ex)
{
System.out.print(ex.getMessage());
}
Тепер є можливість редагувати файл бази даних сторонніми засобами.

четвер, 24 грудня 2009 р.

Запрошення на Google Wave

Є 25 запрошень на Google Wave. Пишіть кому потрібні :)

вівторок, 2 червня 2009 р.

C++0x: static_assert

Поцяцькався з новою VS2010 beta і вирішив слідкувати за новим стандартом, до якого надіюсь залишилось не так довго.
Найперша і найдоступніша фіча, застосування якій можна знайти відразу - це static_assert. Призначення її очевидне - перевірка виразів на етапі компіляції. Раніше для цих цілей я використовував Boost.StaticAssert (і зараз використовую, бо переводити комерційні проекти на VS2010 ще рано, та і про кросплатформеність поки ще рано мріяти). Але на відміну від boost версії тут є можливість вказувати текст помилки.
При компіляції коду де присутня стрічка
static_assert(false, "It is false");
бачимо:
------ Build started: Project: test1, Configuration: Debug Win32 ------
ClCompile:
test1.cpp
c:\documents and settings\alexandr\my documents\visual studio 10\projects\test1\test1\test1.cpp(18): error C2338: It is false
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
При використанні boost
BOOST_STATIC_ASSERT(false);
отримуємо не такий зрозумілий вивід:
------ Build started: Project: test1, Configuration: Debug Win32 ------
Compiling...
test1.cpp
c:\documents and settings\alexandr\my documents\Visual Studio 2005\projects\test1\test1\test1.cpp(18):(3455) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE'
with
[
x=false
]
test1 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Чекаємо з нетерпінням стандарту, а поки використовуємо boost реалізацію.