- 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"?
Эксцепшены, значения - без разницы. Один хуй такое количество одинаковых строк - говно.
Жаль, что этот код работает с мелкими 3gp, а не какими-нибудь бурурей ремуксами... Память же дешёвая, зачем париться и читать блоками...
https://golang.org/pkg/io/#Copy
> fmt.Println(err)
> }
Наткнулись на ошибку, поматерились и поехали дальше. Ничто не остановит бульдозер.
надо будет дописать примерно следующий код:
В языках с GC довольно сложно сделать толковые деструкторы. Чтобы выяснить, используется ли объект ещё где-то или нет, нужно запускать GC.
defer решает 90% проблем, практически не усложняя язык. Дополнительный бонус: он, как правило, не создаёт дополнительный отступ, в отличие от питоньих with.
А чаще достаточно такого:
Вопрос к знатокам: если это интерфейс, то если указать тип таким образом, а не *net.Conn, то что передастся в функцию: копия или указатель? Я почему-то подозреваю, что объект скопируется, но как он будет копироваться в таком случае - мне не совсем понятно, т.е. он будет копироваться в рантайме исходя из каких-то метаданных которые в нем есть?
Во-вторых, если тип имплементит интерфейс, то при конструировании объекта интерфейса будет сделана обычная копия объекта (такая же, как в выражении a := b). При копировании объекта интерфейса, скорее всего, копий внутренних данных делаться не будет, но они будут делаться при вызове соответствующих методов (раз интерфейс имплементит тип, а не указатель, функции должны принимать объект по значению).
http://research.swtch.com/interfaces
Как-то грустно. Люди с таким авторитетом и такое пишут.
Т.е. они изобрели что-то, что существовало ну, как минимум лет десять до того как... и это еще при том, что в Го нет наследования. Ну, в комментариях автору уже об этом вобщем-то сказали.
Какое пишут? Он честно сказал, что не знает, применялся ли он где-то раньше. Он же не кричит, что они придумали что-то принципиально новое - просто что такой подход не является "мейнстримом". Более того - хочет узнать о более ранних имплементациях.
Я вот тоже не в курсе, где такое раньше применялось. Предоставленные ссылки содержат слишком мало информации, чтобы понять, как именно оно реализовано (и реализовано ли вообще).
Структурные подтипы в Ocaml/Scala, конечно, очень похожи на гошные интерфейсы, но Ocaml, в отличие от Go, не позволяет делать upcast (от общего к частному). Следовательно, ему нет нужды считать таблицы в рантайме.
В Go можно попробовать привести объект неизвестного на этапе компиляции типа к интерфейсу, и табличка методов будет посчитана в рантайме.
http://ambassadortothecomputers.blogspot.co.il/2010/03/inside-ocaml-objects.html
Этот человек работает в гугле, а гуглу наплевать на эту вашу изотерику.
Если вы спросите человека из Гугла, используют ли они Scala - они, скорее всего, спросят "А что это такое?".
У них там своя атмосфера: своя система контроля версий, свои билд-тулы, свои базы данных, свои языки программирования.
Если человек из гугла чего-то не знает об окружающем софтверном мире - это скорее норма, он работает совсем с другими инструментами, у него есть куда девать время - на него из гугло-репозитория смотрит больше миллиарда строк кода.
Не надо думать, что Go разрабатывался с целью запилить очередной универсальный ЯП. Цель была другая - сделать язык, который максимально отвечает с дизайн-принципам самого Гугла (если, к примеру, посмотреть гугловые C++-гайдлайны, можно найти множество аналогий с Go). По счастливой случайности язык оказался полезен кому-то ещё.
Гугл любит пилить что нить на букву G.
>У них там своя атмосфера: своя система контроля версий, свои билд-тулы, свои базы данных, свои языки программирования.
К стати вот с этим утверждением полностью согласен
иначе как объяснить что их G+ в полной жопе. Работники гугла просто не коммутативны.
Ну я бы так не спешил. G+ - единственный "(a)социальный" ресурс, которым я пользуюсь. Ибо он работает как отличный новостной агрегатор и в нём практически нет школоты.
Это единственный его плюс.
Если МНЕ G+ в тыщу раз интересней читать, чем всякие одноглазники - ДА, с МОЕЙ точки зрения G+ не в полной жопе.
Симметрично. Иди пока киношку в контактике посмотри да выпей чаю.
Капча 1984 хз чего хочет.
гость
гостѣ
Если да, можно запилить юзерскрипт для перевода, а также бота, который будет проверять, что на главной, и постить на ГК информацию о юзерскрипте на нескольких языках, если она вдруг отъехала на другую страницу.
Так мы выйдем на новый уровень.
ГОВНОКОД ЦЕ ЄВРОПА
Яги же, ну или пива.
За это я любил Я.ру. Но поскольку Яндекс не смог бороться с Лигой без Интернета, Ярушечку закрыли...
Апофеоз - тред по евангелиону* у доброчанек. Он на 99% состоит из "доброе утро, тред" и "спокойной ночи, тред" с пикрелейтедами.
* - анимешка, вышедшая в 95 году
незабываемые войны, скандалы, провокации и ковровые бомбёжки ждут вас в этом случае
собственно, это единственное развлечение на добро*-чане
---
* на более древней и почтенной анимешной борде для девочек слово "добро" используется как эвфемизм для "говно"
Они же не раз об этом писали.
Зачем тратить ресурсы на разработку и поддержку сервиса с минимальной (по меркам гугла) аудиторией без ясной схемы монитизации, если есть хорошие альтернативы?
Да и как-то с трудом представляю себе гугл, толкающий корпоративные лицензии гуглокода.
>аналогично гитхабу
Схема монетизации ясна?
А чё не на архитекта сразу?
Наплевать не Гуглу а Пайку. Что как бы и печально. Гугл тут ни при чем. И да, для людей разрабатывающих языки ни Лисп ни МЛ ну никак не эзотерика. На них все учебные примеры как бы написаны.
К слову, статья написана не Пайком, а Рассом Коксом, автором библиотек 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
Ну и чтобы не быть голословным: https://github.com/google тут есть проекты и на Руби и на Расте и на ПХП и на Кложуре и на Лиспе и даже на Груви.
Был в Лондонском офисе, разговаривал с инженерами. У меня несколько друзей - бывших яндексоидов - работают в 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.
Я лишь утверждаю, что для них нормально не знать досконально кишков немейнстримовых языков, потому что у них там своя атмосфера.
Это не означает, что люди должны в деталях знать, как устроены кишки CLOS или ненужной объектной системы OCaml (я вообще не понимаю, зачем её воткнули... и почему люди не используют StandardML вместо этого жирного однопоточного чуда).