воскресенье, 15 апреля 2012 г.

Oracle + NetBeans


Христос воскресе!!
В этоn замечательный день я хочу уменьшить ваши мучения при подключении Oracle DB к NetBeans. Предположу, что вы уже установили себе Oracle (можно XE, как у меня). И теперь вам не терпится поработать с базами данных и написать программу, которая её использует. Может быть вы даже поставили себе JDeveloper, но лично меня он пока не впечатлил. Точнее нет. Он очень крут. Но система с ним тормозит- возьми да вешайся и это на i5 проце. NetBeans тоже можно использовать на СУБД. Пусть он не настолько кликабелен  как Jdeveloper , но ничего, подучите PL/SQL. Ну что, вытаскиваем руки из задницы, ставим чуть ниже шеи и кладём на клавиатуру.




Из первоначальных требований:
   Установленная система- >=1шт.
   Установленный OracleDB(XE) = 1шт.
   Установленный NetBeans >= 1шт.
   Установленный SunJDK = 1шт.
   Мозг - 1 шт. Желательно 2 полушария.
   Руки - можно 1 но на правильном месте ,и хоть как-то связанную с мозгом.



Ну что, в атаку. Я очень ленив, и описывать то, что описано мне не хочется. Как в NetBeans подключить BD описано здесь .Если кратко, то мы вызываем окно "службы"(Ctrl+F5). В нём кликаем правой клавишей по "Базы данных" и выбираем "новое соединение". Выбираем драйвер Oracle Thin и Нет Бианс говорит, что драйвера нет и любезно перенаправляет нас на страницу его скачивания . Загрузив драйвер ojdbc6.jar ,мы выбираем его кнопочкой «добавить» в диалоговом окне NetBeans.




Потом пред нами предстоит ввод Адреса вашей BD (скорее всего localhost) Но нет, если установленная oracle на другой машине. Так же имя пользователя и пароль. Так как аккаунт hr/hr с недавних пор по умолчанию заблокирован, мы введём system/{пароль, который вы указали при установке oracle} . Нажимаем "проверить соединение" и тут нас «Фейсом об тейбл»!ORA-12705: Cannot access NLS data files or invalid environment specified
Вот
ведь незадачка-то: Вариантов решения этой проблемы несколько. Гугл и форумчани вовсю советуют:
1)
Взять старый драйвер для oracle9( некошерно )
2)
Установить глобальную переменную NLS_LANG в en_US.utf8, в винде тоже самое, только в реестре.


1 вариант -я честно не пробовал. Второй - не помог, видимо он для 10 оракла или то-то типа того. Поэтому есть ещё 3-й и четвёртый варианты.  Для того, чтоб решить проблему, давайте поймём, от чего она. Если вы устанавливали и Oracle ,и NetBeans на 1 машину, то ошибки у вас возможно и нет. Потому, что она насколько я понял из-за несоответствия кодировок сервера и клиента, Сервер БД  устанавливает внутреннюю кодировку скриптиком.
{oracle home}/product/{version}/xe/bin/nls_lang.sh . Этот скрипт анализирует кодировку вашей системы и выдаёт подходящую для БД на экран. Могу предположить, что этот скрипт выполняется при запуске OracleXE и результат его работы присваивается куда-то. Но это предположения. На стороне клиента, на сколько я понимаю, по крайней мере драйвер  ojdbc6 выполняет то же самое ,только с кодировкой системы клиента. И если кодировки разные и несовместимые, то вываливается ошибка NLS . Как же быть? Можно на стороне клиента в системе поставить кодировку, аналогичную серверу, давайте так и сделаем.
export LANG=us_US.utf8. Запускаем NetBeans в этой же консольке и мы успешно подключаемся к базе. Но способ не самый удобный, поэтому существует ещё 1.
Мы отредактируем конфигурационный файлик NetBeans.{NET BEANS HOME}/etc/netbeans.conf . И в переменную netbeans_default_options добавим ещё 1 параметр.
-J-Duser.region=US . После этого снова успешно подключаемся к базе.  В этом посте мне хотелось ещё рассказать 2 слова о подключении Oracle к java, но статья затянулась, и об этом я продолжу после.


Читать дальше......

вторник, 10 апреля 2012 г.

OpenGl вместе с Qt самое начало.Кроссплатформенно

Информации по open gl огромное множество, но она не структурирована и если вы ещё ничего не знаете об Open Gl. Нужно потратить немножно нервов и времени чтоб войти. Под Win всё достаточно просто, есть отличные уроки отNehe под линукс порог входа чуть выше, если покопаться можно найти замечательные туториалы, но надо покопаться. И Почти все они сразу рисуют что-то относительно сложное. Я же хочу сделать может цикл уроков(если меня хватит). Описать свой путь осваивания Open Gl.Конечно, полезно брать сразу сложные примеры, это сложно, но оно даст свои результаты. Так было со мной, начинал я осваивать с икосаэдра. Но это подход имеет множество недостатков. Когда вы его используете, от вас остаётся недопонятым не 1 десяток функций, и их параметров, которые используются в программе, но вы не понимаете их значения, потому что не вы это писали. И после большого количества мучений и удачных и неудачных попыток сразу создавать сложные красивые OpenGl программы. Я решил попробовать планомерно шаг за шагом с самого начала пройтись осторожно медленно добавляя функцию за функций, эксперементируя с её параметрами. И проходиться хочу с вами, дабы вам было легче освоить OpenGl, пусть не так быстро но куда более стойко и уверенно.
И начнём мы с основ основ - создание openGl окна. Кому интересно добро пожаловать под кат.




И так. вперёд и с песней. ничего не боимся.
Основы это конечно хорошо, но с вашего позволения я не буду описывать как устанавливтаь ОС. Пользоваться мы будем Qtcreator. В первом уроке нам достаточно пока-что лишь qmake.

Начнём писать мы программу с файла проекта. И так,создайте папку у себя GlForm.
А в ней файлик GLForm.pro
с таким содержанием:


QT =core gui opengl
TARGET = GlForm
TEMPLATE = app
LIBS += -L/usr/local/lib -lGLU
SOURCES  = main.cpp\
        scenegl.cpp
HEADERS =\
        scenegl.h


В этом файле я указываю Qt что она будет использовать это core(ядро Qt без него никуда),и opengl. Иначе мы не сможем инклуднуть нужные нам библиотеки.
Дальше я указываю TAGET = название проекта. И SOURCES и HEADERS - список исходных файлов проекта. А так-же в LIBS я включаю библиотеку lGLU, без которой мы не сможем пользоваться многими функциями, которые по умолчанию не включены в qt opengl

Перейдём к созданию файла main.cpp

#include "QApplication"
#include "scenegl.h"

int main(int argc, char *argv[])
{
        QApplication app(argc, argv);
        SceneGL scene;
        scene.setWindowTitle("Hello Gl window");
        scene.show();
        return app.exec();
}


Мы подключаем библиотеку QApplication , ведь это не просто C++ а qt с++. И ещё библиотеку "scenegl.h" которую сейчас создадим. В main мы прописываем  QApplication app(argc, argv); это инициализирует приложение Qt. И создаём и показываем класс формочки который вот вот уже создадим. Мне очень нравится идея называть то поле на котором буду происходить действия - сценой. Собственно я и назвал. ИМХО.
Давайте наконец опишем сцену на которой будет всё рисоваться в файле scenegl.h

#ifndef SCENEGL_H
#define SCENEGL_H

#include <QGLWidget>
#include <GL/glu.h>
class SceneGL : public QGLWidget
{
    Q_OBJECT
public:
    explicit SceneGL(QWidget *parent = 0);
 protected:
  void initializeGL();
  void resizeGL(int nWidth,int nHeight);
  void paintGL();  
signals:
    
public slots:
    
};

#endif // SCENEGL_H
Как видите ничего сверх естественного. Я создаю класс который наследуется от QGLWidget, который в свою очередь наследуется от QWidget а этот от QObject.Это даёт право нашему объекту не просто рисоваться посылать сигналы и принимать их в слотах, захватывать мышку и прочее, а ещё и рисоваться с помощью openGl.
Мы должны переопределить 3 функции

#include "scenegl.h" SceneGL::SceneGL(QWidget *parent) : QGLWidget(parent) { }
void initializeGL();
  void resizeGL(int nWidth,int nHeight);
  void paintGL();
Названия говорят за себя

initializeGL() - вызывается 1 раз, при создании окошка, в неё надо запихнуть все начальные настройки OpenGl.
resizeGL(int nWidth,int nHeight) - вызывается при изменении размера окна, если вы не хотите чтоб ваш круг стал яйцом при растягивании окошка, то в этой функции надо кое чего написать.
Ну и paintGL() - в ней мы и будем рисовать, тут находится основной код.

А теперь последний и самый интересный штрих на этот пост, он и так уж затянулся.
Это реализация всех этих функций в файле scenegl.cpp



#include "scenegl.h"

SceneGL::SceneGL(QWidget *parent) :
    QGLWidget(parent)
{
}

void SceneGL::initializeGL(){
 
  glClearColor(0.0f,0.0f,0.0f,1.0f);
}
void SceneGL::resizeGL(int nWidth,int nHeight){
 glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
   gluPerspective(120.0, (GLdouble)nWidth / (GLdouble)nHeight, 0,1000.0);
  glViewport(0,0,(GLint)nWidth,(GLint)nHeight);
}


void SceneGL::paintGL(){
 glLoadIdentity();
  glClear(GL_COLOR_BUFFER_BIT);
} 
Что тут сделано? При создании окна в конструкторе не делается ничего, делать просто нечего.
Когда инициализируется OpenGl мы opengl-овской функцией устанавливаем цвет очистки экрана в чёрный, без прозрачности.(первые 3 параметра это RGB и четвёртый - прозрачность).Обратите внимание на способ записи числа 0.0f.Это встроенный тип GLfloat. Он сделан для стандартизации. Ведь OpenGl кросплатфорненно, а на разных платформах float может быть разным. А GLfloat везде одинаков.

При изменении размеров окна мы изменяем перспективу, это как раз нужно для отсуствия яйцеобразности ваших окружностей. У неё 4 параметра.
1 говорит нам насколько широк наш угол обзора.
2 говорит нам пропорции нашей сцены( бойтесь яйцеобразности)
3 указывает рамки самых близких к нам объектов, не может быть <0. Всё что будет выходить за рамки от нас рисоваться не будет. 4 указывает на рамки самых далёких объектов. Всё что выйдет за них тоже не будет рисоваться.И тоже не может быть <0. Так как рисовать то что за нами не только не имеет смысла, а ещё введёт людей в заблуждение.Вы же не видите ваш затылок перед глазами верно? Ещё одна функция это glViewport. Она определяет прямоугольник в который надо рисовать, ну естественно это начиная с нулей, заканчивая шириной и высотой нашего окошка. Ещё тут нас волнует glLoadIdentity. Она загружает единичную матрицу в память OpenGl. Затем что OpenGl это как автомат состояний, и все операции над ним сохраняются, И поэтому для отсутствия путаницы всегда удобно начинать отсчёт с нулей. В последней функции paintGL мы снова загружаем единичную матрицу, и очищаем экран тем цветом который задали при инициализации. Вот и пожалуй пока-что всё.
запустим qmake затем make и запустим исполняемый фаил
И увидим

Что не густо? А что вы хотели сразу писать 3d игрушки? Это позже и очень очень скоро. На этот пост хватит создания окна. Позже рассмотрим помещение фигур в это окно.Пока можете поиграться с параметрами цвета очистки экрана.


Читать дальше......

четверг, 29 марта 2012 г.

Значение-ссылка-значение-указатель C++

Как распределена память компьютера? Как мы работаем с переменными? Что такое объект, зачем нам ссылки на него?
Все это вопиет с небес на землю
И ждет разбора.
И его найдет.


Все мы знаем, ЧТо такое ссылка на объект, и что такое сам объект. Когда мы только начинали нежно прикасаться к C++. Мы недоумевали разницы между "->"и ".". Почему иногда надо то а иногда то.
Это конечно от того что мы смело кинулись писать в Здоровилах типа RAD Studio Professional, VisualStudio Ultimate ,Qt4. Где можно начать писать буквально мышкой, и имея некие представления о синтаксисе, уча его по ходу чтения кучи namespase-ов классов, непонятных define-ов typedef-ов enum-ов tamplate-ов и прочих вкусностей C++. и не прочитав ни одной страницы книги по C++ мы уже писали более не менее сложные программки. По ходу дела учась и объектно-ориентированному, и клиент-серверному,осваивая синтаксис в процессе разгребания n-ной сотни error-ов компилятора.

В хороших традициях надо начинать с простых программ, консольных, небольших, на чистом ANSI C.Постепенно в него вкрапляя С++. Например с gcc и g++;

И вот хочу сейчас продемонстрировать Что такое объект, а что такое ссылка.

Для начала освоим такие операторы..
*,&

Что они делают?

Ну сначала вспомним, как мы создаём любой объект

class A{};
 
A*Obj = new A(); 

Да, и что мы получили?
*Obj - ссылка, определяющая начало той области памяти, где находиться объект.
Оператор * возвращает копию области памяти на которой находиться объект.

Оператор & возвращает ссылку на объект
то есть &Obj будет типа **A.


Давайте, посмотри пример в котором я постарался показать как изменяются значения, если использовать ссылки и сами объекты.

#include <string>
#include <iostream>
using namespace std;
 
 
#define BallLink The_Ball*
 
 
struct The_Ball{
 string Color;
};
 
 
 
void Paint_in_Pink(The_Ball* Ball){
Ball->Color = "Pink";
}
 
void Paint_in_Gray(The_Ball Ball){
Ball.Color = "Gray";
}
 
void Paint_in_Yellow(The_Ball& Ball){
Ball.Color = "Yelow";
}
 
int main() {
 The_Ball b1;
 b1.Color = "Red";
 BallLink b1Num = &b1;
 cout<<"b1 = "<<b1.Color<<"; Adress of b1 = "<<b1Num<<"; Value got by Adress = "<<b1Num->Color<<endl;
 b1.Color = " blue";
 cout<<"b1 ="<<b1.Color<<";Adress of b1 = "<<b1Num<<" ;Value got by Adress"<<b1Num->Color<<endl;
 The_Ball b2 = b1;
 b2.Color = "Red";
 
 cout<<"b1= "<<b1.Color<<";b2 = "<<b2.Color<<endl;
 BallLink b3Num = b1Num;
 The_Ball b3 = *b3Num;
 b1.Color = "Green";
 cout<<"b3 = "<<b3.Color<<"; Value got by adress b3Num thas the same as b1Num ="<<b3Num->Color<<endl;
 b1.Color = "Black";
 b2.Color = "Black";
 b3.Color = "Black";
 cout<<"Swich all to Black"<<endl;
 Paint_in_Pink(&b1);
 Paint_in_Gray(b2);
 Paint_in_Yellow(b3);
 cout<<"b1 = "<<b1.Color<<endl;
 cout<<"b2 = "<<b2.Color<<endl;
 cout<<"b3 = "<<b3.Color<<endl;
 
}
 

И вывод
b1 = Red; Adress of b1 = 0x7fffc1b84e70; Value got by Adress = Red
b1 = blue;Adress of b1 = 0x7fffc1b84e70 ;Value got by Adress blue
b1=  blue;b2 = Red
b3 =  blue; Value got by adress b3Num thas the same as b1Num =Green
Swich all to Black
b1 = Pink
b2 = Black
b3 = Yelow
 

Начнём.
Я объявил структуру The_Ball у которой есть поле color.
И определил макрос BallLink как указатель

В первых строках main я создаю Красный мячик и ссылку на него

Дальше по значению меняю цвет на синий. После изменений, ссылка тоже указывает на теперь синий мячик.
Потом я создаю второй мячик как КОПИЮ 1-го. И меняю его цвет на Красный. И получается что 1-й у меня остаётся Синим, а второй красным. Потом я создаю ещё одну ссылку b3Num которая указывает тот-же адрес что и ссылка на 1 мячик, и создаю объект по этой ссылке, И этот объект у меня получается копия 1-го мячика, но ссылка указывает на 1-й.И при изменении цвета 1-го мячика на Зелёный, ссылка b3Num указывает уже на Зелёный цвет, когда объект созданный по ссылке, указывает на Красный.
И вот время перекрасить все объекты в Чёрный для определения. Если бы я вывел все ссылки, вы бы убедились что они тоже все обязательно указывают на Чёрное.
И теперь время вызывать функции в первую функцию Я передаю указатель на переменную, которую функция окрасит в Розовый. Во вторую Я передаю саму переменную, и в третью адресс переменной.
И что мы вилим на выходе? когда передаём ссылку, всё краситься, когда передаём саму переменную, ничего не происходит, потому что по сути мы передали копию переменной. И когда передаём ардесс переменной всё тоже хорошо красится. Вот и вся магия.Это стоит запомнить, когда буем сообщать функциям переменные которые стоит менять и не стоит менять.

Читать дальше......

вторник, 20 марта 2012 г.

SIOCSIFFLAGS: Operation not possible due to RF-kill

Микро заметка, для себя. И если понадобиться для ещё кого.
Сегодня еду на олимпиаду. Нужет будет Вайфай. Вот тестю. Не работает
Если вы пользуетесь Wicd то нужно ручками вписать в консльку
sudo ifconfig wlan0 up
Сам Wicd делать этого не умеет. Ну или я не знаю что он умеет.
Если у вас вываливаеться ошибка
SIOCSIFFLAGS: Operation not possible due to RF-kill
То нужно установить улитку rfkill
(sudo apt-get install)/(yaourt -S)/(pacman -S)/(yum)  rfkill 
выполнить разблокировку если заблокировано что-то в
rfkill list
rfkill unblock all
И снова запускать
sudo ifconfig wlan0 up
Всё. Wicd спокойно подключаеться.
П.С. Если хотите подключиться из консоли то вот


iwconfig wlan0 essid имя_точки_доступа mode managed key s: пароль
ifconfig wlan0 ip_адрес netmask маска

А какие сети доступны, из консольки вам скажет

iwlist wlan0 scanning

Читать дальше......

среда, 29 февраля 2012 г.

Автоматическая смена обоев Linux(или опять свой велосипед)

Есть куча скриптов, генератором демонов, но хоть одноколёсный , хоть без руля но свой приятнее. На самом деле это мотив немного подучить bash, и регулярные выражения.

На самом деле, к обоям на рабочий стол я отношусь мягко так сказать, нейтрально. Я в принципе к окружению отношусь нейтрально. Важна юзабельность, всякие Альт-табы, большая рабочая область экрана, несколько рабочих столов. Мой глаз не должно беспокоить ничего кроме среды разработки, часов, индикатора батареи, и индикатора раскладки клавиатуры, а на другом рабочем столе должен быть браузер с доками(мечтаю о 2-х мониторах). Но вот вдруг захотелось динамики. И решил написать. Заодно подучить баш. Это было полезно. Я узнал о таких командах как find ,tr, shuf
,пощупал конструкции циклов, условий, помацал работу с переменными в bash, ну и самое развратное это я можно сказать вошел в регулярные выражения. Пусть пока не особо глубоко вошел, но достаточно для выбора файлов с нерусскими названиями, без пробелов, оканчивающихся на .jpg(png,gif...), надеюсь наши отношения с продлятся ещё долго, пусть не регулярно но я хочу их познать в разных позициях.
Собственно, первый велосипед был очень громоздок и некрасив, потом я постепенно его довёл до более не менее состояния.
вышло вот что:

#!/bin/bash 

pre="file:"
florder="/media/Files/Media/Media_mix/Photo/wallpaper/"
time=20

pic(){
  pic=`ls $florder |grep '\(png\|gif\|jpg\|jpeg\)$'|shuf -n 1`
  GSETTINGS_BACKEND=dconf gsettings set org.gnome.desktop.background picture-uri ${pre}${florder}${pic}
  sleep $time
}

i=0
while [ ""-z ]
do
 pic
done

Смысл прост. Скрипт выбирает случайную картинку и каждые time раз меняет на следующую случайную в папке florder

чтоб оно работало надо его сохранить в файл типа *.sh раздать ему права на выполнение chmod +x путь_к_скрипту и прописать его выполнение в профайле пользователя $HOME/.profile или в .xinitrc(так кошерней).

Ну вот. Как я уже писал способ не единственный, один из кажущихся мне кошерными это создание xml документа с путями картинок( если не знали, то в гноме можно ставить на рабочий стол xml документ, с путями и он будет работать как анимация) подробнее про это http://linuxforum.ru/viewtopic.php?id=4591.
У меня планы создать python\qt\java программу, которая будет из выбранных пользователем изображений создавать xml документ, всё красиво с блэкджеком и шлюхами, задержками и прочим. Есть проблема в создании блэкджека и шлюх, потому что просто выбирать папку и строить xml по ней легко, но хочется Ui с красивой настройкой анимации, выставление параметров задержек, порядка фотографий и прочего. Концепция в голове, реализация красивого и серьёзного UI это ещё проблема, но будем расти :-)

Читать дальше......

четверг, 12 января 2012 г.

The Matrix

Давно я сюда ничего не писал. Всё времени формулировать мысли нет. но вот сдал все экзамены и всё-же решил опубликовать то что написал в ночи перед экзаменами. Матрица.


Есть сотни реализаций, на разных языках и графика и консоль, что хочешь. Но свой велосипед всегда приятнее.

Подробности под катом.



К тому-же сессия, надо учить экономику а она в голову не лезет. И тут я вспомнил что на С++ писал только с помощью Qt. Решил что это не порядок. Почему бы не написать что-то например с помощью gcc? В моём случае g++. И попутно изучить редактор emacs. Флаг в руки и в атаку. Решил написать заставку из матрицы. Для позиционирования символов использовал ncurses. Ещё хочеться использовать свой i5 на полную катушку. Поэтому решил сделать матрицу ещё и многопоточной. Использовал pthread.

Давайте рассмотрим костыли.
ncurses поста в использовании google кишит ссылками на эту тему. Алгоритм рисования одной пробегающей "змейки" в матрице тоже достаточно прост.



void print_snake(int col,int len,int speed){
//print 1 snake in col column with len length and speed speed;
    int i;
    for (i = 0;i<count_row;i  ){
 TS_print_char(i,col);
 if (i>=len){
            TS_print_pass(i-len,col);// when snake is almost on screen is time to clear her tail
 }
 usleep(speed);
    }
    for (i=count_row-len-1;i<count_row;i  ){
        TS_print_pass(i,col);//clear tail when snake is under screen border
 usleep(speed);
    }
}

TS_print_char - моя потоко-безопасная функция вывода случайного символа на экран в место x y.

Сначала я делал refresh каждый раз при выводе символа. Но посмотрел что програмка при выполнении занимает полтора процессора. и Ужаснулся. Вывел обновление в отдельный поток, с периодом в 10000 микросекунд. Теперь программка занимает каких-то 15 - 20 % процессора, и это при полном экране ( более 100 потоков) . Ах я ещё не говорил. Количество потоков зависит от количества столбцов помещающихся на консоль. Вот собственно и всё.

Просмотреть код можно тут:
КОД
скачать запустить, или скомпилировать и запустить можно от сюда
git clone git@github.com:alexkutsan/The-Matrix.git
или

Код легко читаем. Разобраться в нём - раз плюнуть. Я старался максимально снабдить комментариями

Матрица - хорошее упражнение. Алгоритм не сложный легко наверстать набивку кода ручками. При этом немного подумать о функционале, и многопоточности. В перспективе сделаю матрицу на технологии cuda. Но пока-что не могу победить драйвер видеокарты под Linux.И можно сделать матрицу на OpenGL.

Читать дальше......