Как стать автором
Обновить
48
0
Андрей Кравчук @prefrontalCortex

Software Engineer

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

Работай правильную работу правильно, а деньги сами тебя найдут

Время на прочтение4 мин
Количество просмотров4.2K
Эту фразу говорил мне мой дедушка, дзен его духу, и всегда обращал внимание, чтобы я очень точно слышал каждое слово. В этой статье я постараюсь немного подробней рассказать о том, как я считаю правильным ставить на жизненном пути цели, то есть поподробней разберу, что такое “правильная работа”.
Читать дальше →
Всего голосов 132: ↑87 и ↓45+42
Комментарии73

http://(Любое_слово).jpg.to

Время на прочтение1 мин
Количество просмотров2.5K
Начал работу сайт jpg.to, с помощью которого удобно на лету получать иллюстрации по ключевому слову. Указываете слово в URL на любом языке — и получаете нужную картинку. Картинки берутся с Google Image Search, в URL можно использовать кириллицу. Например, котята.jpg.to.

Это может пригодиться для быстрого постинга картинок в чате/почте, а также для автоматического иллюстрирования контента. Можно сделать скрипт, который будет подгружать картинки по контексту страницы или по тексту во время набора пользователем. Jpg.to — минималистическая альтернатива гугловским API, которые запланированы к закрытию.

Автор обещает в ближайшее время добавить дополнительный функционал, в том числе парсинг условий поиска картинок:
  • размер: keyword.jpg.to/large, keyword.jpg.to/medium
  • цветовая гамма: keyword.jpg.to/red, keyword.jpg.to/green, keyword.jpg.to/white
  • тип картинки фото/клипарт: keyword.jpg.to/photo, keyword.jpg.to/clipart
  • выбор случайной картинки (keyword.jpg.to/random.jpg) или по номеру в результатах поиска (keyword.jpg.to/301.jpg)
  • информация об авторе и возможность удаления картинки из выдачи по требованию автора
Всего голосов 142: ↑129 и ↓13+116
Комментарии62

Введение в Template Haskell. Часть 3. Прочие аспекты TH

Время на прочтение6 мин
Количество просмотров2.5K
Данный текст является переводом документации Template Haskell, написанной Булатом Зиганшиным. Перевод всего текста разбит на несколько логических частей для облегчения восприятия. Далее курсив в тексте — примечания переводчика. Предыдущие части:


Материализация


Материализация (reification) — это средство Template Haskell, позволяющее программисту получить информацию из таблицы символов компилятора. Монадическая функция reify ∷ Name → Q Info возвращает информацию о данном имени: если это глобальный идентификатор (функция, константа, конструктор) – вы получите его тип, если это тип или класс – вы получите его структуру. Определение типа Info можно найти в модуле Language.Haskell.TH.Syntax.
Материализация может быть использована для того, чтобы получить структуру типа, но таким образом нельзя получить тело функции. Если вам нужно материализовать тело функции, то определение функции нужно процитировать и дальше можно будет работать с этим определением с помощью другого шаблона. Например так:
$(optimize [d| fib = … |])

или так
fib = $(optimize [| … |])

На самом деле, в оригинальной статье больше ничего не говорится про материализацию. Не знаю, насколько это содержательная тема – необходимый минимум знаний о ней ограничивается функцией reify и типом Info, но есть некоторые тонкости, связанные например с тем, что можно получить информацию не о любом имени. Если эта тема интересна, я могу собрать какую-нибудь информацию и написать об этом отдельную заметку (или вклеить сюда).

Облегчённое цитирование имён


Чтобы получить имя (∷ Name), соответствующее интересующему идентификатору, можно использовать функцию mkName, но это не безопасное решение, потому что mkName возвращает не квалифицированное имя, которое может интерпретироваться по-разному в зависимости от контекста. А вот код VarE id ← [| foo |] безопасен в этом смысле, так как цитирование квалифицирует имена (получится что-то типа My.Own.Module.foo), но этот код слишком многословный и требует монадический контекст для использования. К счастью, Template Haskell, имеет другую простую форму цитирования имён: 'foo (одинарная кавычка перед foo) имеет тип Name и содержит квалифицированное имя, соответствующее идентификатору foo, так что код let id = 'foo эквивалентен по смыслу коду VarE id ← [| foo |]. Обратите внимание, что эта конструкция имеет простой тип Name (а не Q Exp или Q Name), так что она может быть использована там, где не возможно использование монад, например:
f ∷ Exp → Exp
f (App (Var m) e) |  m == 'map  =  …

Эта новая форма тем не менее является цитированием и подчиняется тем же правилам, что и цитирующие скобки [| … |]. Например, она не может быть использована внутри этих скобок (так нельзя: [| 'foo |]), но и вклеивание к ней не может быть применено (так тоже нельзя: $( 'foo )), потому что для вклейки нужен тип Q …. Более важно то, что эта форма определяется статически, возвращая полностью квалифицированное имя, с однозначной интерпретацией.
Haskell’евские пространства имён немного всё усложняют. Цитата [| P |] означает конструктор данных P, в то время как [t| P |] означает конструктор типа P. Поэтому для “облегчённого цитирования” необходим такой же способ разделения этих сущностей. Для контекста типов используется просто две одинарные кавычки:
  • 'Foo означает “конструктор данных Foo в контексте выражения”
  • 'foo означает “имя foo в контексте выражения”
  • ''Foo означает “конструктор типа Foo в контексте типов”
  • ''foo означает “переменная типа foo в контексте типов”
Облегчённая форма цитирования используется в примере генерации воплощений класса Show, который разбирается в конце.
Читать дальше →
Всего голосов 15: ↑13 и ↓2+11
Комментарии1

C++ Variadic templates. Каррирование и частичное применение

Время на прочтение7 мин
Количество просмотров6.6K
Доброго времени суток, уважаемое Хабрасообщество.
Недавно приходилось наблюдать дискуссию о каррировании и частичном применении. Суть этой полемики состояла в том, что лучше, для практических целей, иметь в языке программирования: встроенное частичное применение (например, как в Nemerle) или встроенное каррирование (как, например, в Haskell).
Читать дальше →
Всего голосов 29: ↑25 и ↓4+21
Комментарии62

Blender 2.49b + Python 2.6 – используем клавиатуру в своей игре

Время на прочтение5 мин
Количество просмотров5.9K
Blender – свободно распространяемая программа с открытым исходным кодом для создания трехмерной графики и компьютерных игр, которая поддерживает Python в качестве «встроенного» языка программирования.

Python – интерпретируемый язык программирования.

Данный топик пытается укрепить иллюзию, что, обладая минимальными познаниями в Блендере и Питоне, каждый сможет создать свою игру. Из всего, что можно сделать с помощью Питона в Блендере, для начала рассматривается простейшее взаимодействие с клавиатурой. Так же в топике пошагово в скриншотах описаны минимально необходимые методы работы с Блендером: запуск, сохранение сцены, манипуляции с объектом, добавление сенсоров и контроллеров и т. д.
Читать дальше →
Всего голосов 39: ↑37 и ↓2+35
Комментарии12

Как питонистам читать Haskell

Время на прочтение8 мин
Количество просмотров7.6K
Сталкивались ли вы с тем, что иногда надо быстро понять, что делает кусок кода на неком незнакомом языке? Если язык похож на то, к чему вы привыкли, как правило, можно догадаться о назначении большей части кода — даже если вы не очень хорошо знакомы со всеми фичами языка.
С Haskell все по-другому, так как его синтаксис выглядит совсем иначе, нежели синтаксис традиционных языков. Но, на самом деле, разница не так велика — нужно просто взглянуть под правильным углом. Здесь приводится быстрое, по большей части некорректное, и, надеюсь, полезное руководство по интерпретации питонистами (автор использует слово «Pythonista» — прим. переводчика) кода на Haskell. К концу вы будете способны понять следующий кусок (часть кода опущена за троеточиями):
runCommand env cmd state = ...
retrieveState = ...
saveState state = ...

