
Dmitry
17.04.2017
13:26:42
воувоу полехче, до hybrid property в Алхимии щас дело дойдет!

Zart
17.04.2017
14:13:04
вшитые иммутаблы шлют нафиг, бо у них сишные реализации имеют заглушку для сетаттра
сетаттр(х, у, й) нужен обычно лишь когда "у" генерируется динамически, в остальном х.у=й написать резко проще

Google

V
17.04.2017
16:14:39
отцы, помогите, плз. у меня питон версии 3.5.1, есть guid.proto вида
syntax = "proto3";
message Guid {
fixed64 lo = 1;
fixed64 hi = 2;
}
мне нужно сгенерить такой guid, который можно будет сериализовать по такому протобуферу. я проделал совсем тупое решение типа сгенерить uuid4().int, скастовать из него строку и наслайсить два куска по 8 байт. я гуглил и читал доки про протобуф и uuid, но не получается, Б. точнее, получается какая-то хуйня, а хочется, чтоб по-человечески. заранее спасибо!

Zart
17.04.2017
16:20:15
а чем сериализуешь в протобуф на стороне питона?

Alexandr Korotaev
17.04.2017
16:20:53
отцы, помогите, плз. у меня питон версии 3.5.1, есть guid.proto вида
syntax = "proto3";
message Guid {
fixed64 lo = 1;
fixed64 hi = 2;
}
мне нужно сгенерить такой guid, который можно будет сериализовать по такому протобуферу. я проделал совсем тупое решение типа сгенерить uuid4().int, скастовать из него строку и наслайсить два куска по 8 байт. я гуглил и читал доки про протобуф и uuid, но не получается, Б. точнее, получается какая-то хуйня, а хочется, чтоб по-человечески. заранее спасибо!
struct.unpack("ll", uuid.bytes)

Zart
17.04.2017
16:21:18
ему скорее нужен пак
+фрейминг для пбуфа
и ll не проканает же

Alexandr Korotaev
17.04.2017
16:22:42
fixed64 == l, вроде

Zart
17.04.2017
16:23:17
но пак тогда будет хотеть 2 числа, а не одно
олсо uuid.bytes это уже закодированный вариант...

Alexandr Korotaev
17.04.2017
16:23:59
так unpack вернет 2 числа, которые скармливаются паку ...

Igor
17.04.2017
16:24:01
так ему и надо ж два, не?

Zart
17.04.2017
16:24:12
точнее. какой смысл бить гуид пополам в питоньей версии?

Google

Zart
17.04.2017
16:25:00
ыдга, 285!

Igor
17.04.2017
16:25:08
потому что это надо потом куда-то протобуфом отправить в таком формате? *)

Zart
17.04.2017
16:25:28
ичо

Igor
17.04.2017
16:25:45
чо и чо?

Zart
17.04.2017
16:25:46
это прям причина держать гуид распидорасенным пополам?

Igor
17.04.2017
16:25:57
ну, почему нет?

Zart
17.04.2017
16:26:06
а почему тогда вообще гуид? а не два инта64?
выкинуть нафиг import uuid

V
17.04.2017
16:27:02
сорри, канонично выступил, задал вопрос и отквлекся :) ща

Zart
17.04.2017
16:27:56
анпак можно сделать через uuid.UUID(bytes=foo[:16])
пак через uuid.bytes

Igor
17.04.2017
16:28:20
капитан

Zart
17.04.2017
16:28:22
я хз как пбуф фреймит, но наверняка просто и через стракт
главное uuid.bytes/uuid.bytes_le не путать
а то ваш сучий линукс уже заебал

V
17.04.2017
16:29:07
а чем сериализуешь в протобуф на стороне питона?
эээ, я только второй день курю протобуфы. если правильно понимаю вопрос, то сериализую так: сначала скомпилил .proto в .py (protoc), у себя в скрипте просто создаю инстанс и им делаю .SerializeToString() - получаю байты

Zart
17.04.2017
16:29:29
эм
эмулятор гуидов

V
17.04.2017
16:29:51

Zart
17.04.2017
16:30:17
только стракт примерно не нужен
конкретно для гуидов

Google

V
17.04.2017
16:30:53
ну еще вариант сделать типа .bytes и кастовать два инта из первой половины и второй половины (слайсами)
вообще суть - надо меняться данными с третьей стороной, их апи разговаривает на протобуфе, в каждое сообщение от меня надо пихать guid такого вот вида (8 байт + 8 байт). еще был вариант из UUID.fields набирать, но тоже изврат какой-то имхо
просто подумал может кто-то из присутствующих подобной херней уже страдал и знает, как правильно


Igor
17.04.2017
16:38:18
я более интересной хуйней страдаю
надо самопальный недо-ууид "abcde-12345-fedcb" эффективно хранить в бд, ну я че, я ебнул его в unsigned int 64, збс
а вот с конвертацией его обратно в такой формат на стороне бд возникли проблемы
в итоге получилось так %)))
arrayStringConcat(arrayMap(s -> replaceRegexpOne(s, '(^0+)', ''), extractAll(substring(reverse(replaceRegexpAll(toFixedString(reverse(lower(hex(id))), 16), '\\0', '0')), 2, 15), '\\w{5}')), '-') AS result_id

V
17.04.2017
16:39:53
вот человек тоже с похожим протобуфом межязыковым гуидом трахается http://stackoverflow.com/questions/26417127/protobuf-net-interop-with-java-uuid-and-c-sharp-guid
в итоге получилось так %)))
arrayStringConcat(arrayMap(s -> replaceRegexpOne(s, '(^0+)', ''), extractAll(substring(reverse(replaceRegexpAll(toFixedString(reverse(lower(hex(id))), 16), '\\0', '0')), 2, 15), '\\w{5}')), '-') AS result_id
%)

Igor
17.04.2017
16:40:44
сижу думаю, пиздато, что я в два раза для PK место и память сэкономил или не пиздато, потому что коллеги меня теперь иногда хотят отпиздить, кажется

V
17.04.2017
16:41:08
их можно понять, в общем-то

Igor
17.04.2017
16:41:25
ну блин, читабельные айдишники редко нужны, а для агрегаций так вообще нахуй не вперлись

V
17.04.2017
16:41:39
я так понимаю обычно такие штуки сопровождаются комментом в коде типа "don't ever touch this magic", да?

Igor
17.04.2017
16:41:49
да %)))
материться в конфлюенсе я не решился, поэтому описал "полная жесть, но работает точно"
сегодня еще попутно выяснил, что БД била данные при replaceAll, поэтому пришлось перейти на replaceRegexAll и менять регуляркой - эта функция работает нормально %)))

V
17.04.2017
16:43:35
а кто на .NET пишет, там guid так вот хорошо укладывается в эти 8 + 8? зачем-то же они родили такой .прото
они же его на своей стороне десериализуют

Roman
17.04.2017
16:44:09
@iamigor выглядит круто, но криво

Igor
17.04.2017
16:46:29

Google

Igor
17.04.2017
16:47:03
просто там еще проблема в том, что 238594909322565 == d9-34d-bd45, т.е. leading zeroes каждого блока удаляются

Roman
17.04.2017
16:47:28
там проблема, что ты вообще это в бд делаешь

Igor
17.04.2017
16:49:46
это да %)) но меня попросили!

V
17.04.2017
16:50:04
так себе оправдание )))

Igor
17.04.2017
16:50:14
да :(

V
17.04.2017
16:53:28

Zart
17.04.2017
16:53:42
а в какой бд вшит жс?
или это ты монгу так обозвал?

Admin
ERROR: S client not available

V
17.04.2017
16:54:22
я так понимаю мне надо
struct.unpack("qq", uuid.uuid4().bytes)

Zart
17.04.2017
16:55:47
почему вы никогда алигмент не задаете? живете в идеальном мире?
олсо знаковые инты очень прикольно в хекс перегонять, когда они отрицательные

V
17.04.2017
16:57:29

Zart
17.04.2017
16:57:46
struct.unpack('<QQ', buf)

Igor
17.04.2017
16:58:05

Zart
17.04.2017
16:58:19
< чтобы задать ендианнесс явно
Q чтобы беззнаковое
в итоге получилось так %)))
arrayStringConcat(arrayMap(s -> replaceRegexpOne(s, '(^0+)', ''), extractAll(substring(reverse(replaceRegexpAll(toFixedString(reverse(lower(hex(id))), 16), '\\0', '0')), 2, 15), '\\w{5}')), '-') AS result_id
ты не игорь, ты джавахарлал какой-то

V
17.04.2017
17:03:00

Zart
17.04.2017
17:04:48
вейт. это кликхаус аще?

Igor
17.04.2017
17:04:54
?

Google

Zart
17.04.2017
17:06:28
toFixedString(reverse(lower(hex(id))), 16)
зачем там реверс?
а, он двойной...

Milton
17.04.2017
17:07:38
Господа, а бывало ли у вас, что Pillow 4.1.0 и libwebp6 (и 5) из Debian Jessie не могли открыть webp, ссылаясь на "не могу определить тип изображения"? file говорит про webp, просмотрщики открывают как webp, то есть дело не в файле


Igor
17.04.2017
17:08:05
да, реверс двойной, чтоб в конце появились nul-байты в достаточном количестве, потому что конкатенация в начало строки выглядела бы в разы более ебано
т.е. если hex-строка короткая, переворачиваем, дописываем в конец нули, переворачиваем обратно, получаем нули в начале - профит
:) SELECT
proper,
id,
lower(hex(id)) AS hex_id,
reverse(hex_id) AS reversed_id,
substring(reversed_id, 1, 15) AS subreversed_id,
toFixedString(reversed_id, 16) AS fixed_id,
replaceRegexpAll(fixed_id, '\\0', '0') AS replaced_id,
reverse(replaced_id) AS reversed_2_id,
substring(reversed_2_id, 2, 15) AS trimmed_id,
extractAll(trimmed_id, '\\w{5}') AS extracted_id,
arrayMap(s -> replaceRegexpOne(s, '(^0+)', ''), extracted_id) AS array_id,
arrayStringConcat(array_id, '-') AS result_id,
result_id == proper AS result
FROM clickids;
вот полный, если интересно %)

Zart
17.04.2017
17:11:48
"PIL reads and writes WebP files. The specifics of PIL’s capabilities with this format are currently undocumented."

Эдвард
17.04.2017
19:49:28
?

Milton
17.04.2017
19:53:30
Pillow собран с поддержкой, грит что available
А нихрена

Эдвард
17.04.2017
22:02:55
знаешь или понимаешь?

Zart
18.04.2017
05:04:54
https://vc.ru/p/coder-dating
читаю и плакаю...
"сначала привлекали девушек как основную аудиторию, их набрать намного легче, чем программистов"
"в дальнейшем стали пытаться угодить обеим аудиториям. Программистам хотелось более крутую консоль и доступ к API, девушкам — больше удобства в переписке и на сайте."

Milton
18.04.2017
07:08:00

Zart
18.04.2017
07:08:46
угу, там комменты напалмом

dmks
18.04.2017
08:01:32
Доступ к апи это огонь: пойду за обедом напишу скрипт что бы жену нашел, а то скучно чот

b0g3r
18.04.2017
08:53:27

Alexey
18.04.2017
08:54:08

b0g3r
18.04.2017
08:54:22
Спасибо
Но это другой сайт :)