"Today I Learned" - обмен на съвети и трикове


33
Бонжур, колеги
 
Темата която пускам е вдъхновена от един субредит, където постерите споделят интересна информация на която са се натъкнали. Хрумна ми, че всеки от нас от време на време се натъква на някакви "диаманти" - полезен хак, експертно инфо, дълбоко прозрение което избистря сложната теория. Уви, моментите на просветление са редки и обикновено са предшествани от дълго ровене в търсачки и форуми, безкрайни чатове, дебъгване и скубане на коса.
 
Предлагам да оптимизираме процеса в стил cloud computing - който открие нещо готино, може да го споделя тук, и всички ще черпим от взаимния си опит. Единственото изискване е да постваме неща, свързани с материала в академията и приложимо в това което правим.
 
Ето моят стартов принос
 
[Web Services] Kак да дебъгваме API-то и клиента едновременно
 
Използваме менюто за startup project: Solution Explorer -> десен цък на Solution -> Properties, избираме Multiple Startup Projects и нацъкваме на Api и Client проектите "Start". Така дебъгерът ще пуска и двата едновременно, и ще можем да стъпваме последователно през кода на заявките и сървърната логика, за да разберем какво се е объркало.
 
 

в Други от staafl (5770 точки)


Отговори



4
Днес научих, че за да връща различни стойности един обект Random трябва да е деклариран извън метода или функцията където се извиква Next(). Например следното работи добре и генерира различни дати:
//Random generator method for datetime values in the next 5 years static Random rnd = new Random(); static DateTime RandomDate() { DateTime end = new DateTime(2018, 08, 06); int range = (end - DateTime.Today).Days; return DateTime.Today.AddDays(rnd.Next(range)); }
Ако вкараме декларацията вътре в метода, в нормален режим на работа връща една и съща дата (при извикване на метода от друг метод), а при дебъг връща различни стойности съгласно очакванията. :
//Random generator method for datetime values in the next 5 years static DateTime RandomDate() { static Random rnd = new Random(); DateTime end = new DateTime(2018, 08, 06); int range = (end - DateTime.Today).Days; return DateTime.Today.AddDays(rnd.Next(range)); }
Предстои ми да науча каква е причината.

от ttitto (1950 точки)


1
Това на което си се натъкнал е много чест проблем със всички генератори на случайни числа и на всички платформи. Мен наскоро ме ухапа в SQL Server.
Причината е че за да връща "случайни" числа, System.Random има нужда от стартова стойност ("seed") с която да си инициализира алгоритъма; ако не е зададен изрично, използва Environment.TickCount, което е броят милисекунди от стартирането на компютъра.
В първия случай, инициализираш един обект и го използваш във всички извиквания - той ти връща поредица от случайни числа, като след всяко извикване запомня докъде е стигнал.
Във втория случай, при всяко извикване правиш нов обект, който всеки път се инициализира с seed = Environment.TickCount. Ако извикванията са скоро едно след друго, seed-ът ще е еднакъв и обектите ще генерират еднакви редици числа.
Разликата при дебъгването е, че дебъгерът като цяло забавя програмата и шансът за еднакъв seed намалява; това е пример за Heisenbug - бъг, който изчезва когато го изучаваш: http://en.wikipedia.org/wiki/Heisenbug

от staafl (5770 точки)

0
При дебъгване ти връща различни стойности, съгласно очакванията, защото има време за да ги генерира, докато като си пуснеш програмата с F5 всичко се случва бързичко и за това не взима различни стойности. Във видеото към лекцията за класове и обекти на Жоро се разглеждаше това до колкото помня. :)



11

Yesterday I Learned

Вчера се сблъсках със следната ситуация: тръгнах да си архивирам папката с домашното по Web Services, и размера на архива стана по-голям от допустимите 16MB, които приема систематата. Това е заради големия размер на Nuget Packages в solution-а.

[How To] Remove And Restore Nuget Packages - Reduce Solution Size On Disk

Препоръчвам първо да си копирате финалната версия на solution-а и тогава да пробвате указанията, за да не стане фал.

1. Enabling package restore during build

Tools -> Options -> Package Manager -> General

Избирате Allow NuGet to download missing packages during build

2. Десен бутон върху solution-a и Enable NuGet Package Restore

3. В папка packages изтривате всичко без Microsoft.BCL папките (ако имате такива) и repositories.config файла (не съм сигурен дали е нужен)

Restore: Отваряте solution-a, десен бутон вурху solution-а и Manage NuGet Packages for this solution... -> има бутон Restore, който ще инсталира всички нужни NuGet Packages

http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages


от d_iliev_d (200 точки)


0
Супер! мерси много!
Само една вметка - попаднах на пакет, заради който ми гърми консолния ап, ако бъде затрит: ако Microsoft.BSL пакетите също се затрият, в моя случай изкарва грешка при reload на проекта (конзолния)

