Ярлыки

вторник, 19 июля 2011 г.

Linux Быстрая установка XGL Beryl в Debian 4.0 Etch

1. Добавляем два новых репозитория

~$ su -
~# nano /etc/apt/sources.list


deb http://debian.beryl-project.org/ etch main
deb-src http://debian.beryl-project.org/ etch main


2. чтобы не ругался скачиваем и ставим gpg ключ для этих репозиториев:

~# wget -O - http://debian.beryl-project.org/root@lupine.me.uk.gpg | sudo apt-key add -


3. скачиваем пакеты

~# apt-get update
~# apt-get install beryl-manager emerald-themes


4. Beryl установлен, но он не будет у Вас работать, нужно править X.Org для корректной работы

~# nano /etc/X11/xorg.conf


5. добавляем в конец секции Screen следующие две строки:

Option "XAANoOffscreenPixmaps"
Option "AddARGBGLXVisuals" "true"

теперь эти в секцию Device:

Option "AllowGLXWithComposite" "true"
Option "RenderAccel" "true"


одну строку в секцию Server Layout:

Option AIGLX "on"


И в конец файла я добавил эти строки :

Section "Extensions"
Option "Composite" "Enable"
EndSection


6. Перезагружаем икс сервер
В итоге получаем такую игрушку:




P.S. Для того, чтобы при каждой загрузке системы в ручную не запускать Beryl, просто вписываем его в автозагрузку
Главное меню - Система - Параметры - Сеансы, во вкладке [Запускаемые при старте программы] добавляем beryl-manager

Что дальше? Ну а дальше заходим в Beryl Settings Manager и ковыряемся в настройках горячих клавиш, эффектов и во всем, что Вы там найдете по вашему вкусу.

link

вторник, 14 июня 2011 г.

Qt Удаление директории с поддиректориями и файлами


void DeleteAllFiles(const QString &path) 
{
    QDir oDir(path); 
    QStringList files = oDir.entryList(QDir::Files);
    
    QStringList::Iterator itFile = files.begin(); 
    while (itFile != files.end()) 
    {
        QFile oFile(path + "/" + *itFile);
        oFile.remove();
        ++itFile;
    } 

    QStringList dirs = oDir.entryList(QDir::Dirs); 
    QStringList::Iterator itDir = dirs.begin(); 
    while (itDir != dirs.end())
    { 
        if (*itDir != "." && *itDir != "..") DeleteAllFiles(path + "/" + *itDir);
        ++itDir; 
    }
    oDir.rmdir(path);
}

int main(int argc, char *argv[])
{
    QString path="c:\\windows\\system32"; // перед запуском измените путь, а то как бы чего не вышло! :)
    DeleteAllFiles( path);
    return 0;
}



link
link

пятница, 10 июня 2011 г.

Linux домашняя директория

cd и домашняя директория

Если бы мы хотели переместиться в нашу домашнюю директорию, то могли бы набрать:

$ cd

Без каких либо аргументов cd переместит в вашу домашнюю директорию, которая будет /root для суперпользователя, или обычно /home/username (где username — имя пользователя в системе — прим.пер.) для любого другого пользователя. Но, что если мы хотим указать файл в нашей домашней директории? Может быть мы хотим передать путь к файлу в качестве аргумента нашей программе myprog. Если файл расположен в нашей домашней директории, мы можем набрать:

$ ./myprog /home/drobbins/myfile.txt

Однако, использования абсолютного пути вроде этого, не всегда удобно. К счастью, мы можем использовать символ ~ (тильда), чтобы проделать то же самое:

$ ./myprog ~/myfile.txt
Другие домашние директории пользователей

Bash воспримет одиночную ~ как указатель на вашу домашнюю директорию, но вы также можете использовать её для указания на домашние директории других пользователей. Например, если мы хотели сослаться на файл под названием fredsfile.txt в домашней директории пользователя fred, то могли бы набрать:

$ ./myprog ~fred/fredsfile.txt

link

четверг, 9 июня 2011 г.

Linux cdrecord: Permission denied. Cannot open SCSI driver

если при записи с помощью cdrecord выводится ошибка о невозможности открытия scsi драйвера, возможно вы используете устаревшее именование устройств.
cdrecord ругался на dev=0,0,0 С ключом dev=/dev/sr0 или без ключа dev (если ссылка /dev/cdrom указывает правильно) всё работает прекрасно.

link

Linux запись CD одной стокой

mkisofs -r -J ~/my_data | cdrecord -v dev=/dev/cdrw -

Тире в конце говорит о том что параметры кончились а поток брать со стандартного входа. О как.

тоже моно получить ежели в качестве исо образа указать /dev/stdin

mkisofs -r -J ~/my_data | cdrecord -v dev=/dev/cdrw /dev/stdin

link

среда, 8 июня 2011 г.

Как определить наличие CD в дисководе?

open("/dev/cdrom", "r") возврашает -1 с errno равным ENOMEDIUM.

link

c++ error: passing ‘const *’ as ‘this’ argument of ‘*’ discards qualifiers

в коде есть ошибка
#include

using namespace std;

class testing{
int test();
int test1(const testing& test2);
};

int testing::test(){
return 1;
}

int testing::test1(const testing& test2){
test2.test();
return 1;
}


test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers

для ее исправления необходимо сделать метод константным
class testing{
int test1() const;
// ...
}

int testing::test() const {
// ...
}

link

вторник, 7 июня 2011 г.

Qt3 консольное приложение

#include
...
QApplication app( argc, argv, false );


link

пятница, 3 июня 2011 г.

Qt чтение вывода консольного приложения

connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));

void myProcess::showOutput()
{
te.append(QString::fromLocal8Bit(myProc.readAllStandardOutput()));
te.append(QString::fromLocal8Bit(myProc.readAllStandardError()));
}

link

четверг, 2 июня 2011 г.

Qt ‘qApp’ was not declared in this scope

нужно добавить


#include <QApplication>

среда, 1 июня 2011 г.

C++ константы в классе

class foo
{
public:
static const std::string& RECTANGLE(void)
{
static const std::string str = "rectangle";

return str;
}
};
link
link

четверг, 19 мая 2011 г.

Qt использование QMap

Класс QMap сохраняет пары (ключ, значение), где каждый ключ ассоциирован с отдельным значением. В данной статье представлен "грязный и быстрый" трюк, позволяющий связывать ключи с несколькими значениями.

Основная идея - заменить тип Value более сложным, например, QValueList, так:
QMap map;

(QStringList - это расширение QValueList.) Вставка значения в "мульти-карту" простая:
map["presidents"].append( "George Washington" );

Если мульти-карта map уже содержит ключ "presidents" key, map[presidents] вернет ссылку на QStringList, который ему соответствует; иначе будет автоматически создан пустой QStringList.

Другие действия - проверка существования пары (ключ, значение) и удаление пары -- так же просты:
if ( map["presidents"].contains("Bill Clinton") )
map["presidents"].remove( "Ronald Reagan" );

Вышеприведенная операция remove() удалит пару ("presidents", "Ronald Reagan") из карты, если карта содержала ее; иначе ничего не будет сделано. Мы можем также вставить одну и ту же пару несколько раз:
map["presidents"].append( "George Bush" );
map["presidents"].append( "George Bush" );

Удаление одной из них аналогично:
map["presidents"].remove(
map["presidents"].find("George Bush") );

В программировании, как и в политике, наличие дубликатов не всегда приветствуется. При добавлении новой пары, это можно обойти так:
if ( !map["presidents"].contains("John Adams") )
map["presidents"].append( "John Adams" );

Также можно лекго удалить их все сразу:
map["presidents"].remove( "John Adams" );


link

вторник, 17 мая 2011 г.

Монтирование разделов и дисков в Linux

Рано или поздно пользователи Linux сталкиваются с таким понятием как монтирование разделов и дисков в Linux. Многие, особенно бывшие пользователи Windows, испытывают трудности с монтированием разделов, хотя если задуматься, то всё очень просто и логично. Ниже приводятся описание процесса монтирования в UNIX-like системах и разбор наиболее типичных случаев. И даже если вы окружены графическим интерфейсом, знание консольных команд может очень пригодиться. Кроме того, узнав пару-тройку полезных команд UNIX, вы приобщитесь к этой чёрной магии и, может быть, начнёте её использовать.


Монтирование разделов в Linux - общие слова
Если ядро Linux опознало ваше устройство-носитель данных, то оно должно предоставить какой-то внешний интерфейс пользователю для работы с устройством. Этим интерфейсом является создание файлов-устройств в каталоге /dev

Пример:
Устройствам, подключённым к IDE, будут соответствовать файлы-устройства /dev/hda, /dev/hdb и так далее.

Устройствам типа SCSI, а также близкие им по духу SATA-устройства и USB-флешки, будут иметь файлы-устройства /dev/sda, /dev/sdb и тому подобное.

Если на диске есть разделы, то цифра в имени файла-устройства будет соответствовать номеру раздела.

Пример:
если на USB-флешке есть два раздела, то первый будет называться /dev/sda1, а второй /dev/sda2
Монтирование разделов = объяснение системе, как добраться до ваших данных и сделать их доступными для использования. Системе нужно объяснить три простые вещи:
какая файловая система на разделе;
какой файл-устройство вам нужно;
куда его подключить для просмотра = точка монтирования;
Каталог, в котором вы будете просматривать содержимое ваших разделов, называется точкой монтирования (mount point). Поэтому нужно объяснить системе - командой или через графический интерфейс - что вы хотите смонтировать, куда и что за файловая система на этом разделе.

В переводе на язык UNIX, это звучит так:
mount -t vfat /dev/hda3 /mnt/storage

Если нужно часто монтировать одни и те же разделы, занесите их в /etc/fstab - это общесистемный конфиг, в котором указаны все необходимые разделы для монтирования. Редактировать этот файл может не абы кто, а только root. Так что разживитесь рутовыми полномочиями и редактируйте /etc/fstab

Файл /etc/fstab состоит из колонок, разделителями между которыми являются символы табуляции (клавиша TAB). Вот пример содержимого файла /etc/fstab:
# /etc/fstab: static file system information.
#
#
/dev/hda2 / reiserfs notail,noatime 0 1
/dev/hdb /mnt/cdrom iso9660 ro,user,noauto 0 0
/dev/sda1 /mnt/flash vfat iocharset=koi8-r,codepage=866,rw,user,auto 0 0

Формат колонок такой:
Монтируемое устройство (файл-устройство, он же раздел, который вы хотите примонтировать)
Точка монтирования (в какую директорию в файловой системе монтировать)
Тип монтируемой файловой системы
Опции монтирования (кодировка языка, необходимость монтирования при старте)
Dump (обычно 0)
Pass (обычно 0)
Важно, чтобы вы вставляли Тab после каждой колонки при редактировании /etc/fstab

Ниже приводятся уточнения для каждого случая файловой системы, но идея монтирования разделов в Linux одна и та же.


mount -t vfat /dev/hda1 /home/vasya/tempdir

прикрутить тип FAT что прикрутить куда это прикрутить


Пишем буквально то, чего хотим: от имени суперпользователя, прикрутить логическую структуру с файловой системой типа FAT, находящуюся в файле /dev/hda1, к каталогу /home/vasya/tempdir

После всех операций раздел следует размонтировать, чтобы данные на него записались из памяти - точно так же, как при работе с флешками в Windows. Для этого следует дать команду:
# umount /mnt/XX
или
$ sudo umount /mnt/XX
где /mnt/XX - точка монтирования. Если ни одно приложение не работает с разделом, то раздел размонтируется, отключится и данные на него полностью запишутся. После этого устройство можно безопасно извлечь.

Чтобы посмотреть, что можно смонтировать, и увидеть информацию о разделах, можно воспользоваться командой (запуск от root):
# fdisk -l
Увидите что-то вроде:
Disk /dev/hda: 60.0 GB, 60011642880 bytes
255 heads, 63 sectors/track, 7296 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/hda1 1 36 289138+ 82 Linux swap / Solaris
/dev/hda2 * 37 7296 58315950 83 Linux
Всё очень просто и логично. Как и многое другое в UNIX.


Предварительные действия перед монтированием
Прежде, чем монтировать разделы, нужно создать точки монтирования. Точки монтирования следует создавать в каталогах /mnt или /media.
Пример: Для того, чтобы создать точку монтирования с названием /mnt/win в консоли даём команду:
$ sudo mkdir /mnt/win
или
# mkdir /mnt/win
и даём каталогу права доступа для обычных пользователей:
$ sudo chmod 777 /mnt/win
или
# chmod 777 /mnt/win
Это позволит считывать и записывать данные не только суперпользователю-руту, но и обычному пользователю. Даже если в системе вы - единственный пользователь. Свою точку монтирования в директории /mnt нужно создать для каждого раздела.

Не бойтесь, если вы не знаете точно, как теперь называются ваши виндовые диски C:\ или D:\ и монтируйте разделы с указанием типа файловой системы fat или ntfs - если ошибётесь, раздел не примонтируется и вы увидите ошибку вроде
mount: wrong fs type, bad option, bad superblock on /dev/sda2,
missing codepage or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
Не боимся - просто нам команда mount сказала, что примонтировать у неё не получилось.

Далее приводятся описания нескольких типичных случаев монтирования разделов и файлов.


Как примонтировать раздел с файловой системой FAT в Linux
Самое главное здесь - кодировка. Замечательная корпорация Microsoft изобрела свою собственную кодировку CP866 для MS DOS, CP1251 для Windows и только в последнее время прозрела до UTF8. Благодарим Microsoft за изобретение велосипеда с треугольными колёсами и приступаем к монтированию.

Однократное монтирование FAT
Временное, однократное монтирование, например, флешки, выглядит в командной строке так:
$ sudo mount -t vfat /dev/XX /mnt/YY -o iocharset=utf8,codepage=866
или
# mount -t vfat /dev/XX /mnt/YY -o iocharset=utf8,codepage=866
Пример: монтирование типичной флешки выглядит так
$ sudo mount -t vfat /dev/sda1 /mnt/flash -o iocharset=utf8,codepage=866
То есть монтируем раздел /dev/sda1 типа vfat в точку монтирования /mnt/flash


Постоянное монтирование FAT
Если нужно постоянно обращаться к этим разделам, правим /etc/fstab добавляя строку:
/dev/XX /mnt/YY vfat iocharset=utf8,codepage=866,user,rw 0 0
Пример: та же типичная флешка в /etc/fstab смотрится так
/dev/sda1 /mnt/flash vfat iocharset=utf8,codepage=866,user,rw 0 0
То есть монтируем раздел /dev/sda1 типа vfat в точку монтирования /mnt/flash После этого раздел FAT в Linux будет доступен. Отмонтирование по команде umount /mnt/flash
Как правильно говорят в комментариях, iocharset совпадает с текущей локалью - например, iocharset=utf8.



Как примонтировать раздел с файловой системой NTFS в Linux
Замечательная корпорация Microsoft изобрела не просто новый велосипед с треугольными колёсами NTFS, а ещё и закрыла его, треугольноколесатого велокактуса, описание. Да так, что пришлось очень долго его взламывать и создавать драйвера обратной разработкой. О сложности проблемы даёт понять описание дефрагментации NTFS, что, как говорится, внушает.

Монтировать и записывать на NTFS в Linux, тем не менее, возможно благодаря героическим усилиям разработчиков, создавших драйвер NTFS-3g. Этот драйвер можно установить командой:
aptitude install ntfs-3g
или поискать пакет ntfs-3g в графической оболочке установки программ вашего любимого дистрибутива.


Однократное монтирование NTFS
Временное, однократное монтирование, например, раздела с данными Windows, выглядит так:
$ sudo mount -t ntfs-3g /dev/XX /mnt/YY -o umask=0,nls=utf8
или
# mount -t ntfs-3g /dev/XX /mnt/YY -o umask=0,nls=utf8
Пример: монтирование раздела Windows с NTFS разделом выглядит так
$ sudo mount -t ntfs-3g /dev/sda1 /mnt/flash -o umask=0,nls=utf8
То есть монтируем раздел /dev/sda1 типа ntfs-3g в точку монтирования /mnt/flash



Постоянное монтирование NTFS
Если нужно постоянно обращаться к этим разделам, правим /etc/fstab добавляя строку:
/dev/XX /mnt/YY ntfs-3g umask=0,nls=utf8,user,auto,rw 0 0
Пример: та же типичная флешка в /etc/fstab смотрится так
/dev/sda1 /mnt/windows ntfs-3g umask=0,nls=utf8,exec,user,auto,rw 0 0
Иногда в /etc/fstab это уже есть с настроками вида:
/dev/sda1 /mnt/windows ntfs-3g umask=0,nls=ru-RU.UTF-8 0 0
При такой записи всё нормально, кроме одного - файлы и каталоги с русскими именами не отображались, как-будто их не было вовсе. Чтобы это исправить, можно попробовать изменить на:
/dev/sda1 /mnt/windows ntfs-3g exec,user,auto,rw 0 0
То есть монтируем раздел /dev/sda1 типа ntfs-3g в точку монтирования /mnt/windows После этого раздел NTFS в Linux будет доступен.
Отмонтирование по команде umount /mnt/windows



