среда, 10 августа 2016 г.

Ввод диакритических символов без установки раскладок клавиатуры.

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

Конечно это легко решается через третью раскладку, но я так и не смог привыкнуть.

Две раскладки уже автоматически, а третья ломает всю работу.

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

На помощь как всегда приходит compose!

setxkbmap -layout 'us,ru(winkeys)' -option 'grp_led:scroll,altwin:super_win,grp:menu_toggle,compose:ralt'

Решает проблему легко и изящно.

Теперь нажимаем правый alt, апостроф и e и получаем é
Или правый alt, тильду и n и получаем ñ.

Простота решения меня попросту восхищает. Не надо переучивать на раскладки, ничего не мешает и появляется простая интуитивая возможность ввода.

Пользуясь случаем рекомендую свой бложек где я теперь буду пытаться на испанском писать:  http://unrusosalvaje.blogspot.ru/
 

четверг, 7 июля 2016 г.

Немного магии: git --assume-unchanged

Git, как и vim можно использовать десятилетиями и вдруг заметить новую полезную команду.

Со мной это довольно регулярно происходит.

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

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

И оказалось есть путь получше:

Игнорировать изменения файла:
git update-index --assume-unchanged my/super/file

Вернуть его в строй:
git update-index --no-assume-unchanged

Просмотреть список таких:
git ls-files -v | grep "^[[:lower:]]"


Сплошное удовольствие.

четверг, 10 марта 2016 г.

Курс на Stepic: Hadoop. Система для обработки больших объемов данных

Закончил  курс по hadoop на stepic.

Интересно, и для меня ново.

До этого хадупить не приходилось, но хотелось.

Курс хорош: и теория, и практика, и обзор сопутствующих технологий, spark, hbase, cassandra и т.д.

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

В итоге я даже оценку в 100% получил.

У stepic тем временем появилось мобильное приложение. Тесты на нём пока ещё не порешаешь, но для лекций уже очень ок.

Горю теперь желанием обработку логов организовать на spark.

А, да, ещё особенно надо похвалить автора курса за его участие в комментариях.

Прямо ощущение присутствия, любой вопрос отвечен, да ещё как отвечен.

Из мелких минусов - stepic не потянул организовать кластер hadoop для приема заданий, поэтому сдавали на муляже.

Ну это легко можно пережить.

Lack of disposable infrustructure

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

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

И в этом смысле Digital Ocean довольно не плохой союзник.
Годами дроплеты работают без выключения.



Как вдруг мониторинг фиксирует пропадание одного сервера, я иду посмотреть чего там и вижу.
Что power off события нет, но он таки выключен.


Снимок с vnc экрана.

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

Буду считать намекнули мне.

среда, 9 марта 2016 г.

Прыгнуть с обрыва: Firefox && Group Tabs.

Говорят, что функцией panorama, или группами вкладок пользовалось очень мало юзеров.

Для меня же, она была единственной killer feature что привела на firefox, и удерживала на нём.

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

И вот, её выпилили.

Я целое утро пытаюсь придумать, для чего, хотя бы теоретически теперь нужен firefox, и не могу.

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

Но был смысл потерпеть.

А теперь?


Подскажите, что вы такого в firefox видите, чего нет например в chrome.

вторник, 8 марта 2016 г.

Лучше поздно чем никогда (apt/pkg)

Неужели я дождался!

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

Осталось дождаться автоматического запуска autoremove после purge/remove, и мы сможем назвать apt зрелым и удобным инструментом.

Конечно же шучу. Apt прекрасен.

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

Возьмём например новый, переписанный с учетом вех ошибок фряшный pkg, и посмотрим на такое художество:

 
Для установки vim предлагается удалить puppet.
Действительно, почему бы и нет.

Но все равно все там будем.
Pkg немножко навязывают:

Хотя, плюсы у него действительно есть,
- он чертовски быстр, я просто никогда не ожидаю такой быстроты как он работает.
- система команд понятна
- встроенный аудит

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


Ansible 2.0 - зря переживали

После продажи ansible я многократно встречал в сети посты в духе "всё пропало", или похоронят или испортят.

И вот пришёл тот момент когда я обновился на новую версию, и вижу что всё наоборот.

Не испортили а улучшили.

Мне очень понравились новые "советы" которые ansible-playbook выдает при выполнении:



Понравились новый стратегии выполнения. Уже приносят кучу радости.

Ну и определенно нужно будет попереписывать роли под новые блоки и инклуды.

четверг, 4 февраля 2016 г.

Не все переводы одинаково полезны


Обнаружил тут в выводе git шедевры.

Я прям не знаю, стоило ли трудится?
Вопрос даже не в кривом переводе, а вообще в локализации такого.

Это ж не офисная прога, аудитория специфическая.

Другой пример, когда я страдал от локализации -  аptitude.
В какой то момент, она принимала отвеы и по английски и по русски.
Ну т.е. Y= yes. Н = нет.
А вы знали что латинская буква Y и русская Н на одной клавише?
Случайность, но очень вкусная.

понедельник, 18 января 2016 г.

Курс на edx HTML5 Part 2: Advanced Techniques for Designing HTML5 Apps

Прошёл вторую часть курса по html5 от w3c на edx.

Начиналось, довольно вяло, первую часть копались в каких то низкоуровневых деталях audio api - буферах, дискретизации и прочем шлаке.

Я за двадцать последних лет таких задач не имел, и вероятнее всего в следующие 20 тоже не буду иметь, поэтому не смог себя заставить и даже провалил опрос.

Зато потом пошла самая настоящая мякотка.

Html5 templating, web components и прочее, что немедленно хочется взять и попробовать.

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

Для меня было удивлением что даже обычный template уже без js не сможешь использовать. Что то в этом мне таки не нравится.

Конечно ж, мой заваленый опрос про multimedia api лишил меня сертификата (хнык-хнык 2% не хватило, одного правильного ответа).



Но зато я получил несколько отличных идей для верстки.

Обязательно переверстаю пару своих проектов на веб компоненты.

Курс однозначно рекомендую.

среда, 9 декабря 2015 г.

Курс: React от А до Я

В рамках импортозамещения в mooc, прошел курс React от А до Я от украинского сервиса smartme.university.

Я до этого с react уже был очень шапочно знаком.

Буквально несколько статей прочёл общего плана.

Надо сказать, что после окончания курса я способность уверено писать на react не получил.

Курс короткий, ознакомительный, без практических занятий, а я без занятий не умею.

В целом я бы курс оценил неплохо, сказажем на 4 из 5.

Некоторые темы мне показались "без начала и конца".



Из забавного (как всегда в мире javascript) вчерашняя документация уже depricated.

Мне такое непривычно.

Посимвольно повторив код из урока, не смог заставить его заработать, хотя на экране у преподавателя он отлично работает.

То что платформа украинская никак мне не помешало, хотя языком я и не владею.

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

Главный результат, это то, что захотелось написать на react какой-нибудь проект, и  я обязательно попробую.

вторник, 8 декабря 2015 г.

Курс на edx: HTML5 Coding Essentials and Best Practices

Закончил очередной курс на edx.org
Первая часть про html5.

Так как я html верстаю редко, то безнадежно застал в прошлом, нет нет так и хочется какую-нибудь табличку в верстке воткнуть.

Борюсь с этим как могу.

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

Курс довольно легкий, что там может быть сложного в html то, но я рад что в одном месте всё упомянуто и перечислено.


Из интересного:

Всё таки темп жизни теперь и в html как в javascript, ну типа "двенадцать лучших новых фреймворков уходящей недели".

Тоже самое и здесь. Например курс менее чем месячной давности учит как делать cache manifest и ссылается на доку.

А в в доке написано, не используйте это,  оно устарело:

Но я таки решил попробовать всё равно, и жутко на этом обжегся.

Бог с ним что устарело, авторы слегка забыли упомянуть важную штуку:


Поэтому добавив manifest в общий шаблон - будете как и я страдать и удивляться, как так страницы закешировались которые не должны бы.

И побороть кстати, не так уж просто.

Это происшествие прямо смазало всё впечатление.

В общем с html5 и современными браузерами, прямо тоска.

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

В целом даже рад что я не верстальщик.

четверг, 19 ноября 2015 г.

Dockerhub построение образов docker автоматически и проблема с обработкой ошибок построения


Строить образы docker через docker build однажды надоедает.

Это и медленно, и ресурсо-ёмко, и попросту раздражает.

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

Можно автоматизировать эту задачу через dockerhub.

Для этого держим Dockerfile в github, привязываем его как automated build, и теперь при git push в github, образ будет перестроен автоматически.

Так же там есть webhooks и зависимые образы, что позволяет перестраивать зависимые образы, всё отлично.

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

Но так или иначе, никаких методов узнать что сбой произошел нет.

Автоматического повтора сборки не будет уже никогда. 

Или глазами просматривать страницу с деталями сборки, или вылезет уже при docker pull, но это надо ещё заметить.

Всё как всегда, docker хорош, но свеж.
Помню пару месяцев назад возможности связанных перестроений тоже не было.

Жду теперь обработку ошибок.

среда, 11 ноября 2015 г.

Stepic: Функциональное программирование на языке Haskell

Для исследования положения дел на русскоязычных курсах MOOC, прошел курс по haskell на stepic.

Не пожалел ни минуты.

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

Мне он понравился больше, чем ранее пройденый мной FP101x

Во всяком случае, наконец то я понял тему монад.

Не смотря на декларируемые 5-6 часов в неделю нагрузки, курс занял у меня уверенно больше. Раза в три-четыре.

Особенно некоторые задания на которые я тратил, бывало, вечера напролет.

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

Сама платформа stepic - оставила только приятные впечатления.
Ну попросту не к чему придираться, оно работает и работает.

Автоматическое тестирование заданий, навигация по лекциям, обсуждения непосредственно под лекциями — мне показалось намного удобнее чем на той же coursera или edx.

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

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

А уж в случае haskell, и подавно не представляю как бы я справлялся с заданиями без полноценного компьютера с REPl haskell.

И курс, и платформу с большим удовольствием рекомендую всем.

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

По моему личному опыту, все эти курсы без строго расписания а-дя on-demand почти не имеют шансов быть закончеными.


Красного диплома на этом курсе у меня не получилось, но сертификат таки дали:


пятница, 18 сентября 2015 г.

Consul & registrator — простой способ забыть про линковку контейнеров docker

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

Будем использовать consul как базу данных имен наших контейнеров, и registrator в качестве агента.

Запускаем consul:
docker run -d --name=consul -p 8400:8400 -p 8500:8500 -p 53:53/udp -h node1 gliderlabs/docker-consul -server -bootstrap -ui-dir /ui

Он будет по порту 53 отвечать на наши запрос, по обычному dns, а по порту 8500 принимать от агента запросы на регистрацию - дерегистрацию сервисов.

Запускаем агент - register

 docker run  -d  --name=registrator  --net=host  --volume=/var/run/docker.sock:/tmp/docker.sock  gliderlabs/registrator:latest -internal consul://localhost:8500
 Он будет следить за всем запусками контейнеров docker на этом хосте, для этого мы маппим ему сокет докера  и регистрировать их в  consul.
Ключ -internal нужен как раз для такой работы в рамках одного хоста, когда он будет регистрировать внутренние докеровские ипы, бесполезные снаружи.

Далее, вписываю в resolv.conf на хосте днс интерфейс consul:

search service.consul
nameserver 172.17.42.1
Так как docker мапит resolv.conf внутрь новых контейнеров. оно туда попадет.

