• Как правильно разрастаться веб приложению написанному на spring?

    jaxtr
    @jaxtr
    JavaEE/Spring-разработчик
    Сложные фильтры должны применяться, по возможности, в запросах к хранилищу данных.
    Если нет такой возможности, то их желательно в DAO и помещать.

    А вообще - нет никакого смысла делать из этого проблему и уж тем более пытаться её решить. Код работает, выполняет свою задачу и не мешает разработчику - значит, трогать его не надо. Это пустая трата времени, особенно, когда проект в процессе разработки. Вот когда проект реализован и корректно выполняет все свои задачи, тогда и стоит задуматься о рефакторинге.

    spoiler
    8nm64g.jpg
    Ответ написан
    Комментировать
  • Какие книги почитать по функциональному программированию?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Восприятие языка - это вопрос индивидуальный. То, что далось легко мне, может показаться сложным вам. И наоборот. Но личным опытом поделиться могу:

    У Haskell есть веское, на мой взгляд, преимущество - программы компилируются в бинарники. А минус в том, что я никогда не слышал о сколько-нибудь значимых случаях реального применения Haskell. Для восприятия он мне показался очень тяжёлым, литературу по нему можно использовать как снотворное.

    Самой простой для изучения мне показалась Scala. Мультипарадигменность языка обеспечивает более лёгкое вхождение из императивного стиля программирования. Есть замечательный учебник "Scala для нетерпеливых" Кея Хорстманна. К тому же, вакансии на scala-программистов есть даже в РФ. Минусом для меня послужила как раз мультипарадигменность. Нет вызова, нет настоящей мозголомки, способствующей перекраиванию мышления.

    Erlang интересный, чисто функциональный, широко применяются. Но чувствуется некоторая незаконченность языка и отовсюду выпирает телекоммуникационное наследие. Есть неплохой учебник на русском Чезарини и Томпсона "Программирование в Erlang". Плюс, сейчас появился Elixir. Слышал, что он хорош и, что в нём решили все проблемы Erlang, но сам не щупал.

    Я в результате остановился на Clojure. Кложа сложная, но она реально учит думать по-новому. По ней много книг. В том числе есть на русском - "Программирование на Clojure" Эмерика. Хорошая документация, большое и дружелюбное сообщество. В реальном мире применяется чаще, чем Haskell, но реже Scala или Erlang.
    Ответ написан
    6 комментариев
  • Какой уровень математики нужен в GameDev (Unity, UE4)?

    longclaps
    @longclaps
    Не ниже академика, на крайняк член-кора.
    Ответ написан
    3 комментария
  • Есть идеи, как реализовать создание/хранение приходной/расходной накладной на Django?

    neatsoft
    @neatsoft
    Life is too short for bad software
    В одной таблице должны храниться документы, во второй - строки табличной части (всех документов).

    models.py:
    from django.db import models
    from django.db.models import Max, Sum
    from django.utils.translation import ugettext_lazy as _
    
    
    class Product(models.Model):
        name = models.CharField(
            _('Name'),
            max_length=200,
            db_index=True,
        )
    
        def __str__(self):
            return self.name
    
    
    class Document(models.Model):
        INVOICE = 'I'
        WAYBILL = 'W'
        TYPE_CHOICES = (
            (INVOICE, _('Invoice')),
            (WAYBILL, _('Waybill')),
        )
        type = models.CharField(
            _('Type'),
            max_length=1,
            choices=TYPE_CHOICES,
        )
        number = models.CharField(
            _('Number'),
            blank=True,
            max_length=50,
        )
        created_at = models.DateTimeField(
            _('Created'),
            auto_now_add=True,
            db_index=True,
        )
    
        @property
        def total(self):
            return self.items.aggregate(sum=Sum('total'))['sum']
    
        class Meta:
            ordering = ['-created_at']
    
    
    class DocumentItem(models.Model):
        document = models.ForeignKey(
            Document,
            models.CASCADE,
            related_name='items',
        )
        position = models.PositiveIntegerField(
            verbose_name=_('Position'),
            editable=False,
            db_index=True,
        )
        product = models.ForeignKey(
            Product,
            models.PROTECT,
        )
        price = models.DecimalField(
            _('Price'),
            max_digits=12,
            decimal_places=2,
        )
        quantity = models.DecimalField(
            _('Quantity'),
            max_digits=10,
            decimal_places=3,
        )
        total = models.DecimalField(
            _('Total'),
            max_digits=12,
            decimal_places=2,
        )
    
        def save(self, *args, **kwargs):
            if not self.position:
                position = self.document.items.aggregate(Max('position'))['position__max'] or 0
                self.position = position + 1
            super(DocumentItem, self).save(*args, **kwargs)


    admin.py:
    from django.contrib import admin
    
    from .models import Product, Document, DocumentItem
    
    
    @admin.register(Product)
    class ProductAdmin(admin.ModelAdmin):
        pass
    
    
    class DocumentItemInline(admin.TabularInline):
        model = DocumentItem
        fields = (
            'position',
            'product',
            'price',
            'quantity',
            'total',
        )
        readonly_fields = (
            'position',
        )
        ordering = ['position']
    
    
    @admin.register(Document)
    class DocumentAdmin(admin.ModelAdmin):
        inlines = [
            DocumentItemInline,
        ]
        list_display = (
            'type',
            'number',
            'created_at',
            'total',
        )
        list_filter = (
            'type',
        )
        search_fields = (
            '=number',
        )


    Стандартная админка - для примера, вообще она не для этого (обычным пользователям она не должна быть доступна). Но реальные формы строятся по тому же принципу.

    Код накидал прям здесь, не проверял, поэтому возможны незначительные ошибки.
    Ответ написан
    4 комментария
  • Как к текущей дате прибавить строковую дату?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Используйте для хранения freeze_time число секунд, так будет удобнее хранить в БД и оно удобно конвертируется в/из timedelta, который уже можно прибавлять к datetime.
    Пример:
    >>> from datetime import datetime, timedelta, now
    >>> begin_date = datetime(2017, 9, 1, 0, 0, 0)
    >>> end_date = datetime(2017, 9, 30, 0, 0, 0)
    >>> freeze_time = end_date - now()
    >>> freeze_time
    datetime.timedelta(2, 17264, 411894)
    >>> freeze_time.total_seconds()
    190064.411894
    >>> freeze_time = int(freeze_time.total_seconds())
    >>> freeze_time
    190064
    >>> now() + timedelta(seconds=freeze_time)
    datetime.datetime(2017, 9, 30, 0, 1, 1, 371159)
    Ответ написан
    1 комментарий
  • Какой фреймворк или CMF выбрать для примитивной соц сети; за исключением php based решений?

    @buzina_v_ogorode
    Неважно.
    Это ни на что не влияет.
    Влияет только ваше умение.

    Выбирать то, что лучше знаешь.

    Это только начинающие полагают, что есть некая серебяная пуля - выбирешь, мол, правильный фреймворк и дела пойдут в гору.
    А это не так. Совсем не так.

    Важен не инструмент, а ваше умение им пользоваться.

    Выбирай тот, что лично ты (или нанятые тобой разработчики) лучше всего знают.
    Ответ написан
    1 комментарий
  • Как перенести базу postgresql из нерабочей системы, если в chroot сервис не запускается?

    Melkij
    @Melkij
    PostgreSQL DBA
    Найдите, где datadir базы. Скорей всего /var/lib/postgresql/(версия базы)/main, но могла была быть перемещена, так же может стоять несколько кластеров базы и разные версии базы - в дебианах и убунтах это делается легко.

    Далее установить на новой системе postgresql идентичной major версии и не ниже minor версии что была там. Какая была major версия - смотрите файлик PG_VERSION в datadir. minor версию ставьте последнюю актуальную.
    Так понимаю, старая система в принципе не работает? Т.е. старая база выключена? Выключите и новую (пока пустую) базу. Проверьте, если не уверены, обе базы должна быть выключена.
    Переименовываете datadir на новом сервере (вообще, можно удалить, но можно и ошибиться консолью и дропнуть не то =) )
    Копируете каталог базы: rsync -a /olddatadir /newdatadir
    Копируете и правите если надо конфиги из /etc/postgresql/версия_базы
    Если каталог pg_tblspc/ в datadir не пуст - скопируйте и симлинки из него и все данные по этим симлинкам в аналогичные места на новой машине.
    Если pg_xlog/ является симлинком - его необходимо скопировать. Можно оставить симлинком, можно содержимое перекопировать.
    Пробуете запустить базу на новом месте. Смотрите в логи. Если на старом месте база не была повреждена (и ничего нужного скопировать не забыли) - то она запустится.
    Ответ написан
    1 комментарий
  • Что делать со всеми миграциями?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Команда squashmigrations поможет сжать их в одну.
    Ответ написан
    1 комментарий
  • На чем основывается выбор java vs .net для автоматизации бизнеса?

    zolt85
    @zolt85
    Программист
    Смотреть нужно, в первую очередь, на скилл команды, которую собираетесь привлечь к разработке. Если команда рубит в Java и не-в-зуб-ногой в .Net, то выбор будет очевиден. Следующий нюанс - инфраструктура. Если Вы собираетесь строить ее на Windows, то наверное .Net будет лучше смотреться. Затем архитектура приложения. Если Вы собираетесь делать desktop приложения, опять же для windows, то тут без вариантов - лучше взять C#, WCF и .Net. Если у Вас будет Web приложение, с браузером в качестве клиента, то Java тут по серьезней выглядит с ее наработками в "кровавом ынтэрпрайзе". А можно все в кучу смешать - клиент будет десктопным приложением на .Net Framework, а сервер - написан на Java.

    Я бы просто описал в виде ТЗ хотелки, и дал бы оценить его опытному разработчику, думаю он сделает верный выбор стека технологий.
    Ответ написан
    Комментировать
  • Как влиться в Spring и что на нем разрабатывать в одиночку?

    @frozen_coder
    Java-developer
    Как уже писали ранее, посмотрите реализации классического примера на Spring - Pet Clinic
    https://github.com/spring-petclinic

    Spring используют для Enterprise - а это значит автоматизация работы различных предприятий, учреждений и т.п. Вот и сделайте что-то подобное.

    Примеры:
    Работа магазина. Там есть всякие товары, продажа-покупка и т.д. и т.п. Можно наворотить.
    Работа склада. Тоже самое, товары, складские журналы, поступление, списание и прочие прелести.
    Работа банка. Валюта, вклады и кредиты всякие и т.д. и т.п.
    Работа автомастерской, стоянки, булочной, столовой, полицейского участка, мед. пункта и тд и тп.
    Какой-нибудь справочник-реестр-библиотека-каталог каких-нибудь составных записей из разных других записей, в которых тоже есть какие-нибудь записи с возможностью добавления, удаления, объединения, редактирования при условиях той фазы луны, погоды за окном и вашего расположения духа.

    Еще Spring - это в основном система для интеграции. Вот и прикручивайте различные штуки к нему. Сделайте SOAP-сервис, что-нибудь для ORM, Security, можно очередь забабахать, можно облака прикрутить, даже вроде graphQL можно или можно будет.

    Посмотреть, что можно накрутить и сгенерить новый проект можно с помощью такого вот сервиса:
    https://start.spring.io/
    Ответ написан
    Комментировать
  • В чем минусы Rails и хуже ли он Django?

    @asd111
    Rails и Django решают одну и ту же задачу - web программирование. В целом те кто использует Django используют его ради возможностей python, чтобы быстро прикрутить к своему проекту тот же анализ данных на python на scikit-learn и на других библиотеках для анализа данных, которые изначально пишутся для python и С++, а для других языков обычно выходят с задержкой либо не выходят вообще.

    Если вы раньше писали на ruby-rails, то python и django вам понравятся, особенно если вы посмотрите scikit-learn и т.п. возможности python для анализа данных. Главная причина популярности python - очень качественные библиотеки и простое API в этих библиотеках.
    Молодежь для бэкэнда сейчас выбирает обычно php либо golang, иногда javascript.
    Про php вы зря думаете что плохой язык. Если нужно писать только веб без математики, то php с yii или symfony неплохой выбор. Главное битрикс не использовать :) А в плане скорости php 7 очень даже норм.
    Golang обязательно посмотрите. Все таки один из самых быстрых языков для веба сейчас. И многие из тех кому нужна была скорость перешли с ruby-python на golang.

    Рельсы медленно умирают - это факт. Потому что ruby ничего не может предложить кроме веба. А для веба сейчас появился очень быстрый golang и туда ушли почти все рельсовики кому не по душе php и python.
    Ответ написан
  • В чем минусы Rails и хуже ли он Django?

    Sanasol
    @Sanasol Куратор тега Веб-разработка
    нельзя просто так взять и загуглить ошибку
    В чем минусы Rails и хуже ли он Django? А может всё таки остаться на PHP?

    Остаться на пхп потому что руби плохой, а питон не...
    Можно найти статьи, видео и всё что угодно по запросу "что не так с <название языка/фреймворка>"
    или "минусы <название языка/фреймворка>".

    Вопрос ни о чём. Речь о трёх разных языках и технологиях.

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

    Больше на этот вопрос никак не ответить.
    Ответ написан
    3 комментария
  • Как отобразить архив статей?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    К сожалению, на одну и ту же модель нельзя зарегистрировать более 1 класса админки.
    Есть вариант с прокси-моделью, посмотрите здесь. Там даже тема схожая - публикации.
    Ответ написан
    Комментировать
  • Расскажите о профессии верстальщик (в офисе)?

    @ncer
    Frontend
    1. Какая сейчас зп у верстальщиков в регионах (живу в Калининграде)? На сайтах вакансий я вижу предложения в 30, 25 и даже 20 тыс. (Хотя попадаются и на 80-100 000, но там требуют очень серьезные скиллы.) Насколько это соответствует реальным зп?

    Это средние цифры по больнице, даже для мск. Суть не в том, чтобы верстаком получать горы (это нереально), а в том, чтобы договориться с работодателем, что верстак - это начало и хотелось бы развиваться в сторону фронтенда. Договориться, чтобы на первых порах время от времени тебе давали какие-то простенькие JS задачки с условием "смог - круто, не смог - ну ладно, в следующий раз получится".

    2. Правильно я понимаю, что рабочий день верстальщика - это 8 часов верстки с перерывом на обед? Насколько высокая загруженность? На моей предыдущей работе, например, непосредственно работать приходилось процентов 40 времени.

    В целом - да. Но опять же в среднем по больнице. Это зависит от стажа и опыта. На первых порах, возможно, даже придется перерабатывать. Все зависит от кол-ва заказов, их сложности, твоего личного темпа работы, фазы луны и кучи других факторов. Но даже Москва не сразу строилась. С опытом можно научиться работать столько, сколько нужно и даже тратить часть рабочего времени на обучение.

    3. Насколько реально, работая в офисе, и, будучи заваленым задачами по верстке, попутно развиваться в веб-разработке и изучать ЯП, например PHP и JS?

    Возвращаясь к п1, если договориться с начальником про рост во фронтенде, то в общем-то вполне реально совмещать работу и изучение JS - оно само напрашивается. Все остальное - скорее всего в нерабочее время.

    4. Есть ли карьерный рост непосредственно в профессии? Какой потолок зарплат в верстке без программирования? (подключение плагинчиков и простенькие вещи на jquery не в счет)

    Карьерный рост - это фронтенд. Сначала джуниор, потом мидл, потом сеньор, а потом, если хотите, тимлид. У каждого из них зп выше, чем у предыдущего.

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

    Определенно стоит. Но не ради того, чтобы оставаться верстальщиком, а ради того, чтобы развиваться во фронтендера. См. п1.
    Ответ написан
  • Расскажите о профессии верстальщик (в офисе)?

    Krasnodar_etc
    @Krasnodar_etc
    fundraiseup
    1 - Суммы очень разнятся, от 20-ти до 60-ти, + редко около 80 000 (Краснодар) . Не знаю, как человек должен верстать за 80, но, наверное, очень круто)

    2 - Формально - да. Но так бывает разве что в веб-студиях. И даже там спокойно можно находить время на изучение JS/PHP, чтение Хабра, ... . В больших не-IT компаниях времени будете тратить на дело столько же, сколько раньше. Загруженность может быть высокая на первых порах, но когда "набьёте руку", определитьесь с инструментами и подходом - это всё уже не будет занимать столько времени.

    3 - Реально. Настолько, что все так делают)

    4 - Карьерный рост верстальщика ведёт во Frontend , то есть в мир JS , всяких там Angular/React/Vue и прочего.

    5 - Да стоит как-угодно начинать, я думаю. Можете сделать второе резюме уже сейчас - "Junior Frontend" и параллельно с поиском работы учить JS . Хотя бы на уровне jQuery и базовых принципов.

    Верстальщик - это, как правило, начало карьерного пути, на нём не стоит оставаться очень долго. Возможности роста у вас 100% будут, даже при плотном графике.
    Ответ написан
    6 комментариев
  • Java ,как составить план обучения и с чего начать код?

    @game802
    я не специалист/разработчик по JAVA, и вообще на нем не разрабатываю, но порекомендую такую штуку, которая очень сильно поможет Вам в обучении (она относится абсолютно ко всем ЯПам).
    Суть заключается в том, чтобы крепко освоить базу! Вы должны понимать, что все вокруг строится на БАЗЕ (БАЗОВЫХ основах/принципах). И, если Вы знаете БАЗУ, Вы сможете со спокойной душой изучать совершенно любые штуки, которые на это БАЗЕ и построены.
    Опыт на уровне простых методов / классов и do/while/for -) - рекомендую, для начала, очень хорошо углубиться в базу, дабы в будущем очень сильно увеличить Вашу скорость обучения по всем остальным технологиям.
    Вот, как-то так! Удачи в обучении!
    Ответ написан
    Комментировать
  • Интернет-магазин на Falcon и VueJS?

    copist
    @copist
    Empower people to give
    Описанная тобой схема, при которой приложение разбито на две части: клиентское на JS и серверное, которые обмениваются данными через открытое API по HTTP - называется Rich Internet Application или Single Page Application. Реализуется на любом стеке. PHP/Python/NodeJS/Ruby/Go/C#/Java и др. с одной стороны и Vue/Angular/Meteor/React и др. (тыщи их) с другой стороны.

    (Упомянуя схема "микросервисная архитектура" по сути декомпозиция серверной части на незаввисимые модули с открытым API, совсем не обязательно реализовано через HTTP. Частный случай SPA/RIA.)

    Проблему назову одну. Только она не даёт покоя. Она выматывает душу, нервы и кошелёк.

    Интернет магазин должен быть открыт для индексации поисковым ботам, а HTML генерится в runtime на JavsScript. Только Google умеет выполнять JS, и то весьма посредственно. Остальные вообще JS не трогают. Есть два решения:
    для индексации сразу рисовать HTML на стороне сервера
    или снимать "отпечатки" HTML c приложения через виртуальный браузер, что сбоит

    Отрисовка HTML на стороне сервера (server side render) может быть реализована тремя способами:
    * подменять выдачу через серверный язык программирования, то есть вместо шаблонизации в Vue рисовать в Falcon - блин, две шаблонизации, две логики работы с данными (через AJAX и напрямую из базы)
    * имитировать исполнение JS на сервере (хм, это возможно опять же несколькими способами) - тут вообще танцы с бубном
    * отказаться от PHP/Python/Ruby и др. в пользу NodeJS и изоморфного фрейморка, например MeteorJS или VueJS (Nuxt)

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

    P.S. Про Google: проверено, глючит в тех местах, где клиентский JS начинает подкачку данных через HTTP - гугль обрывает рендеринг и в поисковом индексе лежат пустые HTML страницы. Толку от них никакого.
    P.P.S Снятие "отпечатков" HTML для SPA можно через специальные сервисы (prerender.io или brombone.com) или сделать самостоятельно, например через PhantomJS или Electron. В любом случае для проекта с десятком тысяч страниц это расходы на оплату сервиса, либо на мощный сервер. И электрон и фантом виснут, а HTML довольно большие и со временем забивают диск/базу. Опят же надо не забывать про то, что страницы требуют подгрузки данных через AJAX, надо чуть подождать.
    Пример: web-mastery-gauge.ru сделан на Angular, для поисковиков HTML отрисовывается через prerender.io - для проекта с 15 страницами это вообще никакой сложности не вызывает.
    P.P.P.S. SPA просто идеально для реализации той части пользовательского интерфейса, которая не индексируется поисковыми ботами. Например, то доступно только авторизованным пользователям. В этом случае не требуется server side render и 75% проблем отпадают. В том же интернет-магазине может быть админка - её можно сделать на VueJS.
    Ответ написан
    6 комментариев
  • Как сделать шаблонизатор на php?

    copist
    @copist
    Empower people to give
    Сначала - зачем нужен шаблонизатор. Тут подмена понятий. Скорее вопрос такой: как отделить вывод от заголовков. Если не отделять, то может быть такая ошибка

    <html>
    <body>
    <?php
    // начать сессию
    session_start(); // отправить куку PHPSESSID через заголовки HTTP
    // но она не может отправиться, потому что уже начался вывод HTML в строке "<html ..."
    
    // если не авторизован, то отправить на страницу логина
    if (empty($_SESSION['username']))
        header('Location: /login.php'); // но заголовок HTTP тоже не может отправиться, как и кука
    ?>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>


    Проблема решается, если вывод HTML делать после вывода заголовков. Например, использовать буфер
    <?php ob_start(); // открыть буфер ?>
    <html>
    <body>
    <?php
    session_start(); //  кука PHPSESSID отправится, потому что HTML ещё в буфере
    if (empty($_SESSION['username']))
        header('Location: /login.php'); // заголовок HTTP отправится, потому что HTML ещё в буфере
    ?>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>
    <?php ob_end_flush(); // выбросить содержимое буфера наружу и закрыть его ?>


    Однако так придётся писать в каждом месте, где формируется HTML. Можно ли сократить?

    Простейшее представление через буфер

    <?php
    function render($viewPath)
    {
        if (!is_file($viewPath))
            return 'View "'. $viewPath . '" not exists';
        ob_start();
        include($viewPath);
        return ob_get_clean();
    }
    
    session_start();
    if (empty($_SESSION['username']))
        header('Location: /login.php');
    
    $viewsPath = __DIR__.'/views/'; // где лежат представления
    render($viewsPath . 'page.php'); // нарисовать страницу HTML


    <?php
    # page page.php
    ?>
    <html>
    <body>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>


    А дополнительно ещё решают проблему отделения логики от формирования интерфейса. Работа с внешними данными в одном месте, а отображение их - в другом. Для этого в представление передают всё, что нужно показать. И точка. Лишних данных там не надо. В некоторых фреймворках стоит Exception если представление начнёт работать с базой данных, читает данные из входного запроса или пытается отправить заголовки.

    <?php
    function render($viewPath, $vars)
    {
        if (!is_file($viewPath))
            return 'View "'. $viewPath . '" not exists';
        extract($vars); // extract делает из массива набор переменных в локальной области видимости
        ob_start();
        include($viewPath); // эти переменные будут видны внутри подключаемого файла
        return ob_get_clean();
    }
    
    session_start();
    if (empty($_SESSION['username']))
        header('Location: /login.php');
    
    $viewsPath = __DIR__.'/views/'; // где лежат представления
    render($viewsPath . 'page.php', array( // отображаемые данные передаются массивом
        'username' => $_SESSION['username'],
    ));


    # page.php
    <?php
    /**
     * Подсказки для IDE, чтобы не подсвечивал переменные как неопределённые
     * @var string $username
     */
    <html>
    <body>
        <h1>Hello, <?php echo $sername ?></h1>
    </body>
    </html>


    Не правда ли, с представлениями код становится значительно изящнее. А если логика для реализации представлений хранится в отдельном файле-библиотеке, то код становится короче и понятнее.

    В фреймворках вместо функции render может использоваться объектная реализация

    <?php
    class ViewException extends Exception {}
    
    class View
    {
        public $viewsPath = __DIR__.'/views/';
        
        public function __construct($viewsPath = null)
        {
             // настройка представлений
            // например, можно перепределить место хранения представлений
            if (!is_null($viewsPath))
                $this->viewsPath = $viewsPath;
        }
    
        public function render($viewPath, $vars)
        {
            if (!is_file($this->viewsPath . $viewPath))
                throw new ViewException('View "'. $viewPath . '" in folder "'. $this->viewsPath . '" not exists');
            extract($vars);
            ob_start();
            include($this->viewsPath . $viewPath);
            return ob_get_clean();
        }
    }
    
    $view = new View();
    $view->render('page.php', array(
        'username' => $_SESSION['username']
    ));


    Как таблицы шаблонизаирова если в одной 3 столбца, в другой 5?

    Никто в представлениях не запрещает использовать языковые конструкции. Это могут быть конструкции языка PHP или какой-нибудь другой язык, специально написанный для шаблонизатора. Например, в Smarty, Blade, Pug свои языки. Передай в представление количество колонок и сделай цикл :)

    у первой первый столбец должен быть 70% а у второй последний?

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

    <?php
    class Assets
    {
        public static $cssLinks = array();
        public static $css = array();
    
        // добавить ссылку на файл стилей
        public function addCssLink($link)
        {
            self::$cssLinks[$link] = $link;
        }
    
        // добавить блок стилей
        public function addCss($name, $css) // $name - это чтобы не дублировались блоки стилей, на всякий случай
        {
            self::$css[$name] = $css;
        }
    
        public function renderCss()
        {
            foreach(self::$cssLinks as $url)
                echo '<link href="'.$url.'" rel="stylesheet" type="text/css" />';
            echo '<style type="text/css">';
            foreach(self::$css as $css)
                echo $css;
            echo '</style>';
        }
    }


    # index.php
    
    $assets = new Assets();
    // общие стили
    $assets->addCssLink('https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css');
    
    // ...
    
    $view = new View();
    $view->render('page.php', array(
        'username' => $_SESSION['username']
    ));


    # page.php
    <?php
    /**
     * @var string $username
     */
    $assets = new Assets();
    $assets->addCssLink('/path/to/my/styles.css'); // ещё один файл стилей
    $assets->addCss('h1 { color: red; }'); // или даже что-нибудь микроскопическое, только для этой страницы
    ?>
    <html>
    <head>
    <?php $assets->renderCss() ?>
    </head>
    <body>
        <h1>Hello, <?php echo $username ?></h1>
    </body>
    </html>


    И аналогично про JS.
    Ответ написан
    7 комментариев
  • Как в ткинтере создать окно внутри главного окна?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    import tkinter as tk
    
    root = tk.Tk()
    root.title("Main Window")
    root.geometry("640x480")
    
    sub = tk.Toplevel(root)
    sub.transient(root)
    sub.title('Sub Window')
    sub.minsize(320, 240)
    sub.maxsize(320, 240)
    
    pos = []
    
    def main_move(event):
        if pos:
            sub.geometry("+{0}+{1}".format(pos[0], pos[1]))
    
    
    def sub_move(event):
        min_w = root.winfo_rootx()
        min_h = root.winfo_rooty()
    
        max_w = root.winfo_rootx() + root.winfo_width() - 15
        max_h = root.winfo_rooty() + root.winfo_height() - 35
    
        if event.x < min_w:
            sub.geometry("+{0}+{1}".format(min_w, event.y))
    
        elif event.y < min_h:
            sub.geometry("+{0}+{1}".format(event.x, min_h))
    
        elif event.x + event.width > max_w:
            sub.geometry("+{0}+{1}".format(max_w - event.width, event.y))
    
        elif event.y + event.height > max_h:
            sub.geometry("+{0}+{1}".format(event.x, max_h - event.height))
    
        global pos
        pos = [event.x, event.y]  
    
    
    root.bind('<Configure>', main_move)
    sub.bind('<Configure>', sub_move)
    
    root.mainloop()
    Ответ написан
    Комментировать
  • Порядок изучения C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Неплохая книга Бена Ватсона "С# 4.0 на примерах" - много примеров, как делать конкретные вещи, в том числе, по WPF.

    Программирование зиждется на трёх китах - 1) знание (синтаксис) языка, 2) алгоритмы и 3) архитектура. Причём, последние не связаны с языком. Читайте не только о языке, но и общие знания - паттерны, архитектура, алгоритмы. В большинстве классических книг примеры написаны не на c#, но их чтение сильно развивает как программиста.
    Мартин Р. Чистый код. Создание, анализ и рефакторинг рекомендую прочитать хотя бы до 12 главы, дальше - углубление. Первые главы дают шикарный базис для построения архитектуры - почему писать так, а не иначе. Примеры на Java, но этот язык довольно сильно похож на C#.
    Фаулер М. Рефакторинг. Улучшение существующего кода классическая книга
    Гамма Э и др. Приёмы объектно-ориентированного проектирования суперклассическая книга, так называемая "банда четырёх"
    Скиена С. Алгоритмы. Руководство по разработке книга о алгоритмах, проще, чем известная книга Д. Кнута

    Ну и посмотрите этот список книг.
    Ответ написан
    Комментировать