Pull to refresh
26
0
Акжан @akzhan

CTO, Release manager, Teamlead

Send message

Да, абсолютно. Можно жить и без --build, но у нас это часто приводило к станностям в работе приложения. Обновил проект, забыл запустить с --build. Мы измеряли, у нас разница с --build и без --build всего несколько секунд, что не существенно, особенно с учетом того, что проект рестартуется максимум два раза в день. Проект в целом запускается с --build за секунд 5-10 (2 базы данных, 6 сервисов), не более того. Если запускается дольше, есть вероятность, что Dockerfile не совсем корректно построен. Несколько самых популярных ошибки из нашей практики:


  1. Сторонние зависимости должны идти в начале докера. Они меняются редко и не будут перестраиваться каждый раз, при изменении кода приложения.
  2. Копирование файлов, в которых описаны сторонние зависимости должно идти отдельным шагом, что бы при каждом запуске они не ставились заново. В примере ниже, сразу происходит копирование package.json (зависимости для Node.js приложения), а лишь потом происходит установка зависимостей. Если package.json не меняется — то и зависимости не будут ставиться заново.
  3. На рабочих окружениях, код не копируется в Docker, а добавляется как volume.

FROM node:6.3
EXPOSE 8082
COPY package.json /app/
RUN cd /app && \
    npm install --quiet
WORKDIR /app

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


Уменьшение кирпичиков при развертывании — это как глоток свежего воздуха, морозным зимним утром.

Ограничить поиск в Google Autocomplete одним городом можно, например, так.

Без проблем, например вот это отдаст сразу из каких городов отправляется больше рейсов и распределение времени задержки прилёта, по авиакомпаниям в одном запросе, да еще и наверняка быстрее:


{
  "aggs" : {
    "most_flights_from" : {
      "terms" : {
        "field" : "OriginCityName",
        "size" : 20
      }
    },
    "carriers" : {
      "terms" : {
        "field" : "Carrier",
        "size" : 0
      },
      "aggs" : {
        "avg_delays": {
          "percentiles": {
            "field" : "DepDelay"
          }
        }
      }
    }
  }
}

Это 2 простейших агрегации (terms и квантили), все остальное тоже легко выполнимо — в ES три десятка разных агрегаций, которые спокойно накладываются, вкладываются и поворачиваются как угодно.


Более того, ES умеет еще и сам находить "выделяющиеся из общей массы" значения, например по каждой авиакомпании подсказать город, из которого она летает заметно чаще остальных авиакомпаний. Это настолько сложно, что надо всего-лишь добавить в последний aggs перед/после avg_delays это:


        "significant_cities": {
            "significant_terms": {"field": "OriginCityName"}
        }

Я уж не говорю про невероятно удобную работу с датами и геолокацией — хочешь тебе агрегации и вычисления, хочешь — сортировка с экспоненциальным убыванием веса от расстояния, при этом, например, ближе 300м вес одинаковый, дальше 3км вообще всем ноль. Берите дистрибутив и пробуйте, документация там более чем понятная. ES очень активно используют Github, Foursquare, Twitter, Netflix и многие другие, вплоть до Cisco с Microsoft. Свой велосипед можете выбросить.


P.S. Если что — я как раз недавно написал систему аналитики форм, использующую ES и одним запросом считающую 2 десятка показателей вроде квантилей среднего времени, потраченного на каждое поле, % юзеров, взаимодействовавших/менявших это поле, средней длины вводимого в поле текста и т.д. Все это с группировкой/фильтрацией по чему угодно — хоть по ОС или урлу, хоть по css-классу формы (и дате, естественно). В базе сырые данные — события (click, focusin, change и т.д.) и время, десятки миллионов записей и 0.5GB данных для одного небольшого сайта, на котором все это обкатывается. Уровень вложенности агрегаций уходит за 10, все крутится на маленьком запасном сервере с HDD(!) и отдает все два десятка показателей с двойной группировкой и любой фильтрацией за 1 секунду уже в виде HTML. Если сильно интересно — могу дать посмотреть. С вашей штукой это превратилось бы в 30 отдельных запросов с кучей подзапросов и структуру данных из 3-4х таблиц, которые надо постоянно join'ить. Про скорость даже боюсь думать :)

Первым кандидатом оказалась симпатичная девушка в джинсах и свитере. Я пропустил мимо ушей ее резюме, обратив внимание лишь на упоминание какого-то сертификата Quality Assurance Engineer. Во время собеседования девушка вела себя довольно-таки уверенно, то и дело поминала Transition Phase, CMM, ISO9000 и трехлетний опыт работы. Все это время я смотрел в окно и думал о том, что сидеть она будет в комнате через коридор, и что я не смогу использовать обычный лексикон при объяснении тонких моментов тест-плана.

Вторым был парень-студент, во взгляде которого читалась острейшая нужда в денежных средствах. На этот раз я принял участие в собеседовании и узнал, что он – гениальный программист и веб-дизайнер, что у него даже есть свой сайт, и что он сейчас пишет IDE для PHP на MAC. Я бы выяснил, почему он предпочитает MAC, но поймал взгляд технического директора и свернул беседу.

После ухода кандидатов мы несколько минут поспорили о проблемах девушек в чисто мужских коллективах и проблемах излишней амбициозности читателей журнала ксакеп, и сошлись на том, что «теперь хоть матов будет меньше», — девушка была очевидным выбором. Мы уже направились к выходу, когда у технического зазвонил мобильник. Обменявшись парой реплик со своим собеседником, технический зажал микрофон рукой и шепотом известил нас о том, что у входа в офис ждет еще один кандидат. Мы переглянулись. Решение было уже принято, но как-то неудобно было давать от ворот поворот человеку, не поленившемуся притащиться к нам на окраину. Технический велел охране впустить, и мы вернулись в конференц-зал.

Третий кандидат выглядел немного моложе моих лет. Улыбнувшись, он представился и сел в кресло, бросив папку на стол. Маркетинговый директор порылся у себя в бумагах и спросил:

— Извините, я что-то не вижу вашего резюме. Вы не присылали его нам?

— Присылал, — ответил кандидат, с интересом оглядываясь вокруг, — Но у вас почтовый сервер глючит.

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

— Может быть, проблема все же не в сервере? Со связью что-нибудь, или почтовый клиент не сработал? Вы, кстати, не с мейл.ру отправляли?

— Нет, — ответил кандидат, продолжая оглядываться. Его внимание привлекла настольная лампа. Щелкнув пару раз выключателем, он сказал: «Смотрите-ка!» – и полез под стол. Лампа вспыхнула и перегорела. Кандидат вылез из-под стола и продолжил:

— Если оставить выключатель в промежуточном положении, а потом включить шнур в розетку, лампа перегорит!

— Спасибо. Может быть, вы принесли резюме с собой? — поинтересовался я.

— Да, конечно, вот оно, — он подал лист А4, — а вот это — распечатка ответа вашего почтового сервера, — он подал еще один лист.

Сисадмин с интересом взял его из моих рук и пробежал глазами:

— Но!.. А как?.. Странно… Я сейчас! — с этими словами он почти выбежал из комнаты.

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

— Я так и знал! Дефект в системе регулировки пневматического амортизатора. Если отогнуть ручку вверх, а потом вбок…

— Принеси ему стул, — попросил меня технический директор, и я вышел из комнаты.

В коридоре я встретил сисадмина. На его лице было такое выражение, как если бы он обнаружил пиво в одной из бутылей для кулера.

— Что там с почтовиком? — спросил я.

— Ты будешь смеяться. В его письме MIME-boundary нарушает RFC 2046. Ничего страшного, но наш сервер падает при приеме такого текста! Измени хотя бы один символ – все пройдет нормально. Я посмотрел в логи – сервер падал четыре раза в понедельник. Судя по всему, именно из-за этого товарища.

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

— А вот стол у вас хороший, основательный! — сказал кандидат. Как говорил Оззи Осборн, «я начал понимать, что приходит время прощаться».

— Мы с вами свяжемся, до свидания.

— Можно, я от вас позвоню? — спросил этот демон разрушения.

— НЕТ! — ответил технический директор таким голосом, что кандидат мгновенно исчез.

Налив себе еще немного кофе, мы обсудили результаты собеседования. Увы, девушка не прошла.

Сертификат QA Engineer не заменит природного таланта — с таким парнем в команде нам просто не удастся сдать софт, если в нем будет хотя бы один баг.

Завтра пятница, значит – знакомство с новым членом коллектива. Пиво и бильярд в Потерянном Кластере. Пожалуй, я лучше пойду в Пива.NET — пусть попса, но мало ли что он захочет протестировать в баре...
http://lib.rin.ru/doc/i/39687p5.html
Текст почти утерян, поэтому вот такая сохранившаяся копия. Начинать со слов "-Слышь, Егорыч, у меня для тебя такая
задачка имеется"
Индекс то нужен, причем несколько, в том числе составные. И в MySQL 5 они даже будут использоваться
используя index merge алгоритм. Но все же лкчше такие запросы (с такими условиями)
WHERE (price>5) OR (price=5 AND height>0) AND (price=5 AND height=0 AND id>1174)
не писать, а переписывать их на запросы с UNION ALL, хоть и букаф больше, но работают значительно быстрей, притом если у вас есть общий лимит, скажем вывести 10 записей, то просто нужно добавить лимит в каждый из UNION-ов и в итоге, у вас получается датасет максимум из 30 записей (для 3х юнионов) который впоследствии сортируется и из него достаются 10; а не как в приведенном случае огромный датасет, который будет сортироваться используя огромтую темпорари тейбл. Вы можете проверить это с помощью все той же команды SHOW STATUS и посмотреть кол-во записей и чтений.

Ну, я автору, конечно плюс поставил, для меня любая статься в блоге MySQL за радость, только почему-то мне кажется, что каждый автор, который пишет про MySQL сразу поднимает проблемму педжинейшн, как буд-то других задач и проблем связанных с мускулом больше нет…
  1. Существует правило, по которому все элементы с float желательно оборачивать элементом с так называемым clearfix — это хак, который «очищает поток», искусственно выставляет у контейнера с плавающими элементами высоту, равную высоте самого крупного из них. Без него контейнер будет иметь нулевую высоту (т.к. в нем нет статического содержимого), а это может привести к тому, что последующие за ним элементы как бы «протекут» внутрь него:

    jsfiddle.net/h2k3q/

    В случае Bootstrap то же самое: сеточные «колонки» .col.col-md-4 делаются на float, а для .row задается «micro clearfix» вида

    .row:before, .row:after{
        display: table;
        content: " "
    }
    


    Кроме этого, для .row также задаются отрицательные горизонтальные отступы, равные постоянному «зазору» сетки — это необходимо для создания «full-width layout», а в некоторых css-фреймворках (например, Foundation) для .row задается также max-width, что ограничивает ширину всей сетки, и выравнивание по центру (margin: 0 auto) — по сути, то же самое, что делает .container у Bootstrap.
  2. Это обусловлено фреймворком?

    Скорее, это обусловлено структурой макета :) Но, как уже писал выше, от этих классов можно избавиться, используя миксины:

    {селектор для нужного "row"} > div{
        .make-md-column( 4 )
    }
    {селектор для нужного "row"} > div:not(:first-child){
        .make-md-column-offset( 1 )
    }
    


UFO landed and left these words here
На мой взгляд, i18n-tasks будет получше. Гораздо. Гем позволяет не только показать недостающие ключи, но также находит устаревшие, не используемые.

image

Ах да, он же еще позволяет переводить недостающий перевод буквально одной командой с помощью google translate (и конечно же, можно указать, какие локали хочется перевести). Да и с Rspec'ом есть интеграция. Ну и напоследок: библиотека активно развивается и поддерживается, а у того же differz последний коммит был месяц назад.

В общем, по-моему, выбор очевиден.
Ох, зря вы упомянули MongoDB в контексте этой статьи :) Там всё очень плохо. На каждого клиента к mongos — 1 тред в mongos, 1 коннект mongos-mongod и ещё один тред в mongod, работа с сетью блокирующая. В итоге по 2-3 тысячи тредов на каждом mongod. Таски на мультиплексирование сети стоят аж с 2009 года.
Решил проблему релевантности самостоятельно. Отказался от сфинкса, заюзал майэскюэлевский поиск — для меня самое то оказалось. Краткий хау ту моих действий для ленивых.

1. Сначала был лайк, и был он медленен и нерелевантен:
SELECT * FROM `wharrgarbl_mp3s_copy2905` WHERE `artist` LIKE '%coil%' LIMIT 0, 30// 1.7538 сек

2. Нужен индекс. Добавляем:
ALTER TABLE wharrgarbl_mp3s_copy2905 ADD FULLTEXT (artist);//ждем пару минут (зависит от того сколько лямов в таблице)

