• Чем отличаются буферизированные каналы от небуферизированных?

    @SilentFl
    рассматривайте каналы как очереди queue. небуферизованный - с длиной 1, буферизованный - с длиной n (ch := make(chan struct{}, n). запись в канал может быть осуществлена если в канале есть еще места, при заполнении канала запись лочится (т.е. код "встает" на этой попытке и ждет пока освободится место). в соответствии с этим:
    ch1 := make(chan struct{})
    ch1 <- struct{}{} //ок, ушло в канал
    ch1 <- struct{}{} //висим и ждем когда кто-нить прочитает из канала


    ch2 := make(chan struct{},3)
    ch2 <- struct{}{} //ок, ушло в канал
    ch2 <- struct{}{} //также ушло
    ch2 <- struct{}{} //и еще ушло
    ch2 <- struct{}{} //а вот тут лок. висим и ждем когда кто-то прочитает из канала
    Ответ написан
    Комментировать
  • Особая магия с channels в golang?

    Tyranron
    @Tyranron
    Сначала отвечу на второй вопрос.
    close() никакого отношения к scope не имеет вообще, он просто делает канал "закрытым", то есть таким, что при чтении значений из канала и записи из него возникает panic. Это всё. Соответственно...
    что случится, если закрыть буферизированый канал до того, как считать из него все значения, успевшие туда попасть?
    Канал закроется, при следующей попытке считать с него значение получите panic. Значения, что остались внутри, считайте потерянными, Вы их больше никак не получите.
    UPD: Это не так! (см. конец поста и комментарии)
    Соберется ли такой chan сборщиком мусора при уходе его в out of scope? Что будет с обьектами внутри канала?
    Соберется он сборщиком мусора только тогда, когда на него никто больше не будет ссылаться (если он объявлен локально, то да, out of scope). Объекты внутри тоже соберутся, если на них больше никто не ссылается. Те, на которые еще ссылается кто-то, останутся.

    Теперь замечания по Вашему примеру:
    select {
    case b <- number:
        fmt.Printf("Sent into b: %d\n", number)
    default:
        fmt.Printf("b chan closed\n")
    }
    Этот кусок здорово дезинформирует. Во-первых select на запись c default секцией никоим образом не спасает от panic при записи в закрытый канал. Он всего лишь делает запись в канал всегда неблокируемой. Как только Вы таким select'ом попытаетесь записать в закрытый канал что-то, словите сразу панику. Потому правильно для восприятия это место выглядит следующим образом:
    select {
    case b <- number:
        fmt.Printf("Sent into b: %d\n", number)
    default:
        fmt.Printf("Number %d just has been thrown away\n", number)
    }
    Если Вы сделаете канал a буферизированным, то тут Вам Ваши panic'и и полетят, потому что Вы пишете в закрытый канал.
    Закономерный вопрос: почему тогда panic'и не летят при небуферизированном канале а?
    Ответ: Вам просто везет =)
    Во-первых, на playground'е runtime.GOMAXPROC=1 и runtime.NumCPU=1. То есть в реальности все дело крутится в одном потоке и параллельность тут псевдо.
    Во-вторых, у меня локально (OS X) этот скрипт выкидывает panic'у после получения числа 25 даже при runtime.GOMAXPROC=1. Вам банально повезло, что внутренний планировщик горутин на playground'е ведет себя именно таки образом. При буферизированном канале он ведет себя немного иначе и Вы получаете закономерную panic'у сразу.

    Если совсем на пальцах по первому вопросу, то:
    При небуферизированном канале close(b) по каким-то соображения планировщика выполняется только после того как отработали обе горутины, если глянуть на вывод, то надпись "B:1" будет в самом конце. Потому то все и отрабатывает нормально, хотя это поведение совершенно не гарантированно логикой программы, наоборот, программа рассчитана на то, что close(b) выполнится сразу после того, как мы оттуда что-то считаем. Это и происходит, если канал a сделать буферизированым (надпись "B: 1" вылетает сразу), так как в этом случае планировщик меняет свои соображения, и мы получаем закономерную panic'у.

    Дополнительно:
    Канал b должен быть буферизированным, иначе, если горутина судья отработает быстрее чем главная горутина вообще начнет слушать канал, то все значения просто выкинутся. Эта проблема хорошо описана в этой статье на двух предпоследних абзацах.

    UPD:
    Я допустил ошибку, как верно указали в комментариях Виталий Яковенко и SilentFl, закрытый канал не выдает panic при чтении с него. Он разрешает считать все значения, которые в нем остались, после чего отдает "пустые" значения для свое типа, больше никогда не блокируя выполнение.
    Закрытый канал panic'ует только при попытке отправить в него значение.
    Ответ написан
  • Как делаются такие игры на JS?

    @FoxInSox
    С помощью крови и пота.
    Ответ написан
    Комментировать
  • Какую cms использует toster.ru?

    hell0w0rd
    @hell0w0rd
    Просто разработчик
    joomla
    Ответ написан
    Комментировать
  • Какие технологии нужны для HTML5-игр?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Javascript + canvas. Никаких баз данных эта игра не использует. Все результаты хранятся как состояния и пропадут как только страница перезагрузится. Можно хранить на клиенте в localStorage результаты и рекорды, можно в indexedDB. Но в любом случае это нужно знать JS.
    Ответ написан
    Комментировать
  • Примеры шаблонов для админки?

    Prognosticator
    @Prognosticator
    TODO: Здесь будут ворованные умные мысли, типа мои
    Ответ написан
    Комментировать
  • Хотели бы вы видеть на телефоне фирменное приложение тостера?

    opium
    @opium
    Просто люблю качественно работать
    Нет ибо 90 процентов вопросов от школьников и ответ лежит в первой выдаче гугла.
    Ответ написан
    Комментировать
  • Хотели бы вы видеть на телефоне фирменное приложение тостера?

    Petroveg
    @Petroveg
    Миром правят маленькие с#@&ки
    Не, нам этого мало. Хотим национальную ОС.
    Ответ написан
    Комментировать
  • Почему на odesk в среднем у фрилансеров мало часов?

    buttersmai
    @buttersmai
    Нюанс №1: некоторые работают сразу на Odesk и Elance(я,например). И если посмотреть на мой профиль в Odesk, можно увидеть, что в последние полгода я работал часов 6. Зато через Elance - в десятки раз больше.

    Нюанс №2: некоторые ставят, скажем, 80$/час, а работают "всего" за 60$/час. Согласитесь, процент скидки похож, а сумма чуть больше.

    Нюанс №3: Некоторые заказчики предлагают платить "мимо" биржи. Например, мне один раз предлагали 50$/час либо на PayPal(без комиссии), либо на Odesk(с их комиссией мне выходило 45$/час). Согласился через Odesk.

    Нюанс №4: как указали коллеги выше, вас могут на каком-то этапе просто перехватить и сделать удаленным разработчиком в какой-нибудь конторе, где вы будете получать деньги уже не через биржу. Со мной такого не было, но с другими - случается.

    Нюанс №5: человек может иметь свой сайт-блог, и привлекать клиентов еще и через него(помимо Odesk и Elance). В этом случае, он также будет работать мимо бирж и часы светиться не будут.

    Так что, все хорошо. Просто нужно себя ценить и уметь продавать и качественно оказывать свои услуги. Я видел много профилей с хорошими рейтами и большим количеством отработанных часов. Видимо, вы не тех анализируете.
    Поставьте в фильтре odesk вот такие параметры, и найдете, кого ищете: 829b3d22781a44ac88b098e16129a500.JPG
    Ответ написан
    3 комментария
  • Go главный конкурент С или Python?

    @SilentFl
    Go может быть сравнен с python'ом по скорости разработки, надежности программ, легкости чтения кода; с С - скорость исполнения, уровень системного программирования.
    При создании Go не было цели сделать его конкурентом python'у или C, у него своя ниша - написание сетевых тулз, web-backend'а и прочего софта, от которого ждут надежности и скорости. ну и плюс особое внимание уделялось скорости компиляции.
    Ответ написан
    Комментировать
  • Silex framework. Как создать блог с CMS?

    viktorvsk
    @viktorvsk
    Если это все не троллинг, то, учитывая то, что вы не можете найти тривиальную информацию в гугле, то фреймворки точно рано использовать, надо найти какой-то другой подход
    Ответ написан
    1 комментарий
  • Важно ли знание английского языка в программировании?

    @drozdVadym
    Да, и чем дальше в лес тем больше нужно.
    Ответ написан
    Комментировать
  • При небольшой нагузке сервер nginx, centos один раз в день стабильно ложится. В чём может быть причина?

    lesovsky
    @lesovsky
    System engineer and PostgreSQL DBA
    1. каков cpu usage в момент лежания? интересует полностью строка %Cpu(s): из вывода top.
    2. интересует состояние все процессов nginx в момент валяния, можно получить с 'ps aux |grep nginx'
    3. смотрели в nginx/error_log и /var/log/messages на предмет криминала?
    Ответ написан
    1 комментарий
  • Роли пользователей в SPA и безопасность Angular

    Да, можно, множеством способов.
    Вы всегда должны исходить из недоверенного фронт-end-а. Фактически проверки, реализуемые на фронте - это некое дополнение, обеспечивающее удобство пользователю (узнать о недопустимом вводе прямо сейчас), но не безопасность.
    Ответ написан
    1 комментарий
  • Стоит ли перейти на linux

    MAXH0
    @MAXH0
    Перейти стоит.
    НО на вкус и цвет все фломастеры разные.
    Перед переходом ВНИМАТЕЛЬНО протестируйте железо на которое собираетесь ставить.
    Любая бяка с драйверами может надолго отбить охоту к переходу.
    Ответ написан
    5 комментариев
  • Стоит ли перейти на linux

    lesovsky
    @lesovsky
    System engineer and PostgreSQL DBA
    Да, несомненно стоит. Но не зацикливайтесь на одном дистрибутиве))
    Ответ написан
    Комментировать
  • Стоит ли использовать AngularJS вне концепции SPA?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Так же когда-то задавался подобным вопросом... По сути все резюмировано в этом вопросе на StackOverflow.
    stackoverflow.com/questions/15231251/is-angular-js...

    Если коротко - можно.
    Ответ написан
    Комментировать
  • Go + Nginx: научите использовать правильно

    Tyranron
    @Tyranron
    как лучше обращаться к Go, через Proxy или FastCGI?

    И так и так хорошо. Я все же предпочитаю вариант проксировать запросы на Go.

    Не могу проверить вообще, так как на рабочей машине Windows.

    Это не проблема, поставьте виртуалку и вперед. В конце-концов: личный опыт лучше любых объяснений.

    И ещё очень странный вопрос: нужно-ли при таком подходе компилировать Go? Просто где-то видел пример кода, когда обращаются к исходному файлу с расширением .go.

    Компилировать нужно, особенно в случае большого приложения.
    Да, можно сделать:
    go run file.go
    Но, во-первых, код все равно компилируется в бинарник и выполняется при таком подходе, просто это происходит в папке с временными файлами и как бы скрыто от Вас.
    Во-вторых, этот подход не катит, если в папке с проектом больше файлов нежели file.go (имеется в виду на уровне package main).
    В-третьих, это обязует Вас иметь установленный Go соответственной версии на production серверах, когда обычный бинарник этого не требует.
    В-четвертых, а как быть в таком случае с демонизацией и zero downtime reloads? Да, можно, но неудобно, учитывая что каждый раз нужно будет перекомпиливать.
    Лучше скомпилировать один раз и не заморачиваться.
    Команда go run больше подходит для небольших файлов аля скрипт для выполнения одноразовой работы и тому подобное.

    Прошу не кидать камнями, я только учусь правильному написанию веб-сайтов на Go.

    Учиться - всегда полезно, никто камнями кидать не будет.
    Ответ написан
    5 комментариев