Редакция [dikmax’s blog] приветствует тебя, %username%!

Самое интересное: Путешествие по Европе в картинках, Осло, Рига, ООП в JavaScript.

Вильнюс

Гостевой пост. Текст написан любимым корректором.

В Вильнюсе мы были уже несколько раз, но почему‑то до сих пор не написали о нём. А тут такое везение: можно и даже нужно пожить в древней столице почти неделю!

Исторически сложилось, что Вильнюс для наших людей — соседний город, вовсе и не заграница. Много лет мы были единым народом, одной страной. Белорусские дети учат в школе историю возникновения стольного града, годы жизни и правления великих князей, которых литовцы считают своими. Долгое время Вильнюс был центром белорусской мысли и белорусской культуры: здесь жили или просто бывали Адам Мицкевич (который в Польше поляк, а в Беларуси — белорус), Янка Купала, Бронислав Тарашкевич и многие, многие другие светочи, деятели и так далее. Вильня была негласной белорусской столицей, городом вольнодумства и борьбы за независимость…

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

fig:Какой-то костёл

Какой-то костёл

Я постараюсь не слишком длинно и занудно описать свои ощущения и впечатления от города и людей.

1. Home made house

fig:Home made house

Home made house

Ребята, это мегаместо! Словами не описать, насколько там здорово. Чесслово! Начнём с того, что хостел расположен в самом центре города: от вокзала минут семь неспешным шагом, до ратуши таким же променадом минут пять. Но при этом он спрятался во дворе, поэтому шум улицы сюда не доходит. Дом маленький, хоть и трехэтажный. Вернее как: третий этаж — это мансарда, т. е. по‑нашенски — чердак. Рассчитан этот хостел всего на 12 постояльцев. Хозяйка Лина — милейшее создание, она всегда расскажет, что посмотреть, куда сходить‑съездить, что попробовать, даст карту города и расписание автобусов‑поездов. Она же готовит завтраки, а под настроение может ещё и ужин состряпать. Вечерами постояльцы собираются внизу на кухне, болтают о жизни и путешествиях, рассказывают о родных странах, пьют вино, которым рада угощать хозяйка, играют в настолки, коих здесь предостаточно. Отличное, душевное, уютное место. Даже скрипучие лестница и двери совершенно не портят впечатление. Рекомендую всем!

fig:Вид из окна

Вид из окна

2. Тракай

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

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

fig:Стенд

Стенд

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

Нужно сказать, что все главные достопримечательности расположены очень удобно: вдоль центральной улицы. Идёшь себе вперёд, в нужном месте голову повернул — на тебе церковь, чуть дальше прошёл — старое здание почты. Лишь пару раз я немного сворачивала в сторону. Кстати, карта как таковая в Тракае не нужна: помимо стенда на автовокзале, точно такие же стоят по всему городку вблизи уже упомянутых достопримечательностей. То есть если видишь на дороге стенд с картой, значит поблизости что‑то есть. Крайне продуманно.

fig:Улица

Улица

Вот правда из того «многообразия», которое предлагала карта, посмотреть удалось немногое. Все церкви и костёлы на моем пути оказались закрыты, пришлось довольствоваться видом снаружи.

fig:Вид снаружи

Вид снаружи

Зато удалось попасть в несколько музеев. Сначала это был полуостровной замок, превращённый, если не изменяет память, в исторический музей с довольно скудной экспозицией, состоящей из церковной утвари, икон, колоколов и пожалуй всё. Следом я заглянула в не менее миниатюрный караимский музей. Караимы — отдельная народность, близкая к крымским татарам. Пришли на территорию Литвы ещё при Витовте, да так и осели. Кстати, несмотря на небольшое количество ныне живущих в Тракае представителей этого народа, создаётся впечатление, что город насквозь караимский: всюду вывески кафе и закусочных, предлагающих кибины (или кибинай) — караимские пирожки — и прочие национальные блюда. Музей, о котором я писала выше, представляет собой три крохотные комнатки, заполненные в основном различными документами и фотографиями. Лишь в центральной можно посмотреть на предметы быта, одежду и оружие караимов. Ах да, приятный бонус: если до этого вы уже побывали в Тракайском замке, билет в караимский музей можно приобрести за полцены!

