gladilov.org.ru 

1372 заметки с тегом

софт

Позднее Ctrl + ↑

Разные операционки

С конца сентября 2016 года решил ставить виртуалки (и не только) с разными ОС (Linux, BSD, вобщем — все *nix). Прокачиваю, так сказать, свой скил... Заодно анализирую некоторую инфу, полезную для распознавания типа и версии ОС. Снимаю скриншот с инфой, выведеной в BASH’е, в основном — вывод uname, собержимое разных /etc/*release* и /etc/*version*, lsb-release (если это Linux-based distro), всякие kern.osrelease и kern.ostype (это если BSD). С новыми дистрибутивами проблем обычно нет (их большинство), но с устаревшими, про которые мало инфы (как  plan9 или  XENIX386), снятыми с поддержки (как  Moblin 2, для которого не могу найти рабочую копию репозитория в сети), или трансформировавшимися в другие (как  LindowsOS / Linspire / Freespire / Xandros или  Mandrake / Mandriva / Mageia / OpenMandriva).

Показать

На сегодня сделал 110 осей (это которые дошли до процесса снятия скрина, но много пока не доделаны).

 Линуксы:

 Бэ Эс Дэ:

 Андроиды:

 БиОСь и клоны:

 Солярка:

 МакОси:

 Всякая экзотика:

2018   виртуальные ОСи   досуг   ОС   софт

Напильник для Эгеи

 Как можно заметить, мой блог ведётся на бесплатном (для личных блогов) движке  Эгея. Это отличный блого-движок, отличающийся своей простотой, элегантностью и дружелюбием к пользователю. Поэтому, после восстановления сбоя на сервере с моим сайтом, я опять решил настроить блог на Эгее. Правда, незадолго до сбоя я обновил систему до Debian 9, вычистив все упоминания о PHP5, остался только PHP7 (с FPM), но движок блога может работать как на пятом, так и на седьмом PHP.

Показать

Возможно, что из-за кривоватых настроек моего сервера Эгея из старого бэкапа сразу работать отказалась (нет баз, не известен пароль к базам и т. д.). Это было, вероятно, тяжкое наследие старой системы, я обновлял её через aptitude dist-upgrade.

Пришлось бэкапить MySQL-базы с наполнением блога, затем переустанавливать заново движок (скачал релиз 2.7, версию 3249), инсталлятор создал новые базы, поверх которых я вытащил из бэкапа мои блоговые статьи, комменты и прочее. Причём начальные таблицы в базе создаются с префиксом ’e2Blog’, нужно не забыть поменять на используемый мной префикс в файле system/defaut/config.php, строка

$_config['db_table_prefix'] = 'e2Blog';

Да, и user/settings.json желательно привести к такому виду

{  "db": {"server": "<узел>","user_name": "<имя>","passw": "<пароль>","name": "<база>"},
    "timezone": {"offset": 10800,"is_dst": false},
    "template": "plain",
    "language": "ru",
    "appearance": {"notes_per_page": 10},
    "comments": {"default_on": true},
    "site_title": "Блог ни о чём",
    "description": "Мысли, факты, цитаты, заметки.",
    "author": "Павел Гладилов",
    "user": {"email": "pavel@gladilov.org.ru"},
    "notifications": {"new_comments": true}  }

Затем выяснилось, что вместо статей открывается страница с ошибкой

Fatal error: Uncaught Error: Call to undefined function dl() in <файл> line <строка>

Пришлось погружать свои ручки в код движка... В результате просмотра кода было найдено решение — замена части кода в ядре движка system/core.php с

if (!extension_loaded('gd')) { if (!dl('gd.so')) { header('Content-type: image/gif'); return false; } }

на

if (!extension_loaded('gd')) { header('Content-type: image/gif'); return false; }

После этого блог заработал, но теперь пропала возможность быстрого сохранения в редакторе по комбинации клавиш Ctrl + Enter (в старых версиях — Ctrl + S) и при попытке движка сформировать или вызвать на редактирование страницу, на которой есть ссылки на несуществующие файлы картинок — открывалась страница с серым фоном и маленьким пустым квадратом посередине. Причём, если такая «кривая» страница открылась — то даже при устранении всех причин всё равно отображается ошибочная страница. Я думаю (но не проверял), что это связано с хранением сгенереных страниц (или их частей) в user/caches/*.psa. Возможно, мне повезло, что со временем истёк срок хранения кешированных «кривых» страниц, и они стали отображаться нормально. Или возникновение такой проблемы как-то связано с разными форматами таблиц старой и новой версии движка. А вообще эту проблему я обошёл с помощью прямой правки заметок в записях таблицы <префикс>Notes, затем там-же стал выставлять атрибут ’Null’ в поле «Uploads» и использовать полный путь к файлам картинок от корня.

В файле user/extras/header-pre.tmpl.php прописываю заголовок для блога — кнопки gladilov.org.ru и gladilov.org.ua.

В файле themes/<имя используемой темы>/templates/layout.tmpl.php рисую верхнее меню:

<?php if ($content['class'] == 'frontpage') { ?>
          <div id="e2-blog-description"><?= $content['blog']['description'] ?></div>
        <?php } ?>
<br />
<table width="650">
<tbody>
<tr>
<td><a href="<ссылка1>"><img src="<картинка1>" style="vertical-align:middle!important" />&amp;&nbsp;<пункт1></a></td>
<td width="15"></td>
<td><a href="<ссылка2>"><img src="<картинка2>" style="vertical-align:middle!important" />&amp;&nbsp;<пункт2></a></td>
<td width="15"></td>
...
<td><a href="<ссылкаN>"><img src="<картинкаN>" style="vertical-align:middle!important" />&amp;&nbsp;<пунктN></a></td>
</tr>
</tbody>
</table>
      </div>
    </div>

Ну и тоже выплывшую при правке system/core.php проблему с невозможностью определить новую картинку для юзера решаю изменением в этом же файле определений DEFAULT_USERPIC_FILENAME и DEFAULT_USERPIC_PLACEHOLDER_FILENAME на путь к моей картинке.

define('DEFAULT_USERPIC_FILENAME','<soul.png>'); define('DEFAULT_USERPIC_PLACEHOLDER_FILENAME','<soul.png>');

Теперь мой блог выглядит приблизительно так:

Переменные среды для локализации пользовательского интерфейса

 *nix-системы предоставляют развитые средства настройки пользователюской среды под различные потребности. Одна из задач такой настройки — указание регионального стандарта, с которым хочет оперировать пользователь. Например — чтобы графический системный интерфейс отображал сообщения на родном пользователю языке (был локализован), а ввод осуществлялся на английском. Локализация означает приспособление программы или операционной системы к кодировке и стилям печати времени, даты, денежных единиц принятых в данной стране. Иногда применяют сокращение «l10n». Буквы «l» и «n» — начало и окончание слова «localization», а цифра 10 — количество букв между ними. Есть ещё сокращение i18n — «internationalization».

Показать

POSIX-совместимые системы имеют специальный стандарт (RFC 3066) определения локали — идентификатора, определяющего региональные настройки пользовательского интерфейса, такие как язык, страна, часовой пояс, набор символов и т. п. Он имеет следующий вид:

[language[_territory][.codeset][@modifier]]

Например — ru_RU.CP1251, el_GR.UTF-8 или en_US.iso88591. Существует особое имя для региональных настроек POSIX: C — нейтральное значение по умолчанию, C.UTF-8 — для новых POSIX-систем с поддержкой UTF-8.

Многие системные программы для определения языка сообщений и вида кодировки используют установленные переменные окружения. По умолчанию переменные LC_ALL и LANG имеют пустые значения, а все остальные — значение «POSIX». В русифицированных системах при настройке локали указывается определенная кириллическая кодировка, например, UTF-8 (Unicode) или реже CP1251 (русскоязычная кодировка Microsoft Windows) или KOI-8 (русскоязычная кодировка UNIX).

Имя переменной

Описание

LC_ALL

Переменная LC_ALL, если установлена, определяет всё сразу: язык сообщений, кодировку, вид даты и т. п.

LANGUAGE

Переменная LANGUAGE используется в основном программами из проекта GNU

LC_CTYPE

Переменная LC_CTYPE, если не установлена LC_ALL, определяет кодировку символов. В отсутствии LC_CTYPE и LC_ALL, для определения типа кодировки используется переменная LANG

LC_COLLATE

Переменная LC_COLLATE используется в отсутствии LC_ALL для определения алгоритма сортировки. В отсутствии LC_COLLATE для этого используется переменная LANG

LC_MONETARY

Переменная LC_MONETARY используется, если отсутствует LC_ALL, для определения вида денежной единицы. Если LC_ALL и LC_MONETARY не установлены, то используется переменная LANG

LC_NUMERIC

Переменная окружения LC_NUMERIC используется, если не установлена переменная LC_ALL, для определения национального формата печати чисел (например, с плавающей точкой или запятой). Если не установлены LC_ALL и LC_NUMERIC, то используется переменная окружения LANG

LC_TIME

Переменная окружения LC_TIME используется, если не установлена LC_ALL для определения формата даты и времени. Если не установлены переменные LC_ALL и LC_TIME, то используется переменная LANG

LC_MESSAGES

Переменная LC_MESSAGES используется в отсутствии LC_ALL для определения языка информационных и диагностических сообщений и интерфейса. Если LC_ALL и LC_MESSAGES не установлены, то используется переменная LANG

LC_PAPER

Переменная LC_PAPER, если не установлена LC_ALL, определяет размер бумаги при печати. В отсутствии LC_PAPER и LC_ALL, для определения размера бумажного листа используется переменная LANG

LC_NAME

Переменная окружения LC_NAME используется, если не установлена переменная LC_ALL, для определения формата отображения имён (фамилия пишется первой или последней и т. д.). Если не установлены LC_ALL и LC_NAME, то используется переменная окружения LANG

LC_ADDRESS

Переменная LC_ADDRESS, если не установлена LC_ALL, определяет информацию о местоположении и формат адреса (страна указывается в начале или в конце адреса, где расположен почтовый индекс и т. д.). В отсутствии LC_ADDRESS и LC_ALL, для определения формата указания адреса используется переменная LANG

LC_TELEPHONE

Переменная LC_TELEPHONE используется в отсутствии LC_ALL для определения формата телефонных номеров. Если LC_ALL и LC_TELEPHONE не установлены, то используется переменная LANG

LC_MEASUREMENT

Переменная LC_MEASUREMENT используется, если отсутствует LC_ALL, для определения системы единиц измерения (метрическая, имперская и т. д.). Если LC_ALL и LC_MEASUREMENT не установлены, то используется переменная LANG

LC_LC_RESPONSE

Переменная LC_RESPONSE используется в отсутствии LC_ALL для определения того, как на локальном языке отобрадаются ответы (типа Да и Нет, Y/N, и т. п.). В отсутствии LC_RESPONSE для этого используется переменная LANG

LC_IDENTIFICATION

Переменная LC_IDENTIFICATION используется в отсутствии LC_ALL для определения общих метаданных о языковой информации. Если LC_ALL и LC_IDENTIFICATION не установлены, то используется переменная LANG

LANG

Переменная окружения LANG используется для всего, что не установлено ранее переменными вида LC_*

NLSPATH

Задаёт путь к файлам локализованных сообщений и справки

TZ

Задаёт временную зону, используемую системой

Из командной строки управление переменными осуществляется с помощью команд export и env. Чтобы увидеть, какие переменные из вышеописанных и как установлены, можно использовать программу locale. Посмотреть, какие файлы для локализации имеются в системе можно в каталоге /usr/share/locale/, а также выполнив команду locale -a.

[soul@etcetera:~]$ locale
LANG="ru_RU.UTF-8"
LANGUAGE="ru_RU.UTF-8"
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL="ru_RU.UTF-8"
[soul@etcetera:~]$ locale -a
C
C.UTF-8
POSIX
ru_RU.utf8
[soul@etcetera:~]

Проекты OpenWrt и LEDE объявили о слиянии

Проекты  OpenWrt и  LEDE, развивающие дистрибутивы для различных сетевых устройств, таких как маршрутизаторы и точки доступа, объявили о воссоединении (ссылка). В соответствии с ранее согласованным планом, Git-репозиторий OpenWrt заменён на содержимое репозитория LEDE, который послужит основой для дальнейшей совместной разработки.

Показать

Разработка объединённого проекта будет вестись под именем OpenWrt, но в соответствии с правилами LEDE, подразумевающими открытый процесс принятия решений с привлечением сообщества, прозрачность взаимодействия разработчиков, регулярный предсказуемый цикл подготовки релизов, первоочередное внимание стабильности дистрибутива, более либеральные правила приёма изменений и получения права коммита. Деятельность, связанная с решением юридических вопросов, сбором пожертвований и распоряжением активами (например, доменом и торговой маркой) нового совместного проекта OpenWrt делегирована некоммерческой организации SPI (Software in the Public Interest), которая также курирует такие проекты, как Debian, Arch Linux, X.Org, 0.A.D, FFmpeg, freedesktop.org и OpenEmbedded.

Старое содержимое репозитория OpenWrt перемещено в архив, но отсутствующие в LEDE патчи, отвечающие требованиям к качеству кода LEDE, будут перенесены в новый репозиторий. Сервисы и элементы инфраструктуры, запущенные в рамках домена lede-project.org, теперь доступны и через домен openwrt.org. Форумы и wiki пока остаются как есть, решение по ним ещё не утверждено.

Поддержка старых выпусков OpenWrt (до 15.05) будет прекращена, а для OpenWrt 15.05 будут предоставляться обновления с исправлением уязвимостей и серьёзных проблем. Поддержка LEDE 17.01 будет обеспечена в полном объёме. В ближайшие несколько месяцев ожидается формирование нового значительного релиза, который выйдет уже под именем OpenWrt.

Выбор в пользу кода LEDE сделан, так как последнее время все новшества и изменения создавались в данном проекте, а разработка OpenWrt практически остановилась после создания форка в 2016 году, когда из проекта ушла группа активных разработчиков, желающих поднять стабильность дистрибутива на новый уровень и избавиться от организационных проблем. Создатели ответвления, которое получило название LEDE, попытались воплотить в жизнь предсказуемый цикл разработки, более либеральные правила приёма изменений и прозрачный процесс принятия решений с привлечением сообщества и проведением публичных обсуждений. Весной 2017 года состоялся первый значительный релиз LEDE, который показал состоятельность проекта.

Новость с Опёнка

2018   Linux   интересное   ОС   роутер   софт

Отправка сообщения на почту, когда количестве запросов на порт превысит предел

Пишем скрипт, содержащий код:

#!/usr/bin/env bash
MAILTO=somebody@example.com
WATCHPORT=80
TRESHOLD=500
NUMCONN=`netstat -antpu4 | grep :$WATCHPORT | wc -l`
if [[ $NUMCONN -ge $TRESHOLD ]]; then
DATE=`date`
MAILBODY="Datestamp: $DATE\nServer port $WATCHPORT usage overload!\nCurrent port $WATCHPORT connections: $NUMCONN."
echo -e $MAILBODY | mail -s "Server port $WATCHPORT usage overload!" $MAILTO
fi

Скрипт циклически запускаем с помощью cron’а, например — каждую минуту:

* * * * * /path/to/script.sh

Поздравляю!

#include <stdio.h>

int main(){
        char mdata[] = {0x48, 0x61, 0x70, 0x70, 0x79, 0x20, 0x6e, 0x65, 0x77,
                0x20, 0, 0, 0, 0, 0x20, 0x79, 0x65, 0x61, 0x72, 0x21, 0xa};
        int i, y, c;
        y = 2 * (10 * 10 * 10 + 3 * 3);
        for (i = 0; i < 4; i++){
                c = y % 0xa;
                mdata[0xd - i] = 0x30 + c;
                y -= c;
                y /= 0xa;
        }
        for (i = 0; i < 21; i++) putchar(mdata[i]);
        return 0;
}
איך אַרומנעמען און גראַטולירן איר אַלע. אַזוי פילע יאָרן צעלאָזן אונדזער נערוועס צו יעדער אנדערער, לאָזן אונדז פאָרזעצן דעם שפּאַס טעטיקייט. גוט גליק צו איר אַלע און געזונט.
新年快乐!万事如意!
2018   C++   праздник   софт   юмор

Определение размера свопа, использованого процессом

Стандартные консольные утилиты Linux не показывают количество памяти процесса, выгруженной в файл подкачки (swapped out).
Но есть достаточно простой способ узнать это. Всё, что для этого нужно — взять идентификатор процесса (PID) и просмотреть файл smaps, относящийся к этому процессу:

sudo cat /proc/<pid процесса>/smaps | grep Swap

Эта команда выдаст кучу строк, относящихся к разным сегментам памяти. Чтобы просуммировать всё, можно воспользоваться командой awk:

sudo cat /proc/<pid процесса>/smaps | grep Swap | awk '{ SUM += $2 } END { print SUM }'

Выведенное число — размер использованного свопа в килобайтах.

Консольный аналог «Анализатора использования дисков»

du -sk ./* | sort -nr | awk 'BEGIN{ pref[1]="K"; pref[2]="M"; pref[3]="G";} { total = total + $1; x = $1; y = 1; while( x > 1024 ) { x = (x + 1023)/1024; y++; } printf("%g%s\t%s\n",int(x*10)/10,pref[y],$2); } END { y = 1; while( total > 1024 ) { total = (total + 1023)/1024; y++; } printf("Total: %g%s\n",int(total*10)/10,pref[y]); }'

Меряет только реальные файлы и директории, симлинки будут нулевого размера.

Так же могут быть полезны пакеты типа ncdu или pydf...

Монтирование директории с удалённого хоста по SSH*

(* точнее — по SFTP, надстройкой над протоколом SSH)

Требуется установленный пакет sshfs. В общем виде команда выглядит так:

sshfs user@remotehost:/path/to/directory /local/path -p port

Показать

Реализация:

sudo modprobe fuse
mkdir ~/music
sshfs insect@192.168.1.234:/home/insect/music ~/music

Размонтировать так:

sudo umount ~/music

или (для ранних версий) так:

sudo fusermount -u ~/music

Ранее Ctrl + ↓
Наверх