среда, 23 апреля 2014 г.

Установка поддержки 32-х битной архитектуры в 64-х битной Ubuntu 14.04

В ubunt`ах, включительно по 13.04, сабж реализовывался так:
$sudo apt-get install ia32-libs

Начиная с версии 13.10, вышеуказанный пакет зачем-то "выпилили". Теперь поддержка 32-х архитектуры включается так:
$sudo dpkg --add-architecture i386
$sudo apt-get update

Устанавливать 32-х битные пакеты можно таким образом:
#dpkg -i package-name.deb
или
$sudo apt-get install package-name:i386

Если есть какие то зависимости, например, libc6, то просто выполняем команду:
$sudo apt-get install libc6:i386

Опять же:
$sudo apt-get -f install
никто не отменял ;)

И чтобы не было проблем со Skype и другими 32-битными qt-приложениями, то ставим:
$sudo apt-get install sni-qt:i386 lsb-core libqt4-dbus libqt4-network libqt4-xml libasound2
$sudo apt-get -f install
 

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

Очистка оперативной памяти от кэша в Linux

При частых операциях с файлами, особенно с большими, Linux кеширует эти самые файлы в оперативную память. В принципе, в этом нет ничего страшного, потому что как только, занятая закешированными файлами, оперативная память понадобится ядру, она будет частично освобождена для более приоритетной задачи. Однако, например, когда сервер 1с выполняет операции с "объемным" набором данных, этого высвобождения памяти не происходит и сервер "ложится" по причине отсутствия оперативной памяти.
Для того, чтобы посмотреть сколько оперативной памяти занято и сколько закешировано в данный момент, можно воспользоваться командой free (параметр "-g" означает отображать в гигабайтах, "-m" соответственно в мегабайтах).


$free -g
                               total       used       free     shared    buffers     cached
Mem:                            7          7          0          0          0          5
-/+ buffers/cache:          1          6
Swap:                           5          0          5


$free -m
                              total       used       free     shared    buffers     cached
Mem:                     8063       7616        447          0        283       5414
-/+ buffers/cache:    1918       6145
Swap:                    5723         52       5671

Как видно из выхлопа, откешировано у нас аж 5 Гб. Чтобы освободить память от кеша, можно выполнить команду:

#echo 3 > /proc/sys/vm/drop_caches

Если такая ситуация происходит довольно часто,  можно выполнять данную команду по cron`y

четверг, 3 апреля 2014 г.

1С. Запись/чтение "ТаблицыЗначений" в/из XML

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

Функция сохранения таблицы значений в XML:
Функция СохранитьТаблицуЗначенийВXML(Таблица, ФайлXML)
    Попытка
        Запись = Новый ЗаписьXML();
        Запись.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ошибка при создание XML файла! " + Символы.ПС + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;      
    
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("root"); 
    
    МасКолонки = Новый Массив();
    Запись.ЗаписатьНачалоЭлемента("columns");  
    Для Ном = 0 по Таблица.Колонки.Количество()-1 цикл         
        Колонка = Таблица.Колонки[Ном];
        МасКолонки.Добавить(Колонка.Имя);
        
        Запись.ЗаписатьНачалоЭлемента("colum");
        Запись.ЗаписатьАтрибут("Name",Колонка.Имя);
        Запись.ЗаписатьАтрибут("Type",Строка(Колонка.ТипЗначения));
        Запись.ЗаписатьКонецЭлемента();  // colum      
    КонецЦикла;    
    Запись.ЗаписатьКонецЭлемента();  // columns
    
    Запись.ЗаписатьНачалоЭлемента("records");  
    Для Каждого СтрТаблицы из Таблица цикл
        
        Запись.ЗаписатьНачалоЭлемента("record");
        Для каждого ИмяКолонки из МасКолонки цикл
            Запись.ЗаписатьНачалоЭлемента(ИмяКолонки);
            Значение = Строка(СтрТаблицы[ИмяКолонки]);
            Запись.ЗаписатьСекциюCDATA(Значение);
            Запись.ЗаписатьКонецЭлемента();
        КонецЦикла;        
        Запись.ЗаписатьКонецЭлемента();
    КонецЦикла;    
    
    Запись.ЗаписатьКонецЭлемента();  // records    
    Запись.ЗаписатьКонецЭлемента();  // root       
    Запись.Закрыть();
    
    Возврат Истина;
КонецФункции



Функция чтения таблицы значений из XML:
Функция ЗагрузитьТаблицаЗначенийИзXML(ФайлXML)
    
    Попытка
        Чтение = Новый ЧтениеXML();
        Чтение.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ощибка при чтение данных из XML!" + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;     
    
    ТЗ = Новый ТаблицаЗначений;
    Атрибут = Новый Соответствие;
    МассивКолонок = Новый Массив; 
    ТаблицаПостроена = Ложь;
    
    // Строим таблицу значений     
    Пока Чтение.Прочитать() Цикл       
        // Данные по колонке пошли
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "colum" тогда
            Атрибут.Очистить();
            Пока Чтение.ПрочитатьАтрибут() цикл
                Атрибут[Чтение.Имя] = Чтение.Значение;             
            КонецЦикла;
            ТЗ.Колонки.Добавить(Атрибут["Name"], Новый ОписаниеТипов(Атрибут["Type"]));
            МассивКолонок.Добавить(Атрибут["Name"]);
        КонецЕсли;         
        
        // Данные по колонке закончились
        Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "columns" тогда     
            ТаблицаПостроена = Истина;
        КонецЕсли;
        
        Если Не ТаблицаПостроена тогда
            Продолжить;
        КонецЕсли;         
        
        // Началась запись в таблице значений
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "record" тогда                     
            ЗаписьТЗ = ТЗ.Добавить();         
            Пока Чтение.Прочитать() цикл                           
                // Конец данных по записи
                Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "record" тогда
                    Прервать;
                КонецЕсли; 
                
                // Есть такая колонка в нашей ТаблицеЗначений
                Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и
                     МассивКолонок.Найти(Чтение.Имя) <> Неопределено тогда
                    
                    ИмяКолонки = Чтение.Имя;
                    Чтение.Прочитать();
                    Если Чтение.ТипУзла = ТипУзлаXML.Текст тогда
                        ЗаписьТЗ[ИмяКолонки]= СокрЛП(Чтение.Значение);
                    КонецЕсли;                     
                КонецЕсли;                                             
            КонецЦикла;                           
        КонецЕсли; // Данные в таблице
        
    КонецЦикла;
    Возврат ТЗ;
КонецФункции