Как стать автором
Обновить
81
0
Eiren Rain @Eirenliel

Chasing Bits

Отправить сообщение

Google говорит «F*ck You, АНБ» и начинает шифровать трафик между дата-центрами

Время на прочтение2 мин
Количество просмотров90K
На прошлой неделе в СМИ попала информация о программе АНБ по перехвату трафика между дата-центрами Google непосредственно через оптоволоконные кабели (программа MUSCULAR). Идея в том, чтобы перехватывать трафик до того момента, как его шифруют между серверами фронтенда и компьютерами пользователя.


Рисунок АНБ с издевательским смайликом

На этой неделе газета The Washington Post опубликовала дополнительные сведения о программе MUSCULAR, в том числе фрагменты пакетной передачи из внутренней сети Google.
Читать дальше →
Всего голосов 219: ↑193 и ↓26+167
Комментарии76

Организация памяти в текстовом редакторе

Время на прочтение6 мин
Количество просмотров35K
Каждый, кто пытался запрограммировать хотя бы простейший редактор текста на низком уровне, сталкивался с задачей организации памяти для хранения редактируемого текста. Структура данных для хранения текста должна удовлетворять следующим требованиям:
  1. иметь малые накладные расходы по памяти. Большая часть доступной памяти должна использоваться для хранения текста, а не служебной информации;
  2. допускать эффективную вставку и удаление в произвольном месте текста.

Удовлетворить эти требования одновременно непросто. Если рассмотреть широкоизвестные структуры данных, такие как массивы, списки, деревья, стеки, очереди, кольцевые буфера — то такой структуры, которая бы позволила эффективно выполнить оба требования, не встречается. В случае массива имеем незначительные накладные расходы по памяти, но операция вставки имеет сложность O(n), где n — размер редактируемого текста. В случае списка сложность вставки и удаления составляет O(1), однако накладные расходы по памяти в несколько раз превышают размер собственно текста. Деревья, кучи, кольцевые буфера, ассоциативные массивы и прочие структуры и вовсе неприменимы для хранения текста в редакторе.

Встречаются гибридные решения, когда текст хранится в наборе массивов, которые, в свою очередь, объединены в список. Казалось бы, такой подход позволяет объединить преимущества массивов и списков (быстрая вставка/удаление при низких накладных расходах по памяти). Однако такое решение сложно в реализации. Также оно приводит к фрагментации памяти.

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

Несмотря на то, что эта структура данных была открыта давно и использовалась в текстовых редакторах на старых ЭВМ в 8-битную эпоху, это тайное знание предков было в значительной мере утеряно и в современных редакторах встречается редко. Попробуйте открыть файл, состоящий из одной строки мегабайт на 10, в Notepad или Far. Вставка и удаление символов будет длиться секундами.
Читать дальше →
Всего голосов 126: ↑119 и ↓7+112
Комментарии57

Регистрация глобальных нажатий клавиш с использованием JNA

Время на прочтение15 мин
Количество просмотров11K
Здравствуйте, в этой статье я расскажу вам как регистрировать глобальные нажатия клавиш из Java под Windows, Linux, BSD и Mac OSX с использованием отличной библиотеки JNA.

Для чего нужен JNA


Java с десктопом дружит сложно, для некоторых вещей нужно писать мосты для взаимодействия с операционной системой. Одной из таких функциональностей являются глобальные хоткеи, весьма популярные в аудио плеерах, когда даже в скрытом состоянии программой можно управлять с помощью определенных сочетаний клавиш или медиа-кнопок. На помощь приходит JNA — надстройка над jni и libffi для вызова нативных библиотек, она поддерживает почти все популярные платформы, разрабатывается уже долгое время и весьма стабильна.

Для джавы уже есть несколько достаточно стабильных библиотек для всех платформ: JIntelliType для Windows, которая даже поддерживает медиа-кнопки, JXGrabKey для систем Linux, и ossuport-connector для Mac OSX. Однако, все они используют jni, имеют разный интерфейс, и с библиотеками на jni не всегда удобно работать, потому что нужно прописывать пути к нативным библиотекам, разбираться с разрядностью системы и пр. Плюс это будет интересным упражнением по использованию JNA, потому что эту задачу можно сделать полностью на java достаточно малыми усилиями и получить легко поддерживаемый кроссплатформенный код.
Читать дальше →
Всего голосов 23: ↑23 и ↓0+23
Комментарии11

Линейная алгебра для разработчиков игр

Время на прочтение19 мин
Количество просмотров782K
Эта статья является переводом цикла из четырёх статей «Linear algebra for game developers», написанных David Rosen и посвящённых линейной алгебре и её применению в разработке игр. С оригинальными статьями можно ознакомиться тут: часть 1, часть 2, часть 3 и часть 4. Я не стал публиковать переводы отдельными топиками, а объединил все статьи в одну. Думаю, что так будет удобнее воспринимать материал и работать с ним. Итак приступим.
Читать дальше →
Всего голосов 314: ↑296 и ↓18+278
Комментарии61

Из чего складывается цена физического товара, и зачем нужно локализовывать игры без слов

Время на прочтение6 мин
Количество просмотров98K

Локализованная игра. Слов тут нет.

Экономика — очень прикольная штука, которая часто заставляет делать странные вещи. Например, есть игра «7 на 9», в которой нет ни одного английского слова, только цифры. И всё же мы занялись её локализацией для того, чтобы иметь возможность продавать почти в два раза дешевле.

Вообще, в каждой сфере начиная от продажи железа и заканчивая косметикой, есть огромное количество мифов про настоящую цену товара. Например, многим вспоминается фраза, что себестоимость кроссовок Адидас — 2 бакса, а остальное они добавляют за логотип. Ещё некоторые не верят, что обычные налоги в нашей стране составляют больше 50%, потому что привыкли к «разрекламированным» 13%.

Вот про эти мифы я и поговорю на примере точного образования цены настольной игры.
Читать дальше →
Всего голосов 143: ↑137 и ↓6+131
Комментарии100

Автономная кроссплатформенная монолитная программа на Java

Время на прочтение21 мин
Количество просмотров62K
Я люблю desktop-приложения. Признаваться в этом нынче, похоже, стыднее, чем в связях с иностранной разведкой, но это так. Нет, это не значит, что я не люблю интернет-технологии. Более того, некоторые я не только уважаю, а даже более-менее знаю. Но, тем не менее, я скучаю по тем временам, когда программа писалась на одном компьютере, потом компилировалась и запускалась на других, разных компьютерах. Тогда везде (почти) была одна система — Windows с одной и той же API, почти не было проблем совместимости на уровне приложений, никто не материл разработчиков браузеров — все берегли нервы на разработчиков WinAPI, которые умудрялись создавать конфликты даже внутри нее одной. Но это я, конечно, иронизирую, а если серьезно — иногда и сейчас хочется написать просто desktop-приложение, да так, чтобы работало оно на всех популярных системах. Трудно? Если подумать и покопать, то не очень.

Еще я люблю языки высокого уровня с аккуратной архитектурой и строгой типизацией. Мои фавориты — Java и C#. Оба они предоставляют разработчику множество преимуществ по сравнению с C++, оба избавляют от ряда забот. Чем приходится платить? Тем, что таскаешь за собой тяжелую колоду, которая называется Oracle JVM, .NET или mono. Все три колоды весят сотни мегабайт и лицензию имеют такую, что каждый пользователь вынужден качать эту штуку сам, не путая при этом разрядность своего компьютера, а главное — программа на Java не может быть совместима со всеми версиями JVM разом, не так ли? И вот — мы приходим к тому, что просто скинуть программку другу (или миллиону друзей) и не заботиться о том, что она у него не запустится, не выходит. Приходится делать хитрые сетапы, вбивать костыли, и это я еще не упомянул .NET — однажды я видел у друга сразу 3 установленных версии, причем все три были нужны разным приложениям…

Стоп! А давайте напишем программу на Java, но так, чтобы она не требовала установки на машину какой-либо JVM, чтобы одним касанием собиралась под Windows, Linux и OS X и чтобы при этом занимала совсем чуть-чуть; так, чтобы никто даже не понял, что она написана, скажем, не на C. Невозможно? Совсем наоборот! (И нет, я имею в виду не gcj, который лишает Java всех ее прелестей. Рефлексия будет работать и даже сторонние jar вы сможете запускать).

Ну и как это сделать?
Всего голосов 156: ↑146 и ↓10+136
Комментарии80

Оптимизируем, оптимизируем и еще раз оптимизируем

Время на прочтение5 мин
Количество просмотров24K
По долгу службы мне периодически приходится пользоваться профайлером, так как требования к производительности серверов задокументированы и не могут опускаться ниже определенного уровня. Помимо некоторых очевидных архитектурных изменений и решений частенько находятся повторяющиеся места от модуля к модулю, от одного проекта к другому, которые создают дополнительную нагрузку на виртуальную машину, которыми и хочу поделиться.
Так уж случилось, что на глаза чаще всего попадался код работы с Date потому с него и начнем:

Date

Не один десяток раз я имел возможность наблюдать, как во время обработки одного запроса от пользователя в нескольких разных местах создается новый объект даты. Чаще всего цель одна и та же — получить текущее время. В простейшем случае это выглядит так:

    public boolean isValid(Date start, Date end) {
        Date now = new Date();
        return start.before(now) && end.after(now); 
    }

Казалось бы — вполне очевидное и правильное решение. В принципе, да, за исключением двух моментов:
  • Использовать Date сегодня в java — уже, пожалуй, моветон, учитывая тот факт, что почти все методы в нем уже Deprecated.
  • Нету смысла создавать новый объект даты, если вполне можно обойтись примитивом long:

    public boolean isValid(Date start, Date end) {
        long now = System.currentTimeMillis();
        return start.getTime() < now && now < end.getTIme(); 
    }


SimpleDateFormat

Очень часто в веб проектах возникает задача перевести строку в дату или наоборот дату в строку. Задача довольно типичная и чаще всего выглядит так:

    return new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z").parse(dateString);

Это правильное и быстрое решение, но если серверу приходится парсить строку на каждый пользовательский реквест в каждом из сотен потоков — это может ощутимо бить по производительности сервера в виду довольно тяжеловесного конструктора SimpleDateFormat, да и помимо самого форматера создается множество других объектов в том числе и не легкий Calendar (размер которого > 400 байт).

Ситуацию можно было бы легко решить, сделав SimpleDateFormat статическим полем, но он не является потокобезопасным. И в конкурентной среде легко можно словить NumberFormatException.

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

Но решения есть и их как минимум 2:
  • Старый, добрый ThreadLocal — cоздаем SimpleDateFormat для каждого потока 1 раз и переиспользуем для каждого последующего запроса. Данный подход поможет ускорить парсинг даты в 2-4 раза за счет избежания создания объектов SimpleDateFormat на каждый запрос.
  • Joda и ее потокобезопасный аналог SimpleDateFormat — DateTimeFormat. Хоть йода в целом и медленнее дефолтного Java Date API в парсинге дат они идут наравне. Несколько тестов можно глянуть тут.

Читать дальше →
Всего голосов 50: ↑38 и ↓12+26
Комментарии34

Не паникуй (перевод главы книги «Passionate Programmer» by Chad Fowler)

Время на прочтение7 мин
Количество просмотров65K

Почему эта книга заслуживает перевода