3. Преобразуем запрос:
SELECT * ,MATCH artist AGAINST ('coil') AS relev FROM wharrgarbl_mp3s_copy2905 WHERE MATCH artist AGAINST ('coil')>0//0.0019 сек.

И всё. По запросу coil — coil выше recoil, а Ария выше Дискотека авария.
Быстро. Просто. Вкусно. Удобно.
Мне хватает вобщем.
Слово-запрос кстати надо подготовить ещё, вырезать спец символы, разбить по словам и т.п.
Читать тут: phpclub.ru/detail/article/mysql_search?printVersion=1
github.com/operasoftware/browserjs/blob/master/OPRdesktop/browserjs-15.0.js
В этом же репе лежат скрипты для других браузеров.
Ужасно наблюдать собственную профдеформацию — где нормальный человек видит красивое фото, дизайнер видит японский клипарт конца 90х с футажами воды с пузырьками, синий бордер по контуру мобильного телефона и пузырьки наложенные оверлеем. Ну и где-то там на бекграунде еще отмечаешь, что профессионально сделано.

Прошу прощения за оффтоп.
Знакомые каждому и не нуждающиеся в упоминании:

Новости сферы (и новостные блоги IT):

Любимые топики reddit:

Хобби (я фанат игр Half-Life и в свободное время увлекаюсь мэппингом для кс. Поэтому люблю читать про valve и просто читать про gamedev с надеждой осуществить в будущем мечту работы над играми)

Про django ничего переодического (ну кроме редких статей на хабре и реддите) не читал до сегодняшнего дня, поэтому кланюсь в пояс, спасибо.

Да. И не забываем про работу!

Отличное замечание, но, боюсь, для меня работа на сегодня окончена всвязи с сотней вкладок с интересными статьями. :)
UFO landed and left these words here
«Real programmers can write assembly code in any language» — Larry Wall, 1990
А я и так провожу время на реддите. А если еще поставить Reddit Enhancement Suite, то он становится бесконечным, только и успевай жать «вниз».
На самом деле, реддит не только развлекательный сайт. Я подписан на /r/ipv6, /r/linux, /r/netsec, /r/programming, /r/software, /r/technology, и новости о чем-то новом появляются явно быстрее, чем на хабре.

Почему-то реддит не очень популярен среди русскоязычной аудитории, хотелось бы это исправить. Хотя встречал там, например, freetonik
Однажды у Генри Киссинджера спросили:
— Что такое «челночная дипломатия»?
Киссинджер ответил:
— О! Это универсальный метод! Поясню на примере: вы хотите методом челночной дипломатии выдать дочь Рокфеллера замуж за простого парня из русской деревни.
— Каким образом?
— Очень просто. Я еду в русскую деревню, нахожу там простого парня и спрашиваю:
— Хочешь жениться на американской еврейке?
Он мне:
— На*рена?! У нас и своих девчонок полно.
Я ему:
— Да. Но она — дочка миллиардера!
Он:
— О! Это меняет дело…
Тогда я еду в Швейцарию, на заседание правления банка и спрашиваю:
— Вы хотите иметь президентом сибирского мужика?
— Фу, — говорят мне в банке.
— А если он, при этом, будет зятем Рокфеллера?
— О! Это конечно меняет дело!
И такида, я еду домой к Рокфеллеру и спрашиваю:
— Хотите иметь зятем русского мужика?
Он мне:
— Что вы такое говорите, у нас в семье все — финансисты!
Я ему:
— А он, как раз, — президент правления Швейцарского банка!
Он:
— О! Это меняет дело! Сюзи! Пойди сюда. Мистер Киссинджер нашел тебе
жениха. Это президент Швейцарского банка!
Сюзи:
— Фи… Все эти финансисты — дохляки или педики!
А я ей:
— Да! Но этот — здоровенный сибирский мужик!
Она:
— Ооо! Это меняет дело!
Более извращенного способа не видел еще :)
BootCamp на поздних Air сам создает загрузочную флешку и устанавливает с нее, не нужно плясок с бубном.
А если у вас не Air (либо ранний) и кнопка на создание флешки в bootcamp недоступна, то поможет вот эта инструкция:
www.codez4mac.com/forum/viewtopic.php?f=212&t=61921

У самого неделю назад была такая проблема, решил именно этим способом (bootcamp отказывался создавать образ, refit давал черный экран).

Вдруг кому пригодится.

Information

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