Страницы

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

понедельник, 4 февраля 2019 г.

Как написать ножницы на C#?

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


Ответ

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

Как именно реализованы процессы в Erlang?

Вопрос несет сугубо академический характер. Собственно: Erlang is designed for massive concurrency. Erlang processes are light-weight (grow and shrink dynamically) with small memory footprint, fast to create and terminate and the scheduling overhead is low. Какие условия должны соблюдаться для того, что-бы было возможно реализовать подобную модель, какое API используется? В общем - как реализовать такого рода поведение средствами C/C++ или других языков? В первую очередь интересует не код, а теория. PS: Когда-то гуглил на эту тему, но, к моему большому удивлению, толкового ответа не нашел. Более того - многие писали о том, что реализовать подобную модель средствами С/C++ невозможно, во что мне верится с трудом.


Ответ

Будем считать, что речь идет о BEAM, потому что, вообще говоря, у Erlang была богатая история Начиная с R13 (см. презентацию Ульфа Вигера, стр. 19), при условии, что BEAM собрано с поддержкой SMP, создается несколько шедулеров (число определяется опцией +S, как они соотносятся с логическими процессорами определяется флагом +sbt), у каждого есть своя очередь процессов. Процесс — всего лишь структура данных, включающая в себя собственную независимую кучу, стек (даже два, в случае с HiPE, см. стр.4) и все положенные процессу регалии (мейлбокс, словарь процесса, тысячи всякого). Собственно, структуру struct process можно посмотреть в исходниках BEAM, в файле erl_process.h И, к вопросу многозадачности — шедулер реализует вытесняющую многозадачность, раз в определенное число редукций (по сути, операций) переключаясь на другой процесс. Какой-нибудь драйвер, как честно предупреждает документация — «this means that all operations in the driver must be non-blocking, and that any crash in the driver will bring the whole emulator down» — может завесить поток или вообще уронить всю VM. Вот, собственно, и все, вроде бы, если не лезть во всякие тонкости и детали (которых я и сам не шибко в курсе, т.к. потроха BEAM, можно сказать, никогда толком и не трогал).

Удаление объекта, освобождение памяти в нужное для меня время

Подскажите, как работать с мусоросборщиком? Никогда не было необходимости самостоятельно контролировать, когда объект физически будет удален, но тут возникла проблема.
Проблема вытекла из другой: ошибка (cannot start thread)
Суть проблемы в том, что в цикле открываются и закрываются подключения к базе данных (к разным базам, перебираются порядка нескольких тысяч баз). Как оказалось, хоть и объект создается в блоке using() {} даже при выходе из этого блока подключение к базе остается висеть (на уровне сервера firebird). Все подключения мгновенно разорвутся, как только приложение будет закрыто. Остается у меня один вариант, что объект хоть и закрыл соединение и вызвался автоматически метод object.Dispose() по выходу из блока using, объект все еще висит в памяти, и тем самым не дает серверу разорвать соединение с базой. На форуме поддержки .net провайдера firebird мне сказали, что нужно научиться физически прибивать объекты, а не надеяться на мусоросборщики. Вот сижу теперь и гадаю, как этой подсказкой воспользоваться. По мануалу не разобрался как пользоваться GC.*. Точнее разные варианты попробовал, но проблема не решилась. Может просто не умею готовить?..
Кто сталкивался с необходимостью физического прибития объектов, подскажите, как мне избавиться от него в нужное мне время, а не когда мусоросборщик сам посчитает это необходимым.
Заранее спасибо.
UPD
Вот что вижу на сервере
Server Version Info --------------------------------------------------------------------------- Server Version: WI-V2.5.1.26351 Firebird 2.5 Server Implementation: Firebird/x86/Windows NT Service Version: 2
Configuration Info --------------------------------------------------------------------------- Base File: D:\Program Files\Firebird_2_5\ Lock File: C:\ProgramData\firebird\ Message File: D:\Program Files\Firebird_2_5\ Security Database: D:\Program Files\Firebird_2_5\security2.fdb

Database Info --------------------------------------------------------------------------- Number of connections: 140 Number of databases: 140
Вот тестовая програмулина, которой проверял по вашим советам:
FbConnectionStringBuilder builder = new FbConnectionStringBuilder(); builder.Dialect = 3; //builder.DataSource = "localhost"; builder.Password = "masterkey"; builder.UserID = "SYSDBA"; builder.Charset = "WIN1251";
for (int i = 0; i < fileList.Count; i++) { builder.Database = fileList[i]; using (FbConnection connection = new FbConnection(builder.ConnectionString)) { try { Console.WriteLine(string.Format("[{0}] - {1}", i.ToString("0000"), fileList[i])); connection.Open(); Console.WriteLine(string.Format("[{0}] Connected", i.ToString("0000"))); } catch (Exception ex) { Console.WriteLine(string.Format("[{0}] - EXCEPTION {1}" ,i.ToString("0000"), ex.Message)); Console.ReadKey(); } connection.Close(); Console.WriteLine(string.Format("[{0}] Disconnected", i.ToString("0000"))); } GC.Collect(); GC.WaitForPendingFinalizers(); }
Console.ReadKey();


Ответ

Проблема оказалась не в том, что я не убиваю объекты, а то, что сам провайдер их у себя хранит копию на них. Т.о. когда я убиваю коннект, он еще живет внутри провайдера в pollе. Как оказалось, решение проблемы лежало на поверхности. Для моих нужд я опциями строки подключения выключил использования пулла коннектов и все заработало так, как мне нужно. Благодарю Вас за беспокойство к моей проблеме.

Как в bash узнать имя последнего файла скопированного в папку?

Пробовал варианты: ls -lrt | awk '{ f=$NF }; END{ print f }' и ls -t1 | head -n1 Но последний скопированный в папку файл не показывается. Какие еще есть варианты? UPD: Вариант тоже не работает: ls -t1 | tail -n1 Все эти команды выдают всегда какое-то одно имя файла для моей папки. Хотя файлы продолжают непрерывно поступать в папку. Нужен именно последний попавший в папку файл. Это необязательно должен быть самый новый файл.


Ответ

@abg, время модификации файла измеряется в секундах. Поэтому при массовом копировании таких файлов (с одинаковым временем) будет много. Ваша команда ls -t1 | tail -n1 показывает последний (самый старый, а не свежий) файл. А вот ls -t | head -1 покажет самый новый (один из них). А вообще-то, если опишите задачу поподробнее, то может быть найдется какое-то лучшее решение.

В чем отличе модуля от библиотеки(dll) ?

Насколько я понял dll способна содержать только процедуры и функции, но ни как не переменные и константы. Я так понимаю что модуль и dll это совсем разные вещи...или нет ? Если нет, тогда в чем отличие между ними и приведите пример использования модуля. Просто в хочется кучу констант и переменных вынести в отдельный файл, а все вычисления переложить на библиотеку. Поиск внятного ответа не дал.


Ответ

Вам нужно уяснить себе разницу между сборкой и модулем. Сборка - это абстрактное понятие. Это набор типов .NET, которые можно к чему-нибудь подключить. Сборка имеет определённое имя, по которому её можно найти. Ещё сборка может иметь версию и цифровую подпись для более строгого поиска нужной версии сборки. Как правило, сборка представляет собой одну .dll. Но у нас есть программы, часть которых написана на C#, а часть на Delphi. Для того чтобы подключить библиотеки на Deplhi к .NET-программам, требуется написать на Delphi dll с экспортируемыми функциями, а на C# написать сборку, в которую эти функции были бы импортированы. Такая сборка уже состоит из нескольких dll, каждая из которых называется модулем. Один из этих модулей, который написан на C#, содержит манифест сборки (который содержит имя сборки, описание типов, версию, цифровую подпись и т.д.), остальные - это просто dll, написанные на Deplhi. В принципе, если сборка состоит только из одной dll, это тоже модуль. Просто это одномодульная сборка. Грубо говоря, модуль - это файл. Сборка - это набор файлов, который подключается как единое целое.

Для чего нужны новые html5 теги?

Я активно использую HTML5, такие теги как article, header, footer... и т.д. Но что они дают на данный момент кроме логичности кода? Ведь это все те же div-ы Одно из моих предположений - это поисковая оптимизация. Что еще?


Ответ

Семантика и оптимизация для поисковых систем, логичность кода, как вы и сказали :-)

gcc naked атрибут

Приветствую всех. А я к вам снова с вопросом:) Ковыряю gcc, к своему сожалению обнаружил что для архитектур i386 amd64 не поддерживается naked атрибут. Ну и собственно вопросы: Есть ли возможность обойти это досадное недоразумение (может я проглядел какие-нибудь специфичные для этих архитектур атрибуты) Может кто-то знает - есть ли в отсутствии этого атрибута какой-то злой или добрый умысел со стороны разработчиков? (короче - почему атрибут не поддерживается?) Большое спасибо за ваши ответы.


Ответ

Может быть обычная лень тому причина.
Equivalent of __declspec( naked ) in gcc/g++ Naked functions in gcc/g++ - здесь есть обходные пути.

Передача переменных в подключаемый файл

Доброго всем времени суток господа include('./block.php'); // работает include('./block.php?alfa=1&beta=2'); // не работает Собственно не могу передать get переменную в подключаемый файл. Айфреймы в моем случае не катят. В гугле пишут, что 'должно работать'. Но в реальности ошибка warning: include(./block.php?alfa=1&beta=2) failed to open stream короче как бы он пытается найти не файл с переменной, а файл с таким адресом Подскажите, как прописать GET параметры в подключаемый файл.


Ответ

я к тому, что вашем первом посте оно подключается локально, а так нельзя, потому что оно будет искать файл с таким именем. ну да неважно уже. curl конечно потянет, какая ему разница? тем более курлом можно как GET, так и POST отдавать параметры. Попробуйте использовать не include , а file_get_contents, в вашем случае это будет более оправдано, да и более правильно...
ps ни на одном своем сервере не держу пока 5.4, поэтому попробовать не могу.
pps; вы файл все же будете удаленно подключать или все же с локальной машины?

Абстрактный класс и generic в C#