И вот наконец главная цель этой вылазки — Тракайский замок. Собственно замков‑то здесь два: полуостровной, о котором я уже говорила, и островной, более известный и раскрученный. Даже в ненастную погоду он впечатляет.

fig:Тракайский замок

Тракайский замок

fig:Тракайский замок

Тракайский замок

Уж его‑то можно рассмотреть со всех сторон: с берега, ловя отражение в озере, с деревянных мостиков, ведущих через ещё один островок к самому замку, можно обойти вокруг него, что тоже небезынтересно, ну и, конечно, можно зайти внутрь. Билет стоит что‑то около 15 лит — недёшево, но никуда не денешься. Замок сам, конечно, отреставрирован (кстати, его реставрации посвящена отдельная экспозиция), потому как ещё в начале ХХ века он представлял собой унылое скопище камней и кирпича. О степени близости к оригиналу судить не берусь, но пластиковых окон, как в Мирском замке, здесь точно нет. Выставка довольно интересная, хотя пресыщенным туристам она может показаться бедноватой. Описывать что‑то и пересказывать своими словами — неблагодарное дело, поэтому скажу только, что посетить замок стоит.

fig:Деревянная мостовая

Деревянная мостовая

Собственно, это практически последняя достопримечательность. Летом можно погулять по близлежащим островкам или взять лодку, чтобы прокатиться по озеру. В марте по заледеневшему озеру кататься затруднительно, да и раскисшие от талого снега тропинки как‑то не прельщают. Поэтому я лишь дошла до рекомендованной в путеводителе кафешки, преодолев ещё около километра по главной дороге. Ну что вам сказать: да, кибины вкусные, пиво тоже достойное, но думаю, что в остальных заведениях, сплошь и рядом встречающихся по дороге, я нашла бы примерно те же меню и цены. А вот куда точно стоит заглянуть — Home lunch cafe. Оно располагается чуть левее моста, ведущего на замковый остров. Милый полувосточный‑полудеревенский интерьер, креативное и ироничное наружное оформление и хозяева в национальных костюмах (предположительно караимских) и с чувством юмора — за всё это удовольствие приготовьтесь раскошелиться: чашечка кофе стоит здесь 9 лит (в Вильнюсе 3–4 лита), обед, состоящий из супа, пирожка‑кибина и напитка — 28 лит. Остальные пункты меню не смотрела.

fig:В 1954 году в этом доме ничего не произошло

В 1954 году в этом доме ничего не произошло

fig:На тарелочке: «Вручную собранные в нашем секретном месте в лесу грибы»

На тарелочке: «Вручную собранные в нашем секретном месте в лесу грибы»

3. Собственно, Вильнюс

Нагулялась я по нему столько, что могу уже экскурсии водить. Что, кстати, и сделала в субботу, когда приехал милый с друзьями. В программе любого туриста в Вильнюсе есть обязательные пункты: Ворота Зари (Острая Брама) с расположенной над ними часовней, в которой находится знаменитая (как утверждает путеводитель) Вильнюсская Мадонна; Вильнюсский университет вкупе с расположенным на его территории костёлом Святых Иоаннов; дворец великих князей литовских (способ ещё раз повторить историю ВКЛ); башня Гедимина на Замковой горе; гора Трех крестов, с которой открывается наилучший, на мой взгляд, вид на город; ажурный, воздушный и совершенно прекрасный костёл Святой Анны, который в свое время Наполеон Бонапарт мечтал перевезти в Париж; район Ужупис, прослывший местным Монмартром за обилие художественных галерей и большого скопления проживающей здесь творческой интеллигенции; музей жертв геноцида (ещё его называют музеем КГБ). Ну и просто улицы Старого города.

fig:Экскурсия

