понедельник, 12 октября 2015 г.

Новая жизнь XMMS или как сделать portable приложение в Linux


Как-то на днях проапгрейдел свой старый компьютер еще с процессором Celeron 600 MHz на Pentium 2.26 GHz, заменил материнскую плату, а вот жесткий диск остался старым. Как оказалось на нем установлена старенькая Ubuntu 8.04.4. Ubuntu загрузилась, а вот иксы не поднялись, так как на материнской плате используется другая видео карта. После измнения конфигурации иксов, XFCE запустилась без проблем. Полазев по Ubuntu, запустил несколько стареньких версий программ, я наткнулся на аудио плеер XMMS 1.2.11. В 2008 году я был фанатом XMMS, занимался руссификацией его интерфейса, настройкой конвертирования тегов, чтобы песни с русскими названиями отображались нормально. Послушав в нем музыку и понастольгировав, я задался вопросом, а можно ли сделать этот плеер переносимым, чтобы потом можно была запустить его в моей Ubuntu 15.04. Ну что, посмотрим что ответит Google на этот вопрос.

Таким образам я нашел проект с названием CDE. Название CDE следует из первых букв трех слов Code (Код), Data (Данные), Environment (Окружение) — программа автоматически упаковывает код, данные и окружение необходимое для развертывания и запуска ваших Linux программ на других компьютерах без какой либо установки или настройки. CDE это самый простой путь, чтобы полностью устранить «Ад зависимостей». Описание программы взято с официального сайта.

Внимание! Дальше по тексту я работаю в Ubuntu 8.04.4, если не указано точно, что используется Ubuntu 15.04.

Для начала нам необходимо скачать программу CDЕ с официального сайта. Сама программа CDE представляет из себя один единственный бинарный файл, который вам необходимо сохранить в ваш домашний каталог, для примера, по следующему пути /home/[текущий пользователь]/opt/cde_app/. Файл который мы скачали имеет имя cde_2011-08-15_32bit для 32-х разрядного дистрибутива Linux, если у вас установлен 64-х разрядный Linux, то вам необходимо скачать файл с именем cde_2011-08-15_64bit. Переименуйте файл cde_2011-08-15_32bit в файл с именем cde. Установка завершена. Переходим к созданию портативной версии аудио плеера XMMS.

Откройте терминал и выполните команду для перехода в рабочий каталог, куда мы сохранили бинарный файл программы cde.

cd /home/[текущий пользователь]/opt/cde_app/

Сделаем файл cde исполняемым, выполним следующую команду:

chmod u+x ./cde

Запустим файл программы cde и передадим ему в качестве параметра имя нашего аудио плеера xmms.

./cde xmms

После этой команды вы увидите, что XMMS запустился. Закройте его. Если после этого, при помощи команды ls посмотреть содержимое каталога cde_app, мы увидим, что программа CDE создала подкаталог cde-package/. Заглянув в этот каталог, вы увидите, что он содержит все зависимые файлы необходимые, чтобы запустить программу XMMS.

Теперь нам необходимо запаковать каталог cde-package в архив, чтобы у нас была возможность перенести его на другой компьютер.

tar -cvf cde-xmms.tar cde-package/
gzip cde-xmms.tar

Теперь нам необходимо скопировать архив cde-xmms.tar.gz на flash-носитель и перенести его на другой компьютер с установленной на нем Ubuntu 15.04. Там его распаковать и запустить xmms при помощи специального скрипта xmms.cde. Для этого выполняем следующие команды в терминале.

tar -zxvf cde-xmms.tar.gz
cde-package/xmms.cde

После этого мы увидим запущенный аудио плеер XMMS на другом компьютере под управлением Ubuntu 15.04 (Смотрите рисунок 1.). Поздравляю, мы создали портативную версию Linux приложения и запустили его на другом дистрибутиве Linux без какой либо его установки и настройки. 

 
Рисунок 1. Слушаем музыку в старом добром XMMS в Ubuntu 15.04 


 Рисунок 2. XMMS в полном развороте

суббота, 19 сентября 2015 г.

Прикручиваем библиотеку SDL 1.2.15 к Code::Blocks 13.12 в Ubuntu 15.04 Linux


Для создания нового SDL проекта будет использована среда программирования Code::Blocks 13.12. Но, в первую очередь данную IDE необходимо установить. В Ubuntu 15.04 установить Code::Blocks можно из центра приложений Ubuntu (Ubuntu Software Center). Запустим центр приложений Ubuntu (Смотрите рисунок 1, обозначение 1). Для поиска приложения воспользуйтесь полем поиска приложений (Смотрите рисунок 1, обозначение 2).

 
Рисунок 1. Центр приложений Ubuntu

Введите в поле поиска название приложения “code blocks”, результатом поиска будет необходимая нам среда Code::Blocks (Смотрите рисунок 2).

Рисунок 2. Поиск в центре приложений Ubuntu


Установите Code::Blocks IDE, для этого выберете приложение и нажмите кнопку Install (Установить).
Запустите только что установленное приложение Code::Blocks IDE из главного меню Ubuntu (Смотрите рисунок 3).

 
Рисунок 3. Запуск Code::Blocks IDE
 
Для вызова главного меню Ubuntu нажмите на значак Ubuntu как показано на рисунке 3, обозначино цифрой 1. В поле поиска установленных приложений наберите “code blocks” как показано на рисунке 3, обозначено цифрой 2. Запустите найденое приложение Code::Blocks IDE как показано на рисунке 3, обозначено цифрой 3.
Прежде чем мы продолжим, нам необходимо установить SDL. В Ubuntu это делается легко, одной командой в терминале. Запустим терминал и выполним команду:

sudo apt-get install libsdl1.2debian libsdl1.2-dev

Так же нам необходимо подготовить окружение для сборки нашего проекта из исходного кода. Выполните команду в терминале:
sudo apt-get install build-essential

Запустите Code::Blocks IDE.

Рисунок 4. Главное окно Code::Blocks IDE

Code::Block открыт (Смотрите рисунок 4), выбираем пункт меню File (Файл) > New (Новый) > Project... (Проект...). В окне выбора нового проекта, выберите проект с названием Empty project (Пустой проект), после нажать кнопку Go (Вперед). После нам откроется мастер настройки пустого проекта. На первом шаге мастера нажимаем кнопку Next. На втором шаге зададим название проекта (Project title), например sdl_p1, зададим путь (Folder to create project in) по которому будет хранится наш проект, например ~/projects/sdl (~ - Домашний каталог текущего пользователя), поля название файла проекта (Project filename) и название полного пути проекта (Resulting filename) оставим по умолчанию и нажмем кнопку Next. На третьем шаге мастера пустого проекта нас попросят выбрать название компилятора установленного в вашей операционной системе, и имена папок, где будет хранится отладочная информация и конечный исполняемый файл нашей программы, так что все оставляем по умолчанию и нажимаем кнопку Finish. Все пустой проект создан, переходим к добавлению исходного файла, где мы будем писать наш исходный код. Для создания исходного файла выберите пункт меню File (Файл) > New (Новый) > File... (Файл...). В окне выбора типа нового файла необходимо выбрать Empty file (Пустой файл), после нажать кнопку Go (Вперед). Далее в открывшемся окне мастера настройки пустого файла, на первом шаге, нажать кнопку Next. На втором шаге задать имя создоваемого исходного файла с указанием его полного пути хранения. Исходный файл назавем main.c, а путь хранения исходного файла будет путь до папки, где хронится наш проект, это ~/projects/sdl/sdl_p1/main.c. На этом же шаге нас попросят указать цели сборки проетка, выберим обе цели сборки проекта Debug - проект сообирается с отладочной информацией и Release - проект собирается без отладочной информации. После нажмите кнопку Finish. Далее в опциях сборки проекта нам необходимо прописать пути до заголовочных файлов и статически линкуемых библиотек SDL. Например у меня заголовочные файлы хронятся на /usr/include, а статически линкуемые библиотеки /usr/lib/x86_64-linux-gnu. Теперь выбираем пункт меню Project > Build options..., в открывшемся окне мы увидим название нашего проекта и две цели сборки проекта Debug и Realese. Для каждой из целей сборки проекта мы должны указать все необходимые параметры для успешной сборки проекта, но, так как мы начинающие разработчики мы будем использовать только одну цель сборки проекта Debug. Debug - режим сборки проекта при котором исполняемый файл проекта комплектуется отладочной информацией, который позволяет отлаживать проект во время выполнения, и отслеживать значения переменных и ход работы программы. Значит выбераем режим проекта Debug, для этого режима в разделе Linker Settings (Настроек Ликовщика), для группы Link libraries указать имена файлов статически линкуемых библиотек SDL. Для этого нажмите кнопку Add (Добавить) и выберите статические библиотеки с именами файлов libSDLmain.a и libSDL.a. На вопрос (Keep this as a relative path?) использовать относительный путь или нет, ответьте нет (No). То есть, путь к статической библиотеке будет абсалютный и примет следующий вид /usr/lib/x86_64-linux-gnu/libSDLmain.a и /usr/lib/x86_64-linux-gnu/libSDL.a соответствено (Смотрите рисунок 5).

