Как стать автором
Обновить
67
0
Aydar Biktimirov @nagato

Software Engineer

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

Adobe Profiler Fail

Время на прочтение3 мин
Количество просмотров19K
Доброго вечера всем хабравчанам. Я долго думал как назвать данный пост и решил назвать первым, что придет на ум. В принципе данное название почти полностью описывает то, о чем хочу рассказать. А расскажу я о том, как можно легко и просто вносить изменения в абсолютно любой просматриваемый вами swf файл без декомпиляции.


И так начнем. Нашим подопытным будет плеер YouTube.

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

Slippery Spheres

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


Школьники предлагают нам изготовить чудо-полимер, не верьте, no way



Шары в жидкости — особый полимер, который имеет близкий к воде коэффициент преломления. Называется эта штука: Slippery Spheres.
Стоит эта игрушка порядка 4 долларов, впитывая в себя воду могут увеличиваться в 200 раз от своего первоначального размера, бывают различной формы.

Обзор малюток от Sony Ericsson

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

Хотим поделиться с вами своими впечатлениями о семействе самых маленьких смартфонов с Android — Sony Ericsson Xperia Mini и Mini Pro. После двухнедельного общения с ними есть, чем поделиться:



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

Еще несколько красивых фоток смотрите на Droider.ru.

Основы программирования под Android на примере игры Судоку

Время на прочтение6 мин
Количество просмотров375K
В статье описаны основные трудности создания приложений под Android.
Рассматриваются базовые понятия программирования Android.
Для примера описано создание игры Sudoku из книги Hello, Android – Ed Burnette.
Осторожно много скриншотов.

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

Я попробовал его за вас — Sony Ericsson Xperia 10i

Время на прочтение4 мин
Количество просмотров3.1K
image
Предыстория

iPhone первого поколения (тот что полностью металический) был прекрасен, пока я не поставил третью версию прошивки, после чего он стал кушать слишком много для того чтобы я мог продолжать им пользоваться, неделя мучений и дочка устранила мои сомнения разбив его о пол в ванной.
Никогда бы не подумал, что я буду этому рад, появились веские основания сменить телефон.
Читать дальше →

Цена и перспективы Sony Ericsson XPeria X10

Время на прочтение1 мин
Количество просмотров1.2K
На днях официальный твиттер Sony Ericsson сообщил финальную стоимость и комплектацию флагманского смартфона компании XPeria X10. Устройство появится в продаже ближе к марту по цене… 24990 руб! За эти деньги мы получаем Android-смартфон с 4" дюймовым широкоформатным экраном, 1 ГГц процессором Qualcomm Snapdragon, 1 Гб ROM, 256 Мб RAM, 8 МПкс камеру с LED-вспышкой и автофокусом, 16 Гб MicroSD карту, стереогарнитуру и аккумуляторную батарею емкостью 1500 мА/ч.

Похоже, на этот раз SE удалось преподнести сюрприз и удержать цену на устройство на очень достойном уровне. Ближайший гигагерцевый собрат-конкурент X10 — HTC HD2 стоит 29990 руб, а Nexus One и вовсе не планируется продаваться в России.

XPeria X10 будет поставляться с ОС Android версии 1.6 и собственной разработкой SE — программной оболочкой Nexus, включающий в себя уникальные приложения Timespace и Mediascape. При этом на X10 уже можно установить огромное количество приложений с Android Market например как: Google Navigation, Google Goggles, Wikitude, приложение дополненной реальности Layar и многие другие. В последующем планируется апдейт прошивки до версии 2.Х.

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

Обзор игрового ноутбука ASUS G550JK

Время на прочтение6 мин
Количество просмотров105K
Серия ноутбуков Republic of Gamers обладает максимальной производительностью. Что неудивительно, учитывая целевую аудиторию — геймеров. В рамках этой серии выходит большое количество устройств. Помимо ноутбуков под брендом RoG есть еще и материнские платы, видеокарты, звуковые карты, мыши и другие устройства. Сегодня мы расскажем о ASUS G550JK, оснащенным 4-ядерным процессором Core i7 с 16 ГБ ОЗУ и FullHD-экраном.

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

Почему Ваза утонул, а С++ всё ещё на плаву

Время на прочтение6 мин
Количество просмотров82K
Эта статья — краткий пересказ невероятно интересного доклада Скотта Майерса для тех, у кого нет 70 минут на весь доклад, но есть 7 минут на основные тезисы.

Некоторые люди, которые не пишут на С++, а лишь слышали об этом языке, задаются вопросом: «Почему вообще кто-то пишет на C++?». Но есть люди, которые используют С++ каждый день, и вот эти люди задаются вопросом: «А действительно, почему я пишу на этом языке?».

