Sqlite. Внешние sql - запросы

Для импорта sql - скриптов в sqlite - shell есть такая возможность

sqlite3 database_name.db ".read external.sql"

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

Node.js. Установка mysql клиента на Win32 платформе

Для установки mysql клиента нужно установить модуль node-mysql.


Это можно сделать двумя путями:
1. С помощью npm - Node Package Manager, для этого в командной строке вводим команду

npm install mysql




и ждем окончательной установки;
2. С помощью вспомогательной утилиты ryppi.py ("питоновский" файл). Скачать можно здесь - https://github.com/japj/ryppi. За что разработчику japj большое спасибо. Помимо этого необходимо установить python http://www.python.org/. Далее переходите в
командной строке к месту где будет располагаться данный файлик и запускаем установку модуля node-mysql следующей командой

ryppi.py install mysql




3. Можно скачать с сайта "гитхаба" https://github.com/ zip-архивчик с соответствующими файлами и папочками, надо погуглить, с последующей распаковкой в директорию node_modules. Правда сам не пробовал :)
В итоге в папке node_modules появиться папочка mysql. Это хороший знак.
Теперь можно перейти к работе с модулем на нашем javascript-фреймворке.

// Подключение модуля
var Client = require('mysql').Client,
        client = new Client();

// Инициализация клиента
client.user = 'root';
client.password = '';

// Подключаем базу данных My_db
client.query('Use My_db');

// Создаем запрос
client.query('SELECT * FROM users', function(error, result, fields){
// Если возникла ошибка выбрасываем исключение
        if (error){
                throw error;
        }
// Выводим результат
console.log(fields);
console.log(result);
// Завершаем соединение
client.end();
});

Если данный код сохранить в файле mysql.js, тогда можно его запустить,
надо не забывать о переходе в командной строке к его месту расположения

node mysql.js

Ошибок нет. На выходе видим корректные результаты выполненного запроса.













Кстати, для тестирования (а оно для этого и нужно) всего вышеописанного можно воспользоваться проектом - denwer - http://www.denwer.ru/. Желаю Вам удачи :)

Остановка служб во время загрузки системы Red Hat. Интерактивный режим

Как остановить некоторые службы во время загрузки операционной системы Red Hat?
Для этого есть возможность войти в интерактивный режим:
после начала загрузчика GRUB (GRand Unified Bootloader) и прогрузки ядра запустится первый системный процесс INIT.








Перед тем, как он начнет запускать службы (демоны) будет выведено предложение:
Press 'I' to enter interactive startup
Главное успеть нажать 'i'. Далее Вы сможете вручную определять возможность запуска или останова того или иного демона.
После всего этого, необходимо проверить настройки проблемной службы. Если служба сама по себе избыточна для Ваших нужд, то есть не нужна, можно отредактировать
список символьных ссылок на файлы в каталоге /etc/init.d (автозагрузка) с помощью команд:
chkconfig --list (выводит список демонов)
chkconfig --del sendmail (удаление демона, в примере - sendmail)

Однажды при перезагрузке сервера (Red Hat Enterprise Linux Server 5.5 64bit) произошел казус: система доходила до служб sendmail и sm-client:
Starting sendmail
Starting sm-client
И все... Ожидание в полчаса ни к чему не привело. Базу данных нужно было пускать в работу. Далее сделал все так, как описано выше. Правда, разбираться в данном сбое не стал: нет времени ;)

RAID массив на основе IBM System Storage DS3512 и IBM System Storage EXP3512


В моем случае дисковый массив IBM System Storage DS3512 Express Dual Controller Storage System (Модели 1746A2S / 1746A2D и 1746A4S / 1746A4D) и дополнительная полка расширения IBM System Storage EXP3512 (Модель 1746A2E) подключены к шасси IBM eServer Blade Center E Chassis, в которые установлены "сервера-лезвия" IBM HS22; все собрано и произведен успешный запуск.

Соответствующий RAID на основе IBM System Storage DS3512 и IBM System Storage EXP3512 поднимается на основе управляющего программного обеспечения - IBM System Storage DS Storage Manager (входит в комплект поставки). После установки вид интерфейса данного менеджера приведен на нижнем рисунке.









Итерфейс дружелюбный, поэтому разобраться в том, как объединять диски в
соответствующий RAID не должно вызывать трудностей. Главное понимать, что Вам нужно и читать все всплывающие диалоговые боксы. После того, как был организован опреденный RAID, для дальнейшей подвязки его к определенной операционной системе, инсталлированной на определенном "лезвии" запускается мастер создания логических
разделов Intoduction (Create Logical Drive), в котором будет сформирован LUN на созданном RAID-массиве. LUN - Logical Unit Number - адрес диска, точнее дискового устройства в дисковом массиве (метод адрессации). Во время работы данного мастера на
одном из этапов необходимо указать Host Type (operation system) (в зависимости от того, какая система установлена на "лезвии", например - Linux).

Далее необходимо произвести маппинг лунов к хостам.