Если хотите ещё и строить контейнеры, наверное нужно будет добавить в /etc/default/docker опцию  DOCKER_OPTS="--dns=...

Или другой вариант: использовать --dns= опцию при docker run

Теперь мы готовы запускать контейнеры, например так:
docker run -d -e SERVICE_NAME=mysql2 korjavin/docker-mysql
 Через -e SERVICE_NAME мы передали имя контейнера для registrator.

Теперь, без всякой линковки этот контейнер доступен по имени mysql2 и внутри других контейнеров, и с хоста.

>  ping mysql2
PING mysql2.service.consul (172.17.0.16) 56(84) bytes of data.
64 bytes from 172.17.0.16: icmp_seq=1 ttl=64 time=0.077 ms

Я очень рад забыть про все эти --link=mysql:mysql2 и использовать человеческие имена не задумываясь о том кто там кому прилинкован.



docker images tree и немного про дистрибуцию go приложений

В этом вашем docker, до версии 1.7 был замечательный способ просмотреть дерево образов --tree.

Previously, the docker images command supported the --tree and --dot arguments, which displayed different visualizations of the image data. Docker core removed this functionality in the 1.7 version.

В 1.7 его изничтожили.

Так как:
  1. Я часто им пользовался
  2. Не могу придумать ни единой причины чем он может помешать кому бы то ни было
я полез в issues и в changelog найти хоть какую-нибудь причину для сноса этой функциональности.

Не нашел ничего. Если знаете подскажите, будьте добры.

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

Это меня реально изумляет.

В том что эта функциональность нужна, сомнений нет и у авторов докера.
Там же в changelog стоит ссылочка на сторонний продукт на замену.

 https://github.com/justone/dockviz/releases

Который делает тоже самое, но его отдельно ставить. Ну ок.

Интересно то, как он распространяется.

Я сначала глазам не поверил.


alias dockviz="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz"

Т.е. её сразу же предлагается запускать как разовый disposable контейнер докера.

Ох-ох-ох.

А почему? Это же golang, статический бинарничек, все дела.

Никаких dependency и всё такое.

Забавно что для дистрибуции golang приложений пришлось написать docker на golang.

Прямо таки курица и яйцо.

А видимо вот из за этого.

Видимо видится автору docker контейнер более надежным артефактом чем гошный бинарничек.  

Его и хранить можно во всяких хабах да registry, да и получать оттуда pull-ом волшебным.


А картинки конечно красивые стали. Хотя не понимаю зачем.

Golang dependency hell — привет прошлое.

Софт на golang начинаю ненавидеть уже больше чем софт на Ruby.

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

Рассчитывать на то что программа, которая тебе нужна, соберется в случайный момент времени точно не стоит.

Для автора программы это может и не проблема, ну делов то, поправил.
А если ты пользователь/админ десятка go программ, которые надо много куда раскатывать, то ты попал.

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

Да, одной протекающей абстракцией латаем другую, и всё это умножаем на прокачанный скил удачи.

Прав +Baruch Sadogursky  когда из подкаста в подкаст ходит и объясняет необходимость хранения артефактов.

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

Хотя, мне вот по прежнему неуютно с чужими бинарями, но какое то решение уже нужно.

# github.com/coreos/go-etcd/etcd
../../coreos/go-etcd/etcd/response.generated.go:112: r.EncodeMapKVSeparator undefined (type codec.encDriver has no field or method EncodeMapKVSeparator)
../../coreos/go-etcd/etcd/response.generated.go:123: r.EncodeArrayEntrySeparator undefined (type codec.encDriver has no field or method EncodeArrayEntrySeparator)
../../coreos/go-etcd/etcd/response.generated.go:137: r.EncodeMapEntrySeparator undefined (type codec.encDriver has no field or method EncodeMapEntrySeparator)
../../coreos/go-etcd/etcd/response.generated.go:143: r.EncodeMapKVSeparator undefined (type codec.encDriver has no field or method EncodeMapKVSeparator)
../../coreos/go-etcd/etcd/response.generated.go:158: r.EncodeArrayEntrySeparator undefined (type codec.encDriver has no field or method EncodeArrayEntrySeparator)
../../coreos/go-etcd/etcd/response.generated.go:173: r.EncodeMapEntrySeparator undefined (type codec.encDriver has no field or method EncodeMapEntrySeparator)
../../coreos/go-etcd/etcd/response.generated.go:179: r.EncodeMapKVSeparator undefined (type codec.encDriver has no field or method EncodeMapKVSeparator)
../../coreos/go-etcd/etcd/response.generated.go:195: r.EncodeArrayEnd undefined (type codec.encDriver has no field or method EncodeArrayEnd)
../../coreos/go-etcd/etcd/response.generated.go:197: r.EncodeMapEnd undefined (type codec.encDriver has no field or method EncodeMapEnd)
../../coreos/go-etcd/etcd/response.generated.go:216: r.ReadMapEnd undefined (type codec.decDriver has no field or method ReadMapEnd)
../../coreos/go-etcd/etcd/response.generated.go:216: too many errors

сегодня вот к примеру etcd не собрался.
Ну, пятна на солнце то сё.

Как говорили в свежем подкасте DevZen ну делов то, редко же надо, сходи кофе попей.

А мне вот надо сегодня, и никаких надежд что вскоре оно соберется - нет.

Как быть?

пятница, 11 сентября 2015 г.

Виртуальный хостинг — пережиток прошлого?

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

Казалось бы vds + ansible десять минут и готово.

Но всё оказалось не так.

Важными условиями было

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

- Размещение в России.

- Минимальные счета


Так я окунулся в чарующий мир виртуального хостинга в 2015 году:

- разнотипные панельки
- закачка по ftp в один поток с ограничениями по всему чему можно
- разные фокусы с оплатой
- отсутствие  какого-то ни было апи и куча мышинной возни, по 50 кликов на заведение и импорт mysql БД
- странные и непонятные паузы между операциями, прописал к примеру домен, сходи попей кофе пока апач подхватит
- дикие редиректы на error-pages
- замысловатый доступ к логам


Я использовал много разных mne.ru, eurobyte, handyhost, timehost, timeweb все плюс минус одинаковы.
Где то лучше одно, хуже другое.

У mne.ru например отличная ТП и удивительно быстрая реакция, но необъяснимо умерла производительность после заливки данных в движок.
Хотя копии на других провайдерах не испытывали затруднений.

У timeweb такая панель управления днс, что надеюсь их однажды накажут за это.

Ну и такого полно.

В итоге на десятиминутную задачу массового развертывания ушло пару дней.

Не зря наверно amazon и digital ocean хлеб свой едят.

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

С неким API, что бы написал скриптик и забыл.




среда, 9 сентября 2015 г.

Не стоит возвращаться в реляционные базы после nosql

Немножко копался сегодня с движком одного интернет магазина.

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

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

Увидел в схеме базы данных в таблице товаров интересное поле с именем :

items_same_price

Странное название.
same? price?

Непонятно.
Особенно изумило что значение этого поля огромные списки чисел через запятую.

Неужели это самое ?!

Да не, быть не может такого анекдота.

Пруф скрин:


Да, это действительно id тех товаров цена которых совпадает.

Казалось бы, как человек, который может такое сделать, одевает штаны? Руки то куда ему девать.

Ведь пока это поле считаешь, разобьешь по атомарным значениям (привет нормализация), засунешь в запрос, выполнишь его, к тому времени можно уж пару
select .... where price = ? 
запросто выполнить, и сразу получить рекордсет нужный, без выкрутасов.

Зацепила меня это архитектурное решение, долго с разных сторон я его обдумывал.

Искал плюсы, искал мотивы.

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

Наверное там это даже к месту. Но нести это обратно в реляционные базы. ну уж нафиг такое.

А у вас есть какие то предположения - как могло такое решение появиться?