пятница, 23 марта 2018 г.

Как я дома скалодром строил

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

Отчим был токарем 5 разряда. Он мог разрисовать и объяснить чертёж любой сложности. Но строитель из него был тоже хреновый.

Ну так вот. Задумал я всё это дело, а как начать и что делать — не знал. Начать гуглить. Везде пишут: «Да тут всё просто». Хуяк-хуяк и в продакшн. Но лично мне было непонятно, как делать хуяк-хуяк.

Первой решил отработать строительство вертикальной стенки. Оказалось действительно несложно. Покупаешь фанеру и сверло 11-12 мм, сверлишь дырки с лицевой стороны, забиваешь усовые гайки М10 с обратной стороны. Прикручиваешь брус 40х40 к стене, а к брусу — готовую фанеру. Из сложностей тут только притащить саму фанеру и найти место для её сверления и забивания гаек.

У меня был шуруповерт, который поддерживает свёрла до 10мм. Это значит, что мне пришлось подобрать сверло, которое в него залезает. Это оказалось сверло 10.5 мм и вытащить его потом оказалось проблематично. У шуруповёрта быстро садился аккумулятор. Насверлю 10-15 дырок, а потом жду час-два для следующей партии. Аккумулятора в комплекте два, так что чутка повезло. Каждое отверствие приходилось рассверливать.

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

После того, как я собрал вертикальную стенку и опробовал её, я понял, что этого недостаточно. Совсем. Обязательно нужно сделать нависание.

Как его делать — тоже неизвестно. Гугл вывел меня на то, что для нависания нужно построить каркас, а уже к нему крепить фанеру. Причем везде деревянные опоры крепились к стенам и потолку, которыми я пользоваться не мог, так как на картинке. Пришлось придумывать свои способы монтажа. Возможно, что не самые лучшие.

Пока я болел и лежал в постели, смотрел «Игру престолов». И знаете, на что я смотрел? На то, как сделаны дома, как устроены потолки и лестницы. Я пытался понять вообще любые конструкции из дерева, даже самые элементарные, вроде перил. Дурацкое ощущение, что ты — беспомощный котёнок.

Когда начал собирать каркас, я косячил как умел. Получалось просто отлично.

  1. Гуглить приходилось всегда по два раза. Первый раз я, видимо, неправильно набирал запрос и соответственно не получал нужного ответа. Разочаровавшись в гугле, я шёл пробовать сам. Понимал, что делаю что-то не так, и возвращался обратно, чтобы переформулировать запрос и почитать снова. Второй раз всегда находил нужные ответы.
  2. Недооценил другие магазины со стройматериалами. Почему-то в голове отложилось, что Сатурн дико дорогой и даже не стал смотреть в его сторону. Доски вообще надо было купить сразу 4х-метровые. Вместо этого я поехал в Леруа и купил 3х-метровые, а потом ломал голову как их нарастить.
  3. Безумно мечтал о соединениях досок. У меня в голове почему-то отложилось, что сращивают металлической пластиной. В моём идеальном мире это сработало бы, но как только я начал присверливать пластину к доске, я понял, что придется делать по-другому.
  4. Доски нихрена не ровные. Я купил несколько досок в Леруа, привёз домой, а некоторые потом скрутило винтом. Что потом делать с этим я не знал, ибо гугл отвечал: «Крутись теперь, как умеешь».
  5. Не нужно строить, когда болеешь. На январских каникулах как раз планировал закончить основные работы по каркасу и фанере. Заболел в конце декабря и болел почти 3 недели подряд. Болезнь всё испортила. Голова у меня работала совсем плохо. Из-за этого каркас был установлен слегка криво. Не влияет на функциональность, но просто сам факт.
  6. Надо было сразу продумать полиспаст. Он сэкономил просто кучу сил и времени.


Чтобы не ломать мозг насчет того, как делать нависание, я решил просто сделать мунборд. Есть готовые размеры, угол наклона и как сверлить. Распечатываешь PDF и делаешь.
Как потом оказалось, для его строительства нужно всего 4 фанерных листа из Сатурна размерами 2440х1200. Останется только купить усовых гаек.
Ссылка на руководство:

https://moonboard.com/Content/Information/How-to-build-a-MoonBoard.pdf


Что ещё из сложностей?

  1. Ничего нет в одном магазине. Для покупки всех частей скалодрома пришлось объехать магазины во всех уголках города.
  2. Усовые гайки продаются в «Левше». Но только по 100 штук и то меньше. В общем, я ездил после работы и забирал сколько было в наличии. За весь период закупил примерно 700 штук.
  3. Продумай освещение. В некоторых частях может быть критична прокладка проводов.
  4. У меня не сошёлся стык между нависанием и вертикальной стеной. Да, я сам виноват из-за того, что недосмотрел. Но в итоге подумал: а) это можно использовать б) на скалах нет ничего идеального.
