субота, 15 вересня 2007 р.

Налаштування параметрів GRUB в Ubuntu

Параметри GRUB, як то пункт меню за замовчуванням, тривалість паузи та ін. зазвичай налаштовують редагуючи файл /boot/grub/menu.lst. Проте, оскільки Ubuntu претендує на дружність до користувачів то ми поступимо по іншому. І нехай "гуру" назвуть мене віндузятником, проте я все одно люблю зручність.

Startup Manager - графічний аплет для Gnome призначений для налаштування параметрів GRUB, стартової заставки Ubuntu та ін.

Скачати .deb файл можна звідси (розмір - 62,8Кб):
http://www.getdeb.net/download.php?release=1456&fpos=0
(встановлення простим подвійним кліком)

В результаті у меню Система -> Адміністрування з'явиться новий пункт - StartUp-Manager.



Усі налаштування є інтуітивно зрозумілими, тому розповідати більше тут особливо й нема чого. Використовуйте на здоров'я.

четвер, 13 вересня 2007 р.

Текстовий процесор LyX

Я вже публікував статтю з розповіддю про чудову систему для підготовки публікацій типографської якості - LaTeX (http://korkholeh.blogspot.com/2007/09/latex.html). На жаль переважна більшість людей в Україні, навіть у академічному середовищі (що особливо прикро для мене) не лише не володіють даною системо, а навіть ніколи не чули про її існування. Більше того, навіть наші математики та інші фундаментальщики, на відміну від своїх зарубіжних колег, з впертістю гідної кращого застосування продовжують насилувати офісні інструменти (переважно MS Word) змушуючи їх робити те, для чого вони не були призначені. І це дійсно проблема, адже використання LaTeX допомоголо б сильно економити час, що витрачається просто впусту на потуги привести публікацію у Word до пристойного вигляду. Наші зарубіжні колеги вже більше 20 років використовують цю систему і наразі нічого кращого ще придумано не було.

Так, LaTeX дійсно штука не проста і вимагає певних знань. Це дійсно так, адже це спеціалізована мова розмітки, але вивчивши основний набір команд можна прискорити швидкість своєї роботи у рази. Ви не повинні витрачати свій час на верстання публікацій, нехай комп'ютер це робить за вас, це його задача, ваша ж задача лише набрати сам текст.

Проте, не потрібно й переоцінювати складність роботи з LaTeX. Адже створено багато програм які дозволяють спростити роботу з даною системою. Є такстові редактори які просто підсвічують синтаксис LaTeX (vim, gedit), є спеціалізовані редактори які дозволяють працювати зі структурою документу та вставляти різноманітні команди одним кліком мишки (TeXMaker), а потужні спеціалізовані текстові процесори, що використовують LaTeX для верстання документу проте не вимагають його глибинних знань (LyX, TeXmacs). Я розповім про один з таких текстових процесорів,який є мабуть найпотужнішим OpenSource інструментом у даній галузі і практично нічим не поступається своїм комерційним аналогам у середовищі Windows (Scientific Word наприклад) - LyX.

LyX - це текстовий процесор, що сповідує філософію WYSIWYM (What You See Is What You Mean). На відміну від WYSIWYG такий підхід акцентує увагу не на зовнішньому вигляді документу, а на його контенті та структурі. Принцип полягає у тому, що ви набираєте текст, включаючи формули, малюнки та таблиці, паралельно вказуючи логічну структуру документу та задаючи зв'язки між окремими об'єктами, а також задаючи логічне форматування. Остаточною ж підготовкою публікації згідно всіх типографських правил займається вже компілятор LaTeX генеруючи файл (.dvi, .ps, .pdf) придатний для роздруку на будь-якому обладнанні і під будь-якою платформою. При цьому у вас є 100% гарантія, що на чужому принтері документ роздрукується абсолютно у такому ж самому вигляді як і на вашому.

Оскільки у репозиторіях Ubuntu Feisty Fawn знаходиться стара версія, то я рекомендую скачати останню на сьогодні версію 1.5.1 з офіційного сайту http://www.lyx.org/ Серед нововведень у гілці 1.5 - підтримка кодування UTF-8, а також переведення інтерфейсу користувача на Qt4. Існують також версії і для інших платформ, у тому числі Windows.

Ось так виглядає LyX після запуску:



Звичайно, щоб описати всі можливості LyX потрібно написати немаленьку книжку, тому тут я буду говорити лише про основні речі. Нижче видно відкритий документ (це текст із системи допомоги).



LyX дозволяє набирати текст приблизно так же як ви його могли б набирати у тому ж Word чи Writer, але тут є свої особливості викликані тісною інтеграцією з LaTeX. Перша особливість - це те, що зовнішнє оформлення документу повністю описується класом документа (Document->Settings->Document Class). Саме клас документу визначає як верстати сторінки (друк з одного боку чи з двох), найвищий порядок команд рубрикації (у класі Book наприклад навідміну від Article присутні частини - Part), параметри оформлення заголовків та ін. У тому ж таки Document->Settings ви зможете задати розмір основного шрифта, поля, мову, підключити додаткові пакети та ін. Також можна вручну додати необхідні команди у преамбулу.

Дуже зручно працювати у LyX з рисунками. Наприклад вам потрібно вставити плаваючий рисунок у статтю, тоді просто вставляємо плаваючий кадр з допомогою Insert->Float->Figure. Набираємо підпис рисунка, а потім піднявши курсор угору, з допомогою Insert->Graphics вставляємо вже безпосередньо зображення. З допомогою Edit->Paragraph Settings вирівнюємо рисунок по центру.



Формули вставляються ще простіше. Якщо потрібна формула у тексті, то використовується Insert->Math->Inline Formula, а виключна формула вставляється з допомогою Insert->Math->Display Formula. Існує також велика кількість інших варіантів формул, включаючи додаткові середовища AMS-TeX (наприклад multline для багаторядкових формул).

Що стосується більшості стандартних команд LaTeX, то LyX обробляє їх "на льоту", але частина команд відображається явно сірим кольором. Наприклад команда вставки сноски \footnote, відображається саме таким чином, а її текст видно після подвійного кліку по ній. З допомогою Document->Outline можна проглядати структуру документа. Результуючий документ завжди можна переглянути з допомогою меню View у такому форматі який потрібен.

Нерозривний пробіл ставиться з допомогою Ctrl+Enter. Три та два дефіса вставлених підряд автоматично замінюються на довге або середнє тире.

Звісно ж реальна сила LaTeX ховається далеко за візуальними наворотами і можливості LyX обмежені. Проте у випадках коли потрібно швидко підготувати документ не заглиблюючись у тонкощі, то такий підхід дозволяє отримати досить якісний результат.

Зміна параметрів оформлення документу
Хоч LyX і дуже зручний інструмент, проте далеко не всім очевидно як змінити стандартне оформлення документу передбачене вибраним класом. Насправді даний текстовий процесор не має таких можливостей, тому для цього потрібно знати LaTeX. Для того щоб перекрити певні команди потрібно додати зміни у преамбулу (Document->Settings->LaTeX Preamble).

Наприклад, якщо ми хочемо щоб перед номером розділу саме слово Розділ писалось великими літерами нам потрібно додати команду:
\renewcommand{\@chapapp}{РОЗДІЛ~}

Якщо ми хочемо щоб номер сторінки проставлявся не внизу по центру, а вгорі праворуч, то потрібно вставити наступне:

\renewcommand{\@oddhead}{\hfil\thepage}
\renewcommand{\@oddfoot}{}


Якщо потрібно, щоб заголовок глави відображався не жирним шрифтом з вирівнюванням по лівому краю, а звичайним текстом вирівняним по центру, то потрібно перекрити команду \section. Таким же чином можна перекривати й інші команди описані у класі документу змінюючи оформлення різних елементів. Це здається складним якщо робити з нуля, проте початкові описи команд можна знайти у відповідному .cls файлі, потрібно лише їх зкопіювати і змінити їх опис з допомогою команди \renewcommand.

\renewcommand{\section}{\@startsection{section}{2}%
{\parindent}{3.5ex plus 1ex minus .2ex}%
{2.3ex plus .2ex}{\normalfont\large\centering}}


Для того щоб замінити двокрапку після номера рисунку на прийняту у нас крапку, потрібно перекрити команду \@makecaption

\renewcommand{\@makecaption}[2]{%
\vspace{\abovecaptionskip}%
\sbox{\@tempboxa}{#1. #2}
\ifdim \wd\@tempboxa >\hsize
#1. #2\par
\else
\global\@minipagefalse
\hbox to \hsize {\hfil #1. #2\hfil}%
\fi
\vspace{\belowcaptionskip}}


Щоб у списку бібліографії після номера джерела ставилася крапка, а не щоб номер брався як по замовчуванню у квадратні дужки:

\makeatletter
\renewcommand{\@biblabel}[1]{#1.\hfill}
\makeatother


Щоб включити до нумерації глав та підглав ще й номер роздулу:

\renewcommand{\thesection}{\arabic{chapter}.\arabic{section}.}
\renewcommand{\thesubsection}{\arabic{chapter}.\arabic{section}.\arabic{subsection}.}


Більш докладно про модифікацію стандартних класів LaTeX можна прочитати тут: http://www.intuit.ru/department/publish/latex/9/программирование на языке ассемблера примеры задач

вівторок, 11 вересня 2007 р.

Розв'язуємо проблеми зі стилусом у КПК Asus A632

Отже, півтори роки тому я став щасливим власником КПК Asus A632. Ця машинка мені до сих пір дуже подобається швидким процесором, чудовими показниками роботи від однієї зарядки акумулятора, двома слотами під карти пам'яті, наявністю модуля GPS з відкидною антеною та автомобільного кріплення. Проте є у цієї моделі і свої недоліки. Я стикнувся з двома з них - поломкою фіксатора стилуса через що той постійно прагнув випасти зі свого гнізда, та мимовільним вимиканням КПК на свій власний розсуд. Заглибившись у Інтернет я знайшов здавалося рішення обох проблем. Для того щоб стилус не випадав зі свого гнізда, рядять надіти на нього маленьке гумове кільце, яке можна знайти розібравши звичайну газову запальничку. На стилусі є паз куди це кільце чудово сідає, і тепер стилус почав ходити у гнізді з зусиллям. Проте не довгою була моя радість, на днях при спробі витягти стилус я відчув, що він витягується зі значним зусиллям, потягнувши його сильніше я витяг його але без наконечнику, останній залишився глибоко у гнізді і достати його не було ніякої змоги. Після деяких роздумів, було прийнято рішення розібрати КПК щоб дістати наконечник і можливо придумати якийсь інший вихід з положення з фіксацією стилусу.

Отже, перед нами наш піддослідний. Трохи потертий за півтора роки активного використання.



Кладемо його екраном вниз, знімаємо кришку батарейного відсіку і виймаємо акумулятор.



Обережно виймаємо гумові заглушки.



Тепер по черзі викручуємо п'ять гвинтів, що з'єднують обидві половинки КПК.



Далі пробуємо акуратно відігнути круплення і розійняти обидві половинки. Червоними стрілками показано клямки корпусу.



І наостанок потрібно обережно вийняти шлейф GPS антени з роз'єму.



Тепер беремо окремо задню частину корпусу і відкрутивши три гвинти (показано стрілками) знімаємо шахту стилусу.



Готово. Діставши наконечник стилусу я вставив його на місце, але тепер для надійності зкріпив дві половинки краплею супер-клею. Гумове кільце з запальнички я прибрав взагалі. А для того щоб стилус фіксувався у шахті я взяв трохи ізоляційної стрічки, вирізав із неї підходящу смужку і намотав у тому місці де колись був зламаний фіксатор. Так як показано на фотографії.



От і все, тепер всі три частини потрібно уважно зібрати у зворотньому порядку. Ну і звичайно ж не забути вставити назад у відповідний роз'єм на платі шлейф GPS антени.



Що ж стосується вирішення проблеми з мимовільним вимиканням живлення КПК, то ця проблема часто виникає на екземплярах ранніх випусків через погане прилягання кришки батарейного відсіку. Для вирішення проблеми можна взяти наприклад звичайну карточку для поповнення рахунку мобільного зв'язку, вирізати з неї прямокутник рівний за розмірами розмірам акумулятора і підкласти його під кришку. Так як показано на фотографії.



Ну от і все, тепер КПК став майже як новий, втративши два свої найбільші недоліки. Звісно ж я змушений попередити, що якщо ви надумаєте повторити описане у даній статті, то будете робити це на свій страх і ризик, всю відповідальності за можливу поломку КПК ви несете самостійно, ну і звичайно ж повинні мати на увазі, що при цьому ви автоматично втрачаєте гарантію.кулинарные рецепты

понеділок, 10 вересня 2007 р.

Використання бібліотеки Qt4 на прикладі простої OpenGL програми

У даній статті я розповім як використовувати OpenGL графіку у програмах основаних на бібліотеці Qt4 ну і власне про принципи роботи з самою бібліотекою. Я не буду ускладнювати задачу 3D графікою, обмежимося лише 2D. Створимо простеньку програмку з меню, одним пунктом у підменю та графічним віджетом. Намалюємо просту сцену з червоним квадратом на синьому фоні, квадрат можна буде рухати стрілками або мищкою та змінювати його розміри.

Для того щоб мати змогу використовувати Qt4 його потрібно спочатку встановити використовуючи менеджер пакетів. Можна також встановити чудову IDE KDevelop, але можна обійтися і найпростішим текстовим редактором.

Отже, перш за все нам потрібно створити віджет який буде відображати графіку. Робиться це не складно, у Qt взагалі дуже просто породжувати нові віджети, для цього потрібно просто створити новий клас як спадкоємець стандартного QGLWidget. Назвемо його наприклад MyGLWidget. По правилу прийнятому у Qt, кожен клас повинен описуватися своєю парою .h та .cpp файлів. Спочатку опишемо сам клас у заголовочному файлі myglwidget.h:

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H

#include
#include

class MyGLWidget : public QGLWidget
{
Q_OBJECT
public:
MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
protected:
void resizeGL(int width, int height);
void paintGL();
void keyPressEvent (QKeyEvent *e);
void mousePressEvent(QMouseEvent *event);
private:
int iX, iY, iSize;
};
#endif


Тут особливу увагу потрібо звернути на використання макросу Q_OBJECT, він обробляється макропроцесором Qt і є обов'язковим для опису всіх класів віджетів. Інші методи перекривають стандартні. resizeGL - викликається при зміні розмірів віджету, paintGL - малює сцену, а keyPressEvent та mousePressEvent служать відповідно для перехвачення повідомлень від клавіатури та мишки відповідно. Самі методи реалізуються у файлі myglwidget.cpp (коментарі я додав по ходу програми):


#include "myglwidget.h"

MyGLWidget::MyGLWidget(QWidget *parent)
{
iX=125; iY=125; iSize=50; // задаємо початкові значення положення та розміру квадрату
}

void MyGLWidget::resizeGL(int width, int height)
{
if(height == 0) height = 1;
glViewport(0, 0, width, height);
glLoadIdentity();
if (width <= height) // Змінюємо систему координат таким чином щоб квадрат завжди залишався квадратом
glOrtho (0.0f, 250.0f, 0.0f, 250.0f*height/width, 1.0, -1.0);
else
glOrtho (0.0f, 250.0f*width/height, 0.0f, 250.0f, 1.0, -1.0);
}

void MyGLWidget::paintGL()
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // Задаємо синій колір для фону
glClear(GL_COLOR_BUFFER_BIT); // Очищуємо вікно
glColor3f(1.0f, 0.0f, 0.0f); // Обираємо червоний колір
glRectf(iX-iSize/2, iY+iSize/2, iX+iSize/2, iY-iSize/2); // Малюємо квадрат
glFlush(); // Виводимо зображення на екран
}

void MyGLWidget::keyPressEvent(QKeyEvent *e)
{
switch(e->key()) // Аналізуємо яку клавішу натиснено
{
case Qt::Key_Up: ++iY; break;
case Qt::Key_Down: --iY; break;
case Qt::Key_Left: --iX; break;
case Qt::Key_Right: ++iX; break;
case Qt::Key_Z: ++iSize; break;
case Qt::Key_X: --iSize; break;
default: QWidget::keyPressEvent(e); // Передаємо керування батківському методу
}
updateGL(); // Оновлюємо зображення
}

void MyGLWidget::mousePressEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) { // Перевіряємо чи натиснуто ліву кнопку мишки
iX=event->x(); // Змінюємо положення квадрату
iY=height()-event->y(); // Зверніть увагу, у системах координат OpenGL та Qt вісь Y направлена у протилежні сторони
updateGL(); // Оновлюємо зображення
}
}

MyGLWidget::~MyGLWidget()
{ } // Деструктор залишаємо пустим


Все, ми створили новий графічний віджет. Тепер, нам потрібно створити клас основного вікна. Для цього потрібно створити спадкоємця для QMainWindow. Нехай новий клас буде називатися qt4gl, тоді файл qt4gl.h буде мати наступний вигляд:

#ifndef QT4GL_H
#define QT4GL_H

#include
#include

class QAction;
class QMenu;
class QTextEdit;
class MyGLWidget;

class qt4gl:public QMainWindow
{
Q_OBJECT

public:
qt4gl();
~qt4gl();

private:
void createActions();
void createMenus();
void readSettings();

MyGLWidget *glCanvas;

QMenu *fileMenu;
QAction *exitAct;
};
#endif


Ну і відповідно реалізація у файлі qt4gl.cpp:


#include
#include "qt4gl.h"
#include "myglwidget.h"

#include

qt4gl::qt4gl()
{
glCanvas = new MyGLWidget; // Створюємо екземпляр віджету MyGLWidget
setCentralWidget(glCanvas); // Робимо його центральним віджетом у вікні
createActions(); // Ініціалізуємо набір екшенів
createMenus(); // Створюємо меню
glCanvas->setFocus(); // передаємо активний фокус нашому графічному віджету
}

void qt4gl::createActions()
{
exitAct = new QAction(tr("E&xit"), this); // Створюємо екшен для реалізації виходу з програми
exitAct->setShortcut(tr("Esc")); // Задаємо коротку клавішу
exitAct->setStatusTip(tr("Exit the application")); // Задаємо підказку
connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); // Задаємо зв'язку сигнал-слот для виконання команди
}

void qt4gl::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File")); // Додаємо підменю у головне меню
fileMenu->addAction(exitAct); // Додаємо пункт меню вказавши відповідний екшен
}

qt4gl::~qt4gl()
{ }


Готово, основне вікно тепер створено. Для не знайомих з філософією Qt може бути незвичним наступний рядок:
connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));

Сигналом у поняттях Qt називається подія яка виникає внаслідок тих або інших дій користувача, у даному випадку вибору пункта меню (triggered), але таких стандартних сигналів є досить багато. Слот - це метод який будучи зв'язаним з кокретним сигналом автоматично викликається при настанні тієї чи іншої події. Це основне з положень на якому базується Qt, у спеціальній літературі дане питання описано більш докладно.

Ну і на завершення створимо основний файл програми (main.cpp):


#include
#include "qt4gl.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv); // Ініціалізуємо програму
qt4gl * mw = new qt4gl(); // Створюємо основне вікно
mw->resize(250,250); // Задаємо розміри центрального віджета
mw->setWindowTitle(QObject::tr("OpenGL + Qt4")); // Вказуємо заголовок вікна
mw->show(); // Виводимо вікно на екран
return app.exec(); // Запускаємо головний цикл програми, return тут використовується для повернення результату виконання програми операційній системі, для *nix вимагається.
}


Ну от. Тепер залишається лише все це зкомпілювати. Для цього створюємо папку qt4gl, копіюємо туди всі наші файли і запускаємо команду:
qmake -project

У папці з програмою з'явиться файл проекта qt4gl.pro. Відкриємо його у будь-якому текстовому редакторі і додамо у його кінець наступний рядок (ця обція необхідна для роботи з OpenGL):
QT += opengl

Після збереження виконуємо команду:
qmake qt4gl.pro

Після завершення виконання даної програми препроцесор Qt створить Makefile під конкретну платформу. Тепер вже можна запускати безпосередньо компіляцію програми:
make

Якщо код набрано без помилок, то по завершенню компіляції у цій же папці з'явиться файл qt4gl. Це і є готовий бінарний файл з програмою. Запустимо його:
./qt4gl

Результатом буде наступне:



Квадрат можна рухати стрілками на клавіатурі або просто клацнувши у будь-якому місці мишкою, клавішами Z та X можна змінювати розмір квадрату. Щоб закрити вікно можна обрати у меню File пункт Exit, або просто натиснути Esc. Зміна розмірів вікна призведе до автоматичного масштабування і квадрату. Тобто все працює так як і було задумано.

На завершення, хочу порекомендувати книжку C++ GUI Programming with Qt 4 By Jasmin Blanchette, Mark Summerfield. Дуже легко читається і у той же час все докладно пояснюється.

Ruby у математиці - частина друга (обчислення потрійного інтегралу)

Почнемо далі розбиратися з математичними алгоритмами і власне з чисельними методами вивчаючи по ходу мову програмування Ruby.

Обчислення потрійного інтегралу

Для написання програми обчислення потрійного інтегралу ми візьмемо за основу кодя який ми вже використовували для розрахунку подвійного інтегралу. У даному випадку нам потрібно буде додати ще одну координату. У даному випадку нам потрібно розбити об'єм обмежений поверхнями z1(x,y) та z2(x,y) зверху і знизу, а проекція цього об'єму на площину xy обмежується a≤x≤b та y1(x)≤y≤y2(x), де y1, y2 - неперервні функції на [a;b], на якомога менші кубики. Знайшовши значення функції f(x,y,z) і центрі кожного кубику і помноживши на його об'єм, а також просумівавши всі отримані значення ми й отримаємо значення потрійного інтегралу.

Тоді код програми матиме наступний вигляд:

# Обчислення потрійного інтегралу
include Math

puts "Обчислення потрійного інтегралу"
print "Введіть a="; a = gets.to_f
print "Введіть b="; b = gets.to_f
print "Введіть функцію y1(x): y="; y1 = gets.to_s
print "Введіть функцію y2(x): y="; y2 = gets.to_s
print "Введіть функцію поверхні z1(x,y): z="; z1 = gets.to_s
print "Введіть функцію поверхні z2(x,y): z="; z2 = gets.to_s
print "Введіть інтегральну функцію f(x,y,z)="; f = gets.to_s
print "Задайте крок step="; step = gets.to_f

i=a
sum,ty1,ty2,tz1,tz2,j,k,x,y,z=0

while i<=b do
x=i
ty1=eval(y1) ; ty2=eval(y2)
j=ty1
while j<=ty2 do
y=j
tz1=eval(z1) ; tz2=eval(z2)
k=tz1
while k<=tz2 do
x=(i+i+step)/2
y=(j+j+step)/2
z=(k+k+step)/2
sum+=eval(f)*step*step*step
k+=step
end
j+=step
end
i+=step
end

puts "==========================================="
puts "Значення інтегралу: #{sum}"


Спробуємо тепер щось проінтегрувати (вхідні данні візьмемо довільні):

bum@impress:~/Sources/Ruby/Math Problems$ ruby tint.rb
Обчислення потрійного інтегралу
Введіть a=0
Введіть b=1
Введіть функцію y1(x): y=x*x
Введіть функцію y2(x): y=sqrt(x)
Введіть функцію поверхні z1(x,y): z=x*y
Введіть функцію поверхні z2(x,y): z=x*2*y
Введіть інтегральну функцію f(x,y,z)=x*y*z
Задайте крок step=0.005
===========================================
Значення інтегралу: 0.0321406617957358


Отже, щось отримали. Щоб перевірити наскільки правильно ми знайшли значення, спробуємо знайти той же потрійний інтеграл у системі комп'ютерної алгебри Maxima (я користуюся фронтендом wxMaxima). Отже, наш потрійний інтеграл можна розписати наступним чином:

А тепер з допомогою Maxima знаходимо необхідне значення:



Отже, правильне значення даного інтегралу - 1/32=0,03125. Відносна похибка у порівнянні зі значенням отриманим нашою програмою становить 2,8%. Звісно ж задавши менший крок і пожертвувавши швидкістю ми могли б отримати більш точне значення.

неділя, 9 вересня 2007 р.

Ruby у математиці - частина перша (обчислення подвійного інтегралу)

З цієї статті я почну розповідати про практичну реалізацію ряду математичних алгоритмів. Я взявся за цю тему з тієї причини, що з цього навчального року я починаю викладати програмування на кафедрі прикладної математики, інформатики та математичного моделювання. З погляду на це, мені потрібно самому багато чого згадати, бо довгий час викладав трохи за іншим профілем, ну а по ходу можливо комусь ще буде корисно.

У якості мови програмування я обрав Ruby. Ця мова хоч і досить молода проте стрімко набирає популярності. Я не буду роз'яснювати як встановити інтерпретатор Ruby (в Ubuntu цн робиться через менеджер пакетів як і для будь-якої іншої програми), а також не буду проводити курс навчання основним конструкціям мови, все буде пояснюватися на конкретних прикладах.

Обчислення подвійного інтегралу

Почнемо з чисельного визначення значення подвійного інтегралу. З курсу математики відомо, що якщо є область S для якої справедливо:

де y1, y2 - неперервні функції на [a;b], то


тобто подвійний інтеграл може бути вируховано в результаті двох послідовно проведених інтегрувань.

Алгоритм обчислення подвійного інтегралу не складний. Якщо ми візьмемо область обмежену прямими x=a та x=b, і кривими y=y1(x) та y=y2(x), то розіб'ємо її на досить друбні квадрати по горизонталі та вертикалі, ми можемо вирахувати значення інтегралу. Для цього потрібно знайти значення функції y=f(x,y) у центральній точці кожного з цих квадратів помножене на площу квадрата і просумувати їх разом. На Ruby така програма матиме такий вигляд:

# Обчислення подвійного інтегралу
include Math

puts "Обчислення подвійного інтегралу"
print "Введіть a="; a = gets.to_f
print "Введіть b="; b = gets.to_f
print "Введіть функцію y1(x): y="; y1 = gets.to_s
print "Введіть функцію y2(x): y="; y2 = gets.to_s
print "Введіть інтегральну функцію f="; f = gets.to_s
print "Задайте крок step="; step = gets.to_f

i=a
sum,ty1,ty2,j,x,y=0

while i<=b do
x=i
ty1=eval(y1) ; ty2=eval(y2)
j=ty1
while j<=ty2 do
x=(i+i+step)/2
y=(j+j+step)/2
sum+=eval(f)*step*step
j+=step
end
i+=step
end

puts "==========================================="
puts "Значення інтегралу: #{sum}"


Якщо тепер запустити дану програму на виконання, то результат буде наступним (я тут придумав простий контрольний приклад):

bum@impress:~/Sources/Ruby/dint$ ruby dint.rb
Обчислення подвійного інтегралу
Введіть a=0
Введіть b=1
Введіть функцію y1(x): y=x*x
Введіть функцію y2(x): y=sqrt(x)
Введіть інтегральну функцію f=x*y
Задайте крок step=0.001
===========================================
Значення інтегралу: 0.0836083670627215


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


Як бачимо обчислене наближене значення є досить близьким до аналітичного, відносна похибка становить 0,3%, що цілком нормально.

Давайте тепер проаналізуємо деякі цікаві моменти по тексту програми. Ви вже мабуть помітили, що функції задаються у якості вхідних даних безпосередньо. Справа у тому, що Ruby дозволяє обчислювати вирази записані прямо у символьну змінну. Це досить зручно, бо робить програму більш універсальною. Для обчислення виразу служить стандартна функція eval(...).

Сам код який відповідає за підрахунок значення інтегралу є дуже простим:

while i<=b do
x=i
ty1=eval(y1) ; ty2=eval(y2) # обчислюємо значення функції y1 та y2 при x=i
j=ty1
while j<=ty2 do
x=(i+i+step)/2 # обчислюємо координати центра квадрата
y=(j+j+step)/2
sum+=eval(f)*step*step # плюсуємо значення функції f(x,y) помножене на площу квадрата
j+=step
end
i+=step
end


Наскільки точним буде наближене значення у порівнянні з аналітичним задається кроком інтегрування, у даному випадку значенням змінної step. Чим дане число менше тим точніший буде результат, але тим більше часу комп'ютер буде витрачати на його знаходження. Усі інші конструкції я думаю повинно бути зрозуміло і без пояснень.

Запуск ігор для SNES в Ubuntu

Ігрова консоль Super Nintendo Entertainment System (SNES) або просто Super Nintendo повинна бути знайома всім чиє дитинство припало на 90-ті роки. До цієї 16-бітної приставки було розроблено тисячі ігор, серед яких такі шедеври як Donkey Kong Country, Killer Instinct, Legend Of Zelda та безперечний хіт Super Mario 2. Власне всі кому подобаються старі ігри можуть без проблем грати в них і в Ubuntu з допомогою емуляторів. Я опишу емулятор ZSNES, який легко встановлюється через репозиторії Ubuntu.
sudo apt-get install zsnes

Для запуску використовується команда zsnes, ну а роми з іграми у форматі .smc є в інтернеті повсюди. Емулятор підтримує всі функції SNES, може працювати як з джойстиками так і з клавіатурами і навіть підтримує мультиплеєр через мережу. На скріншотах нижче показано знаменитий Super Mario.





Дуже багато ігор для SNES з докладними анотаціями можна завантажити за цією адресою:
http://www.emu-land.net/consoles/snes/roms/top

Встановлення VMWare Server

VMWare Server - це програма, що дозволяє створювати віртуальні машини у кожній з яких працює власна операційна система. Тобто наприклад у вас основна система - Ubuntu, а у окремому вікні працює Windows, а ще в іншому можна наприклад робити якісь звірячі експерименти з розміткою дисків. У кожної з віртуальних машин є власний файл-образ її жорсткого диску, таким чином будь-які маніпуляції у віртуальній машині ніяк не скажуться на вашій основній системі. Можна експериментувати з невідомими системами, розбиратися з вірусами, та що завгодно робити, особливо якщо жалієте власний комп'ютер.

Офіційний сайт: http://www.vmware.com/

Особливості встановлення:
Система -> Адміністрування -> Software Sources -> Third-Party Software
перевіряємо чи підключено репозиторій http://archive.canonical.com/ubuntu feisty-commercial main, якщо ні, то обираємо додати і вводимо рядок:
deb http://archive.canonical.com/ubuntu feisty-commercial main

далі набираємо команди

sudo apt-get update
sudo apt-get install vmware-server vmware-tools-kernel-modules


коли спитає серійний номер вводимо: 901W5-Y4G2F-2F2F0-4UKVR (а можете отримати власний пройшовши безплатну реєстрацію на офіційному сайті)



На скріншоті видно що у окремому вікні працює віртуальна машина з Windows 2000 SP4 на якій завантажено AutoCAD 2005. При цьому швидкість роботи досить висока, жодного дискомфорту немає.