Tags: чёрная магия

Гномы в Героях

Сего дня случилось долгожданное - я наконец-то выиграл последнюю миссию "Молотов судьбы". Это заняло у меня много времени, пытался с перерывами больше двух недель. Мои начальные попытки зарашить короля Толгара приводили к тому, что он с лёгкостью размазывал меня по стенам своей крепости.

Collapse )

Опыт, сын ошибок трудных

После почти месячного перерыва, вновь занялся своим терменвоксом. Толчком к третьей перепайке послужил совет от мастера, к которому я обратился: переделать всё на навесной монтаж.

Когда я наконец начал работу (всю неделю потратив на нахождение болтов 2.5 под стойки навесного монтажа и их, т.е. болтов, последующее укорачивание), я смог осознать две важные вещи.

  1. Кембрик - на пайку, термоусадку - на пересечение.
  2. Всё это время я подключал вертикальную антенну к выходу схемы "Volume antenna assembly", а горизонтальную изогнутую - к "Pitch antenna assembly".

Пояснение к пункту один: место пайки нужно оставлять доступным для распайки в будущем; термоусадка хорошо подходит для изоляции - ну а она нужна в тех местах, где контакты могут пересекаться.

Пояснение к пункту два для тех кто ничего в терменвоксах не смыслит. Я делал всё задом наперёд.

Генерация кода на питоне с помощью hy 2

При генерации питоновского кода, в отличие, например, от написания макросов, для нас является важным, какие названия носят новые символы, т.е. в случае питона - имена вновь сгенерированных функций, классов, переменных. Другими словами, стандартный способ в лиспе ((gensym)) нам не подходит. Также в hy нет стандартного для многих лиспов (intern), служащего для превращения произвольной строки (с поправкой на ограничения по грамматике) в символ.

Collapse )

Поддельные объекты

Недавно пришлось озадачиться следующим вопросом - доступом к базе данных (postgres) для слива оттуда определённого рода интересных данных. В сущности, это решается одним sql-запросом, но с каких пор мы ищем лёгкие пути?

Поэтому было решено использовать уже имеющиеся orm-модели.

Проблема заключалась в следующем. Эти модели были получены класса SQLAlchemy пакета flask.ext.sqlalchemy, и потому имела место быть зависимость от flask. А объективно говоря, для подключения к БД и выполнения на нём запросов запуск веб-сервера не требуется.

Пожалуй, единственное что требовалось от фласка - его конфигурация, содержащая необходимые сведения для собственно подключения к БД.

Путём проб и ошибок, а также чтения кода был получен минимально необходимый объект, изображающий из себя сервер flask

class FakeApp(object):
    from flask.config import Config
    config = Config('.', {})
    extensions = {}
    debug = True
    import_name = 'fake'

    @staticmethod
    def teardown_request(func):
        return func

Инициализация его производится с помощью занесения в него конфигурации методом Config.from_object(), а связь с БД - вызовом на объекте SQLAlchemy его метода init_app, после чего фальшивый объект заносится в поле app экземпляра SQLAlchemy.

Можно только предположить что в нормальных условиях эту регистрацию проводит сам веб-сервер, проверив подключенные к нему расширения (одним из которых является и flask.ext.SQLAlchemy).

Как я перестал бояться и полюбил awk 3

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

Основная проблема - обновления ссылок, как имеющихся адресов, так и их состава. Правильным решением выбирается подсмотр в БД по 2 параметрам - названию фракции и названию отряда. Предполагается, что названия фракций совпадают, как и большинство названий отрядов - вокруг этого придётся плясать.

В первую очередь произведём проверку гипотезы:

awk -F\; '{
  if (NR < 2)
   next
  print $2
 }' profiles01-01-2017.csv | uniq

Роль утилиты uniq в сокращении повторов, которые не требуются. Критический осмотр получившегося списка приводит к выводу о том что схема может сработать.

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

find ./builder/games/wh40k -name '*.py' | xargs sed -i '/AUTO-INSERTED/ d'

Команда find обходит папки в поисках файлов с нужным расширением - на этот раз обрабатываются все файлы, поэтому grep не задействован. Имя каждого файла через xargs передаётся в команду sed для обработки на месте (обеспечено параметром -i). Все строчки, содержащие AUTO-INSERTED удаляются. Собственно, именно для этого AUTO-INSERTED и присутствовало в них.

Следует отметить, что при использовании параметра -i и параметра -n совместно результатом является полная очистка всех 500 с лишним файлов кода, что привело бы к катастрофе, не будь всё под системой контроля версий.