Search
Write a publication
Pull to refresh
27
0
Maksim @MuLLtiQ

Software engineer

Send message

10 PRINT CHR$(205.5+RND(1));: GOTO 10

Reading time1 min
Views74K
10 PRINT CHR$(205.5+RND(1)); : GOTO 10 — это название книги, выпущенной издательством MIT press, авторы которой исследуют историю, эстетику и философию программирования, основываясь на одной-единственной крошечной однострочной программе на Бейсике для компьютера Commodore 64, которая генерирует похожий на лабиринт бесконечный узор. Собственно, заголовок книги — её полный листинг. Эта коротенькая демка была популярна тридцать лет назад и портировалась на множество языков и платформ.


Читать дальше →

Небольшой обзор Ingress или как приватизировать достопримечательности

Reading time5 min
Views142K

Вступление


Проснувшись сегодня утром я увидел на телефоне приглашение поучаствовать в эксклюзивном бета тестировании Ingress. По оформлению письма и имени отправителя «Niantic Project Operations» я сразу вспомнил про этот пост и подумал, что пригласили всех желающих. Первым делом я скопировал пригласительный код и отправился в маркет за приложением. При первом запуске он предлагает выбрать учетную запись из уже существующих на телефоне. Код у меня нигде не спрашивали, что поставило под сомнение ограниченность данного мероприятия. После этого начинается обучение, но нигде об этом не говорится, что меня моментально запутало. На этот момент мне показалось, что вся суть игры в миссиях «сходить туда-то, сделать то-то». Когда до меня дошло, что это режим «тренировка», я уже начинал открывать данный пост, комментарии к которому натолкнули меня на написание данного обзора.
Читать дальше →

Pi Bow — самый веселый корпус для Raspberry Pi

Reading time2 min
Views133K
Многие слышали про Rapberry Pi. Это мини-компьютер, в основном для образовательных целей. Архитектура полностью открыта, основана на ARM, работает на Линуксе, очень активная поддержка фанатов, разрабатывающих свои дистрибутивы Линукса и различные аппаратные расширения. Цена удовольствия — 35 британских фунтов или около 1800 рублей.

На Хабре было много постов про RPi, поэтому сейчас немного не об этом. Увы, плата RPi имеет одну конструктивную особенность — у нее нет дырок под винты, поэтому ее крепеж в какой-либо корпус становится небольшой проблемой (авторы обещали исправить это в следующей модели). Конечно, пытливые умы фанатов давно придумали способы крепежа, и сейчас речь как раз об одном из таких корпусов. Этот корпус весьма необычен в конструкции, и вы скоро увидите почему.

(Под катом мало текста, зато много картинок).
Читать дальше →

Нотч отказался сертифицировать Minecraft под Windows 8

Reading time1 min
Views128K
Разработчик игры Minecraft Маркус Персон (Нотч) получил письмо от Microsoft с предложением помощи по сертификации Minecraft для Windows 8, но в ответ попросил «прекратить попытки разрушения ПК как открытой платформы».



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

Правила сертификации десктопных приложений для Windows 8 (всего $549 за два года)

Спорные правила простой верстки

Reading time4 min
Views2.7K
Эта статья, является в первую очередь ответом на недавно вышедшую статью: «Простые правила простой вёрстки».
Автор пригласил написать ответ, высказать свой взгляд на эти примеры и рекомендации, этим приглашением ниже я и намерен воспользоваться. (Читать оригинальную статью перед тем, как зайти под кат — обязательно!)
Читать дальше →

Мужик заказал на Амазоне телевизор, а ему принесли винтовку

Reading time1 min
Views13K


Вашингтон, округ Колумбия. У двери человека оказывается коробка. Он радостно тащит ее домой и распаковывает, надеясь увидеть новенький телевизор, который он, собственно, и заказывал на Amazon.
Читать дальше →

Почему Google — отличный интернет-провайдер

Reading time3 min
Views23K
Компания Google анонсировала проект Google Fiber в феврале 2010 года. После конкурсного отбора из тысячи кандидатов для эксперимента был выбран Канзас-Сити, вчера для него огласили тарифные планы и условия подключения. Google предлагает гигабитный интернет по оптоволокну в квартиру за $70 в месяц, а базовый доступ 5 Мбит/с — без абонентской платы, пользователь платит только за подключение.

За прошедшие два года компания потратила много усилий на оптимизацию затрат по проекту, и за счёт разных хитростей даже такая бизнес-модель является для Google прибыльной. Хотя компания честно заявляет, что занимается прокладкой оптоволокна в квартиры не для денег, а для помощи основному интернет-бизнесу.

Кое-кто может опасаться, что у Google и так много пользовательских данных, а тут компания будет ещё и контролировать канал передачи, но с точки зрения обычного обывателя Google кажется идеальным интернет-провайдером. Его условия на порядок привлекательнее, чем у ныне действующих зажравшихся телекомов.
Читать дальше →

Роскомнадзор перешел на новый уровень маразма

Reading time1 min
Views121K
Судя по опубликованной сегодня записи в журнале Артемия Лебедева, Роскомнадзор превзошел сам себя. Сотрудники этой прекрасной организации умудрились найти что-то порочное в социальном ролике Dumb Ways to Die, созданном по заказу сети австралийского метрополитена. Цель ролика — донести простейший, в общем-то, смысл банальной осторожности и осмотрительности, причем не только в метро, но и по жизни в целом. Однако Роскомнадзор, такие глупости, разумеется, не интересуют, и они прицепились к тексту песни, где перечисляются способы как можно глупее уйти из жизни, скушав клей или просроченный пирожок.
Читать дальше →

Профсоюз работников связи претендует на 0.3% от фонда зарплаты всех ИТ-компаний

Reading time2 min
Views4.6K
Дело Михалкова жило, живет и будет жить. В общем дожили. Буквально через пару недель все ИТ-компании, не подсуетившиеся вовремя, будут обязаны платить оброк в 0.3% никому неизвестному профсоюзу работников связи (см. важный апдейт ниже).
Читать дальше →

Pooling соединений к базе данных на node.js

Reading time7 min
Views12K
В этой статье я опишу две абстракции-классы, написанные средствами nodejs, которые предоставляют функционал распределения запросов по открытым каналам (tcp-socket). При этом учитывается общая загруженность системы и, если каналов не хватает, открываются новые, по мере уменьшения общего количества запросов — «лишние» каналы закрываются.

Этот клиент можно использовать для распределения запросов по каналам, которые представляют собой по сути net.Socket. Для этого нужно внести изменения в метод по открытию и закрытию канала, добавлению запроса в канал.

В примере, который я опишу, используется библиотека pg, предоставляющая функционал по открытию сокетов к серверу с базой данных. При этом дефолтовое управление пулом коннектов, предоставляемое библиотекой, никак не используется.
Читать дальше →

Персистентная очередь

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

Вы тоже можете стать жертвой паралича разработчика

Reading time3 min
Views93K
Дорогие разработчики, вы чувствуете себя неуютно, потому что вы быстро пишете только на восьми языках для трех семейств устройств? Вздрагиваете ли вы, едва заслышав о переходе на очередной фреймворк? Откладывали ли вы любимый проект из-за того, что не могли определить, какая облачная платформа подойдет лучше всего?
Возможно, у вас тоже паралич разработчика. Бойтесь! Это не лечится.

Богатство доступных программистам опций сегодня просто чудовищно. Мы задохнулись под тем, что извергает рог изобилия. Последние несколько лет я зарабатывал на том, что писал на Java, Objective-C, C, C++, Python, Ruby, JavaScript, PHP (прошу прощения) с разными вариантами SQL/баз данных (MySQL, PostgreSQL, MongoDB, BigTable, Redis, Memcached и другими). Нравится ли это мне? Черт побери, нет. По большей части я просто чувствую вину за то, что не делал ничего на Erlang, Clojure, Rust, Go, C#, Scala, Haskell, Julia, Scheme, Swift или OCaml.
image

Я — жертва паралича разработчика: чувства ущербности из-за того, что индустрия софта развивается быстрее, чем может успеть один человек.
Читать дальше →

Персистентное декартово дерево по неявному ключу

Reading time6 min
Views23K

Осторожно, персистентность


Сегодня достаточно необычный день, не правда ли? Как часто на Хабре появляются статьи про персистентные структуры данных? И именно сегодня я желаю вам рассказать про незаслуженно забытую персистентную дерамиду по неявному ключу. Итак, начнем.
Поехали!

Orthogonal — модель мира с альтернативной теорией относительности

Reading time6 min
Views27K
В 2011-2013 гг. австралийский писатель Грег Иган (Greg Egan) опубликовал трилогию Orthogonal (The Clockwork Rocket, The Ethernal Flame, The Arrows of Time). В книгах описан удивительный мир, в котором нет жидкостей и электрических зарядов, обитают четырёхглазые разумные существа, способные менять форму и размножающиеся делением, использующие воздух не для химических реакций, а для охлаждения своего тела, а свет — для передачи нервных импульсов. Скорость света в этом мире непостоянна: фиолетовые фотоны движутся заметно быстрее красных. Поэтому звёзды выглядят не как белые точки, а как радужные полоски
Читать дальше →

Знакомство с Koa или coroutine в nodejs

Reading time5 min
Views34K

Предисловие


Меня уже очень давно привлекает javascript в качестве единого языка для веб-разработки, но до недавнего времени все мои изыскания оканчивались чтением документации nodejs и статей о том, что это callback`овый ад, что разработка на нем приносит лишь боль и страдания. Пока не обнаружил, что в harmony появился оператор yield, после чего я наткнулся на koa, и пошло поехало.
Читать дальше →

Трансдьюсеры в JavaScript. Часть вторая

Reading time7 min
Views13K
В первой части мы остановились на следующей спецификации: Трансдьюсер — это функция принимающая функцию step, и возвращающая новую функцию step.

step⁰ → step¹

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

result⁰, item → result¹

Чтобы получить новый текущий результат в функции step¹, нужно вызвать функцию step⁰, передав в нее старый текущий результат и новое значение, которое мы хотим добавить. Если мы не хотим добавлять значение, то просто возвращем старый результат. Если хотим добавить одно значение, то вызываем step⁰, и то что он вернет возвращаем как новый результат. Если хотим добавить несколько значений, то вызываем step⁰ несколько раз по цепочке, это проще показать на примере реализации трансдьюсера flatten:

function flatten() {
  return function(step) {
    return function(result, item) {
      for (var i = 0; i < item.length; i++) {
        result = step(result, item[i]);
      }
      return result;
    }
  }
}

var flattenT = flatten();

_.reduce([[1, 2], [], [3]], flattenT(append), []); // => [1, 2, 3]

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

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

Итак, сейчас мы можем:
  1. Изменять элементы (прим. map)
  2. Пропускать элементы (прим. filter)
  3. Выдавать для одного элемента несколько новых (прим. flatten)

Читать дальше →

Трансдьюсеры в JavaScript. Часть первая

Reading time5 min
Views30K
Рич Хикки, автор языка Clojure, недавно придумал новую концепцию — Трансдьюсеры. Их сразу добавили в Clojure, но сама идея универсальна и может быть воспроизведена в других языках.

Сразу, зачем это нужно:

  • трансдьюсеры могут улучшить производительность, т.к. позволят не создавать временные коллекции в цепочках операций map.filter.takeWhile.etc
  • могут помочь переиспользовать код
  • могут помочь интегрировать библиотеки между собой, например underscore/LoDash могут уметь создавать трансдьюсеры, а FRP библиотеки (RxJS/Bacon.js/Kefir.js) могут уметь их принимать
  • могут упростить FRP библиотеки, т.к. можно будет выбросить кучу методов, добавив один метод для поддержки трансдьюсеров


Трансдьюсеры — это попытка переосмыслить операции над коллекциями, такие как map(), filter() и пр., найти в них общую идею, и научиться совмещать вместе несколько операций для дальнейшего переиспользования.

Читать дальше →

Kefir.js — новая библиотека для функционального реактивного программирования (FRP) в JavaScript

Reading time4 min
Views22K
Наверняка многие уже слышали о подходе FRP для организации асинхронного кода. На хабре уже писали об FRP (Реактивное программирование в Haskell, FRP на Bacon.js) и есть хорошие доклады на эту тему (Программировние UI с помощью FRP и Bacon.js, Functional Reactive Programming & ClojureScript, О Bacon.js от Juha Paananen — автора бекона)

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

Вот что это дает по сравнению с обратными вызовами:

1) Поток событий (Event stream) и значение меняющаяся во времени (Property / Behavior) становятся объектами первого класса. Это значит что их можно передавать в функции и возвращать из функций.

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

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

К примеру можно написать функцию, возвращающую поток перетаскиваний (drag). В качестве параметров она будет принимать 3 потока — начало перетаскивания, движение, конец перетаскивания. Дальше можно передать в эту функцию: либо потоки для соответствующих событий мыши (mousedown, mousemove, mouseup), либо для touch событий (touchstart, touchmove, touchend). Сама же функция не будет ничего знать об источниках событий, а будет работать только с абстрактными потоками. Пример реализации на Bacon.

2) Явный state

Второе большое преимущество FRP это явное управление состоянием. Как известно, state — один из самых главных источников сложности программ, поэтому грамотное управление им позволяет писать более надежные и простые в поддержке программы. Отличный доклад от Рича Хикки о сложности (complexity) «Simple Made Easy».

FRP позволяет писать бОльшую часть кода на «чистых функциях» и управлять потоком данных (dataflow) явно (с помощью потоков событий), а состояния хранить тоже явно в Property.

Читать дальше →

Меня попросили взломать программу на собеседовании

Reading time11 min
Views195K
TL;DR Меня попросили взломать программу на собеседовании. И я получил работу.

Всем привет,

Я собеседовался на позицию инженера программной безопасности, они спрашивали в основном разные низкоуровневые вещи. Некоторые ответы я знал, некоторые нет.
Потом они прислали email с защищённым и зашифрованным бинарником, который нужно было взломать.
Когда я добрался до дома, я скачал его и увидел, что он спрашивает пароль. Они хотели, чтобы я нашёл этот пароль.
Вот что я увидел при первом запуске:
Читать дальше →

Information

Rating
Does not participate
Date of birth
Registered
Activity