Настольный веб-сервер (часть 1 из 2) - делаем сами

Apr 24, 2014 02:36

Начало. Окончание - следующая запись.

У меня есть убеждение, что тенденцию развития пользовательских программ (настольных, корпоративных, игровых и т.п.) задают программы сетевые. Просто именно в Сети люди вынуждены приходить к общим соглашениям, которые неизбежно вытесняют частные. Это как человек думает на родном языке - хотя вроде мог бы думать и на каком-то «внутреннем» - так и развитие программ неизбежно направляется общепринятым в IT, а общепринятое создается и навязывает себя в основном из Сети.

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


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

Хостинг является связующим звеном между клиентской частью (где пользователь делает свою часть работы) и программной частью, которая исполняет «машинную» часть работы, Такое разделение сложилось де-факто в Сети и очевидно, что такое же построение логично обеспечить и на компьютере, даже помимо Сети. И тогда массу наработок из Интернета можно переносить на отдельный комп в практически готовом виде.

Но до недавнего времени завести хостинг на компе было непростым делом. Хостинг придумывался для обслуживания тысяч пользователей, под обеспечение мощной безопасности и настройка программ (веб-серверов) для его создания не требовала ни спешки, ни простоты. А вот для отдельного пользователя возится с настройкой хостинга для себя одного, вкладывая усилия как для кучи челов - абсурдно. Для персонального применения хостинг должен легко возникать сам - при запуске программы и не парить вообще.

Я посматривал много лет - не появится ли легкий персональный «самохостинг» и вот - вроде наконец видно... Появилось ASP.NET Web API - это просто программная среда для работы в сети (когда есть хостинг), но теперь есть и проект Nancy, который работает с этой средой и обеспечивает довольно простой «самохостинг» на настольном компе.

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

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

Кое-что ещё о проекте Nancy, как показателе тенденции... Их наработки вполне применимы под разными операционными системами. Ведь среда .Net, под которую они сделаны - кроссплатформенная, как Java. (На Линуксе есть проект Mono, обеспечивающий среду для разработки и исполнения кода .Net). Тут мы видим продолжение той же тенденции унификации от Интернета. Сейчас проги пишут в байт-кодах, которые одинаково выполняются на разных компах, разных операционных системах - без перекомпиляции. Это логично  - тут можно строить из разных компов единую вычислительную среду и процессы вычисления могут переходить от компа к компу без необходимости перевода. Вот так требование «общего понимания» оказывается важнее стремления к «индивидуальной эффективности».

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

Вообще, результат достигается очень малым количеством кода - просто можете пробежать по тексту, все пропустив, кроме кода. И увидите, что его - около страницы всего. Но поскольку мы должны получить работающую прогу, а в работе с инструментами создания программ есть масса нюансов, то я стараюсь их указать максимально исчерпывающе, чтоб у интересующегося чела не возникло разочарования от неполученного результата. А упустить какие-то нюансы и не достичь цели тут легко. Приступим.

1. В Visual Studio 2013 express for Web (VS доступно бесплатно и без ограничения времени) создадим новый проет (Меню-Файл-Создать проект). Там предложат набор шаблонов, надо выбрать: C# -Веб - Visual Studio 2012 - Пустое веб-приложение ASP.NET

2. Затем попадаем через меню «Сервис - Диспетчер пакетов NuGet - Консоль диспетчера пакетов» на консоль NuGet

3. Запускаем (пишем в консоли и жмем Enter) «Install-Package Nancy.Hosting.Aspnet» - это чтоб хостится на IIS (включая отладку в VS)

4. Запускаем «Install-Package Nancy.Viewengines.Razor» - это для специального скриптового серверного языка.

5. После предыдущих двух пунктов в наш набор файлов скопировались из интернета необходимые файлы и проставились нужные ссылки в web.config и т. п. Но необходимые пространства имен (типа «using Nancy;») в программе надо писать самому.

6. В проекте (в Обозревателе решений VS, щелкнув правой кнопкой мыши на Проекте и выбрав пункт контекстного меню «Добавить - Создать папку») создаем новую подпапку Modules.

7. Внутри папки Modules создаем (в Обозревателе решений VS, щелкнув правой кнопкой мыши на папке Modules и выбрав пункт контекстного меню «Добавить - Создать элемент - Класс») класс HomeModule.cs (такое название потому, что для запуска наша прога будет искать класс, имя которого кончается на «Module» - так построена Нэнси).

8. Пишем в этом классе следующее (обратите внимание на нестандартное расширение у файла Index.sshtml - об этом будет сказано при разборе самого файла):
HomeModule.cs

using Nancy;

using Nancy.Hosting.Aspnet;

using Nancy.ViewEngines.Razor;

namespace Home

{

public class HomeModule : NancyModule

{

public HomeModule()

{

Get["/"] = parameters =>

{

// Простой вариант закомментировал. но работает он именно

// так - что отличается от строки

// (без return) - как написано в Нэнси
          // return "ee hoo! - no more little green monster...";

// А следующая команда будет работать, только если

// прога запущена из нужного каталога - в которой

// находится подкаталог views с содержимым. А куда

// класть прогу (скомпилированные файлы) - это нужно
          // задать в свойствах проекта, вкладка «Сборка»,

// Пункт «Путь вывода».

return View["Index.sshtml"];

};

}

}

}

9. Вызвать «Свойства» проекта (по контекстному меню) и переименовать на вкладке «Приложение» пункты «Имя сборки» и «Пространство имен по умолчанию» на «Home». И желательно переименовать файл проекта - его имя можно найти в Окне свойств, когда в Обозревателе решений выбран сам проект. Вот в окне свойств надо аккуратно поменять имя файла проекта на Home.csproj. После этого в обозревателе решений изменится название проекта на Home.

10. В проекте создаем новую папку Views (это потому, что вызовы View["Index.sshtml"] ищут свои файлы внутри папки Views).

11. В папке Views создаем новую папку Home (это потому, что обращаясь к папке Views из класса HomeModule наша прога ищет (так сделана среда Нэнси) в папке Views подпапку с именем Home (суффикс «Module» отбрасывается).

12. В папке Home создаем новый элемент Index.sshtml (в контекстном меню «Добавить - Страница представления MVC 5 Razor». Обратите внимание на расширение! Именно «.sshtml» - иначе при запуске проги вместо нашей страницы появится зеленый  монстр с сообщением что НЕ видно файла нужного типа. Это особенность Nancy - Nancy не воспринимает стандартного для «родного» ASP.NET Razor расширения «.cshtml», и при запуске обозревателя по корню http://localhost:8085/ дает ошибку 500, маленького зеленого монстра (картинку) и сообщения о допустимых расширениях. Среди них - «.sshtml». Поэтому, если не получится поменять расширение внутри обозревателя решений, то надо зайти в каталог views\Home, поменять расширение там и после этого включить этот существующий документ (через контекстное меню Обозревателя решений, щелкнув на папке views\Home правой кнопкой мыши и выбрав "Добавить существующий элемент") в проект.

13. В созданной странице представления пишем следующий текст:
Index.sshtml









title> <br /><br /> head> <br /><br /> <body> <br /><br /> <div> <br /><br /> Hay! Yaa! 1 <br /><br /> div> <br /><br /> body> <br /><br /> html> <br /><br /> 14. Теперь, прежде чем запускать нашу прогу на исполнение (через F5) нам надо учесть, что вся эта последовательность директорий Views/Home/Index.sshtml должна быть видна из корня нашего проекта, а корень находится там (если не настраивать специально), откуда запускаются скомпилированные файлы проги. А при работе в среде VS for Web они генерируются в подпапке bin нашей папки проекта и в этой директории bin нет этих самых директорий и файлов Views/Home/Index.sshtml. Поэтому, сохранив проект (чтоб все файлы были последней версии) скопируйте поддиректорию Views со всем ее содержимым в папку bin. И после этого запускайте проект (клавиша F5). Если будут ошибки, то сравните с текстами тут и исправьте. Если все нормально - запуститься браузер. <br /><br /> 15. Если браузер запустился, но покажет текст вроде «Не найдено», то убираем в браузере «хвост» адреса до корня (оставляем только адрес вида «<a href="http://localhost:62059/»" class="external">http://localhost:62059/»</a> - только число там может быть другое), вызываем его (можно нажать Enter в адресной строке браузера) и получаем в окне «Hay! Yaa! 1» - что мы и записали в Index.sshtml<br />Окончание - <a href="/read/user/dmitgu/71785">следующая запись</a>. <br /><br /> </div> <p class="item-tags"> <a href="http://m.livejournal.com/read/user/dmitgu/tag/ИТ (информ. технологии)">ИТ (информ. технологии)</a>, <a href="http://m.livejournal.com/read/user/dmitgu/tag/ЖЖвЖЖ программирование">ЖЖвЖЖ программирование</a> </p> </div> <div class= " ljsale ljsale--empty " lj0sale="adfox_mobile_content_1" ></div> <div class="b-more-button"> <a class="b-more-button-inner" href="/login?back_uri=http://m.livejournal.com/read/user/dmitgu/71470/comments/reply#comments">Leave a comment</a></p> </div> </div> </div> <div class="paging"> <table cellspacing="0" cellpadding="0"> <tbody> <tr> <td class="paging-prev"> <a href="http://m.livejournal.com/read/user/dmitgu/71048">Previous post</a> </td> <td class="paging-next"> <a href="http://m.livejournal.com/read/user/dmitgu/71785">Next post</a> </td> </tr> </tbody> </table> </div> <div class="to-top"> <a href="#to-top"> Up </a> </div> <div class="footer"> <div class= " ljsale ljsale--empty " lj0sale="adfox_mobile_footer" ></div> <div class="footer-content"> <table class="footer-layout"> <tr> <td> <a class="footer-menu-item footer-menu-index" href="//m.livejournal.com/"> <span class="footer-menu-item-title">Homepage</span> </a> </td> <td> <a class="footer-menu-item footer-menu-read" href="//m.livejournal.com/read"> <span class="footer-menu-item-title">Read journal...</span> </a> </td> <td> <a class="footer-menu-item footer-menu-full" href="https://dmitgu.livejournal.com/71470.html?fullversion=yes"> <span class="footer-menu-item-title">Full version</span> </a> </td> <td> <a class="footer-menu-item footer-menu-help" href="//m.livejournal.com/help"> <span class="footer-menu-item-title">Help</span> </a> </td> <td> <a class="footer-menu-item footer-menu-eng" href="//www.livejournal.com/tools/setlang.bml?lang=ru&returnto=//m.livejournal.com/read/user/dmitgu/71470"> <span class="footer-menu-item-title">Русская версия</span> </a> </td> </tr> </table> <link rel="stylesheet" type="text/css" href="https://l-stat.livejournal.net/??lj_base.css,flatbutton.css,mobile/default/s.css,msgsystem.css?v=1734597428" > <!--[if lte IE 8]><link rel="stylesheet" type="text/css" href="https://l-stat.livejournal.net/??ie.css?v=1734597428" ><![endif]--> <link rel="stylesheet" type="text/css" href="https://l-stat.livejournal.net/??proximanova-opentype.css?v=1734597428" > <script type="text/javascript"> Site = window.Site || {}; Site.ml_text = {"/userinfo.bml.editalias.title":"Edit Note","like_reaction.pigeon.caption":"Strange things","common.edit":"Edit","notif_center.birthday":"Today is <strong>[[display_name]]</strong>'s birthday!","common.back":"Back","medius.asapnews.breakingnews":"Срочная новость","components.report_modal.description.alco":"Information containing offers of remote retail sale of alcoholic products whose retail sale is either forbidden or restricted by law.","popup.cookies.submit":"OK","common.save":"Save","adfox.noads":"Tired of ads? Upgrade to account with Professional package of service and never see ads again!","common.delete":"Delete","components.report_modal.description.involving_minors":"Information aimed at involving minors in illegal activity dangerous for their life and(or) health.","popup.cookies.conditionsLink":"conditions","notif_center.trending_now_custom_url":"Trending now: <a href=\"#\">[[subject]]</a>","sharing.popup.title":"Share","common.are_you_sure":"Are you sure?","sharing.service.facebook":"Facebook","components.report_modal.description.suicide":"Calls for suicide or self-harm, demonstration of suicide.","component.messages.close":"Close","dialogs.no":"Cancel","sharing.service.twitter":"X","notif_center.promo_feed":"Check out <a href=\"#\">new interesting posts</a> for your personal feed!","pushWooshPopup21.description":"Enable browser push notifications about new entries","recurrentreminder.password.updated.last":"updated password <strong>more than [[time]] ago</strong>","notif_center.new_friend_achievement":"Your friend <strong>[[actor_displayname]]</strong> got a new achievement! <a href=\"#\">[[achievement_display]]</a>","fcklang.ljlike.button.whatsapp":"WhatsApp","lj.report.popover.message":"Thanks! Moderators will review your complaint","create.subscribe.proceed_btn.caption":"Proceed","modal.info_pro.title_notpaid":"Account without the \"Professional\" package","notif_center.like.comment.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> reacted to your <a href=\"#\">comment</a>","createaccount.subscribe.title":"Recommended authors","modal.info_pro.feature.item.notification":"Additional notification settings","notif_center.new_achievement":"<strong>New achievement!</strong> <a href=\"#\">[[achievement_display]]</a> [[achievement_description]]","recurrentreminder.email.message":"<span>Your account is linked to mail <strong>[[email]]</strong> Is this address still up to date?</span>","sitescheme.switchv3.confirm_dialog.no":"No, stay on the old one","notif_center.like.entry.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] reacted to <a href=\"#\">[[post_subject]]</a>","components.report_modal.too_many_complaints":"You've reached report limit per day","notif_center.poll.vote.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] voted in poll in your post <a href=\"#\">[[post_subject]]</a>","notif_center.trending_now.no_subj":"<a href=\"#\">New post</a> is trending now","dialogs.yes":"OK","modal.gift_token.buy":"Purchase LJ Tokens to gift","subscribe_button_2022.is_in_friend_list":"In friend list","notif_center.user_post.in_community":"User <strong>[[actor]]</strong> published a new entry <a href=\"#\">[[post_subject]]</a> to community <strong>[[comm_disp_name]]</strong></a>","components.report_modal.description.adult_content":"Explicit graphic content only intended for viewers aged 18 and up.","notif_center.dropdown.hide":"Unsubscribe","sharing.service.email":"E-mail","widget.recomended.partners.title":"Partner news","modal.emailreconfirm.button.cancel_short":"No","notif_center.social_connections.subscription":"<a href=\"#\">[[actor]]</a> subscribed to you","notif_center.repost":"<strong>[[actor]]</strong> reposted your entry <a href=\"#\">[[post_subject]]</a>","modal.emailreconfirm.button.cancel":"No, change","pushWooshPopup21.button.subscribe":"Yes, please","recurrentreminder.password.message":"<span>We noticed that you [[messageData]]. Increase the security of your account by setting a new one</span>","like_reaction.thumbs_up.caption":"Thumbs up","you_are_logged_in_hint.button.cancel":"Cancel","modal.emailreconfirm.button.accept_short":"Yes","/userinfo.bml.addalias.title":"Add Note","modal.info_pro.title":"An account with the active Professional service package","notif_center.comment.to_comment.anon":"Anonymous user replied to your comment for entry <a href='#'>[[post_subject]]</a>","notif_center.repost.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] reposted your entry <a href=\"#\">[[post_subject]]</a>","sharing.service.viber":"Viber","notif_center.continuous_series.start":"You wrote a post yesterday. That's a good start! Write a post today ([[date]]) to extend the uninterrupted series.","sharing.service.stumbleupon":"StumbleUpon","notif_center.pingback.entry.community":"<strong>[[actor]]</strong> mentioned your community [[community]] in entry <a href=\"#\">[[post_subject]]</a>","identity.system.message.title":"This account was created using a social network or other third-party service.<br />We recommend you to choose a LiveJournal login and set a password for your account so you don't need to rely on third-party services for login.<br />You can do this by following this <a id=\"identity-message\" target=\"_blank\" href=\"https://www.livejournal.com/identity/convert.bml\">link</a>","recurrentreminder.password.updated.months.ago":"[[amount]] months","like_reaction.detail_popup.button.close":"Close popup","like_reaction.detail_popup.all":"All [[count]]","components.report_modal.link.illegal":"What materials are forbidden in LiveJournal?","notif_center.dropdown.mark":"mark as read","recurrentreminder.password.button.update.password":"Yes, I want to update","modal.badge.verified.button.link":"https://www.livejournal.com/support/faq/442.html?ila_campaign=verified&ila_location=badge_modal","you_are_logged_in_hint.button.reboot":"Refresh","sharing.service.digg":"Digg","recurrentreminder.password.button.refuse":"No, I'm satisfied","like_reaction.ok_hand.caption":"OK","notif_center.read_all.label":"Mark all as read","modal.gift_token.button":"Send LJ Tokens","user_note_modal.title.edit":"Edit user note","notif_center.continuous_series":"You have been writing for [[days]] [[?days|day|days|days]] now. Write a post today ([[date]]) and extend the uninterrupted series!","components.report_modal.description.drugs":"Information on ways of producing, using, and places of purchasing of narcotic substances.","notif_center.post_suggest.recent_journal_upd":"There is a new post in journal which you've visited recently: <a href=\"#\">[[post_subject]]</a>","banner.native_install_prompt.ios.text":"Install LiveJournal app for IOS","notif_center.pingback.entry":"<strong>[[actor]]</strong> mentioned you in the entry <a href=\"#\">[[post_subject]]</a>","modal.gift_token.clue":"The commission will be [[commission]] [[?commission|token|tokens|tokens]], after you will have [[token]] [[?token|token|tokens|tokens]].","notif_center.draft":"You have an unpublished draft, continue working on your new entry","banner.native_install_prompt.android.text":"Install LiveJournal app for Android","modal.info_pro.feature.item.style":"Advanced style settings","banner.hashmob.favorite_cities.link":"https://www.livejournal.com/lyubimyye-goroda/?ila_campaign=lyubimyye_goroda&ila_location=banner","components.report_modal.description.fake":"Information containing calls for mass riots and(or) extremist activity that may endanger lives and(or) wellbeing of people, property, disruption of public order and(or) public safety.","modal.emailreconfirm.title":"Email confirmation","components.report_modal.link.other":"Other","notif_center.post_suggest":"This might be interesting for you: <a href=\"#\">[[post_subject]]</a>","modal.info_pro.feature.item.adv":"No ads","notif_center.like.comment":"<strong>[[actor]]</strong> reacted to your <a href=\"#\">comment</a>","modal.info_pro.feature.more":"And many other extra functions more!","subscribe_button_2022.subscribe_settings":"Manage subscription","common.close":"Close","sharing.service.odnoklassniki":"Odnoklassniki","notif_center.trending_now":"Trending now: <a href=\"#\">[[post_subject]]</a>","widget.alias.aliaschange":"Save note","sherry_promo_button.link":"https://sharrymania.ru/?utm_source=livejournal&utm_medium=special_project&utm_campaign=sharry&utm_content=branding_block_2","fcklang.ljlike.button.telegram":"Telegram","popup.cookies.description":"By continuing to use this website, you agree to the","components.report_modal.description.extremism":"Calls for unrest and terror, violence against people of a specific ethnicity, religion, or race.","modal.info_pro.feature.item.statistic":"Advanced statistics","createaccount.subscribe.to.feed":"To feed","notif_center.empty.label":"You don't have notifications","components.report_modal.description.insult_govsymbols":"Information that offends human dignity and public morale; explicit disrespect for society, state, official state symbols.","modal.gift_token.button.back":"Cancel","recurrentreminder.password.updated.years.ago":"[[amount]] [[?amount|year|years]]","recurrentreminder.password.title":"Your password might be out of date","components.report_modal.description.child_porn":"Materials with pornographic depiction of minors, or involvement of minors in entertainment activities of pornographic nature.","modal.info_pro.user":"is using an account with the active Professional service package","widget.alias.faq":"read <a [[aopts]]>FAQ</a> for details","like_reaction.sad.caption":"Sad","widget.alias.setalias":"Set note for","modal.emailreconfirm.confirmed":"Ок, thanks for checking the relevance of your data","you_are_logged_in_hint.hint_text_2":"You've signed in using another tab or window. Refresh this page","subscribe_button_2022.mutual_subscribe":"Mutual subscribe","userinfo.bml.hover_menu.headlinks.write_to_community":"Post to community","like_reaction.pencil.caption":"Keep writing!","like_reaction.facepalming.caption":"Facepalm","modal.emailreconfirm.button.accept":"Yes, this is my address","common.something_went_wrong":"Something went wrong","notif_center.repost.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> reposted your entry <a href=\"#\">[[post_subject]]</a>","subscribe_button_2022.you_are_owner":"You are owner","common.remove_from_friends":"Remove from friends","notif_center.pingback.comment":"<strong>[[actor]]</strong> mentioned you in a comment for the entry <a href=\"#\">[[post_subject]]</a>","modal.badge.verified.button.text":"Read more","sharing.service.vkontakte":"VKontakte","modal.gift_token.description":"The size of the commission is [[commission]] tokens; after you'll have [[token]] tokens left","like_reaction.like.caption":"Like","like_reaction.detail_popup.add_btn.is_added":"Is friend","subscribe_button_2022.join_community":"Join community","widget.addalias.display.helper":"Visit the <a [[aopts]]>Manage Notes</a> page to manage all your user notes.","modal.gift_token.button.send":"Send","notif_center.comment.to_comment":"<strong>[[actor]]</strong> replied to your comment for entry <a href='#'>[[post_subject]]</a>","sherry_promo_button.tooltip_text":"Реклама. ООО «Перфлюенс». ИНН 7725380313. erid: 2Ranym4Vj3N","components.report_modal.already_reported":"You've already reported a breach","subscribe_button_2022.add_user_note":"Add a note","notif_center.like.entry.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> reacted to your entry <a href=\"#\">[[post_subject]]</a>","modal.gift_token.message.warning.insufficient_tokens":"You don't have enough tokens. <a href=\"https://www.livejournal.com/shop/tokens.bml?ila_compaign=gift_tokens&ila_location=gift_modal\">Buy tokens</a>","subscribe_button_2022.you_are_subscribed":"You are subscribed","subscribe_button_2022.edit_user_note":"Edit the note","notif_center.pingback.comment.community":"<strong>[[actor]]</strong> mentioned your community [[community]] in a comment for entry <a href=\"#\">[[post_subject]]</a>","notif_center.poll.vote.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> voted in poll in your post <a href=\"#\">[[post_subject]]</a>","pushWooshPopup21.button.close":"No","subscribe_button_2022.user_note.not_available_for_basic_users":"<a href=\"https://www.livejournal.com/shop/profaccount/?ila_campaign=prof_account&ila_location=add_note\" target=\"_blank\">Upgrade your account</a> to add a note","modal.gift_token.suggestion.popup.text.hint":"The commission will be [[commission]] [[?commission|token|tokens|tokens]], after you will have [[token]] [[?token|token|tokens|tokens]].","mobileAppBanners.betterCommunicateInApp.title":"<p><b>Communicate</b><p><p>is easier in mobile app</p>","sharing.service.moimir":"Moi mir","recurrentreminder.password.button.update.password_short":"Yes","common.unsubscribe":"Unsubscribe","modal.info_pro.feature.item.filter_comment":"Negative comment filter","like_reaction.dislike.caption":"Dislike","notif_center.comment.anon":"Anonymous user commented an entry <a href=\"#\">[[post_subject]]</a>","fcklang.ljlike.button.copyURL":"Copy url","notif_center.comment":"<strong>[[actor]]</strong> commented an entry <a href='#'>[[post_subject]]</a>","subscribe_button_2022.you_are_member":"You are member","notif_center.settings":"Settings","modal.info_pro.feature.item.photo":"More photo storage space","notif_center.post_suggest.no_subj":"We've found a <a href=\"#\">post</a> that might be interesting for you","createaccount.subscribe.description":"You might like the authors","modal.info_pro.button":"Learn more","error_adding_friends.email_not_validated":"Sorry, you aren't allowed to add to friends until your email address has been validated. If you've lost the confirmation email to do this, you can <a href=\"http://www.livejournal.com/register.bml\">have it re-sent.</a>","sharing.service.embed":"Embed","user_note_modal.title.add":"Add a note","components.report_modal.descr":"Pick a category of complaint:","modal.badge.verified.title":"Verified log","notif_center.offcialpost":"Some news for you: <a href=\"#\">[[post_subject]]</a>","common.closing_quote":"\"","banner.hashmob.favorite_cities.button":"participate","common.recommended.description":"We selected these authors and communities for you","create.head":"Creating a New Journal","components.report_modal.description.lgbt_propaganda":"Information aimed at involving minors in illegal activity demonstratingsuicide or justifying non-traditional values.","banner.hashmob.favorite_cities.hash":"hashmob","common.add_to_friends":"Add to friends","modal.info_pro.feature.item.seo":"SEO tools","banner.hashmob.favorite_cities.name":"#favoritecities","modal.info_pro.user_notpaid":"does not yet use the \"Professional\" service package","pushWooshPopup21.title":"You can subscribe to journal","modal.gift_token.text":"How many LJ Tokens do you want to send to user","common.opening_quote":"\"","recurrentreminder.password.button.refuse_short":"No","subscribe_button_2022.leave_community":"Leave community","sitescheme.switchv3.confirm_dialog.yes":"Yes, switch to the new one","user_note_modal.add_note_for":"Only you will see this note on hover the username: ","like_reaction.fire.caption":"Hot","notif_center.this_day":"Remember what you wrote on this day, <a href=\"#\">[[date]]</a> in the past!","components.report_modal.title":"Report","like_reaction.pow_prints.caption":"Paw prints","fcklang.ljlike.button.email":"Email","like_reaction.laughing.caption":"LOL","like_reaction.detail_popup.title":"Reactions","notif_center.dropdown.delete":"Delete","modal.info_pro.feature.text":"The Professional package grants you the following perks:","createaccount.subscribe.to.post":"To first post","notif_center.view_all.label":"View all","like_reaction.nauseated_face.caption":"Nauseated face","notif_center.like.comment.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] reacted to your <a href=\"#\">comment</a>","notif_center.title":"Notifications","userinfo.bml.hover_menu.paid":"Account with the <a href=\"https://www.livejournal.com/shop/profaccount/?ila_campaign=prof_sign&ila_location=context_hover\" class=\"contextual-link\" target=\"_blank\">Professional</a> package of service","like_reaction.angry.caption":"Angry","notif_center.like.entry":"<strong>[[actor]]</strong> reacted to your entry <a href=\"#\">[[post_subject]]</a>","widget.alias.aliasdelete":"Delete note","popup.cookies.title":"This website uses cookies.","components.report_modal.description.hate_speech":"Expression of hatred towards against people based on their race, ethnicity, religion, gender, etc. ","notif_center.message":"<strong>[[actor]]</strong> sent you a <a href=\"#\">message</a>:","notif_center.post_suggest.recent_journal_upd.no_subj":"There is a new <a href=\"#\">post</a> in journal which you've visited recently","mobileAppBanners.footer.text":"Get LJ mobile app","adfox.noads.paid":"Log in to stop seeing ads in this journal","components.report_modal.description.spam":"Submit a complaint if someone has posted an ad in an inappropriate location.","notif_center.poll.vote":"<strong>[[actor]]</strong> voted in poll in your post <a href=\"#\">[[post_subject]]</a>","like_reaction.poop.caption":"Poop","common.subscribe":"Subscribe","common.add_to_group":"Add to group","like_reaction.ghost.caption":"Ghost","sherry_promo_button.text.sherry":"СКИДКИ","entry.url_copied.message":"Entry url was copied to clipboard","common.recommended":"Suggested for you","recurrentreminder.password.updated.never":"<strong>never</strong> updated your password","banner_popup.open_app":"Open App","modal.info_pro.feature.item.icon":"Badge by the username","sharing.service.livejournal":"LiveJournal","rambler.partners.title":"Today's News","notif_center.user_post":"User [[actor]] published a new entry <a href=\"#\">[[post_subject]]</a>","sharing.service.tumblr":"Tumblr","modal.gift_token.title":"Gift LJ Tokens","common.and":"and","notif_center.time.now":"just now","like_reaction.face_vomiting.caption":"Face vomiting","subscribe_button_2022.join_request_is_pending":"Join request is pending","modal.gift_token.message.success":"LJ Tokens has been sent successfully","components.report_modal.description.gambling":"Information violating the demands of the Federal law on prohibition of gambling and lotteries via the Internet or other means of communication.","pwa.banner.android.text":"Add [[journal]] to Home screen","modal.badge.verified.content":"The verified journal status means that the blog is officially maintained on behalf of a famous person or an organisation.<br /><br /><b>You also could receive a checkmark</b>, if you already have a verified status on another social platforms","modal.gift_token.suggestion.popup.text":"You want to send [[value]] [[?value|token|tokens|tokens]] to the user","notif_center.whosback":"<strong>[[actor]]</strong> posted for the first time in [[delta]]: <a href=\"#\">[[post_subject]]</a>","notif_center.social_connections.friending":"<a href=\"#\">[[actor]]</a> add you as a friend","user_note_modal.edit_note_for":"Only you will see this note on hover the username: ","components.report_modal.submit_report_caption":"Report","like_reaction.detail_popup.add_btn.add":"Add friend"}; Site.page = {"adv_libs":{"google":{"url":"https://l-stat.livejournal.net/js/??ads/googletag.js?v=1734597428"},"ssp":{"conflicts":["adfox"]},"inner":{},"adfox":{"conflicts":["ssp"],"url":null}},"D":{},"is_mobile_version":1}; Site.page.template = {}; Site.page.ljlive = {"is_enabled":false}; Site.page.adv = {"adfox_mobile_listing_1":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"dmitgu","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"sspScroll","options_begun":{"begun-block-id":"579314164","begun-auto-pad":"536695699"}},"adfox_native_1":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","pct":"a","puid16":"","puid18":"","puid7":"","p1":"buuvt","puid62":0,"puid9":"dmitgu","puid59":"","puid2":"","p2":"fhzr","puid8":""},"method":"sspScroll","options_begun":{"begun-block-id":"432172008","begun-auto-pad":"432171792"}},"adfox_mobile_footer":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"dmitgu","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"ssp","options_begun":{"begun-block-id":"579314162","begun-auto-pad":"536695699"}},"adfox_mobile_listing_2":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"dmitgu","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"sspScroll","options_begun":{"begun-block-id":"579314166","begun-auto-pad":"536695699"}},"billboard_mobile":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"dmitgu","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"ssp","options_begun":{"begun-block-id":"579314160","begun-auto-pad":"536695699"}}}; Site.page.is_adult = 0; Site.timer = +(new Date()); Site.remote = null; Site.journal = {"journal_url":"https://dmitgu.livejournal.com/","webpush_sub_enabled":false,"is_personal":true,"userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=808","is_syndicated":false,"has_photopackage":false,"badge":null,"journal_subtitle":"может пора уже от религий и традиций перейти к пониманию жизни, смерти и того, каким быть обществу","is_paid":false,"id":9420014,"webvisor_enabled":false,"is_news":false,"display_username":"dmitgu","custom_reactions":"","journal_title":"dmitgu.livejournal - Как же устроен мир?","is_identity":false,"public_entries":[],"is_medius":false,"rkn_license":"","is_permanent":false,"is_community":false,"username":"dmitgu","is_journal_page":false,"is_bad_content":false,"is_suspended":false,"manifest":"{\"related_applications\":[{\"id\":\"com.livejournal.android\",\"platform\":\"play\"}],\"gcm_sender_id\":\"88462774281\",\"short_name\":\"dmitgu\",\"name\":\"dmitgu.livejournal - Как же устроен мир?\",\"icons\":[{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj16.png\",\"type\":\"image/png\",\"sizes\":\"16x16\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj32.png\",\"type\":\"image/png\",\"sizes\":\"32x32\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj48.png\",\"type\":\"image/png\",\"sizes\":\"48x48\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj64.png\",\"type\":\"image/png\",\"sizes\":\"64x64\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj128.png\",\"type\":\"image/png\",\"sizes\":\"128x128\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj144.png\",\"type\":\"image/png\",\"sizes\":\"144x144\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj152.png\",\"type\":\"image/png\",\"sizes\":\"152x152\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj256.png\",\"type\":\"image/png\",\"sizes\":\"256x256\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],\"gcm_user_visible_only\":true,\"description\":\"dmitgu.livejournal - Как же устроен мир?\",\"display\":\"standalone\",\"start_url\":\"https://dmitgu.livejournal.com?adaptive\",\"theme_color\":\"#004359\",\"background_color\":\"#004359\",\"prefer_related_applications\":false,\"id\":\"?pwa_id=9420014\"}","profile_url":"https://dmitgu.livejournal.com/profile/","is_memorial":false}; Site.entry = null; (function(){ var p = {"remote_is_identity":null,"remote_is_maintainer":0,"auth_token":"sessionless:1734739200:/__api/::35c34539b32aef8f7e4a005c4f16ea936bc6401f","locale":"en_US","remoteUser":null,"remote_is_sup":0,"remoteJournalBase":null,"statprefix":"https://l-stat.livejournal.net","vk_api_id":"2244371","ctx_popup":1,"jsonrpcprefix":"https://l-api.livejournal.com","siteroot":"https://www.livejournal.com","templates_update_time":900,"media_embed_enabled":1,"v":1734597428,"advc_token":"1734741452:aab91360e960f70d4331cff6dd8afc67f9292cd0","currentEntryRecommendations":0,"currentLanguage":"en_LJ","server_time":1734740852,"logprefix":"","remote_email_reconfirmed":1,"counterprefix":"https://xc3.services.livejournal.com/ljcounter/","currentJournalBase":"https://dmitgu.livejournal.com","isCustomDomain":false,"isTrustedCustomDomain":false,"remoteLocation":{"city_id":"641","city_rus_name":"","country_name":"United States","longitude":"-71.1028","region_code":"MA","region_name":"Massachusetts","country_short":"US","latitude":"42.3646","city_name":"Cambridge"},"untrusted_ssl":["test.elecsnet.ru","www.arte.tv/en/","yourlisten.com","www.retromap.ru","flymeango.com/","www.mreporter.ru","epronto.ru","globalgallery.ru","verold.com","bbc.co.uk","travelads.ru","rutv.ru","prolivestream.ru","redigo.ru","gettyimages.com","beznomera.ru","videobasher.ru","maxkatz.ru","livesignal.ru","spring.me","www.music1.ru","podfm.ru","wikimapia.org","fashionmedia.tv","www.caissa.com","globalgallery.ru","turngallery.com","www.now.ru","pik-tv.com","mrctv.org","brainmaggot.org","promodj.com","jizo.ru","televidoc.ru","fidel.ru","so-l.ru","weclever.ru","rutv.ru","fotogid.info"],"fileprefix":"https://l-files.livejournal.net","likesprefix":"https://likes.services.livejournal.com/get","ljold":"","writers_block_community":"https://writersblock.livejournal.com/","country":"US","isBackendMobile":false,"inbox_update_poll":0,"flags":{"journal_v3":true,"branding_tretyakovgallery":true,"messages_v6":false,"meta":false,"tosagree_show":true,"friendsfeed_v3_settings":true,"rss_tour":true,"s1comment_preview":true,"medius":false,"fake_setting":true,"air_tour":true,"browse_lang_filter":true,"regionalrating_tour":false,"discovery":true,"add_friend_page_redesign":true,"manage_communities_v5":false,"lj_magazine_post_in_rating":false,"regional_ratings":true,"adaptive_lj_mobile":true,"quick_comment":true,"selfpromo_noc":false,"writers_block":false,"reactions_req":true,"medius_ui":true,"cosmos2021_ljtimes":true,"your_friends_block":true,"friendsfeed_v3":true,"discovery_times_grants":true,"likes":true,"managenotes_v6":true,"meta_geo":true,"loginform_v8":true,"adv_adfox_ssp_mobile":true,"medius_reading_time_cards":true,"top_user_cards":true,"reactions_post":false,"notification_center":false,"your_choice_block":true,"ru_geo":false,"adv_loader":true,"commercial_promo_noc":false,"pocket":true,"lj_magazine_improvements":true,"img_comments":true,"reactions":true,"feed_promo_beta":false,"lena_comment_popup":true,"friendsfeed_tour":true,"lj_repost":false,"recaptcha":true,"image_magick_autobreak":true,"sherrypromo":false,"ljwelcomevideo":false,"video_update_tour":false,"move_billboard_to_scheme":true,"hashmobbanner":false,"medius_schemius":false,"contextualhover_v7":true,"homepage_v3":true,"rambler_adblock":true,"feed_promo":true,"three_posts_tour":true,"superban_step2":true,"photo_challenge_ny":true,"photo_v4":true,"hashmobbutton":false,"medius_sharings":true,"canva_geo":true,"post_2017_beta1":true,"auth_from_frame":false,"cosmos2021":true,"likes_display":true,"antiadblock":true,"shopius":false,"repost_facebook":true,"facebook_auth":true,"endless_scroll":true,"rec_sys_medius":true,"notification_center_display":false,"interactive_stripe":false},"rpc":{"domain":{"comment.add":1,"notifications.get_events_counter":1,"repost.get_status":1,"relations.can_add_friends":1,"user.set_prop":1,"relations.can_add_subscribers":1,"notifications.read_all_events":1,"comment.is_log_comment_ips":1,"notifications.get_events":1,"likes.get_likes":1,"repost.delete":1,"journal.emailreconfirm_set":1,"repost.create":1,"comment.set_contentflag":1,"notifications.unsubscribe":1,"memories.set":1,"likes.get_votes":1,"journal.set_prop":1,"memories.remove":1,"relations.addfriend":1,"user.emailreconfirm_set":1,"journal.get_prop":1,"user.get_prop":1,"notifications.delete_event":1,"relations.removefriend":1,"comment.is_need_captcha":1,"repost.get_communities":1,"event.set_contentflag":1,"memories.get":1,"notifications.read_event":1,"entry.set_contentflag":1,"likes.vote":1,"likes.create":1},"ssl":{"journal.login":1,"signup.check_password":1,"signup.convert_identity_lite":1,"support.create_request":1,"signup.create_user":1,"signup.convert_identity":1,"user.login":1},"public":{"medius.top_user_cards_choice":"300","comment.get_thread":"900","latest.get_entries":"180","browse.get_posts":"300","gifts.get_gifts_categories":"60","gifts.get_all_gifts":"60","homepage.get_categories":"60","medius.asap":"300","medius.activities":"300","sitemessage.get_message":"3600","ratings.journals_top":"300","medius.get_public_items":"300","post.get_minipage_widget_counter":"60","browse.get_categories":"300","medius.get_homepage_items":"300","writers_block.get_list":"60","medius.top_user_cards":"300","medius.collection_items":"300","categories.get_public_category_posts":"60","medius.get_public_items_categories":"300","homepage.cool_pool":"300","browse.get_communities":"300","homepage.get_search_hints":"300","homepage.get_rating":"300"}},"should_show_survey":false,"pushwoosh_app_id":"28B00-BD1E0","has_remote":0,"picsUploadDomain":"up.pics.livejournal.com","remoteLocale":"en_US","notifprefix":"https://notif.services.livejournal.com/","remote_is_suspended":0,"imgprefix":"https://l-stat.livejournal.net/img","remote_can_track_threads":null,"currentJournal":"dmitgu","esn_async":1,"currentEntry":"","pics_production":""}, i; for (i in p) Site[i] = p[i]; })(); Site.current_journal = {"url_profile":"https://dmitgu.livejournal.com/profile/","userid":9420014,"journaltype":"P","is_comm":"","is_syndicated":"","userpic_h":84,"is_person":1,"badge":null,"is_mediapartner":"","is_paid":0,"display_username":"dmitgu","url_journal":"https://dmitgu.livejournal.com","is_identity":"","is_shared":"","display_name":"dmitgu","username":"dmitgu","userpic_w":100,"can_receive_vgifts":0,"url_allpics":"https://www.livejournal.com/allpics.bml?user=dmitgu","url_userpic":"https://l-userpic.livejournal.com/128241895/9420014"}; Site.version = '808'; </script> <script type="text/javascript" src="https://l-stat.livejournal.net/js/??.ljlib.js?v=1734597428"></script> <script type="text/javascript" src="https://l-stat.livejournal.net/js/??old/ljmobile.js?v=1734597428"></script> <!--[if gte IE 9]><script type="text/javascript" src="https://l-stat.livejournal.net/js/??deprecated/ie9pinned.js?v=1734597428"></script><![endif]--> <div class="footer-counters"> <!-- tns-counter.ru --> <script language="JavaScript" type="text/javascript"> (new Image()).src = '//www.tns-counter.ru/V13a***R>' + document.referrer.replace(/\*/g,'%2a') + '*sup_ru/ru/CP1251/tmsec=lj_mob/37423'; </script> <noscript> <img src="//www.tns-counter.ru/V13a****sup_ru/ru/CP1251/tmsec=lj_mob/37423" width="1" height="1" alt="" /> </noscript> <!--/ tns-counter.ru --> <!-- Yandex.Metrika counter --> <script type="text/javascript"> (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter27737346 = new Ya.Metrika({id:27737346, clickmap:true, trackLinks:true, accurateTrackBounce:true}); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); </script> <noscript><div><img src="//cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> </div> </div> <div class="footer-copy b-strip">© 1999-2024 LiveJournal, Inc.</div> </div> <!--script type="text/ecmascript" src="/es"></script--> </div> </body> </html>