Pull to refresh
0
0

Танцы с бубном

Send message

Я написал кроссбраузерное расширение для вкладок, но вы так не делайте

Reading time11 min
Views12K

Длинное, нудное вступление с претензией на манию величия


Однажды я обнаружил, что меня, как всегда, что-то сильно не устраивает в этом мире. А именно, введя какой-то длинный запрос в поисковике на настольном компьютере и затем перейдя на планшет, я никак не мог вспомнить дословно текст запроса, чтобы выйти ровно на те же результаты. А начиналось все так хорошо. Я увидел в поисковике ссылку на ответ на свой вопрос и понял, что она сулит долгое чтиво. Тогда я выключил комп и плюхнулся на диван с планшетом с мыслью о том, что вот сейчас я просто заново вобью все это в поисковик, открою ту ссылку теперь уже на планшете и лежа, спокойно, в более удобной позе прочитаю… Но не тут-то было. Какие-то мелкие разночтения в тексте — и моей ссылки уже нет в выдаче поисковика. Воспроизвести саму ссылку — тоже не вариант: она слишком длинная. Ломая голову над вариантами текста запроса, я чуть было в ярости не сломал планшет. Черт побери, пришлось вставать, снова включать компьютер, запускать браузер и копаться в истории, чтобы найти точный текст своего запроса.


Расширение, установленное в Chrome и Firefox
Читать дальше →
Total votes 19: ↑16 and ↓3+13
Comments33

7 типичных ошибок в английском, которые мы делаем при общении с иностранцами

Reading time4 min
Views242K
image

Помните анекдот про Штирлица, в котором ничего не выдавало советского разведчика, даже волочащийся парашют и буденовка? Примерно такая же история регулярно происходит с нашими соотечественниками при общении с носителями английского языка. Американец Дэниел на канале онлайн-школы Skyeng рассказал, какие фразы и ошибки выдают в нас иностранцев, а также как этого избежать.
Читать дальше →
Total votes 79: ↑67 and ↓12+55
Comments350

Ричард Хэмминг: Глава 3. История компьютеров — железо

Reading time15 min
Views12K
«Цель этого курса — подготовить вас к вашему техническому будущему.»

imageПривет, Хабр. Помните офигенную статью «Вы и ваша работа» (+219, 2265 в закладки, 353k прочтений)?

Так вот у Хэмминга (да, да, самоконтролирующиеся и самокорректирующиеся коды Хэмминга) есть целая книга, написанная по мотивам его лекций. Давайте ее переведем, ведь мужик дело говорит.

Это книга не просто про ИТ, это книга про стиль мышления невероятно крутых людей. «Это не просто заряд положительного мышления; в ней описаны условия, которые увеличивают шансы сделать великую работу.»

Мы уже перевели 15 (из 30) глав.
За перевод спасибо urticazoku, которая откликнулась на мой призыв в «предыдущей главе». Кто хочет помочь с переводом — пишите в личку или на почту magisterludi2016@yandex.ru (Кстати, мы еще запустили перевод еще одной крутейшей книги — «The Dream Machine: История компьютерной революции»), а еще переводим Марвина Мински.

Глава 3. История компьютеров — железо


История вычислений возможно началась с первобытного человека, использующего гальки для сложения. Маршак (Гарвард) обнаружил, что то, что считалось царапинами на костях времен пещерного человека было на самом деле тщательно срисованными линиями, связанными с фазами Луны. Строительство Стоунхенджа на плато Солсбери в Англии проходило в три этапа: 1900-1700, 1700-1500, и 1500-1400 гг. до н.э., и было тесно связано с астрономическими наблюдениями, что свидетельствует о значительном опыте в астрономии. Работа в археоастрономии показала, что у многих первобытных народов были значительные знания об астрономических событиях. В Китае, Индии и Мексике сохранились объекты, называемые обсерваториями, но у нас нет полного понимания как они использовались. На наших западных равнинах много следов астрономических обсерваторий индейцев.
Читать дальше →
Total votes 11: ↑10 and ↓1+9
Comments0

Тестирование проектов C/C++ с помощью Python

Reading time11 min
Views12K

Введение


Хорошо известна возможность интеграции Python и C / C++. Как правило, этот прием используется для ускорения программ на Python или с целью подстройки программ на C / C++. Я хотел бы осветить возможность использование python для тестирования кода на C/C++ в IDE без поддержки системы организации тестов в IDE. С моей точки зрения это целесообразно применять в сфере разработки программного обеспечения для микроконтроллеров.

Можно много рассуждать на тему необходимости тестов в проектах, я исхожу из того что тесты помогают мне разрабатывать функционал программы. И после завершения проекта, по прошествии некоторого времени, помогают в нем разобраться и уберегают от ошибок.

При разработке программ для микроконтроллеров, я сталкивался с отсутствием стандартного ввода / вывода (конечно можно переопределить функции ввода вывода и в симуляторе, выводить данные через UART — но часто UART уже задействован, да и симулятор работает не всегда корректно) и большими рисками вывести из строя аппаратное обеспечение ошибочной бизнес логикой. На стадии разработки, я реализовывал отдельные проекты, тестирующие части программы и далее на меня ложилась ответственность за запуск всех тестовых приложений после внесения изменений. Конечно, это все можно автоматизировать. Так можно работать, но я нашел способ лучше.
Читать дальше →
Total votes 12: ↑11 and ↓1+10
Comments9

Оптимизация кода в уме, или «Ну так же однозначно быстрее»

Reading time4 min
Views25K
Намедни работая над одной ошибкой в одном опенсорсном проекте, увидел как коллега (тоже работающий параллельно над той же проблемой) залил такой вот коммит [31a078bec7]:

   	/*
-	 * Select the list item based on the index. Negative operand means
-	 * end-based indexing (-2, ...), and -1 means out of range.
+	 * Decode end-offset index values.
   	 */
-	if (opnd < -1) {
-	    index = opnd+1 + objc;
-	} else {
-	    index = opnd;
-	}
+	index = opnd + (opnd <= TCL_INDEX_END)*(objc - 1 - TCL_INDEX_END);
   	pcAdjustment = 5;

Изменение само по себе правильное (теперь TCL_INDEX_END есть константное определение (-2)).

И грубо говоря в уме это разворачивается в следующее (все переменные int):

index = opnd + cmp(opnd, (-2))==>(0 | 1) * (objc - 1 - (-2));

Т. е. он как бы тем самым хотел сэкономить здесь один условный переход.
И всё как бы ничего, однако меня всё же насторожила такая казалось бы пустячная «оптимизация» с уклоном в арифметику.

Во первых, это изменение касается самой «главной» функции в этом проекте (TEBCresume), ибо она ответственна за исполнение байт-кода (JIT скомпилированных инструкций языка TCL). По этой причине эта функция еще и самая большая (порядка 6 тысяч строк + примитивы и макросы) и одна из самых сложных в кодовой базе проекта, с множественными `goto`, головоломными макросами для работы со «стеком» исполнения, свёртка/развертка NRE (nonrecursive evaluation) и т.д. и т.п.

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

Во вторых, по роду деятельности мне часто приходится оптимизировать сишный код, разглядывая его ассемблерное отражение, выжимая доли микро- а то и нано-секунд, и я часто вижу, что там очень всё совсем неоднозначно бывает. Как минимум иногда разворачивая такие вот «экономящие» условный jump конструкции обратно в if или даже if/else, я видел улучшение как и в результирующем ассемблерном коде, так и явно при конечном сравнении производительности результатов исполнения.

Собственно к чему я все это писал — хотелось на примере показать как оно бывает, ну и раз уж коснулись этой темы, собрать немного статистики. Посему пара опросов в конце статьи…
Развернуть в ассемблер ...
Total votes 51: ↑48 and ↓3+45
Comments55

Kali Linux теперь доступен в Microsoft Store

Reading time1 min
Views41K

 
Буквально 1,5 месяца назад я писал о возможности установки Kali Linux в Windows окружении используя подсистему WSL. Сейчас появилась возможность установки и запуска Kali Linux из магазина приложений Windows. Это похоже на первоапрельскую шутку, но это действительно так.

Total votes 45: ↑43 and ↓2+41
Comments32

Правильная работа с закладками: как работать эффективнее и запоминать больше

Reading time8 min
Views91K
Принцип гиперссылок, создающий основу для интерактивных медиа, воплощает процесс ассоциаций, нередко рассматриваемый в качестве одной из важнейших составляющих человеческого мышления.

Л. Манович, «Язык новых медиа».


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

В какой-то момент меня стало удивлять, почему многие пользователи не обращают внимание на очевидные преимущества, которые даёт «закладочная система», ведь она позволяет не только быстрее работать, но и запоминать больше (напомню, главная функция закладок как раз и состоит в запоминании)!

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

Материал собирался на основе анализа функционала браузеров Mozilla Firefox, Google Chrome, Opera, Yandex.Browser, Opera Mobile и Chrome Mobile, которые у меня стоят больше в целях проверки вёрстки сайтов, но также позволили сравнить закладочные возможности браузеров сами по себе.
Читать дальше →
Total votes 22: ↑19 and ↓3+16
Comments68

Асинхронные HTTP-запросы на C++: входящие через RESTinio, исходящие через libcurl. Часть 3

Reading time23 min
Views3.8K
В предыдущей статье мы разобрали реализацию двухпоточного bridge_server-а. На одном потоке асинхронно обрабатываются входящие HTTP-запросы посредством RESTinio. На втором потоке выполняются асинхронные запросы к delay_server-у посредством libcurl в виде curl_multi с использованием функций curl_multi_perform и curl_multi_wait.

Сегодня же мы разберем другую реализацию bridge_server-а, которая асинхронно обслуживает и входящие, и исходящие HTTP-запросы на одном и том же пуле потоков. Из libcurl-а для этих целей применяется функция curl_multi_socket_action.

Эта реализация заняла у нас больше всего времени. Давно не приходилось выкуривать столько бамбука, сколько довелось при разбирательстве с документацией к этой функции и примерами ее использования. По началу все это вообще воспринималось как какая-то черная магия, но потом свет в конце туннеля все-таки забрезжил, а код — заработал. Как именно заработал? А вот об этом сегодня и поговорим.
Читать дальше →
Total votes 14: ↑14 and ↓0+14
Comments7

Языки программирования для квантового компьютера

Reading time9 min
Views71K


Прототип ядра ионного квантового компьютера. Ion Quantum Technology Group, Сассекский университет


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


К счастью, для решения этой проблемы появляются отличные проекты, привлекающие внимание широкой аудитории. Например, несколько лет назад IBM дала возможность любому подключиться к 5-кубитному компьютеру. В проекте зарегистрировались 70 000 человек.


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


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

Читать дальше →
Total votes 44: ↑43 and ↓1+42
Comments23

Чего из Rust мне не хватает в C

Reading time7 min
Views23K
Об авторе. Федерико Мена-Кинтеро — мексиканский программист, один из основателей проекта GNOME.

Librsvg достиг переломного момента: внезапно выясняется, что легче портировать некоторые основные части из C на Rust, чем просто добавить аксессоры. Кроме того, всё больше «мяса» библиотеки сейчас написано на Rust.

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

Элегия C


Я влюбился в C около 24 лет назад. Выучил азы по второму изданию “The C Programming Language by K&R” в переводе на испанский. До этого я использовал достаточно низкоуровневый Turbo Pascal, с указателями и ручным распределением памяти, так что C казался приятным и придающим сил.

K&R — отличная книга для выработки стиля и лаконичности. Эта маленькая книжка даже научит вас реализовать простой malloc()/free(), что поистине просветляет. Даже низкоуровневые конструкции можно вставлять в самом языке!

В последующие годы я хорошо освоил C. Это небольшой язык с маленькой стандартной библиотекой. Вероятно, идеальный язык для реализации ядра Unix на 20 000 строк кода или около того.
Читать дальше →
Total votes 80: ↑76 and ↓4+72
Comments178

Асинхронные HTTP-запросы на C++: входящие через RESTinio, исходящие через libcurl. Часть 1

Reading time16 min
Views9.6K

Преамбула


Наша команда занимается разработкой небольшого, удобного в использовании, встраиваемого, асинхронного HTTP-сервера для современного C++ под названием RESTinio. Начали его делать потому, что нужна была именно асинхронная обработка входящих HTTP-запросов, а ничего готового, чтобы нам понравилось, не нашлось. Как показывает жизнь, асинхронная обработка HTTP-запросов в C++ приложениях нужна не только нам. Давеча на связь вышли разработчики из одной компании с вопросом о том, можно ли как-то подружить асинхронную обработку входящих запросов в RESTinio с выдачей асинхронных исходящих запросов посредством libcurl.

По мере выяснения ситуации мы обнаружили, что эта компания столкнулась с условиями, с которыми сталкивались и мы сами, и из-за которых мы и занялись разработкой RESTinio. Суть в том, что написанное на C++ приложение принимает входящий HTTP-запрос. В процессе обработки запроса приложению нужно обратиться к стороннему серверу. Этот сервер может отвечать довольно долго. Скажем, 10 секунд (хотя 10 секунд — это еще хорошо). Если делать синхронный запрос к стороннему серверу, то блокируется рабочая нить, на которой выполняется HTTP-запрос. А это начинает ограничивать количество параллельных запросов, которые может обслуживать приложение.
Читать дальше →
Total votes 16: ↑16 and ↓0+16
Comments0

Как сделать адекватное отображение horizontal scroll bar в QTreeWidget с одной колонкой

Reading time2 min
Views5K

Привет, Хабр.


В этой статье я решил оставить решение проблемы непонятного поведения QTreeWidget – GUI компонента кроссплатформенного фреймворка Qt. Проблема, мне кажется, актуальная, потому что вопрос задаётся на многих форумах, но верного решения не приводится. Впрочем, если я ошибаюсь, НЛО мне об этом сообщит.


Проблема


В Qt есть компонент QTreeWidget, предназначенный для древовидного отображения информации. Элементом или узлом дерева может быть текст с картинкой, или же другой виджет.


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


Никакое свойство класса QTreeWidget или его предков не даёт возможности активировать автоматическое изменение размера области просмотра колонки. Так что, если вы тоже столкнулись с этим недоразумением, прошу под кат.

Читать дальше →
Total votes 13: ↑12 and ↓1+11
Comments5

Linux в одном файле для Macbook

Reading time4 min
Views35K


TL;DR Можно уместить полноценный Linux Live дистрибутив в один файл, если вкомпилировать в ядро initramfs с корневой файловой системой. Компьютеры с UEFI умеют загружать такой файл напрямую, без помощи загрузчика типа GRUB. У меня получилось уместить дистрибутив с программами aircrack-ng, reaver и драйверами для карт Wi-Fi в файл размером 12 мегабайт (наверняка можно еще меньше).

Основные преимущества


  • Работает на любых компьютерах с UEFI — один и тот же файл будет работать на PC и Mac.
  • Не требует установки — достаточно скопировать один файл на EFI-раздел диска и указать в переменных NVRAM путь к этому файлу.
  • Не нужно устанавливать загрузчики GRUB, rEFInd — ядро Linux собранное с поддержкой EFI Stub можно грузить напрямую без промежуточного загрузчика.
  • Не нужны USB-флешки — скопированный на раздел EFI дистрибутив остается там навсегда, и его можно будет загрузить в любой момент. Он не занимает места на разделе основной системы, так как раздел EFI не используется в ОС.
  • Не изменяет процесс загрузки — систему можно загрузить один раз, без изменения порядка загрузки в настройках UEFI. Следующая перезагрузка компьютера загрузит обычную операционную систему. Никаких следов Linux в очередности загрузки не останется.
  • Совместимо с шифрованием диска FileVault и т.д. — файл копируется на EFI System Partition, специальный зарезервированный раздел диска. В компьютерах Mac его размер около 200 мегабайт. Он выделен под Boot Camp и обычно не используется
Читать дальше →
Total votes 78: ↑77 and ↓1+76
Comments48

Пробрасываем вызовы Steam API из Wine в GNU/Linux и обратно с помощью Nim

Reading time22 min
Views16K

У игроков на платформе GNU/Linux множество проблем. Одна из них — необходимость устанавливать отдельный клиент Steam для каждой Windows игры из Steam. Ситуация усугубляется необходимостью установки ещё и родного клиента Steam для портированных и кроссплатформенных игр.

Но что если найти способ использовать один клиент для всех игр? За основу можно взять родной клиент, а игры для Windows пусть обращаются к нему так же как, например, к OpenGL или звуковой подсистеме GNU/Linux — средствами Wine. О реализации такого подхода и пойдёт речь далее.

Читать дальше →
Total votes 59: ↑56 and ↓3+53
Comments10

Флаги в аргументах функций

Reading time9 min
Views26K
Вы когда-нибудь сталкивались с таким кодом?

process(true, false);

Эта функция, судя по названию, что-то обрабатывает (process). Но что означают параметры? Какой параметр здесь true, а какой false? По вызывающему коду об этом нельзя судить.

Нам придется заглянуть в объявление функции, которое дает подсказку:

void process(bool withValidation,
             bool withNewEngine);

Очевидно, автор использует два параметра типа bool как флаги (toggles). Реализация функции может быть похожа на это:

void process(bool withValidation,
             bool withNewEngine)
{
  if (withValidation)  // используется 1-й флаг
    validate(); // % подтвердить
 
  do_something_toggle_independent_1
 
  if (withNewEngine)   // используется 2-й флаг
    do_something_new();
  else
    do_something_old();
 
  do_something_toggle_independent_2();
}

Назначение флагов очевидно, поскольку каждый из них имеет осмысленное название. Проблема возникает в вызывающем коде.
Читать дальше →
Total votes 22: ↑21 and ↓1+20
Comments22

Ускоренный курс по ассемблерам

Reading time3 min
Views16K
Это перевод одной из статей Lin Clark. Если вы не читали остальные, мы рекомендуем начать с начала.

Чтобы понять, как работает WebAssembly, неплохо понимать, что такое код на ассемблере и как компиляторы его генерируют. В статье о JIT я сравнивала взаимодействие с компьютером со взаимодействием с инопланетянином.

Читать дальше →
Total votes 48: ↑39 and ↓9+30
Comments6

Книга «UNIX. Профессиональное программирование. 3-е изд.»

Reading time20 min
Views13K
image Всем привет! Мы переиздали классический труд Уильяма Стивенсона и Стивена Раго с исправленными опечатками перевода в твердой обложке.

Эта книга заслуженно пользуется популярностью у серьезных программистов во всем мире, поскольку содержит самую важную и практическую информацию об управлении ядрами UNIX и Linux. Без этих знаний невозможно написать эффективный и надежный код. От основ — файлы, каталоги и процессы — вы постепенно перейдете к более сложным вопросам, таким как обработка сигналов и терминальный ввод/вывод, многопоточная модель выполнения и межпроцессное взаимодействие с применением сокетов. В общей сложности в этой книге охвачены более 70 интерфейсов, включая функции POSIX асинхронного ввода/вывода, циклические блокировки, барьеры и семафоры POSIX.

Внутри мы рассмотрим главу «Процессы-демоны».
Читать дальше →
Total votes 20: ↑20 and ↓0+20
Comments2

Кто такой программист?

Reading time6 min
Views25K
О времена, о нравы. Сегодня в Тостере увидел тему, в которой человек признавался, что работая java-разработчиком он знает алгебру и геометрию на уровне 6 класса и просил посоветовать учебники. Этот запрос несомненно вызывает уважение — человек хочет учиться.

Начнём сначала. Я учился в хорошей физмат школе в 90-е годы. Читай между строк — по советской программе. На этом можно было бы и закончить, потому что далеко не все учились в хорошей физмат школе по советской программе, а значит я по определению страшно оторван от народа. И точно ничего не понимаю в жизни.

Да, кодить мы начали в третьем классе, и это был не Хогвартс
Читать дальше →
Total votes 86: ↑50 and ↓36+14
Comments211

Пишем макросы для TODO и FIXME в Sublime Text, или как немного кода позволяет сэкономить много времени

Reading time5 min
Views5.4K

Великий Мастер бился с Хаосом. И чем крепче он бился, тем больше к нему приходило мыслей. Когда приходили мысли о толковом, он записывал их, предваряя магическим словом TODO. Мысли же о бестолковом он тоже записывал, но для таких мыслей у него было другое магическое слово — FIXME. И надо сказать, что от Начала Времён для победы над Хаосом не было более сильных заклинаний, чем эти два.



Предлагаю порассуждать о том, как облегчить себе жизнь и обзавестись простым инструментом с горячими клавишами для вставки в код TODO и FIXME комментариев в популярном редакторе Sublime Text.

Читать дальше →
Total votes 9: ↑8 and ↓1+7
Comments2

Книга «Linux API. Исчерпывающее руководство»

Reading time19 min
Views33K
image Привет, Хаброжители! Недавно у нас вышел фундаментальный труд Майкла Керриска по программным интерфейсам операционной системы Linux. В книге представлено практически полное описание API системного программирования под управлением Linux.

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

Читать дальше →
Total votes 30: ↑29 and ↓1+28
Comments9
1
23 ...

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity