Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Как правильно деплоить проект?

#golang #docker #развертывание #bitbucket


Здравствуйте, есть restful сервис написанный на golang.
Раньше работал на локальном хосте, сейчас же появилась потребность деплоить все на
сервер.
Не могу понять как лучше осуществить деплой.
Создал репозиторий на бакете, а от дальше туплю.
Каждое изменение(А их будет много) копировать, билдить, потом закрывать процесс с
активным приложением go и запускать новый. Так как изменения будут очень частые и очень
интересует как можно автоматизировать этот процесс.
    


Ответы

Ответ 1



Есть такой подход, под названием Continuous Delivery (Непрерывное развертывание), который предлагает решение описанной вами проблемы. Что это за зверь и с чем его едят, описано в книге Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation / Непрерывное развертывание ПО. Автоматизация процессов сборки, тестирования и внедрения новых версий программ Небольшая выжимка о CD (цитата отсюда): Основная идея CD в том, чтобы построить конвейер (Deployment Pipeline), позволяющий каждому изменению в системе контроля версий попасть в боевое окружения стандартным и полностью автоматизированным способом. Приблизительно это может выглядеть следующим образом: Изменения вносятся в систему контроля версий (СКВ). Запускается система непрерывной интеграции (Continuous Integration, CI), собирается билд (если это компилируемый язык), прогоняются все необходимые тесты. В случае успешности предыдущего шага, билд выкатывается на окружение тестирования (QA). После успешного тестирования билд выкатывается на stage окружение (pre-production), которое максимально приближено к боевому окружению. Если все прошло хорошо, то билд попадает в боевое окружение. Тут встает в полный рост вопрос, как сделать так, чтобы все окружения, начиная с окружения разработчиков, максимально соответствовали друг другу. Для этого существуют инструменты управления конфигурацией (Configuration management system). Самое главное, что конфигурация окружений — это такой же код, и к нему точно также применимы все вышеперечисленные подходы: хранение в СКВ, CI, тестирование. Так вот, если этот процесс отлажен, все изменения проходят по нему, и, потенциально, каждое изменение может быть выкачено в продакшен, то это и называется процессом непрерывной поставки ПО.

Ответ 2



Вам в любом случае нужны решения для CI (Continuous Integration) и CD (Continuous Deployment). Вот список, из которого вы можете выбрать(ссылка). Например, как это работает с Drone: Через веб морду Drone, вы настраиваете Drone для получения проекта с репозитория Git и выполнение "запуска". Что конкретно происходит при запуске описано в следующем шаге. Вместе с кодом приложения в репозитории должен лежать .drone.yml файл, который говорит Drone как устанавливать и запускать ваше приложение. Далее вы делаете git push в ваш репозиторий, Drone проверяет репозиторий на недавно залитый Docker образ (по вашему выбору), а затем стартует его. На основе вашей конфигурации результатом успешного запуска может быть уведомление («Сборка выполнена успешно!»), создание бинарной версии или даже развертывание. Наконец, Drone удаляет Docker контейнер и переустанавливает его так, чтобы он был в исходном и известном состоянии для следующей сборки. P.S. по связке Drone + Docker есть неплохая статья на Хабре.

onerror event xhr js

#javascript #jquery


Доброе утро. Что должно произойти, чтобы сработал onerror xhr? Сервер иногда возвращает
json данные с кодом 500, и согласно логике в этом случае должно произойти onerror,
но происходит onload.

var requestError = function () {
    console.log("error", this);
};
    var xhr = new XMLHttpRequest();
    xhr.open("POST", 'https://core.lotus-app.ru/1/' + method, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.responseType = "json";
    xhr.onload = success;
    xhr.onerror = requestError;
    xhr.timeout = timeout;
    xhr.vars = vars;
    xhr.send(paramToURL(params));



    


Ответы

Ответ 1



согласно логике в этом случае должно произойти onerror Нет, не должно. onerror срабатывает при возникновении ошибок сетевого уровня. Т.е. если запрос вообще не вернулся или отклонен согласно кроссдоменным ограничениям. Если http запрос вообще вернулся, даже и с кодом ошибки, то onerror не сработает. Надо использовать onreadystatechange и проверять там код завершения запроса. Еще лучше сразу взять какую-то обертку для работы с сетью на уровне которой эта тонкость, а также множество тонкостей с которыми Вы еще не столкнулись, разрешены за вас. Будь то fetch-polyfill, axios или даже $.ajax в случае если у вас jQuery все равное есть.

среда, 4 марта 2020 г.

Обязательно ли делать ORDER BY для упорядоченных данных [дубликат]

#mysql #sql


        
             
                
                    
                        
                            На этот вопрос уже дан ответ здесь:
                            
                        
                    
                
                        
                            Упорядочивание записей в таблице данных
                                
                                    (1 ответ)
                                
                        
                                Закрыт 2 года назад.
            
                    
К примеру есть таблица users с одним столбцом id

id |
----
1
2
3
4


Я делаю элементарный SELECT

SELECT id FROM users


и получаю данные 1, 2, 3, 4 в том порядке в котором они пронумерованы.  

Собственно вопрос: всегда ли MySQL гарантирует что данные будут получены именно в
том порядке в котором они пронумерованы? Т. е. возможен ли случай когда например результат
будет такой: 1, 3, 2, 4?
Или все же лучше использовать явную сортировку?

SELECT id FROM users ORDER BY id
    


Ответы

Ответ 1



Если вам необходимо получить упорядоченный набор, всегда используйте сортировку. Например, если вставлять строки не по порядку, например так: id | ---- 1 4 2 3 то без сортировки вы их в таком виде и получите. Часто вы будите получать в результате запроса строки в порядке вставки, но даже этого СУБД вам не гарантирует. По этому, всегда когда вам нужен упорядоченный набор данных, указывайте сортировку явно.

Оценить время выполнения программы и вывести в реальном времени процент исполнения программы

#python


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

import os


def scan_dir(path):
    print('[',path,']')

    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isfile(file_path):
            print('\t', file)
        else:
            scan_dir(file_path)

if __name__ == '__main__':
    scan_dir('C:\djangoProjects')

    


Ответы

Ответ 1



Всё просто: разбирить процесс на 2 стадии: Посчитать всё количество файлов в каталоге, который обходите — типа оценка времени. Собственно в цикле где работаете с файлами производить отчет, какой % обработан и сколько осталось — и согласно этому изменяете свой прогресс-бар. Но если вы прям хотите время выводить (приблизительное само собой, которое также может меняться): тоже нужно провести какую-то оценку. Нужно знать общий объем файлов, которые будут участвовать в обходу. И как как размер файлов разный можно, например, посчитать сколько времени уходит на обработку 5% файлов и на основе этого расчитать приблизительное оставшиеся время на обработку.

Ответ 2



Не зная заранее ни количество файлов ни сколько обработка выбранного файла может занять, вы не сможете узнать на ходу сколько осталось времени до конца выполнения программы. Часто хорошим предсказателем времени выполнения является время выполнения прошлого запуска. При первом запуске можно показывать просто абсолютные числа (количество просмотренных директорий, файлов, среднее время на файл). При последующих запусках, можно дополнить сравнением с прошлым, что может позволить оценить "сколько ещё ждать". К примеру, для задачи резервного копирования, если в прошлом запуске было обработано 1000 файлов, в среднем по минуте на каждый, а в текущем запуске вы на 900-ом файле, то можно написать, что оценочно ~90% сделано, осталось ~100 минут. Конечно, оценки будут ошибочными, если у вас вдруг стало 10000 файлов вместо 1000 на прошлом запуске. Если есть желание, то и при первом запуске можно оценить время выполнения. Если время обработки одного файла заметное и уже по одному количеству файлов ясно время выполнения, то можно вхолостую обойти всё дерево директорий как @Alexander Bragin предложил. Это не должно удваивать время на обход, так как OS кэширует информацию о файловой системе обычно (диск на порядки медленнее оперативной памяти как правило). Всё зависит от фактической задачи, какие предположения, которые могут помочь в оценке времени выполнения, являются верными в вашем конкретном случае.

Как добавить текст в SVG?

#css #svg


Есть SVG демка https://codepen.io/anon/pen/gxMJOJ

Все блоки, как положено разделены на группы , но текст описания, размещенный в
  не отображается:


  Заголовок 10
  Текст 10
    



И ещё не нашёл информации как выравнивать текст внутри SVG-блока?
    


Ответы

Ответ 1



Теги ... можно добавлять в любое место svg кода. Это своего рода поясняющий текст, в котором можно разместить, что угодно, от комментарий до ссылок и всё это не будет видно пользователю на дисплее, но поисковики, особенно Google хорошо индексируют содержание в этих тегах. Теги ... выступают в роли тултипа. Наведите курсор на блок и должен появиться текст, который размещен в этих тегах. Тоже индексируется. Текст добавляется в svg c помощью тегов .... Внутри файла SVG позиционирование текста абсолютно при этом указывается координаты X, Y начала текста. Ваш пример я прогнал через SVG оптимизатор для уменьшения кода и лучшего понимания. Заголовок 10 Текст 10 Заголовок 10 Текст 10 Текст 10 Текст 10 Текст 10 Текст 10 Текст 10 Заголовок 11 Текст 11 Заголовок 11 Текст 11 Текст 11 Текст 11 Текст 11 Заголовок 12 Текст 12 Заголовок 12 Текст 12 Текст 12 Текст 12 Текст 12 В svg нет автоматического переноса текста, как в Html поэтому приходится применять относительное позиционирование с помощью тегов .. , которые имеют атрибуты dxи dy относительного смещения текста по координатам. Текст 10 Текст 10 Текст 10 Текст 10 Текст 10 Текст 10 Позиционирование текста с помощью атрибута text-anchor Start middle End

Как убрать во фрейме скролл, но заставить контент прокручиваться

#html


Вот такой код не прокручивает содержимое:







    


Ответы

Ответ 1



В вебките можете удалить его с помощью css: ::-webkit-scrollbar { width:0; }

Как ограничить зону видимости глобальной переменной в многофайловой программе

#c


Нужно, что бы var не был виден в main, но виделся и использовался в других файлах.

Когда было сделано как ниже - работало.

MAIN.c
#include Header.h
foo1();

Header.h
void foo1(void);
void foo2(void);
void foo3(void);

Variables.h
static int var;

Source.c
#include Header.h
#include Variables.h
foo1(){var++;}
foo2(){var++;}
foo3(){var++;}


После изменения как ниже - перестало, при каждом вызове функции var == 0, а вне не
определен.

MAIN.c
#include Header.h
foo1();

Header.h
void foo1(void);
void foo2(void);
void foo3(void);

Variables.h
static int var;

Source1.c
#include Header.h
#include Variables.h
foo1(){var++;}

Source2.c
#include Header.h
#include Variables.h
foo2(){var++;}

Source3.c
#include Header.h
#include Variables.h
foo3(){var++;}

    


Ответы

Ответ 1



А какой смысл в вашем пожелании? Вы хотите использовать в main() свою переменную с именем var или что? Просто смысл глобальной переменной именно в этом - быть видимой везде, во всех файлах. Так что поясните, что именно вы хотите, а то пока что требования у вас противоречивые... Может, можно было бы использовать статическую переменную в функции - например, Variables.h int* getVar(); Variables.c int* getVar() { static int var; return &var; } SourceN.c #include "Header.h" #include "Variables.h" void fooN(){ (*getVar())++; } Но чтобы понять, подходит ли вам это решение - нужно понимать, что вы хотите. Глобальные переменные вообще лучше не использовать... И еще - по первому варианту у вас в main() своя переменная var, в Source - своя. Как и во втором - в каждом файле - своя переменная. Это - не глобальная переменная, она просто видна везде на уровне файла, но в каждом файле она своя.