• Postgresql: один уникальный индекс для нескольких таблиц?

    MegaMufa
    @MegaMufa Автор вопроса
    Если у кому-то интересно решил это так: создал sequence "hash_seq" и для этих полей прописал дефолтное значение nextval('hash_seq'). Уникальность гарантирована, если нигде не вписывать это значение вручную.

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

    MegaMufa
    @MegaMufa
    1. см пункт 3
    2. Мое личное мнение - все равно с какого языка начинать. Но я бы на вашем месте начинал с чего-нибудь другого. Haskell не сильно востребован на рынке и работу будет найти сложно, а зарабатывать надо. Поэтому лучше начните с мейнстрима, а потом учите Haskell.
    3. Практически что угодно можно на нем писать. Чистые функции очень хорошо параллелятся. Из самого известного на мой взгляд xmonad - тайловый оконный менеджер для linux.
    4. www.ozon.ru/context/detail/id/8696277 - прекрассная книга. Интересно и все по полочкам. Сам по ней учил.
    ohaskell.dshevchenko.biz/ru/chapters.html - тоже хороший учебник, но здесь построение материала другое.
    5. Если ваша цель - найти работу, то, думаю, нет. ВАкансии существую, но их очень мало. Если вы хотите изучить другую парадигму программирования, то однозначно стоит. Так же Haskell очень красивый язык. Мне он нравится в первую очередь из-за синтаксиса. Ну и это чистый функциональный язык. Кто знает Haskell - тот знает ФП.

    Вот интересный пост на хабре от менеджера команды, которая использовала Haskell в продакшене. habrahabr.ru/post/193722 Как всегда в комментах очень много интересного.
    Ответ написан
    4 комментария
  • Как обращаться к константам моделей из контроллеров?

    MegaMufa
    @MegaMufa
    Я обычно использую первый вариант. В принципе во втором не вижу ничего плохого, но мне больше первый нравится. А вот третий - плохо. Зачем загрязнять глобальное пространство?

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

    MegaMufa
    @MegaMufa
    Я так понимаю, вы из Краснодара. Я сам из этого города и знаю о трудоустройстве в нем довольно много ибо на одной работе больше года не задерживался.

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

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

    Мне тоже 23 года. Без профильного образования. Первую работу (три года назад) нашел без проблем. Начал с 25к, через 5 мес получал почти 40к, на том же месте. Сейчас получаю 80к, но уже в другой фирме.

    Я вас понимаю, у меня тоже был психологический барьер чтобы начать. Думал, что я дурак и ничего не знаю. Потом жизнь приперла, срочно понадобились деньги - за 4 дня устроился программистом. А как потом оказалось, я знал больше своих коллег. Это я к тому, что разработчиками работает куча балбесов без вменяемых навыков и не парятся. Если у вас есть желание учиться и развиваться, скажите об этом потенциальному работодателю. Этот вариант будет выгоден и вам и ему.

    Понятно, что первые полгода о зп в 50к говорить не приходится. Но стоит ужать свои расходы и пойти на этот шаг. Потому что в будушем (не таком далеком) это даст большой профит. За полгода усердной работы вы наберетесь достаточно опыта, чтобы нормально развивать дальше свою карьеру. Сможете работать удаленно на другой горов или страну и получать много больше, чем могли бы в Краснодаре.
    Ответ написан
    10 комментариев
  • Где правильнее проверять пользовательские данные? В контроллере или модели?

    MegaMufa
    @MegaMufa
    Я считаю, что "толстая модель, тонкий контроллер" - это самый подходящий вариант.
    Вся логика приложения должна содержаться в моделях. Модель - это не просто сущности из бд, это еще и инкапсулированая логика ее обработки. А контроллер должен говорить модели, что делать и рендерить вьюхи.

    Например этот кусок кода неправильный:
    class MyController
    {
        public function myAction()
        {
            $user = new User();
            $user->load($_POST);
            if ($user->valiadate()) {
                $user->saveToDatabase();
            } else {
                throw new Exception("...");
            }
        }
    }

    Неправильный потому что контроллер знает, как модель сохраняет данные. Что сначала идет валидация, а потом сохранение в бд. И если вы потом решите не проводить валидацию, или добавить еще один проверяющий метод (например), то вам придется делать это везде.

    Правильно быдет так: в модели определеить метод, содержащий логику:
    class User
    {
        public static function create(array $data)
        {
            $record= new static;
            $record->load($data);
            if($record->validate()){
                $record->saveToDatabase();
            } else {
                throw new Exception("...");
            }
            
            return $record;
        }
    }


    А в контроллере просто дергать его и передавать туда данные:
    class MyController
    {
        public function myAction()
        {
            $user = User::create($_POST);
        }
    }


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

    Такой подход облегчает сопровождение кода а так же облегчает написание тестов.
    Ответ написан
  • Как воспользоваться на своем сайте google/яндекс картами?

    MegaMufa
    @MegaMufa
    Всем здравствуйте, конечно в гугле все есть, можно найти.

    e168f75e568e4818a3a3f1602608a05a.jpg
    Ответ написан
    Комментировать
  • Есть ли ошибки которые зависят от платформы?

    MegaMufa
    @MegaMufa
    Например, если вы в полных именах директорий будете использовать виндовый разделитель "\", на линуксе не заработает. Там надо "/" писать. А вот наоборот все сработает. Но по хорошему надо DIRECTORY_SEPARATOR использовать.
    Ответ написан
    Комментировать
  • Как начать работать удаленно или фрилансить, если даже проекты по мизерной цене вызывают затруднения?

    MegaMufa
    @MegaMufa
    Я бы посоветовал вам устроиться на некоторое время работать в офис. Работа в команде очень сильно помогает поднять свой уровень. В этом есть несколько плюсов:
    1. У вас всегда под рукой есть ментор, который может подсказать как решить поставленую перед вами конкретную задачу. Знания, получаемые таким образом, усваиваются намного лучше. Вы лучше понимете, как применять свои навыки.
    2. К окманде работает несколько человек, каждый со своим мнением и кругозором. Общение на обеде, за кофе и на обсуждениях проектов поможет ваам расширить свой профессиональный кругозор. Вы узнаете про многие технологии. В данный момент они вам не понадобытся, но вы будете знать о них, во время принятия решений в будущем.
    3. Устраиваясь на работу в офис стажером (или новичком, в общем неопытным специализстом), вы ставите в известность своего работодателя. Он в замен на пониженый оклад (у начинающего программиста ЗП, конечно ниже), помогает вам обучаться, выделяя вам ментора и давая практику.
    4. Вы преобретаете опыт решения реальных кейсов. В дальнейшем вы будете знать, как решается большинство типовых задач.
    5. В спокойной, но реальной обстановке получите опыт обучения "на лету" и поиска нужного материала.

    Я, когда начинал, тоже страдал такой проблемой. Год работы в комманде из 7 программистов стал для меня сильнейшим рывком. За этот год я поднялся больше, чем за предядущие три года самообучения. Поработал, получил опыт (и кучу положительных эмоций от общения с коллегами), потом спокойно перешел на удаленку.

    Мой вам совет: поработайте некоторое время в команде.
    Ответ написан
    6 комментариев
  • Yii2 / hasOne или что я делаю не так?

    MegaMufa
    @MegaMufa
    $data = Content::find()->getAuthor()->all();
    Вы не выбрали нужную запись.

    Если вам нужен автор, то надо так:
    $data = Content::find()->one()
        ->getAuthor()->one();


    Если вам нужны все записи вместе с авторами, то так:
    $data = Content::find()
        ->with('author')
        ->all();
    Ответ написан
    1 комментарий
  • Как грамотно закрыть MySQLi?

    MegaMufa
    @MegaMufa
    Соединение закроется автоматически, когда отработает скрипт. В дальнейшем вам возможно еще раз понадобиться обращатся к бд. А установление соединения - довольно дорогостоящая операция.

    Если вы пишите на php и это не демон (написание которого на пыхе - сомнительное удовольствие), то об освобождении ресурсов сильно не парьтесь. Скрипт отработал - за вас все подчистят.

    Конкретно в этом случае, вынесите закрытие соединения в дестурктор. Или создайте отдельный метод close() и дергайте его.

    По поводу подхода. В данном случае действительно будет лучше писать в процедурном стиле (и в этом нет ничего плохого; ООП - не панацея). Здесь вы класс используете не по назначению. Классы нужны для разделения логики: один отвечает за соединение с бд, другой за формирование запросов, третий за формирование результатов.

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

    Для поднятия навыка попробуйте покопаться в исходниках какого-нибудь фреймворка. Я в свое время перебрал ядро Yii. Он прост для понимания и не перегружен паттернами.

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

    MegaMufa
    @MegaMufa
    Да, можно.
    class Test extends ActiveRecord
    {
        ...
        public function getTags() 
        {
            return $this->hasMany(Tag::class, ['text_id' => 'id']);
        }
    }


    В контроллере
    public function actionIndex()
    {
        return Text::find()
            ->andWhere(/* ... */)
            ->with('tags')
            ->all();
    }


    Код писал прям тут, возможно опечатался где-нибудь. Но посыл понятен. Вытягивайте данные жадной выборкой (указывая связанную модель через with()) и будет работать так, как вам надо.
    Ответ написан
    2 комментария
  • Позднее статическое связывание php: как это работает?

    MegaMufa
    @MegaMufa
    Смотрите. Есть такая простая иерархия классов:
    class A
    {
        public static $text = 'class A';
    
        public function selfTest()
        {
            echo self::$text;
        }
    
        public function staticTest()
        {
            echo static::$text;
        }
    }
    
    class B extends A
    {
        public static $text = 'class B';
    }


    Мы создаем экземпляк субкласа и вызываем методы, определенные в предке.
    $obj = new B();
    $obj->selfTest(); // выведет "class A"
    $obj->staticTest(); // выведет "class B"

    self всегда указывает на тот класс, в котором он написал. Здесь метод описан в классе A, и self указывает на класс A, хоть и вызывается из класса B.
    Значение static вычисляется при вызове. И static указывает на класс объекта в котором произошел вызов. В нашем случае он указывает на B, хотя сам код описан в классе A.

    Зачем это надо? Для того, что бы можно было переопределять статичные члены вашего класса в наследниках и вы могли обращаться к новым значениям из методов, описанных в предке.

    С обычными не статичными членами это и так работает, потому что они собираются, когда вы создаете объект класса. Что бы это работало для статичных методов, надо использовать static
    Ответ написан
    1 комментарий
  • Как удобно организовать свой рабочий процесс на PHP, используя Sublime3?

    MegaMufa
    @MegaMufa
    Я использую phpshotm. Там все это из коробки решено. Поробуйте - не пожалеете. Там месяц пробный период.
    Ответ написан
  • PHP: как сделать автоматическое добавление записей на стену сообщества вконтакте?

    MegaMufa
    @MegaMufa Автор вопроса
    Все оказалось до банального просто. Делать запрос через curl и сохранять куки, которые выдает сервер. Тогда все работает.
    Ответ написан
    1 комментарий
  • Как получить ширину и высоту изображения, хранящегося на сервере?

    MegaMufa
    @MegaMufa
    getimagesize() В возвращаемых данных есть размеры изображения. В примерах кода (внизу страницы) есть вывод этих данных прям в тег img
    list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
    echo "<img src=\"img/flag.jpg\" $attr alt=\"getimagesize() example\" />";
    Ответ написан
    Комментировать
  • Почему div блок меньше, чем его содержимое?

    MegaMufa
    @MegaMufa
    Поставьте ему overflow: hidden. Тогда он растянется по высоте вокруг всего содержимого.
    Ответ написан
    Комментировать
  • CMS с простым шаблонизатором

    MegaMufa
    @MegaMufa
    Судя по требованиям, вордпресс вам отлично подойдет.
    Ответ написан
    Комментировать
  • Что должно включать в себя ТЗ на дизайн сайта?

    MegaMufa
    @MegaMufa Автор вопроса
    В общем, если кому то интересно.
    Описал в тз, почти все пункты, которые перечислил. Получилось вот это: чпок!

    Сейчас по этому ТЗ делается дизайн. Дизайнер, вроде, доволен. Никаких недопониманий пока не возникало. Единственные вопросы, которые у него возникли, касались определений. Поэтому я бы порекомендовал (да все рекомендуют) включить раздел "описание терминов".

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

    Очень помогли статьи, которые привел @mr_jok, но большинство советов не применимо к тз только на дизайн. Логику работы сильно описывать не стал, потому что дизайнеру она не нужна. Вместо этого добавил раздел "пользовательские сценарии".

    В общем: все (и я и дизайнер) остались довольны.
    Ответ написан
    2 комментария
  • Какие вы дадите советы начинающим разработчикам инди-игр на мобильных платформах?

    MegaMufa
    @MegaMufa
    Дайте наставления юным первопроходцам

    Это, конечно, врядли.

    А по делу:
    Мой вам совет: не недооценивайте 3d игры.
    Игры буду нацелены на увлекательность и креативность, так что о 3D играх речь не идет.

    Это здорово и похвально, что вы ставите такие цели. Но 3d движок вам при этом не помешает. С кокосом я работал совсем чуть-чуть, поэтому не могу быть до конца объективным. Но на плюсах разрабатывать несколько труднее, чем на шарпе. Почему бы не попробовать unity3d? Зафиксируйте камеру сбоку в одном положении и вид будет, как в 2d, но при этом повысится скорость разработки.

    Я ни в коем случае не призываю вас отказываться от плюсов. Я очень люблю этот язык и считаю, что он на пару с Haskell может решить все проблемы человечества от корумпированого правительства до старения и смерти :-)

    Но если вы только начинаете делать игры, может стоит сосредоточиться на более высокоуровневых задачах, что бы больше внимания уделить геймдизайну и игровой механике. Сделайте одну игру (все равно первая выйдет комом) на юнити. Он дает кучу разных и удобных инструментов, которые сильно облегчают процесс разработки. А когда получите полное видение картины - делайте обоснованный выбор. Я бы сделал так.

    И не забывайте, что в статьях вы чаще всего читаете мнение их авторов. Следите за тем, что бы ваше мнение было обоснованным, а не слепо доверяете всему, что читаете.

    Ну, а в общем: просто пишите игры. Да, да. Все так просто: сядьте и пишите. Никакая теория не даст вам тех знаний, какие вы получите на практике. Удачи в ваших начинаниях.
    Ответ написан
    Комментировать