• Как вы добавляете коммиты?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Атомарно. Часто. Любой целостный, завершенный и логический кусок или кусочек, независимо от размера. И не важно - сам пилю, или с командой. Это вопрос привычки - поначалу и лень, и смысла вроде не видишь. Со временем привыкаешь. И когда приходит время воспользоваться прелестями атомарных коммитов (а оно приходит) - откат фичи или возврат ранее откаченной (по требованию клиента), разрешение конфликтов и тд - радуешься и благодаришь себя прошлого за то, что не поленился.

    И еще, очень важно писать адекватные commit message. Никаких "minor fix" и тому подобное. По месседжу должно быть четко понятно при листании истории что к чему и зачем, без необходимости смотреть diff. В идеале, еще и привязка к issues - но это актуально в командной работе, одному не надо.

    Что касается бранчей - сильно зависит от проекта. В командной работе это либо feature branches (git flow или своя произвольная схема), либо у каждого своя ветка и там делай что хочешь. Тут смысл в первую очередь в пулл-реквестах, code review, CI и стабильном мастере, в котором всегда находится рабочий код. Если работать одному - лично я привык бранчевать каждую отдельную фичу (не фрагмент, а именно модуль, автономный кусок функциональности). Удобно на серверах чекаутить конкретный бранч, тестить, возвращаться на мастер. И это позволяет одновременно работать над несколькими фичами. Например, одну допилил, отдал на утверждение клиенту, а там есть комменты/фиксы, но ждешь какие-то материалы. Переключился на другую фичу и безопасно работаешь в другом бранче. В общем, удобно и надежно.
    Ответ написан
    Комментировать
  • Зачем использовать scss, если в sass можно опустить { } и ;?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    а если тебе понадобится работать с чужим css? к примеру доработать верстку. в случае с scss - ты просто копипастить css - в свой scss и дальше пишешь используя миксины и прочие плюшки. и все будет работать. а если ты голый css скопируешь в sass - ты не сможешь это скомпилить пока не уберешь все лишнее и не расставишь отступы.
    p.s. а вообще это просто дело вкуса.
    Ответ написан
    2 комментария
  • Как разрешить/запретить переход по ссылке с определенной страницы?

    По клику на ссылке, пишите в сессию isLisnkClicked = 1.
    Затем при попытке доступа на на страницу А проверяете этот флаг в сессии.
    Если же много таких ссылок от которых зависит показ какой то страницы -- заведите в базе таблички:

    page
    | id | name |
    /* 
    тут храняться как страницы, те от которых зависит показ какой то страницы, 
    так и зависимые страницы. name это /module/controller/action 
    */

    dependent_page
    | id | pageId | dependentPageId |

    user_available_pages
    | id | userId | dependentPageId | isVisited |

    По таблице user_available_pages проверяете доступна ли эта страница пользователю.

    Так же можете делать проверку по cookie.
    Ответ написан
    Комментировать
  • Как для yii\swiftmailer\Mailer указать почту отправителя по умолчанию?

    qonand
    @qonand
    Software Engineer
    любые настройки письма можно задавать через свойство messageConfig, например:
    'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.yandex.ru',
            'username' => 'myname@yandex.ru',
            'password' => 'mypassword',
            'port' => '465',
            'encryption' => 'SSL',
        ],
        'messageConfig' => [
            'from' => ['noreply@site.com' => 'Site Name'],
        ],
    ],
    Ответ написан
    Комментировать
  • Почему развернута прописная буква Ы в шрифте Merriweather?

    AndroMor
    @AndroMor
    UI/UX Designer
    Исправил заглавную букву Ы для всего семейства шрифтов Merriweather (8 штук) и залил все архивом в посте

    c83bd1f854eb40f9a59d7e47ebc8cead.png
    Проверил на mac и windows. Используйте и оставляйте фидбек в комментариях, плиз)
    Ответ написан
    Комментировать
  • Зависает сервер по пятницам. В чем может быть причина?

    tmr
    @tmr Автор вопроса
    Коллеги, я еще раз посмотрел отчеты по смарт и обнаружил, что хотя кол-во ремапнутых секторов невелико и не изменяется, но вот кандидатов на ремап (pending sectror) просто огромное кол-во, т.е. у диска откровенные проблемы. Что, видимо, вкупе с тупым софтовым рейдом и вызывает проблемы. Т.ч. я соглашусь с тем, что на время возникновения проблемы скорее влияют фазы луны.
    Ответ написан
    Комментировать
  • Можно ли написать компилятор в машиный код на языке очень высокого уровня?

    @dzavalishin
    1. Поверьте человеку, который пишет на Си с 1985 года (30 лет, вроде бы?) - НИКОГДА не пишите на Си ничего, если только к вашему виску не приставили пистолет. Исключение одно - ядро ОС. Да и то...

    2. Что угодно можно написать на чём угодно. Вопрос удобства.

    3. Писать компилятор надо на языке с развитыми средствами поддержки жизни проекта. Таких два - Java и C#. Можно (а если Вам это комфортно, то и нужно) использовать функциональные расширения соответствующих платформ. Scala/F#.

    4. На говноязыках серьёзные вещи писать не нужно. Ключевое свойство говноязыка - обсуждение вокруг него о том, как бедные программеры перетрудились явно прописывать руками типы всех переменных. На таких ЯП можно писать затычки и примочки.

    5. Не применяйте генераторы лексических и грамматических анализаторов, пока не научитесь писать компилятор руками. Ключевое слово - парсинг рекурсивным спуском. Это реально просто, если грамматика языка - LR1. Для начала надо взять простой язык. Очень простой.

    6. Базовый компилятор с кодогенерацией для стековой машины нужно уметь писать за два дня. Если вы хотите это уметь.

    7. Бекэнды (реальную кодогенерацию) писать НЕ НУЖНО. Вообще. Вы её хорошо не напишете ни-ко-гда. Проще генерировать на выходе Си и докомпилировать приличным си-компилятором.
    Ответ написан
    Комментировать
  • Clang и LLVM. Что это?

    @MiiNiPaa
    Да, вы правы. Clang — фронтэнд генерирующий промежуточное представление. LLVM берёт промежуточное представление (уже вне зависимости от языка на котором писался код оригинально), оптимизирует и генерирует бинарный файл.

    GCC использует схожую систему (до clang LLVM вообще принимала IF от GCC). Это позволяет иметь один бэкэнд для множества языков. Разрабатывать заного фактически приходится только парсер.
    Ответ написан
    Комментировать
  • Как делаются скриптовые языки программирования?

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

    Длинный ответ: ваш транслятор принимает на вход последовательность символов (допустим, UTF-8 текст), "понимает" ее в соответствии со спецификацией вашего языка, и выплевывает в качестве вывода инструкции на другом языке (в виде текстового файла или файла спец. формата). Этим "друим языком" может быть язык ассемблера какой-то железной платформы (x86_64, ARM, SPARC), и результирующим файлом будет бинарник под указанную архитектуру (точнее - объектный модуль, бинарник потом будет собран линковщиком) - так компилятся, например, C/C++. "Другим языком" может быть язык виртуальной машины (LLVM/байткод Java/MSIL) - так компилятся С/C++ (если через LLVM), Java, Scala, C#, F#, VB. "Другим языком" может быть и более высокоуровневый язык - часто, чтобы не париться на начальных этапах развития языка генерацией машинного кода, делают транслятор, который генерит код на Си, и этот код на Си уже компилят известным компилятором в бинарник. Или к примеру, CoffeeScript/TypeScript транслируются в JavaScript, т.к. веб-браузеры кроме джаваскрипта исполнять пока ничего не умеют.

    Конечно же, вы можете написать интерпретатор, а не компилятор - тогда ваша программа будет сразу же исполнять инструкции на вашем языке, не генерируя какой-либо выходной файл. Так поступают довольно много систем, например Node.js. Python делает также, если отключить генерацию pyc-файлов (поправьте меня, если я ошибаюсь).

    На каком языке реализовать сам транслятор - не имеет особого значения. Более того, хорошим тоном считается реализовать на разрабатываемом языке компилятор этого же языка - это называется self-hosting. Обычно наличие компилятора языка на этом же языке считается первым этапом серьезного отношения к языку. Разумеется, первую версию компилятора нужно будет реализовать на уже существующем языке (или сделать bootstrapping, если уж вы совсем суровый разработчик).

    Т.к. в задачах разбора входного потока (parsing) уже набито очень много шишек, и люди посвятили свои жизни и научные карьеры изучению этого вопроса, то сделано и немало инструментов для помощи в разработке компилятора. Как правило, такие инструменты дают возможность описать грамматику вашего языка на некоем специализированном синтаксисе (вроде BNF), а потом по этому описанию генерят вам код лексера и парсера на удобном для вас языке (это модули, которые выполнят первичный разбор входного потока на вашем языке на токены, и построят абстрактное синтаксическое дерево (AST)). А вы уже дописываете к ним основную часть вашего компилятора. Как пример, при написании компиляторов на языке Си часто используют flex в связке с yacc/bison. Есть более комлексные пакеты, позволяющие генерить код парсеров на различных языках - ANTLR, GOLD. А можно и самому написать лексер и парсер, особенно если вы уже сделали первую версию компилятора и переписываете его на вашем же языке).
    Ответ написан
    Комментировать
  • Где используется паттерн "Репозиторий"?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Паттерн репозиторий используется для изоляции логики хранения данных. Например:

    interface UserRepository {
        function getUser($id);
        function getUsersWhichSatisfyMyCustomBuisnessRulecs(BuisnessRules $rules);
        function saveUser(User $user);
    }
    
    class InMemoryUserRepository implements UserRepository {
        private $users = [];
    
        function getUser($id) {
             return isset($this->users[$id]) ? 
                 $this->users[$id] : null;
        }
    
        function getUsersWhichSatisfyMyCustomBuisnessRulecs(BuisnessRules $rules) {
             return array_filter($this->users, function (User $user) use ($rules) {
                   return $user->isSatisfyRule($rules->getSomeRule());
             }
        }
        function saveUser(User $user) {
            $this->users[$user->getId()] = $user;
        }
    }


    Что показывает данный пример:
    - что репозиторий для приложения - это прежде всего интерфейс, имплементацию которого можно заменить в любой момент. Что позволяет нам менять хранилище для отдельных сущностей по желанию. Так же InMemoryRepository часто используют при юнит тестировании (хотя обычно это моки интерфейса).

    - что нет жесткой привязки к реализации. Вы можете использовать внутри репозитория plain sql, data mapper, active record, ассоциативные массивы, файлы... ну вы поняли. Главное интерфейс заимплементить.

    - репозиторий позволяет вам построить архитектуру приложения не связывая все с логикой хранения данных. Таким образом мы организуем слабую связанность системы и придерживаемся принципа единой ответственности.

    martinfowler.com/eaaCatalog/repository.html
    Ответ написан
    5 комментариев
  • Какая часть транслятора должна отслеживать ошибку типа "неверный формат числа"?

    lam0x86
    @lam0x86
    На этапе лексического анализа проверить валидность лексемы не всегда возможно. Скажем, тип данных int32 (условное название типа, содержащего знаковое 32-битное целое) может хранить число в диапазоне [-2147483648; 2147483647]. При этом, константное выражение "2147483648" считается невалидным, а то же самое, но со знаком минус "-2147483648" - вполне валидно. В идеале, лексический анализатор не должен знать о знаке числа. Определение того, унарный или бинарный это минус (а может, язык поддерживает интервалы типа "10-100" или еще какую-то экзотику), лежит на плечах синтаксического анализатора.
    Однако, базовый анализ валидности токенов действительно проще делать в лексическом анализаторе. Например, строковые литералы чаще всего проверяются на валидность escape-символов именно в процессе лексического анализа. Чем раньше будет найдена ошибка, тем проще восстановить ошибочное состояние анализатора.
    Ответ написан
    Комментировать
  • Тип с плавающей запятой — Real или Float?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Проблема в том, что компьютер (любой) не в состоянии хранить и обрабатывать действительное число - он может хранить только число рациональное, с плавающей или фиксированной запятой.

    Поэтому, использование real будет натуральным враньем - правильно говорить о float и fixed.
    Ответ написан
    7 комментариев