- 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
func handleRequest(conn net.Conn) {
// размер данных
buf := make([]byte, 4)
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("%v", utils.ErrInfo(err))
}
size := utils.BinToDec(buf)
fmt.Printf("get data size: %v / n: %v\n", size, n)
if size < 10485760 {
// сами данные
binaryData := make([]byte, size)
n, err = io.ReadFull(conn, binaryData)
fmt.Printf("n: %v\n", n)
if err != nil {
fmt.Printf("%v", utils.ErrInfo(err))
}
gp3, err := ioutil.TempFile(os.TempDir(), "temp")
if err != nil {
fmt.Printf("%v", utils.ErrInfo(err))
}
mp4, err := ioutil.TempFile(os.TempDir(), "temp")
if err != nil {
fmt.Printf("%v", utils.ErrInfo(err))
}
err = ioutil.WriteFile(gp3.Name()+".3gp", binaryData, 0644)
if err != nil {
fmt.Printf("%v", utils.ErrInfo(err))
}
out, err := exec.Command("/usr/bin/ffmpeg", "-i", gp3.Name()+".3gp", mp4.Name()+".mp4").Output()
if err != nil {
fmt.Println("/usr/bin/ffmpeg", "-i", gp3.Name()+".3gp", mp4.Name()+".mp4")
fmt.Printf("%v\n", utils.ErrInfo(err))
}
fmt.Printf("out: %v\n", out)
data, err := ioutil.ReadFile(mp4.Name()+".mp4")
if err != nil {
fmt.Println(err)
}
// в 4-х байтах пишем размер данных, которые пошлем далее
size := utils.DecToBin(len(data), 4)
n, err = conn.Write(size)
if err != nil {
fmt.Println(err)
}
fmt.Printf("n: %v\n", n)
// далее шлем сами данные
n, err = conn.Write(data)
if err != nil {
fmt.Println(err)
}
fmt.Printf("n: %v\n", n)
}
}
Со швабры, Go. Мне кажется, или здесь слишком много "if err != nil"?
dxd 10.12.2015 22:42 # −1
gost 10.12.2015 22:54 # +4
Эксцепшены, значения - без разницы. Один хуй такое количество одинаковых строк - говно.
dxd 10.12.2015 23:18 # +1
fbastunci 10.12.2015 22:50 # +3
bormand 10.12.2015 23:19 # +6
Жаль, что этот код работает с мелкими 3gp, а не какими-нибудь бурурей ремуксами... Память же дешёвая, зачем париться и читать блоками...
roman-kashitsyn 11.12.2015 12:30 # +1
https://golang.org/pkg/io/#Copy
bormand 10.12.2015 23:22 # +6
> fmt.Println(err)
> }
Наткнулись на ошибку, поматерились и поехали дальше. Ничто не остановит бульдозер.
Soul_re@ver 11.12.2015 02:29 # +1
Antervis 11.12.2015 06:51 # +2
надо будет дописать примерно следующий код:
TarasB 11.12.2015 12:27 # +1
dxd 11.12.2015 12:31 # +2
kurwa 13.12.2015 01:44 # 0
TarasB 14.12.2015 12:38 # 0
roman-kashitsyn 14.12.2015 12:56 # 0
bormand 14.12.2015 16:38 # 0
roman-kashitsyn 14.12.2015 16:45 # 0
TarasB 15.12.2015 10:48 # 0
Vasiliy 15.12.2015 11:10 # 0
roman-kashitsyn 15.12.2015 11:17 # 0
В языках с GC довольно сложно сделать толковые деструкторы. Чтобы выяснить, используется ли объект ещё где-то или нет, нужно запускать GC.
defer решает 90% проблем, практически не усложняя язык. Дополнительный бонус: он, как правило, не создаёт дополнительный отступ, в отличие от питоньих with.
TarasB 11.12.2015 12:31 # 0
А чаще достаточно такого:
wvxvw 13.12.2015 23:03 # 0
Вопрос к знатокам: если это интерфейс, то если указать тип таким образом, а не *net.Conn, то что передастся в функцию: копия или указатель? Я почему-то подозреваю, что объект скопируется, но как он будет копироваться в таком случае - мне не совсем понятно, т.е. он будет копироваться в рантайме исходя из каких-то метаданных которые в нем есть?
roman-kashitsyn 14.12.2015 00:01 # 0
Во-вторых, если тип имплементит интерфейс, то при конструировании объекта интерфейса будет сделана обычная копия объекта (такая же, как в выражении a := b). При копировании объекта интерфейса, скорее всего, копий внутренних данных делаться не будет, но они будут делаться при вызове соответствующих методов (раз интерфейс имплементит тип, а не указатель, функции должны принимать объект по значению).
http://research.swtch.com/interfaces
wvxvw 14.12.2015 01:44 # 0
Как-то грустно. Люди с таким авторитетом и такое пишут.
Т.е. они изобрели что-то, что существовало ну, как минимум лет десять до того как... и это еще при том, что в Го нет наследования. Ну, в комментариях автору уже об этом вобщем-то сказали.
roman-kashitsyn 14.12.2015 12:08 # +2
Какое пишут? Он честно сказал, что не знает, применялся ли он где-то раньше. Он же не кричит, что они придумали что-то принципиально новое - просто что такой подход не является "мейнстримом". Более того - хочет узнать о более ранних имплементациях.
Я вот тоже не в курсе, где такое раньше применялось. Предоставленные ссылки содержат слишком мало информации, чтобы понять, как именно оно реализовано (и реализовано ли вообще).
Структурные подтипы в Ocaml/Scala, конечно, очень похожи на гошные интерфейсы, но Ocaml, в отличие от Go, не позволяет делать upcast (от общего к частному). Следовательно, ему нет нужды считать таблицы в рантайме.
В Go можно попробовать привести объект неизвестного на этапе компиляции типа к интерфейсу, и табличка методов будет посчитана в рантайме.
wvxvw 14.12.2015 22:28 # 0
http://ambassadortothecomputers.blogspot.co.il/2010/03/inside-ocaml-objects.html
wvxvw 14.12.2015 22:33 # +1
roman-kashitsyn 15.12.2015 11:31 # 0
Этот человек работает в гугле, а гуглу наплевать на эту вашу изотерику.
Если вы спросите человека из Гугла, используют ли они Scala - они, скорее всего, спросят "А что это такое?".
У них там своя атмосфера: своя система контроля версий, свои билд-тулы, свои базы данных, свои языки программирования.
Если человек из гугла чего-то не знает об окружающем софтверном мире - это скорее норма, он работает совсем с другими инструментами, у него есть куда девать время - на него из гугло-репозитория смотрит больше миллиарда строк кода.
Не надо думать, что Go разрабатывался с целью запилить очередной универсальный ЯП. Цель была другая - сделать язык, который максимально отвечает с дизайн-принципам самого Гугла (если, к примеру, посмотреть гугловые C++-гайдлайны, можно найти множество аналогий с Go). По счастливой случайности язык оказался полезен кому-то ещё.
Vasiliy 15.12.2015 11:59 # −1
Гугл любит пилить что нить на букву G.
>У них там своя атмосфера: своя система контроля версий, свои билд-тулы, свои базы данных, свои языки программирования.
К стати вот с этим утверждением полностью согласен
иначе как объяснить что их G+ в полной жопе. Работники гугла просто не коммутативны.
roman-kashitsyn 15.12.2015 12:04 # +1
Ну я бы так не спешил. G+ - единственный "(a)социальный" ресурс, которым я пользуюсь. Ибо он работает как отличный новостной агрегатор и в нём практически нет школоты.
Vasiliy 15.12.2015 12:17 # +1
Это единственный его плюс.
guest 15.12.2015 17:26 # +4
roman-kashitsyn 15.12.2015 18:05 # 0
Если МНЕ G+ в тыщу раз интересней читать, чем всякие одноглазники - ДА, с МОЕЙ точки зрения G+ не в полной жопе.
guest 15.12.2015 18:26 # +1
roman-kashitsyn 15.12.2015 18:33 # 0
Симметрично. Иди пока киношку в контактике посмотри да выпей чаю.
guest 15.12.2015 19:17 # −2
Капча 1984 хз чего хочет.
gost 15.12.2015 19:58 # 0
guest 15.12.2015 20:02 # −1
bormand 15.12.2015 20:10 # 0
1024-- 15.12.2015 20:16 # +2
гость
гостѣ
bormand 15.12.2015 20:19 # +1
3_14dar 15.12.2015 20:53 # +2
1024-- 15.12.2015 21:51 # 0
Если да, можно запилить юзерскрипт для перевода, а также бота, который будет проверять, что на главной, и постить на ГК информацию о юзерскрипте на нескольких языках, если она вдруг отъехала на другую страницу.
Так мы выйдем на новый уровень.
ГОВНОКОД ЦЕ ЄВРОПА
bormand 15.12.2015 22:08 # 0
bormand 15.12.2015 20:20 # +1
Яги же, ну или пива.
inkanus-gray 15.12.2015 20:26 # +2
3_14dar 15.12.2015 20:53 # +1
CHayT 15.12.2015 20:53 # +6
inkanus-gray 15.12.2015 19:20 # 0
За это я любил Я.ру. Но поскольку Яндекс не смог бороться с Лигой без Интернета, Ярушечку закрыли...
CHayT 15.12.2015 20:27 # 0
bormand 15.12.2015 20:29 # +4
gost 15.12.2015 20:32 # +1
bormand 15.12.2015 20:34 # +2
3_14dar 15.12.2015 20:54 # +2
bormand 15.12.2015 21:31 # +3
Апофеоз - тред по евангелиону* у доброчанек. Он на 99% состоит из "доброе утро, тред" и "спокойной ночи, тред" с пикрелейтедами.
* - анимешка, вышедшая в 95 году
inkanus-gray 15.12.2015 21:36 # +4
CHayT 15.12.2015 23:03 # +2
незабываемые войны, скандалы, провокации и ковровые бомбёжки ждут вас в этом случае
собственно, это единственное развлечение на добро*-чане
---
* на более древней и почтенной анимешной борде для девочек слово "добро" используется как эвфемизм для "говно"
bormand 15.12.2015 23:23 # +1
CHayT 15.12.2015 23:29 # 0
3_14dar 15.12.2015 21:42 # +2
3.14159265 15.12.2015 17:31 # +3
imihajlov 15.12.2015 18:12 # +2
roman-kashitsyn 15.12.2015 18:14 # +2
inkanus-gray 15.12.2015 19:10 # 0
roman-kashitsyn 15.12.2015 19:17 # +3
Они же не раз об этом писали.
Зачем тратить ресурсы на разработку и поддержку сервиса с минимальной (по меркам гугла) аудиторией без ясной схемы монитизации, если есть хорошие альтернативы?
guest 15.12.2015 19:18 # 0
roman-kashitsyn 15.12.2015 19:21 # 0
Да и как-то с трудом представляю себе гугл, толкающий корпоративные лицензии гуглокода.
guest 15.12.2015 19:22 # 0
>аналогично гитхабу
Схема монетизации ясна?
CHayT 15.12.2015 20:30 # +1
bormand 15.12.2015 20:32 # 0
А чё не на архитекта сразу?
guest 15.12.2015 22:55 # −3
1024-- 15.12.2015 23:28 # +1
3_14dar 16.12.2015 22:02 # +3
inkanus-gray 16.12.2015 23:07 # 0
1024-- 16.12.2015 23:21 # 0
wvxvw 16.12.2015 00:57 # +1
Наплевать не Гуглу а Пайку. Что как бы и печально. Гугл тут ни при чем. И да, для людей разрабатывающих языки ни Лисп ни МЛ ну никак не эзотерика. На них все учебные примеры как бы написаны.
roman-kashitsyn 16.12.2015 10:01 # 0
К слову, статья написана не Пайком, а Рассом Коксом, автором библиотек RE2:
https://plus.google.com/+RussCox-rsc/posts
> Наплевать не Гуглу а Пайку.
One of the (hundreds of) cool things about working for Google is that they let teams experiment, as long as it's done within certain broad and well-defined boundaries. One of the fences in this big playground is your choice of programming language. You have to play inside the fence defined by C++, Java, Python, and JavaScript.
-- http://steve-yegge.blogspot.ru/2007/06/rhino-on-rails.html
But you know, ultimately, and it comes up all the time, I mean we've got a bunch of famous Lisp people, and (obviously) famous Python people, and you know, famous language people inside of Google, and of course they'd like to do some experimentation. But, you know, Google's all about getting stuff done.
Q: Is it allowed at Google to use Lisp and other languages?
No. No, it's not OK. At Google you can use C++, Java, Python, JavaScript... I actually found a legal loophole and used server-side JavaScript for a project. Or some of our proprietary internal languages.
-- http://steve-yegge.blogspot.ru/2008/05/dynamic-languages-strike-back.html
wvxvw 16.12.2015 20:52 # +2
Ну и чтобы не быть голословным: https://github.com/google тут есть проекты и на Руби и на Расте и на ПХП и на Кложуре и на Лиспе и даже на Груви.
roman-kashitsyn 17.12.2015 00:44 # +1
Был в Лондонском офисе, разговаривал с инженерами. У меня несколько друзей - бывших яндексоидов - работают в HQ, я с ними часто общаюсь.
> на Расте
>> https://github.com/google/hat-backup
>> Disclaimer: This is not an official Google product.
>> Warning: This is an incomplete work-in-progress.
>> https://github.com/google/rust-multihash
>> This is not an official Google project
> Clojure
>> https://github.com/google/clojure-turtle
>> This is not an official Google product (experimental or otherwise), it is just code that happens to be owned by Google.
Ну вы понели.
Ещё раз - я не говорю, что люди в Гугле не знают других языков. Скорее наоборот. Один из моих знакомых - любитель Хаскела, работает в Map Reduce Team.
Я лишь утверждаю, что для них нормально не знать досконально кишков немейнстримовых языков, потому что у них там своя атмосфера.
roman-kashitsyn 16.12.2015 10:06 # 0
Это не означает, что люди должны в деталях знать, как устроены кишки CLOS или ненужной объектной системы OCaml (я вообще не понимаю, зачем её воткнули... и почему люди не используют StandardML вместо этого жирного однопоточного чуда).