Как примонтировать CD/DVD диск в Linux
Всё проще - скорее всего, это уже сделано в вашем дистрибутиве. Тем не менее, привожу это здесь для примера.

Однократное монтирование CD/DVD
Временное, однократное монтирование, например, DVD-диска с данными в Linux, выглядит так:
$ sudo mount -t iso9660 /dev/XX /mnt/YY
или
# mount -t iso9660 /dev/XX /mnt/YY
Пример: монтирование DVD-диска с данными выглядит так
$ sudo mount -t iso9660 /dev/cdrom /mnt/dvd
То есть монтируем раздел /dev/cdrom типа iso9660 в точку монтирования /mnt/dvd


Постоянное монтирование CD/DVD
Если нужно постоянно обращаться к этим разделам, правим /etc/fstab добавляя строку:
/dev/XX /mnt/YY iso9660 user,ro 0 0
Пример: оптический диск в /etc/fstab смотрится так
/dev/cdrom /mnt/cdrom iso9660 user,ro 0 0
То есть монтируем раздел /dev/cdrom типа iso9660 в точку монтирования /mnt/cdrom После этого оптический диск в Linux будет доступен. Отмонтирование по команде umount /mnt/cdrom



Как примонтировать ISO-файл или другой файл в Linux
Вы откуда-то скачали ISO-файл и хотите просмотреть его содержимое. Для этого в Windows есть такой костыль под названием Alcohol. В Linux и вообще в UNIX такие костыли не требуются, так как монтирование ISO-образа ничем для системы не отличается от монтирования CD/DVD-диска. Нужно только передать один параметр -o loop чтобы сообщить системе, что монтировать мы собираемся на петлевое устройство (loopback). Если делать это надо много и часто, можно воспользоваться программой GmountISO, описанной тут.

Для монтирования ISO-образа в командной строке даём команду:
$ sudo mount -t iso9660 file.iso /mnt/YY -o loop
или
# mount -t iso9660 file.iso /mnt/YY -o loop
Пример: монтирование DVD-диска с данными выглядит так
$ sudo mount -t iso9660 file.iso /mnt/dvd -o loop
То есть монтируем файл file.iso типа iso9660 в точку монтирования /mnt/dvd на петлевое устройство loop
Точно так же можно монтировать любой CD/DVD образ, а также файл-образы сжатых\зашифрованных\экзотических файловых систем типа SquashFS. Отмонтирование по команде umount /mnt/dvd



Как примонтировать раздел с файловой системой EXT2/EXT3/ReiserFS/XFS/JFS... в Linux
Монтирование нормальных файловых систем проблем не создаёт. Приведу пример только с ext3, остальные файловые системы в Linux монтируются точно так же, только вместо ext3 подставьте буквально: ext2, reiserfs, xfs, jfs в зависимости от вашей файловой системы.

Однократное монтирование
Временное, однократное монтирование, например, флешки, выглядит в командной строке так:
$ sudo mount -t ext3 /dev/XX /mnt/YY
или
# mount -t ext3 /dev/XX /mnt/YY
Пример: монтирование раздела с данными выглядит так
$ sudo mount -t ext3 /dev/sda1 /mnt/data
То есть монтируем раздел /dev/sda1 типа ext3 в точку монтирования /mnt/data


Постоянное монтирование
Если нужно постоянно обращаться к этим разделам, правим /etc/fstab добавляя строку:
/dev/XX /mnt/YY ext3 user,auto,rw 0 0
Пример: та же типичная флешка в /etc/fstab смотрится так
/dev/sda1 /mnt/data ext3 user,auto,rw 0 0
То есть монтируем раздел /dev/sda1 типа ext3 в точку монтирования /mnt/data После этого раздел EXT3 в Linux будет доступен. Отмонтирование по команде umount /mnt/data


