• COMMON LISP как первый язык программирования. Плюсы и минусы?

    @bromzh
    Drugs-driven development
    Плохая идея. Да, общий лисп - хороший язык, и эта реализация, имхо, наиболее пригодна для реального использования. В стандарт языка уже 20 лет назад заложили такие фичи, что не все современные языки умеют. Но беда состоит в том, что этих реальных проектов просто единицы. Есть мало областей, где его целесообразно применять. А всё потому, что инструментов и технологий, которые работают нормально и стабильно, для него мало. И существует довольно мало областей, где он применим, и, самое главное, где он более удобен, чем другие языки.

    В общем, как второстепенный язык он неплох. Но выбор его, как первого и основного - плох.

    А вообще правильно сказали, важны общие принципы разработки. Можешь начать изучение с SICP, там как раз на диалекте лиспа идёт разработка.
    Ответ написан
    Комментировать
  • Библиотека для создания диаграмм Гантта?

    @bromzh
    Drugs-driven development
    Я делал проект с использованием этой библиотеки. Очень удобное апи, удобно связывать с БД, много возможностей. Крайне рекомендую.
    Ответ написан
    Комментировать
  • Что использовать для двустороннего маппинга javascript ajax(json) response на поля формы?

    @bromzh
    Drugs-driven development
    Я такое делал через Knockout.js Сами ajax-запросы через jquery.
    Ответ написан
    1 комментарий
  • Как создать свою модель пользователя в django?

    @bromzh
    Drugs-driven development
    В новой джанге можно кастомизировать модель пользователя.

    Попроси модераторов гугла убрать у тебя бан на поиск.

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

    1. В настройках указываешь путь до твоей модели:
      AUTH_USER_MODEL = 'myapp.MyUser'
    2. Везде в моделях где используется внешний ключ на юзера, прописываешь settings.AUTH_USER_MODEL
      class Article(models.Model):
          author = models.ForeignKey(settings.AUTH_USER_MODEL)

      И тоже делаешь для сигналов:
      def post_save_receiver(signal, sender, instance, **kwargs):
          pass
      
      post_save.connect(post_save_receiver, sender=settings.AUTH_USER_MODEL)

    3. Создаёшь модель пользователя, в которой указываешь поле-идентефикатор (например, это может быть поле name, или поле email, или ещё какое-нибудь другое).
      class MyUser(AbstractBaseUser):
          identifier = models.CharField(max_length=40, unique=True)
          ...
          USERNAME_FIELD = 'identifier'

      В этой же модели прописываешь необходимые для регистрации поля:
      class MyUser(AbstractBaseUser):
          ...
          date_of_birth = models.DateField()
          height = models.FloatField()
          ...
          REQUIRED_FIELDS = ['date_of_birth', 'height']

      Ещё надо переопределить некоторые методы и поля при необходимости (в доках написано какие)
    4. Надо создать кастомный менеджер, создающий пользователя. В нём надо реализовать методы create_user и create_superuser
    5. Надо создать новые формы для твоего пользователя и кастомизировать класс для админки, учитывающий твои новые поля
    6. ???
    7. PROFIT
    Ответ написан
    2 комментария
  • Как использовать атрибуты data-* не загромождая html код?

    @bromzh
    Drugs-driven development
    Одна из целей использования data-атрибутов - как раз уменьшить количество строк js-кода. Например, в бутстрапе всякие табы и прочие элементы используют их, чтобы не прописывать поведение переключалок вручную в js. Так что польза их не писать там, где позволяет библиотека. весьма сомнительная. С другой стороны, если всё равно надо писать что-то на js с использованием таких атрибутов, то можно всё убрать в js. Тогда будет нагромождение в js-коде.
    Ответ написан
    Комментировать
  • Как кроссбраузерно, асинхронно подключит JS код?

    @bromzh
    Drugs-driven development
    Если странице не нужно дожидаться загрузки скрипта, то можно подключить js-файл с атрибутом async.
    Ответ написан
    Комментировать
  • Работа над приложением для конвертации кода в java?

    @bromzh
    Drugs-driven development
    Лучше не конвертить код в java, а компилировать его в байткод jvm. Если исходный язык уже умеет компиляцию в байткод jvm - то достаточно переписать его в нужном стиле. Если нет - то это может быть очень трудно. И трансформацией синтаксиса это явно не ограничится.
    В любом случае, надо отлично знать, как устроена jvm, знать ньюансы исходного языка и самой java и т.д.

    Ну и скажи, какой язык исходный.
    Ответ написан
    Комментировать
  • Как разделить пользовательскую и серверную часть django проекта?

    @bromzh
    Drugs-driven development
    Самый простой вариант - подгружать данные аяксом. Когда аякс запрос не закончился, выводить одну информацию (настраивается в jquery), когда аякс закончился (т.е. вызвался колбек) - отрисовывать результаты или делать редирект на страницу с результатами.
    Сложный вариант - использовать асинхронный сервер с вебсокетами, на клиенте ждать нужного сообщения, по приходу которого отображать полученные данные или редиректить на нужную страницу.
    Ответ написан
    Комментировать
  • Создать демона на python 2.7 ?

    @bromzh
    Drugs-driven development
    Всегда использую supervisord. Просто отличная штука, ещё и на питоне написанная. Гибкие конфиги, перезапуск при падении. и другие плюшки.

    UPD
    Как использовать:
    1) Ставишь его общесистемно sudo apt-get install supervisor (можно и через пип поставить, но настраивать надо побольше будет).
    2) Надо настроить сам супервизор: откуда он будет брать конфиги, какие права нужны и т.д. Если у тебя убунта, то настройки самого супервизора будут в порядке. Они хранятся в /etc/supervisor/supervisord.conf. В этом файле прописано, что настройки для демонов будут читаться из папки /etc/supervisor/conf.d
    Если у тебя не убунта, или ты ставил супервизор через пип, то вот стандартный конфиг. Настройки там очевидные
    3) Когда супервизор поставлен и настроен, запускай его:
    sudo service supervisor start
    или
    sudo supervisord

    4) Теперь надо сделать конфиг для запуска твоего скрипта. Создаёшь файл в папке с конфигами такого содержания:
    [program:ОТОБРАЖАЕМОЕ_ИМЯ]
    command = КОМАНДА_ДЛЯ_ЗАПУСКА (например python ИМЯ_СКРИПТА)
    autorestart = true # автостарт при запуске супервизора
    stderr_logfile = /var/log/ИМЯ_ЛОГФАЙЛА.err.log # тут перенаправляем stderr в файл
    stdout_logfile = /dev/null # тут глушим весь вывод со stdout


    Всё! Управлять твоими демонами можно через команду supervisorctl. Сперва надо перепрочитать конфиг, потом стартануть приложение:
    supervisorctl reread
    supervisorctl ОТОБРАЖАЕМОЕ_ИМЯ start

    Можно опустить ОТОБРАЖАЕМОЕ_ИМЯ, тогда команда будет применена ко всем.
    Также ты можешь запустить CLI, если введёшь supervisorctl без параметров. Там по табу смотри команды.
    Читай этот раздел, для понимания конфигов запускаемых приложений.
    Ответ написан
    1 комментарий
  • На сколько разумно вставлять картинки через тег i?

    @bromzh
    Drugs-driven development
    Можно и заголовки делать с помощью , а картинки вставлять как бэкграунд к . Но зачем? У каждого тэга есть свой смысл и своя область применения. На w3c всё прописано. Иконки через i никем не стандартизированы, даже бутстрап отказался от этого.
    Ответ написан
    2 комментария
  • Как правильно делать Landing Page?

    @bromzh
    Drugs-driven development
    Дизайн делают дизайнеры, вёрстку - верстальщики. Вот дизайнер и должен думать, какие эффекты использовать и что где располагать.
    Ответ написан
    Комментировать
  • У меня есть архив с файлами шрифтов. Как их правильно подключить в style.css? Какие best practices есть?

    @bromzh
    Drugs-driven development
    1) конвертируешь шрифты тут (только надо выбрать "expert" и прописать нужные настройки, типа кирилицы и т.д.)
    2) подключаешь созданный файл
    Ответ написан
    Комментировать
  • Как правильно использовать семантику html5?

    @bromzh
    Drugs-driven development
    Всё очень плохо.
    figure - для группировки картинки и подписи. Что там делают несколько aside - непонятно.
    aside - для бокового блока, который содержит информацию, косвенно относящуюся к содержимому article. Если aside вне article - то это обычно просто сайдбар или что-то похожее.
    Зачем article оборачивать в section?
    Языковую панель в принципе можно сделать в виде menu.
    Секции нужны для замены h1-h6 в иерархии документа (где-то натыкался на грамотное объяснение, но можно посмотреть и тут). Собственно поэтому в каждой секции должен быть как минимум один h. Если несколько h - объединяй в hgroup. Если нужен h и ещё что-нибудь (p, span, etc), не относящееся к непосредственно основной инфе - объединяй в header.
    Ответ написан
    1 комментарий
  • Какой двигатель выбрать для Landing Page?

    @bromzh
    Drugs-driven development
    Если тебе нужен только 1 лэндинг, то просто пиши с нуля, подключай разные js-библиотеки (jquery, angular/knockout/etc для отображения данных), jquery-плагины, и т.д.

    Если лэндинги надо делать периодически и их будет много, то выбери сам нужный стек технологий. Если лэндинги не однотипные, то что-то универсальное готовое вряд ли существует.

    Мой стек:
    1) Grunt, bower - для быстрого равёртывания нового проекта и подключения внешних библиотек.
    2) Less - как более удобный инструмент вёрстки
    3) jQuery с плагинами (какие - зависит от проекта), normalize.css, modernizr.
    4) Github Pages - для просмотра страницы по мере разработки

    Собственно, всё сводится к написанию под себя конфига для grunt. У меня он позволяет скачивать зависимости bower'а. Далее, все внешние js и css кидаются во временную папку. Туда же кидаются мои скомпилированные css и js. Далее, если это не production, то каждый файл инжектится отдельно на html-страницу. Если production - всё сжимается до 1-го файла (т.е. на выходе будет 1 js-файл и 1 css-файл) и инжектится только 1 js и 1 css. Все изменения в конфиге bower'a, изменения в css, less и js-файлах отслеживаются. Если они изменились - то grunt автоматом запускает нужные задачи, т.е. при изменении, например, в less-файла, через пару секунд эти изменения будут видны на странице, которая открыта в браузере.
    Ответ написан
    Комментировать
  • Как развернуть Java приложение на сервере?

    @bromzh
    Drugs-driven development
    .class? А JAR/WAR для кого придумали?
    Если у тебя веб-приложение, то нужен контейнер сервлетов/сервер приложений, который умеет запускать веб-приложения. Их упаковывают в war. В этом архиве должен быть дескриптор развёртывания web.xml. Если у тебя обычная программа, то пакуй в jar.
    Ну и нифига не понятно, что за "техподдержка" и что за "сервер". Ты пользуешся обычным хостингом? Нафига, 2014 на дворе. Есть же дешёвые VPS-ки. Арендуй какой-нибудь сервак и разверни на нём всё.
    Ответ написан
    1 комментарий
  • Кто знает пакет для Django для сохранения промежуточных данных в NoSQL?

    @bromzh
    Drugs-driven development
    Celery. Просто при получении результата создаёшь новую задачу, а она сама запускается (подробнее - в доках). У Celery есть интеграция с админкой джанги, можно смотреть статусы задач прямо в ней. А сама NoSQL БД может быть mongo. Быстрая запись, быстрый поиск по индексам, интеграция с ORM вроде как присутствует.
    Ответ написан
    Комментировать
  • Как в python 3.4 вернуть несколько значений из сопрограммы (корутины)?

    @bromzh Автор вопроса
    Drugs-driven development
    Ответ подсказали в другом месте. В общем, можно использовать для таких целей очередь:
    import random
    import asyncio
    
    @asyncio.coroutine
    def coro(que: asyncio.Queue):
        res = 0
    
        t = random.random() * 3
        yield from que.put('start 1')
        yield from asyncio.sleep(t)
        yield from que.put('value 1 = {}'.format(t))
        res += t
    
        t = random.random() * 3
        yield from que.put('start 2')
        yield from asyncio.sleep(t)
        yield from que.put('value 2 = {}'.format(t))
        res += t
    
        t = random.random() * 3
        yield from que.put('start 3')
        yield from asyncio.sleep(t)
        yield from que.put('value 3 = {}'.format(t))
        res += t
    
        yield from que.put(None)
        return res
    
    @asyncio.coroutine
    def run(que: asyncio.Queue):
        while True:
            res = yield from que.get()
            if res is None:
                break
            print(res)
    
    q = asyncio.Queue()
    asyncio.async(run(q))
    asyncio.async(coro(q))
    asyncio.get_event_loop().run_forever()
    Ответ написан
    Комментировать
  • Можно ли переопределять метод родителя с другим набором аргументов (Python 3)?

    @bromzh
    Drugs-driven development
    Если уж стоит такая острая необходимость, то используй *args и/или **kwargs в родителе:
    class A(object):
        def foo(self, *args, **kwargs):
            pass
    
    class B(A):
        def foo(self, a, b, c=42):
            pass
    Ответ написан
    1 комментарий
  • Как прибить к нижнему правому углу родителя блок без использования height, position:absolute и скриптов?

    @bromzh
    Drugs-driven development
    Если пофиг на старые браузеры, то flexbox будет самым простым решением.
    Ответ написан
    2 комментария