понедельник, 17 февраля 2014 г.

Чтение файла построчно в массив в Bash

Недавно столкнулся с данной проблемой. Есть файл, в нем построчно написаны имена узлов. Необходимо прочитать этот файл таким образом, чтобы иметь доступ к этому набору данных по индексу.
Самое распространенное решение, которое выдает гугл:
i=0; n=0
cat file.txt |
{
while read s
do
 let "n++";  let "i++"
 var[$i]="$s"
done
}
Но, у меня, криворукого, массив не был виден за пределами фигурных скобок. Однако, спустя некоторое время, было найдено более красивое решение - встроенная в bash функция mapfile, которая полностью выполняет поставленную задачу.
Использование:

mapfile -t hosts < ./hostfile

В массиве hosts у нас все строчки, которые лежат в hostfile, из которых убраны все лишние знаки табуляции и переноса строк (ключ -t).

четверг, 25 июля 2013 г.

Включаем поддерку нестандартных модулей Qt при сборке с помощью CMAKE

О сборке Qt проектов с помощью CMake написано много. Однако в моем проекте я столкнулся со следующей трудностью - при использовании модуля QtXml проект не собирался. Хотя в секцию target_link_libraries была добавлена запись ${QT_LIBRARIES}.
Как оказалось, для включения дополнительных модулей (Network, SQL, SVG, XML etc) необходимо добавить в CMakeLists.txt запись вида SET(QT_USE_QTXML TRUE).

пятница, 8 марта 2013 г.

Включаем поддержку C++11 в Qt Creator

Дано - Kubuntu 12.10 Linux, Qt 4.8.3, gcc 4.7.2. Хочется попробовать все фишки новго стандарта. Компилятор их поддерживает, однако QtCreator ругается на их использование. Причина в том, что компилятор по умолчанию компилирует код, используя стандарт C++03. Исправить это можно путем добавления в описание проекта (.pro файл) строчку:
QMAKE_CXXFLAGS += -std=c++0x
Теперь можно с легкостью познать всю мощь нового стандарта.
По материалам: http://www.richelbilderbeek.nl/CppAuto.htm

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

Смена канала обновления Google Chrome.

Сидеть на канале "stable" не интересно. Основные плюшки внедряются в каналы "dev"  и "beta". Переключить браузер на новый канал из настроек не получится - необходимо качать для каждого канала собственную сборку. Для Linux ситуация усугубляется тем, что для каждого пакетного менеджера надо еще и пакет свой собрать. Ссылки на  скачку установочных пакетов для всех поддерживаемых операционных систем (Windows, Linux, MacOS, Android) и всех каналов (stable, beta, dev) можно найти здесь. Для линукса поддерживается только "deb" и "rpm", кстати.

пятница, 1 марта 2013 г.

KolibriOS и MenuetOS. Различия.

Всегда интересовал данный вопрос. Во многих источниках писали через слеш названия обоих операционных систем. Может последовать неправильный вывод, что это одна и та же операционная система.
На самом деле, KolibriOS первоначально развивалась как форк MenuetOS, однако уже к версии 0.50 различия в коде составили 50%. А в 2007 году (так и не понял, какая версия) модель памяти была изменена и программы для двух ОС стали бинарно несовместимы.
Причина форка в том, что автор оригинальной системы MenuetOS Вилле Турьянмаа сосредоточил свои усилия на создании 64-битной версии своей системы. И закрыл ее исходники. Кстати, в отличии от KolibriOS, Menuet64 имеет полную поддержку сетевого стека и драйвера на самые распространенные сетевые карты. Вот вам и opensource.
Так что пока 32-битная версия MenuetOS потихоньку загнивает, KolibriOS во всю пилится русскоязычными и не очень программистами. Советую обратить свое внимание на последнюю. Все-таки  размер русскоязычного сообщества облегчает вхождение.
Подробнее про разногласия и форк: http://kolibri-n.org/inf/let_it_fly/index.php 

четверг, 7 февраля 2013 г.

Решение проблемы с установкой пакетов через apt на свежеустановленном Debian.

Итак, на машину только что установлена система с первого диска Debian. Обновляем список пакетов командой:
root@webserver:/home/kutsd# apt-get update
После этого пытаемся поставить что-либо командой:
root@webserver:/home/kutsd# apt-get install mc
На что получаем ошибку следующего типа:

root@webserver:/home/kutsd# apt-get install mc
Чтение списков пакетов... Готово
Построение дерева зависимостей       
Чтение информации о состоянии... Готово
Будут установлены следующие дополнительные пакеты:
  libglib2.0-0 libglib2.0-data shared-mime-info
Предлагаемые пакеты:
  zip unzip bzip2 arj xpdf-reader pdf-viewer dbview odt2txt gv catdvi djvulibre-bin imagemagick python-boto python-tz
НОВЫЕ пакеты, которые будут установлены:
  libglib2.0-0 libglib2.0-data mc shared-mime-info
обновлено 0, установлено 4 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 2 173 kB/5 039 kB архивов.
После данной операции, объём занятого дискового пространства возрастёт на 16,7 MB.
Хотите продолжить [Д/н]? y
Смена носителя: вставьте диск с меткой
 'Debian GNU/Linux 6.0.6 _Squeeze_ - Official i386 CD Binary-1 20120929-15:56'
в устройство '/media/cdrom/' и нажмите ввод
Все дело в том, что система считает что у нас есть весь набор дисков и пытается установить ПО с диска. Для того, чтобы запретить ей искать ПО на дисках, а качать его из интернета необходимо в файле /etc/apt/sources.list закомментировать любые строчки источником cdrom. В моем случае это была строка:
deb cdrom:[Debian GNU/Linux 6.0.6 _Squeeze_ - Official i386 CD Binary-1 20120929-15:56]/ squeeze main
После этого надо еще раз обновить список пакетов и можно устанавливать пакеты из сети.

пятница, 1 февраля 2013 г.

Выполнение команд на удаленном сервере

Я писал скрипт бэкапа данных с удаленного сервера и столкнулся с проблемой. Вот строчки скрипта:

ssh testuser@192.168.0.188 
cd testdir
Как мне казалось, тут нет никакой ошибки. Однако первый же запуск окончился неудачей. Как оказалось, ssh устанавливает соединение и сразу же передает управление консоли удаленного сервера. Однако скрипт-то запущен на локальной машине! Поэтому нас встречает приглашение от удаленного сервера. Завершив сеанс ssh по Ctrl+C, я смог наблюдать как команды скрипта выполнялись дальше. Но на локальной машине, а не на удаленной.
Я нашел выход следующим образом: ssh может выполнять указанную команду самостоятельно, при этом он открывает соединение, выполняет команду и закрывает соединение. Поскольку команд у меня несколько, я обернул их в скрипт и запускаю его следующим образом:
ssh testuser@192.168.0.188 ./backupserv.sh