Советы:
  1. Организуй полиспаст! С ним можно строить и одному.
  2. Лучше средне, но сейчас, чем идеально, но никогда.
  3. Ищи всё, что возможно в Интернет-магазинах. Поздновато решился купить в Сатурне. Мне сразу же после заказа перезвонила оператор и сказала, что всё, чего я хочу, в одном магазине нет. И предложила поехать именно в тот, где было почти всё. Кое-какие доски заменили на другие. В итоге я просто приехал и забрал. Ехать правда пришлось в Черниковку. Видимо, магазины в южной части города чаще подвергаются набегам строителей.
  4. Запланируй сколько и чего нужно купить, чтобы не ездить по два, а то и по три раза.
  5. Продумывай стыки и фаски.
  6. Крепёж дешевле всего в офлайновых магазинах. «Мастер» в Дёме и «Мастер» возле Госцирка. Это совершенно разные магазины, с разным ассортиментом. Но в обоих цены ниже, чем в крупных магазинах.
  7. Убирай за собой сразу, опилки расползаются сразу же.
Сколько ушло денег? Когда я начинал, я рассчитывал на 50 килорублей. Сейчас ушло чуть больше 40, но это далеко не конец, потому что зацепок мало, а постоянно перекручивать — долго и нудно. А ещё хочется черный сет для мунборда :) А ещё нужны ещё маты и освещение… А ещё…

По итогам:
  1. Построил? Построил! Фантазия перестала быть фантазией.
  2. Приобрёл практический опыт, пусть небольшого, но строительства. Приоткрыло дверь в новую интересную инженерную область.
  3. Можно лазить-лазить-лазить.
  4. Сын доволен, что можно лазить-лазить-лазить в любое время.
  5. Я приобретаю какой-то опыт накрутки трасс. К примеру, на нависании действительно нужно зацепы крупнее, чем на вертикали. Глупо, но опытным путем это осозналось быстрее.
Все расходы занёс в табличку:

https://docs.google.com/spreadsheets/d/1KDuA04XdHauIKfL9FU0aXZeuUekcG98TLp5U2soznSc/edit?usp=sharing

Хорошие статьи по теме:

http://blog.ratibus.net/posts/i-built-a-moonboard-in-my-garage

http://eveningsends.com/battle-of-the-boards-moon-hang-and-campus-a-home-gym-review/

вторник, 12 июля 2016 г.

Configuring Jenkins for C# projects

Steps in my build configuration

Restore nuget packages

chcp 1251
.nuget\nuget.exe restore Swag.sln

Build solution

chcp 1251
cmd.exe /C " "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" 
             /t:Build /p:Configuration=Release "/p:Platform=Any CPU" 
             SOLUTION.sln " && exit %%ERRORLEVEL%%

Run NUnit tests and export results in NUnit2 format


chcp 1251
packages\NUnit.ConsoleRunner.3.2.1\tools\nunit3-console.exe 
             bin\Release\TESTS.dll --result=TestResult.xml;format=nunit2

Add post-build actionPublish NUnit test result report

TestResult.xml


You need to add chcp1251 for Jenkins log file encoding. Replace with your own locale

пятница, 29 января 2016 г.

Книги за 2015

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


Итак мой список (довольно короткий):

  1. Энди Уир "Марсианин" - очень классная книга, просто башку порвало. Не то, чтобы в корне поменяло какое-то мое мышление, но очень и очень увлекательно. Я был очень удивлен детальностью всех объяснений и что для чего нужно. А позже я узнал, что автор - программист и для меня всё встало на свои места. Да, такие технологические мелочи гуманитарий редко сможет прописать. В общем, кто не читал - читайте. Того стоит
  2. Рэй Бредберри "451 градус по Фаренгейту" - с антиутопиями я уже свыкся. С сюжетом и повествованием всё в порядке. Для ознакомления - хорошая книга.
  3. Борис Акунин "История Российского государства. Том I. От истоков до монгольского нашествия. Часть Европы"
  4. Борис Акунин "История Российского государства. Том II. Ордынский период. Часть Азии"
  5. Борис Акунин "История Российского государства. Том III. От Ивана III до Бориса Годунова. Между Азией и Европой" - три замечательных книги. Все, что мне нравится в книгах Акунина - детальная подробность, ненавязчивость и много собственных рассуждений, подвергая сомнению какие-то исторические факты, отражено здесь. 
  6. Борис Акунин "Другой путь" - хорошие рассуждения о настоящей любви. Мнение автора о настоящей любви и всем, что с ней связано. Есть о чем подумать после прочтения.
  7. Мартин Фаулер "Архитектура корпоративных программных приложений" - если честно, я мало чего понял. То ли книгу надо читать в оригинале, то ли в печатном варианте разбираться.

На остальные книги по программированию в этом году времени не осталось. А те, что мог прочитать, не имели для меня профессионального интереса.

четверг, 26 февраля 2015 г.

Исправление ошибки при использовании P/Invoke

Чтобы исправить вот эту ошибку:

System.BadImageFormatException: Была сделана попытка загрузить программу, имеющую неверный формат.

Нужно в свойствах проекта Visual Studio установить платформу сборки x86.Properties - Build - Platform Target - x86



#slack for windows with desktop notifications

Hello there!

There are no official desktop Slack version, so I started to search non-official clients. I have found this project SlackUI, but that version does not support desktop notifications :(

So, I have been working on new Slack UI with desktop notifications. Here is result of my work (be careful, 25 Mb GIF):

https://lh4.googleusercontent.com/GdVxADmQTy3BRVpF7X2Ml8SoCmvxjcg2tOkcLEMERnB5ZNba-hXwEQ3p4ym3lc7xkYA7dlEFyZk=w1896-h875




What works?

  • Drag'n'Drop
  • Notifications

What doesn't work?

  • Opening links in new window
  • Hiding to tray

Where can I download?

четверг, 19 февраля 2015 г.

How to set Omnibus Gitlab unicorn workers count

Stop your gitlab instance

sudo gitlab-ctl stop

Edit file
/etc/gitlab/gitlab.rb


Uncomment and set unicorn workers count

#!/bin/sh
##################
# GitLab Unicorn #
##################
## Tweak unicorn settings.

# unicorn['worker_timeout'] = 60
unicorn['worker_processes'] = 1

How to set Omnibus #Gitlab #Sidekiq workers count

Stop your gitlab instance

sudo gitlab-ctl stop

Edit file
/opt/gitlab/sv/sidekiq/run


Set your workers count

#!/bin/sh

cd /var/opt/gitlab/gitlab-rails/working

exec 2>&1

exec chpst -e /opt/gitlab/etc/gitlab-rails/env -P \
  -U git -u git \
  /opt/gitlab/embedded/bin/bundle exec sidekiq \
    # ADD THE LINE BELOW AND SET NUMBER OF WORKERS
    -c 3 \  # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< SET NUMBER OF WORKERS HERE
    -q post_receive \
    -q mailer \
    -q system_hook \
    -q project_web_hook \
    -q gitlab_shell \
    -q common \
    -q default \
    -e production \
    -r /opt/gitlab/embedded/service/gitlab-rails \
    -t 4

четверг, 25 декабря 2014 г.

WPF set application-wide Culture, NumberFormat, Decimal separator

WPF by default uses built-in culture settings that come with .Net Framework libraries.

For example, for ru-RU culture double must look like 123456,789, for en-US like 123456.789, so if you don't want your users to be angry, you must set your application culture at startup. However, our users want to see doubles like in en-US culture, e.g. 123456.789

There are two ways to do this:

1. Modify current culture settings. And that is awful
   a. Not all controls support such behaviour
   b. This code breaks all your hopes:
    XmlLanguage xmlLanguage = XmlLanguage.GetLanguage("ru-RU");
    FrameworkElement.LanguageProperty.OverrideMetadata(typeof (FrameworkElement),
                                                       new FrameworkPropertyMetadata(xmlLanguage)); 

    XmlLanguage ignore all modifications to Thread.CurrentThread.CurrentCulture

2. Register your own culture (works if your users can get administator rights).


        private const string CultureName = "ru-MIT";
        private const string cultureEnglishName = "ru-MIT";
        private const string cultureNativeName = "Русский (Мит)";

        private static void Main(string[] args)
        {
            CreateAndRegisterOwnCulture();
        }

        private static void CreateAndRegisterOwnCulture()
        {
            var ownCulture = new CultureAndRegionInfoBuilder(CultureName, CultureAndRegionModifiers.None);

            var parentCulture = new CultureInfo("ru-RU");
            var region = new RegionInfo("RU");
            ownCulture.LoadDataFromCultureInfo(parentCulture);
            ownCulture.LoadDataFromRegionInfo(region);

            ownCulture.CultureEnglishName = cultureEnglishName;
            ownCulture.CultureNativeName = cultureNativeName;

            var nfi = (NumberFormatInfo) parentCulture.NumberFormat.Clone();
            nfi.NumberDecimalSeparator = ".";
            nfi.NumberGroupSeparator = " ";
            nfi.CurrencyDecimalSeparator = ".";
            nfi.CurrencyGroupSeparator = " ";

            ownCulture.NumberFormat = nfi;
            ownCulture.Parent = parentCulture;


            if (SystemHasMitCulture())
            {
                Console.WriteLine(">>> System already has own culture :)");
                return;
            }

            // Admin rights are needed here
            // CultureAndRegionInfoBuilder.Unregister(CultureName);

            try
            {
                // Admin rights are needed here
                Console.WriteLine(">>> Trying to set own culture");
                ownCulture.Register();
                Console.WriteLine(">>> Own culture set successfully");
            }
            catch (UnauthorizedAccessException)
            {
                Console.WriteLine(">>> Set own culture failed :(");
            }
            catch (InvalidOperationException)
            {
                Console.WriteLine(">>> Culture is already registered :)");
            }
        }

        private static bool SystemHasMitCulture()
        {
            return CultureInfo.GetCultures(CultureTypes.UserCustomCulture).Any(ci => (ci.Name == CultureName));
        }

The same code on Github Gist: https://gist.github.com/Snegovikufa/f051959dd105b7e56405

Как я дома скалодром строил

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