Позднее Ctrl + ↑

mysqldump с учетом UTF-8

Если мы хотим сделать дамп базы MySQL и сохранить весь utf-8 набор символов, включая эмоджи и прочие радости жизни, то использовать такой классический пример будет очень плохой идеей:

mysqldump -u username -p database > db.dump

Так уже лучше, но эта команда сдампит только utf8, но не utf8mb4:

mysqldump -u username -p database -r db.dump

А вот так, будет совсем хорошо:

mysqldump -u username -p database --default-character-set=utf8mb4 --result-file=db.dump

Теперь, базу нужно импортировать на новое место.

Так — плохо:

mysql -u username -p database < db.dump

А вот так — хорошо:

$ mysql -u username -p --default-character-set=utf8mb4 database
mysql> SOURCE db.dump

Добавляем отрисовку формул в движок Эгея

После беглого поиска движка для отрисовки математических формул, выбор пал на MathJax. Дело за малым, осталось воткнуть его в Эгею.

Согласно документации, мы можем добавлять произвольные элементы для отрисовки движком при помощи допблоков:

  • header-pre
  • header-post
  • note-pre
  • note-post
  • footer-pre
  • footer-post

Имя блока соответствует позиции, где будет находиться их содержимое. В нашем случае, вполне подойдет блок header-pre, а значит создадим в папке /user/extras (от корня блога) файл header-pre.tmpl.php и поместить в него код для добавления MathJax на сайт:

<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML' async></script>

Документацию по настройке параметра config можно почитать тут. В целом, все готово и можно протестировать на определении предела числовой последовательности, которое так любил спрашивать мой преподаватель матана.

Код:

$$ \lim_{n \to \infty} x_n = a ~ \Leftrightarrow ~ \forall \varepsilon > 0 ~ \exists N (\varepsilon) 
\in \Bbb{N} \colon ~  n \geqslant N ~ \Rightarrow |x_n - a| < \varepsilon $$

Результат:

 $$ \lim_{n \to \infty} x_n = a ~ \Leftrightarrow ~ \forall \varepsilon > 0 ~ \exists N (\varepsilon) \in \Bbb{N} \colon ~ n \geqslant N ~ \Rightarrow |x_n — a| < \varepsilon $$

Подготовка изображения к OCR

Бывает, что мне нужно провести несколько экспериментов по распознаванию текста на довольно зашумленных изображениях при помощи Tesseract с одним условием — надо сделать быстро.

Но совсем плохой результат получить тоже не хочется. Поэтому, чтобы улучшить точность распознавания, нужно очистить исходное изображение от шумов и посторонних объектов. Для этого можно либо написать чутка кода, либо использовать утилиту convert из ImageMagick, либо можно взять вот этот скрипт textcleaner, который, по факту, является надстройкой над convert, но простой как три копейки и сильно ускоряет работу. Вся документация подробно изложена на официальной страничке.

Пример удаления бэкграунда, очистки текста, поворота и обрезки изображения:

./textcleaner -g -e stretch -f 30 -o 17 -t 15 -u -s 2 -T -p 20 -c 5 infile.jpg outfile.jpg

Было/стало:

Дальше запускаем сам tesseract (у меня 4ая бета с LSTM моделями):

tesseract outfile.jpg stdout -l eng --oem 1

И получаем уже чистый текст:

Clarification

In the last edition of the “Catholic New World,” an
article on the annual conference hosted by the Re-
spect Life Oftice did not fully reflect the context of
Cardinal George’s remarks.

During an informal question-and-answer session
with the archdiocese’s parish Respect Life Coordi-
nators, the cardinal emphasized that the participa-
tion by any person in the promotion of abortion, in-
cluding through his or her political position, is a
grave matter. While the issue of withholding Com-
munion- from some of these individuals can be
complex, Cardinal George said that when any per-
son presents him or herself to receive the Eucharist,
they “take their salvation into their own hands.” For
a more complete explanation of this matter, refer-
ence the cardinal’s column “Catholic participation
in political life, revisited” (CNW, Oct. 10, 2004)
online at www.catholicnewworld.com/
cnw/issue/2004/cardinal _101004.html .

Качество распознавания получилось вполне достойное.

Есть только один минус: бесплатное использование textcleaner разрешено только в некоммерческих целях. В общем, автор жадина-говядина :) Так что используем только для домашних проектов, либо вполне заслуженно поддерживаем финансово создателя скрипта.

Time Machine в macOS зависает на Preparing backup

Time Machine крайне удобный инструмент для создания резервных копий в macOS. Штука безотказная, простая как три копейки, но и на старуху бывает проруха.

Сегодня, после подключения внешнего диска и запуска резервного копирования, процесс намертво завис на этапе «Preparing backup». Вручную, через меню вверху экрана он не останавливался, перезагрузка тоже не помогла.

Стоит отметить, что если вы не делали резервное копирование несколько месяцев или у вас очень объемный жесткий диск, то длительная подготовка может быть обоснована временем необходимым для индексации новых/изменных файлов. В моем случае, бэкап был сделан несколько дней назад и два часа ожидания совсем не походили на штатную ситуацию. Тем более, что с диска явно ничего не читалось и на него не писалось.

Оказалось, что эта проблема решаема и довольно быстро. Итак, по порядку:

Шаг 1: Идем в System Preferences -> Time Machine и останавливаем процесс резервного копирования нажатием на крестик справа от прогрессбара.

Шаг 2: В Finder открываем диск на который Time Machine пишет данные. Там должна быть папка Backups.backupdb, заходим в нее, открываем внутри папку с именем вашего компьютера и ищем там самый свежий файл с расширением .InProgress. Его имя имеет формат год-месяц-день-случайное_число.InProgress.

Нашли? Теперь удаляем его.

Шаг 3: Перезагружаем систему не отключая внешний диск.

Шаг 4: После загрузки системы ждем некоторое время и запускаем процесс резервного копирования заново, как обычно.

Теперь все должно пройти гладко.

WhatsApp

Короткая но развеселая заметка из будней борьбы со спамом.

Допустим, у нас стоит задача, запретить оставлять свои контакты в каком-либо текстовом поле. Под контактами подразумеваем любые данные, которые ведут на другую социальную сеть или мессенджер. Например: номера телефонов, e-mail, ссылки на профили в Facebook и ВКонтакте.

Конечно, пользователям это не понравится, особенно если альтернатива — заплатить свои кровные пять копеек. Поэтому стартует раунд специальной олимпиады — как бы так исковеркать текст, чтобы алгоритм не понял, что это именно контактные данные?

Ради интереса, собрал небольшой списочек разных вариантов. Поплачьте вместе со мной, да.

WhatsApp — каноничный вариант, для референса. А теперь, начинается хтонический ужас:

wapp, воцап, воцапе, вайцап, vвотцар, воссап, ватсаб, всапп, вцабб, ведсап, ватсап, цапе, выцапан, watsap, vhatsapp, whatsup, whatapp, wtzp, whatsap, vatsap, what’s app, whatssapp, w h a t s, watsaap, what’s up, whapp, wathsape, wahatsapp, wp, whaazapa, vathsapp, watsp, whatsa, uozzaap, wapsattan — этот, мой любимый.

Все это не считая вариантов разделенных пробелами «w h a t s», другими разделителями типа «w.h.a-t-sapp», повторения букв «вааацааап» и других увеселительных мероприятий. И мы еще даже не добрались до самих номеров телефонов для WhatsApp.

И фильтруя все это, стоит не забывать, что пользователь может просто поприветствовать собеседника «what’s up bro» и любые следующий цифры могут быть отнюдь не номером телефона, а датой и временем или гео-координатами или бог весть чем.

Шах и мат любители регэкспов для фильтрации спама.

Ранее Ctrl + ↓