• Для чего нужен singleton?

    @MarkusD
    все время мелю чепуху :)
    В буквальном смысле синглтон призван упростить владение, инициализацию, контроль времени жизни и доступ к элементам глобального состояния программы. Эта фраза является самой важной. А важнее всего - правильно понять ее.

    Подход многократно обличался антипаттерном за то, что "глобальное состояние программы - это зло", не смотря на то, что глобальное состояние продолжает оставаться в программе даже после удаления всех синглтонов из проекта.
    Я видел проекты с более чем 50 синглтонами и очень тяжелыми проблемами их связи между собой. В синглтоны без разбора и по незнанке вытаскивали буквально все. Это яркий пример антиподхода применения абсолютно любого паттерна.
    Важно понимать что никакой элемент проектирования не является антипаттерном, он приводит к проблемам только при неумелом использовании.

    Приложение состоящее ровно из одной UI формы будет иметь глобальное состояние в виде этой формы вне зависимости от того, будет ли эта форма оформлена как синглтон или нет. Просто, если нет, то этой формой приходится управлять иными путями, не всегда более удобными чем синглтон.

    В качестве альтернативы синглтонам пропагандируются два других подхода: Registry / Service locator и Dependency injection.
    К слову, все альтернативы столь же активно и все так же незаслуженно обзываются антипаттернами. :)

    Теперь к примерам.
    - DirectX. Для работы с графикой тебе необходимо по одной инстанции интерфейсов IDirect3D и IDirect3DDevice. Эти две инстанции декларируют глобальное состояние программы. Инстанции всех буферов, текстур, шейдеров и поверхностей создаются с использованием этих инстанций. Разумным будет предоставить доступ к инстанциям DirectX через подход синглтона.
    - OpenGL старых добрых версий. Процедурный интерфейс OpenGL как бы намекает на отсутствие необходимости в глобальном состоянии. Но не тут то было. Для работы с OpenGL необходимо не просто создать контекст, но еще и помнить поток, в котором этот контекст связан с поверхностью вывода. В многопоточной среде контекстов может быть несколько для параллельной загрузки ресурсов. В этом случае помнить надо уже два потока и два контекста (минимум). Само собой, в синглтоне это глобальное состояние смотрится удобнее.
    - Sockets. Не важно какие. Когда твое приложение представляет собой MMO проект и у тебя гора подсистем, постоянно и обособленно общающихся с сервером, сетевое подключение разумно оформить в виде синглтона.
    - Assets/Resources - они бывают разные, кешируемые и нет, доступные из сети, с жесткого диска, из подсистемы пререндеринга. Опять же, я несколько раз видел боль и страдания от неоднородного контроля ресурсов без соответствующей подсистемы. А сама подсистема управления ресурсами всегда централизована и лучше всего реализуется именно на синглтоне.

    Звук, ввод, многопоточный конвеер задач... вспоминать места явной необходимости синглтонов можно еще долго.
    Ответ написан
    Комментировать
  • Зачем люди просят забивать личные сообщения Вконтакте?

    Nexen2
    @Nexen2
    Web backend Yii2/Symfony Coder
    Представьте себе задачу - написать сеть ботов, имитирующих виртуальных людей с набором связей с друг другом, включая родственные и рабочие, общающиеся с дург другом, меняющие аватарки, статусы, пишущие иногда всякую мудрую пургу, цитирующих популярные паблики. Потом раз и выкладывающих ссылку на рекламируемый сайт. 2 недели прошло, еще ссылка.

    Вы не поверите, но строительство такой сети эдак на 20к ботов стоит порядочных денег. И есть тьма "уважаемых" предприятий, готовых платить за такую раскрутку ссылками. Эта задача была одной из причин (но не единственная) почему я уволился. Меня бесят пишущие мне боты, и я не собирался делать сеть из новых двадцати тысяч. Спрашиваете зачем вас просят что-то им написать или подружится с ними? Если это незнакомая вам личность, на 1/2 шанс что это бот, и ему нужно переписываться с реальным человеком, чтобы его не забанили.
    Ответ написан
    Комментировать
  • Зачем люди просят забивать личные сообщения Вконтакте?

    sashablashenkov
    @sashablashenkov
    О защиты от бана речи идти не может, эти просьбы просто для увеличения кол-ва непрочитанных диалогов
    0d6f0271f2f647cdba21d5291a5b43be.png
    Ответ написан
    Комментировать
  • Как генерировать случайные имена?

    qmax
    @qmax
    программер
    Марковские цепи помогут вычислить сочетаемость букв в именах, и выбирать наиболее "благозвучную" букву по контексту (префиксу).
    Метод архиэффективный и способен породить бесконечннешее количество слов.
    Но только если обучающая выборка достаточно большая.

    Мои рекомендации:
    Используйте длинну префикса 3-4 буквы (примерно длинна слога).
    Боле длинные префиксы будут порождать слова слишком похожие на исходные и их рекомбинации.
    Более короткие будут не очень благозвучны.
    Обязательно используйте символы начала и конца слова в качестве спец-буквы ('^' и '$'), просто пробела недостаточно, но уже не помню почему.

    Для имён имеет смысл генерить их с конца, поскольку окончания у имён специфичные, и рандом может долго не попадать на концевую цепочку, порождая излишне длинные слова. А при генерации с конца можно просто по критической длинне принудительно оборвать слово, или выйти на ближайшей остановке.

    Для хранения эффективно использовать префиксное дерево с частотами в качесве значений.
    Алгоритм составления словаря довольно простой:
    prefix = '^'
    for letter in text:
      freqdict[prefix+ letter] += 1 # увеличение счётчика этого сочетания
      if letter ='$':  # конец слова, сброс префикса
        prefix = '^'
      else:
        prefix = prefix[-depdth:] # обрезане префикса до максимальной длинны

    После этого нужно нормальизовать значения для каждого префикса, чтобы
    для каждого префикса сумма значений всех хвостов была = 1.
    При таком раскладе можно "склеить" частоты в единичный отрезок, разделёный на части пропорционально частоте, и рандомом выбирать "взвешенно-равномерно".

    Алгоритм генерации:
    prefix = '^'
    while prefix[-1] != '$':
      tails = freqdict[prefix].items() # под-дерево всех продолжений префикса в виде списка (key, value)
      thresh = random() # точка на единичном отрезке
      i = 0 # текущий элемент
      level = 0 # верхняя граница отрезка текущего элемента
      while thresh > level:
        level += tails[i][1]
        i++
      prefix += tails[i][0]


    Код написан по памяти, не принимайте на слово :)
    Наверно, мне уже пора выкладывать библиотеку для рыбогенерации...
    Ответ написан
    3 комментария
  • Что будет, если воровать контент с сайтов в массовом количестве?

    Ничего не будет. Но к вам начнут обращаться с просьбами/требованиями удалить контент, либо ссылку на первоисточник поставить. Внизу сайтов, которые грабите, читайте, обычно там пишут, как их можно "честно грабить" или нельзя вовсе.
    При любом использовании материалов, ссылка на первоисточник обязательна

    или
    Все права на любые материалы, опубликованные на сайте, защищены в соответствии с российским и международным законодательством об авторском праве и смежных правах. Любое использование текстовых, фото, аудио и видеоматериалов возможно только с согласия правообладателя.
    Ответ написан
    Комментировать
  • Что будет, если воровать контент с сайтов в массовом количестве?

    iiil
    @iiil
    Инженер и вэб-дизайнер, рисую.
    Есть канал cbs, а есть нтв. Если сериал показывают по cbs, то это скорее всего отличный сериал. Если по нтв, то это скорее всего ментовские войны. Так вот, для контента с сайта ВКонтакте - это cbs, а Ваше приложение - нтв. Первый делает им рекламу, Ваше же тупо ворует и паразитирует. Добейтесь такой же посещаемости, и Вы тоже будете cbs.
    Ответ написан
  • Почему браузеры начинают воспроизведение анимированных GIF до того, как они загрузятся полностью?

    @CheeseMaster
    Они просто показывают старания, чтобы их не сменили на другой браузер.

    Опера начинает гифку заново показывать (раньше, сейчас не сижу на ней), если она скрылась из показываемой области, удобно порой.
    Ответ написан
    1 комментарий
  • Как сервер, давший ссылку на приложение в Google Play, понимает, что было установлено приложение?

    @FoxInSox
    При первом запуске приложение шлет на сервер http запрос аля "меня запустили". Id утройства можно получить например так:

    Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID)
    Ответ написан
    6 комментариев
  • Как сделать, чтобы Android приложение не закрывалось из application switcher?

    Если нужно скрыть.
    <activity android:name="name.of.Activity" android:excludeFromRecents="true" ...>

    и еще вот тут много чего интересно модно найти
    Ответ написан
    Комментировать
  • Как применять холодные звонки (письма) во фрилансе?

    ZloyHobbit
    @ZloyHobbit
    Холодный обзвон/раасылка, это когда ты находишь в интернете спертый кем-то список рабочих телефонов/почтовых адресов людей, которые знать не знают про твой продукт и которым он нафиг не нужен. И начинаешь названивать всем подряд в надежде, кто-нибудь что-нибудь у тебя купит, чем страшно нервируешь население. А потом тебя находят те, кому ты звонил и ты понимаешь, что надо было "спилить антенну"...
    Ответ написан
    Комментировать
  • А как вы решили вопрос с закладками в Opera 15+?

    @artishok
    кратко
    Остался на 12 =)
    Ответ написан
    Комментировать
  • Как защитить данные, передваемые сервером мобильному приложению?

    а разве определение true/false клиент это не авторизация?
    или вас интересует метод авторизации реализованный без участия сервера?
    Ответ написан
    4 комментария
  • Сложное задание на собеседовании

    @Slko
    C++/C#/Python Developer
    Вопрос немножко некорректен. 32-битность здесь большой роли не играет (важно только, чтобы архитектура не была 8-битной, где длина типа int может быть равна длине типа char, но всё равно это тоже некорректно, т.к. размеры типов не зависят от разрядности архитектуры, надо было указывать разрядность типа int), роль играет порядок байт.
    Если little-endian (интеловский порядок), то в c помещается наименьший значащий байт числа, т.е. это эквивалентно x % 256.
    Если big-endian, то в c помещается наибольший значащий байт числа, т.е. это эквивалентно x >> 24 (для 32-битной архитектуры).
    Соответственно, для little-endian эта операция над числом 1 вернёт 1, для big-endian - 0.
    Двойной знак вопроса использовался в C (где нет типа bool) для нормализации значения (!!x эквивалентно x > 0 ? 1 : 0).
    В C++ ! возвращает bool, а результат двойного применения отрицания это, по сути, преобразование типа исходного значения к bool (!!x эквивалентно (bool)x).
    В любом случае, суть последнего выражения - возврат true/1, если архитектура little-endian, а иначе - false/0.
    То есть назвать эту функцию можно было IsLittleEndian().
    Ответ написан
    6 комментариев
  • Как вызвать метод SOAP?

    Ошибка в этой строчке
    WebRequest request = HttpWebRequest.Create("http://rain.kassir.ru:8080/kassirgate/");


    должно быть
    WebRequest request = HttpWebRequest.Create("http://rain.kassir.ru:8080/kassirgate/VenueService/");
    Ответ написан
    1 комментарий
  • Какие ачивки придумать для IT отдела?

    timych
    @timych
    Мне идея нравится - но ачивки должны быть исключительно поощерительными. Никаких там "говнокодер". Зачем "чмырить" своих работников?
    Ответ написан
    Комментировать
  • Какие ачивки придумать для IT отдела?

    @artishok
    кратко
    Начальник дурак
    Ответ написан
    Комментировать
  • Какие ачивки придумать для IT отдела?

    coxx
    @coxx
    Спросите команду. Они будут играть, если это будет их игра.
    Ответ написан
    Комментировать
  • Какие ачивки придумать для IT отдела?

    Anonym
    @Anonym
    Программирую немного )
    Уволился бы я от вас
    Ответ написан
    Комментировать
  • Есть ланчер с минимальными permissions (без доступа в интернет) для Android?

    @bimeg
    В сэмплах андроидных есть пример лаунчера - Home.
    Можно отрезать ему все пермишоны, подправить кодик, чтобы не падал. И будет не более чем запускалка приложений.

    https://drive.google.com/file/d/0B1nA_Wo_0muRSEhWS...
    Ответ написан
    1 комментарий