Вчера, с третьей попытки, всё же договорились встретиться с DarLik и П.Т. Еще в четверг я написал им, что для того, чтобы в пятницу проскочить (относительно) без пробок, нужно выехать до 15 часов. И ради того, чтобы быть готовым к их приезду, даже сам проснулся раньше обычного. Но увы, в 15 часов DarLik только проснулась и написала «собираемся». Потянулось долгое время ожидания. За это время я не выдержал и поджарил и частично съел шашлык (изначально планировалось, что мы приготовим его совместно). Наконец, в 19:30 DarLik написала, что они проезжают Реутов, и что навигатор показывает, что на месте они будут в 22 часа. От этого я получил жуткий facepalm, так как изначально предполагал, что к этому времени уже наоборот, они будут собираться обратно. Но деваться было некуда…
В итоге к 22 часам они только-только добрались до Ногинска. Ещё через некоторое время DarLik вышла на связь с места, где нужно съезжать с шоссе, чтобы дальше я вёл их по телефону. Сначала вроде всё было нормально, я давал им подсказки. Но потом возник момент, когда по объсянениям стало непонятно, где они. Я предложил DarLik сбросить скриншот карты с отметкой геолокации. Она скинула, я посмотрел, и в первый момент показалось, что они вообще сумели заехать непойми куда, оказавшись на другом берегу пруда. Но через пару минут всё прояснилось: я-то всегда смотрю карту с фиксированной ориентацией (то есть север сверху), а DarLik чаще пользуется режимом навигатора, где карта повернута в том направлении, куда едем. Из-за этого я и подумал, что они заехали куда-то не туда.
И вот я уже бегу к воротам СНТ, чтобы впустить их внутрь. Но времени уже 22:40, стемнело, и возникает новая сложность. Машина, на которой они приехали, здоровенная, и поставить её на участок, сделав крутой поворот с узкого проезда, да ещё и в темноте, не так уж и просто. Сначала заклинило ворота из-за того, что их уже давно не открывали. Потом обнаружилось, что двигатель у машины мощный и громкий, и я очень боялся, что мы перебудим всех соседей, которые потом выскажут своё недовольство этим отцу. Потом чуть было не въехали в один из кустов на участке. В конце концов, я не выдержал и сказал П.Т., что ладно, не стоит стараться поставить машину нормально, стоит она по диагонали на въезде и ладно, всё равно ворота закрывать не требуется, а утром всё равно уезжать. На это П.Т. ответил «теперь машина выполняет функции ворот: никого на участок не пускает». На этом и порешили, и я повёл их осматривать дом и участок.
Дом им очень понравился, особенно беседка. И вообще, они сказали «да ты тут можешь жить как в городе». Я ответил, что летом — да, только вот когда сижу здесь неделю-другую, обязательно находится причина, по которой хочется съездить в город (причём иногда меня выманивает сама DarLik), а зимой всё упирается в отсутствие воды и отопления. Потом какое-то время пообсуждали плюсы и минусы жизни в городе. Я таки угостил их шашлыком, хотя осталось его не так уж много. Им очень понравилось. Затем DarLik решила сходить в машину за электронной сигаретой, но на обратном пути уронила её в траву, и мы не могли её найти. После нескольких минут поиска решили отложить до лучших времен, а именно, до момента когда рассветёт. Поднялись на второй этаж, сидели там и разговаривали, а потом наблюдали рассвет через окно. DarLik даже сделала фото.
Где-то в районе четырех часов П.Т. завёл речь о том, что пора уже собираться. Меня к этому времени уже начало понемногу вырубать от недосыпа, плюс начался некоторый перегруз от общения, как обычно, хотелось уйти в себя, поэтому я поддерживал эту мысль. Но DarLik хотела остаться ещё на какое-то время. И ещё нужно было найти электронную сигарету. Потом я сделал им кофе из отцовских запасов (причем впервые в жизни, сам я кофе не пью), потерянную сигарету всё же нашли, и где-то в 5:20 стали выезжать с участка. Я опять стал загоняться на тему того, что побудим соседей. Но обошлось (впрочем, есть подозрение, что нам повезло и соседи напротив куда-то уезжали на ночь, по крайней мере, у них всё было закрыто). Сначала П.Т. попытался было развернуть машину на площадке возле соседнего дома, но увы, не получилось. Зато чуть было не снесли столб, установленный теми самыми соседями напротив. Они, видимо, решили менять забор, и старый сместили чуть вглубь участка, а на углу этот самый столб для нового. Но я с недосыпа про это забыл и не предупредил П.Т. Но, видимо, высшие силы были на нашей стороне в эту ночь! После этого П.Т. решил выехать задом, не разворачиваясь. Проблема была в том, что у соседей тоже есть проблемы с въездом на их участки, поэтому несколько машин стояли прямо в проезде. И нужно было выезжать, выдерживая курс с точностью до нескольких десятков сантиметров. К счастью, П.Т. справился, но тот момент, когда мы проезжали мимо первой соседской машиной так, что между зеркалами было всего два сантиметра, меня просто трясло, так как зацепи мы её, неприятностей было бы выше крыши. Наконец-то добрались до еще одного места, где можно было легко развернуться и поехали к воротам. Предстояло последнее испытание: выехать за территорию СНТ, не разбудив сторожа. Как выяснилось, это не так уж сложно: сторожа обычно будят собаки, но на машину, выезжающую из посёлка, они просто не реагируют.
После этого я смог вздохнуть с облегчением и отправиться домой. Часам к шести я лёг спать, но заснуть никак не мог. Во-первых, уже ярко светило солнце, во-вторых, сказывалась эмоциональная перегрузка, в-третьих, от открытия ворот всё же остались следы (хоть мы кое-как их замаскировали), и я опасался, что отец их увидит, и начнёт задавать вопросы, чего это мне вдруг потребовалось их открывать. Так я проворочался до приезда отца. Потом всё же смог помедитировать и заснуть.
Увы, проспал я совсем немного. Уже в 12:30 проснулся, и понял, что больше спать не могу. В первый момент после подъема чувствовал себя ужасно, через пару часов вроде бы пришёл в себя, но всё равно весь день ушёл, что называется, мимо. Даже в играх шло всё вкривь и вкось. Вечером вышли с отцом на пробежку, но результат тоже не обрадовал: более чем на минуту хуже, чем в прошлый забег, при том, что устал больше. А после бега вообще не выдержал и заснул, но поспать нормально не смог из-за того, что рядом лежал мобильник, где то и дело сыпались сообщения. Единственный позитивный момент — это то, что удалось сфотографировать ещё один красивый закат!
Был в Сети 8 дек. 2024 г., 00:47
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Специализируюсь на ускорении загрузки сайтов и разработке ботов для Telegram. Linuxоид (использую Debian+LXDE). Сторонник IndieWeb, slow lifer.
- Перово, Москва, Россия
- me@4xpro.ru
- x4_pro
- XXXXPro
Новости сайта в Telegram
t.me/4x_proЛог жизни
Лог моей жизни, где я фиксирую наиболее эмоционально значимые для меня события и текущее настроение. Является продолжением блога, который я вел в ЖЖ с ноября 2004 по апрель 2018 года.
Переписал SiteKnockerBot на Go
Вчера вечером выполнил еще один пункт из своего списка дел на период загородной жизни: дописал новую версию SiteKnockerBot на языке Go, что позволило выполнять проверки сайтов параллельно. Но закончил весьма поздно, поэтому тестирование на боевом сервере решил отложить на сегодня. Причем, думал, что управлюсь за час-полтора, а остаток дня потрачу на отдых и компьютерные игры. Но увы, я был бы не я, если бы не растянул намеченное дело на всё доступное время. Началось всё с того, что при первом запуске бот просто упал. Причина нашлась довольно быстро: в одной ситуации я поставил defer resp.Close до проверки на то, что нет ошибок. Перекомпилировал, загрузил на сервер, запустил снова. Вроде работает, но то и дело появляются ошибки — невозможно открыть сокет из-за нехватки количества файлов. Пришлось срочно разбираться, как увеличить количество открытых файлов, так как прежде я с этим лимитом никогда не сталкивался. Ещё один запуск: вроде работает, но появляется подозрительно много таймаутов. Уменьшил число goroutines, вроде стало лучше, но опять таймауты есть. Какое-то время пытался играться с числом goroutines и интервалом, через который они порождаются, но увы, таймауты никуда не девались. Пробовал смотреть эти сайты через curl на локальном компьютере — вроде всё нормально, выдаются 301 или 302 редиректы. Думал, что в Go они как-то некорректно обрабатываются, но нет. Разгадка пришла тогда, когда попытался открыть соответствующие адреса в броузере. Оказывается, в таких случаях происходят редиректы на другой адрес, который не отвечает.
И вообще, в базе обнаружилось на удивление много «битых» и подозрительных адресов. Такое ощущение, что чуть ли не четверть пользователей использовало бота для каких-то сайтов-однодневок и подозрительных целей…
После того, как разобрался с таймаутами, снова стал подбирать число goroutines и интервалы. Изначально план был таким: 500 параллельных запросов каждые 150 миллисекунд, что давало 1 миллион проверок за пятиминутный цикл. Но при этом время ответа многих сайтов оказывалось гораздо больше, чем на самом деле. Например, даже 2seconds, где вообще лежит статичная страница, открывался чуть больше 1 секунды. Я стал пытаться уменьшить интервалы до 20—30 мс, уменьшив также и количество параллельных запросов, но увы, либо это не помогало, либо приходилось ставить такие значения, что число проверок за цикл получалось бы равным 200—300 тыс, а не миллиону, как я задумывал изначально. В итоге уже почти смирился с тем, что придётся тремястами тысячами и ограничиться. Но потом решил пойти на крайние меры: интервал между запросами снизил всего до 6 мс, а их число — до 10. Сделав это, я обнаружил, что время снизилось до почти приемлемого: тот же 2seconds загружается за 400 мс, а в среднем время ответа менее на 100 мс больше, чем на старой версии бота. Но увы, даже так получается всего полмиллиона запросов за цикл.
На этом я и решил остановиться. Потом еще какое-то время провозился с настройкой systemd. Почему-то из командной строки новый бот запускался нормально, а через него — нет. Вскоре выяснилось, что systemd запускает старую версию бота, не видя изменений в unit-файле. Так до конца и не понял, почему, но в итоге добился нормальной работы. Потом стал искать, нельзя ли как-то оптимизировать работу HTTP-клиента в Go, наткнулся на проект fasthttp, где обещают гораздо более высокую скорость запросов. Но увы, переписывать бота ещё раз уже нет ресурса — выгорел полностью.
Но в любом случае, я впервые написал что-то достаточно серьёзное и законченное на относительно новом для себя языке — Go. До этого я использовал его только для решения задач на CodinGame, и то очень мало. Впечатления остались очень противоречивые. Понравилась лёгкость распараллеливания, легкость компиляции под другую архитектуру (я сначала собирал бота под x86, забыв, что у меня и на втором VDS стоит 64-битная OS) и то, что он делает полностью статичные бинарники бе всяких so. Правда, у этого есть и обратная сторона: большая прожорливость памяти. PHP-шная версия бота занимала вроде около 30 Мб, а новая — 65, а когда параллельных запросов было больше, то и все 110. Но что реально не нравится, так это использование всяких Readers/Writers для работы с HTTP-ответом (и не только с ним, они там на каждом шагу используются). Ну почему его нельзя получить просто в строку/массив байтов, как в PHP или JavaScript? Зачем эти лишние (и труднодоступные для понимания) сущности? (И тут я подумал, что надо было вообще использовать node.js, а не Go.)
А еще завершение бота — это ещё один выполненный пункт моего списка дел. Причем восьмой из шестнадцати — ровно половина сделана. Хех, как всегда, живу в 3—4 раза медленнее: планировал сделать 16 пунктов за месяц, сделал половину почти за два. Но, пожалуй, теперь стоит устроить несколько дней отдыха, чтобы прийти в себя после всего этого!
И вообще, в базе обнаружилось на удивление много «битых» и подозрительных адресов. Такое ощущение, что чуть ли не четверть пользователей использовало бота для каких-то сайтов-однодневок и подозрительных целей…
После того, как разобрался с таймаутами, снова стал подбирать число goroutines и интервалы. Изначально план был таким: 500 параллельных запросов каждые 150 миллисекунд, что давало 1 миллион проверок за пятиминутный цикл. Но при этом время ответа многих сайтов оказывалось гораздо больше, чем на самом деле. Например, даже 2seconds, где вообще лежит статичная страница, открывался чуть больше 1 секунды. Я стал пытаться уменьшить интервалы до 20—30 мс, уменьшив также и количество параллельных запросов, но увы, либо это не помогало, либо приходилось ставить такие значения, что число проверок за цикл получалось бы равным 200—300 тыс, а не миллиону, как я задумывал изначально. В итоге уже почти смирился с тем, что придётся тремястами тысячами и ограничиться. Но потом решил пойти на крайние меры: интервал между запросами снизил всего до 6 мс, а их число — до 10. Сделав это, я обнаружил, что время снизилось до почти приемлемого: тот же 2seconds загружается за 400 мс, а в среднем время ответа менее на 100 мс больше, чем на старой версии бота. Но увы, даже так получается всего полмиллиона запросов за цикл.
На этом я и решил остановиться. Потом еще какое-то время провозился с настройкой systemd. Почему-то из командной строки новый бот запускался нормально, а через него — нет. Вскоре выяснилось, что systemd запускает старую версию бота, не видя изменений в unit-файле. Так до конца и не понял, почему, но в итоге добился нормальной работы. Потом стал искать, нельзя ли как-то оптимизировать работу HTTP-клиента в Go, наткнулся на проект fasthttp, где обещают гораздо более высокую скорость запросов. Но увы, переписывать бота ещё раз уже нет ресурса — выгорел полностью.
Но в любом случае, я впервые написал что-то достаточно серьёзное и законченное на относительно новом для себя языке — Go. До этого я использовал его только для решения задач на CodinGame, и то очень мало. Впечатления остались очень противоречивые. Понравилась лёгкость распараллеливания, легкость компиляции под другую архитектуру (я сначала собирал бота под x86, забыв, что у меня и на втором VDS стоит 64-битная OS) и то, что он делает полностью статичные бинарники бе всяких so. Правда, у этого есть и обратная сторона: большая прожорливость памяти. PHP-шная версия бота занимала вроде около 30 Мб, а новая — 65, а когда параллельных запросов было больше, то и все 110. Но что реально не нравится, так это использование всяких Readers/Writers для работы с HTTP-ответом (и не только с ним, они там на каждом шагу используются). Ну почему его нельзя получить просто в строку/массив байтов, как в PHP или JavaScript? Зачем эти лишние (и труднодоступные для понимания) сущности? (И тут я подумал, что надо было вообще использовать node.js, а не Go.)
А еще завершение бота — это ещё один выполненный пункт моего списка дел. Причем восьмой из шестнадцати — ровно половина сделана. Хех, как всегда, живу в 3—4 раза медленнее: планировал сделать 16 пунктов за месяц, сделал половину почти за два. Но, пожалуй, теперь стоит устроить несколько дней отдыха, чтобы прийти в себя после всего этого!
День солнцестояния
Сегодня был весьма необычный день: солнцестояние совпало с солнечным затмением. Обычно в дни солнцестояния я пишу о том, что лучшая часть года позади, но в этот раз, пожалуй, воздержусь. А то ведь так и будет… Впрочем, один плюс у этого года всё же есть: я сделал то, что хотел сделать давно — прожил на даче безвылазно с мая до солнцестояния. И ещё неизвестно сколько буду тут сидеть… DarLik так и вовсе предлагает до самых холодов.
Затмения от нас не было видно, но его влияние всё равно чувствуется. И у меня голова соображает плохо, а днём еще была непонятная раздражительнось, и многих знакомых глючит. Сегодня большая часть дня ушла на то, чтобы понять, почему в Go не работает обращение к базе данных не из главной goroutine, а из дополнительных. Только уже ночью нашёл, что завершение главной goroutine приводит к завершению приложения целиком, и остальные goroutines просто не успевают отработать. Впрочем, даже узнав это, проблему решил не сразу: забыл, что у меня в отладочных целях в середине main стоит return, а я пытался добавлять код в конец.
Ещё выбрался на прогулку к ближайшему водоёму, а потом вдоль Клязьмы. В целом прогулкой доволен, но каких-либо сильных впечатлений не осталось. А вечером была очень глючная игра в «Колонизаторов»: 6-ки выпадали реже, чем 9, 10 и 11! В итоге выиграл оранжевый игрок, у которого начальная расстановка была такая, что я думал, что он вообще на последнем месте останется. Но хотя он выигрывал с середины игры, почему-то против меня активно играл красный, часто блокируя мне 8-ку разбойником. В итоге за всю игру я недополучил чуть ли не десять карт ресурсов, что тоже сказалось на результате (я в итоге был вторым).
Затмения от нас не было видно, но его влияние всё равно чувствуется. И у меня голова соображает плохо, а днём еще была непонятная раздражительнось, и многих знакомых глючит. Сегодня большая часть дня ушла на то, чтобы понять, почему в Go не работает обращение к базе данных не из главной goroutine, а из дополнительных. Только уже ночью нашёл, что завершение главной goroutine приводит к завершению приложения целиком, и остальные goroutines просто не успевают отработать. Впрочем, даже узнав это, проблему решил не сразу: забыл, что у меня в отладочных целях в середине main стоит return, а я пытался добавлять код в конец.
Ещё выбрался на прогулку к ближайшему водоёму, а потом вдоль Клязьмы. В целом прогулкой доволен, но каких-либо сильных впечатлений не осталось. А вечером была очень глючная игра в «Колонизаторов»: 6-ки выпадали реже, чем 9, 10 и 11! В итоге выиграл оранжевый игрок, у которого начальная расстановка была такая, что я думал, что он вообще на последнем месте останется. Но хотя он выигрывал с середины игры, почему-то против меня активно играл красный, часто блокируя мне 8-ку разбойником. В итоге за всю игру я недополучил чуть ли не десять карт ресурсов, что тоже сказалось на результате (я в итоге был вторым).
Сумел встать раньше
Сегодня естественным образом проснулся чуть позже 10 часов утра и чувствовал себя относительно бодрым (спать лег где-то около 3:30). Но увы, хотя вначале радовался, что удалось увидеть утро, к середине дня недостаток сна дал о себе знать: ни на чём толком не мог сосредоточиться. Плюс ещё мелкие неприятности с freelance-деятельностью. Так что день прошёл куда-то мимо. Единственный толковый результат — выбрались с отцом на пробежку на 4.5 км. Но и тут без неприятностей не обошлось: отец случайно выключил секундомер почти сразу после старта, когда убирал мобильник в карман. Так что время, за которое мы пробежали, осталось неизвестным. Но сегодня бежалось лучше, чем позавчера: тяжело дался только последний участок пути, вдоль песчаного карьера. И еще утром обновил софт на сервере с socionics.me и ботами. Оказывается, из-за того, что давно этого не делал, устарели корневые сертификаты, поэтому бот не мог достучаться до некоторых сайтов по https (+1 повод не очень хорошо относиться к повсеместному использованию https).
А вот вчера произошло два позитивных события. Во-первых, узнал, что разблокировали Telegram, и теперь я могу заходить на него без всяких средств обхода блокировок. Причем новость о том, что рассматривается такой законопроект, проскочила только в понедельник, и вдруг уже. Интересно, с чего такая оперативность — перед голосованием что ли? Во-вторых, удачно закупился акциями, поймав момент, когда рынок чуть-чуть просел, а сегодня двинулся обратно.
Ещё прошлой ночью смог увидеть планеты Юпитер и Сатурн, что давно хотел сделать, но то была облачность, то время неподходящее. Правда, очень низко над горизонтом, и не уверен, правильно ли я идентифицировал Сатурн, так как в 2018 году он казался мне менее ярким. С другой стороны, возможно, тогда он просто был дальше от Земли.
А вот вчера произошло два позитивных события. Во-первых, узнал, что разблокировали Telegram, и теперь я могу заходить на него без всяких средств обхода блокировок. Причем новость о том, что рассматривается такой законопроект, проскочила только в понедельник, и вдруг уже. Интересно, с чего такая оперативность — перед голосованием что ли? Во-вторых, удачно закупился акциями, поймав момент, когда рынок чуть-чуть просел, а сегодня двинулся обратно.
Ещё прошлой ночью смог увидеть планеты Юпитер и Сатурн, что давно хотел сделать, но то была облачность, то время неподходящее. Правда, очень низко над горизонтом, и не уверен, правильно ли я идентифицировал Сатурн, так как в 2018 году он казался мне менее ярким. С другой стороны, возможно, тогда он просто был дальше от Земли.
Несколько бестолковых дней
В субботу дописал и опубликовал 10 и 11 часть своей биографии. Изначально я рассчитывал сделать это еще в мае, но в реальности, как всегда, это заняло гораздо больше времени. Зато это помогло лучше разобраться в себе. А еще закончил проходить в игре Battle for Wesnoth кампанию The Missing Scepter Case. Это та самая, где есть Warlock Homz и Flotsom the Healer (аналоги Шерлока Холмса и доктора Ватсона, перенесенных в мир этой игры). Когда-то очень давно, кажется, в 2015 или 2016 году, я уже упоминал об этом, собираясь заняться переводом этой кампании, но так и не сложилось.
А последующие дни прошли куда-то мимо. Воскресенье я сознательно решил сделать днём безделья. Тем более, ко мне собирались приехать DarLik и П.Т., но так и не сложилось. Зато об этом узнала Tella и уговорила меня встретиться. Мы договорились с ней в понедельник побывать в деревне Заозерье, осмотреть озеро, местную церковь и кладбище. И большая часть понедельника именно на это и ушла. Увы, погода выдалась мрачной, а озеро уже зацвело, поэтому таких фотографий, как в мае прошлого года, сделать не удалось, но тем не менее, Tellе прогулка очень понравилась!
Вчера прожил в каком-то сонном состоянии. Ничего толком не сделал, только досмотрел шестую неделю курса по теории игр. Ночью попытался лечь раньше, до 4 часов даже, но так и не смог уснуть. Зато дочитал второй том «Двух жизней».
Сегодня тоже был каким-то тормозным. Но помогло то, что вечером с отцом выбрались на пробежку. На этот раз решили бежать не по полю, а сделать круг с возвращением по старой дороге. Это больше по расстоянию, зато бежать проще. В итоге устал сильно, зато чувствую, что наконец-то проснулся и включился в реальность. Или, может быть, пробежка просто подняла давление до приемлемого уровня.
Еще впервые за последние несколько лет достал и включил свой самый старый ноутбук, купленный еще в 2003 году. Тот самый, с которым я прошёл магистерскую и кандидатскую защиты, и который теперь постоянно хранится на даче, даже зимой. Оказалось, что он жив и вполне работоспособен. Правда, стоит на нём древний Arch Linux с LXDE, от которого я уже отвык. Плюс еще когда-то экспериментировал на нём в плане превращения LXDE в аналог Elementary OS в плане внешнего вида.
А последующие дни прошли куда-то мимо. Воскресенье я сознательно решил сделать днём безделья. Тем более, ко мне собирались приехать DarLik и П.Т., но так и не сложилось. Зато об этом узнала Tella и уговорила меня встретиться. Мы договорились с ней в понедельник побывать в деревне Заозерье, осмотреть озеро, местную церковь и кладбище. И большая часть понедельника именно на это и ушла. Увы, погода выдалась мрачной, а озеро уже зацвело, поэтому таких фотографий, как в мае прошлого года, сделать не удалось, но тем не менее, Tellе прогулка очень понравилась!
Вчера прожил в каком-то сонном состоянии. Ничего толком не сделал, только досмотрел шестую неделю курса по теории игр. Ночью попытался лечь раньше, до 4 часов даже, но так и не смог уснуть. Зато дочитал второй том «Двух жизней».
Сегодня тоже был каким-то тормозным. Но помогло то, что вечером с отцом выбрались на пробежку. На этот раз решили бежать не по полю, а сделать круг с возвращением по старой дороге. Это больше по расстоянию, зато бежать проще. В итоге устал сильно, зато чувствую, что наконец-то проснулся и включился в реальность. Или, может быть, пробежка просто подняла давление до приемлемого уровня.
Еще впервые за последние несколько лет достал и включил свой самый старый ноутбук, купленный еще в 2003 году. Тот самый, с которым я прошёл магистерскую и кандидатскую защиты, и который теперь постоянно хранится на даче, даже зимой. Оказалось, что он жив и вполне работоспособен. Правда, стоит на нём древний Arch Linux с LXDE, от которого я уже отвык. Плюс еще когда-то экспериментировал на нём в плане превращения LXDE в аналог Elementary OS в плане внешнего вида.
Неудачная попытка лечь спать пораньше
Вчера вернулся домой с длинной прогулки в уставшем состоянии и подумал: физически устал сильно, важных или срочных дел, которые нужно доделать именно сегодня, нет — хорошая возможность лечь спать пораньше. Но увы, получилось как всегда:
0:20 — решаю «еще слишком рано, еще полчасика почитаю один сайт и пойду спать».
1:30 — вспоминаю, что забыл поужинать
2:10 — желания идти спать не совсем, поэтому снова возвращаюсь к тому сайту
2:40 — обнаруживаю, что уже довольно поздно и надо бы идти спать, но никак не могу заставить себя оторваться
3:45 — всё-таки выключаю Интенет и иду готовиться ко сну
4:25 — ложусь спать.
Хотя формально, в общем-то получилось: обычно я ложусь спать где-то около пяти. Но с другой стороны, к 4:25 уже рассвело, поэтому заснуть получилось далеко не сразу.
0:20 — решаю «еще слишком рано, еще полчасика почитаю один сайт и пойду спать».
1:30 — вспоминаю, что забыл поужинать
2:10 — желания идти спать не совсем, поэтому снова возвращаюсь к тому сайту
2:40 — обнаруживаю, что уже довольно поздно и надо бы идти спать, но никак не могу заставить себя оторваться
3:45 — всё-таки выключаю Интенет и иду готовиться ко сну
4:25 — ложусь спать.
Хотя формально, в общем-то получилось: обычно я ложусь спать где-то около пяти. Но с другой стороны, к 4:25 уже рассвело, поэтому заснуть получилось далеко не сразу.
Переселение на первый этаж и первая пробежка в этом году
Вчера целых два раза просыпался от телефонных звонков. С каким-то поразительным упорством до меня пытались достучаться три номера. Если верить сайтам типа «НеБериТрубку», то два — мошеннические, и еще один — банк. Из-за этого встал раньше 12 часов, и в очень раздраженном состоянии. К тому же, несмотря на жару, мёрз. То ли из-за того, что позавчера вечером посидел под открытым окном, то ли нарушенный сон привёл к нарушениям терморегуляции. И ещё всё очень сильно раздражало.
Первое что сделал — это решил всё же перебраться на первый этаж. Всё же тут и стол, и кресло удобнее, и есть возможность использовать большой монитор, от чего я уже успел отвыкнуть. Так что теперь можно считать, что лето наконец-то вступило в свои права.
В целом день прошёл куда-то мимо. Хотел было дописать биографию, но никак не мог настроиться. Поэтому почти весь день ушел на игру в Battle for Wesnoth.
Вечером мы с отцом решили устроить пробежку. Изначально хотели пробежаться по тому же пути, что бегали в 2016—2017 годах, но немного напутали и оббежали песчаный карьер с другой стороны, увеличив дистанцию почти на 800 метров, как потом выяснилось по результатам измерения по Яндекс.Карте. В результате устал жутко, особенно на последнем участке пути, где возвращаемся к поселку по прямой дороге. Зато лег спать раньше обычного (в 3:40), и при этом смог заснуть достаточно быстро.
Первое что сделал — это решил всё же перебраться на первый этаж. Всё же тут и стол, и кресло удобнее, и есть возможность использовать большой монитор, от чего я уже успел отвыкнуть. Так что теперь можно считать, что лето наконец-то вступило в свои права.
В целом день прошёл куда-то мимо. Хотел было дописать биографию, но никак не мог настроиться. Поэтому почти весь день ушел на игру в Battle for Wesnoth.
Вечером мы с отцом решили устроить пробежку. Изначально хотели пробежаться по тому же пути, что бегали в 2016—2017 годах, но немного напутали и оббежали песчаный карьер с другой стороны, увеличив дистанцию почти на 800 метров, как потом выяснилось по результатам измерения по Яндекс.Карте. В результате устал жутко, особенно на последнем участке пути, где возвращаемся к поселку по прямой дороге. Зато лег спать раньше обычного (в 3:40), и при этом смог заснуть достаточно быстро.
Вырвался из болота жизни
Кажется, удалось вырваться из болота жизни. Позавчера закончил проходить Ultima IX, о чем создал тему на форуме. А после этого снес пропиертарный nvidia-драйвер, вернувшись на nouveau+i915. Дравйер nvidia я ставил, в основном, ради того, чтобы в Ultima IX была графика красивее за счет принудительного antialiasingа, но он периодчиески вызывал подтормаживание броузеров, что раздражало.
Наконец-то потеплело, вчера снова выбрался на прогулку — на этот раз подальше, к затопленному печаному карьеру посреди поля. По дороге сделал несколько фото, да и просто получил удовольствие от того, какой передо мной открывался простор. Если погода не изменится, чеерз пару дней всё же перемещусь с ноутбуком на нижний этаж. Еще разгреб часть очередных задач по freelance-деятельности, прошёл тест по четвертой неделе курса по теории игр.
А сегодня весь день просидел в оффлайне. Читал «Семь навыков эффективных людей», причем для этого даже выбрался из дома в беседку, пользуясь наступившим теплом, потом занимался 11-ой частью биографии. Прямо чувствую, как восстанавливается внутренняя целостность, когда нет кучи факторов, постоянно разрывающих внимание в разные стороны.
Наконец-то потеплело, вчера снова выбрался на прогулку — на этот раз подальше, к затопленному печаному карьеру посреди поля. По дороге сделал несколько фото, да и просто получил удовольствие от того, какой передо мной открывался простор. Если погода не изменится, чеерз пару дней всё же перемещусь с ноутбуком на нижний этаж. Еще разгреб часть очередных задач по freelance-деятельности, прошёл тест по четвертой неделе курса по теории игр.
А сегодня весь день просидел в оффлайне. Читал «Семь навыков эффективных людей», причем для этого даже выбрался из дома в беседку, пользуясь наступившим теплом, потом занимался 11-ой частью биографии. Прямо чувствую, как восстанавливается внутренняя целостность, когда нет кучи факторов, постоянно разрывающих внимание в разные стороны.
Дополнение для Chrome и прогулка после дождя
С тех пор, как я переехал за город, прошло уже больше месяца. Кажется, что заезд был очень-очень давно, а жизнь до эпидемии — вообще каким-то сном. Но увы, перестроиться на дачный режим жизни не получается. Видимо, дело не в том, где я нахожусь, а чем занимаюсь. Раньше, приехав на дачу, особенно весной, я выбирался и гулять, и кататься на велосипеде, а когда оставался дома, значительную часть времени проводил в оффлайновом режиме. В этот же раз всё не так.
Впрочем, в начале недели был момент, когда вроде бы начал выравнивать режим дня. Но увы, во вторник снова «сорвался», хоть и отключил Интернет рано вечером, всё равно засиделся до 5 утра, перечитыая «Драму на Ниобее» Сергея Снегова. (Хех, вот она, непредсказуемость потока жизни, которым меня вечно сносит: утром получил рассылку ЖЖ, в одном из комментариев упоминался этот автор, я решил поискать его в своем книжном архиве, и вот и результат…)
В среду проснулся поздно и был весьма недоволен этим фактом. Да и вообще, всё раздражало. По-прежнему было ощущение жуткой нехватки времени и увязания в болоте жизни: не было прогресса по своим задачам, во вторник накидали всякой фигни по freelance, да и погода сказывалась. К тому времени уже несколько дней подряд дожди шли почти непрерывно. У нас даже на участке начали грибы расти в огромных количествах, жаль только, что несъедобные. Вышел ненадолго в Сеть проверить сайты и глянуть обстановку на рынке. И вдруг понял, что всё раздражает. Решил отключить связь, и большую часть дня провёл в оффлайне. Удивительно, но это помогло: понемногу стало возвращаться ощущение внутренней целостности.
Увы, бессознательное сыграло со мной злую шутку. Оно полностью вытеснило то, что я пообещал Tellе выйти на связь в 22 часа (если бы не логи, которые могут врать, я бы и не поверил, что это было). Она кинула SMS, но её я тоже не увидел. И только где-то через час с небольшим, когда она прислала вторую, я вышел на связь. За это время она успела сильно «разогнаться» эмоционально, и ушло много времени на то, чтобы её успокоить.
Потом снова ушёл в оффлайн, поиграл немного в Ultima IX, завершил один из самых глючных побочных квестов. И наступил момент, когда все известные мне квесты выполнены, и главному герою приходит время отправляться в последний путь (в буквальном смысле этого слова) на остров Терфин. На этом я вышел из игры и уже подумывал было пойти спать, но тут случилось непредвиденное. Пока я днем сидел в оффлайне, у меня в голове снова возникала мысль о том, что хорошо бы сделать расширение для броузера, которое выделяло бы пользователей ВК с закрытым профилем. И вот в голове сложилась целостная картина, как это должно быть сделано.
Как писать расширения, я помнил очень смутно, поэтому для начала ограничился скриптом, который вставлял через консоль. Но на JavaScript я пишу мало и редко, поэтому долго провозился с отладкой. Причем большинство ошибок оказывались довольно глупыми. Самая частая, например, — это забыть об элементе верхнего уровня в присланном ответе, если он всего один, а пытаться сразу залезть в элемент следующего уровня. Из-за этого засиделся до 6 утра, а потом, когда всё заработало, еще не сразу мог уснуть из-за эмоционального подъема, который это вызвало.
Тем не менее, на следующий день проснулся даже раньше 12 часов. Естественно, состояние и работоспособность при этом были далеки от идеальных. Но тем не менее, я сел теперь уже за написание полноценного расширения. Сначала всё шло вроде бы хорошо: просто написал manifest.json, в котором прописал подключение уже написанного кода в качестве content script, сделал значки разных размеров и написал описание. Но затем решил немного всё облагородить, если так можно выразиться — вынести оформление выделенного пользователя в отдельный CSS-файл, учесть лимиты обращений к VK API, динамическую догрузку контента, сделать описание на русском и английском и т.п. Но со всем этим провозился еще несколько часов. В частности, очень надолго застрял при выносе стилей в CSS по очень глупой причине: забыл убрать кавычки вокруг значения свойства border. Из-за этого скрипт отрабатывал как надо, класс применялся, но внешне аватар пользователя никак не менялся. А из-за недосыпа была снижена внимательность, и долго не мог этого увидеть, ломая голову, что же идёт не так.
Настал момент, когда вроде бы всё заработало. Я решил отдохнуть и немного прогуляться по поселку, воспользовавшись тем, что в четверг потеплело. К этому времени как раз дождь кончился, и я отправился в путь. Идея гулять сразу после дождя оказалась очень удачной! Воздух был очень чист и прозрачен, на дороге оставалось еще много луж, в которых можно было рассматривать отражения облаков и деревьев, а на траве и кустах сирени — капли дождя. Я взял с собой фотоаппарат и отснял серию фотографий, которую так и назвал — «После дождя». Правда, выложил пока только в Instagram, где фото очень сильно уменьшаются и теряют в качестве. Но даже в таком виде фотографии очень понравились Tellе и goblincat.
Вечером вновь вернулся к работе над расширением. Стал готовить приложение к публикации, упаковал в CRX-файл. И тут меня ждала еще одна неожиданность. В какой-то момент регистрация в качестве разработчика на Chrome Store стала платной! Из-за этого пришлось отказаться от планов выложить расширение туда. К счастью, еще не всё прогнило в этом мире, и в аналогичном сервисе Opera можно выкладывать бесплатно. Но увы, у Opera пользователей гораздо меньше… Также решил выложить исходный код на GitHub. Но и тут без напрасных потерь времени не обошлось. При создании репозитория не указал, что не нужно его инициализировать файлами README и лицензией. Из-за этого никак не получалось синхронизировать его с локальным git-репозиторием. Так и пришлось удалить и создать заново пустой, и только после этого git push сработал.
Но тут меня ждала другая неприятность. Около полуночи расширение вдруг перестало работать, сначала в Opera, а потом и в Chrome. Стало выдавать ошибку, что fetch-запрос заблокирован. Писалось что-то про CORS. Я попытался было экспериментировать с режимами запроса или искать решение в Интернете, но к тому времени уже сильно хотелось спать и голова не соображала. На следующий день решение всё же нашлось. Оказалось, что совсем недавно произошло очередное ужесточение требований к безопасности: теперь из content-скриптов нельзя делать fetch-запросы вообще. Нужно выносить их в background worker. К счастью, там, где я это вычитал, приводился пример кода, который я смог быстро адаптировать для своих нужд. И вот, через несколько попыток расширение снова стало работать! Обрадовавшись, я побежал его пересобирать и выкладывать в Opera Addons. Но увы, попользовавшись им еще немного, обнаружил еще одну ошибку. Почему-то в списке участников группы оно правильно выделяло приватных пользователей только при первом заходе туда, а потом всё слетало. Ещё час, если не больше, я ломал над этим мозг. Потом причина ошибки обнаружилась: не вызывалась функция, отвечающая за само выделение аватаров, в том случае, если на странице добавлялись новые изменения в DOM-дереве, но не появлялось новых пользователей. Причем об этой ошибке я думал ещё вчера днём, хотел её исправить, но что-то отвлекло, а потом вылетело из головы. Снова пересборка crx-файла, снова выкладывание для Opera. И тут я захожу в чат и обнаруживаю, что пользователи не выделяются там. К счастью, этот вопрос решился быстро, но даже тут я не смог не сделать глупой ошибки: сначала для одного из классов забыл точку в селекторе. И вот только после этого я смог сказать «ну всё, вроде работает».
Так что сегодня у меня новый, совершенно внеплановый пуск! А еще это небольшая дополнительная опора личности (причем даже не само расширение как еще один пункт в списке моих проектов, а именно само знание, как их создавать). Ну и конечно же, избавление от того, что давно меня раздражало — заходить в чей-то профиль, и натыкаться на сообщение, что он закрыт.
Еще была мысль написать статью на Хабр, где подробно расписать весь процесс разработки и проблемы, которые я решал в процессе. Но ресурса на это уже нет: весь интерес к задаче выгорел еще сегодня утром, когда я решил проблему с CORS. Остальное доделывал уже на упорстве и принуждении себя. Эх, «проклятье трёх дней» по-прежнему действует…
А еще сегодня было лунное затмение. Увы, узнал о нём слишком поздно, и увидеть его не удалось. Зато ночью просто ненадолго вышел из дома и посмотрел на Луну и звёзды, послушал соловья. Это немного успокоило и стабилизировало эмоциональное состояние. Но быстро замёрз и вынужден был вернуться обратно.
Впрочем, в начале недели был момент, когда вроде бы начал выравнивать режим дня. Но увы, во вторник снова «сорвался», хоть и отключил Интернет рано вечером, всё равно засиделся до 5 утра, перечитыая «Драму на Ниобее» Сергея Снегова. (Хех, вот она, непредсказуемость потока жизни, которым меня вечно сносит: утром получил рассылку ЖЖ, в одном из комментариев упоминался этот автор, я решил поискать его в своем книжном архиве, и вот и результат…)
В среду проснулся поздно и был весьма недоволен этим фактом. Да и вообще, всё раздражало. По-прежнему было ощущение жуткой нехватки времени и увязания в болоте жизни: не было прогресса по своим задачам, во вторник накидали всякой фигни по freelance, да и погода сказывалась. К тому времени уже несколько дней подряд дожди шли почти непрерывно. У нас даже на участке начали грибы расти в огромных количествах, жаль только, что несъедобные. Вышел ненадолго в Сеть проверить сайты и глянуть обстановку на рынке. И вдруг понял, что всё раздражает. Решил отключить связь, и большую часть дня провёл в оффлайне. Удивительно, но это помогло: понемногу стало возвращаться ощущение внутренней целостности.
Увы, бессознательное сыграло со мной злую шутку. Оно полностью вытеснило то, что я пообещал Tellе выйти на связь в 22 часа (если бы не логи, которые могут врать, я бы и не поверил, что это было). Она кинула SMS, но её я тоже не увидел. И только где-то через час с небольшим, когда она прислала вторую, я вышел на связь. За это время она успела сильно «разогнаться» эмоционально, и ушло много времени на то, чтобы её успокоить.
Потом снова ушёл в оффлайн, поиграл немного в Ultima IX, завершил один из самых глючных побочных квестов. И наступил момент, когда все известные мне квесты выполнены, и главному герою приходит время отправляться в последний путь (в буквальном смысле этого слова) на остров Терфин. На этом я вышел из игры и уже подумывал было пойти спать, но тут случилось непредвиденное. Пока я днем сидел в оффлайне, у меня в голове снова возникала мысль о том, что хорошо бы сделать расширение для броузера, которое выделяло бы пользователей ВК с закрытым профилем. И вот в голове сложилась целостная картина, как это должно быть сделано.
Как писать расширения, я помнил очень смутно, поэтому для начала ограничился скриптом, который вставлял через консоль. Но на JavaScript я пишу мало и редко, поэтому долго провозился с отладкой. Причем большинство ошибок оказывались довольно глупыми. Самая частая, например, — это забыть об элементе верхнего уровня в присланном ответе, если он всего один, а пытаться сразу залезть в элемент следующего уровня. Из-за этого засиделся до 6 утра, а потом, когда всё заработало, еще не сразу мог уснуть из-за эмоционального подъема, который это вызвало.
Тем не менее, на следующий день проснулся даже раньше 12 часов. Естественно, состояние и работоспособность при этом были далеки от идеальных. Но тем не менее, я сел теперь уже за написание полноценного расширения. Сначала всё шло вроде бы хорошо: просто написал manifest.json, в котором прописал подключение уже написанного кода в качестве content script, сделал значки разных размеров и написал описание. Но затем решил немного всё облагородить, если так можно выразиться — вынести оформление выделенного пользователя в отдельный CSS-файл, учесть лимиты обращений к VK API, динамическую догрузку контента, сделать описание на русском и английском и т.п. Но со всем этим провозился еще несколько часов. В частности, очень надолго застрял при выносе стилей в CSS по очень глупой причине: забыл убрать кавычки вокруг значения свойства border. Из-за этого скрипт отрабатывал как надо, класс применялся, но внешне аватар пользователя никак не менялся. А из-за недосыпа была снижена внимательность, и долго не мог этого увидеть, ломая голову, что же идёт не так.
Настал момент, когда вроде бы всё заработало. Я решил отдохнуть и немного прогуляться по поселку, воспользовавшись тем, что в четверг потеплело. К этому времени как раз дождь кончился, и я отправился в путь. Идея гулять сразу после дождя оказалась очень удачной! Воздух был очень чист и прозрачен, на дороге оставалось еще много луж, в которых можно было рассматривать отражения облаков и деревьев, а на траве и кустах сирени — капли дождя. Я взял с собой фотоаппарат и отснял серию фотографий, которую так и назвал — «После дождя». Правда, выложил пока только в Instagram, где фото очень сильно уменьшаются и теряют в качестве. Но даже в таком виде фотографии очень понравились Tellе и goblincat.
Вечером вновь вернулся к работе над расширением. Стал готовить приложение к публикации, упаковал в CRX-файл. И тут меня ждала еще одна неожиданность. В какой-то момент регистрация в качестве разработчика на Chrome Store стала платной! Из-за этого пришлось отказаться от планов выложить расширение туда. К счастью, еще не всё прогнило в этом мире, и в аналогичном сервисе Opera можно выкладывать бесплатно. Но увы, у Opera пользователей гораздо меньше… Также решил выложить исходный код на GitHub. Но и тут без напрасных потерь времени не обошлось. При создании репозитория не указал, что не нужно его инициализировать файлами README и лицензией. Из-за этого никак не получалось синхронизировать его с локальным git-репозиторием. Так и пришлось удалить и создать заново пустой, и только после этого git push сработал.
Но тут меня ждала другая неприятность. Около полуночи расширение вдруг перестало работать, сначала в Opera, а потом и в Chrome. Стало выдавать ошибку, что fetch-запрос заблокирован. Писалось что-то про CORS. Я попытался было экспериментировать с режимами запроса или искать решение в Интернете, но к тому времени уже сильно хотелось спать и голова не соображала. На следующий день решение всё же нашлось. Оказалось, что совсем недавно произошло очередное ужесточение требований к безопасности: теперь из content-скриптов нельзя делать fetch-запросы вообще. Нужно выносить их в background worker. К счастью, там, где я это вычитал, приводился пример кода, который я смог быстро адаптировать для своих нужд. И вот, через несколько попыток расширение снова стало работать! Обрадовавшись, я побежал его пересобирать и выкладывать в Opera Addons. Но увы, попользовавшись им еще немного, обнаружил еще одну ошибку. Почему-то в списке участников группы оно правильно выделяло приватных пользователей только при первом заходе туда, а потом всё слетало. Ещё час, если не больше, я ломал над этим мозг. Потом причина ошибки обнаружилась: не вызывалась функция, отвечающая за само выделение аватаров, в том случае, если на странице добавлялись новые изменения в DOM-дереве, но не появлялось новых пользователей. Причем об этой ошибке я думал ещё вчера днём, хотел её исправить, но что-то отвлекло, а потом вылетело из головы. Снова пересборка crx-файла, снова выкладывание для Opera. И тут я захожу в чат и обнаруживаю, что пользователи не выделяются там. К счастью, этот вопрос решился быстро, но даже тут я не смог не сделать глупой ошибки: сначала для одного из классов забыл точку в селекторе. И вот только после этого я смог сказать «ну всё, вроде работает».
Так что сегодня у меня новый, совершенно внеплановый пуск! А еще это небольшая дополнительная опора личности (причем даже не само расширение как еще один пункт в списке моих проектов, а именно само знание, как их создавать). Ну и конечно же, избавление от того, что давно меня раздражало — заходить в чей-то профиль, и натыкаться на сообщение, что он закрыт.
Еще была мысль написать статью на Хабр, где подробно расписать весь процесс разработки и проблемы, которые я решал в процессе. Но ресурса на это уже нет: весь интерес к задаче выгорел еще сегодня утром, когда я решил проблему с CORS. Остальное доделывал уже на упорстве и принуждении себя. Эх, «проклятье трёх дней» по-прежнему действует…
А еще сегодня было лунное затмение. Увы, узнал о нём слишком поздно, и увидеть его не удалось. Зато ночью просто ненадолго вышел из дома и посмотрел на Луну и звёзды, послушал соловья. Это немного успокоило и стабилизировало эмоциональное состояние. Но быстро замёрз и вынужден был вернуться обратно.
Бесконечная осень возвращается
В субботу выдался всего один день, похожий на лето, а теперь снова вернулась бесконечная осень. Дождь идёт по полдня и даже больше. Из-за этого свелись почти к нулю все плюсы жизни на даче: на улице бываю минут пять в день максимум, да и на первый этаж спускаюсь редко и ненадолго. Вспоминаю, как когда-то, когда дом только покупали, думал, что вот буду сидеть в такие дни, созерцать в окно непогоду, и творить. Но увы, творить тоже толком не получается: в последние дни эффективность очень низкая. Почти доделал несколько пунктов из своего списка, но вот в этом состоянии «почти» они болтаются уже неделю, если не больше. В частности, никак не закончу 11-ую часть своей биографии. То ли снова спад по интеллектуальному биоритму, то ли безвылазное сидение дома так влияет, то ли просто от холода голова не работает. Зато вроде бы растолкал freelance-задачи (впрочем, сегодня еще не выходил в Интернет, когда выйду, может оказаться, что накидали новых).
И ещё нормализовалось время сна. В первые дни после приезда спал по 10—11 часов, сейчас перешел на обычные 8—9. А сегодня, внезапно, проснулся в 10:30 — очень рано по своим нынешним меркам. А также начал смотреть видео по буддистским практикам, которое прислал сэр Мик.
И ещё нормализовалось время сна. В первые дни после приезда спал по 10—11 часов, сейчас перешел на обычные 8—9. А сегодня, внезапно, проснулся в 10:30 — очень рано по своим нынешним меркам. А также начал смотреть видео по буддистским практикам, которое прислал сэр Мик.
Страницы:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141