• Для чего и как применять директивы в AngularJS?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    для чего нужны директивы


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

    где их применять


    Везде где только можно, весь UI следует строить на иерархии директив, как если бы вы просто верстали. Я бы даже сказал что использовать только контроллер, как например можно увидеть в примерах для ngRoute/uiRouter и шаблон - это плохо, контроллеры и шаблоны использовать можно, но только для того что бы определить какие в рамках этого роута/стэйта будут использоваться директивы и передать туда параметры. То есть по максимуму все запихивать в директивы. Правда это может быть первое время сложно делать, потому лучше постепенно увеличивать степень дробления UI на директивы. Главная сложность сделать так, что бы директивы были независимы от контекста использования. Ну или явно определить этот контекст (параметр require директивы может определять что директива A может быть использована или должна быть использована только в контексте B). Ну и еще по началу может быть сложно определиться что должно быть в link и что должно быть в контроллере, должен ли вообще у директивы быть link или контроллер.

    ng-inject

    вы про галповский плагин или все же про ng-include? если последнее, как комбинация ng-include + ng-controller, то это тип... для ленивых. При помощи этих двух директив мы можем создать какой-то элемент, присобачить ему поведение и шаблон, да, но оно не будет изолированным, реюзать такое уже не выйдет. Если это вам надо временно, и вам лень - то можно и так, но лучше сделать полноценную директиву, тогда ее можно будет реюзать в рамках проекта и устранить дублирование. Ну и опять же, вариант с ng-include+ng-controller можно покрыть только E2E тестами, что не удобно. Директивы же просто и удобно покрываются юнит тестами, что делает поддержку системы намного проще и дешевле.

    в каком виде правильно и разумно применять директивы

    Посмотрите на polymer, это то чем должны были бы стать директивы а ангуляре (и в angular2 оно почти так), там больше ограничений и более понятно как использовать web-компоненты и как следствие - директивы.
    Ответ написан
    9 комментариев
  • Какое IDE подойдет для программирования на golang?

    profit
    @profit
    Разработка | Оптимизация. Telegram: @evzavyalov
    Использую liteide
    Ответ написан
    Комментировать
  • Как разобрать код на Python?

    @tplus
    s = 6
    result = 1000 * 1000
    N = int(input()) # получаем ввод с клавиатуры и приводим к целому числу
    prev_min = [0] * s # при s = 6, [0, 0, 0, 0, 0, 0]
    prev_min[0] = float(input()) # первый элемент списка из 6 элементов делаем равным float(ввод с клавиатуры)
    for i in range(1, s) # от 1 до 5
      # запись в i-ячейку меньшего из ввода с клавиатуры и предыдущего элемента списка
      prev_min[i] = min(float(input()), prev_min[i-1])
    
    for i in range(s, N): # от 6 до N-1
      next_num = float(input()) # ввод с клавиатуры приводим к float
      # присваиваем минимальное из result и произведения next_num * prev_min[i % s]
      # i % 2 - остаток от деления = проверка числа на чётность
      # 3 % 2 = 1, 5 % 2 = 1, 6 % 2 = 0, то есть индекс всегда будет 0 или 1
      result = min(result, next_num * prev_min[i % s]
      # присваивание в prev_min[0/1] минимального из prev_min[0/1] и next_num
      prev_min[i % s] = min(prev_min[(i - 1) % s], next_num)
    print(result) # вывод результат
    Ответ написан
    Комментировать
  • Как настроить nginx + django?

    syschel
    @syschel
    freelance/python/django/backend
    Эммм.. В интернете сотни, даже тысячи статей про настройку джанги под убунту на нджинксе. Все они вам не подошли и вам нужна 1001 статья? Так они все однотипные, принципы одни и теже. Меняются только пути к рабочей папке.
    Ответ написан
    Комментировать
  • Своя авторизация: сессии, куки, хранение данных о пользователе. Как реализовать?

    @amalinin
    WEB-Developer
    1) По сути сессия с абстрактной точки зрения - какая-то запись где-то на сервере. Данные сессии могут храниться в БД или вообще в файле. Простейший случай идентификатора сессии: хэш таймстемпа, уникальных данных юзера(с точки зрения приложения), уникальных данных клиента(браузера). Очень хорошо, если есть время жизни при использовании Redis или Memcached(Можно, конечно руками сделать).
    2) В принципе вполне корректно. Для безопасности, конечно, здорово, если ещё хранится не чистый идентификатор сессии, а каким-нибудь образом зашифрованный идентификатор(а расшифровать можно лишь у вас на сервере, так как только вы знаете ключ).
    Ответ написан
    Комментировать
  • Где ошибка в коде?

    DeLaVega
    @DeLaVega
    Верстаю, фронтэндю =)
    Простите, а чего вы ожидали? У вас value у textarea - строка(12 31 23 123). И эта строка не имеет ничего общего с понятием - массив.

    А вот так работает =)
    codepen.io/vitaliy_kirenkov/pen/EjgQmw
    Ответ написан
    9 комментариев
  • Как бороться с тем, что клиент не узнает о смене состояния сервера из-за таймаута?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Ещё как вариант рассмотрите возможность асинхронного выполнения операций на сервере. Нужно организовать два-три метода в API. Первый метод запускает процесс изменения состояния (с валидацией текущего состояния и возможности его изменения) и не требует обязательного возврата результата. Второй метод (не обязательный) возвращает прогресс изменения состояния сервера. Третий - возвращает результат - текущее состояние сервера. В этом случае даже если на один из запросов не придёт ответа, клиент может запрос повторить.
    Ответ написан
    Комментировать
  • Какую логику поиска и сравнения использовать при авто-дополнении и как оптимизировать БД?

    AMar4enko
    @AMar4enko
    Наиболее оптимально использовать специальный инструмент, типа Sphinx или ElasticSearch
    Ответ написан
    Комментировать
  • Как добавить уже сгенерированный sitemap.xml?

    sim3x
    @sim3x
    nginx
    location = /sitemap.xml {
    root /path/to/xml
    }
    Ответ написан
    Комментировать
  • Какой пакет выбрать для вставки текста в картинку(jpg) на golang?

    artem_kovardin
    @artem_kovardin
    Можете глянуть сюда: перевод "Работа с изображениями"
    Ответ написан
    Комментировать
  • Почему django rest framework отвечает 401?

    @marazmiki
    Укротитель питонов
    Всё идёт ровно так, как и должно идти, и нет тут ни магии, ни волшебства (ну, разве чуть-чуть: в идеале нигде не должно работать, даже на убунте). И вот почему.

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

    При каждом запросе сервер проверяет, передан ли от клиента тем или иным способом —а чаще всего это кука — ID сессии. Если передан, то сервер "опознаёт" пользователя. Если нет, то нет :-) Кука добавляется к запросу самим браузером, без явного участия пользователя, поэтому для нас, людишек, всё выглядит как будто само собой.

    Теперь про REST. Обычно API пишется чаще всего не для браузеров, а для сторонних серверов, в которых и кук-то зачастую не бывает. И такого понятия, как сессия, просто нет! Каждый запрос приходит как будто он от нового пользователя. Здесь идентифицироваться приходится ручками.

    Самый простой, но вместе с тем и самый глупый вариант — вместе с каждым запросом посылать логин и пароль. Другой не самый умный, но почему-то часто встречающийся вариант — захардкоженный секретный параметр: типа если в запросе есть переменная abcdef=123, то запрос считается достоверным.

    Логическое продолжение этого способа — та самая аутентификация через токены, которую Вы то включаете, то выключаете. Пользователь шлёт логин и пароль на отдельный URL, в ответ получает токен, который затем должен добавлять вручную к каждому запросу. Что-то напоминает, верно? :-)

    В случае с либеральным DRF можно наплевать на рекомендуемый принцип stateless — не сохранять информацию о состоянии клиента — и добавить поддержку сессий: т.е. сделать так, что если в запросе передаётся кука (а любой браузерный запрос, даже через XHR их вроде бы добавляет), то сервер должен определять пользователя.

    Включается это довольно просто: нужно использовать
    rest_framework.authentication.SessionAuthentication в качестве аутентификатора. Лучше всего сделать глобальную настройку (в документации всё есть), либо указать этот класс для отдельного endpoint.
    Ответ написан
  • Как загружать фотографии на стену в vk.com через golang?

    @alehano
    Вот моя функция. Я передаю io.Reader вместо файла, но по сути, такая же у вас.
    func postImg(url string, img io.Reader) (server int, photo, hash string, err error) {
    	type UploadResponse struct {
    		Server int    `json:"server"`
    		Photo  string `json:"photo"`
    		Hash   string `json:"hash"`
    	}
    
    	var b bytes.Buffer
    	w := multipart.NewWriter(&b)
    	fw, err := w.CreateFormFile("photo", "photo.jpg")
    	if err != nil {
    		return
    	}
    	if _, err = io.Copy(fw, img); err != nil {
    		return
    	}
    	w.Close()
    
    	req, err := http.NewRequest("POST", url, &b)
    	if err != nil {
    		return
    	}
    	req.Header.Set("Content-Type", w.FormDataContentType())
    
    	// Submit the request
    	client := &http.Client{}
    	res, err := client.Do(req)
    	if err != nil {
    		return
    	}
    
    	// resp
    	uplRes := UploadResponse{}
    	dec := json.NewDecoder(res.Body)
    	err = dec.Decode(&uplRes)
    	if err != nil {
    		return
    	}
    	defer res.Body.Close()
    
    	server = uplRes.Server
    	photo = uplRes.Photo
    	hash = uplRes.Hash
    	return
    }
    Ответ написан
    Комментировать
  • Как быстро вставить много строк в PostgreSQL?

    Если только "вставить и хранить" - я бы подумал, нахрена хранить в БД, если в "нужный момент" можно взять из файла, или откуда-нибудь ещё.

    Вообще, традиционно проблема быстрой вставки решается в три приёма - снятие индекса, вставка, наложение индекса. В Postgre, если я помню верно, третий шаг бьётся ещё на два: добавление собственно индекса и наложение на него constraint. Такой путь чем-то не подходит?

    Дополнительно, можно хорошо ускорить процесс, если вставлять по нескольку строк за раз, вроде
    INSERT INTO table (field1, field2, field3) VALUES (value1, value2, value3), (value4, value5, value6), (value7, value8, value9)
    Ответ написан
    4 комментария
  • Как проверить наличие нескольких элементов в json?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    В цикле пробегаетесь по "employee" и проверяете, что все firstName находятся в списке ['Tom', 'Maria', 'James']. Как то так:
    firstNames = ["Tom", "Maria", "James"]
    for e in emploee:
        if e["firstname"] not in firstNames:
            print(e["firstname"], " - лишний!")
    Ответ написан
    Комментировать
  • Какую библиотеку взять для вывода статистики?

    @iShatokhin
    JS developer
    Ответ написан
    Комментировать
  • Как называется строка выделенная grave accent(`) в golang?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Теги Tag по крайней мере специфицированы. Кроме использования посредством reflect еще стоит посмотреть свойство Type identity Вот пример этого свойства https://play.golang.org/p/dzng_FsbmA
    Ответ написан
    Комментировать
  • Как называется строка выделенная grave accent(`) в golang?

    artem_kovardin
    @artem_kovardin
    Это теги. Вот тут про них есть немного golang.org/pkg/reflect/#StructTag
    Ответ написан
    Комментировать