Страницы

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

понедельник, 13 мая 2019 г.

Почему C# может определить тип переменной, но не может определить тип константы?

Когда я определяю переменную, одновременно присваивая ей значение, я могу указать класс, наследником которого является результат выражения, могу указать интерфейс, который имплементируется результатом выражени или другой тип, к которому можно неявно привести этот результат. И в этом случае компилятор позволит мне не ошибиться с результатом выражения.
Так же я могу не указывать тип переменной, а предоставить эту возможность компилятору, воспользовавшись ключевым словом var.
var a = 5; // int var b = 5.0; // double
Но когда я определяю константу - компилятор заставляет меня прописать тип константы в явном виде.
const int c = 5; const double d = 5.0;
С чем связана такая непоследовательность? Неужели тип константы определить сложнее, чем тип переменной?


Ответ

Eric Lippert, ведущий разработчик компилятора C# отвечал на этот вопрос: https://stackoverflow.com/a/2128581/1159507
Если вкратце то var предназначена для упрощения конструкция типа Dictionary> priceTable = new Dictionary>();
var от слова variable - переменная, В то же время ключевое слово const подчеркивает что что значение меняться не может, поэтому ограничение компилятора тот исключительно логическое, чтоб не было нонсенса типа const var

Передача двумерного массива в функцию (Rust)

Кто-нибудь может подсказать, как передать в функцию двумерный массив?
Желательно по ссылке, т.е. без копирования самого массива. К сожалению их "книга" пока не богата на примеры передачи параметров в функцию. Вот как я себе это пытался представить:
fn foo(a:&[&[f64]],x:&[f64]) { for i in 0..3 { for j in 0..4 { println!("{}",a[i][j]); } } }
fn main() { let A:[[f64;4];3]=[[1.1,-0.2, 0.1,1.6], [0.1,-1.2,-0.2,2.3], [0.2,-0.1, 1.1,1.5]]; let mut X:[f64;3]=[0.0;3];
foo(&A,&X); }
"X" передается без проблем, а вот на "А" ругается при всех комбинациях [ ] и &, которые я смог придумать:
src/main.rs:16:6: 16:8 error: mismatched types: expected `&[&[f64]]`, found `&[[f64; 4]; 3]` (expected slice, found array of 3 elements) [E0308] src/main.rs:16 foo(&A,&X); ^~ error: aborting due to previous error Could not compile `example`.


Ответ

Дело в том, что, к примеру, выражение [1i32, 2, 3] возвращает тип [i32; 3] — массив с заданной при компляции длиной. Когда же &[f64] является срезом — ссылочным типом, состоящим из указателя на массив и длины (известной во время выполнения).
Вот так будет работать:
fn foo(a:&[&[f64]],x:&[f64]) { for i in 0..3 { for j in 0..4 { println!("{}",a[i][j]); } } }
fn main() { let a:[&[f64];3]=[&[1.1,-0.2, 0.1,1.6], &[0.1,-1.2,-0.2,2.3], &[0.2,-0.1, 1.1,1.5]]; let x:[f64;3]=[0.0;3];
foo(&a,&x); }
К сожалению их "книга" пока не богата на примеры передачи параметров в функцию.
Кроме собственно официальной документации по Rust существует очень хорошее руководство с множеством прекрасных примеров Rust by Example

Класс устанавливающий курсор ожидания и автоматически сбрасывающий его

Создал вот такой класс:
class CursorEx: IDisposable { public CursorEx() { Cursor.Current = Cursors.WaitCursor; } public void Dispose() { Cursor.Current = Cursors.Default; } }
Использую вот так:
public void Method() { new CursorEx(); //Здаесь что-то выполняется }
Подразумевается, что после выполнения метода, вызовется метод Dispose() и курсор установится на дефолтный. Могут ли быть какие-то варианты, когда произойдет сбой?


Ответ

Во-первых, вы забыли вызвать Dispose. Для этого следует использовать using
using (new CursorEx()) { // что-то выполняется }
На сборку мусора полагаться нельзя, она вызывается недетерминированно в любой момент после пропадания объекта из области видимости.
Во-вторых, вы не восстанавливаете исходный курсор. Если какая-то функция изменяет курсор, а затем вызывает функцию, которая тоже изменяет курсор, то курсор будет восстановлен уже после возврата из первой функции:
using (new CursorEx()) { using (new CursorEx()) { // что-то выполняется } // курсор уже восстановлен } // курсор должен был быть восстановлен здесь
Вам следует сохранять текущий курсор в конструкторе и восстанавливать его в Dispose
В-третьих, можно избавиться от лишнего объекта в памяти, если заменить класс на структуру.
Итого:
public struct CursorWaiter : IDisposable { private readonly Cursor _originalCursor;
public CursorWaiter (Cursor newCursor = null) { _originalCursor = Cursor.Current; Cursor.Current = newCursor ?? Cursors.WaitCursor; }
public void Dispose () { Cursor.Current = _originalCursor; } }
Из комментариев: этот код рассчитан на то, что программист будет использовать тип только с помощью using, не будет уничтожать объект по несколько раз, не будет копировать и т.п. Если есть сомнения в этом, то нужно добавить проверку на повторный вызов Dispose (с помощью отдельного флага или обнуления _originalCursor), а также заменить класс на структуру для избавления он возможности копирования или вовсе скрыть тип за методом с лямбдой.

Как запустить android приложение с определенными JVM флагами?

Вот такая ситуация: падает приложение с ошибкой outOfMemoryError. Хочу отловить это событие и хочу, чтобы когда это случилось, JVM создал HPROF файл. Как запустить приложение на устройстве с определенными JVM флагами? Обычно это делалось просто -XX:HeapDumpOnOutOfMemoryError. Или может есть какие-то встроенные удобные тулзы в Android Studio? Потому что я хочу запихнуть этот HPROF файл в MemoryAnalyzer. Но, может, этот метод уже устарел?


Ответ

HeapDumpOnOutOfMemoryError это флаг Oracle VM, в Dalvik и ART его нет.
В общем нужно или вручную создавать HPROF или если скажем проблема у заказчика - натыкать запись в лог состояние памяти по всему коду.
Ну и перехватывать OOMe тоже можно, только ловить не Exception a Error, в try-cach или глобально.
См. также видео с Google IO на эту тему - https://www.youtube.com/watch?v=_CruQY55HOk

Медленное сокрытие action bar

Использую toolbar и надо сделать медленное скрытие и так же раскрытие, при использовании actionBar.hide() она резко появляется и так же резко исчезает


Ответ

Нужно использовать анимацию.
Пример
toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();

Что должно попадать в коммит?

Я пользуюсь Eclipse и Egit для работы с Git. Каждый раз, когда я делаю коммит, мне предлагается выбрать из файлов которые нужно закоммитить. Часть файлов уже выбраны, а часть нет. Из выбранных файлов мне Eclipse обычно предлагает закоммитить все измененные java файлы а также некоторые class файлы и некоторые другие. Насколько я понимаю class файлы генерируются автоматически и по идее их коммитить не обязательно так же как и jar файлы. Но Eclipse мне регулярно предлагает их включать в коммит.
Подскажите как поступать в этом случае? Надо ли включать в коммит файлы с расширением class, jar и другие?


Ответ

Если для соответствующего class файла у вас есть java файл, то включать class файл нет никакого смысла. Другое дело, что иногда у Вас есть только class файл, тогда наверное его стоит включить. Аналогично и с jar файлами. Если этот jar - продукт компиляции Вашего кода - нет смысла его включать. Если это сторонняя библиотека - возможно есть, а может проще просто правильно настроить maven/gradle, что бы он сам все умел вытянуть.
Что бы git не предлагал включать ненужные файлы, их нужно добавить в список исключений - в файл .gitignore
В целом, в коммиты нужно включать то, что нужно для компиляции. Сторонний человек должен спулить репозиторий, открыть его в эклипсе и просто нажать "скомпилируй".

Как выбрать N значений по N ключам из одной и той же таблицы-справочника без нескольких LEFT JOIN?

Есть две таблицы:
1.Справочник ref:
+-----+-----------+ | id | text | |-----+-----------+ | 1 | однажды | | 2 | в | | 3 | студеную | | 4 | зимнюю | | 5 | пору | +-----+-----------+
2.Данные main:
+------+------+------+------+-----+ | fk1 | fk2 | fk3 | fk4 | fk5 | +------+------+------+------+-----+ | 1 | 2 | 3 | 4 | 5 | +------+------+------+------+-----+
Чтобы получить строчку текста из записи во второй таблице, где хранятся только коды слов можно сделать так
SELECT table1.text as word1, table2.text as word2, table3.text as word3, table4.text as word4, table5.text as word5 FROM main left join ref as table1 on (fk1=table1.id) left join ref as table2 on (fk2=table2.id) left join ref as table3 on (fk3=table3.id) left join ref as table4 on (fk4=table4.id) left join ref as table5 on (fk5=table5.id);
И получить ['однажды', 'в', 'студеную', 'зимнюю', 'пору']
Но это не кажется очень правильным в моих условиях, где есть таблица объявлений main с несколькими полями-ключами (marked_text_fk, main_text_fk), которые связаны с таблицей "текстовок" (text_id, text_fulltext), потому что количество записей - 1 млн в первой таблице и 0.5 млн во второй.
Пожалуйста, подскажите есть ли другие варианты запроса или разбивки данных на таблицы с такими исходными условиями?


Ответ

Пятикратный join - вполне нормальное решение данной задачи в такой формулировке. (Кстати, почему вы делаете left join? Данные в таблицах что, могут быть несогласованны?)
Тут, на самом деле, странной выглядит сама схема БД. Почему в таблице main хранится пять ссылок одного типа? Их точно никогда не придется хранить шесть штук или четыре? Стоило бы сделать промежуточную таблицу-связку между main и ref, с полями mainid, refid и order (1 и 3е поля входят в первичный ключ).

Отображение имени потока python в мониторе процессов

Необходимо в реалтайме отслеживать каждый поток python-процесса. В Python'е есть возможность задать имя потока:
Thread(name='Test')
И в htop есть возможность отображать пользовательские имена потоков (F2 -> Display options -> Show custom thread names). Но пользовательские имена потоков все равно не отображаются. Вместо них указано название интерпретатора.

Подскажите, где я неправ? Может быть есть другие средства мониторинга каждого потока процесса? Спасибо!


Ответ

В классе Thread аргумент name служит только для нужд самого python, например когда вы делаете print.
Для установки имени нужно вызвать prctl:
import time from threading import Thread
def set_name(name): from ctypes import cdll, byref, create_string_buffer libc = cdll.LoadLibrary('libc.so.6') buff = create_string_buffer(len(name)+1) buff.value = name libc.prctl(15, byref(buff), 0, 0, 0)
def test(): set_name(b'SomeThread') while True: time.sleep(1)
t = Thread(target=test, name='TestName') print(t) t.start()
В htop будет вот так (запускал из ipython, поэтому есть еще другие thread без имени):

Как сделать подобный эффект свечения у кнопки с помощью CSS?

Есть кнопка

По поводу скругления и градиента вопросов нет. Как с помощью CSS получить эффект белого свечения сверху?


Ответ

Примерно так: http://jsfiddle.net/IonDen/ctsn0wu2/
body { margin: 25px; } .button { position: relative; border: 0; padding: 25px 35px; border-radius: 50px; font-size: 20px; text-transform: uppercase; font-weight: bold; background: #ffbb00; /* Old browsers */ background: -moz-linear-gradient(top, #ffbb00 0%, #998700 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffbb00), color-stop(100%,#998700)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #ffbb00 0%,#998700 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #ffbb00 0%,#998700 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #ffbb00 0%,#998700 100%); /* IE10+ */ background: linear-gradient(to bottom, #ffbb00 0%,#998700 100%); } .button:after { position: absolute; display: block; content: ""; top: 0; left: 0; width: 100%; height: 100%; border-radius: 50px; background: -moz-radial-gradient(top, ellipse cover, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); /* FF3.6+ */ background: -webkit-gradient(radial, top center, 0px, center center, 100%, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */ background: -webkit-radial-gradient(top, ellipse cover, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%); /* Chrome10+,Safari5.1+ */ background: -o-radial-gradient(top, ellipse cover, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%); /* Opera 12+ */ background: -ms-radial-gradient(top, ellipse cover, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%); /* IE10+ */ background: radial-gradient(ellipse at top, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%); /* W3C */ }
Для создания градиента можно использовать например этот инструмент: http://www.colorzilla.com/gradient-editor/

Ошибка совместимости при переходе на Unity 5

При переходе на Unity 5 появились проблемы совместимости со старыми устройствами на Android. Например, на Asus Transformer появилась ошибка при запуске:
"Hardware is not supported by this application".
На форумах везде пишут, что прекратилась поддержка устройств без
NEON CPU (Dropped support for non-NEON CPU devices (e.g. Tegra 2)).
Есть ли возможность как-то настройками вернуть ее? Вообще Unity 5 стал странным, на 4 версии apk файл весил 14 мб, на 5-ой стал почти 18.


Ответ

К сожалению настроить никак нельзя. На форумах по Unity разработчики пишут, что поддержки не будет, а тем, кто хочет поддерживать совместимость со старыми устройствами необходимо использовать Unity 4.

Как сделать блок прозрачным для ссылок?

Есть блок-ссылка, поверх него другой блок. Как сделать чтобы при клике по верхнему срабатывала нижняя ссылка?
Вроде какое-то CSS свойство есть... Прошу НЕ ПИШИТЕ про opacity и z-index! Мне нужно чтобы внешне ничего не изменилось, а верхний блок сделался как-бы прозрачным для ссылки снизу.


Ответ

В современных браузерах есть свойство CSS pointer-events. Если задать ему значение none, то элемент становистя "прозрачным" для событий мыши. IE на данный момент это свойство не поддерживает, но вы можете воспользоваться хаком с filter
Для современных браузеров:
pointer-events: none; background: url('your_transparent.png');
Для IE11:
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='your_transparent.png', sizingMethod='scale'); background: none !important;
В старых браузерах, в том числе в IE10- это не работает. Если эта функциональность критична для использования сайта, то пока лучше её избегать.
См. Click through a DIV to underlying elements
Если нужна поддержка старых браузеров, то вам придётся вручную форвардить сообщения. Решения можно найти по ссылке выше.

preg_match как выделить слово, за которым нет другого слова?

Пример текста:
В городе Грайворон Белгородской области установили мировой рекорд – собрали самый многочисленный узорный хоровод. Более 2,5 тысячи человек 84 минуты танцевали, взявшись за руки. В городе Белгороде прошли испытания. Они "завернули" хоровод в семь совершенно разных замысловатых фигур, причем финальный узор вместе с артистами строили и зрители
Мне нужно выделить отдельно:
Название области Название города
область выделяю следующей регуляркой:
preg_match('/белгород.{1,5} област/ui',$text,$matches);
А вот как с помощью регулярок выделить только город без области? Другими словами выделить "белгород.{1,5}" после которого не идет "област"???


Ответ

Утверждения касательно последующего текста начинаются с (?= для положительных утверждений и с (?! для отрицающих утверждений. Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?Например, '/(?

Вызов метода вне класса

Функция вызывается в классе, ей передается указатель на метод.
timer (300, &Myclass::Func);
Передается, вроде, правильно. Но при вызове ничего не происходит. Понимаю, что без объекта вызов не имеет смысла, но как решить проблему?
void timer (float diff, void (Myclass::*ptrFunc) ()) // не является членом класса { static clock_t t1=clock (), t2; t2=clock ();
if ((float)t2-(float) t1>=diff) { ptrFunc; t1=clock (); } }
Метод который должен сработать (находится в Myclass)
void Func () { cout<<"Func
"; }


Ответ

Вы не вызываете функцию. ptrFunc; — это не вызов (в отличие от Паскаля). Это просто тривиальное арифметическое выражение, результат которого не используется, и поэтому игнорируется. Точно так же вы могли бы написать
14;

Существуют разные методы справиться с проблемой.
Вы должны каким-то образом передать экземпляр класса, у которого функция будет вызываться. Это старый способ, должен работать на практически всех компиляторах. Вы можете использовать std::function в принимающий функции. Чтобы построить std::function из функции-члена, можно использовать std::bind, чтобы «подшить» экземпляр класса к функции. Или применить обычную лямбду.
Пример:
#include #include
class C { public: void func() { std::cout << "I'm C::func()" << std::endl; } };
typedef void (C::*ptrFunc)();
void call1(C* pC, ptrFunc f) { (pC->*f)(); }
void call2(std::function f) { f(); }
int main() { C c; call1(&c, &C::func); call2(std::bind(&C::func, &c)); call2([&c]() { c.func(); }); return 0; }
(проверка)
Обратите внимание, что на момент вызова переданной функции исходный объект (на котором функция будет вызываться) обязан существовать, и забота об этом лежит исключительно на программисте (то есть, на вас).

Лямбды в Android

Изучил лямбды. Использую их в Android приложении:
swipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_refresh_layout); swipeRefreshLayout.setOnRefreshListener(() -> { if (isOnline()) { //mArticleAdapter.clear(); SimpleRss2Parser parser = new SimpleRss2Parser(postFactum, getCallback()); parser.parseAsync(); if (mRecyclerView == null) { new ShowArticles().execute(); }
swipeRefreshLayout.setRefreshing(false); } Toast.LENGTH_SHORT).show(); swipeRefreshLayout.setRefreshing(false); } });
Получаю ошибку "lambda expressions are not supported at this language level". Android Studio сама предлагает решить проблему. Исправляю, вроде ошибок нету, но на Runtime получаю туже ошибку. Возможно ли использовать лямбды в Android?


Ответ

Да, возможно. Вам нужна поддержка лямбд для Android. Есть библиотека на GitHub. Подключаете ее в проект и работаете.

Как десериализовать JSON и вывести в ListBox url картинок

Доброго всем дня! Я новичок и прошу вашей помощи господа специалисты и не очень.
Перегоняю я коллекцию в JSON
ReadOnlyCollection wall = api.Wall.Get(-group.Id.Value, out totalCount, count); string json = JsonConvert.SerializeObject(wall, Formatting.Indented);
Затем смотрю,что я получаю в строку json, получается вот это -
[ { "Id": 144159, "OwnerId": -30022666, "FromId": -30022666, "Date": "2015-06-11T21:01:45+03:00", "Text": "Если вы не можете отказать себе в чем-либо, например, в мороженом, то мороженое управляет вами. Если вы ограничиваете себя в мороженом – то оно имеет над вами двойной контроль. Поскольку теперь к дискомфорту по поводу его отсутствия примешивается ненависть к себе и чувство вины в случае, если вы не смогли удержаться. Если же вы полностью отрицаете мороженое – то оно властвует над вами, ведь ему удалось отрезать кусочек вашей реальности.

Так же с остальными желаниями: алкоголь, секс, сигареты, деньги, адреналин. Бросить курить сложно не вследствие химической зависимости, а потому что бросающий зависит от сигарет куда больше курящего. Борющийся за демократию оппозиционер никогда не станет свободным гражданином – он раб борьбы. Монах-аскет никогда не победит \"страсть плоти\" – он останется рабом отрицания. Принятие и отторжение – всего лишь метаморфозы зависимости.

Мудрость заключается не в самоограничении, не в тотальной аскезе, а в балансе. Вы становитесь свободными от своих желаний тогда, когда сохраняете внутренний комфорт, вне зависимости о того, получаете ли вы желаемое или нет. Прелесть такой свободы в том, что вы – неуязвимы. Вы счастливы или ... счастливы.", "ReplyOwnerId": null, "ReplyPostId": null, "FriendsOnly": false, "Comments": { "Count": 0, "CanPost": false }, "Likes": { "Count": 10792, "UserLikes": false, "CanLike": true, "CanPublish": true }, "Reposts": { "Count": 2312, "UserReposted": false }, "PostType": "post", "PostSource": { "Type": "api", "Data": null }, "Attachments": [ { "Instance": { "Latitude": null, "Longitude": null, "AlbumId": -7, "Photo75": "http://cs629506.vk.me/v629506780/3a56/Sn3eI5qEtc0.jpg", "Photo130": "http://cs629506.vk.me/v629506780/3a57/tKRNTJlSH1s.jpg", "Photo604": "http://cs629506.vk.me/v629506780/3a58/wyz6H7Py_8U.jpg", "Photo807": null, "Photo1280": null, "Photo2560": null, "Width": 468, "Height": 366, "Text": "", "CreateTime": "2015-06-11T21:01:46+03:00", "AccessKey": "f91344779bdfeddf86", "UserId": 100, "PostId": 144159, "PlacerId": null, "TagCreated": null, "TagId": null, "Likes": null, "CanComment": null, "Comments": null, "Tags": null, "PhotoSrc": null, "PhotoHash": null, "Id": 368776971, "OwnerId": -30022666 }, "Type": "VkNet.Model.Attachments.Photo, VkNet, Version=1.0.16.0, Culture=neutral, PublicKeyToken=null" } ], "Attachment": { "Instance": { "Latitude": null, "Longitude": null, "AlbumId": -7, "Photo75": "http://cs629506.vk.me/v629506780/3a56/Sn3eI5qEtc0.jpg", "Photo130": "http://cs629506.vk.me/v629506780/3a57/tKRNTJlSH1s.jpg", "Photo604": "http://cs629506.vk.me/v629506780/3a58/wyz6H7Py_8U.jpg", "Photo807": null, "Photo1280": null, "Photo2560": null, "Width": 468, "Height": 366, "Text": "", "CreateTime": "2015-06-11T21:01:46+03:00", "AccessKey": "f91344779bdfeddf86", "UserId": 100, "PostId": 144159, "PlacerId": null, "TagCreated": null, "TagId": null, "Likes": null, "CanComment": null, "Comments": null, "Tags": null, "PhotoSrc": null, "PhotoHash": null, "Id": 368776971, "OwnerId": -30022666 }, "Type": "VkNet.Model.Attachments.Photo, VkNet, Version=1.0.16.0, Culture=neutral, PublicKeyToken=null" }, "Geo": null, "SignerId": null, "CopyPostDate": null, "CopyPostType": null, "CopyOwnerId": null, "CopyPostId": null, "CopyText": null, "CopyHistory": [], "CopyCommenterId": null, "CopyCommentId": null, "CanDelete": false, "CanEdit": false } ]
Вопрос как мне достать Url "Photo604": "http://cs629506.vk.me/v629506780/3a58/wyz6H7Py_8U.jpg", И отобразить в listbox? Спасибо!


Ответ

Для того, чтобы распарсить JSON, можете воспользоваться либо Json.NET, либо System.Web.Helpers.Json (нужна четвёртая версия .NET)
На примере Json.NET, код для получения url из Photo604 будет таким:
dynamic records = JArray.Parse(json); string url = records[0].Attachments[0].Instance.Photo604;
А получить все url для полей, названия которых начинаются на "Photo", можно, например, так:
dynamic records = JArray.Parse(json); dynamic instance = records[0].Attachments[0].Instance;
foreach (var field in instance) { if (field.Name.StartsWith("Photo") && field.Value != null) { listBox.Items.Add(field.Value.ToString()); } }
Способов, на самом деле много и это только один из них. В документации есть примеры с dynamic, LINQ, SelectToken и др.

Как отцентрировать и масштабировать изображение?

Есть изображение, которое нужно поместить в область, которая будет занимать по ширине 100% ширины родителя и по высоте - 30% ШИРИНЫ родителя. При этом центрироваться и не деформироваться. При увеличении - уменьшении родителя - масштабироваться, но не искажаться. Вот как-то так:


Ответ

Картинка указана как фон блока (

) с помощью background-image: url(URL) Высота в 30% от ширины блока задаётся с помощью padding-bottom: 30% Для растягивания картинки по блоку используется background-size: cover Для указания какую часть картинки отображать используется background-position: 0 35%
HTML:

CSS:
.main { width: 100%; height: 100%; } .img-wrapper { width: 100%; padding-bottom: 30%; background-size: cover; background-position: 0 35%; background-image: url('https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTok9GAMciVqTTlxgSojXP8yPNAt1a0iyKexU7YCDEYFr1UgrGo'); }
Пример в fiddle

Удаление знаков переноса с возвратом строки

при выгрузке случился баг и после data3 добавился знак переноса строки
и все сьехало на две строки. data3 обрамлен " (двойные ковычки) файл очень большой 1 мил строк и в ручную не вариант переделывать подскажите как через sed убрать перенос строки для того чтобы сьехавший хвост вытянулся в одну строку сейчас файл имеет такой вид
data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 data1,data2,"data3 ",data4
а должен быть таким
data1,data2,"data3",data4 data1,data2,"data3",data4 data1,data2,"data3",data4
заранее спасибо


Ответ

Попробуйте
sed 'N;s/
"/"/'
У меня вроде работает:
[VladD@Kenga] [00:59:25] [~] {0,504}$> cat xx.txt data1,data2,"data3 ",data4 data1,data2,"data3 ",data4 data1,data2,"data3 ",data4
[VladD@Kenga] [00:59:32] [~] {0,505}$> sed 'N;s/
"/"/' xx.txt data1,data2,"data3",data4 data1,data2,"data3",data4 data1,data2,"data3",data4
Для более сложных случаев (возможны «обыкновенные» строки) попробуйте так:
sed '/^",/{H;x;s/
//;x;d}; x' | sed '1d'
Проверка:
[VladD@Kenga] [01:35:47] [~] {0,539}$> cat xx.txt header "data1",data2,"data3 ",data4 intermediate data data1,"data2 ","data3 ",data4 data1,data2,"data3 ",data4
[VladD@Kenga] [01:35:52] [~] {0,540}$> sed '/^",/{H;x;s/
//;x;d}; x' xx.txt
header "data1",data2,"data3",data4 intermediate data data1,"data2","data3",data4 data1,data2,"data3",data4
[VladD@Kenga] [01:35:57] [~] {0,541}$> sed '/^",/{H;x;s/
//;x;d}; x' xx.txt | sed '1d' header "data1",data2,"data3",data4 intermediate data data1,"data2","data3",data4 data1,data2,"data3",data4
Внимение: последняя строка должна заканчиваться переводом строки, иначе она будет «проглочена»!

Объяснение: нам необходимо, когда мы видим строку, начинающуюся с кавычки, знать предыдущую строку, чтобы склеить их. Для этого мы «задерживаем» вывод строк, отправляя их в hold space вместо вывода, и выводя вместо этого предыдущую строку, лежащую там же (x).
Для случая, когда строка начинается с кавычки (/^"/) начинаем действовать. В hold space лежит предыдущая строка, пристыковываем к ней текущую (H), и обмениваем hold space с pattern space (x), чтобы можно было обработать текст. Удаляем
(s/
//), и отправляем назад строку в hold space, чтобы проанализировать и вывести её на следующем цикле. Обрубок строки, который получился в pattern space, удаляем, и завершаем эту итерацию (d).

Qt 5 platform plugin “windows”

После сборки релиза проекта, перенес exe-файл в отдельный каталог. Перекинул все dll, которые он просил для запуска. В итоге при запуске выдает ошибку:
This application falid to start because it could not find or load the Qt platform plugin "windows".
Как избавиться от этого? Как правильно компилить?


Ответ

Вам надо создать папку platforms в папке с программой и скопировать туда qwindows.dll
В начало main добавить
QStringList paths = QCoreApplication::libraryPaths(); paths.append("."); paths.append("imageformats"); paths.append("platforms"); paths.append("sqldrivers"); QCoreApplication::setLibraryPaths(paths);
Вот здесь всё подробно описано http://habrahabr.ru/post/188816/

Стоит ли использовать нестатические методы для последующего создания объектов?

Есть необходимость сделать несколько классов для работы с массивами и числами, операции в основном наподобие "найти факториал" и "найти значение числа последовательности Фибоначчи".
Стоит ли для подобных задач создавать не статические методы, чтобы для вызова метода надо было создавать объект? В методах в основном используются математические операции для физических расчетов. Каждый метод возвращает определенное целочисленное значение как результат работы, которое применяется во вновь созданных классах.


Ответ

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

Как распарсить нетривиальный XML на питоне?

${host} ${port} 220 220 localhost SMTP Server (JAMES SMTP Server 2.3.2)(MSK) name 250 250 localhost Hello name (localhost [127.0.0.1]) Test "g_helo_with_C_OrJoin273_" in keyword-driven format. ${host} ${port} 220 220 localhost SMTP Server (JAMES SMTP Server 2.3.2) 14:50:18 +0400 (MSK) name 255 250 localhost Hello name (localhost [127.0.0.1]) Test "g_helo_with_C_OrJoin273_helo_resp_2_2_trace0001_L" in keyword-driven format.
Как распарсить так, чтоб в выводе было: suite source и соответствующие ему kw name, arguments, status? Проблема в том, что я не знаю как выводить список suite source, а в нем еще список kw name, arguments, status


Ответ

Вам поможет minidom
from xml.dom import minidom
om = minidom.parseString(x) root = om.getElementsByTagName('robot')[0]
# Далее что-то, к примеру:
def walk(x, d=0): print(' ' * d + str(x)) if x.attributes is not None: for i, j in x.attributes.items(): print(' ' * d + ' | ' + i + ': ' + j) for i in x.childNodes: walk(i, d+1)
walk(root)

Отправка https-запроса и получение данных

Делаю java-приложение, которое работает с WarGaming Public API.
Как послать https-запрос, а потом вывести ответ сервера в консоль?


Ответ

// HTTP GET request private void sendGet() throws Exception {
String url = "http://www.google.com/search?q=mkyong";
URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET con.setRequestMethod("GET");
//add request header con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode(); System.out.println("
Sending 'GET' request to URL : " + url); System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close();
//print result System.out.println(response.toString());
}
Источник тут

Откат промежуточного коммита

Есть 5 коммитов. Изменения в 3 коммите были ошибочными. Как откатить изменения так, чтобы сохранился прогресс 1, 2, 4, 5 коммитов?


Ответ

Вам нужно откатить изменения сделанные в 3-ем коммите: git revert commit3-SHA

sqlalchemy отношения


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


Ответ

А есть ли смысл разделять категории и подкатегории? Сделайте одну таблицу категорий, у которых есть ссылка на родительскую категорию (на себя же). Это позволит произвольную вложенность подкатегорий и уберет лишнюю сущность. Получится что-то вроде такого:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship
Base = declarative_base()
class Company(Base): __tablename__ = 'company'
id = Column(Integer, primary_key=True) name = Column(String)
def __repr__(self): return 'class Category(Base): __tablename__ = 'category'
id = Column(Integer, primary_key=True) name = Column(String) parent_id = Column(Integer, ForeignKey('category.id'))
parent = relationship('Category', remote_side=id, backref='subcategories')
def __repr__(self): return 'class Relationship(Base): __tablename__ = 'relationships'
company_id = Column(Integer, ForeignKey('company.id'), primary_key=True) category_id = Column(Integer, ForeignKey('category.id'), primary_key=True)
company = relationship('Company', backref='categories') category = relationship('Category', backref='companies')
def __repr__(self): return 'Вот пример использования:
>>> c1 = Company(name='Google') >>> c2 = Company(name='Yahoo') >>> cat1 = Category(name='IT') >>> cat2 = Category(name='Search engine', parent=cat1) >>> cat1.subcategories [>> cat2.parent >>> c1.categories.extend([Relationship(category=cat1), Relationship(category=cat2)]) >>> c1.categories [>> c1.categories[1].category.name 'Search engine' >>> c2.categories []

Как в golang подключить другой файл?

Как в golang подключить другой файл?
Я начал только экспериментировать с ним и пока пишу в одном файле.
Хотелось бы часть кода перенести в другой и подключить его к main.go


Ответ

Import declarations — объявления импорта
выдержка из документации
An import declaration states that the source file containing the declaration depends on functionality of the imported package (§Program initialization and execution) and enables access to exported identifiers of that package. The import names an identifier (PackageName) to be used for access and an ImportPath that specifies the package to be imported.
мой вольный перевод:
объявление импорта (import) гласит, что файл, содержащий это объявление, зависит от функциональности импортируемого пакета (см. §Program initialization and execution), и позволяет получить доступ к экспортируемым пакетом идентификаторам. объявление назначает идентификатор (PackageName) для доступа, а также ImportPath, который точно определяет местоположение импортируемого пакета.
примеры:
Import declaration Local name of Sin
import "lib/math" math.Sin import m "lib/math" m.Sin import . "lib/math" Sin
import _ "lib/math"

“cannot refer to unexported name” при вызове функции из пакета

Есть главный файл:
package main
import ( "net/http" "./extensions" )
func main() {
router := mux.NewRouter() s := http.StripPrefix("/static/", http.FileServer(http.Dir("./files/"))) router.HandleFunc("/", handlers.Index) router.PathPrefix("/static/").Handler(s) http.Handle("/", router)
handlers.sayYess() http.ListenAndServe(":5000", nil) }
И файл handlers.go
package handlers
import ( "log" )
func sayYess() { log.Println("yess") } func Index(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello") }
Функция sayYess() не вызывается - пишет:
cannot refer to unexported name handlers.makeCache
и
undefined: handlers.makeCache
Почему другие функции пакета работают, а эта - нет?


Ответ

Разобрался. Как ни странно, первая буква должна быть большой:
func SayYess() { log.Println("yess") }

Ошибка при использовании IoC-контейнера Unity

Пробую работать с IoC-контейнером Unity, установил через nuget, и получаю такую ошибку
В references
В чём проблема?


Ответ

Проблема в том, что Ваш проект использует .net framework версии ниже 4.5, например, 4.0.
Вы можете поменять версию .net framework, используемую в проекте, в настройке проекта на вкладке Application, в разделе Target framework.
Или же, Вы можете взять более старую версию Unity, например, 2 версию. Выбрать более старую версию можно так же через NuGet.

Приостановка потока на неограниченное время

Как наиболее оптимально из главного потока приостановить дочерний поток (Thread и Runnable) на неограниченное время, а затем его возобновить?


Ответ

Не пользуйтесь методами Thread.suspend() и Thread.resume(). Это лучше осуществить с помощью wait()/notify()

Отказано в доступе при использовании Directory.GetFiles

Я хочу получить список файлов, которые находятся во вложенных директориях и использую:
Directory.GetFiles(string,string,SearchOption)
Но через какое-то время я получаю ошибку: "Отказано в доступе".
Я посмотрел в дебагере и обнаружил, что Directory.GetFiles натыкается на какие-то скрытые системные папки, которые мне в принципе не нужны.
Можно ли как-нибудь задать игнорирование подобных папок?
Если я оберну все в try/catch, то боюсь, что я не получу нужны мне список.


Ответ

Взял отсюда
private List GetFiles(string path, string pattern) { var files = new List();
try { files.AddRange(Directory.GetFiles(path, pattern, SearchOption.TopDirectoryOnly)); foreach (var directory in Directory.GetDirectories(path)) files.AddRange(GetFiles(directory, pattern)); } catch (UnauthorizedAccessException) { }
return files; }
Функция рекурсивная. При составлении списка файлов будут учитываться обыкновенные папки, а системные не учитываться. Не должно быть такого, что из-за Eхception в конечный результат не войдут обыкновенные файлы.

Console.WriteLine("Started: " + DateTime.Now.ToLongTimeString());
var fileList = GetFiles("c:\\", "*.*");
Console.WriteLine("Finished: " + DateTime.Now.ToLongTimeString()); Console.WriteLine("Files count: " + fileList.Count);
// У меня так: // Started: 12:43:05 // Finished: 12:44:33 // Files count: 427083

Не понятен паттерн конструктора

В примерах по AngularJS, которые используют сервисы всегда демонстрируют такой паттерн:
module.factory('myFactory', function($log) { var myFactory = { this.getLog = function () { console.log('Bla bla bla') } }; return myFactory; });
Не могу понять почему не сделать вот так:
module.factory('myFactory', function($log) { return { this.getLog = function () { console.log('Bla bla bla') } }; });
Зачем нужен этот бесполезный var myFactory?


Ответ

Это скорее всего дело стилистики: возвращать что-либо как есть либо через промежуточную переменную. Использование промежуточной переменной потенциально делает код гибче на случай добавления функционала и дружелюбным к отладке, когда точку остановки можно будет поставить сразу после переменной. На мой взгляд переменными оперировать удобнее, чем анонимными объектами или результатами вызовов. В данном случае, если например фабрику нужно будет расширить миксинами или пронаследовать от другого объекта, то удобнее это будет сделать с использованием переменной. Хочу поделиться еще одним вариантом, который описывается в Angular Style Guide
module.factory('myFactory', function($log) {
var myFactory = { foo: foo, bar: bar };
return myFactory; ////////
function foo() { console.log('foo'); }
function bar() { console.log('bar'); } }
Плюс в том, что размещение публичного интерфейса сверху делает код фабрики читаемее и позволяет сразу увидеть все, с чем она позволяет работать + сразу видно то, что нужно покрывать тестами. Это особенно полезно тогда, когда код фабрики разрастается и приходится скроллить, чтобы понять, что вообще в ней есть. Применим этот подход не только к фабрике, но и контроллерам, директивам и т.д.

Почему у функции scanf_s в Visual Studio при использовании “%s” прекращается работа в языке Си

Почему у функции scanf_s в Visual Studio 2013 при использовании "%s" прекращается работа в языке Си .
char name[40]; scanf_s("%s", name);
Тут, когда в консоли ввёл данные, нажимаю энтер, и вижу сообщение "Прекращение работы".


Ответ

Потому что scanf_s требует указания размера всех передаваемых ей буферов.
scanf_s("%s", name, 40);

В каком стандарте появилась функция to_string?

у меня старенький компилятор (C++98). функция to_string() присутствует в библиотеке но во время компиляции выдает ошибку.


Ответ

Фкнкция std::to_string была включена в стандарт C++ 2011. В связи с этим, например, в MS VS 2010 она перегружена не для всех целочисленных типов, для которых она должна быть перегружена в соответствии со стандартом, потому что компилятор MS VC++ 2010 вышел до окончательного принятия стандарта. Об этом недостатке MS VC++ 2010 можете почитать в моем сообщении по этой ссылке

Pascal на Ubuntu

Как компилировать Pascal и в чем лучше писать на Ubuntu? Желательно что-нибудь минималистичное


Ответ

например, так:
устанавливаем компилятор freepascal
$ sudo apt-get install fp-compiler создаём файл hw.pas следующего содержимого:
program hello; begin writeln ('hello, world.') end. компилируем:
$ fpc hw.pas ... запускаем получившийся бинарник hw
$ ./hw hello, world.

Как составить предложение из букв, введенных пользователем?

На вход программе подаётся набор английских букв. Имеется словарь из слов.
Как сгенерировать такие предложения из слов, чтобы каждое из предложений состояло только из тех букв, что были поданы на вход, учитывая количество повторений.
Пример
Входящий набор символов: hellomyfriend
Вывод программы:
Feed Hilly Morn Feed Hilly Norm Feed Horny Mill Freehold Nil My Refilled Hon My Defiler Hymn Lo и т.д.

Выбрать слова которые удовлетворяют входному набору символов у меня получилось. А вот быстро составлять из них предложения не получается.
Я делал методом перебора всех слов. Для фразы myfavoritegame скрипт отрабатывал около 5 минут. На сайте предложения отдаются мгновенно.
Можете что-нибудь посоветовать?


Ответ

Предположим, вам нужно просто найти все возможные комбинации слов из данного словаря, удовлетворяющие условию. Не отвлекаясь на особенности именно языка.
Важно для поиска:
наличие букв в слове. Исключаем содержащие буквы вне заданных. Исключаем, по мере составления фразы, уже использованные. считаем буквы. В любой момент составления фразы известно, слова какой длины подходят, или точно не подходят. повторы букв.
Не важно
порядок букв в словарном слове. смысл слова.
Для скорости нужно сделать поиск по важным признакам максимально быстрым, при необходимости убрав неважные аспекты.
Для быстрого нахождения слов с подходящим набором букв, но без учёта повторов, можно сделать битный индекс, как предложил @Mirdin: 26 букв английского алфавита = 26 бит. Пронумеровать слова в словаре (или просто индексом считать номер строки) и составить отдельный индекс в две колонки: id слова - битовая маска имеющихся букв. Для словаря меньше 65 тыс. слов, такой индекс будет "весить" 6 байт на слово, менее 400k. Можно держать в оперативной памяти для почти-мгновенного поиска. Так можно быстро найти например, первое слово фразы – просто, чтобы точно были выключены биты "лишних" букв.
Стоит сделать копию словаря, где буквы слова отсортированы по алфавиту, и слова отсортированы по алфавиту. Т.е. опять отдельный индекс: сортированные_буквы - id_слова. Этот индекс будет тяжелее самого словаря на (число слов * 2 или 3 байта). В этом индексе можно быстро находить подходящие слова и отбрасывать точно-неподходящие.
Алгоритм примерно такой. Ищем первое слово. Хочется найти первое же слово наибольшей возможной длины. Перебор по длине, от большего к меньшему. Ест допустимый набор букв и длина. Нашли первое слово, обновили допустимый набор букв и длины слов – ищем следующее слово.

Отображение файлов в папке

Вывожу в окне содержание папки
dirs = Directory.GetFiles(mw.paths[1]);
foreach (string dir in dirs) { //код }
Список файлов выводится, но он автоматически сортируется по алфавиту, и если изменить имя файла или удалить его, то в окне ничего не поменяется, пока я не закрою окно и не открою снова Подскажите, как лучше сделать отображение файлов в папке?


Ответ

Мне не пришлось использовать FileSystemWatcher Я создал новый класс, который отвечал за удаление и изменение имени файла, и в момент изменения файла вызывал метод класса

Не передается глобальная переменная в функцию класса с функцией

Столкнулся с проблемой выполнения функции в функции и все это классе библиотеки (использую готовую библиотеку для работы потоков PHPThreads).Я передаю ей в качестве аргумента глобальный массив с данными.Необходимо чтобы функция выполнялась в функции класса корректно.
Сам код:
$mas = array( 'id1', 'id2', 'id3', 'id4', );
function Eacher($m){ foreach ($m as $value) { echo $value; }
}
$Thread->Create(function() { Eacher($mas); });
$Thread->Run(); ?>


Ответ

В вашем коде есть две проблемы:
Вы не инициализировали сессию. Похоже, что этот момент является критическим для работы используемой вами библиотеки. Как уже сказал @Visman, вы неправильно передаете массив в новый тред. Вообще, в PHP для передачи значения в анонимные функции, нужно использовать замыкания. Однако, в вашем случае этот подход не годится, ведь выполнение задачи будет проходить в другом процессе. По этой же причине, вариант с глобальными переменными тоже вряд ли сработает. К счастью, используемая вами библиотека предоставляет специальные средства для передачи аргументов функции. Пример есть в readme
Таким образом, ваш код должен иметь вид:
session_start(); include 'lib/Threads.php';
$mas = array( 'id1', 'id2', 'id3', 'id4', );
function Eacher($m){ foreach ($m as $value) { echo $value; }
}
$Thread->Create(function($vars) { extract($vars); Eacher($mas); }, array( 'mas' => $mas, ));
$Thread->Run();

Применение внедрения зависимостей. Правильно ли?

Взялся я за реализацию IoC для сервиса данных. Сделал вот так:
interface IDataService {
}
и его реализация (возьмем для примера RpcJson):
class JsonRpcDataService : IDataService {
}
Далее регистрируем их в IoC-контейнере. Тут все пока понятно.
Далее переходим к собственно к реализации. Я определил следующую структуру сервиса данных:
Модели - тут все понятно Коллекторы - это вспомогательные классы для получения данных Обработчики - вспомогательные классы для обработки данных (сохранения, например)
Опишем интерфейс модели:
interface IBook { string Autor { get; set; } ... }
Коллектор:
interface IBooksCollector { IEnumerable GetItems(); ... }
И обработчик:
interface IBooksHandler { void Save(IBook book); ... }
Ну и, соответственно, для реализуем каждый из них для JsonRpc. Далее дополняем интерфейс IDataService
interface IDataService { IBook CreateBook();
IBooksCollector CreateBooksCollector();
IBooksHandler CreateBooksHandler(); }
И реализуем эти методы в JsonRpcDataService. Их я сделал для того, чтобы я на уровне ViewModel должен был бы связывать только IDataService с RpcJsonDataService, а не все интерфейсы с их реализациями. Чтобы в итоге я мог делать как-то так:
var dataService = IoC.Resolve(); // Создаем модель IBook book = dataService.CreateBook();
Вместо
IBook book = IoC.Resolve();
и где-то до этого связывание
IBook book = IoC.Register();
где Book - реализация IBook для RpcJson. Так как моделей может быть очень много, то вместо кучи строк вида:
IoC.Register();
Все сводится к одной:
IoC.Register();
По ходу у меня появились вопросы, на которые я и прошу Вас ответить:
Правилен ли такой подход с созданием инстансов? Или может сделать фабрики вида CreateModel(), в которую в качестве параметра T будет передаваться интерфейс, а фабрика уже будет решать что "отдать"? Стоит ли вообще делать интерфейсы для моделей, или лучше описать их сразу? Выделил я их для того, чтобы не загромождать из атрибутами вида [JsonProperty(...)], необходимые для сериализации, ведь эти атрибуты нужны только для сервера RpcJson


Ответ

В первую очередь - неверно ваше желание обойтись минимальным количеством регистраций компонентов. Если у вас 40 компонентов нет ничего зазорного в том чтобы регистрировать все 40 компонентов в контейнере. Это не будет ошибкой. Более того, хотя многие контейнеры и поддерживают в том или ином виде автоматическую регистрацию компонентов, Castle Windsor например, насколько мне известно, обязывает вас явно регистрировать каждый компонент, и такой подход с явной регистрацией имеет определенный смысл. Но здесь вы вправе выбрать то что вам ближе - автоматическая регистрация или явная регистрация каждого компонента, оба подхода имеют свои преимущества и недостатки.
Второе - вы ошибочно ассоциируете регистрацию компонента и последующее получение его из контейнера. Если вы написали IoC.Register(); это не означает что потом для получения IComponent вы обязаны получать его из контейнера. Как правило, вы регистрируете n - компонентов, но из IoC контейнера - запрашиваете только один. Например, если у вас ASP-MVC приложение, в нем может быть много компонентов (контроллеры, сервисы и т.д.), но запрос компонента из IoC контейнера у вас будет всего один - это будет запрос контроллера в фабрике контроллеров. Чтобы понять зачем регистрировать 10 компонентов, если запрашиваться будет только 1 читайте про основные паттерны внедрения зависимостей - внедрение конструктора и внедрение свойства
Ответы на ваши вопросы:
Использование фабрик для создания моделей - нормальный подход. Создавать фабричный метод вида CreateModel() где T интерфейс модели, не имеет смысла. Подумайте, чем этот метод будет принципиально отличаться от аналогичного метода IoC-контейнера? Скорее всего не стоит делать интерфейсы для моделей. Использование IoC контейнера вовсе не обязывает вас делать интерфейсы для каждого класса в вашем приложении. Для моделей интерфейсы чаще всего не нужны.
По формулировке вашего вопроса видно что вы довольно плохо ориентируетесь в теме и двигаетесь в неверном направлении. Вам стоит потратить немного времени на ее изучение, прежде чем проектировать приложение. В частности паттерны внедрения зависимостей, упомянутые выше (внедрение конструктора и внедрение свойства), существенно важнее для понимания DI, чем любые вопросы, связанные с регистрацией компонентов в IoC-контейнере. Вообще внедрение зависимостей это как раз про эти паттерны, а IoC-контейнер это просто инструмент, облегчающий построение приложения с использованием DI, и DI можно применять вообще без IoC-контейнера.
В комменатриях @cybrex посоветовал прочитать книгу Симан М. - Внедрение зависимостей в .NET. Я присоденияюсь к этому совету, почитайте - не пожалеете.