четвер, 24 грудня 2009 р.
вівторок, 2 червня 2009 р.
C++0x: static_assert
Поцяцькався з новою VS2010 beta і вирішив слідкувати за новим стандартом, до якого надіюсь залишилось не так довго.
Найперша і найдоступніша фіча, застосування якій можна знайти відразу - це static_assert. Призначення її очевидне - перевірка виразів на етапі компіляції. Раніше для цих цілей я використовував Boost.StaticAssert (і зараз використовую, бо переводити комерційні проекти на VS2010 ще рано, та і про кросплатформеність поки ще рано мріяти). Але на відміну від boost версії тут є можливість вказувати текст помилки.
При компіляції коду де присутня стрічка
Чекаємо з нетерпінням стандарту, а поки використовуємо boost реалізацію.
Найперша і найдоступніша фіча, застосування якій можна знайти відразу - це static_assert. Призначення її очевидне - перевірка виразів на етапі компіляції. Раніше для цих цілей я використовував Boost.StaticAssert (і зараз використовую, бо переводити комерційні проекти на VS2010 ще рано, та і про кросплатформеність поки ще рано мріяти). Але на відміну від boost версії тут є можливість вказувати текст помилки.
При компіляції коду де присутня стрічка
static_assert(false, "It is false");
бачимо:------ Build started: Project: test1, Configuration: Debug Win32 ------При використанні boost
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_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 бридко блимає :(
Порадувало досить симпатичне діалогове вікно створення нового проекту. Непоганий дизайн, ергономічність і все досить логічно структурузовано:

З нового, що відразу помітно:
UPD1 02.06.2009
З нового, що відразу помітно:
- мова 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).
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();У функції яка викликається відразу після того, як створилося вікно (реакція на подію windowComplete) реалізуються механізми взаємодії з системним треєм:
private var trayIconMenuShow:NativeMenuItem = trayIconMenu.addItem(new NativeMenuItem("Show"));
private var trayIconMenuExit:NativeMenuItem = trayIconMenu.addItem(new NativeMenuItem("Exit"));
private var iconLoader:Loader = new Loader();
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:
Файл /home/sasha/Develop/repos/conf/passwd
Встановлюємо безпосередньо 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]Файл /home/sasha/Develop/repos/conf/svnserve.conf
sasha = password
[general]Налаштування сховища завершене. Subversion будемо запускати через inetd. Для цього до файлу /etc/inetd.conf додамо наступний запис:
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
svn stream tcp nowait root /usr/bin/svnserve svnserve -i -r /home/sasha/Develop/reposДемон inetd тепер потрібно перезапустити:
/etc/init.d/openbsd-inetd restartТепер підключаємося до серверу зручним клієнтом за адресою svn://адреса_серверу.
Мітки:
Розробка,
Linux,
Subversion,
Ubuntu
Підписатися на:
Дописи (Atom)