LINUX.ORG.RU

Сообщения den73

 

можно поругать мою поделку - регистрация, аутентификация, сессии

Форум — Development

 , , ,

den73
()

Как культурно организовать в продакшене работу системы на VPS/Golang/Postgresql?

Форум — Development

Упражнение по голангу почти доделано, настала пора деплоя. На моём хостинге VPS сервер с debian 9.

Мне нужно, чтобы моя программа работала как служба и писала свой лог, и чтобы она самовосстанавливалась после падения.

Я нашёл https://habr.com/ru/post/129207/, его там разругали за велосипедостроение, он огрызался, что системы бывают разные и не по всякой улице нужный автобус ходит.

Вот эта тема Как управлять демонами в убунту? подтверждает наличие культурных проблем при переходе между дистрибутивами линукса.

Соответственно, вот такой вопрос: как всё это настраивается (где взять образец для подражания или какой ман почитать).

Уже посоветовали man daemon и man service. Дальше что?

 ,

den73
()

regex для букв (golang)

Форум — Development

Искал и не нашёл регэксп, к-рый матчит буквы (в т.ч. неанглийские) и пробелы, но не что-то остальное. 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)

}
Проверено, что
Не матчатся.

 ,

den73
()

golang - является ли os.Exit потокобезопасной?

Форум — Development

На стековерфлоу мой вопрос заминусовали, дебилы. Что скажет ЛОР?

 ,

den73
()

микросервисная архитектура - ура!

Форум — Development

Читаю статью в Википедии про микросервисную архитектуру. Рад за пацанов: во-первых, теперь на ту же задачу можно потратить x1000 вычислительных мощностей. Даёшь докер-контейнеры на AWS инстансах! Во-вторых, поскольку главного в системе нет, то понять, что происходит и почему ничего не работает, становится крайне нетривиальной задачей. Т.е. огромная наукоёмкость, усложнение самих микросервисов (они ведь должны подробно отчитываться о своём состоянии, иначе невозможно сделать мониторинг и понять, работает ли система или нет). Я уж не говорю о том, что всё это разворачивается в ЦОДах, соответственно, понятно, кому выгодно: Амазону и прочим поставщикам облачных услуг. А наживку бизнесу подкинули в виде «независимости команд, занимающихся разными частями», типа разделяй и властвуй. Прямо настроение улучшилось, какой грубый развод и как хорошо прокатывает. Особенно порадовало «исключение по возможности унаследованного кода».

Но мне нужно найти работу. И я обнаружил, что в моём приложении аж целых две базы данных образовались совершенно естественным путём. Одна - это база безопасности пользователей (хранит, например, пароли). Вторая - это база контента - я хочу иметь на сайте кнопочку «скачать базу». Именно её и буду раздавать.

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

 ,

den73
()

почему голанг - это кул

Форум — Development

Голенгу никогда не догнать сишечку, потому что в нём нельзя циклические зависимости. В Си можно, в Паскале можно. Это, наверное, самая плохая новость для меня за всё время его изучения.

 

den73
()

Какой выдумать или создать формат для конфигов?

Форум — Development

Хочу для своего упражнения использовать 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 }

 , , ,

den73
()

нашёл сервис для поиска поддерживаемых форков на github

Форум — Development

http://forked.yannick.io

Заходишь туда, забиваешь имя репозитория, например, mleibman/SlickGrid и тебе показывают табличку, в которой достаточно ясно, какие форки поддерживаются. До этого сервиса я смотрел сеть форков, её нужно было отлистать направо (для этого, правда, есть горячая клавиша) и далее по виду сети как-то угадывать, тыкаться в каждый и т.п.

А можно сразу задать репозиторий в URL, только github.com заменить на forked.yannick.io

http://forked.yannick.io/mleibman/SlickGrid

 ,

den73
()

golang - не хочу возвращать err, хочу паниковать!

Форум — Development

Какая-то секта с этими err. Код распухает в несколько раз. Идея с defer выглядит довольно здравой - я в своё время делал такой defer для 1C и для Delphi. Но паника лучше, чем возврат err-ов. Таковой возврат ничего не упрощает. Когда выпадает исключение, сразу виден весь стек. Сгенерированный err не показывает места своего возникновения, т.е. с помощью брекпойнтов нужно много итераций, чтобы локализовать ошибку. А на fatalpanic есть чуть ли не встроенный брекпойнт, во всяком случае, у меня на fatalpanic отладка сама по себе останавливается.

Кроме того, разбор err после каждого вызова офигенно многословен, код распухает буквально в разы.

Я собираюсь попробовать в своих упражнениях максимально использовать панику. Труъ голангисты, разубедите!

 , , обработка ошибок

den73
()

неуникальный пользователь - как обработать нарушение уникальности ключа

Форум — Development

Хочу запилить для упражнения систему личного кабинета на go+postgresql. Нормальной пока не нашёл, посему велосипед.

Вопрос такой. При попытке регистрации с дублирующимся именем пользователя E-mail я буду пытаться сделать insert в базу. При наличии дубликата возникнет исключение. Я хочу сделать следующее: написать хранимку, которая перехватывает такое исключение, определяет ключ и таблицу, в которых оно случилось, и уже на уровне хранимки генерирует тот текст, который будет показан конечному пользователю.

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

Но я знаю, что есть идеология «база данных - это только хранилище данных, никаких триггеров быть не должно». Насчёт хранимок я жёсткого запрета не слышал, но в случае ORM оно как бы по построению так получается.

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

Но пока этот момент не наступил, зачем о нём думать?

==================================================

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

 , ,

den73
()

питонизируем си, js и иже с ними

Форум — Development

Когда я изобретал «Яр», я думал про синтаксис. С одной стороны, всем хорош Питон: в нём минимум лишнего. С другой, достаточно случайно задеть пробел и строчка кода втянется внутрь цикла или ветвления. Т.е. надёжность такого синтаксиса плохая. Как же скрестить коня и трепетную лань? А очень просто - нужно всего лишь поменять стиль отступов в Си-образных языках, и получится вот что:

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");});}

Налицо питонячья компактность и при этом сишная надёжность. Но стало опять похоже на лисп...

 , ,

den73
()

golang - где брать инфраструктуру

Форум — Development

Хочу запилить «рабочие заметки» и прочую хрень для учебных целей на голанге. Нужны блоки регистрации по E-mail, контроля доступа, администрирование пользователей, сессий, и всё это должно быть уже в готовом виде. Не писать же это с нуля в XXI веке? Вопрос - где это берут? Я посмотрел пару туториалов, но они на то и туториалы, они показывают как делать, но делать надо самому.

Я пока нашёл вот что:

https://github.com/qor/qor - как я понял, они переписали с Руби. Про Руби я один раз читал, что там хронически не дружат со словом «качество», и что это вообще «фейк-технология» и от неё надо держаться на безопасном расстоянии. Что посоветуете, стоит ли связываться?

https://github.com/dionyself/golang-cms - проект одного человека, вдохновлённого примером Django. Во многом недопилен и пре-альфа.

http://www.gorillatoolkit.org - страшное название, страшный сайт, страшная картинка. Хотя по сути мне сказать нечего.

Что посоветуете?

 ,

den73
()

ищется учебный компилятор/линкер

Форум — Development

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

Я думаю, что скорее всего аналогов у него нет и искать безполезно, но вдруг что-то подобное всё же есть.

 blackboxcomponentbuilder, , , ,

den73
()

символ может быть функцией, переменной, классом. Как называется эта классификация?

Форум — Development

В 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 *);

Не класс, не тип, не часть речи, не член предложение. Есть ли какое-то официальное название?

 , ,

den73
()

как называются неявные действия, создаваемые при присваивании строк в языках высокого уровня?

Форум — Development

В С++ можно определять оператор = для своих типов.

В Паскале его определить нельзя, но компилятор для некоторых типов сам вставляет в каждое присваивание какой-то дополнительный ad hoc кусок кода.

Например, в Delphi при присваивании интерфейсов вставляется код увеличения счётчика ссылок.

Как правильно и обобщённо назвать этот код, независимо от конкретного типа? У меня только маршалинг всплывает в памяти, но это явно не оно.

Ещё варианты - «обработка присваивания», «особая обработка присваивания», но всё это как-то недостаточно выразительно. Ваши варианты.

 перегрузка операций, ,

den73
()

где остальные 93 миллиона проектов github в google big query?

Форум — Talks

Играю в данные github в google big query, и запрос

SELECT count (distinct repo_name) FROM [bigquery-public-data:github_repos.commits]
вернул 3 миллиона. И среди них нет, например, sbcl/sbcl .

Заявляется вот тут https://github.com/about , что сейчас на github 96 миллионов репов. Допустим, сколько-то закрытых. Но явно не 93 закрытых.

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

Выборка здесь: https://gitlab.com/budden/repozitorii-xegithub-xrs-russkimi-kommitami

 github bigquery

den73
()

защищает ли эльбрус от heartbleed?

Форум — Security

Я смутно понял, что там какая-то аппаратная защита от чтения за пределами массива. Не очень понимаю, как это соотносится с семантикой Си, поэтому просто спрашиваю.

Описание ошибки - здесь: https://www.theregister.co.uk/2014/04/09/heartbleed_explained/

 ,

den73
()

была ли astra linux подвержена heartbleed?

Форум — Security

Попытался погуглить, слёту не нашёл. Если можно, пруфлинк.

 ,

den73
()

яролит взад

Форум — Talks

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

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
а б ц д е ф г ш и й к л м н о п ь р с т у в ю х ы з
Здесь по возможности пары подобраны так, чтобы совпадать с яролитом. Некоторые буквы кириллицы кодируются диграфами и для них это невозможно. Но если записать все констрейнты и решить их, то по сути выбора нет - задача решается однозначно. Например, в яролите й = jj. Очевидно, что в обратном яролите j = й. ш = sh, отсюда вытекает, что в обратном яролите h = ш. И т.п. Вот как надо писать:
линух.орг.ру
йошн леннон
гит цлоне шттпс://гитшуб.цом/алтоцмс
гит цшекоут -ф девелоп
мосцою
спутник
новицшок
ыандех тахи 

Для устранения неоднозначности в чатах можно в неочевидных слуаях писать:

Вставим ,енглисш ,аббревиатион ,ОС в русское предложение
ОС здесь неоднозначно, т.к. может быть ОС в русском и OS в английском, и даже значит одно и то же. Запятая перед словом является грамматической ошибкой, что позволяет использовать её для обозначения того, что следующее слово - английское, записанное транслитом.

Самое смешное, что на работе мы его уже используем в чате. Т.е. по сути уже есть одно внедрение. Правда, я пока не знаю, что думает про нас третий русскоязычный пользователь :)

Экономия на двух переключениях вполне ощутима, всё понятно, информацию можно передать точно и иногда можно поржать над тем, что получается (вплоть до упадения под стол), что делает работу веселее. Правда, мой коллега предлагает другой вариант:

h x 
Х Ш 
Интересно узнать ваше мнение - какой вариант лучше. Ну и присылайте свои смешные переводы.

 ,

den73
()

Новая версия Яролита (форк ГОСТ 16876-71, табл 2)

Форум — Talks

Выпущена новая версия яролита. Она почти равна русскому подмножеству ГОСТ 16876-71 (ISO/R 9:1968) (так случайно получилось).

V chashhakh juga zhil by citrus? Da, no falqshivyjj ehkzempljar!

Отличия от ГОСТ:

ь = q (перевернули мягкий знак)
ъ = jq (твёрдый знак разрезали и перевернули)
† = j8224j // любой юникод тоже представим
// Переключение языка с помощью последовательности
Ajj da xesukin xrsyn
// Добавлены дореформенные буквы (но их выкину в пользу братских и "небратских")
http://программирование-по-русски.рф/яролит.яргт/

Дальше изучаем тему. Буду складывать сюда всё, что найду:

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.

 , ,

den73
()

RSS подписка на новые темы