Заметки о ньюансах разработки с использованием Qt и PyQt

Эта запись — блокнот для записи небольших заметок о некоторых неочевидных особенностях, всплывающих при разработке приложений с использованием Qt, а также PyQt.
Эти особенности приходится гуглить, а потом о них быстро забываешь, поэтому будет полезно хранить для себя и человечества эту информацию.

Читать далее


Debian 8 Jessie на ноутбуке Acer ES1-711G

За несколько лет использования в работе и дома ноутбуков Lenovo я уже успел забыть, какие проблемы бывают при попытке установить на ноутбук Linux, так как с ноутбуками Lenovo у меня была единственная проблема — установить правильный WiFi-драйвер.

Но пришло время, когда мне достался ноутбук Acer ES1-711G, и пришлось вспомнить навыки гугления, чтения логов, курения мануалов, и экспериментов с системой. С ходу установить Debian не удалось. А когда удалось — возник ещё целый ряд проблем.

В интернете есть буквально пара-тройка записей посвящённых этому ноутбуку и проблемам, возникающим с ним, но целостной картины нигде нет. Поэтому здесь я соберу полную инструкцию. Может кому-то ещё это поможет.

Читать далее


Установка нового Flash Plugin в Firefox/IceWeasel (Debian Wheezy, Jessie, Ubuntu Wily Werewolf)

Как заставить работать Firefox в Linux с новейшей версией Flash Player (выше 11.2)

Как известно, новые версии Adobe Flash Player существует в нескольких версиях:

  • ActiveX — для Internet Explorer’a (только в Windows)
  • NPAPI — существовал долгое время для всех остальных браузеров, в последнее время остановился в развитии (в Linux, для Windows всё ещё выходит)
  • PPAPI — существует с относительно недавнего времени для браузеров на движке Chromium

Компания Adobe с 2012 года отказалась поддерживать плагин Flash Player для NPAPI, и поэтому у многих пользователей FireFox в Linux версия плагина не поднимается выше 11.2

При этом сейчас (сентябрь 2016 года) уже есть Flash Plugin версии 23 и даже старше.

Решение придумал Ринат Ибрагимов, программер из Казани. Он написал обёртку (враппер) между NPAPI (системой плагинов Firefox) и PPAPI (системой плагинов Chromium). Эта обёртка выглядит для FireFox как обычный NPAPI-плагин, в то время, как для самого плагина, она выглядит как браузер с поддержкой PPAPI (как например Google Chrome).
То есть, схема работы такая:

Новый Adobe Flash PPAPI <=> Враппер FreshPlayer Рината <=> Firefox

Вот аккаунт героя на гитхабе: https://github.com/i-rinat
А вот и репозиторий с враппером: https://github.com/i-rinat/freshplayerplugin
Хотя в самом репозитории есть инструкция по установке, запишу здесь чёткую последовательность действий, чтобы не забыть, да и другим помочь.

Читать далее


FastFuzzySearch — Быстрый нечёткий поиск среди массива слов на PHP

Бывает, что нужно найти в списке слов наиболее похожие на заданное слово.
Например, если у вас есть список городов, и нужно найти среди них наиболее похожий на то, что ввёл пользователь, даже если при вводе пользователь допустил ошибки.

При этом, разумеется, есть мощные профессиональные системы поиска, такие как Sphinx, ElasticSearch, но не всегда имеет смысл их разворачивать и настраивать, ради одной небольшой задачи, либо когда вам только нужно сделать прототип поиска, чтобы проверить, даст ли он требуемые преимущества.

Для таких случаев я написал на php инструмент для нечеткого поиска среди массива строк.

В каких случаях может пригодится данный инструмент:

1. Поиск среди списка стран мира

2. Поиск среди названий страниц вашего сайта в админ-панели

3. Поиск среди уникальных имён ваших пользователей

и в других случаях, где количество записей списка не превышает несколько тысяч.

Я, например, написал этот инструмент для того, чтобы разделять поле ФИО, в которое люди вписывают имя, фамилию и отчество в произвольном формате, на отдельные поля Имя, Фамилия и Отчество, с соответствующими значениями.

Читать далее


Быстрое сравнение изображений на PHP через hash изображения

Иногда возникает потребность определить, являются ли два файла изображений одинаковыми, или очень похожими (когда одно из них было сильнее сжато, сохранено в другом формате файла, или размер его был изменён).
Это может понадобиться в следующих случаях:

  • У вас на сайте есть большая база изображений, и вы хотите найти в ней дубликаты (очень похожие друг на друга) с целью удаления.
  • На вашем сайте есть база изображений, и вы, при загрузке нового изображения, хотите проверить, нет ли уже такого
  • Вы хотите реализовать поиск по изображениям, то есть, если вы хотите выбрать из базы изображение, название которого не помните, но у вас есть его файл, вы можете загрузить этот файл и найти по нему уже существующий, и выбрать найденное

