• 6 рекомендаций по разработке безопасных Go-приложений
    0
    У Вас, как минимум, получилось другое поведение — где if с проверкой типа `e`, и повторный вызов panic? Давайте ещё через глобальную переменную сделаем, а может вообще через setjmp/longjmp? Вы показываете как можно «реализовать», но не говорите о том, что это непригодно для жизни.
  • 6 рекомендаций по разработке безопасных Go-приложений
    0
    Нельзя. Вот пример работы с исключениями:
    function run() {
        throw new Exception();
    }
    
    try {
        run();
        echo 'Done';
    } catch(Exception $e) {
       echo 'Error';
    }
    


    А вот что такое panic/recover:
    func run() {
    	defer func() {
                    if r := recover(); r != nil {
                            print(r) // Error
                    } 
            }()
    	panic("Error")
    }
    
    func main() {
    	run()
    }
    

    Грубо говоря на тех же try-catch
    function run() {
        try {
            throw new Exception();
        } catch(Exception $e) {
            echo 'Error';
        }
    }
    
    run();
    


    сравните первое с последним — у нас управление выводом ошибки переместилось в run(), а вывод «Done» вообще пропал т.к. мы не знаем состояние.
  • 6 рекомендаций по разработке безопасных Go-приложений
    0
    panic запускает процесс раскручивания стека, вызывая отложенные defer функции. recover позволяет восстановить управления, останавливая этот процесс.
    Т.е. это некий механизм для экстренного завершения горутины, с возможностью отмены, а не управляющая структура.
  • Как я не смог включить MacBook из-за удаления TeamViewer
    +2
    Можно ещё многое рассказать про их саппорт и «политику возврата денег». Так что данная статья — очередной пример того, что не нужно ставить сомнительный софт, даже если он обернут в красивую обложку.
  • Почему веб-разработка на Go приятнее чем на PHP
    +1
    * Сказано далее — критика статьи, и никак не раскрывает моё отношение к данным языкам.

    Многопоточность даёт колоссальные преимущества языку программирования.

    Простите, на какие преимущества то? C++ это или Go, многопоточность в любом случае добавляет немалой сложности как на этапе разработки, так и на этапе тестирования.
    Даже на производительность нельзя упереться. Возьмите тот же «супер быстрый» valyala/fasthttp и посмотрите как его рекомендуют запускать — по инстансу на ядро.

    Что мне нужно чтобы поднять обычный сайт на php?
    Сервер на Linux, установить Nginx, иногда и Apache, поставить PHP, расширения, базу данных, Memcache, настроить Cron.

    Сервер на Linux и установить Go.

    1) Для приложения на Go всё кроме PHP может так же присутствовать.
    2) Зачем устанавливать Go на сервере где разворачивается приложение написанное на данном языке?
    3) Тогда уже можно сказать про `php -S`

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

    А как потом вы собираетесь горизонтально масштабироваться? Да и Вы в курсе что каждый такой «поток» будет забирать процессорное время?

    В Go в большинстве случаев открывая какой-нибудь лютый код на 200 файлов и каждый файл полотенце кода, удивляешься тому что ты его способен понять слёту.

    Видно у Вас дар. Я, например, так сразу разобрать метод в котором 300 строк кода, и который на половину состоит из «err != nil» — не могу. Но про полотенце Вы правы.

    В Go же дебаг встроен, по сути можно и не разбираться как он работает внутри, если вы пользуетесь IDE просто ставите точку остановки и запускаете программу.

    Забавно, я всегда производил дебаг через GDB или Delve. А оказывается есть встроенный, как его вызвать, простите?

    В целом, статья похожа на «вброс».
  • PHP Pear взломан и недоступен
    +2
    Новость ещё за январь, и была, как минимум, в 148 PHP-дайджесте.

    EDIT: Я так понимаю только прошла песочницу.
  • Устройство компилятора Swift. Часть 1
    0
    В стандартной библиотеке не используется модификатор доступа private.

    Та вроде используются. Просто не везде, и из-за ограничений SPI.
  • О переменных в программировании
    0
    и назывались бы одним словом, если это одно и тоже

    «Типы данных»

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

    Их различие может быть в присутствии управляющего кода и в предсказуемости хранения в памяти. Всякие $, ^, * ничем не помогают, особенно в языках на подобии PHP, где это и не нужно.
  • О переменных в программировании
    +1
    Получается что:
    *charArray = ['a', 'b', 'c'];
    %string = simpleArray; // abc
    

    И наоборот. В данном примере разница лишь в представлении ***.
    Я поставил "***", потому что трудно сказать в представлении чего, ведь я не могу понять почему:
    1) Структуры это не данные;
    2) Объекты классов это не данные.
    3) Каким образом получилось что массивы(списки и словари) это «структуры» (если брать классическое представление).
    4) Что вообще происходит.
  • Microsoft обогнала Apple по рыночной капитализации: как такое произошло?
    +2
    В последней MacOS выпилили возможность использовать Cmd+Space для переключения раскладки в угоду абсолютно убогой комбинации Ctrl+Space. При этом даже первая проигрывает в удобстве Alt+Shift в Win.

    Не выпилили, поменяли значение по умолчанию. Самому комбинация через Ctrl показалась дикой, остался на Cmd.
  • Новый iPad, MacBook Air, Mac mini. Что показала Apple на октябрьском hardware event
    0
    USB-C в айпаде для подключение внешнего экрана или других устройств(фотоаппарата, например).

    Насчёт USB-C в айфоне частично соглашусь. Как минимум для первой синхронизации нужно подключить телефон через кабель(или я не прав?). Но в других случаях уже зависит от потребителя, не всем нужен прямой коннект через кабель.
  • Руководство по Node.js, часть 7: асинхронное программирование
    0
    IO, по идеи, обрабатывается синхронно, но не в блокирующем режиме.
  • GitHub теперь официально принадлежит Microsoft
    –1
    Гитлаб в твиттере запостил что Apple анонсировала интеграцию в Xcode 10, а через час что сейчас 14,300 уникальных пользователей в минуту. Вы действительно считаете что прилив пользователей только из-за продажи GitHub?
  • GitHub теперь официально принадлежит Microsoft
    +1
    между xamarin и гитхаб на мой взгляд существует большая разница

    При этом их объединяет один человек — Нэт Фридмен. Так что есть шанс что гитхаб не пойдёт по стопам скайпа.
  • Создание, настройка и использование собственного Git-сервера
    +1
    Вместо Gogs советую Gitea, т.к. автор первого добавляет фичи которые подходят ему, а не сообществу.

    По этому поводу много возмущений, но их Вы не найдёте — автор постоянно удаляет такие комментарии(и все упоминания Gitea тоже).
  • Protocol-Oriented Programming
    0
    Насчёт type erasure и способы реализации можно посмотреть короткий доклад на youtube
    А вот сам пример.
  • Внедрение предметно-ориентированного проектирования в PHP
    0
    Под «Не менее важная логика» вы подразумеваете бизнес ограничения?
    Вы можете привести какой нибудь пример, чтоб мы говорили более предметно?

    Банально — поисковый запрос: отсеивание запрещённого для страны пользователя контента, анализ поискового запроса, внедрение своего контента на основе запроса и т.д.

    А насчёт событий — о каких бизнес требованиях может идти речь, если Вы «просто бросаете событие»? Где гарантия их выполнения?

    Можно на fronend через js или картинки по аналогии с другими метриками.

    А как на фронте понять что нужно обновлять счётчик?..

    У Вас уже логика прямо на фронте получилась. А на беке получается паутина из обработчиков событий. При этом это один use case.
  • Внедрение предметно-ориентированного проектирования в PHP
    0
    Домен нужен для того, чтоб сформировать бизнес логику обработки Write потока, а доменные события тригерят обновление кеша и снепшотов для Read потока.

    Такой подход работает лишь в сильно специализированных не CRUD приложениях. Не менее важная логика есть и в потоке чтения.
  • Внедрение предметно-ориентированного проектирования в PHP
    0
    Что значит «поднимать»?

    Вы разделяете всё на контексты, и соотвественно из этих контекстов потом нужно забирать данные. Страница вывода поста — обращение как минимум к «посты», «комментарии» и «пользователи», блок «Самые комментируемые посты» — обращение как минимум к контекстам «посты» и «комментарии».

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

    Вот вопрос скорей стоял где та грань, когда из-за «много своей бизнес логики» вместо выделения в отдельный агрегат, нужно выделять в отдельный контекст, несмотря на то, что он как самостоятельная единица бессмысленен.
  • Внедрение предметно-ориентированного проектирования в PHP
    0
    Допустим у нас есть страница вывода поста. В таком случае нужно обращаться как минимум к 3-м контекстам — посты, комментарии, пользователи. Как это дело объединять?
  • Что нового в AppCode 2018.1
    0
    Есть ли в планах вынести проверки IDE в инспектор?

    Например поддержка атрибутов, или же просто их эволюцию с «availability» -> «available», или же "_versioned" -> «usableFromInline» и "_inlineable" -> «inlinable».

    В AppCode редактор будет подсвечивать как ошибки «Unknown attribute '...'» до выхода версии с их поддержкой, и это никак нельзя отключить.

    И второй вопрос — будут ли расширяться возможности Code Style, в частности возможность ставить пробел в операторных методах после самого оператора, например:
    static func myFn()
    static func + ()
    


  • Современный PHP без фреймворков
    +1
    • Composer
    • PHP-DI
    • Zend Diactoros
    • Middleware
    • FastRoute


    Вам не кажется что Вы изобрели zend expressive?
  • PHP-Дайджест № 126 (12 – 25 февраля 2018)
    0
    1) Более наглядно что объект неизменяемый;
    2) если свойство — указатель на другой класс, то ни геттеры ни ограничение доступов не спасёт;
    3) COW (фантазии?).
  • Рассуждение на тему, какую базу данных выбирать
    0
    При падении 1 мастера кластер упасть не должен. Другое дело если падает два — тогда в случае 3 мастеров не получится организовать кворум для выбора слейвов(сами слейвы не могут голосовать), и поднимать нужно ручками. Больше нод — меньше шанс падения кластера.
  • Рассуждение на тему, какую базу данных выбирать
    0
    Да, чётное, количество подобрано исходя из данных которые лежат в редисе.
    Неважно кратное 3-м количество нод, 10, 100, или даже 2, к сожалению это влияет лишь на шанс падения всего кластера.
  • Рассуждение на тему, какую базу данных выбирать
    0
    Да, правда всего из 6 мастеров.
  • Рассуждение на тему, какую базу данных выбирать
    +1
    Про Redis речь не о репликации мастер-ведомый. Как раз репликация там очень хорошо сделана.

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

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

    то все не очень удобно — нельзя например создать кластер из 5 узлов или просто добавить 1 мастер, убрав другой мастер.

    Насчёт «кратных 3 обязательно» — не понимаю откуда взялась такая информация?
    Даже в документации приведён пример из 5 нод. (+ по слайву на каждый, итого 10)

    Создавать и добавлять узлы в кластере можно только при помощи скрипта специального на Ruby. И встречал упоминание, что работает это не всегда корректно и очевидно. Э Ах да, узлы еще должны работать с опцией cluster-enabled, при этом как обычные сервера они уже перестают быть доступными.

    С добавлением нод проблем нет вообще.
    Насчёт опции. У вас поведения редиса меняется — ели вы пойдёте на неправильный мастер, он Вам вернёт узел в котором лежат данные, собственно из-за этого и ограничение — Вам нужно знать веса что бы попадать с первого раза на нужный мастер.
    И в этом обычно нет проблем т.к. если разговор про Redis, то использовать один инстанс под всё, разграничивая номером БД это плохая практика.
  • Самый медленный способ ускорить программу на Go
    0
    Как известно, Go поддерживает использование кода, написанного на C. Поэтому, ничего не мешает сделать так:

    А Go заинлайнит функцию sqrt? Ещё 2 года назад не умел.
    Пример. Здесь правда тест функции которая в .s файле, да и за правильность работы не могу отвечать.
  • Рассуждение на тему, какую базу данных выбирать
    +2
    MongoDB справился без особых проблем. База данных достигает объема в 200-300 ГБайт, поток данных достигает 100 и более МБайт/сек.

    у вас планируется довольно серьезный объем данных (десятки или даже сотни ГБ), определить это даже на этапе ТЗ можно;

    Не совсем соглашусь, т.к. монга работает отлично пока хватает памяти.
    Плюс, по своим наблюдениям, скажу что она начинает медленней работать когда базу становится свыше 1Тб.
    Ну и добиться результатов свыше 100Мб/сек(а то и меньше) в реальных кейсах можно только с помощью bulk, иначе с ней могут произойти чудеса, когда даже findOne() уходит в бесконечное выполнение.

    — до сих пор не умеет нормально кластер и шардинг. Нормальной реализации до сих пор нет.

    Можно подробней в чём проблемы? Могу отметить что есть проблемы если master падает(проблемы на время пока slave не переключиться), но в целом вроде всё хорошо.

    Хотите тоже самое, что MongoDB, но у вас нет для приложения адаптера или не хотите лишних зависимостей?

    Couch(Base) совсем не тоже самое что и MongoDB.
  • PaEndpointBundle — альтернатива контроллерам Symfony
    +1
    А что Вы будете делать, если в вашем crud-приложении один из дочерних классов потребует специфическую реализацию? Вангую что Вы полезете в BaseEntityListController, и перенесёте кусок кода из уже немалого метода execute в отдельный метод, для того что бы в дальнейшем переопределить его в дочернем. А что если в дальнейшем появится ещё такая задача, и кусок кода будет в новосозданном методе, вы ещё и его дробить начнёте? Не много ли отвественности на базовом контроллере при Вашем подходе?
  • Расширение моделей в Eloquent ORM
    0
    Я про то что на момент вызова save() у вас состояние модели может быть неактуальным. И запрос вида
    SET balance=:balance

    в корне неверный. Таким образом нужно вводить некую версионность, и на выходе получать запрос
    SET balance=:balance WHERE version=:version

    что не сработает при высокой активности работы с данной записью в таблице. Корректным решением будет переносом логики в сам запрос:
    balance=balance+:sum WHERE balance+:sum>0

    но тогда ORM у нас используется для стартового преобразования БД->КОД. По этой причине я и сказал что ORM — инструмент для преобразования объектов в SQL код и наоборот, но никакой связи между объектом в коде и объектом в БД здесь нет. ORM облегчает работу с БД в CRUD приложениях.
  • Расширение моделей в Eloquent ORM
    0
    ОРМ — это решение проблемы связи объектов на рсубд и обратно.

    Никакой связи здесь нет, есть только преобразование. Вы не можете написать:
    $user->withdrawMoney(10);

    т.к. состояние сущности никак не синхронизируется с БД.
  • Rust vs. C++ на алгоритмических задачах
    +1
    Спорить о быстродействии глупо, т.к. разные реализации стандартной библиотеки.
    И без тестов можно было бы предположить что С++ может быть медленней(в std упор на универсальность, особенно это касается hashmap), но вот разогнать производительность можно без проблем.
  • Онлайн-квест от MBLTdev: призы и ответы
    0
    Координаты считались с погрешностью и достаточно было ввести не менее чем 4 символа после запятой. Верный ответ — 55.7407, 37.6090.

    Достаточно было ввести 3 символа
  • Онлайн-квест от MBLTdev. Призы от JetBrains
    0
    Не хватает скрипта для майнинга биткоинов на третьем вопросе.
  • Основы CQRS
    0
    Ну я понимаю, из-за этого и написал «скорей всего», но вообще не представляю такой кейс если данные лежат уже в готовом виде. Просто если хранить данные в базе для чтения в таком же формате как и в базе для записи, то почему бы просто не использовать master-slave? Вообще почему никто не задумывается о неком гибриде подходов. Т.е. у нас есть некая РСУБД которая используется не просто для записи, а полностью для работы команд. Базы для чтения используются только по запросам из слоя UI. Решается вопрос с консистентностью на уровне команд, которая так важна.

    Допустим есть баланс пользователя. И 2 страницы: Зачислить/Снять средства и страница транзакций.
    Команда зачисления/снятия работает с актуальной версией данных, и если всё успешно, то создаёт событие, которые передаются по шине и обрабатываются в дальнейшем на сервисах которые отвечают за состояние баз для чтения. Т.е. одна транзакция в БД для записи это одно событие. События пишем что бы потом накатывать данные для новых Query.
    Некий псевдокод такой команды:
    // Первый аргумент - обновление рабочей базы. Все запросы в рамках одной транзакции.
    // Второй аргумент - список событий которые генерируются если транзакция не откатилась
    doQuery(function($queue) {
        // Первой аргумент - запрос, второй аргумент - число ожидаемых затронутых строк
        $queue->add('UPDATE Account SET balance = balance - 20 WHERE user_id = 1 AND balance >= 20', 1)
    }, function($queue) {
        $queue->add(UserChangeBalance(1, -20));
    })

    Такой псевдокод на выходе генерирует некий SQL:
    START TRANSACTION;
    UPDATE Account SET balance = balance - 20 WHERE user_id = 1 AND balance >= 20;
    SELECT ROW_COUNT() INTO @affected_rows_1;
    IF (affected_rows_1 == 1) THEN
        INSERT INTO events ...
        COMMIT;
    ELSE
        ROLLBACK;
    END IF
    


    Если коммит был успешным, то мы отправляем событие UserChangeBalance на шину, там его подхватывает сервис который пишет в БД для Query «Получить историю транзакций», который используется на странице транзакций.

    Реализация выглядет ужасно конечно, но это то что быстро пришло в голову, если допилить, я думаю такой подход мог бы лечь и на CRUD приложения.
  • Основы CQRS
    0
    а как быть в ситуации с долговременными запросами. Где обработка занимает от 30 сек, что для браузера по-умолчанию будет выходом по ошибке превышения времени ожидания ответа.

    Данные в базе должны уже лежать максимально приближённые к тем, которые запрашивает UI. Если обработка занимает от 30сек, значит, скорей всего, Вы что-то делаете не так.
  • Конструктор
    0
    и парихмахера
  • Создание веб-приложения на Go в 2017 году
    0
    Когда вы захотите «заюзать» сервер целиком со всеми его ядрами, начнется «балансировщик запросов, разделяемый кэш, ...» и далее по тексту.

    Если вы захотели «заюзать» сервер целиком, значит в этом есть необходимость, а значит уже совсем скоро вы «захотите» добавить ещё один сервер, и в итоге не важно go это или python, но балансировщик и разделяемый кеш в любом случае будет. Так что Ваше утверждение не звучит как минус.
  • Сравнение производительности версий PHP
    0
    Не в стрикт режиме аналог это

    Ну в правильности спорить не буду, хотел просто сказать что это, по сути, условие, и не более.

    Разница в том, что тайпхинт работает таки быстрее, чем «аналоги». И не более.

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

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