Обновить
9

Пользователь

24
Подписчики
Отправить сообщение
А почему в статье Intel для ассемблера используется синтаксис AT&T? :)
Вы на спичках экономите, на самом деле. Это не «лишний шаг», это одноразовое действие при загрузке машины, которое решает вашу проблему с «удалили директорию, покрешился демон» в полном объеме, без костылей с попытками предотвратить mv, о котором писал kekekeks.

И да, immutable для mount-а не нужен вообще в данном случае — зачем запрещать модификацию структуры директории? Пусть меняют, это их директория и их личные проблемы.
Просто назначьте логи в другое место, в которое у гостей доступа не будет, а это другое место просто примонтируйте к локальной директории гостя через -o bind. Если удалит — сам себе злобный буратино, но зато никто больше не пострадает.
нет, отдельная версия только для Омска, если вы понимаете, о чем я.
Если бы у меня не было оснований сомневаться в правдивости изложенного, я бы не задавал такой вопрос. Однако квалификации, чтобы однозначно назвать это бредом, у меня нет. Слова-маркеры «якобы» и «без ссылок» могли бы подсказать скептический контекст моего вопроса.
да и EFI в 93 году…
О, как раз статья по теме! Давно читал вот это на Мембране, и, насколько я понял, некие ученые из NASA без ссылок утверждают, что капля металла, будучи расплавленная в невесомости и вакууме, и, стало быть, лишенная центров кристаллизации, застывает следующим образом:



И получает оптическую прозрачность и всяческие хитрые магнитные свойства. Несмотря на то, что картинка якобы с сайта NASA, я не смог найти ничего по теме. Собственно, в статье-то правду говорят? И если да, то почему так мало информации?
Все эти галактики создавались генератором псевдослучайных чисел — для одного сида последовательность была постоянной.
Да вы задрали с этим, серьезно. Вот этими вот сравнениями вы даете полноценный повод феминистической мразоте потом травить астрофизиков за принт рубашки и постить сравнения, чем именно собаки лучше мужчин. Нет ни малейшей разницы, кто шарит в коде, девушка или парень, если они действительно шарят. Если не шарят — пол тоже не оправдание. Мозг или есть, или его нет, и от пола это не зависит, и программирование ничем не отличается от любого другого скилла, который можно развить.
То, что теперь это «элементы яндекса», не меняет их троянской сути.
Нет, это специальный фильтр для придания скриншотам ламповости.
даааа, на ЛОРе максимально дружелюбная публика!
  1. присваивание : ${VAR:='value'} лучше, чем просто VAR='value' тем, что если VAR уже назначен до вызова скрипта, то присваивания не произойдет — таким образом, HIDERRC и DESKTOP_ROOT можно переопределить через переменные окружения, при вызове в командной строке (HIDERRC=/private/etc/hiderrc DESKTOP_ROOT=/Applications/ hider.sh) или в каком-нибудь bash_profile на усмотрение.
  2. затем же, зачем "${FOO}" вместо "$FOO" — это единый стиль без какого-то существенного обоснования. Насколько мне известно, фигурные скобки делают ничего.
  3. локальные переменные — в нижнем регистре, глобальные — в заглавном, именование pascal_case-ом. опять же, на вкус и цвет… вы всегда можете форкнуть скрипт и исправить в нем то, что по вашему не так ;)
Если хочется бОльшего контроля над раскладкой — Ukelele в помощь.
Нет, не лишнее.

Без трекпада нет возможности пользоваться жестами, которые используются вообще везде — два пальца для прокрутки окон во всех направлениях и вызова центра уведомлений, зума, вращения, контекстных меню, трехпальцевое смахивание вниз для Exposé (список окон и документов активного приложения) и вверх для Mission Control (список пространств и приложений), трехпальцевое смахивание вбок для переключения между пространствами, трехпальцевые тапы для контекстных действий, четырехпальцевые комбинации для показа рабочего стола и launchpad, и так далее, и тому подобное. Эти комбинации удобно использовать именно так, как они есть — мышью выполнить их невозможно, а на клавиатуру маппить неудобно.

Покупка эппловской клавиатуры более опциональна, если есть возможность найти PC-клавиатуру с кнопкой Fn. Я когда-то мокрыми руками после душа потрогал клавиатуру своего ноутбука, пара капель воды попали внутрь и с тех пор у меня кнопка Fn не работает. Я не подозревал, насколько я часто ей пользуюсь, сам того не замечая, и теперь постоянно испытываю дичайшее неудобство от её нехватки. Fn-кнопка используется в том числе для регулировки яркости экрана, подсветки, громкости, навигации по плейлисту (которой я, правда, никогда не пользовался), навигации в пределах строки в терминале и т.д.

У PC-клавиатур иначе расположены модификаторы — Ctrl, Meta, Alt вместо Ctrl, Opt и Cmd. В принципе, с этим можно бороться при помощи Karabiner (бывший KeyRemap4Macbook), потому что иначе конформистский путь «использовать, как есть» искажает всю суть. К примеру — операция копирования в буфер обмена выполняется Cmd+C. Эти две кнопки находятся очень близко, и нажимаются сведенными указательным и большим пальцем без какого-то напряжения. На PC-клавиатуре пришлось бы нажать или Ctrl+C, для которого большой палец нужно заводить далеко назад к ладони, или Win+C, что всё еще не так удобно. Разница чувствуется, когда через удаленный рабочий стол заходишь на Windows-компьютеры. Еще примеры подобных сочетаний — переключение раскладки через Cmd+Space или вызов настроек через Cmd+,.

Единственный ощутимый минус Apple-клавиатур — отсутствие кнопки Insert, которая бывает нужна при удаленной работе с Windows-системами, и с этим ничего не поделать, кроме как назначать через тот же Karabiner её эмуляцию на комбинацию вида Fn+Return или Fn+I.
багфиксы!
#!/bin/bash

: ${DESKTOP_ROOT:='/usr/share/applications'}
: ${HIDERRC:="${HOME}/.hiderrc"}

function trim() {
	local s="${@}";
	s="${s#"${s%%[![:space:]]*}"}"; # trim leading whitespace
	s="${s%"${s##*[![:space:]]}"}"; # trim trailing whitespace
	
	echo -n "${s}";
};

function describe() {
	case "$1" in
		'yes') echo -n 'hidden'; ;;
		'no') echo -n 'visible'; ;;
	esac;
};

function to_bool() {
	case "$1" in
		'yes') echo -n 'true'; ;;
		'no') echo -n 'false'; ;;
	esac;
};

function is_shortcut_hidden() {
	local state='section';
	local hidden='no';
	
	while IFS='' read -r line; do
		if [[ "${line}" == '#'* ]]; then {
			continue; # skip over comment lines
		} fi;
		if [[ "$(trim "${line}")" == '' ]]; then {
			continue; # skip over empty lines
		} fi;
		
		while [[ true ]]; do
			case "${state}" in
				'section')
					if [[ "$(trim ${line})" == '[Desktop Entry]' ]]; then {
						state='keyvalue';
					} fi;
					;;
				
				'keyvalue')
					if [[ "${line}" == '['*']' ]]; then {
						state='section';
						continue; # reinterpret current section
					} else {
						IFS='=' read -r key value < <(echo "${line}");
						
						if [[ "$(trim ${key})" == "NoDisplay" ]]; then {
							case "$(trim ${value})" in
								'0' | 'false') hidden='no' ;;
								'1' | 'true') hidden='yes' ;;
							esac;
						} fi;
					} fi;
					;;
			esac;
			
			break;
		done;
	done < "$1";
	
	echo -n "${hidden}";
};

function read_rc() {
	local section_hidden='yes';
	local path;
	local shortcut_hidden;
	
	if [[ ! -r "${HIDERRC}" ]]; then {
		return; # nothing to do if we have no conf
	} fi;
	
	while IFS='' read -r line; do
		if [[ "${line}" == '#'* ]]; then {
			continue; # skip over comment lines
		} fi;
		if [[ "$(trim "${line}")" == '' ]]; then {
			continue; # skip over empty lines
		} fi;
		
		case "${line}" in
			'[hide]') section_hidden='yes' ;;
			'[show]') section_hidden='no' ;;
			*)
				if [[ "${line}" == '/'* ]]; then { # absolute path
					path="${line}";
				} else {
					path="${DESKTOP_ROOT}/${line}";
				} fi;
				
				if [[ ! -e "${path}" ]]; then {
					>&2 echo "Shortcut ${path} is missing!";
					continue;
				} fi;
				
				shortcut_hidden="$(is_shortcut_hidden "${path}")";
				
				if [[ ! "${shortcut_hidden}" == "${section_hidden}" ]]; then { # action!
					echo "Shortcut ${path} should be $(describe "${section_hidden}"), but is $(describe "${shortcut_hidden}")";
					
					echo -n $'\n[Desktop Entry]\nNoDisplay='"$(to_bool "${section_hidden}")"$'\n' >> "${path}";
				} fi;
			;;
		esac;
	done < <(cat "${HIDERRC}"; echo);
};

read_rc;
По поводу избегания дубликатов при повторном запуске — вы натолкнули меня на мысль приделать к этим костылям велосипедный гудок.

#!/bin/bash

: ${DESKTOP_ROOT:='/usr/share/applications'}
: ${HIDERRC:="${HOME}/.hiderrc"}

function trim() {
	local s="${@}";
	s="${s#"${s%%[![:space:]]*}"}"; # trim leading whitespace
	s="${s%"${s##*[![:space:]]}"}"; # trim trailing whitespace
	
	echo -n "${s}";
};

function describe() {
	case "$1" in
		'yes') echo -n 'hidden'; ;;
		'no') echo -n 'visible'; ;;
	esac;
};

function to_bool() {
	case "$1" in
		'yes') echo -n 'true'; ;;
		'no') echo -n 'false'; ;;
	esac;
};

function is_shortcut_hidden() {
	local state='section';
	local hidden='no';
	
	while IFS='' read -r line; do
		if [[ "${line}" == '#'* ]]; then {
			continue; # skip over comment lines
		} fi;
		
		while [[ true ]]; do
			case "${state}" in
				'section')
					if [[ "$(trim ${line})" == '[Desktop Entry]' ]]; then {
						state='keyvalue';
					} fi;
					;;
				
				'keyvalue')
					if [[ "${line}" == '['*']' ]]; then {
						state='section';
						continue; # reinterpret current section
					} else {
						IFS='=' read -r key value < <(echo "${line}");
						
						if [[ "$(trim ${key})" == "NoDisplay" ]]; then {
							case "$(trim ${value})" in
								'0' | 'false') hidden='no' ;;
								'1' | 'true') hidden='yes' ;;
							esac;
						} fi;
					} fi;
					;;
			esac;
			
			break;
		done;
	done < "$1";
	
	echo -n "${hidden}";
};

function read_rc() {
	local section_hidden='yes';
	local path;
	local shortcut_hidden;
	
	if [[ ! -r "${HIDERRC}" ]]; then {
		return; # nothing to do if we have no conf
	} fi;
	
	while IFS='' read -r line; do
		if [[ "${line}" == '#'* ]]; then {
			continue; # skip over comment lines
		} fi;
		
		case "${line}" in
			'[hide]') section_hidden='yes' ;;
			'[show]') section_hidden='no' ;;
			*)
				if [[ "${line}" == '/'* ]]; then { # absolute path
					path="${line}";
				} else {
					path="${DESKTOP_ROOT}/${line}";
				} fi;
				
				shortcut_hidden="$(is_shortcut_hidden "${path}")";
				
				if [[ ! "${shortcut_hidden}" == "${section_hidden}" ]]; then { # action!
					echo "Shortcut ${path} should be $(describe "${section_hidden}"), but is $(describe "${shortcut_hidden}")";
					
					echo -n $'\n[Desktop Entry]\nNoDisplay='"$(to_bool "${section_hidden}")"$'\n' >> "${path}";
				} fi;
			;;
		esac;
	done < <(cat "${HIDERRC}"; echo);
};

read_rc;

пример ~/.hiderrc

# Just not needed for others to know that i have this in my system.
# I always can run them from cli. Вот
bleachbit-root.desktop
bleachbit.desktop
bum.desktop
gparted.desktop
guake.desktop
luakit.desktop
synaptic.desktop
teamviewer-teamviewer9.desktop
umit.desktop
virtualbox.desktop
wireshark.desktop

# Rubbish. То, что не запускаем отдельно,
# а открывается автоматически при открытии соответствующего файла,
# основываясь на file associations
AdobeAIR.desktop
caffeine-preferences.desktop
dropbox.desktop
empathy.desktop
evince.desktop
file-roller.desktop
gdebi.desktop
gthumb.desktop
gxneur.desktop
ibus-setup.desktop
libreoffice4.3-base.desktop
libreoffice4.3-calc.desktop
libreoffice4.3-draw.desktop
libreoffice4.3-impress.desktop
libreoffice4.3-math.desktop
libreoffice4.3-writer.desktop
noise.desktop
pantheon-terminal.desktop
totem.desktop
update-manager.desktop
vlc.desktop

# Скрыла, потому что эти приложения доступны из контекстного меню.
# Посчитала излишним дублировать их в меню. Время покажет права ли я.
atom.desktop
scratch-text-editor.desktop
scribes.desktop
sublime_text.desktop

пример синтаксиса ~/.hiderrc
# это комментарий!

# распознаются две секции - [show] и [hide].
# [show] делает все ярлыки в секции видимыми, [hide] их прячет.
# если секция не указана, то это считается [hide]
i_will_be_hidden.desktop

[show]
# если имя файла начинается с "/", считается, что это абсолютный путь к файлу
/absolute/path/to/file.desktop
# иначе имя файла считается относительным от пути в ${DESKTOP_ROOT}
relative/path/to/file.desktop

# секции могут повторяться и перемежаться
[hide]
foo.desktop
spaces are fine too.desktop


Этот скрипт можно закинуть в cron на выполнение раз в час, скажем, и он будет обновлять ярлыки, которые у него есть в списке, если их параметры видимости не отвечают требуемым. Содержимое .desktop-файлов корректно парсится, следуя вот этому.
Это не лишний $, а C-строковый литерал. В вашем варианте следовало бы писать echo -ne, иначе \n будет выведен, как есть.
Apple в OS X Yosemite взяла похожий подход — без видео на фоне, правда.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Архитектор программного обеспечения