Каникулы 2016

21 февраля 2016

В этом году на зимних каникулах я был долго. Летом я участвовал в Google Summer of Code, а потому пять дней в неделю работал по 8 часов (и еще немного по выходным). Да, я много спал, поздно ложился и в принципе мог себе позволить ничего не делать — собственно, я прошел GTA V и третьего Ведьмака — но это не было похоже на обычные трехмесячные летние каникулы, поскольку нужно было работать. На новогодние же каникулы я отправился 27-го декабря, когда сдал досрочно один из экзаменов. Еще по трем я получил автомат, и только один экзамен нужно было сдать — он был 27-го января. Семестр начался 8-го февраля, так что я был дома больше месяца.

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

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

Длинные волосы, лол.

После нового года я снова сходил на новую часть Звездных войн. Мама больше любит 2D-сеансы, а я уже видел фильм в IMAX в Новосибирске, поэтому мы собирались не тратиться на билеты и посмотреть в 2D, но мама позвала подругу, которая принципиально «ходит на такие фильмы в IMAX». Так что я посмотрел седьмой эпизод в IMAX еще раз и еще раз убедился, что фильм заслуживает 10/10.


Если вы вдруг следите за блогом, то, возможно, помните, что в прошлом году я проходил Dragon Age: Origins. Я вернулся к своим сейвам (которые я, конечно, скопировал, но так и не использовал) и решил продолжить прохождение.

В какой-то момент (я уже прошел Dragon Age 2, но еще не начал следующую часть) я вспомнил про оставшийся у меня старый системник, в котором не хватало разве что жесткого диска да дополнительной планки оперативки, и телевизор на стене моей комнаты. Взял HDMI-кабель, Live USB с Ubuntu — и убедился, что идея нормально сработает. Купил жесткий диск, оперативку, беспроводные клавиатуру и мышь и получилась такая себе приставочка для телевизора, за которой можно спокойно работать с помощью клавиатуры (или спокойно играть, если купить геймпад).

Геймпада у меня не было, поэтому пришлось проходить Dragon Age: Inquisition без него — с беспроводной клавиатурой на ногах и мышью на табуретке неподалеку.


Еще на каникулах я сходил на «Выжившего» и «Омерзительную восьмерку». Первый смотрел с семьей, на второй сходил один. Хотя «Выживший» снят неплохо, каких-то ярких воспоминаний насчет него у меня не осталось. «Омерзительная восьмерка», напротив, мне очень сильно понравилась. Фильм уже давно шел в кинотеатрах, некоторые мои друзья уже его посмотрели, и я знал, что это трехчасовый фильм Тарантино. Я не являюсь большим фанатом Тарантино, поэтому каких-то завышенных ожиданий у меня не было — я вообще ожидал увидеть какой-то «затянутый» трешак.

Я купил билет на утренний сеанс, взял по небольшому стаканчику попкорна и Pepsi и отправился в зал. Людей было немного. С первых минут фильм мне показался каким-то очень уютным. Хорошая музыка во вступительных титрах, симпатичные снежные пейзажи. На самом деле действие фильма почти полностью проходит в такой небольшой таверне. Персонажи ходят по ней, разговаривают, занимаются какими-то своими делами. Все идет неспешно, но кажется не затянутым, а как раз естественным. Сюжет преподносит зрителям некоторые вопросы, и не торопится на них отвечать. Это напоминает чтение интересной книги — можно поразмышлять, кто мог сделать то или это, подумать, в чем был мотив или есть ли у персонажа алиби. В общем, неожиданно для меня фильм оказался одним из самых интересных фильмов, что я смотрел, и попал в список любимых фильмов.


Кроме игр и фильмов у меня еще были комиксы. Я иногда по неизвестным причинам прекращаю их читать, а иногда опять начинаю. Чтобы читать современные комиксы по мере их выхода, я хочу сначала прочитать все вышедшие до этого. Для этого я давно по-быстрому собрал на GameMaker приложение, которое хранит базу комиксов одним ini-файлом и отображает её в окне, где можно отмечать комиксы как прочитанные и удалять ненужные. Из этого же приложения в один клик можно открывать комикс, чтобы начать его читать.

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

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


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

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

Кстати, по поводу Google Summer of Code, о котором я упомянул в начале поста. Я недавно решил проверить, не опубликовали ли уже список участвующих в этом году компаний, и наткнулся на запись в блоге, в которой LabLua упомянули меня и в двух абзацах описали мой проект.

KrasCTF 2015 / The Devil

21 октября 2015

Мы тут нашей командой по CTF ездили в Красноярск, на KrasCTF 2015. В ту сторону поезд был весь такой мягкий и с розетками в каждом купе, мы даже достали роутер и поиграли в CTF в Teeworlds. Еду с собой в поезд никто не взял, а поскольку сразу после прибытия нас встретили организаторы и повезли на экскурсию, поесть мы нигде не успели.

С площадки «Царь-рыба» командам показали Енисей и сделали много фотографий. В Красноярске немного холоднее, чем в Новосибирске, но можно было не замерзнуть и в одной куртке без кофты.

Затем мы направились в общежитие. В этот раз мы жили не в 25-этажной общаге с роскошными комнатами и видом на СФУ, а в подвале девятиэтажки. Комната на пять человек, с раздельным санузлом, ванной и стиралкой, кухней с холодильником и микроволновкой и двумя телевизорами — в целом, даже больше, чем в прошлом году. Мы заказали пиццу, поиграли в Teeworlds и Worms, а потом легли высыпаться перед днем соревнований.

С утра опять оказалось, что никто не задумался о завтраке, поэтому мы по-быстрому сходили в небольшой магазинчик, позавтракали и поехали к месту проведения соревнований. В целом все шло так же, как и в прошлый раз — жеребьёвка аудиторий между капитанами, а потом занятие этих аудиторий командами. Правда, в этот раз нам досталась аудитория без большого общего стола, и пришлось сидеть за маленькими отдельными. Выпечки в этот раз было заметно больше, и она не только не закончилась через час, как в прошлый раз, а даже осталась к концу соревнований.

Задания были интересными, хотя новая категория Juristic не относится к CTF в принципе, а Joy был какой-то странный: отжимания, нерешаемый кроссворд и стеганография в реконе. После соревнований произошло награждение — дипломами, флешками и записными книжками, а также кубком за первое место. Потом мы пообщались с разработчиком заданий категории Web и отправились в общежитие. Вскоре оказалось, что организаторы приглашают всех в PEOPLE’S. Без капитана команды мы съездили, посидели, собрали самый большой стол в истории заведения и сфоткались на самодельную селфи-швабру. В общаге мы скоротали остатки вечера за Hedgewars и легли спать.

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


Возвращаясь с вокзала, я заметил новое извещение на вахте общежития. Мне наконец-то пришла посылка — новый альбом Blue Stahli с крутейшей футболкой, постером и стикерами. Отправленная 1 октября из Чикаго (куда она добиралась из Бурлингтона), она пришла в Новосибирск 10 октября (судя по отметке на извещении), но известили меня об этом ещё через десять дней.

А ещё кто-то заказал M, потому что и раньше заказывал через интернет футболки такого размера, и потому пополнил свою коллекцию футболок не по размеру. Ну хотя бы не маленькая.

Bootstrap@TLab

1 августа 2015

Мне как-то было нечем заняться на выходных, и на глаза попался старый сайт TLab. Я давно хотел что-нибудь там обновить, но не особо знал, что именно. Обновить, конечно, можно много чего, но начать я решил с сайта.

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

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

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

Поскольку все эти одностраничные сайты у меня ассоциировались с плавной прокруткой между экранами, я решил все же добавить такую и себе. Поэтому на главной появился второй экран — с «описанием» TLab. Этим я заменил отдельную страницу, которую все равно вряд ли кто-то посещал.

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

Поскольку подходящей крупной пикчи у меня не было, а старую ставить как-то не хотелось, вспомнилась мне другая штука. Это подстраивающийся под размер страницы canvas, на котором отрисовывается треугольная сеточка, а по самому центру — заготовленная картинка-треугольник. Я немного подредактировал код, и теперь вместо старой ограниченной в размерах jpg-картинки у меня был адаптивный canvas, градиент на котором подбирается по размеру страницы, а потому и выглядит неплохо. Он-то и используется в качестве фона на страницах сайта.

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

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

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

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

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

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

Внешний вид сайта особо не изменялся с 2012 года — вот как он выглядел тогда:

Nuit du Hack 2k15

2 июля 2015

Вместо экзамена по физике на этой сессии я был в составе нашей университетской команды по CTF в Париже на финале Nuit du Hack. К слову, это мой первый в жизни перелет и ранее далее Новосибирска я никуда не выбирался. Пилот этого самолета оказался самым приветливым, и даже хотел устроить «экскурсию», показывая пассажирам города, над которыми мы пролетаем. Правда, ничего у него не вышло, потому что большинство пассажиров спали, но он по крайней мере старался. В Москве мы разве что взяли немного евро в банке, и полетели дальше.

В аэропорту Парижа нас встретила первая неприятность — автоматы для покупки билетов на RER. Они, во-первых, не принимали наличные, а, во-вторых, карты некоторых из нас. К тому же мы не совсем были уверены, в какую там зону нам надо, и затруднялись с выбором нужной станции. К слову, запах на станциях у них не сильно приятный, да и внешне мне новосибирское метро как-то больше нравится. Зато есть прикольные двухэтажные поезда. На станции, на которой мы собрались пересаживаться, мы не смогли найти автомат, и обратились в справочную, где на наши вопросы на английском нам отвечали по-французски и показывали в сторону выхода. Этот автомат был уже чуть более приветлив, и не отказывался от наличных, поэтому мы купили билеты и отправились к отелю.

Отель не был особо удивительным, разве что карта-ключ для комнаты показалась мне необычной. Комната была небольшой, но с мягкими кроватями-подушками. Расположившись, мы сходили в замеченный неподалеку McDonald’s, а потом отправились гулять по окрестностям. Найденный на карте замок был закрыт на реставрацию, а больше ничего особенного в округе и не было.

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

На следующий день мы отправились в центр, пофоткаться у достопримечательностей. На станции мы взяли универсальный билет во все пять зон на два дня. Как сказал нам местный француз, «It’s quite expensive» — 37 евро или около того. Зато по этому билету можно было ездить хоть на RER, хоть на метро, а не покупать билеты на станции каждый раз.

Когда мы фотографировали небольшой фонтанчик, к нам подоспели цыгане. Сначала я отказывался от подачи «глухонемым», но потом решил, что пять-то центов занести можно. Когда я достал кошелек, одна из цыганок вырвала тысячу рублей и удалилась в неизвестном направлении. Евро, кстати, не пытались вырывать. Проходящий мимо чернокожий парень пытался нам показать, что связываться с ними не надо, но было уже поздно.

Мы шли в сторону Лувра вдоль какой-то реки, а на тротуаре продавали различные сувениры — брелки, магниты, картины, страницы из комиксов, тарелки и все такое. Я, кстати, сбегал в один книжный магазин, но не заметил там комиксов.

На Эйфелеву башню мы подниматься не стали, поскольку там были довольно большие очереди, но рядом пофотографировались. Позабавило, что некоторые из продающих всякие сувениры «чернокнижников» даже знают немного по-русски.

Завершив свой небольшой тур по достопримечательностям, мы сели на RER и поехали туда, где должны были пройти соревнования. На этой станции турникеты были закрыты решёткой, а сбоку была открыта калитка. Район казался каким-то заброшенным, поскольку там было очень мало прохожих, а большинство магазинов и кафе были закрытыми. Мы попытались найти хоть какое-нибудь место, в котором можно было бы поесть, но они были либо какими-то непривлекательными, либо закрытыми. Поэтому мы дошли до McDonald’s, и снова поели в нем.

Потом мы добрались до места проведения соревнований. Оставалась ещё пара часов до начала, все футболки и другой стафф уже были раскуплены (разве что были наклейки). Мы походили по зонам, в которых проходили разные мероприятия в рамках евента, и сели дожидаться начала в каком-то клубе, где организаторы играли друг с другом в настольный футбол. Когда мы пошли в здание, выделенное для CTF, большинство команд уже расположились там. В общем-то, мы успели только подключить ноутбуки, когда организаторы выгнали всех — одна из команд получила доступ к заданиям и машинам других участников, в то время как некоторые другие команды не имели доступа к собственной сети. Игру отложили на час, а для нас сготовили барбекю. Через час, правда, ничего они не починили, поэтому вместо Attack/Defense (который они называли Private CTF) они просто дали всем доступ к проходившему здесь же Jeopardy (Public CTF).

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

Уставшие, мы вернулись в отель и поспали несколько часов перед вылетом. Когда ехали в аэропорт на RER’е, в наш вагон зашли музыканты и играли, пока мы не доехали. Перелёт в Москву был довольно удачным — мне не сильно хотелось спать, сидел у окна, было светло, покормили вкусно. Успел повторить теорию вероятностей. Во время перелёта в Новосибирск уже стал засыпать, и вернувшись в общагу утром, лег подремать, а проснулся уже вечером.

Тервер я подготовил не очень, физику сдавал на самой дальней пересдаче, 30 июня, но нормально разобраться тоже не смог. Сессию закрыл и вернулся в Новокузнецк вместе со своим стационарным компом. Теперь можно спокойно работать над своим Google Summer of Code проектом, а остаток времени провести за компьютерными играми.

Spider Player Addon

12 апреля 2015

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

Недавно я слушал в Spider Player какой-то трек, и в его названии был слэш. В плеере в качестве названия отображалось то, что было после этого слэша, и я решил проверить, всегда ли это происходит. Оказалось, что плеер не слишком умно парсит имя файла из ссылки, и берёт просто всё от последнего слэша в строке до конца. Поэтому я быстренько изменил утилиту так, чтобы добавлялось не просто название трека, но ещё и слэш перед ним, и таким образом получил приличный вид названий для треков из vk. Добавил ещё длину трека, чтобы выглядело совсем как прослушивание треков оффлайн.

Кроме того, я поискал Spider Player по Github, и нашёл один-единственный репозиторий, в котором был веб-интерфейс для плеера на Meteor. Я никогда не пользовался веб-интерфейсом Spider Player, потому что не знал, что он вообще у него есть. Оказывается, можно сделать так, чтобы плеер выдавал инфу о своём состоянии и реагировал на простые команды по http. Сначала я побаловался с Meteor-версией, но потом решил пойти дальше.

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

Оно также добавляет кнопочку, которая открывает небольшое окошко с минималистической версией плеера (да, только кнопка Play/Pause, но я всё равно даже ею не пользуюсь).

Но самое главное — оно добавляет в контекстное меню браузера возможность быстро добавить треки в плейлист. Если нажать правой кнопкой по ссылке на пост vk или если нажать правую кнопку на странице самого поста, то в менюшке будет пункт «Добавить в Spider Player». При этом расширение создаёт временный txt-файл для моей утилиты и небольшой bat-скрипт, который делает всё необходимое. Потом она запускает этот скрипт, скрипт запускает утилиту на Java и передаёт сгенерированный плейлист плееру. Всё это работает пару секунд, и при этом не требует правки файла и запуска утилиты скриптиком вручную.

Единственный недостаток варианта с веб-интерфейсом, правда, заключается в том, что он отваливается примерно каждый час, и поэтому стильные подсказки прекращают появляться. Возможности перезапустить его автоматически, кажется, нет. Алсо, подсказочка привязана к браузеру, поэтому при переключении в другие приложения её не видно. Может быть я найду способ исправить и это.

P.S. Я ещё не придумал название, поэтому не выкладываю никуда. К тому же, кто вообще им будет пользоваться?

1 2 3 4 5