Рисунок 5 . Настройка опций компиляции и линковки


Для группы Other linker options (Другие опции линковщика) необходимо ввести следующие опции линковщика:

`sdl-config --libs`

Таким образом мы линковщику сообщили, что при линковке необходимо, при получание исполняего фыйла, присоеденить статически игровой библиотеки SDL (Смотрите рисунок 5).
Теперь перейдите в раздел Search directories (Директории поиска) и в подгруппе Compiler добавьте путь до заголовочных (подключаемых) файлов библиотеки SDL, данный путь выглядит так: /usr/include. Далее в подгруппе Linker добавьте путь до статически линкуемых библиютек, данный путь выглядит так: /usr/lib/x86_64-linux-gnu/.
Ну вот и все, с настройками закончили, теперь в наш проект необходимо добавить минимальный код для создания окна с использованием библиотеки SDL.

Данный код выглядит так:
#include "SDL/SDL.h"
int main( int argc, char* args[] ) {
    SDL_Surface* display = NULL;
    SDL_Init( SDL_INIT_EVERYTHING );
    display = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    int quit = 0;
    SDL_Event event;
    while( !quit )
    {
        if( SDL_PollEvent( &event ) )
        {
            if( event.type == SDL_KEYDOWN ) {
                switch( event.key.keysym.sym ) {
                    case SDLK_ESCAPE: quit = 1; break;
                    default : break;
                }
            }
            else if( event.type == SDL_QUIT )
            {
                quit = 1;
            }
        }
        SDL_Flip(display);
    }
    return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1

воскресенье, 26 июля 2015 г.

Lazarus World. Порт приложения Particles "Частицы"

Очередная попытка порта приложения Particles "Частицы", которое было портировано с аналогичного приложения Particles "Частицы" написаного на языке программирование Delphi и с использованием библиотеки DelphiX (DirectX). Оригинальный код приложения, на основе которого сделан порт, взят сайта Delphi-Graphics. Код портирован на Lazarus с использованием OpenGL для отрисовки графики. Цель портирования - заставить работать приложение в операционной системе Ubuntu Linux. Код порта оставляю без комментарий, т. к. портирование проводилось без детального разбора работы алгоритма оригинального приложения и осуществлялся банальный подбор функций OpenGL и их параметров. На рисунке 1 предсталена работа портированного приложения в Ubuntu Linux.

Рисунок 1. Приложение «Частицы»

program lazarus_p2;

uses gl, glut, glu;

var
  ScreenWidth, ScreenHeight: Integer;
  SineMove : array[0..255] of integer; { Sine Table for Movement }
  CosineMove : array[0..255] of integer; { CoSine Table for Movement }
  SineTable : array[0..449] of integer; { Sine Table. 449 = 359 + 180 }
  CenterX, CenterY : Integer;
  LastUpdate: Integer;
const
  AppWidth = 640;
  AppHeight = 480;

procedure CalculateTables;
var
  wCount : Word;
begin
  { Precalculted Values for movement }

  for wCount := 0 to 255 do
  begin
    SineMove[wCount] := round( sin( pi*wCount/128 ) * 45 );
    CosineMove[wCount] := round( cos( pi*wCount/128 ) * 60 );
  end;

  { Precalculated Sine table. Only One table because cos(i) = sin(i + 90) }

  for wCount := 0 to 449 do
  begin
    SineTable[wCount] := round( sin( pi*wCount / 180 ) * 128);
  end;
end;



procedure PlotPoint(XCenter, YCenter, Radius, Angle: Word);
var
  X, Y : Word;

begin
  X := ( Radius * SineTable[90 + Angle]);

  {$ASMMODE intel}
  asm
     sar x, 7
  end;
  X := CenterX + XCenter + X;
  Y := ( Radius * SineTable[Angle] );
  asm
     sar y, 7
  end;

  Y := CenterY + YCenter + Y;
  if (X < AppWidth ) and ( Y < AppHeight ) then
  begin
  glBegin(GL_POINTS);
      glVertex2i(X, Y);
  glEnd;
  end;
end;



procedure DrawGLScene; cdecl;
const
  x : Word = 0;
  y : Word = 0;

  IncAngle = 12;

  XMove = 7;
  YMove = 8;

var
  CountAngle : Word;
  CountLong : Word;
  IncLong :Word;

begin
  glClear(GL_COLOR_BUFFER_BIT);

  IncLong := 2;
  CountLong := 20;

  { Draw Circle }

  repeat
    CountAngle := 0;
    repeat
      PlotPoint(CosineMove[( x + ( 200 - CountLong )) mod 255],
      SineMove[( y + ( 200 - CountLong )) mod 255], CountLong, CountAngle);
      inc(CountAngle, IncAngle);
    until CountAngle >= 360;

    { Another Circle, eventually another color }

    inc(CountLong, IncLong);

    if ( CountLong mod 3 ) = 0 then
    begin
      inc(IncLong);
    end;
  until CountLong >= 270;

  { move x and y co-ordinates}

  x := XMove + x mod 255;
  y := YMove + y mod 255;

  glutSwapBuffers;
end;

procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
  glViewport(0, 0, Width, Height);
end;

procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
  if Key = 27 then
    Halt(0);
end;

procedure InitializeGL;
begin
  glEnable( GL_POINT_SMOOTH );
  glColor3f(0, 0.3, 1);
  glPointSize(2);
  gluOrtho2D(0.0, 640.0, 0.0, 480.0);
  CenterX := AppWidth div 2;
  CenterY := AppHeight div 2;
  CalculateTables;
end;

begin
glutInit(@argc, argv);
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);
glutInitWindowSize(AppWidth, AppHeight);
ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);

glutInitWindowPosition((ScreenWidth - AppWidth) div 2,(ScreenHeight - AppHeight) div 2);
glutCreateWindow('ogl_p1');

InitializeGL;

glutDisplayFunc(@DrawGLScene);
glutIdleFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);

glutMainLoop;
end.


syntax highlighted by Code2HTML, v. 0.9.1
 

среда, 8 июля 2015 г.

Lazarus World. Порт приложения Stars «Звёзды»



Представляю порт приложения Stars «Звёзды», которое было портировано с аналогичного приложения Stars «Звёзды» написаного на языке программирование Delphi и с использованием интерфейса GDI Windows. Оригинальный код приложения, на основе которого сделан порт, взят с сайта Delphi-Graphics. Код портирован на Lazarus с использованием OpenGL для отрисовки графики. Цель портирования - заставить работать приложение в операционной системе Ubuntu Linux. Код порта оставляю без комментарий, т. к. портирование проводилось без детального разбора работы алгоритма оригинального приложения и осуществлялся банальный подбор функций OpenGL и их параметров. На рисунке 1 предсталена работа портированного приложения в Ubuntu Linux. Так же рекомендую поиграться с параметрами OpenGL функций задания цвета звёзд и задания формы звёзд.


Рисунок 1. Приложение «Звезды»

program stars;

uses gl, glut, glu, SysUtils;

var
  Cmd: array of PChar;
  CmdCount: Integer;
  ScreenWidth, ScreenHeight: Integer;

const
  AppWidth = 800;
  AppHeight = 600;
  StarCount = 1000;

Type
  TStar = record
    x,y,z: integer;
    vx, vy, vc: integer;
  end;

var
  Star:array[0..StarCount - 1] of TStar;
  xcenter, ycenter: integer;
  starsize: integer;
  OldTick: GLuint;
  FramesCount: GLuint;
  StartTick: GLuint;


procedure InitStars;
var
s: integer;
begin
     for s:=0 to StarCount - 1 do
     begin
       With Star[s] do
       begin
         vx := -1;
         vy := -1;
         vc := 0;
         x := (Random(2 * xcenter) - xcenter) shl 7;
         y := (Random(2 * ycenter) - ycenter) shl 7;
         z := s + 1;
       end;
     end;
end;

procedure IdleFunc(); cdecl;
begin
     Sleep(1);

     OldTick := GlutGet(GLUT_ELAPSED_TIME);
     glutPostRedisplay;

end;

procedure DrawGLScene; cdecl;
var
   Title: array[0..80] of Char;
   s: integer;
begin
     glClear(GL_COLOR_BUFFER_BIT);

     for s := 0 to StarCount - 1 do
     begin
     with Star[s] do begin

         glColor3f(0.0, 0.0, 0.0);

         glBegin(GL_POINTS);
         glVertex2f(vx, vy);
         glEnd;

         vc := starsize div z;
         vx := x div z + xcenter - vc;
         vy := y div z + ycenter - vc;

         glPointSize(vc);

         glColor3f(1.0, 1.0, 1.0);

         glBegin(GL_POINTS);
         glVertex2f(vx, vy);
         glEnd;

         dec(Star[s].z,3);

         if z<1 then begin
            z:=StarCount;
            x:=(Random(2*xCenter)-xCenter) shl 7;
            y:=(Random(2*yCenter)-yCenter) shl 7;
         end;
     end;

     end;

     glutSwapBuffers;

     FramesCount := FramesCount + 1;
     if (GlutGet(GLUT_ELAPSED_TIME) <> StartTick) then
     begin
          Title := FloatToStrF(FramesCount*1000  
          div (GlutGet(GLUT_ELAPSED_TIME) - StartTick), ffFixed, 8, 0);
          Title := 'FPS: ' + Title;
          glutSetWindowTitle(Title);
     end;
end;

procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
  glViewport(0, 0, Width, Height);
end;

procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
  if Key = 27 then
    Halt(0);
end;

procedure InitializeGL;
begin
     glClearColor(0.0, 0.0, 0.0, 0.0);
     gluOrtho2D(0, AppWidth - 1, 0, AppHeight - 1);
end;

procedure InitApp;
begin
     OldTick := GlutGet(GLUT_ELAPSED_TIME);
     StartTick := OldTick;
     FramesCount := 0;

     xcenter := AppWidth div 2;
     ycenter := AppHeight div 2;
     starsize:=xcenter+ycenter;
end;

begin

CmdCount := 1;
SetLength(Cmd, CmdCount);
Cmd[CmdCount-1] := PChar(ParamStr(CmdCount-1));

glutInit(@CmdCount, @Cmd);

glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB);

glutInitWindowSize(AppWidth, AppHeight);

ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);

glutInitWindowPosition((ScreenWidth - AppWidth) div 2,
   (ScreenHeight - AppHeight) div 2);

glutCreateWindow('stars');

InitApp;
InitStars;
InitializeGL;

glutDisplayFunc(@DrawGLScene);
glutIdleFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);

glutMainLoop;

end.


syntax highlighted by Code2HTML, v. 0.9.1