середу, 10 грудня 2014 р.

Не grep’ом единым

Нашёл интересную замену grep‘у: The Silver Searcher. Команда имеет ряд преимуществ перед grep:
  • работает быстрее (можно почитать объяснение автора по поводу способов ускорения)
  • игнорирует файлы, указанные, например, в .gitignore (можно также использовать и .agignore)
  • также автор пишет: “The command name is 33% shorter than ack“. Ну конечно же имя ag в два раза короче grep
Пример для grep:
grep -r CELERYBEAT_SCHEDULE *
Binary file src/.ropeproject/globalnames matches
Binary file src/worker/.celeryconfig.py.swp matches
src/worker/celeryconfig.py:CELERYBEAT_SCHEDULE = {
src/worker/celeryconfig.py:    CELERYBEAT_SCHEDULE["one_per_hour-daylight-%s" % tz] = {
src/worker/celeryconfig.py:    CELERYBEAT_SCHEDULE["three_per_day-%s" % tz] = {
src/worker/celeryconfig.py:    CELERYBEAT_SCHEDULE["one_per_day-%s" % tz] = {
Binary file src/worker/celeryconfig.pyc matches
src/worker/celeryconfig.py~:CELERYBEAT_SCHEDULE = {
src/worker/celeryconfig.py~:    CELERYBEAT_SCHEDULE["one_per_hour-daylight-%s" % tz] = {
src/worker/celeryconfig.py~:    CELERYBEAT_SCHEDULE["three_per_day-%s" % tz] = {
src/worker/celeryconfig.py~:    CELERYBEAT_SCHEDULE["one_per_day-%s" % tz] = {

Как видим, grep обрабатывает лишние файлы. Конечно, можно указать флаг --exclude, но лень :)
Пример для ag:
ag -r CELERYBEAT_SCHEDULE *
src/worker/celeryconfig.py
78:CELERYBEAT_SCHEDULE = {
105:    CELERYBEAT_SCHEDULE["one_per_hour-daylight-%s" % tz] = {
115:    CELERYBEAT_SCHEDULE["three_per_day-%s" % tz] = {
122:    CELERYBEAT_SCHEDULE["one_per_day-%s" % tz] = {

Результат представлен более приятно (и ускорение работы заметно).
Естественно, есть плагин для Vim.

середу, 3 грудня 2014 р.

Крапчасті сомики і деякі можливості Vim

Вчора у мене в акваріумі вперше вилупились малькі крапчастих сомиків. Було вже кілька нерестів в акваріумі з гупіями. Зазвичай ікру самка відкладала на стінках акваріуму. Цього частина ікри була на листку, який я й переклав до банки. Воду в банці я прогрівав десь до 26˚C. Десь за тиждень з’явилось 4 або 5 мальків. Фото поки що не буде, бо малькі дуже маленькі. Сподіваюсь, мені вдасться їх виростити.

P.S. Знак ˚ я виставив за допомогою функціоналу Vim’а, що має назву digraphs - можна вставляти в текст велику кількість подібних спеціальних знаків

середу, 26 листопада 2014 р.

Музей корупції "Межигір'я"

Этим летом мы с Викой побывали в музее коррупции "Межигір'я". Ниже будет небольшой фоторепортаж. О размерах бывшего обиталища Януковича скажу следующее. Сначала мы ездили минут 45 на электромобиле с обзорной экскурсией. Затем взяли на прокат велосипеды и катались еще два часа, рассматривая более подробные разные интересности. Потом еще почти час ходили по зоопарку. Устали довольно сильно. При этом не успели посетить Хонку и так и не нашли дорожку с пеньками. Так что надо будет съездить еще раз.


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


На входе дают на прокат велосипеды. Обходить пешком все территорию нереально.






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



Знаменитая Хонка. Название происходит от финского слова "сосна"


Набережная

Экскурсовод сказал, что длина - 6 км., как в Феодосии. Я не измерял, но визуально сравнима с феодосийской

Молоко Батя пил от собственных коров



Прочая живность

Галеон



Тревожить покой Януковича не рекомендовалось

Гараж

Сад...

... и теплица

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





Высота забора - 6м.

Слава Україні!


середу, 12 листопада 2014 р.

Проверка правильности ссылок в Markdown-файлах

Введение

В статье Ведение блога на Blogger с помощью Vim я описал ведение блога на Blogger с помощью Vim и специального python-скрипта, который используется для публикации текстов. Как правило, хороший пост содержит некоторое количество ссылок. Естественно, хотелось бы быть уверенным, что ссылки не содержат ошибок. Способ проверки, изложенный в статье не очень подходит, так как предложенный скрипт просто выводит ссылку и результат её проверки. Более удобной бы была проверка в соответствии с идеологией Vim: с помощью :make и quickfix. Рассмотрим, как можно добиться такого функционала.

Выбор инструмента

Для проверки ссылок будем использовать linkchecker. Данный инструмент может проверять как сайты, так и локальные файлы. Также он поддерживает систему плагинов. Например, существуют плагины для проверки ссылок в документах MS Word или pdf-файлах.
Установка:
sudo pip install LinkChecker

Теперь можно проверять файлы:
linkchecker -v --check-extern t.html
LinkChecker 9.3              Copyright (C) 2000-2014 Bastian Kleineidam
...
Start checking at 2014-11-12 16:16:56+003
...
URL        http://xvadim.chgk.info/wb1/'
Name404'
Parent URL file:///Users/vadimkhohlov/work/blogger/t.html, line 6, col 9
Real URL   http://xvadim.chgk.info/wb1/
Check time 1.696 seconds
Size       284B
Result     Error: 404 Not Found
...

Разработка плагина

Инициализация

Файл с кодом плагина должен располагаться в подкаталоге linkcheck/plugins. Задача плагина - извлечь все ссылки из файла. Корректность ссылок будет проверять сам linkchecker.
Класс в нашем случае должен наследоваться от _ContentPlugin:
from . import _ContentPlugin
from .. import log, LOG_PLUGIN
class MarkdownCheck(_ContentPlugin):
    _default_filename_re = re.compile(r'.*\.(markdown|md(own)?|mkdn?)$')

    def __init__(self, config):
        super(MarkdownCheck, self).__init__(config)
        self.filename_re = self._default_filename_re

    def applies_to(self, url_data, pagetype=None):
        return self.filename_re.search(url_data.base_url) is not None
Метод applies_to должен вернуть True если плагин умеет обрабатывать данный файл. linkchecker пытается самостоятельно определить тип файла и передаёт его через параметр pagetype. Однако, в нашем случае он этого сделать не может. Поэтому приходится анализировать имя файла.

Обработка файла

Обрабатывает файл метод check(self, url_data):
_link_res = [re.compile(r'<((https?|ftp):[^\'">\s]+)>', re.I)]
def check(self, url_data):
    content = url_data.get_content()
    self._check_by_re(url_data, content)
def _save_url(self, url_data, content, url_text, url_pos):
    line = content.count('\n', 0, url_pos) + 1
    column = url_pos - content.rfind('\n', 0, url_pos)
    url_data.add_url(url_text.translate(None, '\n '), line=line, column=column)
def _check_by_re(self, url_data, content):
    for link_re in self._link_res:
        for u in link_re.finditer(content):
            self._save_url(url_data, content, u.group(1), u.start(1))
С помощью регулярного выражения метод выбирает автоссылки вида <http://autolink.com> и добавляет их к объекту url_data. Номер строки вычисляется как количество символов \n, а столбец - как расстояние до ближайшего левого \n.

Дополнительные настройки плагина

Для того, чтобы данный плагин был активирован, необходимо в файле ~/.linkchecker/linkcheckerrc добавить строку:
[MarkdownCheck]
Было бы неплохо как-то параметризовать маску имени файла. Например, я, как писал ранее, сохраняю файлы постов блога с расширением blog. Добиться этого можно следующим кодом:
_filename_re_key = "filename_re"
def __init__(self, config):
        super(MarkdownCheck, self).__init__(config)
        self.filename_re = self._default_filename_re
        pattern = config.get(self._filename_re_key)
        if pattern:
            try:
                self.filename_re = re.compile(pattern)
            except re.error as msg:
                log.warn(LOG_PLUGIN, "Invalid regex pattern %r: %s" % (pattern, msg))

    @classmethod
    def read_config(cls, configparser):
        """Read configuration file options."""
        config = dict()
        config[cls._filename_re_key] = configparser.get(cls.__name__, cls._filename_re_key) \
            if configparser.has_option(cls.__name__, cls._filename_re_key) else None
        return config
Скрипт ищет в конфиге параметр с ключем filename_re. Если не находит, использует стандартную маску имён Markdown-файлов. После этого конфиг может быть таким:
[MarkdownCheck]
filename_re=.*.(blog|markdown|md(own)?|mkdn?)$

Установка

Форк с моим кодом лежит на Github. Pull-request я отправил. Пока же можно вручную подложить файл плагина markdowncheck.py в нужное место: .../site-packages/linkcheck/plugins

Настройка Vim

Для настройки Vim необходимо задать две переменные: makeprg - команда, которая будет вызываться по :make errorformat - фильтр, с помощью которого будут из вывода команды выбираться строки с ошибками
Для обработки файла я использую такую команду: linkchecker -v --check-extern -f ~\/work/blogger/lrc -o csv file_name Аргумент --check-extern говорит, что надо проверять не только правильность ссылок, но и их валидность. С помощью -o csv задаётся формат вывода в виде csv-файла, содержащего по одной строке на каждую ссылку. Таким образом, настройки Vim будут следующими:
set makeprg=linkchecker\ -v\ --check-extern\ -f\ ~\/work\/blogger\/lrc\ -o\ csv\ '%'
set errorformat=%-G#%.%#,
                \%-Gurlname;parentname;%.%#,
                \%-G%.%#;True;%.%#,
                \%-G%.%#URLs\ checked%.%#,
                \%.%#;file://%f;;%m;;%.%#;False;%.%#;%l;%c;%.%#;%.%#;%.%#;%.%#;%.%#;%.%#;
Из вывода команды мы отбрасываем все строки, кроме содержащих информацию об ошибочных ссылках (с помощью первых четырёх элементов errorformat). Мила ЙововичПятый элемент errorformat обрабатывает все строки, в которых в седьмом столбце стоит False, т.ё. строки с информацией об ошибке. Назначение некоторых элементов errorformat:
  • %-G - пропустить строку, удовлетворяющую заданному шаблону
  • %f - имя файла
  • %m - текст сообщения об ошибке
  • %l - номер строки
  • %c - номер столбца
  • %.%# - транслируется в регэксп .*

С такими настройками, выполнив команду :make и открыв quickfix-окно, получим следующее:

Теперь можно использовать всю мощь режима quickfix, например, перемещаться по ошибочным ссылкам с помощью :cn.
Приятного блоггинга с помощью лучшего в мире редактора!

пʼятницю, 24 жовтня 2014 р.

Ведение блога на Blogger с помощью Vim

Введение

В последнее время я стал активно гадить писать посты в Blogger. Естественно, захотелось настроить правильный инструмент для упрощения себе жизни. Основных цели было две:
  • упрощение процесса редактирования
  • возможность подготовки черновиков постов в офф-лайн
Для Vim существует несколько плагинов, например Blogger.vim. Однако, у меня он не заработал, выдавая какую-то ошибку.
Основой моих настроек для Vim’а послужила вот эта статья.

Установка скрипта для постинга и его настройка

В указанной выше статье описан скрипт b.py. Скрипт позволяет подготавливать тексты в формате Markdown или reStructuredText. Установка скрипта и необходимых зависимостей описана в документации. Ему необходим конфигурационный файл brc.py подобного содержания:
import re
service = 'blogger'
service_options = {
    'blog': YOUR_BLOG_ID
}
handlers = {
    'Markdown': {
        'match': re.compile(r'.*.(blog|markdown|md(own)?|mkdn?)$'),
        'module': 'bpy.handlers.mkd',
        'options': {
            'config': {
                'extensions': ['footnotes', 'toc'],
            },
            'smartypants': True,
        },
    }
}

С помощью строки
'match': re.compile(r'.*.(blog|markdown|md(own)?|mkdn?)$')
я настраиваю скрипт таким образом, чтобы он воспринимал также файлы с расширением blog.
После подготовки конфига необходимо выполнить авторизацию, как описано в документации. В результате в этом же каталоге будет создан файл b.dat с нужным токеном. Скрипт b.py нужно обязательно запускать из каталога, содержащего файлы brc.py и b.dat.

Установка нужного filetype и подсветки синтаксиса

Файл поста - это частный случай Markdown-файла, поэтому я добавил в ~/.vim/ftdetect/ftdetect.vim следующую строку:
au BufRead,BufNewFile *.blog    set filetype=blog syntax=markdown
Таким образом я сообщаю Vim’у что тип файла будет blog, а вот для подсветки синтаксиса использовать те же правила, что и для Markdown-файлов.

Шаблон нового файла

Скрипт требует, чтобы каждый новый файл поста имел следующий заголовок
!b
service: blogger
title: Some title
labels: List of tags
(после публикации в заголовок будет добавлен ещё ряд полей). Для задания шаблонов создаваемых файлов я использую плагин aperezdc/vim-template. Поэтому добавил в каталог для ведения блога файл .vim-template:*.blog:
!b
service: blogger
title: %FILE%
labels: productivity, Vim, programming


%HERE%

После этого для создания нового поста необходимо ввести команду:
mvim "Ведение блога на Blogger с помощью Vim.blog"
(имя файла становится заголовком поста).

Настройки маппинга

В статье приводится настройка нескольких маппингов для:
  • публикации поста
  • создания html-файла для предварительного просмотра
  • проверки валидности ссылок, упоминаемых в посте
Я оставил только первый, создав файл ~/.vim/ftplugin/blog.vim:
set autoread
map <buffer> <leader>post :exec '!b.py post '.shellescape(expand('%:p'))

Проверку ссылок я не делал, так как предлагаемый автором статьи способ не соответствует идеологии Vim (по-хорошему, проверку следует настроить через makeprg). К тому же, ссылки, как правило, вставляются с помощью копирования, поэтому в проверке валидности особенного смысла нет.
Как было указано ранее, скрипт после публикации поста добавляет в файл дополнительные заголовки. Опция set autoread заставляет Vim автоматически перечитывать файл после его изменения извне.

Snippets

Для подсветки синтаксиса в блоге я использую highlight.js. Естественно, вручную каждый раз вводить <pre><code>...</code></pre> некомильфо. Целесообразно это делать с помощью какого-нибудь сниппета. С другой стороны, как отмечалось выше, файл поста - это частный случай Mardown-файла, поэтому было бы неплохо использовать также сниппеты для таких файлов. С этой целью я создал следующий UltiSnip-файл:
extends markdown

snippet code "code fragment"
<pre><code class="${1:python}">$0
</code></pre>
endsnippet

Дополнительные улучшения

Чтобы ещё больше упростить вставку в текст блога файлов целиком (избежать цепочки действий: написать <pre>… - открыть файл - скопировать - вставить) я написал такую функцию и команду:
func! s:InsertCode(file_name)
    let code_lang = substitute(a:file_name, '[^\.]*\.', '', 'i')
    call setline('.', getline('.').'<pre><code class="'.code_lang.'">')
    norm! o
    call setline('.', getline('.').'</code></pre>')
    norm! k
    exec "r ".a:file_name
endfu

command! -nargs=1 -complete=file Rc call s:InsertCode(<f-args>)

Так как аргументом команды является имя файла, то я указал -complete=file, чтобы Vim при нажатии на Tab выполнял нужное автодополнение.

Заключение

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

понеділок, 20 жовтня 2014 р.

Визуализация режима для Zsh Vi Mode

Как известно, для zsh можно включить vim-режим для ввода команд. Однако, существует проблема: не всегда можно быстро понять в каком режиме находишься  - NORMAL или INSERT. Это проблему можно побороть, например, добавив в правую часть приглашения визуализацию текущего режима. Для этого надо добавить в .zshrc:
function zle-line-init zle-keymap-select {
    VIM_PROMPT="%{$fg_bold[yellow]%} [% NORMAL]%  %{$reset_color%}"
    RPROMPT="${${KEYMAP/vicmd/$VIM_PROMPT}/(main|viins)/} $EPS1"
    zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select

Идея взята здесь

четвер, 16 жовтня 2014 р.

Мини-обзоры Vim-скриптов. Часть III: smartpairs - умное выделение текстовых объектов.

Как известно, Vim содержит серию команд для выделения текстовых объектов.
Например, команда va" выделяет фрагмент текста между ближайшими к курсору кавычками ("), включая их,  а vi" - не включая. Помимо " могут также использоваться символы:
<, >, ", ', `, (, ), [, ], {, } или t для HTML(XML)-тегов и ряд других.
Таким образом можно не только выделять текстовые объекты, но и выполнять над ними действия, т.е. использовать команды c, d, y.

Скрипт smartpairs.vim упрощает работу с текстовыми объектами.

Во-первых, при его использовании вместо перечисленных выше символов достаточно после, например, vi нажать еще раз v (клавишу, конечно же можно переопределить). Скрипт ищет ближайшую пару символов к текущему положению курсора и обрабатывает получившийся текстовый объект. Если еще раз нажать v, скрипт найдет следующую пару символов и расширить границы текущего текстового объекта.

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

В-третьих,  используемый по умолчанию Uber-режим чередует i- и a- команды над текстовыми объектами.

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

Предыдущие обзоры:
Мини-обзоры Vim-скриптов. Часть I: startify & rooter
Мини-обзоры Vim-скриптов. Часть II: Headlights - меню установленных плагинов

вівторок, 14 жовтня 2014 р.

Поддержка интерактивных нотификаций iOS 8 в приложении

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

пʼятницю, 10 жовтня 2014 р.

Мини-обзоры Vim-скриптов. Часть II: Headlights - меню установленных плагинов

Продолжу обзор используемых Vim-плагинов.

При большом количестве установленных Vim-плагинов очень легко подзабыть как вызывать ту или иную команду или привязку клавиш, предоставляемую каким-нибудь скриптом. Справиться с этой проблемой поможе скрипт Headlights. Он создает gVim-меню из всех установленных плагинов - по одному пункту на каждый плагин. Для каждого пункта этого меню создается при возможности подменю состоящее из команды вызова помощи для данного плагина, список команд и список привязок клавиш:


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

Предыдущие обзоры:
Мини-обзоры Vim-скриптов. Часть I: startify & rooter

середу, 8 жовтня 2014 р.

Мини-обзоры Vim-скриптов. Часть I: startify & rooter

Решил наваять ряд мини-обзоров Vim-скриптов, которые я  использую.
Первые: vim-startify и vim-rooter. Обзор получился не очень мини, поэтому вот ссылка на статью на Хабре

понеділок, 6 жовтня 2014 р.

Мой вклад в сниппеты для Vim

Для Vim есть замечательный набор сниппетов. В том числе и для python.  Я добавил еще два: для  classmethod и staticmethod. Мой pull-request уже принят. Так что новыми сниппетами можно пользоваться.

пʼятницю, 3 жовтня 2014 р.

Vim-plugin для быстрого открытия домашней страницы плагина

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

четвер, 25 вересня 2014 р.

Быстрое переключение по открытым файлам в vim (настройка vim-airline)

Одним из встроенных рассширений vim-airline является tabline, которое показывает имена открытых буферов.

Я добавил в свой .vimrc такие настройки:
"Vim-Airline
set laststatus=2
let g:airline_theme='badwolf'
let g:airline#extensions#tagbar#flags = 'f'
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#show_tab_type = 0
let g:airline#extensions#tabline#buffer_idx_mode = 1
" don't show buffers names if open only one file<
let g:airline#extensions#tabline#buffer_min_count = 2
let g:airline#extensions#tabline#formatter = 'unique_tail'
let g:airline#extensions#tabline#show_close_button = 0

"Macroses for quick switching between buffers nmap <leader>1 <Plug>AirlineSelectTab1 nmap <leader>2 <Plug>AirlineSelectTab2 nmap <leader>3 <Plug>AirlineSelectTab3 nmap <leader>4 <Plug>AirlineSelectTab4 nmap <leader>5 <Plug>AirlineSelectTab5 nmap <leader>6 <Plug>AirlineSelectTab6 nmap <leader>7 <Plug>AirlineSelectTab7 nmap <leader>8 <Plug>AirlineSelectTab8 nmap <leader>9 <Plug>AirlineSelectTab9


В результате vim имеет следующий вид:


С помощью маппингов  <leader>1,...,<leader>9 можно переключаться на нужный файл и сразу переходить в режим редактирование (символ i  в конце определения маппинга). 

Раньше для этих целей я использовал TabBar, который уже давно не развивается и выглядит не так красиво.

середу, 24 вересня 2014 р.

Подстройка скрипта vim-autotag

Существует несколько способов обновлять tags-файл при сохранении файла в Vim. Один из них - скрипт vim-autotag.
Возможны ситуации, когда в системе установлены несколько вариантов команды ctags:

which -a ctags
/usr/bin/ctags
/usr/local/bin/ctags

Первый результат - это обычный Сtagы, второй - Exuberant Ctags. autotag по умолчанию будет использовать обычный Ctags.  Из-за этого он может испортить tags-файл, созданный Exuberant Ctags.
Решить эту проблему очень просто, достаточно указать скрипту нужный исполняемый файл:

let g:autotagCtagsCmd = "/usr/local/bin/ctags"

четвер, 9 січня 2014 р.

Євромайдан

Між 2013 та 2014 я двічі по півдня був на Майдані. Це невеличкий фоторепортаж того, що я побачив.

Перша лінія барикад на Хрещатику:

З іншої сторони можна побути суддею та винести вирок підсудному:

Далі розташовані кілька стендів з народною політичною творчісттю:



Люди підходять, щось дописують.

Вигляд Хрещатика видразу після виходу зі станції метро:


Всюди висять вказівники:

Невеличка барикада перед КМДА:

На вході в КМДА стоїть охорона і пускає лише по паспортах.
В середині:





П'яних не пускають:

На Майдані досить чисто, сміття під ногами майже немає. По-перше, люди не сміттять:

По-друге, кілька разів бачив, як люди біля своїх палаток подмітають. Сміття складають в пакети біля мусорних баків. Також бачив, як якийсь чоловік переконував молодика підібрати сміття, що той кинув на підлогу.

На Майдані можна безкоштовно покращити свою освіту:


На другому поверсі КМДА:


Хтось записується:

Хтось грає в шахи:


Кілька палаток:




Мабуть, те саме піаніно:

Барикада перед самим Майданом:

Як вже казав, п'яних на Майдан не пускають:
Я бачив одного чоловіка з ознаками бомжуватості. На відміну від бомжів, що я бачів дотепер, він був тверезий

Херсонська палатка:

IT-палатка:


Українська ялинка:

Сцена:

Студентам нагадують, що їх батьки хвилюються:

Окрім головної, на Майдані прикрашено ще кілька ялинок:
Іграшки ніхто не краде.

Одні з вимоги Майдану:

Этот дедушка пел современные революционные песни не только на украинском, но и на русском языке:

Специальное фото для россиян, особенно для киселевых и соловьевых:

Виконується Гімн України:

Люди підспівують.

Хтось записується в ВОМ (ГО, НО, ГМО?):

У 2004 році на колонах Головпоштамта залишилось багато написів. Одну колону закрили оргсклом. Зараз з'явились нові написи. Не знаю, що з ними буде: 

Зі сцени часто виступають священики. На Майдани є також представники інших релігій:

Де роздають гроші тим, хто стоїть на Майдані, я так і не знайшов. В кількох місцях збирають кошти. Підозрюю, що коли ніхто не бачить, таємні агенти госдепа наповнюють скрині грошиками від Дяді Сема:

Ще на Майдані зробили таку ніби стіну с досточок, на яких написані назви міст:


Є кілька дощечок з Херсоном:

По Майдану ходять такі бригади швидкої допомоги:


Польова кухня:

Готують дуже смачно.

Привезли дрова:


На Майдані грають в теніс:
або в шахи:


Ще грають у футбол, але фото вийшло дуже низької якості. Я не бачив, щоб хтось грав в триньку або дурня.
На Майдані діє Відкритий університет Майдану (ВУМ):
Якась лекція:
Случахі:

Ще одна лекція - Ю.Андрухович представляє Аперитив:

Політичні дискусії в університеті:

На скількі мені відомо, зараз ВУМ працює планує проводити лекції в різних районах Києва і в різних містах України.

Сцена в суботу ввечері:

Ще палатка:

І ще кілька фото барикад:


Маленький Майдан на Михайлівській площі: