<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Puzan's Pages</title><link href="https://puzan.dev/" rel="alternate"></link><link href="https://puzan.dev/feeds/all.atom.xml" rel="self"></link><id>https://puzan.dev/</id><updated>2021-07-23T23:34:18+03:00</updated><entry><title>Kotlin</title><link href="https://puzan.dev/linux/2021-07-23-kotlin.html" rel="alternate"></link><published>2021-07-23T23:34:18+03:00</published><updated>2021-07-23T23:34:18+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2021-07-23:/linux/2021-07-23-kotlin.html</id><summary type="html">&lt;p&gt;&lt;img alt="Kotlin" src="https://puzan.dev/images/2021-07-23-kotlin-title.png" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Данный материал я написал примерно год назад. Была идея переработать его, но сейчас я решил его опубликовать в изначальном виде.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Первое впечатление&lt;/h2&gt;
&lt;p&gt;После перехода в новую компанию оперативно изучил Kotlin. Главная причина — 99% проектов, с которыми связан, используют этот язык. До смены работы Kotlin видел только в докладах на конференциях …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Kotlin" src="https://puzan.dev/images/2021-07-23-kotlin-title.png" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Данный материал я написал примерно год назад. Была идея переработать его, но сейчас я решил его опубликовать в изначальном виде.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Первое впечатление&lt;/h2&gt;
&lt;p&gt;После перехода в новую компанию оперативно изучил Kotlin. Главная причина — 99% проектов, с которыми связан, используют этот язык. До смены работы Kotlin видел только в докладах на конференциях и один раз писал мини-задачки в поезде по дороге с Jpoint 2018. Kotlin освоить легко. Java опыт и увлечение функциональными языками помогают в этом. Я почти влюбился в этот язык. Из-за "влюбился" и "почти", родилась идея записать мысли о Kotlin в этой статье.&lt;/p&gt;
&lt;p&gt;Kotlin чудовищно прагматичный язык. Похоже, каждая синтаксическая конструкция родилась из практических задач, которые приходится решать разработчикам каждый день. Оригинальный конструкций мало — даже затрудняюсь назвать хотя бы одну. У создателей не было задачи удивить мир новыми подходами. Kotlin — это компиляция практик, которые выжили и доказали успех в других языках. Напоминает подходы Apple — найти рабочие решения у конкурентов и соединить в одном идеальном продукте.&lt;/p&gt;
&lt;h2&gt;"Влюбился"&lt;/h2&gt;
&lt;h3&gt;Nullability&lt;/h3&gt;
&lt;p&gt;Когда пишут о Kotlin, в 90% случаях касаются темы Nullability и безопасных программ без NPE. Null safe подходами Kotlin пропитан насквозь. При этом больше впечатляет система типов с Nullable, чем синтаксический сахар, который вырос вокруг не. Прощайте &lt;code&gt;@Nullable&lt;/code&gt;, &lt;code&gt;@NotNull&lt;/code&gt; и, вероятно, &lt;code&gt;@NonNull&lt;/code&gt;! А также решения, построенные на договоренностях, IDE и сторонних плагинах.&lt;/p&gt;
&lt;h3&gt;Перегрузка операторов и конвенции&lt;/h3&gt;
&lt;p&gt;Перегрузка операторов и конвенции позволяют существенно упростить код. Пример, из практики. Есть такая конструкция c &lt;code&gt;DateTime&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isAfter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ее можно, конечно, смело поменять на следующую конструкцию, в попытках что-то сэкономить:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compareTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Но Kotlin дает простой и понятный всем (всем ведь?) вариант:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Посмотрите внимательнее на конвенции, связанные с операторами. Они сократят и улучшат ваш код.&lt;/p&gt;
&lt;h3&gt;DSL&lt;/h3&gt;
&lt;p&gt;Двинемся дальше и чуть-чуть поговорим про DSL. Продают эту тему очень активно. Иногда кажется, что процентов 80% в Kotlin было сделано для DSL. У меня за пару месяцев использования Kotlin появилось дикое желание написать свой DSL для описания BPMN. Язык буквально подталкивает тебя к тому, чтобы все заDSLить. Вот список крутых фич, которые делают Kotlin настолько благоприятным для написания своих DSL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Расширения&lt;/li&gt;
&lt;li&gt;Инфиксные функции&lt;/li&gt;
&lt;li&gt;Перегрузка операторов&lt;/li&gt;
&lt;li&gt;Конвенции — тут еще напомню про get метод&lt;/li&gt;
&lt;li&gt;Вынос lambda за скобки&lt;/li&gt;
&lt;li&gt;Lambda with a receiver&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;И еще немного&lt;/h3&gt;
&lt;p&gt;И еще чуть-чуть про любимые конструкции:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Если все же вернутся к сахару, то &lt;code&gt;?.&lt;/code&gt; и &lt;code&gt;?:&lt;/code&gt; выглядят прекрасно. Отличная компактная замена &lt;code&gt;Optional&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;as?&lt;/code&gt; — безопасность везде, в том числе во время приведения типов.&lt;/li&gt;
&lt;li&gt;Активно продается идея immutability через пропаганду использования &lt;code&gt;val&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Почти все является выражениями: и &lt;code&gt;if&lt;/code&gt;, и &lt;code&gt;when&lt;/code&gt;, и &lt;code&gt;try&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Data классы. Без комментариев.&lt;/li&gt;
&lt;li&gt;А еще замечаешь, что перестал ставить &lt;code&gt;;&lt;/code&gt; в java на автомате.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;"Почти"&lt;/h2&gt;
&lt;p&gt;Перейдем к поведениям, которые вызывают вопросы.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;also&lt;/code&gt; vs &lt;code&gt;apply&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Для начала хочется отметить &lt;code&gt;also&lt;/code&gt; vs &lt;code&gt;apply&lt;/code&gt;. Сама фича &lt;em&gt;lambda with a receiver&lt;/em&gt; очень крутая, но иногда она позволяет изрядно запутать код. В практике столкнулся со следующим. Дано: много сгенерированных java объектов с конструктором без аргументов и толпой getter/setter'ов (в примерах указаны только поля для экономии пространства):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;systemId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Account&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;apply&lt;/code&gt; позволяет вызывать конструктор с инициализацией нужных полей в достаточно компактном стиле:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="py"&gt;account&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Test account&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Выглядит красиво. Но мешанина начинается при инициализации вложенных объектов:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="py"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Test user&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;account&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Test account&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;systemId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Напутать в такой структуре очень легко. Держать в голове, где какой &lt;code&gt;this&lt;/code&gt; непросто. Есть вариант использовать labels, но код становится загроможденным. Можно заметить, что &lt;code&gt;systemId&lt;/code&gt; никакого отношения к Account не имеет, но его смело можно обновлять в ламбде, привязанной к account. Есть &lt;code&gt;DslMarker&lt;/code&gt; для ограничения скоупа, но он подходит в случае, если мы контролируем классы. Это доступно не всегда. Поэтому в таких случаях я считаю лучше использовать &lt;code&gt;also&lt;/code&gt;. Чуть больше кода, но и больше понимания, что происходит.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="py"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Test user&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
        &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Test account&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;systemId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Хочется, чтобы вложенные apply можно было запретить, но, к сожалению, не видел правила в линтере, которое это могло проверять во время сборки (например в detekt).&lt;/p&gt;
&lt;h3&gt;Companion object&lt;/h3&gt;
&lt;p&gt;Очень странный концепт. Существует, на мой взгляд, исключительно для того, чтобы протащить статические методы внутрь классов для полной совместимости с java. Больше похоже на подпорку и выглядит инородно. Есть вероятность, что я пока просто не полностью проникся этой идеей. Хотя есть один пример, в котором мне нравится использование компаньона:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;companion&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KLogging&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Приоритет расширений&lt;/h3&gt;
&lt;p&gt;Немного вводит в замешательство то, что расширения имеют приоритет меньше чем функции в классе. Например:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;member&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;extension&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c1"&gt;// Выведет &amp;quot;member&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Возникают вопросы, так как по определению кажется, что расширения призваны наращивать функциональность. И мое первое ощущение — они должны быть приоритетнее членов класса, так как в любом случае сначала определяется класс, а потом уже расширение к нему. В общем, тут следует помнить, что это не так. И обращайте внимание на предупреждения от IDEA.&lt;/p&gt;
&lt;h3&gt;Kotlin MPP&lt;/h3&gt;
&lt;p&gt;Для меня очень спорная тема. Видимо, я наелся в свое время работой с GWT и у меня автоматом есть некое недоверие к подходу: давайте на всех платформах писать на одном языке. Раньше это была Java, теперь Kotlin. Но с той разницей, что надо собрать все компоненты своими руками. Не совсем понятно как происходит дебаг в браузере — снова плагин или просто source maps? Как вводить новых разработчиков в технологию — сразу учим js и kotlin, android и kotlin и т.д.? Без знания платформы все равно не обойтись.&lt;/p&gt;
&lt;h3&gt;Nullsafe и платформенные типы&lt;/h3&gt;
&lt;p&gt;Стоит помнить, что при вызове Java из Kotlin и Kotlin из Java ничто не гарантирует null-safe на стыке языков. Нету никаких магических проверок и гарантий для не null типов. Что использовать определяем сами. Иногда надо просто довериться java коду и местами использовать не-nullable типы. Отсюда совет — почитываем код библиотек, которые используем.&lt;/p&gt;
&lt;h2&gt;Материалы&lt;/h2&gt;
&lt;p&gt;Пару слов хочется уделить материалам, которые использовал во время знакомства с Kotlin.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org"&gt;kotlinlang.org&lt;/a&gt; - вся информация по языку&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.kotlinlang.org/byExample"&gt;https://play.kotlinlang.org/byExample&lt;/a&gt; - неплохой tutorial для быстрого знакомства с языком&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manning.com/books/kotlin-in-action"&gt;Kotlin in Action&lt;/a&gt; - отличная книга закрывающая все базовые концепции Kotlin. Читал английское издание, воспринимается очень легко.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;И в конце&lt;/h2&gt;
&lt;p&gt;Есть несколько тем, которые я пока обошел стороной. Очень хочется посмотреть, как работают корутины. Также в закладках лежит книга &lt;a href="https://leanpub.com/effectivekotlin"&gt;Effective Kotlin&lt;/a&gt; — надеюсь из нее почерпнуть еще полезные концепции.&lt;/p&gt;
&lt;p&gt;В целом интересно наблюдать, как компания, делающая IDE, наращивает мощь и влияет на мир разработки. Раньше был только софт, помогающий лучше работать с кодом. Теперь новый jvm язык, который стремительно захватывает популярность.&lt;/p&gt;
&lt;p&gt;У меня есть предположение, что Kotlin родился на основе статистики, которая доступна JetBrains через ее IDE. Это богатейший источник для дизайна и развития языка. Нет необходимости доверять мнению людей. Как известно все люди врут, но данные же так не могут. Мысль несколько утрированная, но все же хочется, чтобы Kotlin без остановки развивался и приносил еще больше полезных практических фич.&lt;/p&gt;</content><category term="linux"></category><category term="kotlin"></category></entry><entry><title>WebDav за https proxy</title><link href="https://puzan.dev/linux/2020-06-19-webdav-za-https-proxy.html" rel="alternate"></link><published>2020-06-19T22:55:22+03:00</published><updated>2020-06-19T22:55:22+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2020-06-19:/linux/2020-06-19-webdav-za-https-proxy.html</id><summary type="html">&lt;p&gt;&lt;img alt="Title" src="https://puzan.dev/images/2020-06-19-webdav-proxy-title.png" /&gt;&lt;/p&gt;
&lt;p&gt;Регулярно читаю различную литературу. Зачастую в &lt;em&gt;pdf&lt;/em&gt; формате. &lt;em&gt;Pdf&lt;/em&gt; книги читаю через &lt;a href="TODO add link"&gt;GoodReader&lt;/a&gt; на &lt;em&gt;iPad&lt;/em&gt; (&lt;em&gt;liara&lt;/em&gt;). Постоянно отмечаю и комментирую текст через аннотации, которые сохраняются непосредственно в pdf файл. А для синхронизации книжек использую &lt;em&gt;webdav&lt;/em&gt;, настроенный на домашнем сервере с помощью &lt;em&gt;nginx&lt;/em&gt;. Ранее все крутилось почти на голом &lt;em&gt;CubieBoard&lt;/em&gt; (&lt;em&gt;edi2 …&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Title" src="https://puzan.dev/images/2020-06-19-webdav-proxy-title.png" /&gt;&lt;/p&gt;
&lt;p&gt;Регулярно читаю различную литературу. Зачастую в &lt;em&gt;pdf&lt;/em&gt; формате. &lt;em&gt;Pdf&lt;/em&gt; книги читаю через &lt;a href="TODO add link"&gt;GoodReader&lt;/a&gt; на &lt;em&gt;iPad&lt;/em&gt; (&lt;em&gt;liara&lt;/em&gt;). Постоянно отмечаю и комментирую текст через аннотации, которые сохраняются непосредственно в pdf файл. А для синхронизации книжек использую &lt;em&gt;webdav&lt;/em&gt;, настроенный на домашнем сервере с помощью &lt;em&gt;nginx&lt;/em&gt;. Ранее все крутилось почти на голом &lt;em&gt;CubieBoard&lt;/em&gt; (&lt;em&gt;edi2&lt;/em&gt;), а теперь на &lt;em&gt;HP MicroServer&lt;/em&gt; (&lt;em&gt;edi3&lt;/em&gt;) в контейнерах. В скобках указаны имена девайсов в моей локальной сети. Называю железки по именам героев из &lt;em&gt;Mass Effect&lt;/em&gt;. &lt;em&gt;edi3&lt;/em&gt; — это уже третья реинкарнация моего центрального домашнего сервера.&lt;/p&gt;
&lt;p&gt;Как-то раз я задумал скрыть все сервисы, запущенные на сервере за proxy. Задача proxy сводится к распределению трафика на основе имени домена и поддержке &lt;em&gt;https&lt;/em&gt;. Внутренний (фактически межконтейнерный) трафик остается нешифрованным. Изначально роль proxy выполнял &lt;em&gt;nginx&lt;/em&gt;. На нем же был настроен &lt;em&gt;webdav&lt;/em&gt; для книг. Но достаточно быстро я перешел на &lt;a href="https://fabiolb.net"&gt;&lt;em&gt;Fabio&lt;/em&gt;&lt;/a&gt;. Решение судя по всему не сильно популярное, но гибкое и динамичное. Работает примерно так:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Настройки задаются в labels контейнеров&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gliderlabs/registrator"&gt;&lt;em&gt;Registrator&lt;/em&gt;&lt;/a&gt; копирует информацию в &lt;a href="https://www.consul.io"&gt;&lt;em&gt;consul&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fabiolb.net"&gt;&lt;em&gt;Fabio&lt;/em&gt;&lt;/a&gt; читает данные из &lt;a href="https://www.consul.io"&gt;&lt;em&gt;consul&lt;/em&gt;&lt;/a&gt; и строит Routing Table. Обновления динамические, ничего ребутать или релоудить не надо.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вот пример кусочка &lt;code&gt;docker-compose&lt;/code&gt; для &lt;a href="https://gitea.io"&gt;&lt;em&gt;gitea&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;services:
  gitea:
    image: gitea/gitea:1.11
    labels:
      SERVICE_3000_NAME: gitea
      SERVICE_3000_CHECK_HTTP: /api/v1/version
      SERVICE_3000_CHECK_INTERVAL: 15s
      SERVICE_3000_TAGS: urlprefix-gitea.puzan.info:443/
      SERVICE_22_NAME: gitea-ssh
      SERVICE_22_CHECK_TCP: true
      SERVICE_22_CHECK_INTERVAL: 15s
      SERVICE_22_TAGS: urlprefix-:2222 proto=tcp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Вернемся к &lt;em&gt;webdav&lt;/em&gt;. В этой схеме &lt;em&gt;webdav&lt;/em&gt; переехал в отдельный &lt;em&gt;nginx&lt;/em&gt; (80 порт в контейнере), доступ к которому осуществляется через &lt;a href="https://fabiolb.net"&gt;&lt;em&gt;fabio&lt;/em&gt;&lt;/a&gt; через &lt;em&gt;https&lt;/em&gt; (443 порт на &lt;em&gt;edi3&lt;/em&gt;). Ничего не предвещало беды, но я столкнулся вот с такой ошибкой во время обновления файлов (&lt;em&gt;nginx&lt;/em&gt; лог):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;read_1  | 172.21.0.7 - puzan [18/Jun/2020:20:49:46 +0000] &amp;quot;PROPFIND /current/ HTTP/1.1&amp;quot; 207 2657 &amp;quot;-&amp;quot; &amp;quot;GoodReader&amp;quot;
read_1  | 172.21.0.7 - puzan [18/Jun/2020:20:49:46 +0000] &amp;quot;PUT /current/temp1 HTTP/1.1&amp;quot; 201 0 &amp;quot;-&amp;quot; &amp;quot;GoodReader&amp;quot;
read_1  | 2020/06/18 20:49:46 [error] 6#6: *7 client sent invalid &amp;quot;Destination&amp;quot; header: &amp;quot;https://read.puzan.info/current/some_book.pdf&amp;quot;, client: 172.21.0.7, server: www.read.puzan.info, request: &amp;quot;MOVE /current/temp1 HTTP/1.1&amp;quot;, host: &amp;quot;read.puzan.info&amp;quot;
read_1  | 172.21.0.7 - puzan [18/Jun/2020:20:49:46 +0000] &amp;quot;MOVE /current/temp1 HTTP/1.1&amp;quot; 400 173 &amp;quot;-&amp;quot; &amp;quot;GoodReader&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Как видно сначала происходит поиск файлов через &lt;code&gt;PROPFIND&lt;/code&gt;. Затем выполняется &lt;code&gt;PUT&lt;/code&gt; обновленного файла во временный файл &lt;code&gt;/current/temp1&lt;/code&gt;. Дальше выполняется попытка &lt;code&gt;MOVE&lt;/code&gt;. Но &lt;code&gt;MOVE&lt;/code&gt; выполняется для &lt;code&gt;Destination="https://read.puzan.info/…"&lt;/code&gt;. И как видно &lt;em&gt;nginx&lt;/em&gt; ничего не знает про &lt;em&gt;https&lt;/em&gt; сервис. Тут встает вопрос почему &lt;em&gt;GoodReader&lt;/em&gt; не использует относительные пути. Но это немного другая история, которая не поддается быстрому исправлению.&lt;/p&gt;
&lt;p&gt;Починить проблему на серверной стороне (без поднятия внутренней &lt;em&gt;https&lt;/em&gt; точки) помогает модуль &lt;a href="https://www.nginx.com/resources/wiki/modules/headers_more/"&gt;Headers More&lt;/a&gt;. Суть фикса заключается в том, чтобы переписать значение &lt;code&gt;Destination&lt;/code&gt; заголовка c &lt;code&gt;https://…&lt;/code&gt;, на &lt;code&gt;http://…&lt;/code&gt;. &lt;em&gt;Nginx&lt;/em&gt; конфиг для &lt;em&gt;webdav&lt;/em&gt; теперь у меня выглядит примерно так:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;www.read.puzan.info&lt;/span&gt; &lt;span class="s"&gt;read.puzan.info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;# Rewrite destination header if it starts with https&lt;/span&gt;
        &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$destination&lt;/span&gt; &lt;span class="nv"&gt;$http_destination&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$destination&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;^https://(.+))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$destination&lt;/span&gt; &lt;span class="s"&gt;http://&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;more_set_input_headers&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Destination:&lt;/span&gt; &lt;span class="nv"&gt;$destination&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="s"&gt;/data/read&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;dav_methods&lt;/span&gt; &lt;span class="s"&gt;PUT&lt;/span&gt; &lt;span class="s"&gt;DELETE&lt;/span&gt; &lt;span class="s"&gt;MKCOL&lt;/span&gt; &lt;span class="s"&gt;COPY&lt;/span&gt; &lt;span class="s"&gt;MOVE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;dav_ext_methods&lt;/span&gt; &lt;span class="s"&gt;PROPFIND&lt;/span&gt; &lt;span class="s"&gt;OPTIONS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Установка модуля в &lt;em&gt;debian&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;apt-get install -y nginx libnginx-mod-http-headers-more-filter
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Использую базовый образ &lt;em&gt;debian&lt;/em&gt; в контейнере для webdab, чтобы не искать и собирать нужные &lt;em&gt;nginx&lt;/em&gt; модули (тут есть еще зависимость на &lt;code&gt;dav_ext_module&lt;/code&gt;). Изначально пробовал &lt;em&gt;alpine&lt;/em&gt;, но быстро сдался.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;PS. Решение было найдено на каком-то китайском форуме (ссылку потерял уже), который вывел на &lt;a href="https://serverfault.com/questions/901325/how-to-rewrite-webdav-http-destination-request-header-on-nginx"&gt;идею с перезаписью заголовка&lt;/a&gt;.&lt;/p&gt;</content><category term="linux"></category><category term="webdav"></category><category term="nginx"></category><category term="https"></category></entry><entry><title>Рабочее место</title><link href="https://puzan.dev/misc/2020-06-17-rabochee-mesto.html" rel="alternate"></link><published>2020-06-17T22:35:55+03:00</published><updated>2020-06-17T22:35:55+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2020-06-17:/misc/2020-06-17-rabochee-mesto.html</id><summary type="html">&lt;p&gt;&lt;img alt="Уточки" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/title.png" /&gt;&lt;/p&gt;
&lt;p&gt;Во время карантина я не выдержал и взялся за переоборудование рабочего места. В целом и так все было хорошо — у меня отдельная комната, а-ля кабинет, с оборудованным рабочим местом. До самоизоляции мой рабочий угол представлял собой следующее:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ikea.com/ru/ru/p/hemnes-pismennyy-stol-cherno-korichnevyy-90384796/"&gt;Стол из IKEA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Табуретка из &lt;em&gt;IKEA&lt;/em&gt;. Похожа на &lt;a href="https://www.ikea.com/ru/ru/p/kyurre-taburet-bereza-00420039/"&gt;эту&lt;/a&gt;, но только круглая.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;MacBook …&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Уточки" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/title.png" /&gt;&lt;/p&gt;
&lt;p&gt;Во время карантина я не выдержал и взялся за переоборудование рабочего места. В целом и так все было хорошо — у меня отдельная комната, а-ля кабинет, с оборудованным рабочим местом. До самоизоляции мой рабочий угол представлял собой следующее:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ikea.com/ru/ru/p/hemnes-pismennyy-stol-cherno-korichnevyy-90384796/"&gt;Стол из IKEA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Табуретка из &lt;em&gt;IKEA&lt;/em&gt;. Похожа на &lt;a href="https://www.ikea.com/ru/ru/p/kyurre-taburet-bereza-00420039/"&gt;эту&lt;/a&gt;, но только круглая.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;MacBook Pro 13 Mid 2014&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;iMac 21.5 Mid-2014&lt;/em&gt;, используемый как &lt;em&gt;1080p&lt;/em&gt; дисплей, плюс его родная клавиатура и &lt;em&gt;Apple Magic Mouse&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/old-stuff.png" /&gt;&lt;/p&gt;
&lt;p&gt;Здесь я как работал, так и занимался личными делами (что я вообще делаю кроме работы? 🤪). Так уж сложилось, что на личном ноутбуке я проработал последние лет 5. Существенно привык к такому подходу и научился жестко разделять работу и личные технические увлечения. Но накопились следующие «но»:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;На новой работе, которую я сменил недели за 2 до карантина, выдали &lt;em&gt;MacBook Pro 16 2019&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Я устал от сложнейшего интерфейса переключения &lt;em&gt;iMac&lt;/em&gt; в режим монитора. Сперва надо подключить &lt;em&gt;Thunderbolt&lt;/em&gt; кабель. Потом залогиниться в &lt;em&gt;iMac&lt;/em&gt; со своим аккаунтом, если ранее это не было сделано. И наконец нажать волшебное сочетание клавиш (&lt;code&gt;Fn-Cmd-F2&lt;/code&gt;) на клавиатуре, которая используется только для этого и занимает место на столе.&lt;/li&gt;
&lt;li&gt;Перестал использовать &lt;em&gt;iMac&lt;/em&gt; по прямому назначению — мне уже не нужен еще одни компьютер с &lt;em&gt;macOS&lt;/em&gt;. Особенно после приобретения &lt;em&gt;HP MicroServer&lt;/em&gt;, который в том числе заменил долгий эксперимент с &lt;em&gt;CubieBoard&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В общем пришло время оптимизировать, используемые железки и прибраться на столе. В итоге я прикупил и получил в подарок еще железок. Теперь мой рабочий стол выглядит вот так в рабочее время:&lt;/p&gt;
&lt;p&gt;&lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/job.png" /&gt;&lt;/p&gt;
&lt;p&gt;И вот так вне работы (просто убираю рабочий ноут в сторонку):&lt;/p&gt;
&lt;p&gt;&lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/private.png" /&gt;&lt;/p&gt;
&lt;h2&gt;Монитор&lt;/h2&gt;
&lt;p&gt;Основное изменение — я убрал &lt;em&gt;iMac&lt;/em&gt; и купил монитор &lt;a href="https://www.apple.com/ru/shop/product/HMUA2RU/A/монитор-lg-ultrafine-4k"&gt;&lt;em&gt;LG UltraFine 4k&lt;/em&gt;&lt;/a&gt;. И надо сказать он великолепен. Наконец пропало легкое раздражение из-за того, что ты видишь как расплываются буквы при переводе взгляда с &lt;em&gt;Retina&lt;/em&gt; экрана на &lt;em&gt;1080p&lt;/em&gt;. Были опасения, что старенький &lt;em&gt;MacBook&lt;/em&gt; не потянет &lt;em&gt;4k&lt;/em&gt; картинку. Но все работает отлично. Если и есть какой-то дополнительный лаг, я его не замечаю.&lt;/p&gt;
&lt;p&gt;Из рисков, на которые пошел: высокая цена и исключительно &lt;em&gt;Thunderbolt 3&lt;/em&gt; (&lt;em&gt;USB Type-C&lt;/em&gt;) интерфейсы. Также пришлось докупить переходник с &lt;em&gt;Thunderbolt 2&lt;/em&gt; на &lt;em&gt;Thunderbolt 3&lt;/em&gt; для подключения &lt;em&gt;MacBook’а&lt;/em&gt; 14-го года. Из небольших дополнительных радостей: можно заряжать новый &lt;em&gt;MacBook&lt;/em&gt; от монитора — не нужен еще один провод. На такое же питание я повесил &lt;em&gt;iPad Pro&lt;/em&gt;, который использую как дополнительный экран во время работы для &lt;em&gt;Slack&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;iMac&lt;/em&gt; сначала перекочевал на кухню. На нем с женой на Кинопоиске сериалы смотрели во время еды. Примерно за месяц я нашел ему нового хозяина на &lt;a href="https://www.avito.ru/zhdanovskiy/nastolnye_kompyutery/imac_21.5-inch_mid_2014_8gb_ram_512gb_hdd_1896030615"&gt;авито&lt;/a&gt; - парень с Ямайки, который учится в Нижнем Новгороде. Необычный новый опыт:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;первая продажа на авито&lt;/li&gt;
&lt;li&gt;продажа во время карантина&lt;/li&gt;
&lt;li&gt;покупатель — слабо разговаривающий по-русски чернокожий ямаец&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Клавиатура и тачпад&lt;/h2&gt;
&lt;p&gt;В плане интерфейсов ввода произошли следующие изменения. Я решил, что следует личный ноутбук подвинуть в сторону и поставить на подставку (ее к сожалению пока добыть не удалось). Соответственно возникла необходимость во внешней клавиатуре и тачпаде. От мышек я давно отказался. Ну и &lt;em&gt;Apple Magic Mouse&lt;/em&gt;, которая была в комплекте с &lt;em&gt;iMac&lt;/em&gt;, откровенно ужасна. Тут как тут подоспели мой день рождения и любимая жена с подарком: серый &lt;em&gt;Apple Magic TrackPad&lt;/em&gt;. Он заметно больше встроенного в &lt;em&gt;MacBook Pro 13 Mid 2014&lt;/em&gt;. В плане удобства использования очень похоже на ноутбучный. Я пока экспериментирую с его расположением: то справа от клавиатуры поставлю, то под нее, как на ноутбуке.&lt;/p&gt;
&lt;p&gt;Сначала я достал свою старую клавиатуру &lt;em&gt;Logitech K800&lt;/em&gt;. Но достаточно быстро заказал себе &lt;em&gt;Apple Magic Keyboard&lt;/em&gt;. Очень мне нравиться клавиатура максимально похожая на &lt;em&gt;MacBook’чную&lt;/em&gt;: переключение минимальное и разницу я почти не чувствую. Ну и теперь почти все в темном цвете. Я доволен.&lt;/p&gt;
&lt;h2&gt;Наушники&lt;/h2&gt;
&lt;p&gt;Небольшая история про наушники. Нового ничего не добавилось, но формат использования несколько изменился. Обычно я использую 3-е наушников:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Проводные &lt;em&gt;Apple EarPods&lt;/em&gt; c &lt;em&gt;Lightning&lt;/em&gt; во время прогулок с собакой. Слушаю подкасты и музыку.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Apple AirPods&lt;/em&gt; для звонков и музыки в остальное время&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Bose QuietComfort 35&lt;/em&gt; во время игры в &lt;em&gt;PS4&lt;/em&gt;, чтобы не мешать жене (шумоизоляция в доме очень условная). Ну и во время перелетов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/headphones.png" /&gt;&lt;/p&gt;
&lt;p&gt;В итоге с началом самоизоляции я вдруг понял, что &lt;em&gt;AirPods&lt;/em&gt; сажаются за часовой митинг в ноль. Ранее я такого не замечал, так как использовал наушники недолго и постоянно складывал их в чехол на подзарядку. Также начал замечать низкое качество звука в &lt;em&gt;AirPods’ах&lt;/em&gt;. Наблюдается какое-то дополнительное потрескивание и шуршание — раньше такого не было. В итоге пересел на &lt;em&gt;Bose&lt;/em&gt; как основные наушники для работы и звонков. Но в итоге я начал замечать, что и они тоже умеют разряжаться. Похоже скоро потребуется достать еще проводные наушники с классическим mini jack.&lt;/p&gt;
&lt;h2&gt;Стул&lt;/h2&gt;
&lt;p&gt;Особо больным вопросом был стул. Точнее табуретка. Рабочий день на таком я высидеть могу с трудом. Ну а рабочие месяцы вообще не реально. Тут на помощь также пришла моя любимая жена, которая давно задумала добыть мне качественный стул в кабинет. Были мечты и мысли о &lt;em&gt;Aeron&lt;/em&gt; или &lt;em&gt;Okamura&lt;/em&gt;. Но в итоге решили взять компромиссный более дешевый вариант в онлайн магазине — &lt;a href="https://www.onlinetrade.ru/catalogue/kompyuternye_kresla-c133/metta/kreslo_rukovoditelya_metta_samurai_s_3.03_s_3d_podgolovnikom_chernyy_z302684356-1272099.html"&gt;&lt;em&gt;METTA Samurai S-3.03&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/samurai.png" /&gt;&lt;/p&gt;
&lt;p&gt;Выбор был сделан по наводке из &lt;a href="https://devzen.ru/episode-0260/"&gt;подкаста &lt;em&gt;devzen&lt;/em&gt;&lt;/a&gt;. Стул очень удобный. Регулируется будь здоров. Похоже я впервые в жизни начал сидеть ровно и удобно. Есть маленький вопрос о качестве деталей. Например, подлокотники слегка болтаются. Но это пока не мешает. В целом я очень доволен данному подарку от жены без “примерки”.&lt;/p&gt;
&lt;h2&gt;Работа vs Дом&lt;/h2&gt;
&lt;p&gt;Остается у меня следующий открытый вопрос: как переключаться между «работой» и «домом». Пока я остановился на варианте, который был обозначен на фотографиях в начале: просто закрываю рабочий ноут, отцепляю провод к монитору и двигаю в угол. При этом во время работы я пользуюсь встроенными клавиатурой и тачпадом. Легкого переключения клавиатуры между ноутами пока не нашел, да и так мне пока нравится.&lt;/p&gt;
&lt;p&gt;Также внимательные читатели могли заметить, что во время работы мне полноценно может помочь только валютная уточка 😀. Это конечно сильно помогает сосредоточиться во время работы на зарабатывании денег 💰.&lt;/p&gt;
&lt;h2&gt;Старые рабочие места&lt;/h2&gt;
&lt;p&gt;Пока готовил эту заметку, нашел фотографии моих старых домашних и офисных рабочих мест. Капелька ностальгии в конце.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;~2008 год. Познаю Linux на Студеной еще будучи студентом Физического факультета ННГУ. &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/1-studenaya.jpeg" /&gt;&lt;/li&gt;
&lt;li&gt;2013 год. Работа в ЮАР &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/2-south-africa.jpeg" /&gt;&lt;/li&gt;
&lt;li&gt;2013 год. Какой-то перевалочный пункт (потенциально у родителей) &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/3-somewhere.jpeg" /&gt;&lt;/li&gt;
&lt;li&gt;2014 год. Московское шоссе &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/4-msk-highway.jpeg" /&gt;&lt;/li&gt;
&lt;li&gt;2014 год. Первый запуск &lt;em&gt;iMac&lt;/em&gt; &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/5-imac.jpeg" /&gt;&lt;/li&gt;
&lt;li&gt;2015 год. Работа в &lt;em&gt;InTech&lt;/em&gt; &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/6-intech.jpeg" /&gt;&lt;/li&gt;
&lt;li&gt;2017 год. Деревня Крутая &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/7-krutaya.jpeg" /&gt;&lt;/li&gt;
&lt;li&gt;2020 год. Работа в &lt;em&gt;Qligent&lt;/em&gt; &lt;img alt="600" src="https://puzan.dev/images/2020-06-17-rabochee-mesto/8-qligent.jpeg" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;PS. За коллекцию уточек огромное спасибо моей маме и лучшему другу &lt;a href="https://www.facebook.com/realmapping"&gt;Степе&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"></category><category term="самоизоляция"></category><category term="hardware"></category><category term="mac"></category></entry><entry><title>Жизнь в самоизоляции</title><link href="https://puzan.dev/misc/2020-05-24-zhizn-v-samoizoliatsii.html" rel="alternate"></link><published>2020-05-24T22:05:17+03:00</published><updated>2020-05-24T22:05:17+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2020-05-24:/misc/2020-05-24-zhizn-v-samoizoliatsii.html</id><summary type="html">&lt;p&gt;&lt;img alt="Деревня" src="https://puzan.dev/images/selfisolation-title.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;Со всеми разнообразными событиями в мире моя жизнь не сильно изменилась. Я живу в загородном доме в деревне в 10 километрах от Нижнего Новгорода. У меня есть ежедневная возможность спокойно погулять — привет моему любимому псу! Да и без собаки также не было бы проблем. Я и ранее периодически работал из …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Деревня" src="https://puzan.dev/images/selfisolation-title.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;Со всеми разнообразными событиями в мире моя жизнь не сильно изменилась. Я живу в загородном доме в деревне в 10 километрах от Нижнего Новгорода. У меня есть ежедневная возможность спокойно погулять — привет моему любимому псу! Да и без собаки также не было бы проблем. Я и ранее периодически работал из дома — у меня есть удобный оборудованный личный кабинет. За это спасибо моей любимой жене. Пока не хватает комфортного стула, но я думаю этот вопрос решится в ближайшее время. Захотел отметить пару интересных перемен, на которые я все же обратил внимание. Эта мини заметка посвящена изменениям на кухне.&lt;/p&gt;
&lt;p&gt;Мы с женой начали работать удаленно еще до объявления «Путинских каникулов». Ранее мы обедали в столовых и кафешках, а ужинали на работе едой из дома, приготовленной женой. Подобная хитрая схема помогала нам зачастую разгрузить вечер и реализовывать различные планы. Но это немного другая история. Суть в том, что питание наше было достаточно разнообразным. И откровенно хотелось сохранить это разнообразие не смотря на самоизолированность. А также по возможности сократить поездки в магазин за продуктами — напряженной стала эта процедура.&lt;/p&gt;
&lt;p&gt;В итоге на выручку пришел &lt;a href="https://www.chefmarket.ru"&gt;&lt;em&gt;Шефмаркет&lt;/em&gt;&lt;/a&gt;. Если кто не знает, это очень удобный сервис доставки продуктов для приготовления конкретных блюд. Кухня разнообразная — индийская, европейская, японская, русская. Я думаю можно подобрать меню на любой вкус. Мы с женой берем 5 блюд из Оригинального меню на двоих и нам хватает примерно на неделю. Но мы конечно готовим также и другую еду — иногда все же ездим закупаться в Ашан. Комбинация из &lt;em&gt;Шефмаркета&lt;/em&gt; и домашней еды на текущий момент полностью закрывают наши потребности по питанию. Немаловажно, что доставка к нам в деревню работает без проблем. В итоги мы даже перешли на подписку. Я думаю подержим ее до окончания самоизоляции.&lt;/p&gt;
&lt;p&gt;Но что же тут особенного? Я стал готовить с женой почти каждый день. Для нас это похоже на некий совместный квест или головоломку, которые каждый раз поднимают настроение, так как мы совместно делаем что-то вкусненькое и новенькое. Также я заметил, что чеснок и лук похоже самые главные ингредиенты любого вкусного блюда. Скоро стану профи по мелкому нарезанию этих овощей.&lt;/p&gt;
&lt;p&gt;&lt;img alt="600" src="https://puzan.dev/images/selfisolation-chefmarket.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;В общем совет простой - вливайтесь в тему. Разнообразная и вкусная еда ждет вас. Держите промокод (&lt;a href="https://www.chefmarket.ru/promo/puzan"&gt;puzan&lt;/a&gt;) для получения небольшой скидки на первый заказ.&lt;/p&gt;</content><category term="misc"></category><category term="самоизоляция"></category><category term="еда"></category></entry><entry><title>Параметризованные роли в Ansible</title><link href="https://puzan.dev/linux/2020-05-10-parametrizovannye-roli-v-ansible.html" rel="alternate"></link><published>2020-05-10T13:45:00+03:00</published><updated>2020-05-10T13:45:00+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2020-05-10:/linux/2020-05-10-parametrizovannye-roli-v-ansible.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;Никогда не было и вот снова&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В очередной раз возвращаюсь к своему маленькому бложику. На этот раз после 4-х летнего перерыва. Будем считать на это повлияли смена работы и самоизоляция. Продолжить я решил с небольшой заметки про нежно любимый мной &lt;em&gt;Ansible&lt;/em&gt;. А точнее про его волшебные особенности работы с переменными …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Никогда не было и вот снова&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В очередной раз возвращаюсь к своему маленькому бложику. На этот раз после 4-х летнего перерыва. Будем считать на это повлияли смена работы и самоизоляция. Продолжить я решил с небольшой заметки про нежно любимый мной &lt;em&gt;Ansible&lt;/em&gt;. А точнее про его волшебные особенности работы с переменными и ролями. Мне всегда хотелось видеть в ролях &lt;em&gt;Ansible&lt;/em&gt; жесткую изоляцию. Но это конечно совсем не так. Разберу на примере, то что я имею в виду, основываясь на поведении &lt;em&gt;Ansible 2.9.7&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ansible&lt;/em&gt; я очень активно использовал на работе в &lt;em&gt;Qligent&lt;/em&gt; для автоматизации ручных инструкций по установке продукта. В результате за 3-4 года сформировалась достаточно большая база кастомных ролей и плейбуков. Ну а сейчас я использую &lt;em&gt;Ansible&lt;/em&gt; исключительно для настройки домашнего &lt;em&gt;HP MicroServer&lt;/em&gt;, на котором крутится парочка локальных сервисов в &lt;em&gt;docker&lt;/em&gt; контейнерах. Каждый сервис фактически представляет собой &lt;code&gt;docker-compose.yml&lt;/code&gt;, специфичные конфиги и директории, с которыми он работает.&lt;/p&gt;
&lt;p&gt;Итак, во время написания ролей для локальных сервисов я решил вынести повторяющиеся действия необходимые для инициализации в отдельную роль. Назовем ее &lt;code&gt;puzan_service&lt;/code&gt;. Туда попали:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;создание отдельного пользователя&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert&lt;/code&gt;'ы&lt;/li&gt;
&lt;li&gt;создание директории с именем сервиса&lt;/li&gt;
&lt;li&gt;определение необходимых фактов&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ну и роль сама получила как минимум один параметр, который определяет ее поведение - &lt;code&gt;puzan_service_name&lt;/code&gt;. В упрощенном варианте это имя директории, в которую в последующем копируется &lt;code&gt;compose&lt;/code&gt; файл. Теперь для инициализации сервисов достаточно в &lt;code&gt;meta&lt;/code&gt; добавлять нечто вроде:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;puzan_service&lt;/span&gt;
    &lt;span class="nt"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;puzan_service_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;usefull_service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Примерно тут мои ожидания несколько расходятся с реальностью. Указанный подход отлично работает. Более того на текущий момент похоже это &lt;a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#role-dependencies"&gt;официальный подход&lt;/a&gt; для подключения ролей с параметрами в качестве зависимостей. Но есть нюанс — после выполнения роли в контексте останется переменная &lt;code&gt;puzan_service_name&lt;/code&gt;. В целом может показаться, что это не страшно. Но меня это не устраивает: &lt;code&gt;puzan_service&lt;/code&gt; предназначена для множественного использования, а это значит каждый ее запуск не должен быть связан с предыдущим. В текущем примере &lt;code&gt;puzan_service_name&lt;/code&gt; обязательный параметр и его каждый раз необходимо определять. Но что, если у роли будет еще необязательный параметр или кто-то допустит опечатку в имени переменной? Это приведет к неожиданному поведению и вероятно сложному поиску причины ошибки, так как роль может выполнится со старыми значениями переменных.&lt;/p&gt;
&lt;p&gt;Я начал работать с &lt;em&gt;Ansible&lt;/em&gt; где-то около версии 1.9. И как ни странно там был немного &lt;a href="https://docs.ansible.com/ansible/2.3/playbooks_roles.html#role-dependencies"&gt;другой метод&lt;/a&gt; определения зависимостей с переменными:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;puzan_service&lt;/span&gt;
    &lt;span class="nt"&gt;puzan_service_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;usefull_service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Данный метод также до сих пор работает. Но более удивительно то, что он работает, как я хочу: &lt;code&gt;puzan_service_name&lt;/code&gt; не попадает в глобальный контекст. Я подготовил &lt;a href="https://github.com/puzan/ansible_role_vars_tests"&gt;небольшой репозиторий&lt;/a&gt; с тестами данного поведения. Кроме использования meta &lt;code&gt;dependencies&lt;/code&gt; там также продемонстрирована работа использования ролей в playbook'ах, а также разница поведения &lt;code&gt;import_role&lt;/code&gt; и &lt;code&gt;include_role&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Следует отменить, что из всех конструкций только &lt;code&gt;include_role&lt;/code&gt; на текущий момент имеет явный механизм контроля доступа к переменным снаружи. Это реализовано через &lt;a href="https://docs.ansible.com/ansible/latest/modules/include_role_module.html"&gt;параметр &lt;code&gt;public&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Уже давненько имеются issues на github'е на эту тему:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ansible/ansible/issues/63558"&gt;https://github.com/ansible/ansible/issues/63558&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ansible/ansible/issues/43543"&gt;https://github.com/ansible/ansible/issues/43543&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Исправляться они не спешат. Один из моих PR'ов в ansible, был замержен всего лишь за &lt;a href="https://github.com/ansible/ansible/pull/19073"&gt;3 года&lt;/a&gt;. Поэтому я не думаю, что тут что-то быстро изменится.&lt;/p&gt;
&lt;p&gt;В целом мои рекомендации свозятся к следующему:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используйте только вариант передачи параметров в роль без &lt;code&gt;vars&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Не используйте &lt;code&gt;import_role&lt;/code&gt; и &lt;code&gt;include_role&lt;/code&gt; с &lt;code&gt;public: yes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Есть конечно исключения: &lt;em&gt;В любой непонятной ситуации — думай!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В итоге. Будьте внимательны и пишите больше тестов. Даже на роли в &lt;em&gt;Anisble&lt;/em&gt;. Переменные и факты в &lt;em&gt;Ansible&lt;/em&gt; здоровенная перемешенная куча. &lt;em&gt;Ansible&lt;/em&gt; к сожалению сам не дает никаких явных инструментов по ограничению доступов к ним. Поэтому тут надежда только на Вас самих и на практики, которые вы используете. Ниже небольшая сводка по описанному поведению для версии &lt;em&gt;Ansible&lt;/em&gt; 2.9.7&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Использование в playbook'ах и meta &lt;code&gt;dependencies&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Поведение одинаковое при подключении ролей в playbook'ах и через &lt;code&gt;dependencies&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Без &lt;code&gt;vars&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Playbook пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;- name: Playbook
  hosts: localhost
  roles:
    - role: some_role
      some_role_var: some
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Meta role пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dependencies:
  - role: some_role
    some_role_var: some
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;some_role_var&lt;/code&gt; не доступна во внешнем контексте до и после запуска роли&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;C &lt;code&gt;vars&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Playbook пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;- name: Playbook
  hosts: localhost
  roles:
    - role: some_role
      vars:
        some_role_var: some
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Meta role пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dependencies:
  - role: some_role
    vars:
      some_role_var: some
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;some_role_var&lt;/code&gt; доступна во внешнем контексте до и после запуска роли&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Использование &lt;code&gt;import_role&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;- import_role:
  name: some_role
  vars:
    some_role_var: some
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;some_role_var&lt;/code&gt; доступна во внешнем контексте до и после запуска роли&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Использование &lt;code&gt;include_role&lt;/code&gt; с &lt;code&gt;public: no&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;- include_role:
    name: some_role
    public: no
  vars:
    some_role_var: some
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;some_role_var&lt;/code&gt; не доступна во внешнем контексте до и после запуска роли&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Использование &lt;code&gt;include_role&lt;/code&gt; с &lt;code&gt;public: yes&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;- include_role:
    name: some_role
    public: yes
  vars:
    some_role_var: some
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;some_role_var&lt;/code&gt; не доступна во внешнем контексте до запуска роли, но доступна после.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И в виде таблички:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Кейс&lt;/th&gt;
&lt;th&gt;Переменные до&lt;/th&gt;
&lt;th&gt;Переменные после&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;roles&lt;/code&gt; без &lt;code&gt;vars&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Не доступны&lt;/td&gt;
&lt;td&gt;Не доступны&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;roles&lt;/code&gt; с &lt;code&gt;vars&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Доступны&lt;/td&gt;
&lt;td&gt;Доступны&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;import_role&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Доступны&lt;/td&gt;
&lt;td&gt;Доступны&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_role&lt;/code&gt;, &lt;code&gt;public: no&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Не доступны&lt;/td&gt;
&lt;td&gt;Не доступны&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_role&lt;/code&gt;, &lt;code&gt;public: yes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Не доступны&lt;/td&gt;
&lt;td&gt;Доступны&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="linux"></category><category term="ansible"></category><category term="devops"></category></entry><entry><title>Маленькие тулы</title><link href="https://puzan.dev/linux/2016-04-06-malenkie-tuly.html" rel="alternate"></link><published>2016-04-06T22:25:00+03:00</published><updated>2016-04-06T22:25:00+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2016-04-06:/linux/2016-04-06-malenkie-tuly.html</id><summary type="html">&lt;p&gt;За последние пару недель узнал  несколько маленьких, но удобных тулов. Источники как обычно подкасты (Радио-Т, Разбор Полетов) и бложики.&lt;/p&gt;</summary><content type="html">&lt;p&gt;За последние пару недель узнал  несколько маленьких, но удобных тулов. Источники
как обычно подкасты (&lt;a href="https://radio-t.com"&gt;Радио-Т&lt;/a&gt;, &lt;a href="http://razbor-poletov.com"&gt;Разбор Полетов&lt;/a&gt;) и бложики.&lt;/p&gt;
&lt;h2&gt;Fzf&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Подслушал в &lt;a href="http://razbor-poletov.com"&gt;Разборе Полетов&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Github: &lt;a href="https://github.com/junegunn/fzf"&gt;https://github.com/junegunn/fzf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Данная &lt;a href="https://github.com/junegunn/fzf"&gt;утилита&lt;/a&gt; делает очень удобный поиск по спискам в консоли. Например,
поиск по  истории, по  файлам и  в принципе по  любой информации,  переданной на
стандартный ввод  &lt;code&gt;fzf&lt;/code&gt;.  Для меня очень  удачно &lt;code&gt;fzf&lt;/code&gt; зашла, в  качестве замены
&lt;code&gt;Ctrl-R&lt;/code&gt; в консоли.&lt;/p&gt;
&lt;p&gt;Пользуюсь локально на ноутбуке. Есть интеграция с  &lt;em&gt;tmux&lt;/em&gt;, но я на него так и не
переехал со &lt;em&gt;screen&lt;/em&gt;.  Хотелось бы осуществлять поиск локально, используя данные
с удаленной  машины, но я  плохо представляю  подобную возможность без  танцев с
бубном.&lt;/p&gt;
&lt;h2&gt;Borgbackup&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Прочитал на &lt;a href="http://www.opennet.ru/opennews/art.shtml?num=44000"&gt;OpenNet&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Github: &lt;a href="https://github.com/borgbackup/borg"&gt;https://github.com/borgbackup/borg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Данная     &lt;a href="http://borgbackup.readthedocs.org/en/stable/"&gt;программа     для     бекапов&lt;/a&gt;    скорее     всего     заменит
&lt;a href="https://puzan.dev/linux/2015-02-10-linux-bekapy-na-apple-time-capsule-obnam.html"&gt;&lt;em&gt;obnam&lt;/em&gt; на  моем &lt;em&gt;cubieboard&lt;/em&gt;&lt;/a&gt;.   Бекапы с  помощью &lt;code&gt;borg&lt;/code&gt;  в моих
тестах показали  10-ти кратное преимущество  в скорости по сравнению  с &lt;em&gt;obnam&lt;/em&gt;.
Это меня мелко  сказать восхитило и я планирую как  можно скорее переделать сбор
резервных копий на эту систему.&lt;/p&gt;
&lt;h2&gt;sudolikeaboss&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Подслушал в &lt;a href="https://radio-t.com"&gt;Радио-Т&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Github: &lt;a href="https://github.com/ravenac95/sudolikeaboss"&gt;https://github.com/ravenac95/sudolikeaboss&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ravenac95/sudolikeaboss"&gt;&lt;code&gt;sudolikeaboss&lt;/code&gt;&lt;/a&gt;  —   утилита  позволяющая  вводить   пароли  из
&lt;em&gt;1password&lt;/em&gt; в консоли.  В частности, это очень удобно делать для &lt;em&gt;ssh&lt;/em&gt;, &lt;em&gt;sudo&lt;/em&gt; и
других паролей.  Так  все пароли продолжают лежать в одном  защищенном месте и в
тоже время к ним есть удобный  интерфейс. Все необходимые инструкции можно найти
на &lt;em&gt;github&lt;/em&gt;'е.&lt;/p&gt;</content><category term="linux"></category><category term="shell"></category><category term="backup"></category></entry><entry><title>Docker: Инициализация postgres</title><link href="https://puzan.dev/linux/2015-09-06-docker-initsializatsiia-postgres.html" rel="alternate"></link><published>2015-09-06T00:39:07+03:00</published><updated>2015-09-06T00:39:07+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2015-09-06:/linux/2015-09-06-docker-initsializatsiia-postgres.html</id><summary type="html">&lt;p&gt;Где-то  полгода назад  по личной  инициативе я  стал разворачивать  компоненты в
&lt;strong&gt;docker&lt;/strong&gt; контейнерах для разработки и  тестирования продуктов.  При этом самая
сложная система состояла  из базы данных (&lt;em&gt;postgres&lt;/em&gt;) и  пары &lt;em&gt;tomcat&lt;/em&gt;'ов. Самое
оно  чтобы  попробовать  новую  технологию.   Такой  подход  позволял  в  чем-то
эмулировать production окружение и не засорять рабочую …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Где-то  полгода назад  по личной  инициативе я  стал разворачивать  компоненты в
&lt;strong&gt;docker&lt;/strong&gt; контейнерах для разработки и  тестирования продуктов.  При этом самая
сложная система состояла  из базы данных (&lt;em&gt;postgres&lt;/em&gt;) и  пары &lt;em&gt;tomcat&lt;/em&gt;'ов. Самое
оно  чтобы  попробовать  новую  технологию.   Такой  подход  позволял  в  чем-то
эмулировать production окружение и не засорять рабочую машину.&lt;/p&gt;
&lt;p&gt;В то время я столкнулся с  несколько проблематичным способом инициализации бд из
официального &lt;em&gt;postgres&lt;/em&gt; образа во время  старта контейнера.  Тогда все сводилось
к тому  чтобы написать скрипт, который  стартует &lt;em&gt;postgres&lt;/em&gt; в &lt;em&gt;single&lt;/em&gt;  режиме и
выполняет нужные &lt;em&gt;sql&lt;/em&gt; запросы. Например вот так:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

gosu postgres postgres --single &amp;lt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INIT_SQL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/create-testdb.sql
gosu postgres postgres --single -j testdb &amp;lt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INIT_SQL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/date-db.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Затем скрипт  и &lt;em&gt;sql&lt;/em&gt; файлы  надо было добавить в  контейнер во время  &lt;em&gt;build&lt;/em&gt; в
папочку &lt;code&gt;/docker-entrypoint-initdb.d/&lt;/code&gt;. Пример &lt;em&gt;Dockerfile&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;FROM postgres:9

ENV INIT_SQL /init-sql

COPY init-db.sh /docker-entrypoint-initdb.d/
COPY *.sql ${INIT_SQL}/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;А далее на старте контейнера запускался &lt;em&gt;docker-entrypoint.sh&lt;/em&gt;, который выполнял
все скрипты из &lt;code&gt;/docker-entrypoint-initdb.d/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Это  работало,  но было  очень  не  удобно.   Главная проблема  -  необходимость
запускать &lt;em&gt;postgres&lt;/em&gt;  в &lt;em&gt;single&lt;/em&gt; режиме,  так как на момент  выполнения postgres
еще не  был стартован.  Из-за  этого возникают  ограничения в &lt;em&gt;SQL&lt;/em&gt;  запросах, а
также  невозможно  подложить dump  сделанный  &lt;code&gt;pg_dump&lt;/code&gt;'ом  либо подключиться  с
помощью &lt;code&gt;psql&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Пока   я   собирался  с   мыслями   чтобы   опубликовать  вышеописанный   метод,
&lt;em&gt;docker-entrypoint.sh&lt;/em&gt;   был   &lt;a href="https://github.com/docker-library/postgres/commit/66c7b2dee78980482b83337d16febc4251cb2ae7"&gt;переписан&lt;/a&gt;.   Теперь   на   время
инициализации  базы  запускается полноценный  экземпляр  базы,  с которым  можно
взаимодействовать с помощью &lt;code&gt;psql&lt;/code&gt;. Также появилась возможность создавать базу и
пользователя через определение переменных  окружения. Плюс &lt;em&gt;shell&lt;/em&gt; скрипт теперь
писать     не    обязательно.      Просто    складываем     &lt;em&gt;sql&lt;/em&gt;    файлы     в
&lt;code&gt;/docker-entrypoint-initdb.d/&lt;/code&gt;,    а   они    передаются    на   выполнение    в
&lt;code&gt;psql&lt;/code&gt;. Красотень.&lt;/p&gt;
&lt;p&gt;В конце  хотел бы отметить,  что нынче  технологии развиваются и  меняются очень
быстро.   Надо быть  все  время  на чеку.   По  идее  вышеописанные изменения  в
&lt;em&gt;docker-entrypoint.sh&lt;/em&gt;  для   &lt;em&gt;postgres&lt;/em&gt;  образа  могут  привести   к  вероятным
проблемам    (особенно     если    ранее    &lt;em&gt;sql&lt;/em&gt;    скрипты     складывали    в
&lt;code&gt;/docker-entrypoint-initdb.d/&lt;/code&gt;   папку),  а   вот   версионирования  образов   в
зависимости от изменения  &lt;em&gt;Dockerfile&lt;/em&gt; на &lt;a href="https://hub.docker.com/"&gt;хабе&lt;/a&gt; нету.  Отсюда  вывод - без
своего  &lt;em&gt;docker  registry&lt;/em&gt; никак  не  обойтись  и  на  внешние образы  лучше  не
надеяться.&lt;/p&gt;</content><category term="linux"></category><category term="docker"></category><category term="database"></category><category term="postgresql"></category></entry><entry><title>Операционные системы?</title><link href="https://puzan.dev/linux/2015-05-04-operatsionnye-sistemy.html" rel="alternate"></link><published>2015-05-04T19:25:00+03:00</published><updated>2015-05-04T19:25:00+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2015-05-04:/linux/2015-05-04-operatsionnye-sistemy.html</id><summary type="html">&lt;p&gt;Возникло у  меня несдержимое желание  написать про свое отношение  к современным
операционным  системам.   Этакое  лирическое   отступление.   Один  из  мотивов:
структурировать  информацию и  самому  разобраться, что  мне  больше нравится  в
каждой из  ОС.  Но похоже получился  некий экскурс в историю  моего знакомства с
операционными   системами.   Есть   малая   надежда,  что   кому-то  это …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Возникло у  меня несдержимое желание  написать про свое отношение  к современным
операционным  системам.   Этакое  лирическое   отступление.   Один  из  мотивов:
структурировать  информацию и  самому  разобраться, что  мне  больше нравится  в
каждой из  ОС.  Но похоже получился  некий экскурс в историю  моего знакомства с
операционными   системами.   Есть   малая   надежда,  что   кому-то  это   будет
интересно. Ну  по крайней мере я  получил огромное удовольствие от  набора этого
текста.&lt;/p&gt;
&lt;h2&gt;Windows&lt;/h2&gt;
&lt;p&gt;Начну пожалуй с  &lt;em&gt;Windows&lt;/em&gt;.  Это похоже первая система с  которой я столкнулся в
жизни.  Возможно  я сначала  видел &lt;em&gt;DOS&lt;/em&gt;,  но не осозновал  еще этого,  мал был.
Сейчас  я счастлив,  что почти  нигде не  вижу «окна»  вокруг себя.   Я перестал
вообще понимать, как живет этот далекий  от меня «оконный» мир.  &lt;em&gt;Windows&lt;/em&gt; добил
меня в свое  время очередным синим экраном. После этого  месяц в консоли &lt;em&gt;Linux&lt;/em&gt;
казался  раем.  Да,  я  похоже  малясь извращенец.   В  то  время я  пользовался
&lt;a href="https://www.google.ru/search?q=pidgin+finch&amp;amp;newwindow=1&amp;amp;rls=en&amp;amp;biw=1343&amp;amp;bih=922&amp;amp;tbm=isch&amp;amp;tbo=u&amp;amp;source=univ&amp;amp;sa=X&amp;amp;ei=SJBHVZmFKoaLsAGNu4B4&amp;amp;ved=0CC8QsAQ"&gt;&lt;em&gt;pidgin&lt;/em&gt; в  консольном режиме&lt;/a&gt; (на базе  &lt;em&gt;ncurces&lt;/em&gt;) и был в  восторге от
подобных интерфейсов.&lt;/p&gt;
&lt;p&gt;Как-то я  сильно ухожу от  того, что конкретно  мне не нравилось  в операционной
системе от &lt;em&gt;Microsoft&lt;/em&gt;. Но при  этом с наслаждением вспоминаю, как заканчивалось
наше с  ней общение. Будучи студентом  физического факультета я видимо  не видел
какой-то  академичности в  &lt;em&gt;Windows&lt;/em&gt;.   Точнее я  видел ее  в  &lt;em&gt;Unix&lt;/em&gt; мире.   Он
завораживал своей открытостью, а  понимать, как устроены внутренности &lt;em&gt;Windows&lt;/em&gt;,
становилось  все сложеннее.   Но, судя  по статистике,  мои стремления  мало кто
разделял на факультете.&lt;/p&gt;
&lt;p&gt;Также шагу в сторону &lt;em&gt;Unix&lt;/em&gt; систем поспособствовало мое воспитание.  Меня всегда
коребило  от использования  нелицензионного ПО.   Это как  бы сказать  слегка не
правильно &lt;code&gt;:)&lt;/code&gt;.   Мир &lt;em&gt;Open Source&lt;/em&gt;  же открыл  огромные границы для  познания и
развития без борьбы  с моральными устоями. Я и сейчас  не понимаю людей, которые
работая  в   сфере  разработки  компьютерного  обеспечения   открыто  используют
«крякнутые» продукты.   Мне кажется, что  это сравнимо с подпиливанием  ветки на
которой сидишь.&lt;/p&gt;
&lt;p&gt;Опыт программирования  в &lt;em&gt;Windows&lt;/em&gt; у  меня был  совсем невелик.  Основное  — это
&lt;em&gt;Delphi&lt;/em&gt; и немного  &lt;em&gt;C++&lt;/em&gt;. Слишком там все пестрило окошками  и интерфейсами. Но
почти никто не учил писать консольные или серверные приложения без &lt;em&gt;GUI&lt;/em&gt;.  Кроме
того ядро системы было тесно  переплетено с графической подсистемой (сейчас ведь
что-то поменялось?).   Вообще дикостью было открывать  ужасную &lt;em&gt;Windows&lt;/em&gt; консоль
(как  там  она  называлась?).   И  &lt;em&gt;WinAPI&lt;/em&gt;  я  так  и  не  познал.   А  строить
пользовательские интерфейсы, я уже тогда понял, совсем не мое.&lt;/p&gt;
&lt;p&gt;Но при всем при этом надо отдать должное разработчикам и менеджерам &lt;em&gt;Microsoft&lt;/em&gt;.
Они  можно  сказать полностью  захватили  рынок  персональных компьютеров.   Для
среднестатистического  пользователя —  это  видимо идеальная  система. Там  были
(сейчас не уверен, не знаю) удобные графические интерфейсы для своего времени. И
самое главное это офисная система. &lt;em&gt;Microsoft  Office&lt;/em&gt; это как не крути стандарт
де-факто в документообороте. В этом сигменте ближайшие конкуренты очень далеко.&lt;/p&gt;
&lt;p&gt;Еще один из недостатков &lt;em&gt;Windows&lt;/em&gt;: я никогда  не понимал, как там все устроено в
нутрях. Если я увидел синий экран смерти, то что это значит? Как найти проблему?
Где логи?  Почему не запускается очередная  программа? Эти вопросы были для меня
загадкой.   Решение  большинства  проблем:   перезагрузка,  а  в  худшем  случае
переустановка системы.  Как разобраться и  решить возникающие проблемы я не знал
(вру конечно, как-то  ведь жили).  Абсолютно противоположная  ситуация в &lt;em&gt;Linux&lt;/em&gt;
мире. На мой взгляд конечно.&lt;/p&gt;
&lt;h2&gt;Linux&lt;/h2&gt;
&lt;p&gt;Выше  уже   упоминал,  как   сел  на  &lt;em&gt;Linux&lt;/em&gt;.    Помню  даже   подписывался  на
&lt;a href="http://www.linuxformat.ru"&gt;&lt;em&gt;LinuxFormat&lt;/em&gt;&lt;/a&gt; дабы  познавать истину.  С интернетом  похоже тогда
еще был напряг.  Познавал &lt;em&gt;Linux&lt;/em&gt;  в консоли, больше как системный администратор
(хотя  таким себя  никогда не  считал и  на подобной  должности не  работал).  В
&lt;em&gt;Gentoo&lt;/em&gt; разбирался,  что как  устроено.  Узнавал зачем  существует определенный
сервис,  как раздавать  интернет  в домашней  сети, как  поднять  иксы на  своей
древней видеокарте и зачем все же нужно  это волшебное ядро. Примерно в то время
я перестал играть и начал копить на &lt;em&gt;Xbox&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Далее хочу  рассказать несколько примеров  общения с &lt;em&gt;Open  Source&lt;/em&gt; программами,
которые  достаточно сильно  меня  впечатлили. Нельзя  конечно  сказать, что  это
как-то сильно  связано с  &lt;em&gt;Linux&lt;/em&gt;, но  именно он  дал мне  возможность повернуть
сознание несколько в другую сторону.&lt;/p&gt;
&lt;p&gt;Сначала пару слов про &lt;em&gt;OpenOffice&lt;/em&gt;. Так  уж сложилось, что во время учебы многие
работы необходимо было оформлять в  формате &lt;em&gt;Microsoft Office&lt;/em&gt;. Как альтернативу
я начал использовать  указанный выше открытый офисный продукт.   В нем впечатлил
подход  форматирования  текста,   который  на  первый  план   ставит  работу  со
стилями. Там без этого было проблематично.  Да в &lt;em&gt;Office&lt;/em&gt; от &lt;em&gt;Mircosoft&lt;/em&gt; конечно
же  есть  подобная функция  и  сейчас  насколько  знаю она  реализована  намного
лучше. Но было время, когда про стили в офисе знали не многие (хотя думаю сейчас
тоже ситуация  не лучше).   В результате мы  имели гигантские  файлы диссертаций
отформатированные  полуручным способом.   &lt;em&gt;OpenOffice&lt;/em&gt; же  научил меня  грамотно
пользоваться стилями и не связывать  контент с форматированием.  Апофеозом этого
подхода стала  моя магистерская  диссертация, которую  я полностью  подготовил в
&lt;em&gt;LaTeX&lt;/em&gt;.  Это  был мой своеобразный  протест против офисных пакетов,  которые на
факультете использовали  как универсальные инструменты  в том числе  для научных
измерений (при этом я говорю про &lt;em&gt;Word&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Во время курса программирования на &lt;em&gt;C++&lt;/em&gt;  я опять же устроил некое подобие бунта
и  выполнял работу  на &lt;em&gt;Linux&lt;/em&gt;,  который грузил  с флешки.   По-моему, эта  была
&lt;em&gt;Fedora&lt;/em&gt;.  Финальный проект моделирования сделал на &lt;em&gt;Qt&lt;/em&gt;.  Во время сдачи работы
преподаватель  спрашивал меня:  «Зачем  ты все  делаешь в  этой  системе? Ты  же
придешь  в будущем  на работу  и там  везде будет  &lt;em&gt;Windows&lt;/em&gt; и  все твои  умения
окажутся напрасными».  На это  я отвечал, что «&lt;em&gt;Qt&lt;/em&gt; и то  что было мной написано
вполне  себе  кроссплатформенно,  в  отличии   от  того,  что  представляли  мои
однокурсники.   На  работе  я  буду  пользоваться &lt;em&gt;Linux&lt;/em&gt;.   А  если  там  будет
&lt;em&gt;Windows&lt;/em&gt;, то либо  поменяем его на &lt;em&gt;Linux&lt;/em&gt;, либо уйду  на другую работу». Тадам
тадам, конечно  же я  сейчас работаю  рядышком с &lt;em&gt;Linux&lt;/em&gt;,  и как  указывал выше,
&lt;em&gt;Windows&lt;/em&gt; вижу достаточно редко.&lt;/p&gt;
&lt;p&gt;В середине обучения на  физфаке на один из дней рождения  мой друг Шурик подарил
мне                   старенький                  офисный                   комп
(&lt;a href="https://puzan.dev/linux/2015-02-21-kuda-otdat-kompiutery.html"&gt;в соседнем посте  я ищу ему нового хозяина&lt;/a&gt;). Из  этого компа я сделал
нечто вроде домашнего  сервачка. На нем был развернуто куча  сервисов. С помощью
&lt;em&gt;gitolite&lt;/em&gt;  организовано хранилище  &lt;em&gt;git&lt;/em&gt;-овых репозиториев,  а до  этого еще  и
&lt;em&gt;svn&lt;/em&gt;.  Кроме того,  он представлял из себе и некую  файловую помойку, доступную
через &lt;em&gt;samba&lt;/em&gt;, а также пропускал через  себя весь домашний трафик и был доступен
для  моих  нужды  из  внешней  сети.   Много  я  на  нем  игрался  с  различными
сервисами. В итоге он стал таким пухленьким роутером, который включал в себя еще
больше. Суть этого абзаца  в следующем. Пока я разбирался как  это все поднять и
настроить, я изучил многие сетевые технологии  и стеки протоколов, про которые я
раньше  ничего  не  знал.   В  итоге  смог хорошо  себя  проявить  на  работе  —
фундаментальных  знаний по  информационным технологиям  у меня  было мало,  но я
вышел на практике.&lt;/p&gt;
&lt;p&gt;Если  вернуться  все  же  конкретно   к  &lt;em&gt;Linux&lt;/em&gt;,  то  лучшими  качествами  этой
операционной системы  все же  являются ее серверные  функции. Все,  что касается
графики и  desktop в &lt;em&gt;Linux&lt;/em&gt;,  зачастую сильно  перегружено и далеко  от чувства
прекрасного.  Графические  интерфейсы выполненные в инженерном  дизайне не часто
мешают работе, но вот глаза от них постоянно болят.&lt;/p&gt;
&lt;p&gt;Про блеск и нищету &lt;em&gt;Open Source&lt;/em&gt;. Когда-то  я любил &lt;em&gt;KDE&lt;/em&gt;.  Помню как 3-я версия
двигалась к стабилизации и пришла к ней.  Это был достаточно долгий путь.  И я с
удовольствием  пользовался &lt;em&gt;KDE&lt;/em&gt;.  Я  даже репортил  какой-то  минорный баг.  Но
пришла &lt;em&gt;KDE  4&lt;/em&gt; и тут  все поплыло.  Снова  кучи багов, нестабильная  работа.  В
результате я  долго еще  сидел на  3-ей версии.   По-моему, до  тех пор  пока не
обновил  компьютер.  К  этому  времени из  портов &lt;em&gt;Gentoo&lt;/em&gt;  &lt;em&gt;KDE  3&lt;/em&gt; уже  успели
убрать.  Даже пробовал форки, но что-то пошло не так. Это все к тому, что вообще
говоря  в этом  волшебном мире  свободы никто  ничего не  гарантирует. Да  можно
исправить что-то  самому, но  готовы ли  вы сами  поддерживать в  одиночку целую
систему?   А  когда  захочется  новых  фичей  все  это  вмержить  и  переписать?
Печально, когда  курс проекта уходит,  от того, что  хотелось бы именно  тебе, а
единомышленников ты не  смог найти.  Кроме того, мейтенер  может просто потерять
интерес к проекту, а другого разработчика просто не найтись.&lt;/p&gt;
&lt;p&gt;Я не  хочу сказать, что  &lt;em&gt;Open Source&lt;/em&gt; — это  беда. Нет, наоборот,  это чудесный
результат человеческого  сообщества, результат  дружбы и бескорыстия.   Я иногда
поражаюсь, что в  нашем мире подобное возможно. Надо просто  иметь ввиду, что во
всем есть  свои подводные  камни и надо  их знать.  А  то, что  крупные компаний
поддерживают множество открытых проектов —  это просто великолепно.  Без &lt;em&gt;Linux&lt;/em&gt;
теперь как ни крути никуда.&lt;/p&gt;
&lt;h2&gt;OS X&lt;/h2&gt;
&lt;p&gt;С  друзьями недавно  смеялся на  тему  выбора очередного  телефона. Будучи  ярым
любителем   &lt;em&gt;Linux&lt;/em&gt;    и   открытых    систем,   я   около    года   использовал
&lt;a href="http://en.wikipedia.org/wiki/Nokia_N900"&gt;Nokia  N900&lt;/a&gt;.   На  нем  до  кучи  я  установил  &lt;em&gt;emacs&lt;/em&gt;  —  для  полного
погружения. Но, не смотря на это, за время использования этого телефона я понял,
что  поддерживать софт  телефона  — очень  накладно. Да,  ты  понимаешь кишки  и
устройство, но тратишь  на это слишком много времени. А  потом в какой-то момент
не  можешь взять  трубку,  потому  что часть  памяти,  отвечающая за  приложения
телефона, ушла в  swap и возникло небольшое недоразумение.   Консоль на телефоне
конечно впечатляла,  но следующим моим  телефоном был &lt;em&gt;iPhone&lt;/em&gt;, а  не &lt;em&gt;Android&lt;/em&gt;,
который казался тогда мне аналогом &lt;em&gt;Maemo&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;И тут я прикоснулся к миру  чудесных яблочных интерфейсов и сервисов. И ощущение
от использования  заточенного продукта  оказалось в  100 крат  лучше постоянного
копания в настройках телефона в попытках поднять производительность.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Linux&lt;/em&gt;  зачастую   заставляет  погружаться  слишком  глубоко   в  технологии  и
поддерживать довольно широкий  спектр вещей. Например, чтобы  поднять &lt;em&gt;KDE&lt;/em&gt; надо
было разобраться, как работают иксы,  правильно их настроить. Потом понять какой
драйвер лучше будет  работать с твоей карточкой. Собрать его,  обнаружить, что в
ядре не включен какой-нибудь флажок. Пересобрать ядро, снова пересобрать драйвер
и  вуа-ля получить  рабочую систему.   Но  потом &lt;em&gt;Nvidia&lt;/em&gt;  выкатит релиз  нового
видеодрайвера и система при загрузке будет  показывать черный экран. И топаем по
выше указанному  пути снова.   Это конечно  пример из  &lt;em&gt;Gentoo&lt;/em&gt;, где  надо много
доделывать ручками и самому обновлять конфигурацию.  В современных дистрибутивах
все обстоит по дружественнее, но казусы тоже бывают.&lt;/p&gt;
&lt;p&gt;Так вот,  после того как  я сел за  &lt;em&gt;MacBook&lt;/em&gt;, я понял,  что на подобные  вещи я
больше тратить  время не буду.  Да  тут меньше возможности для  кастомизации, но
как раз  ее я порой  не люблю.   &lt;em&gt;OS X&lt;/em&gt; дает  отличную (не без  косяков) готовую
posix  совместимую  операционную систему,  которая  отлично  ложится на  задачи,
которые  я  обычно  решаю  за  компьютером.  В  ней  я  вижу  идеальный  симбиоз
графического интерфейса  и &lt;em&gt;Unix&lt;/em&gt;-утилит,  построенный на лучшем  железе.  &lt;em&gt;Mac&lt;/em&gt;
позволяет лучше фокусироваться на решении задач без необходимости отвлекаться на
побочные неприятности.&lt;/p&gt;
&lt;p&gt;Но тут  я хотел бы конечно  заметить следующее. Если  бы мне 10 лет  назад, дали
возможность выбрать &lt;em&gt;OS X&lt;/em&gt; или &lt;em&gt;Linux&lt;/em&gt;, я  бы сделал тот же самый выбор в пользу
открытых  систем. Тогда  мне  необходимы были  знания и  &lt;em&gt;Open  Source&lt;/em&gt;, на  мой
взгляд,  лучший  источник.   Сейчас  я  склонен  решать  конкретные  задачи,  не
отвлекаясь на подпиливание системы в целом. Но я также активно использую &lt;em&gt;Emacs&lt;/em&gt;
и целевая система продуктов, над которыми я работаю, несомненно &lt;em&gt;Linux&lt;/em&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Еще раз хотел сказать, что с  большим удовольствием повспоминал последние 10 лет
своей  жизни   в  свете  моего   общения  с  небольшим   зоопарком  операционных
систем. Совсем кратенькое резюме:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Windows&lt;/em&gt; — не мое;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Linux&lt;/em&gt;  —  ужасные  графические  интерфейсы,  но  великолепные  серверы.  Как
  результат  это выбор  номер  один для  построения  различных сервисов.  Сейчас
  старый  домашний   компьютер  больше  работает  как   небольшая  ферма  docker
  контейнеров, а  не по прямому назначению.  А описанный выше сервак  переехал в
  &lt;em&gt;CubieBoard&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;OS X&lt;/em&gt; — отличная рабочая  система для десктопа. Удобство использования железа
  и яблочной инфраструктуры перекрывает  некоторые неудобства. В последнее время
  в &lt;em&gt;OS X&lt;/em&gt; не мало глюков (я тоже попал на баг с 5 Гц-вым &lt;em&gt;WiFi&lt;/em&gt;), но надежда на
  светлое будущее есть.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Linux"></category><category term="linux"></category><category term="os x"></category><category term="windows"></category></entry><entry><title>Полоса загрузки в OS X</title><link href="https://puzan.dev/misc/2015-03-15-polosa-zagruzki-v-os-x.html" rel="alternate"></link><published>2015-03-15T10:48:45+03:00</published><updated>2015-03-15T10:48:45+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2015-03-15:/misc/2015-03-15-polosa-zagruzki-v-os-x.html</id><summary type="html">&lt;p&gt;Одно  из  чудовищных нововведений  &lt;em&gt;Yosemite&lt;/em&gt;  —  это полоса  загрузки.   Звучит
немного громко,  но все же &lt;em&gt;Apple&lt;/em&gt;  всегда славилась своим вниманием  к мелочам,
особенно в дизайне. И вот эта полоска стопудово лишняя.&lt;/p&gt;
&lt;p&gt;Когда я впервые включил свой &lt;em&gt;MacBook&lt;/em&gt;,  это был вау эффект. Он просто включился
и  проиграл  «Таааам» (этот  звук  еще  использовался …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Одно  из  чудовищных нововведений  &lt;em&gt;Yosemite&lt;/em&gt;  —  это полоса  загрузки.   Звучит
немного громко,  но все же &lt;em&gt;Apple&lt;/em&gt;  всегда славилась своим вниманием  к мелочам,
особенно в дизайне. И вот эта полоска стопудово лишняя.&lt;/p&gt;
&lt;p&gt;Когда я впервые включил свой &lt;em&gt;MacBook&lt;/em&gt;,  это был вау эффект. Он просто включился
и  проиграл  «Таааам» (этот  звук  еще  использовался в  &lt;a href="http://en.wikipedia.org/wiki/WALL-E"&gt;&lt;em&gt;WALL-E&lt;/em&gt;&lt;/a&gt;  для
имформирования о его полной зарядки).  Это  было чудовищно быстро по сравнению с
тем, чем я пользовался до этого (&lt;em&gt;Gentoo&lt;/em&gt;).  Экран просто включался и через пару
секунд можно вводить пароль от аккаунта.  По идее, некоторые задержки можно было
заметить, но все  было такое плавное и воздушное (&lt;em&gt;Air&lt;/em&gt;'ом  долго пользовался :)
).&lt;/p&gt;
&lt;p&gt;С приходом  полосы загрузки, я подумал:  «Вот блин, снова &lt;em&gt;Windows&lt;/em&gt;».   Там ведь
была подобная  полоса загрузки? Если  раньше особо не замечал,  сколько грузится
&lt;em&gt;Mac&lt;/em&gt;, то теперь это просто видно  по полосе загрузки.  При этом она заполняется
не  плавно,  а рывками.   Ощущения  сомнительные.   Одно хорошо:  видишь  данную
полоску редко,  так как  перезагрузка бывает  необходима только  после некоторых
системных обновлений.&lt;/p&gt;
&lt;p&gt;Когда-то давно  я настраивал подобную полосу  загрузки в &lt;em&gt;Gentoo&lt;/em&gt;.  Но  там была
совсем другая  ситуация. Я явно  хотел видеть  статус загрузки: не  произошло ли
какого  сбоя и  долго  ли  еще ждать.   Кроме-того  развлекался с  оптимизациями
загрузки системы и опять же визуализация этого процесса была необходима.&lt;/p&gt;
&lt;p&gt;Сейчас  же от  системы я  привык  получать минимальный  отклик. После  включения
ноутбука   я    сразу   хочу   иметь    доступ   ко   всему    функционалу   без
промедлений. Требования высоки,  &lt;em&gt;Apple&lt;/em&gt; сами себя загоняют в  жесткие рамки. Но
вот  реализация  как  известно  у  программных  продуктов  яблочной  компании  в
последнее  время подхрамывает.   Судя по  всему они  берут курс  на стабилизацию
системы. И это не  может не радовать. Будем надеятся, что  &lt;em&gt;OS X&lt;/em&gt; будет грузится
так быстро, что полоса загрузки точно не понадобится.&lt;/p&gt;</content><category term="misc"></category><category term="os x"></category><category term="apple"></category><category term="mac"></category></entry><entry><title>Evernote виджет на Today экране (iOS)</title><link href="https://puzan.dev/misc/2015-03-01-evernote-vidzhet-na-today-ekrane-ios.html" rel="alternate"></link><published>2015-03-01T18:58:53+03:00</published><updated>2015-03-01T18:58:53+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2015-03-01:/misc/2015-03-01-evernote-vidzhet-na-today-ekrane-ios.html</id><summary type="html">&lt;p&gt;Это   небольшая    заметка   с    картинками   про   мой    опыт   использования
&lt;a href="https://itunes.apple.com/ru/app/evernote/id281796108?l=en&amp;amp;mt=8"&gt;Evernote&lt;/a&gt; на &lt;em&gt;iPhone 4S&lt;/em&gt;.  Она была задумала под «вау» эффектом после
находки  полезной галочки  в настройках  этого удобного  приложения для  ведения
заметок. Потом «вау» прошел, но я  решил все же немного порисовать на скриншотах
в &lt;a href="https://itunes.apple.com/ru/app/skitch-snap.-mark-up.-share./id425955336?l=en&amp;amp;mt=12"&gt;Skitch&lt;/a&gt; (еще одни &lt;em&gt;Evernote&lt;/em&gt; продукт) и …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Это   небольшая    заметка   с    картинками   про   мой    опыт   использования
&lt;a href="https://itunes.apple.com/ru/app/evernote/id281796108?l=en&amp;amp;mt=8"&gt;Evernote&lt;/a&gt; на &lt;em&gt;iPhone 4S&lt;/em&gt;.  Она была задумала под «вау» эффектом после
находки  полезной галочки  в настройках  этого удобного  приложения для  ведения
заметок. Потом «вау» прошел, но я  решил все же немного порисовать на скриншотах
в &lt;a href="https://itunes.apple.com/ru/app/skitch-snap.-mark-up.-share./id425955336?l=en&amp;amp;mt=12"&gt;Skitch&lt;/a&gt; (еще одни &lt;em&gt;Evernote&lt;/em&gt; продукт) и составить этот текст.&lt;/p&gt;
&lt;p&gt;Итак к сути! На  днях подумал, что &lt;em&gt;Evernote&lt;/em&gt; плагин на  &lt;em&gt;Today&lt;/em&gt; экране (не знаю
как  его переводят  на  русский язык,  сам  пользуюсь исключительно  английскими
интерфейсами) занимает  существенно много места, но  при этом не несет  для меня
полезной нагрузки.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Evernote плагин со списком заметок" src="https://puzan.dev/images/evernote-ios-today-posts.png" /&gt;&lt;/p&gt;
&lt;p&gt;Сам  по себе  плагин  изначально  был предельно  прост:  5  кнопок для  создания
заметок.   Они полностью  повторяют ярлыки  с главного  экрана приложений.   Это
позволяет создать заметки из произвольного  состояния.  Единственный минус — для
этого открывается  само приложение &lt;em&gt;Evernote&lt;/em&gt;  и далее работа  происходит внутри
него.  Так  вот после очередного  обновления в  этот виджет был  добавлен список
последних обновленных заметок,  как видно на картинке выше.   Из-за этого плагин
стал занимать почти весь экран моего &lt;em&gt;iPhone 4s&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Так как  за последние месяцы я  ни разу по  ним не тыкнул, то  возникло логичное
желание избавится  от списка записок  на &lt;em&gt;Today&lt;/em&gt; экране. В  качестве радикальных
вариантов даже  рассматривал удаление  плагина. Но  чуток пошарив  по настройкам
нашел нужную галочку! Она находится в самом конце General секции.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Настройки Evernote" src="https://puzan.dev/images/evernote-ios-settings.png" /&gt;&lt;/p&gt;
&lt;p&gt;После этого виджет принял прежний вид и снова стал маленьким.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Evernote маленький плагин" src="https://puzan.dev/images/evernote-ios-today-buttons.png" /&gt;&lt;/p&gt;
&lt;p&gt;В  идеале конечно  хотелось  бы, чтобы  при создании  заметки  с &lt;em&gt;Today&lt;/em&gt;  экрана
появлялось  небольшое  окошко  для  текста,  как это  сделано  в  share  плагине
&lt;em&gt;Evernote&lt;/em&gt; (смотрим последнюю картинку). Оно  конечно начало слегка не влазить в
пределы  экрана &lt;em&gt;4s&lt;/em&gt;,  но  мне  бы это  больше  нравилось,  так как  загружается
&lt;em&gt;Evernote&lt;/em&gt;  у меня  не  сильно  быстро. А  иметь  быструю возможность  создавать
заметку очень хочется.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Evernote share плагин" src="https://puzan.dev/images/evernote-ios-share.png" /&gt;&lt;/p&gt;</content><category term="misc"></category><category term="ios"></category><category term="evernote"></category></entry><entry><title>Куда отдать компьютеры?</title><link href="https://puzan.dev/linux/2015-02-21-kuda-otdat-kompiutery.html" rel="alternate"></link><published>2015-02-21T00:00:00+03:00</published><updated>2015-02-21T00:00:00+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2015-02-21:/linux/2015-02-21-kuda-otdat-kompiutery.html</id><summary type="html">&lt;p&gt;Как уже  писал недавно в &lt;a href="https://twitter.com/puzan/status/567212984490295296"&gt;твиттере&lt;/a&gt;,  есть у меня немного  старой техники,
которую  я уже  не использую  и хочу  найти ей  новое место.  Выкидывать немного
жалко, но и склад дома устраивать нет желания.&lt;/p&gt;
&lt;p&gt;Было бы здорово  узнать, куда люди уносят отработавшие  компьютеры.  Свое железо
отдам  даром, но  надо  понимать, что …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Как уже  писал недавно в &lt;a href="https://twitter.com/puzan/status/567212984490295296"&gt;твиттере&lt;/a&gt;,  есть у меня немного  старой техники,
которую  я уже  не использую  и хочу  найти ей  новое место.  Выкидывать немного
жалко, но и склад дома устраивать нет желания.&lt;/p&gt;
&lt;p&gt;Было бы здорово  узнать, куда люди уносят отработавшие  компьютеры.  Свое железо
отдам  даром, но  надо  понимать, что  для того  чтобы  оно заработало  придется
приложить  некторое усилие.   Нижеописанная техника  нуждается явно  в некоторой
доработке.   Ноутбукам  нужны  жесткие  диски  и на  каждый  девайс  надо  будет
устанавливать какую-нибудь операционную систему.   Поэтому отдавать это железо в
детский дом  или подобные заведения мне  кажется издевательством (переубедите?).
Наиболее подходящим, на  мой взгляд, было бы отдать технику  в какую-нибудь лабу
для образовательных целей.   Либо в личное пользование для  знакомства с темами,
связанными с устройством  компьютеров. Есть ли сейчас радио  кружки, где ребятам
интересно поставить на старое железо какой-нибудь дистрибутив &lt;em&gt;Linux&lt;/em&gt; в качестве
образовательных целей?&lt;/p&gt;
&lt;p&gt;Я  собрал немного  характеристик по  каждому девайсу  и для  наглядности добавил
фоточки.  Итак  смотрим, выбираем.   Может у  кого появятся  идеи, куда  это все
пристроить. И было бы интересно узнать опыт в подобных вопросах.&lt;/p&gt;
&lt;h2&gt;HP G62 - &lt;em&gt;Нашел нового хозяина&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="HP G62" src="https://puzan.dev/images/comp-hp.jpg" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU Intel i5 2.53 GHz&lt;/li&gt;
&lt;li&gt;ОЗУ 4 Gb&lt;/li&gt;
&lt;li&gt;Видео ATI Radeon HD 5470&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Без жесткого диска!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Это ноутбук моей любимой девушки. На  нем был установлен &lt;em&gt;Windows 7&lt;/em&gt;.  Последнее
время любимая  на него  сильно ругалась,  в связи с  чем получила  в пользование
&lt;em&gt;MacBook Air&lt;/em&gt;,  а данный аппарат  перешел в категорию  утиль.  И есть  конечно у
него кучка проблем:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Выключается  от перегрева.   Есть подставка  с вентилятором.   Ее тоже  отдам.
  Возможно, если  на него  установить &lt;em&gt;Linux&lt;/em&gt;,  либо старый  &lt;em&gt;Windows&lt;/em&gt;, проблему
  можно будет побороть. Точно есть связь с подключением дискретной графики.&lt;/li&gt;
&lt;li&gt;Дохлая батарея. Работает только от розетки.&lt;/li&gt;
&lt;li&gt;Требуется докупить жесткий диск.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DELL Inspiron 1501 - &lt;em&gt;Нашел нового хозяина&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="DELL Inspiron 1501" src="https://puzan.dev/images/comp-dell.jpg" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU AMD Turion 64 800 MGz&lt;/li&gt;
&lt;li&gt;ОЗУ 2 Gb&lt;/li&gt;
&lt;li&gt;Видео ATI Radeon Xpress 1150&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Без жесткого диска!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;А  этот экземпляр  -  бывший  ноутбук мамы.   Работал  под управлением  &lt;em&gt;Windows
XP&lt;/em&gt;. Также был  заменен на &lt;em&gt;Air&lt;/em&gt; и  отправлен на списание. Проблемы  с ним почти
такие же:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Дохлая батарея. Работает только от розетки.&lt;/li&gt;
&lt;li&gt;Требуется докупить жесткий диск.&lt;/li&gt;
&lt;li&gt;Грязноватый и потертый.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PC aka «server»&lt;/h2&gt;
&lt;p&gt;&lt;img alt="PC aka «server»" src="https://puzan.dev/images/comp-pc.jpg" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU Intel Celeron 1,8 GHz&lt;/li&gt;
&lt;li&gt;ОЗУ 2 Gb&lt;/li&gt;
&lt;li&gt;Какое-то интегрированное видео (работал в &lt;em&gt;headless&lt;/em&gt; режиме)&lt;/li&gt;
&lt;li&gt;Дохлый  Ethernet на  материнской  плате, но  есть  еще дополнительная  сетевая
  карточка, которая успешно работает.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3 жестких диска (IDE)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;149.1 Gb&lt;/li&gt;
&lt;li&gt;Два диска по 37.3 Gb&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;А это  мой доблестный  «сервак».  Верой  и правдой  помогал мне  изучать &lt;em&gt;Linux&lt;/em&gt;
системы. Долгое время был центральной  точкой в домашней сети. Раздавал интернет
и внутренние сервисы  (&lt;em&gt;http server&lt;/em&gt;, &lt;em&gt;file server&lt;/em&gt;, &lt;em&gt;seafile&lt;/em&gt;,  &lt;em&gt;git&lt;/em&gt; и другое)
как по &lt;em&gt;Ethernet&lt;/em&gt;, так и по &lt;em&gt;Wifi&lt;/em&gt; (если необходимо приложу и &lt;em&gt;Wifi&lt;/em&gt; карту).  Из
очевидных  недостатков,  кроме  принципиальной старости  железа,  могу  отметить
только   шум.    Весь   его   функционал   был   успешно   заменен   с   помощью
&lt;em&gt;CubieBoard&lt;/em&gt;. Который кстати совсем не шумит.&lt;/p&gt;</content><category term="linux"></category><category term="hardware"></category><category term="linux"></category></entry><entry><title>Linux бекапы на Apple Time Capsule (Obnam)</title><link href="https://puzan.dev/linux/2015-02-10-linux-bekapy-na-apple-time-capsule-obnam.html" rel="alternate"></link><published>2015-02-10T00:00:00+03:00</published><updated>2015-02-10T00:00:00+03:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2015-02-10:/linux/2015-02-10-linux-bekapy-na-apple-time-capsule-obnam.html</id><summary type="html">&lt;p&gt;Решил наладить  бекапы с &lt;em&gt;CubieBoard&lt;/em&gt;,  на которой крутится  подточеный &lt;em&gt;Debian&lt;/em&gt;
(&lt;a href="http://cubian.org/"&gt;&lt;em&gt;Cubian&lt;/em&gt;&lt;/a&gt;), на &lt;em&gt;Time Capsule&lt;/em&gt;.  Туда через &lt;em&gt;Time Machine&lt;/em&gt; уже делается
резервная копия  &lt;em&gt;MacBook&lt;/em&gt;'а.  Захотел организовать  аналогичные инкрементальные
бекапы для &lt;em&gt;Linux&lt;/em&gt; коробки. Попытаюсь далее изложить свой опыт.&lt;/p&gt;
&lt;p&gt;С  доступом  к  &lt;em&gt;Time  Capsule&lt;/em&gt;  особых   проблем  в  &lt;em&gt;Linux&lt;/em&gt;  нету.   Ее  можно
подмонтировать …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Решил наладить  бекапы с &lt;em&gt;CubieBoard&lt;/em&gt;,  на которой крутится  подточеный &lt;em&gt;Debian&lt;/em&gt;
(&lt;a href="http://cubian.org/"&gt;&lt;em&gt;Cubian&lt;/em&gt;&lt;/a&gt;), на &lt;em&gt;Time Capsule&lt;/em&gt;.  Туда через &lt;em&gt;Time Machine&lt;/em&gt; уже делается
резервная копия  &lt;em&gt;MacBook&lt;/em&gt;'а.  Захотел организовать  аналогичные инкрементальные
бекапы для &lt;em&gt;Linux&lt;/em&gt; коробки. Попытаюсь далее изложить свой опыт.&lt;/p&gt;
&lt;p&gt;С  доступом  к  &lt;em&gt;Time  Capsule&lt;/em&gt;  особых   проблем  в  &lt;em&gt;Linux&lt;/em&gt;  нету.   Ее  можно
подмонтировать с помощью &lt;em&gt;cifs&lt;/em&gt; (не забываем установить &lt;code&gt;cifs-utils&lt;/code&gt;). В &lt;code&gt;fstab&lt;/code&gt;
закидываем следующую строку и все должно работать после монтирования.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;//&amp;lt;TC.local or direct ip&amp;gt;/Data /mnt/tc cifs passwd=thebestpass,sec=ntlm,iocharset=utf8 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Но при этом в &lt;code&gt;/var/log/messages&lt;/code&gt; порой валит вот такие ошибки:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[151119.364105] ------------[ cut here ]------------
[151119.375676] WARNING: at fs/inode.c:280 drop_nlink+0x54/0x5c()
[151119.380041] Modules linked in: sunxi_cedar_mod mali ump gpio_sunxi
[151119.394514] [&amp;lt;c0015430&amp;gt;] (unwind_backtrace+0x0/0x134) from [&amp;lt;c003322c&amp;gt;] (warn_slowpath_common+0x54/0x64)
[151119.403340] [&amp;lt;c003322c&amp;gt;] (warn_slowpath_common+0x54/0x64) from [&amp;lt;c00332d8&amp;gt;] (warn_slowpath_null+0x1c/0x24)
[151119.411578] [&amp;lt;c00332d8&amp;gt;] (warn_slowpath_null+0x1c/0x24) from [&amp;lt;c00f0738&amp;gt;] (drop_nlink+0x54/0x5c)
[151119.419177] [&amp;lt;c00f0738&amp;gt;] (drop_nlink+0x54/0x5c) from [&amp;lt;c0248cfc&amp;gt;] (cifs_unlink+0x224/0x654)
[151119.426644] [&amp;lt;c0248cfc&amp;gt;] (cifs_unlink+0x224/0x654) from [&amp;lt;c00e64d0&amp;gt;] (vfs_unlink+0x78/0x104)
[151119.434358] [&amp;lt;c00e64d0&amp;gt;] (vfs_unlink+0x78/0x104) from [&amp;lt;c00e66a0&amp;gt;] (do_unlinkat+0x144/0x16c)
[151119.447019] [&amp;lt;c00e66a0&amp;gt;] (do_unlinkat+0x144/0x16c) from [&amp;lt;c000ec40&amp;gt;] (ret_fast_syscall+0x0/0x30)
[151119.451059] ---[ end trace fddecabeb4cc4bce ]---
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Вроде ничего страшного, но логи забиваются.&lt;/p&gt;
&lt;p&gt;Далее стоит вопрос,  чем и как бекапить.  Для &lt;em&gt;Linux&lt;/em&gt;  популярны системы бекапов
на  основе &lt;code&gt;rsync&lt;/code&gt;  и &lt;em&gt;hard  links&lt;/em&gt;.  Например,  &lt;a href="http://www.rsnapshot.org/"&gt;rsnapshot&lt;/a&gt;. Но  тут
возникает проблема, связанная  с отсутствием поддержки жестких  ссылок в &lt;em&gt;cifs&lt;/em&gt;.
Есть еще &lt;a href="http://www.nongnu.org/rdiff-backup/"&gt;rdiff-backup&lt;/a&gt;, он вроде  как хранит файлы с изменениями.
Но это мой  следующий шаг для тестов, а пока  я использую &lt;a href="http://obnam.org/"&gt;&lt;strong&gt;obnam&lt;/strong&gt;&lt;/a&gt;.  И
сразу скажу: он очень тормозной.&lt;/p&gt;
&lt;p&gt;На &lt;strong&gt;obnam&lt;/strong&gt;  натолкнулся когда-то  &lt;a href="http://www.opennet.ru/opennews/art.shtml?num=39323"&gt;давно&lt;/a&gt;, но  начал разворачивать
после приобретения &lt;em&gt;CubieBoard&lt;/em&gt;.  Первоначально  &lt;strong&gt;obnam&lt;/strong&gt; мне очень понравился.
Гигабайт системных данных бекапил минуты за  2-3.  Я с радости поднял ежечастные
бекапы.  Вроде как настроил систему  аналогичную &lt;em&gt;Time Capsule&lt;/em&gt; c чисткой старых
поколений бекапов (см. поле &lt;code&gt;keep&lt;/code&gt; в  настройках ниже).  Для всего этого написал
небольшой скрипт следующего содержания и положил это добро в крон:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

logger &lt;span class="s2"&gt;&amp;quot;Start backup&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="o"&gt;(&lt;/span&gt;df &lt;span class="p"&gt;|&lt;/span&gt; tail -n +2 &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $6}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -q &lt;span class="s1"&gt;&amp;#39;^/mnt/tc$&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    logger &lt;span class="s2"&gt;&amp;quot;Backup fails: tc is not mounted&amp;quot;&lt;/span&gt;
    &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

nice -n &lt;span class="m"&gt;19&lt;/span&gt; ionice -c2 -n7 obnam backup

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    logger &lt;span class="s2"&gt;&amp;quot;Backup forget&amp;quot;&lt;/span&gt;
    nice -n &lt;span class="m"&gt;19&lt;/span&gt; ionice -c2 -n7 obnam forget
&lt;span class="k"&gt;else&lt;/span&gt;
    logger &lt;span class="s2"&gt;&amp;quot;Backup failed&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

logger &lt;span class="s2"&gt;&amp;quot;End backup&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;А вот и &lt;strong&gt;obnam&lt;/strong&gt; конфиг:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[config]
repository = /mnt/tc/backup
log = /var/log/obnam.log
log-max = 10M
log-keep = 10
log-level = warning
one-file-system = True
root = /etc, /home, /opt, /root
keep = 24h,7d,15w,24m,5y
upload-queue-size = 512
lru-size = 512
compress-with = deflate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Все это прекрасно  работало до того момента, как я  перенес &lt;a href="http://seafile.com"&gt;seafile&lt;/a&gt; с
~100  гигабайтами данных.   Первичный  бекап занял  около  30 часов.   Следующие
занимали более часа.  К сожалению  подробную статистику не сохранил. После этого
нашел &lt;a href="http://listmaster.pepperfish.net/pipermail/obnam-support-obnam.org/2014-June/003086.html"&gt;пост&lt;/a&gt;, посвященный  тестированию &lt;strong&gt;obnam&lt;/strong&gt; параметров,
влияющих  на  производительность.  На  основе  информации  из указанной  заметки
добавил параметры &lt;code&gt;upload-queue-size&lt;/code&gt;  и &lt;code&gt;lru-size&lt;/code&gt; в конфиг  (см.  выше). Бекап
ускорился до 15 минут.&lt;/p&gt;
&lt;p&gt;Но далее я обновил &lt;em&gt;seafile&lt;/em&gt; через несколько версий, и вдруг количество файлов в
его базе увеличилось  примерно в 2-е (в основном жестки  ссылки).  Это привело к
росту времени бекапов до 1 часа 15  минут.  Я боюсь представить за сколько будет
проходить бекап  почти забитого  1 Тб  диска.  Надеюсь у  меня не  будет столько
данных.  Соответственно бекапы теперь запускаются раз в день. Вроде бы этого для
меня вполне достаточно.&lt;/p&gt;
&lt;p&gt;И  еще один  шаг, который  как  раз заканчиваю  тестировать: положить  &lt;strong&gt;obnam&lt;/strong&gt;
репозиторий в &lt;a href="https://github.com/vgough/encfs"&gt;encfs&lt;/a&gt;. Выбор на этот вариант шифрования также пал за счет
поддержки &lt;em&gt;cifs&lt;/em&gt;. Также  &lt;em&gt;encfs&lt;/em&gt; хороша тем, что нет  необходимости делать некий
виртуальный диск, который  возможно в будущем придется  расширять. Позже добавлю
информацию про эти успехи.&lt;/p&gt;
&lt;p&gt;Данный пост  был создан,  чтобы поделиться собственным  опытом и  возможно найти
более эффективные альтернативы. Добро  покалывать в комментарии. Высказывайтесь!
&lt;strong&gt;obnam&lt;/strong&gt; явно не  лучший вариант для бекапов больших  объемов информации поверх
&lt;em&gt;cifs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt;  К слову  сказать, бекапы  уже  меня успели  спасти. Пусть  они и  идут
медленно,  но  и  меняются  не сильно  часто.   После  выключения  электричества
файловая система  на диске с  данными слегка  поплыла.  Чиниться через  &lt;code&gt;fsck&lt;/code&gt; и
монтироваться  отказывалась.  Данные  в принципе  можно было  бы восстановить  с
диска,  но  быстрее и  проще  оказалось  воспользоваться бекапом.   Бекаптесь  -
пригодится!&lt;/p&gt;</content><category term="linux"></category><category term="linux"></category><category term="apple"></category><category term="time capsule"></category><category term="cifs"></category><category term="obnam"></category><category term="backup"></category></entry><entry><title>C++ party</title><link href="https://puzan.dev/misc/2014-09-07-c-party.html" rel="alternate"></link><published>2014-09-07T19:27:00+04:00</published><updated>2014-09-07T19:27:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-09-07:/misc/2014-09-07-c-party.html</id><summary type="html">&lt;p&gt;Посетил  на  днях  (&lt;em&gt;2014-08-20&lt;/em&gt;,   задержался  с  постом)  &lt;a href="https://tech.yandex.ru/events/cpp-party/aug-nn/"&gt;c++  party&lt;/a&gt;,
организованную  &lt;em&gt;Яндексом&lt;/em&gt;   в  Нижнем  Новгороде.   Решил   оставить  тут  свои
впечатления  от  этого  мероприятия.    Как  раз  под  категорию  &lt;a href="/misc/"&gt;Misc&lt;/a&gt;
подходит.   Все было  очень  позитивненько и  познавательно.  Интересные люди  и
занимательные доклады. Ощутилась этакая &lt;em&gt;Яндекс&lt;/em&gt; культура.&lt;/p&gt;
&lt;p&gt;Особо  понравился  первый доклад.   Он  был  посвящен …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Посетил  на  днях  (&lt;em&gt;2014-08-20&lt;/em&gt;,   задержался  с  постом)  &lt;a href="https://tech.yandex.ru/events/cpp-party/aug-nn/"&gt;c++  party&lt;/a&gt;,
организованную  &lt;em&gt;Яндексом&lt;/em&gt;   в  Нижнем  Новгороде.   Решил   оставить  тут  свои
впечатления  от  этого  мероприятия.    Как  раз  под  категорию  &lt;a href="/misc/"&gt;Misc&lt;/a&gt;
подходит.   Все было  очень  позитивненько и  познавательно.  Интересные люди  и
занимательные доклады. Ощутилась этакая &lt;em&gt;Яндекс&lt;/em&gt; культура.&lt;/p&gt;
&lt;p&gt;Особо  понравился  первый доклад.   Он  был  посвящен &lt;em&gt;corutine&lt;/em&gt;'ам  и  простому
асинхронному коду.   Я так  понял разработчики  были впечатлены  &lt;em&gt;gorutines&lt;/em&gt; при
построении  своего решения.   Очень  хорошо и  доступно было  продемонстрировано
упрощение кода. Основной упор был  направлен на объяснение концепций позволяющих
избавиться от сложных и запутанных конечных автоматах.  Выглядит очень красиво и
просто. Кода в презентации было достаточно много,  но весь он был легко читаем и
понятен. Последнее нельзя сказать про второй доклад.&lt;/p&gt;
&lt;p&gt;Второй доклад был посвящен обобщенному  программированию на &lt;em&gt;C++&lt;/em&gt;. Муть мутная с
моей    точки    зрения.    Напомнило    статью    на    хабре   о    разработке
&lt;a href="http://habrahabr.ru/post/218229/"&gt;игры жизнь  на C++  шаблонах&lt;/a&gt;.  Там весь  процесс игры  осуществляется на
этапе компиляции и к старту приложения  все уже мертвы.  Рассказчик серьезно так
углубился в  реализацию &lt;em&gt;Boost.Geometry&lt;/em&gt;.   И в  результате чего,  по-моему, зал
немного приуныл. Вообще говоря из этого  доклада я вынес следующую мысль.  Очень
удобно  использовать библиотеки,  позволяющие  использовать  некие внешние  типы
(например, собственные геометрические структуры.   Смотрим &lt;em&gt;Boost.Geometry&lt;/em&gt; с ее
замечательными макросами).  Но вот реализация  и поддержка подобных библиотек не
является такой  уж простой задачей. Об  этом как минимум говорит  реакция одного
слушателя, который яростно критиковал доклад.&lt;/p&gt;
&lt;p&gt;Наибольшее впечатление произвело  то, что в &lt;em&gt;Яндаксе&lt;/em&gt;  ребята умудряются убедить
начальство  в  необходимости выполнить  такой  крупный  рефакторинг (по  мотивам
первого  доклада:  переход от  конечных  автоматов  к корутинам).   Кроме  того,
видимо,  руководство само  заинтересовано в  подобном развитии  проектов.  Очень
впечатляет. Я в своей рабочей деятельности такого пока не видел.&lt;/p&gt;</content><category term="misc"></category><category term="yandex"></category><category term="c++"></category></entry><entry><title>Голдинг У. - Повелитель мух</title><link href="https://puzan.dev/read/2014-09-07-golding-u-povelitel-mukh.html" rel="alternate"></link><published>2014-09-07T00:00:00+04:00</published><updated>2014-09-07T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-09-07:/read/2014-09-07-golding-u-povelitel-mukh.html</id><summary type="html">&lt;p&gt;На прошлых  выходных осилил  чудную историю про  мальчишек, которые  застряли на
необитаемом  остове после  авиакатастрофы.  До  того  как их  нашли, они  успели
спалить  почти  весь  остров,  превратиться   в  обезумевшее  племя  и  чуть  не
переубивать друг друга.&lt;/p&gt;
&lt;p&gt;Похоже я  нашел для  себя еще  один любимый  жанр (после  антиутопий): поведение
людей в …&lt;/p&gt;</summary><content type="html">&lt;p&gt;На прошлых  выходных осилил  чудную историю про  мальчишек, которые  застряли на
необитаемом  остове после  авиакатастрофы.  До  того  как их  нашли, они  успели
спалить  почти  весь  остров,  превратиться   в  обезумевшее  племя  и  чуть  не
переубивать друг друга.&lt;/p&gt;
&lt;p&gt;Похоже я  нашел для  себя еще  один любимый  жанр (после  антиутопий): поведение
людей в замкнутых пространствах. Особенную изюминку конечно в данном приключении
придают главные герои: дети. Из-за этого все выглядит еще более жестоко. А когда
доходит до убийства, возникает жуткое чувство беспомощности.&lt;/p&gt;
&lt;p&gt;Автор — чудовищный гений.  Ловко манипулирует эмоциональным состоянием читателя.
Заставляет  испытать различные  чувства, притом  в основном  негативные: злость,
страх, полная несправедливость и беспомощность.  Особенно ярки эти чувства из-за
того, что вызывают их именно дети. А в голове постоянно крутится вопрос: "Ну как
же так?".&lt;/p&gt;
&lt;p&gt;Все это происходит на  фоне войны в большом мире. Дети  не могут договориться на
меленьком острове.  Соответственно не  возникает вопростов, почему взрослые тоже
решают проблемы силовым методом.&lt;/p&gt;</content><category term="read"></category><category term="художественная литература"></category><category term="Голдинг У."></category></entry><entry><title>Приятности от Apple</title><link href="https://puzan.dev/misc/2014-09-04-priiatnosti-ot-apple.html" rel="alternate"></link><published>2014-09-04T00:00:00+04:00</published><updated>2014-09-04T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-09-04:/misc/2014-09-04-priiatnosti-ot-apple.html</id><summary type="html">&lt;p&gt;На днях случайно обнаружил приятную фичу  от &lt;em&gt;Apple&lt;/em&gt;.  Точнее сказать со второго
раза понял,  что это действительно  фича, а не мой  глюк.  Речь идет  о передаче
&lt;em&gt;Wifi&lt;/em&gt; паролей  между &lt;em&gt;Apple&lt;/em&gt;  девайсами.  Судя по  всему информация  хранится в
&lt;em&gt;icloud'&lt;/em&gt;е и привязана к соответствующему &lt;em&gt;AppleID&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;В первый раз я заметил что-то …&lt;/p&gt;</summary><content type="html">&lt;p&gt;На днях случайно обнаружил приятную фичу  от &lt;em&gt;Apple&lt;/em&gt;.  Точнее сказать со второго
раза понял,  что это действительно  фича, а не мой  глюк.  Речь идет  о передаче
&lt;em&gt;Wifi&lt;/em&gt; паролей  между &lt;em&gt;Apple&lt;/em&gt;  девайсами.  Судя по  всему информация  хранится в
&lt;em&gt;icloud'&lt;/em&gt;е и привязана к соответствующему &lt;em&gt;AppleID&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;В первый раз я заметил что-то странное, когда поставил домой новую &lt;em&gt;Wifi&lt;/em&gt; точку.
Отчетливо помню  как подключил &lt;em&gt;MacBook  Air&lt;/em&gt; и  &lt;em&gt;iPhone&lt;/em&gt;.  А вот  как подключал
&lt;em&gt;iPad&lt;/em&gt; не помню,  но он оказался подключенным.  Я решил  списать данное действие
на дырьковатую память, но как оказалось память у меня еще о-го-го.&lt;/p&gt;
&lt;p&gt;Собственно вчера  подключил ноутбук к точке  на новой работе и  вуа-ля! &lt;em&gt;iPhone&lt;/em&gt;
тут как  тут: тянет  данный через &lt;em&gt;Wifi&lt;/em&gt;,  а не через  &lt;em&gt;3G&lt;/em&gt;.  Приятно  и удобно.
&lt;em&gt;Apple&lt;/em&gt; действительно умеет удивлять в мелочах.&lt;/p&gt;
&lt;p&gt;Не  очень  давно  в &lt;em&gt;Радио-Т&lt;/em&gt;  &lt;em&gt;Бобук&lt;/em&gt;  говорил  о  том,  что &lt;em&gt;Wifi&lt;/em&gt;  пароли  не
сохраняются при  переходе на новое устройство  (&lt;em&gt;iPhone 4&lt;/em&gt; -&amp;gt; &lt;em&gt;iPhone  5s&lt;/em&gt;). Там
еще речь шла про бекапы мобильных устройств. Но похоже все должно работать после
привязки нового девайса к вашему  &lt;em&gt;AppleID&lt;/em&gt;.  В общем надо будет протестировать,
когда созрею на новый телефон.&lt;/p&gt;
&lt;p&gt;Интересно, как дела обстоят у конкурентов?  Видимо у &lt;em&gt;Microsoft&lt;/em&gt; может быть тоже
подобное решение с их унифицированной операционной системой на всех устройствах.
Хотя сомнительно -  не в их стиле.   У &lt;em&gt;Google&lt;/em&gt; тоже подобное  возможно.  Но кто
нынче пользуется &lt;em&gt;Chrome  OS&lt;/em&gt;? Какие еще варианты? Может  приложения или сервисы
какие-нибудь хитрые есть?&lt;/p&gt;</content><category term="misc"></category><category term="apple"></category><category term="mac"></category></entry><entry><title>EDE боль</title><link href="https://puzan.dev/linux/2014-08-19-ede-bol.html" rel="alternate"></link><published>2014-08-19T00:00:00+04:00</published><updated>2014-08-19T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-08-19:/linux/2014-08-19-ede-bol.html</id><summary type="html">&lt;p&gt;Примерно раз  в год я возвращаюсь  к работе над некоторыми  &lt;em&gt;C/C++&lt;/em&gt; проектами. И
каждый  раз я  сталкиваюсь с  неудобствами работы  &lt;strong&gt;CEDET +  EDE&lt;/strong&gt;.  Сначала  я
попробую описать  свои невзгоды, а в  конце предложу свой вариант  сделать жизнь
чуточку лучше. Комментарии приветствуются.&lt;/p&gt;
&lt;p&gt;Какова вообще задача  использовать &lt;em&gt;EDE&lt;/em&gt;? Я хочу указать  где-то …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Примерно раз  в год я возвращаюсь  к работе над некоторыми  &lt;em&gt;C/C++&lt;/em&gt; проектами. И
каждый  раз я  сталкиваюсь с  неудобствами работы  &lt;strong&gt;CEDET +  EDE&lt;/strong&gt;.  Сначала  я
попробую описать  свои невзгоды, а в  конце предложу свой вариант  сделать жизнь
чуточку лучше. Комментарии приветствуются.&lt;/p&gt;
&lt;p&gt;Какова вообще задача  использовать &lt;em&gt;EDE&lt;/em&gt;? Я хочу указать  где-то все зависимости
для конкретного проекта и передать эту  информацию в &lt;em&gt;semantic&lt;/em&gt; для навигации по
коду  и авто  дополнений. И  есть (по-моему  здравое) желание  не смешивать  эту
информацию для  различных проектов. По-идее  большего от  &lt;em&gt;EDE&lt;/em&gt; мне не  надо. Ну
может еще команду для сборки  проекта добавить. Хотя предпочитаю делать подобное
в  отдельно  взятой  консоли.  Итак,   что  нам  предлатает  &lt;em&gt;Emacs  Development
Environment&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Пара  слов про  проекты по-умолчанию  (то  что создается  с помощью  &lt;code&gt;ede-new&lt;/code&gt;).
Больше  всего меня  бесит  настройка через  &lt;em&gt;customize&lt;/em&gt;-подобный интерфейс.   Им
вообще не пользоваться  для настройки &lt;strong&gt;Emacs'а&lt;/strong&gt; в принципе.   Если пойдешь сам
что-то  править в  &lt;em&gt;EDE&lt;/em&gt;  файле, то  точно натолкнешься  на  беду.  Как  минимум
придется перезапускать &lt;strong&gt;Emacs&lt;/strong&gt;  или пересоздавать проект.  Кроме  того, либо я
что-то  потерял, либо  в проекте  по-умолчанию нельзя  указать список  &lt;em&gt;include&lt;/em&gt;
папок.   Смысла в  данном  типе EDE-проекта  на мой  взгляд  нет.  Можно  видимо
использовать  его для  генерации &lt;em&gt;make&lt;/em&gt;-файлов,  но как  показывает практика  их
писать и поддерживать лучше самому.  &lt;strong&gt;Automake&lt;/strong&gt; и подобное вам в помощь.&lt;/p&gt;
&lt;p&gt;Также  с помощью  &lt;em&gt;EDE&lt;/em&gt; можно  добавить  и работать  с некоторыми  существующими
проектами. Например,  есть проекты для &lt;em&gt;C/C++&lt;/em&gt;  (&lt;code&gt;ede-cpp-root-project&lt;/code&gt;), &lt;em&gt;Java&lt;/em&gt;
(&lt;code&gt;ede-java-root-project&lt;/code&gt;)  и  другие.   В  них как  раз  можно  указать  внешние
зависимости, и Semantic  с переменным успехом их обрабатывает. Но  есть одно но:
почему-то  эти  настройки  нельзя  положить в  &lt;code&gt;Project.ede&lt;/code&gt;  файл  для  полного
счастья.&lt;/p&gt;
&lt;p&gt;Видел такое решение:  указать настройки всех проектов  в конфигурационных файлах
&lt;strong&gt;Emacs&lt;/strong&gt;.  Это мне  тоже не нравится.  Моя &lt;strong&gt;Emacs&lt;/strong&gt; конфигурация  все пухнет и
пухнет,  как я  не пытаюсь  ее аккуратно  структурировать.  Если  еще там  будет
информация о всех проектах жизнь станет ужасна.&lt;/p&gt;
&lt;p&gt;Была  у  меня  идея  положить  все настройки  в  &lt;code&gt;.dir-locals.el&lt;/code&gt;.   Но  тут  мы
сталкиваемся с  проблемой множественного создания  одного и того же  проекта для
каждого  открытого файла.   По-идее можно  написать всю  обработку этого  случая
внутри &lt;code&gt;.dir-locals.el&lt;/code&gt;,  но так пришлось бы  тянуть и копировать это  решение в
каждый проект. Не айс. Хочется более универсального решения.&lt;/p&gt;
&lt;p&gt;В общем к чему это я все. Для себя я написал небольшой хук для &lt;em&gt;c-mode&lt;/em&gt;, который
загружает конфигурацию проекта из &lt;code&gt;.Project&lt;/code&gt; файла, если он еще не был загружен.
Также он  обновляет список &lt;em&gt;include&lt;/em&gt;  путей для &lt;code&gt;clang&lt;/code&gt;, который  используется в
&lt;code&gt;auto-complete-clang&lt;/code&gt; и &lt;code&gt;flycheck&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;init/project-update&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;proj-file&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;.Project&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ede-proj&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ede-current-project&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;proj-dir-tmp&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;locate-dominating-file&lt;/span&gt; &lt;span class="nv"&gt;buffer-file-name&lt;/span&gt; &lt;span class="nv"&gt;proj-file&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;proj-dir&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;proj-dir-tmp&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;expand-file-name&lt;/span&gt; &lt;span class="nv"&gt;proj-dir-tmp&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;root-dir&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;ede-proj&lt;/span&gt;
                     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;expand-file-name&lt;/span&gt;
                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ede-project-root-directory&lt;/span&gt; &lt;span class="nv"&gt;ede-proj&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;proj-dir&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;equal&lt;/span&gt; &lt;span class="nv"&gt;proj-dir&lt;/span&gt; &lt;span class="nv"&gt;root-dir&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;load project %s&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;proj-dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;default-directory&lt;/span&gt; &lt;span class="nv"&gt;proj-dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;load&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;expand-file-name&lt;/span&gt; &lt;span class="nv"&gt;proj-file&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;ede-proj&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ede-current-project&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;root-dir&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;ede-proj&lt;/span&gt;
                     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ede-project-root-directory&lt;/span&gt; &lt;span class="nv"&gt;ede-proj&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;root-dir&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;flycheck-clang-include-path&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;mapcar&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;concat&lt;/span&gt; &lt;span class="nv"&gt;root-dir&lt;/span&gt; &lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;oref&lt;/span&gt; &lt;span class="nv"&gt;ede-proj&lt;/span&gt; &lt;span class="nv"&gt;include-path&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;make-variable-buffer-local&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;ac-clang-flags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;ac-clang-flags&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;mapcar&lt;/span&gt;
             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;concat&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;-I&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
             &lt;span class="nv"&gt;flycheck-clang-include-path&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;А сам  .Project файл лежит  в корне проекта  и содержит только  описание проекта
(как видите реальной проверки на это нету). Например вот такое:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ede-cpp-root-project&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;NewProject&amp;quot;&lt;/span&gt;
                      &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;NewProject&amp;quot;&lt;/span&gt;
                      &lt;span class="ss"&gt;:file&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Makefile&amp;quot;&lt;/span&gt;
                      &lt;span class="ss"&gt;:include-path&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/inc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="ss"&gt;:system-include-path&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/usr/include/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="ss"&gt;:spp-table&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;PROJECT_EXPORT&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;В душе я надеюсь, что я что-то делаю не так, что все в реальности легко и просто
настраивается. Что  на самом деле  я просто где-то пропустил  правильный вариант
настройки  в  мануале &lt;em&gt;CEDET&lt;/em&gt;.   Если  это  действительно  так, укажите  на  мою
ошибку. Если же эти хуки являются единственным вариантом для удовлетворения моих
запросов,  то  оформлю  минорный   мод  для  поддержки  автоматической  загрузки
проектов.  В общем  делитесь вашими вариантами и  впечатлениями от использования
&lt;em&gt;EDE&lt;/em&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;P.S. Все  эти негативные  впечатления от использования  &lt;em&gt;EDE&lt;/em&gt; видимо  возникли в
результате годового использования &lt;strong&gt;Eclipse&lt;/strong&gt; и &lt;strong&gt;Idea&lt;/strong&gt; для программирования на
&lt;em&gt;Java&lt;/em&gt;.   Пробовал  &lt;strong&gt;Emacs&lt;/strong&gt;  заточить  для  &lt;em&gt;Java&lt;/em&gt;,  но  затея  не  увенчалась
успехом. Но для &lt;em&gt;C/C++&lt;/em&gt; проектов только &lt;strong&gt;Emacs&lt;/strong&gt;, только хардкор.&lt;/p&gt;</content><category term="linux"></category><category term="emacs"></category><category term="cedet"></category><category term="ede"></category></entry><entry><title>Для тех кто за proxy</title><link href="https://puzan.dev/linux/2014-08-09-dlia-tekh-kto-za-proxy.html" rel="alternate"></link><published>2014-08-09T00:00:00+04:00</published><updated>2014-08-09T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-08-09:/linux/2014-08-09-dlia-tekh-kto-za-proxy.html</id><summary type="html">&lt;p&gt;Как не крути, а бывают такие ситуации, когда надо залезть на свой сервачок через
злобное  прокси, которое  режет,  например, &lt;em&gt;ssh&lt;/em&gt;  трафик.   Также бывают  такие
ситуации, когда  некоторые программы не  поддерживают работу через  прокси.  Это
тоже  беда. Для  себя  я  нашел 2  запасных  способа,  которые позволяют  решить
указанные выше неудобства.&lt;/p&gt;
&lt;p&gt;Когда-то …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Как не крути, а бывают такие ситуации, когда надо залезть на свой сервачок через
злобное  прокси, которое  режет,  например, &lt;em&gt;ssh&lt;/em&gt;  трафик.   Также бывают  такие
ситуации, когда  некоторые программы не  поддерживают работу через  прокси.  Это
тоже  беда. Для  себя  я  нашел 2  запасных  способа,  которые позволяют  решить
указанные выше неудобства.&lt;/p&gt;
&lt;p&gt;Когда-то  я отчаялся  подключиться  к домашнему  серверу  через прокси,  которое
беспощадно  режет &lt;em&gt;ssh&lt;/em&gt;  трафик. Пробовал  хитрые  схемы с  переносом &lt;code&gt;sshd&lt;/code&gt;  на
другой  порт,  надеясь, что  закрыт  просто  22-ой.  Но оказалось  дела  обстоят
сложнее.&lt;/p&gt;
&lt;h2&gt;Httptunnel&lt;/h2&gt;
&lt;p&gt;Сначала    в    своей    практике   столкнулся    с    &lt;a href="http://www.nocrew.org/software/httptunnel.html"&gt;httptunnel&lt;/a&gt;.
Клиент/серверная  штука,  позволяющая  пустить необходимый  тебе  трафик  поверх
&lt;em&gt;http&lt;/em&gt;.   Это первое  решение, с  помощью  которого мне  удалось достучаться  до
домашнего сервака  по &lt;em&gt;ssh&lt;/em&gt; из-за  прокси.  Неудобство данной утилиты  состоит в
том,  что необходимо  предварительно установить  серверную часть  на машину,  до
которой хотим добраться.  И запустить например так:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;hts -F localhost:22 8080
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Далее на своей рабочей машине запускаем клиентскую часть, дабы создать туннель:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;htc -P &amp;lt;proxy.server.com&amp;gt;:&amp;lt;port&amp;gt; -F 8022 -w &amp;lt;home.server.me&amp;gt;:8080
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;После этих телодвижений  можно подключаться к локальному порту  &lt;code&gt;8022&lt;/code&gt; с помощью
&lt;em&gt;ssh&lt;/em&gt; дабы добраться до своего сервака:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh -p 8022 user@localhost
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Для  &lt;em&gt;Gentoo&lt;/em&gt;  я  в  свое  время  добавил стартовый  скрипт  для  &lt;code&gt;hts&lt;/code&gt;  в  свой
&lt;a href="https://github.com/puzan/puzan-overlay/tree/master/net-misc/httptunnel"&gt;репозиторий&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Proxychains&lt;/h2&gt;
&lt;p&gt;Недавно   случайно   наткнулся   на   &lt;a href="https://github.com/rofl0r/proxychains-ng"&gt;proxychains&lt;/a&gt;.   Удивительная
штука. Главная идея подменить socket вызовы так, чтобы они шли через указанные в
конфиге прокси. Как подробно это работает не разбирался, но результат меня очень
порадовал. Добавляем в конфиг необходимую информацию:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[ProxyList]
http    &amp;lt;proxy_ip&amp;gt;      &amp;lt;proxy_port&amp;gt;
https   &amp;lt;proxy_ip&amp;gt;      &amp;lt;proxy_port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;И теперь можем спокойно подключаться к своему серверу:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;proxychain4 ssh &amp;lt;home.server.me&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Также успешно через &lt;code&gt;proxychain4&lt;/code&gt; запускаю десктопную версию Viber'а, которая не
поддерживает работу с proxy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;proxychain4 &amp;lt;/path/to/Viber&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;hr /&gt;
&lt;p&gt;Указанные    решения   регулярно    использую    на    &lt;em&gt;Mac&lt;/em&gt;'е.    В    основном
&lt;a href="https://github.com/rofl0r/proxychains-ng"&gt;proxychains&lt;/a&gt;.   Все  устанавливаю  через  &lt;a href="http://brew.sh/"&gt;brew&lt;/a&gt;.   В  любом
линуксе  они тоже  должны быть  доступны и  успешно работать.   Было бы  здорово
узнать,  какие решения  есть еще.   Ну и  надеюсь эта  информация будет  кому-то
полезна.  Сам долго  искал эти утилиты. Лучше конечно, когда  на вашем пути нету
прокси.&lt;/p&gt;</content><category term="linux"></category><category term="proxy"></category><category term="network"></category><category term="ssh"></category></entry><entry><title>Direnv</title><link href="https://puzan.dev/linux/2014-05-14-direnv.html" rel="alternate"></link><published>2014-05-14T00:00:00+04:00</published><updated>2014-05-14T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-05-14:/linux/2014-05-14-direnv.html</id><summary type="html">&lt;p&gt;Как-то раз в  одном из выпусков &lt;a href="http://razbor-poletov.com/2014/03/episode-56.html"&gt;Разбор Полетов&lt;/a&gt; услышал  про отличную и
удобную консольную штуку: &lt;a href="http://direnv.net/"&gt;direnv&lt;/a&gt;. Она позволяет выставлять необходимое
окружение в  зависимости от  текущей директории.  При  этом для  вложенных папок
&lt;a href="http://direnv.net/"&gt;direnv&lt;/a&gt;  окружение сохраняется  (если  не было  переопределено), а  при
выходе из папки возвращается предыдущее рабочее окружение.&lt;/p&gt;
&lt;p&gt;На    &lt;em&gt;Mac&lt;/em&gt;   можно …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Как-то раз в  одном из выпусков &lt;a href="http://razbor-poletov.com/2014/03/episode-56.html"&gt;Разбор Полетов&lt;/a&gt; услышал  про отличную и
удобную консольную штуку: &lt;a href="http://direnv.net/"&gt;direnv&lt;/a&gt;. Она позволяет выставлять необходимое
окружение в  зависимости от  текущей директории.  При  этом для  вложенных папок
&lt;a href="http://direnv.net/"&gt;direnv&lt;/a&gt;  окружение сохраняется  (если  не было  переопределено), а  при
выходе из папки возвращается предыдущее рабочее окружение.&lt;/p&gt;
&lt;p&gt;На    &lt;em&gt;Mac&lt;/em&gt;   можно    установить   из    &lt;em&gt;brew&lt;/em&gt;.    Или    из   исходников    с
&lt;a href="https://github.com/zimbatm/direnv"&gt;github  репозитория&lt;/a&gt; (пакетов  для  популярных дистрибутивов  не
видел).  Для компиляции понадобится &lt;a href="http://golang.org/"&gt;Go&lt;/a&gt;.   Для Gentoo я добавил простенький
&lt;a href="https://github.com/puzan/puzan-overlay/blob/master/app-shells/direnv/direnv-2.3.0.ebuild"&gt;ebuild&lt;/a&gt; в свой &lt;a href="https://github.com/puzan/puzan-overlay"&gt;оверлей&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Использование предельно простое.  Для начала  надо добавить в файл инициализации
вашего shell'а подобные строчки:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; which direnv &amp;gt; /dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;direnv hook &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Далее переходим в нужную директорию и обновляем для нее окружение:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cd &amp;lt;path/to/project&amp;gt;
$ direnv edit .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;При  этом  открывается &lt;code&gt;.envrc&lt;/code&gt;  файл  из  текущей  директории в  вашем  любимом
&lt;strong&gt;$EDITOR&lt;/strong&gt;.   Сюда и  добавляем  необходимое окружение  в достаточно  привычном
виде: &lt;code&gt;export VAR=value&lt;/code&gt;. Например, для Android проектов я использую нечто вроде
следующего:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANDROID_SDK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/Users/puzan/apps/android-sdk
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANT_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-Dsdk.dir=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANDROID_SDK&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Теперь при переходе в папку &lt;code&gt;&amp;lt;path/to/project&amp;gt;&lt;/code&gt; мы увидим следующее:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cd &amp;lt;path/to/project&amp;gt;
direnv: loading .envrc
direnv: export +ANDROID_SDK +ANT_ARGS
$ echo $ANDROID_SDK
/Users/puzan/apps/android-sdk
$ echo $ANT_ARGS 
-Dsdk.dir=/Users/puzan/apps/android-sdk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;При выходе из директории, например на уровень выше, окружение выгрузится:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cd ..
direnv: unloading
$ echo $ANDROID_SDK

$ echo $ANT_ARGS 

$ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Для   Python  проектов   можно   добавить   создание  внутреннего   виртуального
окружения. Помещаем слудующую строчку в &lt;code&gt;.envrc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;layout python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;При этом в папке &lt;code&gt;./.direnv/virtualenv/&lt;/code&gt; будет создано виртуальное окружение и в
&lt;strong&gt;$PATH&lt;/strong&gt;  будет добавлен  правильный путь.   Другие подобные  возможности можно
найти &lt;a href="http://direnv.net/#man/direnv-stdlib.1"&gt;здесь&lt;/a&gt; или в &lt;a href="https://github.com/zimbatm/direnv/blob/master/stdlib.sh"&gt;исходниках&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Есть  легкая возможность  добавить  свои  функции. Наприме  я  добавил для  себя
возможнось  указать,   какое  существующее   Python  виртуальное   окружение  из
&lt;code&gt;~/.virtualenvs/&lt;/code&gt; использовать.   Для этого  добавляем в файл  &lt;code&gt;~/.direnvrc&lt;/code&gt; вот
такую функцию:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Usage: use venv &amp;lt;venv&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Loads the specified python virtualenv&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
use_venv&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;VIRTUAL_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.virtualenvs/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    PATH_add &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$VIRTUAL_ENV&lt;/span&gt;&lt;span class="s2"&gt;/bin&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;После этого в &lt;code&gt;.envrc&lt;/code&gt; можно использовать следующую кострукцию:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;use venv &amp;lt;venv_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;В общем, возможности для расширения  есть. Думаю можно разширить практически под
любую задачу.  На  мой взгляд &lt;a href="http://direnv.net/"&gt;direnv&lt;/a&gt; очень  удобная штука, позволяющая
забыть про  дополнительную настройку  окружения новых  проектов. Кроме  того эта
методика позволяет избежать захламления файлов инициализации.&lt;/p&gt;</content><category term="linux"></category><category term="bash"></category></entry><entry><title>VirtualBox проблемы с Bridged network через Wifi на Mac</title><link href="https://puzan.dev/linux/2014-05-08-virtualbox-problemy-s-bridged-network-cherez-wifi-na-mac.html" rel="alternate"></link><published>2014-05-08T00:00:00+04:00</published><updated>2014-05-08T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-05-08:/linux/2014-05-08-virtualbox-problemy-s-bridged-network-cherez-wifi-na-mac.html</id><summary type="html">&lt;p&gt;На днях  столкнулся с проблемой настройки  сети в &lt;em&gt;VirtualBox&lt;/em&gt; на  &lt;em&gt;MacBook&lt;/em&gt;.  В
качестве гостевой системы пробовал &lt;em&gt;Gentoo&lt;/em&gt; и &lt;em&gt;CentOS&lt;/em&gt; (от &lt;em&gt;Puppet&lt;/em&gt;).  Ноутбук у
меня  естественно  подключен  к  сети  через  &lt;em&gt;Wifi&lt;/em&gt;.   После  некоторых  опытов
выяснилось, что Bridged Network не работает. Точнее говоря виртуалка не получает
&lt;code&gt;DHCPOFFER&lt;/code&gt; от dhcp сервера. Вот логи …&lt;/p&gt;</summary><content type="html">&lt;p&gt;На днях  столкнулся с проблемой настройки  сети в &lt;em&gt;VirtualBox&lt;/em&gt; на  &lt;em&gt;MacBook&lt;/em&gt;.  В
качестве гостевой системы пробовал &lt;em&gt;Gentoo&lt;/em&gt; и &lt;em&gt;CentOS&lt;/em&gt; (от &lt;em&gt;Puppet&lt;/em&gt;).  Ноутбук у
меня  естественно  подключен  к  сети  через  &lt;em&gt;Wifi&lt;/em&gt;.   После  некоторых  опытов
выяснилось, что Bridged Network не работает. Точнее говоря виртуалка не получает
&lt;code&gt;DHCPOFFER&lt;/code&gt; от dhcp сервера. Вот логи с сервера:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;May  6 21:03:41 edi dnsmasq-dhcp[9996]: DHCPDISCOVER(enp1s0) 10.0.2.15 08:00:27:af:18:1e 
May  6 21:03:41 edi dnsmasq-dhcp[9996]: DHCPOFFER(enp1s0) 192.168.0.209 08:00:27:af:18:1e 
May  6 21:03:45 edi dnsmasq-dhcp[9996]: DHCPDISCOVER(enp1s0) 10.0.2.15 08:00:27:af:18:1e 
May  6 21:03:45 edi dnsmasq-dhcp[9996]: DHCPOFFER(enp1s0) 192.168.0.209 08:00:27:af:18:1e 
May  6 21:03:57 edi dnsmasq-dhcp[9996]: DHCPDISCOVER(enp1s0) 10.0.2.15 08:00:27:af:18:1e 
May  6 21:03:57 edi dnsmasq-dhcp[9996]: DHCPOFFER(enp1s0) 192.168.0.209 08:00:27:af:18:1e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;И то что  видно в виртуалке (время немного  не то, но это не  страшно: логи были
такие же):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;May  6 21:56:32 learn dhclient[3262]: DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 15 (xid=0x3a4517ed)
May  6 21:56:47 learn dhclient[3262]: DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 8 (xid=0x3a4517ed)
May  6 21:56:55 learn dhclient[3262]: DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 14 (xid=0x3a4517ed)
May  6 21:57:09 learn dhclient[3262]: DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 1 (xid=0x3a4517ed)
May 6 21:57:10 learn dhclient[3262]: No DHCPOFFERS received.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Соответственно этот &lt;code&gt;DHCPOFFER&lt;/code&gt; где-то и теряется.  Пока еще не искал конкретное
место потери  этого сообщения.  Постараюсь  на днях поснифить  трафик. Возможно,
что &lt;em&gt;Wifi&lt;/em&gt;  точка от &lt;em&gt;D-Link&lt;/em&gt; не  пускает через себя часть  DHCP запросов.  Если
кто  сталкивался с  подобной проблемой  и нашел  путь настроить  Bridged Network
через &lt;em&gt;Wifi&lt;/em&gt; на &lt;em&gt;Маке&lt;/em&gt; милости прошу в комментарии.&lt;/p&gt;
&lt;p&gt;Хочу заметить, что все отлично  работает если &lt;em&gt;Mac&lt;/em&gt; подключать через &lt;em&gt;Ethernet&lt;/em&gt;.
Также  нашел   &lt;a href="https://www.virtualbox.org/ticket/10019"&gt;багрепорт&lt;/a&gt;  2-х  летней
давности на подобную  ошибку. И еще где-то полгода  назад настраивал аналогичное
дело, но вроде бы (могу ошибаться) подобных проблем с сетью не было.&lt;/p&gt;
&lt;p&gt;Сам нашел  для себя  следующий обходной  путь.  Добавил  2 сетевых  адаптера для
виртуалки.  Первый настроил через &lt;em&gt;NAT&lt;/em&gt; (для доступа к интернету).  Второй через
Host-only  Adapter  (для  &lt;em&gt;SSH&lt;/em&gt;  из  внешней  системы).   Соответственно  первая
сетевуха внутри  виртуалки нормально  поднимается через dhcp.  А вот  для второй
надо указать  статический ip.  Пробовал  использовать dhcp сервер  для Host-only
сети (галочка в настойках соответствующей сети в VirtualBox), но ip так и не был
получен.  В принципе мне достаточно пока  статического адреса, но все же было бы
удобнее получать его автоматом.&lt;/p&gt;
&lt;p&gt;Какое  решение тут  будет  самым  оптимальным? Есть  подозрение,  что моя  схема
несколько избыточна. Для  меня достаточно иметь SSH доступ к  гостевой системе и
чтобы она имела доступ в интернет.&lt;/p&gt;</content><category term="linux"></category><category term="mac"></category><category term="virtualbox"></category></entry><entry><title>Новый блог</title><link href="https://puzan.dev/misc/2014-04-18-novyi-blog.html" rel="alternate"></link><published>2014-04-18T00:00:00+04:00</published><updated>2014-04-18T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2014-04-18:/misc/2014-04-18-novyi-blog.html</id><summary type="html">&lt;p&gt;После многих раздумий и рассмотрения  нескольких ваиантов, я решил перенести все
свои блоги  в одно место. Когда-то  давно я использовал &lt;a href="http://users.livejournal.com/_zain/" title="Пузатая жизнь"&gt;ЖЖ&lt;/a&gt;  для общих тем.
Потом сделал отдельные бложики для &lt;a href="http://puzan-linux.blogspot.com/" title="Линукс штуки!"&gt;линукса&lt;/a&gt; и &lt;a href="http://puzan-read.blogspot.com/" title="Чего начитался..."&gt;книг&lt;/a&gt; на blogger'е.
Еще была музыкальная  тема, но онп как-то  совсем у меня не  прокатила. Теперь я
решил  соединить …&lt;/p&gt;</summary><content type="html">&lt;p&gt;После многих раздумий и рассмотрения  нескольких ваиантов, я решил перенести все
свои блоги  в одно место. Когда-то  давно я использовал &lt;a href="http://users.livejournal.com/_zain/" title="Пузатая жизнь"&gt;ЖЖ&lt;/a&gt;  для общих тем.
Потом сделал отдельные бложики для &lt;a href="http://puzan-linux.blogspot.com/" title="Линукс штуки!"&gt;линукса&lt;/a&gt; и &lt;a href="http://puzan-read.blogspot.com/" title="Чего начитался..."&gt;книг&lt;/a&gt; на blogger'е.
Еще была музыкальная  тема, но онп как-то  совсем у меня не  прокатила. Теперь я
решил  соединить все  что пишу  в  одном месте,  но публиковать  соответствующие
записи в разных категориях.&lt;/p&gt;
&lt;p&gt;Итак  сегодняшний вариант  моего  присутствия  в сети  -  это статический  сайт,
сгенерированный с помощью &lt;a href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt; и выложенный на &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Пару   слов    про   хостинг.   В    качестве   него   я    решил   использовать
&lt;a href="https://pages.github.com/"&gt;Github  Pages&lt;/a&gt;. Вариант  с доставкой  контента на  сервер с  помощью git
очень  удобен.  Репозиторий  связанный  с этим  сайтиком  представляет  собой  2
несвязанные     ветки.    Одна     для    исходных     текстов    в     Markdown
(&lt;a href="https://github.com/puzan/puzan.github.io/tree/source"&gt;source&lt;/a&gt;).   Другая   для   сгенерированных   &lt;em&gt;html&lt;/em&gt;   страничек
(&lt;a href="https://github.com/puzan/puzan.github.io/tree/master"&gt;master&lt;/a&gt;).   Для   публикации    на   master   ветку   использую
&lt;a href="https://github.com/davisp/ghp-import"&gt;ghp-import&lt;/a&gt;. Для удобства поправил &lt;em&gt;Makefile&lt;/em&gt; следующим образом:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nf"&gt;github&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ghp&lt;/span&gt;
    git push origin master

&lt;span class="nf"&gt;ghp&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;publish&lt;/span&gt;
    ghp-import -b master -m &lt;span class="s2"&gt;&amp;quot;Site update &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;NOW&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;OUTPUTDIR&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Мне очень  нравится писать  тексты в &lt;a href="http://daringfireball.net/projects/markdown/syntax"&gt;Markdown&lt;/a&gt;,  поэтому я  смотрел в
сторону  движков, генерирующих  статику из  этого формата.   На блоггере  я тоже
сначала писал в  &lt;a href="http://daringfireball.net/projects/markdown/syntax"&gt;Markdown&lt;/a&gt;, потом конвертировал в &lt;em&gt;html&lt;/em&gt;  и с помощью
&lt;a href="http://code.google.com/p/googlecl/"&gt;googlecl&lt;/a&gt; публиковал заметки. Немного  про публикацию с помощью этого
варианта   описано  &lt;a href="https://puzan.dev/linux/2013-01-24-blogger-post-iz-emacs-markdown-googlecl-script.html"&gt;здесь&lt;/a&gt;.    Сначала
думал об &lt;a href="http://octopress.org/"&gt;Octopress&lt;/a&gt; (Ruby),  но где-то на &lt;a href="http://www.radio-t.com/"&gt;Радио-Т&lt;/a&gt; услышал
или прочитал о &lt;a href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt; (Python).  И выбор пал именно на этот вариант,
так  как  &lt;em&gt;Python&lt;/em&gt;  мне  несколько  ближе, чем  &lt;em&gt;Ruby&lt;/em&gt;.   Смогу  в  случае  чего
подправить что-нибудь под свои нужды.&lt;/p&gt;
&lt;p&gt;В  общем сейчас  уже работают  &lt;a href="http://disqus.com/"&gt;disqus&lt;/a&gt;-комментарии.  В  ближайшее время
обновлю  RSS-ленты на  feedburner.   Ну и  потихоньку  перетащу старые  заметки,
которые я  еще в &lt;a href="http://mwolson.org/projects/EmacsMuse.html"&gt;muse&lt;/a&gt;  писал. Также  буду постепенно править  тему. Если
есть предложения - высказывайтесь!&lt;/p&gt;</content><category term="misc"></category><category term="блог"></category><category term="pelican"></category><category term="github"></category></entry><entry><title>Как создать bridge на nfs root</title><link href="https://puzan.dev/linux/2013-09-03-kak-sozdat-bridge-na-nfs-root.html" rel="alternate"></link><published>2013-09-03T00:00:00+04:00</published><updated>2013-09-03T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-09-03:/linux/2013-09-03-kak-sozdat-bridge-na-nfs-root.html</id><summary type="html">&lt;p&gt;Для поднятия сети  на одной железке возникла необходимость  создать &lt;em&gt;bridge&lt;/em&gt;. Но
загвоздка в  том, что система  должна при  загрузке монтировать &lt;em&gt;nfs&lt;/em&gt;  в корень.
Данное условие необходимо  для возможности быстро изменить что-то  в системе без
необходимости лезть на флешку.  Отладка идет полным ходом.  Но основная проблема
как раз в том, что …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Для поднятия сети  на одной железке возникла необходимость  создать &lt;em&gt;bridge&lt;/em&gt;. Но
загвоздка в  том, что система  должна при  загрузке монтировать &lt;em&gt;nfs&lt;/em&gt;  в корень.
Данное условие необходимо  для возможности быстро изменить что-то  в системе без
необходимости лезть на флешку.  Отладка идет полным ходом.  Но основная проблема
как раз в том, что при создании  &lt;em&gt;bridge&lt;/em&gt; сеть придется в любом случае оборвать.
&lt;em&gt;Nfs&lt;/em&gt; такого  пережить не может  и отваливается.  Соответственно  система дальше
грузиться не  может так  как нету  корневой файловой системы  и сеть  также сама
вернуться не может.&lt;/p&gt;
&lt;p&gt;Я уже думал  искать какое-то альтернативное решение: как  неожиданно мой коллега
натолкнулся на небольшую &lt;a href="http://lnotestoself.blogspot.ru/2013/04/enabling-bridge-interface-when-youre-on.html"&gt;заметку&lt;/a&gt;, в  которой описано как обойти указанную
проблему.&lt;/p&gt;
&lt;p&gt;Сущность данного решения  сводиться к тому, что надо все  файлы, необходимые для
настройки &lt;em&gt;bridge&lt;/em&gt;, скопировать в раздел с &lt;em&gt;tmpfs&lt;/em&gt;, который будет доступен после
обрыва  сети.  Я,  например,  использовал &lt;code&gt;/tmp&lt;/code&gt;.   А  потом запустить  создание
&lt;em&gt;bridge&lt;/em&gt;  из нового  окружения.   Данный  метод работает  на  ура, нареканий  не
заметил.&lt;/p&gt;
&lt;p&gt;Вот собственно решение с моими малюсенькими изменениями:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -x
mount -o remount,exec /tmp
&lt;span class="nv"&gt;R&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/root
&lt;span class="nv"&gt;IPADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.0.159/8

mkdir -p &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$R&lt;/span&gt;&lt;span class="s2"&gt;/proc&amp;quot;&lt;/span&gt;
cp -r /sbin /bin /lib &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$R&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
cat &amp;gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$R&lt;/span&gt;&lt;span class="s2"&gt;/script&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;mount -t proc none /proc&lt;/span&gt;
&lt;span class="s"&gt;brctl addbr br0&lt;/span&gt;
&lt;span class="s"&gt;brctl addif br0 eth0&lt;/span&gt;
&lt;span class="s"&gt;ifconfig br0 &amp;quot;$IPADDR&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;ifconfig eth0 0.0.0.0&lt;/span&gt;
&lt;span class="s"&gt;umount /proc&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

chroot &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$R&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; sh script
rm -r &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$R&lt;/span&gt;&lt;span class="s2"&gt;/sbin&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$R&lt;/span&gt;&lt;span class="s2"&gt;/bin&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$R&lt;/span&gt;&lt;span class="s2"&gt;/lib&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;В нутрь &lt;code&gt;script&lt;/code&gt; в принципе можно вставить все, что вам будет необходимо.&lt;/p&gt;
&lt;p&gt;Хорош ли  метод?  Мне  по крайней  мере понравился.   Есть еще  предложения, как
возможно решить данный вопрос?&lt;/p&gt;</content><category term="linux"></category><category term="linux"></category><category term="nfs"></category><category term="net"></category><category term="bridge"></category></entry><entry><title>Emacs + Java</title><link href="https://puzan.dev/linux/2013-08-25-emacs-java.html" rel="alternate"></link><published>2013-08-25T00:00:00+04:00</published><updated>2013-08-25T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-08-25:/linux/2013-08-25-emacs-java.html</id><summary type="html">&lt;p&gt;Появилась у  меня в последнее  время необходимость основательно  познать &lt;em&gt;Java&lt;/em&gt;.
Очень долго  не смотрел в  его сторону, были  у меня некоторые  предубеждения. Я
всегда думал,  что &lt;em&gt;plain  C&lt;/em&gt; и  &lt;em&gt;Lisp&lt;/em&gt; это  наше все.   И этого  достаточно.  А
сейчас  работа повернулась  стороной  с &lt;em&gt;Java&lt;/em&gt;  лицом  и соответственно  захотел
быстренько познать его …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Появилась у  меня в последнее  время необходимость основательно  познать &lt;em&gt;Java&lt;/em&gt;.
Очень долго  не смотрел в  его сторону, были  у меня некоторые  предубеждения. Я
всегда думал,  что &lt;em&gt;plain  C&lt;/em&gt; и  &lt;em&gt;Lisp&lt;/em&gt; это  наше все.   И этого  достаточно.  А
сейчас  работа повернулась  стороной  с &lt;em&gt;Java&lt;/em&gt;  лицом  и соответственно  захотел
быстренько познать его особенности, а  также настроить свой любимый редактор для
удобной работы с этим популярным языком программирования.&lt;/p&gt;
&lt;p&gt;Для  каждого языка  программирования в  &lt;em&gt;Emacs&lt;/em&gt; я  стараюсь настроить  следующие
возможности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Подсветка синтаксиса (есть из коробки)&lt;/li&gt;
&lt;li&gt;Авто дополнения (желательно через auto-complete)&lt;/li&gt;
&lt;li&gt;Навигация по коду&lt;/li&gt;
&lt;li&gt;Работа с проектами (опционально, люблю работать в консоли вне Emacs)&lt;/li&gt;
&lt;li&gt;REPL (также опционально, но очень помогает во время обучения)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Из коробки в &lt;code&gt;java-mode&lt;/code&gt; фактически  работает только подсветка синтаксиса. Cedet
идущий с  Emacs'ом также позваляет  настроить автодополнения и  навигацию внутри
классов.  Но  вот, например,  системные вещи  наотрез отказывается  предлагать в
качестве дополнений.&lt;/p&gt;
&lt;p&gt;В общем  я решил  посмотреть, какие сейчас  есть удобств для  работы с  &lt;em&gt;Java&lt;/em&gt; в
&lt;em&gt;Emacs&lt;/em&gt;. При этом я наткнулся на следующие вещи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jdee.sourceforge.net/"&gt;JDEE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/buzztaiki/malabar-mode"&gt;malabar-mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/senny/emacs-eclim/"&gt;Eclime for Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-java/auto-java-complete"&gt;Auto Java Complete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CEDET Developer Version (&lt;a href="http://cedet.sourceforge.net/bzr-repo.shtml"&gt;Bazaar repo&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Немного впечатлений о каждом расширении. Все  пробовал на &lt;em&gt;MacBook Air&lt;/em&gt;, &lt;em&gt;OS X&lt;/em&gt;,
&lt;em&gt;Emacs 24.3.1&lt;/em&gt; из &lt;a href="http://macports.org/"&gt;MacPorts&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;JDEE&lt;/h2&gt;
&lt;p&gt;Старое и  похоже переставшее развиваться  расширение. Сразу не  понравилось, что
тянет с  собой свою цветовую  схему.  Мелочи, но  они всегда бросаются  в глаза.
Также  &lt;em&gt;JDEE&lt;/em&gt; каким-то  образом  умудряется  нарушить работу  &lt;code&gt;whitespace-mode&lt;/code&gt;,
который перестает подсвечивать вообще что-либо.  Данную проблему решить не смог.
Есть у меня подозрение, что это  связано с перекрашиванием буфера, но глубока не
капал  за ненадобностью.   Нечто похожее  сейчас  есть в  &lt;code&gt;markdown-mode&lt;/code&gt;. Ну  и
каких-то особых возможностей здесь не  нашел.  Все плюшки сделаны через &lt;em&gt;Cedet&lt;/em&gt;,
соответственно их можно получить и без &lt;em&gt;JDEE&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Malabar-mode&lt;/h2&gt;
&lt;p&gt;Завязан   на   &lt;em&gt;Maven&lt;/em&gt;,   про   который  ранее   слышал   совсем   чуть-чуть   и
отдаленно. Быстренько глянул,  как работать с этим  менеджером проектов.  Создал
тестовый проект, но производительность  &lt;code&gt;malabar-mode&lt;/code&gt; вообще не порадовала.  Он
как  я понял  использует &lt;em&gt;Groovy&lt;/em&gt;  console  для формирования  дополнений. И  это
похоже   порой  не   быстрый  процесс.    В   общем  от   этого  варианта   тоже
отказался.   Кроме  того   проект  также   загибается.  Хотя   в  знакомстве   с
&lt;code&gt;malabar-mode&lt;/code&gt; есть свой плюс: я узнал что такое &lt;em&gt;Maven&lt;/em&gt; и как с ним работать.&lt;/p&gt;
&lt;h2&gt;Eclime&lt;/h2&gt;
&lt;p&gt;Вот это вообще монстр.  Идея затащить в &lt;em&gt;Emacs&lt;/em&gt; (изначально в &lt;em&gt;Vim&lt;/em&gt;) функционал &lt;em&gt;Eclipse&lt;/em&gt; через некий
интерфейс тоже  на деле  оказывается не шибко  производительна. В  данном случае
&lt;em&gt;eclime&lt;/em&gt;  запускает &lt;em&gt;Eclipse&lt;/em&gt;  на  заднем плане  и общается  с  ним, чтобы  получить
автодополнения  и еще  некоторый функционал  (рефакторинг, навигация  по коду  и
т.п.). Скорость отзывчивости данной системы еще меньше, чем у &lt;em&gt;Malabar&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Auto Java Complete&lt;/h2&gt;
&lt;p&gt;Смысл данного расширения прост:  сгенерировать теги необходимых &lt;em&gt;Java&lt;/em&gt; библиотек
и предоставить интерфейс для  &lt;code&gt;auto-complete&lt;/code&gt;. Я попробовал использовать готовые
теги  и это  работает достаточно  быстро  и удобно.  Но тут  мы получаем  только
информацию  системных библиотек  и того  что сами  укажем ручками  при генерации
тегов.  В  принципе в связке со  стандартным &lt;em&gt;Cedet&lt;/em&gt; идущим с  &lt;em&gt;Emacs&lt;/em&gt;'ом должно
всего этого хватить.&lt;/p&gt;
&lt;h2&gt;Cedet Dev&lt;/h2&gt;
&lt;p&gt;Самый  удобный,  как мне  кажется,  вариант  это использовать  последнюю  версию
&lt;em&gt;Cedet&lt;/em&gt;  из  &lt;em&gt;Bazaar&lt;/em&gt; репозитория.   Тут  сейчас  &lt;em&gt;Java&lt;/em&gt; хорошо  поддерживается.
&lt;em&gt;Maven&lt;/em&gt;  проекты кстати  тоже  отлично воспринимаются.   По  работе и  настройке
&lt;em&gt;Cedet&lt;/em&gt; лучше обращаться к &lt;a href="http://alexott.net/ru/writings/emacs-devenv/EmacsCedet.html"&gt;статье Alex Ott'а&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;На  данный   момент  я  остановился   на  последнем  варианте:  &lt;em&gt;Cedet&lt;/em&gt;   Dev  +
&lt;code&gt;auto-complete&lt;/code&gt;. Есть  у кого  еще предложения  как улучшить  жизнь в  Emacs при
работе с &lt;em&gt;Java&lt;/em&gt;?  Или все таки &lt;em&gt;Cedet&lt;/em&gt;  это наше все и смотреть в другие стороны
лучше не стоит?&lt;/p&gt;</content><category term="linux"></category><category term="emacs"></category><category term="java"></category></entry><entry><title>Панов В. - Анклавы</title><link href="https://puzan.dev/read/2013-08-20-panov-v-anklavy.html" rel="alternate"></link><published>2013-08-20T00:00:00+04:00</published><updated>2013-08-20T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-08-20:/read/2013-08-20-panov-v-anklavy.html</id><summary type="html">&lt;p&gt;За  последний  год  я  познакомился  с  тремя  произведениями  &lt;em&gt;Вадима  Панова&lt;/em&gt;,
связанными с миром &lt;em&gt;Анклавов&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Поводыри на распутье&lt;/li&gt;
&lt;li&gt;Костры на алтарях&lt;/li&gt;
&lt;li&gt;Продавцы невозможного&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Первую книгу из серии я читал ранее, про нее был отдельный &lt;a href="http://puzan-read.blogspot.com/2010/01/blog-post_741.html"&gt;пост&lt;/a&gt;.  Так как
отдельно про  указанные выше  произведения не писал,  то решил  скомпоновать все
свои анклавские заметки …&lt;/p&gt;</summary><content type="html">&lt;p&gt;За  последний  год  я  познакомился  с  тремя  произведениями  &lt;em&gt;Вадима  Панова&lt;/em&gt;,
связанными с миром &lt;em&gt;Анклавов&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Поводыри на распутье&lt;/li&gt;
&lt;li&gt;Костры на алтарях&lt;/li&gt;
&lt;li&gt;Продавцы невозможного&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Первую книгу из серии я читал ранее, про нее был отдельный &lt;a href="http://puzan-read.blogspot.com/2010/01/blog-post_741.html"&gt;пост&lt;/a&gt;.  Так как
отдельно про  указанные выше  произведения не писал,  то решил  скомпоновать все
свои анклавские заметки в одном месте.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Анклавы&lt;/em&gt; сначала мне очень понравились. Помню, во время прочтения первой книги,
я был восхищен  новым технологическим миром.  Борьба  корпораций, новый источник
энергии, наноштуки и  супер программисты. Затем возник  некоторый дискомфорт при
появлении всякой  мистики, волшебных и  религиозных вещей.   Да, это все  было с
самого начала, но не так сильно выпячивалось.&lt;/p&gt;
&lt;p&gt;Очень удивило,  что главного героя первой  книги, хакера Чайку, автор  засунул в
Африку (я кстати сам  сейчас в ЮАР) и держал там аж до  4-ой книги? В общем пока
его мусолили в Африке  я совершенно охладел к серии. И  в итоге последнюю книгу,
&lt;em&gt;Хаосовершенство&lt;/em&gt;, я даже не открывал.&lt;/p&gt;
&lt;p&gt;На протяжении всей серии каждая книга заканчивается почти счастливым концом. Все
главные герои  умудряются остаться  в живых после  ого-го каких  передряг. Урзак
точно  должен был  прихватить кого-нибудь  на тот  свет.  Но  нет. В  этом плане
видимо "Костры на алтарях" несколько отличились: Дорадо все таки погибает.&lt;/p&gt;
&lt;p&gt;В серии видимо ставится будоражащий вопрос сосуществования религии и технологий,
но раскрывается  он методами, которые меня  совсем не захватывают. Да  экшен, да
полюбившиеся мне рваное повествование.  Но я ожидал качественную технологическую
историю, а не борьбу религиозных фанатиков.&lt;/p&gt;
&lt;p&gt;Понравился  стеб над  Европой, которая  в мире  &lt;em&gt;Анклавов&lt;/em&gt; вступила  в Исламский
союз: "для правоверного европейца помолиться в мечети Трех имамов почти столь же
важно, как совершить хадж в Мекку". Весело да смешно, да только похоже именно до
этого докатится современная Европа когда-нибудь.&lt;/p&gt;
&lt;p&gt;Ну  и на  последок  надо сказать,  что  всегда на  жизнь  будут большое  влияние
оказывать чувства  и вера. Технологии это  только побочный продукт жизни.   В то
время как наши  чувства и есть сама жизнь. Данная  мысль, по-моему, периодически
поднималась во всех книгах серии. И это конечно здорово.&lt;/p&gt;</content><category term="Read"></category><category term="Панов В."></category><category term="Анклавы"></category></entry><entry><title>Хранение конфигурационных файлов (RCS &amp; Git)</title><link href="https://puzan.dev/linux/2013-06-11-khranenie-konfiguratsionnykh-failov-rcs-git.html" rel="alternate"></link><published>2013-06-11T00:00:00+04:00</published><updated>2013-06-11T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-06-11:/linux/2013-06-11-khranenie-konfiguratsionnykh-failov-rcs-git.html</id><summary type="html">&lt;p&gt;Когда-то  давным давно,  я  впервые познакомился  с  системами контроля  версий.
Наверное это была &lt;em&gt;CVS&lt;/em&gt;.   &lt;em&gt;Git&lt;/em&gt;'а тогда еще в планах думаю  не было. Возникла у
меня  примерно  в  то  далекое  время логичная  идея  хранить  все  настройки  в
какой-нибудь  подобной системе.   Так совпало,  что  тогда же  я активно  изучал
&lt;em&gt;Emacs&lt;/em&gt;. И …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Когда-то  давным давно,  я  впервые познакомился  с  системами контроля  версий.
Наверное это была &lt;em&gt;CVS&lt;/em&gt;.   &lt;em&gt;Git&lt;/em&gt;'а тогда еще в планах думаю  не было. Возникла у
меня  примерно  в  то  далекое  время логичная  идея  хранить  все  настройки  в
какой-нибудь  подобной системе.   Так совпало,  что  тогда же  я активно  изучал
&lt;em&gt;Emacs&lt;/em&gt;. И  наткнулся тагда я на  &lt;em&gt;Version Control&lt;/em&gt; расширение. Именно  оттуда я
узнал о  более древней  системе: &lt;em&gt;RCS&lt;/em&gt;.   Как ни странно,  именно в  эту систему
&lt;em&gt;Emacs&lt;/em&gt; предлагает добавить файлы по умолчанию (&lt;code&gt;C-x v v&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Так вот,  с тех  давних пор  у меня все  хранилось в  &lt;em&gt;RCS&lt;/em&gt;.  Вообще  говоря это
достаточно удобно, если единственная задача:  хранить историю изменений на одной
машине. Все управление через  &lt;em&gt;Emacs&lt;/em&gt;. Я даже не особо знаю  ключи команд &lt;code&gt;ci&lt;/code&gt; и
&lt;code&gt;co&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Теперь  же  у  меня  фактически  4  компьютера, на  которых  я  хотел  бы  иметь
одинаковые, хотя бы,  пользовательские настройки. Например, для  &lt;em&gt;bash&lt;/em&gt; или того
же  &lt;em&gt;git&lt;/em&gt;. Для  этого  я задумал  поместить все  необходимые  файлы из  домашней
директории в  &lt;em&gt;git&lt;/em&gt; репозиторий.   Но положить  в &lt;em&gt;git&lt;/em&gt;  всю или  часть домашней
директории похоже нехорошая идея. Однозначно будут глюки с &lt;em&gt;git prompt&lt;/em&gt;. Если не
добавить  все файлы  в &lt;code&gt;.gitignore&lt;/code&gt;,  то &lt;em&gt;git  prompt&lt;/em&gt; просто  подвесит консоль:
сканирование  всей   домашней  директории  не   быстрое  дело.   Думаю   это  не
единственная проблема.&lt;/p&gt;
&lt;p&gt;Я  решил   воспользоваться  следующей   схемой.   Нужные  файлы   скопировать  в
специальную  папочку.   В ней  организовать  &lt;em&gt;git&lt;/em&gt;  репозиторий.  А  в  домашней
директории создать  ссылки на файлы  из этой папки. Для  автоматизации последней
задачи   я   написал   небольшой   скриптик.    Когда   доработаю,   выложу   на
&lt;a href="https://github.com/puzan"&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Еще одна проблема: специфичные настройки определенных машин.  Например, &lt;code&gt;PATH&lt;/code&gt; в
&lt;em&gt;Linux&lt;/em&gt; и &lt;em&gt;OS X&lt;/em&gt; местами  различаются (избыточности не хочется).  В &lt;code&gt;.gitconfig&lt;/code&gt;
у меня даже различие есть. Для решения этого вопроса я создал для каждой машины,
которой  необходимы какие-то  особенности,  специальную  ветку. Общие  настройки
хранятся на  &lt;em&gt;master&lt;/em&gt; ветке.   Неудобство этой  схемы связанно  с тем,  что надо
постоянно  сливать  изменения с  &lt;em&gt;master&lt;/em&gt;'а  в  специфичные ветки.   Может  есть
какое-то более простое и элегантное решение?&lt;/p&gt;
&lt;p&gt;Ну а системные настройки (&lt;code&gt;/etc/&lt;/code&gt;) я так и продолжаю хранить в &lt;em&gt;RCS&lt;/em&gt;. Если будет
задача настройки  нескольких одинаковых машин,  то можно будет подумать  на тему
синхронизации через  &lt;em&gt;git&lt;/em&gt;.  Пока это  не нужно.   &lt;em&gt;RCS&lt;/em&gt; хранит историю  и этого
достаточно.  Насколько знаю &lt;em&gt;portage&lt;/em&gt; в  &lt;em&gt;gentoo&lt;/em&gt; можно настроить для сохранения
истории в &lt;em&gt;RCS&lt;/em&gt; (см. &lt;code&gt;/etc/dispatch-conf.conf&lt;/code&gt;).   Но сам я этой возможностью не
пользуюсь.  Что-то там не состыковывается с моими привычками.&lt;/p&gt;</content><category term="linux"></category><category term="git"></category><category term="rcs"></category><category term="config"></category></entry><entry><title>Замятин Е. - Мы</title><link href="https://puzan.dev/read/2013-06-06-zamiatin-e-my.html" rel="alternate"></link><published>2013-06-06T00:00:00+04:00</published><updated>2013-06-06T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-06-06:/read/2013-06-06-zamiatin-e-my.html</id><summary type="html">&lt;p&gt;Полюбил я антиутопии!  Просто красота!   &lt;em&gt;"Мы"&lt;/em&gt; было прочитано мной примерно год
назад. Имен героев даже не помню. Хотя,  как их запомнишь?  Они же все нумера. А
вот память на цифры у меня ужасная.&lt;/p&gt;
&lt;p&gt;Замечательный стройный  и ровный мир цифр.   Читаешь и думаешь, что  все они там
сумашедшие.   Нереально современному  человеку …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Полюбил я антиутопии!  Просто красота!   &lt;em&gt;"Мы"&lt;/em&gt; было прочитано мной примерно год
назад. Имен героев даже не помню. Хотя,  как их запомнишь?  Они же все нумера. А
вот память на цифры у меня ужасная.&lt;/p&gt;
&lt;p&gt;Замечательный стройный  и ровный мир цифр.   Читаешь и думаешь, что  все они там
сумашедшие.   Нереально современному  человеку  спокойно выжить  в этом  гладком
мире.  Наверное  именно эта  абсурдность антиутопий  меня и  привлекает.  Вообще
думаю умение  понять, когда что-то  или кто-то начинает перебарщивать  и вовремя
его остановить очень полезно. Для людей в целом.&lt;/p&gt;
&lt;p&gt;Во время развития  сюжета, чувствуется как у героя изменяется  ощущение мира.  В
самом  начале мир  изображен  очень  четко.  Резкие  границы,  прямые линии.   К
середине   все  уже   в   тумане.   Появляются   длинные,  красивые   лирические
отступления. Герой видит все немножко расплывчатым, не обращает внимания на этот
угловатый мир. Ему это все становится не важно. Он влюблен…&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"-"  (минус)&lt;/em&gt;  — просто  чудеснейшее  из  известных  мне ругательств  (&lt;em&gt;"Все  в
рот!!!"&lt;/em&gt; нервно курит в сторонке).  Как просто и стройно оно вписывается в общую
концепцию  представленного мира.   Интересно, что  в тексте  ни разу  само слово
&lt;em&gt;минус&lt;/em&gt;  не было  использовано.   Только  знак.  Так  автор  еще больше  придает
отрицательную окраску данному ругательству.   Мнимая единица наверное это вообще
что-то нереально грубое.   Придумать аналог из современного мира  мне сложно.  Я
не ругаюсь.&lt;/p&gt;
&lt;p&gt;Вообще говоря удивительно, как произведение  &lt;em&gt;Оруэлла&lt;/em&gt; &lt;em&gt;"1984"&lt;/em&gt; похоже на детище
&lt;em&gt;Замятина&lt;/em&gt;.  Сюжеты  одинаково завязаны на  женщинах. Герои благодаряя  им &lt;em&gt;(или
из-за них)&lt;/em&gt; попадают в некое подобие сопротивления.  Ну и в итоге все конечно же
срывается.   Но  есть  существенная   разница  в  концовках.   Герой  &lt;em&gt;Замятина&lt;/em&gt;
прогибается под  научный прогресс и лишает  себя чувств. Наука побеждает  в этом
мире  т  тут  не  остается  места  эмоциям.   А  герой  Оруэлла  не  выдерживает
психологического давления и признается в  любви &lt;em&gt;Большому Брату&lt;/em&gt;.  Даже не знаю,
что хуже. Однозначно только то, что все это печально.&lt;/p&gt;
&lt;p&gt;Надо бы  обязательно прочитать еще  &lt;em&gt;"Утопию" Мора&lt;/em&gt;.   Вся история про  утопии и
антиутопии как раз с  этого произведения началась, а я и не  знаю точно, что там
внутри.  Государство Платона, кстати, тоже думаю из той же оперы.&lt;/p&gt;</content><category term="read"></category><category term="Замятин Е."></category><category term="художественная литература"></category></entry><entry><title>Gems и другие пакетные менеджеры</title><link href="https://puzan.dev/linux/2013-06-04-gems-i-drugie-paketnye-menedzhery.html" rel="alternate"></link><published>2013-06-04T00:00:00+04:00</published><updated>2013-06-04T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-06-04:/linux/2013-06-04-gems-i-drugie-paketnye-menedzhery.html</id><summary type="html">&lt;p&gt;Только  недавно  столкнулся и  попробовал  использовать  &lt;em&gt;rubygems&lt;/em&gt;.  Ранее  все
устанавливал через &lt;em&gt;portage&lt;/em&gt;.   Но частенько стали попадаться  статьи, в которых
пишут нечто вроде следующего:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gem install git-up
gem install bundle
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Это  добро у  меня вызывало,  некоторое недоумение  (что еще  за левые  пакетные
менеджеры???)   и  я бежал  искать  аналоги  в  &lt;em&gt;portage&lt;/em&gt;.  Частенько …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Только  недавно  столкнулся и  попробовал  использовать  &lt;em&gt;rubygems&lt;/em&gt;.  Ранее  все
устанавливал через &lt;em&gt;portage&lt;/em&gt;.   Но частенько стали попадаться  статьи, в которых
пишут нечто вроде следующего:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gem install git-up
gem install bundle
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Это  добро у  меня вызывало,  некоторое недоумение  (что еще  за левые  пакетные
менеджеры???)   и  я бежал  искать  аналоги  в  &lt;em&gt;portage&lt;/em&gt;.  Частенько  этого  не
находилось даже в различных &lt;em&gt;overlay&lt;/em&gt;'ях.  И вот в один из таких моментов, решив
сэкономить время на поиск &lt;em&gt;ebuild&lt;/em&gt;'ов,  я все-таки выполнил указанную команду. И
получил необходимое приложение в &lt;code&gt;~/.gem/ruby/1.9.1/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Но  тут  пользователи  &lt;em&gt;gentoo&lt;/em&gt;  столкнуться  с  некоторым  затруднением.   Этот
дистрибутив  не очень  дружелюбен для  &lt;em&gt;ruby&lt;/em&gt;.   То, что  установится, не  будет
доступно в  &lt;code&gt;PATH&lt;/code&gt;.  В  других используемых  мной системах  аналогичной проблемы
замечено не было. В &lt;em&gt;OS X&lt;/em&gt;  и &lt;em&gt;Windows&lt;/em&gt; (&lt;em&gt;Cygwin&lt;/em&gt;) &lt;code&gt;PATH&lt;/code&gt; сам без дополнительных
движений обновляется.&lt;/p&gt;
&lt;p&gt;На  &lt;a href="https://bugs.gentoo.org/show_bug.cgi?id=403157"&gt;bugs.gentoo.org&lt;/a&gt; нашел  следующее  универсальное  решение.  Создаем  в
папке &lt;code&gt;/etc/profile&lt;/code&gt; файл следующего содержания:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; -L &lt;span class="s2"&gt;&amp;quot;/usr/bin/ruby&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;RUBY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;readlink /usr/bin/ruby &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt; /dev/null&lt;span class="k"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RUBY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; in
        *18&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1.8&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        *19&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1.9.1&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
          *&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RUBY&lt;/span&gt;&lt;span class="p"&gt;##*/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;

    &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.gem/ruby/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/bin:&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;После этого все будет доступно как надо.&lt;/p&gt;
&lt;p&gt;Похоже   использовать   &lt;em&gt;gem&lt;/em&gt;   намного  удобнее,   чем   стандартный   пакетный
менеджер. Тем более  на своей локальной машине с  фактически одним пользователем
(root не считается).   Конечно можно добавлять себе постоянно  новые &lt;em&gt;overlay&lt;/em&gt; и
писать новые  &lt;em&gt;ebuild&lt;/em&gt;.  Но как  показала моя практика это  занимает существенно
больше  времени.   Да  и  кроме  того написание  однотипных  &lt;em&gt;ebuild&lt;/em&gt;  не  особо
интересное занятие.  Генератора нету случаем?  Не знаю как дело обстоит в других
дистрибутивах, но думаю как-то также.&lt;/p&gt;
&lt;p&gt;Еще в последнее  время натолкнулся на &lt;em&gt;pip&lt;/em&gt; для &lt;em&gt;python&lt;/em&gt;  и &lt;em&gt;npm&lt;/em&gt; для &lt;em&gt;node.js&lt;/em&gt;.
Идея общественных  хранилищ для программ,  написанных на определенном  языке как
никак популярна сейчас. И это реально удобно.&lt;/p&gt;</content><category term="linux"></category><category term="ruby"></category><category term="gem"></category><category term="python"></category><category term="pip"></category><category term="gentoo"></category></entry><entry><title>Личный Firefox Sync</title><link href="https://puzan.dev/linux/2013-06-03-lichnyi-firefox-sync.html" rel="alternate"></link><published>2013-06-03T00:00:00+04:00</published><updated>2013-06-03T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-06-03:/linux/2013-06-03-lichnyi-firefox-sync.html</id><summary type="html">&lt;p&gt;Для синхронизации браузерной  информации я использую &lt;em&gt;Firefox  Sync&lt;/em&gt;.  Но совсем
недавно замучили проблемы синхронизации. Постоянно появлялась ошибка, что сервер
не доступен, хотя  на сайте &lt;a href="https://services.mozilla.com/status/"&gt;mozilla&lt;/a&gt; не было  сообщений о каких-то
ошибках и неполадках в работе сервиса. Сейчас кстати есть:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The  Firefox  Sync  service  is  undergoing  some  load  issues,  if  you …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;Для синхронизации браузерной  информации я использую &lt;em&gt;Firefox  Sync&lt;/em&gt;.  Но совсем
недавно замучили проблемы синхронизации. Постоянно появлялась ошибка, что сервер
не доступен, хотя  на сайте &lt;a href="https://services.mozilla.com/status/"&gt;mozilla&lt;/a&gt; не было  сообщений о каких-то
ошибках и неполадках в работе сервиса. Сейчас кстати есть:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The  Firefox  Sync  service  is  undergoing  some  load  issues,  if  you  are
experiencing problems  please wait and  try again soon.  We are working  on it
presently.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Помучившись так  недельку, я решил поднять  личный Firefox Sync сервер  на своем
псевдо сервере. Быстренько нашел &lt;a href="http://gpo.zugaina.org/Search?search=mozilla-sync-server"&gt;ebuild'ы&lt;/a&gt;  для &lt;em&gt;gentoo&lt;/em&gt;.  И, вуа-ля, у
меня рабочий  сервер для синхронизации. Еще  я написал &lt;em&gt;init&lt;/em&gt; скрипты  и выложил
свой &lt;a href="https://github.com/puzan/puzan-overlay"&gt;overlay  на github&lt;/a&gt;.  Если  кому-то нужно —  пользуйтесь на
здоровье.&lt;/p&gt;
&lt;p&gt;Плюсы которые обнаружил во время использования личного Firefox Sync сервера:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Нет проблем с  доступом, точнее их я  могу решить сам.  Более того,  так как я
  единственный пользователь своего сервера, то  нет проблем с загруженностью.  А
  вот доступной  поддержки для  Firefox Sync  не нашел.   Признаюсь не  сильно и
  искал.&lt;/li&gt;
&lt;li&gt;Фактически  нет  ограничения  на  размер  хранимых  данных.  Стандартный  5-ти
  мегабайтный предел я умудрился превысить.&lt;/li&gt;
&lt;/ul&gt;</content><category term="linux"></category><category term="firefox"></category><category term="gentoo"></category><category term="portage"></category><category term="ebuild"></category></entry><entry><title>Git: Объединение merge коммитов</title><link href="https://puzan.dev/linux/2013-06-01-git-obedinenie-merge-kommitov.html" rel="alternate"></link><published>2013-06-01T00:00:00+04:00</published><updated>2013-06-01T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-06-01:/linux/2013-06-01-git-obedinenie-merge-kommitov.html</id><summary type="html">&lt;p&gt;Возникла у  меня на работе необходимость  объединить два &lt;em&gt;merge&lt;/em&gt; в  один.  Делал
большое и  несколько конфликтное слияние. А  во время этого в  &lt;strong&gt;Gerrit&lt;/strong&gt; на мою
ветку   успели  залить   что-то  новое,   вызвавшее  новые   конфликты  с   моим
&lt;em&gt;merge&lt;/em&gt;. Соответственно необходимо было слить  эти изменения тоже. На тот момент
я видел следующие варианты …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Возникла у  меня на работе необходимость  объединить два &lt;em&gt;merge&lt;/em&gt; в  один.  Делал
большое и  несколько конфликтное слияние. А  во время этого в  &lt;strong&gt;Gerrit&lt;/strong&gt; на мою
ветку   успели  залить   что-то  новое,   вызвавшее  новые   конфликты  с   моим
&lt;em&gt;merge&lt;/em&gt;. Соответственно необходимо было слить  эти изменения тоже. На тот момент
я видел следующие варианты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Самый простой  способ: сделать  еще один  &lt;code&gt;merge&lt;/code&gt;. В  итоге получаем  еще один
  дополнительный &lt;em&gt;commit&lt;/em&gt; и разветвленную историю.&lt;/li&gt;
&lt;li&gt;Сделать полный &lt;code&gt;merge&lt;/code&gt; заново. Повторять уже сделанное не хочется.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Я  решил  найти  вариант,  позволяющий в  результате  первого  простого  способа
получить один коммит.  Оказалось эта операция  не совсем очевидна.  Как всегда в
последнее время, нашел  решение на &lt;a href="http://stackoverflow.com/questions/1725708/git-rebase-interactive-squash-merge-commits-together"&gt;stackoverflow&lt;/a&gt;. Опишу  весь процесс с
начала до  конца с  историей тестового репозитория  (&lt;code&gt;git log  --oneline --graph
--decorate&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Итак, мы  сделали какой-то  абстрактный &lt;code&gt;merge&lt;/code&gt; &lt;em&gt;master&lt;/em&gt;  в &lt;em&gt;feature&lt;/em&gt;  ветку с
  исправлением всех конфликтов:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ git checkout feature
$ git merge origin/master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;*   b8c37f7 (HEAD, feature) c&amp;#39;
|\
| * 7020561 (origin/master) b
* | 2a55e67 (origin/feature) b&amp;#39;
|/
* b888f61 a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Далее кто-то добавил что-то новое на &lt;em&gt;feature&lt;/em&gt; ветку:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;* 3820f07 (origin/feature) c&amp;#39;
| *   b8c37f7 (HEAD, feature) c&amp;#39;
| |\
|/ /
| * 7020561 (origin/master) b
* | 2a55e67 b&amp;#39;
|/
* b888f61 a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Делаем дополнительный &lt;code&gt;merge&lt;/code&gt; и видим не особо приятную историю:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ git merge origin/feature
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;*   781dea7 (HEAD, feature) d&amp;#39;
|\
| * 3820f07 (origin/feature) c&amp;#39;
* |   b8c37f7 c&amp;#39;
|\ \
| |/
|/|
| * 7020561 (origin/master) b
* | 2a55e67 b&amp;#39;
|/
* b888f61 a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;А теперь собственно решение с  выправлением истории. Делаем &lt;code&gt;reset&lt;/code&gt; на коммит,
  с которого надо делать &lt;code&gt;merge&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ git reset --soft origin/feature
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;* 3820f07 (HEAD, origin/feature, feature) c&amp;#39;
* 2a55e67 b&amp;#39;
| * 7020561 (origin/master) b
|/
* b888f61 a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Далее симулируем &lt;code&gt;merge&lt;/code&gt; с &lt;em&gt;origin/master&lt;/em&gt; и делаем &lt;code&gt;commit&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ git rev-parse origin/master &amp;gt; .git/MERGE_HEAD
$ git commit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;*   3b01bf0 (HEAD, feature) d&amp;#39;
|\
| * 7020561 (origin/master) b
* | 3820f07 (origin/feature) c&amp;#39;
* | 2a55e67 b&amp;#39;
|/
* b888f61 a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Как видим  в итоге получилась  аккуратная история с необходимым  полным слиянием
веток.  Теперь  можно  делать  &lt;code&gt;push&lt;/code&gt;.  Данный  способ  можно  использовать  для
объединения любого количества &lt;em&gt;merge&lt;/em&gt; коммитов.&lt;/p&gt;
&lt;p&gt;По  идее  надо  запрещать  людям  добавлять новые  изменения  во  время  крупных
слияний. Так будет возникать меньше затруднительных ситуаций.&lt;/p&gt;</content><category term="linux"></category><category term="git"></category><category term="merge"></category></entry><entry><title>Git + кириллические имена файлов на OS X</title><link href="https://puzan.dev/linux/2013-05-24-git-kirillicheskie-imena-failov-na-os-x.html" rel="alternate"></link><published>2013-05-24T00:00:00+04:00</published><updated>2013-05-24T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-05-24:/linux/2013-05-24-git-kirillicheskie-imena-failov-na-os-x.html</id><summary type="html">&lt;p&gt;Не ожидал,  что в  мире современного  ПО могут быть  проблемы с  &lt;em&gt;Unicode&lt;/em&gt;.  Мне
казалось,   что  все   неприятности   с  кодировками   закончились  с   приходом
&lt;em&gt;Unicode&lt;/em&gt;'а. Давно  по крайней мере  с ними  не встречался.  Но,  как оказалось,
&lt;em&gt;git&lt;/em&gt; несколько некорректно работает с русскими именами файлов на &lt;em&gt;Mac&lt;/em&gt;'е.&lt;/p&gt;
&lt;p&gt;Есть у  меня репозиторий …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Не ожидал,  что в  мире современного  ПО могут быть  проблемы с  &lt;em&gt;Unicode&lt;/em&gt;.  Мне
казалось,   что  все   неприятности   с  кодировками   закончились  с   приходом
&lt;em&gt;Unicode&lt;/em&gt;'а. Давно  по крайней мере  с ними  не встречался.  Но,  как оказалось,
&lt;em&gt;git&lt;/em&gt; несколько некорректно работает с русскими именами файлов на &lt;em&gt;Mac&lt;/em&gt;'е.&lt;/p&gt;
&lt;p&gt;Есть у  меня репозиторий, в  котором я храню все  свои заметки. Половина  из них
была написана в &lt;a href="http://mwolson.org/projects/EmacsMuse.html"&gt;muse-mode&lt;/a&gt;, остальное в &lt;a href="http://daringfireball.net/projects/markdown/syntax"&gt;Markdown&lt;/a&gt;.  Соответственно
имена  файлов  с  текстом  содержат заголовки,  содержащие  кириллицу.  Мне  так
удобнее. Ранее с таким подходом ни разу проблем не встречал.&lt;/p&gt;
&lt;p&gt;И вот проблема на &lt;em&gt;Mac&lt;/em&gt;'е. Все  русские буквы в выводе &lt;code&gt;git status&lt;/code&gt; отображаются
в  восьмеричном виде.   И более  того все  файлы содержащие  в именах  кириллицу
помечаются как &lt;em&gt;untracked&lt;/em&gt;. Пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ izonov:text izonov$ git status
# On branch master
# Your branch is ahead of &amp;#39;origin/master&amp;#39; by 1 commit.
#   (use &amp;quot;git push&amp;quot; to publish your local commits)
#
# Changes not staged for commit:
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)
#   (use &amp;quot;git checkout -- &amp;lt;file&amp;gt;...&amp;quot; to discard changes in working directory)
#
#   modified:   &amp;quot;linux/2013-05-24 - Git + \320\272\320\270\321\200\320\270\320\273\320\273\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \320\270\320\274\320\265\320\275\320\260 \321\204\320\260\320\271\320\273\320\276\320\262 \320\275\320\260 OS X.md&amp;quot;
#
# Untracked files:
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to include in what will be committed)
#
#   &amp;quot;linux/2013-05-24 - Git + \320\272\320\270\321\200\320\270\320\273\320\273\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \320\270\320\274\320\265\320\275\320\260 \321\204\320\260\320\270\314\206\320\273\320\276\320\262 \320\275\320\260 OS X.md&amp;quot;
#   .....
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Вторая проблема  (&lt;em&gt;untracked&lt;/em&gt; файлы)  решается достаточно легко.   Подсмотрено в
&lt;a href="http://stackoverflow.com/questions/5581857/git-and-the-umlaut-problem-on-mac-os-x"&gt;вопросе на Stackoverflow&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git config --global core.precomposeunicode true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;После этого видим следующее:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ izonov:text izonov$ git status
# On branch master
# Your branch is ahead of &amp;#39;origin/master&amp;#39; by 1 commit.
#   (use &amp;quot;git push&amp;quot; to publish your local commits)
#
# Changes not staged for commit:
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)
#   (use &amp;quot;git checkout -- &amp;lt;file&amp;gt;...&amp;quot; to discard changes in working directory)
#
#   modified:   &amp;quot;linux/2013-05-24 - Git + \320\272\320\270\321\200\320\270\320\273\320\273\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \320\270\320\274\320\265\320\275\320\260 \321\204\320\260\320\271\320\273\320\276\320\262 \320\275\320\260 OS X.md&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Решения  отображения русских  букв в  &lt;code&gt;git  status&lt;/code&gt; я  не нашел.   Кириллические
символы в именах новых и измененных файлов все равно отображаются в восьмеричном
виде. Как вариант можно использовать &lt;code&gt;git  add -i&lt;/code&gt;. Там все символы отображаются
в привычном виде.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.  [2013-05-28]&lt;/strong&gt;:  Вчера  &lt;em&gt;Konstantin  Khomoutov&lt;/em&gt;  подсказал,  как  решить
проблему отображения русских букв в &lt;em&gt;git&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git config --global core.quotepath false
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="linux"></category><category term="git"></category><category term="mac"></category></entry><entry><title>Evernote Web Clipper. Опять забыл пароль?</title><link href="https://puzan.dev/linux/2013-05-23-evernote-web-clipper-opiat-zabyl-parol.html" rel="alternate"></link><published>2013-05-23T00:00:00+04:00</published><updated>2013-05-23T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-05-23:/linux/2013-05-23-evernote-web-clipper-opiat-zabyl-parol.html</id><summary type="html">&lt;p&gt;Довольно часто пользуюсь &lt;a href="http://www.evernote.com"&gt;Evernote&lt;/a&gt;.  Это действительно удобный инструмент
для ведения заметок.  Пользуюсь им с &lt;em&gt;iPhone&lt;/em&gt; и через  веб интерфейс с остальных
систем  (дом  - &lt;em&gt;Linux&lt;/em&gt;,  работа  -  &lt;em&gt;Windows&lt;/em&gt;).  А  теперь еще  и  оригинальным
приложением для &lt;em&gt;Mac&lt;/em&gt;'а пользоваться начал.&lt;/p&gt;
&lt;p&gt;Все  это к  чему?   Есть у  этого замечательного  сервиса  казалось бы  отличное
дополнение …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Довольно часто пользуюсь &lt;a href="http://www.evernote.com"&gt;Evernote&lt;/a&gt;.  Это действительно удобный инструмент
для ведения заметок.  Пользуюсь им с &lt;em&gt;iPhone&lt;/em&gt; и через  веб интерфейс с остальных
систем  (дом  - &lt;em&gt;Linux&lt;/em&gt;,  работа  -  &lt;em&gt;Windows&lt;/em&gt;).  А  теперь еще  и  оригинальным
приложением для &lt;em&gt;Mac&lt;/em&gt;'а пользоваться начал.&lt;/p&gt;
&lt;p&gt;Все  это к  чему?   Есть у  этого замечательного  сервиса  казалось бы  отличное
дополнение для &lt;em&gt;Firefox&lt;/em&gt;: &lt;em&gt;Evernote Web Clipper&lt;/em&gt;. Но!  После одного из последних
обновлений он напрочь  отказывается запоминать пароль и  с жуткой периодичностью
просит авторизоваться.&lt;/p&gt;
&lt;p&gt;В &lt;em&gt;Firefox&lt;/em&gt;  на &lt;em&gt;Mac&lt;/em&gt;'е  подобные проблемы не  наблюдаются. Логиниться  часто не
просит.  Думаю  это  связано  с  тем  что  последнее  обновление  клиппера  было
установлено на чистый профиль.&lt;/p&gt;
&lt;p&gt;Буду завтра  на работе  (до домашнего  компа пока  добраться не  могу) пробовать
установить &lt;em&gt;Evernote Web clipper&lt;/em&gt; поверх нового профиля &lt;em&gt;Firefox&lt;/em&gt;'а.&lt;/p&gt;
&lt;p&gt;P.S. [2013-05-24] На  работе поставил поверх чистого профиля  клиппер. Он пароль
вроде  как перестал  агрессивно  спрашивать. Когда  до стационарного  компьютера
доберусь, попробую найти файлы, которые надо почистить, чтобы профиль не менять.&lt;/p&gt;</content><category term="linux"></category><category term="web"></category><category term="evernote"></category></entry><entry><title>Xbox One. Впечатления</title><link href="https://puzan.dev/linux/2013-05-22-xbox-one-vpechatleniia.html" rel="alternate"></link><published>2013-05-22T00:00:00+04:00</published><updated>2013-05-22T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-05-22:/linux/2013-05-22-xbox-one-vpechatleniia.html</id><summary type="html">&lt;p&gt;Во время написания  вчерашнего поста одним глазом смотрел  презентацию Xbox One.
Похоже  уже давним  являюсь  поклонником  Xbox'а. Давным  давно  купил Xbox  360
пополам с  сестрой.  Веселая  была история! Чтобы  уговорить сестру  на подобную
сделку, был куплен специальный &lt;strong&gt;розовый&lt;/strong&gt; джойстик.   До этого я долго не играл
на PC,  так как  снес …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Во время написания  вчерашнего поста одним глазом смотрел  презентацию Xbox One.
Похоже  уже давним  являюсь  поклонником  Xbox'а. Давным  давно  купил Xbox  360
пополам с  сестрой.  Веселая  была история! Чтобы  уговорить сестру  на подобную
сделку, был куплен специальный &lt;strong&gt;розовый&lt;/strong&gt; джойстик.   До этого я долго не играл
на PC,  так как  снес Windows  и погрузился  в мир  Linux.  Было  в общем  не до
компьютерных развлечений.  После  приобретения приставки я вернулся  в новый для
меня мир игр. Сейчас же играю в основном в хоккейчик, но и то редко.&lt;/p&gt;
&lt;p&gt;Вернемся к Xbox  One. Девайс однозначно крутой.  Начинка его  будет покруче всех
моих  девайсов вместе  взятых. И  видимо надо  будет брать,  если будет  желание
порвать всех в новом хоккейчике. А он то однозначно будет.&lt;/p&gt;
&lt;p&gt;Не понравились некоторые маркетинговые и  дизайнерские фишки.  Например само имя
"Xbox Единственный"  (не знаю как  лучше перевести.   "Xbox Один"?).  У  меня по
крайней мере сразу складывается впечатление, что вот он венец игровых технологий
и лучше точно не  будет. Привередливый я. Напомнило iPad New  и следующий за ним
iPad 4. Напридумывают всяких хитрых имен для устройств, а потом мучаются. Кстати
почему Xbox 360 я тоже не знаю. Не интересовался.&lt;/p&gt;
&lt;p&gt;Сам вид  нового устройства с первого  раза больше напомнил страшно  сказать Play
Station. Черный,  квадратно-прямоугольный. Где элегантность  предыдущих Xbox'ов?
Также  ожидал,  что все  поместят  в  одну небольшую  коробочку,  а  в итоге  их
две. Сенсор  Kinect снова  в отдельной  коробке. В  принципе понимаю  почему так
сделали (удобнее и легче Kinect устанавливать отдельно над или под телевизором).
Но было бы думаю круто иметь  одну компактную коробку вместо нескольких. Надеюсь
они общаются без проводов. Пропустил этот момент.&lt;/p&gt;
&lt;p&gt;В джойстике порадовало,  что кнопку Xbox передвинули подальше  вперед. На старых
(ох, они уже  старые) контроллерах периодически случайно  эта кнопка нажимается.
И это уж очень мешает игре.&lt;/p&gt;
&lt;p&gt;Можно заметить, что мои претензии  достаточно мизерны. Это все последствия моего
дурного  вкуса. Но  мой  совет всем:  надо брать.   Чего  только стоит  устроить
танцевальную вечеринку (Dance  Central). Сколько с друзьями не  собирались все в
полном  восторге.    Xbox  однозначно  лучший   продукт  Microsoft  (как   бы  я
недолюбливал  эту компанию).  Если игры  и компьютерные  развлечения, то  только
Xbox.&lt;/p&gt;</content><category term="linux"></category><category term="xbox"></category></entry><entry><title>Macbook Air, блог и bash crash</title><link href="https://puzan.dev/linux/2013-05-21-macbook-air-blog-i-bash-crash.html" rel="alternate"></link><published>2013-05-21T00:00:00+04:00</published><updated>2013-05-21T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-05-21:/linux/2013-05-21-macbook-air-blog-i-bash-crash.html</id><summary type="html">&lt;p&gt;Со вчерашнего дня решил писать по записи  в день в данный блог, но умудрился уже
проштрафиться. Просто напросто  не успел. Этот план  направлен на структуризацию
своих мыслей.  Хочу  лучше понимать куда стремиться и  чем лучше интересоваться,
заниматься. Кроме того довольно часто начал сталкиваться с различными вопросами,
решения которых не  получается …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Со вчерашнего дня решил писать по записи  в день в данный блог, но умудрился уже
проштрафиться. Просто напросто  не успел. Этот план  направлен на структуризацию
своих мыслей.  Хочу  лучше понимать куда стремиться и  чем лучше интересоваться,
заниматься. Кроме того довольно часто начал сталкиваться с различными вопросами,
решения которых не  получается с первого раза найти в  &lt;em&gt;google&lt;/em&gt; (искать наверное
разучился). Буду выносить все это дело в виде постов сюда. Постараюсь чтобы сюда
попадали  исключительно околотехнические  темы.  Остальное  в &lt;a href="https://plus.google.com/100903917371621392768/posts"&gt;Google+&lt;/a&gt;  или
&lt;a href="https://twitter.com/puzan"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Итак начну  с того, что любимая  девушка подарила мне на  день рождение &lt;em&gt;MacBook
Air&lt;/em&gt;. Поэтому с этого момента на данном блоге будут появляться посты посвященные
и данному замечательному устройству, а также  &lt;em&gt;OS X&lt;/em&gt; (название блога видимо надо
немного поменять). Все они будут помечены с помощью тега &lt;a href="http://puzan-linux.blogspot.ru/search/label/mac"&gt;&lt;em&gt;mac&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На  Mac'е как  раз и  столкнулся с  одной неприятной  мелкой проблемой,  которая
несколько меня раздражает, но  на данный момент я не знаю,  как ее решить. Сразу
же при  получении этого девайся  я начал устанавливать привычное  мне консольное
окружение. Для этого я использовал &lt;a href="http://www.macports.org/"&gt;macports&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Настроил  git completion  и prompt,  используя скрипты  из git-core  порта. Были
установлены следующие версии портов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bash 4.2.42_0&lt;/li&gt;
&lt;li&gt;bash-completion 2.0_1&lt;/li&gt;
&lt;li&gt;git-core 1.8.2.3_0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И теперь,  время от времени  после выхода из свящего  режима, bash падает  вот с
такой ошибкой:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-bash(23573,0x7fff75972180) malloc: *** error for object 0x7fb1cb40c530: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;При этом  я не  совсем уверен,  что эта ошибка  связана с  &lt;em&gt;bash-completion&lt;/em&gt; или
&lt;em&gt;git&lt;/em&gt;.  Буду  искать решение, но отказываться  от completion и prompt  совсем не
хочется.   Думаю   попробовать  &lt;em&gt;bash&lt;/em&gt;  из  &lt;a href="http://mxcl.github.io/homebrew/"&gt;homebrew&lt;/a&gt;,   ну  или  ручками
собрать. Какие еще варианты? Куда копать на mac'е?&lt;/p&gt;
&lt;p&gt;PS. Вот и ушло у меня пару часов на написание казалось бы небольшого текста.&lt;/p&gt;
&lt;p&gt;P.S.   [2013-05-25]  &lt;em&gt;bash&lt;/em&gt; все  равно  продолжает  падать даже  с  выключенными
completions и git-prompt. Происходит это стабильно раз в день.&lt;/p&gt;</content><category term="linux"></category><category term="mac"></category><category term="bash"></category></entry><entry><title>Infinality патчи на стабильной ветке</title><link href="https://puzan.dev/linux/2013-02-12-infinality-patchi-na-stabilnoi-vetke.html" rel="alternate"></link><published>2013-02-12T00:00:00+04:00</published><updated>2013-02-12T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-02-12:/linux/2013-02-12-infinality-patchi-na-stabilnoi-vetke.html</id><summary type="html">&lt;p&gt;Как-то  я пропустил  тот  факт,  что похоже  уже  давно &lt;a href="http://www.infinality.net/blog/"&gt;infinality&lt;/a&gt;  патчи
находятся  на  стабильной  ветке  в  gentoo portage.   До  этого  ставил  их  из
&lt;a href="http://gitorious.org/lcd-filtering"&gt;lcd-filtering&lt;/a&gt;.   Теперь все  намного  &lt;a href="http://od-eon.com/blogs/stefan/improving-the-font-rendering-on-gentoo-infinality/"&gt;проще&lt;/a&gt;.  Добавляем  USE-флаг
&lt;code&gt;infinality&lt;/code&gt; в &lt;code&gt;make.conf&lt;/code&gt; и пересобираем &lt;em&gt;freetype&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;emerge -1q freetype
eselect fontconfig enable 52-infinality.conf
eselect infinality set infinality
eselect …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Как-то  я пропустил  тот  факт,  что похоже  уже  давно &lt;a href="http://www.infinality.net/blog/"&gt;infinality&lt;/a&gt;  патчи
находятся  на  стабильной  ветке  в  gentoo portage.   До  этого  ставил  их  из
&lt;a href="http://gitorious.org/lcd-filtering"&gt;lcd-filtering&lt;/a&gt;.   Теперь все  намного  &lt;a href="http://od-eon.com/blogs/stefan/improving-the-font-rendering-on-gentoo-infinality/"&gt;проще&lt;/a&gt;.  Добавляем  USE-флаг
&lt;code&gt;infinality&lt;/code&gt; в &lt;code&gt;make.conf&lt;/code&gt; и пересобираем &lt;em&gt;freetype&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;emerge -1q freetype
eselect fontconfig enable 52-infinality.conf
eselect infinality set infinality
eselect lcdfilter set infinality
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Как видим теперь необходимо несколько раз дополнительно запустить &lt;code&gt;eselect&lt;/code&gt;. При
этом   вариантов  для   выбора  &lt;code&gt;eselect   infinality&lt;/code&gt;  и   &lt;code&gt;eselect  lcdfilter&lt;/code&gt;
предоставляют многовато.   Я с  ними не  экспериментировал.  Если  кто пробовал,
поделитесь впечатлениями.&lt;/p&gt;</content><category term="linux"></category><category term="gentoo"></category><category term="infinality"></category><category term="fonts"></category></entry><entry><title>Использование Gitolite вместе с Redmine</title><link href="https://puzan.dev/linux/2013-02-05-ispolzovanie-gitolite-vmeste-s-redmine.html" rel="alternate"></link><published>2013-02-05T00:00:00+04:00</published><updated>2013-02-05T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-02-05:/linux/2013-02-05-ispolzovanie-gitolite-vmeste-s-redmine.html</id><summary type="html">&lt;p&gt;Появилась необходимость  добавить git репозиторий в  &lt;em&gt;&lt;a href="http://www.redmine.org"&gt;Redmine&lt;/a&gt;&lt;/em&gt; проект
на   домашнем    сервере.    Для   управления   git    репозиториями   использую
&lt;em&gt;&lt;a href="https://github.com/sitaramc/gitolite"&gt;Gitolite&lt;/a&gt;&lt;/em&gt;. Как  оказалось по-умолчанию &lt;em&gt;Gitolite&lt;/em&gt;  запрещает доступ
всем кроме  пользователя, которым  он обслуживается. В  моем случае  доступ есть
только у пользователя &lt;em&gt;&lt;code&gt;git&lt;/code&gt;&lt;/em&gt;.  &lt;em&gt;Redmine&lt;/em&gt; же запускает пользователь &lt;em&gt;&lt;code&gt;redmine&lt;/code&gt;&lt;/em&gt;.
В общем главная загвоздка — найти &lt;em&gt;umask&lt;/em&gt; опцию …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Появилась необходимость  добавить git репозиторий в  &lt;em&gt;&lt;a href="http://www.redmine.org"&gt;Redmine&lt;/a&gt;&lt;/em&gt; проект
на   домашнем    сервере.    Для   управления   git    репозиториями   использую
&lt;em&gt;&lt;a href="https://github.com/sitaramc/gitolite"&gt;Gitolite&lt;/a&gt;&lt;/em&gt;. Как  оказалось по-умолчанию &lt;em&gt;Gitolite&lt;/em&gt;  запрещает доступ
всем кроме  пользователя, которым  он обслуживается. В  моем случае  доступ есть
только у пользователя &lt;em&gt;&lt;code&gt;git&lt;/code&gt;&lt;/em&gt;.  &lt;em&gt;Redmine&lt;/em&gt; же запускает пользователь &lt;em&gt;&lt;code&gt;redmine&lt;/code&gt;&lt;/em&gt;.
В общем главная загвоздка — найти &lt;em&gt;umask&lt;/em&gt; опцию в настройках &lt;em&gt;Gitolite&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Решение со &lt;a href="http://stackoverflow.com/questions/13000247/redmine-gitolite-issue-with-repository-permissions-and-more"&gt;Stackoverflow&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Добавляем   в   Redmine   путь    к   необходимому   репозиторию.    Например:
  &lt;code&gt;/home/git/repositories/repo.git&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Добавить   пользователя,   который   запускает  веб-сервер   с   &lt;em&gt;Redmine&lt;/em&gt;   в
  &lt;em&gt;&lt;code&gt;git&lt;/code&gt;&lt;/em&gt;-группу:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  usermod -a -G git redmine
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;В  файле &lt;code&gt;.gitolite.rc&lt;/code&gt;  (находится  в домашней  директории &lt;em&gt;&lt;code&gt;git&lt;/code&gt;&lt;/em&gt;)  поменять
  значение  &lt;code&gt;UMASK&lt;/code&gt; с  &lt;code&gt;0077&lt;/code&gt; на  &lt;code&gt;0027&lt;/code&gt;.  Теперь  новые файлы  &lt;em&gt;Gitolite&lt;/em&gt; будет
  создавать с правами на чтение для группы &lt;em&gt;&lt;code&gt;git&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Также необходимо поменять права доступа  для всех существующих репозиториев. В
  директории с репозиториями запускаем следующее:&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  chmod -R g+rX
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Есть еще варианты решения этого вопроса?&lt;/p&gt;</content><category term="linux"></category><category term="git"></category><category term="redmine"></category><category term="gitolite"></category></entry><entry><title>Svn to Git</title><link href="https://puzan.dev/linux/2013-02-03-svn-to-git.html" rel="alternate"></link><published>2013-02-03T00:00:00+04:00</published><updated>2013-02-03T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-02-03:/linux/2013-02-03-svn-to-git.html</id><summary type="html">&lt;p&gt;Краткая инструкция миграции с &lt;em&gt;svn&lt;/em&gt; на &lt;em&gt;git&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Руководство к действию&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Найти всех авторов с помощью скрипта&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nv"&gt;authors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;svn log -q &lt;span class="p"&gt;|&lt;/span&gt; grep -e &lt;span class="s1"&gt;&amp;#39;^r&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;BEGIN { FS = &amp;quot;|&amp;quot; } ; { print $2 }&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort &lt;span class="p"&gt;|&lt;/span&gt; uniq&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; author in &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;authors&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; = NAME &amp;lt;EMAIL&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Все записи &lt;code&gt;NAME&lt;/code&gt; и &lt;code&gt;EMAIL&lt;/code&gt; вручную …&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Краткая инструкция миграции с &lt;em&gt;svn&lt;/em&gt; на &lt;em&gt;git&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Руководство к действию&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Найти всех авторов с помощью скрипта&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nv"&gt;authors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;svn log -q &lt;span class="p"&gt;|&lt;/span&gt; grep -e &lt;span class="s1"&gt;&amp;#39;^r&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;BEGIN { FS = &amp;quot;|&amp;quot; } ; { print $2 }&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort &lt;span class="p"&gt;|&lt;/span&gt; uniq&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; author in &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;authors&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; = NAME &amp;lt;EMAIL&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Все записи &lt;code&gt;NAME&lt;/code&gt; и &lt;code&gt;EMAIL&lt;/code&gt; вручную заменяем на необходимые значения.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Склонировать &lt;em&gt;svn&lt;/em&gt; репозиторий&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git svn clone [-s] --no-metadata --username=USER --authors-file=SVN-AUTHORS SVN_URL
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Пара слов про опции:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt; — необходима,  если используются стандартные svn  папки (trunk, tags,
  branches).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-metadata&lt;/code&gt; — удаление записей &lt;code&gt;git-svn-id&lt;/code&gt; из логов.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--username&lt;/code&gt; — тут все понятно.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--author-file&lt;/code&gt; — список авторов в svn репозитории (см. пункт выше).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Импорт ignore файлов&lt;/p&gt;
&lt;p&gt;На каждой ветке необходимо сделать следующее:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git checkout BRANCH
git svn create-ignore
git commit -a -m &amp;quot;Import svn:ignore.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Полезные ссылки&lt;/h3&gt;
&lt;p&gt;Весь этот небольшой материал основан на следующих статьях:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://leonid.shevtsov.me/ru/perenos-svn-repozitariya-v-git" title="Перенос SVN-репозитария в git"&gt;Перенос SVN-репозитария в git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Habr&lt;/em&gt;: &lt;a href="http://habrahabr.ru/post/144626/" title="Переезд проекта с SVN на Git"&gt;Переезд проекта с SVN на Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Habr&lt;/em&gt;: &lt;a href="http://habrahabr.ru/company/wapstart/blog/159477/" title="how to: Как и зачем работать с svn через git"&gt;how to: Как и зачем работать с svn через git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="linux"></category><category term="svn"></category><category term="git"></category></entry><entry><title>Blogger пост из Emacs? Markdown + Googlecl script</title><link href="https://puzan.dev/linux/2013-01-24-blogger-post-iz-emacs-markdown-googlecl-script.html" rel="alternate"></link><published>2013-01-24T00:00:00+04:00</published><updated>2013-01-24T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-01-24:/linux/2013-01-24-blogger-post-iz-emacs-markdown-googlecl-script.html</id><summary type="html">&lt;p&gt;Побаловался  с  &lt;em&gt;googlecl&lt;/em&gt;.   Умудрился   случайно  наделать  множество  постов,
состоящих всего  лишь из одного  слова в своем &lt;a href="http://puzan-read.blogspot.ru" title="Чего начитался…"&gt;читальном  блоге&lt;/a&gt;.  Сейчас
вроде бы все исправил.  Постараюсь  подобное предотвращать в будущем. Но главное
— проверил,  что &lt;em&gt;googlecl&lt;/em&gt;  работает. Далее  хочу обсудить  варианты публикации
сообщений из &lt;em&gt;Emacs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ранее  для   написания  заметок   я  использовал   &lt;em&gt;&lt;a href="http://mwolson.org/projects/EmacsMuse.html" title="Emacs Muse"&gt;muse-mode&lt;/a&gt;&lt;/em&gt;.   Каждая …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Побаловался  с  &lt;em&gt;googlecl&lt;/em&gt;.   Умудрился   случайно  наделать  множество  постов,
состоящих всего  лишь из одного  слова в своем &lt;a href="http://puzan-read.blogspot.ru" title="Чего начитался…"&gt;читальном  блоге&lt;/a&gt;.  Сейчас
вроде бы все исправил.  Постараюсь  подобное предотвращать в будущем. Но главное
— проверил,  что &lt;em&gt;googlecl&lt;/em&gt;  работает. Далее  хочу обсудить  варианты публикации
сообщений из &lt;em&gt;Emacs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ранее  для   написания  заметок   я  использовал   &lt;em&gt;&lt;a href="http://mwolson.org/projects/EmacsMuse.html" title="Emacs Muse"&gt;muse-mode&lt;/a&gt;&lt;/em&gt;.   Каждая
&lt;em&gt;muse&lt;/em&gt;-заметка экспортировалась в  &lt;em&gt;html&lt;/em&gt;.  А далее я ручками  копировал в форму
&lt;a href="http://blogger.com" title="Blogger"&gt;Блоггера&lt;/a&gt;  нужный  контент.   Долго  я пользовался  именно  этой  схемой.
&lt;em&gt;Muse&lt;/em&gt; в какой-то  момент перестал удовлетворять моим требованиям.   Были у него
некоторые проблемы со вложенными списками и вставками кода. А всякие списки я ой
как  люблю.  Это  наверное последствия  долгого использования  &lt;em&gt;org-mode&lt;/em&gt;. Ну  а
потом я вообще перестал что-либо публиковать в сети.&lt;/p&gt;
&lt;p&gt;Также когда-то я пробовал наладить &lt;em&gt;google&lt;/em&gt;  интерфейс, который шел в поставке с
&lt;em&gt;emacsspeak&lt;/em&gt;. Но  безуспешно. Интересно в  каком состоянии он сейчас?   Давно не
слышал.&lt;/p&gt;
&lt;p&gt;Теперь я собираюсь изобрести новый  велосипед. В его основе &lt;em&gt;&lt;a href="http://daringfireball.net/projects/markdown/" title="Markdown"&gt;Markdown&lt;/a&gt;&lt;/em&gt; и
&lt;em&gt;&lt;a href="http://code.google.com/p/googlecl" title="googlecl"&gt;Googlecl&lt;/a&gt;&lt;/em&gt;.  Собственно смысл  в том, чтобы написать  мини скрипт на
&lt;em&gt;bash&lt;/em&gt;, который переведет &lt;em&gt;md&lt;/em&gt;-файл  в &lt;em&gt;html&lt;/em&gt; (&lt;a href="http://www.freewisdom.org/projects/python-markdown" title="python-markdown"&gt;python-markdown&lt;/a&gt;).  При
этом  он  должен  вырезать  избыточные поля.   Например,  заголовок,  который  в
блоггере в  отдельное поле  вводится.  Далее отправить  это добро  в &lt;em&gt;googlecl&lt;/em&gt;,
который  успешно опубликует  новую заметку  с правильным  заголовком и  тегами в
нужном месте.  То есть из &lt;em&gt;Emacs&lt;/em&gt;  надо будет дернуть этот скриптик и собственно
все.&lt;/p&gt;
&lt;p&gt;Как вариант можно  написать полностью тоже самое на &lt;em&gt;elisp&lt;/em&gt;,  но хочется простой
возможности публиковать  файлы из консоли. Также  я пока не совсем  понимаю, как
настроить раскраску  кода при  конвертировании &lt;em&gt;md&lt;/em&gt;  в &lt;em&gt;html&lt;/em&gt;,  но думаю  с этим
больших проблем не должно быть.&lt;/p&gt;
&lt;p&gt;Как вам такая схема? Не слишком  ли я заворачиваю? Сейчас буду реализовывать это
добро.&lt;/p&gt;</content><category term="linux"></category><category term="emacs"></category><category term="google"></category></entry><entry><title>Акунин Б. - «Левиафан»</title><link href="https://puzan.dev/read/2013-01-14-akunin-b-leviafan.html" rel="alternate"></link><published>2013-01-14T00:00:00+04:00</published><updated>2013-01-14T00:00:00+04:00</updated><author><name>Ilya Zonov</name></author><id>tag:puzan.dev,2013-01-14:/read/2013-01-14-akunin-b-leviafan.html</id><summary type="html">&lt;p&gt;Начинаю выкладывать свои прошлогодние заметки  о прочитанных книгах. Старался во
время чтения побольше  записывать в &lt;em&gt;Evernote&lt;/em&gt;, но это  частенько не получалось.
Увлечешься развитием событий или какой-нибудь  описываемой технологией и в итоге
записей нет.  Вот прошел год.  Отмечено, что  книги прочитаны, а  заметок совсем
немного. Буду сейчас вспоминать и сочинять.&lt;/p&gt;
&lt;p&gt;Комментарии …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Начинаю выкладывать свои прошлогодние заметки  о прочитанных книгах. Старался во
время чтения побольше  записывать в &lt;em&gt;Evernote&lt;/em&gt;, но это  частенько не получалось.
Увлечешься развитием событий или какой-нибудь  описываемой технологией и в итоге
записей нет.  Вот прошел год.  Отмечено, что  книги прочитаны, а  заметок совсем
немного. Буду сейчас вспоминать и сочинять.&lt;/p&gt;
&lt;p&gt;Комментарии приветствуются ;) Их на этом непопулярном бложике совсем немного.&lt;/p&gt;
&lt;p&gt;Познал в прошлом 2012 году около десятка книг.  Это была как художественная, так
и техническая литература. Для начала начнем с &lt;em&gt;Акунина&lt;/em&gt;. &lt;em&gt;«Левиафан»&lt;/em&gt; я прочитал
в начале 2012 года, а именно &lt;em&gt;4 января 2012-го года&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Произведения &lt;em&gt;Акунина&lt;/em&gt;  мне нравятся, но читаю  я их редко.  Всю  серию никак не
осилю. Книга  про &lt;em&gt;Фандорина&lt;/em&gt; в год  наверное для меня успех.   Хотя по хорошему
надо залпом все съесть. Данное произведение прочитал менее чем за месяц, что для
меня с моей невероятной медлительностью в данном вопросе очень даже неплохо.&lt;/p&gt;
&lt;p&gt;Что же особенного я заметил в &lt;em&gt;«Левиафан»&lt;/em&gt;-е? Если ранее господин &lt;em&gt;Фандорин&lt;/em&gt; был
вовлечен в  некие глобальные передряги,  то сейчас  он попал в  расследование на
корабле.  Собственно  все  события  и происходят  на  борту  этого  злополучного
&lt;em&gt;«Левиафан»&lt;/em&gt;-а. Немного напомнило &lt;em&gt;Агату Кристи&lt;/em&gt;, хотя я ее никогда не читал.&lt;/p&gt;
&lt;p&gt;Понравилась  идея   с  японскими  главами.   Необходимо   поворачивать  книгу  и
перелистывать страницы  снизу вверх.  Необычно.  Автор  видимо надеялся передать
так японский колорит.  Думаю он этого  добился. На мой взгляд так читатель лучше
может понять поступки японского героя, господина &lt;em&gt;Аоно&lt;/em&gt; (ох, я уже забыл как его
зовут).  Особенно  читатель, совершенно не  знакомый с японской  культурой (есть
такие?). Другое дело была ли эта идея издательства или самого автора?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Фандорин&lt;/em&gt; конкретно в этом произведении показался  мне более высоким, чем я его
раньше представлял.   Думаю виной этому  являются частые иллюстрации  в издании,
которое я  читал. Надо  признать они  хороши, но  в моем  воображении &lt;em&gt;Фандорин&lt;/em&gt;
другой. Наверное у меня он больше похож на &lt;em&gt;Фандорина&lt;/em&gt; из экранизации &lt;em&gt;Турецкого
гамбита&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Автор отлично  водит сюжет то  туда, то  сюда.  Максимально подпускает  героев к
разгадке  всей картины,  а потом  отводит ровно  в противоположную  сторону. Это
впечатляет,  если учитывать,  что действия  происходит в  замкнутом пространстве
корабля. На  википедии прочитал это называется  «герметичный детектив».  Хорошее
название. Порадовало.&lt;/p&gt;</content><category term="read"></category><category term="Акунин Б."></category></entry></feed>