Как стать автором
Обновить
4
Андрей @Lure_of_Chaosread⁠-⁠only

Программист

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

Приключения в математическом лесу фрактальных деревьев

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


Перевод поста Bernat Espigulé Pons, «Adventures into the Mathematical Forest of Fractal Trees».
Скачать перевод в виде документа Mathematica, который содержит весь код использованный в статье, можно здесь.


Без сомнения, золотое сечение и в наше время представляется одним из самых таинственных, волшебных и поразительных чисел, которые известны людям: Prikljuchenija-v-matematicheskom-lesu-fraktalnyh-derevev_1.png. (в языке Wolfram Language и системе Mathematica ему соответствует символ GoldenRatio). Как вы увидите из этого поста, это число действительно имеет множество интересных свойств, которые можно исследовать, причём некоторые из них рассматривались ещё в работах учёных Древней Греции, таких как Пифагор и Евклид, другие в работах итальянского математика Леонардо Пизанского, более известного под прозвищем Фибоначчи, или Иоганном Кеплером — астрономом эпохи Возрождения. Хотя это может прозвучать странно, в этом посте я расскажу вам о новых геометрических объектах, связанных с золотым сечением, которые осветили мне путь, когда я пытался отобразить неизвестную ранее область Математического Леса.
Читать дальше →
Всего голосов 61: ↑58 и ↓3+55
Комментарии6

Как была взломана Gamma International

Время на прочтение12 мин
Количество просмотров87K
image

3 августа в сабреддите /r/Anarchism некто пользователь PhineasFisher создал тред, в котором сообщил о том, что ему удалось украсть 40 гигабайт различных данных компании Gamma International. Возможно, подобная история могла оказаться не столь громкой, если бы не бизнес, которым занимается эта европейская фирма — создание и продажа программных средств для взлома и скрытой слежки (а иными словами — самой настоящей малвари), заказчиками которых обычно выступали государственные структуры. Через несколько дней после первого сообщения взломщик выложил длинный рассказ о том, как ему удалось проникнуть на сервера Gamma International и что удалось там найти.

Читать дальше →
Всего голосов 107: ↑106 и ↓1+105
Комментарии28

Папа, а почему на ноль делить нельзя?

Время на прочтение6 мин
Количество просмотров238K
Моя трёхлетняя дочка София в последнее время частенько упоминает «ноль», например, в таком контексте:
— Соня, вот ты вроде сначала не послушалась, а затем послушалась, что же получается?..
— Ну… ноль!

Т.е. ощущение отрицательных чисел и нейтральности нуля уже имеет, о как. Скоро поинтересуется: почему же это на ноль делить нельзя?
И вот решил я простыми словами записать всё, что я ещё помню про деление на ноль и всё такое.
Читать дальше →
Всего голосов 262: ↑192 и ↓70+122
Комментарии281

TDD — «утка». Введение в Quack-Driven Development. Современная waterfowl-методология для программистов

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


Предлагаю к ознакомлению вольный перевод статьи Джейсона Хатчерса «TDD(1) is ‘canard. Tell it to the Duck» или дословно: «TDD — Утка. Скажи это утке». (2)

Автор критикует «ортодоксальный» TDD подход к разработке и предлагает альтернативный.

И, да, в заголовке статьи нет опечатки (3).

Читать дальше →
Всего голосов 32: ↑23 и ↓9+14
Комментарии21

Асинхронный JavaScript: без колбеков и промисов

Время на прочтение7 мин
Количество просмотров42K
Наверное, каждый, кто использовал JavaScript, когда-либо сталкивался (или столкнётся в будущем) с асинхронными вызовами. Может быть, это будет обращение к базе на стороне сервера. Может быть — работа с таймером для создания анимации на сайте.

Для того, чтобы «побороть» асинхронность, используются разные инструменты от промисов до смены языка программирования. Но иногда очень хочется бросить всё и написать на чистом JS линейный код:

timeout(1000);
console.log('Hello, world!');


Можно ли реализовать нечто подобное? Разумеется, можно.
В данной статье мы рассмотрим один опасный, но действенный способ.
Читать дальше →
Всего голосов 70: ↑57 и ↓13+44
Комментарии32

Grub 2 + VHD: установка и загрузка ОС Windows 7 Ultimate

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

Введение


Ни для кого уже не секрет, что начиная с версии Windows 7 Ultimate, операционные системы от Майкрософт умеют загружаться будучи установленными на образ жесткого диска формата VHD. Однако, данная возможность «из коробки» доступна только пользователям этой самой Windows 7 Ultimate.

У меня же, убежденного пользователя Arch Linux, потребность в применении этой технологии возникла из-за необходимости иметь винду под рукой в дуалбуте и именно в реальном окружении. 90% процентов задач, для которых нужен Windows, разумеется решаются путем виртуализации, и мощности современного железа, и возможности виртуальных машин, позволяют даже в игры играть в виртуальной среде. Однако, возникла необходимость в использовании пакета «Универсальный механизм», который под вайном работает криво (допускаю и что руки у меня кривые), а в виртуальной среде, понятное дело, безбожно теряет прыть. В общем понадобилась Windows, но таскать разделы на винте и менять его разметку страшно не хотелось ради установки одной программы под винду.

Решение нашлось в реализации загрузки из VHD-образа с использованием загрузчика Grub2, ставшего стандартом де-факто во многих популярных дистрибутивах Linux. Об этом собственно и пойдет речь.

Какие преимущества перед стандартной установкой Windows в дуалбут с линуксом дает такая методика:

  • Весь процесс установки и настройки выполняется в среде OS Linux, с использованием менеджера виртуальных машин VirtualBox
  • Раздел, где хранятся образы может быть любого типа: первичный или логический. Он не обязательно должен быть активным
  • Количество устанавливаемых систем ограничено лишь размерами NTFS раздела. Все системы изолированы друг от друга
  • Не происходит перезапись MBR, линукс-загрузчик остается нетронутым
  • При замене HDD можно просто скопировать Linux (содержимое всех разделов, подробнее об этом здесь) на новый винт, рекурсивно с сохранением атрибутов, установить Grub 2 на новый винт и вуаля — Ваши Windows- системы перенесутся как ни вчем не бывало. Это удобно


Итак, перейдем к описанию метода.

Читать дальше →
Всего голосов 32: ↑29 и ↓3+26
Комментарии33

10 занимательных задач

Время на прочтение5 мин
Количество просмотров100K
image
Иллюстрация к последней задаче.

Существуют задачи с простыми и, казалось бы, очевидными решениями, которые, однако, трудно найти. При их решении опасно полагаться на интуицию, ведь правильный ответ зачастую совсем не совпадает с тем, который она подсказывает. В данной статье я предлагаю подборку из 10 таких заданий, упорядоченных по возрастанию сложности; их решения убраны под спойлер. Для получения верных ответов не нужно обладать какими-то специальными знаниями, достаточно лишь находчивости и знания школьной программы.

Перейти к задачам
Всего голосов 59: ↑40 и ↓19+21
Комментарии118

Function Pointer — забытая реализация шаблона Singleton

Время на прочтение4 мин
Количество просмотров13K
Много статей написано о том, как правильно реализовывать на Java шаблон проектирования Singleton.

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

Лично я считаю единственным корректным способом реализации синглтона на Java так называемый Synchronized Accessor:

public class Singleton {
    private static Singleton instance;
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}


Именно так задумывали реализацию подобной задачи авторы виртуальной машины Java, именно такая реализация используется в стандартной библиотеке классов языка Java. Если же для программы метод доступа к синглтону становится узким местом, то это повод для того, чтобы произвести редизайн программы, чтобы она обращалась к глобальному объекту не так часто.

Однако, пытаясь освежить в памяти возможности Java concurrency, я почитал старые статьи о вариантах синглтонов и удивился, что не нахожу описания еще одного способа, который я называю Function Pointer.
Читать дальше →
Всего голосов 29: ↑21 и ↓8+13
Комментарии73

Спидран по 13 уязвимостям на сайтах. Основные понятия, и средства защиты

Время на прочтение8 мин
Количество просмотров70K
Недавно по работе собирал своего рода лекцию по веб-безопасности, ознакомился с известным рейтингом уявзимостей OWASP 2013 года, но с удивлением обнаружил, что корректной инфы на русском языке крайне мало, или её практически нет.

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

