← All posts tagged code

Self-Perfection
Arch code pacman
Кажется optional dependencies в выводе pacman гораздо лучше воспринимаются, если выделить цветом, какие из них установлены, типа такого:

pacman -Qi  git | sed "s/\([^: ]\+\)\(: .\+ \[installed\]\)/$(tput setaf 2)\1$(tput sgr0)\2/"

И почему pacman не делает этого из коробки?
Self-Perfection
code bash-completion
С некоторых пор предпочитаю указывать пути к дискам/разделам как /dev/disk/by-id/XXX. Указание через /dev/sdX кажется подверженным случайным упсам. Можно опечататься, порядок дисков мог поменяться, в общем легко для деструктивной операции указать не тот диск.

К сожалению, bash-completion для большинства дисковых утилит слишком умён, чтобы предлагать только диски, но слишком туп, чтобы предлагать в том числе пути из /dev/disk/by-*. Приходится извращаться:
ls /dev/disk/by-id/foo<Tab>^A Alt-d pvcreate
Ну, кто пофиксит?
Self-Perfection
code Jolla
совсем не умеет ACL?!
$ ssh jolla zgrep FS_POSIX_ACL /proc/config
# CONFIG_EXT2_FS_POSIX_ACL is not set
# CONFIG_EXT3_FS_POSIX_ACL is not set
# CONFIG_EXT4_FS_POSIX_ACL is not set
# CONFIG_BTRFS_FS_POSIX_ACL is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_TMPFS_POSIX_ACL=y

Крутаны, кто постоянно ядро пересобирает, not set означает, что не вкомпилено? Или дефолт для подсистемы может быть разный? И как это понять?
Self-Perfection
Debian code
Парагон надёжности debian ни с того ни с сего стал засирать /var/lib/apt/lists/partial/

$ ls -lht /var/lib/apt/lists/partial/|head
total 458M
-rw-r--r-- 1 root root  27M 2015-08-31 18:34 mirror.yandex.ru_debian_dists_jessie_main_source_Sources.xz.decomp.TZdU53
-rw-r--r-- 1 root root  82K 2015-08-31 18:34 mirror.yandex.ru_debian_dists_jessie_non-free_binary-amd64_Packages.xz
-rw-r--r-- 1 root root 6,8M 2015-08-31 18:34 mirror.yandex.ru_debian_dists_jessie_main_source_Sources.xz
-rw-r--r-- 1 root root  98K 2015-08-31 18:34 mirror.yandex.ru_debian_dists_jessie_non-free_source_Sources.xz
-rw-r--r-- 1 root root  11M 2015-08-31 18:28 mirror.yandex.ru_debian_dists_jessie_main_source_Sources.xz.decomp.6tTnbt
-rw-r--r-- 1 root root 3,3M 2015-08-31 18:22 mirror.yandex.ru_debian_dists_jessie_main_i18n_Translation-en.bz2.decomp.B7FRc4
-rw-r--r-- 1 root root  19M 2015-08-31 18:22 mirror.yandex.ru_debian_dists_jessie_main_source_Sources.xz.decomp.ejkiMd
-rw-r--r-- 1 root root  71K 2015-08-31 18:22 mirror.yandex.ru_debian_dists_jessie_non-free_i18n_Translation-en.bz2
-rw-r--r-- 1 root root   32 2015-08-31 18:22 mirror.yandex.ru_debian_dists_jessie-updates_contrib_source_Sources.xz

И всё что я вижу по делу
$ sudo grep  refresh-cache /var/log/syslog|tail
Aug 31 17:46:44 HOSTNAME PackageKit: refresh-cache transaction /2499_cabcaebc from uid 1000 finished with failed after 4909ms
Aug 31 17:52:44 HOSTNAME PackageKit: refresh-cache transaction /2500_eaeacaee from uid 1000 finished with failed after 4793ms
Aug 31 17:58:44 HOSTNAME PackageKit: refresh-cache transaction /2501_dcadddab from uid 1000 finished with failed after 4253ms
Aug 31 18:04:45 HOSTNAME PackageKit: refresh-cache transaction /2502_eeecdccd from uid 1000 finished with failed after 5190ms
Aug 31 18:10:44 HOSTNAME PackageKit: refresh-cache transaction /2503_abaaabdc from uid 1000 finished with failed after 4553ms
Aug 31 18:16:44 HOSTNAME PackageKit: refresh-cache transaction /2504_dbadbbbc from uid 1000 finished with failed after 4706ms
Aug 31 18:22:44 HOSTNAME PackageKit: refresh-cache transaction /2505_cadbbebd from uid 1000 finished with failed after 4620ms
Aug 31 18:28:44 HOSTNAME PackageKit: refresh-cache transaction /2506_daadcbdb from uid 1000 finished with failed after 5013ms
Aug 31 18:34:44 HOSTNAME PackageKit: refresh-cache transaction /2507_eeedeabc from uid 1000 finished with failed after 5030ms
Aug 31 18:40:44 HOSTNAME PackageKit: refresh-cache transaction /2508_cacdddbd from uid 1000 finished with failed after 4663ms

Вот что за фигня?!?!
Self-Perfection
Debian code jessie bash-completion
Что-то у меня очень сильно разъехалось на работе на арчике, так что сломалась его загрузка. И по такому поводу, понимая, что чинить его и разруливать обновления за больше чем полугода та ещё морока, да и зачем мне rolling release, если я так редко на работе глобально обновляюсь, решил поставить Debian 8. Ещё отчасти из-за любопытства, потому что хоть убунтоклоны всякие много трогал, на чистом дебиане не сидел.

Итак расскажу я вам про цирк с bash-completion. Кратко: если у вас свой .bashrc, то bash-completion не работает.

Вообще в /etc/skel/.bashrc есть блок, который сорсит нужные файлы. Но у меня-то свои dotfiles. "Странно", - думаю я: "Занафига подключать bash-completion через пользовательский rc, если он ставится глобальносистемно, значит должен включаться через /etc". И действительно, в /etc/bash.bashrc есть блок, который сорсит bash-completion. Но он закомментирован. Но это, конечно, странно, блок для поддержки прикладного инструмента, который ставится дополнительным пакетом, не должен быть в общем конфиге. И действительно, есть /etc/profile.d/bash_completion.sh! Он не закомментирован, и если я делаю source /etc/profile, то bash-completion включается. Почему же он не включается при логине?

Оказывается, в нём есть такое условие 
# Check for interactive bash and that we haven't already been sourced.
if [ -n "$BASH_VERSION" -a -n "$PS1" -a -z "$BASH_COMPLETION_COMPAT_DIR" ]; then
И этот тест проваливается, потому что "$PS1" очень даже -z. Вообще уже это, пожалуй, баг, потому что правильная проверка на интерактивность bash сеанса делается так:
[[ $- = *i* ]] || return
Но никак не проверкой на пустоту $PS1. Однако почему $PS1 пуст? Смотрим выше в /etc/profile:
if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
	# The file bash.bashrc already sets the default PS1.
	# PS1='\h:\w\$ '
	if [ -f /etc/bash.bashrc ]; then
	  . /etc/bash.bashrc
	fi
  else
	if [ "`id -u`" -eq 0 ]; then
	  PS1='# '
	else
	  PS1='$ '
	fi
  fi
fi
if 
То есть не выставляем $PS1 для bash, т.к. он и так будет выставлен в его /etc/bash.bashrc. А теперь 
$ head /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.

# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return


Снова неправильная проверка на интерактивность и PS1 так и останется не задан, потому что он не задан >_<

Ну что, кто отправит багрепорт/патч?
Дебиан-дебиан, я думал о тебе лучше...
Self-Perfection
WTF code unzip Jolla
Есть скрипт, который должен скачивать zip архив с одним файлом и заменять им существующий. unzip -o (overwite) не подходит, потому что если unzip почему-то заглохнет в процессе, то на месте исходного файла будет начало нового - невалидные данные. Поэтому я сделал примерно так:
unzip -p "$TEMP_ARCHIVE" > "${TEMP_ARCHIVE}_unzipped" || exit 1
mv "${TEMP_ARCHIVE}_unzipped" "${DEST_FILE}" || exit 1
Пока скрипт отрабатывал раз 6 "${DEST_FILE}" и почти в половине случаев "${DEST_FILE}" после обновления оказывался короче, чем нужно. o_O Причём всякий раз на 2^N байт, последний раз ровно на 64 KiB.
Добавление sync между unzip и mv не помогает. Чего-то я не понимаю. Может быть это баг связки странного fuse поверх Btrfs? Как вообще надёжно и адекватно решать такую задачу? sleep не предлагать, это быдлокод.
Self-Perfection
code maridb
MariDB 5.5 на debian 7.6.
Пытаюсь создать innodb таблицу в другой директории с помощью директивы data directory='/mypath'. data directory тупо игнорится.

create table external (x int unsigned not null primary key) data directory = '/var/lib/mysqlext';
# ls -ld /var/lib/mysqlext/
drwx------ 3 mysql mysql 4096 Ноя 24 20:15 /var/lib/mysqlext/
# ls -l /var/lib/mysql/zabbix/external.*
-rw-rw---- 1 mysql mysql  8554 Ноя 24 20:21 /var/lib/mysql/zabbix/external.frm
-rw-rw---- 1 mysql mysql 98304 Ноя 24 20:21 /var/lib/mysql/zabbix/external.ibd

root@localhost [zabbix]> show variables  where Variable_name like '%sym%' ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_symlink  | YES   |
+---------------+-------+

ну и я руками вроде как удостоверился, что запускается mysqld с --symbolic-links.

Ну чего ему не хватает?!
Self-Perfection
Linux code locale
Вот как настроить локаль? Казалось бы, всё просто: открываешь мануал https://wiki.archlinux.org/index.php/Locale , там написано "вот в этот файлик впишите локаль, какую хотите". Ну открываем и вписываем.

Но есть нюансик:
$ grep -i 'ru_ru.*utf' /etc/locale.gen
ru_RU.UTF-8 UTF-8
$ locale -a | grep -i 'ru_ru.*utf'
ru_RU.utf8

Для меня естественен подход посмотреть доступные локали и просто из этого списка скопипастить желаемую. Вот только нотация вывода locale -a отличается от нотации, указываемой во всех манах и locale.gen: character set указывается строчными буквами и без дефиса.

После копипастинга получается что-то вроде export LC_ALL=ru_RU.utf8 и всё вроде бы работает так, как предполагалось. Вроде бы. Потому что изредка вылезают странные баги. 6 лет назад из-за копипастинга локали из locale -a у меня не работал ввод кириллицы в приложения, запущенные под wine ( http://ru-ubuntu.livejournal.com/241325.html ). Теперь я внезапно заметил, что lesspipe у меня не отображает содержимое текстовых *.gz.

Логики в этой различной нотации нет, ни в каких манах об этом нюансе не говорится, никаких ISO на запись названия character set я сходу не вижу. Короче, понять и запомнить это невозможно. Я даже не понимаю, кто в этой ситуации не прав: lesspipe, не совсем надёжно разбирающий значение локали, которая должна быть эквивалентна ru_RU.UTF-8, или же я, некорректно настроивший свою систему.

Разбираться, слать ли патч в документацию или в lesspipe я не хочу, боюсь это может занять не один день. В общем просто имейте ввиду, что есть такая ловушка в настройке ваших линуксов.
Self-Perfection
code snapshot lvm
Решил почистить место в volume group, поудаляв старые снапшоты. Неправильно прочитал маны и вместо банального lvremove сделал

$ sudo lvconvert --merge VolGroup00/var_snap0
  Can't merge over open origin volume
  Merging of snapshot var_snap0 will start next activation.

Тут я понял, что сделал что-то не то. Но как теперь отменить merge?!
$ sudo lvremove VolGroup00/var_snap0
  Can't remove merging snapshot logical volume "var_snap0"

$ sudo lvchange -an VolGroup00/var_snap0
Change of snapshot var_snap0 will also change its origin LogVol01. Proceed? [y/n]: n
  Logical volume var_snap0 not changed.

Блин!
Self-Perfection
Ubuntu code
Господа, особенно те, у кого вариации убунты 13.10, что у вас выводит вот это

time sudo /usr/bin/find / -ignore_readdir_race      \( -fstype NFS -o -fstype nfs -o -fstype nfs4 -o -fstype afs -o -fstype binfmt_misc -o -fstype proc -o -fstype smbfs -o -fstype autofs -o -fstype iso9660 -o -fstype ncpfs -o -fstype coda -o -fstype devpts -o -fstype ftpfs -o -fstype devfs -o -fstype mfs -o -fstype shfs -o -fstype sysfs -o -fstype cifs -o -fstype lustre_lite -o -fstype tmpfs -o -fstype usbfs -o -fstype udf -o -fstype ocfs2 -o      -type d -regex '\(^/tmp$\)\|\(^/usr/tmp$\)\|\(^/var/tmp$\)\|\(^/afs$\)\|\(^/amd$\)\|\(^/alex$\)\|\(^/var/spool$\)\|\(^/sfs$\)\|\(^/media$\)\|\(^/var/lib/schroot/mount$\)\|\(^/home/snapshots$\)' \) -prune -o -print | wc -l
Self-Perfection
Vim backup code vimrc
А хотите немного .vimrc магии? Сейчас мы сделаем настроим vim, чтобы он правильно делал бэкапы редактируемых файлов. Дописываем в .vimrc следующее:

"Включаем. Вроде автоматически включается при задании backupdir, но пусть будет
set backup
"Задаём директорию куда писать бэкапы. Использовать просто ~/.vim/backup несекурно
"т.к. sudo -E vim ЧТОТО сохранит бэкап текущему пользователю, а не руту
let &backupdir=system("getent passwd $USER | cut -d: -f6")[:-2] . '/.vim/backup'
"Пусть vim создаёт директорию для бэкапа при запуске. Можно руками сделать один раз.
call system('mkdir -pv ' . &backupdir)
"Каждый раз пишем бэкап в новый файл с суффиксом -дата_время
au BufWritePre * let &backupext = '-' . strftime("%F_%T")

ЗЫ: две последние команды под вендой работать не должны.
Self-Perfection
Linux Bash code
@oxpa, тебе наверняка понравится этот трюк вместо join:
$ head a b
==> a <==
abc
def
hij

==> b <==
123
456
789
$ pr -tmJ a b |cat -A
abc^I123$
def^I456$
hij^I789$
$ pr -tmJ a b --sep-string=''|cat -A
abc123$
def456$
hij789$