<?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>StasyakOFF Blog</title>
	<atom:link href="http://stasyak.ru/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://stasyak.ru</link>
	<description>Блог Java-разработчика</description>
	<lastBuildDate>Sun, 08 Jan 2023 18:47:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>Как добавить приложение в Menu на Linux Mint</title>
		<link>http://stasyak.ru/?p=1141</link>
		<comments>http://stasyak.ru/?p=1141#comments</comments>
		<pubDate>Sun, 08 Jan 2023 16:20:43 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Кладовая]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1141</guid>
		<description><![CDATA[Не все приложения, которые нам нужны для работы и отдыха есть в Менеджере программ, некоторые поставляются просто в виде архива со скриптами. Если вы хотите запускать такие программы из Menu, то эта статья для Вас! Рассмотрим процесс настройки на примере JetBrains WebStorm 1. Скачиваем и распаковываем архив в любую удобную нам директорию (в моем случае [...]]]></description>
			<content:encoded><![CDATA[<p>Не все приложения, которые нам нужны для работы и отдыха есть в Менеджере программ, некоторые поставляются просто в виде архива со скриптами.<br />
Если вы хотите запускать такие программы из Menu, то эта статья для Вас!<br />
Рассмотрим процесс настройки на примере JetBrains WebStorm<br />
1. Скачиваем и распаковываем архив в любую удобную нам директорию (в моем случае это будет /home/sy/program/webstorm)<br />
2. Меню устроено так, что каждый пункт имеет свой файл конфигурации. Список пунктов находится в директории /usr/share/applications/<br />
создадим в этой директории пустой файл с названием jetbrains-webstorm.desktop<br />
3. Добавим конфигурацию для WebStorm. Вот пример (можно открыть любой другой файл конфигурации и подсмотреть как настроены различные пункты)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>Desktop Entry<span style="color: #009900;">&#93;</span>
Type<span style="color: #339933;">=</span>Application
<span style="color: #003399;">Name</span><span style="color: #339933;">=</span>JetBrains WebStorm
GenericName<span style="color: #339933;">=</span>JetBrains WebStorm <span style="color: #cc66cc;">223</span>
X<span style="color: #339933;">-</span>GNOME<span style="color: #339933;">-</span>FullName<span style="color: #339933;">=</span>JetBrains WebStorm <span style="color: #cc66cc;">223</span>
Exec<span style="color: #339933;">=/</span>home<span style="color: #339933;">/</span>sy<span style="color: #339933;">/</span>program<span style="color: #339933;">/</span>WebStorm<span style="color: #339933;">-</span>223.8214.51<span style="color: #339933;">/</span>bin<span style="color: #339933;">/</span>webstorm.<span style="color: #006633;">sh</span>
<span style="color: #003399;">Icon</span><span style="color: #339933;">=/</span>home<span style="color: #339933;">/</span>sy<span style="color: #339933;">/</span>program<span style="color: #339933;">/</span>WebStorm<span style="color: #339933;">-</span>223.8214.51<span style="color: #339933;">/</span>bin<span style="color: #339933;">/</span>webstorm.<span style="color: #006633;">png</span>
Comment<span style="color: #339933;">=</span>JetBrains WebStorm <span style="color: #cc66cc;">223</span>
Categories<span style="color: #339933;">=</span>Development<span style="color: #339933;">;</span>
Terminal<span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">false</span>
StartupNotify<span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">true</span>
StartupWMClass<span style="color: #339933;">=</span>jetbrains<span style="color: #339933;">-</span>webstorm</pre></td></tr></table></div>

<p>строка 1: указывает что это конфигурация нового пункта меню<br />
строка 2: тип пункта - запуск приложения<br />
строка 3,4,5: название приложения сделал по аналогии с другими пунктами меню<br />
строка 6: полный путь до исполняемого файла приложения, в моем случае это путь до скрипта bash<br />
строка 7: полный путь до иконки приложения (необязательно, но лучше с иконкой)<br />
строка 8: комментарий, который будет появляться при наведении курсора мышки на наш пункт меню<br />
строка 9: это раздел, в который мы хотим добавить наш пункт, через точку с запятой можно указать несколько разделов и тогда наш пункт меню будет во всех этих разделах<br />
строка 10: признак запуска в терминале - у нас оконное приложение, поэтому false<br />
строка 11: просто скопировал )<br />
строка 12: имя окна которое будет запущено (не уверен, что это обязательный параметр, но названием легко получить<br />
для этого запускаем WebStorm, и в терминале команду<br />
<code>sy@nitro:~/program/WebStorm-223.8214.51/bin$ xprop WM_CLASS</code><br />
и кликаем на заголовок окна WebStorm'a<br />
<code>WM_CLASS(STRING) = "jetbrains-webstorm", "jetbrains-webstorm"</code><br />
выводом будет название окна, которое мы и вписываем в качестве значения параметра StartupWMClass<br />
 )<br />
4. Сохраняем файл jetbrains-webstorm.desktop и наслаждаемся новым пунктом меню<br />
<a href="http://stasyak.ru/wp-content/uploads/2023/01/меню.png"><img src="http://stasyak.ru/wp-content/uploads/2023/01/меню-300x197.png" alt="" title="Вуаля, в меню новый пункт!" width="300" height="197" class="alignleft size-medium wp-image-1143" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1141</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Преобразование mkv файла в mp4</title>
		<link>http://stasyak.ru/?p=1121</link>
		<comments>http://stasyak.ru/?p=1121#comments</comments>
		<pubDate>Thu, 09 Jan 2020 18:41:41 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Обработка видео]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1121</guid>
		<description><![CDATA[mkv отличный формат, только вот обрезать видео в формате mkv в VidCutter 6 - это проблема (у меня процесс сохранения вырезанного кусочка видео то зависал, то программа рапортовала, что сохранен файл размер 0 байт). Пришлось искать способ конвертировать mkv в mp4. С mp4 VidCutter 6 отлично справляется. Вот этот простой способ (естественно ffmpeg должен быть [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1121"></span><br />
mkv отличный формат, только вот обрезать видео в формате mkv в VidCutter 6 - это проблема (у меня процесс сохранения вырезанного кусочка видео то зависал, то программа рапортовала, что сохранен файл размер 0 байт). Пришлось искать способ конвертировать mkv в mp4. С mp4 VidCutter 6 отлично справляется. Вот этот простой способ (естественно ffmpeg должен быть предварительно установлен):<br />
<code>ffmpeg -i input.mkv -codec copy output.mp4</code></p>
<p>Приятного обрезания! <img src='http://stasyak.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1121</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка Grafana в Linux Mint 19</title>
		<link>http://stasyak.ru/?p=1113</link>
		<comments>http://stasyak.ru/?p=1113#comments</comments>
		<pubDate>Tue, 07 Jan 2020 18:55:48 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Ubuntu/Debian/Mint]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1113</guid>
		<description><![CDATA[Последовательность шагов для установки Grafana на машине разработчика: 1. Обновляем информацию о новых версиях установленного ПО в нашем локальном хранилище sudo apt-get update 2. Обновляем ПО до последних версий (это не обязательный шаг, но рекомендуется его сделать, т.к. новые версии ПО могут содержать исправления багов и проблем с безопасностью) sudo apt-get upgrade 3. Добавляем ключ [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1113"></span><br />
Последовательность шагов для установки Grafana на машине разработчика:</p>
<p>1. Обновляем информацию о новых версиях установленного ПО в нашем локальном хранилище<br />
<code>sudo apt-get update</code><br />
2. Обновляем ПО до последних версий (это не обязательный шаг, но рекомендуется его сделать, т.к. новые версии ПО могут содержать исправления багов и проблем с безопасностью)<br />
<code>sudo apt-get upgrade</code><br />
3. Добавляем ключ репозитория для установки Grafana<br />
<code>wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -</code><br />
4. Добавляем репозиторий, из которого будем ставить Grafana ( стабильная версия )<br />
<code>wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -</code><br />
5. Повторяем пункт 1, чтобы подтянулись данные о новом репозитории<br />
6. Ставим Grafana<br />
<code>sudo apt-get install grafana</code><br />
7. В процессе, скрипт установки Grafana любезно предложит поставить Grafana в автозапуск - это опция для серверов, для которых жизненно необходимо чтобы Grafana сама поднималась после перезапуска сервера (в том числе и нештатного).<br />
8. Запускаем Grafana и проверяем статус.<br />
<code><br />
sudo /bin/systemctl start grafana-server<br />
sudo /bin/systemctl status grafana-server<br />
</code><br />
вы должны увидеть что-то вроде этого<br />
<code><br />
$ sudo systemctl status grafana-server<br />
● grafana-server.service - Grafana instance<br />
   Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; disabled; vendor preset: enabled)<br />
   Active: active (running) since Tue 2020-01-07 21:29:19 MSK; 5s ago<br />
     Docs: http://docs.grafana.org<br />
 Main PID: 13788 (grafana-server)<br />
    Tasks: 22 (limit: 4915)<br />
   CGroup: /system.slice/grafana-server.service<br />
           └─13788 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini --pidfile=/var/run/grafana/grafana-server.pid --packaging=deb cfg:default.paths.logs=/var/log/grafana cfg:default.paths.data=/var/lib/grafana<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Initializing InternalMetricsService" logger=server<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Initializing TracingService" logger=server<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Initializing UsageStatsService" logger=server<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Initializing CleanUpService" logger=server<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Initializing NotificationService" logger=server<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Initializing provisioningServiceImpl" logger=server<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Backend rendering via phantomJS" logger=rendering<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=warn msg="phantomJS is deprecated and will be removed in a future release. You should consider migrating from phantomJS to grafana-image-renderer plugin." logger=<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="Initializing Stream Manager"<br />
янв 07 21:29:19 nitro grafana-server[13788]: t=2020-01-07T21:29:19+0300 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket=<br />
</code><br />
9. Проверяем что работает UI, для этого заходим в localhost:3000<br />
Login: admin<br />
Password: admin<br />
10. После авторизации, ui предложит сменить пароль.</p>
<p>Поздравляю, Grafana установлена!</p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1113</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как отключить вход по паролю в Jenkins</title>
		<link>http://stasyak.ru/?p=1103</link>
		<comments>http://stasyak.ru/?p=1103#comments</comments>
		<pubDate>Fri, 06 Dec 2019 17:50:39 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu/Debian/Mint]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1103</guid>
		<description><![CDATA[Проверено на Linux Mint 19 Вход по логину и паролю на локальной машине разработчика не обеспечивает никакой безопасности, но сильно раздражает, т.к. периодически требует авторизоваться заново. Поэтому будет удобно входить в Jenkins без пароля. Для этого необходимо найти файл c настройками: sudo nano /var/lib/jenkins/config.xml и заменить строку &#60;useSecurity&#62;True&#60;/useSecurity&#62; на &#60;useSecurity&#62;False&#60;/useSecurity&#62; и перезагрузить Jenkins (если вы [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1103"></span></p>
<blockquote><p>Проверено на Linux Mint 19</p></blockquote>
<p>Вход по логину и паролю на локальной машине разработчика не обеспечивает никакой безопасности, но сильно раздражает, т.к. периодически требует авторизоваться заново. Поэтому будет удобно входить в Jenkins без пароля. Для этого необходимо найти файл c настройками:</p>
<p><code>sudo nano /var/lib/jenkins/config.xml</code><br />
и заменить строку<br />
<code>&lt;useSecurity&gt;True&lt;/useSecurity&gt;</code><br />
на<br />
<code>&lt;useSecurity&gt;False&lt;/useSecurity&gt;</code></p>
<p>и перезагрузить Jenkins (если вы его просто скачали то остановить и запустить снова)<br />
если Jenkins устанавливался через менеджер пакетов, то выполнить<br />
<code>sudo service jenkins restart</code></p>
<p>теперь Jenkins не будет надоедать вам требованием авторизоваться! </p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1103</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Конвертация vob в mp4 (ubuntu)</title>
		<link>http://stasyak.ru/?p=1059</link>
		<comments>http://stasyak.ru/?p=1059#comments</comments>
		<pubDate>Mon, 21 Mar 2016 14:27:50 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu/Debian/Mint]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1059</guid>
		<description><![CDATA[Было 20 DVD дисков = 80 vob файлов и занимали они 100 Гб места, стало 20 mp4 файлов и занимают они 10 Гб. Эта волшебная команда склеивает vob файлы и сжимает их в mp4. Пример для одного диска: ffmpeg -i concat:&#34;VTS_02_1.VOB&#124;VTS_02_2.VOB&#124;VTS_02_3.VOB&#124;VTS_02_4.VOB&#124;VTS_02_5.VOB&#34; -acodec aac -strict experimental -ac 2 -ab 128k -vcodec libx264 -crf 24 -threads 0 [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1059"></span><br />
Было 20 DVD дисков = 80 vob файлов и занимали они 100 Гб места, стало 20 mp4 файлов и занимают они 10 Гб. Эта волшебная команда склеивает vob файлы и сжимает их в mp4. Пример для одного диска:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ffmpeg</span> <span style="color: #660033;">-i</span> concat:<span style="color: #ff0000;">&quot;VTS_02_1.VOB|VTS_02_2.VOB|VTS_02_3.VOB|VTS_02_4.VOB|VTS_02_5.VOB&quot;</span> <span style="color: #660033;">-acodec</span> aac <span style="color: #660033;">-strict</span> experimental <span style="color: #660033;">-ac</span> <span style="color: #000000;">2</span> <span style="color: #660033;">-ab</span> 128k <span style="color: #660033;">-vcodec</span> libx264 <span style="color: #660033;">-crf</span> <span style="color: #000000;">24</span> <span style="color: #660033;">-threads</span> <span style="color: #000000;">0</span> d1.mp4;</pre></div></div>

<p>На выходе будет файл d1.mp4</p>
<p>Предварительно необходимо установить ffmpeg, если он еще не установлен.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> add-apt-repository ppa:mc3man<span style="color: #000000; font-weight: bold;">/</span>trusty-media <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> update 
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-key</span> adv <span style="color: #660033;">--keyserver</span> keyserver.ubuntu.com <span style="color: #660033;">--recv-keys</span> 8E51A6D660CD88D67D65221D90BD7EACED8E640A
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">ffmpeg</span></pre></div></div>

<p><a href="http://help.ubuntu.ru/wiki/ffmpeg">Подробнее о ffmpeg</a></p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1059</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Семантическое версионирование v2.0</title>
		<link>http://stasyak.ru/?p=1054</link>
		<comments>http://stasyak.ru/?p=1054#comments</comments>
		<pubDate>Mon, 21 Mar 2016 12:52:19 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Разработка ПО]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1054</guid>
		<description><![CDATA[Номер версии представляется как MAJOR.MINOR.PATCH, где увеличивается: 1. MAJOR версия, когда добавляется несовместимое с предыдущей версией api, 2. MINOR версия, когда ты добавляешь обратно-совместимую функциональность, 3. PATCH версия, когда ты добавляешь обратно-совместимое исправление ошибки. Допускается добавление дополнительных меток для предварительного релиза и метаданных о сборке, как расширение формата MAJOR.MINOR.PATCH Введение В мире управления программным обеспечением [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1054"></span><br />
Номер версии представляется как MAJOR.MINOR.PATCH, где увеличивается:<br />
1. MAJOR версия, когда добавляется несовместимое с предыдущей версией api,<br />
2. MINOR версия, когда ты добавляешь обратно-совместимую функциональность,<br />
3. PATCH версия, когда ты добавляешь обратно-совместимое исправление ошибки.<br />
Допускается добавление дополнительных меток для предварительного релиза и метаданных о сборке, как расширение формата MAJOR.MINOR.PATCH</p>
<p><center><br />
<h2><strong>Введение</strong></h2>
<p></center><br />
В мире управления программным обеспечением есть внушающая ужас вещь, под названием "ад зависимостей" (dependency hell). Чем быстрее растет ваша система и чем больше зависимостей от сторонних библиотек она имеет, тем выше вероятность, что, в один прекрасный момент, вы попадете в эту яму отчаяния.<br />
В системах с большим количество зависимостей выпуск новых версий может быстро превратиться в настоящий кошмар.<br />
Для решения этой проблемы предлагается простой набор правил, определяющий, как должны назначаться номера версий. Эти правила основаны (но не ограничены) на, давно используемых, принципах нумерации проприетарного и свободного программного обеспечения. Для использования семантического версионирования необходимо определить публичный API (в виде документации или набора интерфейсов). Это очень важно, т.к. именно по характеру изменений этого API определяется, какую новую версию получит ваше программное обеспечение. </p>
<p><center><br />
<h2><strong>Правила Семантического Версионирования (СВ)</strong></h2>
<p></center></p>
<p>1. Программное обеспечение использующее СВ должно иметь публичный API (в виде документации или набора интерфейсов).</p>
<p>2. Стандартный номер версии должен иметь вид X.Y.Z - где X,Y и Z целые неотрицательные числа и не содержать ведущих нулей (т.е. не допускаются версии вида, например 1.01.0 - правильно 1.1.0). При внесении изменений в ПО должен изменяться один или несколько компонентов версии X, Y или Z. </p>
<p>3. После выпуска новой версии ПО, его содержимое для этой версии не должно меняться.</p>
<p>4. В начале разработки MAJOR версия равно 0, версия имеет вид 0.Y.Z. Публичное API нестабильно. Все изменения API считаются обратно-совместимым, т.е при любом изменении API увеличивается Y компонент.</p>
<p>5. Версия 1.0.0 присваивается публичному API в стабильном состоянии. Фактически в этот момент происходит первый релиз ПО.</p>
<p>6. Z компонент версии (патч-номер версии) должен быть увеличен, только если внесены обратно-совместимые исправления ошибок. Исправление ошибки - это внутреннее изменение, исправляющее некорректное поведение без изменения публичного API. Также он МОЖЕТ увеличиваться при незначительных функциональных улучшениях кода без изменения публичного API.</p>
<p>7. Y компонент версии (минорный номер версии) должен быть увеличен, если добавлена новая обратно-совместимая функциональность в публичный API. Также Y должен быть увеличен если какие-либо функции публичного API помечены как устаревшие. Компонент Y МОЖЕТ увеличиваться, если внесены значительные функциональные улучшения кода без изменения публичного API, при этом Z компонент версии (патч-номер) должен быть сброшен в 0. Если одновременно с улучшениями производились исправления ошибок, то Z компонент версии можно не менять.</p>
<p>8. X компонент версии должен увеличиваться при внесении обратно-несовместимых изменений в публичный API. Если одновременно с этим были обратно-совместимые изменения API и исправление ошибок не меняющих API, то компоненты Y и Z можно не менять. При изменении X компонента, компоненты Y и Z должны быть сброшены в 0.</p>
<p>9. Предрелизные версии могут быть обозначены путем добавления дефиса и идентификаторов, разделенных точкой, сразу после версии патча. Идентификаторы могут содержать только символы из набора [0-9A-Za-z]. Числовые идентификаторы не должны содержать ведущий ноль. Предрелизная версия указывает на то, что соответствующая версия публичного API еще не стабильна. Примеры нумерации: 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92</p>
<p>10. Метаданные сборки могут быть добавлены в конец релизной или предрелизной версии после знака "+". Метаданные сборки - это один или несколько непустых идентификаторов разделенных точкой. Идентификаторы могут содержать только символы из набора [0-9A-Za-z]. При определении старшинства версии метаданные сборки не учитываются, т.е. если 2 версии отличаются только метаданными сборки - эти версии имеют одинаковый приоритет. Пример:  1.0.0-alpha+001, 1.0.0+20130313144700, 1.0.0-beta+exp.sha.5114f85.</p>
<p>11. Старшинство версий должно рассчитываться путем сравнения X, Y, Z. При определении очередности слева направо сравниваются соответствующие компоненты версий. Например: 1.0.0 < 2.0.0 < 2.1.0 < 2.1.1. Когда X, Y и Z версий соответственно равны - смотрим какая из версий является предрелизной, релизная версия всегда старше. Например: 1.0.0-alpha < 1.0.0. Сравнение предрелизных версий производится слева направо, числовые идентификаторы сравниваются как число, а символьные - лексически. Числовые идентификаторы имеют меньший приоритет, чем лексические. Набор из большего количества идентификаторов имеет больший приоритет, чем набор из меньшего количества идентификаторов, при условии что все идентификаторы меньшего набора расположены в том же порядке, что и большего. Например: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0.</p>
<p><center><br />
<h2><strong>Зачем использовать Семантическое Версионирование?</strong></h2>
<p></center></p>
<p>СВ не является новой или революционной идеей и вы, наверняка, использовали что-то похоже. Достаточно ли хорошо это "похожее" работает? Проблема заключается в том, что без формальной спецификации правил, сама идея версионирования, как инструмент управления зависимостями, бесполезна. Определяя четкие правила назначения версий, становится легче доносить до пользователей вашего ПО - как изменилось ПО и что нужно предпринять для эффективного управления зависимостями.</p>
<p>Рассмотрим пример в котором есть приложение "Пожарная машина", которое зависит от библиотеки "Лестница". Библиотека "Лестница" использует семантическое версионирование. Приложение "Пожарная машина" использует библиотеку "Лестница" версии 3.1.0, т.к именно в этой версии были добавлены необходимые приложению функции. Это означает, что мы можем указать для приложения "Пожарная машина" диапазон совместимых версий библиотеки "Лестница" [3.1.0, 4.0.0). Это означает, что если в системе будет библиотека "Лестница" версии 3.1.1 или 3.2.5, то приложение "Пожарная машина" будет работать так же хорошо как и с версией 3.1.0<br />
Однако с версией 4.0.0 и выше приложение может быть уже несовместимо.    </p>
<p>Как ответственный разработчик вы хотели бы быть уверены, что в новой версии ПО именно те изменения, которые декларируются версией... Однако реальный мир несовершенен, и вы ничего не можете с этим поделать, поэтому просто будьте бдительны. Что в ваших силах сделать, так это позволить Семантическому Версионированию дать Вам разумный способ выпускать и обновлять ПО без необходимости обновления всех зависимостей, экономя ваши нервы и время.</p>
<p>Если все это выглядит привлекательно - все что вам нужно сделать - это объявить что вы используете Семантическое Версионирование и начать следовать правилам! Делайте ссылку на этот пост или на оригинальный текст в Вашем README, чтобы пользователи Вашего ПО понимали Вас лучше. </p>
<h2><center><strong>FAQ</strong></center></h2>
<p>&rarr; Как менять версии формата 0.Y.Z на стадии разработки?<br />
&uarr;Самое простое - это начать с версии 0.1.0, а затем увеличивать Y при каждом новом выпуске, т.е. использовать 0.Y.0 (если вам не принципиально что вошло в новую версию, улучшения или исправления ошибок).</p>
<p>&rarr; Как определить что пора выпускать версию 1.0.0?<br />
&uarr;Как только от Вашего ПО начинает зависеть стороннее ПО или пользователи - смело ставьте версию 1.0.0</p>
<p>&rarr; Если даже при малейшем изменении обратной совместимости в публичном API надо увеличивать X компонент версии, не получится ли так что он быстро вырастет до больших значений, например, 42.0.0?<br />
&uarr;Это вопрос планирования и предвидения развития Вашего ПО. При изменении публичного API следует помнить, что это влечет изменение зависимого ПО, что может быть очень затратно с экономической точки зрения.</p>
<p>&rarr; Как удалять из публичного API устаревшие части?<br />
&uarr;Устаревание кода является неотъемлемой частью разработки ПО и часто необходимо для успешного развития. Когда вы помечаете часть публичного ПО, как устаревшее, вам необходимо выпустить минимум один минорный релиз, чтобы переход на новый код был плавным, и подробно описать в документации произведенные изменения.</p>
<p>&rarr; Есть ли ограничение на длину строки версии?<br />
&uarr;Данная спецификация не накладывает никаких ограничений. Просто используйте здравый смысл.</p>
<p>Вольный перевод с дополнениями для <a href="http://semver.org/spec/v2.0.0.html">Оригинал</a></p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1054</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl6 20 лет спустя</title>
		<link>http://stasyak.ru/?p=1051</link>
		<comments>http://stasyak.ru/?p=1051#comments</comments>
		<pubDate>Wed, 30 Dec 2015 15:09:02 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Кладовая]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1051</guid>
		<description><![CDATA[Что такое Perl6? Ответ на этот вопрос довольно сложен. За 20 лет, которые разрабатывался Perl6 изменилось довольно многое и насколько Перл стал современным еще предстоит выяснить. Чисто формально можно сказать что это компилируемый язык (официальный компилятор Rakudo), причем компилируется в промежуточный байт код, способный выполняться на MoarVM и на... JVM. Т.е. мы получили еще один [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1051"></span><br />
Что такое Perl6? Ответ на этот вопрос довольно сложен. За 20 лет, которые разрабатывался Perl6 изменилось довольно многое и насколько Перл стал современным еще предстоит выяснить. Чисто формально можно сказать что это компилируемый язык (официальный компилятор Rakudo), причем компилируется в промежуточный байт код, способный выполняться на MoarVM и на... JVM. Т.е. мы получили еще один язык для написания коды под virtual machine и что особенно приятно - этой VM является JVM. Её насколько я понимаю и рекомендуют использовать разработчики Rakudo.</p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1051</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>В Gnome пропала панель задач</title>
		<link>http://stasyak.ru/?p=1045</link>
		<comments>http://stasyak.ru/?p=1045#comments</comments>
		<pubDate>Fri, 27 Nov 2015 23:00:03 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Кладовая]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1045</guid>
		<description><![CDATA[Панель задач - это полоса внизу окна в которой видны все запущенные вами окна. После очередного обновления системы полоса осталась, а вот окошки при сворачивании начали пропадать непонятно куда, и единственным способом их вытащить было переключаться между ними по Alt+Tab. Это не очень удобно, да и совсем не привычно. Оказалось все вернуть - довольно легко. [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1045"></span><br />
Панель задач - это полоса внизу окна в которой видны все запущенные вами окна. После очередного обновления системы полоса осталась, а вот окошки при сворачивании начали пропадать непонятно куда, и единственным способом их вытащить было переключаться между ними по Alt+Tab. Это не очень удобно, да и совсем не привычно.</p>
<p>Оказалось все вернуть - довольно легко. За отображение в нижней полосе запущенных окошек отвечает апплет Window-List. После apt-get upgrade он почему-то был отключен. Чтобы его вернуть на место надо нажать Alt и кликнуть правой клавишей мыши по нижней полоске - откроется контекстное меню! Выбираем "Добавить на панель", находим в окне со списком апплетов апплет Window-List, выбираем его и нажимаем на кнопку добавить и вуаля! Теперь между окошками можно переключаться с помощью мышки!</p>
<p>Способ почерпнул <a href="http://unix.stackexchange.com/questions/178421/gnome-bottom-task-bar-is-missing-blank-after-upgrade">тут</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1045</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>В Gnome не открывается меню &#8220;Приложения&#8221; (Главное меню)</title>
		<link>http://stasyak.ru/?p=1037</link>
		<comments>http://stasyak.ru/?p=1037#comments</comments>
		<pubDate>Thu, 26 Nov 2015 22:40:36 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu/Debian/Mint]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1037</guid>
		<description><![CDATA[Ubuntu вообще и Gnome в частности все чаще меня расстраивают. Закрадывается подозрение что к их разработке приложили руку специалисты с АвтоВАЗа. В очередной раз вместо того чтобы поработать над сайтом, приходится лезть в глубины убунты и ковыряться, ковыряться и ковыряться... Сегодня мне понадобилась программулина из раздела "Прочие" Главного меню. Я по-привычке нажал в левом верхнем [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1037"></span><br />
Ubuntu вообще и Gnome в частности все чаще меня расстраивают. Закрадывается подозрение что к их разработке приложили руку специалисты с АвтоВАЗа. </p>
<p>В очередной раз вместо того чтобы поработать над сайтом, приходится лезть в глубины убунты и ковыряться, ковыряться и ковыряться...</p>
<p>Сегодня мне понадобилась программулина из раздела "Прочие" Главного меню. Я по-привычке нажал в левом верхнем углу экрана на "Приложения", начал глазами искать раздел "Прочие" и... не нашел. Естественно я открыл редактор Главного меню и увидел, что меню "Прочие" должно отображаться, но его почему-то не было. Вообще логика работы конфигуратора Главного меню такая: если у пункта меню нет активных (с установленной галочкой)  подпунктов, то данный пункт не отображается. В моем случае была целая куча активных подпунктов, но сам пункт не отображался. </p>
<p>Странно подумал я и закрыл редактор. Это было ошибкой, ибо меню "Приложения" перестало открываться целиком. Полазив по интернетам я нашел, что окно для конфигурирования Главного меню запускается командой alacarte:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>moon:~<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">%</span> alacarte                                                                                                                            <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>:05<span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#40;</span>alacarte:<span style="color: #000000;">443</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>: Gtk-CRITICAL <span style="color: #000000; font-weight: bold;">**</span>: gtk_accel_label_set_accel_closure: assertion <span style="color: #ff0000;">'gtk_accel_group_from_accel_closure (accel_closure) != NULL'</span> failed
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#40;</span>alacarte:<span style="color: #000000;">443</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>: Gtk-CRITICAL <span style="color: #000000; font-weight: bold;">**</span>: gtk_accel_label_set_accel_closure: assertion <span style="color: #ff0000;">'gtk_accel_group_from_accel_closure (accel_closure) != NULL'</span> failed
Traceback <span style="color: #7a0874; font-weight: bold;">&#40;</span>most recent call <span style="color: #c20cb9; font-weight: bold;">last</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>:
  File <span style="color: #ff0000;">&quot;/usr/bin/alacarte&quot;</span>, line <span style="color: #000000;">26</span>, <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">&lt;</span>module<span style="color: #000000; font-weight: bold;">&gt;</span>
    main<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
  File <span style="color: #ff0000;">&quot;/usr/share/alacarte/Alacarte/MainWindow.py&quot;</span>, line <span style="color: #000000;">471</span>, <span style="color: #000000; font-weight: bold;">in</span> main
    app.setMenuBasename<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">basename</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
  File <span style="color: #ff0000;">&quot;/usr/share/alacarte/Alacarte/MainWindow.py&quot;</span>, line <span style="color: #000000;">66</span>, <span style="color: #000000; font-weight: bold;">in</span> setMenuBasename
    self.editor = MenuEditor<span style="color: #7a0874; font-weight: bold;">&#40;</span>menu_basename<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  File <span style="color: #ff0000;">&quot;/usr/share/alacarte/Alacarte/MenuEditor.py&quot;</span>, line <span style="color: #000000;">36</span>, <span style="color: #000000; font-weight: bold;">in</span> __init__
    self.load<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
  File <span style="color: #ff0000;">&quot;/usr/share/alacarte/Alacarte/MenuEditor.py&quot;</span>, line <span style="color: #000000;">49</span>, <span style="color: #000000; font-weight: bold;">in</span> load
    <span style="color: #000000; font-weight: bold;">if</span> not self.tree.load_sync<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>:
gi._glib.GError: Ошибка в строке <span style="color: #000000;">1</span> на символе <span style="color: #000000;">1</span>: Документ был пуст или содержал только пробелы</pre></div></div>

<p>А ошибка эта означает что все данные о меню были стерты. Сам файлик с настройками должен называться</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>moon:~<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">%</span> ll ~<span style="color: #000000; font-weight: bold;">/</span>.config<span style="color: #000000; font-weight: bold;">/</span>menus<span style="color: #000000; font-weight: bold;">/</span>gnome-applications.menu</pre></div></div>

<p>но у меня был только этот</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>moon:~<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">%</span> ll ~<span style="color: #000000; font-weight: bold;">/</span>.config<span style="color: #000000; font-weight: bold;">/</span>menus<span style="color: #000000; font-weight: bold;">/</span>gnome-flashback-applications.menu</pre></div></div>

<p>я удалил его (он все равно был пуст) и запустил alacarte повторно. И о чудо! Конфигуратор Главного меню заработал!<br />
Он заработал, но редактирование пунктов меню не давало результатов. Чем хорош линукс так это наличием альтернативных вариантов. В качестве альтернативы alacarte был выбран menulibre.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>moon:~<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> menulibre</pre></div></div>

<p>Кстати, он мне больше понравился, чем alacarte! А чем понравился? Да хотя бы тем, что отображает информацию о запускаемых программах для каждого пункта меню, а также предлагает сохранить изменения меню.<br />
Но и после редактирования Главного меню через menulibre - меню "Приложения" не заработало, что натолкнуло на мысль о необходимости перезагрузки, хотя это очень не характерно для линукса.</p>
<p>И вот перезагружаю и вуаля - менюшка появилась. Не уверен было дело в перезагрузке системы или в смене конфигуратора или в том, что я удалил некоторые пункты, но заработало и слава бубну.</p>
<p>Все манипуляции проделывались в Ubuntu 14.04<br />
Версия Gnome - хз.</p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1037</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Почему иногда пропадают feature в Servicemix</title>
		<link>http://stasyak.ru/?p=1015</link>
		<comments>http://stasyak.ru/?p=1015#comments</comments>
		<pubDate>Mon, 09 Nov 2015 17:19:37 +0000</pubDate>
		<dc:creator>stasyak</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Разработка ПО]]></category>

		<guid isPermaLink="false">http://stasyak.ru/?p=1015</guid>
		<description><![CDATA[Однажды, в самый неподходящий момент, когда срочно надо было проверить работоспособность бандла, я запустил Servicemix и с удивлением обнаружил что ни одной моей фичи(feature) в списке нет. (Список фич можно посмотреть на вкладке Features в Webconsole или командой features:listurl в консоли karaf'a) А что мы делаем в таких случаях? Правильно! Смотрим логи! А в логах [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-1015"></span><br />
Однажды, в самый неподходящий момент, когда срочно надо было проверить работоспособность бандла, я запустил Servicemix и с удивлением обнаружил что ни одной моей фичи(feature) в списке нет. (Список фич можно посмотреть на вкладке Features в Webconsole или командой features:listurl в консоли karaf'a) А что мы делаем в таких случаях? Правильно! Смотрим логи! </p>
<p>А в логах было примерно так:</p>
<blockquote><p>
17:13:50,867 | WARN  | rint Extender: 1 | FeaturesServiceImpl              | 27 - org.apache.karaf.features.core - 2.2.11 | Unable to add features repository mvn:com.example/artefact.deploy/1.0.0-SNAPSHOT/xml/features at startup<br />
java.lang.RuntimeException: URL [mvn:com.example/artefact.deploy/1.0.0-SNAPSHOT/xml/features] could not be resolved.<br />
...
</p></blockquote>
<p>Это было очень подозрительно! Надо было проверить есть ли бандл в локальном репозитарии .m2/repository</p>
<p>Бандл был на месте, в полной сохранности, а значит, это Servicemix почему-то перестал видеть локальный репозитарий maven. Настройки доступа к maven хранятся в директории Servicemix в файле конфигурации etc/org.ops4j.pax.url.mvn.cfg<br />
Беглый осмотр не выявил каких-то явных косяков (правда я не особо-то и разбираюсь в этом файле конфигурации), поэтому решено было включить DEBUG уровень логов и смотреть, где же Servicemix пытается найти мою фичу. К слову сказать, настройки логирования находятся рядышком в etc/org.ops4j.pax.logging.cfg </p>
<p>После перезапуска микса, в логах (data/log/servicemix.log) перед RuntimeException было видно что система пытается найти эту фичу, но по очень странному пути</p>
<blockquote><p>
17:37:10,814 | DEBUG | rint Extender: 2 | Connection                       | 2 - org.ops4j.pax.url.mvn - 1.2.8 |   Could not download [Version [1.0.0-SNAPSHOT] from URL [file:/D:/apache-servicemix-4.5.3/$%7Buser.home%7D/.m2/repository/com/example/artefact/1.0.0-SNAPSHOT/artefact-1.0.0-SNAPSHOT-features.xml]]
</p></blockquote>
<p>Какой-то непонятный локальный url... </p>
<p>Тут сделаем отступление!<br />
В etc/org.ops4j.pax.url.mvn.cfg два параметра отвечают за работу с локальным репозитарием maven'a - это org.ops4j.pax.url.mvn.settings и org.ops4j.pax.url.mvn.localRepository</p>
<p>org.ops4j.pax.url.mvn.settings - это путь к settings.xml maven'a из которого Servicemix берет путь к локальному репозитарию и список maven репозитариев, если этот список явно не определен с помощью параметра org.ops4j.pax.url.mvn.repositories. По умолчанию setting.xml Servicemix ищет в ${user.home}/.m2/settings.xml, затем в ${maven.home}/conf/settings.xml, затем в ${M2_HOME}/conf/settings.xml</p>
<p>org.ops4j.pax.url.mvn.localRepository позволяет указать путь к локальному репозитарию. Значение по-умолчанию System.getProperty( "user.home" ) + "/.m2/repository". Значение по-умолчанию применяется только, если путь к локальному репозитарию не был найден в .m2/settings.xml... </p>
<p>Оба этих параметра у меня закомментированы, т.е. применяются значения по умолчанию. </p>
<p>Тут-то меня и осенило, как я мог поломать видимость локального репозитария maven'a из Servicemix! Я действительно недавно экспериментировал с настройками в .m2/settings.xml и действительно добавил туда:</p>
<blockquote><p>
&lt;localRepository&gt;${user.home}/.m2/repository&lt;/localRepository&gt;
</p></blockquote>
<p>Что же сделал Servicemix после того как я добавил эту строчку в .m2/settings.xml ? Он нашел эту строчку и не стал использовать значение по-умолчанию параметра org.ops4j.pax.url.mvn.localRepository. При этом найти-то он нашел, а вот правильно распарсить не смог. Тут для меня большая загадка, почему у Servicemix не получилось вытащить путь, но проблемы как минимум 2:<br />
1) Servicemix попытался распарсить конструкцию ${user.home} и почему-то не сумел, т.е. у него получилось $%7Buser.home%7D, вместо значения переменной окружения user.home<br />
2) Почему-то в начало пути было добавлено значение переменной окружения SM_HOME (хотя тут я не уверен).</p>
<p>Проблема решилась как только я закомментировал элемент localRepository в .m2/settings.xml !</p>
]]></content:encoded>
			<wfw:commentRss>http://stasyak.ru/?feed=rss2&#038;p=1015</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using apc
Page Caching using apc
Database Caching 10/107 queries in 0.158 seconds using apc
Object Caching 532/652 objects using apc

 Served from: stasyak.ru @ 2026-05-15 06:30:15 by W3 Total Cache -->