середа, 30 березня 2016 р.

C++ концепція класів та об’єктів

Роблю виклад книги по програмуванню: Siddhartha Rao Sams Teach Yourself C++ in One Hour a Day (Seventh Edition).

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

Оголосимо взірець класу, котрий моделює людину:

class Human
{
    // Атрибути даних:
    string Name;
    string DateOfBirth;
    string PlaceOfBirth;
    string Gender;

    // Методи:
    void Talk(string TextToTalk);
    void IntroduceSelf();
    void Walk();
};


Очевидно, що метод IntroduceSelf() використовує метод void Talk() і деякі з атрибутів даних, котрі згруповані в конструкції class Human.

Всі атрибути даних та методи є членами класу Human.

Одне лише оголошення класу не матиме впливу на виконання програми.
Реальний предмет класу, який можна використовувати для виконання у ході програми - це об’єкт.
Для використання засобів класу створюється екземпляр об'єкта цього класу, що дозволяє отримати доступ до його методів та атрибутів.
Наприклад, оголошуємо об’єкт Tom класу Human, як локальну змінну:

Human Tom; // екземпляр класу Human

Також можемо зарезервувати місце для екземпляру класу Human у динамічній пам’яті, використавши оператор new:

Human* pAnotherHuman = new Human(); // розподіл динамічної пам’яті для об’єкта класу Human
delete pAnotherHuman; // звільнення пам’яті, зайнятої об’єктом класу Human

Об’єкт Tom має такий атрибут, як DateOfBirth(), до якого можна звернутись, використавши оператор точки (.) (dot operator):

Tom.DateOfBirth = "1970";

Зауважимо, що даний атрибут DateOfBirth буде виконуваним тільки тоді, коли створено об’єкт. Оператор точки (.) дозволяє нам звертатись не тільки до атрибутів класу, а також і до його методів, таких, як IntroduceSelf():

Tom.IntroduceSelf(); 

Якщо у вас є вказівник pTom на екземпляр класу Human, то для доступу до його членів можна використати оператор вказівника (->), або оператор непрямого доступу (*) для посилання на об’єкт із наступним оператором точки:

Human* pTom = new Human();
(*pTom).IntroduceSelf(); 

Якщо об’єкт було створено у динамічній пам’яті із використанням оператора new , або якщо у вас є вказівник на готовий об’єкт, то для доступу до його атрибутів і функцій можна використати оператор вказівника (->):

Human* pTom = new Human();
pTom->DateOfBirth = "1970";
pTom->IntroduceSelf();
delete pTom; 

//Альтернативно при наявності вказівника:
Human Tom;
Human *pTom = &Tom; // Присвоїти адресу, використавши оператор посилання &
pTom->DateOfBirth = "1970"; // еквівалентно Tom.DateOfBirth = "1970";
pTom->IntroduceSelf();  // еквівалентно Tom.IntroduceSelf();
 
Нижче подаю готову для компіляції форму класу Human із ключовими словами private та public:

Listing 9.1 Готовий для компіляції клас Human
------------------------------------------------------------

#include
#include
using namespace std;

class Human //Лінія 4.
{
private:
   string Name;
   int Age;

public:
   void SetName (string HumansName)
   {
      Name = HumansName;
   }

   void SetAge(int HumansAge)
   {
      Age = HumansAge;
   }

   void IntroduceSelf() // Лінія 21.
   {
      cout << "I am " << Name << " and am ";
     cout << Age << " years old" << endl;
   }
}; // Лінія 26.
 
int main()
{
   // Constructing an object of class Human with attribute Name as "Adam"
   Human FirstMan; // Лінія 31.
   FirstMan.SetName("Adam");
   FirstMan.SetAge(30);

   // Constructing an object of class Human with attribute Name as "Eve"
   Human FirstWoman; // Лінія 36.
   FirstWoman.SetName("Eve");
   FirstWoman.SetAge (28);
   
   FirstMan.IntroduceSelf();
   FirstWoman.IntroduceSelf(); //Лінія 41.
}

------------------------------------------------------------


Результат:

I am Adam and am 30 years old
I am Eve and am 28 years old


Аналіз

Лінії 4-26 демонструють створення дуже простого класу С++.
Клас має дві закриті (private) змінні: одна Name типу string у лінії 7, а інша Age типу int у лінії 8, а також кілька відкритих (public) функцій (їх називають методами): SetName(), SetAge() та IntroduceSelf() у лініях 11,16 та 21, котрі використовують закриті змінні.
Лінії 31 та 36 функції int main() створюють два об’єкти класу Human. Наступні лінії встановлюють значення змінних-членів об’єктів FirstMan та FirstWoman. використовуючи методи SetName() та SetAge(), котрі є методами доступу (accesor metod). Зверніть увагу, що в лініях 40 та 41 виклик метода цих двох об’єктів дозволив створити дві різних лінії у виведенні, котрі використовують змінні-члени (member variable), значення котрих були встановлені вище.

неділя, 27 березня 2016 р.

Пакетне зменшення розмірів зображень при допомозі ImageMagick

Вам потрібно зменшити розміри кількох сотень зображень?
То не є проблема, якщо ми використаємо ImageMagick

Для початку, ми відкриємо Термінал та створимо теку our_images, у яку завантажимо ті зображення:
mkdir our_images

Потім виконаємо команду, схожу на ось цю:
cd our_images
for i in `ls`; do convert -resize 37.5% -quality 65 $i new_name_images_$i; done


Пояснення:
1. Я встановив значення зміни розмірів зображень -resize 37.5%, а ви його змініть на таке, яке вам потрібне.
2. я встановив значення якості -quality 65. Ви його теж можете змінити. 
3. new_name_images - це нова назва змінених зображень. 

вівторок, 5 січня 2016 р.

Коли потрібен RAID0

Нижче подаю результати порівняльного тестування роботи комп’ютера на RAID0 масиві із двох дисків Seagate Barracuda 7200.14 2TB 7200rpm 64MB ST2000DM001 3.5 SATAIII та на старому HDD Seagate Barracuda LP ST32000542AS 2TB 5900 RPM 32MB Cache SATA 3.0Gb/s.

Тестування проводилось із використанням програми THELI 

понеділок, 15 червня 2015 р.

Налаштування IDE Eclipse для роботи із OpenCV-3.0.0

Ось мій переказ статті Using OpenCV with Eclipse (plugin CDT)

Для написання проектів для OpenCV в Eclipse, нам потрібно вказати у налаштуваннях заголовки та бібліотеки.
Запускаємо Eclipse, йдемо в Project–>Properties->C/C++ Build->Settings->Tool Settings

У таблиці Tool Settings йдемо GCC C++ Compiler-> Includes де нам потрібно вказати шлях до встановленої opencv

Щоб взнати той шлях, виконуємо у Терміналі команду:
pkg-config --cflags opencv
Результат виконання команди:
-I/usr/local/include/opencv -I/usr/local/include

Пишемо /usr/local/include/opencv у вікні Include paths(-l)

Далі йдемо у GCC C++ Linker щоб заповнити два вікна налаштувань.
Відкриваємо Термінал та виконуємо команду:
pkg-config --libs opencv 
Результат виконання команди:
-L/usr/local/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_viz -lopencv_core -lopencv_hal 

У верхнє вікно вписуємо:
opencv_shape
opencv_stitching
opencv_objdetect
opencv_superres
opencv_videostab
opencv_calib3d
opencv_features2d
opencv_highgui
opencv_videoio
opencv_imgcodecs
opencv_video
opencv_photo
opencv_ml
opencv_imgproc
opencv_flann
opencv_viz
opencv_core
opencv_hal

а в нижнє вікно вписуємо:
/usr/local/lib
після чого натискаємо кнопку ОК.
Тепер Eclipse готове для написання проектів із використанням OpenCV

вівторок, 5 травня 2015 р.

Встановлення IDE Eclipse для C++

Оскільки Eclipse потребує платформу Java, то спершу встановимо її через Термінал:
sudo add-apt-repository ppa:webupd8team/java 
sudo apt-get update
sudo apt-get install oracle-java7-installer 

Потім нам потрібно перевірити/встановити компілятори:
sudo apt-get install gcc g++ 

Тепер встановлюємо власне Eclipse та компілятор C++ для нього:
sudo apt-get install eclipse
sudo apt-get install eclipse-cdt

Тепер запускаємо Eclipse та налаштовуємо його:
Window -> Preferences -> C/C++ -> New CDT Project Wizard -> Makefile Project
Відкриється нове вікно налаштувань, у котрому ставимо галочку біля Elf Parser (для ОС сімейства Лінукс!):
Для проби, відкриємо новий проект HelloWorld.
Щоб побудувати його, натискаємо Ctrl+B, після чого запускаємо виконання кнопкою Run

Увага! Повідомлення "Launch failed. Binary not found" може свідчити про те, що ви забули побудувати проект.

четвер, 23 квітня 2015 р.

Створення оптимізованої програмної бібліотеки ATLAS на ОС Ubuntu 14.10 (64 bit)

ATLAS (Automatically Tuned Linear Algebra Software) -  це програмна бібліотека для лінійної алгебри.
Згідно статті у вікіпедії, ATLAS використовується у наступних добре відомих програмах математичних розрахунків:  MATLAB, Mathematica, Scilab, Sage та GNU Octave.
Найкращий спосіб побудувати бібліотеку ATLAS, налаштовану для конкретного процесора, це слідувати інструкції README.Debian, котру ви можете знайти у теці: /usr/share/doc/libatlas3-base

Спочатку нам потрібно вимкнути режим дроселювання частоти всіх ядер/потоків процесора. Для цього відкриваємо Термінал та виконуємо  команди (нижче подаю команди для процесора Intel® Core™ i7-3930K
на 6 ядер/12 потоків):
sudo apt-get install cpufrequtils

sudo cpufreq-set -g performance -c 0
sudo cpufreq-set -g performance -c 1
sudo cpufreq-set -g performance -c 2
sudo cpufreq-set -g performance -c 3
sudo cpufreq-set -g performance -c 4
sudo cpufreq-set -g performance -c 5
sudo cpufreq-set -g performance -c 6
sudo cpufreq-set -g performance -c 7
sudo cpufreq-set -g performance -c 8
sudo cpufreq-set -g performance -c 9
sudo cpufreq-set -g performance -c 10
sudo cpufreq-set -g performance -c 11


Після цього, ми можемо почати створювати власне оптимізовану програмну бібліотеку ATLAS.

Виконуємо у Терміналі наступні команди:
apt-get source atlas
sudo apt-get build-dep atlas
sudo apt-get install devscripts 

Опис команд: 
1. команда apt-get source atlas завантажує у домашню теку програмні коди
ATLAS: наразі то версія atlas-3.10.2
2. команда sudo apt-get build-dep atlas пише сама за себе: 
Зчитування переліків пакунків... Виконано
Побудова дерева залежностей                       
Зчитування інформації про стан... Виконано

3. команда sudo apt-get install devscripts встановлює devscripts - "Сценарії, що спрощують життя супроводжувачам пакунків Debian".

Тепер можемо почати збирати оптимізовані пакунки. Для цього переходимо у теку із завантаженими кодами та виконуємо команду:
cd atlas-3.10.2
fakeroot debian/rules custom

...але зазнаємо невдачу:
Тут у нас є два шляхи:
1. клянемо Linux :)
2. латаємо коди та повторно виконуємо команду fakeroot debian/rules custom 

Якщо вас зацікавив другий шлях, то відкриваємо ще один Термінал, щоб залатати коди наступними командами (див. сторінку, звідки я взяв ту латку):
cd atlas-3.10.2/CONFIG/src

patch -p0 config.c << EOF
@@ -1026,7 +1026,7 @@
    *verb = 0;
    *NoCygwin = 0;
    *NoF77 = 0;
-   *ThrChk = 1;
+   *ThrChk = 0;
    *nthreads = -1;
    *tids = NULL;
    *omp = *AntThr = 0;
EOF
  
Правка кодів завершилась успішно:
Повертаємось у перший Термінал, у котрому ми вже пробували зібрати оптимізовану бібліотеку, та повторно виконуємо команду:
fakeroot debian/rules custom 

Операції команди закінчуються десь через 5 хвилин (або більше для слабших процесорів!) створенням файлів, серед яких шість deb:
Тепер ми можемо встановити оптимізований
ATLAS, але попередньо видалимо її вже встановлені файли.
 

неділя, 19 квітня 2015 р.

Компіляція та встановлення SCAMP на Ubuntu 14.10

SCAMP використовує  каталоги, побудовані SExtractor, для повністю автоматичного обчислення астрометрії та фотометрії будь-якої довільної послідовності астрономічних FITS зображень.

Оскільки SCAMP потребує cdsclient, по спочатку завантажимо та встановимо його. Відкриваємо Термінал та виконуємо команди::
wget http://cdsarc.u-strasbg.fr/ftp/pub/sw/cdsclient.tar.gz
tar xvzf cdsclient.tar.gz
cd cdsclient*
./configure
make
sudo make install


Увага! Ймовірно, що вам також буде неохідно встановити залежності:
sudo apt-get install gawk
sudo apt-get install libplplot-dev libatlas-dev libatlas3-base libatlas-base-dev
sudo apt-get install libfftw3-dev 
sudo apt-get install plplot12-driver-gd

Тепер завантажимо архів кодів програми, використавши посилання на ось цій сторінці
Наразі найсвіжішою є субверсія trunk.r328, котру ми й завантажимо та розпакуємо у домашню директорію.

Відкриваємо Термінал та виконуємо наступні команди:
cd trunk.r328
./configure --enable-threads=12 --with-cdsclient-dir=/usr/local/bin --with-atlas-libdir=/usr/lib/ --with-atlas-incdir=/usr/include/atlas --enable-plplot --with-plplot-libdir=/usr/lib/plplot5.10.0 --with-plplot-incdir=/usr/include/plplot
make 

sudo make install