Экскурсия

Часовня Острой Брамы очень маленькая, но такая милая. Впервые я побывала там в будний день, застав только двух молящихся женщин. Было неловко и стыдно за скрипящий под моими ногами пол, настолько не хотелось нарушать тишину и умиротворение этого места. Второй же раз я попала в часовню в рамках организованной мною мини‑экскурсии. От тишины не осталось и следа. Молящихся на коленях возле иконы людей чуть ли не затаптывали толпы туристов. Отвратительное зрелище, должна я вам сказать. Поэтому если есть возможность, посетите Ворота Зари и расположенный рядом костёл святой Терезы в будни. Правда есть вероятность попасть на имшу, как я, и толком ничего не разглядеть, но, как правило, расписание всех служб висит рядом со входом, можно с ним ознакомиться и выбрать лучшее время.

fig:Ворота Зари

Ворота Зари

fig:Остробрамская икона Божией Матери

Остробрамская икона Божией Матери

fig:Серебряные таблички, которые просящие приносят в благодарность за чудо

Серебряные таблички, которые просящие приносят в благодарность за чудо

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

fig:Костёл Святых Иоаннов

Костёл Святых Иоаннов

Дворец великих князей — часть замкового комплекса, в который входила и башня Гедимина на горе. Собственно башня относилась к Верхнему замку, а дворец — к Нижнему. К нему примыкает Кафедральный собор, вход в который я не нашла, и колокольня, бывшая, судя по макетам, частью оборонительной крепостной стены.

fig:Кафедральный собор

Кафедральный собор

fig:Колокольня Кафедрального собора

Колокольня Кафедрального собора

Билет во дворец стоит 10 лит, и я хочу сказать, что это небольшие деньги за такую богатую экспозицию. Начинается экскурсия с подвалов дворца: законсервированной старой кладки. Везде подписано, что за помещение, какое крыло это было. По мостикам‑настилам вы переходите в основные залы, где рассказывается вся история Литвы, начиная, кажется, от Миндовга, а то и раньше. Музей занимает 3 или 4 этажа, чем выше — тем более поздний век. Можно не просто повторить школьную программу истории, но и узнать много нового. Ну и посмотреть на быт князей и королей. Умилило меня их пристрастие к изразцовым печкам, которые находились практически в каждом помещении (что, в принципе, разумно при отсутствии центрального отопления), и вот таким резным не то комодам, не то буфетам.

fig:Деревянное нечто

Деревянное нечто

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

fig:Башня Гедимина

Башня Гедимина

fig:Вид на город

Вид на город

Если уж вы дошли до горы Гедимина, то нужно обязательно подняться и на гору Трех Крестов. Она гораздо выше первой и виды с неё ещё более живописные и захватывающие. Да и сами кресты довольно фотогеничны, особенно в ясный день, когда они ослепляют своей белизной на фоне синего неба. На гору можно попасть с набережной по дороге, а можно не искать лёгких путей и пойти вдоль речушки через парк и взобраться по довольно крутой деревянной лесенке.

fig:Вид на башню Гедимина

Вид на башню Гедимина

fig:Ещё вид на город

Ещё вид на город

Костёл Святой Анны, как я уже писала, сильно хотел прибрать к рукам Наполеон наш Бонапарт. И немудрено: храм удивительно красив, даже не верится, что можно было создать такое кружево из камня и кирпича. Внутри он очень маленький и не такой впечатляющий, так что любуйтесь с улицы.

fig:Костёл Святой Анны

Костёл Святой Анны

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

fig:Дом в Ужуписе

Дом в Ужуписе

Местные объявили свое Заречье независимой республикой, написали конституцию, придумали себе деньги, гимн и прочие атрибуты независимого государства. Правда, Литва признавать эту крошечную республику не спешит, что не мешает жителям Ужуписа выбирать собственного президента и засылать послов и консулов в реально существующие страны. Нужно сказать, что просто бродить по улицам района довольно уныло, потому как власти, такое ощущение, махнули рукой на исторические здания. Но здесь полно мелких арт‑галерей, говорят, часто проводятся перформансы и прочие движухи. А ещё если пойти по правой от центральной площади улице, то можно набрести на бернардинское кладбище. Оно выглядит заброшенным, хотя и есть здесь несколько захоронений 2000‑х годов.

