• Как реализовать интерфейс в Go?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    Вы реализовали интерфейс для типа "указатель на IPAddr", а распечатываете тип "IPAddr".

    С этим возникает сложность из-за двойных стандартнов, принятых в Go, хотя и логичных. Запомните навсегда:

    Pointer type can access the methods of its associated value type, but not vice versa. That is, a *Dog value can utilize the Speak method defined on Dog, but as we saw earlier, a Cat value cannot access the Speak method defined on *Cat.


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

    Объясняется это просто - если метод реализован для указателя, он, скорее всего, может что-то менять в объекте по этому указателю, поэтому передавая объект по значению, а не по указателю - он бы менял не в самом объекте, а в его копии, которая бы делалась при передачи по значению. Это явно не то, чего ожидал писатель метода.
    В обратном же случае, если метод определён для типа по значению, а не по указателю, очевидно что метод ничего в самом значении не меняет (если бы попытался, то менял бы опять же в копии значения). А раз он там ничего не меняет, можно смело передать наш объект под ссылкой.

    Тут объясняется всё подробно: https://github.com/golang/go/wiki/MethodSets
    Ответ написан
    8 комментариев
  • Зачем нужны интерфейсы в golang?

    Ninazu
    @Ninazu
    Сам искал ответа на этот вопрос. И вдохновившись примером с лампочками, таки разобрался)

    Пусть тут полежит для потомков
    package main
    
    import "fmt"
    
    type LampDiode struct{}
    
    func (l *LampDiode) ScrewOn() string {
    	return "Lamp 1"
    }
    
    type LampIncandescent struct{}
    
    func (l *LampIncandescent) ScrewOn() string {
    	return "Lamp 2"
    }
    
    type Lamp interface {
    	ScrewOn() string
    }
    
    func Chandelier(l Lamp) {
    	fmt.Println(l.ScrewOn())
    }
    
    func main() {
    	var l1 Lamp
    	l1 = new(LampDiode)
    	Chandelier(l1)
    
    	var l2 Lamp
    	l2 = new(LampIncandescent)
    	Chandelier(l2)
    }
    Ответ написан
    Комментировать
  • Постоянные ошибки, это нормально?

    @red-barbarian
    Если не будет ошибок, ничему не научитесь. )
    С возрастом к своим ошибкам относишься строже, но если подумать, то больше всех ошибок делают дети и они же по уровню способности решать незнакомые проблемы составят конкуренцию любому профессору.
    В общем все нормально.)
    А мозги требуют тренировки.
    Ответ написан
    Комментировать
  • Постоянные ошибки, это нормально?

    AgentProvocateur
    @AgentProvocateur
    А представь, каково было тем, кто постигал все эти темы 10/15/20 лет назад?

    Когда не было ютуба, торрентов с кучей курсов и учебников на каждый чих на халяву, сотен мануалов/туториалов по каждому поводу, многотысячных блогов, гитхаба с готовым кодом на всё, что пожелаешь, stackoverflow с ответами на 95% вопросов, которые могут возникнуть, да того же тостера (куда можно придти и посетовать на то, что сложнааа).

    Когда в принципе рунет был в зачаточном состоянии (не было даже проф. форумов), информацию приходилось дёргать по крупицам в забугорном сегменте, но делать это было крайне сложно по причине того, что карточка на 150 минут dialup-интернета (50 кбит/с) обходилась в треть стипендии.

    Когда в учебных заведениях не преподавали даже паскаль, а об обилии всяких курсов, в том числе онлайн, можно было только мечтать. Когда основным источником информации на русском языке был журнал "Хакер", мать его))

    И несмотря на полный информационный вакуум и крайне скудные тех. возможности, люди горели темой, преодолевали сложности, становились специалистами и разрабатывали решения, которыми пользуются до сих пор.
    Или это нормально в IT?

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

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

    Если же препятствия воспринимаешь как должное, то хорош рефлексировать, просто преодолевай и лови кайф от преодолений. Без них никак, если ошибок и сложностей нет - значит ты просто их не видишь (т.е. допускаешь двойную ошибку), и они никогда не кончатся:)
    Ответ написан
    4 комментария
  • Постоянные ошибки, это нормально?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Если бы точно следуя инструкциям из Интернета можно было выполнять работу программиста, то на наших местах давно сидели бы таджики.
    Ответ написан
    1 комментарий
  • Как сейчас выглядит взаимодействие django + react?

    @davidnum95
    React общается с бэкэндом исключительно через rest api, не важно какой сервис предоставляет данные, будь то php, django или nodejs. Совмещать можно, но не нужно, это разные слои архитектуры приложения в целом.
    Ответ написан
    Комментировать
  • Как мягко переубедить клиента в том что он не прав?

    LenovoId
    @LenovoId
    svg, css,js
    ну как бы - сайт то не ваш.
    а в своём огороде хочу помидоры рощу а хочу кактусы
    Ответ написан
    2 комментария
  • Как мягко переубедить клиента в том что он не прав?

    Sanes
    @Sanes
    Раньше надо было об этом думать. А сейчас уже оплачено.
    Ответ написан
    Комментировать
  • Правильно ли построен план обучения?

    @WorldEn
    Лично я изучал Python следующим образом:

    - Сначала прочитал и прорешал всю книгу "Программируем на Python" Майкла Доусона.

    - После этого я полез на степик
    Прошёл его весь и получил некую базу, но этого было ещё не достаточно и после него я полез на следующий курс , где получил уже фундаментальные знания о языке

    - После этого я уже начал делать свои проекты и при возникновении проблем лез в google.ru и искал ответы на свои вопросы (где знания английского очень пригодятся!)

    Пройдя все эти этапы рекомендую прочитать М. Лутца и начать изучать алгоритмы и структуры данных. Однако, если метите в WEB , то лучше сразу начать изучать Django, MySQL, HTML, CSS, JavaScript.
    Ответ написан
    Комментировать
  • Как протестировать сервер на нагрузку?

    MaxDukov
    @MaxDukov
    впишусь в проект как SRE/DevOps.
    Ответ написан
    Комментировать
  • Как отсортировать кортеж?

    @deliro
    Я сейчас скажу прописную истину, но она, оказывается, далеко не очевидна для питон-программистов.
    Кортеж - это не "неизменяемый список". Кортеж - это структура данных. То, что кортеж умеет итерироваться - это хак, о котором даже сам Гвидо говорил.
    Как минимум, существование таких штук, как __slots__ и namedtuple должно натолкнуть на эти размышления.

    Касательно твоей задачи:
    def cmp(x):
        x = x.split('x')
        return int(x[0]) * int(x[1])
    
    sorted(SIZES, key=cmp)
    Ответ написан
    Комментировать
  • Как очистить миграции в Django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Правильным действием было привести миграции к актуальному состоянию, а не удалять их. Но раз уж удалили, подключайтесь к базе данных и очищайте таблицу миграций командой
    DELETE FROM django_migrations WHERE app='название_приложения';
    Ответ написан
    Комментировать
  • Как составить план обучения на ближайшиее время?

    aRegius
    @aRegius
    Python Enthusiast
    Добрый день, Дмитрий.

    1. В такой последовательности:
    Python
    a) Майкл Доусон - рус ... eng
    b) Марк Лутц - рус ... eng
    c) Дэвид Бизли + Лучано Рамальо
    Дальше - самостоятельный выбор, исходя из личных потребностей.
    Django
    a) Джейкоб-Каплан Мосс и Адриан Головатый - рус ... eng
    b) Django Girls Tutorial
    c) Гринфилды + Равиндран

    Параллельно читаем Django documentation

    2. HTML5 + CSS3 + JS + SQL.
    Знать на уровне, достаточном для реализации собственного проекта с нуля (скажем, свой сайт). Для этого, правда, достаточно HTML и CSS, в объеме указанных книг. Другой вопрос, что и JS, и SQL практически всегда требуются в багаже знаний при устройстве на работу (достаточно посмотреть вакансии).

    3. Нет, просто нету смысла. Актуальной качественной литературы по Python хватает. Есть некоторые исключения (некоторые из них мною упомянуты), но в целом, повторюсь, с современной литературой у Python все в полном порядке. Ищите на Amazon, сортируя по дате выхода.
    Ответ написан
    9 комментариев
  • Как правильно хранить настройки в django проекте?

    sim3x
    @sim3x
    разнести настройки "по категориям"
    Никогда такой надобности не было

    settings1.py
    foo='bar'

    settings.py
    from settings1.py import *

    зависимости от environment, например, db.py разный для prod\dev\test


    myprog
    ├── manage.py
    └── myprog
        ├── __init__.py
        ├── settings
        │   ├── __init__.py
        │   ├── global.py
        │   └── settings_test.py
        ├── urls.py
        └── wsgi.py


    __init__.py
    import os
    
    if os.environ['test']:
        from settings_test.py import *


    global.py/main.py/...
    # common settings for all env types

    settings_test.py
    from global.py import *
    
    foo='buzz'
    Ответ написан
    Комментировать
  • Чем отличается redis от RabbitMQ?

    RabbitMQ - полноценный сервер очередей, имеющий под капотом "свою" базу данных. Redis - база данных, над которой можно построить сервер очередей. Строить сервер очередей над Redis имеет смысл, имхо, если полноценный сервер не нужен, а Redis уже используется как база данных.
    Ответ написан
    Комментировать
  • Зачем нужны кортежи?

    Кортежи неизменяемы и от них можно найти хеш, если они, конечно, сами не содержат изменяемых типов.
    Из-за этого кортежи более легковесны, а возможность найти хеш позволяет использовать кортежи в виде ключей для словарей.

    Например, можно хранить содержимое некоторых координат массива
    d = {(0, 1): 'X', (2, 3): 'O'}

    Теперь легко обойти все содержимое:
    for x, y in d:
        print(x, y, d[x, y])
    Ответ написан
    Комментировать
  • Как попасть в backend-разработку?

    yucom
    @yucom
    Ruby on Rails Developer
    У вас хорошая база. Я бы посоветовал написать небольшое приложение на Django с использованием методологий TDD и Gitflow, например, микроблог - пользователи, сообщения, подписка. И выложите код на github, чтобы показывать работодателям. Интерфейс можно сделать просто на bootstrap. Потом ищите проект на фрилансе или в офис, где в команду требуется джуниор на бекенд и начинайте решать поставленные задачи, смотрите как работают другие. Изучайте теорию и функциональное программирование. Так от простого к сложному дорастете до сеньора и высоких нагрузок.
    Ответ написан
    2 комментария
  • Какие знания нужны для Python Junior-а?

    alxpy
    @alxpy
    Мне когда-то на подобный вопрос дали развернутый ответ (еще раз спасибо этому человеку). Я не смог найти ссылку на тот форум, но сам ответ у меня был сохранен:
    Вот список знаний, которыми должен обладать потенциальный Junior Python developer:

    Уметь самообучаться, находить нужную информацию.

    Иметь общие представления о том, что такое ОС и зачем она появилась.
    Понимать что такое процесс и как он “живёт” в ОС.
    Понимать что такое поток.
    Понимать что такое сокеты и зачем они нужны.
    Иметь представление о том, как устроен стек протоколов TCP/IP.

    Понимать что такое Linux.
    Уметь работать в sh.
    Понимать что такое виртуализация и знать какие бывают типы.
    Уметь настраивать виртуальные машины через vagrant или подобные инструменты.
    Уметь работать с GIT(создавать ветки, разрешать конфликты, etc)

    Понимать что такое ООП, на чём он основан и почему им удобно пользоваться.
    Понимать что такое императивный и декларативный стиль.
    Понимать что такое MVC
    Понимать что такое декоратор(стандартный вопрос на собеседовании) и зачем он нужен.
    Понимать что такое замыкание.
    Понимать что такое интроскпекция.
    Понимать асинхронную концепцию программирования.

    Уметь работать с БД(хотя бы CRUD, join)
    Уметь работать с nginx(хотя бы проксирование настроить)

    (можно просто написать - “прочитать Лутца”, но выделю пару вопросов)
    Знать чем отличаются new style классы от old style.
    Знать чем отличаются Python2 от Python3
    Знать чем отличается str от unicode и почему в программе нужно работать с unicode.
    Понимать алгоритм импорта модулей в Python.
    Понимать что такое генераторы и итераторы.
    Понимать что такое дескрипторы.
    Понимать что такое GIL и зачем он нужен.
    Понимать что такое WSGI и зачем он появился.

    + Уметь писать тесты, понимать зачем это нужно.
    + Практические и теоритические основы по framework.

    + выполнить норматив по ГТО
    + не пить и не курить.

    Так же можешь потренироваться по заданиям Юры Юревича.

    Заданиям Юры Юревича - тыц.
    Ответ написан
    4 комментария
  • С чего начать изучение веб разработки на Python, человеку абсолютно не знакомому с backend?

    @Masterme
    Работа с веб отличается от работы с не-веб одной простой вещью:
    - сервер (апач, нжинкс и т.п.) получает запрос (а запрос - это строка) от браузера,
    - сервер обращается к приложению, передавая ему эту строку как аргумент,
    - приложение возвращает результат (тоже строку),
    - сервер отдаёт полученную строку в браузер.
    Конкретно для питона такое подключение скрипта к веб-серверу решается с помощью WSGI.
    Как это сделать. В настройках веб-сервера вы указываете документ_рут вашего приложения и скрипт с колбэком. Конфигурация для апача:
    <VirtualHost *:80>
         ServerName mysite
         DocumentRoot /var/sites/mysite/public
         WSGIScriptAlias / /var/sites/mysite/script.wsgi
     </VirtualHost>

    Колбэк - это функция в глобальном неймспейсе, называющаяся всегда application. Выглядит она примерно так:

    def application(environ, start_response):
        status = '200 OK' 
        output = 'Hello World!'
    
        response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
        start_response(status, response_headers)
    
        return [output]

    Когда апач получит запрос - он через wsgi запустит функцию application, а полученный от неё результат выдаст в ответ на запрос.

    Это всё, что нужно для понимания, как обрабатывать http-запросы из питона. Всякие джанги работают на этом же механизме.

    Теперь неочевидный нюанс. Дело в том, что обычно апач в нормальном состоянии отдаёт статику как статику. А если подключить к нему wsgi - то wsgi начнёт перехватывать и запросы к статике тоже. В джанго такая ситуация решается через жопу (что доказывает, что джангодрочеры - альтернативномыслящие), а именно: предлагается создать поддомен для статики и раздавать её сервером без wsgi, нжиниксом каким-нибудь, либо отдавать статику скриптом. Оба варианта, мягко говоря, спорные. Я считаю намного лучше и гибче третий вариант:
    <VirtualHost *:80>
         ServerName mysite
         DocumentRoot /var/sites/mysite/public
         RewriteEngine on
         RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
         RewriteRule (.*) /index.py/$1 [L,QSA,PT]
         WSGIScriptAlias /index.py /var/sites/mysite/script.wsgi
      </VirtualHost>

    (Обсуждается здесь.)
    Ответ написан
    20 комментариев