воскресенье, 10 декабря 2017 г.

как создать копию большой БД на MS SQL Server

маленькие БД можно скопировать созданием скриптов. с большими я уткнулся в проблему, что не так в этом плане все просто.

вот, в итоге подсказали заклинание. не понимаю, что там происходит, но, в итоге копия базы создается очень быстро (со скоростью копирования файла БД):


backup database [<ИМЯ БАЗЫ-ИСТОЧНИКА>]
to disk='C:\sqlbackup\backup.bak' with init, compression

restore database [<ИМЯ ЦЕЛЕВОЙ БАЗЫ>]
from disk='C:\sqlbackup\KaspiHelp.bak'
with
move '<логическое имя mdf-файла исходной базы>' to 'c:\SQLDATA\<имя Файла Соответвтующее базе>.mdf',
move '<логическое имя log-файла исходной базы>' to 'c:\SQLLOG\<имя Файла Соответвтующее базе>_log.ldf',
replace,stats=1

например:
--копируем SomeDbProdClone в alik-test-ddos

backup database [SomeDbProdClone]
to disk='C:\sqlbackup\SomeDb.bak' with init, compression

restore database [alik-test-ddos]
from disk='C:\sqlbackup\SomeDb.bak'
with 
move 'SomeDb' to 'c:\SQLDATA\AlikTestDdos.mdf',
move 'SomeDb_log' to 'c:\SQLLOG\KaspihepAlikTestDdos_log.ldf',
replace,stats=1

c# yield return

интересная фича языка. код сам за себя скажет.  минус - нет возможность yield return'у скормить коллекцию, нужно ее через foreach пропускать

static void Main(string[] args)
        {
            Console.WriteLine(f().First());


            Console.WriteLine("DONE");
            Console.ReadKey();
        }

        static IEnumerable<int> f()
        {
            try
            {
                Console.WriteLine("yield 1");
                yield return 1;
                Console.WriteLine("yield 2");
                yield return 2;
            }
            finally
            {
                Console.WriteLine("finally");
            }
        }


аутпут:
yield 1
finally
1
DONE

четверг, 27 июля 2017 г.

jquery.validation базовая шпаргалка

$("#myform").validate({config}) - первая инициализация валидации. он сабмит формы перезаписан. событие сабмита - submitHandler в конфиге. на этом этапе создается объект validator
(должно вызываться именно для тега form)

validate() на проиниченной форме - обращение к уже настроенной валидации (возвращается существующий объект validator). параметры игнорируются.
$("#myform").valid() - программный вызов валидации (окрашивает контролы). возвращает тру/фолс. но не прыгает на первый ошибочный. для прыжка - validator.focusInvalid(), он же $("#myform").validate().focusInvalid()

JQuery parent vs parents vs closest

.parent - возвращает непосредственного родителя. если задан селектор (parent("DIV")) - непосредственный родитель вернется, если он соответствует селектору. иначе - пустое множество.
.parents - возвращает массив всех вышестоящих элементов. если задан селектор - то только тех, кто ему соответствует.
.closest - грубо говоря, всегда возвращает первый элемент из того, что вернул бы parents, но если элемент , для которого метод вызывается, сам соответствует селектору - вернется он. иначе - ближайший вышестоящий. если селектор не задан - вернется пустое множество

понедельник, 10 апреля 2017 г.

tortoice git: информация об удаленных удаленных ветках

выяснил нюанс: оказывается, при выполнении команды fetch git может не "засосать" информацию об удаленных (removed) удаленных (remote) ветках (гы).
засасывается эта информация только если стоит настройка prune. по умолчанию команда fetch берет эту настройку из общих настроек git, а те, ув свою очередь, из настроек удаленного репозитория (это я предполагаю, но похоже на правду).
я это все обнаружил, когда в один прекрасный день инфа об удаленных удаленных ветках перестала поступать. предполагаю, что после какого-то апдейта эта настройка на сервере выключилась.
выходы из ситуации:
1) всегда ставить флаг/галочку prune при выполнении fetch
или
2) поставить галочку prune (all remotes) в настройках git:

суббота, 25 марта 2017 г.

виснет Tortoice Git 2.4.0

виснет, когда открываешь большой revision graph. а так же, кажется, медленно открывает окно просмотра изменений в файле.
чтоб решить проблему - пришлось перейти на 2.3.0
ее достаточно трудно найти на сайте tortoice git, но я как-то нарыл, путь не запомнил :(

понедельник, 13 марта 2017 г.

проверка синтаксиса razor при компиляции. MvcBuildViews

по в проекте по умолчанию на этапе компиляции синтаксис cshtml-файлов не проверяется. и, если такой файл содержит синтаксическую ошибку, это выяснится только когда будет запрошена страница, в формировании которой он участвует.
чтоб изменить ситуацию, нужно в проекте включить опцию MvcBuildViews
через UI нельзя включить эту опцию, придется редактировать csproj-файл в блокноте.
открываем, находим
<MvcBuildViews>false</MvcBuildViews>

меняем на <MvcBuildViews>true</MvcBuildViews>

все, после этого компиляция заканчивается  ошибкой, если есть синтаксические ошибки в cshtml-файлах

пятница, 3 февраля 2017 г.

отладка в исходниках библиотеки .net и Asp.net mvc

в исходниках стандартной библиотеки
Что делать, если я захотел пройтись отладчиком , например, по реализации List<T>.Add?
(Все это я опробоввал на Visual Studio 2015 Community Edition)
*кажется, в экспресс-версиях Студии отладка исходников не поддерживается

принцип такой:
1) для модуля, в котором лежит релизация метода, в который мы хотим зайти, должен быть загружен PDB-файл, который содержит информацию по соответствию линий исходного кода группам инструкций исполняемого бинарника
2) должен быть, собственно исходник, в котором находится объявление
 чтоб это получилось - нужно изменить настройки, как показано здесь:
https://referencesource.microsoft.com/setup.html

кроме того, нужно зайти в настройки "Debugging - Symbools", поставить галочку "Microsoft Symbol Servers". так же должен быть отмечен пункт "Only specified modules"

после этого нужно закрыть/откыть Visual Studio, чтоб настройки вступили в силу
если вместо Only specified modules включить опцию "All modules unless excluded" - при старте приложения с интернета будут закачиваться PDBшки всех модулей. а это - долго, у меня не хватает терпения ждать. кстати, при запуске отладки Студия почему-то , все же, пытается качать что-то - я просто отмену жму

*чтоб вернуть все обратно и не заходить в реализацию сторонних модулей - нужно включить "Enable just My Code" и в "Symbols"  выбрать "Only specified modues"

так вот, доходим до строки, в коорую хотим нырнуть, отладчиком
выясняем, в какой ДЛЛке находится нужный нам код
в окне Modules правой кнопкой по ДЛЛке, "Load symbols info" - в соотв. строке должна отобразиться инфа, что символы загружены. кстати, там же есть пункт "всегда загружать символы"
(еще можно загрузить символы через контекстное меню окна стека вызовов)

все, жмем F11 - проваливаемся в реализацию метода

*перед публикацией попробовал еще раз - не получилось провалиться в mscorlib :(((
загружаешь символы для этого модуля, в стеке вызовов даблкликаешь на строчку из этого модуля - выходит окошко "Source Not Available" :(
я поузнавал: есть несколько майкрософтовских серверов символов. из низ , в частности, http://referencesource.microsoft.com - клевый, выдает PDB с информацией об исходниках.
а https://msdl.microsoft.com/download/symbols - чмошный, без исходников.
и, вот, судя по информации о загрузке символов (модули- правый клик - Symbol Load Information) PDBшка качается с https://msdl.microsoft.com/download/symbols :(
проблема в том, что на серверах майкрософт нет нормальных PDB для моей версии mscorlib
но клянусь честью, как минимум раз я дебажил Console.WriteLine (видимо, тогда звезды и версии библиотек сошлись удачнее)



отладка ASP.NET MVC

тут - свои нюансы.
первое - PDB не скачивается со стандартных серверов символов Майкрософт. решается так: настройки "Debugging - Symbools" - в список серверов добавляется пункт "http://srv.symbolsource.org/pdb/Public"

ок, останавливаемся на точке останова, загружаем символы для модуля, жмем F11... и тут 1) либо вы провалитесь не в реальны исходник, а в автосгенерированный файл с сигнатурами - в этом случае вам нужно просто удалить этот файл и повторить процедуру
2) либо Студия попросит указать ей, где лежат, собственно, исходники.

и вот тут - вторая часть Марлезонского балета.

смотрим версию asp.net MVC в packages.config
например, 5.2.2

http://aspnetwebstack.codeplex.com/wikipage?title=Repository%20Tags%20and%20Version%20Numbers -  ищем соответствующую ей версию внутри гит-репозитория (типа, имя ветки)  - 3.2.2

https://aspnetwebstack.codeplex.com/SourceControl/latest - клонируем этот Git-репозиторий (кто не умеет работать с гитом - http://google.com :))

переключаемся на тег с нашей версией - (V3.2.2)

все, это - исходники. найдите среди них файл, который запрашивает Студия, и отладка пошла

версию исходников можно посмотреть в CommonAssemblyInfo.cs


вторник, 10 января 2017 г.

C# async/await - шапошное знакомство

(не очень информативно получилось, если честно)

во все нюансы этой штуки я не вник. почитал документацию от Microsoft - много информации, общая картина в голове не сложилась.

прочел https://habrahabr.ru/post/139734/ - общее представление появилось. хотя, еще много нюансов осталось неизученными.

эта фича дает возможность запускать асинхронно метод в фоновом потоке, а когда она закончится - код, использующий результат выполнения асинхронного метода, вызывается опять в вызывающем потоке (типа, сработало событие "поток закончен").
при чем, код очень похож на аналогичный код, выполняемый синхронно в одном потоке.

это прикольно для GUI-приложений, т.к. облегчает вызов обработки долгих операций в фоновом режиме

то есть, нажали кнопку - в обработчике в первой строке кода кнопка заблокировалась, следующей строчкой прописывается вызов асинхронного метода, следующей строчкой - кнопка разблокируется, результат вычисленицй куда-нить выводится. а по факту, когда дело доходит до второй строчки - создается и запускается поток, в котором вызвается асинхронный метод, после чего в первом потоке происходит выход из обработчика нажатия ()

профит - во время выполнения длительной операции GUI-поток не зависает, интерфейс продолжает реагировать на действия пользователя

написал тестовое приложеньице:

        static void Main(string[] args)
        {

            Log("привет!");
            SomeOperation();    //тут - предупреждение компилятора, что операция используется без слова await, и будет запущена асинхронно
            Log("пока!");

            Console.WriteLine("DONE");
            Console.ReadKey();
        }
        async static Task SomeOperation()
        {
            Log("Запускаем фиктивный пустой таск");
            
            await Task.Run(()=> {});
            Log("и весь дальнейший код будет выполняться уже в фоновом потоке");
            Log("начинаем операцию по ожиданию...");
            Thread.Sleep(1500);
            Log("закончили");
        }

        static void Log(string s)
        {
            Console.WriteLine($"{s} - поток: {Thread.CurrentThread.ManagedThreadId}");
        }
    }


вывод:
привет! - поток: 9
Запускаем фиктивный пустой таск - поток: 9
пока! - поток: 9
DONE
и весь дальнейший код будет выполняться уже в фоновом потоке - поток: 10
начинаем операцию по ожиданию... - поток: 10
закончили - поток: 10


в общем, полной ясности нет, но штука интересная. если доведется с потоками колдовать - еще поизучаю

UPD:  все еще нет полной ясности. но, кажется, эта тема - не для асинхронной обработки и паралеллизма. а для ситуаций, когда определенный поток является ценным ресурсом, и не хочется выполнять на нем длительные операции. например основной поток GUI-приложения, или поток из пула потоков на вэб-сервере, где есть настройка, задающая максимальное число выполняемых одновременно потоков из пула (или как-то так)