Хочу поделиться своим мнением с хабрасообществом о книге «Passionate Programmer», перевод одной из глав которой представлен ниже. Книга вышла в 2009 году, но среди российских программистов она не очень широко известна, тем не менее многие, кто познакомился с ней, считают её очень достойной. Чад Фаулер (автор книги) выложился очень хорошо, чтобы передать читателям свой богатый опыт (на данный момент он CTO 6Wunderkinder, имеет более 20 лет стажа разработки и в виду своего большого опыта и круга интересов он желанный гость на Ruby- и IT-конференциях). Да, уже и не помню как нашёл эту книжку, но помню, что именно предисловие от Кента Бека (идейный вдохновитель Test Driven Development и Extreme Programming) послужило причиной прочитать её.

В этой книге нет описания конкретных технологий, алгоритмов и т.п., но есть просто куча советов, касательно того, с чем порой сталкивается любой разработчик: отсутствие мотивации, выбор приоритетов, психология программирования, отношения с руководством и коллегами; по большому счёту даётся масса наставлений, о том как сделать яркую карьеру программиста. Конечно, опытные разработчики могут найти некоторые его идеи достаточно очевидными, но для тех, кто только в самом начале своей карьеры, чтение данной книги, определённо, будет хорошим вложением времени. Большой плюс, что книга читается очень легко и, если вы достаточно хорошо владеете английским, её реально прочитать всего лишь за несколько дней. Просто интересно, почему наши издательства ещё не перевели её на русский язык?

После прочтения книги я заинтересовался Чадом. Нашёл его блог в сети. Как оказалось, он начал выкладывать в нём главы из своей книги (на данный момент опубликовано 2 главы из 53). Я спросил разрешения на перевод для хабра, он ответил, что это хорошая идея, но только сначала мне надо отправить ему письмо с тем, что конкретно я хочу переводить (видимо это пожелание было как-то связано с тем издательством, где была опубликована книга). После моего ответа неделю было молчание, я отправил повторное письмо — ответа снова не было. Потом я получил от него приглашение на Wunderlist (сервис, за который он отвечает на данный момент). В общем, я посчитал, что если явного запрета не было, а эти главы уже и так находятся в свободном доступе, и он ещё не совсем про меня забыл, то делать перевод можно. В общем, если перевод сообществу окажется полезным, я продолжу переводить другие главы. В тексте возможны ошибки (делал вычитку несколько раз, но всё же вдруг), поэтому заранее прошу прощения и прошу сообщать мне обо всех проблемах через личные сообщения.


Читать перевод
Всего голосов 87: ↑83 и ↓4+79
Комментарии24

Почему проекты в IT занимают в 2-3 раза дольше, чем планируется?

Время на прочтение3 мин
Количество просмотров24K
Мы с другом решаем пойти в поход от Сан Франциско до Лос Аджелеса, чтобы заскочить в гости к нашим друзьям на Ньюпорт Бич. Посмотрим на карту и примерно прикинем путь по берегу:

image

Путь займёт около 400 миль, в день мы можем пройти 4 мили в час по десять часов, так что придём мы туда примерно через 10 дней. Мы звоним друзьям и бронируем столик на 6 вечера в воскресенье.

Читать дальше →
Всего голосов 278: ↑262 и ↓16+246
Комментарии181

Free2Play MMORPG. Типы игроков и их монетизация

Время на прочтение19 мин
Количество просмотров108K
Уже два года как я не работаю в геймдеве. Соответственно, появилось время и желание обобщить мысли об этом бизнесе безобразии. От откровенно хулиганских, до претендующих на исследование.

Тем не менее, с хулиганского начну лишь отчасти: классификации игроков по тому, что они хотят в игре и от игры. Она не полна и спорна, но снабжена занимательными комментариями и завершается грандиозным мысленным экспериментом на примере известного анекдота.

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

Поехали?
Читать дальше →
Всего голосов 126: ↑99 и ↓27+72
Комментарии170

Прошлое роста производительности: конец гонки частот, многоядерность и почему прогресс увяз на одном месте

Время на прочтение6 мин
Количество просмотров131K

КДПВ: одна из попыток Intel создать демотиватор :)

