Advanced Packaging Tool (APT) – набор утилит для управления программными пакетами в операционных системах основанных на Debian.
APT позволяет:
- устанавливать, удалять и обновлять пакеты
- решать зависимости
- искать пакеты по заданным критериям
- просматривать подробную информацию о пакете
- манипулировать ключами от репозиториев
APT является одной из базовых программ и включена в состав Ubuntu.
Настройки APT
Все файлы настроек APT хранятся в директории /etc/apt
/etc/apt/apt.conf – основной файл настроек, используемый всеми инструментами из состава APT.
Описание всех возможных настроек и опций можно прочитать в документации к нему:
man apt.conf
apt.conf.d - директория содержащая в себе файлы конфигурации, аналогичные по синтаксису apt.conf.
При помощи этой директории можно быстро и удобно манипулировать настройками APT добавляя или удаляя подготовленные файлы с настройками.
auth.conf - файл, содержащий ключи, для авторизации в репозиториях. Например, туда добавляются логины и пароли от репозиториев к купленным в Центре приложений программам.
sources.list - файл с перечнем репозиториев.
sources.list.d - директория с файлами репозиторий, по назначению аналогичных sources.list. Каждый репозиторий описывается в отдельном файле.
Использование APT
В APT входит несколько утилит, выполняющих отдельные задачи.
apt-get - это утилита управления пакетами.
apt-get требует прав суперпользователя для своей работы.
Основные команды:
update - Обновить информацию о пакетах, содержащихся в репозиториях.
install foo - Установить пакет foo. Скачивание, установка и настройка происходят автоматически. Если для настройки пакета foo нужны дополнительные сведения, будет показан запрос к пользователю.
upgrade - Обновление пакетов, для которых в репозитории доступны новые версии.
dist-upgrade - Обновление пакетов, требующих разрешения зависимостей (установка дополнительных или удаление конфликтующих пакетов).
remove foo - Удаление пакета foo из системы.
purge foo - Удаление пакета foo и очистка системы от его конфигурационных файлов. Файлы настроек в домашних каталогах пользователей удалены не будут.
autoremove - Удаление пакета, который более не нужен в системе. Используется для очистки системы от ненужных пакетов. Факт, что пакет более не нужен, определяется следующим образом: если пакет был установлен не сам по себе, а как зависимость для другого пакета, который впоследствии был удалён, значит этот пакет тоже уже не нужен в системе.
source foo - Получение исходных текстов пакета foo.
build-dep foo - Получение зависимостей для сборки пакета foo.
Починка базы пакетов
apt-get также используется для устранения сбоев в базе пакетов вызванных нарушенными зависимостями. Разрешение зависимостей производится командой:
sudo apt-get install -f
apt-cache – утилита, позволяющая выполнять запросы к кешу APT.
Основные команды:
search - Поиск пакета по части названия или описания. Поддерживает регулярные выражения.
show - Информация о пакете: версия, размер, описание и т. п.
depends - Зависимости указанного пакета.
rdepends - Обратные зависимости пакета.
apt-key служит для добавления ключей от репозиториев в систему. Ключи защищают репозитории от возможности подделки пакета.
Основные команды:
add - Добавление ключа в базу доверенных ключей.
del - Удаление ключа из доверенных.
В завершении приведу вот такую проблемку, которая может возникнуть во время установки того или иного приложения, например - midnight commander (mc). При попытке установки
sudo apt-get install mc
система выбрасывает в консоль сообщение о невозможности найти необходимый пакет
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package mc
Одним из возможных решений может оказаться попытка обновить информацию о пакетах, находящихся в соответствующих репозиториях.
sudo apt-get update
Для успешности данного обновления ваша рабочая станция или сервер должны иметь выход в инет (если нужно настроить выход через прокси, можно заглянуть сюда) и в файле - sources.list - должны быть прописаны соответствующие репозитории.
После этого, если нет иных проблем, установка должна пройти успешно. Всем успехов!
Javascript. Initialization Date object by some date string
var date = new Date($("#date_field").val().replace(/(\d+).(\d+).(\d+)/, "$3/$2/$1"));
Duff's device construction in C/C++/Java/PHP/Javascript
В 1983 году Томас Дуглас Дафф из Торонто во время оптимизации раскрутки одного цикла открыл необычную конструкцию на C:
Он обнаружил, что с выражением switch можно выделывать весьма хитрые фокусы. Пока вы соблюдаете синтаксис, вы можете вкладывать в выражение switch различные выражения выбора или итерации, что позволяет эффективно переходить в любую функцию или выходить из нее. Здесь можно ознакомиться с перепиской Даффа, где он рассказывает о своем открытии.
Вот пара примеров:
// первая итерация начинается с определенной метки case
switch (num % 5) {
case 0: do { i++;
case 4: i++;
case 3: i++;
case 2: i++;
case 1: i++;
} while (--n > 0);
}
или так
switch (num % 2) {
case 0: do { std::cout << "num = " << num << std::endl;;
case 1: std::cout << "num = " << num << std::endl;;
} while (--num > 0);
}
Причем все они компилируются и работают. Я встречал использование такого трюка в примерах написания так называемых сопрограмм, определяемых в макросах. Вот пример - msdn.
Стоит отметить, что данная особенность - при отсутствии break, управление внутри блока передаётся «вниз и насквозь» от инструкции, стоящей под одной меткой case, к инструкции, стоящей под следующей меткой case - характерна только для С и С++, в остальных языках мы будем получать предупреждения о синтаксической ошибке. Например, в Java компилятор будет ругаться на первой же метке case, так же ведет себя интерпретатор Javascript. Попытка проверки на PHP тоже завершилась сообщением интерпретатора об ошибке - Parse error: syntax error, unexpected 'case' (T_CASE).
Целесообразность и эффективность использования такой конструкции ставится под сомнение, сам Дафф в своей переписке - см. выше - указывает на ряд ограничений и слабой целесообразности такой конструкции. Но тем не менее, есть источники, указывающие на присутствие в коде реализации такой конструкции в протоколе SSH.
Think about it!
switch(count%8){
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while(--n>0);
Он обнаружил, что с выражением switch можно выделывать весьма хитрые фокусы. Пока вы соблюдаете синтаксис, вы можете вкладывать в выражение switch различные выражения выбора или итерации, что позволяет эффективно переходить в любую функцию или выходить из нее. Здесь можно ознакомиться с перепиской Даффа, где он рассказывает о своем открытии.
Вот пара примеров:
// первая итерация начинается с определенной метки case
switch (num % 5) {
case 0: do { i++;
case 4: i++;
case 3: i++;
case 2: i++;
case 1: i++;
} while (--n > 0);
}
или так
switch (num % 2) {
case 0: do { std::cout << "num = " << num << std::endl;;
case 1: std::cout << "num = " << num << std::endl;;
} while (--num > 0);
}
Причем все они компилируются и работают. Я встречал использование такого трюка в примерах написания так называемых сопрограмм, определяемых в макросах. Вот пример - msdn.
Стоит отметить, что данная особенность - при отсутствии break, управление внутри блока передаётся «вниз и насквозь» от инструкции, стоящей под одной меткой case, к инструкции, стоящей под следующей меткой case - характерна только для С и С++, в остальных языках мы будем получать предупреждения о синтаксической ошибке. Например, в Java компилятор будет ругаться на первой же метке case, так же ведет себя интерпретатор Javascript. Попытка проверки на PHP тоже завершилась сообщением интерпретатора об ошибке - Parse error: syntax error, unexpected 'case' (T_CASE).
Целесообразность и эффективность использования такой конструкции ставится под сомнение, сам Дафф в своей переписке - см. выше - указывает на ряд ограничений и слабой целесообразности такой конструкции. Но тем не менее, есть источники, указывающие на присутствие в коде реализации такой конструкции в протоколе SSH.
Think about it!
NASM. Generate programms for DOS and Windows x86 OS
Ниже представлены примеры создания программ для таких систем как DOS и Windows x86 на ассемблере NASM.
Создание приложения под DOS.
1. Cоздаем исходник hello.asm
2. запускаем компилятор NASM nasm -f bin -o hello.com hello.asm
На выходе получаем hello.com, при запуске которого на консоль выведется всем нам привычное сообщение - Hello, world!
Создание приложения под Windows x86
1. Cоздаем исходник msgbox.asm
nasm -fobj msgbox.asm
В результате получим объектный файл msgbox.obj, который нужно передать компоновщику alink
alink -oPE msgbox
Параметр -o определяет тип исполняемого файла (родным для Windows является тип PE). Как итог - на выходе исполняемый exe-файл - msgbox.exe
На последок немного дополнительной информации. Создание исполняемого файла состоит из двух этапов: компиляция и компоновка. На первом этапе - компиляция (трансляция) исходного кода программы в некоторый объектный формат. Объектный формат содержит машинный код программы, но символы (переменные и другие идентификаторы) в объектном файле пока не привязаны к адресам памяти. На втором этапе, который называется компоновкой или линковкой (linking), из одного или нескольких объектных файлов создается исполняемый файл. Процедура компоновки состоит в том, что компоновщик связывает символы, определенные в основной программе, с символами, которые определены в ее модулях (учитываются директивы EXTERN и GLOBAL), после чего каждому символу назначается окончательный адрес памяти или обеспечивается его динамическое вычисление.
Для выполнения данных примеров необходимо обратиться к следующим ресурсам:
https://sourceforge.net/projects/nasm - NASM ассемблер
http://alink.sourceforge.net/ - alink компоновщик
win32n.inc - подключаемый заголовочный файл, для вызовов Win API-функций
Всем хорошего дня, вечера или ночи ;)
1. Cоздаем исходник hello.asm
SECTION .text
org 0x100
mov ah, 0x9
mov dx, hello
int 0x21
mov ah, 0x4c
mov al, 0
int 0x21
SECTION .data
hello db "Hello, world!", 0xd, 0xa, '$'
2. запускаем компилятор NASM nasm -f bin -o hello.com hello.asm
На выходе получаем hello.com, при запуске которого на консоль выведется всем нам привычное сообщение - Hello, world!
Создание приложения под Windows x86
1. Cоздаем исходник msgbox.asm
;подключение заголовочного файла (определяющий типы аргументов функций WinAPI)
%include "win32n.inc"
;объявление внешней функции MessageBoxA (идентификатор)
EXTERN MessageBoxA
;связывание объявленной функции с соответствующей динамической библиотекой
IMPORT MessageBoxA user32.dll
;объявление внешней функции ExitProcess
EXTERN ExitProcess
;связывание объявленной функции с соответствующей динамической библиотекой
IMPORT ExitProcess kernel32.dll
;секция (сегмент) кода
SECTION CODE USE32 CLASS=CODE ;метка для компоновщика, указывающая на точку входа
;передача аргументов производится согласно соглашению STDCAL
;аргументы передаются через стек в порядке справа налево (так же, как и в C)
;очистка стека входит в обязанности вызванной функции (аналогично языку Pascal)
;помещение в стек последнего аргумента отвечающего за тип окна (с единственной кнопкой - OK)
push UINT MB_OK
;помещение в стек указателя (адрес нуль-завершенной строки) на строку заголовка
push LPCTSTR title
;помещение в стек указателя на строку сообщения
push LPCTSTR banner
;помещение в стек аргумента указывающего на родительское окно в нашем случае оно отсутствует
push HWND NULL
;вызов функции Windows API - MessageBoxA
call [MessageBoxA]
;аргумент ExitProcess - код возврата
push UINT NULL
;завершение процесса
call [ExitProcess]
;секция статических данных
SECTION DATA USE32 CLASS=DATA
;строка сообщения с символом EOL
banner db 'Hello, world!', 0xD, 0xA, 0
;строка заголовка
title db 'Hello', 0
2. запускаем компиляторnasm -fobj msgbox.asm
В результате получим объектный файл msgbox.obj, который нужно передать компоновщику alink
alink -oPE msgbox
Параметр -o определяет тип исполняемого файла (родным для Windows является тип PE). Как итог - на выходе исполняемый exe-файл - msgbox.exe
На последок немного дополнительной информации. Создание исполняемого файла состоит из двух этапов: компиляция и компоновка. На первом этапе - компиляция (трансляция) исходного кода программы в некоторый объектный формат. Объектный формат содержит машинный код программы, но символы (переменные и другие идентификаторы) в объектном файле пока не привязаны к адресам памяти. На втором этапе, который называется компоновкой или линковкой (linking), из одного или нескольких объектных файлов создается исполняемый файл. Процедура компоновки состоит в том, что компоновщик связывает символы, определенные в основной программе, с символами, которые определены в ее модулях (учитываются директивы EXTERN и GLOBAL), после чего каждому символу назначается окончательный адрес памяти или обеспечивается его динамическое вычисление.
Для выполнения данных примеров необходимо обратиться к следующим ресурсам:
https://sourceforge.net/projects/nasm - NASM ассемблер
http://alink.sourceforge.net/ - alink компоновщик
win32n.inc - подключаемый заголовочный файл, для вызовов Win API-функций
Всем хорошего дня, вечера или ночи ;)
PHP. Генератор случайных строковых значений
Здесь один нюанс: mt_rand() раза в 4 быстрее rand()
function generateRandomString($length = 10) {
$randomString = "";
$characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$min = 0;
$max = strlen($characters) - 1;
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[mt_rand($min, $max)];
}
return $randomString;
}
function generateRandomString($length = 10) {
$randomString = "";
$characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$min = 0;
$max = strlen($characters) - 1;
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[mt_rand($min, $max)];
}
return $randomString;
}
Subscribe to:
Posts
(
Atom
)

