gladilov.org.ru 

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

софт

Позднее Ctrl + ↑

Установка xfce4 в BSD-системах

Всё время забываю, как установить и настроить гуй в BSD-системах. Процесс такой...
Ставим пакеты xfce4-session, xfdesktop, xfwm4:

$ sudo pkg_add -v xfce4-session xfdesktop xfwm4

Пакет вытянет вместе с собой GTK, Glib, cairo, d-bus, некоторые компоненты среды и все необходимое для их работы (кроме X.Org, он идет в комплекте базовой системы).

Показать

Добавляем Xfce в автозагрузку:

$ echo 'LC_CTYPE="ru_RU.UTF-8"' > ~/.xinitrc
$ echo 'setxkbmap "us,ru" ",winkeys" "grp:caps_toggle" &' >> ~/.xinitrc
$ echo 'exec xfce4-session' >> ~/.xinitrc
$ ln -s ~/.xinitrc ~/.xsession
$ startx

Для графического входа в систем ставится менеджер входа SLIM:

$ sudo pkg_add -v slim

Автозапуск SLIM при старте системы реализуется добавлением в /etc/rc.local строки:

[ -x /etc/rc.d/slim ] && /etc/rc.d/slim start

Для автологина добавляем в /etc/slim.conf строки:

default_user [имя_юзера]
auto_login yes



P. S. Хотя в DragonFly BSD 5.0.0 установил так (с небольшими извратами, см. ниже):

$ sudo pkg install xorg xfce slim slim-themes

и в /etc/rc.conf дописал

dbus_enable="YES"
hald_enable="YES"
slim_enable="YES"

а в .xinitrc

exec startxfce4

(ставил по этому мануалу).

Извраты были такие:

$ sudo dbus-uuidgen > /var/lib/dbus/machine-id

чтобы иксы стартовали без ошибок, а в /etc/rc.conf дописал

moused_enable="YES"
moused_nondefault_enable="YES"
hald_enable="YES"
dbus_enable="YES"

и выполнил

$ sudo /etc/rc.d/moused start

Эти извраты подсмотрел здесь и здесь.

Утверждён стандарт C++17

Комитет ISO по стандартизации языка C++ единогласно утвердил спецификацию C++1z в качестве международного стандарта «C++17». Представленные в спецификации возможности уже полностью поддерживаются в компиляторах GCC и Clang, а также частично реализованы в Intel C++ и Visual C++. Поддерживающие C++17 стандартные библиотеки реализованы в рамках проекта Boost.

Показать

В следующие два месяца утверждённая спецификация будет находиться на стадии подготовки документа к публикации, на которой будет проведена работа по редакторской правке орфографических ошибок и опечаток. В начале ноября результирующий вариант документа будет направлен в ISO для публикации под формальным именем ISO/IEC 14882:2017. Тем временем, комитет уже начал работу над следующим стандартом C++20 (C++2a) и рассмотрел на последнем совещании возможные новшества.

Основные особенности C++17:

  • Возможность инициализации переменных внутри выражений if и switch;
  • Возможность использования кодировки UTF-8 в символьных литералах;
  • Шестнадцатеричные литералы с плавающей запятой;
  • Указание текстового сообщения в static_assert теперь опционально;
  • Удалена поддержка триграфов;
  • Возможность указания typename (как альтернативы классам) в параметрах вложенного шаблона;
  • Новые правила вывода типа «auto» из списка инициализации (braced-init-list);
  • Возможность упрощённого определения вложенных параметров пространств имён: «namespace X::Y {...}» вместо «namespace X { namespace Y {...}}»;
  • Возможность указания атрибутов для пространств имён и перечислений;
  • Новые стандартные атрибуты [[fallthrough]], [[maybe_unused]] и [[nodiscard]];
  • Проверка на неизменность (константность) для всех нетипизированных аргументов шаблонов;
  • Сворачивание выражений для вариативных шаблонов;
  • Раскрытие выражений «if» на стадии компиляции, если заданное внутри условие является константой;
  • Структурированные привязки, например, «auto [a, b] = getTwoReturnValues()»;
  • Автоматическое определение типов конструктора шаблонов (например, теперь можно указывать std::pair(5.0, false), явно не задавая типы «double, bool»);
  • Inline-переменные, которые можно определять в заголовочных файлах;
  • Добавлена библиотека для работы с ФС, основанная на boost::filesystem;
  • Из библиотеки TS I перенесены std::string_view, std::optional и std::any;
  • Добавлен std::uncaught_exceptions в качестве замены std::uncaught_exception;
  • Новые функции вставки try_emplace и insert_or_assign для std::map и std::unordered_map;
  • Унифицирован доступ к контейнерам std::size, std::empty и std::data;
  • Определены непрерывные итераторы (contiguous iterators);
  • Удалены устаревшие типы и функции, в том числе std::auto_ptr и std::random_shuffle;
  • Представлены параллельно выполняемые варианты алгоритмов STL;
  • Добавлены дополнительные математические функции, включая эллиптические интегралы и функции Бесселя;
  • Представлены std::variant и std::byte;
  • Новые свойства логического оператора: std::conjunction, std::disjunction и std::negation.
