Страницы

Поиск по вопросам

среда, 27 февраля 2019 г.

Где в реестре Windows указывается браузер по умолчанию?

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


Ответ

Дефолтный бразузер может быть разным для разных протоколов.
Ассоциации протоколов работают так же, как ассоциации файлов:
HKEY_CLASSES_ROOT\http\shell\open\command
где HKEY_CLASSES_ROOT - это результат мержа HKEY_CURRENT_USER\Software\Classes и HKEY_LOCAL_MACHINE\Software\Classes
UP: начиная с висты, ассоциации протоколов пишутся еще и в
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http
так что стоит проверять оба варианта.
Длинная статья с подробностями: How Does Your Browser Know that It’s Not The Default.

Чем смотреть исполняемый код .net приложения?

Хочу полазить по скомпилированному приложению, чтобы увидеть оптимизации, производимые jit-компилятором.
Какие программы использовать, чтобы получить листинг нативного кода после прохода jit и их меппинг на инструкции il-кода? В идеале бы ещё меппинг на C#-код.


Ответ

Запустите или присоединитесь к своему приложению отладчиком Visual Studio, установите брекпойнт в интересующем месте, и когда он сработает - выберите пункт меню "Debug/Windows/Disassembly".
Опции для показа IL там нет. Можно только установить галочку "Show source code", и тогда будет показан маппинг машинного и исходного кода(на C#, VB.NET, или на другом языке, на котором вы программируете).

Как в Golang прервать выполнение кода?

Как в Golang прервать выполнение кода? Аналог exit()/die() в PHP.
Есть
func Index(w http.ResponseWriter, r *http.Request) { parametr=0 if parametr!="1" { fmt.Fprintln(w, "Параметр=1") } fmt.Fprintln(w, "текст после проверки") //Я хочу это не отображать,если parametr!="1" }
Нужно, если параметр не 1, то выйти из функции (но не из приложения вообще). Можно, конечно, поставить else, но везде тогда делать обёртки? Или можно как-то выйти из функции?


Ответ

выход
func os.Exit(code int)
Exit causes the current program to exit with the given status code. Conventionally, code zero indicates success, non-zero an error. The program terminates immediately; deferred functions are not run.
мой вольный перевод:
Exit вызывает завершение текущей программы с указанным кодом завершения. принято считать, что код 0 означает успешное завершение, а не-нулевой код означает ошибку. программа завершается немедленно, отложенные функции не вызываются.
возврат
return [ ExpressionList ]
A "return" statement in a function F terminates the execution of F, and optionally provides one or more result values. Any functions deferred by F are executed before F returns to its caller.
мой вольный перевод:
оператор "return" в функции "F" прерывает выполнение "F" и (опционально) возвращает один или более результатов. любые функции, «отложенные» функцией "F", выполняются перед тем, как управление вернётся в вызывавшую "F" функцию.
примеры:
func noResult() { return }
func simpleF() int { return 2 }
func complexF1() (re float64, im float64) { return -7.0, -4.0 }

PHP. Регулярное выражение, допускающее отсутствие некоторых частей

Есть текст, типа: "Осталось 10 часов 15 минут 12 секунд". Некоторые компоненты (часы, минуты, секунды) могут отсутствовать. Нужно выдернуть циферки и соотнести с часами, минутами, секундами. Делаю так:
Осталось\s+(?!(\d+)\s+(час).*?)(?!(\d+)\s+(минут).*?)(?!(\d+)\s+(секунд).*?)
Текст подходит под регулярное выражение, но от него всегда остается только "Осталось " при любых комбинациях час., мин., сек.
P.S. Нашел информацию по (?!...). Они, оказывается, используются только для проверки, но ничего не выводят.
Каким образом можно одновременно проверить наличие фрагментов и выдернуть данные?


Ответ

Нужно использовать комбинацию из проверяемой части и захватывающей части. Примерно вот так:
Осталось\s+((?\d+)\s+час(а|ов)?\s*)?((?\d+)\s+минут(а|ы)?\s*)?((?\d+)\s+секунд(а|ы)?)?
После обработки в именованных группах будут требуемые значения.
Демо тут (спасибо за наводку @stribizhev)

Передача в метод обобщенных интерфейсов

Имеется такой код:
public interface IInterface { IDictionary GetData(); }
public class Base { }
public class A: Base { }
public class B : Base { }
public class ADA: IInterface { public IDictionary GetData() { return new Dictionary(){ {0, new A() }}; } }
public class BDA : IInterface { public IDictionary GetData() { return new Dictionary() { { 0, new B() } }; } }
public class MyClass { public static void Fill(params IInterface[] @interface) { foreach (var access in @interface) access.GetData(); } }
Он не компилируется, вопрос такой: Как можно передать несколько реализаций интерфейса IInterface в метод Fill ? Есть разные способы, хочется узнать какой правильный. Если ошибка в проектировании, подскажите пожалуйста как будет верно ? Классы Base, A, B изменять нежелательно.


Ответ

Т.к. строгой типизации все равно не получить, то есть несколько вариантов:
dynamic:
public static void Fill(params dynamic[] interfaces) { foreach (var access in interfaces) { object data = access.GetData(); } } dynamic с маркер-интерфейсом:
public interface IInterface { }
public interface IInterface : IInterface { IDictionary GetData(); }
public static void Fill(params IInterface[] interfaces) { foreach (dynamic access in interfaces) { object data = access.GetData(); } } Реальный интерфейс с неявной реализацией в ADA и BDA
public interface IInterface { IDictionary GetData(); }
public interface IInterface : IInterface { new IDictionary GetData(); }
public class BDA : IInterface { public IDictionary GetData() { return new Dictionary() { { 0, new B() } }; }
IDictionary IInterface.GetData() { return (IDictionary)this.GetData(); } }
public static void Fill(params IInterface[] interfaces) { foreach (var access in interfaces) { IDictionary data = access.GetData(); } }
В последнем случае типизация какая-никакая будет. В первых двух - object.

Как динамически создать массив, не зная количества его элементов? [дубликат]

На данный вопрос уже ответили: Как создать динамический массив? 3 ответа В цикле читаю некоторый блок данных по частям различных размеров. Требуется учитывать размеры этих частей - думаю загонять их в массив. Как создать этот массив, если я не знаю сколько частей будет? Возможно ли реализовать такое в языке С стандартными методами?


Ответ

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

Возможно ли в datagrid вывести подстроки?

У меня есть коллекция объектов, каждый объект имеет в себе коллекцию других объектов. Возможно ли эту коллекцию вывести в DataGrid. Мой код: //ViewModel
public class ObladnanViewModel { public ObservableCollection Collection { get; set; } public ObservableCollection Electromotors { get; set; }
public ObladnanViewModel() { Electromotors =new ObservableCollection() { new ElectromotoruModel(){Id= 1,Marka = "AO2",Name = "Main"}, new ElectromotoruModel(){Id=2,Marka = "4",Name = "Main"}, new ElectromotoruModel(){Id=3,Marka = "AO2",Name = "Main"} }; Collection=new ObservableCollection() { new ObladnanModel(1,"Obl1",Electromotors), new ObladnanModel(2,"Obl2",Electromotors) }; } }
Класс ElectromotoruModel:
public class ElectromotoruModel { public int Id { get; set; } public string Name { get; set; } public string Marka { get; set; } }
public class ObladnanModel { public int Id { get; set; } public string Name { get; set; } public ObservableCollection Elektromotors { get; set; }
public ObladnanModel(int id, string name, ObservableCollection electromotors) { this.Id = id; this.Name = name; this.Elektromotors = electromotors; } }
И пробивал так XAML:

Но в Motors выводит просто пустую строку. Возможно ли сделать так:


Ответ

Нашел решение. Правда не в DataGrid а в ListBox но и так пойдет) Моя ViewModel:
public class ObladnanViewModel {
public ObservableCollection Collection { get; set; }
public ObladnanViewModel() { Collection=new ObservableCollection() { new ObladnanModel(1,"Obl1",new ObservableCollection() { new ElectromotoruModel(){Id= 1,Marka = "AO2",Name = "Main"}, new ElectromotoruModel(){Id=2,Marka = "4",Name = "Main"}, new ElectromotoruModel(){Id=3,Marka = "AO2",Name = "Main"}}),
new ObladnanModel(2,"Obl2",new ObservableCollection() { new ElectromotoruModel(){Id= 1,Marka = "36",Name = "Main"}, new ElectromotoruModel(){Id=6,Marka = "4",Name = "Vent"}, new ElectromotoruModel(){Id=3,Marka = "AO6",Name = "cooling"}, new ElectromotoruModel(){Id = 4,Marka = "C03",Name = "movement table"}} ) }; } }
Код Xaml:






Результат: