Linux/Ubuntu. Пакетный менеджер APT

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(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

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;

}