main :: IO ()
main = do
    args <- getArgs
    let (actions, nonOptions, errors) = getOpt Permute options args
    opts <- foldl (>>=) (return startOptions) actions
    when (null nonOptions) $ printHelp >> throw NotEnoughArguments
    command <- fromError $ parseCommand nonOptions
    currentTerm <- getCurrentTerm
    let env = Environment
            { envCurrentTerm = currentTerm
            , envOpts = opts
            }
    saveState =<< runCommand env command =<< retrieveState

Читать дальше →
Всего голосов 60: ↑53 и ↓7+46
Комментарии6

Идеальная маркерная доска

Время на прочтение5 мин
Количество просмотров172K
Доска маркерная или whiteboard является практически обязательным атрибутом любой, уважающей себя, команды разработчиков. При должном умении и желании обычная доска способна сэкономить массу времени и существенно улучшить результат работы команды — быстрый и эффективный способ коммуникации всегда был очень критичным и непосредственно влиял на результат коллективных усилий.

Но можно ли сделать сам инструмент приятнее? Добавить изюминку?


Читать дальше →
Всего голосов 184: ↑179 и ↓5+174
Комментарии98

Bash-скрипт для искрографиков

Время на прочтение1 мин
Количество просмотров3.4K
Искрографик (англ. sparkline) — это термин, который придумал Эдвард Тафти для обозначения миниатюрных (word-sized), но информационно-плотных графиков. Они показывают общую картину там, где нет места для размещения нормальных графиков с осями координат. Особенно полезными могут быть в таких областях как финансы и трейдинг, спортивные события, научный и медицинский анализ, системное администрирование.



Зак Холман (Zach Holman) из Github написал shell-скрипт Spark, который строит инфографику простой командой spark прямо из шелла (достаточно добавить скрипт куда-нибудь в $PATH).
Читать дальше →
Всего голосов 86: ↑80 и ↓6+74
Комментарии17

Корова десятого уровня

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


Работать по 12 часов в сутки, тащить на себе миллионы, быть кумиром тысячей хомячков, напиваться до безумия каждый релиз, экспериментировать и фанатично строчить фичекат до 3-х утра.
Забудь.

Ты в мейнстриме, бро.

Читать дальше →
Всего голосов 298: ↑218 и ↓80+138
Комментарии132

Qt+OpenGL — Основы. Часть 1

Время на прочтение5 мин
Количество просмотров126K
Данная cтатья вводная, рассчитана на знакомство с Qt+OpenGL для новичков, которые планируют изучать Qt (как кросс-платформенный инструментарий разработки ПО на языке программирования C++) + OpenGL (как графическую библиотеку).

Что потребуется новичку:
1) Qt Creator (имеет хорошую встроенную документацию и подсказки во время набора кода). Скчаать
2) doc.qt.nokia.com — официальная документация на английском языке
3) doc.crossplatform.ru — документация на русском языке
4) Обязательно прочесть про Qt и OpenGL
5) Отличная статья для начала изучения

Что мы будем делать
Поскольку данная статья посвящена конкретно основам, в нашей задаче будет следующее:
1) Разобрать как создается приложение
2) Как рисовать объекты
3) Как работать с указателем мыши и событиями(нажатие клавиш на клавиатуре и на мышке)
4) Работа с таймером
5) Создадим нашу первую банальную игру. Будем с помощью таймера, случайным образом перемещать квадрат. После наведения на квадрат указателя и кликнув по нему левой кнопки мышки, в случае попадания по квадрату, будем прибавлять к полученным очкам +1.

Этапы построения
Всего голосов 59: ↑47 и ↓12+35
Комментарии51

Теория шести рукопожатий: еще одно подтверждение

Время на прочтение4 мин
Количество просмотров77K
Однажды в студеную зимнюю пору я столкнулся с упоминанием того, что кто-то в Facebook пытается подтвердить теорию шести рукопожатий. Для тех кто не в курсе, эта теория заключается в том, что все жители земли в среднем знакомы друг с другом через цепочку из пяти друзей (т.е. шести рукопожатий). Подробнее об истории этой теории можно прочитать в википедии, там же можно узнать о том, что Майкрософт несколько лет назад пыталась подтвердить эту теорию на основе данных о контакт-листах мессенджера MSN — в результате у них получилось 6,6 рукопожатий, что вполне вписывается в теорию.