Некоторые из предоставленных в списке уязвимостей уже расписаны и не раз — известный факт, но без них список был бы неполным. Поэтому сразу дам небольшое содержание поста:

Читать дальше →
Всего голосов 68: ↑57 и ↓11+46
Комментарии29

Беззнаковая арифметика в Java

Время на прочтение5 мин
Количество просмотров94K
Как известно, в Java нет беззнаковых типов. Если в Си вы могли написать unsigned int (char, long), то в Java так не получится. Однако нередко возникает необходимость в выполнении арифметических операций именно с числами без знака. На первый взгляд кажется, что беззнаковые типы в принципе-то и не особо нужны (подумаешь, MaxInt для чисел со знаком меньше в два раза, если нужны числа больше, я просто возьму long и далее BigInteger). Но основное различие на самом деле не в том, сколько различных неотрицательных чисел можно положить в signed или unsigned int, а в том, как над ними производятся арифметические операции и сравнения. Если вы работаете с бинарными протоколами или с двоичной арифметикой, где важен каждый используемый бит, нужно уметь выполнять все основные операции в беззнаковом режиме. Рассмотрим эти операции по порядку:

Преобразование byte в short (int, long)


Обычный каст (int) myByte выполнит расширение до 32 бит со знаком — это означает, что если старший бит байта был установлен в 1, то результатом будет то же самое отрицательное число, но записанное в 32-битном формате:

0xff -> 0xffffffff (-1)

Часто это не то, чего бы мы хотели. Для того, чтобы выполнить расширение до 32 бит без знака и получить 0x000000ff, в Java можно записать:

int myInt = myByte & 0xff;
short myShort = myByte & 0xff;

Сравнение без учёта знака


Для беззнакового сравнения есть лаконичная формула:

int compareUnsigned(int a, int b) {
    return Integer.compare( a ^ 0x80000000, b ^ 0x80000000 );
}

Для byte, short и long, соответственно, константы будут 0x80, 0x8000 и 0x8000000000000000L.
Читать дальше →
Всего голосов 46: ↑44 и ↓2+42
Комментарии27

Как собрать WhatsApp за сутки. Часть 1

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


Здравствуйте, дорогие читатели Хабрахабра!

В этой серии статей я расскажу, как быстро и почти безболезненно поднять свой собственный WhatsApp под iOS. Статью делю на две части для вашего удобства:

  1. Создание проекта, простой UI, привязка к сервису мгновенных сообщений
  2. Делаем красивый UI, добавляем видео и аудио звонки, передачу фото и документов

К сожалению, пособие о том, как набрать 400 000 000 пользователей и продать сервис за 19 Инстаграмов, затерялось где-то на книжной полке. Постараюсь его найти, если кому интересно.

Заинтересовавшихся прошу под кат.
Читать дальше →
Всего голосов 178: ↑146 и ↓32+114
Комментарии55

Создание Zero Player Game, используя libgdx

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

Идея


  1. Игровое пространство — клетчатое поле ограниченное рамкой
  2. Существующие типы клеток:
    • Пустая клетка — белый
    • Стена — чёрный
    • Зверь — красный
    • След — коричневый
    • Дом — зелёный
  3. Перемещение зверя оставляет неисчезающий след
  4. При запуске генерируется лабиринт
  5. Зверь знает состояние соседних клеток и на основании этого строит карту при перемещении
  6. При перемещении зверь расходует силы, которые восстанавливаются в доме(+5) или на любой клетке(+1)
  7. При столкновении звери объединяются в стаи(дома переносятся в соседние точки), если несколько зверей одновременно отдыхают в доме их карты объединяются
  8. (Не реализовано)Разные «кланы» случайным образом объединяются или воюют
  9. (Не реализовано)Генетический алгоритм для различных поведений зверей, случайно перемешивающиеся при размножении(+мутации), более перспективный вид выживет в войнах

Читать дальше →
Всего голосов 30: ↑25 и ↓5+20
Комментарии2

[ libGDX ] Пишем полноценную игру под Android. Часть 1

Время на прочтение8 мин
Количество просмотров116K
Здравствуйте! Я решил попробовать себя на поприще game-dev'а и заодно рассказать и показать как это было. Вторая часть здесь.

Игра представляет собой экран, на котором расположены созвездия. Каждая звезда этого созвездия имеет свой цвет (нота). Например, ноту «До» обычно представляют красным цветом, а «Ми» — желтым. Вот что получится в итоге:

image

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

Писать будем, используя фреймворк libGDX. Мне он больше всех понравился, как новичку в этом деле. Да и информации по нему я нашел больше. Итак, приступим.
Читать дальше →
Всего голосов 44: ↑38 и ↓6+32
Комментарии20

Дорог ли native метод? «Секретное» расширение JNI

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

Для чего Java-программисты прибегают к native методам? Иногда, чтобы воспользоваться сторонней DLL библиотекой. В других случаях, чтобы ускорить критичный алгоритм за счет оптимизированного кода на C или ассемблере. Например, для обработки потокового медиа, для сжатия, шифрования и т.п.

Но вызов native метода не бесплатен. Порой, накладные расходы на JNI оказываются даже больше, чем выигрыш в производительности. А всё потому, что они включают в себя:
  1. создание stack frame;
  2. перекладывание аргументов в соответствии с ABI;
  3. оборачивание ссылок в JNI хендлы (jobject);
  4. передачу дополнительных аргументов JNIEnv* и jclass;
  5. захват и освобождение монитора, если метод synchronized;
  6. «ленивую» линковку нативной функции;
  7. трассировку входа и выхода из метода;
  8. перевод потока из состояния in_Java в in_native и обратно;
  9. проверку необходимости safepoint;
  10. обработку возможных исключений.

Но зачастую native методы просты: они не бросают исключений, не создают новые объекты в хипе, не обходят стек, не работают с хендлами и не синхронизованы. Можно ли для них не делать лишних действий?

Да, и сегодня я расскажу о недокументированных возможностях HotSpot JVM для ускоренного вызова простых JNI методов. Хотя эта оптимизация появилась еще с первых версий Java 7, что удивительно, о ней еще никто нигде не писал.
Читать дальше →
Всего голосов 48: ↑47 и ↓1+46
Комментарии23

Быстрое веб-приложение — трепанация сети

Время на прочтение10 мин
Количество просмотров33K
Психология — интересная и иногда полезная наука. Многочисленные исследования показывают, что задержка в отображении веб-страницы дольше 300 мс заставляет пользователя отвлечься от веб-ресурса и задуматься: «что за хрень?». Поэтому УСКОРИВ веб-проект до психологически невоспринимаемых значений, можно ПРОСТО удерживать пользователей дольше. И именно поэтому бизнес готов тратиться на скорость: $80М — чтобы уменьшить latenсy всего на 1 мс.



Однако, чтобы ускорить современный веб-проект, придется кровушки пустить и основательно покопаться в этой теме — поэтому базовое знание сетевых протоколов приветствуется. Зная принципы, можно без особых усилий ускорить свою веб-систему на сотни миллисекунд всего за несколько подходов. Ну что, готовы сэкономить сотни миллионов? Наливайте кофе.
Читать дальше →
Всего голосов 83: ↑66 и ↓17+49
Комментарии42

JPHP — Новый движок php для Java VM + JIT

Время на прочтение6 мин
Количество просмотров49K
Представляю вам свой open-source проект — JPHP. Это альтернативная реализация PHP для JavaVM с поддержкой JIT. Я начал проект в одиночку в октябре 2013 года и за 4 месяца реализовал компилятор php в байткод JVM. Язык поддерживается на уровне PHP 5.3, частично поддерживаются возможности PHP 5.4 и 5.5. По своей идеологии проект напоминает JRuby и Jython.

Я подготовил небольшую презентацию, которая расскажет о проекте и не отнимет у вас много времени:


Читать дальше →
Всего голосов 190: ↑185 и ↓5+180
Комментарии108

ХабраFAQ про поиск работы в интернете

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

Часть кода поиска вакансий на hh.ru