Перед этим необходимо проделать следующее:
Обратимся к шасси IBM eServer Blade Center (в его корзинах интегрированы сервера-лезвия IBM HS22) через его менеджер реализованный в виде веб-интерфейса - IBM Blade Center Advanced Management Module. В разделе данного менеджера I/O Modul Tasks выбираем опцию Configuration и в разделах слотов (Slot1 Slot2 Slot3 Slot4) управления ESM (Environmental services module), взаимодействующие через порты SAS (6Gb/s) с нашим дисковым массивом прописываем их ip-адреса.

Далее также через браузер "стучимся" на прописанные ip-адреса по http порту. Войдя в веб-интерфейс в разделе Health and Monitoring | Monitor SAS Module запоминаем значение поля Address в строке соответствующей тому сервер-лезвию, на котором инсталлирована
определенная операционная система и которая в дальнейшем запланирована на подключение определенного RAID массива.

После этого в менеджере IBM System Storage DS Storage Manager в разделе Maping необходимо создать хосты (Host): в структурном дереве Topology правый клик на элементе Default Group выбираем Define далее Host. Прописываем
Host name, указываем No на вопрос Do you plan to use storage partitions? кликаем Next. Во всплывшем окне Unnamed - Specify Host Port Identifiers (Define Host) щелкаем переключатель Add by selecting a known unassociated host port identifier и в выпадающем списке поля Known unassociated host port identifier выбираем адрес порта нужного сервера-лезвия и прописываем Alias (псевдоимя). Также в окне Unnamed - Specify Host Type (Define Host) нужно указать тип операционной системы. Далее в окне Unnamed - Preview (Define Host) жмем Finish. Так же создаются и другие хосты
(для других "серверов-лезвий").

Далее производим маппинг лунов к созданным хостам.
В таблице Defined Mappings находим созданный хост, запомните значение поля
LUN. Правый клик по хосту. В выпавшем меню выбираем Change mapping... В выпадающем списке Host group... выбираем то имя, которое было указано на этапе создания хоста. А в выпадающем списке Logikal unit Number выбираем то значение, которое изначально было сопоставлено хосту в таблице Defined Mappings. Жмем OK. Также повторяем и для других хостов. В окне Topology внешний вид хостов изменится на бочонки и сменят свою позицию на Unassociated Host Port Identifiers.









Все готово для инициализации лунов непосредственно в Вашей операционной системе (например в Linux можно произвести монтирование соответствующего RAID массива).








Всем удачи, может кому и пригодиться :)

С++. Конкатенация (объединение) строк

Для объединения строк str1 и str2 воспользуемся следующей конструкцией:

1) Создаем массив str3 для помещения конечного результата:
char str3[n]; n - необходимо задать исходя из потребностей;
2) Копируем в массив str1, например:
strcpy(str3, str1);
3) Объединяем заполненный массив со строкой str2:
strcat(str3, str2);

Данная конструкция связана с тем, что строка представляет собой строковую постоянную (литерал), а общая форма функций strcpy() и strcat() имеет следующий вид:
char* strcpy(char* dest, const char* source)
char* strcat(char* dest, const char* source)
dest - направление,
source - источник.

Здесь есть одна оговорка. Для объединения строк str1 и str2 прибегать к помощи массива str3[n] не совсем обязательно. Ведь можно их объединить и так. Допустим мы хотим к str1 присоединить str2, тогда - strcat(str1, str2). Это возможно только если str1 задан как:

char str1[m] = "Some text";

но не как:

char str1[] = "Some text";

При этом нужно указать значение m такое, чтобы размер массива str1 (ведь символьная строка есть ничто иное как массив, состоящий из символьных элементов и признака конца строки - NULL или '\0') мог содержать как свой набор символов, так и включить строку str2. По сути, это расширение области памяти символьной строки (точнее - массива). Небольшой пример.

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
  
    char str1[30] = "My favorite number is ";

    char str2[] = "16";

    strcat(str1, str2);

    cout << str1 << endl;

    return 0;



В данном случае все работоспособно и компилятор укажет нам зеленый свет. Но если попытаться сделать так:

#include <iostream>
#include <stdlib.h>

using namespace std;


int main()

{
  
    char str1[] = "My favorite number is ";
    char str2[] = "16";
    strcat(str1, str2);
    cout << str1 << endl;
    return 0;
}


то компилятор изначально не обругается, но на стадии дебага вылетит сообщение о стековом конфликте . Действительно, хотя здесь и нет синтаксической ошибки, все же ошибка всплывет тогда, когда функция попытается вписать str2 в ограниченную область памяти, то есть в массив str1, в домике которого есть место только для него.
Все логично, не так ли?





 

С++. Обращение к командам операционной системы

Пример обращения к командам операционной системы с помощью #include < stdlib.h >

#include < iostream >
#include < stdlib.h >

using namespace std;

void main() {

          //Выделяем память под строки
          char ipaddress[16];
          char result[30];

          //Запрос и ввод ip-адресса в массив ipaddress
          cout << "Enter some ip-address:" << endl;
          cin >> ipaddress;

          //Копирование и конкатенация строк в массиве result
          strcpy(result, "ping -n 1 ");
          strcat(result, ipaddress);

          //Обращение к функции system() определенной в stdlib.h
          //system() инициирует запуск команд операционной системы
          system(result);
          system("echo It`s working...");

}