четверг, 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

Python setup.py build vcvarsall.bat error

If you get this error when running python setup.py build

error: Unable to find vcvarsall.bat

You need:
1. Install Microsoft Visual C++ Compiler for Python 2.7
http://www.microsoft.com/en-us/download/details.aspx?id=44266
2. Upgrade setuptools
3. Try again

вторник, 11 ноября 2014 г.

Выбор графика для отображения данных

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



SSH / SCP ignores sshconfig in command line

If you setup git and then try to use ssh from SYSTEM account, then you will get authentication errors. To solve that issues you need to add HOME system environment variable and reboot your machine.

So your system PATH will look like this:



среда, 15 октября 2014 г.

Telerik RadComboBox bind to Enum

Short posts are nice, yeah!

The result you want to see:


TestCombobox.xaml
<Window x:Class="TelerikWpfApp1.TestComboBox"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
        xmlns:telerikWpfApp1="clr-namespace:TelerikWpfApp1"
        Title="TestComboBox" Height="300" Width="300">
    <Window.Resources>
        <telerik:EnumDataSource EnumType="telerikWpfApp1:PlayerType"
                                x:Key="enumDataSource" />
    </Window.Resources>
    <Grid>
        <telerik:RadComboBox SelectedValue="{Binding Path=PlayerType}"
                             ItemsSource="{Binding Source={StaticResource enumDataSource}}"
                             DisplayMemberPath="DisplayName"
                             SelectedValuePath="Value" />
    </Grid>
</Window>

TestCombobox.xaml.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
namespace TelerikWpfApp1
{
    public partial class TestComboBox
    {
        public TestComboBox()
        {
            InitializeComponent();
            this.DataContext = new Player()
            {
                PlayerType = PlayerType.Defender,
            };
        }
    }
    public enum PlayerType
    {
        [Description("The forward")]
        Forward,
        [Description("The defender")]
        Defender,
        [Description("The goal keeper")]
        GoalKeeper,
    }
    public class Player
    {
        public PlayerType PlayerType { get; set; }
    }
}

среда, 8 октября 2014 г.

Книги за апрель-октябрь 2014

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


Прочитал полностью или прочитал большую часть:
1. Краковецкий "Когда я говорил" 
Не совсем книга, а цикл статей от известного на Хабрахабре человека.
2. Мартин Р. "Быстрая разработка программного обеспечения." Оказалась на 80% схожей с книгой того же автора "Принципы, паттерны и методы". Переосмыслил примеры из этой книги и стало снова грустно, что все примеры непригодны для реальных проектов :(
3. Мартин Фаулер "Рефакторинг. Улучшение существующего кода." Перечитал снова, но уже почти ничего не извлекаю.
4. Seemann Mark "Dependency Injection in .NET" -  Хорошая книга по внедрению зависимостей.
5. Game Programming Patterns - цикл статей о паттернах при разработке игр, очень и очень полезно, с кучей примеров.
6. Дэвид Херман "Сила JavaScript. 68 способов эффективного использования JS" - Эту книгу посоветовали, но не очень понравилось, набор сомнительных советов. Хотя кому-то может и пригодится.
7. Книга по Django c https://docs.djangoproject.com/  - Порой так трудно въехать в эту документацию.
8. Цикл статей с tangowithdjango. В связи со непонятностью основной документации, читал больше именно с этого сайта.
9.Albhari J., Albhari B. "C# in a Nutshell, 5th Edition" - Отличная книга по С#!
10. C. Petzold "Programming Windows 6th edition" - В сочетании с предыдущей книгой позволяет быстро начать делать приложения под WPF, в том числе очень много материала по WinRT.
11. Brennon Williams "Microsoft Expression Blend 4 Unleashed" - оказалась почти бесполезной
12. Kosinska E., Leeds C. "Microsoft Expression Blend 4 Step" - тоже бесполезно
13. Майк Микаловиц "Стартап без бюджета" - призыв "Бери и херачь" на протяжении всей книги. Правильно в общем-то :)

Аудиокниги слушаю только в исполнении Сергея Чонишвили, т.к. все другие читатели рассеивают моё внимание через 2-3 минуты слушания.

Прослушал аудиокниги:
1. Борис Акунин "Нефритовые четки"
2. Борис Акунин "Чёрный город"
3. Борис Акунин "Белонна"
4. Борис Акунин "Фантастика"
5. Чейз Хедли "Если вам дорога жизнь"
6. Сергей Чонишвили "Человек-поезд"
7. Уилки Коллинз "Лунный камень"

понедельник, 8 сентября 2014 г.

YouTrack 5 agile board dark theme

I wanted a dark theme for Youtrack's Agile board. JetBrains added new Darcula theme, but that theme didn't impressed me :(

So, I started to modify theme with Chrome Stylish:



1. Install Stylish
2. Set Darcula theme in your agile board settings
3. Add new style to Stylish
4. Copy style in Stylish from this gist:
5. Set url startswith: http://yourdomain.com/rest/agile/
6. Save style


среда, 3 сентября 2014 г.

Windows, Git bash и Putty

Надоело постоянно вводить пароли в git bash для пулов/пушей

Рецепт для Windows:
1. Установить Git, Putty + Plink + PuttyGen + Pagent (с официального сайта можно скачать установщик)
2. Сгенерировать ключи в PuttyGen в формате .ppk, закинуть их в %HOME%\.ssh

3. Создать ярлык для запуска Pagent

"C:\Program Files (x86)\PuTTY\pageant.exe" "C:\Users\snegovik\.ssh\work_rsa.ppk" "C:\Users\snegovik\.ssh\github_rsa.ppk"

4. Запустить Pagent с помощью ярлыка, ввести пароли для ключей
5. Запустить Putty, подключиться один раз ко всем серверам, можно ничего не вводить, просто принять fingerprint
6. Установить переменную окружения (советую Rapid Environment Editor)

GIT_SSH=C:\Program Files (x86)\PuTTY\plink.exe

7. Запустить Git bash и радоваться

воскресенье, 11 мая 2014 г.

Kendo UI null parameters

If you use Kendo UI MVC helpers, then you should name your widget exactly as parameters names in your controller's actions.

For example, we create some upload widget:

<div>
@(Html.Kendo().Upload() .Name("attachments") .Async(async => async .Save("Save", "Home") .AutoUpload(true) ) )
</div>

As you can see, we name upload widget as "attachments". Now, we create Save action in our Home controller.

public ActionResult Save(IEnumerable<HttpPostedFileBase> files) { foreach (var file in files) { var fileName = Path.GetFileName(file.FileName); var destinationPath = Path.Combine(Server.MapPath("~/App_Data"), fileName); file.SaveAs(destinationPath); } return Content(""); }

If you set breakpoint into Save action, you can see, that "files" parameter is null. To fix that issue, we rename "files" parameter as name of out upload widget, i.e. "attachments":

public ActionResult Save(IEnumerable<HttpPostedFileBase> attachments) { foreach (var file in attachments) { var fileName = Path.GetFileName(file.FileName); var destinationPath = Path.Combine(Server.MapPath("~/App_Data"), fileName); file.SaveAs(destinationPath); } return Content(""); }

And that will work as you expect! Attachments are not null!

понедельник, 28 апреля 2014 г.

Книги за март-апрель 2014

Давно хотелось написать какое-нибудь веб-приложение, читал пару книг про Django, но до дела у меня так руки и не дошли.  Но вот на работе подвернулась как раз такая задача и пришлось усиленно и быстро прочитать сразу очень много книг про веб-разработку (фронтэнд, бэкенд, базы данных, авторизации и много чего еще). Усиленное книгочтение лишь усугубило желание прочитать что-то еще. Решил оформить в виде списка, вдруг кому пригодится.

Прочитал полностью или прочитал большую часть:

  1. CoffeeScript CookBook - не совсем книга, но я упаковал страничку в pdf, т.к. брать оттуда пришлось многое
  2. Роберт Мартин, Мика Мартин "Принципы, паттерны и методики гибкой разработки на языке C#" - читаю до сих пор. Внутри хорошо описан проект расчета заработной платы и применяемые к нему паттерны.
  3. Джеффри Палермо, Джимми Богард и др. "ASP.NET MVC 4 в действии" - первая прочитанная книга по ASP.NET, все предельно ясно, но неглубоко
  4. Adam Freeman "ASP.NET MVC 5" - не понравилась, почти ничего полезного не извлек из этой книги. Может не очень внимательно читал
  5. Цикл статей про ASP.NET MVC на Хабре - я прочитал, но там еще очень много вещей, до которых я еще не дорос.
  6. Стивен Сандерсон "ASP.NET MVC Framework с примерами C# для профессионалов" - тоже очень хорошая книга. Понравился раздел про безопасность.
  7. Julia Lerman, Rowan Miller "Programming Entity Framework: Code First" - хорошая книга, но кое-где уже успела устареть
  8. Nishanth Nair, Ragini Kumbhat Bhandari "Building Mobile Applications Using Kendo UI Mobile and ASP.NET Web API" - очень полезная для знакомства с Kendo UI в целом и ASP.NET Web API в частности.
  9. Э. Фримен, Э.Фримен и др. "Паттерны проектирования" - бомба! Про паттерны я читаю не в первый раз, но мне не удавалось сесть, систематизировать и запомнить их. С этой книгой все получилось. Все паттерны разжеваны до деталей. Один и тот же паттерн объясняется по 5-6 раз с разных углов, не понять что-то довольно трудно. Примеры подобраны весьма удачно, хотя в некоторых местах, когда я пытался представить использование созданных в примере моделей с точки зрения разработки GUI, то вылезали очень неудобные моменты. Хотя это уже придирки. Отличная книга.
  10. Флэнаган Д. "JavaScript. Подробное руководство" (6 изд.) - пользовался ей исключительно как справочником. С этой точки зрения у книги все в порядке.
  11. Том ДеМарко "Deadline. Роман об управлении проектами" - тоже сейчас читаю. Очень хорошо подойдет как для менеджеров, так и для программистов.

Книги начатые, но не законченные:

  1. Итан Маркотт "Отзывчивый веб-дизайн"
  2. Люк Вроблевски "Сначала мобильные"
  3. Кит Джереми "HTML5 для веб-дизайнеров"
  4. Дэн Сидерхолм "CSS3 для веб-дизайнеров" - из двух последних уже мало чего извлекаю, т.к. большинство вещей и так знал.
  5. Julien Danjou "The Hacker's Guide to Python" - почитал одну общедоступную главу. Очень неплохо написано про тестирование. Про mock - тестирование узнал именно отсюда


четверг, 24 апреля 2014 г.

If adb doesn't see your Android device [Windows]

Yesterday I was trying to write an application for my Nexus 5 and stuck when adb shown me empty list of connected devices. What to do?


  1. Install Google USB driver (read about driver here)
  2. Enable Developer Options for your Android device. Usually you need to tap about 10 times in "Settings - About Phone" on "Android Version" item.
  3. Plug in USB cable into your device and check "adb devices" output
  4. If you see empty output, open Device Manager in Control Panel, right-click "Android ADB Interface" and delete. When dialog asks, check the "Delete drivers for this device" and hit "OK". It must look like this:

  5. Unplug your device. 
  6. Reinstall Google USB driver.
  7. Plug in USB cable into your device.
  8. On my Nexus 5 there was confirmation prompt for USB debugging. Allow to debug.
  9. Happy coding!

пятница, 14 февраля 2014 г.

Про Far Manager

В последнее время стал пользоваться в основном Windows и захотелось нормальной работы с консолью. Выбрал для себя ConEmu + Far Manager 3


Как всегда возникает много вопросов: "А как сделать X?"

Полезные для меня комбинации клавиш:

ALT + I - быстро найти файл в каталоге
CTRL + I - отфильтровать содержимое каталога по расширению

ALT + F1/F2, 1 - создание временной панели
ALT + F7 - отфильтровать содержимое каталога во временную панель
CTRL + \ - быстро перейти в корень диска
CTRL + O - перейти в режим консоли
CTRL + F - вставить название файла в консоль
ALT + F12 - история папок
ALT + F8 - история команд
Как можно просмотреть длинный вывод команды?
В ConEmu делаем запуск Far с параметром /w. Запускаем Far, вызываем команду с длинным выводом, нажимаем CTRL + O и наслаждаемся прокруткой вывода благодаря ConEmu.

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.e...