Большинство вопросов от наших пользователей вполне очевидные, вроде «Почему работодатель мне не отвечает» или «Как создать хорошее резюме?».
Но попадаются очень необычные, способные прокачать уровень любого, кто хоть раз искал работу в интернете. Именно их мы постарались собрать в этой заметке, вдохновленной примером.

— Существует ли на hh.ru черный список соискателей и работодателей?
Нет, черного списка не существует. Его нет у HeadHunter и, насколько нам известно, у других сервисов тоже. В споре работодателей и соискателей джоб-сайт не может встать на чью-то сторону, поэтому решать спорные моменты с опоздавшими соискателями и рекрутерами-фантазерами сторонам нужно самостоятельно — в 99% это какие-то обиды.
Но есть отдельные блокировки компаний-мошенников (например, пытающихся под прикрытием подбора сотрудников продавать свои услуги) и соискателей-мошенников, преследующих все время разные, какие-то невообразимые цели.

— Будет ли индексироваться мое резюме в поисковиках?
Все резюме в данный момент у нас запрещены для индексации в поисковых системах, даже если выбрано условие видимости «видно всему интернету». Было бы здорово их открыть, но для людей, ищущих работу это принесет только головную боль (например, удалится оно из поисковиков далеко не сразу после желания пользователя), поэтому мы так делать не будем. Насколько нам известно, у других джоб-сайтов так же.
Читать дальше →
Всего голосов 51: ↑46 и ↓5+41
Комментарии27

Роботы-термиты реализуют проект без централизованной координации

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


Группа молодых ученых, а конкретно две очаровательных девушки и один юноша из Института Виза*, сотрудничающего с Гарвардом, создали мини-роботов, повторяющих сложное поведение термитов при постройке термитников. Исходили из следующих предпосылок:

  • сооружения достаточно сложны
  • каждый участник процесса не обладает развитым интеллектом
  • весь проект не имеет генерализованной координации


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

Читать дальше →
Всего голосов 100: ↑90 и ↓10+80
Комментарии31

А таки давайте напишем инструмент для написания писем Дяди Федора!

Время на прочтение6 мин
Количество просмотров8.6K
image
Читаю я вчерашний пост простоквашино на Хабре или письмо Дяди Федора. Мысль интересная, но.

Комментарии пугают.

Поясню почему.

Комментарии там условно можно разделить на два вида

  • «как много помещается ангелов на конце иглы» «о сортировке дат»,
  • «как забивать гвозди электронным микроскопом» «мы напишем что-то такое большое в энтерпрайзненьком стиле».


Душа поэта не выдержала, нашел полчаса, и нарисовал userscript.

Скрипт прост до ужаса — перебирает все комментарии в поисках специального маркера. Если маркер найден — показывает все комментарии с маркером во всплывающем окошке.

Всем желающим поучаствовать в улучшении — добро пожаловать, так сказать откатаем технологию. Если ваш комментарий надо добавить в пост — пишите внутри комментария вот так [also]. А я как инициатор этого безобразия — по мере сил буду ваши пожелания в пост переносить. И соответственно — улучшать скрипт тоже.

Читать дальше →
Всего голосов 30: ↑20 и ↓10+10
Комментарии6

Простоквашино на Хабре или письмо Дяди Федора

Время на прочтение3 мин
Количество просмотров13K
Практически все дети (бывшие и нет) знают про деревню Простоквашино и помнят письмо Дяди Федора.

Нечто подобное, когда любой человек присоединяется к тексту письма, можно сделать на Хабре, где нет кота Матроскина и пса Шарика, но обитает много других замечательных персонажей с прекрасным чувством юмора, тактом и расстановкой.

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

В топиках на Хабре авторский пост четко отделен от комментариев. Иногда, уже после публикации, автор по своему желанию добавляет комментарии некоторых пользователей в свой пост.
Но все можно кардинально изменить…

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

Автор поста придумывает название: “Тема письма и адрес послания”, при желании пишет краткую вступительную часть, ставит Habracut
Читать дальше →
Всего голосов 35: ↑20 и ↓15+5
Комментарии23

Информация

В рейтинге
Не участвует
Откуда
Вильнюс, Литва, Литва
Дата рождения
Зарегистрирован
Активность