Избранное в приложениях карт
det_random
Ребятки, вы бы знали, сколько нужно кликов, чтобы увидеть на веб-морде 2ГИС избранные точки. Должно быть так:

  • добавил точку в избранное;

  • она всегда остается на карте;

  • успех.


В реальности так:

  • добавил точку в избранное;

  • ай блин не добавил, какая-то регистрация;

  • блин, требует офлайн доступ ко вконтакте, ну нафиг;

  • блин, к твиттеру еще хуже;

  • во, из гугла хотя бы не тянут всё подряд;

  • а блин, это же другая вкладка, а избранное на первой;

  • добавить в избранное... блин, авторизация не прососалась, надо обновить страницу;

  • тааак, вот теперь добавляем... а блин, требует какой-то список создать;

  • ну ладно, это даже удобно, вот список;

  • блин, автоматически в список не добавилось, вот еще раз;

  • фффух, теперь добавил в список;

  • кликаю в карту, в карте точка пропадает, что за дела;

  • тааак, где-то должна быть какая-то кнопка;

  • слева? не сработало;

  • а, внизу, мелкая, с сердечком;

  • нажимаю;

  • блин, надо выбрать список избранного; это оказалось не так уж удобно;

  • выбрал список;

  • успех.


По сравнению с мобильными приложениями Maps.me и Яндекса это какой-то ад. На веб-морде Яндекса получше, там только один лишний клик. Хорошо, что я только что вернулся из отпуска и не ленюсь даже написать репорт, но мог и пройти мимо.
Tags:

Сортировка ключей во view в Couchbase делается case insensitive
det_random
А точнее, сортировка строковых ключей делается без учета регистра, но с учетом Unicode Collation Algorithm.

Документация говорит в точности следующее:

Here are the exact rules for sorting (collation) of keys. The most significant factor is the key's object type; keys of one type always sort before or after keys of a different type. This list gives the types in order, and states how objects of that type are compared:

  • null

  • false, true (in that order)

  • Numbers, in numeric order of course

  • Strings, case-insensitive. The exact ordering is specified by the Unicode Collation Algorithm. This is not the same as ASCII ordering, so the results might surprise you -- for example, all symbols, including "~", sort before alphanumeric characters.

  • Arrays, compared item-by-item as described above.

  • Maps/dictionaries, also compared item-by-item. Unfortunately the order of items is ambiguous (since JSON doesn't specify any ordering of keys, and most implementations use hash tables which randomize the order) so using these as keys isn't recommended.

Что это нам дает? Например, при переборе элементов по диапазонам ключей можно рассматривать только половину символов из множества [a-zA-Z], а с учетом того, что выбор элементов по диапазону номеров не эффективен, это может дополнительно ускорить перебор больших результатов во view. О чем речь? Сейчас поясню.

Индекс для view в Couchbase представляет из себя двоичное дерево, поэтому чтобы выбрать диапазон с #0 по #10000, например, внутренней кухне кауча придется сначала пройти дерево в глубину до номера 9999. И когда мы захотим выбрать элементы с #1'000'000 по #2'000'000, каучу придется пройти всё дерево с нуля до двух миллионов минус один. Это очень медленно. А на практике, еще и соединения отваливаются по таймауту после первой минуты. В общем, перебирать по номерам -- не лучшая идея, если у вас большой view. К тому же, реализация клиентского API для node.js, которой я пользовался, предпочитает прочитать весь диапазон в память, из-за чего падает при переходе через 2ГБ. Не слишком понятно, в каком месте падает, т.к. нода 64-битная, и подозрение ложится на libcouchbase, но это всё детали, а главное: если view не влезает в память вашей машины, то читать его нужно диапазонами ключей, т.е. с "doc_bar" по "doc_foo", например.

Часто забываемый ответ про ресет master до origin/master
det_random
http://stackoverflow.com/questions/1591107/git-reset-other-branch-to-current-without-a-checkout/17604903#17604903:

git branch -f master origin/master

Довольно легко догадаться, что с не-мастером это тоже работает.

Как работает использование upstart и systemd через dh_installinit
det_random
Надо сразу заметить, что скрипты инициализации, подготовленные через dh_installinit, работают строго через upstart. Просто скрипт systemd в /etc/init.d/ является символической ссылкой на /lib/init/upstart-job, которая в свою очередь умеет понять, что ее вызвали по символической ссылке с определенного файла, и выполнить все необходимые действия через upstart. Другими словами, /etc/init.d/<ваш-пакет> в этом случае является systemd-фасадом для скриптов upstart.

Дальше уже проще. Нужно завести файлы debian/<ваш-пакет>.upstart и debian/links и включить вызов dh_installinit и dh_link в debian/rules. Содержимое debian/<ваш-пакет>.upstart зависит от специфики сервиса. Файл debian/links содержит такую строку:
/lib/init/upstart-job /etc/init.d/<ваш-пакет>
В процессе построения пакета будут автоматически созданы prerm, preinst и postinst, которые умеют корректно обрабатывать работу с сервисом и конфигом systemd (/etc/init.d/<ваш-пакет>). Также при сборке lintian выдаст ошибку postrm-does-not-call-updaterc.d-for-init.d-script. Это баг в lintian, нужно его либо исправить в lintian, либо заоверрайдить в debian/<ваш-пакет>.lintian-overrides:

<ваш-пакет> binary: postrm-does-not-call-updaterc.d-for-init.d-script

Это ВСЁ, что нужно знать про упаковку сервисов в пакеты и что не написано в явном виде ни в одном из существующих публичных документов по инструментам работы с deb-пакетами. Наслаждайтесь.
Tags:

Ежедневная работа с deb-пакетами
det_random
Распространенные случаи работы с пакетами в Ubuntu или Debian немногочисленны и довольно быстро входят в привычку. Приведу список команд, без которых обходится редкий день, ну или хотя бы неделя.

Установить пакет или обновить до последней версии:
sudo apt-get install firefox

Удалить пакет:
sudo apt-get remove firefox

Удалить пакет вместе с конфигами:
sudo apt-get purge nginx

Узнать установленную версию пакета:
sudo dpkg -l nginx

Эта команда выведет и другую полезную информацию о состоянии пакета:
$ dpkg -l nginx
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
ii  nginx          1.1.19-1ubuntu small, but very powerful and efficient web s

Найти, к какому пакету принадлежит файл:
dpkg -S /boot/vmlinuz-3.2.0-98-virtual

Показать, какие файлы установлены пакетом:
dpkg -L libudev0

Показать информацию о пакете:
apt-cache show firefox

Установить пакет из файла:
sudo dpkg -i skype-ubuntu-precise_4.3.0.37-1_i386.deb
Tags:

Как проверить чексуммы установленного deb-пакета
det_random
Не про все файлы, которые устанавливаются из deb-пакета, в системе остается запись с чексуммами. Поэтому полностью проверить пакет может оказаться сложно. Сами суммы лежат в /var/lib/dpkg/info/<package>.md5sums:

bb5096cf79a43b479a179c770eae86d8  usr/lib/openssh/sftp-server
42da5b1c2de18ec8ef4f20079a601f28  usr/sbin/sshd
8c5592e0d522fa0f8f55f3c104479ef5  usr/share/lintian/overrides/openssh-server
cfcb67f58bcd1edcaa5a770863e49304  usr/share/man/man5/sshd_config.5.gz
71a51cbb514da3044b277e05a3ceaf0b  usr/share/man/man8/sshd.8.gz
222d4da61fcb3c65b4e6e83944752f20  usr/share/man/man8/sftp-server.8.gz

Проверить их поможет команда debsums (sudo apt-get install debsums):

$ debsums openssh-server
/usr/lib/openssh/sftp-server                                                  OK
/usr/sbin/sshd                                                                OK
/usr/share/lintian/overrides/openssh-server                                   OK
/usr/share/man/man5/sshd_config.5.gz                                          OK
/usr/share/man/man8/sshd.8.gz                                                 OK
/usr/share/man/man8/sftp-server.8.gz                                          OK

Начиная с версии 1.17.2, такую функциональность имеет и dpkg:

$ dpkg --verify openssh-server

И ограничения у нее те же: в /var/lib/dpkg/info/<package>.md5sums записываются суммы не для всех файлов. Единственно полный способ -- это извлечь deb-пакет как архив (dpkg --extract <package.deb> <directory>) и сравнить файлы с системными тем или иным способом.
Tags:

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

Кому-то повезло попасть на полугодовой мега-курс по разным латиноамериканским танцам и разобраться со многими вещами при помощи занятий и на их фоне, как мне, например. Кто-то предварительно получил музыкальное образование, чувствует музыку интуитивно и совсем не понимает чужие затруднения в различении сон-клаве 2-3 и 3-2. Но для меня вопрос о том, как побыстрее научиться, например, различать музыку "на 1", "на 2" и даже "на 3", оставался открыт. Когда вечеринка открывается песней Permiso que llegó Van Van, во время вступления начинает казаться, что может ну её, тимбу, я лучше посижу пока. Но это преодолимо:)

1. Заниматься нужно. Техника сама себя не закрепит.
2. Слушать музыку нужно, и много. Лучше сразу спросить у тренера, какую именно.
3. Есть специальные занятия по музыкальности, как в ходе регулярных курсов, так и на семинарах и фестивалях. Это, наверное, главный катализатор изменений в музыкальности.

Но! Семинары прошли, музыка слушается, мини-роли для разных композиций отрабатываются, но это всё? Конечно, нет. И вот что надо сделать: взять и научиться играть базовые ритмы на всех инструментах, до которых можно добраться! Это не так сложно и экзотично, как может показаться, а эффект очень простой и очень действенный: вы начинаете отчетливо слышать в музыке то, что только что сами сыграли, а когда музыканты отклоняются от стандартного ритма в сбивках, импровизациях и прочих намеренных вкусностях, вы замечаете это ясно и без раздумий.

Не обязательно покупать звонкую пару клаве из твердых пород дерева, способную перекричать музыку на любой дискотеке. За 300 рублей можно найти достаточно хорошую пару, а вообще, достаточно буквально двух чурок для игры в городки или любых других деревяшек, не обязательно даже круглых. Можно сделать их самостоятельно, почувствовать себя ближе к традиции, так сказать. Включаем любимую песню, ловим ритм и начинаем в него стучать. Важно делать это подольше, чтобы почувствовать автоматизм даже на следующий день. Если в песню стучать сложно, то можно поставить специальный метроном. Там будет и 2-3, и 3-2, и румба 2-3 и 3-2, и не только. А если это окажется слишком простым, то попробуйте шагать базовый шаг под свой же ритм. Если и это получается просто, то снимаю шляпу.

Фортепьяно есть у многих дома, у родственников, у друзей, да где угодно. Научиться играть тумбао можно за смешное время по роликам на ютубе, например, https://youtu.be/wC3Iq5ImTXE. Идеальный случай: ставишь планшет с видео вместо нот на фортепьяно и начинаешь выполнять упражения. Сначала это может показаться скучным, но эффект поразительный: знакомая музыка звучит, будто слышишь ее в первый раз, гора-а-аздо интереснее. Я сразу стал слышать, что типичный нью-йорк -- это на 2, "как я мог раньше этого не замечать?". Очень рекомендую.

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

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

Как удалить файлы из истории Git-а, или git filter-branch и переписывание истории
det_random

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

cd /path/to/repo
git filter-branch \
  -d /tmp/filter-branch-xxx \
  --original vanilla \
  --index-filter "git rm -r --cached --ignore-unmatch unwanted_file.dat" \
  --prune-empty \
  HEAD

На стандартном выводе получим нечто подобное:

Rewrite 588408a0f4c7e3aa272ed58d1ebc4adc432add68 (1/3)rm 'unwanted_file.dat'
Rewrite 261533807bc8226804b9c7d7c8a67f62a8f861ac (2/3)rm 'unwanted_file.dat'
Rewrite 6c59972f8f7c2f9a60a730c38c187d6fcb1c38b8 (3/3)rm 'unwanted_file.dat'
...

Ref 'refs/heads/master' was rewritten

И master будет указывать на другой коммит. Старая история все еще будет доступна, но скорее всего, про нее нужно забыть. Поэтому начнем историю с чистого листа:

git clone file:///path/to/repo /path/to/clean/repo

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

Как это работает и почему можно всё сломатьCollapse )
Tags:

Как удалить git submodule
det_random
Всё просто:

git submodule deinit path/to/submodule
git rm path/to/submodule
rm -rf .git/modules/path/to/submodule
git commit -m "Removed path/to/submodule"


См. также https://chrisjean.com/git-submodules-adding-using-removing-and-updating/.
Tags:

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

  • http://chromanova.de -- там надо выбирать чиллаут в менюшке и уходить в транс;

  • Familjen -- вы вряд ли услышите хотя бы один знакомый корень в текстах, так что поводов отвлечься будет мало, в отличие от русскоязычной или англоязычной музыки (или испаноязычной в моём случае); рекомендую послушать и посмотреть другие видео Фамильена;

  • https://soundcloud.com/zardonic -- давно не бывал в таком настроении, но этот D'n'B помогал на прошлой работе;

  • http://www.happyhardcore.com/radio/player/radio.asp -- это хардкор для перезагрузки мозга, котаны.

На закуску Zardonic & Playma – Freakshow:


?

Log in