Но ведь действительно, должна быть какая-то причина, по которой люди пишут программы на С++. Давайте вернемся в начало 90-ых, когда проходила стандартизация С++. Была предложена масса идей. Предложений было столько и они были настолько разные, что мне запомнилась цитата Джима Вальдо, который тогда работал в комитете по стандартизации: «Каждый, предлагающий добавить что-то в С++ должен приложить к заявке свою почку. Тогда никто не предложит больше двух идей, а к выбору этих двух он подойдёт невероятно ответственно.»

Язык, который был бы получен в результате принятия всех предложений, выходил слишком сложным и тогда Бьёрн Страуструп сказал «А помните Ваза?». Никто, кроме людей из Швеции, не понял о чём речь. Ваза был огромным боевым кораблём, построенным в Швеции в 1625 году. Основным принципом постройки корабля было «А почему бы нам не добавить сюда ещё и вот такую фичу?». Многие из идей исходили непосредственно от короля, в частности он лично утверждал размеры корабля. Также на Ваза по указаниям свыше требовалось нацепить огромное количество элементов украшения, резьбы, большое количество пушек и т.д. А королю ведь не откажешь. Итог был закономерным — из-за ошибок в конструировании Ваза затонул в первом же рейсе, едва выйдя из бухты.
Читать дальше →

QtDbus — тьма, покрытая тайною. Часть 1

Время на прочтение7 мин
Количество просмотров29K
Наше путешествие началось Qt Graphics Framework, нас завербовали его светлой стороной, а потом мы долго получали граблями по разным частям тела.

Данная статья — это спин-офф основного сюжета. В ней сказ пойдет о QtDBus. Этот модуль Qt появился еще в четвертой версии и был хоть как-то документирован и снабжен примерами. Но грянул Qt 5.0, и уж не знаю по чему, но это привело к тому, что на сторону тьмы перешла вышеназванная дока..
Читать дальше →

Интерпретация во время компиляции, или Альтернативное понимание лямбд в C++11

Время на прочтение22 мин
Количество просмотров32K
Yo dawg, I heard you like programming. So we put a language in you language, so you can program while you programНа Хабре недавно проскочила ещё одна статья про вычисления на шаблонах C++ от HurrTheDurr. В комментариях к ней лично я увидел вызов:

> С каждым новым релизом количество способов нетривиально вывихнуть себе мозг при помощи С++ продолжает увеличиваться)
> > Особенно, если не менять подход к реализации игрового поля и продолжать пытаться все вычисления выполнять не над константами, а над типами.


А так ли сложно будет написать универсальный вычислитель на типах, более удобный для программирования, чем клеточный автомат? Как оказалось, несложно; я в 30 раз больше времени потратил на эту статью, чем на написание и отладку собственно кода вычислителя.

Чуть раньше AveNat опубликовала введение в лямбда-исчисление в двух частях, так что вдохновение пришло мгновенно. Хотелось, чтобы можно было (образно) писать так:
#include <iostream>

#include <LC/kernel.h>
#include <LC/church_numerals.h>

int main()
{
    // Представление натуральных чисел в виде лямбда-абстракций
    typedef ChurchEncode<2> Two;    // 2 = λfx.f (f x)
    typedef ChurchEncode<3> Three;  // 3 = λfx.f (f (f x))

    // * = λab.λf.a (b f)
    typedef Lambda<'a', Lambda<'b', Lambda<'f',
                Apply<Var<'a'>, Apply<Var<'b'>, Var<'f'> > >
        > > > Multiply;

    // Вычисление (* 2 3)
    typedef Eval<Apply<Apply<Multiply, Two>, Three>> Output;

    // Переход обратно от лямбда-абстракций к натуральным числам
    typedef ChurchDecode<Output> Result;

    std::cout << Result::value;
}

А на выходе получать такое:
ilammy@ferocity ~ $ gcc cpp.cpp
ilammy@ferocity ~ $ ./a.out
6

Статья получилась несколько великоватой, так как мне хотелось рассказать обо всех интересных штуках, которые здесь используются. И ещё она требует базового набора знаний о лямбда-исчислении. Приведённых выше обзоров, среднего знания C++ (с шаблонами), и здравого смысла должно быть достаточно для понимания содержимого.

Под катом находится очередное прокомментированное конструктивное доказательство Тьюринг-полноты шаблонов C++ в виде compile-time интерпретатора бестипового лямбда-исчисления (плюс печеньки в виде макросов и рекурсии).
Читать дальше →

Клуб анонимных программистов, или почему только псих может стать настоящим программистом

Время на прочтение8 мин
Количество просмотров60K
Конечно, вместо того, чтобы тратить время на написание этого поста, я мог бы изучать программирование. Но здесь ведь собрались не ботаны-зануды, чтоб на ночь глядя заниматься всякой компьютерной чепухой, верно? Намного интереснее разобраться — почему одни люди «рождены» быть программистами, а другие страдают и плачут по ночам, но у них мало что выходит. Сначала давайте разберемся в том, кто же такой программист.

Возьмем средний портрет программиста: невзрачный, щуплый, нелюдимый ботан-очкарик, который дни напролет проводит выжигая кодом глаза. Если бы 100-200 лет назад быть таким — шанс выживания был бы невысок. В те времена (во все времена) интеллект был важен, но и другие качества были не менее важны для выживания: сила, ловкость, общительность, умение наладить контакты, поддерживать отношения, завладеть самкой.

Изгою в обществе жилось несладко. Связей мало, общаться никто не хочет, размножаться тоже. Защитить семью труднее, чем обычному, туповатому, но смекливому бандюгану. Если изгой был успешным ботаном, у него был шанс снискать себе уважение в обществе (как-то пучеглазый Эйнштейн с языком наперевес), и ему за его заслуги прощали его чудаковатость. И тем не менее, аутсайдерам жилось несладко.

Сейчас же случилось невероятное. Чудаковатые, нелюдимые, занудные и скушные, но мозговитые ботаны научились с помощью программирования монетизировать свои мозги. Причем, даже лучше, чем врачи, или юристы, у которых мозги шурупают не хуже, а то и лучше. Программисты купаются в лучах славы, как когда-то это делали шахтеры при СССР. Программисты стали негласной элитой общества, как единственная альтернатива бандитизму или предпринимательству, которая позволяет хорошо жить, не нарушая закон и не рискуя жизнью. Двадцатый век удивил мир всеобщей феминизацией и женской эмансипацией. Двадцать первый век же удивил всех тем, что занудные аутсайдеры наконец получили шанс отыграться за столетия унижений и сжиганий на кострах (пожалуй, их сжигали за занудство). Настроения восставших из пепла цивилизации ботанов очень хорошо передают подобные видеоролики:



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

Быстрая, экономная, устойчивая…

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

Если вам понадобится алгоритм сортировки массива, который:
  • Работал бы гарантированно за O(N*log(N)) операций (обменов и сравнений);
  • Требовал бы O(1) дополнительной памяти;
  • Был бы устойчивым (то есть, не менял порядок элементов с одинаковыми ключами)

то вам, скорее всего, предложат ограничиться любыми двумя из этих трёх пунктов. И, в зависимости от вашего выбора, вы получите, например, либо сортировку слиянием (требует O(N) дополнительной памяти), либо пирамидальную сортировку (неустойчив), либо сортировку пузырьком (работает за O(N2)). Если вы ослабите требование на память до O(log(N)) («на рекурсию»), то для вас найдётся алгоритм со сложностью O(N*(log(N)2) — довольно малоизвестный, хотя именно его версия используется в реализации метода std::stable_sort().

На вопрос, можно ли добиться выполнения одновременно всех трёх условий, большинство скажет «вряд ли». Википедия о таких алгоритмах не знает. Среди программистов ходят слухи, что вроде бы, что-то такое существует. Некоторые говорят, что есть «устойчивая быстрая сортировка» — но у той реализации, которую я видел, сложность была всё те же O(N*(log(N)2) (по таймеру). И только в одном обсуждении на StackOverflow дали ссылку на статью B-C. Huang и M. A. Langston, Fast Stable Merging and Sorting in Constant Extra Space (1989-1992), в которой описан алгоритм со всеми тремя свойствами.

Так что же это за алгоритм?

«Универсальные» ссылки в C++11 или T&& не всегда означает «Rvalue Reference»

Время на прочтение14 мин
Количество просмотров44K
Не так давно Скотт Майерс (англ. Scott Meyers) — эксперт по языку программирования C++, автор многих известных книг — опубликовал статью, описывающую подробности использования rvalue ссылок в C++11.
На Хабре эта тема еще не поднималась, и как мне кажется, статья будет интересна сообществу.
Оригинал статьи: «Universal References in C++11—Scott Meyers»

«Универсальные» ссылки в C++11


T&& не всегда означает “Rvalue Reference”

Автор: Scott Meyers

Возможно, наиболее важным нововведением в C++11 являются rvalue ссылки. Они служат тем фундаментом, на котором строятся «семантика переноса (англ. move semantics)» и «perfect forwarding». (Вы можете ознакомится с основами данных механизмов в обзоре Thomas’а Becker’а).

Синтаксически rvalue ссылки объявляются также, как и «нормальные» ссылки (теперь называемые lvalue ссылками), за исключением того, что вы используете два амперсанда вместо одного. Таким образом, эта функция принимает параметр типа rvalue-reference-to-Widget:
void f(Widget&& param);

Учитывая, что rvalue ссылки объявляются с помощью “&&”, было бы разумно предположить, что присутствие “&&” в объявлении типа указывает на rvalue ссылку. Но это не так:
Widget&& var1 = someWidget;         // здесь “&&” означает rvalue ссылку

auto&& var2 = var1;                 // здесь “&&” НЕ означает rvalue ссылку

template<typename T>
void f(std::vector<T>&& param);     // здесь “&&” означает rvalue ссылку

template<typename T>
void f(T&& param);                  // здесь “&&” НЕ означает rvalue ссылку
Читать дальше →

Отказываемся от шаблонных шаблонных параметров

Время на прочтение2 мин
Количество просмотров16K
Использовать шаблонные шаблонные параметры С++ довольно сложно. Хочу продемонстрировать силу boost::mpl и показать трюк, позволяющий описывать шаблоны, полностью отказавшись от шаблонных шаблонных параметров.
Продемонстрирую проблему. Есть класс, принимающий тип объекта и тип контейнера для этого объекта.
template <typename T, typename Container>
struct A
{
  typedef Container<T> type;
};

Так писать нельзя, вы должны использовать шаблонные шаблонные параметры, чтобы указать, что Container сам по себе является шаблоном.
Читать дальше →

Petrovich просклоняет русские имена

Время на прочтение3 мин
Количество просмотров64K
Вам часто приходится иметь дело со склонением имён пользователей на русском языке? При рассылке писем, при отображении страниц и упоминаний, при генерации рекламных объявлений? Скорее всего, приходится изворачиваться и писать все сообщения в именительном падеже — Иванов Пётр Сергеевич.

Это не всегда удобно, не всегда красиво, не всегда уместно. Русский язык одарён богатой морфологией, которая несколько затрудняет его автоматическую обработку. Всем известно, что антропонимы, как полагается именам существительным, подчиняются всем правилам словообразования.

Для решения этой проблемы при использовании Ruby существует Petrovich — удобная легковесная библиотека для автомагического склонения русскоязычных имён, фамилий и отчеств.


Склоняй меня полностью!

Через тернии к Haskell (перевод). 2/2

Время на прочтение18 мин
Количество просмотров45K
Только хардкор, только монады

Через тернии к Haskell. 1/2

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


Первая часть короткого и жесткого введения в Haskell. Вторую часть можно найти здесь

tl;dr: Очень краткое и сжатое введение в Haskell.


UPD. Если туториал вам понравился, черкните пару строк автору оригинальной статьи. Человеку будет приятно ;)
Классные картинки, много текста и вынос мозга

Functional thinking: Thinking functionally, Part 3

Время на прочтение8 мин
Количество просмотров5.4K
В первой и второй частях “Функционального мышления” я рассмотрел некоторые вопросы функционального программирования а также то, как они относятся к Java и связанным с ней языкам. Эта часть продолжит мой обзор, в ней я покажу версию классификатора чисел из предыдущих частей на языке Scala и обсужу некоторые теоретические вопросы, такие как карринг, частичное применение и рекурсия.

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

Functional thinking: Thinking functionally, Часть 2

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

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

Functional thinking: Thinking functionally, Часть 1

Время на прочтение12 мин
Количество просмотров15K
Давайте на мгновение представим, что Вы — дровосек. И благодаря своему лучшему топору в округе, вы являетесь самым продуктивным дровосеком в лагере. Но однажды появляется некто, начинающий расхваливать достоинства новой парадигмы в рубке леса — бензопилы. В силу убедительности продавца, Вы покупаете бензопилу, но не знаете как она работает. Прилагая неимоверные усилия, пробуете вырвать или раскачать дерево, применяя на практике свою новую парадигму. И быстренько делая вывод, что эта самая новомодная бензопила — ерунда, возвращаетесь к привычному делу — рубить лес топором. А затем кто-то приходит и показывает как заводить бензопилу.

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

Итак, добро пожаловать в Functional thinking. Эта серия исследует предмет функционального программирования, но не несет исключительной направленности описать функциональные языки. Как я покажу дальше, написание кода в функциональном стиле касается дизайна, компромиссов, разных повторно используемых кусков кода и служит основой для иных догадок. Насколько это окажется возможным, я попытаюсь показать концепции функционального программирования в Java (или близких к Java языках) и перейду к другим языкам, чтобы осветить возможности, отсутствующие на данный момент в Java. Я не полезу сразу в дебри, рассказывая о довольно необычных вещах, таких как монады (monads). Напротив, я постепенно проведу Вас через новый путь мышления.

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

Информация

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