Почти 10 лет назад Intel сообщил о закрытии проектов Tejas и Jayhawk – продолжателей архитектуры NetBurst (Pentium 4) в направлении увеличения тактовой частоты. Это событие фактически ознаменовало переход в эпоху многоядерных процессоров. Давайте попробуем разобраться чем это было обусловлено, и какие принесло результаты.
Читать дальше →
Всего голосов 154: ↑147 и ↓7+140
Комментарии160

Сбор и анализ статистики во free-to-play играх

Время на прочтение9 мин
Количество просмотров50K
Если вы разрабатываете free-to-play игры, то вам наверняка интересны вопросы, связанные со сбором и анализом статистики. Почему? Потому что статистика – это важная составляющая успеха free-to-play игр.
Цель моего цикла статей – структурировать разношерстную информацию по данному вопросу, пропустить ее через призму нашего опыта и выдать рекомендации по тому,

  • какие показатели стоит отслеживать в играх;
  • какие инструменты анализа могут помочь в работе со статистикой;
  • какие сервисы сбора и анализа статистики существуют с их достоинствами и недостатками.
Читать дальше →
Всего голосов 10: ↑10 и ↓0+10
Комментарии6

Яндекс вступил в W3C

Время на прочтение1 мин
Количество просмотров25K
Сегодня Яндекс вступил в World Wide Web Consortium. W3C разрабатывает и внедряет самые важные и основополагающие стандарты веба, включая такие, как HTML5 или новые версии CSS. Мы в рамках консорциума будем участвовать в обсуждениях и разработке тех из них, которые кажутся нам наиболее важными и влияющими на то, каким будет не только Рунет, но и интернет в целом. Представителем Яндекса в W3C будет Charles McCathie Nevile.

image

Читать дальше →
Всего голосов 152: ↑138 и ↓14+124
Комментарии75

PHP: фрактал плохого дизайна

Время на прочтение32 мин
Количество просмотров206K

Предисловие


Я капризный. Я жалуюсь о многих вещах. Многое в мире технологий мне не нравится и это предсказуемо: программирование — шумная молодая дисциплина, и никто из нас не имеет ни малейшего представления, что он делает. Учитывая закон Старджона, у нас достаточно вещей для постижения на всю жизнь.

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

PHP — единственное исключение. Фактически каждая деталь PHP в какой-то мере поломана. Язык, структура, экосистема: всё плохо. И даже нельзя указать на одну убийственную вещь, настолько дефект систематичный. Каждый раз, когда я пытаюсь систематизировать недостатки PHP, я теряюсь в поиске в глубину обнаруживая всё больше и больше ужасных мелочей(отсюда фрактал).

PHP — препятствие, отрава моего ремесла. Я схожу с ума от того, насколько он сломан и насколько воспеваем каждым уполномоченным любителем нежелающим научиться чему-либо ещё. У него ничтожно мало оправдывающих положительных качеств и я бы хотел забыть, что он вообще существует.
Читать дальше →
Всего голосов 450: ↑392 и ↓58+334
Комментарии539

0.5% интернета может быть недоступно для пользователей Hamachi

Время на прочтение1 мин
Количество просмотров26K
image
Hamachi — достаточно распространенная программа для создания VPN сетей.

Недавно мы купили сервер в Hetzner, серверу был выдан ip 5.9.28.205. Некоторые пользователи начали жаловаться на недоступность сайта. После недолгого исследования обнаружили, что у них установлена программа Hamachi. Она для внутренних нужд используется публичную подсеть 5.0.0.0/8. Долгое время эта подсеть была нераспределена, но адреса заканчиваются, поэтому в ноябре 2010 года она была передана в RIPE. А с недавних пор раздаётся уже конечным пользователям. Если Hamachi установлена, то она прописывает маршрут и пускает весь трафик с 5.0.0.0/8 через себя, и на реальные сайты зайти невозможно.
Читать дальше →
Всего голосов 57: ↑53 и ↓4+49
Комментарии44
2

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Зарегистрирован
Активность