пʼятниця, 15 липня 2011 р.

пʼятниця, 8 жовтня 2010 р.

BeHealthy 0.1.6 build 13 beta for Mac OS

BeHealthy Release Notes

0.1.6b13 Change Log:

  • [FEATURE] Added sending anonymous system profile option.
  • [FIX] "Give me X min" buttons work correctly for short break.
  • [FEATURE] Changed update server.

четвер, 30 вересня 2010 р.

BeHealthy 0.1.5 build 12 beta for Mac OS

BeHealthy 0.1.5b12 Release Notes

Change Log:

  • [FEATURE] Added short breaks.
  • [FEATURE] Added enable/disable notification sounds option.
  • [FEATURE] Remastered Preferences dialog.
  • [FEATURE] Added status menu icons.
  • [FEATURE] Added logging support.
  • [FIX] Fixed bug with user settings.

понеділок, 6 вересня 2010 р.

BeHealthy 0.0.4 build 11 beta for Mac OS

BeHealthy 0.0.4b11 released.
Features:
  • fully rewrote code structure using MVC pattern
  • new preferences window
  • about window moved to preferences
  • added auto run at login option to general tab
  • added update options tab
  • bug fixing

неділя, 22 серпня 2010 р.

BeHealthy 0.0.3 build 10 beta for Mac OS

BeHealthy 0.0.3b10 released.
Features:
  • new break window interface
  • fixed several bugs

середа, 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 реалізацію.

понеділок, 1 червня 2009 р.

Суб’єктивний огляд MS Visual Studio 2010 Beta

Після денного завантаження всіх компонентів нової MS Visual Studio 2010 Beta нарешті встановив її. Перше що кидається в очі це жахливий синій інтерфейс, дуже повільна робота і неприємно розмазані шрифти(можливо недоліки бета версії; можливо у Windows XP воно так і повинно виглядати, бо розраховували на Windows 7). Також у новоствореному проекті під час сканування файлів проекту - Solution Explorer бридко блимає :(

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


З нового, що відразу помітно:
  • мова F# встановлена за умовчанням (відразу з’явилося бажання вивчати функціональне програмування), що не може не радувати;
  • нова .NET Framework 4.0 (так як шарпові мови цікавлять мало про нововведення тут);
  • можливіть вибору версії .NET Framework під час створення проекту;
  • у діалоговому вікні створення проекту є пункт Online Templates, де знаходяться декілька досить цікавих шаблонів;
  • покращений редактор коду;
  • додали Extension Manager зі зручним інтерфейсом доступу до додатків, їхнім встановленням і керуванням (є досить цікаві і надія що будуть досить зручні додатки для доступу до систем контролю версій)
  • додали Parallel Patterns Library (PPL). Річ досить цікава, але як я зрозумів не кросплатформена (але ж Microsoft це ніколи не хвилювало), тому доведеться використовувати OpenMP покищо (omp.h наявний). Ще були додані Asynchronous Agents Library, Work scheduler і Resource manager, але їх я ще не вивчав. Досить зручно використовувати для розпаралелювання циклів(Concurrency::paparallel_for_each, Concurrency::paparallel_for):

    #include <ppl.h>
    #include <array>
    #include <iostream>

    template<class Ty>
    void square_function(Ty& n)
    {
    n *= n;
    }

    int main(int argc, char* argv[])
    {
    std::tr1::array<int, 5> values = { 1, 2, 3, 4, 5 };
    Concurrency::paparallel_for_each(values.begin(), values.end(), &square_function<int>);
    return 0;
    }
  • додані нові C++ фічі (Lambda functions, Transporting exceptions, Rvalue references, auto keyword, decltype keyword).

Це все, що я помітив після 10 хвилинного знайомства з новою студією (воно було того не варте).

UPD1 02.06.2009

понеділок, 18 травня 2009 р.

Зміни у веденні блога

Привіт. 
Я, blackstone - програміст на мові Java з невеликим стажем. Відтепер я допомагатиму вести цей блог IUKNOWN.
Думаю що мої пости переважно будуть присвячені Java, але зараз про це ще рано щось казати.

вівторок, 3 лютого 2009 р.

Робота в Adobe AIR з іконкою в треї

Вивчаючи AIR від Adobe вирішив написати невеличку програмку для своїх потреб. Мені необхідно було зробити так, щоб вона могла ховатися в трей при закритті головного вікна, або його мінімізації. Виявилось що в AIR це досить не тривіальна задача. Далі невеличкий приклад моєї реалізації роботи з треєм.
Створюємо змінну для роботи з системним треєм:
private var sysTrayIcon:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
Далі необхідно створити змінні самого меню і завантажувача малюнка:
private var trayIconMenu:NativeMenu = new NativeMenu();
private var trayIconMenuShow:NativeMenuItem = trayIconMenu.addItem(new NativeMenuItem("Show"));
private var trayIconMenuExit:NativeMenuItem = trayIconMenu.addItem(new NativeMenuItem("Exit"));
private var iconLoader:Loader = new Loader();
У функції яка викликається відразу після того, як створилося вікно (реакція на подію windowComplete) реалізуються механізми взаємодії з системним треєм:
public function Init():void {
// Перевіряємо чи підтримується робота з системним треєм
if (NativeApplication.supportsSystemTrayIcon)
{
// Налаштовуємо реакцію на шиглик по іконці в треї: виклик clickTrayIconHandler()
NativeApplication.nativeApplication.icon.addEventListener(MouseEvent.CLICK, clickTrayIconHandler);

// Налаштовуємо реакцію на завершення завантаження малюнку
iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (event:Event):void {
// Встановлюємо завантажений малюнок у трей
NativeApplication.nativeApplication.icon.bitmaps = new Array(event.target.content.bitmapData);
});

// Підказка, що відображається при наведенні миші на іконку в треї
sysTrayIcon.tooltip = "Systrayicon example";

// Налаштовуємо реакцію на вибір пункту меню Exit у меню
trayIconMenuExit.addEventListener(Event.SELECT, function (event:Event):void {
NativeApplication.nativeApplication.icon.bitmaps = [];
NativeApplication.nativeApplication.exit();
});

// Налаштовуємо реакцію на мінімізацію вікна: виклик minimizeHandler()
stage.nativeWindow.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, minimizeHandler);

// Налаштовуємо реакцію на вибір пункту меню Show у меню
trayIconMenuShow.addEventListener(Event.SELECT, clickTrayIconHandler);

// Встановлюємо меню
sysTrayIcon.menu = trayIconMenu;
}
}
Функція-реакція на закриття вікна:
// Реакція на закриття вікна        
protected function closingHandler(event:Event):void
{
// Забороняємо стандартну реакцію
event.preventDefault();

// Ховаємо вікно
this.visible = false;

// Завантажуємо і відображаємо іконку в треї
iconLoader.load(new URLRequest("images/systrayicon.png"));
}
Функція-реакція на щиглик по іконці в треї:
// Реакція на щиглик по іконці в треї, або вибір пункту меню Show
protected function clickTrayIconHandler(event:Event):void
{
// Прибираємо іконку з трею
NativeApplication.nativeApplication.icon.bitmaps = [];

// Відображаємо вікно
this.visible = true;

// Переводимо фокус на вікно
this.activate();
}
Функція-реакція на мінімізацію вікна:
// Реакція на мінімізацію вікна
protected function minimizeHandler(event:Event):void
{
// Перевіряємо, чи дійсно ми мінімізуємо вікно
if ((event as NativeWindowDisplayStateEvent).afterDisplayState == NativeWindowDisplayState.MINIMIZED)
{
// Забороняємо стандартну реакцію
(event as NativeWindowDisplayStateEvent).preventDefault();

// Ховаємо вікно
this.visible = false;

// Завантажуємо і відображаємо іконку в треї
iconLoader.load(new URLRequest("images/systrayicon.png"));
}
}
Завантажити вихідні коди проекту.

неділя, 1 лютого 2009 р.

Встановлення і налаштування Subversion

Для власних проектів виникла необхідність використовувати систему контролю версій.Но роботі довго і успішно використовується CVS. Вирішив не встановлювати всілякі екзотичні системи і зупинив свій вибір на Subversion, як логічного продовження CVS. Проаналізувавши різноманітні інструкції про встановлення і налаштування Subversion, побачив що у всіх якийсь нездоровий інтерес до встановлення системи зверху на Apache (припускаю що це може бути зручно для різноманітних web-проектів). Я вирішив встановити Subversion у вигляді окремого демону. Інформацію брав з відкритої книги Version control with Subversion.
Встановлюємо безпосередньо Subversion:
apt-get install subversion
Створюємо теку для сховища (далі всі налаштування ведуться з препущенням що сховище знаходиться в /home/sasha/Develop/repos):
mkdir /home/sasha/Develop/repos
Створюємо сховище:
svnadmin create /home/sasha/Develop/repos
Відредагуємо деякі файли налаштувань нашого сховища.
Файл /home/sasha/Develop/repos/conf/passwd
[users]
sasha = password
Файл /home/sasha/Develop/repos/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
# authz-db = authz
realm = My Repository

[sasl]
# use-sasl = true
# min-encryption = 0
# max-encryption = 256
Налаштування сховища завершене. Subversion будемо запускати через inetd. Для цього до файлу /etc/inetd.conf додамо наступний запис:
svn     stream  tcp     nowait root     /usr/bin/svnserve svnserve -i -r /home/sasha/Develop/repos

Демон inetd тепер потрібно перезапустити:
/etc/init.d/openbsd-inetd restart
Тепер підключаємося до серверу зручним клієнтом за адресою svn://адреса_серверу.

четвер, 25 грудня 2008 р.

Подарунки від Wuala на Різдво

Хоч ми і не всі католики, але отримати подарунок на католицьке Різдво можна всім користувачам чудового сервісу Wuala незалежно від їх віросповідання. Достатньо зайти під своїм акаунтом 25-26 грудня і в подарунок отримаєте 1 Гб додаткового простору. Поспішість і гарних свят!

пʼятниця, 17 жовтня 2008 р.

GTK стиль Qt програм

Розробники Qt пішли на зустріч користувачам Gnome і створили їх QGtkStyle. Тепер Qt програми не будуть виглядати такими нерідними в Gnome середовищі. Для встановлення робимо наступне:

sudo apt-get install build-essential libqt4-dev libgtk2.0-dev subversion qt4-qtconfig
svn co svn://labs.trolltech.com/svn/styles/gtkstyle
cd gtkstyle/
qmake-qt4
sudo make install

Тема зібралась і встановилась. Заходимо в System-> Preferences-> Qt 4 Settings і зі списку вибираємо тему GTK.
Тепер всі Qt програми виглядають рідними в Gnome (всі Qt4 програми). Насолоджуємося ними і не згадуємо про існування KDE.

вівторок, 14 жовтня 2008 р.

Оновлення Ubuntu 8.04 до Ubuntu 8.10

Набридло чекати офіційного виходу релізу, тому вирішив оновитися і спробувати власноруч що нового в Ubuntu Intrepid (8.10).
У встановленій Ubuntu 8.04 натискаємо комбінацію клавіш Alt+F2 і у вікні запуску набираємо update-manager -d.
Далі нічого особливого. Update Manager повідомляє що є новий реліз. Тиснемо кнопку Upgrade.
Читаємо Release Notes:
Після того як ми знову натиснемо Upgrade нарешті починається встановлення:

Погоджуємося з тим що підтримка деяких пакетів закінчена:
І погоджуємся з тим що ми всетаки готові почати оновлення:
Далі потрібно набратися терпіння і зайнятися чимось корисним (я наприклад ліг спати), час від часу поглядаючи на монітор чи не повинні ми ще з чимось погодитись.

Після довгого встановлення і перезавантаження маємо нову Ubuntu.
Далі мова піде про те що хорошого, поганого і просто нового було мною помічено.

Хорошого:
1. Звичайно порадувало те, що тепер за умовчанням використовується Flash 10.
2. Сам інтерфейс став набагато краще виглядати, плюс нова темна тема просто чудова :).
3. Нові версії программ - в Compiz з’явилось декілька нових ефектів.
4. Таби в Nautilus звичайно зручна штука, яку давно потрібно було реалізувати, але я віддаю перевагу 2-х панельним файловим менеджерам.
5. Network Manager помітно підріс, але змінити налаштування за допомогою нього мені не вдалося - не знайшов як отримати права root.
Поганого:
1. Після оновлення мій ноут перестав вимикати живлення при вимкненні системи (жорсткі диски зупиняються але монітор не вимикається, доводиться вимикати руцями). Подібні помилки дратують мене найбільше, при тому що в 8.04 було все нормально.
2. Постійні креши різноманітних программ. Хоча це ж бета - є надія що виправлять.

пʼятниця, 3 жовтня 2008 р.

Робота з Android SDK в Ubuntu 8.04 x64

Не зрозуміло чому компанії-гіганти приділяють таку малу увагу x64 платформі. Цього разу Google теж забув про користувачів x64 систем. Я довго намагався встановити ADT для Eclipse 64bit, але нічого не вийшло і я вирішив піти іншим шляхом.
1. Для початку завантажуємо Eclipse IDE for Java EE Developers під Linux 32bit (на час написання на сайті була доступна версія 3.4.1 Ganymede). Розпаковуємо завантажений архів наприклад в /opt/eclipse32/.
2. Встановлюємо 32-бітну збірку Java командою sudo apt-get install ia32-sun-java6-bin.
3. Створюємо файл /opt/eclipse32/eclipse.sh з наступним вмістом:

#!/bin/bash
PATH=/usr/lib/jvm/ia32-java-6-sun/bin:$PATH
/opt/eclipse32/eclipse

Тепер все готове для запуску Eclipse. Для зручності можна додати запуск файлу eclipse.sh до меню.
4. Завантажуємо Android SDK для Linux (i386) з офіційного сайту. Розпаковуємо архів наприклад в теку користувача /home/user_name/android-sdk-linux_x86-1.0_r1.
5. Запускаємо Eclipse. Заходимо в Help -> Software Updates.... У діалоговому вікні переходимо на закладку Available Software. Натискаємо на кнопку Add Site... і додаємо адресу https://dl-ssl.google.com/android/eclipse/. Ставимо на ній галочку і тиснемо кнопку Install,чекаємо доки встановлення закінчиться і перезавантажуємо Eclipse.
Заходимо в Window -> Preferences. Переходимо до налаштувань Android і в полі SDK Location пишемо шлях до SDK і тиснемо OK.
Тепер все готове для роботи :)
6. Вибираємо File -> New -> Project... і сворюємо новий проект:
7. У новоствореному файлі TestAndroid.java напишемл щось осмислене:

package com.android.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class TestAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Тест пройшов успішно!!!");
setContentView(tv);
}
}

8. Тепер вибираємо Run -> Run, трішки чекаємо (як на мене досить довго) і милуємося мегапрогою:
Тепер маємо всі інструменті для створення програм під Android. Надіюсь залізо на його основі матиме популярність :)