Как узнать тип файловой системы на диске?
Для этого есть утилита file, которая может определить тип файловой системы, используемый файлом. Так как в UNIX/Linux/*BSD исповедуется принцип "всё есть файл", то раздел с файловой системой это тоже файл. Так что команда file выдаст нам информацию о файловой системе дисковых разделов - надо только указать программе воспринимать их как специальные файлы.

Используем опцию -s (–special-files) для выдачи информации о типе файловой системы блочного устройства. Пример:

# file -s /dev/sda1
или
$ sudo file -s /dev/sda1

получаем в ответ:

/dev/sda1: ReiserFS V3.6 block size 4096 (mounted or unclean) num blocks 17920496 r5 hash
То есть на разделе /dev/sda1 имеем файловую ReiserFS V3.6.
Или например:
# file -s /dev/sda1
выдаст в ответ:
/dev/sda1: x86 boot sector, code offset 0x58, OEM-ID "MSWIN4.1", sectors/cluster 64, reserved sectors 126, Media descriptor 0xf8, heads 255, hidden sectors 63, sectors 284237982 (volumes > 32 MB) , FAT (32 bit), sectors/FAT 34693, reserved3 0x800000, serial number 0x287d1dfa, unlabeled
Это поможет в определении того, какая файловая система (и намекнёт на то, какие данные там лежат) на данном разделе.


Что делать, если устройство в Linux не хочет размонтироваться!?
Вы пытаетесь размонтировать раздел с данными (флешка, CD/DVD диск...) и получаете сообщение с ошибкой - устройство занято. Например, при выполнении команды umount /mnt/windows получаете сообщение вида:
umount /mnt/windows
umount: /mnt/windows: device is busy
Ну и что делать, если раздел в Linux не размонтируется!? Очень просто - посмотреть, какой процесс держит раздел или файл и не даёт отмонтировать его. Дальше либо закрыть это приложение, либо придушить его с помощью команды kill. Даём команду:
lsof | grep /mnt/windows
Вертикальная черта означает передачу вывода команды lsof программе grep и фильтрации по слову /mnt/windows
После этого вы получите ответ вида:
$ lsof | grep /mnt/windows
lsof: WARNING: can't stat() reiserfs file system /dev/.static/dev
Output information may be incomplete.
mc 14134 beast cwd DIR 8,1 4096 1 /mnt/windows

Стало быть, ваш раздел держит MC (Midnight Commander), который вы скорее всего открыли на другом рабочем столе и просто забыли о нём. Найдите это приложение, закройте его и отмонтируйте раздел снова - теперь проблема должна быть решена.

link

Как указать yum параметры работы с прокси?

export http_proxy="http://localhost:3128"
yum list

link

link

Пересобрать модули vmware

1) make sure haldaemon is running, and 2) "mv /usr/lib/vmware/modules/binary /usr/lib/vmware/modules/binary.old".

In VMware6.5, kernel modules should be rebuilt automatically as needed. If not, you can force a rebuild by running (as root): "vmware-modconfig --console --install-all"

link

ALTLinux не запускаются команды из sbin

нужно заходить в root как su -
т.к. при входе как su наследуются пути пользователя в которых не прописан /sbin

link
http://www.altlinux.org/Su

понедельник, 25 апреля 2011 г.

Статические библиотеки в Linux

1) Статическая библиотека - это такая библиотека, которая связывается (линкуется) с программой в момент компиляции оной. При этом объектный код библиотеки помещается в исполняемый файл программы. С этой точки зрения статическая библиотека похожа на исходный код программы, с которой она связывается, за исключением того, что библиотека компилируется "кем-то еще" и программист, использующий библиотеку, имеет дело исключительно только с результатом этой компиляции.

В Linux, как правило, файл-статическая_библиотека имеет расширение ".a"

2) Статические библиотеки на языке C.

Исходный код библиотеки:

######################
#include

extern int hello()
{
printf("Hello world! I'm static library\n");
return 0;
};

######################

Сохраните его в файле static.c

Ключевое слово extern необходимо для того, чтобы функция была видна в программе.

Теперь скомпилируем (! без линковки) библиотеку:

gcc -c static.c -o static.o
(на выходе имеем файл static.o, содержащий объектный код нашей библиотеки)

ar rc libMY_STATIC.a static.o

ar упаковывает несколько (! Это важно. Дело не ограничивается только одним объектным файлом) объектных файлов в одну статическую библиотеку. Статическая библиотека имеет расширение ".a", при этом ее название должно начинаться с "lib" (дань традиции).
Параметры ar:
r - предписывает заменять старые версии объектных файлов новыми - необходим для переупаковки библиотеки;
c - создать статическую библиотеку, если та еще не существует.

Проиндексируем функции внутри библиотеки для более быстрой линковки:

ranlib libMY_STATIC.a

Итак, мы получили статическую библиотеку libMY_STATIC.a.

Теперь попытаемся использовать библиотеку в нашей программе:

Исходный текст программы (C):

######################
#include

int main()
{
int x = hello();
printf("Return code: %d\n",x);
return 0;
}

######################

Сохраните его в файле program1.c

Способы связывания библиотеки и программы:

- Скомпилируем и слинкуем (в том числе с нашей библиотекой) нашу программу:

gcc program1.c libMY_STATIC.a

(предполагается, что в качестве аргумента gcc будут переданы полные пути (!) к вашим библиотекам)

И запустим:

./a.out

На выходе получим:

Hello world! I'm static library
Return code: 0


Отлично!

- Скомпилируйте с помощью команды:

gcc program1.c -L. -lMY_STATIC -o a1.out

Смысл аргументов:

-L - путь к каталогу, содержащему наши библиотек (используйте "-L -L - название нашей библиотеки (это важно - название (!), а не имя файла - собственно, если библиотека имеет своим именем "libBLABLABLA.a", то ее названием будет "BLABLABLA" - т.е. имя без приставки "lib" и расширения ".a") (для нескольких библиотек используйте "-l -l ...")

Запустите файл a1.out на выполнение и удостовертесь, что результаты те же, что и в предыдущем пункте.

- Видоизменим предыдущий способ - уберем аргументы "-L":

В начале проверим значение переменной LD_LIBRARY_PATH и содержимое файла /etc/ld.so.conf:

echo $LD_LIBRARY_PATH ; cat /etc/ld.so.conf

На экране появился некоторый список каталогов - это те каталоги, в которых система ищет библиотеки при их линковке с программой (еще к таким каталогам относятся:
/lib
/usr/lib
. Поместите libMY_STATIC.a в один из этих каталогов:

(Я, к примеру, засуну нашу библиотеку в каталог /usr/lib):

su -c 'cp libMY_STATIC.a /usr/lib'
(в Ubuntu - sudo cp libMY_STATIC.a /usr/lib)
ldconfig
(ldconfig обновляет кеш данных о библиотеках линковщика)

Теперь скомпилируем и запустим нашу программу:

gcc program1.c -lMY_STATIC -o a2.out
./a2.out

Результат:

Hello world! I'm static library
Return code: 0


Бинго! Кстати, таким вот способом вы можете подключать к своей программе любые статические библиотеки из приведенных выше каталогов.

* Бывает полезно определить все прототипы функций библиотеки в некотором заголовочном файле, который будет потом включаться в вашу программу. Это не обязательно, но удобно.

3) Статические библиотеки на языке Assembler.

Представьте, что вам необходимо оптимизировать выполнение некоторых действий в вашей программе. Разумеется, вы может применить ключевое слово asm (если пишите программу на C/C++), но лучшим решением будет создание оптимизированной вами библиотеки на языке Assembler и подключение ее к вашей программе. Давайте попробуем:

*Кстати, углубляться в процесс компиляции библиотеки и ее линковки с вашей программой я не буду (!). Этот процесс идентичен полностью (!) тому же процессу для библиотек, написанных на языке C.

Итак, имеем вот такую программу:

######################
#include

int main()
{
printf("Hello world!\n");
return 0;
};

######################

Сохраните ее в файле program2.c

Скомпилируйте ее и запустите:

gcc program2.c
./a.out

Я получил:

Hello world!


Отлично.

Я привел этот пример, чтобы показать действительно возможность оптимизации программы с помощью библиотеки на Assembler'е. Вы можете заметить, что вызов printf в main() не оптимален, т.к. printf, по крайней мере, один раз использует цикл while для поиска вхождений конструкций "%..." в строку. Это не оптимально, т.к. очевидно, что таковых символов у нас нет. Оптимизируем нашу программу с помощью библиотеки на Assebmler'е:

######################
.text
.globl my_printf

my_printf:
movl $4,%eax
xorl %ebx,%ebx
incl %ebx
movl $hw,%ecx
movl $hw_e,%edx
int $0x80
xorl %eax,%eax
ret

.data
hw:
.string "Hello world!\012"
hw_e = . - hw

######################

Сохраните исходный код библиотеки в файле static2.s

Это AT&T наречие Assembler'а.

.globl my_printf - "my_printf" описывается как глобальная (видимая в других объектных файлах) последовательность
my_printf: - начало описание функции my_printf
movl $4,%eax - поместим 4 в eax (4 - номер системного вызова write)
xorl %ebx,%ebx и incl %ebx - поместим в ebx единицу - номер STDOUT
movl $message,%ecx - в ecx запишем адрес начала сообщения
movl $message_l,%edx - в edx поместим адрес конца сообщения
int $0x80 - произведем системный вызов write
xorl %eax,%eax - в eax - код возврата (0)
ret - вернемся в вызывающую процедуру
.data - секция данных (разумеется, мы могли бы передавать выводимую строку как параметр, но тогда вычисление ее конца потребовало бы от нас дополнительных усилий, что, согласитесь, лениво :-) )

Теперь получим библиотеку:

gcc -c static2.s -o static2.o
ar rc static2.a static2.o
ranlib static2.a

На выходе имеем статическую библиотеку static2.a

Теперь напишем программу, использующую эту статическую библиотеку (язык C):

######################
#include

int my_printf();

int main()
{
int x = my_printf();
return 0;
}

######################

Сохраните текст программы в файле program3.c

Заметьте, я добавил прототип библиотечной функции для удобства.

Скомпилируем и слинкуем программу с библиотекой, после чего запустим программу на выполнение:

gcc program3.c static2.a
./a.out

На выходе получим:

Hello world!


* Принцип линкования статических библиотек с программами на Assembler'е аналогичен принципу для программ на C. Просто, когда будете использовать статические библиотеки в Assembler'е, помните о соглашениях C по передаче аргументов в функцию и возвращению результата.

4) Статические библиотеки на языке C++.

Принцип создания аналогичен статическим библиотекам на C, но перед каждой экспортируемой функцией не забывайте добавлять:

extern "C"

(экспортировать как функцию на C - т.е. без расширения имен).

* Кстати, используйте g++ вместо gcc, если захотите протестировать приведенные выше примеры.

Подключение к вашей программе аналогично подключению к программе, написанной на C, за исключением необходимости явно добавлять к тексту программы прототипы импортируемых функций в следующем виде:

extern "C" PROTOTYPE

Где PROTOTYPE - прототип импортируемой функции.

* При подключении статических библиотек на C++ к программе на C сопряжено с некоторыми трудностями - т.к. при компиляции и линковки программы необходимо будет также вручную подключить системные библиотеки для реализации функционала, предоставляемого библиотекой Standart C++ сверх того, что предоставляет библиотека Standart C.

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


link

среда, 20 апреля 2011 г.

Qt работа с локалью

Покопался в Qt-шных аналогах функции atof! Выяснилось, что функция ToDouble(bool* ok) тоже зависит от локали. Но есть отличия:
1) есть возможность увидеть ошибку быстрее, так как программисту предлагают после преобразования проверять значение ok
2) очень важное отличие - при установке такого формата setlocale(LC_ALL, 0) функция преобразует и строчку "1234,45" and "1234.45" в вещественное число 1234.45!

Так что, если используете библиотеку Qt есть такие советы:
1) Указывать в приложении напрямую setlocale()!
2) Использовать qt-шные средства преобразования в вещественные числа! Преобразование легче отследить и немного универсальнее!

P.S. Немцы молодцы!
QLocale::setDefault(QLocale::C);
d = QString( "1234,56" ).toDouble(&ok); // ok=false
d = QString( "1234.56" ).toDouble(&ok); // ok=true, d = 1234.56

QLocale::setDefault(QLocale::German);
d = QString( "1234,56" ).toDouble(&ok); // ok=true, d = 1234.56
d = QString( "1234.56" ).toDouble(&ok); // ok=true, d = 1234.56

link

c++ работа с локалью

функция localeconv() возвращает структуру содержащую настройки локали
структуру можно посмотреть тут

#include
#include
int main ()
{
setlocale (LC_MONETARY,"");
struct lconv * lc;
lc=localeconv();
printf ("Local Currency Symbol: %s\n",lc->currency_symbol);
printf ("International Currency Symbol: %s\n",lc->int_curr_symbol);
return 0;
}


link

понедельник, 18 апреля 2011 г.

c++ пример gmplib

#include
#include

using namespace std;

//sin(M_PI_4) = 0,70710678118654752440084436210485
#define M_PI_4 0.78539816339744830962
#define top 100
#define numsize 400

string msin( long double x )
{
mpf_t ret, temp, num;
mp_exp_t exp;
int i, j;
string str;

mpf_init_set_d( num, x );
mpf_init2( ret, numsize );
mpf_init2( temp, numsize );

for( i = 1 ; i <= top ; i += 2 )
{
mpf_pow_ui( temp, num, i );
for( j = 1 ; j <= i ; ++j )
mpf_div_ui( temp, temp, j );
if ( (i-1)%4 )
mpf_sub( ret, ret, temp );
else
mpf_add( ret, ret, temp );
}
str = mpf_get_str( NULL, &exp, 10, 100, ret );
str.insert( exp, "." );
if ( str[0] == '.' )
str.insert( 0, "0" );

mpf_clear( ret );
mpf_clear( temp );
mpf_clear( num );

return str;
}

string mcos( long double x )
{
mpf_t ret, temp, num;
mp_exp_t exp;
int i, j;
string str;

mpf_init_set_d( num, x );
mpf_init2( ret, numsize );
mpf_set_ui( ret, 1 );
mpf_init2( temp, numsize );

for( i = 2 ; i <= top ; i += 2 )
{
mpf_pow_ui( temp, num, i );
for( j = 1 ; j <= i ; ++j )
mpf_div_ui( temp, temp, j );
if ( i%4 )
mpf_sub( ret, ret, temp );
else
mpf_add( ret, ret, temp );
}
str = mpf_get_str( NULL, &exp, 10, 100, ret );
str.insert( exp, "." );
if ( str[0] == '.' )
str.insert( 0, "0" );

mpf_clear( ret );
mpf_clear( temp );
mpf_clear( num );

return str;
}

int main( int argc, char **argv )
{
cout << msin(M_PI_4) << "\n" << mcos(M_PI_4) << endl;
return 0;
}


link

c++ Implicit declaration of function

Интересный аспект стандарта языка Си, на который я раньше никогда не обращал внимания. Итак, следующий код:
int main() {
void *a, *b;

a = foo(b);

return 0;
}
Прототип функции foo не объявлен. Если теперь оттранслировать этот код (без линковки), то код соберется нормально и мы не получим никаких сообщений об ошибках, только предупреждения:
$ gcc -c -Wall test.c
test.c: In function ‘main’:
test.c:4: warning: implicit declaration of function ‘foo’
test.c:4: warning: assignment makes pointer from integer without a cast

Компилятор сообщает нам, что функция foo объявлена неявно и т.к. он не видел прототипа этой функции, то (по стандарту) делается ряд предположений. Например предполагается, что функция возвращает int, что влечет за собой следующее предупреждение о том, что из этого самого предполагаемого int‘а мы пытаемся неосторожно сделать указатель. Об этом и других предполложениях сказано в стандарте C89, раздел 3.3.2.2 Function calls. В новом стандарте C99 о неявном преобразовании возвращаемого типа функции ничего не говориться, или я не заметил. См. также Draft ANSI C Rationale, 3.3.2.2 Function calls.

В общем и целом, сделано всё это для совместимости со старыми библиотеками.

Ошибка о том, что данная функция не определена вылезает только на этапе линковки:

$ gcc -Wall test.o
test.o: In function `main':
test.c:(.text+0x12): undefined reference to `foo'
collect2: ld returned 1 exit status


link
link

вторник, 12 апреля 2011 г.

Государственная инспекция труда

http://git78.rostrud.ru/

C++ Удалить одинаковые элементы в массиве

#include 
#include <vector>

using namespace std;

int main()
{
    // заполняем массив и выводим его на экран
    cout << "Исходный массив" << endl;
    vector<int> a;
    for (int i = 0; i < 100; ++i)
    {
        int r = rand() % 15;
        a.push_back(r);
        cout << r << " "
    }
    cout << endl;
    // заполняем другой массив уникальными значениями
    cout << "Результирующий массив" << endl;
    set<int> s;
    vector<int> u;
    
    for (vector<int>::iterator i = a.begin(); i != a.end(); ++i)
    if (s.find(*i) == s.end())
    {
        s.insert(*i);
        u.push_back(*i);
        cout << *i << " ";
    }
    cout << endl;
}       link

c++ за 21 день


link

C++ Аргументы функции main(): argv и argc

#include 
#include 

int main(int argc, char *argv[])
{
  if(argc!=2) {
    printf("Вы забыли ввести свое имя.\n");
    exit(1);
  }
  printf("Привет %s", argv[1]);

  return 0;
}
link

C++ удаление объектов из вектора



void remove(Student &obj) {
  
  std::vector<Student>::iterator it;
  for(it=data.begin(); it!=data.end(); it++)
    if(strcmp((*it).get_name(),obj.get_name())) {
      it = data.erase(it);
      --it;
    }
--it делается для того, чтобы итератор не указывал на удаленный элемент.
Ещё вариант -- 

data.erase(std::remove_if(data.begin(), data.end(), <сюда впихни фугнкцию-сравнивалку>), data.end());

link

c++ Плавающая запятая

http://www.rsdn.ru/article/alg/float.xml#EWEAC

http://www.ctc.msiu.ru/materials/Book/node27.html

Целочисленное переполнение

http://securityvulns.ru/articles/digitalscream/integer.asp

printf, fprintf, sprintf - форматный вывод

Описание

Осуществляют форматную печать.
         fprintf   -  пишет литеры в поток fp.
         printf    -  пишет литеры в поток stdout.
         sprintf   -  пишет литеры в память buffer.
      Аргументы  интерпретируются  в соответствии со строкой
      формата,  оканчивающейся 0.  Строка  формата  является
      последовательностью  литер  со  встроенными  командами
      преобразования.  Литеры,  не являющиеся частью команд,
      подлежат выводу. Команды преобразования состоят из :
      '%'{flag}[field_width]['.'precision][l или L]conversion_char
   где :
      %       Означает начало команды преобразования.
              Чтобы напечатать '%', надо использовать '%%'.
      flag characters     Литеры режимов
         -     - Означает необходимость выравнивания
                 информации по левому краю поля вывода.
         +     - Означает, что преобразование, включающее
                 знак, должно начинаться с + или -.
        пробел
       (space) - Означает, что в случае преобразования поло-
                 жительного  результат начинается с пробела.
                 Режим + перекрывает режим space.
         #     - Имеет смысл  для преобразования 'x' или 'X'
                 и приводит к добавлению перед  выводом сим-
                 волов 0x или 0X.
                 Для преобразования 'о' в вывод  добавляется
                 лидирующий ноль.
                 В случае преобразований e, E, f, g, G всег-
                 да появляется  десятичная  точка.  Если это
                 преобразование  g  или  G,  замыкающие 0 не
                 будут опускаться.
      Field_width      Ширина поля
         Десятичное целое, управляющее минимальным количест-
         вом печатаемых  литер.  Если  действительное  число
         литер меньше, чем  field_width,  это  число  допол-
         няется пробелами.  Если строка цифр field_width на-
         чинается с 0, для дополнения используется 0.
         Если field_width есть литера *, действительное зна-
         чение длины поля вывода берется из следующего цело-
         го аргумента. Если field_width отрицательно, счита-
         ется, что задан флаг '-',  а в качестве field_width
         берется  абсолютное  значение.  Если действительное
         число литер превосходит field_width, это поле соот-
         ветственно увеличивается.
      Precision    Точность
         Эта строка цифр, следующая за '.',  определяет точ-
         ность преобразования. Если цифры за точкой отсутст-
         вуют, точность равна 0.  Для  преобразования  целых
         точность есть минимальное количество выводимых цифр.
         Для 'g' и 'G'- это максимальное количество значащих
         цифр. Для 'e', 'E' и 'f'- это количество цифр после
         десятичной точки.  Для 's' - это максимальное коли-
         чество литер в строке. Если точность включает лиди-
         рующий 0, тогда свободное поле вывода заполняется 0.
      l
         В случае спецификаций преобразования o, b, u, x, X,
         i, d  используемый аргумент  должен быть типа long,
         исключение составляет преобразование p, когда аргу-
         мент должен  быть  дальним  указателем.  Для других
         преобразований этот флаг игнорируется.
      L
         Этот флаг игнорируется.
      Conversion_char    Преобразующая литера
         Это одна из литер  d, i, o, b, u, x, X, f, e, E, g,
         G, c, s, p, n, %.  Действие  других  литер  неопре-
         делено.
      d,i,o,b,u,x,X
         Соответсвующий целый аргумент преобразуется в стро-
         ку цифр, причем, 'o' производит беззнаковое восьме-
         ричное, `b' - беззнаковое двоичное, 'u' - беззнако-
         вое десятичное,  'x' и 'X' - беззнаковое шестнадца-
         тиричное,  'i' и 'd' - десятичное со знаком. В слу-
         чае  'x'  используются  строчные  цифры,   в случае
         'X' - заглавные.  Если не специфицирована точность,
         используется  умолчание 1.  Если  реально выводится
         меньше цифр,  чем определено  точностью,  вывод до-
         полняется  лидирующими  пробелами.  Если аргумент и
         точность равны 0, ничего не печатаются.
      c
         Младший значащий  байт  целого аргумента печатается
         как литера.
      e,E
         Аргумент типа  double  печатается,  используя пред-
         ставление ([-]d.dddddd+-dd). Здесь перед десятичной
         точкой одна цифра и precision цифр после. Умолчание
         для precision равно 6. Если precision 0, десятичная
         точка не печатается.  В экспоненте вместо 'e' будет
         использовано 'E',  если задана литера 'E'. В экспо-
         ненте присутствуют как минимум две цифры.
      f
         Аргумент  типа  double  печатается  в  виде  строки
         [-]dd.dddd.  Количество цифр после десятичной точки
         задается precision,  которое  по умолчанию равно 6.
         Если precision 0,  дробная часть и десятичная точка
         не печатаются.
      g,G
         Аргумент типа double  печатается c помощью  формата
         'f' или 'e'  (или 'E',  если  задан  'G'  формат) в
         зависимости от величины аргумента. 'e' используется,
         если  экспонента <  3  или  экспонента > precision.
         Precision задает количество значащих  цифр; умолча-
         ние  равно 6.  Десятичная  точка  появляется,  если
         предшествует цифре. Замыкающие 0 опускаются.
      n
         Аргумент  является  указателем на целое,  в которое
         записывается количество цифр,  напечатанных к этому
         моменту. Никакие литеры не печатаются и не преобра-
         зуются.
      p
         Аргумент  является  указателем,  значение  которого
         (адрес) печатается в виде  segment:offset для даль-
         него указателя  или в виде XXXX для ближнего указа-
         теля.
      s
       Аргумент является указателем на строку.  Литеры печа-
       таются до замыкающего 0, или до исчерпания литер, ко-
       личество которых задано precision. Умолчание precision
       равно 32767. Замыкающий 0 не печатается.
    %
       Печатается литера '%'.

Использование

#include 
      int fprintf(FILE *fp,char *format,...);     /* ANSI */
      int printf(char *format,...);               /* ANSI */
      int sprintf(char *buffer,char *format,...); /* ANSI */

Возвращаемое значение

Возвращает количество  напечатанных  литер.  Если име-
      ла место ошибка, возвращаемое значение отрицательно.

Пример

#include 
      #include 
      main()
      {
        char * msg="Целыми форматами являются:";
        int number=10;
        double num=345.2356;
        printf("%s Hex: 0%x, Decimal:%d, Octal: %o\n",
                         msg, number, number, number);
        printf("\n Точность плавающей точки
                 для PI: %.2f, %.4f, %.8f\n", PI,PI,PI);
        printf("\n %.4f Экспоненциальный формат : %E\n",
                                                   num,num);
      }
link

С++ округление double

http://www.rsdn.ru/forum/cpp/2701723.aspx

C++ документация

http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.bpxbd00/frexp.htm

среда, 6 апреля 2011 г.

Ubuntu узнать характеристики оборудования

Есть хорошая команда которая выводит характеристики обородования компютера-lshw.Введите в терминале;
sudo lshw
Можна используя следующую команду сохранить  в виде HTML документа данные о своей системе;
sudo lshw -html > your-file-name.html
Если нужно данные о каком то конкретном устройстве добавляем -C и имя устройства.

link

пятница, 1 апреля 2011 г.

Linux Клиент - Серверное приложение

http://www.programmersforum.ru/showthread.php?t=118758&page=2

Linux файловая структура

http://www.a-byte.ru/book/export/html/243

14 принципов создания вежливых программ

http://fit-media.com/post_1203349390.html

PHP Оптимизация кода

  • Если метод может быть статическим, сделайте его статическим.
  • echo быстрее, чем print.
  • Передавайте в echo несколько параметров, вместо использования конкатенацию строк.
  • Устанавливайте максимальное количество повторений ваших циклов for до цикла, а не во время его выполнения.
  • Удаляйте свои переменные для освобождения памяти, особенно если это большие массивы.
  • Остерегайтесь волшебных методов, таких как __set, __get, __autoload.
  • require_once дорого обходится.
  • Указывайте полные пути в командах include/require, поиск файла будет идти быстрее.
  • Если вам необходимо определить время, когда скрипт был запущен, лучше используйте $_SERVER[’REQUEST_TIME’] вместо time().
  • Старайтесь применять strncasecmp, strpbrk и stripos вместо регулярных выражений.
  • str_replace быстрее, чем preg_replace, но strtr быстрее, чем str_replace.
  • Если функции замены строк, может принимать в качестве аргументов как массивы, так и одиночные символы, и если ваш список аргументов не слишком длинный, подумайте над тем, чтобы записать несколько одинаковых выражений замены, проходя один символ за раз, вместо одной строки кода, которая принимает массив поиска и замены
  • Лучше использовать конструкции else if, чем несколько конструкций if.
  • Подавление кодов ошибок при использовании @ работает очень медленно.
  • Используйте модуль Apache mod_deflate.
  • Прерывайте свои соединения с БД, когда закончите работать с ними.
  • $row["id"] в семь раз быстрее, чем $row[id].
  • Сообщения об ошибках дорого стоят
  • Не используйте функции внутри условия цикла for, например как здесь: for ($x=0; $x < count($array); $x). Здесь функция count() будет вызываться при каждом проходе цикла.
  • Инкремент локальной переменной в методе - самый быстрый. Почти также работает инкремент локальной переменной в функции.
  • Инкремент глобальной переменной в 2 раза медленее, чем локальной.
  • Инкремент свойства объекта (т.е. $this->prop++) в 3 раза медленнее, чем локальной переменной.
  • Инкремент неопределённой переменной в 9-10 раз медленнее, чем заранее инициализированной.
  • Объявление глобальной переменной, без использования её в функции, также замедляет работу (примерно на ту же величину, что и инкремент локальной переменной). Вероятно, PHP выполняет проверку на существование этой переменной.
  • Скорость вызовов метода, не зависит от количества методов в классе. Я добавил 10 методов в тестовый класс (до и после тестового метода) и производительность не изменилась.
  • Методы в производных классах работают быстрее, чем они же, определённые в базовом классе.
  • Вызов функции с одним параметром и пустым телом функции в среднем равняется 7-8 инкрементам локальной переменной ($localvar++). Вызов похожего метода - примерно равен 15 инкрементам.
  • Ваши строки, определённые при помощи апострофа, а не двойной кавычки, будут интерпретироваться чуть быстрее, т.к. PHP ищет переменные внутри текста в двойных кавычках. Конечно, вы можете использовать это только тогда, когда в вашей строке нет переменных.
  • Строки, разделённые запятыми, выводятся быстрее, чем строки, разделённые точкой. Примечание: это работает только с функцией echo, которая может принимать несколько строк в качестве аргументов.
  • PHP-скрипты будут обрабатываться, как минимум, в 2-10 раз медленнее, чем статические HTML-страницы. Попробуйте использовать больше статических HTML-страниц и меньше скриптов.
  • Ваши PHP-скрипты компилируются каждый раз, если скрипты они не кэшируются. Кэширование обычно увеличивает производительность на 25-100% за счёт экономии времени на компиляцию.
  • Кэшируйте, насколько это возможно. Используйте memcached — это высокопроизводительная система кэширования объектов в памяти, которая повышает скорость веб-приложений за счёт уменьшения времени загрузки БД. Кэшированный микрокод полезен тем, что позволяет вашему скрипту не перекомпилироваться заново для каждого запроса.
  • При работе со строками, для определения длины строки, вы, разумеется, захотите использовать функцию strlen(). Эта функция работает очень быстро, ведь она не выполняет каких-либо вычислений, а лишь возвращает уже известную длину строки, доступную в zval-структуре (внутренняя структура C, используемая при работе с переменными в PHP). Однако потому, что strlen() — функция, она будет работать медленно за счёт вызова некоторых операций, таких как приведение строки в нижний регистр и поиска в хэш-таблице, только после которых будут выполнены основные действия функции. В некоторых случаях вы сможете ускорить свой код за счёт использования хитрости с isset(). Было: if (strlen($foo) < 5) { echo "Foo is too short"; }
    Стало: if (!isset($foo{5})) { echo "Foo is too short"; }
    Вызов isset() быстрее, чем strlen() потому, что isset() - не функция, а языковая конструкция. За счёт этого isset() не имеет практически никаких накладных расходов на определение длины строки.
  • Инкремент или декремент переменной при помощи $i++ происходит немного медленнее, чем ++$i. Это особая специфика PHP, и не нужно таким образом модифицировать свой C и Java-код думая, что он будет работать быстрее, этого не произойдёт. ++$i будет быстрее в PHP потому, что вместо четырёх команд, как в случае с $i++, вам понадобится только три. Пост-инкремент обычно используется при создании временных переменных, которые затем увеличиваются. В то время, как пре-инкремент увеличивает значение оригинальной переменной. Это один из вариантов оптимизации PHP-кода в байт-код утилитой Zend Optimizer. Тем не менее, это хорошая идея, поскольку не все байткод-оптимизаторы оптимизируют это, также остаётся немало скриптов, работающих без оптимизации.
  • Не всё должно быть написано с использованием ООП. Часто это излишне, поскольку методы и объекты занимают много памяти.
  • Не определяйте каждую структуру данных в виде класса - массивы бывают намного полезнее.
  • Не слишком разбивайте методы. Думайте, что вы действительно будете повторно использовать.
  • Вы всегда можете разбить код на методы позже, если возникнет такая необходимость.
  • Используйте сколько угодно предопределённых функций.
  • Если в вашем коде есть функции, работающие очень долго, может стоит их переписать на C в виде расширения?
  • Профилируйте свой код. Профилирование покажет вам, сколько времени выполняются части вашего кода.
  • mod_gzip — модуль Apache, который позволяет сжимать ваши данные на лету и может существенно уменьшить объем передаваемых клиенту данных.
link

Curl GET-запросы

  1.  
  2. function qwe($qerpay)
  3. {
  4. $chp = curl_init("http://xxx/?$qerpay";
  5. curl_setopt($chp, CURLOPT_HEADER, 0);
  6. curl_setopt($chp, CURLOPT_RETURNTRANSFER,1);
  7. curl_setopt($chp, CURLOPT_SSL_VERIFYPEER,0);
  8. $resultp=curl_exec($chp);
  9. curl_close($chp);
  10. $pp = xml_parser_create();
  11. xml_parse_into_struct($pp,$resultp,$valsp,$indexp);
  12. xml_parser_free($pp);
  13. return $valsp['1']['value']; }
     

Unixtime конвертер

http://www.cy-pr.com/tools/time/

PHP Ограничение на размер закачиваемого файла

По умолчанию в PHP стоит ограничение на загрузку файлов не больше 2 Мб. Обычно этого хватает но бывают случаи что необходимо загрузить большие объемы и для этого потребуется увеличить лимиты на загрузку. Для этого нужно сделать небольшие изменения в /etc/php5/cli/php.ini.

Пропишите (измените, если такие уже присутствуют) вот такие строки:
1
2
upload_max_filesize = 10М
post_max_size = 12М
Если у вас нет прав доступа к файлу php.ini попробуйте прописать эти параметры в файле .htaccess который должен находится в корне вашего сайта:
1
2
php_value upload_max_filesize 10M
php_value post_max_size 12M
В данных примерах мы поставили ограничение на загрузку файла максимальным размером в 10Мб и отправку POST данных с максимальным размером в 12Мб.

link

вторник, 29 марта 2011 г.

Ubuntu Аппаратное ускорение/обработка FLASH-видео

1. Скачиваем и устанавливаем Adobe Flash Player 10.2 (x32), и устанавливаем, копируя в папку: /usr/lib/flashplugin-installer/ или /usr/lib/adobe-flashplugin/ в зависимости от того, установлен ли уже Flash Player в системе или нет.
2.Устанавливаем библиотеку libvdpau1:

sudo apt-get install libvdpau1


 


link 

C++ Чтение файла построчно

#include 
#include 
#include 

using namespace std;

int main()
{
     string line;
     ifstream file("hello.world");
     
     getline(file,line);
     cout << line;
}
link

понедельник, 28 марта 2011 г.

Qt Ошибка «undefined reference to vtable»

Программируя на Qt и время от времени проверяя форумы, приходится наблюдать, что программисты часто борятся с сообщениями вида «undefined reference to vtable».
Попробую описать ситуации, когда может возникнуть данная ошибка, и дать несколько советов, как избежать её.
Чаще всего данное сообщение всплывает, если вы используете MOC.
MOC (Meta-Object Compiler, переводится как Метаобъектная система/компилятор) – механизм, который расширяет синтаксис C++.
MOC:
  • необходим для механизма сигналов-слотов;
  • позволяет программисту получать метаинформацию о подклассах QObject (QObject::metaObject());
  • используется для интернационализации приложений (QObject::tr());
  • содержит в себе полезные расширения синтаксиса C++.
MOC компилятор находит и обрабатывает все заголовочные проекта.
При появлении ошибки «undefined reference to vtable», первым делом очистите проект и пересоберите его, не забыв запустить qmake:
make clean
# удалите вручную все moc-файлы, если они остались после выполнения make clean
rm Makefile
qmake
make

Если ошибка не исчезла, то проверьте файл проекта (*.pro). Проверьте, чтобы все необходимые заголовочные файлы (включающие сигналы и слоты особенно) были включены в проект. Список заголовочных файлов должен содержаться в переменной HEADERS:
HEADERS += firstHeaderFile.h \
otherHeaderFile.h \
secondHeaderFile.h

Если вы используете в проекте папку, содержащую заголовочные файлы, убедитесь, что добавили эту папку в переменную INCLUDEPATH:
INCLUDEPATH += ./include
Если обнаружили забытый h-, hpp-файл – пересоберите проект заново.
Проблема осталась? Тогда ещё варианты:
  1. Загляните в c-, cpp-файлы и убедитесь, что классы там не определяются. MOC разбирает только заголовочные файлы;
  2. Каждый класс, который имеет сигналы или слоты должен наследоваться от QObject, напрямую или нет.
    В начале определения таких классов обязательно должнен стоять макрос Q_OBJECT, к примеру:class MyWidget : public QWidget
    {
    Q_OBJECT
    /* класс наследуется от QWidget, а значит и от QObject,
    * следовательно должен содержать макрос Q_OBJECT.
    * Если класс наследуется от QObject, но не содержит сигналов или слотов,
    * то не обязательно включать макрос в описание класса.
    */
    ...
    }
  3. Ещё одна вещь, которую можно проверить.
    Удалите Makefile и посмотрите, что выдаст qmake в Makefile:

    rm Makefile
    qmake

    Откройте Makefile редактором и найдите следующие строки:

    compiler_moc_header_make_all:
    и
    compiler_moc_header_clean:

    Например, в моем Makefile есть:mocclean: compiler_moc_header_clean compiler_moc_source_clean
    mocables: compiler_moc_header_make_all compiler_moc_source_make_all

    compiler_moc_header_make_all:
    release/moc_mainwindow.cpp release/moc_SystemConfiguration.cpp release/moc_InstrumentConfiguration.cpp release/moc_ModuleConfiguration.cpp release/moc_ChannelConfiguration.cpp
    compiler_moc_header_clean:
    -$(DEL_FILE) release\moc_mainwindow.cpp release\moc_SystemConfiguration.cpp release\moc_InstrumentConfiguration.cpp release\moc_ModuleConfiguration.cpp release\moc_ChannelConfiguration.cpp

    Каждый заголовочный файл, содержащийся в проекте и
    нуждающийся в обработке MOC-компилятора, должен находиться в этих строках.
    Имя файла будет начинаться с прифекса «moc_».
    Проверьте, что в список включены все h-файлы (точнее, только те, которые требуют обработку MOC-компилятором).
    Если Вы не обнаружили какой-либо moc-файл, не спешите править руками Makefile,
    просто подправьте pro-файл нужным образом.
    Если файл проекта правилен, то qmake генерирует правильный Makefile.
link

суббота, 26 марта 2011 г.

Ubuntu настройка сети

/etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback
 
# The primary network interface
auto eth0
iface eth0 inet static
        address 10.2.10.32
        #hwaddress ether 12:34:56:78:90:12
        netmask 255.255.255.0
        network 10.2.10.0
        broadcast 10.2.10.255
        gateway 10.2.10.1
        dns-nameservers 212.212.45.174
 
 
# The secondary network interface
auto eth1
iface eth1 inet static
       address 192.168.140.1
       netmask 255.255.255.0
link 

Ubuntu настройка DHCP сервера

Устанавливаем пакет
sudo apt-get install dhcp3-server
редактируем конфиг /etc/dhcp3/dhcpd.conf
если сервер работает только на локальную сеть редактируем /etc/default/dhcp3-server
 
link  

Ubuntu установка EiskaltDC++

EiskaltDC++ программа для обмена в p2p сетях.

sudo add-apt-repository ppa:tehnick/tehnick
sudo apt-get update
sudo apt-get install eiskaltdcpp
 
link  

пятница, 25 марта 2011 г.

cURL игнорирование сертификатов в https соединении

В php: curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
В коммандной строке: используя ключ -k/--insecure
 
link 

четверг, 24 марта 2011 г.

Ubuntu Подключение к удаленному рабочему столу

vnc
rdp
http://forum.ubuntu.ru/index.php?topic=110337.0
http://ubuntologia.ru/forum/viewtopic.php?f=93&t=340
http://nuclear-imaging.info/site_content/2010/04/19/vnc-server-setup-for-ubuntu-10-04-lucid-lynx/
http://linuxsoid.blogspot.com/2009/08/ubuntulinux-windows.html

PHP спецсимвол табуляции в строке

\t - горизонтальная табуляция (HT или 0x09 (9) в ASCII)

link

PHP Вставить n символов в строку

можно использовать str_repeat которая на входе принимает строку или символ которые нужно повторить и количество повторений.. полученную строку можно добавить в нужную нам
link

есть еще str_pad link

Ubuntu How To Install EiskaltDC++

Add the PPA with the command:
sudo add-apt-repository ppa:tehnick/tehnick
Update the program list with the command:
sudo apt-get update
Finally, install EiskaltDC++ with the command:
For stable version:
sudo apt-get install eiskaltdcpp
For unstable version:
sudo apt-get install eiskaltdcpp-unstable
 
link 

среда, 23 марта 2011 г.

PHP. Сохранение массива в файл

$fp=fopen('tmp','w');
if($fp)
{
    fwrite($fp,"\$_array=>array(\r\n");
    array_to_file($res_obj,1,$fp);
    fwrite($fp,")\r\n");
    fclose($fp);
}

//на входе массив, количество отступов, и файловый дескриптор  
function array_to_file($arr,$i,$fp)
{
//устанавливаем отступ
    $tab = str_repeat("\t",$i);
    foreach($arr as $key => $val)
    {
        if(is_array($val))
        {
            $tmp = "$tab'$key'=>array(\r\n";
            fwrite($fp,$tmp);
            array_to_file($val,++$i,$fp);
            if( next($arr) === false) $com = '';
            else $com = ',';
            fwrite($fp,"$tab)$com\r\n");
        }
        else
        {
            if( next($arr) === false) $com = '';
            else $com = ',';
            fwrite($fp,"$tab'$key'=>'$val'$com\r\n");
        }
    }   
}   

такие массивы удобно использовать используя include(array_file.inc);
важно помнить что область видимости ограниченна фигурными скобками

http://it.nittis.ru/php-save-array-as-file.html

вторник, 22 марта 2011 г.

Ubuntu Сочетания клавиш (shortcuts)

http://forum.ubuntu.ru/index.php?topic=32541.0

Qt полноэкранное приложение

    MainWindow w;
//    w.setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint | Qt::SubWindow);
//    w.showFullScreen();
link
link

Установка Qt SDK на Ubuntu

http://sergiig.wordpress.com/2009/07/21/install-qt-sdk-on-ubuntu/

QtCreator собрать проект статически

в pro файле написать
CONFIG += static

link

Qt воспроизведение swf

http://www.prog.org.ru/topic_15531_0.html
http://www.qtcentre.org/threads/20531-qt-and-swf-object

Ошибка компиляции 'undefined reference to `vtable for Class'

Вопрос:
Как исправить 'undefined reference to `vtable for Class'?
Ответ:
Реализовать для 'Class' все виртуальные методы, и не грешить на конструкторы, MOC или g++.

ИЛИ

В родительском классе объявить виртуальные методы чистыми виртуальным, то есть сделать родительский класс абстрактным.


ИЛИ

Скорее правильнее, реализовать все виртуальные функции которые не  объявлены чистыми виртуальными в родительском или объявить их таковыми.
 

Firefox плагин для киоска

https://addons.mozilla.org/en-US/firefox/addon/r-kiosk/

http://qnub.lost-team.org/2009/10/firefox-kiosk-mode.html

http://www.kubuntu.ru/node/5682

Qt установка. Ошибка configure

Если configure выводит ошибку:
Basic XLib functionality test failed!
 You might need to modify the include and library search paths by editing
 QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/wag/Dist/Src/qt-x11-opensource-src-4.5.1/mkspecs/linux-g++


необходимо установить libxext-dev

link 
link 

пятница, 18 марта 2011 г.

GRUB

http://www.ubuntologia.ru/grub2-settings-file

http://forum.ubuntu.ru/?topic=74165.0

Ubuntu астраиваем вид апплета часов

http://www.bubuntu.spb.ru/customize-the-clock-applet/

Sh

http://house.hcn-strela.ru/BSDCert/BSDA-course/ch07s07.html#3.7.7-sh-var

http://nicwiki.im/index.php/Sh_script

Bash

http://ss64.com/bash/

http://www.nixp.ru/forum/%D0%9A%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B/Bash-If-then

http://www.opennet.ru/openforum/vsluhforumID1/9933.html

http://www.linuxconfig.org/bash-scripting-tutorial#9-bash-if--else--fi-statements

http://poplinux.ru/adv-bash/chapter-8.1.html

Ubuntu System V init.d

http://rus-linux.net/nlib.php?name=/MyLDP/BOOKS/ubuntu_hacks_ru/ubuntuhack77.html

http://linux.yaroslavl.ru/docs/setup/mandrake/cl/sysv-levels.html

http://meandubuntu.ru/2009/08/%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82-%D0%B0%D0%B2%D1%82%D0%BE%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0-%D0%B2-ubuntu/

Ubuntu Шпаргалка по командам

http://silverghost.org.ua/2009/06/02/shpargalka-po-komandam-v-ubuntu-obraznyx-distributivax/

Ubuntu флаги для индикатора раскладки клавиатуры

mkdir -p ~/.icons/flags
cd ~/.icons/flags
wget http://zeroed.ru/xlam/files/gnome/lookandfeel/flags/{ru,us}.svg
картинки могут быть  png или svg размером 48*48 и менее

gconftool-2 --type bool --set /desktop/gnome/peripherals/keyboard/indicator/showFlags true


 


http://ubuntologia.ru/gnome-applets 


http://forum.ubuntu.ru/index.php?topic=84817.0 

четверг, 17 марта 2011 г.

Qt Взаимодействие нитей(thread)

class MyObject : public QObject
{
    Q_OBJECTpublic slots:
    void MySlot( void )
    {
        std::cout << "slot called" << std::endl;
    }
};
class CThread1 : public QThread
{
    Q_OBJECTpublic:
    void run( void )
    {
        std::cout << "thread 1 started" << std::endl;
        int i = 0;
        while(1)
        {
           msleep( 200 );
           i++;
           if(i==1000)
              emit MySignal();
        }
    }
signals:
    void MySignal( void );
};
class CThread2 : public QThread
{
    Q_OBJECTpublic:
    void run( void )
    {
        std::cout << "thread 2 started" << std::endl;
        exec();
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    CThread1 oThread1;
    CThread2 oThread2;
    MyObject myObject;
    QObject::connect( & oThread1, SIGNAL( MySignal() ),
        & myObject, SLOT( MySlot() ) );
    oThread2.start();
    myObject.moveToThread(&oThread2)
    oThread1.start();
    return a.exec();
}
 
link 

Правила оформления программного кода

http://www.yukosh.ru/library/rules/

C++ Coding Standard

http://www.possibility.com/Cpp/CppCodingStandard.html#snames

С++ Оформление константных значений в классах

class MyClass {
//.................
public:
static const int n = 5;
//.................
};
int a[MyClass::n];
 

http://forum.codenet.ru/archive/index.php/t-50605.html

среда, 16 марта 2011 г.

Qt Убить поток

http://www.prog.org.ru/topic_16128_15.html

http://www.rsdn.ru/forum/cpp.qt/3387749.all.aspx

http://www.prog.org.ru/topic_5308_0.html

http://www.forum.crossplatform.ru/index.php?showtopic=4860

http://hghltd.yandex.net/yandbtm?fmode=inject&url=http%3A%2F%2Fforum.vingrad.ru%2Fforum%2Ftopic-297581.html&text=qthread%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%20%D0%BD%D0%B0%20%D1%80%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8F&l10n=ru&sign=11e597438e66f79218feb8b392b6bdc2&keyno=0

http://www.forum.crossplatform.ru/lofiversion/index.php/t1615.html

http://stackoverflow.com/questions/1898636/how-can-i-terminate-a-qthread

http://forum.vingrad.ru/forum/topic-200719.html

Qt QObject: Cannot create children for a parent that is in a different thread.

QObject: Cannot create children for a parent that is in a different thread.
Это сообщение появляется когда созданный процесс не завершился. По причине например того что в нем подвис QNetworkAccessManager..

http://stackoverflow.com/questions/3268073/qobject-cannot-create-children-for-a-parent-that-is-in-a-different-thread

http://www.qtcentre.org/archive/index.php/t-19670.html  

http://www.forum.crossplatform.ru/index.php?showtopic=4860

C++ лишние скобки

http://stackoverflow.com/questions/877523/error-request-for-member-in-which-is-of-non-class-type