Для этого идеально бы подошёл некий алгоритм создания хэша — некоего числа или достаточно короткой строки, которые можно было бы один раз сгенерировать для всех ваших изображений, а потом, при добавлении нового изображения сверять его хэш с ними. Это будет гораздо быстрее чем перебор всех изображений и сравнение их самих.

Долгие поиски в Интернете, не дали мне подходящего алгоритма, поэтому я создал свой.
Читать далее


Заметки о ньюансах разработки в UnrealEngine4

Эта запись — блокнот для записи небольших заметок о некоторых неочевидных особенностях, всплывающих при разработке игр на Unreal Engine 4.
Все эти особенности приходится гуглить, а потом о них быстро забываешь, поэтому будет полезно хранить для себя и человечества эту информацию.

Речь будет идти в основном о «программировании мышкой» посредством BluePrint’ов.

Читать далее


Автоматический переводчик gettext po-файлов

Наиболее распространённый способ переводов программного обеспечения и веб-сайтов на разные языки — с помощью библиотеки gettext.
Для тех, кто не в курсе, поясню как она работает:

  1. В коде программы/сайта, везде где вам нужно выводить некий текст, меняющийся в зависимости от языка, вы пишете не просто строковые константы, типа «Да» и «Нет», а используете некую специальную функцию вроде _(«Да»), _(«Нет»), или t(«Да»), t(«Нет»), или даже [`Да`], [`Нет`].
  2. Вы запускаете специальный скрипт, который сканирует весь ваш исходный код, находит такие вот специфические вызовы функции, и составляет из них *.po — файл.
  3. Вы с помощью некоего редактора, например poedit добавляете в файл *.po переводы всех строк которые там есть на некий язык, и сохраняете файл как, например, en_US.po, после чего генерируете соответствующий *.mo-файл, в данном случае en_US.mo.
  4. Вы указываете вашей программе/сайту путь к файлу перевода (например, берёте из сессии или из данных браузера язык, который выбран у пользователя, и исходя из этого, выбираете ru_RU.mo или en_US.mo
  5. Программа/сайт автоматически заменяет ваши t(«Да») и t(«Нет») на слова написанные на том языке, который был выбран.

Как же перевести po-файл автоматически, если качество перевода для вас не важно, но нужно чтобы сайт/приложение начало выглядеть как многоязычное для вашего заказчика?

Читать далее


Электронные весы Arduino + HX711 + Python

Мало купить Arduino и написать для него десяток программ, которые мигают светодиодами, реагируют на нажатие кнопок, и измеряют температуру воздуха терморезистором.
Рано или поздно нужно сделать своё первое законченное устройство, от которого будет польза.
Для меня таким устройством стал аппаратно-программный комплекс для снятия данных с датчика силы.

Читать далее


Преобразование значений полей PHP-форм во вложенные объекты JavaScript

Как известно, чтобы передать в PHP-скрипт данные из HTML-формы в виде массива, нужно использовать ключи вида «field[key]», например:
[html] <form id=myform>
Пользователь 15:<br>
<input type=hidden name="User[15][id]" value="15"><br>
Имя:<input type=text name="User[15][name]" value="Вася"><br>
Телефон:<input type=text name="User[15][phone]" value="+79991234567"><br>
Пользователь 16:<br>
<input type=hidden name="User[16][id]" value="16"><br>
Имя:<input type=text name="User[16][name]" value="Петя"><br>
Телефон<input type=text name="User[16][phone]" value="+79824445551"><br>
</form>
[/html] Многие PHP-фреймворки при создании HTML-форм, дают имена их элементам подобным образом. Это и понятно, формировать их так — очень просто, при передаче такой формы в PHP-код она превратится в удобный массив вида:

array(
    "User" => array(
        15 => array(
            "name" => "Вася",
            "phone" => "+79991234567"
        ),
        16 => array(
            "name" => "Петя",
            "phone" => "+79824445551"
        ),        
    )
);

Но если вы передаёте его не путём обычной отправки формы, а с помощью Ajax, тут вас и подстерегает проблема.

Читать далее


SSL-сертификат Let’s Encrypt на Nginx

Проект Let’sEncrypt вошёл в стадию публичной беты 3-го декабря 2015 года. Теперь его можно попробовать.

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

На счёт «бесплатно» — здесь всё ясно. Можно бесплатно получить сертификат уровня Domain Validation.

А вот на счёт «автоматически» — чуть посложнее. Разберём процесс получения и установки сертификата.

UPD: Увеличена степень «автоматизма» получения сертификата, убраны однообразные ручные операции.

Читать далее


Страницы:12345