В этой статье я расскажу об одном полезном, но малоизвестном приеме работы с git — как можно легко создать коммит, используя дерево из другого коммита. Проще говоря, как получить нужное состояние проекта на какой-либо ветке, если это состояние уже когда-то и где-то было в репозитории раньше. Будет приведено несколько примеров того, как это позволяет элегантно решать некоторые практические задачи. И в частности я расскажу о найденном мной методе, который позволяет значительно упростить исправление множественных конфликтов при rebase. Кроме того, эта статья — отличный способ понять на практике, что из себя представляет коммит в git-е.
Иваница Александр @GrIvA
User
GUI-фреймворки — на поток
5 min
18KПриветствую вас, коллеги!
Пару-тройку месяцев назад я начал приглядываться к Golang с целью использовать его для десктопных приложений. Язык понравился, объем и тематика написанных для него пакетов произвели впечатление, но вот с GUI дело обстоит не так радужно. Не буду сейчас подробно останавливаться на деталях, достаточно будет сказать, что после чтения нескольких обзоров и беглого просмотра существующих GUI-пакетов решил написать свой — тем более, что опыт в этом у меня есть.
Первая мысль была — пойти по уже проторенному пути: написать набор соответствующих функций на С, точнее, адаптировать уже готовый — то, что я писал когда-то для Harbour и C++, сделать привязку к нему с помощью cgo (C API для Golang) и дружелюбную обертку. Я даже начал это делать, получил первое окошко, но как представил, сколько впереди еще работы, отдельно для Windows, отдельно для Linux, работы чисто технической, поскольку я это уже проходил, энтузиазм несколько поостыл.
И тогда пришла другая идея.
Пару-тройку месяцев назад я начал приглядываться к Golang с целью использовать его для десктопных приложений. Язык понравился, объем и тематика написанных для него пакетов произвели впечатление, но вот с GUI дело обстоит не так радужно. Не буду сейчас подробно останавливаться на деталях, достаточно будет сказать, что после чтения нескольких обзоров и беглого просмотра существующих GUI-пакетов решил написать свой — тем более, что опыт в этом у меня есть.
Первая мысль была — пойти по уже проторенному пути: написать набор соответствующих функций на С, точнее, адаптировать уже готовый — то, что я писал когда-то для Harbour и C++, сделать привязку к нему с помощью cgo (C API для Golang) и дружелюбную обертку. Я даже начал это делать, получил первое окошко, но как представил, сколько впереди еще работы, отдельно для Windows, отдельно для Linux, работы чисто технической, поскольку я это уже проходил, энтузиазм несколько поостыл.
И тогда пришла другая идея.
+22
Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
20 min
65KКомпания Badoo существует уже более 12 лет. У нас очень много PHP-кода (миллионы строк) и наверняка даже сохранились строки, написанные 12 лет назад. У нас есть код, написанный ещё во времена PHP 4 и PHP 5. Мы выкладываем код два раза в день, и каждая выкладка содержит примерно 10—20 задач. Помимо этого, программисты могут выкладывать срочные патчи — небольшие изменения. И в день таких патчей у нас набирается пара десятков. В общем, наш код меняется очень активно.
Мы постоянно ищем возможности как для ускорения разработки, так и для повышения качества кода. И вот однажды мы решили внедрить статический анализ кода. Что из этого получилось, читайте под катом.
+75
Как сделано интро на 64k
13 min
38KTranslation
Введение в интро
Демосцена — это о создании классных штук, которые работают в реальном времени (как бы «крутятся в вашем компьютере»). Их называют демки. Некоторые из них по-настоящему маленькие, скажем, 64k или меньше — такие называются интро. Название происходит от рекламирования или представления взломанных программ (crack intro). Итак, интро — это просто маленькая демка.
Я заметил, что многим интересны произведения демосцены, но они не имеют понятия, как в реальности делаются демки. В этой статье — мозговой дамп и посмертное вскрытие нашего свежего интро Guberniya. Надеюсь, будет интересно и новичкам, и опытным ветеранам. Статья затрагивает практически все техники, которые используются в демках, и должна дать хорошее представление о том, как их делать. В этой статье я буду называть людей по никам, потому что именно так принято на сцене.
+89
Судоку: так сколько же их? Часть 2/2
26 min
9.4KTranslation
Привет Хабр! Это вторая часть перевода статьи про подсчет различных судоку.
В этой части мы погрузимся в теорию групп, начиная с самых основ, но затрагивая только то, что нам пригодится для ответа на вопрос: а сколько же есть действительно различных судоку — без всяких повторов в виде поворотов, отражений и т.п. Те, кто довольно хорошо знаком с теорией групп — вероятно, найдут тут мало что интересного. Для остальных же почитать очень даже полезно. На всякий случай: я себя специалистом по теории групп не считаю, при переводе статьи я сам по сути изучал ее почти с нуля. То есть, вполне могут быть косяки — пишите мне о них в личку. С другой стороны — я для большинства определений лазил в википедию, а все численные результаты подтвердил собственноручно написанной программой. Так что, по идее, количество косяков должно стремиться к нулю. Но мало ли.
Как обычно, мои комментарии выделены курсивом или спрятаны под спойлеры. Под спойлерами можно найти самое интересное — куски кода, которые верифицируют все числа, полученные в повествовании.
В этой части мы погрузимся в теорию групп, начиная с самых основ, но затрагивая только то, что нам пригодится для ответа на вопрос: а сколько же есть действительно различных судоку — без всяких повторов в виде поворотов, отражений и т.п. Те, кто довольно хорошо знаком с теорией групп — вероятно, найдут тут мало что интересного. Для остальных же почитать очень даже полезно. На всякий случай: я себя специалистом по теории групп не считаю, при переводе статьи я сам по сути изучал ее почти с нуля. То есть, вполне могут быть косяки — пишите мне о них в личку. С другой стороны — я для большинства определений лазил в википедию, а все численные результаты подтвердил собственноручно написанной программой. Так что, по идее, количество косяков должно стремиться к нулю. Но мало ли.
Как обычно, мои комментарии выделены курсивом или спрятаны под спойлеры. Под спойлерами можно найти самое интересное — куски кода, которые верифицируют все числа, полученные в повествовании.
+19
Правила хорошего тона при написании плагина на jQuery
7 min
32KЯ написал уйму плагинов на jQuery. Если посмотреть код всех плагинов, сортируя их по дате публикации на github, то можно проследить эволюцию кода. Ни в одном из этих плагинов не соблюдены все рекомендации, которые будут описаны ниже. Все что будет описано, лишь мой личный опыт, накопленный от проекта к проекту.
Писать расширения на jQuery довольно просто, но если хотите узнать как написать их так, чтобы потом их было просто поддерживать и расширять, добро пожаловать под кат.
Писать расширения на jQuery довольно просто, но если хотите узнать как написать их так, чтобы потом их было просто поддерживать и расширять, добро пожаловать под кат.
+23
Как работают замыкания (под капотом) в JavaScript
11 min
76KTranslation
Привет, Хабр!
Мы в Хекслете используем JavaScript не только для очевидных задач во фронтэнде, но и, например, для реализации браузерной среды разработки (наш опен-сорсный hexlet-ide) на React'е. У нас есть практический курс по JavaScript, и один из уроков там посвящен замыканиям. Это важная тема не столько в рамках JS, сколько в программировании вообще. Мы освещаем ее и в других курсах.
В целом, статей и туториалов про использование замыканий в JS полно, но объяснений как это все работает внутри — мало. Сегодняшний перевод посвящен именно этой теме. Как и почему работают замыкания в JS, когда они создаются и уничтожаются и почему каждая функция в JS — это замыкание.
Я использую замыкания уже достаточно давно. Я научился их использовать, но не до конца понимал как они на самом деле работают, что происходит «под капотом». Что это вообще такое? Википедия не очень помогает. Когда замыкание создается и уничтожается? Как выглядит реализация?
Мы в Хекслете используем JavaScript не только для очевидных задач во фронтэнде, но и, например, для реализации браузерной среды разработки (наш опен-сорсный hexlet-ide) на React'е. У нас есть практический курс по JavaScript, и один из уроков там посвящен замыканиям. Это важная тема не столько в рамках JS, сколько в программировании вообще. Мы освещаем ее и в других курсах.
В целом, статей и туториалов про использование замыканий в JS полно, но объяснений как это все работает внутри — мало. Сегодняшний перевод посвящен именно этой теме. Как и почему работают замыкания в JS, когда они создаются и уничтожаются и почему каждая функция в JS — это замыкание.
Я использую замыкания уже достаточно давно. Я научился их использовать, но не до конца понимал как они на самом деле работают, что происходит «под капотом». Что это вообще такое? Википедия не очень помогает. Когда замыкание создается и уничтожается? Как выглядит реализация?
"use strict";
var myClosure = (function outerFunction() {
var hidden = 1;
return {
inc: function innerFunction() {
return hidden++;
}
};
}());
myClosure.inc(); // возвращает 1
myClosure.inc(); // возвращает 2
myClosure.inc(); // возвращает 3
// Ага, круто. А как это реализовано?
// И что происходит под капотом?
+40
Создание программы передач для IPTV телеканала на базе медиасервера Flussonic
6 min
14KНачнем с небольшого пролога.
Но мы с учетом своих особенностей, все таки рискнем рекламой в пользу программы передач.
Что такое серверные плейлисты и зачем они нужны? (с офсайта flussonic)
Серверные плейлисты на сегодняшний день не рекомендованы к использованию в интернете.
Эта технология растет корнями из телевизионного оборудования и ПО, позволявшего запускать видео под контролем оператора. В обновленном виде плейлисты нужны и сегодня, поскольку практика показывает, что пользователям приятнее смотреть то, что им предлагают, а не искать самим.
Вместо серверных плейлистов сегодня рекомендуется использовать клиентские плейлисты из-за следующих проблем:
невозможность таргетировать рекламу;
невозможность учитывать рекламу через adriver и другие подобные сети;
сложность сделать мультибитрейтной доставки: разные файлы могут иметь разное количество разных битрейтов;
технически неоправданно сложно делать отмотку назад, а это одно из основных преимуществ интернет-доставки по сравнению с эфирной;
пауза так же слишком сложна в реализации.
На самом деле невозможность реализации адекватной системы учета рекламы сводит на нет все желания использовать серверные плейлисты.
Эта технология растет корнями из телевизионного оборудования и ПО, позволявшего запускать видео под контролем оператора. В обновленном виде плейлисты нужны и сегодня, поскольку практика показывает, что пользователям приятнее смотреть то, что им предлагают, а не искать самим.
Вместо серверных плейлистов сегодня рекомендуется использовать клиентские плейлисты из-за следующих проблем:
невозможность таргетировать рекламу;
невозможность учитывать рекламу через adriver и другие подобные сети;
сложность сделать мультибитрейтной доставки: разные файлы могут иметь разное количество разных битрейтов;
технически неоправданно сложно делать отмотку назад, а это одно из основных преимуществ интернет-доставки по сравнению с эфирной;
пауза так же слишком сложна в реализации.
На самом деле невозможность реализации адекватной системы учета рекламы сводит на нет все желания использовать серверные плейлисты.
Но мы с учетом своих особенностей, все таки рискнем рекламой в пользу программы передач.
+10
Потоковое видео в Android
7 min
199KВ этой заметке я хочу рассказать о некоторых подводных камнях, с которыми можно столкнуться при работе с потоковым видео в Android приложениях. Конкретно, речь пойдёт о конвертации видео и протоколах доставки/воспроизведения видео.
Сразу оговорюсь, что экспертом я в данной области не являюсь, а лишь хочу поделится недавно полученным опытом.
Сразу оговорюсь, что экспертом я в данной области не являюсь, а лишь хочу поделится недавно полученным опытом.
+26
Удобная и безопасная работа с серверами по ssh
3 min
8KТак как по работе приходится много удалённо работать с unix серверами, то пришлось разобраться как это делать комфортно и безопасно и со временем возникло желание поделиться. Данная заметка не претендует на новизну информации, но мне показалось что нигде нет цельного руководства, нечто похожее есть только на английском.
Описание тестировалось под Debian GNU/Linux с KDE, но должно подходить под основную массу unix систем/дистрибутивов/оконных менеджеров и графических сред.
Описание тестировалось под Debian GNU/Linux с KDE, но должно подходить под основную массу unix систем/дистрибутивов/оконных менеджеров и графических сред.
+5
Алгоритм генерации QR-кода
18 min
192KTutorial
QR код — это монохромная картинка, на которой некоторые устройства (например смартфон со специальным приложением) распознают текст. Этим текстом может быть не только простая фраза, но и, хоть это и не входит в официальную спецификацию, ссылка, номер телефона или визитная карточка. Такие коды чаще всего используют, чтобы закодировать ссылку и распечатать её на плакате или визитке.
Эта статья — подробная инструкция по созданию QR кода с примерами на каждом шаге, которая требует от вас только базового умения работать с бинарными данными и владения любым языком программирования (если вы хотите создать автоматический генератор QR кода).
За основу этой статьи взят цикл статей «QR Code Demystified» Джейсона Брауна (Jason Brown). В этих статьях опущено много нюансов, что вызвало у меня некоторые проблемы. Все эти нюансы учтены и упомянуты здесь.
+92
Ускорение загрузки Windows for fun and profit
4 min
806K Пожалуй, начну с того, что если перегружаться 15 раз в год, то любой «тюнинг» процесса загрузки отнимает больше времени, чем будет выиграно на перезагрузках за все время жизни системы. Однако, спортивный интерес берет свое, тем более, что люди интересуется процессом оптимизации быстродействия. А загрузка оказалась самым очевидным кандидатом в примеры того, как на мой взгляд должен выглядеть этот самый процесс. Сразу скажу, что грузиться будем с 5400 rpm винта, грузиться будем в «рабочую» систему: помимо недобитой вендорской крапвари там стоит еще куча всякого типа вижуал студии, антивируса, скайпа, стима, гуглапдейтера и пр…
Про то, почему отключение pagefile-а скорее вредно, чем полезно — как нибудь в другой раз, а пока…
Про то, почему отключение pagefile-а скорее вредно, чем полезно — как нибудь в другой раз, а пока…
+501
Как мы запустили телеканал в Интернете. Опыт
4 min
10KКак создать телеканал? Честно – не знаю! Не знаю, как это делают другие. Одно могу сказать: запустить телеканал, когда у тебя есть мешок денег, инвесторы и всё такое, представляется мне сейчас каким-то банальным делом. С деньгами, как говорится, и дурак сможет. А вот без денег – как? Расскажу о нашем пути.
+33
Вышла новая версия дистрибутива для создания межсетевого экрана pfSense 2.1
2 min
23K15 сентября 2013 года, после двух лет разработки представлен выпуск дистрибутива для создания межсетевых экранов и сетевых шлюзов pfSense 2.1. Дистрибутив основан на кодовой базе FreeBSD 8.3 с задействованием наработок проекта m0n0wall и активным использованием pf и ALTQ. Для загрузки доступно множество образов для архитектуры i386 и amd64, размером от 80 до 180 Мб, включая LiveCD и образы для заливки прямо на Compact Flash'ки разного размера (512, 1ГБ, 2ГБ, 4ГБ).
+14
Про автоматизацию подбора аккордов
17 min
59KМеня давно занимал вопрос: «а что, если попробовать прогнать цифровую запись песни через преобразование Фурье, посмотреть зависимость спектра от времени и попытаться вытащить из полученной информации аккорды песни?». Вот, наконец, нашел время попробовать…
+133
Создание видео редактора — полезные рецепты avconv (ffmpeg)
8 min
27KTutorial
Недавно потребовалось написать небольшой видеоредактор с веб-интерфейсом.
До этого изредка доводилось пользоваться командами типа
ffmpeg -i file.avi file.mp3
в основном для конвертации из одного формата в другой. Все всегда было более менее гладко и сложно было представить, сколько на самом деле существует всяких нюансов для работы с видео и аудио.
Но начнем с начала. С некоторых пор моя ubuntu начала выдавать:
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
В целом, пока это использовалось по-мелочам, это было не особо важно, но закладывать уже устаревающую фичу в проект как-то «не оно». Пришлось гуглить что к чему и выяснилось, что проект
ffmpeg
некоторое время назад раскололся и часть разработчиков занялась созданием библиотеки libav, которая и включена в настоящее время в ubuntu по-умолчанию. Разумеется, совместимость передовых фич была принесена в жертву первой. Заодно и с переименованием проекта исполняемый файл ffmpeg был переименован в avconv, о чём и было вышеупомянутое предупреждение.Под катом небольшая выжимка основных фич, которые пригодились.
+20
Регулярные выражения, пособие для новичков. Часть 2
18 min
260KTranslation
В первой половине этого пособия мы раскрыли лишь малую часть возможностей регулярных выражений. Во второй, большей, половине мы рассмотрим некоторые новые метасимволы, то, как использовать группы для получения частей совпавшего текста, разбивать строки, находить и замещать части текста. В конце немного поговорим о распространенных ошибках.
+65
Python изнутри. Объекты. Хвост
10 min
26KTutorial
Translation
1. Введение
2. Объекты. Голова
3. Объекты. Хвост
4. Структуры процесса
В предыдущей части мы начали изучение объектной системы Питона: поняли, что именно можно считать объектом и каким образом объекты выполняют свою работу. Продолжим рассмотрение вопроса.
Приветствую вас в третьей части нашего цикла статей о внутренностях Питона (строго рекомендую прочитать вторую часть, если вы этого ещё не сделали, иначе ничего не поймёте). В этом эпизоде мы поговорим о важном понятии, к которому всё никак не подберёмся, — об атрибутах. Если вы хоть что-нибудь писали на Питоне, то вам доводилось пользоваться ими. Атрибуты объекта — это другие, связанные с ним, объекты, доступные через оперетор
В типе можно описать специальные методы, модифицирующие доступ к атрибутам его экземпляров. Эти методы описаны здесь (как мы уже знаем, они будут связаны с необходимыми слотами типа функцией
Стоять! Друзья мои, фекальные массы ещё только начали своё стремительное приближение к вращающемуся ветрогенератору. Пропадать, так всем пропадать. Предлагаю совместно изучить, что происходит в интерпретаторе, и задать, как мы обычно делаем, несколько раздражающих вопросов.
2. Объекты. Голова
3. Объекты. Хвост
4. Структуры процесса
В предыдущей части мы начали изучение объектной системы Питона: поняли, что именно можно считать объектом и каким образом объекты выполняют свою работу. Продолжим рассмотрение вопроса.
Приветствую вас в третьей части нашего цикла статей о внутренностях Питона (строго рекомендую прочитать вторую часть, если вы этого ещё не сделали, иначе ничего не поймёте). В этом эпизоде мы поговорим о важном понятии, к которому всё никак не подберёмся, — об атрибутах. Если вы хоть что-нибудь писали на Питоне, то вам доводилось пользоваться ими. Атрибуты объекта — это другие, связанные с ним, объекты, доступные через оперетор
.
(точка), например: >>> my_object.attribute_name
. Кратко опишем поведение Питона при обращении к атрибутам. Это поведение зависит от типа объекта, доступного по атрибуту (уже поняли, что это относится ко всем операциям, связанным с объектами?).В типе можно описать специальные методы, модифицирующие доступ к атрибутам его экземпляров. Эти методы описаны здесь (как мы уже знаем, они будут связаны с необходимыми слотами типа функцией
fixup_slot_dispatchers
, где создаётся тип… вы же прочитали предыдущий пост, так ведь?). Эти методы могут делать всё, что угодно; описываете ли вы свой тип на C или на Python, вы можете написать такие методы, которые сохраняют и возвращают атрибуты из какого-нибудь невероятного хранилища, если вам так угодно, вы можете передавать и получать атрибуты по радио с МКС или даже хранить их в реляционной базе данных. Но в более-менее обычных условиях эти методы просто записывают атрибут в виде пары ключ-значение (имя атрибута/значение атрибута) в каком-нибудь словаре объекта, когда атрибут устанавливается, и возвращают атрибут из этого словаря, когда он запрашивается (или выбрасывается исключение AttributeError
, если в словаре нет ключа, соответствующего имени запрашиваемого атрибута). Это всё так просто и прекрасно, спасибо за внимание, на этом, пожалуй, закончим.Стоять! Друзья мои, фекальные массы ещё только начали своё стремительное приближение к вращающемуся ветрогенератору. Пропадать, так всем пропадать. Предлагаю совместно изучить, что происходит в интерпретаторе, и задать, как мы обычно делаем, несколько раздражающих вопросов.
+35
Эллиптическая криптография: теория
7 min
166KTutorial
Привет, %username%!
Недавно на хабре была опубликована очень спорная статья под названием «Эксперты призывают готовиться к криптоапокалипсису». Честно говоря, я не согласен с выводами авторов о том, что «голактеко опасносте», все скоро взломают и подорожает гречка. Однако я хочу поговорить не об этом.
В комментариях к той статье я высказал мнение, что кое в чем докладчики правы и переходить на эллиптическую криптографию уже давно пора. Ну в самом деле, кто-нибудь видел в интернете ECDSA сертификат? Хотя стандарту уже без малого 13 лет, мы продолжаем по старинке использовать старый добрый RSA. В общем сказал я это, и как это часто бывает, задумался а так ли необходим переход на «эллиптику»? Да и что это за зверь такой эллиптическая криптография? Какие имеет плюсы, минусы, тонкости. Одним словом, давайте разбираться.
+126
Пока Vim пишет код за Вас…
3 min
29KНе буду долго распинаться на тему того, насколько велик и могуч Vim — это уже давно и достоверно известно. Кто-то даже утверждает, что «Практически любая строка латинских букв является синтаксически верной командой для vi».
Иногда программист настолько тонко познает темную сторону силы, что Vim начинает писать код вместо него, оставляе время для медитации и прочих полезных вещей. Одним из таких полезных дел может быть написание очередного супер полезного плагина. Последующие строки сего скромного трактата повествуют именно об этом.
+16
Information
- Rating
- Does not participate
- Location
- Днепр, Днепропетровская обл., Украина
- Date of birth
- Registered
- Activity