Здравствуйте. Прошу вашего совета вот по какому вопросу. Уменя есть акая иерархия классов enum SomeEnum { First, Second }
abstract class BaseClass { private SomeEnum ActionId { get; set; }
protected BaseClass(SomeEnum actionId) { ActionId = actionId; }
public static T GetById(SomeEnum actionId) where T : BaseClass { switch(actionId) { case SomeEnum.First: return new DerivedFirst(actionId) as T; case SomeEnum.Second: return new DerivedSecond(actionId) as T; default: throw new ArgumentException(); } } }
class DerivedFirst : BaseClass { public DerivedFirst(SomeEnum actionId) : base(actionId) {
}
}
class DerivedSecond : BaseClass { public DerivedSecond(SomeEnum actionId) : base(actionId) {
} } Проблема в том, что в абстрактном классе BaseClass есть статический метод, который возвращает экземпляр класса DerivedFirst или DerivedSecond в зависимости от типа параметра actionId. Мне кажется что я написал плохое решение. Может вы подскажете что-то получше, ничего в голову не приходит((


Ответ

(Обновляю ответ в связи с изменившимся условием.) class ActionFactory { static Dictionary> activators = new Dictionary>() { { SomeEnum.First, () => new DerivedFirst(SomeEnum.First) }, { SomeEnum.Second, () => new DerivedSecond(SomeEnum.Second) } };
public static BaseClass Create(SomeEnum actionId) { Func activator; if (!activators.TryGetValue(actionId, out activator)) throw new ArgumentException("Unsupported action id", "actionId"); return activator(); } } Нет никакого смысла делать Create генерик-функцией, так как это требует знания типа возвращаемого значения на этапе компиляции, а если этот тип известен, вы можете непосредственно вызвать конструктор.

Проектирование архитектуры игры “шахматы”

Есть реализация класса Figure #include "figure.h"
Figure::Figure(QPoint coord,QString name,QRect rect,QString color,QObject *parent) : QObject(parent) { this->name=name; this->color=color; QPixmap img2("C:/Documents and Settings/Denis/QTProjects/chess/spatial.png"); this->_img=img2.copy(rect);
} void Figure::isMoveTo(QPoint from,QPoint to) { //данная функция виртуальная } И есть класс FigureList (список всех фигур): QList

При вызовы функции Figure->isMoveTo(QPoint(1,1),QPoint(1,2)) мы по координатам в списке должны получать тип фигуры,то есть класс Figure должен иметь доступ к FigureList. Как это реализовать?


Ответ

Я бы сделал по-другому. Это не дело фигуры — знать, где расположены другие фигуры. Фигура должна уметь ответить на вопрос: может ли она потенциально перейти на данное поле? перейти на данное поле со взятием? И какие поля при этом будут пройдены. (Различие между переходом и взятием актуально для пешек, например.) А вот уже внешняя по отношению к фигуре логика должна определить, что за фигура стоит на целевом поле, своя/чужая, нет ли на проходимых полях других фигур и т. п. Обратите внимание на специальный случай взятия на проходе (снимается фигура, не стоящая на целевом поле) и рокировки (двигаются две фигуры). Кстати, на английском шахматная фигура называется piece, так что я бы переназвал класс. И ещё: я бы разделил логику фигуры (определяющую, куда фигура может пойти и каков номер поля, на котором она находится) от представления фигуры (определяющего, какая картинка представляет фигуру на экране, и каковы координаты прямоугольника на экране, где она изображается). Это два очевидно разных класса с очевидно разными областями ответственности.

Конструктор копирования в throw

Доброго времени суток. Допустим, есть try-блок, где передается локальный объект по значению (знаю, что это плохо) #include using namespace std;
class CL { public: CL() { cout<<"CL()"<int main() { try { CL cl; throw cl; } catch (CL clcop) { cout<<"cl catched"<

Ответ

Я предлагаю класс немножечко модифицировать class CL { public: CL() { cout<<"CL()" << this <

Почему input больше select?

Привет не могу понять где хранятся лишние маргины\паддинги\ещё что-то.. подскажите почему при одинаковой длинне в пикселях input длиннее select? for example: http://jsfiddle.net/D2hhL/


Ответ

Установите у обоих: box-sizing:content-box; -ms-box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box; будет отображаться одинаково: http://jsfiddle.net/D2hhL/8/

Амперсанд в параметрах функции

Здравствуйте, подскажите пожалуйста, как это работает? Допустим, имеется такая функция:
void foo(int &one, int two){ one = two; }
int s1 = 1; int s2 = 2; foo(s1, s2);
Как работает амперсанд перед параметром функции one? Я понимаю, что функция работает с переменной, которая выделена в статической памяти. Выходит, что мы передаем в функцию значение типа int, затем берем его адрес. Но почему в теле функции можем работать с ним как с обычной переменной, а не как с указателем? По идее, нужно было бы разыменовывать.
Такая конструкция понятна:
void foo(int* one, int two) { *one = two; }
и при вызове функции передаем так параметры (&s1, s2);


Ответ

А потому и пишем &, чтобы можно было писать one = two, а не *one = two. Тут вся суть в том, что явно указатель передают когда хотят работать непосредственно с ним, когда нужно знать его значение. Когда же мы хотим работать со значением переменной, но не только в функции в которой она создана, но и в «потомственных», то мы передаём её по ссылке.
Вы конечно можете сказать что-нибудь типа «мне это непривычно, я лучше буду передавать адреса явно», но поверьте — передача переменной по ссылке в случае, если надо работать с самой переменной — правильный подход к программированию. Хороший программист обязан уметь писать ХОРОШИЙ код — не только алгоритмически эффективный, но и максимально понятный; такой, чтобы его суть была понятна другому программисту, даже впервые его увидевшему.
В языке C# передача переменной по ссылке выглядит более красиво, там просто и в вызывающем, и в вызываемом методах перед переменной пишется слово ref (или out, что идёт там по смыслу «дополнительное возвращаемое значение»).

Делегат в качестве параметра

Добрый вечер уважаемые знатоки! У меня возник такой вопрос: мне нужен метод примерно следующего вида: public void MyMethod(Func del) { for(int I = 0; I < 1000; I++) del(); } Собственно в чем проблема: нужно чтобы делегат del вызывался в методе некоторое количество раз (например тысячу как указано выше), но дело в том, что Func - это некий "общий" тип - в действительности это может быть и Func и Func и Func. Более ого, T1, T2 и T3 могут быть int, float, double. Кроме того я не знаю, как можно было бы передавать кроме делегата еще и набор его параметров, с которыми он должен вызываться. Хотелось бы чтобы я имел возможность делать что-то такое: var del1 = new Func(() => 10); var del2 = new Func(i => i); var del3 = new Func((i, j) => i + j);
MyMethod(del1); MyMethod(del2, parametersForDel); MyMethod(del3, parametersForDel); Можно ли как-то написать некий общий метод MyMethod, который мог бы получать в качестве аргумента любой интересующий меня делегат указанного типа? Или же под каждый Func нужно писать свой метод? И как быть с передачей параметров для этих делегатов? Заранее спасибо


Ответ

О, тестирование производительности! Тестирование — довольно сложная тема, очень сложно сделать его полностью правильно. Считается, что это хорошее задание для новичка, но на самом деле правильные тесты производительности должен бы написать архитектор. Давайте разберём, что мы хотим тестировать. Во-первых, запуск метода один раз — не очень правильная штука. На выполнение метода влияют сотни случайных параметров: например, случайный всплеск активности антивируса или вытесненная на диск страничка кода. Поэтому необходимо прогнать метод много раз: результаты одного прогона статистически иррелевантны. (По поводу того, сколько же раз нужно прогонять тест: не берите число с потолка, а спросите коллегу-математика!) Далее, тест должен быть проведён с одними и теми же параметрами! Иначе наше усреднение не имеет смысла: мы усредняем несравнимые величины. Если в функции одна ветка кода быстрая, а другая медленная, усреднять время пробега по ним бессмысленно: надо иметь два теста, тестирующие разные ветки. Таким образом, мы должны много раз выполнить один и тот же код: вызвать функцию с одними и теми же параметрами. Значит, наш вызов функции прекрасно оборачивается в Action, и для тестирования разных функций можно использовать один и тот же метод: class PerformanceTester { const int repetitions = 1000; // может быть, нужна внешняя параметризация
static public TimeSpan ComputeAverageExecutionTime(Action a) { var executionTicks = new List(); for (int i = 0; i < repetitions; i++) executionTicks.Add(MeasureTime(a));
double averageTicks = executionTicks.Average(); return new TimeSpan((long)averageTicks); }
static private long MeasureTime(Action a) // in ticks { var stopwatch = new Stopwatch(); stopwatch.Start(); a(); stopwatch.Stop(); return stopwatch.ElapsedTicks; } } Пользоваться так: void f() { /* ... */ } void g(int arg) { /* ... */ } void h(ClassArg arg1, int arg2) { /* ... */ }
...
var r1 = PerformanceTester.ComputeAverageExecutionTime(f); var r2 = PerformanceTester.ComputeAverageExecutionTime(() => g(1)); ClassArg arg1 = new ClassArg(); // не включаем конструктор в лямбду var r3 = PerformanceTester.ComputeAverageExecutionTime(() => h(arg1, 0)); Но это — не окончательное решение. В нём есть недостатки, которые мы попробуем закрыть. Во-первых, JIT. Первый пробег функции будет медленнее из-за того, что в этот момент она будет скомпилирована just-in-time-компилятором. Плюс необходимые части кода будут загружены в память. Значит, необходимо включить «разогрев кода» в тест: static public TimeSpan ComputeAverageExecutionTime(Action a) { // разогреваем код: a();
var executionTicks = new List(); for (int i = 0; i < repetitions; i++) executionTicks.Add(MeasureTime(a));
double averageTicks = executionTicks.Average(); return new TimeSpan((long)averageTicks); } Во-вторых, среди большого числа пробегов всё равно будут случайные «выбросы» вверх и вниз. Чтобы нивелировать их, надо знать среднеквадратичное отклонение σ, и отбраковывать результаты, отличающиеся от оценочного среднего на более чем 3σ. Но для этого нужна продвинутая математика, а мы можем по-простому выкинуть наибольшее и наименьшее значения, это тоже довольно хорошая эвристика. var maxVal = executionTicks.Max(); if (executionTicks.Count(v => v == maxVal) < executionTicks.Count / 3) executionTicks.RemoveAll(v => v == maxVal);
var minVal = executionTicks.Min(); if (executionTicks.Count(v => v == minVal) < executionTicks.Count / 3) executionTicks.RemoveAll(v => v == minVal);
// здесь осталось не менее [[1000 * 2/3] * 2/3] = 444 элементов, // значит, список не пуст, и исключение не выбросится double averageTicks = executionTicks.Average(); В-третьих, давайте-ка посмотрим, что именно мы измеряем. Кроме самой функции, мы измеряем время её косвенного вызова, через лямбду и делегат. Для большинства функций это неважно: время пробега функции обычно значительно больше времени вызова делегата, так что этой тонкостью можно пренебречь. Другое дело, если ваша функция очень маленькая, для этого придётся писать код тестирования вручную. Например, такой: class PerformanceTester { static public TimeSpan ComputeExecutionTimeForSmallFunctions( Action execute1000times, Action execute1time) { // разогреваемся execute1time(); var ticks = MeasureTime(execute1000times); return new TimeSpan((long)(ticks / 1000.0)); }
// остальные функции } Используем так: void q() { /* что-то очень быстрое */ }
var r4 = PerformanceTester.ComputeExecutionTimeForSmallFunctions( () => { for (int i = 0; i < 1000; i++) q(); } q); Недостатки: в измерение всё же включается косвенный вызов делегата, но теперь делегат вызывается не 1000, а всего 1 раз, и вносит лишь 1/1000 искажения. К счастью, для маленькой функции можно смело поднимать константу 1000 до больших значений, например, до 1000000. Заодно и результаты случайных больших отклонений от среднего, с которыми мы боролись для длинных функций отбрасыванием минимального и максимального значения, нивелируются. Кроме того, ко времени выполнения функции прибавляется время на управление циклом. В-четвёртых, не забывайте, что производительность сильно зависит от настроек компилятора. Поэтому никогда не тестируйте производительность кода, скомпилированного в DEBUG-режиме. Кроме того, пробег в Visual Studio замедляет скорость кода приблизительно вдвое (!), так как отладчик специально «просит» JIT-компилятор оптимизировать поменьше. Поэтому после окончания отладки запускайте тесты производительности только вне Visual Studio, и только скомпилированные в RELEASE-режиме. В-пятых, не забывайте о наличии довольно умного оптимизатора! Он имеет право заинлайнить вызов функции, и если вы игнорируете результат, выкинуть всё вычисление! Поэтому для случая ComputeExecutionTimeForSmallFunctions возвращаемое значение надо бы как-то использовать, хотя бы запоминать в массиве, добавлять в аккумулятор или что-то ещё наподобие.

Программа, написанная на Qt 5.1.1, по-разному ведёт себя на Windows 8 и 7

Доброго времени суток! Есть программа, написанная на Qt 5.1.1 на машине Windows 8 x64 c применением компилятора VC++ 2010 (x86). В программе для создания интерфейса использован QtQuick 2.0 и QtQml.Models 2.1 - другие версии выбрать нельзя. Программа спокойно запускается и работает на Windows 8 (x64), а на 7 (x86) - запускается, но отображается только пустая форма. В чём может быть проблема? Все необходимые dll есть рядом с exe-файлом приложения. UPD: любое приложение Qt с использованием QtQuick 2.0 не запускается на Windows 7 x86.


Ответ

Как обычно и бывает - решение нашёл сам. Итак, как вы знаете, для того чтобы приложение на Qt работало вне IDE, нам необходимо либо статически собрать нашу версию Qt, либо аккуратно сложить все необходимые dll в папке с исполняемым файлом приложения. Я изначально выбрал второй путь, поэтому директория приложения выглядела следующим образом: - D3DCompiler_43.dll - icudt51.dll - icuin51.dll - icuuc51.dll - libEGL.dll - libGLESv2.dll - Qt5Core.dll - Qt5Gui.dll - Qt5Network.dll - Qt5Qml.dll - Qt5Quick.dll - Qt5V8.dll - Qt5Widgets.dll - app.exe - platforms/qminimal.dll - platforms/qoffscreen.dll - platforms/qwindows.dll Казалось бы, ведь есть уже Qt5Qml.dll и Qt5Quick.dll, которые должны отвечать за работу с QtQuick, но не тут-то было. После долгого гугления выяснилось, что состав директории должен быть дополнен каталогами QtQml и QtQuick.2. После чего всё прекрасно заработало. Спасибо за внимание, вопрос удалять не буду, а просто закрою - вдруг кому понадобится.

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

Собственно сабж, очень интересно как это возможно, что для этого используется, какие данные ? Какие есть варианты ? UPD Имел ввиду с точек по Wi-fi Сделали опыт: Через телефон сделали точку, раздали мобильный интернет, и все же определил где мы.


Ответ

По улицам иногда ездит шпиенский автомобиль от компании Google. На автомашине установлено сканирующее устройство, которое засекает работающие wi-fi устройства и делает их привязку MAC адрес -> гео-координаты. Такой метод называется Wifi Positioning System Далее дело уже техники: запрос на сервера гугль по засеченным mac адресам, триангуляция, ваши координаты. Таким способом можно координаты и без наличия GPS приемника. Конечно такой способ иногда дает сбои. Допустим если wi-fi передатчик передвинули то и координаты будут неверны. Update Так устроен алгоритм триангуляции (немного математики)

C++: Undefined reference при линковке теста с либой

Вот исходник тесты #include #include using namespace RFw;
int main() { Array _a_;
_a_.resize(5);
_a_[2] = 'b'; _a_[3] = 'a';
printf("%c%c
", *(_a_.provideElement(2)), *(_a_.provideElement(3)));
return 0; } Так компилю: c++ test.cpp -o test -std=c++11 -Isrc-core/ -Lbin/ -lcore Вывод: /tmp/test-k6aFM8.o: In function `main': test.cpp.text+0x27): undefined reference to `RFw::Array::Array(unsigned int, int*)' test.cpp.text+0x3a): undefined reference to `RFw::Array::resize(unsigned int)' test.cpp:(.text+0x52): undefined reference to `RFw::Array::operator[](unsigned int)' test.cpp:(.text+0x76): undefined reference to `RFw::Array::operator[](unsigned int)' test.cpp:(.text+0x9a): undefined reference to `RFw::Array::provideElement(unsigned int)' test.cpp:(.text+0xbd): undefined reference to `RFw::Array::provideElement(unsigned int)' test.cpp:(.text+0x101): undefined reference to `RFw::Array::~Array()' test.cpp:(.text+0x11b): undefined reference to `RFw::Array::~Array()' clang: error: linker command failed with exit code 1 (use -v to see invocation) PS Array взят из Array.hpp который инклюдится в common.hpp Array.hpp: /** * src-core/Array.hpp */ #ifndef _ARRAY_HPP_ #define _ARRAY_HPP_
#include "util.hpp" #include "Object.hpp" #include "arrayExceptions.hpp"
namespace RFw { template class Array : public Object { public: Array(intnum _length = 0, TValue* _array = nullptr); virtual ~Array();
void addToTop(const TValue _element) throw(ArrayOverflowException); void addToEnd(const TValue _element) throw(ArrayOverflowException); void clone(const intnum _length, const TValue* _array);
TValue* provideElement(const intnum _index) throw(IndexOutOfRangeException); const TValue* provideElement(const intnum _index) const throw(IndexOutOfRangeException);
TValue& operator[](const intnum _index) throw(IndexOutOfRangeException); const TValue& operator[](const intnum _index) const throw(IndexOutOfRangeException);
void resize(const intnum _newLentgh);
const Array getClone() const; const intnum getLength() const; const TValue* getArray() const; private: intnum length__; TValue* array__; }; }
#endif // _ARRAY_HPP_


Ответ

С шаблонами вы должны помещать реализацию методов в header.
В вашем случае пишите так:
template class Array : public Object { public: Array(intnum _length = 0, TValue* _array = nullptr) : length__(_length), array__(new TValue[_length]) { // остаток имплементации } virtual ~Array() { delete[] array__; } // и так далее };
Если вы вынесете реализацию методов в .cpp-файл, компилятор не будет знать, какие инстанциации шаблона ему нужно компилировать. Это ограничение модели компиляции языка C++. Sorry for this.

Небольшое объяснение. В C++ шаблон не есть класс, это лишь «описание», по которому при подстановке шаблонных аргументов генерируется реальный класс. Никакого объектного кода шаблон сам по себе не производит.
Когда компилятор компилирует C++-файл с кодом, использующим шаблон, он видит, с каким шаблонным аргументом используется этот шаблон. Но когда он компилирует C++-файл с реализацией шаблонных методов, он не знает, с какими аргументами инстанциировался шаблон в других файлах, ведь каждый C++-файл компилируется по отдельности!
Поэтому решением является положить реализацию внутрь шаблонного класса. При этом компилятор в той точке, где он видит инстанциацию шаблона, видит весь его код, и может скомпилировать все методы класса.
(Существует ещё уродливый костыль с указанием в C++-файле точного списка инстанциаций шаблона, который настолько ужасен, что я не хочу о нём и говорить. Аналогом этому было бы около каждой функции указывать заранее список всех аргументов, с которым функция будет вызвана в программе.)

Одновременный подсчет элементов и выборка максимального значения

В БД (MySQL) есть таблица tab с внешним ключом parent_id и некоторым набором полей. Поле order отвечает за очередность вывода данных и содержит значения 1,2,3 и т.п. Для проверки валидности данных нужно сопоставить количество значений для с одинаковым parent_id и максимальное значение в поле order. Текущее решение: SELECT l.parent_id, l.m, r.c FROM ( SELECT parent_id max(`order`) as m FROM tab GROUP BY parent_id ) AS l INNER JOIN ( SELECT parent_id, count(*) AS c FROM tab GROUP BY parent_id ) AS r ON l.parent_id = r.parent_id WHERE l.m <> r.c; Запрос - рабочий, но очень медленный. Вопрос к SQL-оптимизаторам: как упростить и каково направление размышлений в процессе улучшения запроса?


Ответ

Слишком сложно. Если правильно понял, то: select parent_id, count(*), max(`order`) from tab group by parent_id having count(*)<>max(`order`) SQLFiddle

Количество байт, которое занимает UTF8 символ в char * строке?

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

На StackOverflow я нашёл два решения:
1) Способ 1
size_t utf8_char_length(char firstbyte) { if ((firstbyte & 0xC0) == 0xC0) { if ((firstbyte & 0xF0) == 0xF0) { return 4; } else if ((firstbyte & 0xE0) == 0xE0) { return 3; } else { return 2; } } else { return 1; } }
2) Второе решение найдено здесь, оно использует другой способ: вместо битовой операции & используется "lookup" по следующему массиву из 256 символов:
static const size_t utf8_skip_data[256] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 };

К сожалению, я сейчас не имею возможности досконально разобраться с UTF8, поэтому просто ищу надёжную функцию, которая будет давать мне правильные результаты для символов в кодировке в UTF8 (точнее для первых байт этих символов). Мне больше нравится второе решение, но я хочу услышать мнение более опытных специалистов:
какую функцию стоит использовать для такой задачи: 1, 2 или, может быть, вы знаете какую-то проверенную свою функцию, которая лучше, чем эти две?
P.S. Кстати, если кто-то может объяснить, откуда взялась lookup-таблица, буду признателен. На SO пишут, что она взята из исходного кода glib's gutf8.c. Так вот интересно, какой принцип лежит в её основе.
Спасибо.


Ответ

Вкратце алгоритм кодирования символов в UTF8 выглядит так: Если код символа меньше 128, то кодируется как есть. Если больше или равно, то кодируется в следующем формате: в первом байте в единичном коде записывается количество использованных байт включая первый (то есть записывается такое число единиц, сколько байт в числе; теоретически формат UTF8 не накладывает ограничений на количество байт, используемых для записи числа, но обычно используется не более 6). Затем записывается 0 (чтобы отделить количество байт числа от значащих разрядов числа), после чего идут биты, представляющие число. Каждый следующий байт начинается с последовательности 10 (чтобы не путать однобайтные и многобайтные символы - все однобайтные начинаются с нуля). Например, 111 0 0011 10 011101 10 000100 Сначала 3 единицы, значит, для записи используется 3 байта. Затем 0, отделяющий запись числа байт от записи числа Дальше значащие разряды числа. Первые 2 бита каждого байта (10) к ним не относятся - это метки, означающие, что это второй (третий, и т. д.) байт записи. Таким образом, записанный код - 0011011101000100. Это к вопросу о том, откуда взялась lookup-таблица. К вопросу какую функцию использовать - исходите из потребностей. Если вы всегда будете работать с символами, код которых не превышает 256, то используйте lookup-таблицу, она быстрее. Если же планируется полная поддержка Юникода, то используйте функцию. Только её придётся модифицировать, так как она не распознает 5- и 6-байтные символы. UPD Прошу прощения, выражение 'lookup-таблица' сбило меня с толку и навеяло неверные ассоциации. Да, действительно, эта таблица предназначена для проверки первого байта последовательности и решения о длине кода. Лично я всё равно склоняюсь к функции - она выглядит гораздо лаконичнее. Но lookup-таблица работает быстрее, если это принципиально, лучше использовать её.

Загрузка библиотек из массива

Есть некая программа для которой пользователи пишут расширения (библиотеки) и в каждой библиотеки стартовым методом является функция "Start()" с одинаковыми параметрами. Так вот вопрос, как можно подгрузить библиотеки из массива и вызвать их стартовый метод, если это возможно?


Ответ

Конечно возможно! // Получаем все dll FileInfo[] files = new DirectoryInfo("Директория с нашими плагинами").GetFiles("*.dll"); foreach (FileInfo fi in files) { // Получаем assemly из файла var assembly = Assembly.LoadFile(fi.FullName); // Ищем нужный тип foreach (Type type in assembly.GetTypes()) { ...
// Нашли => Создаем экземпляр. Вместо многоточия идут параметры конструктора return Activator.CreateInstance(type, ...); } } Обычно, когда подобное реализуют, то описывают интерфейс, а в библиотеках описывают классы, которые его реализуют. В Вашем случае он будет выглядеть например так: public interace IMyInterface { void Start(...); } И тогда можно перебрать в библиотеке классы, реализующие его: // Ищем нужный тип foreach (Type type in assembly.GetTypes()) { // Проверяем является реализует ли тип type наш интерфейс if (!typeof (IMyInterface).IsAssignableFrom(type)) continue; ...
// Нашли => Создаем экземпляр. Вместо многоточия идут параметры конструктора return Activator.CreateInstance(type, ...); }

Помогите понять разницу между моделью и контроллером в MVC

Очень нубский попрос. Почитал вики, различные разжевывания концепции, часто видел реальные примеры, но кое-что все-таки не дает покоя. Хочется раз и навсегда прояснить тонкости. По какому принципу отделяются функции в контроллере от функций в модели? Правильно ли я понимаю, что в контроллере должны быть методы, которые инициируются каким-либо событием, а в модели - все остальные (т.е., грубо говоря, если нам не нужно больше одного метода на какое-то событие, напр. открытие новой страницы, можно написать этот метод в контроллере и это будет правильно)? Если же логика сложна и одним небольшим методом не обойтись, то можно: - использовать метод в контроллере как обертку для вызова метода модели - вызвать вспомогательные методы в модели, работающие с данными ? P.S. Методы для работы с СУБД - тут я бы выносил их в отдельную библиотечку. Просто потому, что хранить их в модели неправильно. И получается, что в моем представлении модель в любом случае по объему получается меньше контроллера, хотя теоретически должно быть наоборот.


Ответ

Правильно ли я понимаю, что в контроллере должны быть методы, которые инициируются каким-либо событием В общем - да а в модели - все остальные (методы) ... Методы для работы с СУБД - тут я бы выносил их в отдельную библиотечку. Не все. У контроллера, модели и представления есть свои разграниченные области - связка запросов, модели и представления; работа с данными; вывод. Все остальное лежит на внешних библиотеках, и MVC слабо волнует, что в этих библиотеках происходит, пока они выполняют свои функции. Модель не включает в себя БД, БД - это провайдер данных, модель могла бы брать эти данные и из другого сервиса, и из json-файлов, в этом случае провайдерами были бы сетевая передача и десериализация данных или функции файловой системы и json-парсер. В большинстве случаев этот провайдер тесно интегрирован с моделью (потому что предполагается, что работа всегда будет с БД, и сложно сильно абстрагироваться от SQL-запросов так, чтобы запрос к тому же json-файлу и БД был одинаковым), но в теории можно создать интерфейс этого провайдера, и вынести БД из модели полностью. т.е., грубо говоря, если нам не нужно больше одного метода на какое-то событие, напр. открытие новой страницы, можно написать этот метод в контроллере и это будет правильно Вообще - да. Иногда получается так, что контроллер приходится делить для повышения читаемости (например, страница должна отдаваться в произвольном формате, и ajax-запросы отдаются на один контроллер, а обычные - на другой), но обычно подобное - это красный флаг с надписью "что-то явно делается не так". Но, конечно, в контроллер действия попадают не просто потому что там нужно "не больше одного метода", а потому что это событие - это запрос, и его надо обработать. Если же логика сложна и одним небольшим методом не обойтись, то можно: - использовать метод в контроллере как обертку для вызова метода модели - вызвать вспомогательные методы в модели, работающие с данными ? В целом все верно, просто, опять же, деление должно происходить не по количеству вызовов, а по логике приложения. Какие-то вещи, например, проверку прав доступа, надо производить в контроллере, просто это стоит вынести в базовый класс. А вообще - да, чем тоньше контроллер, тем легче работается и больше когда повторно используется. И часто бывают случаи, когда контроллер состоит из пары строчек и действительно является не более, чем оберткой. Очень нубский попрос. Почитал вики, различные разжевывания концепции, часто видел реальные примеры, но кое-что все-таки не дает покоя. Хочется раз и навсегда прояснить тонкости. Это нормально, у меня тоже понимание довольно долго приходило, а "Где же должна лежать такая-то функция?" - стандартная тема для дев-срача. Тут нет однозначного твердого стандарта, и критерии оценки верности решений могут быть косвенными - если все легко и удобно расширяется, встраивается, рефакторится и очевидно отсутствие костылей, то все в порядке. Но если в контроллере почему-то форматируются свойства модели, то тут вопросов по поводу корректности быть не должно.

Будильник на JAVA

Я начинающий в JAVA. До этого писал на Delphi. Если у кого-то есть пример кода на Яве, буду признателен. Но самое главное, как запустить ВИБРАЦИЮ при срабатывании будильника. Это, наверное, самое главное, что нужно.


Ответ

Вы, наверное, начали программировать для мобильных устройств? А именно Android? Я не знаю, может, у Вас в компьютере есть виброзвонок. Если Вы имели в виду для Андроид, тогда следует получить объект типа Vibrator с помощью системеного сервиса. import android.os.Vibrator; // Импорт для класса Vibrator Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE); // Получение объекта с помощью системного сервиса v.vibrate(1000); // Вибрация 1 секунду. И не забудьте прописать разрешения (запрос на разрешение) в файле AndroidManifest.xml

Как лучше исправить foreach цикл, внутри которого расширяется перебираемая коллекция?

Коллекция выглядит так: public class myList : List { } Мне нужно повторять цикл до тех пор, пока он добавляет новые элементы: do { newObjectAdded = false; foreach (myClass obj in myList) { //... if (some_condition) { myList.Add(newObj); newObjectAdded = true;} //... } } while (newObjectAdded); После того, как в лист добавится элемент, в строке foreach (myClass obj in myList) я получаю ошибку - коллекция была изменена, невозможно выполнить операцию перечисления. Можно заменить foreach на цикл с итератором, но от этого обращение к объектам станет довольно громоздким. Ещё есть вариант с заменой списка на LinkedList, но это ещё хуже, в данном случае. Существует ли какой-то более элегантный способ?


Ответ

Сам разобрался. Достаточно написать: foreach (myClass obj in myList.ToArray()) {

Как писать unit тесты для DAL?

К примеру есть классы с такими extension методами:
IQueryable ToViewDto(this IQueryable query)
Или элементарный Linq запрос (в другом классе):
_repository.Query .Where(x => x.Id == id) .Where(x=>x.Type == UserType.Oldfag) .ToViewDto() .ToList();
Каждый раз в тестовом методе заполнять список с UserEntity делать AsQueryable() уж очень долго.
Как вариант рассматриваю сделать какой нибудь набор данных всех сущностей с разными свойствами. Но это тоже долго и усложняет чтение тестового кода, т.к. придется находить место где сущности перечислены, искать нужную с нужными параметрами и только потом сравнивать его свойства.
Подскажите как правильно поступить? Или я иду в направлении интеграционных тестов и DAL вообще не стоит трогать?


Ответ

Каждый раз в тестовом методе заполнять список с UserEntity делать AsQueryable() уж очень долго.
Именно так и надо делать. В результате вы получите юнит-тесты в чистом виде, без сторонней зависимости в виде БД. И это не должно быть долго, поскольку набор входных данных должен получаться небольшой, если тестовые методы у вас достаточно хорошо разбиты по соответствуют отдельным кейсам.
Или я иду в направлении интеграционных тестов и DAL вообще не стоит трогать?
Тесты всякие нужны, тесты всякие важны. И на DAL в т.ч. Просто если у вас нет в БД никакой логики, то тогда вы сможете замокать ее, и получить чистые юнит-тесты. Если же в БД есть логика, то придется делать и интеграционные тесты (тут, впрочем, можно подискутировать на тему того, стоит ли тестировать БДшный код из тестов приложения или иметь отдельные тесты для процедур).

Целочисленная константа в классе - enum или static const?

Есть два способа сделать константное значение в классе:
Использовать перечисление:
class C { enum { X = 42; } };
Или статический член класса:
class C { static const auto X = 42; };
Какой способ предпочтительнее? Какие могут быть подводные камни?


Ответ

Статический член класса позволяет использовать вывод типов:
static const auto X = 1ul;
Для enum тип надо писать самому (если он не int):
enum { X = 1 }; enum : unsigned long { Y = 1 };
Получается что статический член класса выглядит предпочтительнее, к тому же он семантически является константой, а перечисление больше рассчитано на "перечисление" нескольких значений.
Подводные камни
Если мы попробуем скомпилировать следующий код
struct C { static const auto X = 1; };
int f(const int& arg) { return arg; }
int main() { return f(C::X); }
То мы можем получить ошибку линковки (при отключенном оптимизаторе):
main.cpp:(.text+0x15): undefined reference to `C::X'
Оказывается, статические целочисленные константные члены классов не требуют отдельного определения только если они не ODR-использованы (odr-used). Мы берем ссылку на C::X, это делает ее odr-used, и значит мы должны добавить ее определение вне класса:
struct C { static const auto X = 1; };
const int C::X; // В одном из .cpp файлов.
Термин "odr-used" определен в главе "One definition rule [basic.def.odr]" следующим образом:
Переменная, чье имя использовано в потенциально вычисляемом контексте (т.е. не sizeof или decltype), является odr-used, за исключением случая когда она является объектом, который может быть использован в константном выражении, и к ней сразу же применяется преобразование из lvalue в rvalue.
В нашем случае C::X может быть использована в константном выражении, однако она является lvalue и передается в f() как ссылка на lvalue. Если мы добавим преобразование в rvalue, то отдельное определение C::X уже будет не нужно, и ошибка линковки пропадет:
f(static_cast(C::X)); // явный каст f(+C::X); // унарный плюс
Какой из этого можно сделать вывод? Статические арифметические константные члены классов слишком удобны чтобы от них отказываться, и если вдруг появится ошибка линковки, то достаточно использовать унарный плюс чтобы ее починить.

При нажатии комбинации клавиш раздаётся звук и ввода нет

Например, не работают сочетания Space + → + ← d + f + 3 d + f + 5
Но при этом работают d + f + 4 d + f + 6
Система начинает издавать сигналы, как при залипании клавиш.
Если открою стандартный windows блокнот, и зажму d + f + 6, то в блокнот будет записываться 6666666666666666666...
Если зажму d + f + 5, то ничего записываться не будет, будет сигнал звуковой через каждые 0.8 секунды. Залипание клавиш отключено.
Как узнать из-за чего подобное?


Ответ

Это называется Key jamming and ghosting. Сама по себе технология изготовления дешевых клавиатур - две пленки с пересекающимися дорожками - накладывает ограничение на количество одновременных нажатий. Но при этом экономит материалы - не надо вести два провода к каждой кнопке! Т.е. из матрицы n + m проводов получается сделать аж n * m кнопок. Но это вызывает проблему определения одновременных нажатий:
Например, кнопки A, B, C, D могут быть реализованы двумя парами дорожек: A1, A2, B1, B2:
A замыкает A1, B1 B замыкает A1, B2 C замыкает A2, B1 D замыкает A2, B2
и вот при нажатии одновременно на A+B+C получаются замкнуты еще и A2, B2, хотя D не нажата. Это эффект Keyboard Ghosting. D - кнопка-призрак.
Это не так страшно при наборе текста - но вот в играх это вызывает неприятный эффект. Пытался подпрыгнуть и повернуть одновременно - и бросил себе под ноги гранату.
Производители клавиатур решают эту следующими хаками:
делают разводку, которая учитывает стандартные раскладки в играх (WASD) для того же WASD впаивают isolation diodes (что удорожает клавиатуру) для всех остальных проблемных комбинаций - тупо игнорируют их и выдают ошибку
Последнее называется Keyboard Jamming, и вот именно его вы и наблюдаете. Для дешевых клавиатур это срабатывает примерно на 5% трехбуквенных комбинаций.
Объяснение проблемы и тулза для теста на сайте MS Applied Sciences
Статья в вики на эту тему

Автогенерируемые конструкторы и операторы присваивания rvalue

Читаю Прата С++ 2015 стр 1072.
В одном абзаце он пишет
Если вы не определили конструктор переноса или операцию присваивания с переносом, компилятор не будет автоматически предоставлять конструктор копирования или операцию присваивания с копированием
, а в другом
Например, если определен конструктор переноса, то конструктор по умолчанию, конструктор копирования и операция присваивания с копированием не предоставляются
Что с ним не так? Он сам себе противоречит, можете объяснить что и как генерируется?


Ответ

ИМХО ошибка перевода. Из оригинала с моим переводом:
Конструктор по умолчанию: те же правила, что и в C++98. Генерируется только если класс не содержит определенных пользователем конструкторов.
Деструктор: практически те же правила, что и в C++98; единственное отличие - в том, что по умолчанию деструкторы объявляются как noexcept. Как и в C++98, виртуальный если деструктор базового класса также виртуальный.
Копирующий конструктор: то же поведение, что и в C++98: вызов копирующего конструктора для всех нестатических членов. Генерируется только если в классе нет определенного пользователем копирующего конструктора. Удаляется, если класс определяет операцию перемещения. Генерация этой функции в классе с определенным пользователем копирующим оператором присваивания или деструктором считается устаревшей (deprecated).
Копирующее присваивание: то же поведение, что и в C++98: копирующее присваивание всех нестатических членов. Генерируется только если в классе нет определенного пользователем копирующего присваивания. Удаляется, если в классе присутствует определенная пользователем операция перемещения. Генерация в случае, если в классе есть определенный пользователем копирующий конструктор или деструктор, считается устаревшей (deprecated).
Перемещающий конструктор и перемещающее присваивание: перемещают нестатические члены (соответственно конструктором или присваиванием - прим. АА). Генерируются только если класс не содержит определенных пользователем операций копирования, перемещения, или деструкторов.
Примечание: шаблонные методы не участвуют в этих правилах, то есть не предотвращают генерацию специальных функций, даже если их специализации могут иметь подходящую форму (переформулировал - АА).
UPD: только это, кажется, из другой книги - Effective Modern C++

Инициализация значимых типов в C#

Читаю книгу, написанную Дж. Рихтером, CLR via C#. К сожалению, в самом начале у меня возникают вопросы. Надеюсь, вы поможете мне разобраться.
Джеффри пишет, что различие между значимыми и ссылочными типами заключается в том, что значимые типы хранятся в стеке потока, в то время как ссылочные типы хранятся по принципу: объект типа лежит в управляемой куче, а ссылка на этот объект находится в стеке. Далее он говорит, что ссылка на объект ссылочного типа возвращается оператором 'new'. А для значимых типов возвращать ссылку не нужно, поэтому можно не писать оператор 'new'.
Дж. Рихтер приводит пример:
struct SomeVal { public Int32 x; } // здесь он объявляет структуру SomeVal v1 = new SomeVal();
Потом он добавляет, что строку выше можно записать иначе:
SomeVal v1;
Дословно:
Здесь тоже создается IL-код, который помещает экземпляр SomeVal в стек потока и обнуляет все его поля.
Подскажите, правда ли это? Ведь мы же не можем обратиться к какому-нибудь полю структуры до тех пор, пока не выполним его инициализацию. А по словам Джеффри выходит, что ничего инициализировать не нужно, ведь все поля сами обнуляются.


Ответ

Это правда. Вся выделенная память просто инициализируется нулями.
Ведь мы же не можем обратиться к какому-нибудь полю структуры до тех пор, пока не выполним его инициализацию.
Это проверка C# компилятора, CLR же не накладывает таких ограничений. Книга Рихтера -- она же в первую очередь о CLR, поэтому он не врет.

Замена символов в строке

У меня есть строка: "''Start''". После всех действий над ней, должно получиться: "Start". Т.е удаляются все символы ", а затем все пары символов '' заменяются на " Удаляю из нее все символы " result.erase(std::remove(result.begin(), result.end(), '"' ), result.end());
Затем нужно заменить все пары символов '' на " replace(result.begin(), result.end(), "\'\'", "\"");
Выдает ошибку следующую ошибку:
tools/data_parser.cpp: In function ‘int main(int, const char**)’: tools/data_parser.cpp:21:52: error: no matching function for call to ‘replace(std::__cxx11::basic_string::iterator, std::__cxx11::basic_string::iterator, const char [3], const char [2])’ replace(result.begin(), result.end(), "\'\'", "\""); ^ In file included from /usr/include/c++/5/algorithm:62:0, from tools/data_parser.cpp:7: /usr/include/c++/5/bits/stl_algo.h:4233:5: note: candidate: template void std::replace(_FIter, _FIter, const _Tp&, const _Tp&) replace(_ForwardIterator __first, _ForwardIterator __last, ^ /usr/include/c++/5/bits/stl_algo.h:4233:5: note: template argument deduction/substitution failed: tools/data_parser.cpp:21:52: note: deduced conflicting types for parameter ‘const _Tp’ (‘char [3]’ and ‘char [2]’) replace(result.begin(), result.end(), "\'\'", "\"");
Я так понимаю, что std::replace заменяет только один символ на другой. Как заменить пару символов? Компилирую так: g++-5 -std=c++11 cfg_parser.cpp -o cfg_parser


Ответ

Если я вас правильно понял, то вы можете выполнить задачу следующим образом
#include #include #include
int main() { std::string s( "\"''Start''\"" );
std::cout << '[' << s << ']' << std::endl;
s.erase( std::remove( s.begin(), s.end(), '"' ), s.end() );
for ( std::string::size_type n = 0; ( n = s.find( "''", n ) ) != std::string::npos; ++n ) { s.replace( n, 2, 1, '"' ); }
std::cout << '[' << s << ']' << std::endl; }
Программа имеем следующий вывод на консоль:
["''Start''"] ["Start"]

PostgreSQL восстановление схемы из backup

Столкнулся с проблемой. Необходимо сначала забэкапить, а затем восстановить из бекапа одну из схем базы данных в Posgresql 9.3.9.
Бэкап совершаю следующей командой:
pg_dump business_card_base --schema test > /tmp/test.backup
Обратно пытался восстановить и
pg_dump business_card_base < /tmp/test.backup
и
pg_dump business_card_base --schema test < /tmp/test.backup
схема остаётся пустой.
Подскажите, что я делаю не так?


Ответ

pg_dump только делает дамп базы данных, а восстановлением этих данных не занимается. Посмотрите в свой файл /tmp/test.backup, там SQL-код. Чтобы осуществить восстановление, этот код просто нужно выполнить, например так:
$ psql -f /tmp/test.backup business_card_base

Как найти символы из кортежа ('!',',','?') в строке и удалить их?

Есть кортеж:
a= ('!',',','?')
И строка
dasd,sadarg!ada
Как можно найти символы из кортежа в строке и удалить их?


Ответ

Например, так:
>>> a=('!',',','?') >>> s='dasd,sadarg!ada' >>> ''.join(filter(lambda x: x not in a, s)) 'dasdsadargada'
или
>>> ''.join(x for x in s if x not in a) 'dasdsadargada'
И в том и в другом случае не удаляем символы из старой строки, а создаем новую строку, в которую входят только те символы старой строки, которые удовлетворяют условию "символ x не входит в кортеж а" (x not in a).

Как удалить .NET Framework 4.6?

Вместе с Visual Studio 2015 RTM установил .NET Framework 4.6, в связи с чем получил кучу багов, связанных с Tail Call Optimization, отключение RyuJIT их не лечит - как мне удалить .NET Framework 4.6 и RyuJIT с машины полностью?
Два кейса - удалить с девелоперской машины (Windows 8.1) и удалить с билд-серверов (Windows Server 2012R2).


Ответ

Можно просто скачать .NET 4.6 Offline Installer, запустить - и выбрать опцию Remove.
Если без инсталлера - то откройте Control Panel / Programs / Programs and Features / Installed Updates. Там найдите и удалите:
KB3033095 для RC KB3045557 для RTM
Не уверен насчет точного номера - он не появляется при апгрейде через RC. Если не найдете KB3045557 - то ищите по дате установки.

singleton на python

Релизовал singleton с Wiki(ссылка на вики)
Мой код:
class SpriteManager(object):
def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(SpriteManager, cls).__new__(cls) return cls.instance
def __init__(self):
self.setSprite = set()
Каждый раз при вызове SpriteManager() вызывается конструктур. Согласно концепции singleton, инициализация должна проходить один раз при первом вызове. Как сделать,что бы конструктор вызывался один раз?


Ответ

Могу предложить такой вариант:
class SpriteManager(object): __instance = None
@staticmethod def inst(): if SpriteManager.__instance == None: SpriteManager.__instance = SpriteManager() return SpriteManager.__instance
#single call check def __init__(self): print("Constructor called!")
a = SpriteManager.inst() b = SpriteManager.inst() print(a is b)
По выводу видим, что конструктор вызывается только один раз:
Constructor called! True
Доступ к синглтону осуществляем через функцию inst(), например так:
SpriteManager.inst().update()

Угол между шарами одинаковой массы после столкновения (упругого)

Симулирую столкновения шаров в 2D, сделал столкновения о стенки, теперь встал перед проблемой определения угла между ними после нецентрального удара. Пусть векторы скоростей шаров соответственно равны v1, и v2. Иза за одинаковой массы, как объясняется в матчасти, следует, что шары после столкновения, в этом случае просто обменяются скоростями, а угол между ними всегда будет прямым (как я понял, это угол между направляющими линиями(векторами) шаров после удара). Мне не понятно почему говорится ВСЕГДА этот угол будет прямым ??? Везде даются картинки и пояснения когда этот угол выходит точно в 90 градусов. Сомневаясь до отчаяния, нашёл таки пример удара когда угол не прямой. Например здесь можно построить подобный удар. На рисунках показаны результаты до и после удара.
До удара:
после
Так что же тут происходит ?? Какой тут угол будет всегда прямым ?? Я не вижу тут никаких прямых углов! Что я не понимаю ?? Поясните пожалуйста поподрбней.


Ответ

В моём понимании задачки подобного рода решаются очень просто. На рисунке вверху два изображения. До удара (слева) и после удара (справа). Исходные вектора скоростей взяты произвольно. Кратко разъясню суть.
Шары как-то движутся. Шары ударяются. В момент удара шары деформируются в месте контакта. Энергия деформации на все 100% переходит в кинетическую энергию шаров.
Работает закон сохранения импульса и закон сохранения энергии. Что касается импульса - это величина векторная. Поэтому её(как и скорость) можно разложить на две составляющие. Ось ОХ совмещается с линией, которая соединяет центры шаров. Ось OY ⊥ OX.
Вертикальная(OY) составляющая импульса на удар влияния не оказывает. Поэтому она остается неизменной. А горизонтальными составляющими импульса шары просто обмениваются. Итого:
V2OY = V2*OY V1OY = V1*OY V2OX = V1*OX V1OX = V2*OX
А под 90 градусов шары разлетятся в случае если один из шаров неподвижен.

Как правильно сделать циклический сдвиг в одномерном массиве?

Я новичок в java и у меня возник данный вопрос. Опишу ситуацию: есть двумерный массив типа int 9 на 9, и есть метод, который делает циклический сдвиг в одномерном массиве на заданное количество элементов.
Первое что я сделал это инициализировал первую строку двумерного массива числами от 1 до 9.
private static final int MAX = 9; private static int[][] baseTable = new int[MAX][MAX];
for (int b = 0; b < 9; b++) {
baseTable[0][b] = b + 1;
}
После чего я, сделав сдвиг на один элемент, записал то что получится в 4-ю строчку двумерного массива.
baseTable[3] = CyclicShift.shiftLeft(baseTable[0], 1);
Но тут и возникла проблема: когда функция возвращает сдвинутый массив и записывает его в 4-ю строчку почему-то сдвигается и нулевая строчка, и они, по сути, просто дублирую друг друга. Как я понимаю, они просто ссылаются на одно и тоже место в памяти, и тут возникает вопрос: почему нельзя таким образом проинициализировать строки в массиве?
Вот код метода shiftLeft
public static int[] shiftLeft(int[] a, int iter) { if (a != null) { for (int m = 0; m < iter; m++) { int tmp = a[0]; for (int i = 0; i < a.length - 1; i++) { a[i] = a[i + 1]; } a[a.length - 1] = tmp; } return a; } else { return null; } }
P.S. Проблема была решена сначала полным заполнением всего двумерного массива, а затем сортировкой только тех строк, которых мне нужно, и запись в них же. Но интересует именно механизм работы массива, и то, почему возникает такая ситуация.


Ответ

Тут всё довольно просто. Дело в том, что вы переставляете элементы в том же самом массиве, который и получаете в качестве источника.
Нужно определиться, что же все-таки должен делать ваш метод shiftLeft():
Переставлять элементы в том массиве, который получает Или возвращать новый массив, являющийся перестановкой старого.
Сейчас он делает и то, и другое. А еще вместо того, чтобы сразу перемещать элементы на N позиций, он делает N итераций — это не очень производительно.
Вот вариант, который создает новый массив и записывает в него значения со сдвигом, используя созданный как раз для этих целей метод System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Реализация:
public class ArrayShift {
public static int[] shiftLeft(int[] a, int shift) { if (a != null) { int length = a.length; int[] b = new int[length]; // шаг 1 System.arraycopy(a, shift, b, 0, length - shift); // шаг 2 System.arraycopy(a, 0, b, length - shift, shift); return b; } else { return null; } } }
Вот как это работает.
Шаг 1:
array a: 0 1 2 3 4 5 ↓ ↓ ↓ ↓ array b: _ _ _ _ _ _
Шаг 2:
array a: 0 1 2 3 4 5 ↓ ↓ array b: 2 3 4 5 _ _
Несколько юнит-тестов:
import org.junit.Assert; import org.junit.Test;
public class ArrayShiftTest {
int[] source = {0, 1, 2, 3, 4, 5};
@Test public void testValid() { int[] expected = {2, 3, 4, 5, 0, 1}; Assert.assertArrayEquals(expected, ArrayShift.shiftLeft(source, 2)); }
public void testZero() { Assert.assertArrayEquals(source, ArrayShift.shiftLeft(source, 0)); }
/** * На отрицательных значениях метод сломается * */ @Test(expected = IndexOutOfBoundsException.class) public void testNegative() { ArrayShift.shiftLeft(source, -1); }
/** * На значениях выше длины массива — тоже * */ @Test(expected = IndexOutOfBoundsException.class) public void testExceedLength() { ArrayShift.shiftLeft(source, 10); } }
Если про юнит-тесты непонятно будет, спрашивайте.
Также подскажу вам три пункта, которые вы можете улучшить самостоятельно:
Сдвиг влево и вправо — одно и то же, можно задавать направление положительным и отрицательным значением параметра и объединить shiftLeft и shiftRight Если не объединять методы, то нужно что-то делать при отрицательных значениях Необходимо подумать о значениях, превышающих длину массива

Что такое constructor в JavaScript и для чего он полезен?

Ни как не могу уложить у себя в голове что такое конструктор в JavaScript ? Для чего мы его изменяем и используем ? К примеру:
var Duck = function(name){ this.name = name; };
Duck.prototype.quack = function(){ return this.name + " Duck: Quack-quack!"; };
var TalkingDuck = function(name){ Duck.call(this, name); }
TalkingDuck.prototype = Object.create(Duck.prototype); TalkingDuck.prototype.constructor = TalkingDuck;
Как эффективно мы можем его использовать на практике ? Обьясните это коротко и понятно, или на оборот :)


Ответ

На практике constructor обычно не используется.

Что это такое:
У любой функции f() есть свойство f.prototype, являющееся объектом со свойством constructor, равным самой функции. То есть:
f.prototype.constructor === f
Это означает, что у любого объекта o, сконструированого функцией f, у которой не заменяли prototype, будет выполнено
o.constructor /* === (new f()).constructor */ === f Кроме того, constructor определен у встроенных объектов (Number, Boolean, String, RegExp, ...) и, вследствие "boxing", даже у примитивных значений (1, "asdf", /reg[eE]xp/). У последних его не имеет смысла менять, т.к. изменение касается временно созданного объекта-оболочки над примитивом, и фактически не имеет эффекта.

Некоторые пытаются использовать это свойство, чтобы в методе объекта использовать this.constructor чтобы определить функцию, с помощью которой можно построить такой же объект (пример).

Однако, если заменять prototype, как в вашем примере:
TalkingDuck.prototype = Object.create(Duck.prototype);
..то TalkingDuck.prototype.constructor уже равен Duck, что означает, что new TalkingDuck() уже будет не будет иметь ожидаемый constructor (=== Duck, а не TalkingDuck). Это лечится дополнительным финтом:
TalkingDuck.prototype.constructor = TalkingDuck;
...но чтобы опираться на то что constructor "правильно" установлен для всех объектов, нужно чтобы для каждого из них был проделан этот финт.
Ну а дальше решайте сами - нужен вам такой constructor или нет.

Reflections: анализ модификаторов метода

Мне необходимо выделить из класса protected-методы. Я получаю массив Method[] из метода Class.getDeclaredMethods(), затем анализирую объекты массива. Есть метод Method.getModifiers(), который возвращает, как я понимаю, одну из статических констант класса Modifier. Прикол в том, что у метода модификаторов может быть несколько (типа public static), а у меня в распоряжении только один. Как так то?


Ответ

Метод getModifiers() возвращает битовую маску — самый простой способ представления множества значений (эдакий EnumSet для бедных). Каждый отдельный модификатор в этой битовой маске — это отдельный бит. Например, public — самый младший (нулевой) бит, private — следующий за ним (первый) и так далее. Чтобы проверять, установлен ли i-й бит в битовой маске, надо проверить на ноль результат операции (modifiers & (1 << n)), где n — это номер бита. Для упрощения обычно для возможных значений (1 << n) заводят подходящие константы, которые как раз есть в классе Modifier
Modifier.PUBLIC = 1 << 0 = 1 Modifier.PRIVATE = 1 << 1 = 2 Modifier.PROTECTED = 1 << 2 = 4
И так далее. Соответственно, чтобы узнать, например, объявлен ли метод protected, надо проверить условие method.getModifiers() & Modifier.PROTECTED != 0. Именно это и делают вспомогательные статические методы в классе Modifier, поэтому можно писать ещё проще: Modifier.isProtected(method.getModifiers())

Инициализация двумерного массива по спирали [закрыт]

Задача на собеседовании была: Нужно написать функцию, которая создаст двумерный массив NxN и заполнит его цифрами 1,2,..., NхN по кругу.
Для N = 3 должна получиться матрица:
1 2 3 8 9 4 7 6 5
Для N = 4 должна получиться матрица:
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7


Ответ

Что то вы все какие-то длинные. Да и комментарии явно не по делу. Рекурсия друзья, просто рекурсия.
$w=5; $h=5; //Сюда размер матрицы function s($w,$h,$x,$y){return $y ? $w + s($h - 1, $w, $y - 1, $w - $x - 1) : $x;} for ($i = 0; $i < $h; $i++) { for ($j = 0; $j < $w; $j++) printf("%4d",s($w, $h, $j, $i)); echo "
"; }

Фильтрация textbox


1 - входные данные 2 - выход
Суть программы в том чтобы убрать из textbox все повторы, но по какой-то причине у меня повторяется первый убранный элемент Код: https://gist.github.com/anonymous/82420aad4fd453ebabd6
Прошу не бить тапком, так как программирую на C# первый раз.


Ответ

Так изначальная строка по всей видимости имеет вид
"Андрей Соловьев 10,
Андрей Соловьев 10,
Андрей Соловьев 10..."
и при попытке ее разбить
.Split(new Char[] { ',' });
получаем что
"Андрей Соловьев 10" != "
Андрей Соловьев 10"

Haskell. Хвостовая рекурсия и фибоначчи

Решаю задачу с рядом фибоначчи (+ отрицательные). Приблизительно так:
fibonacci 0 = 0 fibonacci 1 = 1 fibonacci n | n == 0 = 1 | n > 0 = fibonacci (n - 1) + fibonacci (n - 2) | n < 0 = fibonacci (n + 2) - fibonacci (n + 1)
нужно увеличить скорость просчета. для этого естественно нужен аккумулятор.
Как это сделать?


Ответ

Правильнее всего, конечно, использовать готовую формулу n-ого члена :) Но для случая, когда нужно находить программным путём, подходит следующая идея (пишу алгоритм, не знаю синтаксис Хаскеля):
fib n = helper 0 1 n where helper curr prev n | n == 0 = curr | n > 0 = helper (curr+prev) curr (n-1) | n < 0 = helper prev (curr-prev) (n+1)
Это вычисляет последовательность за линейное время с хвостовой рекурсией.

Регулярное выражение. Поиск повторяющихся цифр

Есть вот такая строка:
---011110000-----
Нужно найти 3 повторяющиеся цифры если нет 4-ёх повторяющихся цифр.
Например:
---011110000----- не должно быть совпадений ---01110000------ должно совпасть только с 111 -----0111000----- должно совпасть и с 000 и с 111
Помогите составить регулярку для JavaScript.
P.S. ((?=(\d{1}))\2{3}) это выражение даст совпадение в каждом примере...


Ответ

А как на счёт двух регулярок?
'---011110000-----'.replace(/(\d)\1{3}/g,'-').match(/(\d)\1{2}/g) → null
'---011110000-----'.replace(/(\d)\1{3}/g,'-').match(/(\d)\1{2}/g) → ["111"]
'-----0111000-----'.replace(/(\d)\1{3}/g,'-').match(/(\d)\1{2}/g) → ["111", "000"]
С одной регуляркой удалось только захватить символ, после которого идёт тройка:
'---011110000-----'.match(/(.)(?=(\d)\2{2}(?!\2))(?!\1)/g) → null
'---01110000------'.match(/(.)(?=(\d)\2{2}(?!\2))(?!\1)/g) → ["0"]
'-----0111000-----'.match(/(.)(?=(\d)\2{2}(?!\2))(?!\1)/g) → ["0", "1"]

Перегрузка оператор присвоения

Изучаю язык. Написал простенький класс:
class Point{ public: Point(); Point(int x, int y); private: int _x; int _y; }
Захотел преобразовать его в другой тип. По не знанию и паскалевской привычки написал такой оператор:
int operator=(const Point& src);
Скомпилировал класс вместе с оператором и все нормально скомпилировалось. Решил проверить на коде:
int main(int argc, char *argv[]) { Point pt(1, 2); int i; i = pt; }
Компиляция не удалась:
main.cpp:14: ошибка: cannot convert 'Point' to 'int' in assignment
Потом я нашел как преобразовать тип через другой оператор. Но мне интересно, раз компилятор дал мне скомпилировать этот оператор, значит наверно его, как то можно применить.
Вопрос: Что это оператор делает и как его можно использовать?


Ответ

Надо различать оператор присвоения и функцию преобразования.
Оператор присвоения не меняет тип объекта, которому присваивается выражение.
В вашем примере
class Point{ public: //... int operator=(const Point& src); //... };
оператор присваивания присваивает выражение объекту класса Point. Причем присваиваемое выражение имеет также ссылочный тип класса Point
Вы можете использовать возвращаемое значение выражения с данным оператором присваивания, чтобы присвоить его переменной типа int
Например,
int main(int argc, char *argv[]) { Point pt(1, 2); int i; i = pt = pt; }
Так как операторы присваивания выполняются справа налево, то сначала бы выполнилось присваивание
pt = pt
результатом которого было бы значение типа int, и только во втором присваивании это значение было бы занесено в переменную i
Если же вы хотите написать оператор преобразования, то он может выглядеть следующим образом:
operator int() const;
И тогда вы можете записать
i = pt;
Имейте в виду, что для не пользовательских типов вы не можете переопределить оператор присваивания. И в этом предложении
i = pt;
используется стандартное присваивание для целых чисел. Но так как pt не имеет целочисленный тип, то компилятор пытается его преобразовать к объекту целочисленного типа и вызывает для pt оператор
operator int() const;
если вы его определили. Иначе компилятор выдаст сообщение об ошибке.

Пустой блок catch

Здраствуйте! Так как я студент, и студент такой себе, то я не знаю, можна ли оставлять блок catch пустым? Мне просто-напросто надо, чтобы в случае возникновения Exception`а ничего не делалось, а просто продолжалась работа программы. Меня интересует, есть ли какие-то правила или нормы, которые такого не разрешают?


Ответ

На уровне языка — можно, точно так же как и пустой цикл while. Программа откомпилируется и не будет ворчать во время выполнения.
Но с точки зрения хорошего дизайна, игнорировать исключения нужно довольно редко. Если вы игнорируете исключения, никто (в том числе и вы) не узнает, что что-то в программе идёт не по плану.
Обычно в случае, если произошло исключение, вам должно захотеться известить об этом как-нибудь вышестоящую логику программы, чтобы она не тыкалась в это место постоянно. Если вам действительно хочется подавить исключение, хотя бы залогируйте проблему. Ну и во взрослых проектах имеет смысл оставить комментарий для других разработчиков, объясняющий, почему вы можете/должны проигнорировать исключение в этом месте.

рамка с треугольником

Насколько реально сделать вот такую рамку на css

Где треугольник это часть картинки и картинка может быть любой другой т.е. я хочу сказать, что добавить такой треугольник не подойдет здесь
border: 20px solid transparent; border-left: 20px solid green; border-top: 20px solid green;
В треугольнике часть картинки находится а не просто цвет. Вообщем как сделать такую рамку на css?


Ответ

Подсмотрев одну идею в интернете, я немного попробовал помудрил и получилось вот что:
html:




css:
/* photo original width: 604px; photo original height: 592px; */ .tooltip-wrap { position: relative; width: 450px; }
.tooltip-content { position: relative; height: 200px; border: 3px solid blue; border-radius: 20px; overflow: hidden; }
.tooltip-triangle { position: absolute; overflow: hidden; margin: 0 auto; width: 300px; height: 156px; border-left: 3px solid blue; bottom: -153px; left: 78px; }
.tooltip-triangle-wrap { width: 604px; height: 592px; }
.tooltip-triangle-wrap { overflow: hidden; position: absolute;
transform: skewX(-55.98deg); border-right: 3px solid blue; }
.tooltip-triangle-wrap:first-child { transform-origin: 100% 0; position: absolute; bottom: -234px; left: -78px; }
.tooltip-triangle-wrap:last-child { right: -.25em; transform-origin: 0 100%; }
.tooltip-triangle-wrap img, .tooltip-triangle-wrap:after { transform: skewX(55.98deg); transform-origin: inherit; }
Пример
Вам придется немного адаптировать величины ширины высоты и позиций для себя.
По идее, немного поманипулировав шириной и высотой тултипа, и треугольника, а также расположением треугольника и картинки внутри как вам надо - можно будет просто скриптом менять картинки как вам надо.
Если хотите, то можете попробовать оттолкнуться от этого примера: jsfiddle.net

Как узнать время сервера из присланного ответа POST запроса?

Как вытащить время сервера из ответа, который пришел на POST запрос? Для отправки POST запроса с Android используется библиотека OKHTTP.
String post(String...url) throws IOException { FormEncodingBuilder form = new FormEncodingBuilder(); RequestBody formBody =form.build(); Request request = new Request.Builder() .header("Cookie", x) .url(url[0]) .post(formBody) .build(); Response response = client.newCall(request).execute(); return response.body().string(); }


Ответ

В Response есть параметр Date, в котором передается текущее время сервера.
Пример Response Headers
Date: Fri, 13 Nov 2015 23:24:28 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive
Но в вашем методе post() возвращается только body, тогда как Date хранится в headers
Соответственно пример кода для получения даты:
Date post(String...url) throws IOException { FormEncodingBuilder form = new FormEncodingBuilder(); RequestBody formBody =form.build(); Request request = new Request.Builder() .header("Cookie", x) .url(url[0]) .post(formBody) .build(); Response response = client.newCall(request).execute(); //return response.body().string(); //Возвращается только Body. return response.headers().getDate("Date"); //Возвращаем объект Date. }

Сессии и DAO классы в Hibernate

Здравствуйте.
Есть маленький проектик работающий с БД. В качестве ORM решения выбран Hibernate 4.
Попутно обуздывая фреймворк, создал классы сущностей, связал аннотациями, использовал DAO pattern. Но: в имплементации ДАО классов в каждом изменяющем БД методе сессия открывалась и закрывалась прямо в методе (как и в этой туториал ссылочке http://javaxblog.ru/article/java-hibernate-1/). Пример
Session session = null; try { session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); // Здесь добавляю, обновляю или удаляю // ... session.getTransaction().commit(); } catch (Exception e) { // Обрабатываю // rollback() } finally { // Закрываю if (session != null && session.isOpen()) { session.close(); } }
Но что-то подсказывает, что это как-то, мягко говоря, не правильно. Порыв немного интернет, наткнулся на статейку (https://developer.jboss.org/wiki/GenericDataAccessObjects), где говорится, что ДАО имплементации не должны создавать сессию внутри, а на неё нужно лишь ссылаться. Если я правильно понял, ДАО имплементаций не должно волновать создание сессий.
You could also use constructor injection. How you set the Session and what scope this Session has is of no concern to the actual DAO implementation. A DAO should not control transactions or the Session scope.
Интересует вопрос опытных разработчиков: создавать ли сессию один раз на всё приложение и просто в сеттере давать ссылочку ДАО классам (при этом сессию не закрывать), или же в каждом методе ДАО класса создавать и закрывать сессию?


Ответ

Использование ссылки на SessionFactory внутри реализации DAO и создание сессии на каждый вызов дао методов. Для массивных изменений рекомендуется batch update.

Многопоточный веб сервер на C++

Здравствуйте. Интересует правильная реализация многопоточности веб сервера на C++. Проблема в следующем: Раньше я думал что для того чтобы сервер был многопоточным, достаточно лишь после принятия запроса от клиента создать для него новый поток, с помощью CreateThread, и так для каждого клиента.
Но позже узнал, что нет смысла создавать потоков больше чем количество логических процессоров в системе, так как будут потери при переключении между потоками, и программа будет работать медленнее.
Так как же быть? С одной стороны, на всяких хабрах и блогах пишут что достаточно создать поток функцией CreateThread. С другой стороны некий гуру пишет, что 100-200 потоков одновременно очень сильно снижают производительность на обычном компьютере.


Ответ

В целом, вы все верно пишете, но я бы сместил акценты. Машину действительно можно загрузить двумя сотнями потоков, но это не значит, что они ее обязательно загрузят или что это решение будет грузить меньше других - у любого сервиса есть предел, после которого он превращается в тыкву. В принципе, у вас три основных варианта: синхронная обработка запросов, которая будет очень медленной, многопоточная обработка запросов, и, наконец, асинхронная обработка запросов в том или ином виде, под которой я прячу всякие модели типа event loop и всё остальное. Последний вариант наиболее производительный, но очень сложный, и нужный только в таких монстрах, как nginx - вам для ваших целей наверняка хватит простой многопоточной обработки. Скорее всего, у вас внутри сервера не раз встретится такая штука, как блокирующее ожидание, во время которого процессор ждет ответа от внешнего сервера (базы данных) или файловой системы - в это время другие ОС передаст управление другим потокам, и вы окажетесь только в выигрыше. Единственная проблема, которую вносит многопоточная схема - это момент, при котором количество приходящих запросов начинает превышать количество запросов, которые может обработать сервер, и появляющиеся снова потоки начинают отбирать процессорное время, ухудшая производительность. Здесь, наконец, и появляется то, ради чего я писал весь этот ответ.
Вам не стоит делать createThread(). Создавать поток на каждый запрос печально по двум причинам - во-первых, это ненужные расходы на новый тред, а во-вторых - отсутствие контроля за количеством тредов, которое решило бы вышеозвученную проблему с переполнением сервера. Вам нужно реализовать пул тредов фиксированной величины; максимальная вместимость пула - это то, сколько одновременных запросов готов обработать сервер, а свежепришедшие запросы будут вынуждены ждать освобождения рабочего треда, что позволит сервису не превратиться-таки в тыкву. При этом размер пула может быть как равен числу процессоров, так и ичисляться сотнями - тут сложно посоветовать что-то конкретное, но в текущем проекте поднятие лимита с двадцати до пятисот тредов во встроенном сервере дало прирост производительности в десять раз (на самом деле не прирост, а более эффективное использование ресурсов, да и число в пятьсот было взято с потолка, и, наверное, стоит его уменьшить).
В общем, не волнуйтесь так сильно за модель, она более чем рабочая. Не забывайте только ограничивать возможности сервиса сверху.

Как разобрать matrix на scale, rotate, translate, skew?

Дело такое, getComputedStyle(element).getPropertyValue("transform") возвращает matrix(a, c, b, d, tx, ty). C translate всё вроде бы просто: translateX = tx, translateY = ty. А вот как вытащить scale, rotate, skew я немного не понимаю потому как во первых в rotate и scale должны быть градусы, во вторых: вроде как skewX = b, skewY = c, а scaleX = a, scaleY = d, но при этом что бы повернуть элемент в матрице a = cos(x), b = sin(x), c = -sin(x), d cos(x). Вообщем из набора параметров matrix я бы ещё составил а вот из matrix вытащить параметры вообще не понимаю как. Подскажите пожалуйста как перевести матрицу в понятный простому человеку язык или подскажите как можно получить свойство transform не в matrix, а в scale, rotate, translate, skew?


Ответ

В черновике спецификации описано какие значения, что означают.
Трансформации осуществляются с помощью матрицы трансформаций, в общем случае (3D) матрица 4х4

Матрица, которую вы получаете matrix(a, c, b, d, tx, ty) представляется в следующем виде:

Как вы правильно отметили: tx, ty - отвечают за перемещение.
За масштабирование отвечают значения лежащий на главной диагонали, в нашем случае это a,d, при это a - масштабирование по ширине, d - по высоте.
c,b - отвечают за наклон
и все вместе a,b,c,d - за поворот.
Подробнее можно увидеть на картинке

Такие преобразования называются Афинными, подробнее о них можно узнать:
Wikipedia: Афинные преобразования Аффинное преобразование и его матричное представление

Как в консоли указать начальное значение при вводе?

Дефолтное значение - это хорошо. Но что, когда дефолтное значение - это длинная строка, а у нее надо изменить 1 символ? Не хотелось бы набирать его вручную полностью (тем более это повышает шанс допустить опечатку)
Есть ли возможность сделать ввод через Console.ReadLine так, чтобы уже было введено какое то значение?


Ответ

Вариант без SendKeys, из аналогичного вопроса на английском
// write the initial buffer char[] buffer = "Initial text".ToCharArray(); Console.WriteLine(buffer);
// ensure the cursor starts off on the line of the text by moving it up one line Console.SetCursorPosition(Console.CursorLeft + buffer.Length, Console.CursorTop - 1);
// process the key presses in a loop until the user presses enter // (this might need to be a bit more sophisticated - what about escape?) ConsoleKeyInfo keyInfo = Console.ReadKey(true); while (keyInfo.Key != ConsoleKey.Enter) {
switch (keyInfo.Key) { case ConsoleKey.LeftArrow: ... // process the left key by moving the cursor position // need to keep track of the position in the buffer
// if the user presses another key then update the text in our buffer // and draw the character on the screen
// there are lots of cases that would need to be processed (backspace, delete etc) } keyInfo = Console.ReadKey(true); }

Необходимо ли папки 'packages' в C# проекте хранить в git-репозитории проекта?

У меня есть два два проекта HelloWorld и HelloWorld.UnitTests. Во втором применив nuget я установил NUnit, в результате чего создана папка packages. Использую Visual Studio 2013.
Сейчас репозиторий выглядит так:
.\HelloWorld\ .\HelloWorld.UnitTests\ .\HelloWorld.UnitTests\packages.config .\packages\ .\HelloWorld.sln
Папка packages появилась после того как сделал активным проект HelloWorld.UnitTests и применил команду Install-Package NUget в консоли.
В Python-е, есть так называемые файлы зависимостей и можно применить команду pip install -r requirements.txt. Но в C# такого решения не нашел. Меня смущает, что видимо придется хранить множество dll-файлов, хотя логичнее было бы в репозитории хранить файл зависимостей, аналогичный python-овскому решению с requirements.txt файлом.
Правильно ли я понимаю, что мне все-таки придется эту папку хранить в репозитории проекта?


Ответ

Основной способ подключения/удаления зависимостей в проект является nuget. В папке проекта у вас должен быть файл packages.config. В нем хранятся данные об используемых в проекте nuget-пакетах. Добавлять в VCS нужно именно его. На основании содержащихся в нем данных будут скачаны необходимые пакеты. Dll'ки же включать необязательно. Пример: