Страницы

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

среда, 5 декабря 2018 г.

Составить формулу на языке программирования

Не могу придумать как составить формулу, если A = 10, B = 25, C = 15, а R=40. Нужно узнать сколько есть вариантов составить набор из элементов A,B,C ,чтобы сумма их была именно равна R. В Данном случае 40. То есть на этом примере ответом будет 3 т.к.
A+A+A+A = R C+C+A = R B+C = R
А как это все записать формулу, чтобы программа считала сумму возможных вариантов?


Ответ

Можно также решить рекурсией, но без полного перебора.
Наши исходные A = 10, B = 25, C = 15, а R=40 можно представить в виде линейного уравнения
Ax+By+Cz=R
Теперь нам нужно найти все возможные варианты коэффициентов x,y,z доступные нам в данном случае. Сделать это можно получив целое от деления R на А и потом инкрементно получаем все возможные x, сохраняем. Повоторяем это для B и С. После уже запускаем в рекурсии ищем возможные варианты.
Думаю если изучить методы решения систем линейных алгебраических уравнений можно найти что то лучше.
r = 40; a = [10,25,15]; b = []; //находим коэффициенты a.forEach(function(e,indx){ i = parseInt(r/e); b[indx] = []; while(i>=0){ b[indx][b[indx].length]=i--; } }); out = []; //ищем решения function recursion(i,sum=0,_sum=""){ b[i].forEach(function(e, indx){ sm=a[i]*e+sum; tmp = e>0?((_sum!=""?_sum+"+":"")+"("+a[i]+"*"+e+")"):_sum; if(sm==r){ out[out.length]=tmp; } else if( sm

Разделить строку на слова и вывести их на печать по одному

Как сделать программу, используя функцию. Вводишь строку из несколько слов с пробелами. Находишь все слова и выводишь все слова отдельными строчками. Что я делаю не так?
str1 = str(input()) i = 0 k = 0 list = []
def space(str1): return(str1) while k <= len(str1): if str1(i) != " ": list.append(str(i)) return(list) i += 1 k += 1
mini_list = space(str1) print(mini_list)


Ответ

Находишь все слова
Зря вы перебираете строку посимвольно в поисках пробелов.
Во-первых, бывают и другие пробельные символы, например, неразрывный пробел или табуляция. Они тоже разделяют строку на слова. Во-вторых, для деления строки на слова в Python 3 есть метод str.split(). Он разбивает строку по заданному разделителю, а если не указывать разделитель (т.е. по умолчанию) — по пробельным символам (конкретно: space, tab, newline, return, formfeed). Возвращает список строк, на которые поделил исходную.
Вот так:
words = input().split()
Заметьте, что str(input()) не нужно, input() и так возвращает строку.
Чтобы вывести каждое слово, достаточно перебрать список и каждое напечатать.
for word in words: print(word)
Оба действия можно объединить для лаконичности:
for word in input().split(): print(word)

Отрисовать спираль на сайте

Интересует какими лучше способами нарисовать (анимировать само рисование спирали) спираль Ферма на сайте? (Чтобы пользователь видел как она рисуется) Можно ли её сделать на чистом css? А если я хочу анимировать её с помощью математической функции это только в js? P.S. Прошу не давать готовых решений, а направить какими средствами её можно реализовать.


Ответ

Спираль - это не html-элемент, поэтому и средства css для ее рисования (в смысле - анимированного создания из ничего) в чистом виде здесь применить не получится.
Я вижу три варианта:
Один из вариантов уже описали здесь - представить что спираль это картинка, или див с картинкой в фоне и не меняя размер фона увеличить див - фон постепенно появится полностью, типа "отрисовался", ага )) Второй вариант - это положить эту спираль картинкой svg - это уже логичнее, всё таки это по сути векторный элемент, у которого внутри линия. И сделать постепенную прорисовку линии например при помощи vivus.js JS-рисование при помощи канвас.
Вот как-то так, выбирай )

Расширение и сужение типов

Допутим у меня есть иреархия классов. Во главе иерархии стоит класс А, за ним B, C и тд. Наследуются друг от друга. Уместно ли будет делать такое? A obj = new B(); //(Расширение) B obj = new A(); //(Сужение)


Ответ

Нельзя наследнику присвоить предка. Только если Вы предку (указателю на объект-предок) заранее присвоили указатель на объект-потомок, то обратное присваивание выполнять можно.
UPD
class A { ... }
class B extends A { ... }
... B b = new B(); A a = b; // можно B c = (B) a; // можно
A a1 = new A(); B b1 = a1; // нельзя

Есть ли способ перевернуть текст на css?

мне кажется что для этого использовать js лишнее
var container = document.querySelector("article p"); var arr = container.innerHTML.split(/\s+/); var str = ''; for (var i = 0; i < arr.length; i++) { if (arr[i]) { arr[i] = '' + arr[i] + ''; } } container.innerHTML = arr.join(' '); * { margin: 0; padding: 0; } article { display: inline-block; padding: 10px 20px; border: 1px solid red; transform: rotate(0deg); margin-left: 300px; } article span { display: block; color: red; font-size: 18px; text-transform: uppercase; font-family: 'Lobster', cursive; }

t e x t - r o t a t i o n



Ответ

Можно попробовать что-то такое:
article { display: inline-block; padding: 10px 20px; border: 1px solid red; margin-left: 300px; color: red; font-size: 18px; text-transform: uppercase; font-family: 'Lobster', cursive; width: .75em; }

t e x t - r o t a t i o n

или такое
article { display: inline-block; padding: 10px 20px; border: 1px solid red; margin-left: 300px; color: red; font-size: 18px; text-transform: uppercase; font-family: 'Lobster', cursive; width: .75em; word-break: break-word; word-wrap: break-word; }
text-rotation

Длина строки в чистом C

У меня есть такой прототип функции: int len(const char *string);. Как мне ее реализовать ? Я ведь знаю только адрес первого символа. Могу ли я как-то узнать сколько их всего ?


Ответ

Можете, но только если вызывающий совершенно точно даёт вам именно строку
В Си всякая строка является массивом символов. Но не всякий массив символов можно считать строкой.
На уровне системы типов Си не различает их вовсе. Всё держится на уговоре, что в конце указанной (началом) области памяти точно есть нуль-символ, в противном случае считать её строкой не следует, и работать с ней даже стандартными функциями для строк опасно.
О сишных строках известно, что:
Символы в них идут в памяти подряд по возрастанию указателей. Первый встреченный символ с кодом 0 (нуль-символ) — конец строки. Каждый символ содержится в одном char'е. Это здорово ограничивает множество совместимых кодировок (из известных русскоязычных на ПК: Windows-1251, CP866, KOI8-r), но для учебных задач это часто предполагают. Если строка окажется, например, в UTF-8, функция не упадёт (т. к. нуль там такой же), но результат может дать неверный (если ожидается число символов).
Считать ли завершающий ноль как занимающий длину... есть аргументы в обе стороны.
С одной стороны, этот нуль-символ не входит в "полезную нагрузку" строки, это чисто служебный элемент. Общепринято, так считает strlen С другой, нуль-символ занимает место и его существование нужно учитывать при выделении пространства для хранения.

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

Я пробовал вот это  , но это - не длинный, что мне делать?


Ответ

Это Html. Первый способ     Второй способ Text

Что означает конструкция for(;;) без параметров?

Что означает такая конструкция?
for(;;) { //операторы }
Понятно, что цикл for, но что с его параметрами?


Ответ

Это бесконечный цикл (эквивалентно while(true) {}). Иногда такое нужно. Выход из него обычно по break, или по return

Вызов конструктора из конструктора

Не могу понять, как это сделать, помогите кто знает.
Знаю что элементарно, но все же:
есть два конструктора, один конструктор (без аргументов) должен вызывать второй конструктор (с аргументом типа int).
public class MyInitTest { private String a; private double c;
{ a = "non-static initialization block "; System.out.println(a); }
{ c = 20.03652; System.out.println(c + a); }
static private String string; static private int anInt;
static { string = "Static block"; System.out.println(string); }
static { anInt = 6; System.out.println(anInt + "Static block"); } public MyInitTest(){
} public MyInitTest(int){
} }


Ответ

public class Privet {
public Privet(){ this(1); // Этот конструктор вызывает конструктор с параметром }
public Privet(int a){ // ... } }

Разница между override и virtual

Помогите, пожалуйста, разобраться. Документацию долго перечитывал, а в сети только сравнения new и override


Ответ

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

Простой IDE для JavaScript [закрыт]

Followup к теме Имеет ли смысл учить ребенка ООП
Начать вбивать в голову оболтусу основы JavaScript'а, дело вроде движется.
Писать в нотепаде это конечно хорошо, но надо бы приучать к IDE и сразу же стал вопрос по-поводу выбора IDE. Я сам обычно для этих целей всегда использовал Eclipse, но тут как-то тяжеловато получается.
Итак вопрос: подскажите небольшой, простенький IDE для JavaScript'а, который бы подсвечивал синтаксис, подсказывал методы/функции и позволял на ходу просмотреть исполнение в встроенном браузере (ну или запускал внешний браузер). Если бы поддерживал jQuery вообще было бы супер.
P.S. Оболтусу 11 лет!


Ответ

Мне бы отца программиста, пустил слезу :)
При изучении JavaScript и jQuery тоже хотел себе найти хороший IDE и в результате напоролся на статейку клик, почитайте.
А вот собственно программа Visual Web Developer 2010 Express

Несколько классов в одном java-файле

Можно ли в одном Java-файле содержать несколько классов и интерфейсов к ним ? Как лучше организовать их структуру, если нужно их все (к примеру, 4 класса и интерфейса) использовать ?


Ответ

// файл MainClass.java
public class MainClass {
// скрытый внутренний класс. Виден только внутри класса MainClass. private class MyInnerClass { }
// скрытый интерфейс. Доступен внутри класса MainClass. private interface MyInnerInterface { }
// Доступен везде, но создан может быть только изнутри MainClass public class MyPublicInnerClass {}
// Доступен везде. Может быть создан в статическом контексте. // В отличие от обычных inner-классов, не имеет доступа к членам MainClass. public static class MyStaticClass {} }
// класс доступен в рамках пакета class TestClass { }
// интерфейс доступен в рамках пакета interface TestInterface { } Только имейте в виду, что классы TestClass и TestInterface будут package-private, т.е. будут видимы только в рамках пакета. Однако, всё же не следует злоупотреблять этими возможностями. Используйте их с осторожностью и по возможностью выносите классы в отдельные файлы.

Преобразование числа в строку

Как средствами языка с++ преобразовать число в текст и вывести на консоль? Например: float x = 0.05f; char *str;
//str = x


Ответ

Вариант 1. #include
printf("Number is %f
", x); Вариант 2. #include
std::cout << "Number is " << std::scientific << x << std::endl;

Как найти сумму чисел из массива в java?

Пытаюсь получить сумму всех чисел
Например:
public static void testArray() { int myArray[] = {3,5,7,12}; for(int i=0; i=myArray.length-1){ i2=0; i2=0; } int sum=myArray[i]+myArray[i2]; System.out.println(sum); } }
Да, да, я знаю, что этот код - кусок бреда, который даже близко не выполняет свою функцию, но я уже голову себе сломал и далеко я не математик (и не программист).
Как же мне найти сумму чисел в массиве, при условии что длина массива может быть произвольной, а числа в нем разные, не имеющие какой либо последовательности?


Ответ

Честно не понял вопроса. В начале говорится - пытаюсь получит сумму некоторых чисел... а что значит некоторых?? Если всех чисел, то это очень просто сделать public static void testArray() { int myArray[] = {3,5,7,12}; int sum=0; for(int i=0; i

Как обрезать строку до заданного количества символов

Есть переменная String mawa;, в которой хранится некий текст.
Как сделать так, чтобы этот текст обрезался до 25 символов?


Ответ

mawa = mawa.substring(startindex, endindex);
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int%29

Почему в java рекомендуется называть класс с большой буквы?

Почему в java рекомендуется называть класс с большой буквы?


Ответ

Для начала, давайте ответим на вопрос: а почему вообще нужны какие-то рекомендации по называнию классов? Вот бы каждый писал как ему вздумается, было бы наверное неплохо? На самом деле, не так уж и хорошо. Дело в том, что в серьёзных проектах большая часть времени расходуется не на написание кода, а на его поддержку. Причём код поддерживает обычно не тот, кто его написал. Если код написан в одинаковом стиле, его легче понимать: не приходится подстраиваться под индивидуальный стиль каждого нового автора. Поэтому руководители крупных проектов часто (если не всегда) требуют от программистов соблюдения общепринятого стиля. Почему этим правилам должны следовать вы, если вы не пишете большой коммерческий проект? Потому что вам же будет лучше: вы привыкнете писать код в определённом стиле, и когда пойдёте на работу, ваш стиль будет выглядеть профессионально, что вызывает положительное отношение к вам. И вам не придётся привыкать к стилю других, что тоже немаловажно: в первые недели работы в новой компании и так много трудностей. Отлично, почему же именно с большой буквы? Дело в том, что надо было установить хоть какое-то правило. Сообщество Java приняло такой стандарт (а может, Гослингу так понравилось), более-менее произвольно, важно было лишь чтобы стандарт существовал. И теперь нам ничего не остаётся, как следовать этому стандарту. Кстати, в Java есть ещё много других правил именования. Вот они все: http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html Для классов (вольный перевод): Имя класса должно быть существительным. Если оно состоит из нескольких слов, слова пишутся вместе, каждое с большой буквы. Старайтесь, чтобы ваши имена классов были простыми и выразительными. Избегайте сокращений и аббревиатур (за исключением популярных и устоявшихся, наподобие URL или HTML).

Написание 3D-игры [закрыт]

Здравствуйте! Я хочу научиться создавать 3D-игры на PC, но ничего об этом не знаю. Помогите, пожалуйста, что мне изучать? Какими программами это реализуется? Также буду рад ссылкам на статьи, мануалы и вообще информации любого рода. P.S. Сложность игры планирую наращивать поэтапно: Перемещение по трехмерному уровню. Добавление цели, до которой необходимо добраться. Добавление на уровень движущихся объектов (платформы, лифты и т.д.), анимация движения. Добавление кнопок, изменяющих положение объектов на уровне (открыть/закрыть дверь; поднять/опустить лифт и т.д.). Добавление противников, наращивание AI. Спасибо.


Ответ

Если Вы являетесь новичком, безусловно, лучшим стартом будет являться книга: "Программирование на С++", авторы: Дирк Хенкеманс, Марк Ли. Она рассчитана как раз для начинающих (не знакомых с С++ или любым другим ЯП), и нацелена прежде всего на разработку игровых приложений (один из авторов - работник BioWare). С языком С++ при разработке игр вам рано или поздно придется столкнуться, как бы Вы не хотели этого избежать. После этого старта логичным будет прочесть книги OpenGL или DirectX (любую). Неплохим выбором может стать подборка отсюда: блог серьезной дамы , а дальше у Вас уже должен сформироваться свой взгляд на то, какой язык и технологии использовать в своей работе. P.S.: не советую на начальном этапе упираться в мобильные приложения или сетевые игры.

Указатели и ссылки [дубликат]

На данный вопрос уже ответили: Чем отличаются ссылки от указателей в С++ 2 ответа Чем отличается ссылка от указателя? Почему при условиях
int *p; int t=100;
выражения
*p=100; *p=&t;
корректны, а
*p=t
некорректно.
Зачем эти сложности вообще? И если можно, как всегда примерчик, раскрывающий хотя бы кусочек глубокой (я так понимаю)идеи ссылок и указателей.
P.S. Уточняю, прочитав все выше, я понял где то так:
struct big{/*some_very_large_struct*/}; struct big baobab;
void doSomething(struct big boom) { /*do something with boom*/ };
void doSomething1(struct big *boom) { /*do something with boom*/ };
void doSomething2(struct big& boom) { /*do something with boom*/ };
int main { void doSomething(baobab);//эта функция принимает целую копию структуры для работы void doSomething1(&baobab);//эта функция принимает номер ячейки где искать структуру для работы void doSomething2(baobab);//эта функция принимает "живую" структуру, но работает с ссылкой на нее return 0; };


Ответ

Что-то Вы, видимо, не то читали… Обычно в книжках крайне понятно излагают…
Так, на пальцах:

Вот у Вас есть переменная int a. Это такая буковка, с помощью которой компилятор умеет определить, о чём Вы ему говорите. Он знает, что за буковкой a кроется значение в памяти, расположенное по какому-то адресу (адрес в памяти — это число). Ну, Вы же понимаете, что переменная — это такая штука, чтобы удобно по имени обращаться к данным, записанным в определённом участке памяти.
Так вот, указатель — это, тупо, то самое число, тот самый адрес. Т.е. &a равно именно в точности адресу в памяти, по которому хранится значение. Чтобы избежать невнятных проблем, тип «указатель на int (или на любой другой тип) — int*» — это такой совершенно отдельный тип.
Итак есть два волшебных оператора: * и &. Второй по данной переменной узнаёт её адрес в памяти. Первый по данному адресу (который, как мы помним, хранится в переменной типа int*) возвращает собственно данные, расположенные по этому адресу.
int a = 566; // Завели переменную. Число 566 записалось в память по какому-то адресу
// &a — адрес, по которому записалось число
int *p; // Переменная типа «указатель на int» // На самом деле понятно, что все указатели на все типы — одна малина. Это просто // 32-битные числа. Но C++ строго типизированный язык, потому нельзя непосредственно // присвоить char* к int*
// Зато можно присвоить int* к int* p = &a; // Как мы помним, &a возвращает адрес в памяти
int b = *p; // Теперь в переменной b лежит ЗНАЧЕНИЕ, которое находится по адресу, на который // указывает p (а как мы знаем, p указыает туда, где лежит значение a)
b == a; // Это верно
// На данный момент у нас в переменных a и b лежит одно и то же число.
int *p2 = &b; // Теперь p указывает на a, а p2 — на b. // a=566, b=566, *p=566, *p2=566
*p2 = 777; // По адресу, на который указывает p2, положили число 777. Как мы помним, p2 // указывает туда, где лежит значение b. Значит теперь b = 777.
p = &b; // Теперь оба указателя указывают на одну и ту же ячейку в памяти.
// Ну и так далее

Про ссылки чуть попозже напишу. Или кто-нибудь другой напишет…

Какой серверный язык выбрать, если я собираюсь стать специалистом по javascript? [закрыт]

Сейчас я плотно занялся изучением javascript. И мне этот язык очень нравится. Но не одним фронт-эндом жив человек как говорится. Так что же мне изучать еще в качестве серверного языка? Посоветуйте. PHP? Python? Perl? Java? C#? PHP все ругают, Perl вроде как медленно уходит в прошлое (или я не прав?), Java мне нравится, но у этого языка столько разных ипостасей, что я теряюсь. Может C#?


Ответ

А я бы посоветовал Вам попробовать все. Если есть какой-то язык, то у него есть поклонники, которые с пеной у рта будут доказывать превосходство своего языка. И здесь только кто кого перекричит. В сегодняшнем мире нельзя быть узким специалистом. Чем больше языков/систем Вы знаете, тем лучше Вы как специалист. Тем осознанней Ваш выбор основного языка для себя. К тому же не следует забывать, что разные задачи иной раз требуют для себя разных языков. А иногда заказчик привередничает. Один совет - выбирайте системы с открытым кодом. MSDN - это конечно хорошо, но когда Вы можете сами залезть в исходник и все увидеть... К тому же в случае, если сама система имеет открытый код, то к ней очень много решений с открытым кодом, по которым можно учиться.

Как заверстать косую линию на весь экран между секциями?


Собственно на картинке косая линия, как ее заверстать так чтобы адекватно смотрелось и десктопе и на мобильном


Ответ

1). Вступление.
Вы пишите:
Собственно на картинке косая линия, как ее заверстать так чтобы адекватно смотрелось и десктопе и на мобильном
Ответ:
Вначале важно разобраться, что значит «адекватно». В верстке, когда речь заходит про адаптивный дизайн, зачастую бывает два варианта:
У нас уже есть макет с дизайном для мобильной версии/планшета. Следовательно мы и делаем так как в данном макете. Может быть совершенно "неадекватно", но что делать, такой дизайн и нужно верстать. У нас нет макета с дизайном для мобильной версии/планшета. И это остается на усмотрение верстальщика, т.е. на наше усмотрение. Предположим, что это наш вариант.
2). Реализация.
У нас не просто косая линия, а есть еще цветной бордюр, который нужно реализовать.
Если необходимо сделать просто косую линию, я могу порекомендовать данную статью, там описывается как сделать такую линию, многими способами.
Наш вариант, с бордюром, я сделал так(лучше смотреть, нажав на кнопку «На всю страницу»):
body { overflow-x: hidden; } .section-one { background-color: #5FC18B; position: relative; padding: 200px 0 350px; } .section-one .section-one__title { color: #fff; font-size: 35px; margin-bottom: 30px; text-align: center; } .section-one .section-one__descr { color: #fff; font-size: 16px; line-height: 1.5; max-width: 300px; margin: 0 auto; text-align: center; } .section-two { background-color: #44a36f; padding: 100px 0 200px; position: relative; z-index: 10; } .section-two .section-two__title { color: #fff; font-size: 35px; margin-bottom: 30px; text-align: center; } .section-two .section-two__descr { color: #fff; font-size: 16px; line-height: 1.5; max-width: 300px; margin: 0 auto; text-align: center; } /* ------------------------------------------------------------------------- begin Separator * ------------------------------------------------------------------------- */ .separator { bottom: -4px; left: 0; overflow: hidden; position: absolute; width: 100%; } /* ------------------------------------------------------------------------- end Separator * ------------------------------------------------------------------------- */

Awesome Section - 1

Not far stuff she think the jokes. Going as by do known noise he wrote round leave. Warmly put branch people narrow see. Winding its waiting yet parlors married own feeling. Marry fruit do spite jokes an times. Whether at it unknown warrant herself winding if. Him same none name sake had post love. An busy feel form hand am up help. Parties it brother amongst an fortune of. Twenty behind wicket why age now itself ten.

Awesome Section - 2

From they fine john he give of rich he. They age and draw mrs like. Improving end distrusts may instantly was household applauded incommode. Why kept very ever home mrs. Considered sympathize ten uncommonly occasional assistance sufficient not. Letter of on become he tended active enable to. Vicinity relation sensible sociable surprise screened no up as.


В примерах используется normalize.css.
Все готово. Адаптивно, и поддержка IE-9+. Это довольно простой код на SVG, написан вручную.
Стоит отметить, что адаптивный дизайн зачастую разрабатывается для мобильных max-width: 320px (iphone-5). И смотря на наш блок, на данном разрешении, косая линия выглядит слишком косой :)
Поэтому, напишем медиа-запрос, для примера возьмем breakpoint bootstrap-3:
body { overflow-x: hidden; } .section-one { background-color: #5FC18B; position: relative; padding: 200px 0 350px; } .section-one .section-one__title { color: #fff; font-size: 35px; margin-bottom: 30px; text-align: center; } .section-one .section-one__descr { color: #fff; font-size: 16px; line-height: 1.5; max-width: 300px; margin: 0 auto; text-align: center; } .section-two { background-color: #44a36f; padding: 100px 0 200px; position: relative; z-index: 10; } .section-two .section-two__title { color: #fff; font-size: 35px; margin-bottom: 30px; text-align: center; } .section-two .section-two__descr { color: #fff; font-size: 16px; line-height: 1.5; max-width: 300px; margin: 0 auto; text-align: center; } /* ------------------------------------------------------------------------- begin Separator * ------------------------------------------------------------------------- */ .separator { bottom: -4px; left: 0; overflow: hidden; position: absolute; width: 100%; } /* ------------------------------------------------------------------------- end Separator * ------------------------------------------------------------------------- */ /* begin Media Max-Width 767 ============================================================================ */ @media screen and (max-width: 767px) { .section-one { padding: 130px 0 190px; } .separator { bottom: -110px; } .separator .separator__svg { left: -20%; position: relative; -webkit-transform: rotate(15deg); transform: rotate(15deg); width: 140%; } } /* end Media Max-Width 767 ============================================================================ */

Awesome Section - 1

Not far stuff she think the jokes. Going as by do known noise he wrote round leave. Warmly put branch people narrow see. Winding its waiting yet parlors married own feeling. Marry fruit do spite jokes an times. Whether at it unknown warrant herself winding if. Him same none name sake had post love. An busy feel form hand am up help. Parties it brother amongst an fortune of. Twenty behind wicket why age now itself ten.

Awesome Section - 2

From they fine john he give of rich he. They age and draw mrs like. Improving end distrusts may instantly was household applauded incommode. Why kept very ever home mrs. Considered sympathize ten uncommonly occasional assistance sufficient not. Letter of on become he tended active enable to. Vicinity relation sensible sociable surprise screened no up as.


Здесь я использую один трюк из той статьи, которую рекомендовал выше. Смотреть на Codepen
3). Заключение:
В заключении порекомендую изучать SVG. Это проще, чем кажется. Отличное пошаговое руководство: https://developer.mozilla.org/...

Чат на Java

Хочу написать простой чат на Java сокетах без многопоточности. 1. Не очень понимаю как происходит соединение сокетом с другим компьютером, если передачей сокету ip, то как делать соединение по умолчанию при динамическом ip. 2. Какие классы ввода вывода использовать.


Ответ

Нужен клиент и сервер, клиенты подключаются к серверу, а он транслирует полученные сообщения всем подключенным клиентам. серверная часть: public class Server {
static ServerSocket socket; public static List clients = new ArrayList<>();
public static void main(String[] args) throws IOException {
socket = new ServerSocket(2000);
while (true) { ConnectedClient client = new ConnectedClient(socket.accept()); clients.add(client); client.start(); } } }
public class ConnectedClient extends Thread { private Socket sock; private BufferedReader input; private PrintWriter output;
public ConnectedClient(Socket s) throws IOException { sock = s; System.out.println("new user connected from " + s.getInetAddress().toString()); input = new BufferedReader(new InputStreamReader(sock.getInputStream())); output = new PrintWriter(sock.getOutputStream()); }
@Override public void run() { try { while (sock.isConnected()) { String readed = input.readLine(); for (CinnectedClient c : server.clients) { c.send(readed); } } } catch (IOException e) { System.out.println(e.toString()); } finally { System.out.println("user disconnected from " + sock.getInetAddress().toString()); } }
public void send(String s) throws IOException { output.println(s); output.flush(); } } клиентская часть: сокет для подключения к серверу: Socket s = new Socket(, <порт подключения>); аналогично серверу, берем InputStream и OutputStream у сокета: s.getInputStream() s.getOutputStream() и с их помощью читаем и пишем данные посланная в OutputStream строка придет в InputStream к пославшему и всем остальным клиентам, подключенным к серверу.

Оффлайн запуск web-приложений

Добрый день! Пишем web-приложение на Java. Задача усложняется тем, что приложение должно работать в оффлайн режиме. Варинт отдельно разработать настольную версию не подходит. Остается решить вопрос, можно ли заставить его работать в автономном режиме? Есть вариант подготовить пакет содержащий само приложение (такое же, которое лежит на web-сервере, за исключением, настроек, неполной БД) и все необходимые web-сервера. Какие есть варианты решения? Настройка всего этого при установке, подводны камни в ходе эксплуатирования на Windows (XP, 7), Linux, Mac OS?
Дополнение к вопросу Развертывание приложений Java на сервере
Приложение должно работать в онлайн и оффлайн (с некоторыми ограничениями, например не ведется статистика) режиме одинаково.


Ответ

Возможности HTML5 (локальное хранилище данных в частности) позволяют создавать web-приложения работающие автономно и синхронизирующиеся при наличии связи с сервером. Яркий тому пример - надстройка к GMail для автономной работы. Стоит подумать, нужна ли вам именно тут именно Java. Например средствами Adobe Flex можно создать приложение которое сможет работать как в браузере, так и в виде десктопного приложения (через AIR).

Как динамически создать layout для RemoteViews?

Пытаюсь в рантайме задать layout для виджета (RemoteViews). Проблема в том, что RemoteViews создается с лайаутом из хмл. Но у RemoteViews есть функция apply которая возвращает View. Идея следующая: я создаю хмл layout, который будет контейнером для нужного мне лайоута:

и в рантайме добавляю лайоут следующим образом:
//создаем лайоут в ран-тайме, добавляем ImageView, TextView и т.д. RelativeLayout layout = new RelativeLayout(_context); layout.setLayoutParams(new ViewGroup.LayoutParams(_width, _height)); layout.addView(...); layout.addView(...); layout.addView(...); ...
//создаем RemoteViews из хмл описания, которое выше (т.е. там лайут из одного FrameLayout, которому мы пытаемся добавить свою раскладку чайлдом) RemoteViews remoteViews = new RemoteViews(_context.getPackageName(), R.layout.widget_wrapper); //получаем (возможно) корневое View текущей раскладки в RemoteViews FrameLayout layoutRoot = (FrameLayout)remoteViews.apply(_context, null);
//теперь пытаемся прицепить созданный layout к RemoteView layoutRoot.addView(layout); remoteViews.reapply(_context, layoutRoot); remoteViews.showNext(R.id.widgetWrapper);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(_context); appWidgetManager.updateAppWidget(_widgetId, remoteViews);
Вроде бы есть шансы, что должно работать, но не работает. Можно ли это запустить?


Ответ

Нет, работать это не должно. RemoteViews внутри не содержит никаких views, просто id хмл-я с лайаутом, а apply, видимо, используется на стороне лаунчера, который хостит виджет. Наверное можно унаследоваться от RemoteViews и написать свою версию с блекджеком ,где поместить лайоут, созданный в рантайме. Но в принципе, я могу обойтись набором xml лайоутов подготовленных для разных расширений устройств, как обычно оно и происходит.

Ограничения VK-APi

Есть standalone-приложение на python, которое делает запросы к vk-api. Иногда запросом является users.search()
От запуска к запуску бывают странности:
Подаю методу search() ФИО Иван Иванов и год рождения 10.10.1910. Первый запуск, все хорошо, получил список юзеров удовлетворяющих этому критерию, например их всего один. Второй запуск, параметры такие же, и vk возвращает, что ничего не найдено.
Где я ошибаюсь, когда запрос один и тот же? Как это исправить? С чем такая работа vk api может быть связана? Ограничения на api-вызов в промежуток времени (секунда, минута)?


Ответ

Так как метод users.search не требует прав доступа, то на него не распространяется ограничение в 3 запроса в секунду (если вы не передаёте access_token в запросе).
Однако недавно экспериментальным путём я выяснил, что при обращении к Вк, сервер API может возвращать ответ на запрос в течение длительного промежутка времени (более 3 минут). В данном случае от нас как от пользователей ничего не зависит. Попробуйте увеличить ваше время ожидания ответа на запрос.

движение персонажа на JavaScript

Сделал функцию, которая двигает персонажа в разные стороны, вот пример:
function handleInput() { window.addEventListener("keydown", function(event) { if (event.keyCode == 65) ractive.set({'playerX': ractive.get( 'playerX' ) - 1}); if (event.keyCode == 68) ractive.set({'playerX': ractive.get( 'playerX' ) + 1}); if (event.keyCode == 87) ractive.set({'playerY': ractive.get( 'playerY' ) - 1}); if (event.keyCode == 83) ractive.set({'playerY': ractive.get( 'playerY' ) + 1}); });
не буду вдаваться в подробности, из примера видно, что движение осуществляется при событии keyDown - таким образом, при нажатии и удерживании клавиши, сначала игрок смещается на 1 пиксель, и только потом - через долю секунды - продолжает двигаться дальше, не знаю можно ли решить проблему, но мне эта реализация кажется не совсем верной. Как правильно реализовать передвижение спрайта? Может у кого-то есть ссылки на полезные статьи по этому поводу?


Ответ

Просили написать ответ тут. В общем там много косяков лень все править, писал на скорую руку в основном копи пастом из того примера что в комментах писал, по этому много дублирующих методов и переменных, но я как бы на работе так что извиняйте =)
Это ссыль http://codepen.io/korolariya/pen/WxbPJo
(function($) {
$(document).ready(function() {
function keydown(event) {
if (player.pressed.indexOf(event.which) === -1) { switch (event.which) { case 37: // left player.vec_add(player.velocity, { x: -1, y: 0 }); break;
case 38: // top player.vec_add(player.velocity, { x: 0, y: -1 }); break;
case 39: // right player.vec_add(player.velocity, { x: 1, y: 0 }); break;
case 40: // bottom player.vec_add(player.velocity, { x: 0, y: 1 }); break; }
player.pressed.push(event.which); } }
function keyup(event) { var index; if ((index = player.pressed.indexOf(event.which)) >= 0) { player.pressed.splice(index, 1); switch (event.which) { case 37: // left player.vec_sub(player.velocity, { x: -1, y: 0 }); break;
case 38: // top player.vec_sub(player.velocity, { x: 0, y: -1 }); break;
case 39: // right player.vec_sub(player.velocity, { x: 1, y: 0 }); break;
case 40: // bottom player.vec_sub(player.velocity, { x: 0, y: 1 }); break; } } } window.addEventListener("keydown", keydown, false); window.addEventListener("keyup", keyup, false); var player = { selector: $('#player'), position: { x: 110, y: 110 }, target: { x: 0, y: 0 }, click: { x: 0, y: 0 }, normal: { x: 0, y: 0 }, way: { x: 0, y: 0 }, speed: 3, collapse: 5, pressed: [], velocity: { x: 0, y: 0 }, vec_add: function(a, b) { a.x += b.x; a.y += b.y; }, vec_sub: function(a, b) { a.x -= b.x; a.y -= b.y; }
};
player.move = function(pos) { if (pos != undefined) { this.position.x = pos.x; this.position.y = pos.y; } this.selector.css("left", (this.position.x - 5) + 'px'); this.selector.css("top", (this.position.y - 5) + 'px'); }; player.normalMove = function() { this.countWay(); this.position.x = this.position.x + (this.normal.x * this.speed); this.position.y = this.position.y + (this.normal.y * this.speed); this.move(); }; player.keyMove = function() { if(this.velocity.x || this.velocity.y != 0){ var normal = {x:0,y:0}; normal.x = this.speed * this.velocity.x / Math.sqrt(Math.pow(this.velocity.x, 2) + Math.pow(this.velocity.y, 2)); normal.y = this.speed * this.velocity.y / Math.sqrt(Math.pow(this.velocity.x, 2) + Math.pow(this.velocity.y, 2)); this.vec_add(this.position, normal); this.move(); } }; player.setNormal = function(e) { this.click.x = e.clientX; this.click.y = e.clientY; this.target.x = this.click.x - this.position.x; this.target.y = this.click.y - this.position.y; this.normal.x = this.target.x / Math.sqrt(Math.pow(this.target.x, 2) + Math.pow(this.target.y, 2)); this.normal.y = this.target.y / Math.sqrt(Math.pow(this.target.x, 2) + Math.pow(this.target.y, 2)); this.countWay(); }; player.untilgo = function() { return this.way.x > this.collapse || this.way.y > this.collapse; };
player.countWay = function() { //тут можно вычислять расстояние // Math.sqrt(Math.pow(this.position.x - this.click.x)+Math.pow(this.position.y - this.click.y)); this.way.x = Math.abs(this.position.x - this.click.x); this.way.y = Math.abs(this.position.y - this.click.y); };
player.move(); var timer; var fps = 60;
function step() { setTimeout(function() { requestAnimationFrame(step); if (player.untilgo()) { player.normalMove(); } player.keyMove();
}, 1000 / fps); } step(); $(document).click(function(e) { player.setNormal(e); });
});
}) (jQuery);

Почта @live.ru и WLM

Пользуюсь почтовой программой Windows Live Mail 2012 (Build 16.4.3528.0331). Причиной её выбора когда-то стало то, что только она умела работать с майкросовтовской почтой @live.ru по тамошнему http-протоколу, но в целом она меня устраивает по всем критериям: не смешивает почтовые ящики в кучу, но позволяет настраивать быстрые представления. Имеется группировка по темам. И интерфейс удобный.
Но некоторое время назад получил несколько писем от майкросовта о том, что доступ к live.ru-почте из неё будет работать только до конца июня:
Мы заметили, что вы подключаетесь к учетной записи Outlo‍ok‍.‍com с помощью приложения "Почта Windows Live 2012". Обратите внимание, что "Почта Windows Live 2012" не поддерживает технологии синхронизации, которые используются в новой службе Outlo‍ok‍.‍com. После обновления учетной записи, которое произойдет в конце июня, вы не сможете ни отправлять, ни получать электронные сообщения в учетной записи Outlo‍ok‍.‍com с помощью приложения "Почта Windows Live 2012". Не волнуйтесь, вы в любое время можете войти в свою учетную запись Outlo‍ok‍.‍com через веб-браузер и по-прежнему сможете обращаться ко всем данным, которые сейчас находятся в приложении "Почта Windows Live 2012".
В качестве решения в письме предлагается обновиться до десятки (у меня Win7) или получить годовую подписку на Office 365:
Если вы работаете в Windows 7, то для использования приложения "Почта" можно выполнить обновление до более новой версии Windows. Если вы не хотите выполнять обновление, можете работать со своей учетной записью через веб-браузер или воспользоваться бесплатной годовой подпиской на Off‍ice 3‍6‍5 персональный и использовать Outlook 2016 для подключения к учетной записи.* Outlook 2016 работает на операционных системах Windows 7, Windows 8/8.1 и Windows 10. * Необходимо активировать до 15 октября 2016 г. Действительно для пользователей, впервые оформивших подписку на Off‍ice 3‍6‍5. Необходимо указать данные кредитной карты. Вы можете отменить подписку в любое время на странице www.office.com/myaccount. Ознакомиться с полным текстом условий можно здесь.
Можно ли как-то продолжить пользоваться через WLM? На какой протокол они перешли - может на самом деле надо просто добавить аккаунт заново с imap? В таком случае, какие настройки следует указывать?
Если на вопрос про WLM ответ отрицательный, то какие бесплатные почтовые программы можно использовать для доступа к почте из Windows 7? И как их настроить?
PS: Убрал из цитат ссылки, т. к. переходы по ним явно отслеживаются.

Некоторое время назад почта всё-таки перестала работать... Надо как-то настраивать.


Ответ

На основе Add your Outlook.com account to another mail app
IMAP imap-mail.outlook.com:993 IMAP encryption method SSL
POP pop-mail.outlook.com:995 POP encryption method SSL
SMTP smtp-mail.outlook.com:587 SMTP encryption method TLS
При использовании POP требуется дополнительно настроить ящик.
И скриншоты настройки WLM для IMAP:

В Android функция RecyclerView.scrollToPosition(list.size()-1) не до конца опускает скролл в диалоговом окне

Я создаю RecyclerView со списком клиентов и помещаю его в диалоговое окно. Есть задача - опустить скролл максимально вниз. Делаю это при помощи функции RecyclerView.scrollToPosition(list.size()-1).
В случае, если RecyclerView расположен в xml файле активити - все нормально. У меня список из клиентов от 0 до 14. Указываю RecyclerView.scrollToPosition(14) и скролл опускается в самый низ.

Теперь делаю inflate для нового RecyclerView и помещаю его в диалог. Адаптер тот же самый. Но когда я выполняю RecyclerView.scrollToPosition(14) то вижу следующую картину (скролл останавливается примерно на 13 позиции, хотя вручную я могу дотянуть его до самого низа):

Возможно, это как-то связано с родителем RecyclerView (в одном случае - это активити, во втором - диалог). Такое впечатление, что RecyclerView "заезжает" под кнопки OK и CANCEL (пробовал и без кнопок сделать диалог, все-равно немного смещается вниз, такое впечатление, что до низа экрана телефона). Кстати, если поставить для RecyclerView фиксированную высоту (через recyclerView.setLayoutParams(layoutParams)), то проблема исчезает.
Я понимаю, что для решения проблемы можно установить высоту recyclerView вручную, но как узнать высоту диалогового окна без меню OK и CANCEL? Может кто-то сталкивался с подобной проблемой?
ОБНОВЛЕНО! Все больше склоняюсь к тому, что это реально баг RecyclerView. С ListView в моем случае все нормально (при использовании setSelection(14)). Но все-равно было бы интересно услышать мысли по этому поводу... И если это действительно баг, куда написать в гугл, чтобы его поправили?


Ответ

Может кому-то будет интересно. Это был баг. Сменил версию RecyclerView на com.android.support:recyclerview-v7:25.0.0 и проблема исчезла. Ранее использовалась библиотека com.android.support:recyclerview-v7:23.4.0

Пример работы с WMI из под Qt5

Ребят подскажите существуют ли стандартные методы для работы с WMI из под Qt. В доках нашёл какой-то QAxObject а примеров нет. Как использовать смутно представляю.


Ответ

Пример работы с WMI с использованием QAxObject Ссылка, есть немного костыльные варианты выполнения powershell скриптов которые орудуют с WMI и разбора результата их выполнения Пример

Как лучше защить шаблон от копирования?

Есть несколько шаблонов на продажу для opencart и встал вопрос, каким методом пользоваться для выдачи лицензий на эти шаблоны?


Ответ

Стандартный вариант, по крайней мере среди русскоязычных авторов под Opencart - использование такой вещи, как ionCube. Естественно, что с его помощью нельзя защитить ваши html/css файлы, но обычно и защищают не их, а то, что вы упрячете в php, на уровни Model + Controller (если следовать модели MVC, а Opencart ей пытается следовать). Соответственно, и заинтересовать вашего покупателя нужно будет не столько красивым интерфейсом, сколько дополнительным функционалом под него.
Если же у вас чисто темы, то тут ничего не остается, кроме как (пытаться) выкладывать свои шаблоны на всяческие площадки для их продажи, начиная с templatemonster.com и заканчивая themeforest.net

Принудительный вызов base C#

Какая в C# есть возможность для принудительного вызова функции базового класса в функции наследника
Пример:
class A { public virtual void F(){...} }
class B : A { public override void F() { base.F();//<--- должна быть эта строка! Иначе , //выкинуть ошибку, к примеру. ... } }
Спасибо!


Ответ

Можно сделать так: порядок вызова определяем в родителе, а наследников обязуем переопределить их часть. Если эта часть необязательная, то можно ослабить условие, и сделать метод virtual вместо abstract
class A { public void F() { // базовый код
FInternal(); }
protected abstract void FInternal();
// более мягкий вариант //protected virtual void FInternal() //{ //} }
class B : A { protected override void FInternal() { ... } }

Узнать ID устройства по сокету (по IP)

Есть сервер, запущенный на компьютере:
ServerSocket serv = new ServerSocket(...); ... Socket s = serv.accept(); ...
На него с определённого устройства устанавливается соединение (сокет). Возможно ли в данном случае узнать 16-значный ID этого устройства? Что-то вроде mSocket.getDeviceID(). Может, как-то через IP-адрес это можно вычислить?

Устройством является Android телефон. Нужен его ID. Реально ли узнать его не держа сам телефон в руках? Единственное, что делает телефон - отправляет фотографии на сервер в опр. время.


Ответ

Возможно ли в данном случае узнать 16-значный ID этого устройства?
нет, конечно. произвольные данные (к которым относится и какой-то там «идентификатор устройства») могут быть переданы по сети с одного компьютера на другой лишь при активном участии обеих сторон.
т.е., необходимо дополнить обе программы, которые осуществляют описанную вами связь, требуемой функциональностью — возможностью передачи и приёма нужной вам информации.

Есть компонент EditText. Можно ли по какому-нибудь жесту перевести клавиатуру в ввод голосом

Есть компонент EditText. Хочется по какому-нибудь жесту перевести клавиатуру в ввод голосом. Возможно ли такое?


Ответ

Вам нужно обработать ваш жест и вызвать внешний интент:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
теоретически его может и не быть в системе, так что сначала надо проверить его наличие
PackageManager pm = getPackageManager(); List activities = pm.queryIntentActivities( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); if (activities.size() == 0) //нет распознавателя //blah-blah
Если есть вызвать Activity распознавателя через startActivityForResult(intent, SPEECH_REQUEST) и в onActivityResult() полученные данные положить в EditText
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) { //массив распознанных строк ArrayList matches = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); //ложим в EditText
} super.onActivityResult(requestCode, resultCode, data); }
Update
Собственно ответ на сам вопрос:
перевести клавиатуру в ввод голосом. Возможно ли такое?
Увы это невозможно. Нет такого INPUT_TYPE, каждая реализация клавиатуры реализует сама поддержку ввода голосом.

Как протестировать код одного класса не разгребая все +100500 ошибок во всём проекте

Проект - порт не Андроид приложения. Естественно весь код красный. Переписал несколько классов и на одном появились сомнения. Хотелось бы протестить его код, что бы потом не вспоминать где это было. Попробовал JUnit-тестом, но он дёргает грэдл, а тот пережёвывает весь проект и валится из-за ошибок. Не пойму как заставить его запустить этот тест.


Ответ

Решил вопрос добавлением в игнор всех проблеммных пакетов через sourceSets:
sourceSets { main.java.exclude( 'com/exemple/**', 'ru/exemple/**', 'etc/**' ) }
Так отладку и тестирование можно делать обычным способом.

Inline инициализация полей

Рихтер в свой книге пишет, что если инициализировать поля inline, то в каждом конструкторе генерируется одинаковый IL-код инициализации этих полей и поэтому он советует не делать все inline, а выносить все в стандартный конструктор, а его вызывать из других конструкторов.
Актуально ли это сейчас? Почему microsoft сделали это именно так?


Ответ

Для начала, техническая сторона вопроса.
если инициализировать поля inline, то в каждом конструкторе генерируется одинаковый IL-код инициализации этих полей
Да, это так (для неделегирующих конструкторов, как подсказывает @PetSerAl, то есть, конструкторов, не указывающих this(...) вместо base(...)). Современная версия C# компилирует вот такой класс
public class C { int X = 1; public C() { Console.WriteLine("C()"); } public C(int y) { Console.WriteLine("C(int)"); } }
в такой IL

.class public auto ansi beforefieldinit C extends [mscorlib]System.Object { // Fields .field private int32 X
// Methods .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { // Method begins at RVA 0x2050 // Code size 24 (0x18) .maxstack 8
IL_0000: ldarg.0 IL_0001: ldc.i4.1 IL_0002: stfld int32 C::X IL_0007: ldarg.0 IL_0008: call instance void [mscorlib]System.Object::.ctor() IL_000d: ldstr "C()" IL_0012: call void [mscorlib]System.Console::WriteLine(string) IL_0017: ret } // end of method C::.ctor
.method public hidebysig specialname rtspecialname instance void .ctor ( int32 y ) cil managed { // Method begins at RVA 0x2069 // Code size 24 (0x18) .maxstack 8
IL_0000: ldarg.0 IL_0001: ldc.i4.1 IL_0002: stfld int32 C::X IL_0007: ldarg.0 IL_0008: call instance void [mscorlib]System.Object::.ctor() IL_000d: ldstr "C(int)" IL_0012: call void [mscorlib]System.Console::WriteLine(string) IL_0017: ret } // end of method C::.ctor
} // end of class C
Мы видим последовательность команд
IL_0000: ldarg.0 IL_0001: ldc.i4.1 IL_0002: stfld int32 C::X
которая инициализирует поле X, в обоих конструкторах.
Почему бы нам не вынести это в отдельный приватный конструктор, и не вызывать его самостоятельно из каждого публичного конструктора? (Приватный метод не подходит, т. к. он не может инициализировать readonly-поля.) Технически это можно, но это не одно и то же.
Разница начинается там, где у нас есть базовый класс с нетривиальным конструктором. Дело в том, что инициализаторы производного класса выполняются до выполнения базового конструктора. А вот сам конструктор производного класса выполняется после выполнения базового конструктора
Рассмотрим такой код:
public class B { public B() { Console.WriteLine("B constructor"); } }
public class C : B { public static int Get1() { Console.WriteLine("Getting 1"); return 1; }
int X = Get1(); public C() { Console.WriteLine("C Constructor"); } }
Конструктор C с точки зрения IL-кода таков:
X = Get1(); B::ctor(); Console.WriteLine("C Constructor");
и выведет, соответственно,
Getting 1 B constructor C Constructor
Если вы поместите инициализацию X в конструктор C, или в другой, вспомогательный конструктор класса C, то он будет выполнен лишь после окончания конструктора класса B. То есть, смысл кода будет другим.
Хуже того, такое преобразование не всегда возможно! Например, рассмотрим класс System.Exception
[Serializable] public class CustomException : Exception { readonly int ErrorCode; public CustomException(string message) : base(message) { } protected CustomException(SerializationInfo info, StreamingContext context) : base(info, context) { } }
Вынести общую часть в «общий» конструктор невозможно, т. к. общий конструктор будет не в состоянии вызвать правильный базовый конструктор.

Лазейкой может быть объявление конструкторов так, чтобы все они за исключением одного вызывали другие конструкторы того же класса, при этом инициализацию полей следует оставить там, где она есть. Например, если добавить конструктор
public C(int x) : this() { Console.WriteLine("C(int) Constructor"); }
при вызове его получим
Getting 1 B constructor C Constructor C(int) Constructor
В этом случае инициализация полей присутствует только в коде последнего конструктора. Впрочем, у этого трюка те же недостатки: не всегда возможно из «универсального» конструктора вызвать нужный базовый конструктор!

С технической стороной дела мы вроде бы разобрались. Теперь о реальном применении.
Я бы лично не заморачивался, и писал не «как экономнее», а как понятнее. Выигрыш от объединения в общий метод трёх-четырёх инициализаторов на копейку, а код становится более сложным, и к тому же приходится переписывать его без понятной для читателя необходимости. К тому же, вы можете считать, что компилятор самостоятельно применил к вашему коду оптимизацию, известную как method inlining :)

Ещё один аргумент за inline-инициализацию полей: то, что inline-инициализация происходит до вызова конструктора родительского типа, уменьшает шансы на обращение к неинициализированному объекту. Пример (одолжен из соседнего вопроса):
class Parent { public Parent() { DoSomething(); } protected virtual void DoSomething() {} }
class Child1 : Parent { private string foo = "FOO"; protected override void DoSomething() => Console.WriteLine(foo.ToLower()); }
class Child2 : Parent { private string foo; public Child2() { foo = "FOO"; } protected override void DoSomething() => Console.WriteLine(foo.ToLower()); }

Почему именно инициализиаторы пробегают до вызова базового конструктора, расписано у Эрика Липперта: Why Do Initializers Run In The Opposite Order As Constructors? Part One, Part Two

Java. Вопрос по архитектуре сервера для игры

Думаю над архитектурой сервера для игры и встал вопрос над тем, как обрабатывать подключения клиентов. Протокол - tcp/ip
Стоит выбор между многопоточной архитектурой (1 клиент - 1 поток) и асинхронным вводом/выводом (когда чтение не блокирует поток, если данных нет, а возвращает 0 и поток может обрабатывать других клиентов, то есть 1 поток - много клиентов).
Игра - mmorpg, где потенциально люди могут стоять в городе и не передавать почти никакого ввода на сервер, но так же бывают динамичные моменты где важен быстрый ответ сервера.

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

Асинхронный подход использует меньше памяти, менее уязвим к слабоактивным клиентам, но менее эффективен для активных клиентов.
Выбор очень сложный, поэтому хотел бы спросить совета у более опытных, которые имели опыт с данными подходами, спасибо.


Ответ

Я бы предложил динамический пулл потоков. Плюсы от него ты знаешь. А размер этого пулла можно изменять в зависимости от нагрузки, чем и сэкономишь на CPU, и достигнешь достаточного быстродействия в зависимости от нужды пользователей

C++ Сложение огромных чисел

Надо сложить 2 целых числа a и b, но при этом их сумма может доходить до 10^100. Я написал код, он работает только до определенного момента, когда пробуешь сложить например "111111111111111111111111111111" и "222222222222222222222222222222", ответ выдает уже не верный.
Как можно сложить два огромных числа в С++ чтобы их сумма могла доходить до 10^100 ?
Прилагаю код, но буду рад если вы покажете более простой способ решения.
#include #include #include using namespace std; int main() { int ia,ib; int z=1; string str1, str2; cin>>str1>>str2; int len1=str1.length(); int len2=str2.length(); char mas1[101], mas2[101]; int mas3[101]; double sk=0; for(int i=0;ilen2){lenm=len1;} if(len2>len1){lenm=len2;} if(len1==len2){lenm=len1;} for(int i=0;iСпасибо за поправления, программа почти готова, но все равно есть одна ошибка. Когда складываем "11" и "11" выводит "22", а когда "15" и "15" вместо "30", выводит "20". В чем проблема?
Новый код прилагаю:
#include #include #include using namespace std; int main() { string str1, str2; cin>>str1>>str2; int len1=str1.length(); int len2=str2.length();
char mas1[101], mas2[101]; int mas3[101], mas4[101];
for(int i=0;i for(int i=0;i int length; if (len1 > len2) length = len1 + 1; else length = len2 + 1;
for (int ix = 0; ix < length; ix++) { mas4[ix] += mas3[ix]; mas4[ix + 1] += (mas4[ix] / 10); mas4[ix] %= 10; }
if (mas4[length - 1] == 0) length--;
for(int i=0;i return 0; }


Ответ

Есть масса информации на тему "Длинная арифметика" в С/С++ Например:
http://cppstudio.com/post/5036/ https://mindhalls.ru/big-number-in-c-cpp-add-sub/ http://e-maxx.ru/algo/big_integer

Обнаружить StackOverflowError в других потоках

Я делаю интерпретатор языка Prolog. Язык основан на рекурсии, и неправильно написанные программы часто приводят к переполнению стека. Когда запускал свой интерпретатор из приложения JavaFX я заметил, что JavaFX может обнаруживать StackOverflowError в потоке и обрабатывать его.
Как самому сделать что-то подобное, чтобы определить StackOverflowError, выброшенный в другом потоке и обработать его?


Ответ

В общем случае я бы посоветовал данную задачу (перехват ожидаемого исключения) возложить на сам поток, но если это не возможно по каким либо причинам:
@Override public void start(Stage primaryStage) { Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
См. setDefaultUncaughtExceptionHandler, UncaughtExceptionHandler
Правка (после предоставления исходных кодов):
Внутри установленного UncaughtExceptionHandler
Platform.runLater(() -> errorsOutput.runtimeException(new RuntimeException("Error in program thread", throwable)));

Изменение сущностей в событии OnFlushDirty в NHibernate

Есть сущность "настройки", в которой хранится путь к данным. Есть сущности, которые пользуются настройками, чтобы строить свой путь к данным.
Хочется на изменении настроек валидировать пути остальных сущностей и пересохранять их при необходимости. Как это пытаюсь сделать:
Перекрыл Interceptor и ловлю событие OnFlushDirty, которое позволяет отловить изменение нужного свойства:
var folderIndex = propertyNames.ToList().IndexOf(nameof(Folder)); if (folderIndex > -1 && previousState != null) { var previous = previousState[folderIndex] as string; var current = currentState[folderIndex] as string; if (previous != current) { var someEntities = session.Query().Where(m => m.Setting == this).ToList(); foreach (var someEntit in someEntities) { someEntity.RefreshFolder(); } } }
Расчёт был на то, что раз изменения внутри сессии (уже в коммите транзакции), то изменения подцепятся автоматически. Не помогло. Если после someEntity.RefreshFolder(); добавить session.SaveOrUpdate(someEntity) то чуда не происходит и сущности тоже не сохраняются.
Снаружи вызов настроек обёрнут в транзакцию:
using (var tranc = session.OpenTransaction()) { try { session.SaveOrUpdate(setting); tranc.Commit(); } catch (System.Exception) { tranc.Rollback(); throw; } } В SomeEntity есть ссылка на Setting, как видно в п1, и если я попытаюсь сделать отдельную транзакцию, то оно уходит в SO, т.к. для сохранения сущности становится необходима сохраненная настройка, а она снова вызовет сохранение сущности. У всех сессий включен session.FlushMode = FlushMode.Commit, чтобы случайные изменения в сессии (которые например потом были провалидированы исключением) не пытались сохраняться в базу.
В целом, хочется чтобы операция смены папки в настройках была транзакционной, потому что если нет - то можно просто после завершения транзакции делать те же операции не связывая их друг с другом, но тогда гарантировать валидность данных уже нельзя.


Ответ

Судя по всему, после вызова tranc.Commit(); добавлять объекты для коммита уже нельзя. От этого и пляшем.
Основная причина использования OnFlushDirty - трекер изменений в сущности. Эту информацию можно достать и вручную:
var impl = session.GetSessionImplementation(); var key = impl.PersistenceContext.GetEntry(entity);
if (key == null) { var name = impl.GuessEntityName(entity); var persister = impl.GetEntityPersister(name, entity); return new ChangeTrackerArgs(persister.GetPropertyValues(entity, EntityMode.Poco), null, persister.PropertyNames); }
var current = key.Persister.GetPropertyValues(entity, EntityMode.Poco); return new ChangeTrackerArgs(current, key.LoadedState, key.Persister.PropertyNames);
Таким образом, каждый session.SaveOrUpdate(entity) превращается в
var state = GetChangeTrackerArgs(entity) entity.BeforeSave(state); session.SaveOrUpdate(entity);
Т.е. вызов сохранения любой сущности может теперь в BeforeSave сделать аналогичный вызов для любой другой сущности и работать будет для любой вложенности.

Interceptor с его OnFlushDirty всё ещё нужен, т.к. кроме явно вызванных SaveOrUpdate есть ещё неявные изменения, которые поймал хибер. Поэтому, там аналогичный вызов entity.BeforeSave(new ChangeTrackerArgs(currentState, previousState, propertyNames)); Этот вызов уже не сумеет добавить в транзакцию сущности, но зато всё равно провалидирует сущность перед сохранением, если она вдруг попадёт в сохранение неявно.

В дополнение к вышесказанному, хоть это и не касается вопроса. Трекер изменений в хибере работает на сессиях, поэтому для нормальной работы ему нужно получение сущности в конкретной сессии, а потом и её изменение. Если сущность получена в одной сессии, а в другой пытается сохраниться - трекер будет пуст, т.е. все мучения выше - не сильно полезны.

Почему исполняемый файл Go много больше, чем C?

Например. hi.c #include
int main() { printf("C
"); } hi.go package main
import "fmt"
func main() { fmt.Println("Go") } Собираем: $ gcc -o c hi.c $ 8g hi.go && 8l -o go hi.8 Получаем: $ ls -l
7088 2010-10-29 21:33 c* 953840 2010-10-29 21:33 go*


Ответ

Ответ вполне очевиден: программа на Го тянет за собой большой и толстый пакет main, тогда как программа на Си тянет лишь stdio

Ботнет для Android

Я изучаю Java + Android. И наткнулся на статью о ботнетах для Android. И мне стало интересно, какие же в этой системе уязвимости. Казалось бы, в основе Android лежит Linux. В описание написано, что это многопользовательская ОС, где каждое приложение - это отдельный юзер, который имеет ID. Причем это ID неизвестно в приложении. Если создать какой-нибудь файл (из приложения), то права доступа будут только для этого ID. Я почти незнаком с системой Linux, и поэтому мне интересно, какие же уязвимости там есть. И какими пользуются злоумышленники, создающие вредоносные программы для Android. Я так предполагаю, они это пишут не на Java...


Ответ

Самая простая уязвимость -приложение рассылает платные смс или просто рассылает спам. Главное запросить привелегии и надеятся, что пользователь не заметит. Следующая уязвимость - собрать побольше персональных данных и отправить кому нужно на сохранение. В целом, если не использовать рутованые устройства и смотреть на то, какие привелегии запрашивает приложение, можно отсекать 99% вирусов и ботов.

Для каждого потока собственное подключение к базе данных. Есть ли смысл?

Добрый день. Допустим, запускается 20 потоков через Threading. Нужно вносить данные в БД. Вопрос: имеет ли смысл создавать db connect для каждого потока, увеличится ли скорость записи при таком раскладе, Или использовать одно подключение на каждый поток? Или на каждый поток нужно создавать свой cursor? Подключение к БД db = MySQLdb.connect(host='10.10.10.10',user='art',passwd='123',db='parserinet') cursor = db.cursor() cursor.execute('SET NAMES utf8')


Ответ

Нужно обязательно создавать новое соединение, либо использовать пул соединений. Одновременное использование одного соединение в разных потоках может привести к весьма неприятным проблемам.

Ассемблерный код и многопоточность

Всем добрых суток! Дан бинарник библиотеки неких вычислительных функций, написанных на асемблере, исходников нет, как следствие, глубокого понимания внутренностей данных функций тоже нет. Есть следующий теоретический вопрос : есть ли возможность безопасного использования данных функций в многопоточном приложении? Понимаю, что можно "ограничить" все вызовы из данной библиотеки мьютексами, однако нет уверенности, что они не станут конфликтовать с другими функциями приложения, например с malloc(). Разрешите мои сомнения плиз.


Ответ

В общем случае, такая библиотека может Вам стоить бессонных ночей, потраченных на отладку. Не рекомендую к использованию. Если я вообще что-либо пониманию, то тут даже критические секции толком не помогут. Зависит от того создается ли отдельная копия библиотеки на каждый поток. Я лично уверен, что нет. А раз так, то какая-нибудь хитрая ф-ция, модифицирующая внутренние переменные библиотеки и завязанная на их значения, вызванная несколько раз из разных потоков, полностью нарушит логику работы библиотеки.

Погрешности GPS и варианты борьбы с ними

Стоит задача подсчета метров по GPS на малой скорости движения (3-5км/ч) и соответственно на малых расстояниях (от 0.5 метра и выше). При реализации задачи получаем огромную погрешность (20-100 метров) между изменениями координат (когда вызывается onLocationChanged каждую секунду). Понятно, что GPS-приемник в смартфоне слабее и сама точность от спутника не супер, но может кто-то знает как можно улучшить точность расчетов, какой-либо алгоритм или вообще какие-либо интересные особенности, сторону в которую стоит копать? Я пока не уверен, что на малых расстояниях задача впринципе реализуема :( Возможно потому что нужно уйти в дебри навигации.


Ответ

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

RF-kill Wi-Fi blocked

Столкнулся с такой проблемой. После включения нетбука (asus) network manager перестал видеть точки доступа. Первым делом я заглянул в терминал и обнаружил, что wlan0 down, попробовал его поднять - без результата! Ифэйс появился, но, хоть убей, все равно в down. Сначала попробовал #rfkill list all - блокирует! Ага) rfkill unblcok wifi - разблокировали! Теперь поднимаем wlan0, и точек доступа по-прежнему не видим, фавля не цепляется. После долгого поиска и гугления нашел такой файлик /var/lib/NetworkManager/NetworkManager.state Открываем nano, видим следующее: NetworkingEnabled=true WirelessEnabled=false WWANEnabled=true WimaxEnabled=true Включаем: NetworkingEnabled=true WirelessEnabled=true WWANEnabled=true WimaxEnabled=true Делаем reboot, вафля по прежнему не цепляется. В терминале: # rfkill list all 0: asus-wlan: Wireless LAN Soft blocked: yes Hard blocked: no 1: asus-bluetooth: Bluetooth Soft blocked: no Hard blocked: no 2: phy0: Wireless LAN Soft blocked: yes Hard blocked: yes Далее выполняем: # rfkill unblock wifi Внимание! Вот с этого момента поднимается wlan0 и сам цепляет родную точку доступа. Естественно, проблема не решена, мы запускаем фавлю, но, как раньше, после запуска системы не цепляемся автоматически. Подскажите, в какую строну копать, писать скрипт для автозапуска - не выход, с проблемой подобного рода сталкиваюсь впервые.


Ответ

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

Особенности реализации WYSIWYG редактора (contenteditable, iframe, hidden textarea+events)

Я видел несколько реализаций визуальных редакторов, таких как TinyMCE и CodeMirror. Все могу разделить на 3 группы:
DIV c contenteditable=true - кажется в готовых проектах не используется в чистом виде iframe + body[contenteditable=true] - Такой подход используется в TinyMCE, где редактор находится в iframe hidden texarea + Events + обычный DIV - такой подход используется в CodeMirror, как я понимаю он постоянно держит фокус на скрытом textarea и читает события перевода каретки, вставки и ввода данных, и добавляет их в обычный нередактируемый (contenteditable=false) блок. Причем даже выделение текста делается с помощью цветного DIV.
В связи с этим у меня стоит выбор, какую реализацию выбрать и в чем ее особенности.
На данный момент мне надо:
Простое форматирование Кастомную каретку Адекватное копирование/вставку контента с сохранением форматирования Возможно эффект плавного появления текста при печати
Использовать готовые разработки не могу. Спасибо.


Ответ

Очень рекомендую к прочтению (на англ.): https://stackoverflow.com/questions/10162540/contenteditable-div-vs-iframe-in-making-a-rich-text-wysiwyg-editor (+ по ссылкам), мы во многом пересекаемся, но там пишут разработчики существующих редакторов.
Разница между iframe vs


iframe более "тяжелый" (создается отдельный документ), и соответственно, более изолирован:
В iframe не попадет ничего из внешнего документа (в частности, стили). Это позволяет вам реализовать WYSIWYG для более ограниченного набора функциональности, чем доступна в Web. Простейший пример - будет ли ваш код готов к тому, что произвольные куски редактируемого контента будут display: hidden из-за унаследованных стилей? Более сложный - как будет работать каретка и выделение с унаследованными float? Ну и т.д. Содержимое iframe не повлияет на внешний документ. Где-то приводился пример, что баг браузера приводил к вставке контента "мимо" contenteditable - с iframe это будет менее жесткий баг; Народ пишет про безопасность. Сам не разбирался детально, но предполагаю, что может быть связано с тем, что в дочернем фрейме можно запретить "случайное" выполнение левого вредительского кода через что-нибудь вроде