Сохранение истории bash после перезагрузки

Чтобы файл ~/.bash_history не был пустым после перезагрузки, нужно всего лишь изменить его права:

$ sudo chmod 777 ~/.bash_history

Или ещё лучше так:

$ sudo chown username:root ~/.bash_history

где username — имя вашего пользователя.

Рассылка email из таблиц Google одним кликом

По работе понадобилось рассылать сотрудникам письма исходя из данных таблицы. Как это произвести в один клик, хоть массово, хоть адресно? С помощью скрипта Google по такой схеме:

  1. Имеем таблицу с email-адресами и данными для отправки.
  2. Создаём скрипт Google, рассылающий письма на адреса из выделенных ячеек.
  3. Ставим в документ кнопку, при нажатии на которую этот скрипт срабатывает.

Более подробно по пунктам

Использование apktool

В статье про изготовление копий приложений для Android я упоминал о приложении SmartAPKTool. Оно может распаковывать, запаковывать и подписывать изменённые apk-файлы. Её достоинством является наличие графического интерфейса. Однако есть и серьёзный недостаток. SmartAPKTool давно не обновлялся, и программа некорректно распаковывает и запаковывает приложения для свежих версий Android. Поэтому здесь я попытаюсь объяснить, как пользоваться для этих целей приложением apktool. Читать далее Использование apktool

Очистка поля типа file на javascript

В большинстве современных версий браузеров убрана возможность вручную редактировать поля для загрузки файлов на сервер. А это иногда бывает нужно, например, если вы ошибочно добавили не тот файл. Решений этой проблемы масса, но все они мне не подошли (использование jQuery; очистка кнопкой reset, которая удаляет все данные из формы и тому подобное).

Нужное мне решение было найдено здесь. В общем случае можно очищать любые поля формы.

<script lang="javascript" type="text/javascript">
function clearFileUpload(id) {
// Получаем элемент по id
fileField = document.getElementById(id);
// Получаем родительский элемент
parentNod = fileField.parentNode;
// Создаём новый элемент
tmpForm = document.createElement("form");
parentNod.replaceChild(tmpForm,fileField);
tmpForm.appendChild(fileField);
tmpForm.reset();
parentNod.replaceChild(fileField,tmpForm);
}
</script>
[…]
<!-- Эта кнопка очищает два поля с указанными id -->
<input onclick="clearFileUpload('field1_id'); clearFileUpload('field2_id');" value="X" type="button">
[…]

Проверено в Chrome 30 и старой версии Opera 12.16

Как суммировать найденные значения в таблицах Google?

В Google Calc (и в MS Excel) есть функция VLOOKUP, позволяющая искать нужную строку и выводить соответствующий ей параметр:

=VLOOKUP("Строка поиска";диапазон;номер_столбца;сортировка)

Справку по функции можно найти здесь.

Пример:

=VLOOKUP("Трава";A1:B5;2;FALSE)


Эта формула позволяет найти в таблице покупок нужный товар в первом столбце диапазона и вывести его цену из второго столбца диапазона.

Но что делать, если мы больше одного раза покупали один товар, и хотим вывести сумму всех покупок этого товара? Функция VLOOKUP в паре с функцией SUM будет выводит первое найденное значение:

=SUM(VLOOKUP("Трава";A1:B5;2;FALSE))


Вместо этого нужно пользоваться такой конструкцией:

=SUM(IFERROR(FILTER(B1:B6; SEARCH("Трава";A1:A6));0))


Здесь мы:

  • ищем (SEARCH) товар в первом диапазоне;
  • отфильтровываем (FILTER) из второго диапазона те значения, которые соответствуют найденным значениям;
  • игнорируем ошибочные значения (IFERROR(…; 0));
  • складываем (SUM) полученные значения.

Без использования SUM выводятся все значения цены в виде списка.

Склейка VOB файлов в один

Зачем перекодировать DVD в какие-то другие форматы, если можно просто склеить видеофайлы в один?
В командной строке Windows это делается так:

:: Назначаем выходной файл
SET OUT=output.VOB
:: Создаём пустой выходной файл
copy nul %OUT%
:: Ключ /B означает бинарный режим, без него не заработает
FOR %I IN (*.VOB) DO copy /B %OUT% + %I %OUT%

Вместо * могут быть другие подстановочные символы, формирующие ваше условие.

В Linux это делается так:

for a in *.VOB
do
cat "$a" &gt;&gt; output.VOB
done

WordPress: искажение кода в блоке с подсветкой синтаксиса

Столкнулся с неприятной ситуацией, настраивая WordPress. Блоки, в которых выводится исходный код, отображались по-разному в самом посте и на главной странице. Причём отображение касалось не только внешнего вида. Искажался сам код. А это уже серьёзнее, т.к. могло ввести в заблуждение читателей. Сразу скажу: галочка «Параметры → Написание → WordPress должен исправлять некорректный XHTML-код автоматически» у меня снята. Читать далее WordPress: искажение кода в блоке с подсветкой синтаксиса

Google Docs: текущий курс валюты

Текущий курс валюты (в примере — курс доллара ЦБ РФ) можно получить с помощью следующей функции:

=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp"; "//ValCurs/Valute[CharCode=""USD""]/Value")

То же самое на любую дату:

=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp?date_req=01/01/2011"; "//ValCurs/Valute[CharCode=""USD""]/Value")

Дополнение от 7 янв. 2015:
Спасибо Илье Кочеткову за упрощение формулы. Старый вариант под катом. Возможно, кому-то пригодятся и решения из него. А можно даже ещё проще, т.к. буквенный код валюты уникален:
=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp"; "//*[*=""USD""]/Value")
Спасибо Михаилу.
Читать далее Google Docs: текущий курс валюты

Монтирование NTFS во FreeBSD

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

ntfs-3g -o rw,locale=ru_RU.UTF-8 /dev/ad10s1 /mnt/ntfs/

Для этого нужно сначала установить fusefs-ntfs.
После установки прописываем в rc.conf строку:

fusefs_enable="YES"

Без перезагрузки можно запустить командой:

/usr/local/etc/rc.d/fusefs start

Проверяем, загружен ли модуль:

kldstat | grep fuse.ko

По материалам раз и два. Если что-то не работает — ищем там.