Pull to refresh
15
0
Сергей Соломеин @kilgur

АСУшник

Send message
Так никто и не утверждает, что лучше. Никто не агитирует за рипы с винила в flac. Иногда просто приятно вспомнить. Тут важен не контент, а воспоминания/эмоции, связанные с прослушиванием этого контента в прошлом. Я слушаю периодически Высоцкого — есть контент, очищенный от шума пластинок/пленок, а есть «рипнутый» как есть. Так вот второй мне иногда нравится больше, потому что вытаскивает воспоминания из детства… заметьте, я не «ною», не «вздыхаю» и не «онанирую» :)

Жаль. Совсем отвык от бумажных книг. А это какая-то юридическая особенность — у вас права на распространение именно печатной версии? Т.е. распространение электронной версии вам не разрешено или издательство считает этот вариант нерентабельным, к примеру?

В электронном виде не планируется?
Извините, Борис, но статья довольно старая и ее уже переводили, как минимум тут.
Ну, и костылище… :-)
Да, насчет
запуском бинарника вы в этом случае не управляете

я погорячился. Можно, конечно, и так тестировать.
ИМХО, у Финча вариант изящнее, а вариант Герранда более трудоемкий.
Спасибо за ссылки, первую положил в закладки — вдруг пригодится…
Спасибо. Не знал про такую утилиту.
Подозреваю, что считали кодом все строки, которые не являются комментарием или пустой строкой. Возможно, 500 тысяч строк — это все репозитории с github.com/juju. В оригинале нет каких-то дополнительных сведений о методике подсчета. (Информация о том, что комментарии не учитывались, есть и в переводе)
<sarcasm>
и вам спасибо за содержательную критику
</sarcasm>
Если честно, не понял… с exec.Command вы будете вызывать бинарник целиком; при этом вам надо как-то заставить его выполнить функцию, которая может вызвать os.Exit() и проверить код возврата. Здесь речь идет о
go test
и тестировании отдельных функций — запуском бинарника вы в этом случае не управляете. Да и это уже поведенческое тестирование, а не модульное…
Один из рецептов и приведен в статье. Можно ссылку, где почитать о других рецептах?
Про подход — наверное, да… я, кроме go, хорошо знаком только с python, и в нем есть такая общепринятая практика `if __name__ == '__main__"`… особенность go в том, что в нем недостаточно превратить функцию main в «однострочник» — все содержимое пакета main недоступно для импорта
Иногда приходится делать выбор. Например, между оверхэдом потоков информации между микросервисами и излишней связностью монолита. Команда, в которой работал автор, выбрала монолит. А как бы оно было, если бы команда выбрала микросервисы, никто не знает. Вряд ли кому-нибудь захочется переделать 500к строк кода на микросервисную архитектуру, чтобы посмотреть — как оно будет…
А сравнение с проектом на C# некорректное, да — там были другие люди, да и неизвестно, как он развивался. Вполне вероятно, что Juju на C# тоже бы не падало в продакшене. Автор просто восхищается тем, что Juju в продакшене не падал, а предыдущий проект вспоминается с «содроганием» :) Для «поделиться ощущениями» вполне пойдет, как аргумент в сравнении — вряд ли.
Пожалуйста. Вам спасибо за отзыв. Для меня это новый опыт. Читаю на английском достаточно много, но для себя — это одно, можно просто уловить суть и продолжать дальше. А для других переводить — это, оказывается, очень трудно и непросто.
Скорее уж где-нибудь в глубоких бункерах, чтобы никто не отвлекал
Все параметры «прогоняются» через db.literal(), который, в свою очередь, вызывает escape() у _mysql.connection.
print("LIKE %s" % conn.escape("'; select 1"))

выводит
LIKE '\'; select 1'

Т.е. защита от инъекций все-таки есть.
Вот уж совпало, так совпало…
Я ловил ошибки, пытаясь применить именованные параметры по докам mysql (вида param). Бегло прочитал про paramstyle и установил его в pyformat. Попробовал %(param)s — сработало, обрадовался, хотя paramstyle в действительности не причем. Если я правильно понимаю, то этот атрибут модуля носит информативный характер, т.е. автор модуля этим атрибутом указывает способ форматирования параметров. Копание в исходниках показывает, что он нигде не используется и никуда не передается.
Наверное, для того же, что и «виселица» с «крестиками-ноликами» :) антуражу для
Гениально! Спасибо тебе, добрый человек.
В MySQLdb paramstyle == 'format', по умолчанию. Выставил в 'pyformat', теперь работает так:
cur.execute("SELECT * FROM Test WHERE testID > %(tid)s", {'tid': 10})

Единственное, в данном модуле не получится использовать %d, например. П.ч. все аргументы прогоняются через db.literal(), который возвращает строку.
Действительно, %s работает как позиционный аргумент. Спасибо за информацию!
cur.execute("SELECT * FROM Test WHERE testID > :tid", {'tid': 10})

получаю:
You have an error in your SQL syntax;...

пакеты MySQLdb и mysql.connector, оба ругаются на "?":
cur.execute("SELECT * FROM Test WHERE testID > ?", (10,))

Not all parameters were used in the SQL statement

Если не указать запятую при одном параметре (10,) параметр будет передан как есть, а не в кортеже. MySQLdb выругается вот так:
not all arguments converted during string formatting

а mysql.connector ругается на ошибку sql-синтаксиса (near ?)

python v2.7
mariadb 10.1

Судя по документации, именованные параметры в mysql должны задаваться через "@". Но в таком случае, хотя и нет исключений при вызове execute, результат пустой.

У себя в скриптах использую .format(), но их запускаю только я, поэтому sql-инъекции маловероятны.

Information

Rating
Does not participate
Location
Пермь, Пермский край, Россия
Registered
Activity