Музей жертв геноцида — так называемый must see. Посвящён он в основном советской оккупации Литвы и расположен в здании, ранее занимаемом Комитетом государственной безопасности, потому в народе зовётся музеем КГБ. Хотя часть экспозиции рассказывает и о фашистском режиме во время войны. Выставка богатая, это не только документы, фотографии, предметы быта, но и документальные фильмы, кадры кинохроники (кстати, во время демонстрации документалки о захвате Литвы фашистской Германией на фоне звучит «Имперский марш», что как бы намекает…). Если не будет лень читать описание экспозиции на английском, можно узнать много нового из истории страны. Например, что партизанское движение против советской власти сохранялось в Литве чуть ли не до 70‑х годов. Не просто кухонные протесты: люди действительно жили в лесах и воевали с регулярной советской армией. Но наибольшее впечатление производят подвалы, которые КГБ использовало как тюрьму. Несмотря на толпы туристов, здесь довольно жутко, а череда одинаковых унылых камер создаёт гнетущее ощущение. В этом же здании, но в другом крыле были пыточные и комната казни, процесс которой наглядно продемонстрирован в видеоролике (его показывают в этой самой комнате). Особо чувствительным и впечатлительным лучше туда не заглядывать.

fig:Телефон

Телефон

4. Казюкас

На самом деле Казюкас был основной целью нашего путешествия. Мы совершенно случайно попали на эту ярмарку год назад и загорелись приехать снова. Что такое Казюкас? Это несколько километров веселья, музыки, ярких красок и вкусностей, потому что именно этим праздником литовцы прощаются с зимой и вступают в период поста. А ещё это жуткая толпа. На главных улицах она была настолько плотной, что просто несла нас, практически не давая возможности остановиться у понравившегося лотка. Можно, конечно, обходить по относительно свободным тротуарам, но так пропускаешь всё самое интересное. И всё‑таки Казюкас стоит того, чтобы на него посмотреть хоть разок. А уж если посмотрел, то тебе непременно захочется что‑нибудь купить. Вот этот сыр. И ещё суджук. И два метра мелких колбасок. И ещё серёжечки, они ведь такие миленькие. И пару открыток. И копчёную рыбку. И вон тот маковый рогалик. И снова колбасы. А можно ещё вот эту деревянную хрень? И пирожок. В итоге я готовилась при таможенном досмотре честно сознаваться в вывозе половины Казюкаса, но никто не спросил.

fig:Толпа

Толпа

fig:Карета

Карета

fig:Огромный стул

Огромный стул

fig:Индеец

Индеец

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

