- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
function send_message_with_photo($token, $peer_id, $message, $image_file_path) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
/* Получаем ссылку для загрузки фотографии */
curl_setopt($ch, CURLOPT_URL, 'https://api.vk.com/method/photos.getMessagesUploadServer');
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
"access_token" => $token,
"v" => "5.103"
));
$result = json_decode(curl_exec($ch), true);
$upload_url = $result['response']['upload_url'];
/* Отправляем фотографию */
curl_setopt($ch, CURLOPT_URL, $upload_url);
$file = curl_file_create($image_file_path);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
"photo" => $file,
));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
$result = json_decode(curl_exec($ch), true);
$server = $result['server'];
$photo = $result['photo'];
$hash = $result['hash'];
/* Сохраняем фотографию */
curl_setopt($ch, CURLOPT_URL, 'https://api.vk.com/method/photos.saveMessagesPhoto');
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
"access_token" => $token,
"v" => "5.103",
"server" => $server,
"photo" => $photo,
"hash" => $hash
));
$result = json_decode(curl_exec($ch), true);
$photo_id = strval($result['response'][0]['id']);
$owner_id = strval($result['response'][0]['owner_id']);
$attachment = "photo" . $owner_id . "_" . $photo_id;
/* Отправляем сообщение */
curl_setopt($ch, CURLOPT_URL, 'https://api.vk.com/method/messages.send');
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
"access_token" => $token,
"v" => "5.103",
"random_id" => rand(),
"peer_id" => $peer_id,
"message" => $message,
"attachment" => $attachment
));
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
}
zhigolo 01.02.2020 16:36 # +1
zhigolo 01.02.2020 16:43 # 0
phpBidlokoder2 02.02.2020 01:23 # −3
guest8 02.02.2020 09:16 # −999
gostinho 02.02.2020 10:45 # +2
phpBidlokoder2 02.02.2020 23:22 # 0
Fike 02.02.2020 14:34 # +1
я конечно не ожидал чего-то сверхъестественного от разработчиков контакта, но они блядь не могут даже статическую ссылку для загрузки сделать?
Desktop 02.02.2020 14:56 # +1
kaluginvlad 02.02.2020 15:06 # 0
guest8 02.02.2020 18:26 # −999
questinho 02.02.2020 23:32 # 0
N_BCE_3ACMERJINCb 02.02.2020 23:48 # 0
nemywok_Ha_naJlO4KE 03.02.2020 00:01 # 0
alucas 04.02.2020 11:50 # 0
Fike 06.02.2020 03:49 # 0
Я тут хотел написать длинную рецензию на видео https://www.youtube.com/watch?v=Qk9EKzxc9uE, но она оказалось слишком длинной, поэтому в адаптированном варианте я ее оставлю своим друзяшкам в том самом контакте, а здесь просто один из репозиториев автора видео, потому что остальные мне чет влом копать.
https://github.com/atercattus/quiz.sidenis.ru.solution
> Решение (исходный код Java приложения) запускается ... командной строкой:
> java -Xmx256M -Xms16M -Xbatch -XX:+UseSerialGc -XX:-TieredCompilation -XX:CICompilerCount=1 Main
казалось бы, раз человек ставит флаги - он знает, что они значат
> -Xmx256M -Xms16M
"начни с размера хипа в 16 метров и по необходимости раздувай до 256"
Все джависты знают, что сразу выставить хип в максимальное значение - это дешевле, чем дать ему туда добраться самому. Один хуй время аллокации хипа от этого не изменится, реальная инициализация страницы памяти происходит только при первом обращении к ней.
> -Xbatch
Отрубаем комиляцию кода в фоне, пусть идет в мейн-треде. Ну эээээ ладно, пускай
> -XX:+UseSerialGc
"Использовать последовательный сборщик мусора"
Очевидно, автор очень боится thread contention, контекст свитчей и всего вот этого - что бэкграунд треды JVM засрут ему весь пирформанс, поэтому, пожалуйста, не делайте сборку мусора в параллель с моим кодом. Предположим, это имеет право на жизнь, но есть нюанс. Serial GC появился до Parallel GC, который отличается от первого только тем, что работает параллельно в несколько тредов, сокращая таким образом время исполнения. Видимо, потоки это настолько богохульная тема, что даже видимый нам карго-культ не так страшен.
Fike 06.02.2020 03:49 # +1
Отрубить к хуям промежуточный компилятор и либо интерпретировать код, либо компилить его более лучшим компилятором, который должен выкинуть все лишнее. Но есть нюанс.
- Мы любим JIT за PGO, а профайл собирается как раз выхлопом промежуточного компилятора
- Бэкграунд-компиляция, как мы помним, отключена, то есть всё встает как только компилятор начинает работать
- И ладно бы он просто сразу всё откомпилил, у него ж еще есть трешолды (по количеству вызовов метода), до достижения которых вообще будет работать медленный интерпретатор
-XX:CICompilerCount=1
"Использовать только один тред для компиляции"
Я, блядь, уже просто отказываюсь это комментировать
Внутренности там тоже забавные, даже не олимпиадным стилем программирования, а тем, что он заранее подсчитывает суммы для всей матрицы, и при обновлении одного элемента пересчитываются все последующие суммы.
Другими словами, если бы хитрые организаторы подавали на вход не рандом, а обновление первого элемента N раз, они могли бы устроить его решению DOS-атаку.
3.14159265 06.02.2020 03:53 # 0
Там ещё жаба-машину нужно прогревать перед запуском, но об этом уже сказано:
>у него ж еще есть трешолды (по количеству вызовов метода), до достижения которых вообще будет работать медленный интерпретатор
Но я чёт особенно проиграл с этого
bormand 06.02.2020 09:44 # +1
Кстати, царь на ГК как раз же складывал элементы матрицы?
3.14159265 06.02.2020 04:00 # +1
Ведь задача какая была?
Показать, что жаба-отребье обделалось.
Версия на сишке компактней, быстрее, проще и выигрывает во всём.
>XX:+UseSerialGc
К тому же, нужно понимать, что никому никакие многопоточные оптимизации gc сишке ненужны.
Ну и пару императивных строк, которые в говне валяют эти потуги.
Поэтому жаба-отребье так любит брать подобную херню и кого-то побеждать, правда оппонент как всегда не явился.
Пойти и писать реальные программы, реальную логику - отребье не может.
Соревноваться с лучшим - это не удел отребья.
Жаба-отребье, как и всякое другое отребье не может ничего родить. Оно может только воровать, врать и соревноваться с другими инвалидами.
>-XX:-TieredCompilation -XX:CICompilerCount=1
Очевидно, что с простым «си» они соревноваться не могут. Поэтому удел отребья - морочить себе голову каким-то непонятным говном, причём даже не имея нужного функционала.
N_BCE_3ACMERJINCb 06.02.2020 04:09 # +2
все поиметь пропаганда настолько мразью быть снабжена информацией об этом можно ужать строк до где в конце выдавать все тезисы этого там вс то насколько сильно не быть ссылка может .
тогда когда оно страшное не имеет проблему фундаментальную проблему что такое не си на самом деле нормальное число а если же сделали больше чем нужно все пойдет как и ифов .
не потому что дизайн этого ублюдка так не мой код ты бы создать структуру с файлами и что пыталось родить это просто насрала рандомными символами которые она везде это поток .
вот полноценный вариант который первый на этом будет больше но я могу спокойно пишется строковое представление об ошибке здесь увидел ошибку любой адекватный челове крешит это дошкол нок это генераций .
адресуется вс остальное что их это может только попробуйте осознать это устаревшее говно обладает самантикой недоязычка с файлами и что разделение .
3.14159265 06.02.2020 04:03 # 0
>музыки ВКонтакте
Фублядь, фунахуй.
Эти клоуны в 2к20 продолжают раздавать музло в издохшем mp3.
И до сих анскилябры не могут перейти на божественный opus.
Fike 06.02.2020 05:55 # +1
они взяли биндинги libmad для гошки - они их не устроили по производительности
тогда что они делают? вызывают ffmpeg
нет, не libffmpeg
они натурально кормят файл в экзекьютабл через stdin и сохраняют stdout в память
так перформанса больше
там еще про heap очень смешно, вместо того, чтобы выяснить, где именно тормозит, они тупо отдали сишникам, типа мы ниче не понимаем, сделайте шонибудь
bormand 06.02.2020 06:01 # 0
Да норм решение, на самом деле. Простое, асинхронное, да и процессы на линуксе не такие уж дорогие.
Fike 06.02.2020 07:51 # 0
bormand 06.02.2020 08:18 # 0
Я не думаю, что перенос кодека в процесс go даст какой-то значительный выигрыш. А ёбли с вызовом сишной либы будет на порядок больше.
Ну и это про звук, для видео все эти копирования будут просто ничтожны на фоне самого кодека.
Fike 06.02.2020 17:20 # 0
вызов библиотеки напрямую: копирование с диска в буфер -> передача буфера в функцию библиотеки -> построение нового массива байт с декодированным содержимым и его возврат
вызов executable: копирование с диска в буфер -> копирование из буфера в пайп -> чтение из пайпа в буфер -> передача буфера в функцию библиотеки -> построение нового массива байт с декодированным содержимым -> копирование в пайп -> чтение из пайпа
плюс еще постоянные переходы из юзерлэнда в кернел и наоборот
чет дохуя для ребят, которые рассказывают нам на «HighLoad++» историю про эффективное программирование и ускорение работы, когда вся обработка ведется на цпу
хотя они там и параллелят не по ядрам, а по файлам
Fike 06.02.2020 17:24 # 0
3.14159265 06.02.2020 17:26 # 0
ffmpeg — это standalone приложение работает и с файлами и с stdin/stdout пайпами.
Традиционно вместо имени файла ставят минус.
capture /dev/stdout | ffmpeg -i -
Fike 06.02.2020 17:30 # 0
3.14159265 06.02.2020 17:37 # +2
Они всё делают по-царски, для оптимальности переопределяют malloc линкуемой либы, чтобы не делать лиший memcpy.
И кодек сам высирает кодированный стрим обратно же во внутренние буфера ffmpeg.
gostinho 06.02.2020 17:38 # 0
Fike 06.02.2020 17:59 # 0
guest8 06.02.2020 17:38 # −999
3.14159265 06.02.2020 17:40 # 0
Или берёт flac, демуксит его, потом декодирует и пересылает декодированое в opus.
guest8 06.02.2020 17:43 # −999
3.14159265 06.02.2020 14:24 # 0
Нет, в целом я использовал такое локально и решение нормальное.
Но через пайп иногда проблемы бывают. У меня когда-то цветовые профили хериться начали. Через либы биндинг к ffmpeg всё работает, а через пайп надо дрочиться с аргументами, потому что у видео цвета поплыли.
bormand 06.02.2020 16:09 # 0
У headless сервака... Походу там в любом случае с опциями дрочиться.
3.14159265 06.02.2020 14:26 # 0
>тогда что они делают? вызывают ffmpeg
Да анскильные отбросы. О чём речь.
К ffmpegy давно прикручены все мыслимые и немыслимые биндинги: libmad, libopus, libfdk_aac.
Там натурально поддерживаются сотни либ.
3.14159265 06.02.2020 17:32 # +3
Такой либы нет в принципе.
Возможно вы имели ввиду libavcodec
При запуске ffmpeg показывает, какие у него внутри либы и с чем он слинкован.
Fike 06.02.2020 17:35 # +1
3.14159265 06.02.2020 17:43 # +2
Потому что анскильные гугло-питушки, писавшие vp8/vp9 не шмогли даже написать приличный декодер для СВОИХ же кодеков.
1024-- 06.02.2020 09:35 # 0
2. Какая разница конченому пользователю от этого? Судя по графикам, MP3 на стандартных 128kbps выдаёт обратно не меньше ценного меха, чем Opus. Делать ниже 128 особого смысла наверно нет, т.к. основная нагрузка на пространство и трафик - скорее всего картиночки, а не музыка.
bormand 06.02.2020 09:37 # +1
Потому что патент закончился.
1024-- 06.02.2020 09:48 # 0
HoBorogHuu_nemyx 06.02.2020 10:16 # 0
3.14159265 06.02.2020 14:10 # 0
https://www.telegraph.co.uk/technology/2017/05/15/creators-mp3-declare-dead/
3.14159265 06.02.2020 17:50 # 0
1 минута музыки в 128 — примерно мегабайт. А люди часто льют 320.
Не знаю. Возможно у Алишера куры денег не клюют, и ему хватает на оплату лишних серверов и траффика.
>Какая разница конченому пользователю от этого?
Качество заметно выше .
>Судя по графикам, MP3 на стандартных 128kbps выдаёт обратно не меньше ценного меха, чем Opus.
Нет. Нужно судить не по графикам, а по прослушиванию.
В MP3 на 128kbps заметны артефакты. Он очень сильно режет высокие частоты.
Даже 320kbps не считаются прозрачными.
Опус 128kbps stereo считается практически прозрачным.
То есть разницу может услышать только упоротый аудиофил, при многократном задрачивании.
А opus 160kbps от flaca не отличают даже самые упоротые аудиофилы.
gost 06.02.2020 17:58 # 0
guest8 06.02.2020 18:00 # −999
3.14159265 06.02.2020 18:01 # +1
https://people.xiph.org/~xiphmont/demo/celt/demo.html
https://people.xiph.org/~greg/opus/ha2011/
https://people.xiph.org/~xiphmont/demo/opus/demo3.shtml
https://people.xiph.org/~jm/opus/opus-1.2/
https://people.xiph.org/~jm/opus/opus-1.3/
В самом кодеке нет. В 1.3 сделали простенький RNN для определения speech/music.
gost 06.02.2020 18:17 # +1
N_BCE_3ACMERJINCb 06.02.2020 18:45 # 0
N_BCE_3ACMERJINCb 06.02.2020 18:16 # 0
Чувак, купи приличные колонки, 128kbps звучит как сраный pottyphone.
Fike 06.02.2020 18:21 # 0
пффф, да ему хватает даже на олимпиадников
3.14159265 06.02.2020 18:03 # +1
Какие-то анскильные графики.
Судя по спектрограммам MP3 — это жуткий пиздец.
MP3
https://people.xiph.org/~xiphmont/demo/celt/pr-spec.mp3.png
Opus
https://people.xiph.org/~xiphmont/demo/celt/pr-spec.celt.png
Оригинал
https://people.xiph.org/~xiphmont/demo/celt/pr-spec.orig.png
gost 06.02.2020 11:29 # +1
3.14159265 06.02.2020 14:15 # +4
Он заточен под всё сразу. Это гибридный кодек.
У Opusа очень низкая алгоритмическая задержка и отсутствие патентов.
И звучит при 48kbps лучше чем mp3 при 128 kbps. Вообще по тестам на 64kbps звучит он лучше чем у aac, ogg.
https://upload.wikimedia.org/wikipedia/commons/e/ec/Opus_bitrate%2Blatency_comparison.svg
https://upload.wikimedia.org/wikipedia/commons/8/8d/Opus_quality_comparison_colorblind_compatible.svg
N_BCE_3ACMERJINCb 06.02.2020 17:14 # 0
очередной спич-кодек, расходимся
3.14159265 06.02.2020 17:27 # 0
Тебе, безусловно, виднее.
N_BCE_3ACMERJINCb 06.02.2020 18:20 # 0
3.14159265 06.02.2020 18:23 # +2
Спешите видеть! Дурачок определяет качество звука по циферке битрейта.
Ещё раз повторяю: даже 96kbps достаточно для достижения transparency на большинстве сэмплов.
guest8 06.02.2020 18:26 # −999
3.14159265 06.02.2020 18:29 # 0
Да и ржачно почитать откровения идиотов.
Тут посоны на гидрогене вообще спорят: 80 или 96?
https://hydrogenaud.io/index.php/topic,114656.0.html
guest8 06.02.2020 18:33 # −999
gost 06.02.2020 18:35 # +1
На самом деле факт, кстати. Корректнее будет сравнивать какой-нибудь «gif» и «jpeg».
N_BCE_3ACMERJINCb 06.02.2020 18:39 # 0
guest8 06.02.2020 18:39 # −999
gost 06.02.2020 18:45 # 0
«BMP», если не вдаваться в извращения — это просто матрица пикселей безо всякого сжатия. И именно поэтому качество картинки в «BMP» всегда будет максимальным, «BMP» просто не может какую-то инфу из неё потерять. А вот «JPEG» информацию теряет всегда.
guest8 06.02.2020 18:48 # −999
gost 06.02.2020 19:04 # +2
guest8 06.02.2020 19:06 # −999
gost 06.02.2020 19:12 # +1
Кстати, если сохранить тот же квадрат в четырёхбитном «PNG», то обратно он разожмётся тоже без потерь. А весить будет 583 байта — против 16833 байт у «JPEG» (для любого качества).
guest8 06.02.2020 19:13 # −999
gost 06.02.2020 19:49 # +1
Про размер, кстати, тоже не совсем верно: изображение из одного пикселя в «BMP» (24 бита) будет весить 58 байт, в «JPEG» (100) — 784.
guest8 06.02.2020 20:03 # −999
HoBorogHuu_nemyx 06.02.2020 19:06 # +1
Надо изучить документацию, чтобы понять, что же реально в этом случае хранится в джипеге.
HoBorogHuu_nemyx 06.02.2020 19:27 # 0
HoBorogHuu_nemyx 06.02.2020 18:45 # 0
Есть «GIF89a» с дополнительными фишками, которых нет у «BMP». Это, например, анимация. Вообще спецификация «GIF89a» включала особенности, делающие его похожим на HTML или на SWF: наложение текста (именно в виде текста, а не в виде растра), интерактивные компоненты (видел демонстрационный вьюер, который это всё поддерживал). Но из этого всего прижилась только анимация.
guest8 06.02.2020 18:49 # −999
HoBorogHuu_nemyx 06.02.2020 18:57 # +1
При сплошной заливке достаточно сохранить одну частоту. Квадрат 8×8 превратится в один пиксель. Итого нужно сохранить 113×113 пикселей = 12769 пикселей, зожатых по фомфану.
Как я уже заметил, «BMP» бывает с «RLE» (правда, «RLE» не везде поддерживается). Если зожать с «RLE», то каждая строка будет выглядеть как один пиксель («BMP» зожимает только в горизонтальном направлении). Итого будет сохранено 900 пикселей.
bormand 06.02.2020 19:34 # +1
HoBorogHuu_nemyx 06.02.2020 19:43 # +1
bormand 06.02.2020 20:02 # 0
А видеокодек на сплошной заливке управится в 1 бит символ* "totally predicted" на квадратик.
* символ может занять меньше бита, намного меньше бита если он предсказуем
N_BCE_3ACMERJINCb 06.02.2020 20:13 # 0
Хорошо, что вас не пускают на стековерфлоу.
KpunoBblu_nemyx 06.02.2020 22:25 # 0
всё-таки удалось реализовать алгоритм бесконечного зожатия?
gost 06.02.2020 22:28 # 0
См., напр., «орефметическое кодирование».
bormand 06.02.2020 22:37 # 0
guest8 06.02.2020 23:55 # −999
HoBorogHuu_nemyx 07.02.2020 06:15 # 0
https://youtu.be/uaRlBavLCN4
Момеда не знаю.
guest8 07.02.2020 19:27 # −999
HoBorogHuu_nemyx 08.02.2020 12:40 # 0
3.14159265 06.02.2020 18:36 # +1
opus более экономно расходует битрейт за счёт гораздо более продвинутых алгоритмов и консервации аудиоэнергии.
mp3 тупо режет высокие, сколько ты ему не дай. А в 320kbps у него треть битрейта вообще уходит в паддинг пакетов.
Потому 320kbps mp3 обычно зожимаются до 70-80% простым архиватором. Можете сами убедиться.
N_BCE_3ACMERJINCb 06.02.2020 18:35 # 0
N_BCE_3ACMERJINCb 06.02.2020 18:34 # 0
1024-- 06.02.2020 21:14 # 0
(Кстати, тут как раз и битрейт понадобится.
gost 06.02.2020 21:21 # +1
Зожмёт, и ушами ты разницы не услышишь. Но ведь это далеко не всё, что требуется от сигнала с 20-разрядного АЦП и частотой в несколько сотен килогерц, да?
1024-- 06.02.2020 22:03 # 0
Transparency is not an upper limit. Identity transformation it transparent too.
A transparent rustery could be an identity transformation or a limiting rustery like MP3. I don't know what kind of rustery Opus could provide except of transparency.
gost 06.02.2020 22:06 # 0
Это англоязычные вореции?
guest8 06.02.2020 22:07 # −999
1024-- 06.02.2020 22:20 # +3
§1. roost - петух
§2. rust - питух
HoBorogHuu_nemyx 06.02.2020 23:39 # 0
1024-- 07.02.2020 18:59 # 0
3.14159265 06.02.2020 21:27 # +2
Зожмёт.
> 20разрядного АЦП и
> частоты несколько сотен килогерц?
https://wiki.xiph.org/OpusFAQ#Does_Opus_support_higher_sampling_rates.2C_such_as_96_kHz_or_192_kHz.3F
Does Opus support higher sampling rates, such as 96 kHz or 192 kHz?
Yes and no.
Opus encoding tools like opusenc will happily encode input files that are sampled at 96 or 192 kHz.
However, files at these rates are internally converted to 48 kHz and then only frequencies up to 20 kHz are encoded.
The reason is simple: lossy codecs are designed to preserve audible details while discarding irrelevant information.
Since the human ear can only hear up to 20 kHz at best (usually lower than that), frequency content above 20 kHz is the first thing to go.
If you want a codec to handle high sampling rates losslessly, use FLAC!
N_BCE_3ACMERJINCb 06.02.2020 21:33 # 0
Но мы же хотим лосси, просто лосси!
Вот из-за такого пиздобольства им и нет доверия.