2017   C++   в мире   интересное   события   софт

Как я приложение Just Weight данными заполнял

Сел как-то я на диету...
И у меня вошло в привычку каждое утро взвешиваться. Сначала результаты взвешивания я просто записывал в блокнот, затем начал периодически дублировать эти записи в Гугель Таблицах. Затем данные из этой таблицы визуализировал на  страничке своего сайта.

Показать

Затем я ещё более разнообразил свой быт, купив Xiaomi Mi Band 2. Понятно, что теперь я начал вводить вес и в  Mi Fit. А дня три назад поискал на 4PDA какую-нибудь апликуху под ОС Андроид. Первой поиск мне выдал некую Just Weight – Контроль Веса, довольно молодую прогу, весь функционал которой сводится ко вводу данных и рисованию графика изменения веса. В общем целевая аудитория проги — фитнес–тёлки и старпёры, к которым отношу и себя. Поставил я ознакомительную версию проги на свой телефон, пару дней утром повводил результаты взвешивания, и тут у меня запоздало созрела весьма здравая мысль: — А как же предыдущие дни/месяцы/годы!? Казалось бы — знай себе выбирай дату и вводи соответствующий вес, прога это позволяет, но дело в том, что вести записи я стал с 16 сентября 2014 года, а это 1085 измерений! В меню приложения есть пункты "Импорт" и "Экспорт", но в обычной версии они не доступны, предлагается купить полную версию за $0.99.
У меня как раз на QIWI было рублей 150 (плюс-минус 50), поэтому решил заодно проверить надёжность санкций для жителей Крыма. Выпустил виртуальную QIWI-карту, получил её срок действия и CVC, указал их в  Гугель Кошельке (через VPN, так как я живу на полуострове, которому весь «цивилизованный» мир помогает выжить с помощью санкций). Затем из проги перешёл на страницу покупки полной версии, и с помощью того же VPN оплатил её.

Настала пора потрошения файла экспорта...
У меня уже были введены результаты взвешивания за два последних дня. Я сохранил данные, указав путь к создаваемому экспорт-файлу, скопировал его на компьютер и просмотрел содержимое. Вот оно:

[{"date":1504558800000,"unit":"kg","value":1146,"tableName":"WEIGHT"},{"date":1504645200000,"unit":"kg","value":1135,"tableName":"WEIGHT"}]

Очевидно, что числа 1146 и 1135 представляют собой данные веса в десятых долях колограмма (мой вес тогда был 114,6 и 113,5 кг соответственно). Об это также говорят наименования параметров "unit" и "value". Тег "date" сразу понятен человеку, знающему что такое timestamp и UNIX-время. Здесь оно указано с точностью до миллисекунд.
N.B. Интересно, зачем такая точность в проге, рисующей график веса человека?
Последний тег "tableName" предполагает, что разработчики хотят в дальнейшем (или хотели ранее) вести графики с другими данными.
N.B. Или (чисто в порядке бредового предположения) им попались исходники проги, анализирующей, к примеру, JSON-файл с разными параметрами, и они выдрали алгоритм работы оттуда практически без изменений, сократив количество параметров до одного

Но вернёмся к созданию импортируемых данных...
Вот в таком формате я веду табличку:

Я создал на этом же листе таблицы рядом с первой записью о весе (в ячейке H2) такую формулу:

=CONCAT(((D2-DATE(1970;1;1))*86400)-10800;"000")

Пользователям русского Экселя вероятно нужно так:

=СЦЕПИТЬ(((D2-ДАТА(1970;1;1))*86400)-10800;"000")

Общий смысл формулы такой — считаем число дней от 1 января 1970 года до указанной даты [D2-DATE(1970;1;1)], переводим дни в секунды [*86400]. Так как программа не учитывает временные пояса, а я, как и весь Крым, живу по московскому времени, то из полученного значения необходимо вычесть 3 часа = 10800 секунд [-10800]. Команда сцепки строк используется для добавления в конец полученного числа трёх символов "0", повышая "точность" до миллисекунд [CONCAT(UNIX-time;"000")].

Затем в соседней ячейке I2 написал следующую конструкцию:

=CONCAT("{'date':";CONCAT(H2;CONCAT(",'unit':'kg','value':";CONCAT(E2*10;",'tableName':'WEIGHT'},"))))

Здесь всё просто — последовательно сцепляем строки:
"{’date’:" + число секунд из ячейки H2 + ",’unit’:’kg’,’value’:" + значение веса из ячейки E2, умноженное на 10 + ",’tableName’:’WEIGHT’},".

Протянув полученные формулы до конца введённых данных, я сформировал текст, необходимый для импорта в Just Weight.

Копирую все строки вида

'date':1504558800000,'unit':'kg','value':1146,'tableName':'WEIGHT'},

в любой текстовый редактор (вставляю как текст, если редактор слишком навороченный), ставлю в начале и в конце символы открытия и закрытия квадратных скобок ([мой текст]), убираю явно лишнюю запятую в последней строке, и — Voi la!
Подтягиваю полученное творение на телефон, импортирую и наслаждаюсь графиком.

P. S. Я на свой страх и риск использовал в формуле получения строк апостроф ' вместо двойных кавычек ", чтобы не нарушать визуальную целостность формул. Прокатило 

2017   досуг   мну   софт

Cкрипт определения провайдера сотовой связи

Привожу BASH-скрипт получения оператора номера сотового
(используется сервис http://rosreestr.subnets.ru).

Показать

Допустим, мы хотим получить информацию о мобильном номере +7 900 555-55-50 (или 8 900 555-55-50)... При выполнении команды

curl -s "http://rosreestr.subnets.ru/?get=num&format=xml&num=9005555550" | sed -e 's/<[^>]*>//gm' | sed '/^$/d' | tr -d '\t'

получим в консоли вывод

900
260823
5555550
5555550
1
ООО &quot;СИМ ТЕЛЕКОМ&quot;
5418
Москва и Московская область
1880

где:
900 — DEF-код (мобильные номера всегда начинаются с цифры 9)
260823 — ID диапазона номеров с данным DEF-кодом в реестре Российской системы и плана нумерации
5555550 — начальный номер диапазона номеров
5555550 — конечный номер диапазона номеров
1 — Общая номерная ёмкость в данном диапазоне
ООО "СИМ ТЕЛЕКОМ" — наименование оператора, обслуживающего мобильный номер
5418 — ID оператора
Москва и Московская область — наименование региона, в котором оператор обслуживает мобильный номер
1880 — ID региона в реестре Российской системы и плана нумерации

Разоблачение фокуса...

Командой

curl -s "http://rosreestr.subnets.ru/?get=num&format=xml&num=9005555550"

в вывод консоли сервис возвращает ответ в формате XML:

<?xml version="1.0" encoding="utf-8"?>
<response>
<row>
        <code>900</code>
        <codeID>260823</codeID>
        <from>5555550</from>
        <to>5555550</to>
        <capacity>1</capacity>
        <operator>ООО &quot;СИМ ТЕЛЕКОМ&quot;</operator>
        <operatorID>5418</operatorID>
        <region>Москва и Московская область</region>
        <regionID>1880</regionID>
</row></response>

Команда

sed -e 's/<[^>]*>//gm'

по конвейеру убирает все подстроки, заключённые в угловые скобки < ... >

900
        260823
        5555550
        5555550
        1
        ООО &quot;СИМ ТЕЛЕКОМ&quot;
        5418
        Москва и Московская область
        1880

Затем с помощью команды

sed '/^$/d'

удаляются пустые сроки, оставшиеся после удаления <тегов>:

900
        260823
        5555550
        5555550
        1
        ООО 'СИМ ТЕЛЕКОМ'
        5418
        Москва и Московская область
        1880

а команда

tr -d '\t'

убирает символы табуляции в получившемся выводе

900
260823
5555550
5555550
1
ООО 'СИМ ТЕЛЕКОМ'
5418
Москва и Московская область
1880

N. B.: Скрипту нужен установленный пакет curl, можно заменить wget’ом:

wget -q -O - "http://rosreestr.subnets.ru/?get=num&format=xml&num=9005555550" | sed -e 's/<[^>]*>//gm' | sed '/^$/d' | tr -d '\t'

N. B.: В принципе, можно получать вывод не в формате XML, при опускании в урле параметра

&format=xml

сервис выдаёт plain text.

В планах написать веб-версию, использующую данный сервис.

Слизано с Хабра.

Опять про PS1

В дополнению к первому посту о переменной окружения PS1, для себя определился, что у моего пользователя она такая:

а у рута будет лиловенькая:

Показать

И вообще, на всякий случай привожу краткие выдержки конфигурационных файлов моего BASH’a:
Мой ~/.bashrc

PS1='\[\e]0;`if [[ $? = 0 ]]; then echo "\[\033[1;34m\]"; else echo "\[\033[1;31m\]"; fi`\t \[\033[1;32m\]\u\[\033[0;37m\]@\[\033[1;32m\]\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

alias sus='sudo -s'

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

export PHANTOMJS_EXECUTABLE=/usr/local/bin/phantomjs

Мой ~/.profile

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
        "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

export LANG=ru_RU.UTF-8
export LANGUAGE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
export PAGER=/usr/bin/most

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

/root/.bashrc

PS1='${debian_chroot:+($debian_chroot)}`if [[ $? = 0 ]]; then echo "\[\033[1;34m\]"; else echo "\[\033[1;31m\]"; fi`\t \[\e[0;95m\]\u\[\033[0;37m\]@\[\033[1;32m\]\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

export LANG=ru_RU.UTF8
export LC_ALL=ru_RU.UTF8
export PAGER=/usr/bin/most

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

/root/.profile

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n || true

Вишенкой на торте — механика процесса инициализации оболочки
(из Вики, чтобы представлять, как оно внутри устроено и заводится).

Когда Bash вызывается как интерактивная оболочка входа в систему, первым делом он читает и вызывает команды из файла /etc/profile, если этот файл существует. После чтения этого файла, он смотрит следующие файлы в следующем порядке: ~/.bash_profile, ~/.bash_login и ~/.profile, читает и вызывает команды из первого, который существует и доступен для чтения. При выходе bash читает и выполняет команды из файла ~/.bash_logout.

Когда запускается интерактивная оболочка, но не для входа в систему, bash читает и исполняет команды из файлов /etc/bash.bashrc и ~/.bashrc, если они существуют. Это может быть отменено опцией -norc. Опция -rcfile file заставит Bash использовать команды из файла file вместо /etc/bash.bashrc и ~/.bashrc.

2017   BASH   Linux   сисадминство   софт

Евросоюз утвердил открытую лицензию EUPL 1.2, совместимую с GPLv3

После четырёх лет обсуждений чернового варианта утверждена новая версия лицензии EUPL 1.2 (European Union Public Licence), используемой при разработке открытого программного обеспечения для государственных учреждений в Евросоюзе. Лицензия доступна на 23 языках, используемых в странах Евросоюза и опубликована в официальном журнале Европейского союза, что обозначает вступление правового акта в силу. Лицензия признана организацией Open Source Initiative (OSI) открытой и соответствующей требованиям «Open Source Definition».

Показать

В лицензии EUPL 1.2 решены многие ранее наблюдаемые проблемы с совместимостью с другими открытыми и свободными лицензиями, в том числе обеспечена совместимость с лицензиями GPLv3, AGPLv3, LGPLv2, LGPLv3 и MPLv2. Версия EUPL 1.1 позволяла перелицензировать код в GPLv2, но была включена Фондом СПО в список лицензий, несовместимых с GPL. Наиболее ожидаемым эффектом от принятия EUPL 1.2 стала возможность использовать код продуктов, выпускаемых для госучреждений Евросоюза, в проектах, развиваемых независимым сообществом под лицензией GPLv3. Совместимость с GPLv3 является значительным шагом в сторону улучшения переносимости кода, который упростит смешивание в одном проекте кода под лицензиями GPLv3 и EUPL 1.2, а также сделает возможным перелицензирование EUPL-кода под лицензией GPLv3 без необходимости дополнительных согласований.

Напомним, что по сравнению с GPLv2 лицензия GPLv3 обладает такими особенностями, как запрет тивоизации (привязки программного обеспечения к оборудованию), противодействие заключению дискриминационных патентных соглашений (патент может быть лицензирован для GPLv3 кода только на условиях повсеместного и бесплатного использования) и предоставление защиты от патентных исков со стороны поставщика GPLv3-продукта (если фирма поставляет GPLv3 компоненты, то она не может предъявить судебный иск против пользователей данных компонентов, обвинив их в нарушении патентов в данном ПО или в обходе средств защиты интеллектуальной собственности).

Необходимость поддержания Евросоюзом собственной свободной лицензии вместо использования уже существующих лицензий обусловлена необходимостью приведения лицензии в полное соответствие с требованиями законодательства всех стран Евросоюза. У существующих лицензий наблюдаются несостыковки с особенностями трактовки авторского права в некоторых странах Евросоюза. Кроме того, лицензия EUPL изначально утверждается в переводе на 23 европейских языках. Независимо от того на каком официальном языке используется текст лицензии, все варианты считаются юридически идентичными.

Источник

Переменная PS1 и её сёстры

Всегда хотел узнать, почему у переменной окружения $PS1 (prompt string) в конце цифра 1.

Оказывается — таких переменных аж четыре штуки ($PS1, $PS2, $PS3, $PS4), и все они отображают приглашения ко вводу в различных ситуациях.

Показать

Далее речь идёт о системной оболочке bash.

В моих системах $PSx выглядят так:

$PS1 — приглашение командной строки, используется в оболочке для отображения запроса ввода и отображается тогда, когда консоль готова считать команду.
Значение по умолчанию:

"\u@\h:\w\$ "

или

"\s-\v\$ "

(расшифровку значений спецсимволов bash см. внизу заметки).
$PS2 — вторичное приглашение командной строки, отображается, когда консоль нуждается в дополнительном вводе для завершения команды, которую уже начала считывать.
Значение по умолчанию:

"> "

Очень длинную команду можно разбить с помощью символа ’\’ в конце строки, при этом приглашение изменится на $PS2, ожидая ввода продолжения команды.

$PS3 — третичное приглашение, выводится тогда, когда оператор select ожидает ввода значений.
Значение по умолчанию:

""

хотя в bash’е вроде как

"#?"

$PS4 — приглашение четвертого уровня, выводится в начале каждой строки вывода во время трассировки выполнения (вызывается с ключом -x).
Значение по умолчанию:

"+ "

Во всех переменных можно использовать следующие спецсимволы (напомню, речь идёт об оболочке bash):

\a

символ Bell (звонок) (код 07)

\d

дата в формате «ДеньНедели Месяц Число» (т. е. «Tue May 26»)

\\

символ обратного слеша (обратная косая черта)

\e

символ Escape (код 033)

\h

имя хоста до первой точки

\H

полное имя хоста

\j

количество заданий, выполняемых оболочкой в фоне

\l

базовое имя наименования терминального устройства оболочки (в случае входа через ssh-клиент возвращает не полное имя, например pts/3, а только 3)

\n

символ перевода строки

\r

символ возврата каретки

\s

имя оболочки, базовое имя от переменной $0 (после последнего символа /)

\t

текущее время в 24-часовом формате (HH:MM:SS)

\T

текущее время в 12-часовом формате (HH:MM:SS)

\@

текущее время в 12-часовом формате (am/pm)

\A

текущее время в 24-часовом формате (HH:MM)

\u

имя текущего пользователя

\v

версия оболочки bash (например, 2.00)

\V

версия и номер релиза bash (например, 2.00.0)

\w

полный путь текущей директории

\W

базовое имя текущей директории

\!

номер истории зтой команды

\#

номер зтой команды

\$

если UID == 0, то символ ’#’, иначе ’$’

\nnn

символ, соответствующий восмеричному числу nnn

\[

начало последовательности невыводимых символов. Может использоваться для осуществления управления терминалом в приглашении

\]

конец последовательности невыводимых символов

\D{format}

строка format передаётся в strftime(3), результат вставляется строку приглашния оболочки, пустой формат приводит к выводу локального времени. Скобки необходимы.

Ну и напоследок бонус — скрипт генерации таблицы цветов в bash

2017   BASH   Linux   сисадминство   софт

Памятка для настройки DebWrt

 Давным-давно появилась у меня железка D-Link DIR-300/A2,  вот такая. Так как на ней есть разъём USB, то я поставил туда прошивку DebWrt, продукт противоестественного скрещивания Debian и OpenWrt

С тех пор на винте лежит текстовый файл, описывающий основные команды настройки этой ОС. Публикую здесь как памятку для себя (с моими комментариями), ну а если сей опус кому-либо когда-либо как-либо чем-то пригодится — я буду только рад!

Показать

cd /etc/network
rm interfaces // это симлинк на interfaces.firstboot
cp interfaces.firstboot interfaces
vi interfaces // настраиваем сетевые интерфейсы как нам нужно
// следующие команды необходимы для настройки доступа в интернет без перезагрузки устройства
// (после доступ будет реализован путём выдачи IP по DHCP от шлюза во внешнюю сеть)
ip a a $IP/$MASK dev $IF && echo '8.8.8.8' > /etc/resolv.conf && ip r a via $GW
// для обновления репозитория со squeeze до wheezy
cp /etc/apt/sources.list /etc/apt/sources.list.old
echo 'deb http://ftp.debian.org/debian wheezy main' > /etc/apt/sources.list
gpg --keyserver pgpkeys.mit.edu --recv-key F120156012B83718 && gpg -a --export F120156012B83718 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 010908312D230C5F && gpg -a --export 010908312D230C5F | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key CBF8D6FD518E17E1 && gpg -a --export CBF8D6FD518E17E1 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010 && gpg -a --export 7638D0442B90D010 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553 && gpg -a --export 8B48AD6246925553 | apt-key add -
// опционально
gpg --keyserver pgpkeys.mit.edu --recv-key 6FB2A1C265FFB764 && gpg -a --export 6FB2A1C265FFB764 | apt-key add -
aptitude update
aptitude upgrade
adduser $USER
echo '$USER ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers
// обновление системы, можно и aptitude upgrade/aptitude dist-upgrade впендюрить, если время позволяет
aptitude update
// установка нужных пакетов
aptitude install mc sudo locales bash-completion ntpdate openssh-server screen wpasupplicant
// установка опциональных пакетов
aptitude install most nload htop ccze telnet wavemon tcpdump fping nmap ipcalc console-cyrillic
// установка совсем уж опциональных пакетов
aptitude install apache2 php5 mysql-server mysql-client
// настройка локали, шрифтов, таймзоны
dpkg-reconfigure locales
dpkg-reconfigure console-cyrillic // если поставлен
dpkg-reconfigure tzdata

Далее следует настройка переменных и алиасов в ~/.bashrc и ~/.profile (а равно и в /root/.bashrc и /root/.profile).

Если кого заинтересовала эта прошивка — вот  ссылка на мою инструкцию по перепрошивке девайса (DIR-320/A*, версия прошивки — 10.03).

Скрипт подсчёта размера БД MySQL

Понадобилось мне как-то узнать размер таблиц в MySQL-базе данных. Причём узнать в shell script’е. Поискав в сети, наткнулся на чудесный скриптик.

Показать

Допилив его, стал использовать в MRTG. Привожу полностью, без правок/изменений:

#!/bin/bash
# Calculate the storage space used up by all tables in a given MySQL database
# Ben Dowling - www.coderholic.com
database=$1
username=$2
password=$3

if [ ${#database} -eq 0 ]
then
    echo "Usage: $0 &lt;database&gt; [username [password]]"
    exit
fi

if [ "$password" ]
then
   password="-p$password"
fi

mysql="mysql -u $username $password $database"

$mysql -se "USE $database";

tables=$($mysql -se "SHOW TABLES")

totalData=0
totalIndex=0
totalTables=0

for table in $tables
do
   output=$($mysql -se "SHOW TABLE STATUS LIKE \"$table\"\G")
   data=$(echo "$output" | grep Data_length | awk -F': ' '{print $2}')
   dataMegs=$(echo "scale=2;$data/1048576" | bc)
   index=$(echo "$output" | grep Index_length | awk -F': ' '{print $2}')
   indexMegs=$(echo "scale=2;$index/1048576" | bc)
   total=$(($index+$data))
   totalMegs=$(echo "scale=2;$total/1048576" | bc)
   
   echo "$table Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB"
   
   totalData=$(($totalData+$data))
   totalIndex=$(($totalIndex+$index))
   totalTables=$(($totalTables+1))
done

dataMegs=$(echo "scale=2;$totalData/1048576" | bc)
indexMegs=$(echo "scale=2;$totalIndex/1048576" | bc)
total=$(($totalIndex+$totalData))
totalMegs=$(echo "scale=2;$total/1048576" | bc)

echo "*** $totalTables Tables | Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB ***"

Размеры выводятся в мегабайтах. Пример вывода:

soul@etcetera:~$ ./db.sh somedatabase root ********
wp_comments Data: 6.60MB Indexes: .15MB Total: 6.75MB
wp_links Data: 0MB Indexes: 0MB Total: 0MB
wp_options Data: 1.57MB Indexes: .01MB Total: 1.58MB
wp_postmeta Data: .01MB Indexes: .01MB Total: .02MB
wp_posts Data: .57MB Indexes: .02MB Total: .60MB
wp_term_relationships Data: 0MB Indexes: .01MB Total: .02MB
wp_term_taxonomy Data: 0MB Indexes: 0MB Total: 0MB
wp_terms Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_data Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_rss_map Data: 0MB Indexes: 0MB Total: 0MB
wp_usermeta Data: 0MB Indexes: 0MB Total: 0MB
wp_users Data: 0MB Indexes: 0MB Total: 0MB
*** 12 Tables | Data: 8.78MB Indexes: .25MB Total: 9.03MB ***

Решение проблемы «???????????? no permissions» в adb

Для теста решил поставить Android SDK на свою машину (у меня смартфон с ОС Андроид), но после установки и докачивания компонентов команда

./adb devices

вывела следующий текст:

List of devices attached
????????????    no permissions

Показать

Оказалось, что в моей системе не было правильно настроенных правил демона udev для этого устройства. Для решения проблемы необходимо знать USB-ID производителя и устройства (VendorID и ProductID), ну и конечно имя пользователя, под которым регистрируетесь в системе.
Я создал файл-правило udev с именем /etc/udev/rules.d/51-android.rules и с таким содержимым:

SUBSYSTEM=="usb", ATTRS{idVendor}=="VendorID", ATTRS{idProduct}=="ProductID", MODE="0666", OWNER="UserLogin"

Затем перегрузил демон udev:

sudo /etc/init.d/udev reload

После этого вывод команды

./adb devices

должен вывести что-то вроде:

List of devices attached
DeviceID    device

Бывает, что уже при настроенных правилах udev всё равно не работает, тогда помогает выполнение команд:

sudo ./adb kill-server
sudo ./adb start-server
./adb devices

После перезапуска сервера ADB мой смартфон определился нормально.

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