google web font

Показаны сообщения с ярлыком tips'n'tricks. Показать все сообщения
Показаны сообщения с ярлыком tips'n'tricks. Показать все сообщения

понедельник, 14 марта 2016 г.

How to expand an iterator into a list in Python3

One of the most noticeable changes from Python 2 to Python 3 is that map, filter, zip and range builtins now return iterators instead of lists. This is usually a good feature to have, because, well, nobody uses range outside of a for statement. But there may be rare cases when resulting list might take less memory then the iterator itself, especially when you nesting them like this:
def increase(self, *increments):
    self.values = map(sum, zip(self.values, increments))
This is going to eat all the memory and crash with a several gigabyte core dump. So the question is: how does one expand an iterator into a sequence in Python 3? Well, I don't want to hurt the Zen of Python, but there are more than one way to do so.

The most obvious one is this:
def increase(self, *increments):
    self.values = tuple(map(sum, zip(self.values, increments)))
It's too obvious to write the whole post about it. It is as obvious as to get rid of the iterator in favor of the list comprehension:
def increase(self, *increments):
    self.values = [sum(x) for x in zip(self.values, increments)]
(Don't forget to use square brackets, or else you will get a generator, which is practically the same as iterator in this case).

I mean, there are some more exotic ways to do it.

Сколькими способами можно развернуть генератор в список в Python3

Одно из заметных нововведений в Python3 по сравнению с Python2 это то, что встроенные функции filter, map, range и zip теперь возвращают итераторы. В некоторых случаях этот итератор может занимать больше памяти, чем тот список, который от него хотят. А если их ещё и засовывать один в другой, вроде чего-то такого:
def increase(self, *increments):
    self.values = map(sum, zip(self.values, increments))
так вообще никакой памяти не хватит. Отсюда, конечно вопрос: как развернуть этот итератор в нормальную последовательность? Как бы сильно это ни противоречило Дзену Пайтона, способов много.
Самый очевидный вариант:
def increase(self, *increments):
    self.values = tuple(map(sum, zip(self.values, increments)))
Слишком просто, чтобы писать об этом блог-пост. С таким же успехом можно было вообще избавиться от map, использовав list-comprehension:
def increase(self, *increments):
    self.values = [sum(x) for x in zip(self.values, increments)]
(обязательно квадратные скобки, а то генератор никуда не денется :-)
В общем, есть более экзотические варианты.

пятница, 26 февраля 2016 г.

Javascript plugins for Blogspot

I've just finished with some interface tuning here. I generally like when some piece of work looks nice at the end of the day. Blogspot have some problems here, though. First, it doesn't offer nice fonts (well, it have a few, but with no support for cyrillic). Second, adding a source code syntax highlighter requires manually editing the source code of the template, which is not so fun and have a sad consequence that changes get lost every time I switch the template.

Luckily, there is a clean and portable way to solve my problems without the need to edit the template at all. Here is the recipe:
  • Open blog setting and go to the "Design" tab.
  • Choose a block to add new gadget to. In some cases a block from the top of the page is preferable and in some cases it is better to choose one from the bottom, but in most cases it den's matter so much.
  • Click the "add gadget" link.
  • Choose "HTML/Javascript" in the pop-up
  • Enter any XHTML code, containing CSS and Javascript (enclosed into style and script tags) and hit the "save" button.

Javascript-плагины для blogspot

Я немного повозился с настройками внешнего вида своего блога. Вообще, мне нравится, когда что-то в итоге выглядит прилично, но у этой платформы (blogger.com) есть пара серьёзных проблем. Во-первых, у них в настройках нет нормальных шрифтов (есть парочка, но в них нет кириллицы). Во-вторых, чтобы добавить подсветку синтаксиса для программного кода, нужно редактировать шаблон, что неприятно и неудобно по ряду причин: у меня нет никакого желания изучать их синтаксис, изменения теряются, когда меняешь шаблон, всё такое.

К счастью, на самом деле есть одно решение для обеих этих проблем: это возможность создания собственных "гаджетов".
  • В настройках блога выбираем "Дизайн"
  • Выбираем блок, в который не жалко добавить невидимый гаджет. В зависимости от цели можно предпочесть блок из верхней части страницы или из нижней.
  • Нажимаем "Добавить гаджет"
  • В появившемся окне выбираем "HTML/JavaScript"
  • В окне настроек пишем XHTML-код того, что нам нужно добавить, и сохраняем.

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

pentadactyl form hints

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

Заметка не об этом. И vimperator, и pentadactyl имеют режим hints, в котором они подсвечивают все ссылки на странице и позволяют перейти по ссылке, введя её номер. Для полного счастья не хватает режима, в котором аналогичным образом подсвечивались бы только поля форм — некоторым людям приходится заполнять большое количество форм, например, по работе.

суббота, 26 марта 2011 г.

три простых способа обмануть sudo

Юрик Ученик(107)
Помогите сделать себя админом на своём сервере

Минь Мастер(1118)
Ну и вопросы....
"Как из-под рута получить права рута?"

Предположим, что сервера принадлежат компании, которая даёт Вам только ограниченные права через sudo и то только согласованию. Либо собственный работодатель, который не уверен, что Вы не сломаете сервак своими кривыми руками, ограничил Вам свободу дйствий. Либо собственные родители залили все USB-порты эпоксидкой и сменили рутовый пароль, оставив только sudo для настройки и запуска локального ftp-сервера. Мало ли.

Так вот, если верить документации непосредственно на sudo, система эта крайне неудачная, на самом деле. После того, как я расскажу эти три простых способа, неудачность идеи станет очевидной, потому что для обхода — не взлома! — не надо вообще ничего делать, достаточно иметь недостаточно жестоко настроенный sudoers.

четверг, 24 марта 2011 г.

Отступы в консоли, расстановка аргументов по фэн-шую

Оказывается, в консоль можно-таки вставить символ <tab>, если очень нужно.

По дефолту при нажатии на кнопочку tab оболочка начинает подставлять команды и аргументы (tab expansion). Если нужно, чтоб так не делалось, можно нажать Insert, Tab — сначала Insert, потом Tab. Вместо Insert можно использовать Esc. Таким же способом можно вставить перевод строки.

Заметил случайно, промазав мимо бэкспейса. Работает и в bash, и  zsh. Прикольно. Жалко, что скопипастить этот Tab всё ещё нельзя: копируется соответствующее количество пробелов.

пятница, 4 марта 2011 г.

alias против скриптов и правильная настройка против всех

Итак, я уже выяснил (и всем рассказал), что круче: alias'ы или функции, определённые в текущей интерактивной сессии командной оболочки. Кстати, рассуждения про bash-replay тоже иллюстрируют беспомощность alias'ов. Но мне не хотелось бы утверждать, что alias'ы не нужны, бесполезны, слабы в функциональном плане или что-то подобное. Как говорит один мой знакомый, «фичи всякие нужны, фичи всякие важны». Ранее я обещал вернуться к теме скриптов, с помощью которых можно легко и изящно устанавливать ssh-сессии с несколькими серверами. На этом примере я и покажу, что alias очень даже конкурентоспособен.

четверг, 17 февраля 2011 г.

Морозная хлебница

В инструкции к микроволновке обнаружил среди прочих рекомендаций тайминги для разморозки хлеба. Удивился. Погуглил. Теперь знаю.
Дома мы едим достаточно мало хлеба, поэтому часто бывает, что в хлебнице уже лежит свежий ароматный батон, но сначала нужно догрызть корочку от позавчерашнего. Ещё часто бывает, что хлеб кончается а свежего нет, потому что впрок его особо не запасёшь, а зайти в магазин можно и забыть. В общем, инструкция к микроволновке неслабо выручила.
Теперь я знаю, что можно купить несколько свежих батонов, сложить их в морозилку (-18°С) и оставить там, пока не понадобятся. В морозилке хлеб можно хранить хоть полгода. А когда понадобится — вытаскиваем один батон и суём его в микроволновку. 3 минуты на 180 Вт + 12-15 минут на 90 Вт — и батон не просто разморожен: он тёплый мягкий, ароматный, будто только из печи.
Раньше я скептически относился к замораживанию хлеба, зная, что с ним бывает, если хранить его в холодильнике, но микроволновка рулит, размороженный хлеб на вкус и запах не хуже свежего. Рекомендую.

P.S. На самом деле, в Европе хлеб уже продаётся замороженым, но наши родные хлебопекарни до такого уровня цивилизации ещё не развились, поэтому приходится обходиться кустарными методами.

понедельник, 7 февраля 2011 г.

Мойте руки перед едой

Жизненное наблюдение, сделанное мной в туалете на работе (всегда мою руки перед едой): если кто-то моет руки в соседней раковине, то ты пойдёшь в столовую с мокрыми руками. Потому что когда ты начнёшь сушить руки в сушилке, сосед встанет за тобой в очередь, из-за чего и без того неторопливая сушилка превратится в затянувшееся по времени занимание прибора.
Совет в стиле лайфхак: мойте руки тщательнее, чтобы товарищ, занявший вторую раковину, пошёл к сушилке первым. Тогда он пойдёт по своим делам с мокрыми руками, а тебе будет сухо и комфортно.

среда, 30 июня 2010 г.

блокировка экрана и не только

Когда-то давно я искал в интернетах способ поймать момент, когда я блокирую экран. То есть мне нужно было, чтобы это делал скрипт. Задача такая:
Когда я отхожу от компьютера и блокирую экран, в системе должно меняться состояние некоторых приложений. Когда я возвращаюсь, состояние должно восстанавливаться.
Так, вроде, понятно. Состояние приложений — это раскладка клавиатуры, статус в джаббере, пауза в проигрывателе. Не найдя правильного способа поймать это событие, я написал bash-скрипт, подарив ему убедительное название locker. Этот скрипт я повесил на сочетание клавиш, которое ранее блокировало экран. Внутри скрипта есть команда, которая блокирует экран по d-bus (дёргает dbus-send и qdbus вперемешку), так что внешне ничего не изменилось: нажимаешь Ctrl+Alt+L — экран блокируется. Только дополнительно теперь ещё и музыка останавливается и psi меняет статус на away.
Ок, с этим моментом разобрались. А как обратно? Теперь я захотел, чтобы когда я вернулся, psi возвращалась в статус "online" и музыка начинала играть снова. Вот тут я и узнал много нового и интересного.

воскресенье, 20 сентября 2009 г.

То ли слоупок, то ли гентушник...

Наверно, каждому гентушнику знакомо такое:
!!! All ebuilds that could satisfy "sys-libs/unforgetable-dependence" have been masked.
!!! One of the following masked packages is required to complete your request:
- sys-libs/unforgetable-dependence-1.1 (masked by: ~x86 keyword)
(dependency required by "app-user/indispensable-app-1.0.1-r5" [ebuild])
Размаскировываешь один пакет - жалуется на следующий. Это особенно сильно раздражает, когда нужно по-быстрому прикинуть, какие у приложения зависимости (например, чтобы понять, как долго оно будет собираться), или чтобы прикинуть, какие у него есть USE-флаги. И до меня только что допёрло, что можно сделать так:
 $ ACCEPT_KEYWORDS="~x86" emerge -p =app-user/indispensable-app-1.0.1-r5
Запустил - и прикидываешь, а дальше autounmask в помощь. При этом, для emerge точно не стоит задавать ключ -D, потому что с ним в списке зависимостей окажется почти весь world. Также, не стоит указывать другие ключи, кроме -p.

P.S. Да, знаю, что можно посмотреть в ебилде, но там не то