от nickeyz (878 точки)

0
Мерси и от мен за поправката, ще го вмъкна в поста.

от d_iliev_d (200 точки)



2

C# и Visual Studio

Днес научих че T4 шаблоните могат да се използват и за генериране на низове, не само на код. Например, ако искаме да си генерираме HTML таблица със знаците в някаква кодировка:

Още не съм го осмислил напълно, но все повече ми се струва че T4 може да е супер полезна технология, ако научиш как и кога да я прилагаш.


от staafl (5770 точки)


1

Колеги, благодаря за полезните съвети. Пиша за да вдигна темата по нагоре. Аз лично трудно я намерих, а особено постът на @Dimitar Iliev ме спасява за предаването на първото домашно по Web-Services :)


от el_b_k (424 точки)


5
При get заявка от api-то ( когато ви връща xml резултат на страницата ) ако не искате да ви показва (сериализира) и null (без стойност) пропъртитата им сложете атрибут [DataMember(EmitDefaultValue = false)].

от iwitass (3695 точки)


2

[IT & Software Engineering]

Днес научих че почти 2/3 от софтуерните проекти не успяват да постигнат целите си - закъсняват, излизат от бюджет, не покриват изискванията, нямат необходима функционалност; минимум 15% така и не виждат бял свят. - (Coding Horror: The Long, Dismal History of Software Project Failure)

Освен това, типичният софтуер съдържа "15 - 50 errors per 1000 lines of delivered code." (Code Complete)

Кой сега се подиграва на unit тестовете? :-)
 


от staafl (5770 точки)


0
А подиграва ли се някой? Бих се учудила :)

от ellapt (6303 точки)

0
Сблъсквал съм се с доста девове които считат тестовете едва ли не за суеверие и загуба на време, в най-добрия случай - незадължителен overhead. Lol. Силно се надявам от академията да не излизат такива хора.

от staafl (5770 точки)


4
За едновременно дебъгване на няколко проекта Дончо ползваше десен бутон върху проекта и Debug -> Start new instance. Така за всеки проект, който искаш да стартираш.

от vic.alexiev (2299 точки)


0
Ахххххххххх, това съм се чудила как да направя!

от ellapt (6303 точки)


2

[Visual Studio] Как да махнем ненужните автоматични using-и

Съдейки по Tech Support изпитите които проверих, трябваше да постна това малко по-рано, но все пак - ако не искате VS автоматично да ви слага using-и когато правите нов файл, можете ръчно да промените шаблоните в папка C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Code\1033 (подпапките са Class и Interface).

С всяка версия на .NET Microsoft слагат по някой нов default-ен namespace, вероятно с цел да рекламират новата функционалност (System.Collections.Generic дойде в 2.0, System.Linq в 3.0, System.Threading.Tasks в 4, а за System.Text не съм сигурен). В което няма лошо, но лично аз не обичам IDE-то да ми отваря работа да ги махам всеки път като добавям нов файл, особено ако след това ще ми го гледат за КПК.

ПС: понеже Program Files изисква администраторски достъп, може да се наложи да копирате шаблоните някъде другаде, да ги редактирате, и след това да ги върнете в папката.

 


от staafl (5770 точки)


0
Благодаря. Първата ми работа, като създавам нов файл е да ги изтрия, тъй като предпочитам да са ми в неймспейса. После вече ако ми трябва някакъв то автоматично се добавя вътре в неймспейса.
ПП: Ако не ви дава да редактирате файла, копирайте го в десктопа, редактирайте там, изтрийте оригинала и сложете файла от десктопа в папката.

от SVGN_H (3048 точки)


2

Днес научих че Mono има C# конзола, вкл. и на Windows:

\> "C:\program Files (x86)\Mono-2.10.9\bin\csharp.bat"

Mono C# Shell, type "help;" for help

Enter statements below.

csharp> Math.Sin(Math.PI/2);
1

csharp> for (int i = 0; i < 7; ++i) Console.WriteLine((DayOfWeek)i);
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

csharp> using System.Net;
csharp> var wc = new WebClient();
csharp> wc.DownloadString("http://google.com").Substring(0, 100);
"<!doctype html><html itemscope=\"\" itemtype=\"http://schema.org/WebPage\"><head><meta itemprop=\"image\"
"
csharp>

Вече имам всичко което някога съм искал от живота :-)


от staafl (5770 точки)


0
бтв, вече C# конзолата за Visual Studio е готова, само трябва да си инсталирате Roslyn и да пуснете View -> Other Windows -> C# Interactive

от staafl (5770 точки)


1

Днес научих че VS има вграден isolation framework (т.е. framework за мокване и стъбване в unit тестове).


от staafl (5770 точки)