Очень мне захотелось эту теорию подтвердить самому, используя данные, которые есть под рукой — ВКонтакте. Для претворения моей странной идеи в жизнь надо было решить целый комплекс проблем:
  1. На каких данных это все расчитывать.
  2. Где эти данные взять.
  3. Как эти данные сохранять.
  4. Каким алгоритмом воспользоваться для расчетов.
подробнее о том, что получилось
Всего голосов 211: ↑203 и ↓8+195
Комментарии102

zsh :: настраиваем «правое» приглашение командной строки

Время на прочтение2 мин
Количество просмотров8.3K
Ковыряясь с настройками zsh, наткнулся на весьма интересное решение для приглашения командной строки, которое размещается в этом шелле справа. Обычно туда принято помещать часы, но мне весьма приглянулась идея разместить там также нотификатор заряда батареи. В зависимости от уровня заряда, нотификатор показывается зеленым, желтым или красным цветом. Автор идеи зачем-то приплел к решению python, я все переписал на родном шелле.
Выглядит это как-то вот так:
Command line prompt, zsh
Читать дальше →
Всего голосов 51: ↑48 и ↓3+45
Комментарии25

Типичные случаи утечки памяти в Java

Время на прочтение4 мин
Количество просмотров74K
Большинству разработчиков известно, что сборщик мусора в Java не является универсальным механизмом, позволяющим программисту полностью забыть о правилах использования памяти и о том, в каких случаях осуществляется его работа. Ниже описаны типичные случаи утечки памяти в java-приложениях, встречающиеся повсеместно.
Итак, о чём должен помнить каждый java-программист.
Читать дальше →
Всего голосов 113: ↑104 и ↓9+95
Комментарии80

Процессор

Время на прочтение8 мин
Количество просмотров151K
Сколько я себя помню, всегда мечтала сделать процессор. Наконец, вчера я его сделала. Не бог весть что: 8 бит, RISC, текущая рабочая частота — 4 кГц, но он работает. Пока что в программе моделирования логических цепей, но все мы знаем: «сегодня — на модели, завтра — на деле!».

Под катом несколько анимаций, краткое введение в двоичную логику для самых маленьких, короткий рассказ про основные микросхемы логики процессора и, собственно, схема.
Читать дальше →
Всего голосов 361: ↑347 и ↓14+333
Комментарии66

HTML5-консоль от Google

Время на прочтение1 мин
Количество просмотров3.2K
HTML5-консоль, который вы могли видеть в одном из выступлений на майской конференции Google I/O, работает в онлайне (судя по всему, только в браузере Chrome).



Презентация HTML5 Wow целиком была создана для демонстрации возможностей HTML5. Все демонстрационные примеры, в том числе консоль, выложены с открытыми исходниками.
Читать дальше →
Всего голосов 70: ↑60 и ↓10+50
Комментарии23

Как люди принимают решения

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

В этом выпуске вебинаров UXRussia раскрываются 5 феноменов, обнаруженных в экспериментах психологов, показывающих, как люди принимают решение. И даются рекомендации дизайнерам о том, что делать с этим знанием:
  • Люди, в основном, принимают решения неосознанно.
  • Сознание медленнее познаёт мир.
  • Люди хотят больше выбора и информации, чем они могут переработать.
  • Людям нужно чувство контроля, когда они делают выбор.
  • Люди заботятся о времени больше, чем о деньгах.

Продолжение темы
Всего голосов 85: ↑72 и ↓13+59
Комментарии29

Sisyphus.js — защищаем данные форм пользователя от случайных потерь

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

В чём проблема?


Бывали ли у вас случаи, когда во время долгого заполнения нудной формы или написания красноречивого и пылкого комментария *внезапно* крашился браузер? Или вы закрывали вкладку, в которой работаете, или отключалось электропитание (а ИБП, по известному закону, нет)? Если нет — то вам повезло, но страховки от подобных происшествий ни у кого нет.

Представьте себе бурю эмоций, испытываемых пользователем, только что потерявшим все вводимые данные — а ведь оставалось немного допечатать и отправить форму. Вот если бы только был способ восстановить эти данные, а не заниматься сизифовым трудом…
Читать дальше →
Всего голосов 139: ↑136 и ↓3+133
Комментарии74

Введение в Template Haskell. Часть 1. Необходимый минимум

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

Данный текст является переводом документации Template Haskell, написанной Булатом Зиганшиным. Перевод всего текста разбит на несколько логических частей для облегчения восприятия. Далее курсив в тексте — примечания переводчика.



Template Haskell (далее TH) — это расширение языка Haskell предназначенное для мета-программирования. Оно даёт возможность алгоритмического построения программы на стадии компиляции. Это позволяет разработчику использовать различные техники программирования, не доступные в самом Haskell’е, такие как, макро-подобные расширения, направляемые пользователем оптимизации (например inlining), обобщённое программирование (polytypic programming), генерация вспомогательных структур данных и функций из имеющихся. К примеру, код
yell file line = fail ($(printf "Error in file %s line %d") file line)

может быть преобразован с помощью TH в
yell file line = fail ((\x1 x2 -> "Error in file "++x1++" line "++show x2) file line)

Другой пример, код

data T = A Int String | B Integer | C
$(deriveShow ''T)

может быть преобразован в

data T = A Int String | B Integer | C
instance Show T
    show (A x1 x2) = "A "++show x1++" "++show x2
    show (B x1)    = "B "++show x1
    show C         = "C"

В TH код на Haskell’е генерируется обычными Haskell’евскими функциями (которые я буду для ясности называть шаблонами). Минимум того, что вам необходимо знать, чтобы использовать TH — это следующие темы:
  1. Как Haskell-код представляется в шаблонах (TH-функциях)
  2. Как монада цитирования используется для унификации имён
  3. Как сгенерированный TH-код вставляется в программу
Читать дальше →
Всего голосов 19: ↑19 и ↓0+19
Комментарии7

Библия проектирования. Часть вторая. Костыли, изгнание из рая, Каин, Авель, и снова с чистого листа

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

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

Из последних сил и отбросив такт, ты начинаешь свой рассказ.

Читать дальше →
Всего голосов 121: ↑101 и ↓20+81
Комментарии18

Начальная настройка ИБП APC в Linux с точки зрения чайника

Время на прочтение3 мин
Количество просмотров54K
Купив источник бесперебойного питания от APC (а именно — APC Back-UPS ES 550VA ), я с удивленьем обнаружил, что «из коробки» он не может похвастаться тесной дружбою с Linux. Конечно, XFCE Power Manager, входящий в состав XFCE 4.6, подхватил и разпознал UPS, но всё, на что он оказался способен — отображение в трее уровня заряда. Какие-либо настройки отсутствовали начисто, нельзя было даже задать выключение ПК при достижении определённого уровня заряда.

Обратившись за консультацией в гугл, я узнал о существовании замечательного демона apcupsd, чья роль заключается в — никогда не поверите — управлении ИБП от APC. Но, как оказалось, практически все руководства по его начальной настройке были откровенно устаревшими — включая, как ни странно, официальный мануал. Споткнуться приходилось уже в самом начале о «cat /proc/bus/usb/devices». Поговорив с гуглом серьёзным и доверительным тоном, я добился от него ссылки на действующий мануал, художественным переводом коего с дополнениями из иных источников сия статья и является.
Читать дальше →
Всего голосов 35: ↑30 и ↓5+25
Комментарии29

Информация

В рейтинге
Не участвует
Откуда
Подгорица, Подгорица, Черногория
Работает в
Дата рождения
Зарегистрирован
Активность

Специализация

Software Developer, Fullstack Developer
Senior
От 5 000 €
Lisp
Clojure
Unix
Linux
Docker