5. Ставший уже традиционным забег по барам

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

  1. Alchemikas. Название каг бэ намекает: тут будут намешивать. Это действительно коктейль бар с очень широким выбором и профессиональными барменами. Помещение небольшое, советую садиться за стойку, если получится: процесс смешивания коктейлей действительно напоминает колдовство. Однако стоит заметить, что цены здесь одни из самых высоких.

  2. Berlin. Находится по‑соседству с первым. Мало что могу сказать об этом заведении кроме того, что мне там не понравилось: оглушительно громкая музыка, отсутствие прослеживаемой концепции в оформлении и тематике (почему вдруг «Берлин»?), липкая барная стойка. В общем, не впечатлило. Поэтому зарядили B‑52 и погнали дальше.

  3. Jackie bar. Просто заворачиваешь за угол и проходишь чуть‑чуть. Отличное место! Название свое получил от виски Jack Daniels, которому, собственно, и посвящён. Здесь шикарный выбор этого напитка и даже коктейли на его основе. Уж как я не люблю виски и ему подобное, но Cranberry Jackie оценила. Ещё тут отличная музыка, причём от ди‑джея, втиснутого ввиду малого места в самый уголок бара. Можно было бы на этом остановиться, хорошо ведь, душевно, но стало просто интересно, что же в Вильнюсе есть ещё.

    fig:Бутылка виски

    Бутылка виски

    fig:Часть содержимого из бутылки

    Часть содержимого из бутылки

  4. La birra. Ребята, тут отменные горячие чипсы! Они их сами готовят, но это не просто жаренная картошка, а именно чипсы: хрустящие, очень картофельные и горячие. Ммм, как вспомню… Насколько мы поняли, La birra — паб со спортивным уклоном. Он двухэтажный, только вот второй этаж в подвале. Там бар да и само помещение побольше, людей, соответственно, погуще. Поэтому мы остались на первом этаже смотреть в спокойной обстановке Формулу 1. Одна из стен превращена в мини‑музей национальных валют. Мы пожертвовали купюру в тысячу белорусских рублей, на что бармен сказал, что это мало: на стенке уже висит десятитысячная банкнота. Так что если захотите оставить на этой стене свою память о Беларуси, готовьте двадцатку.

    fig:Местные ребята

    Местные ребята

  5. Bar Bazzar. Это место было бы, наверное, непримечательным, если бы не бармен. Сначала мы просто нырнули под очередную вывеску, увидели практически пустое помещение и почти собрались уходить. И тут на глаза попались они — усы бармена (Дали заявил бы о плагиате). Грех не полюбоваться на такое чудо под стаканчик чего‑нибудь вкусного, к тому же здесь кроме выпивки подаются горячие сэндвичи (рекомендуем с тунцом).

  6. Lizarran. Сюда мы пришли уже ближе к закрытию, людей было очень мало. Мой организм категорически отказывался пить столько алкоголя в таких темпах, поэтому я заказала кофе (обычный, не выдающийся, всё‑таки это бар, а не кофейня). Собственно, здесь мы сидели недолго, удалось только рассмотреть стену, декорированную названиями городов: не то тех, где есть бары Lizarran, не то просто любимых хозяевами заведения.

  7. Soul box. Мы уже было повернули домой и даже прошли немного в том направлении, но на пути увидели вывеску Soul box. Об этом баре, по ночам превращающемся ещё и в клуб, я читала в путеводителе Lonely Planet, поэтому стало интересно, чем же он привлёк авторов. Скажу честно, что большой движухи внутри мы не заметили, может, было ещё слишком рано. Но вот коктейль Doobadoo был действительно то, что доктор прописал в этот конкретный момент: свежий, фруктово‑ягодный, чем‑то похожий на морс, но всё‑таки алкогольный. Одним словом, рекомендую.

  8. Hesburger. А куда ж без него? Есть‑то хочется, несмотря на чипсы и сэндвич (когда они были‑то?). Находится недалеко от ратуши и, соответственно, нашего хостела.

  9. Tappo d’oro. Вот теперь мы совершенно точно собирались домой, благо немного осталось. И тут я услышала музыку, доносившуюся из распахнутых дверей бара. Меня почему‑то не смутила куча стоящих на улице людей, поэтому под моё «Пшли суда!» мы затолкали себя внутрь. Именно что затолкали, потому что народу было тьма как в небольшом коридорчике, так и в самом баре. Что вам про него рассказать? Про выбор напитков не берусь судить: меню мы в глаза не видели, заказали «из головы». Музыка заводная, это да, только вот потанцевать в такой толпе вряд ли удастся. Кстати, здесь принимают только наличку, благодаря чему мы маленько сэкономили: у девушки не было мелкой сдачи с двадцатки, поэтому она простила нам 2 лита.

После этого мы приняли окончательное и бесповоротное решение ползти в хостел: алкоголь больше не лез в наши измученные организмы, а ноги отказывались идти куда‑то, кроме как в постель. Поход по всем 9‑ти местам занял у нас от силы 4 часа. И наутро, как вы понимаете, было уже не до веселья.

Наблюдения: коктейли в среднем стоят 12–15 лит, только в Alchemikas большинство — 22 лита. Самый вкусный виски — где бы вы думали? — в Jackie bar (это на вкус милого, по мне так всё — гадость). В каждом втором баре стоит настольный футбол. Пожалуй, это всё, что я запомнила из прошедшей ночи.

Ребятки, Вильнюс многогранен и многослоен, он не ограничивается только старым городом, да и вокруг него полно красивых и исторически ценных мест. Очень надеюсь, что в будущем ещё не раз я приеду сюда, дабы осмотреть очередной кусочек нашей старой столицы. А пока конец.

Планировщик маршрутов v2.0

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

  1. Самое главное, самое сложное и самое незаметное: поменялся алгоритм поиска. Вместо точного и медленного метода ветвей и границ теперь почти точный и метаэвристичекий метод муравьиной колонии. В основе проекта лежит Travelling Salesman Problem (Задача коммивояжёра), которая является NP‑полной. А это означает, что нет другого пути решения её, кроме как перебрать все варианты. Количество вариантов можно посчитать по формуле \(n! \over 2\), где \(n\) — количество промежуточных городов. Если подставить в эту формулу, например, 15 получим 653 837 184 000 вариантов, а это уже очень много. Поэтому пришлось воспользоваться приближенным алгоритмом, который работает быстро, но и решение выдаёт не всегда оптимальное. Кстати, так как внутри алгоритма задействован генератор случайных чисел, решение может меняться от запуска к запуску, достаточно нажать кнопку обновить.

  2. Я убрал из проекта AngularDart, что позволило уменьшить размер JavaScript‑файла в 3 раза.

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

  4. Упростилось добавление городов в маршрут. Из вариантов объектов теперь убираются лишние, если вариант только один, то он добавляется автоматически. И самое главное: можно добавлять города, даже не прикасаясь к мышке, используя для выбора варианта клавиши «Вверх», «Вниз» и «Enter».

  5. А ещё теперь можно развернуть карту на весь экран, чтобы было удобнее её изучать.

  6. Исправлены ошибки.

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

Проблемы с запуском планировщика

Поделюсь некоторыми сложностями, с которыми я столкнулся, запуская планировщик маршрута.

Конечно, во время самой разработки все сложности сводились к алгоритмическим. В Dartium всё работало как положено с нужным количеством ошибок и предупреждений. Проблемы начались сразу после компиляции в JavaScript и запуске в обычном браузере (кто бы сомневался). Проект не запустился, выдав странного вида stack trace. Ну что же, пересобираем проект без минификации. Stack trace стал читаемым, ошибки понятными. Как оказалось, вся проблема была в аннотации @MirrorsUsed. Дело в том, что mirrors (так называется reflection в Dart) занимает непозволительно много места в скомпилированном коде. И для того, чтобы этого избежать, авторы Dart предлагают использовать эту аннотацию для указания библиотек и классов, информацию о которых нужно будет получить во время исполнения (кстати, в будущем обещают доработать компилятор, что избавит от необходимости использовать эту аннотацию). Так вот, мой класс контроллера не был указан в @MirrorsUsed и, соответственно, AngularDart не мог с ним работать.

Исправил, скомпилировал, не запустилось. Правда, в этот раз я увидел несколько больше, чем просто пустую страницу. Немного поисков — и обнаружилась вторая проблема: нельзя в шаблонах AngularDart использовать методы встроенных объектов Dart. То есть в Dart можно, а в JavaScript нельзя. Конкретно в моем случае было написано:

{{segment[0].distanceTo(segment[1]).round()}}

Понятное дело, JavaScript и не догадывается о методе round у типа double. Да, собственно, про существование double он тоже не догадывается. Поэтому нужно писать геттер или вспомогательную функцию. Например так:

{{segment[0].distanceToRound(segment[1])}}

Ура, запустилось! Теперь осталось собрать минифицированную версию и выложить. Но после сборки проект снова упал с непонятным stack trace, как и в самом начале.

Не один час был потрачен на гугление всевозможных причин. Дело почти дошло до того, чтобы написать новый багрепорт о неправильной компиляции. Но я вовремя остановился, и хорошо, потому что ошибка была у меня и, кстати, довольна простая: я пытался проинициализировать Яндекс.Карты, а функция‑конструктор не существовала. Вот проблемная строка, она соответствует map = new ymaps.Map(“map”, options); в JavaScript:

map = new JsObject(context['ymaps']['Map'], ["map",  options]);

Но ведь несжатая версия работает! Моё предположение, что сжатая версия приложения инициализируется значительно быстрее и поэтому API Яндекс.Карт ещё не готово к тому времени, оказалось верным, и вызов функции ymaps.ready всё исправил.

Итог. Более‑менее сложное Dart‑приложение хорошо работает в браузерах без поддержки Dart. Но зато когда сталкиваешься с проблемой, которая возникает только в скомпилированном и минифицированном коде, можно потратить довольно много времени на поиск решения просто потому, что подсказок никто не даст, а код выглядит довольно запутанно. Но в своей практике я сталкивался со случаями, когда и обычное JavaScript‑приложение после сжатия начинало вести себя неправильно и возникали те же проблемы поиска решения.

Хочется отметить минификатор JS, встроенный в Dart. Он заменяет все ; на переводы строк. Из‑за этого в результате получается файл со множеством строк, а не с одной, как в случае с другими минификаторами. А это, в свою очередь, сильно упрощает ручной анализ кода.

Neunundzwanzig

fig:29

29

Продолжим прошлогодний рассказ про числа. 29 — это нечётное натуральное число между 28 и 30.

Это десятое простое и четвёртое праймориальное простое число. Так же оно является шестым простым числом Софи Жермен. А ещё — простым числом Люка, Пелля, Эйзенштейна, Пиллаи.

29 является суммой трёх последовательных квадратов (\(2^2 + 3^2 + 4^2\)), атомным числом меди, числом дней в лунном месяце и периодом обращения Сатурна в годах. В турецком, финском, шведском, датском и норвежском алфавитах по 29 букв.

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

Чистим Git-репозиторий

Внезапно после множества правок, попавших на сайт после перехода на Hakyll, размер Git‑репозитория оказался равным 80 Мб. Конечно, некоторую часть из этого занимают фотографии, но огромное количество занятого пространства приходится на старые удалённые файлы. В общем, идея всё почистить давно поселилась в моей голове. Теперь это время настало.

Для этой операции воспользуемся утилитой BFG Repo Cleaner.

Итак, извлекаем новую копию репозитория.

git clone --mirror git@github.com:dikmax/dikmax.name.git

Удаляем из истории всё, что больше 64 Кб.

java -jar bfg.jar --strip-blobs-bigger-than 64K dikmax.name.git

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

cd dikmax.name.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive

Теперь размер репозитория уменьшился в два раза, до 39 Мб, что чуть больше размера всех имеющихся на сайте фотографий.

Заливаем изменения на GitHub:

git push --force

А теперь то, что оказалось важным, но в инструкции отсутствует. После этой операции HEAD будет указывать на тот же коммит, что и раньше, а это значит, что возможно выполнить git push в любой ранее извлечённой копии. Эта команда выполнится безо всяких предупреждений и зальёт разницу, то есть как раз все те файлы которые мы благополучно из репозитория выпилили. Более того, так как и порезанные коммиты из репозитория никуда не исчезнут, то получится что у нас будет храниться две версии для каждого старого коммита: полная и порезанная. Поэтому, если в репозиторий могут добавлять изменения несколько человек, то все они должны быть предупреждены и действия должны быть согласованными. В моем же случае git push выполнял автоматически скрипт синхронизации комментариев с Disqus, что сводило все усилия сделать всё как надо к нулю.

Предыдущий абзац одним предложением: абсолютно все рабочие копии должны быть извлечены заново.