<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог ищущего программиста</title>
	<atom:link href="https://sproger.ru/feed/" rel="self" type="application/rss+xml" />
	<link>https://sproger.ru</link>
	<description>Записки программиста и веб-мастера</description>
	<lastBuildDate>Thu, 10 Feb 2022 20:42:27 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>
	<item>
		<title>Запилил простой Push-сервер на Go</title>
		<link>https://sproger.ru/go-push-server/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Fri, 06 May 2016 19:10:12 +0000</pubDate>
				<category><![CDATA[Проекты]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=498</guid>

					<description><![CDATA[Пару месяцев назад устроился на обычную работу. Больше для дисциплины, но и деньги кончились от двухмесячного валяния дурака. Делаем там внутреннюю систему продвижения собственных сайтов. Довольно много процедур длительных и вынесены в фон. Но красиво же, когда состояние задач обновляется автоматически. Погуглил Websocket comet-серверы. Ничего интересного не нашел. Все какое-то навороченное: с базами данных, кучей [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://sproger.ru/wp-content/uploads/2016/05/server-browser-cometserver.png"><img fetchpriority="high" decoding="async" class="alignleft wp-image-499" src="http://sproger.ru/wp-content/uploads/2016/05/server-browser-cometserver.png" alt="comet (push) server" width="250" height="219" /></a>Пару месяцев назад устроился на обычную работу. Больше для дисциплины, но и деньги кончились от двухмесячного валяния дурака. Делаем там внутреннюю систему продвижения собственных сайтов. Довольно много процедур длительных и вынесены в фон. Но красиво же, когда состояние задач обновляется автоматически. Погуглил Websocket comet-серверы. Ничего интересного не нашел. Все какое-то навороченное: с базами данных, кучей зависимостей. Решил написать свой простенький. Можно было писать на питоне и asyncio, но мне показалось, что такую задачу лучше решить микросервисом на Go. Получилось вроде неплохо. Нужные задачи выполняет хорошо. Хотя есть куда развивать. Итак, собственно сам <a title="Lightweight Go Push-server" href="https://github.com/nikepan/go-push-light" target="_blank" rel="noopener noreferrer">Golang Push-server</a>.</p>
<p>А теперь, как им пользоваться:<span id="more-498"></span></p>
<p>На странице нужно подключить скрипт pusher.js.</p>
<p>А затем подписаться на любое событие:</p>
<blockquote><p>pushSub(&#171;событие&#187;,function(obj) {});</p></blockquote>
<p>В коллбэк передается объект от сервера. Я использую такую маркировку: событие: &#171;канал.приложение.объект[.ид_объекта, если нужен]&#187;. Сервер передает {&#171;id&#187;:123, &#171;status&#187;: &#171;completed&#187;}</p>
<p>Отписаться от события можно с помощью</p>
<blockquote><p>pushUnsub(&#171;событие&#187;);</p></blockquote>
<p>В python/django можно приложениях можно воспользоваться готовым модулем pusher.py:</p>
<blockquote><p>from pusher import push_intent<br />
push_intent(intent, obj)</p></blockquote>
<p>В качестве объекта можно передать строку, словарь, список или ничего. Событие всегда строковое. Сервер находит подписчика на именно это событие и отправляет ему оповещение. В будущем можно будет реализовать маску типа &#171;channel.app.*&#187;.</p>
<p>Теперь, как это работает на более низком уровне:</p>
<p>При загрузке страницы клиент подключается к ws://сервер:8095/sub (порт пока фиксированный) и отправляет:</p>
<blockquote><p>{&#171;op&#187;: &#171;sub&#187;, &#171;intent&#187;: &#171;channelname.taskname.12345&#187;}</p></blockquote>
<p>Сервер пока ничего не возвращает. Если сообщение отправилось, значит подписка активна.</p>
<p>Приложение на сервере просто отправляет post/get запрос:</p>
<blockquote><p>http://сервер:8095/pub?intent=channelname.taskname.12345?obj={&#171;id&#187;:123}</p></blockquote>
<p>И если push-сервер находит подключенного подписанного клиента, отправляет ему сообщение вида:</p>
<blockquote><p>{&#171;op&#187;: &#171;intent&#187;, &#171;intent&#187;: &#171;channelname.taskname.12345&#187;, &#171;obj&#187;: {\&#187;id\&#187;:123}&#187;}</p></blockquote>
<p>При отключении клиента, все его подписки удаляются. Поэтому нужно будет предусмотреть переподключение и переподписывание в JS-библиотеке.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Добавление записей ускоряет рост группы</title>
		<link>https://sproger.ru/smm-group-up/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Mon, 09 Jun 2014 13:47:47 +0000</pubDate>
				<category><![CDATA[SMM]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=494</guid>

					<description><![CDATA[Обратил внимание, что, действительно, как только я добавляю запись в группу, в течении дня -двух происходит небольшой скачок в участников ( в несколько раз от базового роста). Желательно конечно пост короткий и с картинкой. Если же запись оставил кто-то из посетителей, то это никак не отражается на скорости роста.]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignleft size-medium wp-image-495" alt="SMM" src="http://sproger.ru/wp-content/uploads/2014/06/smm-up-300x225.jpg" width="300" height="225" srcset="https://sproger.ru/wp-content/uploads/2014/06/smm-up-300x225.jpg 300w, https://sproger.ru/wp-content/uploads/2014/06/smm-up.jpg 500w" sizes="(max-width: 300px) 100vw, 300px" />Обратил внимание, что, действительно, как только я добавляю запись в группу, в течении дня -двух происходит небольшой скачок в участников ( в несколько раз от базового роста). Желательно конечно пост короткий и с картинкой. Если же запись оставил кто-то из посетителей, то это никак не отражается на скорости роста.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Быстрый memcached для python и django</title>
		<link>https://sproger.ru/fast-memcached-python-django/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Thu, 01 May 2014 16:45:27 +0000</pubDate>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Инструменты]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=470</guid>

					<description><![CDATA[Так получилось, что нагрузка на VDS выросла. Django кушает ресурсов достаточно хорошо. И я переехал на новый. Памяти в нем оказалось 8Гб, что позволило хорошо развернуться. Для разгрузки я раньше использовал memcached и самую распространенную библиотеку для него &#8212; pylibmc &#8212; типовая связка, которая описывается везде. Но как-то для кэширования разовых запросов производительность его по [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://sproger.ru/wp-content/uploads/2014/05/memcached.jpg"><img decoding="async" class="alignleft size-full wp-image-471" alt="memcached" src="http://sproger.ru/wp-content/uploads/2014/05/memcached.jpg" width="240" height="172" /></a>Так получилось, что нагрузка на VDS выросла. Django кушает ресурсов достаточно хорошо. И я переехал на <a title="FastVPS" href="https://bill2fast.com/aff.php?aff=3421" target="_blank" rel="noopener noreferrer">новый</a>. Памяти в нем оказалось 8Гб, что позволило хорошо развернуться. Для разгрузки я раньше использовал memcached и самую распространенную библиотеку для него &#8212; pylibmc &#8212; типовая связка, которая описывается везде. Но как-то для кэширования разовых запросов производительность его по сравнению с кэшем mariaDB меня не устраивала. Запрос из кэша БД выполнялся 0.1-0.5мс (десяток записей), а из мемкэша 0.7-1. Это я замерил полноценно, подключив <a href="http://newrelic.com" target="_blank" rel="noopener noreferrer">New Relic</a> &#8212; замечательное средство мониторинга, но стоит достаточно дорого. Правда есть триальные 2 недели, которыми я и воспользовался.<span id="more-470"></span></p>
<p>Итак. по теме:</p>
<p>Я конечно понимал, что проблема медлительности мемкеша в необходимости постоянных соединений. И решил поискать модуль с пулом. Он нашелся довольно быстро &#8212; <a href="https://pypi.python.org/pypi/django-memcached-pool/0.5" target="_blank" rel="noopener noreferrer">django-memcached-pool</a>. И базируется он на <a href="https://pypi.python.org/pypi/umemcache" target="_blank" rel="noopener noreferrer">umemcache</a>. Вот так все просто оказалось. Самое удивительное, что на русском языке я информации не нашел. Замена модулей дала ускорение memcached до 0.05-0.2мс на тех же данных, что вполне хорошо. Хотя может все это прирост umemcache, так как все на одном сервере.</p>
<p>Подключается все как обычно:</p>
<p><code>pip install django-memcached-pool</code></p>
<p>А в конфигурации джанго-проекта нужно указать:</p>
<p><code> CACHES = {<br />
'default': {<br />
'BACKEND': 'memcachepool.cache.UMemcacheCache',<br />
'LOCATION': '127.0.0.1:11211',<br />
'OPTIONS': {<br />
'MAX_POOL_SIZE': 100,<br />
'BLACKLIST_TIME': 20,<br />
'SOCKET_TIMEOUT': 5,<br />
'MAX_ITEM_SIZE': 1000*100,<br />
}<br />
}<br />
}</code></p>
<p>Когда все устаканилось, я посмотрел на графики. Memcache уже не так выигрывал mysql. Разница в основном за счет запросов с JOINами и некешированных у последнего. На pylibmc среднее было 0.7мс. Пик ближе к концу &#8212; это Cron-задание, нагружающее процессор на максимум. Да и БД подгружает тоже. В итоге использую memcache для разгрузки БД, так как ее время доступа зависит от большего количества факторов. После кэширования части данных, провалов Apdex (процент запросов, укладывающихся в лимит) стало намного меньше.<a href="http://sproger.ru/wp-content/uploads/2014/05/02-05-2014-9-58-494.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-486" alt="mariaDB (mysql) vs memcached" src="http://sproger.ru/wp-content/uploads/2014/05/02-05-2014-9-58-494.png" width="623" height="270" srcset="https://sproger.ru/wp-content/uploads/2014/05/02-05-2014-9-58-494.png 623w, https://sproger.ru/wp-content/uploads/2014/05/02-05-2014-9-58-494-300x130.png 300w" sizes="auto, (max-width: 623px) 100vw, 623px" /></a></p>
<p>Все же основания нагрузка в django на БД и шаблонизатор. Значит, самое основное действие &#8212; увеличение количества ядер. Можно конечно заменить шаблонизатор на jinja, но не особо хочется этого делать. И переписать основные запросы без использования ORM. Если будет не лень, проверю прирост.<a href="http://sproger.ru/wp-content/uploads/2014/05/02-05-2014-10-06-26.png"><img loading="lazy" decoding="async" class=" wp-image-478 alignnone" alt="django-нагрузка: код и БД" src="http://sproger.ru/wp-content/uploads/2014/05/02-05-2014-10-06-26.png" width="541" height="277" srcset="https://sproger.ru/wp-content/uploads/2014/05/02-05-2014-10-06-26.png 773w, https://sproger.ru/wp-content/uploads/2014/05/02-05-2014-10-06-26-300x153.png 300w" sizes="auto, (max-width: 541px) 100vw, 541px" /></a><br />
К слову, пробовал levelDB. Синтетический тест показал почти 100к записей и 350к чтений в секунду. Правда она файловая и не многопоточная. Но для одной задачи, где нужно хранить и обновлять много миллионов записей, а затем получать по ним сводку, вполне подошла. ОЗУ для этой цели не подходит, так как первичное заполнение очень долгое. Пробовал Redis, опять же, почему-то у меня он оказался медленнее mysql. Memcache не подходит в силу того, что это кэш. С тарантулом опять какие-то проблемы с адаптером для питона. Разбираться не стал, отложил до лучших времен. Другие Key-Value пока не пробовал.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Инфобизнес</title>
		<link>https://sproger.ru/infobusiness/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Tue, 08 Apr 2014 19:24:52 +0000</pubDate>
				<category><![CDATA[Мысли]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=465</guid>

					<description><![CDATA[Решил попробовать монетизировать сайт по соционике инфокурсами, которые могут быть интересны аудитории. Полистал каталог JustClick (самая популярная система обслуживания инфобизнеса) и был поражен, в каком состоянии там все находится. Пару дней назад был на конференции Олега Горячо (владельца сервиса), и он сказал, что подавляющее большинство ведут все на коленке. В этом я и убедился. Половина страниц [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://sproger.ru/wp-content/uploads/2014/04/infobusiness.jpg"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-466" alt="Инфобизнес" src="http://sproger.ru/wp-content/uploads/2014/04/infobusiness-300x225.jpg" width="300" height="225" srcset="https://sproger.ru/wp-content/uploads/2014/04/infobusiness-300x225.jpg 300w, https://sproger.ru/wp-content/uploads/2014/04/infobusiness.jpg 401w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Решил попробовать монетизировать сайт по соционике инфокурсами, которые могут быть интересны аудитории. Полистал каталог <a title="JustClick" href="http://www.justclick.ru/?p12948" target="_blank" rel="noopener noreferrer">JustClick</a> (самая популярная система обслуживания инфобизнеса) и был поражен, в каком состоянии там все находится. Пару дней назад был на конференции Олега Горячо (владельца сервиса), и он сказал, что подавляющее большинство ведут все на коленке. В этом я и убедился. Половина страниц не открывается, где-то не удается подписаться. Про дизайн я вообще не говорю. В результате нашел всего несколько достойных курсов. Резюме: ниша еще действительно в зачаточной стадии и можно начать в любой области и добиться успеха при правильном подходе.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Падение сайта победило penguin 2</title>
		<link>https://sproger.ru/site-down-penguin-down/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Wed, 02 Apr 2014 14:52:47 +0000</pubDate>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=452</guid>

					<description><![CDATA[Один из проектов потерял половину трафика гугла с зимним пингвином. Мне тогда не особо до всего этого было &#8212; рыбалки, покатушки. И так получилось, что пришло мне письмо с метрики, что сайт не доступен. Как обычно, на 15 минут, подумал я. Но письмо о доступности так и не пришло. И на следующий день я зашел [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://sproger.ru/wp-content/uploads/2014/04/google_penguin_update1.jpg"><img loading="lazy" decoding="async" class="alignleft  wp-image-458" alt="Google Penguin" src="http://sproger.ru/wp-content/uploads/2014/04/google_penguin_update1-257x300.jpg" width="126" height="147" srcset="https://sproger.ru/wp-content/uploads/2014/04/google_penguin_update1-257x300.jpg 257w, https://sproger.ru/wp-content/uploads/2014/04/google_penguin_update1.jpg 300w" sizes="auto, (max-width: 126px) 100vw, 126px" /></a>Один из проектов потерял половину трафика гугла с зимним пингвином. Мне тогда не особо до всего этого было &#8212; рыбалки, покатушки. И так получилось, что пришло мне письмо с метрики, что сайт не доступен. Как обычно, на 15 минут, подумал я. Но письмо о доступности так и не пришло. И на следующий день я зашел проверить как обстоят дела. Оказалось, WSGI повис (даже есть предположение, что ему помогли). Не особо задумываясь. я перезагрузил сервер и все заработало. После восстановления трафик вернулся на уровень до пингвина. Вот такое возможно совпадение. Трафик с Яндекса остался на прежнем уровне.</p>
<figure id="attachment_456" aria-describedby="caption-attachment-456" style="width: 300px" class="wp-caption aligncenter"><a href="http://sproger.ru/wp-content/uploads/2014/04/02-04-2014-18-42-08.png"><img loading="lazy" decoding="async" class="size-medium wp-image-456 " alt="Трафик сайта" src="http://sproger.ru/wp-content/uploads/2014/04/02-04-2014-18-42-08-300x148.png" width="300" height="148" srcset="https://sproger.ru/wp-content/uploads/2014/04/02-04-2014-18-42-08-300x148.png 300w, https://sproger.ru/wp-content/uploads/2014/04/02-04-2014-18-42-08.png 583w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-456" class="wp-caption-text">Трафик сайта</figcaption></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Текучка Web: Новый проект, старые проекты</title>
		<link>https://sproger.ru/current-2014/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Thu, 20 Mar 2014 15:10:29 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[Новости]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=440</guid>

					<description><![CDATA[Работаю над своим новым интересным проектом. Почему-то меня всегда привлекали базы знаний, и новый проект внутри как раз таковым и должен быть. Но база знаний не в том виде, в котором ее понимают нынешние пользователи интернета (а многим в голову, наверное, сразу приходит википедия), а некая система, получающая исходные данные и выдающая ответ. Интересна она [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://sproger.ru/wp-content/uploads/2014/03/knowledgebase.jpeg"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-443" alt="Knowledge base" src="http://sproger.ru/wp-content/uploads/2014/03/knowledgebase-300x239.jpeg" width="300" height="239" srcset="https://sproger.ru/wp-content/uploads/2014/03/knowledgebase-300x239.jpeg 300w, https://sproger.ru/wp-content/uploads/2014/03/knowledgebase.jpeg 1000w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Работаю над своим новым интересным проектом. Почему-то меня всегда привлекали <strong>базы знаний</strong>, и новый проект внутри как раз таковым и должен быть. Но база знаний не в том виде, в котором ее понимают нынешние пользователи интернета (а многим в голову, наверное, сразу приходит <a title="Википедия" href="http://ru.wikipedia.org" target="_blank" rel="noopener noreferrer">википедия</a>), а некая система, получающая исходные данные и выдающая ответ. Интересна она именно подбором подходящего экспертного ответа. Правда для этой цели есть специальные среды/языки, но я решил, что мне удобнее будет сделать на том, на чем умею.<span id="more-440"></span></p>
<div></div>
<p>Еще учась в вузе, в качестве курсового проекта надо было написать базу знаний. Я набросал на C#, так как мне он был тогда интересен, базу, которая задавая вопросы пользователю о его бизнесе, выдает, какая из конфигураций семейства 1С Предприятия 8 ему нужна. Структура базы была построена на том, что четкой линии вопрос-ответ нет. В зависимости от ответов, задаются новые вопросы. Таким образом результат можно было получить даже через 3 вопроса, если точно знаешь, что тебе нужно. Тему нового проекта писать пока не буду. С запуском еще может много чего поменяться, но объяснить концепт можно в нескольких словах. Это уже вроде бы важно.</p>
<p>Писать решил на Python. Пока это самый удобный язык для меня. А вот фреймворк решил взять полегче &#8212; <strong>Flask</strong>. Изучаю. Пока не особо проникся после django. Все в нескольких файлах &#8212; пиши где что хочешь. В результате постоянно приходится думать где чего написать. В остальном пока все нормально. Админка хорошая. Это наверно самая используемая пока мною часть. Так как большая часть функционала в базе знаний внутри &#8212; расчеты и сопоставления. А ввод и вывод достаточно просты. Тут думаю пригодятся NoSql-системы. Попробую снова внедрить Tarantool. Вроде там уже исправили проблемы описанные мною <a title="Фэйл внедрения Tarantool" href="http://sproger.ru/my-tarantool-try/" target="_blank" rel="noopener noreferrer">ранее</a>. Но в том проекте пока хватает MySql. Здесь же задачи другие и вероятно придется заниматься оптимизацией хранения нужных данных в памяти и доступа к ним. Но  прототип пока на MySql в силу удобства администрирования.</p>
<p>Проект по <a title="Соционика для людей" href="http://mysocio.ru" target="_blank" rel="noopener noreferrer">Соционике</a> иногда допиливаю. Задач там много, трафика для мотивации тоже нормально. Хотя до лидера в рунете в несколько раз не дотягивает. Но народу сайт очень нравится, как и приложение ВК. Самый главный минус этой тематики &#8212; очень плохая монетизация &#8212; аудитория развлекательная по сути и рекламодателей нет. Хотя парочка идей есть, но они требуют активных и достаточно объемных действий, до которых руки никак не доходят.</p>
<p>Сайт расписаний полуживет, и конкурентов с каждым годом появляется все больше. Проблемы у них по сути те же, что и у моего. Хотя некоторые не поленились договориться с вузами и вполне вероятно у них есть будущее. Естественно, самый важный пункт сейчас &#8212; это приложения под смартфоны. И народ это понимает и делает их просто пачками.</p>
<p>Уже 3 месяца <a title="Моя жизнь в Азии" href="http://inindia-panick.blogspot.ru" target="_blank" rel="noopener noreferrer">катаюсь по Азии</a>, точнее больше сижу на месте, чем катаюсь. На 2 месяца завис в Камбодже (Сиануквиль). Вроде бы и заняться здесь нечем, но и сказать, что ничего не происходит нельзя. Постоянно какие-то мелочи и не мелочи приключаются. Но последние недели две вошел более менее в рабочее состояние.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Как завоевать пользователей</title>
		<link>https://sproger.ru/get-users/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Fri, 14 Mar 2014 15:10:03 +0000</pubDate>
				<category><![CDATA[Мысли]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=437</guid>

					<description><![CDATA[Со временем понимаешь, какой бы простой не казалась идея, все равно для ее реализации надо приложить немало усилий. А в нынешнее время это должно отвечать некоторым требованиям: Вовлекаемость &#8212; пользователь должен хотеть поделиться информацией и желательно свести это скорее к отказу от поделиться, чем к позыву. Отмену нажать не сложно, а вот до нужной кнопки [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://sproger.ru/wp-content/uploads/2014/03/popularity.jpeg"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-438" alt="Популярность" src="http://sproger.ru/wp-content/uploads/2014/03/popularity-300x260.jpeg" width="300" height="260" srcset="https://sproger.ru/wp-content/uploads/2014/03/popularity-300x260.jpeg 300w, https://sproger.ru/wp-content/uploads/2014/03/popularity.jpeg 999w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Со временем понимаешь, какой бы простой не казалась идея, все равно для ее реализации надо приложить немало усилий. А в нынешнее время это должно отвечать некоторым требованиям:<span id="more-437"></span></p>
<ul>
<li><strong>Вовлекаемость</strong> &#8212; пользователь должен хотеть поделиться информацией и желательно свести это скорее к отказу от поделиться, чем к позыву. Отмену нажать не сложно, а вот до нужной кнопки пользователь может и не добраться. Но делать надо это уже тогда, когда лояльность пользователя проверена. Примеры в приложениях на смартфонах &#8212; поставить оценку некоторые приложения просят слишком рано, а если вообще не просят, то ставят только те, кого приложение реально эмоционально задело в какую-то сторону.</li>
<li><strong>Дизайн и цепляемость</strong> публичных материалов &#8212; должна быть цитируемость картинок и фраз. Иногда отличный продукт, даже если им делятся, все равно запускают единицы. На примере соционики могу сказать, что наднейеще надо работать и работать. Сейчас людям нужна сильная затравка, чтобы перейти по ссылке. Ссылок слишком много.</li>
<li><strong>Игровой момент</strong> &#8212; пользователь должен сделать действие раньше друга, иногда он может даже пожалеть, что опоздал. В многих играх сейчас есть особенность &#8212; если не зашел вовремя, потерял ресурсы. А когда теряешь потому что друг забрал, интереснее.</li>
<li><strong>Максимальное соотношение результата к действиям</strong> на этапе первого знакомства &#8212; Например пользователю     достаточно нажать всего одну кнопку, чтобы получить надпись &#171;Ты молодец!&#187;, а чтобы получить &#171;Ты Молодец!!!&#187;, нужно нажать кнопку уже 3 раза. При этом у пользователя не должно возникать откровенного ощущения однообразия. В играх эта проблема решается красивой разнообразной анимацией. Например Temple Run 2. Тамвсего 3 действия, а однообразия не возникает, так как в погоне за скоростью, не видишь, что делаешь одно и то же. А вот игрушка про зомби, не помню уже как называется, все время создавала впечатление однообразия. Так как постоянно двигаешься между черных теней и никаких лабиринтов. но при этом она тоже набрала большое количество установок. Правда думаю что мало народу играло в нее больше пары часов.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Фэйл внедрения Tarantool</title>
		<link>https://sproger.ru/my-tarantool-try/</link>
					<comments>https://sproger.ru/my-tarantool-try/#comments</comments>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Fri, 22 Feb 2013 12:08:30 +0000</pubDate>
				<category><![CDATA[django]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Проекты]]></category>
		<category><![CDATA[БД]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=399</guid>

					<description><![CDATA[Делаю сайт по соционике mysocio.ru. Он представляет собой внешнюю справочную часть и внутреннюю социальную. Люди могут типироваться и смотреть друзей, а также следить за изменениями. Платформа Django. Крутится все в данный момент вокруг ВКонтакте. Также имеется приложение для ВК. Самая нагруженная часть, работа с друзьями. Нужно учитывать, что они периодически добавляются и меняют тип. Это [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-400" title="tarantool" src="http://sproger.ru/wp-content/uploads/2013/02/tarantool-300x223.jpg" alt="Тарантул" width="300" height="223" srcset="https://sproger.ru/wp-content/uploads/2013/02/tarantool-300x223.jpg 300w, https://sproger.ru/wp-content/uploads/2013/02/tarantool.jpg 600w" sizes="auto, (max-width: 300px) 100vw, 300px" /> Делаю сайт по соционике <a title="Крутой сайт по соционике" href="http://mysocio.ru" target="_blank" rel="noopener noreferrer">mysocio.ru</a>. Он представляет собой внешнюю справочную часть и внутреннюю социальную. Люди могут типироваться и смотреть друзей, а также следить за изменениями.</p>
<p>Платформа <strong>Django</strong>. Крутится все в данный момент вокруг ВКонтакте. Также имеется приложение для ВК. Самая нагруженная часть, работа с друзьями. Нужно учитывать, что они периодически добавляются и меняют тип. Это надо хранить и отображать по хронологии.<span id="more-399"></span></p>
<p>Сначала сделал все на <strong>MySql</strong>: Создал таблицу пар друзей с необходимой информацией. Пока нормализованную. Но проблема в том, что в эту таблицу самая большая нагрузка на запись и от нее нужно избавляться.</p>
<p>Хотел сделать красиво и решил использовать <strong>NoSql</strong> для этой части. Так как данные должны храниться, решил попробовать Tarantool. Redis не рассматривал, так как по сути они близки, но тарантул типа круче ) Установил все. Нашел адаптер для Python (был только один). Но он оказался слишком простым. Фактически не поддерживались индексы NUM64 и составные первичные ключи (не работает update и delete).</p>
<p>Для проверки сделал полноценную модель друзей на <strong>Tarantool</strong> с указанными выше ограничениями. Хотел было дописать адаптер, но посчитал, во сколько памяти обойдется хранение 1000 пользователей с друзьями. И почему я сразу не посчитал? В общем затея держать списки друзей с именами и типами в памяти провалилась. Одна из причин &#8212; пути к фотографиям из Вконтакте. Из-за них средний кортеж занимал до 300 байт. Если у пользователя в среднем 30 друзей в ВК с приложением, то 30*300= 10кб * 1000 = 10Мб. Вроде немного. Но я рассчитываю хотя бы на 100к аудиторию. Это уже 1Гб.</p>
<p>Далее была идея <strong>кэшировать</strong> только записи о пользователях. Но кэш на то и кэш, что ему не обязательно хранить все. По этой причине и здесь тарантул не подошел. Теоретически подошел конечно, так как можно использовать списки и делать выборку по множеству ключей. Но Memcache с этой задачей справится не намного медленнее. Хотя это нужно будет проводить тесты позже.</p>
<p>Решил пойти простым путем. Писать <strong>json</strong>-ответы ВК с друзьями в отдельную таблицу MySql и при загрузке делать запрос из социальных пользователей по ключам друзей (из MySql). Это конечно медленнее, чем брать все из памяти, но поддается кэшированию.</p>
<p>Правда такой подход не позволяет <strong>сортировать</strong> друзей по дате добавления и изменения типа. А дата добавления у каждой пары своя. Собственно для этих данных Tarantool и может подойти. Но пока решил оставить все на MySql и держать последовательность последних изменений в таблице вместе с json-списками UID друзей. Позже эту таблицу можно будет переложить в память и сделать очередь в Tarantool. Но пока и так все справляется. Основная цель &#8212; хранить необходимые данные с небольшим количеством операций записи, выполнена.</p>
<p>Есть еще вариант использовать <strong>MongoDB</strong> в качестве NoSql для работы с друзьями. Но так как основные данные хранятся в MySql, не хотелось его мешать. С ростом данных и нагрузки, будет виднее.</p>
<p><strong>Выводы:</strong></p>
<ul>
<li>Tarantool хорош, но хранить все данные в памяти часто не оправдано. Было бы хорошо иметь возможность иметь своп (например, месячная аудитория часто меньше 10%). Как вариант, можно реализовать его самому.</li>
<li>Хранить небольшие объемы данных, такие как таблицы соответствия, проще в РСУБД и кэшировать с денормализацией мемкэшем. В основном из-за легкости внедрения. В тарантуле конечно возможностей оперирования данными больше, но и внедрять его сложнее.</li>
<li>Адаптер для Python пока не доделан, что создает сложности при внедрении.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sproger.ru/my-tarantool-try/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Отличия между Percona и MariaDB</title>
		<link>https://sproger.ru/percona-vs-mariadb/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Tue, 23 Oct 2012 17:19:20 +0000</pubDate>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Базы данных]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=389</guid>

					<description><![CDATA[Задался выбором, на что лучше перейти: Percona или MariaDB. Не сказал бы, что у меня высокая нагрузка, но хочется же сидеть на трендовых инструментах. Тем более что в последнее время часто слышу про Перкону. Обнаружил хороший ролик с объяснением их преимуществ перед стандартным MySql и различий между собой. Очень доходчиво описано. Так как по сути [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://sproger.ru/wp-content/uploads/2012/10/percona-xtradb.png"><img loading="lazy" decoding="async" src="http://sproger.ru/wp-content/uploads/2012/10/percona-xtradb.png" alt="percona-xtradb" title="percona-xtradb" width="192" height="192" class="alignleft size-full wp-image-390" srcset="https://sproger.ru/wp-content/uploads/2012/10/percona-xtradb.png 192w, https://sproger.ru/wp-content/uploads/2012/10/percona-xtradb-150x150.png 150w" sizes="auto, (max-width: 192px) 100vw, 192px" /></a>Задался выбором, на что лучше перейти: Percona или MariaDB. Не сказал бы, что у меня высокая нагрузка, но хочется же сидеть на трендовых инструментах. Тем более что в последнее время часто слышу про Перкону. Обнаружил хороший ролик с объяснением их преимуществ перед стандартным MySql и различий между собой. Очень доходчиво описано. Так как по сути это модификации MySql, то они обещают совместимость на уровне файлов.</p>
<p>Еще попробовал облачный сервер от Селектел. Все круто, но по стоимости у меня выходит раза в 2 меньше, чем нынешний VDS, который еще можно во много раз нагрузить. А платить все-таки лучше абонементом, а не считать потраченные мегабайты RAM (которая обходится по сути дороже всего). Прямо вижу, как копейки капают, и жадность просыпается )</p>
<p>Возвращаюсь к серверам БД. В двух словах разница:<span id="more-389"></span></p>
<ul>
<li>Основные улучшения у обеих &#8212; патчи быстродействия, в том числе XtraDB (доработанная InnoDB, но совместимая с ней);</li>
<li>Percona имеет расширенные средства анализа и администрирования. Часть из них входят в Percona Tools и можно подключить даже к MySql. Но некоторые (количество строк обходов), есть только в самом сервере;</li>
<li>MariaDB ушла в сторону оптимизации запросов и добавления новых форматов таблиц и типов данных;</li>
<li>MariaDB идет от старых версий с переработкой фундаментальных алгоритмов. Но разрабатывается создателем MySql. Используется пока мало где;</li>
<li>Percona используется в многих высоконагруженных проектах. </li>
</ul>
<p>А вот и видео с разборам всего по пунктам:</p>
<p><iframe loading="lazy" width="560" height="315" src="http://www.youtube.com/embed/NN4Vb0vORD4" frameborder="0" allowfullscreen></iframe></p>
<p>Для себя пока остановился на Percona. Хоть у нее и нет порта под Windows, но для разработки мне хватит и MySql.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Быстрая генерация sitemap в django</title>
		<link>https://sproger.ru/fast-sitemap-in-django/</link>
		
		<dc:creator><![CDATA[PaNick]]></dc:creator>
		<pubDate>Mon, 22 Oct 2012 21:44:13 +0000</pubDate>
				<category><![CDATA[django]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">http://sproger.ru/?p=365</guid>

					<description><![CDATA[