> Допустим под 20
сколько РАЗЛИЧНЫХ контейнеров ранается в проекте. Возможно, у вас действительно 20. Но если у вас кластер эластика на 15 машин — считайте это за 1.
>унифицированные интерфейсы конфигурирования
нет. Переменные окружения? У всех всё по-разному, а некоторые аппы, пока файл не положишь — не заработают. Либо приложение можно удобно конфигурировать, либо нет. Докер тут никак не помогает. И если завтра дедлайн, а конфигурить через файл — будешь монтировать файл.
>Не зависит особо от докера
О том и моя мысль, что плюсы, которые приписывают докеру, вовсе не его
> Да, можно понаписать башскриптов
Не так. «нужно понаписать пачку башскриптов». Entrypoint более-менее непростого контейнера видели? Init перед entrypoint-ом и прочее весёлости. там много скриптов получается. Благо, это не всегда плохо.
> Грубо, 49 запущенных на хосте nginx слушают порт 8080 и только один слушает 80
Это тоже не про докер.
Внесу свои 6 копеек.
Я тоже недолюбливаю докер, хотя, начал использовать его до того, как это стало мейнстримом.
И мои мысли о тех преимуществах, про которые рассказывают следующие:
1. Безопасность — разработчику плевать, это не то, ради чего он рад пользоваться докером. admin/admin глубоко в коде и прочие радости. Пока разраба не пнут — не пофиксит
2. Изоляция процессов — посмотрите на свой проект, сколько там контейнеров? 5? nginx, java, redis, postgres, logstash? Запусти это всё просто на хосте и ок. Что тут изолировать? Другое дело, если вы — public ci cluster. Может быть.
3. Удобство запуска — НЕТ. Да, выполнить docker run легко. Но прилага на дефолтах. Только «на посмотреть». Когда надо сконфигурить — поехали тонна переменных окружений, монтирование папок, конфиг-файлов и т.д. А entry-points под это дело писать на 2000 строк — то ещё удовольствие.
4. Сетка — стало только сложнее. А когда речь идёт о траблшуте, почему порт из контейнера внутри hyper-v на хост систему не пробросился — почему-то теряются даже сеньоры.
И вот мы подобрались к тому, из-за чего контейнеры стали популярны:
5. Запаковать all-in-one. Современный разработчик — это модный чувак, который сидит под вендой, тыкает пальцем в кнопочку в ide, нихрена не понимает как устроена его ОС, не умеет в линукс, не умеет упаковывать и распространять дистрибутив своей же программы (tar.gz/npm/deb/rpm/gem/whatever). Но при этом разрабатывает, конечно-же, под линукс. И как же ему бедненькому всё что он локально сделал запустить? Правильно, используя stack overflow наустанавливать не пойми чего, скопировать всё подряд и через 30 баш скриптов запустить без особого понимания в докере. Зато работает. А потом на прод.
Docker — это современная package management система.
Ну и, пожалуй, есть ещё один удобный пункт — который близок к 5ому:
6. создание окружения для сборки. Собрал себе в контейнере всё, что нужно, компиляторы, тулы, и т.д. — и собирай себе на здоровье. Кстати, это же можно было делать и в chroot, но да — docker удобнее будет.
Альтернативы: разобраться в пакетной системе. Например, deb трекает каждый файл при установке и гарантировано удалит это за собой во время удаления. Есть жизненный цикл пакета — pre/post-install/rm, pre/post-configure и т.д.
Однако, текущие пакетные системы тоже имеет проблемы, например, нельзя или очень сложно иметь сразу несколько версий пакетов в системе. И тут на сцену выходят следующие ребята, которые решают и это: nix, guix, flatpack, snap, chef habitat.
Предположу, что так сделано из-за идеи в гите с переписыванием истории коммитов. В английском варианте:
If I (merge|cherry-pick|rebase|use|...) this commit it will (commit message):
If I use this commit it will «Add logout button to home page».
Это позволяет мейнтейнерам буквально по кусочкам собирать нужную цепочку из сотен коммитов и веток.
По-русски, наверное, стоит перефразирвать, т.к. слова меняются из-за склонения и времени.
Я смотрел из статьи:
openjdk 8 db77212ffe05 13 days ago 737MB
openjdk jre e956268fd4ed 13 days ago 538MB
Alpine меньше, но не из-за того что «alpine vs debian», т.к. между ними разница в 95 мб
Могу только осторожно предпложить, что не каждый java проект заведётся на этом alpine образе
Да, из-за скачивания холодный старт может быть на 1-2 секунды дольше. Например, вместо 12 секунд будет 14.
У самого есть такая проблема: оптимизировать по каплям, где всё просто и понятно, когда что-то и так работает нормально. Не смотреть в сторону того, что создаёт 90% проблем потому, что там сложнее и чуть менее понятнее.
Level 1.
Официальный openjdk приносит с собой 600 МБ (jre — 450 МБ).
* Если на базе дебиана сделать — то итог 737 мб.
* Если на базе алпайна — то 639 мб.
Сильно выйграть не получиться. А это мы ещё апп внутрь не заливали.
Сделать контейнер меньше всегда хочется и приветствуется. Но никогда не понимал попытку сэкономить на спичках.
Как не читаешь на эту тему что-нибудь: так все работают в гуглах, фейсбуках, нетфликсах и у всех 10к+ машин и 100к+ контейнеров. Как дело доходит до практики — 3 сервера и 5 контейнеров :).
Для стандартных действий — да, кнопку нажать быстрее. Для более менее нестандартных ситуаций — нет. И тут начинается: из gui это сделать вообще можно? Есть там такая фишка? А где? Сколько минут будете лазить пока найдёте?
Use case:
1. Вы что-то там себе в ветке fix-foo делали
2. Потом переключились на dev и продолжили работу.
3. А теперь вас попросили пушнуть ветку fix-foo только под нормальным именем, типа bug/proj-1567-fix-foo
Из консоли это можно сделать одной командой и не будет путаницы в «понимании поведения интерфейса».
В итоге бывает проще выучить 1 инструмент (git cli), чем несколько. Конечно, это не отменяет того, что GUI — удобная штука.
Кстати, пункт 4: пушнуть ветку fix-foo без последнего коммита (потому, что там ерунда) — это всё ещё одна команда.
Может, мы одно и тоже по-разному понимаем, но:
1. Ничего вы не должны.
2. Берём три сервера (будущая реплика). На любом делаем инициализацию.
3. И можно сразу скормить весь конфиг, не делая rs.addWhatEver().
4. Готово.
Возможно, не стоит делать инициализацию на будущем арбитре. Я, чтобы наверняка работало, подключался только к тем серверам, которые могут стать мастером в будущем. Этого достаточно.
У меня было так N серверов для master/slave + 1 сервер арбитер. Я подключался к первому попавшемуся из N и делал rs.conf, скармливая весь список. Реплика инициализируется и работает.
Это для шардированного кластера.
Сервера собираются в репликасет. Репликасеты собираются в общий кластер. Роутер — точка входа, балансер, прокся, вроде бы умел функции агрегации и возможно что-то от map reduce. Но тут боюсь соврать. Лучше почитать доки. Они реально неплохие. Можно потратить 6-8 часов и полностью разобраться что там у монги есть.
Если у вас только репликасет. можете — заставит просто лить в мастер, а слэйвы скопируют всё.
Можно указать replicaset connection string в виде: rsName://host1:port1,host2:port2… — тогда драйвер сам разберётся. Но мне так делать не приходилось. Я восстановление обычно в роутер произвожу. Опять же с шардированным кластером не всегда так можно.
В монге мастера назначать не надо. После выхода из строя мастера происходит голосование и выбор нового мастера автоматически.
multicast удобная штука, но не всегда доступен.
unicast — заставит вас всё равно мейнтейнить список. в принципе для своего кластера сгенерил json, в котором описана топология.
+ есть ещё набор инструментов для развёртывания разных кластеров буквально кнопками, но он платный на сколько мне известно.
Я бы сказал, что у монги с этим всё не так уж и плохо.
Как выяснилось, у того же постгреса всё намного печальнее. Но там и типа базы другой, можно понять.
Вот тогда-то и не нужно брать Chef.
А то получается, что делаем «hello world», берём для этого инструмент энтерпрайз уровня и потом волосы <вставить_что_они_делают_при_упоминании_шефа>
Но ближе к существу, мне действительно интересно, что не так с шефом, когда с ним начинаешь знакомиться. Что лично вам не понравилось?
В ритм играх (допускаю, что конкретно в Guitar Hero это может быть не точно так, как написал), как правило, есть аудиотрек и так называемый simfile — мета-файл в котором и описаны:
GAP (OFFSET) — задержка от начала аудиофайла до первой ноты. Авторы часто подгоняют до первой ноты после вступления
BPM — темп. Что очень важно, его надо считать очень точно, желательно 5-7 цифр после запятой
BPM Changes — обычно время=новый_темп, время=новый_темп и т.д.
Delay/Pause — остановки в треке. С нимим есть проблемы точности: паузы вычисляются со своей точностью, которая не совпадает с делением на доли ритма в треке. Их как правило стараются заменить на кратную смену темпа на что-то < 5 и обратно компенсируют. Для таких дел даже скрипт написан
Массив данных — собственно, в каждый шаг трека какая нота должна быть сыграна
Вот пример для кнопочной ритм-игры: DDR (ITG).
Там 4 кнопки — поэтому 4 символа в слове для состояния. Разумеется есть редактор, вручную набирать не приходиться:
Я только с третьей попытки залез на emacs. Ни о чём не жалею, да и мне он подходит как нельзя лучше: редактировать разное, скрипты, руби, файлы спец. назначения.
Хорошо организованные настройки творят чудеса. Это как и в обычном программе: всё на своих местах, классы разложены по модулям, ресурсы по папочкам, тесты в своём месте и т.д. и т.п.
Конфиги — это тоже код. Правильно организуй и будет тебе счастье (и много разных подходов на любой вкус).
Мне очень сильно помогло вот это: github.com/purcell/emacs.d
Я форкнул и добавил паручку вещей под себя. Вдруг кому пригодится.
Легко на словах. А на деле не так просто понять.
Вот я залочил базу (слэйв).
Я сделал mongodump. Результат — ок. Ошибок не было. Команда успешно завершена.
Как мне определить, что mongodump отработал не верно?
Делаю restore — ошибка. Плохие данные? Ошибка в restore?
А размер 45 GB дампа.
ПС. И это хорошо, что мы пока коллекции не шардируем. С таким ненадёжным бэкапом если оно упадёт, а все коллекции размазаны по всем базам, до кучи баги роутеров с кэшем, восстановить это будет нереально.
сколько РАЗЛИЧНЫХ контейнеров ранается в проекте. Возможно, у вас действительно 20. Но если у вас кластер эластика на 15 машин — считайте это за 1.
>унифицированные интерфейсы конфигурирования
нет. Переменные окружения? У всех всё по-разному, а некоторые аппы, пока файл не положишь — не заработают. Либо приложение можно удобно конфигурировать, либо нет. Докер тут никак не помогает. И если завтра дедлайн, а конфигурить через файл — будешь монтировать файл.
>Не зависит особо от докера
О том и моя мысль, что плюсы, которые приписывают докеру, вовсе не его
> Да, можно понаписать башскриптов
Не так. «нужно понаписать пачку башскриптов». Entrypoint более-менее непростого контейнера видели? Init перед entrypoint-ом и прочее весёлости. там много скриптов получается. Благо, это не всегда плохо.
> Грубо, 49 запущенных на хосте nginx слушают порт 8080 и только один слушает 80
Это тоже не про докер.
они начинают больше копипастить со stackoverflow в стиле
или
И мой любимчик:
Я тоже недолюбливаю докер, хотя, начал использовать его до того, как это стало мейнстримом.
И мои мысли о тех преимуществах, про которые рассказывают следующие:
1. Безопасность — разработчику плевать, это не то, ради чего он рад пользоваться докером. admin/admin глубоко в коде и прочие радости. Пока разраба не пнут — не пофиксит
2. Изоляция процессов — посмотрите на свой проект, сколько там контейнеров? 5? nginx, java, redis, postgres, logstash? Запусти это всё просто на хосте и ок. Что тут изолировать? Другое дело, если вы — public ci cluster. Может быть.
3. Удобство запуска — НЕТ. Да, выполнить docker run легко. Но прилага на дефолтах. Только «на посмотреть». Когда надо сконфигурить — поехали тонна переменных окружений, монтирование папок, конфиг-файлов и т.д. А entry-points под это дело писать на 2000 строк — то ещё удовольствие.
4. Сетка — стало только сложнее. А когда речь идёт о траблшуте, почему порт из контейнера внутри hyper-v на хост систему не пробросился — почему-то теряются даже сеньоры.
И вот мы подобрались к тому, из-за чего контейнеры стали популярны:
5. Запаковать all-in-one. Современный разработчик — это модный чувак, который сидит под вендой, тыкает пальцем в кнопочку в ide, нихрена не понимает как устроена его ОС, не умеет в линукс, не умеет упаковывать и распространять дистрибутив своей же программы (tar.gz/npm/deb/rpm/gem/whatever). Но при этом разрабатывает, конечно-же, под линукс. И как же ему бедненькому всё что он локально сделал запустить? Правильно, используя stack overflow наустанавливать не пойми чего, скопировать всё подряд и через 30 баш скриптов запустить без особого понимания в докере. Зато работает. А потом на прод.
Docker — это современная package management система.
Ну и, пожалуй, есть ещё один удобный пункт — который близок к 5ому:
6. создание окружения для сборки. Собрал себе в контейнере всё, что нужно, компиляторы, тулы, и т.д. — и собирай себе на здоровье. Кстати, это же можно было делать и в chroot, но да — docker удобнее будет.
Альтернативы: разобраться в пакетной системе. Например, deb трекает каждый файл при установке и гарантировано удалит это за собой во время удаления. Есть жизненный цикл пакета — pre/post-install/rm, pre/post-configure и т.д.
Однако, текущие пакетные системы тоже имеет проблемы, например, нельзя или очень сложно иметь сразу несколько версий пакетов в системе. И тут на сцену выходят следующие ребята, которые решают и это: nix, guix, flatpack, snap, chef habitat.
If I (merge|cherry-pick|rebase|use|...) this commit it will (commit message):
If I use this commit it will «Add logout button to home page».
Это позволяет мейнтейнерам буквально по кусочкам собирать нужную цепочку из сотен коммитов и веток.
По-русски, наверное, стоит перефразирвать, т.к. слова меняются из-за склонения и времени.
— libatk1.0-0 (>= 1.12.4)
— libc6 (>= 2.7)
— libcairo2 (>= 1.2.4)
— libfontconfig1 (>= 2.11)
— libfreetype6 (>= 2.2.1)
— libgcc1 (>= 1:4.2)
— libgdk-pixbuf2.0-0 (>= 2.22.0)
— libglib2.0-0 (>= 2.35.9)
— libgtk2.0-0 (>= 2.24.0)
— libpango-1.0-0 (>= 1.22.0)
— libpangocairo-1.0-0 (>= 1.14.0)
— libpangoft2-1.0-0 (>= 1.14.0)
— libstdc++6 (>= 4.1.1)
— libx11-6
— libxext6
— libxi6
— libxml2 (>= 2.7.4)
— libxrender1
— libxslt1.1 (>= 1.1.25)
— libxtst6
— libxxf86vm1
openjdk 8 db77212ffe05 13 days ago 737MB
openjdk jre e956268fd4ed 13 days ago 538MB
Alpine меньше, но не из-за того что «alpine vs debian», т.к. между ними разница в 95 мб
Могу только осторожно предпложить, что не каждый java проект заведётся на этом alpine образе
У самого есть такая проблема: оптимизировать по каплям, где всё просто и понятно, когда что-то и так работает нормально. Не смотреть в сторону того, что создаёт 90% проблем потому, что там сложнее и чуть менее понятнее.
Официальный openjdk приносит с собой 600 МБ (jre — 450 МБ).
* Если на базе дебиана сделать — то итог 737 мб.
* Если на базе алпайна — то 639 мб.
Сильно выйграть не получиться. А это мы ещё апп внутрь не заливали.
Сделать контейнер меньше всегда хочется и приветствуется. Но никогда не понимал попытку сэкономить на спичках.
Как не читаешь на эту тему что-нибудь: так все работают в гуглах, фейсбуках, нетфликсах и у всех 10к+ машин и 100к+ контейнеров. Как дело доходит до практики — 3 сервера и 5 контейнеров :).
Use case:
1. Вы что-то там себе в ветке fix-foo делали
2. Потом переключились на dev и продолжили работу.
3. А теперь вас попросили пушнуть ветку fix-foo только под нормальным именем, типа bug/proj-1567-fix-foo
Из консоли это можно сделать одной командой и не будет путаницы в «понимании поведения интерфейса».
В итоге бывает проще выучить 1 инструмент (git cli), чем несколько. Конечно, это не отменяет того, что GUI — удобная штука.
Кстати, пункт 4: пушнуть ветку fix-foo без последнего коммита (потому, что там ерунда) — это всё ещё одна команда.
Может, мы одно и тоже по-разному понимаем, но:
1. Ничего вы не должны.
2. Берём три сервера (будущая реплика). На любом делаем инициализацию.
3. И можно сразу скормить весь конфиг, не делая rs.addWhatEver().
4. Готово.
Возможно, не стоит делать инициализацию на будущем арбитре. Я, чтобы наверняка работало, подключался только к тем серверам, которые могут стать мастером в будущем. Этого достаточно.
У меня было так N серверов для master/slave + 1 сервер арбитер. Я подключался к первому попавшемуся из N и делал rs.conf, скармливая весь список. Реплика инициализируется и работает.
Сервера собираются в репликасет. Репликасеты собираются в общий кластер. Роутер — точка входа, балансер, прокся, вроде бы умел функции агрегации и возможно что-то от map reduce. Но тут боюсь соврать. Лучше почитать доки. Они реально неплохие. Можно потратить 6-8 часов и полностью разобраться что там у монги есть.
Можно указать replicaset connection string в виде: rsName://host1:port1,host2:port2… — тогда драйвер сам разберётся. Но мне так делать не приходилось. Я восстановление обычно в роутер произвожу. Опять же с шардированным кластером не всегда так можно.
multicast удобная штука, но не всегда доступен.
unicast — заставит вас всё равно мейнтейнить список. в принципе для своего кластера сгенерил json, в котором описана топология.
+ есть ещё набор инструментов для развёртывания разных кластеров буквально кнопками, но он платный на сколько мне известно.
Я бы сказал, что у монги с этим всё не так уж и плохо.
Как выяснилось, у того же постгреса всё намного печальнее. Но там и типа базы другой, можно понять.
А то получается, что делаем «hello world», берём для этого инструмент энтерпрайз уровня и потом волосы <вставить_что_они_делают_при_упоминании_шефа>
Но ближе к существу, мне действительно интересно, что не так с шефом, когда с ним начинаешь знакомиться. Что лично вам не понравилось?
В ритм играх (допускаю, что конкретно в Guitar Hero это может быть не точно так, как написал), как правило, есть аудиотрек и так называемый simfile — мета-файл в котором и описаны:
Вот пример для кнопочной ритм-игры: DDR (ITG).
Там 4 кнопки — поэтому 4 символа в слове для состояния. Разумеется есть редактор, вручную набирать не приходиться:
#SUBTITLE:;
#ARTIST:Die Antwoord;
#TITLETRANSLIT:;
#SUBTITLETRANSLIT:;
#ARTISTTRANSLIT:;
#GENRE:;
#CREDIT:;
#BANNER:../banner.png;
#BACKGROUND:../bg.png;
#LYRICSPATH:;
#CDTITLE:;
#MUSIC:Cookie Thumper.ogg;
#OFFSET:0.003;
#SAMPLESTART:48.350;
#SAMPLELENGTH:12.000;
#SELECTABLE:YES;
#BPMS:0.000=134.000,107.000=67.000,143.000=134.000;
#STOPS:92.000=0.448
;
#BGCHANGES:;
#KEYSOUNDS:;
//---------------dance-single — Nix----------------
#NOTES:
dance-single:
Nix:
Challenge:
10:
0.631,0.711,0.437,0.164,0.665:
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
0000
0000
0000
0000
,
2001
0000
3100
1000
0010
0100
0000
0110
,
0000
0100
0001
0010
1000
0000
0010
0000
,
0011
0000
0001
0100
1000
0100
0000
0110
,
0000
0010
1000
0100
0010
0000
0001
0000
,
1000
0000
1000
0100
0000
0100
0010
0000
0001
0000
0100
0010
1000
0000
0100
0000
,
0010
0001
0010
0100
0000
0100
1000
0010
0100
0000
0001
0000
1001
0000
0000
0001
,
0100
0010
1000
0010
0000
0010
0100
0001
0010
0000
0100
0000
1100
0000
0000
1000
,
0020
0000
0230
0000
0301
0100
0001
0000
0101
0000
1001
0000
2020
0000
3030
0000
,
0120
0000
0130
0001
0100
0010
1000
0000
1100
0000
0110
0000
0011
0000
0000
0000
,
0001
0000
0100
0010
1000
0100
0010
0001
1000
0000
0010
0000
0100
0000
0001
0000
,
0010
0100
1000
0001
0000
0001
1000
0010
0100
0000
0001
0000
0020
0000
0000
0000
,
0030
0000
0000
0000
0100
1000
0100
0010
0001
0000
0100
0000
0110
0000
0000
0000
,
1000
0010
0100
0001
1000
0100
1000
0001
0010
0000
0100
0000
0020
0000
0031
0000
,
0100
0010
0000
1000
0000
0010
0000
0010
0100
0000
0001
0000
1000
0000
0100
0010
,
0001
0010
0100
1000
0000
1000
0001
0100
0010
1000
0010
0000
0100
0000
0000
0000
,
0001
0010
0000
1000
0000
0010
0000
0100
1000
0010
0100
0000
0001
0000
0000
0000
,
1000
0100
0010
0100
0001
0100
0010
0000
0022
0000
0000
0000
0033
0000
1000
0000
,
1010
0000
0010
0100
0001
0000
1000
0000
1100
0000
0000
0000
0100
0000
0100
0010
,
0001
0010
0100
1000
0001
0000
0100
0000
0020
0000
0000
0000
0030
0000
0100
0000
,
0001
0000
0000
0000
1000
0000
1000
0010
0100
0001
0100
0000
0220
0000
0330
0000
,
2002
0000
0000
0000
0000
0000
3003
0000
0001
0000
1000
0001
1000
0000
0000
1000
,
0001
0100
0000
0110
0000
0010
1000
0100
0001
0000
0100
0000
1100
0000
0000
1000
,
0010
0100
0000
0110
0000
0100
0001
0010
1000
0000
0010
0000
0110
0000
0100
1000
,
0010
0100
0000
0101
0000
0001
0010
1000
0001
0000
0100
0000
1100
0000
0100
0010
,
0001
0000
0100
0000
0000
0000
0101
0000
0000
0000
0001
0000
1000
0010
1000
0010
1000
0000
0001
0100
0001
0000
0001
0000
0101
0000
0000
0000
0000
0000
0100
0000
,
0010
1000
0000
1100
0000
0100
0001
1000
0010
0000
0100
0000
1100
0000
1000
0010
,
0100
0001
0000
0011
0000
0010
1000
0010
0001
0000
0100
0000
0110
0000
0010
0001
,
0010
1000
0000
1010
0000
0010
0001
1000
0100
0000
0001
0000
1001
0000
1000
0100
,
0001
0000
0100
0000
0000
0000
1100
0000
0000
0000
1000
0000
0001
0010
0001
0010
0001
0000
1000
0100
1000
0000
1000
0000
0200
0000
0000
0000
0000
0000
M0MM
0000
,
0000
0000
0000
0000
0000
0000
M0MM
0000
0000
0000
0000
0000
0000
0000
M0MM
0000
0000
0000
0000
0000
0300
1000
0001
0000
0101
0000
0000
0000
0000
0000
0000
0000
,
0000
0000
0101
1001
1010
1000
0100
0010
,
0001
0000
0100
0001
1000
0000
0010
0000
0110
0000
0000
0000
0100
0001
1000
0000
,
0100
0000
0000
0010
0000
0000
0001
0000
0000
0010
0000
0000
0100
0000
0000
0000
0000
0000
1000
0000
0000
0000
0000
0000
0010
0000
0000
0000
1000
0000
0100
0000
0000
0000
0000
0000
1100
0000
0000
0000
0000
0000
0000
0000
0000
0110
0000
0000
,
0000
0000
0011
0000
0000
1000
0001
0000
1011
0000
0000
1000
0100
0000
0200
0000
,
0310
0000
0001
0000
0100
0000
1000
0000
0100
0000
0000
0000
0001
0010
0000
1000
,
0000
0001
0000
0100
0010
0000
0001
0000
0100
0000
0000
0000
0010
1000
0000
0001
,
0000
0100
0010
1000
0100
0000
0010
0000
0001
0000
0000
0000
1000
0100
0000
0001
,
0000
0100
1000
0010
1000
0000
0100
0000
0010
0000
0000
0010
0001
0000
0100
0000
,
0010
0000
1000
0010
1000
0000
0100
0000
0010
0000
0000
0000
0010
0000
0100
1000
,
0001
0100
0010
1000
0100
0000
0010
0000
0001
0000
0000
1000
0100
1000
0010
0000
,
0100
0001
1000
0000
0100
0000
0010
0000
0001
0000
0000
0000
0101
0000
0110
0000
,
0010
0000
1000
0010
1000
0010
0100
0000
0001
0000
0010
0000
1000
0000
0010
0000
,
0100
0000
1000
0000
0010
0100
0010
0000
1000
0000
0000
0000
0101
0000
0001
0000
,
0010
0000
0100
1000
0001
1000
0010
0000
0100
0000
0110
0000
1010
0000
0001
0010
,
0100
1000
0100
0010
0001
0000
1000
0000
0010
0000
0100
0000
0001
0010
0001
0000
,
0010
0100
1000
0010
0200
0000
0000
0000
,
0300
0000
0000
0000
;
В emacs есть https://github.com/abo-abo/avy
Очень удобно. Работает, даже если открыто несколько виртуальных окон
Хорошо организованные настройки творят чудеса. Это как и в обычном программе: всё на своих местах, классы разложены по модулям, ресурсы по папочкам, тесты в своём месте и т.д. и т.п.
Конфиги — это тоже код. Правильно организуй и будет тебе счастье (и много разных подходов на любой вкус).
Мне очень сильно помогло вот это: github.com/purcell/emacs.d
Я форкнул и добавил паручку вещей под себя. Вдруг кому пригодится.
Вот я залочил базу (слэйв).
Я сделал mongodump. Результат — ок. Ошибок не было. Команда успешно завершена.
Как мне определить, что mongodump отработал не верно?
Делаю restore — ошибка. Плохие данные? Ошибка в restore?
А размер 45 GB дампа.
ПС. И это хорошо, что мы пока коллекции не шардируем. С таким ненадёжным бэкапом если оно упадёт, а все коллекции размазаны по всем базам, до кучи баги роутеров с кэшем, восстановить это будет нереально.