Pull to refresh
6
0
Алексей @BoneFletcher

User

Send message
Мой 16" MacBook Pro переодически зависает при переключении интегрированной и дискретной видео-карты. Чаще всего это просто зависание на пару секунд после просмотра видео на youtube, но иногда зависает надолго. Один раз все повисло во время видео-конференции, пришлось закрывать крышку ноутбука — внешне это выглядело как будто я просто закрыл ноубук и отключился.

Беглым поиском не смог найти решения проблемы. У кого-нибудь было такое, удалось решить?
Ну тут каждый выбирает то что ему ближе: кто-то играет только на скорость, кто-то ценит только логику и играет на мастерство, а кто-то вообще играет только сверхсложные карты с вероятностью победы вроде 0.0024% :) Вообще, о возможных стилях игры в сапере можно целую статью написать…
Конечно, на то он и режим без угадывания) Зеленым выделены клетки, которые можно открыть. Но чтобы прийти к этому решению, нужно проанализировать все клетки, которые выделены голубым. Ну и в совершенстве знать все основные паттерны.
Интересная реализация, спасибо за перевод!

Жаль не упомянут режим без угадывания в World of Minesweeper. Я думал что знаю все возможные паттерны, пока не попробовал «Злой» уровень. Там встречаются настолько сложные комбинации, что над ними приходится размышлять по несколько минут. Что-то вроде такого:

image
Кстати, hetzner собирает сервера из десктопных комплектующих, в итоге они стоят копейки, а производительность выдают большую. Я изучил комплектующие своего сервера на AMD 1700X (8x3.4Ггц) за 60 евро/мес. Там стоит самая дешевая мать от ASUS за 5000 руб и память без поддержки ECC. Но сам сервер работает быстро и без сбоев, нагрузка 24 часа в сутки почти на 100%. В чем подвох? Почему все так не делают?
На сайте World of Minesweeper есть рейтинг самых сложных пройденных карт, на данный момент там лидирует игра размером 30х20, 167 мин (по ссылке доступен повтор). Интересно, сколько времени в среднем нужно потратить чтобы пройти такую карту? Как-то можно посчитать?
Для контроллеров отдающих json рекомендую использовать аннотацию ToJsonResponse:
    /**
     * @Route("/greetings/{id}")
     * @ToJsonResponse()
     */
    public function greetings($id)
    {
        $greeting = $this->getDoctrine()->getRepository("AppBundle:Greeting")->find($id);
        return ['greeting' => $greeting->getGreeting()];
    }

Отличие в том, что в случае ошибки вернется корректный json, а не html-код:

STATUS 500 Internal server error
{
    message : 'Exception message'
}

Если вы придерживаетесь идее «чистого кода» в разработке, то, как это ни странно, но лучше использовать нативный php-шаблонизатор, т.к. его в совершенстве поддерживает Code Inspection хороших IDE, вроде PhpStorm. Единственный минус — в начале каждого шаблона нужно указывать типы переменных. Для экранирования можно сделать короткую функцию e():

<?php
/** @var Post[] $posts */
?>
<h1>Posts list</h1>
<?php foreach ($posts as $post):?>
    <h2><?=e($post->title)?></h2>
    <?=e($post->text)?>
<?php endforeach ?>

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

class BooksService
{
    private $bookFactory;

    public function __construct($bookFactory)
    {
        $this->bookFactory = $bookFactory;
    }
    
    public function booksMethod()
    {
        $book1 = $this->bookFactory->create();
        $book5 = $this->bookFactory->create();
    }
}

Но только если это реально необходимо. Если можно обойтись без абстракций, то лучше делать без них.
Dependency Injection — явная передача объектов в методы класса, только так. Либо в конструктор (идеальный вариант), либо в init-методы (initServiceA()).

Здесь не ошибка, а скорее путаница определений, свойственная многим статьям/мануалам. Под заголовком Dependency Injection в статье описан Dependency Injection Container (DIC). Очень часто, когда пишут о DIС, «Container» опускают. На самом деле DI можно использовать без контейнера, как описано в примере в начале:

public function __construct(Grabber $grabber, HtmlExtractor $filter)

Очень хорошо это поясняет Anthony Ferrara в обучающем видео:
www.youtube.com/watch?v=IKD2-MAkXyQ
Еще можно с помощью SPL Types переопределить свои типы Int, Float, Bool, String и использовать их вместо стандартных типов:
function f(Int $a)
{
    $b = new Int($_GET['b']);
    echo $a == $b; // неопределенность исключена
}
Как Вы думаете, зачем тогда его вообще придумали, раз без него так отлично живется?) И почему его так активно используют в своей архитектуре symfony, yii, zend и другие большие проекты? Лично мне кажется, при разработке действительно сложных проектов, имеющих огромное количество связанных классов, лучше использовать проверенные архитектурные решения.
Это упоминается в заключении. Сайт-блог рассматривается в качестве примера только потому, что он понятен большинству веб-разработчков. Для подобных сайтов в PHP есть множество других простых фреймворков и CMS'ок.
В случае аудио или видеофайлов первый метод не подойдет, так как браузер запрашивают файлы по частям, передавая заголовок Range. Придется обрабатывать его вручную, как описано в статье, но проще воспользоваться заголовками X-Accel-Redirect / X-SendFile.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity