Сообщения den73
Как культурно организовать в продакшене работу системы на VPS/Golang/Postgresql?
Упражнение по голангу почти доделано, настала пора деплоя. На моём хостинге VPS сервер с debian 9.
Мне нужно, чтобы моя программа работала как служба и писала свой лог, и чтобы она самовосстанавливалась после падения.
Я нашёл https://habr.com/ru/post/129207/, его там разругали за велосипедостроение, он огрызался, что системы бывают разные и не по всякой улице нужный автобус ходит.
Вот эта тема Как управлять демонами в убунту? подтверждает наличие культурных проблем при переходе между дистрибутивами линукса.
Соответственно, вот такой вопрос: как всё это настраивается (где взять образец для подражания или какой ман почитать).
Уже посоветовали man daemon и man service. Дальше что?
regex для букв (golang)
Искал и не нашёл регэксп, к-рый матчит буквы (в т.ч. неанглийские) и пробелы, но не что-то остальное. SO думает вот это, https://stackoverflow.com/questions/3009993/regex-what-would-be-regex-for-mat... , но там прямого и готового ответа нет. Правильно ли так?
^[a-zA-Z\p{L} ]+$
Соответственно, вот код на голанге:
package main
import (
"fmt"
"regexp"
)
func main() {
regex := `^[a-zA-Z\p{L} ]+$`
fmt.Println(regex)
matched, err := regexp.Match(regex, []byte(`ЯРeéèêë世界`))
fmt.Println(matched, err)
}
<×
golang - является ли os.Exit потокобезопасной?
На стековерфлоу мой вопрос заминусовали, дебилы. Что скажет ЛОР?
микросервисная архитектура - ура!
Читаю статью в Википедии про микросервисную архитектуру. Рад за пацанов: во-первых, теперь на ту же задачу можно потратить x1000 вычислительных мощностей. Даёшь докер-контейнеры на AWS инстансах! Во-вторых, поскольку главного в системе нет, то понять, что происходит и почему ничего не работает, становится крайне нетривиальной задачей. Т.е. огромная наукоёмкость, усложнение самих микросервисов (они ведь должны подробно отчитываться о своём состоянии, иначе невозможно сделать мониторинг и понять, работает ли система или нет). Я уж не говорю о том, что всё это разворачивается в ЦОДах, соответственно, понятно, кому выгодно: Амазону и прочим поставщикам облачных услуг. А наживку бизнесу подкинули в виде «независимости команд, занимающихся разными частями», типа разделяй и властвуй. Прямо настроение улучшилось, какой грубый развод и как хорошо прокатывает. Особенно порадовало «исключение по возможности унаследованного кода».
Но мне нужно найти работу. И я обнаружил, что в моём приложении аж целых две базы данных образовались совершенно естественным путём. Одна - это база безопасности пользователей (хранит, например, пароли). Вторая - это база контента - я хочу иметь на сайте кнопочку «скачать базу». Именно её и буду раздавать.
Соответственно, неужели я имею шанс применить микросервисы, так, чтобы показывать работодателям? Подскажите, правильно ли я понял всю эту тему, и куда копать за примерами? Использую postgresql и голанг.
почему голанг - это кул
Голенгу никогда не догнать сишечку, потому что в нём нельзя циклические зависимости. В Си можно, в Паскале можно. Это, наверное, самая плохая новость для меня за всё время его изучения.
Какой выдумать или создать формат для конфигов?
Хочу для своего упражнения использовать yaml. Вроде голанг его умеет читать и писать. Что говорит на эту тему духовенство? Уместен ли такой формат или же лучше взять что-то другое?
json не хочу по той причине, что в него нельзя вставлять комментарии, xml слишком многословен.
==========================================
Решение: взят обычный json, который читает - пишет структуру. Для комментария в структуре предусмотрено специальное поле Comment. Это не так удобно, зато гомоиконно.
Если в конфиге задано поле, отсутствующее в структуре, например, если название поля написано с опечаткой, то будет ошибка чтения конфига. Это важно, поскольку толерантность многих программ к опечаткам в конфигах приводит к тому, что можно часами сидеть и искать ответ на вопрос «ну почему же это дерьмо не работает»?
Код такой:
package main
import (
"strings"; "fmt"; "os"
"encoding/json"
"io/ioutil"
// "github.com/flynn/json5"
)
type SecretConfigDataStruct struct {
Comment string
RecieverEMail string
SMTPServer string
SMTPUser string
SMTPPassword string
SenderEMail string }
var SecretConfigData SecretConfigDataStruct
func (sds *SecretConfigDataStruct) SaveToFile(filename string) (err error) {
var text []byte
text, err = json.MarshalIndent(sds,""," ")
if err != nil { return }
err = ioutil.WriteFile(filename, text, 0600)
return }
const ConfigFileName = "secret-data.config.json"
// for development
func saveSecretConfigDataExample() {
sds := SecretConfigDataStruct{
Comment: "Example config file. Copy this one to the secret-data.config.json and edit",
SenderEMail: "den@example.net",
RecieverEMail: "world@example.net",
SMTPServer: "smtp.example.net",
SMTPUser: "Кирилл",
SMTPPassword: "bla-bla-bla"}
err := sds.SaveToFile(ConfigFileName + ".example")
if err != nil { panic(err) }}
func loadSecretConfigData() (err error) {
sds := &SecretConfigData
fn := ConfigFileName
if _, err = os.Stat(fn); os.IsNotExist(err) {
fmt.Printf("No config file %s found. Create one by copying from %s.example\n",
fn, fn)
return }
var bytes []byte
bytes, err = ioutil.ReadFile(fn)
if err != nil {
fmt.Printf("Unable to read config %s\n", fn)
return }
dec := json.NewDecoder(strings.NewReader(string(bytes)))
dec.DisallowUnknownFields()
err = dec.Decode(sds)
if err != nil {
fmt.Printf("Error reading config file %s: %#v\n", fn, err)
return }
fmt.Printf("playWithSecretConfigData returned %#v\n", sds)
return }
нашёл сервис для поиска поддерживаемых форков на github
Заходишь туда, забиваешь имя репозитория, например, mleibman/SlickGrid и тебе показывают табличку, в которой достаточно ясно, какие форки поддерживаются. До этого сервиса я смотрел сеть форков, её нужно было отлистать направо (для этого, правда, есть горячая клавиша) и далее по виду сети как-то угадывать, тыкаться в каждый и т.п.
А можно сразу задать репозиторий в URL, только github.com заменить на forked.yannick.io
golang - не хочу возвращать err, хочу паниковать!
Какая-то секта с этими err. Код распухает в несколько раз. Идея с defer выглядит довольно здравой - я в своё время делал такой defer для 1C и для Delphi. Но паника лучше, чем возврат err-ов. Таковой возврат ничего не упрощает. Когда выпадает исключение, сразу виден весь стек. Сгенерированный err не показывает места своего возникновения, т.е. с помощью брекпойнтов нужно много итераций, чтобы локализовать ошибку. А на fatalpanic есть чуть ли не встроенный брекпойнт, во всяком случае, у меня на fatalpanic отладка сама по себе останавливается.
Кроме того, разбор err после каждого вызова офигенно многословен, код распухает буквально в разы.
Я собираюсь попробовать в своих упражнениях максимально использовать панику. Труъ голангисты, разубедите!
неуникальный пользователь - как обработать нарушение уникальности ключа
Хочу запилить для упражнения систему личного кабинета на go+postgresql. Нормальной пока не нашёл, посему велосипед.
Вопрос такой. При попытке регистрации с дублирующимся именем пользователя E-mail я буду пытаться сделать insert в базу. При наличии дубликата возникнет исключение. Я хочу сделать следующее: написать хранимку, которая перехватывает такое исключение, определяет ключ и таблицу, в которых оно случилось, и уже на уровне хранимки генерирует тот текст, который будет показан конечному пользователю.
Я считаю, что это самый правильный подход, поскольку эта информация в структурном виде доступна именно в хранимых процедурах. Я не изучал, поставляют ли драйвера эту инфу на уровень приложения, но весьма вероятно, что они либо не поставляют, либо поставляют не всю, либо ещё какая бяка.
Но я знаю, что есть идеология «база данных - это только хранилище данных, никаких триггеров быть не должно». Насчёт хранимок я жёсткого запрета не слышал, но в случае ORM оно как бы по построению так получается.
Соответственно, прошу либо подтвердить, что я делаю правильно, либо привести аргументы против. Пока я вижу такой аргумент, что при условии шардинга никакого нарушения ключа может и не быть, и в этом случае нужно как-то руками делать транзакцию, в которой проверять уникальность ключа в рамках всех БД.
Но пока этот момент не наступил, зачем о нём думать?
==================================================
Решение: выяснилось, что sqlx предоставляет достаточно инфы (имя таблицы, имя констрейнта) в ошибке, а при конфликте между транзакациями ошибка тоже указывает на нарушенное ограничение уникального ключа. Так что нет нужды делать хранимки (пока что). Вопрос про шардинг не решён, но его мы и не пытались решить.
питонизируем си, js и иже с ними
Когда я изобретал «Яр», я думал про синтаксис. С одной стороны, всем хорош Питон: в нём минимум лишнего. С другой, достаточно случайно задеть пробел и строчка кода втянется внутрь цикла или ветвления. Т.е. надёжность такого синтаксиса плохая. Как же скрестить коня и трепетную лань? А очень просто - нужно всего лишь поменять стиль отступов в Си-образных языках, и получится вот что:
function showTableStructure() {
if (name.length == 0) {
alert("Please select a table!");
return; }
getTableStructure(name, { type: getCurrentObject().type },
function(data) {
buildTable(data);
$("#results").addClass("no-crop");});}
Налицо питонячья компактность и при этом сишная надёжность. Но стало опять похоже на лисп...
golang - где брать инфраструктуру
Хочу запилить «рабочие заметки» и прочую хрень для учебных целей на голанге. Нужны блоки регистрации по E-mail, контроля доступа, администрирование пользователей, сессий, и всё это должно быть уже в готовом виде. Не писать же это с нуля в XXI веке? Вопрос - где это берут? Я посмотрел пару туториалов, но они на то и туториалы, они показывают как делать, но делать надо самому.
Я пока нашёл вот что:
https://github.com/qor/qor - как я понял, они переписали с Руби. Про Руби я один раз читал, что там хронически не дружат со словом «качество», и что это вообще «фейк-технология» и от неё надо держаться на безопасном расстоянии. Что посоветуете, стоит ли связываться?
https://github.com/dionyself/golang-cms - проект одного человека, вдохновлённого примером Django. Во многом недопилен и пре-альфа.
http://www.gorillatoolkit.org - страшное название, страшный сайт, страшная картинка. Хотя по сути мне сказать нечего.
Что посоветуете?
ищется учебный компилятор/линкер
Ищется компилятор и линкер простого языка в машинный код для учебных целей. Сейчас копаюсь с Обероном КП (тж известен, как blackboxcomponentbuilder), но он написан, по моим понятиям, достаточно плохо - оптимизирован под однопроходность и ещё есть ряд проблем. Из его плюсов - в нём есть горячая замена модулей и динамическая загрузка, компилятор и компоновщик встроены прямо в рантайм, достаточно мощная интроспекция, наличие безопасных и опасных примитивов, сборка мусора, загрузка библиотек, написанных на иных языках, отладчик.
Я думаю, что скорее всего аналогов у него нет и искать безполезно, но вдруг что-то подобное всё же есть.
символ может быть функцией, переменной, классом. Как называется эта классификация?
В BlackBoxComponentBuilder это написано так (почти все комментарии - мои)
(* object modes *)
(** Скорее всего, это надо понимать как
"класс данного именованного идентификатора" в тексте,
или "класс сущности, обозначаемой идентификатором"
Назовём «части речи» или «чр» "чр" ПОНЯТИЕ(чр) *)
Var(*чр параметр по значению*) = 1 (* Параметр без ключевого слово. Дальше неясно: Переменная? *);
VarPar(*чр параметр по ссылке*) = 2 (* Var, In, Out параметр *);
Con = 3 (* ? Объявление константы или имя объявленной константы *);
Fld = 4 (* ? Поле записи *);
Typ = 5 (* Определение типа *);
LProc = 6 (* Определение процедуры (не метода) *);
XProc = 7 (* ? Экспортируемая процедура *);
SProc = 8 (* Системная процедура, созданная с помощью НяФс.EnterProc *);
CProc = 9 (* Процедура, заданная в машинном коде, см. НяМ.CProcFlag *);
IProc = 10 (* Обработчики прерываний *);
Mod(*чр модуль*) = 11 (* Модуль *);
(* Head = 12; - не используется в этом файле *)
TProc(*чр метод*) = 13 (* Метод? *);
Attr(*чр атрибут*) = 20 (* Атрибут, например, ABSTRACT, LIMITED, EMPTY, EXTENSIBLE *);
Не класс, не тип, не часть речи, не член предложение. Есть ли какое-то официальное название?
как называются неявные действия, создаваемые при присваивании строк в языках высокого уровня?
В С++ можно определять оператор = для своих типов.
В Паскале его определить нельзя, но компилятор для некоторых типов сам вставляет в каждое присваивание какой-то дополнительный ad hoc кусок кода.
Например, в Delphi при присваивании интерфейсов вставляется код увеличения счётчика ссылок.
Как правильно и обобщённо назвать этот код, независимо от конкретного типа? У меня только маршалинг всплывает в памяти, но это явно не оно.
Ещё варианты - «обработка присваивания», «особая обработка присваивания», но всё это как-то недостаточно выразительно. Ваши варианты.
где остальные 93 миллиона проектов github в google big query?
Играю в данные github в google big query, и запрос
SELECT count (distinct repo_name) FROM [bigquery-public-data:github_repos.commits]
Заявляется вот тут https://github.com/about , что сейчас на github 96 миллионов репов. Допустим, сколько-то закрытых. Но явно не 93 закрытых.
Можно как-то за разумные деньги получить запрос к коммитам? Я ищу коммиты на русском языке. Я пробовал API, сейчас не помню, но вроде там получалось, что надо выкачивать весь репозиторий, чтобы найти такие коммиты. Я правильно понимаю, что статьи типа этой врут в заголовке?
Выборка здесь: https://gitlab.com/budden/repozitorii-xegithub-xrs-russkimi-kommitami
защищает ли эльбрус от heartbleed?
Я смутно понял, что там какая-то аппаратная защита от чтения за пределами массива. Не очень понимаю, как это соотносится с семантикой Си, поэтому просто спрашиваю.
Описание ошибки - здесь: https://www.theregister.co.uk/2014/04/09/heartbleed_explained/
была ли astra linux подвержена heartbleed?
Попытался погуглить, слёту не нашёл. Если можно, пруфлинк.
яролит взад
Про Яролит хорошая тема получилась (и даже очень полезная, а такое не всегда получается). Теперь - внимание! Я придумал обратный транслит. Он служит для кодирования латиницы кириллицей:
a b c d e f g h i j k l m n o p q r s t u v w x y z
а б ц д е ф г ш и й к л м н о п ь р с т у в ю х ы з
линух.орг.ру
йошн леннон
гит цлоне шттпс://гитшуб.цом/алтоцмс
гит цшекоут -ф девелоп
мосцою
спутник
новицшок
ыандех тахи
Для устранения неоднозначности в чатах можно в неочевидных слуаях писать:
Вставим ,енглисш ,аббревиатион ,ОС в русское предложение
Самое смешное, что на работе мы его уже используем в чате. Т.е. по сути уже есть одно внедрение. Правда, я пока не знаю, что думает про нас третий русскоязычный пользователь :)
Экономия на двух переключениях вполне ощутима, всё понятно, информацию можно передать точно и иногда можно поржать над тем, что получается (вплоть до упадения под стол), что делает работу веселее. Правда, мой коллега предлагает другой вариант:
h x
Х Ш
Новая версия Яролита (форк ГОСТ 16876-71, табл 2)
Выпущена новая версия яролита. Она почти равна русскому подмножеству ГОСТ 16876-71 (ISO/R 9:1968) (так случайно получилось).
V chashhakh juga zhil by citrus? Da, no falqshivyjj ehkzempljar!
Отличия от ГОСТ:
ь = q (перевернули мягкий знак)
ъ = jq (твёрдый знак разрезали и перевернули)
† = j8224j // любой юникод тоже представим
// Переключение языка с помощью последовательности
Ajj da xesukin xrsyn
// Добавлены дореформенные буквы (но их выкину в пользу братских и "небратских")
Дальше изучаем тему. Буду складывать сюда всё, что найду:
http://meganorm.ru/Data2/1/4294835/4294835719.pdf - ГОСТ (ныне упразднён)
https://www.iso.org/standard/3587.html - история
https://www.ub2000.de/ru/kachestvo-perevodov/zaverennye-perevody-soglasno-sta... - пример использования (некоторые организации в германии требуют перевод по этому стандарту)
http://userscripts-mirror.org/scripts/review/89883 - кодировщик на JS для 1968 - неправильный, т.к. в нём й = j, а должно быть jj.
| ← назад | следующие → |